Developer Open Space 2015

Wie jedes Jahr fand auch dieses Jahre wieder der Developer Open Space vom 16. – 18. Oktober 2015 in Leipzig statt.

Das Besondere am Konzept Open Space ist der freie Tagungscharakter. Bis kurz vor Beginn existiert keine festgelegte Agenda. Die Teilnehmer bestimmen die Themen des jeweiligen Tages gemeinsam. Die konkrete Programmiersprache ist dabei weniger entscheidend. Der Grund für alles ist einfach erklärt: Gute Gespräche hat man häufig ohne Agenda, beim Kaffee und beim „du“.

Fotos gibt’s auf devopenspace.de.

Spartakiade-Konferenz in Berlin

Am kommenden Wochenende findet in Berlin wieder die Spartakiade statt – eine immer sehr interessante Community-Konferenz bestehend nur aus Workshops.

Ich habe mich für “Moderne Webanwendungen mit AngularJS” und “Datenstromanalyse mit Azure Stream Analytics” angemeldet und bin schon sehr gespannt darauf. :-)

Developer Open Space 2014 am 17.–19. Oktober 2014 in Leipzig

Auch dieses Jahr hat die Community-(Un-)Konferenz Developer Open Space keine Rollenaufteilung in „Sprecher und Zuhörer“. Stattdessen steht weiterhin der Erfahrungsaustausch sowie der Ausbau des eigenen Netzwerkes bei einem Kaffee im Vordergrund. Die Agenda bestimmen die Teilnehmer selbstständig vor Ort, anstatt einem Konferenzbetreiber inhaltlich zu folgen.

Inline-Bild 1

Am Freitag, dem Workshop-Tag, kann man sich in ganz- oder halbtägigen „klassischen“ Workshops weiterbilden. Dieses Jahr gibt es ganze 12 Workshops zur Auswahl.

Die Anmeldung erfolgt über devopenspace.de.

Spartakiade-Konferenz in Berlin

Dieses Wochenende fand in Berlin die Spartakiade statt: Eine Konferenz, die komplett aus Workshops besteht und von der Softwareentwickler-Community ausgerichtet wird. Ich war schon die letzten beiden Jahre als auch dieses Jahr dabei und hat mir wieder gut gefallen. In 2014 stand alles unter den Überschriften „Mobile Development“ und „Psychologie“. Themen waren unter anderem:

  • Azure Mobile Services
  • Composite User Interfaces für serviceorientierte Anwendungen
  • Cross-Platform für WP8, WPF & WinRT
  • Development mit Xamarin
  • Enterprise-Webanwendungen mit Ext JS / EXT.NET
  • Graphic Recording
  • Kanban in der Realität
  • Mobile Backend as a Service
  • Psychologie bei Entscheidungen
  • Teamformation und -Transformation

Spartakiade 2014

DevExpress XPO: Teure SQL-Abfrage beim Aufruf von XPCollection.EndInit()

Für Projekte in .NET verwende ich sehr gerne die Steuerelemente von DevExpress (Englisch). Darüber hinaus ist DevExpress XPO als Datenbank-Abstraktionsebene sehr nützlich.

Jedoch stieß ich in einem aktuellen Projekt auf ein sehr seltsames Problem:

Bei einigen Formularen (seltsamerweise nicht bei allen) wurde eine sehr teure SQL-Abfrage an das Datenbank-Backend gesendet während das Formular geladen wurde. Es war im Prinzip eine SQL-Abfrage, die sämtliche (und ich meine wirklich alle) Datenzeilen von der Datenbank lud, was offensichtlich keine besonders gute Idee ist. Aber wie geschrieben war das nicht für alle Formulare der Fall: Bei den anderen Formularen wurde erwartungsgemäß nur das aktuelle Datenobjekt (die aktuelle Zeile der Tabelle) geladen.

Natürlich kontaktierte ich zunächst den immer sehr schnellen und hilfreichen DevExpress-Support. Sie haben untersucht, was die Datenabfrage auslöst und festgestellt, dass die Eigenschaft XPCollection.Count von dem CurrencyManager nach dem Methodenaufruf Control.UpdateBindings angefordert wird. Da dies etwas innerhalb des .NET Frameworks ist, konnten sie daran leider nichts ändern.

Sie schlugen vor die XPCollection nicht zur Design-Zeit zu setzen. Dies hätte jedoch bedeutet, dass ich die Formulare nicht mehr mit dem Windows-Formular-Designer erstellen könnte. Das wäre ganz schlecht, da ich viele große Formular in diesem Projekt habe, die ich sicherlich nicht alle im Quelltext erstellen möchte.

Ich fand jedoch einen andere Weg – ich nenne das nicht eine Lösung, nur ein Work-Around –, um den Designer weiterhin verwenden zu können:

Hierzu habe ich einfach zwei Batch-Dateien (unter Verwendung des Kommandozeilen-Ersetzungstools namens FART (Englisch)) geschrieben: Eine, die ausgeführt wird bevor das Build beginnt und sicherstellt, dass keine XPCollection innerhalb der Methode InitializeComponent initialisiert wird (und dabei einfach die Quelltextzeilen auskommentiert), und eine zweite, die nach dem Build läuft und die Änderungen wieder rückgängig macht.

Hier ist der Inhalt der Pre-Build-Batch-Datei:

%1Tools\fart.exe -r -C "%1*.designer.cs" "this.xpKern = new DevExpress.Xpo.XPCollection(this.components);" "\x2f\x2fthis.xpKern = new DevExpress.Xpo.XPCollection(this.components);"
%1Tools\fart.exe -r -C "%1*.designer.cs" "((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();" "\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();"
%1Tools\fart.exe -r -C "%1*.designer.cs" "this.xpKern.ObjectType = typeof(Administration.Daten.Kern);" "\x2f\x2fthis.xpKern.ObjectType = typeof(Administration.Daten.Kern);"
%1Tools\fart.exe -r -C "%1*.designer.cs" "this.xpKern.Session = this.unitOfWork;" "\x2f\x2fthis.xpKern.Session = this.unitOfWork;"
%1Tools\fart.exe -r -C "%1*.designer.cs" "((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();" "\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();"

@exit 0

Und die Post-Build-Datei, welche die Änderungen wieder rückgängig macht:

%1Tools\fart.exe -r -C "%1*.designer.cs" "\x2f\x2fthis.xpKern = new DevExpress.Xpo.XPCollection(this.components);" "this.xpKern = new DevExpress.Xpo.XPCollection(this.components);"
%1Tools\fart.exe -r -C "%1*.designer.cs" "\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();" "((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();"
%1Tools\fart.exe -r -C "%1*.designer.cs" "\x2f\x2fthis.xpKern.ObjectType = typeof(Administration.Daten.Kern);" "this.xpKern.ObjectType = typeof(Administration.Daten.Kern);"
%1Tools\fart.exe -r -C "%1*.designer.cs" "\x2f\x2fthis.xpKern.Session = this.unitOfWork;" "this.xpKern.Session = this.unitOfWork;"
%1Tools\fart.exe -r -C "%1*.designer.cs" "\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();" "((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();"

@exit 0

Das @exit 0 am Ende dieser ist wichtig, da ansonsten ein Code 2 zurückgegeben wird (warum auch immer) und das Visual-Studio-Build-System sich bei jedem Build darüber beschwert.

Nun müssen Sie nur doch diese Batch-Dateien in den Visual-Studio-Buildereignissen mit

$(ProjectDir)Tools\PreBuild.bat $(ProjectDir)

beziehungsweise

$(ProjectDir)Tools\PostBuild.bat $(ProjectDir)

aufrufen.

Ich weiß, dass dies keine besonders gute “Lösung” ist, aber das war die einzige Idee, die ich hatte, dass ich weiterhin den Formular-Designer verwenden kann und trotzdem diese teuren SQL-Anfragen vermeide.

Hatten Sie bereits einmal dieses Problem und vielleicht sogar eine bessere Lösung dafür? Ich freue mich über jeden anderen Vorschlag zu diesem Thema!

Intel Ultrabook MeetUp in München

Heute war ein zweiter Intel Ultrabook MeetUp in München dieses Jahr. Der erste war im Juli.

Intel Ultrabook MeetUp in München

Ich war eingeladen dort ein bisschen was zu meiner Erfahrung hinsichtlich der Migration einer HTML5-App zum Modern Style UI (ürsprünglich Metro) von Windows 8 zu erzählen. Hierbei habe ich als Beispiel mein Vokabel-Trainer-Projekt verwendet.

Developer Open Space in Leipzig

Dieses Wochenende finde die alljährliche Developer Open Space (vormals .NET Open Space) in Leipzig mit rund 150 Teilnehmern statt.

Developer Open Space 2012

Ich wurde eingeladen dort heuten einen Vortrag über die Nutzung der neuesten Intel Ultrabook Features unter Windows 8 zu halten. Hierbei habe ich als Beispiel mein Vokabel-Trainer-Projekt verwendet.

Developer Open Space 2012: Nach Vortrag

Nach dem Vortrag nutzen einige Teilnehmer die Möglichkeit einen genaueren Blick auf das neue Intel Ultrabook zu werfen und Fragen zur Anwendungsentwicklung unter Windows 8 zu stellen.

Waren auch Sie bei der Developer Open Space?

Ultimate Coder Challenge: Hinzufügen eines Wörter-Kartenspiels

Nach einigen Interface-Verbesserungen in meinem letzten Artikel, fügte ich in der Zwischenzeit ein Wörter-Kartenspiel zu der Vokabel-Trainer-App hinzu.

Aber zunächst erweiterte ich die Hauptansicht mit einem Semantic Zoom. So sieht die normale Ansicht aus:

Screenshot des Vokabel-Trainers: Ohne Semantic Zoom

Und mit Semantic Zoom (herausgezoomt):

Screenshot des Vokabel-Trainers: Mit Semantic Zoom

Falls viele Lektionen dargestellt werden sollen, bekommt der Benutzer auf diese Weise eine bessere Übersicht.

Aber nun zum interessanteren Teil: Das Wörter-Kartenspiel, welches ähnlich wie das Spiel Memory® von Ravensburger aussieht:

Es zeigt zunächst zugedeckte Spielkarten an. Nachdem der Benutzer eine Karte berührt bzw. darauf geklickt hat, wird diese aufgedeckt und ein Wort in einer der beiden Sprachen der aktuellen Lektion angezeigt. Der Benutzer muss dann das dazu passende übersetzte Wort finden.

Sollten zu viele Wörter in einer Lektion sein, um alle anzuzeigen, werden die Wörter automatisch zufällig ausgewählt.

Hier sieht man, wie es nun aussieht:

Screenshot des Vokabel-Trainers: Wörter-Kartenspiel

OK, das war der letzte Artikel in der Ultimate Coder Challenge von mir.

Natürlich gäbe es noch genug Ideen, was man dem Vokabel-Trainer hinzufügen könnte – vor allem die Online-Sychronisation sollte bald verfügbar sein –, aber in diesem Wettbewerb ist keine Zeit mehr dafür.

Zusammenfassend kann man sagen, dass es möglich ist eine HTML5-App in sechs Wochen in das neue Windows 8 UI Design zu überführen, aber es ist wirklich viel Arbeit. Auch, wenn Microsoft sagt, dass man mit HTML5 nur einmal entwickelt und danach auf verschiedenen Platformen veröffentlichen kann, so ist dies doch mehr eine Wunschvorstellung. In der Praxis muss man eine ganze Menge an Extra-Arbeit leisten, um das richtige Look & Feel für jede Platform zu bekommen – besonders für Windows 8.

Aber ich hoffe, Ihnen hat das Lesen meiner Artikel Spaß gemacht!

Ultimate Coder Challenge: IDF und Interface-Verbesserungen

Es hat mich sehr gefreut letzte Woche wieder zur IDF in San Francisco eingeladen worden zu sein.

Dort durfte ich meinen Vokabel-Trainer an einem Stand von Intel im Bereich des technischen Showcases vorstellen.

IDF 2012: Showcase

Aber ich hatte auch Zeit, um einige Interface-Verbesserungen für den Vokabel-Trainer umzusetzen.

Zunächst habe ich die Wörterbuchansicht optimiert:

Screenshot des Vokabel-Trainers: Wörterbuch bearbeiten

Es gibt keinen Grund die Flaggen für jedes einzelne Wort anzuzeigen. Das verschwendet nur Platz. So sieht es nun aus:

Screenshot des Vokabel-Trainers: Wörterbuch bearbeiten überarbeitet

Nun werden die Flaggen nur noch einmal rechts oben auf dem Bildschirm angezeigt.

Zudem musste ich einen Weg finden, damit der Benutzer Verzeichnisse wieder löschen kann. Lektionen können durch Auswahl und danach Verwendung der Löschen-Schaltfläche in der Command-Bar gelöscht werden. Für Verzeichnisse ist dies nicht möglich, da diese nicht ausgewählt werden können.

Daher habe ich entschieden hierfür eine Art PopUp-Menü zu verwenden: Wenn ein Verzeichnisname berührt/angeklickt wird, soll eine Schaltfläche erscheinen, die es dem Benutzer ermöglicht dieses Verzeichnis zu löschen.

Nach einer Recherche fand ich heraus, dass dies mit einem Flyout möglich ist. Somit habe ich folgendes Quelltext-Stück eingefügt:

<div id="deleteFolderFlyout" data-win-control="WinJS.UI.Flyout" aria-label="{Delete folder flyout}">
    <button id="deleteFolder">Delete this folder with all lessons?</button>
</div>

Um das Flyout letztlich anzuzeigen, wenn der Verzeichnisname berührt/angeklickt wurde, musste ich eine JavaScript-Funktion beim OnClick-Ereignis aufrufen. Aber es ist offensichtlich nur möglich eine JavaScript-Funktion aufzurufen, wenn diese mit einem WinJS-Namespace zur Verfügung gestellt wird:

GroupedItems.ShowDeleteFolderFlyout(event)

Und hier ist die JavaScript-Funktion selbst samt der Namespace-Definition:

function showDeleteFolderFlyout(e) {
    var deleteFolderFlyout = document.getElementById("deleteFolderFlyout");
    deleteFolderFlyout.deleteFolderId = e.target.groupKey;
    deleteFolderFlyout.winControl.show(e.target, "right");
}

WinJS.Namespace.define('GroupedItems', {
    ShowDeleteFolderFlyout: showDeleteFolderFlyout
});

So sieht’s nun aus, wenn man einen Verzeichnisnamen berührt bzw. ihn anklickt:

Screenshot des Vokabel-Trainers: Verzeichnis löschen Flyout

Das war das Update für diese Woche wieder.

Lesen Sie nächsten Montag weiter!

IDF 2012: Treffen mit den anderen Ultimate Coders in San Francisco

Diese Woche findet das Intel Developer Forum (IDF) (Englisch) in San Francisco statt.

Es freut mich sehr wie letztes Jahr von Intel eingeladen worden zu sein.

Diese Jahr wurde ich als Teilnehmer der Ultimate Coder Challenge, aber auch als Intel Black Belt Entwickler eingeladen.

San Francisco ist eine großartige Stadt und es hat viel Spaß gemacht all die anderen Ultimate Coders und Black Belt Entwickler zu treffen. Viele kannte ich bereits von letztem Jahr.

Waren Sie auch bei der IDF 2011?