C# 9: Verbessertes „Pattern Matching“

Relational Patterns

Ab C# 9 können Werte mit Relational Patterns geprüft werden:

<kleiner als
>grösser als
<=kleiner oder gleich
>=grösser oder gleich

Dazu nun ein Code Beispiel:

using System;

namespace ConsoleApp2
{
    class Program
    {
        public class Animal
        {
            public string Name { get; set; }
            public int Weight { get; set; }
            public int YearOfBirth { get; set; }
        }

        static void Main(string[] args)
        {
            var animal = new Animal()
            {
                Name = "Tiger"
                ,Weight = 300
                ,YearOfBirth = 2016
            };

            if (animal is Animal { Weight: > 200 } animalWeightMoreThen200)
            {
                Console.WriteLine($"Animal is more then 200kg! " +
                    $"Weight: {animalWeightMoreThen200.Weight}kg");
            }
        }
    }
}

Wir haben ein Objekt Animal. Bevor wir mit diesem Objekt arbeiten, prüfen wir, ob es vom Typ Animal ist. Mit einem „Relational Pattern“ können wir nun auch sicherstellen, dass unser Tier mehr als 200 kg wiegt, bevor wir damit arbeiten.

Pattern Combinators

Seit C# 9 haben wir nun auch die Möglichkeit mehrere Patterns zu kombinieren. Dazu haben wir folgende Möglichkeiten:

andund
oroder
notnicht

Dazu nun ein Code Beispiel:

using System;

namespace ConsoleApp2
{
    class Program
    {
        public class Animal
        {
            public string Name { get; set; }
            public int Weight { get; set; }
            public int YearOfBirth { get; set; }
        }

        static void Main(string[] args)
        {
            var animal = new Animal()
            {
                Name = "Tiger"
                , Weight = 299
                , YearOfBirth = 2016
            };

            if (animal is Animal { Weight: > 200 and < 300, 
                Name: "Tiger" } tigerWeightBetween200And300)
            {
                Console.WriteLine($"The tiger weight is between 200kg and 300kg! " +
                    $"Weight: {tigerWeightBetween200And300.Weight}kg");
            }
        }
    }
}

Wir haben ein Objekt Animal. Bevor wir mit diesem Objekt arbeiten, prüfen wir, ob es vom Typ Animal ist. Mit den kombinierten „Relational Patterns“ können wir nun auch sicherstellen, dass unser Tier mehr als 200 kg und weniger als 300 kg wiegt und der Name Tiger ist, bevor wir damit arbeiten.

Nützliche Links

Microsoft docs: Pattern matching enhancements

C# 9.0: Improved Pattern Matching

Microsoft Learn

Mit der Webplattform Microsoft Learn bietet Microsoft viele verschiedene Module und Lernpfade (praktische Übungen), um sich mit den aktuellen Microsoft Technologien kostenlos weiterbilden zu können.

Das Einzige, was man dazu braucht, ist ein Microsoft Learn-Konto. Die Module sind versehen mit einem theoretischen und einem praktischen Teil, welcher dann mit der Hilfe einer Sandbox (Azure Shell mit allen benötigten Tools) durchgeführt werden kann.

Es gibt auch sogenannte „30 Days to Learn It-Herausforderungen“. Dabei werden mehrere Module zu einer Sammlung zusammen gefasst. Beispiel die „Cloud Skills Challenge – Azure Developer“. Sie besteht aus 35 Module, für die man laut Microsoft ca. 28 Std. und 16 Min. Zeit investieren muss. Beendet man die Herausforderung innerhalb dieser 30 Tage, erhält man eine 50% Gutschrift für ein „Microsoft Certification exam“.

Viel Spass beim Ausprobieren und Lernen! :o)

Nützliche Links

Microsoft Learn

30 Days to Learn It

Meine Badges & Trophäen

C# 9: Init only Properties / init only setters

Init only Properties sind unveränderbare Datenobjekte, die einmal initialisiert den Zustand nicht mehr ändern können. Dazu verwendet man das Schlüsselwort init anstelle von set.

// Auto property
public Guid MyId { get; init; }

// property
private Guid myId;
public Guid MyId{
  get {return myId;}
  init {myId = value;}
}

// lambda property
private Guid myId;
public Guid MyId{
  get  => myId;
  init => myId = value;
}

Wird nun die „MyId“ einmal zugewiesen, kann diese nicht mehr versehentlich überschrieben werden. „MyId“ kann nur bei der Objektinitialisierung oder über den Konstruktor festgelegt werden.

// object class with the secret 
public class MySecret
 {
  public MySecret()
  {
  }
  public MySecret(Guid myId)
  {
    MyId = myId;
  }
  public Guid MyId { get; init; }
}

// Example 1
// create an object with the secret
// assign with object initializer
MySecret mySecret = new MySecret()
{
  MyId = Guid.NewGuid()
};


// Example 2
// create an object with the secret
// assign in the instance constructor
MySecret mySecret2 = new MySecret(Guid.NewGuid());

Nützliche Links

docs.microsoft.com: init only setters

Azure: Sammelsurium

Begrifflichkeiten

Azure RBACRollenbasierte Zugriffssteuerung von Azure
Im Azure-Portal -> Zugriffssteuerung (IAM)

1. Sicherheitsprinzipal (wer: Benutzer, Gruppe oder Anwendung)
2. Rollendefinition (was: Sammlung von Berechtigung – Besitzer, Mitwirkender, Leser oder Benutzerzugriffsadministrator)
3. Bereich (wo: Verwaltungsgruppe, Abonnement, Ressourcengruppe oder Ressource)
Durable FunctionsEine Erweiterung der Azure Functions.
Mithilfe von Durable Functions können komplexe zustandsbehaftete Funktionen in einer serverlosen Umgebung implementiert werden. (Workflows)

– Ereignisgesteuerten Code
– Funktionen miteinander verketten
– Funktionen orchestrieren und koordinieren und die Reihenfolge bestimmen
– Synchron als auch asynchron
WebhookBenutzerdefinierte HTTP-Rückrufe
Azure FunctionsCode ausführen, ohne eine Infrastruktur explizit bereitstellen oder verwalten zu müssen.

– Function as a Service (FaaS) oder einen Microservice
– Ereigsnisgesteuert (Trigger)
Azure Queue StorageAzure-Dienst, der cloudbasierte Warteschlangen implementiert. Anwendungskomponenten greifen mithilfe einer REST-API oder einer von Azure bereitgestellten Clientbibliothek auf eine Warteschlange zu. Eine Nachricht in der Warteschlange ist ein Bytearray von bis zu 64KB.

NuGet-Paket Azure.Storage.Queues

1) await queue.CreateIfNotExistsAsync();
2) await queue.AddMessageAsync(message);
3) CloudQueueMessage message = await queue.GetMessageAsync();
await queue.DeleteMessageAsync(message);
Azure-SpeicherkontenEnthält alle Azure Storage-Datenobjekte: Blobs, Dateien, Warteschlangen, Tabellen und Datenträger. Das Speicherkonto stellt einen eindeutigen Namespace für Ihre Azure Storage-Daten bereit, auf den von jedem Ort der Welt aus über HTTP oder HTTPS zugegriffen werden kann.
SpeicherkontoschlüsselSind Schlüssel welche in Azure-Speicherkonten verwendet werden. (Primär & Sekundär)

Speicherkonto > Einstellungen > Zugriffsschlüssel
Shared Access Signature (SAS)Eine SAS ist eine Zeichenfolge, die ein Sicherheitstoken enthält, das einem URI angefügt werden kann. Zweck, bei nicht vertrauenswürdige Clients. Die SAS definiert die Berechtigungen und den Zugriffszeitraum des Clients.
Azure Key VaultIst ein Clouddienst zum sicheren Speichern und Zugreifen von API-Schlüssel, Kennwörter, Zertifikate oder kryptografische Schlüssel.
BlobsSkalierbarer Objektspeicher für Text- und Binärdaten. (Blockblobs, Seitenblobs, Anfügeblobs)
Table StorageNoSQL-Speicher für die schemalose Speicherung von strukturierten Daten
Azure-Speicherkonten REST-API-EndpunkteBlobs
https://[name].blob.core.windows.net/
Warteschlangen
https://[name].queue.core.windows.net/
Tabelle
https://[name].table.core.windows.net/
Dateien
https://[name].file.core.windows.net/
Azure-RessourceEine Azure-Ressource ist ein verwaltbares Element in Azure
Visual Studio-WorkloadsEine Workload ist ein vorkonfiguriertes Bündel von Tools innerhalb von Visual Studio, das zusammengefasst wurde, um Entwicklern zu ermöglichen, bestimmte Arten von Anwendungen zu erstellen, bestimmte Entwicklungssprachen zu verwenden oder für bestimmte Plattformen zu entwickeln.
Azure App ServiceDienst für das Hosten von Webanwendungen, REST-APIs und Back-End-Diensten.
Azure App Service-PlanDefiniert die Computeressourcen, welche die App in Anspruch nehmen wird, wo sich diese Ressourcen befinden, wie viele zusätzliche Ressourcen der Plan in Anspruch nehmen kann und welcher Tarif verwendet wird.
Azure Security Center (ASC)Ist ein Überwachungsdienst, der Schutz vor Bedrohungen für Ihre gesamten Dienste ermöglicht.
DatagrammePakete von Daten, die von einer Komponente an eine andere gesendet werden. (Nachrichten und Ereignisse)
Azure Service BusNachrichten auf drei verschiedene Arten austauschen: über Warteschlangen, Themen und Relays

Abbildung mit einer Beispielwarteschlange für Nachrichten, bei der ein Absender die Nachrichten an die Warteschlange sendet und ein Empfänger diese einzeln aus der Warteschlange abruft.
Bild mit einem Absender, der über ein Thema mit drei Abonnements Nachrichten an mehrere Empfänger sendet. Diese Abonnements werden von drei Empfängern genutzt, um die relevanten Nachrichten abzurufen.

Ist die Kommunikation ein Ereignis? Falls ja, Event Grid oder Event Hubs verwenden.

Soll eine einzelne Nachricht an mehrere Ziele übermittelt werden? Falls ja, verwenden Sie ein Service Bus-Thema. Falls nicht, verwenden Sie eine Warteschlange.
MEAN-StapelAkronym aus seinen Komponenten: MongoDB, Express.js, AngularJS und Node.js

MongoDB zum Speichern von Informationen
Express zum Weiterleiten aller HTTP-Anforderungen an den entsprechenden Handler
AngularJS zum Verknüpfen der Benutzeroberfläche mit der Geschäftslogik des Programms
Node.js zum Hosten der serverseitigen App
Azure Event HubsIst ein cloudbasierter Dienst zur Ereignisverarbeitung, der pro Sekunde Millionen von Ereignissen empfangen und verarbeiten kann.

Nützliche Links:

Azure für .NET-Entwickler

.NET Architecture Guides

Azure: Attach debugger to App Service funktioniert nicht (Visual Studio 2019 V. 16.09.3)

Beim Versuch eine .NET 5 Webapplikation zu debuggen (Cloud Explorer -> App Service -> Attach Debugger) wurde mir immer folgende Meldung angezeigt:

Die Verbindung mit dem Remoteendpunkt wurde beendet.

Folgendes wurde überprüft:

  • Remotedebuggen ist aktiviert (App Service <Name> -> Konfiguration -> Allgemeine Einstellungen -> Debuggen)
  • Published wurde die „Debug“ Konfiguration
  • Korrektes Target Framework eingestellt
  • App Service ist erreichbar

Ursache

Nach einer Weile recherchieren im Netz habe ich folgende Erkenntnis erlangt:

Visual Studio schickt eine Initialisierungsmeldung an den Remote Debugger. Im Inhalt sind unteranderem installierte Komponenten des VS. Es scheint, dass bei manchen VS Installationen diese Meldung die erwartete Grösse überschreitet, was dann zu einem sofortigen Abbruch führt. Gemäss Microsoft wurde dies bereits behoben im „App Service image Version 93“ jedoch noch nicht weltweit verteilt. Was nun aber fortlaufen passieren soll. (24.02.2021)

Mit Hilfe von Kudu kann dies bei der Webapplikation überprüft werden. Cloud Explorer -> App Service <Name> -> Open in Kudu

Test halber habe ich einen neuen App Service-Plan mit Standort USA erstellt. Eine Testapplikation published und das Debuggen gestartet. Und es hat funktioniert. Der Azure App Service war in der Version:

Was ist nun die Lösung?

  1. Warten auf auf die „App Service image Version 93“
  2. Auf einen anderen Standort ausweichen, wenn möglich
  3. Als letzte Möglichkeit -> Als Workaround kann auch die Visual Studio Installation angepasst werden und nicht verwendete Komponenten deinstalliert werden (Habe ich selber nicht verifiziert)

Update (06.04.2021)

Das „App Service Image Version 93“ ist jetzt auch an meinem verwendeten Standort angekommen und das Debuggen funktioniert wieder.

Nützliche Links

https://developercommunity.visualstudio.com/t/attach-debugger-to-azure-app-service-not-working/933126

.NET 6 Multi-platform App UI (MAUI)

Mit .NET 6 wird MAUI (Multi-platform App UI) xamarin.forms revolutionieren und die Entwicklung von „Cross-platform“ Applikationen noch flexibler, produktiver und somit noch wirtschaftlicher ermöglichen.

Egal in welchem Umfeld werden bereits heute verschiedenste Plattformen (iOS, Android, Windows, Mac) eingesetzt, was zunehmend die Entwicklung von Applikationen erschwert. In vielen Betrieben wird auch das Thema BYOD (Bring Your Own Device) gefördert und sorgt dafür, dass die Plattform Vielfalt noch herausfordernder wird.

Das sind die Vorteile von .NET MAUI:

  • Free & open source
  • Cross-platform, native UI
  • Single project system, single codebase
  • Deploy to multiple devices, mobile & desktop
    • Native User Interfaces
    • Native API Access
    • Native Performance

Was heisst native UI?

Native UI heisst, egal welche Plattform ich als Benutzer verwende, ich erhalte immer die erwartete Oberfläche / Elemente (Datumspicker, Buttons, Navigation, Dark-Light Mode usw.) meiner verwendeten Plattform.

Video: The Future of Native Apps Development in .NET 6

Nützliche Links

Discord: DotNetEvolution

Xamarin

github: .NET MAUI

.NET 6.0 Preview Download

.NET 5.0 (Linux, macOS, and Windows)

Ich beschäftige mich schon eine ganze Weile mit dem .NET Framework und .NET Core, privat wie auch beruflich. Für Projekte im privaten Bereich wurde .NET für mich erst so richtig interessant, als es dank Mono möglich wurde, Programme auch auf einem Raspberry Pi auszuführen.

Mit der Einführung von .NET Core der Open Source und Cross-Plattform Version von .NET, hat Microsoft mir und einer grossen Community eine spannende Entwicklungsplattform zur Verfügung gestellt.

Was ich besonders an der .NET Plattform schätze, ist wirklich die Idee dahinter. Eine Entwicklungsplattform zur Verfügung zu haben, in der ich praktisch alle benötigten Szenarien bedienen kann. So ist es unteranderem möglich mit nur einer Entwicklungsumgebung, (Visual Studio) Desktopanwendungen, Clouddienste, Webapplikationen, Web-Services und APPS (Android, iOS) zu erstellen. (Aufzählung nicht vollständig)

Wird nun alles mit .NET 5 noch besser? Wir werden sehen, wohin diese spannende und sehr flexible Entwicklungsplattform uns führt. Erste Erfahrungen mit einer .NET 5 Webapplikation konnte ich bereits sammeln. Diese haben wir am 08.12.2020 in Betrieb genommen und sind bis jetzt nicht entäuscht worden.

Hier habe ich nun ein paar interessante Informationen rund um .NET 5 zusammen getragen:

Introducing .NET 5 (06. Mai 2019)

Introducing .NET 5

Announcing .NET 5.0 (10. November 2020)

Announcing .NET 5.0

.NET 5 verfügbar für Windows, macOS und Linux. Für x86, x64, Arm32, Arm64

.NET Conf 2020 – Keynote (12. November 2020)

.NET Conf 2020 – Das .NET Ökosystem

.NET ecosystem momentum – aus dem Video

Nützliche Links:

What’s new in .NET 5

.NET 5 Herunterladen

Free .NET Architecture Guides

.NET Channel on YouTube

.NET Foundation on YouTube

Visual Studio

Visual Studio Community

Eine Saunasteuerung von Johnny Hooyberghs – MijnSauna: .NET 5 (Docker, Webservice, Raspberry Pi)

(C / C++): Bitmanipulation mit bitweise Operatoren

Bitweises Komplement / Bitwise NOT

Der NOT-Operator (~) invertiert jedes einzelne Bit einer Zahl.

Beispiel mit 8-Bits:

 0000 0100 = 4
~0000 0100 = 1111 1011 = 251

Bitweises UND / Bitwise AND

Der AND-Operator (&) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn beide Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
&1001
-----
 0001

Bitweises ODER / Bitwise OR

Der OR-Operator (|) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn eines der beiden Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
|1001
-----
 1001

Bitweises exklusives ODER / Bitwise XOR

Der XOR-Operator (^) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn die beiden Bits unerschiedliche Werte haben.

Beispiel mit 4-Bits:

 0001
^1001
-----
 1000

Linksverschiebung / Left shift

Bei der bitweise Linksverschiebung (<<) werden alle Bits um die angegebene Position nach links verschoben.

Beispiel mit 4-Bits:

0001 << 1 = 0010
0001 << 2 = 0100

Rechtsverschiebung / Right shift

Bei der bitweise Rechtsverschiebung (>>) werden alle Bits um die angegebene Position nach rechts verschoben.

Beispiel mit 4-Bits:

0010 >> 1 = 0001
0100 >> 2 = 0001
1010 >> 1 = 0101 

Bit löschen

Will man in einem Byte mehrere Bits auf 0 setzen, wird dazu die UND-Verknüpfung verwendet.

PORTB &= ~(1 << 0)

Löscht Bit 0

Sollen gleichzeitig mehrere Bits gelöscht werden:

PORTB &= ~((1 << 0) | (1 << 2));

Löscht Bit 0 und 2 in PORTB

Bit invertieren


PORTB ^= (1 << 3);

Invertiere das dritte Bit

Bit setzen


PORTB |= (1 << 2);

Setzt das Bit 2 auf 1

Beispiel Methoden:


void set_PORTB_bit(int8_t  position, int8_t  value)
{
	// Sets or clears the bit in position 'position'
	// either high or low (1 or 0) to match 'value'.
	// Leaves all other bits in PORTB unchanged.
	
	if (value == 0)
	{
                // Set bit # 'position' low
		PORTB &= ~(1 << position);
	}
	else
	{
                // Set bit # 'position' high
		PORTB |= (1 << position);
	}
}

void set_Pin_Mode(int8_t  position, int8_t  value){
	if (value == 0)
	{
                // Set bit # 'position' to input
		DDRB  &= ~(_BV(position));
	}
	else
	{
                // Set bit # 'position' to output
		DDRB  |= (1 << position);
	}
}

Nützliche Links

mikrocontroller.net: Bitmanipulation

wikipedia: Bitweiser Operator

stackoverflow.com: How do you set, clear and toggle a single bit?

LearnCpp.Com: Bitwise operators

Logic Gate Simulator

AVR: Unterschied zwischen sleep_cpu() und sleep_mode()

Die zwei Methoden unterscheiden sich nur beim Handling des SE-Bit. Bei der Methode sleep_cpu() muss durch den Code sichergestellt werden, dass zuvor das SE-Bit gesetzt wird und nach dem Aufwachen der CPU das SE-Bit wieder gelöscht wird.

Beispiel mit sleep_cpu():


    sleep_enable();
    sleep_cpu();
    sleep_disable();

Beispiel mit sleep_mode():


    sleep_mode();

Nützliche Links

avr-libc: sleep

C#: Prüfen ob die Datenbankverbindung auf den SQL – Server verschlüsselt wird

Muss die Datenbankverbindung von einer C#-Applikation zum SQL-Server verschlüsselt werden, muss der SQL-Server mit einem Zertifikat korrekt konfiguriert sein. Im weiteren müssen im ConnenctionString Parameter konfiguriert werden, damit eine verschlüsselte Verbindung hergestellt wird. Dazu wird der ConnenctionString mit folgenden Parametern versehen:

  • encrypt=true SSL Encryption aktivieren.
  • trustServerCertificate=false Zertifikat wird validiert. (Bei self-signed Zertifikaten auf „true“ setzen)

Wird nun mit der C#-Applikation eine Verbindung auf den SQL-Server hergestellt, sollte die Verbindung verschlüsselt sein. Wie kann man sich jedoch sicher sein? Eine Möglichkeit ist die Verwendung eines „Sniffers“, wie WireShark, oder aber man prüft dies auf dem SQL-Server selber.

Auf dem SQL-Server kann man folgende SQL-Abfrage absetzen, um alle Verbindungen mit ihren Verschlüsselungsoptionen anzuzeigen:


SELECT session_id,encrypt_option
FROM sys.dm_exec_connections

session_id  encrypt_option
----------- ----------------------------------------
73          TRUE
73          TRUE
73          TRUE
75          FALSE
76          FALSE

Bei den Verbindungen mit der SessionId 73 sehen wir, dass die Verschlüsselung aktiviert und verwendet wird. (encryption_option = true)

Nützliche Links

SQL Server SSL Troubleshooting Steps
Connection Properties
TrustServerCertificate Property