PHP-Funktionen in C# (noch nicht) als Programmbibliothek 👍 👎

Meine beispielhaften PHP-Funktionen in C# erfreuen sich gewisser Beliebtheit, sodass mich mittlerweile schon ein paar mal die Frage erreicht hat, ob ich diese nicht als Programmbibliothek zur Verfügung stellen möchte.

Aus technischer Sicht wäre das tatsächlich kein Problem und grundsätzlich sogar mit überschaubarem Aufwand automatisierbar. Ich habe daher auch selbst schon einmal mit dem Gedanken der Veröffentlichung als Paket gespielt, dennoch möchte ich erst einmal Abstand davon nehmen und zwar vor allem aus folgenden Gründen:
  • Design

    Die Umsetzung der Methoden (Bezeichner, Datentypen, Parameter) ist stark an PHP angelehnt, sprich ist soweit möglich identisch zu den gleichnamigen PHP-Funktionen. Diese Umsetzung widerspricht jedoch in nahezu allen Fällen in vielerlei Hinsicht den .NET-Guidelines für Programmbibliotheken und auch die Datentypen entsprechen oftmals nicht den bei C# für den jeweiligen Einsatzzweck üblichen.

  • Qualität

    Die Umsetzungen sollen einen Ansatz bzw. Tipps liefern, entsprechen jedoch in einigen Fällen nicht einer Qualität, die einen sofortigen und ungeprüften Einsatz in Produktionsumgebungen ermöglicht. Dies wäre für eine tatsächliche Veröffentlichung jedoch zwingend erforderlich. Darüber hinaus wären an einigen Stellen Optimierungen für den effizienten Einsatz in echten Projekten durchaus sinnvoll.

Dennoch stimme ich natürlich grundsätzlich zu, dass die Implementierungen einige praktische Funktionen anbieten, die in PHP durchaus üblich sind, in C# standardmäßig jedoch nicht ohne Weiteres zur Verfügung stehen. Daher werde ich an einer entsprechenden Programmbibliothek arbeiten, die ausschließlich solche Funktionalität in stabiler Qualität zur Verfügung stellt. Einen konkreten Zeitplan kann und möchte ich derzeit jedoch noch nicht nennen.

Melodien mit Systemtönen in C# 👍 👎

Im letzten Beitrag hatte ich Systemtöne mit C# vorgestellt. Der Übersicht wegen – und nicht ganz ernstzunehmen – möchte ich mit diesem separaten Beitrag noch ein paar Beispiele zur Umsetzung einfacher Melodien zeigen.

Dazu implementieren wir zuerst eine kleine Hilfsklasse mit einigen vordefinierten Werten:
Klasse zur Arbeit mit der Tonart C-Dur
01020304050607080910111213141516171819
public static class BeepMusic {    private static readonly Dictionary<char, int> frequencyCollection = new Dictionary<char, int>() {        ['C'] = 264, ['D'] = 297, ['E'] = 330, ['F'] = 352,        ['G'] = 396, ['A'] = 440, ['H'] = 495, ['c'] = 528    };
public static void PlayNotes(Duration duration, string noteList) { foreach(char note in noteList) { Console.Beep(frequencyCollection[note], (int) duration); } }
public enum Duration { Whole = 1600, Half = (Whole / 2), Quarter = (Half / 2), Quaver = (Quarter / 2) }}
Nun können wir diese Klasse statisch importieren und (sehr) einfache Melodien erzeugen:
Melodien
01020304050607080910111213141516171819202122232425262728293031323334353637383940
using static BeepMusic;
// TonleiterPlayNotes(Duration.Quarter, "CDEFGAHc");
// Alle meine EntchenPlayNotes(Duration.Quaver, "CDEF");PlayNotes(Duration.Quarter, "GG");PlayNotes(Duration.Quaver, "AAAA");PlayNotes(Duration.Half, "G");PlayNotes(Duration.Quaver, "AAAA");PlayNotes(Duration.Half, "G");PlayNotes(Duration.Quaver, "FFFF");PlayNotes(Duration.Quarter, "EE");PlayNotes(Duration.Quaver, "GGGG");PlayNotes(Duration.Half, "C");
// Hänschen KleinPlayNotes(Duration.Quarter, "GE");PlayNotes(Duration.Half, "E");PlayNotes(Duration.Quarter, "FD");PlayNotes(Duration.Half, "D");PlayNotes(Duration.Quarter, "CDEFGG");PlayNotes(Duration.Half, "G");PlayNotes(Duration.Quarter, "GE");PlayNotes(Duration.Half, "E");PlayNotes(Duration.Quarter, "FD");PlayNotes(Duration.Half, "D");PlayNotes(Duration.Quarter, "CEGG");PlayNotes(Duration.Whole, "C");PlayNotes(Duration.Quarter, "DDDDDE");PlayNotes(Duration.Half, "F");PlayNotes(Duration.Quarter, "EEEEEF");PlayNotes(Duration.Half, "G");PlayNotes(Duration.Quarter, "GE");PlayNotes(Duration.Half, "E");PlayNotes(Duration.Quarter, "FD");PlayNotes(Duration.Half, "D");PlayNotes(Duration.Quarter, "CEGG");PlayNotes(Duration.Whole, "C");
Interessante Effekte ergeben sich darüber hinaus bei (pseudo-)zufälligen Tonfolgen. In einem späteren Beitrag möchte ich gerne aufzeigen, wie man auch etwas ernsthafter mit diesem Thema in C# umgehen kann.

Systemtöne mit C# ausgeben 👍 👎

Eine häufige Frage ist das Ausgeben von Systemtönen mit C#. Da sich dieses Blog explizit nicht nur an Experten richten soll, möchte ich natürlich gerne auch dazu erst einmal ein paar Beispiele auflisten:
Systemtöne ausgeben
01020304050607080910
// Systemton per Steuerzeichen/KonsoleConsole.Write('\a');Console.Beep();
// Systemtöne per MethodenaufrufSystemSounds.Asterisk.Play();SystemSounds.Beep.Play();SystemSounds.Exclamation.Play();SystemSounds.Hand.Play();SystemSounds.Question.Play();
Etwas interessanter ist die Überladung von Console.Beep(…), welche nicht nur in der Lage ist, den Standardton (800 Hz, 200 ms) auszugeben, sondern darüber hinaus dessen Konfiguration in Tonhöhe und -länge ermöglicht:
Benutzerdefinierten Ton ausgeben
0102
// 2350 Hz-Ton für 650 ms abspielenConsole.Beep(2350, 650);

Sprachkurs und dazugehöriges Projekt 👍 👎

Goedendag! In diesem Beitrag soll es ausnahmsweise nicht um Programmiersprachen, sondern um eine natürliche Sprache gehen. Seit einiger Zeit besuche ich beim Sprachenatelier Berlin den Abendkurs Niederländisch, welcher einmal wöchentlich am späten Abend in kleiner Gruppe stattfindet. Die Kurse orientieren sich am Gemeinsamen Europäischen Referenzrahmen für den Fremdsprachenunterricht, wobei die einzelnen Sprachniveaus in mehrere Abschnitte unterteilt werden. Bereits der erste Kontakt verlief freundlich und zuvorkommend und unser (muttersprachlicher) Dozent vermittelt die Inhalte nicht nur sorgfältig, sondern auch sehr unterhaltsam. Begleitend zum Unterricht verwenden wir das Kursbuch Welkom! und das dazugehörige Übungsbuch. Die Inhalte sind klar strukturiert und durchaus ansprechend gestaltet. Für Fortgeschrittene besteht die Möglichkeit der Vorbereitung und Prüfung zum Certificaat Nederlands als Vreemde Taal (CNaVT), was auch mein Ziel darstellt.

Ich möchte an dieser Stelle aber primär gar nicht für diese(s) Unternehmen werben, sondern für eine leider recht wenig gelernte Sprache. Tatsächlich mussten die Kurse sogar schon mehrmals verschoben werden, da sich – wohlbemerkt in einer Großstadt wie Berlin – nicht genügend Teilnehmer fanden. Da ich mich insgesamt sehr für Sprachen interessiere, ist mir das Niederländische selbstverständlich bereits sehr früh aufgefallen. Abgesehen davon, dass man einiges "einfach so" versteht, bringt die sehr nahe Verwandtschaft zum (Nieder-)Deutschen – mit welchem ein Dialektkontinuum besteht – und Englischen auch interessante Beobachtungs- und Vergleichsmöglichkeiten mit sich. Die Aussprache gestaltet sich für deutsche Muttersprachler relativ einfach, ein paar Besonderheiten (z. B. ij oder ui) sind schnell verinnerlicht. Ich kann also nur empfehlen, sich einmal näher mit der Sprache unserer direkten Nachbarn auseinanderzusetzen. Nicht nur für den nächsten Urlaub, sondern möglicherweise auch als berufliche Perspektive.

Selbst wenn euch Niederländisch nun nicht unbedingt zusagen sollte, möchte ich mit diesem Beitrag unbedingt dazu ermuntern, sich näher mit der eigenen Sprache und anderen Sprachen auseinanderzusetzen. Sofern ihr weiterführendes Interesse habt, empfehle ich jedoch auf jeden Fall einen Sprachkurs in (kleinen) Gruppen vor Ort. Meiner Ansicht nach lässt sich damit auch in der heutigen Zeit am besten lernen, da ihr – zumindest bei gutem Unterricht – unmittelbare Rückmeldung zu eurer Aussprache erhaltet. Wesentliche Details könnten ansonsten schnell untergehen, da eine Sprache von mehr als nur Vokabeln lebt.

Ich werde zum Thema Sprache im Allgemeinen in einem separaten Beitrag noch etwas mehr schreiben. Zum Abschluss noch ein paar aus meiner Sicht interessante Verweise zur niederländischen Sprache:
Nederlands Meine kursbegleitende Webpräsenz zur niederländischen Sprache
 
buurtaal Sprach-Blog einer in Deutschland lebenden Niederländerin
Langenscheidt Deutsch-Niederländisch Wörterbuch
NEON Einführung in die Niederländische Sprachwissenschaft der FU Berlin
NiederlandeNet Informationsportal der Universität Münster
uitmuntend Wörterbuch
Wij spreken Nederlands Die 5000 wichtigsten Wörter
Wikipedia Niederländische Sprache
PS: Dieser Beitrag ist aus persönlicher Initiative heraus entstanden und ich erhalte dafür wie üblich keinerlei Ermäßigungen oder sonstige Begünstigungen von Seiten der genannten/verlinkten Unternehmen und Organisationen.

Zertifikat einer Adresse mit C# ermitteln 👍 👎

Manchmal möchte man gerne Zertifikate von Webseiten automatisiert abrufen. Im Rahmen eines Monitorings bietet es sich beispielsweise an, die Gültigkeitsdauer zu überwachen. Dazu eine beispielhafte Implementierung:
Zertifikat einer Webseite ermitteln
010203040506070809
public static X509Certificate2 GetCertificate(string hostName, int port = 443) {    using(TcpClient client = new TcpClient(hostName, port)) {        using(SslStream stream = new SslStream(client.GetStream())) {            stream.AuthenticateAsClient(hostName);
return new X509Certificate2(stream.RemoteCertificate); } }}
Die Implementierung ist dabei – wie üblich – auf das Wesentliche beschränkt; es findet keine umfassende Problembehandlung statt. Sofern die Methode in größerem Kontext zum Einsatz kommen soll, empfiehlt sich auf jeden Fall ein Blick auf die beteiligten Klassen TcpClient, SslStream und X509Certificate2 im MSDN.

Nun stehen uns diverse Informationen zur Verfügung; einige Beispiele zur Ausgabe auf der Konsole:
Methode verwenden und Informationen ausgeben
010203040506
X509Certificate2 certificate = GetCertificate("coders-online.net");
Console.WriteLine(certificate.Subject); // "CN=coders-online.net"
Console.WriteLine(certificate.NotBefore); // 30.04.2017 08:01:00Console.WriteLine(certificate.NotAfter); // 29.07.2017 08:01:00
Im Besonderen sei abschließend noch auf RemoteCertificateValidationCallback hingewiesen, mit welchem sich das Verhalten bei Zertifizierungsfehlern beeinflussen lässt.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche