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).

Geogen v3.1 ist online

von Christoph

Geogen ist in der Version 3.1 online verfügbar. Die interne Datenbank-Zugriffsschicht ist nun unabhängig von einem bestimmten Hersteller. Vorher war die Verwaltung von Ranglisten, Nutzerkommentaren und Geograpphie nur mit dem MS SQL-Server via System.Data.SqlClient möglich. An dessen Stelle treten konsequent die Factory-Methoden aus System.Data.Common. Im derzeit stattfindenden Testlauf liegen alle Daten in einem SQL-Server Compact Edition 4.0 - also im selben Prozess wie ASP.NET. Dadurch sollte die Mehrzahl der Nur-Lese-Zugriffe etwas performanter sein.

Im Rahmen dieses Refactorings habe ich auch gleich die MS Ajax Bibliothek samt Ajax Control Toolkit entsorgt. Diese wird von Microsoft zwar noch ausgeliefert aber nicht mehr weiterentwickelt. Das Pferd ist also tot. Man muss sich da auch nichts vormachen: MS Ajax war zu aufgebläht, zu langsam und (was das Control Toolkit betrifft) zu fehleranfällig. Ich habe die Webseite daher komplett auf jQuery umgestellt. Es ist enorm was da grade in der Entwicklung abgeht.

Die erste Änderung, die dadurch möglich wurde, ist ein Autocompleter auf dem Eingabetextfeld. Einfach ein paar Buchstaben eingeben und im Hintergrund werden per Ajax einige Vorschläge herausgesucht, welchen Namen man meinen könnte. Das Control-Toolkit enthielt auch einen Autocompleter, allerdings vertrug er sich nicht nicht mit den per Javascript abgerundeten Ecken. Mein Bug-Report dazu wurde damit abgetan, dass man sich nicht um die Z-Order kümmern kann und das Problem nicht lösbar sei. Die jetzigen runden Ecken kommen per CSS auf alle modernen Browser. Im Internet Explorer bleibt es kantig.

Die Kartenübersicht wurde verschlankt. Die Steuerelemente für Zusatzparameter, die sowieso niemand benutzt hat, habe ich entfernt. Eine derartig fortgeschrittene Konfiguration ist nur noch über die Kaufsoftware möglich. In diesem Zuge wurden die Karten auch gleich in die Ergebnisseite integriert. Mit Hilfe der Fancybox werden sie in Form eines Overlays vor leicht ausgegrautem Hintergrund angezeigt.

Weitere Änderungen sind eher Kleinigkeiten: zu selteneren Namen wird ein maschinenlesbarer Balkencode berechnet mit dem man irgendwelche Gegenstände bekleben (neudeutsch taggen) kann, auf der Startseite läuft ein Ticker zuletzt abgerufener Namen aller Besucher, der phonetische Namensgraph hat den Beta-Status verlassen und ist nun auch in der englischen Version verfügbar und ganz neu gibt es auch eine Fassung für Mobilgeräte. Das nächste Update soll dann ein größeres werden (Version 4.0 oder zumindest 3.5). Ich experimentiere dazu etwas mit HTML5 und Canvas...

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 :)

Der Cairo-Compilier-Krampf

von Christoph

Achtung sehr technisch. Ich schreibe diesen Eintrag hauptsächlich aus Eigennutz, denn ich muss irgendwie festhalten, wie man die Cairo-Bibliothek compiliert. Ich habe dafür unübertriebene drei Stunden gebraucht und das will ich beim nächsten mal unbedingt verhindern. Cairo ist eine quelloffene 2D-Vektorgrafik-Bibliothek für Entwickler. Im wesentlichen kann man damit Linien, Dreiecke, Vierecke und Mehrecke (also Kreise, Texte und beliebeige Polygone) zeichnen. Und das ganze wahnsinnig performant und gleichzeitig plattformunabhängig. D.h. für Windows: keine GDI Odyssee und auch keine GDI+ DLL-Hölle.

Die derzeit aktuelle Version ist Cairo 1.10 vom 25. September 2010. Das Ziel ist ein Kompilat in eine einzige DLL (die man einfach zusammen mit der Anwendungs-Exe weitergibt) unter Visual Studio 2010. Nun wäre die Geschichte kein Krampf, wenn es sich bei Cairo nicht vorrangig um ein Linux-Projekt handeln würde. Die Windows- Unterstützung ist also allenfalls rudimentär.

1. Doch fangen wir von vorne an: Benötigt wird natürlich erstmal der Cairo-Quelltext. Ebenfalls herunterzuladen ist das aktuelle Pixman-Paket. Darin sind die absoluten Low-Level Routinen für Cairo zu finden. Weiterhin bestehen Abhängigkeiten zur zlib (aktuell v1.2.5) und zur libpng (aktuell v1.4.4). Während sich letztere beiden mit einer Visual Studio-Solution bauen lassen, sind bei Pixman und Cairo nur Makefiles mitgeliefert. Die sind allerdings zu kompliziert für Microsofts NMake, so dass man sich am besten MSYS mit einem richtigen Make installiert. Tja. Nur dass die MSYS-Leute ihr System in einzelne Archive verpackt deployen. Anstelle sich 500 Einzel-Archive herunterzuladen und zu entpacken, empfehle ich das MozillaBuild-Paket. Da kriegt man zwar noch einiges mehr, aber wenigstens läuft das ganze dann und scheitert nicht an einer fehlenden DLL.

2. ZLib bauen ist recht einfach über die Solution im Contrib-Ordner. Wir wählen die statische Variante (zlibstat) in der Releasekonfiguration. In den Projekteigenschaften sicherstellen, dass die Codegenerierung auf Multithreaded (MT, wir wollen keine Abhängigkeiten in die Microsoft CRT!) eingestellt ist und los gehts. Die libpng liefert eine VS2010-Solution mit, die ist aber doof konfigiert. Also die 7.1er wählen und upgraden. Release-Konfiguration wählen, das Verzeichnis der aktuellen zlib als zusaätzliches Includeverzeichnis angeben, Codegenerierung auf MT umstellen und in den Präprozessor-Direktiven des Compilers "ZLIB_WINAPI" hinzufügen, denn wir wollen die zlib später nicht als externe DLL sondern direkt in Cairo.

3. Pixman bauen. Hier kommt das erste Mal unser neu erworbenes Make aus dem MSYS-Package zum Einsatz. Zumindest wenn das Makefile.win32 schon perfekt wäre. Ein Änderung ist noch nötig, da wir die MS-CRT ja nicht als Abhängigkeit haben wollen: in Zeile 21 zu den CFLAGS ist wiederum der Schalter -MT einzufügen. Dann gehts auch los: start-msvc10.bat von MozillaBuild starten, in der erscheinenden bash zum pixman navigieren und "make -f Makefile.win32 CFG=release" führt zum Glück.

4. Cairo fit machen. In der bash zu Cairo/src navigieren und "make -f Makefile.win32 CFG=release" eingeben. Was nun kommt sind Fehlermeldungen. Tjo. Das Makefile für Windows ist ein nicht gepflegter ungetesteter Trümmerhaufen. Zunächst einmal fehlt die Datei cairo-features.h. Diese sollte in einem Make-Lauf erstellt werden. Die passende Regel wird aber offenbar nie angestoßen. Etwas Suche in den Sourcen offenbart wie sie aussehen sollte (am besten einfach kopieren und einfügen):

#ifndef CAIRO_FEATURES_H
#define CAIRO_FEATURES_H 1

#define CAIRO_HAS_WIN32_SURFACE 1
#define CAIRO_HAS_WIN32_FONT 1
#define CAIRO_HAS_PNG_FUNCTIONS 1
#define CAIRO_HAS_PS_SURFACE 1
#define CAIRO_HAS_PDF_SURFACE 1
#define CAIRO_HAS_SVG_SURFACE 1
#define CAIRO_HAS_IMAGE_SURFACE 1
#define CAIRO_HAS_RECORDING_SURFACE 1
#define CAIRO_HAS_USER_FONT 1
#define CAIRO_HAS_INTERPRETER 1

#endif

5. Reparatur und Anpassung der Makefiles. Src/Makefile.sources ist nicht nur für NMake zu kompliziert sondern auch für MSYS zu proprietär: Im Notepad öffnen und suchen und ersetzen nach if mit ifdef. build/Makefile.win32.common öffnen und in Zeile 20 die MS_MDFLAGS von -MD nach -MT umstellen (beim Debug analog auf -MTd aber ich erstelle hier nur das Release). Im folgenden sind zwischen Zeile 25 und 37 einige Pfade hart codiert. Diese sind an die tatsächlichen Gegebenheiten anzupassen. Insbesondere haben sämtliche Abhängigkeiten bei mir eine Versionsnummer im Pfadnamen. In Zeile 40 zu den DEFAULT_CFLAGS noch die Option -DZLIB_WINAPI anhängen, weil die zlib ja statisch in die DLL soll.

6. Patchen der Sourcen für den VC++-Compiler, da dieser keine Implementierung von lround in math.h kennt. In cairoint.h die Zeile 955 so erweitern, dass dort #if DISABLE_SOME_FLOATING_POINT || defined(_MSC_VER) steht. In cairo-misc.c in Zeile 486 dieselbe Erweiterung vornehmen.

make -f Makefile.win32 dynamic CFG=release

7. Et voila. Eine cairo.dll von knapp 1 MByte ohne extravangante Abhängigkeiten aber mit der Fähigkeit PNGs und PDFs zu erzeugen. Hoffentlich wird das mit der nächsten Version etwas einfacher.

IBM-Panorama

von Christoph

Hier mal ein Panorama der Deutschland-Zentrale von IBM in Ehningen bei Stuttgart. Ich war dort, um Experte für die Randtechnologie »xPages« zu werden. Naja, ist mehr oder weniger gelungen - ist eben ein weiteres trendiges Programmierparadigma für Desktop und Web gleichzeitig. Das Panorama besteht aus 12 Einzelbildern aufgeteilt in zwei Zeilen. Da ich kein Stativ dabei hatte, sind die Kontraste leider herkömmlich für Digitalfotographie, d.h. mit überstrahltem Himmel und zu dunklen Schatten. Freihand bekomme ich beislang nur Einzel-HDRs hin.

IBM Panorama

Musik, Musik

von Christoph

Als Liebhaber epischer und aufbauender Kinomusik hat man es nicht einfach. Wenn überhaupt waren die Produktionen namhafter zeitgenössischer Komponisten nur unter der Hand zu bekommen. Dank Verbreitung digitaler Shops zeichnet sich nun eine Verbesserung der Situation ab. Zeit genug, meine Favoriten kurz vorzustellen.

  1. Den Anfang macht Thomas Bergerson mit "Two Steps from Hell". Ich nenne ihn einfach mal den moderen Richard Wagner und staple damit noch viel zu tief. Das Album "Invincible" (8,99 Euro) ist das Best-Of der letzten vier Jahre. Und dieser Titel ist ausnahmsweise wirklich passend. Jeder Track ist absolut hörenswert, auf einen klaren Spitzenreiter kann ich mich nicht festlegen. 95% -> nah an perfekt.
  2. "Trailerhead" von "The Immediate" ist mit 12,99 etwas teurer und kann nicht ganz mit TSFH mithalten. Die Qualität ist zwar durchgängig sehr hoch aber auch im Stil etwas einheitlich. Mehr Wagnisse in der Instrumentalierung wären wünschenswert gewesen. Trotzdem aus meiner Sicht ein lohnenswertes Album. Gleich die ersten beiden Stücke sind Highlights. 88%.
  3. Als drittes und letztes empfehle ich "Epicon" (9,31 Euro) von "Globus". Dahinter verbirgt sich die orchestrale Livebesetzung von "The Immediate" (siehe oben). Die Experimente, die oben fehlten, werden hier gemacht. Fast alle Stücke sind mit guten Vocals neu interpretiert. Man findet also nichts gundlegend melodisch Neues, aber eben nette Variationen des bekannten Albums. Als Ohrwum entpuppte sich bei mir Track 6 (Europa). Den habe ich gestern bestimmt 10 mal gehört. 84%.

So, das war etwas kommerziell, musste aber sein, da ich diese Musik für wirklich empfehlenswert halte. Bleibt zu hoffen, dass mit "X-Ray Dog" die dritte große Komponistengarde auf die Idee mit den Best-Ofs im Download-Shop kommt. Leider waren Sie hier bislang extrem zurückhaltend, um nicht zu sagen ablehnend.

Kartierung der Woche: Abiturienten

von Christoph

Das Statistische Bundesamt hat mal wieder die Zahlen über Schulabgänger veröffentlicht. Die aktuellsten betreffen das Schuljahr 2007/2008. Das könnte natürlich auch neuer sein, aber die Mühlen der Bürokratie arbeiten langsam. LANGSAM.

Seis drum. In jenem Jahr haben fast 230.000 Schüler ihre Pflicht mit dem Abitur (allgemeine Hochschulreife) abgeschlossen. Wie das linke Cartogram (flächentreu) zeigt, die meisten davon in Nordrhein-Westfahlen. Berlin ist erwartungsgemäß aufgrund seiner hohen Bevölkerung auch ziemlich groß vertreten. Im Gegensatz zu den Statistiken über Erwachsene ist Brandenburg hier auch nicht völlig aufgesogen, sondern kann sich noch mit eigenen Abiturienten behaupten. Die Landflucht in die Hauptstadt setzt demnach offenbar erst ab einem bestimmten Alter ein.

Abiturienten Schuljahr 07/98

Das rechte Cartogram ist eine neue Form. Hier habe ich die Zahl der Abiturienten mit der Zahl der Einwohner normalisiert. Mit der Zahl aller Einwohner - nicht der der Schulabgänger. Ein Bundesland mit ausbleibendem Nachwuchs hat einfach Pech gehabt und wird entsprechend verzerrt. Hier fällt besonders auf, dass Mecklenburg-Vorpommern an Größe zulegt. Das bedeutet, dass MVP im Verhältnis zu seinen Einwohnern den größten Output an Abiturbesitzern vorzuweisen hat. Die Erklärung dieses Phänomens sei dem geneigten Leser überlassen. Mir fällt dazu spontan nichts Plausibles ein.

GeoStat 2010 Beta

von Christoph

Die Beta-Version von GeoStat 2010 zur Verkartung beliebiger Daten gibt es nun hier zum Download (Zip-Datei, 7.5 MByte). Beta-Version bedeutet, dass das Projekt nicht ganz fertig ist und möglicherweise noch Fehler enthalten kann. Es handelt sich dementsprechend um eine Vorschau, die für interessierte Nutzer veröffentlicht wird. Die erstellten Karten sind nicht zur Veröffentlichung freigegeben, ein entsprechender Hinweis wird in der Karte vermerkt. Die Installation des Programms ist nicht notwendig, es genügt alle Dateien des Archivs in ein Verzeichnis zu entpacken.

Die vorliegende Beta beherrscht den Import statistischer Basisdaten im

  • CSV-Format (Textdateien die manuell oder via Export von Excel, OpenOffice Calc, etc. erstellt werden können)
  • Geogen Familiennamendaten (benötigt die Geogen-CDR oder den Geogen-Download)
  • vorberechneten XML-Statistiken (bislang nicht dokumentiert, zur internen Verwendung des Programms)

Die Methode der CSV-Dateien ist sicherlich die einfachste. Erstellen Sie eine Datei namens Beispiel.txt. Hierin schreiben Sie zeilenweise Ihre Datensätze. Jede Zeile ein Datensatz. GeoStat 2010 benötigt zur Kartierung mindestens eine Postleitzahl und einen Ortsnamen. Die einzelnen Einträge müssen Sie durchgehend mit demselben Zeichen trennen. Empfohlen ist das Komma, das Semikolon, Tab oder Doppelpunkt. Wollen Sie beispielsweise Ihre Familie kartieren, schreiben Sie in jede Zeile ein Familienmitglied mit Adresse getrennt durch Komma.

Christoph Stöpel,14974,Ludwigsfelde
Christoph Stöpels Bruder,14974,Ludwigsfelde
Grakein Stöpel,14480,Potsdam

Innerhalb von GeoStat 2010 wählen Sie im Hauptmenü Datei den Punkt Daten importieren und hierin Von CSV/Text. Im erscheinenden Assistenten wählen Sie Ihre Beispieldatei aus. Das Programm versucht automatisch den Spaltentrenner zu erkennen. Sollte das Komma nicht identifiziert worden sein, können Sie dies manuell einstellen. Der nächste Schritt ist entscheidend für die Kartierung. Hier beschreiben Sie, in welcher Spalte GeoStat 2010 welche Daten findet. Im oberen Beispiel enthält Spalte 1 den Titel, Spalte 2 die Postleitzahl und Spalte 3 den Ortsnamen. Stellen Sie dies auch so ein, wie im Bilschirmfoto gezeigt.

GeoStat Importassistent

Anschließend startet die Berechnung der Statistik und die Kartierung. Dies kann je nach Leistung Ihres PCs einige Zeit in Anspruch nehmen. Erzeugt werden Karten, die die Statistiken zugeordnet zu Landkreisen, in Clustern oder anamorph verzerrt darstellen. Über die Toolbar oder das Hauptmenü können Sie zwischen den verschiedenen Ansichten wechseln. Über das Menü Datei/Speichern unter können Sie die aktuelle Karte in verschiedenen Formaten sichern.

Systemvoraussetzungen:

  • Betriebssystem MS Windows XP SP3, Vista, 7 oder neuer
  • Prozessor mit 2 GHz oder mehr
  • 512 MByte Arbeitsspeicher
  • 25 MByte freier Festplattenspeicher

Bekannte Probleme in dieser Beta-Version:

  • Die Zusammenlegung von Aachen Stadt und Land zu einem Landkreis ist noch nicht integriert. Die Landkreise werden gemäß Stand vom 31.12.2009 getrennt behandelt.
  • Das Speichern von Karten im HTML-Format berücksichtigt nicht die aktuelle Ansicht und exportiert immer die Cluster-Ansicht.
  • Die Karte der HTML-Ansicht ist etwas großformatig, so dass Nutzer innerhalb des Browserfenster häufig scrollen müssen.