.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Januar 2010

TDD – Log-In-Scenario mit einem Membership Provider

31.01.2010 17:43:00 | Gregor Biswanger

ASP.NET bietet mit dem Membership Provider eine eigene Lösung für eine Authentifizierung. Nun Verlangen die Anforderungen der späteren Web-Anwendung eine Authentifizierung, wobei dafür ein LogIn-Service selbst geschrieben werden muss, der mit dem Membership Provider kommuniziert. Wenn das Scenario nun mit TDD aufgebaut werden soll, muss automatisch ein Integrationstest folgen. Dazu muss ein Unit-Test auch auf den Membership-Provider zugreifen können. Dazu gibt es zwei Probleme. Zum ersten werden Unit-Tests nicht auf Web-Ebene ausgeführt und zum zweiten wird der Log-In-Service auch nicht in einem Web-Projekt erzeugt. Dieser wird in der Infrastructur-Schicht für alle anderen Schichten auch zur Verfügung gestellt.

Folgender Source-Code zeigt einen fertigen Unit-Test für einen Log-In-Service:

   1: using System.Collections.Specialized;
   2: using System.Web.Security;
   3: using MembershipExample.Infrastructure.Entities;
   4: using MembershipExample.Infrastructure.Services;
   5: using NUnit.Framework;
   6:  
   7: namespace MembershipUnitTestExample
   8: {
   9:     [TestFixture]
  10:     public class LogInServiceTest
  11:     {
  12:         private const string Username = "Testuser";
  13:         private const string Password = "Test123!";
  14:         private const string Email = "Testuser@noname.de";
  15:  
  16:         [SetUp]
  17:         public void SetUp()
  18:         {
  19:             MyMembershipProvider provider = new MyMembershipProvider();
  20:  
  21:             NameValueCollection config = new NameValueCollection();
  22:             config.Add("applicationName", "MyProvider");
  23:             config.Add("name", "MyMembershipProvider" );
  24:             config.Add("requiresQuestionAndAnswer", "false");
  25:             config.Add("connectionStringName", "MyProviderConnectionString");
  26:  
  27:             provider.Initialize(config["name"], config);
  28:  
  29:             MembershipCreateStatus createStatus;
  30:             provider.CreateUser(Username, Password, Email, null, null, true, null, out createStatus);
  31:         }
  32:  
  33:         [TearDown]
  34:         public void TearDown()
  35:         {
  36:             MyMembershipProvider provider = new MyMembershipProvider();
  37:  
  38:             NameValueCollection config = new NameValueCollection();
  39:             config.Add("applicationName", "MyProvider");
  40:             config.Add("name", "MyMembershipProvider");
  41:             config.Add("requiresQuestionAndAnswer", "false");
  42:             config.Add("connectionStringName", "MyProviderConnectionString");
  43:  
  44:             provider.Initialize(config["name"], config);
  45:  
  46:             provider.DeleteUser(Username, true);
  47:         }
  48:  
  49:         [Test]
  50:         public void User_is_authenticated()
  51:         {
  52:             // Arrange
  53:             UserAccount userAccount = new UserAccount();
  54:             userAccount.Name = Username;
  55:             userAccount.Password = Password;
  56:  
  57:             // Act
  58:             bool result = LogInService.IsUserAuthenticated(userAccount);
  59:  
  60:             // Assert
  61:             Assert.IsNotNull(result);
  62:             Assert.IsTrue(result);
  63:             Assert.IsTrue(Membership.ValidateUser(userAccount.Name, userAccount.Password));
  64:         }
  65:  
  66:         [Test]
  67:         public void User_is_not_authenticated()
  68:         {
  69:             // Arrange
  70:             UserAccount userAccount = new UserAccount();
  71:             userAccount.Name = "WrongName";
  72:             userAccount.Password = "NotRight!";
  73:  
  74:             // Act
  75:             bool result = LogInService.IsUserAuthenticated(userAccount);
  76:  
  77:             // Assert
  78:             Assert.IsNotNull(result);
  79:             Assert.IsFalse(result);
  80:             Assert.IsFalse(Membership.ValidateUser(userAccount.Name, userAccount.Password));
  81:         }
  82:     }
  83: }

 

Mit SetUp und TearDown wird ein Testbenutzer im Membership-Provider vor jeder Test-Methode abgelegt und anschließend wieder entfernt. Um auf den Membership-Provider zugreifen zu können müssen folgende Assemblies referenziert werden: „system.web“ und „system.configuration“. Damit überhaupt eine Instanz auf den Provider stattfinden kann, wird noch eine App.config-Datei mit einem Connection-String und der Zuweisung eines selbst geschriebenen Providers benötigt.

Folgender Source-Code zeigt die App.Config-Datei:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <connectionStrings>
   4:     <add name="MyProviderConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Users\Gregor.Biswanger\Documents\Visual Studio 2008\Projects\MembershipUnitTestExample\MembershipUnitTestExample\App_Data\ASPNETDB.MDF';Integrated Security=True;User Instance=True"/>
   5:   </connectionStrings>
   6:  
   7:   <system.web>
   8:  
   9:     <membership defaultProvider="MyMembershipProvider">
  10:       <providers>
  11:         <remove name="AspNetSqlMembershipProvider"/>
  12:  
  13:         <add applicationName="MyProvider" 
  14:              requiresQuestionAndAnswer="false"
  15:              requiresUniqueEmail="false" 
  16:              minRequiredNonalphanumericCharacters="0"
  17:              enablePasswordReset="true" 
  18:              passwordFormat="Hashed" 
  19:              connectionStringName="MyProviderConnectionString"
  20:              name="MyMembershipProvider" 
  21:              type="MembershipExample.Infrastructure.Services.MyMembershipProvider,MembershipExample.Infrastructure" />
  22:  
  23:       </providers>
  24:     </membership>
  25:   </system.web>
  26: </configuration>

 

Nun ist der Test fertig geschrieben und die Klassen LogInService und MyMembershipProvider müssen in eine eigene Schicht: „MembershipExample.Infrastructure“. Die LogInService-Klasse bekommt eine Statische Methode „public static bool IsUserAuthentivatet(UserAccount userAccount)“. Die MyMembershipProvider-Klasse leitet nur von der Klasse SqlMembershipProvider ab. Das war es auch schon. Nun wird noch im Web-Projekt eine Membership Datenbank (Sql Server) erzeugt. Dazu wird im Solution-Explorer die ASP.NET Configuration aufgerufen.

ASP.NET-Configuration-Wizard

Abb.1. – Die ASP.NET Configuration aufrufen.

Anschließend öffnet sich die Konfiguration im Web-Browser. Hierbei wird links vom Bildschirm auf den Link „Authentifizierungstyp auswählen“.

Websiteverwaltungs-Tool-Authentifizierungstyp

Abb.2. – Authentifizierungstyp auswählen.

Beim folgenden Bildschirm wird „Aus dem Internet“ ausgewählt. Da es später eine Formularbasierte Authentifizierung wird.

Websiteverwaltungs-Tool-Aus_dem_Internet

Abb.3. – „Aus dem Internet“ auswählen

Nach dem Fertigstellen wurde dem Web-Projekt nun eine SQL Server Datenbankdatei mit der Membership Datenbank im App_Data-Verzeichnis erzeugt. Um dies einsehen zu können, muss im Solution-Explorer auf das Icon „Show All Files“ geklickt werden. Danach wird der ASP.NET Webserver im Try-Menü beendet, damit nun die Datenbank in das Testprojekt mit demselben Verzeichnis App_Data kopiert werden kann.

App_Data_DB_kopieren

Abb.4. – Membership Datenbank kopieren

Wichtig hierbei ist, dass nun der Pfad, beim ConnectionString in der App.Config korrekt eingestellt ist. Nun kann der Test gestartet werden, der jetzt jedoch erst noch Fehlschlagen muss. Dazu dient die Exception-Klasse NotImplementedException sehr gut. Wenn dies ohne weitere Probleme funktioniert hat, kann nun der eigentliche Source-Code implementiert werden.

Implementierung des Log-In-Services:

   1: using System.Web.Security;
   2: using MembershipExample.Infrastructure.Entities;
   3:  
   4: namespace MembershipExample.Infrastructure.Services
   5: {
   6:     public class LogInService
   7:     {
   8:         public static bool IsUserAuthenticated( UserAccount userAccount )
   9:         {
  10:             return Membership.ValidateUser(userAccount.Name, userAccount.Password);
  11:         }
  12:     }
  13: }

 

Implementierung von MyMembershipProvider:

   1: using System.Web.Security;
   2: namespace MembershipExample.Infrastructure.Services
   3: {
   4:     public class MyMembershipProvider : SqlMembershipProvider
   5:     {}
   6: }

 

Fazit

Bei diesem Test handelt es sich quasi um einen Test des Membership Providers. Dennoch muss auch ein Integrationstest für den Log-In-Service geschrieben werden, wobei dieser Test dafür sehr gut geeignet ist. Das Projekt kann hier runtergeladen werden, wobei hier in der App.Config der Pfad im Connection-String angepasst werden muss.

unit-test-succeeded

Source-Code Download:

MembershipUnitTestExample.zip (575,94 kb)

Wie benutze ich das neue Office 2010 Extensibility Schema mit VSTO 4.0?

31.01.2010 09:23:00 | Lars Keller

VSTO 4.0 bietet neue Features für die MS Office 2010 Entwicklung. Damit man für die neuen Features Intellisense hat, muss das Schema ausgetauscht werden. Die nötigen Schritte habe ich hier notiert:

Wird VS 2010 Beta 2 mit z.B. einem Excel Add-In gestartet und dort eine Ribbon (XML) (nicht den Ribbon Designer) hinzugefügt, dann wird standardmäßig auf das Office 2007 Schema verlinkt. Dies lässt sich aus folgender Zeile erkennen:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">

Damit man nun Intellisense für die neuen Features hat, muss nur die Schema URL durch

http://schemas.microsoft.com/office/2009/07/customui

ausgetauscht werden. (Falls das Schema nicht erkannt wird, muss dieses noch installiert werden. Das Schema wird in dem Ordner “C:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas\1033” abgelegt und kann hier heruntergeladen werden.)

Nun können die neuen Features z.B. backstage, contextMenus, etc. ausgewählt werden.
(Die neuen Elemente stelle ich die Tage in einem eigenem Post vor.)

Die Gewinner vom dritten Snippet Wettbewerb stehen fest

30.01.2010 20:12:58 | Jan Welker

Lange hat's gedauert aber jetzt stehen die Gewinner vom dritten Snippet Wettbewerb auf dotnet-snippets.de fest.
Einen Snippet fand die Jury ganz besonders "cool", so haben wir uns entschlossen, einen Sonderpreis zu vergeben.
Wer alles gewonnen hat und was es mit dem Sonderpreis auf sich hat, ist hier zu lesen.
Herzlichen Glückwunsch allen Gewinnern und vielen Dank für das großartige Engagement beim Einreichen der Snippets an die .NET Community!

Anhand Framework Version WPF oder WinForms Anwendung starten

29.01.2010 03:43:00 | Timo Rehl

Ich habe auf http://dotnet-forum.de einen Artikel mit oben genanntem Thema verfasst. Den kompletten Artikel findet ihr hier: Artikel.

Kurzzusammenfassung:

Einleitung und Zielgruppe:
(Schwierigkeit: mittel)
Das Thema WPF oder WinForms? ist aktuell in jedem Projekt, das .NET Oberfläche bietet eine interessante Frage. Für die Projekte die es sich leisten können beides zu implementieren und anhand der installierten .NET Version dann zu entscheiden, ob WPF verwendet wird oder nicht, für die könnte dieser Artikel von Interesse sein.

Weiterhin zeigt der Artikel wie WPF oder WinForms Anwendungen programmatisch zu starten sind. Die Auswahl, welche Anwendung geladen werden soll wird mittels dem Ansatz von Microkernel und dem dynamischen Laden von Assemblies realisiert. Schaut Euch einfach den Artikel mal an ;-) ...

Euer Timo

ASP.NET Webforms Anwendungen und Ajax (Teil 1)

29.01.2010 00:51:35 | Andre Kraemer

Das man mit statischen, oder auch dyanamischen Seiten, die bei jeder Anfrage die komplette Seite neu aufbauen, heute keinen Blumentopf mehr gewinnt, dürfte jedem klar sein. Verwöhnt durch Webanwendungen wie zum Beispiel Google-Maps oder Outlook Web Access erwarten Endanwender Webanwendungen, die einen ähnlichen Bedienkomfort wie Desktop Anwendungen aufweisen.

Als Entwickler solcher Webanwendungen bringt uns dies in die Situation, dass wir unsere Entwicklungstätigkeiten nun nicht mehr rein auf den Server beschränken können, sondern auch auf dem Client aktiv werden müssen, um die hohen Erwartungen unserer Anwender zu erfüllen.

Was "auf dem Client aktiv werden" konkret bedeutet möchte ich in einer kleinen Artikelreihe in meinem Blog beantworten.

Der Client - das unbekannte Wesen

Heutzutage sind eine Reihe Ajax Frameworks verfügbar, die uns die "schmutzige" Arbeit auf dem Weg zur dynamischen Webseite abnehmen wollen. Da es meiner Meinung nach aber nie schaden kann, wenn man weiss was diese magischen Toolsets und Frameworks unter der Haube machen, werden wir heute die Ärmel hoch krempeln und die "Drecksarbeit" auf dem Client selbst erledigen.

Ehe wir los legen, sollten wir zuvor jedoch einen Blick auf die notwendigen Zutaten werfen und kurz klären, worum es sich dabei im einzelnen handelt.

  1. JavaScript

    Das J in AJAX. Eine von vielen Entwicklern zu unrecht gefürchtete und/oder belächelte Client Script Sprache ;-) Der Scriptcode wird entweder direkt in eine Seite eingebettet, oder aber in eine externe Datei ausgelagert. JavaScript wird zur Manipulation des DOM genutzt

  2. das Document Object Model (DOM) des Browsers 

    Das DOM des Browsers ist eine Schnittstelle, die den Zugriff auf das zugrundeliegende (X)HTML Dokument bereitstellt. Über das DOM habe ich die Möglichkeit, Aussehen und Struktur der einer Webseite zu verändern.

  3. das XMLHttpRequest Objekt

    Eines der Objekte des window Objekts des Browsers(zumindest in modernen Browsern. Andernfalls ein ActiveX Objekt). Es ermöglicht einem Script das Absetzen einer (asynchronen) Anfrage an einen Webserver. 

Im Überblick sieht das Zusammenspiel der drei Komponenten ungefähr so aus:

Zusammenspiel zwischen JavaScript, DOM und XMLHttpRequest

Los gehts!

Wir wissen zwar jetzt, was wir alles brauchen, allerdings fehlt immer noch die Antwort, wie die Komponenten nun genutzt werden müssen, um AJAX in die eigene Webseite zu bekommen.

Starten wir dazu mit einem kleinen und sehr einfachen Beispiel.

Wir erstellen eine einfache ASPX Seite, die aus einem Link und einem Platzhalter Bereich bestehen soll. Sobald der Anwender auf den Link klickt, soll dieser Platzhalter mit dem Inhalt einer statischen Datei, welche auf dem Server liegt, gefüllt werden.

Der zugehörige HTML Code der ASPX Seite sieht wie folgt aus:

    1     <formid="form1"runat="server">

    3     <div>

    4         <p>

    5             <ahref="#">Hier klicken zum Request einer

    6                 statischen Datei </a>

    7         </p>

    8     </div>

    9     <divid="content">

   10         Bitte klicken Sie den Link, damit dieser Bereich gefüllt wird.

   11     </div>

   12     </form>

Der Link, welcher später die Ajax Aktion initiieren soll, wird in den Zeilen 5 und 6 definiert. Der Bereich welcher später ersetzt werden soll, ist der Inhalt des DIV Tags aus Zeile 9.

Noch ist das ganze jedoch nicht sonderlich dynamisch. Dazu benötigen wir noch etwas JavaScript:

    1     <scripttype="text/javascript">

    2         var xmlHttp;

    3         window.onload = function() {

    4             initializeXmlHttp();

    5         }

    6 

    7         function initializeXmlHttp() {

    8             if (window.XMLHttpRequest) { // IE7, IE8, Mozilla, Safari, Opera

    9                 xmlHttp = new XMLHttpRequest();

   10             } elseif (window.ActiveXObject) {

   11                 try {

   12                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //IE 5.x, 6

   13                 }

   14                 catch (e) {

   15                     alert('Ajax Zugriffe sind aufgrund der aktuellen Sicherheitseinstellungen leider nicht möglich');

   16                 }

   17             }

   18         }

   19 

   20         function sendAjaxRequest(url) {

   21             if (xmlHttp) {

   22                 xmlHttp.open("GET", url, true);

   23                 xmlHttp.onreadystatechange = requestFinished;

   24                 xmlHttp.send(null);

   25             }

   26         }

   27 

   28         function requestFinished() {

   29             if (xmlHttp.readyState==4) {

   30               if (xmlHttp.status==200) {

   31                 var contentDiv = document.getElementById('content');

   32                 contentDiv.innerHTML = xmlHttp.responseText;

   33               }

   34             }

   35         }

   36    </script>

Das Script deklariert zunächst in Zeile 2 eine Variable, die einen Verweis auf das XMLHhtpRequest Objekt hält. Wie zuvor beschrieben ermöglicht dieses das Absetzen einer asynchronen Abfrage an den Server.

Die Funktion initializeXmlHttp ab Zeile 7 füllt dieses Objekt nun mit Leben. Der Code sollte recht selbsterklärend sein. Zeile 8 prüft, ob das XMLHttpRequest Objekt am window Objekt hängt. Falls ja, kann ein neues XMLHttpRequest Objekt erstellt werden. Ist dies nicht der Fall, muss es als ActiveX Objekt erstellt werden.

Die Funktion sendAjaxRequest ab Zeile 20 setzt die eigentliche Abfrage ab. Dazu prüft Sie in Zeile 21 zuerst, ob die Variable xmlHttp initialisiert werden konnte. Wäre dies nicht der Fall, könnte keine Abfrage abgesandt werden. Anschließend wird in Zeile 22 eine asynchrone Verbindung geöffnet mit der Methode open geöffnet. Diese Methode erhält als Parameter die Methode ("GET" oder "POST"), die URL, sowie ein Flag, ob die Anfrage asynchron abgesetzt werden soll.

Zeile 23 gibt eine CallBack-Funktion an (in unserem Fall requestFinished), die aufgerufen werden soll, sobald eine Antwort auf die Anfrage zurück gekommen ist.

Zeile 24 sendet die Anfrage nun schließlich ab.

Die Funktion requestFinished ab Zeile 28 verarbeitet die Antwort des Webservers. Da eine Anfrage verschiedene Phasen durchlebt, prüft die Funktion in Zeile 29 anhand der Eigenschaft readyState ab, ob die Anfrage tatsächlich komplett beendet wurde.

Da zu Ende nicht immer "hat auch geklappt" heißen muss, wird in der nächsten Zeile geprüft, ob die Anfrage auch erfolgreich beendet wurde (HTTP Statuscode 200).

Die eigentliche Verarbeitung findet nun in den Zeilen 31 und 32 statt. Zeile 31 holt sich eine Referenz auf den zu ersetzenden Bereich (unser Div mit der ID Content). Zeile 32 überschreibt diesen Inhalt schlussendlich mit der Antwort des Servers.

Damit das ganze auch funktioniert muss die Funktion sendAjaxRequest aus Zeile 20 noch aus unserem HTML Code heraus aufgerufen werden. Dazu erweitern wir unseren Link aus den Zeilen 5/6 einfach um das Attribut onclick.

    5             <ahref="#"onclick="sendAjaxRequest('static.html');">Hier

    6                 klicken zum Request einer statischen Datei </a>

Ausgeführt sieht das ganze dann wie folgt aus:

Erster Aufruf der Seite Nach Aufruf des Links

Ganz nett ...

wir wissen nun also, wie wir statische Dateien nachladen können, aber steht das X in AJAX nicht für XML Webservices?

Genau! Deshalb habe ich das Demoprojekt auch um einen kleinen Webservice mit zwei sinnlosen Methoden erweitert:

    1 publicclassAjaxDemoService : System.Web.Services.WebService {

    2 

    3     [WebMethod]

    4     publicstring HelloWorld() {

    5         return"Hello World";

    6     }

    7 

    8     [WebMethod]

    9     publicstring Echo(int number)

   10     {

   11         returnstring.Format("Sie haben {0} eingegeben.", number);

   12     }  

   13 }

Wie rufen wir einen solchen Service nun aber per JavaScript auf?

Die Antwort findet sich relativ schnell, wenn man die URL des Webservices im Browser eingibt. In der nun erscheinenden Seite werden sämtliche Methoden des Webservices aufgelistet. Ein Klick auf eine dieser Methoden verrät schlussendlich, wie die Methode aufgerufen werden muss. Im Beispiel der Methode HelloWorld sieht die Ausgabe für eine HTTP Post Anfrage zum Beispiel wie folgt aus:

Beschreibung des POST Aufrufs der Webservice Methode

Für die Methode Echo wird folgende Ausgabe produziert:

4_echo_http_post

Im Vergleich zu unserer bisherigen Vorgehensweise beim dynamischen Nachladen der statischen Datei fällt auf, dass die Methode, über die die Anfrage gestartet wird, nun nicht mehr GET ein kann, sondern POST sein muss.

Außerdem wird nun auch ein bestimmter Content-Type, nämlich application/x-www-form-urlencoded benötigt. Speziell bei der Methode Echo fällt auf, dass außerdem nun auch Daten mit an den Server gesendet werden müssen.

Um die veränderten Anforderungen abdecken zu können, erweitere ich das bestehende JavaScript um eine neue Funktion:

    1         function postAjaxRequest(url, data) {

    2             if (xmlHttp) {

    3                 xmlHttp.open("POST", url, true);

    4                 xmlHttp.onreadystatechange = requestFinished;

    5                 xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

    6                 xmlHttp.send(data);

    7             }

    8         }

 

Die neuen Funktion, postAjaxRequest ähnelt der vorherigen Funktion sendAjaxRequest. Die veränderten Anforderungen ließen sich relativ einfach integrieren. In Zeile 3 wurde aus einem GET ein POST. In Zeile 5 wird der zusätzlich benötigte Content-Type gesetzt. In Zeile 6 wird der Methode send nun nicht mehr fix null als Datenparameter übergeben. Stattdessen wird das neue Argument data weiter gereicht.

Der HTML Code musste auch nur unwesentlich erweitert werden. Er erhält zwei neue Links zum Aufruf der beiden Webmethoden:

    1             <ahref="#"onclick="postAjaxRequest('AjaxDemoService.asmx/HelloWorld', null);">Hier

    2                 für Hello World WebService klicken </a>

    3             <br/>

    4             <ahref="#"onclick="postAjaxRequest('AjaxDemoService.asmx/Echo', 'number=1');">Hier

    5                 für Echo WebService klicken </a>

Das Ergebnis sieht anschließend wie folgt aus:

Abbildung zeigt den Rückgabewert des Hello World Webservices  Abbildung zeigt die Rückgabe des Echo Web Services

Fazit

Ajax in eine Webanwendung zu integrieren ist aus technischer Sicht nicht sonderlich schwierig. Der vorliegende Blog Post hat gezeigt, dass sich selbst ohne "magische" Frameworks mit wenigen Zeilen JavaScript Ajax Funktionalitäten integrieren lassen. Natürlich ist die gezeigte Implementierung nur sehr rudimentär. So wurde das zurückgegeben XML des Webservices zum Beispiel noch nicht geparsed und es fand außerdem so gut wie keine Fehlerbehandlung statt. Dieses in das Beispiel zu integrieren hätte den Rahmen eines Blogposts jedoch vollständig gesprengt. Außerdem gibt es genau aus diesen Gründen auch bereits fertige Frameworks, wie ASP.NET AJAX oder jQuery, die einem genau diese Detailarbeit abnehmen.

Ehe man ein solches Framework einsetzt, sollte man jedoch die Grundlagen dessen kennen, was hinter den Kulissen geschieht. Und genau diese Grundlagen haben wir in diesem Blog Post geschaffen.

Das vollständige Beispiel werde ich übrigens am Wochenende zum Download bereit stellen.



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

6. Treffen der SharePoint Usergroup Dresden am 28.01.2010

27.01.2010 10:58:00 | Martin Hey

Am 28.01.2010 findet das erste Usergroup-Treffen in diesem Jahr statt. Dieses Mal treffen wir uns bei der datafino GmbH am Waldschlösschen. Beginn ist 19:00 Uhr.

Thematisch gibt es auch dieses Mal eine interessante Mischung aus Entwickler- und Anwenderthemen:

Zunächst widmet sich Ronny Schattauer gemeinsam mit uns dem Thema Datenmodellierung in SharePoint mit Hilfe von Microsoft Visio. Es geht dabei einerseits um die Modellierung der Datenstrukturen in UML, andererseits aber auch um die automatische Generierung von Programmcode zur Verwendung in SharePoint Solutions aus den erstellten Modellen.

Im Anschluss daran setzen wir eine Diskussionsrunde zum Thema Web 2.0 Funktionen in SharePoint 2010. Bei der letzten Usergroup haben wir uns ja dem großen Thema SharePoint 2010 gewidmet. Dabei haben wir auch gesehen, dass sich sehr viel im Bereich Web 2.0-Funktionalität getan hat – um nur einige Features zu nennen: verbesserter Wiki-Editor, Kommentar- und Tagging-Funktionalitäten. Seitdem hat sicher der ein oder andere schon Eindrücke sammeln können, die wir gern diskutieren würden: Sind die bisherigen Ansätze überhaupt in der Praxis brauchbar?

Weitere Informationen und die Möglichkeit zur Anmeldung gibt es im Xing-Event.

Ansprechpartner für Rückfragen: Sascha Henning, Martin Hey

System.Runtime.InteropServices.COMException beim Laden eines ASP.NET Web Projektes

27.01.2010 01:55:03 | Jürgen Gutsch

nachdem ich meinen Rechner neu aufgesetzt habe, erhielt ich beim Öffnen einer Solution mit einem ASP.NET Web Projekt eine “System.Runtime.InteropServices.COMException” und das Web Projekt wurde nicht geladen.

Nach längerem Suchen fand ich den Bug auch bei Microsoft: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=317124 und die Lösung bei Robert Boedigheimer in folgendem Beitrag: System.Runtime.InteropServices.COMException in WAP VS 2008 Project

Ich hatte ganz einfach vergessen die Metabase Kompatibilität mit zu installieren.

DotNetKicks-DE Image

Wie aktuell sind meine Statistiken?

26.01.2010 23:08:00 | Martin Hey

Aktuelle Abfragestatistiken können zu schnellerer Ausführung von Queries im SQL-Server führen, denn sie sind die Grundlage der Ausführungspläne. Aber wann werden Statistiken aktualisiert und wie aktuell sind die Statistiken überhaupt?

Welche Informationen es zu einer Statsitik gibt, erhält man mit dem Befehl DBCC SHOW_STATISTICS. Im Ergebnis sieht man unter anderem auch, wie viele Zeilen laut Statistik erfasst sind und wann die Statistiken das letzte Mal aktualisiert wurden.

Anhand des folgenden Beispiels soll verdeutlicht werden, wann die Statistiken eines Index aktualisiert werden. Grundlage ist eine Tabelle mit Mitarbeiterdaten - der Einfachheit halber nur Nachname und Vorname.

Statistiken werden erst bei Lesezugriff aktualisiert
So lange in die Tabelle nur Datensätze eingefügt werden, wird die Statistik nicht aktualisiert. In einem ersten Beispiel werden 10000 Datensätze an eine Tabelle angefügt und im Anschluss daran die Statistikeigenschaften abgefragt.


Erst nachdem der Server beim Lesezugriff festgestellt hat, dass die Statistiken nicht aktuell sind, werden diese aktualisiert.


Statistiken werden erst ab einer bestimmten Anzahl relevanter Änderungen aktualisiert
Nicht jede Änderung an den Daten führt zu einer Neuberechnung der Statistiken. Grundlage dafür sind sogenannte column modification counters. Eine Statistik wird als nicht aktuell angesehen wenn:
  • erst kein Datensatz in der Tabelle war und nun mindestens ein Datensatz in der Tabelle ist
  • wenn die Anzahl der Datensätze zur letzten Ermittlung der Statistiken <= 500 war und seitdem mehr als 500 relevante Änderungen durchgeführt wurden
  • wenn die Anzahl der Datensätze zur letzten Ermittlung der Statistiken > 500 war und seitdem an 500 + 20% der Anzahl an Datensätzen Änderungen durchgeführt wurden
s. auch entsprechende Einträge im Technet zu SQL-Server 2005 und SQL-Server 2008

In der Beispieltabelle sind nun 10.000 Datensätze. Nach der eben genannten Formel wäre die nächste Neuberechnung fällig, wenn (10.000 * 20% + 500 = ) 2.500 relevante Änderungen vorgenommen wurden.

Also eben 2.499 Datensätze hinzugefügt, die Daten abgefragt und geschaut, was die Statistik macht....


Erwartungsgemäß basiert die Statistik noch immer auf 10.000 Datensätzen. Fügt man nun noch einen Datensatz hinzu, so wird sichtbar, dass genau jetzt eine Aktualisierung vorgenommen wird.


Das Beispiel zeigt, dass man bei ungünstiger Datenkonstellation noch sehr lange mit nicht aktuellen Statistiken und Ausführungsplänen arbeiten kann und gibt vielleicht dem ein oder anderen Administrator den notwendigen Anschub, einen Datenbank-Wartungsjob zur Aktualisierung der Statistiken einzurichten...


Was ist MSDN? Was bietet MSDN alles? Was gibt es kostenlos?

26.01.2010 13:26:35 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/26/was-ist-msdn-was-bietet-msdn-alles-was-gibt-es-kostenlos.aspx'; tweetmeme_source = 'jansche';

Habt ihr euch auch schon mal gefragt, was dieses MSDN ist, ob das kostenfrei ist, ob MSDN Online das Gleiche ist wie die MSDN Subscription, ob es die über 800 Webcasts oder beispielsweise über 400 CodeClips mit dazugehörigem technischen Artikel (eine Frage, eine Antwort) wirklich kostenlos gibt? Und das alles in deutscher Sprache? Wenn ihr euch eine dieser Fragen wirklich schon mal gestellt habt oder generelles Interesse besteht MSDN kennenzulernen, dann schaut euch diesen Artikel an: Was ist MSDN Online Deutschland?

Viele Grüße,
jan

Webcasts zum Thema Model-Based Testing (MBT)

25.01.2010 17:42:55 | Christian Binder

vor kurzem habe ich in diesem Post ein Interview mit Wolfgang Grieskamp zum Thema MBT bereitgestellt. Wie im Post angekündigt haben wir Webcasts zu MBT mit dem Spec Explorer 2010 auf MSDN bereit gestellt.

Model Based Testing

Model-Based Testing mit dem Spec Explorer 2010 Teil 1

Dieser Webcast ist einen Einführung in Model-basiertes testen, wobei am Anfang kurz aufgezeigt wird, wie Microsoft’s Protocol Documentation Program diesen Ansatzt verwendet und welche Erfahrungen wir damit gemacht haben. Danach stehen einige Grundlagen zum Model-basierten testen im Fokus, um abschliessend den Spec Explorer 2010 kurz vozustellen. Der Spec Explorer 2010 ist ein Werkzeug, welches Microsoft zum Model-basiertes testen verwendet und frei zum Download verfügbar ist.

Model-Based Testing mit dem Spec Explorer 2010 Teil 2

Der zweite Teil ist eine End to End Demo am Beispiel eines Webdienstes, wobei alle wichtigen Phasen durchlaufen werden. Entwicklung des Modells, Exploration des Modells, Testgenerierung und letztendlich die Testausführung.

Viel Spass
Chris

Was ist MSDN? Was bietet MSDN alles? Was gibt es kostenlos?

25.01.2010 16:09:00 | Oliver Scheer

Haben Sie sich auch schon mal gefragt, was dieses MSDN ist, ob das kostenfrei ist, ob MSDN Online das Gleiche ist wie die MSDN Subscription, ob es die über 800 Webcasts oder beispielsweise über 400 CodeClips mit dazugehörigem technischen Artikel (eine Frage, eine Antwort) wirklich kostenlos gibt? Und dies sogar alles in deutscher Sprache? Wenn Sie wirklich eine dieser Fragen sich schon mal gestellt haben oder generelles Interesse besteht MSDN kennenzulernen, so empfehle ich den Artikel: Was ist MSDN Online Deutschland?

clip_image001

Tabellen in Word2007 Dokumenten auf Basis einer Vorlage erweitern

25.01.2010 15:50:00 | Jan Christian Selke

In meinem letzten Eintrag habe ich über das Einfügen von Tabellen in Dokumente geschrieben. Beginnend auf einer grünen Wiese ist dies kein leichtes Unterfangen. Deutlich einfacher wird es, wenn auf Basis von Vorlagen gearbeitet werden kann.

Wie kann eine solche Vorlage aussehen?

Zu diesem Zweck habe ich eine Tabelle in einem Content Control erstellt. Das hat auch gleich noch den Vorteil, dass die Tabelle über den Tag des Content Controls eindeutig identifiziert werden kann. Dem Tag weise ich der Einfachheit halber den Wert “Tabelle” zu. Der Tabelle habe ich eines der Word Standard Aussehen zugewiesen.

Tabelle3

Dem einfachen Aussehen im Dokument steht die Struktur in der .docx Datei entgegen. Öffnen wir das Package und sehen uns das Markup an. Es lässt sich erahnen, welcher Aufwand betrieben werden müsste, um das obige Standard Layout manuell zu erstellen.

tabelle4

Wie kann der Quellcode zu Erweiterung der Tabelle aussehen?

Wie kann nun die Tabelle unter Einsatz des Open Xml SDK erweitert werden? Und ist wirklich kein Formatieren der Tabelle mehr zu beachten? Als Antwort darauf habe ich eine Methode zum Einfügen von Zeilen bzw. auch Zellen geschrieben.

Zu Beginn wird das Dokument geöffnet und Document aus dem MaindocumentPart ausgelesen. Dann wird das Content Control anhand des Tags “Tabelle” identifiziert. In der darauf folgenden Iteration werden 5 neue Zeilen mit jeweils drei Zellen angefügt.

using (WordprocessingDocument package = WordprocessingDocument.Open(filename, true))
{
    MainDocumentPart mainDocumentPart = package.MainDocumentPart;
    Document document = mainDocumentPart.Document;
    SdtBlock sdt = document.Descendants<SdtBlock>().Where(
        x => x.GetFirstChild<SdtProperties>().GetFirstChild<Tag>().Val.Value == "Tabelle").First();

    for (int i = 0; i < 5; i++)
    {
        TableRow lastRow = sdt.Descendants<Table>().First().Descendants<TableRow>().Last();
        lastRow.InsertAfterSelf(
            new TableRow(
                new TableCell(new Paragraph(new Run(new Text(string.Format("Zeile {0}: Zelle 1", (i + 2)))))),
                new TableCell(new Paragraph(new Run(new Text(string.Format("Zeile {0}: Zelle 2", (i + 2)))))),
                new TableCell(new Paragraph(new Run(new Text(string.Format("Zeile {0}: Zelle 3", (i + 2))))))));
    }
}

Die neuen Tabellenzellen werden mit der Zeilen- sowie der Zellenummer gefüllt.

Die erweiterte Tabelle

Das Ergebnis entspricht der folgenden Tabelle und spricht damit für sich... :-)

Tabelle2

Nicht nur, dass das Format der Tabelle bereits besteht und genutzt wird, die Zellenformatierung wird ebenfalls aus der bereits bestehenden Tabelle übernommen. Damit entfallen tatsächlich die Sorgen mit den Formatierungen.

Microsoft Webcast DVD - Jahresedition 2009: Jetzt verfuegbar!

25.01.2010 14:49:07 | Kay Giza

Es ist mir eine Freude dies ankündigen zu dürfen!
Endlich ist es wieder soweit: Die beliebte Microsoft Webcast-DVD Jahresedition 2009 ist erschienen!

Mehr als 150 Webcasts von MSDN und TechNet gebündelt in einem Offline-Archiv – die brandaktuelle Webcast DVD ist eine Sammlung der neuesten Webcasts aus dem Jahr 2009, u.a. zu Windows Server 2008 R2, Server-Virtualisierung, Windows 7, Visual Studio 2010 oder Internet Explorer 8. Bestellen Sie sich jetzt Ihr Exemplar des kompakten Expertenwissens auf DVD für 19,90 EURO inklusive Versand. Besucher der CeBIT 2010 können sich am MSDN & TechNet-Messestand in Halle 4 ihr Exemplar auch kostenlos gegen Vorlage eines Promocodes abholen – kurze Registrierung vorausgesetzt.

Wir würden uns freuen, wenn wir Sie auf der CeBIT 2010 in Hannover begrüßen dürften!
Microsoft Webcast DVD: Jahresedition 2009 | jetzt bestellen

PS: Die Webcasts von MSDN und TechNet sind natürlich weiterhin im Web kostenfrei zugänglich: MSDN Webcasts | TechNet Webcasts



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

Performanceverbesserungen seit Beta 2 in Visual Studio 2010

25.01.2010 14:42:48 | Kay Giza

Mein Kollege Brian Harry hat in seinem Blog neueste Ergebnisse zu den Performanceverbesserungen von Visual Studio 2010 seit Beta 2 veröffentlicht. Und die Nachrichten sind gut, genauer gesagt sogar sehr gut: Die Performance von Visual Studio 2010 wurde seit Beta 2 drastisch verbessert und es scheint als seien alle größeren Probleme und Schwachstellen ausgemerzt worden und Visual Studio 2010 ist nahezu „ready to ship“. Seit Beginn der aktuellen Performanceoptimierungen wurde insgesamt drei so genannte Super Limited... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

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

Drastische Performanceverbesserungen seit Beta 2 in Visual Studio 2010

25.01.2010 14:32:00 | Oliver Scheer

Brian Harry – Microsoft Technical Fellow und „Vater“ des Team Foundation Server – hat in seinem Blog neueste Ergebnisse zu den Performanceverbesserungen von Visual Studio 2010 seit Beta 2 veröffentlicht. Und die Nachrichten sind gut, genauer gesagt sogar sehr gut: Die Performance von Visual Studio 2010 wurde seit Beta 2 drastisch verbessert und es scheint als seien alle größeren Probleme und Schwachstellen ausgemerzt worden und Visual Studio 2010 ist nahezu „ready to ship“.

Seit Beginn der aktuellen Performanceoptimierungen wurde insgesamt drei so genannte „Super Limited Community Technology Previews“ (SLCTP) veröffentlicht. Diese SLCTPs gingen an quasi jeden, der sich gegenüber Microsoft zu Performanceproblemen in Visual Studio 2010 Beta 2 geäußert hatte (wenn entsprechende Kontaktinformationen verfügbar waren). Vergangene Woche wurde SLCTP 3 an mehrere hundert Personen außerhalb Microsofts ausgeliefert. Mittlerweile sind bereits knapp 100 ausgewertete Feedbackbögen zurückgekommen. Auch innerhalb von Microsoft wurde SLCTP 3 eingesetzt, mittlerweile bei circa 80% innerhalb der Visual Studio DevDiv und ebenfalls bei wichtigen internen Partnerabteilungen wie Expression Blend, Exchange, CodePlex und Oslo. Aus all diesen Quellen kam und kommt stetig Feedback: Der Unterschied zwischen dem aktuellen Build und Beta 2 ist beeindruckend!

Das ursprüngliche Feedback zu Beta 2 hatte ergeben, dass zwischen 30% bei externen Umfragen und bis zu 70% der Anwender bei internen Umfragen mit Beta 2 „relativ unzufrieden“ oder gar „sehr unzufrieden“ waren. Größer kann der Kontrast zur aktuellen SLCTP kaum ausfallen: Knapp 60% sind „sehr zufrieden“ und weitere 40% sind „relativ zufrieden“ – nur noch 2% sind „relativ unzufrieden“.

clip_image001

In Kürze wird der angekündigte Release Candidate veröffentlicht, dann wird eine weiter optimierte Version nicht nur Hunderten sondern Tausenden zur Verfügung stehen, damit vor der Veröffentlichung noch weitere Optimierungen geschehen können.

Detaillierte Informationen, sowie Zitate von Testern finden Sie im Blog von Brian Harry: http://blogs.msdn.com/bharry/archive/2010/01/24/state-of-vs-2010-performance.aspx

Microsoft Webcast-DVD - Jahresedition 2009 - wurde veröffentlicht!

25.01.2010 10:30:41 | Oliver Scheer

Endlich ist es wieder soweit: Die beliebte Microsoft Webcast-DVD Jahresedition 2009 ist erschienen!
Mehr als 150 Webcasts von MSDN und TechNet gebündelt in einem Offline-Archiv – die brandaktuelle Webcast DVD ist eine Sammlung der neuesten Webcasts aus dem Jahr 2009, u.a. zu Windows Server 2008 R2, Server-Virtualisierung, Windows 7, Visual Studio 2010 oder Internet Explorer 8. Bestellen Sie sich jetzt Ihr Exemplar des kompakten Expertenwissens auf DVD für 19,90 EURO inklusive Versand. Besucher der CeBIT 2010 können sich am MSDN & TechNet-Messestand in Halle 4 ihr Exemplar auch kostenlos gegen Vorlage eines Promocodes abholen – kurze Registrierung vorausgesetzt.
Wir würden uns freuen, wenn wir Sie auf der CeBIT 2010 in Hannover begrüßen dürften!
Weitere Informationen zur Webcast-DVD von Microsoft gibt es auf unserer Bestellwebseite: Hier geht’s zur Bestellung

Microsoft Webcast DVD - Jahresedition 2009: Jetzt verfuegbar!

25.01.2010 08:53:05 | Kay Giza

Es ist mir eine Freude dies ankündigen zu dürfen!
Endlich ist es wieder soweit: Die beliebte Microsoft Webcast-DVD Jahresedition 2009 ist erschienen!

Mehr als 150 Webcasts von MSDN und TechNet gebündelt in einem Offline-Archiv – die brandaktuelle Webcast DVD ist eine Sammlung der neuesten Webcasts aus dem Jahr 2009, u.a. zu Windows Server 2008 R2, Server-Virtualisierung, Windows 7, Visual Studio 2010 oder Internet Explorer 8. Bestellen Sie sich jetzt Ihr Exemplar des kompakten Expertenwissens auf DVD für 19,90 EURO inklusive Versand. Besucher der CeBIT 2010 können sich am MSDN & TechNet-Messestand in Halle 4 ihr Exemplar auch kostenlos gegen Vorlage eines Promocodes abholen – kurze Registrierung vorausgesetzt.

Wir würden uns freuen, wenn wir Sie auf der CeBIT 2010 in Hannover begrüßen dürften!
Microsoft Webcast DVD: Jahresedition 2009 | jetzt bestellen

PS: Die Webcasts von MSDN und TechNet sind natürlich weiterhin im Web kostenfrei zugänglich: MSDN Webcasts | TechNet Webcasts



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

Performanceverbesserungen seit Beta 2 in Visual Studio 2010

25.01.2010 05:34:16 | Kay Giza

Mein Kollege Brian Harry hat in seinem Blog neueste Ergebnisse zu den Performanceverbesserungen von Visual Studio 2010 seit Beta 2 veröffentlicht. Und die Nachrichten sind gut, genauer gesagt sogar sehr gut: Die Performance von Visual Studio 2010 wurde seit Beta 2 drastisch verbessert und es scheint als seien alle größeren Probleme und Schwachstellen ausgemerzt worden und Visual Studio 2010 ist nahezu „ready to ship“. Seit Beginn der aktuellen Performanceoptimierungen wurde insgesamt drei so genannte Super Limited... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

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

Aufzeichnungen vom Office-TechDay sind online

25.01.2010 04:02:00 | Lars Keller

Wie auf dem “Das Microsoft Deutschland Blog zu Office 2010” zu lesen sind die Aufzeichnungen des Office-TechDay im TechNet erschienen. Auf dem Office-TechDay haben Steffen Krause und Daniel Melanchthon einen ganzen Tag alles zu MS Office, Exchange und Sharepoint 2010 gezeigt.

Die Videos enthalten folgende Themen:

  • Teil 1: Überblick, die neue Oberfläche, Dateiformate, Webanwendungen, Word, Powerpoint, Excel
  • Teil 2: Die Demoumgebung, Access, OneNote, Visio, Outlook, Exchange, SharePoint (Anfang)
  • Teil 3: SharePoint Server 2010 (Fortsetzung), SharePoint Workspace, SharePoint Designer
  • Teil 4: Fragen und Antworten

Zusätzlich dazu gibt es noch das Video “SharePoint 2010 Kick-Off Webcast Features, Entwicklung, Administration”, welches Steffen zusammen mit Tom Wendel aufgenommen hat.

Wer einen Überblick zu dem Thema haben möchte, sollte in die Videos einmal reinschauen!

Ribbon Hero – Spielerisch Office erkunden

25.01.2010 03:14:00 | Lars Keller

Ribbon Hero ist ein neues Projekt von den Microsoft Office Labs. Mit Ribbon Hero kann man spielerisch Word, Excel und PowerPoint erkunden. Das Spiel zeigt einem typische Abläufe in den Office Applikationen, wenn man diese nachvollzieht, bekommt man Punkte. Diese Punkte können dann in Facebook veröffentlicht werden. Ribbon Hero ist für MS Office 2007 & 2010 gedacht.

Dieses Video erklärt das Spielprinzip:

 

 

Auf jeden Fall macht Ribbon Hero Spaß und ist echt nett gemacht!

Tabellen in Word2007 Dokumente einfügen

24.01.2010 23:16:00 | Jan Christian Selke

Tabellen sind ein Element, von dem gesagt werden kann, dass es grundsätzlich in Word Dokumenten genutzt wird. Bei dem Vorgang diese programmatisch, mit dem Open Xml SDK, in Dokumente einzufügen handelt es sich zwar um keine komplexe Aufgabe, sie ist aber aufwändig und kann sich zu einer wahren Sisyphos-Arbeit entwickeln. Alle Eigenschaften der Tabelle, Tabellenzeilen und –zellen müssen korrekt und nach Wunsch händisch gefüllt und formatiert werden. Geht es nicht auch einfacher? Mit Sicherheit, aber dazu komme ich später.

Beginnt man auf der grünen Wiese, gibt es keine Alternative zum vollständig selbstständigen Einfügen der Tabelle in ein Dokument. Ein solcher Versuch könnte dem folgenden Beispiel ähnlich sehen.

using (WordprocessingDocument package = WordprocessingDocument.Create(filename, WordprocessingDocumentType.Document))

    MainDocumentPart mainDocumentPart = package.AddMainDocumentPart();
    Document document = new Document(
        new Body(
            new Table(
                new TableProperties(
                    new TableBorders
                    {
                        TopBorder = new TopBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.BasicBlackDots),
                            Size = new UInt32Value((uint)8),
                            Color = new StringValue("4bacc6")
                        },
                        BottomBorder = new BottomBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.BasicBlackDots),
                            Size = new UInt32Value((uint)8),
                            Color = new StringValue("4bacc6")
                        },
                    }),
                    new TableGrid(),
                new TableRow(
                    new TableCell(
                        new TableCellProperties(
                            new TableCellBorders
                            {
                                TopBorder = new TopBorder
                                {
                                    Val = new EnumValue<BorderValues>(BorderValues.BasicBlackDots),
                                    Size = new UInt32Value((uint)8),
                                    Color = new StringValue("4bacc6")
                                },
                                BottomBorder = new BottomBorder
                                {
                                    Val = new EnumValue<BorderValues>(BorderValues.BasicBlackDots),
                                    Size = new UInt32Value((uint)8),
                                    Color = new StringValue("4bacc6")
                                },
                            }),
                        new Paragraph(
                            new Run(
                                new Text("Test Zeile 1: Zelle 1")))),
                    new TableCell(
                        new Paragraph(
                            new Run(
                                new Text("Test Zeile 1: Zelle 2"))))))));

    document.Save(mainDocumentPart);

Dieses Beispiel gibt Aufschluss darüber, wie umständlich das Schreiben von Code zum Erstellen einer Tabelle sein kann. Dabei werden hier noch nicht einmal besondere Wunder gewirkt. Die Tabelle erhält oben und unten einen Rahmen, ebenso die erste Spalte. Noch gibt es keine Hintergrundfarbe, Kopfzeile oder ähnliche zusätzliche Formatierungen.

Tabelle

Nicht nur, dass das gesamte Aussehen der Tabelle per Hand erstellt werden muss, die richtige Platzierung muss auch per Code erfolgen. In einem vollständig automatisch zu erstellenden Dokument keine leichte Aufgabe. Gerade dies geht aber auch einfacher: Die Platzierung kann auf Basis eines Content Controls erfolgen. Nutzt man nun aber schon ein Content Control als Template für die Platzierung der Tabelle im Dokument, kann auch noch ein Schritt weiter gegangen werden. Die erste Zeile bzw. die ersten Zeilen (im Falle einer zusätzlichen Kopfzeile) der Tabelle können bereits eingefügt, nach persönlichem gusto formatiert und dann als Vorlage für das spätere Befüllen genutzt werden.

Auf diese Weise wird nicht nur die gesamte, sehr umständliche, programmatische Formatierung der Tabelle eingespart - sie ist auch bereits dort positioniert, wo sie gewünscht ist. Darüber hinaus können Formatanpassungen oder –änderungen in der Dokumentvorlage ohne Eingriffe in den Quellcode vorgenommen werden.

Das richtige Content Control beispielsweise auf Basis des Tags aus dem Dokument auszulesen ist ein Einzeiler. Mit dem konkreten Vorgehen wie eine Tabelle template-basiert erstellt wird, werde ich mich als nächstes beschäftigen und im Anschluss darüber schreiben.

Visual Studio Tip: Setting Indent Width and Tabs/Spaces Quickly Using Macros

24.01.2010 17:07:16 | Alexander Groß

Over the last years I’ve been contributing to several Open Source software projects, just to name the most recent:

All of the above projects follow their own style how to lay out the source code using indents. It seems like everybody has a different opinion you would have to cater for, for example:

  • Indenting is done with tabs
  • 4-space indents
  • 2-space indents

Often times these conventions are implicit, you have to read the source code to see the actual style the authors follow. It is encouraged to apply these guidelines to your patches ensure they will be accepted.

I often switch between developing for projects, so before writing a single line of code I have to hit Visual Studio’s Tools | Options | Text Editor Options dialog and change the indent settings to match the project’s conventions.

Visual Studio Text Editor Options

This has become very tedious, additionally, I often forget to adjust the indent settings before writing code. (Perhaps I forget it because it’s so annoying.)

To scratch that itch I sat down and wrote some Visual Studio macros that apply the most commonly used settings:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module Fonts
    Sub TwoSpaces()
        Dim textEditor As Properties

        textEditor = DTE.Properties("TextEditor", "AllLanguages")
        textEditor.Item("IndentStyle").Value = vsIndentStyle.vsIndentStyleSmart
        textEditor.Item("TabSize").Value = 4
        textEditor.Item("IndentSize").Value = 2
        textEditor.Item("InsertTabs").Value = False
    End Sub

    Sub FourSpaces()
        Dim textEditor As Properties

        textEditor = DTE.Properties("TextEditor", "AllLanguages")
        textEditor.Item("IndentStyle").Value = vsIndentStyle.vsIndentStyleSmart
        textEditor.Item("TabSize").Value = 4
        textEditor.Item("IndentSize").Value = 4
        textEditor.Item("InsertTabs").Value = False
    End Sub

    Sub OneTab()
        Dim textEditor As Properties

        textEditor = DTE.Properties("TextEditor", "AllLanguages")
        textEditor.Item("IndentStyle").Value = vsIndentStyle.vsIndentStyleSmart
        textEditor.Item("TabSize").Value = 4
        textEditor.Item("IndentSize").Value = 4
        textEditor.Item("InsertTabs").Value = True
    End Sub

    Public Sub NormalFonts()
        SetFontSize(10)
    End Sub

    Public Sub LargeFonts()
        SetFontSize(14)
    End Sub

    Sub SetFontSize(ByVal size As Int32)
        Dim textEditor As Properties

        textEditor = DTE.Properties("FontsAndColors", "TextEditor")
        textEditor.Item("FontSize").Value = size
    End Sub
End Module

These macros are associated with toolbar buttons:

Visual Studio Toolbar Buttons

The first two buttons are associated to the LargeFonts and NormalFonts macros that set the editor font size. I like to invoke these when doing presentations. No more fiddling with Tools | Options to ensure your audience is able to read the code on the wall.

The last three buttons should be self-explaining, they’re to quickly set tabbed, two-space and four-space indents, respectively.

LINQ Examples

23.01.2010 22:07:00 | Andreas Mehl

// State object for reading client data asynchronously
public class StateObject
{
    // Client socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 1024;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

public class AsynchronousSocketListener
{
    // The port number for the remote device.
    private const int port = Port;

    // ManualResetEvent instances signal completion.
    private static ManualResetEvent connectDone = new ManualResetEvent(false);
    private static ManualResetEvent sendDone = new ManualResetEvent(false);
    private static ManualResetEvent receiveDone = new ManualResetEvent(false);

    // The response from the remote device.
    private static String response = String.Empty;

    private static void StartClient()
    {
        // Connect to a remote device.
        try
        {
            // Establish the remote endpoint for the socket.
            // The name of the 
            // remote device is "host.contoso.com".
            IPHostEntry ipHostInfo = Dns.GetHostEntry("Adresse");
            IPAddress ipAddress = ipHostInfo.AddressList.FirstOrDefault(
                ip => ip.AddressFamily == AddressFamily.InterNetwork);
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

            // Create a TCP/IP socket.
            Socket client = new Socket(AddressFamily.InterNetwork, 
                SocketType.Stream, ProtocolType.Tcp);
            
            // Connect to the remote endpoint.
            client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), 
                client);
            connectDone.WaitOne();

            Send(client, "Hallo Welt");
            sendDone.WaitOne();
            Receive(client);
            receiveDone.WaitOne();

            // Write the response to the console.
            Console.WriteLine("Response received : {0}", response);
            Console.ReadLine();
            
            // Release the socket.
            client.Shutdown(SocketShutdown.Both);
            client.Close();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }
    }

    private static void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket client = (Socket)ar.AsyncState;

            // Complete the connection.
            client.EndConnect(ar);

            Console.WriteLine("Socket connected to {0}",
                client.RemoteEndPoint.ToString());

            // Signal that the connection has been made.
            connectDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }
    }

    private static void Receive(Socket client)
    {
        try
        {
            // Create the state object.
            StateObject state = new StateObject();
            state.workSocket = client;

            // Begin receiving the data from the remote device.
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }
    }

    private static void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;

            // Read data from the remote device.
            int bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                // There might be more data, so store the data received 
                // so far.
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0,
                    bytesRead));

                client.BeginReceive(state.buffer, 0, StateObject.BufferSize,
                    0, new AsyncCallback(ReceiveCallback), state);

            }
            else
            {
                // All the data has arrived; put it in response.
                if (state.sb.Length > 1)
                {
                    response = state.sb.ToString();
                }
                // Signal that all bytes have been received.
                receiveDone.Set();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }
    }

    private static void Send(Socket client, String data)
    {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);

        // Begin sending the data to the remote device.
        client.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), client);
    }

    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket client = (Socket)ar.AsyncState;

            // Complete sending the data to the remote device.
            int bytesSent = client.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to server.", bytesSent);

            // Signal that all bytes have been sent.
            sendDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }
    }


    static int Main(string[] args)
    {
        StartClient();
        return 0;
    }
}

C# DataSet to Object Array Extension Method

23.01.2010 19:22:00 | Andreas Mehl

 public class SynchronousSocketListener
    {
        // Data buffer for incoming data.
        private static int BUFFER_SIZE = 4 * 1024;
        private readonly byte[] bytes = new byte[BUFFER_SIZE];

        private static void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.GetHostEntry("Adresse");
                IPAddress ipAddress = ipHostInfo.AddressList.FirstOrDefault(
                    ip => ip.AddressFamily == AddressFamily.InterNetwork);
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork, 
                    SocketType.Stream, ProtocolType.Tcp);

                string result = "";
                try
                {
                    // Encode the data string into a byte array.
                    byte[] msg = Encoding.UTF8.GetBytes(message);

                    // Send the data through the socket.
                    int bytesSent = client.Send(msg);

                    // Receive the response from the remote device.
                    int bytesRec = 0;

                    do
                    {
                        bytesRec = client.Receive(bytes, 0, 
                            client.Available, SocketFlags.None);
                        result = Encoding.UTF8.GetString(bytes, 0, bytesRec);
                    } while (client.Available > 1);
                }
                catch (ArgumentNullException ane)
                {
                    Error = "ArgumentNullException : " + ane;
                }
                catch (SocketException se)
                {
                    Error = "SocketException : " + se.ToString();
                }
                catch (Exception e)
                {
                    Error = "Unexpected exception : " + e;
                }

                // Release the socket.
                client.Shutdown(SocketShutdown.Both);
                client.Close();

                return result;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.ReadLine();
            }
        }

        static int Main(string[] args)
        {
            StartClient();
            return 0;
        }
    }

Asynchronous - Client Socket Connection in .NET with C#

23.01.2010 19:22:00 | Andreas Mehl

I wanted to use the socket functionality in .NET, so i searched and tested some examples.

The best i got, which works for me, as following:

Asynchronous Client Socket Connection:

 

 public class SynchronousSocketListener
    {
        // Data buffer for incoming data.
        private static int BUFFER_SIZE = 4 * 1024;
        private readonly byte[] bytes = new byte[BUFFER_SIZE];

        private static void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.GetHostEntry("Adresse");
                IPAddress ipAddress = ipHostInfo.AddressList.FirstOrDefault(
                    ip => ip.AddressFamily == AddressFamily.InterNetwork);
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork, 
                    SocketType.Stream, ProtocolType.Tcp);

                string result = "";
                try
                {
                    // Encode the data string into a byte array.
                    byte[] msg = Encoding.UTF8.GetBytes(message);

                    // Send the data through the socket.
                    int bytesSent = client.Send(msg);

                    // Receive the response from the remote device.
                    int bytesRec = 0;

                    do
                    {
                        bytesRec = client.Receive(bytes, 0, 
                            client.Available, SocketFlags.None);
                        result = Encoding.UTF8.GetString(bytes, 0, bytesRec);
                    } while (client.Available > 1);
                }
                catch (ArgumentNullException ane)
                {
                    Error = "ArgumentNullException : " + ane;
                }
                catch (SocketException se)
                {
                    Error = "SocketException : " + se.ToString();
                }
                catch (Exception e)
                {
                    Error = "Unexpected exception : " + e;
                }

                // Release the socket.
                client.Shutdown(SocketShutdown.Both);
                client.Close();

                return result;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.ReadLine();
            }
        }

        static int Main(string[] args)
        {
            StartClient();
            return 0;
        }
    }

Windows Mobile 6.5 SDK erschienen [Update]

23.01.2010 09:41:50 | Peter Nowak

Normalerweise erfolgt vor einem Release eine neuen Software irgendeine Form einer Ankündigung. Nicht so beim Windows Mobile 6.5 SDK, welches seit dem 22.1.2010 als Download verfügbar ist.[Update] Mehrere MVPs verbrachten das Wochenende ihre Systeme neu aufzusetzten, nachdem die SDK Installation einige Fehler verursacht.[/Update]
Dieses scheint das bisher verfügbare DTK abzulösen.
Leider hatte ich noch keine Zeit es mir anzuschauen, so dass ich hier nur das wiedergeben kann, was ich bisher darüber im Netz gefunden habe.
Das SDK gibt es, wie bei früheren Versionen auch, klassisch für Classic (ohne Touchscreen) als auch für Professional (mit Touchscreen) Geräte.

Die einzelnen Downloadpakete stehe für die folgenden Sprachen zur Verfügung:
  • 0804 CHS Chinese Simplified
  • 0409 USA English
  • 0407 GER German
  • 040c FRA French
  • 0410 ITA Italian
  • 0c0a ESN Spanish
  • 0411 JPN Japanese
Neben zusätzliche Dokumentation, Beispielen und Headerfiles beinhaltet es noch die Emulatorimages, wie auch Erweiterungen für Visual Studio 2008. Visual Studio 2010 wird, wie bekannt, nicht unterstützt.
Eine der Visual Studio Erweiterungen ist für das Erstellen und Debuggen von Widgets. Nick Randolph, MVP für Device Application Development hat bereits einen Post zu diesem Thema veröffentlicht.

[Update]

Peter Foot berichtet via Facebook, dass es sich bei den Emulatorimages um Windows Mobile in der Version 6.5.3 handelt.
Darüber hinaus scheint es so, dass das Windows Mobile 6 SDK vor der Installation des neuen SDKs deinstalliert werden sollte. Der Grund hierfür ist, dass ansonsten alle anderen Plattformen und Emulator Images aus dem Visual Studio verschwinden. Auch sind diese dann anscheinend nicht mehr im Device Emulator Manager vorhanden.



This posting is provided "AS IS" with no warranties, and confers no rights.

MSDN TV – Ausgabe 22.01.2010: Thema: PHP

22.01.2010 16:33:07 | Kay Giza

MSDN TV - Nachrichten für Entwickler - Folge vom 22.01.2010Im Mittelpunkt der ersten Folge von 'MSDN TV' im neuen Jahr 2010 steht das Thema 'PHP': in ungewohnt frostiger Atmosphäre spricht Moderator Jan Schenk dazu mit Björn Schotte, Chefredakteur der Zeitschrift 'PHP Magazin' und Mit-Geschäftsführer des Würzburger IT-Dienstleisters Mayflower. Im Interview geht’s u.a. um Microsofts allmähliche Annäherung an PHP, um Open Source und die deutsche PHP-Community.

In den Kurznachrichten außerdem Infos zur neuen Kategorie „Embedded Development“ beim „Imagine Cup”-Wettbewerb, zu Silverlight- und Expression-Lehrvideos aus der Community, ’Windows 7’-Seminaren für ISVs und „Windows Azure”-Nutzungsmöglichkeiten für Bezieher der MSDN Premium Subscription [18:12]


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



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

SQL Server 2008 Express und Windows Server 2008 64 Bit

22.01.2010 15:56:13 | Andre Kraemer

Ende November mietete ich mir einen Windows 2008 64 Bit VServer, auf dem ich einige Websites hosten wollte.

Einer der ersten Schritte nach der Freischaltung war die Installation des SQL Server 2008 Express inkl. Management Studio Express.

Nun ja, zumindest versuchte ich dies. Denn leider war weder eine manuelle Installation der SQL Server Express 64 Bit Variante erfolgreich, noch half der Weg über den Web Plattform Installer.

Statt dessen bekam ich folgende Fehlermeldung:

Der Befehlszeilenwert INSTANCESHAREDWOWDIR ist ungültig. Stellen Sie sicher, dass der angegebene Pfad gültig und nicht identisch mit dem Pfad für INSTANCESHAREDDIR ist.

Eine kurze Recherche im Netz ergab, dass dieses Problem auf IA64 Systemen auftritt, wenn man den SQL Server nicht im Standardpfad installiert. Als Abhilfe solle man das INSTALLSHAREDWOWDIR als Befehlszeilenparameter setzen.

Interessant, aber ich habe ein X64 System und wollte im Standardpfad installieren. Also scheint die Ursache doch eine andere zu sein.

Was anschließend folgte, waren endlose Nächte in denen ich versuchte den SQL Server zu installieren. Der Trick mit dem Befehlzeilenparameter brachte mich zwar über die Fehlermeldung, dafür konnte ich dann aber weder das SP1 noch das Management Studio Express installieren. Deinstallieren ging auch nicht mehr, denn auch dann kam die Meldung:

Der Befehlszeilenwert INSTANCESHAREDWOWDIR ist ungültig. Stellen Sie sicher, dass der angegebene Pfad gültig und nicht identisch mit dem Pfad für INSTANCESHAREDDIR ist.

Also hieß es nach jeder erfolglosen Installation erst mal: Windows 2008 Server neu installieren (lassen).

Mittlerweile war ich schon kurz davor aufzugeben. Glücklicherweise fand ich folgende Seite:

http://www.cannontrodder.net/2009/07/24/sql-server-2008-x64-on-windows-server-2008-x64-is-utterly-broken/

Hier hatte jemand das exakt gleiche Problem. Im Gegensatz zu mir hatte er jedoch eine Lösung gefunden, die die Installation des SP1 und des Managent Studios erlaubten.

Alles in allem sah meine Vorgehensweise zur Installation des SQL Servers auf einem nackten Windows 2008 System (außer vorinstalliertem PLESK und der VC++ 2005 Runtime war sonst nix drauf) wie folgt aus:

  1. .NET Framework 3.51 herunterladen und installieren
  2. Powershell als Feature im Server Management aktivieren
  3. SQL Server 2008 Express With Tool 64 Bit herunter laden (SQLEXPRWT_x64_DEU.exe)
  4. Starten des Setups, Verzeichnis in das das Setup entpackt wird notieren
  5. Setup Bildschirm geöffnet lassen, jedoch nichts klicken
  6. Öffnen eines Command-Prompts
  7. Navigation in das zuvor notierte Verzeichnis
  8. Eingeben der folgenden Befehlszeile: setup /action=install /INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server\\" /INSTALLSHAREDWOWDIR="C:\Program Files\Microsoft SQL Server Shared\\"
  9. Wizzard durchklicken
  10. Download des Sql Server 2008 SP 1 64 Bit (SQLServer2008SP1-KB968369-x64-DEU)
  11. Starten des SP 1 Setups (lief ohne Probleme)

Ich hoffe, dass ich anderen, die mit dem selben Problem kämpfen mit diesem Eintrag helfen kann!

An dieser Stelle auch noch mal vielen Dank an die Entwickler und Testabteilung des SQL Server 2008 Setups. Ohne euch hätte ich gar nicht gewusst, was ich an den vielen Abenden machen soll ...



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

Jetzt installieren: Ausserplanmaessiges Sicherheitsupdate fuer Internet Explorer (KB978207)

22.01.2010 15:45:50 | Kay Giza

Microsoft hatte in den vergangenen Tagen ausführlich über eine Sicherheitsanfälligkeit im Internet Explorer berichtet (Vorankündigung: Außerplanmäßiges Microsoft Sicherheitsupdate MS10-002 [Januar 2010]) und zahlreiche Kundenanfragen erhalten und beantwortet.

Bedrohungen dieser Art nehmen wir sehr ernst und haben aus diesem Grund ein so genanntes "out-of-band"-Update bzw. außerplanmäßiges Sicherheitsupdate veröffentlicht, das die beschriebene Sicherheitslücke schließt und Ihr System wirkungsvoll gegen Remote-Attacken dieser Art schützt. Das Sicherheitsupdate behebt diese Sicherheitsanfälligkeiten, indem geändert wird, wie Internet Explorer Objekte im Speicher verarbeitet, Eingabeparameter überprüft und HTML-Attribute filtert. Bitte installieren Sie umgehend das aktuelle Sicherheitsupdate auf allen PCs, die mit Windows und dem Internet Explorer ausgestattet sind.

Automatische Installation via: Microsoft Update (Empfehlung!)
Manuelle Installation via Download: Kumulatives Sicherheitsupdate für Internet Explorer (KB978207)

Hinweis: Falls Sie die empfohlene Funktion Microsoft Update nutzen und dort die automatische Installation aktiviert haben, wird das Update automatisch eingespielt. Prüfen Sie ggf. Ihren Updateverlauf über das Menü nach dem Aufruf des Microsoft Updates.

Mit diesem Sicherheitsupdate wird auch die Sicherheitsanfälligkeit behoben, die erstmals in der Microsoft-Sicherheitsempfehlung 979352 beschrieben wurde.


Wir haben in den letzten zwei Tagen zahlreiche Kundenanfragen zur Verfügbarkeit eines Sicherheitsupdates für die bekannte Lücke in allen Internet Explorer Versionen und damit verbundenen HTML Attacken bekommen. Wir wissen, dass gerade für Unternehmenskunden diese Information wichtig ist, weil sie entsprechende Ressourcen zum Einspielen des Updates auf den PCs der Mitarbeiter einplanen müssen. Deshalb war die Abwägung für oder gegen ein sogenanntes außerplanmäßiges Update nicht leicht. Wir sind aber davon überzeugt, dass ein außerplanmäßiges Update jetzt die richtige Entscheidung ist.

Um sich auch in Zukunft gut zu schützen, installieren Sie am besten zusätzlich auch den Internet Explorer 8 oder aktualisieren Ihren Internet Explorer 6 oder Internet Explorer 7. Immerhin waren Benutzer des Internet Explorer 8 vor den gegenwärtig verwendeten Angriffen gut geschützt. Dieser verfügt nämlich über erweiterte Sicherheitsfunktionen, wie beispielsweise Data Execution Prevention (DEP) (so aktivieren Sie DEP) und den Geschützten Modus (protected mode) sowie viele weitere effiziente Sicherheitsmechanismen wie beispielsweise einen Phishing-Filter.
 
Unseren Kunden raten wir generell zu einer erhöhter Aufmerksamkeit bei Links zu evtl. nicht vertrauenswürdigen Webseiten, zur Überprüfung der eigenen PC Sicherheit, insbesondere zur Installation einer aktuellen Antivirus Software (ich empfehle z.B. Microsoft Security Essentials (MSE) falls Sie noch keine Antivirus Software benutzen) und zur Aktivierung der Firewall (Informationen: Windows XP, Vista, Windows 7).

Des Weiteren untersucht Microsoft derzeit eine Anfälligkeit im Windows Kernel. Diese kann die Erhöhung von Berechtigungen ermöglichen. Bislang sind dazu keine Angriffe bekannt. Bitte entnehmen Sie aktuelle Informationen der Sicherheitsempfehlung: Microsoft-Sicherheitsempfehlung (979682)


Um bei sicherheitsrelevanten Themen aktuell informiert zu werden, empfehlen wir Ihnen, unsere kostenlosen englischsprachigen "Security Notification Service: Comprehensive Edition" zu abonnieren.

Weitere Details:

Um sich weitergehend mit dem Thema Computer und Sicherheit in der IT zu informieren, empfehle ich Ihnen sich auf folgenden Seiten regelmäßig zu informieren und automatisch den Computer über das kostenfreie Microsoft Update mit aktuellen (Sicherheits-) Updates zu aktualisieren:

 



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

Team Foundation Server 2010 für Einsteiger und kleine Teams

22.01.2010 15:26:38 | Christian Binder

Da Team Foundation Server 2010 jetzt auch eine ideale Plattform für Solo-Developer und kleinste Teams ist, hatte ich schon zum Thema einen Post geschrieben, in dem ich die Installation auf Windows 7 kurz beschrieben habe. Letzte Woche hatte ich mal kurz in meinem Blog mir die Zugriffszahlen angeschaut und festgestellt, dass der Eintrag weit mehr als 2000 direct Pageviews hat. Daraufhin habe ich mich entschieden kurzfristig 2 Webcasts für den TFS Basic aufzunehmen und aus der Webcast Planung von VS 2010 vorzuziehen. Enthalten ist die Konfiguration auf Windows 7 mit Version Control und integriertem Aufgaben und Bug Management. Im zweiten Teil zeige ich noch wofür man Version Control Branches und Team Builds verwendet und wie man alles notwendige dafür konfiguriert. Alles auf Windows 7. In Kürze natürlich auf  MSDN  zum Download. Oder hier:

Teil1

Teil2

Viel Spass
Chris  

Eine neue Folge "msdn tv - Nachrichten für Entwickler" ist online

22.01.2010 14:36:59 | Oliver Scheer

Im Mittelpunkt der ersten Folge von „msdn tv” im neuen Jahr steht das Thema „PHP”: in ungewohnt frostiger Atmosphäre spricht Moderator Jan Schenk dazu mit Björn Schotte, Chefredakteur der Zeitschrift „PHPmagazin” und Mit-Geschäftsführer des IT-Dienstleisters Mayflower. Im Interview geht’s unter anderem um Microsofts allmähliche Annäherung an PHP, um Open Source und die deutsche PHP-Community.
In den Kurznachrichten außerdem Infos zur neuen Kategorie „Embedded Development“ beim „Imagine Cup”-Wettbewerb, zu Silverlight- und Expression-Lehrvideos aus der Community, ’Windows 7’-Seminaren für ISVs und „Windows Azure”-Nutzungsmöglichkeiten für Bezieher der MSDN Premium Subscription.

Games for Windows

22.01.2010 14:35:37 | Oliver Scheer

Wie cool ist das denn?

Auf www.gamesforwindows.com gibt es massig Spiele für Windows. Teilweise für “umme”. Lädt man sich den Client für Games for Windows herunter, hat man den Games for WIndows Marketplace direkt auf dem Desktop und kann sich direkt diverse Klassiker herunter laden.

image

MSDN TV – Ausgabe 22.01.2010: Thema: PHP

22.01.2010 14:34:04 | Kay Giza

Im Mittelpunkt der ersten Folge von 'MSDN TV' im neuen Jahr 2010 steht das Thema 'PHP': in ungewohnt frostiger Atmosphäre spricht Moderator Jan Schenk dazu mit Björn Schotte, Chefredakteur der Zeitschrift 'PHP Magazin' und Mit-Geschäftsführer des Würzburger IT-Dienstleisters Mayflower. Im Interview geht’s u.a. um Microsofts allmähliche Annäherung an PHP, um Open Source und die deutsche PHP-Community.

In den Kurznachrichten außerdem Infos zur neuen Kategorie „Embedded Development“ beim „Imagine Cup”-Wettbewerb, zu Silverlight- und Expression-Lehrvideos aus der Community, ’Windows 7’-Seminaren für ISVs und „Windows Azure”-Nutzungsmöglichkeiten für Bezieher der MSDN Premium Subscription [18:12]

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



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

Jetzt installieren: Ausserplanmaessiges Sicherheitsupdate fuer Internet Explorer (KB978207)

22.01.2010 14:22:10 | Kay Giza

Microsoft hatte in den vergangenen Tagen ausführlich über eine Sicherheitsanfälligkeit im Internet Explorer berichtet (Vorankündigung: Außerplanmäßiges Microsoft Sicherheitsupdate MS10-002 [Januar 2010]) und zahlreiche Kundenanfragen erhalten und beantwortet.

Bedrohungen dieser Art nehmen wir sehr ernst und haben aus diesem Grund ein so genanntes "out-of-band"-Update bzw. außerplanmäßiges Sicherheitsupdate veröffentlicht, das die beschriebene Sicherheitslücke schließt und Ihr System wirkungsvoll gegen Remote-Attacken dieser Art schützt. Das Sicherheitsupdate behebt diese Sicherheitsanfälligkeiten, indem geändert wird, wie Internet Explorer Objekte im Speicher verarbeitet, Eingabeparameter überprüft und HTML-Attribute filtert. Bitte installieren Sie umgehend das aktuelle Sicherheitsupdate auf allen PCs, die mit Windows und dem Internet Explorer ausgestattet sind.

Automatische Installation via: Microsoft Update (Empfehlung!)
Manuelle Installation via Download: Kumulatives Sicherheitsupdate für Internet Explorer (KB978207)

Hinweis: Falls Sie die empfohlene Funktion Microsoft Update nutzen und dort die automatische Installation aktiviert haben, wird das Update automatisch eingespielt. Prüfen Sie ggf. Ihren Updateverlauf über das Menü nach dem Aufruf des Microsoft Updates.

Mit diesem Sicherheitsupdate wird auch die Sicherheitsanfälligkeit behoben, die erstmals in der Microsoft-Sicherheitsempfehlung 979352 beschrieben wurde.


Wir haben in den letzten zwei Tagen zahlreiche Kundenanfragen zur Verfügbarkeit eines Sicherheitsupdates für die bekannte Lücke in allen Internet Explorer Versionen und damit verbundenen HTML Attacken bekommen. Wir wissen, dass gerade für Unternehmenskunden diese Information wichtig ist, weil sie entsprechende Ressourcen zum Einspielen des Updates auf den PCs der Mitarbeiter einplanen müssen. Deshalb war die Abwägung für oder gegen ein sogenanntes außerplanmäßiges Update nicht leicht. Wir sind aber davon überzeugt, dass ein außerplanmäßiges Update jetzt die richtige Entscheidung ist.

Um sich auch in Zukunft gut zu schützen, installieren Sie am besten zusätzlich auch den Internet Explorer 8 oder aktualisieren Ihren Internet Explorer 6 oder Internet Explorer 7. Immerhin waren Benutzer des Internet Explorer 8 vor den gegenwärtig verwendeten Angriffen gut geschützt. Dieser verfügt nämlich über erweiterte Sicherheitsfunktionen, wie beispielsweise Data Execution Prevention (DEP) (so aktivieren Sie DEP) und den Geschützten Modus (protected mode) sowie viele weitere effiziente Sicherheitsmechanismen wie beispielsweise einen Phishing-Filter.
 
Unseren Kunden raten wir generell zu einer erhöhter Aufmerksamkeit bei Links zu evtl. nicht vertrauenswürdigen Webseiten, zur Überprüfung der eigenen PC Sicherheit, insbesondere zur Installation einer aktuellen Antivirus Software (ich empfehle z.B. Microsoft Security Essentials (MSE) falls Sie noch keine Antivirus Software benutzen) und zur Aktivierung der Firewall (Informationen: Windows XP, Vista, Windows 7).

Des Weiteren untersucht Microsoft derzeit eine Anfälligkeit im Windows Kernel. Diese kann die Erhöhung von Berechtigungen ermöglichen. Bislang sind dazu keine Angriffe bekannt. Bitte entnehmen Sie aktuelle Informationen der Sicherheitsempfehlung: Microsoft-Sicherheitsempfehlung (979682)


Um bei sicherheitsrelevanten Themen aktuell informiert zu werden, empfehlen wir Ihnen, unsere kostenlosen englischsprachigen "Security Notification Service: Comprehensive Edition" zu abonnieren.

Weitere Details:

Um sich weitergehend mit dem Thema Computer und Sicherheit in der IT zu informieren, empfehle ich Ihnen sich auf folgenden Seiten regelmäßig zu informieren und automatisch den Computer über das kostenfreie Microsoft Update mit aktuellen (Sicherheits-) Updates zu aktualisieren:



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

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

22.01.2010 13:54:53 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/22/msdn-tv-nachrichten-f-r-entwickler-ausgabe-01-2010.aspx'; tweetmeme_source = 'jansche';

Im Mittelpunkt der ersten Folge von „msdn tv” im neuen Jahr steht das Thema „PHP”: in ungewohnt frostiger Atmosphäre spricht Moderator Jan Schenk dazu mit Björn Schotte, Chefredakteur der Zeitschrift „PHPmagazin” und Mit-Geschäftsführer des IT-Dienstleisters Mayflower. Im Interview geht’s unter anderem um Microsofts allmähliche Annäherung an PHP, um Open Source und die deutsche PHP-Community.
In den Kurznachrichten außerdem Infos zur neuen Kategorie „Embedded Development“ beim „Imagine Cup”-Wettbewerb, zu Silverlight- und Expression-Lehrvideos aus der Community, ’Windows 7’-Seminaren für ISVs und „Windows Azure”-Nutzungsmöglichkeiten für Bezieher der MSDN Premium Subscription

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

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

Die Geschichte des ViewStates ist eine Geschichte mit ...

22.01.2010 09:43:51 | Andre Kraemer

vielen Missverständnissen. Eines dieser Missverständnisse ist die häufig anzutreffende Meinung, dass der ASP.NET ViewState für DropDownList Controls nicht abgeschaltet werden darf. Andernfalls würde die DropDownList den vom Anwender gewählten Wert beim Postback "verlieren".

Ein kleines Beispiel

Sehen wir uns zur Verdeutlichung ein kleines Beispiel an. Ein Entwickler - nennen wir ihn Herrn Brause -  hat die Aufgabe eine Webseite zu schreiben, auf der ein Anwender in einer DropDownListe auswählen kann, wie viele Zeilen Quellcode er heute schreiben kann. Nach der Bestätigung der Auswahl soll der entsprechende Wert auf der Webseite angezeigt werden.

Herr Brause macht sich schnell ans Werk und erstellt folgende Seite:

Screenshot der erstellen Webseite, bestehend aus Text und DropDownList  

Die DropDownListe füllt er mit folgendem Code.

    1 using System;

    2 using System.Web.UI.WebControls;

    3 

    4 publicpartialclass _Default : System.Web.UI.Page

    5 {

    6     protectedvoid Page_Load(object sender, EventArgs e)

    7     {

    8         if (!IsPostBack)

    9         {

   10             linesOfCodeDropDown.DataSource = GetLinesOfCodeListItems();

   11             linesOfCodeDropDown.DataBind();

   12         }

   13     }

   14 

   15     static ListItemCollection GetLinesOfCodeListItems()

   16     {

   17         var items = new ListItemCollection();

   18         for (int i = 0; i < 1000; i++)

   19         {

   20             items.Add(new ListItem(string.Format("{0} Codezeilen", i), i.ToString()));

   21         }

   22         return items;

   23     }

   24 

   25     protectedvoid sendButton_Click(object sender, EventArgs e)

   26     {

   27         linesOfCodeLiteral.Text = linesOfCodeDropDown.SelectedItem.Text;

   28     }

   29 }

   30 

Ein erster kleiner Test auf Herrn Brauses Rechner ergibt, dass die Webseite zufriedenstellend läuft. Stolz übergibt er sein Arbeitsergebnis an seinen Chef.

Nicht so schnell!

Kurz nach der Veröffentlichung der Seite mehren sich die Beschwerden von Anwendern, die an Standorten mit schlechten Internetverbindungen arbeiten. Sie klagen über extrem lange Ladezeiten.

Herr Brause nimmt sich dem Problem an und findet schnell heraus, dass sich mehr als ein Drittel der übertragenen Daten aus dem ViewState der Seite zusammen setzt. Von den insgesamt knapp 107 kB der Seite verteilen sich 40 kB auf den ViewState.

Bild der Seiten- und Viewstategröße.

Diese 40 kB werden übrigens nicht nur zum Client heruntergeladen, sondern bei jedem PostBack auch wieder zurück zum Server geschickt. Sie belasten die Seite also doppelt!

Was war noch mal der ViewState?

Ehe wir den ViewState gleich eliminieren werden, möchte ich zuvor schnell erklären, was genau wir überhaupt versuchen los zu werden.

Der ViewState speichert Werte von ASP.NET Controls anhand ihres Namens. Er ist vergleichbar mit einer Hashtable. Diese Name/Wert Paare serialisiert er in ein verstecktes Formularfeld mit dem Namen __VIEWSTATE. Nach einem Postback wird das __VIEWSTATE Feld deserialisiert und der Viewstate somit wieder hergestellt.

In unserem Beispiel sieht das __VIEWSTATE Feld so aus:

Bild des Seitenquelltexts mit Viewstate.  

Der tatsächliche Viewstate der Seite ist um einiges größer! Die Abbildung zeigt nur einen Ausschnitt.

Der ViewState dient übrigens als Datenspeicher für die meisten Controleigenschaften. Die Eigenschaft "DataSource" der DropDownList könnte daher zum Beispiel wie folgt implementiert sein:

    1 publicIEnumerable DataSource

    2 {

    3     get

    4     {

    5         return ViewState["DataSource"] asIEnumerable

    6     }

    7 

    8     set

    9     {

   10         ViewState["DataSource"] = value;

   11     }

   12 }

 

Also weg damit!

Um die übertragene Datenmenge seiner Seite zu reduzieren, schaltet Herr Brause also den ViewState der DropDownList ab. Da die DataSource der Liste nach einem PostBack nun nicht mehr automatisch gefüllt wird, entfernt er außerdem die Prüfung auf einen PostBack ehe er die DataSource der Liste füllt:

    1 protectedvoid Page_Load(object sender, EventArgs e)

    2 {

    3     linesOfCodeDropDown.DataSource = GetLinesOfCodeListItems();

    4     linesOfCodeDropDown.DataBind();

    5 }

Die anschließende Prüfung ergibt, dass der ViewState nun nur noch 0,05 kB beträgt und die komplette Seite nun über 40 kB kleiner geworden ist.

Der ViewState beträgt nun nur noch 0.05 kB

Leider ergibt der zweite Test, dass die Seite nun nicht mehr funktioniert. Egal was der Anwender auswählt, die Seite gibt immer "0 Codezeilen" aus. Dies liegt daran, dass der "SelectedIndex" der Liste innerhalb des Button Click Events immer 0 ist.

Im folgenden Screenshot wurde zum Beispiel "5 Codezeilen" ausgewählt und anschließend auf Absenden geklickt.

Obwohl der Anwender den Wert 5 auswählte, wird nur eine 0 dargestellt.

Ist der ViewState also dafür zuständig, die Auswahl des Anwenders in das Servercontrol zu schreiben?

Nein!

Auch wenn diese Vermutung zunächst nahe liegt, ist sie vollkommen falsch. Um das Rätsel zu lösen, muss man sich kurz den ASP.NET Page Life Cycle vor Augen halten.

Dieser teilt sich in folgende Phasen auf:

  1. Page Request
  2. Start
  3. Page Initialization
  4. Load
  5. Validation
  6. Postback event handling
  7. Rendering
  8. Unload

Interessant für unsere Situation sind die Phasen PageInitialization und Load.

In der Phase PageInitialization werden die folgenden Methoden durchlaufen:

OnInit

Alle Controls der Seite sind bereits erstellt worden. Deklarativ in der ASPX Seite festgelegte Werte wurden zugewiesen. ViewState und durch den Anwender gepostete Wertewurden noch nicht in die Controleigenschaften geschrieben

OnInitComplete

Wird aufgerufen, nachdem das die Methode OnInit durchgelaufen ist.

OnPreLoad

Wird aufgerufen, ehe die Phase Load begonnen wird.

In der Phase Load werden unter anderem die folgenden Methoden durchlaufen

LoadViewState

In dieser Methode wird der ViewState zurück in die Seite und die Controls geschrieben. In unserem ursprünglichen Beispiel würde hier also die DataSource Eigenschaft der DropDownList gefüllt werden.

ProcessPostData

Diese Methode schreibt die durch den Benutzer geposteten Werte in die Controls. In unserem Beispiel wird hier also der selektierte Wert der DropDownList gesetzt.

PageLoad

Wenn diese Methode ausgeführt wird, ist die Seite vollständig initialisiert. In unserem Ursprünglichen Beispiel haben wir hier die DataSource der DropDownList gesetzt.

Die Events der einzelnen Controls, also zum Beispiel das Event Click unseres Buttons werden übrigens in einer späteren Phase, nämlich der Phase PostBack Event Handling ausgelöst.

Interessant, aber was hat es mit unserem Problem zu tun?

Auch wenn der kleine Exkurs in Richtung Page Life Cycle sicherlich (vielleicht ;-)) sehr interessant war, stellt sich die Frage, wo der Zusammenhang zu unserem Problem der fehlenden geposteten Daten besteht.

Nun, dies ist eigentlich ganz einfach. Ursprünglich lief unsere Seite wie folgt:

Erster Request:

Setzen der DataSource Eigenschaft in der Methode Page_Load.

PostBack

Automatisches Wiederherstellen der DataSource Eigenschaft in der Methode LoadViewState, anschließend automatisches Zuweisen des durch den Anwender ausgewählten Werts in ProcessPostData.

Durch unsere Änderungen, nämlich das Deaktivieren des ViewStates und der Entfernung der Prüfung auf einen PostBack in Page_Load haben wir nun folgendes Bewirkt:

Erster Request:

Setzen der DataSource Eigenschaft in der Methode Page_Load.

PostBack

Automatisches Zuweisen des durch den Anwender ausgewählten Werts in ProcessPostData. Da die DropDownListe jedoch noch keine DataSource hat, kann dies hier noch nicht funktionieren. Die DataSource wird erst anschließend in Page_Load gesetzt.

Und das bedeutet?

Das bedeutet, dass die "fehlenden" geposteten Werte eigentlich gar nichts mit dem deaktivierten ViewState zu tun hatten. Die Ursache ist einfach die Tatsache, dass wir die DataSource setzen, nachdem die Daten des Anwenders in das Control geschrieben wurden.

Und die Lösung?

Die Lösung ist recht einfach. Der Code, der die DataSource der DropDownList setzt muss einfach ausgeführt werden, ehe ProcessPostData durchlaufen wird. Typischerweise nimmt man dazu die Methode OnInit.

    1 protectedoverridevoid OnInit(EventArgs e)

    2 {

    3     linesOfCodeDropDown.DataSource = GetLinesOfCodeListItems();

    4     linesOfCodeDropDown.DataBind();

    5 }

    6 

    7 protectedvoid Page_Load(object sender, EventArgs e)

    8 {

    9 }

Fazit

Der ViewState einer DropDownList darf sehr wohl deaktiviert werden. Um das Problem der "fehlenden" geposteten Werte in den Griff zu bekommen, muss lediglich die Zuweisung der DataSource an einen früheren Zeitpunkt innerhalb des Page Life Cycle verschoben werden.

Wer mehr zu dem Thema wissen möchte, sollte sich übrigens in jedem Fall Dave Reeds Artikel Truly Understanding ViewState durchlesen. Eine umfangreichere und vor allem bessere Behandlung des Themas habe ich bisher an keiner anderen Stelle im Web gefunden.

Wer mehr über den ASP.NET Page Life Cycle wissen möchte, dem kann ich den Artikel Der Lebenszyklus einer ASP.NET 2.0 Seite empfehlen.

Tja und wer gar nichts mehr mit ViewState oder Page Life Cycle zu tun haben möchte, der sollte zum ASP.NET MVC Framework greifen;-)



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

Temporäre Stored Procedures in SQL-Server

21.01.2010 23:13:00 | Martin Hey

Um sehr rechenintensive Operationen im SQL-Server durchzuführen, bietet es sich an, zu geeigneten Zeitpunkten Zwischenergebnisse zu generieren, diese zu speichern und dann auf Basis dieser Ergebnisse weiterzuarbeiten. Nun besitzt aber nicht jeder Benutzer Berechtigungen, in Datenbanken Tabellen nach Lust und Laune zu erstellen oder in bestehenden Tabellen Datensätze anzufügen, zu löschen oder zu manipulieren.
Zur Lösung dieses Problems bieten sich temporäre Tabellen an. Mit Hilfe des Zeichens # vor dem Tabellennamen wird dem Server signalisiert, dass keine physische Tabelle in der Datenbank erstellt werden soll, sondern vielmehr eine temporäre. Natürlich hat diese auch eine physische Repräsentation (in der tempdb) aber das soll hier keine Rolle spielen. Vorteil dieser Tabellen ist, dass sie nur im aktuellen Kontext gültig sind und über keinerlei Berechtigungseinschränkungen verfügen. Über die Anzahl der # wird definiert, ob sie nur in der aktuellen Session oder global gültig sein soll.
SELECT [Id], [Firstname], [Lastname], [Street], [Zipcode], [City]
INTO #MyAddressTable
FROM MyComplexLongRunningAddressView

/* do further calculations */

Doch dieses Feature gibt es nicht nur Tabellen. Nach dem gleichen Muster können auch nur für den aktuellen Kontext gültige Stored Procedures erstellt werden.
CREATE PROCEDURE #DoSomeComplexCalculations(@id as int)
AS
BEGIN
/*complex calculations*/
END
GO

EXEC #DoSomeComplexCalculations 1
EXEC #DoSomeComplexCalculations 2

Die Prozedur wird automatisch wieder gelöscht, wenn die Session beendet wird.

Sicher: In den meisten Fällen wird es am sinnvollsten sein, richtige Stored Procedures zu erstellen, die dann auch allen Benutzern zur Verfügung stehen und nicht ständig wieder neu erstellt werden müssen - aber ich bin mir sicher, dass es auch den ein oder anderen Anwendungsfall gibt, in dem es sinnvoll ist, auf diese temporären Objekte zurückzugreifen.

Kostenlose Windows 7 Workshops: Auch 2010 wieder und mit neuem Programm

21.01.2010 18:14:27 | Kay Giza

Wenn etwas gut läuft, gibt es keinen Grund es nicht auch weiterhin gut laufen zu lassen. Gesagt getan, auch im dies Jahr werden wir wieder die beliebten Windows 7 Workshops für Softwarehersteller und Softwareentwickler anbieten. Mit einer frischen Agenda ist der Schwerpunkt ein wenig mehr Richtung Entwickler verschoben worden. Themen, die in der neuen Veranstaltungserie behandelt werden sind: Windows 7 Anwendungskompatibilität, Windows 7 Logo, Benutzerkontensteuerung, Windows Error Reporting, High DPI, neue Features in Windows 7 sowie .NET 4.0 im Zusammenspiel mit Windows 7.

Termine:

Anmeldung: KOSTENFREI!
Die Veranstaltungen beginnen jeweils und immer um 10.00 Uhr und enden in der Regel gegen 17.00 Uhr. Ihre Anmeldungen schicken Sie bitte einfach an die E-Mail-Adresse fitmit7@microsoft.com. Die Registrierung sowie Teilnahme ist kostenfrei. Weitere Informationen zu dieser Veranstaltungsserie finden Sie auch bei den Kollegen im Blog Softwarehersteller in Deutschland.

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

Silverlight-Comic oder gern auch TheOliver.Comic

21.01.2010 18:00:56 | Kay Giza

Unter dem Projektnamen TheOliver.Comic hat Kollege Oliver Scheer auf Codeplex (Microsofts Open Source Plattform) sein Mini-Comic-Framework für Silverlight veröffentlicht. Darin enthalten sind bereits alle wichtigen Basiselemente für die Erstellen von Silverlight-basierten, aktiven Comic-Strips. Der Sourcecode für diese Engine ist kostenfrei verfügbar. Interessierte können gerne an diesem Projekt mit entwickeln. Einfach bei Codeplex registrieren und Mitglied in der Projektgruppe werden.

Link: TheOliver.Comic
Demo: The-Oliver.com » Comic » Live-Demo

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

Was ist MSDN Online Deutschland? Was bietet MSDN alles? Was gibt es kostenlos?

21.01.2010 17:41:23 | Kay Giza

Vielleicht hat sich die Eine oder der Andere schon mal gefragt, was dieses MSDN ist, ob das kostenfrei ist, ob MSDN Online das Gleiche ist wie die MSDN Subscription, ob es die über 800 Webcasts oder beispielsweise über 400 CodeClips mit dazugehörigem technischen Artikel (Eine Frage, eine Antwort) wirklich kostenlos gibt. Und dies sogar alles in deutscher Sprache?

Wenn Sie wirklich eine dieser Fragen haben oder generelles Interesse besteht, MSDN kennenzulernen, so empfehle ich meinen Artikel den ich im MSDN Forum verfasst habe.

Aber fangen wir hier kurz an und gehen dann ins Forum über:

Sie sind auf der Suche nach Informationen und Wissen rund um die Entwicklungsplattform von Microsoft? Dann ist www.msdn-online.de die erste und beste Adresse für Sie.
Mit diesem Artikel möchte ich gerne allen Interessierten, Einsteigern oder Besuchern von MSDN Online, die uns vielleicht schon lange nicht mehr besucht haben, einen Überblick geben und gerne zum Austausch und Dialog zu unseren Angeboten ermutigen.

MSDN - ist das offizielle Microsoft Developer Network. Mit MSDN Online unterstützt Microsoft Entwickler mit einem reichhaltigen Angebot von Online- und Offline-Services und liefert mit seinem umfangreichen Know-how-Fundus effiziente Hilfe, wenn es um Fragen der Anwendungsprogrammierung auf Basis von Microsoft-Produkten und -Technologien geht. Angefangen beim .NET Framework, den verschiedenen .NET-Sprachen und der Entwicklungsumgebung Visual Studio, über Windows und Webprogrammierung, bis hin zur Entwicklung für mobile Plattformen bietet Ihnen MSDN Online genug Treibstoff, um Ihre Probleme und Fragen hinter sich zu lassen und Ihre Ziele schnell zu erreichen. Natürlich auch zu neuen Themen und Technologien wie Windows 7, Cloud Computing, Silverlight oder Multicore-Programmierung.

Für detaillierte Informationen empfehle ich Ihnen diesen Artikel: Was ist MSDN Online Deutschland?

MSDN Online - das offizielle Microsoft Developer Network



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

Kostenlose Windows 7 Workshops: Auch 2010 wieder und mit neuem Programm

21.01.2010 12:53:04 | Kay Giza

Wenn etwas gut läuft, gibt es keinen Grund es nicht auch weiterhin gut laufen zu lassen. Gesagt getan, auch im dies Jahr werden wir wieder die beliebten Windows 7 Workshops für Softwarehersteller und Softwareentwickler anbieten. Mit einer frischen Agenda ist der Schwerpunkt ein wenig mehr Richtung Entwickler verschoben worden. Themen, die in der neuen Veranstaltungserie behandelt werden sind: Windows 7 Anwendungskompatibilität, Windows 7 Logo, Benutzerkontensteuerung, Windows Error Reporting, High DPI, neue Features in Windows 7 sowie .NET 4.0 im Zusammenspiel mit Windows 7.

Termine:

Anmeldung: KOSTENFREI!
Die Veranstaltungen beginnen jeweils und immer um 10.00 Uhr und enden in der Regel gegen 17.00 Uhr. Ihre Anmeldungen schicken Sie bitte einfach an die E-Mail-Adresse fitmit7@microsoft.com. Die Registrierung sowie Teilnahme ist kostenfrei. Weitere Informationen zu dieser Veranstaltungsserie finden Sie auch bei den Kollegen im Blog Softwarehersteller in Deutschland.

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

Silverlight-Comic oder gern auch TheOliver.Comic

21.01.2010 12:46:25 | Kay Giza

Unter dem Projektnamen TheOliver.Comic hat Kollege Oliver Scheer auf Codeplex (Microsofts Open Source Plattform) sein Mini-Comic-Framework für Silverlight veröffentlicht. Darin enthalten sind bereits alle wichtigen Basiselemente für die Erstellen von Silverlight-basierten, aktiven Comic-Strips. Der Sourcecode für diese Engine ist kostenfrei verfügbar. Interessierte können gerne an diesem Projekt mit entwickeln. Einfach bei Codeplex registrieren und Mitglied in der Projektgruppe werden.

Link: TheOliver.Comic
Demo: The-Oliver.com » Comic » Live-Demo

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

Was ist MSDN Online Deutschland? Was bietet MSDN alles? Was gibt es kostenlos?

21.01.2010 12:41:30 | Kay Giza

Vielleicht hat sich die Eine oder der Andere schon mal gefragt, was dieses MSDN ist, ob das kostenfrei ist, ob MSDN Online das Gleiche ist wie die MSDN Subscription, ob es die über 800 Webcasts oder beispielsweise über 400 CodeClips mit dazugehörigem technischen Artikel (Eine Frage, eine Antwort) wirklich kostenlos gibt. Und dies sogar alles in deutscher Sprache?

Wenn Sie wirklich eine dieser Fragen haben oder generelles Interesse besteht, MSDN kennenzulernen, so empfehle ich meinen Artikel den ich im MSDN Forum verfasst habe.

Aber fangen wir hier kurz an und gehen dann ins Forum über:

Sie sind auf der Suche nach Informationen und Wissen rund um die Entwicklungsplattform von Microsoft? Dann ist www.msdn-online.de die erste und beste Adresse für Sie.
Mit diesem Artikel möchte ich gerne allen Interessierten, Einsteigern oder Besuchern von MSDN Online, die uns vielleicht schon lange nicht mehr besucht haben, einen Überblick geben und gerne zum Austausch und Dialog zu unseren Angeboten ermutigen.

MSDN - ist das offizielle Microsoft Developer Network. Mit MSDN Online unterstützt Microsoft Entwickler mit einem reichhaltigen Angebot von Online- und Offline-Services und liefert mit seinem umfangreichen Know-how-Fundus effiziente Hilfe, wenn es um Fragen der Anwendungsprogrammierung auf Basis von Microsoft-Produkten und -Technologien geht. Angefangen beim .NET Framework, den verschiedenen .NET-Sprachen und der Entwicklungsumgebung Visual Studio, über Windows und Webprogrammierung, bis hin zur Entwicklung für mobile Plattformen bietet Ihnen MSDN Online genug Treibstoff, um Ihre Probleme und Fragen hinter sich zu lassen und Ihre Ziele schnell zu erreichen. Natürlich auch zu neuen Themen und Technologien wie Windows 7, Cloud Computing, Silverlight oder Multicore-Programmierung.

Für detaillierte Informationen empfehle ich Ihnen diesen Artikel: Was ist MSDN Online Deutschland?

MSDN Online - das offizielle Microsoft Developer Network



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

Vorankuendigung: Ausserplanmaessiges Microsoft Sicherheitsupdate MS10-002 [Januar 2010]

21.01.2010 12:36:43 | Kay Giza

Die Sicherheit unserer Kunden und Partner ist für Microsoft ein vordringliches Anliegen. Um Sie beim sicheren Betreiben Ihrer IT-Infrastruktur optimal zu unterstützen, wird Microsoft eine außerplanmäßige Sicherheitsaktualisierung (MS10-002) (Details) veröffentlichen, geplant für Donnerstag, 21.01.2010 gegen 19.00 Uhr. Diese wird - soweit meine Information - alle unterstützten Versionen von Windows Internet Explorer ab der Version 6 betreffen.

Solche außerplanmäßigen Sicherheitsaktualisierungen werden von uns nur aus wichtigen Gründen veröffentlicht und sollten daher umgehend installiert werden. Diese Vorabinformation soll Ihnen helfen, die außerplanmäßigen Sicherheitsaktualisierungen auch in Ihrem Unternehmen bzw. auf Ihrem Privat Computer (via kostenfreiem Microsoft Update) möglichst rasch zum Einsatz zu bringen.

Um sich auch in der Zwischenzeit gut zu schützen, installieren Sie am besten den Internet Explorer 8. Die uns gegenwärtig bekannten Angriffe haben keine Auswirkung auf Benutzer des Internet Explorer 8, da dieser über erweiterte Sicherheitsfunktionen verfügt. Internet Explorer 8 enthält weitreichende Sicherheitsmechanismen wie Data Execution Prevention (DEP) (so aktivieren Sie DEP) und den Geschützten Modus (protected mode), die die derzeit bekannten Angriffe unwirksam machen.
 
Unseren Kunden raten wir weiterhin zu erhöhter Aufmerksamkeit bei Links zu evtl. nicht vertrauenswürdigen Webseiten, zur Überprüfung der eigenen PC Sicherheit, insbesondere zur Installation einer aktuellen Antivirus Software (ich empfehle beispielsweise Microsoft Security Essentials (MSE) falls Sie noch keine Antivirus Software benutzen) und zur Aktivierung der Firewall (Informationen: Windows XP, Vista, Windows 7).
 
Bedauerlicherweise müssen wir feststellen, dass eines unserer Produkte für kriminelle Aktivitäten benutzt wurde. Deshalb arbeiten wir zusammen mit Google, anderen Partnern in der Software-Industrie und internationalen Behörden daran, den Sachverhalt aufzuklären.

Detaillierte Informationen hat Microsoft in sogenannten "Security Advisories" zusammengestellt:
Die neue Version des Security Advisory 979352 ist im Internet verfügbar unter: Microsoft Security Advisory (979352) - Vulnerability in Internet Explorer Could Allow Remote Code Execution
Deutschsprachige Version des Sicherheitsempfehlung 979352: Microsoft-Sicherheitsempfehlung (979352) - Sicherheitsanfälligkeit in Internet Explorer kann Remotecodeausführung ermöglichen

Um von der Veröffentlichung der Sicherheitsaktualisierung per E-Mail informiert zu werden und auch in Zukunft sicherheitsrelevante Informationen automatisch zu bekommen, können Sie die „Microsoft Security Notification Service: Comprehensive Version“ abonnieren.

Weitere Details:

Um sich weitergehend mit dem Thema Computer und Sicherheit in der IT zu informieren, empfehle ich Ihnen sich auf folgenden Seiten regelmäßig zu informieren und automatisch den Computer über das kostenfreie Microsoft Update mit aktuellen (Sicherheits-) Updates zu aktualisieren:



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

Vorankuendigung: Ausserplanmaessiges Microsoft Sicherheitsupdate MS10-002 [Januar 2010]

21.01.2010 09:16:58 | Kay Giza

Die Sicherheit unserer Kunden und Partner ist für Microsoft ein vordringliches Anliegen. Um Sie beim sicheren Betreiben Ihrer IT-Infrastruktur optimal zu unterstützen, wird Microsoft eine außerplanmäßige Sicherheitsaktualisierung (MS10-002) (Details) veröffentlichen, geplant für Donnerstag, 21.01.2010 gegen 19.00 Uhr. Diese wird - soweit meine Information - alle unterstützten Versionen von Windows Internet Explorer ab der Version 6 betreffen.

Solche außerplanmäßigen Sicherheitsaktualisierungen werden von uns nur aus wichtigen Gründen veröffentlicht und sollten daher umgehend installiert werden. Diese Vorabinformation soll Ihnen helfen, die außerplanmäßigen Sicherheitsaktualisierungen auch in Ihrem Unternehmen bzw. auf Ihrem Privat Computer (via kostenfreiem Microsoft Update) möglichst rasch zum Einsatz zu bringen.

Um sich auch in der Zwischenzeit gut zu schützen, installieren Sie am besten den Internet Explorer 8. Die uns gegenwärtig bekannten Angriffe haben keine Auswirkung auf Benutzer des Internet Explorer 8, da dieser über erweiterte Sicherheitsfunktionen verfügt. Internet Explorer 8 enthält weitreichende Sicherheitsmechanismen wie Data Execution Prevention (DEP) (so aktivieren Sie DEP) und den Geschützten Modus (protected mode), die die derzeit bekannten Angriffe unwirksam machen.
 
Unseren Kunden raten wir weiterhin zu erhöhter Aufmerksamkeit bei Links zu evtl. nicht vertrauenswürdigen Webseiten, zur Überprüfung der eigenen PC Sicherheit, insbesondere zur Installation einer aktuellen Antivirus Software (ich empfehle beispielsweise Microsoft Security Essentials (MSE) falls Sie noch keine Antivirus Software benutzen) und zur Aktivierung der Firewall (Informationen: Windows XP, Vista, Windows 7).
 
Bedauerlicherweise müssen wir feststellen, dass eines unserer Produkte für kriminelle Aktivitäten benutzt wurde. Deshalb arbeiten wir zusammen mit Google, anderen Partnern in der Software-Industrie und internationalen Behörden daran, den Sachverhalt aufzuklären.

Detaillierte Informationen hat Microsoft in sogenannten "Security Advisories" zusammengestellt:
Die neue Version des Security Advisory 979352 ist im Internet verfügbar unter: Microsoft Security Advisory (979352) - Vulnerability in Internet Explorer Could Allow Remote Code Execution
Deutschsprachige Version des Sicherheitsempfehlung 979352: Microsoft-Sicherheitsempfehlung (979352) - Sicherheitsanfälligkeit in Internet Explorer kann Remotecodeausführung ermöglichen

Um von der Veröffentlichung der Sicherheitsaktualisierung per E-Mail informiert zu werden und auch in Zukunft sicherheitsrelevante Informationen automatisch zu bekommen, können Sie die „Microsoft Security Notification Service: Comprehensive Version“ abonnieren.

Weitere Details:

Um sich weitergehend mit dem Thema Computer und Sicherheit in der IT zu informieren, empfehle ich Ihnen sich auf folgenden Seiten regelmäßig zu informieren und automatisch den Computer über das kostenfreie Microsoft Update mit aktuellen (Sicherheits-) Updates zu aktualisieren:

 



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

BizTalk: Checkliste für das Senden von AS2-Nachrichten

20.01.2010 20:29:00 | Wolfgang Kluge

Nach der Checkliste für das Empfangen von Nachrichten über AS2, muss quasi ja auch eine Checkliste für das Senden bereitgestellt werden ;) Diese Liste ist wesentlich kürzer, wenn es auch mehr Möglichkeiten gibt, als hier dargestellt...

  1. Send Port
    - für asynchrone MDN: One-way
    - für synchrone MDN: Solicit-Response
    • Type: HTTP
      • Destionation URL: Die URL, die beim Partner eingerichtet wird (auf beiden Seiten sollte die URL exakt gleich angegeben werden - inkl. Groß-/Kleinschreibung)
      • Enabled chunked encoding deaktivieren
    • Send pipeline
      • AS2Send (für alle möglichen Daten),
      • AS2EDISend (für EDI-Daten) oder
      • eine eigene Send Pipeline, in der die AS2 Encoder-Component verwendet wird
  2. Sender Party
    • General
      • Send Ports (den oben erstellen Port auswählen, alternativ geht die Zuweisung auch über einen Role Link oder wie unten beschrieben über den Alias-Namen)
    • AS2 Properties -> Party as AS2 Message Receiver (nicht verwirren lassen)
      • Einstellungen ab "Outbound AS2 Message" entsprechend der Vereinbarung mit dem Partner einstellen
      • AS2-From und AS2-To erscheinen wie hier angegeben im Head-Bereich der Nachricht und damit beim Partner
  3. Asynchrone MDNs müssen - wie eine beliebig andere AS2-Nachricht - empfangen werden können. An welche Adresse die MDN geschickt wird, kann in den Party-Einstellungen angegeben (Receipt-Delivery-Option) werden. Um die Verarbeitung dieser Nachrichten kümmert sich allerdings der BizTalk-Server selbst.

Die Party Resolution für ausgehende Nachrichten (also das Finden der Party, die die Nachricht empfängt und bei der die entsprechenden Einstellungen vorgenommen wurden) kann auch anders erfolgen. Das zuweisen des Send-Ports zu einer Party wird aber (meiner Erfahrung nach) sehr häufig verwendet. Es sollte allerdings auch ausreichen, einer Party einen EDIINT-AS2-To - Alias und der ausgehenden Nachricht den AS2-To - Header zuzuweisen - getestet hab ich das noch nicht.

Für die Signierung und Verschlüsselung der Nachricht und der Signierung der MDN müssen zusätzlich Zertifikate installiert und an bestimmten Stellen ausgewählt werden, die in dieser kleinen Übersicht beschrieben werden.

EventLog remote einsammeln per WMI verursacht quota violation Fehler

20.01.2010 19:28:00 | Timo Rehl

Wir bekommen sehr häufig den Fehler "quota violation" wenn wir über remote WMI versuchen EventLog Einträge zu sammeln. Hierfür gibt es auch einen Microsoft Support Beitrag, der allerdings für uns keine Lösung brachte. Selbst der dort vorhandene Hotfix brachte keine Verbesserung.

Wir hatten sogar einen Microsoft Call aufgemacht, bekommen aber nur den Workaround vorgeschlagen: Limitieren Sie die Datenmenge indem sie per WHERE Klausel die Datenmenge einschränken. Jetzt gehen wir doch schon so vor, dass wir EventLogs nur tagesweise per WMI anfordern, doch die Datenmenge ist immer noch zu groß.

Leider ist es auch nicht möglich vorher abzufragen wie viele Ereigniseinträge denn die Abfrage holen würde, ein Count(*) ist für diese Abfrage nicht zulässig. Eine andere Möglichkeit die Datenmenge vorab zu ermitteln ist mir nicht bekannt.

Jetzt bauen wir den Sammler so um, dass er in einer Schleife die Ereignisse in konfigurierbaren Zeitintervallen aufteilt und abfragt. Wir hoffen, dass wir das Intervall so klein wählen, dass die Datenmenge nicht überschritten wird.

TIPP: Also kann ich allen, die per WMI Ereignisprotokolle auslesen nur raten:
Baut schon von vornherein solch eine Möglichkeit ein, dass ihr die Ereignisse mit Zeitintervallen einteilen lassen könnt und holt Euch die Daten Häppchenweise.

Windows 7 Workshops – im neuen Jahr mit neuem Programm!

20.01.2010 13:08:30 | Oliver Scheer

Auch im aktuellen Jahr werden wir wieder die beliebten Windows 7 Workshops für Softwarehersteller anbieten. Mit einer frischen Agenda ist der Schwerpunkt ein wenig mehr Richtung Entwickler verschoben worden. Themen, die in der neuen Veranstaltungserie behandelt werden sind: Windows 7 Anwendungskompatibilität, Windows 7 Logo, Benutzerkontensteuerung, Windows Error Reporting, High DPI, neue Features in Windows 7 und .NET 4.0 im Zusammenspiel mit Windows 7.

Termine:

Die Veranstaltungen beginnen um 10 Uhr, enden ca. gegen 17 Uhr und sind kostenfrei. Ihre Anmeldungen schicken Sie bitte einfach an unsere E-Mail-Adresse fitmit7@microsoft.com. Weitere Informationen zu dieser Veranstaltungsserie finden Sie auch im Blog Softwarehersteller in Deutschland.

Windows 7 Workshops – im neuen Jahr mit neuem Programm!

20.01.2010 12:59:04 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/20/windows-7-workshops-im-neuen-jahr-mit-neuem-programm.aspx'; tweetmeme_source = 'jansche';

Auch im kommenden Jahr werden wir wieder die beliebten Windows 7 Workshops für Softwarehersteller anbieten. Mit einer frischen Agenda ist der Schwerpunkt ein wenig mehr Richtung Entwickler verschoben worden. Themen, die in der neuen Veranstaltungserie behandelt werden sind: Windows 7 Anwendungskompatibilität, Windows 7 Logo, Benutzerkontensteuerung, Windows Error Reporting, High DPI, neue Features in Windows 7 und .NET 4.0 im Zusammenspiel mit Windows 7.

Termine:

· 26.01.2010 in Böblingen

· 15.02.2010 in Bad Homburg

· 30.03.2010 in Köln

· 26.04.2010 in Köln

· 28.04.2010 in München

· 28.05.2010 in Hamburg

· 21.06.2010 in Berlin

Die Veranstaltungen beginnen um 10 Uhr, enden ca. gegen 17 Uhr und sind kostenfrei. Schickt eure Anmeldungen bitte einfach an unsere E-Mail-Adresse fitmit7@microsoft.com. Weitere Informationen zu dieser Veranstaltungsserie findet ihr auch im Blog Softwarehersteller in Deutschland.

Mein erster Webcast ist im MSDN erschienen!

20.01.2010 10:48:00 | Lars Keller

Ich habe gerade erfahren, dass ein Webcast von mir im MSDN abrufbar ist! Es handelt sich um ein Zusatzkapitel “Debugging und Refactoring” meines Videotrainings für Einsteiger “Visual C# 2008 - Der umfassende Einstieg”.

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

Coole Sache!!! :-)

Neues Budget für das INETA Deutschland Speakers Bureau

20.01.2010 10:10:00 | Lars Keller

Passend zum neuen Jahr hat das INETA Deutschland Speakers Bureau wieder ein neues Budget bekommen. Vielen Dank an Microsoft Deutschland für die nette Spende. :)

Ab nun können wieder INETA User Groups Leads Reisekostenunterstützung für Sprecher bei mir anfordern. Die Liste der Sprecher hat sich wieder vergrößert! Es stehen nun insgesamt 19 Sprecher zur Auswahl:

Wie man einen Sprecher anfordern kann, ist hier beschrieben.

Letztes Jahr wurden 28 mal User Group Abende durch das INETA Deutschland Speaker Bureau unterstützt. Seitdem das Speakers Bureau existiert, wurden insgesamt 55 Sprecherreisen ermöglicht. Dieses Jahr haben schon 5 User Groups bzgl. eines Reisekostenzuschusses angefragt.           

Wir freuen uns sehr, dass das Speaker Bureau so stark frequentiert wird und hoffen auf einen regen Austausch im Jahr 2010!

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

Teamspeak Sidebar Gadget - Teamspeak 3 Flooding Ban - Error

20.01.2010 07:02:00 | Andreas Mehl

In the new teamspeak 3 beta 15 server versions there exists a new protection handling against flooding and etc.

if you can't connect through my gadget to the server to get user status, server status, viewer infos you have to do following:



add a File (query_ip_whitelist.txt) with my Query IP's

to the TS3 Server root directory.


My Sidebar Gadget Server IP's are following:

80.190.204.162

The alternative IP / domain, if the above fails is

(for alternative use only the domain name, dont try to get the ip):

am-blog.no-ip.org

 

Restart your Server



Have fun ;P

 

ASP / ASP.NET MVP 2010

19.01.2010 20:23:00 | Peter Bucher

Anfang Jahr erhielt ich eine Email von Microsoft, das ich für das Jahr 2010 renominiert wurde :)

Das freut mich ungemein und ich möchte mich bei den Betreibern und Moderatoren von ASP.NET Zone und myCSharp bedanken.
Diese Auszeichnung durfte ich jetzt schon das vierte Mal in Folge entgegennehmen, wobei 4 meine Lieblingszahl ist :)

Sicherlich finde ich die Zeit auch mal in Konstanz beim .NET Stammtisch Konstanz / Kreuzlingen vorbeizuschauen und einen Vortrag zu halten.

Auf ein erfolgreiches Jahr 2010!

BizTalk: Behandlung von SOAP Fault Nachrichten in custom pipeline Komponenten

19.01.2010 16:18:00 | Timo Rehl

Heute habe ich für eine unserer BizTalk Send Pipeline Komponente ein Handling für SOAP Fault Nachrichten vorgesehen. Alle Recherchen, die ich im Internet gefunden habe beziehen sich auf WebServices und WCF Adapter, die solch eine Meldung "von außen" bekommen. Mein unten aufgeführter Helfer kann höchstwahrscheinlich nicht mit SOAP Faults umgehen, die nicht von BizTalk erzeugt wurden.

Mein Helfer behandelt ein anderes Szenario. Ich wollte die SOAP Fault Nachrichten behandeln, die von BizTalk erzeugt worden sind (in aller Regel Routing Failures oder missing correlation token oder disposed service handler). Die von BizTalk erzeugten SOAP Fault Nachrichten verfügen über Promoted Properties im Kontext, auf die man bequem zurückgreifen kann.

Ich habe dann für die Behandlung dieser SOAP Fault Nachrichten einen kleinen Helfer geschrieben:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;

// benötigte Referenzen (aus dem BizTalk SDK):
//     Microsoft.BizTalk.GlobalPropertySchemas.dll
//    Microsoft.BizTalk.Pipeline.dll
//    Microsoft.XLANGs.BaseTypes
using Microsoft.BizTalk.Message.Interop;
using Microsoft.XLANGs.BaseTypes;

namespace MyProject.PipelineComponentHelper
{
    /// <summary>
    /// Helferklasse, die Methoden und Eigenschaften anbietet um mit BizTalk SOAP Fault
    /// Nachrichten umgehen zu können.
    /// </summary>
    public class SoapFaultMessage
    {
        #region Constants

        /// <summary>
        /// Definiert den Typ einer SOAP Fault Nachricht.
        /// </summary>
        private const string c_ACKTYPEFAULT = "NACK";

        /// <summary>
        /// XPath Ausdruck, der auf den SOAP Fault Basisknoten zeigt.
        /// </summary>
        private const string c_XPATHSOAPFAULTBASE = "*[local-name='Body']/*[local-name='Fault']";

        #endregion

        #region Variable definitions

        /// <summary>
        /// Enthält die Referenz auf die AckType Property aus dem BizTalk SDK.
        /// </summary>
        private static readonly PropertyBase m_AckTypeMessageProperty = new BTS.AckType();

        /// <summary>
        /// Enthält die Referenz auf die AckDescription Property aus dem BizTalk SDK.
        /// </summary>
        private static readonly PropertyBase m_AckDescriptionMessageProperty = new BTS.AckDescription();

        /// <summary>
        /// Enthält die Referenz auf die AckFailureCode Property aus dem BizTalk SDK.
        /// </summary>
        private static readonly PropertyBase m_AckFailureCodeMessageProperty = new BTS.AckFailureCode();

        /// <summary>
        /// Enthält die BizTalk Nachricht.
        /// </summary>
        private IBaseMessage m_BizTalkMessage = null;

        /// <summary>
        /// Enthält den FailureCode der SOAP Fault Nachricht.
        /// </summary>
        private string m_FailureCode = string.Empty;

        /// <summary>
        /// Enthält die Fehlerbeschreibung der SOAP Fault Nachricht.
        /// </summary>
        private string m_FailureDescription = string.Empty;

        /// <summary>
        /// Enthält die SOAP Fault Nachricht als Xml Dokument.
        /// </summary>
        private XmlDocument m_MessageBody = null;

        #endregion

        #region Constructor

        /// <summary>
        /// Standard Konstruktor, der eine IBase Nachricht entgegennimmt.
        /// </summary>
        public SoapFaultMessage(IBaseMessage soapFaultMessage)
        {
            // Eine Exception werfen, wenn es sich um keine SOAP Fault Nachricht handelt.
            if (!IsSoapFaultMessage(soapFaultMessage))
            {
                throw new ArgumentException("Es wurde versucht ein SOAPFaultMessage Objekt aus einer Nachricht zu erzeugen, die keine SOAP Fault Nachricht ist.");
            }
            
            // Datenübernahme
            m_BizTalkMessage = soapFaultMessage;
        }

        #endregion

        #region Public properties

        /// <summary>
        /// Liefert den SOAP Fault Fehlercode.
        /// </summary>
        public string FailureCode
        {
            get { return m_FailureCode; }
        }

        /// <summary>
        /// Liefert die SOAP Fault Fehlerbeschreibung.
        /// </summary>
        public string FailureDescription
        {
            get { return m_FailureDescription; }
        }

        /// <summary>
        /// Liefert die komplette Nachricht als Xml Dokument
        /// </summary>
        /// <remarks>Die Eigenschaft liest den Nachrichten Inhalt aus dem BizTalk Nachrichten
        /// Body Stream. Sollte dieser nicht in der Lage sein durchsuchbar zu sein (CanSeek == false),
        /// so ist der Stream nach dem Zugriff auf die Eigenschaft vollständig gelesen.</remarks>
        public XmlNode SoapFaultBaseNode
        {
            get
            {
                return GetSoapFaultBaseNode();
            }
        }

        #endregion

        #region Public static methods

        /// <summary>
        /// Diese Methode überprüft, ob es sich bei der BizTalk Nachricht um eine SOAP Fault
        /// Nachricht handelt. Als Kriterium dient die Kontexteigenschaft "AckType", die
        /// vorhanden und "NACK" sein muss.
        /// </summary>
        /// <param name="msgToCheck">Die Nachricht, die es zu überprüfen gilt.</param>
        /// <returns>True, falls es sich um eine SOAP Fault Nachricht handelt, ansonsten False.</returns>
        public static bool IsSoapFaultMessage(IBaseMessage msgToCheck)
        {
            object ackType = null;
            bool retVal = false;
            string tmpString = string.Empty;

            // Wenn kein Nachrichtenobjekt übergeben wurde, dann gleich False zurückgeben
            if (msgToCheck != null)
            {
                // Kontexteigenschaft "AckType" auslesen
                ackType = msgToCheck.Context.Read(m_AckTypeMessageProperty.Name.Name, m_AckTypeMessageProperty.Name.Namespace);

                // Überprüfen, ob Kontexteigenschaften gefunden wurde, und ob es sich um eine SOAP Fault Nachricht handelt
                if (ackType != null) 
                {
                    tmpString = (string)ackType;
                    retVal = tmpString.Equals(c_ACKTYPEFAULT);
                }
            }

            return retVal;
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Extrahiert alle Informationen aus der SOAP Fault Nachricht.
        /// </summary>
        private void ExtractSoapInfoFromMessage()
        {
            object tmpObject = null;

            // Fehlercode auslesen
            tmpObject = m_BizTalkMessage.Context.Read(m_AckFailureCodeMessageProperty.Name.Name, m_AckFailureCodeMessageProperty.Name.Namespace);
            if (tmpObject != null)
            {
                m_FailureCode = (string)tmpObject;
            }

            // Fehlerbeschreibung auslesen
            tmpObject = m_BizTalkMessage.Context.Read(m_AckDescriptionMessageProperty.Name.Name, m_AckDescriptionMessageProperty.Name.Namespace);
            if (tmpObject != null)
            {
                m_FailureDescription = (string)tmpObject;
            }
        }

        /// <summary>
        /// Methode, die den Body der BizTalk Message in ein Xml Dokument einliest.
        /// </summary>
        private void ExtractMessageToXmlDocument()
        {
            // Falls noch nie erfolgreich die Nachricht eingelesen wurde, dann
            // jetzt einlesen, ansonsten ist hier nichts zu tun
            if (m_MessageBody == null)
            {
                try
                {
                    Stream bodyStream = m_BizTalkMessage.BodyPart.GetOriginalDataStream();
                    m_MessageBody = new XmlDocument();
                    m_MessageBody.Load(bodyStream);

                    if (bodyStream.CanSeek)
                    {
                        bodyStream.Position = 0;
                    }
                }
                catch
                {
                    // Fehler sollten ignoriert werden, weil sie abhängig von der
                    // Struktur der BizTalk Nachricht sind, und weil das Einlesen
                    // in das Xml Dokument für die Verarbeitung irrelevant ist.
                    m_MessageBody = null;
                }
            }
        }

        /// <summary>
        /// Liefert den SOAP Fault Basisknoten als Xml Knoten.
        /// </summary>
        /// <returns>SOAP Fault Basisknoten als Xml Knoten.</returns>
        private XmlNode GetSoapFaultBaseNode()
        {
            XmlNode retVal = null;

            // Nachricht als Xml Dokument einlesen
            ExtractMessageToXmlDocument();

            // Falls erfolgreich, dann den SOAP Fault Base Knoten finden
            if (m_MessageBody != null)
            {
                retVal = m_MessageBody.SelectSingleNode(c_XPATHSOAPFAULTBASE);
            }

            return retVal;
        }

        #endregion
    }
}


Statische Methode IsSoapFaultMessage:
Die Methode hilft einem zu überprüfen, ob es sich um eine von BizTalk erzeugte SOAP Fault Nachricht handelt. Als Kriterium für den Rückgabewert wird die Kontexteigenschaft AckType herangezogen, und auf den Wert "NACK" (Fehler) überprüft. Sollte die Kontexteigenschaft mit dem Wert übereinstimmen, so liefert die Methode True zurück, andernfalls False.

Konstruktor mit Parameter IBaseMessage:
Der Konstruktor nimmt die BizTalk Nachricht via Interface IBaseMessage entgegen und überprüft, ob es sich um eine SOAP Fault Nachricht handelt. Sollte dem nicht so sein, so schmeißt der Konstruktor eine Exception.
-> Das Schmeißen von Exception in Konstruktoren ist unter Umständen schlechter Stil. In meinem Anwendungsfall war es aber die einzige Möglichkeit die Verwendung der Klasse eindeutig zu machen.
Wenn es sich um eine SOAP Fault Nchricht handelt, so wird sich die Referenz darauf gemerkt.

Properties:
Die Properties für diese Klasse sollten laut Codekommentar recht eindeutig sein.


Verwendung:
Bevor man eine Instanz dieses Helfers erzeugt sollte man mittels der statischen Methode IsSoapFaultMessage überhaupt überprüfen, ob es sich um eine von BizTalk erzeugte SOAP Fault Nachricht handelt. Als Kriterium wird die Kontexteigenschaft AckType herangezogen, und auf den Wert "NACK" (Fehler) überprüft.

Beispiel einer Verwendung:
// Überprüfen, ob ein BizTalk SoapFault vorliegt
if (SoapFaultMessage.IsSoapFaultMessage(inMsg))
{
    SoapFaultMessage soapMessage = new SoapFaultMessage(inMsg);
    throw new Exception(string.Format("BizTalk Fehler: {0} mit Fehlertext: {1}", soapMessage.FailureCode, soapMessage.FailureDescription));
}


Fazit:
Mit Hilfe dieser Klasse habe ich es geschafft SOAP Fault Nachrichten gekapselt auszuwerten und durch einfachen Zugriff auf die Daten transparent zu halten.

Verbesserungspotenzial:
Es gibt bei einer SOAP Fault Nachricht noch weitere Daten, die über Properties zugänglich gemacht werden können. Hier würde ich mit XPathes im Helfer arbeiten.

Comic-Engine in Silverlight frei auf Codeplex verfügbar

19.01.2010 13:00:30 | Oliver Scheer

Unter dem Projektnamen TheOliver.Comic hat Oliver Scheer auf Codeplex sein Mini-Comic-Framework für Silverlight veröffentlicht. Darin enthalten sind bereits alle wichtigen Basiselemente für die Erstellen von Silverlight-basierten, aktiven Comic-Strips.

Der Sourcecode für diese Engine ist kostenfrei verfügbar. Interessierte können gerne an diesem Projekt mitentwickeln. Einfach bei Codeplex registrieren und Mitglied in der Projektgruppe werden.

Link: http://theolivercomic.codeplex.com/

Demo: http://the-oliver.com/silverlight/demos/comic

xtopia [kompakt] – Roadshow 2010

19.01.2010 10:49:19 | Oliver Scheer

Xtopia-kompakt-Logo-schwarz

Die xtopia[kompakt] Roadshow geht in die nächste Runde und Sie können dabei sein! Erleben Sie Ende April einen spannenden Abend mit interessanten Vorträgen zu Webdesign, RIA, Silverlight, User Experience und vieles, vieles mehr – und das Ganze kostenlos!

In insgesamt sechs Städten in Deutschland haben Sie die Möglichkeit an einer der Abendveranstaltungen teilzunehmen. Beginn ist jeweils 17 Uhr, Ende gegen 22.30 Uhr. Neben den Sessions wird es Gelegenheit geben, bei Getränken und Snacks sich untereinander auszutauschen und zu “networken”.

Die Termine

Montag, 19.04.2010: München - Hilton München Park

Dienstag, 20.04.2010: Karlsruhe - Best Western Karlsruhe

Mittwoch, 21.04.2010: Frankfurt / Bad Homburg - Maritim Bad Homburg

Montag, 26.04.2010: Köln - Leonardo Hotel

Dienstag, 27.04.2010: Hamburg - Baseler Hof Hamburg

Mittwoch, 28.04.2010: Berlin - Mövenpick Berlin

Die Sprecher

Es erwartet Sie ein bunter Mix an Themen. In verschiedenen Sessions werden Microsoft-Sprecher über alle Innovationen aus dem Bereich Web, Design, Usability und RIA sprechen. Darüberhinaus werden Kreativagenturen, wie Ergosin, UID, Designaffairs, UCD Plus und Neon Red vom Praxis-Einsatz neuester Technologien berichten. Das Usability Team der Nero AG wird des weiteren über den Einsatz von Microsoft Expression Studio im Entwicklungsprozess der neuen Version ihrer Brennsuite sprechen. 

Themengebiete

Jan Schenk (Microsoft): Heiter trotz wolkig - Cloud Computing mit Windows Azure

Cloud Computing ist in aller Munde. Das Konzept und die Philosophie hinter Windows Azure sehen Sie hier im Schnelldurchlauf: Für welche Einsatzbereiche macht Cloud Computing wirklich Sinn? Wann rechnet sich Windows Azure? Gehen Sie in dieser Session auf Tuchfühlung mit der Wolke!

Frank Prengel (Microsoft): Windows Phone – neue Ansätze, neue Möglichkeiten

Kurzinhalt: Das Jahr 2010 wird viele signifikante Neuerungen für Windows Phones bringen – für Anwender, Entwickler und Designer. Diese Session vermittelt Ihnen in komprimierter Form, wie Microsoft seine mobile Plattform auffrischt und Maßstäbe im Smartphone-Bereich setzen wird.

Oliver Scheer (Microsoft): Silverlight 4 – Die Highlights

Rich Internet Applications mit Microsoft Silverlight: Einfach, Schnell und Beeindruckend. Silverlight 4 bringt eine Fülle von neuen Möglichkeiten mit und macht das Entwickeln und Designen von interaktiven Webanwendungen noch einfacher. Dieser Vortrag zeigt die Highlights der neuen Version von Silverlight.

Tom Wendel (Microsoft): SharePoint 2010 spricht Silverlight

Mit der Einführung von SharePoint 2010 wächst zusammen, was zusammen gehört. Mit Hilfe von Silverlight lassen sich Daten in SharePoint perfekt visualisieren. Eine nahtlose Integration der beiden Technologien verschafft völlig neue Möglichkeiten – sei es direkt als Webpart oder als eigenständige Silverlight-Anwendung.

Clemens Lutsch & verschiedene Kreativagenturen: Silverlight & WPF in der Design-Praxis

Führende Design-Agenturen berichten von Erfahrungen mit WPF & Silverlight in aktuellen, innovativen Projekten. So erfahren Sie aus erster Hand, wie moderne UX mit modernen Tools entsteht.

Zur Anmeldung 

Jetzt heißt es schnell sein: Suchen Sie sich Ihre Lieblingsstadt aus und reservieren Sie sich sofort einen der begehrten Plätze. Weitere Informationen zu den einzelnen Sessions, detaillierte Agendas, News zu den Sprechern und vieles mehr finden Sie exklusiv im Silverlight & Expression Team Blog. Also am Besten direkt den Feed abonnieren und immer auf dem Laufenden bleiben.

Imagine Cup 2010 - Microsoft spendet an 3 Hilfsprojekte - und jede/r kann mitmachen!

19.01.2010 10:42:41 | Oliver Scheer

Nicht nur mit der Teilnahme am Imagine Cup 2010 und den Ideen, wie man mit Software die großen Probleme dieser Welt lösen kann, sondern auch schon mit einer unverbindlichen persönlichen Registrierung kann man Gutes tun!

Microsoft spendet für jede Registrierung, die über offizielle Imagine Cup 2010 Spenden-Webseite eingeht 1,- € an eines der drei dort beschriebenen Hilfsprojekte.

Und das Beste: Unter allen Registrierungen verlost Microsoft ein Netbook!

Unabhängig von der Anzahl Eurer Registrierung unterstützt Microsoft jedes der vorgestellten Projekt mit einer Spende von mindestens 250,- €.
Der Imagine Cup ist der weltweit größte Technologiewettbewerb für Schüler und Studierende, der in diesem Jahr in fünf verschiedenen Kategorien ausgetragen wird:
Von Softwareprogrammierung über Filme drehen ist für jeden eine Kategorie dabei. Der Wettbewerb steht unter dem Motto: „Technologie für eine bessere Welt“ und orientiert sich dabei an den UN Millenniumszielen. Mehr Informationen zum Imagine Cup: www.imaginecup.de

Apropos Imagine Cup, das Finale in der Kategorie Embedded findet erstmalig in Deutschland statt!

Erstmalig in der Geschichte des Imagine Cups wird es ein lokales Finale in der Kategorie Embedded Development geben. Schüler und Studierende sind eingeladen, ihrer Kreativität und ihren Ideen freien Lauf zu lassen:
Wie kann ein Embedded Device dazu beitragen, die Probleme dieser Welt lösen? Bildung, Armut, Gesundheit und Umwelt sind nur 4 der insgesamt 8 UN Millenniumsziele, an denen sich die Projekte orientieren sollen.
Abgabefrist für die Projektmappe ist der 15.02.2010. Das nationale Finale findet dann im April gemeinsam mit der Vorausscheidung in der Kategorie Software Design statt. Das nationale Gewinnerteam fährt dann im Juli 2010 zum internationalen Finale nach Polen, wo es gegen Teams aus der ganzen Welt antritt!

Info: Offizieller Launch von Visual Studio 2010 und Team Foundation Server 2010 am 12. April 2010

18.01.2010 17:09:16 | Kay Giza

Wie angekündigt verschiebt sich der offizielle Veröffentlichungstermin von Visual Studio 2010 um ca. drei Wochen auf den 12. April 2010, da im Februar noch ein Release Candidate (RC) veröffentlicht wird, in dem wichtiges Anwenderfeedback aus der Betaphase integriert wurde. Software-Entwickler sollten unbedingt sicherstellen, dass ihre MSDN Subscription noch zum Launch am 12. April 2010 gültig ist (oder gegebenenfalls eines der Angebote nutzen, um die Subscription zu verlängern). Nur dann erhalten Sie Visual Studio 2010 und Team Foundation Server 2010 ohne zusätzliche Lizenzkosten. Wichtig für alle Entwickler... [... alle Details und Links finden Sie in diesem Blogposting auf Giza-Blog.de]

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

Info: Offizieller Launch von Visual Studio 2010 und Team Foundation Server 2010 am 12. April 2010

18.01.2010 12:22:24 | Kay Giza

Wie angekündigt verschiebt sich der offizielle Veröffentlichungstermin von Visual Studio 2010 um ca. drei Wochen auf den 12. April 2010, da im Februar noch ein Release Candidate (RC) veröffentlicht wird, in dem wichtiges Anwenderfeedback aus der Betaphase integriert wurde. Software-Entwickler sollten unbedingt sicherstellen, dass ihre MSDN Subscription noch zum Launch am 12. April 2010 gültig ist (oder gegebenenfalls eines der Angebote nutzen, um die Subscription zu verlängern). Nur dann erhalten Sie Visual Studio 2010 und Team Foundation Server 2010 ohne zusätzliche Lizenzkosten. Wichtig für alle Entwickler... [... alle Details und Links finden Sie in diesem Blogposting auf Giza-Blog.de

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

xtopia[kompakt] Roadshow 2010 - jetzt kostenlos anmelden

18.01.2010 12:15:29 | Kay Giza

Die xtopia[kompakt] Roadshow 2010 geht in die nächste Runde (ich berichtete: Ankündigung: xtopia[kompakt] Roadshow 2010) und Sie können dabei sein!
Erleben Sie einen spannenden Abend mit interessanten Vorträgen zu Webdesign, RIA, Silverlight, User Experience und vieles, vieles mehr – und das Ganze kostenlos!
In insgesamt sechs Städten in Deutschland haben Sie Ende April 2010 die Möglichkeit an einer der Abendveranstaltungen teilzunehmen. Beginn ist jeweils 17.00 Uhr, Ende gegen 22.30 Uhr. Neben den Sessions wird es Gelegenheit geben, bei Getränken und Snacks sich untereinander auszutauschen und zu “networken”.

Zur Anmeldung
Jetzt heißt es schnell sein: Suchen Sie sich Ihre Lieblingsstadt aus und reservieren Sie sich sofort einen der begehrten Plätze. Weitere Informationen zu den einzelnen Sessions, detaillierte Agenden, News zu den Sprechern und vieles mehr finden Sie exklusiv im Silverlight & Expression Team Blog: Auf die Plätze, fertig, Anmelden: Die xtopia[kompakt] Roadshow 2010!  



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

XSD generierte Klasse mit minOccurs="0" und Default Werten

18.01.2010 10:25:00 | Timo Rehl

Mir ist bei einem Fehler aufgefallen, dass XSD.exe zusammen mit dem XmlSerializer so seine Tücken hat.
Ich weiß, dass XSD.exe nicht das gelbe vom Ei ist, weshalb ich hier nicht auf Alternativen eingehe.

Problembeschreibung:
Eine Klasse, die mittels XSD.exe aus einem Schema heraus generiert werden soll. Das Schema sieht z.B. so aus:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://tempuri.org/TestObject.xsd" elementFormDefault="qualified" targetNamespace="http://tempuri.org/TestObject.xsd" id="TestObject" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="TestObject">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="TestStringField" type="xs:string" />
        <xs:element default="-1" minOccurs="0" name="TestIntegerField" type="xs:integer" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Wichtig ist, dass TestIntegerField "minOccurs" und einen "default" besitzt!

Die Klasse, die mittels XSD.exe generiert wird sieht dann so aus:
using System.Xml.Serialization;

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/TestObject.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/TestObject.xsd", IsNullable=false)]
public partial class TestObject {
    
    private string testStringFieldField;
    
    private string testIntegerFieldField;
    
    public TestObject() {
        this.testIntegerFieldField = "-1";
    }
    
    /// <remarks/>
    public string TestStringField {
        get {
            return this.testStringFieldField;
        }
        set {
            this.testStringFieldField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(DataType="integer")]
    [System.ComponentModel.DefaultValueAttribute("-1")]
    public string TestIntegerField {
        get {
            return this.testIntegerFieldField;
        }
        set {
            this.testIntegerFieldField = value;
        }
    }
}


Problem ist, wenn man die Default Werte unangetastet lässt, dass beim Serialisieren mittels dem XmlSerializer diese Xml Knoten nicht mitserialisert werden.

Lösung:
Es gibt hierfür auch bei Microsoft einen Support Beitrag, wo erklärt wird, dass das "By Design" ist.
Es bleibt einem nur übrig, alle Attribute
[System.ComponentModel.DefaultValueAttribute("-1")]
im generierten Code nachträglich zu entfernen.

Keine glückliche Lösung, aber es ist immerhin eine.

xtopia[kompakt] Roadshow 2010

18.01.2010 10:15:10 | Peter Kirchner

Xtopia-kompakt-Logo-weiss Die xtopia[kompakt] Roadshow geht in die nächste Runde und Sie können dabei sein! Erleben Sie Ende April einen spannenden Abend mit interessanten Vorträgen zu Webdesign, RIA, Silverlight, User Experience und vieles, vieles mehr – und das Ganze kostenlos!

In insgesamt sechs Städten in Deutschland haben Sie die Möglichkeit an einer der Abendveranstaltungen teilzunehmen. Beginn ist jeweils 17 Uhr, Ende gegen 22.30 Uhr. Neben den Sessions wird es Gelegenheit geben, bei Getränken und Snacks sich untereinander auszutauschen und zu “networken”.

Die Termine
  • Montag, 19.04.2010: München - Hilton München Park
  • Dienstag, 20.04.2010: Karlsruhe - Best Western Karlsruhe
  • Mittwoch, 21.04.2010: Frankfurt / Bad Homburg - Maritim Bad Homburg
  • Montag, 26.04.2010: Köln - Leonardo Hotel
  • Dienstag, 27.04.2010: Hamburg - Baseler Hof Hamburg
  • Mittwoch, 28.04.2010: Berlin - Mövenpick Berlin
Die Sprecher

Es erwartet Sie ein bunter Mix an Themen. In verschiedenen Sessions werden Microsoft-Sprecher über alle Innovationen aus dem Bereich Web, Design, Usability und RIA sprechen. Darüberhinaus werden Kreativagenturen, wie Ergosin, UID, Designaffairs, UCD Plus und Neon Red vom Praxis-Einsatz neuester Technologien berichten. Das Usability Team der Nero AG wird des weiteren über den Einsatz von Microsoft Expression Studio im Entwicklungsprozess der neuen Version ihrer Brennsuite sprechen. 

Themengebiete

Jan Schenk (Microsoft): Heiter trotz wolkig - Cloud Computing mit Windows Azure

Cloud Computing ist in aller Munde. Das Konzept und die Philosophie hinter Windows Azure sehen Sie hier im Schnelldurchlauf: Für welche Einsatzbereiche macht Cloud Computing wirklich Sinn? Wann rechnet sich Windows Azure? Gehen Sie in dieser Session auf Tuchfühlung mit der Wolke!

Frank Prengel (Microsoft): Windows Phone – neue Ansätze, neue Möglichkeiten

Kurzinhalt: Das Jahr 2010 wird viele signifikante Neuerungen für Windows Phones bringen – für Anwender, Entwickler und Designer. Diese Session vermittelt Ihnen in komprimierter Form, wie Microsoft seine mobile Plattform auffrischt und Maßstäbe im Smartphone-Bereich setzen wird.

Oliver Scheer (Microsoft): Silverlight 4 – Die Highlights

Rich Internet Applications mit Microsoft Silverlight: Einfach, Schnell und Beeindruckend. Silverlight 4 bringt eine Fülle von neuen Möglichkeiten mit und macht das Entwickeln und Designen von interaktiven Webanwendungen noch einfacher. Dieser Vortrag zeigt die Highlights der neuen Version von Silverlight.

Tom Wendel (Microsoft): SharePoint 2010 spricht Silverlight

Mit der Einführung von SharePoint 2010 wächst zusammen, was zusammen gehört. Mit Hilfe von Silverlight lassen sich Daten in SharePoint perfekt visualisieren. Eine nahtlose Integration der beiden Technologien verschafft völlig neue Möglichkeiten – sei es direkt als Webpart oder als eigenständige Silverlight-Anwendung.

Clemens Lutsch & verschiedene Kreativagenturen: Silverlight & WPF in der Design-Praxis

Führende Design-Agenturen berichten von Erfahrungen mit WPF & Silverlight in aktuellen, innovativen Projekten. So erfahren Sie aus erster Hand, wie moderne UX mit modernen Tools entsteht.

Zur Anmeldung 

Jetzt heißt es schnell sein: Suchen Sie sich Ihre Lieblingsstadt aus und reservieren Sie sich sofort einen der begehrten Plätze. Weitere Informationen zu den einzelnen Sessions, detaillierte Agendas, News zu den Sprechern und vieles mehr finden Sie exklusiv im Silverlight & Expression Team Blog. Also am Besten direkt den Feed abonnieren und immer auf dem Laufenden bleiben.

xtopia[kompakt] Roadshow 2010 – jetzt kostenlos anmelden

18.01.2010 10:14:23 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/18/xtopia-kompakt-roadshow-2010-jetzt-kostenlos-anmelden.aspx'; tweetmeme_source = 'jansche';

Xtopia-kompakt-Logo-weiss

Die xtopia[kompakt] Roadshow geht in die nächste Runde und Sie können dabei sein! Erleben Sie Ende April einen spannenden Abend mit interessanten Vorträgen zu Webdesign, RIA, Silverlight, User Experience und vieles, vieles mehr – und das Ganze kostenlos!

In insgesamt sechs Städten in Deutschland haben Sie die Möglichkeit an einer der Abendveranstaltungen teilzunehmen. Beginn ist jeweils 17 Uhr, Ende gegen 22.30 Uhr. Neben den Sessions wird es Gelegenheit geben, bei Getränken und Snacks sich untereinander auszutauschen und zu “networken”.

Die Termine

Montag, 19.04.2010: München - Hilton München Park

Dienstag, 20.04.2010: Karlsruhe - Best Western Karlsruhe

Mittwoch, 21.04.2010: Frankfurt / Bad Homburg - Maritim Bad Homburg

Montag, 26.04.2010: Köln - Leonardo Hotel

Dienstag, 27.04.2010: Hamburg - Baseler Hof Hamburg

Mittwoch, 28.04.2010: Berlin - Mövenpick Berlin

Die Sprecher

Es erwartet Sie ein bunter Mix an Themen. In verschiedenen Sessions werden Microsoft-Sprecher über alle Innovationen aus dem Bereich Web, Design, Usability und RIA sprechen. Darüberhinaus werden Kreativagenturen, wie Ergosin, UID, Designaffairs, UCD Plus und Neon Red vom Praxis-Einsatz neuester Technologien berichten. Das Usability Team der Nero AG wird des weiteren über den Einsatz von Microsoft Expression Studio im Entwicklungsprozess der neuen Version ihrer Brennsuite sprechen. 

Themengebiete

Jan Schenk (Microsoft): Heiter trotz wolkig - Cloud Computing mit Windows Azure

Cloud Computing ist in aller Munde. Das Konzept und die Philosophie hinter Windows Azure sehen Sie hier im Schnelldurchlauf: Für welche Einsatzbereiche macht Cloud Computing wirklich Sinn? Wann rechnet sich Windows Azure? Gehen Sie in dieser Session auf Tuchfühlung mit der Wolke!

Frank Prengel (Microsoft): Windows Phone – neue Ansätze, neue Möglichkeiten

Kurzinhalt: Das Jahr 2010 wird viele signifikante Neuerungen für Windows Phones bringen – für Anwender, Entwickler und Designer. Diese Session vermittelt Ihnen in komprimierter Form, wie Microsoft seine mobile Plattform auffrischt und Maßstäbe im Smartphone-Bereich setzen wird.

Oliver Scheer (Microsoft): Silverlight 4 – Die Highlights

Rich Internet Applications mit Microsoft Silverlight: Einfach, Schnell und Beeindruckend. Silverlight 4 bringt eine Fülle von neuen Möglichkeiten mit und macht das Entwickeln und Designen von interaktiven Webanwendungen noch einfacher. Dieser Vortrag zeigt die Highlights der neuen Version von Silverlight.

Tom Wendel (Microsoft): SharePoint 2010 spricht Silverlight

Mit der Einführung von SharePoint 2010 wächst zusammen, was zusammen gehört. Mit Hilfe von Silverlight lassen sich Daten in SharePoint perfekt visualisieren. Eine nahtlose Integration der beiden Technologien verschafft völlig neue Möglichkeiten – sei es direkt als Webpart oder als eigenständige Silverlight-Anwendung.

Clemens Lutsch & verschiedene Kreativagenturen: Silverlight & WPF in der Design-Praxis

Führende Design-Agenturen berichten von Erfahrungen mit WPF & Silverlight in aktuellen, innovativen Projekten. So erfahren Sie aus erster Hand, wie moderne UX mit modernen Tools entsteht.

Zur Anmeldung 

Jetzt heißt es schnell sein: Suchen Sie sich Ihre Lieblingsstadt aus und reservieren Sie sich sofort einen der begehrten Plätze. Weitere Informationen zu den einzelnen Sessions, detaillierte Agendas, News zu den Sprechern und vieles mehr finden Sie exklusiv im Silverlight & Expression Team Blog. Also am Besten direkt den Feed abonnieren und immer auf dem Laufenden bleiben.

xtopia[kompakt] Roadshow 2010 - jetzt kostenlos anmelden

18.01.2010 09:07:37 | Kay Giza

Die xtopia[kompakt] Roadshow 2010 geht in die nächste Runde (ich berichtete: Ankündigung- xtopia[kompakt] Roadshow 2010) und Sie können dabei sein!
Erleben Sie einen spannenden Abend mit interessanten Vorträgen zu Webdesign, RIA, Silverlight, User Experience und vieles, vieles mehr – und das Ganze kostenlos!
In insgesamt sechs Städten in Deutschland haben Sie Ende April 2010 die Möglichkeit an einer der Abendveranstaltungen teilzunehmen. Beginn ist jeweils 17.00 Uhr, Ende gegen 22.30 Uhr. Neben den Sessions wird es Gelegenheit geben, bei Getränken und Snacks sich untereinander auszutauschen und zu “networken”.

Zur Anmeldung
Jetzt heißt es schnell sein: Suchen Sie sich Ihre Lieblingsstadt aus und reservieren Sie sich sofort einen der begehrten Plätze. Weitere Informationen zu den einzelnen Sessions, detaillierte Agenden, News zu den Sprechern und vieles mehr finden Sie exklusiv im Silverlight & Expression Team Blog: Auf die Plätze, fertig, Anmelden: Die xtopia[kompakt] Roadshow 2010!  



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

ASP.NET: Precompilation und die Fehlermeldung Directory '{0}' does not exist. Failed to start monitoring file changes

17.01.2010 23:26:00 | Wolfgang Kluge

Unter etwas besonderen Umständen kommt es beim Aufruf einer ASP.NET Seite zu dieser Fehlermeldung.

System.Web.HttpException (0x80070002): Directory '{0}' does not exist. Failed to start monitoring file changes.

  • System.Web.FileChangesMonitor.FindDirectoryMonitor(String dir, Boolean addIfNotFound, Boolean throwOnError) +334
  • System.Web.FileChangesMonitor.StartMonitoringPath(String alias, FileChangeEventHandler callback, FileAttributesData& fad) +805
  • System.Web.Caching.CacheDependency.Init(Boolean isPublic, String[] filenamesArg, String[] cachekeysArg, CacheDependency dependency, DateTime utcStart) +2558
  • System.Web.Hosting.MapPathBasedVirtualPathProvider.GetCacheDependency(String virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) +334
  • System.Web.ResponseDependencyList.CreateCacheDependency(CacheDependencyType dependencyType, CacheDependency dependency) +539
  • System.Web.HttpResponse.CreateCacheDependencyForResponse(CacheDependency dependencyVary) +62
  • System.Web.Caching.OutputCacheModule.InsertResponse(HttpResponse response, HttpContext context, String keyRawResponse, HttpCachePolicySettings settings, CachedVary cachedVary, CachedRawResponse memoryRawResponse) +758
  • System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +8782064
  • System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
  • System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

Ursache

Damit es überhaupt dazu kommen kann, müssen folgende Bedingungen gegeben sein:

  • Vorkompilierung / Precompilation
  • Webseite nicht aktualisierbar / Website not updatable
  • WebUserControl und/oder MasterPage in eigenem Verzeichnis
  • Verwendung von OutputCache

Das Problem ist, dass für MasterPages und WebUserControls keine Dummy-Datei vorgehalten werden müssen, da diese über den IIS nicht direkt aufgerufen werden. Dadurch werden aber auch Verzeichnisse, in denen sonst keine anderen Dateien liegen, nicht erstellt. Bei der Verwendung von OutputCache werden nun alle abhängigen Dateien überprüft. Dabei ist es kein Problem, wenn eine Datei fehlt - das Verzeichnis muss allerdings vorhanden sein.

Lösung

Die Lösung ist denkbar einfach. Die Verzeichnisse müssen angelegt werden...

Innerhalb eines Web Deployment Projekts (*.wdproj) kann man dazu folgendes Target verwenden. In leicht abgewandelter Form (die Pfade und Eigenschaften müsste man anpassen) geht es so natürlich auch innerhalb eines beliebig anderen MSBuild-Projekts.

<Target Name="CreateEmptyDirectoriesForOutputCache"
       Condition="'@(EnableUpdateable)' != 'true'">
   <!--
   use this target to create empty directories as a workaround for a bug in
   precompilation in conjunction with @OutputCache and updatable=false

   see http://gehirnwindung.de/post/2010/01/18/ASPNET-Precompilation-und-die-Fehlermeldung-Directory-does-not-exist-Failed-to-start-monitoring-file-changes.aspx for more details
   -->
   <CreateItem Condition="'$(EnableCopyBeforeBuild)' != 'true' and '@(ExcludeFromBuild)' == ''"
          Include="$(SourceWebPhysicalPath)\**\*.master;$(SourceWebPhysicalPath)\**\*.ascx"
          Exclude="$(SourceWebPhysicalPath)\**\.svn\**\*.*">
      <Output ItemName="EmptyFilePaths" TaskParameter="Include" />
   </CreateItem>
   <CreateItem Condition="'$(EnableCopyBeforeBuild)' == 'true' or '@(ExcludeFromBuild)' != ''"
          Include="$(CopyBeforeBuildTargetPath)\**\*.master;$(CopyBeforeBuildTargetPath)\**\*.ascx">
      <Output ItemName="EmptyFilePaths" TaskParameter="Include" />
   </CreateItem>
   <MakeDir Directories="$(WDTargetDir)%(EmptyFilePaths.RecursiveDir)" ContinueOnError="true" />
</Target>

Damit die Verzeichnisse angelegt werden, muss das Target auch aufgerufen werden. Z.B. mittels

<Target Name="AfterBuild">
   <CallTarget Targets="CreateEmptyDirectoriesForOutputCache" />
</Target>

Falls <ExcludeFromBuild>-Tags enthalten sind (oder EnableCopyBeforeBuild=true ist), werden die *.ascx und *.master-Dateien innerhalb der Kopie (Eigenschaft CopyBeforeBuildTargetPath) gesucht. In dem Fall sollte man - falls vorhanden - mit Hilfe von <ExcludeFromBuild> z.B. Subversion-Dateien ausschließen, ansonsten werden diese Pfade auch angelegt.

Sind dagegen keine <ExcludeFromBuild>-Tags vorhanden (und die Eigenschaft EnableCopyBeforeBuild=false), dann wird das physikalische Web-Verzeichnis nach den Dateien durchsucht. Hier muss gegebenenfalls das Exclude-Attribut des ersten <CreateItem>-Tags angepasst werden. Momentan werden damit die Dateien innerhalb der .svn-Ordner ausgeblendet.

Mit Hilfe dieser Targets-Datei kann der Code einfach wiederverwendet werden. Per <Import> wird das Target innerhalb des Web Deployment Projekts geladen. Will man es für alle zukünftigen Projekte anpassen, sollte man die entsprechende Vorlage ändern (zu finden unter C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Packages\WebDeploy.wdproj).
Alternativ dazu kann man diesen Import auch innerhalb der Datei C:\Program Files (x86)\MSBuild\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets einfügen, dann gilt es für alle Projekte.

Egal wo es zum Schluß nun steht, es sieht dann ungefähr so aus (lediglich der Pfad muss angepasst werden).

<Import Project="./KlugeSoftware.WebDeployment.CreateEmptyDirectoriesForOutputCache.targets" />

Ein expliziter Aufruf des Targets ist hierbei nicht nötig.

Download (1,16 kb)

Erste Schritte in der Konfiguration von StructureMap

17.01.2010 21:38:00 | Jan Christian Selke

Seit kurzer Zeit nutze ich nun StructureMap und entdecke immer mehr Features, die ich besonders gelungen finde. Das automatische Registrieren auf Basis von Convention over Configuration (CoC) und das Schreiben von eigenen Interceptors, die auch ein automatisches Registrieren erlauben, sind die Ersten die mir aufgefallen sind und über die ich schreibe.

Convention over Configuration (CoC)

Bisher habe ich zum Registrieren der Typen von der Basisklasse Registry abgeleitet und alle notwendigen Typen in einem  Bootstrapper registriert.

public class RibbonRegistry : Registry
{
    public RibbonRegistry()
    {
    …
    }
}

ObjectFactory.Initialize(x =>
{
    x.AddRegistry(new RibbonRegistry());
});

Es folgte eine endlose Liste an Anweisungen, die in etwa diese Form hatten (nur noch deutlich mehr…):

ForRequestedType<IRibbonView>()
    .TheDefaultIsConcreteType<RibbonView>();
ForRequestedType<IRibbonModel>()
    .TheDefaultIsConcreteType<RibbonModel>();
ForRequestedType<IRibbonPresenter>()
    .TheDefaultIsConcreteType<RibbonPresenter>();

ForRequestedType<IRevisionView>()
    .TheDefaultIsConcreteType<RevisionView>();
ForRequestedType<IRevisionModel>()
    .TheDefaultIsConcreteType<RevisionModel>();
ForRequestedType<IRevisionPresenter>()
    .TheDefaultIsConcreteType<RevisionPresenter>();

Sehr vereinfacht wird die Registrierung von Typen durch die konsequente Anwendung von Convention over Configuration (CoC). Aktuell eines der spannenden Themenfelder, die sich großer Beliebtheit erfreuen. Eine der Standardkonventionen lautet: Der Kontrakt IKonkreterTypeName besitzt eine konkrete Implementierung in Form von KonkreterTypeName. Wird diese Konvention eingehalten, wird die Menge an Ceremony Code deutlich reduziert und die Registrierung lässt sich massiv vereinfachen.

Scan(x =>
{
    x.TheCallingAssembly();
    x.WithDefaultConventions(); 
});

Wenn das nicht einfach ist?! Alle Typen innerhalb der aufrufenden Assembly, die den Standardkonventionen entsprechen, werden nun automatisch dem IoC Container hinzugefügt. –Großartig, und so einfach. Weitere Beispiele zur automatischen Registrierung in StructureMap mit CoC finden sich hier. Ein besonderes Highlight ist meines Erachtens die Konfiguration des Scan Befehls als nested closure. Wenn das nicht elegant ist!? Ein Blick auf die Scan(Action<AssemblyScanner>) Methode macht deutlich: Ein Action<> delegate ist notwendig, um dieses Pattern in C# zu realisieren. In diesem Fall ist der Parameter vom Typ AssemblyScanner. Die Methode wird dann mit einem neuen Scanner als Parameter aufgerufen.

public void Scan(Action<AssemblyScanner> action)
{
    var scanner = new AssemblyScanner();
    action(scanner);

    AddScanner(scanner);
}

Jetzt kann jeder Typ, der dem Container hinzugefügt wurde, mit dem folgenden Aufruf geholt werden.

ObjectFactory.GetInstance<IRibbonPresenter>();

Custom Interceptor

Das Schreiben eines eigenen Interceptors mit automatischer Registrierung von abhängigen Typen ist der zweite Aspekt über den ich schreibe. Ich bin mir nicht ganz sicher, aber ich glaube, Castle Windsor bietet einen ähnlichen Mechanismus zum Schreiben eigener Interceptors.

Sehr prägnant ist das Beispiel des EventAggregators für dieses Szenario. Auf meinen Wegen durch den Quellcode von StoryTeller ist mir aufgefallen, dass der EventAggregator zwar ständig genutzt wird, aber nirgendwo die Registrierung eines Listeners zu finden ist. In der Klasse UserInterfaceRegistration wurde mir dann auch klar weshalb. Nach dem EventAggregator wurde ein EventAggregatorInterceptor registriert.

For<IEventAggregator>().Singleton().Use<EventAggregator>();
RegisterInterceptor(new EventAggregatorInterceptor());

Dieser Interceptor implementiert die notwendige Logik zum Registrieren der Listener. Alle Typen, die beim Scannen gefunden werden und die Schnittstelle IListener<> implementieren, werden an dem EventAggregator registriert. Zum Schreiben eines eigenen Interceptors müssen nur zwei Methoden implementiert werden. Die Methode MatchesType(Type) entscheidet, ob ein TypeInterceptor auf der aktuellen Instanz angewendet wird. Die Process() Methode agiert dann als EnrichmentHandler delegate, um mit der original Instanz zu arbeiten. Am konkreten Beispiel des EventAggregatorInterceptor sieht das wie folgt aus:

public class EventAggregatorInterceptor : TypeInterceptor
{
    #region TypeInterceptor Members

    public object Process(object target, IContext context)
    {
        context.GetInstance<IEventAggregator>().AddListener(target);
        return target;
    }

    public bool MatchesType(Type type)
    {
        if (typeof (IHandler).IsAssignableFrom(type)) return false;

        return
            type.ImplementsInterfaceTemplate(typeof (IListener<>)) ||
            type.CanBeCastTo(typeof (ICloseable));
    }

    #endregion
}

Wow, so ist innerhalb der Anwendung selbst kein Code notwendig, um die Listener zu registrieren. Die Registrierung läuft völlig autonom und vor allem absolut generisch ab. Alle Typen, die die notwendige Schnittstelle implementieren, werden registriert – Ich bin begeistert.

Demnächst werde ich sicher noch mehr über die Juwelen der Registrierung in StructureMap schreiben.

Silverlight 4: Using ICommand

17.01.2010 19:05:13 | Daniel Schädler

Neu in Silverlight 4 wird ja die Unterstützung von Commands sein, damit die View-Codebehind leer bleibt um das MVVM-Pattern zu implementieren. In Silverlight 3 war es so, dass man mit den SL-Extensions oder Prism arbeiten musste, damit man eine leere Codebehind der View hatte. Inspiriert durch diverse Blogposts (Using ICommand in Silverlight 4, Silverlight 4 Commanding enables ViewModels) habe ich mich dann dahinter gesetzt und versucht eine mögliche Lösung zu finden, die nicht all zuviel zu tun gibt. Meine kleine Applikation sieht wie folgt aus:

   1: <UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"  x:Class="Sample.SilverLight4.Commanding.MainPage"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   6:     xmlns:mv="clr-namespace:Sample.SilverLight4.Commanding.ModelView"
   7:     mc:Ignorable="d"    
   8:     d:DesignHeight="300" d:DesignWidth="400">
   9:     <UserControl.Resources>
  10:         <mv:PersonModelView x:Key="PersonMv"></mv:PersonModelView>
  11:     </UserControl.Resources>
  12:     <Grid x:Name="LayoutRoot" Background="White" MinWidth="200" MinHeight="200" MaxWidth="400" MaxHeight="400" DataContext="{StaticResource PersonMv}">
  13:         <Grid.ColumnDefinitions>
  14:             <ColumnDefinition></ColumnDefinition>
  15:             <ColumnDefinition></ColumnDefinition>
  16:         </Grid.ColumnDefinitions>
  17:         <Grid.RowDefinitions>
  18:             <RowDefinition></RowDefinition>
  19:             <RowDefinition></RowDefinition>
  20:             <RowDefinition></RowDefinition>
  21:             <RowDefinition></RowDefinition>
  22:             <RowDefinition></RowDefinition>
  23:         </Grid.RowDefinitions>
  24:         <my:Label Content="Wert für Vornamen:" Grid.Column="0" Grid.Row="0"></my:Label>
  25:         <my:Label Content="Wert für Namen:" Grid.Column="0" Grid.Row="1"></my:Label>
  26:         <my:Label Content="Wert für Alter:" Grid.Column="0" Grid.Row="2"></my:Label>
  27:         <Border BorderBrush="BlanchedAlmond"  CornerRadius="5" BorderThickness="5" Grid.Column="1" Grid.Row="0">
  28:             <TextBox Text="{Binding MyPerson.FirstName, Mode=TwoWay}"></TextBox>
  29:         </Border>
  30:         <Border BorderBrush="BlanchedAlmond" CornerRadius="5" BorderThickness="5" Grid.Column="1" Grid.Row="1">
  31:             <TextBox Text="{Binding MyPerson.LastName, Mode=TwoWay}"></TextBox>
  32:         </Border>
  33:         <Border BorderBrush="BlanchedAlmond" CornerRadius="5" BorderThickness="5" Grid.Column="1" Grid.Row="2">
  34:             <TextBox Text="{Binding MyPerson.Age, Mode=TwoWay}"></TextBox>
  35:         </Border>
  36:         <Button Content="Save" Command="{Binding MyCommand}" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Margin="20"></Button>
  37:     </Grid>
  38: </UserControl>

Zu beachten ist, dass dass die entsprechende Resource als Referenz reingezogen ist und die Textboxes and das Property der View mittels TwoWay Binding gebunden sind. Hier die entsprechende View:

   1: namespace Sample.SilverLight4.Commanding.ModelView
   2: {
   3:     public class PersonModelView : BaseModelView
   4:     {
   5:         private BaseModelView _baseModelView;
   6:  
   7:         public ICommand MyCommand { get { return new Commandable(_baseModelView); } }
   8:  
   9:         private Person _person = null;
  10:         public Person MyPerson {
  11:             get
  12:             {
  13:                 if (_person == null)
  14:                 {
  15:                     _person = new Person();
  16:                 }
  17:                 return _person;
  18:             }
  19:             set
  20:             {
  21:                 _person = value;
  22:  
  23:             }
  24:         }
  25:  
  26:         public PersonModelView()
  27:         {            
  28:             _baseModelView = this;
  29:         }
  30:  
  31:         public override void OnExecute()
  32:         {
  33:             MessageBox.Show(string.Format("Eingegeben haben Sie: Vorname:{0}\n Name:{1}\n Alter:{2}", MyPerson.FirstName, MyPerson.LastName, MyPerson.Age.ToString()));
  34:         }
  35:     }
  36: }

Die wichtige Klasse, welche für dass Commanding zuständig ist, ist nachstehend aufgezeigt.

   1: namespace Sample.SilverLight4.Commanding.CommandMember
   2: {
   3:     public class Commandable : ICommand
   4:     {
   5:         private BaseModelView _baseModelView;
   6:  
   7:         public Commandable(BaseModelView baseModelView)
   8:         {
   9:             _baseModelView = baseModelView;
  10:         }
  11:  
  12:         #region ICommand Members
  13:  
  14:         public bool CanExecute(object parameter)
  15:         {
  16:             return true;
  17:         }
  18:  
  19:         public event EventHandler CanExecuteChanged;
  20:  
  21:         public void Execute(object parameter)
  22:         {
  23:             _baseModelView.OnExecute();
  24:         }
  25:  
  26:         #endregion
  27:     }
  28:  
  29: }

Somit kann man das MVVM-Pattern in Silverlight 4 fast eins zu eins zu WPF implementieren. (Man darf nicht vergessen, dass Silverlight ein Subset von WPF /.NET Framework ist). Als nächstes werde ich versuchen dass Commanding mit mehreren Parametern auszuführen. Für Anregungen und Kritik bin ich immer offen und hoffe nicht ganz auf der falschen Fährte gewesen zu sein. Damit man sich darüber ein Bild machen kann, ist die Source hier zum Herunterladen hinterlegt.

 

Willkommen im Internet

17.01.2010 18:30:00 | Timo Rehl

Hallo liebe Internetwelt,

heute habe ich freundlicherweise einen Internetblog eingerichtet bekommen. Ich bin zunächst zwiegespalten was die Sache hier angeht. Ich möchte es einfach einmal versuchen hier meine Erfahrungen und Erkenntnisse hauptsächlich aus der Kategorie Softwareentwicklung niederzuschreiben.

Wahrscheinlich werde ich es aber auch nicht sein lassen können Beiträge aus der Kategorie "Unsinn" zu verfassen, vor allem wenn es um Comedy oder Fun geht.

Ich werde nun zunächst etwas Zeit benötigen mich mit der Administration zu diesem Blog auseinander zu setzen, mal schauen wann ich hier den ersten sinnvollen Beitrag verfassen kann.

Dann á pros pos Kategorie "Unsinn" schaut euch doch einmal dieses Video an ;-)


Viel Spaß dann in Zukunft mit meinem Blog...
Timo

Using the Microsoft Solver Foundation Add-In for Excel

17.01.2010 15:52:36 | Alexander Groß

After listening to the Hanselminutes episode on Microsoft Solver Foundation (MSF) I decided it’s time to give it a shot today. Solver Foundation seems to be a solution to a set of constrained problems I sometimes face:

  • Sharing costs and calculating minimal money transfers after trips with my friends, where each friend spent some money.
  • Giving out questions to attendees of our User Group “Boot Camps”: Speakers prepare ~20 questions, ranging from easy to moderate levels. We assign each attendee an easy question and one to chew a bit upon. Further, every question should be given out to two attendees, so in case someone doesn’t make it to the meeting we’re still able to cover the question.

Something I don’t remember Scott Hanselman and his guest talking about is that Solver Foundation comes with an Excel Add-In that is supposed to make creating models easy easier, no code needed. Along with the “Solver Foundation for Excel Primer” document that is installed along with the binaries I figured Excel would be a good way to start looking into Solver Foundation.

After the MSI ran, I started Excel but didn’t find the Solver Foundation tab that’s advertised in the primer. The COM Add-Ins dialog said something about that the Add-In could not be loaded. Nice! Luckily the Event Viewer was more helpful in terms of error messages where I found this beauty of an exception:

Microsoft.VisualStudio.Tools.Applications.Runtime.CannotCreateCustomizationDomainException:
Customization could not be loaded because the application domain could not be created.
---> System.IO.FileLoadException: Could not load file or assembly 'MicrosoftSolverFoundationForExcel, Version=1.0.6.4890, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

My first guess was that an old MSF assembly was referenced and I decided to go with an assembly binding redirect for excel.exe. Didn’t help. The next step was to get into the innards of VSTO deployment. What I found in the MicrosoftSolverFoundationForExcel.vsto and MicrosoftSolverFoundationForExcel.dll.manifest files wasn’t surpising: Several references to old versions of MSF. None of which were deployed by the MSI installer, so Excel trying to load such dependencies failed.

<assemblyIdentity name="MicrosoftSolverFoundationForExcel" version="1.0.8.6048"…
<assemblyIdentity name="MicrosoftSolverFoundationForExcel" version="1.0.6.4890"…

I updated both references to the match the installed version 2.0.2.8632, just to find myself faced with another error saying that the manifest’s digital signature is broken.

Now was time to contact my friend Lars Keller who is an expert in VSTO development. Lars told me that I would have to re-sign the .vsto and .manifest files to make the signature reflect my changes. The Office Development with Visual Studio blog has the full details.

  1. I had to create a certificate that can be used for code signing:
    makecert -r -pe -n "CN=Your Name" -b 01/01/2010 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss My
  2. Export the certificate as a PFX file using certmgr.msc
  3. Create a backup copy of the MSF Excel Add-In .manifest and .vsto files
  4. Open a Visual Studio Command prompt and navigate to the manifest's location
  5. Make edits to the manifest file correcting the assembly versions of MicrosoftSolverFoundationForExcel to 2.0.2.8632
  6. Update the digital signatures for both the manifest and the VSTO file:
    mage.exe -update MicrosoftSolverFoundationForExcel.dll.manifest -CertFile <your-cert.pfx> -Password <cert-export-password>
    mage.exe -update MicrosoftSolverFoundationForExcel.vsto -appmanifest MicrosoftSolverFoundationForExcel.dll.manifest -CertFile <your-cert.pfx> -Password <cert-export-password>
  7. Restart Excel, the Solver Foundation tab should be on the ribbon

(Tested with Office 2010 beta.)

Custom XML in Microsoft Word

16.01.2010 13:49:55 | Kay Giza

Am 22.12.2009 wurde in Texas im Berufungsverfahren ein Urteil gegen Microsoft gefällt, das die Verwendung von Custom XML (was übrigens seit Word 2003 enthalten ist) in Microsoft Word verbietet.

Was hat es damit auf sich?
Das Urteil bzgl. Custom XML bezieht sich nur auf die USA und Kanada und dort auf Kopien von Word 2007, die nach dem 11.01.2010 verkauft werden. Microsoft wird in den USA und Kanada ab diesem Termin nur noch Versionen ausliefern, die das betroffene Feature nicht mehr enthalten.

Meine Kollege Jens Häupel hat in seinem Blogeintrag 'Die Geschichte um Custom XML in Microsoft Word und deren Auswirkungen' die wichtigsten Fakten zusammengefasst.
Ein entsprechendes Update für bestehende Installationen für Word steht im Microsoft Download-Center breit: Update for Microsoft Office Word 2007 (KB974631)



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

Custom XML in Microsoft Word

16.01.2010 12:10:14 | Kay Giza

Am 22.12.2009 wurde in Texas im Berufungsverfahren ein Urteil gegen Microsoft gefällt, das die Verwendung von Custom XML (was übrigens seit Word 2003 enthalten ist) in Microsoft Word verbietet.

Was hat es damit auf sich?
Das Urteil bzgl. Custom XML bezieht sich nur auf die USA und Kanada und dort auf Kopien von Word 2007, die nach dem 11.01.2010 verkauft werden. Microsoft wird in den USA und Kanada ab diesem Termin nur noch Versionen ausliefern, die das betroffene Feature nicht mehr enthalten.

Meine Kollege Jens Häupel hat in seinem Blogeintrag 'Die Geschichte um Custom XML in Microsoft Word und deren Auswirkungen' die wichtigsten Fakten zusammengefasst.
Ein entsprechendes Update für bestehende Installationen für Word steht im Microsoft Download-Center breit: Update for Microsoft Office Word 2007 (KB974631)



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

Unerwartete ChangeConflictException in LinqToSql

15.01.2010 18:54:00 | Martin Hey

Das Löschen eines Datensatzes in LinqToSql in der Regel recht einfach: Zunächst ermittelt man das zu löschende Entity und ruft im Folgenden zunächst die Methode DeleteOnSubmit und im Anschluss SubmitChanges auf.
public void RemoveAddressById(int id)
{
using (AddressRepositoryDataContext context = new AddressRepositoryDataContext(ConnectionString))
{
Address addressToDelete = (from address in context.Addresses
where address.Id == id
select address).FirstOrDefault();
if (addressToDelete != null)
{
context.Addresses.DeleteOnSubmit(addressToDelete);
context.SubmitChanges();
}
}
}
Dieses Vorgehen war bei mir bisher immer von Erfolg gekrönt. Heute allerdings funktionierte es plötzlich nicht mehr - bei der Ausführung erschien eine ChangeConflictException.

Ein Konflikt konnte es nicht sein, denn es handelte sich um die einzige Applikation auf dieser Datenbank und es wurden auch keine weiteren Datenänderungen durchgeführt.
Seltsam sah auch das automatisch abgesetzte SQL-Statement aus - so kann das ja nicht funktionieren....


Was war passiert?

Zusammengefasst: Das in der dbml-Datei gespeicherte Datenbankschema stimmte nicht mehr mit dem real existierenden Datenbankschema überein. Beim Entwurf waren alle Spalten als Not Nullable definiert. In der Zwischenzeit war eine der Spalten Nullable geworden. Beim entsprechenden Datensatz stand nun in dieser Spalte auch ein Null-Wert. Offenbar kommt LinqToSql damit nicht klar. Nach einer Aktualisierung des Schemas der dbml-Datei funktionierte alles wieder wie gewohnt.

Bliebe zu wünschen übrig, dass hier eine aussagekräftigere Fehlermeldung kommt - zumal der Wert der Spalte für eine Delete-Operation überhaupt nicht notwendig ist, da der zu löschende Datensatz ja eindeutig anhand des Primärschlüssels erkennbar gewesen wäre.

Wir unterstützen Softwareentwickler mit Empower für ISVs

15.01.2010 13:35:18 | Peter Kirchner

Nutzen Sie unsere Empower für ISVs-Initiative, um Entwicklungskosten zu senken und -prozesse zu beschleunigen.

clip_image001

Mit dem Empower-Abonnement für Softwarehersteller (ISVs) erhalten Sie für viele unserer Produkte Softwarelizenzen, auch für den produktiven Einsatz in Ihrem Unternehmen, besonders günstig. Weiterhin erhalten Sie kostenfreien Support sowie Zugang zu technischen Spezialisten, die Sie bei der Softwareentwicklung beraten, Ihnen bei Codemigrationen helfen oder Ihnen Beispielcodes bereitstellen. Senken Sie so Ihre Entwicklungskosten, und beschleunigen Sie die Entwicklungsphase.

Melden Sie sich bis März an und sichern Sie sich im Rahmen des Empower-Abonnements Visual Studio 2010 Professional mit einer MSDN Premium Subscription.

Bildverarbeitung in Silverlight

15.01.2010 13:17:28 | Oliver Scheer

Gerade habe ich eine sehr spannende Bildverarbeitung in Silverlight entdeckt.

Auf www.thumba.com.br befindet sich eine echt Leistungstarke Bildverarbeitung. Das Tolle an der Anwendung ist, das sie auch Out-Of-Browser zur Verfügung steht.

image

Entwicklen von Multitouchanwendungen für den HTC HD2 in verwaltetem Code

15.01.2010 09:40:35 | Peter Nowak

Wie es zu erwarten war, ist die Entwicklecommunity hinsichtlich Multitouch aktiv. So gibt es mittlerweile eine .NET CF Bibliothek von einem Entwickler namens SciLor, wodurch eigene Anwendungen Multitouch unterstützen können.

Zwar ist die Entwicklung noch in den Kinderschuhen – ein erster Schritt ist jedoch getan.

Die Bibliothek, sowie ein paar Samples finden sich hier.



This posting is provided "AS IS" with no warranties, and confers no rights.

Das CommandExecutor Pattern

14.01.2010 23:23:00 | Jan Christian Selke

Vor einiger Zeit schon bin ich über eine/die Implementierung des CommandExecutor Patterns von Jeremy Miller gestolpert. Er selbst wendet es in seinem aktuellen OSS Projekt Storyteller (zur Zeit) nicht an. Storyteller ist ein Tool für ausführbare Spezifikationen bzw. automatisierte Akzeptanztests und damit als Ersatz für FitNesse gedacht. Noch befindet es sich allerdings in der Pre-Release Phase.

Auch wenn ich bisher keine Anwendung in einem Projekt hatte, es ist einfach eine unglaublich schlanke und elegante Implementierung, die es sich genauer anzusehen lohnt. Bei nächster Gelegenheit werde ich sie auf jeden Fall auch selbst ausprobieren. In Ermangelung eigenen Codes nutze ich die Codebeispiele von Jeremy.

Das CommandExecutor Pattern ist vor allem eine Alternative für den Einsatz eines Backgroundworkers. Existieren langlaufende Aufrufe, die auf keinen Fall den UI Thread blockieren sollen, wird der CommandExecutor für den Aufruf von Hintergrund Threads genutzt. Der Kontrakt beinhaltet nur zwei Methoden.

public interface ICommandExecutor

{

    // Execute an operation on a background thread that

    // does not update the user interface

    void Execute(Action action);


    // Execute an operation on a background thread and

    // update the user interface using the returned Action

    void Execute(Func<Action> function);

}

Die erste Methode erhält einen einfachen Methodenaufruf. Die Action wird in einem Hintergrund Thread ausgeführt. Spannender ist die zweite Methode, die den Func<Action> delegate entgegen nimmt. Dies ist die Basis für die Anwendung des Continuation Prinzips. Der primär auszuführenden Action wird bereits der Folgeaufruf mitgegeben. Es wird also bereits beim Aufruf festgelegt, wie es danach weiter gehen soll.

Verdeutlicht wird dies am Beispiel eines Presenters, der mit dem Aufruf RefreshData Daten von einem externen Service abholt und anschließend die View aktualisiert. Dem CommandExecutor wird ein Block übergeben, der Daten von einem externen Service abruft und einen Continuation Block zur Aktualisierung der UI zurückgibt. Die UI kann nicht direkt aktualisiert werden, da der Methodenaufruf zuerst in den UI Thread überführt werden muss.

public class Presenter

{

    private readonly IView _view;

    private readonly IService _service;

    private readonly ICommandExecutor _executor;


    public Presenter(IView view, IService service, ICommandExecutor
executor)

    {

        _view = view;

        _service = service;

        _executor = executor;

    }

    public void RefreshData()

    {

        _executor.Execute(() => {

            var data = _service.FetchDataFromExtremelySlowServiceCall();

            return () => _view.UpdateDisplay(data);

        });

    }

}

Die Execute(Func<Action>) Methode führt die Aktion in einem Hintergrund Thread aus. Die zurück gegebene Action, die Continuation, wird über den SynchronisationContext zurück in den UI Thread gemarshaled und dort ausgeführt. Interessant finde ich, dass er mit dem SynchronisationContext eine Framework Klasse nutzt und keine eigene Logik implementiert. Eine Beipielimplementierung des Executors könnte folgendermaßen aussehen.

public class AsynchronousExecutor : ICommandExecutor

{

    private readonly SynchronizationContext _synchronizationContext;

    
    public AsynchronousExecutor(SynchronizationContext
synchronizationContext)

    {
       
_synchronizationContext = synchronizationContext;

    }

   
    public void Execute(Action action)

    {

        // Exception handling is omitted, but this design

        // does allow for centralized exception handling

        ThreadPool.QueueUserWorkItem(o => action());

    }

   
    public void Execute(Func<Action> function)

    {

        ThreadPool.QueueUserWorkItem(o => {

            Action continuation = function();

            _synchronizationContext.Send(x => continuation(), null);

        });

    }

}

Nachteil dieser Variante ist, sofern ich nicht etwas übersehen habe, dass es keine Möglichkeit gibt während der Ausführung eine Information über den Zustand des Aufrufs zu erhalten oder diesen sogar abzubrechen. Hier kann aber sicherlich optimiert werden…

Speed up load time of AJAX Control Toolkit controls in Combining Scripts

14.01.2010 23:06:00 | Andreas Mehl

In using the ToolkitScriptManager you get optimized script sources.

But there exists still one Issue. Every Script takes its own request.

Normal 0 21 false false false DE X-NONE X-NONE MicrosoftInternetExplorer4

To Boost and to reduce the number of requests your page needs to make for all of the individual scripts.

just add this Handler to your web site "CombineScriptHandler.ashx"

Then use the ToolkitScriptManager instead of the straight ScriptManager in your pages, specifying the CombineScriptsHandlerUrl to point to the handler you just added, similar to this (note: the ScriptMode="Release" trick works here too).

WebForm1.aspx

BizTalk: Checkliste für Empfang von AS2-Nachrichten

14.01.2010 23:06:00 | Wolfgang Kluge

Um über BizTalk-HTTP-Adapter AS2 Daten empfangen zu können, müssen gleich ein paar Einstellungen passen. Ein kleiner Überblick über die wichtigsten Einstellungen soll hiermit geschaffen werden:

  1. Virtuelles Verzeichnis für den Empfang der Nachrichten über HTTP
    • Local Path: Verzeichnis, in dem die Datei BTSHttpReceive.dll liegt, z.B. C:\Program Files\Microsoft BizTalk Server 2006\HttpReceive\ bzw. C:\Program Files\Microsoft BizTalk Server 20009\HttpReceive\
    • Execute permissions: Scripts and Executables
    • Identität des zugewiesenen Application Pools muss ein Benutzer sein, der Zugriff auf die BizTalk-Datenbank hat, in der Regel wird hier BTSIsolatedHostUser verwendet
    • In welcher Web Site das virtuelle Verzeichnis liegt (es kann natürlich auch die Web Site direkt verwendet werden) ist dabei egal. Allerdings sollte man bei mehreren Web Sites darauf achten, dass der virtuelle Pfad über alle Web Sites hinweg eindeutig ist, da man innerhalb der Receive Location die betroffene Web Site nicht mit angeben kann.
  2. Receive Port anlegen
    • Keine oder asynchrone MDN: One-Way
    • MDN synchron: Request-Response
  3. Receive Location anlegen
    • Type: HTTP-Adapter
      • Virtual directory plus ISAPI extension: z.B. /virtualDirectory/BTSHttpReceive.dll.
        Wie oben erwähnt, können die Web Sites des IIS hier nicht angegeben werden. Nur der virtuelle Pfad (ausgehend vom root-Verzeichnis)
      • Es kann ein beliebiger QueryString an die DLL angehängt werden. Damit können - mit nur einem virtuellen Verzeichnis - für verschiedene Kunden und/oder Dokument verschiedene Receie Locations definiert werden (an sich braucht man damit nur ein virtuelles Verzeichnis im IIS einrichten).
        Dieser Querystring muss exakt genauso auch im sendenden Programm angegeben werden (mit exakt ist Reihenfolge, Groß-Kleinschreibung und Umfang gemeint...).
      • Die Einstellung Suspend failed requests aktivieren
    • Receive Pipeline
      • AS2Receive: Wenn beliebige Daten per AS2 empfangen werden sollen
      • AS2EdiReceive: Wenn EDIFACT-Nachrichten per AS2 empfangen werden sollen
      • oder eine selbst-erstellte Pipeline, die die AS2 decoder-Component verwendet
  4. Sender-Party
    • Party Properties
      • Damit der Firmeneintrag beim Empfang der Datei gefunden werden kann, muss als EDIINT-AS2 From Value (AS2-From) der, zwischen den Partnern ausgemachte Name angegeben werden. Der Name sollte nur aus ASCII-Zeichen bestehen
    • AS2 Properties, Party as AS2 Message Sender
      • Hier kann man eigentlich alles auf Standard lassen (keine Checkbox aktiv). Damit gibt der Sender vor, wie die Datei zu behandeln ist.
      • Man kann den Sender auch zu bestimmten Einstellungen zwingen. Dazu die Checkbox Override inbound message properties aktivieren und die Einstellungen in der Gruppe Incoming AS2 message anpassen
      • Wenn die MDN signiert werden soll, dann kann das erreicht werden, indem die Checkbox Sign requested MDN if Disposition-Notification-Option header is not present or if Signed-Receipt-Protocol header is set to optional aktiviert werden. Der Sender darf das allerdings nicht ausschließen...
  5. Empfänger-Party (aktueller Rechner)
    Beim Empfänger in diesem Fall nicht viel Einstellbar. Hier geht es primär um die MDN, die versendet wird
    • Party Properties
      • Damit die Einstellungen der Firma verwendet werden können, muss als EDIINT-AS2 To Value (AS2-To)-Wert der zwischen den Partnern ausgemachte Name für den Empfänger angegeben werden
  6. Send Port oder Orchestration zum Verarbeiten der ankommenden Daten
    • Damit keine Fehlermeldung angezeigt wird, muss die Datei auch verabeitet werden - und das kann man nur erreichen, indem man entweder
      • den oben erstellen Receive Port einer Orchestration zuweist (Bindings -> Inbound Logical Port), oder
      • einen Send Port erstellt und den Filter so anpasst, dass die ankommenden Nachrichten über diesen Port verarbeitet werden (z.B. über die Eigenshaft BTS.ReceivePortName)

Zugegeben, wirklich kurz ist die Liste nicht ;) Dennoch sind nur die notwendigsten Einstellungen beschrieben.

Falls die Nachrichten und MDNs signiert und/oder verschlüsselt werden sollen, hab ich im Artikel BizTalk: Wohin mit den AS2-Zertifikaten entsprechende Einstellungen beschrieben.

Update: Punkt 6 hat zwar an sich nichts mehr mit dem Empfang der Daten zu tun, kam aber dennoch dazu, da der Punkt offenbar oft vergessen / übersehen wird (hat man mir berichtet).

n Strings in WPF zusammensetzten

14.01.2010 21:49:00 | Lars Schmitt

In einer unserer Anwendungen haben wir die Anforderung, dass sich jeder einzelne Window Title, aus einem Namen für das jeweilige Fenster und dem jeweiligen variablen Firmen Namen zusammengesetzt wird. Eigentlich wäre für diesen Sachverhalt alleine kein Blogeintrag notwendig, schließlich gibt es für dieses Vorhaben ja auch genug Möglichkeiten. Jedoch wie ich erst kürzlich wieder lesen konnte, sieht so manch einer aufgrund der Vielzahl an Möglichkeiten den Wald vor lauter Bäumen nicht.

So möchte ich an dieser Stelle, mal zwei Lösungsmöglichkeiten, der Öffentlichkeit etwas näher bringen.

 

Für diesen Anwendungsfall gibt es eine Vielzahl von Lösungsmöglichkeiten, sei es mit einem AttachedProperty, Implementierung eines eigenen Windows, ein im Backend Definiertes Propperty, dass per Binding an die Oberfläche gebunden wird, … alles Möglichkeiten die mir so auf die schnelle einfallen, doch wie so oft es gibt noch weitere.

Wie Z.B. über einen Converter, wie diesen hier

public class AddUnternehmen : IValueConverter 
    { 
        #region IValueConverter Member 


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            return string.Format("{0} - {1}", value, GlobaleDaten.AllgemeineEinstellungen.Singleton.AuthUnternehmen); 
        } 


        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            throw new NotImplementedException(); 
        } 


        #endregion 
    }

Nachdem dieser den Application.Resources hinzugefügt wurde,

<Application.Resources> 
       <conv:AddUnternehmen x:Key="AddFirma"/> 
</Application.Resources>

kann er nun zum zusammensetzen, des Window Title benutzt werden.

<Window.Title> 
    <Binding Converter=”{StaticResource AddFirma}”> 
        <Binding.Source> 


            <!--xmlns:clr="clr-namespace:System;assembly=mscorlib"--> 
            <clr:String>Globale Suche</clr:String> 
        </Binding.Source> 
    </Binding> 
</Window.Title>

 

Und zum Ende noch die zweite versprochene Möglichkeit, welches diesen Anwendungsfall per MultiBinding zu Lösen versucht.

<Window.Title> 
    <MultiBinding StringFormat="{}{0} - {1}"> 
        <Binding> 
            <Binding.Source>


                <!--xmlns:clr="clr-namespace:System;assembly=mscorlib"-->                 
                <clr:String>Globale Suche</clr:String> 
            </Binding.Source> 
        </Binding>


        <!—xmlns:clr="clr-namespace:…"-->                 
        <Binding Path="AuthUnternehmen" Source="{x:Static Glob:AllgemeineEinstellungen.Singleton}"/> 
    </MultiBinding> 
</Window.Title>

javascript document onkeydown bug IE6

14.01.2010 19:48:00 | Andreas Mehl

I recieved an error while trying following code

Normal 0 21 false false false DE X-NONE X-NONE MicrosoftInternetExplorer4 function test(e) { alert(''); }

// Test

document.onkeydown = test;

but why?

After researches i have found out that when i remove the comment it works. Strange!


So the Solution is :

function test(e) { alert(''); }

document.onkeydown = test;

 

Workflow-Ausblick fuer .NET 4 | Training-Kit fuer Visual Studio 2010

14.01.2010 15:02:19 | Kay Giza

Am 11.01.2010 haben wir bei MSDN Online über das Visual Studio 2010 und .NET Framework 4 Training Kit berichtet:

Workflow-Ausblick für .NET 4
Know-how | 11.01.2010
Einen Ausblick auf die Workflow-Funktionalitäten in .NET 4, samt zugehörigem Hands-On-Lab im Visual Studio 2010 und .NET Framework 4 Training Kit, bietet ISV Architect Evangelist Bruce Kyle in seinem Blog. Immerhin haben sich seit Version 3.0 und der derzeit aktuellen Version 3.5 in der neuen Windows Workflow Foundation (WF) diverse konzeptionelle und programmiertechnische Änderungen ergeben. Pflichtlektüre für jeden, der noch nicht auf der Höhe der kommenden Zeit ist und einen schnellen ersten Überblick benötigt.

Hierzu ein wenig Hintergrunddetails:

Das aktualisierte Training-Kit für Visual Studio 2010 und .NET Framework 4 steht ab sofort kostenlos öffentlich zum Download bereit. Diese umfangreiche Ressourcensammlung enthält erweiterte und kommentierte Versionen der Trainingsinhalte von Microsoft für Partnerunternehmen, wie sie auch im Rahmen der Microsoft Trainings verwendet werden.

Das Visual Studio 2010 und .NET Framework 4 Training-Kit bietet alles, was Anwender, Journalisten, Trainer und Unternehmen benötigen, um sich in Visual Studio 2010 und das .NET Framework 4 einzuarbeiten. Es wurde auf die aktuelle Beta 2 abgestimmt und enthält 17 Präsentationen, 21 Demos und 26 Hands-On-Labs (Tutorien). Neu in der aktuellen Version sind außerdem spezifische Inhalte für Office, SharePoint und Application Lifecycle Management (ALM). 

Seit Mitte Dezember 2009 sind außerdem neue deutschsprachige Webcasts zu Visual Studio 2010 von den MSDN-Experten Christian Binder und Dariusz Parys verfügbar. Auf Basis der Visual Studio 2010 Beta 2 werden am Beispiel einer Windows Forms Anwendung einige Aspekte der Anwendungsentwicklung demonstriert. Zielgruppe der Serie sind vor allem Entwickler und Tester. Angefangen mit einigen Grundlagen zu Agiler Software Entwicklung mit VS 2010 über die Erweiterung der Windows Forms Anwendung bis hin zum Testing der Anwendung wird alles in einem End-to-End-Demo gezeigt. Nach Erweiterung und Test der Windows Forms Anwendung zeigt, wird auch darauf eingegangen, wie mit Hilfe neuer .NET Framework Technologien , wie Workflow Foundation 4, Entitiy Framework 4 und ASP.NET MVC, das Anwendungs-Szenario effizient erweitert werden kann. Hier geht's zur Webcast-Serie zu Visual Studio 2010 und .NET Framework 4

In der MSDN Mediathek finden Sie zahlreiche weitere Multimediainhalte zu Visual Studio 2010: MSDN Mediathek



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

Profitieren Sie jetzt von vergünstigen Preisen für digitale Zertifikate von Verisign z.B. für den Windows 7 Logo Test

14.01.2010 14:45:10 | Peter Kirchner

Beziehen Sie jetzt ein Microsoft Authenticode Code Signing Digital ID von Verisign zum Vorzugspreis von nur US$ 99 anstatt dem Normalpreis von US$ 399. Dieses Zertifikat können Sie zur Eröffnung eines WinQual-Accounts nutzen und darüber hinaus zur Dateisignierung verwenden.

Ein WinQual-Account ist Voraussetzung für die Durchführung von Software Logozertifizierungen wie z.B den Windows 7 Logo Test. Besuchen Sie die WinQual Hilfeseite zur Direktverlinkung zu Verisign und dem Promotion Code THEDEAL99. Dieses Angebot ist auf gewisse Zeit limitiert, greifen Sie am besten sofort zu.

Informationen zum Windows 7 Logo Programm finden Sie auch im Windows Developer Center.

Derzeit finden auch Workshops zum Thema Windows 7 in den Niederlassungen von Microsoft Deutschland statt. Informieren Sie sich dazu bitte hier.

Workflow-Ausblick fuer .NET 4 | Training-Kit fuer Visual Studio 2010

14.01.2010 12:05:27 | Kay Giza

Am 11.01.2010 haben wir bei MSDN Online über das Visual Studio 2010 und .NET Framework 4 Training Kit berichtet:

Workflow-Ausblick für .NET 4
Know-how | 11.01.2010
Einen Ausblick auf die Workflow-Funktionalitäten in .NET 4, samt zugehörigem Hands-On-Lab im Visual Studio 2010 und .NET Framework 4 Training Kit, bietet ISV Architect Evangelist Bruce Kyle in seinem Blog. Immerhin haben sich seit Version 3.0 und der derzeit aktuellen Version 3.5 in der neuen Windows Workflow Foundation (WF) diverse konzeptionelle und programmiertechnische Änderungen ergeben. Pflichtlektüre für jeden, der noch nicht auf der Höhe der kommenden Zeit ist und einen schnellen ersten Überblick benötigt.

Hierzu ein wenig Hintergrunddetails:

Das aktualisierte Training-Kit für Visual Studio 2010 und .NET Framework 4 steht ab sofort kostenlos öffentlich zum Download bereit. Diese umfangreiche Ressourcensammlung enthält erweiterte und kommentierte Versionen der Trainingsinhalte von Microsoft für Partnerunternehmen, wie sie auch im Rahmen der Microsoft Trainings verwendet werden.

Das Visual Studio 2010 und .NET Framework 4 Training-Kit bietet alles, was Anwender, Journalisten, Trainer und Unternehmen benötigen, um sich in Visual Studio 2010 und das .NET Framework 4 einzuarbeiten. Es wurde auf die aktuelle Beta 2 abgestimmt und enthält 17 Präsentationen, 21 Demos und 26 Hands-On-Labs (Tutorien). Neu in der aktuellen Version sind außerdem spezifische Inhalte für Office, SharePoint und Application Lifecycle Management (ALM). 

Seit Mitte Dezember 2009 sind außerdem neue deutschsprachige Webcasts zu Visual Studio 2010 von den MSDN-Experten Christian Binder und Dariusz Parys verfügbar. Auf Basis der Visual Studio 2010 Beta 2 werden am Beispiel einer Windows Forms Anwendung einige Aspekte der Anwendungsentwicklung demonstriert. Zielgruppe der Serie sind vor allem Entwickler und Tester. Angefangen mit einigen Grundlagen zu Agiler Software Entwicklung mit VS 2010 über die Erweiterung der Windows Forms Anwendung bis hin zum Testing der Anwendung wird alles in einem End-to-End-Demo gezeigt. Nach Erweiterung und Test der Windows Forms Anwendung zeigt, wird auch darauf eingegangen, wie mit Hilfe neuer .NET Framework Technologien , wie Workflow Foundation 4, Entitiy Framework 4 und ASP.NET MVC, das Anwendungs-Szenario effizient erweitert werden kann. Hier geht's zur Webcast-Serie zu Visual Studio 2010 und .NET Framework 4

In der MSDN Mediathek finden Sie zahlreiche weitere Multimediainhalte zu Visual Studio 2010: MSDN Mediathek



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

Windows 7 Workshops: neuer Termin in Köln

14.01.2010 11:55:36 | Peter Kirchner

Für unsere Windows 7 Workshops (Infos hier) haben wir jetzt einen weiteren Termin für Köln hinzugefügt, da der erste Termin im März bereits ausgebucht ist.

So ist der April-Termin vielleicht eine interessante Option für alle, die im März keine Zeit hatten oder sich nicht mehr für den Workshop anmelden konnten.

Vollständige Liste der Termine:

Client Scripte mit ASP.NET 3.51 zusammenfassen

14.01.2010 10:16:22 | Andre Kraemer

Jeder der in einer ASP.NET Webforms Anwendung ein oder mehrere "Ajax-Enabled" Controls eines Komponentenherstellers nutzt kennt das Problem: Die Anzahl der zum Client übertragenen Scripte steigt explosionsartig an.

Dies liegt daran, dass die meisten Komponentenhersteller je Control ein eigenes Script zum Client senden. Generell ist das auch durchaus sinnvoll, denn nur so kann gewährleistet werden, dass der Browser nur die minimal benötigte Anzahl an Scriptcode vom Server herunterladen muss.

Wie der folgende Screenshot zeigt, wird dieser Segen jedoch auch schnell zum Fluch. Die Abbildung zeigt einen Mitschnitt des Netzwerktraffics beim Besuch einer Seite eines aktuellen Projekts. Inhalt der Seite sind ein Scriptmanager, zwei Infragistics Controls, einige ESRI WebADF Controls sowie ein paar eigene Servercontrols, die auch eigene Scripts rendern.

1_Vorher

Die Anzahl zu übertragenden Scripts beträgt laut Screenshot also 37 Stück.

Interessant, aber wo liegt nun das Problem?

Wir wissen zwar nun, dass wir 37 Scripte zum Client übertragen müssen, aber was ist daran so schlimm und warum sollte es uns überhaupt interessieren?

Um das Problem an der Situation zu erkennen, sollten wir uns kurz vor Auge führen, dass die Scripte nicht gemeinsam innerhalb des selben HTTP Requests wie die eigentliche Website übertragen werden. Stattdessen wird je Script (und auch Bild, CSS Stylesheet, etc.) eine eigene Anfrage an den Webserver gestellt.

Jede dieser Anfragen hat eine gewisse "Rüstzeit" oder auch Latenz. Damit ist die Zeitspanne gemeint, die zwischen dem Absetzen des Befehls, eine Anfrage zu starten und dem tatsächlichen Start der Anfrage vergeht. Je nach Entfernung zwischen Client und Server sowie der Qualität der Internetanbindung der beiden variiert der tatsächliche Wert dieser Reaktionszeit.

Und was bedeutet dies nun konkret?

Schauen wir uns zur Verdeutlichung ein kleines Beispiel an. Gehen wir von jemandem mit einer extrem schlechten Anbindung und einer Latenz von 500 ms aus (zugegeben, der Wert ist recht hoch, lässt sich aber schön einfach rechnen ;-))

Um unsere 37 Scriptdateien herunterzuladen, hätten wir nun also

37 Anfragen * 500 ms Latenz + 37 Antworten * 500 ms Latenz = 37 Sekunden.

Diese 37 Sekunden sind reine Wartezeit und kommen zur eigentlichen Übertragungszeit der Scripte hinzu. Nun ist es natürlich nicht so, dass sämtliche Anfragen sequentiell abgearbeitet werden. Allerdings sieht die Standardkonfiguration vieler Browser eine Beschränkung von zwei gleichzeitigen Verbindungen zu einem Hostnamen vor. Diese Anzahl resultiert aus einer Empfehlung der HTTP 1.1 Spezifikation. Heisst, wir müssen unsere 37 Sekunden noch durch zwei Teilen, da zwei gleichzeitige Verbindungen möglich sind. Bleiben immer noch 18,5 Sekunden übrig.

Was können wir dagegen tun?

Um dieses Problem, was tückischerweise während der Entwicklung nur selten auffällt, da die Latenz zwischen lokalem Webserver und lokalem Webbrowser nicht sonderlich hoch sein dürfte ;-), in den Griff zu bekommen, bietet ASP.NET ab der Version 3.51 das Element CompositeScript als Kindelement des Scriptmanagers an.

Dieses Element erlaubt es, einzelne Scripts anzugeben, welche anschließend automatisch zu einem Script zusammengefasst werden.

Das Ganze sieht ungefähr so aus:

<asp:ScriptManager runat="server" ID="sm1">
    <CompositeScript>
        <Scripts>
            <asp:ScriptReference Name="/Scripts/MeinScript1.js" />
            <asp:ScriptReference Name="/Scripts/MeinScript2.js" />
            <asp:ScriptReference Name="/Scrips/MeinScript3.js" />
        </Scripts>
    </CompositeScript>
</asp:ScriptManager>

Problematisch ist nur, dass man die URL der notwendigen Scripts nur für Dateibasierte Scripts kennt. Sobald ein Script aber als eingebettete Ressource über die Webresource.axd nach aussen gerendert wird, ist die URL unbekannt.

Um dieses Problem zu lösen, kann das auf Codeplex erhältliche Control ScriptReferenceProfiler genutzt werden. Wird es auf einer Seite eingesetzt, rendert es eine Liste aller genutzten Scripte heraus. Diese Liste kann 1:1 kopiert und in das Scripts Element des CompositeScript Elements eingefügt werden.

4_ScriptProfilerOutput

Die eingefügten Scripts werden anschließend serverseitig zu einem großen Script hinzugefügt und innerhalb einer einzigen Anfrage herunter geladen.

Nicht so schnell!

Der Versuch, alle 37 Scripte der zuvor genannten Seite in einem CompositeScript Element zusammen zu führen resultiert in folgendem Fehler:

5_ASP_Error

Die Ursache für diesen Fehler ist, dass der Scriptmanager jedes benötigte Script mit einem kryptischen Bezeichner an die URL anhängt. Dies sprengt schnell die maximale Begrenzung einer URL auf 1024 Zeichen.

Die Lösung

Um dieses Problem zu umgehen platziert man einfach mehrere CompositeScript Elemente auf der Seite und verteilt die Scripte auf diese. Da jedes CompositeScript Element einen eigenen Scriptmanager benötigt, nutzt man ab dem zweiten CompositeScript Element statt zusätzlichen Scriptmanagern, von denen es immer nur einen pro Seite geben darf einfach ScriptmanagerProxy Controls.

Die optimale Verteilung der Scripte auf die einzelnen CompositeScript Elemente ist schnell im Trial-and-Error-Verfahren gefunden. In meinem Beispiel sah sie übrigens wie folgt aus:

<asp:ScriptManagerProxy ID="ScriptManagerProxyAjax" runat="server">
    <CompositeScript>
        <Scripts>
            <asp:ScriptReference Name="MicrosoftAjax.js" />
            <asp:ScriptReference Name="MicrosoftAjaxWebForms.js" />
            <asp:ScriptReference Name="AjaxControlToolkit.Common.Common.js" Assembly="AjaxControlToolkit, Version=3.0.30512.20315, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
            <asp:ScriptReference Name="AjaxControlToolkit.Compat.Timer.Timer.js" Assembly="AjaxControlToolkit, Version=3.0.30512.20315, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
            <asp:ScriptReference Name="AjaxControlToolkit.Compat.DragDrop.DragDropScripts.js"                 Assembly="AjaxControlToolkit, Version=3.0.30512.20315, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
            <asp:ScriptReference Name="AjaxControlToolkit.Animation.Animations.js" Assembly="AjaxControlToolkit, Version=3.0.30512.20315, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
        </Scripts>
    </CompositeScript>
</asp:ScriptManagerProxy>

<asp:ScriptManagerProxy ID="ScriptManagerProxyInfragisticsCommon" runat="server">
    <CompositeScript>
        <Scripts>

...
        </Scripts>
    </CompositeScript>
</asp:ScriptManagerProxy>

...

Gerade wenn man sich mit einem Element nahe an der 1024 Zeichen Grenze befindet, sollte man jedoch im Hinterkopf halten, dass die tatsächliche Url der Seite später meist nicht mehr http://localhost ist, sondern eher http://meinesubdomain.meinedomain.de. Durch die Änderung des Hostnamens während der Produktivsetzung ändert sich also eventuell noch einmal die Länge der URL. Daher im Zweifelsfall lieber ein Script weniger als in der Entwicklungsumgebung möglich in die CompositeScript Tags einfügen.

Es müssen übrigens nicht alle Scripts in CompositeScript Tags gepackt werden. Solche, die nicht verpackt wurden, werden wie gehabt ganz normal weiter als einzelner Script Tag zum Browser herausgerendert.

Und was bringts nun?

Tja, was bringt der ganze Aufwand nun? Da Bilder bekanntlich mehr als Worte sagen, hier ein paar Vorher/Nachher Screenshots der zuvor vorgestellten Seite:

Initial hat die Seite 37 Scripts heruntergeladen.

 1_Vorher

Yahoo's YSlow gab der Seite eine Gesamtnote von E.

 2_Vorher_YSlowGrade

Die Ladezeit betrug knapp 15 s, die Gesamtgröße 734 kb.

 3_Vorher_YSlowSize

Nach den Änderungen wurden nur noch 9 Scripte referenziert.

 6_Firebug_Nachher

Die YSlow Benotung stieg immerhin von E auf D.

 7_Nachher_YSlowGrade

Die Ladezeit reduzierte sich auf knapp 5 s, die Gesamtgröße auf 655 kb.

8_Nachher_YSlowSize



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

Neue Windows Mobile SDK Entwicklungszertifikate verfügbar

14.01.2010 06:47:26 | Peter Nowak

Wer aktuell versucht mobile Anwendungen oder Installationsdateien mit den Zertifikaten des Windows Mobile SDKs zu signieren erlebt eine kleine böse Überraschung: Die Zertifikate sind nicht mehr gültig.
Der Grund hierfür liegt darin, dass die Zertifikate mit dem 31.12.2009 abgelaufen sind.

Aus diesem Grund wurden neue Zertifikate im Windows Mobile Blog zur Verfügung gestellt. Zu finden sind diese mit entsprechenden Installationsanleitungen hier: http://windowsteamblog.com/blogs/wmdev/archive/2010/01/12/new-windows-mobile-developer-certificates.aspx



This posting is provided "AS IS" with no warranties, and confers no rights.

19.01.10 Treffen der .NET Developer Group Braunschweig - Internationalisierung von WPF Anwendungen

14.01.2010 02:16:00 | Lars Keller

Unser 41 User Group Treffen der .NET Developer Group Braunschweig findet am 19.01.10, ab 19 Uhr in der Kilian’s Raffinerie statt.

Dieses Mal haben wir Mathias Raacke mit dem Thema “Internationalisierung von WPF Anwendungen – Vorstellung eines Visual Studio Plugins zur Lokalisierung von WPF Anwendungen” zu Gast.

Windows Presentation Foundation Anwendungen lassen sich nicht mehr so einfach und bequem im Designer in andere Sprachen übersetzen, wie es noch bei Windows Forms oder ASP.NET Anwendungen möglich war. Weder Visual Studio noch Expression Blend bieten eine direkte Unterstützung für die Lokalisierung von WPF-Anwendungen. Es gibt zwar eine Lokalisierungs-API für WPF, doch zu der API gibt es lediglich eine für die Praxis ungeeignete Beispielanwendung. Alternativ dazu gibt es verschiedene Ansätze aus der Community, um WPF Anwendungen zu lokalisieren, die jedoch ihrerseits mit verschiedenen Nachteilen verbunden sind.

Aus diesem Grund entwickelt Mathias Raacke zurzeit ein Lokalisierungs-Plugin für Visual Studio 2010, das die Lokalisierung von WPF Anwendungen erheblich vereinfachen soll und auch den Übersetzer in die Lokalisierung mit einbindet. Der Datenaustausch zwischen Entwickler und Übersetzer erfolgt dabei über Windows Azure.

In diesem Vortrag erfahren die Teilnehmer zunächst, mit welchen Techniken WPF Anwendungen an verschiedene Sprachen und Kulturen angepasst werden können. Anschließend wird das neue Lokalisierungsplugin vorgestellt und gezeigt, wie dieses Plugin entwickelt wurde. Dabei gibt es einen Einblick in die Entwicklung von Visual Studio Plugins sowie die Entwicklung von Windows Azure Anwendungen.

Weitere Informationen unter www.dotnet-braunschweig.de.

Wie immer ist jeder herzlich willkommen!

BizTalk: Wohin mit den AS2-Zertifikaten (Signieren und Verschlüsseln)

13.01.2010 23:27:00 | Wolfgang Kluge

Will man Nachrichten mittels AS2 verschlüsselt oder signiert versenden oder eine verschlüsselte oder signierte Nachricht empfangen, so muss man sich zwangsläufig mit Zertifikaten auseinandersetzen und diese an bestimmte Stellen (Zertifikatsspeicher) ablegen und an ebenso genau definierten Stellen in der BizTalk Administration Console auswählen.

Am Einfachsten macht man sich die Arbeit, wenn man das SDK-Tool "Certificate Wizard" (unter C:\Program Files\Microsoft BizTalk Server 2006\SDK\Utilities\Certificate Wizard\CertWizard.exe bzw. im Verzeichnis BizTalk Server 2009 zu finden) verwendet. Dieses Tool kopiert je nach Einstellung die Zertifikatsdateien in die entsprechenden Zertifikatsspeicher. Wer es manuell machen oder einfach nur überprüfen will, der kann sich an folgender Liste orientieren.

Das Auswählen des Zertifikats innerhalb der BizTalk Server Administration Console muss zudem auch noch an entsprechenden Stellen erfolgen. Auch hier hilft die Liste weiter.

Nachrichten

  Signierung Ver-/Entschlüsselung
Eingehend Speicher:
Typ:
BizTalk:
Other People (Local computer)
Public key (Partner)
Party (Partner) / Certificates
Speicher:
Typ:
BizTalk:
Personal store (InProc User)
Private key (Home)
Isolated Host / Certificates
Ausgehend Speicher:
Typ:
BizTalk:
Personal store (InProc user)
Private key (Home)
Group / Certificates*
Speicher:
Typ:
BizTalk:
Other People (Local computer)
Public key (Partner)
Send Port / Certificates

MDN

  Signierung
Eingehend Speicher:
Typ:
BizTalk:
Other People (Local computer)
Public key (Partner)
Party (Partner) / Certificates
Ausgehend
synchron
Speicher:
Typ:
BizTalk:
Personal store (Isolated host user)
Private key (Home)
Group / Certificates*
Ausgehend
asynchron
Speicher:
Typ:
BizTalk:
Personal store (InProc user)
Private key (Home)
Group / Certificates*

* Für die ausgehende Signierung kann seit BizTalk Server 2006 R2 SP1 das Zertifikat anstatt bei der BizTalk Group auch bei der Party direkt angegeben werden.

Zertifikatsspeicher

Die Zertifikatsspeicher sind nicht ganz einfach zu finden. Man kann aber wie folgt vorgehen. Bestenfalls legt man sich eine eigene Administrationskonsole an.

  • mmc.exe starten
  • Menü "File" -> "Add/Remove Snap-In..."
  • Button "Add..."
  • "Certificates" auswählen und mit "Add" bestätigen
  • "Computer Account" auswählen
  • weiter bis Finish
  • "Certificates" auswählen und mit "Add" bestätigen
  • "My User Account" auswählen

Leider kann man keinen speziellen Benutzer auswählen. Die Datei kann aber als *.msc-Datei gespeichert werden und danach mit der rechten Maustaste mittels "Run as..." mit einem anderen Benutzer gestartet werden. Hier kann dann der BTSHostUser und der BTSIsolatedHostUser eingetragen werden. Nicht schön, aber hilfreich ;)

Treffen der .NET Usergroup Dresden

13.01.2010 21:12:00 | Martin Hey

Die .NET Usergroup Dresden trifft sich das nächste Mal am 03.02.2010 im Gebäude der T-Systems MMS. Beginn ist wie immer 18:00 Uhr und an diesem Abend gibt es wieder zwei sehr interessante Vorträge:
  • Einführung in die Entwicklung mit Windows Azure (Erik Baum)
    Erik wird uns einen praktischen Einstieg in die Entwicklung mit Microsofts Cloud Computing Dienst Windows Azure geben und uns zeigen wie man mit wenigen Schritten zur eigenen Anwendung in der Cloud kommt. 
  • Dynamic Linq (Martin Hey)
    Anhand eines Beispieles zeige ich, wie man zur Laufzeit Expression-Trees für Linq-Abfragen erstellt, die man dann zur dynamischen Filterung und Sortierung von Objekten verwenden kann.
Weitere Informationen zum Termin und einen Link zur Anmeldeliste findet man auf der Seite der .NET Usergroup.

Download: Neues kostenloses Training-Kit für Visual Studio 2010 und .NET Framework 4

13.01.2010 12:00:56 | Peter Kirchner

Das aktualisierte Training-Kit für Visual Studio 2010 und .NET Framework 4 steht ab sofort kostenlos öffentlich zum Download bereit. Diese umfangreiche Ressourcensammlung enthält erweiterte und kommentierte Versionen der Trainingsinhalte von Microsoft für Partnerunternehmen, wie sie auch im Rahmen der Microsoft Trainings verwendet werden.

Das Visual Studio 2010 und .NET Framework 4 Training-Kit bietet alles, was Anwender, Journalisten, Trainer und Unternehmen benötigen, um sich in Visual Studio 2010 und das .NET Framework 4 einzuarbeiten. Es wurde auf die aktuelle Beta 2 abgestimmt und enthält 17 Präsentationen, 21 Demos und 26 Hands-On-Labs (Tutorien). Neu in der aktuellen Version sind außerdem spezifische Inhalte für Office, SharePoint und Application Lifecycle Management

Seit Mitte Dezember 2009 sind außerdem neue deutschsprachige Webcasts zu Visual Studio 2010 von den Visual Studio 2010/.NET-Experten Christian Binder und Dariusz Parys verfügbar. Auf Basis der Visual Studio 2010 Beta 2 werden am Beispiel einer Windows Forms Anwendung einige Aspekte der Anwendungsentwicklung demonstriert.

Zielgruppe der Serie sind vor allem Entwickler und Tester. Angefangen mit einigen Grundlagen zu Agiler Software Entwicklung mit VS 2010 über die Erweiterung der Windows Forms Anwendung bis hin zum Testing der Anwendung wird alles in einem EndtoEnd-Demo gezeigt. Nach Erweiterung und Test der Windows Forms Anwendung zeigt, wird auch darauf eingegangen, wie mit Hilfe neuer .NET Framework Technologien , wie Workflow Foundation 4, Entitiy Framework 4 und ASP.Net MVC, das Anwendungs-Szenario effizient erweitert werden kann

Download: Neues kostenloses Training-Kit für Visual Studio 2010 und .NET Framework 4

13.01.2010 09:12:18 | Oliver Scheer

Das aktualisierte Training-Kit für Visual Studio 2010 und .NET Framework 4 steht ab sofort kostenlos öffentlich zum Download bereit. Diese umfangreiche Ressourcensammlung enthält erweiterte und kommentierte Versionen der Trainingsinhalte von Microsoft für Partnerunternehmen, wie sie auch im Rahmen der Microsoft Trainings verwendet werden.

Das Visual Studio 2010 und .NET Framework 4 Training-Kit bietet alles, was Anwender, Journalisten, Trainer und Unternehmen benötigen, um sich in Visual Studio 2010 und das .NET Framework 4 einzuarbeiten. Es wurde auf die aktuelle Beta 2 abgestimmt und enthält 17 Präsentationen, 21 Demos und 26 Hands-On-Labs (Tutorien). Neu in der aktuellen Version sind außerdem spezifische Inhalte für Office, SharePoint und Application Lifecycle Management

Seit Mitte Dezember 2009 sind außerdem neue deutschsprachige Webcasts zu Visual Studio 2010 von den Visual Studio 2010/.NET-Experten Christian Binder und Dariusz Parys verfügbar. Auf Basis der Visual Studio 2010 Beta 2 werden am Beispiel einer Windows Forms Anwendung einige Aspekte der Anwendungsentwicklung demonstriert. Zielgruppe der Serie sind vor allem Entwickler und Tester. Angefangen mit einigen Grundlagen zu Agiler Software Entwicklung mit VS 2010 über die Erweiterung der Windows Forms Anwendung bis hin zum Testing der Anwendung wird alles in einem EndtoEnd-Demo gezeigt. Nach Erweiterung und Test der Windows Forms Anwendung zeigt, wird auch darauf eingegangen, wie mit Hilfe neuer .NET Framework Technologien , wie Workflow Foundation 4, Entitiy Framework 4 und ASP.Net MVC, das Anwendungs-Szenario effizient erweitert werden kann

IE6 Update: Help kill Internet Explorer 6 (Extension)

11.01.2010 20:55:00 | Gordon Breuer

This article is also available in English! This article is also available in English!

ie6update Es gibt mal wieder ein neues Projekt, um den Microsoft Internet Explorer 6 von den PCs der Benutzer zu vertreiben. Das ich diese Aktion nur befürworten kann muss ich hoffentlich nicht erst erwähnen, habe doch auch ich laut meinen Logfiles hin und wieder noch Besucher, die es wagen mit dieser Plage von einem Webbrowser hier vorbei zu schauen. Das neue “IE6 Update”-Projekt versucht es nun mit einem Trick: Mit Hilfe von Javascript wird bei Benutzern des IE6 eine gelbe Hinweisleiste am oberen Browserrand eingeblendet mit dem Text, dass zum Betrachten der Seite benötigte Updates für den Browser fehlen. Klickt man auf diese Leiste wird jedoch kein ActiveX gestartet oder installiert sondern man landet auf der IE8-Seite von Microsoft.

Ob diese kleine “Irreführung” ethisch gesehen 100% korrekt ist? Egal! Diese Missgeburt veraltete Browserversion stellt ein erhebliches Sicherheitsrisko für alle Benutzer dar und genau genommen ist der Internet Explorer 8 ja auch ein Update…

Um jedenfalls das Installieren dieses kleinen Snippets für Benutzer der BlogEngine.NET zu vereinfachen, habe ich kurzerhand eine Extension geschrieben. Im einfachsten Fall genügt es, die cs-Datei in den Ordner “/AppCode/Extensions/” zu kopieren und schon ist man fertig. Wer aus Performancegründen die verwendete Javascript-Datei und/oder die Grafiken auf den eigenen Webserver spielen möchte findet die Dateien auf der Projektseite www.ie6update.com und kann in den Einstellungen im Adminbereich die Pfade ganz einfach anpassen. Weiterhin kann man den Pfad zu jQuery hinterlegen, wenn man nicht den CDN von Microsoft verwenden möchte. Eine Lokalisierung ist dort ebenfalls möglich sowie das Ändern des Ziel-Links. Alle Einstellungen können also bequem über die Adminoberfläche vorgenommen werden ohne Hand am Quellcode anlegen zu müssen.

FileDefault IE6Update.cs (3,2KB)

Artikel empfehlen auf .NET-Kicks Deutschland

Methoden Ein- und Ausgänge als PostSharp-Aspekt protokollieren

11.01.2010 20:03:00 | Jan Christian Selke

Ein wesentliches Merkmal aspektorientierter Programmierung ist gleichzeitig einer der großen Vorteile; Separation of Concerns (SoC). Besonders einfach können solche Aspekte in C# eingesetzt werden, um Methodenein- und ausgänge zu tracen.

Aspekte im Sinne der aspektorientierten Entwicklung werden als concerns oder cross cutting concerns bezeichnet. Es handelt sich dabei i.d.R. um modular implementierte, querschnittliche nichtfunktionale Bausteine wie z. B. Security oder Logging. Das zugrunde liegende Prinzip (SoC) geht auf Edsger Wybe Dijkstra zurück. Neben der Trennung von Verantwortlichkeiten sind weitere Vorteile die Wiederverwendbarkeit von Quellcode (Aspekte lassen sich als Komponenten einfach in jedem neuen Projekt einsetzen) sowie eine erhöhte Modularisierung und damit verbunden eine erhöhte Wartbarkeit des Gesamtsystems.

Es existieren verschiedene Frameworks um Aspektorientierung in einer Anwendung zu etablieren (bspw. Aspect# oder PostSharp). Ich habe mich für den Einsatz von PostSharp entschieden. Der Download hierfür steht bei PostSharp.org bereit. Um die Anwendung herunterladen zu können, ist eine Registrierung erforderlich. Am einfachsten Installieren lässt es sich per Windows Installer. Alternativ gibt es eine ausführliche Schritt für Schritt Dokumentation bei PostSharp für eine per Projekt Registrierung.

Als Grundlage für das folgende Beispiel dient ein Post von Merrick Chaffer. Einige Teile seines Beispiels habe ich entsprechend meiner Vorstellungen angepasst.

Als Logging Framework nutze ich log4net in Verbindung mit einer eigenen Weiterentwicklung des "The Static Gateway Pattern" Ansatzes von Jean-Paul S. Boodhoo in Form einer Art “Fluent Wrapper” für log4net. Eine solche Lösung ist auch als Expression Builder bei Martin Fowler zu finden.

Der erste Schritt ist das Erstellen einer eigenen Aspekt Klasse, MethodTraceAspect, zum Protokollieren der Methoden. Hierzu leite ich von dem Basis-Aspekt OnMethodBoundaryAspect ab. Dieser Aspekt ist speziell darauf ausgelegt Methoden “boundary” Funktionalitäten zu implementieren. Damit die Klasse als Aspekt genutzt werden kann, muss sie mit Attributen dekoriert werden. Als wichtigste zu nennen sind AttributeUsage und MulticastAttributeUsage. Das AttributeUsage Attribut beschreibt wie wie der Aspekt als Attribut genutzt werden darf. MulticastAttributeUsage erlaubt es dem Aspekt von abstrakten oder virtuellen Methoden entlang der Vererbungshierarchie an die überschreibenden vererbt zu werden. Aspekte mit PostSharp werden nicht “by default” vererbt.

Damit auch tatsächlich die Methoden Ein- und Ausgänge protokolliert werden können, müssen die Methoden OnEntry und OnExit überschrieben werden. Der Methodenname sowie die Parameter bzw. Rückgabewert sind die in der Logdatei zu protokollierenden Kerndaten. Mittels der MethodExecutionEventArgs  kann auf diese Informationen zugegriffen werden.

Zur Protokollierung des Betretens der Methode wird die MethodBase übergeben. Der Name der Methode wird aus der Eigenschaft Name ausgelesen. Falls Parameter vorhanden sind, wird über alle Parameter mit Ausgabe der Werte iteriert.

public void EnterMethod(MethodBase methodBase)

{

    this.MessageFormat("Entering: {0}", methodBase.Name);

    if(this.ParameterInfos != null && this.ParameterInfos.Length > 0)

    {

        for (int i = 0; i < this.ParameterInfos.Length; i++ )

        {

            ParameterInfo paramInfo = this.ParameterInfos[i];

            this.MessageFormat(" Parameter[{0}]", i);

            this.MessageFormat(" name: \"{0}\"", paramInfo.Name);

            this.MessageFormat(" type: [{0}]", paramInfo.ParameterType);

            this.MessageFormat(" value: {{0}}", this.ParameterValues[i]);

        }

    }

    this.ParameterInfos = null;

    this.ParameterValues = null;

}

Analog verläuft das Schreiben beim Verlassen einer Methode. Erst wird der Methodenname geschrieben. Dann, falls vorhanden, der Rückgabewert.

public void LeaveMethod(MethodBase methodBase) 

    this.MessageFormat("Leave: {0}", methodBase.Name); 
    if(this.ReturnValue != null
    { 
        this.MessageFormat("  returns value: {{0}}", this.ReturnValue); 
    } 

    this.ReturnValue = null
}

Die Klasse MethodTraceAspect hat folgenden Aufbau

using System;

using PostSharp.Laos;

namespace JCS.Log.Aspects

{

    [Serializable]

    [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
    [MulticastAttributeUsage(MulticastTargets.Method, AllowMultiple = true)]

    public sealed class MethodTraceAspect : OnMethodBoundaryAspect

    {

        public override void OnEntry(MethodExecutionEventArgs eventArgs)

        {

            base.OnEntry(eventArgs);

            Log.For(eventArgs.Instance).Debug

                .WithMethodParameter(eventArgs.Method.GetParameters(), eventArgs.GetReadOnlyArgumentArray())

                .EnterMethod(eventArgs.Method);

        }

 

        public override void OnExit(MethodExecutionEventArgs eventArgs)

        {

            base.OnExit(eventArgs);

            Log.For(eventArgs.Instance).Debug.WithReturnValue(eventArgs.ReturnValue).LeaveMethod(eventArgs.Method);

        }

    }

}

Genutzt wird der Aspekt dann beispielsweise durch Attributierung von Methoden unmittelbar auf die Methode oder assemblyweit durch Setzen des Attributs in der AssemblyInfo.cs

[assembly: MethodTraceAspect(AttributeTargetAssemblies = "BusinessLayer", AttributeTargetTypes = "BusinessLayer.*")]

Sollen nicht auch alle Ein- und Ausgänge von Getter und Settern protokolliert werden sollen, sollte ein weiteres Attribut gesetzt werden.

[assembly: Logging(AttributeTargetMembers = "*et_*", AttributeExclude =true)]

Dies kann notwendig sein, da sonst in kurzer Zeit eine Vielzahl an Logeinträgen geschrieben wird, das Protokoll sehr unübersichtlich werden kann und die Anwendung massiv ausgebremst wird.

Elektrosmog sinnvoll nutzen!

11.01.2010 17:56:00 | Jens Peter Kleinau

Mal ein völlig anderes Thema! Statt immer nur darüber zu klagen, dass der gesamte städtische Raum voller Elektrosmog ist, kann man ihn nun sinnvoll nutzen. Endlich macht es Sinn, dass man in einem Mehrparteien-Wohnhaus von den Funkwellen der 10-20 WLANs anderer Mieter perforiert wird. Auch der ansonsten nicht so zuverlässige HotSpot, zu dem man sowieso das Passwort nicht bekommen oder es wieder...

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

Die Geschichte um Custom XML in Microsoft Word und deren Auswirkungen

11.01.2010 14:26:39 | Jens Häupel

Die kanadische Firma i4i LDT. verklagte Microsoft im letzten Jahr mit der Begründung, die Verwendung von Custom XML in Word verstoße gegen ihre patentrechtlich geschützte IP.

Am 22.12.2009 wurde in Texas im Berufungsverfahren ein Urteil gegen Microsoft gefällt, das die Verwendung von Custom XML (was übrigens seit Word 2003 enthalten ist) in Microsoft Word verbietet. Was hat es damit auf sich?

Das Urteil bzgl. Custom XML bezieht sich nur auf die USA und Kanada und dort auf Kopien von Word 2007, die nach dem 11.01.2010 verkauft werden. Microsoft wird in den USA und Kanada ab diesem Termin nur noch Versionen ausliefern, die das betroffene Feature nicht mehr enthalten.

Für bestehende Installationen und  ältere Versionen bzw. für andere Regionen wie z.B. Europa gilt das Urteil nicht.

Betroffen wären also lediglich ISVs, die in den USA oder Kanada aktuelle oder neue Lösungen mit diesem Feature verkaufen oder verkaufen wollen und zwar an Kunden, die noch kein Word besitzen. Betroffen sein können in der Zukunft auch Kunden, die solchen Lösungen von ISVs im Einsatz haben und deren Word-Version im Zuge eines Roll-Outs auf die neueste gebracht wird. 
Es besteht allerdings auch die Möglichkeit, dass die kanadische Firma seine Klage weiterführen oder ausdehnen wird. Das lässt sich derzeit aber schwer abschätzen.

Die zwei Seiten von Custom XML:

Custom XML bezieht sich einerseits auf die Möglichkeit, Textpassagen innerhalb von Microsoft Word an XML Tags zu binden, wenn ein XML Schema an das Dokument angebunden ist und somit diese Textpassagen in einen Kontext zu setzen. Dieser Teil ist vom o.g. Urteil betroffen.

Andererseits legt Custom XML innerhalb des Open XML-Standards fest, wie eigene (custom) XML-Datenstrukturen abgelegt werden, um Content Controls mit Daten zu füllen. Dazu erhält das entsprechende Content Control eine Datenquelle, die auf ein Element aus einer Custom XML Struktur zeigt. Die Inhalte beider Container (Custom XML und Content Control) gleicht Word selbsttätig ab. Warum nun das Ganze? Content Controls sind Oberflächenelemente, die es dem Anwender erlauben, sehr einfach z.B. Formulare auszufüllen. Wenn das Dokument nun beispielsweise in einen Workflow eingebunden ist, so können mit einer (meist serverseitigen) Workflow Activity diese Daten über den Custom XML Datastore sehr einfach und schnell extrahiert und weiter verarbeitet werden, ohne das ganze Dokument (WordprocessingML) durchsuchen zu müssen.
Custom XML Data Stores fallen nicht unter das Urteil und können problemlos weiter verwendet werden.

Der Open XML Standard (ECMA und ISO) selbst ist vom Urteil nicht betroffen.

Hier dazu auch ein Blogeintrag des Microsoft Group Program Managers Gray Knowlton sowie eine Möglichkeit, Content Controls als Mittel zum Zweck zu verwenden.

 

Update (18.01.2010):

Microsoft hat einen Patch sowohl für Office 2007 als auch Office 2003, der auf Aufforderung (von Microsoft) und nur in den USA und Kanada installiert werden muss, um dem o.g. Urteil zu genügen. Dieser Patch wird in einem Artikel der KnowledgeBase beschrieben (bitte die engl. Version lesen). Installieren Sie die Patches nicht, wenn Sie Ihren Wohnsitz nicht in den Vereinigten Staaten oder Kanada haben! Der Patch nimmt darauf keine Rücksicht und entfernt auf jeden Fall die betroffenen Features.

 

Update (01.02.2010):

Konkret bezieht sich das Urteil nur auf den Mechanismus innerhalb von Word (ab 2003), der benötigt wird, um Custom XML Tags aus der Datei zu lesen. Dieser wird in den US- und kanadischen Versionen von nun an entfallen müssen. Er betrifft nicht die Art und Weise, wie Custom XML in Open XML-Dateien gespeichert wird. Im Moment herrscht etwas Verwirrung, warum diese Funktionalität in der Beta 2 von Office 2010 komplett entfernt worden ist, und zwar weltweit. Microsoft arbeitet derzeit an einer Version, die konform zu o.g. Patent ist.

 

Update (05.02.2010):

Jetzt gibt es ein Tool, womit geprüft werden kann, ob die hier besprochene Funktionalität in einer gegebenen Installation verfügbar ist bzw. womit die Funktionalität wieder hergestellt werden kann (nur außerhalb von Nordamerika). Das betrifft Office 2003 und 2007.

 

Anmerkung: Dies ist meine Einschätzung der Lage, die auf den mir vorliegenden Informationen beruht und kein offizielles Statement von Microsoft.

Meine Xbox Live Gold Karte ist da :)

11.01.2010 12:11:29 | Oliver Scheer

Wer sagt, das man sich nur zu Weihnachten beschenken darf, lügt :)

Ich hab mir mal wieder meine Xbox Live Mitgliedschaft für ein Jahr verlängert. Und heute ist das “Paket” angekommen :)

 

Wenn das nicht mal ein großes schönes Geschenk, mit viel Verpackung für eine Registrierungsnummer ist …

ContentPresenter richtig benutzen

10.01.2010 12:52:00 | Lars Schmitt

Als erstes ein Beispiel, wie man es so oder in etwas anderer Form leider immer noch des Öfteren sehen kann.

<Grid> 
        <Button Name="button1"> 
            <Button.Template> 
                <ControlTemplate TargetType="{x:Type Button}"> 
                    <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center">


                        <!—Warum bindet man das Content Propperty ein weiteres mal? --> 
                        <ContentPresenter Content="{TemplateBinding Content}" /> 
                    </Border> 
                </ControlTemplate> 
            </Button.Template> 
        </Button> 
    </Grid>

 

Doch bei den beiden Presenter Objekten (ItemsPresenter und ContentPresenter) ist dieses gar nicht von Nöten, denn diese beiden Objekte bringen doch diese Bindung bereits von Haus aus mit. Das einzige was an dieser Stelle also wirklich gebraucht wird, ist eigentlich nur das der TargetType des ControlTemplates, auf das richtige Control oder zumindest auf den richtigen ControlType (ContentControl oder ItemsControl) gesetzt wird.

Topsy Retweet Button als BlogEngine.NET Extension

09.01.2010 14:47:21 | Klaus Bock

Immer mehr Blogs bieten sogenannte Retweet Buttons an, wie etwa Gordon Breuer. Gordon verwendet z.B. einen Button von TweetMeme.
Da ich eigentlich fast immer Pingbacks von Topsy erhalte, habe ich mir Topsy einmal genauer angesehen. Auf der Widget Seite von Topsy werden eigentlich nur zwei Retweet Buttons angeboten.

  • Topsy Retweet Button für Wordpress
  • Topsy Retweet Button für Web Sites

Für mich waren beide nicht zu gebrauchen. Der Topsy Retweet Button für Web Sites, stellt lediglich ein Verknüpfung zu einem Javascript auf Topsy.com dar. Dieses Javascript injiziert zur Laufzeit den Retweet Button und stellt die Verknüpfungen zum CSS auf dem Webserver von Topsy her. Das ist bestimmt eine einfache Lösung, ich halte jedoch nichts von fremd injiziertem HTML in das DOM meiner Seiten. Doch das muss jeder für sich selbst entscheiden.

In der Vorarbeit zur Blogengine.NET Erweiterung stellte ich erfreut fest, dass sowohl Topsy als auch TinyURL eine API anbieten und Topsy problemlos mit verkürzten URLs statt der langen Artikel-URLs umgehen kann.

In der Konfiguration der Erweiterungen eines Blog, können die verschiedenen Optionen der Topsy Retweet Button Erweiterung eingestellt werden.

Topsy Retweet Button Config

Der, im Screenshot rot markierte, Wert Topsy Nick, sollte unbedingt mit dem Twitternamen belegt werden, unter dem die Retweets erfolgen sollen.
Mit Button Position kann festgelegt werden, ob der Retweet Button vor oder nach dem Inhalt des jeweiligen Artikel eingefügt werden soll.
Wenn Use TinyURL angehakt wird, wird die jeweilige URL eines Post in eine TinyURL übersetzt.

Hier nun das erzeugte HTML mit den im Screenshot gezeigten Einstellungen.

<div class="topsybutton">
	<a class="topsy-total"
		href="http://topsy.com/tb/tinyurl.com/y8o36se"
		title="Twitter Trackbacks zu diesem Artikel"
		rel="tb nofollow">
		<span class="topsy-count">
			<span class="topsy-num">3</span>
			<span class="topsy-unit">tweets</span>
		</span>
	</a>
	<a class="topsy-retweet"
		href="http://button.topsy.com/retweet?nick=klaus_b0&amp;url=http://tinyurl.com/y8o36se"
		title="retweet diesen Artikel" rel="rt nofollow">
		retweet
	</a>
</div>

Wie im obigen Listing ersichtlich, wird jedes Element in einem eigenen Container dargestellt, der jeweils mit einer eigenen CSS-Klasse versehen ist. Somit dürften für das Styling keine Wünsche offen bleiben.

Wer Interesse hat, kann sich die Erweiterung mit dem folgenden Link herunterladen. Im Archiv ist auch eine CSS-Datei als Beispiel für das Styling der verschiedenen Elemente enthalten.

TopsyButton.zip

Feedback und Kritik ist wie immer ausdrücklich erwünscht.

TortoiseSVN Overlay Icons werden im Explorer nicht mehr angezeigt

09.01.2010 14:00:00 | Alexander Zeitler

Wenn im Windows Explorer die TortoiseSVN Overlay Icons trotz korrekter Settings und Neustart nicht angezeigt werden, kann das daran liegen, dass Windows maximal nur 15 verschiedene Overlay Icons im Explorer anzeigen kann, wobei 4 bereits von Windows selbst belegt werden.

Verschiedene Applikationen wie TortoiseSVN, Office Groove, DropBox usw. nutzen Overlay Icons. Nutzt man mehrere Apps, die Overlay Icons verwenden und überschreitet damit das Limit von 11, hilft es nur, Prioritäten zu setzen, d.h. nicht so häufig benötigte Overlay Icons zu löschen.

Dies geschieht über die Registry (Änderungen an der Registry erfolgen auf eigene Gefahr!).

Die Overlay Icons sind in Subkeys von

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\ShellIconOverlayIdentifiers

definiert.

Entfernen kann man das jeweiligen Overlay Icon durch das Löschen des zugehörigen Subkeys, welcher am eindeutigen Key-Namen wie “Offline Files” eindeutig zu erkennen ist.

SmartBackgroundWorker

09.01.2010 12:01:00 | Stefan Lange

Eine alternative Implementierung der Klasse BackgroundWorker erlaubt es, in ein und derselben Funktion beliebig zwischen UI- und Worker-Thread hin und her zu wechseln. Die verblüffende Implementierung führt zu sehr übersichtlichem Code ganz ohne Callbacks und Delegates.

Schon seit .NET 1.0 leistet die Klasse System.ComponentModel.BackgroundWorker gute Dienste, wenn es darum geht, zeitintensive Funktionen von einem Hintergrund-Thread ausführen zu lassen, damit das Userinterface nicht vorübergehend eingefroren wird. Über die drei Events DoWork, ProgressChanged und RunWorkerCompleted kann man sich über den Fortschritt der Ausführung informieren lassen. So weit, so gut. Wird die Aufgabenstellung komplizierter, beispielsweise weil man während der Hintergrundausführung die Oberfläche mit den bisher berechnenden Zwischenergebnissen aktualisieren oder mehrere Aufgaben hintereinander ausführen möchte und dabei ggf. Fehlermeldungen anzeigen möchte, wird der benötigte Code schnell recht unübersichtlich. Das liegt daran, dass man bei den meisten nicht trivialen Problemen immer eine einfache State Machine (einen Endlichen Automaten) bauen muss, welche(r) die Aktionen des UI-Threads und des Worker-Threads synchronisiert. Die benötigten Delegates, Lambda-Expressions und Synchronization-Contexte führen schnell zu schwer lesbarem und somit auch schwer wartbarem Code.

Wäre es nicht schön, wenn man ganz einfach sequenziellen Code und einfache Schleifen in einer übersichtlichen Funktion „einfach so“ hinschreiben könnte und dabei für einzelne Codeabschnitte jeweils angeben könnte, ob sie im UI-Thread oder im Background-Thread ausgeführt werden sollen?  Wäre nett, geht aber nicht, hätte ich gesagt, bevor ich letztes Jahr den Kurzvortrag von Ralf Hoffmann bei einem Treffen der Bonner .NET Usergroup gesehen habe. Ralf verwendet den yield-Befehl für eine erstaunliche Lösung des beschriebenen Problems. Da Ralf keinen Blog betreibt, der Ansatz aber sehr nützlich ist, möchte ich seine Idee hier vorstellen.

Beispielanwendung

Zur Demonstration des Verfahrens nehmen wir an, wir wollen irgendwelche Items berechnen und eine Listbox damit füllen. Das Berechnen eines jeden Items dauert so lange, dass es in einem Background-Thread ausgeführt werden muss. Jedes Item soll jedoch sofort angezeigt werden, wenn es berechnet wurde und nicht erst am Ende des Vorgangs, wenn alle Ergebnisse vorliegen. Außerdem soll die Berechnung über das UI abgebrochen werden können, wenn es dem Anwender zu lange dauert.

Hier das Beispiel als Silverlight-Anwendung. Die Berechnung jedes Items dauert eine knappe Sekunde und lastet dabei den Worker-Thread voll aus, wie ein Blick in den Task-Manager zeigen kann. Der Browser und die Silverlight-Anwendung werden davon aber nicht blockiert. Der Vorgang kann jederzeit über einen Button abgebrochen und wieder neu gestartet werden.

Die zugehörige Worker-Funktion aus der Codebehind-Datei sieht wie folgt aus:

/// <summary>
/// A simple function that gets alternating executed by
/// the UI-thread and a background-thread.
/// </summary>
IEnumerator<SwitchTo> MyWorkerFunktion(string someParameter, int someOtherParameter)
{
  // At start we run in the background thread, so switch to UI-thread
  // to update the StartStopButton and clear the ListBox
  yield return SwitchTo.UIThread;
  StartStopButton.Content = "Stop";
  Listbox.Items.Clear();

  // Now switch to background thread and start the loop
  yield return SwitchTo.BackgroundThread;
  for (int idx = 1; idx <= 25; idx++)
  {
    // Get the next item
    string item = DoSomeHardWorkToGetAnItem(idx);

    // Switch to UI-thread to update the list-box
    yield return SwitchTo.UIThread;
    Listbox.Items.Add(item);

    // Check if user pressed the Stop button
    if (_stop)
    {
      Listbox.Items.Add("<Operation was canceled by user>");
      _stop = false;
      break;
    }

    // Switch back to background thread for next loop iteration
    yield return SwitchTo.BackgroundThread;
  }

  // We have done and reset Start/Stop button in UI-thread
  yield return SwitchTo.UIThread;
  StartStopButton.Content = "Start";
}

Unglaublich, oder? Über den Enum-Typ SwitchTo wird im yield return angegeben, ob der nächste Codeabschnitt im UI- oder im Background-Thread ausgeführt werden soll.  Der Code ist praktisch selbstdokumentierend und sehr gut lesbar.

Aufgerufen wird diese Funktion beim Drücken des Start-Buttons wie folgt:

_smartBackgroundWorker.RunWorkerAsync(MyWorkerFunktion("Hello", 42));

Die Parameter der Woker-Funktion werden im Beispiel nicht gebraucht und sollen nur andeuten, dass man ohne weiteres beliebige Parameter übergeben kann.

Warum funktioniert das?

Um den SmartBackgroundWorker zu verwenden, muss man nicht in allen Einzelheiten verstehen, warum bzw. wie er funktioniert. Für Interessierte hier eine knappe Zusammenfassung der internen Struktur.

Der in C# 2 eingeführte yield-Befehl kann in Funktionen verwendet werden, die IEnumerator als Rückgabewert haben. Zu einer solchen Funktion generiert der Compiler eine passende private Klasse, die u.a. von IEnumerator  abgeleitet ist und daher auch die Funktion MoveNext implementieren muss. Der ursprüngliche Code mit den yield return-Anweisungen wird nun vom Compiler in eine State Machine konvertiert, die beim Aufruf von MoveNext jeweils in den nächsten Zustand übergeht. Als Effekt davon führt ein Durchlaufen des Iterators mit MoveNext dazu, dass jeweils genau die Statements bis zum nächsten (ursprünglichen) yield return ausgeführt werden (bzw. der Durchlauf beendet wird). Der generierte Code von MoveNext kann dabei sehr umfangreich und verworren werden, wie ein Blick darauf mit dem .NET Reflector zeigt. Diese Komplexität stört aber nicht weiter, da der Code ja vom Compiler unsichtbar und zuverlässig generiert wird.

Durch den Einsatz von yield return haben wir also erreicht, dass der Code unserer Worker-Funktion abschnittsweise ausgeführt wird. Wir müssen nun nur noch dafür sorgen, dass zwischen den einzelnen Aufrufen ggf. der ausführende Thread gewechselt wird. Dies wird innerhalb von SmartBackgroundWorker in der Funktion OnRun durchgeführt.

/// <summary>
/// Steps through the worker function.
/// </summary>
void OnRun(object argument)
{
  try
  {
    SwitchTo context = SwitchTo.BackgroundThread;
    var enumerator = (IEnumerator<SwitchTo>)argument;
    bool moveNext = true;
    SendOrPostCallback nextStep = obj =>
                                    {
                                      moveNext = enumerator.MoveNext();
                                      if (moveNext)
                                        context = enumerator.Current;
                                    };
    while (moveNext)
    {
      if (context == SwitchTo.UIThread)
      {
        // Run next step synchronously on UI thread
        _uiSynchronizationContext.Send(nextStep, null);
      }
      else
      {
        // Run next step on background thread
        nextStep(null);
      }
    }
  }
  finally
  {
    _isRunning = false;
  }
}

Ein SmartBackgroundWorker merkt sich im Constructor den SynchronizationContext des UI-Threads und muss daher immer im UI-Thread angelegt werden. Beim Start der Worker-Funktion über RunWorkerAsync wird diese über ein Delegate an einen Thread aus dem ThreadPool gebunden. Bis hierher ist die Implementierung identisch mit dem .NET Typ BackgroundWorker. Der Thread aus dem Pool startet dann in obigem OnRun, die den Unterschied zu BackgroundWorker ausmacht.

In der Variablen nextStep wird der Code zum Durchlaufen des nächsten Iterator-Schritts gespeichert. Die Variable context speichert den Rückgabewert von yield return, also entweder UIThread oder BackgroundThread.

In der while-Schleife wird über den Wert von context unterschieden, in welchem Thread der nächste Codeabschnitt aufgerufen werden soll. Ist es der Background-Thread, wird nextStep direkt aufgerufen, denn OnRun läuft ja bereits im Worker-Thread. Ist es der UI-Thread, wird nextStep mit der Funktion Send von SynchronizationContext an den UI-Thread „gesendet“. Technisch passiert dabei folgendes: Durch Send wird eine Art „spezielles Event“ in die Event-Queue des UI-Threads eingereiht. Ist dieses Event an der Reihe, wird der Code in nextStep durch den UI-Thread ausgeführt und somit auch der nächste Abschnitt in unserer Worker-Funktion. Bis diese Ausführung abgeschlossen ist, blockiert der Background-Thread, d.h. der Funktionsaufruf von Send kommt erst dann zurück, wenn nextStep vom UI-Thread vollständig ausgeführt wurde.

Mit etwas Abstand betrachtet liegt also die Innovation von SmartBackgroundWorker in Folgendem: Anstatt einen normalen BackgroundWorker zu verwenden und selber eine State Machine zu bauen, die zwischen dem UI-Thread und einem Background-Thread jongliert, schreibt man relativ linearen Code zusammen mit yield return und lässt den Compiler die passende State Machine generieren.

Coole Sache. Wie schon gesagt, ich habe es nicht erfunden, sondern meine Implementierung nur aus Code von Ralf Hoffmann abgeleitet, der wiederum von einem Screencast von Jeffrey Richter inspiriert wurde (vermutlich diesem hier).

Bewertung

Der Einsatz von SmartBackgroundWorker ist nicht auf Silverlight beschränkt, sondern funktioniert mit WPF oder WinForms genauso. Ich habe nur deshalb Silverlight verwendet, damit ich die Demo direkt in diesen Artikel im Blog einbauen kann.

Im letzten Jahr haben wir den SmartBackgroundWorker in verschiedenen Silverlight-Anwendungen verwendet und er hat sich als sehr nützlich erwiesen. Hier meine persönliche pro/contra-Liste.

Vorteile

  • Leicht zu verwenden
  • Keine zusätzlichen Eventhandler, Delegates oder Lambdas notwendig
  • Führt zu übersichtlichem und intuitiv nachvollziehbarem Code
  • Worker-Funktionen lassen sich sehr leicht verketten bzw. ineinander verschachteln

Nachteile

  • Exception-Handling in der Worker-Funktion kann unübersichtlich werden, da yield nicht innerhalb von try/catch verwendet werden kann
  • In VB.NET nicht verwendbar, da diese Sprache nicht über ein yield-Statement verfügt (was aber eher eine Einschränkung der Sprache ist)

Insgesamt kann ich den SmartBackgroundWorker sehr empfehlen.

Fazit

Man kann sich natürlich fragen, ob das Ganze wirklich eine gute Idee oder nur ein Hack ist, da ja der yield-Befehl für etwas missbraucht wird, für das er nicht erfunden wurde. Meiner Meinung nach ist es eine sehr gute Idee, denn es ist eine saubere Lösung für ein konkretes Problem. Und dies ist das Einzige, worauf es letztlich ankommt, wenn man den Nutzen einer Idee bewerten will. Und im Vergleich zu anderen Innovationen finde ich die Schreibweise der Worker-Funktion sogar sehr elegant. Die Parallel-Extensions von .NET 4.0 sind beispielsweise auch sehr nützlich und innovativ, aber der Code, den man teilweise schreiben muss, ist doch arg gewöhnungsbedürftig. Aber dies ist ein anderes Thema.

Hier der Quellcode zum Downloaden:

SmartBackgroundWorker.zip (7,77 kB)

Mario benötigt Unterstützung

09.01.2010 01:29:00 | Lars Keller

Mario Meir-Huber möchte auf der Mix10 einen Vortrag halten und hat dafür folgenden Beitrag eingereicht: Microsoft Surface goes social – a research project at the University of Linz

Mario ist in die letzte Runde mit seinem Vortrag gekommen und nun entscheidet ein Community Voting. Aus diesem Grund braucht Mario unsere Unterstützung, damit er die letzte Runde schafft.

Wer ihn dahingehend unterstützen möchte, hätte folgende Schritte zu tun:

  1. Auf diese Seite gehen: http://visitmix.com/opencallvote/
  2. Im Suchfeld nach "Mario Meir-Huber    " suchen und dann auf "Add This Entry to Ballot" klicken (Link ist unten)
  3. Dann auf "Submit Your Ballot" im rechten Feld klicken.

Ich würde mich sehr freuen, wenn Mario es durch unsere Hilfe in die letzte Runde schafft!

NEW Version 3.2 TeamSpeak Sidebar Gadget für Windows Vista und Windows 7

08.01.2010 23:25:00 | Andreas Mehl

I have released a new version from my teamspeak sidebar gadget.

What i added was:

  • Added Feature for Windows Vista Users who wants to detach the gadget from the sidebar, to show it in Special Docked State
  • Added Language English as default. Currently there is only one extra Language availabale German. If there is no German Windows, english is always the default
  • Added Extra Languages: French, Nederland
  • Added Fullviewer Width changeable.
  • Added Reset Button
  • Added Changeable Font-Size for Fullviewer
  • Added direct query for Teamspeak version 2
  • Added getting server for teamspeak version 2. 
  • Added Special Docked State Modus for teamspeak version 2.

 

Screenshots can be found here: Screenshots

Documentation can be found here: Documentation

Have fun Laughing

Download Sidebar Gadget Teamspeak 3.2

Kaffesatzlesen für 3D

08.01.2010 13:08:00 | Jens Peter Kleinau

In wenigen Jahren werden wir im Bereich des Home Entertainments und der Consumer Electronics mindestens eine weitere Revolution erleben. Ebenso wie die hochauflösende Flachbildschirme die Welt der Kunden vom Fernseher bis zum Mobilen Geräten vollkommen veränderten,  werden 3D- und Touchdisplays sowie berührungsfreie Eingabegeräte die Heim- und Büroelektronik verwandeln. Die Prognosen des...

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

Wo sind schon wieder meine Code Coverage-Ergebnisse?

08.01.2010 11:35:00 | Martin Hey

Mal wieder gab es ein Problem mit den Code-Coverage-Ergebnissen - dieses Mal allerdings nicht bin Desktop-Build wie in meinem letzten Post als die Code-Coverage-Ergebnisse fehlten. Im aktuellen Fall waren sie im aktuellen Projekt beim Teambuild nicht vorhanden. Das war etwas ernüchternd, denn genau diese Kennzahlen sollten Teil des Projektstatusberichtes sein.

In meinem Fall steuert die tfsbuild.proj den Serverbuild. Bereits enthalten waren die Tags RunTest und RunCodeAnalysis. Mit diesen Einstellungen war ich davon ausgegangen, dass auch die Tests durchgeführt und Code-Coverage berechnet werden kann. Aber weit gefehlt: Zwar wurden Tests durchgeführt, aber als Ergebnis der Code-Coverage kam die Meldung "No coverage result".

Nach einigem Suchen war das Problem gefunden: Damit die Ergebnisse auch erzeugt werden, benötigt der Build die Angabe einer *.testrunconfig-Datei. In dieser Datei stehen die Informationen von welchen Dateien Code-Coverage-Ergebnisse erzeugt werden sollen. Eine solche Datei wird in der Regel auch schon automatisch angelegt, wenn man ein Testprojekt erstellt und genau eine Datei mit diesem Schema muss auch in der tfsbuild.prj-Datei unter dem Tag RunConfigFile angegeben werden. Ist dieser Tag in der prj-Datei nicht vorhanden, so muss er komplett neu hinzugefügt werden.
<!--  TESTING
Set this flag to enable/disable running tests as a post-compilation build step.
-->
<RunTest>true</RunTest>

<!-- CODE ANALYSIS
Set this property to enable/disable running code analysis. Valid values for this property are
Default, Always and Never.
Default - Perform code analysis as per the individual project settings
Always - Always perform code analysis irrespective of project settings
Never - Never perform code analysis irrespective of project settings
-->
<RunCodeAnalysis>Default</RunCodeAnalysis>

<RunConfigFile>$(SolutionRoot)\MyProject\testrun.testrunconfig</RunConfigFile>


Mit dem so konfigurierten Build werden nun auch Code-Coverage-Ergebnisse beim Teambuild erzeugt.

In Microsoft Access ein eigenes Ribbon erstellen

07.01.2010 22:48:00 | Martin Hey

Seit Office 2007 glänzt Microsoft Access mit Ribbons statt klassischer Menüs. Die Ribbons sind erweiterbar und mit Hilfe von etwas XML kann man recht einfach eigene Ribbons erstellen.

Die Konfiguration wird in einer neuen Systemtabelle gespeichert. Dazu muss zunächst einmal sichergestellt sein, dass in den Navigationsoptionen der Haken bei Systemobjekte anzeigen gesetzt ist.

Nun legt man eine neue Tabelle mit dem Namen USysRibbons an, mit folgenden Feldern:
NameDatentyp
RibbonNameText
RibbonXmlMemo
Da der Ribbonname eindeutig sein muss, kann das entsprechende Feld auch gleich als Primärschlüssel verwendet werden - es spricht aber auch nichts dagegen, noch ein weiteres Feld (z.B. Id) anzufügen und dieses als Primärschlüssel zu definieren.

Nun kann man in die Tabelle seine Ribbon-Definition eintragen. Wie das XML genau aussehen muss, entnimmt man dabei am besten der MSDN. Eine sehr gute Seite zu dem Thema ist auch accessribbon.de. Möchte man das XML nicht manuell erstellen, so können hier die Visual Studio Tools for Office (Export Ribbon to Xml) oder der Ribbon-Creator helfen.

Nachdem man den Datensatz angelegt und das Ribbon in den Access-Optionen als Standard definiert hat, wird nun ab dem nächsten Start derDatenbank das eben erstellte Ribbon angezeigt.


Ein kleiner Tipp noch am Rande: Problemlos können die bereits implementierten Bilder verwendet werden. Dazu muss nur im Tag imageMso ein gültiger Wert angegeben werden. Leider gibt es dafür keine offizielle Dokumentation von Microsoft. Welche Werte gültig sind, kann man ganz leicht selbst ermitteln, indem man in den Einstellungen der Schnellzugriffsleiste mit der Maus über die verfügbaren Symbole fährt. Im Tooltipp steht die Id des Bildes in Klammern dahinter.

Neue Codeübersetzung auf dotnet-snippets.de

07.01.2010 19:21:08 | Jan Welker

Rainer Schuster hat mich neulich auf eine interessante Möglichkeit hingewiesen, Quellcode in verschiedene .NET Sprachen zu übersetzen.

Das Team von SharpDevelop hat einen so genannten Code Converter entwickelt, der folgende Übersetzungen durchführen kann:

  • C# in VB.NET
  • C# in Boo
  • C# in Python
  • C# in Ruby
  • VB.NET in C#
  • VB.NET in Boo
  • VB.NET in Python
  • VB.NET in Ruby

Der Converter kann online oder per Webservice genutzt werden. Den Webservice hab ich mal schnell in dotnet-snippets.de eingebunden. Jetzt können alle C# Snippets nach VB.NET (und umgekehrt) übersetzt werden.

Ich denke die Funktion kommt wie gerufen, wenn man einen passenden Snippet gefunden hat, dieser aber in der falschen Sprache vorliegt.

vb

cs

Die Übersetzung funktioniert natürlich nur, dann wenn der Code auch kompilierbar ist ;-)

SQL Server 2008 Management Studio Express nachträglich installieren

07.01.2010 12:00:00 | Alexander Zeitler

Installiert man SQL Server 2008 Express z.B. mittels Visual Studio 2010 Beta 2, wird kein SQL Server Management Studio Express installiert.

Den Download von SQL Server 2008 Management Studio Express kann man hier nachholen, die Installation ist allerdings etwas “versteckt” und läuft nicht wie bei SQL Server 2005 Express einfach parallel zur vorhandenen Installation, sondern integriert sich in die Installationsroutine des eigentlichen SQL Server 2008 Express.

Hier deshalb die Schritte, die nach dem Ausführen der SQLManagementStudio_x86_ENU.exe bzw. SQLManagementStudio_x64_ENU.exe nötig sind:

SQL Server 2008 Installation Center

SQL Server 2008 Setup - Setup Support Rules

SQL Server 2008 Setup - SetupS upport Files

SQL Server 2008 Setup - Setup Support Rules

SQL Server 2008 Setup - Installation Type

SQL Server 2008 Setup - Product Key

SQL Server 2008 Setup - License Terms

SQL Server 2008 Setup - Feature Selection

SQL Server 2008 Setup - Disk Space Requirements

SQL Server 2008 Setup - Error And Usage Reporting

SQL Server 2008 Setup Installation Rules

SQL Server 2008 Setup - Ready To Install SQL Server 2008 Setup - Installation Progress

SQL Server Management Studio ist installiert

Das ganze lässt sich auf der Kommandozeile auch abkürzen:

SQLManagementStudio_x86_ENU.exe /q /FEATURES=SSMS /ACTION=Install

Ersetzt man die Option “/q” durch “/qs” kann man den Installationsfortschritt auch verfolgen.

Dabeigewesen: “Nerdmare Before Christmas” am 21.12.2009

07.01.2010 11:07:30 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/07/dabeigewesen-nerdmare-before-christmas-am-21-12-2009.aspx'; tweetmeme_source = 'jansche';

Quelle: Nils Hitze, silberkind.de

Das kommt mir ja schon wieder vor, als wäre es ewig her, dabei war es erst vor gut zwei Wochen. Das “Nerdmare Before Christmas” Social-Event von Nils Hitze alias silberkind.de alias @kojote in der NIEDERLASSUNG in München. Eine nette kleine Veranstaltung, die mir mal wieder gezeigt hat, wie schlecht das Bild von Microsoft nach außen und bei den Entwicklern und Admins aus der Linuxwelt (die auch lange meine Welt war und deren Ansichten ich lange geteilt habe) ist.

Eigentlich nur ein Abend unter Passionsteilern, Webbies, Netties, Admins, Geeks und Nerds. Netterweise haben Mayflower und Uxebu das Sponsoring übernommen und so gab es Getränke for free (as in beer, im wahrsten Sinne des Wortes).

Mein Kollege Tom Wendel und ich waren “allein unter Wölfen”, wie ich mit einem lachenden und einem weinenden Auge sagen muss. Ich finde es immer wieder erstaunlich, wie offen negativ die meisten Geeks zwar Microsoft gegenüber sind, gleichzeitig aber, und das ist extrem wichtig für mich, sich genauso offen und diskussionsbereit zeigen. Und ich verstehe sehr gut, dass man Microsoft aus Prinzip ablehnen kann. Ich habe das selber lange genug getan, um zu wissen, wovon ich spreche. Aber die Bereitschaft trotzdem für Diskussionen offen zu sein, finde ich unglaublich sozial und sympathisch. Das bringt mich dazu, Veranstaltungen dieser Art zu lieben, auf denen ich eigentlich erstmal eher Feind als Freund bin! Und die PHP und Linux Entwicklerszene zu lieben.  Ganz ehrlich, ihr habt es bisher immer geschafft, dass ich einen guten Tag/Abend hatte, weil ich gute Gespräche hatte. Aus denen ich natürlich nicht immer als Gewinner, und auch nie als Verlierer gegangen bin. Weil es darum auch gar nicht ging!

Genauso war es auch auf besagtem Nerdmare in der Niederlassung.

Und hätte der Abend nicht so katastrophal vorzeitig mit Magenkrämpfen geendet (daran war ein Virus und nicht die Niederlassung schuld), dann hätte ich noch gerne mit viel mehr der Anwesenden über Dinge wie Microsofts Entwicklerphilosophie, Programmiersprachen und das Web gesprochen.

Danke an Nils Hitze für die Organisation und die Initiative, immer wieder so großartige Events zu veranstalten. Er sucht übrigens gerade einen Job, wenn ihr was habt oder wisst, dann schreibt ihm doch eine Nachricht. Die mittelfristigen Auswirkungen der Wirtschaftskrise haben seinen derzeitigen Arbeitsplatz leider dahin gerafft.
https://www.xing.com/profile/Nils_Hitze

Expression Blend 3 Grundlagen Videos

07.01.2010 09:00:00 | Oliver Scheer

Sascha Wolter hat auf Vimeo eine Grundlagen Serie zu Expression Blend und Silverlight erstellt.

  • Mein erstes Silverlight-Projekt
  • Grundlagen und Deep Zoom Composer
  • Mit den Zeichenwerkezugen zeichnen und animieren
  • Eine einfache Animation
  • Segmente erstellen und nutzen
  • Anwendungs-Layouts erstellen
  • Das 9teilige Segmentraster für perfekt skalierbare Elemente
  • Zustände und Verhalten (Behaviors) nutzen
  • Beispieldaten verwenden
  • Prototyping mit SketchFlow

Das vollständige Album seiner Videos ist hier zu finden.

Skills 2010

06.01.2010 22:10:40 | Andre Kraemer

Als Consultant lebe ich davon, mich und mein Wissen an den Mann zu bringen. Neben stark ausgeprägten Soft Skills, sind tiefgehende technische Fertigkeiten somit unabdingbar. Da sich die IT Welt schneller zu drehen scheint als der Rest der Welt, stellt die Aufrechterhaltung des persönlichen technischen Know Hows eine nicht zu unterschätzende Herausforderung dar.

Diese Herausforderung kann man entweder ignorieren, unkoordiniert und zufällig oder aber geplant angehen. Für 2010 habe ich mich entschieden, die Sache geplant anzugehen.

Dabei bin ich zu folgender Strategie gekommen, die ich an allen Arbeitstagen durchhalten möchte werde. Als Zeitlimit werde ich ein bis zwei Stunden am Tag ansetzen.

Montags: Eine Code Kata durchführen

Jeder der eine Kampfkunst ausübt weiß, dass eine (annähernde) Perfektion nur durch stetige Wiederholung erreicht werden kann. Jede Bewegung wird tausendfach wiederholt und bis ins kleinste Detail perfektioniert.

Nun ist die Softwareentwicklung sicherlich keine Kampfkunst. Zumindest habe ich während der Ausübung meines Berufs bisher weder geblutet, geschweige denn irgendwelche schlimmeren Verletzungen davon getragen. Auch geschwitzt habe ich nur, wenn im Sommer die Klimaanlage abgeschaltet war.

Trotz allem ist auch in der Softwareentwicklung ständiges Üben hilfreich, um den Geist zu schärfen und die eigenen Fertigkeiten zu verbessern (danke an Mario, der mich meine Einstellung zu diesem Thema überdenken lies).

Deshalb ist Montag ab sofort Code Kata Tag. Diese Woche habe ich mich an der Calculator Kata versucht. Eine sehr interessante Erfahrung.

Dienstags: Eine Tekpub Episode ansehen

Was Rob und James hier auf die Beine gestellt haben ist einfach nur großartig. Es gibt wohl keinen effektiveren Weg, sich in ein Thema einzuarbeiten, als sich die Screencasts der beiden anzusehen.

Wer die Seite noch nicht kennt, sollte sofort dort hin gehen und sich die beidenfreien Serien sowie die Previews der kostenpflichtigen Inhalte ansehen.

Für 2010 habe ich mir eine Jahresmitgliedschaft für die Tekpub Website gekauft. Seitdem ist Dienstags Tekpub Tag.

Mittwochs: Einen Blog Eintrag schreiben

Bloggen ist aus meiner Sicht aus mehreren Gründen äußerst sinnvoll:

  1. Man teilt sein Wissen mit der Community, wodurch es sich unweigerlich vermehrt
  2. Während man (oder zumindest ich) einen Blog Eintrag schreibt, reflektiert man selbst noch einmal über das Thema, recherchiert vielleicht auch noch ein wenig und lernt dadurch auch selbst dazu.
  3. Man trainiert die Fähigkeit komplizierte Sachverhalte aufzubereiten und einfach darzustellen.

Da ich in der Vergangenheit viel zu unregelmässig gebloggt habe, wird ab sofort jeden Mittwoch gebloggt!

Donnerstags: An einem privaten Übungsprojekten arbeiten

Code Katas und Trainingsvideos sind zwar sehr sinnvoll, einige Sachen lernt man allerdings nur, wenn man versucht, ein Ergebnis zu erzielen. Aus meiner Erfahrung geht dies besonders gut im privaten Umfeld. Generell bin ich bei diesen Projekten viel experimentierfreudiger, als bei einem Kundenprojekt.

Freitags: lesen

Bekanntermaßen bildet lesen. Deshalb sollte lesen auch in dieser Auflistung nicht fehlen. Freitags ist somit Lesetag. Der Lesestoff kann entweder ganz klassisch ein Buch, oder auch ein Fachmagazin sein. Alternativ kann ich mir natürlich auch vorstellen, Online Artikel zu lesen, oder einfach den Code erfolgreicher Open Source Projekte durchzuarbeiten, um daraus zu lernen.

Ist das alles überhaupt machbar?

Auf den ersten Blick sieht es nach einer Menge Arbeit aus. Natürlich stellt sich die Frage, ob neben Familie, Haus, Beruf, der eigenen User Group und nicht zuletzt auch Freizeitaktivitäten überhaupt genug Zeit bleibt, um all dies Woche für Woche zu erledigen.

Ich denke, dass es wahrscheinlich nicht jeden Tag funktionieren wird. Gerade wenn es im Projekt etwas heikler zugeht, werde ich solche Aktivitäten wohl zuerst gegen Überstunden eintauschen. Glücklicherweise bin ich jedoch in der Situation, dass Überstunden Ausnahmen darstellen. Daher bin ich guter Dinge, dass ich mein Vorhaben durchführen kann. Ob dem so ist, kann der aufmerksame Leser jeden Mittwoch Abend beziehungsweise Donnerstag Morgen selbst herausfinden ;-)

Und ihr?

Ich glaube nicht, dass ich der einzige bin, der seine Skills auf der Höhe der Zeit halten möchte. Daher interessiert mich natürlich brennend, wie ihr die Sache angeht. Lasst es mich einfach über die Kommentarfunktion meines Blogs wissen!

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

Neue Version des Blogstatistik-Control für BlogEngine.NET

06.01.2010 14:47:52 | Klaus Bock

Das in diesem Artikel vorgestellte Web User Control liegt jetzt in der Version 0.9.2.0 vor.
Der Hauptgrund für diese neue Version, ist der Wegfall der bisher benötigten Extension. Die Funktionalität der Erweiterung wird jetzt vom User Control selbst übernommen.

Wer das bisherige Control einsetzt, braucht nur die beiden Dateien BlogStatistic.ascx und BlogStatistic.ascx.cs auszutauschen. Die Erweiterung BlogStatisticCacheRemover.cs sollte aus dem Extensions Verzeichnis der Blogengine.NET Installation entfernt werden, um einen störungsfreien Betrieb zu gewährleisten.

BlogStatistic.zip

ASP.NET MVC 2 Vortrag am 14.01. bei der .NET User Group Frankfurt

05.01.2010 13:59:35 | Albert Weinert

Neues Jahr, neuer Termin.

Meinen ersten Vortrag den ich dieses Jahr halte ist bei der .NET User Group Frankfurt, am 14. Januar, ab 18:30 Uhr. Veranstaltungsort ist die Microsoft Niederlassung in Bad Homburg. Eine Anmeldung ist erforderlich.

Annmeldung und weitere Informationen

Thema ist Web-Entwicklung mit ASP.NET MVC inklusive der Version 2. Die Version 2 wird für .NET 3.5 SP1 (Add On) und .NET 4.0 (im Framework) verfügbar sein.

Kommt vorbei wenn Ihr in der Nähe seid.

VS2010 Beta 2 ALM Demo Image verfügbar

05.01.2010 12:34:46 | Christian Binder

Ab jetzt gibt’s ein Demo Image für Visual Studio 2010 Beta 2 zum Download. Zudem sind im Image Demo Daten vorhanden die in Kombination mit den 7 HandOnLabs einen einfachen Einstieg und Evaluierung ermöglichen. Bitte die System Anforderungen für die Images beachten.

Visual Studio 2010 Beta 2 (Hyper-V)

Visual Studio 2010 Beta 2 (Windows [7] Virtual PC)

Visual Studio 2010 Beta 2 (Virtual PC 2007 SP1)

HandsOnLabs

 

Brian hat einen guten Blog Eintrag, wie Ihr mit dem Download Manager noch effektiver die Images runterladen könnt.

Hinweis: Diese Images basieren auf nicht aktivierten Versionen, die am 9. April 2010 auslaufen.
Wer eine MSDN Subscription verfügt, kann nach Bedarf die Installierten  

Viel Spass
Chris

Phonetische Ähnlichkeiten mit Hilfe der Kölner Phonetik erkennen

04.01.2010 22:24:00 | Martin Hey

Bei der Suche nach ähnlichen Wörtern finden grundsätzlich zwei Verfahren Anwendung: Einerseits ist hier die Levenshtein-Distanz zu nennen. Diese bemisst den Unterschied zweier Zeichenketten anhand der Anzahl der notwendigen Operationen, um eine Zeichenkette in eine andere zu überführen. Zum anderen gibt es phonetische Verfahren, die die Ähnlichkeit zweier Wörter anhand des Klangbildes vergleichen.

Eines dieser phonetischen Verfahren ist der sogenannte Soundex-Algorithmus. Dabei wird ein vierstelliger Code gebildet, der den Klang in der englischen Sprache darstellt. So haben beispielsweise "Smith" und "Smythe" den gleichen Soundex-Wert von "S530". Nachteile dieses Algorithmus sind zum einen die Beschränkung auf den englischen Sprachraum. Somit können unter bestimmten Voraussetzungen im Deutschen unzufriedenstellende Ergebnisse entstehen. Ein weiterer Nachteil dieser Methode ist die Beschränkung auf einen 4-stelligen Code. Durch diese Beschränkung werden nur die Anfänge von Wörtern verglichen, was auch wieder zu interessanten Ergebnissen führen kann.

Diese Probleme versucht ein anderer Ansatz zu umgehen - die Kölner Phonetik. Auch hier wird anhand des Klangbildes ein Code gebildet, der aber im Gegensatz zum Soundex-Algorithmus auf die deutsche Sprache zugeschnitten ist und auch keine Längenbeschränkung hat. Den Buchstaben werden Ziffern zwischen 0 und 8 zugewiesen, wobei benachbarte Buchstaben als Kontext benutzt werden:

BuchstabeKontextCode
A, E, I, J, O, U, Y0
H-
B1
Pnicht vor H
D, Tnicht vor C, S, Z2
F, V, W3
Pvor H
G, K, Q4
Cim Anlaut vor A, H, K, L, O, Q, R, U, X
vor A, H, K, O, Q, U, X außer nach S, Z
Xnicht nach C, K, Q48
L5
M, N6
R7
S, Z8
Cnach S, Z
im Anlaut außer vor A, H, K, L, O, Q, R, U, X
nicht vor A, H, K, O, Q, U, X
D, Tvor C, S, Z
Xnach C, K, Q

Bei der Implementierung empfiehlt es sich, die Umlaute ä, ö und ü mit dem Code 0 zu versehen und das ß wie den Buchstaben s zu behandeln.

Die Umsetzung selbst ist dann recht trivial und eine Möglichkeit möchte ich im Folgenden kurz anbringen:
public static string ConvertToColognePhoneticCode(string value)
{
    // check parameter
    if (string.IsNullOrEmpty(value))
    {
        return string.Empty;
    }

    // convert to uppercase and copy to array
    char[] valueChars = value.ToUpperInvariant().ToCharArray();

    // create an array for all the characters without specialities
    char[] value0Chars = new[] { 'A', 'E', 'I', 'J', 'O', 'U', 'Y', 'Ä', 'Ö', 'Ü' };
    char[] value1Chars = new[] { 'B' };
    char[] value3Chars = new[] { 'F', 'V', 'W' };
    char[] value4Chars = new[] { 'G', 'K', 'Q' };
    char[] value5Chars = new[] { 'L' };
    char[] value6Chars = new[] { 'M', 'N' };
    char[] value7Chars = new[] { 'R' };
    char[] value8Chars = new[] { 'S', 'Z', 'ß' };

    // create a stringbuilder to combine the code
    StringBuilder cpCode = new StringBuilder();

    // iterate through the word's characters
    for (int i = 0; i < valueChars.Length; i++)
    {
        // get the current character and it's context
        char previousChar = i > 0 ? valueChars[i - 1] : ' ';
        char currentChar = valueChars[i];
        char nextChar = i < valueChars.Length - 1 ? valueChars[i + 1] : ' ';

        bool isFirstChar = (i == 0 || !Char.IsLetter(previousChar));

        // ignore non letters
        if (!Char.IsLetter(currentChar))
        {
            if (Char.IsWhiteSpace(currentChar))
            {
                cpCode.Append(' ');
            }
            
            continue;
        }

        // if current character is in group with value 0 add value 0
        if (value0Chars.Contains(currentChar))
        {
            cpCode.Append('0');
            continue;
        }
        // if current character is in group with value 1 add value 1
        if (value1Chars.Contains(currentChar))
        {
            cpCode.Append('1');
            continue;
        }
        // if current character is in group with value 3 add value 3
        if (value3Chars.Contains(currentChar))
        {
            cpCode.Append('3');
            continue;
        }
        // if current character is in group with value 4 add value 4
        if (value4Chars.Contains((currentChar)))
        {
            cpCode.Append('4');
            continue;
        }
        // if current character is in group with value 5 add value 5
        if (value5Chars.Contains(currentChar))
        {
            cpCode.Append('5');
            continue;
        }
        // if current character is in group with value 6 add value 6
        if (value6Chars.Contains(currentChar))
        {
            cpCode.Append('6');
            continue;
        }
        // if current character is in group with value 7 add value 7
        if (value7Chars.Contains(currentChar))
        {
            cpCode.Append('7');
            continue;
        }
        // if current character is in group with value 8 add value 8
        if (value8Chars.Contains(currentChar))
        {
            cpCode.Append('8');
            continue;
        }

        // if we are here it's a special combination of characters
        switch (currentChar)
        {
            case 'C':
                if (isFirstChar)
                {
                    if ((new[] { 'A', 'H', 'K', 'L', 'O', 'Q', 'R', 'U', 'X' }).Contains(nextChar))
                    {
                        cpCode.Append('4');
                    }
                    else
                    {
                        cpCode.Append('8');
                    }
                }
                else
                {
                    if ((new[] { 'S', 'Z', 'ß' }).Contains(previousChar))
                    {
                        cpCode.Append('8');
                    }
                    else if ((new[] { 'A', 'H', 'K', 'O', 'Q', 'U', 'X' }).Contains(nextChar))
                    {
                        cpCode.Append('4');
                    }
                    else
                    {
                        cpCode.Append('8');
                    }
                }
                break;
            case 'D':
            case 'T':
                if ((new[] { 'C', 'S', 'Z', 'ß' }).Contains(nextChar))
                {
                    cpCode.Append('8');
                }
                else
                {
                    cpCode.Append('2');
                }
                break;
            case 'P':
                if (nextChar.Equals('H'))
                {
                    cpCode.Append('3');
                }
                else
                {
                    cpCode.Append('1');
                }
                break;
            case 'X':
                if ((new[] { 'C', 'K', 'Q' }).Contains(previousChar))
                {
                    cpCode.Append('8');
                }
                else
                {
                    cpCode.Append('4');
                    cpCode.Append('8');
                }
                break;
        }
    }

    // cleanup the code (remove double characters and remove 0 values)
    StringBuilder cleanedCpCode = new StringBuilder(cpCode.Length);
    for (int i = 0; i < cpCode.Length; i++)
    {
        char lastAddedChar = cleanedCpCode.Length > 0 ? cleanedCpCode[cleanedCpCode.Length - 1] : ' ';
        if (lastAddedChar != cpCode[i])
        {
            if (cpCode[i] == '0' && lastAddedChar == ' ' || cpCode[i] != '0')
            {
                    cleanedCpCode.Append(cpCode[i]);
            }
        }
    }
    // return trhe result
    return cleanedCpCode.ToString();
}

Im ersten Schritt wird das Wort in Großbuchstaben umgewandelt und buchstabenweise in einen Array kopiert. Für Buchstaben, bei denen es keine Besonderheiten zu beachten gibt, werden Arrays definiert, die deren Wertigkeit angeben. Somit kann zu einem späteren Zeitpunkt in einem buchstabenweisen Vergleich dann mit Hilfe der Extension-Method Contains mit nur einem Statement geprüft werden, ob der Buchstabe die jeweilige Wertigkeit hat. Ist keiner dieser Vergleiche positiv, so handelt es sich um einen Buchstaben, der einer besonderen Beachtung verdient und zu dessen Bewertung der Kontext mit hinzugezogen werden muss. Sind alle Wertigkeiten ermittelt, werden Dopplungen und 0-Werte entfernt und das Ergebnis zurückgegeben.

Nachdem meine Funktion fast fertig war, bin ich auf einen Blogeintrag von Klaus Bock zum gleichen Thema gestolpert und auch er hat einen ähnlichen Ansatz gewählt, um den Algorithmus umzusetzen.

Windows 7 GodMode – Der Gottmodus der Systemsteuerung…

04.01.2010 13:54:26 | Jan Schenk



tweetmeme_url = 'http://blogs.msdn.com/jansche/archive/2010/01/04/windows-7-godmode-der-gottmodus-der-systemsteuerung.aspx'; tweetmeme_source = 'jansche';

edit: es ist noch eine weiter Zusatzinformation dazu gekommen, siehe unten in blau.

Naja, Gottmodus finde ich ein bisschen übertrieben, aber es könnte durchaus praktische Anwendung finden, dieser besondere Ordner:

Was ist der Gottmodus? Es handelt sich um ein “geheimes” Windows 7 Feature, das dir ein erweitertes Control Panel, dh eine erweiterte Systemsteuerung, in Form eines Ordners zur Verfügung stellt.

Wie aktiviere ich den Gottmodus?

Ziemlich einfach. An einer beliebgen Stelle im Dateisystem erstellst du einen neuen Ordner über die “Neue Ordner”-Funktion des Datei-Explorers. Dieser bekommt den kryptischen Namen GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Nach Bestätigen des neuen Namens (einfach Enter drücken) heisst der Ordner nur noch GodMode und du kannst ohne Umwege auf die erweiterten Funktionen der Systemsteuerung in einer normalen Datei-Explorer Auflistung zugreifen.

 

update 20100107:
Ein Kollege hat mich gerade darauf hingewiesen, dass es eine bessere Variante als den Spezialordner gibt, und zwar eine Verknüpfung mit dem Ziel „explorer.exe shell:::{ED7BA470-8E54-465E-825C-99712043E01C}“ anzulegen. Diese VErknüpfung kann dann auch im Startmenü eingebunden werden, was mit dem Spezialordner nicht möglich ist. Vielen Dank an dieser Stelle an Michael Korp.

Originaltext:

What is God Mode? This is a secret Windows 7 Feature (If you can call so!!), which provides you an extended control panel to control your machine.

Here are the Steps to invoke the God Mode:

Create a new folder (right-click and click on “New Folder”). Right-click on the folder and click on rename, copy and paste this: GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

This folder will now be a shortcut to the Windows 7 God Mode. The GodMode allows you to quickly access many Windows 7 functions via a GUI.

image

Danke an dieser Stelle an den Windowsblog für den Hinweis auf diese Funktion.

Embedded Development - Imagine Cup

04.01.2010 09:00:00 | Oliver Scheer

Erstmalig in der Geschichte des Imagine Cups wird es ein lokales Finale in der Kategorie Embedded Development geben. Schüler und Studierende sind eingeladen, ihrer Kreativität und ihren Ideen freien Lauf zu lassen: wie kann ein Embedded Device dazu beitragen, die Probleme dieser Welt lösen? Bildung, Armut, Gesundheit und Umwelt sind nur 4 der insgesamt 8 UN Millenniumsziele, an denen sich die Projekte orientieren sollen. Deadline für die Abgabe der Projektmappe ist der 15.02.2010. Das nationale Finale findet dann im April gemeinsam mit der Vorausscheidung in der Kategorie Software Design statt. Das nationale Gewinnerteam fährt dann im Juli zum internationalen Finale nach Polen, wo es gegen Teams aus der ganzen Welt antritt! Weitere Informationen gibt es unter www.imaginecup.de.

Ein frohes neues Jahr!

01.01.2010 22:59:56 | Peter Nowak

Ich wünsche allen Lesern ein frohes neues Jahr und hoffe, daß alle die Feiertage gut überstanden haben. Auch ich habe diese Tage sehr genossen und im Kreise der Familie und Freunde mich gut erhohlt.

Den ersten Blogpost nehme ich daher auch zum Anlass meine Gedanken zum letztem Jahr und zum eben angefangenen zu äussern.

Was war

2009 war ein durchwachsenes Jahr.
Als ich zum ersten Mal einen Blick auf Windows Mobile 6.5 werfen durfte, war mein erster Gedanke "Das kann doch nicht deren Ernst sein...". Ich tat mich anfangs sehr schwer damit, das neue Windows Mobile zu mögen. Doch der Eindruck änderte sich.
Viele gehen heute immer noch davon aus, daß 6.5 der "iPhone Killer" ist. Das war jedoch nie der Gedanke bei dieser Version, weswegen ich mir für dieses Jahr wünsche, hierüber nicht mehr über dieses Thema diskutieren zu müssen, wie ich es beispielsweise letztes Jahr auf der TechEd in Berlin zu Genüge tat.
Es ging bei 6.5 immer darum, eine verbesserte Bedienung zu bieten; nach Möglichkeit ohne Stift und am Besten mit dem Daumen.
Der neue "Heute-Bildschirm" alias CHome hat dies als Erstes gut ermöglicht. Zwar kann man offiziell keine Plugins hierfür selbst erstellen, doch findet man im Internet einige Beschreibungen, wie es doch geht. Die neuen und größeren Menüs sind auch sehr sinnvoll.
Die Gesture API, mittlerweile auch durch diverse gute Wrapper im managed Code möglich, ermöglicht es mittels Programmierung auch, diese Schnittstelle in seiner eigenen Anwendung zu verwenden und sie somit aufzupepppen.
Da das System jedoch erst spät im Jahr zur Verfügung stand, wo Simon Hackfort, Patrick Getzmann und ich auch in unserer zugehörigen Webcastserie die Neuerungen vorgestellt haben, nahmen wir das erste Halbjahr eher dazu Best Practices in einer anderen Webcastserie darauf einzugehen.
Diejenigen, die nicht genug von der Enttwicklung für Windows Mobile und Windows Embedded CE bekommen konnten, trafen sich Anfang Dezember auf der MobileGuru konferenz. Hier wurden neben Einsteigerthemen auch Themen behandelt, welche selbst für mich neu waren und ich mir diese Session somit gerne angesehen habe.
Kurz zusammengefasst: 2009 war für mich neben Windows Mobile 6.5 das Jahr, wo es darum galt sich mit aktuellen Technologien zu beschäftigen, als auch zu schauen, was die anderen Hersteller aktuell machen.

Was wird

Anderen Systeme haben aufgeholt: Android scheint langsam erwachsen zu werden - das iPhone OS kann ztem Jahr auch endlich Copy & Paste. ;-)
Ich denke, dass bbei Android dieses Jahr noch viel gefeilt werden wird. Beim iPhone mag ich jedoch keine Prognose machen. Zwar hört man Gerüchte, dass dieses Jahr ein neues 4G Gerät kommen soll was wesentliche Hardwareverbesserungen haben soll doch sehe ich persönlich aktuell nicht, wohin es mit dem OS gehen soll. Es hat zwar Detailverbesserungen bis zur Version 3.0 erfahren und wurde aufpoliert. Doch auch das System wird alt - das Basisbetriebssystem hat sich gegenüber der ersten Version nur marginal verändert. Ich höre immer öfter, dass viele Personen im privatem Umfeld auf andere Geräte umsteigen; Firmen begreifen auch immer öfter, dass das iPhone im Consumerbereich angesiedelt ist und für den Businessbereich nur in einem bestimmten Umfang geeignet ist.
Viel interessanter finde ich da den Umstand, dass man seitens Microsoft nichts konkres zu einem Nachfolger hört. Es wird zwar mit Hochdruck daran gearbeitet und es soll riesig werden - mehr Informationen gibt es jedoch nicht.
Bleibt abzuwarten, wann und was man dazu hören wird.
Wer letztes Jahr nicht an der MobileGuru konferenz teilnehmen konnte, wird wahrscheinlich im 2. Halbjahr diesen Jahres eine Chance haben.

2010 hat jedoch bereits super angefangen. Ich freue mich sehr, dass es neben Torsten Weber und mir seit heute einen neuen Device Application Development MVP insbesondere für native Code in der DACH-Region gibt: Patrick Getzmann. Herzlichen Glückwunsch Patrick. Es freut mich sehr.

So viel zu meinem persönlichen Rückblick und einer kleinen Vorschau auf dieses Jahr.

Ich wünsche daher nochmal allen Lesern ein frohes neues Jahr und hoffe, dass wir alle dieses Jahr wieder interessantes erleben werden.
 



This posting is provided "AS IS" with no warranties, and confers no rights.

Microsoft MVP Award 2010 – Dankeschön!

01.01.2010 20:11:00 | Michael Schwarz

mvp Heute beim Lesen meiner angesammelten E-Mails während der Feiertage:

Dear Michael Schwarz,

Congratulations! We are pleased to present you with the 2010 Microsoft® MVP Award! This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others. We appreciate your outstanding contributions in .NET Micro Framework technical communities during the past year.

The Microsoft MVP Award provides us the unique opportunity to celebrate and honor your significant contributions and say "Thank you for your technical leadership."

Dies ist nun bereits das fünfte Mal, dass Microsoft mir diese Auszeichnung überreicht. Angefangen hatte es 2006, also ich kurz vor der PDC 2005 Ajax.NET Professional für ASP.NET vorgestellt hatte. Inzwischen bin ich neben ASP.NET nun auch im .NET Micro Framework zugegen, und freue mich auf eine neues Jahr mit coolen neuen Produkten aus dem Hause Microsoft.

NEW Version 3.1 TeamSpeak Sidebar Gadget für Windows Vista und Windows 7

01.01.2010 20:00:00 | Andreas Mehl

I have released a new version from my teamspeak sidebar gadget.

What i added was:

  • Added Special Docked View Modus
  • Added Feedback
  • Direct Teamspeak Client Connection Button

 

Screenshots can be found here: Screenshots

Have fun Laughing

Download Sidebar Gadget Teamspeak 3

this oder kein this

01.01.2010 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. Januar 2010, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

this oder kein this

So wohl Golo wie auch ich haben uns unabhängig voneinander im Vorfeld unsere Gedanken gemacht, wie wir diesem Thema gegenüberstehen. Golos Kommentar findet sich zeitgleich in seinem Blog, folgend nun mein Kommentar zu diesem Thema.

Generell ist es sinnvoll, wenn ohne weiteres Zutun gleich erfasst werden kann, ob es sich um eine lokale, statische oder instanzbehaftete Variable handelt.
Aus diesem Grund gibt es Konventionen, wie etwas auszusehen hat, sei dies mit Pascal- (fooBar) / Camel-Casing (FooBar) oder durch Prä- / Postfixe (m_foo, foo_m).

Im Allgemeinen hat es sich bei mir so entwickelt, dass ich mich immer mehr zu der empfohlenen Microsoft Konvention hin bewegt habe, was die Einarbeitung in andere Projeke um einiges leichter macht,
da diese Konvention häufig – wenn auch teilweise abgeändert – verwendet wird.

Im aktuellen Streitgespräch geht es darum, ob this verwendet wird / nicht verwendet wird und wo es verwendet wird.

this wird zwanghaft benötigt, um auf die Referenz auf sich selber, in die Hand zu bekommen.
Beispielsweise wenn in einer User-Klasse eine .Save-Methode angeboten wird, die ihrerseits aber einen Service benutzt um sich speichern zu lassen:


public class User
{
    public void Save()
    {
        ServiceLocator
                .Resolve<IUserService>()
                .Save(this);
    }
}

Erweiterungsmethoden benutzen this als Kennzeichnung:


static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
    {
        action(item);
    }
}

Bei einer Indexerdeklaration wird this auch benötigt:

public User this[sring index]
{
   get { return this._list[index]; }
   set { this._list[index] = value; }
}

Ein andere Stelle wo this benutzt werden muss, ist beim angeben von zusätzlichen Konstruktoren von sich selbst, die auch noch aufgerufen werden sollen:


public class UserService
{
    private readonly IRepository<User> _userRepository; 

    public UserService() : this(new XmlUserRepository())
    {
       
    }
    public UserService(IRepository<User> userRepository)
    {
         _userRepository = userRepository;
    }
}

Im ersten Konstruktor wird angegeben, das auch der zweite Konstruktor mit einem Parameter aufgerufen werden soll.

Wenn die Instanzvariable “_userRepository” keinen Unterstrich hätte – also “userRepository” – müsste this verwendet werden, damit der Kompiler zwischen Instanzvariable und Argument unterscheiden kann, also:


private readonly IRepository<User> userRepository;
public UserService(IRepository<User> userRepository)
{
    this.userRepository = userRepository;
}

Zu Anfang habe ich das Präfix “_” vor einer Instanzvariable benutzt, so kann man – auch im Intellisense – ohne Probleme auswählen und unterscheiden, da alle schön gruppiert sind.

In Visual Studio 2005 gab es allerdings kein Intellisense bei der Eingabe von “_test” im Code-Editor.
Ich habe dort “this._test” genutzt, denn es ist ja ein Instanzmember und mit der Eingabe von “this.” gab es dann Intellisense.

Ab Visual Studio 2008 gibt es bereits bei der Eingabe von “_” Intellisense, somit wäre “this” überflüssig. Allerdings habe ich mir angewöhnt, this überall anzugeben, wo sich etwas auf die Instanz bezieht.

Also für Methodenaufrufe auf der Instanz (in der Regel protected oder private Methoden), Eigenschaften sowie Instanzfelder.
Es ist so möglich auf den ersten Blick zu unterscheiden und erfassen, was eine lokale Variable ist, was ein statisches Feld / Konstante. Oder doch eine Instanzvariable?.

Was meint ihr dazu?

Gadgets Problem / This is not a valid gadget package

01.01.2010 08:40:00 | Andreas Mehl

I programmed a gadget and had this problem. While you'll try to download it you'll get following in IE "This is not a valid gadget package".

Why it's ZIP???

First time i don't know what the Problem is. I just thought my gadget has a problem.

While you'll try to download it you see .ZIP extention just because .Gadget is really .ZIP, so "smart" IE knows to "translate" extention in order to prevent fraud. Very nice, but I want do download and install gadget.

 

After some deep searching I found it.

It was an IIS 7 Configuration Problem:

The right MIME type for Vista SideBar Gadget is application/x-windows-gadget. Register .gadget extention with application/x-windows-gadget MIME type and you'll able to provide your visitors like installation option for gadgets.

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