Norbert Eder: Visual Studio Code Quicktipp #10 – Mit mehreren Editoren arbeiten

Visual Studio Code kann bis zu drei Editoren öffnen, welche nebeneinander dargestellt werden. Die einzelnen Editoren können mit STRG+1, STRG+2 und STRG+3 angesprochen werden. Ist nur ein Editor offen und wird z.B. STRG+2 betätigt, wird gerade geöffnete Datei im neuen Editor geöffnet.

Mit STRG+SHIFT+E wird der Explorer geöffnet, womit einfach die geöffnete Datei für den aktiven Editor geändert werden kann. Das erneute Ausführen derselben Tastenkombination setzt den Fokus zurück in den ursprüngliche Editor.

STRG+Ö ermöglicht schließlich das Weiterschalten zwischen den geöffneten Editoren. Einzelne Editoren können mit STRG+F4 geschlossen werden.

Auch die Anordnung der Editoren kann geändert werden: STRG+K Pfeiltaste links bewegt den gesamten Editor (soweit möglich) einen Platz nach links. Mit STRG+K Pfeiltaste rechts ist ein Bewegen nach rechts möglich.

The post Visual Studio Code Quicktipp #10 – Mit mehreren Editoren arbeiten appeared first on Norbert Eder.

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

  • Reader Submission: The future of windows phone is windows 10 - WMPoweruser
    Earlier this week, Microsoft released the numbers of everything it was doing business in. The cloud did fantastic, reaching the halfway point of their goal of $20 billion, up over 70% year-over year. Same could be said to the surface line up, with revenue reaching a new height of $1. via Pocket

Marco Scheel: Links for 2016-02-05 [del.icio.us]

codefest.at [MS]: Know it, Prove it - auch Du kannst ein IT-Superheld sein

Technorati Tags: ,

Know it, Prove it - auch Du kannst ein IT-Superheld sein.
Stelle Deine IT-Superkräfte unter Beweis in 29 Tagen. Nimmst Du die Challenge an?

 

image

 

Die Microsoft Virtual Academy (MVA) hat im Februar die MVA learning challenge "Know it, prove it" ins Leben gerufen, wo Du in nur einem Monat Dich in einem dieser Bereiche (siehe unten) weiterbilden kannst.

clip_image001

Es nehmen an der Challenge Teilnehmer aus der ganzen Welt teil von Programmierern, IT-Professionalsten bis hin zu Studenten. Es gibt auch ein weltweites Ranking, dass die Länder mit den höchsten Teilnehmeranzahl abbildet. Ihr habt auch die Möglichkeit die Challenge für Eure Freunde und Kollegen auf Facebook, LinkedIn, Twitter und Pinterest zu posten.

Hier geht's zu Deiner Challenge:

https://borntolearn.mslearn.net/knowitproveit/p/home

Wenn Du schon ein MVA Konto hast, musst Du Dich nur mehr einloggen und die Nutzungsbedingungen bestätigen.

Falls Du noch kein MVA Konto hast, musst Du Dich ganz einfach ein Live-ID-Konto registrieren lassen und schon kannst auch Du loslegen.

Holger Sirtl: Azure News on Friday (KW05/16)

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

Aktuelle Neuigkeiten

Datum Nachricht
04.02. An early look at Azure Stack and what it means for IT
Vorschau zu Azure Stack - was bedeutet Azure Stack für die IT
03.02. Introducing: SQL Server 2016 Community Technology Preview 3.3
SQL Server 2016 CTP 3.3 ab heute verfügbar!
03.02. Microsoft Enhances End-to-End IoT Platform: Adds General Availability for Microsoft Azure IoT Hub and New Device Partners for Developers
Azure IoT Suite News - IoT Hub allgemein verfügbar, neue Device-Partner (Advantech, Dell, HPE, and Libelium...)
02.02. Load feature is available for Azure CDN
Load Feature im Azure CDN ab sofort verfügbar - Inhalte für schnellen Zugriff proaktiv auf CDN Endpunkte laden
02.02. Is your code ready for the leap year?
Hinweise zur Vermeidung Schaltjahr-bezogener Code-Fehler - 2016 ist Schaltjahr
02.02. World Class ARM Templates - Considerations and Proven Practices
World Class ARM Templates - Considerations and Proven Practices
01.02. Azure Government adds Azure Backup
Azure Backup ist jetzt auch in Azure Government verfügbar - IaaS Virtual Machines in der Cloud sichern
01.02. Azure Search .NET SDK roadmap
Infos zur Roadmap des Azure Search SDK für .NET - Feature-Parity zwischen der REST API und dem SDK etc.
01.02. Azure Site Recovery now available in Azure Government Cloud
Mit Azure Backup ist auch Azure Site Recovery in Azure Government verfügbar
01.02. Announcing PowerShell v5 support in Azure Automation
Azure Automation unterstützt jetzt auch PowerShell Version 5
01.02. Announcing general availability of Google Widevine license services
Google Widivine License Services in Azure Media Services verfügbar
01.02. On-premises and cloud hybrid Hadoop data pipelines with Hortonworks and Cortana Analytics
Hybride Datenpipelines mit Azure Data Factory, Hortonworks und Cortana Analytics aufbauen

Neue Kurse in der MVA

Datum Nachricht
04.02. Applications on Azure: Putting All the Pieces Together
Eigene Anwendungen auf Microsoft Azure - nicht sicher, wie? Hier ist ein kostenloser MVA Kurs zum Thema
03.02. Onboarding with the CSP Partner Center SDK
Interessant für alle Cloud Solution Provider (CSP) - Überblick über das Partner Center SDK

Neue Videos

Datum Nachricht Video
05.02. PowerApps 102 - Creating apps from templates
Mit PowerApps Client Apps für Smartphones oder Tables auf Basis von Templates erstellen
05.02. PowerApps 103 - Creating apps from existing data
Client Apps für verschiedene Geräte auf Basis bestehender Daten entwickeln - PowerApps macht's möglich
04.02. Introduction to Microsoft R Open
Überblick über Microsoft R Open - kompakt in einer Stunde
03.02. Azure Data Lake Analytics Deep Dive

03.02. Introducing Microsoft Azure Stack
30-Minuten-Überblick zu Microsoft Azure Stack von Mark Russinovich und Jeffrey Snover
02.02. Tuesdays with Corey: Special Guest Jeffrey Snover talks about Azure Stack
Überblick über Azure Stack mit Corey Sanders und Jeffrey Snover - was ist Azure Stack? was ist enthalten?

Norbert Eder: Visual Studio Code Quicktipp #9 – Bookmarks

Ich empfinde Bookmarks im Grunde hilfreich und sie fehlen mir in Visual Studio Code. Zum Glück gibt es eine Extension dafür: Bookmarks.

Installiert wird die Erweiterung mit F1 und ext inst bookmarks:

Visual Studio Code - Bookmarks  installieren

Visual Studio Code – Bookmarks installieren

In der Command Palette können nun mittels Bookmarks die möglichen Funktionen aufgelistet werden. Für die meisten besteht auch ein Shortcut:

Visual Studio Code - Bookmarks -Funktionen

Visual Studio Code – Bookmarks -Funktionen

Aktive Bookmarks werden so visualisiert:

Visual Studio Code - Bookmarks  anzeigen

Visual Studio Code – Bookmarks anzeigen

Zum aktuellen Zeitpunkt stehen auch zwei Einstellungen zur Verfügung:

  • "bookmarks.saveBookmarksBetweenSessions": true: Bookmarks werden gespeichert beim Öffnen des entsprechendes Projektes wieder hergestellt.
  • "bookmarks.gutterIconPath": "c:\\path\\to\\icon.png": Das Bookmark-Icon kann über diese Einstellung überschrieben werden.

Enjoy.

Nächster Tipp: Visual Studio Code Quicktipp #10 – Mit mehreren Editoren arbeiten

The post Visual Studio Code Quicktipp #9 – Bookmarks appeared first on Norbert Eder.

Sven Hubert: ALM kompakt: Work Item löschen nicht verfügbar

Seit kurzem gibt es in VSTS (Visual Studio Team Services) die Möglichkeit Work Items (logisch) zu löschen. Details dazu sind in der MSDN zu finden. Es kann jedoch sein, dass man den Befehl nicht, wie in der MSDN versprochen, vorfindet. Diese Funktionalität benötigt nämlich eine separate Berechtigung. Diese ist standardmäßig nicht für die Benutzer der Contributors-Gruppe gesetzt.

image

In diesem Falle fehlt der in der MSDN beschriebene Delete-Befehl in den entsprechenden Menüs (1). Erst mit der Berechtigung zum Löschen von Work Items ist das Kommando verfügbar (2).

SNAGHTML1826720

ACHTUNG: An dieser Stelle möchten wir aber noch darauf hinweisen, dass mit dieser Berechtigung sehr sorgsam umgehen sollte, da sich diese auf das gesamte Team Projekt bezieht.

Marco Scheel: Links for 2016-02-04 [del.icio.us]

Norbert Eder: Visual Studio Code Quicktipp #8 – Word wrap konfigurieren

Im Standard wird eine Zeile in Visual Studio Code erst nach 300 Zeichen umgebrochen. Das ist für die Softwareentwicklung mitunter praktisch (wenn es dann doch mal lange Zeilen gibt), aber beim Verfassen von Texten ist es das nicht. Glücklicherweise kann dies in den Benutzereinstellungen geändert werden.

Die besagten Benutzereinstellungen sind via File | Preferences | User Settings zu öffnen. Darin gibt es die Einstellung editor.wrappingColumn. Für diese kann nun der gewünschte Wert eingetragen werden. Bei einem Wert von 0 wird am Ende des sichtbaren Bereichs des Editors umgebrochen.

Nächster Tipp: Visual Studio Code Quicktipp #9 – Bookmarks

The post Visual Studio Code Quicktipp #8 – Word wrap konfigurieren appeared first on Norbert Eder.

Marco Scheel: Links for 2016-02-03 [del.icio.us]

Norbert Eder: Visual Studio Code Quicktipp #7 – Speicherort einer Datei in Explorer anzeigen

Immer wieder einmal möchte man sich den Speicherort einer Datei im Explorer anzeigen lassen. Einfach nur um zu wissen, wo genau diese Datei gespeichert ist und wie der weitere Verzeichnisinhalt aussieht, oder aber für weiterführende Aufgaben.

Mit STRG+K R kann dies erfolgreich durchgeführt werden.

Es lohnt sich ein Blick auf die weiteren File-Aktionen. Dazu einfach F1 drücken und File eingeben, schon erscheint eine vollständige Liste.

Nächster Tipp: Visual Studio Code Quicktipp #8 – Word wrap konfigurieren

The post Visual Studio Code Quicktipp #7 – Speicherort einer Datei in Explorer anzeigen appeared first on Norbert Eder.

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

Kay Giza [MS]: Neues Visual Studio Code Insider-Programm: Visual Studio Code – Insiders

Ab 1. Februar 2016 - Visual Studio Code - ein neues Insider-Programm. Willkommen Visual Studio Code – Insiders als eigenständiges und parallel zu Visual Studio Code laufendem Release. as heißt, ab sofort kann man sich parallel, zu dem normalen und stabilen Visual Studio Code, durch Teilnahme am Insider-Programm... [... mehr auf Giza-Blog.de]


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

codefest.at [MS]: Der Visual Studio Marketplace

Ihr sucht Extensions für Visual Studio, Visual Studio Team Services (früher Visual Studio Online), oder Visual Studio Code, die euch die Arbeit erleichtern? Oder ihr habt selbst eine coole Extension für eines dieser Produkte entwickelt und wollt diese mit der Community teilen? Dann ist der neue Visual Studio Marketplace wohl nun die erste Anlaufstelle für euch.

Der Marketplace ist als offene Plattform für Software Teams gedacht, die sich eine massgeschneiderte Tools-Umgebung innerhalb der Visual Studio Familie (selbst) schaffen möchten. Gerade im Bereich der Visual Studio Team Services ist hier aufgrund der Thematik ein weites Feld von Erweiterungsmöglichkeiten gegeben und die massgeschneiderte Lösung aus einer Hand wird - in diesem Bereich - nur schwerlich zu finden sein. Es empfiehlt sich also (zumindest) ein Anreichern der eigenen Umgebung mittels dem Marketplace.

Ihr findet den Marketplace unter dieser URL: https://marketplace.visualstudio.com/

clip_image001

Hier könnt ihr gleich auf euer Lieblingsprodukt wechseln und eine der brandaktuellen Erweiterungen – zum Beispiel für VS Code - ausprobieren. Falls ihr noch unentschlossen seid, dann scrollt einfach ganz nach unten und verwendet -im Bereich für Visual Studio - die Suche:

clip_image002

In den anderen Bereichen hilft euch der jeweilige “see more” Button weiter.

Nichts dabei? Das kann ich mir fast nicht vorstellen, aber dann MÜSST ihr eine neue Extension entwickeln und diese zur Verfügung stellen. Dafür clickt auf „Build your own“ und ihr bekommt eine sehr gute Beschreibung, was ihr tun müsst, um gleich loslegen zu können.

Gebt acht, welches Produkt Ihr angewählt habt, bevor Ihr auf den Link klickt, denn abhängig davon kommt Ihr auf die jeweilige, passende Beschreibung, bei visual Studio führt euch der Link zu:
https://www.visualstudio.com/integrate/explore/explore-vside-vsi

clip_image004

Bei Visual Studio Team Services hierher: https://www.visualstudio.com/integrate/extensions/overview
Und “last, but not least” VS Code: https://code.visualstudio.com/docs/extensions/overview

Ich wünsche euch viel Spass mit dem Visual Studio Marketplace und ich hoffe ihr erstellt richtig coole Extensions für die Visual Studio Produkt-Familie.


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

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

Norbert Eder: Visual Studio Code Quicktipp #6 – Keine Telemetrie-Daten an Microsoft senden

In der Default-Installation werden “Telemetrie”-Daten an Microsoft gesendet. Nicht jeder möchte diese Daten preis geben und kann dies auch deaktivieren. Dazu ist ins Verzeichnis %PROGRAMFILES(X86)%\Microsoft VS Code\resources\app zu wechseln.

In der Datei product.json findet sich die Einstellung enableTelemetry. Diese ist auf false zu setzen und es werden keine Nutzungsdaten mehr an Microsoft übermittelt.

In den Benutzereinstellungen unter File | Preferences | User Settings findet sich auch noch ein Setting telemetry.enableCrashReporter. Dieses ist auf true gestellt und sendet dadurch bei Abstürzen Crash Reports an Microsoft. Durch ein

"telemetry.enableCrashReporter": false

kann dies ebenfalls deaktiviert werden.

Nächster Tipp: Visual Studio Code Quicktipp #7 – Speicherort einer Datei in Explorer anzeigen

The post Visual Studio Code Quicktipp #6 – Keine Telemetrie-Daten an Microsoft senden appeared first on Norbert Eder.

Marco Scheel: Links for 2016-02-01 [del.icio.us]

codefest.at [MS]: Coden wie der Blitz–Challenge 7: Für die Leseratten

Mit etwas Verspätung wegen Krankheit kommt nun wieder eine neue Challenge aus unserer “Coden wie der Blitz”-Serie. Diesmal haben wir etwas für Leseratten!

WP_20160201_11_41_21_Pro (2)

Aufgabe:

Schreibe eine Methode die eine 13 stellige ISBN in eine 10 stellige ISBN umrechnet, sowie eine zweite Methode, die das in die andere Richtung beherrscht (). Dazu baut ihr noch ein sehr einfaches User Interface, die eine ISBN Nummer entgegen nimmt und die konvertierte ISBN Nummer anzeigt.

Ihr könnt die Lösung entweder in C# oder in JavaScript schreiben. Unsere Auflösung wird in HTML/JavaScript gepostet werden. Das lässt sich übrigens auch hervorragend mit Visual Studio Code ausprogrammieren.

Tipp: https://de.wikipedia.org/wiki/Internationale_Standardbuchnummer

Schickt uns, wie gehabt, die Lösung oder einen Link zur Lösung an wettbewerb@microsoft.com . Die Auflösung folgt in zwei Wochen. Der Lösung der sechsten Challenge findet ihr hier.

Danke an Berndt Hamböck für die Challenge!

Habt ihr eine interessante Challenge, die mit Visual Studio in ca. 10 Minuten gelöst werden können? Schickt uns eure Challenge mit Lösung an wettbewerb@microsoft.com mit Betreff "Challenge Vorschlag". Wenn eure Challenge ausgewählt wird, bekommt ihr einen "Codezauberer" Sticker. :)

Teilnahmebedingungen und weitere Infos, findet ihr im ersten Post.

Norbert Eder: Visual Studio Code Quicktipp #5 – Insider’s channel

Viele unter uns setzen (gerne) bleeding edge Technologien ein um immer das Neueste vom Neuen zu haben, zu testen und um die Richtung einschätzen zu können. Für Visual Studio Code bestehen auch zwei Channels. Im Default werden Updates nach der Installation aus dem stable Channel bezogen. Es gibt jedoch noch einen insiders Channel.

Bitte untenstehendes Update beachten, es gab Änderungen!

Die Einstellung ist unter File | Preferences | User Settings zu finden und nennt sich update.channel. In der Datei settings.json (siehe %APPDATA%\Code\User`) kann dieser Wert überschrieben werden (diese Datei öffnet sich automatisch beim Öffnen der Benutzereinstellungen:

{
    "update.channel": "insiders"
}

Nach einem Neustart von Visual Studio Code werden Updates künftig auf dem insiders Channel geprüft.

UPDATE

Die Einstellung "update.channel": "insiders" wird offensichtlich nicht mehr unterstützt und zeigt wohl immer nur auf den stable-Channel. Um den Zugang zur Testversion zu erhalten, ist eine eigene Insiders-Version zu installieren. Diese ist auf der hier bezogen werden.

Die Installation erfolgt parallel zu einer vorhandenen Stable-Installation. Nett: An den Icon-Farben können die Versionen unterschieden werden: blau entspricht der Stable-Version, grün ist die Insiders-Version.

Nächster Tipp:
Visual Studio Code Quicktipp #6 – Keine Telemetrie-Daten an Microsoft senden

The post Visual Studio Code Quicktipp #5 – Insider’s channel appeared first on Norbert Eder.

Christian Binder [MS]: Bing Continuous Delivery – Engineering Story

Real World : Continuous Delivery bei Bing

Interessante Aspekte aus dem Engineering und der “DevOps Culture” z.B.:

Inner Loop: The loop that spans ideation through code commit, and most often centers on an engineer writing the code for a given feature. Because engineers require an idea from which to design and build a feature, this loop also includes prototyping, crowd-sourced feature engagement and feasibility studies.

Outer Loop: This is the loop that gets committed code out to Production. Because a feature is not really finished until we have successfully navigated live user trials, our experimentation-centered culture requires that we consider the cost of flighting features within this loop.

http://stories.visualstudio.com/bing-continuous-delivery/

Chris

Marco Scheel: Links for 2016-01-31 [del.icio.us]

  • Object moved
    Securely moving a service to the cloud while meeting compliance obligations can seem difficult and complex. But in reality, it can be done quite simply with some basic understanding about core security requirements either implemented on your behalf by Azure solutions or enabled quickly by you. via Po
  • Missing link - IFTTT
    via Pocket
  • GitHub - caesar0301/awesome-public-datasets: An awesome list of high-quality open datasets in public domains (on-going).
    This list of public data sources are collected and tidied from blogs, answers, and user responses. Most of the data sets listed below are free, however, some are not. Other amazingly awesome lists can be found in the awesome-awesomeness and sindresorhus's awesome list. via Pocket
  • AWS Certificate Manager
    AWS Certificate Manager is a service that lets you easily provision, manage, and deploy Secure Sockets Layer/Transport Layer Security (SSL/TLS) certificates for use with AWS services. via Pocket
  • Developer Submission: Mokit - a Screenshot tool for developers - WMPoweruser
    Mokit enables you to quickly wrap app screenshots in device artwork. This provides better visual context for your app screenshots on your website or in other promotional materials. Create gorgeous images for your Store page in minutes. Android iPhone and Windows devices are available. via Pocket
  • m.signalvnoise.com
    Why I work remotely (hint: it has nothing to do with productivity). via Pocket

Code-Inside Blog: Working with FontIcons in UWP

FontIcons in UWP

Microsoft ships one builtin UWP (Universal Windows Platform) SymbolIcon class.

The good thing about such FontIcons is, that you can scale and change the appearances very nice and don’t need a bunch of image assets for your icons.

The down side is, that those icons are just a font… so no multicolor option.

The builtin SymbolIcon usage is pretty easy:

<SymbolIcon Symbol="Accept" />

Using FontIcon to serve other font e.g. FontAwesome

Microsoft ships another simple class, the FontIcon class. The usage is pretty simple if you know the correct syntax:

<FontIcon FontFamily="./fontawesome.otf#FontAwesome" Glyph="&#xf0b2;"></FontIcon>

The Glyph-Property is the HexCode for the target char.

Pretty important, but I’m not a Font-Expert, so maybe this is “normal” - The #FontAwesome must be set. - In XAML the Glyph must be in this form

"&#xf0b2;"
  • From Code, the value must be unicode, e.g.

    Test.Glyph = “\uf0b2”;

And of course, the font must be included in the project as Resource.

Result

The result is hopefully that you see the correct icon… right?

BTW, we try to bring FontAwesome to UWP with a simple NuGet package.

And thanks to Alexander Witkowski for the suggestion of the FontIcon class - I didn’t know that this is part of the SDK.

codefest.at [MS]: Azure BLOB Storage nutzen

Die meisten Applikationen benötigen einen Platz zum Speichern von Daten. Je nach Datentyp, Datenmenge, Zugriff und der damit verbundenen Methode zum Zugriff auf die Daten können verschiedenste Speichermodelle eingesetzt werden. Mit den Azure Services kommen neben den herkömmlichen Varianten weitere, neue Mechanismen hinzu, die genutzt werden können. Dieser Artikel befasst sich mit Zugriff auf Azure BLOB Storage.

Wofür BLOB?

BLOB steht für Binary Large OBject. Darunter versteht man große, binäre Objekte, wie etwa Dateien oder andere unstrukturierte Daten. BLOBs werden im Regelfall nicht in (klassischen) Datenbanken gespeichert und können nicht oder nur mit viel Aufwand strukturiert gespeichert werden.

Azure Storage Blobs eignet sich also vor allem zum Persistieren von etwa Dateien: (Viele) völlig unterschiedliche Daten, die sicher in der Cloud gespeichert werden sollen. Der Zugriff darauf kann mit Tools, wie etwa dem Azure Storage Explorer oder vielen weiteren Tools (siehe etwa auch Jürgens Tipp hier) erfolgen, oder natürlich mit eigenem Code in der eigenen App. Hier geht es darum, eigenen Code zu verwenden.

Dieses kleine Tutorial führt duch die Verwendung von Azure Storage Blob. Auch wenn wir hier bereits in einigen Artikeln über die Verwendung von BLOBs geschrieben haben, möchte ich hier ein Code-Update und eine aktuelle Zusammenfassung für die eigene Verwendung posten.

Das Konzept von BLOB Storage

BLOB Storage ist so organisiert, dass die Inhalte (Files) in einem Container liegen müssen, die wiederrum einem Storage Account zugeordnet sind (siehe hier).

image

Der Zugriff auf einen BLOB erfolgt über einen HTTP-Request in diesem Format:
http://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>

also etwa:
http://sally.blob.core.windows.net/movies/MOV1.AVI

Für die Benennung von Containern gibt es einige Regeln, wie etwa “alles kleinschreiben”, keine Sonderzeichen, 3 bis 63 Zeichen nur mit Buchstaben, Nummern und dem Dash (-“) Zeichen. Auch für die Blob-Files gelten besondere Regeln, wie etwa “Blob names are case-sensitive”. Alle Regeln finden sich hier.

Gehen wirs’ an.

Projekt erstellen

Zunächst wird ein neues Projekt in Visual Studio 2015 angelegt. Dabei wird das Template Visucal C# – Cloud – QuickStarts – Data Services – Azure Storage: Blobs ausgewählt.

image

Der Wizard generiert ein Projekt. Dabei werden Referenzen zu den erforderlichen Bibliotheken hinzugefügt (wie etwa die Microsoft.WindowsAzureStorage Referenz).

image

Nach dem ersten Compile werden die NuGet Packages automatisch nachgeladen.

Packages aktualisieren

Alternativ – etwa bei bestehenden Projekten - können die Bibliotheken natürlich auch selbst im NuGet Package Manager hinzugefügt werden… (die Suche nach Azure bringt die Storage-Bibliothek gleich am Anfang der Liste), oder in der Package Manager Console mit Install-Package WindowsAzure.Storage geladen werden.

image

Der NuGet Package Manager kann auch verwendet werden, die installierte Version und alle Abhängigkeiten gleich zu aktualisieren – was ich sogleich getan habe. Damit werden die Pakete im \packages Verzeichnis sogleich aktualisiert und hier ist das Update auf WindowsAzure.Storage.6.2.0 erfolgt. Das Beispielprojekt kann wieder compiliert werden, somit haben wir gute Voraussetzungen.

Cloud Explorer

Am einfachsten ist das Erstellen von Ressourcen mit dem integrierten Cloud Explorer. Der Cloud Explorer kommt mit dem Microsoft Azure SDK for .NET (VS 2015) - 2.7 oder 2.8 mit. Die Installation erfolgt mit dem Web Platform Installer.

image

Blob Container erstellen und verwenden

Der Cloud Explorer integriert sich in Visual Studio (siehe auch hier, in Welcome to Visual Studio 2015 with Azure! oder Azure Tools). Hiermit wird ein neuer Container “documents” erstellt.

image image

Dieser kann auch gleich verwendet werden:

image

Somit werden gleich ein paar Files upgeloadet (Multi Select klappt):

image

Schön dabei ist die Integration und auch die Anzeige der File Properties.

image

Die Demo Files können mit dem Cloud Explorer verwaltet werden.

image

Soweit so gut. Dieser Exkurs dient zum Verständnis, dass sich Azure Blob Storage ähnlich wie ein Filesystem verhält.

Alles lokal?

Vorerst ja. Der Azure-Speicheremulator bietet eine lokale Umgebung, die die Azure-Dienste für Blobs, Warteschlangen und Tabellenspeicher für Entwicklungszwecke emuliert. App.config verwendet in dem Beispiel UseDevelopmentStorage=true.

image

Im realen Betrieb müssen dann nur der ConnectionString zum “echten” Azure Storage Endpoint getauscht werden (der Key steht darunter und muss nur auskommentiert und angepasst werden).

Let it run

Das Beispiel-Projekt kann sofort ausgeführt werden (F5). Der Output zeigt auch gleich, was hier drin passiert: Files werden in neue azure Blob-Container upgeloadet, angezeigt, downgeloadet und wieder gelöscht.

image

Die Main Methode in Program.cs ruft zwei Methoden zur Demonstration für den Blob-Zugriff auf:

  • BasicStorageBlockBlobOperationsAsync().Wait();
  • BasicStoragePageBlobOperationsAsync().Wait();

image

Drei BLOB-Typen: Block, Page, Append

Azure BLOB Storage kennt drei verschiedene BLOB-Typen. Somit möchte ich hier über den Unterschied der beiden verwendeten Methoden im Beispiel informieren und die Arten der Blob-Speicher kurz beschreiben. Dabei ist wichtig, dass der Typ eines Blobs beim Erstellen bestimmt wird und nicht mehr geändert werden kann.

  1. Block-Blobs sind ideal zum Speichern von Text- oder Binärdateien, also etwa für Dokumente und Mediadaten. Block-Blobs bestehen aus Blöcken von bis zu 4MB, von denen jeder durch eine Block-ID identifiziert wird. Zum Ändern müssen also bestimmte Blöcke geschrieben und mit Commit ausgeführt werden. Ein Block-Blob kann bis zu 50.000 Blöcke enthalten, somit ist die maximale Größe eines Block-Blobs etwa 195 GB (4MB * 50.000 Blöcke).
  2. Page-Blobs bestehen aus 512-Bytes-Seiten und sind für zufällige Lese- und Schreibzugriffe optimiert. So verwenden etwa Virtuelle Azure-Computer Page-Blobs für Betriebssystem und Datenträger. Beim Erstellen muss eine maximale Größe, etwa 2 * 512 Bytes = 1024 Bytes, angegeben werden. Ein Schreibvorgang erfolgt unter Angabe eines Offsets und kann nur eine Seite, mehrere Seiten oder bis zu 4 MB des Seiten-BLOB überschreiben und es wird kein zusätzliches Commit benötigt. Die maximale Größe für ein Page-Blob beträgt 1 TB.
  3. Append-Blobs bestehen aus Blöcken, die für das kontinuierliche Hinzufügen von Daten optimiert sind, etwa für Logfiles und ähnliche Anwendungen. Das Aktualisieren oder Löschen von vorhandenen Blöcken wird nicht unterstützt, nur das Anhängen von Daten. Die Block-ID ist nicht sichtbar. Die maximale Größe beträgt ebenso 195GB.

Für detaillierte Infos siehe Grundlegendes zu Block-BLOBs, Anhang-BLOBS und Seiten-BLOBs und Verwenden des Blob-Speichers mit .NET.

Wie funktionieren Block-Blobs?

Sehen wir uns die Funktionsweise von BasicStorageBlockBlobOperationsAsync an:

  • Der Beginn des Codes kümmert sich um den storageAccount und dass der Container existiert.
    image
  • Für den Zugriff wird zunächst ein storageAccount aus dem ConnectionString erzeugt.
    CloudStorageAccount storageAccount = CreateStorageAccountFromConnectionString(…);
  • Danach wird ein blobClient erstellt und es wird versucht, eine Referenz auf den Container “democontainerblockblob” zu erstellen.
  • Im Try-Block wird versucht, den Container zu erstellen. Dies erfolgt direkt in der Storage-Bibliothek in einer CloudBlobContainer Methode.
    image
  • Wenn die Voraussetzungen erfüllt sind (sprich, der Container “democontainerblockblob” existiert) gehts weiter im Code.
    image
  • Nun wird ein neues CloudBlockBlob Objekt erzeugt und es wrd versucht, dieses asnychron upzuloaden.
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(ImageToUpload);
    await blockBlob.UploadFromFileAsync(ImageToUpload, FileMode.Open);

    Beim Upload wird auch das Commit durchgeführt. Das wars mit dem Upload.
  • Die Anzeige erfolgt ebenso einfach mit der ListBlobs() Methode und einer foreach Schleife:
    foreach (IListBlobItem blob in container.ListBlobs())
    {
        // Blob type will be CloudBlockBlob, CloudPageBlob or CloudBlobDirectory
        // Use blob.GetType() and cast to appropriate type to gain access to properties specific to each type
        Console.WriteLine("- {0} (type: {1})", blob.Uri, blob.GetType());
    }
  • Der Download kann mit der DownloadToFileAsync Methode erfolgen:
    await blockBlob.DownloadToFileAsync(string.Format("./CopyOf{0}", ImageToUpload), FileMode.Create);
    Das Ergbnis zeigt die downgeloadete Datei im bin Folder:
    image
  • Und danach wird das Demofile gelöscht:
    await blockBlob.DeleteAsync();

In diesem Beispiel sieht man, dass der Zugriff dank der Storage-Class sehr einfach erfolgt.

Wie funktionieren Page-BLOBs?

Methode BasicStoragePageBlobOperationsAsync funktioniert analog zu Beispiel Block-Blob, nur mit dem Unterschied, dass hier dieser Blob-Typ verwendet wird.

  • Wie zuvor wird der storageAccount erzeugt und der Container “democontainerpageblob” existiert. (Hier wird ein eigener Container verwendet).
    image
  • Neu hier ist das Erstellen des pageBlob mit 1024 Bytes maximale Größe.
    CloudPageBlob pageBlob = container.GetPageBlobReference(PageBlobName);
    await pageBlob.CreateAsync(512 * 2 /*size*/); // size needs to be multiple of 512 bytes
  • Hier werden 512 Zufalls-Bytes hineingeschrieben:
    byte[] samplePagedata = new byte[512];
    Random random = new Random();
    random.NextBytes(samplePagedata);
    await pageBlob.UploadFromByteArrayAsync(samplePagedata, 0, samplePagedata.Length);

    Es ist kein Commit erforderlich.
    image
  • Im Code geht es mit der Anzeige, Download und Löschen weiter:
    image
  • Das Anzeigen passiert dann seitenweise, solange Inhalt (resultSegment) des pageBlob Elements vorhanden ist:
    BlobContinuationToken token = null;
    do
    {
        BlobResultSegment resultSegment = await container.ListBlobsSegmentedAsync(token);
        token = resultSegment.ContinuationToken;
        foreach (IListBlobItem blob in resultSegment.Results)
        {
            // Blob type will be CloudBlockBlob, CloudPageBlob or CloudBlobDirectory
            Console.WriteLine("{0} (type: {1}", blob.Uri, blob.GetType());
        }
    } while (token != null);
  • Das Downloading erfolgt ähnlich wie zuvor:
    int bytesRead = await pageBlob.DownloadRangeToByteArrayAsync(samplePagedata, 0, 0, samplePagedata.Count());
  • Das Löschen ebenso:
    await pageBlob.DeleteAsync();

Der Zugriff auf PageBlob ist somit nicht ganz so einfach wie auf Block-Blobs. Das Demo zeigt aber die grundsätzliche Herangehensweise.

Fazit

Das generierte Beispiel aus den QuickStarts zeigt die grundsätzliche Verwendung von BLOB-Storage in eigenen Projekten. Die Verwendung von großen Files und Permissions auf die Files bleiben hier Außen vor, aber der Zugriff erfolgt sehr einfach.

Je nach Anforderung kann der Einsatz von Block-, Page- oder Append-Blobs in der eigenen Anwendung Sinn machen. Weitere Informationen über die Vewendung von Blob-Storage aus Code gibt es hier und hier.

Viel Spaß beim Experimentieren mit Azure BLOB Storage!

Fabian Deitelhoff: Teil 3 – Der Raspberry Pi 2 als Mediacenter mit OSMC (Installation)

Die organisatorischen Dinge, Änderungen beim Raspberry Pi 2 und die Hardware für ein Mediacenter sind mittlerweile klar und wurden in den vorherigen beiden Teilen der Serie behandelt. In diesem Beitrag geht es rein um die Installation von OSMC und die anschließende Inbetriebnahme. Denn bevor es überhaupt so richtig mit dem Mediacenter losgehen kann, muss die Basis auf der SD Karte dafür geschaffen werden. Die Installation ist aus der Sicht von Windows 10 geschrieben. Für andere Plattformen gibt es ähnliche Möglichkeiten. Die Inbetriebnahme umfasst das erstmalige Starten von OSMC auf dem Raspberry Pi 2. Die Konfiguration wird anschließend in den weiteren Teilen der Serie beschrieben.

Dieser Blogpost ist Teil einer Serie zum Thema “Der Raspberry Pi 2 als Mediacenter mit OSMC”. Im Rahmen dieser Serie sind die folgenden Teile erschienen. Der jeweils aktuelle Beitrag ist hervorgehoben.

  1. Teil – Der Raspberry Pi 2 als Mediacenter mit OSMC (Einführung)
  2. Teil – Der Raspberry Pi 2 als Mediacenter mit OSMC (Hardware)
  3. Teil – Der Raspberry Pi 2 als Mediacenter mit OSMC (Installation)

Wer ein Mediacenter mit dem Raspberry Pi 1 einrichten möchte, wird eventuell bei der vorherigen Serie zum Thema fündig. Zumindest was die Hardware anbelangt. Der Teil zur Software ist wieder in der aktuellen Serie relevant.

OSMC

Bevor wir uns um die konkrete Installation kümmern können, steht der Download der notwendigen Dateien an. In diesem Fall OSMC, für das ich mich vor einiger Zeit entschieden hatte. Wie ich im ersten Teil zur Serie schon geschrieben hatte, ist OSMC nur eine Möglichkeit, Kodi zu installieren. Kodi ist die eigentliche Mediacenter-Software, die für uns das Abspielen zum Beispiel der Videodateien übernimmt. OSMC ist eine der sogenannten einfachen „Kodi zentrischen Distributionen„, um Kodi auf den Raspberry Pi zu bringen. Zu OpenELEC werde ich, zu einem späteren Zeitpunkt, auch noch etwas schreiben.

Kodi ist mittlerweile auch als native Anwendung für Windows und viele weitere Betriebssysteme verfügbar. Es soll also auch unter Windows und Co. direkt laufen. Das gucke ich mir später einmal genauer an und werde dazu auch noch einen Beitrag schreiben. Aber alles der Reihe nach. :)

Notwendige Dateien

OSMC lässt sich ganz einfach in den verschiedenen Versionen von der Webseite herunterladen. Auf der Webseite bitte unter der Rubrik Installation und das Installationspaket für euer Betriebssystem aussuchen. Dadurch bekommt ihr das Hilfsprogramm, das euch bei der Installation von OSMC auf einem von OSMC unterstützten Geräte hilft. Unter Windows ist das eine ausführbare Datei mit der Endung .exe.

Mehr gibt es zu den notwendigen Dateien auch schon nicht zu sagen. Das Hilfsprogramm erledigt ziemlich viel für uns, wie der nächste Abschnitt zeigt. Beispielsweise den Download des OSMC-Images, das dann auf die SD Karte gespielt wird.

Installation

Nach dem Download die ausführbare Datei bitte starten, bis das Hilfsprogramm gestartet ist und uns herzlich willkommen heißt (Abbildung 1). Dort lässt sich aktuell nur Englisch als Sprache auswählen. Im zweiten Auswahlfeld bitte das Gerät auswählen, auf dem ihr OSMC installieren möchtet. Wer dieser Anleitung folgt wählt bitte den Eintrag Raspberry Pi 2 aus. Nach einem Klick auf den Pfeil nach rechts, erscheint die Abfrage der Version, die installiert werden soll (Abbildung 2). Dort ergibt es Sinn immer die aktuellste Version auszuwählen. Beim Schreiben dieses Beitrags war das die Version 2015.12-4. Möglicherweise gibt es mittlerweile schon eine neuere Version. Dann bitte die nutzen. Weiter geht’s mit der Auswahl des Mediums, auf dem OSMC letztendlich installiert werden soll (Abbildung 3). Da der Raspberry Pi 2 eine SD Karte besitzt, ist das in diesem Fall die logische Wahl.

Abb. 1: Auswahl der Sprache und des Geräts. Abb. 2: Auswahl der Version, die installiert werden soll. Abb. 3: Das Medium, auf dem OSMC installiert werden soll.

Jetzt folgen einige Einstellungen, bevor OSMC auf dem Gerät installiert wird. Sehr schön ist, dass wir auswählen können, ob wir den Raspberry Pi 2 nach der Installation über ein Netzwerkkabel (Abbildung 4) oder über WLAN (Abbildung 5) an unser Netzwerk anschließen möchten. Dieser Konfigurationsschritt vereinfacht tatsächlich einiges. Wer dennoch manuell für die richtige Konfiguration sorgen möchte beziehungsweise einfach nur neugierig ist, findet in meinem Beitrag Raspberry Pi: Headless WIFI Konfiguration hoffentlich nützliche Tipps und Tricks. Aber auch das Installationsprogramm bietet eine erweiterte Netzwerkkonfiguration, die sich hinter dem Punkt „Manuelle Konfiguration“ verbirgt (Abbildung 6). Wer die Option ausgewählt hat, den Raspberry Pi 2 über WLAN ans Netzwerk anzuschließen, wird im nächsten Schritt noch um die Eingabe der notwendigen Daten gebeten (Abbildung 7). Bei mir hat das zu Testzwecken ohne Probleme funktioniert. Im Betrieb habe ich das Mediacenter allerdings über ein Netzwerkkabel angeschlossen.

Abb. 4: Den Raspberry Pi 2 über ein Netzwerkkabel anschließen. Abb. 5: Konfiguration für einen WLAN-Zugang. Abb. 6: Erweiterte Netzwerkkonfiguration (manuell). Abb. 7: Notwendige Daten für das eigene WLAN.

Damit ist die für die Installation notwendige Konfiguration abgeschlossen. Jetzt müssen wir noch das Speichermedium auswählen, auf das OSMC letztendlich installiert wird (Abbildung 8). Nachdem die Lizenz akzeptiert wurde (Abbildung 9) kann es auch schon losgehen und das Hilfsprogramm lädt das Image herunter (Abbildung 10), das zuvor ausgewählt wurde (Abbildung 2). Anschließend erfolgt noch eine letzte Warnung (Abbildung 11), da beim erstellen des Images auf dem Speichermedium logischerweise alle Daten verloren gehen.

Abb. 8: Auswahl des Speichermediums. Abb. 9: Die Lizenzbedingungen vor der Installation. Abb. 10: Das zuvor ausgewählte Image wird heruntergeladen. Abb. 11: Letzte Warnung vor dem Schreiben der Daten auf das Speichermedium.

Damit sind alle Schritte, die wir manuell beeinflussen können, abgeschlossen. Das Hilfsprogramm schreibt das Image auf das Speichermedium (Abbildung 12) und zeigt zum Abschluss noch eine Meldung an (Abbildung 13). Das war es aber auch schon. OSMC ist installiert und bereit für den ersten Start.

Abb. 12: OSMC wird auf dem Speichermedium installiert. Abb. 13: Glückwunsch! OSMC wurde erfolgreich installiert.

Wer sich jetzt noch darum kümmern möchte den vollen Speicherplatz der SD Karte auch unter OSMC nutzen zu können, der kann gerne bei meinem Beitrag „Raspberry Pi: Speicherplatz der SD-Karte ausnutzen“ vorbeischauen. Den habe ich noch für den Raspberry Pi mit Raspbmc geschrieben.

Inbetriebnahme

Beim ersten Start des Raspberry Pi 2 läuft die Erstinstallation von OSMC vollautomatisch. Im vorherigen Schritt wurden nämlich nur die notwendigen Dateien auf die SD Karte kopiert, OSMC aber noch nicht tatsächlich installiert. Ich habe dazu den Raspberry Pi direkt an meinen Fernseher angeschlossen und mit LAN und Strom verbunden. Den richtigen HDMI Eingang am Fernseher vorausgesetzt, können wir diese Installation auch live beobachten.

Zur Installation gehören die folgenden Schritte:

  1. Formatieren und Partitionieren des Speichermediums
  2. Installation von OSMC
  3. Automatischer Neustart des Raspberry Pi
  4. Start des Linux Betriebssystems und direkt im Anschluss OSMC
  5. Initiale Konfiguration

Der fünfte Schritt läuft nicht vollautomatisch ab. Darum müssen wir uns kümmern. Hört sich schlimmer an als gedacht, aber viele Schritte sind dazu nicht notwendig. Die Konfiguration ist Menügeführt. Ihr könnt dazu direkt eine Maus und Tastatur über USB an den Raspberry Pi anschließen, wenn ihr das besser findet. Für die nachfolgenden Schritte der weiteren Teile dieser Serie ist das sicherlich nicht verkehrt. Ich führe die Installation meistens über die Fernbedienung meines Fernsehers durch, da ich erst einmal überprüfe, ob überhaupt alles geht, bevor ich irgendetwas anschließe. So kann ich ausschließen, dass Fehler nicht durch die Maus, Tastatur oder die USB-Anschlüsse verursacht werden. Bei meinem Philips 42 PFL 7686/02 funktioniert die Fernbedienung in Zusammenhang mit dem Raspberry Pi ohne Probleme.

Zur Konfiguration gehören die folgenden Schritte:

  1. Sprache der Oberfläche
  2. Zeitzone
  3. Name für das Gerät
  4. SSH für den Fernzugriff erlauben
  5. Akzeptieren der Lizenz
  6. Look & Feel (OSMC + Klassisch)
  7. Newsletter

Als Name ich ich für mein Gerät ganz simpel „Mediacenter“ ausgewählt. Dadurch weiß ich immer sofort, um welchen Raspberry Pi 2 es sich handelt. Den SSH Zugriff habe ich aktiviert gelassen, was der Standardeinstellung entspricht. Dazu kommen wir später noch einmal genauer. Beim Look & Feel stehen nur zwei Designs zur Auswahl bereit. Ich habe es beim OSMC Design belassen, da ich später sehr wahrscheinlich noch ein anderes Theme auswähle. Dazu aber in einem weiteren Teil der Serie die Details.

Nachdem diese Konfiguration erledigt ist, startet die Oberfläche von OSMC und führt direkt einige Aktualisierungen durch. Insbesondere die vorinstallierten Add-Ons aktualisieren sich, was nicht ganz unwichtig ist. Dabei erscheint, zumindest bei mir, noch die Meldung, dass das Add-On TheAudioDB nicht mehr kompatibel ist und OSMC fragt, ob es deaktiviert werden soll. Zur Sicherheit habe ich das gemacht.

Die komplette Prozedur der Inbetriebnahme dauert in der Regel nicht länger als 5-10 Minuten. Je nachdem, wie schnell das Speichermedium ist, wie schnell die Aktualisierungen für die Add-Ons heruntergeladen sind und natürlich auch wie schnell ihr Einstellungen auswählt und Namen eintippt. Alles in allem aber eine schnelle Angelegenheit.

Zwischenfazit

Jetzt am Ende des dritten Teils der Serie sind wir ein Stück weiter. Die Hardware steht und die Software ist grundsätzlich installiert. Durch den erstmaligen Start des Raspberry Pi 2 mit installierten OSMC, konnten wir ebenfalls die ersten Einstellungen vornehmen. Das war natürlich noch nicht alles. Einige Schritte zu einem fertigen Mediacenter fehlen uns noch, auch wenn das nicht allzu viele sind beziehungsweise die Teilschritte an sich relativ überschaubar sind.

Im vierten und nächsten Teil der Serie geht es um die anfängliche Konfiguration der Quellen. Ich beschreibe, wie ich mein NAS eingerichtet habe, um davon Videos, Bilder und Musik abspielen zu können. Nach diesem vierten Teil ist das Mediacenter dann auch praktisch Einsatzbereit, denn es lassen sich verschiedene Inhalte mit verschiedenen Formaten aus verschiedenen Quellen abspielen. Also im Grunde genau das, was im Kern ein Mediacenter ausmacht.

Bevor ich auf weitere Software eingehe, ein Wunsch war zum Beispiel OpenELEC, werde ich diese Serie erst einmal komplett zu Ende bringen und dann Alternativen einstreuen. Nicht nur zur Software, sondern auch zur Hardware. So zumindest mein aktueller Plan. Anschließend möchte ich mich gerne um externe Geräte kümmern, die in vielen anderen Anleitungen außen vor gelassen werden. Beispielsweise CD- beziehungsweise DVD-Player. Mal schauen, ob das klappt und wie sich das entwickelt.

Bis dahin aber vielen Dank für die zahlreichen Rückmeldungen! Das Feedback, egal ober per Kommentar oder per E-Mail, hilft mir sehr, diese Serie für euch nützlich weiterzuführen.

Holger Schwichtenberg: Auslesen und Sortieren von GPX-Dateien

Die Windows PowerShell biete eine schnelle Lösung für die Aufgabe, eine größere Menge von XML-Dateien zu sortieren.

Norbert Eder: DNU – .NET Development Utility

Bei DNU handelt es sich um ein Commandline Werkzeug, das hilfreiche Funktionen für die Entwicklung zur Verfügung stellt.

Wie ich bereits zu DNX beschrieben habe, benötigt ein DNX-Projekt eine Datei project.json, welche das Projekt beschreibt und worin auch Abhängigkeiten beschrieben werden.

Neben DNU und DNX gibt es auch noch den .NET Version Manager DNVM.

Mit DNU können nun diese Abhängigkeiten (Pakete) verwaltet werden. Im Hintergrund arbeitet übrigens NuGet.

Um alle möglichen Befehle zu erhalten, muss DNU ohne Parameter oder mit dem Parameter -h ausgeführt werden:

.NET Deployment Utility

.NET Deployment Utility

Sehen wir uns das im Zuge eines Beispielprojektes an.

Für dieses Beispiel wird davon ausgegangen, dass yeoman und der ASP.NET Generator installiert sind (kann hier nachgelesen werden).

Via yo aspnet wird in einem beliebigen Verzeichnis eine ASP.NET application angelegt, nennen wir sie dnutest. Wechseln wir nach der Anlage in das neue Verzeichnis und sehen uns die Datei project.json an, sehen wir folgende Abhängigkeiten:

"dependencies": {
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.Sqlite": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Dnx.Runtime":"1.0.0-rc1-final",
    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final"
  }

Damit wir sie verwenden können, müssen die jeweiligen Pakete noch bezogen werden. Hierzu rufen wir in der Commandline (im Verzeichnis in dem auch die project.json zu finden ist) den Befehl dnu restore auf.

Mit einem anschließenden dnu build wird das gesamte Projekt neu erstellt und kann mit dnx web gestartet werden.

Werden nun neue Abhängigkeiten in die project.json eingetragen, ist besagtes dnu restore aufzurufen.

Eine andere Möglichkeit, Abhängigkeiten hinzuzufügen ist die Installation von Paketen aus der Commandline:

dnu install newtonsoft.json

Damit wird Newtonsoft.Json installiert und automatisch der Datei project.json hinzugefügt.

Mit dnu wrap myproj.csproj kann aus der angegebenen Projekt-Datei ein project.json generiert werden und sieht dann so aus:

{
  "version": "1.0.0-*",
  "frameworks": {
    "net45": {
      "wrappedProject": "../../Sample/Sample.Tools.csproj",
      "bin": {
        "assembly": "../../Sample.Tools/obj/{configuration}/Sample.Tools",
        "pdb": "../../Sample.Tools/obj/{configuration}/Sample.Tools"
      }
    }
  }
}

Das kann nun in die ursprüngliche project.json übernommen werden. Der Vorteil: eigene Projekte/Bibliotheken können so eingebunden werden, ohne ein Package dafür generieren und bereitstellen zu müssen.

Für den Umgang mit Packages empfiehlt sich ein Blick auf die Parameter pack, packages und publish.

The post DNU – .NET Development Utility appeared first on Norbert Eder.

Holger Sirtl: Azure News on Friday (KW04/16)

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

Aktuelle Neuigkeiten

Datum Nachricht
28.01. Machine Learning in Azure Security Center
Einsatz von Azure Machine Learning im Azure Security Center (proaktive Infos zur Sicherheit von Azure Umgebungen)
27.01. Application Insights announces availability of Release Annotations
Release Annotations jetzt in Application Insights nutzen
27.01. For Developers: Important upcoming changes to the v2.0 Auth Protocol
Wichtig für Nutzer des v2.0 App Models zur Auth via Azure AD : Breaking Changes in anstehenden Aktualisierungen
27.01. Azure Media Player update with a 33% size reduction
Der neue Azure Media Player in Version 1.6.1 mit einer Größenreduzierung um 33%!
26.01. (Cross-Post) Announcing Azure Storage Data Movement Library 0.2.0
Storage Data Movement Library 0.2.0 - alles, was man zum Kopieren, Verschieben von Daten in Azure Storage braucht
26.01. File management with Azure Mobile Apps
File Handling (z.B. Backup & Recovery) in Azure App Service Mobile Apps
26.01. The first Technical Preview of Microsoft Azure Stack announced
Viele Azure Services im eigenen Rechenzentrum - Azure Stack als Technical Preview ab 29. Januar verfügbar!!!
26.01. Guidelines for Publishing to the Cortana Analytics Gallery
Informationen zu den Möglichkeiten, eigenen Content in die Cortana Analytics Gallery einzustellen
26.01. Announcing the first Technical Preview of Microsoft Azure Stack
Azure im eigenen Rechenzentrum - die erste Technical Preview für Azure Stack ist verfügbar!
26.01. Progress update: Node.js SDK for Azure App Service Mobile Apps
Informationen zum aktuellen Stand des Node.js SDK für Azure App Service Mobile Apps
25.01. Use Dynamic Data Masking to obfuscate your sensitive data
Dynamic Data Masking zum Schutz sensitiver Daten in Azure SQL Database nutzen

Neue Kurse in der MVA

Datum Nachricht
28.01. Build and Deploy Applications with the Microsoft App Platform
Implementierung und Deployment von Anwendungen in die Microsoft Azure Plattform
28.01. Secure Anywhere Access to Windows Apps
Über Azure RemoteApp sicheren Zugriff auf Line-of-Business Anwendungen herstellen
28.01. Take a Modern Approach to Data in Your Apps
Tipps zum Speichern und Finden von Daten in eigenen Apps mit Azure SQL Database, DocumentDB und Azure Search

Neue Videos

Datum Nachricht Video
27.01. Tuesdays with Corey: Troubleshooting and Diagnostics for VMs in Azure
Probleme in einer Azure Virtual Machine ? Corey Sanders mit einem Überblick zu Troubleshooting-Möglichkeiten
26.01. Indexing Blobs in Azure Search
Inhalte aus Azure Blob Storage (HTML, PDF, PowerPoint etc.) in einen Azure Search Index aufnehmen

Norbert Eder: Visual Studio Code Quicktipp #4 – Dateien schnell öffnen

Wer den ReSharper verwendet, kennt eventuell den Shortcut STRG+SHIFT+T um schnell zu einer bestimmten Datei zu navigieren.

Visual Studio Code besitzt diese Funktionalität auch, allerdings unterscheidet sich der Shortcut: STRG+P und die ersten Zeichen des gewünschten Dateinamens eingeben, auswählen + ENTER. Voilà. Die gesuchte Datei muss allerdings Teil des aktuellen Projektes sein.

Nächster Tipp: Visual Studio Code Quicktipp #5 – Insider’s channel

The post Visual Studio Code Quicktipp #4 – Dateien schnell öffnen appeared first on Norbert Eder.

Kay Giza [MS]: Liste der Visual Studio Code Extensions und Themes - Januar 2016 Report

Ich habe eine Liste für Visual Studio Code erstellt, mit allen vorhandenen Extensions Stand heute 28.01.2016. Natürlich kann man auch im Visual Studio Marketplace schauen oder in Visual Studio Code via F1 und ext install und sich die nützlichsten Extensions heraussuchen. Da es oben genannten Möglichkeiten zur Extension-Suche gibt, habe ich mir hier die Kurzbeschreibungen zu den Extensionen gespart und nur eine Liste erstellt, viel Spaß beim Durchstöbern! Nächste Liste gibt es Ende Februar wieder! [... mehr in diesem Blogartikel auf Giza-Blog.de]


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

Norbert Eder: Visual Studio Code Quicktipp #3 – Keyboard Shortcuts verwalten

Nachdem Visual Studio Code gestartet wurde, können über File | Preferences | Keyboard Shortcuts die Default Keyboard Shortcuts geöffnet werden.

Visual Studio Code Keyboard Shortcuts

Visual Studio Code Keyboard Shortcuts

Nach dem Öffnen teilt sich das Fenster in zwei Editoren. Auf der linken Seite finden sich die aktuellen Shortcuts. Hier kann man sich einen Überblick der vorhandenen Möglichkeiten verschaffen.

Auf der rechten Seite wird die Datei keybindings.json aus %APPDATA%\Code\User geöffnet. Darin können eigene Bindings definiert, oder überschrieben werden. Hier eines der bestehenden Beispiele:

{ 
  "key": "escape",
  "command": "cancelRenameInput",
  "when": "editorFocus && renameInputVisible" 
}

key definiert hier die entsprechende Taste bzw. eine Kombination. command beschreibt die auszuführende Function und when definiert, wann dieses Key-Binding Gültigkeit besitzt.

Ein Blick durch die bestehende Liste gibt einen Überblick über die bestehenden Möglichkeiten. Ganz unten in den Default Keyboard Shortcuts befindet sich eine Liste zusätzlicher Kommandos. Zum aktuellen Zeitpunkt (Version 0.10.6) sind das:

  • deleteAllLeft
  • deleteAllRight
  • lineBreakInsert
  • editor.action.openLink
  • editor.action.findReferences
  • editor.action.showReferences
  • editor.action.goToTypeDeclaration
  • workbench.action.toggleSidebarPosition
  • workbench.action.closeAllEditors
  • workbench.action.closeOtherEditors
  • workbench.action.evenEditorWidths
  • workbench.action.maximizeEditor
  • workbench.action.minimizeOtherEditors
  • workbench.action.openGlobalSettings
  • workbench.action.openGlobalKeybindings
  • workbench.action.openWorkspaceSettings
  • workbench.action.editor.changeEOL
  • workbench.action.editor.changeEncoding
  • workbench.action.files.saveAll
  • workbench.action.files.saveFiles
  • workbench.action.files.revert
  • workbench.action.files.newFolder
  • workbench.files.action.compareFileWith
  • workbench.git.action.globalOpenChange
  • workbench.action.pull
  • workbench.action.push
  • workbench.action.sync
  • workbench.action.publish
  • workbench.action.git.startGitBranch
  • workbench.action.git.startGitCheckout
  • workbench.action.markdown.showWelcome
  • workbench.action.output.showOutput
  • editor.action.clearoutput
  • workbench.action.openSnippets
  • workbench.action.selectTheme
  • editor.debug.action.selectionToRepl
  • editor.debug.action.selectionToWatch
  • editor.debug.action.runToCursor
  • workbench.action.debug.restart
  • workbench.action.debug.pause
  • workbench.action.debug.configure
  • workbench.debug.action.openRepl
  • workbench.action.files.openFolder
  • workbench.action.openRecent
  • workbench.action.toggleDevTools
  • workbench.action.zoomReset
  • workbench.action.appPerf
  • workbench.action.reloadWindow
  • workbench.action.files.toggleAutoSave
  • workbench.extensions.action.listExtensions
  • workbench.extensions.action.installExtension
  • workbench.extensions.action.listOutdatedExtensions
  • vscode.executeWorkspaceSymbolProvider
  • vscode.executeDefinitionProvider
  • vscode.executeHoverProvider
  • vscode.executeDocumentHighlights
  • vscode.executeReferenceProvider
  • vscode.executeDocumentRenameProvider
  • vscode.executeSignatureHelpProvider
  • vscode.executeDocumentSymbolProvider
  • vscode.executeCompletionItemProvider
  • vscode.executeCodeActionProvider
  • vscode.executeCodeLensProvider
  • vscode.executeFormatDocumentProvider
  • vscode.executeFormatRangeProvider
  • vscode.executeFormatOnTypeProvider

Wer sich da tiefer in die Materie arbeiten möchte, der findet die offizielle Dokumentation zu diesem Thema sicherlich sehr hilfreich: Key Bindings for Visual Studio Code.

Nächster Tipp: Visual Studio Code Quicktipp #4 – Dateien schnell öffnen

The post Visual Studio Code Quicktipp #3 – Keyboard Shortcuts verwalten appeared first on Norbert Eder.

Golo Roden: Lisp lernen, Teil 2: Quicksort implementieren

Quicksort ist ein schneller und bekannter Algorithmus zum Sortieren von Daten. Da er rekursiv arbeitet, eignet er sich gut als Übungsaufgabe. An der Implementierung lassen sich zudem einige interessante Konstrukte von Lisp zeigen.

Norbert Eder: .NET Execution Environment (DNX) – Ein Einstieg

Das .NET Execution Environment (DNX) ist ein Software Development Kit (SDK) und eine Laufzeitumgebung zum Ausführen von .NET-Anwendungen unter Windows, Linux und Mac. Es gibt keine Limitierung auf ASP.NET Core, auch andere Anwendungstypen (z.B. Konsolenanwendungen) können darüber ausgeführt werden.

Ein DNX-Projekt erstellen

Ein DNX-Projekt wird über die Datei project.json definiert. Alle möglichen Einstellungen sind in der Dokumentation zum project.json zu finden. Interessierte können auch einen Blick in das project.json Schema werfen.

Für diesen Beitrag ist die Konfiguration der Ziel-CLR(s) wichtig. Diese wird über das Setting frameworks vorgenommen:

{
    "frameworks": {
        "dnx452": {},
        "dnxcore50" :{
            "dependencies": {
                "System.Threading": "4.0.0.0",
                "System.Threading.Tasks": "4.0.0.0"
            }
        }
    }
}

Es ist schön zu sehen, dass gegen zwei CLRs gebuildet wird: dnx452 entspricht dem vollen .NET Framework in der Version 4.5.2, dnxcore50 der Core CLR. Für letztere sind noch zwei zusätzliche Abhängigkeiten konfiguriert. Einen Gesamtüberblick vermittelt die Liste der Target Frameworks.

Zur Verwaltung der DNX-Runtimes wird der .NET Version Manager (DNVM) benötigt.

DNX-Projekte ausführen

Nachfolgend ein kleines Beispiel zum Ausprobieren. Im ersten Schritt benötigen wir eine project.json:

{
  "version": "0.0.1-*",
  "description": "DNX Demo Project",
  "authors": [ "norberteder"],
  "compilationOptions": {
      "emitEntryPoint": true
  },
  "dependencies": {
  },
  "frameworks": {
    "dnx451": { },
    "dnxcore50": {
      "dependencies": {
        "Microsoft.CSharp": "4.0.1-beta-23516",
        "System.Collections": "4.0.11-beta-23516",
        "System.Console": "4.0.0-beta-23516",
        "System.Linq": "4.0.1-beta-23516",
        "System.Threading": "4.0.11-beta-23516"
      }
    }
  }
}

Wer für dieses Beispiel Visual Studio Code verwendet, wird beim Verändern der Abhängigkeiten gefragt, ob diese angepasst werden sollen. Dies ist zu bestätigen, oder mittels dnu restore manuell durchzuführen.

Im gleichen Verzeichnis benötigen wir nun noch ein C#-File mit einer statischen Main-Methode:

using System;

namespace NorbertEder
{
    class Program 
    {
        static void Main() 
        {
            Console.WriteLine("It works! Great.");
        }
    }
}

Die Konsolenanwendung kann nun mit dnx run ausgeführt werden. Hier wird das aktuelle Verzeichnis nach einer statischen Main-Methode durchsucht und diese ausgeführt.

Somit wäre er erste Einstieg geschafft.

Tipp: Hier im Blog gibt es auch zahlreiche Informationen und Tipps zu Visual Studio Code.

The post .NET Execution Environment (DNX) – Ein Einstieg appeared first on Norbert Eder.

Jürgen Gutsch: Playing around with GenFu

In the past I used NBuilder (by Gareth Down) to create test data for my unit tests, demos and UI mock-ups. I really liked NBuilder, I used it for many years and I wrote about it in my old blog (ger) and in the dotnetpro (a German .NET magazine)

Unfortunately NBuilder is not compatible with .NET Core and there was no new release since 2011. Currently I play around with ASP.NET 5 and .NET Core, so compatibility to .NET Core and the latest dotnet platform standard is needed.

Good I attended the MVP Summit 2015 and the Hackaton at the last day, because I heard about GenFu, written by James Chambers, David Paquette and Simon Timms. They used that Hackathon to move this library to .NET Core. I did the same with LightCore at the same event.

GenFu also was a test data generator with some more features than NBuilder. GenFu includes some random data generators to create real looking data.

"GenFu is a library you can use to generate realistic test data. It is composed of several property fillers that can populate commonly named properties through reflection using an internal database of values or randomly created data. You can override any of the fillers and give GenFu hints on how to fill properties."

PM> Install-Package GenFu

To learn more about GenFu, I need to play around with it. I did this by writing a small ASP.NET 5 application which shows us user groups and their meetings and speakers and their topics. I also pushed that application to GitHub. So let me show what I found while playing around:

Setup the project

I created a new ASP.NET Core 1 web application (without the authentication stuff) and added "GenFu": "1.0.4" to the dependencies in the project.json.

After that I created a set of types like UserGroup, Lead, Meeting, Speaker and so on.

E. g. the UserGroup looks like this:

public class UserGroup
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public IEnumerable<Leader> Leaders { get; set; }
    public DateTime Founded { get; set; }
    public int Members { get; set; }
    public IEnumerable<Meeting> Meetings { get; set; }
}

Using GenFu

Let's start creating a List of user groups to show on the start page. Like NBuilder, GenFu is using a fluent API to create the a single instance or a list of a specific type:

var userGroup = A.New<UserGroup>();

var usergroups = A.ListOf<UserGroup>(20);

The second line of code generates a List of 20 user groups. The DateTime, Guid and String properties are already filled with randomly created values.

What I want to have is a list with some more real looking data. The good thing about GenFu is, it already includes some sample data and a pretty cool fluent API to configure the types:

A.Configure<UserGroup>()
    .Fill(x => x.Members).WithinRange(10, 250)
    .Fill(x => x.Name).AsMusicGenreName()
    .Fill(x => x.Description).AsMusicGenreDescription()
    .Fill(x => x.Founded).AsPastDate();

The configuration needs to be done before retrieving the list or the single object. The result now is much better than before:

We now have a list of music genre user groups :)

To fill the properties Leaders and Meetings, I created lists before the configuration of the UserGroup and created a extension method on IEnumerable to get a almost random list out of the source list:

var leaders = A.ListOf<Leader>(20);
var meetings = A.ListOf<Meeting>(100);

A.Configure<UserGroup>()
    .Fill(x => x.Members).WithinRange(10, 250)
    .Fill(x => x.Name).AsMusicGenreName()
    .Fill(x => x.Description).AsMusicGenreDescription()
    .Fill(x => x.Founded).AsPastDate()
    .Fill(x => x.Leaders, leaders.GetRandom(1, 4))
    .Fill(x => x.Meetings, meetings.GetRandom(20,100));
            
var usergroups = A.ListOf<UserGroup>(20);

Now we can start to create the leaders, speakers, meetings in the same way to get the full set of data. E. g. to get a list of speakers we can also use same methods as to generate the user groups:

var speakers = A.ListOf<Speaker>(20);

But wait! Did I really configure the Speakers?

I did not!

I just created the list, but I get well looking names, twitter handles, email addresses and I get a nice phone number. Only the website, the description and the topics list are not well configured. Sure, the names, twitter handles and email addresses don't match, but this is not really important.

This is another pretty cool feature of GenFu. Depending of the property name, it finds the right thing called Filler. We are able to configure the speakers, to assign the Filler we want to have, but in many cases GenFu is able to find the right one, without any configuration.

Just type A.Defaults or GenFu.Defaults to get a list of constants to see what data are already included in GenFu.

Lets extend GenFu to create our own Filler to generate random website addresses. A small look into the EmailFiller shows me how easy it is to create our own PropertyFiller. A string based PropertyFiller can inherit base functionality from the PropertyFiller:

public class WebAddressFiller : PropertyFiller<string>
{
    public WebAddressFiller()
        : base(
                new[] { "object" },
                new[] { "website", "web", "webaddress" })
    {
    }

    public override object GetValue(object instance)
    {
        var domain = Domains.DomainName();

        return $"https://www.{domain}";
    }
}

The first argument we pass into the base constructor is a list of type names of the objects we want to fill. "object" in this case means any kind of type based on Object. In GenFu there are different Fillers to fill the property title, because a person title is a different thing than an article title. Like this you can create different fillers for the same property name.

The second argument are the property names to fill.

In the method GetValue we can generate the value and return them back. Because there already is a EmailFiller which generates domain names too, I reuse the ValueGenerator DomainName to get a random domain name out of GenFus resources.

No we need to register the new Filler to GenFu and to use it:

A.Default().FillerManager.RegisterFiller(new WebAddressFiller());
var speakers = A.ListOf<Speaker>(20);

The result is as expect. We get well formed web addresses:

That was pretty easy with only a few lines of code :)

In one the first snippets at the beginning of this post, I created an extension method to create a random length list out of a source list. Wouldn't it be better, if we could create a ListFiller to do that automatically? There is already a configuration extension for list properties called WithRandom, but this thing whats to have a list of lists to select a list out of it randomly. I would like to have it a little more different. I would like to have an extension method, where I pass the source list and a min and a max count of list entries:

public static GenFuConfigurator<TType> AsRandom<TType, TData>(
    this GenFuComplexPropertyConfigurator<TType, IEnumerable<TData>> configurator,
    IEnumerable<TData> data, int min, int max)
    where TType : new()
{
    configurator.Maggie.RegisterFiller(
        new CustomFiller<IEnumerable<TData>>(
            configurator.PropertyInfo.Name, typeof(TType),
            () => data.GetRandom(min, max)));

    return configurator;
}

This isn't really a Filler. This is an ExtensionMethod on the GenFuComplexPropertyConfiguration which registers a CustomFilleer to get random data out of the source list. As you can see, I reused the initially created extension method to generate the random lists, but I needed to modify that extension method to use the randomizer of GenFu instead of a separate one:

private static IEnumerable<T> GetRandom<T>(this IEnumerable<T> source, int min, int max)
{
    var length = source.Count();
    var index = A.Random.Next(0, length - 1);
    var count = A.Random.Next(min, max);

    return source.Skip(index).Take(count);
}

I also made this method private because of the dependency to GenFu.

Now I can use this method in the GenFu configuration of the UserGroup to randomly fill the leaders and the meetings of a user group:

var leaders = A.ListOf<Leader>(20);
var meetings = A.ListOf<Meeting>(100);

A.Configure<UserGroup>()
    .Fill(x => x.Members).WithinRange(10, 250)
    .Fill(x => x.Name).AsMusicGenreName()
    .Fill(x => x.Description).AsMusicGenreDescription()
    .Fill(x => x.Founded).AsPastDate()
    .Fill(x => x.Leaders).AsRandom(leaders, 1, 4)
    .Fill(x => x.Meetings).AsRandom(meetings, 5, 100);

This is not really much code to automatically generate test data for your test or the dummy data of your mock-up. Just a bit of configuration which can be placed somewhere in a central place.

I think ...

... GenFu becomes my favorite library to create test and dummy data. I like the way GenFu generates well looking random dummy data. GenFu is really easy to use and to extend.

BTW: You'll find the small play around application on GitHub: https://github.com/JuergenGutsch/GenFuUserGroups/

codefest.at [MS]: DevOps mit Visual Studio Team Services

In den letzten Konferenzen haben sich David Tesar und Donovan Brown zu Top-Sprechern im Bereich von DevOps entwickelt. Vor allem das Rollenspiel zwischen IT-Betrieb/Infrastruktur und Entwickler beleben das Thema sehr. Die beiden haben nun auch einen “Kurs” in der Microsoft Virtual Academy zum Thema Enabling DevOps Practices with Visual Studio Online Build herausgebracht – dieser gibt einen guten Einblick in die Themen, Build, CI, automatisiertes Testen und Deployment/Release Management in Visual Studio Team Services.

Fabian Deitelhoff: LEGO Mindstorms EV3: Tipps & Tricks zur Fehlersuche

Mit dem LEGO Mindstorms EV3 zu basteln, zu programmieren und einfach Ideen auszuprobieren macht unheimlich viel Spaß. Und das nicht nur Kindern, wie ich in meinen Kursen immer wieder eindrucksvoll merke. :) Wenn aber etwas nicht so läuft wie gewünscht, ist der Spaß schnell verschwunden und weicht dem Frust. Woher die Fehler auch kommen ist leider nicht immer so schnell ersichtlich, wie wir uns das wünschen würden. Fehlerursachen gibt es genug. Defekte Hardware, falsch gebaute EV3-Modelle, falsch angeschlossene Hardware und natürlich eigene Programmierfehler, sind nur einige der möglichen Fehlerquellen. Und trotzdem sind gerade diese Fehler für die meisten Probleme verantwortlich.

In diesem Beitrag gebe ich dir einen Überblick über häufige Stolperfallen und zeige auch gleich, wie du sie am besten beheben kannst. Aktuell behandelt der Beitrag Probleme in Zusammenhang mit Windows PCs und mit Mac OS X. Spezifische Tipps zu Linux reiche ich bei Gelegenheit nach.

Verbindungsprobleme

Ganz am Anfang der Fehlerliste stehen häufig Verbindungsprobleme. Damit ist in der Regel die Verbindung vom LEGO Mindstorms EV3 zu einem PC mit Windows oder einem Gerät mit Mac OS X gemeint. Wird der LEGO Mindstorms EV3 nicht erkannt, hat das oft die folgenden Ursachen.

  • Das USB-Kabel am LEGO Mindstorms EV3 oder am PC ist nicht richtig angeschlossen. Gerade am EV3 wird es häufig nicht richtig eingesteckt, weil viele LEGO Modelle den Anschluss etwas versperren können.
  • Der LEGO Mindstorms EV3 muss eingeschaltet sein, damit er vom System erkannt wird.
  • Es werden keine Treiber für den LEGO Mindstorms EV3 installiert. Wenn das an einem USB-Anschluss partout nicht funktionieren möchte, auf jeden Fall einen anderen USB-Anschluss ausprobieren. Nicht an allen PCs sind alle USB-Anschlüsse aktiv. Vor allem diejenigen, die im Gehäuse nach vorne zeigen, sind häufig gar nicht angeschlossen. Im Allgemeinen kann die erste Installation der Treiber auch eine Weile dauern. Also ruhig etwas Geduld mitbringen. :)
  • Die automatische Treiber-Installation hat nicht richtig funktioniert. Gerade unter Windows tritt das häufiger auf. Hier könnten fehlende Rechte das Problem sein. Kannst du sonst Programme auf dem PC installieren? Wenn nein, kann es durchaus damit zusammenhängen.

Eine gute Möglichkeit, die Verbindung zu überprüfen, ist die Stein-Info in der LEGO Mindstorms EV3 Home Edition (siehe Abbildung 1). Dort muss der EV3 Brick angezeigt werden. Ist das nicht der Fall, bitte die Punkte oben checken, da dann ganz sicher etwas nicht mit der Verbindung stimmt. Die geöffnete Stein-Info bietet auch gleichzeitig eine gute Möglichkeit, den Namen deines EV3 Brick zu ändern, wenn du das möchtest und mal einen Blick auf Version der Firmware zu werfen.

Abb. 1: Die aktive Stein-Info mit den Daten eines angeschlossenen LEGO Mindstorms EV3.

Abb. 1: Die aktive Stein-Info mit den Daten eines angeschlossenen LEGO Mindstorms EV3.

Möglicherweise hilft dir auch die Ansicht der verfügbaren Steine weiter, wie in Abbildung 2 zu sehen. Dort werden alle LEGO Mindstorms EV3 Bricks aufgeführt, die gefunden werden konnten. Entweder über USB, über Bluetooth oder WLAN. Dort muss dein Brick auftauchen.

Abb. 2: Verfügbare LEGO Mindstorms EV3 Steine in der Home Edition Software.

Abb. 2: Verfügbare LEGO Mindstorms EV3 Steine in der Home Edition Software.

Die Firmware aktualisieren

Im Zweifel kannst du über Werkzeuge | Firmware Aktualisierung prüfen, ob es eine neue Version gibt (siehe Abbildung 3). Die lohnt es sich immer einzuspielen, um auf diese weise Fehlerquellen auszuschließen. Natürlich erst dann, wenn die Verbindung überhaupt steht.

In aktuellen Versionen der LEGO Mindstorms EV3 Home Edition scheint die automatische Prüfung auf eine neue Firmware Version nicht mehr zuverlässig zu funktionieren. Zumindest konnte ich das Verhalten schon mehrfach beobachten. Als ich am 25. Januar 2016 das letzte Mal nachgesehen habe, war die Version 1.09H die aktuellste Version. Wenn deine älter ist, bitte direkt aktualisieren.

Abb. 3: Neue Firmware zum LEGO Mindstorms EV3 (nach manuellem Download).

Abb. 3: Neue Firmware zum LEGO Mindstorms EV3 (nach manuellem Download).

Ein kleiner Hinweis: Bei vielen ist es zu Problemen beim Einspielen der Version 1.09H gekommen. Wenn sich dein Brick beim Firmware-Update aufhängt, dann befolge den Anweisungen des LEGO Mindstorms EV3 Home Edition Software, nachdem du den Vorgang über die Schaltfläche Abbrechen beendet hast. Abbildung 4 zeigt diese Anweisungen zur Sicherheit auch noch einmal. Wenn gar nichts mehr geht, kannst du mir gerne eine Nachricht schreiben.

Abb. 4: Anweisungen zum Zurücksetzen eines LEGO Mindstorms EV3 Bricks.

Abb. 4: Anweisungen zum Zurücksetzen eines LEGO Mindstorms EV3 Bricks.

Welches EV3-Modell ist gut?

Zum Testen eignen sich immer ganz einfache Modelle am besten. Das ist natürlich leichter gesagt als getan. Denn wer an seinem Modell bastelt und immer neue Funktionen hinzufügt, der hat auch irgendwann ein komplexere EV3-Modell vor sich stehen. Das ist nur logisch. Für diese allgemeinen Fehler, die ich hier beschreibe und die recht häufig am Anfang auftreten, lohnt es sich aber, ganz eine Tests durchzuführen.

Wenn du dir nicht sicher bist, dass ein Motor genau das macht, was du in der Programmierung von ihm erwartest, dann bau einen Motor aus, schließe nur diesen Motor an den Brick an und lasse ihn etwas laufen. Du kannst vielleicht noch eine LEGO Technic Stange einsetzen oder irgendetwas anderes, um besser überprüfen zu können, ob sich die Achse auch wirklich dreht so wie du dir das vorgestellt hast.

Bei der Fehlersuche gilt immer: Es ist besser, ein sogenanntes Minimalbeispiel zu erstellen, als zu versuchen, sein riesiges Konstrukt aus Anweisungen zum Laufen zu bekommen. Insbesondere bei grundlegenden Fehlern, wie nicht gut drehende Motoren, ist das anzuraten.

Ein Minimalbeispiel ist der minimale, voll funktionsfähige EV3 G-Code zur Darstellung eines bestimmten Verhaltens oder Fehlers.

Mit EV3 G-Code ist deine Programmierung aus der LEGO Mindstorms EV3 Entwicklungsumgebung gemeint. Die sollte nur einen kleinen Ausschnitt dessen testen, was du vorhast. Die Definition eines Minimalbeispiels lässt sich natürlich auch auf einen LEGO Roboter beziehen.

Ein Minimalbeispiel ist der minimale, voll funktionsfähige EV3 LEGO Roboter zur Darstellung eines bestimmten Verhaltens oder Fehlers.

Wie aber oben schon erwähnt, kann das für ein EV3 Roboter, der mit der Zeit größer und komplexer wird, nicht ganz so einfach sein zu erreichen. Einen Versuch ist es aber wert.

In meinem Beitrag mit allgemeinen Tipps und Tricks zu meinen Kursen verrate ich dir noch einige Hinweise mehr zu EV3-Modellen, die sich gut für Übungen und zur Fehlersuche im Allgemeinen eignen.

Allgemeine Funktionstests

Wenn die Verbindung steht und die Firmware aktuell ist, sorgen die ersten Funktionstests dafür zu prüfen, ob auch alles richtig angeschlossen ist und die eigene Programmierung das tut, was wir uns vorgestellt hatten.

Wer sich nicht sicher ist, ob sein Brick überhaupt funktioniert, was leider hin und wieder vorkommt, der sollte ganz einfache Programme laufen lassen. Nichts verrücktes oder aufwändiges, sondern einfach nur einen Motoren vor- und zurückbewegen. Bei einem Fahrzeug auch gerne beide Motoren, um das EV3-Modell vor- und zurück zu bewegen. Diese Tests lassen sich mit sehr wenig Aufwand realisieren. Sowohl was das notwendige EV3-Modell anbelangt, als auch von der Programmierung an sich.

Wenn das funktioniert, können anderen Funktionen getestet werden. Beispielsweise die Ausgabe von Tönen, die Anzeige von Text auf dem Display des LEGO Mindstorms EV3 oder die ersten Sensoren.

Ich habe für diese Zwecke eine Reihe kleiner Testprogramme für den LEGO Mindstorms EV3 in der Home Edition geschrieben, die ich gerne ausführen lassen, wenn sich jemand nicht sicher ist, ob sein Brick richtig funktioniert. Diese Testprogramme kannst du dir über den folgenden Link herunterladen.

Download der Testprogramme (24,6 kB)

Falls das noch immer nicht richtig funktioniert und du dir nicht sicher bist, kannst du mir auch gerne eine Nachricht schicken und ich gucke mir das Problem konkret an. Dazu am besten direkt ein Programm von dir, was nicht richtig funktioniert, mitschicken. Dann habe ich deutlich bessere Chancen zu helfen.

Auch bei den Funktionstests, die meistens hauptsächlich auf den Software-Blöcken, also eurer Programmierung beruhen, sind kleine Schritte wichtig. Kleine Schritte lassen sich am einfachsten mit einem Minimalbeispiel erreichen. Für die Funktionstests gilt also genau das, was ich oben schon einmal zu einem guten Modell geschrieben hatte, nur auf die Programmierung bezogen:

Ein Minimalbeispiel ist das minimale, voll funktionsfähige EV3 Programm zur Darstellung eines bestimmten Verhaltens oder Fehlers.

Zusammenfassung

Jetzt ist der Artikel doch wieder länger geworden, als ich das eigentlich geplant hatte. :)

Ich hoffe, ich konnte mit den Tipps & Tricks oben ein weniger weiterhelfen, wenn es mit dem LEGO Mindstorms EV3 mal nicht so klappt, wie ihr euch das vorgestellt habt. Bei der Fehlersuche ganz wichtig sind kleine Schritte. Stellt euch vor, ihr wollt nur einen kleinen Teil eures Programms zum Laufen bringen. Was müsst ihr dafür tun? Welche Software-Blöcke braucht ihr und wie muss die Hardware aufgebaut sein? Wenn das dann klappt, könnt ihr sowohl euer Programm, wie auch euer LEGO Modell Schritt für Schritt erweitern.

Und wenn gar nichts mehr geht, freue ich mich immer über eine Nachricht. Gerne mit aussagekräftiger Fehlermeldung, um euch so gut es geht weiterhelfen zu können. :)

Golo Roden: Programmierkonzepte, Teil 4: Dynamische Typisierung

Typsysteme lassen sich auf vielerlei Art einteilen: statisch, dynamisch, streng, schwach, explizit, implizit, nominal, strukturell … Derzeit erfahren vor allem dynamisch typisierte Sprachen viel Zuspruch, doch das war nicht immer so. Ein Überblick.

Holger Schwichtenberg: Pro und Contra des Versionswechsels von .NET Core 5 und ASP.NET 5

Auf der Zielgeraden hat Microsoft sich entschieden, die Versionszählung für die modulare Neuimplementierung von .NET wieder bei 1 zu beginnen. Das macht durchaus Sinn, aber warum so spät?

Holger Sirtl: Azure News on Friday (KW03/16)

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

Aktuelle Neuigkeiten

Datum Nachricht
21.01. January 2016: Azure Media Services classic portal encoding services update
Verbesserungen in der Oberfläche der Media Services im Azure Management Portal
21.01. Announcing the Azure SDK 2.8.2 for .NET
Das Azure SDK 2.8.2 für .NET ist da! Verbesserungen in der UI, Performance und Resource Manager Templates
21.01. Limiting access to data using Row-Level Security
Zeilenbasierte Security (row level security) in Azure SQL Database
21.01. New DocumentDB articles help you find samples for the most common tasks
Neue Dokumentation für DocumentDB Nutzer in .NET un NodeJS mit Beispielcode
21.01. Alarm App Uses ML from Project Oxford to Wake You Up
Mimicker Alarm - cooler Showcase aus der Microsoft Garage - Azure Machine Learning, Project Oxford etc.
20.01. Application Insights Proactive Detection
Proaktive Benachrichtigung über abnormales Verhalten einer App auf Basis ihrer Azure Application Insights Daten
20.01. Custom analyzers in Azure Search
Suchergebnisse in Azure Search über eigene Analyzer (z.B. für proprietäre Dokumentenformate) optimieren
20.01. Azure Batch service update (December 2015)
Neu im Azure Batch Service - MPI Unterstützung, Offline-Setzen von Nodes ohne Löschen, flexibleres Autoscaling
19.01. AJAX Collection in Application Insights
Interessant für Web-Entwickler: AJAX Aufrufe mit Abhängigkeiten über Application Insights auswerten
19.01. How Halo 5 implemented cloud scale telemetry using Azure Event Hubs Hintergründe dazu, wie Halo 5 Telemetriedaten über Azure Event Hubs verwaltet und auswertbar macht
19.01. Lift-and-shift your workloads with Azure RemoteApp and Azure AD Domain Services
Empfehlungen dafür, wie Azure RemoteApp in Kombination mit Azure AD Domain Services genutzt werden können
19.01. Visualizing Azure Search data with Power BI
Mit dem Azure Search Content Pack für Power BI die Nutzung von Azure Search visualisieren
19.01. Analyzing your Azure Search traffic
Metriken zu Azure Search mittels Search Traffic Analytics sammeln, visualisieren und auswerten.
19.01. Azure AD Mailbag: Azure AD App Proxy
Sean Ivey beantwortet die wichtigsten Fragen rund um Azure AD App Proxy
19.01. Announcing the Beta Apache Cordova Plugin for Azure App Service Mobile Apps
Verbindungen zu App Service Mobile App Backends über das Apache Cordova Plugin (Beta) aufbauen
19.01. Key Vault in Azure China and Azure Government
Azure Key Vault ist jetzt auch in China und der Azure Government Cloud verfügbar
16.01. Share your Excel data with Power BI publisher for Excel Preview

Neue Kurse in der MVA

Datum Nachricht
19.01. Design and Implement Cloud Data Platform Solutions

Neue Videos

Datum Nachricht Video
21.01. Data Preparation with the U-SQL language
Michael Rys über U-SQL - die Abfragesprache für Big Data Abfragen im Azure Data Lake Analytics Service
20.01. How to set VM policies in a DevTest Lab
VM Policies in DevTest Labs
20.01. What is Azure Data Lake?
1-stündiger Überblick über Azure Data Lake - was ist das? wozu ist er gut? wie ist er aufgebaut?
20.01. Tuesdays with Corey: Simplest way to deploy SQL Server to the Cloud
Corey Sanders über die Möglichkeit SQL Server via Azure Deployment Templates einfach in Azure bereitzustellen
20.01. In-Memory OLTP for Azure SQL DB

19.01. Custom Analyzers, Search Analytics, & Portal Querying in Azure Search
Liam Cavanagh über die neuen Möglichkeiten in Azure Search - Search Explorer, Power BI, Lucene Queries etc.
18.01. PnP Web Cast - HelpDesk application with Microsoft Graph

Constantin Klein: Kumulative Updates für SQL Server 2012 SP2 und SQL Server 2012 SP3 veröffentlicht

Mit guten Vorsätzen ins neue Jahr. Nachdem es hier lange Zeit sehr ruhig war, möchte ich Euch in diesem Jahr wieder häufiger mit neuen Artikeln beglücken. Los geht es mit neuen kumulativen Updates für SQL Server 2012. Microsoft hat zwei neue kumulative Updates für SQL Server veröffentlicht: Update KB Artikel Build Nr. Anzahl Fixes SQL […]

codefest.at [MS]: Global Game Jam Graz 2016

Wie in den vergangen Jahren findet auch heuer in Graz die Global Game Jam Graz statt. Die Global Game Jam ist ein internationaler Event, an dem in verschiedenen Städten rund um die Welt am selben Wochenende eine Game Jam veranstaltet wird. Hierbei treffen sich Entwickler, Designer, Künstler – Interessierte sowie Experten – um gemeinsam ein Spiel zu entwicklen.

Die Global Game Jam Graz findet vom 29. – 31. Jänner an der Technischen Universität Graz statt. Weitere Informationen und Anmeldeseite findet ihr hier: http://gamejam.at/2016/

global_game_jam_graz_poster_2016_960x1356

Wir wünschen viel Spaß beim Jammen!

Johannes Renatus: AngularJs mit ngPaste Text abfangen und vor dem Einfügen bearbeiten

Die Direktive “ngPaste” selbst wird von AngularJs ab der Version 1.2.x bereitgestellt und kann z.B. verwendet werden um zu prüfen ob ein Text über die Zwischenablage eingefügt wurde, oder um beim Einfügen von markierten und kopierten Excel Zellen diese vorher noch entsprechend “umzuformatieren”, bevor diese in der passenden Modelvariablen abgelegt werden. Ein HTML Template snippet […]

codefest.at [MS]: Die //build 2016 ist ausverkauft, komm zum Keynotestreaming in Graz, Linz und Wien

Microsoft //build Ausverkauft

Da die //build komplett ausverkauft ist bringen wir die //build zu Euch und veranstalten //build Keynotestreamings in Graz, Linz und Wien. Meldet Euch noch heute an, die Plätze sind begrenzt!

Die //build wird vom 30. März bis 1. April 2016 in San Francisco stattfinden.

Zur Einstimmung findet Ihr hier den Rückblick auf die //build Konferenz des Vorjahrs, unter anderem die Keynote von Microsoft CEO Satya Nadella.

Keynote Tag 1:

  • Microsoft CEO, Satya Nadella describes Microsoft's opportunity to Build the Intelligent Cloud, Reinvent productivity and business process and create more personal computing.
  • Scott Guthrie explains how Microsoft's Azure is poised to create the Intelligent Cloud.
  • Satya explains how Microsoft Office is evolving to reinvent productivity.
  • Terry Myerson explained how Windows 10 will create more personal computing with new bridges to enable developers to evolve their code into Windows 10 to enable phones, tablets, desktop, Xbox and Holograms.

Keynote Tag 2: Microsoft's Chief Technical Evangelist, Steve Guggenheimer and Chief Geek, John Shewchuk drilled deeper into the concepts explained in day 1 by providing coding deep dives.

  • Media and entertainment reinvention were seen with Muzik Official's Bluetooth wireless drumsticks,
  • Acumatica's use of Power BI illustrated how to rethink reporting.
  • New open source projects Vorlon and Manifold.JS were introduced.
  • David Treadwell and Kevin Gallo showed how to build a universal Windows App and gave a peek at the code required to move Android and iOS apps forward.
  • Joseph Sirosh described the connected cow, talked about machine learning with March Madness and Genomics and brought How-Old.Net to the mainstream.
  • Briana Roberts and Aidan Brady introduced a Minecraft modding project to Visual Studio using Java.

Golo Roden: Lisp lernen, Teil 1: Primzahlen berechnen

Die Syntax von Lisp ist minimalistisch, dennoch (oder gerade deswegen) birgt die Sprache ein enormes Potenzial. Um Lisp zu lernen und zu üben, hilft das regelmäßige Schreiben von Code mehr als eine rein theoretische Beschäftigung mit der Sprache. Zum Auftakt ist das Ziel eine Funktion zum Berechnen von Primzahlen.

Martin Hey: Playlist erstellen für PlayPoster von OOSM

Nachdem ich in meinem letzten Post geschrieben habe, wie man PlayPoster in Betrieb nimmt, soll es heute darum gehen, meine Anwendungsfälle mal abzubilden. Dazu erstelle ich im Admin-Portal eine Playlist und befülle diese mit Inhalten.


Das Admin Portal kommt sehr übersichtlich daher und alle wichtigen Menüpunkte sind per Direktlink verfügbar. Nun ein paar Worte zur Struktur: Ein PlayPoster Stick (= Unit) gehört zu einer Gruppe (= Location). Einer Location und damit allen darin enthaltenen Devices können Playlists zugeordnet werden, die entweder ganztägig, morgens, mittags oder abends aktiv sein können. Eine Playlist selbst ist eine Reihenfolge von Bausteinen, die im Editor erstellt oder bearbeitet werden können. In einigen Bausteinen werden Bilder benötigt (oder sind zumindest sinnvoll). Diese liegen unter Files.
Logo Baustein erzeugen
Ein recht simpler Baustein ist der Bildbaustein in dem einfach eine bestimmte Zeit lang ein Bild angezeigt wird. Dieser Baustein ist auch bereits in der Standard-Playlist mit der das Gerät ausgeliefert wird enthalten. Wie erzeugt man nun selbst einen solchen Baustein? Ganz einfach: Dazu legt man einfach in der Menüleiste ein Bild per Drag&Drop ab und definiert im anschließend erscheinenden Dialog noch die Anzeigedauer (diese ist immer im Format mm:ss).

Externe Webseite einbinden
In meinem vorigen Post habe ich ja als Use-Case angegeben, dass ich den Ticketstatus (bei uns aus dem Redmine) und den Status des Build- und Testsystems (bei uns Jenkins) anzeigen will. Dafür gibt es natürlich keine vorgefertigten Bausteine. Aber wozu bin ich Entwickler? Ich kann ja auf einem unserer Rechner noch einen Webserver laufen lassen, der die Daten nach meinen Wünschen aggregiert und anzeigt. Diese Webseite kann ich dann anzeigen lassen. Dazu erstelle ich unter Editor einfach einen neuen Baustein, weise das Template "External Page" zu und gebe die Url an, die angezeigt werden soll und auch wieder die Anzeigedauer. Die Url muss aus Sicht des Sticks angegeben werden - ich kann also auch lokale Urls verwenden. Die Vorschau im Browser funktioniert technisch bedingt nicht, wenn ich mich beim editieren nicht im gleichen Netz wie der Stick befinde und die Webseite für mich dann nicht erreichbar ist oder wenn meine Url eine http-Url ist (da das Portal https ist und der Browser unsichere Elemente in blockiert). Auf dem Device funktioniert es dann aber.

Tweets anzeigen
Ähnlich einfach ist die Anzeige von Tweets. Dazu verwendet man den Baustein "Twitter" und gibt den Hashtag oder die Person an der man folgen will. Innerhalb der definierten Anzeigedauer wird dann alle paar Sekunden durch die so gefilterten Tweets gewechselt. Da sowohl Schriftfarbe als auch Standard-Hintergrund weiß sind, ist es bei diesem Baustein wichtig, dass man im Editor das Hintergrundbild definiert. Dazu lädt man einfach im Vorab über Files ein Bild in der Hintergrundfarbe seiner Wahl hoch und setzt es im Baustein als Hintergrund.

Statische Texte
Zur Anzeige statischer Texte gibt es verschiedene Templates. Ich verwende dazu in der Regel eines der "Pricelist" Templates, da ich oft eine tabellarische Ansicht brauche (z.B. für die Ankündigung von Community Events). 

Playlist erstellen
Nun da ich alle Bausteine erstelle habe, muss ich nur noch eine Playlist aus diesen erstellen. Dazu wechsle ich unter Playlists und ziehe mir per Drag&Drop die Bausteine in der gewünschten Reihenfolge in meine Timeline und speichere die Playlist ab. 
Wenn ich mir noch aussuche wann und wo die Playlist gespielt werden soll, wird sie auch gleich auf die anhand der Location gewählten Devices gepusht und dort direkt angezeigt.

Ein komplettes Tutorial gibt es auf der OOSM Support Seite

Jürgen Gutsch: ASP.NET 5 is now ASP.NET Core 1

Naming seems to be the hardest thing for software developers, even for Microsoft. ;) There where huge discussions about the naming of ASP.NET vNext at the MVP Summit 2015 and around the world. Now they found the right names for completely new things: Yesterday Microsoft reintroduced ASP.NET Core 1.0 and .NET Core 1.0.

Now they have a lot to do to change all the NuGet packages, library names and version numbers. But from my perspective this is a good change, because all this stuff are completely new things. The .NET Core libraries, .NET core 1.0 and ASP.NET Core 1.0 are completely rewritten and redesigned. The new names and the version 1.0 makes absolutely sense now.

BTW: this also happens to Entity Framework 7, which is now called Entity Framework Core 1.0 or EF Core 1.0.

image source http://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspx

To get more information about the changes, read Scott Hanselmany Blog post about it and watch the latest ASP.NET Community Standup

There is another benefit with that name changes, I think: Now it is possible to update the "classic" ASP.NET 4.6 and .NET Framework to a new version 5.0 in the future without confusing all the .NET developers ;)

The only bad thing about this is, there are too much changes while ASP.NET Core is in RC with a go-live license. This is a little bit critical. This changes should have been done in the beta state.

What do you think about the name and version changes?

Jan-Cornelius Molnar: Plot3D with RegionFunction equivalent in MATLAB

Suppose you want to plot a function g depending on two variables x , y over a range where y depends on x . Using Mathematica this can be done in essentially one line (not counting the definition of the function g and the lower and upper bounds f1 and...(read more)

Martin Hey: Digital Signage mit PlayPoster von OOSM

Wer hat sie noch nicht gesehen - die Werbemonitore in den Geschäften, die Info-Screens bei Veranstaltungen. Digitale Schilder oder auch Digital Signage sind beim Marketing nicht mehr wegzudenken. 


Auch bei uns im Büro sollte so ein Screen her. Weihnachten war es dann so weit - im Büro stand ein nagelneuer Fernseher, der auch schnell recht professionell an der Wand hing. Doch wie geht's dann weiter? Ok, für ein paar statische Inhalte funktioniert das recht gut - USB-Stick angeschlossen und schon kann eine Slideshow von Bildern angezeigt werden. Aber das war's dann auch schon.

Unser Screen soll nicht nur Marketingfunktionen erfüllen, sondern ich möchte dort auch nützliche Informationen für die Mitarbeiter anzeigen und diese sind nur dann wirklich nützlich, wenn sie dynamisch erzeugt werden. Wir sind ein Unternehmen, das Software herstellt. Also was sind denn nützliche Informationen? Ich denke hier an:
  • den aktuellen Projektstatus (also das Sprint- oder Projekt-Burndown)
  • den Status des Buildsystems (welche Builds laufen gerade; gibt es irgendwo Builderrors oder fehlgeschlagene Tests)
  • Informationen zum Unternehmen oder zur Abteilung
  • Informationen zu Community-Events
  • Informationen aus sozialen Medien (z.B. einen Twitter-Feed)
Das alles lässt sich mit der statischen Dia-Show die der Fernseher mitbringt nicht lösen. Da muss etwas anderes her.

Im Frühsommer letzten Jahres war ich in Amsterdam zu einem Startup-Event und habe dort die Köpfe eines Unternehmens kennengelernt, die genau so eine Digital Signage Lösung herstellen: OOSM (sprich: awsome) mit Ihrem Produkt PlayPoster. In den Gesprächen mit dem CEO Peter Bruner stellte sich heraus, dass der Stick von OOSM vermutlich genau die einfache Lösung ist, die wir brauchen.

Also habe ich einen Stick bestellt. Nach wenigen Tagen war der dann auch in meinem Briefkasten. Die Installation ist denkbar einfach und in 3 Schritten erledigt: 
  • Stick auspacken und an Stromversorgung und HDMI-Port des Bildschirms anschließen
  • WLAN-Credentials eingeben (dafür braucht man mal kurzzeitig eine USB-Maus)
  • Stick kurz vom Stromnetz nehmen, damit er rebootet
Das war's auch schon. Ab jetzt öffnet sich bei jedem Boot automatisch die vorinstallierte App und zeigt die definierten Inhalte an.

Da kommen wir auch schon zum nächsten Punkt: Definieren der Inhalte. Denn ich wollte ja statische und dynamische Inhalte darstellen.

Bei der Bestellung erhält man Credentials zum Admin-Portal von OOSM. Dort definiert man sogenannte Playlists, die man einer Gruppe von Devices zuordnen kann - also ein Device ist in einer Gruppe; eine Gruppe hat eine oder mehrere aktive Playlists (ganztägig oder für einen bestimmten Zeitraum); eine Playlist besteht aus Bausteinen, für die eine Reihenfolge definiert wird. Wie das genau geht, erkläre ich in einem späteren Post.

Digital Signage Lösungen gibt es viele am Markt, deswegen hier neben dem persönlichen Kontakt zum Entwicklerteam noch ein paar Hard-Facts für die Entscheidung für PlayPoster. 

Einfache Installation mit vorhandener Hardware (+)
Es muss ja nicht immer der neue TV sein - wir alle haben igendwelche alten Monitore herumstehen, die wir nicht mehr brauchen und die super für Digital Signage geeignet sind. Einfach den Stick anschließen, WLAN einrichten, fertig. Und der Stick ist mit Abmessungen von 85 x 30 x 10 Millimeter wirklich nicht groß.

Cloudbasierte Definition (+)
Ich kann von zu Hause oder von unterwegs steuern, was auf meinen Screens im Office wann angezeigt wird.

Niedrige Kosten (+)
Die Anschaffungskosten sind vergleichsweise sehr gering - andere Digital Signage Produkte kosten über 100 Euro pro Device, die aktuellen Kosten (Stand Januar 2016) des PlayPoster Sticks sind 59 Euro einmalig ohne weitere nutzungsbasierte Zahlungen.

Betaphase (+/-)
Das System ist noch in der Betaphase. Man stolpert also noch manchmal im Admin-Portal über Punkte die von der User Experience noch nicht optimal sind, aber das Entwicklerteam freut sich über Feedback und behebt Bugs (wenn man welche findet) super schnell.

Viele vordefinierte Templates (+)
Für die Bausteine gibt es vordefinierte Templates, die schon viele Anwendungsgebiete abdecken:
  • statisches Bild (also quasi wie Diashow)
  • externe Webseite (z.B. für unsere Systemstatus-Anzeigen)
  • Tweets (anhand Hashtag oder Person)
  • RSS-Feed
  • Gimmicks wie Uhr, Horoskop, Wetter
  • verschieden gelayoutete Bild-/Text-Screens (Preisliste, Bild mit Text)

Nur FullHD (-)
Der Stick in seiner aktuellen Konfiguration unterstützt lediglich FullHD und noch kein 4K. Für uns reicht das im Moment. Nach der Aussage von OOSM soll die nächste Generation aber definitiv 4K-fähig sein.

Damit genug zum Thema Installation. In meinem nächsten Post zeige ich, wie ich meine Playlist für PlayPoster zusammenbaue.

Holger Schwichtenberg: Versionsnummer der Windows PowerShell ermitteln

Die Windows PowerShell gibt bei ihrem Start ihre Versionsnummer nicht direkt preis. Doch es gibt hierfür Abhilfe.

Fabian Deitelhoff: LEGO Mindstorms EV3: Allgemeine Infos zu meinen Kursen

Schon im zweiten Halbjahr 2015 habe ich vermehrt Kurse zum LEGO Mindstorms EV3 gegeben. Dieser Trend wird sich sehr wahrscheinlich in diesem Jahr fortsetzen. Zumindest was das erste Halbjahr 2016 anbelangt. Was danach kommt, kann ich aktuell schwer abschätzen.

Bei meinen bisherigen Kursen sind mir immer wieder einige Dinge aufgefallen, die ich gerne mal mit diesem Beitrag zusammenfassen möchte. So kann sich eventuell jeder etwas besser informieren, was ihn in einem Kurs erwartet, in welche Richtung es so grundsätzlich geht und was vielleicht mitzubringen ist, damit der Kurse für alle ein Erfolg wird und vor allem sehr viel Spaß macht.

Wer Anmerkungen hat, meldet sich gerne ganz unkompliziert bei mir mit einer Nachricht. Ich nehme auch gerne Anmerkungen und Kritik entgegen, falls ihr schon mal bei einem Kurs wart und etwas nicht so gelaufen ist, wie ihr das vielleicht erwartet oder erhofft habt.

Was erwartet mich?

Ich glaube das fragen sich sicherlich viele. Insbesondere beim ersten Besuch eines Kurses zum Thema LEGO Mindstorms EV3. Grundsätzlich gibt es viele verschiedene Möglichkeiten, so einen Kurs zu gestalten.

— 1. —

Die erste Möglichkeit ist, ich gebe Aufgaben oder Ideen zu Aufgaben vor, die ihr als Teilnehmer oder Teilnehmerin lösen könnt. Diese Ideen stammen dann aus vorherigen Kursen, aus abgewandelten Aufgabenstellungen der Industrie und aus interessanten Diskussionen mit anderen LEGO Mindstorms EV3 Begeisterten. Bei dieser Art Kurse ist sehr viel eigene Kreativität gefragt, weil eher am Ende einer Aufgabe eine mögliche Lösung besprochen wird. Meisten kommen alle Teilnehmenden aber zu einem Ergebnis, die in Summe so unterschiedlich sind, wie sie nur sein könnten.

— 2. —

Die zweite Möglichkeit ist, dass ihr als Teilnehmende mit Aufgaben auf mich zukommt. Dinge, die ihr schon lange einmal mit dem LEGO Mindstorms EV3 machen wolltet oder beispielsweise Dinge, die ihr vielleicht bisher nicht ganz verstanden habt. Dann können wir diese Aufgaben gemeinsam oder einzeln lösen und anschließend besprechen. Auch hier ist sehr viel eigene Kreativität und eigene Motivation gefragt.

— 3. —

Die dritte Möglichkeit geht eher in Richtung Frontalunterricht. Ich stelle Probleme und Aufgaben vorne vor und ihr baut diese nach. Dabei beantworte ich natürlich auch eure Fragen, aber in diesem Modus bin ich eher derjenige, der euch anleitet und euch Input gibt. Hier ist etwas weniger Kreativität im Spiel, als bei den anderen beiden Kursarten. Bisher war das aber die Art von Kurs, die ich am seltensten durchgeführt habe.

— Eine Mischung —

Und um das Ganze nicht wie starre Auswahlmöglichkeiten aussehen zu lassen: Natürlich sind auch beliebige Kombinationen möglich. Tatsache ist, dass die meisten Kurse auch aus unterschiedlichen Schritten bestehen. Am Anfang erzähle in der Regel ich etwas mehr, gegen Ende helfe ich dann meistens nur noch bei Fragen und größeren Problemen weiter. Mit den Hinweisen zur möglichen Unterrichtsgestaltung möchte ich eher erreichen, dass ihr euch vorher vielleicht ein paar Gedanken macht, was ihr bevorzugt und was für euch am sinnvollsten ist.

— Wats3n —

Für alle Teilnehmer und Teilnehmerinnen meiner Kurse gibt es am Ende noch ein Geschenk. Und zwar den Wats3n, mein Maskottchen für die LEGO Mindstorms EV3 Kurse. Bisher hat das immer geklappt. Zu 100% versprechen kann ich es leider nicht, da es auch mal Engpässe bei Lieferungen der Verpackungen oder ähnlichem gibt.

Was wird von mir erwartet?

Im Grunde nicht viel. Einfach nur Spaß haben ist die Hauptpflicht. :)

Es wäre schön, wenn ihr die Tipps unten beachten würdet, welche EV3 Modelle gut sind und was mitzubringen ist. Des Weiteren macht euch schon vorher ein paar Gedanken, was ihr aus einem Kurs mitnehmen wollt. Was wollt ihr lernen, wo gibt es Probleme und was wolltet ihr schon lange mal mit dem LEGO Mindstorms EV3 machen. Darauf gehe ich gerne in meinen Kursen ein.

Was aber ganz wichtig ist: Wenn es Probleme gibt, fragt nach! Es ist löblich, ein Problem oder eine Schwierigkeit alleine lösen zu wollen. Aber ihr müsst merken, wann das eventuell nicht möglich ist und wann eine Frage deutlich die deutlich bessere Option ist. Dann kann ich euch gezielt helfen und ihr vermeidet es, nach einer Zeit frustriert aufzugeben.

Welches EV3 Modell soll ich bauen?

Auch das ist eine berechtigte Frage. In meinen bisherigen Kursen habe ich schon alle Arten von EV3 Modellen gesehen. Von eigenen Kreationen bis hin zu den Modellen, die LEGO mittels einer Anleitung mitliefert. Da so ein LEGO Mindstorms EV3 Kurs dazu gedacht, so viel wie möglich über den EV3 zu lernen, habe ich ein paar Vorschläge. Die machen es nicht nur mir in so einem Kurs einfacher, sondern vor allem auch euch. Und sie vermeiden viel Frust.

Die folgenden Hinweise und Ratschläge sind natürlich nur für diejenigen interessant, die schon einen LEGO Mindstorms EV3 haben und diesen mit zu einem Kurs bringen. Dazu aber im nächsten Abschnitt mehr.

— Track3r —

Am besten ist es, ein so einfaches Modell wie möglich mitzubringen. Beispielsweise das Modell Track3r, das über die Software LEGO Mindstorms EV3 Home Edition gebaut werden kann. Dieses Modell hat keinen unnötigen Schnickschnack, lässt sich einfach erweitern und ist damit gut als Grundmodell für nahezu alle Aufgaben in meinen Kursen geeignet. Vor allem habt ihr dann noch viele LEGO Technic Teile übrig, mit denen der Roboter dann modifizierbar ist, um schwierigere Aufgabenstellungen zu lösen.

—  Nicht geeignet —

Alle anderen Modelle der Home Edition des LEGO Mindstorms EV3 sind nicht wirklich gut für Kurse geeignet. Sie sind zu komplex, zu groß, zu schwer, haben schon zu viele Teile und Sensoren verbaut. Beispielsweise wird das Modell Ev3rstorm sehr häufig zu Kursen mitgebracht. Damit lassen sich aber kaum Aufgaben gut lösen, da wichtige Sensoren wie der Tastsensor und der Farbsensor an unvorteilhaften Stellen montiert sind, das Modell an sich zu wackelig ist und der Infrarotsensor ganz oben befestigt ist. Damit Objekte zu erkennen ist recht schwer.

— Educator & Tankbot —

Wer ein paar Teile mehr zur Verfügung hat oder sich einfach Ideen holen möchte, kann sich auch die beiden Modelle Educator und Tankbot anschauen. Beide Bauanleitungen sind im Beitrag zu den offiziellen Bauanleitungen zur LEGO Mindstorms EV3 Education Edition verlinkt. Auch diese Modelle, insbesondere der Educator, sind sehr minimalistisch und lassen viel Freiraum für spätere Erweiterungen.

Ich möchte euch mit diesen Tipps nicht gängeln oder gar vorschreiben, was ihr machen sollt. Allerdings zeigt meine Erfahrung, dass Teilnehmer und Teilnehmerinnen mit den deutlich komplexeren EV3 Modellen im Gepäck weitaus mehr Schwierigkeiten haben, mitzukommen und im Kurs dann teilweise gezwungen sind, ihre Modelle anzupassen. Meistens macht das eher weniger Spaß und führt schnell zu Frust.

Was muss ich mitbringen?

Jetzt zu einer sehr wichtigen Frage. Um dem Spaß im Kurs nicht im Wege zu stehen, gibt es einige wichtige Tipps von mir, was ihr zu einem Kurs mitbringen könnt und teilweise auch müsst.

— Eigene Hardware —

Wenn ihr einen eigenen LEGO Mindstorms EV3 habt, bringt diesen gerne mit. Dann könnt ihr mit einem eigenen Modell arbeiten und die Ergebnisse auch direkt mit nach Hause nehmen. Wer seinen eigenen EV3 mitbringt, kann auch gerne seinen eigenen Laptop mit der LEGO Mindstorms EV3 Home Edition mitbringen. Dann wisst ihr, auf welchem Rechner ihr arbeiten könnt und habt auch ohne Probleme die Möglichkeit, die selbst geschriebenen Programme mitzunehmen.

Wer eigene Hardware mitbringt und vielleicht auch Sensoren hat, die in der normalen LEGO Mindstorms EV3 Home Edition nicht mit dabei sind, der kann schon vorher die Software-Blöcke für diese zusätzlichen Sensoren installieren. Wie das geht, habe ich im Beitrag zu den offiziellen Software-Blöcken beschrieben.

— Stromversorgung —

Bitte denkt an volle Akkus beziehungsweise Batterien für den EV3 und den Laptop, falls ihr eigene Hardware mitbringt. Nichts ist ärgerlicher, als wenn mitten im Kurs die Stromversorgung schlapp macht. Meistens habe ich zwar Ersatz dabei, aber auch nicht immer und vor allem bei größeren Kursen nicht immer in ausreichender Anzahl.

— Verpflegung —

Bei längeren Kursen, meistens Tageskurse, ist eine ausreichende Verpflegung wichtig. Nicht immer kenne ich mich in der Umgebung des Kursortes aus und weiß, wo es etwas gibt. Gerade bei Tageskursen ist eine Pause von einer Stunde eingeplant, die ich auch immer versuche so gut wie möglich einzuhalten. Denn den ganzen Tag LEGO zu bauen und vor allem zu programmieren kann ganz schön anstrengend sein. Also bitte nicht unterschätzen, wie lange so ein Kurs dauern kann.

Fazit

Wie schon einmal geschrieben sind das alle nur Tipps und Tricks, die ich mal als Empfehlung aufgeschrieben habe. Ich möchte euch damit nicht gängeln oder sonst wie bevormunden. Allerdings habe ich mittlerweile eine große Anzahl von Kursen durchgeführt und die oben notierten Punkte sind mir immer wieder aufgefallen.

Ihr möchtet an einem Kurs teilnehmen und wisst nicht wo? Ich habe eine Liste aller Veranstaltungsorte, wo ihr euch informieren könnt.

Und bei Fragen gilt immer: Einfach eine Nachricht schreiben und ich melde mich gerne mit Infos zurück.

codefest.at [MS]: Microsoft auf den Software Quality Days 2016

Microsoft ist auch dieses Jahr wieder auf den Software Quality Days, 19. bis 20. Jänner, in Wien vertreten. Neben einem Ausstellungsstand mit Informationen zu unseren aktuellen Produkten und Angeboten für Entwickler nehmen wir auch an einem spannenden Bewerb teil – der Tool Challenge. Dabei ist mit einem Werkzeug (in unseren Fall natürlich Visual Studio, Visual Studio Team Services und Team Foundation Server) eine Aufgabe zu lösen die am Beginn der Konferenz bekannt gegeben wird. Am Ende des ersten Tages wählt das Publikum und eine Fachjury die beste Umsetzung und welches Werkzeug die Aufgabenstellung am Besten adressiert hat.

Drücken Sie uns die Daumen!

Am zweiten Konferenztag wird Gerwald Oberleitner noch einen Vortrag zum Thema Open ALM “Die offene Microsoft: Plattformübergreifendes ALM mit Visual Studio” halten:

"Microsoft loves Open Source": Unter dem neuen CEO Satya Nadella wurde mit "mobile first cloud first" eine neue Ära begonnen. Dies spiegelt sich auch in den Application Lifecycle Management (ALM) Werkzeugen wieder. Die heutige Technologielandschaft verlangt offene Tools die ohne Plattformvoraussetzungen zur Entwicklung, zum Testen, zur Gewinnung von Telemetriedaten, zum Betrieb oder zur Planung/Umsetzung von agilen Projekten eingesetzt werden können. Der Vortrag bietet einen Überblick beginnend mit einem Code Editor (auch für Linux, Mac OS verfügbar), über Visual Studio bis hin zum web-basierten ALM Tool Visual Studio Team Services. Auf QA/Telemetrie mit Application Insights (Windows, iOS, Android, Web) und den Build Prozess (node.js Agents, Integration von Testframeworks) wird speziell eingegangen.

Golo Roden: Programmierkonzepte, Teil 3: Rekursion

Die Rekursion ist eines der grundlegenden Konzepte in Mathematik und Informatik. Dennoch gibt es Programmiersprachen, die die Rekursion nicht oder nur bedingt unterstützen.

friends header

bloggers headline

links header

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