Mister Goodcat

Peter's home of all things life

Wednesday, 7/23/2014 8:00 PM
by Peter Kuhn
0 Comments

A Semantic Version Provider

Wednesday, 7/23/2014 8:00 PM by Peter Kuhn | 0 Comments

I did some thinking recently on how team collaboration with different versioning strategies of components should look like, ideally, to cause as little friction as possible. Particularly, the use of technologies like NuGet to distribute components, and ways to integrate this with continuous builds, made it necessary to re-consider some details I had taken as a given before.

During a proof-of-concept phase for some workflow ideas I came to the conclusion that it would be necessary to have some sort of service that can provide version numbers on a "global" level (e.g. accessible to everyone, not only to your build system, but also individual developers). Naturally, I wanted it to follow a semantic versioning approach, something I've grown a fan of during the last years.

What started as a quick implementation of a sample service has now turned into a complete library for semantic version generation that can be used in arbitrary .NET projects. It's fully backed by unit and integration tests and should be production-ready (your mileage may vary). You can find it on GitHub. The repository also contains a Web API wrapper that exposes its features as a web service, with support for arbitrary numbers of projects, components and the like to version, through configuration.

Monday, 7/14/2014 11:00 AM
by Peter Kuhn
0 Comments

Dependency Injection: das große Bild

Monday, 7/14/2014 11:00 AM by Peter Kuhn | 0 Comments

Beim Thema Dependency Injection kann man leicht mal den Überblick verlieren, wenn man sich in größeren Projekten bewegt. Dabei meine ich diesmal nicht unbedingt die Abhängigkeiten selbst, sondern die Zuständigkeiten dafür, wer diese eigentlich verwaltet. In größeren Solutions existieren verschiedenste Projekte oft nebeneinander, von Webanwendungen über REST-APIs bis hin zu Clients, und alle scheinen unterschiedliche Mechanismen zu verwenden. Aber es gibt auch Lichtblicke. More...

Monday, 6/23/2014 7:00 AM
by Peter Kuhn
0 Comments

JavaScript: Kapselung und Vererbung (Teil 3)

Monday, 6/23/2014 7:00 AM by Peter Kuhn | 0 Comments

Die Art, wie ich in Teil 2 die Vererbungshierarchie über die Prototypenkette hergestellt habe, hat eine interessante Diskussion ausgelöst, da es dazu durchaus unterschiedliche Meinungen gibt. Es lohnt sich also, einen genaueren Blick auf die verschiedenen Möglichkeiten zu werfen. More...

Friday, 6/20/2014 5:00 AM
by Peter Kuhn
0 Comments

JavaScript: Kapselung und Vererbung (Teil 2)

Friday, 6/20/2014 5:00 AM by Peter Kuhn | 0 Comments

Mit den Grundlagen aus dem ersten Teil des Artikels können wir nun einen Blick auf die Möglichkeiten der Vererbung mittels des Prototypen-Mechanismus in JavaScript werfen. Lange Zeit habe ich diesen "irgendwie" genutzt, ohne aber die Funktionsweise vollständig zu verstehen. Es hat sich gelohnt, das nachzuholen. More...

Thursday, 6/19/2014 5:00 PM
by Peter Kuhn
0 Comments

JavaScript: Kapselung und Vererbung (Teil 1)

Thursday, 6/19/2014 5:00 PM by Peter Kuhn | 0 Comments

Eines der bisher weitgehend unverstandenen Details an JavaScript für mich war das Thema Kapselung und Vererbung. Um den gravierendsten Problemen zu entgehen, vermied ich schon lange Zeit globale Variablen und Funktionen, verstand aber die dazu genutzten Techniken nie wirklich: mal definierte ich innere Funktionen in Konstruktoren, mal gab ich anonyme Objekte mit Funktionen per Closures zurück, mal schraubte ich an der ominösen Prototype-Property herum, bis das Ergebnis meinen Vorstellungen entsprach. Es musste dringend Klärung her, was ich da eigentlich jahrelang wirklich getan hatte. More...

Thursday, 6/19/2014 3:00 PM
by Peter Kuhn
0 Comments

Ein (schmerzhaftes) Eingeständnis

Thursday, 6/19/2014 3:00 PM by Peter Kuhn | 0 Comments

Ganz im Gegenteil zu C# und ein paar anderen Sprachen, die mir ans Herz gewachsen sind, hege ich insgeheim eine tiefe Abneigung gegen JavaScript. Als ich darüber etwas genauer nachdachte, erstaunte mich diese Erkenntnis umso mehr; schließlich machte ich meine ersten Erfahrungen damit Mitte/Ende der Neunziger im Netscape Navigator, um hässliche Rollover-Effekte auf noch hässlicheren Webseiten einzubauen. Damit sollte ich mehr als genug Zeit gehabt haben, um mich im Lauf der Jahre irgendwie mit der Sprache anzufreunden. Warum also hat es nie geklappt, mit JavaScript warm zu werden? More...

Friday, 6/6/2014 6:00 AM
by Peter Kuhn
0 Comments

Binär oder Text - das ist hier die Frage

Friday, 6/6/2014 6:00 AM by Peter Kuhn | 0 Comments

Wenn man wissen möchte, ob eine Datei Text oder Binärdaten enthält, sieht man sich die Dateiendung an. Was aber, wenn es keine Dateiendung gibt oder man diese nicht kennt? Als Mensch hat man es einfach, weil unser Gehirn Erstaunliches leistet. Eine Entscheidung kostet nur einen kurzen Blick auf den Inhalt einer Datei, um erkennen zu können, ob er als Text Sinn ergibt oder aussieht wie ein Teller Spaghetti. Ein Computer hat es da schon deutlich schwerer, und mit ihm der Programmierer. Was tun? More...

Wednesday, 5/7/2014 5:00 AM
by Peter Kuhn
4 Comments

How Ninject inadvertently made the case for SOLID

Wednesday, 5/7/2014 5:00 AM by Peter Kuhn | 4 Comments

It's wonderful to use a robust, great, field-tested tool that simply works. Except when it doesn't.

A recent design change in some component I worked on involved switching the Ninject bindings for some type to request scope. The idea is to keep the same instance of a certain type around in a web application until the request is completed, thus creating a pseudo-singleton for as long as a request is processed. Ninject has a strategy to dispose instances when they are deactivated, meaning that when the request ends, the scoped binding would result in calls to IDispose.Dispose() when your bound type implements that interface. In my case, disposal of these instances was crucial, as they occupy valuable resources (connections to external systems). After the scope change however, I realized that my instances never were disposed and started investigation. More...

Tuesday, 4/29/2014 7:00 AM
by Peter Kuhn
0 Comments

Gedanken zum Thema Dependency Injection

Tuesday, 4/29/2014 7:00 AM by Peter Kuhn | 0 Comments

In den letzten Jahren hat sich auf breiter Fläche die Erkenntnis durchgesetzt, dass Entwurfsmuster wie Dependency Injection bzw. das allgemeine Prinzip Inversion of Control deutliche Vorteile in der Softwareentwicklung mit sich bringen. Verantwortlichkeiten von Typen werden klarer separiert, die Testbarkeit deutlich erhöht oder vereinfacht, und gleichzeitig sind die Abhängigkeiten zwischen Typen und Objekten durch dedizierte Komponenten an zentraler Stelle klar geregelt. Gleichzeitig sind sich viele Entwickler aber unsicher, ob ihre Verwendung dieser Prinzipien wirklich ideal ist, und nicht selten hat man irgendwie "ein mulmiges Gefühl" bei der Sache. In diesem Artikel möchte ich nicht die Vorteile oder Grundlagen von Dependency Injection erläutern - das ist an diversen anderen Stellen schon mehr als ausführlich geschehen. Stattdessen möchte ich ein paar der Bedenken und häufig wiederkehrende Fragen aufgreifen, die mir in den letzten Jahren immer wieder in Diskussionen begegnet sind. More...

Tuesday, 4/15/2014 8:00 AM
by Peter Kuhn
0 Comments

Reif für die Hängematte

Tuesday, 4/15/2014 8:00 AM by Peter Kuhn | 0 Comments

Letzte Woche sagte jemand in einem Gespräch ganz beiläufig zu mir, dass beim Programmieren nur 20% der Zeit auf das Tippen des tatsächlichen Quelltextes entfallen - den Rest verbrächte man mit Nachdenken. Die Aussage fand ich bemerkenswert, weil sie in meinen Augen zum einen sehr knapp eine der Hauptanforderungen an gute Softwareentwicklung ausdrückte, zum anderen aber die Andeutung einer besorgniserregenden Entwicklung gerade im agilen Umfeld mitschwang: eine dominanter werdende Subkultur des Zusammenhackens. More...