Bibliotheken, die man kennen muss (C++)

von Christoph

Das mag einige jetzt überraschen aber: das Rad wurde bereits erfunden. Softwareentwicklung macht Spaß, aber kreative Leistung ist dadurch gekennzeichnet, dass sie eben neu ist. Dass man die vorhandenen Resourcen nutzt, um etwas nicht Dagewesenes zu erstellen. In diesem Post möchte ich einige dieser Resourcen vorstellen, die in meiner Werkzeugkiste einen festen Platz gefunden haben und die die stabile Basis für Neuentwicklungen bilden.

  • Die Windows Template Library (aktuell v8.1) ist eine sehr schlanke Alternative zur MFC, der Bibliothek für grafische Oberflächen unter MS Windows. Die Lernkurve ist etwas steil. Wie der Name bereits andeutet, setzt die WTL massiv auf Templates. Sie stellt aber trotzdem eine deutliche Vereinfachung der GUI-Entwicklung im Vergleich zur nackten WinAPI dar ohne den Bloat der MFC.
  • Die Cairo Grafikbibliothek (aktuell v1.10.2) ist für mich unverzichtbarer Bestandteil geworden, wenn es um 2D-Visualisierungen geht. Wie GDI oder GDI+ kapselt Cairo alles: von der Textausgabe über Punkte, Linien bis hin zu Polygonen. Und das schöne: plattformunabhängig und mit verschiedenen Ausgabezielen wie zum Beispiel PNG, PDF, SVG oder eben ein Windows Fenster. (Democode im Github)
  • Kryptographie gefällig? Verschlüsselung? Symmetrisch, asymmetrisch? Prüfsummen, Base32-Codierung? Die Crypto++ Library (aktuell v5.6.1) hat sie alle! Wann immer Kryptographie benötigt wird, ist das die Bibliothek meiner Wahl. Zum Beispiel bei Software-Lizensierung über Produktschlüssel. Weiterhin sehr gut, dass Kompression über die ZLib (aktuell v1.2.5) bereits eingebaut ist. Diese nutze ich meist auch in ihrer ungekapselten Rohform, wenn es mal ohne Verschlüsselung geht.
  • SQLite (aktuell v3.7) hat sich für mich als Allzweckwaffe für Datenspeicherung etabliert. In diese dateibasierte embedded Datenbank passt einfach alles. Und der Zugriff funktioniert allerbequemst mit standardisierten SQL-Queries. Das beste: die Datenbanken lassen sich auch aus .NET ansprechen und dass sie auch auf anderen Betriebssystemen als MS Windows lesbar sind, muss garnicht mehr erwähnt werden.

Mir fallen noch viel mehr ein, aber man sollte Aufzählungen aus didaktischen Gründen nicht wuchern lassen. Deswegen erwähne ich nur kurz und zum selbst weiterrecherchieren noch cURL (aktuell v2.20) zum Herunterladen von Daten aus dem Web (und zum Beispiel cachen mit SQLite s.o.) sowie Googles v8 (aktuell v3.5), der rasenden Javascript-Engine aus dem Chrome Browser (Democode im Github).

Open-Source QR-Code in ASP.NET

von Christoph

Heute geht es um eine ganz andere Art der Informationsvisualisierung. Genauer: die Codierung von Information in Barcodes. Diese sind eigentlich bekannt, zum Beispiel in Form von Strichcodes auf fast allen Produktverpackungen. Strichcodes -eindimensional- sind die einfachste Form. Hier soll es um zweidimensionale Codes gehen, die in anderen Ländern schon stärker verbreitet sind und mehr Informationen fassen. In Japan ist der QR-Code (Quick-Response) bereits seit Jahren ein Renner. Im Rahmen des sog. Mobile Tagging fotografieren die Japaner alle möglichen Codes mit ihren Handys hinter denen sich Internetadressen, Mailadressen oder Kurznachrichten verbergen.

Beispiel QR-Code

Doch wie erzeugt man diese Codes? Es gibt zahlreiche SDKs. Fast alle sehr sehr kostenpflichtig. Die günstigen ab 1700 Euro, der Schnitt bei 2500 Euro. Wir wollen es aber kostenlos haben ganz nach dem deutschen Motto Geil ist Geil (Häh? Sic!). Für C++ stößt man da auf die Zint-Bibliothek unter der GNU GPL. Diese kann alle möglichen Arten von Barcodes generieren, unter andem auch den begehrten QR-Code. Also auf gehts mit der ASP.NET Integration!

Zint ist in nativem C geschrieben, es wird also eine Brücke in die .NET-Welt benötigt. Diese wird in C++/CLI gebaut. Doch von Anfang an: Im Zint-Package enthalten ist eine Visual Studio Solution mit einer Konfiguration für den Bau ein statischen Bibliothek (lib). Diese ist auszuwählen und im Release-Modus zu erstellen. Ein neues C++/CLI Projekt referenziert diese Bibliothek und wrappt die Grundfunktionen für den Managed Sprachen wie C# und Visual Basic.NET. Das sieht im Detail dann auszugsweise so aus:

public ref class BarcodeFactory
{
private:
    array<bool>^ m_data;

public:
    BarcodeFactory();
    int Encode(String^ data, int type);
    bool GetAt(int x, int y);
};

Die zu codierenden Daten werden als (managed) String an die Methode Encode übergeben. Der Parameter type enthält die Kennung des zu erzeugenden Strichcodes und wird unverändert an Zint weitergegeben. Für den QR-Code ist 58 anzugeben. Nach dem Aufruf ist das Array m_data mit Flags belegt, ob bestimmte Pixel gesetzt sind oder nicht - damit lässt sich der Code dann zeichnen.

Die entstandene Mixed-Mode-Assembly kann in ASP.NET referenziert werden. Auf diesem Server übernimmt das ein Handler (ashx), der über den Querystring gesteuert wird und eine PNG-Grafik des Codes ausliefert. Es gibt nur 2 Get-Parameter und nur der erste davon ist obligatorisch.

  1. q zu codierende Daten (Achtung: Url-Encoded!)
  2. s Skalierung der Pixel, Standard ist 4, d.h. ein Pixel im Barcode wird als ein 4x4 großes Quadrat gezeichnet

Hier ein paar Beispiele für den Aufruf des Handlers:

  1. https://christoph.stoepel.net/api/Barcode?q=Hallo+Welt (Hallo Welt mit Standard Einstellungen)
  2. https://christoph.stoepel.net/api/Barcode?q=Hallo+Welt&s=6 (Hallo Welt mit 6x6 großen Quadraten
  3. https://christoph.stoepel.net/api/Barcode?q=Hallo+Welt&s=2 (Hallo Welt etwas verkleinert)
  4. https://christoph.stoepel.net/api/Barcode?q=https%3A%2F%2Fchristoph.stoepel.net%2F (die URL dieser Seite)

Achso, bezüglich der GNU GPL des Zint-Projektes: der Download des GPL-infizierten Quelltexts ist in obigem QR-Code codiert :)