seeseekey.net - Invictus Deus Ex Machina

Wenn man in einem .NET Property Grid ein DateTime–Objekt bearbeitet, so klappt ein Kalender auf, in welchem das Datum eingestellt werden kann. Anschließend kann umständlich die Uhrzeit eingestellt werden. Möchte man dieses Prozedere etwas vereinfachen, kann man für das DateTime–Objekt einen neuen UITypeEditor schreiben:

public class DateTimePickerEditor : UITypeEditor
{
	IWindowsFormsEditorService windowsFormsEditorService;
	DateTimePicker dateTimePicker=new DateTimePicker();

	public DateTimePickerEditor()
	{
		dateTimePicker.Format=DateTimePickerFormat.Custom;
		dateTimePicker.CustomFormat=String.Format("{0} {1}",
                 Application.CurrentCulture.DateTimeFormat.ShortDatePattern,
                 Application.CurrentCulture.DateTimeFormat.ShortTimePattern);
	}

	public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
	{
		return UITypeEditorEditStyle.DropDown;
	}

	public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
	{
		if(provider!=null)
		{
			windowsFormsEditorService=provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
		}

		if(this.windowsFormsEditorService!=null)
		{
			dateTimePicker.Value=(DateTime)value;
			windowsFormsEditorService.DropDownControl(dateTimePicker);
			value=dateTimePicker.Value;
		}

		return value;
	}
}

Nachdem der Editor fertiggestellt ist muss beim entsprechenden DateTime–Objekt noch der passende der Editor per Attribut definiert werden:

[EditorAttribute(typeof(DateTimePickerEditor), typeof(UITypeEditor))]
public DateTime DateAndTime;
{
	get
	{
		return dateAndTime;
	}
	set
	{
		dateAndTime=value;
	}
}

Damit verfügt man nun über einen Editor im Property Grid, welcher die Bearbeitung von Datum und Zeit komfortabel erlaubt.

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.

Pünktlich zu Beginn des neuen Jahres war ich auf der Suche nach einer dreistelligen .net Domain. Da es natürlich keinen Spaß macht alle möglichen Kombinationen von Hand auszuprobieren habe ich das ganze automatisiert und mir eine Liste von freien .net Domains zusammengestellt. Die Liste ist dabei erwartungsgemäß relativ kurz:

5q3.net
5sy.net
8q9.net
9b6.net
9g4.net
9h4.net
c0f.net
d9i.net
g6t.net
g7f.net
i8e.net
j3q.net
j8l.net
k0g.net
k1g.net
k1t.net
k6q.net
l0b.net
l2y.net
l5j.net
l5q.net
l6d.net
n0u.net
o0f.net
o3f.net
o6p.net
o6u.net
o8c.net
p3v.net
q8c.net
q8k.net
r9l.net
s8h.net
s9r.net
u7r.net
y5d.net
y9h.net
y9p.net
y9q.net
z5i.net
z7g.net

Wer also noch eine dreistellige Domain braucht, sollte sich ranhalten 😉

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

Sogenannte Ribbons hatte Microsoft durch seine neueren Office-Versionen bekannt gemacht. Für WPF gibt es Ribbon-Unterstützung in Form des Namespaces System.Windows.Controls.Ribbon. Möchte man Ribbons allerdings in Windows Forms einsetzten, muss man Fremdkomponenten nutzen. Office Ribbon ist dabei eine solche Komponente.

Eines der Beispiel-Formulare der Bibliothek

Die Bibliothek Office Ribbon stellt Ribbon für Windows Forms zur Verfügung. Die Ribbon lassen sich im Aussehen anpassen, zur Zeit gibt es Themes welche das Aussehen von Office 2007 bis 2013 nachahmen. Lizenziert ist die Bibliothek unter der Microsoft Public License und damit freie Software. Das Projekt wird auf CodePlex gehostet und aktiv entwickelt.