.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv August 2008

Mit LINQ to SQL die Anzahl der Datenbankzugriffe verringern

31.08.2008 18:22:00 | Ozgur Aytekin

In diesem Beitrag werden zwei LINQ-Abfragen (LINQ-Queries) vergliechen, das gleiche Resultat zurück liefern aber unterschiedlich auf die Daten zugreifen. "Viele Wege führen nach Rom."

Das folgende Beispiel basiert auf SQL Server 2005 und AdventureWorks-Datenbank (Database). Für die Daten werden die Datenbanktabellen Contact und Employee eingesetzt.
image 
Die Datenbanktabellen Employee und Contact sind über die Felder Employee.ContactID und Contact.ContactID miteinander verknüpft. Mithilfe dieser Verknüpfung können wir von einem Employee-Record aus den Contact-Record ermitteln und diese ausgeben.

Das LINQ to SQL-Designer Tool erkennt die Verknüpfung automatisch, wenn wir die beiden Tabelle mittels Drag & Drop auf die Designer-Oberfläche ziehen. Die Verknüpfung zwischen den beiden Tabellen wird von dem LINQ to SQL-Designer Tool generierten Code (siehe AdventureWorks.designer.cs-File) wie folgt dargestellt:

[Association(Name="Contact_Employee", Storage="_Contact", ThisKey="ContactID", OtherKey="ContactID", IsForeignKey=true)]
public Contact Contact
{
get
{
return this._Contact.Entity;
}
set
{
...
}
}
Dieser Verknüpfung ermöglicht uns auf die Contact-Daten zuzugreifen, ohne das wir innerhalb der LINQ-Abfrage (LINQ-Query) auf die Contact-Tabelle refferenzieren müssen. Der Zugriff auf die Contact-Daten erfolgt über das Objekt emp (item.emp.Contact.FirstName), den wir in unseren select definiert haben (select new {emp}).

using System;
using System.Linq;

namespace LinqToSqlRecursiveSample0010
{
internal class Program
{
private static void Main(string[] args)
{
var db = new AdventureWorksDataContext();
var qry = from emp in db.Employees
select new {emp};

Console.WriteLine(String.Format("{0, 10}", "EmployeeID") + "|" +
String.Format("{0, 10}", "ContactID") + "|" +
String.Format("{0, -30}", "Title") + "|" +
String.Format("{0, -15}", "FirstName") + "|" +
String.Format("{0, -10}", "MiddleName") + "|" +
String.Format("{0, -15}", "LastName"));

foreach (var item in qry)
{
Console.WriteLine(String.Format("{0, 10}", item.emp.EmployeeID) + "|" +
String.Format("{0, 10}", item.emp.ContactID) + "|" +
String.Format("{0, -30}", item.emp.Title) + "|" +
String.Format("{0, -15}", item.emp.Contact.FirstName) + "|" +
String.Format("{0, -10}", item.emp.Contact.MiddleName) + "|" +
String.Format("{0, -15}", item.emp.Contact.LastName));
}
}
}
}
Als Resultat erhalten wir die folgende Liste. image 
Wenn wir aber im Hintergrund die Datenbankzugriffe auswerten, stellen wir fest, dass die Applikation für jeden Contact-Record auf die Datenbank zugreift und die Daten aus der Datenbank ermittelt. Die Analyse mit dem SQL Server Profiler-Tool zeigt die Zugriffe wie folgt:image Alle Employee-Daten werden mit einem SELECT-Statement aus der Datenbank (Database) gelesen.

SELECT [t0].[EmployeeID],
[t0].[NationalIDNumber],
[t0].[ContactID],
[t0].[LoginID],
[t0].[ManagerID],
[t0].[Title],
[t0].[BirthDate],
[t0].[MaritalStatus],
[t0].[Gender],
[t0].[HireDate],
[t0].[SalariedFlag],
[t0].[VacationHours],
[t0].[SickLeaveHours],
[t0].[CurrentFlag],
[t0].[rowguid],
[t0].[ModifiedDate]
FROM [HumanResources].[Employee] AS [t0]

Die Contact-Daten werden dann pro Employee-Record aus der Datenbank gelesen (siehe unten - @p0=1209 ist die ContactID).

exec sp_executesql N'SELECT [t0].[ContactID],
[t0].[NameStyle],
[t0].[Title],
[t0].[FirstName],
[t0].[MiddleName],
[t0].[LastName],
[t0].[Suffix],
[t0].[EmailAddress],
[t0].[EmailPromotion],
[t0].[Phone],
[t0].[PasswordHash],
[t0].[PasswordSalt],
[t0].[AdditionalContactInfo],
[t0].[rowguid],
[t0].[ModifiedDate]
FROM [Person].[Contact] AS [t0]
WHERE [t0].[ContactID] = @p0'
,N'@p0 int',@p0=1209

Wenn wir unseren LINQ-Query mit einem join wie folgt erweitern (join con in db.Contacts on emp.ContactID equals con.ContactID) und nicht nur die Employee-Daten sondern auch die Contact-Daten in unser select einschliessen (select new {emp, con}), werden wir feststellen, dass die Contact-Daten nicht mehr einzeln aus der Datenbank gelesen, sondern die Contact-Daten mit Employee-Daten zusammen mit einem SELECT-Statement aus der Datenbank ermittelt werden.

using System;
using System.Linq;

namespace LinqToSqlRecursiveSample0010
{
internal class Program
{
private static void Main(string[] args)
{
var db = new AdventureWorksDataContext();
var qry = from emp in db.Employees
join con in db.Contacts on emp.ContactID equals con.ContactID
select new {emp, con};

Console.WriteLine(String.Format("{0, 10}", "EmployeeID") + "|" +
String.Format("{0, 10}", "ContactID") + "|" +
String.Format("{0, -30}", "Title") + "|" +
String.Format("{0, -15}", "FirstName") + "|" +
String.Format("{0, -10}", "MiddleName") + "|" +
String.Format("{0, -15}", "LastName"));

foreach (var item in qry)
{
Console.WriteLine(String.Format("{0, 10}", item.emp.EmployeeID) + "|" +
String.Format("{0, 10}", item.emp.ContactID) + "|" +
String.Format("{0, -30}", item.emp.Title) + "|" +
String.Format("{0, -15}", item.con.FirstName) + "|" +
String.Format("{0, -10}", item.con.MiddleName) + "|" +
String.Format("{0, -15}", item.con.LastName));
}
}
}
}

Als Resultat erhalten wir weiterhin die gleichen Daten:

image 


Und im SQL Server Profiler-Tool sehen wir, dass die Contact-Daten nicht mehr einzeln ermittelt werden:image

Vom LINQ to SQL generierte SQL-Statement sieht wie folgt aus:

SELECT [t0].[EmployeeID],
[t0].[NationalIDNumber],
[t0].[ContactID],
[t0].[LoginID],
[t0].[ManagerID],
[t0].[Title],
[t0].[BirthDate],
[t0].[MaritalStatus],
[t0].[Gender],
[t0].[HireDate],
[t0].[SalariedFlag],
[t0].[VacationHours],
[t0].[SickLeaveHours],
[t0].[CurrentFlag],
[t0].[rowguid],
[t0].[ModifiedDate],
[t1].[ContactID] AS [ContactID2],
[t1].[NameStyle],
[t1].[Title] AS [Title2],
[t1].[FirstName],
[t1].[MiddleName],
[t1].[LastName],
[t1].[Suffix],
[t1].[EmailAddress],
[t1].[EmailPromotion],
[t1].[Phone],
[t1].[PasswordHash],
[t1].[PasswordSalt],
[t1].[AdditionalContactInfo],
[t1].[rowguid] AS [rowguid2],
[t1].[ModifiedDate] AS [ModifiedDate2]
FROM [HumanResources].[Employee] AS [t0]
INNER JOIN [Person].[Contact] AS [t1] ON [t0].[ContactID] = [t1].[ContactID]

Viel Spass...

Was ist Domain Driven Design?

31.08.2008 17:51:00 | Sebastian Jancke

In meinem Artikel “DDD – Eine Einführung” hatte ich versucht einen Überblick über Domain Driven Design und seine Auswirkungen zu geben. Leider fehlte dabei eine genaue Definition. Dies ist allerdings nicht einfach und ich bezweifle, ob es derzeit eine komplette und exakte Definition von DDD gibt. Die Beschreibungen auf Wikipedia scheinen mir unvollständig, da sie zu sehr auf den Aspekt des Objekt-Design abzielen. Auch im Buch selbst wird eher schwammig in das Thema eingeführt: Man bekommt schnell ein Gefühl für DDD und, mit Blick auf das Inhaltsverzeichnis, auch für den Umfang. Trotzdem fehlt eine präzise, umfassende Definition. Daher ist dieser Artikel sicherlich zunächst nur ein Versuch – ich maße mir keine Vollständigkeit an.

Der Grund dafür liegt, meiner Meinung nach, in der Tatsache begründet, dass DDD eigentlich vor allem eines ist: ein philosophischer Ansatz, wie Problemdomänen in Software implementiert werden sollten:

  • Das Modell, und damit die Domäne, sind im Herzen unserer Software

Und "drumherum" bildet DDD damit eine Entwurfsmuster-Sprache, die uns ermöglicht darüber zu kommunizieren. Dies würde ich als eine Definition von Domain Driven Design und dessen Kern bezeichnen wollen (siehe auch David Laribee's Artikel dazu).

Worin liegt dies begründet und welche Auswirkungen hat dieser Ansatz für uns? Gehen wir also zurück zum Anfang. Zunächst dreht sich bei der Erstellung von Software alles um Modelle und Abstraktionen. Haben wir eine gegebene Domäne, so bauen wir zu einer Teilmenge daraus ein Modell, eine Abstraktion der Domäne. Die gesamte Domäne (wie eigentlich alles auf der Welt) ist natürlich zu groß, um sie vollständig zu modellieren. Wenn wir Software entwickeln, bauen wir also primär ein Modell einer Domäne.

Derzeit besteht unsere bester Weg zu Modularisierung und Abstraktion in der Nutzung von Objekt Orientierung. Damit liegt die Idee nahe, unser Modelle durch “nakte” Objekte zu implementieren - wie wir es in der Uni gelernt haben bevor wir über Datenbanken, Transaktionen und Infrastruktur nachdachten. Idealer weise gibt es zwischen Quelltext und Modell keine Unterschiede, also keine Übersetzungen. Im Artikel “DDD – Allgegenwärtige / Universelle Sprache” bin ich bereits darauf eingegangen, warum Eric Evans Übersetzungen als kritisch ansieht. Unser Modell ist also von der Domäne gesteuert.

Wenn wir nun ein Modell der Domäne erstellen, ergibt sich direkt die Frage: Wer kennt die Domäne? Die Architekten? Oder Software Analysten? Oder Entwickler? Wohl kaum. Erstere denken wohl eher an Entwicklung im großen Rahmen, letztere im sehr kleinen und Software-Analysten können wohl analysieren, aber kennen wohl nicht jede Problem-Domäne. Diejenigen, die eine Domäne am besten kennen sind aber direkt vor unseren Nasen: Der Kunde und seine Experten. Diese Idee sehen wir auch in anderen Bereichen, zB in den Agilen Prozessen. Im eXtreme Programming heißt das ganze “Customer On Site”. Da das Modell also keine verborgene Magie innerhalb der Software ist, sondern eine – für alle sichtbare – Abstraktion, ergibt sich die Grundlage des Domain Driven Design:

  • Das Modell, und damit die Domäne, sind im Herzen unserer Software

Dies hat weitreichende Konsequenzen auf alle Bereiche, wie Anforderungen an die Architektur, Auswirkungen auf Objekt-Design, das Team, seine Prozesse, etc. Weil wir zum Beispiel dieses Modell kommunizieren müssen, sowohl intern als auch extern, liegt die Idee nahe, eine gemeinsame Sprache in allen Beriechen zu nutzen: angefangen bei der Kommunikation, über Dokumentation, Diagrammen bis hin zum Quelltext. Ideal ist es also, wenn sich die Sprache und damit das Modell im Quelltext manifestiert. Dann könnte man nur durch das Lesen des Quelltextes im Domänen-Modul eine Menge über die Domäne selbst lernen.

Zusammenfassend kann man also sagen, dass Domain Driven Design ein Ansatz zur Software-Entwicklung ist, der das Modell einer Problemdomäne ins Zentrum stellt. Kritik und Erweiterungen sind willkommen!


Nachtrag: Definitions-Absatz erweitert um die Idee der Pattern-Language.


Technorati Tags: ,

Komplexität in Geschäftslogik

31.08.2008 17:41:00 | Sebastian Jancke

Ein Vergleich der Patterns Table Module (DataSets,..), Transaction Scripts und Domain Model

Abseits meiner Beiträge zum Thema Domain Driven Design möchte ich hier die drei Ansätze zur Handhabung von Komplexität in Geschäftslogik aus Martin Fowler’s Buch “Patterns of Enterprise Application Architecture” vergleichen. Alle drei stellen Wege dar, eine Domäne zu modellieren, wenn auch die beiden ersten Ansätze stark zu prozeduraler Programmierung tendieren:

Fowler hat zum Vergleich eine ähnliche Grafik wie die folgende verwendet.

Complexity-Comparison In der Grafik ist Komplexität gegenüber Aufwand gestellt. Die rote Linie steht für das Table Module Pattern, die blaue Linie steht für Transaction Scripts und die grüne Linie steht für das Domain Model Pattern. Die Idee der Grafik ist es zu zeigen, wie die drei Ansätze mit erhöhter Komplexität skalieren. Dabei kommt es nicht so sehr auf den exakten Verlauf an. Wichtiger ist es zu sehen, dass die Grafik recht gut dem gefühlten “Aufwand” entspricht, bei der Arbeit mit den Ansätzen: der Aufwand bei Transactions Scripts und Table Module (in .NET also DataSets) steigt rasant und macht zunehmende Komplexität kaum noch handhabbar. Aber auch das Domain Model Pattern lässt sich nicht unendlich lange nutzen, ohne ans eine Grenzen zu stoßen. Trotzdem liegt diese Grenze bedeutend höher, was das Pattern so attraktiv für komplexe Domänen macht. Zu große Komplexität kann durch Zerteilen der Domäne in verschiedene Modelle begegnet werden. Diese müssen dann aber genau abgegrenzt und integriert werden müssen – andernfalls wird man weniger Nutzen davon haben. Die passenden Stichwörter wären hier Bounded Context, Context Map und Core Domain [/End buzzword dropping].

Image is subject to create commons license. Created By: http://www.flickr.com/photos/esfema/ Die Große Frage am Vergleich der 3 Ansätze ist natürlich: Wo liegen die Grenzen auf der Achse der Komplexität? Dazu müssten wir aber zunächst einmal Komplexität messen – dies können wir aber kaum. Pragmatisch gesehen muss hier die Erfahrung des Teams herhalten. Praktisch gesehen lohnt sich ein Domain Model sicherlich nicht für eine reine CRUD-Anwendung mit nur sehr simpler Validierung. Trotzdem greift wohl auch diese Einordnung zu kurz. Niemand kann schließlich genau vorhersagen, wie sich das Geschäft des Kunden weiterentwickelt oder ob aus einer kleinen Anwendung nicht plötzlich eine große wird – dafür scheinen zu viele “Prototypen” bisher immer noch am Leben. Es besteht somit die Gefahr eine Entscheidung zu früh zu treffen, obwohl man die Notwendigkeit für das Domain Model Pattern erst später begründen können wird. Es besteht aber auch die Gefahr, sich mit der Wahl von Transaction Scripts oder Table Modul die Möglichkeit zu verbauen, jemals zu einem reichhaltigen Domänenmodell zu gelangen. Denn laut Fowler ist genau dieser Übergang extrem aufwending und teuer – obwohl die Alternative (kein Redesign) keine wirkliche Alternative ist. Interessant wäre wohl zu experimentieren, ob ein Redesign vom Domain Model Pattern hin zu Transaction Scripts gut funktioniert. Mein Tipp wäre, dass sich dies wohl leichter realisieren lässt, als der Weg anders herum; schließlich sehen wir heute viele Prozedurale Implementierungen mit einem anemischen Domänenmodell.

Klar ist, dass das Table Module Pattern gerade wegen seiner breiten Werkzeug-Unterstützung im .NET Bereich eine sehr geringe Hürde für den Einstieg hat. Table Module und Transactions Scripts zerlegen die Domäne in ein prozedurales Modell und bestechen durch ihre Einfachheit - für einfache Kontexte! Leider ist dieser Umstand bisher wenig bis gar nicht kommuniziert worden. Offensichtlich ist aber die Idee des simplen Drag&Drop / RAD / … für die meisten gescheitert. Beim Table Module Pattern gibt es in der Regel ein Objekt, dass die Logik und Kommunikation für eine Datenbank-Tabelle übernimmt. Transaction Scripts manifestieren sich in der Regel in einem “dicken” Application / Service Layer (Fowler). Für jede Transaktion haben wir dann eine Service-Operation. Hiermit sollte dann auch klar sein, warum beide Ansätze Probleme mit duplizierter Logik, Copy&Paste-Smells und vor allem Seperation of Concerns haben. Beim Einsatz eines Domain Models ist die Service Schicht hingegen sehr dünn. Sie koordiniert nur verschiedene Aktionen auf dem Domänenmodell. Vor allem aber eignet sich die Service Schicht zur Beschreibung der Session- und Transaction-Scopes zur Datenbank-Verbindung (mehr dazu später in der DDD Serie).

Image is subject to create commons license. Created By: http://www.flickr.com/photos/ppdigital/Transaction Scripts und Table Module haben sicherlich geringere Anforderungen an die Erfahrung und das Abstraktionsvermögen eines Entwicklers. Domänenmodelle bieten dafür weitaus mehr Modularisierung und können so auch zu mehr Wiederverwendung führen. Je komplexer ein Modell wird, umso mehr scheint der Vorteil gegeben über Transaction Scripts und Table Module zu wiegen. Sicheres Einsatzgebiet sind somit auf jeden Fall jene Domänen, bei denen von Anfang an klar ist, dass die Komplexität jenseits von einfacherer Validierung (zB isolierte Validierung pro Feld) und CRUD liegt.

Am Schluss möchte ich noch zu Bedenken geben, dass vollständige Modularisierung mit OOP nicht möglich ist (siehe “Tyranny of the dominant decomposition”). Egal nach welchen Kriterien die Dekomposition der Anwendung von statten geht – es wird immer orthogonale, übergreifende Belange geben. Nach derzeitigem Stand der Forschung erreichen wir damit noch bessere Modularisierung nur durch den Einsatz von Aspekt-Orientierung. Meines Wissens ist aber weiterhin unklar, ob wir damit den “heiligen Gral” der Modularisierung erreichen. Vielleicht ist es am Ende auch egal und nur eine Frage des nötigen Pragmatismus.

IE8: Report a Webpage Problem [Add-On]

30.08.2008 19:34:47 | Kay Giza

Eine Webseite verursacht Probleme mit der aktuellen Internet Explorer 8 Beta 2?
Melden Sie es mit diesem Add-on: Melden Sie ein Webseitenproblem

Dieses Add-Inn für den Internet Explorer installiert im Internet Explorer einen Toolbar-Button 'Report a Webpage Problem...' im Menü 'Extras" oder in der Toolbar.
Wenn Sie diesen Button klicken, wir ein Report inkl. Screenshot erstellt, von der Seite die Sie gerade sich angeschaut haben. Eine neue Registerkarte wird somit entsprechend geöffnet und alle für den Report wichtigen Informationen werden dargestellt. Sie können hier noch zusätzliche Informationen hinzufügen und auch entscheiden, ob der Screenshot der gemacht wurde, mitgesendet werden sollte.

In dem Report enthalten sind zudem:

  • Die URL der Webseite
  • Der Webseiten-'Document mode'

Für weitere Informationen schauen Sie bitte hier: Privacy Statement

Download: Report a Webpage Problem Internet Explorer 8.0 Beta Add-On

Screenshots:

Menue des IE8 "Report a Webpage Problem..."

Report-Zusammenfassung

Report wurde gesendet

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Web Slices-Icon und Guidelines

30.08.2008 18:44:11 | Kay Giza

Wer auf seiner Webseite Web Slices (technische Info) anbietet, der möchte ggf. pro aktiv seine User auf dieses Web-Gadget per Icon aufmerksam machen: IE8 Detection Webslice
So ist es standardmäßig so, dass man erst mit einem Maus-Over eine Web Slices-Symbol angezeigt bekommt, so wie hier auf www.my-msdn.de beispielsweise:
MyMSDN Web Slices
und der Internet Explorer dieses Web Slices in einer Browser-Leiste erkennt und sichtbar macht:
Web Slices IE8 Detection

Möchte man dieses Icon gerne dauerhaft einbinden, der finden hier nun Guidelines sowie das offizielle Logo in verschiedenen Formaten:



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Visual Studio Team System Web Access 2008 SP1 Power Tool

30.08.2008 18:18:39 | Kay Giza

Seit heute Nacht ist die deutschsprachige Version der Visual Studio Team System Web Access 2008 SP1 Power Tool  veröffentlicht worden.

Team System Web Access kann kostenlos heruntergeladen werden und wird in eine zukünftige Version von Visual Studio Team System integriert. Sie können die Anwendung mit lizenzierten Installationen von Team Foundation Server installieren. Um Team System Web Access verwenden zu können, müssen Sie als Benutzer von Team Foundation Server lizenziert sein.

Neu mit Service Pack 1

Download und weitere Informationen: Visual Studio Team System Web Access 2008 SP1 Power Tool



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Der große Tag ...

30.08.2008 08:47:33 | Norbert Eder

... ist HEUTE!

Einige von Euch mögen sich ja bereits gewundert haben, wieso ich die letzten Tagen und Wochen eher schreibfaul war, Anfragen verspätet beantwortet wurden und generell ein "wenig die Luft weg" war.

Ich bin zwar nicht unbedingt jemand, der gerne über sein Blog Persönliches verteilt, aber heute sei eine Ausnahme gemacht - schließlich ist es ein wahrer Freudentag und erklärt zudem auch den ersten Absatz.

Läuft alles wie geplant, werden sich meine Herzensdame und ich heute das Ja-Wort geben und einen höchst wundervollen Tag gemeinsam mit Familie und Freunden verbringen.

Um uns und allen geladenen Gästen eine schöne Feier zu bereiten, musste viel Vorarbeit geleistet werden (einige meiner Leser werden davon ein Liedchen singen können) und daher war auch ich gezwungen, meine Community-Tätigkeiten (auch andere "litten" darunter) einzuschränken.

Und nein: Ich bin nicht nervös. *kicher*

So, jetzt muss ich mich beeilen :)

ASP.NET MVC Preview 5 auf Codeplex

29.08.2008 13:53:04 | Robert Mühsig

Das ASP.NET MVC Team hat die Preview 5 nun auf Codeplex zur Verfügung gestellt.

Einige Bugs wurden entfernt und einige nette Sachen wurden mit eingebaut:

  • Helper wurden erweitert
  • ASP.NET AJAX Extensions wurden in einen anderen Namespace verschoben (damit man es später austauschen kann)
  • Controller und Filter wurden erweitert, so kann man nun noch festlegen, dass bestimmte Actions nur per GET oder POST aufgerufen werden können.

Alles interessante findet ihr auf Codeplex und in den dazugehörigen Release Notes.

ShareThis

GC08 - Fable 2

29.08.2008 13:51:00 | Lori Grosland

Vom 21.-24. August fand die Games Convention 2008 in Leipzig statt.  Ich war am Wochenende dabei und habe ein paar Videos darüber gemacht. 

In diesem Video spreche ich mit Georg Backer, Audio Associate Producer von Lionhead Studios über das Action-Role-Playing-Spiel Fable 2.  Fable 2 ist der Nachfolger von Fable 1 und Georg erzählt mir, was für Neuerungen es in dem Spiel gibt. 

Auf der Games Convention dieses Jahr hatten 5555 Xbox Live Gold Mitglieder die Möglichkeit in dem Backstage-Bereich, Fable 2 selbst auszuprobieren.  Fable 2 wird am 24. Oktober im Europa in den Laden zu kaufen sein.

TechTalk im September: Oberflächen mit WPF planen, gestalten, umsetzen

29.08.2008 11:19:15 | Jens Häupel

Mit einem spannenden Thema geht der MSDN TechTalk nach der Sommerpause im September wieder auf Tour. Mein Kollege Dirk Primbs, seines Zeichens Developer Evangelist Team Lead, zeigt dann am Beispiel der Windows Presentation Foundation (WPF), wie moderne Applikations-User Interfaces konzipiert und realisiert werden und welche Rolle WPF heute bei der Entwicklung von Benutzeroberflächen spielt.

Wann und wo Sie die kostenlosen TechTalk-Vorträge erleben können, erfahren Sie in der Event-Rubrik von MSDN Online. Am besten gleich anmelden!

"Meine Software" und der XAMLBlog

29.08.2008 09:41:00 | Jens Peter Kleinau

In den letzten Wochen ist es ein wenig still geworden in diesem Blog. Grund dafür war die finale Phase einer neuen Anwendung, von der ich kurz die Pressemitteilung zitieren möchte. IFA 2008: Mit "Meine Software" von T-Home die persönlichen Internet-Dienste auf dem Desktop immer im Blick 28.08.2008 T-Home stellt zur IFA 2008 in Berlin mit „Meine Software“ eine innovative kostenfreie...

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

Wanted: Windows Server 2008 + SQL Server 2005/2008 Datenbank für Hosting

29.08.2008 07:59:46 | Robert Mühsig

Für ein privates Projekt suche ich gerade nach einem geeigneten Hostingangebot. Da ich gerne immer mal mit neuen Technologien rumspiele, wäre es toll, als Betriebssystem Windows Server 2008 zu haben - mit Adminrechten auf dem Server (und RDP Zugang etc.)
Bei vielen Hostern waren “nur” MySQL DBs dabei - SQL Server Express könnte man zwar nach installieren, aber vielleicht gibt es ja ein Angebot wo eine “richtiger” SQL Server DB dabei ist.

In kurz zusammengefasst:
+ Betriebssystem Windows Server 2008
+ Adminrechte (RDP)
+ MS SQL Datenbanken (gerne natürlich auch SQL Server 2008 ;))
+ Im Prinzip wie sowas, nur mit Windows Server 2008
+ Traffic / Platz ähnlich dem HostEurope Angebot
+ Budget bis 100 Euro

Wer kennt sowas?

ShareThis

.NET Reflector

28.08.2008 17:49:00 | Ozgur Aytekin

Vielleicht haben bereits viele das E-Mail von Lutz Roeder zum Thema .NET Reflector und RedGate erhalten.

Ich möchte in diesem Beitrag für die Leser, die das Tool noch nicht kennen oder das E-Mail nicht erhalten haben, kurz beschreiben,wie es mit diesem Tool weitergeht.

Gemäss E-Mail von Lutz Roeder (Entwickler .NET Reflector Tool), wird das berühmte .NET Reflector Tool in Zukunft von der Firma RedGate vertrieben.

Siehe Homepage für .NET Reflector™

Eine kleine Beschreibung des Tools aus der RedGate .NET Reflector Homepage:

.NET Reflector enables you to easily view, navigate, and search through the class hierarchies of .NET assemblies even if you don't have the code for them. With it, you can decompile and analyze .NET assemblies in C#, Visual Basic and IL.

Use Reflector if you need to:

  • Explore .NET assemblies in an easy-to-understand, natural way
  • Understand the relationships between classes and methods
  • Find where types are instantiated and exposed
  • Check that your code has been correctly obfuscated before release

A number of SQL Server 2008 features are not supported by LINQ to SQL

28.08.2008 13:58:00 | Ozgur Aytekin

Für mein Blog wollte ich ein Beispiel mit LINQ to SQL und Geo-Daten schreiben und dabei den SQL Server 2008 einsetzen und den neuen Datentyp "geography" verwenden.

Leider wurde meine Arbeit durch die folgende Fehlermeldung unterbrochen, nach dem ich die Address-Tabelle-Table der AdventureWorks-Datenbank-Database auf die LINQ to SQL Designer-Oberfläche gezogen habe: One or more selected items contain a data type that is not supported by the designer.

Den SP 1 - Service Pack 1 für Visual Studio 2008 habe ich bereits installiert gehabt. Nach einer kurze recherche im Internet habe ich kein Eintrag zu diesem Thema gefunden.

Nach einem Post an das LINQ to SQL-Forum hat Damien Guard (Microsoft) folgenden Antwort zurück geschrieben:

A number of SQL Server features are not supported by LINQ to SQL even with SP1 installed - this includes geography and hierarchy types.

Auf meine Frage, ob Sie die neuen Datentypen unterstützen werden, bekam ich folgende Antwort zurück:

Supporting the missing types are on our list of features we'd like to add to the next release but I can't confirm what will make it at this point in time.

Den Forum-Eintrag findet ihr unter: LINQ to SQL Designer and SQL Server 2008 "geography" Data Type

Ich werde euch am laufenden halten, sobald ich Neuigkeiten zu diesem Thema habe.

CSV-Datei mit LINQ erstellen

28.08.2008 12:52:00 | Ozgur Aytekin

Im folgenden Beispiel wird gezeigt, wie wir ein CSV-File mit LINQ erstellen können. Als Datenbank wird die SQL Server 2005 AdventureWorks-Datenbank verwendet.

Die Erstellung des CSV-Files erfolgt in drei Schritten:

Schritt 1: Die Daten aus der Datenbank ermitteln.

string conStr =
@"Data Source=IBM-E6A5BAE860C\SQL2K5;Initial Catalog=AdventureWorks;Integrated Security=True";

var db = new AdventureWorksDataContext(conStr);

IQueryable<ProductCategory> qry = from pc in db.ProductCategories
select pc;

Schritt 2: Die Felder für den Export in das CSV-File bestimmen.


int[] field1 = qry.Select(f => f.ProductCategoryID).ToArray();
string[] field2 = qry.Select(f => f.Name).ToArray();
Guid[] field3 = qry.Select(f => f.rowguid).ToArray();

In diesem Schritt werden die Werte der einzelnen Felder in einem Array-Objekt gespeichert. Der Select-Operator hilft uns dabei, die Wert zu ermitteln.


Schritt 3: Die Daten in das CSV-File schreiben.


TextWriter txtWrt = new StreamWriter(@"C:\ProductCategories.csv");

for (int i = 0; i < field1.Length; i++)
{
txtWrt.Write(field1[i] + ";");
txtWrt.Write(field2[i] + ";");
txtWrt.Write(field3[i].ToString());

txtWrt.WriteLine();
}

txtWrt.Close();

Den vollständigen Code findet ihr unten:


using System;
using System.IO;
using System.Linq;

namespace LinqCsvSamples0010
{
internal class Program
{
private static void Main(string[] args)
{
string conStr =
@"Data Source=IBM-E6A5BAE860C\SQL2K5;Initial Catalog=AdventureWorks;Integrated Security=True";

var db = new AdventureWorksDataContext(conStr);

IQueryable<ProductCategory> qry = from pc in db.ProductCategories
select pc;

int[] field1 = qry.Select(f => f.ProductCategoryID).ToArray();
string[] field2 = qry.Select(f => f.Name).ToArray();
Guid[] field3 = qry.Select(f => f.rowguid).ToArray();

TextWriter txtWrt = new StreamWriter(@"C:\ProductCategories.csv");

for (int i = 0; i < field1.Length; i++)
{
txtWrt.Write(field1[i] + ";");
txtWrt.Write(field2[i] + ";");
txtWrt.Write(field3[i].ToString());

txtWrt.WriteLine();
}

txtWrt.Close();

Console.ReadLine();
}
}
}

Ein ZIP-File für den Download findet ihr unter: LinqCsvSamples0010


Unter CodeProject findet ihr zu diesem Thema folgenden Artikel: LINQ to CSV library


Viel Spass...

IE8: Neuerungen in Internet Explorer 8 Beta 2 [fuer Developer]

27.08.2008 22:25:48 | Kay Giza

Starten Sie mit dem Entwickeln - mithilfe der MSDN-Bibliotheksdokumentation für Internet Explorer 8 Beta 2: Neuerungen in Internet Explorer 8 Beta 2 für Entwickler
Wenn Sie kein Entwickler sind: Internet Explorer 8 Beta 2 jetzt verfügbar [IE8 Beta 2] - Download und Infos

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: AJAX - XMLHttpRequest -Verbesserungen in Internet Explorer 8 [fuer Developer]

27.08.2008 22:12:02 | Kay Giza

Das AJAX-Programmiermodell in IE8 ist einfacher und noch leistungsfähiger als jemals vor: XMLHttpRequest-Verbesserungen in Internet Explorer 8



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Definieren von Dokumentkompatibilitaet [fuer Developer]

27.08.2008 22:11:23 | Kay Giza

Bleiben Sie kompatibel mit vergangenen und aktuellen Versionen von Internet Explorer: Definieren von Dokumentkompatibilität

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: CSS-Verbesserungen in Internet Explorer 8 [fuer Developer]

27.08.2008 22:10:32 | Kay Giza

Eine umfassende Liste der Änderungen der CSS-Unterstützung in Internet Explorer Beta 2: CSS-Verbesserungen in Internet Explorer 8

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Entdecken der Internet Explorer 8-Entwicklertools [fuer Developer]

27.08.2008 22:09:38 | Kay Giza

Internet Explorer 8 stellt verbesserte Entwicklertools bereit um Ihnen bei der Untersuchung und Lösung von Problemen zu helfen und verwendet HTML, Cascading Stylesheets (CSS) und Javascript.
Mehr Infos: Entdecken der Internet Explorer 8-Entwicklertools



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Abonnieren von Inhalten mit Web Slices [fuer Developer]

27.08.2008 22:08:37 | Kay Giza

Web Slice basiert auf dem hAtom-Microformat mit einigen zusätzlichen Eigenschaften. Für Entwickler sicherlich interessant: Abonnieren von Inhalten mit Web Slices
Auch sehr interessant: Web Slice Style Guide Samples



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Informationen zu Aktivitaeten: Entwicklerhandbuch [fuer Developer]

27.08.2008 22:07:46 | Kay Giza

IE8 Activities oder auch Aktivitäten, für Entwickler sicherlich sehr interessant. In diesem Artikel wird beschrieben, wie XML-basierte Beschleuniger definiert und bereitgestellt werden.
Weitere Informationen: OpenService-Format sowie Entwicklerhandbuch zu Aktivitäten



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8: Suchanbietererweiterbarkeit in Internet Explorer [fuer Developer]

27.08.2008 22:06:53 | Kay Giza

Der Schwerpunkt der Suchverbesserungen in Internet Explorer 8 Beta 2 liegt auf einer deutlichen Verbesserung des Dropdownmenüs des Suchfelds der Symbolleiste und der Unterstützung von Suchvorschlägen.
Wer sich hierfür interessiert: Suchanbietererweiterbarkeit in Internet Explorer



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Internet Explorer 8 Beta 2: Technologieuebersicht [fuer Developer]

27.08.2008 22:04:14 | Kay Giza

Erfahren Sie mehr über Windows Internet Explorer 8 Beta 2: Internet Explorer 8 Beta 2: Technologieübersicht



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

IE8 Readiness Toolkit fuer Webseiten und Software [fuer Developer]

27.08.2008 22:02:00 | Kay Giza

Mit dem zunehmenden Einsatz von Internet Explorer 8 durch die soeben erschienene zweite Betaversion des Browsers rückt auch für bestehende Webseiten und IE-basierende Software der Tag der Wahrheit näher, da der neue Browser im Unterschied zu seinen Vorgängern vollkommen standardkompatibel arbeitet. Somit können Webseiten und Software, die für ältere Versionen von Internet Explorer speziell angepasst wurden, in einigen Fällen einer Überarbeitung bedürfen. Das Internet Explorer 8 Readiness Toolkit unterstützt Sie bei der Anpassung Ihrer Webseiten und Anwendungen für Internet Explorer 8.



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Internet Explorer 8 Beta 2 jetzt verfuegbar (IE8 Beta 2) - Download und Infos

27.08.2008 21:52:55 | Kay Giza

Der Internet Explorer in Version Beta 2 ist ab sofort verfügbar und im Gegensatz zur Beta 1 Version nicht nur für Entwickler und Designer gedacht sondern jedermann sollte ihn meiner Meinung nach ausprobieren! Wenn Sie Support für IE8 Beta2 benötigen, besuchen Sie die Internet Explorer Beta-Newsgroup, in der Sie Probleme besprechen können, oder wenden Sie sich an Customer Support Services. Download-Links, entsprechende Infos zu allen Neuerungen + Bilder sowie Erklärungen finden Sie in diesem Blogposting auf Giza-Blog.de... [...mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

The true meaning of readonly for value types

27.08.2008 18:47:25 | Andre Loker

I've been trying to create a simple and lightweight wrapper around List<T> and List<T>.Enumerator. The only thing I needed was the ability to enumerate over the items of the list. The list is supposed to be enumerated very(!) often, so I wanted the enumerator to be struct instead of a class. Using a value type enumerator avoids any heap allocation during enumerator. List<T>.Enumerator is a value type just because of the same reason.

So here's my first approach:

 /// <summary>
 /// A wrapper around an <see cref="List{T}"/> that only allows enumeration. 
 /// </summary>
 public struct ReadOnlyList<T> {
   private readonly List<T> items;
  
   /// <summary>
   /// Initializes a new instance of the <see cref="ReadOnlyList{T}"/> struct.
   /// </summary>
   /// <param name="list">The list.</param>
   public ReadOnlyList(List<T> list) {
     items = list;
   }
  
   /// <summary>
   /// Gets the enumerator.
   /// </summary>
   /// <returns></returns>
   public Enumerator GetEnumerator() {
     return new Enumerator(items);
   }
  
   #region Nested type: Enumerator
   /// <summary>
   /// A light weight enumerator for <see cref="ReadOnlyList{T}"/>
   /// </summary>
   public struct Enumerator {
     private readonly List<T>.Enumerator enumerator;
  
     /// <summary>
     /// Initializes a new instance of the <see cref="ReadOnlyList&lt;T&gt;.Enumerator"/> struct.
     /// </summary>
     /// <param name="items">The items.</param>
     public Enumerator(List<T> items) {
       enumerator = items.GetEnumerator();
     }
  
     /// <summary>
     /// Gets the current item.
     /// </summary>
     /// <value>The current item.</value>
     public T Current {
       get { return enumerator.Current; }
     }
  
     /// <summary>
     /// Moves to the next element in the enumeration.
     /// </summary>
     /// <returns></returns>
     public bool MoveNext() {
       return enumerator.MoveNext();
     }
   }
   #endregion
 }

This looks perfectly reasonable if you ask me. Here's a unit test to check that the enumerator works:

 [Test]
 public void Enumerator_CanEnumerateList() {
   var list = new List<int> {0, 1, 2, 3};
   var enumerator = new ReadOnlyList<int>.Enumerator(list);
   var expected = 0;
   while(enumerator.MoveNext()) {
     Assert.AreEqual(expected, enumerator.Current);
     expected++;
   }
   Assert.AreEqual(list.Count, expected);
 }

The test should pass, right? After all the Enumerator struct is a mere wrapper aroung List<T>.Enumerator. Funny thing is: it fails! Do you see why? As a hint, here's what fails: the second time the loop runs enumerator.Current is 0 although enumerator.MoveNext() has returned true. But why? It has taken me quite a while to find the reason.

To the Bat Mobile Debugger!

Of course, first thing I did was to debug the code. List<T>.Enumerator.MoveNext() looks something like this:

 public bool MoveNext() {
     List<T> list = this.list;
     if ((this.version == list._version) && (this.index < list._size)) {
         this.current = list._items[this.index];
         this.index++;
         return true;
     }
     return this.MoveNextRare();
 }

MoveNextRare() is not important here, but what is important is that when the method returns true, index should have been increased. However, according to the debugger, the value of enumerator.enumerator.index doesn't change after the call to MoveNext(), although it returned true. Weird, huh? Somehow the fields did not get updated.

So I dug deep into the code. I opened ReadOnlyList<T>.Enumerator.MoveNext() in Reflector and here's what I got:

 .method public hidebysig instance bool MoveNext() cil managed
 {
     .maxstack 1
     .locals init (
         [0] valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!T> CS$0$0000)
     L_0000: ldarg.0 
     L_0001: ldfld valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> Moonbow.Util.ReadOnlyList`1/Enumerator<!T>::enumerator
     L_0006: stloc.0 
     L_0007: ldloca.s CS$0$0000
     L_0009: call instance bool [mscorlib]System.Collections.Generic.List`1/Enumerator<!T>::MoveNext()
     L_000e: ret 
 }

Now it became clear that my MoveNext() method created a local copy of the enumerator field and called MoveNext on the copy. This of course meant that the original fields of the List<T>.Enumerator wouldn't get updated. And now you might see where my mistake was? Right: ReadOnlyList<T>.Enumerator.enumerator is marked as readonly! My idea was that the enumerator object will not be reassigned in any method of my Enumerator, so I could as well make the field readonly. After removing the readonly modifier the IL of my MoveNext() method was much more like I expected:

 .method public hidebysig instance bool MoveNext() cil managed
 {
     .maxstack 8
     L_0000: ldarg.0 
     L_0001: ldflda valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> Moonbow.Util.ReadOnlyList`1/Enumerator<!T>::enumerator
     L_0006: call instance bool [mscorlib]System.Collections.Generic.List`1/Enumerator<!T>::MoveNext()
     L_000b: ret 
 }

The conclusion

Here's the moral of the story:

If you declare a value type field as readonly, every call made to this field is actually made to a local copy. Any changes made in those calls are not stored in the readonly field. This is different from reference type fields where calls will be made on the field itself, potentially causing changes in the referenced object.

If this has been obvious for you: kudos, I didn't know that. Rreadonly fields are "really" readonly for value types, it means more than prohibiting assignments to the field. I did not find a word about that in the specification. The MSDN only mentions that assignments to readonly fields are only allowed in the declartion or in the constructor:

The readonly keyword is a modifier that you can use on fields. When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.

There is however a bug report that deals with this issue. Is has been closed as "By Design", though. It references the part in the specs that defines this behaviour: it's in section 7.4.4, function member invocation, bullet list 2, item 2, subitem 2.

If E is not classified as a variable, then a temporary local variable of E’s type is created and the value of E is assigned to that variable. E is then reclassified as a reference to that temporary local variable. The temporary variable is accessible as this within M, but not in any other way. Thus, only when E is a true variable is it possible for the caller to observe the changes that M makes to this.

By the way: it does not matter whether the type that declares the readonly value type fiels is a struct or a class by itself.

Social Bookmarking und Microsoft? Hmmm....

27.08.2008 18:32:47 | Kay Giza

Blogger-Kollege Stephan Walcher und vor einigen Tagen folgenden Artikel veröffentlicht: Microsoft startet seinen Social Bookmark Service Interessant dachte ich - ich kenne Stephan schon lange er weiß immer eigentlich als erster über die neuesten Neuigkeiten bescheid. Hmm - ok - dann las ich den Artikel und las und las... Ich bin immer ehrlich und offen, so will ich es auch bei diesem Thema sein... [Mehr Informationen in diesem Blog-Posting auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Update: Microsoft Photosynth erzeugt 3D-Panoramabilder weitgehend automatisch

27.08.2008 17:10:59 | Kay Giza

Es wäre ja bei mir während meines Kurzurlaubs fast untergegangen: Microsoft Live Labs am 21. August die neue Version von Photosynth (3D-Foto-Visualisierungstechnologie) veröffentlicht! Microsoft Photosynth bietet weit mehr als Schnappschüsse oder kurze Videos. Mit dem neuen Service von Microsoft Live Labs lassen sich 360-Grad-Ansichten des Urlaubsortes oder dreidimensionale Darstellungen einer Sehenswürdigkeit im Handumdrehen erzeugen. Dazu reichen die Fotos einer Digitalkamera und das gratis unter www.photosynth.com erhältliche Tool. Beim zusammengesetzten Bild, dem "Synth", kann der Betrachter sich virtuell nach oben oder unten sowie nach links oder rechts bewegen, Details vergrößern oder sich übersichtlich die Gesamtansicht anzeigen lassen. Das Synth lässt sich auch mit Freunden und Bekannten austauschen. Sie können sich dann so fühlen, als ob sie selbst vor Ort sind. Videos, Anleitungen und Infos finden Sie in diesem Blogposting hier auf Giza-Blog.de...

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

.NET User Group Dresden

27.08.2008 13:12:35 | Robert Mühsig

Wir (das heißt Oliver und ich) haben uns zum Ziel gesetzt eine .NET User Group in Dresden zu etablieren. Unser erstes Treffen wir in den Gebäuden der T-Systems-MMS am 03.09 18:00 bis 20:00 Uhr stattfinden.

Alle Details findet ihr auf http://www.dd-dotnet.de/ - wer also Dresdner .NET Kollegen kennt (oder kennen lernen will), ist herzlich eingeladen :)

ShareThis

Neuigkeiten zum sharpcms

26.08.2008 20:35:00 | Jürgen Gutsch

Wie im letzten Beitrag angekündigt gibt es ein paar großartige Neuigkeiten zum sharpcms und dem sharpcms Projekt.

Ab jetzt wird die Leitung des Projektes von Thomas Huber (www.klickflupp.ch, http://www.aspnetzone.de/blogs/thomashuber/) aus der Schweiz und von mir geführt.

Die offizielle Adresse der sharpcms Website ist jetzt http://www.sharpcms.org/. Die alten Domains (sharpcms.de, sharpcms.ch und sharpcms.dk) werden noch umgeleitet.

Ab jetzt wird der Quell-Code von sharpcms auf Microsofts Open Source Projekt-Hosting Website „Codeplex“ bereitgestellt (http://www.codeplex.de/).
Die URL des Projektes auf Codeplex ist http://www.codeplex.com/sharpcms.
Codeplex beinhaltet ein Diskussionsforum (http://www.codeplex.com/sharpcms/Thread/List.aspx). Alle weiteren Diskussionen sollten in  diesem Forum gestartet und geführt werden. Die deutsche Google Gruppe wird in den nächsten Monaten geschlossen. Die englische Gruppe wird als Archiv offen bleiben.
Codeplex beinhaltet außerdem ein Issue-Tracking (http://www.codeplex.com/sharpcms/WorkItem/List.aspx). Bitte meldet alle Fehler und Wünsche bitte unter dieser URL.

Neue Releases von sharpcms können unter folgender Adresse gefunden werden: http://www.codeplex.com/sharpcms/Release/ProjectReleases.aspx
Die Quell-Codes unter folgender Adresse heruntergeladen werden: http://www.codeplex.com/sharpcms/SourceControl/ListDownloadableCommits.aspx

Sharpcms wird weiterhin unter der GPL v2 veröffentlicht (http://www.codeplex.com/sharpcms/license).

RedGate acquires .NET Reflector

26.08.2008 15:23:32 | Andre Loker

This morning I got an e-mail from Lutz Roeder, creator of the marvelous .NET Reflector in which he announces that he handed development of .NET Reflector over to Red Gate Software. Red Gate is known for their .NET profiler ANTS and has also acquired the PInvoke.net plugin (originally developed by PInvoke.net)some time ago.

What's probably important for many of us is that Red Gates promises to provide a free version of Reflector:

We will continue to maintain a free version for the benefit of the community.

On the one hand this opens a big opportunity for the future of .NET Reflector. Red Gate is certainly capable of adding a lot of functionality to Reflector. On the other hand, I see the potential danger that Red Gate might neglect the development of a free community version in the course of time in favour of a commercial license.

I can totally understand Lutz when he says that after eight years of development he's striving for new objectives. And I can also understand that by handing Reflector over to Red Gate he can get the financial reward that he deserves. It would of course have been awesome if he made Reflector open source, but he chose not to, and I respect this choice. Let's just cross fingers that Red Gate decides to put as much effort into a free community version as in a commercial version.

To Lutz, all the best for future projects. Thanks for having made such a great piece of software.

To Red Gate, good luck with the further development of Reflector. You're in the responsibility of keeping the spirit of a great product alive.

How to enable sound in Remote Desktop sessions on WinServer 2k3

26.08.2008 14:46:00 | Andre Loker

On a Windows Server 2003 machine I needed sound to be enabled during remote desktop connections. Here's what I had to do to bring the sound to the client machine.

  1. Install audio drivers on the server, of course
  2. Enable the Windows Audio service on the server.
    1. Open Administrative Tools => Services
    2. Locate the service named Windows Audio
    3. Set the start mode to "Automatic" and start the service
      image
  3. Enable RDP-Tcp Audio Mapping
    1. Open Administrative Tools => Terminal Services Configuration
    2. Select the "Connections" node on the left side
    3. Right click on RDP-Tcp on the right side and select "Properties" (or double click RDP-Tcp)
    4. On the "Client Settings" tab, uncheck "Audio mapping"  (checked items are disabled)
      image
  4. In the Remote Desktop Connection window (client side), enable audio playback on client computer
    1. Show options by clicking "Options >>"
    2. On the "Local Resources" tab, select "Bring to this computer" in the combo box under "Remote computer sound"
      image
  5. Connect to the remote server and you should have sound.

Note: you should only enable sound on the server if you have a good reason, e.g. I edit my DVB-T recordings on the server. Otherwise, leave audio off for stability and security reasons.

Was ist Moderne Software?

26.08.2008 11:09:00 | Jens Peter Kleinau

Demletzt hatte ich mit einem Kollegen aus meinem vorherigen Java Umfeld anhand seiner frisch erstellten SOA Intranetanwendung eine wunderbare Diskussion, was denn nun "Moderne Software" sei. Ich definierte das für mich wie folgt: Moderne Software muss ihren Wert an modernen Maßstäben messen lassen!  Anwendungen werden nur noch in seltenen Fällen auf dem Reißbrett...

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

Jens K. Süßmeyer zu Gast bei der DNUG Koblenz

25.08.2008 22:59:41 | Andre Kraemer

Kommenden Donnerstag, den 28. August 2008 haben wir ab 19:00 Uhr Jens von der Microsoft Deutschland GmbH bei unserer .NET User Group in Koblenz zu Gast. Wer also zwischen 19:00 und 21:00 Uhr noch nichts vor hat und sich für den SQL Server 2008 interessiert, ist herzlich eingeladen.

Nach Möglichkeit bitte vorher über Xing anmelden, kurzentschlossene sind natürlich auch spontan willkommen.



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

Was ist fast so schön wie leuchtende Kinderaugen?

25.08.2008 22:40:52 | Andre Kraemer

Genau: leuchtende Kundenaugen :-)

Diese durfte ich kürzlich wieder sehen. Einer meiner Kunden behalf sich nämlich Jahre lang mit "schmutzigen" Workarrounds um das Feuern von Update-Triggern bei Massenupdates zu vermeiden.

Glücklicherweise ist es jedoch unter dem SQL Server möglich, Trigger bedarfsweise zu deaktiveren / aktivieren.

Für alle, die mit dem selben Problem kämpfen hier zur Referenz:

-- Trigger für Tabelle deaktiveren

ALTER TABLE [MeineTabelle] DISABLE TRIGGER ALL

 

-- Massenupdate durchführen, z. B.

-- update MeineTabelle set Preis = Preis * 1.5

 

-- Trigger wieder aktivieren

ALTER TABLE [MeineTabelle] ENABLE TRIGGER ALL



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

Vorkommnisse eines Zeichens unter T-SQL zählen

25.08.2008 22:39:23 | Andre Kraemer

T-SQL bietet keine Möglichkeit die Vorkommnisse eines Zeichens innerhalb einer Zeichenkette zu zählen.

Richtig! Nun ja, zumindest fast. Zwar gibt es keine eingebaute Funktion, mit folgendem Konstrukt lässt sich die Anforderung jedoch trotzdem erfüllen:

    1 -- Anzahl der vorkommenden 't' zählen

    2 Select

    3         CompanyName,

    4        len(CompanyName) - len(replace(CompanyName, 't', '')) as Anzahl

    5 from

    6         Customers

Im gewählten Beispiel, welches übrigens auf der Northwind Datenbank ausprobiert werden kann, werden die Anzahl der 't' innerhalb des Felds CompanyName gezählt.

Die Funktionsweise ist recht einfach:

Zuerst wird in Zeile 4 die Länge des Namens ermittelt. Im Beispiel von 'Alfreds Futterkiste' wäre dies 19. Anschließend werden alle 't' innerhalb von 'Alfreds Futterkiste' durch einen leeren Character ersetzt und die Länge von 16 Zeichen ermittelt. Als letztes wird der zweite Wert vom ersten subtrahiert, so dass wir auf unser Ergebnis von 3 kommen.

Eigentlich ganz einfach, oder :-)



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

Photosynth - Wie erstellt man ein Synth?

25.08.2008 16:31:00 | Lori Grosland

Wie ich letzte Woche geschrieben habe, hat Microsoft Live Labs eine neue Version von Photosynth gelauncht.  Photosynth ist ein kostenloser Service, um Fotos in einem 3D-Umfeld zu erleben und auszutauschen. 

Um selbst ein Synth (3D-Model mit Fotos) zu bauen, braucht Ihr eine Kollektion von Fotos von einem Objekt oder einem Ort – am besten 20-300 Fotos mit Überlappung und verschieden Blickwinkel.  Mit der Hilfe des Photosynth-Tools könnt Ihr dann ein 3D-Model aus den Fotos erstellen. 

Die besten Synths beginnen mit den richtigen Fotos.  Um besser zu verstehen wie man ein Synth selbst baut, habe ich das „Photosynth – How To“-Video auf Deutsch synchronisiert.  Schau das Video an, um zu lernen, wie man Fotos macht, um ein gutes Synth zu bauen. 

Es gibt auch eine Anleitung zur Photosynth-Fotografie.  Diese Anleitung zeigt, welche Art von Fotos für Photosynth besonders geeignet ist.  Die Anleitung hilft Ihr zu vermeiden, mehrere hundert Fotos zu machen und dann später festzustellen, dass Photosynth sie nicht so zusammenstellt, wie erwartet.  Dieser Anleitung zur Photosynth-Fotografie könnt Ihr hier herunterladen.

 

Cool Tipp Wettbewerb bei der .Net Developergroup Ulm

25.08.2008 08:22:19 | Thomas Schissler

am 08.09.2008 findet bei der .Net Developergroup Ulm ein 'Cool Tipps' Wettbewerb statt. Idee hinter diesem Wettbrewerb ist, einen stärkeren Austausch innerhalb der Community zu erreichen. Mit diesem besonderen Event wollen wir auch das 2-jähriges Bestehen unserer Usergroup und hoffentlich auch das 200. Mitglied feiern.

Jeder Entwickler hat seine kleinen Tricks um bestimmte Aufgaben schnell, effizient und elegant zu erledigen.
Unser Ziel ist ein Austausch dieses Wissens. Aus diesem Grunde wollen wir am 08. September einen ganz besonderen Wettbewerb veranstalten. Die Mitglieder der .net Developergroup Ulm sind aufgerufen, ihr Knoff-Hoff in einer Kurzpräsentation vorzustellen. Das vorgestellte Thema kann aus einem weiten Bereich gewählt werden. Egal ob es sich um ein Code-Snippet handelt, um ein Tool, eine spezielle Methode oder ein Designpattern. Alles was mit der .Net Programmierung zu tun hat ist von Interesse. Und jeder Teilnehmer kann wertvolle Sachpreise gewinnen. Mitmachen lohnt sich!

Hier die Rahmenbedingungen für den Wettbewerb:

  • Teilnahmeberechtigt sind alle Mitglieder der .net Developergroup Ulm  
  • Jeder Teilnehmer erhält 10 Min. für seinen Beitrag  
  • Alle Beiträge müssen in einem Zusammenhang mit der Programmierung unter .Net stehen.  
  • Die Besucher der Veranstaltung wählen am Ende die besten Beiträge, die mit wertvollen Sachpreisen belohnt werden.  
  • Themenvorschläge sind bis spätestens 31.08. per E-Mail einzureichen unter info@dotnet-ulm.de

Sachpreise:

  • 1 Enterprise Studio-Lizenz (Wert 1100$) von
LogoComponentOne
  • 2 RadControl-Lizenzen (Wert je 1299$) von
logo_telerik
  • 1 ReSharper-Lizenz (Wert 140€) von
logo_jetbrains
  • 3 Jahres Abos (Wert je 76,50€)von
dotnetmaglogo
  • 5 Buchgutscheine (a 60 €) von
logo_mspress

Bereits angemeldet Themen:

  • Lokalisiertes Property-Grid  
  • Vista Gadgets programmieren  
  • Broadcast Messages mit Controls  
  • Zeitspar-Tools für TFS  
  • Object Cloner  
  • Data Sets per WCF übertragen  
  • PDF- und Excel-Export aus ASP.Net mit Bordmitteln  
  • Generische Fehlerklasse
  • Beliebige Datenformate per Serialisierung erzeugen und lesen

Wer noch Interesse hat, am Wettbewerb teilzunehmen, kann gerne noch einen Vortrag an info@dotnet-ulm.de einrichen. Und natürlich sind alle interessierten gerne als Zuhörer willkommen. Und vielleicht schaffen wir es ja doch noch bis zum 08.09 die fehlenden 7 Mitglieder zu gewinnen, um die 200 voll zumachen.

Windows Sysinternals Desktops Problem

25.08.2008 08:19:03 | Norbert Eder

Nun habe ich seit ein paar Tagen Desktops am Laufen und bin grundsätzlich sehr zufrieden damit. Schließlich ist es darüber möglich, seine Anwendungen nach Gebrauch zu "kategorisieren". Schade eigentlich, dass es dieses Feature nicht schon von Haus aus unter Windows gibt.

Was aber eher störend ist: Wird in einem Desktop, der nicht der primäre Desktop ist, ein IE7 verwendet, dann kommt es bei der Verwendung von mehreren Tabs dazu, dass darin nichts mehr geladen wird. Das spielt sich hin bis zu einem: "ich stelle mit tot".

Kann das jemand nachvollziehen? Sprich, ist es nur bei mir so, oder kann das auch auf anderen Systemen nachvollzogen werden? Tritt unter XP (alle SPs + Patches) auf.

Davon abgesehen kann ich das Tool aber jederzeit empfehlen.

Neue ASP.NET MVC Videos

24.08.2008 14:56:39 | Robert Mühsig

Auf der offiziellen ASP.NET MVC Seite gibt es nun 15 neue Videos zu bestaunen:
- 10 HowDoI Videos
- 5 Pair Programming Videos mit dem Entwickler von NUnit

In den HowDoI Videos wird auf die Testbarkeit, sowie das generelle Konzept eingegangen - Routing, MVC usw.

Wer sich dafür interessiert, sollte mal einen Blick draufwerfen :)

ShareThis

SQL Server 2008 Unterstützung für Office SharePoint Server 2007

23.08.2008 19:12:00 | Ozgur Aytekin

Microsoft SharePoint Team hat in ihrem Blog die SQL Server 2008 Unterstützung für Office SharePoint Server 2007 und Windows SharePoint Services 3.0 bekannt gegeben.

SQL Server 2008 Support for SharePoint Products and Technologies

Windows SharePoint Service 3.0

Office SharePoint Server 2007

Windows Sysinternals

23.08.2008 11:44:00 | Ozgur Aytekin

Die berühmte Tool-Sammlung für Windows findet ihr unter der URL: Windows Sysinternals

File and Disk Utilities
Utilities for viewing and monitoring file and disk access and usage.

Networking Utilities
Networking tools that range from connection monitors to resource security analyzers.

Process Utilities
Utilities for looking under the hood to see what processes are doing and the resources they are consuming.

Security Utilities
Security configuration and management utilities, including rootkit and spyware hunting programs.

System Information
Utilities for looking at system resource usage and configuration.

Miscellaneous Utilities
A collection of diverse utilities that includes a screen saver, presentation aid, and debugging tool.

Free e-book offer: Writing Secure Code, Second Edition, by Michael Howard and David LeBlanc

23.08.2008 11:28:00 | Ozgur Aytekin

Microsoft stellt uns wieder ein gratis Buch zur Verfügung. Diesmal ist es ein berühmtes und wirklich ein sehr gutes Buch: "Write Secure Code, Second Edition".

Discover the best practices for writing secure code and stopping malicious hackers in their tracks—direct from the top security experts at Microsoft! For one week only, you can download the e-book of Writing Secure Code, Second Edition for free. This offer requires a valid Windows Live ID and the access code 7234-N4E8-4995. Activate your access code by August 28, 2008. Download the e-book today!

Download the e-book today!

CardSpace UI und Beamer?

23.08.2008 08:00:00 | Mathias Raacke

Ist es Zufall, ein Fall von “Murphys Law”, oder ist das CardSpace UI tatsächlich bei angeschlossenem Beamer viel langsamer als sonst?

Das Anmelden mit CardSpace an meinem Blog hat gerade mal wieder nur 2-3 Sekunden gedauert. So ziemlich jedes Mal, wenn ich den gleichen Vorgang während einer Präsentation zeige, dauert es furchtbar lange, bis endlich die CardSpace-Oberfläche erscheint. Jedes mal. Mindestens 10 Sekunden. Oft auch noch länger. Das hilft natürlich ungemein, das Publikum von CardSpace zu überzeugen…

Technorati Tags:

Konfigurieren der Shared Services Provider Komponente in MOSS 2007 - Configure Shared Services Provider Component in MOSS 2007

22.08.2008 17:33:00 | Ozgur Aytekin

Dieser Beitrag beschreibt, wie wir die Share Services Provider Komponente des MOSS 2007 Server konfigurieren können.

Zuerst SharePoint Central Administration Seite starten: Start - Programs - Microsoft Office Server - SharePoint 3.0 Central Administration

Start - Programs - Microsoft Office Server - SharePoint 3.0 Central Administration 

Application Management Tab auswählen.

Application Management 

Anschliessend unter Office SharePoint Server Share Services - Create or configure this farm's share services klicken.

Office SharePoint Server Share Services - Create or configure this farm's share services 

New SSP-Button klicken.

New SSP 

Für eine neue Web Application für unser Share Services Provider - Create a new Web application klicken.

Create a new Web application 

IIS Web Site: In diesem Schritt, die Option Create a new IIS web site auswählen. Bei Bedarf kann der Description-Wert und Port-Nummer geändert werden.

Security Configuration: Die Option für Authentication provider soll als NTLM definieren, wenn ihre Umgebung Negotiate (Kerberos) nicht unterstützt.

Create a new IIS web site - Authentication provider 

Die Option Allow Anonymous als No definieren.

Die Option Use Secure Sockets Layer (SSL) je nach Bedarf als Yes oder No definieren. In diesem Beispiel verwenden wir kein SSL, aus diesem Grund  wird die Option als No definiert.

Load Balanced URL: Wenn kein Load Balancing vorhanden, die Einstellung mit Default-Wert lassen.

Application Pool: Bei Option Application Pool - Create new application auswählen. Zusätzlich einen Domain-User eingeben (Bsp. DOMAIN\User). Bei dieser Stelle warnt Microsoft auf seiner Technet Page, dass dieser User keine Administrative Rechte besitzen soll (siehe unter Configure the primary Shared Services Provider Punkt 10).

Allow Anonymous - Use Secure Sockets Layer (SSL) - Application Pool - Create new application 

Reset Internet Information Services: Die Option Reset Internet Information Services als Restart IIS Manually definieren. Mit dieser Option wird festgelegt, ob die IIS nach der Erstellung der Web application automatisch gestartet werden soll.

Database Name and Authentication: Bei Database Name and Authentication Einstellungen müssen wir einen Datenbank-Server angeben, auf dem die WSS_Content-Datenbank für die neuen Web application erstellt wird. Als Default wird ein Datenbankname mit einer GUID vorgeschlagen. Den Namen der Datenbank soll geändert werden. So wird die Identifizierung der Datenbank in einem späteren Zeitpunkt vereinfacht. In diesem Beispiel wird die Datenbank als WSS_Content_SSP_01 benannt. Die Einstellung Database authentication soll als Windows authentication bleiben.

Anschliessend können wir die neuen Web application mit OK-Button erstellen lassen.

Reset Internet Information Services - Restart IIS Manually - Database Name and Authentication - Database authentication - Windows authentication  

SSP Name: Als Nächstes definieren wir den Namen unseren Share Service Providers (SSP Name). SharedServices1 wird als Default-Wert vorgeschlagen. Wenn in der Auswahlliste Web application noch kein Wert selektiert ist, dann hier die neu erstellte Web application selektieren.

Die URL für die Share Service Providers Administration Page wird hier angezeigt (SSP Administration Site URL). Auf dieser Administration Page können wir auch über die Central Administration zugreifen.

SSP Name - SSP Administration Site URL 

My Site Location: Die Einstellungen für My Site Location können wir wie vorgeschlagen übernehmen.

SSP Service Credentials: Hier benötigen wir einen Domain User (DOMAIN\User). Auch hier empfiehlt Microsoft auf seiner Technet Seite einen User ohnen Administrative Rechte.

SSP Database: Für spezifischen Daten der Shared Services Provider-Komponente benötigen wir eine Datenbank. Auch hier wird empfohlen, die Einstellung für Database authentication als Windows authentication zu definieren.

My Site Location - SSP Service Credentials - Database authentication - Windows authentication 

Search Database: Als Nächstes definieren wir den Datenbank Server für unseren Search Datenbank-Search Database.

Index Server: Anschliessend müssen wir einen Index Server auswählen. Für die Einrichtung einer Shared Services Provider-Komponente wird ein Index Server vorausgesetzt. In diesem Beispiel läuft der Index Server auf dem gleichen Server. In der Praxis und grösseren Umgebung wird emfohlen, für die Indexierung einen separaten Server zu verwenden, weil der Index Server viel Ressourcen benötigt.

SSL for Web Services: Als Schluss definieren wir, ob die SSL-Verschlüsselung für die Web Services benötigt werden. In diesem Beispiel verwenden wir keine SSL-Verschlüsselung. Aber in der Praxis wird empfohlen, SSL-Verschlüsselung zu verwenden.

Mit dem OK-Button können wir unseren Shared Services Provider-Komponente erstellen lassen.

image 

Die folgende Warnung ist für die Praxis sehr wichtig. Es wird empfohlen, für die SSP administration und My Sites unterschiedliche Web applications zu verwenden, damit man die Daten voneinander unabhängig restoren kann.

Die Meldung mit OK-Button bestätigen.

image 

Am Schluss erscheint die folgende Seite als Bestätigung, dass die Shared Services Provider-Komponente erfolgreich eingerichtet wurde.

image 

Vie Spass...

Beim sharpcms tut sich wieder was...

22.08.2008 09:33:00 | Jürgen Gutsch

Heute mal etwas Eigenwerbung. (Wird nicht oft vorkommen, versprochen!!)

Wie aus dem Titel zu entnehmen ist, wird sich in den nächsten Tagen in Sachen sharpcms einiges tun. Viel wird jetzt noch nicht verraten, außer das es personelle und strukturelle Änderungen im sharpcms Projekt gibt und das Projekt in ein neues Repository umzieht (welches verrate ich noch nicht *g*)

sharpcms selber wird natürlich weiterhin Open Source bleiben.

Weitere Informationen wird es dann hier, auf der sharpcms Website, in den beiden Google Groups (deutsch, englisch) und auf meinem persönlichem Blog geben.

Für alle die bis dahin weitere Infos und News gezwitschert bekommen möchten, habe ich einen Twitter Account eingerichtet: http://twitter.com/sharpcms.

ADO.NET Data Services (Astoria): XML nicht als RSS Feed anzeigen

22.08.2008 00:01:51 | Jan Welker

Eins der neuen Features im .NET Framework 3.5 SP1 sind die ADO.NET Data Services, diese sind auch unter dem Namen Astoria bekannt.

Wer die Data Services nutzen möchte und den Internet Explorer verwendet, sollte die folgende Einstellung vornehmen:

Extras -->Internetoptionen --> Inhalte --> Feeds --> Einstellungen --> Feedleseanzeige einschalten --> deaktivieren

Mit Hilfe dieser Einstellung werden die XML Daten vom Internet Explorer nicht als RSS Feed angezeigt.
Das Ergebnis ist deutlich besser lesbar ;-)

Feedanzeige

Erste Erfahrungen mit Scrum – ein Praxisbericht (Teil 1)

21.08.2008 23:54:20 | Mathias Raacke

Auf die Gefahr hin, dass ich doch nie weitere Teile bloggen werde, habe ich riskiert einen Blogeintrag mit “(Teil 1)” im Titel zu schreiben. Statt wie sonst über reine Technologie/Code zu bloggen, möchte ich zur Abwechslung über meine Erfahrungen mit einem Vorgehensmodell – in diesem Fall Scrum – bloggen. Eine Warnung vorweg: Da es um mein erstes Projekt mit Scrum geht muss nicht alles unbedingt 100%ig korrekt sein, was ich hier zu Scrum blogge.

Im Moment arbeite ich als Trainer/Entwickler/Architekt/Berater (im Prinzip ein klein wenig von Allem :-) ) in einem Webentwicklungsprojekt hier in Paderborn. Das ist eine nette Abwechslung zu den vielen Trainings in den letzten Monaten. So ein “echtes” Projekt ist halt doch immer etwas anderes als reine Technologiedemos zu schreiben.

Unser Team besteht aus 7 Entwicklern, wobei viele davon zum ersten Mal zusammenarbeiten. Bisher gab es in der Firma deshalb auch noch keinen richtigen Entwicklungsprozess für solche Projekte. Ich habe am Anfang länger hin und her überlegt, welche Vorgehensweise wir am besten einsetzen sollten. Da das Team sowieso in der Form noch nicht zusammengearbeitet hat und noch nicht alle Teammitglieder richtig viel Erfahrung in .NET haben sollte es nicht zu kompliziert und umfangreich werden. Eine neue Technologie, ein neues Team, und dann auch noch eine komplizierte neue Vorgehensweise, das wäre sicher zuviel auf einmal. Es sollte also etwas kleines, agiles sein, dass keine größere Einarbeitung und komplizierte Prozesse und Dokumente erfordert.

Ich bin schon sehr früh dabei auf Scrum gekommen, habe aber dann doch eine Weile gebraucht, um mich dafür zu entscheiden. Wir haben nicht die Möglichkeit, es wirklich “wie im Lehrbuch” umzusetzen, deshalb hatte ich erst noch weiter nach Alternativen gesucht. Mangels geeigneterer Alternativen habe ich mich dann doch für Scrum entschieden, bzw. dafür, das aus Scrum zu verwenden, was mir für unser Projekt sinnvoll erscheint.

Scrum ist eine agile Projektmanagement-Methode. Im Vergleich zu anderen, vor allem im Vergleich zu nicht agilen Vorgehensweisen wie Unified Process, V-Modell usw. ist es sehr simpel und einfach und besteht im Prinzip nur aus wenigen einfachen Regeln. Da Alexander – der mir am Anfang netterweise meine ersten Fragen zu Scrum beantwortet hat – auf seiner Seite Scrum-Master.de Scrum sehr schön erklärt, verweise ich einfach mal auf seine Scrum-Einführung für eine ausführlichere Erklärung.

Um das Team aufeinander einzustimmen und quasi zum “warm werden” haben wir nicht gleich mit dem “echten” Projekt angefangen, sondern als Testlauf zunächst eine Software entwickelt, die wir intern zur Erfassung unserer Arbeitszeiten nutzen möchten. Dabei setzen wir nach und nach immer mehr Techniken aus Scrum ein. Eine davon möchte ich heute erklären: Sprints.

Bei Scrum wird die Software in mehreren Iterationen, sogenannten Sprints entwickelt. In einem Sprint wird ein Teil der Anforderungen an die Software (bei uns definiert durch User Stories) vollständig umgesetzt. Die einzelnen Stories sind also komplett implementiert, und vor allem auch getestet und dokumentiert, quasi so, dass die Software danach schon (mit den bis dahin implementierten Anforderungen) ausgeliefert und verwendet werden könnte.

Das hat verschiedene Vorteile: Bei anderen Vorgehensweisen kommt z.B. die Testphase erst am Schluss, und auch andere “unangenehme” Aufgaben wie Dokumentation oder Aufräumen/Refactorn des Codes wird gerne mal aufgeschoben. Plötzlich ist dann das Projektende erreicht, und die für die aufgeschobene Arbeit nicht mehr genug Zeit übrig, um z.B. wirklich gründlich zu testen. Entweder bekommt der Kunde dann schlecht getestete Software, es werden schon halb implementiere Features wieder gestrichen oder der Zeitplan muss verlängert werden.

Da man bei Scrum aber schon am Ende eines Sprints einen quasi fertigen Stand der Software erreicht, ist das Risiko dass es zu solchen Problemen kommt viel geringer. Außerdem erhält man schon sehr früh Software, die zumindest schon einen Teil der geplanten Anforderungen umsetzt und damit auch schon eingesetzt werden könnte.

In unserem Testprojekt dauert ein Sprint genau zwei Wochen. Das Ergebnis des 1. Sprints wird inzwischen von uns schon “richtig” genutzt, um unsere Arbeitszeiten zu protokollieren. Die Qualität unserer Software erscheint mir – insbesondere für so ein neues Team – schon sehr hoch. Wir haben viele Unit Tests mit annehmbarer Code Coverage, der Code ist fast zu 100% kommentiert, und die Software macht einen “runden” Eindruck.

Das war jetzt eigentlich schon zuviel für einen einzelnen Blogeintrag ;-). Auch wenn ich noch lange nicht alles zu Scrum geschrieben habe was ich gerne dazu schreiben würde höre ich deshalb für heute damit auf – mehr dazu dann hoffentlich später.

Wie sind eure Erfahrungen mit Scrum? Habt ihr es schon eingesetzt? Was für Methoden/Vorgehensweisen setzt ihr ansonsten in euren Projekten ein?

Technorati Tags:

artiso WorkItem Manager in Version 1.2 erschienen

21.08.2008 19:19:53 | Lars Keller

Seit kurzem gibt es die neue Version 1.2 des artiso WorkItem Managers für VS Team System zum Download. Grund genug für mich, einmal einen kleinen Erfahrungsbericht zum WorkItem Manager zu schreiben.

Bevor ich nun ein Loblied anstimme und die vielen coolen Features aufzähle, allem voran das hierarchische und leichte Anordnen von Work Items, verweise ich lieber auf den Post von Alexander Zeitler, der den WorkItem Manager ausführlich vorgestellt hat. Der geübte Leser merkt es sofort, ich bin wirklich sehr begeistert von dem Tool! :-)

Ich habe den WorkItem Manager in zwei größeren Projekten verwendet und kann sagen, dass die Projekte effizienter waren als vorher - einfach nur, weil alle Beteiligten einen schnelleren Überblick gewinnen konnten. Allein das zum Kunden fahren und dort die Anforderungen aufnehmen, diese dann per Knopfdruck in Team System importieren und dann hierarchisch anordnen, ist schon eine sehr zeitsparende Angelegenheit. Danach noch schnell und einfach die Abhängigkeiten der einzelnen Arbeitsschritte/-pakete erkennen und diese zu einer logischen Abfolge zusammen "klicken" und fertig ist die Planung. ;-) Naja, soo einfach ist es natürlich nicht ganz, aber es fühlt sich fast so an!

wim

Die nächste Arbeitserleichterung ist das automatische Generieren des Pflichtenhefts. Wie Thomas in seinem Vortrag gezeigt hat, kann man das alles so "customizien", dass am Ende ein fertiges Angebot herauskommt.

Zum Schluss noch ein paar Infos zu den Neuerungen in der Version 1.2:

  • Mehrfachverknüpfung (Abbildung von Work Items in mehreren Hierarchien der Baumstruktur)

    wim1
  • Performanceoptimierungen (bei >5000 Work Item wurde die Performance verbessert, aber ich finde man merkt dies auch schon bei kleineren Projekten)
  • Installation (ClickOnce hat nun ein echtes Zertifikat)

Ende August soll auch schon die Version 1.3 rauskommen. Weitere Informationen zu beiden Versionen findet man hier.

Link:



This weblog is sponsored by netcreate OHG.

artiso WorkItem Manager in Version 1.2 erschienen

21.08.2008 18:19:53 | Lars Keller

Seit kurzem gibt es die neue Version 1.2 des artiso WorkItem Managers für VS Team System zum Download. Grund genug für mich, einmal einen kleinen Erfahrungsbericht zum WorkItem Manager zu schreiben.

Bevor ich nun ein Loblied anstimme und die vielen coolen Features aufzähle, allem voran das hierarchische und leichte Anordnen von Work Items, verweise ich lieber auf den Post von Alexander Zeitler, der den WorkItem Manager ausführlich vorgestellt hat. Der geübte Leser merkt es sofort, ich bin wirklich sehr begeistert von dem Tool! :-)

Ich habe den WorkItem Manager in zwei größeren Projekten verwendet und kann sagen, dass die Projekte effizienter waren als vorher - einfach nur, weil alle Beteiligten einen schnelleren Überblick gewinnen konnten. Allein das zum Kunden fahren und dort die Anforderungen aufnehmen, diese dann per Knopfdruck in Team System importieren und dann hierarchisch anordnen, ist schon eine sehr zeitsparende Angelegenheit. Danach noch schnell und einfach die Abhängigkeiten der einzelnen Arbeitsschritte/-pakete erkennen und diese zu einer logischen Abfolge zusammen "klicken" und fertig ist die Planung. ;-) Naja, soo einfach ist es natürlich nicht ganz, aber es fühlt sich fast so an!

wim

Die nächste Arbeitserleichterung ist das automatische Generieren des Pflichtenhefts. Wie Thomas in seinem Vortrag gezeigt hat, kann man das alles so "customizien", dass am Ende ein fertiges Angebot herauskommt.

Zum Schluss noch ein paar Infos zu den Neuerungen in der Version 1.2:

  • Mehrfachverknüpfung (Abbildung von Work Items in mehreren Hierarchien der Baumstruktur)

    wim1
  • Performanceoptimierungen (bei >5000 Work Item wurde die Performance verbessert, aber ich finde man merkt dies auch schon bei kleineren Projekten)
  • Installation (ClickOnce hat nun ein echtes Zertifikat)

Ende August soll auch schon die Version 1.3 rauskommen. Weitere Informationen zu beiden Versionen findet man hier.

Link:

Channel 9: Silverlight 2 Codeclip - Templating

21.08.2008 12:13:10 | Oliver Scheer

Mit Styling kann man das Aussehen von Controls relativ einfach anpassen. Jedes Control hat eine Vielzahl von Eigenschaften über die man die Erscheinung verändern etwas verändern kann.
Möchte man allerdings ein grundlegendes anderes Äußeres für sein Control haben, das auch aus anderen Elementen zusammengesetzt ist und so von den Standardcontrols nicht vorgesehen ist, dann kommt man am Templating nicht vorbei.
Dieses Video zeigt, wie man seinen Controls ein vollständig frei definierbares Äußeres geben.


Silverlight 2 Codeclip: Templating

artiso WorkItem Manager in Version 1.2 erschienen

21.08.2008 09:19:05 | Lars Keller

Seit kurzem gibt es die neue Version 1.2 des artiso WorkItem Managers für VS Team System zum Download. Grund genug für mich, einmal einen kleinen Erfahrungsbericht zum WorkItem Manager zu schreiben.

Bevor ich nun ein Loblied anstimme und die vielen coolen Features aufzähle, allem voran das hierarchische und leichte Anordnen von Work Items, verweise ich lieber auf den Post von Alexander Zeitler, der den WorkItem Manager ausführlich vorgestellt hat. Der geübte Leser merkt es sofort, ich bin wirklich sehr begeistert von dem Tool! :-)

Ich habe den WorkItem Manager in zwei größeren Projekten verwendet und kann sagen, dass die Projekte effizienter waren als vorher - einfach nur, weil alle Beteiligten einen schnelleren Überblick gewinnen konnten. Allein das zum Kunden fahren und dort die Anforderungen aufnehmen, diese dann per Knopfdruck in Team System importieren und dann hierarchisch anordnen, ist schon eine sehr zeitsparende Angelegenheit. Danach noch schnell und einfach die Abhängigkeiten der einzelnen Arbeitsschritte/-pakete erkennen und diese zu einer logischen Abfolge zusammen "klicken" und fertig ist die Planung. ;-) Naja, soo einfach ist es natürlich nicht ganz, aber es fühlt sich fast so an!

wim

Die nächste Arbeitserleichterung ist das automatische Generieren des Pflichtenhefts. Wie Thomas in seinem Vortrag gezeigt hat, kann man das alles so "customizien", dass am Ende ein fertiges Angebot herauskommt.

Zum Schluss noch ein paar Infos zu den Neuerungen in der Version 1.2:

  • Mehrfachverknüpfung (Abbildung von Work Items in mehreren Hierarchien der Baumstruktur)

    wim1
  • Performanceoptimierungen (bei >5000 Work Item wurde die Performance verbessert, aber ich finde man merkt dies auch schon bei kleineren Projekten)
  • Installation (ClickOnce hat nun ein echtes Zertifikat)

Ende August soll auch schon die Version 1.3 rauskommen. Weitere Informationen zu beiden Versionen findet man hier.

Link:

Photosynth für alle

21.08.2008 09:09:16 | Robert Mühsig

Microsoft hat seine “Photosynth” Software nun für die Webwelt geöffnet- die tollen Effekte die man hier bereits sehen konnte, kann man nun, wenn man möchte, auch mit eigenen Bildern bewerkstelligen:

image

image

Ausprobieren lässt sich das ganze unter dieser Adresse (Active X Plugin vorausgesetzt).

ShareThis

Foto Spaß mit Photosynth!

21.08.2008 08:26:00 | Lori Grosland

PhotosynthScreenshot1 Heute Morgen ist die neue Version von Photosynth gelauncht worden. Photosynth ist einer fantastischen neuen Art, Fotos in einem 3D-Umfeld auszutauschen und zu erleben. Die Webseite findet Ihr unter: http://photosynth.com

Photosynth ist eine kostenlose Service von Microsoft Live Labs. Photosynth nimmt eine Kollektion von Fotos von einem Objekt oder Ort und analysiert jedes Foto auf Ähnlichkeiten mit den anderen. Die Applikation dann ermittelt, wo das Bild aufgenommen wurde und baut eine 3D-Model raus. Die Fotos werden im richtigen Platz auf der 3D-Model platziert und Du hast die Möglichkeit durch das 3D-Model zu bewegen. Es ist ein echt cooles Erlebnis!PhotosynthScreenshot2

Mit dieser neuen Version von Photosynth hat man jetzt die Chance selbst Synths zu erstellen. Das Photosynth-Tool um Synths zu erstellen ist einfach zu bedienen aber um ein gutes Synth zu bauen braucht man viele Fotos und ein bisschen Übung. Ich benutze Photosynth seit ein paar Wochen und ich muss sagen, dass auch die Übung mit Photosynth Spaß macht. In den nächsten Tagen werde ich ein Video veröffentlichen, wie man gute Synths erstellt.  

Ich habe inzwischen viele Synths gebaut aber meine Lieblings-Synths sind von Angkor Wat und Marienplatz. Vor ein paar Wochen war ich im Urlaub im Kambodscha und ich habe viele Fotos von Angkor Wat gemacht. Vor ein paar Tage habe ich ein sehr schönes Synth von Marienplatz im München erstellt. Um die Synths anzuschauen, klicke auf der Link unten und installiere das Photosynth-Plugin. Photosynth funktioniert momentan nur auf Windows aber eine Mac Version sollte bald verfügbar sein. Als Browser sollte Ihr Internet Explorer 7, FireFox 2, oder FireFox 3 haben.

Probiere Photosynth aus! Es macht Spaß!

Angkor Wat:

http://photosynth.net/view.aspx?cid=cb64297b-da37-4b8b-b419-fe9d923775d9&i=0:0:20&z=661.2708268188&g=0&p=0:0&m=false&c=-3.41602:4.92284:0.0802998&d=-0.469951:1.82681:2.02749

Marienplatz:

http://photosynth.net/view.aspx?cid=e39d32d2-d4ff-4670-ad7b-4f068bbc12a3&i=0:0:388&z=682.0243749348001&g=0&p=0:0&m=false&c=-20.6324:17.497:-0.146251&d=-0.553121:1.62791:1.99979

ADO.NET Entity Framework - Erstellen eines Entity Data Models mit Visual Studio 2008 und SQL Server 2008

21.08.2008 01:17:00 | Ozgur Aytekin

Dieser Beitrag beschreibt mit einer Step-by-Step Einleitung die Erstellung eines Entity Models mit Visual Studio 2008 und SQL Server 2008.

Für das folgende Beispielprojekt wird Visual Studio 2008 mit SP1 (Service Pack 1) und SQL Server 2008 mit Adventure Works-Datenbank benötigt.

Schritt 1: Als Erstes erstellen wir ein neues Projekt:

Im Visual Studio 2008 - File - New - Project auswählen. Als Projekttyp wählen wir Console Application. Projektname-Projectname EntityFrameworkSample0010 definieren.

image

Schritt 2: Als Nächstes benötigen wir ein Entity Model-File. Project - Add New Item auswählen.

image

Schritt 2a: Und anschliessend ADO.NET Entity Data Model auswählen und AdventureWorks.edmx als Filename eingeben. Es ist üblich, dass der Datenbankname als Entity Data Model-Name verwendet wird.

image

Schritt 2c: Nach dem wir Add-Button geklickt haben, wir der Entity Data Model Wizard. In diesem Wizard können wir auswählen, ob wir aus einer bestehenden Datenbank unser Entity Data Model erstellen möchten (Generate from database) oder ob wir ein leeres Entity Data Model-File benötigen (Empty Model).

Für unser Beispiel selektieren wir Generate from database und dann mit Next-Button weitermachen.

image

Schritt 2d: Damit der Wizard die Metadaten-Meta Data für unser Entity Data Model aus der Datenbank lesen kann, benötigen wir eine Datenbankverbindung-Database Connection. In der Auswahlliste werden die Datenbankverbindungen angezeigt, die im Server Explorer-Fenster auch aufgelistet werden.

Für eine neue Datenbankverbindung New Connection-Button klicken oder die Datenbankverbindung für AdventureWorks-Datenbank auswählen.

image

Schritt 2e: Wenn wir mit New Connection weitermachen, dann erscheint ein Dialog (Choose Data Source), in dem wir den Data Provider auswählen können.

image

Schritt 2f: In diesem Dialog benötigen wir die Angaben zum SQL Server und Datenbank.

Als Server name müssen wir den Instanznamen-Instance name unseren SQL Server 2008 angeben. Zusätzlich müssen wir definieren, ob wir Windows Authentication oder SQL Server Authentication für die Anmeldung an SQL Server verwenden möchten. Nach dem wir Instanznamen und Authentication-Angaben definiert haben, können wir die Datenbank auswählen.

image

Schritt 2g: Nach dem wir die Informationen über unser Datenbankserver und Datenbank definiert haben, werden die Angaben nochmals im folgenden Dialog angezeigt.

Im Feld Entity connection string sehen wir die Entity Data Model Spezifisches Information, die ich in einem späteren Blog-Eintrag im Detail erklären werde. In dem unteren Feld sehen wir den Namen des App.Config Eintrages.

image

Als Nächstes müssen wir den Inhalt unseren Entity Data Models definieren.

Schritt 3: In diesem Schritt wählen wir die Datenbanktabelle für unser Entity Data Model aus. Für das aktuelle Beispiel-Projekt benötigen wir nur drei Tabellen (Product, ProductCategory, ProductSubCategory).

image

Anschliessend mit Finish-Button können wir unseren Wizard beenden.

image

Als Resultat erhalten wir unseren Entity Data Model mit drei Entities (ProductCategory > ProductSubCategory > Product).

image

Nach dem wir unseren Entity Data Model erstellt haben, können wir die Daten aus der Datenbank lesen und ausgeben.

Schritt 4: Wir ergänzen den bereits erstellten Console Application-Code wie folgt:

Der folgende Beispielcode listet alle Produkt-Kategorien (Product categories), die Sub-Kategorien (Product sub categories) und die Produkten (Products) auf.

using System;
using System.Linq;

namespace EntityFrameworkSample0010
{
class Program
{
static void Main(string[] args)
{
using (AdventureWorks2008Entities db = new AdventureWorks2008Entities())
{
foreach(ProductCategory pc in db.ProductCategory)
{
Console.WriteLine("ProductCategory: " + pc.Name);

foreach(ProductSubcategory psc in db.ProductSubcategory.Where(p => p.ProductCategory.ProductCategoryID == pc.ProductCategoryID))
{
Console.WriteLine("ProductSubCategory: " + psc.Name);

foreach (Product p in db.Product.Where(pp => pp.ProductSubcategory.ProductSubcategoryID == psc.ProductSubcategoryID))
{
Console.WriteLine("Product: " + p.Name);
}

Console.WriteLine();
}

Console.WriteLine();
}

Console.ReadLine();
}
}
}
}

In der folgende Zeile werden die Sub-Kategorien einer Produkt-Kategorie mit Hilfe der Where-Operators selektiert und ausgegeben.

foreach(ProductSubcategory psc in db.ProductSubcategory.Where(p => p.ProductCategory.ProductCategoryID == pc.ProductCategoryID))
{
Console.WriteLine("ProductSubCategory: " + psc.Name);

...
}


Jetzt können wir unseren Code mit F5 kompilieren. Die Ausgabe sieht wie folgt aus:

image

Für Fragen zu diesem Thema bin ich für Euch über die Kommentar-Funktionalität erreichbar.


Viel Spass...

Behaviour Driven Developement - Woher Informationen sammeln

21.08.2008 00:24:25 | Rainer Schuster

Da ich mich ja nun die letzte Zeit viel mit Tests beschäftige und vor allem mit BDD habe ich mir gedacht, ich kann ma l eine kurze Auflistung der bisherigen Resourcen machen, bei denen ich mich so von Zeit zu Zeit rein lese oder austeste:

 

 

Dazu gesellen sich dann noch diverse Beiträge zu Domain Driven Design (DDD) und Domain Specific Language (DSL), die ich in nächster Zeit mal nachreichen werde.

Gute Nacht.

WPF und die Lesbarkeit von kleinen Schriftgrößen

19.08.2008 15:41:26 | Norbert Eder

In einigen Fällen kann es durchaus vorkommen, dass Texte, welcher in einer kleinen Schriftgröße gehalten sind, nur schwer zu lesen sind.

Damit diese Fälle umgangen werden können ist es wichtig zu wissen, wie das Rendering von Texten funktioniert.

Einen Beitrag zu diesem Thema ist durch den Artikel Text Clarity in WPF gegeben. Darin wird im Detail erklärt, wann der Text wie gerendert wird, wann es zu Problemen kommen kann und wie diese zu umgehen sind.

Sehr empfehlenswert.

Test Automation - Wie teste ich mein GUI?

18.08.2008 22:13:00 | Rainer Schuster

Da ich mir zur Zeit die verschiedenen Testframeworks anschaue, die ganzen Enterprise Patterns so langsam und allmählich nach und nach lerne und Anfang September eine Neuentwicklung ansteht, mache ich mich auch noch rund um das UI-Testing gedanken.

Das Thema ist nicht erst seit gestern aktuell. Schon unter C++ habe ich vor 8 Jahren erste Gehversuche unternommen. Das hatte damals schon recht schön geklappt. Nun habe ich einfach vergangene Woche zwei Hinweise auf Frameworks unter .NET bekommen, denen ich mal nachgegangen bin.

  • NUnitForms
  • WatiN
  • Selenium
  • UI Automation von MS

Alle drei waren mir vom Namen schon bekannt. Mit WatiN habe ich mich auch schon auf Glatteis gewagt. Bis auf ein paar kleine Ausnahmen (PopUps) hatte das ganze schon gut funktioniert. Ich wußte nun aber, dass es weit mehr als nur diese drei Frameworks gibt, das diese Art des Testens schon lange in Mode ist. Auf Wikipedia bin ich über einen Eintrag zur Test Automation gestolpert, der mich unweigerlich zu anderen Frameworks brachte.

Ohne große Worte und Evaluierung, hier der JumpStart für weitere Recherchen:

Einige sind mir wie gesagt bereits bekannt. Wer Informationen, Erfahrungsberichte und Anregungen hat bitte einen Kommentar hinterlassen.

dotnet-gui.com: Es gibt Neuigkeiten

18.08.2008 19:45:03 | Norbert Eder

Auf www.dotnet-gui.com tut sich etwas. Neben den mittlerweile recht bekannten Artikeln gibt es jetzt einen zusätzlichen Bereich.

Gerade kleine Beiträge, kurze Hilfen erfreuen sich großer Beliebtheit. Daher gibt es nun einen eigenen Bereich How To. Darin werden zukünftig verstärkt kleine Codeblöcke, kurze Beschreibungen etc. bereitgestellt, die keine Artikel darstellen, aber schnelle und einfache Lösungen anbieten.

Jeder WPF-Begeisterte ist natürlich herzlichst eingeladen, seinen Beitrag zu tätigen. Zu berücksichtigen ist lediglich, dass dieser Bereich moderiert wird. Dadurch soll ein Mindestmaß an Qualität gewährleistet werden.

PS: Wer auf dotnet-gui.com ein Blog betreiben möchte, der kann dies gerne tun. Du musst dazu kein WPF-Experte sein. Deine Themen sollten sich um grafische Oberflächen rund um .NET drehen, dabei kannst du sowohl aus Entwickler-, Designer-, oder auch Anwendersicht berichten.

Praktikum bei Microsoft für Leute mit Ahnung von Web 2.x, Design & Marketing

18.08.2008 16:57:17 | Oliver Scheer

Das Designer-Marketing-Team bei Microsoft in München sucht ab sofort für sechs Monate oder länger einen Praktikanten (m/w). Potentielle Kandidaten sollten Ahnung von gängigen Trends im Web haben, selbständig, selbstbewusst und kommunikationsfreudig sein und bereits Erfahrungen im Bereich Marketing oder PR haben. Vorkenntnisse im Bereich Webdesign oder zu Expression Studio und Silverlight sind nicht notwendig, aber hilfreich (abgeschlossenes Grundstudium steht zwar in der Beschreibung, ist aber nicht zwingend notwendig).

Wer Microsoft von innen kennen lernen will, sollte jetzt seine Online-Bewerbung ausfüllen: http://www.microsoft.com/germany/careers/positionen/detail.mspx?id=DE204C90-D842-40CF-BB51-50F44FEDF57B

Weitere Infos zum Thema Designer Marketing im Blog von Designer Marketing Manager Steffen Ritter: http://blogs.msdn.com/steffenr

Silverlight schwimmt oben: Drei aufblasbare Silverlight-Sessel zu verschenken

18.08.2008 12:26:00 | Steffen Ritter

Auch RIA-Entwickler und –Designer machen mal Urlaub (habe ich mir jedenfalls sagen lassen); und da ich das „Konzept Urlaub“ voll unterstütze verschenke ich drei schnieke aufblasbare Silverlight-Sessel. Wer einen davon haben will möge mir bitte eine E-Mail schicken und kurz darin begründen warum sie oder er den Sessel haben möchte (Anschrift nicht vergessen). Wie gesagt, es sind nur drei Stück, wer zuerst (überzeugend) schreibt, schwimmt zuerst...

Silverlight schwimmt oben 

Ach ja, die Auswahl ist subjektiv willkürlich und spontan, humorvolle Mails haben bessere Chancen :)

Rechnerkonfiguration

17.08.2008 10:28:47 | Thomas Schissler

Bei der Neuinstallation eines Entwicklungsrechners dauert es immer ewig, bis man sich die ganzen nützlichen Helferlein zusammengesucht hat, die man im Laufe der Zeit zu schätzen gelernt hat. Deshalb habe ich mir gedacht, ich schreibe mir mal eine Liste, die ich dann immer wieder ergänzen kann. Und vielleicht ist für den einen oder anderen da auch noch was interessantes dabei. Also so könnte ein Entwicklungsrechner aussehen:

Betriebsystem / Standardanwendungen:

  • Windows Vista Ultimate
  • Office 2007
  • SQL-Server 2005 Express
  • SQL-Server 2005 Management Studio

Entwicklungsumgebung:

Tools

Stand 30.10.2008
To be continued...

Erster .NET-Snippets.de QuickContest

16.08.2008 16:36:09 | Jan Welker

Auf dotnet-snippets.de gibt es wieder etwas zu gewinnen!

QuickContest

Vom 18. August bis zum 1.September läuft auf dotnet-snippets.de ein QuickContest. Zu gewinnen gibt es  3 Amazon Gutscheine, jeweils in Wert von 20€.

Was ist ein QuickContest?

Ein QuickContest ist ein Snippet Wettbewerb für ungeduldige :-).
Er zeichnet sich durch mehrere Eigenschaften aus:

- kurze Ankündigungszeit
- kurze Laufzeit
- schnelle Auswahl der Gewinner durch ein kleines Team
- schnelle Zustellung der Preise

Beim ersten und zweiten Wettbewerb habe ich mehrere Rückmeldungen bekommen, dass der Wettbewerbszeitraum zu lang war und das die Jury zu lange gebraucht hat, um die Gewinner zu ermitteln.
Ich bin gespannt, wie das neue  Konzept bei der Community ankommt. Über Feedback würde ich mich sehr freuen.

Microsoft Silverlight Tools Beta 2 fuer Visual Studio 2008

16.08.2008 00:25:29 | Kay Giza

Das Add-On für Visual Studio 2008 für die Entwicklung von Anwendungen für Silverlight 2 Beta 2 steht nun aktualisiert zur Verfügung.
Silverlight Tools Beta 2 wurde aktualisiert, um Visual Studio 2008 und Visual Studio 2008 SP1 zu unterstützen. Visual Studio 2008 SP Beta wird nicht mehr unterstützt. Es ist wichtig, dass Sie vor der Installation von Silverlight Tools Beta 2 zuerst KB949325 manuell deinstallieren (KB949325 wurde bei der Installation von Silverlight Tools Beta 1 installiert).

Mehr Informationen und Download: Microsoft Silverlight Tools Beta 2 für Visual Studio 2008


This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

Hinweis: MSDN Webcasts und CodeClips – RSS-Feed fuer Ihre kostenlose Fortbildung

15.08.2008 23:06:41 | Kay Giza

E-Mails aus BizTalk-Server dynamisch versenden, Daten aus Dynamics CRM auslesen, Nachrichtenschemata mit BizTalk Editor bearbeiten, den SharePoint Services Adapter Send-Windows einsetzen - dies stellt nur eine kleine Auswahl der aktuellsten Themen für Enterprise-Entwickler in den MSDN Webcasts und MSDN Solve CodeClips dar. Nicht minder finden auch Profis, Fortgeschrittene und sogar Einsteiger in den kostenlos angebotenen audiovisuellen Kursen Hilfe, Unterstützung und die Fortbildung, die sie regelmäßig mit kleinem Aufwand und auf der Höhe der Zeit hält. Der folgende Link verweist auf den RSS-Feed, den Sie in Outlook 2007 oder andere Feedreader eintragen können, um künftig keine der kostenlosen Fortbildungsangebote zu verpassen.

RSS-Feed:
MSDN Webcasts & CodeClips – RSS-Feed für Ihre kostenlose Fortbildung



This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Kostenfreie MSDN Service-Hotline für Entwickler
Daily News on MSDN:   MSDN Aktuell
© Copyright 2006-2008 Kay Giza. All rights reserved. Legal

EMIC - Information Overload and Crisis of Choice

15.08.2008 15:18:00 | Lori Grosland

We are drowning in a sea of information overload.  Every day, television channels, email, books and music assault our senses with far too much content.  The volume of content on the internet and generated by applications is literally exploding.  Not only traditional media but millions of individual users are putting their own content on the web.  The massive popularity of YouTube is just one example of this phenomenon.  In this flood, how do you distinguish between content that matters to you from all the rest?  How can you easily discover information, multimedia content and entertainment that matches your interests or preferences?  How do you deal with this crisis of choice?

Well, Software Engineers at the European Microsoft Innovation Center (EMIC) are working on a project that allows for the quick creation of prototype solutions that help people solve this crisis of choice.

In this video, Ron Mevissen, Lead Developer of the EMIC Home team, gives an introduction to the topic of information overload and the project that he and colleagues are working on.  He also demonstrates the Media Center recommender prototype that helps you find interesting TV programs.  After that, Stefan Hirtbach shows a recommender for Outlook that helps you decide the importance of email - which email should I read now, which one can wait.  Rich Hanbidge shows a recommender for Xbox Live that helps you find interesting items such as downloadable videos, games, etc. offered by Xbox Live.  Rene Hülswitt demos the Virtual Earth recommender that helps find interesting POI (points of interests) such as restaurants or tourist attractions near you.

The EMIC in Aachen, Germany was founded in 2003 and is a Microsoft Research & Development facility.  The German lab is unique to Microsoft in its focus on collaborative applied research in Europe.  EMIC works in the context of development programs sponsored by the European Commission and the German Ministry of Education and Research (BMBF). Its research is focused on enterprise, mobility, home, security, software verification and embedded systems.

For more information on EMIC research, projects and partners, visit:
http://www.microsoft.com/EMIC

To find out more about projects at EMIC, check out these videos over on Channel 9…
EMIC - Specialized Workflow Foundation Activity
http://channel9.msdn.com/posts/Lori/EMIC-Specialized-Workflow-Foundation-Activity/
EMIC - Delegation Framework
http://channel9.msdn.com/posts/Lori/EMIC-Delegation-Framework/

Hello World WebPart mit Visual Studio 2005

15.08.2008 13:56:00 | Ozgur Aytekin

Dieser Beitrag beschreibt mit einer Step-by-Step Anleitung die Entwicklung eines "Hello World WebParts" mit Visual Studio 2005 und Visual Studio 2005 extensions for Windows SharePoint Services 3.0 Version 1.1.

Für das folgende Beispielprojekt benötigt ihr eine Windows SharePoint Services 3.0 (WSS 3.0) oder Office SharePoint Server 2007 (MOSS 2007) Installation mit Visual Studio 2005 mit Visual Studio 2005 extensions for Windows SharePoint Services 3.0.

Schritt 1: File - New - Project auswählen

image

Schritt 2: Visual C# - Web Part Template auswählen und HelloWorldWebPart als Projektname-Projectname definieren. Anschliessend OK-Button klicken.

image

Im Visual Studio 2005 wird folgender Code automatisch erstellt.

image

Schritt 3: In diesem Schritt erweitern wir den Code. Im Render-Ereignis wird der Text "Hello World WebPart" mithilfe der Write-Methode ausgegeben. Und im OnPreRender-Ereignis definieren wir den Title-Eigenschaft-Property unseren WebParts.

image

using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace HelloWorldWebPart
{
[Guid("9aadb963-b0b0-4c99-8b93-d32b8dbbf717")]
public class HelloWorldWebPart : System.Web.UI.WebControls.WebParts.WebPart
{
public HelloWorldWebPart()
{
this.ExportMode = WebPartExportMode.All;
}

protected override void Render(HtmlTextWriter writer)
{
// TODO: add custom rendering code here.
writer.Write("Hello World WebPart");
}

protected override void OnPreRender(EventArgs e)
{
this.Title = "Hello World";
}
}
}



Schritt 4: Im nächsten Schritt werden wir die Projekt-Eigenschaften ändern. Project - HelloWorldWebPart Properties auswählen.



image



Schritt 5: Wenn wir unseren WebPart direkt vom Visual Studio aus verteilen möchten, dann müssen wir angeben, wie unser Server heisst, auf dem wir unser WebPart verteilen möchten. In meinem Beispiel hat mein SharePoint Server 2007 den Namen SRV-031.



image



Schritt 6: In diesem Schritt werden wir unseren HelloWorldWebPart kompilieren. Build - Build HelloWorldWebPart auswählen.



image



Schritt 7a: Nach einer fehlerfreien Kompilierung können wir jetzt unseren WebPart verteilen. Build - Deploy HelloWorldWebPart auswählen.



image



Schritt 7b: Die Fehlermeldung-Error Message No SharePoint Site exists at the speicifed URL.



Dieser Meldung haben wir erhalten, weil wir im Projekt-Eigenschaften-Dialog - Project Properties Dialog nur den Servernamen definiert aber keine SiteCollection angegeben haben.



image



Schritt 7c: Nochmals den Projekt-Eigenschaft - Project Properties Dialog aufrufen und die URL mit SiteCollection ergänzen. In meinem Beispiel heisst meiner SiteCollection SiteCol001.



image



Jetzt können wir nochmals versuchen, unseren WebPart zu verteilen.Build - Deploy HelloWorldWebPart auswählen.



Schritt 7d: Wenn der angemeldeter Benutzer nicht genügend Recte auf dieser SiteCollection besitzt, dann kann der WebPart nicht verteilt werden. Visual Studio meldet sich dann mit der Meldung Attempted to perform an unauthorized operation.



image



Schritt 7e: SiteColleciton aufrufen und dann Site Actions - Site Settings aufrufen.



image



Unter Users and Permissions - Site Collection administrators können wir unseren User als Site Collection Adminisitrator hinzufügen.



image



Ihr Login eintragen und mit OK bestätigen.



image



Schritt 7f: Build - Deploy HelloWorldWebPart auswählen. Wenn ihr unten die Meldung Deploy succeeded sieht, dann bedeutet dies, dass die Verteilung erfolgreich war.



image



Schritt 8: Als nächstes können wir kontrollieren, ob unser HelloWorldWebPart in unser SiteCollection zur Verfügung steht. Nochmals SiteCollection aufrufen und dann Site Actions - Site Settings. Anschliessend Galleries - Web Parts auswählen.



image



In der Liste finden wir unseren HelloWorldWebPart. Jetzt können wir unseren neuen WebPart verwenden.



image



Schritt 9: Nochmals SiteCollection öffnen und diesmal unter Site Actions - Edit Page auswählen. Mit Edit Page können wir die Seite umgestaltet und auch neuen WebPart hinzufügen.



image



Anschlissend wird der Ansicht wie folgt aussehen:



image



Hier Add a WebPart klicken und unseren WebPart HelloWorldWebPart auswählen. Anschliessend den Add-Button klicken.



image



Unseren WebPart konnten wir so auf unser Seite platzieren. Der Titel Hello World und Text Hello World WebPart werden angezeigt.



image



Viel Spass...

European Microsoft Innovation Center

15.08.2008 09:38:00 | Lori Grosland

Back in June I went to Aachen, Germany to visit the European Microsoft Innovation Center (EMIC).  While I was there, I had the chance to speak with some of the Microsoft scientists and engineers working in Aachen and find out more about what kind of projects and research they are doing.  In this video, I chat with John Lefor, Director of EMIC.  He fills me in on the Innovation Center and where it fits into the scheme of things at Microsoft.

EMIC was founded in 2003 and is a Microsoft Research & Development facility.  The German lab is unique to Microsoft in its focus on collaborative applied research in Europe.  EMIC works in the context of development programs sponsored by the European Commission and the German Ministry of Education and Research (BMBF). Its research is focused on enterprise, mobility, home, security, software verification and embedded systems.

For more information on EMIC research, projects and partners, visit:
http://www.microsoft.com/EMIC

Wie kann ich den Dateipfad eines laufenden Prozess ermitteln?

14.08.2008 17:00:10 | Klaus Bock

Win32-APIManchmal benötigt man die Information wo denn die Datei eines bestimmten Prozess liegt. Das .NET Framework bietet zwar einiges an Möglichkeiten mit Prozessen umzugehen, jedoch keine um den Pfad der Datei eines bestimmten Prozess zu ermitteln. Zumindest ist mir keine bekannt. Bevor jetzt begonnen wird auf gut Glück die Verzeichnisse der Laufwerke zu durchsuchen oder etwa in der Windows Registrierung gestöbert wird, lohnt sich ein Blick in die Win32-API. Gerade was die Prozess-Verwaltung angeht, wird hier viel geboten. Mit der Funktion GetProcessImageFileName bietet die Win32-API genau das was benötigt wird. Diese Funktion gibt den Namen mitsamt komplettem Pfad eines bestimmten Prozess zurück. Der Aufruf der Funktion aus der psapi.dll (Process Status API) ist nicht weiter tragisch. Lediglich im DllImportAttribute muss das Feld CharSet mit dem Wert Unicode der CharSet-Enumerationbelegt werden, da sonst evtl. nur Zeichen-Salat zurückgegeben wird.

Wie zu sehen ist, benötigt der erste Parameter ein Prozess-Handle um den Pfad ermitteln zu können. Um das Handle eines bestimmten Prozess zu erhalten, wird die Funktion OpenProcess verwendet.

Diese Funktion erwartet als letzten Parameter eine ProzessID. Der erste Parameter dwDesiredAccess ist ein Wert der ein Prozess spezifisches Zugriffsrecht darstellt. Für meinen Anwendungsfall reicht hier das Recht PROCESS_QUERY_INFORMATION vollkommen aus, da nur der Pfad ermittelt werden soll. Wer mehr darüber erfahren will, kann sich diesen Artikel über Prozess-Sicherheit und Zugriffsrechte durchlesen.

Da geöffnete Handle so bald als möglich wieder geschlossen werden sollten, ist anzuraten auch gleich die Funktion CloseHandle zu implementieren.

Der von der Funktion GetProcessImageFileName zurückgegebene Pfad erscheint allerdings nicht ganz in dem Format in dem wir es gewohnt sind. Windows verwendet intern keine Laufwerksbuchstaben, sondern die Gerätekennung eines Laufwerks. Für uns Anwender werden diesen Gerätekennungen dann Buchstaben zugewiesen, welche wir als Laufwerksbuchstaben kennen. Der Rückgabewert von GetProcessImageFileName für die Datei test.exe könnte also in etwa so aussehen:

 \Device\Harddisk0\Partition1\Program Files\test.exe

Jetzt muss noch ein Weg gefunden werden, diesen Gerätepfad in einen Laufwerkspfad zu übersetzen. Die einzige mir bekannte Funktion der Win32-API die ähnliches bietet, ist die Funktion QueryDosDevice. Beim Import der Funktion muss unbedingt darauf geachtet werden, welche Funktion implementiert wird, da die gleiche Funktion einmal für Ansi und einmal für den Unicode-Zeichensatz vorhanden ist. Ich verwende in C# wenn möglich immer Implementierungen die mit dem Ansi-Zeichensatz arbeiten. Das Unterscheidungsmerkmal der beiden Funktionen ist das A für Ansi und W für den Unicode-Zeichensatz am Ende des Funktionsnamen.

Mit ihr kann zwar nicht direkt der Laufwerksbuchstabe eines Gerätes abgefragt werden, jedoch kann über die Angabe eines Laufwerksbuchstaben der Namen des zugrundeliegenden Gerätes ermittelt werden. Das ist der Ansatz den ich verwendet habe. Im folgenden Screenshot des Überwachen Fensters einer Debugsitzung ist das Auflösen eines Gerätepfad in einen Laufwerkspfad sehr schön zu sehen:

ProcessPath 

Damit der ganze Artikel nicht zu theoretisch bleibt, möchte ich zum Schluss noch eine real verwendete Methode zeigen, die auf der beschriebenen Implementierung basiert. Als Basis zum verwenden von Laufwerksbuchstaben habe ich ein Zeichenfolgen-Array mit dem Alphabet verwendet. Vielleicht gibt es dafür ja einen besseren oder eleganteren Weg. Hier nun die Methode, von der auch der obige Screenshot stammt.

Wie bereits im Kommentar der Methode beschrieben, können mit dieser Methode nicht die Pfade zu Prozessen ermittelt werden die als Dienst gestartet wurden.

Technorati-Tags: | | |

Gespräch mit Stephan Fasshauer - Office Tipps & Highlights

14.08.2008 11:18:00 | Lori Grosland

Neulich habe ich mit Stephan Fasshauer (Marketing Manager bei Microsoft Deutschland) über Office, Office Live und Office Online gesprochen.  Er hat mir die Unterschiede zwischen die verschiedenen Produkte erklärt und mir ein paar Tipps zu den Office Produkte gegeben. Stephan hat mir auch sein Lieblingsfeature (SmartArt) und ein Schnellstartleiste Add-in für Office 2007 gezeigt.  Dieses Add-in erweitert die Multifunktionsleiste (Ribbon) mit einem neuen Menüpunkt, das ermöglicht man schnell auf wichtige Hilfe und Anleitungen, Tipps & Tricks Ressourcen zuzugreifen und macht den Einstieg in Office 2007 einfacher.  Auch interessant für Leute, die auf Office 2007 umgestiegen sind, ist ein Tool, um Funktionen in Office 2003 und 2007 zu vergleichen.  Es ist ein interaktives Referenzhandbuch, um Funktionen in der neuen Menüführung zu finden.

 

Weitere Tipps und Information zu Office Produkte findet man auf Stephans Blog:

http://stephan-at-work.spaces.live.com/

 

oder auf diesen weiteren Webseiten:

 

Office Online

http://office.microsoft.com/de-de/default.aspx

Die Office Produkte in der Übersicht

http://office.microsoft.com/de-de/products/FX100487411031.aspx?pid=CL100571081031

Vergleichstabelle der Office Suiten

http://office.microsoft.com/de-de/products/FX101635841031.aspx

Office Live Workspace

http://workspace.officelive.com/

Office Live Small Business

http://smallbusiness.officelive.com/

Schnellstartleiste für Office 2007

http://stephan-at-work.spaces.live.com/blog/cns!102220505F300E88!213.entry

Funktionen vergleichen in Office 2003 und 2007

http://stephan-at-work.spaces.live.com/blog/cns!102220505F300E88!151.entry

VSX - Wo ich mich von Zeit zu Zeit belese

14.08.2008 09:33:04 | Rainer Schuster

Visual Studio erweitern ist mittlerweile mit dem SDK ein leichtes geworden. Der einzige Faktor ist die Zeit, sich das Wissen anzueignen. Gute Quellen gibt es zu genüge. Hier nun zu meinen bisher genannten, neue Links, die ich entdeckt oder so noch nicht erwähnt habe.

Kostenloser Icon-Editor für VS 2008 Anwender

14.08.2008 00:58:04 | Thomas Schissler

Wer eine Visual Studio 2008 Standard Edition oder höher sein Eigen nennt, kann sich jetzt kostenlos einen Icon-Editor herunterladen.

image

Axialis Software - IconWorkshop™ Lite Download

HowToCode "ReadYou": Evolution der Architektur

13.08.2008 23:05:50 | Robert Mühsig

Mein kleines Projekt “ReadYou” kommt in winzigen Schritten vorwärts - allerdings mehr auch nicht. Grund hierfür ist meist, dass wenn man sich in ein Thema mal versucht einzulesen, man sofort auf zwei neue interessante Sachen stößt. So z.B. die Mockinggeschichte um meine UnitTests besser zu gestalten.

Architekturumgestaltung

Meine Grundsätzliche Architektur war so aufgebaut wie in diesem Blogpost beschrieben.

Durch das gute Feedback zu dem 3-Schichten Architektur Blogpost habe ich es nun grob so eingeteilt:

image

Mein Model liegt nun nicht mehr im Data rum, sondern ist theoretisch auf allen Schichten erreichbar und daher in einer eigenen DLL zu finden. Das Model besteht aus einfachen POCOs - die nichts anderes machen außer Daten halten.

Da ich möglichst flexibel bin und auch alles fein säuberlich testen kann, ist jede Schicht aufgeteilt in:

image

Bei Data ist natürlich genau dasselbe vorzufinden: Die Trennung zwischen den Interfaces und der eigentlichen Implementierung die ich vorgenommen habe.

Response & Request bei den Services

Als ich mein Interface für den BookService vorbereitet habe, habe ich überlegt, was ich alles für “Aufrufe” brauche:

    public interface IBookService
    {
        IList<Book> GetBooks();
        IList<Book> GetBooksByAuthor(Author author);
        IList<Book> GetBooksByUser(User user);
        IList<Book> GetBooksByTag(Tag tag);
        IList<Book> GetBooksByCategory(Category cat);
       ....

    }

Allerdings ist das nicht wirklich schön - mein Service hätte äußerst viele Methoden um Bücher ranzuholen. Einmal anhand des Autors, einmal nach Kategorie etc.
Komplexer wären noch Sachen wie: “GetBooksByCategoryAndUser” - heiei… für jeden Fall eine Methode zu schreiben, erscheint mir nicht sinnvoll.

Meine Lösung: Request & Response

Wie ein “WebService” geben meine Services auch Responses zurück und verlangen ein Request Objekt:

image

Diese Objekte habe ich in ReadYou.Service.Model hinterlegt - da sie nur im Service vorkommen, ich allerdings diese Definitionen und die Logik in seperaten DLLs trennen wollte:

image

Dabei leitet der “GetBooksRequest” von “BaseRequest” ab und beim Response genauso.

Durch dieses Objekt kann ich später genau mein “GetBooksRequest” definieren:

    public class GetBooksRequest : BaseRequest
    {
        public Tag Tag { get; set; }
        public Category Category { get; set; }
        public User User { get; set; }
        public Author Author { get; set; }
    }

Jetzt könnte ich mir sowas wie “Gib mir alle Bücher vom Autor XYZ, des Users ABC mit der Kategory “Krimi”" - das erlaubt mir einige Freiheiten und sollte erweiterbar sein, falls mir wieder was neues einfällt.

Wie sieht das im Projekt aus?

image

Alles ist aufgeteilt - dabei fehlen allerdings noch UnitTests für den “Data” Teil und für die WebApp (die hier noch nicht zu sehen ist). Unter “Common” befinden sich nur ein paar Extensions die mir das leben erleichtern :)

Mit dieser Ordnung bin ich gerade recht zufrieden - alles ist soweit getrennt und alles was Logik hat, hat auch ein Interface. Späße wie Dependency Injection und co. steht auch nichts im Wege.
Durch die Response / Request Sache bin ich später recht flexibel - auch wenn es etwas mehr Schreibaufwand ist.

Das wichtigste ist allerdings:

Wie seht ihr das? Ist die Idee mit den Response/Request Objekten vielleicht doch nicht so toll? Gebt einfach euer Feedback ab - den Code (sobald ich noch etwas weiter bin), werde ich auf Codeplex zur Verfügung stellen. Momentan ist diese Version noch nicht hochgeladen.

ShareThis

Weitere Termine für meine kleine User Group Tour

13.08.2008 22:37:19 | Lars Keller

Wie ich schon hier und hier berichtet habe, geht meine kleine User Group Tour weiter! :)

Vortragsthema bei allen drei Terminen ist VSTO (Visual Studio Tools for Office)

Ich freue mich! :)



This weblog is sponsored by netcreate OHG.

Beeindruckend: Photosynth & Unwrap Mosaics

13.08.2008 22:15:55 | Robert Mühsig

Microsoft Research ist Microsofts Forschungsabteilung, welche durch recht “coole” Sache auf sich aufmerksam machen - einige Ideen/Konzepte kann man später auch in richtigen Produkten wiederfinden: Surface oder Deepzoom.

Heute bin ich bei Tim Heuers Blog mal wieder auf Photosynth aufmerksam geworden:

Auch interessant ist das Projekt “Unwrap Mosaics” - Videobearbeitung leicht gemacht :)

ShareThis

19.08.08 Treffen der .NET Developer Group Braunschweig: 2 Vorträge

13.08.2008 22:11:16 | Lars Keller

dotnetbs_banner_150

Die .NET Developer Group Braunschweig trifft sich zu ihrem 23 User Group Treffen am 19.08.08 um 19:00 im Restaurant Kilian's Raffinerie.

Dieses Mal gibt es 2 Vorträge:

Net Webseiten lesen lassen – HTML elegant geparst mit dem Html-Agility-Pack
Referent: Werner Mager
Webservices sind mittlerweile der Standard zur Kommunikation über das Internet für Applikationen. Leider steht nicht immer ein Webservice zur Verfügung, so dass einem nichts anderes übrig bleibt, als aus der eigenen Applikation heraus dynamische Html-Seiten zu lesen. Diese sind jedoch in den seltensten Fällen zur programmatischen Auswertung geeignet. Wohlgeformtes XML ist hier nicht zu finden. Mit der Open Source Bibliothek Html-Agility-Pack wird diese Lücke geschlossen. In dem Vortrag von Werner Mager wird die Bibliothek kurz vorgestellt und in praktischen Beispielen gezeigt, wie Daten von verschiedenen Webseiten (Google.de, dotnet-braunschweig.de …) abgefragt und per XPath-Query verarbeitet werden können. Ergänzend wird ein Hilfstool vorgestellt, mit dem die XPath-Abfragen getestet und visualisiert werden können.


VSTO 3.0 - Was gibt es neues in der Office Entwicklung?
Referent: Lars Keller
Die mit Visual Studio 2008 ausgelieferte VSTO 3.0 Komponente und die frisch erschienenen VSTO Power Tools bringen zahlreiche Neuerungen für die Office Entwicklung mit sich. Ein wichtiges neues Feature in Office 2007 ist die Ribbon UI. Aber wie kann man diese anpassen? Was kann der neue Ribbon-Designer in VS 2008? Kann WPF in Office angewendet werden und wie passt LINQ dazu? Diese und weitere Fragen werden in dem Vortrag von Lars Keller behandelt. Die Theorie wird dabei durch viele kleine Live-Coding Beispiele abgerundet

Weitere Informationen gibt es auf www.dotnet-braunschweig.de

Wie immer ist jeder herzlich willkommen!



This weblog is sponsored by netcreate OHG.

Kann man einen Ribbon Tab beim Öffnen vorselektieren?

13.08.2008 22:11:00 | Lars Keller

Dieses lustige Video "Activating a Custom Tab on the Ribbon When a Document Is Opened" von Harry Miller geht der Frage nach, ob man ein Ribbon Tab selektieren kann, wenn ein Dokument geöffnet wird.

Antwort: Nein, das ist "made by design".

.NET Open Space Konferenz - kommt vorbei! :)

13.08.2008 21:53:09 | Lars Keller

.NET Open Space vom 18.10. bis 19.10.2008 in Leipzig

Der .NET Open Space 2008 läuft vom 17.10.2008 19 Uhr bis 19.10.2008 19 Uhr und besteht derzeit aus den drei parallelen Themenfeldern:

    * ALT.NET
    * Mobile Computing
    * Soft Skills

Welche Inhalte in den einzelnen Themenfeldern bearbeitet werden, bestimmst du vor Ort, denn die Veranstaltung ist Open Space! Die Teilnahme ist kostenlos. Die Teilnehmer gestalten das Programm selbst. Erfahrungsaustausch ist das A und O und steht im Vordergrund. Mehr Informationen und die Registrierung gibt es auf der Webseite.

Ich freue mich sehr auf den Event, weil diese Konferenz ganz im Sinne des Austausches untereinander steht.

Man sieht sich da! :) Es sind noch ein paar Plätze frei!



This weblog is sponsored by netcreate OHG.

Weitere Termine für meine kleine User Group Tour

13.08.2008 21:37:19 | Lars Keller

Wie ich schon hier und hier berichtet habe, geht meine kleine User Group Tour weiter! :)

Vortragsthema bei allen drei Terminen ist VSTO (Visual Studio Tools for Office)

Ich freue mich! :)

19.08.08 Treffen der .NET Developer Group Braunschweig: 2 Vorträge

13.08.2008 21:11:16 | Lars Keller

dotnetbs_banner_150

Die .NET Developer Group Braunschweig trifft sich zu ihrem 23 User Group Treffen am 19.08.08 um 19:00 im Restaurant Kilian's Raffinerie.

Dieses Mal gibt es 2 Vorträge:

Net Webseiten lesen lassen – HTML elegant geparst mit dem Html-Agility-Pack
Referent: Werner Mager
Webservices sind mittlerweile der Standard zur Kommunikation über das Internet für Applikationen. Leider steht nicht immer ein Webservice zur Verfügung, so dass einem nichts anderes übrig bleibt, als aus der eigenen Applikation heraus dynamische Html-Seiten zu lesen. Diese sind jedoch in den seltensten Fällen zur programmatischen Auswertung geeignet. Wohlgeformtes XML ist hier nicht zu finden. Mit der Open Source Bibliothek Html-Agility-Pack wird diese Lücke geschlossen. In dem Vortrag von Werner Mager wird die Bibliothek kurz vorgestellt und in praktischen Beispielen gezeigt, wie Daten von verschiedenen Webseiten (Google.de, dotnet-braunschweig.de …) abgefragt und per XPath-Query verarbeitet werden können. Ergänzend wird ein Hilfstool vorgestellt, mit dem die XPath-Abfragen getestet und visualisiert werden können.


VSTO 3.0 - Was gibt es neues in der Office Entwicklung?
Referent: Lars Keller
Die mit Visual Studio 2008 ausgelieferte VSTO 3.0 Komponente und die frisch erschienenen VSTO Power Tools bringen zahlreiche Neuerungen für die Office Entwicklung mit sich. Ein wichtiges neues Feature in Office 2007 ist die Ribbon UI. Aber wie kann man diese anpassen? Was kann der neue Ribbon-Designer in VS 2008? Kann WPF in Office angewendet werden und wie passt LINQ dazu? Diese und weitere Fragen werden in dem Vortrag von Lars Keller behandelt. Die Theorie wird dabei durch viele kleine Live-Coding Beispiele abgerundet

Weitere Informationen gibt es auf www.dotnet-braunschweig.de

Wie immer ist jeder herzlich willkommen!

.NET Open Space Konferenz - kommt vorbei! :)

13.08.2008 20:53:09 | Lars Keller

.NET Open Space vom 18.10. bis 19.10.2008 in Leipzig

Der .NET Open Space 2008 läuft vom 17.10.2008 19 Uhr bis 19.10.2008 19 Uhr und besteht derzeit aus den drei parallelen Themenfeldern:

    * ALT.NET
    * Mobile Computing
    * Soft Skills

Welche Inhalte in den einzelnen Themenfeldern bearbeitet werden, bestimmst du vor Ort, denn die Veranstaltung ist Open Space! Die Teilnahme ist kostenlos. Die Teilnehmer gestalten das Programm selbst. Erfahrungsaustausch ist das A und O und steht im Vordergrund. Mehr Informationen und die Registrierung gibt es auf der Webseite.

Ich freue mich sehr auf den Event, weil diese Konferenz ganz im Sinne des Austausches untereinander steht.

Man sieht sich da! :) Es sind noch ein paar Plätze frei!

Die TOP .NET Blogger im deutschsprachigen Raum

13.08.2008 19:23:33 | Norbert Eder

Wer jetzt von mir eine Liste der TOP .NET Blogger im deutschsprachigen Raum erwartet, der irrt. Vielmehr habe ich heute meine RSS-Feeds ein wenig auf Vordermann gebracht und bin dabei auf einige Erkenntnisse gestoßen:
  • Die Post-Frequenz der durchwegs bekannten Blogger hat in den letzten Monaten sehr stark abgenommen (außer bei ein paar wenigen).
  • Viele der altbekannten Blogger schreiben überhaupt keine Beiträge mehr.
  • Längere Artikel zu einem Thema sind mittlerweile kaum mehr zu finden. Meist handelt es sich um kurze Beiträge, Links auf tatsächliche Artikel.

Da ich nun wirklich alle Feeds aus meinen Abonnements entfernt habe, die in den letzten Monaten keine Beiträge geliefert haben, blieben derer nicht mehr viele übrig. Das läßt nun einen Schluss zu:

Die Projekte werden mehr, die Familie wird größer und somit werden Prioritäten anders gesetzt - und das ist auch gut so.

Soweit noch nicht wirklich aufregend. Aber jetzt komme ich zu meiner tatsächlichen Frage:

Wo ist der Nachwuchs?

Wer also lesenswerte Blogs im .NET (bevorzugt WPF) Bereich kennt, der möge mir den Link bitte mitteilen, am besten gleich direkt als Kommentar. Vorzugsweise Links zu Newcomern und solche die es werden möchten ;-)

Channel 9: European Microsoft Innovation Center

13.08.2008 17:33:18 | Oliver Scheer

Meine Kollegin Lori war vor einigen Tagen in Aachen und hat unser EMIC (European Microsoft Innovation Center) besucht. Natürlich nicht ohne Kamera :-)

Die Videos die sie dabei produziert hat sind auf Channel 9 zu sehen.

http://channel9.msdn.com/posts/Lori/European-Microsoft-Innovation-Center-in-Aachen-Germany/

http://channel9.msdn.com/posts/Lori/EMIC-Framework-to-Build-Prototype-Solutions-for-Crisis-of-Choice/

http://channel9.msdn.com/posts/Lori/EMIC-Specialized-Workflow-Foundation-Activity/

http://channel9.msdn.com/posts/Lori/EMIC-Delegation-Framework/

Kann man einen Ribbon Tab beim Öffnen vorselektieren?

13.08.2008 13:11:00 | Lars Keller

Dieses lustige Video "Activating a Custom Tab on the Ribbon When a Document Is Opened" von Harry Miller geht der Frage nach, ob man ein Ribbon Tab selektieren kann, wenn ein Dokument geöffnet wird.

Antwort: Nein, das ist "made by design".

Weitere Termine für meine kleine User Group Tour

13.08.2008 12:37:01 | Lars Keller

Wie ich schon hier und hier berichtet habe, geht meine kleine User Group Tour weiter! :)

Vortragsthema bei allen drei Terminen ist VSTO (Visual Studio Tools for Office)

Ich freue mich! :)

19.08.08 Treffen der .NET Developer Group Braunschweig: 2 Vorträge

13.08.2008 12:11:01 | Lars Keller

dotnetbs_banner_150

Die .NET Developer Group Braunschweig trifft sich zu ihrem 23 User Group Treffen am 19.08.08 um 19:00 im Restaurant Kilian's Raffinerie.

Dieses Mal gibt es 2 Vorträge:

Net Webseiten lesen lassen – HTML elegant geparst mit dem Html-Agility-Pack
Referent: Werner Mager
Webservices sind mittlerweile der Standard zur Kommunikation über das Internet für Applikationen. Leider steht nicht immer ein Webservice zur Verfügung, so dass einem nichts anderes übrig bleibt, als aus der eigenen Applikation heraus dynamische Html-Seiten zu lesen. Diese sind jedoch in den seltensten Fällen zur programmatischen Auswertung geeignet. Wohlgeformtes XML ist hier nicht zu finden. Mit der Open Source Bibliothek Html-Agility-Pack wird diese Lücke geschlossen. In dem Vortrag von Werner Mager wird die Bibliothek kurz vorgestellt und in praktischen Beispielen gezeigt, wie Daten von verschiedenen Webseiten (Google.de, dotnet-braunschweig.de …) abgefragt und per XPath-Query verarbeitet werden können. Ergänzend wird ein Hilfstool vorgestellt, mit dem die XPath-Abfragen getestet und visualisiert werden können.


VSTO 3.0 - Was gibt es neues in der Office Entwicklung?
Referent: Lars Keller
Die mit Visual Studio 2008 ausgelieferte VSTO 3.0 Komponente und die frisch erschienenen VSTO Power Tools bringen zahlreiche Neuerungen für die Office Entwicklung mit sich. Ein wichtiges neues Feature in Office 2007 ist die Ribbon UI. Aber wie kann man diese anpassen? Was kann der neue Ribbon-Designer in VS 2008? Kann WPF in Office angewendet werden und wie passt LINQ dazu? Diese und weitere Fragen werden in dem Vortrag von Lars Keller behandelt. Die Theorie wird dabei durch viele kleine Live-Coding Beispiele abgerundet

Weitere Informationen gibt es auf www.dotnet-braunschweig.de

Wie immer ist jeder herzlich willkommen!

.NET Open Space Konferenz - kommt vorbei! :)

13.08.2008 11:53:00 | Lars Keller

.NET Open Space vom 18.10. bis 19.10.2008 in Leipzig

Der .NET Open Space 2008 läuft vom 17.10.2008 19 Uhr bis 19.10.2008 19 Uhr und besteht derzeit aus den drei parallelen Themenfeldern:

    * ALT.NET
    * Mobile Computing
    * Soft Skills

Welche Inhalte in den einzelnen Themenfeldern bearbeitet werden, bestimmst du vor Ort, denn die Veranstaltung ist Open Space! Die Teilnahme ist kostenlos. Die Teilnehmer gestalten das Programm selbst. Erfahrungsaustausch ist das A und O und steht im Vordergrund. Mehr Informationen und die Registrierung gibt es auf der Webseite.

Ich freue mich sehr auf den Event, weil diese Konferenz ganz im Sinne des Austausches untereinander steht.

Man sieht sich da! :) Es sind noch ein paar Plätze frei!

Designing for Accessibility

13.08.2008 09:11:09 | Robert Mühsig

Vor ein paar Tagen habe ich bereits über den Podcast von Scott Hanselman und Saqib Shaikh geschrieben, heute habe ich auf Channel 9 ein Videointerview mit den Beiden (und Dan Fernandez) gefunden:


Saqib Shaikh and Scott Hanselman: Designing for Accessibility

ShareThis

VS 2008 SP1 - ClickOnce Support für Firefox

13.08.2008 08:55:00 | Jürgen Gutsch

John. hat im Forum darauf hingewiesen, dass sich nach der Installation des SP1 für Visual Studio 2008, ein neues Plugin mit dem Namen "Microsoft .NET Framework Assistent" im Firefox befindet. Das Plugin dient der ClickOnce Unterstützung im Firefox, außerdem kann es die Framework-Version an den entsprechenden Webserver senden. Letzteres kann über die Einstellungen deaktiviert werden.

Mehr über die Neuerungen durch das SP1 ist bei Scott Guthrie unter Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta zu lesen.

HowTo: Interfaces/Schnittstellen einsetzen - Gute Gründe für den Einsatz von Schnittstellen

12.08.2008 23:22:35 | Robert Mühsig

In einem HowTo ging es darum, was Interface eigentlich sind und wo man sowas einsetzen könnte. In vielen OOP Büchern wird immer wieder hervorgehoben, warum es so wichtig ist, “auf eine Schnittstelle zu programmieren” und nicht “auf eine konkrete Klasse“. Bis vor kurzem war es mir selber noch nicht ganz klar, wozu dieser Aufriss mit den ganzen Schnittstellen, bis ich mit “Test Driven Development” angefangen habe.

Häufige Argumentation für Interfaces:

Wenn man sich etwas mit den Interfaces beschäftigt, dann kommt man immer wieder zum Datenbankbeispiel. “Stellen wir uns doch mal vor, die Datenquelle wechselt!”

Wie könnte ein Interface an dieser Stelle helfen?

An dieser Stelle können Interface helfen, indem sie wie eine Art “Vertrag” wirken:

interface IDataProvider
{
	List<string> GetData();
}

class OracleDataProvider : IDataProvider
{
	List<string> GetData()
	{
	// Oracle Zeugs
	}
}

class SqlDataProvider : IDataProvider
{
	List<string> GetData()
	{
	//MS Sql Zeugs
	}
}

Clients die diesen Code nutzen möchten brauchen, ähnlich wie beim ersten HowTo um Schnittstellen, nur noch das Interface nutzen:

class ClientCode
{
	public IDataProvider provider;
}

Dadurch kann man theoretisch die Datenbank nun wechseln so oft man möchte - unser ClientCode benötigt keine Änderung.

Allerdings…

ist dieses Beispiel meiner Meinung nach sehr “dürftig”. Zwar kann man es daran sehr gut erklären, aber bei wie vielen Applikationen wird sowas überhaupt mit betrachtet? Bei vielen Projekten steht fest, welche DB genommen werden soll/genommen wird - die Datenbank wird sich sicherlich nicht ändern (und wenn doch, wird dies halt ein riesiger Change Request ;) ).

Was viele nicht betrachten ist, dass durch den Einsatz von Interfaces auch die Testbarkeit einer Applikation steigert.

Beispielanwendung:

image

Unser “Data” gibt Daten an den Service, dieser verarbeitet diese und reicht die weiter (3-Tier). Wie hier zu sehen ist, gibt es nur die konkrete Klasse “PersonService” (unser Service) und “Person” (unser Model) - alles andere sind Schnittstellen:

public class PersonService : IPersonService
    {
        private IAuthenticationService authentication;
        private IPersonDataProvider personProvider;

        public PersonService(IAuthenticationService authSrv, IPersonDataProvider provider)
        {
            authentication = authSrv;
            personProvider = provider;
        }

        public List<Person> GetPersons()
        {
            if (authentication.IsAuthenticated())
            {
                return personProvider.GetPersons();
            }

            return null;
        }

        public void AddPerson(Person p)
        {
            if (authentication.IsAuthenticated())
            {
                personProvider.AddPerson(p);
            }
        }

    }

Unser Service kennt nur die Interface vom AuthenticationServie und vom DataProvider - diese werden im Konstruktor mit übergeben.
Anmerkung: Diese Form der Übergabe von den “Abhängigkeiten” ist dem Feld der “Dependency Injection” zuzuordnen und werde ich in einem anderen HowTo genauer definieren.

Unser Service kann die Daten nur ausgeben, wenn wir authentifiziert sind.

Szenario:

Wenn wir nun ein größeres Projekt angehen und der Authentifizierungsmechanismus nicht so einfach ist und auch Fremdsysteme mit einbezieht, dann wäre es ja nett, wenn man während der Entwicklung eine Art “Fake” aufsetzen kann. Durch die Interface ist es sehr einfach, sowas zu machen:

image

In meinem UnitTest Projekt will ich meinen Service testen - und nur diesen(!). dafür habe ich mit ein “TestPersonDataProvider” erstellt, der “IPersonDataProvider” implementiert und jeweils ein AuthenticationService, welcher mir sagt, dass ich authentifiziert bin, oder nicht.

Mein Testcode:

    [TestClass]
    public class PersonServiceUnitTest
    {
        [TestMethod]
        public void PersonService_ReturnPersons_Work_With_Authentication()
        {
            TestPersonDataProvider provider = new TestPersonDataProvider();
            PersonService srv = new PersonService(new TrueTestAuthenticationService(), provider);
            Assert.AreEqual(provider.InMemoryPersonCollection.Count, srv.GetPersons().Count);
        }

        [TestMethod]
        public void PersonService_Should_Return_Null_Without_Authentication()
        {
            TestPersonDataProvider provider = new TestPersonDataProvider();
            PersonService srv = new PersonService(new FalseTestAuthenticationService(), provider);
            Assert.IsNull(srv.GetPersons());
        }
    }

In meinem Testcode kann ich nun einfach die jeweiligen “Fakes” übergeben - ohne den Clientcode ändern zu müssen.

Fazit:

Durch den Einsatz von Interfaces kann man sehr erweiterbare Systeme machen - ein Beispiel ist z.B. das MVC Framework von Microsoft. Der Nebeneffekt ist natürlich auch, dass man die Datenquelle wechseln kann oder dass man einfache Fakes in den Tests, aber auch im Produktionscode verwenden kann (jedenfalls bevor auf “Release” gedrückt wird ;)).

Schnittstellen erlauben erweiterbare und testbare Software!

[ Download Democode ]

ShareThis

Problem mit .Net Framework 3.5 SP1

12.08.2008 17:38:28 | Thomas Schissler

Über das Erscheinen des .Net Framework 3.5 SP1 haben ja bereits genügen Leute berichtet, da muss ich jetzt nicht noch einen draufsetzen. Wer möchte, kann sich den recht ausführlichen Blog-Beitrag von Dariusz anschauen.

Ich habe natürlich auch sofort das SP installiert. Die letzten 3 Std. habe ich damit zugebrach einen Fehler zu finden. Und was soll ich sagen, das Problem liegt am SP.

Folgende Situation. Ich arbeite an einem Projekt, das intensiv ASP.Net AJAX nutzt. Dort habe ich an verschiedenen Stellen die Übergabe von Daten aus dem CodeBehind an Javascript. Diese löse ich, indem ich im Code behind folgenden Code verwende:

ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
scriptManager.RegisterDataItem(this, "StringToTransfer");

In Javascript kann ich dann auf diese Werte zugreifen:

function EndRequestHandler(sender,
args) { if (sender._dataItems != null)
{ if (sender._dataItems.__Page != null)
{ if (sender._dataItems.__Page == 'StringToTransfer')
{ fnShowSizedPopup('../../Web/Search/CopyProducts.aspx',
500, 400); } } } }

Das hat bisher problemlos funktioniert. Nach der Installation des SP1 war allerdings sender._dataItems immer null. Nachdem ich das SP1 deinstalliert habe, funktioniert es wieder wunderbar. Na ich werde jetzt wohl erst mal ohne SP1 leben und mir bei Gelegenheit mal anschauen, wie ich das Problem umgehe. Oder hat vielleicht jemand eine Idee, woran das liegen könnte?

 

Nachtrag:

Dank Hannes habe ich eine Lösung gefunden. Im obigen Beispiel muss man sender._dataItems mit args.get_dataItems() ersetzen, dann klappt's auch mit dem SP1

Automatische JavaScript Formatierung nach Installation des SP1 für Visual Studio 2008

12.08.2008 16:40:00 | Jürgen Gutsch

Was Microsoft hier so salopp als "Richer JavaScript support" bezeichnet, scheint die annähernd komplette Unterstützung von JavaScript im Visual Studio zu sein. Unter anderem gibt es jetzt eine Automatische Code Formatierung für JavaScript

Durch Zufall bin ich drauf gestoßen, als ich eben ein Semikolon am Ende eines unschön formatierten JavaScript Statements machte. Das Tastenkürzel [Strg][ K] + [Strg][ D] funktioniert ebenfalls um die ganze Datei zu formatieren.

Mehr über die Neuerungen durch das SP1 ist bei Scott Guthrie unter Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta zu lesen.

Visual Studio 2008 Express SP1 Update

12.08.2008 16:12:32 | Klaus Bock

Seit gestern ist es verfügbar und überall ist die Meldung zu lesen: ServicePack1 für Visual Studio 2008 und .NET Framework 3.5 sind veröffentlicht. Unter anderem auch für die Express Edition. Also schnell mal das 877.8 MB große ISO-Image geladen, auf DVD gebrannt und die Installation gestartet. Als erstes habe ich den Visual Web Developer zur Installation ausgewählt, weil der SQL Server 2008 Express mit installiert werden kann. Also den SQL Server 2008 Express als optionale Komponente ausgewählt und die Installation gestartet. Die Aktualisierungen der CLR und des Visual WebDeveloper liefen sauber durch. Anschließend wurden noch die Aktualisierungen von Microsoft-Update geladen und installiert. Dann sollte nach einem Neustart die Installation des SQL Server 2008 Express beginnen. Also einem Neustart zugestimmt. Nach dem Neustart lief auch brav die Installation wieder an. Die Systemprüfung lief durch; und Peng! da war er. Der fette rote Punkt und die lapidare Meldung: SQL Server Installation fehlgeschlagen. Oops! Na gut dachte ich mir, das kann nach der Installation von C# 2008 Express noch genauer unter die Lupe genommen werden. Also Visual C# 2008 Express SP1 zur Installation ausgewählt. Erfreulicherweise war in der Auswahl der zu installierenden Komponenten wieder der SQL Server 2008 Express zu sehen, der ja seit Visual C# 2008 nicht mehr direkt unterstützt wurde. Statt dessen wurde einem der SQL Server Compact mehr oder weniger aufs Auge gedrückt. Also Installation gestartet und abwarten was passiert. Zunächst nichts besonderes. Die Installation der Komponenten lief sauber durch. Als der SQL Server 2008 Express wieder an der Reihe war das selbe Spiel wie vorher. Nur eine lapidare, nichts aussagende Fehlermeldung. Also begann ich die Log's zu durchsuchen. Irgendwo musste ja eine detaillierte, aussagekräftige Fehlerbeschreibung zu finden sein. Und tatsächlich. Im Verzeichnis C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log\VSExpress_9.0\ in der Datei Summary_HP-DV7_VSExpress_9.0.txt, HP-DV7 ist der Hostname meines Computers, wurde ich fündig. Hier die Fehlerbeschreibung:

Overall summary:
  Final result:                  Fehler: Ausführliche Informationen finden Sie unten
  Exit code (Decimal):           -2067922414
  Exit facility code:            1214
  Exit error code:               530
  Exit message:                  Die angegebene Editionsaktualisierung wird nicht unterstützt. Informationen über unterstützte Aktualisierungspfade finden Sie in der Onlinedokumentation in der Aktualisierungsmatrix für SQL Server 2008-Versionen und -Editionen.
  Start time:                    2008-08-12 14:52:49
  End time:                      2008-08-12 14:53:27
  Requested action:              Upgrade

Das soll also heißen: Da mit dem Express Setup nur der SQL Server 2008 Express verfügbar ist und ich die Version SQL Server 2005 Express with Advanced Features installiert habe kann kein Upgrade ausgeführt werden. Kein Problem. Also zu Microsoft auf die Seite des SQL Server Express um die passende Version herunter zu laden. Was lächelt mich da an? Wieder eine nette Meldung:

SQL Server 2008 Express will be available for download at the end of August 2008.

Until then, try the 180-day SQL Server 2008 Enterprise Evaluation.

Was soll man da sagen? Nichts und den SQL Server 2005 Express with advanced Features weiter verwenden.

P.S. Wer Sarkasmus findet, darf ihn behalten.

Technorati-Tags: |

Visual Studio 2008 SP1 / .NET Framework 3.5 SP1 + Training Kits

12.08.2008 08:30:54 | Robert Mühsig

Wie bereits viele andere geschrieben haben, ist nun das Service Pack 1 von Visual Studio und dem .NET Framework 3.5 erhältlich.
Hier gehts zu den Downloads.

Dazu bietet Microsoft noch zwei Training Kits an:

Insbesondere beim dem letzten Training Kit sind viele neue Sachen kurz und recht gut dargestellt um ein Gefühl zu bekommen, was das eigentlich nun ist.

ShareThis

Visual Studio 2008 Service Pack 1 und .NET Framework 3.5 sind da ...

12.08.2008 03:24:18 | Oliver Scheer

Microsoft hat die Service Packs 1 (SP1) von .NET Framework 3.5 und Visual Studio 2008 zur Produktion freigegeben. Sie enthalten zahlreiche neue Funktionen, unter anderem für die Entwicklung von Windows- und Datenbank-Anwendungen auf aktuellen Microsoft-Plattformen. Zusätzlich erleichtern Neuerungen in ASP.NET die Erstellung dynamisch erzeugter Webseiten. Damit lassen sich einfacher branchenspezifische, individuell angepasste Applikationen für Unternehmen aller Branchen und Größen entwickeln. Viele der neuen Funktionen stehen auch für die kostenfreie Alternative 'Visual Studio 2008 Express' bereit. Alle Downloads übersichtlich zusammengefasst finden Sie im MSDN Download-Center. Mehr über die neuen Service Packs erfahren Sie hier.

Internet Explorer 8 - Was Webentwickler beachten sollten.

11.08.2008 22:38:41 | Jan Welker

Laut IEBlog soll noch im August die zweite Beta des Internet Explorers 8 erscheinen. Diese Beta ist öffentlich, das heißt,  jeder kann sich als Betatester bewerben. Bei der Entwicklung der  8. Version stand maximale Konformität mit Webstandards im Vordergrund. Was bedeutet das?
Mit dem IE8 sehen Webseiten teilweise "anders" aus als man es vom Firefox oder dem IE7 kennt. Anders bedeutet in diesem Fall, das Webseiten nicht immer so dargestellt werden, wie es sich der Webdesigner einst vorgestellt hat. Das standardkonforme Verhalten kann sogar so weit führen, dass Webseiten die für ältere Browserversionen optimiert wurden, nicht mehr funktionieren.
Microsoft nimmt also keine Rücksicht darauf, wenn mit dem IE8 in einem Internetshop keine Bestellvorgänge getätigt werden können  oder ob eine Firmenwebseite total verschoben und falsch dargestellt wird.
Ein gutes Beispiel für eine unbrauchbare Webseite, ist die Seite die-opelgalerie.de. Diese Webseite hatte ich vor ungefähr einem Jahr, mit allen, damals gängigen, Browsern erfolgreich  getestet.

die-opelgalerie.de
Diese Seite ist mit dem IE8 nicht zu gebrauchen.

Jeder Webseitenbetreiber bzw.  Webmaster steht in der Verantwortung, seine Seite(n) mit den Beta Versionen des IE8 zu testen und ggf. nachzubessern.
Um seine Webseite mit der Beta 1 zu testen, ist es empfehlenswert das VPC Image von Microsoft herunter zu laden. Das Image beinhaltet ein Windows XP mit IE8 Beta1.

Was kann der Webmaster tun, wenn die Seite nicht ordnungsgemäß angezeigt wird?

Es gibt zwei Möglichkeiten:

1. Webserver konfigurieren
Hat man administrativen Zugriff auf den Webserver, kann man den HTTP Header "X-UA-Compatible: IE=EmulateIE7" für die Webseite hinzufügen. Damit wird sichergestellt, dass der Internet Explorer 8 automatisch umschaltet und die gesamte Seite wie im IE7 richtig darstellt.
Hier sind einige weiterführende Links zum Hinzufügen des HTTP Headers:

Eigene HTTP Response Header im IIS7
Das HTTP Headers Tab im IIS6

Apache Module mod_headers in der Version 2.2
Apache Module mod_headers in der Version 2.0
Apache Module mod_headers in der Version 1.3

2. Metatag hinzufügen
Oft hat man keinen Zugriff auf den Webserver oder möchte nur einzelne Seiten im IE7 Mode rendern lassen. In diesem Fall kann man das Umschalten auf den IE7 Mode durch ein Metatag erzwingen der in den Head-Bereich der Webseite eingebaut wird.
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

Was kann der Anwender tun, wenn er auf Seiten stößt, die im Internet Explorer 8 nicht richtig angezeigt werden?

Im IE8 befindet sich dazu ein Button "Emulate IE7" in der Menüleiste:

EmulateIE7

Sollte eine Webseite für eine ältere Browserversion optimiert worden sein und wird deshalb nicht richtig angezeigt, kann der Anwender die Renderengine mit einem Knopfdruck umstellen.


Wer sich in Sachen IE8 auf dem Laufenden halten möchte sollte den Blog vom IE-Team und von Daniel Melanchton verfolgen.

Microsoft .NET Framework 3.5 Service Pack 1 und Microsoft Visual Studio 2008 Service Pack 1 sind veröffentlicht

11.08.2008 20:00:00 | Ozgur Aytekin

Microsoft hat Service Pack 1 für .NET Framework 3.5 und Service Pack 1 für Visual Studio 2008 veröffentlicht.

Ein kleiner Auszug aus den neuen Features und Verbesserungen in .NET Framework 3.5 Service Pack 1 lassen sich wie folgt auflisten:

  • - ASP.NET Dynamic Data als umfangreiches Framework für die Entwicklung von datengestützten Applikationen ohne Code
  • - ASP.NET AJAX bietet eine Ergänzung für die Verwaltung des Browser Verlaufs (Back-Button unterstützung)
  • - Anwendungsstart wurde verbessert
  • - Leistungsverbesserungen im Bereich Windows Presentation Foundation und das neue WebBrowser Steuerlement
  • - Entity Framework mit Unterstützung der neuen SQL Server 2008-Typen
  • - LINQ to SQL unterstützt die neuen Funktionen in SQL Server 2008 für Datum und Streams
  • - .NET Data Provider für SQL Server 2008 (SqlClient) unterstützt die neuen SQL Server 2008 Funktionen

.NET Framework 3.5 Service Pack 1 findet ihr unter folgende URL:

Microsoft .NET Framework 3.5 Service Pack 1 (English)

Microsoft .NET Framework 3.5 Service Pack 1 (Deutsch)

Visual Studio 2008 Service Pack 1 findet ihr unter folgende URL:

Microsoft Visual Studio 2008 Service Pack 1 (exe) (English)

Microsoft Visual Studio 2008 Service Pack 1 (exe) (Deutsch)

Auf der Downloadseite findet ihr die folgende Meldung unter dem Abschnitt Wichtig:

Wenn Sie bereits einen Visual Studio 2008-Hotfix installiert haben, müssen Sie vor der Installation von Visual Studio 2008 SP1 das Dienstprogramm zur Hotfixentfernung ausführen. Weitere Informationen finden Sie unter Visual Studio 2008 Hotfix Cleanup Utility for Installing Visual Studio 2008 SP1.

Eine detailierte Information über die beiden Service Packs finder ihr unter:

Visual Studio 2008 Service Pack 1 and .NET Framework 3.5 Service Pack 1

Visual Studio 2008 SP1 und das .NET Framework 3.5 SP1 sind erschienen

11.08.2008 19:47:48 | Lars Keller

Wie man im MSDN nachlesen kann, ist das Visual Studio Service Pack 1 und das .NET Framework 3.5 Service Pack 1 erschienen.

Juhu! Endlich weniger Abstürze beim WPF entwickeln ;)

Links:



This weblog is sponsored by netcreate OHG.

Visual Studio 2008 SP1 und das .NET Framework 3.5 SP1 sind erschienen

11.08.2008 18:47:48 | Lars Keller

Wie man im MSDN nachlesen kann, ist das Visual Studio Service Pack 1 und das .NET Framework 3.5 Service Pack 1 erschienen.

Juhu! Endlich weniger Abstürze beim WPF entwickeln ;)

Links:

Sicherheit für Office SharePoint Server 2007 - Security for Office SharePoint Server 2007

11.08.2008 12:21:00 | Ozgur Aytekin

Microsot hat über das Technet-Portal ein Dokument zum Thema Sicherheit für Office SharePoint Server 2007 - Security for Office SharePoint Server 2007 zur Verfügung gestellt.

Die Themen sind wie folgt:

  • Plan site and content security
    • This guide describes the permissions that control access to your sites and the content in your sites. It also discusses security related to implementing Excel Services, search features, and Shared Services Providers (SSPs).
  • Plan for authentication
    • This guide describes the authentication methods that are supported by Office SharePoint Server 2007, discusses the authentication configuration settings that need to be planned for individual Web applications, and includes sample configuration settings for several common forms authentication and Web single sign-on (SSO) authentication providers.
  • Logical architecture design sample
    • This guide describes a secure logical architecture design that incorporates the most common types of sites and the most common classes of users. The design incorporates secure recommendations for authentication, SSPs, Internet Information Services (IIS) application pools, Web applications, zones, and zone policies.
  • Deploying Office SharePoint Server 2007 in a secure manner
    • This guide describes practical secure configurations for specific server roles. The guidance for each server role includes recommended secure settings for the network, the operating system, and the applications that are installed, including IIS, the Microsoft.NET Framework, and Microsoft SQL Server database software.
    • Part 4 also addresses security requirements and recommendations for planning for security roles, for configuring administrative and service accounts, and for implementing SSO for access to external data systems.

Das Word-Dokument findet ihr unter folgende URL: Office SharePoint Server Security oder Downloadable book: Security for Office SharePoint Server 2007

Sicherheit für Windows SharePoint Services 3.0 - Security for Windows SharePoint Services 3.0

11.08.2008 11:10:00 | Ozgur Aytekin

Microsot hat über das Technet-Portal ein Dokument zum Thema Sicherheit für Windows SharePoint Services 3.0 - Security for Windows SharePoint Services 3.0 zur Verfügung gestellt.

Die Themen sind wie folgt:

  • Plan site and content security
    • This guide describes the permissions that control access to your sites and the content in your sites. It also discusses security related to implementing search.
  • Plan for authentication
    • This guide describes the authentication methods that are supported by Windows SharePoint Services 3.0, discusses the authentication configuration settings that need to be planned for individual Web applications, and includes sample configuration settings for several common forms authentication and Web single sign-on (SSO) authentication providers.
  • Deploying Windows SharePoint Services 3.0 in a secure manner
    • This guide describes practical secure configurations for specific server roles. The guidance for each server role includes recommended secure settings for the network, the operating system, and the applications that are installed, including Internet Information Services (IIS), the Microsoft.NET Framework, and Microsoft SQL Server database software. Part 3 also addresses security requirements and recommendations for planning for security roles and for configuring administrative and service accounts.

Das Word-Dokument findet ihr unter folgende URL: Windows SharePoint Services Security oder Downloadable book: Security for Windows SharePoint Services 3.0

Visual Studio 2008 SP1 und das .NET Framework 3.5 SP1 sind erschienen

11.08.2008 09:47:04 | Lars Keller

Wie man im MSDN nachlesen kann, ist das Visual Studio Service Pack 1 und das .NET Framework 3.5 Service Pack 1 erschienen.

Juhu! Endlich weniger Abstürze beim WPF entwickeln ;)

Links:

WPF, NHibernate, ObservableCollection und Patterns

10.08.2008 21:11:16 | Norbert Eder

Im Beitrag ObservableCollection und NHibernate hatte ich einen Link zu einem Artikel gepostet, der zeigt, wie man NHibernate dazu bringt, mit einer ObservableCollection zu arbeiten.

Nun, ein paar Tage später, finde ich die Sache dann doch nicht mehr ganz so toll, gerade wenn Patterns mit ins Spiel kommen (was hoffentlich der Fall ist). Man nehme als Beispiel die bereits von mir vorgestellten Patterns MVC für WPF und Model-View-ViewModel. Diese beiden Patterns unterscheiden sich unter anderem dadurch, dass beim MVC Controller und Model komplett getrennt sind. Beim MVVM ist dies zwar auch der Fall, jedoch stellt das ViewModel sowohl die Controller-Funktionalität zur Verfügung, als auch eine gewrappte Form des Models.

Was bedeutet dies nun konkret?
Bei der Verwendung des MVVM Patterns zusammen mit NHibernate bedarf es keiner speziellen Erweiterung oder Anpassung. Das Model verwendet weder eine ObservableCollection noch wird irgendein für WPF benötigtes Interface implementiert (siehe beispielsweise INotifyPropertyChanged). Damit ist es möglich, NHibernate zu nutzen, wie es auch ausgeliefert wird. Beim MVC-Pattern müsste hier der im verlinkten Artikel angesprochene Handkniff getätigt werden, um in den Genuss der für das Data Binding notwendigen Events zu gelangen.

Was kann daraus abgeleitet werden?
Der – zumindest für mich – wesentliche Punkt ist, dass es sinnvoll wäre, das zu verwenden, was sich bereits vielfach bewährt hat. NHibernate hat sich bereits in sehr vielen Projekten bewährt und man kann sich auf eine korrekte Funktionsweise verlassen. Aus diesem Grund würde ich eher die Finger von einer ObservableCollection-spezifischen Erweiterung lassen (auch wenn es lediglich eine Handvoll Klassen sind) und hier auf das MVVM-Pattern zu setzen, welches eben diese Änderung nicht benötigt.
Damit muss man sich bei einem Update keine Sorgen machen und wer weiß, vielleicht gibt es ja bald eine entsprechende Unterstützung.

Was meint ihr dazu?

Einstieg in NHibernate leicht gemacht

10.08.2008 17:58:44 | Norbert Eder

Hibernate ist mittlerweile kein unbekannter O/R Mapper mehr. Ursprünglich aus der Java-Welt, gibt es bereits seit langer langer Zeit auch eine Portierung für .NET, NHibernate genannt.

Auch bei mir laufen einige meiner Projekte erfolgreich auf NHibernate. Demzufolge bekomme ich immer wieder Anfragen diesbezüglich. Meist geht es darum, wie denn ein erstes Projekt (egal ob Demo-Anwendung oder Real-World-Applikation) gestartet werden kann.

Da NHibernate jetzt nicht unbedingt meinem Hauptfokus entspricht, hatte ich mich immer geweigert, einen kurzen Artikel diesbezüglich zu verfassen. Und wie es auch sein sollte, stieß ich - auf der Suche nach einer guten Einführung - auf folgenden Artikel, den ich NHibernate-Einsteiger nur wärmstens empfehlen kann:

Your first NHibernate based application

Darin wird sehr gut in einfachen Schritten erklärt, wie man eine erste Anwendung basierend auf NHibernate umsetzen kann. Die weiteren Schritte liegen dann wohl darin, sich einen eigenen entkoppelten Layer zu basteln, welcher für weitere Anwendungen eingesetzt werden kann.

SpeedFanConnector überarbeitet

10.08.2008 17:49:10 | Klaus Bock

Die .NET Bibliothek SpeedFanConnector, die ich in diesem Artikel vorgestellt habe, liegt in einer überarbeiteten Version vor. Nachdem Jan Welker aus dem .NET Forum.de so freundlich war mir beim testen zu helfen, stießen wir auf diverse Probleme unter Vista 64. Das ging soweit, dass zum Teil komplett falsche Werte aus dem Shared Memory Segment geliefert wurden. Ein Fehler beim Marshalling konnte weitestgehend ausgeschlossen werden, da andere Werte aus dem Shared Memory Segment bei ein und dem selben Marshalling korrekt sind und am richtigen Index vorliegen. Ob das Problem während des Schreibens des Segments von SpeedFan in den Speicher auftritt oder eine Änderung der Struktur von SpeedFan vorliegt konnte noch nicht geklärt werden. Um hier jetzt eine definitive Aussagen zu treffen, liegen im Moment einfach zu wenige Informationen vor.

Um die Problematik unter 64bit Systemen vom Benutzer fern zu halten, wird jetzt jeder Wert aus dem Shared Memory Segment auf seinen korrekten Größe geprüft und gegebenenfalls korrigiert. Dabei muss ich sagen, dass die fehlerhaften Werte nicht die Messwerte der Sensoren betreffen, sondern meist die Anzahl der vorhandenen Sensoren falsch zurückgegeben wird. Da per Definition der SpeedFan Struktur maximal 32 Werte pro Sensor, also z.B. maximal 32 Ventilatoren-Werte, zurückgegeben werden, darf der Wert aus dem Shared Memory Segment 32 nicht überschreiten. Sollte dies doch der Fall sein, wird der Wert auf 32 begrenzt.

Da wie bereits erwähnt diese Problematik bis jetzt ausschließlich auf 64bit Systemen aufgetreten ist, dürfte die Anzahl der betroffenen Benutzer deutlich kleiner sein als die der nicht betroffenen.

Des weiteren wurde eine neue Überladung des Konstruktors hinzugefügt mit der festgelegt werden kann, dass nur Werte größer 0 (Zero) in den öffentlichen Eigenschaften erscheinen. Kann für jene ganz nützlich sein auf deren Maschinen SpeedFan zwar Sensoren erkennt, diese Sensoren aber keine Werte liefern.

Falls bereits jemand die vorherige Version heruntergeladen hat, sollte er diese durch die aktuelle Version 0.3.5.142 ersetzen.

Da ich nur über begrenzte Ressourcen zum testen verfüge, unter anderem kein 64bit System, bin ich auf Feedback und Kritik angewiesen.

SpeedFanConnector

Technorati-Tags: | | |

Stop Forum Spam Modul für CommunityServer 2007

10.08.2008 12:56:34 | Jan Welker

Seit einigen Wochen gab es im dotnet-forum.de tägliche mehrere Anmeldungen mit merkwürdigen Benutzernamen. Die Emailadressen dieser User endeten mit .ru oder .in.
Rainer hatte mich auf die  Internet Spam Datenbank Stop Forum Spam aufmerksam gemacht, in der solche Spam User gesammelt werden. Darauf hin habe ich mir diese Webseite einmal genauer angesehen. Mir war aufgefallen, dass es dort eine einfache API gab, mit der die Emailadressen kontrolliert werden können. Für einige PHP Foren gab es schon passende Erweiterungen um Spam User zu identifizieren. Thomas Freudenberg und ich, haben kurzerhand eine Erweiterung für den CommunityServer 2007 geschrieben, welche im Abstand von 15 Minuten alle neuangemeldeten User mit Hilfe dieser API kontrolliert.
Wurde ein User als Span User identifiziert, wird er verbannt. Das bedeutet, der User existiert weiterhin im Forum, jedoch kann er sich nicht mehr anmelden und somit keinen Schaden anrichten.
Im Event log des Forums kann man gut beobachten, wann sich der User registriert hat und wann er verbannt wurde:

StopForumSpamEventLog

Wer das Modul im CommunityServer nutzen möchte, kann es sich kostenlos herunterladen. Die Installation ist sehr einfach. Es müssen nur 2 config Dateien editiert und eine DLL kopiert werden. Eine Installationsanleitung ist im Download enthalten.

Download Stop Forum Spam Modul für CommunityServer 2007

Was ist eigentlich dieses ALT.NET?

10.08.2008 02:11:37 | Mathias Raacke

Wer regelmäßig .NET Blogs liest – insbesondere englischsprachige .NET Blogs – wird in letzter Zeit früher oder später auf den Begriff ALT.NET gestossen sein. Mir ist der Begriff jedenfalls in den letzten Monaten immer häufiger begegnet, und irgendwann habe ich dann angefangen, mich näher mit dem Thema zu beschäftigen.

Was ist denn nun ALT.NET? Faul wie ich bin kopiere ich einfach Mal die Erklärung dazu von der deutschen ALT.NET Community altdotnet.de:

Was ist ALT.NET?
Die wichtigste Quelle dazu ist http://www.altnetpedia.com/ (engl.)
Die ALT.NET Bewegung definiert sich wie folgt (engl. Version):
  • ALT.NET Entwickler verwenden was funktioniert und suchen ständig nach neuen, besseren Lösungen.
  • ALT.NET Entwickler bewegen sich auch außerhalb des Mainstream und verwenden Lösungen, Konzepte, Ideen aus allen Bereichen (Open Source, Agile, Java, Ruby, etc.).
  • ALT.NET Entwickler geben sich mit dem status quo nicht zufrieden und suchen ständig nach Möglichkeiten sich in ihrem Code besser, einfacher und eleganter auszudrücken.
  • ALT.NET Entwickler halten Tools für wichtig, wirklich wichtig sind aber fundierte Kenntnisse und Prinzipien. Die besten Tools sind solche, die einen bei der Anwendung der Prinzipien unterstützen.


ALT.NET ist nicht kontra Microsoft und auch nicht alternativ. Es geht uns darum aus den möglichen Alternativen die jeweils beste auszuwählen. Das schließt Lösungen von Microsoft ausdrücklich mit ein, genauso wie Open Source und Third Party Hersteller.

Klingt zunächst einmal sinnvoll und interessant. Allerdings gibt es auch einige kritische Meinungen dazu (einige sind auf der englischsprachigen ALT.NET Seite verlinkt). So wirken z.B. einige der aktiveren ALT.NET Community-Mitglieder auf andere Blogger elitär und arrogant, und teilweise wird ALT.NET als Anti-Microsoft Bewegung gesehen, die alles ablehnt, was von Microsoft kommt, egal ob die alternativen Lösungen nun tatsächlich besser sind oder nicht. Insbesondere in englischsprachigen Blogs sind mir einige Blogbeiträge begegnet, die in diese Richtung gehen (tatsächlich war einer dieser Beiträge sogar mein erster Kontakt mit ALT.NET). In der deutschen Community habe ich zumindest bisher noch nichts negatives darüber gelesen.

Prinzipiell finde ich es gut, sich mit alternativen Tools zu beschäftigen. Nach neuen und besseren Lösungen suche ich sowieso ständig. Für mich persönlich heisst das aber nicht, dass ich unbedingt gleich für alles Alternativen zum “Mainstream von Microsoft” suchen muss. Auch wenn es für manche Bereiche gute Alternativen gibt (z.B. NHibernate als Alternative zu LINQ to SQL) entscheide ich mich trotzdem oft für die Microsoft Lösung.

Ich bin freiberuflicher Trainer und Entwickler. Als Trainer muss ich mich mit den Technologien auskennen, die am meisten nachgefragt werden. Bisher hatte ich noch keine einzige Anfrage zu NHibernate, Castle Windsor, Monorails oder irgendwelchen anderen Alternativen Technologien, aber zu den “Mainstream” Technologien von Microsoft bekomme ich mehr Anfragen als ich annehmen kann. Würde ich anfangen, alle Mainstream Technologien durch ihre “ALT.NET Alternativen” zu ersetzen, dann könnte ich solche Anfragen bald nicht mehr annehmen, weil mir dann die praktische Erfahrung mit den Mainstream Produkten fehlen würde. Als Entwickler habe ich das Problem, das ich quasi für jedes Projekt in eine neue Firma komme und mit neuen Leuten zusammenarbeite, und dann mit den Technologien arbeiten muss, die beim jeweiligen Kunden eingesetzt werden – und das sind nun mal in der Regel die “Mainstream Technologien” von Microsoft. Ausnahmen gibt es da höchstens beim Team Foundation Server – der ist gerade für kleinere Firmen einfach oft zu teuer, so dass dann Alternativen wie Subversion, Cruisecontrol.NET usw. eingesetzt werden.

Bin ich also nun ein “ALT.NETter” oder eher ein “Mainstream” Entwickler? Ich setzte zwar hauptsächlich Tools von Microsoft ein, aber wenn man sich die ALT.NET Definition oben mal genauer anschaut steht dort nirgendwo, dass das ein Widerspruch sein muss. Unter den für mich gegebenen Rahmenbedingungen setze ich die Tools ein, die für mich am besten geeignet sind. Das sind nun mal in meinem Fall sehr oft – aber nicht immer – die Microsoft Tools. Teilweise sind es aber auch “ALT.NET Tools”, z.B. xUnity und RhinoMocks. Insofern würde ich mich weder als “typischen ALT.NET Entwickler” noch als “typischen Microsoft Mainstream Entwickler” sehen.

Im Oktober findet übrigens die erste deutsprachige ALT.NET Konferenz statt: http://netopenspace.de. Wenn nichts dazwischen kommt werde ich auf jeden Fall daran teilnehmen, das wird sicher eine spannende Abwechslung zu den klassischen Konferenzen.

Technorati Tags: ,
>

IPv6 in einem IPv4 Netzwerk

09.08.2008 13:24:40 | Klaus Bock

Mit Windows Vista hielt auch das IP-Protokoll in der Version 6 Einzug in die heimischen Netzwerke. Während unter Windows XP das TCP/IP Protokoll in der Version 6 erst zusätzlich installiert werden muss, verwendet Windows Vista standardmäßig beide Protokolle und bindet sie an die verfügbaren Netzwerkadapter. Nicht weiter schlimm, sollte man meinen. Es können dabei aber auch nette Seiteneffekte auftreten. Auf einen dieser Seiteneffekte hat mich Windows Live OneCare bei der wöchentlichen Sicherung aufmerksam gemacht als plötzlich ein PC aus der OneCare-Gruppe meldete, die Firewall des PC's an dem das zentrale Speichergerät angeschlossen ist befindet sich in einer öffentlichen Zone. Oops! Ein Blick in das Netzwerk und Freigabecenter bestätigte dies. Wie man in folgendem Screenshot wunderschön sehen kann, gab es da tatsächlich ein nicht identifiziertes öffentliches Netzwerk.Netzwerk- und Freigabecenter

Nach einem Blick in die Eigenschaften des Netzwerkadapters war schnell klar woher dieses Netzwerk kam.

IP Properties

Da das IP-Protokoll in der Version 6 zusätzlich zum IP-Protokoll der Version 4 an den Netzwerkadapter gebunden war, wurde auch eine zweite Verbindung zum WLAN-Accesspoint aufgebaut. Doch da mein Accesspoint nur das IP-Protokoll in der Version 4 unterstützt, konnte die Netzwerkkennung nicht ermittelt werden und Vista ordnete diese Verbindung einem öffentlichen Netzwerk zu. In einem öffentlichen Netzwerk werden standardmäßig die Freigabe von Dateien unterbunden und somit konnte OneCare nicht auf das zentrale Speichergerät zugreifen. Diese Verhalten ist ja eigentlich richtig, doch für meinen Verwendungszweck nicht erwünscht. Also was tun? Hier stehen zwei Möglichkeiten zur Auswahl. Als erste Alternative könnte der Standort in den Netzwerkeinstellungen für dieses Netzwerk von öffentlich auf privat geändert werden damit die Netzfreigaben aktiviert werden. Die zweite Möglichkeit währe das deaktivieren des IP V6 Protokolls in den Eigenschaften des Netzwerkadapters. Da in meinem Netz alles vor und hinter dem Accesspoint noch auf dem IP V4 Protokoll beruht kam für mich nur die zweite Lösung in Betracht. Nach dem deaktivieren des IP V6 Protokolls und dem damit verbundenen De- und Reaktivieren des Netzwerkadapters war im Netzwerk- und Freigabecenter auch das öffentliche Netzwerk verschwunden.

Netzwerk- und Freigabecenter

Wenn also jemand irgend ein merkwürdiges Verhalten oder plötzlich seltsame Geister-Netzwerke auftauchen, sollte er zuerst die TCP/IP-Protokolle in den Eigenschaften seines Netzwerkadapters überprüfen und für sich entscheiden ob er das IP V6 Protokoll wirklich benötigt. In Zukunft werden wir alle sicher auf IPv6 umstellen. Doch im Moment, da noch mehr Geräte mit IPv4- als mit IPv6-Adaptern in Gebrauch sind, kann es das Leben nur unnötig schwer machen.

Technorati-Tags: |

XTOPIA-Give Aways

09.08.2008 06:12:03 | Oliver Scheer

Mitmachen bei den olympischen Spielen

09.08.2008 06:03:02 | Oliver Scheer

... ist  nicht gerade einfach, besonders deshalb weil man quasi sein ganzes Leben lang dafür trainieren müsste.

Aber dankt Popfly und Silverlight kann sich jeder mit seinen Freunden in einigen olympischen Disziplinen messen.

 

clip_image002

clip_image003

Try to light all 14 torches by clicking on them!  Watch out, they’re fast!

To Play:

http://popfly.com/users/team/light%20the%20torches

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Light%20the%20Torches.small' frameborder='no' allowtransparency='true'></iframe>

clip_image005

clip_image006

GOOAAAL!!!

Pick countries to go head-to-head in this game of Foosball Soccer!

To Play:

http://popfly.com/users/team/soccer

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Soccer.small' frameborder='no' allowtransparency='true'></iframe>

clip_image008

clip_image009

Ready… Set… Go!  It’s the 100-meter dash, pick your country and hurdle across the Finish Line to Victory!

To Play:

http://popfly.com/users/team/track%20and%20field

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Track%20and%20Field.small' frameborder='no' allowtransparency='true'></iframe>

clip_image011

clip_image012

Pick your targets carefully, aim, and fire your arrows in this addicting game of Archery!

To Play:

http://popfly.com/users/team/archery

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Archery.small' frameborder='no' allowtransparency='true'></iframe>

clip_image014

clip_image015

Help Rocket Chicken score his longest Long Jump and win a Gold Medal!

To Play:

http://popfly.com/users/team/long%20jump

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Long%20Jump.small' frameborder='no' allowtransparency='true'></iframe>

clip_image017

clip_image018

Test your ‘Strength’ by keeping the barbell off the floor and trying not to turn red in the face!

To Play:

http://popfly.com/users/team/weightlifting

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Weightlifting.small' frameborder='no' allowtransparency='true'></iframe>

clip_image020

clip_image021

Forget Tyson vs. Holyfield, this is the real Boxing match of the century: my Xbox versus your Playstation.  It’s Battle of the Game Consoles!

To Play:

http://popfly.com/users/team/boxing

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/team/Boxing.small' frameborder='no' allowtransparency='true'></iframe>

clip_image022

clip_image024

Spin, jump and twirl through the air without ever leaving your chair!

To Play:

http://www.popfly.com/users/Team/Gymnastics

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/Team/Gymnastics.small' frameborder='no' allowtransparency='true'></iframe>

clip_image026

clip_image028

Dive through the water and hit the target – harder than it looks!

To Play:

http://www.popfly.com/users/Team/Diving

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/Team/Diving.small' frameborder='no' allowtransparency='true'></iframe>

clip_image030

clip_image032

Mirror your teammates movements with this synchronized swimming game!

To Play:

http://www.popfly.com/users/Team/Synchronized%20Swimming

To Embed:

<iframe style='width:500px; height:375px;' src='http://www.popfly.com/users/Team/Synchronized%20Swimming.small' frameborder='no' allowtransparency='true'></iframe>

Die Olympischen Spiele in Silverlight

09.08.2008 05:44:01 | Oliver Scheer

Seit gestern sind die XXIX. Olympischen Spiele in Peking eröffnet. Microsoft und NBC Sports haben sich zusammengetan um eine bisher nie dagewesene Übertragung eines solchen Events im Internet zu produzieren.

NBC und Microsoft werden 3500 Stunden der Olympischen Spiele Millionen von Zuschauern im Internet präsentieren.

Das gesamte Erlebnis basiert auf Silverlight und einer Streaming-Infrastruktur die darauf ausgelegt ist 2,3 Terabytes/Sekunde an Übertragungstraffic zu liefern.

Mehr Informationen gibt es hier: http://www.nbcolympics.com/video

UnitTesting - Wie fange ich an?

08.08.2008 17:42:23 | Rainer Schuster

Was interessiert mich als Entwickler wirklich, wenn ich testen will? Als blutiger Anfänger stehst du erst einmal da. Du hörst die ganze Zeit TDD... zuerst Tests erstellen ... dann programmieren... aber so wirklich weißt du gar nicht, wo du anfangen sollst.

Für mich hatten sich damals am Anfang folgende Fragen gestellt. Ich weiß also das ich Testen muss aber:

  • wie fange ich an?
  • wie benenne ich meinen Test sinnvoll?
  • was kommt denn überhaupt in den Test rein?
  • wie viel darf ich Testen?

Schnell hatte ich mitbekommen, dass Tests klein gehalten werden sollen. Dazu bedarf es keiner großen Nachforschung. Spätestens nach dem 10 Testlauf schreibst du kleine Test, wenn der Durchlauf Ewigkeiten dauert. Aber mir war noch immer nicht klar, wie meine genannten Fragen richtig beantwortet werden können.

Vor einiger Zeit bin ich über einen Artikel von Dan North über BDD (Behaviour Driven Design) gestoßen, den ich aber zu diesem Zeitpunkt nicht so wirklich wahr genommen habe, zumal ich nicht wusste, was er denn mit Behaviour meint. In der ALTNETDE Usergroup bin ich heute nun wieder über das Thema gestolpert und habe mich prompt an diesen Artikel erinnern müssen. Also gleich darauf hin in die Vollen ... ich habe ihn nochmal durchgelesen. Und er erfüllt genau den Zweck, den ein Neuling wissen sollte, wenn er mit UnitTesting anfängt. Alle mir noch offenen Fragen haben sich damit beantwortet.

Dazu gibt es folgendes Entwurfsmuster, dass einem sagt, wie der Test aufgebaut wird:

Gegeben sei ein bestimmter Kontext
Wenn ein bestimmtes Ereigniss auftritt,
Soll ein bestimmtes Ergebniss sichergestellt werden.

Wer sich an dieses Muster hältt, wird feststellen, wie leicht Testing sein kann. Und in diesem Zuge können wir uns gleich von der Bezeichnung Test verabschieden. Viele sehen das als Hürde und Hinderniss an, solche Tests zu etablieren. Immer wieder gern gehörte Kommentare sind:

  • Ein Test ändert sich, wenn wir neue Funktionen hinzufügen.
  • Wenn sich der Code ändert, müssen wir den Test ändern
  • das kann dann wieder Fehler produzieren
  • wir müssen noch mehr Bugfixen

Also ihr seht schon, wo das hinführt? Aber wenn wir nun von Spezifikationen sprechen, dann hört sich das doch gleich anders an. Und vor allem, wenn wir von dokumentierenden Spezifikationen sprechen. Es wird nicht nur getestet. Es wird auch dokumentiert. Und wenn sich ein "Behaviour" (Verhalten) ändert, und nicht mehr in der Spezifikation enthalten ist... ja was dann? Dann streichen wir das Verhalten einfach raus. Wer von euch würde auf die Idee kommen, einen UnitTest einfach so riguros zu löschen? Mal ganz ehrlich!

Also lautet mein Credo: Vom klassischen UnitTesting verabschieden. Hin zu "Behaviours".

Pex 0.6 erschienen

08.08.2008 15:55:58 | Rainer Schuster

Das Microsoft Research Team rund um Pex hat eine neue Version von Pex released wie Nikolai Tillmann in seinem Blog berichtet.

  • 64 Bit Unterstützung
    Pex kann auf einem 64 bit System installiert werden, läuft aber nur im 32bit Modus.
  • UI Änderungen
  • Neue Funktionen
    Code-Update Preview Dialog.
    Quick-Actions: Debug, Send To... Mail, Text-file, Clipboard.
  • Fehler korrigiert
  • Weitere änderungen:
    • Die Qualität des generierten Codes
    • Bessere/schönere Methoden Namen
    • Bessere/schönere Namen für Lokals
  • WPF Problem: API restriction: '...WindowsBase.dll' has already loaded from a different location Pex may break your WPF applications. Bei Problemen soll Pex deinstalliert werden. Das Team arbeitet an einem Workaround.

Hier gehts jeweils zu den Seiten.

Accessibility in Web and Rich Applications

08.08.2008 08:08:04 | Robert Mühsig

Der neue Podcast von Scott Hanselman dreht sich diesmal um Barrierefreiheit in Web und Rich Application.
Als Gast hat Scott Saqib Sheikh, ein Entwickler von Microsoft Consulting Services UK geladen, welcher blind ist. Er spricht über seine Erfahrungen als Blinder mit dem Web und aus einer Entwicklersicht. Allerdings muss ich zugeben, dass ich mir nicht ganz vorstellen kann, wie ein Blinder mit Visual Studio zurechtkommen kann - daher habe ich etwas weiter rumgeforscht und geschaut, was dieses “Jaws” ist (wird im Podcast mehrmals erwähnt).
Daraufhin hab ich auch den “Blind Geek Zone” Blog gefunden.

Microsoft hat auch für Entwickler entsprechende Informationen parat, wie man seine Anwendungen Barrierefrei gestalten kann - im Podcast werden verschiedene Techniken erwähnt.

Wer sich von diesen Screenreader mal ein Bild machen möchte, sollte mal bei YouTube nach “Screenreader” oder “Jaws” etc. suchen.
Manche Designentscheidungen treffen Sehbehinderte Menschen besonders hart, z.B. der Einsatz von Captchas.

Wer sich ebenfalls für das Thema interessiert, sollte sich den Podcast von Scott Hanselman anhören.

ShareThis

Blog Stalking - Dependency Injection zu später Stunde

08.08.2008 00:55:11 | Rainer Schuster

In letzter Zeit kommt es immer häufiger vor, dass ich nicht schlafen kann, weil es zu warm ist. Programmieren ist nicht mehr drinnen. Dafür bin ich nicht mehr auf der Höhe. Aber zum Lesen bleibt allemal noch Energie.

Ich beschäftige mich ja nun seit einiger Zeit neben meinem immer wieder aktuellen Thema Dokumentation mit weiterführenden Techniken und Tools rund um die Komponentenorientierung, als da wären UnitTesting, TypeMocking und Container-Frameworks ala Windsor, Unity, Autofac etc. (siehe vorherige Posts).

Ein Kritikpunkt auf den ich auch unter Kollegen und Skeptikern dabei immer wieder stoße ist die Frage bzw. Aussage: Das dauert doch viel zu lang, das ist unperformant... Reflection dauert doch zu lange. Was die guten Herren dabei vergessen, ist die Tatsache, dass alle Produktiven Container (also die sich als solche bezeichnen) mit hoch optimierten Techniken IL direkt erzeugen. Nun was soll ich dazu sagen, es ist einfach nur schnell, auch wenn sich mal ein-, zweihundert Komponenten in dem Framework tummeln.

Ich habe über das ServiceLocator und Dependency Injection Framework einen schönen Artikel gelesen, der meine bisherigen Erfahrungen und Vermutung bestärkt. Ganz unten in den Kommentaren ist von Oren Eini - oder besser bekannt als Ayende Rahien - folgendes Zitat zu lesen:

1. An object’s consumer shouldn’t need to know that X That is right, this is why you use an IoC.The one place that needs to know about the container is the infrastructure, everything else is constructed by the container.

2. When using property injection you generally need to mark your dependencies as public Use ctor injection, that is the preferred mode.

3. Reflection: all IoC containers use a heavily optimized approaches, down to generating IL at runtime. I have not seen production ready container that had perf problems because of that.

4/ Large object chains create lot of objects. Who _cares_ ? It takes 0.00000006 ms to create an object in .NET. This is absolutely insignificant number.

Die signifikante Stelle habe ich hier mal fett markiert. Also soll uns das wirklich stören? Und Oren ist jetzt nicht gerade jemand, von dem man behaupten könne, er kennt sich auf dem Gebiet nicht aus.

Visual Studio-Vortrag in Ulm: Material online

07.08.2008 22:18:47 | Roland Weigelt

Das Material zu meinem gestrigen Vortrag "Visual Studio nutzen, anpassen und erweitern" bei der .NET Developer-Group Ulm steht nun zum Download bereit:

Microsoft SQL Server 2008 veröffentlicht - released

07.08.2008 20:14:00 | Ozgur Aytekin

Microsoft SQL Server 2008 wurde veröffentlicht.

Unter folgende URL kann die Software zur Evaluationszwecken heruntergeladen werden:
Evaluate Microsoft SQL Server 2008 today (X86, X64 und IA64 Versionen stehen zur Verfügung)

Auch bei diesem Produkt stellt Microsoft viele Tutorials zur Verfügung. Die Hauptthemen bei diesen Tutorials sind:
- Database Engine
- Analysis Services—Multidimensional Data
- Analysis Services—Data Mining
- Integration Services
- Replication
- Reporting Services
- Service Broker

Die Tutorials sind unter folgende URL zu finden: Tutorials

Live Mesh (Tech Preview)

07.08.2008 18:59:34 | Robert Mühsig

image

Live Mesh, welches momentan nur eine Tech Preview ist und noch nicht allen verfügbar ist, ist Microsoft neuste “Live” Entwicklung. Ich hab bereits einmal über die evtl. APIs geschrieben - für uns Entwickler ist also auch was dabei :). Hier kann man sich auch Bewerben um an das SDK ranzukommen - mal sehn ob ich Glück hab :)
Ein Video über die Möglichkeiten befindet sich hier.

Was ist Live Mesh?

Wie bereits auf der Startseite geschrieben geht es im Prinzip darum, seine Daten überall synchronisiert und jederzeit abrufbereit zu haben. Dazu baut man sich ein sogenanntes “Mesh” (Netz) :

image

In diesem “Mesh” kann man nun seine PCs, Macs, Handies etc. einbinden und diese entsprechend synchronisieren lassen. Die Anmeldung erfolgt mit einer Windows Live ID.

Dabei kann man genau bestimmen, welches Gerät mit welchem anderen Gerät synchronisiert werden soll und natürlich kann man sein “Mesh” auch mit anderen teilen. Auf diesen Gedanken komme ich später bei einer kritischen Hinterfragung nochmal zurück.

Wie sieht Live Mesh aus?

Damit sich jeder was drunter vorstellen kann, möchte ich mal ein paar Screenshots präsentieren:

Das Management erfolgt über die mesh.com Website:

image

Wobei man sich zu jedem einzelnen Device connecten kann.

Der “Live Desktop” ist die Online Ausgabe dieses Dienstes, gehostet bei Microsoft (momentan ist die Grenze bei 5GB). Dabei wurde so ziemlich der Windows Desktop nachgebildet:

image

Rechts sieht man die “News”, d.h. alles was hinzugefügt wurde oder was sich verändert hat:

image

Wenn man auf einen solchen “Mesh Folder” klickt, sieht man eine Art Windows Explorer:

image

In diesem “Explorer” kann man Files hochladen, ändern, anschauen, löschen usw.

Wobei man bei “Media View” eine momentan recht einfach gestrickte Silverlight-Applikation vorfindet, die ähnlich wie beim Media Player die Bilder anzeigt oder Musik/Videos abspielt:

image

Auf der rechten Seite kann man in dem Menü die Synchronisierungsoptionen ändern (Synchronisier dich nur mit Device XYZ) oder auch andere Leute einladen:

image

Das wäre es erstmal im großen und ganzen von der Website. Für Vista/XP gibt es natürlich noch eine Desktopversion - für Handy und Mac soll sowas auch noch folgen.

Zu der Desktopversion:

Diese sieht eigentlich genauso aus, wie die Web-Version:

image 

Durch den Client kann man nun auch sehr einfach andere Ordner zu “Mesh Folders” hinzufügen:

image image 

Wenn man nun in diesen Ordner wechselt, bekommt man wieder ein Zusatzmenü angezeigt wie auf der Website:

image

Sobald der Client merkt, dass in den “Mesh” Ordnern was geändert hat, startet er automatisch den Upload:
image

Wobei dieser relativ clever ist: Wenn Bilder in den Ordnern verschiebt, dann muss er nicht sofort alle Bilder neu hochladen, sondern schickt die neue Struktur hoch - was bereits oben ist, muss nicht nochmal hochgeladen werden. Jedenfalls hatte ich dies bei meinem Test so beobachtet ;)

Weiteres Feature: Remote Desktop

Wenn ein PC im Mesh aktiviert und angemeldet ist, dann kann man sich auch von jeder beliebigen Stelle (auch im Browser) auf den PC per Remote Desktop verbinden. Das klappt allerdings nur im Internet Explorer und ist irgendein finsteres ActiveX Control ;) - aber die Idee ist nett :)

Die “kritische Frage”: Ist es nur eine gigantische Filesharing Plattform?

Nüchtern betrachtet ist es momentan nur eine Plattform um Dateien zu synchronisieren - mehr nicht. Im Prinzip eine Art Emule - nur vom Microsoft. Ich könnte mir vorstellen, dass man hierbei einige nicht ganz legale Sachen machen könnte - und das gehostet von Microsoft.
Allerdings ist das sicherlich nur der erste Schritt - wer weiß wie man da noch Applikationen etc. einbinden kann.

Ich bin gespannt und finde es schon recht gelungen :)

ShareThis

Intellisense for MS Expression Blend

07.08.2008 13:29:16 | Lars Keller

Gerade gefunden: Stefan Dobrev hat ein AddIn erstellt mit dem Blend Intellisense bekommt. Yeah das Rockt! :) Dieses Feature vermisst wohl jeder Entwickler der ernsthaft mit Blend arbeitet.

Das AddIn ist mit Sourcecode in codeplex gehostet. Der Projektname lautet: Kaxaml

Hier geht es zu weiteren Infos: http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/IntelliSense_for_Expression_Blend.aspx

Ich bin gespannt in welcher Version Microsoft Intellisense in Blend einbaut, in der aktuellen Version (Blend 2.5 CTP) ist das Feature noch nicht enthalten



This weblog is sponsored by netcreate OHG.

Intellisense for MS Expression Blend

07.08.2008 12:29:16 | Lars Keller

Gerade gefunden: Stefan Dobrev hat ein AddIn erstellt mit dem Blend Intellisense bekommt. Yeah das Rockt! :) Dieses Feature vermisst wohl jeder Entwickler der ernsthaft mit Blend arbeitet.

Das AddIn ist mit Sourcecode in codeplex gehostet. Der Projektname lautet: Kaxaml

Hier geht es zu weiteren Infos: http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/IntelliSense_for_Expression_Blend.aspx

Ich bin gespannt in welcher Version Microsoft Intellisense in Blend einbaut, in der aktuellen Version (Blend 2.5 CTP) ist das Feature noch nicht enthalten

Intellisense for MS Expression Blend

07.08.2008 03:29:01 | Lars Keller

Gerade gefunden: Stefan Dobrev hat ein AddIn erstellt mit dem Blend Intellisense bekommt. Yeah das Rockt! :) Dieses Feature vermisst wohl jeder Entwickler der ernsthaft mit Blend arbeitet.

Das AddIn ist mit Sourcecode in codeplex gehostet. Der Projektname lautet: Kaxaml

Hier geht es zu weiteren Infos: http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/IntelliSense_for_Expression_Blend.aspx

Ich bin gespannt in welcher Version Microsoft Intellisense in Blend einbaut, in der aktuellen Version (Blend 2.5 CTP) ist das Feature noch nicht enthalten

ObservableCollection und NHibernate

06.08.2008 20:49:20 | Norbert Eder

Wer Anwendungen entwickelt (unabhängig ob WPF oder nicht) kommt irgendwann in die Verlegenheit, einen O/R-Mapper einzusetzen. Im Falle von WPF kann sich daraus (je nach eingesetzem Pattern) die Problematik ergeben, dass NHibernate von Haus aus keine ObservableCollection unterstützt, welche jedoch für ein Data Binding notwendig ist (je nach Anwendungsfall).

Zufällig bin ich auf einen Artikel gestoßen, welcher dieses Problem behandelt und eine entsprechende Lösung für dieses Problem bietet und zusätzlich eine Demo-Anwendung zur Verfügung stellt:

Bridge the Gap Between Your NHibernate Collections and WPF UI

MVVM Pattern mit WPF verwenden

06.08.2008 20:26:46 | Norbert Eder

Anfang Juli hatte ich auf www.dotnet-gui.com einen Artikel zum Thema MVC Pattern mit WPF verwenden publiziert.

Ab sofort steht auch ein Artikel zum Thema MVVM Pattern mit WPF verwenden zur Verfügung. Darin wird gezeigt, wie das Model-View-ViewModel-Pattern (welches auch bei Microsoft Expression Blend Verwendung fand) unter WPF angewandt werden kann.

Wer sich nur für die Beispielanwendung interessiert, kann diese hier herunter laden.

Über Anregungen, Verbesserungsmöglichkeiten und dergleichen würde ich mich natürlich freuen.

SpeedFan's shared Memory Segment in verwaltetem Code nutzen

06.08.2008 12:40:17 | Klaus Bock

Die vorherigen Artikel über Shared Memory in verwaltetem Code waren alle sehr abstrakt gehalten um mit jedem möglichen .NET Objekt umgehen zu können. Heute will ich eine praktische Anwendung zeigen die genau diese Technologie, aber weniger abstrakt, nutzt. Manche unter euch kennen und nutzen SpeedFan zum überwachen der diversen Sensoren des jeweiligen Computers. Wie ich schon in einem der früheren Artikel über shared Memory erwähnt habe, wird in der nicht verwalteten Welt reger Gebrauch von gemeinsam genutzten Speicher gemacht. SpeedFan stellt eben so ein Segment mit den relevanten Daten zur Verfügung. Das wirklich schwierige am verarbeiten eines solchen shared Memory Segment ist eine verlässliche Dokumentation in welcher Form die Daten im shared Memory Segment denn vorliegen. Im Falle von SpeedFan wird eine Strukture, bestehend aus verschiedenen unsigned short int Werten sowie einigen signed int[32] Arrays verwendet. In diesem Forenpost wird die Nutzung dieser Struktur diskutiert. Hier das Listing der von SpeedFan verwendeten Struktur:

/////////////////////////////////////////////////
/// SpeedFan specific declarations
/// Thanks to : Alfredo Milani Comparetti
// Shared memory name and handles
TCHAR szName[]=TEXT("SFSharedMemory_ALM");
HANDLE hMapFile;
LPCTSTR pBuf;
bool isOk = false;
// Strucure of the shared block
#pragma pack(push, 1)
typedef struct TSharedMem_
{
unsigned short int version;
unsigned short int flags;
signed int MemSize;
HANDLE handle;
unsigned short int NumTemps;
unsigned short int NumFans;
unsigned short int NumVolts;
signed int temps[32];
signed int fans[32];
signed int volts[32];
}TSharedMem;
#pragma pack(pop)

Wie immer liegt hier der Teufel im Detail. Sehr wichtig, und bestimmt gerne überlesen, ist die Anweisung: #pragma pack(push, 1). Wer sie gleich von Anfang an beachtet, erspart sich fiel Ärger. Doch dazu später mehr. Als erstes wird die C++ Struktur in verwaltetem Code nachgebildet. Hier vorab das Listing der Struktur:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct SFData
{
    public ushort version;
    public ushort flags;
    public int memSize;
    public IntPtr handle;
    public ushort numTemps;
    public ushort numFans;
    public ushort numVolts;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public int[] temps;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public int[] fans;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public int[] volts;
}

Wie im obigen Listing zu sehen ist, wird im StructLayoutAttribute das Feld Pack mit dem Wert 1 verwendet um die gleiche Komprimierung und Ausrichtung im Speicher zu verwenden mit der die Struktur von SpeedFan erstellt wurde. Ohne diese Compileranweisung im C++ Code würde z.B. der VC++ Compiler standardmäßig den Wert 8 verwenden. Wenn diese Information fehlt, würden die Werte nach dem Marshalling in der verwalteten Struktur nicht den Werten entsprechen die ursprünglich in die C++ Struktur geschrieben wurden. Umständliche Umrechnungen oder gar falsche Daten währen die Folge. Zu beachten ist unbedingt auch die Länge der Integer Arrays aus der C++ Struktur. Beim Marshalling der Arrays muss unbedingt das Feld SizeConst mit dem Wert aus der C++ Struktur, in diesem Fall 32, belegt werden. Wie schon eingangs erwähnt, eine verlässliche und vollständige Dokumentation ist meist das schwierigste beim verarbeiten von fremd generierten Daten. Nachdem die Struktur erstellt wurde, kann das lesen aus dem shared Memory Segment in die erzeugte Struktur beginnen. Das ist dieses mal wesentlich einfacher, schon fast trivial, als bei den abstrakten shared Memory Operationen. Da aus der Dokumentation der Namen des shared Memory Segment bekannt ist, kann einfach mit OpenFileMapping ein Handle zum benannten FileMapping Objekt erzeugt werden. Mit diesem Handle wird mittels MapViewOfFile ein Zeiger auf das shared Memory Segment erzeugt. Da die Struktur im Speicher bekannt ist und auch ein Zeiger auf diese vorliegt, kann nun einfach mit der Marshal.PtrToStructure-Methode der Speicherinhalt in die Struktur kopiert werden. Hier die Umsetzung in Code:

public SFData GetData()
{
    if (this.sharedMemoryPointer == IntPtr.Zero)
    {
        throw new SharedMemoryException(
            "Auf das shared Memory Segment kann nicht zugegriffen werden.");
    }

    return (SFData)Marshal.PtrToStructure(
					this.sharedMemoryPointer,
					typeof(SFData));
}

Nachdem die Daten jetzt in einer verwalteten Struktur vorliegen, kann mit ihnen wie gewohnt verfahren werden.

Der Gedanke hinter der Umsetzung dieses Projekts war eine freie Bibliothek für alle möglichen Anwendungen zu schaffen. Ich weis dass schon einige Gadgets erstellt haben die das Shared Memory Segment von SpeedFan nutzen. Diese Gadgets oder Anwendungen unterliegen meist einem Copyright und machen damit eigene Anpassungen nahezu unmöglich. Meine Interessen liegen nicht beim erstellen von grafischen Anwendungen. Außerdem habe habe kein Händchen für das Oberflächendesign. Doch was ich bis jetzt so an Gadgets und grafischen Tools gesehen habe, gibt es anscheinend genug Leute die Spaß daran haben grafische Oberflächen zu bauen. Genau diese Leute will ich mit dieser, und vielleicht noch weiteren Bibliotheken, ansprechen. Sowohl die Bibliothek als auch der Quellcode unterliegen der MIT-Lizenz und sind somit fast uneingeschränkt nutzbar. Lediglich ein Verweis auf den Original Code muss vorhanden sein.

Gerade um die Bibliothek in Gadgets zu verwenden ist die Klasse, welche die Werte aus dem Shared Memory Segment liefert, für COM sichtbar und dadurch mit JavaScript zu verwenden.

[ComVisible(true),
Guid("8a31250b-7c0f-469e-b874-5f53c81728f7"),
ProgId("SpeedFanConnector.SFConnector"),
ClassInterface(ClassInterfaceType.None)]
public partial class SFConnector : IDisposable

Eine Dokumentation der API ist als chm-Datei vorhanden. Zum Testen der Bibliothek auf dem eigenen Computer liegt eine Konsolenanwendung bei die, einfach vorab ausgeführt, schon mögliche Probleme oder die einwandfreie Funktion zeigen kann. Hier zwei Screen-Shots. Einmal von der Konsolenanwendung und zum anderen von SpeedFan um die Funktion der Bibliothek zu zeigen.

SpeedFan Test SpeedFan Screen

Wie hier zu sehen ist, sollten alle Werte die im SpeedFan Dialog zu sehen sind auch in der Konsolenanwendung in der richtigen Reihenfolge gezeigt werden. Es wird vorausgesetzt das SpeedFan Installiert ist und ausgeführt wird. ich habe mit Absicht darauf verzichtet SpeedFan aus der Bibliothek zu starten. Unter XP ginge das ja noch einwandfrei, doch unter Vista könnte es Probleme mit der UAC geben. Statt dessen habe ich die zwei statischen Eigenschaften SpeedFanAlreadyRunning und SpeedFanPath eingebaut. Sie sind deshalb statisch um bereits vor der Initialisierung prüfen zu können ob SpeedFan überhaupt installiert ist, bzw. gerade ausgeführt wird. Sollte eine Initialisierung der Klasse SFConnector erfolgen ohne das SpeedFan ausgeführt wird, führt dies unweigerlich zu einer SharedMemoryException da das shared Memory Segment von SpeedFan nicht verfügbar ist.

Die Eigenschaft SpeedFanPath sucht in der Registrierung das Installationsverzeichnis von SpeedFan und prüft anschließend ob die Datei speedfan.exe im angegebenen Verzeichnis vorhanden ist. Wird sie gefunden wird der komplette Pfad zurück gegeben. Wird entweder der Pfad in der Registrierung oder die Datei nicht gefunden, wird null zurückgegeben. Die Eigenschaft SpeedFanAlreadyRunning prüft ob der Prozess ausgeführt wird. Ist dies der Fall wird true zurückgegeben, anderenfalls false. Es wird allerdings auch false zurückgegeben falls keine ausreichende Berechtigung vorliegt um die laufenden Prozesse abzufragen, da eine evtl. auftretende SecurityException intern behandelt wird.

Wer Interesse hat, kann sich die Bibliothek herunterladen. Außer der Konsolenanwendung ist noch die Komplette Dokumentation der API enthalten. Zum besseren Verständnis der Arbeitsweise, habe ich auch alle privaten Member sowie alle internen Klassen dokumentiert. Über Rückmeldungen würde ich mich freuen. Kritik ist ausdrücklich erwünscht.

SpeedFanConnector

Sollte Interesse bestehen, kann ich auch gerne den Quellcode bereitstellen. Einfach kurze Mail senden.

Technorati-Tags: | | |

ALT.NET Bier Köln #1

06.08.2008 00:05:00 | Sebastian Jancke

 

Nachdem Stefan Lieser in Blog und Maillingliste bereits grob berichtet hat, folgen hier nun noch die visuelle “Nachverfolgung” des ersten ALT.NET Treffens in Deutschland überhaupt.

Stefan, SergeySebastian, Björn, Stefan

Stattgefunden hat das ganze in der Teba in Köln, wo auch die Treffen der DNUG Köln ihre Heimat haben. Themen waren unter anderem:

  • Mitarbeiter Motivation / Coaching in ALT.Net
  • Messaging statt RPC, Publish Subscriber
  • PostSharp erfüllt Obliviousness nicht
  • Parallelität

Speziell zum Thema PostSharp und AOP-Obliviousness möchte ich noch den folgenden Link zum entsprechenden Paper nachreichen: Robert Filman, Daniel Friedman: “AOP is Quantification & Obliviousness”.

 

Technorati Tags: ,

.NET Open Space 2008

05.08.2008 23:55:00 | Sebastian Jancke

.NET Open Space vom 18.10. bis 19.10.2008 in Leipzig

Nun ist es also raus: am 18. und 19. Oktober 2008 findet die .NET Open Space in Leipzig statt. Dabei bildet ALT.NET eines der drei Themenfelder und verspricht spannende Sessions. Ort der Veransaltung ist der Mediencampus Villa Ida. Ich werde auf jeden Fall teilnehmen und habe mich bereits registiert. Vielleicht kommt ja auch eine Session zu DDD oder AOSD zustande – ich würde mich drauf freuen ;-)

Technorati Tags: ,,

The almighty boolean toggle

05.08.2008 23:53:56 | Andre Loker

Do you the feeling when you know exactly what you mean, but you can't find a succinct way to express it? The guy that posted this classic piece of code to the forum surely does:

 if (flag == false)
   flag = true;
 else if (flag == true)
   flag = false;

Hint: flag = !flag

Sorry for not posting anything of greater importance. I'm rather tired :-)

HowTo: UnitTests und Einführung in Mocking mit Rhino.Mocks

05.08.2008 23:23:40 | Robert Mühsig

In dem letzten UnitTest HowTo haben wir den ersten Schritt in Richtung “bessere Software” getan.

Was bei Unit Tests beachtet werden sollte: Ein Unit Test soll genau eine Sache testen - abgeschottet von allen anderen Sachen.
Phil Haack hat einen sehr guten Blogpost darüber geschrieben (und noch einen anderen ;) ) - der auch mich etwas “wachgerüttelt” hat.

image

Was bedeutet das:
Wenn wir angenommen eine 3-Schichten Architektur haben und unseren Service Layer testen möchten, sollten wir tunlichst vermeiden über den Data Access Layer zu gehen und so direkt zur DB zu reden. Die DB kann sich verändern!

Warum?
Wenn man direkt mit der DB redet, muss man sich auf bestimmte Daten verlassen - d.h. statische Daten laden in den Tests. Falls die Daten in der DB mal verloren gehen, gehen leider die UnitTests nicht mehr (selber in einem Projekt soeben bemerkt ;) ).

Ich mach eine Testdatenbank!
Man kann natürlich eine direkte Testdatenbank habe - allerdings ist es dann trotzdem recht schwierig eine “valides” Umfeld bei jedem einzelnen Test zu haben. Oder man resettet nach jedem Test die TestDB - allerdings laufen dann die Unit-Tests sehr zäh ab und es ist auch recht schwierig zu managen.

Mein Idealbild:
Bei jedem Unit Test möchte ich meine Umgebung exakt auf den Testfall konstruieren - sodass ich genau das Verhalten testen und daraufhin implementieren kann.

Das Zauberwort: Mocking
Durch den Einsatz von Schnittstellen usw. kann man natürlich überall Fake / Dummy Klassen erstellen - wie z.B. ich es hier getan hab mit den statischen Daten. Darunter kann man schonmal grob Mocking verstehen.

image

Allerdings ist es ziemlich umständlich für alles und jeden Test die Umgebung entsprechend durch solche Fake-Implementationen komplett zu mimen. Zudem fehlt etwas die Verbindung zwischen der Mockklasse und dem tatsächlichen Einsatzort.

Die Magie der Frameworks
Wie für fast jedes Problem, gibt es auch hier kleine Helferlein, welche durch Magie (es ähnelt Magie ;) ) dir den kompletten Implementationsaufwand der einzelnen konkreten Klassen abnehmen.
Es gibt in der .NET Welt einige Mocking Frameworks: Moq, Rhino.Mocks, TypeMock usw.
Ich bezieh mich nun auf Rhino.Mocks.

In die Praxis:
Wir haben wieder den ähnlichen Aufbau wie die letzten Male:

image 

Wer genauer hinschaut, sieht, dass es keine konkrete Implementation von IPersonRepository zu sehen ist - keine DummyRepository, auch nicht im Test.

Der Aufbau:
In unserem “PersonFilter” haben wir diesmal nur den “WithAge” Filter. Unser “IPersonRepository” hat eine “GetPersons” Methode.

Den PersonService haben wir nun so implementiert:

namespace RhinoMocks.Services
{
    public class PersonService
    {
        private IPersonRepository PersonRep { get; set; }

        public PersonService(IPersonRepository rep)
        {
            this.PersonRep = rep;
        }

        public IList<Person> GetPersonsByAge(int age)
        {
            return this.PersonRep.GetPersons().WithAge(age).ToList();
        }
    }
}

Im Konstruktur übergeben wir unser PersonRepository und in der GetPersonsByAge Methode fragen wir quasi über unseren Filter das entsprechende Repository ab.

Ich benutze die Rhino.Mocks Version 3.5 - welche die aktuellste ist. Diese einfach referenzieren.

Im Test möchten wir nun genau diese eine Methode testen:

        [TestMethod]
        public void PersonService_GetPersonByAge_Works()
        {
            MockRepository mock = new MockRepository();
            IPersonRepository rep = mock.StrictMock<IPersonRepository>();

            using (mock.Record())
            {
                List<Person> returnValues = new List<Person>()
                {
                    new Person() { Age = 11, Name = "Bob" },
                    new Person() { Age = 22, Name = "Alice" },
                    new Person() { Age = 20, Name = "Robert" },
                    new Person() { Age = 40, Name = "Hans" },
                    new Person() { Age = 20, Name = "Peter" },
                    new Person() { Age = 20, Name = "Oli" },
                };
                Expect.Call(rep.GetPersons()).Return(returnValues.AsQueryable());
            }
            using (mock.Playback())
            {
                PersonService service = new PersonService(rep);
                List<Person> serviceResults = service.GetPersonsByAge(20).ToList();

                Assert.AreNotEqual(0, serviceResults.Count);

                foreach (Person result in serviceResults)
                {
                    Assert.AreEqual(20, result.Age);
                }
            }
        }

Achtung: Wie es genau funktioniert wieß ich auch noch nicht - allerdings tut es ;)

Schauen wir es uns mal genauer an:

            MockRepository mock = new MockRepository();
            IPersonRepository rep = mock.StrictMock<IPersonRepository>();

Dieser Codeschnipsel erstellt uns dynamisch ein Objekt vom Typ “IPersonRepository”.

Jetzt kommt der “Record” Mode:

using (mock.Record())
            {
                List<Person> returnValues = new List<Person>()
                {
                    new Person() { Age = 11, Name = "Bob" },
                    new Person() { Age = 22, Name = "Alice" },
                    new Person() { Age = 20, Name = "Robert" },
                    new Person() { Age = 40, Name = "Hans" },
                    new Person() { Age = 20, Name = "Peter" },
                    new Person() { Age = 20, Name = "Oli" },
                };
                Expect.Call(rep.GetPersons()).Return(returnValues.AsQueryable());
            }

Alles was innerhalb von diesem Using ist, wird “aufgezeichnet”. Als erstes erstelle ich mir meine PersonCollection (mein Umfeld in dem in den Test laufen lassen möchte).
In “Expect.Call” geb ich die Methode an, die aufgerufen wird und was dabei als Returnvalue zurückgegeben wird (in meinem Fall meine PersonCollection).

Im letzten “Playback” Abschnitt:

using (mock.Playback())
            {
                PersonService service = new PersonService(rep);
                List<Person> serviceResults = service.GetPersonsByAge(20).ToList();

                Assert.AreNotEqual(0, serviceResults.Count);

                foreach (Person result in serviceResults)
                {
                    Assert.AreEqual(20, result.Age);
                }
            }

Hier wird das, was wir vorher definiert haben bei den entsprechenden Calls “abgespielt”.
Wie die Magie direkt funktioniert, weiß ich nicht, allerdings wird dynamisch zur Laufzeit dieser Typ generiert:

image

Ergebnis:
Der Test läuft durch und ich hab durch diesen Mock genau nur eine Sache getestet - ob der Service läuft oder nicht. Ob die DB verrückt spielt ist mir an dieser Stelle egal :)

Andere Beispiele:

Ich hab am Anfang ein einfaches “Hello World” Beispiel gefunden. Einige Screencasts findet man hier und ein kleines Wiki hat auch noch ein paar Artikel darüber.

Wenn mein Beispiel komplett falsch ist (oder ich eine falsche Erklärung hab), dann einfach melden - ich arbeite mich erst in diese Materie ein :)

[ Download Democode ]

ShareThis

HowTo: Fluent Interfaces - schöne APIs mit C# 3.0

05.08.2008 20:50:47 | Robert Mühsig

APIs (egal ob sie nur für interne Zwecke da sind oder auch an externe Entwicklern geht) sollten möglichst einfach und intuitiv zu bedienen sein.
Seit kurzem lese ich immer häufiger von “Fluent Interfaces“.

Was ist das denn?
Schauen wir uns einfach mal das Wikipedia Beispiel an:

public class ExampleProgram
    {
        [STAThread]
        public static void Main(string[] args)
        {
            //Standard Example
            IConfiguration config = new Configuration();
            config.SetColor("blue");
            config.SetHeight(1);
            config.SetLength(2);
            config.SetDepth(3);
            //FluentExample
            IConfigurationFluent config =
                  new ConfigurationFluent().SetColor("blue")
                                           .SetHeight(1)
                                           .SetLength(2)
                                           .SetDepth(3);
        }

Anstatt nur einzelne Methodenaufrufe zu haben, ist es doch viel angenehmer diese in “einem Satz” niederzuschreiben. Diese Technik findet auch in diversen Javascript-Bibliotheken Einsatz (z.b: jQuery)

Sieht nicht schlecht aus - wie macht man sowas?
Es gibt (wie in dem Wikipedia Beispiel) sicherlich ein paar Tricks wie man sowas machen kann - durch Rob Conerys Storefront Projekt bin ich konkret auf das “Pipes and Filters” Pattern gekommen.

Die Idee (in der Rob Conery Version ;) )
Wir haben einen großen Datenhaufen (unser Repository), wo wir über Filter bestimmte Sachen einfach uns abzapfen können, wie wir es brauchen.

image 

Das tolle nun daran: Man kann nicht nur ein Filter nehmen, sondern kann diese auch zusammenschließen um seine Ergebnisse noch weiter einzuengen:

image

Rob Conery hat dies auch in einem Screencast recht gut erklärt.

Die Umsetzung in .NET mit C# 3.0:
Als “Daten” haben wir in unserem Beispiel einfach eine simple Person Klasse:

    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

Der Aufbau ist ähnlich empfunden wie bei diesem Blogpost - allerdings etwas vereinfacht (und sollte so nicht verwendet werden (Schnittstellen einbauen!))

Unser DummyPersonRepository hat nur eine Methode, welche statisch ein paar Objekte erzeugt:

    public class DummyPersonRepository
    {
        public IQueryable<Person> GetPersons()
        {
            List<Person> returnValues = new List<Person>()
                {
                    new Person() { Age = 11, Name = "Bob" },
                    new Person() { Age = 22, Name = "Alice" },
                    new Person() { Age = 20, Name = "Robert" },
                    new Person() { Age = 40, Name = "Hans" },
                    new Person() { Age = 20, Name = "Peter" },
                    new Person() { Age = 20, Name = "Oli" },
                };

            return returnValues.AsQueryable();
        }
    }

Nun kommen unsere Filter ins Spiel - die nicht direkt ins Repository kommen! Diese werden über “Extension Methods” in einer seperaten Klasse implementiert:

    public static class PersonFilters
    {
        public static IQueryable<Person> WithAge(this IQueryable<Person> qry, int age)
        {
            return (from x in qry
                    where x.Age == age
                    select x);
        }

        public static IQueryable<Person> NameStartsWith(this IQueryable<Person> qry, string start)
        {
            return (from x in qry
                    where x.Name.StartsWith(start)
                    select x);
        }
    }

Hier fragen wir einmal nach dem Alter und ob der Name mit was bestimmten beginnt - beides als “Extension Method”.

In unserem Service können wir nun so eine Methode bereitstellen:

        public IList<Person> GetPersons(int age, string startsWith)
        {
            return this.PersonRep.GetPersons().WithAge(age).NameStartsWith(startsWith).ToList();
        }

Sehr einfach und effektiv :)

Ergebnis:
Am Ende können wir einfach in einer Konsolenapplikation sowas aufrufen:

static void Main(string[] args)
        {
            PersonService srv = new PersonService();
            List<Person> resultList = srv.GetPersons(20, "R").ToList();
            foreach (Person result in resultList)
            {
                Console.WriteLine("Name {0} - Age {1}", result.Name, result.Age);
            }

            Console.Read();
        }

Die Projektstruktur:

image

Natürlich ist das nur ein simples Beispiel, allerdings konnte ich dies bereits effektiv in einem Projekt einsetzen.

Neben Rob Conerys Storefront kann man sich auch diesen Democode von Mike Bosch anschauen (Teil 1 & 2) - auch er findet diese Idee sehr cool :)

Insgesamt erlaubt ein solcher Programmierstil deutlich schickeren Code - wie bereits das Wikipedia Beispiel am Anfang gezeigt haben sollte.

[ Download Democode ]

ShareThis

Gewinnspiel zum Technical Summit 2008

05.08.2008 19:14:22 | Robert Mühsig

image

Nach längerer Pause gibt es mal wieder was neues auf dem Blog.
Fangen wir an mit einem kleinen schicken Gewinnspiel, bei dem es 2 kostenfreie Eintrittskarten für den Technical Summit und ein Visual Studio 2008 zu gewinnen gibt!
Sendet dazu einfach die Lösungen im Zeitraum vom 06.08.08 bis 10.09.2008 zu den nachfolgenden Fragen an meine Email Adresse: robert(dot)muehsig(at)code-developer(dot)de

Was ist das Technical Summit?
Das Microsoft Technical Summit findet immer dann statt, wenn es viel Neues für professionelle Entwickler, Architekten, Entwicklungsleiter, IT-Projektleiter und IT-Projektmanager zu berichten gibt. Dieses Jahr sind die Highlights die Produkte und Services von morgen, die ganz aktuell auf der PDC 2008 bekannt gegeben und erstmalig auf dem Microsoft Technical Summit in Deutschland (genauer gesagt im schönen Berlin) vorgestellt werden. Bis zum 19.09. läuft noch der Early-Bird-Preis. Anmeldung und zusätzliche Infos unter: www.technical-summit.de

Fragen:

  • 1) Frage: Wie lautet das Motto des 2008 Microsoft Technical Summit?
    • Antwortmöglichkeiten:
      • a) Developer, Developer, Developer!
      • b) Technologien von morgen, schon heute!
      • c) Microsoft, Microsoft, Microsoft!
      • d) Alles für Entwickler!
    • Lösungslink: http://go.microsoft.com/?linkid=9298430
  • 2) Frage: Wie heißt die aktuelle Visual Studio Version?
  • 3) Frage: Bis wann läuft die Early-Bird-Promotion des Microsoft Technical Summits?
  • 4) Frage: Wann wurden die ersten Vortragsthemen und Sprecher publiziert?

Viel Spaß beim Rätseln ;)

PS: Wenn alles gut geht, werde ich sicherlich auch auf dem Technical Summit dabei sein :)

ShareThis

.NET Open Space - den Gedanken kenne ich doch irgendwoher?

05.08.2008 16:07:45 | Rainer Schuster

Ich habe bei mir in der Firma interne, wiederkehrende Workshops organisiert, die sich in kleinen Teams selbst verwalten. Themenschwerpunkte sind bestehende und alternative Technologien. Ziel ist es diese Technologien zu evaluieren sie bei einem gewinnbringenden Ergebnis in den Firmen- und Entwicklungsprozess einzubinden.

Die Kernthemen in den ersten zwei Gruppen sind

  • AJAX, alles rund um die Client-Server Kommunikation, sowie der notwendigen Infrastruktur und der Steuerelemente.
  • Softwarearchitektur: Schwerpunkt Komponentenorientierung (Dependency Injection, Unit Testing, Type Mocking)
  • Scrum als agiler Softwareprozess

Scrum will ich deswegen verwenden, da es die Soft Skills jedes einzelnen in der Gruppe steigert und sich die Teams selbst organisieren lässt. Das ist in der Workshopatmosphäre genau das richtige.

Ich werde daher auch in kürze auf meinem Blog das Logo der .NET Open Space auf meiner Seite hosten. Und wenn ich Zeit finde an dem Wochenende werde ich auch die Konferenz besuchen. Nähere Informationen folgen.

Full oder Differntial Backup Microsoft Office SharePoint Server (MOSS) mit Stsadm.exe

05.08.2008 14:29:00 | Ozgur Aytekin

Mit dem Commandline Tool Stsadm.exe können einzelne SiteCollections oder alle SiteCollections gesichert und bei Bedarf können diese wieder zurückgespielt werden.

Das Tool Stsadm.exe befindet sich Defaultmässig im Verzeichnis:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN

Aufruf für einen Full-Backup sieht wie folgt aus:
"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o backup -directory D:\Backup\MOSS -backupmethod full

-o backup: Operation Backup
-directory D:\Backup\MOSS: Backup Verzeichnis, in dem die Backup Files abgelegt werden
-backupmethod full: Alle SiteCollections werden gesichert

Aufruf für einen Differential-Backup sieht wie folgt aus:
"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o backup -url http://moss-srv-001 -filename D:\Backup\MOSS\moss-srv-001.bak

-o backup: Operation Backup
-url: SiteCollection URL
-filename: Backup-Filename inkl. Verzeichnis-Directory

Die beiden Beispiele sind für einmalige Backups gedacht. Wir können diese Behfehle in einer Batch (cmd-File) speichern und diese Befehle mittels Scheduled Tasks vom Windows Server aufrufen. So habt ihr auch die Möglichkeit, die Backup-Operationen zu automatisieren.

Wie wir alle schon wissen, ist das Backupen von Daten nur die halbe arbeit. Man muss die Daten auch mal wieder Restoren können.

Aufruf für einen Full-Restore sieht wie folgt aus:
"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o restore -directory D:\Backup\MOSS -restoremethod overwrite

-o restore: Operation Restore
-directory D:\Backup\MOSS: Restore Verzeichnis, in dem das Backup-File vorhanden ist
-restoremethod overwrite: Die bestehenden Daten mit dem Inhalt des Backup-Files überschrieben

Aufruf für einen Differntial-Restore sieht wie folgt aus:
"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o restore -url http://moss-srv-001 -filename D:\Backup\MOSS\moss-srv-001.bak

-o restore: Operation Restore
-url http://moss-srv-001: Die SiteCollection URL
-filename D:\Backup\MOSS\moss-srv-001.bak: Das Backup-File

Für eine detailierte Beschreibung kann ich die folgende URL empfehlen:
Restore: Stsadm operation (Office SharePoint Server)

Die Gewinner vom Artikel Wettbewerb stehen fest!

04.08.2008 21:08:30 | Jan Welker

Der Artikel Wettbewerb im dotnet-forum.de ist beendet.
Das Team hat die Artikel in den letzten Tagen genau unter die Lupe genommen und hat zwei Gewinner ausgewählt.
Der Erste Platz geht an Gordon Breuer für den Artikel "Grundlagen zu LINQ, λ-Expressions und Extension-Methods". Gordon bekommt das .Net Productivity Pack bestehend aus einer Lizenz Jetbrains Resharper 4.0 und einer Lizenz Jetbrains dotTrace.
Der Zweite Preis geht an Rainer Hilmer. Er bekommt den Zweiten Preis , eine Lizenz für Jetbrains Resharper 4.0 für seinen Artikel "Extension Methods (C#3 Spracherweiterung) am Beispiel eines Value Limiters"

Herzlichen Glückwunsch den beiden Gewinnern!

Es wurden insgesamt 7 Artikel eingereicht. Um die neuen Sprachfeatures von C# 3.0 kennenzulernen lohnt es sich, jeden einzelnen Artikel zu lesen:

Vorschau auf Mono 2.0

04.08.2008 11:35:36 | Norbert Eder

Wer mich kennt weiß, dass ich immer wieder mit Mono liebäugle. Mit der neuen Version wird sich wahrlich etwas tun, wenn man den Release Notes Glauben schenken darf.

So gibt es neue Schnittstellen zu ADO.NET, ASP.NET, LINQ ist im Programm usw. Auch die Mono-eigenen APIs bieten nun Support für GTK+ 2.12, Cecil, Cairo, SQLite-Support und Vieles mehr. Ebenfalls wurde der Compiler erweitert und unterstützt nun Features von C# 3.0 inklusive vollem LINQ-Support.

Weitere Informationen zu Mono allgemeiner Natur:
http://www.go-mono.com

Download der Preview-Version:
http://mono.ximian.com/monobuild/preview/download-preview/

Gewinnspiel zum Technical Summit 2008

04.08.2008 09:03:17 | Norbert Eder



Das Microsoft Technical Summit findet immer dann statt, wenn es viel Neues für professionelle Entwickler, Architekten, Entwicklungsleiter, IT-Projektleiter und IT-Projektmanager zu berichten gibt - heuer von 20. - 21. November 2008 (Preconference am 19. November). Dieses Jahr sind die Highlights die Produkte und Services von morgen, die ganz aktuell auf der PDC 2008 bekannt gegeben und erstmalig auf dem Microsoft Technical Summit in Deutschland vorgestellt werden. Bis zum 19.09.2008 läuft noch der Early-Bird-Preis. Anmeldung und zusätzliche Infos unter: www.technical-summit.de

Im Zeitraum vom 06.08.2008 - 10.09.2008 gibt es nun die Möglichkeit, 2 kostenfreie Eintrittskarten für das Technical Summit, sowie 1 Visual Studio 2008 zu gewinnen. Hierfür sind die untenstehenden Fragen zu beantworten und die Lösungen innerhalb des genannten Zeitraumes per Email an me[at]norberteder[dot]com zu senden.

Gewinnfragen


1) Frage:
Wie lautet das Motto des 2008 Microsoft Technical Summit?

Antwortmöglichkeiten:
a) Developer, Developer, Developer!
b) Technologien von morgen, schon heute!
c) Microsoft, Microsoft, Microsoft!
d) Alles für Entwickler!

Lösungslink: http://go.microsoft.com/?linkid=9298435

2) Frage:
Wie heißt die aktuelle Visual Studio Version?

Antwortmöglichkeiten:
a) Visual Studio 2008
b) Visual Studio 2007
c) Visual Studio 2006
d) Visual Studio 2005

Lösungslink: http://go.microsoft.com/?linkid=9298436

3) Frage:
Bis wann läuft die Early-Bird-Promotion des Microsoft Technical Summits?

Antwortmöglichkeiten:
a) 19.09.2008
b) 10.09.2008
c) 19.10.2008
d) 24.12.2008

Lösungslink: http://go.microsoft.com/?linkid=9298437

4) Frage:
Wann wurden die ersten Vortragsthemen und Sprecher publiziert?

Antwortmöglichkeiten:
a) 19.05.2008
b) 11.06.2008
c) 23.06.2008
d) 07.07.2008

Lösungslink: http://go.microsoft.com/?linkid=9298438

Weitere Informationen über das Microsoft Technical Summit 2008 können über die offizielle Website unter http://www.technical-summit.de bezogen werden.

Wichtig: Noch bis zum 19.09.08 kann unter Verwendung des günstigen Early-Bird-Tarifs gebucht werden.

Benutzung des Substitution Controls um die Ausgabe zu cachen

03.08.2008 22:21:00 | Peter Bucher

ASP.NET hat viele Möglichkeiten um Ausgaben oder Daten zu cachen, unter anderem gibt es ein Control mit dem Namen "Substitution" - auf der Zunge vergeht der Name nicht, der Nutzen des Controls ist allerdings nicht zu unterschätzen.

Unter folgendem Link (Übersicht über das Substitution-Webserversteuerelement) findet ihr eine gute Übersicht vom Control.

Wenn es darum geht Daten zu cachen, dann meist weil es lange geht, diese abzurufen, oder aber die Zugriffe immens sind.
Dies kann beispielsweise einen WebRequest auf eine Url sein, die gar nicht erreichbar sein _muss_, oder eine Abfrage ans Dateisystem um Dateiinhalte anzuzeigen, die ggf. aktualisiert worden sind.

Zu beiden Aufgabenstellungen möchte ich hier jeweils ein Beispiel liefern.

Um das erste Beispiel ermöglichen zu können brauchen wir im App_Data-Verzeichnis eine Textdatei mit dem Inhalt "Hallo Welt", diese wollen wir später abfragen.
Danach braucht es ein Substitution-Control auf der ASPX-Seite, soweit wäre das schon fast alles.

Der ASPX-Teil sieht dann ungefähr so aus:

<h1>Substitution-Control Beispiel</h1>
<fieldset>
    <legend>Dateiinhalt</legend>
    <asp:Substitution ID="subFile" runat="server" />
</fieldset>
<fieldset>
    <legend>Teil aus einem WebRequest</legend>
    <asp:Substitution ID="subWebRequest" runat="server" />
</fieldset>

Das Control hat eine einzige wichtige Eigenschaft: "MethodName".
Der hier angegebene Methodennamen wird dazu benutzt, die Methode - falls vorhanden - aufzurufen.

Dabei liefert die Methode den Inhalt des Controls (Als literalen Content) als String zurück.
Dieser wird danach anstelle des Substitution-Control Markups angezeigt, er wird je nach Logik aus dem Cache geladen oder frisch aktualisiert.

Die Methode muss statisch sein der nachstehenden Signatur folgen:

protected / public string <Name>(HttpContext context);

 

Über den Parameter vom Typ HttpContext kann unter anderem auf den Cache, Response oder den Request zugegriffen werden.
Zuerst müssen wir einen Methodennamen zuweisen, beispielsweise so im Codebehind:

subFile.MethodName = "subFile_GetData";

Folgend die Implementation um den Inhalt einer Datei entweder aus dem Cache auszulesen oder aber aktuell zu holen.
Das kann einfach über eine CacheDependency gelöst werden.

CacheDependencys (Es gibt auch eine SqlCacheDependency) überprüfen die Gültigkeit des Cache-Inhaltes aufgrund von verschiedenen Eingaben (Dateinamen / Letzte Änderung / Datenbankänderungen, etc...) und setzen den Cache-Inhalt auf "null" / "Nothing" wenn aktuellere Daten verfügbar sind bzw. die Cache-Zeit abgelaufen ist.



protected static string subFile_GetData(HttpContext context) {
    const string subFileKey = "subFileKey";

    object cacheContent = context.Cache[subFileKey];

    if (cacheContent != null) {
        // Inhalt aus dem Cache anzeigen
        return cacheContent.ToString();
    } else {
        // Daten abrufen (Zeitintensiv) und Cache aktualisieren
        string path = context.Request.MapPath("~/App_Data/test.txt");

        if (File.Exists(path)) {
            // --> zeitaufwändige Aktion
            string content = File.ReadAllText(path);
            // <-- Ende

            // Cache mit einer CacheDependency auffüllen
            CacheDependency d = new CacheDependency(path);
            context.Cache.Insert(subFileKey,
                                             content,
                                             d);
            return content;
        } else {
            return String.Empty;
        }
    }
}

Sobald der Inhalt der Textdatei bzw. dessen Änderungsdatum geändert haben, wird der Cache ungültig, ist somit "null" / "Nothing" und der aktuelle Inhalt wird in den Cache eingelesen + angezeigt.

Bei einem WebRequest sieht es ein wenig anders aus, jedoch verfährt es nach dem gleichen Prinzip (Also Cache auf "null" prüfen und ggf. Daten aktualisieren).
Anstelle einer CacheDependency wird eine Zeitdauer eingestellt.
Für diese Dauer ist der Cacheinhalt gültig, nach Ablauf wird - in diesem Fall - ein neuer WebRequest losgeschickt und der Cache wieder gefüllt:



protected static string subWebRequest_GetData(HttpContext context) {
    const string subWebRequestKey = "subWebRequestKey";

    object cacheContent = context.Cache[subWebRequestKey]; 
    if (cacheContent != null) {
        return cacheContent.ToString();
    } else {
        WebClient client = new WebClient();

        try {
            string searchKey = "von ungefähr <b>";
            int resultLength = 10;

            string content = client.DownloadString(new Uri("http://www.google.ch/" +
                                    "search?hl=de&q=asp.net&btnG=Google-Suche&meta="));

            int index = content.IndexOf(searchKey);

            if (index > -1) {
                index += searchKey.Length;
                content = content.Substring(index, resultLength);

                // Cache mit der Gültigkeit von 10 Sekunden eintragen
                context.Cache.Insert(subWebRequestKey,
                                     content,
                                     null,
                                     DateTime.Now.AddSeconds(10),
                                     TimeSpan.Zero
                    );

                return content;
            }
        } catch {
            return String.Empty;
        }
    }
    return String.Empty;
}

Das Substitution-Control stellt nur ein Hilfsmittel dar, um Daten aus dem Cache direkt auf der Webseite anzuzeigen.
Die Vorgehensweise innerhalb der "GetData"-Methoden kann auch an einer anderen Stelle genutzt werden, um Daten aus dem Cache anzuzeigen.

Viel Spass damit.

Download des Beispielprojekts:

MSDN-Links:

Mein Wechsel zu Windows Vista

03.08.2008 17:16:00 | Klaus Bock

Nachdem ich letzte Woche mein neues HP Notebook mit vorinstalliertem Windows Vista(R) erhalten habe, musste ich mich das erste mal näher mit Vista befassen. Ich muss zugeben, was ich bis jetzt über Vista gehört und gelesen hatte, hätte widersprüchlicher nicht sein können: von restlos begeistert bis "nicht zu gebrauchen" war alles dabei. Also warum nicht dachte ich mir; XP installieren kannst du später immer noch.

Der erste Eindruck von Vista war ganz angenehm. Der Systemstart geht relativ flott von statten und der erste optische Eindruck ist ganz ansprechend. So begann ich das leere Gerät mit Software zu füllen. Bei der Installation des ersten Programms war sie plötzlich da: die viel diskutierte UAC. Also habe ich die UAC für den Zeitraum der Installation meiner benötigten Programme erst einmal ausgeschaltet. Vista "maulte" zwar ein wenig, aber besser Vista als ich. Nachdem die UAC erst mal deaktiviert war, ging die Installation und das Einrichten wie von XP gewohnt. Nach dem die Installationen abgeschlossen waren die UAC wieder eingeschaltet und das war's, dachte ich. Beim ersten Systemstart mit eingeschalteter UAC viel mir ein neues "Feature" von Vista auf: das blockieren von non Vista-Compliant Programmen die beim Systemstart ausgeführt werden sollen. Und ausgerechnet PSI und SpeedFan; toll. Egal ob die Programme aus dem Autostart-Ordner oder aus der Registrierung gestartet werden, Vista blockiert sie. Da fand ich diesen Post in einem Forum. Das Konzept ist so einfach wie genial. Das von Vista verweigerte Programme einfach als geplanten Task, oder Aufgabe wie es jetzt heißt, anlegen und bei der Benutzeranmeldung ausführen lassen; fertig.

Nachdem auch diese Hürde genommen war, wollte ich natürlich die neuen Vista Feature erkunden. Am meisten gespannt war ich auf die Sidebar. Da ich schon lange mit XP die Desktop Sidebar verwende, hatte ich natürlich hohe Erwartungen an die Vista eigene Sidebar. Nach dem starten der Vista eigenen Sidebar und dem einfügen einiger Gadgets kam bereits die erste Enttäuschung auf. Die Vista Sidebar sieht zwar optisch sehr schön aus, aber der verfügbare Inhalt? Kein Vergleich mit der Desktop Sidebar. Als Beispiel das News-Feed Gadget. In der Vista Sidebar ist es sehr klein gehalten, zeigt lediglich 5 oder 6 Feeds auf einmal. Um überhaupt Feeds anzeigen zu können, müssen diese erst im Internet Explorer abonniert werden. Als Vergleich dazu werden die Feeds in der Desktop Sidebar in einem Dock-Panel angezeigt. Dieses ist in der Größe einstellbar so wie ich es haben will. Auch werden die Feeds nicht einfach fortlaufend angezeigt, sondern nach den einzelnen Feeds sortiert zwischen denen gewechselt werden kann. Um das Abonnement der Feeds kümmert sich ausschließlich die Desktop Sidebar und kein Browser. Das Prinzip der Gadgets in der Vista Sidebar ist zwar ein nettes Konzept, doch gefällt mir persönlich das der Desktop Sidebar mit den Panels wesentlich besser. Es sieht einfach homogener aus. Aber das ist Geschmacksache und über Geschmack lässt sich bekanntlich nicht streiten.

Was Vista an grafischen Gimmicks zu bieten hat finde ich sehr gelungen. Vor allem das Windows-Flip-3D hat es mir angetan. Auch sehen WPF-Anwendungen irgendwie edler aus. Im großen und ganzen empfinde ich die Oberfläche von Vista als sehr flüssig, trotz aktiviertem Aero Stil.

Die UAC erscheint mir als vernünftiger Ansatz zum Thema Sicherheit. Vor allem wenn man den Umstand der, unter Windows Benutzern weit verbreiteten Unart, permanenten Benutzung eines Kontos mit administrativen Rechten bedenkt. Nur die Umsetzung empfinde ich als nicht sehr gelungen. Hier könnte bestimmt eine bessere Lösung gefunden werden. Wenn z.B. Sql Server Management Studio explizit als Administrator gestartet wird, warum muss dann noch einmal nachgefragt werden ob ich dieses Programm auch wirklich gestartet habe? Oder der Zugriff auf das Programm-Verzeichnis. Nicht für jedes Programm ist ein Installer vorhanden. Warum kann ich nicht einfach eine Anwendung in dieses Verzeichnis kopieren ohne erst die UAC zu deaktivieren? Genauso wie das schreiben von Einstellungen in Konfigurationsdateien im Programm-Verzeichnis wird kategorisch unterbunden. Erst nach dem anpassen der Berechtigungen lässt sich hier vernünftig arbeiten. Das ließe sich sicherlich mit einer Trusted List lösen in der die Programme aufgenommen werden welche in das eigene Verzeichnis schreiben dürfen. Es wird mit Sicherheit noch einige Zeit dauern, bis alle Anwendungen dahingehend angepasst wurden nur in das Benutzer-Verzeichnis zu schreiben. Nicht einmal die Microsoft eigenen tun das, wie etwa StyleCop.

Trotz der angesprochenen Ecken und Kanten gefällt mir Vista eigentlich sehr gut. Ich Denke es hat Potential und werde es wohl weiter Verwenden. Es wird sich mit den kommenden Servicepacks mit Sicherheit noch einiges ändern. XP war ja auch erst mit dem SP2 so richtig erfolgreich.

Technorati-Tags:

Unit Testing, Type Mocking und Dependency Injection

03.08.2008 04:51:00 | Rainer Schuster

Vorwort

Das ist das Triumvirat der modernen Softwarearchitektur. Einige werden sich jetzt fragen, was ich ihnen eigentlich erzählen will? Nun dann will ich mal ganz vorne anfangen. Zuerst einmal ein kurze Einführung. Ich werde ab September wieder in der Desktop basierten Softwareentwicklung tätig sein. Das gute daran ist, es wird eine Neuentwicklung werden. Und da wittere ich jetzt die Gelegenheit Architekturkonzepte aufzugreifen, die sich schon länger entwickelt haben und immer mehr in Mode kommen.

UnitTesting

Bereits vor vielen Jahren hat Kent Beck mit Extreme Programming den Meilenstein für eine heranwachsende Softwaregeneration gelegt. Er ist - so würde ich es bezeichnen - der Urvater der modernen Testframeworks. Er hat SUnit für Smalltak entwickelt und dann später mit Erich Gamma das ganze nach Java als JUnit portiert. Wer gut aufgepasst hat wird sich jetzt vielleicht fragen, ob das was mit NUnit zu tun hat. Und wie! Schlussendlich ist diese ganz N-Produkt-Sache an Java angelehnt. Viele Gute Frameworks haben den Transfer aus der Javawelt in das .NET Zeitalter gut überstanden und erleben hier einen großen Anklang und Aufschwung.

Nun zurück zu meiner Überschrift. Im laufe der Jahre sind immer mehr Probleme in der objektorientierten Entwicklung entstanden. Spaghetti Code ist den tief verschachtelten Klassenhierarchien gewichen und hat so den Weg zu der gleichen Komplexität geebnet. Nun haben sich Architekten dafür aber wieder etwas einfallen lassen.

Da UnitTesting schon zum guten Ton gehört und es sich aus neu entstehenden Projekten eigentlich nicht mehr wegdenken lässt will ich hier auch weitere Schwerpunkte legen und aufzeigen. Was macht das Testen aber schwierig? Nun ja, wie bekomme ich Abhängigkeiten innerhalb von Klassen geregelt, die nach aussen hin nicht sichtbar sind, also private oder protected? Über das .NET Framework können diese Beschränkungen umgangen werden.

Type Mocking

So kommen wir doch nun aber mal einen Schritt weiter. Ich will Klassen testen, die wiederum von anderen abhängig ist. Schon früher war klar: Es müssen Verträge geschaffen werden und diese nennen sich eben einmal Schnittstellen (Interfaces). Hier kommt Type Mocking ins Spiel. Was ist das, ein Mock (Attrappe)? Diese Technik dient dazu zu einem vorgebenen Interface ein konkrete Implementierung zu erstellen und dabei alle notwendigen Abhängigkeiten von aussen zu injizieren.

Bei UnitTests kann das verwendet werden um einzelne Komponenten unabhängig von ihrem Gesamtsystem, indem sie Leben zu testen. Auch Komponenten können ja ihrerseits wieder Abhängigkeiten haben. Dies kann durch Type Mocking in Einheitentests eliminiert werden, indem wir Komponente A sagen, wie B aussieht, und wie sie sich verhält. Dabei genügt es vollkommen nur ein Interface davon zu besitzen. Wir bauen uns zur Laufzeit, on the fly, das benötigte Objekt B zusammen und jubeln es Komponente A unter. So bekommen wir ein Funktionierendes System. Wir können also unsere Tests abgeschlossen als Sandbox laufen lassen. Das ist ein Technik, die sehr gut funktioniert und aus dem Unittesting nicht mehr wegzudenken ist.

Dependency Injection

Meine Damen und Herren ich darf ihnen nun Dependency Injection oder kurz DI präsentieren. Es ist eine Spezielle Implementierung des Inversion of Control (IoC) Patterns. Dabei leistet DI mehr als sein Muster IoC, das mittlerweile nur einen Teil davon abbildet. Mit DI schaffen wir, was die Objektorientierung in jahrelanger Arbeit angerichtet hat: Wir lösen die starke Kopplung und Verdrahtung von Abhängigkeiten und schaffen eine überschaubare und wartbare Komplexität.

Dazu gibt es einen Container, bei dem alle Interfaces und Objekte registriert werden. Der Container kann dabei als Factory dienen und als alleswissender Dispatcher. Wird ein Objekt, oder Service benötigt, so stellen wir nur eine Anfrage an den Container und er liefert uns das passende Objekt zurück.

Zu schön um wahr zu sein? Nein, schon seit langem lebende Praxis. Diese etwas längere Einführung sollte nur ein kurzer Artikel sein um euch das ganze schmackhaft zu machen. Ich werde nun im folgenden ein paar Frameworks aufzählen, so dass jeder, der sich schon einmal voraus informieren will den nötigen Startpunkt hat.

Frameworks und Schlagworte

Dependency Injection (und mehr)

UnitTesting

Type Mocking

Schlusswort

Das sollte für den Anfang erst einmal reichen. Ich beschäftige mich in der Theorie mit diesen Themen schon seit ca. zwei Jahren immer mal wieder. Natürlich immer wieder jeweils aufbauend zum nächsten kommenden Thema. Wichtig dabei ist es für mich den Hintergrund zu verstehen um es dann in der Praxis richtig einzusetzen. Benutzt habe ich die ein oder andere Technik schon in der Praxis, nun ist es aber an der Zeit alles zu kombinieren und im richtigen Maße zu verwenden. Mein Blog wird sich daher in nächster Zeit hoffentlich etwas mehr mit Beispielen füllen, die dann mein Genutztes und Gelerntes reflektieren sollen. Wenn, ja wenn mir neben den Vorbereitungen zum MCPD noch genügend Spielraum bleibt. Nebenbei erwähnt, habe ich auch noch eine wundervolle Frau, die meine Anwesenheit und Liebe zu schätzen weiß. Wer noch mehr Quellen zu dem Thema haben will sollte sich die Links in meinem Bloggroll ansehen. Besonders wertvoll waren für mich der Artikel über Autofac, der Blog von Ayende (Rhino.Mock) und die pnpguidance.net von David Hayden, sowie seine Seite. Der Mann hat sogar einen sehr guten Geschmack was grünen Tee angeht. Zu guter letzt noch ein deutscher Artikel, der eine gute Übersicht liefert:

Ich hoffe euch das ganze etwas schmackhaft gemacht zu haben. Feedback erwünscht.

SQL Server 2005 Performance Dashboard Reports

01.08.2008 22:45:00 | Ozgur Aytekin

Von Microsoft zur Verfügung gestellte SQL Server 2005 Performance Dashboard Reports können Euch bei der Analyse von Performance-Problemen die nötigen Informationen liefern.

Für diesen Report-Dateien benötigt ihr den Service Pack 2 (SP 2) für den SQL Server 2005.

Download URL für die SQL Server 2005 Performance Dashboard Reports: SQL Server 2005 Performance Dashboard Reports

Nach der einfachen Installation können die Reports wie folgt eingerichtet werden:

Zuerst müssen wir die setup.sql-Daten ausführen. Die setup.sql-Datei-File erstellt die nötigen Einträge in der msdb-Datenbank-Database, damit wir die Reports später benutzen können.

Die setup.sql-Datei-File befindet sich Standardmässig-Default in dem Verzeichnis C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard, wenn während der Installation kein anderes Verzeichnis definiert wude.

Menü-Eintag File - Open - File auswählen:

Microsoft SQL Server Management Studio - File - Open - File

Anschliessend die setup.sql-Datei-File auswählen:

Open File

Ein kleiner Ausschnitt der setup.sql-Datei-File sieht wie folgt aus:

setup.sql

Mit F5-Taste-Key oder Execute-Button können wir diesen Script laufen lassen. (Wie immer: Auf eigene Gefahr! Ich bin selber nicht unbedingt dafür, dass man solche Installationen direkt auf dem Produktions-Server testet.)

setup.sql

Object Explorer - Database-Server - Database-Instance > Reports > Custom Reports auswählen

Object Explorer - Database Instance - Reports - Custom Reports

Die Reports werden Standardmässig-Default in das Verzeichnis C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard installiert, wenn kein anderes Verzeichnis während der Installation definiert wurde.

Als Beispiel die performance_dashboard_main.rdl-Datei-File auswählen

Open File

Die folgende Meldung mit Run bestägigen

Run Custom Report

Anschliessend werden die Informationen angezeigt:

SQL Server Performance Dasboard

Wenn ihr eine andere Report-Datei (wie z.B. database_overview.rdl) auswählt als performance_dashboard_main.rdl, dann wird das System folgende Meldung anzeigen:

Error: The 'version_string' parameter is mission a value

Error: The 'version_string' parameter is mission a value

Die anderen Reports, welche die in dem Installationsverzeichnis vorhanden sind, können über den Performance Dashboard-Report aufgerufen werden.

Ein paar Beispiel-Sample Reports findet ihr unten:

User Requests:

User Requests - Current Requests

User Sessions:

Users Sessions - Sessions Overview

Waits:

Waits - Historical Waits

IO Statistics:

IO Statistics - Historical IO Report

Databases:

Databases - Databases Overview

Zwei Word-Dokumente separat mit Word 2007 öffnen

01.08.2008 21:04:11 | Lars Keller

Des Öfteren wurde ich gefragt, wie man zwei Word-Docs separat öffnen kann. Mit separat meine ich z.B. docx1 auf dem linken Monitor und docx2 auf dem rechten Monitor.
Standardmäßig öffnet Word beide Dokumente in einer Word-Applikation und somit kann man sehr schlecht verschiedene Dokumente gleichzeitig bearbeiten (bzw. immer nur hin und her schalten).

Lösung: Damit man beide Word-Dokumente in jeweils einer eigenen Word-Applikation hat, muss man nur folgenden Button in Word drücken:

Ansicht ->Nebeneinander anzeigen

word2

Es gibt noch weitere Interessante Feature, z.B. Synchroner Bildlauf zwischen den beiden Word-Dokumenten etc.



This weblog is sponsored by netcreate OHG.

Zwei Word-Dokumente separat mit Word 2007 öffnen

01.08.2008 20:04:11 | Lars Keller

Des Öfteren wurde ich gefragt, wie man zwei Word-Docs separat öffnen kann. Mit separat meine ich z.B. docx1 auf dem linken Monitor und docx2 auf dem rechten Monitor.
Standardmäßig öffnet Word beide Dokumente in einer Word-Applikation und somit kann man sehr schlecht verschiedene Dokumente gleichzeitig bearbeiten (bzw. immer nur hin und her schalten).

Lösung: Damit man beide Word-Dokumente in jeweils einer eigenen Word-Applikation hat, muss man nur folgenden Button in Word drücken:

Ansicht ->Nebeneinander anzeigen

word2

Es gibt noch weitere Interessante Feature, z.B. Synchroner Bildlauf zwischen den beiden Word-Dokumenten etc.

Zwei Word-Dokumente separat mit Word 2007 öffnen

01.08.2008 11:04:01 | Lars Keller

Des Öfteren wurde ich gefragt, wie man zwei Word-Docs separat öffnen kann. Mit separat meine ich z.B. docx1 auf dem linken Monitor und docx2 auf dem rechten Monitor.
Standardmäßig öffnet Word beide Dokumente in einer Word-Applikation und somit kann man sehr schlecht verschiedene Dokumente gleichzeitig bearbeiten (bzw. immer nur hin und her schalten).

Lösung: Damit man beide Word-Dokumente in jeweils einer eigenen Word-Applikation hat, muss man nur folgenden Button in Word drücken:

Ansicht ->Nebeneinander anzeigen

word2

Es gibt noch weitere Interessante Feature, z.B. Synchroner Bildlauf zwischen den beiden Word-Dokumenten etc.

jQuery Intellisense

01.08.2008 09:25:19 | Rainer Schuster

Nachdem ich mich jetzt seit einer Woche mit jQuery beschäftige, möchte ich eigentlich nicht mehr ohne. Der Grund ist ganz einfach. Du kannst damit Browserübergreifend dein Javascript auf einfache Weise schreiben!

Wo du zuvor 10 Zeilen Code gebraucht hast, kommst du nun vielleicht mit 3 aus. Darüber hinaus bietet jQuery viele Effekte an, ein schönes event-Model und unzählige Erweiterungen wie z.B. das Flexgrid - ein leichtgewichtiges, mächtiges Clientcontroll! Ein weiteres Beispiel? Aufrufe zum Server, wie WebService-Methoden, AJAX.pro Methoden oder ein GET/POST mit XmlHTTPRequest gehen mit einem Einzeiler von der Hand. Der Funktion wird lediglich ein Callback angegeben, da die Ausführung ja selbstverständlich asynchron ausgeführt wird.

Nun ist gerade die Eingewöhnung ohne Intellisense etwas schwer, aber dafür gibt es Abhilfe. Im VS2008 gab es einen Bug, der das anzeigen der jQueryinstanz ($) verhindert hat. Kurz gesucht und schon gefunden! Dieser Post hat mir das Leben gerettet. Hier wird beschrieben was notwendig ist, um Intellisense für jQuery komplett einzurichten. Es wird gezeigt, wie eine jQuery.Intellisense.js benutzt wird um das zu bewerkstelligen. Sie besteht nur aus den Funktionsdeklarationen und der Dokumentation.

Leider basiert sie auf der Version 1.2.3. Also nochmal gegoogelt - jetzt wußte ich ja, wonach ich suchen musste - und schon wieder einen Treffer. Hier findet ihr die aktuelle Version (jQuery-1.2.6-Intellisense.js).

Fazit. Wer ernsthaft AJAX programmiert wird sich jQuery kaum entziehen können. Und wer es noch nicht getan hat noch ein Tipp: Schaut euch mal die Google-AJAX-Script-Library an. Hier werdet ihr es neben weiteren interessanten Javascript-Frameworks auch wieder finden.

Happy Coding!

Channel 9: ASP.NET Extensions - Silverlight Media Player Control

01.08.2008 06:42:32 | Oliver Scheer

Der absolut einfachste Weg ein Video auf seine eigene Webseite einzubauen geht ist das neue Silverlight Media Player Control aus den ASP.NET Extensions zu verwenden.
Darüber hat man diverse Möglichkeiten, einen vordefinierten Player oder eine eigene Player-Darstellung zu verwenden und das Video seiner Wahl mit oder ohne Kapiteln ins Internet zu bringen. Dieses Video zeigt in 10 Minuten, wie es geht.
Viel Spaß.


ASP.NET Extensions: Silverlight Media Player Control

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