Get in touch with User Driven Innovation

I visited the Lange Nacht der STARTUPS in Berlin. I watched out for concepts creating an own startup and experiences of people who already started a successful business. One of my favourite sessions there was User Driven Innovation- Tools, Experiences and an interactive Intro to Business Modeling.

Short and sweet

User Driven Innovation (UDI) describes a handy process to put an idea into a lightweight business model. You can find a more detailed explanation of the concept here.

Your benefit

With UDI you achieve your business model within a short period of time. You can make various iterations until you are pleased with your result.
Don’t forget to evaluate each iteration with your team and your customers.

(more…)

Meine Panik-Migration

ASP.NET Web API 2

In meinem derzeitigen Projekt verwende ich Microsofts Web API in der Version 2,- bereits seit der Beta.  Die aktuellste Version kann per NuGet installiert werden:

PM> Install-Package Microsoft.AspNet.WebApi -Pre

Außerdem nutze ich die Web API Help Pages, um für meine Web API eine automatische Dokumentation zu generieren.

PM> Install-Package Microsoft.AspNet.WebApi.HelpPage -Pre

Heute stand das Update auf den kürzlich veröffentlichten Release Candidate 1 der Web API an. Das bedeutet auch, dass ich die Help Pages aktualisieren musste, damit diese mit der der Web API 2 kompatibel bleiben.
Leider hat die Aktualisierung bei mir dazu geführt, dass meine komplette Web-Anwendung nicht mehr funktionierte.

Fehler des Webservers

[A]System.Web.WebPages.Razor.Configuration.HostSection kann nicht in [B]System.Web.WebPages.Razor.Configuration.HostSection umgewandelt werden. Der Typ “A” stammt von der “System.Web.WebPages.Razor, Version=2.0.0.0

Die Ursache des Problems besteht darin, dass bei der Aktualisierung der Help Pages auch die Version 3 (vormals Version 2) der Razor-Engine installiert wird.
Nun existieren 2 Razor-Engine-Versionen im Web-Projekt.

Grund

Da nur die web.config der Help-Pages auf die neue Version der Razor-Engine angepasst wird und nicht jene der Web-Anwendung, führt dies zu Konflikten, sobald die Razor-Views durch den Web-Server erstellt werden.

Fix

Folgende Anpassung müssen in der web.config aktualisieren, sodass anwendungsweit Razor 3.0 verwendet wird und der Fehler behoben wird.

1. In der sectionGroup für Razor muss die Version 3.0.0.0 für Razor eingetragen werden.
2. Die Version der RazorHostFactory muss auf Version 5.0.0.0 gesetzt werden.

Aktualisierung der web.config bei Update der Razor Engine

Nach den Anpassungen sollte alles wieder funktionieren.

Wenn ihr weitere Probleme ferststellt, würde ich mich freuen davon zu hören. Auch über Vorschläge wie solche Konfigurationkonflikte vermieden werden können, sind sehr willkommen.

Beste Grüße aus Leipzig
Gregor

TeamCity meets HTTP-Proxy

Infrastructure

Wir als kleines Entwicklerteam, sind neben unserem Tagesgeschäft bestrebt die Infrastruktur unserer Anwendungsentwicklung zu verbessern.
Derzeit versuchen wir uns an Continuous Integration und wollen mittelfristig auch unser Deployment automatisieren.
Um diesem Ziel näher zu kommen setzen wir TeamCity ein (derzeit in der Version 7.1.5).

Unser Problem

In unserem Unternehmensnetzwerk werden Proxy-Server eingesetzt. Diese sind bei unserem Vorhaben hinderlich, sobald wir in einem Build mit TeamCity auf NuGet-Package-Restore zurückgreifen möchten.
Kurz: Die notwendigen Pakete und ihre Abhängigkeiten können nicht aus dem Internet geladen werden.

Unsere Lösung – Proxykonfiguration von TeamCity

Die Proxykonfiguration kann mit der Systemvariablen TEAMCITY_SERVER_OPTS vorgenommen werden:

TeamCity Server OPTS

In den Wert der Variablen können die http-,https-Proxy-Server, sowie die Adressen angegeben werden für die die Proxies umgangen werden sollen.

-Dhttp.proxyHost=<HTTP_PROXY>
-Dhttp.proxyPort=<HTTP_PROXY_PORT>
-Dhttps.proxyHost=<HTTPS_PROXY>
-Dhttps.proxyPort=<HTTPS_PROXY_PORT>
-Dhttp.nonProxyHosts="localhost|127.0.0.1|<OTHER>"
-Dhttps.nonProxyHosts="localhost|127.0.0.1|<OTHER>"

Die -Dhttp.nonProxyHosts sind nützlich, wenn durch TeamCity Git-Repositories aus dem lokalen Netz geladen werden sollen. In unserem Fall teilen sich die Git-Repositories und der TeamCity-Server auf der selben Serverumgebung.
Hinweis: Wenn ihr eine Version kleiner 7.1.5 verwendet, kann es dennoch zu Fehlern kommen, da das Git-Plugin von TeamCity frühre die -Dhttp.nonProxyHosts ignorierte. So kam es beim Abruf eines Repositories zu Verbindungs fehlern.
Hier findet ihr das aktualisierte Git-Plugin, dass -Dhttp.nonProxyHosts einbezieht:
http://youtrack.jetbrains.com/issueMobile/TW-23630

Nachdem alles eingestellt wurde, können NuGet-Pakete über das Internet geladen und in den Build integriert werden.

NuGet-Package-Restore serverseitig aktivieren

Damit das NuGet-Package-Restore auf unserem TeamCity-Server läuft, haben wir eine weitere Systemvariable deklariert, da TeamCity sonst einen Fehler ausgab, der darauf hinweist, dass NuGet-Package-Restore aktiviert werden soll.

enable nuget package restore

Fazit

Zwei Einstellungen sind nötig, damit TeamCity hinter Http-Proxy-Servern funktioniert. Da die Recherche etwas aufwendig war, denke  ich, dass dieser Artikel eine gute Zusammenfassung für alle liefert, die ein ähnliches Setup realisieren möchten.

Beste Grüße
Gregor

Meine täglichen Aufräumarbeiten

Refactoring

Für meine Projekte nutze ich NHibernate, um Daten in eine Datenbank zu persisitieren. Für Datenbankoperationen mit diesem Framework (also Save, Update, Delete) werden Transaktionen ausgeführt. Darum wird im Quellcode für jede dieser Aktionen ein Transaktions-Scope erstellt.
[gist id=5570591]

Bei dieser Implementierung stört mich die sich wiederholende Verwendung des using-Statements (siehe Zeilen 12-16 & 21-25), um eine Transaktion zu initialisieren.
? In meinen Augen ist das Code-Smell.
Darum habe ich mich dazu entschlossen diesen Aspekt in eine Methode auszulagern, der ich die Bezeichnung Commit gegeben habe. Sie übernimmt eine Datenbankoperation und führt diese innerhalb der Transaktion aus.
[gist id=5553681]

Die auszuführende Datenbankoperation kann als Lambda-Audruck an die Methode Commit übergeben werden (siehe Zeile 12ff).

Meiner Meinung nach wird der Quellcode dadurch kürzer, lesbarer und verständlicher, weil die Verwendung/Bezeichnung der Methode Commit deutlich macht, dass eine Transaktion verpflichtend ausgeführt wird.

Es freut mich, wenn euch dieser Code-Schnipsel weiterhilft.
Lasst mich wissen, wenn ich etwas verbessern kann.

Viele Grüße aus Leipzig
Gregor

Mein neues Buch ist da!

wp8-dpunkt-buch-cover
Entwurf und Design von Helmut Kraus (www.exclam.de)

Es ist soweit.- Mein nun mehr zweites Buch ist beim dpunkt.verlag erschienen. Der genaue Name unseres neuen Werks lautet Windows Phone 8 – Grundlagen und Praxis der App-Entwicklung.
An dieser Stelle möchte ich meinen Kollegen Ralf und Jörg für die Zusammenarbeit danken. Wir haben es erneut geschafft.

Was hat sich seit der letzten Auflage getan?

wp7.5 vs. wp8

Neben einem farbenfrohen und neu gestaltetem Cover sind augenscheinlich einige Seiten hinzugekommen. 😉

Hier die wichtigsten Neuerungen

NEU Lenses
Erweitert die Funktionen Eurer Kamera!

NEU Contact Store
Nutzt die API von Windows Phone, um Kontakte Eurer App zu verwalten!

NEU FileType- & URI-Associations
Programmiert Apps, um bestimmte Datei- und URI-Formate darzustellen und zu verarbeiten!

NEU Lockscreen & Tile-Templates
Bildet wichtige Neuigkeiten Eurer App auf dem Sperrbildschirm oder der Kachel eurer App ab!

NEU Verwendung von Sockets, Blootooth und NFC
Realisiert die Kommunikation mehrerer Geräte mithilfe aktueller Netwerktechnologien!

NEU Spieleentwicklung mit DirectX
XNA war ein Mal. Wir schauen nach vorn mit DirectX!

Beispiele aus dem Buch – Keine DVD mehr!

Um Produktionskosten zu sparen (selbstverständlich auch um die Umwelt zu schonen), haben wir entschlossen unsere Code-Beispiele nicht auf einer DVD zu liefern, sondern diese auf GitHub zu veröffentlichen:
GitHub WP8-Book Samples

Fragen & Feedback

Alle Leser und Interessierte sind eingeladen mir bei Fragen oder Anregungen via Xing oder Twitter eine Nachricht zu schicken.
Auch der Verlag nimmt euer Feedback unter http://dpunkt.de/buecher/4255/windows-phone-8.html direkt entgegen: Feedback senden!

Gerne könnt Ihr uns auch auf Amazon.de eure Meinung mitteilen, oder einen LIKE da lassen: Windows Phone 8 Grundlagen und Praxis der App-Entwicklung

Ich wünsche Allen viel Spaß beim Lesen, mit- und nachprogrammieren! 🙂

Cheers
Gregor

Option-Types & ASP.NET Web API

Vor einigen Tagen habe ich den Artikel A tale of nulls von Steffen Forkmann über die Behandlung von Null-Values gelesen.
So wurde ich auf die Option-Types aufmerksam, mit denen explizit das Verhalten einer Anwendung modelliert werden kann, wenn eine Methode eine leere Ergebnismenge (also null) zurückgibt.

Für erste  Tests habe ich auf GitHub ein Repository angelegt, um die Monad-Struktur auszuprobieren: GitHub http://goo.gl/Kvq00
In diesem Repository befindet sich im Verzeichnis WebApi.Example ein Anwendungsfall bei der Verwendung der ASP.NET Web-API.

Demo

Im folgenden sind zum Vergleich zwei Implementierungen einer Controller-Action zu sehen, die einen GET-Request entgegennehmen.

Es wird ein Kunde (customer) aus einem Repository geladen. Sollte kein Kunde mit der entsprechenden ID gefunden worden sein, wird ein HTTP-Error 404-Not Found erstellt.
Anderen Falls wird der Kunde an den Client zurückgegeben.

Ohne Option-Types

+Die Action ist schnell implementiert.
 Durch die Prüfung auf null entsteht Code-Smell.
Das durch die If-Abfrage entstehende Nesting macht den Code schlecht lesebar.
Es ist nötig eine zusätzliches Objekt vom Typ HttpResponseMessage  zu deklarieren, um diese, je nach Ergebnis der Abfrage, zu initialisieren.

Mit Option-Types

In diesem Fall liefert das Repository das Objekt Customer nicht direkt zurück, sondern als IOption<Customer>. Mithilfe der Erweiterungsmethode Match kann modelliert werden, was die Web-Api zurückgeben soll, wenn ein Kunde gefunden wurde und wie sie sich bei einer leeren Ergebnismenge verhalten soll.

+ Die explizite Prüfung auf null wird in der Controller-Action vermieden.
+ Der Null-Check kann also auch nicht vergessen werden.
+ Die Verarbeitung von Null-Werten ist explizit modelliert
+ Dadurch wird die Anwendung meiner Meinung nach robuster.
+ Außerdem wird der Quellcode der Controller-Action lesbarer.
Aufwendigere Implementierung
* Verständnis zu Option-Types muss vorhanden sein

Fazit

Ich bin ein absoluter Neuling, wenn es um Konzepte der funktionalen Programmiersprachen geht. Dennoch halte ich den Einsatz von Option-Types in Controller-Actions bisher für sehr elegant.

Diskussion

Wie ist eure Meinung zu meinem Vorgehen?
Setzt ihr ähnliche Muster bei der Entwicklung eurer Controller-Actions ein?

Über Fragen und Feedback freue ich mich.

Cheers
Gregor

Code Dokumentieren–automatische Nummerierung

In letzter Zeit dokumentiere ich oft Quellcode. Die Dokumentation ist an Entwickler adressiert, die sich schnell in das Projekt einarbeiten sollen.

Dabei hat es mich ungeheuer gestört, dass ich die Nummerierung des Quellcodes manuell machen musste. Das verdirbt mir den Spaß beim schreiben. Darum habe ich ein AutoIt-Skript geschrieben, mit dem ich bestimmte Fragmente in meinem Quellcode automatisch nummerieren kann.

Sprich  aus…

public static void TuWas()
{
// ich tue ja
}
wird…

01:  public static void TuWas()
02:  {
03:   // ich tue ja
04:  }


skizzierter Ablauf:

  1. Das Skript führt automatisch den HOTKEY STRG+C auf einen beliebig markierten Text aus
  2. Jede Zeile des Textes wird in der Form “01: nummeriert.
  3. Der bearbeitet Text wird in das ClipBoard (die Zwischenablage) kopiert
  4. mit STRG+V kann der nummerierte Text in ein beliebiges Textverarbeitungsprogramm eingefügt werden.

Dieses arbeitet autark, kann allerdings in Visual Studio 2010 integriert werden, um die Produktivität während des Dokumentierens zu steigern.

Zunächst kann das Skript mit dem Namen CodeToWord hier heruntergeladen werden.
Der Download enthält

  1. die Skriptdatei zum weiterentwickeln
  2. die kompilierte Executable für x64 und x86 Betriebssysteme zum ausprobieren

Integration in Visual Studio

  1. öffnen von Visual Studio (die Version ist egal)
  2. in der oberen horizontalen Navigation auf Extras –> Externe Tools klicken
    extras-externetools
  3. im Fenster Externe Tools auf “Hinzufügen” klicken und die Executable von  CodeToWord angeben, sowie einen Namen vergeben.
    codetowordhinzufügen
  4. Unter Extras sollte CodeToWord sichtbar sein.
    externes tool in vs
  5. Nun unter Extras auf Anpassen klicken.
    shortcut einfügen 1
  6. Im Anpassen– Fenster auf “Tastatur…” klicken
    shortcut einfügen 2
  7. Im Optionen…– Fenster in das obere Textfeld “Externer” eingeben.
    Die darunter liegende liste zeigt dann eine Liste an (“Extras.ExternerBefehl1”).
    Sofern dies das erste externes Tool ist –> ExternerBefehl1 auswählen und einen ShortCut zuweisen.
    Hier wurde ALT+C vergeben.
    -> Mit “OK” bestätigen.
    shortcut einfügen 3
  8. Unter Extras ürüfen, ob ShortCut vorhanden ist.
    shortcut einfügen 4
  9. Beliebigen Text in einer Quellcode- Datei markieren und ALT+C drücken.
    markcode and press alt c
  10. Ein Textverarbeitungsprogramm öffnen und Quelltext mit STRG+V einfügen.
    pastecode into word

Fertig!

Viel Spaß beim Dokumentieren wünscht
Gregor

Simon Sinek – “If you do not understand people, you do not understand business”

Heute gibt es ein Video auf Augen und Ohren. Der Speaker ist Simon Sinek.
Er erläutert in brillianter Weise verschiedene Arten der Beziehungen von uns Menschen untereinander.
Er macht deutlich wie wichtig Vertrauen in der Geschäftswelt ist.

Die, meiner Meingun nach, beste Stelle ist die These, dass jeder erst Erfüllung (engl. fulfillment) im eigenen Beruf findet, wenn man Kollegen und Kunden  unterstützen kann beziehungsweise das Vertrauen in die eigene Person stärken kann, wenn man etwas zurückgibt.

– Ich glaube, dass dieser Philosophie mehr Beachtung geschenkt werden sollte, um produktiver und ehrlicher miteinander zu arbeiten.

“We all should become givers!”

Screenshots als Fehlerbericht– Ok, wenn es sein muss…

Download zum Post: ScreenReporterSkript herunterladen

Fehlerbehebung in Wirksystemen ist eine heikle Sache. Schön ist es, wenn Störungen mit einem

Bug Tracking Software kommuniziert werden.

Diese Vorgehensweise wird meiner Erfahrung nach nicht überall praktiziert oder “gelebt”.

So kam die Anfrage auf mich zu, ob ich eine Anwendung zur Verfügung stellen kann, die den Bildschirm abfotografiert, und dazu den Namen des betroffenen Clients beinhaltet.

Mir widerstrebt der Gedanke dafür ein Projekt in Visual Studio anzulegen.
Anstatt dessen schreibe ich lieber einen 14 Zeiler (exklusive der Kommentare;) mit AutoIt.

Neuerdings können Skripts sowohl für x64, als auch für x86 kompiliert werden (das kann es schon lange geben,- mir ist es erst heute aufgefallen).

compile_a_autoit_script
Bild 1 Editieren, Starten oder Kompilieren eines AutoIt- Skriptes

Untenstehendes Skript bewirkt, die Einblendung des Computernamens im Tray, sowie das erstellen eines Screenshots, der auf dem Desktop gespeichert wird und zum versenden bereit liegt.

[Edit]
Untenstehender Code bewirkt lediglich die Aufnahme des aktiven Fensters.
Um den vollen Bildschirm aufzunehmen muss in Zeile 20 lediglich der Parameter $captureRegion entfernt werden.

[sourcecode language=”vb”]
#Include <ScreenCapture.au3>

;~ Definition des Hotkeys -> SHIFT + ALT + D
;~ Mit dem Auslösen des Hotkeys wird die Funktion "MakesScreenshot" ausgeführt
HotKeySet("+!d", "MakesScreenshot")

;~ Dauerschleife, damit Skript nicht beendet wird
While 1
Sleep(100)
WEnd

Func MakesScreenshot()
;~ Angabe, dass kompletter Bildschirm fotografiert werden soll
Dim $captureRegion = WinGetHandle("[ACTIVE]")
;~ Anzeige einer Trayinformation, die den Namen des betroffenen Clients beinhaltet
TrayTip("Client: " & @ComputerName, "Fehlerbild wurde erstellt", 20)
;~ kurze Pause, Screenshot erst nach der Einblendung des Trayfensters eingeblendet wird
Sleep(1000)
;~ Screenshot erzeugen und in einem beliebigen Verzeichnis speichern -> Hier auf den Desktop
_ScreenCapture_CaptureWnd(@DesktopDir & "report.bmp", $captureRegion)
EndFunc
[/sourcecode]


Listing 1 Skript zur Erstellung des Screenshots

Sobald das Skript mittels Run ausgeführt wird, kann mit SHIFT + ALT + D ein Screenshot erstellt werden, der wie folgt aussehen könnte:

report

Bild 2 Screenshot Beispiel