.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv August 2010

Du kommst hier nicht rein!

31.08.2010 22:39:43 | Andre Kraemer

Nutzer des IE 6 sehen sie im Internet immer häufiger: mehr oder weniger diskrete Hinweise, dass der genutzte Browser veraltet wäre und man doch bitte die aktuelle Version einspielen, oder aber einen alternativen Browser einsetzen solle.

Gegen solche Hinweise habe ich nichts einzuwenden. Schließlich ist der IE 6 nun wirklich kein aktueller Browser mehr und aufgrund seiner vielen bekannten Fehler bei der Darstellung von standardkonformen (X)HTML / CSS ist es für den Webdesigner nur unter großem Aufwand möglich, einen Internetauftritt so zu gestallten, dass er sowohl in standardkonformen Browsern und im IE 6 vernünftig aussieht. Außerdem sollte man auch die zum Teil recht eigenwillige Implementierung des DOMs und von JavaScript nicht vergessen, die den IE 6 auch für JavaScript Entwickler schnell zum Alptraum werden lassen.

Türsteher

Heute kam mir jedoch eine sehr restriktive Variante des bekannten “Rette deine Seele und nutze einen moderneren Browser” Hinweises unter: Und zwar wollte ich kurz einen Eintrag auf Jan Welkers Blog lesen, der meine Aufmerksamkeit erregt hatte. (Anmerkung: Ich schätze Jan wirklich sehr! Dieser Beitrag soll sich nicht persönlich gegen ihn richten!) Nach dem Öffnen des Beitrags im Browser bekam ich jedoch nicht die gewünschte Information zugesicht, sondern wurde automatisch auf eine Seite weitergeleitet, die mir freundlich erklärte, dass man meinen Browser nicht möge und ich doch bitte mit einem neueren oder anderen Browser wieder kommen soll. Ab diesem Augenblick war ich also ausgesperrt. Ausgesperrt, weil der Rechner an dem ich saß (es war nicht mein Rechner) von der dortigen IT Abteilung nur den IE 6 installiert bekommen hatte.

Nun wusste ich also endlich, wie sich meine Freunde vor 15 Jahren gefühlt haben müssen, als der Türsteher vor der Disco sagte “Du kommst hier nicht rein! Deine Klamotten gefallen mir nicht!”. Tja, damals lachte ich noch über die Jungs, die die Kleidung noch morgens von ihrer Mutter herausgelegt bekamen und mit diesem Outfit dann halt nicht in die Disco kamen. Heute war ich es jedoch, der im wahrsten Sinne des Wortes dumm aus der Wäsche guckte.

Gegenwind

Etwas missmutig über das gerade geschehene wechselte ich auf Twitter – wo ich im Übrigen nur einen Hinweis “your browser is outdated” erhielt – und fragte Jan, oder die Idee mit dem Aussperren wirklich für so gut hält.

Leider bekam ich bis jetzt noch keine Antwort Jan, dafür aber von anderen bekannten Gesicherten der Community, die zu meiner Verwunderung Jans Strategie vollstens unterstützten und zum Teil sogar das gleiche taten.

Grob zusammengefasst lauteten die Argumente:

  • Wenn mehr große Webseiten genauso agieren würden, wäre der IE 6 endlich weg
  • Der Aufwand für ein IE 6 konformes Layout ist im Vergleich zum Nutzen viel zu groß

Beide Argumente kann ich sehr gut nachvollziehen – und um eines ganz klar zu stellen: Ich bin kein Fan des IE 6. Auch mich hat er, wie wahrscheinlich die meisten Webentwickler bereits viel Zeit, Nerven und Haare (nein, Haare nicht: die waren schon vor dem IE 6 weg ;-) gekostet.

Wie denn sonst?

Trotzdem halte ich wenig vom aktiven Aussperren von interessierten Nutzern (m)einer Website. Für weitaus besser und vor allem anwenderfreundlicher halte ich es in den meisten Fällen, im Falle des IE 6 einen Hinweis einzublenden, dass der genutzte Browser nicht aktuell ist, was dazu führen könnte, dass sowohl Darstellungs-, als auch Funktionsfehler auftreten.

Über diesen Weg habe ich niemanden den Zugriff auf die von mir bereitgestellten Informationen verwehrt und Nutzer veralteter Browser trotzdem über mögliche Fehler auf der Seite, welche durch ihn verschuldet sind, informiert.

Wenn ich nämlich kurz überlege, warum jemand noch den IE 6 einsetzen könnte, dann fallen mir folgende Gründe ein:

  1. Geringe Computerkenntnisse:
    Der IE 6 war vorinstalliert und der Anwender ist sich entweder nicht bewusst, dass er updaten sollte, oder aber traut sich dies nicht zu.
  2. Falsche Informationen:
    Ein befreundeter “Computerspezialist” hat dem (laienhaften) Anwender erzählt, dass der IE 6 der schnellste Browser sei, weil er schon so alt ist und deshalb auf moderner Hardware besonders schnell läuft.
  3. Faulheit:
    Der Anwender weiss zwar, dass der IE 6 fehlerhaft ist, hat ihn aber aus dem selben Grund noch installiert, aus dem er auch keine regelmäßigen Backups macht und keinen bzw. keinen aktuellen Virenscanner hat.
  4. Gewohnheit:
    Der Anwender nutzt den IE 6 bereits seit Jahren, kommt gut mit ihm zurecht und will deshalb gar nicht updaten.
  5. Abhängigkeiten von alten, aber wichtigen Intranet Anwendungen:
    Der Anwender würde gerne updaten, kann es aber nicht, weil seine geschäftskritische Intranetanwendung nur vernünftig unter dem IE 6 läuft (ja, das soll es auch geben ;-)).
  6. Die IT-Abteilung:
    Der Anwender würde gerne upgraden, hat gar keine Rechte dies zu tun. Die IT-Abteilung hingegen weigert sich gegen das Update, weil sie dann vielleicht eine Liste unzähliger Intranetanwendungen auf Kompatibilität testen und den neueren IE direkt auf unmengen von Clients ausrollen müsste.

Wenn ich nun auf diese Liste Blicke frage ich mich, welche Kategorie ich wirklich von meinem Internetangebot ausschließen möchte. Drei und Vier wären vielleicht geeignete Kandidaten, der ganze Rest jedoch eigentlich nicht. Und selbst bei drei und vier frage ich mich, ob man hier nicht doch die Freiheit gewähren sollte mit einem Browser der Wahl zu arbeiten.

Wenn das Ergebnis dann anschließend nicht vernünftig aussieht: Selber schuld!

Mein Appell

Mein Aufruf an die Betreiber von Webangeboten lautet daher: Schließt keine interessierten Anwender aus! Informiert lieber dezent, dass der Browser und somit das Ergebnis nicht optimal ist, aber lasst IE 6 User nicht draußen warten!

Denn wenn wir tief in uns gehen und uns ehrlich fragen, ob durch das Aussperren des IE 6

  • die Welt besser wird?
  • das Web besser wird?
  • Der IE 6 schneller aussterben wird

dann müssen wir, oder zumindest ich diese Fragen wohl mit nein beantworten. Dies ist übrigens die gleiche Antwort, die man wahrscheinlich auf die Frage:

  • Wird der User den ich eben wegen seines Browsers ausgesperrt habe jemals wieder kommen?

In diesem Sinne: http://saveie6.com/ ;-)

Natürlich lasse ich mich aber auch gerne vom Gegenteil überzeugen. Sprich: Eure Meinung zu diesem Thema interessiert mich sehr.



blog.codemurai.de © André Krämer |Impressum | Abonieren

NRW Conf, Windows Phone 7, der Albert laesst die Korken knallen

31.08.2010 12:06:35 | Kay Giza

Am 10. September geht in Wuppertal wieder das Community-Event „NRW Conf“ über die Bühne, eine vom Verein „Just Community“ organisierte Veranstaltung für Software-Entwickler und IT-Pros, die seit 2005 im Jahresturnus stattfindet. Aufgeboten sind nach bisherigem Stand diesmal 24 Referenten mit Vorträgen zu aktuellen Developerthemen – darunter Cloud Computing, ASP.NET Controls, C# 4.0 oder Windows Phone. Auf der NRW Conf hat man nun auch die Möglichkeit, bereits existierende Windows Phone 7-Anwendungen (WP7), auf einem echten WP7-Gerät zu testen. Ermöglicht hat dies MVP Peter Nowak. Die Session hierzu... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Microsoft Deutschland sponsert erneut das deutsche INETA Speakers Bureau

31.08.2010 11:03:00 | Lars Keller

Das INETA Deutschland Speakers Bureau hat erneut eine Spende von Microsoft Deutschland erhalten! :-)

Nach nun über 3 Jahren (gegründet im April 2008) hat sich das Speakers Bureau etabliert. Als erster Sponsor war Microsoft Deutschland dabei, darum freut es mich unheimlich, dass wir zum dritten Mal Sponsoring von Microsoft Deutschland bekommen! Somit können wir auch weiterhin diesen Service für die INETA Deutschland User Groups aufrecht erhalten. Mittlerweile haben wir 63 mal Sprecher zu verschiedenen User Groups schicken können, auch die Sprecherliste ist auf 22 Sprecher angewachsen.

Da bleibt mir einfach nur DANKE für die Unterstützung zu sagen!

 

Wie du einen Sprecher für deine User Group anfordern kannst, steht hier.

Aktuelle Sprecherliste des INETA Deutschland Speaker Bureau:

 

Weitere deutsche Speakers gibt es auch im INETA Europe Speaker Bureau, welches von der INETA Europe verwaltet wird.

 

Das INETA Deutschland Speakers Bureau sucht noch weitere Sponsoren! Interesse? Dann schicken Sie mir gern eine E-Mail und wir sprechen über die Möglichkeiten: keller [at] ineta-germany [dot] org

Neues MSDN Access und Windows Phone 7 Forum

30.08.2010 12:05:56 | Kay Giza

In meinem Posting "Juli 2010: Microsoft MSDN Forum, TechNet Forum und Answers Forum Update und aktuelle Forenstruktur" hatte ich Anfang Juli auf die aktuelle Foren-Struktur aufmerksam gemacht und ein paar Hintergründe erklärt. Seit Freitag letzter Woche sowie heute hat das MSDN Forum Zuwachs bekommen. Neu sind die Foren Microsoft Access und Windows Phone 7. Mit diesem Posting möchte ich gerne die aktuelle Foren-Struktur (Stand 30.08.2010) für Microsoft Answers, TechNet und MSDN hier posten... [... mehr in diesem ausführlichen Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

LINQ ist eine Taube mit Kuckucksei

29.08.2010 14:25:03 | Jürgen Gutsch

Die erste See# Party ist für dieses Jahr vorbei und die Leser dieses Beitrages – welche die wunderbare Session von Rainer Stropek nicht gesehen haben – werden sich vielleicht wundern was das für ein blöder Titel ist ;-)

(“LINQ ist wie eine Taube…” und Extension Methods sind die “Kuckuckseier” die anderen Klassen untergejubelt werden können)

Wie habe ich die See# Party erlebt?

Es waren für uns drei Tage pure Action :-) Insgesamt gesehen hat es – trotz aller Pannen, die es aus meiner Sicht gab – dennoch irgendwie Spaß gemacht. Aber ich werde mich nicht nochmal überreden lassen eine eigene Session zu machen, wenn ich eine solche Veranstaltung organisiere. Mit dem Kopf bei der Veranstaltung, aber nicht bei der Session zu sein, ist sowohl anstrengend für die Besucher der Session, als auch für den Speaker…

Die Erfahrung war es allerdings absolut wert diese Veranstaltung zu machen. Den Spaß an der Sache hatte ich aber bei den Gesprächen mit den Teilnehmern und Speakern. Spaß macht es auch wenn hochkarätige Speaker wie Laurend Bugnion tatsächlich den Weg auf sich nehmen um auf der See# Party zu sprechen. Wenn Speaker aus der deutschsprachigen Community kommen um Vorträge zu halten. Und auch wenn neue Speaker die Möglichkeit nutzen, ihre erste Session auf einer Konferenz zu halten.

Spaß macht es auch, wenn man gerade zur rechten Zeit in eine Session kommt, in der Reiner Stropek LINQ zu einer Taube mit Kuckuckseiern macht. (@Rainer: ich finde den Vergleich sowohl absolut passend als lustig) Spass macht es auch, wenn Golo Roden die KeyNote zu ALT.NET genau so hält, wie man sie sich vorgestellt hat. (Es gab keine Absprache über das WIE, nur das Thema selber)

Bestätigt wird man auch, wenn Thomas Scheuermann trotz Sintflut in Nürnberg und überschwemmten Keller, die Reise auf sich nimmt um seine Session zu halten und anschließend wieder nach Hause fährt um den Keller wieder in Ordnung zu bringen. (@Thomas: vielen, vielen, vielen Dank dafür. Mehr weiß ich einfach nicht zu sagen *sprachlos*)

Leider habe ich nicht alle Sessions besuchen können... Aber dem Feedback nach, hätten sehr viele Leute gerne mehr als nur vier Sessions besucht. Auch das ist eine Bestätigung dass die Auswahl der Themen und der Sprecher tatsächlich gelungen ist. Auch das wurde mir immer wieder gesagt. Leider konnte ich auch keine der Sessions komplett besuchen, sondern bin mit meiner kleinen Kamera von einer Session zu anderen um noch ein paar Erinnerungen aufzufangen (Die Bilder werde ich in einer Wochen auf der Website publizieren)

#ssp2011?

Wie man aus dem obigen Text vielleicht lesen mag, geht der Trent zu einer See# Party 2011: Einer .NET Community Konferenz für den südlichen Raum der deutschsprachigen .NET Community (Süddeutschland, die Schweiz, Vorarlberg und Liechtenstein)

Darüber werde ich in den nächsten Tagen ausführlich nachdenken. Diese See# Party war durch die viel zu kurze Planungszeit enorm schwierig und chaotisch. Auch wurden unsere Erwartungen dadurch an manchen Stellen nicht komplett erfüllt. (Vor allem durch die viel kleiner Teilnehmerzahl wird es enorm schwierig sein die Kosten zu decken)

Es gibt auf jeden Fall eine große Liste mit Dingen die beim nächsten Mal besser gemacht werden können und müssen.

In acht Tagen werden wir uns wieder zusammensetzen und darüber reden, wie diese allererste See# Party war und wie es mit weiteren See# Partys weiter gehen könnte. Bis dahin bin ich auf einer Berghütte in der Schweiz, ohne Strom, ohne Internet und ohne Telefon. :-)

DotNetKicks-DE Image

Ist dasBlog - die ASP.NET Blog-Engine - tot?

29.08.2010 13:54:29 | Kay Giza

Mehr als 1825 Postings und 1195 Kommentare in jetzt fast 6 Jahren in diesem Blog, sind mit der Blogsoftware dasBlog entstanden. Hey, ich mag dasBlog, ernsthaft. Wenn man sich einige Tage lang mit dasBlog beschäftigt, es anpasst und einige unsinnige Performance-Bremsen entfernt, wenn man sich mit dem IIS auseinandersetzt, Kompression einschaltet und weite Performance-Tricks anwendet etc. läuft es auch wirklich gut. Ahh - und natürlich die Security beachtet, dann läuft's perfekt. Schade ist nur, dass dasBlog scheinbar tot ist. Die letzte Version von dasBlog 2.3 (2.3.9074.18820) ist vom 15. März 2009, was in der IT-Welt mehr als eine Ewigkeit ist. Jetzt könnte man sagen, hey - warum wechselst Du nicht? Erst einmal ist das hier keine Beschwerde. dasBlog ist Open Source, ein Community Projekt - da erlaube ich mir nicht mich zu beschweren... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

MSDN jetzt auch auf LinkedIn

27.08.2010 16:31:33 | Kay Giza

Networking mit anderen .NET-Entwicklern auf LinkedIn

Ein Hinweis in eigener Sache, auch weil viele Anfragen dazu in letzter Zeit mich erreicht haben: In Microsofts offiziellen
Community Guide findet man ja bereits viele Social Media-Angebote von Microsoft, seien es Portale, Blogs, Twitter, Facebook- oder Xing-Gruppen, Foren oder RSS-Feeds. Sollten Sie Mitglied im sozialen Netzwerk LinkedIn sein, möchte ich Sie herzlich einladen, unsere brandneue offizielle MSDN-Gruppe bei LinkedIn zu besuchen. Wir würden uns sehr über einen Austausch und Dialog dort mit Ihnen freuen!


Folgen Sie uns auf LinkedIn:

LinkedIn

Folgen Sie uns auf Twitter:
Follow MSDN_News on Twitter

Hier finden Sie weitere Social Media-Angebote von Microsoft.



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Entwickeln für Windows 7 – mit nur 3 Zeilen Code?

27.08.2010 13:49:38 | Oliver Scheer

Das geht? Na ja – es könnten schon mal 5 oder 10 Zeilen werden, aber 3 haben wir auch schon gesehen :-) Wie einfach man mit bzw. für Windows 7 Software entwickeln kann, zeigen eine Reihe von ausgewählten Artikel im Microsoft Developer Network (MSDN). Sie zeigen wie Sie mit wenig Aufwand (und wirklich fast ohne Code) nützliche „Windows 7“-Funktionen in Ihre Anwendungen einbauen können. Für alle vorgestellten Beispiele finden Sie in den Tutorials auch gleich lauffähige Projekte für Visual Studio 2010 zum Herunterladen, die Sie nur noch entpacken und aufrufen müssen:

Erste Schritte mit der WPF Ribbon in Visual Studio
Mit Microsoft Office 2007 wurde ein neues Konzept für die Steuerung von Anwendungen eingeführt. Das Ribbon ist ein „Gummi-Band“, in das sich die Funktionen einer Anwendung dynamisch einordnen lassen. Damit dient das Ribbon als eine Alternative zur herkömmlichen Menüleiste.

Erste Schritte mit der Startleiste
Die neue Startleiste in Windows 7 bringt sehr viele neue Funktionen mit sich. Früher verbarg sich auf dem Kontextmenü eines Symbols in der Startleiste ein schnörkelloses Kontextmenü. Mit Windows 7 hat man dieses vollständig renoviert und mit vielen neuen Funktionen versehen.

Multi-Touch mit Microsoft Surface Touch Toolkit
Das Microsoft Surface Toolkit for Windows Touch ermöglicht es WPF-Entwicklern, eigene Multi-Touch-Anwendungen zu erstellen, die genauso einfach entwickelt werden können wie „echte“ Surface-Anwendungen. Wichtig: Um das Toolkit verwenden und aktiv einsetzen zu können, benötigt man keinen Surface-Tisch!

Suchen im lokalen Netzwerk und auf dem lokalen Rechner
In Windows 7 befinden sich sehr mächtige und granular steuerbare Suchfunktionen. Das Einbinden dieser Funktionen in eigene Visual C#- oder Visual Basic-Anwendungen ist dank des Windows API Code Packs sehr einfach.

Energieeffiziente Anwendungen mit Windows 7 entwickeln
In Windows 7 wurden diverse Mechanismen für verbessertes Energiemanagement integriert. Über die Systemsteuerung kann der Benutzer sein persönliches Energieschema einstellen, das je nach Stromzufuhr (Batterie oder Netzteil) mehr oder weniger Ressourcen benötigt.

Weiterführende Informationen, wie Sie innovative Windows 7-Funktionen praktisch „out of the box“ in Ihre Anwendungen einbauen können, finden Sie in unserem MSDN Windows 7 Developer Center. Zahlreiche kostenfrei zugängliche deutschsprachige Webcasts und CodeClips finden Sie im MSDN Finder.

Silverlight Tipp der Woche: ConditionalConverter

26.08.2010 18:15:00 | Stefan Lange

In diesem Tipp geht es um das Umschalten zwischen einer Debug- und Release-Ansicht im XAML Designer.

Zusammenfassung

Während man im Code mit #if DEBUG zwischen Debug- und Release-Build unterscheiden kann, gibt es etwas Vergleichbares in XAML nicht. Mit Hilfe eines geeigneten Value Converters kann jedoch Abhilfe geschaffen werden.

Beschreibung

Mit dem #if pragma im Quellcode zwischen verschiedenen Builds zu unterscheiden hat wohl jeder Entwickler schon einmal gemacht. Diese Möglichkeit fehlt mir in XAML, da ich beispielsweise bei komplexeren Layouts während der Entwurfsphase gerne mal bestimmte Bereiche unterschiedlich einfärbe. So kann man viel besser erkennen, ob Margins, Paddings etc. stimmen. Ärgerlich dabei ist, dass man so ein buntes Layout zumindest nicht jedem Kunden zeigen kann und es schön wäre, dieses "Debug Layout" im Release-Build einfach abzuschalten zu können.

Natürlich kann man das mit etwas C#-Code einfach hinbekommen, aber eigentlich will ich die Unterschiede der Builds bereits im Designer sehen. Mit Hilfe des Value Converters ConditionalConverter kann man das erreichen. Das folgende XAML-Fragment zeigt exemplarisch ein Grid, welches im Debug-Build rot und im Release-Build blau ist. Natürlich auch zur Laufzeit, aber vor allem im XAML Designer. Durch den Wechsel des Builds in Visual Studio verändert sich die Anzeige des Designs entsprechend:

<Grid Background="{Binding Converter={StaticResource ConditionalConverter}, ConverterParameter='Red|Blue'}"/>

Der ConditionalConverter liefert je nach Build den ersten oder den zweiten Teil des Parameter-Strings zurück. Das funktioniert natürlich auch mit Zahlen, Texten, Margins etc. Zwar liefert der Converter immer nur Strings, aber diese werden beim Zuweisen an die Property von deren Type Converter entsprechend in den richtigen Typ umgewandelt. Wie das in XAML üblich ist.

Auffällig ist, dass das Binding keinen Path hat. Er wird jedoch auch nicht benötigt, denn das Ergebnis hängt nur von ConverterParameter ab. Die Implementierung ist relativ einfach:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  string result = null;
  if (parameter is string)
  {
    var param = ((string)parameter).Split('|');
 
#if DEBUG
    result = param[0];
#else
    if (param.Length >= 2)
      result = param[1];
#endif
  }
 
  // "x:Null" represents the markup extension "{x:Null}".
  if (result == "x:Null")
    result = null;
 
  return result;
}

Das Binding wird zur Designzeit allerdings nur dann ausgeführt, wenn die Property DataContext des Target Objekts und die Source-Property des Bindings nicht beide Null sind, denn in diesem Fall wird der Value Converter gar nicht erst aufgerufen. Sollte dies so sein, kann man die Source-Property im Binding einfach auf irgendeinen Wert setzen, denn da der Path nicht definiert ist, wird sie nicht verwendet. Sie darf nur nicht Null sein:

<Grid Background="{Binding Converter={StaticResource ConditionalConverter},
    Source=xyz,
    ConverterParameter='Red|Blue'}"/>

So ist Source nicht mehr Null und das Binding funktioniert.

Man muss noch beachten, mit dem ConditionalConverter keine Properties zu setzen, die eigentlich durch einen Style gesetzt werden sollten. Das Binding hat Vorrang und der Style kommt nicht zur Anwendung.

Eine weitere theoretische Möglichkeit wäre es, den ConditionalConverter in einem Style zu verwenden, z.B. so:

<Style TargetType="Border">
  <Setter Property="Background"
      Value="{Binding Source=_, ConverterParameter='#FF0000|#00FF00',
      Converter={StaticResource ConditionalConverter}}"/>
</Style>

Das funktioniert aber nicht. Während es in WPF durchaus üblich ist Bindings in Styles zu verwenden, ist diese Funktionalität in Silverlight leider noch nicht implementiert. (Genauer gesagt ist sie bisher nur im Designer implementiert. Das Binding im Style funktioniert bei Silverlight zur Designzeit; wenn man aber die Anwendung startet, gibt es eine Fehlermeldung.)

Expression Blend

In Blend funktioniert das Ganze im Prinzip genauso, allerdings muss hier beachtet werden, dass Blend aktuell ausschließlich Debug-Builds erzeugen kann. Wenn man also in Blend die Release-Ansicht betrachten möchte, muss man vorübergehend die Implementierung von ConditionalConverter ändern. Es reicht, einfach Underscore an #if DEBUG anzufügen und damit die Abfrage umzudrehen.

Code-Beispiel

Zum direkten Ausprobieren gibt es hier noch ein Beispiel: Die MainPage.xaml im Designer öffnen und dann zwischen Debug- und Release-Build hin- und herschalten. Vorher beide Builds einmal compilieren.

ConditionalConverter.zip (16 kB)

Hier geht's zum nächsten Tipp.

PC-Welt.tv: Frank Prengel ueber Windows Phone 7 (WP7)

26.08.2010 18:06:20 | Kay Giza

Einen kompakten Überblick über die Funktionen von Windows Phone 7 (WP7) liefert mein Kollege Frank Prengel in einem Video-Interview, das das Computer-Fachblatt PC-Welt Anfang August mit ihm geführt hat. Das Ergebnis lässt sich jetzt bei PC-Welt.tv in Augenschein nehmen: das Wichtigste über das neue Smartphone-Betriebssystem in zehn Minuten. Das Video und weiterführende Informationen finden Sie in diesem Blogeintrag auf Giza-Blog.de... [...mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Entwickeln fuer Windows 7 – mit nur 3 Zeilen Code?

26.08.2010 17:58:53 | Kay Giza

Das geht? Na ja – es könnten schon mal 5 oder 10 Zeilen werden, aber 3 haben wir auch schon gesehen :-) Wie einfach man mit bzw. für Windows 7 Software entwickeln kann, zeigen eine Reihe von ausgewählten Artikel im Microsoft Developer Network (MSDN). Sie zeigen wie Sie mit wenig Aufwand (und wirklich fast ohne Code) nützliche „Windows 7“-Funktionen in Ihre Anwendungen einbauen können. Für alle vorgestellten Beispiele finden Sie in den Tutorials auch gleich lauffähige Projekte für Visual Studio 2010 zum Herunterladen, die Sie nur noch entpacken und aufrufen müssen... [... mehr in diesem Blogartikel auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Nachlese zum Treffen der .NET Usergroup am 25.08.2010

26.08.2010 07:12:00 | Martin Hey

Beim gestrigen Treffen der .NET Usergroup Dresden hatten wir wieder zwei sehr unterschiedliche Themen und etwa 15 interessierte Teilnehmer.

Nachdem Robert beim letzten Treffen eine Einführung ins Buildmanagement mit TFS gegeben hat, führte er das Thema weiter fort, indem er auf unterschiedliche Branching- und Merging-Strategien einging und die daraus resultierenden Probleme und Möglichkeiten näher beleuchtete. Hier zeigte sich, dass schon viele eine Branching-Strategie verfolgen, die aber je nach Projekt und Kunde unterschiedlich sein kann, um auf die Anforderungen des Projektes passend zu sein. Allen Interessierten sei der Visual Studio TFS Branching Guide 2010 ans Herz gelegt, um sich etwas tiefer einzulesen.

Im Anschluss stellte ich die Basics der Windows Phone 7 Entwicklung vor. Dabei ging es einerseits darum, was Windows Phone 7 bietet und was man bei der Entwicklung beachten muss. Das Thema sorgte doch für eine sehr angeregte Diskussion. Ich denke, man hier thematisch anknüpfen kann und bei einem der nächsten Treffen etwas tiefer eintauchen kann.

Zusätzlich zu den Slides gibt es das Demoprojekt auch als Download.-->

Im Anschluss an die Usergroup konnte man dann bei einem Getränk in der Terrasse am Bischofsplatz noch fachsimpeln und den Abend ausklingen lassen.

Microsoft PHP driver for SQL Server 2.0

24.08.2010 14:33:00 | Andreas Mehl

 

Download:

MSDN download site

 

The major highlight of this release is the addition of the PDO_SQLSRV driver, which adds support for PHP Data Objects (PDO).

 

Comparison SQLSRV driver and PDO_SQLSRV driver:

SQLSRV driver:

<?php

  $serverName = "(local)\sqlexpress"; 
  $connectionOptions = array( "Database"=>"AdventureWorks" );

  /* Connect to SQL Server using Windows Authentication. */ 
  $conn = sqlsrv_connect( $serverName, $connectionOptions );

  /* Get products by querying against the product name.*/ 
  $tsql = "SELECT ProductID, Name, Color, Size, ListPrice FROM Production.Product";

  /* Execute the query. */ 
  $getProducts = sqlsrv_query( $conn, $tsql );

  /* Loop thru recordset and display each record. */ 
  while( $row = sqlsrv_fetch_array( $getProducts, SQLSRV_FETCH_ASSOC ) ) 
  { 
    print_r( $row ); 
  }

  /* Free the statement and connection resource. */
  sqlsrv_free_stmt( $getProducts );
  sqlsrv_close( $conn );

?>

PDO_SQLSRV driver:

<?php

  $serverName = "(local)\sqlexpress"; 

  /* Connect to SQL Server using Windows Authentication. */ 
  $conn = new PDO( “sqlsrv:server=$serverName;Database=AdventureWorks" );

  /* Get products by querying against the product name.*/ 
  $tsql = "SELECT ProductID, Name, Color, Size, ListPrice FROM Production.Product";

  /* Execute the query. */ 
  $getProducts = $conn->query( $tsql );

  /* Loop thru recordset and display each record. */ 
  while( $row = $getProducts->fetch( PDO::FETCH_ASSOC ) ) 
  { 
    print_r( $row ); 
  }

  /* Free the statement and connection resource. */
  $getProducts = NULL;
  $conn = NULL;

?>

Installation see Here

More Infos: Here

 

Mehrfachaktionen in kontextsensitiven Ribbons als Sandboxed Solution

23.08.2010 16:21:00 | Martin Hey

Sharepoint 2010 bietet einige spannende Möglichkeiten, die es so bisher nicht gab. Zum einen gibt es das Client Object Model, das es erlaubt, auf Clientseite auf das Objektmodell von SharePoint zuzugreifen. Zum anderen bietet es die Möglichkeit, sogenannte Sandboxed Solutions bereitzustellen, die zwar mit geringeren Rechten ausgestattet sind, aber dafür von einer breiteren Anwendergruppe installiert werden können.

In diesem Blogpost wird gezeigt wie man diese Features kombinieren und in einer Aufgabenliste die Mehrfachaktion "Alle Aufgaben erledigen" implementieren kann, die dann als Sandboxed Solution bereitgestellt wird. Eine kurze Einführung in das Thema Sandboxed Solutions gibt Thorsten Hans in seinem Blogpost und auch das MSDN Magazine wartet mit einem Artikel dazu auf.

Erster Schritt ist es, ein neues SharePoint-Projekt in Visual Studio anzulegen. Dazu verwende ich das Projekttemplate "Empty SharePoint Project". Die Auswahl der Programmiersprache ist in diesem Fall irrelevant, da alles über XML und JavaScript gelöst wird. Visual Studio legt daraufhin eine neue Solution an, die bereits ein Feature beinhaltet. Allerdings ist der Name des Features recht unaussagekräftig und sollte direkt angepasst werden. In meinem Beispiel soll es TaskBatchCompleteFeature heißen. Hinzu kommt noch ein neues Element, da die Anpassungen über die Elements.xml durchgeführt werden. Damit auch hier klar ist, was das Element macht, bekommt es den Namen TaskBatchCompleteElement. Da die Solution komplett aus Konfigurationsdateien besteht, ist es sinnvoll, in den Projekteigenschaften noch "Include Assembly In Package" auf false zu setzen. Die Visual Studio Solution sollte nun ungefähr so aussehen:


Die nächsten Anpassungen erfolgen in der Elements.xml. Hier ist die Konfiguration der Ribbon-Anpassung zu hinterlegen. In der CustomAction definiert man, dass diese Aktion nur auf Listen des Typs Aufgabe im Ribbon sehen möchte. Dafür sind die Attribute RegistrationType und RegistrationId zuständig, wobei die List Template Id 107 für Aufgabenliste steht.

Über den Tag CommandUIDefinition kann man nun einen Button hinzufügen. Eine Kurzzusammenfassung, welche XML-Fragmente notwendig sind, um welches Ergebnis zu erreichen findet man in folgendem Post. Kurz erklärt definiert die Location dabei, in welcher Ribbon-Gruppe der Button hinzugefügt werden soll. Die Standard-Ribbons werden über die Datei CMDUI.xml im Ordner 14\template\global\xml definiert. Möchte man bestehende Ribbon-Gruppen anpassen, so kann man die Namen in dieser Datei ermitteln und auch anhand der bestehenden Sequence-Ids die Reihenfolge-Einordnung für das neue Control in der Gruppe bestimmen.
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<CustomAction
Id="TaskBatchCompleteRibbonAction"
Location="CommandUI.Ribbon"
RegistrationType="List"
RegistrationId="107">
<CommandUIExtension>

<CommandUIDefinitions>
<CommandUIDefinition Location="Ribbon.ListItem.Manage.Controls._children">
<Button
Id="TaskBatchCompleteRibbonButton"
Alt="Aufgaben erledigen"
LabelText="Aufgaben erledigen"
Sequence="21"
Command="TaskBatchCompleteRibbonCommand"
Image32by32="_layouts/images/TaskDone.gif"
Image16by16="_layouts/images/TaskDone.gif"
TemplateAlias="o2"
/>
</CommandUIDefinition>
</CommandUIDefinitions>

<!--TODO: add CommandUIHandler-->
</CommandUIExtension>

<!--TODO: add ScriptLink-->
</CustomAction>
</Elements>
Da der Button nur dann aktiv sein soll, wenn mindestens ein Element gewählt wurde, wird ein CommandUIHandler hinzugefügt, der ein EnabledScript zugewiesen bekommt. Hier erfolgt die Prüfung auf die Anzahl der selektierten Elemente mit Hilfe der Funktion SP.ListOperation.Selection.getSelectedItems()
<CommandUIHandlers>
<CommandUIHandler
Command="TaskBatchCompleteRibbonCommand"
CommandAction="javascript:BatchCompleteTasks();"
EnabledScript="javascript:function isOneOrMoreEnabled() {
var items = SP.ListOperation.Selection.getSelectedItems();
var ci = CountDictionary(items);
return (ci > 0);
}
isOneOrMoreEnabled();" />
</CommandUIHandlers>
Als letzter Schritt wird nun noch die eigentliche Aktion benötigt. Diese wird in einer weiteren CustomAction hinterlegt. Die eigentliche Funktion ist recht simpel. Über die gleiche Methode wie eben werden die selektierten Elemente ermittelt und über die Kontextinformationen das zugehörige Web und die Liste geladen. Im Anschluss daran iteriert man durch die Elemente und setzt die Felder - bei einer Aufgabe sind das der Status und der Erledigungsgrad. Nachdem dies vorgenommen wurde, müssen die Daten noch zum Server übertragen werden. Dazu ruft man die Methode executeQueryAsync auf. Dieser übergibt man zwei Callbacks - in meinem Fall "success" und "failed", die dann noch eine Benachrichtigung für den Benutzer auslösen.
  <CustomAction Id="TaskBatchCompleteRibbonScriptAction"
Location ="ScriptLink"
ScriptBlock="
BatchCompleteTasks = function () {
var selectedItems = SP.ListOperation.Selection.getSelectedItems();
var currentListGuid = SP.ListOperation.Selection.getSelectedList();

var context = SP.ClientContext.get_current();
var currentWeb = context.get_web();
var currentList = currentWeb.get_lists().getById(currentListGuid);

var k;
for (k in selectedItems) {
var listitem = currentList.getItemById(selectedItems[k].id);
listitem.set_item('Status', 'Completed')
listitem.set_item('PercentComplete', '1')
listitem.update();
context.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed))
}

}


function success() {
SP.UI.Notify.addNotification('Aufgabe erfolgreich abgeschlossen');
}

function failed(sender, args) {
var statusId = SP.UI.Status.addStatus(args.get_message());
SP.UI.Status.setStatusPriColor(statusId, 'red');
latestId = statusId;
}"
/>
Damit ist die Arbeit im Grunde auch schon getan. Nach einem Klick auf "Package" erscheint im Ausgabepfad eine wsp-Datei.

Sandboxed Solutions benötigen keine Farmadministratorrechte, um installiert zu werden. Aus diesem Grund erfolgt die Installation auch nicht in der Central Adminsitration sondern in der Solution Gallery der Site. Nachdem man die WSP-Datei hierher hochgeladen und die Solution aktiviert hat, steht das neue Feature in der Oberfläche zur Verfügung.

msdn tv–Nachrichten für Entwickler (Ausgabe 13/2010)

20.08.2010 11:03:56 | Jan Schenk

Get Microsoft Silverlight

Letzte Ausgabe von „msdn tv“ vor der Sommerpause - heute mit Studiogast Prof. Dr. Saug sowie Anne, Cortessa, Jessica, Jan und Max, aber ohne den nötigen Ernst.
Statt der üblichen Bits und Bytes erwarten Sie diesmal Prosecco, Sandkuchen und angeregte Gespräche mit einem ganzen Feuerwerk an Themen - in 16:40 Minuten geht’s ohne Sinn und VerstandPunkt und Komma rund um den Microsoft Software Strategy Summit im Oktober in Köln, rote Teppiche, den Keynote-Speaker Steve Ballmer, einen Visual Studio Werbeclip, um Möpsebegehbare Kleiderschränke, Windows Phone 7, Interface Design, Silverlight, XNA, Mobile Gaming, den Windows Marketplace for Mobile, Windows Phone Developer Tools, Tipps zur App-Entwicklung im Weblog von Oliver Scheer und im neuen MSDN Windows Phone Developer Center, um Styleguides für Windows Phone-Entwickler, Xbox Live Avatare, Zune, Windows Azure, steigende Akzeptanz von Cloud Services bei Unternehmen, virtuelle Shopping-Trips, Fitness-Studio, die Xbox-Bewegungssteuerung Kinect, Malibu-Strände, dem tierischen Kinectimals-Game mit Tigern und Möpsen, um Windows Live Skydrive mit 25 Gigabyte kostenlosem Speicherplatz auf Ihrer Online-Festplatte, um häufigen Datenaustausch mit wechselnden Partnern, Schuhkauf, Messenger sowie Anziehtipps. Und um Möpse. Ende der Durchsage.

Anmerkung der Redaktion: alle Darsteller sind voll zurechnungsfähigvolljährig und erhalten im Rahmen des Projekts „Betreutes Arbeiten“ regelmäßige Zuwendungen von Microsoft Deutschland.

 

msdn tv ist ein neues Video-Nachrichtenformat, und hat seinen Ursprung auf MSDN Online (http://www.msdn-online.de/msdntv/). Alle zwei Wochen präsentiert Ihnen Jan Schenk, Developer Evangelist mit Hut, die wichtigsten Neuigkeiten für Entwickler, Hintergrundberichte und Interviews zu aktuellen Technologien sowie Highlights von Messen und Konferenzen. Das ganze kompakt, in ca. 15 Minuten erfrischend jung verpackt , und sowohl als Download für Ihren Rechner oder im Online-Player per Streaming verfügbar.

msdn tv is a German-speaking new and innovative video news series, and has originally been featured exclusively on the German MSDN Online Platform (http://www.msdn-online.de/msdntv/). Hatted Developer Evangelist Jan Schenk biweekly presents latest news for developers, background-stories and interviews concerning current and upcoming technologies, as well as video-highlights from fairs and conferences. Packed into 15 minutes, these news videos feature a fresh informative style, and are downloadable as well as available as online streaming video.

See# Party - Die Community Konferenz am Bodensee

19.08.2010 16:07:00 | Peter Bucher

Jürgen Gutsch und ich haben bekanntlich ja den grenzübergreifenden (CH / DE) .NET Stammtisch Konstanz-Kreuzlingen gegründet.
Ich bin leider nicht mehr dort lokalisiert aber natürlich immer noch sehr daran interessiert, das es gut läuft.

Das neue Team rund um Jürgen Gutsch und Tilo Schinke hat eine riesen Arbeit geleistet und stellte in kurzer Zeit eine Konferenz in Kreuzlingen (CH) auf die Beine.
Dabei sind sehr viele bekannte Sprecher, wie beispielsweise Stefan Lieser, Albert Weinert, Ken Cascada uvm, die sehr interessante Vorträge halten werden.

Offizielle Ankündigung:

Der .NET-Stammtisch Konstanz-Kreuzlingen veranstaltet am 28.08.2010 die .NET-Community Konferenz  See# Party in Kreuzlingen am Bodensee. Eine Konferenz von und für die .NET Community und interessierte in der Schweiz und Deutschland.

Diese Konferenz bietet den Teilnehmern viele interessante Vorträge aus dem .NET Umfeld, vorgetragen von Entwicklern aus der .NET-Community.

Die Anmeldung für bis zu 250 Teilnehmer startet in Kürze

Ziel ist es am Bodensee, für die Schweiz und Deutschland, eine Konferenz von und für die .NET Community und interessierte zu Veranstalten.

Die See# Party soll auch eine günstige und nahe alternative zu den großen Konferenzen darstellen.

Es würde mich freuen, euch dort zu sehen! :-)

Best Practices: Fehlerbehandlung

19.08.2010 03:42:00 | Jürgen Gutsch

In der Vergangenheit habe ich in vielen Projekten, vielen Anwendungen und auch hier im Forum immer wieder die gleichen Fehler bei der Fehlerbehandlung gesehen, was mich dazu veranlasst diesen Beitrag hier zu schreiben.

Im Grunde ist es immer folgender Fehler der beim Try&Catch gemacht wird:

try
{
    [do some errors]
}
Catch (Exception ex)
{
    log.Error(“Meine super duper Fehlermeldung”);
    throw ex;
}

Das ist dann keine Fehlerbehandlung, sondern eher Fehler verstecken!

Oftmals wird dieses Konstrukt (“Fehlerbehandlung” mochte ich es nicht nennen) in jeder Methode genutzt die aufgerufen wird. Das hat dann den Effekt, dass dieses Konstrukt logisch wie folgt verschachtelt wird:

try
{
    try
    {
        try
       {
            try
           {
                [do some errors]
          }
           Catch (Exception ex)
            {
                log.Error(“Meine erste super duper Fehlermeldung”);
                throw ex;
           }
       }
        Catch (Exception ex)
        {
            log.Error(“Meine zweite super duper Fehlermeldung”);
           throw ex;
       }
    }
    Catch (Exception ex)
    {
       log.Error(“Meine dritte super duper Fehlermeldung”);
        throw ex;
    }
}
Catch (Exception ex)
{
    log.Error(“Meine vierte super duper Fehlermeldung”);
    throw ex;
}

Oftmals wird wenigstens die aktuelle Exception dem Logger übergeben:

Catch (Exception ex)
{
    log.Error(“Meine vierte super duper Fehlermeldung”, ex);
    throw ex;
}

Aber auch das ist nur die halbe Miete.

Was soll da falsch sein ?

Schauen wir uns nochmal das erst Stück Code an. Angenommen es passiert ein Fehler und das Programm, springt in den Catch-Teil. Jetzt geht der Unsinn los:

  1. Es wird eine Unsinnige Fehlermeldung ausgegeben!
    Warum?
    Falls die Meldung noch relevant sein sollte, enthält sie keine weiteren Informationen zu der eigentlichen Exception. Im Normalfall wurde der Code allerdings im Laufe der projektphase immer wieder geändert, was zur Folge hat, das die Nachricht längst nicht mehr stimmt oder es gibt inzwischen mehrere mögliche Fehlerquellen.
  2. throw ex ist der nächste grobe Fehler: es wird zwar die selbe Exception noch einmal geworfen, mit der selben Fehlermeldung, allerdings wird der immens Wichtige StackTrace abgeschnitten (“breaking the stack”). Der StackTrace beginnt ab der Methode in der throw ex aufgerufen wird. Sollte der Fehler in einer aufgerufenen Komponente auftauchen, kann das nicht mehr ermittelt werden. Es wird immer so aussehen, als wäre der Fehler in der aktuelle Methode aufgetreten, und zwar genau dort, wo thro ex aufgerufen worden ist. Genauso wie der StackTrace geht auch die InnerEception verloren (Danke an Peter für den Hinweis.)
  3. Selbst wenn die Exception an den Logger übergeben wird ist die Fehlerbehandlung unvollständig, denn es wird nur ein unvollständiger StackTrace gelogt.

Im Falle der verschachtelten Try&Catches sieht das so aus, dass 1. keine relevanten Fehlerinformationen geloggt werden und 2. jedes Mal der StackTrace bei jedem Catch von neuem beginnt.

Diese Fehlerbehandlung ist somit keine, sondern eine Selbsttäuschung.

Das wird man spätestens dann merken, wenn man als Entwickler vom Support die Meldung über einen Fehler bekommt und dann das Log-File analysieren muss. Ich wette das viele Fehler nicht per Log-File gefunden werden können.

Was ist zu tun?

Im ersten Schritt sollten alle throw ex Aufrufe durch ein einfaches throw ersetzt werden. Das führt dazu, dass die aufgetretene Exception genau so wie sie ist, nach “oben” weitergeleitet wird. Dann sollte das Logging angepasst werden: Bei einem einfachen Try&Catch sollte das Logging – wenn möglich – so geändert werden, dass die Exception an den Logger übergeben wird (Die meisten Logger sollten das Unterstützen):

try
{
    [do some errors]
}
Catch (Exception ex)
{
    log.Error(ex);
    throw;
}

Im Fall der Verschachtelten Try&Catches wird nun noch an jeder Stelle in das Log geschrieben. Das ist nicht sinnvoll, das dadurch das Log sehr groß werden kann und die Informationen mehrfach im Log vorhanden sind. Es sollte also nur an einer Stelle geloggt werden und zwar am besten ganz oben, beim letzten Try&Catch.

In ASP.NET kann das sogar in der global.asax bei Application_Error gemacht werden.

Die verschachtelten TryCatches sehen dann logisch wie folgt aus:

try
{
    try
    {
        try
       {
           try
           {
                [do some errors]
           }
           Catch (Exception ex)
           {
                throw;
           }
        }
        Catch (Exception ex)
        {
           throw;
        }
    }
    Catch (Exception ex)
    {
        throw;
    }
}
Catch (Exception ex)
{
    log.Error(ex);
    HandleTheException();
}

Im letzten Catch wird dann die eigentliche Fehlerbehandlung gemacht: Es wird dem Benutzer eine sinnvolle Meldung ausgegeben (Nicht die Fehlermeldung, mit der kann der Benutzer nichts anfangen!)

Nach diesem Refactoring, sollte man sich  fragen welche Try&Catches dann noch Sinn machen, wen nichts anderes Passiert, als die Exceptions durchzureichen. Ich bin ganz sicher, dass man einige nun Entfernen könnte.

Generell sollte man nicht grundlos alle möglichen Fehler abfangen, sondern in erster Linie Fehler vermeiden. Natürlich gibt es Stellen, bei denen man Fehler nicht Verhindern kann, das ist immer dann der Fall, wenn man aus seiner Anwendung raus auf etwas zugreift: Datenbank und Dateizugriffe, Web- und Webservice-Zugriffe, COM, etc.

Auf diese Art hat man nun schon mal eine relativ saubere Fehlerbehandlung.

Aber es geht immer noch besser:

An Stellen, an denen mögliche Fehler nicht verhindert werden können, können diese abgefangen und mit einer eigenen Exception nach “oben” weitergeben werden. Die ursprüngliche Exception wird dabei als InnerException mitgegeben:

Catch (Exception ex)
{
    throw new MyVeryOwnHttpException(ex)
}

So kann man in der Darstellungsschicht individuell auf die Fehler reagieren und dem Benutzer einen entsprechenden Hinweis geben:

Catch (MyVeryOwnHttpException ex)
{
    log.Error(ex.InnerException);
    HandleTheVeryOwnHttpException(“Die Verbindung zum Server konnte nicht hergestellt werden.\n Bitte prüfen Sie ob Sie mit dem Internet Verbunden sind.\nUnd so weiter und so fort”, ex);
}

Man kann so spezielle Arten von Ausnahmen zusammenfassen und entsprechend drauf reagieren. Es ist dem Anwender in der Regel egal, was der genaue Fehler ist. Ob das jetzt ein Verbindungsfehler ist oder der Server einen Fehler zurückgibt ist egal. Wichtig ist, dass in diesem Fall die Anwendung nicht mit dem Server kommunizieren kann.

In der Log-File steht auf jeden Fall der konkrete Fehler mit dem kompletten StackTrace und die Fehlersuche wird dadurch wesentlich vereinfacht.

DotNetKicks-DE Image

Event Based Components

18.08.2010 15:22:00 | Jürgen Gutsch

In den vergangen Monaten habe ich einiges theoretisches über Event Based Components (kurz EBCs) gelesen. Das meiste von Ralf Westphal, in seinem Blog oder aus seiner Feder in der dotnetpro. Auch Golo Roden schrieb in seinem Blog über das Thema.

Verwirrung

Angespornt durch die Beiträge habe ich in den letzten Wochen selber versucht EBCs zu schreiben und zu entwickeln und bin zuerst gescheitert. Sobald ich die ersten Komponenten geschrieben und “zusammengesteckt” hatte, verlor ich relativ schnell den Überblick über die Komponenten und deren Verbindungen.

Woran lag das?

Golo wies mich auf die fehlerhafte Benennung der Events in Ralf Westphals Beispielen hin, die entgegen dem .NET Framework mit dem Präfix “On” begannen.

Ich habe also von vorne begonnen und die Events wie im .NET-Framework üblich benannt.

Beispiel:

public event Action<Customer> EntitySaving (wird vor dem Speichern ausgelöst)
public event Action<Customer> EntitySaved (wird nach den Speichern ausgelöst)

Und siehe da: die Verwirrung war beseitigt :-)

Vorteile

Die Vorteile der EBCs sind klar und wurden in den oben genannten Beiträgen auch oft genug angesprochen. Die zwei größten Vorteile sind – aus meiner Sicht – zum einen die isolierte Testbarkeit der Komponenten und die flexible Möglichkeit die Komponenten zusammenzuführen.

Refactoring

In den letzten Wochen habe ich also meinen angehenden Lizenz-Manager, einem großen Refactoring unterzogen und auf EBCs umgebaut. Ich habe allerdings vorerst meine Service-Klassen nicht komplett auseinandergerissen. Also nicht fürs Speichern, Löschen und Lesen separate Komponenten gebaut (das wäre dann der nächste schritt), sondern es bei jeweils einer Komponente mit standardmäßig drei Input- und drei Output-Pins belassen. Ich habe lediglich die generische Validierung komplett entkoppelt und dafür eine weitere Komponente angelegt, die vor jedem Speichern “eingesteckt” werden kann.

Die vorhandenen Unit-Tests musste ich leicht anpassen. Die Tests für die Servies, die hauptsächlich die Validierung getestet haben konnte ich entfernen und in die Test für die Validator-Komponente aufnehmen. Die Tests sind alle kleiner geworden, da Abhängigkeiten gar nicht mehr berücksichtigt werden müssen, wenn sie nicht zusammengesteckt worden sind. Beispiel: Die Service-Methode zum Speichern, muss keine Validierung mehr testen. Und die Tests der Validierung ist unabhängig vom Speichervorgang.



[TestFixture]
[Category("GO.LicenceManager.Services.ModelValidator")]
public class Wenn_ein_Kunde_validiert_wird
{
    [Test]
    public void darf_der_Vorname_nicht_fehlen()
    {
        Customer customer = new Customer
                                {
                                    [….]
                                };

        IModelValidator<Customer> modelValidator = new ModelValidator<Customer>();
        Assert.Throws<PropertyNotSetException<Customer>>(
            () => modelValidator.Validate(customer),
            "'Name' must not be null or empty");
    }
}

public class ModelValidator<T> : IModelValidator<T> where T : IEntity
{
    public void Validate(T model)
    {
        Type type = typeof(T); 
        IEnumerable<PropertyInfo> propertyInfos = type
                .GetProperties(BindingFlags.Public | BindingFlags.Instance); 
        [….]
    }
}

public class CustomerService : ICustomerService
{
    private readonly ICustomerRepository _customerRepository; 
    public CustomerService(ICustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    } 
    public void Save(Customer customer)
    {
       OnEntitySaving(customer); 
       if(customer.Id==Guid.Empty)
       {
           customer.Id = Guid.NewGuid();
       } 
        _customerRepository.Save(customer);
    } 
    public event Action<Customer> EntitySaving;
    public void OnEntitySaving(Customer entity)
    {
        var entitySaving = EntitySaving;
        if (entitySaving != null)
        {
            entitySaving(entity);
        }
    }

    [….]
}

Zusammenstecken:

Customer customer = new Customer
                                    {
                                        [….]
                                    }; 
IModelValidator<Customer> validator = new ModelValidator<Customer>();
ICustomerService customerService = new CustomerService(customerRepository);
customerService.EntitySaving += validator.Validate; // <== zusammenstecken
customerService.Save(customer);

Die Tests hätten wir damit vereinfacht, die Komponenten müssen sich nicht mehr kennen und sind komplett entkoppelt. Die Komponenten müssen aber irgendwie und irgendwo zusammengeführt werden, um zu funktionieren.

Die Komponenten müssen “zusammensteckt” werden.

Dabei ist entweder Handarbeit und eine gute Dokumentation gefordert, oder man versucht das zu automatisieren. Ralf Westphal hat dafür einen EBC-Binder geschrieben, der allerdings nur funktioniert, wenn gewisse Konventionen eingehalten werden: Unter anderem müssen die Events eben mit dem Präfix “On” beginnen…

Ich werde hierfür wahrscheinlich eine Art Binding-Datei anlegen die im XML-Format nicht nur das Binding selber regelt, sondern dieses auch dokumentiert. Mal sehen, was sich so machen lässt :-)

Vorerst werde ich im Lizenz-Manager allerdings noch die Repositories und die verschiedenen Views implementieren müssen. Bis zur See# Party werde ich wohl aber nicht mehr dazu kommen…

DotNetKicks-DE Image

Verwirrung in VB.NET: ByRef und ByVal

16.08.2010 03:22:02 | Jürgen Gutsch

.NET unterscheidet zwischen Referenz-Typen und Wert-Typen. Was bei vielen Entwicklern, die das nicht wissen oder beachten, zu kleineren Verwirrungen führen kann.

Aber zuerst einmal die Definition:

Werte-Typen sind zum Beispiel System.Int32 und System.Boolean welche im .NET-Framework vordefiniert sind. Eigene Structs und Enums sind ebenfalls Wertetypen. Strukturen sind auch dann Werte-Typen, wenn sie selber Referenz-Typen beinhalten.

Referenz-Typen sind Objekte mit Klassen oder Interfaces deklariert werden.
Wichtig: Referenz-Typen halten immer nur einen Zeiger auf die eigentlichen Werte

Lektüre:
Referenz- und Wertetypen
Werttypen im allgemeinen Typsystem
Arbeiten mit .NET: Grundlagen: Wertetypen und Verweistypen
Referenz- und Wert-Typen: Was ist der Unterschied in .NET?

Da Referenz-Typen nur Zeiger sind, kommt es zur Verwirrung, wenn Referenz-Typen als Wert (VB.NET: ByVal) an Funktionen und Methoden übergeben werden. Da lediglich der Zeiger übergeben wird, kann das Objekt auch außerhalb er aufzurufenden Methode verändert werden. Das hat das gleiche Verhalten, wie bei Werte-Typen die als Referenz (VB.NET: ByRef; C# ref) übergeben werden.

Wieso die Verwirrung?

Da die Schlüsselworte ByRef und ByVal in VB.NET immer explizit angegeben werden müssen, werden sie natürlich auch immer genutzt, sind immer sichtbar. Man nutzt ByRef deshalb viel zu oft, ohne zu wissen, dass es oftmals gar nicht nötig ist.

In C# muss das Schlüsselwort ref dagegen nur angegeben werden, wenn wirklich etwas als Referenz übergeben werden muss. Das hat zur Folge, dass dieses Schlüsselwort nicht permanent sichtbar ist, man macht sich weniger Gedanken über die Art der zu übergebenden Parameter.

Also merken: In VB.NET kann ByVal eben auch ByRef sein, wenn es sich bei dem TypParameter um einen Referenz-Typ handelt! ;-)

DotNetKicks-DE Image

Silverlight Tipp der Woche: XAP-Dateien richtig cachen

15.08.2010 18:30:00 | Stefan Lange

In diesem Tipp geht es um das Caching von Silverlight XAP-Dateien durch den Browser oder einen Proxy-Server.

Zusammenfassung

Manchmal werden XAP-Dateien zu lange zwischengespeichert und der Anwender arbeitet mit einer älteren Version der Silverlight Anwendung, obwohl auf dem Server bereits eine neuere XAP-Datei vorliegt. Man kann dies verhindern, indem man an die URL der XAP-Datei einen kurzen Parameter anfügt, dessen Wert vom letzten Änderungsdatum der XAP-Datei abhängt.

Beschreibung

Normalerweise braucht man sich über das Caching der XAP-Dateien, in denen sich die gesamte Silverlight Anwendung befindet, keine Gedanken machen. Wenn jedoch beispielsweise ein Kunde in seinem Intranet einen ISA Server als Proxy verwendet, kann es passieren, dass der Kunde die vom Entwickler gerade frisch auf dem Server aktualisierte Silverlight Anwendung nicht verwenden kann, weil ihm sein Proxy-Server die zwischengespeicherte Vorgängerversion der XAP-Datei liefert.

Neu laden der Webseite im Browser bringt da leider gar nichts. Und das Unterdrücken des Cachings der Webseite, in der die Silverlight Anwendung eingebettet ist, hat natürlich auch keinen Erfolg, denn das Problem liegt im Caching der XAP-Datei auf dem Proxy-Server. Aus der Sicht eines Browsers oder Proxy-Servers ist eine XAP-Datei auch nur eine binäre Ressource wie beispielsweise eine PNG- oder JPEP-Datei. Daher wird sie genauso zwischengespeichert.

Im HTML-Element <object>, welches die Silverlight Anwendung beschreibt, gibt es einen Parameter, der die URL der XAP-Datei festlegt. Dieser sieht beispielsweise so aus:

<param name="source" value="ClientBin/MySilverlightApplication.xap"/>

Eine mögliche Lösung wäre die aktuelle Versionsnummer in den Dateinamen aufzunehmen:

<param name="source" value="ClientBin/MySilverlightApplication-1.2.3.xap"/>

Dies führt zu einer Aktualisierung des Caches, wenn eine neue Version eingespielt wird, da sich dabei die URL ändert. Es kann jedoch zu neuen Problemen kommen, wenn beispielsweise das <param> Element auf der Webseite nicht zum Namen der XAP-Datei auf dem Server passt.

Es ist daher besser, die Versionsnummer als Dummy-Parameter an die URL anzufügen und den eigentlichen Namen der XAP-Datei unverändert zu lassen:

<param name="source" value="ClientBin/MySilverlightApplication.xap?v=1.2.3"/>

Die Silverlight Runtime interessiert der Text rechts vom Fragezeichen nicht. Und bei einer neuen Versionsnummer ändert sich dennoch die URL, sodass der Proxy-Server die XAP-Datei neu vom Web-Server anfordert.

Der Nachteil liegt allerdings darin, dass die Versionsnummer serverseitig immer irgendwie bestimmt werden muss. Daher ist es einfacher, statt der Versionsnummer das letzte Schreibdatum der XAP-Datei als Parameter zu verwenden:

<param name="source" value="ClientBin/MySilverlightApplication.xap?x=2010-08-15_16:17:18"/>

Dieser Wert lässt sich serverseitig mit File.GetLastWriteTime praktisch ohne Overhead ermitteln. Wenn man nicht möchte, dass jeder dieses Datum sieht, kann man es beispielsweise auch einfach in eine Zahl umrechnen. Jetzt muss man nur noch das Caching der Webseite selbst verhindern:

<meta http-equiv="expires" content="0">

Damit haben wir erreicht, dass der Proxy-Server die XAP-Datei zwischenspeichert, solange sie sich nicht ändert, und neu anfordert, sobald sie auf dem Server ausgetauscht wurde.

Diese Methode funktioniert gut mit dem Internet Explorer und dem Firefox in Zusammenhang mit dem ISA Server. Andere Browser haben wir nicht ausreichend getestet. Bei anderen Browsern könnte es beispielsweise sein, dass das Fragezeichen in der URL das Caching im Browser verhindert und die XAP-Datei jetzt jedes Mal neu angefordert wird.

Hier geht's zum nächsten Tipp.

Keine Fotos bitte!

15.08.2010 09:06:00 | Martin Hey

Auch wenn der Titel dieses Posts darauf schließen lassen könnte, dass es dieses Mal um Klatsch zu Prominenten geht - das ist nicht der Fall. Vielmehr geht es um das seltsame Verhalten der Windows Phone 7 Beta im Umgang mit Choosern und Launchern.

Der Anwendungsfall ist schnell erklärt: Ausgelöst durch einen Klick auf einen Button soll ein Foto von der Kamera aufgenommen und dieses dann in einem Image auf der Page dargestellt werden. Hört sich nicht kompliziert an und war es auch in der CTP von Windows Phone 7 nicht. Mit der Beta hat sich an der API hier einiges zum Vorteil geändert - man kann jetzt einen Callback hinterlegen und muss nicht mehr Methoden der Basisklasse überschreiben. Lange Rede, kurzer Sinn - mein Code sieht nun wie folgt aus:
private void OnCaptureCamera_Click(object sender, RoutedEventArgs e)
{
CameraCaptureTask cameraCaptureTask = new CameraCaptureTask();
cameraCaptureTask.Completed += OnCameraCaptured;
cameraCaptureTask.Show();
}

void OnCameraCaptured(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
var source = new BitmapImage();
source.SetSource(e.ChosenPhoto);

image1.Source = source;
}
}

Der Effekt ist allerdings ernüchternd. Ein Klick auf den Button sorgt zwar dafür, dass sich die Kameraanwendung öffnet, diese wird allerdings nach kurzer Zeit schwarz. Durch Zoomen kann man erreichen, dass zeitweise doch etwas zu sehen ist und man den Auslöseknopf findet. Ist das erledigt, kommt die nächste Ernüchterung: Inzwischen hat sich die eigene Anwendung im Emulator beendet.
Nach einiger Recherche brachte mich ein Blogpost von Nick Randolph auf die richtige Spur, der auch die Ursachen beleuchtet. Es liegt gar nicht an meinem Code, sondern ganz einfach daran, dass es noch eine Beta ist und es hier sehr viele Umbauarbeiten im Vergleich zur CTP gegeben hat, die wohl noch nicht ganz abgeschlossen sind.
Es gibt einen Trick, mit dem man zumindest prüfen kann, ob der Code funktioniert - auch wenn er sehr umständlich ist. Dazu verschiebt man zunächst den CameraCaptureTask in eine Membervariable und setzt den Callback im Konstruktur der Seite. Die Anwendung wird sich beim Klick auf den Button noch immer beenden, aber wenn man direkt im Anschluss noch einmal auf F5 drückt, sieht man das Ergebnis des CameraCaptureTasks.
public MainPage()
{
InitializeComponent();
cameraCaptureTask.Completed += OnCameraCaptured;
}

CameraCaptureTask cameraCaptureTask = new CameraCaptureTask();

private void OnCaptureCamera_Click(object sender, RoutedEventArgs e)
{
cameraCaptureTask.Show();
}

void OnCameraCaptured(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
var source = new BitmapImage();
source.SetSource(e.ChosenPhoto);

image1.Source = source;
}
}

Ich gehe ganz stark davon aus, dass sich dieses Verhalten bis zum Release noch ändert und ein kleiner Absatz in den Release-Notes der Beta über dieses Problem hätte mich gefreut.

MultiBindings im Tooltip

13.08.2010 21:06:00 | Martin Hey

Um in WPF mehrere Werte der Datenquelle in einem Ziel zusammenzufassen, gibt es MultiBindings. Hier kann man auf ähnliche Weise wie in string.Format definieren, wie die Daten angezeigt werden sollen.

<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Name: {0}, {1}" >
<Binding Path="LastName"></Binding>
<Binding Path="FirstName">
</Binding>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Das gleiche kann man auch im Tooltip erreichen. Dafür gibt es einen kleinen Trick: Im Tooltip selbst können nicht nur Texte angezeigt werden, sondern auch Controls hinzugefügt werden. Für den Anwendungsfall bedeutet das, dass einfach in den Tooltip ein mit Multibinding versehener Textblock eingefügt wird.
<Image Width="180" Source="file:///C:/Temp/avatar.jpg">
<Image.ToolTip>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Name: {0}, {1}" >
<Binding Path="LastName"></Binding>
<Binding Path="FirstName">
</Binding>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Image.ToolTip>
</Image>

Exam 70-511: Windows Applications Development with Microsoft .NET Framework 4

13.08.2010 11:58:00 | Martin Hey

Heute war es mal wieder so weit und ich habe das Testing Center mit meiner Anwesenheit beehrt. Ich wollte herausfinden, ob ich den Anforderungen von Microsoft in Bezug auf den Themenkomplex WPF gerecht werden kann. Das Ergebnis: Passed.

Die Prüfung bestand aus insgesamt 40 Fragen rund um das Thema Anwendungsentwicklung mit WPF. Die Themengebiete waren:
  • Building a User Interface by Using Basic Techniques
  • Enhancing a User Interface by Using Advanced Techniques
  • Managing Data at the User Interface Layer
  • Enhancing the Functionality and Usability of a Solution
  • Stabilizing and Releasing a Solution
Um mal ein paar Vergleiche zur Prüfung .NET Framework 2.0 Windows Applications Development zu ziehen: Es kamen ebenfalls Fragen zu Basics wie Background Workern und Click Once Deployment dran, aber der Fokus hat sich (verständlicherweise) sehr Richtung XAML verschoben und so hat es mich nicht verwundert, dass ich aus einem Screenshot ableiten sollte, wie der zugehörige XAML-Code auszusehen hat oder erklären sollte wie man wann wohin welche Resourcen legt.
Alles in allem ist mein Fazit: Mit etwas Vorbereitung und Erfahrung im Bereich WPF durchaus machbar.

Tägliche Logs mit dem BlogEngine Logger erstellen

13.08.2010 08:00:42 | Klaus Bock

Schon seit einigen Versionen verfügt BlogEngine.NET eine eigentlich recht nützliche Erweiterung zum Protokollieren von aufgetretenen Fehlern. Die Erweiterung ist standardmäßig nicht aktiviert. Zu finden ist sie in den Einstellungen der Erweiterungen unter der lapidaren Bezeichnung Logger.

BlogEngine.NET Logger

Wenn die Erweiterung aktiviert wird, tut sie genau das was in der Beschreibung steht:
Wenn ein Log-Ereignis ausgelöst wird, schreibt die Erweiterung alles schön hintereinander in eine Datei.
Am Anfang mag das Ergebnis ja noch überschaubar sein. Aber spätestens nach ein oder zwei Wochen ist die Suche nach einem bestimmten Zeitraum oder Ereignis von heftigem Scrollen begleitet.
Mir persönlich würde eine log-Datei pro Tag am besten gefallen. Das ist schon übersichtlich und die Ereignisse können wesentlich leichter gefunden werden. Mit einer kleinen Anpassung ist dieses Verhalten auch leicht umzusetzen.
Der Code der Erweiterung befindet sich im Ordner App_Code\Extensions in der Datei Logger.cs.

private static string GetFileName()
{
    if (_FileName != null)
        return _FileName;


    string file = "errors-"
        + DateTime.Now.ToString(
            "dd-MM-yyyy",
            CultureInfo.InvariantCulture)
        + ".txt";
    _FileName = HostingEnvironment.MapPath(
        Path.Combine(
            BlogSettings.Instance.StorageLocation + "logs/",
            file));
    return _FileName;
}

Der Dateiname wird in der Methode GetFileName zusammengesetzt, Wenn in dieser Methode jetzt das Datum im Dateinamen verwendet wird, sollte es das auch schon gewesen sein. Dabei auch gleich den Pfad so geändert, dass die Log-Dateien in einem Unterverzeichnis logs des Ordners App_Data geschrieben werden.
Das Ergebnis sieht dann folgendermaßen aus.

BlogEngine ErrorLogs

Fazit:

Mit der Änderung einer Zeile Code lässt sich auch der Standard-Logger von Blogengine.NET dazu überreden, seine Log-Dateien benutzerfreundlich und organisiert zu erzeugen.

Blog-Parade: Gewinnspiel zur See# Party

12.08.2010 03:33:00 | Jürgen Gutsch

 

So langsam geht es bei der See# Party in die Endphase und wir haben tatsächlich noch ein paar freie Plätze, für die man sich noch unbedingt anmelden sollte, wenn man die tollen Themen nicht verpassen möchte (Das war ein Befehl, keine Bitte!). Um die Sache noch spannender zu machen haben wir uns entschlossen eine kleine Blog-Parade zu starten und hiermit auch eine Gewinnspielaktion und eine Blog-Parade anzukündigen.

Gewinnspielaktion

Wer sich am Mittwoch den 18. August 2010 ab 09:00 Uhr zur See# Party anmeldet, hat die Möglichkeit

  • eines von sechs See# Party T-Shirts und
  • einen freien Zugang zur See# Party zu gewinnen

Die ersten sechs Anmeldungen erhalten jeweils ein See# Party T-Shirt, wobei die erste Anmeldung zusätzlich den freien Zugang zur See# Party erhält.

Wer meint das sei es nicht wert, sollte die Agenda nochmal ganz genau studieren ;-)

Sobald die Gewinne vergeben sind, werden die Gewinner hier auf meinem Blog veröffentlicht und per E-Mail benachrichtigt.

Blog- und Twitter-Parade

Unter allen Bloggern und Twitterern, die sich auch zur See# Party anmelden verlosen wir zwei freie Zugänge zur See# Party unter allen anderen werden wir zwei See# Party T-Shirts verlosen.

Die beiden Paraden enden am Mittwoch den 18. August um 12:00 Uhr Mittags.

Die Gewinner werden per Zufallsgenerator ausgelost und hier auf meinem Blog veröffentlicht.

Blog-Parade:

Für die Blog-Parade ist nichts anderes zu tun, als auf die kommende See# Party (wenn möglich mit Banner) und diese Gewinnspielaktion hinzuweisen. Dafür kann der obige Text einfach kopiert und entsprechend angepasst werden.

Wie üblich müssen die Blog-Beiträge auch auf den ursprünglichen Beitrag (also hier her) verlinken.

Sollte aus irgendeinem Grund kein automatischer Link in den Kommentaren eingefügt werden, schreibt einfach selber einen Kommentar mit einem Link auf euren Beitrag rein, oder schickt mir eine kurze E-Mail mit dem Hinweis auf euren Artikel (in diesem Fall setze ich den Kommentar persönlich)

Twitter-Parade:

Wer nicht mehr als 140 Zeichen am Stück hinbekommt, kann auch gerne per Twitter an der Parade Teilnehmen. Dazu einfach folgenden Text kopieren und twittern:

Gewinnspiel zur See# Party: Sechs T-Shirts und ein freier Eintritt zu gewinnen: http://tinyurl.com/26rjesq #ssp2010 #parade

Erklärungen und Kleingedrucktes

  1. Teilnahmeberechtigt an der Verlosung und der Blog- und Twitter-Parade ist jeder, ausgenommen die Veranstalter der See# Party und deren Angehörige.
  2. Jeder Teilnehmer darf mehrmals teilnehmen. Die Chancen für die Verlosung erhöhen sich dadurch allerdings nicht.
  3. Alle Gewinner werden per E-Mail benachrichtigt.
  4. Die Zustellung des Gewinns der T-Shirts aus der Blog- und Twitter-Parade erfolgt auf dem Postweg auf eigene Gewähr. Eine korrekte Angabe der Adressdaten ist Voraussetzung für die korrekte Zustellung im Falle eines Gewinns.
  5. Die Zustellung der Gewinns der T-Shirts aus dem Gewinnspiel erfolgt persönlich beim Empfang der See# Party
  6. Die Gewinner erklären sich mit einer Veröffentlichung Ihrer Vornamen und des Anfangsbuchstabens des Nachnamens in diesem Blog einverstanden.
  7. Die Ausbezahlung der Preise in bar ist nicht möglich.
  8. Der Rechtsweg ist ausgeschlossen.
  9. Gewährleistungsansprüche hinsichtlich der Gewinne sind ausgeschlossen.

Ich wünsche allen Teilnehmern viel Spass und viel Glück, auf das man sich auf der See# Party trifft. :-)

DotNetKicks-DE Image

IronRuby beim .NET-Stammtisch Konstanz-Kreuzlingen

12.08.2010 01:32:04 | Jürgen Gutsch

Gestern fand das 19. Treffen des .NET-Stammtisch Konstanz-Kreuzlingen statt. Zu Gast war diesmal Thorsten Hans der IronRuby vorstellte, nach einer Einführung in die Sprache Ruby ging es auch schon los mit Demos zu .NET Programmierung mir IronRuby

Was mich persönlich erstaunt hat und womit ich eigentlich nicht gerechnet hatte ist, dass IronRuby nicht nur eine Spielerei von Microsoft Geeks ist, sondern tatsächlich in Business Anwendungen und Szenarien eingesetzt werden. Dadurch das IronRuby in herkömmlichen Anwendungen gehostet werden kann und im IronRuby das komplette .NET Framework zur Verfügung steht, ist es möglich die eigene Anwendung an bestimmten Stellen so flexibel zu halten, dass zur Laufzeit kundenspezifische Anpassungen durchgeführt werden können.

Thorsten zeigte dazu eine Demo, in der er die Validierung eines DTOs in ein IronRuby-Script auslagerte und so zur Laufzeit beliebig ändern könnte ohne das die Anwendung neu kompiliert werden muss.

Aber das ist nur eines der vielen möglichen Anwendungsgebiete von IronRuby.

Ich weiß auf jeden Fall, dass ich in nächster Zeit etwas damit herumspielen werden.

Im Namen aller Anwesenden bedanke ich mich hiermit nochmal bei Thorsten Hans für die sehr spannende Einführung in IronRuby. :-)

Eben habe ich gemerkt, das Thorsten mit einem Blog-Beitrag schneller war als ich: Siehe

Auch im Blog des .NET-Stammtisch wird es immer wieder Berichte zu den jeweiligen Treffen geben. Stefan Zybarth von der Combit wird sich hier austoben :-)

DotNetKicks-DE Image

Den DNK-Button im Blog/CMS einbinden

11.08.2010 23:07:57 | dotnet-kicks.de Blog

Es hat eigentlich viel zu lange gedauert, doch endlich haben wir eine Liste der uns zur Zeit bekannten Methoden und Plug-Ins zusammengestellt, wie ihr den “Kick-It”-Button automatisiert in euer Blog, CMS oder auch einfache html-Seiten einbinden könnt. Den Link zur Liste findet ihr auf unserer Seite http.//dotnet-kicks.de rechts oben oder einfach hier.

Mit dabei sind bekannte Vertreter wie die BlogEngine.NET, Wordpress, dasBlog, Blogspot von Google, SubText und andere. Auch diverse andere Programme oder Services wie Feedburner und der Windows Live Writer werden natürlich von uns versorgt. Wenn ihr noch ein weiteres Plug-In kennt oder für eine bestimmte Plattform noch eines vermisst dann setzt euch einfach mit uns per E-Mail oder Twitter in Verbindung (Jan Welker, Klaus Bock, Gordon Breuer). Wir würden eure Vorschläge und Anregungen gerne hören, natürlich auch zu anderen Bereichen! :-)

Verbesserte Audiotechnik bei mir im Hause

10.08.2010 22:55:32 | Albert Weinert

Ich habe ja heute meinen ersten offiziellen Screencast aufgenommen, zu Ehren der Erwerbs von diverser Hardware zur Ton-Aufzeichnung. Eine Anschaffung eines richtigen Mikrofons zur Aufnahme von Ton hatte ich schon lange vor, doch was kauft man, in was investiert man und man möchte vielleicht nicht soviel zum spielen ausgeben.

Da kam mir der Blog-Artikel von James Kovacs gerade recht in dem er beschreibt was er nutzt. Er nutzt das Audio-Technica AT2020. Dies gibt es hier in Deutschland für so um 99€. In Anlehnung seines Blogs mit Qualitätsvergleich mache ich dies nun auch. Von der Technik habe ich keine Ahnung, sie muss funktionieren. Technisches kann man bei James nachlesen.

Bestellung

Nun habe ich mich am Sonntag dann in den Online Musikladen meines Vertrauens gestürzt und ein wenig gestöbert was ich denn für mich so brauchen könnte. Da kam schon was zusammen, natürlich erstmal das Mikrofon. Dies gab es als USB und als XLR Ausführung. USB hätte den Vorteil ich kann es direkt am Rechner anschließen, der Nachteil ist ich kann es nur am Rechner anschließen. Dies ist etwas was ich nicht möchte da ich es auch woanders verwenden kann (ich denke da an Podcasts, Interviews, auch mal Unterwegs) und dann vielleicht zu eingeschränkt bin bei möglicher weiterer Hardware (z.B. Mehrspurrekorder).

Also kommt nur die XLR Ausführung in Frage, die braucht jedoch 48V Phantomspeisung. Dafür gibt es mehrere Lösungen, Vorverstärker, USB A/B Wandler. Ich habe mich für der Einfachheithalber für ein Set entschieden wo so ein Microport XLR/USB Wandler dabei war. Keine Ahnung ob der was taugt, aber ist im Set also wird’s schon passen dachte ich mir.

Dazu kam dann noch ein Mikrofonhalter, eine Spinne die das Mikro von schlägen auf dem Tisch entkoppelt, ein Tischarm für’s Mikrofon und ein Popp-Schutz.

Lieferung

Heute brauchte der UPS Mensch das Paket mit allen Inhalten vorbei, bis auf die Spinne funktioniert alles, die habe ich wohl eine Nummer zu eng gekauft, ich bekomme das Mikrofon da nicht rein.

Entäuschung

Nachdem ich das dann alles in Betrieb genommen hatte habe ich den Screencast aufgenommen. Und es wurde zurecht eine nicht ganz so gute Tonqualität vernommen, als ob ich zu weit wegwäre. Ich war schon was unzufrieden, da ganze Geld und dann sowas. Somit schob ich es auf die Software. Aber die war nicht an allem Schuld.

Ganz wichtig bei so einem Semi-Pro mit Nierencharakteristik ist das man es auch an die richtige Stelle beschallt. Dies habe nich nicht gemacht, ich habe oben hineingesprochen, was für dieses nicht ganz so gut war. Es gibt welche da funktioniert dies.

Ok, ich verspreche nun immer seitlich reinzusprechen, aber auch nur von vorne.

Alles wieder gut

Nachdem mir nun bekannt es von welcher Stelle ich das Mikrofon zu beschallen habe ich nun auch den Qualitätsvergleich gemacht. Mir stehen nun 3 externe Mikrofone zu Verfügung.

  1. Microsoft WebCam LifeCam VX-7000
  2. Logitech Premium Notebook Headset USB
  3. Audio-Technica AT220

Mit dem Headset war ich so zufrieden, es macht seinen Job war nicht teuer und für LiveMeetings und so hat es gereicht. War das gerade nicht greifbar wurde auf das Mikro der WebCam zurückgriefen (Messenger & Skype). Ich musste mich ja nicht hören.

Zur Test Aufnahme habe ich also das Headset aufgezogen, und mich so vor das neue Mikro positioniert wie ich auch am Rechner arbeite und in Standard WebCam abstand bin. Dann habe ich die Pegel aller Mikrofone auf einen ähnlichen Stand gebracht um eine gleiche Lautstärke zu haben.

Mit der Software MixPad (Mehrspur Aufnahme) habe ich dann in einem Take alle drei Mikrofone im Kasten gehabt. Somit gibt es keine Betonungsunterschiede.

Hier nun kleine Miniplayer zum abhören. Das Getöse im Hintergrund ist wohl die Dockingstation, kommt mir hier im Betrieb nicht SOO laut vor. Aber heute ist es hier auch was wärmer. Bis auf die Umwandlung in MP3 wurde die Aufnahme nicht nachbearbeitet.

Microsoft WebCam LifeCam VX 7000

Logitech Premium Notebook Headset USB

Audio-Technica AT2020

Und alle drei zusammen

Ein Urteil kann sich nun jeder selbst bilden, entäuscht bin ich jedenfalls nicht mehr. Zumal durch die Nierencharakteristik die Hintergrundgeräusche gut gefiltert werden.

Für den XLR/USB Adapter braucht man keine Treiber (Windows7/Vista), auch bietet er auch noch einen Kopfhörer-Anschluss an den der Rechner die Soundausgabe schicken kann.

.resharper-Dateien–einchecken oder nicht?

10.08.2010 15:30:09 | Albert Weinert

Mir ist aufgefallen das in vielen Open-Source Projekte die .resharper Dateien nicht ins Quelltext-Repository aufgenommen werden. Ich bin der Meinung dies ist nicht gut, und hat auch seinen sinn. Dazu habe ich mal kurz – 3:30m - einen Screencast produziert.

Nunja, auch um mal Camtasia und mein neues Mikrofon mal zu testen Winking smile Es gibt noch Potential zur Verbesserung, wie ich gemerkt habe. Aber es ist ein Anfang.

Also, *.resharper Dateien mit  ins Repository aufnehmen, aber nicht die *.user (.resharper.user) Dateien,

Technorati Tags: ,

Coding4Fun-Artikel: Windows Phone Picture Effects Application

10.08.2010 10:34:22 | Oliver Scheer

Rene Schulte hat wieder zugeschlagen, diesmal bringt er Grafikeffekte auf Windows Phone 7. Im Blog von Coding4Fun hat er dazu einen sehr ausführlichen ersten Artikel veröffentlicht.

Link zum Artikel

Link zum Codeplexprojekt

Blog-Status: 200 OK

09.08.2010 16:04:00 | Jürgen Gutsch

Ganz unbemerkt und überraschend habe ich vorgestern den 200. Blogeintrag gepostet. Dafür das mir vor zweieinhalb Jahren, von Stefan Falz, dieser Blog ganz überraschend zur Verfügung gestellt wurde. Und ich am Anfang noch gar nicht wusste, was ich hier eigentlich schreiben soll.

Übrigens war es der olle Schweizer, der mich damals dazu überredet hat, hier hin und wieder mal was mehr oder weniger Sinnvolles zu schreiben ;-)
(Eine weitere Ausnahme ist dieser Beitrag: eher Sinn frei)

PS: Bitte kein unnötiges Lob an dieser Stelle. Andere schreiben um längen mehr, besser und fehlerfreier als ich. Ich war nur recht überrascht von der Zahl 200 und für Twitter ist der Post einfach zu lang. ;-)

DotNetKicks-DE Image

See# Party: Updates

09.08.2010 03:13:01 | Jürgen Gutsch

Es hat sich einiges getan bei den Vorbereitungen zur See# Party.

Sprecher und Themen

Nicht nur die Sprecher und Themen sind jetzt komplett und auch der schwierigste Part, die Agenda, ist nun seit diesem Wochenende auf der Website veröffentlicht.

Eine kleine Auswahl der Sprecher:

  • Golo Roden
  • Stefan Lieser
  • Laurent Bugnion
  • Roland Weigelt
  • Albert Weinert
  • und 11 weitere…

Eine kleine Auswahl der Themen:

  • Building Windows Phone 7 applications with Silverlight
  • IronRuby für .NET Developer
  • Advanced ASP.NET MVC
  • ADO.NET Entity Framework
  • TFS 2010 Neuerungen und Highlights
  • und 11.weitere…

Agenda

Am ursprünglichen Zeitplan für die Agenda haben wir noch etwas geschraubt. So haben wir die Mittagspause um eine Halbe Stunde verlängert, um Lunch-Sessions versetzt starten zu können. Zusätzlich gibt es nun doch eine Pause von 15 Minuten zwischen der Key Note und der ersten Session *fg*

Weiter zur Agenda

.NET Codeing Dojo

Ein besonderes Special können wir - dank Stefan Lieser - während der Grillparty bieten: Stefan hat sich bereit erklärt am Abend ein .NET Coding Dojo zu leiten. Da die Räumlichkeiten eh zur Verfügung stehen können die auch dafür genutzt werden. So kann ab 19:30 (nach dem Essen) das Dojo starten.

Gewinnspiel

Natürlich gibt es auch etwas mit nach Hause zu nehmen. Neben einem attraktiven Willkommensgeschenk für jeden Teilnehmer gibt es auch hier – dank der Zahlreichen Sponsoren – einiges zu gewinnen. Hier eine kleine Auswahl:

Twitter, Facebook und Co.

@dotnetkk twittert immer wieder Neuigkeiten zur See# Party unter dem Hashtag #ssp2010
Ebenso auf der Facebook Veranstaltung und auf der Facebook Seite zur .NET User Group Konstanz-Keuzlingen werden News veröffentlicht

Anmeldung

Die Anmeldung für die Teilnehmer ist nur noch bis zum am 21.08.2010 offen. Wer also noch an der See# Party teilnehmen möchte sollte sich beeilen um sich die letzten Plätze zu sichern :-)

Schnell anmelden…

DotNetKicks-DE Image

WPF Ribbon Steuerelement veröffentlicht

08.08.2010 22:19:22 | Oliver Scheer

Seit einigen Tagen steht das seit längerem angekündigte Windows Presentation Framework Ribbon Steuerelement nun in der finalen Version zur Verfügung.

clip_image001

Das neue Ribbon-Steuerelement ist kompatibel mit WPF 3.5 Service Pack 1 und WPF 4. Dabei handelt es sich um eine 100% WPF-Implementierung und nicht um einen Wrapper um den nativen Systemcode. Das bedeutet konkret, dass man alle WPF Styling-Fähigkeiten für die neuen Steuerelemente erhält.

Die folgenden Screenshots sind mit dem .NET 4 Client Profile Projektvorlagen erstellt worden.

Hier ein Blick auf einige der interessanten Funktionen.

Ribbon Application Projekt Vorlage

Der Ribbon-Installer beinhaltet eine “WPF Ribbon Application” Projektvorlage für Visual Studio.

clip_image002

Wenn man ein neues Ribbon-Projekt erstellt und anschließend sofort startet erhalt man die folgende Anwendung:

clip_image003

Der XAML-Code für das Standard-Ribbon sieht wie folgt aus:

<ribbon:Ribbon x:Name="Ribbon">
 
    <ribbon:Ribbon.ApplicationMenu>
        <ribbon:RibbonApplicationMenu SmallImageSource="Images\SmallIcon.png">
            <ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon"
                                              x:Name="MenuItem1"
                                              ImageSource="Images\LargeIcon.png"/>
        </ribbon:RibbonApplicationMenu>
    </ribbon:Ribbon.ApplicationMenu>
 
    <ribbon:RibbonTab x:Name="HomeTab"
                      Header="Home">
        <ribbon:RibbonGroup x:Name="Group1" 
                            Header="Group1">
            <ribbon:RibbonButton x:Name="Button1"
                                 LargeImageSource="Images\LargeIcon.png"
                                 Label="Button1" />
            <ribbon:RibbonButton x:Name="Button2"
                                 SmallImageSource="Images\SmallIcon.png"
                                 Label="Button2" />
            <ribbon:RibbonButton x:Name="Button3"
                                 SmallImageSource="Images\SmallIcon.png"
                                 Label="Button3" />
            <ribbon:RibbonButton x:Name="Button4"
                                 SmallImageSource="Images\SmallIcon.png"
                                 Label="Button4" />
            
        </ribbon:RibbonGroup>
        
    </ribbon:RibbonTab>
</ribbon:Ribbon>

Das Fenster, das das Ribbon beinhaltet ist von der Klasse RibbonWindow abgeleitet. Diese Klasse verwendet nativen Interopcode, der den Zugriff auf die Nicht-Client-Grafikbereich zu erleichtert. Die Verwendung dieser Basisklasse ist absolut optional, solange man auf diese spezielleren Funktionen keinen Zugriff benötigt.

Das Ribbon-Steuerelement hat alle Funktionen die man erwartet: Quick Access Toolbar, Application Menu, Hilfsfunktionen, erweiterte Tooltips, Tastenkürzelvorschau, automatisches Anpassen der Größe und Anordnung, kontextuelle Gruppen, das schicken Windows 7 Look-and-Feel, und vieles mehr.

Kontextuelle Gruppen

Um ein neues RibbonTab (Reiter) in eine kontextuelle Gruppe, wie z.B. die Bildbearbeitungswerkzeuge in Word, zu erstellen, muss man lediglich die gewünschten Elemente im XAML-Code in den Bereich ContextualTabGroup-Bereich einfügen:

<ribbon:RibbonTab x:Name="AwesomeTab"
                  ContextualTabGroupHeader="Awesome Tools"
                  Header="Really Awesome">
    <ribbon:RibbonGroup x:Name="Group2"
                        Header="Group2">
        <ribbon:RibbonButton x:Name="Button21"
                             LargeImageSource="Images\LargeIcon.png"
                             Label="Button21" />
    </ribbon:RibbonGroup>
 
</ribbon:RibbonTab>
<ribbon:Ribbon.ContextualTabGroups>
    <ribbon:RibbonContextualTabGroup Header="Awesome Tools"
                                     Visibility="Visible"
                                     Background="Green" />
</ribbon:Ribbon.ContextualTabGroups>

clip_image004

Man achte hier auf die grüne Kopfzeile über dem Ribbon.

Quick Access Toolbar

Wie nicht anders zu erwarten, unterstützt das Ribbon auch die Quick Access Toolbar (in der Windows-Titelleiste).

<ribbon:Ribbon.QuickAccessToolBar>
    <ribbon:RibbonQuickAccessToolBar>
        <ribbon:RibbonButton x:Name="ButtonQ1"
                             SmallImageSource="Images\SmallIcon.png"
                             Label="ButtonQ1" />
        <ribbon:RibbonButton x:Name="ButtonQ2"
                             SmallImageSource="Images\SmallIcon.png"
                             Label="ButtonQ2" />
        <ribbon:RibbonButton x:Name="ButtonQ3"
                             SmallImageSource="Images\SmallIcon.png"
                             Label="ButtonQ3" />
    </ribbon:RibbonQuickAccessToolBar>
</ribbon:Ribbon.QuickAccessToolBar>

clip_image005

Dieser Screenshot zeigt zwei der Quick Access Buttons links oben im Fenster, mit dem Pfeil der andeutet, das dort noch mehr Buttons auf einen warten.

Das WPF Ribbon Team hat einen großartigen Job geleistet, dieses Steuerelement zu erstellen und komfortable für Entwickler zu gestalten. Es unterstützt eine Vielzahl von Szenarios und auch den aktuellen Windows 7 UI-Style.

PS: Und ja, der RibbonButton unterstützt auch ICommand.

Links

Download-Link: http://www.microsoft.com/downloads/details.aspx?FamilyID=2BFC3187-74AA-4154-A670-76EF8BC2A0B4&displaylang=en

Dokumentation-Link: http://msdn.microsoft.com/en-us/library/ff799534.aspx

Neues Theme und alte Lasten

08.08.2010 14:57:12 | Klaus Bock

Seit der Version 1.6.0.0 bietet BlogEngine.NET, für Themes die es unterstützen, die Möglichkeit Kommentare und Track- oder Pingbacks gesondert anzuzeigen.
Allerdings scheint die Sortierung nach Kommentaren und Trackbacks bei Blogs die BlogEngine.NET schon länger einsetzen, nicht richtig zu funktionieren. Die Track- und Pingbacks werden zwar in einem eigenen Container angezeigt, werden aber auch gleichzeitig in den Kommentaren dargestellt. Bei neueren BlogEngine.NET Blogs, wie etwa bei Dariusz Parys neuem Blog, scheint dieses Problem nicht zu bestehen.
Ob die fehlerhafte Sortierung tatsächlich an den neested Comments liegt, habe ich nicht weiter geprüft. Aber genau hier fand ich den Fehler, der sich mit einem kleinem Kniff beheben lässt.

commentview class

In der Methode AddNestedComments der Klasse User_controls_CommentView, zu finden im Ordner User controls, wird stur durch die übergebene Kommentarliste iteriert und jeder als sichtbar markierte Kommentar zu den Kommentaren hinzugefügt. Ganz egal ob es sich dabei tatsächlich um einen Kommentar oder einen Track- oder Pingback handelt.
Mit einer einfachen Abfrage, ob der Kommentar nicht doch vielleicht ein Track- oder Pingback sein könnte, lässt sich die unschöne Darstellung beseitigen.
Wie es sich bei ausgeschalteten neested Comments verhält, habe ich nicht geprüft, da ich nur geschachtelte Kommentare verwende.

Wie gesagt, es muss nur eine Überprüfung auf Track- oder Pingback verwendet werden. Das lässt sich mit einem Zweizeiler bewerkstelligen.

private void AddNestedComments(string path, List<Comment> nestedComments, PlaceHolder phComments)
{
    foreach (Comment comment in nestedComments)
    {
        //HACK: Überprüfen ob der Kommentar ein Track- oder Pingback ist.
        if (comment.Email == "pingback" || comment.Email == "trackback")
        {
            continue;
        }

		// hier der restliche Code der Methode

    }
}

Anschließend wird auch bei älteren BlogEngine.NET Blogs, mit aktivierten geschachtelten Kommentaren, die Ausgabe genauso erzeugt wie sie sein sollte.

Agile Softwareentwicklung: TFS oder Agilo?

07.08.2010 15:59:00 | Jürgen Gutsch

Das ich den TFS und die Arbeit mit dem TFS bevorzuge ist kein Geheimnis. Der TFS ist ein sehr flexibles All-In-One-Tool, welches eine moderne Softwareentwicklung unterstützt. Die wichtigsten Stichworte sind Source-Code-Verwaltung, Bug- und Feature-Tracking, sowie Continous-Integration mit Team-Build.

Zwei zusätzliche Features, die in der Vergangenheit bei der Arbeit mit dem TFS lieben gelernt habe, sind zum einen Shelve-Sets und die Verknüpfung der Change-Sets (Check-Ins) mit einem Work-Item (Bug oder Feature):

Die Shelve-Sets bieten eine Möglichkeit, Source Code einzuchecken und somit zentral zu sicher, ohne dass der Code im Haupt-Branch und somit im Build berücksichtigt wird. Der Entwickler hat so die Möglichkeit Änderungen zwischen zu speichern.

Mit der Verknüpfung zwischen Work-Items und Change-Sets lässt sich auf die Zeile genau feststellen, welcher Code mit zu welchem Zweck geändert oder erstellt wurde.

Das war der TFS2008. Der TFS2010 bietet eine ganze Reihe weiterer interessanter Features. Angefangen bei der wesentlich verbesserten Unterstützung für Tester, bis hin zur den lang ersehnten hierarchischen Work-Items.

Privat nutze ich allerdings folgende Konstellation um meine Projekte zu entwickeln:

  • Visual SVN Server für die Source Code Verwaltung
  • Hudson als Build Server
  • Tortoise als SVN Client unter Windows
  • Visual SVN als Client im Visual Studio

Seit einiger Zeit suche ich eine Möglichkeit, mit der agile Softwareentwicklung durch Software unterstützt, optimal betrieben werden kann. Bei meinem Besuch auf der BASTA! Spring 2010 besuchte ich eine Session zu Agilen Tools. Neben Hudson als Continous Integration Server (den ich sehr empfehlen kann) wurde auch Agilo vorgestellt. Agilo ist ein (in der Grundversion) kostenloses Tool von agile42 (http://www.agile42.com) welches auf Trac basiert, zur Verwaltung von Anforderungen, Backlogs, Teams, mit Integriertem Wiki. Scrum und XP lassen sich damit hervorragend abbilden und managen.

Mit dem TFS lässt sich (mit dem Template „MSF for Agile“) ebenfalls agil arbeiten, allerdings war bisher die Unterstützung für Scrum, durch Anpassung des Templates nicht so umfangreich wie es mit Agilo der Fall ist. Zum Management von agilen Projekten war Handarbeit oder die Verwendung von zusätzlichen Tools erforderlich.

Seit kurzem (22. Juli 2010) gibt es allerdings für den 2010 eine Unterstützung für Scrum, welches die Best Practices der Scrum Community abbildet und die Scrum-Sprache benutzt. Eine kurze Einführung ist auch auf dem Blog von Brian Harry zu finden: http://blogs.msdn.com/b/bharry/archive/2010/06/07/a-scrum-process-template-for-tfs.aspx Zusätzlich zu neuen und geänderten Work-Items können BurnDown und Velocity-Cahrts im zugehörigen Sharepoint visualisiert werden. Das Process Template kann von hier (http://visualstudiogallery.msdn.microsoft.com/en-us/59ac03e3-df99-4776-be39-1917cbfc5d8e) heruntergeladen werden.

Bei der Installation des MSI-Pakets des Templates stößt man auf eine kleine Schwierigkeit, falls man die Readme-Datei nicht gelesen hat: Das Process-Template ist nach der Installation noch nicht im TFS verfügbar und muss dort erst hochgeladen werden. Den Anweisungen der Readme (im Installationsordner) sollte man folgen. Nach dem Upload des Process-Templates kein ein neues Teamprojekt anhand dieses Templates erzeugt werden.

Um alle Team-Member beteiligen zu können, sollte SharePoint angebunden werden. Ich habe nur die Basic Konfiguration (ohne SharePoint) testen können und kann so leider nichts Genaueres zum Portal schreiben.

Eine Übersicht über die neuen Work Item Typen ist hier zu finden: http://msdn.microsoft.com/en-us/library/ff731587.aspx

Ach ja: Den TFS Web Access des vergangenen Versionen habe ich nur einmal sehr flüchtig angeschaut und kann also nicht mehr viel darüber erzählen, aber der Web Access des TFS2010 ist nicht über. Natürlich nicht vergleichbar mit den Oberflächen die Agilo und Hudson mit sich bringen, aber diese Tools sind natürlich komplett webbasiert.

Aber ich möchte den TFS nicht durchweg loben. Der Grund warum ich privat weiter mit den oben genannten Tools weiter fahren möchte ist nicht nur eine Lizenzfrage, sondern auch eine Ressourcenfrage. Der TFS benötigt einen eigenen, separaten Server, da er (je nach Teamgröße) relativ viel Prozessorzeit und Arbeitsspeicher beansprucht. Je nach Teamgröße wird mit Continous Integration sogar empfohlen, Team Build auf einem weiteren separaten Server laufen zu lassen.

Agilo, Hudson und Visual SVN Server benötigen dagegen alle zusammen weniger Ressourcen als der TFS alleine. Allerdings sind alle drei Tools natürlich nicht so stark verbunden, wie alle Komponenten des TFS.

Da ich aber nur einen kleinen, gehosteten Virtuellen Server habe und auf diesem auch noch einige Webs laufen sollten, kann ich mir den TFS produktiv und auf diesem Server leider nicht leisten. Dennoch denke ich, dass ich im Geschäfft eher für den TFS entscheiden werde.

DotNetKicks-DE Image

ASP.NET MVC Action und die Database Connection, nun richtig

07.08.2010 14:08:35 | Albert Weinert

Bei ASP.NET MVC ist es Best Practice wenn man für den Datenbank Zugriff eine Transaction beim Start der Action öffnet und zum Ende wieder schließt.

Ich habe die eine oder andere “Lösung” dazu gesehen, die sich jedoch meist in den Request-LifeCycle der Application einklinken und somit “irgendwie” außerhalb der MVC Konzeptes sind und somit auch beim Zugriff auf andere Seiten oder gar statischen Resourcen auch Connection/Transactionen öffnen. Auch ich nutzte dies … aber nun nicht mehr.

Die beste Lösung (jedenfalls aus meiner Sicht) ist ein eigener IActionInvoker der diese Aufgabe übernimm,. damit ist auch exakt den Gültigkeitsbereich der Transaktion definiert.

public interface IActionInvoker
{
    bool InvokeAction(ControllerContext controllerContext, string actionName);
}

In ASP.NET MVC ist es ein ActionInvoker der dafür sorgt dass die Action und das ActionResult so verarbeitet werden wie wir es vom Framework kennen. Die Standardimplementierung ist der ControllerActionInvoker. Der Controller selbst übernimmt die Erstellung  des IActionInvoker und zwar über die Methode CreateActionInvoker(). Diese ist virtuell und kann somit angepasst werden.

    protected virtual IActionInvoker CreateActionInvoker()
    {
      return new ControllerActionInvoker();
    }
Somit zu meiner Lösung. Ich habe einen IActionInvoker implementiert, der dafür sorge trägt dass der Aufruf der Action in in einer Datenbank-Transaction abläuft.

public class TransactionalActionInvoker : IActionInvoker
{
    private readonly IDatabaseTransaction transaction;
    private readonly IActionInvoker baseActionInvoker;

    public TransactionalActionInvoker(IDatabaseTransaction transaction,
                                        IActionInvoker baseActionInvoker)
    {
        this.transaction = transaction;
        this.baseActionInvoker = baseActionInvoker;
    }

    public bool InvokeAction(ControllerContext controllerContext, string actionName)
    {
        bool result;
        try
        {
            transaction.BeginTransaction();
            result = baseActionInvoker.InvokeAction(controllerContext, actionName);
        }
        catch (Exception)
        {
            transaction.ExceptionWhileTransaction();
            throw;
        }
        finally
        {
            transaction.EndTransaction();
        }
        return result;
    }
}
Als Abhängigkeiten drücke ich dem TransactionActionInvoker den eigentlichen IActionInvoker rein sowie eine IDatabaseTransaction zum Management des Transaktion. Ich gehe diesen Weg und leite nicht von ControllerActionInvoker ab damit beliebige Implementierungen von vorhandenen ActionInvokern verwendet werden können.

IDatabaseConnection ist ein eigenes Interface, darüber kann man die Transaction öffnen, und wieder schließen sowie mitteilen ob es im Ablauf der Action ein Problem gab.  Da die Implementierung Datenbankabhängig ist gehe ich hier nicht Groß darauf ein, nur der Hinweis das bei EndTransaction() bei einem Problem die Transaction mit einem Rollback() beendet wird sonst mit einem Commit().

public interface IDatabaseTransaction 
{
    void BeginTransaction();
    void EndTransaction();
    void ExceptionWhileTransaction();
}
In meinen Anwendungen habe ich immer einen Basis-Controller von dem ich alle meine Controller ableite. Ich hoffe Du machst dies auch so! Somit ist es sehr enfach die Erzeugung des IActionInvoker auszutauschen und den eigenen zu verwenden.

 

public abstract class TransactionController : Controller
{
    public IDatabaseTransaction Transaction { get; set; }

    protected override IActionInvoker CreateActionInvoker()
    {
        return new TransactionalActionInvoker(Transaction,base.CreateActionInvoker());
    }

    protected override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);
        Transaction.ExceptionWhileTransaction();
    }
}

Nicht viel besonderes, es wird eine Instanz vom TransactionActionInvoker erzeugt und ihr die IDatabaseTransaction sowie der ursprüngliche IActionInvoker übergeben.

Wichtig ist es OnException() zu überschreiben um der IDatabaseTransaction mitzuteilen das eine Exception innerhalb der Action aufgetreten ist.

Die IDatabaseTransaction muss natürlich auch irgendwie in den Controller kommen, dies wird in diesem Fall vom IoC-Container gemacht und zwar per Property-Injection. Ich habe hier der Property-Injection gegenüber der Konstruktor Injection den Vorzug gegeben damit ich die die Abhängigkeit nicht bei jedem zu implementierenden Controller “manuell” bedienen muss. Dies kann man jedoch machen wie man möchte, ein Lookup über den Container oder IServiceLocator wäre auch möglich.

Den Lebenszyklus von IDatabaseTransaction habe ich über den IoC-Container auf pro HttpRequest festgelegt. Dies ist erforderlich, auch ist es erforderlich dass die eigenen Datenbank Session/Connection auf pro HttpRequest festgelegt ist. Es muss sichergestellt werden dass alle Datenbank Aufrufe innerhalb der Action mit derselben Connection bzw. Session aufgerufen werden.

Interessante Word-Autokorrektur

06.08.2010 22:39:00 | Jan Christian Selke

Das Microsoft Word nicht zuletzt auch aufgrund der Unterstützung des transienten Schemas recht fehlertolerant ist, ist bekannt. Einen besonders interessanten Effekt, der bei fehlerhafter Dokumentstruktur auftreten kann, habe ich vor Kurzem zu Augen bekommen.

Es begann damit, dass wir ein neues Dokument erzeugt haben. Dabei haben wir den Fehler begangen, dass der Inhalt eines ContentControls auf body Ebene vollständig geleert wurde.

emptycc

Die Folge war nun, dass nach dem ersten Bearbeiten und Speichern des Dokuments, die Struktur innerhalb des Dokuments verschoben wurde. Der Unterschied kann bereits in der Entwicklungsansicht in Word ausgemacht werden.

test

Was genau passierte hier aber?

Word korrigierte das Dokument selbstständig, indem der nächst folgende Paragraf in das leere ContentControl verschoben wurde. In diesem Fall handelt es sich dabei um den Paragrafen mit dem Text Textparagraf nach dem leeren ContentControl.

Nach dem Speichern weist das Dokument jetzt folgende Struktur auf.

emptycc2

Fazit

Word ist in der Tat sehr Fehlertolerant, allerdings werden mit dem Speichern automatische Korrekturen vorgenommen, die zum Teil nur schwer erkannt werden können. Diese Korrekturen können aber erhebliche Veränderungen in der Dokumentstruktur nach sich ziehen, die eine automatische Weiterverarbeitung der Dokumente unter Umständen stark beeinträchtigen können.

Silverlight Tipp der Woche: Lokalisierte Ressourcen verwenden

06.08.2010 19:35:00 | Stefan Lange

In diesem Tipp geht es um das richtige Einbinden von lokalisierten Ressource-Dateien beispielsweise aus dem Silverlight Toolkit.

Zusammenfassung

Das Control DataPager zeigt auch unter einem deutschsprachigen Windows den Text "Page ... of ..." anstatt "Seite ... von ..." an, wenn man nicht manuell in der Projektdatei das Element <SupportedCultures> manuell anpasst.

Beschreibung

Bei manchen Controls kann es vorkommen, dass der angezeigte Content sprachabhängig ist. Das Control DataPager beispielsweise zeigt "Page ... of ..." an, selbst wenn Windows und Browser Deutsch sind. Ein kurzer Blick mit dem Debugger auf den aktuellen Thread zeigt, dass sowohl CurrentCulture als auch CurrentUICulture wie erwartet auf "de" stehen. Auch die DataPager Property Language im XAML Code auf "de" zu setzen bringt keine Veränderung - der Text bleibt englisch.

Das Problem kennen viele und im Web finden sich diverse Lösungsversuche: Von DataPager eine eigene Klasse ableiten und dann mittels Control Template eine eigene TextBox anlegen oder auch von der Assembly System.Windows.Controls.Data.dll die Strong Name Signatur entfernen und dann mit einem externen Resource Editor den String "Page" auf "Seite" ändern. Das ist aber alles unnötig, denn Microsoft hat sämtlich Controls für die von Silverlight unterstützten Sprachen lokalisiert. Man muss die Verwendung der für die jeweiligen Sprachen vorhandenen Satellite Assemblies nur aktivieren.

Der richtige Weg ist eher unerwartet: Die Projektdatei ist mit einem XML-Editor zu öffnen und im Element SupportedCultures sind die benötigten Sprachen einzutragen, beispielsweise so:

<SupportedCultures>en;de;fr</SupportedCultures>

Dieser Eintrag führt dazu, das beim Build für alle im Projekt referenzierten Assemblies geprüft wird, ob es dazu zusätzliche deutsche bzw. französische Satellite Assemblies gibt. Alle diese zusätzlichen Assemblies werden mit in die XAP-Datei gepackt. Zur Laufzeit werden sie dann von der Klasse ResourceManager automatisch verwendet, sofern die aktuelle Culture Einstellung des Browsers dazu passt. Im Detail ist das hier beschrieben: How to: Create a Build that Targets a Specific Culture

Wenn man genauer darüber nachdenkt, ist es eigentlich logisch, dass man Visual Studio irgendwie mitteilen muss, für welche Sprachen es die Satellite Assemblies mit den lokalisierten Ressourcen in die XAP-Datei packen soll. Es wäre bei Silverlight ja ziemlich unklug, immer alle Satellite Assemblies für sämtliche vorhandenen Sprachen hinzuzufügen, selbst wenn die Anwendung beispielsweise nur für den deutschsprachigen Raum bestimmt ist. Die XAP-Datei würde unnötig vergrößert.

Dass man allerdings das XML der Projektdatei manuell bearbeiten muss, passt überhaupt nicht zu Visual Studio (und schon gar nicht zu Visual Studio 2010). Ein Eingabefeld unter den Silverlight Projektoptionen wäre sehr hilfreich, da vermutlich kaum jemand erwartet, dass eine so grundsätzliche Information direkt in die Projektdatei eingetragen werden muss.

Das Setzten der Property Language aus der Klasse FrameworkElement hat übrigens in Silverlight (im Gegensatz zu WPF) bei den meisten Controls keine weitere Auswirkung. Insbesondere führt der folgende XAML-Code nicht dazu, dass jetzt etwa französische Ressourcen verwendet werden.

<sdk:DataPager Language="fr" .../>

Möchte man die Sprache für eine Anwendung global umschalten, muss man der Property CurrentUICulture des Main-Threads bei Programmstart eine entsprechende neue CultureInfo zuweisen.

Hier geht's zum nächsten Tipp.

Neue Workshop-Angebote im September für SharePoint 2010 und SQL Server 2008 R2! Anmeldephase läuft!

06.08.2010 14:09:18 | Oliver Scheer

Aktuelle Workshop-Termine für SQL Server 2008 R2 und SharePoint Server 2010 sind exklusiv für Softwareentwickler verfügbar! Wir haben für Sie zwei separate Veranstaltungen zusammengestellt, um zielgerichtet Ihre Bedürfnisse in Ihrer Rolle als technischer Leiter oder als Entwickler abzudecken.

Office und SharePoint 2010 halten, was andere versprechen: Viele neue Funktionalitäten und vor allem eine einfachere Benutzung. Das trifft nicht nur für Anwender zu, sondern vor allem auch für Entwickler. Wir stellen Ihnen die Möglichkeiten von SharePoint 2010 dar und beleuchten Ihre Vorteile als Softwarehersteller bei der Integration von SharePoint 2010.

  • Briefing zu neuen Geschäftspotentialen für Entscheider am 06.09.2010 in Bad Homburg (Anmelden)
  • Entwickler-Camp für tief technischen Einstieg am 17.09.2010 in Berlin (Details zur Anmeldung)

SQL Server 2008 R2 ist die nächste Version des SQL Servers und stellt die Grundlage für eine Mission Critical Plattform dar. Es werden unter anderem umfangreiche Business Intelligence Erweiterungen vorgestellt. Sind Ihre Applikationen fit für den SQL Server 2008 R2 und bieten Mehrwerte für Sie und Ihre Kunden? Wenn Sie überlegen welche neuen Möglichkeiten interessant für Ihre Produkte sind, dann verschaffen Sie sich einen Überblick über Ihre Vorteile als Softwarehersteller bei der Integration von Microsoft SQL Server R2.

  • Briefing zu neuen Geschäftspotentialen für Entscheider am 13.09.2010 in Köln (Anmelden)
  • Entwickler-Camp für tief technischen Einstieg am 15.09.2010 in Bad Homburg (Details zur Anmeldung)

Alle Details inkl. der Inhalte der Veranstaltungen und zur Anmeldung finden Sie im Blog Softwarehersteller in Deutschland.

Einfacher Content finden geht nicht : Das Visual Studio 2010 ALM Pivot

06.08.2010 10:44:00 | Christian Binder

Der richtige Online Content ist für häufig noch immer schwer zu finden. Aus diesem Grund haben Dariusz Parys und Ich das Projekt Reticulum ins Leben gerufen, um Online Content explorativ besser auffindbar zu machen.  Warum eigentlich explorativ?  Suchmaschinen finden doch alles. Im Prinzip Ja, aber nur wenn man die richtigen Suchbegriffe kennt, was wiederum voraussetzt, dass man das Thema schon sehr gut kennt. Unser Ziel ist also klar definiert: Wir wollen zu bestimmten Themen zentrale Einstiegspunkte schaffen, die es ermöglichen, einen einfachen Einstieg zu finden.  Wobei wir den Content Managen, also nicht alles rein packen was es gibt, sondern nur ausgewählten Content. Für den Preview haben wir das Thema Visual Studio 2010 Application Lifecycle Management gewählt, da es Thematisch relativ umfangreich ist.

Für die technische Implementierung haben wir einiges ausprobiert, sind aber letztendlich beim Silverlight Pivot gelandet. Natürlich haben wir noch eine Menge Ideen, wie definierte Content Guides im Mindmap Still in unserem Backlog, wollten aber den aktuellen Stand der Community zeigen, um vor allem Euer Feedback zu bekommen. Lasst uns bitte wissen, was Ihr gut oder schlecht findet oder was Euch fehlt!  

Visual Studio 2010 ALM Pivot


Hier gibt’s ein kurzes Video wie es geht oder direkt weiter zum Visual Studio 2010 ALM Pivot.

Viel Spass

Tool des Tages: http://zoom.it/

06.08.2010 10:11:03 | Oliver Scheer

Viele kennen den Begriff Zoom It von dem netten kleinen Presenter-Tool.

Von dem ist hier nicht die Rede, sondern von der Webseite http://zoom.it . Dieses Tool kann ganze Webseiten in ein Deep Zoom umwandeln.

Das Ergebnis ist recht witzig.

image

Meine Homepage als Zoom.It

Neues Design der Bing Maps

06.08.2010 07:01:08 | Oliver Scheer

Die Kollegen von Bing Maps haben das Kartenmaterial für Bing angepasst. Dieses gibt es jetzt in zwei Darstellungsvarianten: AJAX und Silverlight. Nach dem Prinzip weniger ist mehr und Farben nur fürs wesentliche, wirkt die neue Darstellung sehr aufgeräumt und kühl.

image

Mehr Informationen dazu im Bing Blog.

Neue Workshop-Angebote im September für SharePoint 2010 und SQL Server 2008 R2! Anmeldephase läuft!

05.08.2010 16:40:02 | Peter Kirchner

Aktuelle Workshop-Termine für SQL Server 2008 R2 und SharePoint Server 2010 sind exklusiv für Softwareentwickler verfügbar! Wir haben für Sie zwei separate Veranstaltungen zusammengestellt, um zielgerichtet Ihre Bedürfnisse in Ihrer Rolle als technischer Leiter oder als Entwickler abzudecken.

Office und SharePoint 2010 halten, was andere versprechen: Viele neue Funktionalitäten und vor allem eine einfachere Benutzung. Das trifft nicht nur für Anwender zu, sondern vor allem auch für Entwickler. Wir stellen Ihnen die Möglichkeiten von SharePoint 2010 dar und beleuchten Ihre Vorteile als Softwarehersteller bei der Integration von SharePoint 2010.

  • Briefing zu neuen Geschäftspotentialen für Entscheider am 06.09.2010 in Bad Homburg (Anmelden)
  • Entwickler-Camp für tief technischen Einstieg am 17.09.2010 in Berlin (* Hinweis zur Anmeldung siehe unten)

SQL Server 2008 R2 ist die nächste Version des SQL Servers und stellt die Grundlage für eine Mission Critical Plattform dar. Es werden unter anderem umfangreiche Business Intelligence Erweiterungen vorgestellt. Sind Ihre Applikationen fit für den SQL Server 2008 R2 und bieten Mehrwerte für Sie und Ihre Kunden? Wenn Sie überlegen welche neuen Möglichkeiten interessant für Ihre Produkte sind, dann verschaffen Sie sich einen Überblick über Ihre Vorteile als Softwarehersteller bei der Integration von Microsoft SQL Server R2.

  • Briefing zu neuen Geschäftspotentialen für Entscheider am 13.09.2010 in Köln (Anmelden)
  • Entwickler-Camp für tief technischen Einstieg am 15.09.2010 in Bad Homburg (* Hinweis zur Anmeldung siehe unten)

Inhalte der Veranstaltungen

Strategischer Überblick über SQL Server 2008 R2

  • SQL Server 2008 R2 – ein Überblick
  • Was habe ich als Partner von Microsoft SQL Server?
  • Was habe ich als Partner von Microsoft SQL Server 2008 R2?
  • Neues Business durch Migration auf den SQL Server 2008 R2
  • Worauf sollte ich den Kunden hinweisen?
  • Know-How-Bedarf und Deckung beim Partner

Leider mussten wir diese Veranstaltung abgesagen. Schauen Sie nach unseren neuen Terminen auf Microsoft Platform Ready.

Trainingscamp für Entwickler für den SQL Server 2008 R2

  • Die Microsoft SQL Server 2008 und 2008 R2 Plattform
    • Von SQL Compact bis SQL Azure
  • Spezielle Funktionen von SQL Server 2008 R2
    • Vorteile für Partner
  • Ablöseszenarien von anderen Herstellern - Was, warum und wie?
    • Warum migrieren?

Leider mussten wir diese Veranstaltung abgesagen. Schauen Sie nach unseren neuen Terminen auf Microsoft Platform Ready.

Strategischer Überblick über SharePoint 2010

In dieser Veranstaltungen lernen Sie aus strategischer Sicht die Vorteile von SharePoint 2010 kennen. Folgende Themen haben wir für Sie vorbeitet.

  • Potenziale für Partner durch SharePoint 2010 und Cloud/BPOS
  • Integration von SharePoint in Partnerlösungen (Grundlagen, Vertrieb und Integration mit Visio)
  • Integrationsszenarien SharePoint inhouse und BPOS – Vorteile für Kunden
  • Technische Abgrenzung: wo macht SharePoint in Partnerlösungen Sinn?
  • SharePoint 2010 – eine durchgehende Entwicklerstory für Partner
    • VS 2010, Sandboxed Solutions,  Developer Dashboard, Office Integration/Entwicklung

Datum und Ort: 6. September in Bad Homburg
Anmeldegebühr: keine
Für die Anmeldung zur Veranstaltung klicken Sie bitte hier.

Trainingscamp für Entwickler für SharePoint 2010

Diese Veranstaltung richtet sich an technische Leiter und Entwickler, die sich näher mit den Neuerungen und den Vorteilen von SharePoint 2010 vertraut machen möchten. Für Sie haben wir die folgenden Themen vorbereitet.

  • SharePoint 2010 – ein technischer Überblick
  • SharePoint 2010 für Entwickler – Neuerungen
  • Cloud und BPOS – die neue Plattform für SharePoint Lösungen – ein technischer Blick
  • SharePoint 2010 – eine durchgehende Entwicklerstory für Partner
    • VS 2010, Sandboxed Solutions,  Developer Dashboard, Office Integration/Entwicklung, Visio
  • 1-2-3: SharePoint beim Partner - ein Fahrplan für den Wissensaufbau

Datum und Ort: 17. September in Berlin
Anmeldegebühr: 59,00 EUR
Für die Anmeldung zur Veranstaltung klicken Sie bitte hier.

[14.09.10] Aktualisiert: SQL Server Workshops

Finale Platform Preview von Internet Explorer 9 (IE9)

05.08.2010 08:59:26 | Oliver Scheer

Die vierte an Entwickler gerichtete Vorschauversion zum Internet Explorer 9 (IE9) steht jetzt zum kostenlosen Download zur Verfügung. Mit dieser letzten Preview vor der öffentlichen Beta-Version des Browsers können Entwickler erstmals einen vollständigen Blick auf die neue Plattform werfen, um so ihre Webseiten auf einer verlässlichen Basis zu testen. Zu den Neuerungen gehören schnelleres JavaScript, optimierter Support vielfältiger Standards sowie die daraus resultierende Verbesserung des Acid-3-Ergebnisses, neue Tests für die Arbeitsgruppen des W3C (World Wide Web Consortium) und weitere Beispiele für Entwickler zu den Themen Performance, Grafik und HTML5. Mit den Previews, die bis zum Erscheinen der Beta-Version in einem 8-Wochen-Rhythmus erschienen sind, hat Microsoft der Webentwickler-Community frühzeitig Einblicke in die Evolution seiner interoperablen Webplattform gegeben. Mit schon heute über 2,4 Millionen Downloads war die Resonanz enorm. Nun sind die Weichen für die Beta-Version des IE9 gestellt.

Warum Management der Abhängigkeiten von Komponenten? NU!

04.08.2010 15:31:54 | Albert Weinert

Seit einiger Zeit nervt mich folgendes.

Ich arbeite an verschiedenen Projekten, die meisten nutzen auch Komponenten die nicht von mir stammen. Diese wären z.B. xUnit.net, Rhino.Mocks, Automapper, StructureMap usw. usf.

Des weiteren bin ich ein Freund davon alles was man für das Projekt braucht auch unter der Versionkontrolle zu haben um es nach dem ausschecken

  • in Visual Studio öffnen,
  • es kompilieren,
  • auf dem Build-Server starten,
  • Versionspezifische abhängigkeiten habe,
  • usw

ohne dass es dabei zu Problemen kommt und man sofort damit arbeiten kann. Und man nicht schauen muss wo nun noch welche Assembly in welcher Version referenziert wird. Wenn mehrere an dem Projekt arbeiten potenzieren sich die Probleme weil jeder seine Assemblies woanders liegen hat. Somit, alles was geht mit in die Versionskontrolle. Dies sollte jeder so handhaben.

Wo liegt denn jetzt das Problem?

Ist doch alles schön und funktioniert. Nunja, fast, solange die externen komponenten nicht angefasst werden, nicht aktualisiert werden müssen sowie es nur ein Projekt ist. Nun sind auch noch eigenen Komponenten dabei, die zum Teil noch Rege in der Entwicklung sind und öfters aktualisiert werden.

Die Projekte aktuell zu halten, die Komponenten an den richtigen Platz kopieren ist eine nervige und auch für Fehler anfällige Arbeit.

Es wäre doch schön wenn man dies schnell, einfach und mehr oder minder automatisiert machen könnte.

Wir haben 2010, da muss es doch was geben?

Habe mich somit auf den Weg gemacht was zu suchen, was vielleicht eine Art Standard in der .NET Welt ist, Auch soll bei Open Source Projekten der Entwickler der mal kurz reinschnuppern will nicht in weitere Abhänigkeiten gedrängt werden, oder andere Teammitglieder müssen es nicht unbedingt verwenden um das Projekt zu bauen oder daran zu entwickeln.

Irgendwie nichts gefunden was meine Erwartungen und Bedürfnisse erfüllte. Als Software-Entwickler habe ich dies auf die lange MMMM-Liste gestellte (müsste man mal machen).

Ruby hat das Problem schon gelöst

Schaut man in die Ruby-Welt so gibt es da schon gar ewig RubyGems. Kleine Komponenten die man sich sehr einfach lokal auf den Rechner kopieren kann und immer aktuell halten kann.

Dies haben sich Dru Seller, Chris Patterson und ein paar andere auch gedacht und entwickelten NU. Ein kleines Tools welches auf RubyGems aufsetzt und somit auf bewährten. Dies um ein paar Features ergänzt die für “uns” wohl interssant sind.

NU betritt die Bühne

NU existierst nun schon eine ganze Weile aber seit 2-3 Wochen beginnt das ganze an Fahrt aufzunehmen, Nach der Installation von Ruby, Gems und Nu (ist total einfach) kann man schon loslegen.

nu install nhibernate

 

Und kurze später hat man in dem aktuellen Ordner einen LIB Ordner (einstellbar). Indem sich folgendes befindet.

  • castle.core
  • castle.dynamicproxy2
  • log4net
  • nhibernate
  • nlog

Es wurde NHibernate und dessen Abhängigkeiten installiert. Zuerst in das lokale Gem-Repository und dann in das Projekt. Und von da aus natürlich in die Versionverwaltung.

Auf Tekpub befindet sich ein kostenloses Video dazu, dies zeigt in knapp 3 Minuten was NU ist und kann.

http://tekpub.com/view/dotnet-oss/nu

Eigene Gems zu erstellen ist auch sehr einfach

Dazu einfach ein gemspec erstellen und über gem bauen

 

version = File.read(File.expand_path("../VERSION",__FILE__)).strip  

Gem::Specification.new do |spec|
  spec.name        = 'fluentmetadata'
  spec.version     = version
  
  spec.has_rdoc = false
  spec.files = Dir["lib/FluentMetadata.*.dll", "lib/Readme.txt"]
  spec.files.reject! { |fn| fn.include? "Specs.dll"  }
  spec.description = 'FluentMetadata is describing Object-Metadata on one place, and using it from ASP.NET MVC 2 & 3, FluentNHibernate and EntityFramework 4 CodeFirst with EF Feature CTP 4'
  spec.summary     = 'FluentMetadata - Metadata on one place for .NET'
  
  spec.author			 = 'Albert Weinert'
  spec.email             = 'info@der-albert.com'
  spec.homepage          = 'http://wiki.github.com/DerAlbertCom/FluentMetadata/'
end

 

Das bauen eines Gems ist sehr einfach

gem build fluentmetada
gem install fluentmetada

 

Dies natürlich am besten direkt im Build-Skript machen und man braucht sich nicht mehr zu kümmern.

Und schon hat man das Gem im lokalen Repository und fertig. Mit “nu install” kann man dies nun in andere Projekte übernehmen und aktualisieren (am besten wieder über ein Skript oder Batch). Und braucht sich nicht mehr darum zu kümmen wo der kram nun herkommt.

Aktuell kann man die dann noch per “gem push” auf Rubygems.org pushen und dort sieht es dann so aus.

http://rubygems.org/gems/fluentmetadata

Ein Buildscript (mit psake) welches das Gem immer wieder erzeugt kann so aussehen

http://github.com/DerAlbertCom/FluentMetadata/blob/master/default.ps1

Zukunft

Natürlich bringt so ein System nur was wenn es viele, wenn nicht gar alle verwenden. Dann hat man ein schönes Eco-System und viel weniger Probleme und arbeit. Also nutzt es.

Natürlich ist Rubygems.org auf Dauer keine Lösung für uns, und ein eigener Platz für .net gems wäre fein, da wird schon dran gearbeitet und wird nicht mehr so lange auf sich warten lassen.

Aktuell findet man unter http://nu.wikispot.org/ alle wichtigen Informationen und Links.

NU selbst ist weiterhin in Entwicklung in der Mailingliste diskutiert man gerade um es um weitere .net Specifika zu erweitern, mir reicht erstmal die jetzige Funktionalität es fehlen nur weitere Gems für .NET. Also macht mit.

Technorati Tags: ,,,

Neue Folge von Silverlight-Expertise: “Text Trimming” und “Bing Maps für Silverlight”

04.08.2010 11:21:00 | Gregor Biswanger

dotnet-magazin-logo

In der aktuellen Ausgabe vom dot.net magazin gibt es eine neue Folge von meiner Silverlight-Kolumne “Silverlight-Expertise”:  

Silverlight-Expertise - Die Crème de la Crème des Monats

Die Serie „Silverlight Expertise“ des dot.NET Magazins präsentiert monatlich zwei leckere Top-How-Tos zum Thema Silverlight von Gregor Biswanger (www.dotnet-blog.net), sodass Einsteiger und fortgeschrittene Silverlight-Experten durch geballtes Wissen gesättigt werden. Heute stehen auf der Menükarte „Text Trimming“ und „Bing Maps für Silverlight“. Viel Spaß und einen guten Appetit.

dotnet-magazin_082010

Zu lesen sind die How-To´s beim dot.net magazin, Ausgabe 09/2010.

Arc Reactor Prop selbst gebaut

04.08.2010 01:14:00 | Daniel Springwald

Zu Kostüm- und Spaßzwecken habe ich mich letzte Woche daran gemacht, ein selbstleuchtendes Arc-Reactor-Prop (bekannt aus dem Film IronMan) zu basteln. Smile

Hier die einzelnen Schritte:

1. Schnittmuster erstellen

Zuerst benötigte ich Schnittmuster für die drei Schichten á 3 mm Sperrholz. Das ging am besten in Corel-Draw und sieht dann so aus:

 


Wer sich ein eigenes Arc-Reactor Prop basteln möchte, kann hier die CDR-Datei auf eigene Gefahr und ohne jedwelche Gewährleistung herunterladen: ArcReactor.cdr (41,26 kb)

2. Schnittmuster ausschneiden

Das geht mit der Laubsäge, dem Teppichmesser oder - wie hier - mit einem Lasercutter:

 

 Die fertig ausgeschnittenden Scheiben inkl. der nicht benötigten Füllungen:

LEDs verlöten

Als Leuchtmittel verwende ich Hochleistungs SMD Leuchtdioden.

Um nicht zu viele Kabel im späteren Gehäuse zu haben und gleichzeitig etwas Wärme von den LEDs abführen zu können, ist es praktisch zwei Kuperringe anzulöten:

Das gleiche noch einmal für den inneren Ring - dort aber mit blauen statt weissen LEDs.

Ganz in der Mitte befindet sich dann schließlich noch eine weisse und zwei blaue LEDs.

Fertig zusammen bauen

Hier dann auch der gleich der erste Test:

Selbst unter einem T-Shirt ist die Leuchtkraft der SMD LEDs noch ernorm:

 

Ein erster "Selbstversuch" bei etwas dunklerem Licht in der Werkstatt...

...und einmal in vollem Tageslicht. Hat alles gut geklappt und scheint praxistauglich.

Mal sehen, ob die LEDs bei längerem Betrieb nicht doch zu warm werden. Dann müsste in einer zweiten Version wahrscheinlich doch mehr Kühlung als die vier Kupferringe eingebaut werden.

 

 

Microsoft veroeffentlichte am 02.08.10 ein kritisches ausserplanmaessiges Sicherheitsupdate: MS10-046 (KB 2286198)

03.08.2010 08:12:01 | Kay Giza

Microsoft hat - wie von mir angekündigt - am 02. August 2010 ein außerplanmäßiges kritisches Sicherheitsupdate (Microsoft Security Bulletin MS10-046 - Critical | Vulnerability in Windows Shell Could Allow Remote Code Execution (2286198)) für alle unterstützten Versionen von Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 und Windows Server 2008 R2 veröffentlicht. Auch betroffen sind Anwender die bereits Windows 7 Service Pack 1 Beta oder Windows Server 2008 R2 Service Pack 1 Beta einsetzen. Sie sollten das nun verfügbare Update umgehend installieren, um Ihren PC vor Angriffen zu schützen! Sollte Ihr Rechner das Sicherheitsupdate nicht automatisch ... [... mehr detaillierte Informationen in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Ein SubText Blog mit dotnet-kicks.de Button

03.08.2010 06:00:00 | Albert Weinert

dotnet-kicks.de erfreut sich in deutschen .NET Welt ja doch einiger Beliebtheit, also bietet es sich an dies auch im eigenen Blog zu unterstützen. Ich habe nun ein Control gebaut mit dem es ganz einfach geht.

Als erstes erstellt man in dem Controls-Ordner seines Skins die Datei KickIt.ascx, und füllt diese mit folgendem Inhalt.

<%@ Control Language="C#" ClassName="KickItDeControl"  
    Inherits="Subtext.Web.UI.Controls.CurrentEntryControl"%>
<% 
	string urlUrl = UrlEncode(Entry.FullyQualifiedUrl );
	string urlTitle = UrlEncode(HttpUtility.HtmlDecode(Entry.Title));
%>
<a href="http://dotnet-kicks.de/kick/?url=<%=urlUrl%>&amp;title=<%=urlTitle%>">
<img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=<%=urlUrl%>" 
     border="0" alt="kick it on dotnet-kicks.de" /></a>

Dies ist ein einfaches Control welches den dotnet-kicks.de-Code erzeugt. Nun muss man das Control noch dort eintragen wo man es Anzeigen lassen (üblicherweise Day.ascx undViewPost.ascx). Zuerst muss das UserControll wie in ASP.NET WebForms üblich registriert werden, dann kann es verwendet werden.
<%@ Register TagPrefix="awn" TagName="KickItDe" Src="KickItDe.ascx" %>

<!-- und nun an die Stelle wo es angezeigt werden soll -->

<awn:KickItDe runat="server"/>

Von nun wird auf jeder geänderten Seite der dotnet-Kicks.de Button angezeigt.

Technorati Tags: ,

Ein SubText Blog mit Flattr-Button

02.08.2010 18:08:33 | Albert Weinert

Nutzt man SubText für das eigenen Blog und möchte man Flattr damit verwenden, so kann man dies auf verschiedenen Weise machen. Hier nun wie ich es gemacht habe.

Als erstes erstellt man in dem Controls-Ordner seines Skins die Datei Flattr.ascx, und füllt diese mit folgendem Inhalt

<%@ Control Language="C#" ClassName="FlattrControl" 
    Inherits="Subtext.Web.UI.Controls.CurrentEntryControl"%>
<script runat="server">
	public string FlattrId {get;set;}	
</script>
<%
	string htmlTitle = HttpUtility.HtmlDecode(Entry.Title).Replace("'","\"");
%>
<script type="text/javascript">
var flattr_btn = 'compact';
var flattr_uid = '<%=FlattrId%>';
var flattr_tle = '<%=htmlTitle%>';
var flattr_dsc = '<%=htmlTitle%>';
var flattr_cat = 'text';
var flattr_lng = 'de_DE';
var flattr_url = '<%=Entry.FullyQualifiedUrl%>';
</script>
<script src="http://api.flattr.com/button/load.js" type="text/javascript"></script>

Dies ist ein einfaches Control welches den Flattr-Code erzeugt. Nun muss man das Control noch dort eintragen wo man es Anzeigen lassen (üblicherweise Day.ascx und ViewPost.ascx). Zuerst muss das UserControll wie in ASP.NET WebForms üblich registriert werden, dann kann es verwendet werden.

<%@ Register TagPrefix="awn" TagName="Flattr" Src="Flattr.ascx" %>

<!-- und dann dort wie man es anzeigen lassen will, als FlattrID muss man die 
 eigene Nummer eintragen -->

<awn:Flattr FlattrId="YourID" runat="server"/>

Von nun wird auf jeder geänderten Seite ein Flattr-Button erstellt.

Technorati Tags: ,

Regeln | Impressum