Polyglot Notebooks: Eine praktische Einführung

Nach Jupyter-Vorbild kombinieren die .NET-zentrierten Polyglot Notebooks Markdown und Code. Sie erlauben mehrere Sprachen im gleichen Notebook.

In Pocket speichern vorlesen Druckansicht 12 Kommentare lesen

(Bild: jakkaje879/Shutterstock.com)

Lesezeit: 14 Min.
Von
  • Dr. Eike M. Hirdes
  • Arthur Grot
Inhaltsverzeichnis

Microsofts Polyglot Notebooks nehmen sich die interaktiven Jupyter Notebooks zum Vorbild, sind jedoch .NET-zentriert. Dieser Artikel bietet eine praktische Einführung in die Polyglot Notebooks und beschreibt anhand eines Beispiels ihre grundlegenden Konzepte, wie zum Beispiel Einrichtung, Nutzung verschiedener Programmiersprachen, Teilen von Variablen und Darstellen von Ergebnissen. Einschränkungen in der Nutzung und weiterführende Themen kommen ebenfalls zur Sprache.

Polyglot Notebooks erlauben es Nutzerinnen und Nutzern, Code mit Dokumentation (im Markdown-Format) anzureichern, die Ergebnisse auszugeben und zu visualisieren. Die Code-Blöcke lassen sich einzeln direkt aus dem Notebook ausführen und sogar miteinander kombinieren. Im Unterschied zu den häufig für Python eingesetzten Jupyter Notebooks sind sie darauf ausgelegt, mehrere Sprachen innerhalb eines Notebooks auszuführen.

Dadurch bieten Polyglot Notebooks eine Vielzahl an Anwendungsmöglichkeiten in der Softwareentwicklung:

  • Sie können interaktive Berichte erzeugen, um schnell Daten auszugeben, zu analysieren und sogar zu visualisieren.
  • Die leichtgewichtige Kombination verschiedener Programmiersprachen erlaubt die schnelle Umsetzung von Prototypen und Proof-of-Concepts.
  • Häufig benötigte Skripte lassen sich inklusive der Dokumentation ablegen, etwa für das Onboarding neuer Mitarbeiter.
Arthur Grot

Arthur Grot ist Softwareentwickler bei AIT GmbH & Co. KG. Er hilft dabei die Visionen seiner Kunden mit .NET- und Azure-Technologien in innovative Cloud- und IoT-Softwarelösungen umzusetzen.

Dr. Eike M. Hirdes

Dr. Eike M. Hirdes ist Azure DevOps Enabler bei der AIT GmbH & Co. KG. Er berät Unternehmen in den Bereichen agile Prozesse, Automatisierung und Administration, hauptsächlich im Bereich Azure DevOps. Als Autor der Blogserien AIT Tech Talk und Azure DevOps Nugget veröffentlicht er regelmäßig Artikel auf dem AIT Blog.

Um Polyglot Notebooks zu verwenden, ist zunächst die Erweiterung im Sourcecode-Editor Visual Studio Code (VS Code) zu installieren. Das erfordert mindestens das .NET SDK 7.0 sowie die Polyglot Notebooks Extension aus dem Visual Studio Marketplace. Die Extension installiert automatisch ebenfalls benötigte Jupyter Extensions.

Nach der Installation der benötigten Abhängigkeiten lässt sich mit der Befehlspalette in VS Code (Ctrl+Shift+P) und dem Befehl "Polyglot Notebook: Create default notebook" ein Notebook erstellen. In diesem Beispiel wird zunächst das .dib-Format ausgewählt. Eine Erläuterung der unterschiedlichen Dateiformate mit ihren Vor- und Nachteilen folgt später. Nach der Wahl des Formats öffnet sich ein Notebook mit ".NET Interactive" als ausgewähltem Kernel (Abbildung 1). Der Kernel ist ein im Hintergrund laufender Service, der den Code aus dem Notebook ausführt und das Ergebnis als Output zurückgibt. Jede Sprache hat einen eigenen Subkernel, der für die Ausführung der jeweiligen Sprache zuständig ist.

Neu erstelltes Polyglot Notebook in VS Code (Abb. 1)

Die Kopfleiste zeigt nicht nur den Kernel an, sondern ermöglicht es auch, zusätzlich Code- und Markdown-Zellen anzulegen. Eine Zelle ist eine strukturelle Einheit im Notebook, die entweder Code einer bestimmten Sprache oder Markdown enthält. Damit ist es möglich, Code und Markdown-Dokumentation im Wechsel zu schreiben (Abbildung 2).

Polyglot-Notebook-Übersicht (Abb. 2)

Der Befehl "Run All" führt alle Zellen in dem Notebook nacheinander aus und zeigt den Output an. Sollten beim Ausführen Probleme auftreten und der Kernel durch einen Fehler in einen falschen Zustand geraten, lässt er sich neustarten. Im "Variables"-Menü ist die Ansicht aktivierbar, mit der alle Variablen im Kernel einsehbar sind. Jede Code-Zelle lässt sich auch einzeln über das "Play"-Symbol (▷) ausführen.

Polyglots Multi-Language-Support umfasst derzeit folgende Programmier- und Auszeichnungssprachen: C#, F#, PowerShell, JavaScript, SQL, KQL, HTML, Mermaid, Python und R. VS Code bietet für die Sprachen Syntax-Highlighting, Code-Autovervollständigung und weitere Features an. Seit Dezember 2023 wird auch das HTTP-Protokoll von Polylgot unterstützt, das heißt, es können direkt von Notebooks aus HTTP-Anfragen gesendet und die Antworten angezeigt werden.

Zur Demonstration der Features von Polyglot Notebooks dient ein Beispiel, das von Grund auf neu erstellt wird. Die Ausgangssituation besteht darin, für eine Rückrufaktion schnell herauszufinden, welche Kunden ein bestimmtes Produkt gekauft haben. Diese Daten liegen in einer SQL-Datenbank. Der hierfür benötigte SQL-Connection-String soll im ersten Schritt aufgebaut und dafür die Zugangsdaten abgefragt werden. Im nächsten Schritt wird eine Verbindung mit der Datenbank hergestellt und anschließend werden die benötigten Daten abgerufen. Die Daten werden im letzten Schritt als Diagramm dargestellt, um schnell zu erkennen, welcher Kunde wie stark betroffen ist.

Das Beispiel zeigt, wie sich verschiedene Sprachen und Technologien (Polyglot Magic Commands, C#, SQL und Mermaid, das aus Markdown Grafiken gestaltet) in einem Notebook nutzen lassen und wie diese miteinander interagieren. Magic Commands sind spezielle Befehle für Polyglot Notebooks, die es ermöglichen, Code in anderen Sprachen innerhalb einer Code-Zelle auszuführen oder die Notebook-Umgebung zu steuern, um beispielsweise Variablen zu setzen.

Nachdem Polyglot eingerichtet ist, erfolgt das Erstellen des Connection-String für die SQL-Datenbank. Das erfordert vier Parameter: die URL des SQL-Servers, den Namen der Datenbank, einen Benutzernamen und das Passwort. Die ersten beiden Parameter sind fest definierbar, die letzten beiden sollen Nutzerinnen und Nutzer eingeben.

Mittels Markdown lassen sich sowohl das ganze Notebook als auch einzelne Code-Zellen erklären. Für den vorliegenden Connection-String sollen einerseits Variablen fest definiert, aber auch Nutzende nach Zugangsdaten gefragt werden. Die folgende Zelle im Markdown-Format dient der Dokumentation und Anleitung:

## Create SQL Connection String
Run the following cell to create a sql connection string.
You will be prompted to input username and password.

Als Nächstes erstellt man eine C#-Zelle, um die URL des SQL-Servers (serverUrl) und den Namen der Datenbank (databaseName) als Variablen fest zu definieren. Der Benutzername (username) und das Passwort (password) sollen abgefragt werden. Die Umsetzung für die Abfrage mit Polyglot Magic Commands findet sich in Listing 1. Nach dem Aufruf der Magic Commands in der C#-Zelle sind die erstellten Variablen im C#-Kernel nutzbar.

// Fetch user input with magic commands
var serverUrl = "polyglot.database.windows.net";
var databaseName = " polyglot";

#!set --value @input:"Please provide a username" --name username
#!set --value @password:"Please provide a password" --name password

Listing 1: Abfrage von Benutzerdaten mit Magic Commands in einer C#-Zelle

Wer das lieber komplett in C# umsetzen möchte, muss erst die Bibliothek Microsoft.DotNet.Interactive, hier als NuGet-Package, einbinden. Die C#-Alternative ist in Listing 2 zu sehen.

// Fetch user input with C#
using Microsoft.DotNet.Interactive;

var serverUrl = "polyglot.database.windows.net";
var databaseName = "polyglot";

var username = await Kernel.GetInputAsync("Please provide a username");
var password = await Kernel.GetPasswordAsync("Please provide a password");

LIsting 2: Abfrage von Benutzerdaten in einer C#-Zelle

Beide Arten der Eingabe unterstützen "Input" und "Password". Bei "Input" wird die Eingabe im Klartext angezeigt, bei "Password" hingegen maskiert. Achtung: Nur die Passworteingabe ist maskiert, der Inhalt ist in der Variablenansicht von Polyglot sichtbar (Abbildung 3).

Achtung! Abgefragte Passwörter sind in der Variablenansicht sichtbar (Abb. 3).

Der SQL-Connection-String wird aus den zuvor definierten Variablen zusammengesetzt:

string connectionString = $"Server={serverUrl};Database={databaseName}; User
Id='{username}';Password='{password}';Persist Security Info=true;Integrated Security=false;";