seeseekey.net - Invictus Deus Ex Machina

In meinem gestrigen Artikel ging es um eine Command & Conquer Version für den Browser. Neben dem Original gibt es eine Reihe von Projekte welche sich mehr oder weniger mit Command & Conquer beschäftigen. Eines dieser Projekte ist OpenRA. Dabei handelt es sich um eine Engine welche das Feeling und die Spielmechanik von Command & Conquer nachbaut. So kann die Engine unter anderem die Spieldaten der alten Command & Conquer Teile nutzen. Angeboten werden dabei aber im Moment nur einzelne Missionen und keine zusammenhängende Kampagne. Neben dem Singleplayermodus gibt es auch einen Multiplayermodus.

Der Titelschirm von OpenRA

OpenRA ist unter der GPLv3 lizenziert und damit freie Software. Der Quelltext ist auf GitHub zu finden. Geschrieben ist das ganze in C#. Damit ist ist OpenRA unter Linux, Mac OS X und Windows lauffähig. Die offizielle Seite des Projektes ist unter openra.net zu finden.

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.