MSDN Team Blog AT [MS]: Low-Code Application Development mit FireStart BPM Suite auf Microsoft Azure

FireStart BPM Suite von PROLOGICS IT GmbH

Automatisierte Workflows werden immer wichtiger, um den Workload im Arbeitsalltag zu beherrschen und durchgängige Geschäftsprozesse zwischen den Systemen und Benutzern aufzubauen. Dabei werden low-code Development Ansätze mit BPM Plattformen immer beliebter, da so Fachanwender und Softwareentwickler gemeinsam die Prozesse entwickeln können – ohne tiefgreifende Programmierkenntnisse als zwingende Voraussetzung. Die FireStart BPM Suite des österreichischen Herstellers PROLOGICS ist eine solche Plattform, welche bereits bei vielen namhaften Unternehmen wie Swarovski, Manner oder Wien Stadtwerke im Einsatz ist und sich großer Beliebtheit bei den Anwendern erfreut.

Übersicht FireStart BPM Suite

FireStart verbindet fachliche Prozessplanung, intelligente Workflowautomatisierung und tiefgreifende Prozessanalyse in einer Gesamtlösung. Damit wird die Lücke zwischen Anforderungen im Fachbereich und Umsetzung in der IT zunehmend geschlossen und eine effiziente und passgenaue Applikationsentwicklung ermöglicht.

bild-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Konfigurieren statt Programmieren

Mit Hilfe des interaktiven Prozessdesigners lässt sich die Programmlogik des Workflows festlegen. Durch übersichtliche Wizards können sämtliche Konfigurationsschritte bis hin zu den Systemschnittstellen zu ERP oder CRM Systemen konfiguriert werden.

bild2

 

 

 

 

 

 

 

 

 

 

bild3

 

 

 

 

 

 

 

 

 

 

 

Einfache Benutzerführung mit SharePoint und Outlook Integration

Für die Programmierung der Interaktionen mit den jeweiligen IT Services stehen vorgefertigte Systemaktivitäten bereits, mit denen die Anbindung rasch erfolgen kann. Dazu zählen Services wie Active Direktory Zugriffe, SAP BAPIs ansprechen, PowerShell Scrips ausführen bis hin zu REST-API Webservices. Die Systemaktivitäten können über eine offene API jederzeit programmatisch erweitert und einfach per Wizard konfiguriert werden.

bild4

 

 

 

 

 

 

 

 

 

 

Die Benutzermasken für die Workflowteilnehmer können rollenspezifisch definiert und direkt mit Hilfe des zugehörigen Formulardesigners entworfen werden.

bild5

 

 

 

 

 

 

 

 

 

Durch native Plugins für Groupware Umgebungen wie Outlook oder SharePoint können die Benutzer direkt mit den Workflowformularen interagieren. Die zugehörigen Geschäftsdaten aus den Backend-systemen werden in Echtzeit aggregiert und mit den Benutzeraufgaben prozessoptimiert bearbeitet werden.

bild6

 

 

 

 

 

 

 

 

Umfangreiche Auswertungen

Die laufenden Workflows samt Aufgaben können jederzeit über das HTML 5 FireStart Prozessportal dargestellt werden. Damit behalten sowohl sämtliche Benutzer vom Management bis zur IT den Überblick über den Status der laufenden Geschäftsprozesse. Die grafische Prozess- und Workflowdarstellung kann ebenfalls über zugehörige Webparts direkt in eine bestehende SharePoint Umgebung integriert werden.

bild7

 

 

 

 

 

 

 

 

 

Optimale Unterstützung von Microsoft Azure und Office 365

FireStart kann in verschiedenen Betriebsszenarien verwendet werden, sei es in einer reinen Cloud-Umgebung auf Basis von Azure, in hybriden Szenarien oder On-Premise. Damit wird auch die Entwicklung von Geschäftsprozessen vereinfacht, die mit Daten von On-Premise und Cloudservices gleichermaßen interagieren. Dazu gehören Social Media Services wie Yammer oder Facebook, als auch Office 365 Services wie das Microsoft Teams.

bild8

 

 

 

 

 

 

 

 

 

 

bild9

 

 

 

 

 

 

 

 

 

 

In diesem Video sind die wesentlichen Funktionsbereiche der FireStart BPM Suite noch einmal kurz zusammengefasst.

Wenn Sie FireStart selbst ausprobieren wollen, dann fordern Sie am besten eine kostenfreie Demo samt Testzugang an und lesen Sie mehr darüber auf der Webseite von Prologics IT GmbH.

 

MSDN Team Blog AT [MS]: Für Teams mit hohen Ansprüchen an Qualität und Skalierbarkeit: Visual Studio Enterprise

image

image

 Enterprise DevOps

DevOps für Unternehmen

Schnelleres Ausliefern von besserer Software

Agile-Tools, die für den Unternehmenseinsatz optimiert sind, helfen Ihnen, Aufgaben projekt- und teamübergreifend zu verwalten, und das in einer intuitiven und leicht zu bedienenden Umgebung. Die DevOps-Funktionen in Visual Studio 2017 ermöglichen die Automatisierung von Releaseprozessen und Continuous Deployment. Schließen Sie nach der Bereitstellung die Lücke zwischen Produktion und Entwicklung, und beheben Sie Programmfehler schneller dank Einblicken und Daten, die Sie direkt in der Produktionsumgebung sammeln.

 

 

Now with Xamarin5-Sterne-Entwicklung von mobilen Apps

Liefern Sie Apps auf Unternehmensniveau

Visual Studio Enterprise schließt jetzt Xamarin-Entwicklung von Android-, iOS- und Windows-Apps ein. Erstellen Sie mit erstklassigen Tools Apps mit nativer Leistung und Benutzeroberfläche. Optimieren Sie die Leistung Ihrer Apps mithilfe umfassender Daten zur Profilerstellung, und untersuchen Sie sie zur Laufzeit, um Programmfehler schneller zu finden. Überprüfen Sie Ihre Benutzerfreundlichkeit auf realen Geräten mit der Xamarin Test Cloud. Wenn Sie soweit sind, verteilen Sie Ihre Apps an interne Betatester oder direkt an einen App Store.
Weitere Informationen

 

No more “no repro”

Reproduktion von Fehlern jetzt immer möglich

Drehen Sie die Zeit zurück dank des Ausführungsverlaufs für .NET-Code

Eins der häufigsten Probleme, mit denen sich Entwickler konfrontiert sehen, ist dass der Code auf „meinem Computer“ funktioniert, aber nicht in der Test- oder Produktionsumgebung. Die Diagnose solcher Probleme kann Stunden der Suche im Quellcode, des Vergleichens von Umgebungen und ein fortgesetztes Ratespiel über das Setzen der richtigen Haltepunkte mit sich bringen. Mithilfe der Diagnosetools in Visual Studio Enterprise, wie IntelliTrace, können Sie den Verlauf Ihrer Codeausführung in verschiedenen Umgebungen anzeigen und in der Zeit zurück navigieren, um Daten zu untersuchen, ohne manuell Haltepunkte setzen zu müssen. Das spart Ihnen eine Menge Zeit, die Sie produktiver investieren können.
Weitere Informationen

 

Higher-quality code

Code von höherer Qualität

Es geht um Komponententests – jetzt schneller und einfacher

Mithilfe von IntelliTest generieren Sie schnell relevante Komponententests für Ihren Code – automatisch. IntelliTest verringert den Aufwand zum Erstellen von Komponententests sowohl für neuen als auch für vorhandenen Code dramatisch, sodass Sie sich auf die Entwicklung von Funktionen konzentrieren können. Erstellen Sie ganz einfach Komponententestsätze für Legacycode, der noch nie untersucht wurde, und steigern Sie Pfadabdeckung und Codequalität – mit minimalem Aufwand.
Weitere Informationen

 

Manage complexity

Verwaltete Komplexität

Behalten Sie leicht selbst in den größten Projektmappen den Überblick

Verwenden Sie innovative Tools zur Modellierung, und erstellen Sie hochwertige, unternehmenswichtige Software, die den Motor Ihres Geschäfts bilden kann. Verwalten Sie auf einfache Weise Abhängigkeiten und selbst größte Codebasen mit Tools für Code Mapping und Architektursuche. Verwenden Sie erweiterte Tools zum Überwachen und Debuggen, um komplexe Anwendungsprobleme schneller denn je zu identifizieren, zu sichten und zu beheben.

 

Unlimited load testing

Uneingeschränkte Auslastungstests

Verstehen Sie vor der Bereitstellung, was Ihre Anwendung leisten kann

Mit Visual Studio wird es einfach, Auslastungstests in Ihren Entwicklungsprozess zu integrieren, was Ihnen unangenehme Überraschungen in der Produktion erspart. Ob diese Überraschungen ihren Grund in der weltweiten Verbreitung haben, der Größe Ihrer Kundenbasis oder in Problemen, die sich nur bei mehrtägiger Ausführung zeigen, die Auslastungstests in Visual Studio geben Ihnen die Analysemöglichkeiten, um diese Probleme vor der Bereitstellung zu beheben.
Weitere Informationen

 

Database DevOps

Datenbank-DevOps

Weiten Sie DevOps-Prozesse auf SQL Server-Datenbanken aus

Redgate Data Tools sind jetzt in Visual Studio Enterprise enthalten. Mit ReadyRoll Core können Sie Bereitstellungen von Datenbankänderungen Seite an Seite mit Anwendungsänderungen entwickeln, ihre Version verwalten und sie sicher automatisieren. Redgate SQL Prompt Core hilft Ihnen, SQL-Code mühelos in Visual Studio zu erstellen. Steigern Sie ihre Produktivität mit Auto Vervollständigen für Datenbank- und Systemobjekte sowie Schlüsselwörter, und nutzen Sie Spaltenvorschläge bei der Eingabe.

 

Continuous LearningFortgesetztes Lernen

Lernen und experimentieren Sie mit Technologie auf neuestem Stand

Mit einem Visual Studio Enterprise-Abonnement erhalten Sie Zugriff auf Schulungs- und Learningvorteile, die Ihnen helfen, bei den neuesten Technologien auf dem Laufenden zu bleiben und fortgesetztes Lernen zu verwirklichen. Darüber hinaus können Sie mit der enthaltenen Software für Entwicklung und Tests und Azure-Vorteilen Cloudumgebungen einrichten und mit den neuesten Microsoft-Produkten und Clouddiensten ohne zusätzliche Kosten experimentieren. Das ist Lernen auf einem neuen Niveau!

 

 

 

Subscriber benefits

Leistungen im Abonnement

Umfasst alles, was ein Entwickler benötigt

Mit einem Visual Studio Enterprise-Abonnement erhalten Sie Zugriff auf Schulungs- und Learningvorteile, einschließlich Vollzugriff auf Pluralsight, die Ihnen helfen, bei den neuesten Technologien auf dem Laufenden zu bleiben und fortgesetztes Lernen zu verwirklichen. Darüber hinaus können Sie mit der enthaltenen Software für Entwicklung und Tests, technischem Support und Azure-Vorteilen Cloudumgebungen einrichten und mit den neuesten Microsoft-Produkten und Clouddiensten ohne zusätzliche Kosten experimentieren. Das ist Entwickeln auf einem neuen Niveau!
Weitere Informationen

Marco Scheel: Links for 2017-03-27 [del.icio.us]

Golo Roden: Einführung in Node.js, Folge 12: Unit-Tests schreiben

Für das Erreichen einer hohen Codequalität sind Unit-Tests nahezu unverzichtbar. Zum Schreiben und Ausführen der Tests stehen verschiedene Frameworks zur Auswahl, unter anderem Mocha. Wie funktioniert es?

Norbert Eder: C# 7: Literale

Mit C# 7.0 können numerische und binäre Literale lesefreundlicher dargestellt werden. Dies wird durch die Unterstützung von _ als Trennzeichen innerhalb des Literals erreicht.

Der eigentliche Wert bleibt dadurch unverändert.

Beispiele:

var foo = 1_345.01; // 1234,01
var bar = 0b1111_1100_1010_0000; // 61603

Viel Spaß und mehr Übersichtlichkeit beim Verwenden.

The post C# 7: Literale appeared first on Norbert Eder.

MSDN Team Blog AT [MS]: Shopping Demo App (Xamarin + Azure)

Beispielanwendung Shopping Demo App

Die Shopping Demo App ist eine Beispiel-App für die Verwendung durch die Kunden unter Android, iOS und UWP, die eine ganze Reihe von Azure-Diensten nutzt. Sieh dir den Code an, um zu erfahren, wie du schnell eine Authentifizierung hinzufügst, Benutzern das Kaufen und Verkaufen von Artikeln erlaubst und Pushbenachrichtigung zu Kontoaktualisierungen sendest und empfangen kannst – und natürlich wie du mit der Emotionserkennung deiner App zu einer guten Bewertung verhilfst.

Code abrufen | Dokumentation | In Ihrem Abonnement bereitstellen

Shopping Demo App Überblick

Erfahre, wie du deine Xamarin Mobile Apps mit der Cloud verbinden kannst. Die Shopping-Demo-App ist eine großartige Business-to-Consumer-Anwendung, die auf mehreren Plattformen verfügbar ist. Diese mobile App-Demo nutzt eine breite Palette von Azure-Diensten, um Benutzern zu helfen, sich mit Facebook oder Twitter zu authentifizieren, persönliche Gegenstände zu verkaufen und zu kaufen, Benachrichtigungen zu erhalten, wenn Artikel gekauft werden und die App mit einem Lächeln bewerten. Spiel dich mit dem App-Code in unserem GitHub Repo. Dort findest du auch eine Dokumentation, die dir zeigt, wie du deine Apps mit der Cloud verbindest und sie in dein eigenes Azure-Abonnement einbindest.
Bereitstellung in deinem Abonnement.
App Service ist ein Plattform-as-a-Service (PaaS) Angebot von Microsoft Azure. Es ermöglicht die Erstellung von mobilen Apps für jede Plattform oder jedes Gerät. Du kannst deine Anwendung mit mehreren SaaS-Lösungen wie zum Beispiel Authentifizierung, Push Notifications, Storage, etc. integrieren.
Die folgenden Tutorials erklären, wie man mit App Service arbeitet und schnell und einfach mehrere App Service-Funktionen auf der Basis der Shopping-Demo-App auf GitHub zur Verfügung stellt

Für weitere Informationen, besuchen Sie bitte http://azure.com/xamarin

Weitere passende mobile Beispielanwendungen

 

Healthclinic.biz

Code abrufen

Dokumentation

In Ihrem Abonnement bereitstellen

 

 

Mein Antrieb

Code abrufen

Dokumentation

In Ihrem Abonnement bereitstellen

 

 

Xamarin Evolve 2016

Code abrufen

Marco Scheel: Links for 2017-03-26 [del.icio.us]

  • New employee quick start guide - Microsoft Tech Community
    When a new employee joins, it is important for the company to enable that employee to quickly onboard to their role. As part of the ramp up process, admins are often asked to help the end user understand and use the available software & tools including Office 365. via Pocket

Marco Scheel: Links for 2017-03-25 [del.icio.us]

Marco Scheel: Links for 2017-03-24 [del.icio.us]

MSDN Team Blog AT [MS]: Erstelle herausragende, cloudfähige Mobile Apps noch schneller!

 

image

Jede Mobile App muss verbunden sein

Erstell ansprechende, komplett native Android-, iOS- und Windows-Apps, und nutze dabei die Back-End-Bausteine für das Skalieren und Erweitern.

Sieh zu, wie Xamarin und Azure dich bei der Entwicklung leistungsstarker Mobile Apps unterstützen.

Develop Connected Apps using Azure and Xamarin

 

Benutzerauthentifizierung

Mit der Benutzerauthentifizierung ermöglichest du einmaliges Anmelden für deine mobile App, damit sich deine Benutzer ohne größeren Aufwand bei jeder Cloud- und lokalen App anmelden können.

App Service unterstützt standardmäßig fünf Identitätsanbieter: Azure Active Directory, Facebook, Google, Microsoft-Konto und Twitter, aber auch deine eigene benutzerdefinierte Identitätslösung.

Weitere Informationen

 

Push Benachrichtigungen

Mit Notification Hubs können deine Apps innerhalb von Minuten personalisierte Push Benachrichtigungen an Millionen Benutzer versenden. Übermittel Neuigkeiten, Bekanntmachungen des Unternehmens und standortbasierte Coupons – ohne besondere Anstrengungen.

Weitere Informationen

 

Speicher und Datenverbindungen

Azure Storage ist hochgradig skalierbar und von überall und jedem Gerät aus erreichbar. Egal ob Bilder, Fotos, Dokumente oder Kundendatensätze – in der Cloud oder vor Ort – Azure macht die Integration der richtigen Speicherlösung zu einem Kinderspiel.

Weitere Informationen

 

Offlinesynchronisierung

Stell mit der Offlinedatensynchronisierung sicher, dass deine Benutzer Daten selbst dann anzeigen, erstellen und ändern können, wenn sie Verbindungsprobleme haben oder offline sind.

Weitere Informationen

 

Cognitive Services

Überrasche und begeistere deine Benutzer mit intelligenten, interaktiven Apps. Nutze Cloud Services der nächsten Generation in Azure, die Apps um Features wie Gesichtserkennung, intelligente Bots, visuelle Suche und andere moderne Funktionen erweitern.

Weitere Informationen

 

Mobile DevOps

Stell deine Apps mit mobilen DevOps-Tools für Continuous Integration noch schneller für deine Benutzer bereit. Die einheitliche Lösung, die über Visual Studio, Azure, Xamarin Test Cloud und HockeyApp bereitgestellt wird, beschleunigt die Anwendungsbereitstellung und steigert so die Produktivität und Qualität mobiler Projekte.

Marco Scheel: Links for 2017-03-23 [del.icio.us]

  • SharePoint Security and Microsoft PowerShell | Sharegate
    Combining a powerful tool by the name of PowerShell with an equally powerful platform such as SharePoint, the results can be extremely beneficial. However, many users struggle to wrap their head around this duo, and are left feeling unsure where exactly to start. via Pocket
  • New Features and a Brand New Look for Sharegate | Sharegate
    Our team has been simplifying and redesigning your Sharegate experience so that it is now easier to use than ever before. via Pocket
  • b64.io - image optimisation & base64 encode
    Upload your image(s) on b64.io : we optimize and encode in base64. You can give us png, jpg, gif or svg files. Pssst, we don't keep any files or personal data on our server. Any question? Tweet here. via Pocket
  • 302 Found
    The SharePoint Framework has been generally available in SharePoint Online as of February 23rd. It is currently rolling out to all global Office 365 tenants. via Pocket

Norbert Eder: Windows-Batch: Verzeichnisse älter als n Tage löschen

Gerade wenn Verzeichnisse und Dateien automatisiert werden, sammelt sich in kürzester Zeit ein sehr großer Datenhaufen an. In den meisten Fällen können viele dieser Daten nach einer bestimmten Zeit wieder gelöscht werden. Da bietet es sich an, dies ebenfalls zu automatisieren. Eine Realisierung kann sehr einfach per Windows Batch durchgeführt werden. Hierfür gibt es eine einfache Möglichkeit: FORFILES.

Zur Veranschaulichung ein Beispiel:

pushd D:\drop\Nightly
FORFILES /m dir0815*.* /D -5 /C "cmd /c IF @isdir == TRUE rd /S /Q @path"
popd

IF %ERRORLEVEL% LSS 2 goto finish
EXIT /B %ERRORLEVEL%

:finish
EXIT /B 0

Was passiert hier? Zuerst wird das Arbeitsverzeichnis gesetzt, danach werden mittels FORFILES alle Dateien nach dem Pattern (siehe /m) ermittelt, die älter als 5 Tage (siehe /D -5) sind und an das via /C angegebene Command übergeben.

Anschließend wird das Arbeitsverzeichnis zurückgesetzt und die Errorlevel geprüft. FORFILES gibt einen Errorlevel von 0 zurück wenn Dateien gefunden und verarbeitet wurden. 1 wird zurückgeliefert, wenn keine Dateien für das angegebene Muster bzw. für den Zeitraum zu finden sind. Nachdem ich dies in einem Buildsystem verwende, möchte ich auch in diesem Fall, dass mein Build als fehlerfrei markiert wird. Wird ein anderer Errorlevel als 0 oder 1 gefunden, muss natürlich abgebrochen werden.

Viel Spaß beim anwenden!

The post Windows-Batch: Verzeichnisse älter als n Tage löschen appeared first on Norbert Eder.

AIT: AIT Apply Company Policy 1.4.0

Die neue Version 1.4.0 unseres Tools Apply Company Policy ist verfügbar! Das entsprechende NuGet-Paket wurde ebenfalls veröffentlicht.

Die neue Version beinhaltet einen Bugfix und eine Vereinfachung des Buildprozesses, um selbst eigene Company Policies zu erstellen.

Wollen auch Sie ganz einfach Ihre eigene Company Policy als NuGet-Paket bereitstellen? Dann schauen Sie einfach mal in das Repository auf GitHub rein! Bei Fragen und Ergänzungen stehen wir gerne auf GitHub oder per Mail zur Verfügung.

 

MSDN Team Blog AT [MS]: Dev Essentials: Kostenlose Tools, Clouddienste und Schulungen

Holen dir sich alles, was du zum Erstellen und Bereitstellen Ihrer App auf beliebigen Plattformen benötigen. Dank hochmoderner Tools, Cloudleistung, Schulungen und Support ist dies unser bislang umfassendstes kostenloses Angebot für Entwickler.

Overview

Alle Tools, die du brauchstCode

Tools für die Entwicklung für alle Plattformen – kostenlos. Die Tools umfassen eine erweiterbare integrierte Entwicklungsumgebung
und einen Code-Editor für Mac OS X, Linux und Windows.

  • Visual Studio Community
  • Visual Studio Code
  • Team Foundation Server Express

Umfassende Palette von ClouddienstenCloud

Greifen Sie kostenlos auf Clouddienste wie Compute-, Storage- und Back-End-Dienste für Ihre mobilen oder Web-Apps
sowie für IoT-, Machine Learning- und Analysedienste zu.

  • Azure-Gutschrift (25 USD/Monat für 12 Monate)*
  • Visual Studio Team Services-Konto mit fünf Benutzern*
  • App Service-Free-Tarif
  • HockeyApp-Free-Tarif
  • Application Insights-Free-Tarif

Software – Testversionen und DownloadsDevEssentials

Der kostenlose Zugriff auf Testversionen und Downloads von Software erleichtert dir das Entwickeln für mehrere Plattformen.

  • SQL Server Developer Edition*
  • Windows R Server*
  • Parallels Desktop® für Mac Pro-Edition (3-Monats-Abonnement)*
  • Parallels® Access (3-Monats-Abonnement)*
  • Windows-Plattform-VM (60 Tage)

Erstklassiges Schulungs- und SupportangebotSchulung

Kostenloser Zugriff auf technische Schulungen von Branchenführern wie Pluralsight, Wintellect und Xamarin und
priorisierter Support in MSDN-Foren.

  • Pluralsight (Abonnement für 3 Monate)*
  • Ausgewählte Xamarin University-Kurse auf Abruf*
  • WintellectNOW (Abonnement für 3 Monate)*
  • Linux Academy (Abonnement für 3 Monate)*
  • Microsoft Virtual Academy
  • Bevorzugter Support in Foren

Anmelden

Marco Scheel: Links for 2017-03-22 [del.icio.us]

André Krämer: Visual Studio 2017 Launch bei der .NET User Group Koblenz

Update 23.03.2017: Das Treffen ist am 23.03 2017 und nicht wie ursprünglich geschrieben am 24.03.

Am 7. März 2017 veröffentliche Microsoft pünktlich zum 20. Geburtstag von Visual Studio die neue Version 2017.

Bei der .NET User Group Koblenz werden wir aus diesem Anlass am 23. März 2017 um 19:00 Uhr ein Treffen abhalten, bei dem Eric Berres und ich die wichtigsten neuen Features vorstellen werden, mit denen Entwickler noch produktiver werden.

Unter anderem werden wir folgendes besprechen:

  • Visual Studio 2017 Installer / Workloads
  • Schnellerer Start von Visual Studio 2017 dank Lightweight Solution Load
  • Neue Refactorings in Visual Studio
  • ASP.NET Core und Docker
  • Live Unit Testing in Visual Studio 2017
  • Xamarin in Visual Studio 2017

Visual Studio 2017 Launch Event T-Shirts

Für alle Microsoft MSDN Abonnenten gibt es übrigens auch noch ein kleines Geschenk seitens Microsoft: Ein Visual Studio 2017 Geburtstags-T-Shirt. Sollten wir nicht genug Shirts für alle Teilnehmer haben, dann werden diese nach dem Prinzip: First-Come, First-Serve ausgeteilt.

Visual Studio 2017 Launch Event T-Shirts

Weitere Details gibt es auf der Webseite der .NET User Group Koblenz

MSDN Team Blog AT [MS]: Jetzt NEU: Learning Paths auf MVA

image

Lernpfade sind Kurse, die dir von der Microsoft Virtual Academy (MVA) zur Verfügung gestellt werden, um dir zu helfen, deine Kompetenz in den neuesten Technologien zu erhöhen. Erlange wertvolle Fähigkeiten durch Video-Tutorials, Demos, Assessments und vieles mehr. Plus, verdiene MVA-Abzeichen für abgeschlossene Lernpfade und teile sie per E-Mail oder Social Media wie LinkedIn, Twitter und Facebook. Jetzt anfangen!

Für Entwickler stehen im Moment 4 Kurse zur Verfügung:

imageimageimageimage

Viel Spaß beim Lernen!

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

MSDN Team Blog AT [MS]: Spare Zeit mit dem Xamarin.Forms Previewer

Einer der zeitaufwändigsten Teile der Entwicklung ist der Build- und Run-Zyklus, oder die Zeit zwischen dem Schreiben einer Codezeile und dem Beobachten, wie der Code ausgeführt wird. Echtzeit-Feedback macht die Entwicklung schneller und einfacher für Entwickler. Xamarin.Forms Previewer erstellt eine Live-Vorschau einer Seite nebeneinander mit dem XAML-Markup, so dass du deine Benutzeroberfläche zum Leben erwecken kannst, während du codest.

Installieren des Xamarin.Forms Previewers

Der Xamarin Forms Previewer ist standardmäßig mit Visual Studio 2015 und 2017 mit Xamarin installiert. Auf dem Mac ist es standardmäßig in Xamarin Studio und der Visual Studio für Mac Vorschau verfügbar, mit dem neuesten Xamarin.iOS und Xamarin.Android installiert. Das Neueste Xamarin.Forms NuGet wird dabei empfohlen (mindestens Version 2.3.2). Der Previewer ist kostenlos erhältlich.

Wie du den Previewer verwendest

Der Previewer arbeitet auf jeder ContentPage, ContentView oder ViewCell in einer Xamarin.Forms Anwendung. Du kannst eine neue Xamarin.Forms App aus der Vorlage erstellen oder eine vorhandene Anwendung öffnen. Vergewissere dich, dass deine App XAML für Benutzeroberflächen-Dateien verwendet. Erstelle einen ersten Build von deiner App vor dem Öffnen der Previewer – eine erste Kompilierung ist erforderlich damit du die Android-Vorschau zum Laufen bringst. Es ist auch während der Entwicklung erforderlich, damit der Previewer auf alle UI-Änderungen und Ressourcen außerhalb des XAML zugreifen kann.

Ein Doppelklick auf eine XAML-Datei, um den Previewer in Xamarin Studio oder Visual Studio für Mac zu starten. Danach solltest du eine Split-Ansicht mit deinem XAML auf der linken Seite und eine Vorschau auf der rechten Seite sehen:

Xamarin

Wenn du die Designoberfläche nicht rechts siehst, drücke auf der Vorschau-Schaltfläche oben rechts im Texteditor, um den Previewer umzuschalten.

Um den Previewer in Visual Studio zu starten, wähle View-> Other Windows -> Xamarin.Forms Previewer oder suche nach “Preview” in der Suchleiste. Dies öffnet ein Werkzeugfenster für den Previewer. Das Werkzeugfenster kann dann neben dem Editor angedockt werden:

Xamarin

Die Designoberfläche

Der Previewer verfügt über Tools, die dazu beitragen, dass deine Benutzeroberfläche für deine Benutzer gut aussieht. Mit der Designoberfläche kannst du zwischen 3 Kategorien wählen:

  • iOS und Android
  • Telefon und Tablet
  • Landschaft oder Porträt

Zoom-Bedienelemente sind auch auf der Design-Oberfläche verfügbar, um dir zu helfen, dein Design zu optimieren. Auf einem Mac unterstützt Xamarin.Forms Previewer auch Trackpad-Zoom-Gesten.

Mehr Ressourcen

Für weitere Informationen über das Beste aus der Vorschau, schau dir die Hilfestellungen aus unserem Team und unserer Community an:

Der Previewer ist ein wertvolles Werkzeug, um die Entwicklung von Xamarin.Forms zu beschleunigen, und wir hoffen, dass du es als Teil deiner alltäglichen Entwicklungsworkflows nutzen kannst.

Manfred Steyer: Der neue Router für Angular im Detail betrachtet - Material von Workshop von den Angular Days, März 2017 in München

Nachfolgend das Material vom Workshop "Der neue Router für Angular im Detail betrachtet" von den Angular Days, März 2017 in München:

Karsten Kempe: Vergleich der Prozessmodelle TFS und VSTS

Process-Model1Änderungen an den Prozessvorlagen von TFS und VSTS sind nichts Ungewöhnliches und kommen in unterschiedlichen Ausprägungsstufen vor. Während im Team Foundation Server die Prozess-Templates in xml-Dateien hinterlegt werden, unterliegen in den Visual Studio Team Services die Vorlagen einer anderen Architektur, den sogenannten Prozessen. Seit der Einführung des Migrationsdienstes im letzten November, mit dem TFS-Datenbanken in die Team Services überführt werden können, bekomme ich immer häufiger Fragen, wie denn die Modellierung einer migrierten Datenbank in VSTS nun aussieht. Dieser Blog-Post stellt die unterschiedlichen Varianten gegenüber.

Stand heute (März 2017) können im Ökosystem TFS und VSTS drei unterschiedliche Prozessmodelle existieren:

  • das sog. Inheritance-Model
  • das „hosted“ XML-Modell
  • und das „On-Prem“ XML-Modell.

Inheritance-Modell

Alle neu erstellten Accounts in den Visual Studio Team Services arbeiten mit dem Inheritance-Modell, d.h. es muss immer erst eine Ableitung vom zugrundeliegenden Basis-Prozess erstellt werden, bevor Änderungen am Prozess vorgenommen werden können. Eine Änderung am angepassten Prozess ist automatisch für alle Projekte wirksam, die diesen Prozess verwenden.

Hosted XML-Modell

Das gehostete XML-Modell wird verwendet, wenn bestehende TFS-Collections mit veränderten Prozess-Templates in VSTS migriert werden. Dieses XML-Modell ist sehr ähnlich zum traditionellen Modell des TFS. Einzig die Speicherung der Metadaten erfolgt nun nicht mehr projektabhängig, sondern wie im Inheritance-Modell im Prozess des VSTS Accounts. Änderungen können nach wie vor gemacht werden, in dem der Prozess als .zip heruntergeladen, editiert und wieder importiert wird. Die Änderungen sind dann ebenfalls automatisch für alle Projekte wirksam, die diesen Prozess verwenden.

Anmerkung: sollte keine Veränderung am Prozess-Template des TFS vorgenommen oder vor dem Import der Datenbank rückgängig gemacht worden sein, dann verwendet der importierte Prozess ebenfalls das Inheritance-Modell.

„On-Prem“ XML-Modell

Dieses Modell ist das traditionelle Template-Modell des TFS. Wie bisher werden die Metadaten aus den jeweilgen Projekt-Prozess-Templates bezogen und somit ist jede Änderung daran nur für das darauf basierende Team Projekt gültig.

Hinweis: Auf http://aka.ms/tfsimportdata gibt es ein Migrationshandbuch mit einigen nützlichen Hinweisen, die die Migration erleichtern.

Modelle im Vergleich

Team Services TFS
Inheritance Hosted XML On-premises XML
Inherit system processes changes (Agile, Scrum, CMMI)
Process changes affect team projects
WYSIWYG1 editor
Use witadmin to edit team projects
REST API (read)
REST API (write)
Create custom processes
Advanced customizations (global workflow, custom link types)

 

Dieser Beitrag basiert unter anderem auf dem Beitrag von Ewald Hofman vom Januar 2017.

1WYSIWYG = what you see is what you get

Golo Roden: Einführung in Node.js, Folge 11: Code analysieren

Der gleiche Code kann unterschiedlich aussehen. Das beginnt bei der Formatierung und dem verwendeten Stil, führt dann zur Wahl der Sprachkonstrukte und endet schließlich bei der Frage, wie Elemente zu bezeichnen sind. Pair Programming und Code Reviews sind zwei Möglichkeiten, für einheitlichen Code zu sorgen. Wie lässt sich das durch Werkzeuge unterstützen?

Holger Schwichtenberg: Fehlendes ISO-Setup für Visual Studio 2017 sorgt für Ärger

Den neuen Visual Studio 2017-Installer gibt es derzeit nur noch als Webinstaller.

Manfred Steyer: Angular Datenbindung unter der Motorhaube - Material von Workshop von den Angular Days, März 2017 in München

Nachfolgend die Unterlagen von meinem Workshop "Angular Datenbindung unter der Motorhaube", den ich im März 2017 in München auf den AngularDays gehalten habe.

AIT: VSTS/TFS: Vereinfachte Administration bei der Zuweisung von Iterationen zu Teams

Im VSTS/TFS müssen immer wieder die gleichen Iterationen den verschiedenen Teams eines Team Projects zugewiesen werden. Dies ist mit viel manuellem Aufwand verbunden und kostet wertvolle Zeit. Mit Hilfe eines PowerShell-Skripts kann diese Zuordnung jetzt auch automatisch erfolgen.

PowerShell Script Relate-VstsIteration

Bisher ist es sehr mühsam gewesen, die einzelnen Iterationen einem Team zu zuordnen. Jede Zuordnung muss manuell über eine Liste erfolgen. Alternativ kann der direkte Pfad auch manuell eingeben werden.

clip_image002

Dieser Vorgang wiederholt sich für jede einzelne Iteration bei jedem Team. Je nach Umfang der Iterationen und der Menge der Teams nimmt dies viel Zeit in Anspruch.

Das PowerShell-Script Relate-VstsIteration, welches wir neulich auf GitHub veröffentlicht haben, bietet eine Möglichkeit diesen Vorgang zu automatisieren. Alle Iterationen mit der gleichen Tiefe im Iterationsbaum werden über das Skript einem oder mehreren Teams zugeordnet. Über die Angabe einer Start-Iteration werden alle weiteren Iterationen ermittelt. Hierzu durchläuft das Script den kompletten Iterationsbaum bis zur ersten Ebene.

clip_image004                        clip_image006

Man spezifiziert beim Skriptaufruf letztlich, welche Ebene des Iterationsbaums man welchen Teams zuordnen möchte. Eine ausführliche Dokumentation der Verwendung sowie des Aufbaus zur möglichen Weierverarbeitung befindet sich ebenfalls auf GitHub.

AIT: Von Technologien bis hin zu Geschäftsmodellen – Tag 2 @ BCW17

Auch der zweite Tag ging beeindruckend los. Dr. Dirk Hoheisel von Bosch zeigte eingängig, wie uns das Auto als persönlicher Assistent im Alltag zur Hand gehen kann. Dabei muss man keine umständlichen Bedienelemente kennenlernen, sondern spricht mit dem Auto in natürlicher Sprache. Der persönliche Assistent ist aber nicht aufs Auto begrenzt. Während durch die Nachricht der Ehefrau gerade noch neue Elemente zur Einkaufsliste hinzugekommen sind, steht die komplette Einkaufsliste bei Ankunft am Supermarkt auch schon auf dem Handy zur Verfügung. Natürlich hat das Auto noch kurz einen Blick in den heimischen Kühlschrank gewährt, um sicherzugehen, dass nichts unnötig gekauft wird.

clip_image002

Für das autonome Fahren gab es dann auch noch einige Neuigkeiten. Um die Umgebungserkennung bestmöglich zu gestalten wird eine Mischung aus Videoaufnahmen und Radartechnik verwendet – der Einsatz von deutlich teureren Lidar-Sensoren ist nicht mehr von Nöten. Um jedoch wirklich auf die Umgebung reagieren zu können, ist Artificial Intelligence erforderlich, also Autos, die sich selbst durch lernende Algorithmen verbessern. Doch dies erfordert eine enorme Rechenleistung. Genau aus diesem Grunde stand Jen-Hsun Huang, einer der Gründer des Chipherstellers Nvidia, mit auf der Bühne. Seine Ankündigungen waren nicht weniger spektakulär. So hat Nvidia in den vergangenen 3 Jahren mit mehr als 2000 Entwicklern einen regelrechten Supercomputer im Taschenrechnerformat entwickelt. Das Bauteil, ausgestattet mit weiterer Hard- und Software von Bosch, soll das Herzstück der künstlichen Intelligenz im Fahrzeug werden. Letztlich sind die drei wesentlichen Technologiefaktoren beim autonomen Fahren die folgenden: Deep Learning, HD Maps und Artificial Intelligence Supercomputing. In die Kerbe der Karten hat dann der CEO des Kartenanbieters HERE, Edzard Overbeek, geschlagen. Seine Vision der Kartenwelt von morgen, ist die Digitalisierung der kompletten realen Welt in Kartenmaterial – in 3D und in Echtzeit. Dabei dient jeder Mensch als Sensor um Daten aus der realen Welt zu liefern und so einen digitalen Zwilling entstehen zu lassen. Er sieht dabei viele sinnvolle und nützliche Szenarien, wie z.B. die Lieferung von Waren in einem mehrstöckigen Gebäude mittels Drohne oder dem Vorschlag in Stausituationen spontan auf die U-Bahn auszuweichen, da das autonome Auto ja eh allein den Weg nach Hause findet. Das der Mensch dabei als Werkzeug zur Datenerfassung genutzt und völlig transparent wird, löst jedoch auch etwas Besorgnis aus und kann verängstigend wirken.

clip_image004

Besonders spannend waren auch die Breakout-Sessions zu Augmented Reality (AR). Technical Fellow Paul Davis von Boeing hat über ihre AR-Aktivitäten berichtet. Dabei sind ganz spannende Zahlen einer von Boeing durchgeführten Studie gezeigt worden. Eine Gruppe an Testpersonen hat die Aufgabe bekommen, ohne vorherige Schulung ein bestimmtes Bauteil zusammenzusetzen. Dabei standen den unterschiedlichen Testgruppen Hilfsmittel zur Verfügung. Eine Gruppe hatte eine Anleitung am Desktop-PC zur Verfügung, eine weitere eine AR-Anwendung auf dem Tablet und die dritte Gruppe auf Microsofts AR-Brille, der HoloLens. In der letzten Ausbaustufe, der AR-Brille, hat die Testgruppe eine Qualitätssteigerung von 90%, also weniger Fehler, erreicht und dabei auch noch 30% der Zeit eingespart.

clip_image006

Fedra Ribeiro von Bosch hat sich mit der ROI-Betrachtung von Augmented Reality beschäftigt. Im der Quintessenz sind AR-Lösungen bei Technikern als Hilfsmittel sehr gefragt. Die Gründe sind die vorher beschriebenen Möglichkeiten die Qualität zu steigern und dabei auch noch schneller zu werden. In ihren Untersuchungen hat sich gemittelt ein ROI von 15% für AR-Lösungen bei Technikern ergeben. Eine große Gemeinsamkeit zu den Boeing-Erfahrungen ist, dass für die verschiedenen Problemstellungen ein Werkzeugkasten aus AR-Lösungen zur Verfügung steht. Die Brille ist eben nicht immer die richtige Lösung. Wo das Tablet ausreichend ist, ist dies meist die kostengünstigere Variante. In anderen Fällen, wenn man z.B. auf jeden Fall die Hände frei benötigt, ist die Brille unschlagbar. Wie Timotheus Höttges am Vortrag bereits sagte: „One size fits none“.

clip_image008

Ein weiterer Erfahrungsbericht kam von Siemens PLM Software. Tali Segall hat sich mit dem Entwicklungsprozess von industriellen Anlagen beschäftigt. Dabei ist festzustellen, dass bislang 3D-Daten an 2D-Monitoren verarbeitet werden. Diese Arbeit bekommt jedoch eine ganz andere Qualität, wenn man 3D-Daten auch im Raum bearbeiten kann. Ein ganz einfaches, aber umso anschaulicheres Beispiel sind Reviews eines bestimmten Entwicklungsstands. Wenn die Anlage dann tatsächlich im Raum, von allen Seiten und unterschiedlichen Höhen betrachtet werden kann, ist dies ohne Zweifel einem Review am PC um Welten voraus. Dies deckt sich vollständig mit unseren eigenen Erfahrungen mit AR im Bereich industrieller Anlagen (vgl. Fallstudie Langhammer).

clip_image010

Rhonda Truitt von Huawei hat eine ganz andere AR-Facette beleuchtet. Während die bislang genannten Beispiele den Engineering- und Fertigungsprozess fokussierten, hat sie das Szenario der Kundenkommunikation aufgezeigt. Bei dem „Enhanced Documentation“ Szenario wird dem Kunden in Papierform Prospektmaterial geliefert. Betrachtet man dies jedoch mit dem Tablet, so wird dieses Material durch digitale Ergänzungen angereichert.

clip_image012

Auffallend war noch, dass bei den Präsentationen immer, wenn es um AR-Brillen ging, die Rede war von der „HoloLens oder ähnlichen Geräten“. Alle wirklich umgesetzten Show Cases basierten jedoch auf Microsofts HoloLens. Dies bestärkt uns auch noch einmal darin, dass auch wir in unseren AR-Projekten mit einer Brille massiv auf die HoloLens setzen.

In den parallelen Sessions zum Thema Connected Mobility wurden die Gedanken zum Verkehrsbild der Zukunft aus der Keynote fortgesetzt. Der Fokus ging jedoch mit dem Aufritt von Dirk Ahlborn, CEO von Hyperloop Transportation Technologies Inc., weit weg vom Auto und hin zu einer alternativen Form der Fortbewegung. Er sprach dabei von nicht weniger als der Neuerfindung der öffentlichen Verkehrsmittel. Besonders interessant dabei war vor allem, dass nicht nur die Technologie Bestandteil des Projektes ist. Es wird das gesamte Geschäftsmodell in Frage gestellt. Aus der Frage „Wie erhalte ich ein Ticket?“ wurde zunächst „Brauche ich ein Ticket?“ bis am Ende die zentrale Frage im Raum stand „Ist der Verkauf von Tickets das beste Geschäftsmodell?“. Der Vergleich zu Amazon und Facebook war dabei sehr anschaulich. Beide Unternehmen bieten kostenlose Dienste an und sind dennoch hoch profitabel. Dabei verbringt ein Amerikaner pro Tag nur etwa 15 Minuten auf Facebook. Was ist nun also im öffentlichen Nah- und Fernverkehr möglich? Die Nutzungsdauer ist hier ja um ein vielfaches höher.

clip_image014

Anschließend wurde das am Vortag öfter erwähnte „Connected Parking“ im Detail vorgestellt. Neben der Nutzung des Fahrzeugs als Sensor, um die Umwelt zu scannen und der Integration über Sprachsteuerung in das „Connected Car“ wie es in der Keynote vorgestellt wurde, beeindruckte einmal mehr der Einsatz von Deep Learning, um erkannte Freiflächen als Parkplatz zu melden oder gesperrte Bereiche wie Einfahrten und Ladeflächen zu identifizieren. Alles in allem wird die Mobilität der Zukunft durch drei wesentliche Eigenschaften charakterisiert sein: elektrisch, automatisiert und verknüpft.

In den Sessions zu SmartCity wurde klar, dass es grundsätzlich zwei verschiedene Sichtweisen auf dieses Thema gibt. Einmal innerhalb von Gebäuden und einmal mit breiterem Fokus auf ein gewisses Gebiet, z.B. eine Stadt. Usman Haque, CEO von Thingful.net, hat die Begriffe in dem Themengebiet etwas geschärft. Aus seinen Projekterfahrungen geht es weniger um „smart“ sondern mehr um „engaged“. In eindrucksvollen Praxisbeispielen aus England hat er gezeigt, wie die Bürger einer Stadt in die Entwicklung zur Smart City mit einbezogen werden. Weitere spannende Beispiele haben Erin Baumgartner vom MIT, Jan Karl Warzelhan von Bosch Security Systems sowie Mathias Huth (Bosch Security Systems) und Thomas Jaißle (Drees & Sommer) gezeigt. Diese reichten von Analysen der Abwässer zur frühzeitigen Erkennung von Epidemien über die Optimierung von Merchandising mittels Kundenanalyse im Verkaufsraum bis hin zur digitalen Gebäudekonstruktion, also dem digitalen Zwilling in der Bauwirtschaft.

clip_image016

Ein wesentliches Thema, welches während der gesamten Konferenz hier und da gestreift wurde, kam nun auch zum Gespräch: Die Vertrauenswürdigkeit all dieser IoT-Lösungen. Denn eines ist allen Anwesenden klar. IoT kann nur erfolgreich sein, wenn es auch für „Internet of Trust“ steht. Denn alle Lösungen basieren auf der Sammlung, Weitergabe und Auswertung von Daten. Hierzu ist ein höheres Maß an Vertrauen nötig, als es aktuell der Fall ist. Darum widmeten sich eine Reihe von Sessions nun der Thematik Blockchain. Dr. Matthias Schubert vom TÜV Rheinland und Ass. Prof. Dr. Felix Wortmann vom Bosch IoT Lab stellten dar, wie mit Hilfe von Blockchain die Manipulation von Kilometerständen in Fahrzeugen verhindert werden kann. Besonders interessant dabei war, dass eine solche Lösung von Käufer- als auch Verkäuferseite in einer Studie als äußerst wünschenswert bewertet wurde, und über 96% der befragten Personen auch bereit wären diese Informationen bereitzustellen. Der Bedarf ist also da! Besonders interessant an dem Konzept ist, dass der Nutzer seine Daten selber unter Kontrolle hat und nur Hashes zur Verifizierung der Daten zentral gespeichert werden. Sollen Daten irgendwann ausgetauscht werden, kann gezielt ausgewählt werden welche das sein sollen und durch die zentrale Validierung besteht keine Manipulationsgefahr.

clip_image018

Es wurde jedoch auch deutlich herausgestellt, dass es sich hierbei noch um eine recht neue Technologie handelt, bei der es noch einige technische Herausforderungen zu meistern gilt.

clip_image020

Dr. Josef Maichle von Bosch stellte abschließend ein Proof of Concept zur digitalisierten Supply Chain vor, in welchem mehrere Beteiligte mit unterschiedlichsten Cloudplattformen Daten austauschen und diese über eine zentrale Blockchain ständig validieren. Das in diesem Konzept ein Großteil der eingesetzten Technologien aus der Open-Source-Community stammt (Docker-Container, node.js und Hyperledger) unterstreicht dabei einmal mehr das Plädoyer für mehr Offenheit von Dr. Volkmar Denner aus der Eröffnungskeynote.

Zum Abschluss des Tages wurden noch die Ergebnisse des zweitägigen und parallel laufenden Hackathons gezeigt. Es ist immer wieder beeindruckend, was man in zwei Tagen alles auf die Beine stellen kann. Chapeau!

Alles in allem war die Bosch Connected World eine sehr umfangreiche Veranstaltung mit vielen spannenden Themen. Wir haben uns in vielen Bereichen bestätigt gefühlt und wieder einiges dazu gelernt. Das wohl wichtigste Take-Away ist die umfangreiche Vernetzung zwischen den verschiedenen Anbietern und Lösungen und wie diese im Zusammenspiel einen Mehrwert für den Kunden ergeben können.

Haben auch Sie IoT-Szenarien in Ihrem Unternehmen und brauchen einen Partner auf Augenhöhe, der die technische Kompetenz, aber auch den Blick fürs Business hat, sprechen Sie uns einfach an.

Uli Armbruster: Speedtests vom Coworking auf Teneriffa

Wie versprochen veröffentliche ich die Speedtests aus Teneriffa.

Im Apartment, welches ich über Airbnb gebucht habe, ist das Internet in Ordnung. Der Upload ist noch ausbaufähig und sporadisch treten Probleme mit Skype auf. Bisher konnte ich dies allerdings nur abends feststellen, was unter Umständen damit zu tun hat, dass dann viele gleichzeitig auf das Internet zugreifen. In der Regel klappen die Skype Telkos vormittags gut, Teamviewer funktioniert ebenfalls problemlos.

Speedtest Apartment

Speedtest Apartment (Test mit LAN)

 

Die Uploads meiner YouTube Videos oder die Downloads meiner Pluralsight Kurse führe ich dann trotzdem in den Büros durch. Das folgende Bild verdeutlicht warum.

Speedtest Büros

Speedtest Büros (Test mit LAN)

 

Weder zuhause noch im Coworking Space gab es bisher Ausfälle, wie ich sie fast regelmäßig mit Unitymedia zuhause habe. Die Firewall sind offensichtlich alle weit geöffnet, sodass ich bisher keinerlei Probleme hatte. Lediglich wie W-LAN Reichweite an beiden Orten ist ein wenig dürftig. In jedem Fall hat man direkten Zugang zum LAN.


Einsortiert unter:German, Misc Tagged: Coworking, Off-Topic

Norbert Eder: Visual Studio 2017: Git failed with a fatal error

Im Source Control-Output von Visual Studio 2017 ist mir heute folgende Meldung aufgefallen:

Git failed with a fatal error
fatal: unable to access '\/.config/git/config': Invalid argument

Logischerweise gab es dann auch keine Status-Indikatoren für meine Projekte bzw. deren Dateien. Das scheint dann zu passieren, wenn Visual Studio 2017 im Administrator-Mode geöffnet wird. Wie kann man diese Situation nun lösen?

Es fehlt die für Git notwendige Umgebungsvariable HOME. Für mich hat es funktioniert, diese zu erstellen und auf das Laufwerk zu mappen, auf dem sich meine Repositories befinden. Nebenwirkungen möchte ich nicht ausschließen.

The post Visual Studio 2017: Git failed with a fatal error appeared first on Norbert Eder.

AIT: IoT ist nicht die Island of Things – Tag 1 @ BWC17

Es soll eine große Show werden. Soviel ist bereits im Eingangsbereich zur Bosch Connected World 2017 ersichtlich. Vor dem Konferenzgebäude steht ein Mercedes E400 mit der Aufschrift “Community-based Parking”. Dahinter versteckt sich die Idee ein Fahrzeug als IoT-Sensor zu nutzen, um freie Parkplätze an eine Plattform zu melden, um so die Parkplatzsuche in Großstädten erheblich zu erleichtern. Im Inneren wird man direkt von einem Mähdrescher der Firma CLAAS begrüßt. Definitiv der Blickfang in der Expo-Arena, da er alle weiteren Ausstellungsgegenstände um mehrere Meter überragt. Neben weiteren Fahrzeugen bestimmen vor allem viele AR und VR Devices das Bild.

clip_image001

In der Eröffnungskeynote hat Bosch CEO Dr. Volkmar Denner eindrucksvoll die 3-“S”-Strategie vorgestellt. Aus seiner Sicht besteht die Zukunft aus dem Zusammenspiel von Software, Sensoren und Services. Weiterhin hat er vier zukunftsweisende Technologiebereiche vorgestellt: Fog und Cloud Computing, IoT Networks, Blockchain und Artificial Intelligence. Alles spannende Themen und wichtige Grundsteine für Industrie 4.0. Openess und Partnerships wurden von ihm während seines gesamten Vortrags als wesentliche Erfolgsfaktoren neben den richtigen Technologien hervorgehoben. Denn IoT, wie auch immer das Thema interpretiert und umgesetzt wird, kann von keinem allein umgesetzt und in einem geschlossenen Eco-System erfolgreich sein.

clip_image002

Diese Punkte wurden anschließend in einem umfangreichen Show-Case sehr anschaulich und live dargestellt. Ein VW e-Golf meldet einen Defekt im Klimakompressor selbstständig an eine Service-Leitstelle, welche daraufhin die nächstgelegene Werkstatt kontaktiert. Alle nun folgenden Schritte, von der Kontaktaufnahme mit der Werkstatt, über die Lieferkette bis hin zur Montageanleitung wurden über die passende Sensorik und den Einsatz von Augmented Reality in die digitale Welt integriert. Da es sich hier nicht um eine einfache Demo handelt, sondern konkrete Lösungen mit Partnern wie Carglass und dem TÜV Rheinland zum Einsatz präsentiert wurden, beeindruckte die Vorführung umso mehr.

Abgeschlossen wurde die Keynote durch den CEO der deutschen Telekom, Timotheus Höttges, der mit dem Leitsatz “IoT ist nicht die Island of Things” den Saal zum Lachen brachte, damit aber die Themen Partnership und Openess von Dr. Denner unterstrich.

clip_image003

In den Breakout Sessions zu Connected Logistics und Supply Chain wurde zunächst ein beeindruckendes Marktwachstum von 30 % für Connected Logistics Solutions prognostiziert. Die Vision ist auch hier ein Ende-zu-Ende Workflow. Eine große Herausforderung dabei ist die Skalierung. In diesen Bereichen müssen einzelne Lösungsbausteine von Anfang an so konzipiert sein, dass sie hervorragend nach oben skalieren und den Markt durchdringen können.

Einzelne Ansätze dazu wurde an Praxisbeispielen verschiedener Unternehmen gezeigt. So hat beispielsweise die Bosch Service Solutions in Kooperation mit der PLL Projektlogistic eine Lösung zur Trailorüberwachung mittels verschiedener Sensoren gezeigt. Besonders an diesem Beispiel wird klar, dass nicht alle Use Cases sonderlich neu sind. Solche Systeme, die neben der reinen Positionsbestimmung auch weitere Sensoren verwenden wie beispielsweise an den Türen oder zur Temperaturüberwachung, existieren bereits seit 10 Jahre.

Eines ändert sich jedoch jetzt. Die Einstiegsbarriere ist niedriger. Dank IoT-Plattformen ist nicht mehr jeder einzelne Baustein manufakturähnlich gefertigt. Weitere Sensoren ins System zu bringen wird eher zum Standard als zur Individualentwicklung. Letztlich dreht sich das gesamte Themenfeld der Connected Logistics um das digitale Abbild der Ware sowie des gesamten Prozesses. Auch hierbei gilt: Diese Erkenntnis ist nicht neu. Leo Vinitsky, Vice President of IT Global Clearance & Supply Chain von FedEx Services hat erklärt, dass der FedEx Gründer bereits 1978 den folgenden Satz geprägt hat: „Information about the package is as important as the package itself.”

In der Breakout Session IoT Cloud wurden Kundenlösungen vorgestellt, welche basierend auf der Bosch IoT Suite und der Bosch IoT Cloud umgesetzt wurden. So hat die HUK-Coburg seit Jahresbeginn mit dem Programm “Smart Driver” ein Versicherungsmodell für Junge Fahrer in welchem man sich Rabatte “erfahren” kann. Dies wird durch eine Sensorbox im Fahrzeug und der entsprechenden Auswertung von Geschwindigkeits- und Beschleunigungsdaten ermöglicht. Zusätzlich ist in diesem Lösungsszenario das Erkennen von Unfällen auf Basis der erfassten Daten möglich.

Der Nachmittag startete mit dem Thema Artificial Intelligence & Deep Learning. Christoph Auer-Welsbach von IBM stellte in seiner Session die Bedeutung von AI in den Vordergrund und prognostizierte einen Paradigmenwechsel hin zu “Conversational AI – first” bis zum Jahr 2021. Anschließend gab es einige Einblicke in die Welt von Machine Learning bei Amzon durch Prof. Dr. Ralf Herbrich. So werden zum Beispiel Artikelbeschreibungen automatisiert übersetzt und Kunden-Reviews hinsichtlich ihrer Relevanz für das bewertete Produkt gefiltert – dabei werden sogar ironische oder sarkastische Formulierungen erkannt. Besonders beeindruckend war jedoch die visuelle Überprüfung von Lebensmitteln vor der Auslieferung. So können Früchte inzwischen nicht nur in ‘’gut” und “schlecht” unterschieden werden, sondern auch eine Aussage darüber gemacht werden, wann die Frucht schlecht werden wird!  Eines wurde in diesem Themenblock besonders deutlich dargestellt: Ohne den passenden Basisdaten ist kein AI möglich. Wenn man sich also irgendwie mit diesem Thema auseinandersetzen möchte, sollte man mit dem Erfassen von Daten beginnen – und zwar sofort.

Weitere spannende Breakout Sessions kamen aus dem Bereich Connected Manufacturing. Spannende Beispiele konnte Calvin Grieder von der Bühler Group liefern. Da die Bühler Group Produkte und Dienstleistungen anbietet, die nahezu alle Bereiche unseres täglichen Lebens betreffen, konnte er gleichzeitig die besondere Bedeutung dieses Themas herausstellen.

clip_image005

Laut einer vorgestellten Studie von machnation machen 2017 noch 27% des gesamten IoT Marktes traditionelle Produkte aus. Die anderen drei Viertel teilen sich auf in Connectivity, Enabling Tools und Value Services. Der gesamte Markt verändert sich also und damit auch die in ihm agierenden Unternehmen. Das sollten sie zumindest, um den Marktanforderungen weiterhin gerecht zu werden.

clip_image007

Nachdem wir die Phase der reinen Automatisierung verlassen haben, betreten wir nun das Zeitalter der Connected Automation. Das nachfolgende Bild zeigt unter dem Titel „The Fision of Machine Automation, IT and IIoT“ (IIoT = Industrial Internet of Things) sehr deutlich das Zusammenspiel verschiedenster Partner, Plattformen und Technologien. Allein bei den Plattformen spielen die Bosch eigene IoT-Cloud sowie Microsofts Azure Cloud eine Rolle. Selbst mit anderen IoT-Plattformen wie Predix von General Electrics wird zusammengearbeitet.

clip_image009

Dieser kleine Teil spiegelt eine wichtige Eigenschaft des gesamten Themas wieder: Partner, Partner, Partner. Das Zusammenspiel verschiedener Expertisen unterschiedlicher Partner bringt am Ende gemeinsam einen Mehrwert für den Kunden.

Jetzt sind wir schon sehr gespannt auf den zweiten Konferenztag und werden auch diesen in einem weiteren Blogpost zusammenfassen.

Manfred Steyer: Lazy Loading with Angular - Material from Talk at ng-nl in Amsterdam, March 2017

Below you find my slides and sample from my talk about Lazy Loading with Angular from ng-nl in Amsterdam (March 2017):

Norbert Eder: C# 7: Tuples

Tuples sind in .NET nicht neu, vielmehr jedoch, wie mit ihnen bisher umgegangen wird. Dieser Beitrag bringt dir das Thema näher.

Was sind Tuples?

Tuples stellen eine geordnete, nicht veränderbare Liste von Werten dar. Schon vor C# 7.0 gab es Tuples. Hier ein Beispiel dazu:

var myTuple1 = Tuple.Create<string, string>("norbert", "eder");
var myTuple2 = new Tuple<string, string>("norbert", "eder");

Console.WriteLine($"{myTuple1.Item1} {myTuple1.Item2}");

Wie an diesem Beispiel zu sehen, ist die Verwendung etwas umständlich. Die „Liste“ enhält bis zu 8 Elemente, welche über die Eigenschaften Item1, Item2 etc. verfügbar sind.

Verwendungszweck

Wozu können Tuples verwendet werden?

  • Abbildung von mehreren Datenwerten in einem Datensatz
  • Abbildung einer Datenstruktur für z.B. Berechnungen
  • Manipulation einer um schnell Manipulationen durchzuführen
  • Rückgabe mehrerer Werte von einer Funktion ohne out oder ref verwenden zu müssen
  • Übergabe von mehreren Werten an eine Methode repräsentiert durch eine einzige Variable

Neues in C# 7.0

Was aber ist nun neu in C# 7.0? Einiges, aber zu allererst muss man sich ein Nuget-Paket installieren: System.ValueTuple.

Danach kann es mit den ersten Beispielen los gehen:

var newTuple1 = ("norbert", "eder");
var newTuple2 = (firstname: "norbert", lastname: "eder");

Console.WriteLine($"{newTuple2.firstname} {newTuple2.lastname}");

Mehrere Datenwerte können folgendermaßen per Funktion zurückgegeben werden:

private (string,string,string) GetData(long id)
{
    return ("eins", "zwei", "drei");
}

private (string eins, string zwei, string drei) GetData2(long id)
{
    return ("eins", "zwei", "drei");
}

Dabei wird über die Tuple Types beschrieben, wieviele Werte welchen Typs zurückgeliefert werden. Wahlweise können den Tuple-Elementen Namen gegeben werden. Im ersten Fall muss per Item1, Item2 und Item3 auf die Werte zugegriffen werden. Im zweiten Beispiele sind sie mit eins, zwei und drei benannt.

Die große Änderung in C# 7 ist nun, dass Tuples als Werttypen behandelt werden. Dadurch ergibt sich ein Vorteil in der Performance und eine bessere Möglichkeit zur Steuerung des Speicherverbrauchs.

Das System.ValueTuple-Paket hängt auch Extension-Methods an ValueTuple und Tuple. Damit können diese einfach umgewandelt werden.

So fein das nun auch alles klingt, sollte man sich doch gut überlegen, wann Tuples sinnvoll eingesetzt werden können.

The post C# 7: Tuples appeared first on Norbert Eder.

Golo Roden: Bitfelder + funktionale Programmierung = Tic-Tac-Toe

Tic-Tac-Toe ist ein höchst langweiliges Spiel. Sofern keiner der beiden Spieler einen Fehler macht, endet das Spiel stets unentschieden. Interessanter ist die Frage, wie sich auf einem Spielfeld ermitteln lässt, ob einer der beiden Spieler eine Reihe gebildet hat. Bitfelder und ein Blick auf die funktionale Programmierung helfen.

MSDN Team Blog AT [MS]: Access DevCon Vienna

Access DevCon ViennaMicrosoft Access hält sich hartnäckig als Weltmarktführer bei Desktop-Datenbanken. Vor kurzem wurde es daher zu weiteren Office 365-Abos hinzugefügt und bekommt zusätzliche E-Commerce-Datenquellen.

Mit der Access DevCon Vienna gibt es für professionelle Access-Entwickler ein neues Gipfeltreffen der Access-Gurus. Die Access DevCon Vienna wird am 1./2.4.2017 in Wien stattfinden. Da die Vortragenden und Teilnehmer aus mehr als einem Dutzend Ländern kommen  findet die Access DevCon Vienna komplett in English statt.

Unter anderem werden auch zwei Mitglieder des Microsoft Access Produkt Teams aus Redmond anreisen um bei der Konfrenz dabei zu sein.

Ihre Präsentation wir die foigenden Themen umfassen::

•  Overview of what’s new in Access 2016
•  Demo one of the latest new features – Large Number (BigInt)
•  Discuss plans for the future
•  Communication channels with the product team

Viel Spaß!

MSDN Team Blog AT [MS]: Happy Birthday, Docker! Feiert mit uns!

Diese Woche wird Docker genau 4 Jahre alt. Zu diesem Anlass veranstaltet die Docker Community in zahlreichen Ländern ein spezielles Geburtstagsmeetup.

image00.jpg

Auch in Wien wollen wir mitfeiern! Docker Vienna wird zum Geburtstag das Meetup wieder aufleben lassen. Der Auftakt beginnt am 27. März 2017 bei uns im Microsoft Office.

Docker hat zu seinem Geburstag vier Birthday Labs vorbereitet, die ihr auch bei uns in Wien machen könnt. Egal ob ihr Docker erst kennenlernen wollt, oder schon Erfahrung mit Docker besitzt, es gibt das richtige Lab für euren Level. Es werden vor Ort auch Docker Mentoren dabei sein, die euch dabei unterstützen.

Für den Spaßfaktor ist natürlich auch beim Networking und dem Docker Selfie Booth garantiert. Anmelden könnt ihr euch auf der Meetup Seite.

Da bleibt also nichts mehr zu sagen, außer:

Happy Birthday, Docker!

Karsten Kempe: Agile is dead…

Letzte Woche war ich zu Gast beim Agile Meetup Munich und durfte einen kurzen Vortrag zum Thema Agilität halten. Der Vortrag wurde aufgezeichnet und auf YouTube veröffentlicht. Wenn Ihr also 10min übrig habt, dann schaut gerne rein. Viel Spaß!

Mein Vortrag startet beim Minute 03:00.

 

Vielen Dank an Gerhard Müller, für die Aufzeichnung, den Schnitt und Veröffentlichung!

MSDN Team Blog AT [MS]: Wie man einen Q&A Bot für Microsoft Teams erstellt ohne eine Zeile zu coden

Du willst einen Q&A Bot für Microsoft Teams erstellen? Und das ohne eine Zeile Code zu schreiben? Dann bist Du hier genau richtig!

Ab morgen ist Microsoft Teams weltweit verfügbar. Siehe auch: “Join us for an online event to celebrate the global availability of Microsoft Teams”. Passend dazu hat uns Thomas Gölles einen interessanten Gastartikel geschrieben, wie ihr Microsoft Teams auch in Eurer Organisation gleich noch besser nutzen könnt. Viel Spaß!


Vor knapp einer Woche, am SharePoint Saturday in München, hielt Wictor Wilén eine spannende Session zum Tema Microsoft Teams. Er zeigte dabei die Möglichkeiten auf mit denen man Microsoft Teams erweitern und um Tabs und Connectoren ergänzen kann. Zusätzlich nutzte Wictor auch die Gelegenheit seinen neuen Yeoman Generator für Tabs in Teams zu veröffentlichen (http://www.wictorwilen.se/yo_teams-tab).

Inspiriert von diesem spannenden Vortrag war es an der Zeit selbst zu versuchen in wie weit man das dort gezeigte auch bereits im eigenen Tenant verwenden kann. Ziel war die Anlage eines QnA Bots ohne dafür eine Zeile Code zu benötigen und genau das wollen wir uns nun genauer ansehen.

Wenn man, so wie ich, zu Beginn nicht wirklich weiß wo man anfängt, ist am besten man zieht diesen Blog Post zur Hilfe: Create BOT from FAQ page with no coding — QnA Maker as new member of Cognitive Service. Hier wird man Stück für Stück durch den sogenannten QnA Maker geführt, ein eigenes Tool in das man sich am besten mit dem gleichen Konto einloggt wie in seinen Azure Tenant.

Für den Aufbau der Knowledgebase stehen mehrere mögliche Quellen im QnA Maker zur Auswahl. Diese bilden später die Grundlage für den Bot. Die Knowledgebase kann man direkt über eine URL automatisch befüllen. Man könnte zum Beispiel direkt auf eine public FAQ Seite auf einer Webpage verlinken. Der QnA Maker wird den Text von dort nehmen, parsen und in seine Knowledgebase übernehmen. Man kann aber auch einfach ein PDF, Worddokument oder ein simples TXT im tab seperated Format hochladen. Die Grenze der Knowledgebase sind im Moment 20MB, was für einen ersten Versuch mehr als ausreichend sein sollte.

Hat man keine öffentlich erreichbare FAQ oder kein Dokument das in Frage kommt zur Hand, kann man alternativ auch manuell die Fragen und Antworten in einen Table auf der Webseite einpflegen. Hier ein Beispiel wie man aus einem internen OneNote seine Knowledgebase aufbauen kann:

Knowledgebase aus einem internen OneNote aufbauen

Nach der Eingabe folgt der wichtigste Schritt in Richtung AI des Bots, das Trainieren. Ich fühle mich hier etwas zurück geworfen in eine Zeit als Vorlesungen zum Thema maschinelles Lernen meinen Tagesablauf bestimmt haben und nein, ich hätte mir vor knapp 10 Jahren nicht gedacht, dieses Wissen je wieder auszugraben.

Trainieren der AI des Bots

Wie jeder Algorithmus wird auch unser Bot nur durch trainieren richtig gut. Mittels des Reiters Test auf der linken Seite kommt man direkt im QnA Maker auf eine Oberfläche wie oberhalb dargestellt. Man kann also einfach mittels Webchat mit dem Bot in Interaktion treten, ihn Sachen fragen und sieht links die Treffer die von der AI vorgeschlagen werden. Als korrigierende Maßnahme kann man nun Antworten umpriorisieren um so noch bessere Treffer für seine Nutzer zu erreichen.

Man kann sich nun einige Zeit mit dem Bot im Trainingsmodus beschäftigen, oder einfach nach zwei, drei Versuchen direkt den Publish Knopf drücken. Ab diesem Zeitpunkt ist die vorhandene Knowledgebase quasi veröffentlich.

Der nächste Schritt ist nun der Wechsel nach portal.azure.com und die Anlage eines Bot Services. Nach Antwort der typischen Azure Fragen nach Name, Ressourcegruppe etc. kommt man an einen Schirm wo man auswählen kann welches Template der Bot verwenden will. Zuerst muss man sich für C# oder NodeJS entscheiden, darunter befindet sich die Template Auswahl. Hier bitte auf die Kachel mit Question and Answer klicken und im anschließenden Dropdown seine vorhin veröffentliche Knowledgebase auswählen. Hat alles geklappt wird der Bot erstellt und man kommt direkt in den Develop Reiter des Bot Services:

Develop Reiter des Bot Services

Natürlich kann man hier nun auch direkt in den Code eingreifen, in meinem Fall C#, aber rein für diesen Blog Beitrag belassen wir den Code so wie er ist und klicken auf den Reiter Channels.

Channels

Hier werden die unterschiedlichen Channels für unser Bot Service gelistet. Im Standard ist Skype und der Web Chat Channel bereits vorhanden, den Microsoft Teams Eintrag muss man noch von unten über den Add Button hinzufügen. Klickt man nun auf „Add to Teams“ wird man über einen Redirect über die Website von Teams in das Chat Fenster des Clients geleitet und kann beginnen mit dem Bot zu interagieren:

mit dem Bot interagieren

Ein Tipp den Wictor uns in München noch gegeben hat: Sollte der Tenant Admin die Verwendung von Bots abgedreht haben, kann man den Bot mittels Suche nach seiner GUID in Teams trotzdem finden und so einen Chat starten. Ob das mit der GA Version von Teams auch noch so sein wird, bleibt abzuwarten.

Natürlich kann man den Bot auch in Skype ansprechen. Dazu öffnent man die Skype Consumer Preview und sucht im Botverzeichniss einfach nach seinem Bot.

Skype Consumer Preview

Zusätzlich zu den oben erwähnten Varianten rund um den Aufbau der zugrunde liegenden Knowledgebase gibt es noch die Möglichkeit diese via API anzusprechen. So könnte man auch Content der für den QnA Maker nicht öffentlich erreichbar ist automatisiert einpflegen und aktualisieren.

Ressourcen:


Gastartikel von Thomas Gölles

Golo Roden: Einführung in Node.js, Folge 10: Praxisbeispiel

Express und Middleware, Callbacks und Events, der Zugriff auf das Dateisystem und MongoDB sind inzwischen bekannt. Doch wie entsteht aus all den einzelnen Bausteinen eine integrierte Anwendung? Ein Praxisbeispiel zeigt Schritt für Schritt, wie man eine Anwendung in Node.js entwickelt und strukturiert.

Jürgen Gutsch: Integrate Meetup events on your website

This is a guest post, written by Olivier Giss about integrating Meetup events on your website. Olivier is working as a web developer at algacom AG in Basel and also one of the leads of the .NET User Group Nordwest-Schweiz


For two years, I am leading the .NET User Group Nordwest-Schweiz with Jürgen Gutsch that owns this nice blog. After a year, we decided also to use Meetup to get more participants.

Understanding the problem

But with each added platform where we post our events, we increased the workload to keep it all up to date. Jürgen had the great idea to read the Meetup events and list them on our own website to lower the work.

This is exactly what I want to show you.

The Meetup API

Before we start coding we should understand how the API of Meetup is working and what it does offer. The API of Meetup is well documented and supports a lot of data. What we want is to get a list of upcoming events for our meetup group and display it on the website without to be authenticated on meetup.com.

For our goal, we need the following meetup API method:

GET https://api.meetup.com/:urlname/events

The parameter “:urlname” is the meetup group name. In the request body we could sort, filter and control paging what we don’t need. If we would execute that query, you get an authorization error.

However, we don’t want that the user must be authenticated to get the events. To get it to work we need to use a JSONP request.

Let’s getting it done

The simplest way doing a JSONP request is using jQuery:

$.ajax({
  url: "https://api.meetup.com/Basel-NET-User-Group/events",
  jsonp: "callback",
  dataType: "jsonp",
  data: {
    format: "json"
  },
  success: function(response) {
    var events = response.data;
  }
});

Be aware: JSONP has some security implications. As JSONP is really JavaScript, it can do everything that is possible in the context. You need to trust the provider of the JSONP data!

After that call, we are getting the data from the Meetup API which can be used with simple data binding to display it on our website. You can choose any kind of MV* JS framework to do that. I used AngularJS.

<div class="row" ng-repeat="model in vm.Events track by model.Id" ng-cloak>
  <a href="" target="_blank" title="Öffnen auf meetup.com"><h3></h3></a>
  <label>Datum und Uhrzeit</label>
  <p></p>
  <label>Description</label>
  <div ng-bind-html="model.Description"></div>
  <label>Ort</label>
  <p></p>
</div>

As you can see everything is One-Way bound because the data is never changed. The “ng-bind-html” binds HTML content from the meetup event description.

The Angular controller is simple, it uses the "$sce” service to ensure that the provided HTML content from the meetup API is marked as secure. When we change a model outside of angular, we must notify our changes with “vm.scope.$apply()”.

(function () {
  var module = angular.module('app', []);

  module.controller('MeetupEventsController', ['$scope', '$sce', MeetupEventsController]);

  MeetupEventsController.$inject = ['$scope', '$sce'];

  function MeetupEventsController($scope, $sce) {

    var vm = this;
    vm.Events = [];
    vm.scope = $scope;
    vm.loaded = false;

    vm.Refresh = function() {
      $.ajax({
        url: "https://api.meetup.com/Basel-NET-User-Group/events",
        jsonp: "callback",
        dataType: "jsonp",
        data: {
          format: "json"
        },
        success: function(response) {
          var events = response.data;

          for (var i = 0; i < events.length; i++) {
            var item = events[i];

            var eventItem = {
              Id: i,
              DisplayName: item.name,
              Description: $sce.trustAsHtml(item.description),
              Location: item.venue.name + " " + item.venue.address_1 + " " + item.venue.city,
              Time: new Date(item.time).toLocaleString(),
              Link :item.link,
            };
            vm.Events.push(eventItem)
          }
          vm.loaded = true;
          vm.scope.$apply();
        }
      });
    };
    function activate() {
      vm.Refresh();
    };
    activate();
  };
})();

Finally, we are finish. Not that complicated, right? Feel free to ask question or share your experience.


Just visit the website of the .NET User Group Nordwest-Schweiz to see the Meetup integration in action.

Norbert Eder: Visual Studio 2017: Sprache ändern

Vor lauter Eile habe ich mir mein Visual Studio 2017 doch glatt in deutscher Sprache installiert. Der Installer ermittelt nämlich die Systemsprache und wenn diese für VS verfügbar ist, wird sie auch gegen den Entwickler verwendet. Leider hatte ich auch die Sprachauswahl übersehen und so sitze ich nun hier, und kann mein Visual Studio nicht auf Englisch umstellen. Aber es gibt eine Lösung.

Zusammen mit Visual Studio 2017 wird auch der Visual Studio Installer im System registriert. Dieser ist über das Startmenü auffindbar und muss gestartet werden. Wer diesen schon in einer anderen Sprache haben möchte, kann ihn mit dem Parameter -locale aufrufen:

Visual Studio Installer Locale Parameter

(In diesem Zusammenhang erkennt man zudem, dass sich die Pfadgestaltung von Visual Studio geändert hat)

Der Installer wird durch diesen Aufruf in englischer Sprache gestartet. Für den nächsten Schritt ist Modify zu wählen:

Modify Visual Studio 2017

Nun ist die dritte Lasche language packs zu öffnen und die entsprechenden Sprachpakete auszuwählen und anschließend zu bestätigen:

Visual Studio 2017 Language Packs

Nach der Installation kann die neue Sprache in Visual Studio unter Extras - Optionen ausgewählt werden:

Visual Studio Sprachwechsel

Visual Studio ist neu zu starten und erstrahlt in der neuen Sprache.

The post Visual Studio 2017: Sprache ändern appeared first on Norbert Eder.

Norbert Eder: C# 7: Out Variablen

out-Parameter gibt es in C# schon ewig, die Handhabe war bisher jedoch immer etwas klobig. Mit C# 7 wurden einige Änderungen vorgenommen, die eine einfachere Verwendung ermöglichen.

Wenn du nicht so firm mit out-Parametern bist, dann möchte ich dir eine kurze Zusammenfassung im Vorfeld geben:

  • out Paramter veranlassen ein Argument als Referenz übergeben zu werden
  • out Parameter sowohl in der Methodensignatur als auch bei der Übergabe mit dem out Schlüsselwort gekennzeichnet werden
  • Eine Instanzierung vor der Verwendung ist nicht notwendig, der Variable muss jedoch innerhalb der Methode mit einem Wert versehen werden

Wann werden out Parameter verwendet?

  • Typischerweise werden sie für das Try-Pattern verwendet, siehe z.B. Int32.TryParse. Dadurch kann man sich darauf verlassen, dass im Falle eines Durchlaufs ein Wert gesetzt wird. Bei anderen Implementierung sollte der Wert dennoch geprüft werden, da auch eine Initialisierung auf null zulässig ist.
  • Beispielsweise wird out auch gerne verwendet, wenn zu einem Rückgabewert zusätzlich noch ein Status o.Ä. zurückgeliefert wird.

Zu erwähnen ist, dass aber selbst Microsoft die Verrwendung von out-Parametern nicht empfiehlt: Avoid out parameters.

Nun aber zu den Neuerungen:

// out parameter
// old
int parsedVal;
if (Int32.TryParse("32", out parsedVal))
{
// logic
}

// new
if (Int32.TryParse("42", out int intVal))
{
// logic
}

Console.WriteLine($"{intVal}");

Wie im Code ersichtlich, kann die out-Variable nun an der Stelle deklariert werden, an der sie auch tatsächlich zum Einsatz kommt. Der Gültigkeitsbereich hat sich dadurch nicht verändert.

Auch var kann verwendet werden, da der Typ an dieser Stelle vom Compiler festgestellt werden kann:

if (Int32.TryParse("42", out var intVal))
{
// logic
}

Console.WriteLine($"{intVal}");

Durch Verwendung von _ können out-Werte auch verworfen werden:

var size = new Size(10, 10);
size.GetHeightAndWidth(out int width, out _);

In diesem Fall wird width übernommen, der zweite Parameter jedoch nicht.

Das war es auch schon. Viel Spaß beim Experimentieren und Verwenden.

The post C# 7: Out Variablen appeared first on Norbert Eder.

Uli Armbruster: Ich wette du hast nie geglaubt ich fahr, jetzt coworke ich schon ein Jahr auf Teneriffa

Lange war es ruhig in meinen Channels, was schlicht und ergreifend der vielen Arbeit in unserer neuen Firma co-IT.eu geschuldet war. Ich habe eine ganze Liste an Themen, die ich noch veröffentlichen will, aber starten werde ich mit Berichten aus Teneriffa – die Coworking Location meiner Wahl für den Monat März.

Was waren meine Beweggründe?

  • Die Zeit für Urlaub ist bei mir aktuell nicht gegeben, sodass ich eine urlaubsähnliche Umgebung angestrebt habe. Zudem schlägt mir das Wetter in Deutschland schon seit Jahren aufs Gemüt, sodass ich nach einer Möglichkeit gesucht habe dem künftig jährlich zu entfliehen.
  • Als Firma muss man mehr denn je für Mitarbeiter attraktiv sein, um beim War for Talent nicht den Kürzeren zu ziehen. Gepaart mit Ausflügen als Teambuilding Maßnahme planen wir kommendes Jahr für einige Tag hier her zu kommen. Vor Ort wollen wir Fachartikel schreiben, Social Media Content produzieren, Trainingsinhalte ausarbeiten und offene Diskussionen über Unternehmenswerte führen. Speziell letzteres ist meinem Verständnis nach für ein Startup elementar.
  • Effizienz: Bei meinen regelmäßigen Reflexionen sind mir Punkte aufgefallen, die primär das Thema Effizienz adressieren. Trotz Mehrarbeit – so scheint es mir – kommen am Ende weniger produktive Ergebnisse heraus. Der Wertstrom ist aber für mich persönlich die elementare Kennzahl, die stimmen muss. Wenn das nicht der Fall ist, muss am bestehenden System etwas geändert werden. Wer sich mit Effizienz beschäfigt, wird früher oder später über die Eisenhower-Matrix, die Theory of Constraints und vielleicht auch über das Standardwerk von Stephen Covey stolpern. In einem weiteren Beitrag werde ich hierauf noch eingehen.
  • Entschleunigung: Zwangsläufig musste ich mich nach dem Erkennen der obigen Probleme auch mit dem Thema Entschleunigung auseinander setzen.Dies gelingt am besten in einer neuen Umgebung. Bekanntlich haben unsere Nachbarn aus dem Süden diesbezüglich eine andere Mentalität als wir Deutschen. Deshalb bin ich gespannt, was ich hier für mich mitnehmen kann.

Wie wollte ich das lösen?

  • Zunächst einmal raus aus der alltäglichen Umgebung, raus aus der Telefonhölle und der täglichen Klein-Klein-Arbeit.
  • Weg, aber nicht zu weit weg, sodass ich, sollte ich künftig im Winter für 2-3 Monate in den Süden entfliehen, im Zweifel auch schnell für wichtige Meetings oder private Notfälle zuhause sein könnte.
  • Warm, aber nicht zu warm, denn bei der feuchtwarmen Hitze wie sie in Thailand oder der Dominikanischen Repulibik vorherrscht lässt es sich nicht mehr gut arbeiten.
  • Schnelles Internet ist die Grundvoraussetzung in meinem Beruf. Ich wollte mich nicht auf verkäuferähnliche Aussagen verlassen, sodass ich in meinem Bekanntenkreis nach Kontakten gesucht habe, die mir aus erster Hand von den Bedingungen vor Ort erzählen konnten.
  • Separate Büros standen ebenso auf meinem Zettel, da das Arbeiten in der Wohnung zwangsläufig wieder zur Mehrarbeit führen würde.

Was habe ich also gemacht?

Ich habe meine 7 Sachen gepackt, dazu jegliche Art der Elektronik und bin mit einer guten Freundin, die ebenfalls in der IT-Branche bei unserer befreundten Firma inovex arbeitet, nach Puerto de la Cruz in Teneriffa geflogen. Die Büros im Coworking Space kosten pro Monat 200€. Nach inzwischen 7 Tagen hier kann ich sagen, dass es sich problemlos produktiv arbeiten lässt.

In meiner Playlist auf YouTube könnt ihr das Experiment verfolgen. Inzwischen kam mir zu Ohren, dass Ralf Westphal zu dem Thema schon in der dotnetpro geschrieben hat. Den Artikel werde ich lesen, sobald ich wieder Zugriff auf den Leserbereich habe (danke Chris für den Hinweis!). Zum Bericht über das Internet vor Ort geht es hier.

Eine kleine Notiz am Rande: Den Beitrag habe ich nach dem Ansatz „Start with why“ von Simon Sinek verfasst.


Einsortiert unter:German, Misc Tagged: Coworking, Off-Topic, Video

Gordon Breuer: How to truncate a horizontal floating list

If you want to implement a horizontal breadcrumb navigation to your webpage, there are a few possibilities. One of the recommended one is using an unordered list and let these entries float.

Golo Roden: Zeitlose Programmiersprachen

Die Auswahl an Programmiersprachen wächst seit einigen Jahren wieder rasant. Wer sich abseits der tagtäglich genutzten weiterbilden und über den Tellerrand schauen möchte, steht vor der Frage, welche Sprache den größten Erkenntnisgewinn bringt. Vier Vorschläge.

Kazim Bahar: Mit Künstlicher Intelligenz die User Experience verbessern

… so lautet mein erster Blogeintrag auf AISOMA Analytics: AISOMA Analytics Blog

Karsten Kempe: Visual Studio 20th Anniversary

VSLaunch2017_placeholderHeute ist es also soweit. Visual Studio wird 20Jahre alt und beschenkt sich  selbst mit einer neuen Version – Visual Studio 2017. Microsoft schmeißt eine 2-tägige Party und alle sind eingeladen. Heute und morgen stellen Scott Hanselman, Brian Harry, Miguel de Icaza und Julia Liuson in einer Keynote die wichtigsten Neuerungen und Verbesserungen der neuen Visual Studio-Version vor. Seit dabei!

„Any developer, any app and any platform“ ist schon lange das neue Mantra der Visual Studio Familie. Mit Visual Studio 2017 gibt es heute die neue IDE mit vielen neuen Funktionen, die dieses Mantra noch besser unterstützen.

Neben der Geburtstagsparty am 7. März (live Stream) gibt es am 8. März noch einen weiteren Tag vollgepackt mit interaktiven Live Trainings. Die Agenda und vieles mehr findet Ihr unter https://launch.visualstudio.com.

Seit dabei und feiert mit! Heute (7. März) und morgen (8. März) ab jeweils 17Uhr!

Manfred Steyer: Server Side Rendering with Angular 4

Big thanks to Rob Wormald who provided an example that helped me to understand how server side rendering can be used in Angular 4, answered some open questions and took the time to review the article. Further big thanks to my buddy Hans-Peter Grahsl who helped me to improve this article.

Especially for consumer apps, server side prerendering brings back the benefits of classical web sites without forgoing the advantages of modern JavaScript solutions. It leads to faster loading times which in turn may cause higher conversion rates. It also allows for social links with previews of a web site and it might even help with SEO as search engines are dealing with server side rendered content for more than two decades. That being said, search engines like Google are constantly improving when it comes to indexing JavaScript solutions.

Since its first days, Angular is supporting this option. For Version 2 one could use the community project Angular Universal. As server side rendering is considered a strategic feature for Google's SPA-Flagship, the product team decided to include a refactored version directly into the framework. Beginning with Angular 4, this version is available.

In this article I'm describing the necessary steps to extend an existing Angular 4 application with server side rendering. I'm using a webpack configuration which has been generated by means of the Angular CLI. The full example can be found here.

Server side rendering brings additional complexity to a solution. Therefore, I would recommend to only use it when in need of its advantages.

Ejecting the Angular CLI

If you are using the Angular CLI you have to eject it, to get the possibility to adopt your build process by leveraging webpack:

ng eject

Make sure to know about the consequences before ejecting the CLI.

The CLI version I've used for this article did not include the Uglyfy-Plugin which removes code webpack marks as unused. In addition to that, it sets the AotPlugin's flag skipCodeGeneration to true which prevents AOT. In order to enable these options, I've modified the generated webpack.config.js as follows:

[...]
"plugins": [
	[...],
	new AotPlugin({
	  "mainPath": "src/main.ts",
	  "hostReplacementPaths": {
	    "environments\\environment.ts": "environments\\environment.ts"
	  },
	  "exclude": [],
	  "tsConfigPath": "tsconfig.json",
	
	  // Set flag to false to allow AOT
	  "skipCodeGeneration": false
	}),
	
	// Add UgilyJsPlugin
	new webpack.optimize.UglifyJsPlugin()
]
[...]

While AOT is not necessary for server side rendering, combining them makes perfect sense since both options positively impact the application's loading time.

Necessary Packages

The solution presented here uses Node.js with Express on the server side. Therefore I've downloaded the package express together with typings for it (@types/express) as well as @angular/platform-server:

npm i @angular/platform-server@4.0.0-rc.2 --save
npm i express --save
npm i @types/express --save-dev

One should make sure to get the version of @angular/platform-server that fits to the other used Angular packages. In my case, it was the version 4.0.0-rc.2.

Creating a Root Module for Server Side Rendering

To leverage server side rendering, one needs a root module that includes the new ServerModule. According to Rob Wormald's example, I also included the root module I'm using for rendering within the browser. This allows me to align with the DRY principle without the need to refactor the existing module structure:

// app.server.module.ts

import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
	  ServerModule,
	  AppModule
  ],
  bootstrap: [
	  AppComponent
  ],
  providers: [ ]
})
export class AppServerModule {}

Furthermore, the client side root module includes the BrowserModule by calling its static withServerTransition method. This method demands an id for the application in question:

// app.module.ts

@NgModule({
    imports: [
        BrowserModule.withServerTransition({
            appId: 'demo-app'
        }),
        HttpModule,
        FormsModule,
	    [...]
    ],
    [...]
})
export class AppModule {
}

AOT for the server side

As the CLI and its AotPlugin did not support AOT for server side code at the time of writing, the example directly uses the Angular Compiler. To configure it, I've created a copy of the file tsconfig.json with the name tsconfig.server.json. This file contains the following angularCompilerOptions:

"compilerOptions": {
    [...]
},
[...]
"angularCompilerOptions": {
  "genDir": "src/aot",
  "entryModule": "./src/app.server.module#AppServerModule"
}

The npm script ngc:server within the file package.json calls the Angular Compiler:

[...]
"scripts": {
    [...]
    "ngc:server": "ngc -p tsconfig.server.json"
}
[...]

After calling this script (npm run ngc:server) the compiler creates the usual additional TypeScript files for the project. Using the AppServerModuleNgFactory that has been created for the server side root module AppServerModule, the file main.server.ts is starting up a node process which takes care of prerendering:

// main.server.ts
// Modified version of equivalent file in 
// https://github.com/robwormald/ng-universal-demo/

import 'zone.js/dist/zone-node';
import { platformServer, renderModuleFactory } from '@angular/platform-server';
import { enableProdMode } from '@angular/core';
import { AppServerModule } from './app/app.server.module';
import { AppServerModuleNgFactory } from './aot/src/app/app.server.module.ngfactory';
import * as express from 'express';
import {ngExpressEngine} from './express-engine';

enableProdMode();

const app = express();

app.engine('html', ngExpressEngine({
	baseUrl: 'http://localhost:8000',
	bootstrap: [AppServerModuleNgFactory],
}));

app.set('view engine', 'html');
app.set('views', '.')

app.get('/', (req, res) => {
	res.render('index', {req});
});

app.get('/home*', (req, res) => {
	res.render('index', {req});
});

app.get('/flight-booking*', (req, res) => {
	res.render('index', {req});
});

app.get('/passenger*', (req, res) => {
	res.render('index', {req});
});

app.get('/history*', (req, res) => {
	res.render('index', {req});
});

app.use(express.static('.'));

app.listen(8000,() => {
	console.log('listening...');
});

Please note, that these server side routes not only allow for prerendering specific parts of the Angular application but also return static files, like the bundles used on client side.

This file is a modified version of a similar file in Rob's example. In addition, I took his express engine that kicks in prerendering:

// express-engine.ts
// Taken from https://github.com/robwormald/ng-universal-demo/

import { renderModuleFactory } from '@angular/platform-server';

import * as fs from 'fs';
import * as path from 'path';

const templateCache  = {};

export function ngExpressEngine(setupOptions){

	return function(filePath, options, callback){
		if(!templateCache[filePath]){
			let file = fs.readFileSync(filePath);
			templateCache[filePath] = file.toString();
		}
		renderModuleFactory(setupOptions.bootstrap[0], {
			document: templateCache[filePath],
			url: options.req.url
		})
		.then(string => {
			callback(null, string);
		});
	}
}

Webpack configuration for server side rendering

To build the server side version, the example uses a copy of the existing webpack.config.js with the name webpack.server.js. Of course, in a real world project it would be a good idea to avoid a duplication of (configuration) code but for this demonstration it seems to be ok.

This configuration uses the target node in order to get a bundle for the server side and just one entry point:

  // main.server.ts
  
  [...]
  target: 'node',
  [...]
  "entry": {
    "main": [
      "./src/main.server.ts"
    ]
  },

As the solution is using just one bundle, I've also removed the two usages of the CommonsChunkPlugin. In order to make experimenting easier, I've removed the NoEmitOnErrorsPlugin, too.

In order to prevent webpack from overwriting the client side version, the configuration in question uses the name scheme xyz.server.bundle.js for the generated bundles:

  "output": {
    "path": path.join(process.cwd(), "dist"),
    "filename": "[name].server.bundle.js",
    "chunkFilename": "[id].server.chunk.js"
  },

To prevent some issues the solution leverages the AotPlugin in addition to directly using the Angular Compiler:

new AotPlugin({
  "entryModule": __dirname + "/src/app/app.server.module.ts#AppServerModule",
  "hostReplacementPaths": {
    "environments\\environment.ts": "environments\\environment.ts"
  },
  "exclude": [],
  "tsConfigPath": "./tsconfig.server.json",
  "skipCodeGeneration": false
}),

Build scripts

For creating a build which involves using the Angular Compiler and starting webpack, the example uses some npm scripts within the file package.json:

"scripts": {
	[...]
	"build": "npm run build:client",
	"build:client": "webpack",
	"build:server": "ngc -p tsconfig.server.json && webpack --progress --config webpack.server.config.js",
	"build:all": "npm run build:client && npm run build:server",
	[...]
}

After defining these scripts, one can call npm run build:all to build the application for both, the client side as well as the server side.

Starting

After building the application, one can switch to the dist folder and start the server.

cd dist
node main.server.bundle.js

This makes the application available via http://localhost:8000. The server prerenders the requested view. To follow that, just temporarily turn off JavaScript and see that you can at least navigate through the menu items (forms don't work without JavaScript). In addition to server side prerendering, Angular kicks in on client side after it has been loaded.

Further Thoughts

There are two more things, I've discussed with Rob Wormald. The first one is about transmitting the server side state to the client. Especially if the server fetches data from a Web API, it would come in handy to directly transfer the resulting state to the client. This prevents the client code from fetching the very same data once again, right after it kicks in. Rob suggest the usage of something like a Redux Store (see ngrx/Store) which can be easily transferred as a JSON-based "data island" to the client. For sure, these thoughts are worth their own article.

The second part of our conversation was about the "uncanny valley" which is the time between receiving the prerendered view from the server and the moment the client side code kicks in. When the latter one happens, the application state is reset which also affects data the user has entered into forms so far. The solution in Angular 4 doesn't prevent this and we agreed that such an undertaking is quite challenging. Therefore, it seems to be a good idea to go with use case specific solutions for this. This can involve writing the application in a way that prevents such situations as well as leveraging your own or community based solutions which fit the scenario in question. A nice idea regarding this as well as some very interesting performance measurings can be found here.

Golo Roden: Einführung in Node.js, Folge 9: Datenbanken ansprechen (NoSQL)

JavaScript lässt sich nicht nur im Browser und auf dem Webserver einsetzen. Auch Infrastrukturdienste wie Datenbanken, Message-Queues, Caches & Co. verstehen die Sprache zunehmend und beherrschen JSON als Datenformat. Die NoSQL-Datenbank MongoDB war eine der ersten dieser Art. Wie funktioniert der Zugriff auf MongoDB?

Jürgen Gutsch: Using dependency injection in multiple .NET Core projects

One of my last post was about Dependency Injection (DI) in .NET Core Console Applications. Some days after that post was published, I got a question about how to use the IServiceCollection in multiple projects. In this post I'm going to try to explain, how to use the IServiceCollection in a Solution with more projects.

Setup

To demonstrate that, I created a Solutions with two .NET Core Console apps and two .NET Standard libraries. One of the console apps uses two of the libraries and the other one is just using on. Each library provides some services which need to be registered to the DI container. Also the console apps provide some services to add.

We now have four projects like this:

  • DiDemo.SmallClient
    • .NET Core Console app
    • includes a WriteSimpleDataService
    • references DiDemo.CsvFileConnector
  • DiDemo.BigClient
    • .NET Core Console app
    • includes a WriteExtendedDataService
    • includes a NormalizedDataService
    • references DiDemo.SqlDatabaseConnector
    • references DiDemo.CsvFileConnector
  • DiDemo.SqlDatabaseConnector
    • .NET Standard library
    • includes a SqlDataService
    • includes a SqlDataProvider used by the service
  • DiDemo.CsvFileConnector
    • .NET Standard library
    • includes a CsvDataService

BTW: Since one of the latest updates the "Class Libraries (.NET Standard)" project disappeared from the ".NET Core" node in the "Add New Project" dialogue and the "Class Library (.NET Core)" is back again. The "Class Libraries (.NET Standard)" is now in the ".NET Standard" node under the "Visual C#" node.

In the most cases it doesn't really makes sense to create a .NET Core class library. The difference here is, that the Class Library (.NET Core) has some .NET Core related references. They targeting the netcoreapp1.x instead of the netstandard1.x. This means they have a lot of references, which are not needed in a class library in the most cases, e. g. the Libuv and the .NET Core runtime.

The WriteExtendedDataService uses a INormalizedDataService to get the data and writes it to the console. The NormalizedDataService fetches the data from the CsvDataService and from the SqlDataService and normalize it, to make it usable in the WriteExtendedDataService.

The WriteSimpleDataService uses only the ICsvDataService and writes the data out to the console.

Setup the DI container

Let's setup the DI container for the SmallClient app. Currently it looks like this:

var services = new ServiceCollection();
services.AddTransient<IWriteSimpleDataService, WriteSimpleDataService>();
services.AddTransient<ICsvDataService, CsvDataService>();

var provider = services.BuildServiceProvider();

var writer = provider.GetService<IWriteSimpleDataService>();
writer.write();

That doesn't really look wrong, but what happens if the app grows and gets a lot more services to add to the DI container? The CsvDataService is not in the app directly, but it is in the separate library. Usually I don't want to map all the services of the external library. I just want to use the library and I don't want to know anything about the internal stuff. This is why we should set-up the mapping for the DI container also in the external library.

Let's plug things together

The .NET Standard libraries should reference the Microsoft.Extensions.DependencyInjection.Abstractions to get the IServiceCollection interface. Now we can create a public static class called IServiceCollectionExtensions to create an extension method to work in the IServiceCollection:

public static class IServiceCollectionExtension
{
  public static IServiceCollection AddCsvFileConnector(this IServiceCollection services)
  {
    services.AddTransient<ICsvDataService, CsvDataService>();
    return services;
  }
}

Inside this method we do all the mappings from the interfaces to the concreate classes or all the other registrations to the DI container. Let's do the same to encapsulate all the services inside the SmallClient app and to keep the program.cs as small as possible:

public static class IServiceCollectionExtension
{
  public static IServiceCollection AddInternalServices(this IServiceCollection services)
  {
    services.AddTransient<IWriteSimpleDataService, WriteSimpleDataService>();
    return services;
  }
}

We can now use this methods in the program.cs of the SmallClient app to plug all that stuff together:

var services = new ServiceCollection();
services.AddInternalServices();
services.AddCsvFileConnector();

var provider = services.BuildServiceProvider();

var writer = provider.GetService<IWriteSimpleDataService>();
writer.write();

It looks much cleaner now. Maybe you remember the AddSomething methods? Exacctly, this is the same way, it is done in ASP.NET Core with e. g. the services.AddMvc() method.

We now need to do the same thing for the BigClient app and the SqlDatabaseConnector library. At first let's create the mapping for the SqlDatbaseConnector:

public static class IServiceCollectionExtension
{
  public static IServiceCollection AddSqlDatabaseConnector(this IServiceCollection services)
  {
    services.AddTransient<ISqlDataService, SqlDataService>();
    services.AddTransient<ISqlDataProvider, SqlDataProvider>();
    return services;
  }
}

We also need to create a extension method for the internal services:

public static class IServiceCollectionExtension
{
  public static IServiceCollection AddInternalServices(this IServiceCollection services)
  {
    services.AddTransient<IWriteExtendedDataService, WriteExtendedDataService>();
    services.AddTransient<INormalizedDataService, NormalizedDataService>();
    return services;
  }
}

Now let's plug that stuff together in the BigClient App:

var services = new ServiceCollection();
services.AddInternalServices();
services.AddCsvFileConnector();
services.AddSqlDatabaseConnector();

var provider = services.BuildServiceProvider();

var writer = provider.GetService<IWriteExtendedDataService>();
writer.write();

As you can see, the BigClient app uses the already existing services.AddCsvFileConnector() method.

Does it really work?

It does. Start the BigClient app in Visual Studio to see that it will work as expected:

To see the full sources and to try it out by yourself, please visit the GitHub repository: https://github.com/JuergenGutsch/di-core-multi-demo

What do you think? Do you have questions or some ideas to add? Feel free to drop a comment :)

Jürgen Gutsch: ActiveRoute TagHelper

I recently read the pretty cool blog post by Ben Cull about the IsActiveRoute TagHelper: http://benjii.me/2017/01/is-active-route-tag-helper-asp-net-mvc-core/. This TagHelper adds a css class to an element, if the specified route or route parts are in the current active route. This is pretty useful, if you want to highlight an active item in a menu.

Inspired by this idea, I created a different TagHelper, which shows or hide contents, if the specified route or route parts are in the current route. This could be useful, e.g. if you don't want to have a link in an active menu item.

From the perspective of an semantic web, it doesn't make sense to link to the current page. That means, the menu item that points to the current page should not be a link.

The usage of this TagHelper will look like this:

<ul class="nav navbar-nav">
  <li>
    <a asp-active-route asp-action="Index" asp-controller="Home" asp-hide-if-active="true">
      <span>Home</span>
    </a>
    <span asp-active-route asp-action="Index" asp-controller="Home">Home</span>
  </li>
  <li>
    <a asp-active-route asp-action="About" asp-controller="Home" asp-hide-if-active="true">
      <span>About</span>
    </a>
    <span asp-active-route asp-action="About" asp-controller="Home">About</span>
  </li>
  <li>
    <a asp-active-route asp-action="Contact" asp-controller="Home" asp-hide-if-active="true">
      <span>Contact</span>
    </a>
    <span asp-active-route asp-action="Contact" asp-controller="Home">Contact</span>
  </li>
</ul>

As you may see on the a-Tag, multiple TagHelper can work on a single Tag. In this case the built in AnchorTagHelper and the ActiveRouteTagHelper are manipulating the Tag. The a-Tag will be hidden if the specified route is active and the span-Tag is shown in that case.

If you now navigate to the About page, the a-Tag is removed from the specific menu item and the span-Tag is shown. The HTML result of the menu now looks pretty clean:

<ul class="nav navbar-nav">
  <li>
    <a href="/">
      <span>Home</span>
    </a>
  </li>
  <li>
    <span>About</span>
  </li>
  <li>
    <a href="/Home/About">
      <span>Contact</span>
    </a>
  </li>
</ul>

Using this approach for the menu, we don't need Ben Culls TagHelper here to add a special CSS class. The style for the active item can be set via the selection of that list item with just the span in it:

.nav.navbar-nav li > a { ... }
.nav.navbar-nav li > a > span { ... }
.nav.navbar-nav li > span { ... } /* this is the active item*/

This CSS is based on the default Bootstrap based template in a new ASP.NET Core project. If you use another template, just replace the CSS class which identifies the menu with your specific identifier.

That means, to get that active menu item looking nice, you may just add a CSS like this:

.navbar-nav li > span {
    padding: 15px;
    display: block;
    color: white;
}

This results in the following view:

To get this working, we need to implement the TagHelper. I just created a new class in the project and called it ActiveRouteTagHelper and added the needed properties:

[HtmlTargetElement(Attributes = "asp-active-route")]
public class ActiveRouteTagHelper : TagHelper
{
  [HtmlAttributeName("asp-controller")]
  public string Controller { get; set; }

  [HtmlAttributeName("asp-action")]
  public string Action { get; set; }

  [HtmlAttributeName("asp-hide-if-active")]
  public bool HideIfActive { get; set; }
  
  
}

That class inherits the TagHelper base class. To use it on any HTML tag, I defined a attribute name which is needed to on the HTML we want to manipulate. I used the name "asp-active-route". Also the attributes getting a specific name. I could use the default name, without the leading "asp" prefix, but I thouhgt it would make sense to share the Controller and Action properties with the built-in AnchorTagHelper. And to be consistent, I use the prefix in all cases.

Now we need to override the Process method to actually manipulate the specific HTML tag:

public override void Process(TagHelperContext context, TagHelperOutput output)
{
  if (!CanShow())
  {
    output.SuppressOutput();
  }

  var attribute = output.Attributes.First(x => x.Name == "asp-active-route");
  output.Attributes.Remove(attribute);
}

If I cannot show the Tag because of the conditions in the CahShow() method, I completely suppress the output. Nothing is generated in that case. Not the contents and not the HTML tag itself.

At the end of the method, I remove the identifying attribute, which is used to activate this TagHelper, because this attribute will be kept usually.

To get the RouteData of the current route, we cant use the TagHelperContext or the TagHelperOutput. We need to add the inject the ViewContext:

[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }

Now we are able to access the route data and get the needed information about the current route:

private bool CanShow()
{
  var currentController = ViewContext.RouteData.Values["Controller"].ToString();
  var currentAction = ViewContext.RouteData.Values["Action"].ToString();

  var show = false;
  if (!String.IsNullOrWhiteSpace(Controller) &&
      Controller.Equals(currentController, StringComparison.CurrentCultureIgnoreCase))
  {
    show = true;
  }
  if (show &&
      !String.IsNullOrWhiteSpace(Action) &&
      Action.Equals(currentAction, StringComparison.CurrentCultureIgnoreCase))
  {
    show = true;
  }
  else
  {
    show = false;
  }

  if (HideIfActive)
  {
    show = !show;
  }

  return show;
}

One last step you need to do, is to register your own TagHelpers. In Visual Studio open the _ViewImports.cshtml and add the following line of code:

@addTagHelper *, CoreWebApplication

Where CoreWebApplication is the assembly name of your project. * means use all TagHelpers in that library

Conclusion

I hope this makes sense to you and helps you a little more to get into the TagHelpers.

I always have fun, creating a new TagHelper. With less code, I'm able to extend the View engine the way I need.

I always focus on semantic HTML, if possible. Because it makes the Web a little more accessible to other devices and engines than we usually use. This could be screen readers for blind people, as well as search engines. Maybe I can do some more posts about accessibility in ASP.NET Core applications.

Code-Inside Blog: HowTo: Get User Information & Group Memberships from Active Directory via C#

I had to find a way to access all group memberships from a given Active Directory user. The problem here is, that groups may contain other groups and I needed a list of “all” applied group memberships - directly or indirectly.

The “fastest” solution (without querying each group) is to use the Token-Groups attribute, which already does this magic for us. This list should contain all applied groups.

The code would also allow to read any other AD property, e.g. the UPN or names etc.

Code

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("ListAllGroupsViaTokenGroups:");

        List<string> result = new List<string>();

        try
        {
            result = ListAllGroupsViaTokenGroups("USERNAME", "DOMAIN");

            foreach (var group in result)
            {
                Console.WriteLine(group);
            }
        }
        catch (Exception exc)
        {
            Console.WriteLine(exc.Message);
        }

        Console.Read();
    }

  
    private static List<string> ListAllGroupsViaTokenGroups(string username, string domainName)
    {
        List<string> result = new List<string>();

        using (PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, domainName))
        using (var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domainContext.Name)))
        {
            searcher.Filter = String.Format("(&(objectClass=user)(sAMAccountName={0}))", username);
            SearchResult sr = searcher.FindOne();

            DirectoryEntry user = sr.GetDirectoryEntry();

            // access to other user properties, via user.Properties["..."]

            user.RefreshCache(new string[] { "tokenGroups" });

            for (int i = 0; i < user.Properties["tokenGroups"].Count; i++)
            {
                SecurityIdentifier sid = new SecurityIdentifier((byte[])user.Properties["tokenGroups"][i], 0);
                NTAccount nt = (NTAccount)sid.Translate(typeof(NTAccount));

                result.Add(nt.Translate(typeof(NTAccount)).ToString() + " (" + sid + ")");
            }
        }

        return result;
    }

}

Hope this will help someone in the future.

Code @ GitHub

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