.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Februar 2009

Excel: Range.Value vs. Range.Value2

28.02.2009 18:18:08 | Lars Keller

Ein Teilnehmer auf der Basta hatte mich gefragt, warum das Range-Object ein Value2 Property besitzt, bzw. warum das Property Value2 heißt und nicht Value.

Range.Value2 ist für die Sprache C# gedacht, da das Property Range.Value für C# Readonly ist. Im IntelliSense wird das Range.Value auch nicht angezeigt. Wenn man sich das Ganze einmal mit dem Lutz Reflector anschaut, dann kann man auch sehen, dass die Range.Value Setter/Getter einen weiteren Parameter benötigen, welchen wir in C# mit Type.Missing extra setzen würden.

Anders sieht es aus, wenn man mit VB.NET entwickelt, da sollte man nicht das Range.Value2 Property benutzen, sondern das Range.Value.



This weblog is sponsored by netcreate OHG.

Excel: Range.Value vs. Range.Value2

28.02.2009 17:18:08 | Lars Keller

Ein Teilnehmer auf der Basta hatte mich gefragt, warum das Range-Object ein Value2 Property besitzt, bzw. warum das Property Value2 heißt und nicht Value.

Range.Value2 ist für die Sprache C# gedacht, da das Property Range.Value für C# Readonly ist. Im IntelliSense wird das Range.Value auch nicht angezeigt. Wenn man sich das Ganze einmal mit dem Lutz Reflector anschaut, dann kann man auch sehen, dass die Range.Value Setter/Getter einen weiteren Parameter benötigen, welchen wir in C# mit Type.Missing extra setzen würden.

Anders sieht es aus, wenn man mit VB.NET entwickelt, da sollte man nicht das Range.Value2 Property benutzen, sondern das Range.Value.

Meine Sessions bei der BASTA! Spring

28.02.2009 10:39:49 | Lars Keller

Zurück von der BASTA! Spring und wie versprochen hier meine Folien und der Code zu den Sessions:

Session: Office und .NET – zwei Welten wachsen zusammen mit VSTO 3.0

Download: Folien

Download: Code Beispiele

Session: Interaktionen in der "Office-Welt" mit .NET

Download: Folien

Download: Code Beispiele

Die Code Beispiele benötigen den SQL Server Express 2008 und die AdventureWorksLT Beispieldatenbank.

Workshop: VSTO in der Praxis

Download: Folien

Download: Code Beispiele

Die Excel Beispiele von Karim:

Download Folien

Download Code Beispiele



This weblog is sponsored by netcreate OHG.

Meine Sessions bei der BASTA! Spring

28.02.2009 09:39:49 | Lars Keller

Zurück von der BASTA! Spring und wie versprochen hier meine Folien und der Code zu den Sessions:

Session: Office und .NET – zwei Welten wachsen zusammen mit VSTO 3.0

Download: Folien

Download: Code Beispiele

Session: Interaktionen in der "Office-Welt" mit .NET

Download: Folien

Download: Code Beispiele

Die Code Beispiele benötigen den SQL Server Express 2008 und die AdventureWorksLT Beispieldatenbank.

Workshop: VSTO in der Praxis

Download: Folien

Download: Code Beispiele

Die Excel Beispiele von Karim:

Download Folien

Excel: Range.Value vs. Range.Value2

28.02.2009 08:18:00 | Lars Keller

Ein Teilnehmer auf der Basta hatte mich gefragt, warum das Range-Object ein Value2 Property besitzt, bzw. warum das Property Value2 heißt und nicht Value.

Range.Value2 ist für die Sprache C# gedacht, da das Property Range.Value für C# Readonly ist. Im IntelliSense wird das Range.Value auch nicht angezeigt. Wenn man sich das Ganze einmal mit dem Lutz Reflector anschaut, dann kann man auch sehen, dass die Range.Value Setter/Getter einen weiteren Parameter benötigen, welchen wir in C# mit Type.Missing extra setzen würden.

Anders sieht es aus, wenn man mit VB.NET entwickelt, da sollte man nicht das Range.Value2 Property benutzen, sondern das Range.Value.

Meine Sessions bei der BASTA! Spring

28.02.2009 00:39:04 | Lars Keller

Zurück von der BASTA! Spring und wie versprochen hier meine Folien und der Code zu den Sessions:

Session: Office und .NET – zwei Welten wachsen zusammen mit VSTO 3.0

Download: Folien

Download: Code Beispiele

Session: Interaktionen in der "Office-Welt" mit .NET

Download: Folien

Download: Code Beispiele

Die Code Beispiele benötigen den SQL Server Express 2008 und die AdventureWorksLT Beispieldatenbank.

Workshop: VSTO in der Praxis

Download: Folien

Download: Code Beispiele

Die Excel Beispiele von Karim:

Download Folien

MSDN Premium mit Visual Studio abzugeben

27.02.2009 15:00:00 | Michael Schwarz

Gestern Abend habe ich auf der .NET Usergroup Franken den restlichen Gewinnern meiner Verlosung ihr Visual Studio 2008 übergeben. Weiter gab es während des Vortrags Bücher für richtige Fragen, die trotz (älteren) Themen wie Visual Studio 2005 immer wieder gerne angenommen wurden.

Heute ist es mal wieder so weit, ich verlose eine weiter MSDN Premium mit Visual Studio Team System. Was müsst ihr dafür tun? Nun, da ich nicht besonders erfinderisch bin, verlinkt einfach auf meinen Blog http://michael-schwarz.blogspot.com/ oder http://netmicroframework.blogspot.com/ und schreibt einen Kommentar hier auf dieser Seite mit dem entsprechenden Link auf eure Seite.

Die Aktion läuft wieder 2-3 Wochen. Die Gewinne könnt ihr euch beim nächsten Treffen der .NET Usergroup Franken dann abholen. Ich wünsche jetzt schon mal viel Glück.

Nebenbei: wer sich noch eine alte Visual Studio 2005 Testversion herunterladen möchte, die gibt’s jetzt wieder, und zwar auf der Getting Started with Microsoft Windows Embedded CE 6.0, braucht man z.B. für erste Gehversuche mit dem .NET Micro Framework.


MS Support hilft Microsoft

27.02.2009 13:47:00 | Michael Schwarz

Nun, ihr ahnt es schon, aber ich muss das einfach noch loswerden. Nachdem ich den Microsoft Support Call zum Thema Eingabe von c:\Programme wieder geöffnet habe, habe ich eben einen Anruf vom Microsoft Next Level Support erhalten. Die zwei Englisch sprechenden Microsoft Support Mitarbeiter haben die Lösung zu dem Problem offiziell als Lösungsvorschlag angenommen. Leider wird es kein Hotfix oder ähnlich mehr für Windows Vista geben.

We are taken your solution in account in future OS. For current OS we will not provide a hotfix for security reasons. In Windows 7 Beta we have the same behaviour. Hopefully it get fixed for release version which is the job of the development team.

It was my pleasure to talk to you today. Following our telephone conversation I will proceed further with the temporary archive of the SRZ….

Microsoft wird diese Lösung evtl. auch als KB Artikel verfassen, das Nutzungsrecht haben sie auf jeden Fall eben schon mal bei mir eingeholt. Mal sehen, ob ich (Michael Schwarz Support) noch ein paar Bugs oder Lösungen finde.


Jetzt kann ichs ja sagen – Meine erste Session ist gehalten! (auf der basta!)

27.02.2009 10:13:16 | Jan Schenk

Wow, ich bin platt. Ich habe gestern meine erste echte eigene Session für und im Namen von Microsoft gehalten. Windows Azure.

Und?

Es war grossartig! Mir hat’s total viel Spass gemacht, auch wenn ich eine Demo sowas von verhauen habe, und mir die Zeit davon lief. Ich habe dann zum Glück das Projekt in funktionstüchtigem Zustand noch auf der Platte gehabt (Danke für den Tipp, Oliver!), und das hat mir die Zeit und die Präsentation gerettet.

Ansonsten bin ich echt mehr als zufrieden, gute Fragen kamen auch. Es waren nicht viele Zuhörer, aber die die da waren, waren auch tatsächlich beim Thema. Ich muss halt noch lernen, die Zeit besser einzuschätzen, aber hey, meine erste Session ist gehalten.weltweit_guenstig

Und für alle nochmal der echt gute Werbeslogan eines Internet-Cafes hier in Darmstadt:

 

WELTWEIT GÜNSTIG SURFEN & CHATTEN

 

Als ob ich das nicht erwartet hätte…

 

Tatsächlich freue ich mich schon aus die CeBIT! Nur dass ich da auch wieder die erste Session halten werde. So wie heute. Gut, es war der letzte Tag, aber dafür um 8:30 Uhr. Brrrr, nichts für Developer, diese Uhrzeit. Wenigstens habe ich so keine Zeit gehabt, um nervös zu werden. Think Positive!

Liebe basta!-Teilnehmer und Besucher meiner Session: Vielen Dank fürs Zuhören, ich fand euch super!

Viele Grüße,

jan

Finally, Mr. Loker is Twitter-ized as well

27.02.2009 08:15:29 | Andre Loker

Yeah, I’m late – anyway, I’ve signed up with Twitter.

http://twitter.com/aloker

If you hurry you can be my first follower! (No prices to win, though)

1&1 und Microsoft bieten Studenten-Server inklusive Design- und Entwicklungssoftware

27.02.2009 00:13:10 | Oliver Scheer

clip_image001Für knapp 40 Euro monatlich können Studierende jetzt einen eigenen dedizierten Server im 1&1-Rechenzentrum betreiben und erhalten darüber hinaus Zugang zur Microsoft-Initiative DreamSpark. DreamSpark ermöglicht den kostenlosen Download von Design- und Entwicklungssoftware wie Visual Studio 2008, Expression Studio 2 oder SQL Server 2008. Um das Angebot von 1&1 und Microsoft nutzen zu können, ist ein Freischaltcode notwendig, der bei 1&1 angefordert werden kann. Mehr Informationen: Microsoft Studenten-Server - Promotionsangebot bis zum 31.03.2009

Microsoft Student Experience -- das Studentenportal von Microsoft mit umfassende Ressourcen (nicht nur für Informatikstudenten)

27.02.2009 00:07:59 | Oliver Scheer

Norbert Schumann vom Berliner Bildungsteam hat uns eben darauf aufmerksam gemacht, dass die neue Microsoft Student Experience ab sofort online ist.

Die Microsoft Student Experience ist ein Portal für Studierende. Unter den drei Oberbegriffen „Studieren“, „Planen“ und „Leben gibt es ein wahres Füllhorn an Informationen, Tipps, Vorlagen zum kostenlosen Download, Lifestyle-Themen und und und… Beispielsweise Tutorials zum Thema Zeitmanagement, Hilfe und Beratung bei der Suche nach einem Auslandsstudium, aus dem Leben gegriffene Stories und mehr.

student

Sowohl vom Informationsgehalt, wie auch vom Unterhaltungswert – und auch vom Design her – ist die Website wirklich gut gelungen. Gefällt mir gut.

dreamspark

In diesem Zusammenhang auch erwähnenswert (wenn auch bereits ein Riesenerfolg und daher sicher sowieso schon bekannt): Microsoft DreamSpark: Das kostenlose Programm für Studierende mit dem sie kostenlosen Zugriff auf Microsoft Designer- und Entwicklertools haben. Natürlich Expression Studio, aber auch XNA Game Studio für Spieleentwicklung, Visual Studio und SQL Server und das Robotics Developer Studio 2008.

Links:

XTOPIA [kompakt] – die UX/Web/RIA Roadshow 09

26.02.2009 23:58:08 | Oliver Scheer

Kostenlos und im April/Mai vor Ort in Ihrer Stadt!

Microsofts Webkonferenz XTOPIA geht auf Deutschlandtour: Gemeinsam mit dem deutschen RIA Forum und mit hochrangingen Partnern wie den Publishingexperten von Quark und den CRM-Profis von CAS präsentieren Experten von Microsoft in sechs deutschen Städten im April und Mai 2009 ein Feuerwerk der Neuheiten und Innovationen rund um die Themen Web, User Experience und Silverlight/Rich Internet Applications.

clip_image001

Die Teilnehmer der kostenlosen Roadshow XTOPIA [kompakt] erwartet eine Fülle spannender Sessions zu brandaktuellen Themen, darunter Microsoft Surface/Multitouch, Windows 7, Internet Explorer 8, Windows Live Services für Webentwickler und natürlich zu Silverlight, sowie spannende Gastvorträge und hilfreiche Informationen, u.a. zur Frage wie Agenturen und Webdienstleister mit Microsoft Visio Zeit und Geld sparen können. Außerdem berichten Ergosign, Pixelpark, UID, Syzygy und weitere führende Agenturen aus der deutschen Designszene frei und unzensiert über ihre Erfahrungen mit Silverlight und WPF.

Die Teilnahme an der XTOPIA [kompakt] ist kostenlos – allerdings sind nur jeweils ca. 100 Teilnehmerplätze pro Veranstaltungsort verfügbar, eine baldige Anmeldung ist daher unbedingt notwendig.

Kostenlose Anmeldung und alle weiteren Infos sowie ausführliche Themenübersicht unter http://blogs.msdn.com/steffenr/archive/2009/02/24/xtopia-kompakt-die-ux-web-ria-roadshow-09-kostenlos-und-im-april-mai-vor-ort-in-ihrer-stadt.aspx oder http://snipurl.com/cjz9e

Sponsoren und Partner der XTOPIA [kompakt] 09:

clip_image002

Meet&Greet @ CeBIT: yourExpression-Initiator und Expression-MVP Daniel Greitens

26.02.2009 21:39:59 | Steffen Ritter

Was ihr schon immer zu Silverlight, WPF und Expression wissen wolltet, aber nie zu fragen wagtet… oder wenn Ihr einfach nur wissen wollt, wie Daniel Greitens in Wirklichkeit aussieht: besucht Ihn auf der CeBIT! Die meiste Zeit findet Ihr ihn auf dem Hauptstand von Microsoft in Halle 4, Stand A 26 und dort am Arbeitsplatz M13 beim Thema Web-Applications.

Und als Highlight: jeden Tag um 12:20 und 17:20 steht Daniel im Microsoft CeBIT-Kino und begeistert die Massen ;)

Einen Link auf den Standplan gibt’s auch: http://www.microsoft.com/germany/msdn/events/cebit/2009/standplan.mspx

Daniel Greitens ist Geschäftsführer der Agentur maximago, MVP, Gründer der Expression-Community www.yourExpression.de und Autor des Buches User-Interface-Design mit Microsoft Expression Blend 2. Neue Wege bei der Gestaltung, Entwicklung von Benutzeroberflächen für WPF- und Silverlight-Anwendungen.

Webcasts: Der Solution Architect im Fokus mit VSTS 2010

26.02.2009 15:59:00 | Christian Binder

Sehen Sie auf Basis des VSTS 2010 November CTP's, wie der Solution Architekt mit der neuen VSTS Architekt Edition unterstützt werden wird. Die Webcasts stelllen nicht nur die Funktionen der VSTS 2010 Architekt Edition vor, sondern auch andere Bereiche. 

Im Fokus des ersten Teils sind Requirements, System Design und System Development. 
Im Fokus des zweiten Teils sind System Test und die Analyse bestehender System mit dem Architect Explorer.
Alles aus Sicht des Solution Architects.

Der Solution Architect im Fokus mit VSTS 2010 (Teil 1 von 2)

Der Solution Architect im Fokus mit VSTS 2010 (Teil 2 von 2)

Erhalten Sie einen ersten Überblick.  

Viel Spass

Chris

Expression Media 2 ServicePack 2 für Mac + Windows verfügbar

26.02.2009 10:56:23 | Steffen Ritter

Ab sofort ist das deutsche ServicePack 2 für die Foto- und Medienverwaltung Expression Media 2 für Mac und Windows verfügbar.

Das Update behebt diverse Fehler und Probleme, darunter:

  • Das gleichzeitige Importieren von mehreren großen Bildern wurde sehr langsam ausgeführt.
  • Beim XML-Export und -Import wurden benutzerdefinierte Felder möglicherweise verschlüsselt.
  • Bei Katalogen, die auf einem Macintosh-Computer gespeichert wurden, gingen Dateipfade zu den Originalmedien verloren, wenn Sie über einen Server auf einem Computer unter Windows geöffnet werden.
  • Beim Kopieren von Elementen in einen neuen Katalog wurden die Originaldateipfade und keine neuen Pfade verwendet.
  • Silverlight 2.0 wurde von Mozilla Firefox-Browsern nicht ordnungsgemäß erkannt, wenn Sie Silverlight-HTML-Kataloge anzeigen.
  • Für Miniaturansichten wurde das eingebettete Farbprofil einer Datei nicht verwendet (Miniaturansichten müssen neu erstellt werden, damit diese Korrektur sichtbar wird).
  • Die Benutzereinstellung für das Renderingmodul wurde nicht immer verwendet.
  • Nachdem Sie in der Ansicht Liste eine Sortierung vorgenommen haben, wurde die falsche Datei geöffnet, wenn Sie mit der rechten Maustaste auf eine Datei klicken, um sie in einer Standardanwendung zu öffnen.
  • Beim Verschieben von hierarchischen Schlüsselwörtern wurden einfache Schlüsselwörter möglicherweise nicht ordnungsgemäß auf Bilder angewendet.
  • Beim Ausführen von Skripts für Anmerkungen wurde Text durch Einfügen von Unicode-Zeichen entstellt.
  • Die Dateipfade wurden beschädigt, wenn der importierte Ordner mehr als 1.024 Unterordner enthält.
  • Bei der Option Pfade zurücksetzen trat möglicherweise ein Fehler auf, wenn ein Pfad zum Stammverzeichnis eines Laufwerks festgelegt wird.
  • Bei Expression Media 2 trat möglicherweise ein Programmabsturz auf, wenn eine Datei aus einem Ordner importiert wird, der aus dem Panel Organisieren entfernt wurde.
  • Bei Expression Media 2 trat möglicherweise ein Programmabsturz auf, wenn Sie einen Importvorgang abbrechen und anschließend Dateien aus dem Stammverzeichnis eines Laufwerks importieren.
  • Beim Umbenennen eines Ordners in einer Netzwerkfreigabe trat möglicherweise ein Fehler auf, und der Ordner wird möglicherweise nicht mehr im Panel Organisieren angezeigt.
  • Dateien, deren Namen mehr als 64 Zeichen aufweisen, wurden immer wieder importiert, wenn Sie Ordner im Panel Organisieren aktualisieren.
  • In gespeicherten Katalogen wurden keinen zusätzlichen Ordner im Panel Organisieren hinzugefügt, wenn es sich beim Namen des Datenträgervolumes um den Systemstandardnamen handelt. Der Systemstandardname lautet normalerweise „Lokales Laufwerk“.
  • Die Größe von TIFF RAW-Dateien aus Phase One-Digital Backs erschien innerhalb eines Katalogs höher.
  • In Katalogordnern wurden möglicherweise Zufallszahlen angezeigt, wenn der Datenträger keinen Volumenamen aufweist.
  • HTML-Kataloglinks enthielten beim Anzeigen in Mozilla Firefox-Browsern Fragezeichen.

Downloads:

Sprecher für WPF/Silverlight Konferenz in Köln gesucht

25.02.2009 23:28:16 | Roland Weigelt

Die .NET User Groups Bonn (Bonn-to-Code.Net) und Köln (.net user group Köln) veranstalten am 15. Mai 2009 in Köln in den Räumen der neuen Microsoft-Niederlassung ein gemeinsames Community Event zu den Themen WPF und Silverlight – die dotnet Cologne 2009.

Das Ziel ist, den Teilnehmern (ca. 150-200) zum Selbstkostenpreis einen ganzen Tag mit praxisnahen Vorträgen (verteilt auf zwei Tracks) inkl. Verpflegung und einer abschließender Verlosung von Sachpreisen zu bieten.

Dafür suchen wir noch Sprecher, die dem Publikum zeigen, dass WPF und Silverlight mehr sind als nette Spielereien. Die zeigen, wie aus technischen Features konkreter Mehrwert in echten Anwendungen in richtigen Projekten wird.

Bis zum 8. März 2009 läuft der "Call for Papers", bei dem Vorschläge für Vorträge bei der dotnet Cologne 2009 eingereicht werden. Die Länge einer Session (Vortrag plus Fragen) beträgt 60 Minuten.

Bitte schickt Eure Vorschläge mit

  • Titel des Vortrags
  • Abstract
  • Kurzbiographie
  • E-Mail Adresse
  • optional: Website/Blog

an orga [at] dotnet-cologne.de.

Die Veranstaltung ist als Event von der Community für die Community so kalkuliert, dass wir leider keine Honorare für Sprecher zahlen können, allerdings übernehmen wir gerne für Sprecher mit einer etwas weiteren Anreise (und ggf. Übernachtung) die Reisekosten bis zu einer Höhe von 200,- Euro.

Wie geht’s weiter mit den Web Browsern?

25.02.2009 17:00:00 | Michael Schwarz

Der Internet Explorer 8 lässt immer noch auf sich warten, auch wenn bereits auf manchen Blogs etwas vom April steht.

Währenddessen versuchen Web Entwickler die immer noch recht hohe Anzahl der IE 6 Installationen zu verbannen. Mit Hilfe von veränderten Web Seiten machen sie die Internetnutzer darauf aufmerksam.

Gleichzeitig wurde erst vor kurzem der neue Internet Explorer 6 für Windows Mobile vorgestellt. Dieser verwendet die Render Engine vom IE 6 und die JavaScript Engine vom IE 8, und zeigt die Web Seiten verglichen mit dem alten PocketIE natürlich tausendmal besser an, aber eben wieder nur veraltet. Davor hatten wir alle auf DeepFish gehofft, ein Browser, der Screenshots zum Browser geschickt hat, anstatt selber zu rendern, doch daraus wurde nichts. (Wie hieß es da nochmal: Enhanced Browsing for your Mobile Device.)

Die letzten Monate habe ich immer wieder Bugs in der aktuellen Beta des IE 8 gefunden. Soll ich mir vielleicht den IE 8 Blocker installieren?

Die Welt ist einfach noch nicht bereit für den IE 8. Stephan schreibt darüber, was den Firefox so beliebt macht, auch wenn ich dem nicht zustimmen kann, denn Plug-Ins braucht man ich nicht wirklich, hatte mit verschiedenen Plug-Ins zu viele Probleme.

Heute lese ich dann, dass Microsoft die Gazelle frei lässt:

Der von Microsoft angekündigte Webbrowser "Gazelle", soll mit einem neuen technischen Konzept aufwarten. Wie Netbux berichtet, umfasst das Konzept einen sehr schlank und effizient gehaltenen Browser-Kern. Jede einzelne aufgerufene Web-Anwendung soll von ihm eigene, unabhängige Ressourcen und Prozesse zugewiesen bekommen.

Wow, ist das jetzt etwa die Antwort auf meinen Wunsch, einen Web Browser ohne die ganzen Tools und Features zu bekommen? Eine Render Engine, die alle Hardwarekomponenten verwendet, um HTML so schnell wie möglich zu rendern?

Je mehr man über Gazelle liest, umso häufiger kommen Begriffe auf wie Browser OS, also einem Web Browser Betriebssystem.

Und sicher(-er) soll das ganze auch noch sein:

Gazelle's security model is centered around protecting principals from one another by separating their respective resources into hardware-isolated protection domains. Any sharing between two different principals must be explicit using cross-principal communication (or IPC) mediated by Browser Kernel.

Ach ja, fast hätte ich es vergessen: Apple hat ja erst vor kurzem seinen neuen Safari 4 auf die Menschheit losgelassen, endlich auch im richtigen Windows Thema. Der ist natürlich viel schneller als Google Chrome, logisch.

Ob Gazelle wirklich etwas taugt, wird man abwarten müssen. Ich bin schon mal richtig gespannt, denn die Hoffnung stirbt als letztes. In wie weit das in den Internet Explorer einfließt, weiß natürlich niemand.


Webcast: VSTS 2008-Grundlagen der Lokalisierung mit WinForms

25.02.2009 15:46:00 | Christian Binder

Lokalisierung von Software ist immer häufiger ein Thema für Software Entwickler und meistens ist es nicht das, was man am liebsten tut oder? Daher habe ich Sven Hubert AIT gebeten, eine Einführung ins Thema zu geben. Sven Hubert hat hier schon einiges an Projekt Erfahrung gesammelt und erklärt die Basics in einem kurzweiligen 30min Webcast. Wir starten mit WinForms und legen noch einen Webcast für WPF nach :-)  

Download hier

Viel Spass

Chris

Virtual Earth – Einen Routenplaner in ASP.NET selber bauen – Erweiterungen 2

25.02.2009 15:37:24 | Jan Schenk

Bernd hat mich in einem vorherigen Post darauf hingewiesen, dass ich mir die Anweisungen auf englisch ausgeben lasse, und ob das auch auf deutsch geht.

Die gute Nachricht: Ja, es geht.

Die zweite gute Nachricht: Es ist ziemlich einfach!

Die eingebettete Karte hat in den Properties unter Features einen Auswahlpunkt “Locale”. Stellt man den auf de_de, dann gibt es in der Route deutsche Anweisungen.

Händisch würde man das in der Default.aspx so lösen:

   1: [...]
   2: <ve:Map ID="MyMap" runat="server" Height="550px" Width="550px" ZoomLevel="4" 
   3:     Center-Latitude="40" Center-Longitude="22" 
   4:     onservergetdirections="MyMap_ServerGetDirections" Locale="de_de" />
   5: [...]

 

<edit>

so müsste es eigentlich gehen, ich bekomme aber einen Fehler, dass ich diesen Wert nicht zur Laufzeit ändern kann…

 

/*Oder im CodeBehind so:

   1: [...]
   2: protected void GenerateRoute_Click(object sender, EventArgs e)
   3: {
   4:     Map1.Locale = SupportedLocales.de_de;
   5: [...]
   6: }

*/

</edit>

Mein Dank geht an Bernd für diesen Hinweis!

jan

Virtual Earth – Einen Routenplaner in ASP.NET selber bauen – Erweiterungen

25.02.2009 15:26:00 | Jan Schenk

Zusätzlich zu den im Webcast gezeigten Features gibt es natürlich noch unzählige Details, die man in einen eigenen Routenplaner einbauen kann.

Wichtig wäre zB noch die Ausgabe der Gesamtwegstrecke und der Gesamtfahrzeit.

In meiner Default.aspx-Seite schaffe ich erst mal Platz für die Ausgabe:

   1: [...]
   2: <asp:Label ID="RouteProps" runat="server"></asp:Label>
   3: <br />
   4: // hier kommt dann das GridView
   5: [...]
Danach lege ich in meiner Default.aspx.cs zwei Variablen an, die ich mit den entsprechenden Eingenschaften der Route e befülle, bzw vorher noch in eine adäquate Einheit umgerechnet werden:

Default.aspx.cs:

   1: protected void Map1_ServerGetDirections(object sender, Route e)
   2: {
   3:     JanRoute route = JanRoute.CreateRoute(e, TextBox1.Text, TextBox2.Text);
   4:  
   5:     string routeTime = "0h, 0km";
   6:     if (e.Time > 59)
   7:     {
   8:         if(e.Time > 3599)
   9:             routeTime = Convert.ToString(Math.Round(Convert.ToDouble(e.Time) / 60 / 60, 2)) + "h";
  10:         else
  11:             routeTime = Convert.ToString(Math.Round(Convert.ToDouble(e.Time) / 60, 2)) + "min";
  12:     }
  13:  
  14:     string routeDist = Math.Round(e.Distance, 2) + "km";
  15:  
  16:     RouteProps.Text = routeTime + ", " + routeDist + "<br />";
  17:  
  18:     WaypointGrid.AutoGenerateColumns = true;
  19:     WaypointGrid.DataSource = route.Waypoints;
  20:     WaypointGrid.DataBind();
  21:  
  22: }

Etwas ähnliches sollte auch für jeden einzelnen Wegpunkt und dessen Entfernungs- und Zeit-Eigenschaft vorgenommen werden.

Eine Auswahl, ob die Entfernung in Kilometern oder Meilen angegeben werden soll lässt sich über zwei Radiobuttons realisieren:

Default.aspx:

   1: [...]
   2: <asp:RadioButton ID="RadioKm" Text="Kilometer" GroupName="DistanceUnit" runat="server" />
   3: <asp:RadioButton ID="RadioMls" Text="Meilen" GroupName="DistanceUnit" runat="server" />
   4: // zB direkt über den Buttons zum Abschicken der Routenberechnung
   5: [...]
   6:  

Die Default.aspx.cs-Datei modifiziere ich dafür in zwei Funktionen:

   1: protected void Button1_Click(object sender, EventArgs e)
   2: {
   3:     RouteOptions ro = new RouteOptions();
   4:  
   5:     ro.DistanceUnit = RouteDistanceUnit.Kilometer;  // default fallback
   6:     if (RadioKm.Checked)
   7:         ro.DistanceUnit = RouteDistanceUnit.Kilometer;
   8:     if (RadioMls.Checked)
   9:         ro.DistanceUnit = RouteDistanceUnit.Mile;
  10:  
  11: [...]
  12: }
  13:  
  14: // und hier
  15:  
  16: protected void Map1_ServerGetDirections(object sender, Route e)
  17: {
  18:     JanRoute route = JanRoute.CreateRoute(e, TextBox1.Text, TextBox2.Text);
  19:     
  20:     string distUnit = "km";
  21:     if (RadioKm.Checked)
  22:         distUnit = "km";
  23:     if (RadioMls.Checked)
  24:         distUnit = "mls";
  25:  
  26: [...]
  27:  
  28:     string routeDist = Math.Round(e.Distance, 2) + distUnit;
  29: [...]
  30: }
  31:  

So viel für jetzt, seid ihr mal kreativ und zeigt mir, was ihr noch hinzugefügt habt!

Rock on,

jan

Webcast Virtual Earth – Einen Routenplaner in ASP.NET selber bauen

25.02.2009 15:12:06 | Jan Schenk

Get Microsoft Silverlight

Wenn ich schon einzelne Routen berechnen lassen und anzeigen lassen kann, dann sollte doch auch eine eigene Einbettung als Routenplaner nicht so kompliziert sein.

Eine Ausgabe der einzelnen Wegpunkte in HTML hilft, wenn man die Route ausdrucken und unterwegs im Auto verwenden möchte. Das Ganze “schön” in einem GridView aufbereitet, dass man sich während des Fahrens nicht mit Suchen ablenkenk lässt.

Ist das schwer? Jein, eigentlich nicht, aber es ist ein bisschen Code notwendig. Den Aufbau der Seite und die dahinter liegende Logik sehen wir in diesem Video.


Dazu gibts hier den gesamten Code und noch ein paar kleine Erweiterungen des Projektes aus dem Video in Codeform:

Default.aspx (als WebContentForm zu einer MasterPage, die einen ScriptManager enthält!):

   1: <div class="container">
   2: <asp:UpdatePanel ID="UpdatePanel1" runat="server">
   3:     <ContentTemplate>
   4:         <div class="leftdiv">
   5:             Routenplanung<br />
   6:             <br />
   7:             VON:
   8:             <asp:TextBox ID="TextBox1" runat="server" CssClass="inputBoxes"></asp:TextBox>
   9:             <br />
  10:             <asp:PlaceHolder ID="PlaceHolder1" runat="server" Visible="False">
  11:             Zw.Stop:
  12:             <asp:TextBox ID="TextBox3" runat="server" CssClass="inputBoxes"></asp:TextBox>
  13:             <br />
  14:             </asp:PlaceHolder>
  15:             NACH:
  16:             <asp:TextBox ID="TextBox2" runat="server" CssClass="inputBoxes"></asp:TextBox>
  17:             <br />
  18:             <br />
  19:             <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
  20:                 Text="Route berechnen" />
  21:             <asp:Button ID="Button2" runat="server" Text="Über" onclick="Button2_Click" />
  22:             <br />
  23:             <br />
  24:             <asp:GridView ID="WaypointGrid" runat="server">
  25:             </asp:GridView>
  26:         </div>
  27:     </ContentTemplate>
  28: </asp:UpdatePanel>
  29: <div class="rightdiv">
  30:     <ve:Map ID="Map1" runat="server" Center-Latitude="48.1761" 
  31:         Center-Longitude="11.5571" Height="400px" Width="400px" ZoomLevel="4" 
  32:         onservergetdirections="Map1_ServerGetDirections" />
  33: </div>
  34: </div>

Die CodeBehind-Datei sieht so aus (Default.aspx.cs):

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7: using Microsoft.Live.ServerControls.VE;
   8:  
   9: namespace RoutePlanner
  10: {
  11:     public partial class Default : System.Web.UI.Page
  12:     {
  13:         protected void Page_Load(object sender, EventArgs e)
  14:         {
  15:             if (!IsPostBack)
  16:                 TextBox1.Focus();
  17:         }
  18:  
  19:         protected void Button1_Click(object sender, EventArgs e)
  20:         {
  21:             RouteOptions ro = new RouteOptions();
  22:             ro.DistanceUnit = RouteDistanceUnit.Kilometer;
  23:             ro.SetBestMapView = true;
  24:             ro.DrawRoute = true;
  25:  
  26:             List<string> locations = new List<string>();
  27:  
  28:             locations.Add(TextBox1.Text);
  29:  
  30:             if (TextBox3.Text.Length > 2)
  31:                 locations.Add(TextBox3.Text);
  32:  
  33:             locations.Add(TextBox2.Text);
  34:  
  35:  
  36:             Map1.GetDirections(locations, ro);
  37:         }
  38:  
  39:         protected void Map1_ServerGetDirections(object sender, Route e)
  40:         {
  41:             JanRoute route = JanRoute.CreateRoute(e, TextBox1.Text, TextBox2.Text);
  42:  
  43:  
  44:             WaypointGrid.AutoGenerateColumns = true;
  45:             WaypointGrid.DataSource = route.Waypoints;
  46:             WaypointGrid.DataBind();
  47:  
  48:         }
  49:  
  50:         protected void Button2_Click(object sender, EventArgs e)
  51:         {
  52:             PlaceHolder1.Visible = !PlaceHolder1.Visible;
  53:         }
  54:     }
  55: }

 

Und dann haben wir noch zwei Klassen-Dateien:

WaypointMaker.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using Microsoft.Live.ServerControls.VE;
   6:  
   7: namespace RoutePlanner
   8: {
   9:     public class WaypointMaker
  10:     {
  11:  
  12:         public WaypointMaker()
  13:         { 
  14:         }
  15:  
  16:         public string Id { get; set; }
  17:         public string Instruction { get; set; }
  18:         public string Time { get; set; }
  19:         public string Distance { get; set; }
  20:         public LatLongWithAltitude LatLon { get; set; }
  21:  
  22:     }
  23: }

und

JanRoute.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using Microsoft.Live.ServerControls.VE;
   6:  
   7: namespace RoutePlanner
   8: {
   9:     public class JanRoute
  10:     {
  11:  
  12:         public JanRoute()
  13:         { 
  14:         }
  15:  
  16:         public string FromLocation { get; set; }
  17:         public string ToLocation { get; set; }
  18:  
  19:         private List<WaypointMaker> _waypoints = new List<WaypointMaker>();
  20:  
  21:         public WaypointMaker[] Waypoints
  22:         {
  23:             get { return _waypoints.ToArray(); }
  24:             set {
  25:                 foreach (WaypointMaker wp in value)
  26:                 {
  27:                     AddNewWaypoint(wp);
  28:                 }
  29:             }
  30:         }
  31:  
  32:         public void AddNewWaypoint(WaypointMaker wp)
  33:         {
  34:             if (!_waypoints.Contains(wp))
  35:                 _waypoints.Add(wp);
  36:         }
  37:  
  38:         internal static JanRoute CreateRoute(Microsoft.Live.ServerControls.VE.Route e, string from, string to)
  39:         {
  40:             JanRoute route = new JanRoute();
  41:             route.FromLocation = from;
  42:             route.ToLocation = to;
  43:  
  44:             List<RouteLeg> rlegs = e.RouteLegs;
  45:             int num = 0;
  46:             foreach (RouteLeg leg in rlegs)
  47:             {
  48:                 List<RouteItineraryItem> items = leg.Itinerary.Items;
  49:                 foreach (RouteItineraryItem item in items)
  50:                 {
  51:                     WaypointMaker wpm = new WaypointMaker()
  52:                     {
  53:                         Id = Convert.ToString(num),
  54:                         Instruction = item.Text,
  55:                         Distance = Convert.ToString(item.Distance),
  56:                         Time = Convert.ToString(item.Time),
  57:                         LatLon = item.LatLong
  58:                     };
  59:                     route.AddNewWaypoint(wpm);
  60:                     num++;
  61:                 }
  62:  
  63:             }
  64:             return route;
  65:         }
  66:  
  67:     }
  68: }

 

Wenn ihr hier weiter lest, findet ihr noch ein paar kleine Erweiterungen, die im Video nicht mehr unter gekommen sind.

Viel Spass damit!
jan

Teste deine Webanwendungen in allen 7 gängigen Browsern...

25.02.2009 14:35:00 | Klaus Bock

...ohne die Browser lokal installiert zu haben.
Wer's nicht glaubt soll es sich auf der Seite von xenocode hier selber ansehen.

Edit 27.02.2009: Ich bin anscheinend einer der wenigen, bei dem alles ohne Probleme ablief. Nach dem mich Jürgen Gutsch freundlicherweise auf den Artikel von Dirk Jesse aufmerksam gemacht hat, war mir schnell klar, dass meine Neugierde auch wirklich schief gehen hätte können.

Technorati-Tags: | | | | | |

Für diesen Befehl ist nicht genügend Serverspeicher verfügbar

25.02.2009 14:22:00 | Michael Schwarz

In den letzten Wochen habe ich immer wieder mal große Dateien größer als 50 GB über Rechnergrenzen kopieren müssen. Ab und an habe ich folgende Fehlermeldung bekommen:

Der Vorgang konnte aufgrund eines unerwarteten Fehlers nicht durchgeführt werden. Notieren Sie sich den Fehlercode, da dieser eventuell bei der weiteren Problembehebung hilfreich sein kann:

Fehler 0x8007046A: Für diesen Befehl ist nicht genügend Serverspeicher verfügbar.

Ordner kopierenKomischerweise ist der Fehler immer dann aufgetreten, wenn ich von einem UNC Pfad etwas auf eine USB Platte kopieren wollte, das scheint aber nur Zufall gewesen zu sein.

Weitere Nebenwirkung war, dass man danach auf den Server weder per UNC noch per Remote Desktop zugreifen konnte.

Nach einer Recherche im Internet habe ich einen Registryeintrag gefunden, der das Problem (bis jetzt) behoben hat.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\IRPStackSize

Unter LanmanWorkstation gibt es den gleichen Parameter. Beide habe ich sowohl auf dem Client als auch auf dem Server auf 80 (dezimal) gestellt, das scheint wohl der Maximalwert zu sein. Und siehe da, es funktioniert!


Noch ein letztes Wort zu C:\Programme und C:\Program Files

25.02.2009 13:51:00 | Michael Schwarz

Wer mein Blog liest, der weiß, dass ich mich über das Fehlverhalten des Windows Explorers unter Windows Vista als auch der aktuellen Beta von Windows 7 aufrege. Wie es aussieht, ist das ja alles so gewollt, und wir Deutsche müssen uns endlich abfinden, dass das eben nicht geht. (Oder doch nicht? Weiter unten ist die Lösung, für alle, die nicht weiterlesen möchten!)

Während meiner Tests habe ich die verschiedenen Sprachversionen noch einmal unter die Lupe genommen. Der übersetzte Begriff für Program Files kommt immer aus der desktop.ini:

[.ShellClassInfo]
LocalizedResourceName=
    @%SystemRoot%\system32\shell32.dll,-21781

In der shell32.dll steht an Position 21781 eben Programme, im Französischen wird der Text Programmes genommen.

Um das fehlerhafte Verhalten in den Deutschen Versionen zu erklären, muss man eine ältere Windows Version installieren, z.B. Windows XP. Bei Windows XP hat man das Programme Verzeichnis auch so benannt, also das lag so wirklich auf der Festplatte. Im Französischen wurde Program Files verwendet, der übersetzte Text kam aus der desktop.ini.

Mit Windows Vista wollte man nun den besseren Weg gehen, Verzeichnisse sollte sprachunabhängig sein. Da es aber noch einige Programme gibt, die z.B. beim Installieren hart-kodiert C:\Programme verwenden, hat man die sogenannten symbolischen Verknüpfungen eingeführt. Diese sollten andere Programme automatisch auf die richtigen Verzeichnisse oder Programme umlenken.

Folgende Fehler gibt es bei den symbolischen Verknüpfungen:

  • man kann im Windows Explorer nicht c:\Programme eingeben
  • ein .NET Programm lässt jeden Zugriff auf c:\Programme nicht zu, man erhält eine DirectoryNotFoundException: Ein Teil des Pfades “c:\Programme” konnte nicht gefunden wrden.
  • ein .NET Programm kann auch keine Dateien unter c:\Programme öffnen

Also, bei mir funktionieren die symbolischen Verknüpfungen nicht, oder ich habe den Sinn immer noch nicht verstanden.

Endlich eine Lösung

Endlich habe ich mich getraut, und c:\Programme über die Kommandozeile gelöscht. Bitte nicht über den Windows Explorer, denn sonst erwischt man das echte Verzeichnis c:\Program Files.

  • Start –> Ausführen und cmd.exe eingeben und mit Administratorrechten ausführen
  • rd c:\Programme löscht dann die Verknüpfung

Jetzt kann ich zwar keine alten Programme mehr verwenden, die direkt auf C:\Programme schreiben möchten, aber das will ich auch nicht.

Wer trotzdem den symbolischen Link braucht, kann diesen (wie auch eigene) mit folgendem Befehl wieder erstellen:

  • Start –> Ausführen und cmd.exe eingeben und mit Administratorrechten ausführen
  • ins Rootverzeichnis mit cd /D %systemdrive%\ wechseln
  • mklink.exe /J Programme “c:\Program Files” erzeugt eine dort als Verbindung deklarierte Verknüpfung
  • attrib +H c:\Programme versteckt diese Verknüpfung

Toll, nach dem manuellen Ausführen von mklink.exe gehen auch alle meine .NET Testprogramme richtig. Wo ist nur der Fehler, warum geht das auf einem sauberen Windows Vista nicht richtig? Ich werde wohl doch keine Ruhe geben, und gleich einen virtuellen PC basteln, Nr. 1098.

Wie immer gilt, dass ich keine Garantie übernehmen kann. Also, vielleicht vorher alles ordentlich sichern oder so.


Booten von einem USB Stick – Warum funktionieren nicht alle USB Sticks?

25.02.2009 12:03:00 | Michael Schwarz

Vor einiger Zeit habe ich erklärt, wie man z.B. Windows 7 von einem USB Stick anstatt einer DVD installiert. Dabei haben einige Anwender berichtet, dass ihre USB Sticks leider nicht booten möchten. Das Problem ist, dass der Bootsektor fehlt. Deswegen hier noch einmal eine kurze Anleitung zum Installieren von Windows 7 über einen USB Stick:

Um den USB als Bootimage zu verwenden, muss man ihn erst einmal formatieren, und dann eine aktive Partition anlegen. Das geht unter Windows Vista mit diskpart.exe:

  • Start –> Ausführen anklicken, dann diskpart.exe starten
  • lis dis eingeben um alle lokalen Laufwerke anzuzeigen
  • Hat man den USB Stick gefunden (z.B. anhand der Größe), diesen mit sel dis 3 auswählen, wobei N die Datenträgernummer ist, die bei 0 anfängt zu zählen, bei mir ist es also das vierte Laufwerk.
  • Mit lis par kann man sich die aktuellen Partitionen anzeigen lassen.
  • Mein USB Stick hat nur eine Partition, diese wähle ich mit sel par 1 aus (Achtung, hier fängt die Nummerierung wieder bei 1 an).
  • Mit format fs=NTFS LABEL=”Windows 7” QUICK OVERRIDE formatiere ich den USB Stick, das geschieht auch gleich ohne zusätzliche Nachfrage.
  • Ist die Formatierung beendet, setze ich mit active die aktuelle Partition auf aktiv und beende DiskPart mit exit.

Danach muss man den Bootsektor auf den USB Stick übertragen, das geht mit einem Tool auf der Windows 7 DVD. Dafür einfach die ISO Datei mit dem 7-Zip Manager entpacken, und danach folgenden Befehl ausführen:

  • Start –> Ausführen anklicken, dann cmd.exe starten
  • Nun in das entpackte ISO Verzeichnis wechseln, bei mir ist es cd \ISO\Win7
  • Jetzt in das Unterverzeichnis boot mit cd boot wechseln, und dort den Befehl bootsect /nt60 G: (wobei hier G: mein USB Stick Laufwerksbuchstaben ist)

Danach werden einfach noch alle Dateien von der ISO Datei kopiert.


XTOPIA [kompakt] – die UX/Web/RIA Roadshow 09

25.02.2009 11:22:00 | Lori Grosland

 

Microsofts Webkonferenz XTOPIA geht auf Deutschlandtour: Gemeinsam mit dem deutschen RIA Forum und mit hochrangingen Partnern wie den Publishingexperten von Quark und den CRM-Profis von CAS präsentieren Experten von Microsoft in sechs deutschen Städten im April und Mai 2009 ein Feuerwerk der Neuheiten und Innovationen rund um die Themen Web, User Experience und Silverlight/Rich Internet Applications.

Xtopia-kompakt-Logo-weiss

Die Teilnehmer der kostenlosen Roadshow XTOPIA [kompakt] erwartet eine Fülle spannender Sessions zu brandaktuellen Themen, darunter Microsoft Surface/Multitouch, Windows 7, Internet Explorer 8, Windows Live Services für Webentwickler und natürlich zu Silverlight, sowie spannende Gastvorträge und hilfreiche Informationen, u.a. zur Frage wie Agenturen und Webdienstleister mit Microsoft Visio Zeit und Geld sparen können. Außerdem berichten Ergosign, Pixelpark, UID, Syzygy und weitere führende Agenturen aus der deutschen Designszene frei und unzensiert über ihre Erfahrungen mit Silverlight und WPF.

Die Teilnahme an der XTOPIA [kompakt] ist kostenlos – allerdings sind nur jeweils ca. 100 Teilnehmerplätze pro Veranstaltungsort verfügbar, eine baldige Anmeldung ist daher unbedingt notwendig.

Kostenlose Anmeldung und alle weiteren Infos sowie ausführliche Themenübersicht unter:

http://blogs.msdn.com/steffenr/archive/2009/02/24/xtopia-kompakt-die-ux-web-ria-roadshow-09-kostenlos-und-im-april-mai-vor-ort-in-ihrer-stadt.aspx

 

Sponsoren und Partner der XTOPIA [kompakt] 09:

Alle-Logos-auf-weiss

XTOPIA Roadshow kostenlos besuchen

25.02.2009 10:54:00 | Jens Peter Kleinau

Wie Christian Klasen in seinem Blog berichtet, geht die XTOPIA komakt Roadshow durch Deutschland. Die Teilnehmer der kostenlosen Roadshow XTOPIA [kompakt] erwartet eine Fülle spannender Sessions zu brandaktuellen Themen, darunter Microsoft Surface/Multitouch, Windows 7, Internet Explorer 8, Windows Live Services für Webentwickler und natürlich zu Silverlight, sowie spannende Gastvorträge und...

[[ This is a content summary only. Visit my website for full links, other content, and more! ]]

Composite Application Guidance für WPF & Silverlight im Bereich Unternehmensanwendungen

25.02.2009 09:35:54 | Oliver Scheer

Diese umfangreiche (englischsprachige) Dokumentation erläutert ausführlich, wie sich mit relativ geringem Aufwand komplexe modulare Unternehmensanwendungen (LOB = Line of Business) für Windows mit WPF – und plattformübergreifend für Windows/Linux/Mac mit Silverlight entwickeln lassen.

Typische LOB-Anwendungen bestehen meist aus mehreren unabhängigen Modi und Ansichten und kombinieren komplexe multimediale Datenvisualisierung, rollenspezifisches Anwenderverhalten und flexible Interaktionen. Sie müssen den schwierigen Spagat meistern, gleichzeitig „für die Ewigkeit“ und ebenso für permanenten Wandel entwickelt zu werden. Die Lebensdauer einer solchen Anwendung im Unternehmen bemisst sich oft in mehr als fünf Jahren, manchmal Jahrzehnten. Über diesen Zeitraum wandeln sich diese Anwendungen meist von einfachen Grundprogrammen hin zu äußerst komplexen modularen und aus vielen individuelle funktionierenden Einzelkomponenten bestehenden Anwendungen. 

Der neue Composite Application Guide bietet exzellentes Know-How und viele fertige Implementierungen zur Entwicklung derartiger Anwendungen und ist Pflichtlektüre für alle Entwickler die Unternehmenssoftware mit WPF oder Silverlight entwickeln.

Aus dem Inhalt: 

  • Composite Application Library
  • Beispielimplementierungen in WPF & Silverlight
  • QuickStarts (9)
  • How-Tos (26)
  • Massenhaft Dokumentation zu allem das Sie jemals über UI Modelle und Software Client Architektur wissen wollten

Weitere Informationen: http://www.codeplex.com/CompositeWPF
Direkt zum Download: http://www.microsoft.com/downloads/details.aspx?FamilyID=fa07e1ce-ca3f-4b9b-a21b-e3fa10d013dd&DisplayLang=en

Eine interessante Frage: Brauchen wir sowohl Visual Basic als auch C# ?

25.02.2009 06:55:00 | Klaus Bock

Genau diese Frage stellt David Kean in diesem Artikel auf seinem Blog zur Diskussion.
Ich persönlich favorisiere klar C# und währe sehr unglücklich würde diese Sprache nicht mehr weiterentwickelt werden. Andere schwören auf Visual Basic und wollen ihre Sprache nicht missen. Mit C# 4.0 und VB 10.0 werden sich die Feature der beiden Sprachen wieder ein Stück näher kommen. Was aber trotz aller Annäherungen immer bleiben wird, ist die unterschiedliche Syntax; und genau da ist C# mein Favorit.
Um auf die eigentlich Frage zurückzukommen. Brauchen? Nein. Aber es ist schön wenn jeder die Wahl treffen kann, die seinem persönlichem Geschmack und Vorlieben entspricht. Ich als Hobbyentwickler kann es mir aussuchen womit ich gerne Arbeite und will diesen Vorzug auch gerne weiter nutzen.

Technorati-Tags: | |

White paper: Working with large lists in Office SharePoint Server 2007

25.02.2009 05:22:00 | Ozgur Aytekin

Microsoft performed performance testing against Microsoft® Office SharePoint® Server 2007 to determine the performance characteristics of large SharePoint lists under different loads and modes of operation. This white paper presents their findings.

The test results in this white paper are intended to demonstrate the difference in the performance characteristics of SharePoint lists containing large numbers of items when different data access types are used to present list contents. Test results in this white paper show how to optimize list performance through limits on the number of items that appear in a list, and by choosing the most appropriate method of retrieving list contents.

White paper: Working with large lists in Office SharePoint Server 2007

Scaling MySites; How Many MySites per Content DB?

25.02.2009 05:20:00 | Ozgur Aytekin

Scale-out
The primary scale-out strategy is to use multiple content databases in the MySite web application. To meet the guideline of 50,000 site collections per DB, you should plan a minimum of 2 content databases to handle 100,000 MySites.

Scale-up
To further ensure the overall performance of SharePoint when using multiple content databases, configure SQL Server so that the databases are hosted on different physical drives (spindles). This is usually possible with SAN storage solutions also. My instinct is that you'd want to balance this with the scale-out strategies and usage patterns. If you had 200,000 users with MySites and a large portion really began to use MySites heavily, then you might want to use 20 content databases distributed across 5 or 10 physical drives.

Scaling MySites; How Many MySites per Content DB?

Meine Vorträge auf der BASTA

24.02.2009 21:52:49 | Thomas Schissler

image

Gestern und heute hatte ich auf der BASTA zwei Vorträge. Hier die Folien dazu:

SharePoint Products and Technologies Document: Developing Custom Applications with SharePoint Server 2007

24.02.2009 21:25:00 | Ozgur Aytekin

Learn how to build a business solution leveraging a broad range of Microsoft Office SharePoint Server 2007 Enterprise capabilities. This white paper focuses on the real-world example of an application to help consulting companies track client engagements and business performance. But the insightful lessons learned and best practices will apply wherever your next SharePoint development project takes you.

Topics include Office SharePoint Designer 2007, workflows, Excel Services 2007 and the Enterprise Search API. Whether you are a SharePoint development guru or a Microsoft .NET developer evaluating the platform, this white paper has something for you.

SharePoint Products and Technologies Document: Developing Custom Applications with SharePoint Server 2007

MSDN WebCast zu PEX

24.02.2009 21:06:26 | Thomas Schissler

MSDN Webcasts 

Zusammen mit Christian Binder habe ich einen WebCast aufgenommen in dem wir PEX vorstellen. Der WebCast wird ab 12.03 online sein.

Details zur Veranstaltung: Unit-Test Generierung mit PEX [1032405246] - Microsoft Deutschland GmbH

Einen einfachen Besucherzähler in ASP.NET verwenden.

24.02.2009 21:01:00 | Klaus Bock

Viewers Vieleicht ist dem ein oder anderen der Besucherzähler in der oberen rechten Ecke meines Blog aufgefallen der anzeigt, wie viele Besucher gerade den Blog ansehen. Genauer gesagt werden hier die aktiven Sitzungen, oder Sessions, gezählt. Wenn eine neue Session gestartet wird erhöht sich der Zähler, wird eine Sitzung beendet wird der Zähler um eins verringert. Das ist sehr einfach in der Global.asax der jeweiligen Anwendung zu realisieren. Allerdings müssen ein paar Voraussetzungen erfüllt sein:
Sitzungsdaten müssen verwendet werden und der Wert mode in der Konfigurationsgruppe SessionState muss auf den Wert InProc der SessionStateMode-Enumeration eingestellt werden. Sollten also die Sitzungsdaten in einem Session- oder SQL Server gespeichert werden, ist dieser Ansatz unbrauchbar. Schon daher ist ersichtlich, dass sich so eine Lösung nur für kleine ASP.NET Anwendungen eignet.

Sind die Voraussetzungen erfüllt, ist die Implementierung sehr einfach. Zunächst einmal muss in der aktuellen Anwendung ein Objekt erzeugt werden, welches die Anzahl der Betrachter hält. In der Methode Application-Start in der Datei Global.asax wird lediglich ein Schlüssel Wert Paar erzeugt. Den Schlüssel habe ich Viewers genannt.

void Application_Start(object sender, EventArgs e)
{
    // Schlüssel Viewers in der Anwendung erzeugen
    Application["Viewers"] = 0;

}

Wenn die Anwendung jetzt startet, wird der Schlüssel in der Anwendung erzeugt und enthält den Wert 0. Um den Wert auf einer Seite darzustellen, wird noch ein Element benötigt. Ich habe mich hier für ein Benutzersteuerelement entschieden, das lediglich ein Literal verwendet um die Daten darzustellen.

<%@ Control Language="C#" AutoEventWireup="true"
     CodeFile="Viewers.ascx.cs"
     Inherits="themes_klaus_b_Viewers" %>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>

Im Codebehind des UserControl wird lediglich der Inhalt des Literal geschrieben. Natürlich könnten hier auch Inline Tags verwendet werden, doch ich stehe auf Codebehind.

using System;
using System.Web.UI;

public partial class themes_klaus_b_Viewers : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Literal1.Text = Application["Viewers"].ToString() +           " Besucher online";
    }
}

Bis jetzt wird allerdings noch nichts gezählt. Um den Besucherzähler, der ja eigentlich nur Sitzungen zählt, zu erhöhen verwenden wir die Methode Session_Start der Global.asax die bei jeder neu gestarteten Session von der Anwendung ausgelöst wird. Da aber theoretisch gleichzeitig von verschiedenen Aufrufern der Seite eine neue Sitzung angefordert werden kann, bietet ASP.NET die Methode Lock um Zugriffe auf den Anwendungsstatus zu synchronisieren. Natürlich muss die gesperrte Anwendung nach dem erhöhen des Zählers mit UnLock wieder frei gegeben werden.

void Session_Start(object sender, EventArgs e)
{
    // User-Zähler erhöhen.
    Application.Lock();
    Application["Viewers"] = (int)Application["Viewers"] + 1;
    Application.UnLock();
}

Genauso verhält es sich wenn eine Sitzung beendet wird.

void Session_End(object sender, EventArgs e)
{
    // User-Zähler verringern.
    Application.Lock();
    if ((int)Application["Viewers"] > 0)
    {
        Application["Viewers"] = (int)Application["Viewers"] - 1;
    }
    Application.UnLock();
}

Bis jetzt wurde alles Serverseitige erledigt. Das schließen oder beenden des Browsers bekommen wir aber nicht mit. Um auch das schließen eine Browserfenster mitzubekommen, ist ein wenig clientseitige Arbeit, oder JavaScript, nötig. Dazu muss lediglich in einem JavaScript das Window.BeforeUnload Ereignis verwendet werden. Wenn das Ereignis eintritt, wird auf dem Client ein XHTML Objekt erzeugt, welches via GET eine aspx-Seite anfordert die wiederum die aktuelle Sitzung mit Session.Abandon beendet. Da ich eine MasterPage verwende, lasse ich das JavaScript im Codebehind in der OnInit Methode mit einem StringBuilder erzeugen und anschließend registrieren. In Zeile 12 muss natürlich der korrekte Pfad zur AbandonSession.aspx angegeben werden.

protected override void OnInit(EventArgs e)
{
    // prüfen ob abandonScript bereits registriert ist
    if (!this.Page.ClientScript.         IsClientScriptBlockRegistered("abandonSession"))
    {
        // Script zum Aufruf von AbandonSession.aspx
        StringBuilder sb = new StringBuilder();
        sb.Append("function window.onbeforeunload(){");
        sb.Append("if(event.clientX > document.body.clientWidth && event.clientY < 0){");
        sb.Append("var xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");");
        sb.Append("xmlhttp.open(\"GET\", \"");
        sb.Append(VirtualPathUtility.ToAbsolute("~/") + "themes/klaus_b/AbandonSession.aspx");
        sb.Append("\", false);");
        sb.Append("xmlhttp.send();}");
        sb.Append("}");

        // Script Registrieren
        this.Page.ClientScript.RegisterClientScriptBlock(
              this.GetType(),
              "abandonSession",
              sb.ToString(),
              true);
    }

    // für Uplevel Browser markieren
    this.Page.ClientTarget = "uplevel";

    // Initialisieren
    base.OnInit(e);
}

Jetzt wird nur noch die Seite AbandonSession.aspx benötigt. Diese Seite muss keinen Inhalt haben. Lediglich im Page_Load Ereignis wird die aktuelle Session, wie schon weiter oben angesprochen, beendet.

using System;
using System.Web.UI;

public partial class themes_klaus_b_AbandonSession : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // aktuelle Sitzung beenden
        Session.Abandon();
    }
}

Jetzt ist der Besucherzähler soweit einsatzbereit. Dabei ist folgendes zu bedenken:
Die vorgestellte Variante ist keinesfalls ein präziser Zähler, da allein das ActiveXObject AFAIK nicht von allen Browsern unterstützt wird. Auch die Sicherheitseinstellungen mancher Benutzer können hier keine sauberer Zählung gewährleisten.
Es soll ja auch keine Webseiten-Statistik erstellen, sondern ist lediglich ein nettes Gimmick. Für exakte Zählungen gibt es schließlich professionelle Dienste.

Technorati-Tags: | |

XTOPIA [kompakt] – die UX/Web/RIA Roadshow 09. Kostenlos und im April/Mai vor Ort in Ihrer Stadt!

24.02.2009 18:14:04 | Steffen Ritter

Microsofts Webkonferenz XTOPIA geht auf Deutschlandtour: Gemeinsam mit dem deutschen RIA Forum und mit hochrangingen Partnern wie den Publishingexperten von Quark und den CRM-Profis von CAS präsentieren Experten von Microsoft in sechs deutschen Städten im April und Mai 2009 ein Feuerwerk der Neuheiten und Innovationen rund um die Themen Web, User Experience und Silverlight/Rich Internet Applications.

XTOPIA [kompakt] Die UX/Web/RIA Roadshow

Die Teilnehmer der kostenlosen Roadshow XTOPIA [kompakt] erwartet eine Fülle spannender Sessions zu brandaktuellen Themen von Microsoft, darunter Microsoft Surface/Multitouch, Windows 7, Internet Explorer 8, Windows Live Services für Webentwickler und natürlich zu Silverlight, sowie direkt aus dem Leben gegriffene Erfahrungsberichte von Agenturen und Softwareherstellern, spannende Gastvorträge und hilfreiche Informationen, u.a. zur Frage wie Agenturen und Webdienstleister mit Microsoft Visio Zeit und Geld sparen können.

Die Teilnahme an der XTOPIA [kompakt] ist kostenlos – allerdings sind nur jeweils ca. 100 Teilnehmerplätze pro Veranstaltungsort verfügbar, eine Anmeldung ist daher unbedingt notwendig.

Termine und Veranstaltungsorte
(Der Link führt jeweils direkt zur Anmeldung)

Die Veranstaltungen beginnen jeweils um 17.00 Uhr, Ende ist gegen 22.00 Uhr. Einlass ist jeweils ab 16.30 Uhr – es empfiehlt sich rechtzeitig zu erscheinen. Die Veranstaltung beginnt pünktlich um 17.00 Uhr, danach kann kein Einlass oder Sitzplatz mehr gewährleistet werden. Kostenlose Getränke und Verpflegung für Zwischendurch werden natürlich von Microsoft gestellt.

Partner und Sponsoren der XTOPIA [kompakt] 09

Sponsoren + Partner der XTOPIA [kompakt]

Themenübersicht
(Reihenfolge der Sessions und Inhalte können sich kurzfristig ändern)

  • UX@Microsoft: Was kommt denn da um die Ecke?
    User Experience Evangelist Clemens Lutsch nimmt Sie auf eine Reise in die neuen User Experience-Welten von Windows 7 mit, natürlich mit einem Abstecher in die faszinierende Welt von Surface Computing und Multitouch. Und er beantwortet die Frage ob und wie man seinen Computer anbrüllen kann (und sollte!), damit dieser zukünftig vernünftig darauf reagiert.
    Referent: Clemens Lutsch, Microsoft Deutschland GmbH, http://blogs.msdn.com/clemenslutsch
     
  • Das deutsche RIA Forum
    Im deutschen RIA Forum diskutieren über 2.500 Mitglieder das Thema Rich Internet Applications in allen Anwendungsbereichen und über alle Plattformen hinweg. Kompetent und neutral bietet das Forum einen hervorragenden Anlaufpunkt zur Diskussion der Vorteile der Technologien, der Business Values, zur Firmenvorstellung sowie auch als Jobbörse rund um Rich Internet Applications, Webdesign und Webentwicklung.
    Referent: Raju Bitter, Deutsches RIA Forum
    http://www.xing.com/net/ria
     
  • Barrierefreies Webdesign mit Expression Web 2 und kostenlosen Profivorlagen
    Expression Web 2 verfügt über umfangreiche Methoden zur Gestaltung von barrierefreien Websites – CSS-Profi Vladimir Simovic hat in Zusammenarbeit mit Microsoft Deutschland eigens für Expression Web 2 eine Sammlung kostenloser Vorlagen für Expression Web 2 entwickelt, mit denen auch Nicht-Profis Websites gestalten können, die sich durch gute Unterstützung wichtiger Funktionen für den barrierefreien Zugriff auszeichnen, damit Ihre Website wirklich für jedermann zugänglich ist.
    Referent: Vladimir Simovic, perun.net webwork GmbH
    http://www.perun.net
     
  • Internet Explorer 8 – Die neuen Features und was sie für Webentwickler bedeuten
    Referent: Oliver Scheer Microsoft Deutschland GmbH,
    http://blogs.msdn.com/olivers
     
  • Mit Microsoft Silverlight Next Generation Rich Internet Applications entwickeln
    Silverlight ist ein schlankes Browser-Plug-In für Rich Internet Applications (RIAs) für alle gängigen Betriebssysteme, alle gängigen Browser, und für Devices/mobile Geräte.
    Referent: Oliver Scheer Microsoft Deutschland GmbH
    http://www.microsoft.de/silverlight
     
  • Medienübergreifendes Design – Layouts direkt aus QuarkXPress ins Web mit Silverlight
    Referent: Matthias Günther, Quark
    http://8.quark.com/de
     
  • Silverlight als plattformübergreifendes Frontend für Unternehmensanwendungen – ein unabhängiger Praxisbericht
    Referent: Ludwig Neer CAS Software AG
    http://www.cas.de
     
  • Holen Sie mehr aus Ihrer Webseite heraus mit der Windows Live API für Webdesigner- und entwickler
    Referent: Frank Maenz Microsoft Deutschland GmbH
    http://messenger.live.de/webservices
     
  • PC-WARE der IT-Dienstleister für Agenturen
    Optimale Lizenzmodelle für jede Firmengröße: Agenturen, Freelancer, Entwicklungs- und Designfirmen
    Referentin: Sandra Liebe, PC-Ware
    http://www.pc-ware.de 
     
  • So sieht die Wirklichkeit aus: Silverlight und WPF in der Praxis
    Silverlight und WPF sind die neuen Technologien von Microsoft um faszinierende Online- und Offlineerlebnisse zu gestalten. Von der platformübergreifenden Webanwendung über HD-Videowelten bis hin zu intuitiven Benutzeroberflächen für Desktop-Anwendungen. In dieser Session berichten führende Agenturen aus der deutschen Designszene frei und unzensiert über ihre Erfahrungen mit Silverlight und WPF. Zugesagt haben bereits Ergosign (Karlsruhe), maximago (Hamburg) und Pixelpark AG (Köln), UID (München) und Syzygy (Frankfurt).
    Moderation: Clemens Lutsch, Microsoft Deutschland GmbH
    http://www.ergosign.de, http://www.pixelpark.de, http://www.syzygy.de, http://www.uid.com, http://www.maximago.de 

 

  • Sehen heißt verstehen!
    Wie Webdesigner und Webentwickler mit Microsoft Visio die Planung, Entwicklung und Pflege von Websites und Webanwendungen vereinfachen und das Reporting und die Überwachung der Server und Zugriffe nahezu in Echtzeit visualisieren können.
    Referent: Florian Müller Microsoft Deutschland GmbH
    http://www.sehen-heisst-verstehen.de 

Gerade online gegangen: Microsoft Student Experience -- das Studentenportal von Microsoft mit umfassende Ressourcen (nicht nur für Informatikstudenten)

24.02.2009 16:30:17 | Steffen Ritter

Mein hochgeschätzter Kollege Norbert Schumann vom Berliner Bildungsteam hat mich eben darauf aufmerksam gemacht dass die neue Microsoft Student Experience ab sofort online ist.

Die Microsoft Student Experience ist ein Portal für Studierende. Unter den drei Oberbegriffen „Studieren“, „Planen“ und „Leben gibt es ein wahres Füllhorn an Informationen, Tipps, Vorlagen zum kostenlosen Download, Lifestyle-Themen und und und… Beispielsweise Tutorials zum Thema Zeitmanagement, Hilfe und Beratung bei der Suche nach einem Auslandsstudium, aus dem Leben gegriffene Stories und mehr.

student

Sowohl vom Informationsgehalt, wie auch vom Unterhaltungswert – und auch vom Design her – ist die Website wirklich gut gelungen. Gefällt mir gut.

dreamspark

In diesem Zusammenhang auch erwähnenswert (wenn auch bereits ein Riesenerfolg und daher sicher sowieso schon bekannt): Microsoft DreamSpark: Das kostenlose Programm für Studierende mit dem sie kostenlosen Zugriff auf Microsoft Designer- und Entwicklertools haben. Natürlich Expression Studio, aber auch XNA Game Studio für Spieleentwicklung, Visual Studio und SQL Server und das Robotics Developer Studio 2008.

Links:

Besseres LiveWriter-PlugIn für SyntaxHighlighter

24.02.2009 12:46:49 | Albert Weinert

Nachdem ich nun auch meinen Arbeitslaptop auf Windows 7 umgestellt habe (es gab Probleme mit einer speziellen VPN-Software). Wurde natürlich einiges neu installiert, so auch der Live Writer.

Ich war also auf der Suche nach dem PlugIn für LiveWriter mit dem man Quelltexte mit für SyntaxHighlighter den ich hier zur Formatierung dieser verwenden einfach einfügen kann.

Der Name war natürlich entfallen und den Blogpost von Scott Hanselmann war auch nicht so schnell griffbereit.

Also zum Glück mal Tante Google gefragt und dabei ist folgendes zum vorschein gekommen.

http://www.codeplex.com/wlwSyntaxHighlighter

Es ist nicht das von Scott Hanselmann empfohlene, sondern ein besseres.

Die Vorteile gegenüber dem anderen, dessen Namen ich immer noch nicht weiß.

  • Vorschau in LiveWriter
  • Quelltexte wieder bearbeitbar
  • Optionen einfach änderbar ohne neu einzufügen

Großartig bekannt scheint es nicht zu sein, wie die Download zahlen zeigen, dies jedoch zu unrecht.

Also hiermit sowohl Download- und Installations-Befehl!

Eine Anmerkung noch, es kann noch nicht die neue Syntax vom Syntaxhighlighter 2.0. Somit muss für die Version 2.0 das Kompatibilitätsskript eingebunden werden.

Microsoft: Projektleitertag mit dem Focus Agile Software Entwicklung

24.02.2009 12:36:00 | Christian Binder

Am  25.03.2009 – München und 17.06.2009 – Köln findet ein Projektleitertag mit dem Focus Agile Software Entwicklung
statt. Falls Sie noch eher formal Entwickeln, aber dennoch die Vorzüge der Agilen Entwicklung kennen lernen möchten bietet sich diese
Veranstaltung hervorragend an. Mehr Infos inkl. Agenda  gibt’s hier

Chris

Windows Azure – In die Wolke deployen

24.02.2009 11:16:03 | Jan Schenk

Nachdem ich gerade auf der Suche nach einem hilfreichen Tipp war, welche URLs ich für Web-Services über WCF in meinem Code verwenden muss, wenn ich die Applikation in die Cloud publishe, und noch keine deutsche Seite gefunden habe, die sich damit befasst, hier die Lösung.

Ich habe den Endpoint meines Web-Services händisch im Code definiert, wie das im vierten Teil des BuildingWindowsAzureServices-Labs aus dem Windows Azure Trainingkits unter http://www.microsoft.com/azure/trainingkit.mspx vorgeschlagen wurde.

Ich muss statt der localhost-Domain auf Port 81 den Domainnamen der Staging- bzw. der Production-Umgebung verwenden. <crypticGuidString>.cloudapp.net bzw. <yourname>.cloudapp.net.

Da ich das aber nicht jedes mal im Code ändern möchte, bietet es sich an, das in der ServiceConfiguration.cscfg abzulegen, da ich diese im Web-Interface von Azure bearbeiten kann, ohne dafür das Projekt nochmal deployen zu müssen.

Ein Definitionseintrag in der ServiceDefinition.csdef sieht dann zB so aus:

   1: <WorkerRole name="WorkerRole">
   2:   <ConfigurationSettings>
   3:     <Setting name="DeploymentURL"/>
   4:   </ConfigurationSettings>
   5: </WorkerRole>

 

Die lokale ServiceConfiguration.cscfg so:

   9:   <Role name="WorkerRole">
  10:     <Instances count="1"/>
  11:     <ConfigurationSettings>
  12:       <Setting name="DeploymentURL" value="http://localhost:81/"/>
  13:     </ConfigurationSettings>
  14:   </Role>

 

Und auf dem Staging-System im Azure-Webinterface ändert man das wie folgt (die GUID muss natürlich eurer GUID entsprechen, wie ihr sie unter dem Staging-Cubic als URL vorfindet):

   1: <Role name="WorkerRole">
   2:   <Instances count="1"/>
   3:   <ConfigurationSettings>
   4:     <Setting name="DeploymentURL" value="http://guidguid-guid-guid-guid-guidguidguid.cloudapp.net/"/>
   5:   </ConfigurationSettings>
   6: </Role>

 

In der WorkerRole.cs könnt ihr dann dementsprechend auf diesen Konfigurationseintrag zugreifen:

   1: string url = RoleManager.GetConfigurationSetting("DeploymentURL") + "MessageLogger.svc";
   2: BasicHttpBinding bind = new BasicHttpBinding();
   3: EndpointAddress endpoint = new EndpointAddress(url);

 

Falls ihr das für die WebRole machen wollt, denkt daran, dass diese ihren eigenen Eintrag in der ServiceConfiguration.cscfg und ServiceDefinition.csdef hat.

Eine explizite Angabe des Ports ist nicht mehr notwendig, da der Web-Service nun auf Port 80 läuft.

Ich habe das ganze in der Staging-Umgebung zum Laufen bekommen, im Production-System kam aber die WebRole nicht übers Initialisieren hinaus, ich denke, dass das aber an der Fabric und nicht am Code lag.

25 Jahre Microsoft Press - 2 Bücher kostenlos bekommen

24.02.2009 00:59:30 | Robert Mühsig

image Microsoft Press wird 25 Jahre alt und verschenkt zwei Bücher bis zum 25. Februar 2009. Für den Download muss man sich für den MS Press Newsletter registrieren. 
Folgende Bücher werden angeboten:

ShareThis

Webcasts: Testing Practices mit Visual Studio Team System 2008 und PEX

23.02.2009 14:40:27 | Christian Binder

Testing Practices mit Visual Studio Team System 2008

Leider kommt Quality in den meisten Software Projekten immer noch zu kurz. In diesem Webcast spreche ich mit Thomas Schissler Artiso über Testing Practicies, der Fokus liegt darauf bestimmte Aspekte zu beleuchten, die zu einer umsetzbaren Test-Strategie führen. Thomas Schissler stellt dabei Practices vor, die sich in seinem Team bewährt haben und die wir diskutieren. Falls Sie keine Test-Strategie haben schauen Sie mal rein :-) Falls schon, lassen Sie uns wissen, was für Sie gut funktioniert und was nicht. Es ist kein Deep Dive für bestimmte VSTS2008 Testarten. Allerdings werden wir ein paar Helper Tools, wie den Testcase Generator vorstellen, die einfach Zeit sparen. Oder das man mit dem VSTS Load Test sehr gut Multiuser Test durchführen kann, die Defekte finden, welche sonst erst in der Produktion auftreten…

Download hier

 

Ergänzend haben wir noch ein kurze Einführung zu PEX geplant, die ab dem 12.3 live sein wird.

Unit-Test Generierung mit PEX - Whitebox Testing

Download ab dem 12.3 hier


Viel Spass

Chris

Internet Explorer 8: My MSDN Accelerator

22.02.2009 09:56:15 | Kay Giza

Der Internet Explorer 8 (IE8) bietet eine klasse Funktion. Wann immer Sie z.B. ein Wort oder eine Wortfolge auf einer Webseite markieren, wird automatisch eine sehr interessante Funktion aktiviert. Markieren Sie einfach Text auf einer Internetseite und klicken Sie anschließend auf das blaue Schnellinfo-Symbol IE8 Accelerators Icon über der Auswahl, um Stadtpläne und Übersetzungen oder Definitionen zu einzelnen Wörtern anzeigen zu lassen, Inhalte per E-Mail an andere Personen zu senden, eine Suchanfrage zu einer Suchmaschine zu senden oder gar einzukaufen und vieles mehr.

Mit den neuen Schnellinfos im IE8 erledigen Sie viele alltägliche Aufgaben im Internet schnell und effektiv - direkt von einer Internetseite aus per Mausklick, ohne eine andere Seite ansteuern zu müssen. In deutschen Version des Internet Explorers genannten Schnellinfos (englisch: Accelerators) können Sie z.B. ein Wort markieren und lassen es bei einem Internetdienst wie z.B. MSDN Online nachschlagen. Es öffnet sich ein kleines Fenster und Sie sehen sofort die Suchergebnisse! Einfacher geht es nicht. Probieren Sie es doch mal mit einem Wort aus diesem Text aus.

Wie viele Schritte müssen Sie in Ihrem aktuellen Browser ausführen, um eine bestimmte Adresse in einem Stadtplan zu finden, ein Wort zu übersetzen oder andere tägliche Routineaufgaben im Internet zu erledigen? Bisher waren dazu immer mehrere Vorgänge wie Kopieren und Einfügen auf den betreffenden Internetseiten notwendig. Internet Explorer 8 enthält standardmäßig bereits einige nützliche Schnellinfos, weitere können Sie über die Add-on-Galerie hinzufügen. Durch Klicken auf "Add-ons verwalten" im Menü "Extras" oben rechts im Browser können Sie Schnellinfos auch problemlos löschen, deaktivieren oder aktivieren. Passen auch Sie einfach Ihren Internet Explorer an Ihre persönlichen Bedürfnisse an.

MSDN Online war seit der allerersten PreView-Version des IE8 mit einem Schnellinfo-Service vertreten. Letzte Woche nun haben wir aufgrund von zahlreichen E-Mails und regem Austausch mit Kunden unser MyMSDN Schnellinfo aktualisiert und angepasst. Auch als einer der wenigen Anbieter mit einer Sofortvorschau im Schnellinfo haben wir diese auch angepasst und optimiert.

Probieren Sie es doch mal aus und schlagen Sie einen Begriff bei My MSDN nach!

Screenshot:
MSDN Online: Nachschlagen mit Schnellinfos bei My MSDN
[Bitte klicken Sie auf das Bild für einer vergrößerte Darstellung]


Für Interessierte und Web-Entwickler hier einige hilfreiche Links zum Erstellen von Schnellinfos:

PS: Auch haben wir sehr viele Kommentare bekommen, wieso man als Webseiten-Betreiber oder Web-Entwickler auf http://www.ieaddons.com/de/ keine Informationen zu Dokumentationen oder Anleitungen rund um Schnellinfos (Accelerators), Web Slices oder Thematische Suchen (Searchproviders) findet. Auch wir finden dies optimierungsbedürftig - auch wenn der Dienst sich wie der IE8 auch - noch im Beta-Stadium befindet. Wir haben auch dieses Feedback weitergeleitet und sind guter Hoffnungen, dass dies zeitnah optimiert wird.



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-2009 Kay Giza. All rights reserved. Legal

Brandneu: Composite Application Guidance für WPF & Silverlight im Bereich Unternehmensanwendungen

20.02.2009 18:39:13 | Peter Kirchner

Der Composite Client Application Guide ist eine umfangreiche (englischsprachige) Dokumentation und erläutert ausführlich, wie sich mit relativ geringem Aufwand komplexe modulare Unternehmensanwendungen (LOB = Line of Business) für Windows mit WPF – und plattformübergreifend für Windows/Linux/Mac mit Silverlight entwickeln lassen.

Typische LOB-Anwendungen bestehen meist aus mehreren unabhängigen Modi und Ansichten und kombinieren komplexe, multimediale Datenvisualisierung, rollenspezifisches Anwenderverhalten und flexible Interaktionen. Sie müssen den schwierigen Spagat meistern, gleichzeitig „für die Ewigkeit“ und ebenso für permanenten Wandel entwickelt zu werden. Die Lebensdauer einer solchen Anwendung im Unternehmen bemisst sich oft in mehr als fünf Jahren, manchmal Jahrzehnten. Über diesen Zeitraum wandeln sich diese Anwendungen meist von einfachen Grundprogrammen hin zu äußerst komplexen modularen und aus vielen individuelle funktionierenden Einzelkomponenten bestehenden Anwendungen. 

Der neue Composite Application Guide bietet exzellentes Know-How und viele fertige Implementierungen zur Entwicklung derartiger Anwendungen und ist Pflichtlektüre für alle Entwickler die Unternehmenssoftware mit WPF oder Silverlight entwickeln.

Aus dem Inhalt: 

  • Composite Application Library
  • Beispielimplementierungen in WPF & Silverlight
  • QuickStarts (9)
  • How-Tos (26)
  • Massenhaft Dokumentation zu allem das Sie jemals über UI Modelle und Software Client Architektur wissen wollten

Weitere Informationen: http://www.codeplex.com/CompositeWPF
Direkt zum Download: http://www.microsoft.com/downloads/details.aspx?FamilyID=fa07e1ce-ca3f-4b9b-a21b-e3fa10d013dd&DisplayLang=en

Simple AOP: integrating interceptors into Windsor

20.02.2009 14:47:00 | Andre Loker

Aspect oriented programming (AOP) allows us to keep implement different concerns in isolation. In this article series I’ll describe ways to make use of AOP without much hassle. In the previous article of this serious we learned how to intercept method invocations using DynamicProxy2 and IInterceptors. However, we had to create the proxy instances manually. If you use Castle Windsor you can let the IoC container create the proxies and inject the interceptors.

I assume that you have used Castle Windsor or a different IoC container before. If not, check why you should use dependency injection.

Luckily Windsor integration of IInterceptors is a snap. In fact, you don’t have to add anything, it’s already been built in, because it has proven to be very useful. Because Windsor controls the instantiation of the registered components it was a logical consequence to add optional proxy creation and interface injection into that process. The Castle people are know what they do!

Basically, Windsor offers three ways to define interceptors that you want it to inject into components, ranging from rather static to fully dynamic.

Static injection with attributes

If all you want is the separation of concerns that injectors offer you and know which classes those aspects need to be applied to you can simply use the InterceptorAttribute.

Let’s start with a simple service interface and its implementation:

 public interface IService {
     void DoSomething();
 }
  
 public class Service : IService {
     public void DoSomething() {
         Console.WriteLine("Doing something");
         throw new InvalidOperationException("Some exception thrown in DoSomething");
     }
 }

And here’s the code that sets up Windsor for this service and creates an instance.

 var container = new WindsorContainer();
 container.Register(
     Component.For<IService>().ImplementedBy<Service>()
 );
  
 var service = container.Resolve<IService>();
 service.DoSomething();

As expected, running this piece of code will print “Doing something” and than fail with an uncaught exception. Now let’s say we want to add an aspect to the code that – in this simple case – prints a message to the console whenever an intercepted method throws an exception. Here’s the simple exception handling aspect from the previous article, which catches exception, prints an information message and optionally re-throws it.

 public class ExceptionAspect : IInterceptor {
     public bool EatAll { get; set; }
  
     public void Intercept(IInvocation invocation) {
         try {
             invocation.Proceed();
         } catch (Exception e) {
             Console.WriteLine("{0} caught: {1}", e.GetType(), e.Message);
             if (!EatAll) {
                 throw;
             }
         }
     }
 }

 

 

Two automatically inject this aspect into the Service component you only need to add two minor modifications:

1. Register the ExceptionAdvice as a component:

 container.Register(
     Component.For<ExceptionAspect>()
     .Parameters(Parameter.ForKey("EatAll").Eq("true"))
 );

 

2. Add the Castle.Core.InterceptorAttribute to the Service component:

 [Interceptor(typeof(ExceptionAspect))]
 public class Service : IService{
     public void DoSomething() {
         Console.WriteLine("Doing something");
         throw new InvalidOperationException("Some exception thrown in DoSomething");
     }
 }

This will tell Windsor to automatically create a proxy for the Service component and inject the interceptor of the given type (ExceptionAspect). Running the code now leads to the expected output:

image

Instead of a type you can also provide the key of a component to the InterceptorAttribute.

Simple dynamic injection

 

 

 

If you cannot or don’t want to use attributes – e.g. because you need to disable or enable certain aspects during configuration time – you can of course configure the Windsor container manually.

Let’s add a second aspect, namely a simple logging aspect that prints a message before and after the execution of intercepted methods. This is what our aspect looks like:

 public class LoggingAspect : IInterceptor {
     public void Intercept(IInvocation invocation) {
         Console.WriteLine("SomeInterceptor: Before method");
         try {
             invocation.Proceed();
         } finally {
             Console.WriteLine("SomeInterceptor: After method");
         }
     }
 }

Now we need to tell Windsor to inject the LoggingAspect into our Service. As with the ExceptionAspect we need to register the advice as a component:

 container.Register( Component.For<LoggingAspect>() );

Now we only need to change the registration of the service to inlcude the given aspect:

 container.Register(
     Component
     .For<IService>()
     .ImplementedBy<Service>()
     .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere
 );

 

The only change is shown in line 5. The Interceptors() method expects an array of interceptors to apply to the component, Anywhere tells Windsor that we are not interested in the order in which multiple interceptors are applied (see below).

Running the application now yields:

image

 

If you configure the container in source code as shown above you can decide at configuration time which interceptors to inject. Of course, the interceptors can also be configured using an external XML file for full configurability.

If you configure multiple interceptors sometimes the order in which they are applied does matter. For example, assume you have an interceptor that caches method results and another one that secures the method for authorized access. In this case you will want the security interceptor to be applied before the caching interceptor, otherwise unauthorized user might see cached values that they are not allowed to see.  Windsor allows you to explicitly state the relative or absolute order of the configured interceptors.

  • ...Interceptors(interceptors).First
    The defined interceptors are prepended to the current list of interceptors.
  • ...Interceptors(interceptors).Last
    The defined interceptors are append to the current list of interceptors.
  • ...Interceptors(interceptors).AtIndex(x)
    The defined interceptors are inserted at the given index of the current list of interceptors.
  • ...Interceptors(interceptors).Anywhere 
    You don’t care where the interceptors are added.

Fully dynamic injection

You can even go one step further. Instead of defining the interceptors explicitly for the different components, Windsor allows you to install a hook that allows you to define the interceptors for each component on the fly during creation.

You can install that hook by implementing the interface IModelnterceptorsSelector which exposes two methods:

 public interface IModelInterceptorsSelector {
     bool HasInterceptors(ComponentModel model);
     InterceptorReference[] SelectInterceptors(ComponentModel model);
 }

Before a component is activated, Windsor calls HasInterceptor with the component model. If it returns true Windsor will invoke SelectInterceptors to request the actual interceptor references.

As an exammple, we’ll use another interceptor – TransactionAspect – that is injected with an IModelInterceptorSelector. First, here’s the interceptor:

 public class TransactionAspect : IInterceptor {
     public void Intercept(IInvocation invocation) {
         try {
             Console.WriteLine("Opening transaction");
             invocation.Proceed();
             Console.WriteLine("Commit");
         } catch (Exception e) {
             Console.WriteLine("Rollback");
             throw;
         }
     }
 }

And here’s our implementation of the IModelInterceptorsSelector:

 public class MyInterceptorSelector : IModelInterceptorsSelector {
     public bool HasInterceptors(ComponentModel model) {
         return typeof(TransactionAspect) != model.Implementation &&
             model.Implementation.Namespace.StartsWith("SimpleAopWindsor");
     }
  
     public InterceptorReference[] SelectInterceptors(ComponentModel model) {
         return new[] { InterceptorReference.ForType<TransactionAspect>() };
     }        
 }

As you see there’s nothing fancy going on here. HasInterceptors returns true for types in the SimpleAopWindsor namespace that are not TransactionAspect. The check for TransactionAspect is required in this specific case to prevent infinite recursion – otherwise, the TransactionAspect interceptor would be applied to itself.

SelectInterceptors simply returns an array of InterceptorReferences: in this case it contains only one element, ie. a reference to TransactionAspect.

Of course, we need to register the TransactionAspect as a component in Windsor:

 container.Register(
     Component.For<TransactionAspect>()                
 );

And finally, we need to tell Windsor to use our interceptors selector.

 container.Kernel.ProxyFactory.AddInterceptorSelector(
     new MyInterceptorSelector()
 );

If we run the application now we’ll see this:

image

What’s important here is the fact that our LoggingAspect and ExceptionAspect seem to be gone. This is important: if IModelInterceptorsSelector.SelectInterceptors returns a non-null array, only those interceptor will be used. Interceptors configured using one of the previously described methods (attributes or registration) will be ignored. If we want those interceptors to be applied as well our IModelnterceptorsSelector needs to return those references explicitly, eg. like this:

 public InterceptorReference[] SelectInterceptors(ComponentModel model) {
     var interceptors = new List<InterceptorReference>(model.Interceptors.Count + 1);
     // add all interceptors configured otherwise
     foreach (InterceptorReference inter in model.Interceptors) {
         interceptors.Add(inter);
     }
     // add an additional interceptor
     interceptors.Add(InterceptorReference.ForType<TransactionAspect>());
     
     return interceptors.ToArray();
 }

Now our application uses all interceptors:

image

Conclusion

As you’ve seen there are many different ways to inject inspectors into components in a Windsor container, ranging from static definition of inspectors using attributes to fully dynamic injection using IModelInterceptorsSelector.

What’s missing in comparison toclassic” AOP frameworks such as AspectJ? Pointcuts of course! With IModelInterceptorsSelector we are able to choose which types get interceptors applied, but those interceptors intercept every method of the target. We’d like to be able to define something similar to pointcuts to select the methods that get intercepted. And that’s what’s the next article in this series will be about. Stay tuned!

Souce code for this article: SimpleAopWindsor.zip (600.79 kb)

Previous articles:

Clean Code - Auf dem Weg besser zu werden

20.02.2009 14:11:28 | Rainer Schuster

Clean-Code-Developer

Was ist das?

Ralf Westphal und Stefan Lieser haben hier ein paar schöne Prinzipien zusammengeschrieben, die jeder Entwickler verinnerlicht haben sollte. Viele haben es vielleicht auch. Mir persönlich waren viele dieser Praktiken bekannt. Allerdings nicht unter einem Namen. Jeder, der in seiner Laufbahn schon mal gute Muster erkannt hat, wird so seinen AHA-Effekt erlebt haben. Aber wer kann auch noch behaupten, es anderen so erklären zu können, dass sie diese dann selbst praktizieren können? Ich würde jetzt mal ganz selbstbewußt von mir sagen: Mittlerweile könnte ich es. Wie habe ich es geschafft? Die Anweisungen von Clean Code befolgt und mich selbst gefragt, sind sie richtig und warum sind sie es?

Das erste mal so richtig publik hat die Clean Code Initiative Ralf auf der VSOne gemacht, indem er dort die Roten Clean-Code-Developer Armbänder verteilt hat. Und jetzt erst ganz neu in der aktuellen dotnetpro 03/2009 mit dem Artikel PISA für Entwickler.

Ihr wisst noch immer nicht wovon ich Rede? Dann solltet ihr mal ganz schnell auf die Seite http://www.clean-code-developer.de gehen und euch im Wiki durchwühlen. Besonderen Augenmerk möchte ich dabei auf die Literatur und Informationsseite legen. Hier hat das CCD Team Empfehlungen nach ihrem Wissen und den Informationen aus der Maillingliste zusammengetragen. Im Zentrum der ganzen Initiative für besseren Code steht das Buch Clean Code von Robert C. "Unclebob" Martin, der auch einer der Mitbegründer des Agile Manifesto ist.

Meine bisherige Erfahrung

Nachdem ich heute Morgen auf dem Weg zur Arbeit bei Seite 170 von Clean Code angekommen war hielt ich mal kurz inne. "Was hat mir das ganze bisher gebracht?" Was kam bei dieser Retrospektive heraus?

  1. Jedes mal wenn ich fremden oder eigenen Code lese frage ich mich: "Verstehst du das wirklich intuitiv ohne ein Mapping von 'was tut diese Variable' mit 'wie ist ihr Name' machen musst?"
  2. Jedes mal wenn ich auf 1. mit einem Nein Antworte mache ich ein Refactoring
  3. Jedes mal wenn ich ein Refactoring mache, muss ich an die Kapitel aus Clean Code denken als da wären
  4. Jedes mal wenn ich das tue, bin ich erstaunt, wie einfach es ist und wie erfolgreich es ist.
  5. Jedes mal wenn ich so erstaunt bin, stellt sich ein gutes Gefühl ein, keine Furcht mehr vor Veränderungen haben zu müssen.

Ich könnte die Liste wahrscheinlich jetzt endlos so weiter führen. Aber was ist wichtig daran zu erkennen? Jeder kann mit kleinen Schritten große Erfolge feiern. Erfahrung und damit auch Erfolg ist iterativ, so wie wir es von unserem Agilen Entwicklungsprozess gewohnt sind?

Agile ... wie, was? Na das dynamische Dingsda ... ihr könnt mit AGILE nichts anfangen? Na macht nichts. Aber mit gutem, verständlichen Code doch bestimmt, oder?

Oft gab es Situation in denen mir der Geschmack meines Codes nicht so ganz gepasst hat. War er gut, oder schlecht. Mein Gefühl sagte schlecht, aber ich wusste nicht warum. Das ist nun anders. Jetzt kann ich schon viel besser Beurteilen, warum Code gut oder schlecht ist in meinen Augen und das auch objekt iv begründen.

Fazit

Eine wichtige Lektion, die ich daraus bisher gelernt habe: Alle Variablen-, Funktions- und Klassen-Namen müssen Explizit sein! Sobald ich nachdenke muss um zu ergründen, wofür das jetzt gut ist, also ein geistiges Mapping auf meinen Code zu machen ist schlecht.

Ihr glaub mir nicht? Probiert es aus: Der Erfolg wird mir recht geben, da bin ich mir sicher. Als nächstes steht schon The Pragmatic  Programmer bei mir im Regal und wartet darauf gelesen zu werden.

Back from vacation

20.02.2009 14:08:20 | Andre Loker

I’ve been on vacation to the North Sea for a few days.Here are a (very) few impressions: i) our house resembled Barbie’s dream house, ii) flat see, great sunset, iii) North Sea beach at low tide. A great recreation!

IMG_6115IMG_6150IMG_6178

Note to myself: before you leave your servers alone for a couple of days be sure that they have enough disk space to store all automatic backups during that time :-)  Otherwise your website and mail server might be unavailable for a few days…

Verschiedene ClickOnce Application Launch Issues

20.02.2009 11:33:05 | Lars Keller

Gaurav Bodar hat eine Übersicht zu verschiedenen Launch Issues bei ClickOnce gebloggt. Der Einfachheit halber habe ich diese kopiert. :-)

1)An Error occurred during writing to the disk. Please check that disk is not full

-On Vista machine C:\Document and settings\<User>\Local settings\Apps this folder dint have Administrators under Security.

Most probably User Profile issue. create New user profile to resolve the issue.

2) IE doesn’t recognize MIME (.application) for ClickOnce
Message : .application “Unknown MIME Type” , You want to save the file or Cancel

-Provide Registry permission through SubInACL tool to overcome IE issue

3) Office assemblies to integrate to Outlook fails during Deployment With ClickOnce
Strong name signature not valid for this assembly stdole.dll

-Office assemblies should not be distributed randomly. Either PIA should be installed on target machine or added as prerequisite to ClickOnce Project

4) ClickOnce Launch second time gives Error

The remote server returned an error: (401) Unauthorized on ClickOnce application

- Application was getting Launched from Shortcut - shortcut was available at
C:\Documents and Settings\USER.HM\Application Data\Microsoft\Internet Explorer\Quick Launch\ Track-It! 8 Technician Client (2).appref-ms

-Add-on for IE was not allowing Launch from shortcut. Create fresh shortcut from Application Exe (located inside ClickOnce Cache) would resolve the issue

5) ClickOnce application doesn’t launch on client machine (No Error)

- Proventia Desktop and Kingston Mouse Driver would not allow Clickonce to run on the machine. There are other known Application as well.

6)Client cannot launch the application, Error : Store metadata "AppType" is not valid

- Issue is as follows:
DFSVC.exe (ClickOnce service) makes a call into System.Deployment.Application.ComponentStore.GetPropertyAppType
which then calls System.UInt16.Parse
appTypeStr in this case is "0" which is a valid string for the number 0. However, we're getting the following exception:
System.FormatException
Input string was not in a correct format

This is Known issue and Working Fix is available at KB 942460

Gaurav bietet noch weitere Informationen zu dem Thema ClickOnce in seinem Blog an, kann ich nur empfehlen.



This weblog is sponsored by netcreate OHG.

ASP.NET MVC Framework: User Group Tour

20.02.2009 11:28:18 | Albert Weinert

So kann es gehen, aus einem kleine Tweet wurde eine kleine User Group Tour.

Ich bin somit dieses Jahr Unterwegs in Deutschland und werde ausführlich über das ASP.NET MVC Framework berichten und zeigen wie man damit Web-Anwendungen entwickelt.

Folgende Termine sind bis jetzt geplant.

3. März 2009

In meiner Heimat-User Group geht es los http://www.dnug-koeln.de und warte bis zum

10. Juni 2009

wo ich Karlsruhe gastiere, bei der http://www.dotnet-ka.de/ von dort aus geht’s am

11. Juni 2009

nach Ulm http://www.dotnet-ulm.de/ zur dortigen Usertreffen.

18. Juni 2009

Da verschlägt es mich an den Bodensee zur frisch gegründeten http://www.dotnet-kk.de/

21. Juli 2009

Nach etwas Pause begebe ich mich nach http://www.dotnet-braunschweig.de/ zum derzeitigem Abschluss der Tour.

Ich freue mich total drauf unterwegs zu sein und andere User Groups und deren Leute kennenzulernen.

Verschiedene ClickOnce Application Launch Issues

20.02.2009 10:33:05 | Lars Keller

Gaurav Bodar hat eine Übersicht zu verschiedenen Launch Issues bei ClickOnce gebloggt. Der Einfachheit halber habe ich diese kopiert. :-)

1)An Error occurred during writing to the disk. Please check that disk is not full

-On Vista machine C:\Document and settings\<User>\Local settings\Apps this folder dint have Administrators under Security.

Most probably User Profile issue. create New user profile to resolve the issue.

2) IE doesn’t recognize MIME (.application) for ClickOnce
Message : .application “Unknown MIME Type” , You want to save the file or Cancel

-Provide Registry permission through SubInACL tool to overcome IE issue

3) Office assemblies to integrate to Outlook fails during Deployment With ClickOnce
Strong name signature not valid for this assembly stdole.dll

-Office assemblies should not be distributed randomly. Either PIA should be installed on target machine or added as prerequisite to ClickOnce Project

4) ClickOnce Launch second time gives Error

The remote server returned an error: (401) Unauthorized on ClickOnce application

- Application was getting Launched from Shortcut - shortcut was available at
C:\Documents and Settings\USER.HM\Application Data\Microsoft\Internet Explorer\Quick Launch\ Track-It! 8 Technician Client (2).appref-ms

-Add-on for IE was not allowing Launch from shortcut. Create fresh shortcut from Application Exe (located inside ClickOnce Cache) would resolve the issue

5) ClickOnce application doesn’t launch on client machine (No Error)

- Proventia Desktop and Kingston Mouse Driver would not allow Clickonce to run on the machine. There are other known Application as well.

6)Client cannot launch the application, Error : Store metadata "AppType" is not valid

- Issue is as follows:
DFSVC.exe (ClickOnce service) makes a call into System.Deployment.Application.ComponentStore.GetPropertyAppType
which then calls System.UInt16.Parse
appTypeStr in this case is "0" which is a valid string for the number 0. However, we're getting the following exception:
System.FormatException
Input string was not in a correct format

This is Known issue and Working Fix is available at KB 942460

Gaurav bietet noch weitere Informationen zu dem Thema ClickOnce in seinem Blog an, kann ich nur empfehlen.

Meine Vorträge auf der VSOne

20.02.2009 08:03:56 | Thomas Schissler

Visual Studio, Visual Studio 2005, Konferenz, VS 2005, VS Konferenz, SQL Konferenz, Agile, .NET 2.0, .NET 3.0, .NET, ASP .NET, ASP .NET 2.0, Marquardt, Loje, Dröge, Westphal, ADC, Avanced Developers Conference, ASP konferenz, Business Compact, LINQ, T-SQL, Health Care,  ,NET 3.5 Framework, Windows 2008 Server, Visual Studio 2008, SQL Server 2008, SQL Server, SQL Server 2005, ASP .NET AJAX, AJAX, Business Intelligence, SharePoint 2007, 3D, Windows Forms,  IMAX, ADO .NET, Agile Projekte, Agile, Analysis Services 2008, WPF, WF, WCF, Silverlight, Service Broker 2008, Data Mining, BizTalk Server, XML, Integration Services, VB.NET, XAML,  Blend, Performance-Optimierung 2005, Visual Studio Team System, SCD Transformations,  OLAP, MDX, PowerShell, Web 2.0, Windows Web Server 2008, ppedv AG, Vista, Microsoft, MS, Windows

Ich bin reichlich spät dran, die VSOne ist schon seit einer Woche vorbei. Hier aber nun endlich meine Folien zu meinen Vorträgen

Neuer Web-Cast zu Testing Practices

20.02.2009 07:12:30 | Thomas Schissler

MSDN Webcasts

Zusammen mit Christian habe ich einen Webcast zum Thema Testing Practices aufgenommen. In dem Webcast werden zunächst verschiedene Testmethoden vorestellt und anschließend werden verschiedene Aspekte einer Teststrategie diskutiert wie z.B. Methoden zur Testfall-Ermittlung.

Der komplette Abstract lautet:

Qualität spielt in Software-Projekten eine immer größere Rolle. Ein wesentlicher Aspekt für Software-Qualität ist das Testen. Der Webcast stellt zunächst kurz die verfügbaren Testmethoden in Visual Studio vor und zeigt anschließend Aspekte einer Test-Strategie auf. Darüber hinaus wird die Integration mit dem Team Foundation Server kurz beleuchtet und es werden Methoden zur Testfallermittlung beschrieben.

Über ein Feedback zum Webcast würde ich mich freuen.

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032405240

Verschiedene ClickOnce Application Launch Issues

20.02.2009 01:33:00 | Lars Keller

Gaurav Bodar hat eine Übersicht zu verschiedenen Launch Issues bei ClickOnce gebloggt. Der Einfachheit halber habe ich diese kopiert. :-)

1)An Error occurred during writing to the disk. Please check that disk is not full

-On Vista machine C:\Document and settings\<User>\Local settings\Apps this folder dint have Administrators under Security.

Most probably User Profile issue. create New user profile to resolve the issue.

2) IE doesn’t recognize MIME (.application) for ClickOnce
Message : .application “Unknown MIME Type” , You want to save the file or Cancel

-Provide Registry permission through SubInACL tool to overcome IE issue

3) Office assemblies to integrate to Outlook fails during Deployment With ClickOnce
Strong name signature not valid for this assembly stdole.dll

-Office assemblies should not be distributed randomly. Either PIA should be installed on target machine or added as prerequisite to ClickOnce Project

4) ClickOnce Launch second time gives Error

The remote server returned an error: (401) Unauthorized on ClickOnce application

- Application was getting Launched from Shortcut - shortcut was available at
C:\Documents and Settings\USER.HM\Application Data\Microsoft\Internet Explorer\Quick Launch\ Track-It! 8 Technician Client (2).appref-ms

-Add-on for IE was not allowing Launch from shortcut. Create fresh shortcut from Application Exe (located inside ClickOnce Cache) would resolve the issue

5) ClickOnce application doesn’t launch on client machine (No Error)

- Proventia Desktop and Kingston Mouse Driver would not allow Clickonce to run on the machine. There are other known Application as well.

6)Client cannot launch the application, Error : Store metadata "AppType" is not valid

- Issue is as follows:
DFSVC.exe (ClickOnce service) makes a call into System.Deployment.Application.ComponentStore.GetPropertyAppType
which then calls System.UInt16.Parse
appTypeStr in this case is "0" which is a valid string for the number 0. However, we're getting the following exception:
System.FormatException
Input string was not in a correct format

This is Known issue and Working Fix is available at KB 942460

Gaurav bietet noch weitere Informationen zu dem Thema ClickOnce in seinem Blog an, kann ich nur empfehlen.

Asserts in parametrisierten Unit-Tests mit PEX

20.02.2009 01:20:23 | Thomas Schissler

An einem kleinen Beispiel möchte ich kurz erläutern, wie PEX parametrisierte Unit-Tests nutzt und wie man diese nutzen kann um bestimmte Test-Szenarien abzubilden. Wir nehmen einen kleinen Codeausschnitt um uns das mal anzusehen:

 1: public class TotalSum
 2: {
 3: private double total
= 0;
 4:  
 5: public double CalculateTotals(List<cOrderPosition>
OrderPositions, double Rebate)
 6: {
 7: if (OrderPositions
== null)
 8: return 0;
 9:  
 10: foreach (cOrderPosition
orderPos in OrderPositions)
 11: {
 12: if (orderPos.Amount
> 0 && orderPos.SinglePrice > 0)
 13: total
+= orderPos.Amount * orderPos.SinglePrice; 
 14: }
 15:  
 16: if (Rebate
> 0)
 17: total
= total * (1 - Rebate);
 18:  
 19: return total;
 20: }
 21:  
 22: public class cOrderPosition
 23: {
 24: public int ProductID
{ get; set; }
 25: public double Amount
{ get; set; }
 26: public double SinglePrice
{ get; set; }
 27: }
 28: }

 

Auf den ersten Blick scheint da alles OK zu sein. Mal sehen was PEX daraus jetzt macht.

image

Zunächst sehen wir, dass PEX 3 Probleme mit Object Creations hat. Für den ersten Fall lassen wir PEX einfach automatisiert eine Factory erstellen indem wir auf "Accept/Edit factory" klicken. Für die Liste müssen wir ebenfalls eine Factory erstellen. Diese Factory wollen wir jetzt noch anpassen:

 1: [PexFactoryMethod(typeof(List<TotalSum.cOrderPosition>))]
 2: public static List<TotalSum.cOrderPosition>
Create(int NumberOfItems)
 3: {
 4: List<TotalSum.cOrderPosition>
list = new List<TotalSum.cOrderPosition>(NumberOfItems);
 5: if (NumberOfItems
> 10)
 6: NumberOfItems
= 10;
 7:  
 8: for (int i
= 0; i < NumberOfItems; i++)
 9: {
 10: list.Add(new TotalSum.cOrderPosition()
 11: {
 12: ProductID
= i + 1,
 13: SinglePrice
= new Random().NextDouble() * 10,
 14: Amount
= new Random().NextDouble() * 10
 15: });
 16: }
 17: 
 18: return list;
 19: }

 

Abhängig von der Anzahl Items die als Parameter übergeben wird, wird die Liste mit entsprechend vielen Elementen befüllt. Nun erhalten wir Ergebnisse bei der Exploration.

image

Und es sind alle grün. Also alles OK? Jetzt kommt der parametrisierte Unit-Test in's Spiel. Dazu müssen wir erst mal die Test generieren. Dazu einfach alle Einträge markieren und rechts auf "Save..." klicken.

image 

 1: [TestMethod]
 2: [PexGeneratedBy(typeof(TotalSumTest))]
 3: public void CalculateTotals04()
 4: {
 5: TotalSum
totalSum;
 6: List<TotalSum.cOrderPosition>
list;
 7: double d;
 8: totalSum
= TotalSumFactory.Create();
 9: list
= ListFactory.Create(1);
 10: d
= this.CalculateTotals(totalSum, list, 0);
 11: Assert.AreEqual<double>(42.232177096754121,
d);
 12: }

Wenn wir uns eine der generierten Testmethoden mal genauer anschauen, dann erkennen wir dass in Zeile 9 unsere ListFactory aufgerufen wird und in Zeile 10 wird eine Methode CalculateTotals aufgerufen. Bei dieser Methode handelt es sich um unseren parameterisierten Unit-Test der in der .cs-Datei abgelegt ist. Dieser parametrisierte Unit-Test nimmt Input-Werte engegen und ruft damit die eigentliche Funktion auf. Man kann den parametrisierten Unit-Test eigentlich mit einem datengetriebenen Test vergleichen, mit dem Unterschied dass die Daten nicht aus einer Datenquelle kommen sondern von den jeweiligen Testmethoden übergeben werden.

Wir können den parametrisierten Unit-Test selbst anpassen und auch Asserst einfügen. Was wir nun hier tun wollen, ist die eigentliche Test-Methode zwei mal aufzurufen und zu prüfen, ob beide Ergebnisse übereinstimmen. Bei gleichen Eingangswerten sollte dies ja der Fall sein. Der parametrisierte Unit-test sieht dann ungefähr so aus.

 1: [TestClass]
 2: [PexClass(typeof(TotalSum))]
 3: [PexAllowedExceptionFromTypeUnderTest(typeof(ArgumentException),
AcceptExceptionSubtypes = true)]
 4: [PexAllowedExceptionFromTypeUnderTest(typeof(InvalidOperationException))]
 5: public partial class TotalSumTest
 6: {
 7: [PexMethod]
 8: public double CalculateTotals(
 9: [PexAssumeUnderTest]TotalSum
target,
 10: List<TotalSum.cOrderPosition>
OrderPositions,
 11: double Rebate
 12: )
 13: {
 14: double result
= target.CalculateTotals(OrderPositions, Rebate);
 15: double result2
= target.CalculateTotals(OrderPositions, Rebate);
 16: Assert.AreEqual(result,
result2);
 17: return result;
 18: }
 19: }

 

Diese Prüfung wird nun für alle Testmethoden ausgeführt. Und wie sieht das Ergebnis aus?

image

Wir erhalten nun einen Fehlerfall. Wenn man sich den Code der Test-Methode nochmals genauer anschaut, stellt man fest, dass die lokale Variable total beim erneuten Aufruf nicht zurückgesetzt wird - ein klassischer Fehler. Wenn wir die Variable in der Methode zurücksetzen, dann werden unsere Testfälle auch alle erfolgreich sein.

Somit haben wir mit Hilfe von PEX einen gängigen Fehler gefunden der in Real-World-Projekten sicher im Code selbst nicht so offensichtlich wäre.

Overflow Exceptions mit PEX finden

19.02.2009 20:54:48 | Thomas Schissler

Ich habe in einem früheren Post bereits einige Beispiele für den Einsatz von PEX beschrieben. ich möchte nun in loser Reihe weitere Erkenntnisse die ich beim Experimentieren mit PEX gewinne hier veröffentlichen. Heute möchte ich mich mit Overflow-Exceptions beschäftigen. Anlass war eine Diskussion mit Nico. Als erstes Beispiel wollen wir uns mal folgenden Code ansehen:

 1: public decimal Calc(decimal Value, bool Increase)
 2: {
 3: if (Increase)
 4: return Value+1;
 5: else
 6: return Value-1;
 7: }

Für eine komplette Codeabdeckung muss PEX eigentlich nur den Boolean-Parameter Increase berücksichtigen. Der Parameter Value kann eigentlich beliebig gewählt werden, auf die Code-Abdeckung hat der keinen Einfluss. Aber natürlich erkennt man dass es natürlich auch Fälle gibt in denen die Methode eine OverflowException wirft, nämlich bei value = decimal.MaxValue, Increase = true und value = decimal.MinValue, Increase = false.

Das erfreuliche ist, dass mit der aktuellen Version (0.9.40105.0) PEX zusätzlich zur Codeabdeckung auch Grenzwerte berücksichtigt:

image

Bei einem anderen Beispiel funktioniert das leider (noch) nicht.

 1: public decimal ToDecimal(double Value)
 2: {
 3: return (decimal)Value;
 4: }

Hier wird leider keine Grenzwertbetrachtung gemacht, die ja zu einer Exception führen würde da der Wertebereich von decimal kleiner ist als der von double.

image

Deutsche Windows Vista Benutzer im Nachteil

19.02.2009 17:30:00 | Michael Schwarz

Nachdem ich hier, hier, hier und hier schon über das Fehlverhalten von Windows Vista (die Beta von Windows 7 ist auch betroffen), habe ich verschiedene Sprachversionen von Windows Vista ausprobiert, und bis jetzt leider noch keine gefunden, bei der das Problem auch auftritt.

Interessant ist, dass in vielen Sprachen das Programme Verzeichnis Program Files heißt, d.h. da gibt es gar nichts anderes als den englischen Namen.

Vielleicht liegt es an einem Hotfix, Service Pack oder irgendeiner Software, die auf meinem Rechner installiert ist. Deswegen werde ich jetzt mal meinen Windows Update Server die anderen Sprachen auch herunterladen lassen. Mal sehen, vielleicht weiß ich morgen mehr.


Google mag das französische Windows Vista nicht

19.02.2009 17:20:00 | Michael Schwarz

Heute habe ich unter Hyper-V ein französisches Windows Vista Business installiert. Nach der Installation bemerkte ich, dass Windows Vista Business im Französischen gar nicht Business so heißt:

Windows Vista heißt im Französischen Vista Professional

Ich habe schnell mal auf der französischen Wikipedia Windows Vista Seite nach den Versionen geschaut, und tatsächlich heißt Windows Vista Business in Frankreich Windows Vista Professional.

Ein Versuch den Wikipedia Artikel mit Google ins Deutsche zu übersetzen machte mich dann sprachlos: behauptet Google doch, dass Windows Vista Professional (französisch) auf Deutsch übersetzt Windows XP Professional ist.

Windows Vista Professional


Comics mit Silverlight

19.02.2009 16:30:00 | Oliver Scheer

Für einen gerade stattgefundenen Webcast für PC-Ware habe ich eine kleine Silverlight basierte Comic-Engine erstellt.

image

Aber da ich leider Entwickler und kein echter kreativer “Storyteller” bin, fehlt mich noch eine richtig gute, witzige Story. Also bitte her mit lustigen Ideen.

Der Comic selber ist hier live zu sehen: http://www.the-oliver.com/project/comic . (Korrigierter Link)

Das gesamte Visual Studio Projekt liegt jetzt übrigens unter dem folgenden Link zum Download bereit:

Testliste exportieren - Variante 2

19.02.2009 00:43:08 | Thomas Schissler

Hier hatte ich beschrieben, wie man die Test-Results aus Visual Studio nach Excel übertragen kann. Heute möchte ich ein Tool vorstellen, das es erlaubt, TRX-Files nach HTML zu konvertieren.

Zunächst speichert man das Test-Result in ein TRX-File. Dies geht über den Button "Export Test Run Results".

image

Anschließend kann man mit dem Tool trx2html das HTML-File erstellen. trx2html ist ein Open-Source Projekt von CodePlex. Es wird als Commandozeilen-Tool ausgeführt und als Parameter wird einfach das TRX-File angegeben. Als Ergebnis wird nun ein HTML-File erstellt das die Testergebnis entsprechend dokumentiert und auch einige Drill-Down-Funktionen bietet:

image

Durch einen Klick auf das rote Kreis-Icon neben einem der Test kann z.B. ein Stack-Trace eingeblendet werden.

image

trx2html - Home

Code Coverage für manuelle Tests

18.02.2009 23:02:18 | Thomas Schissler

Bei Unit-Tests bietet die Code-Coverage eine gute und einfache Möglichkeit zu prüfen, ob durch die definierten Test-Cases alle Code-Pfade in einer Methode wirklich durch Tests ausgeführt werden. Dies hilft beispielsweise dabei, noch fehlende Test-Cases zu identifizieren.

Auch mit manuellen Tests ist es möglich, eine Code-Coverage Analyse durchzuführen um auch hier fehlende Test-Cases zu ergänzen. Das folgende Beispiel zeigt eine mögliche Vorgehensweise.

Zunächst wird davon ausgegangen, dass ein maueller Test spezifiziert ist. Dieser kann z.B. so aussehen:

image

Nun wird ein Unit-Test erzeugt. Im Unit-Test wird eine Test-Methode angelegt die der Main-Methode der zu testenden Anwendung entspricht:

 1: [TestMethod()]
 2: [STAThread]
 3: public void FrmMainConstructorTest()
 4: {
 5: Application.EnableVisualStyles();
 6: Application.SetCompatibleTextRenderingDefault(false);
 7: Application.Run(new FrmMain());
 8: }

 

Anschließend muss geprüft werden, ob die Code Coverage analyse für die gewünschten Assemblies aktiviert ist (Menü Test / Edit Test Run Configurations / Local Test Run)

image

Wird nun der Test gestartet, öffnet sich die Testanwendung. Hier werden nun die einzelnen Test-Schritte gemäß Testspezifikation ausgeführt. Anschließend wird die Test-Anwendung beendet. Dies schließt automatisch auch den Test ab. Nun cann die Code-Coverage ausgewertet werden:

image

Und natürlich lassen sich auch die durchlaufenen und nicht durchlaufenen Code-Zeilen farblich kennzeichnen.

image

Den ganzen Ablauf wird in folgendem Video auch nochmals detailliert gezeigt:

Brandneu: Composite Application Guidance für WPF & Silverlight im Bereich Unternehmensanwendungen

18.02.2009 21:19:00 | Steffen Ritter

Ich bin immer wieder positiv überrascht wie viel Energie und Mühe Microsoft investiert, Partnern die Arbeit mit unseren Plattformen zu erleichtern und sogar große Teile der Arbeit ganz abzunehmen. Dieses Engagement ist meiner Meinung nach einzigartig – aber das ist vermutlich der Schlüsselfaktor eines erfolgreichen Werkzeug- und Plattformanbieters. Schließlich ist eine Plattform im Endeffekt nichts anderes als etwas auf das sich Menschen stellen, um größer zu sein und mehr zu erreichen.

Ein hervorragendes Beispiel dafür ist der Composite Client Application Guide, der soeben in mein Postfach geflattert ist: Diese umfangreiche (englischsprachige) Dokumentation erläutert ausführlich, wie sich mit relativ geringem Aufwand komplexe modulare Unternehmensanwendungen (LOB = Line of Business) für Windows mit WPF – und plattformübergreifend für Windows/Linux/Mac mit Silverlight entwickeln lassen.

Typische LOB-Anwendungen bestehen meist aus mehreren unabhängigen Modi und Ansichten und kombinieren komplexe multimediale Datenvisualisierung, rollenspezifisches Anwenderverhalten und flexible Interaktionen. Sie müssen den schwierigen Spagat meistern, gleichzeitig „für die Ewigkeit“ und ebenso für permanenten Wandel entwickelt zu werden. Die Lebensdauer einer solchen Anwendung im Unternehmen bemisst sich oft in mehr als fünf Jahren, manchmal Jahrzehnten. Über diesen Zeitraum wandeln sich diese Anwendungen meist von einfachen Grundprogrammen hin zu äußerst komplexen modularen und aus vielen individuelle funktionierenden Einzelkomponenten bestehenden Anwendungen. 

Der neue Composite Application Guide bietet exzellentes Know-How und viele fertige Implementierungen zur Entwicklung derartiger Anwendungen und ist Pflichtlektüre für alle Entwickler die Unternehmenssoftware mit WPF oder Silverlight entwickeln.

Aus dem Inhalt: 

  • Composite Application Library
  • Beispielimplementierungen in WPF & Silverlight
  • QuickStarts (9)
  • How-Tos (26)
  • Massenhaft Dokumentation zu allem das Sie jemals über UI Modelle und Software Client Architektur wissen wollten

Weitere Informationen: http://www.codeplex.com/CompositeWPF  
Direkt zum Download: http://www.microsoft.com/downloads/details.aspx?FamilyID=fa07e1ce-ca3f-4b9b-a21b-e3fa10d013dd&DisplayLang=en

Kostenlose Technology Roadshow zu Cloud Computing, Software as a Service, Web Services und BizSpark am 25. März in München

18.02.2009 19:33:00 | Steffen Ritter

Derzeit läuft die Technology Roadshow zu dem Thema „Microsoft und die Zukunft der Software“ die in Kooperation mit verschiedenen Gründerzentren aufgesetzt wurde. Schwerpunktthemen sind u.a. die Roadmap der Microsoft-Plattform, moderne Benutzerschnittstellen und auch Microsoft BizSpark – unser Programm um Startups mehrere Jahre lang quasi kostenlos mit der kompletten Microsoft-Plattform an Servern und Entwicklersoftware auszustatten (...jedes mal wenn ich mich mit BizSpark beschäftige kriege ich unbändige Lust ein eigenes Startup zu gründen. Die komplette Software/Web/Entwicklungsplattform mehr oder weniger "für Lau" nutzen, woohoo! Wenn nur mein aktueller Job nicht schon so klasse wäre …)

Wie auch immer, besagt Roadshow wendet sich an alle, die ihr Business und ihre Zukunft im Web suchen, darunter natürlich ganz besonders so genannte ISVs (= unabhängige Softwarehersteller), Startups und Studenten. Das Sprecherpodium ist hochkarätig besetzt, beispielsweise mit Dr. Said Zahedani – Chef der Developer Platform & Strategy Group, die Abteilung der ich als Designer Marketing Manager ebenfalls angehöre. 

Ort ist die TU München – Institut für Informatik, am 25. März ab 16 Uhr. Eintritt ist frei.
Weitere Informationen hier http://www.mbpw.de/index.php?id=244

Outlook 2007: Kontextmenü (Context Menu) einer E-Mail (MailItem) anpassen

18.02.2009 15:49:38 | Lars Keller

In Outlook 2007 ist ein “Lightweight” Word Editor eingebaut. “Lightweight” bedeutet, dass nicht alle Funktionalität zur Verfügung steht, wie man es aus dem Word-Objektmodell gewohnt ist. Gerade wieder musste ich feststellen das etwas fehlt. Damit andere nicht solange suchen müssen wie ich, hier mein Aha-Effekt:

ol_mailbody_context Ich wollte das Kontextmenü (Context Menu) eines MailItem-Object um einen eigenen Eintrag erweitern. Das Kontextmenü  erscheint, wenn man auf den E-Mail Body klickt (s. Screenshot).

Leider bietet das WordEditor-Object in Outlook keine Möglichkeit die entsprechenden CommandBar Buttons dem Kontextmenü hinzuzufügen.

Dieses Verhalten ist gewollt und wurde bei der Integration des “Lightweight” Word Editors nicht mit implementiert.

Vor Outlook 2007 ging dies, wenn man Word als Email Editor eingestellt hatte. Das lag daran, dass dann ein richtiger Winword.exe Prozess gestartet wurde und nicht wie in Outlook 2007 eine In-Proc “Lightweight” Word Version zur Verfügung steht.



This weblog is sponsored by netcreate OHG.

Outlook 2007: Kontextmenü (Context Menu) einer E-Mail (MailItem) anpassen

18.02.2009 14:49:38 | Lars Keller

In Outlook 2007 ist ein “Lightweight” Word Editor eingebaut. “Lightweight” bedeutet, dass nicht alle Funktionalität zur Verfügung steht, wie man es aus dem Word-Objektmodell gewohnt ist. Gerade wieder musste ich feststellen das etwas fehlt. Damit andere nicht solange suchen müssen wie ich, hier mein Aha-Effekt:

ol_mailbody_contextIch wollte das Kontextmenü (Context Menu) eines MailItem-Object um einen eigenen Eintrag erweitern. Das Kontextmenü  erscheint, wenn man auf den E-Mail Body klickt (s. Screenshot).

Leider bietet das WordEditor-Object in Outlook keine Möglichkeit die entsprechenden CommandBar Buttons dem Kontextmenü hinzuzufügen.

Dieses Verhalten ist gewollt und wurde bei der Integration des “Lightweight” Word Editors nicht mit implementiert.

Vor Outlook 2007 ging dies, wenn man Word als Email Editor eingestellt hatte. Das lag daran, dass dann ein richtiger Winword.exe Prozess gestartet wurde und nicht wie in Outlook 2007 eine In-Proc “Lightweight” Word Version zur Verfügung steht.

c:\Programme und c:\Program Files – langsam nervt es mich

18.02.2009 12:55:00 | Michael Schwarz

Hier mal noch ein paar Tests zum Thema c:\Programme und Zugriff verweigert:

  • c:\Programme im Windows Explorer eingeben, geht nicht
  • c:\Programme\desktop.ini geht, auch jede andere Datei in c:\Program Files, dem eigentlichen Ort
  • c:\Programme\Windows NT geht überraschender Weise auch, dann sieht die Verzeichnisstruktur nur komisch aus, es taucht zweimal c:\Programme auf

image

Vergleicht man das weiter mit c:\Benutzer, dann stellt man fest, dass dort auch die Unterverzeichnisse in den Vorschlägen auftauchen, d.h. die beiden Verzeichnisse reagieren irgendwie unterschiedlich.

image

Hm, wer hat das bitte so gewollt?

Ich habe jetzt mal auf meinem Rechner alle versteckten Dateien sowie die Systemdateien anzeigen lassen, und da muss ich überrascht feststellen, das Programme, Documents and Settings, Dokumente und Einstellungen solche Links sind, aber c:\Benutzer nicht.

image

Und noch ein Hinweis: klickt man auf die Eigenschaften des Benutzer Verzeichnisses, dann taucht auf dem Freigabe Tab der Begriff Users auf:

image

Zusammenfassung: c:\Benutzer geht wohl deswegen nicht, weil dieses nicht wie c:\Programme zweimal auftaucht, einmal mit und einmal ohne dem Linksymbolzusatz.

Jetzt ist jemand anderes dran, ich kann nicht mehr.


Muss Microsoft Englisch Kurse anbieten? – Oder was genau ist “By Design”?

18.02.2009 12:14:00 | Michael Schwarz

Ich habe in den letzten Monaten ein Dutzend Bugs oder ein in meinen Augen fehlerhaftes Verhalten von Microsoft Produkten gemeldet. Immer öfters bekomme ich nun folgende Antwort:

Bezüglich der beschriebenen Problematik des Cases habe ich eine Stellungsnahme vom Microsoft Global Technology Center eingeholt.

Das Ergebnis ist, dass das Verhalten by Design ist.

In dem letzten Support Call ging es um die Eingabe / Autovervollständigen von C:\Programme auf einem Deutschen Windows Vista (und Windows 7). Gibt man im Windows Explorer nur den Anfang, also z.B. C:\Prog ein, dann zeigt Windows eine Auswahl an Verzeichnissen mit diesem Anfang an.

image

Wählt man nun c:\Programme aus der vorgeschlagenen Liste aus, erhält man eine Fehlermeldung:

image

Für alle, die nicht wissen, warum das eigentlich so ist, nachfolgend mal die Erklärung vom Microsoft Global Technology Center:

Behavior is not a bug, its by design.

How it works: Even on a German Vista, the folder "C:\Programme" doesn't exist. The correct folder name is "C:\program files".

So you need to type "c:\program files" in explorer in order to access that directory. If on a german system or German mui, explorer will then show the "programme"  directory.

Background: Explorer is using the name from internal ressources like desktop.ini to display the localized folder name. Thus you will need to enter "c:\program files". But there is more to consider. On the German system, there exists a hardlink named "C:\Programme". This hardlink is only used for older applications which are not designed for Vista, in order to install in the correct directory. So for example you can go into  "C:\programme" by using CMD, but when you try to look whats in by using "dir *.*" you will get nothing, as it is no directory.

As Windows Explorer cannot use this hardlink itself but needs a real directory instead, you will hit the "access denied" error when trying to use Explorer and  typing "C:\Programme" into its address bar.

Ok, das wussten wir ja schon, aber warum wird dann nicht C:\Program Files anstatt C:\Programme angeboten? Oder warum kann der Windows Explorer nicht einfach diesen Link öffnen, so wie er es ja kann, wenn man mit der Maus drauf klickt?

Ich finde es schon sehr verrückt, dass man, wenn man mit der Tastatur arbeiten will, so etwas wie die Vorschläge gar nicht verwenden kann. Arbeitet man mit der Maus, dann kommen diese Vorschläge ja gar nicht, warum bitte gibt es dann diese Funktion?

Mir sieht das alles nach einer sehr einfach gestrickten Umsetzung von gleichen Pfaden in unterschiedlichen Sprachversionen aus.

Schade Microsoft, das alles immer By Design ist. Vielleicht zahlt ihr meinem Opa mal einen Englisch Kurs, denn der weiß mit Program Files nichts anzufangen.

Nebenbei ist zu erwähnen, dass C:\Benutzer aus so ein Link ist, und dort funktioniert es. Also muss der Windows Explorer Unterschiede machen. Ich vermute mal, dass es an den Rechten der Verzeichnisse liegt.


Video VSTS 2010 CTP Architecture Explorer

18.02.2009 10:28:00 | Christian Binder

Wie Gestern angekündigt hier ein Video zum Architecture Explorer. Der Architecture Explorer hilft bestehende Solutions zu analysieren und visualisieren. Wer Lust hat, zu sehen, was mit den CTP bits geht, für den gibts dieses Video. In der Demo schauen wir uns kurz ein recht umfangreiches Codeplex Projekt “Rawr”. Rawr ist ein Editor für World of Warcraft (WOW) Charakter und hat > 40k Zeilen Code.

Get Microsoft Silverlight

Download via Channel9  

Viel Spass

Chris

Outlook 2007: Kontextmenü (Context Menu) einer E-Mail (MailItem) anpassen

18.02.2009 05:49:03 | Lars Keller

In Outlook 2007 ist ein “Lightweight” Word Editor eingebaut. “Lightweight” bedeutet, dass nicht alle Funktionalität zur Verfügung steht, wie man es aus dem Word-Objektmodell gewohnt ist. Gerade wieder musste ich feststellen das etwas fehlt. Damit andere nicht solange suchen müssen wie ich, hier mein Aha-Effekt:

ol_mailbody_contextIch wollte das Kontextmenü (Context Menu) eines MailItem-Object um einen eigenen Eintrag erweitern. Das Kontextmenü  erscheint, wenn man auf den E-Mail Body klickt (s. Screenshot).

Leider bietet das WordEditor-Object in Outlook keine Möglichkeit die entsprechenden CommandBar Buttons dem Kontextmenü hinzuzufügen.

Dieses Verhalten ist gewollt und wurde bei der Integration des “Lightweight” Word Editors nicht mit implementiert.

Vor Outlook 2007 ging dies, wenn man Word als Email Editor eingestellt hatte. Das lag daran, dass dann ein richtiger Winword.exe Prozess gestartet wurde und nicht wie in Outlook 2007 eine In-Proc “Lightweight” Word Version zur Verfügung steht.

HowTo: SQL Tabellen Beziehungen erstellen per Drag´n´Drop

18.02.2009 01:16:13 | Robert Mühsig

imageDurch die Verknüpfung von Primär- und Fremdschüsseln in Datenbanken bekommt man viele Vorteile. Der Größte ist sicherlich die Datenintegrität, aber auch etwas abseits der Datenbank-Welt können z.B. O/R Mapper diese "Beziehungen" zwischen Tabellen nutzen und so bereits ein strukturierteres Datenmodell generieren. 
Solche Verknüpfungen zwischen Tabellen kann man auch im SQL Server schnell erstellen, ohne sich durch X-Dialoge zu klicken - ganz einfach per Drag´n´Drop

(more…)

ShareThis

Office SharePoint Server 2007 deployment guide and checklists

17.02.2009 19:27:00 | Ozgur Aytekin

This white paper contains information that can help you plan and manage each stage of your Microsoft Office SharePoint Server 2007 deployment, including:

- A sample deployment plan
- Checklists to guide you through planning the following aspects of your deployment:
-- Information architecture
-- Development and configuration policies
-- Ongoing operations
-- Infrastructure

White paper: Office SharePoint Server 2007 deployment guide and checklists

Weitere Vortragstermine stehen fest…

17.02.2009 17:55:50 | Lars Keller

Meine “kleine” User Group Tour geht weiter:

Vortragsthema bei allen zwei Terminen ist VSTO (Visual Studio Tools for Office), bzw. Office Business Application.

Ich freue mich! :)



This weblog is sponsored by netcreate OHG.

Weitere Vortragstermine stehen fest…

17.02.2009 16:55:50 | Lars Keller

Meine “kleine” User Group Tour geht weiter:

Vortragsthema bei allen zwei Terminen ist VSTO (Visual Studio Tools for Office), bzw. Office Business Application.

Ich freue mich! :)

The Pomodoro Timer - Die Eieruhr als TrayIcon

17.02.2009 16:20:28 | Rainer Schuster

pomogruppo Seit kurzem lese ich mir Informationen zur besseren Selbstorganisation durch. Dabei bin ich auf die Pomodoro Technik gestoßen. Das ist schnell erklärt. Es wird eine Eieruhr auf 25 Minuten gestellt und diese Zeit abgearbeitet. Warum das gemacht wird und wie die Details aussehen: Lest es selbst, dann werdet ihr es verstehen.  Zu finden auf http://www.pomodorotechnique.com

Mir ging es darum, meine Produktivität zu steigern und zu sehen, dass ich voran komme. Organisation eben. Warum gerade diese merkwürdig klingende Technik? Weil sie agil ist. SCRUM ist agil. Und agil ist gut. Sie veranlasst dich dazu iterativ und somit "sauberer" zu arbeiten. Na und da Professionalität, und eben seit kurzem damit Clean Code, bei mir oberste Priorität hat, war ich gleich davon angetan. Beiläufig hatte ich das "Pomodoro" in einem Tweet von Ralf Westphal gelesen. Kurz danach von Unclebob, wie er damit seine Arbeit erledigt.

Prominent vertreten wurde die Technik auch auf der Øredev. Wie dem auch sei. Lange Rede kurzer Sinn. Heraus gekommen ist ein kleines TrayIcon das ich auf Google gehostet habe: The Pomodoro Timer

Video zu VSTS2010 CTP Camano und UICoded Test

17.02.2009 09:26:00 | Christian Binder

Letzte Woche habe ich 2 Webcasts zu VSTS2010 CTP aufgenommen, die in kürze veröffentlicht werden. Im Focus der Webcasts steht der Solution Architekt, wobei ich nicht nur die Features der Architekt Edition behandelt habe, sondern auch Themen wie System Test und Neuerungen in den Bereichen Requirement Management/Reporting angesprochen habe. Zudem habe ich mich entschieden ein Teil der Demos des Webcast auch als kurzen Clip bereitzustellen, für alle die, die den Kontext nicht benötigen und nur die Demos mit dem CTP sehen wollen :-) Im ersten Video seht Ihr Camano, den Manual Testrunner und einen CodeUI Test.

Get Microsoft Silverlight

Video gibt's auf Channel9  

Morgen gibts den Architecture Explorer :-)

Viel Spass

Chris 

Weitere Vortragstermine stehen fest…

17.02.2009 07:55:05 | Lars Keller

Meine “kleine” User Group Tour geht weiter:

Vortragsthema bei allen zwei Terminen ist VSTO (Visual Studio Tools for Office), bzw. Office Business Application.

Ich freue mich! :)

MSDN-Codeclips@dotnet-snippets.de

17.02.2009 00:18:56 | Jan Welker

ClickPlayAuf dotnet-snippets.de tut sich was!
Ab sofort gibt es dort, neben den Snippets, auch Codeclips von MSDN-Solve zu bestaunen.

Codeclips sind Silverlight Videos, die in wenigen Minuten Antworten auf häufig gestellte Fragen geben.
Nach dem Motto "Frage? - Antwort!" passen Codeclips also hervorragend zum Snippet-Konzept.
Zu jedem Codeclip gibt es den passenden Quellcode in C# und in VB, sowie ein ausführliches How-To-Guide zum Download. Im Moment sind nur einige Clips online. Weitere Clips werden in Kürze von MSDN-Solve.de nach dotnet-snippets.de importiert.

Video

Auf der Startseite hab ich die Suche überarbeitet, so das es möglich ist, nur in den Snippets oder nur in den Codeclips zu suchen.

Suche

Selbstverständlich können die Codeclips auch bewertet und kommentiert werden, worüber wir uns sehr freuen würden.
Über neue Codeclip und Snippets werdet ihr per Rss Feed informiert, oder ihr folgt dotnet-snippets.de einfach bei Twitter.

Bitte postet keine Fragen als Kommentar, sondern nutzt dafür das dotnet-forum.de.

Tim Fischer und ich freuen sich über euer Feedback zur Integration der Codeclips ;-)

Und nun Viel Spaß beim durchstöbern der Codeclips und Snippets!

http://dotnet-snippets.de/dns/Default.aspx

4. ALT.NET DE Online Meeting: Test Driven Development

16.02.2009 12:14:16 | Albert Weinert

Am Montag den 23.02.2009 findet im Rahmen von VAN DE ein Vortrag über Test Driven Development/Behavior Driven Development statt.

Gabrial Schenker hat sich bereit erklärt in seiner unnachahmlichen Art uns TDD/BDD näher zu bringen.

Wie können wir Code schreiben, der möglichst fehlerfrei, robust, und leicht änderbar ist und es auch bleibt? Wie implementieren wir nur wirklich benötigte Funktionalität und sind von allem Anfang an auf zu erwartende Änderungswünsche des Kunden vorbereitet? Die Antwort auf diese Fragen lautet Test-getriebene Entwicklung (TDD).

Wie erreichen wir, dass Entwickler und Fachexperten oder allgemein Stakeholder dieselbe Sprache sprechen? Behavior driven development (BDD) liefert uns eine mögliche Antwort darauf.

Start ist 20 Uhr, seid pünktlich.

Anmeldung und Teilnahmeinformationen:.

http://www.altdotnet.de/OnlineMeeting_090223.ashx

Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.

Wir freuen uns euch dort zu begrüßen.

4. ALT.NET DE Online Meeting: Test Driven Development

16.02.2009 12:14:16 | Albert Weinert

Am Montag den 23.02.2009 findet im Rahmen von VAN DE ein Vortrag über Test Driven Development/Behavior Driven Development statt.

Gabrial Schenker hat sich bereit erklärt in seiner unnachahmlichen Art uns TDD/BDD näher zu bringen.

Wie können wir Code schreiben, der möglichst fehlerfrei, robust, und leicht änderbar ist und es auch bleibt? Wie implementieren wir nur wirklich benötigte Funktionalität und sind von allem Anfang an auf zu erwartende Änderungswünsche des Kunden vorbereitet? Die Antwort auf diese Fragen lautet Test-getriebene Entwicklung (TDD).

Wie erreichen wir, dass Entwickler und Fachexperten oder allgemein Stakeholder dieselbe Sprache sprechen? Behavior driven development (BDD) liefert uns eine mögliche Antwort darauf.

Start ist 20 Uhr, seid pünktlich.

Anmeldung und Teilnahmeinformationen:.

http://www.altdotnet.de/OnlineMeeting_090223.ashx

Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.

Wir freuen uns euch dort zu begrüßen.

Miguel de Icaza zum Launch von Moonlight (Silverlight für Linux) plus eine interessante Historie der Entwicklung von Moonlight

16.02.2009 11:31:32 | Steffen Ritter

Miguel de Icaza – seines Zeichens der Mastermind hinter der „Open Source .NET-Variante Mono“ und auch der Schöpfer der offiziellen Linux-Version von Silverlight – Moonlight – hat zum Release der ersten finalen Version von Moonlight eine interessante Historie der Entwicklung in seinem Blog geschrieben. Wie kam es dazu, was hat ihn fasziniert, was unterscheidet Moonlight 1.0 von einer reinen Silverlight 1.0-Implementierung, welche Rolle spielt Microsoft und wie hat Microsoft ihn und Novell speziell bei der Frage der Implementierung der eigentlich kostenpflichtigen Codes unterstützt…

xefqew
(IronPython 3D in Moonlight)

Lesenswert für alle, die sich für Silverlight/Moonlight interessieren und für alle die einen Einblick erhalten wollen, wie proaktiv Microsoft Moonlight unterstützt. Direkt zu Miguel de Icazas Blog: http://tirania.org/blog/archive/2009/Feb-11.html

Visual Studio Team System Information Days

16.02.2009 02:13:05 | Norbert Eder

Auch dieses Jahr haben Interessierte wieder die Möglichkeit, sich bei der regelmäßig stattfindenden Workshop-Reihe "Visual Studio Team System Information Days" Einblick in die unterschiedlichen Rollen eines Entwicklungsprozesses und deren koordinierte Zusammenarbeit zu verschaffen. Als ganzheitliches Toolset "aus eigener...

Zu Besuch bei der DNUG Regensburg

15.02.2009 20:28:19 | Lars Keller

Letzten Montag war ich bei der .NET User Group Regensburg zu Besuch und habe einen Vortrag zu dem Thema VSTO (Visual Studio Tools for Office) gehalten.

In diesem habe ich die verschiedenen Möglichkeiten aufgezeigt Excel, Word und Outlook zu erweitern, angefangen vom Ribbon Customizing über Word Content Controls bis hin zum Einsatz von WPF & LINQ. Des Weiteren haben wir über das Deployment und über das kommende VSTO 4 & C# 4.0 gesprochen.

Wie versprochen hier meine Slides und Demo-Codebeispiele.

Download Slides

Download Code

Der Abend hat großen Spaß gemacht und das Zwickerl Bier war auch sehr lecker! ;-)



This weblog is sponsored by netcreate OHG.

Zu Besuch bei der DNUG Regensburg

15.02.2009 19:28:19 | Lars Keller

Letzten Montag war ich bei der .NET User Group Regensburg zu Besuch und habe einen Vortrag zu dem Thema VSTO (Visual Studio Tools for Office) gehalten.

In diesem habe ich die verschiedenen Möglichkeiten aufgezeigt Excel, Word und Outlook zu erweitern, angefangen vom Ribbon Customizing über Word Content Controls bis hin zum Einsatz von WPF & LINQ. Des Weiteren haben wir über das Deployment und über das kommende VSTO 4 & C# 4.0 gesprochen.

Wie versprochen hier meine Slides und Demo-Codebeispiele.

Download Slides

Download Code

Der Abend hat großen Spaß gemacht und das Zwickerl Bier war auch sehr lecker! ;-)

A reasonable way to spend sundays

15.02.2009 12:44:25 | Andre Loker

Watch and learn :-)

cat

Zu Besuch bei der DNUG Regensburg

15.02.2009 10:28:01 | Lars Keller

Letzten Montag war ich bei der .NET User Group Regensburg zu Besuch und habe einen Vortrag zu dem Thema VSTO (Visual Studio Tools for Office) gehalten.

In diesem habe ich die verschiedenen Möglichkeiten aufgezeigt Excel, Word und Outlook zu erweitern, angefangen vom Ribbon Customizing über Word Content Controls bis hin zum Einsatz von WPF & LINQ. Des Weiteren haben wir über das Deployment und über das kommende VSTO 4 & C# 4.0 gesprochen.

Wie versprochen hier meine Slides und Demo-Codebeispiele.

Download Slides

Download Code

Der Abend hat großen Spaß gemacht und das Zwickerl Bier war auch sehr lecker! ;-)

SociableBE-Extension for BlogEngine.NET

15.02.2009 03:42:22 | Gordon Breuer

BlogEngine-NET One of the greatest blog engines based on .NET is BlogEngine.NET with a lot of advantages to it’s competitors. Unfortunately there aren’t as much themes and plugins available as for other engines like DasBlog or Wordpress. One famous plugin for Wordpress is Sociable, “which adds social media buttons to your posts, and does so easily, and beautifully”.  There are over 100 bookmarking services integrated and you can choose in your admin-interface which you want to show under your articles for your users.

I tried some of the available social bookmarking extensions for BlogEngine.NET but none had satisfied me. Sociable looks good but it’s written in PHP and only available for Wordpress. It’s rendering it’s output with two simple div’s and a unordered list with some simple stylesheets. I made a blank extension and started to implement this output for BE.NET. The most bulky part was the adoption of all those bookmark services. To make adding new services easier I made a struct with properties for:

  • name of the service
  • url for adding links with placeholders
  • name of a service-specific css-class
  • filename of the icon
  • a unique identifier

So adding a entry e.g. for del.icio.us is as simple as this:

new SociableBEEntry(++i,
                    "del.icio.us",
                    "http://del.icio.us/post?url=PERMALINK&amp;title=TITLE",
                    "delicious.png")

Currently all bookmarking services of Sociable are integrated plus “msdn Social”, the social bookmarking service from Microsoft for developers.

(c) photocase.com This is the first version of SociableBE (a combination of “Sociable” and “BE” for BlogEngine.NET) so there is no shiny web2.0 interface with drag & drop of the used services in the admin-panel like in the original plugin. My main focus was to afford a simple interface for choosing the bookmarking services you want to use, so there are two ListBoxes with a add- and remove-button. Two other buttons (plus and minus) are for re-ordering the enabled services. There are also two input fields for the tagline and the image-path. One flaw is the static path to “~/SociableBE/” for the admin-page, the css-file and the loading-animation. Best is when leaving the images in this folder, too, and don’t touch the Image-Path setting. ;-)

You have full control over the design editing the css-file. For most cases it should be ok. Currently the extension is rendering valid xhtml 1.0 transitional code. It’s not strict-valid because I’m using the target-attribute for the generated links. I will add a option to disable this behavior in my next release.

Do you have other suggestions you would like to see within this extension? Know a bookmarking-service yet missing? Just leave a comment or write me a short mail and I will schedule it perhaps for one of the coming updates. Any other great Wordpress plugins you would like to see adapted for the BlogEngine.NET? Give me a hint and if I can take advantage of it I will see what I can do. If you are using SociableBE on your blog I would appreciate a short notice via email, comment or twitter (@anheledir) – I’m a statistics-junkie and would love to see who is using it. :-)

Screenshots:

 administration output
Mehr…

ChkDskAll ‒ ChkDsk For All Drives

14.02.2009 16:41:57 | Alexander Groß

The Windows file systems (NTFS and FAT) are able to automatically detect if they are broken. You can even specify when that automatic check should be performed. But sometimes you would want to force a file system check, for example when Windows suddenly behaves strangely for no obvious reason. (For example last year, the day before I went on a month-long vacation, Vista suddenly refused to boot.)

In order to schedule a file system check for the next reboot you will have to

  1. Open an elevated command prompt or log in as an administrator,
  2. Run chkdsk <Drive>: /f,
  3. Rinse and repeat for all installed drives.

This task isn’t easy for inexperienced users, especially given that they might not know about the chkdsk command line tool in the first place. They could use the UI, but would have to repeat the process for each and every drive nonetheless.

Chkdsk UI

To make this task easier, I wrote a little .NET application that automates scheduling file system check for all drives at the next boot. Just double-click ChkDskAll.exe, enter administrative credentials and wait for the goodness to happen.

ChkDskAll In Action

If a drive has already been scheduled for scanning, it won’t be scheduled a second time. To exclude drives from being included in the scan, have a look at ChkdskAll.exe.config. For example, TrueCrypt drives should be excluded if you do not mount them as fixed drives.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <!-- The list of excluded drives, e. g. "CDE". -->
        <add key="ExcludeDrives" value="YZ"/>
    </appSettings>
</configuration>

ChkDskAll ‒ ChkDsk For All Drives

14.02.2009 16:41:57 | Alexander Groß

The Windows file systems (NTFS and FAT) are able to automatically detect if they are broken. You can even specify when that automatic check should be performed. But sometimes you would want to force a file system check, for example when Windows suddenly behaves strangely for no obvious reason. (For example last year, the day before I went on a month-long vacation, Vista suddenly refused to boot.)

In order to schedule a file system check for the next reboot you will have to

  1. Open an elevated command prompt or log in as an administrator,
  2. Run chkdsk <Drive>: /f,
  3. Rinse and repeat for all installed drives.

This task isn’t easy for inexperienced users, especially given that they might not know about the chkdsk command line tool in the first place. They could use the UI, but would have to repeat the process for each and every drive nonetheless.

Chkdsk UI

To make this task easier, I wrote a little .NET application that automates scheduling file system check for all drives at the next boot. Just double-click ChkDskAll.exe, enter administrative credentials and wait for the goodness to happen.

ChkDskAll In Action

If a drive has already been scheduled for scanning, it won’t be scheduled a second time. To exclude drives from being included in the scan, have a look at ChkdskAll.exe.config. For example, TrueCrypt drives should be excluded if you do not mount them as fixed drives.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <!-- The list of excluded drives, e. g. "CDE". -->
        <add key="ExcludeDrives" value="YZ"/>
    </appSettings>
</configuration>

First attempts with Gallio

14.02.2009 14:21:45 | Andre Loker

From time to time I like to check my development workflow and tools to see whether I’m still up to date. This time I thought it might be a nice idea to give Gallio a shot. If you don’t now Gallio: it is a platform to uniformly run unit tests from whatever unit test framework (MbUnit, NUnit, MSTest etc.) you use. At least that’s how I understand Gallio’s mission. It also integrates into a bunch of other tools which I use (CruiseControl.NET, NAnt, NCover, ReSharper et al).

So basically it sounds like a cool idea. On top of it, version 3 of MbUnit – my favourite unit testing framework – is available only bundled with Gallio, that's why decided to give it try. Until I only used MbUnit 2.4.

And here’s a list of twitter-esque thoughts about Gallio that came up during my first 60 minutes of use.

  • Installation is no problem
  • Migrating from MbUnit 2.4 to MbUnit 3 didn’t take much effort, at least for the small project I chose for my Gallio evaluation. Mainly I had to replace the RowTest attribute with a conventional Test attribute, because row tests have been consolidated into the normal tests. But you can also use the MbUnit.Compatibility Assembly and don’t change the existing tests at all. Big plus!
  • The documentation is rather incomplete. There are still a lot of TODOs. Especially a migration guide for MbUnit 2 users would be really useful.
  • Integration into Testdriven.NET works well, no problems here…
  • … although the test runner feels a little less snappy than MbUnit 2.4, startup time is slightly higher. The 190 unit tests in the small test project took about 5,2 seconds using MbUnit 2.4 and 7 seconds using MbUnit. I’ve yet to test how this scales with more tests.
  • ReSharper integration seems to be incomplete and instable. If I use MbUnit 2.4 tests, not all tests are run. Only about 30 of my tests appeared in the unit test browser. Using MbUnit 3, all tests were found, but occasionally ReSharper through exceptions when I selected failed tests.
  • Using Testdriven.NET’s “Test with”=>”Gallio Icarus” context menu action fires up Icarus (the Gallio test running GUI) but doesn’t load the assembly of the project that I want to test.
  • Running tests in Icarus is unbearably slow. The tests took more than 40 seconds to run (compare that to the 7 seconds using Testdriven.NET or even 5 seconds using MbUnit 2.4 + Testdriven.NET).
    image
    I guess this is due to the fact that the result window is refreshed after every single unit tests. Thus, the performance even degrades with every additional unit tests. I wonder what happened if I were to run tests of my bigger projects.
  • The one real showstopper however is the fact that suddenly unit tests begin to fail that have been perfectly valid before. This happens when I use Rhino.Mocks to create a partial mock and expect for an ArgumentNullException to be thrown in the ctor of the partially mocked type. Luckily this is easily reproducible:

Class under test:

 public abstract class SomeClass {
   // Throws ArgumentNullException if value is null
   protected SomeClass(string value) {
     if (value == null) {
       throw new ArgumentNullException("value");
     }
   }
 }

The unit test:

 [Test, ExpectedArgumentNullException]
 public void CtorShouldThrowIfArgumentIsNull() {
   var mocks = new MockRepository();
   mocks.PartialMock<SomeClass>(default(string));
 }

Results when run under MbUnit 2.4

image

Results when run under MbUnit 3

image

A System.ArgumentNullException is expected, but instead a System.ArgumentNullException has been thrown. Possibly it’s a framework version conflict, I don’t know. Anyway, a bug report is on its way (uodate 02/20/2009: the bug report has been closed as won’t fix).

My personal conclusion for now

I really appreciate the idea behind Gallio to unify unit testing. Different projects use different unit testing frameworks. Especially in connection with automated builds it could be useful to have one test runner that supports them all. And of course, I really like that they have chosen MbUnit as their primary unit testing framework, because I think MbUnit rocks and is superior to the rather basic NUnit. I haven’t looked much into the version 3 API of MbUnit, but I think there are some nifty new features that can be really useful in daily life - I’d really like to use them.

But no matter I sympathise with this project, it has some major flaws: lack of documentation, a sluggish GUI, perfectly valid tests that fail, integration issues. All those things sum converge into a situation that makes Gallio not really usable for me as it is now.

Nevertheless Gallio is very promising. I will definitively come back to it from time to time to see how it improves. To the Gallio developers: you’re doing the right thing, keep it up!

BTW: The Gallio people have established a merchandising shop, which I think is intended to support the project moneywise. I think it’s a cool way to support a project and still get something back. But please don’t forget to put the major part of you energy into the project itself, not the merchandising!

Simple AOP: call interception with DynamicProxy

14.02.2009 02:37:00 | Andre Loker

Aspect oriented programming (AOP) allows us to keep implement different concerns in isolation. In this article series I’ll describe ways to make use of AOP without much hassle. After the introduction to AOP in the first article I’ll show how we can use Castle DynamicProxy to intercept method calls for the injection of advice code.

Introduction

If you’re reading this, you are probably interested in AOP and want to know how you can practise separation of concerns in you .NET application. There are quite some AOP frameworks available for .NET, so you might just grab the one that best fits your need. Below you’ll find an (incomplete!) overview of existing AOP frameworks for .NET

Examples for frameworks using compile time weaving/IL level manipulation:

Those frameworks weave the aspect code into compiled assemblies by modifying the IL code.

Examples for frameworks using proxy-based runtime weaving

The common technique behind those framework is this: for each class that needs to have advices applied to it the framework creates a subclass at runtime using the runtime code generation facilities of .NET. Each virtual call or interface method implementation is overridden. Those overridden methods can then redirect the call to the advices. As a result those frameworks normally only support a very small join point model, limited to the calls of virtual methods or interface methods. However, in many practical cases, this limitation is not that much of an issue.

Choose your destiny

Here we already have six frameworks to choose from. The question is: which one should I use or should I even use a different approach? I haven’t used all of those frameworks, so I can’t go into a detailed analysis of their commonalities and differences. Nevertheless, here are some general thoughts:

  1. If a specific concern is suitable for static weaving you probably want to go that way. As mentioned in the first article, compile time weaving has several benefits, especially allowing a much richer join point model and slightly less overhead.
  2. If you use Spring.NET or S2Container as your IoC container, using the respective AOP facility is probably the recommended way.
  3. If you need dynamic weaving and use the Castle stack read on, that’s what the rest of this article is about!

Castle facilities

Interestingly enough, Castle once had an AOP facility itself. It has been discontinued a while ago because apparently it wasn’t used much. It’s not that people find AOP as a concept useless, but it seems that a fully blown AOP framework is not required in many cases. Instead, people find a different facility to be sufficient, namely DynamicProxy2.

DynamicProxy2 (DP2) is a library that generates proxy types at runtime. DP2 supports different proxy strategies. In the case of AOP, two strategies are the most important:

  1. Create a class proxy: DP2 derives a proxy class from a given type.

class proxy

  1. Create an interface proxy with a target: instead of deriving from the target type, this strategy creates an implementation of one (or multiple) of the interfaces that the target type implements. This strategy resembles the classic Proxy pattern, because the instance created by DP2 replaces the target object.

interface proxy

Interceptors

Just creating new types at runtime is rather useless if that’s all. Of course, there is more. When you use DP2 to create the proxy instances you can provide one or more interceptors. An interceptor is an object implementing IInterceptor, which looks like this:

 public interface IInterceptor
 {
     void Intercept(IInvocation invocation);
 }

Each virtual or interface method that the DP2 proxy generator overrides or implements respectively will call the Intercept() method of the interceptors you pass to the generator method. The IInvocation instance passed to the interceptor contains information about the method being intercepted:

 public interface IInvocation
 {
     // Methods
     object GetArgumentValue(int index);
     MethodInfo GetConcreteMethod();
     MethodInfo GetConcreteMethodInvocationTarget();
     void Proceed();
     void SetArgumentValue(int index, object value);
  
     // Properties
     object[] Arguments { get; }
     Type[] GenericArguments { get; }
     object InvocationTarget { get; }
     MethodInfo Method { get; }
     MethodInfo MethodInvocationTarget { get; }
     object Proxy { get; }
     object ReturnValue { get; set; }
     Type TargetType { get; }
 }

One of the most important members is Proceed() which will call the next IInterceptor for the current proxy or – if the current interceptor is the last one – it will invoke the “real” method.

DP2 in practice

Let’s put all this theoretic mumbo-jumbo into practice, shall we?

First, here’s our ultra complex domain model:

 // A service interface...
 public interface IService {
   void DoSomething();
 }
  
 // ... and its implementation
 public class Service : IService {
   public void DoSomething() {
     Console.Out.WriteLine("Service.DoSomething()");
   }
 }

Nothing fancy here. Here’s our application code:

 public class Program {
   public static void Main() {
     IService service = CreateService();
     service.DoSomething();
   }
  
   private static IService CreateService() {
     return new Service();
   }
 }

If we run this – surprise – this is the result (the last line is “Press any key” in German)

image

Now we introduce DynamicProxy2. First off, add a reference to Castle.Core.dll and Castle.DynamicProxy2.dll.  Now we can write our first interceptor:

 public class LogInterceptor : IInterceptor {
   public void Intercept(IInvocation invocation) {
     Console.WriteLine("Intercepting {0}", invocation.Method.Name);
   }
 }

Not bad so far. Finally, we need to inject the interceptor into the target. To do this, modify CreateService like this:

 private static IService CreateService() {
   var dp = new ProxyGenerator();
   var target = new Service();
   var interceptor = new LogInterceptor();
   return dp.CreateInterfaceProxyWithTarget<IService>(target, interceptor);
 } 

Now run the code again:

image

Wait, where’s “Service.DoSomething()”? We forgot one thing: if we don’t call Proceed() on the IInvocation object in Intercept(), the original method (or the next interceptor) won’t be called, so adjust the LogInterceptor like this:

 public void Intercept(IInvocation invocation) {
   Console.WriteLine("Intercepting {0}", invocation.Method.Name);
   // invoke next interceptor/intercepted method
   invocation.Proceed();
 }

And voilá:

image

You see, calling Proceed() is necessary to have the intercepted method executed. This has several positive side effects:

  1. We can intentionally decide to block the call to the intercepted methods, for example for security reasons
  2. In the interceptor we can provide that has to be called before and after the execution of the intercepted method (“around advice” anyone?)
  3. We can “fork”, i.e. we can invoke the intercepted method multiple times

If we have more than one interceptor, calling Proceed() will only invoke the intercepted method if the current interceptor is the last one. Calling Proceed() in interceptors that are earlier in the chain will instead invoke the next interceptor. Here’s a collaboration diagram of a proxy with two interceptors:

image

Personally I think that having Proceed() do the right thing transparently is a wise choice.

The link to AOP

You’ve probably already noticed where this is going. We can use DP2 and the interceptors to implement our advices. Out advices are in fact implementations of IInterceptor and the ProxyGenerator acts as the weaver. Here’s another (not really useful) advice using IInterceptor:

 public class ExceptionAdvice : IInterceptor {
  
   public bool EatAll { get; set; }
  
   public void Intercept(IInvocation invocation) {
     try {
       invocation.Proceed();
     } catch (Exception e) {
       Console.WriteLine("{0} caught: {1}", e.GetType().Name, e.Message);
       if (!EatAll) {
         throw;
       }
     }
   }
 }

Let’s add it into our case:

 private static IService CreateService() {
   var dp = new ProxyGenerator();
   var target = new Service();
   var interceptor = new LogInterceptor();
   // swallow all exceptions
   var exceptionAdvice = new ExceptionAdvice {EatAll = true};
   return dp.CreateInterfaceProxyWithTarget<IService>(target, interceptor, exceptionAdvice);
 }

If Service.SomeMethod now throws an exception we see this:

image

I’m sure you can come up with a bunch of more realistic concerns that could be implemented using IInterceptors.

Loose ends

Intercepting join points is probably one of the technically most difficult parts of an AOP framework. Luckily Castle DynamicProxy is a feasible tool for this. Let’s see how this intermediate solution compares to a “real” AOP framework:

  • All methods of the target are intercepted. Sometimes you want only a subset of the methods based e.g. on an attribute or the name of the method. Therefore the Intercept method needs to further filter invocations. It would be cool if we could somehow more declaratively define our pointcuts.
  • We have to explicitly generate the proxies with the interceptors. We’d like to have this done automatically. Luckily Castle Windsor, the IoC container of the Castle stack, has this feature built in, so we can make the interceptors part of the component model.
  • We can only intercept virtual methods or interface methods. Well, there’s not much we can do about it, this is an inherent problem of the proxy based weaving approach. If you need a richer join point model, have a look at frameworks supporting compile time weaving.
  • We currently only support around advices. That’s not too bad, given that it is the “mother” of all advices we can “derive” all kind of advice types. For example, you can provide a set of abstract advice classes from which the concrete advices are derived. Just derive from the correct advice type and implement the abstract method (decide for yourself whether this approach is useful for you):
 public abstract class AroundAdvice : IInterceptor {
   void IInterceptor.Intercept(IInvocation invocation) {
     Around(invocation);
   }
  
   protected abstract void Around(IInvocation invocation);
 }
  
 public abstract class BeforeAdvice : IInterceptor {
   void IInterceptor.Intercept(IInvocation invocation) {
     Before(invocation);
     invocation.Proceed();
   }
  
   protected abstract void Before(IInvocation invocation);
 }
  
 public abstract class AfterAdvice : IInterceptor {
   void IInterceptor.Intercept(IInvocation invocation) {
     try {
       invocation.Proceed();
     } finally {
       After(invocation);
     }
   }
  
   protected abstract void After(IInvocation invocation);
 }
  
 public abstract class AfterReturningAdvice : IInterceptor {
   void IInterceptor.Intercept(IInvocation invocation) {
     invocation.Proceed();
     AfterReturning(invocation);
   }
  
   protected abstract void AfterReturning(IInvocation invocation);
 }
  
 public abstract class AfterThrowingAdvice : IInterceptor {
   void IInterceptor.Intercept(IInvocation invocation) {
     try {
       invocation.Proceed();
     } catch (Exception e) {
       AfterThrowing(invocation, e);
     }
   }
  
   protected abstract void AfterThrowing(IInvocation invocation, Exception e);
 }

Preview

The next part of the series will cover integration of interceptors into Castle Windsor. Have fun!

Attached you'll find the source code for this article.

DynamicProxyEx1.zip (243.14 kb)

Other articles in this series:

Windows Live Writer overwriting uploaded files

13.02.2009 22:52:19 | Andre Loker

Weird, I didn’t notice it for quite some time. It seems that since version 2009 Windows Live Writer has changed they that uploaded (images etc) files are called. If you look at older posts you’ll see that the images were uploaded to /WindowsLiveWriter/{article name}_{some number}/image_{some number}.png the data folder of my blog. It seems that some smart guy decided to change this behaviour to something short as /{filename}. The blog overwrites this file if it exists so if you were to use the same file name in multiple articles you’d happily overwrite the older version with the new one.

This becomes even more unpleasant if you keep in mind that images that are pasted from the clipboard into WLW will all have the name “image.png”. Guess what: if you publish an article with multiple images pasted from the clipboard you’ll end up with all images being the same.

I hope that this is just some hidden setting in WLW, but until now I couldn’t find it.

Now, actually I did find something. After some time of searching I found a comment in another blog that at least provided an initial hint of how to work on this problem. You can change the format of uploaded file names with a registry key:

HKEY_CURRENT_USER\Software\Microsoft\Windows Live\Writer\Weblogs\(BLOGID)\UserOptionOverrides

where (BLOGID) is different for each blog registered in WLW. Within that key create a string value name fileUploadNameFormat and assign it a string representing the format of the uploaded files, for example WindowsLiveWriter/{PostTitle}_{PostRandomizer}/{FileName}. At least now we have a distinct subfolder per article again. Anyway, still no fancy auto numbering of the images, therefore the problem with multiple pasted images won’t be solved with this registry entry.

Because I don’t have any desire to lose uploaded files I chose for a more conventional solution: I modified the blog software to never overwrite uploaded files. If a file name collision is encountered the file is moved into a subfolder named after some GUID.

It has the drawback that changing an image from within WLW will always cause a new file to be added to the server (instead of replacing the old one). Anyway, I prefer a few more files on the server over overridden files.

Nevertheless I find it a bit weird that I haven’t read much about this issue yet. Maybe it really is only me using some wrong settings?

Creating Remote Desktop Connection Files On The Fly With PowerShell

13.02.2009 18:28:51 | Alexander Groß

About a month ago I got myself an IBM Lenovo X301 laptop. It’s the third machine I regularly use: I have a desktop at work, one workstation at home and now there also is the sweet X301. Even with only the second machine at work in place I found it crucial to keep my work environments automatically in sync. Live Mesh has been of great help with that. Despite being a CPU hog at times, it’s a great tool to synchronize your files across machines.

Now with Remote Desktop Connection files (*.rdp) there is actually a bit more work involved than just syncing files. My workstations both have two monitors and I like Remote Desktop windows to be placed on the second monitor. The laptop, on the other hand just has a single display (surprise!) and less screen real estate. Because of the varying screen resolutions a RDP window on my home workstation will not fit the display area at work without obscuring other UI  elements like the taskbar. On the laptop, the situation gets worse as the display is simply not large enough to fit my default window size of 1500x1024 pixels.

Desktops

The dimensions and location of the Remote Desktop window is stored in the plain-text RDP file itself. A conceivable solution might be to create three RDP files per server, one for each of my machines. Actually this would involve touching three files every time I need to change some value for the connection. Horrible.

Fortunately there is PowerShell to the rescue. There’s even a script that you can use to create RDP files on the fly. You’ll have to patch line 178 to make it work (see below). Also make the Set-RDPSetting function global by uncommenting lines 87 and 216.

# Old
$content += @("${tempname}:$($datatypes[$tempname]):$tempvalue")

# New
$content += @("${tempname}:$($datatypes[$tempname]):$tempvalue" + [System.Environment]::NewLine)

Now that we're set to use the Set-RDPSetting function, let us create a script to create a RDP file in the system’s temporary folder. See the highlighted lines below, there are three hashtables:

  • $workstations for your workstations (mine are AXL, FIRIEL and EOWYN),
  • $servers for the RDP servers you want to connect to and
  • $defaults for default connection properties.
. c:\Path\To\Set-RDPSetting.ps1

$workstations = @{
	'AXL' = @{
		'desktopwidth' = 1500
		'desktopheight' = 1024
		}
	'FIRIEL' = @{
		'desktopwidth' = 1300
		'desktopheight' = 800
		}
	'EOWYN' = @{
		'desktopwidth' = 1300
		'desktopheight' = 800
		}
	}
	
$servers = @{
	'192.168.6.161' = @{
		'session bpp' = 24
		'domain' = 'DEVELOPMENT'
		}
	'host.with.ssl.certificate' = @{
		'session bpp' = 24
		'authentication level' = 2
		'disable wallpaper' = $true
		'desktopwidth' = 1280
		'desktopheight' = 1024
		}
	}

# http://dev.remotenetworktechnology.com/ts/rdpfile.htm
$defaults = @{
	'allow desktop composition' = $true
	'allow font smoothing' = $true
	'alternate shell' = $null
	'audiomode' = 2
	'authentication level' = $false
	'auto connect' = $true
	'autoreconnection enabled' = $true
	'bitmapcachepersistenable' = $true
	'compression' = $true
	'connect to console' = $false
	'desktopheight' = $null
	'desktopwidth' = $null
	'disable cursor setting' = $false
	'disable full window drag' = $false
	'disable menu anims' = $true
	'disable themes' = $false
	'disable wallpaper' = $false
	'displayconnectionbar' = $true
	'domain' = $null
	'drivestoredirect' = '*'
	'full address' = $args[0]
	'keyboardhook' = 1
	'maximizeshell' = $false
	'negotiate security layer' = $true
	'prompt for credentials' = $false
	'promptcredentialonce' = $true
	'redirectclipboard' = $true
	'redirectcomports' = $false
	'redirectdrives' = $false
	'redirectposdevices' = $false
	'redirectprinters' = $false
	'redirectsmartcards' = $false
	'remoteapplicationmode' = $false
	'screen mode id' = 1
	'server port' = 3389
	'session bpp' = 32
	'shell working directory' = $null
	'smart sizing' = $true
	'username' = 'agross' # Does not really matter what's in here.
	# http://blogs.msdn.com/ts/archive/2008/09/02/specifying-the-ts-client-start-location-on-the-virtual-desktop.aspx
	'winposstr' = '0,3,2046,129,3086,933'	
	}

Next we check if the local machine has a configuration section in the $workstations hashtable and the script has been called with parameters.

if ($workstations.Keys -inotcontains $Env:ComputerName)
{
	"The local computer is not configured."
	exit
}

if ($args -eq $null -or $args.Length -eq 0)
{
	"No arguments. Supply the RDP server name as the first argument."
	exit
}

Note the Patch-Defaults function and how we use it to add and replace keys in the $defaults hashtable. The replacement values come from $workstations and $servers, with the server settings having precedence. This way, you can configure the connection profile according to the current machine and the server to which the connection will be made. Flexibility!

function Patch-Defaults
{
	param(
		[Hashtable] $defaults = $(Throw "Defaults hashtable is missing"),
		[Hashtable] $patch = $(Throw "Patch hashtable is missing")
		)

	end
	{
		if ($patch -ne $null)
		{
			$patch.GetEnumerator() | ForEach-Object { $defaults[$_.Name] = $_.Value }
		}
	}
}	

Patch-Defaults -Defaults $defaults -Patch $workstations[$Env:ComputerName.ToUpper()]
Patch-Defaults -Defaults $defaults -Patch $servers[$args[0].ToLower()]
$defaults.GetEnumerator() | Sort-Object -Property Name

Now that we have all connection properties in place, we create a temporary connection file from the hashtable key/value pairs and start mstsc.exe with that file.

$tempFile = [System.IO.Path]::GetTempFileName()
$defaults.GetEnumerator() | Sort-Object -Property Name | Set-RDPSetting -Path $tempFile -Name $_ -Value $_

# For debugging purposes.
#"Temporary file: " + $tempFile
#Get-Content $tempFile
#Read-Host

$MstscCommand = $Env:SystemRoot + "\system32\mstsc.exe"
&$MstscCommand $tempFile

How do we use the script we just created?

You can either create batch files calling the script or use a tool like SlickRun to execute PowerShell with the script.

@powershell.exe -noprofile -command .\Open-CustomRDP.ps1 your.server.example

Another tedious task has been automated!

Creating Remote Desktop Connection Files On The Fly With PowerShell

13.02.2009 18:28:51 | Alexander Groß

About a month ago I got myself an IBM Lenovo X301 laptop. It’s the third machine I regularly use: I have a desktop at work, one workstation at home and now there also is the sweet X301. Even with only the second machine at work in place I found it crucial to keep my work environments automatically in sync. Live Mesh has been of great help with that. Despite being a CPU hog at times, it’s a great tool to synchronize your files across machines.

Now with Remote Desktop Connection files (*.rdp) there is actually a bit more work involved than just syncing files. My workstations both have two monitors and I like Remote Desktop windows to be placed on the second monitor. The laptop, on the other hand just has a single display (surprise!) and less screen real estate. Because of the varying screen resolutions a RDP window on my home workstation will not fit the display area at work without obscuring other UI  elements like the taskbar. On the laptop, the situation gets worse as the display is simply not large enough to fit my default window size of 1500x1024 pixels.

Desktops

The dimensions and location of the Remote Desktop window is stored in the plain-text RDP file itself. A conceivable solution might be to create three RDP files per server, one for each of my machines. Actually this would involve touching three files every time I need to change some value for the connection. Horrible.

Fortunately there is PowerShell to the rescue. There’s even a script that you can use to create RDP files on the fly. You’ll have to patch line 178 to make it work (see below). Also make the Set-RDPSetting function global by uncommenting lines 87 and 216.

# Old
$content += @("${tempname}:$($datatypes[$tempname]):$tempvalue")

# New
$content += @("${tempname}:$($datatypes[$tempname]):$tempvalue" + [System.Environment]::NewLine)

Now that we're set to use the Set-RDPSetting function, let us create a script to create a RDP file in the system’s temporary folder. See the highlighted lines below, there are three hashtables:

  • $workstations for your workstations (mine are AXL, FIRIEL and EOWYN),
  • $servers for the RDP servers you want to connect to and
  • $defaults for default connection properties.
. c:\Path\To\Set-RDPSetting.ps1

$workstations = @{
	'AXL' = @{
		'desktopwidth' = 1500
		'desktopheight' = 1024
		}
	'FIRIEL' = @{
		'desktopwidth' = 1300
		'desktopheight' = 800
		}
	'EOWYN' = @{
		'desktopwidth' = 1300
		'desktopheight' = 800
		}
	}
	
$servers = @{
	'192.168.6.161' = @{
		'session bpp' = 24
		'domain' = 'DEVELOPMENT'
		}
	'host.with.ssl.certificate' = @{
		'session bpp' = 24
		'authentication level' = 2
		'disable wallpaper' = $true
		'desktopwidth' = 1280
		'desktopheight' = 1024
		}
	}

# http://dev.remotenetworktechnology.com/ts/rdpfile.htm
$defaults = @{
	'allow desktop composition' = $true
	'allow font smoothing' = $true
	'alternate shell' = $null
	'audiomode' = 2
	'authentication level' = $false
	'auto connect' = $true
	'autoreconnection enabled' = $true
	'bitmapcachepersistenable' = $true
	'compression' = $true
	'connect to console' = $false
	'desktopheight' = $null
	'desktopwidth' = $null
	'disable cursor setting' = $false
	'disable full window drag' = $false
	'disable menu anims' = $true
	'disable themes' = $false
	'disable wallpaper' = $false
	'displayconnectionbar' = $true
	'domain' = $null
	'drivestoredirect' = '*'
	'full address' = $args[0]
	'keyboardhook' = 1
	'maximizeshell' = $false
	'negotiate security layer' = $true
	'prompt for credentials' = $false
	'promptcredentialonce' = $true
	'redirectclipboard' = $true
	'redirectcomports' = $false
	'redirectdrives' = $false
	'redirectposdevices' = $false
	'redirectprinters' = $false
	'redirectsmartcards' = $false
	'remoteapplicationmode' = $false
	'screen mode id' = 1
	'server port' = 3389
	'session bpp' = 32
	'shell working directory' = $null
	'smart sizing' = $true
	'username' = 'agross' # Does not really matter what's in here.
	# http://blogs.msdn.com/ts/archive/2008/09/02/specifying-the-ts-client-start-location-on-the-virtual-desktop.aspx
	'winposstr' = '0,3,2046,129,3086,933'	
	}

Next we check if the local machine has a configuration section in the $workstations hashtable and the script has been called with parameters.

if ($workstations.Keys -inotcontains $Env:ComputerName)
{
	"The local computer is not configured."
	exit
}

if ($args -eq $null -or $args.Length -eq 0)
{
	"No arguments. Supply the RDP server name as the first argument."
	exit
}

Note the Patch-Defaults function and how we use it to add and replace keys in the $defaults hashtable. The replacement values come from $workstations and $servers, with the server settings having precedence. This way, you can configure the connection profile according to the current machine and the server to which the connection will be made. Flexibility!

function Patch-Defaults
{
	param(
		[Hashtable] $defaults = $(Throw "Defaults hashtable is missing"),
		[Hashtable] $patch = $(Throw "Patch hashtable is missing")
		)

	end
	{
		if ($patch -ne $null)
		{
			$patch.GetEnumerator() | ForEach-Object { $defaults[$_.Name] = $_.Value }
		}
	}
}	

Patch-Defaults -Defaults $defaults -Patch $workstations[$Env:ComputerName.ToUpper()]
Patch-Defaults -Defaults $defaults -Patch $servers[$args[0].ToLower()]
$defaults.GetEnumerator() | Sort-Object -Property Name

Now that we have all connection properties in place, we create a temporary connection file from the hashtable key/value pairs and start mstsc.exe with that file.

$tempFile = [System.IO.Path]::GetTempFileName()
$defaults.GetEnumerator() | Sort-Object -Property Name | Set-RDPSetting -Path $tempFile -Name $_ -Value $_

# For debugging purposes.
#"Temporary file: " + $tempFile
#Get-Content $tempFile
#Read-Host

$MstscCommand = $Env:SystemRoot + "\system32\mstsc.exe"
&$MstscCommand $tempFile

How do we use the script we just created?

You can either create batch files calling the script or use a tool like SlickRun to execute PowerShell with the script.

@powershell.exe -noprofile -command .\Open-CustomRDP.ps1 your.server.example

Another tedious task has been automated!

Virtual Earth – Routendetails in HTML rendern

13.02.2009 17:28:15 | Jan Schenk

Ich bin mal wieder schockiert. Mehr als das, ich bin platt. Total überrascht.

Warum? Weil es mal wieder so einfach war.

Was? Siehe Überschrift.

renderroute

 

 

Ich habe vorher eine Anfrage bekommen auf meinen Webcast “Virtual Earth Routenberechnung”, wie man auf die Details der Route zugreifen kann. Ich also einfach mal ausprobiert: Neues Projekt, eine Karte eingebettet, eine Route berechnet und dann ein bisschen im Netz gesucht. Voila. Über “onservergetdirections=[…]” als Parameter der Virtual Earth-Karte lässt sich eine Funktion aufrufen, die als Argumente die berechnete Route übergeben bekommt.

 

 

 

 

Das ganze sieht dann so aus:

Default.aspx:

   1: <asp:ScriptManager ID="ScriptManager1" runat="server">
   2: </asp:ScriptManager>
   3: <div>
   4:     <ve:Map ID="Map1" runat="server" Height="400px" Width="400px" ZoomLevel="4" 
   5:         onservergetdirections="Map1_ServerGetDirections" />
   6:     <asp:UpdatePanel ID="UpdatePanel1" runat="server">
   7:         <ContentTemplate>
   8:             From:
   9:             <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  10:             &nbsp;To:
  11:             <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
  12:             <asp:Button ID="Button1" runat="server" Text="Route Me!" 
  13:                 onclick="Button1_Click" />
  14:                 <br />
  15:                 <asp:Label ID="RouteLegs" runat="server"></asp:Label>
  16:         </ContentTemplate>
  17:     </asp:UpdatePanel>
  18: </div>

 

Default.aspx.cs:

   1: protected void Button1_Click(object sender, EventArgs e)
   2: {
   3:     RouteOptions ro = new RouteOptions();
   4:     ro.DistanceUnit = RouteDistanceUnit.Kilometer;
   5:     ro.DrawRoute = true;
   6:     ro.SetBestMapView = true;
   7:  
   8:     List<string> locations = new List<string>();
   9:     locations.Add(TextBox1.Text);
  10:     locations.Add(TextBox2.Text);
  11:  
  12:     Map1.GetDirections(locations, ro);
  13: }
  14:  
  15:  
  16: protected void Map1_ServerGetDirections(object sender, Route e)
  17: {
  18:     int num = 0;
  19:     List<RouteLeg> rlegs = e.RouteLegs;
  20:     foreach (RouteLeg leg in rlegs)
  21:     {
  22:         List<RouteItineraryItem> items = leg.Itinerary.Items;
  23:         foreach (RouteItineraryItem item in items)
  24:         {
  25:             RouteLegs.Text += "Instruction " + num++ + ": <b>" + 
  26:                 item.Text + 
  27:                 "</b> - Distance: <b>" +  
  28:                 item.Distance + 
  29:                 "</b> - Time: <b>" + 
  30:                 item.Time + 
  31:                 "</b><br />";
  32:         }
  33:     }
  34:     string time = Convert.ToString(e.Time / 60 / 60);
  35:     Button1.Text = "Time: " + time;
  36: }

 

Gut, ein bisschen suchen musste ich, bis ich mich durch das SDK von VE gekämpft hatte (da ist noch einiges an Potential für mehr).

Vielleicht bekomme ich noch mehr Durchblick, wenn mich das nächste Mal jemand nach etwas frägt. Also los!

Die ersten 5 Anfragen bekommen eine Antwort =)!

Bis dann,
jan

Le Parkour .NET - Eine Übersicht der Sprachakrobaten

13.02.2009 15:20:00 | Rainer Schuster

le_parcours3Parkour oder Le Parkour (fälschlicherweise auch Parcours, Parcour oder Parkours bezeichnet) ist eine von David Belle begründete Sportart, bei welcher der Teilnehmer – der Traceur (französisch: „der den Weg ebnet“ oder „der eine Spur legt“) – unter Überwindung sämtlicher Hindernisse den kürzesten und effizientesten Weg von A zum selbstgewählten Ziel B nimmt. Dann gibt es noch das Parcouring. Parcouring wird z. B. bei Veranstaltungen vorgeführt und es ist eine Art Wettkampf im Le Parkour. Es werden künstliche Hindernisse aufgestellt, die der Traceur möglichst schnell überwinden muss.

Dieses Zitat aus Wikipedia trifft durchaus auch auf die Vielfältigkeit im .NET-Framework zu. Manchmal funktioniert alles einfach, manchmal eben nicht so einfach. Manchmal sind Probleme von Natur aus da, durch das Framework gegeben. Manchmal schaffen wir sie uns selbst indem wir nicht Zeitgemäß programmieren, wie es unter anderem Ralf Westphal und Stefan Lieser mit dem Clean Code Developer als Gegeninitiative beschreiben. Probleme und Fehler scheinen unbezwingbar und dennoch überwinden wir sie tagtäglich.

Aber wie tun wir dies, etwa auf direktem Weg? Im Laufe der letzten Jahre hat sich auf der Microsoft Basis eine stattliche Anzahl an Sprachportierungen und Neuentwicklung auf den Weg gemacht die Probleme mit verschiedenen Ansätzen zu lösen. Die Beliebtheit bricht anscheinend nicht ab und nimmt im Gegenteil sogar noch zu, nicht zuletzt auch durch den enormen Einsatz von Novell und dem Entwicklerteam, auf dessen Plattform MONO die Sprachen ebenfalls lauffähig sind. Somit will ich einige Exoten und potente Kandidaten in einem kurzen Rundlauf darstellen, die in Fachzeitschriften wie der dotnetpro in der Ausgabe 02/2009 als Schwerpunktthema zur Ansprache kommen.

Warmup

Dann wollen wir uns doch mal kurz unseren Common Language Runtime Parkour betrachten: Portierungen, Neuentwicklungen, Compiler, Interpreter, Funktional, Objektorientiert, Imperativ. So ziemlich alles was Rang und Namen hat tummelt sich mittlerweile in der CLR, beziehungsweise der kommenden Tocher DLR. Ob bekannte Skriptsprachen wie Python, die zunehmend immer beliebter werdende Ruby, oder ganz alte wie Lisp (hier vertreten durch IronScheme). Es gibt kaum eine Sprache, die es noch nicht in irgend einer Form auf die gemeinsame Plattform geschafft hat. Warum aber jetzt eine Übersicht über diese Sprachen. Vor allem deswegen, da sich die Releases der Sprachen stabilisiert haben, oder dies in Kürze tun werden und  Release Candidates der ersten oder zweiten Versionen absehbar sind.

Die Traceurs stellen sich vor

Alleine die Aufzählung aller würde schier den Umfang Sprengen und somit konzentriere ich mich auf ein paar wenige die mir so im Laufe der Zeit aufgefallen sind.  Hier will ich nur einige kurz auflisten, von denen ich dann den ein oder anderen etwas beleuchte.

  1. Boo
  2. IronPython
  3. IronRuby
  4. Phalanger (Php auf der DLR)
  5. IronScheme
  6. F#
  7. Nemerle
  8. Vulcan.NET

Einzig eine vernünftige, vorzeigbare ECMAscript Implementierung wie sie Java- oder ActionScript darstellt ist mir so, wie ich sie mir vorstelle nicht über den Weg gelaufen.

 

Der Fuchs sprintet los

FoxProDie ersten sechs Sprachen werden den meisten wahrscheinlich noch etwas sagen. Aber mit Vulcan.NET können denke ich die wenigsten etwas anfangen. Warum liste ich diese Sprache dann auf? FoxPro ist vielen vielleicht noch geläufig. Ja, das war die Programmiersprache, die Microsoft mit dem Visual Studio damals mit installiert hat. Persöhnlich habe ich damit knapp 10 Jahre Erfahrung Sammeln dürfen. Nicht immer als aktiver Entwickler von FoxPro-Code, sonder meistens als Konsument der Datenbank über ein 3rd Party Bibliothek. Als dBase Derivat brachte FoxPro eine erstklassige Datenbankintegration, die zu Zeiten von Access seines Gleichen gesucht hat. Im Anbetracht der damaligen Lizenzkosten für einen SQL Server bei einem Vergleich von Leistung pro Zugriffszeit mehr als nur eine gute Alternative. Lange Zeit stellte FoxPro ein gute Lösung für Datenintensive Anwendungen dar. Versprochen wurde eine Weiterentwicklung und Zusammenarbeit mit dem .NET Framework, doch leider steht die Sprache seit 2007 offiziell vor dem aus.

Die letzte angekündigte Erweiterung von Microsoft trug den Namen Sedna und wurde als ServicePack 2 unter den Entwicklern verteilt. Seitdem lebt der Fuchs auf Codeplex unter anderem durch Community Projekte wie  VFPX weiter. Auf das .NET Framework hat es der FoxPro Bytecode nie geschafft. Naja fast! Denn mit Vulcan.NET steht eine xBase basierte Sprache bereit die syntaktisch mit Visual Objects gleich zieht, aber dennoch einige Änderungen im Vergleich zu FoxPro mitbringt. Für alle Füchse die ihr Wissen nicht ganz wegwerfen wollen sei ein Blick auf Vulcan.NET empfohlen.

Der Kampf der Schwergewichte

python_logoDie meisten Iron-Implementierung sind vermutlich schon jedem .NET Programmierer bekannt, da sie durch Jim Hugunin als Vater von IronPython Einzug in die Microsoft Welt gehalten haben. Er war es auch der mit Jython die Python Console auf der Java-Plattform zum laufen brachte. Ursprünglich als Beweis gedacht, dass .NET nicht leistungsfähig genug sei eine Skriptsprache wie Python zu stemmen, machte er sich daran dies zu beweisen. Erstaunt war er allerdings, als er feststellte dass diese Plattform sehr wohl dafür geeignet sei und nach einigen Optimierungen sogar noch schneller als der ursprüngliche Mitstreiter ist. MS wurde auf ihn Aufmerksam und baute um ihn herum das DLR Team. Eine zukünftige Erfolgsgeschichte, die nicht weiter erzählt werden muss, zielt doch das nächste Framework 4.0 und das Visual Studio 2010 genau auf die DLR. Das Visual Studio 2010 wird vollmundig als neues VS6 angepriesen, das seinerseits als es herauskam beachtliche Leistungen undruby Funktionen zeigte. Wie geht es also weiter mit den Iron Implementierungen? Seit Hugunin Python portiert hat stehen die vier Buchstaben IRON als Synonym für die robusten Portierungen von bekannten Sprachen auf der zukunftsweisenden DLR. Ein weiteres Beispiel daüfr sind IronRuby und IronScheme. Eine Skriptsprache, die auch noch schneller sein soll als es das Vorbild ist? Wie es scheint letzten Endes doch eher ein Leichtgewicht - also alles andere als eisern und schwer.

Die Geisterstunde schlägt

boo Boo schickt sich, von allem ein bischen mit zu bringen und kann darüber hinaus eigentlich mit ganz anderen Merkmalen punkten. Der kleine, gute Geist vereint Mechanismen einer ausgezeichneten Meta-Programmiersprache, die Bestandteile wie abstrakte Syntaxbäume und andere Schmankerl, wie Makros mit sich bringt. Wer da an die define Statements aus C zurückdenkt sollte sich aber deshalb nicht gleich erschrecken auch wenn es vielleicht gespenstisch klingen mag. Diese Features erlauben es dem geneigten Anwender die Sprache um eigene Syntax zu erweitern. Eine Erweiterung des eigenen Sprachumfangs als funktionaler Aspekt - Programmiersprache für Programmiersprachen? Als ausgemachtes Ziel können wir hier wohl eindeutig die Domain Specific Languages ansehen, die mit Boo erstellt werden wollen.

Der Zauberer kommt ins Spiel

nemerle In der Riege der Neuentwicklung stich meiner Meinung nach ein Kandidat besonders für die breite Masse der Entwickler hervor: Nemerle ist ein Hybrid und macht den Versuch die verschiedenen Programmierwelten richtig miteinander zu verheiraten. Den Name hat die an der Universität Breslau entwickelte Sprache übrigens von dem Erzmagier "Nemmerle" aus "Der Magier der Erdsee". Die Vereinigung der Welten versucht zwar auch F#, stellt dabei aber eine erstklassige Funktionale Sprache dar. Nemerle hingegen versucht den umgekehrten Weg und will mit C# ähnlicher Syntax funktionale Aspekte besser Umsetzen, als dies mit Lambdas und der Spracherweiterung LINQ der Fall ist. Ob das gelingt und wie erfolgreich dieser Versuch sein wird, muss die Zukunft zeigen. Nicht zuletzt, da viele Firmen vor dem Einsatz von Technologien zurück schrecken, bei denen die Zukunft ungewiss ist. Und diese wird sie für viele bleiben, solange Microsoft sie nicht mit ins Visual Studio Boot holt.

Hoch-Runter? Runter-Hoch?

Im Gegensatz zu imperativen oder objekt-orientierten Sprachen wie z.B. C und C++ mit einem Bottom-Up Ansatz, bei denen zu gegebener Hardware passende Software mit vorhandenen Mitteln erstellt wird, stehen die Funktionalen Programmiersprachen. Als sich damals findige Wissenschaftler aufmachten etwas zu beweisen stand im Vordergrund stand das Konzept, die Algoryhtmen, die Beweißbarkeit. Stück für Stück hat sich im Top-Down Verfahren ein Paradigma entwickelt, das wohl im Moment an der Schnittmenge zwischen den Welten steht. Die Hardware ist mittlerweile leistungsstark genug geworden. Die Algorithmen haben sich weit genug entwickelt um sich auch auf einem Desktop Rechner auszutoben. Und das Moorsche Gesetz wird durch Mehrkernprozessoren bekämpft. Es werden also Muster notwendig, die paralleles Ver- und Abarbeiten unterstützen. Komplexe Probleme, und Parallelverabeitung ist alles andere als trivial, benötigen entsprechende Werkzeuge oder Bibliotheken um von der breiten Masse benutzt werden zu können. Funktionale Programmierung bietet solche Möglichkeiten (siehe Wikipedia). 

Die Zwischenbilanz

Gehen wir mal ein paar Schritte zurück und betrachten das Spektakel aus einer gewissen Entfernung. Können wir etwas signifikantes beobachten? Fest steht jedenfalls, dass F# und IronPython/IronRuby durch Silverlight, bzw. Visual Studio 2010 und demnach durch die bereits genannte Microsoft-Unterstützung sehr gute Aussichten für die Zukunft hat. Jetzt muss der Nutzen nur von der Entwicklergemeinde erkannt werden und entsprechend Anklang finden. Frameworks wie Rails für Ruby haben dem Entwicklern gezeigt, wie einfach Programmierung in Verbindung mit einer Skriptsprache und dem Scaffolding sein kann. Nach Vorbild des Prototypen Verfahren wird in Windeseile eine ansehnliche Applikation erstellt. Gesichert wird das Verhalten der untypisierten Sprache durch Komponententests nach den Prinzipien von TDD oder BDD. Mit ASP.NET MVC steht ein .NET Pendant dazu in den Startlöchern, dass die gleiche Funktionalität bietet. Sieht man in die Roadmap von ASP.NET und auch Silverlight, stehen da Punkte zur Implementierung von dynamischen oder funktionalen Sprachen.

Diagramm.NET wird mit Version 4.0 und seinen Sprachveteranen C# und VB.NET so dynamisch, wie es auch von anderen Vertretern des Interpreterlagers nicht hätte besser gemacht werden können. VB bekommt seine untypisierte Funktion wieder zurück, bei der ein einfaches Dim genügt und C# bekommt das DynamicObject und das Schlüsselwort dynamic. Zudem geht dann mit F# der erste funktionale Player ins Rennen. Ob es ein Big Player wird ... ich wage eine kleine Prognose abzugeben. Nach einigen Diskussionen mit Ralf Westphal bin ich auch der Meinung, dass dies für spezifische Probleme sicherlich zustimmen mag. Aber in seiner Gesamtheit?

Wichtiger sind für mich eher Kandidaten wie Boo oder Nemerle auf der einen Seite, die wichtige Sprachmuster wie Traits (ähnlich den C++ Templates), Mixins, oder Closures wie sie auch genannt werden, bereitstellen. Michael Feathers hat Ende letzten Jahres seine Wunschliste für die nächste Mainstreamsprache bekannt gegeben, der ich sofort zustimmen musste. Echte Komponentenfähigkeit! C# Stünden die Möglichkeiten von echtem wiederverwendbaren Code, wie sie durch eben diese Techniken zur Verfügung stehen gut. Auf keinen Fall wird dies durch eine Mehrfachvererbung wie bei C++ eingeführt werden. Dessen sind wir uns und vor allem die Designer von C# bewußt. Bei F# steht das Schlüsselwort mixins z.B. schon als reserviertes Schlüsselwort in der Pipeline für die zukünftige Entwicklung. Bleibt zu hoffen, dass wir hiervon in Zukunft noch mehr sehen.

Zu zweit ist man weniger alleine

parallel Die Parallelität, in aller Munde Concurrency genannt, wird eine wichtige Rolle spielen. Die durch die Intel GmbH betriebene Seite http://www.software-dev-blog.de/  mit dem Reporter und Autor Michael Hülskötter berichtet Neuigkeiten rund um die Multicore Programmierung.  AMD und Intel, um bei den Chipherstellern zu bleiben, sind bei Vier-Kern-Prozessoren  angekommen. IBM steht mit dem Cell schon länger bei einer achtkern CPU. Prominentester Vertreter aus der Öffentlichkeit ist hier wohl die Playstation 3. Die parallele Verarbeitung von Anweisungen bei gleichzeitigem Zugriff auf Resourcen bleibt einem scheinbar nur über den mühevollen Umweg der Synchronisierung übrig. Ein heikles Thema, wenn man in dieser Disziplin die Erfahrung der letzten zwei Jahrzehnte betrachtet.  Das Unterfangen kann schlichtweg in den bekannten Problemen enden. Deadlocks, schlecht wartbarer Code oder auch schlechtere Performance bei unsachgemäßem Einsatz. Erreichen wir nun einen echten parallelen Betrieb oder verzetteln wir uns mit neuen Sprachen in einer Parallelen Welt?

Funktional? Egal!

Funktionale Sprachen wie Nemerle oder F# werden aus diesem Blickwinkel vielleicht interessanter. Warum? Die Probleme von Code, vor allem die von parallelem, rühren unter anderem daher, dass Code an Stelle A einen anderen an Stelle B ändert ohne über diesen Umstand zu informieren, oder darauf gefasst zu sein, dass er noch von Stelle C verwendet wird. Die funktionalen Sprachen wollen diesen Umstand beseitigen. Wie sie das anstellen wollen? Indem sie per Definition alle Variablen implizit  immutable, also unveränderlich, definieren. Das ginge freilich auch mit einer Sprache wie C#, nur muss dies erst einmal getan werden.

Weil zuerst einmal von unveränderlichen Variablen ausgegangen wird, wie sie in der Mathematik Verwendung finden, wird dieser Zustand durch Tools erkennbar. Der Compiler muss keine aufwendige Prüfung durchführen. Wenn Code per Definition nicht veränderbar ist, kann auch nichts kaputt gehen. Aber wie bekommen wir dann Zustandsänderungen hin? Durch das Kopieren der Inhalte auf neue Instanzen der Variablen. Daher auch ihre eigentliche Herkunft, die wissenschaftliche Arbeit und das Lösen von Problemen mit beweisbaren Algorithmen. Das erklärte Ziel: Funktionen schreiben, die frei von Seiteneffekten sind. Wenn Funktionen frei von Seiteneffekten sind, können sie aufgeteilt und gleichzeitig ausgeführt werden da sie ja keine Abhängigkeiten besitzen. Das interessante an den Funktionalen Sprachen ist aber, dass sie bei richtiger Anwendung mathematisch beweisbar und berechenbar sind. Schaffen wir es also, komplexe Themen wie in der Mathematik kalkulierbar zu machen?

Absturzgefahr?

absturz Soviel einmal zur Theorie. Wie sieht es aber mit der anderen Seite, der Praxis aus? Zum einen wäre da unser bestehender Code, das gleiche Problem wie wir es bereits beim Umstieg auf die .NET Plattform hatten und auch noch haben. Legacy Code will gepflegt werden. Weder verschwindet er so einfach, noch portiert er sich ganz von alleine. Das soll auch gar nicht das Ziel sein. Denn es gibt Einsatzgebiete, da eignet sich eben der imperative Ansatz einfach am Besten. Zum anderen haben wir da die Entwickler, die objektorientiert denken - und das ist gut so, sonst hätten wir heute noch viele ungelöste Probleme! Objektorientierung ist ja wie wir wissen etwas sehr gutes. Last but not least treiben die Hersteller mit Bibliotheken und Frameworks die Parallelität als Schlüssel zu mehr Leistung, und somit dem Wachstum, voran. Neuentwicklung gehen schließlich mit mehr Resourcenbedarf einher. Warum also eine neue Programmiersprache, wenn wir mit anderen Mitteln auch ans Ziel kommen. Das Erlernen einer neuen Sprache kostet Zeit und aus Sicht des Unternehmens gesehen somit viel Geld. Wie können uns hier aber die neuen Sprachen helfen? Genauso wie sie es schon früher getan haben! Interpreter (PHP, Perl, Python, Javascript) werden schon seit längerem erfolgreich eingesetzt. Die Imperativen sowieso. Sonst würden wir vermutlich heute nicht hier sitzen und diesen Text lesen. Na und die Funktionalen haben ihre Daseinsberechtigung im wissenschaftlichen Bereich. Was neu ist, ist die Kombination von allen in einer gemeinsamen Plattform. Die Sprachen werden also bunter gemischt möglich sein. Für Problem A nehmen wir C# für Problem B Python und wiederum bei C wäre eben F# schön. Wir können auch noch mehr! Nämlich die alten Quellen nehmen, die z.B. auf diesen Interpretern geschrieben wurden und diese jetzt über die Krücke CLR auch mit den anderen Sprachen benutzen.

Fest steht, dass mit der DLR endlich eine ordentliche Basis für eine Skriptumgebung unter .NET zur Verfügung steht. Damit lassen sich leicht eigene Konsolen für Anwendungen einbauen um das System dynamischer, zur Laufzeit, leichter änderbar zu machen, wie es einst schon Netscape mit JavaScript getan hat. Prototypen können damit schneller erstellt werden, für den Versuchsaufbau ein großer Vorteil, ausgelieferte Applikation damit leicht angepasst werden. Eine Funktion, für die Skriptsprachen berühmt, wenn nicht sogar berüchtigt sind. Funktionale Aspekte haben den, schon seit langem notwendig, Einzug in C# 3.0 gehalten. Doch werden diese auch richtig genutzt? Wer hat sich denn schon mal ernsthaft Gedanken über die Parallelität eines Delegaten oder eines Lambda Ausdrucks gemacht?

Alle Aspekte berücksichtigt?

Aspekte im Algemeinen als Sprachbestandteil sind wichtig! Hier haben wir ebenfalls ein Problem, dem sich Microsoft mit dem Framework oder der CLR noch nicht so richtig angenommen hat. Eine Implementierung, wie sie PostSharp bietet wäre so ein Schritt in die richtige Richtung, die uns beim parallelisieren oder aufteilen von Code zur Hand geht. Ein Beispiel dazu findet sich in der aktuellen dotnetpro 3/2009 in dem Artikel Multithreading per AOP von Gael Fraiteur. Können Sprachen wie Boo hier vielleicht eine Möglichkeit bieten eigene Syntax für Aspekte zu entwerfen? Aspekte führen bekannter Maßen zu weniger dupliziertem Code durch Trennung der Belange.

Auf zum Photofinish

fotofinish Was erwartet uns dann also? Die Version 4.0 macht dem .NET-Framework dynamische Beine. Mein Tipp für .NET 5.0 ist: Die Beine werden dann auch noch so richtig funktional. Die nächste General Purpose Sprache, wie sie C# im Moment ist, muss noch einiges mehr im Portfolio bereithalten um dem versierten und professionellen Entwickler alle geeigneten Mittel mit auf den Weg zu geben. Die Techniken und Prinzipien sind schon seit Jahren bekannt und finden in anderen Sprachen großen Anklang. Sie sind reif dafür in den Mainstream einzufließen. Liegt es an Microsoft und seinen Ingenieurteams eine weitere Erfolgsgeschichte zu schreiben, auf dem Weg eine besseren Sprache zu entwerfen? Oder müssen wir Entwickler uns endlich von dem Technologiehype lösen? Brechen wir uns auf Parkour .NET die Beine oder schaffen wir es wie in der gleichnamigen Trendsportart die Hindernisse elegant mit unseren akrobatischen Fähigkeiten zu überwinden? Jeder dem Professionalität am Herzen liegt sei also einmal die Frage ans Herz gelegt: Brauche ich das wirklich alles, oder kann ich damit einfach nur schön spielen. Ich bestimmten Bereichen ist, wie gezeigt, der Einsatz durchaus sinnvoll.

kick it on dotnet-kicks.de

MSDN Guide oder: Per Anleitung durch die Galaxis

13.02.2009 14:59:06 | Oliver Scheer

Neu bei MSDN? Neu bei Microsoft? Da ist der Durchblick bei den vielfältigen Entwickler-Ressourcen hier auf dem deutschsprachigen Microsoft Web-Portal zugegebenermaßen manchmal nicht ganz einfach. Mit dem Mitte 2007 gestarteten Programmführer erleichtern wir Ihnen bisher Tag bei Tag die Orientierung auf MSDN Online. Der „MSDN Guide“ liefert Ihnen kompakt und übersichtlich Links zu den wichtigsten Info-Angeboten und Software-Downloads aus dem deutschsprachigen Microsoft Entwickler-Universum - insgesamt einige hundert Web-Fundstellen, die Sie mit nur 3 Mausklicks erreichen.
Mit mehr als 600 Aktualisierungen, Hinweisen und Erklärungen zu neuen Produkten, Technologien und Services von Microsoft wartet der MSDN Guide nun im Februar 2009 auf. Seit dem 11.02.2009 ist es nun noch einfacher, die ersten Schritte mit der Microsoft-Plattform zu gehen. Probieren Sie es aus!

ASP.NET CodeClip – Das File-Upload Control

13.02.2009 14:24:31 | Jan Schenk

Get Microsoft Silverlight

 

Hochladen von Dateien auf den Server kann ziemlich kompliziert sein. Sicherheit, Zuverlässigkeit und Performance sind Punkte, die es in selbstentwickelten Lösungen zu beachten gilt. Wie so oft gibt es in ASP.NET ein vorgefertigtes Control, das einem den Großteil dieser Arbeit abnimmt und auf Standards innerhalb des .NET-Frameworks zurückgreift.
In diesem Einsteiger-Video seht ihr, wie man das Control integriert und was es zu beachten gibt.
Außerdem gibt es fast keine Voraussetzungen, die euch davon abhalten würden, es einfach mal nachzubauen. Alles was ihr benötigt ist Visual Studio 2008 oder Visual Web Developer.

Default.aspx:

   1: <form id="form1" runat="server">
   2: <div>
   3:     <asp:FileUpload ID="FileUpload1" runat="server" />
   4:     <asp:Button ID="Button1" runat="server"
   5:         Text="Upload File" onclick="Button1_Click" />
   6:     <br />
   7:     <asp:Label ID="UploadDetails" runat="server"></asp:Label>
   8: </div>
   9: </form>

 

und
Default.aspx.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7:  
   8: namespace WebApplication2
   9: {
  10:     public partial class _Default : System.Web.UI.Page
  11:     {
  12:         protected void Page_Load(object sender, EventArgs e)
  13:         {
  14:  
  15:         }
  16:  
  17:         protected void Button1_Click(object sender, EventArgs e)
  18:         {
  19:             UploadDetails.Text = "Filename: " + FileUpload1.FileName + "<br />";
  20:             UploadDetails.Text += "Content-Type: " + FileUpload1.PostedFile.ContentType + "<br />";
  21:  
  22:             string filePath = Server.MapPath("~/Uploads/" + FileUpload1.FileName);
  23:             FileUpload1.SaveAs(filePath);
  24:         }
  25:     }
  26: }

 

Und vergesst nicht – so wie ich – den Ordner anzulegen, in den ihr hochladen wollt ;-) !

Das Video ist übrigen bei channel9 gehostet, unserem großartigen Evangelisten-Spielplatz. Schaut euch da gerne mal um!

Viel Spaß beim Ausprobieren und lasst mich wissen, wenn ihr Kommentare, Probleme oder Kritik habt!

Simple AOP: introduction to AOP

13.02.2009 12:46:11 | Andre Loker

Aspect oriented programming (AOP) allows us to keep implement different concerns in isolation. In this article series I’ll describe ways to make use of AOP without much hassle. This first article serves as an introduction to AOP to those that are not familiar with aspect orientation.

Why AOP

If we analyse the source code software system we will soon realize that the different parts of the code can be grouped according to their responsibilities. For example some parts of the code are responsible for implementing business logic, other parts manage transactions, yet other parts are used to handle exceptions etc. In AOP terms those responsibilities are called concerns. The business logic is considered the core concern of the application, whereas the latter examples represent aspects that somehow interact with the core concerns. Because they interact with the core concerns, aspects are often called cross-cutting concerns. When we look closer at those interactions we can identify two problems:

1. Scattering

Scattering occurs if the same aspect has impact at many different places in the code. For example, logging or transaction management are often used at many different places in the code, but each time almost exactly the same way. This is problematic because it is harder to maintain scattered functionality.

2. Tangle

The second problem that often occurs is that of tangling concerns. At a given place in code – let’s say a single method – different concerns are present and interleaved. To give you an example, here’s a method that has the core responsibility to change the email address of a user identified by some  ID. Three concerns can be identified: the core concern (changing the email address) and two additional aspects (exception handling and transaction management). I highlighted the different concerns using different colours.

tangle

Tangling concerns are a problem because they bloat the code and distract from the core concerns. Here’s the same core concern without any extra aspects:

 public Result ChangeEmailAddressBusinessOnly(int userID, string newEmailAddress) {
   var user = Users.GetUserByID(userID);
   if (user != null) {
     user.ChangeEmailAddress(newEmailAddress);
     return Result.Success;
   }
   return Result.Error("User not found");
 }

Tangling also makes unit testing more difficult, because all the extra non-core concerns have to be considered during the tests as well, at least they have to be stubbed or mocked.

Using AOP to solve scattering and tangle

AOP tries to solve the two problems using the separation of concerns paradigm. With AOP the different aspects are described and implemented in isolation. Because the behaviour is defined once only and than applied automatically at all places of interest in the code, scattering won’t appear. And secondly, because aspects are defined in isolation the core concerns can be implemented without any intermingling aspects which solves the problem of code tangle.

Advices

The implementation of the behaviour is called the advice of the concern. Here’s an example of the advice belonging to the exception handling concern in pseudocode:

 someAdvice(context) {
   try {
     context.Proceed();
   } catch(Exception e) {
     if(ExceptionHandler.ShouldRethrow(e)) {
       throw;
     }
   }
 }

In this example context.Proceed() would execute whatever has to be executed at the point where this concern is present. If that code throws an exception we can handle it.

Pointcuts

We must of course somehow define where the concern is present. This is defined by the so-called pointcut. A pointcut is a boolean expression answering the question “should this concern be applied here?” for every possible “here”. Now, what’s a “here”? A “here" in this context is every possible point in the code where a concern can possibly be applied. Those points are called join points. Examples are: “A call to a method named X” or “The assignment of a value to a variable”. What kinds of join points are supported depends on the AOP implementation and is defined in that implementation’s join point model. Adding pointcuts to our pseudocode example could look like this:

 pointcut ServiceMethods : call to any method of class Service
  
 someAdvice(context) at ServiceMethods {
   try {
     context.Proceed();
   } catch(Exception e) {
     if(ExceptionHandler.ShouldRethrow(e)) {
       throw;
     }
   }
 }

Now everytime we call a method of class  Service the advice will be executed. The call to Proceed() will in this case execute the method that is being called.

Advice types

Now that we have defined what is advised and where we can add the minor detail of when it is applied, because we have different kinds of advices. The example above uses a so called around advice. That is, the advice is wrapped around the joinpoint. It controls the moment when the joinpoint is executed explicitly by calling Proceed(). Other examples of advice types are:

  • before and after advices, which are executed before or after the execution of the joinpoint respectively. Those advices can’t explicitly define when the joinpoint is executed.
  • throwing advices, which are only executed if the execution of the joinpoint raised an exception
  • returning advices, which are only executed if the execution of the joinpoint did not raise an exception

Finally, here’s a fine-tuned version of our pseudo code example:

 pointcut ServiceMethods : call( Service.* )
  
 around(context) : ServiceMethods {
   try {
     context.Proceed();
   } catch(Exception e) {
     if(ExceptionHandler.ShouldRethrow(e)) {
       throw;
     }
   }
 }

By the way, I didn’t come up with this notation all by myself. It resembles the syntax used with AspectJ, which is more or less the most prominent (Java) AOP framework available. It has grown quite mature and if you’re interested in AOP I highly recommend to have a look at it. Yes - even it uses Java :-) 

Weaving

So, we have defined a bunch of aspects with their pointcuts and advices. The missing link is obvious: how do those advices get applied to the base code (the code containing core concerns)?  For this process – called weaving - several approaches exist, all with different pros and cons.

Compile time weaving

This approach is taken by AspectJ for example. An additional step is taken during compilation that inserts the advices into the source code or an existing binary assembly. This results in binaries that don’t look any different from conventional binaries.

Pros

  • the join point model can be very detailed (e.g. the assignment of a value to a variable)
  • performance wise there’s little overhead

Cons

  • weaving is static only, we can’t change aspects at runtime

Runtime weaving

With runtime weaving the aspects are woven into the base code – well – at runtime. There are different approaches to achieve this. Some implementations for example modify the runtime environment to support injection of code. A simpler approach is the creation of runtime proxies for advised objects.

Pros

  • no need for an extra compiler
  • aspects can be added or removed dynamically

Cons

  • depending on the implementation, the join point model can be rather limited

For this article series we’ll use proxy based runtime weaving: it is simple and in many cases sufficient.

Critical view

In principle AOP sounds promising: separation of concerns helps to concentrate on core concerns and keeps our code free of tangle and scattering. Where there’s light, there’s also shadow they say and this counts for AOP. If you look at the base code you can’t see at a glimpse which aspects are applied (except if you have tool support). Because the aspects are injected “invisibly” you might encounter unexpected runtime behaviour, especially if the aspects affect each other. Likewise, you have to be careful where the different aspects are advised to avoid some unintended application of concerns. Keep an eye on your pointcuts!

Also, AOP is generally not a first class citizen but an “artificial” extension to existing software environments the woven code comes with an overhead, especially with runtime weavers. Most business applications are I/O bounded, so whether a method call takes 1 microsecond or 1 millisecond does not matter much if the method itself takes 50 milliseconds to run. Just be aware that advising a join point in a performance critical loop might be something to reconsider.

Therefore – as with any tool – use AOP wisely. Use it when it makes sense, just don’t go crazy with your new toy.

Wrapping it up

This concludes my introduction to AOP. I haven’t covered all details of the topic (like inter type declarations or advice precedence). Still I’ve hopefully shown the need for and benefits of AOP well enough to have awaken your interest in the next parts of this series. Feel free to leave a comment for questions and suggestions.

In the next part of the series I’ll how we can use Castle DynamicProxy as a starting point for a AOP-esque separatio of concerns.

Other articles in this series:

Daruisz Parys bei der .Net Developer-Group Ulm

13.02.2009 12:13:52 | Thomas Schissler

clip_image001

Beim nächsten Treffen der .Net Developer-Group Ulm dürfen wir diesesmal Dariusz Parys begrüßen, der zum Thema “Architektur der Datenanbindungsschicht, insbesondere ADO.NET Data Services und Entity Framework” spricht. Der Abstract verspricht schon mal einen sehr spannenden Abend:

LINQ to SQL, ADO.NET, Entity Framework, Entity Data Model, REST mit ADO.NET Data Services oder Serialisierung mit WCF ? – neben einem Überblick über die Alternativen und detailliertere Darstellung des Entity Frameworks wird darauf eingegangen, welche Kriterien beim O/R-Mapping zur Bewertung zur Verfügung stehen und diskutiert, welcher Nutzen darin liegt, die Datenanbindung von einer technischen Ebene auf eine logische zu heben.

Ích glaube das dürfte ein Themengebiet sein mit dem im Moment jeder Entwickler in irgendeiner Weise käpft und so dürfte sich Dariusz schon mal auf eine ganze Reihe von Fragen einstellen (Mir selbst fallen da schon eine ganze Reihe ein).

Wer also Interesse an dem Thema hat, ist herzlich eingeladen am Dienstag 17.02.2008 um 18:00 zu uns zu kommen.

Weitere Infos unter:

http://www.dotnet-ulm.de

 

 

Ajax.NET M! kommt ins Networking Toolkit

13.02.2009 10:30:00 | Michael Schwarz

Ajax.NET M!, eine für das .NET Micro Framework angepasste Version von Ajax.NET Professional wird nun in meine kleinen Netzwerk Bibliothek Sammlung aufgenommen.

Auf CodePlex ist nun ein HTTP Server, ein DNS Resolver als auch eine XBee Bibliothek verfügbar. Alle DLLs werden unter den drei Frameworks (Compact, Micro und Desktop) laufen, auch wenn dafür noch ein paar Anpassungen gemacht werden müssen.

Besonders freut es mich, dass die XBee Bibliothek schon nach kurzer Zeit in vielen Projekten läuft, auch z.B. bei den verschiedenen Wettbewerben wie Dare To Dream Different Challenge oder Spark Contest.


Kostenlose Eclipse-IDE für Silverlight – es geht voran! (+ Video)

13.02.2009 09:48:56 | Steffen Ritter

Ich habe es bereits mehrfach erwähnt, Microsoft finanziert eine kostenlose Eclipse-IDE zur Entwicklung von Silverlightanwendungen für alle die wider besseres Wissen nicht die großartigen Expression-Tools, Visual Studio oder die ebenfalls kostenlosen Express-Werkzeuge für Silverlight verwenden wollen, aus welchen Gründen auch immer.

Seit der ersten Veröffentlichung der Eclipse Tools für Silverlight hat sich einiges getan, so wurde auf der Website des Projekts weiteres Material für Java Entwickler veröffentlicht, insbesondere zur Zusammenarbeit bzw. Interoperabilität zwischen Silverlightanwendungen und REST bzw. SOAP (JAX-WS/CXF) Java Web Services.

Ein kurzer Überblick per Video:

(Das Video ist auch via YouTube verfügbar.)

Weitere ausführliche Infos dazu im englischsprachigen Interoperability-Blog: http://blogs.msdn.com/interoperability/archive/2009/02/07/eclipse-and-silverlight-another-interoperability-journey-has-begun.aspx

Web Server Controls ganz einfach selber machen (Teil 1)

13.02.2009 02:08:00 | Jürgen Gutsch

Hiermit starten Peter und ich mal eine kleine Artikelserie zur Erstellung von Web Server Controls.

Vielfach sollen Funktionen in Anwendungen mehrfach verwendet oder verteilt werden. Also in mehreren Webanwendungen zum Einsatz kommen. Das geht bekanntlich am einfachsten, indem diese Funktionen in separate Klassenbibliotheken ausgelagert werden. Die Anwendungen die diese Funktionen nutzen möchten, müssen diese Klassenbibliothek nur als Referenz einbinden.

Wie sieht das nun mit Web Server Controls aus? Ganz genauso. Ein Web Server Control ist ja im Prinzip nichts anderes als eine Klasse die von Control, WebControl oder einem konkreten Control (wie z. B: LinkButton, siehe auch hier: WebControls erweitern) erbt. Microsoft nennt diese selbsterstellten Web Server Controls übrigens “Web Custom Control”.

Das Visual Studio bietet bereits ein Template für die Erstellung von Custom Controls an. So lässt sich in einer neuen Klassenbibliothek einfach über “New Item…” ein neues “ASP.NET Server Control” einfügen. Wählt man dieses aus wird automatisch eine neue klasse eingefügt, die wie folgt aufgebaut ist:

[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
public class WebCustomControl1 : WebControl
{
  [Bindable(true)]
  [Category("Appearance")]
  [DefaultValue("")]
  [Localizable(true)]
  public string Text
  {
    get
    {
      String s = (String)ViewState["Text"];
      return ((s == null) ? String.Empty : s);
    } 
    set
    {
      ViewState["Text"] = value;
    }
  } 
  protected override void RenderContents(HtmlTextWriter output)
  {
    output.Write(Text);
  }
}

Wenn wir die Attribute (in eckigen Klammern) erst einmal missachten sehen wir eine Klasse welche von WebControl erbt, eine eigene Eigenschaft namens “Text” enthält, sowie die überschriebene Methode RenderContents().

Das Attribut “Text” speichert den Wert im ViewState der Seite ab, bzw. ließt diesen aus. In der Methode RenderContents() wird der Wert aus der Eigenschaft “Text” über den HtmlTextWriter ausgegeben.

Das Control kann ich, so wie es ist, schon benutzen und wie Folgt an einen Placeholder auf der Seite ausgeben:

WebCustomControl1 c1 = new WebCustomControl1
{
  ID = "c1",
  Text = "Hallo Welt"
};
PlaceHolder.Controls.Add(c1);

Das Ergebnis sieht so aus:

<span id="c1">Hallo Welt</span>

Custom Controls die von WebControl erben, umgibt immer ein <span>-Tag, was nicht immer gewollt ist. Aus diesem Grund ist es Sinnvoll die Eigenschaft TagKey zu überschrieben, um z. B: ein <div>-Tag zu rendern:

protected override HtmlTextWriterTag TagKey
{
  get { return HtmlTextWriterTag.Div; }
}

Ergebnis:

<div id="c1">
    Hallo Welt
</div>

siehe auch hier: Von WebControl abgeleitetes CustomControl - Haupt Html Element festlegen

Ein Nachteil an dem Beispiel oben ist allerdings das Rendern des Controls per HtmlTextWriter. Man ist damit zwar sehr Flexibel und kann den HTML Code selber erzeugen, benötigt allerdings mehr Schreibarbeit. Das Ausgeben einer TextBox, mit Label und eines zugehörigen Buttons könnte so aussehen:

protected override void RenderContents(HtmlTextWriter output)
{
  output.WriteBeginTag("label");
  output.WriteAttribute("for", this.ClientID +"_TextBox");
  output.Write(">");
  output.WriteEncodedText(Text);
  output.WriteEndTag("label");
  output.WriteBeginTag("input");
  output.WriteAttribute("type", "text");
  output.WriteAttribute("id", this.ClientID + "_TextBox");
  output.WriteAttribute("name", this.UniqueID + "$TextBox");
  output.Write(" />");

  output.WriteBeginTag("input");
  output.WriteAttribute("type", "submit");
  output.WriteAttribute("id", this.ClientID + "_Submit");
  output.WriteAttribute("name", this.UniqueID + "$Submit");
  output.WriteAttribute("value", "Submit");
  output.Write(" />");
}

Eine andere schnellere Variante ist das erzeugen und das Hinzufügen der Controls in der OnInit. Das Rendern übernimmt dann die klasse WebControl, bzw. Control von der wir geerbt haben:

private Label label;
private TextBox textBox;
private Button button;

protected override void OnInit(EventArgs e)
{
  base.OnInit(e);

  label = new Label
  {
    ID = "Label",
    AssociatedControlID = "TextBox"
  };
  Controls.Add(label);

  textBox = new TextBox
  {
    ID = "TextBox"
  };
  Controls.Add(textBox);

  button = new Button
  {
    ID = "Button",
    Text = "Submit"
  };
  Controls.Add(button);
}

protected override void OnPreRender(EventArgs e)
{
  base.OnPreRender(e);

  label.Text = Text;
}

Hinweis 1: Damit das erzeugen der Controls in der OnInit funktioniert, muss zwingend das Interface INamingContainer implementiert werden, da das Control sonst nicht mehrfach auf der Seite eingebunden werden kann und da das Control sonst nur ein PostBack durchführen darf, wenn es die Event-Validierung ausgeschalten wird

Hinweis 2: Eigenschaften unseres Controls (wie hier die Eigenschaft “Text”), sollten erst bei OnPreRender an zu rendernde Controls zugewiesen werden. Auf die Art können Eigenschaften auch gesetzt werden, nachdem unser Control der Control-Hierarchie der Seite zugewiesen wurde. Folgendes wird z. B: nicht funktionieren, wenn wir unsere Eigenschaft “Text” in der OnInit direkt dem Label zuweisen würden:

WebCustomControl4 c4 = new WebCustomControl4
{
  ID = "c4"
};
PlaceHolder.Controls.Add(c4);
c4.Text = "Hallo: ";

Damit der Text ausgegeben wird, müssten wir die Eigenschaft “Text” immer vorher setzen:

WebCustomControl4 c4 = new WebCustomControl4
{
  ID = "c4",
  Text = “Hallo: ”
};
PlaceHolder.Controls.Add(c4);

Setzen wir - wie oben gezeigt - die Eigenschaft aber erst bei OnPreRender, sind beide Varianten möglich.

Beispiel:

Hier noch ein kleines Beispiel eines einfachen kleinen Controls, welches eine ungeordnete Liste ausgibt. Die ListItems werden über eine ListItemCollection (wie sie auch z. B: für die DropDownList benutzt wird) festgelegt. Zusätzlich könne wir einen Text festlegen, für den Fall, dass keine es keine ListItems gibt:

public class SimpleList : Control
{
  private HtmlGenericControl unorderedList = new HtmlGenericControl("ul");
  private HtmlGenericControl emptyText = new HtmlGenericControl("span");

  public ListItemCollection Items { get; private set; }
  public String EmptyDataText { get; set; }

  public SimpleList()
  {
    Items = new ListItemCollection();
  }

  protected override void OnInit(EventArgs e)
  {
    base.OnInit(e);

    if (Items.Count > 0)
    {
      Controls.Add(unorderedList);
    }
    else
    {
      Controls.Add(emptyText);
    }
  }

  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);

    if (Items.Count > 0)
    {
      Controls.Add(unorderedList);

      foreach (ListItem listItem in Items)
      {
        HtmlGenericControl unorderedListItem =
          new HtmlGenericControl("li")
        {
          InnerText = listItem.Text
        };
        unorderedList.Controls.Add(unorderedListItem);
      }
    }
    else
    {
      emptyText.InnerText = EmptyDataText;
    }
  }
}

Anwendungsbeispiele:

// Liste mit Items
SimpleList mySimpleList1 = new SimpleList
{
  ID = "mySimpleList1",
  EmptyDataText = "Keine Daten vorhanden!"
};
mySimpleList1.Items.Add(new ListItem("Eintrag 01"));
mySimpleList1.Items.Add(new ListItem("Eintrag 02"));
mySimpleList1.Items.Add(new ListItem("Eintrag 03"));
mySimpleList1.Items.Add(new ListItem("Eintrag 04"));
mySimpleList1.Items.Add(new ListItem("Eintrag 05"));
PlaceHolder.Controls.Add(mySimpleList1);

// Liste ohne Items
SimpleList mySimpleList2 = new SimpleList
{
  ID = "mySimpleList2",
  EmptyDataText = "Keine Daten vorhanden!"
};
PlaceHolder.Controls.Add(mySimpleList2);

Beispielprojekt downloaden: WebControls.zip

Erste Schritte mit der Microsoft-Plattform - macht es Microsoft den Kunden zu schwer?

12.02.2009 19:07:39 | Kay Giza

Nein - ich glaube nicht! Ist es einfach? Nein - das glaube ich auch nicht. Woran liegt's?

Microsoft hat eine extrem große Palette an Technologien, Services und Produkte am Markt, wie kein anderes Software-Unternehmen weltweit. Dies liegt natürlich begründet in der Art und Weise wie breit Microsoft aufgestellt ist. Wir bieten weltweit Standardsoftware, Services und Lösungen an, für die unterschiedlichsten Bedürfnisse, Menschen und Unternehmen aller Branchen und Größen und in den unterschiedlichsten Bereichen, sei es für den Desktop, für das Mobile-Phone oder andere typische Bereiche sowie Hardware.


Alle Service, Produkte und Technologien bedürfen eines, angepasst, entwickelt und fortgeführt zu werden. Und hier kommen vor allem Entwickler und IT-Professionals in Spiel. Hey - wir haben es da nicht leicht. Wie soll man sich denn auch mit allem auskennen, oder?

Steigt man nun in ein neues Thema ein, lernt man neu die Welt von MSDN kennen? Neu bei Microsoft? Da ist der Durchblick bei den vielfältigen Entwickler-Ressourcen auf dem deutschsprachigen MSDN Online-Portal zugegebenermaßen manchmal nicht ganz einfach, schon gar nicht bei den zig zehntausend deutschsprachigen Seiten die wir alleine auf MSDN Online anbieten.

MSDN Guide oder: Per Anleitung durch die Microsoft-GalaxisMit dem Mitte 2007 gestarteten Programmführer "MSDN Guide" erleichtern wir Ihnen bisher Tag bei Tag die Orientierung. Der „MSDN Guide“ liefert Ihnen kompakt und übersichtlich Links zu den wichtigsten Info-Angeboten und Software-Downloads aus dem deutschsprachigen Microsoft Entwickler-Universum - insgesamt einige hundert Web-Fundstellen, die Sie mit nur 3 Mausklicks erreichen.

Mit mehr als 600 neuen Aktualisierungen, Hinweisen und Erklärungen zu neuen Produkten, Technologien und Services von Microsoft wartet der MSDN Guide nun im Februar 2009 auf. Seit dem 11.02.2009 ist es nun noch einfacher, die ersten Schritte mit der Microsoft-Plattform zu gehen.

Wie ist ihr Feedback?
Probieren Sie es aus! MSDN Guide - Orientierung leicht gemacht!
Gefällt es Ihnen? Dann sagen Sie es weiter!
Missfällt Ihnen etwas, dann sagen Sie es uns - wir sind sehr bemüht die Wissenslücke zu schließen.


Als wir damals den Guide erstellt haben und auch jetzt erneut mal wieder aktualisiert haben, war es uns bewusst, dass wir nicht 100%-Vollständigkeit abbilden können, dass wir nicht jedes Portal und jeden Weblog aufführen können, vielleicht sogar und auch ganz bestimmt ;-) eine Technologie nicht explizit erwähnt haben... aber das Ziel sollte es sein, dass man sich grundlegen in eine neue Materie oder Umgebung einarbeiten kann und interessante weiterführende Quellen & Ressourcen findet. Haben wir es geschafft? Wie ist Ihre Meinung?

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-2009 Kay Giza. All rights reserved. Legal

MSDN Guide: erste Schritte auf der Microsoft-Plattform

12.02.2009 17:15:09 | Peter Kirchner

Neu bei MSDN? Neu bei Microsoft?

Da ist der Durchblick bei den vielfältigen Entwickler-Ressourcen hier auf dem deutschsprachigen Microsoft Web-Portal zugegebenermaßen manchmal nicht ganz einfach. Mit dem Mitte 2007 gestarteten Programmführer erleichtern wir Ihnen bisher Tag bei Tag die Orientierung auf MSDN Online. Der „MSDN Guide“ liefert Ihnen kompakt und übersichtlich Links zu den wichtigsten Info-Angeboten und Software-Downloads aus dem deutschsprachigen Microsoft Entwickler-Universum - insgesamt einige hundert Web-Fundstellen, die Sie mit nur 3 Mausklicks erreichen.

Mit mehr als 600 Aktualisierungen, Hinweisen und Erklärungen zu neuen Produkten, Technologien und Services von Microsoft wartet der MSDN Guide nun im Februar 2009 auf. Seit dem 11.02.2009 ist es nun noch einfacher, die ersten Schritte mit der Microsoft-Plattform zu gehen. Probieren Sie es aus!

MSDN Guide oder: Per Anleitung durch die Galaxis

12.02.2009 16:14:32 | Steffen Ritter

Neben der Expression Studio-Homepage und der Silverlight-Homepage gibt es bei uns noch eine ganze Menge Ressourcen speziell für Entwickler unter der Dachmarke MSDN, wobei auf MSDN die schiere Vielfalt manchmal für Einsteiger verwirrend scheint. Mit dem Mitte 2007 gestarteten Programmführer erleichtern meine MSDN-Kollegen bisher Tag bei Tag die Orientierung auf MSDN Online. Der „MSDN Guide“ liefert kompakt und übersichtlich Links zu den wichtigsten Info-Angeboten und Software-Downloads aus dem deutschsprachigen Microsoft Entwickler-Universum - insgesamt einige hundert Web-Fundstellen, die mit nur 3 Mausklicks erreichbar sind.
Mit mehr als 600 Aktualisierungen, Hinweisen und Erklärungen zu neuen Produkten, Technologien und Services von Microsoft wartet der MSDN Guide nun im Februar 2009 auf. Seit dem 11.02.2009 ist es nun noch einfacher, die ersten Schritte mit der Microsoft-Plattform zu gehen. Also keine Scheu und nix wie hin: http://www.microsoft.com/germany/msdn/guide/default.mspx

Top-Posts Extension für die BlogEngine.NET

12.02.2009 15:13:00 | Gordon Breuer

BlogEngine-NET In letzter Zeit habe ich immer wieder mal Nachfragen per E-Mail bekommen, wie ich die “Most read” Artikel in meinem Blog anzeige und ob das ein Plugin für die BlogEngine.NET wäre – zuletzt von Christof Tscherter vom Rennrad-Blog. In der Tat habe ich festgestellt, dass das Plugin nicht in der Liste der Erweiteurngen auf der Website der BlogEngine.NET steht. Eine Eigenproduktion war es allerdings auch nicht sondern ich fand einen Artikel von Al Nyveldt dazu, einem der Entwickler der BlogEngine.NET.

Der Artikel ist zwar von März 2008 und basiert noch auf Version 1.3, aber auch in der aktuellen Version 1.4.5 funktioniert der beschriebene Weg noch genau so. Inzwischen würde man ein kleines Widget für die Anzeige schreiben und nicht mehr die Masterpage des Templates editieren. Das Prinzip wird aber dennoch klar und sollte nicht weiter schwierig in der Umsetzung sein. Wenn dennoch jemand Hilfe bei der Einrichtung / Installation der Erweiterung hat kann er sich gerne bsp. in einem Kommentar melden und ich versuche gerne Hilfestellung zu geben.

Kalten Kaffee…

12.02.2009 15:02:00 | Gordon Breuer

…trinke ich zwar genau so selten wie heißen Kaffee – ich genieße lieber einen schönen heißen Tee – aber ein wenig neidisch konnte man schon auf Stephan Walcher werden. Doch vor rund 1½ Wochen kam dann an einem Samstag der Postbote und warf mich um 9:15 Uhr aus dem Bett. Und das an einem Samstag! Da bin ich normalerweise gerade einmal 3 Stunden am schlafen oder so.

Neugierig vom Klebeband geworden habe ich mich dann dennoch gegen das Weiterschlafen und für das Auspacken entschieden. Und was soll ich sagen: Tee schmeckt aus der Tasse mindestens ebenso gut wie Kaffee ;-)

Ein großes Danke an Kay Giza für das Paket, hab mich sehr gefreut! :-)

Kalter Kaffee, heisser Tipp anzeigen

http://www.my-msdn.de/entwickler-welt/

VSTS Code Coverage mit nativen C++ Projekt und C# Projekt im Mix

12.02.2009 11:20:00 | Christian Binder

Die Frage bekomme ich recht häufig und habe daher mal ein Demo gebaut, um zu zeigen wie es geht. Meine Demo Solution besteht aus 3 Projekten:

CodeCoverageWithC (C# Lib, ruft die native C++ Lib via Interop)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace CodeCoverageWithC
{
    public class Class1
    {
        //Import der nativen Function Add(int n1, int n2)
[DllImport("CalcLib.dll", CharSet=CharSet.Unicode,EntryPoint="#1")] public static extern int Add(int n1,int n2); public int calcValues(int value1, int value2) {
return Add(value1,value2); } } }

CalcLib (native C++, implementiert die Add Function, welche exportiert werden muss)

// CalcLib.h :

class CalcLib
{
public:
    CalcLib(void);
    ~CalcLib(void);
    __declspec(dllexport) int Add(int n1, int n2);
};
// CalcLib.cpp : Defines the exported functions for the DLL application.
//
#include "StdAfx.h"
#include "CalcLib.h"

CalcLib::CalcLib(void){}
CalcLib::~CalcLib(void){}

int CalcLib::Add(int n1, int n2)
{
return n1 + n2;
}

CalcTest(C# Test Project, welches den Unittest implementiert, der calcValues() testet)

[TestMethod()]
        public void calcValuesTest()
        {
            Class1 target = new Class1();
int n1 = 1; int n2 = 2;
int expected = 3; // Sollte passen oder? :-)
int actual; actual = target.calcValues(n1, n2); Assert.AreEqual(expected, actual); }

Einfacher geht’s wohl nicht…

Wenn ich jetzt den UnitTest ausführe möchte ich die CodeCoverage beider Dll’s haben. Also in der Testrunconfig die beiden Dlls für CodeCoverage konfigurieren:

image 

Wichtig: Damit die native CalcLib instrumentiert werden kann, muss der Linker Switch /PROFILE gesetzt sein:

image 

So jetzt den UnitTests ausführen und CodeCoverage anschauen. Die 100% Coverage kommen von der überagenden Komplexität des Codes :-)

image

Die Solution gibt’s hier:

Viel Spass

Chris

HowToCode: Wie bildet man einen Workflow im Code am besten ab?

12.02.2009 01:40:51 | Robert Mühsig

image Jede Anwendung basiert auf ein oder mehrere Aktionen, welche zum Teil von verschiedensten Dingen abhängen: Dem User, anderen Systemen, eingegebene Werte etc.

Meist spricht man von einem "Workflow", der in Software umgesetzt werden muss, doch wie bildet man diesen am "effektivsten" ab? If-Else Konstrukte oder "Workflow Engines" wie die Windows Workflow Foundation? Wie steht es mit der Testbarkeit? In diesem Post will ich ein paar Varianten vorstellen, bitte aber wieder ausdrücklich um Feedback, wie ihr dies handhabt.

(more…)

ShareThis

Innovation Award 2009 - Microsoft Österreich

12.02.2009 01:37:02 | Norbert Eder

Microsoft Österreich veranstaltet 2009 erstmals den Innovation Award. Am insgesamt mit 14.000 € dotierten Innovation Award kann jeder seiner innovativen Idee, basierend auf Microsoft Technologien, zum Durchbruch verhelfen. Am Innovation Award teilnehmen kann praktisch jeder – Microsoft Partner und Kunden aus allen Branchen, Teilnehmer am...

HowTo: Setup Subdomains in IIS 6.0

12.02.2009 00:40:01 | Robert Mühsig

imageIch arbeite mit einem Kollegen gerade an ein (noch) geheimes Projekt, wobei wir ASP.NET MVC als Nutzerfontend einsetzen und momentan ein Admininterface mit den ASP.NET Dynamic Data Feature umgesetzt haben. Natürlich brauchen wir auch eine Testumgebung, sodass unser Projektleiter die neusten Sachen erstmal anschauen kann, bevor diese Live gehen.
Kurz: Wir haben eine Domain www.xzy.de und wollen noch zwei Subdomains (www.admin.xyz.de & www.test.xyz.de) auf einen Windows Server 2003 einrichten.

(more…)

ShareThis

Whitepaper: Distributed Agile Development

11.02.2009 19:54:00 | Christian Binder

Ade Miller aus dem Microsoft Patterns und Practices Team schreibt über Distributed Agile Development in Microsoft. Er beschreibt einige “proven” Practices, die sich im bewährt haben und das Leben in der Verteilten Welt leichter machen. Außerdem bringt er mit einigen Do’s and Don’ts die Sache auf den Punkt. Für jeden Projektleiter, der die Herausforderungen der Verteilten Entwicklung sein eigen nennen darf, sollte sich diese 20 kurzweiligen Seiten nicht entgehen lassen. Warum die gleichen Fehler selber nochmal machen :-)

Chris

SharePoint 2007 Features

11.02.2009 19:19:00 | Ozgur Aytekin

This is a project for SharePoint 2007 Features. Features add new functionality to a SharePoint 2007 farm, site collection, or site. This project will create Features to address deficiencies in SharePoint 2007 or add new capabilities. You should understand a little about Features before trying these out. The packages here use batch files or WSP files to install the Features. After installation, be sure to activate the Features to see them in SharePoint.

Available Features
Application Content Type Hierarchy Feature
Application Log Viewer Feature
Application Manage Form Users Feature
Application Presence Contact List Feature
Application Placeholder Master Feature
Application Print List Feature
Application Task Alert Feature
Application Task Mover Feature
Application Theme Changer Feature
Application Debugger Feature
Application Window Links Feature
Application Debug Config Feature
Application Manage Configuration Modifications
Application Ajax Config Feature
Application Manage Layouts Site Map Feature
Application Minimal Master
Application Minimal Publishing Site
Application Manage Hierarchical Object Store Feature
Application Reset Theme Feature
Application Toolbar Manager
Application Unique Column Policy Feature
Application Global Web.Config Feature
Application 3.5 Web.Config Feature
Application Regular Expression Validator
Application SharePoint Events Manager
Application Clean Web Part Error Feature
Application Anonymous Audience Feature
Application Variation Labels Field
Application Custom Application Configuration
Application Create Site in Content DB

SharpDevelop - Release 3.0 und Themes

11.02.2009 18:36:00 | Rainer Schuster

SharpDevelope gibts ja seit gestern als Release 3.0 zum Download. Was für Sprachen werden mittlerweile alle Unterstützt:

  • Boo
  • C#
  • F#
  • Python (mit IronPython als Engine)
  • VB.NET

Nach kurzem Testen fiel mir sofort das helle Standard-Theme auf, mit dem ich schon seit einiger Zeit auf Kriegsfuß bin.

Da ich mir bei Visual Studio ein Dark Theme basierend auf Vibrant Ink zusammen "geschustert" habe, dachte ich mir ich suche mal schnell im Netz nach einem passenden für die OpenSource IDE. Direkt der erste Treffer führte mich zu einem Vibrankt Ink Theme für Boo.

Der Integrierte Editor für die XML basierten Themes in SharpDevelop ist nicht besonders Copy-Paste freundlich, daher habe ich kurzerhand die Vorlagen für C# und Python mit Notepad++ editiert und das Vibrant Ink Theme für diese zwei Sprache kopiert. Das Ergebnis findet Ihr auf meinem SkyDrive.

Die Dateien müssen in das Verzeichniss %AppData%\ICSharpCode\SharpDevelop3.0\modes\ kopiert werden.

Morgen erstelle ich noch die entsprechenden Vorlagen für F# und VB.NET

Viel Spaß beim Download:

  1. SharpDevelop - Vibrant Ink Theme C#
  2. SharpDevelop - Vibrant Ink Theme Python
  3. SharpDevelop - Vibrant Ink Theme VB.NET
  4. SharpDevelop - Vibrant Ink Theme F#
  5. SharpDevelop - Vibrant Ink Theme Boo
  6. SharpDevelop - Vibrant Ink Theme Ruby
  7. Vorlagen mit Themes zu Boo, HTML, NVelocity

 

Update: Themes für VB.NET und F# hinzugefügt

Update 2: Themes für Boo und Ruby hinzugefügt

25. Multimediatreff: Flash, Flex & Silverlight

11.02.2009 18:28:43 | Steffen Ritter

Oliver Scheer und ich wurden zum „Jubiläums- Multimediatreff“ nach Köln geladen (28. März 2009), um dort über Taktiken und Ästhetik im klassischen Go-Spiel zu sprechen und um Olivers neuen Gedichtband vorzustellen… erm, nein: Natürlich werden wir auch auf dort das tun, was wir immer machen und wofür wir bezahlt und geliebt werden: Vorträge rund um das Thema Rich Internet Applications und Silverlight halten, Neugierde wecken und Begeisterung auslösen, hoffentlich alle Fragen beantworten usw...

mmtreff

Ich freue mich sehr über diese Einladung, denn den letzten Multimediatreff auf dem wir aufgetreten sind habe ich noch in sehr guter und sehr angenehmer Erinnerung. Unglaublich dass das schon fast zwei Jahre her ist... Damals hieß Silverlight noch WPF/E und war noch gar nicht veröffentlicht – inzwischen sind wir in Version 2 und das Plug-In ist bereits auf mehreren hundert Millionen Rechnern installiert. Das wird auch sicherlich dieses Jahr wieder eine erstklassige Veranstaltung, also gleich anmelden denn die Plätze sind meist schnell weg: http://www.multimediatreff.de/reservieren.php

Aus der offiziellen Ankündigung des 25. Multimediatreffs:

Immer häufiger sieht man sie im Alltag… RIAs. Rich Internet Applications begegnen einem im Web, als Navigationsoberfläche für Onlinebestellungen, als Auto-Konfigurator oder auch mobil, denn viele Benutzeroberflächen von Handys und Navigationssystemen wurden als RIAs entwickelt. Die Vorteile liegen klar auf der Hand – sie sind in der Regel benutzerfreundlicher als herkömmliche Webanwendungen, reagieren schneller auf Benutzereingaben und funktionieren zudem meist offline direkt beim Client. Dieser Multimediatreff beleuchtet die populärsten Multimedia-Allrounder zur Erstellung von RIAs – Flash, Flex und Silverlight: http://www.multimediatreff.de

Die Jubiläumsveranstaltung zum 25. Multimediatreff richtet sich verstärkt an Flash/Web-Entwickler und -Designer, die sich einen Überblick der neusten Features und Technologien rund um die Erstellung von Web- und Desktop-Anwendungen mit Flash, Flex & Silverlight verschaffen möchten.

Die Teilnahme an dieser Veranstaltung kostet 35,- EUR und beinhaltet die Verpflegung über den ganzen Tag. So gibt es lecker belegte Brötchen, opulente Fruchtschalen und am späten Nachmittag darf man sich auf die berühmt berüchtigte Pizza-Schlacht freuen! Zudem fließen reichlich Soft-Getränke und zum Abschluss gibt es noch ein spritzig, kühles Kölsch oder je nach Belieben ein Becks.

Die Vergangenheit hat gezeigt, dass die Plätze beim MMT meist schnell vergeben sind – so gilt es sich rechtzeitig anzumelden: http://www.multimediatreff.de/reservieren.php

Testliste drucken

11.02.2009 16:38:50 | Thomas Schissler

In manchen Fällen ist es wünschenswert, eine Liste mit den Tests aus einem Projekt auszudrucken. Leider gibt es hierzu in Visual Studio keine direkte Funktion, aber ein kleiner Trick hilft hier:

1.) Im TestView die gewünschten Spalten einblenden

image

2.) Gewünschte Tests markieren und dann im Kontext-Menü "Copy" auswählen

image

3.) In Excel einfügen, fertig!

image

Das selbe funktioniert übrigens auch aus den Test Results, leider ohne Icons :-(

image

Sandcastle & Co. - Des Kaisers neue Kleider

11.02.2009 11:15:57 | Rainer Schuster

Es ist nun schon eine Zeit lang still um die Dokumentationstools geworden. Den letzten Release von Sandcastle gab es im Mai vergangenen Jahres. Ähnlich sah es bei den GUI Aufsätzen Sandcastle Help File Builder und DocProject aus. Waren bei den bisher veröffentlichten Releases doch ein 3-4 Monatsrhythmus üblich sieht dies nun leider anders aus. Laut Sandcastle-Blog wird es die nächste Version nach der BETA 1 vom Visual-Studio 2010 geben, da das Tool momentan für die das neue Hilfesystem Help3 angepasst wird.

Die Alten

In der Zwischenzeit dürfen wir uns über eine neue BETA Version 1.8.0.1 vom SHFB  freuen.

Scheinbar ruhig wurde es allem Anschein leider um einen Kandidaten. Von DocProject hörte man leider so gar nichts mehr. Doch einen Tag vor erscheinen der neuen SHFB Version erschien ein neuer Kommentar von Dave Saxton, in dem er schreibt, dass die neue Version (vor allem sein MAML-Designer) stark in kleinen, stündlichen Updates über die Monate hinweg gewachsen ist. Den versprochenen neuen Release übers Wochenende konnte er leider wie so oft nicht halten. Wir können aber zuversichtlich sein, dass auch hier bald eine neue Version erscheint.

Der Neue

Leise und klammheimlich ist ein "Neuer" auf die Bühne getreten, über den ich schon berichtet habe. Die Rede ist von Sandcastle Assist. Wie es scheint haben sich in Sachen OpenSource Dokumentationstools die Ereignisse letzte Woche wieder überschlagen. Endlich gibt es eine erste Version zum Testen. Die Codebasis ist solide. Die Komponenten sind Modular und der Autor Paul Selormey hat die Komponenten so ausgelegt, dass sie auch von den anderen Projekten verwendet werden können.

Basierend auf der Codebasis der freien IDE SharpDevelope ist ein Editor Names Sandcastle Workshop entstanden. Wen die "Planing-Version" interessiert kann sie sich hier herunterladen.

Silverlight-Workshop auf der FFK09 im April

10.02.2009 20:13:20 | Peter Kirchner

Nach dem großen Erfolg des Silverlight-Einsteigerworkshops auf der letzten Flashforum -Konferenz (FFK08) gibt es natürlich auch dieses Jahr auf der FFK09 wieder einen Silverlight-Workshop. Allerdings nicht mehr als reinen Einsteigerworkshop – dieses Jahr geht es tiefer in die Materie: Silverlight Praxis - Professionelle datengetriebene Anwendungen mit .Net für das Netz (am 30. April 09).

In Silverlight 2 gibt es eine Vielzahl Möglichkeiten zur schnellen und einfachen Integration, Visualisierung und Verarbeitung von Daten. Die Kommunikation mit unterschiedlichen Servern ist kinderleicht und erlaubt eine nahtlose Verknüpfung verschiedener Backend-Systeme mit Silverlight 2, um die Daten im Browser für Windows, Mac und Linux übersichtlich darzustellen.

Der Workshop empfiehlt sich für alle, die bereits Erfahrung mit der Entwicklung von Rich Internet Applications, Silverlight oder Flash/Flex haben und tiefer in die Themen Datenanbindung und WebServices einsteigen wollen, sowie für alle, die einen Einblick in die leistungsfähige .NET-Plattform speziell aus der Perspektive des Webentwicklers erhalten möchten.

Der Workshop kostet für Besucher der FFK09 lediglich 30,- Euro Unkostenpauschale, also besser schnell anmelden bevor er wieder ausgebucht ist.

Über die FFK09 (ehemals Flashforum-Konferenz): Schon zum neunten Mal laden Marc Thiele, Sascha Wolter und das Flashforum zur größten deutschsprachige Konferenz rund um Web-Technologien und -Anwendungen nach Köln ein. Auch dieses Jahr liegt der Fokus auf Rich Applications für das Consumer- und Enterprise-Segment auf Basis der Flash-Plattform, der Flex-Produktfamilie, AIR sowie Silverlight. Der wichtige „Blick über den Tellerrand“ wird auch in diesem Jahr durch zahlreiche kreative und inspirierende Themen sicher gestellt. Aber auch der in dieser Form einmalige persönliche Erfahrungs- und Wissensaustausch unter den Entscheidern, Entwicklern und Designern bleibt gewahrt.

Links:

Silverlight-Workshop auf der FFK09

10.02.2009 16:20:47 | Oliver Scheer

Nach dem großen Erfolg des Silverlight-Einsteigerworkshops auf der letzten Flashforum -Konferenz (FFK08) gibt es natürlich auch dieses Jahr auf der FFK09 wieder einen Silverlight-Workshop. Allerdings nicht mehr als reinen Einsteigerworkshop – dieses Jahr geht es tiefer in die Materie: Silverlight Praxis - Professionelle datengetriebene Anwendungen mit .Net für das Netz (am 30. April 09).

In Silverlight 2 gibt es eine Vielzahl Möglichkeiten zur schnellen und einfachen Integration, Visualisierung und Verarbeitung von Daten. Die Kommunikation mit unterschiedlichen Servern ist kinderleicht und erlaubt eine nahtlose Verknüpfung verschiedener Backend-Systeme mit Silverlight 2, um die Daten im Browser für Windows, Mac und Linux übersichtlich darzustellen.

Der Workshop empfiehlt sich für alle, die bereits Erfahrung mit der Entwicklung von Rich Internet Applications, Silverlight oder Flash/Flex haben und tiefer in die Themen Datenanbindung und WebServices einsteigen wollen, sowie für alle, die einen Einblick in die leistungsfähige .NET-Plattform speziell aus der Perspektive des Webentwicklers erhalten möchten.

Der Workshop kostet für Besucher der FFK09 lediglich 30,- Euro Unkostenpauschale, also besser schnell anmelden bevor er wieder ausgebucht ist.

Über die FFK09 (ehemals Flashforum-Konferenz): Schon zum neunten Mal laden Marc Thiele, Sascha Wolter und das Flashforum zur größten deutschsprachige Konferenz rund um Web-Technologien und -Anwendungen nach Köln ein. Auch dieses Jahr liegt der Fokus auf Rich Applications für das Consumer- und Enterprise-Segment auf Basis der Flash-Plattform, der Flex-Produktfamilie, AIR sowie Silverlight. Der wichtige „Blick über den Tellerrand“ wird auch in diesem Jahr durch zahlreiche kreative und inspirierende Themen sicher gestellt. Aber auch der in dieser Form einmalige persönliche Erfahrungs- und Wissensaustausch unter den Entscheidern, Entwicklern und Designern bleibt gewahrt.

Links:

WPF Animations On Slow Systems

10.02.2009 13:22:00 | Jens Peter Kleinau

There is always the demand that the new fancy application with all the animations has to do exactly the same job on slow office machines as on high end gaming engines. There are serveral ideas and recommodations to reach that goal. But most of them will lead only to failure. And that is why. Usually animations are measured in Frames. Let us start with a...

[[ This is a content summary only. Visit my website for full links, other content, and more! ]]

Meine Schätze: ReSharper und Visual Studio 2010

10.02.2009 11:58:00 | Gregor Biswanger

Normal 0 21 false false false DE X-NONE X-NONE MicrosoftInternetExplorer4

Ralf Westphal und Stefan Lieser haben sich gegen Ende 2008 zusammengesetzt und Ihre Gedanken zum Thema professionelle sowie qualitative Softwareentwicklung und der Weg dorthin ausgetauscht. Das war die Geburtsstunde von Clean Code Developer. Am 09. Februar 2009 gab es dazu die erste öffentliche Online-Konferenz auf Altdotnet.de. Dieser Artikel beschäftigt sich weitegehend zu der entstandenen Diskussion, warum immer weniger auf die Qualität der Software beim entwickeln eingegangen wird. Eine Video-Aufzeichnung der Konferenz kann sich hier noch einmal angesehen werden:http://www.altdotnet.de/OnlineMeeting_090209.ashx

Das Leiden über die fehlende Softwarequalität gibt vielen .NET-Experten unruhige Nächte. Obwohl der tägliche Kampf um etablierte Technologien oder Prozesse einführen zu wollen, sie bedächtig ermüden sollte. Warum werden Sie nicht Akzeptiert? Warum wird immer noch Software im Chaos entwickelt? Wieso müssen Anwender darunter leiden? Vor allem, wie kann man das ändern?

Genauso wie es dazu unzählige Fragen gibt, kommen auch entsprechende Meinungen dazu. Es beginnt meist mit der Schuldzuweisung von außen. Der Chef oder der Kunde wären dagegen, weil die Qualität zu Zeitaufwendig ist und somit zu Teuer wäre. Von einer anderen Seite betrachtet, wird auch auf das fehlende Wissen hingewiesen. Ebenso wird auch hier eine Schuld an andere weitergeben: Folglich müsse das fehlende Wissen an Lehrern und Büchern liegen. Man bemerkt schnell wie weit sich das Thema herauszieht und ausdehnt. Vor allem was alles dafür Begründet wird um dieses Fehlverhalten der meisten Entwickler zu gerechtfertigten. Es soll nun außerhalb dieses Problems einmal der Mensch im Detail betrachtet werden, wie er eigentlich erst für Veränderungen offen sein kein.

Zurück zum Menschen

Bei der Geburt eines Menschen wird vom ersten Augenblick dessen Daseins ein Muster geschaffen. Die Psychologie nennt dies Konditionierung. Diese Muster werden Bildlich im Bauch der Menschen abgelegt. Alles was wir sagen oder uns vorstellen, sind nur Analogien. Das heisst: Die und Modelle sind nicht die Wirklichkeit, sie stehen für etwas, was sich im Grunde nicht benennen lässt. Ihr Ansehen ist relativ. Die sogenannte Realität ließe sich auch unter ganz anderen Vorgaben erfassen.


Abb. 1.1. – Konditionierung eines Entwicklers

Als Beispiel soll ein Muster zeigen, das sich bei einem Programmierer festgelegt hat (siehe dazu Abb.1.1): Der erste Punkt fängt mit der erlernten Erfahrung an. Die meisten Entwickler die unter Windows Ihre erste Schritte anfingen, begannen meist mit einer IDE (Visual Basic, Visual Studio) von Microsoft. Es ist in jeder dieser IDE`s  ein fertiges Windows-Fenster (WinForms) zu erkennen und mittels [F5]-Taste lässt sich Blitzartig ein Ergebnis liefern. Dieses Ereignis hat sich in diesen Augenblick fest als Muster abgelegt. Dieses Erfolgserlebnis lies viele für ein weiteres erlernen Motivieren, indem es uns zeigte das Programmieren nicht Kompliziert sein muss.

Folgend in der Abbildung ist zu erkennen, dass in unserer Vergangenheit sich ein allgemeines Muster von der Gesellschaft abgelegt hat. Die Zeit. Es wird uns verdeutlicht, dass wir immer weniger Zeit für bestimmte Ereignisse zur Verfügung haben. Sie vergeht und kann nirgends bezogen werden. Daher ist ein „Gutes einteilen“ in uns verinnerlicht.

Allerdings verursacht gerade dieses Muster ein unheimliches Problem. Es ist eines von wenigen Mustern, was durch einen äußeren Einfluss gleich zahlreiche andere Muster mit beeinflusst.

Infolgedessen sollte der Punkt bei der Programmierung noch einmal betrachtet werden. Das erste Muster für ein schnelles Ergebnis ist abgelegt. Die gefolgte Motivation hat ein weiteres Lernen der Grundlagen erbracht. Nun ist durch ein Gefühl auch eine Beziehung zu einer Technologie entstanden, demnach entwickelt man gerne Windows-, Web- oder Mobile-Anwendungen.

Nun kommt es aber häufig dazu, das man das erlerne Beruflich umsetzen möchte. Doch das Berufsumfeld lässt das abgelegte Muster mit der Zeit, wie eine Kettenreaktion auf andere Muster auslösen. Nun kommt der Notstand, wenn gegenwärtig andere unbekannte Technologien und Prozesse erlernt werden sollen, verursacht das Zeit. Die muss aber gut eingeteilt werden.

Demzufolge kommt das erste Muster in den Vordergrund. Es wird alles gemacht um an den schnellen Kick für das Erfolgserlebnis zu bekommen. Denn ein weiteres Muster besagt: Alles was Schnell ist, gibt uns genügend Zeit.

In die Falle geführt

Genau jetzt haben die abgelegten Muster die Programmierer in die Falle geführt. Die Entwicklung von Software kann nicht „schnell“ umgesetzt werden. Denn „schnelles“ Programmieren verursacht eine schnelle Unübersichtlichkeit. Es entsteht die überaus gefürchtete Komplexität! Folgende Fehler sind nur noch Schwer zu finden und eine Einarbeitung für neue Mitarbeiter dauert zudem ca. 3-4 Monate.

Zeit für neues

Obwohl sich die Softwareentwicklung und deren Architektur leider langsam voran schreiten, gibt es bereits doch für viele Probleme die ideale Lösung. Die Lösungen bieten zudem eine hohe Qualität der Software zudem noch einen korrekten Pfad für den Ausgleich von Komplexität vs. Flexibilität.

Nur eines können die neuen Lösungsansätze nicht, das erste abgelegte Muster „Schnelles Ergebnis [F5]“ übertrumpfen. Das Muster was über das „Zeit“-Muster steht, kann nicht überwogen werden. Daher wird das „neue“ sehr schnell als „Unnötig“ – eingestuft.

Das Unterbewusstsein widerspiegelt unsere Muster

Nach dieser Kettenreaktion ist folgendes aus dem Unterbewusstsein übersetzt und wird auch dementsprechend vom Menschen dem „Ich“ wiedergegeben: Es muss „schnell“ wieder das erste Muster erreicht werden. Das sagen der Chef und die Kollegen. Wie das „neue“ geht hat man eventuell mal von einem Lehrer gehört oder einer Literatur gelesen. Doch sind eigene Erfahrungen nicht gemacht worden. Es ist zu gefährlich. Fehler können nur noch „mehr“ zeit beanspruchen.

Wie ein Muster verändern?

Jetzt ist bewusst, dass alles in Mustern abgelegt wird. Wenn im Moment das Geheimnis gelüftet wird, wie ein Muster verändert werden kann, besteht eine unheimliche Macht über eine kontrollierte zielstrebige Ausbildung von besseren Entwicklern beim Arbeitsplatz und Umgebung. Leider muss diese Vision gleich wieder zerbrochen werden. Ein Muster kann Wissenschaftlich nicht verändert oder gelöscht werden. Es gibt nur einen Weg für Muster: Es müssen alternative Muster aufgebaut werden, die alte Muster überblenden können.

Bewusstsein ist Veränderung

Um das bestehende „Hallo Welt“-Muster = „Schnelles Ergebnis [F5]“-Muster zu überblenden gibt es nur eine bahnbrechende Lösung. Es kann nur „vorgemacht“ werden. Man kann auch nur das erste Muster übertrumpfen, das mittels neuen Technologien „verbildlicht“ ein schnelles und doppelt so gutes Ziel erreicht werden kann.

Fazit

Es kann doch etwas gegen die schlechte Qualität bei der Softwareentwicklung gemacht werden. Die .NET-Experten sollen weiterhin am förderlichsten den besseren und goldenen Weg hervorheben. Lehrer und Trainer müssen auch Bildlich etwas vormachen und am besten „Learning by Doing“-Praktiken durchsetzen als lediglich einzelne Folien zu zeigen.

Für Entwickler allgemein gilt, es muss als Alternative die nachkommend dazu Gewonnene Zeit in Anbetracht gezogen werden, die durch die neuen Praktiken eingeholt werden. Programmieren macht bei einem „sauberen“ Umfeld doppelt so viel Spaß!

Neben Clean-Code-Developer wird in den nächsten Wochen ein zusätzliches Projekt gestartet, das bis jetzt über ein halbes Jahr an Arbeit beansprucht hat. Dieses Projekt gilt derzeit als „TOP-Secret“ und wird für eine gute Alternative an großer Bedeutung stehen. Ihr könnt alle Gespannt sein, was euch erwartet wird. In der .NET-Welt rührt sich was. Auf ersprießlicheren Source-Code!

Silverlight-Workshop auf der FFK09

10.02.2009 11:47:49 | Steffen Ritter

Nach dem großen Erfolg des Silverlight-Einsteigerworkshops auf der letzten Flashforum -Konferenz (FFK08) gibt es natürlich auch dieses Jahr auf der FFK09 wieder einen Silverlight-Workshop. Allerdings nicht mehr als reinen Einsteigerworkshop – dieses Jahr geht es tiefer in die Materie: Silverlight Praxis - Professionelle datengetriebene Anwendungen mit .Net für das Netz (am 30. April 09).

In Silverlight 2 gibt es eine Vielzahl Möglichkeiten zur schnellen und einfachen Integration, Visualisierung und Verarbeitung von Daten. Die Kommunikation mit unterschiedlichen Servern ist kinderleicht und erlaubt eine nahtlose Verknüpfung verschiedener Backend-Systeme mit Silverlight 2, um die Daten im Browser für Windows, Mac und Linux übersichtlich darzustellen.

speaker_badge_ffk09

Der Workshop empfiehlt sich für alle, die bereits Erfahrung mit der Entwicklung von Rich Internet Applications, Silverlight oder Flash/Flex haben und tiefer in die Themen Datenanbindung und WebServices einsteigen wollen, sowie für alle, die einen Einblick in die leistungsfähige .NET-Plattform speziell aus der Perspektive des Webentwicklers erhalten möchten.

Der Workshop kostet für Besucher der FFK09 lediglich 30,- Euro Unkostenpauschale, also besser schnell anmelden bevor er wieder ausgebucht ist.

Über die FFK09 (ehemals Flashforum-Konferenz): Schon zum neunten Mal laden Marc Thiele, Sascha Wolter und das Flashforum zur größten deutschsprachige Konferenz rund um Web-Technologien und -Anwendungen nach Köln ein. Auch dieses Jahr liegt der Fokus auf Rich Applications für das Consumer- und Enterprise-Segment auf Basis der Flash-Plattform, der Flex-Produktfamilie, AIR sowie Silverlight. Der wichtige „Blick über den Tellerrand“ wird auch in diesem Jahr durch zahlreiche kreative und inspirierende Themen sicher gestellt. Aber auch der in dieser Form einmalige persönliche Erfahrungs- und Wissensaustausch unter den Entscheidern, Entwicklern und Designern bleibt gewahrt.

Links:

Subtle design: inheritance vs roles

10.02.2009 11:04:19 | Andre Loker

Let’s say you’re supposed to design a staff administration. Part of the domain model are managers and employees. Whenever you talk to your client you hear sentences such as “some of our employees are managers of a given department” or similar. Therefore, you might be tempted to model employees and managers as an “is-a” relationship, that is, you use inheritance.

isa

Let us evaluate this (really simple!) model critically. What implications does a design like this have, assuming that we are going to implement this model in a OO language like C#?

1. First of all, it implies that everyone is either an employee or a manager throughout his or her life. Although we can principally model “dynamic inheritance” in e.g. ERDs, in a language such as C# we can’t change the type of an instance all of a sudden. So, if you create a new employee, you’d have to decide whether it is in fact an employee or a manager and create an instance of the according type. As a consequence, an employee can’t be promoted to a manager and a manager can’t be degraded to a simple employee.

2. An employee can’t manage more than one department. Because one employee can’t be “multiple managers at once” (although some might which to when looking at their schedule *g*), there’s no way to let some employee manager multiple departments. Of course, in this simple model you could change the cardinality of the Manager <-> Departmennt relationship. But as soon as you for example want to assign a bonus payment to managers dependent on the manager itself and the department, simply associating multiple departments to a single manager won’t do the trick anymore.

By now you should have realized that modelling the employee-manager relationship as an “is-a” is rather inflexible. We can improve the design if we reconsider the meaning “some of our employees are managers of a given department”. What this actually means is: “some of our employees are in the role of being a manager of a given department”. Thus, being a manager is a role played by a player, ie. the employee. In general this can be modelled like:

role1As you see the player can play multiple roles, each role is played by only one player. We can easily attach or detach roles as needed without changing the type of the player. Putting the role-player relationship into our case leads to:

emproleThis design is much more flexible: employees can start as “normal” employees, can be promoted or degraded and can manage as many departments at once as required.

Identification and countability

When do you model a relationship as inheritance and when as a role-player relationship? To help you make this decision R. J. Wieringa (see references below) suggests to determine how the different entities are counted and how they are identified. If we count managers, do we count in fact employees? If so, each manager should be identified the same way as employees, e.g. by an employee number. In that case managers and employees can be modelled using inheritance. On the other hand, if managers are counted and identified differently from employees (e.g. using a management contract number) we should apply the role-player relationship.

Another example given by Mr Wieringa is the relationship between persons and passengers on a flight. Modelling passengers as a subtype of persons is probably not optimal because it would imply that a person can only be a passenger once. Passengers are most likely not counted as persons. They are probably identified by a ticket number not by e.g. a social security number.

Conclusion

Be critical if you model “obvious” is-a relationships. Do you really have a case of specialization or is the “subtype” only a role that is played by the general type?

References

Once again the concepts presented in this article are based on Design Methods for Reactive Systems by R.J. Wieringa (Amazon) (And no, I don’t get any commission for recommending this book).

Clean Code Developer - Gedanken zum Online-Meeting

10.02.2009 01:36:05 | Norbert Eder

Gestern hatte es das 3. Online Meeting von ALT.NET DE zum Thema Clean Code Developer (CCD) gegeben. Mit dabei war jede Menge Prominenz der deutschsprachigen .NET Community. Ich möchte an dieser Stelle jetzt nicht das Thema Clean Code Developer (= die Initiative) breittreten - da kann sich jeder auf oben verlinkter Site informieren. Vielmehr...

XAML-Export für Illustrator jetzt auch mit Mac OS X

09.02.2009 20:18:55 | Steffen Ritter

Es war ein langer Tag und deswegen mache ich es kurz, aber das ist zu gut um bis morgen zu warten: Mike Swansons XAML-Export-Plug-In für Adobe Illustrator ist jetzt auch für die Mac OS X-Version von Illustrator verfügbar.

xamlmac

Alle Infos und Download direkt in Mikes Blog unter http://blogs.msdn.com/mswanson/archive/2009/02/08/test-version-of-my-illustrator-to-xaml-plug-in-for-the-mac.aspx

Sorry

09.02.2009 19:16:13 | Thomas Schissler

Als Blogger freut man sich natürlich immer über Kommentare. Das ist bei diesem Medium eine der wenigen Möglichkeiten Feedback zu bekommen. Und nun musste ich feststellen, dass auf meinem Blog leider seit einger Zeit die Kommentare nicht mehr richtig zugestellt werden. Dafür ein großes Entschuldigung an alle, die in letzte Zeit sich die Mühe gemacht haben und meine Beiträge kommentiert haben. Sorry, das ihr keine Antwort erhalten habt. Lasst euch nicht entmutigen, ich freue mich über jeden Kommentar und jetzt sollten die auch wieder bei mir ankommen.

Webcast-DVD 2008 ab sofort verfuegbar [Developer + IT Pros]

09.02.2009 18:40:17 | Kay Giza

In guter Tradition und nach vielfachem Kundenwunsch hat MSDN Deutschland auch für das Jahr 2008 eine große Auswahl an Webcasts gesammelt und auf DVD gebrannt. Unter dem Motto "Ready for Replay" bietet die Webcast-DVD Edition 2008 jede Menge Beiträge zu den wichtigsten Themen für Entwickler im Microsoft-Umfeld: angefangen beim .NET Framework 3.5, über die Windows Presentation Foundation und Silverlight bis hin zu Visual Studio und Visual Studio Team System.

Die brandaktuelle Webcast-DVD von Microsoft Deutschland ist eine Sammlung informativer Webcasts, die 2008 veröffentlicht wurden. Mit über 190 Beiträgen aus den Bereichen MSDN und TechNet – unter anderem auch zu „Windows Server 2008“ und „Virtualisierung“ – können Sie sich einfach und bequem weiterbilden.

Nutzen Sie das umfassende Archiv mit Offlinepräsentationen, um die neuesten Microsoft-Technologien kennen zu lernen, Ihr Knowhow zu vertiefen oder konkrete Aufgaben Ihres beruflichen Alltags zu lösen. Ein Highlight dieser DVD sind sicherlich die Beiträge zur Xtopia 08, der Konferenz für Business, Web Technology, Design und UX, sowie zum Microsoft Technical Summit 2008, der Konferenz für professionelle Entwickler, Softwarearchitekten und IT-Professionals.

Der Vorteil der DVD, dass sagen uns auch immer wieder viele Kunden, sind die ausgewählten Themen, zusammengefasst auf einer DVD. Selbstverständlich können Sie auch alle unsere Webcasts und sonstige Multimedia-Inhalte online anschauen und einzeln herunterladen - gar keine Frage. Auf der DVD finden Sie jedoch zusammengestellt bereits alle wichtigen Webcasts , zu den oben genannten Themen müssen nicht mehr einzeln die Online-Referate herunterladen.

Link: Microsoft Webcasts-DVD - Edition 2008

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-2009 Kay Giza. All rights reserved. Legal

Subtle design: snapshot cardinalities

09.02.2009 15:02:10 | Andre Loker

So your designing some application, let’s say for a library. Being the DDD guy that you are, you talk to a clerk at the library and she tells you that the system under development should save the fact that a book is lent out by a specific reader. So you choose to model that fact like this:

book You present this diagram to the library manager and he’s slightly confused: “What’s that? Our books are lent out by hundreds or thousands of people. Your design supports only one reader!”

You answer: “No, no. This model only says that a book is lent out by a single reader at a given time.

What happened here is that the library manager and you had a different idea of what portion of time the UML model represented. For you, the cardinalities shown in the diagram represented so called Snapshot Cardinalities, ie. cardinalities that occur at a single point in time. E.g. at any given moment, a book is lent by not more than one reader. The manager looked from a different perspective and interpreted the cardinalities as being historic. Throughout the lifetime of a book it is lent out by many readers, therefore his confusion.

The moral of the story

  • don’t assume that everyone looking at an UML diagram has the same idea of the semantics of numbers (or arrows for that matter).
  • be aware that we can have snapshot cardinalities as well as historic cardinalities. Most of the time you’ll use snapshot cardinalities because that’s what you’ll probably use in your code later on. Nevertheless, make that clear to the people with which you’re talking about the diagram
  • don’t mix different types of cardinalities, or be very explicit if you do so

For the interested reader I recommend R.J. Wieringa, Design Methods for Reactive Systems (Amazon)

3. Online Meeting ALT.NET DE: Clean Code Developer

09.02.2009 13:35:00 | Peter Bucher

Heute 03.02.09 um 20:00 Uhr findet das dritte Online Meeting von ALT.NET DE mit einem besonderen Thema statt.

Stefan Lieser und Ralf Westphal haben - wie hier auch schon erwähnt - vor einiger Zeit Clean Code Developer aus der Taufe gehoben:

http://www.clean-code-developer.de/

Die beiden Initiatoren stellen heute die Idee hinter der Seite und dem Konzept vor und sagen euch, wie der Weg zum sauberen Entwickler aussehen könnte.
Zudem stehen sie Rede und Antwort.

Anmeldung und Teilnahmeinformationen:.

http://www.altdotnet.de/OnlineMeeting_090209.ashx

.NET Stammtisch Konstanz-Kreuzlingen mit eigener Website

09.02.2009 10:32:00 | Peter Bucher

Über das Wochenende waren wir fleißig und haben eine erste Version der offiziellen Website des .NET Stammtisch Konstanz-Kreuzlingen veröffentlicht.

Im Moment bietet die Website eine Übersicht über die aktuellen Termine, sowie die Möglichkeit sich für einen kommenden Termine anzumelden.

http://www.dotnetkk.de/

Was kommt noch? Es wird einen Mitgliederbereich geben und einen Bereich mit Links zu den wichtigsten Ressourcen.

Mitglieder werden später folgende Möglichkeiten haben:

  1. in einem Downloadbereich Folien, Vorträge und Beispiele herunterzuladen
  2. andere Mitglieder zu sehen und zu kontaktieren
  3. Newsletter zu abonnieren
  4. Terminerinnerungen per Email zu bekommen

PS: Die Anmeldung für den ersten Stammtisch ist immer noch offen!

Die Website wird mit dem ASP.NET MVC Framework entwickelt und bei 69° gehostet (Community-Hosting).

Hosted by 69grad

Billigprodukte: Die MacGyver-Dockingstation

09.02.2009 10:13:37 | Gordon Breuer

DSC00066 Vor einigen Wochen hatte ich mir für “kleines” Geld eine Dockingstation für mein HTC P3700 (Touch Diamond) im Internet gekauft. Für das Original von HTC muss man 30 Euro und mehr auf den Tisch legen. Sie sieht zwar stylisch aus, aber soviel war mir der Spaß auch nicht wert. Immerhin wollte ich lediglich mein Smartphone auf dem Schreibtisch so platzieren, dass ich hin und wieder einen Blick aufs Display werfen kann und es dabei an selbigen per USB-Kabel verbunden ist. Also sollte es das 10-Euro-Produkt aus Taiwan sein.

Tag 1: Sieht ok aus für den Preis. Alle Kabel sind dabei und werden angeschlossen. Danach das HTC draufgesteckt: Snychronisation startet und der Akku beginnt sich aufzuladen. Perfekt!

Tag 2: Huch, habe 2 Anrufe verpasst! Das Handy schaltet automatisch in den Headset-Modus wenn es in der Dockingstation steht. Gut, diese hat ein eingebautes Mikrofon und einen 3.5er Klinkenanschluss für Lautsprecher. Mal abgesehen vom unerträglichen Lautsprecher-Pfeifen und der künstlichen Beschränkung auf Mono (siehe auch den Kommentar bei dem Link oben) möchte ich aber sicher nicht im Büro mit der Freisprechanlage telefonieren. Um wenigstens das Klingeln zu hören bleibt mir nichts anderes übrig als die Dockingstation mit ein paar Lautsprechern zu verbinden. Die im Monitor integrierten bieten sich dafür an da ich sie ansonsten sowieso nicht verwende.

Tag 3: Wenn ich das Gerät in der Station über den Touchscreen bediene bricht kurzzeitig die Verbindung zum Rechner ab. Gut, so oft kommt das ja nicht vor. Bin immer noch zufrieden.

Tag 4: Die Verbindung zum Rechner bricht inzwischen in unregelmäßigen Abständen kurzzeitig ab, auch wenn ich nicht mal in der Nähe des Gerätes bin. Gelegentlich beschwert sich Windows und baut verweigert die erneute Verbindung weil selbige zu oft hintereinander in kurzer Zeit abgebrochen ist. Einmal das Mobiltelefon aus der Station nehmen und neu einsetzen hilft. Langsam nervt es, aber gut. Es war ja nur ein günstiges Gerät und keine teure Markenware.

Tag 6: Ich sitze abends in der Bahn auf dem Weg nach Hause und will flink meine neuen RSS-Feeds lesen. Da unterbricht mich eine Warnmeldung mit dem Hinweis, dass meine Batterie sehr schwach ist und das Gerät abgeschaltet oder aufgeladen werden sollte. Hä? Das stand doch den ganzen Tag in der Dockingstation und müsste eigentlich komplett geladen sein!? Ich beschließe das ganze genauer zu beobachten am…

Tag 7: …und stelle fest, dass das Handy nicht in den Lademodus geht. Ein wenig Wackeln und Rütteln und nach ein paar Minuten beginnt er mit dem Aufladen des Akkus. Eine Verbindung zum PC kann ich jedoch nicht mehr herstellen. Die war gestern schon ständig abgerissen aber heute scheint sie überhaupt nicht mehr aufgebaut zu werden. Um den Fehler zu komplettieren bleibt das Headset-Icon weiterhin sichtbar und die Display-Beleuchtung eingeschaltet. Kein Wunder also, dass der Akku gestern Abend völlig leer war!

Nach einer Woche wird die Dockingstation wieder abgeklemmt und landet in der untersten Schublade meines Schreibtischs. Das Handy liegt wieder in der Dokumentenablage über ein einfaches USB-Kabel mit dem PC verbunden und ich verbuche die 10 Euro als Lehrgeld. Allerdings hat mich das blöde Ding nicht ganz losgelassen – ich hänge an meinem Geld, erst recht wenn ich es für Mist ausgegeben habe. Irgendwas muss sich doch mit diesem Plastikmüll machen lassen?! Mehr…

ASP.NET MVC: MasterPage zur Laufzeit ändern

09.02.2009 08:17:26 | Albert Weinert

Hier und da ist es notwendig dass man die MasterPage zur Laufzeit ändern möchte. Bei ASP.NET MVC kann man dies auf mittels eines eigenen ActionFilterAttribute machen.

public class MasterPageSwitchAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var viewResult = filterContext.Result as ViewResult;
        if (viewResult != null)
        {
            viewResult.MasterName = &quot;NeueMasterPage&quot;;
        }
    }
}

Dieses Attribute einfach an den gewünschten Controller, oder die Action hinzufügen und schon bekommt man die gewünschte MasterPage angezeigt.

Die MasterPage wird über die üblichen ASP.NET MVC Suchpfade ermittelt und der MasterName darf keinen Suffix ".master” enthalten.

Natürlich macht ein fest einprogrammierter Name der neuen MasterPage keinen großen Sinn. Man sollte diese mit einer gewissen Logik ermitteln. Ich nehme im echten Code einen kleinen Settings-Provider.

 

IE8 Kompatibilitaetsliste: FAQ, welche Domains sind enthalten und wie kann man die Liste ausser Kraft setzen

09.02.2009 08:16:34 | Kay Giza

In diesem Blogposting beantworte ich Fragen rund um die ‘Internet Explorer 8 -"Kompatibilitätsansichtsliste"‘, welche Microsoft optional mit dem Internet Explorer (IE8) bereitstellt. In dieser Liste werden alle aus Microsoft-Sicht weltweit wichtigen Domains gelistet (derzeit. 3.115) um im IE8 im Kompatibilitätsmodus angezeigt zu werden. Darunter u.a. Heise.de oder ZDF.de. In diesem Blogposting auf Giza-Blog.de finden Sie die vollständige Liste und man kann überprüfen, ob man selber mit seiner Webseite in der Liste gelandet ist. Weiterhin erkläre ich, wie die Liste von Microsoft zusammengestellt wurde, wie es sich mit dem Datenschutz verhält und wie der Update-Zyklus ist um die Liste zu aktualisieren und wie diese aktualisiert wird. Weiterhin gehe ich auf die Frage ein, wie der IE8 priorisiert im Sinne von: Microsoft Kompatibilitätsliste vs. manuell gepflegter Liste vs. Webseiten-Header. Zum Schluss ziehe ich mein eigenes kleines Fazit und erkläre noch, wie man die Kompatibilitätsansichtsliste außer Kraft setzen kann.

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-2009 Kay Giza. All rights reserved. Legal

.NET Stammtisch Konstanz-Kreuzlingen mit eigener Website

09.02.2009 02:31:00 | Jürgen Gutsch

Über das Wochenende waren wir fleißig und haben eine erste Version der offiziellen Website des .NET Stammtisch Konstanz-Kreuzlingen veröffentlicht.

Im Moment bietet die Website eine Übersicht über die aktuellen Termine, sowie die Möglichkeit sich für einen kommenden Termine anzumelden.

http://www.dotnetkk.de/

Was kommt noch? Es wird einen Mitgliederbereich geben und einen Bereich mit Links zu den wichtigsten Ressourcen.

Mitglieder werden später folgende Möglichkeiten haben:

  1. in einem Downloadbereich Folien, Vorträge und Beispiele herunterzuladen
  2. andere Mitglieder zu sehen und zu kontaktieren
  3. Newsletter zu abonnieren
  4. Terminerinnerungen per Email zu bekommen

PS: Die Anmeldung für den ersten Stammtisch ist immer noch offen!

Die Website wird mit dem ASP.NET MVC Framework entwickelt und bei 69° gehostet (Community-Hosting).

Hosted by 69grad

3. Online Meeting ALT.NET DE: Clean Code Developer am 09.02.2009

08.02.2009 13:15:17 | Albert Weinert

Am Montag den 09.02.2009 findet der Clean Code Developer Talk im Rahmen von VAN DE statt.

Stefan Lieser und Ralf Westphal haben sich Ende 2008 zusammengesetzt und Ihre Gedanken zum Thema professionelle sowie qualitative Softwareentwicklung und der Weg dorthin ausgetauscht. Rauskommen ist der Clean Code Developer.

http://www.clean-code-developer.de

Beim Online Clean Code Developer-Tak stellen sie kurz die Beweggründe dar und stehen für Fragen zu Verfügung. Start ist 20 Uhr, seid pünktlich.

Anmeldung und Teilnahmeinformationen:.

http://www.altdotnet.de/OnlineMeeting_090209.ashx

Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.

Wir freuen uns euch dort zu begrüßen.

3. Online Meeting ALT.NET DE: Clean Code Developer am 09.02.2009

08.02.2009 13:15:17 | Albert Weinert

Am Montag den 09.02.2009 findet der Clean Code Developer Talk im Rahmen von VAN DE statt.

Stefan Lieser und Ralf Westphal haben sich Ende 2008 zusammengesetzt und Ihre Gedanken zum Thema professionelle sowie qualitative Softwareentwicklung und der Weg dorthin ausgetauscht. Rauskommen ist der Clean Code Developer.

http://www.clean-code-developer.de

Beim Online Clean Code Developer-Tak stellen sie kurz die Beweggründe dar und stehen für Fragen zu Verfügung. Start ist 20 Uhr, seid pünktlich.

Anmeldung und Teilnahmeinformationen:.

http://www.altdotnet.de/OnlineMeeting_090209.ashx

Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.

Wir freuen uns euch dort zu begrüßen.

Useful Links for SharePoint Administrators and Developers

08.02.2009 11:43:00 | Ozgur Aytekin

Installing & Configuring the Environment
Deploy Office SharePoint Server 2007 in a server farm environment: http://technet.microsoft.com/en-us/library/cc303428.aspx

Plan for administrative and service accounts (Office SharePoint Server): http://technet.microsoft.com/en-us/library/cc263445.aspx

Planning and Monitoring SQL Server Storage for Office SharePoint Server: Performance Recommendations and Best Practices (white paper): http://technet.microsoft.com/en-us/library/cc263261.aspx

Enable usage reporting: http://technet.microsoft.com/en-us/library/cc262537.aspx

Stsadm command-line tool (Office SharePoint Server): http://technet.microsoft.com/en-us/library/cc261956.aspx

STSADM Custom Extensions - Automating SharePoint 2007 Configurations via STSADM Custom Extensions: http://stsadm.blogspot.com/2007/08/stsadm-commands_09.html

Information about the Maintenance Plan Wizard in SQL Server 2005 and about tasks that administrators can perform against SharePoint databases : http://support.microsoft.com/kb/932744

Support for changes to the databases that are used by Office server products and by Windows SharePoint Services: http://support.microsoft.com/kb/841057

Database maintenance for Office SharePoint Server 2007 (white paper): http://technet.microsoft.com/en-us/library/cc262731.aspx

SharePoint Backup and Restore Overview: http://msdn.microsoft.com/library/bb447526.aspx

Plan for backup and recovery (Office SharePoint Server): http://technet.microsoft.com/library/cc261687.aspx


Understanding the Environment
Planning and architecture for Office SharePoint Server 2007: http://technet.microsoft.com/en-us/library/cc261834.aspx

Logical Architecture Components:: http://technet.microsoft.com/library/cc263121.aspx

Database types and descriptions (Office SharePoint Server):: http://technet.microsoft.com/library/cc678868.aspx

About SharePoint Site Collections : http://technet.microsoft.com/library/cc742548.aspx

Manage SharePoint Site Collections:: http://technet.microsoft.com/library/cc835712.aspx

Plan lists (Windows SharePoint Services): http://technet.microsoft.com/en-us/library/cc287823.aspx

White paper: Working with large lists in Office SharePoint Server 2007:: http://technet.microsoft.com/library/cc262813.aspx


Managing Environment Customizations
Customization Whitepaper: http://technet.microsoft.com/library/Cc263010.aspx

Understanding and Creating Customized and Uncustomized Files in Windows SharePoint Services 3.0: http://msdn.microsoft.com/library/cc406685.aspx

Solutions Overview: http://msdn.microsoft.com/en-us/library/aa543214.aspx

Solution package components: http://technet.microsoft.com/library/cc263289.aspx

SharePoint Features: http://msdn.microsoft.com/library/bb861828.aspx

SharePoint Solutions: http://msdn.microsoft.com/library/bb862721.aspx


A System Administrators Role in Branding
Customizing and Branding Web Content Management-Enabled SharePoint Sites: http://msdn.microsoft.com/library/aa830818.aspx

How to: Create New SharePoint Themes: http://msdn.microsoft.com/library/aa867986.aspx

How to: Apply a SharePoint Theme: http://msdn.microsoft.com/library/cc621346.aspx

Create a publishing page layout: http://office.microsoft.com/en-us/sharepointdesigner/HA101741281033.aspx

Implementing a Brand in a SharePoint Server 2007 Publishing Site: http://msdn.microsoft.com/library/dd221375.aspx

Understanding and Creating Customized and Uncustomized Files in Windows SharePoint Services 3.0: http://msdn.microsoft.com/library/cc406685.aspx

Introducing Microsoft Office SharePoint Designer 2007: http://office.microsoft.com/en-us/sharepointdesigner/HA100740831033.aspx

Help for SharePoint Designer 2007: http://office.microsoft.com/en-us/sharepointdesigner/FX100646991033.aspx

Introduction to Contributor Settings: http://office.microsoft.com/en-us/sharepointdesigner/HA101174691033.aspx


A System Administrators Role in Development
SharePoint Server Developer Portal: http://msdn.microsoft.com/en-us/office/aa905503.aspx

WSS Developer Center: http://msdn.microsoft.com/sharepoint/default.aspx

Review of Environments: http://technet.microsoft.com/library/cc263209.aspx

Team-Based Development in Microsoft Office SharePoint Server 2007: http://msdn.microsoft.com/library/bb428899.aspx

Hyper-V and Virtualization on Microsoft TechNet: http://technet.microsoft.com/en-us/virtualization/

Setting up the Dev Environment: http://technet.microsoft.com/library/cc262741.aspx

Code Access Security: http://msdn.microsoft.com/library/930b76w0.aspx


Governance
Governance Resource Center: http://technet.microsoft.com/en-us/office/sharepointserver/bb507202.aspx

Index of Governance Content: http://technet.microsoft.com/library/cc263341.aspx

Steps for building governance into SharePoint Server 2007 (white paper): http://go.microsoft.com/fwlink/?LinkId=92602&clcid=0x409

Sample governance plan: http://go.microsoft.com/fwlink/?LinkID=92333&clcid=0x409

Governance checklist guide: http://go.microsoft.com/fwlink/?LinkId=91896&clcid=0x409

.NET Bootcamp: Unit Tests

07.02.2009 16:19:54 | Alexander Groß

In ungefähr einer Woche, am 16.02.2009, findet das zweite .NET Bootcamp der .NET User Group Leipzig statt. Das Thema lautet diesmal Unit Tests und wird neben einer Einführung in das Testen auch Test-Driven Development und Behavior-Driven Development aufgreifen.

Die Organisation des Bootcamps findet wieder nach dem Konzept “Lernen durch Lehren” (LdL) statt. Das heißt, dass jeder Teilnehmer im Vorfeld zwei Fragen als “Hausaufgabe” bekommt und seine Ergebnisse während der Veranstaltung vorstellt. Ich werde die Rolle des Moderators übernehmen, Fragen klären, weitere Aspekte aufzeigen und sicher auch etwas von den Teilnehmern lernen.

Wie unser erster Testballon auf dem Gebiet LdL zum Thema .NET Framework 3.5 ist dieses Bootcamp mit 19 Teilnehmern überbucht. Offenbar kommt LdL gut bei unseren User Group-Mitgliedern an, aus Sicht der Organisation kann ich dies jedenfalls bestätigen!

.NET Bootcamp: Unit Tests

07.02.2009 16:19:54 | Alexander Groß

In ungefähr einer Woche, am 16.02.2009, findet das zweite .NET Bootcamp der .NET User Group Leipzig statt. Das Thema lautet diesmal Unit Tests und wird neben einer Einführung in das Testen auch Test-Driven Development und Behavior-Driven Development aufgreifen.

Die Organisation des Bootcamps findet wieder nach dem Konzept “Lernen durch Lehren” (LdL) statt. Das heißt, dass jeder Teilnehmer im Vorfeld zwei Fragen als “Hausaufgabe” bekommt und seine Ergebnisse während der Veranstaltung vorstellt. Ich werde die Rolle des Moderators übernehmen, Fragen klären, weitere Aspekte aufzeigen und sicher auch etwas von den Teilnehmern lernen.

Wie unser erster Testballon auf dem Gebiet LdL zum Thema .NET Framework 3.5 ist dieses Bootcamp mit 19 Teilnehmern überbucht. Offenbar kommt LdL gut bei unseren User Group-Mitgliedern an, aus Sicht der Organisation kann ich dies jedenfalls bestätigen!

Microsoft CEO Steve Ballmer im April 2009 auf Entwickler-Konferenz in Koeln

07.02.2009 14:06:10 | Kay Giza

Microsoft und Innovationen im Softwaremarkt“ ist Thema der Closing-Keynote, mit dem Steve Ballmer (Chief Executive Officer (CEO) der Microsoft Corporation) am 24. April 2009 zum „Microsoft Software Strategy Summit 2009“ nach Köln kommt. Steven A. Ballmer, Chief Executive Officer of Microsoft CorporationDie eintägige Veranstaltung richtet sich an Business- und Technologie-Entscheider softwareherstellender Unternehmen und ist aus Microsoft-Sicht das wichtigste Strategie-Event in 2009 für ISVs (Independent Software Vendor) im deutschsprachigen Raum.

Geplante Themen sind unter anderem ‘Software plus Services’, Windows Azure, Microsoft Plattform, Office Business Applications.
Weitere Informationen zu Agenda, Anmeldung und Anreise erhalten Sie auf der Website Microsoft-s3.com.

Ich werde mal schauen, ob ich eine Karte ergattern kann, hoffe es ist einer meiner Kolleginnen oder Kollegen nett zu mir :)
Die Konferenz wirkt wirklich sehr interessant auf mich, Themen wie Windows 7, OBA oder Surface interessieren mich persönlich wirklich sehr, ich denke auch den einen oder andere Softwarehersteller auch.
Natürlich kann man die Closing-Keynote von Steve Ballmer als Highlight sehen, so sehe ich es zumindest persönlich. Ich durfte Steve Ballmer schon ein paar Mal live erleben. Ehrlich gesagt ist es wirklich klasse ihn live zu erleben, sei es auf dem MVP-Summit oder bei internen Firmenveranstaltung. Objektiv betrachtet sind seine Auftritte manchmal extravertiert, aber genau das macht für mich den Reiz aus. So sehr es auch extravertiert erscheint, so bestimmt Steven A. Ballmer dennoch die Geschicke des weltweit größten Softwareherstellers und dementsprechend ist es wirklich spannend und sehr interessant, seine Meinung, sein Verständnis und seine Planungen und schlussendlich seine Ideen zu erfahren.


Mehr Informationen: Steve Ballmer auf dem Microsoft Software Strategy Summit 2009 in Köln

Weiterführende Links:




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-2009 Kay Giza. All rights reserved. Legal

Microsoft Software Strategy Summit

06.02.2009 18:42:03 | Jens Häupel

Am 24. April 2009 findet in Köln der aus Microsoft Sicht wichtigste Strategie Event im deutschsprachigen Raum für alle Softwarehersteller statt.

Der Microsoft Software Strategy Summit ist eine eintägige Veranstaltung, die speziell auf die Anforderungen und Anliegen von Softwareherstellern zugeschnitten ist. Der Summit richtet sich sowohl an Business-Entscheider wie auch an Technologie-Entscheider von softwareherstellenden Unternehmen. Die Inhalte der Veranstaltung werden exklusiv im deutschsprachigen Raum präsentiert. Geplante Themen sind unter anderem Software plus Services, Windows Azure, Microsoft Plattform, Office Business Applications.

Als Keynote Speaker wird Steve Ballmer live vor Ort sein und zum Thema Innovationen im Softwaremarkt und Microsoft sprechen.

Der Summit dient als Plattform zum gemeinsamen Austausch und Diskussion zwischen Microsoft und den Teilnehmern um zu erörtern welche Maßnahmen, Innovationen und Strategien den Erfolg des deutschen Softwaremarktes weiterhin sicherstellen können.

Weitere Informationen erhalten Sie auf der Website www.microsoft-S3.com

1und1 und Microsoft bieten dedizierten Studenten-Server inkl. Design- und Entwicklungssoftware

06.02.2009 18:13:38 | Kay Giza

Vor meinem Urlaub diese Woche habe ich mir eine kleine Liste gemacht, worüber es lohnenswert ist, zu berichten.
Da ich jetzt genügend Kraft in dieser Woche getankt habe :)

Also - richtig cool wie ich finde, für knapp 40,- Euro monatlich können Studierende jetzt einen eigenen dedizierten Server im 1&1-Rechenzentrum (und nicht von schlechten Eltern der Server ;-)) betreiben und erhalten darüber hinaus Zugang zur Microsoft-Initiative DreamSpark. DreamSpark ermöglicht den kostenlosen Download von Design- und Entwicklungssoftware wie Visual Studio 2008, Expression Studio 2 oder SQL Server 2008. Um das Angebot von 1&1 und Microsoft nutzen zu können, ist ein Freischaltcode notwendig, der unter www.1und1.info/studenten angefordert werden kann.

Link: www.1und1.info/studenten

Siehe auch:



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-2009 Kay Giza. All rights reserved. Legal

25. Multimediatreff: Flash, Flex & Silverlight – reichlich Web!

06.02.2009 11:02:24 | Oliver Scheer

Steffen Ritter und meiner einer, sind wieder auf den Multimediatreff in Köln eingeladen worden. Und freuen uns endlich mal wieder ins wunderschöne Rheinland zu dürfen.

Hier ist die offizielle Veranstaltungsankündigung. Alle sind herzlich willkommen.

“Samstag, 28. März 2009 in Köln im MediaPark

Immer häufiger sieht man sie im Alltag… RIAs. Rich Internet Applications begegnen einem im Web, als Navigationsoberfläche für Onlinebestellungen, als Auto-Konfigurator oder auch mobil, denn viele Benutzeroberflächen von Handys und Navigationssystemen wurden als RIAs entwickelt. Die Vorteile liegen klar auf der Hand – sie sind in der Regel benutzerfreundlicher als herkömmliche Webanwendungen, reagieren schneller auf Benutzereingaben und funktionieren zudem meist offline direkt beim Client.

Dieser Multimediatreff beleuchtet die populärsten Multimedia-Allrounder zur Erstellung von RIAs – Flash, Flex und Silverlight. Zudem wird gezeigt, wie schnell man eine AIR-Anwendung erstellt und wie effizient FDT als Entwicklungsumgebung zur Programmierung von größeren Flash-Projekten funktioniert. Dafür wurden die Experten der Szene eingeladen, neben Adobe und Microsoft, werden auch die Flexperten und die Powerflasher mit von der Partie sein.

Ausführliche Infos zu dieser Veranstaltung gibt es hier:
http://www.multimediatreff.de/naechstestreffen.php

ZIELGRUPPE
Die Jubiläumsveranstaltung zum 25. Multimediatreff richtet sich verstärkt an Flash/Web-Entwickler und -Designer, die sich einen Überblick der neusten Features und Technologien rund um die Erstellung von Web- und Desktop-Anwendungen mit Flash, Flex & Silverlight verschaffen möchten.

Des Weiteren werden beim Thementag mehr Pausen eingeräumt, so dass die Teilnehmer die Möglichkeit haben die Veranstaltung als Kontaktbörse zu nutzen – die Teilnehmerliste auf der Homepage vom Multimediatreff bietet alle Infos, um sich vorab über die Teilnehmer zu erkundigen. Im Foyer wird es ein kleines Rahmenprogramm geben; die Teilnehmer können hier direkt Kontakt zu Adobe, Microsoft, den Flexperten und den Powerflashern aufnehmen – zudem wird es einen Stand von WACOM und Galileo Design geben.

Wer zuvor noch bei keinem Multimediatreff dabei war, der kann sich eine der letzten Veranstaltungen komplett in Bild und Ton als Tech Talk anschauen:
http://www.galileocomputing.de/techtalks

PREIS + LEISTUNG
Die Teilnahme an dieser Veranstaltung kostet 35,- EUR und beinhaltet die Verpflegung über den ganzen Tag. So gibt es lecker belegte Brötchen, opulente Fruchtschalen und am späten Nachmittag darf man sich auf die berühmt berüchtigte Pizza-Schlacht freuen! Zudem fließen reichlich Soft-Getränke und zum Abschluss gibt es noch ein spritzig, kühles Kölsch oder je nach Belieben ein Becks.
Zudem werden einige hochwertige Preise verlost, wie beispielsweise eine FDT Enterprise Edition, eine 3-tägige Flex-Schulung, jede Menge Bücher und Video-Trainings zum Thema, so wie nette Give-Aways der Sponsoren!

ANMELDUNG
Die Vergangenheit hat gezeigt, dass die Plätze beim MMT meist schnell vergeben sind – so gilt es sich rechtzeitig anzumelden:
http://www.multimediatreff.de/reservieren.php

Team System User Group - Virtual Edition

06.02.2009 08:50:50 | Thomas Schissler

image

Die Team System User Grroup - VE ist eine virtuelle Usergroup die zwei mal im Monat ein Treffen hat in deren Rahmen Vorträge rund um das Thema Team System gehalten werden. Die Treffen finden virtuell in Second Life und über Live Meeting statt. Für Europäer ist das jeweils zweite Treffen zeitlich günstig am Samstag Nachmittag. 

Team System User Group - Virtual Edition

Neue MSDN-Seite zu Team System

06.02.2009 08:47:08 | Thomas Schissler

image

Auf MSDN gibt es einen neuen Bereich zu Team System. Die Seite ist in einer ersten Iteration veröffentlicht und wird nun kontinuierlich mit weiterem Content ergänzt. Hier sind die Inhalte wesentlich übersichtlicher aufbereitet als auf den alten Seiten. Wer also mit Team System arbeitet oder das vorhat, einfach mal vorbeischauen. Feedback zu der Seite ist sehr willkommen und kann hier abgegeben werden.

Team System Home auf MSDN

HowToCode: ErrorCodes, Exceptions, den User informieren, wenn etwas schief läuft - wie gehts?

06.02.2009 01:46:32 | Robert Mühsig

image Usereingaben validieren, durch die Businesslogik schicken, dem Nutzer evtl. Fehler wieder anzeigen - fast jedes System macht sowas, doch wie macht man es "richtig"? Definiert man Errorcodes? Was ist mit Mehrsprachigkeit? In dem Post zeige ich meine Variante und bitte auch um Feedback :)

(more…)

ShareThis

Windows 7 Versions

05.02.2009 20:12:00 | Ozgur Aytekin

Windows 7 Starter
Netbook market, can only run 3 applications at once

Windows 7 Home Basic
Limited networking, limited UI sizzle, emerging markets only

Windows 7 Home Premium
Media Center+Tablet, Limited networking, more UI sizzle

Windows 7 Professional
Corporate Version, full networking, security enhancements

Windows 7 Enterprise
Corporate Version 2, more security and workgroup features

Windows 7 Ultimate
Upgrades from Home and Professional UI and feature enhancements

…und noch mehr Silverlight Controls

04.02.2009 19:46:00 | Steffen Ritter

Oha, scheint so als hätte ich mir meine Recherche zu Silverlight Charting Controls sparen können, denn Kollege Tim Heuer hat bereits fünf Tage vorher eine beeindruckend lange Liste mit Silverlight Controls for Developers in seinem Blog veröffentlicht: http://timheuer.com/blog/archive/2009/01/28/comprehensive-list-of-silverlight-controls.aspx

Wie installiere ich das SQL Server Management Studio Basic?

04.02.2009 17:14:13 | Lars Keller

Dieser Post ist ein Reminder an mich selbst, da ich gerade lange nach einer Möglichkeit gesucht habe, das SQL Server Management Studio Basic nach zu installieren. Was in meiner Situation nicht ging!

Ich hatte einen SQL Server 2008 Express installiert und dachte dass man das SQL Server Management Studio separat runterladen muss. Nein dem ist nicht so! Es gibt 3 verschiedene SQL Server 2008 Express Varianten:

  1. SQL Server 2008 Express
    SQL Server database engine - create, store, update and retrieve your data
  2. SQL Server 2008 Express with Tools
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
  3. SQL Server 2008 Express with Advanced Services
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
    Full-text Search - powerful, high-speed engine for searching text-intensive data
    Reporting Services - integrated report creation and design environment to create reports

Wie man dem entnehmen kann, dachte ich, lade ich fix die Variante 2 runter und füge das Management Studio hinzu. Das geht leider nicht. Ich musste erst den kompletten SQL Server 2008 Express deinstallieren, um dann die andere Variante neu zu installieren.

Ich würde sagen, da hat jemand richtig mitgedacht!



This weblog is sponsored by netcreate OHG.

Wie installiere ich das SQL Server Management Studio Basic?

04.02.2009 16:14:13 | Lars Keller

Dieser Post ist ein Reminder an mich selbst, da ich gerade lange nach einer Möglichkeit gesucht habe, das SQL Server Management Studio Basic nach zu installieren. Was in meiner Situation nicht ging!

Ich hatte einen SQL Server 2008 Express installiert und dachte dass man das SQL Server Management Studio separat runterladen muss. Nein dem ist nicht so! Es gibt 3 verschiedene SQL Server 2008 Express Varianten:

  1. SQL Server 2008 Express
    SQL Server database engine - create, store, update and retrieve your data
  2. SQL Server 2008 Express with Tools
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
  3. SQL Server 2008 Express with Advanced Services
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
    Full-text Search - powerful, high-speed engine for searching text-intensive data
    Reporting Services - integrated report creation and design environment to create reports

Wie man dem entnehmen kann, dachte ich, lade ich fix die Variante 2 runter und füge das Management Studio hinzu. Das geht leider nicht. Ich musste erst den kompletten SQL Server 2008 Express deinstallieren, um dann die andere Variante neu zu installieren.

Ich würde sagen, da hat jemand richtig mitgedacht!

To everyone trying to reach me via the contact form…

04.02.2009 16:04:38 | Andre Loker

Due to some changes on my mail server no mails sent throught the contact form have reached me. So if you used the contact form lately (e.g. to ask about ReSharper evaluation licenses or coupons), please try again. Sorry for the inconvenience!

Increment your Assembly Versions using Team Build

04.02.2009 13:26:23 | Christian Binder

Some time ago I have written a walkthrough how to increment your Assembly Versions using Team Build,  this blog post is quite popluar but only in German :-( Due to the lack of time, you might know this situation) But Christian Jacob enhanced and translated it on his Blog, which is great. So thx to Christian for doing so :-)

Chris

Neuer Artikel beim dot.net magazin: "AOP mit dem ASP.NET MVC-Framework"

04.02.2009 13:00:00 | Gregor Biswanger

In der neuen Ausgabe vom dot.net magazin gibt es einen neuen Artikel meinerseits:

Den Überblick behalten - Aspektorientierte Programmierung mit dem ASP.NET MVC-Framework

Die aspektorientierte Programmierung (AOP) hat in der .NET-Softwarearchitektur einen hervorragenden Platz gefunden. AOP hilft, wichtige Funktionen wie Logging oder Caching zentraler zu verwalten, der Code wird dadurch modularer und leichter wartbar. Wir stellen einige neue Filter für das ASP.NET MVCFramework vor, die als Aspekte fungieren.



Zu lesen sind die Artikel beim dot.net magazin, Ausgabe 03/2009.

Wie installiere ich das SQL Server Management Studio Basic?

04.02.2009 07:14:01 | Lars Keller

Dieser Post ist ein Reminder an mich selbst, da ich gerade lange nach einer Möglichkeit gesucht habe, das SQL Server Management Studio Basic nach zu installieren. Was in meiner Situation nicht ging!

Ich hatte einen SQL Server 2008 Express installiert und dachte dass man das SQL Server Management Studio separat runterladen muss. Nein dem ist nicht so! Es gibt 3 verschiedene SQL Server 2008 Express Varianten:

  1. SQL Server 2008 Express
    SQL Server database engine - create, store, update and retrieve your data
  2. SQL Server 2008 Express with Tools
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
  3. SQL Server 2008 Express with Advanced Services
    SQL Server database engine - create, store, update and retrieve your data
    SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
    Full-text Search - powerful, high-speed engine for searching text-intensive data
    Reporting Services - integrated report creation and design environment to create reports

Wie man dem entnehmen kann, dachte ich, lade ich fix die Variante 2 runter und füge das Management Studio hinzu. Das geht leider nicht. Ich musste erst den kompletten SQL Server 2008 Express deinstallieren, um dann die andere Variante neu zu installieren.

Ich würde sagen, da hat jemand richtig mitgedacht!

Artikel: WPF Erneuert

04.02.2009 06:40:04 | Norbert Eder

In der aktuellen Ausgabe 02/09 des Magazins Visual Studio One befindet sich wieder ein Artikel von mir. WPF erneuert Das Service Pack 1 zum .NET Framework 3.5 wurde vor kurzem veröffentlicht, und damit kam eine ganze Reihe an Veränderungen auf den .NET-Entwickler zu. Auch die Windows Presentation Foundation (WPF) ist von Änderungen...

Ohne Lautsprecher keine Videos unter Windows 7 Media Center

03.02.2009 21:32:00 | Michael Schwarz

Wow, da staunte ich nicht schlecht, als ich vor ein paar Tagen feststellen musste, dass ohne Lautsprecher unter Windows 7 im Windows Media Center keine Videos abgespielt werden konnten. Im Büro haben wir nur vereinzelt Lautsprecher, an dem Test PC mit Windows 7 war gerade keiner dran.

Windows 7 erkennt, ob Lautsprecher am PC angeschlossen sind oder nicht. Das funktioniert auch mit intern bereits eingebauten Lautsprechern.

Ich meine, dass man dann aber trotzdem in der Lage sein sollte, die Videos abspielen zu können. Was ist mit all den Menschen, die taub sind, und auch mit Lautsprecher nichts hören?

Wer bei Microsoft Connect registriert ist, kann mit abstimmen.

Hier noch ein paar weitere meiner Bugs bzw. anders gewünschte Verhalten in der derzeitigen Beta von Windows 7:


Bundesministerium für Bildung und Forschung setzt auf Silverlight 2

03.02.2009 19:21:11 | Oliver Scheer

Die Firma Visual Bridges hat für das Bundesministerium für Bildung und Forschung einen interaktiven Player für diverse Themen aus dem Bereich der „Zukunft der Biotechnologie“ bereitgestellt.

Darin werden für verschiedene Standort verschiedene Themen mithilfe eines interaktiven Players dargestellt.

Mehr Informationen und die Player gibt es hier:

http://www.biotechnologie.de/BIO/Navigation/DE/ausbildung,did=84162.html

Heise hat ebenfalls schon drüber berichtet:

http://www.heise.de/newsticker/Filme-interaktiv-mit-Microsoft-Silverlight-Technik--/meldung/126669

Adroid Handy in Deutschland – Das T-Mobile G1 ist da!

03.02.2009 16:03:00 | Michael Schwarz

Man kann es nicht übersehen: das G1 Handy ist nun auch in Deutschland erhältlich, aber ist es eine Alternative zum iPhone, oder zu anderen Handys (Symbian, Windows Mobile,…)?

image


Morgen: Treffen der .NET User Group Dresden

03.02.2009 15:24:58 | Robert Mühsig

Morgen trifft sich die .NET User Group Dresden in der HTW Dresden. Wer den Termin noch nicht kannte, sei hiermit herzlich eingeladen. Alle Details und die Teilnehmerliste findet man auf der Homepage.

image

(more…)

ShareThis

Adobe Illustrator zu XAML – neue Version des kostenlosen Plug-Ins

03.02.2009 09:40:00 | Steffen Ritter

Kaum bin ich entnervt nach fast zwei Stunden Stau endlich im Office angelangt, schon heitert mich mein Kollege Oliver Scheer mit einer wunderbaren Nachricht wieder auf: Eine neue Version von Mike Swansons XAML-Plug-In für Adobe Illustrator ist ab sofort verfügbar.

Die drei wichtigsten Verbesserungen schnell in aller Kürze bevor es zum nächsten Meeting geht (denn das ist einfach zu gut um es aufzuschieben):

  • Ein nerviges Fehlverhalten im Zusammenhang mit Pfadgeometrie und Silverlight 2 wurde behoben; betroffene XAML-Dokumente sollten nun problemlos und direkt zu Blend 2 exportiert werden können.
  • Die unnötig akkurate Genauigkeit der Vektordaten im exportieren XAML wurde heruntergeschraubt, was die Dateigröße der XAML-Dateien drastisch verringert (teilweise um 15% oder mehr).
  • Eine dritte kleine, aber angenehme Verbesserung ist dass die Exportformate umbenannt wurden und daher im Dialog besser zu erkennen sind und nebeneinander angezeigt werden.

Das Plug-In funktioniert mit allen halbwegs aktuellen Versionen von Adobe Illustrator für Windows inkl. CS4.

Weitere Infos und Download des Adobe Illustrator XAML Plug-Ins direkt in Mike Swansons Blog: http://blogs.msdn.com/mswanson/archive/2009/01/31/updated-adobe-illustrator-to-xaml-plug-in.aspx

TeamConf 2009

03.02.2009 09:07:39 | Oliver Scheer

es ist wieder soweit: vom 05.-07. Mai 2009 findet in München zum 2.Mal die TeamConf statt – die Konferenz rund um Visual Studio Team System (www.teamconf.de)

Für wen ist die TeamConf relevant?

  • Alle, die bereits mit VSTS arbeiten – um sich mit anderen Anwendern auszutauschen und um Einblicke in VSTS 2010 zu gewinnen
  • Alle, die VSTS evaluieren – um von den Erfahrungen & Best Practices anderer zu lernen und um eine Entscheidung für VSTS zu fällen
  • Alle, die an VSTS interessiert sind – um sich komprimiert über aller Vorteile und Einsatzszenarien von VSTS zu informieren

Format: 2-tägige kostenpflichtige Konferenz mit 1 Tag Pre-Konferenz für Workshops

  • Anwenderberichte: Unternehmen berichten über Ihre Erfahrung mit VSTS, dieses Jahr u.a. dabei:
    Arvato, AutoScout 24, HVB, Landesbank Baden-Württemberg, Siemens AG, Polizeipräsidium Oberbayern, T-Systems
  • Fachvorträge: lösungsorientierte Szenarien und Best Practices mit Visual Studio Team System vorgestellt als auch Methodiken des modernen Software Engineerings
  • Technologiebeiträge: technische Details einzelner Funktionsbereiche von Visual Studio Team System
  • Keynotes: Ken Schwaber („Erfinder“ von SCUM), Cameron Skinner (Microsoft Product Unit Manager VSTS)
  • Workshops: technisch umfassende Halbtages- und Ganztagesworkshops, u.a. zu den Themen
    • SharePoint als Entwicklungsplattform, UML, TFS in der Praxis
  • Tutorial: Microsoft Software plus Services Strategie

Mehr Informationen gibt es hier: http://www.teamconf.de/

HowTo: Einstieg in Windows Azure CTP und erstes HelloWorld

03.02.2009 00:49:34 | Robert Mühsig

imageIn einem letzten Blogpost habe ich über Cloud Computing im Allgemeinen geschrieben.

Darin hab ich bereits etwas über die Windows Azure Plattform gesprochen und möchte nun eine "Hello World" Anwendung auf Windows Azure erstellen.

(more…)

ShareThis

Professionelle Charting Controls für Silverlight

02.02.2009 15:42:11 | Steffen Ritter

Microsoft (und ganz besonders .NET) hat ja traditionell eine starke Position im Bereich Enterprise-Anwendungen und hier wird auch schon immer häufiger auf Silverlight als Visualisierung für professionelle Business-Dashboards, SAP-Frontends und Intranetlösungen gesetzt. Das ist nicht verwunderlich, schließlich ist Microsoft der einzige Anbieter, der einen durchgängigen Stack vom plattformübergreifenden Frontend in Silverlight bis hin zum dicken Serverbackend und Datenbank aus einer Hand liefern kann. Für jeden Projektmanager natürlich ein absolutes Killerargument (im positiven Sinne), denn dadurch werden die meisten “Sollbruchstellen” eliminiert, die sonst entstehen wenn Datenbank, Server, Frontend und Middleware von verschiedenen Anbietern stammen. Das macht nicht nur die Entwickler glücklich (deutlich geringerer Zeitaufwand und Probleme), sondern auch die Controller/Buchhaltung (weil die Kosten spürbar niedriger ausfallen und zudem besser planbar sind).

Allerdings scheinen viele der ganzen glücklichen Programmierer die Zeit nicht allzu gerne mit Recherche nach fertigen Controls speziell für die Visualisierung und Aufbereitung von Unternehmensdaten zu verbringen – oder wie sonst soll ich mir die häufigen Fragen nach guten professionellen Controls erklären?

Um dem ein wenig abzuhelfen habe ich eine kurze und natürlich unvollständige Liste guter Controls speziell aus dem Bereich Charting und Data Visualisierung zusammengestellt. Teilweise Kostenlos oder sogar Open Source, teilweise kommerziell.

Wie gesagt, diese Liste ist unvollständig und in keinster Weise eine Wertung dieser Controls, oder gar eine Abwertung von Controls die ich übersehen habe. Weitere gibt es übrigens auch auf der Silverlight-Homepage: www.silverlight.net/showcase 

Wie auch immer, hier meine Übersicht Silverlight-Controls für Charting und Datenvisualisierung:

clip_image001[5]

Kommerzielle 3rd Party Charting Controls, teilweise kostenlos, teilweise kostenpflichtig: http://demos.telerik.com/silverlight/#Home

clip_image001[7] Kostenlose aber recht gelungene Open-Source-Charting-Controls: http://www.codeplex.com/FreeSilverlightChart
clip_image001[9] Kommerzielle 3rd Party Charting Controls, teilweise kostenlos, teilweise kostenpflichtig: http://www.infragistics.com/hot/silverlight/xamwebchart.aspx#xamWebGauge
clip_image001[11] Kommerzielle 3rd Party Charting Controls, teilweise kostenlos, teilweise kostenpflichtig: http://www.componentone.com/SuperProducts/ChartSilverlight/
clip_image001[13] Kostenlose aber recht gelungene Open-Source-Charting-Controls: http://www.codeplex.com/Silverlight/Wiki/View.aspx?title=Silverlight%20Toolkit%20Overview%20Part%202&referringTitle=Home
clip_image001[15] Recht gelungene Open-Source-Charting-Controls: http://www.visifire.com/
image

Open Source Charts im Silverlight Toolkit:

http://www.codeplex.com/Silverlight

Erfrischende Präsentation zum Thema “Wissensmanagement im Enterprise 2.0”

02.02.2009 10:48:45 | Lars Keller

Die Präsentation “Wissensmanagement im Enterprise 2.0 - Der Wikipedia Irrtum” diskutiert den Einfluss von Social Software in betrieblichen Prozessen. Auf sehr erfrischende und humorvolle Art wird das Thema aufbereitet und die Entwicklung von Wissensmanagement aufgezeigt. Die Präsentation besteht aus drei Teilen. Zwei davon sind mittlerweile veröffentlicht.

In Teil 2 geht es wie der Titel schon andeutet um den Menschen an sich und wie dieser mit der Hilfe von Social Software sein Wissen vernetzt.

Update: Teil 3 ist Online.

Links:



This weblog is sponsored by netcreate OHG.

3-2-1, Start: IE8 RC1 ist da… (Hilfreiche Infos für Webdeveloper)

02.02.2009 10:01:59 | Steffen Ritter

Ein wahres Neuigkeiten-Feuerwerk im Internet Explorer Developer Center: Nahe an der Fertigstellung ist der Internet Explorer 8 mit dem „Release Candidate 1“, der jetzt in 25 Sprachen zum Download für Windows Vista, Windows XP ab Service Pack 2 sowie für Windows Server 2003 und 2008 zur Verfügung steht (meine vielgeliebte Betaversion von Windows 7 braucht den RC1 nicht, dort ist bereits eine andere Version integriert). Im IEBlog finden Sie eine umfassende Zusammenfassung von Upgrade- und Installationshinweisen für die neue Vorabversion des Internet Explorers. Die englischsprachige IE8 Beta-Newsgroup steht für den Erfahrungsaustausch bereit. Gleichzeitig wird auch das Internet Explorer Administration Kit (IEAK) in Kürze auf Deutsch verfügbar sein.

Wichtige Infos für Webentwickler: Ist Ihre Webseite IE8-kompatibel?
Internet Explorer 8 hält sich konsequenter an Standards als seine Vorgänger. Seiten, die bisher spezifisch auf eine ältere Version des Internet Explorer angepasst waren, müssen dennoch nicht zwingend neu konzeptioniert und erstellt werden: Mithilfe von einfachen Meta-Tags auf Ihren Seiten oder durch benutzerdefinierte HTTP-Antwortheader auf dem Webserver (etwa mit IIS oder Apache) können Sie IE8 von einer rückwärtskompatiblen Darstellung Ihrer Seiten überzeugen. Lesen Sie auch den MSDN Library-Artikel „Wie bereite ich meine Website noch heute vor?“.

Kompatibilitätsansicht-Update für Internet Explorer 8
Mithilfe dieses Updates kann die Darstellung von Websites, die für ältere Browser entwickelt wurden, in Internet Explorer 8 verbessert werden. Um das Update nutzen zu können, muss die Option „Aktualisierte Websitelisten von Microsoft einbeziehen“ in den Einstellungen der Kompatibilitätsansicht von IE8 aktiviert sein.

Video: Was ist neu im Internet Explorer 8?
In diesem aufgezeichneten Vortrag auf dem Daniel Melanchthon, Security Evangelist bei Microsoft Deutschland, Ihnen einen Einblick in die Neuerungen von Internet Explorer 8. Noch in der Entwicklung befindlich, bietet die neue Version im Vergleich zu seinen Vorgängern eine deutlich verbesserte Unterstützung von Standards und erhöhte Interoperabilität. Sie enthält Entwicklertools, um in einer visuellen Umgebung schneller Fehler in HTML, CSS und Scripts zu finden. Schnellinfos, Thematische Suche, WebSlices und Vorgeschlagene Sites geben Benutzern neue Möglichkeiten beim Browsen durch das Web.

Änderungsverfolgung mit den ADO.NET Data Services

02.02.2009 09:54:07 | Oliver Scheer

Seit einigen Tagen ist ein neuer Codeclip in unserer MSDN Solve Serie verfügbar. Sehr interessant.

Auszug aus dem Abstrakt:

“Wie kann ich mit ADO.NET Data Services Änderungsverfolgung realisieren und Datenkonflikte lösen?

Änderungen an Objekten eines DataContexts müssen dem Context mitgeteilt werden. Nicht immer lässt sich feststellen, wann Änderungen an Eigenschaften eines Objekts vorgenommen wurden; beispielsweise, wenn das Objekt an ein DataGrid gebunden ist. In diesem CodeClip wird erklärt, wie eine Änderungsverfolgung mit den ADO.NET Data Services realisiert werden kann. Wenn mehrere Clients zeitgleich auf denselben Datenbestand zugreifen, kann es passieren, dass der eine Änderungen des anderen zufällig überschreibt. In diesem CodeClip wird ebenfalls gezeigt, was ADO.NET Data Services bietet um solche Konflikte zu erkennen, und eine Möglichkeit vorgestellt Konflikte mit Optimistic Concurrency zu lösen.”

Mehr Informationen gibt es hier:
http://www.microsoft.com/germany/msdn/solve/codeclips/library.aspx?id=msdn_de_31212

Erfrischende Präsentation zum Thema “Wissensmanagement im Enterprise 2.0”

02.02.2009 09:48:45 | Lars Keller

Die Präsentation “Wissensmanagement im Enterprise 2.0 - Der Wikipedia Irrtum” diskutiert den Einfluss von Social Software in betrieblichen Prozessen. Auf sehr erfrischende und humorvolle Art wird das Thema aufbereitet und die Entwicklung von Wissensmanagement aufgezeigt. Die Präsentation besteht aus drei Teilen. Zwei davon sind mittlerweile veröffentlicht.

In Teil 2 geht es wie der Titel schon andeutet um den Menschen an sich und wie dieser mit der Hilfe von Social Software sein Wissen vernetzt.

Update: Teil 3 ist Online.

Links:

Erfrischende Präsentation zum Thema “Wissensmanagement im Enterprise 2.0”

02.02.2009 00:48:04 | Lars Keller

Die Präsentation “Wissensmanagement im Enterprise 2.0 - Der Wikipedia Irrtum” diskutiert den Einfluss von Social Software in betrieblichen Prozessen. Auf sehr erfrischende und humorvolle Art wird das Thema aufbereitet und die Entwicklung von Wissensmanagement aufgezeigt. Die Präsentation besteht aus drei Teilen. Zwei davon sind mittlerweile veröffentlicht.

In Teil 2 geht es wie der Titel schon andeutet um den Menschen an sich und wie dieser mit der Hilfe von Social Software sein Wissen vernetzt.

Update: Teil 3 ist Online.

Links:

Soundless Mountain II, ein fantastisches Demake von Silent Hill 2

01.02.2009 12:17:00 | Steffen Ritter

Auch wenn es thematisch nicht unbedingt in mein Blog passt, ich bin schlichtweg zu begeistert um zu schweigen: Ein kleines Indie-Studio namens Superflat Games hat ein fantastisches Demake des möglicherweise besten Survival Horror Spiels aller Zeiten herausgebracht: Soundless Mountain II, eine pseudo-NES-Umsetzung des Klassikers Silent Hill 2 (läuft unter Windows und Mac OS X).

soundlm3a

Das bringt Erinnerungen an den Beginn des jungen Jahrtausends zurück; wer mich kennt weiß dass ich nicht nur ein großer Fan der Silent Hill-Reihe bin/war, sondern auch zwei wissenschaftliche (?) Arbeiten dazu veröffentlicht habe: 

Anyway, genug literarische Vergangenheitsbewältigung und Ego-Tripping für heute. Ich mache mich wieder auf die Suche nach Kate in Soundless Mountain II…

Zum Download von Soundless Mountain II (Win/Mac).

Die Forderung nach Softwarequalität

01.02.2009 09:37:00 | Peter Bucher

Am 13. Oktober 2008 haben Golo Roden und ich unter dem Titel Noch Fragen, Roden? Ja, Bucher! angekündigt, jeweils zum ersten eines jeden Monats einen Kommentar zu einem vorab gemeinsam gewählten Thema verfassen zu wollen. Bisher sind in dieser Reihe folgende Kommentare erschienen:

Heute, am 1. Februar 2009, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

Die Forderung nach Softwarequalität

Zum Blogpost von Golo gehts hier lang: Die Forderung nach Softwarequalität

In früheren Blogeintrag habe ich über das Thema “Perfektes Design” geschrieben und damit eine weitreichende Diskussion ausgelöst.
Auf myCSharp.de wurde letztens mit dem Titel “Alltag in unserer Branche (?)” darüber diskutiert, wie die Entwickler die Qualität der Softwareentwicklung im Alltag erleben, oder eben nicht.

Für mich ist es extrem wichtig, dass ich meinen Stil und die Qualität meiner Arbeit / Software – egal ob privat oder im Geschäft – stetig steigern kann.

Was mache ich dafür?

  • Beschäftigung mit Design Patterns
  • Beschäftigung mit Architektur
  • Mich über diverse relevanten Themen informieren und viel ausprobieren
  • Viel fremden Code lesen
  • Viel lesen und schreiben

Die Beschäftigung mit den Themen “Design Patterns” und “Architektur” führen zu sehr vielen interessanten Erkentnissen, die mir vorher nicht bewusst waren und steigern die Qualität des Codes immens.

Zu den relevanten Themen zählen für mich unter anderem die N schichtige Architektur, IoC (Inversion of Control) / Dependency Injection, Software Testing und Coding Styles.

Lesen alleine hilft leider nicht soviel wie es sollte, Abhilfe schafft hier das praktische Anwenden.
Beispielsweise habe ich die neu entdeckten Themen direkt auf meine Homepage angewendet und verwende dort eine mehrschichte Architektur mit einem IoC Container und – zumindest ein paar – Unit Tests.

Ich war ziemlich schnell begeistert von diesen neuen Themen und die Umsetzung war auch nicht extrem schwierig, es hat jedoch Zeit gekostet.

Aber: Diese Zeit hat sich gelohnt!

Was hat es schlussendlich gebracht die neuen Techniken in meine Homepage zu implementieren?
Nach aussen hin nicht viel, aber ich habe viel dazu gelernt und eine Erweiterung / Änderung ist um einiges einfacher und flexibler durchzuführen und nicht zuletzt ist der Code auch verständlicher geworden und die möglichen Fehler haben sich minimiert.

Das waren jetzt meine Interessen und mein privates Umfeld.

Wie erlebt man denn die Softwarequalität im Arbeitsumfeld?

Vielfach ist es so, dass dort noch Altlasten vorhanden sind, die Architektur nicht (mehr) optimal ist.
Dies kann zukünftig geplante Features hinauszögern, die Entwicklung (vorallem die Veränderung an bestehendem) verlangsamen und noch einiges mehr.

Kann sich ein Entwickler am Arbeitsplatz voll entfalten und seine Erfahrungen ganz einbringen?

Ich denke: In den den meisten Fällen wird das nicht möglich sein, ausser es ist eine frische Firma mit der richtigen Einstellung und Führung, sowie interessierten und erfahrenen Mitarbeitern.

Quellcodeverwaltung ist im komerziellen Umfeld sowieso Pflicht, aber was ist hiermit:

  • Code Richtlinien fürs Team
  • Die Pflicht für Kommentare (Vorher wird nicht eingecheckt)
  • Prüfung dass der Code kompiliert (dito)
  • Unit Testing
  • UI Tests
  • Code Reviews
  • Evt. sogar einen Ansatz zum Pair Programming
  • Weiterbildungen der Entwickler

Okay, das ist jetzt vielleicht zuviel verlangt aber vielerorts gibt es Firmen wo nicht einmal einen Punkt ansatzweise umgesetzt wird, das ist schade.

Code Richtlinien führen zur besseren Lesbarkeit, besserer Wartung und Konsistenz im Code.
Pflicht für Kommentare (Damit sind im .NET-Umfeld vorallem XML-Kommentare gemeint) machen es um einiges einfacher für einen neuen Entwickler, sich in ein Projekt einzuarbeiten und APIs zu benutzen.
Zudem kann so sehr einfach eine API-Referenz generiert werden.

Ist es sinnvoll Code einzuchecken der nicht kompiliert? Ich sage: Nein!
Wenn es Feierabend ist und der Code partout nicht kompiliert kann man ihn einshelven (TFS), oder an einen anderen Ort einchecken, aber nicht zur richtigen Quellcodeverwaltung.

Wie oben geschrieben, habe ich mich erst seit kurzem mit dem Thema Testing befasst, nichts desto trotz sehe ich schon jetzt extrem viel Sinn im Testing und würde nicht mehr ohne wollen.

Unit Tests sowie auch UI Tests helfen dem Entwickler und auch der Qualitätssicherung (Wenns sowas gibt) automatisiert nach Änderungen zu prüfen ob ein Code an einer anderen Stelle negativen / ungewollten Einfluss nimmt, bzw. den Workflow stört.
Ohne Tests müssten sehr viele Fälle manuell getestet werden, was nicht praktikabel / durchführbar und mühsam ist.
Da wird sehr gerne irgend ein Fall vergessen (davon gibt es ja genug), es wird nur beiläuftig getestet oder die Entwickler verlieren Tage mit debuggen und sich wiederholenden, langsamen Oberflächentests.

Zu Code Reviews habe ich bisher auch nicht so viel Erfahrungen, aber mit der Erfahrung die ich bisher sammeln konnte bin ich überzeugt davon, dass dies die Qualität und vorallem auch die eigene Arbeitsweise extrem ins positive gesteigert werden kann.

Seit mehr als einem Monat arbeite ich mit Golo Roden an einem relativ kleinen Projekt mit ASP.NET.
Relativ klein in dem Sinne, dass das Projekt schon längst fertig sein könnte, wenn es jemand anderes gemacht hätte. Das liegt jedoch nicht daran das Golo und ich schlecht und langsam arbeiten, sondern dass dieses Projekt auch als Übungswiese dient und auch das Ziel verfolgt die eigene Arbeitsweise und die Qualität der Software zu steigern.

Das heisst, die Software sollte schlussendlich sehr gut erweiterbar, wartbar sein und es sollte auch Spass machen weiterhin daran zu arbeiten.
Dabei habe ich nicht nur gemerkt das Golo und ich uns perfekt ergänzen, sondern auch dass es sehr, sehr positiv ist wenn der zweite Spieler auf dem Feld auch auf eigene Fehler oder Unsauberkeiten hinweist und meistens schon Verbesserngsvorschläge bringt. Synergie heisst hier das Zauberwort und sehr viel ist nicht dazu nötig, jedoch ist der Ertrag immens.

Aus diesem Grunde habe ich “Ansatz zu Pair Programming” geschrieben. Es muss ja nicht so sein, dass das Paar nebeneinander sitzen und sich die längste Zeit auf die Finger schauen muss.
Sondern dass es die längste Zeit Reviews mit Feedback gibt und ab und zu auch miteinander geredet (In unserem Fall telefoniert) wird, um Gedanken 1:1 auszutauschen.
Es braucht Zeit zu lernen, es braucht auch Zeit richtig zu lernen wie es auch Zeit und Geld braucht sich im Rahmen der Firma weiterzubilden – aber es lohnt sich auf jeden Fall.

Die Wahl zur Informatik bedeutet in jedem Fall den Willen zum stetigen Lernen zu haben und das auch umzusetzen.
Wenn dies nicht vorhanden ist, ist die Informatik nicht der richtige Platz, ausser die Zeit bleibt stehen (was sie ja bekanntlich nicht tut ;-)).

Ich würde aufgrund meinen Erfahrungen in diesem Gebiet dazu raten am Arbeitsplatz nicht zu resignieren, sondern seine Arbeit nach bestem Gewissen durchzuführen.
Wenn man Glück hat, können auch obere Etagen davon überzeugt werden, die Qualität – im Interesse aller in der Firma, sowie auch den Kunden – der Software zu steigern und einen guten Stil in die Arbeit einzubringen.

Zuletzt will ich noch die Initiative von Ralf Westphal und Stefan Lieser erwähnen, die sich mit oben genannten Themen beschäftigt und Prinzipien / Regeln zu einem saubereren Code immer wieder ins Gedächnis rufen soll: http://clean-code-developer.de/

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum