seeseekey.net - Invictus Deus Ex Machina

Unter .NET gibt es einige Eigenschaften, welche mit Formatierungsstrings gefüttert werden, so z.B. die Eigenschaft:

picker.CustomFormat="dd/MM/yyyy HH:mm:ss";

Die Herangehensweise den Formatierungsstring von Hand einzutragen ist dabei gefährlich — spätestens wenn es an die Lokalisierung der Anwendung geht. Glücklicherweise kann man diese Date Pattern anhand der aktuellen Kultureinstellung (CurrentCulture) ermitteln:

Application.CurrentCulture.DateTimeFormat.LongDatePattern
Application.CurrentCulture.DateTimeFormat.LongTimePattern
Application.CurrentCulture.DateTimeFormat.ShortDatePattern
Application.CurrentCulture.DateTimeFormat.ShortTimePattern

Neben den hier gezeigten Pattern, gibt es noch eine Reihe weiterer wie z.B. MonthDayPattern. Obige Definition würde nun wie folgt aussehen:

picker.CustomFormat=String.Format("{0} {1}", Application.CurrentCulture.DateTimeFormat.ShortDatePattern, Application.CurrentCulture.DateTimeFormat.LongTimePattern);

Vor ein paar Tagen war ich auf der Suche nach einer .NET Bibliothek zum Lesen und Schreiben von ePub Dateien. Bei ePub handelt es sich um einen offenen Standard für eBooks. Möchte man ePub-Dateien nur lesen, so dürfte sich die Bibliothek ePubReader anbieten, welche auf CodePlex zu finden ist.

epubreader.codeplex.com

Ist man auch auf das Schreiben von ePub-Dateien angewiesen, gibt es die Bibliothek DotNetEpub. An zweiter Stelle wäre die Bibliothek epubsharp.net zu nennen, allerdings existiert zu dieser Bibliothek kein Quelltext.

Manchmal möchte man private Variablen und Eigenschaften einer Klasse mittels NUnit testen. Im Normalfall lautet die Antwort auf diese Fragestellung — Nein. Stattdessen soll nur das öffentliche Interface getestet werden. Möchte bzw. muss man trotzdem ein privates Mitglied einer Klasse testen, so muss man sich der Reflection bedienen. Das könnte dann so aussehen:

string[] lines=(string[])typeof(MyClass).GetField("Lines",BindingFlags.NonPublic|BindingFlags.Static).GetValue(null);

In diesem Fall wird sich das statische String Array Lines aus der Klasse MyClass geholt. Je nachdem, wie man die entsprechenden BindingFlags einstellt, ist es auch möglich Instanzvariablen zu ermitteln.

Beginnend mit dem Jahre 2003 wurde an der Universität Lausanne in der Schweiz eine Software für interaktive Whiteboards entwickelt und eingesetzt. Diese Software trug dabei den Namen Uniboard. Auf Betreiben der gemeinnützigen Interessenvereinigung für Digitale Bildung in Afrika wurden alle Rechte dieser Software von der französischen Regierung gekauft.

open-sankore.org

Seitdem wird die Software unter dem Namen Open-Sankoré weiterentwickelt. Es handelt sich dabei um die erste freie Software für interaktive Whiteboards. Technisch basiert die Software dabei auf C++, QT und HTML5 und ist unter der GPL in der Version 3 lizenziert. Open-Sankoré ist für Linux, Mac OS X und Windows verfügbar. Bezogen werden kann die Software auf der offiziellen Seite unter open-sankore.org.

In den letzten Tagen habe ich nach einem Pattern für C#/.NET gesucht welches elegant einen Timer zur Verfügung stellt. Gestoßen bin ich dabei auf ein Pattern, welches sich die neuen Keywörter async und await aus den aktuellen C#-Versionen zu Nutze macht. Mit Hilfe dieser Schlüsselwörter lassen sich nebenläufige Funktionen ohne größeren Overhead entwickeln. Die Timer-Funktion sieht dabei so aus:

async void StartPollingTimer()
{
    while(true)
    {
        await Task.Delay(2000);

        //Do something
    }
}

Aufgerufen wird das ganze dabei einfach mittels:

StartPollingTimer();

Der Entwickler muss sich dabei nicht mehr um die Thread-/Task-Verwaltung kümmern und kann damit auf die Schnelle einen Timer implementieren, welcher asynchron läuft.

Bei Mac OS X befindet sich oben am Bildschirmrand die Menü– und Statusbar. In diesem Artikel soll es darum gehen, eine solche Statusbar-App in Mono mittels des Xamarin Studios zu erstellen. Im ersten Schritt wird dazu ein neues MonoMac-Projekt im Xamarin-Studio angelegt. Wenn man dieses Projekt startet, findet man ein leeres Mac OS X-Fenster vor.

Ein neues MonoMac Projekt wird angelegt

In dem neu angelegten Projekt wird eine neue Klasse mit dem Namen AppController angelegt. Diese wird mit folgendem Inhalt gefüllt:

using System;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace StatusBarApp
{
    [Register("AppController")]
    public partial class AppController : NSObject
    {
        public AppController()
        {
        }

        public override void AwakeFromNib()
        {
            var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
            statusItem.Menu = statusMenu;
            statusItem.Image = NSImage.ImageNamed("status");
            statusItem.HighlightMode = true;

            mcQuit.Activated+=(object sender, EventArgs e) =>
            {
                NSApplication.SharedApplication.Terminate(this);
            };
        }
    }
}

Damit die Anwendung kein Menü und kein Dock-Icon mehr besitzt, müssen wir die Info.plist bearbeiten. In dieser Datei muss ein neuer Schlüssel mit dem Namen Application is agent (UIElement) und dem Typ Boolean angelegt werden. Der Wert des neuen Schlüssels wird dabei auf YES gesetzt.

Der neue Schlüssel wird mit dem PList-Editor des Xamarin Studios hinzugefügt

Nun öffnen wir die Datei MainMenu.xib, welche von Xamarin Studio in Xcode geöffnet wird. Hier ziehen wir ein neues Objekt vom Typ Menu in den Designer und entfernen alle Einträge bis auf einen. Dem verbliebenen Eintrag geben wir die Beschriftung Quit. Anschließend fügen wir ein Object hinzu und begeben uns in den Identity Inspector. Dort tragen wir bei Custom Class unter Class den Namen AppController ein. Das vorhandene Hauptmenü kann anschließend entfernt werden.

Das Design unter Xcode

Nun muss das Menü mit dem Quellcode verbunden werden, dazu wird der Assistance Editor in Xcode geöffnet. Als Quelltext wird auf der rechten Seite des Editors die Datei AppController.h ausgewählt. Nun wird das Menü mittels gedrückter Steuerungstaste (Strg/Ctrl) in die Headerdatei gezogen. Damit legen wir ein Outlet an. Dieses bekommt den Namen statusMenu. Das gleiche wird anschließend mit dem Menüeintrag Quit gemacht. In diesem Fall wird dabei eine Action definiert, welche den Namen mcQuit bekommt. Nun kann Xcode wieder geschlossen werden.

Dem Projekt muss nun noch eine 29×22 Pixel große Grafik hinzugefügt werden. Die Grafik (in diesem Fall status.png) wird beim Laden als Icon für die Statusleiste genutzt. Als letzten Schritt können die Dateien MainWindow.cs, MainWindow.xib und MainWindowController.cs entfernt werden. Nachdem diese Objekte auch im AppDelegate entfernt wurden, ist die Anwendung fertig. Der Quelltext des Projektes kann sich auch heruntergeladen werden. Er kann dabei von jedermann frei verwendet (Public Domain) werden.

Bei der gestern vorgestellten Twitter-Bibliothek bemerkte ich nach einigem Testen ein Problem. Folgender Quellcode:

var twitter=new TinyTwitter.TinyTwitter(oauth);
twitter.UpdateStatus(".");
twitter.UpdateStatus("..");
twitter.UpdateStatus("..");
twitter.UpdateStatus("....");
twitter.UpdateStatus(".....");

funktionierte nicht wie gewünscht. Anstatt auf Twitter diese fünf Tweets angezeigt zu bekommen, schaffen es nur die ersten zwei Tweets durch die API. Das Problem ergab sich hierbei daraus das sich die .NET Framework-Methode HttpWebResponse.GetRequestStream einfach aufhängte bzw. nicht mehr reagierte. Problematisch daran ist, das man als Entwickler keine Rückmeldung bekommt, warum das ganze schief läuft. Nach einiger Recherche stellte ich dann fest, das HttpWebResponse.GetRequestStream nur dann erneut aufgerufen werden darf, wenn der vorherige Aufruf der Methode abgeschlossen ist. Im Falle der TinyTwitter Bibliothek, habe ich das Problem durch Aufruf der Methode Abort (nachdem die angefragten Informationen angekommen sind) im HttpWebResponse–Objekt gelöst.

Die meisten Bibliotheken welche Zugang zur Twitter-API in C# (.NET/Mono) bereitstellen haben ein Problem. Sie sind schlicht zu groß. Meist bestehen sie aus einem dutzend Bibliotheken und werden mit der Zeit immer unhandlicher. So war auf der Suche nach einer leichtgewichtigen Bibliothek für den Zugriff auf das Twitter-API. Fündig wurde ich mit TinyTwitter.

TinyTwitter auf GitHub

Diese Bibliothek besteht im Kern aus einer Datei und lässt sich einfach verwenden. Um einen Tweet zu senden, recht folgender Code:

var oauth = new OAuthInfo
{
    AccessToken = "YOUR ACCESS TOKEN",
    AccessSecret = "YOUR ACCES SECRET",
    ConsumerKey = "YOUR CONSUMER KEY",
    ConsumerSecret = "YOUR CONSUMER SECRET"
};

var twitter = new TinyTwitter(oauth);

twitter.UpdateStatus("I'm tweeting.");

Zu finden ist die Bibliothek auf GitHub. Lizenziert ist TinyTwitter unter der Apache Lizenz und damit freie Software.

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.

Microsoft kauft Mojang und damit Minecraft. Wenn man sich andere Akquisitionen von Microsoft im Spielebereich anschaut, bekommt man bei dieser Vorstellung ein mulmiges Gefühl. Entweder Sie fahren das Spiel gegen die Wand, oder es läuft demnächst nur noch auf Microsoft-Betriebssystemen. Natürlich kann auch alles funktionierten und unsere Befürchtungen erweisen sich als gegenstandslos. Allerdings zeigt der Aufkauf von Mojang eine Abhängigkeit auf. So haben viele Menschen riesige Bauwerke geschaffen, welche unter Umständen bald nicht mehr verfügbar sind. Minecraft ist nicht nur ein Spiel, es ist ein Kreativbetriebssystem. In einem solchem Fall spielt freie Software ihre Vorteile aus. Bei einer solchen Software, kann man das ganze einfach forken und in seinem Sinne weiterentwickeln. Bei proprietärer Software wird dies schwierig.

Eine von vielen Minecraft-Welten

Mit Minetest gibt es einen durch Minecraft inspirierten Clone, welcher für Mac OS X, Linux und Windows verfügbar ist. Das Spiel ist im Gegensatz zur aktuellen Minecraft-Version etwas rudimentär, was Dinge wie verfügbare Blöcke und ähnliches angeht. Allerdings relativiert sich das ganze wenn man sich die API-Schnittstelle anschaut. Mit Hilfe der API, kann man alle möglichen Erweiterungen wie Loren, TNT, Mobs oder Pyramiden ins Spiel holen. Die maximale Weltgröße ist auf −30912 zu 30927 in allen Dimensionen (auch Z) beschränkt. Etwas seltsam erscheint mir allerdings die Speicherung der Map in einer SQLite-Datenbank — dort muss sich zeigen ob dies bei großen Welten wirklich performant ist. Auch für Server-Backups ist dieses Verfahren nicht wirklich gut geeignet. Minetest ist in C++ entwickelt, was sich positiv auf die allgemeine Performance auswirkt, so das es auch auf schwächeren Rechnern genutzt werden kann — so gibt es schon Versuche das ganze auch auf dem Raspberry Pi zum laufen zu bringen.

Minetest in Aktion

Die Entwicklung von Minetest sieht dabei vielversprechend aus, so das man in Zukunft viele Verbesserungen und neue Features erwarten darf. Neben dem Client ist auch ein Server für den Mehrspieler-Betrieb verfügbar. Der unter der LGPL lizenzierte Quellcode kann über GitHub bezogen werden. Die offizielle Seite von Minetest ist unter minetest.net zu finden.