diff options
Expanded formatter embellishment templates
* XHTML elements "h2" and "h3" are replaced with "h3" and "h4" respectively
** modified all existing contents accordingly
** this was done to avoid the gap between the primary heading and subheadings in the markdown depiction of the contents
* fleshed out the InputXSLT project page with further information
Diffstat (limited to 'source')
18 files changed, 52 insertions, 33 deletions
diff --git a/source/00_content/articles/2010-02-06_debian_auf_dem_sheevaplug.md b/source/00_content/articles/2010-02-06_debian_auf_dem_sheevaplug.md index 23b0a17..c7bc555 100644 --- a/source/00_content/articles/2010-02-06_debian_auf_dem_sheevaplug.md +++ b/source/00_content/articles/2010-02-06_debian_auf_dem_sheevaplug.md @@ -60,6 +60,6 @@ Wenn Debian jetzt auf dem SheevaPlug läuft und man sich über SSH einloggen kon Über die Paketverwaltung kann man jetzt ganz einfach die benötigte Software installieren. Ich setzte auf meinem Plug z.B. lighttpd als Webserver mit PHP5 und MySQL für diese Website ein. Es empfielt sich /var und /tmp auszulagern um Löschzyklen zu sparen. Für /tmp eignet sich eine ramdisk. -### Erfahrungen +## Erfahrungen Ein Debian ist eine gute Alternative zu dem vorinstallierten Ubuntu 9.04. Denn dieses wirft Fehler bei booten aus und hat anfangs Konfigurationsprobleme. Auch braucht es im Vergleich zum Debian eine Ewigkeit zum booten. Das mag bei einem Server nicht wichtig sein, aber ich finde es dennoch schön schnell rebooten zu können. Das gute ist, dass man wenn man schon Erfahrung mit Ubuntu hat auch sehr gut mit Debian zurechtkommt. Aber Ubuntu Karmic lässt sich leider nicht mehr auf dem SheevaPlug installieren. Der SheevaPlug ist erstaunlich schnell. Er erstellt die Seiten etwa doppelt so schnell wie die Server des vorher von mir verwendeten Gratishoster “bplaced.net”. Auch hat er einen sehr geringen Stromverbrauch von nur 5 Watt. Und selbst wenn Webhostingangebote zumindest in der Internetanbindung schneller sein mögen, hat man mit einem SheevaPlug einen sehr günstigen Root-Server, auf dem man tun und lassen kann was man will. diff --git a/source/00_content/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md b/source/00_content/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md index 15f8fca..56d992f 100644 --- a/source/00_content/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md +++ b/source/00_content/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md @@ -7,6 +7,6 @@ Es läuft über längere Zeit zu meinem Erstaunen um einiges besser und stabiler Nett ist es auch, dass ich mich nicht an neue Konfigurationsdateien gewöhnen und Pacman als Paketverwaltung verwenden kann. Auch die Installation von Paketen aus dem AUR wird unterstützt. Das war bei mir allerdings bis jetzt noch nicht nötig, da alles was ich zur Zeit brauche (Lighttpd, MySQL, php, python etc.) schon vorkompiliert in den Paketquellen vorhanden ist. Die Pakete werden übrigens nicht crosskompiliert o.ä. sondern werden direkt auf einem SheevaPlug erstellt. -### Installation +## Installation Installieren kann man das rootfs Image mit dem [SheevaPlug Installer 1.0](http://plugcomputer.org/data/docs/sheevaplug-installer-v1.0.tar.gz) sowohl im NAND des Plugs als auch auf einer SD Karte. Bei der Installation auf einer SD Karte musste ich für einen fehlerfreien Bootvorgang die Uboot bootcmd um ein zweites “mmcinit;” erweitern – ohne diese Anpassung blieb der Bootloader bei einem Kaltstart hängen. diff --git a/source/00_content/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md b/source/00_content/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md index 83202a3..809df85 100644 --- a/source/00_content/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md +++ b/source/00_content/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md @@ -69,7 +69,7 @@ def printCsv(gpxPositions): ~~~ {: .language-python} -### Plotten mit gnuplot +## Plotten mit gnuplot <a href="http://imgur.com/RHlNp"><img src="http://i.imgur.com/RHlNpl.jpg" alt="Gnuplot output" class="clear full"/></a> diff --git a/source/00_content/articles/2011-11-08_informationen_umformen_mit_xsl.md b/source/00_content/articles/2011-11-08_informationen_umformen_mit_xsl.md index 47f9973..7785b83 100644 --- a/source/00_content/articles/2011-11-08_informationen_umformen_mit_xsl.md +++ b/source/00_content/articles/2011-11-08_informationen_umformen_mit_xsl.md @@ -68,7 +68,7 @@ Das leere Template `xsl:template match="text()"` sorgt dafür, dass alle XML-Zwe Zum Anpassen des Datums verwende ich - wie auch in diesem Blog - die [date-time.xsl](http://symphony-cms.com/download/xslt-utilities/view/20506/) Transformation. -### Generieren des RSS Feed +## Generieren des RSS Feed Mit der eben beschriebenen XSLT lässt sich jetzt in drei Schritten das fertige RSS generieren: diff --git a/source/00_content/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md b/source/00_content/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md index 5f48ee8..6391f4f 100644 --- a/source/00_content/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md +++ b/source/00_content/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md @@ -13,14 +13,14 @@ Auswirkungen dieser Möglichkeiten schlagen sich beispielsweise regelmäßig in Auch aus Sicht des Datenschutzes und beim Blick auf die AGBs diverser Plattformen sollte einem die Gefahr, die übermäßiges Verlagern von Daten in fremde Hände birgt, bewusst werden. -### Alternativen +## Alternativen Es gibt Möglichkeiten das Unterdrücken und Kontrollieren von Kommunikation zumindest so lange das Netz selbst noch verfügbar ist zu erschweren. Ein erster Schritt kann das Ersetzen von Plattformen wie Facebook oder Twitter mit Software wie z.B. [Diaspora](https://joindiaspora.com/) oder [StatusNet](http://status.net/) sein. Daten speichern und Tauschen lässt sich - auch auf Hardware die unter eigener Kontrolle steht - realisieren dank Projekten wie [OwnCloud](http://owncloud.org/). Zum Tauschen von Daten gibt es heute schon weit verbreitete dezentrale Protokolle wie BitTorrent. InstantMessaging ist bequem über [Jabber](http://einfachjabber.de/) möglich. Auch anonymes Nutzen des Internet und anonymes Bereitstellen von Anwendungen im Internet ist mit [Tor](https://www.torproject.org/) machbar. Diese Dienste lassen sich alle über eigene Server verwenden - wer wie ich einen Schritt weiter gehen möchte kann es auch mit einem Rechner bei sich zu Hause, über die eigene Internetanbindung machen. Hier gibt es dank der zunehmenden Beliebtheit von [ARM-Prozessoren](http://de.wikipedia.org/wiki/ARM-Architektur) einen stetigen Nachschub an Hardware. Beispiele hierfür sind die [CuBox](http://www.solid-run.com/) und die Steckdosenrechner von [Marvell](http://www.marvell.com/solutions/plug-computers/) wie der [SheevaPlug](http://de.wikipedia.org/wiki/SheevaPlug) mit dem ich persönlich über die letzten zwei Jahre sehr gute Erfahrungen gemacht habe. Diese Computer vereinen für die üblichen Fälle gut ausreichende Rechenleistung mit einem sehr geringen Stromverbrauch (aktuell etwa 5 Watt) was auch bei ganzjährlichem Betrieb kaum Kosten entstehen lässt. -### Ausblick +## Ausblick Man stelle sich vor jeder hätte einen solchen Server bei sich am Laufen. Dieser Server könnte über eine Diaspora Instanz ein Teil eines globalen, dezentralen, sozialen Netzwerks sein, über einen Jabber-Server Echtzeitkommunikation ermöglichen und über OwnCloud Daten freigeben. Jeder könnte jeden Service anbieten und wenn eine Instanz ausfällt betrifft es nur einen: den Ausgefallenen. Ein Projekt das versucht diese Idee zu verwirklichen ist die [Freedom](http://wiki.debian.org/FreedomBox)[Box](http://freedomboxfndn.mirocommunity.org/video/9/elevate-2011). diff --git a/source/00_content/articles/2012-04-07_mobile_endgeraete_und_freie_software.md b/source/00_content/articles/2012-04-07_mobile_endgeraete_und_freie_software.md index 178d31c..6eacd67 100644 --- a/source/00_content/articles/2012-04-07_mobile_endgeraete_und_freie_software.md +++ b/source/00_content/articles/2012-04-07_mobile_endgeraete_und_freie_software.md @@ -49,7 +49,7 @@ Weiterhin gibt es das u.a. in [NEMO](http://wiki.merproject.org/wiki/Nemo) verwe [Gnome 3](http://www.gnome.org/gnome-3/) sieht nach einer für Tablets gut geeigneten Oberfläche aus und fühlt sich nach meinen Tests auch sehr danach an. Für Smartphones ist die aktuelle Gnome Iteration jedoch aus meiner Sicht momentan nicht geeignet da dort schlichtweg zu wenig Bildschirmfläche vorhanden ist. -### Ausblick +## Ausblick Zusammenfassend lässt sich sagen, dass das Hauptproblem momentan nicht fehlende Software sondern fehlende Hardware-Plattformen sind. Es gibt keinen Hersteller der sich zumindest mit einer kleinen Produktreihe voll zu Open Source und Linux bekennt. Die zwei empfehlenswertesten Optionen sind aus meiner Sicht entweder das N900 oder dessen Nachfolger N9 - der Rest des Marktes hat sich weitgehend auf iOS und Android Geräte beschränkt, es fehlt an wirklichen Alternativen zu diesen beiden. Das ein Markt für eine solche Alternative vorhanden ist lässt sich allein schon daran erkennen wie gefragt das Nokia N9 in Ländern ist für die Nokia es garnicht anbieten will - vermutlich um Windows Phone nicht zu gefährden. Es gibt dann schon eine gewisse Genugtung wenn gerüchteweise mehr N9 Exemplare als Lumina's (gleiches Gehäuse, Windows Phone) verkauft werden ;) diff --git a/source/00_content/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md b/source/00_content/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md index ebe48e5..7be6d2a 100644 --- a/source/00_content/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md +++ b/source/00_content/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md @@ -33,7 +33,7 @@ tmpfs /tmp tmpfs nodev,nosuid 0 0 ~~~ {: .language-sh} -### Verschlüsselung? +## Verschlüsselung? Eigentlich bin ich was Daten angeht sehr paranoid - meine relevanten Speichermedien sind alle vollverschlüsselt, dass gilt auch für die Betriebsystem-Partitionen. Ich achte sehr darauf, dass keinerlei eigentlich verschlüsselte Daten in unverschlüsselte Gefilde "ausbrechen"... für die SSD muss ich vorerst auf einen Teil davon verzichten. @@ -43,6 +43,6 @@ Dank hdparm kann diese ja in einen Ruhemodus versetzt werden und muss so nicht d Die komplette Verschlüsselung der SSD wird jedoch erst nach einem deutlich größeren Hardwareupgrade wieder Sinn machen. So schaffen aktuelle Prozessoren dank des [AES-NI](http://en.wikipedia.org/wiki/AES_instruction_set) Befehlssatzes hunderte MB pro Sekunde Durchsatz, dieser ist dann auch für eine SSD wieder groß genug. -### Fazit +## Fazit Alles in allem bin ich mit meinem Umstieg trotz der nötigen Abstriche sehr zurieden und möchte nicht mehr auf ein System ohne SSD zurück. Denen, die sich näher mit dem Thema auseinandersetzen wollen, empfehle ich die entsprechende Seite im englischen Arch-Wiki: [SSD](https://wiki.archlinux.org/index.php/SSD) und zur Kaufberatung die Tests auf [StorageReview.com](http://www.storagereview.com/). diff --git a/source/00_content/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md b/source/00_content/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md index ae7c783..00ef8b4 100644 --- a/source/00_content/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md +++ b/source/00_content/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md @@ -8,7 +8,7 @@ rumfliegen haben. Was ich will, ist also eine "richtige" Netzwerk-Konfiguration Als Virtualisierungs-System setze ich auf KVM, die Distribution der Wahl ist weiterhin ArchLinux. -### Kernel Based Virtual Machine +## Kernel Based Virtual Machine [KVM](http://www.linux-kvm.org/page/Main_Page) ist das direkt im Linux-Kernel integrierte Virtualisierung-System. Einzige Voraussetzung dafür ist ein Prozessor mit Virtualisierungs-Funktionen, diese sollten die meisten der in den letzten Jahren auf den Markt gekommenen Prozessoren besitzen - selbst mein Core Duo aus 2007 führt KVM einwandfrei aus. Ansonsten verhält sich KVM identisch zu [QEMU](http://wiki.qemu.org/Main_Page), der einzige Unterschied ist, @@ -35,7 +35,7 @@ Dieser verwendet das als erster Parameter übergebene Gerät als Festplatte und als Wert des Parameters `-vnc` auch eine von einem Doppelpunkt angeführte Zahl übergeben werden um die Grafik-Ausgabe der VM an einen VNC-Server anzubinden (z.B. `-vnc :1` für `127.0.0.1:1`). Diese Funktion verwende ich nicht, da ich ausschließlich über das interne Netzwerk die im Gast installierten Dienste nutze und administrative Tätigkeiten immer über SSH durchführe. -### Netzwerken mit VDE +## Netzwerken mit VDE [VDE](http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking) steht für Virtual Distributed Ethernet und ermöglicht genau das was der Name erahnen lässt: Virtuelle Switches die beispielsweise VMs in einem Host internen LAN verbinden können. @@ -88,7 +88,7 @@ esac Anpassbar ist hierbei das Interface, um z.B. daheim `eth0` und unterwegs wahlweise `wlan0` oder `usb0` verwenden zu können. -### KVM Hardware Error +## KVM Hardware Error Nach einer Kernel Aktualisierung im ArchLinux Gast-System, kam es beim Neustart plötzlich zu dieser etwas erschreckenden Meldung: @@ -127,7 +127,7 @@ modprobe kvm_intel emulate_invalid_guest_state=0 Um den `emulate_invalid_guest_state` Parameter dauerhaft zu setzen reicht ein Eintrag in `/etc/modprobe.d`. -### Fazit +## Fazit Mithilfe der beschriebenen Konfiguration und den Scripts lassen sich KVM VMs unsichtbar im Hintergrund starten und in einem Host-internen virtuellen LAN ansteuern. Bei Bedarf kann dieses virtuelle Netz mithilfe von Routen erweitert werden. Für den Netzzugriff in den Gast-Systemen reicht eine einfache statische Konfiguration. Ich werde das Ganze in nächster Zeit vermutlich noch etwas erweitern und verbessern, aber diese Grundlage ist auf jeden Fall besser als die von mir am Anfang genutzten SSH-Tunnel zwischen Gast und Host. diff --git a/source/00_content/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md b/source/00_content/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md index 1756d63..9dd65f9 100644 --- a/source/00_content/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md +++ b/source/00_content/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md @@ -34,7 +34,7 @@ We could write appropriate classes to wrap our object instance pointers by ourse shiny new _smart pointer_ templates that give us flexible and standardised templates that do just that: wrap our pointers and limit their lifetime to a scope. -### std::unique_ptr +## std::unique_ptr > A unique pointer is an object that owns another object and manages that other object through a pointer. > More precisely, a unique pointer is an object u that stores a pointer to a second object p and will dispose of @@ -48,7 +48,7 @@ contained pointer - because of that the `std::unique_ptr` only implies that it i This possibility to retrieve the raw pointer is not a weakness because it enables us to use normal raw pointers as a way to imply: you are allowed to use this object instance in any way you like, but you are not required to think about its destruction. -### std::shared_ptr +## std::shared_ptr > The shared\_ptr class template stores a pointer, usually obtained via new. shared\_ptr implements semantics > of shared ownership; the last remaining owner of the pointer is responsible for destroying the object, or @@ -66,7 +66,7 @@ the subscriber list. If we use a `std::shared_ptr` for this example we can regul it from our subscriber list. As long as we have one or more owners outside the factory that are using the object to retrieve events we know that it is still required to be supplied, if that is no longer the case we can safely remove it from the subscriber list. -### std::weak_ptr +## std::weak_ptr > The weak\_ptr class template stores a weak reference to an object that is already managed by a shared\_ptr. > To access the object, a weak\_ptr can be converted to a shared_ptr using the member function lock. @@ -78,7 +78,7 @@ that a function returning such a smart pointer is implying that we grant the cal the contained object instance does not exist anymore. We can not assume that we have a usable instance and will have to check before converting the `std::weak_ptr` to a `std::shared_ptr`. -### What I prefer to use +## What I prefer to use As I already hinted earlier I am only seldomly using a `std::shared_ptr` and the accompanying `std::weak_ptr` and am mostly relying on the combination of a single, distinct object owning `std::unique_ptr` that passes around "use only" raw pointers to other objects that are guaranteed to not exceed the lifetime of the owner diff --git a/source/00_content/articles/2013-10-06_notizen_zu_cpp_und_unicode.md b/source/00_content/articles/2013-10-06_notizen_zu_cpp_und_unicode.md index fbc6d63..e900a66 100644 --- a/source/00_content/articles/2013-10-06_notizen_zu_cpp_und_unicode.md +++ b/source/00_content/articles/2013-10-06_notizen_zu_cpp_und_unicode.md @@ -19,7 +19,7 @@ std::string test(u8"Hellø Uni¢ød€!"); Der C++ Standard garantiert uns, dass ein solcher String in UTF-8 enkodiert wird. Auch die Ausgabe von in dieser Form enkodierten Strings funktioniert nach meiner Erfahrung - z.T. erst nach setzen der Lokale mittels _std::setlocale_ - einwandfrei. Probleme gibt es dann, wenn wir den Text als solchen näher untersuchen oder sogar verändern wollen bzw. die Ein- und Ausgabe des Textes in anderen Formaten erfolgen soll. Für letzteres gibt es eigentlich die _std::codecvt_ Facetten, welche aber in der aktuellen Version der GNU libstdc++ noch [nicht implementiert](http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011) sind. Wir müssen in diesem Fall also auf externe Bibliotheken wie beispielweise [iconv](https://www.gnu.org/software/libiconv/) oder [ICU](http://site.icu-project.org/) zurückgreifen. Auch die in der C++ Standard Library enthaltenen Templates zur String-Verarbeitung helfen uns bei Multibyte-Enkodierungen, zu denen auch UTF-8 zählt, nicht viel, da diese mit dem _char_ Datentyp und nicht mit Code-Points arbeiten. So liefert _std::string_ beispielsweise für einen UTF-8 enkodierten String, welcher nicht nur von dem in einer Code-Unit abbildbaren ASCII-Subset Gebrauch macht, nicht die korrekte Zeichenanzahl. Auch eine String-Iteration ist mit den Standard-Klassen nur Byte- und nicht Code-Point-Weise umsetzbar. Wir stehen also vor der Entscheidung eine weitere externe Bibliothek zu verwenden oder Programm-Intern vollständig auf UTF-32 zu setzen. -### Ein UTF-8 Codepoint-Iterator in C++ +## Ein UTF-8 Codepoint-Iterator in C++ Um zumindest für rein lesende Zugriffe auf UTF-8 Strings nicht gleich eine Bibliothek wie Boost oder [easl](http://code.google.com/p/easl/) verwenden zu müssen habe ich einen einfachen UTF-8 Codepoint-Iterator anhand der Spezifikation in [RFC3629](http://tools.ietf.org/html/rfc3629) implementiert. Den Quellcode dieser Klasse stelle ich auf [Github](https://github.com/KnairdA/CodepointIterator) oder in [cgit](http://code.kummerlaender.eu/CodepointIterator/tree/) als Open Source unter der MIT-Lizenz zur freien Verfügung. @@ -71,7 +71,7 @@ for ( UTF8::CodepointIterator iter(test.cbegin()); Die Dereferenzierung einer Instanz des Iterators produziert den aktuellen Code-Point als _char32\_t_, da dieser Datentyp garantiert vier Byte lang ist. Die Ausgabe eines solchen UTF-32 enkodierten Code-Points ist mir allerdings leider nur nach dem Cast in _wchar\_t_ gelungen. Dieser wird trotzdem nicht als Dereferenzierungs-Typ verwendet, da die Länge nicht fest definiert ist, sondern abhängig von der jeweiligen C++ Implementierung unterschiedlich sein kann. Dies stellt jedoch kein größeres Problem dar, da der Iterator für die interne Betrachtung von Strings und nicht zur Konvertierung für die Ausgabe gedacht ist. -### Fazit +## Fazit * UTF-8 ist die Kodierung der Wahl, da Übermenge von ASCII und kompakt für englische Texte * Nicht alle Möglichkeiten die im Standard definiert sind, sind auch implementiert diff --git a/source/00_content/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md b/source/00_content/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md index a3af421..4d1aaa2 100644 --- a/source/00_content/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md +++ b/source/00_content/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md @@ -12,7 +12,7 @@ For the purpose of this article I am going to limit myself to flat structures wi write mappings like [EdgeId](https://github.com/KnairdA/GraphStorage/blob/master/src/storage/id/edge_id.cc) in a more compact and efficient way. This also includes support for handling differences in endianness and In-place modification of the structure fields. -### Mapping buffers as tuples +## Mapping buffers as tuples To be able to easily work with structure definitions using template metaprogramming I am relying on the standard libraries [_std::tuple_](http://en.cppreference.com/w/cpp/utility/tuple) template. @@ -123,7 +123,7 @@ std::cout << mapping.get<1>() << std::endl; ~~~ {: .language-cpp} -### Endianness +## Endianness As you may remember this does not take endianness into account as I defined as a requirement in the beginning. I first thought about including support for different endianness types into the _BinaryMapping_ template class which worked, but led to problems as soon as I mixed calls to _get_ and _set_. The resulting problems could of course have been fixed but this would probably @@ -212,7 +212,7 @@ It should be evident that the way both the _serialize_ and _deserialize_ templat is that no actual _std::tuple_ instantiation instance is touched and instead of setting pointers to the buffer we are only reordering the bytes of each section of the buffer corresponding to a tuple element. This results in a complete In-place conversion between different byte orderings using the methods provided by a _ByteSorter_ template such as _BigEndianSorter_. -### Conclusion +## Conclusion At last I am now able to do everything I planned in the beginning in a very compact way using the _Serializer_, _TupleReader_ and _BinaryMapping_ templates. In practice this now looks like this: diff --git a/source/00_content/pages/contact.md b/source/00_content/pages/contact.md index a499822..15a34df 100644 --- a/source/00_content/pages/contact.md +++ b/source/00_content/pages/contact.md @@ -9,7 +9,7 @@ Further information about myself may be found on the [about page](/page/about). -### Legal +## Legal Responsible for all contents: Adrian Kummerländer diff --git a/source/00_content/pages/projects/binary_mapping.md b/source/00_content/pages/projects/binary_mapping.md index 1b32266..c178236 100644 --- a/source/00_content/pages/projects/binary_mapping.md +++ b/source/00_content/pages/projects/binary_mapping.md @@ -6,7 +6,7 @@ These structures can then be traversed using integrated containers and iterators A explanation of an earlier version of this template library can be found on this [blog]. The source code is available via both [Github] and [cgit]. -### Current features +## Current features * Support for any kind of flat structure that can be expressed using integral types and arbitrarily sized byte-arrays * Support for serialization in either big or little endianess diff --git a/source/00_content/pages/projects/codepoint_iterator.md b/source/00_content/pages/projects/codepoint_iterator.md index f5b08ca..e202571 100644 --- a/source/00_content/pages/projects/codepoint_iterator.md +++ b/source/00_content/pages/projects/codepoint_iterator.md @@ -4,7 +4,7 @@ The source code is available on both my [Github] profile and [cgit]. -### Current features +## Current features * Bidirectional iteration through unicode codepoints * The class itself does not rely on any external libraries diff --git a/source/00_content/pages/projects/input_xslt.md b/source/00_content/pages/projects/input_xslt.md index 802ceac..70d733e 100644 --- a/source/00_content/pages/projects/input_xslt.md +++ b/source/00_content/pages/projects/input_xslt.md @@ -1,12 +1,30 @@ # InputXSLT -…is a proof-of-concept implementation of external file access functions for XSLT based on Apache xalan and xerces. +…is a Apache Xalan based XSLT extension enabling access to external commands, the filesystem and calling further transformations from inside a transformation. -It is used to generate the whole website you are currently viewing and is available via [Github] or [cgit]. +It is used as the base for the static site generation system used to generate the whole website you are currently viewing and is available via [Github] or [cgit]. -### Why? +## Why? -Contrary to popular opinion I actually like XSLT as a content transformation language and have built - amongst other things - my personal website on top of it. While I used the XSLT based Symphony CMS for that particular endeavour, the intention behind the experiment is to develop XSLT extensions enabling the development of static site generators using XSLT as both a template and application language. The fact that you are currently reading this page proves that this is indeed possible. +Contrary to popular opinion I actually like XSLT as a content transformation language and have built - amongst other things - most of my website projects on top of it. While I used the XSLT based [Symphony CMS] for most of these endeavours, the intention behind InputXSLT was to develop XSLT extensions enabling the development of static site generators using XSLT as both a template and application language. The fact that you are currently reading this page proves that this is indeed possible. + +## Overview + +The following table summarizes all the external functions provided by InputXSLT. They are available under the `InputXSLT` namespace after including `function.inputxslt.application` into the stylesheet element. + +|Function |Description | +|`read-file` |Reading plain text files as text and XML files as node trees | +|`read-directory` |Traversing filesystem directories | +|`external-command` |Executing external commands including support for providing the input stream and capturing the output stream | +|`write-file` |Committing plain text or node trees to the filesystem | +|`generate` |Calling transformations including support for capturing the result or committing it directly to the filesystem| + +The `ixslt` XSLT frontent provided by InputXSLT also implements a custom include entity resolver alongside to an easy to use interface for implementing further custom extension functions. + +## Tradeoffs and compromises + +All external functions offered by InputXSLT can be accessed using the XPath expression evaluation subsystems of the XSLT language. While in some cases XSL extension elements would have been the primary choice limitations in the C++ implementation of the Apache Xalan XSLT library made the usage of external functions the path of least resistance. In practice external functions like the one used to call other transformations are wrapped inside utility templates and as such may be used as if they where implemented as extension elements. All other functions like the ones used to access the filesystem fit better within a XPath-expression context and are as such implemented in the most fitting way. [Github]: https://github.com/KnairdA/InputXSLT [cgit]: http://code.kummerlaender.eu/InputXSLT +[Symphony CMS]: http://getsymphony.com diff --git a/source/00_content/pages/projects/simple_parser.md b/source/00_content/pages/projects/simple_parser.md index 4ceb226..ea4df53 100644 --- a/source/00_content/pages/projects/simple_parser.md +++ b/source/00_content/pages/projects/simple_parser.md @@ -6,7 +6,7 @@ The term is parsed by generating a binary expression tree using the Shunting-Yar This application marks the first steps in C++ I took a couple of years back and is available on [Github] or [cgit]. -### Current features +## Current features * Calculating terms with basic operators while respecting the priority of each operator * Support for parentheses diff --git a/source/00_content/pages/projects/trie.md b/source/00_content/pages/projects/trie.md index 8675203..7b30a3a 100644 --- a/source/00_content/pages/projects/trie.md +++ b/source/00_content/pages/projects/trie.md @@ -4,7 +4,7 @@ The implementation may be found on [Github] or [cgit]. -### Current features +## Current features * Specializable tree element type * Adding, removing and resolving paths in the prefix tree diff --git a/source/99_result/main.css b/source/99_result/main.css index 6f68e61..4a4aab0 100644 --- a/source/99_result/main.css +++ b/source/99_result/main.css @@ -20,7 +20,7 @@ pre{padding:1em;border-radius:.75em;color:#f8f8f2;background:#272822;white-space #main h2 a{font-size:.8em;text-decoration:none !important;color:#272828;font-weight:normal;display:inline-block;vertical-align:middle;max-width:95%} #main h2 a:hover{text-decoration:underline !important} #main h3{font-size:1.05em;font-weight:normal;margin-bottom:.5em;border-bottom:.1em solid #e3e8e8} -#main h4{font-weight:normal;font-size:1.25em;margin:0} +#main h4{font-size:1.05em;font-weight:normal;margin-bottom:.5em;border-bottom:.1em solid #e3e8e8} #main .article a{text-decoration:underline;color:#272828} #main .article a:hover{color:black} #main .article ul{float:none;margin-left:2em;text-align:left} @@ -51,6 +51,7 @@ pre{padding:1em;border-radius:.75em;color:#f8f8f2;background:#272822;white-space #last_line a:hover{text-decoration:underline} #last_line ul{margin-top:-0.2em;float:right;padding:.4em 0} #isso-thread{margin-top:1em;font-size:.95em} +#isso-thread h4{font-weight:normal;font-size:1.25em;margin:0} #isso-thread .form-wrapper{padding:1em;overflow:hidden} #isso-thread .form-wrapper input{border:.3em solid #e3e8e8;margin:.3em 0 .3em 0} #isso-thread .form-wrapper .textarea{border:.3em solid #e3e8e8;width:100%;height:8em;color:#272828} @@ -71,7 +72,7 @@ pre{padding:1em;border-radius:.75em;color:#f8f8f2;background:#272822;white-space .columns{column-count:2;-moz-column-count:2;-webkit-column-count:2;column-gap:0;-moz-column-gap:0;-webkit-column-gap:0} .columns a{color:#272828;text-decoration:none} .columns a:hover{text-decoration:underline} -.column {-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;column-break-inside:avoid} +.column{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;column-break-inside:avoid} .taglist ul{padding:.2em;float:none;overflow:hidden} .taglist ul li{margin:.2em 0 .2em 0;padding:.2em} .articlelist ol{margin:0;padding:.3em;list-style:none} |