# Saturday, August 29, 2009

Eine Anwendung nur einmal öffnen

Gerade bin ich in Klaus’ Blog auf einen Post gestoßen, der mich etwas irritiert hat. Im deutschen stackoverflow.com tauchte die Frage auf, wie man eine Anwendung so gestalten kann, dass sie nur einmal gestartet werden darf. Dafür nimmt ja bekanntlich einen Mutex, da dieses Verriegelungsobjekt systemweite Gültigkeit hat und daher zwar nicht explizit für diesen Fall geschaffen wurde, sich aber am besten von allen Verriegelungsobjekten dafür eignet.

Klaus präsentiert jedoch einen Vorschlag, den er persönlich besser findet. Er ermittelt über die statische Methode Process.GetProcesses alle im System vorhandenen Prozesse und sucht dann den Prozess, der den Namen seiner Anwendung trägt. Warum er Mutexe meidet und lieber über alle Prozesse iteriert, sagt er leider nur in einem Kommentar:

Mit Kanonen auf Spatzen ist da noch untertrieben.[..]

Auf Peter Buchers Kommentar, man möge doch einen Mutex verwenden Antwortet Klaus:

Hallo Peter,
ich weiß dass viele den Mutex bemühen. Doch gerade die Verwendung eines Mutex, und er muss als System-Mutex registriert werden, verlangt einiges an Disziplin. Der Mutex muss sauber gegen Exceptions abgesichert werden, er muss auf alle Fälle freigegeben werden und der Benutzer muss über die nötigen Rechte verfügen.
Um all das zu umgehen, hab ich mir diese einfache "use and forget" Methode überlegt.

Allerdings ist es nicht die Vorgehensweise, einen Mutex zu verwenden (je nach verwendetem Konstruktor), sondern seine eigene, bei der der Benutzer über die nötigen Rechte verfügen muss.

Die Methode Process.GetProcesses erfordert vollen Systemzugriff, also muss die Anwendung in der Sicherheitsgruppe FullTrust ausgeführt werden.

Dass man sich bei Verriegelungsobjekten Gedanken darüber machen muss, wie man sie sauber freigibt, sollte in Zeiten des Multithreadings jedem Programmierer klar sein. Gegen Exceptions kann er über den globalen ExceptionHandler abgesichert werden, den ebenfalls jede Anwendung haben sollte, um Unhandled Exceptions protokollieren zu können. Bei einem sauberen Systemdesign ist der “Mit dem Kopf durch die Wand”-Methode von Klaus nicht unbedingt die einfachere Alternative.

In den letzten Jahren ist das Thema Sicherheit immer mehr in den Fokus gerückt. Microsoft versucht, die Programmierer von Windows-Software dazu zu bewegen, sich endlich an die Implementierungsvorschriften zu halten, damit es möglich werden kann, dass ein Windows-Benutzer nicht grundsätzlich Administrator sein muss, um seinen PC benutzen zu können. In diesen Zeiten kann ich den Hinweis von Klaus daher nicht unkommentiert stehen lassen, vor allem, da er nur einseitig eine Halbwahrheit beschreibt.

Saturday, August 29, 2009 9:33:00 AM (W. Europe Daylight Time, UTC+02:00) #  Comments [2] | Trackback
# Saturday, August 22, 2009

stackoverflow nun auch auf deutsch

Ja, es gibt eine deutsche Version von stackoverflow.com: codekicker.de

Laut der Seite selbst existiert codekicker.de seit circa einem Monat. Und ist im Grunde ein stackoverflow-Klon. Klaus findet es eine Bereicherung der deutschen .NET-Community, ich halte es eher für eine Separation, da alle Fragen von codekicker nur der deutschsprachigen, nicht jedoch der weltweiten .NET-Community zur Verfügung stehen. Und die Sprache der weltweiten Community ist nun einmal Englisch. Daher ist codekicker aus meiner Sicht überflüssig. Jedenfalls so lange, bis mir die Suchmaschine meines Vertrauens als Treffer einen Link zu codekicker präsentiert und keinen zu Stackoverflow.

Saturday, August 22, 2009 1:48:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Thursday, August 06, 2009

WaitOne(Int32) erzeugt MissingMethodException

Heute bin ich über ein Problem gestolpert, das mich etwas schockiert hat. Wir setzen NUnit in Verbindung mit CruiseControl für den Test eines Embedded Systems ein. Die NUnit-Test werden mit .NET 3.5 entwickelt. Um mit dem Device kommunizieren zu können, gibt es ein proprietäres Netzwerkprotokoll, für das wir eine .NET-API entwickelt haben. Diese API wird gegen .NET 2.0 und .NET CF 2.0 kompiliert.

In meiner letzten Erweiterung der API habe ich unter anderem eine Ressource mit einem Mutex verriegelt. Der anschließende Entwicklertest verlief unauffällig, sodass die neue API sozusagen “RTM” wurde und an den Testentwickler ging, der die neuen Tests gegen die API programmieren sollte. Dabei stolperte er relativ schnell über eine MissingMethodException. Interessant war, dass dies durch den Aufruf von Mutex.WaitOne(Int32) hervorgerufen wurde. Darauf konnte ich mir nun gar keine Reim machen, da diese Funktion so vertraut schien. Ist sie aber nicht.

Mutex.WaitOne(Int32) ist eine neue Überladung der Funktion WaitOne(). Bisher gab es diese ohne Parameter, WaitOne(), oder mit zweien, WaitOne(Int32, Boolean) und WaitOne(TimeSpan, Boolean). Die Überladungen WaitOne(Int32) und WaitOne(TimeSpan) sind erst mit dem Service Pack 1 für .NET 3.5 hinzugekommen. Prinzipiell sollten sie damit auch nur in.NET 3.5 verfügbar sein. In .NET 2.0 sind sie nun deshalb enthalten, weil die WaitHandle-Klasse im Namensraum System.Threading untergebracht ist, der in mscorlib enthalten ist. Diese Assembly liegt nur in der Version 2.0 vor. So lange also .NET 3.5 SP1 installiert ist, ist alles ok. Wenn nicht, ist das jedoch nicht so schön, da man während der Entwicklung den Fehler nicht bemerkt.

Hoffentlich ist das der einzige Fallstrick, der durch .NET 3.5 SP1 für .NET 2.0-Entwicklungen gelegt wurde. Oder kennt jemand andere?

Thursday, August 06, 2009 7:47:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Monday, July 20, 2009

Antwort auf die “Klage eines ungebackenen Entwicklers”

Ralf Westphal hat kürzlich einen Kommentar auf einen seiner dotnetpro-Artikel veröffentlich. Ich habe den Artikel noch nicht gelesen, allerdings möchte ich hier kurz Stellung zu dem Kommentar und Ralfs Antwort nehmen.

Ralf schreibt, dass er nicht verstehen kann, warum Betriebe Missstände in der Ausbildung, genauer der Berufsschule, nicht erkennen. Aus meiner Sicht liegt dies nicht nur darin begründet, dass in der Berufsschule keine “Experten” vorhanden sind. Dies wird sich wahrscheinlich von Schule zu Schule und auch von Lehrer zu Lehrer unterscheiden. Ich sehe das Problem viel mehr bei der Instanz, welche die Lehrpläne erstellt.

Ich erinnere mich daran, dass meine Berufsschullehrer immer sagten, die Schule habe auch eine allgemeinbildenden Lehrauftrag. Somit standen auch Sport, Religion oder Deutsch auf dem Plan. Im eigentlichen Lehrplan werden darüber hinaus ebenfalls Kenntnisse gefordert, die mit dem eigentlichen Beruf nichts zu tun haben. Wie man den Müll trennt, ist meines Erachtens nach nicht unbedingt ein Thema, was in einer Berufsausbildung thematisiert werden muss. Dies sollte eigentlich vom Elternhaus erledigt werden. In dieser Art sind einige Punkte im Lehrplan enthalten, die auf die (Berufs-)Schule “abgeschoben” wurden.

Dass die Ausbildungsbetriebe die Missstände nicht erkennen, möchte ich noch nicht einmal unterstellen. Ich sehe viel mehr eine Resignation in den Betrieben, da eine Einflussnahme nur sehr eingeschränkt möglich ist. Diese Einflussnahme wird dadurch erschwert, dass die Betriebe oftmals nur eine sehr geringe Anzahl Auszubildender in die Berufsschulen entsenden. Ich persönlich habe eine sehr gute betriebliche Ausbildung genossen, hatte einen sehr engagierten Ausbilder und auch einen Ausbildungsbetrieb, der immer wieder mit der lokalen IHK in Kontakt getreten ist, um auf grobe Missstände hinzuweisen. An den Ausbildungsinhalten selbst ist jedoch für einen mittelständischen Betrieb mit damals knapp 60 Mitarbeitern nichts zu ändern. Diese werden von den großen Betrieben, der Telekom und der Lufthansa, mit maßgeblich beeinflusst, wenn nicht gar diktiert. Und so richten sich hinderte Betriebe nach den Vorgaben einiger weniger. So lange dieser Missstand existiert, kann die betriebliche Ausbildung nicht das leisten, was man eigentlich von ihr erwarten sollte.

Natürlich steht es jedem Ausbildungsbetrieb frei, seine Azubis nicht in die Berufsschule zu entsenden, sondern sie selbst “vollständig” auszubilden. Aber oftmals bleiben dabei einige Themen aus der Strecke, die einen Großteil der Prüfung ausmachen, die weiterhin nur vor der IHK abgelegt werden kann. Welche kleine IT-Bude kann seine Azubis schon umfassend in die Warenwirtschaft einführen? Welcher Ausbilder ist in der Lage, seinen Schützlingen eine Mindestlagermenge oder eine chaotische Lagerung zu beschreiben? Welcher Betrieb hat überhaupt die Möglichkeit, einen Ausbilder so weit freizustellen, dass er den schulischen Part der Ausbildung übernehmen kann. Dies alles sind Probleme, die ein kleines oder mittelständisches Unternehmen an die Berufsschule binden, bei der sie ebenfalls nicht das Gewicht haben, eine “sinnvollere” Ausbildung einzufordern.

Monday, July 20, 2009 8:44:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [2] | Trackback
# Tuesday, June 23, 2009

Hanselminutes on stackoverflow.com

Well, I’m quite a bit behind, but I’m keeping up. I just listened to the two shows on Hanselminutes with the guys from stackoverflow.com (show 134, Scotts blog post for 134, and show 135 and the corresponding blog post). These shows were awesome. For me it was kind of kick in the butt not to read every piece of information I find about programming but to do at least anything. Besides that the way the topics were handled were awesome in these shows. I would appreciate getting more of those shows.

Tuesday, June 23, 2009 9:02:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Monday, June 22, 2009

Visual Studio 2008 stürzt nach Änderung des Fensterlayouts ab

Gerade bin ich über einen Fehler in VS 2008 gestolpert. Wenn man dort das Fensterlayout ändert, kann dies dazu führen, dass sich, um es mal positiv auszudrücken, die Laufzeit erheblich verkürzt. Durch Zufall bin ich über das Feature "Get help for this error" des ErrorReports darauf gestoßen, dass die Ursache die Änderung am Fensterlayout ist und es bereits einen Hotfix gibt:

Monday, June 22, 2009 12:23:23 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Wednesday, May 27, 2009

Stellungnahmen zur Internet-Zensur

Der deutsche Bundestag hat die Stellungnahmen verschiedener Organisationen und Verbände zur bereits vertraglich am Gesetz vorbei festgelegten Zensur des Internet veröffentlicht. Besonders hervorheben möchte ich hier einen Satz aus der Stellungnahme des BKAs:

In Dänemark und Norwegen wird die Einschätzung des Bundeskriminalamtes geteilt, dass
das World Wide Web den Einstieg für die Nutzung des Internet darstellt. [..]

Wednesday, May 27, 2009 6:08:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Monday, May 11, 2009

.NET Micro Framework wird Open Source

Es tickern seit einigen Tagen ein paar Gerüchte durch das Netz, dass Microsoft den Quellcode des .NET Micro Framework an die Community übergeben und sich selbst aus der Entwicklung zurückziehen will. Die entsprechenden Entwickler sollen in das Server and Tools Department übernommen werden, sofern sie nicht das Unternehmen komplett verlassen müssen.

Ich bin mir noch nicht vollkommen sicher, was ich von dieser Entwicklung zu halten habe. Ich habe bereits vor dem Erscheinen der Version 2.0 das Thema in der Firma angesprochen, da wir gerade daran waren, ein größeren Embedded-Projekt aufzulegen. Damals haben sich die Entscheidungsträger gegen das .NETMF entschieden, da es erst sehr kurz auf auf dem Markt ist und es sich somit auch nur um eine Modeerscheinung handeln kann. Wenn nun das Projekt in die OpenSource-Gemeinde übergeht, könnte für einige Firmen nun das Problem des fehlenden Herstellers (in rechtlicher wie technischer) Sicht ein Problem werden. Andererseits wird durch dieses Vorgehen das Framework wahrscheinlich schneller entwickelt und sich auch eher verbreiten. Dabei kann es jedoch passieren, dass sich die schnellere Entwicklung negativ auf das Produkt auswirkt.

Ich schätze, die Zeit wird zeigen, wie es weiter geht. Und solange die Zukunft des .NETMF nicht geklärt oder wenigsten klar abzusehen ist, ist jede Firma gut beraten, das Ganze mit Vorsicht zu genießen.

Semioffizielle Statements des .NETMF-Teams (dort wird auf nachfolgende offizielle Statements verwiesen, die jedoch noch nicht erschienen sind):

.NET MF moves to Developer Division
.NET Micro Framework evolution

Einige Reaktionen aus dem Netz:

Microsoft to turn .Net Micro Framework code, support over to the community

.NET Micro Framework Future (not a dead project!!)

.NET MF moves to Developer Division

Microsoft Will Open Up .NET Micro Framework Source Code

.NET Micro Framework könnte Open Source werden

Monday, May 11, 2009 6:35:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Thursday, May 07, 2009

Kleine, aber feine Einführung in Lambda-Expressions

Wolfgang Kluge hat eine sehr schöne Einführung in Lambda-Expressions in seinem Blog gehirnwindungen.de veröffentlicht. Die habe sogar ich als “immer noch” .NET 2.0-Entwickler auf Anhieb verstanden. Und es ist sogar im Gegensatz zu einigen Fachartikeln in verschiedenen einschlägigen Magazinen etwas hängen geblieben.

Thursday, May 07, 2009 7:12:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Tuesday, May 05, 2009

Das Copy-Paste-Syndrom

Bereits seit einiger Zeit beobachte ich, dass in verschiedenen Blogs zu einem gemeinsamen Thema einzelne Nachrichten in jedem Blog auftauchen. Prinzipiell ist das ja eine begrüßenswerte Sache, da sich die Nachrichten somit verbreiten. Nicht ganz so begrüßenswert finde ich es jedoch, wenn sich einige dieser “Themen-Blogs” zu Gemeinschaften vereinigt haben, bei der die RSS-Feeds der Einzelblogs zu einen “Themen-Feed” zusammengefasst werden. Dies ist zum Beispiel so bei itproblogs oder auch dotnetgermanbloggers, zwei dieser Themen-Blogs, die ich abonniert habe. Blogger, die ihren RSS-Feed in solche Themen-Feeds speisen, sollten, ginge es nach mir, erst mal im Themen-Feed nachschauen, ob eine Nachricht, die sie nun verbreiten wollen, nicht eventuell schon den Weg in den Feed gefunden hat. Somit ließe sich das vermeiden, was gerade kürzlich wieder mit Windows 7 aufgetreten ist. Eine kleine Auflistung:

itproblogs

24.04.2009 10:35 Uhr Dieters Forefront Blog - Windows 7 Release Candidate Zeitplan

25.04.2009 11:33 Uhr FAQ-O-MATIC - Windows 7: Der RC kommt! Nee – doch?!

24.04.2009 14:20 Uhr Volkan's Blog - Windows 7 Release Candidate kommt noch diesen Monat!

26.04.2009 10:58 Uhr Schweizer IT Professional und TechNet Blog - Windows 7 Release Candidate Verfugbarkeit

27.04.2009 12:14 Uhr .: Daniel Melanchthon :. - Windows 7 Release Candidate ab 30. April in TechNet und MSDN

27.04.2009 18:20 Uhr TechNet Team Blog Austria - Windows 7 Release Candidate Download im TechNet-Abo

30.04.2009 Blog für Microsoft Partner - Windows 7 RC, Windows Server 2008 SP2, Windows Vista SP2 sind fertig

30.04.2009 13:37 Uhr TechNet Team Blog Austria - All the boys love Windows 7 RC1…der Countdown läuft

30.04.2009 15:04 Uhr FAQ-O-MATICDer RC ist verfügbar für Abonnenten!

30.04.2009 08:14 Uhr Exchange, Security and Active Directory - Release Candidate für Windows 7 verfügbar

30.04.2009 15:34 Uhr SECURITY-BLOG.EU - Windows 7 und Windows 2008 R2 Release Candidates sind verfügbar

30.04.2009 15:46 Uhr Cluadmin.de - Windows 7 RC verfügbar

04.05.2009 16:42 Uhr Ralf Schnell's Blog zu Windows Server 2008, Virtualisierung, ITIL/MOF und HPC - Windows 7 und Windows Server 2008 R2: Release-Kandidat verfügbar!

05.05.2009 09:57 Uhr TechNet Team Blog Austria - Laden Sie Windows 7 Release Candidate herunter

05.05.2009 11:37 Uhr .: Daniel Melanchthon :. - Windows 7 Release Candidate zum Herunterladen freigegeben

dotnetgermanbloggers

27.04.2009 6:55 Uhr Christian Binder's Weblog - Windows 7 Release Candidate Update

27.04.2009 14:13 Uhr MSDN Österreich Blog - Windows 7 RC erscheint Anfang Mai

30.04.2009 15:38 Uhr Silverlight-City - Windows 7 in der letzen Aufwärmphase vor dem Start. Download für MSDN und TechNet verfügbar.

30.04.2009 19:20 Uhr Giza-Blog.de - Download: Windows 7 RC | Vista SP2 RTM

Das ist Blogspam! Das muss nun wirklich nicht sein. Bitte denkt auch einen Moment an Eure Leser. Sie werden es euch danken.

Tuesday, May 05, 2009 8:58:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback