Hans-Peter Schelian: Eine Woche Apple Music – was bleibt von den Erwartungen?

Letzte Woche Dienstag ist Apple mit seinem Music Streaming Dienst „Apple Music“ Live gegangen

  • Was ist „für mich“ nach einer Woche von den Erwartungen die ich an den Dienst hatte übrig geblieben.
  • Wie sieht die gemeinsame Zukunft von Apple Music und mir aus.
  • Was sind meiner Meinung nach aktuell die stärken und die schwächen von Apple Music.

Aber ich fange einfach mal an, mit den „ meiner Meinung“ nach positiven Dinge von Apple Music.

  • Die Musikauswahl ist hervorragend (das war auch zu erwarten).
  • Der Preis für das Einzelabo ist „normal OK“
  • Wenn man ein Familienabo abschließt ist der Preis sogar sehr gut.
  • Im Online Betrieb ist die Auswahl von Playlisten und der Radiosender wirklich nicht schlecht.

Was ich wirklich vermisse:

  • Die Möglichkeit Freigegebene Playlisten abonnieren zu können, wie das bei Spotify möglich ist.
  • Ein Integration von Apple Musik in SONOS (ja die soll später mal kommen, aber das nutzt mir heute nichts)
  • Das abonnieren von Listen wie „Aktuelle Titel“ oder „Top-Titel“.

Was ist nicht gut gelöst:

  • Alles was mit OFFLINE zu tun hat ist nicht wirklich intuitiv gelöst, das geht viel besser (siehe Spotify).
  • Das man unter „NEU“ nicht alles als Playlist führt, und es somit nicht einfach abonnieren kann und damit die OFFLINE Verwendung erschwert.

Resümee (im Vergleich mit Spotify):

  • Kosten: Finanziell würde ich mit Apple Music besser fahren als Heute mit Spotify. Spotify kostet mich für 4 Leute 25.— € im Monat bei Apple Music würde ich mit 15 .— € auskommen (1:0 für Apple).
  • Musikangebot: Das Musikangebot ist für mich genau so ausreichend wie bei Spotify (gut teilweise sogar etwas größer was mich aber nicht so beeindruckt) (ausgeglichen also 2:1)
  • Playlisten: Wie ich bereits oben geschrieben haben, vermisse ich die Möglichkeit von geteilten Playlisten (die nicht von Apple zur Verfügung gestellt werden sondern von anderen Benutzern) (2:2 Spotify zieht gleich).
  • OFFLINE: Die OFFLINE Nutzung von Apple Music gefällt mir nicht so wie die von Spotify (2:3 Spotify geht in Führung).
  • Bewertungssystem: Das Bewertungssystem der Apple Music App und iTunes ist nicht mehr durchgängig gleich zu bedienen. (Das ist einfach ein dicker Minuspunkt — )

Da für mich die (Freigegebenen) Playlisten und der OFFLINE Betrieb wichtige Aspekte eines Streaming Dienstes sind, hat für mich momentan Spotify noch klar die Nase vorn.

Wenn Apple hier nicht schnell nachlegt, werde ich nach dem Testbetrieb sicherlich das Abo von Apple Music nicht verlängern und weiterhin meine Musik mit Spotify streamen.

Fabian Deitelhoff: Meine Veranstaltungen im Überblick

Da ich in letzter Zeit vermehrt Kurse, Workshops und Seminare anbiete, meistens zu Themen wie beispielsweise dem LEGO Mindstorms EV3 oder zum wissenschaftlichen Arbeiten, habe ich nun endlich mal die Zeit gefunden, diese Veranstaltungen übersichtlich in einem Kalender darzustellen.

Zusätzlich habe ich mich um eine Übersicht meiner Veranstaltungsorte gekümmert, so dass jeder, der Interesse hat, schnell sieht, wo im Moment etwas stattfindet.

Aktuelle Veranstaltungsorte

Die Übersicht meiner aktuellen Veranstaltungsorte habe ich als extra Seite und nicht als Blogpost veröffentlicht. Ich versuche, diese Liste so aktuell wie möglich zu halten. So viele Änderungen ergeben sich allerdings auch nicht. Insbesondere nicht in kürzerer Zeit.

Ein Blick auf die Seite lohnt sich immer dann, wenn Interesse an einem Kurs, Workshop oder Seminar besteht und nicht bekannt ist, ob vielleicht schon etwas in der Nähe stattfindet.

Trotzdem freue ich mich auch weiterhin über Anfragen aller Art. Oft werde ich erst so auf eine Region aufmerksam, in der sich vielleicht eine Veranstaltung lohnen könnte, weil genug Interesse besteht.

Der Kalender

Neben der Übersicht der Veranstaltungsorte gibt es auch eine Übersicht über die Veranstaltungstermine in Kalenderform. Dort sind alle Zeiten und natürlich auch die Orte aufgeführt.

Der Monat Juli in der Monatsansicht im Kalender.

Der Monat Juli in der Monatsansicht im Kalender.

Ich versuche den Kalender circa zwei Monate im Voraus zu pflegen, was bisher ganz gut geklappt hat. Wo es geht, bette ich auch direkte Links zu den konkreten Veranstaltungen der jeweiligen Anbieter ein. Die Veranstaltungen lassen sich entweder als Monatsübersicht (Standard), als Liste oder Tagesübersicht (immer aktueller Tag) anzeigen.

Fazit

Ich hoffe, beide Übersichten bringen Klarheit, wann ich wo Kurse durchführe. Wer sich nicht sicher ist, kann trotzdem gerne direkt nachfragen.

codefest.at [MS]: Windows 10 IoT Core Preview

Alle die sich mit dem Thema IoT, Internet der Dinge, Industrie 4.0, Internet of YOUR things beschäftigen sind sicher auch schon mit dem Raspberry Pi2 und der Windows 10 IoT Core Preview in Berührung gekommen.

Ende Juni hat es ein Update der Vorabversion gegeben die Neuerungen und Änderungen mit sich bringt:

  • der “Home Screen“, der über den HDMI Ausgang ausgegeben wird, wurde erweitert (neben der nützlichen Anzeige der IP-Adresse und der angeschlossenen Geräte) ist eine kleine Menü-Navigation dazugekommen mit weiteren Netzwerkeinstellungen und einem “getting startet” Guide als kleine Hilfestellung
  • der Raspberrry kann nun auch per SSH verwaltet werden
  • Sound: Audioausgabe per USB und dem analogen Ausgang des Raspberry Pi2
  • neues Flash-Tool (GUI basierend) für das OS-Image
  • der interne Webserver ist unter port 8080 erreichbar, der Windows IoT Core Watcher (ein kleine Applikation welche die aktiven IoT-Geräte im gleichen Subnet des Windows 10 PC/Tablet anzeigt auf dem die Applikation läuft) versucht den Webserver allerdings noch über den “alten” port 80 anzusprechen – was fehlschlägt.

Die Entwicklung von Applikationen für Windows 10 IoT Core ist sehr einfach da diese auch Windows 10 Universal Apps sind. Visual Studio 2015 bietet volle Unterstützung mit dem Windows 10 SDK (auch für die GPIO Erweiterungsboards) sowie der Möglichkeit die Daten in Microsoft Azure zu verarbeiten und zu speichern, mit BI (PowerBI) dazustellen/analysieren oder mit Microsoft Azure Machine Learning Vorhersagen zu treffen und in die Zukunft zu schauen.

Jürgen Gutsch: HTTP Sniffer Part 7: Integration in einen Windows Service

Inhalt

Den Windows Service anlegen

Damit der Sniffer nicht in einer offen Console läuft und im Hintergrund auch für andere Benutzer laufen kann, sollte er als Windows Service angelegt werden.

Dafür wird ein Windows Service Projekt im Visual Studio ausgewählt. in Visual Studio 2015 RC versteckt sich das Template unter “Visual C#” -> “Windows” -> “Windows Desktop”

Start des Service

Die Service1.cs habe ich umbenannt in “CallProxy.cs” und erweitert, um Eventlogs in einer eigenen EventSource abzulegen:

public CallProxy()
{
    InitializeComponent();
    if (!EventLog.SourceExists("GOS"))
    {
        EventLog.CreateEventSource("GOS", "Proxy");
    }
    ServiceEventLog.Source = "GOS";
    ServiceEventLog.Log = "Proxy";
}

Der Proxy wird dann bei Onstart in einem eigenen Thread gestartet, der dann einfacher bei OnStop gekillt werden kann:

protected override void OnStart(string[] args)
{
    _thread = new Thread(Execute);
    _thread.Start();
}

private void Execute()
{
    var ip = Settings.Default.ListenIP;
    var port = Settings.Default.ListenPort;

    var proxy = new Proxy
    {
        ListenToIp = IPAddress.Parse(ip),
        ListenOnPort = port
    };

    proxy.Start();
}

protected override void OnStop()
{
    if (_thread != null)
    {
        _thread.Abort();
        _thread.Join();
    }
}

(Der Übersicht halber habe ich die Fehlerbehandlung und das Logging aus dem Beispiel-Code entfernt)

In der Methode Execute, in der der Proxy gestartet wird. passiert im Prinzip das gleiche wie auch in der Console Anwendung. Die Einstellungen bezüglich IP-Adresse und Port werden über die – in der App.Config gespeicherten – Settings geholt. Sobald der Proxy gestartet ist, läuft dieser, wie es in den vergangenen Beiträgen beschrieben ist.

Installation:

Damit der Service einfacher installiert werden kann ist auch die Program.cs. auf diese Art kann der Service bequem mit den Parametern –i/-install, bzw. –u/-uninstall installiert und deinstalliert werden. Ist dagegen kein Parameter angegeben, wird der Service ohne Installation gestartet (schaut euch dazu am besten die Sourcen auf Github an).

Sven Hubert: ALM kompakt: IntelliSense hilft beim Erweitern von Work Items

Karsten Kempe: Alles im Blick – Work Item Charts

Work Item Charts Bugs by PriorityHeute widme ich diesen Beitrag einem Thema, dass ich schon sehr lange noch einmal näher vorstellen wollte – nämlich den Work Item Charts. Die Möglichkeit kleine Grafiken zum Status von Work Items zu erstellen, gibt es mittlerweile schon seit dem TFS 2013, doch noch nicht jeder TFS-Benutzer kennt diese Funktion. Im folgenden Beitrag erkläre ich Euch das Wichtigste zum Thema Work Item Charts.

Die Visualisierung von Projektdaten ist einer von vielen Erfolgsfaktoren des Application Lifecycle Managements (ALM). Nur wenn mir als Mitglied eines Projektteams klar ist, wie der aktuelle Zustand meines Projekts ist, kann ich aus dieser Information lernen und meine Rückschlüsse ziehen. Und über Informationen verfügt der TFS eine ganze Menge. Es gilt diese nur richtig auszuwerten.

Hinweis: Ich möchte an dieser Stelle keine Ratschläge erteilen, welche Metriken die Besten sind, denn das kann von Team zu Team und Projekt zu Projekt sehr unterschiedlich sein.

Work Item Charts basieren auf flachen Listen (sog. flat-list queries). D. h. zu jeder flachen Work Item Query können ein oder mehrere Charts erzeugt werden. Ihr seht, die Informationen habt Ihr bereits, da es Queries seit jeher im TFS gibt und Ihr mit sehr hoher Wahrscheinlichkeit regelmäßig damit arbeitet. Die Charts oder Diagramme bieten Euch nun einen Weg, die Work Item Listen zu visualisieren und besser auswertbar zu machen. Natürlich konnte man das auch früher durch die Verwendung von Excel und Excel Pivot-Charts oder durch den Einsatz von SQL Server Reports (SSRS). Nur Work Item Charts sind wesentlich schneller und viel einfacher zu erstellen. Und man braucht kein Excel oder SharePoint, um sich die Diagramme anzusehen.

„Status Quo“ Chart oder Trend Chart

Mittlerweile (seit TFS 2013 Update 4) gibt es zwei unterschiedlich Typen von Chart-Modellen, die uns der TFS zur Verfügung stellen kann. In einem früheren Blog-Post von mir, habe ich bereits die Basics der „Status Quo“ Charts erklärt, deswegen erläutere ich im Folgenden nur ein paar Erneuerung und die Trend Charts.

Work Item Charts Bug VerlaufEin Trend Chart zeigt, wie der Name schon vermuten lässt, den Verlauf einer bestimmten Information von Work Items an. Ein gutes Bespiel dafür ist die Bug-Statistik eines Projekts. Wie viele Bug Work Items befinden sich in meinem Projekt und wie verändert sich deren Zustand über die Zeit. Derzeit können Werte der letzten sieben Tage, der letzten zwei oder vier Wochen, der letzten 12 Wochen oder des letzten Jahres angezeigt werden.

Dazu erstellt man sich eine flache Liste zur Anzeige aller Bugs im gewünschten Team Projekt (in meinem Beispiel habe ich keinerlei weitere Filterkriterien verwendet). In der Queries Maske des TFS Web Access befindet sich ein Tab „Charts“.

TFS Work Item Charts Create

Über „New Chart“ erscheint ein Dialog, in dem im Moment zwischen drei unterschiedlichen Trend Chart-Modellen ausgewählt werden kann: Stacked Area, Area oder Line. Zu jedem Modell muss dann mindestens ein Work Item Feld als Filter-Kriterium ausgewählt werden. In der rechten Seite des Dialogs bekommt man dann sofort nach der Auswahl des Kriteriums eine Vorschau des Diagramms. Durch einen Klick auf die farbigen Flächen, können zudem auch die Farben des Diagramms angepasst werden.

Work Item Charts Homepage

Jedes Chart, welches zu einer „Shared Query“ erstellt wurde, lässt sich auf die Team Home Page pinnen. Damit bekommt jedes Teammitglied alle relevanten Projektinformationen auf einen Blick und muss dafür nicht die Web-Oberfläche des TFS verlassen.

Probierts mal aus! Bei Fragen einfach ein Kommentar hinterlassen. Viel Spaß!

[1] https://msdn.microsoft.com/en-us/library/dn407521.aspx?f=255&MSPPError=-2147217396

[2] http://blogs.msdn.com/b/jamiedalton/archive/2014/11/13/tfs-2013-update-4-trend-charts.aspx

codefest.at [MS]: Sommer Developer Wettbewerb – MVA Kategorie

exklusive MVA-Power BanksWie schon letzte Woche im Blog Post Der große Sommer Developer Wettbewerb angekündigt, startet dieser morgen. Hier jetzt die Details zur MVA- Kategorie:

Ich hoffe natürlich, Ihr besucht alle regelmäßig unsere MVA, die Microsoft Virtual Academy. Die kostenlosen Online-Trainings der Microsoft Virtual Academy unterstützen Euch Entwickler dabei Euer Know-How zu aktuellen Technologien zu erweitern.

Eigentlich solltet Ihr ja sowieso ganz begierig nach Trainings sein. Vielleicht hilft aber unser kleines “Zuckerl” Euch noch mehr zu motivieren: Im Zuge des großen Sommer Developer Wettbewerbs könnt Ihr bis zu 200 Punkte einheimsen wenn Ihr die entsprechenden MVA-Kurse absolviert.

Alles was Ihr dazu tun müsst ist:

  1. Euch mittels der MVA weiter bilden
  2. Uns bekannt zu geben dass Ihr gerne beim großen Sommer Developer Wettbewerb mitmachen wollt.

So könnt Ihr Euch weiterbilden und trotzdem Urlaub machen! Smile

Gewinnspielanleitung im Detail:

  1. Einen oder mehrere der folgenden angegebenen Kurse komplett absolvieren (=100% abgeschlossen).
  2. Abgeschlossene Kurse im MVA Profil sichtbar machen
  3. E-Mail an wettbewerb@microsoft.com mit dem Link auf Euer eigenes öffentliches MVA-Profil (z.B. http://www.microsoftvirtualacademy.com/Profile.aspx?alias=102682)
  4. erspielte Punkte: So viele, wie du auf der MVA für den Kurs erhältst. Die maximale Punkteanzahl für diese Kategorie ist gecapped auf 200.

Welche Kurse zählen?
Ihr könnt einen oder mehrere der folgenden Online-Kurse in der Microsoft Virtual Academy abschließen um mitzumachen:

Kann ich mit mehreren MVA Kursen teilnehmen?
Klar! Schließlich willst du eine hohe Punkteanzahl. Beachte aber, dass es für die MVA Kurse maximal 200 Punkte gibt.

Was soll im Anmelde E-Mail stehen?
In Eurem E-Mail an wettbewerb@microsoft.com gebt bitte den Link auf Euer eigenes öffentliches MVA-Profil (z.B. http://www.microsoftvirtualacademy.com/Profile.aspx?alias=102682) an. Ihr findet es wenn Ihr in Euren Profileinstellungen auf “Zum öffentlichen Profil navigieren” klickt.

Wie weise ich nach dass ich einen Kurs gemacht habe?
Als Nachweis bitte einfach Eure absolvierten Kurse im Profil veröffentlichen. Dazu:

  1. Zu den Profileinstellungen navigieren.
  2. Im Abschnitt “Persönliche Daten” den Punkt “meine Profildaten fuer alle Nutzer freigeben” aktivieren
  3. Im Abschnitt “Mein Status in der MVA” den Punkt “Tracks” aktivieren

Ablauf

  • Sobald du mindestens zwei Kategorien erledigt hast: Mail an uns schicken mit den einzureichenden Infos an: wettbewerb@microsoft.com
  • Wenn du danach noch weitere Punkte sammeln willst, einfach wieder eine Email an uns mit den einzureichenden Infos schicken .
  • Nach jeder Email bekommst du von uns deinen Punktestand.

Alle Details und die weiteren Kategorien findet Ihr im Blog Post Der große Sommer Developer Wettbewerb.

Viel Spaß beim Lernern!!

Bei Fragen, Wünschen und Komplikationen aller Art erreicht Ihr mich wie gewohnt unter meiner E-Mail Adresse.

Gerhard Göschl, Marketing Leiter - IT-Spezialisten und Software Entwickler

Microsoft Österreich GmbH
Gerhard.Goeschl@Microsoft.com

codefest.at [MS]: Der große Sommer Developer Wettbewerb

Zu dem Launch von Windows 10 haben wir uns gedacht, dass es wieder höchste Zeit ist einen Wettbewerb zu veranstalten. im Rahmen dieses Wettbewerbs wollen wir verschiedenste Aktivitäten belohnen und bieten natürlich jede Menge an ganz tollen Preisen. Der Wettbewerb läuft von 6. Juli 2015 bis zum 18. September 2015.

 

Push Your Developer Score

Wir haben einige Kategorien, aus denen Du Aufgaben suchen kannst und dann dafür Punkte erhältst. Egal was Du machst, Du erhöhst Deinen Score. Anhand deiner Punkteanzahl wirst Du unter allen Teilnehmern gereiht. Für die Teilnehmer mit den 30 höchsten Punkteständen gibt es tolle Preise, doch dazu später noch mehr. Wir werden zu den einzelnen Kategorien in den folgenden Tagen und Wochen noch weiterführende Infos auf unserem Blog posten. Aus folgenden Kategorien könnt ihr wählen:

 

  1. Microsoft Virtual Academy
    Absolviere einen Kurs auf der Microsoft Virtual Academy, der ab 1. Mai 2015 auf der MVA erschienen ist. Veröffentliche dein MVA Profil, damit wir sehen können, dass du den Kurs absolviert ist.
    Nähere Infos, wie das geht, findest du hier auf dem Codefest Blog.
    Einreichen per Email: Link zu deinem MVA-Profil.
    Punkte: Soviele, wie du auf der MVA für den Kurs erhältst. Die maximale Punkteanzahl für diese Kategorie ist gecapped auf 200.

  2. Azure
    Erstelle eine Azure Subscription im Zeitraum des Wettbewerbs (6. Juli 2015 – 18. September 2015) und sende uns den Screenshot, den du für diese Subscription auf account.windowsazure.com siehst, sodass die Werte Offer ID und Date Purchased ersichtlich sind. Gültig sind alle Subscriptions aus: Trials, Dreamspark, MSDN, BizSpark, Open, Nutzenbasiert und EAs.
    Wenn du Student bist, findest du in den kommenden Tagen Infos hier auf Codefest, wie du deinen Azure Account über DreamSpark aktivierst.
    Einreichen per Email: Screenshot der Subscription Daten wie oben beschrieben
    Punkte:  50. Die maximale Punkteanzahl für diese Kategorie ist auf 100 gecapped.

  3. Web
    Erstelle oder aktualisiere eine Webseite oder Web App im Ausmaß einer Personal Site, die komplett HTML5 kompatibel ist. Sende uns diese Webseite, aus der klar hervorgeht, dass diese Seite von dir ist. Um zu Testen, ob deine Webseite HTML5 konform ist, kannst du ein Evaluierungstool der W3C verwenden. Solltest du keinen Hosting Space finden, kannst du auch über Azure Web Apps (siehe Punkt B) deine Webseite hosten.
    Einreichen per Email: Die URL deiner Webseite.
    Punkte: 200.

  4. Apps/Games
    Erstelle eine App oder ein Spiel und veröffentliche es im Windows 10 Store. Zum derzeitigen Zeitpunkt ist es noch nicht möglich, Apps über das Windows 10 Dev Center Dashboard einzureichen, du kannst aber schon beginnen und im Laufe der Wettbewerbszeit deine App oder dein Spiel dann einzureichen. Alle Infos zu Entwickeln für Windows 10 findest du auf dev.windows.com. Das Veröffentlichungsdatum der App muss nach dem Öffnen des Windows 10 Dev Centers für Einreichungen sein.
    Einreichen per Email: Der Store Link zu deiner App/deinem Spiel und deine Publisher ID.
    Punkte: 200.

  5. Visual Studio
    Verwende Visual Studio oder das kostenlose Visual Studio Code (gibt es auch für Mac OS X und Linux) und poste öffentlich im Zeitraum des Wettbewerbs (6. Juli 2015 – 18. September 2015) via Twitter/Facebook/Webseite/Youtube, was dir an Visual Studio besonders gut gefällt. Erwähne uns dabei in deinem Post mit @codefest. Solltest du Visual Studio nicht haben, kannst Du es Dir von http://visualstudio.com herunterladen. Für den Wettbewerb kannst Du natürlich auch die kostenlosen Versionen wie z.B. Visual Studio Community-Edition oder Visual Studio Code verwenden.
    Einreichen per Email: Die URL von deinem Post.
    Punkte: 50.
     

Punkte einlösen und Preise erhalten

Alle Teilnehmer werden gemäß ihrer Punkteanzahl nacheinander gereiht. Für die Teilnehmer mit den höchsten Punkten gibt es folgende Preise in dieser Reihenfolge. 

  1. Exklusiver Erlebnispreis. Wird noch angekündigt!
  2. Exklusiver Erlebnispreis. Wird noch angekündigt!
  3. Dell Latitude 10
  4. Dell Venue 8 Pro Tablet
  5. – 10. Fatboy Wireless Ladekissen
  6.  – 15 Raspberry Pi  
  7.  – 30 Powerbank - Portabler Ladestick

image

Die Gewinnerermittlung erfolgt eine Woche nach Ende des Wettbewerbs. Die Teilnehmer mit den 30 höchsten Punkteständen werden per Email verständigt.

Ablauf

  • Sobald du mindestens zwei Kategorien erledigt hast: Mail an uns schicken mit den einzureichenden Infos an: wettbewerb@microsoft.com

  • Wenn du danach noch weitere Punkte sammeln willst, einfach wieder eine Email an uns mit den einzureichenden Infos schicken .

  • Nach jeder Email bekommst du von uns deinen Punktestand.

Fragen und Regeln?

  • Was sind die Preise für den ersten und zweiten Platz?
    Wir haben uns hier was ganz Besonderes ausgedacht. In ein bis zwei Wochen werden wir es auf diesen Blog Post ankündigen.

  • Kann ich mit mehreren MVA Kursen/Subscriptions/Webseiten/Apps/Spielen/Posts teilnehmen?
    Klar! Schließlich willst du eine hohe Punkteanzahl. Beachte aber, dass es für die ersten beiden Kategorien eine maximale Punkteanzahl gibt.

  • Kann ich auch mehrere Preise gewinnen?
    Nein. Du bekommst gemäß deinem Platz in der Gewinnerrangliste deinen Preis, wenn du unter den Teilnehmern mit den 30. höchsten Punkteständen gehörst.

  • Kann ich auch Windows/Windows Phone 8.1 Apps/Spiele erstellen?
    Ja, aber das die App oder das Spiel muss ab der Öffnung des Windows 10 Dev Centers für Windows 10 Apps im Store veröffentlicht worden sein.

  • Kann ich auch nur „einfache“ Apps in den Store stellen?
    Im Prinzip schon. Rechnerisch kannst Du auch mit (vielen) schlechten Apps, die nie ein Mensch herunterlädt, ein Gerät bekommen. Aber wer will das auf diese Art und Weise? Wir nicht, es würde Dich auch unsere lebenslange Verachtung verfolgen. Die User werden sich von Dir und Deinen Apps abwenden und aus Scham endest Du letztlich als outgesourceter Klick-Monkey eines Goldfarmers und musst tagein tagaus ein MMORPG spielen, das eigentlich niemanden mehr interessiert. Sprich: mit Qualität geht’s besser. Zudem ist das Risiko geringer, dass das Store Team selbst (auf das wir keinen Einfluss haben) die App ablehnt.

  • Bis wann läuft die Aktion?
    Bis 18.9.2015

     

    Das Kleingedruckte:

    Veranstalter ist die Microsoft Österreich GmbH. Teilnahmeberechtigt sind alle Personen mit Hauptwohnsitz in Österreich und einer österreichischen postalischen Zustelladresse. Von der Teilnahme ausgeschlossen sind Mitarbeiter von Microsoft und deren Angehörige sowie Amtsträger. Vendoren können teilnehmen, von der Teilnahme ausgeschlossen sind allerdings Apps, die durch Microsoft unterstützt oder in Auftrag gegeben wurden. Minderjährige sind teilnahmeberechtigt, wenn der gesetzliche Vertreter in die Teilnahme und in diese Teilnahmebedingungen vorher eingewilligt hat. Ein Store Account erfordert eine gültige ("echte") Kreditkarte bei der Anmeldung.

    Teilnahmevoraussetzung ist die Veröffentlichung ist die Durchführung von mindestens 2 Aufgaben von zwei verschiedenen Kritierien bis spätestens 18. September 2015 und der E-Mail an wettbewerb@microsoft.com. Wir behalten uns vor, die Teilnahmebedingung zu ändern, das wird hier entsprechend veröffentlicht. Die Gewinner werden per E-Mail verständigt und erklären sich mit der Veröffentlichung des Vornamens und des Anfangsbuchstabens des Nachnamens auf codefest.at einverstanden. Der Rechtsweg ist ausgeschlossen und die Ausbezahlung in bar nicht möglich. Mit Ihrer Teilnahme stimmen Sie diesen Teilnahmebedingungen vollständig und bedingungslos zu.

    Die Vergabe der Gewinne erfolgt in der Reihung der höchst-erzielten Punkte.  Das Risiko, dass die App aus Qualitätsgründen aus dem Store entfernt wird  (worauf wir lokal keinen Einfluss haben) trägt der Einsender. Eine Mehrfachteilnahme am Wettbewerb ist ausgeschlossen: jeder kann maximal einen Preise beanspruchen - jegliche Kombination aus den Kriterien ist möglich sofern mindestens 2 verschiedene verwendet werden und die Höchstpunkteanzahl bei Kategorie A und B eingehalten wird. „Government officials“ sind von der Teilnahme ausgeschlossen.

    Durch das Absenden Ihrer Daten willigen Sie in die Speicherung Ihrer Daten durch die Microsoft Corporation in den USA und der Microsoft Österreich GmbH ein. Die erhobenen Daten dienen einzig der Auslosung und Benachrichtigung der Gewinner, sie werden nicht zu anderen Werbezwecken genutzt oder an Dritte weitergegeben. Diese Einwilligung können Sie jederzeit mit Wirkung für die Zukunft widerrufen. Ein Widerspruch ist an Microsoft Österreich GmbH, Am Europlatz 3, A-1120 Wien, oder an austria@microsoft.com zu richten.

Holger Sirtl: Azure News on Friday (KW27/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Microsoft Azure Plattform. Hier sind nähere Infos dazu…

Aktuelle Neuigkeiten

Datum Nachricht
02.07. Azure Preview Portal Improvements (June Update)
Neues im Azure Portal - Breadcrumb Navigation, List Refresh, kürzlich genutzte Ressourcen auf einen Blick etc.
02.07. A Brand New Docker Extension
Neue Docker Extension mit Docker Compose Support, Docker Hub/Registry Authentication Support etc.
02.07. Enabling Client Certificate Authentication for an Azure Web App
Authentifizierung bei Azure Web Apps via Client Zertifikat - hier steht wie's geht
01.07. Preview the new JDBC 4.2 for SQL Server Driver
Für alle Java Entwickler, die mit Azure SQL Database in der Public Cloud arbeiten wollen: JDBC 4.2 für SQL ist da!
01.07. Inside Azure Search: Chaos Engineering
Chaos Engineering in der Praxis - Design fehlertoleranter hoch-verfügbarer Cloud Dienste am Beispiel Azure Search
30.06. The Evolving Role of the Managed Service Provider
Ausführungen zum geänderten Verhältnis zwischen der Unternehmen und Service Providern und der Rolle der Cloud.
30.06. Azure SQL DB Previews Elastic Database Query
SQL Abfragen in einer Connection auf einen DB Pool absetzen mit der Azure SQL DB Elastic Database Query Preview
30.06. Tuesdays with Corey: Nano Coolness with Jeffrey Snover
In dieser Folge dreht sich bei Corey Sanders alles um den Nano Server
29.06. Try the new Azure Authenticator application!
Neue Azure Authenticator App veröffentlicht. Multi-Faktor Authentifizierung für Azure AD und weitere OAuth Dienste
26.06. Microsoft Named a Leader in Gartner’s Public Cloud Storage Services for Second Consecutive Year
Microsoft wiederholt als Leader in Gartners Magic Quadrant für Public Cloud Storage Services eingestuft

Neue Kurse in der MVA

Datum Nachricht
30.06. Building Infrastructure in Azure using Azure Resource Manager
Neuer kostenloser Kurs in der Microsoft Virtual Academy - Azure Umgebungen mit Azure Resource Manager aufbauen

Neue Videos

Datum Nachricht
02.07. Intro to Machine Learning with Seth Juarez
Einführung in Predictive Analytics mit Azure Machine Learning aka AzureML
02.07. What's new with the Azure CDN - June 2015
Neues im Azure CDN - Custom Origins, Multiple CDNs per Origin und flexiblerer Einsatz in Azure Web Apps

Marco Scheel: Links for 2015-07-02 [del.icio.us]

Holger Schwichtenberg: Entity Framework: Setzen des Concurrency Mode für alle Spalten in der EDMX-Datei

Programmcode für ein Werkzeug, das die Concurrency-Mode-Eigenschaft aller Spalten im Entity Data Model auf "Fixed" setzt.

Dmitrij Doberstein: RS485 >>> pySerial and send data

Problem:

I implemented a simple program in python for sending data over RS485 bus. Read data from bus was no problem, but send data over bus was without success.

RS485-configuration: 8N1 half-duplex

Solution:

Some boards resolve RTS over hardware, so you  can write only ser.write('test') for sending data. But it was not in my case. So I had to set RTS programmatically, also:

ser.setRTS(True)
ser.write('test')
ser.setRTS(False)


Sven Hubert: Effiziente Abschätzung der Anforderung: Wall Estimation richtig einsetzen

Jürgen Gutsch: HSTS auf einer Azure Web App erzwingen

Das ist ein Nachtrag zu dem Beitrag HTTPS auf einer Azure Web App erzwingen.

Was ist HSTS?

Bei HSTS (HTTP Strict Transport Security) handelt es sich um eine Technik um einen Browser zu zwingen eine Web-Applikation / Website nur mir HTTPS aufzurufen.

Dabei wird ein weiterer HTTP Header vom Server an den Browser gesendet, der diesen Mitteilt, dass die aktuelle Domain (und ggf. Sub-Domains) für einen bestimmten Zeitraum nur per HTTPS aufgerufen werden soll und nicht per HTTP. Diese Domain wird dann – mit dem entsprechenden Verfallsdatum – in einer List im Browser mitgeführt.

Das heißt, wenn ein User die URL ohne HTTPS eingibt, weiß der Browser dass diese Website immer mit HTTPS aufrufen soll. Das gilt auch für Aufrufe aus den Bookmarks heraus. Das heißt konkret, die angefragte Website muss vom Browser im angegebenen Zeitraum zwingend mit HTTPS aufgerufen werden. Sollte das nicht der Fall sein (durch eine Man-in-the-Middle-Attake) soll der Browser eine Fehlermeldungen anzeigen und es darf nicht auf die Website zugegriffen werden.

Diese Technik wurde bereits Ende 2012 als RFC 6797 vom IETF veröffentlicht. Scheinbar stammen die ersten Ideen dazu sogar schon von 2010, bzw. 2009. Allerdings wurde das Thema leider erst jetzt in den letzten Monaten aktuell und nach und nach in den Browsern verbaut.

Der HSTS-Header könnte wie folgt aussehen:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Mit diesem Header wird der Cache für ein Jahr und für alle Subdomains vorgehalten. “includeSubDomains” macht nur Sinn, wenn tatsächlich alle Sub-Domains per HTTPS aufgerufen werden sollen. Sobald man HSTS aktiviert, sollte man sich also absolut sicher sein, dass man komplett auf das alte HTTP verzichtet. Ist die Domain einmal in der HSTS  Liste der Browser enthalten, kann sie bis zum Ablaufdatum nicht mehr per HTTP aufgerufen werden. Das löschen von Einträgen aus dieser Liste ist nicht möglich.

Was allerdings möglich ist, ist das sog. Preloadig: Das ist ein weiteres Feature von HSTS, dass es den Browsern ermöglicht Domains in die Liste aufzunehmen, die er nicht zuvor besucht hat. Abgesehen davon, dass jeder Browserhersteller selber eine gefüllte Liste mit – aus seiner Sicht – wichtigen Websites mitbringt, kann man über eine spezielle Website die Liste selber mit eigenen Einträgen füllen, ohne dass man die Websites vorher besucht haben muss. Dadurch muss der erste Request nicht über eine unverschlüsselte Verbindung gehen.

Im Moment unterstützen alle neuen Browser HSTS, der IE ab Version 11 ebenso. Microsoft Edge soll HSTS ebenfalls unterstützen. Browser die HSTS nicht unterstützen ignorieren den Header und fahren aber nicht unsicherer als mit bisherigen HTTPS Anfragen.

Wie am eigenen Server einrichten?

Die OWASP nennt eine weitere Variante über ein Open Source IIS Module, die ich nicht getestet habe.

Wie auch im letzten Beitrag zum Thema HTTPS, kann die Einstellung auch in den Rewrite Rules in der Web.Config vorgenommen werden. Das heißt, auch diesmal ist es nicht nur für Azure sondern für alle IIS machbar:

<rewrite>
  <rules>
    <rule name="HTTPS_301_Redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
        <add input="{SERVER_NAME}" matchType="Pattern" pattern="^localhost$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
  <outboundRules>
    <rule name="Add_HSTS_Header" preCondition="USING_HTTPS" patternSyntax="Wildcard">
      <match serverVariable="RESPONSE_Strict-Transport-Security" pattern="*" />
      <action type="Rewrite" value="max-age=31536000" />
    </rule>
    <preConditions>
      <preCondition name="USING_HTTPS">
        <add input="{HTTPS}" pattern="^ON$" />
      </preCondition>
    </preConditions>
  </outboundRules>
</rewrite>

Hier wird wie im letzten Beitrag ein permanentes Redirect auf HTTPS gemacht und in den outboundRules wird der HSTS-Header gesetzt, wenn es sich um eine HTTPS Verbindung handelt.

Die OWASP beschreibt HSTS auf folgender Seite: https://www.owasp.org/index.php/HTTP_Strict_Transport_Security

Fabian Deitelhoff: LEGO Mindstorms EV3: Ferienworkshop bei der VHS Unna

Letzte Woche, genauer gesagt vom 22. Juni bis 26. Juni, fand endlich der verschobene Ferienworkshop bei der VHS Unna statt. Ursprünglich geplant in den Osterferien, musste ich den Kurs leider aufgrund einer Erkältung verschieben. Jetzt konnte er endlich stattfinden und bot, täglich von circa 16:00 Uhr bis 19:15 Uhr, wieder eine Menge Action und Spaß rund um den LEGO Mindstorms EV3.

Wer sich bei der Auflistung und Beschreibung der Tage wundert, warum es nur vier sind: der Donnerstag war nicht eingeplant, da dieser Tag einfach zu sehr mit meinen Vorlesungen an der Fachhochschule Dortmund kollidiert.

LEGO Mindstorms EV3 Ferienworkshop bei der VHS Unna.

LEGO Mindstorms EV3 Ferienworkshop bei der VHS Unna.

Tag 1

Der erste Tag fing etwas langsamer und gemächlicher an. Zwei Teilnehmer haben zunächst ein größeres LEGO EV3 Modell gebaut, das sie in den nächsten Tagen verwenden wollten. Anschießend gab es von mir eine kleine Einführung, die aber tatsächlich sehr knapp ausfiel, da so gut wie alle Teilnehmer schon mal etwas mit dem EV3 gemacht hatten. Als erste Sensoren waren der Infrarot- und der Farbsensor an der Reihe. Letzterer für einen kurzen Test auch schon für eine Linienverfolgung.

Tag 2

Am zweiten Tag nahm die Geschwindigkeit zu. Ich habe zum ersten Mal in einem Kurs eine Vorlage auf DIN A1 für eine Linienverfolgung mitgebracht. Die kam auch gut an und hat viele herausgefordert. :) Zusätzlich sind mir bei den Tests viele Verbesserungen für weitere Vorlagen eingefallen. Im Grunde haben alle fleißig Linienfolger und weitere Ideen gebaut und programmiert. Ich selber konnte eine sehr einfache Version, eine einfache Version mit Mittelwert und einen P-Controller als Linienfolger implementieren und ausprobieren.

Tag 3

Am dritten Tag kam dann die NXT-Vorlage für Linien hinzu. Eine zweite Vorlage, die ich zum Druckdienstleister gegeben hatte, war leider noch noch nicht fertig. Jetzt konnte ich auch endlich einmal einen PID-Controller für die Linienverfolgung implementieren und testen. Auch alle anderen haben fleißig weitere Programme geschrieben. Besonders der Infrarot- und der Ultraschallsensor kamen viel zum Einsatz, um Wände und andere Hindernisse zu entdecken und rechtzeitig auszuweichen.

DIN A1 - Einfacher Rundkurs für einen EV3 Linienfolger.

DIN A1 – Einfacher Rundkurs für einen EV3 Linienfolger.

Auch der Geräuschsensor des NXT, den ein Teilnehmer mitgebracht hatte, konnte erfolgreich am EV3 getestet werden. Nebenbei konnte ich auch kurz Mono.Brick testen, was ebenfalls ohne Probleme funktionierte.

Tag 4

Am vierten und letzten Tag haben wir versucht die zweite Vorlage, die ich mitgebracht hatte, zu nutzen. Allerdings waren die Linien darauf etwas zu schmal beziehungsweise die Kurven einfach nicht groß genug. Alle Modelle hatten an bestimmten Stellen Probleme. Auch der PID-Controller hatte keine Chance. Eine weitere Möglichkeit wäre, den Farbsensor näher an die Achsen zu platzieren. Allerdings muss ich trotzdem die Vorlage etwas überarbeiten. In diesem Fall war sie DIN A0, was allerdings eine sehr gute Größe ist, weil sie viel Platz für weitere Ideen bietet. Nur der Rundkurs in Form einer schwarzen Linie muss etwas anders aussehen.

Um den Farbsensor noch etwas weiter auszutesten, wurden Roboter konstruiert, die nicht vom Tisch fallen durften, in dem sie das Ende des Tisches erkennen konnten.

Fazit

Ich hoffe, es hat allen viel Spaß bereitet. So wie ich das mitbekommen habe, was das wohl der Fall. Mir hat es, wie immer, absolut viel Spaß gemacht. Die Teilnehmer waren sehr gut drauf und haben wunderbar mitgemacht. Auch an eigenen Ideen hat es nicht gemangelt. Ganz im Gegenteil. Ich habe noch nie eine Gruppe erlebt, die so lebendig dabei war und eigene Ideen eingebracht und auch umgesetzt hat. Vielen Dank dafür an alle!

Die nächsten Kursen sind im September in Dortmund und im Oktober wieder in Unna.

codefest.at [MS]: Visual Studio 2015: Onlineevent zum Release

Save the date

Am 20. Juli um 17 Uhr 30 ist es soweit – wir feiern die Verfügbarkeit von Visual Studio 2015!

Um einen Einblick in die finale Version zu bekommen veranstalten wir einen Onlineevent der die neuen Funktionen, erweiterten Möglichkeiten und die neu gestaltete Produktfamilie vorstellt.

In Visual Studio 2015 hat sich viel getan:

  • Visual Studio 2015 ist die Entwicklungsumgebung für Windows 10 und Windows 10 Universal Apps
  • das neue Visual Studio 2015 Enterprise mit MSDN für Entwickler in Unternehmen (alle bisherigen aktiven Visual Studio Premium mit MSDN und Ultimate mit MSDN Benutzer können auf diese Edition kostenlos umsteigen)
  • Mobile x-Plattform Entwicklung neu definiert (nativ & Web)
  • Umsetzung von IoT Szenarien
  • Wir lieben Web-Entwickler (nutzen Sie Visual Studio wie Sie sind – mit Ihren Werkzeugen & Frameworks)
  • Entwicklung von Cloud-Apps
  • neues plattformübergreifendes Build-System (Visual Studio Online, Team Foundation Server 2015)
  • Application Insights (gewinnen Sie mehr Einblick in Ihre Applikationen) & IntelliTest (Unit-Tests automatisiert erstellen)
  • .. und vieles mehr

Sven Hubert: Das neue Azure Portal

Marco Scheel: Links for 2015-06-29 [del.icio.us]

Jürgen Gutsch: HTTP Sniffer Part 6: Der komplette Sniffer in der Übersicht

Inhalt

Der Sniffer in der Übersicht:

Folgende CodeMap zeigt die Abhängigkeiten der wichtigsten Komponenten:

Classes

Hier ist zu sehen, wie eine Komponente nach der anderen abgearbeitet wird. Die Komponenten rufen sich nacheinander auf. Den ganzen Weg über wird der ClientStream – der NetworkStream zwischen Browser und unserem Proxy – von einer Komponente zur nächsten mitgegeben, damit die letzte im der Kette die Daten vom RemoteStream – der NetworkStream zwischen Proxy und entfernten Server – direkt an den Browser gesendet werden können.

Folgendes Flussdiagram veranschaulicht die einfache Kommunikation im Falle einer HTTP-Verbindung:

HTTP

Wie bereits im letzten Teil beschrieben ist die Kommunikation im Falle einer HTTPS Verbindung etwas komplexer. Wir müssen zuerst eine saubere HTTPS-Verbindung mit dem Client aufbauen, damit es auf dem Browser nicht zu unschönen Meldungen kommt, außerdem verlangt der Browser nach einer sicheren Verbindung. Anschließend müssen die Antworten auch wieder verschlüsselt an den Client übertragen werden. Dafür müssen die entsprechenden Zertifikate erstellt und registriert werden:

 

HTTPS

Es ist nicht viel Code, der für einen einfachen Proxy wie diesen nötig ist. Allerdings enthält er außer Logging noch keine weiteren Funktionen, sondern gibt die Daten direkt weiter.

Um eine wirkungsvolle Kinderschutzsoftware mit diesem Proxy zu generieren, müssen einige konfigurierbare Filter implementiert werden, wie z. B: URL-Filter, Schlagwortfilter, eventuell Bilder- und Video-Filter.

Neue Standards wie HTTP/2, dessen Neuerungen, sowie HSTS sind ebenfalls noch nicht berücksichtigt. Ich kann mit vorstellen, das HTTP/2 und HSTS genau solche Szenarien erschweren soll. Dieser Proxy muss nun also noch kompatibel zu den neuen Standards gemacht werden.

Wer in den aktuelle Code schauen möchte kann das nun endlich unter https://github.com/JuergenGutsch/async-proxy tun. Der Proxy ist unter MIT Lizenz gestellt. Wer möchte darf sich an der Weiterentwicklung beteiligen. Ich freue mich über jeden PullRequest :) Das Ziel soll sein, eine freie Kinderschutzsoftware und/oder einen Sniffer für Entwicklungszwecke wie eben Fiddler zu erstellen.

Johnny Graber: MEAP: Wenn es einmal ganz lange dauert

MEAP - Manning Early Access Program

MEAP - Manning Early Access Program

Seit rund 6 Jahren bin ich ein regelmässiger Kunde des Early Access Program von Manning (kurz MEAP). Mit dieses Programm kann man Bücher lesen die noch in der Entstehung sind. Was komisch tönt macht gerade bei neuen Technologien Sinn, da es dort oft an guter Dokumentation fehlt. Wie einfach man bei diesem Programm mitmachen kann hatte ich schon hier beschrieben.

Unfertige Bücher können auch einmal nicht erscheinen. Dies trat bei mir bisher nur bei einer Bestellung ein und wurde durch Manning vorbildlich gelöst.

 

Gute Dinge brauchen Zeit

Seit heute kann ich nun über ein weiteres Kapitel berichten. Es kann durchaus vorkommen, dass ein Buch erst mit einigen Jahren Verspätung erscheint. So erhielt ich heute die gedruckte Ausgabe von „Groovy in Action, Second Edition“. Dies wäre nicht der Rede wert, wenn ich mich noch an die Bestellung erinnern könnte. Ein Blick ins Mailarchiv lieferte mir als Bestelldatum den 29. Dezember 2009.

Von der Bestellung bis zur Auslieferung sind demnach ganze 5.5 Jahre vergangen. In dieser Zeit konnte ich dank der elektronischen Formate (PDF und Mobi) zahlreiche Versionen lesen. Dass der Weg zum fertigen Buch noch so lange sein wird hätte ich mir 2009 allerdings nicht vorstellen können.

 

Fazit

Solch lange Wartezeiten hatte ich bisher noch nie erlebt. Trotz dieser neuen Erfahrung finde ich MEAP noch immer eine gute Idee. Der Vorteil dieser Programme liegt allerdings klar im Bereich der elektronischen Formate und weniger bei den gedruckten Ausgaben.

Wenn neue Versionen automatisch an den eigenen Kindle übertragen werden, hat man immer die neuste Version zur Hand und kann mit dieser Arbeiten, ganz unabhängig davon wann das Buch schlussendlich gedruckt wird.


Einsortiert unter:Bücher Tagged: .Net, Bücher, Java, Lernen

codefest.at [MS]: Kostenkontrolle mit Azure Billing API (Preview)

Ganz neu und frisch gibt es seit wenigen Tagen eine Azure Billing API. Enterprise Agreement Kunden haben ja eine eigene Verwaltung ihrer Subscriptions im Microsoft Azure - EA Portal und eine eigne Schnittstelle. Alle anderen Azure Subscriptions und deren Verwendung und die angefallenen Kosten können nun seit kurzem mit der neuen Azure Billing API (Preview) abgefragt werden.

Wozu?

Das ist besonders für kleine Unternehmen sinnvoll, die kein Azure EA besitzen, aber dennoch mehrere Azure Subscriptions verwenden. So werden etwa oft mehrere eigene Unternehmens-MSDN Abos von unterschiedlichen Mitarbeitern verwendet, da macht es Sinn die “usage” und das “billing” automatisiert (oder in weiterer Folge gesammelt) abzufragen.

Code-Beispiele

Auf GitHub gibt es bereits drei Code Samples von Bryan Lamos dafür, nämlich die ConsoleApp-Billing-Usage, die ConsoleApp-Billing-RateCard und WebApp-Billing-MultiTenant: https://github.com/Azure/BillingCodeSamples

image

Hier die Beschreibung der Code Samples von GitHub:

Microsoft liefert die Daten über die Verwendung über den Provider "providers/Microsoft.Commerce/UsageAggregates" und die Kostendaten über den Provider "providers/Microsoft.Commerce/RateCard" (siehe auch unten) – daher auch die Benennung der Beispiele nach diesen Endpunkten mit “Usage” und “RateCard”.

Start mit Authentifizierung

Ich habe zunächst einmal das Beispiel ConsoleApp-Billing-Usage angesehen. Hier müssen natürlich zuerst die eigenen Daten und die Berechtigungen gesetzt werden. Das erste Compile lädt die erforderlichen NuGet Packages nach und wirft gleich einen Fehler mit dem Hinweis im Code, dass die AppSettings korrekt eingetragen werden müssen:

#error Please update the appSettings section in app.config, then remove this statement

Danke für den Hinweis, also die Zeile im Code entfernen, die Settings wollte ich soundso gerade anpassen…

image

Das Sample verwendet natürlich die ADAL Bibliotheken zur Authentifizierung mit OAuth und benötigt ein AD (TenantDomain), eine native App (ClientID) darin und eine Azure Subscription ID (SubscriptionID). Das Gute dabei ist, dass eine App in einem beliebigen AD ausreicht, um mehrere Azure Subscriptions abzufragen (natürlich muss das verwendete Konto darin berechtigt, sprich zB. Co-Admin, sein).
Die Anleitung zur Inbetriebnahme ist übrigens auf GitHub im Sample zu finden.

Um es kurz zu machen, so funktionierts: Im Azure Portal werden aus den “Settings” die SubscriptionID und das Default-Directory benötigt. In diesem Beispiel wird die Subscription mit dem AD “mvpdemo2014.onmicrosoft.com” verwaltet.

image

In diesem AD (mvpdemo2014*…) wird eine neue “native” App angelegt. Wichtig hierbei ist, dass die “ADALRedirectURL” wie im Code-Beispiel in den AppSettings verwendet wird. Bei uns lautet sie “https://localhost/”.

SNAGHTMLd1f583

Zum Abschluss sind noch die erforderlichen Permissions für die App zu setzen, wie hier - alles auf einen Blick:

SNAGHTMLd4145b

Diese Daten werden nun in die AppSettings eingetragen (hier nur der Beginn der IDs… bitte die eigenen verwenden).

image

Das war die Konfiguration. Nun geht es mit dem Programm weiter.

Die Abfrage der Daten

Die Abfrage erfolgt durch den REST Endpoint und Parameter. Für die “Usage” sieht das beispielsweise wie folgt aus:

https://management.azure.com/subscriptions/<SubscriptionID>/providers/Microsoft.Commerce/UsageAggregates?api-version=2015-06-01-preview&reportedstartTime=2015-03-01+00%3a00%3a00Z&reportedEndTime=2015-05-18+00%3a00%3a00Z

Eine Liste der Parameter und der Bedeutung für Usage sind in der API Documentation zu finden:
Get price and metadata information for resources used in an Azure subscription

Wenn man das Sample ConsoleApp-Billing-RateCard ansieht (und ev. gleich in das Usage-Sample integriert), sieht man, dass es nach demselben Prinzip funktioniert. Hier wollen wir die Daten einer MSDN-Subscription in Euro und mit deutschen Bezeichnungen:

https://management.azure.com/subscriptions/<SubscriptionID>/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId eq 'MS-AZR-0061P' and Currency eq 'EUR' and Locale eq 'de-DE' and RegionInfo eq 'DE'

Die Namen der Subscription (hier: MS-AZR-0061P) sind in Microsoft Azure Offer Details ersichtlich.

SNAGHTMLf70e46

Eine Liste der Parameter und der Bedeutung für die RateCard sind in der API Documentation zu finden:
Resource RateCard (Preview)

Das bedeutet ggf. die Parameter nach eigenen Erfordernissen anpassen.

Los gehts

Wenn nun die App mit F5 gestartet wird, folgt zunächst eine SignIn-Box. Hier mit einem berechtigten Azure-Konto und der App “azurebillingdemo” (unserer native App im AD) anmelden.

image

Beim ersten Start müssen noch die App-Berechtigungen (Consent) erteilt werden:

image

Die Daten

Wenns lauft, dann laufts. So sieht dann etwa die “usageResponse” im JSON Format aus. Sie zeigt mehrere Values mit ihren verschiedenen properties – eben die verwendete Benutzung einzelner Cloud-Dienste.

image

Genauso sieht es mit den Kostendaten “rateCardResponse” aus:

image

Diese Daten gehören dann wohl in eine Datenbank oder in meinem Beispiel zu mindestens in eine CSV-Datei zur Weiterverarbeitung geschrieben. Man sieht aber bereits, was hier geliefert wird.

Jede “Usage”-Zeile besitzt eine “MeterId”, das ist eine GUID, etwa wie hier (teilweise):

image

Diese findet sich auch in der “RateCard” wieder.

image

In diesem Beispiel wären also die Kosten für “0.016129” mal “DB Units” genau “7.439 Euro” im Zeitraum zwischen usageStartTime und usageEndTime. Und so weiter.

Die Felder und deren Bedeutung sind in Get price and metadata information for resources used in an Azure subscription im Teil “JSON Element Definitions” dokumentiert:

image

Das Schöne an der neuen Azure Billing API: Die Abfragen funktionieren sehr schnell (ganz im Gegensatz zum elendslangsamen manuellen Herunterladen dieser Rechnungsdaten im Azure Billing Portal).

Mein derzeitiges Handicap: Ich habe es noch nicht geschafft, hier dieselben Daten, sprich dieselben Kosten, zu erhalten, die ich auch im Azure-Billing Portal angezeigt bekomme. Bei der Fülle an Daten ist das auch recht aufwändig und ich werde hier noch etwas Energie investieren müssen. Oder es liegt an der Preview. Oder an meinem Verständnis der Rechnungen. Das wird also noch etwas dauern.

Aber, wie heißt es so schön: You get the idea. Zwinkerndes Smiley

Mehr

Es gibt auch bereits fertige Produkte, welche diese (Preview) APIs nutzen: Cloudyn und Cloud Cruiser. Die sehen bereits recht vielversprechend aus, diese möchte ich mir auch noch näher ansehen.

Danke an Oliver Michalski für den API-Tipp im Azure Community Deutschland Blog!

Ich denke, die Azure Billing API wird Anwendern und Unternehmen sehr helfen die lästigen manuelle Tätigkeiten im Azure Portal durch ein nettes kleines Tool und entsprechende Auswertung dazu zu ersetzen. Endlich gibt es eine Azure Billing API – wenn auch noch in Preview!

Viel Spaß beim Ausprobieren!

Johannes Renatus: HTML5 Drag And Drop Direktive mit AngularJs und TypeScript

Mit Drag und Drop hatte ich bisher nicht viel zu tun, aber glücklicherweise gibt es immer ein erstes mal. Ich habe im Netz auch die ein oder andere Drag and Drop Implementierung, auch für AngularJs gefunden, aber keine die meine Bedürfnisse so richtig erfüllt hat. Außerdem hat mich die Thematik auch selbst brennend interessiert. Denn […]

Kazim Bahar: User Interfaces – Zukunftsvisionen (2)

Wie werden wohl Benutzeroberflächen künftig aussehen? Die folgenden Videos geben eindrucksvolle Beispiele von möglichen User Interfaces von morgen wieder....

Christian Binder [MS]: ALM Days 2016 – Deine Themen?

Der Sommer bringt uns den TFS 2015, der aus meiner Sicht wirkliche viele Bereiche signifikant erweitert und so die Engineering Plattform vor allem viel offener und erweiterbarer gestaltet. Ein weiterer Schritt zu einer Engineering Plattform, die auch Heterogene Teams optimal unterstützt, um den DevOps LifeCycle zu realisieren. Auf den ALM Days 2015 hatten wir Anfang des Jahres schon mal einen ersten Ausblick gegeben (Videos) und seitdem hat sich auch noch einiges getan – siehe Feature Timeline. Für die ALM Days 2016 habe ich mir daher schon die ersten Gedanken zum Design gemacht und wie immer interessiert mich, welche Themen für Euch besonders wichtig sind. Wer also ein Thema hat, dass er besonders spanned findet, kann mir gerne hier seine Idee zukommen lassen. Den Termin werden wir sobald er fixiert ist bekannt geben. Für alle Sommerurlauber wie mich, wünsche ich gutes Wetter Smile 

Chris

Holger Sirtl: Azure News on Friday (KW26/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Microsoft Azure Plattform. Hier sind nähere Infos dazu…

Aktuelle Neuigkeiten

Datum Nachricht
25.06. Azure AD Conditional Access preview update: More apps and blocking access for users not at work
Neue Möglichkeiten für bedingte Zugriffe auf unternehmensweit verwaltete Apps via Azure Active Directory
25.06. Getting Started with Logic App Templates
Mit vorgefertigten Vorlagen schnell Business-Workflows mit Azure Logic Apps umsetzen.
25.06. New troubleshooting SSH connections
Schritt-für-Schritt Anleitung zur Problemlösung von SSH-Verbindungen zu Linux basierten Azure Virtual Machines
25.06. Announcing the 1.0.0 release of Application Insights Windows SDKs
Das erste Release (v1.0.0) des Windows SDK für Application Insights ist verfügbar.
25.06. New Azure Billing APIs Available
Jetzt endlich den aktuellen Verbrauch an Azure Ressourcen messen mit der Usage API (Teil der neuen Billing API)
24.06. Updated Azure SQL Database Elastic Database Pool Minimum Size
Die Minimalgröße eines Azure SQL Database Elastic Pools wurde auf 100 eDTU abgesenkt (zuvor 200 eDTU)
24.06. Azure AD Connect & Connect Health is now GA!
Spielend AD Federation mit Azure AD einrichten und lokale ADs überwachen: Azure AD Connect und Connect Health sind GA
24.06. New preview + 21 new partners announced for Azure SQL Data Warehouse
Vorstellung von 21 Partnern, die Azure SQL Data Warehouse nutzen.
24.06. Azure SQL Data Warehouse opens for Limited Public Preview
Das zur BUILD 2015 angekündigte Azure SQL Data Warehouse ist jetzt als Limited Public Preview verfügbar
23.06. Logic Apps Live Community Webcast – June 25
Gelegenheit, mit den Machern des Azure App Service zu sprechen: Community Webcast am 25. Juni
23.06. Container Apps now available in the Azure Marketplace
Neu im Azure Marketplace: Docker Apps - einfaches Setup via Docker Extensions und Azure Resource Manager
23.06. Tuesdays with Corey: Docker Con keynote goodness
Corey Sanders fasst die Announcements der DockerCon und den aktuellen Stand zu Docker auf Azure zusammen.
23.06. Docker and Microsoft announce more innovation to cross platforms and win hearts
Viele weitere Ankündigungen zu Docker auf der Microsoft Plattform.
19.06. Azure Redis Cache Updates for June 2015
Tolle Neuerungen im Azure Redis Cache - Änderungen der Cache-Größe zur Laufzeit und Infos zur Speicherbelegung
19.06. Azure News on Friday (KW25/15)
Was gab's letzte Woche Neues zu Microsoft Azure ? Hier gibt's eine Zusammenfassung (News, Videos, etc.)

Neue Videos

Datum Nachricht
25.06. Treating the Azure CLI as a Docker Container to speed development
Azure Friday: Installation der Azure CLI (Cross-Platform Command Line Interfaces) in einen Docker Container
25.06. Managing Large amounts of Data Throughput using Azure Event Hubs with Nicole Berdy
Azure Friday: Effiziente Verarbeitung auch größter eingehender Datenmengen mit Azure Event Hub

Sven Hubert: A brief description of the new features in WordToTFS 4.5

Jürgen Gutsch: ASP.NET 5 Console Application

Der Titel ist interessant, nicht war? Was zum Geier ist eine ASP.NET 5 Console Application?

Der Name ist genauso irreführend, wie das Thema interessant ist. Lange war mit nicht klar, was dieser neue Projekttyp überhaupt sein sollte.

Eine in der Console gehostete ASP.NET 5 Applikation ist es definitiv nicht, mit ASP.NET hat dieser Projekttyp ebenfalls wenig zu tun.

Genau gesagt, handelt es sich um eine einfache Console Application die mit .NET Core läuft und dabei auch die Vorteile der neuen .NET Core Projekte beinhaltet:

  • .NET Core
  • CoreCLR
  • project.json
  • .NET Utilities (dnx)

Gebrauchen kann man diese Art der Console Application natürlich ebenso unter Linux und MacOS, aber natürlich am besten auf IoT-Geräten, sowie für Aufgaben ohne UI z. B. in Docker Containern.

Gestartet werden diese Console Applications wie ASP.NET 5 webs:

[code language="JScript"]> dnvm install latest
> dnu restore
> dnx . ConsoleApp1[/code]

Das dnx Command muss natürlich in der project.json deviniert sein:

"commands": {
  "ConsoleApp1" : "ConsoleApp1 a b c d e f"
},

In meinem kleinen Test-Projekt habe ich die Argumente “a b c d e f” angehängt die ich dann entsprechend ausgebe:

public void Main(string[] args)
{
    Console.WriteLine("{0} - {1} - {2} - {3} - {4} - {5}", args);
    Console.ReadKey();
}

image

Für kommende Spielereien mit meinem Raspberry PI wird dieser Projekttyp nun die erste Wahl sein.

Sven Hubert: DWX 2015 – Developer Week in Nürnberg – Nachlese

André Krämer: Video zum Windows 10 Developer Readiness Screencast auf Channel 9 online

Am 8. Juni hatte ich die Freude gemeinsam mit meinen MVP Kollegen Thomas Mutzl und Christian Nagel einen Screencast über die Entwicklung für Windows 10 / die Universal Windows Plattform durchzuführen. Im Rahmen einer weltweiten MVP Initiative berichteten wir in gut 2,5 h darüber, welche Idee hinter der Windows Universal Plattform steckt, welche Änderungen es für XAML Entwickler geben wird und wie ich meine App darauf vorbereiten kann, auf mehreren Endgerätetypen zu laufen.

Seit kurzem ist die Aufnahme des Screencasts nun auf Channel 9 online. Wer also keine Gelegenheit hatte, den Vortrag live zu verfolgen, kann sich nun bequem die Aufnahme ansehen.

Ich selbst habe über das Thema Adaptive UI und Adaptive Code gesprochen. Dieser Teil startet bei ca. 1:42 h. Den Demo Code werde ich in Kürze auf GitHub veröffentlichen.

Und nun: Viel Spaß beim Ansehen!

Dmitrij Doberstein: VMware Player >>> serial port configuration

Start VMware Player

1) select the target OS 
2) click on 'Edit virtual machine settings' on right side

3) click on 'Add...' button

4) select 'Serial Port' 
5) 'Next'

6) select 'Use physical serial port on the host' 
7) 'Next' 

8) select 'Auto detect' or a specific COM port
Note that to communicate with the VM through this serial port, you will have to connect another machine to the physical serial port (COM1 in this case) using a null modem cable. You cannot just run minicom on that same machine and connect to /dev/ttyS0
9) 'Finish' 

10) 'OK' 

11) and now 'Play virtual machine'

 More useful and detailed information can find here:



Sven Hubert: Visual Studio Info Day in Karlsruhe – Was gibt’s Neues in Visual Studio und im Team Foundation Server 2015?

Dmitrij Doberstein: Ubuntu 14.04 >>> Problem Web + Python + PySerial

Environment:

VMware Player 7
Ubuntu 14.04
Lighttpd
Python
PySerial


If I ´m trying to open ttyS0 so i become error [Errno 13] Permission denied: '/dev/ttyS0'

To solve this problem check next:

  • is the user in dialout group?


>>> cat /etc/group | grep dialout


  • if the user not in dialout group, so add them:

>>> usermod -a -G dialout root
>>> usermod -a -G dialout userXXX
>>> usermod -a -G dialout www-data


  • add rw-persmission to ttyS0

>>> chmod 666 /dev/ttyS0





Sven Hubert: Cloud-Dienste für verteilte Entwicklungsteams

Sven Hubert: Zugriff von externen Mitarbeitern auf VSO Taskboards

Code-Inside Blog: FAKE: Create NuGet Packages without knowing a tiny bit of F#

This is a follow-up to my first two FAKE posts:

Creating NuGet Packages - with a NuSpec

FAKE has at least two approaches to build NuGet Packages. The first approach is that you define a NuSpec-Template and fill the missing pieces during the build via FAKE. This scenario is covered here. The second on is “simpler”, at least for me (but… you know… I have no idea how to write real F# code): You just need to manage your .nuspec manually. Currently I use this approach, because I can handle everything inside the .nuspec files and can still use FAKE for the build process.

Project Overview

The sample project consists of one class library project and the .fsx file.

x

The .nuspec content:

<?xml version="1.0"?>
<package >
	<metadata>
    <id>Test.Foobar</id>
    <version>2.0.0</version>
    <title>Test Foobar</title>
    <authors>Code Inside Team</authors>
    <owners>Code Inside Team</owners>
    <licenseUrl>http://blog.codeinside.eu</licenseUrl>
    <projectUrl>http://blog.codeinside.eu</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Hello World</description>
    <releaseNotes>
    </releaseNotes>
    <copyright>Copyright 2015</copyright>
    <tags></tags>
  </metadata>
  <files>
    <file src="CreateNuGetViaFake.dll" target="lib\net45" />
  </files>
</package>

Important here are the required NuSpec meta fields and the files section. If you are not familiar with the .nuspec syntax, take a look at the reference.

The FAKE script

Now to the FAKE script. At the end of the post you will see a link to the complete script, but I will highlight the “important” parts:

Building the library

...
let artifactsBuildDir = "./artifacts/build/"
...

Target "BuildApp" (fun _ ->
   trace "Building App..."
   !! "**/*.csproj"
     |> MSBuildRelease artifactsBuildDir "Build"
     |> Log "AppBuild-Output: "
)

Nothing special - we just build the library and the output will be stored in our artifacts/build folder.

Building the NuGet package - with the correct version

...
let artifactsNuGetDir = @"./artifacts/nuget/"
let artifactsBuildDir = "./artifacts/build/"
...

Target "BuildNuGet" (fun _ ->
   
    let doc = System.Xml.Linq.XDocument.Load("./CreateNuGetViaFake/Test.nuspec")
    let vers = doc.Descendants(XName.Get("version", doc.Root.Name.NamespaceName)) 

    NuGet (fun p -> 
    {p with
        Version = (Seq.head vers).Value
        OutputPath = artifactsNuGetDir
        WorkingDir = artifactsBuildDir
        })  "./CreateNuGetViaFake/Test.nuspec"
)

The built-in NuGetHelper will invoke nuget.exe with the given nuspec. We set the WorkingDir to the output of the other target and set the OutputPath to another location. The version handling is a bit complicated, because of this issue. The default Version is 1.0.0 and FAKE will currently ignore the Version-Information inside the .nuspec. The workaround is: Parse the .nuspec and get the version number and pass it to the NuGetHelper. Easy, right?

Make sure you include System.Xml.Linq

To get things running you will need to reference System.Xml.Linq like this:

// include Fake lib
#r "packages/FAKE/tools/FakeLib.dll"
#r "System.Xml.Linq"
open Fake
open System.Xml.Linq

RestorePackages()

The result: Our NuGet Package

x

Discover the NuGetHelper or Paket for more options

The NuGetHelper from FAKE has some pretty nice functionality built-in, for example you can publish to NuGet.org with a given access key.

For a more complete solution around consuming and creating NuGet Packages take a look at Paket.

For my simple use cases FAKE was “good enough” and I hope this might help.

You can find the complete sample & build script on GitHub.

Jürgen Gutsch: HTTP Sniffer Part 5: SSL ent- und verschlüsseln

Inhalt

Generell

In diesem Teil geht es um das ent- und verschlüsseln der zuletzt beschriebenen Streams in Falle einer SSL Verbindung.

Dieser Teil ist der kritischste Teil dieser Serie, im Sinne von “ich bin mir nicht sicher, ob ich das veröffentlichen soll, oder nicht.” Einerseits ist dieses Vorgehen sicherheitstechnisch nicht ganz ohne, allerdings ein bekanntes Verfahren das auch von Fiddler verwendet wird.

Was meine ich?

Wenn der Sniffer in einer eingehenden Anfrage erkennt, dass es sich um HTTPS Verbindung handelt (HTTP Verb “CONNECT”) dann muss der Proxy auch ein passendes Zertifikat bereitstellen.

Die Remote-Verbindung dagegen ist einfach, denn hier ist der Sniffer ein Client, der sich wie ein Browser verhält und die Daten anhand des öffentlichen Schlüssels wieder entschlüsseln kann.

Für die Client-Verbindung muss der Sniffer ein Zertifikat bereitstellen das auch noch vertrauenswürdig ist, um die Benutzer nicht mit Meldungen und Hinweisen des Browsers zu verunsichern. Der Sniffer erstellt also on-the-fly bei jedem HTTPS Request ein – für den angefragten Remote-Host – passendes SSL Zertifikat. Getrustet wird dieses Zertifikat mit einem Root-Zertifikat, das auf dem System im Certificate Store abgelegt wird.

Die Installation des Root-Zertifikats benötigt – zum Glück – Admin-Rechte.
Wehe dem, der UAC abgestellt hat.

Auf diese Art haben wir keine SSL Fehler im Browser, haben uns aber zwischen den Client und den Remote-Server gesetzt und die HTTPS Verbindung unterbrochen um mit zu lesen.

Wie sieht das aus?

Sobald wir nun eine CONECT Anfrage erhalten, Antworten wir dem Client und sagen ihm das alles in bester Ordnung ist:

var connectStreamWriter = new StreamWriter(state.ClientStream);
connectStreamWriter.WriteLine("HTTP/1.0 200 Connection established");
connectStreamWriter.WriteLine("Timestamp: {0}", DateTime.Now);
connectStreamWriter.WriteLine("Proxy-agent: GOS Proxy Service");
connectStreamWriter.WriteLine();
connectStreamWriter.Flush();

Ist die Antwort abgeschickt, kann der ClientStream in einen SslStream gesteckt werden (der Einfachheit halber wieder ohne Fehlerbehandlung und Logging):

var sslStream = new SslStream(state.ClientStream, false);
var certProvider = new CertificateProvider();

bool created;
var certificate = certProvider.LoadOrCreateCertificate(state.RemoteHost, out created);
sslStream.AuthenticateAsServer(certificate, false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true);

var nstate = new ClientConnectionState
{
    Session = state.Session,
    Client = state.Client,
    ClientStream = sslStream,
    ClientStreamBase = (NetworkStream)state.ClientStream,
    Buffer = new byte[Globals.BufferSize],
    MessageStream = new MemoryStream(),
    IsSsl = true,
};

sslStream.BeginRead(nstate.Buffer, 0, nstate.Buffer.Length, ReadFromClient.Run, nstate);

Der SslStream kann nun benutzt werden um Anfragen entschlüsselt zu lesen und Antworten zu schreiben und zu verschlüsseln. Der ClientStream kann nun nicht mehr direkt gelesen und geschrieben werden, sondern eben nur noch über diesen SslStream. Also, alles was wir schreiben wird verschlüsselt an den Client übertragen und alles was wir vom Client lesen wird vorher entschlüsselt.

Ab jetzt beginnt der Prozess wieder beim anfänglichen einlesen des ClientStreams, denn der nächste Request des Clients wird mit den Standard-Verben (GET, POST, etc.) beginnen. In dem neuen ClientConnectionState wird nun der SslStream als ClientStream weitergeführt (siehe HTTP Sniffer Part 4: Streams optimal verarbeiten).

Die Zertifikate

Die Zertifikate werden über eine Hilfsklasse namens CertificateProvider erstellt. Diese wiederum nutzt die MakeCert.exe – die ins Ausführungsverzeichnis gelegt wird – um die nötigen Zertifikate in einem separaten Prozess zu erstellen und im Certificate Store des Systems abzulegen oder um diese dort auszulesen und für die SslStreams zurückzugeben.

Schaut euch dafür am besten den Code direkt auf GitHub an.

Die Remote-Seite

Für die Anfrage an den Server, wird ebenfalls ein SslStream benutzt, wenn es sich um eine HTTPS-Anfrage handelt, allerdings ist die Behandlung wesentlich einfacher, da wir keine Zertifikate explizit behandeln müssen. Die Methode AuthenticateAsClient übernimmt fas für uns und entschlüsselt den Stream mit dem öffentlichen Schlüssel.

var remoteStreamBase = state.RemoteClient.GetStream();
Stream remoteStream = remoteStreamBase;

if (state.IsSsl)
{
    var sslStream = new SslStream(remoteStream, false);
    sslStream.AuthenticateAsClient(state.RemoteHost);

    remoteStream = sslStream;
}

Nun wird der remoteStream genutzt, um wie gewohnt mit dem Stream zu senden und zu empfangen.

Im nächsten Teil sehen wir wie der Prozess als ganzes aufgebaut ist.

Jürgen Gutsch: HTTP Sniffer Part 4: Streams optimal verarbeiten

Inhalt

Generell

Im letzten Teil hatte ich den Zugriff auf den Stream, der vom TcpClient geliefert wird, kurz gezeigt: Wir lesen immer einen Teil des Streams aus und verarbeiten diesen Teil. Nach der Verarbeitung geben wir diesen Teil umgehend weiter an den nächsten Stream.

Diese Verarbeitung von Stream macht IMHO nur bei großen Dateien/Datenmengen Sinn. Kleine Dateien und Streams müssen so nicht behandelt werden. Der Aufwand lohnt nicht. Allerdings wissen wir in diesem Projekt nicht, wie groß die Daten im Stream sein wird.

In diesem Projekt erfolgt das auf die alten Methoden BeginRead und EndRead, die allerdings unheimlich flexibel sind und mit denen ich modular und sogar funktional arbeiten kann.

Was ich Web-Umfeld häufig machen musste, ist das lesen von großen Dateien (z. B: aus einem Azure Blob Storage und das weitergeben an den Client über den OutputStream im Repsonse Objekt). In diesem Fall bekommen wir einen Stream (von Azure-Client) und müssen diesen in den OutputStream “schreiben”. Um das ganze, bei sehr großen Dateien speicherschonend und performant zu halten müssen wir den Quell-Stream stückweise auslesen und ebenso stückweise in den Ziel-Stream schreiben. Dadurch halten wir nur dieses Teilstücks des Streams im Speicher. Die Herausforderung hier ist die Balance zwischen der Grüße des Teilstücks (Speichernutzung) und Schleifendurchläufe (Prozessornutzung).

Unter ASP.NET MVC ist der FileStreamResult eine einfache Möglichkeit einen gegebenen Stream auszuliefern. Allerdings habe ich den noch nicht mit sehr großen Dateien (500MB und mehr) ausprobiert. Interessant wäre zu wissen, ob hiermit wirklich stetig ausgeliefert wird, oder ob der Stream doch als ganzes auf einem mal ausgeliefert wird. Letzteres wäre nicht sehr speicherschonend. Bei kleinen Dateien macht das auf alle Fälle Sinn

Ein einfacher Kopiervorgang eines eingehenden Streams in einen Verschlüsselten ausgehenden Stream könnte wie folgt aussehen:

private const int _bufferSize = 20* 1024;

// …

var cryptoStream = new CryptoStream(outputStream, algorythm.CreateEncryptor(algorythm.Key, algorythm.IV), CryptoStreamMode.Write);
var bytes = new byte[_bufferSize];

var read = inputStream.Read(bytes, 0, _bufferSize);
while (read == _bufferSize)
{
    cryptoStream.Write(bytes, 0, read);
    cryptoStream.Flush();
    read = inputStream.Read(bytes, 0, _bufferSize);
}
cryptoStream.Write(bytes, 0, read);
cryptoStream.FlushFinalBlock();

// …

Hier handelt es sich konkret um das verschlüsselte Ablegen einer Datei.

In unserem Fall mit dem Sniffer, ist diese Schleife allerdings nicht so einfach und schön zu nutzen. Es würde schnell sehr komplexer und unschöner Code entstehen. Daher habe ich die Variante mit BeginRead und EndRead gewählt, die zudem noch Asynchron läuft.

Stream.BeginRead

Analog zu der Methode Write, die man im obigen Code-Beispiel sieht, wird bei BeginRead eben falls ein Byte-Array als Puffer übergeben, sowie die Position als auch die zu lesende Menge an Bytes.

Zusätzlich wird aber die Referenz auf einen Handler-Methode übergeben, welche die eingelesenen Bytes verarbeitet, als auch ein beliebiges Objekt (AsyncState), mit dem weitere Daten an den Handler übergeben werden können. Für diesen Sniffer sind das spezielle Typen die für den jeweiligen Schritt die benötigten Informationen weitergeben:

var state = new ClientConnectionState
    {
        Session = new RequestSession(),
        Client = tcpClient,
        ClientStream = clientStream,
        ClientStreamBase = clientStream,
        Buffer = new byte[Globals.BufferSize],
        MessageStream = new MemoryStream(),
        IsSsl = false
    };

clientStream.BeginRead(state.Buffer, 0, state.Buffer.Length, ReadFromClient.Run, state);

An dieser Stelle geben wir unter anderem den TcpClient, den clientStream, den Puffer mit den Daten als auch einen MemoryStream mit.

  • Den TcpClient wird nur mitgegeben, um ihn am Ende der Verarbeitung korrekt zu schließen
  • Der ClientStream wird benötigt, um EndRead aufzurufen und die Daten fertig zu lesen
  • ClientStreamBase ist der unverschlüsselte ClientStream, wenn wir später den ClientStream verschlüsselt haben. Wir führen parallel also eine unverschlüsselte Verbindung mit
  • Buffer wird später unsere Daten enthalten, ist der ausgelesene Teil-Stream
  • Der MessageStream ist der einzige MemoryStream der hier verwendet wird um die HTTP HeaderDaten als ganzes auszulesen. Diese werden benötigt, um die Verbindung zum entfernten Server herzustellen.
  • Die Session ist ein Objekt, das die Verbindungsdaten zum entfernten Server enthält als auch statistische Daten zum Loggen mit aufnimmt. z. B. die Anzahl der Schleifendurchläufe (Aufrufe von BeginRead pro Request. die Zahl der gelesenen Bytes als auch die Gesamtzahl der gelesenen Bytes)

Jeder AsyncState kann pro Verarbeitungsschritt etwas anders aussehen und andere Daten enthalten. insgesamt gibt es fünf dieser Objekte:

  • ClientConnectionState
    • Beim Auslesen vom ClientStream
  • ConnectToRemoteState
    • Beim herstellen der Remote-Verbindung
  • RemoteConnectionState
    • Beim starten der Remote-Verbindung
  • WriteToRemoteState
    • Beim schreiben in den RemoteStream
  • ReceiveFromRemoteState
    • Beim Lesen aus dem RemoteStream

Stream.EndRead

EndRead wird in der jeweiligen Handler-Methode aufgerufen. Vereinfacht in etwas so:

var state = asyncResult.AsyncState as ClientConnectionState;

if (state != null)
{
    var read = state.ClientStream.EndRead(asyncResult);

    state.MessageStream.Write(state.Buffer, 0, read);

    if (state.ClientStreamBase.DataAvailable)
    {
        state.ClientStream.BeginRead(state.Buffer, 0, state.Buffer.Length, ReadFromClient.Run, state);
    }
    // …
}

Zuerst holen wir uns unseren AsyncState aus dem IAsyncResult und rufen dann EndRead auf. Erst dann können wir sicher sein, dass der Puffer complett ist.

Man beachte, dass wir hier mit Referenz-Typen arbeiten: Wir haben state.Buffer als Argument an BeginRead übergeben und haben diesen gefüllten Puffer nun gefüllt in unserem Handler, nachdem wir EndRead aufgerufen haben.

Nun speichern wir die Daten in unserem MessageStream zwischen, um später auf die Header-Daten zugreifen zu können.

Befinden sich noch Daten im Stream, so wird der aktueller Handler erneut aufgerufen, bis die Eigenschaft DataAvailable false ist. Dann können wir mit der weiteren Verarbeitung fortfahren. 

Die Tatsache, dass wir den Request komplett auslesen, ist keine wirklich fließende Stream-Verarbeitung. Wenn man annimmt, dass die Headerdaten die 20 KB nicht überschreiten, kann man die Informationen im ersten Schleifendurchlauf schon verarbeiten und dann wirklich die Daten von A bis Z fließend durchreichen. Ggf. lässt sich der Teil optimieren, indem man in jedem schleifendurchlauf die Header-Daten auf Vollständigkeit prüft, oder prüft, ob beim ersten durchlauf schon alle benötigten Daten vorhanden sind.

Fazit

Mit dieser Behandlung blocken wir und keinen Thread und es können mehrere Verarbeitungen parallel stattfinden. Das das Tatsächlich funktioniert, sieht man am Logging, indem die Ausgaben mehrerer parallel laufender Requests hineinlaufen. Schön ist das zu sehen, bei Bilder-lastigen Websites wie Pinterest oder Facebook. Sowohl die Logausgabe ist parallel als auch die Bilder die im Browser parallel geladen werden.

Die am ende angesprochene Optimierung um den eingehenden Request fließend an den RemoteStream zu übergeben, muss man abhängig davon machen, was man mit dem Sniffer bezweckt. Geht es um das reine Mitlesen oder Cachen von Daten, macht das absolut Sinn. Möchte man allerdings Filtern und Inhalte ersetzen und entschärfen – wie es bei einer Kinderschutz-Software Sinn machen würde -  müssen wir die Anfragen und Antworten komplett puffern. Ein Bild kann schließlich erst dann gut analysiert werden, wenn es komplett geladen ist. Eine Pufferung geht allerdings immer zu Lasten der Performance.

Marco Scheel: Links for 2015-06-19 [del.icio.us]

Holger Sirtl: Azure News on Friday (KW25/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Microsoft Azure Plattform. Hier sind nähere Infos dazu…

Aktuelle Neuigkeiten

Datum Nachricht
18.06. Click Once Deployment von Windows Anwendungen via Azure Blob Storage
Click Once Deployment von Windows Anwendungen via Azure Blob Storage
17.06. Room service: How IoT creates a custom hotel experience
Coole IoT Konzeptstudie zum "Connected Room" - das moderne Hotelzimmer powered by Windows 10.
17.06. “Bring your own app” with Azure AD Self-Service SAML configuration -> now in preview
Die Azure AD Gallery unterstützt jetzt auch SaaS Anwendungen, die Single Sign-on via SAML 2.0 implementieren.
17.06. Report from Open Networking Summit: Achieving Hyper-Scale with Software Defined Networking
Mark Russinovich erklärt wie über Software Defined Networking mit Azure eine der größten Public Clouds betrieben wird.
16.06. Big data made clearer: handy infographic explains the fundamentals of predictive analytics
Infografik zu Predictive Analytics, Big Data, Klassifizierungen etc. Wichtig u.a. für Azure Machine Learning
16.06. Architecture Matters: The Service Fabric of Our Lives
Artikel, der Herausforderungen und Möglichkeiten der Azure Service Fabric am Beispiel Microsoft Intune beschreibt.
16.06. Addressing interoperability in IoT
Dieser Artikel zeigt auf, wie mit den Microsoft-IoT-Services der Herausforderung der Interoperabilität der IT-Systeme begegnet werden kann.
16.06. Azure Active Directory Premium reporting now detects leaked credentials
Das Azure AD kann jetzt über statistische Algorithmen erkennen, ob Credentials missbräuchlich verwendet werden.
15.06. Cloud Success Comes in Completing the Cloud Handshake
Guter Überblick über Best Practices, um maximal von Microsoft Azure hinsichtlich SLAs etc. zu profitieren.
15.06. Azure Data Factory Updates: Copy data from MySQL, DB2, Sybase, PostgreSQL and Teradata
Azure Data Factory unterstützt als Datenquellen jetzt auch MySQL, DB2, Sybase, PostgreSQL and Teradata
15.06. Azure Media Services delivers Widevine encrypted stream by partnering with Castlabs
Neben PlayReady unterstützen Azure Media Services jetzt auch Widevine zur Auslieferung DRM-geschützter Inhalte
12.06. Update to default partition count for Event Hubs
Die minimale Anzahl der Partitionen im Azure Event Hub wurde auf 2 reduziert. Default ist jetzt 4.
12.06. Azure AD, Microsoft Intune and Windows 10 – Using the cloud to modernize enterprise mobility!
Infos zum Zusammenspiel von Azure AD, Windows 10 und Intune für modernes Mobile Device Management.

Neue Videos

Datum Nachricht
18.06. The HTTP Platform Handler with Scott Hanselman
Scott Hanselman erklärt, wie mit dem HTTP Platform Handler Java, Ruby, F# etc. auf Azure ausgeführt werden kann
18.06. Azure Web App Log Streaming with Scott Hanselman
Scott Hanselman zeigt Schritt für Schritt wie mit Log Streaming Azure Web Apps überwacht werden können
17.06. Tuesdays with Corey: A little somethin' about Scale Sets
Corey Sanders zeigt wie mit Scale Sets und Azure Resource Manager skalierbare Deployments umgesetzt werden können.
12.06. Episode 177: More API Management Features with Vlad Vinogradsky
Neue Cloud Cover Episode mit Schwerpunkt Azure API Management

Marco Scheel: Links for 2015-06-18 [del.icio.us]

Holger Sirtl: Click Once Deployment von Windows Anwendungen via Azure Blob Storage

Dieser Artikel beschreibt in wenigen Schritten, wie Windows Anwendungen via Azure Blob Storage und Click Once Deployment auf Clients installiert werden können.

Disclaimer: Dieser Artikel ist eine Übersetzung/Aktualisierung eines Blogposts meines Kollegen Avkash Chauhan, dem ich an dieser Stelle meinen expliziten Dank für seine Vorarbeit aussprechen möchte.

Das Vorgehen zum Bereitstellen, Installieren und Deinstallieren einer Click Once Anwendung soll in folgenden 6 Schritten erfolgen:

  • Schritt 1: Erstellen eines öffentlichen Containers im Microsoft Azure Blob Storage
  • Schritt 2: Publishing einer Windows Forms Anwendung
  • Schritt 3: Kopieren aller Click Once Dateien in den Microsoft Azure Blob Storage Container
  • Schritt 4: Aufruf der Installer URL
  • Schritt 5: Aufruf der einmal Installierten Anwender auf dem Windows Client PC
  • Schritt 6: Entfernen der installierten Anwendung

Schritt 1: Erstellen eines öffentlichen Containers im Microsoft Azure Blob Storage

Zunächst benötigt man eine Azure Subscription sowie einen darin installierten Storage Account. Für eine detailliertere Beschreibung wie man diese erhält, verweise ich hier auf die offizielle Azure Dokumentation.

Erstellen Sie nun im ersten Schritt im Storage Account einen neuen Container (z.B. mit Namen “clickonceinstall”), für den Sie öffentlichen Zugriff auf die darin abgelegten Blobs konfigurieren. Hierzu können Sie beispielsweise den Azure Explorer der Firma Cerebrata verwenden.

image

Klicken Sie im Explorer im Storage Account mit der rechten Maustaste, wählen Sie den Menüpunkt New Blob Container. Wählen Sie einen Namen, setzen Sie das Zugriffslevel auf Blob – Public read Access for Blobs und bestätigen Sie mit OK.

In meinem Fall hat dieser Container nun die Adresse: https://hsirtldocs.blob.core.windows.net/clickonceinstall

Schritt 2: Publishing einer Windows Forms Anwendung

In Visual Studio 2013 habe ich nun eine kleine Windows Forms Anwendung namens ClickOnceApplication erstellt. Diese soll als Beispiel dienen (und enthält deshalb keine wirkliche Funktionalität), verwenden Sie hier eine eigene Anwendung.

Für das Publishing klicken Sie nun im Solution Explorer in Visual Studio auf das Projekt und wählen den Menüpunkt Publish… .

image

Da ein direktes Publishing in den Blob Storage Container (noch) nicht möglich ist, wählen Sie als Publishing Location ein lokales Verzeichnis (z.B. C:\Temp\ClickOnce) und bestätigen Sie mit Next>.

image

Wählen Sie im nächsten Fenster als Installationsort From a Web site und geben dort als URL die Adresse des oben angelegten Blob Storage Containers an. Bestätigen Sie mit Next>.

image

Wählen Sie im nächsten Fenster die Option “Yes, this application is available online or offline” und bestätigen Sie mit Finish.

image

Damit werden die für die Installation benötigten Dateien in den lokalen Ordner geschrieben.

image

Schritt 3: Kopieren aller Click Once Dateien in den Microsoft Azure Blob Storage Container

Kopieren Sie nun alle Inhalte des lokalen Ordners in des Blob Storage Container (also die drei Dateien und das Verzeichnis Application Files).

image

Schritt 4: Aufruf der Installer URL

Rufen Sie nun die URL der Installer-Datei (also Container-URL + “publish.htm”

image

Dies zeigt Ihnen eine Installationsseite an, über die Sie die Anwendung nun installieren können. Klicken Sie hierzu im Browser auf Install.

Bestätigen Sie, dass Sie die Datei Setup.exe ausführen möchten.

image

Da die Anwendung nicht speziell signiert ist, erhalten Sie noch diverse Warnungen bestätigen Sie jeweils mit Run, Run anyway und Install.

image

image

Die Anwendung sollte dann auf dem Windows Client PC installiert und ausgeführt werden.

image

Schritt 5: Aufruf der einmal Installierten Anwender auf dem Windows Client PC

Die Anwendung lässt sich nun auch auf dem Windows Client PC starten. Sofern man in Visual Studio die Erstellung eines Desktop-Icons konfiguriert hat, kann die Anwendung nach der Installation über dieses Icon aufgerufen werden.

Schritt 6: Entfernen der installierten Anwendung

Eine Deinstallation der Anwendung ist äußerst simpel. Rufen Sie die Systemsteuerung auf und suchen Sie die Anwendung unter Programs/Programs and Features.

image

Klicken Sie mit der rechten Maustaste auf die Anwendung und wählen Sie Uninstall.

image

Bestätigen Sie die Deinstallation im folgenden Dialog und bestätigen Sie mit OK.

Weitere Informationen

Jürgen Gutsch: Dependency Injection in ASP.NET MVC 6 Views

Nicht genug, dass Dependency Injection nun ein durchgehendes Konzept in ASP.NET 5 ist, nun lassen sich auch Services direkt in die Views injizieren. Wie das aussieht?

Ganz einfach :)

Erstellen wir spaßeshalber eine einfache Klasse, die uns eine Liste mit Ländern (vom Type Country) liefert und nennen diese CoutryService. Erstellen wir parallel ein Interface mit dem Namen ICountryservice:

public class CountryService : ICountryService
{
    public IEnumerable<Country> All()
    {
        return new List<Country>
        {
            new Country {Code = "DE", Name = "Deutschland" },
            new Country {Code = "FR", Name = "Frankreich" },
            new Country {Code = "CH", Name = "Schweiz" },
            new Country {Code = "IT", Name = "Italien" },
            new Country {Code = "DK", Name = "Dänemark" }
        };
    }
}

public interface ICountryService
{
    IEnumerable<Country> All();
}

public class Country
{
    public string Code { get; internal set; }
    public string Name { get; internal set; }
}

Diesen CountryService müssen wir nun dem DI Container hinzufügen. Das passiert in der Startup.cs in der Methode ConfigureServices:

services.AddTransient<ICountryService, CountryService>();

Diese Zeile mappt das Interface ICountryService auf die Implementation CountryService. Transient meint in diesem Fall, dass jedes Mal eine neue Instanz von CountryService erstellt wird, wenn wir nach der Implementation von ICountryService fragen. Das ist für diesen Fall absolut in Ordnung.

Nun können wir überall eine Instanz des Coutryservices erhalten. Wie bereits bekannt ist, natürlich auch im Controller per Constructor Injection:

public class HomeController : Controller
{
    private readonly ICountryService _countryService;

    public HomeController(ICountryService countryService)
    {
        _countryService = countryService;
    }
    // …
}

Und neu in ASP.NET MVC 6 auch in den Views.

Folgende Zeile definiert die Injection per Razor-Syntax in der View:

@inject DiViews.Services.ICountryService countryService;

Der erste Teil des @inject legt das Interface fest. Hier wird der komplette Namespace angegeben, sofern kein @using definiert ist und der zweite Wert ist der Name der Variablen, welche die Instanz hält. also analog zur Contructor Injection weiter oben.

Anschließend kann die Instanz wie gewohnt verwendet werden:

@if (countryService.All().Any())
{
    <ul>
        @foreach (var country in countryService.All().OrderBy(x => x.Name))
        {
            <p>@country.Name (@country.Code)</p>
        }
    </ul>
}

Alternativ würden sich auch Select-Boxen füllen lassen oder was auch immer:

@Html.DropDownList("Coutries", countryService.All()
    .OrderBy(x => x.Name)
    .Select(x => new SelectListItem
    {
        Text = x.Name,
        Value = x.Code
    }))

Für was ist das gut?

Eigentlich wird das recht schnell klar: Mit dieser Technik lassen sich z. b. Lookup-Daten einfacher und sauberer in die View bringen als über den ViewBack oder über das Model, bei typisierten Views. Somit wird das Model sauberer und schlanker und die Nutzung des ViewBacks wird reduziert. Die Actions übermitteln nur noch die Daten, die wirklich dynamisch ausgegeben werden sollen. Aus meiner Sicht wird diese Technik auch die Controller um einiges übersichtlicher machen, weil eben diese Lookup-Werte nicht mit ermittelt und zurückgegeben werden müssen.

Da Dependency Injection überall funktioniert, könnte man nun z. B. auch wiederverwendbare TagHelper für Lookup-Werte schreiben.

Jürgen Gutsch: ASP.NET MVC Web kontinuierlich nach Azure ausliefern mit Jenkins und FAKE

Vorab

Für ein aktuelles Projekt ist es nötig, schnell auf reale Umgebungen auszuliefern. In einen Fall soll der Entwicklungsstand (DEV) auf eine Instanz ausgeliefert werden, in der wir Entwickler nochmals testen und ggf. debuggen können und im nächsten Fall soll ein Zwischenstand (QS, mit fertigen Features) zum Testen und für Kundenabnahmen auf eine weitere Instanz ausgeliefert werden. Im letzten Fall, soll der abgenommene Stand (PROD) auf das Produktiv-System ausgeliefert werden.

Es soll allerdings nicht nur ausgeliefert werden. Sowohl die Website als auch drum herum entstandene Projekte sollen auch gebaut und anschließend getestet werden.

Wir haben hier drei - nahezu identische – Deployments auf fast identische Umgebungen. Die unterschiede sind minimal:

  • DEV:
    • voll automatisiert
    • baut im Debug-Modus
  • QS:
    • voll automatisiert
    • baut im Release-Modus
  • PROD:
    • automatischer Build
    • manueller Build-Trigger
    • baut im Release-Modus

Die Versionierung lasse ich in diesem Beitrag mal aus.

Die ersten beiden Builds laufen nach dem Commit in den entsprechenden Branch. Der letzte Build wird manuell angestoßen, wenn die Features getestet und abgenommen sind und dieser Stand in den master-Branch comittet sind.

Alternativ zu den Varianten mit Visual Studio Online die aktuelle überall beschrieben sind, stelle ich hier eine andere, offenere und – aus meiner Sicht – leichtgewichtigere  Variante vor.

Jenkins

Als Build-Server dient eine Jenkins-Installation auf einer VM auf Azure. Dort sind drei Build-Jobs angelegt, von denen zwei auf Änderungen im entsprechenden Branches im Git-Repository reagieren und einer auf den manuellen Start wartet.

Jenkins ist ein sehr Leichtgewichtiger und schneller Build-Server, den ich schon seit Ewigkeiten (Noch unter dem Namen Hudson) eingesetzt habe. Die UI ist zwar nicht sehr hübsch, allerdings ist er leicht zu bedienen und schnell installiert. Für Windows gibt es einen kompletten Installer von Bitnami, für alle denen selbst die manuelle Installation noch zu schwer ist ;-)

Alle Build-Jobs ziehen sich den aktuellen Stand des jeweiligen Branches und rufen ein FAKE-Skript mit Parametern auf. Die Parameter sind unter anderem:

  • Build-Nummer
  • Build-Configuration (debug oder release)
  • Name der entsprechenden Azure Deployment Configuration
  • Das Publish-Passwort

FAKE hatte ich in einem separaten Beitrag kurz vorgestellt und kommt bei mir in privaten Projekten immer zum Einsatz. Im Geschäft ist dies der erste Einsatz von FAKE. Ich gehe hier nur auf den Deploiyment Teil in FAKE ein, nicht auf die Konfiguration des Builds und der Tests, da das nicht sehr von dem abweicht, was in der Dokumentation zu FAKE steht. Die Reihenfolge (Konfigurieren, Bauen, Testen und Ausliefern) ist eh klar.

Der Aufruf des FAKE-Scripts in Jenkins erfolgt über ein Batch-Task, Hier wird ebenfalls nur ein Batch-Script aufgerufen, das – bevor das FAKE-Skript gestartet wird – FAKE aktualisiert, in dem es die aktuellen NuGet Packages zieht. War das update erfolgreich wird das FAKE-Script wie folgt aufgerufen:

CI\build.bat bn=%BUILD_NUMBER% conf=Debug pubprofile="MyMvcProject - Web Deploy.pubxml" pubpwd=%PUBLISH_PASSWORDD%

Deployment mit FAKE

Die Auslieferung war etwas Tricky, wir mussten zuerst herausfinden, wie das mit MS-Build gelöst werden kann. Am Ende war es klar: Wir mussten die Web App nochmals bauen mit den Targets Publish und der Angabe der Azure Deployment Configurations. Also ein Web-Deployment direkt auf die Azure Web App.

Wir haben im FAKE-Script wieder einen MsBuild Aufruf, diesmal mit den erwähnten zusätzlichen Parametern:

let setParamsWeb = [
        "DebugSymbols", "True"
        "Configuration", buildConf
        "Platform", "Any CPU"
        "PublishProfile", publishProfile
        "DeployOnBuild", "true"
        "Password", publishPassword
        "AllowUntrustedCertificate", "true"
        "IgnoreDatabaseSettingOutOfSync", "true"
]

// Publish the application
Target "PackageApp" (fun _ –>
    MSBuild buildDir "Build" setParamsWeb ["MySolution/MyMvcProject/MyMvcProject.csproj"]
      |> Log "AppBuild-Output: "
)

Fazit

Im Grunde war es das auch schon. Dieses Setup ist schnell aufgesetzt, einfach zu warten und läuft auch relativ schnell durch. Das Continuous Deployment an sich ist also angenehm leichtgewichtig. Projektverantwortliche und Kunden können schnell auf den aktuellen Stand schauen und schnell Feedback geben. Was im aktuellen Projekt hervorragend funktioniert hat.

Nach Möglichkeit sollte dieses Setup nun in allen zukünftigen .NET-Projekten genutzt werden. Durch FAKE spart man sich eine übermäßige Konfiguration im Jenkins und kann den gesamten Build- und Deployment-Prozess bequem im Visual Studio bearbeiten. Beim nächsten Commit in den jeweiligen Branch wird das FAKE-Script sofort angewendet.

André Krämer: Kostenlose Performance Sprechstunde mit André Krämer auf der Developer Week 2015

Die Anwendung ist viel zu langsam!

Diesen Satz möchte wohl kein Entwickler gerne von seinen Kunden oder Anwendern hören.

Am 17. Juni 2015 werde ich deswegen während der Mittagspause der Developer Week einen Kurzvortrag über drei typische Performance Probleme halten. Anschließend haben wir noch ca. 15 Minuten für Fragen und Antworten zu konkreten Performance Problemen, ehe die Sessions wieder starten.

Jeder Besucher der DWX ist herzlich willkommen, mich am Stand von Redgate zu besuchen und seine Fragen mitzubringen.

Kostenlose .NET Performance Sprechstunde mit Andre Kraemer auf der Developer Week 2015

Manfred Steyer: Folien und Beispiele zu meinem Vortrag zum Erweitern von Entity Framework 6.x

Nachfolgend finden sich die Folien und Beispiele zu meinem Vortrag zum Erweitern von Entity Framework 6.x, welchen ich heute auf der DWX gehalten habe. Die Beispiele zeigen den Einsatz von Caching, Filter, Bulk-Updates mit Entity Framework 6.x. Dazu kommen Community-Erweiterungen sowie eigene Implementierungen zum Einsatz. Ein weiteres Beispiel zeigt, wie man sich mit einem eigenen MigrationGenerator DDL-Code für History-Tabellen generieren lassen kann.

Folien und Beispiele


Marco Scheel: Links for 2015-06-15 [del.icio.us]

Manfred Steyer: Folien und Beispiele zu meinem Vortrag über Micro-Services mit ASP.NET 5

Nachfolgend die Folien und Beispiele zu meinem Talk über Micro-Services mit ASP.NET 5 MVC. Die Demo-Anwendung besteht aus zwei Micro-Services. Der eine basiert auf AngularJS, Web APIs und ASP.NET 5; der andere ist eine klassische Web-Anwendung, welche auf ASP.NET MVC 6 basiert. Zur Authentifizierung kommen Tokens zum Einsatz. Diese werden via OpenId Connect angefordert und als Identity Provider fungiert Google. Darüber hinaus kommt zur Kommunikation zwischen den beiden Micro-Services neben einer REST-API auch der Microsoft Service Bus zum Einsatz.

Downloads

Manfred Steyer: Ein gut gehütetes Geheimnis: Proxies in Visual Studio für Web-APIs mit dem Azure SDK auf Knopfdruck generieren

Bis dato fehlt in Visual Studio die Möglichkeit, per Knopfdruck einen Proxy für eine Web API zu generieren. Das ist ärgerlich, zumal dies einen Rückschritt gegenüber SOAP-basierter Web-Services darstellt. Glücklicherweise hat Microsoft hier nachgerüstet. Allerdings haben das die wenigsten bemerkt. Der Grund dafür dürfte sein, dass diese Neuerung mit dem aktuellen SDK für Azure kommt. Microsoft nutzt diese Möglichkeit für die neuen Azure-basierten Api-Apps. Trotzdem kann man damit auch eigene Web APIs, die über Swagger dokumentiert sind, adressieren und somit einfach Proxies erhalten.

Zum Generieren eines Proxys in einem Client-Projekt nutzt der Entwickler die vom Azure-SDK eingerichtete Anweisung Add | Azure Api App Client im Kontextmenü des Solution-Explorers (siehe Abbildung). Der auf diese Weise aufgerufene Dialog bietet die Möglichkeit, entweder eine API App aus einem Azure-Konto auszuwählen oder eine Swagger-Datei direkt anzugeben. Letztere Option kann der Entwickler somit auch für Web APIs, die nicht via Azure gehostet werden, nutzen.

Nach dem Bereitstellen der geforderten Informationen generiert Visual Studio einen Proxy. Listing 2 veranschaulicht die Funktionsweise von Proxys anhand der Methode GetAll des in Listing 1 gezeigten HotelControllers. Der Name des Proxys entspricht dem Namen der API App. Er weist pro beschriebener Web API eine Eigenschaft auf. Über diese Eigenschaft lassen sich die angebotenen Methoden aufrufen.

var client = new Steyerhotels();
var hotels = client.Hotel.GetAll();

foreach (var hotel in hotels)
{
    Console.WriteLine(hotel.Name);
}

Neben den synchronen Proxy-Methoden liegen auch asynchrone Gegenstücke vor. Wer die gesamte empfangene HTTP-Nachricht lesen möchte, greift auf Methoden mit der Endung WithOperationResponseAsync zurück. Diese liefern eine Instanz von HttpOperationResponse, welche die HTTP-Nachricht über eine Eigenschaft Response des Typs HttpResponseMessage repräsentiert (siehe nachfolgendes Listing).

var client = new Steyerhotels();
var result = client.Hotel.GetAllWithOperationResponseAsync().Result;
Console.WriteLine(result.Response.StatusCode);
var hotels = result.Body;

foreach (var hotel in hotels)
{
    Console.WriteLine(hotel.Name);
}

Um ausgehende Nachrichten zu beeinflussen, bietet der Proxy über eine Eigenschaft HttpClient jene HttpClient-Instanz, die er auch zum Zugriff auf die Web API heranzieht. Diese Instanz kann zum Beispiel genutzt werden um standardmäßig zu übersendende Kopfzeilen festzulegen.

[1] http://azure.microsoft.com/de-de/downloads/

Manfred Steyer: Swashbuckle zur Generierung von Swagger-Dokumentationen für Web APIs konfigurieren

Wie in einen vorangegangenen Beitrag beschrieben, bietet das freie Community-Projekt Swashbuckle die Möglichkeit, für mit ASP.NET Web API bereitgestellte Services ein Swagger-Dokument zu erzeugen. Dabei handelt es sich um eine JSON-basierte Service-Beschreibung, welche zum Generieren von Dokumentationen oder clientseitigen Proxys genutzt werden kann.

Swashbuckle bietet zahlreiche Konfigurationsmöglichkeiten, von denen drei hier näher betrachtet werden. Um diese Konfigurationsmöglichkeiten zu nutzen, übergibt der Entwickler einen Lambda-Ausdruck an die Methode EnableSwagger, welche Swashbuckle aktiviert. Bei EnableSwagger handelt es sich um eine Erweiterungsmethode für die Klasse HttpConfiguration, mit der ASP.NET Web API konfiguriert wird.

Das Beispiel im nächsten Listing veranschaulicht dies. Der Parameter c des Lambda-Ausdrucks steht für ein Konfigurationsobjekt, welches die einzelnen Konfigurationsoptionen anbietet. Durch Aufruf der Methode ResolveConflictingActions wird festgelegt, wie Swashbuckle vorgehen soll, wenn für ein und dieselbe Url mehrere Service-Operationen existieren. Solch ein Fall ergibt sich, wenn Web API zwischen mehreren Service-Operationen lediglich anhand der übergebenen Url-Parameter wählen muss. Das nächste Listing veranschaulicht dies anhand eines einfachen Controllers, da hier die standardmäßig vorherrschende Route dazu führt, dass ASP.NET Web API die ersten beiden Operationen bei einer an /api/hotel gerichteten GET-Anfrage in Erwägung zieht. Übersendet der Aufrufer einen Parameter minSterne zieht Web-API erste heran; ansonsten letztere. Auch wenn es auf dem ersten Blick so wirken mag, verursacht die dritte Methode in Listing 4 keinen Konflikt, da sie durch die standardmäßig vorherrschende Route auf die Url /api/hotel/{id} abgebildet wird, wobei {id} ein Platzhalter für den gleichnamigen Übergabeparameter ist.

Leider unterstützt Swagger diese Art der (Methoden-)Überladung nicht und löst in solchen Fällen eine Ausnahme aus. Um diese Ausnahme zu vermeiden, kann der Entwickler jedoch über die Konfigurationseinstellung ResolveConflictingActions (siehe nächstes Listing) angeben, wie mit solchen Konflikten umzugehen ist. Dazu verweist diese Option auf einen Lambdaausdruck, der pro Konflikt eine Auflistung mit Informationen zu sämtlichen in Konflikt stehenden Operationen übergeben bekommt und die Aufgabe hat, ein Objekt mit jenen Informationen, die für die jeweilige Url in das Swagger-Dokument aufzunehmen sind, zu retournieren. Im betrachteten Fall wird einfach die erste Beschreibung retour geliefert und somit alle anderen Operationen außer Acht gelassen. Es wäre hingegen auch denkbar sämtliche Beschreibungen zu einer einzigen Beschreibung zu vereinen.
Hat der Entwickler diese Einschränkung beim Implementieren der Web API im Hinterkopf, kann er hingegen solche Konflikte bereits von vorn herein vermeiden, indem er jeder Operation eine eigene Url verpasst sowie Überladungen zugunsten von optionalen Parametern vermeiden.

GlobalConfiguration.Configuration.EnableSwagger(c => { 

        c.ResolveConflictingActions(descriptions =>
        {
            var result = descriptions.First();
            return result;
        });
});
public class HotelController : ApiController
{
        [HttpGet]
        public List FindHotelsBySterne(int minSterne)
        {
            […]
        }

        public List GetHotels()
        {
            […]
        }

        /// 
        /// Liefert ein Hotel anhand der übergebenen Id zurück.
        /// 
        public Hotel GetHotel(int id)
        {
            […]
        }
}

Eine weitere nützliche Konfigurationsoption, die hier vorgestellt werden soll, ist Möglichkeit, mit IncludeXmlComments die Informationen aus XML-basierten Kommentaren, wie jene, die im nächsten Listing für die Methode GetHotel hinterlegt wurden, in die generierte Swagger-Dokumentation aufzunehmen. Dazu ruft der Entwickler IncludeXmlComments im Rahmen der Konfiguration auf und übergibt dabei einen String, der den vollständigen Dateinamen der beim Kompilieren generierten XML-Datei beinhaltet:

     c.IncludeXmlComments(
              System.AppDomain.CurrentDomain.BaseDirectory 
                + @"\bin\SwaggerServer.XML");

Damit Visual Studio diese XML-Datei beim Kompilieren generiert, muss in den Projekteinstellungen unter Build die Option XML documentation file aktiviert werden.

Zum Abschluss betrachtet der vorliegende Beitrag eine Herausforderung, die sich ergibt, wenn eine Service-Operation den Typ HttpResponseMessage oder IHttpActionResult retourniert. In diesem Fall ist Swashbuckle nicht in der Lage, via Reflektion den über die Nutzdaten übersendeten Rückgabewert zu erkennen. Abhilfe schafft hier das Attribut ResponseType, über das der Entwickler über den tatsächlichen Rückgabewert informieren kann:

[ResponseType(typeof(Hotel))]
public HttpResponseMessage PostHotel(Hotel hotel) { […] }

Manfred Steyer: Client-seitige Proxies für Web APIs generieren

Das quelloffene Projekt Swagger.WebApiProxy [1] bietet dem Entwickler die Möglichkeit, aus einer Swagger-basierten Beschreibung [2] eines RESTful Services bzw. einer Web API einen clientseitigen Proxy zu generieren.

Die einfachste Art, diese Community-Erweiterung zu nutzen, besteht darin es von Github [1] herunterzuladen und das sich unterhalb des Ordners src befindliche Projekt Swagger.WebApiProxy.Template in die eigene Solution einzubinden. Zwar ist es auch möglich, via NuGet zu beziehen. Allerdings geht dies mit der Notwendigkeit einer unter [1] beschriebenen manuellen Änderung der genutzten Projektdatei einher.

Das Projekt Swagger.WebApiProxy.Template besteht im Wesentlichen aus einer T4-Datei, welche sich um das Generieren der gewünschten Client-seitigen Proxys kümmert. Die dazu nötigen Informationen bezieht sie aus der Datei SwaggerApiProxy.tt.settings.xml, in die unter anderem die URL des Swagger-Dokuments sowie der Namensraum, in dem der Proxy generiert werden soll, einzutragen ist. Das nächste Listing demonstriert dies. Das Element Url spiegelt die Url des Dokuments wieder und das Element Namespace den gewünschten Namensraum. Unter Id findet man einen Bezeichner für die Web API. Die restlichen Elemente wurden aus der mitgelieferten Beispieldatei ohne Änderung übernommen.

<SwaggerApiProxySettings>
  <EndPoints>

    <EndPoint>
      <Id>SwaggerServer</Id>
      <Url>http://localhost:59458/swagger/docs/v1</Url>
      <Namespace>SwaggerServer</Namespace>
      <Suffix>WebProxy</Suffix>
      <BaseProxyClass>Swagger.WebApiProxy.Template.BaseProxy</BaseProxyClass>
      <ProxyConstructorSuffix>(Uri baseUrl) : base(baseUrl)</ProxyConstructorSuffix>
      <ParseOperationIdForProxyName>false</ParseOperationIdForProxyName>
      <AppendAsyncToMethodName>false</AppendAsyncToMethodName>
    </EndPoint>

  </EndPoints>
</SwaggerApiProxySettings>

Anschließend kann man mit dem generierten Proxy auf die Web API zugreifen. Das nächste Listing veranschaulicht dies, indem es zwei beispielhafte Service-Operationen, GetHotel und FindHotelsBySterne, anstößt.

HotelWebProxy proxy = new HotelWebProxy(new Uri("http://localhost:59458"));
var hotel = proxy.Hotel_GetHotel(1).Result;
var hotels = proxy.Hotel_FindHotelsBySterne(3).Result;

friends header

bloggers headline

links header

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