Kindle Uploader

Der Kindle als eBook Reader macht vieles richtig. Nur beim Übertragen von eigenen Dokumenten wird es schwierig. Es gibt zwar die Möglichkeit Dokumente per Mail oder USB auf den Kindle zu bringen, allerdings wird das in manchen Fällen etwas umständlich.

Der Kindle Paperwhite im ausgeschalteten Zustand

Der Kindle Paperwhite im ausgeschalteten Zustand

So bietet Amazon eine Konvertierung von PDFs in ein auf dem Kindle lesbares Format an. Um das ganze zu vereinfachen, habe ich eine kleine Anwendung namens „Kindle Uploader“ geschrieben. Nach der Konfiguration kann man ganze Ordner oder auch einzelne Dateien an seinen Kindle senden. Mit Hilfe der Option „-convert“ ist es möglich die Konvertierung in das AZW Format (für bessere Lesbarkeit) anzustoßen:

kindleuploader.exe -convert test.pdf folder test.txt

Die Anwendung ist dabei freie Software unter der GPLv3 und kann auf GitHub „besichtigt“ werden. Alternativ kann das ganze als ausführbare Datei heruntergeladen werden.

MonoDevelop und die invalide Warnungsnummer

Manchmal ist Mono Develop etwas undurchsichtig. So bekam ich bei einem Projekt welches ich neu kompilieren wollte mehrmals die Fehlermeldung:

Error CS1904: `' is not a valid warning number (CS1904) (CSCL)

Der Compiler beschwert sich hierbei darüber, das eine spezifizierte Warnungsnummer nicht existiert. Allerdings ist es schwierig eine nicht vorhandene Nummer zu finden.

Die Compiler Optionen

Die Compiler Optionen

Die Lösung lag in den Compiler Optionen des Projektes. Hier befand sich unter „Warnungen ignorieren“ die Zeile:

0168 ; 0169; 0414; 0618; 0649

Das Problem an dieser Zeile waren die Leerzeichen, welche von MonoDevelop als zu ignorierende Warnungen interpretiert wurden. Und eine Warnung ohne Nummer kennt das System natürlich nicht. Nach dem Entfernen der Leerzeichen, kompilierte auch das Projekt wieder.

MIDI Bibliothek für .NET/Mono

Für ein kleines Experiment war ich auf der Suche nach einer .NET Bibliothek mit welcher sich MIDI Dateien schreiben lassen. Auf den ersten Blick findet man dabei nur Bibliotheken welche das MIDI Interface ansprechen, aber solche welche Midi Dateien schreiben können sind eher selten. Abhilfe schuf hier die Bibliothek NAudio, welche unter http://naudio.codeplex.com/ zu finden ist. Das Problem an der Bibliothek ist ihre schiere Größe und die fehlende Plattformunabhägigkeit, da für einige Stellen P-Invokes in native DLLs benötigt werden. Daneben bietet NAudio wesentlich mehr als nur MIDI-Support, so das die Bibliothek für meinen Zweck nicht zum tragen kam.

Dank der freien Lizenz (unter der Ms-Pl) stellte dies kein Problem da und so wurde libmidi.net aus der Taufe gehoben. Die Bibliothek bestand am Anfang aus dem Midi Teil von NAudio. Im Laufe der Entwicklung wurde alle Möglichkeiten für den Zugriff auf MIDI-Geräte entfernt. Die Bibliothek ist damit zu einer kleinen Bibliothek zum Lesen und Schreiben von MIDI-Dateien geworden. Dazu wurden auch einige Dinge wie die „MidiNote“-Enumeration hinzugefügt, anhand deren man die Noten als Noten anstatt als Nummern angeben kann. Im Gegensatz zum Original, welches hauptsächlich auf die Bearbeitung bereits existierender MIDIs abziehlt, soll die Bibliothek so gestaltet werden, das auch das Erzeugen neuer MIDIs leicht von der Hand geht. Zu finden ist das Projekt unter https://github.com/seeseekey/libmidi.net.

de4dot

Ein Programm welches in C# geschrieben wird, wird beim kompilieren in ein Intermediate-Assembly umgewandelt. Das bedeutet das der Code in einer Zwischensprache darauf wartet auf seinem Zielsystem in nativen Code umgewandelt zu werden. Der Vor- und auch Nachteil dieser Vorgehensweise ist, das sich der Quellcode sehr einfach aus dem IL-Code zurückwandeln lässt. Im Idealfall verliert man bloß einige Variablennamen.

Um das zu verhindern gibt es sogenannte Obfuscatoren, welche versuchen den entsprechenden Quelltext zu verschleiern, so das er nicht mehr einfach zurückgewandelt werden kann. Aber wie so oft im Leben gibt es auch hier einen Wettlauf mit der Zeit. So gibt es einige Tools welche den obfuskierten Quelltext wieder deobfuskieren. Eines dieser Projekte ist „de4dot“ welches unter https://bitbucket.org/0xd4d/de4dot/ zu finden ist. Das unter der GPL stehende Projekte, erkennt dabei den verwendeten Obfuscator und versucht seine Änderungen soweit wie möglich rückgängig zu machen. Dabei werden eine stattliche Anzahl von Obfuscatoren, wie der Dotfuscator, Goliath.NET und Skater.NET unterstützt.

Hash von einem beliebigen .NET Objekt erzeugen

Unter .NET gibt es an jedem Objekt die Methode „GetHashCode“ welche einen HashCode zurückliefert. Das Problem an dieser Methode ist jedoch das sie vom Objekt selbst implementiert werden muss. Möchte man nun eine Methode mit der man jedes Objekt generisch hashen kann, so ist diese Funktion hilfreich:

public string GetSHA1HashFromObject(object obj)
{
	SHA1CryptoServiceProvider sha1Provider=new SHA1CryptoServiceProvider();
	DataContractSerializer serializer=new DataContractSerializer(obj.GetType());

	using(MemoryStream memoryStream=new MemoryStream())
	{
		serializer.WriteObject(memoryStream, obj);
		sha1Provider.ComputeHash(memoryStream.ToArray());
		return Convert.ToBase64String(sha1Provider.Hash);
	}
}

Die Funktion serialisiert dabei das Objekt und hasht anschließend das serialisierte Objekt. Damit ist es egal, welches Objekt in die Funktion gegeben wird.