From 63d9db8438ed6b32c4a85d487c07ea31bda666e4 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Thu, 11 Sep 2014 00:47:56 +0200 Subject: 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 --- articles/2010-02-06_debian_auf_dem_sheevaplug.md | 2 +- ...-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md | 2 +- articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md | 2 +- articles/2011-11-08_informationen_umformen_mit_xsl.md | 2 +- articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md | 4 ++-- articles/2012-04-07_mobile_endgeraete_und_freie_software.md | 2 +- articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md | 4 ++-- ...-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md | 8 ++++---- ...ion_to_expressing_and_controlling_object_ownership_in_cpp11.md | 8 ++++---- articles/2013-10-06_notizen_zu_cpp_und_unicode.md | 4 ++-- ..._binary_structures_as_tuples_using_template_metaprogramming.md | 6 +++--- 11 files changed, 22 insertions(+), 22 deletions(-) (limited to 'articles') diff --git a/articles/2010-02-06_debian_auf_dem_sheevaplug.md b/articles/2010-02-06_debian_auf_dem_sheevaplug.md index 23b0a17..c7bc555 100644 --- a/articles/2010-02-06_debian_auf_dem_sheevaplug.md +++ b/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/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md b/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md index 15f8fca..56d992f 100644 --- a/articles/2010-12-09_plugbox_linux_ein_archlinux_port_fuer_den_sheevaplug.md +++ b/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/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md b/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md index 83202a3..809df85 100644 --- a/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md +++ b/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 Gnuplot output diff --git a/articles/2011-11-08_informationen_umformen_mit_xsl.md b/articles/2011-11-08_informationen_umformen_mit_xsl.md index 47f9973..7785b83 100644 --- a/articles/2011-11-08_informationen_umformen_mit_xsl.md +++ b/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/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md b/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md index 5f48ee8..6391f4f 100644 --- a/articles/2011-12-28_gedanken_zu_de_zentralen_netzen.md +++ b/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/articles/2012-04-07_mobile_endgeraete_und_freie_software.md b/articles/2012-04-07_mobile_endgeraete_und_freie_software.md index 178d31c..6eacd67 100644 --- a/articles/2012-04-07_mobile_endgeraete_und_freie_software.md +++ b/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/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md b/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md index ebe48e5..7be6d2a 100644 --- a/articles/2012-08-29_erfahrungen_mit_einer_ssd_unter_linux.md +++ b/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/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md b/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md index ae7c783..00ef8b4 100644 --- a/articles/2012-11-20_virtualisierung_mit_kvm_und_virtuelle_netzwerke_mit_vde.md +++ b/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/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md b/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md index 1756d63..9dd65f9 100644 --- a/articles/2013-03-01_introduction_to_expressing_and_controlling_object_ownership_in_cpp11.md +++ b/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/articles/2013-10-06_notizen_zu_cpp_und_unicode.md b/articles/2013-10-06_notizen_zu_cpp_und_unicode.md index fbc6d63..e900a66 100644 --- a/articles/2013-10-06_notizen_zu_cpp_und_unicode.md +++ b/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/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md b/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md index a3af421..4d1aaa2 100644 --- a/articles/2013-11-03_mapping_binary_structures_as_tuples_using_template_metaprogramming.md +++ b/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: -- cgit v1.2.3