Ich bin seit einigen Tagen dabei, den Umzug unserer Online-Gaming-Clan-Site www.kiez-clan.de vorzubereiten. Zur Zeit läuft die Seite auf Joomla 1.0.x und soll nach dem Umzug in der aktuellen Joomla 1.5.x in neuem Glanz erscheinen. Da sich aber zwischen den Version so ziemlich alles geändert hat und ich auch ungern die Unterstützung für “Alt-Komponenten” aktivieren möchte, suche ich nun für die verwendeten Komponenten Ersatz.
Eine dieser Komponenten ist die Game-Server-Anzeige-Komponente “com_serverstat”. Die Komponente kann für eine Hand voll Servertypen Daten über das aktuelle Spielgeschehen (Spieler, Karte…) darstellen. Leider wird die Komponente schon seit längerem nicht weiterentwickelt. Auch sonst habe ich keinen passenden Ersatz gefunden, was mich auf die Idee gebracht hat, diese Lücke selbst zu schließen.

Nach einigen Abenden habe ich heute nun die erste Version mit der viel versprechenden Versionsnummer 0.1 auf meiner Joomla-Seite joomla.larshildebrandt.de veröffentlicht. Die Komponente zeigt neben einigen Parametern, wie Servername, IP-Adresse, Anzahl von Spielern und aktuelle Karte auch die derzeit auf dem Server befindlichen Spieler an. Bei den beiden Voice-Servern Teamspeak 2 und Ventrilo werden weiterhin auch die Channels dargestellt.
Für die Karten-Bilder konnte ich www.allstats.de gewinnen. Eine Beispiel-Installation gibt es unter folgender Adresse: joomla.larshildebrandt.de/gameserver.html. Derzeit werden folgende Servertypen unterstützt:
Battlefield 1942
Battlefield Vietnam
Battlefield 2
Battlefield 2142
Call of Duty
Call of Duty – United Offensive
Call of Duty 2
Call of Duty 4
Call of Duty 5: World at War
Counter-Strike
Counter-Strike: Source
Crysis Wars
Dark Messiah of Might and Magic
Day of Defeat
Day of Defeat: Source
Half-Life
Half-Life 2
Left 4 Dead
Natural Selection
Quake 3: Arena
Quake 4
Return to Castle Wolfenstein
Team Fortress 2
Unreal Tournament
Unreal Tournament 2004
Unreal Tournament 3
Wolfenstein: Enemy Territory
Teamspeak 2
Ventrilo
Ich arbeite zur Zeit an einem kleinen ASP.net Projekt. Für das globale Exception-Logging bin ich dank meines Kollegen Tobi über Elmah gestolpert. Über Elmah besteht die Möglichkeit sämtliche unbehandelten Exceptions zu speichern. Unterstützt werden derzeit folgende Weg:
- Microsoft SQL Server
- Oracle
- SQLite
- Microsoft Access
- VistaDB
- XML-Dateien
- im Speicher
Weiterhin besteht die Möglichkeit sich Emails schicken zu lassen. Elmah bringt gleich eine webbasierte Übersicht mit, so dass man sich sehr einfach einen Überblick über aufgetretene Exceptions machen kann.
Um Elmah einem Projekt hinzuzufügen, muss kein Sourcecode neu kompliliert werden. Es müssen nur ein paar Anpassungen an der Webconfig vorgenommen werden.
Hier eine ganz einfach Webconfig ohne Mailversandt:
<?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="elmah"> <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/> <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"/> </sectionGroup> </configSections> <elmah> <errorLog type="Elmah.SQLiteErrorLog, Elmah" connectionStringName="ELMAH.SQLite" /> </elmah> <connectionStrings> <add name="ELMAH.SQLite" connectionString="Data Source=|DataDirectory|errors.s3db"/> </connectionStrings> <system.web> <compilation debug="true" defaultLanguage="C#" /> <httpModules> <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> </httpModules> <httpHandlers> <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/> </httpHandlers> <trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/> <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US"/> <trust level="Full"/> </system.web> </configuration>
Über den Aufruf von “elmah.axd” erhält man die Webseite mit allen gespeicherten Exceptions.
Wer also ein kleines, leichtes Framework fürs Exceptionhandling sucht, dem sei Elmah empfohlen.
Nachdem ja gestern Windows 7 RC zum öffentlichen Download bereitgestellt wurde, konnte ich natürlich nicht wiederstehen und habe mir gleich die 64 Bit Version auf meinem Rechner zu Hause installiert.
Leider musste ich nach der Installation feststellen, dass TrueCrypt meine 2. Platte nicht mehr lesen wollte. Windows 7 hat die verschlüsselte Platte bei der Installation als “leer” interpretiert und sie schon mal für mich ahnungslosen Benutzer initialisiert und die für Windows nötigen Files drauf geschrieben.
Zum Glück hatte ich einen recht guten Sicherungsstand, so dass ich nur relativ wenig Daten (darunter ein paar Konzertfotos und auch etwas Source-Code) verloren habe.
Auf diesem Wege also Danke Microsoft… endlich wieder ein gutes Feature
Gestern Abend habe ich mich mal wieder ein wenig mit Fluent NHibernate beschäftigt. Mein Ziel war es, eine Objektstruktur, die aus einer Basisklasse und zwei abgeleiteten Klassen besteht mittels Fluent NHibernate zu speichern.

Nach einigem Fehlversuchen bin ich dann zu folgendem Ergebnis gekommen:
public class KontaktMap : ClassMap<Kontakt> { public KontaktMap() { Id(x => x.KontaktId) .GeneratedBy .GuidComb() .WithUnsavedValue("00000000-0000-0000-0000-000000000000"); Map(x => x.KontaktPerson); JoinedSubClass<Brief>("KontaktId", MapBrief); JoinedSubClass<Anruf>("KontaktId", MapAnruf); } private static void MapBrief(JoinedSubClassPart<Brief> part) { part.Map(x => x.Absender); part.Map(x => x.Text); } private static void MapAnruf(JoinedSubClassPart<Anruf> part) { part.Map(x => x.Telefonnummer); part.Map(x => x.Bemerkung); } }
Hier das vollständige Beispiel: Download
Habt ihr Euch auch schon einmal darüber geärgert, wieder diese unschönen XML-Dateien für das Mapping von NHibernate schreiben zu müssen? Seit kurzem gibt es gegen diese Unschönheit eine Lösung. Fluent NHibernate bietet Euch die Möglichkeit Eure Mappings “strongly typed” zu definieren. Anstatt der hbm.xml-Datei gibt es mit Fluent NHibernate eine Mapping-Klasse.
Die Klasse Person mit einer Liste von Adressen
public class Person { public virtual Guid PersonId { get; set; } public virtual string Vorname { get; set; } public virtual string Nachname { get; set; } public virtual IList<Adresse> Adressen { get; set; } }
kann dann wie folgt gemappt werden.
public class PersonMap : ClassMap<Person> { public PersonMap() { Id(x => x.PersonId) .GeneratedBy .GuidComb() .WithUnsavedValue("00000000-0000-0000-0000-000000000000"); Map(x => x.Vorname).WithLengthOf(50); Map(x => x.Nachname).WithLengthOf(50); HasMany<Adresse>(x => x.Adressen) .Access.AsProperty() .AsBag().WithKeyColumn("PersonId") .Cascade.All(); } }
Aber welche Vorteile biete die Fluent-Variante?
1. Die XML-Mapping-Dateien können nicht vom Compiler geprüft werden. Fehlkonfigurationen fallen erst zu Laufzeit auf (Exception)
2. Mapping-Klassen werden wie alle anderen Klassen vom Compiler geprüft. Fehler fallen zu Entwurfszeit auf.
3. Beim Umbennen von Feldern in Klassen über die Refactoring-Möglichkeiten von Visual Studio bzw. Erweiterungen werden die Felder in den Mapping-Klassen ebenfalls umbenannt. Bei den XML-Mappings müsste das händisch gemacht werden.
4. Fluent-Mappings sind deutlich kürzer bzw. deutlich besser lesbar.
Auch die Konfiguration von NHibernate kann über eine FluentVariante realisiert werden.
ISessionFactory sessionFactory = Fluently .Configure() .Database(SQLiteConfiguration.Standard.UsingFile("Beispiel.db")) .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()) .BuildSessionFactory();
Unter http://fluentnhibernate.org/ kann man sich die aktuelle Version der NHibernate-Erweitung laden und mit der neuen XML-freien Variante von Mappings anfreunden.
Das komplette Beispiel gibt es hier.
Unsere Java-Truppe hat uns vor ein paar Tagen ihren Continuous Integretion Server Hudson gezeigt. Wir waren sehr davon angetan, wie einfach dieses System zu bedienen ist. Als sie uns sagten, das Hudson auch .net-Projekte bauen kann, wurden wir hellhörig.
Kurze Zeit später hatten wir auf einer VM ein Testsystem online, welches für erste Vergleichstest herhalten musste. Der erste Eindruck von der einfachen Bedienung bestätigte sich bei jedem neuen Projekt, das wir im System hinterlegten. Auch das Thema Unit-Test mit NUnit wird durch ein Add-In für Hudson unterstützt. Wer mal etwas tiefer in die Konfiguration von Jobs schauen möchte, kann ja mal hier gucken
Das einzige, was mir persönlich nicht so gut gefiel, war die Tatsache, das es keine brauchbare Tray-Anwendung zur Darstellung des Status gab. Ich persönlich bin kein großer Freund von Mail-Benachrichtigungen.
Nach kurzem Durchsuchen der Hudson-Seite wurde ich auf die bereitgestellt API aufmerksam… und ein paar Abende später, war die erste Version meiner Tray-Anwendung fertig.

Wer mehr sehen will, kann sich auch auf CodePlex die aktuelle Version oder auch den Source-Code runterladen.
Mir stellte sich gerade die Frage, wie ich in WPF definieren kann, ob der Cursor mit Tab in ein Control springt oder nicht. Nach etwas längerem Suchen habe ich dann die Lösung gefunden:
<TextBox KeyboardNavigation.IsTabStop="False" />Einfach im Xaml als Attribute hinzufügen.
Ich arbeitet zur Zeit in der Firma an einem Prototypen für eine neue Softwareversion. Eine Anforderung ist die transparente Darstellung von mehreren Werten in einem Balken-Diagramm. Leider gibt es für Wpf noch keine freien Komponenten, die für meine Aufgabe nutzbar wären.
Abends kam mir dann die Idee, das Problem selbst zu lösen. Gesagt getan… nach einigen kleinen oder auch großen Kämpfen mit Wpf und Xaml habe ich heute endlich eine in meinen Augen vorzeigbar Version fertiggestellt.











