seeseekey.net - Invictus Deus Ex Machina

Wenn man mittels Mono eine Anwendung entwickeln möchte, so wird man dafür in den meisten Fällen MonoDevelop oder Xamarin Studio nutzen. Xamarin ist die Firma welche Mono entwickelte (über Ximian und später Novel). Allerdings ist nicht wirklich klar wo sich die beiden IDE’s voneinander unterscheiden, den bei beiden scheint es sich im Kern um MonoDevelop zu handeln.

Xamarin Studio mit geöffnetem Projekt

Wie auf der Mailingliste klargestellt wurde handelt es sich bei Xamarin Studio um eine MonoDevelop-Version welche um einige Add-Ins für iOS und Android sowie andere Funktionen erweitert wurde. Der Quelltext von MonoDevelop ist wie gehabt auf GitHub zu finden.

Möchte man eine Wave-Datei unter .NET oder Mono öffnen, so wird man feststellen das es hierfür wenige sinnvolle Möglichkeiten gibt. Viele der vorgeschlagenen Lösungen nutzen spezielle APIs, welche die Platzformunabhängigkeit zerstören. Aus diesem Grund habe ich mir wieder mal NAudio vorgenommen und aus dieser Bibliothek eine Bibliothek namens libwave.net abgeleitet.

Eine geöffnete Wave-Datei

Dank der freien Lizenz (NAudio ist unter der Ms-Pl lizenziert) stellte dies kein Problem dar. Mit der Bibliothek ist es möglich Wave-Dateien zu schreiben und zu lesen. Das Interface wurde dabei auf das notwendigste reduziert. Die Möglichkeiten werden dabei in den beiliegenden Beispielen aufgezeigt. Lauffähig ist die Bibliothek unter .NET und Mono. Zu finden ist das Projekt unter github.com/seeseekey/libwave.net.

Möchte man in einer .NET respektive Monosprache einen Anwendung schreiben welche mit der Twitter API interagiert, so sollte man hierfür eine Bibliothek nutzen um den Aufwand in Grenzen zu halten.

tweetinvi.codeplex.com

Eine empfehlenswerte Biblitothek in diesem Bereich ist dabei Tweetinvi welche auf CodePlex zu finden ist. Tweetinvi ist dabei unter der Microsoft Public License lizensiert und somit freie Software. Die Bibliothek ist dabei problemlos in der Lage mehrere Millionen Tweets zu verarbeiten und befindet sich in aktiver Entwicklung. Ein einfaches Beispiel um einen Tweet abzusetzen könnte dabei so aussehen:

IToken token=new Token(twitterAccessToken, twitterAccessTokenSecret, twitterConsumerKey, twitterConsumerSecret);
ITweet tweet=new Tweet(tweetText, token);
bool success=tweet.Publish();

Damit hätte man den ersten Tweet mit dieser Bibliothek abgesendet.

Wenn man beim Ausführen einer Mono-Applikation auf einem Ubuntu-Server Fehlermeldungen wie diese:

Unhandled Exception: System.TypeLoadException: A type load exception has occurred.
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: A type load exception has occurred.

zu sehen bekommt, so lässt sich dieses Problem meist leicht lösen, indem man die passenden Mono-Bibliotheken durch Installation des Paketes „mono-complete“ hinzufügt:

apt-get install mono-complete

Danach sollte die entsprechende Anwendung ohne Probleme starten.

Manchmal möchte man eine Zeichenkette im Arbeitsspeicher nicht länger als nötig im Klartext vorhalten. Hierfür gibt es unter .NET/Mono die Klasse „SecureString“. Diese verschlüsselt den Klartext, so das dieser nicht ohne weiteres im Speicher zu finden ist. Leider ist die Nutzung der „SecureString“ etwas komplizierter:

SecureString secureString=new SecureString();
secureString.AppendChar('g');
secureString.AppendChar('e');
secureString.AppendChar('h');
secureString.AppendChar('e');
secureString.AppendChar('i');
secureString.AppendChar('m');

// in Klartext umwandeln
IntPtr secureStringPointer=Marshal.SecureStringToBSTR(secureString);
string klartext=Marshal.PtrToStringAuto(secureStringPointer);

Hier muss man abwägen, ob sich die Nutzung eines solches Konstruktes lohnt, oder man weiterhin normale Strings für sensible Daten nutzt.

Im Web kennt man solche Boxen zu genüge. Ein Suchfeld in welchem in ausgegrauter Schrift „Suchen“ oder ähnliches steht. Unter .NET ist das ganze leider nicht als vorgefertigtes Control vorhanden, so das man hier selbst Hand anlegen muss. Für ein solches Control nimmt man eine TextBox und setzt die Events „Enter“ und „Leave“ und befüllt sie wie folgt:

string grayedText="Search...";

private void tbSearch_Enter(object sender, System.EventArgs e)
{
	if(tbSearch.Text==""||tbSearch.Text==grayedText)
	{
		grayedText=tbSearch.Text;
		tbSearch.Text="";
		tbSearch.ForeColor=Color.Black;
	}
}

private void tbSearch_Leave(object sender, System.EventArgs e)
{
	if(tbSearch.Text=="")
	{
		tbSearch.ForeColor=Color.Gray;
		tbSearch.Text=grayedText;
	}
}

Damit steht in der TextBox der ausgegraute Text „Search…“ welcher verschwindet, sobald man den Fokus in die TextBox setzt. Der Platzhaltertext wird nur dann angezeigt, wenn kein Inhalt in der Textbox vorhanden ist.

Wenn man mit nicht von einer Certificate Authority signierten Zertifikaten arbeitet, so wird man früher oder später folgende Fehlermeldung unter .NET zu sehen bekommen.

Das Remotezertifikat ist laut Validierungsverfahren ungültig.

Gegeben sei dabei folgendes Beispiel

SmtpClient client=new SmtpClient(host, port);
client.EnableSsl=true;

SSL ist zwar aktiviert, aber das Zertifikat kann in diesem Fall nicht validiert werden. Eine Methode um die Validierung abzuschalten ist dabei folgenden Einzeiler über diese Zeilen zu schreiben:

ServicePointManager.ServerCertificateValidationCallback=delegate { return true; };

Danach bekommt man keine Zertifikatswarnung mehr und kann die Verbindung nutzen.

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

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.

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

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.