VSTO 3.0 - Was gibt es neues in der Office Entwicklung?


Dies war der Titel des Vortrags von Lars Keller bei der .NET Usergroup Karlsruhe gestern Abend.

Nach der Geschichte und Architektur von VSTO bis zur aktuellen Version stellte Lars die Programmierung des Ribbon UIs vor und zeigte die Fähigkeiten von VSTO am Beispiel von Outlook 2007 auf.

Außerdem präsentierte Lars wichtige Neuerungen und Erleichterungen durch die vor kurzem erschienenen Power Tools im Zusammenspiel mit VSTO.

Nach dem Vortrag ergaben sich zunächst noch einige interessante Diskussionen zu VSTO, die dann auch andere Bereiche der .NET-Entwicklung erfassten und so fand bis ziemlich genau um Mitternacht noch ein reger und konstruktiver Erfahrungsaustausch zu Patterns, Best Practices sowie Coding- & Design Guidelines statt.

An dieser Stelle nochmal ein Dankeschön an Lars ;-)

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Friday, May 16, 2008 10:26 PM | Feedback (0)

Für alle RegEx-Verweigerer ;-)


Wer sich bisher aufgrund der Komplexität gegen die Verwendung von Regulären Ausdrücken gesperrt hat, sollte sich Josh Flanagan's Readable Fluent Regex Api bzw. was Roy Osherove mit LINQ to Regex daraus gemacht hat, angucken.

Damit lassen sich RegExen künftig wie folgt abbilden:

linq to regex

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Wednesday, May 07, 2008 11:53 PM | Feedback (1)

Rant: Ist das Patterns and Practices-Team nur eine Alibi-Mannschaft?


An sich bin ich seit vielen Jahren mit den Produkten von Microsoft und der Linie, die Microsoft "fährt", immer sehr zufrieden gewesen - insbesondere natürlich, was .NET angeht, da dies teil meiner täglichen Arbeit ist.

Bis .NET Framework 2.0 stand ich Neuerungen gegenüber auf dem Standpunkt: "vielleicht noch nicht ideal, aber wir sind auch noch nicht bei der obligatorischen Version 3.0 angelangt".

Inzwischen gibt es für mich allerdings etliche Punkte bei .NET und Microsofts Strategie, die mich ernsthaft stören.

Da diverse Unterhaltungen im Messenger meine Meinung größtenteils bestätigen, möchte ich die Punkte hier zur Diskussion stellen:

  • YAHOO!: Ich würde für YAHOO! keinen Cent (nicht EURO und nicht $) ausgeben, YAHOO! ist über kurz oder lang gegen Google dem Tode geweiht, das wird auch ein Kauf durch Microsoft nicht ändern. Microsoft kauft mit YAHOO eine fremde (nicht im Sinne von unbekannt) Technologie ein, die integriert werden muss. Microsoft hat mit (ASP).NET jedoch selbst eine - wie ich jetzt einfach mal zu behaupten wage - bessere Infrastruktur im eigenen Haus.
    Es wäre imho wesentlich sinnvoller, wenn Microsoft nur einen Bruchteil der ca. 40 Mrd. US-$ einsetzen würde, um eine vergleichbare Plattform mit (ASP).NET in Eigenleistung zu etablieren. Dies wäre zudem eine wunderbare Referenz für die .NET-Technologie.

  • Ich habe keinen Bezug zu den Live-Produkten, allenfalls nutze ich Live Maps, den Writer und den Messenger (letzterer wurde wohl nur von MSN nach Live umbenannt, um Live bekannter zu machen). Ich benutze aber auch keine Google-Tabellenkalkulation oder ähnliches, nicht nicht mal Google-Mail. Für die Synchronisation von Daten möchte ich eine stabile Server-Platform, die auf mein Kommando hört und schlimmstenfalls bei einem Provider meines Vertrauens steht. Ich möchte meine Daten auch sonst niemandem als FileShare bereitstellen, dafür habe ich entweder E-Mail (mit PGP, wenns vertraulich ist) oder einen passwort-geschützten Download-Bereich auf einer Website.

  • Ich entwickle seit dem Sommer 2003 mit (ASP).NET - eigentlich bin ich viel zu spät umgestiegen - und komme von Classic ASP (seit 1998) und HTML (seit 1995). Im Sommer 2004 haben wir in Karlsruhe die .NET Community Conference (NCC) veranstaltet. Die Themen waren damals unter anderem:

    • Sichere Webseiten mit ASP.NET
    • 3-Schichten-Architektur
    • Einfacher Datenbank-Zugriff im Code
    • Wiederverwendbarkeit von Code
    • Enterprise Library, damals noch als Application Blocks bekannt
    Wenn ich mir heute, fast genau 4 Jahre und 2,5 .NET-Framework-Releases später die Fragen der User in den Community-Foren wie glengamoi.com angucke, stelle ich fest, dass sich an der Problematik fast nichts geändert hat oder sich die Fragestellungen nur minimal verschoben haben.

    Nachdem mich das Thema bereits häufiger beschäftigt hat, bin ich zu folgendem Resultat gelangt:

    Microsoft verpasst bei jedem neuen Release von .NET und insbesondere Visual Studio die Chance, die Leute zu sauberer Softwareentwicklung zu erziehen. Stattdessen wird ab der ersten, der Öffentlichkeit vorzeigbaren Demo wieder die übliche "Mit-5-Klicks-ist-Deine-Website-Live"-Prozedur abgespielt, es werden neue Listen-Controls gezeigt, neue Datenbindungsmöglichkeiten usw..

    Der begeisterte User/Entwickler geht nach genau diesem Schema vor, sobald er eine öffentliche Beta bekommen kann und baut seine Seite nach exakt den Demos, die er inzwischen überall findet. Doch binnen kürzester Zeit stößt er auf das eine oder andere Problem, das tiefergehendes Verständnis für (ASP).NET verlangt und er wendet sich vertrauensvoll an eine der zahlreichen Online-Communities zu .NET. Dort erlebt er nun über kurz oder lang ein eiskaltes Erwachen,  denn er erfährt, dass

    • seine Seite im Jahre 2008 nach wie vor offen ist für SQL-Injection,
    • er bei einer anderen Architektur keinen Spaghetti-Code hätte,
    • er das Logging nicht hätte selbst implementieren müssen, da es das bereits fertig gibt
    • usw.

    Natürlich stellt sich nun die Frage, wie es besser wäre.

    Imho sollte Microsoft davon abkommen, mit jedem Release noch mehr Features in irgendwelche Listen-Controls zu stecken und noch mehr Databinding-Varianten zu schaffen. Denn was benötigt jeder ASP.NET-Entwickler immer wieder? Sicher nicht irgendwelche Listen mit Edit-Funktionen, sondern individuell und standardkonform gestaltete Formulare, an die er im Idealfall seine eigenen Objekte binden kann - und davon bitte nicht nur eines, denn eine Auftragsübersicht hat viel mehr Objekte und ist natürlich wiederverwendbar.

    • Warum ist Microsoft erst jetzt im Ansatz dabei, ein MVC-Pattern für ASP.NET zu implementieren, obwohl dieses bereits mit ASP.NET 1.1 realisierbar war? Microsoft bot bereits damals den - zugegebenermaßen monströsen -  User Interface Process Application Block an, der in die richtige Richtung zeigte - wie viele andere Dinge, die das Patterns and Practices Team geschaffen hat.
    • Warum schafft es Microsoft nicht, einen Designer für wiederverwendbare Custom-Controls - idealerweise als Views für MVP oder MVC-Pattern - zu entwickeln, die als eigene DLLs weitergegeben werden können?
    • Wieso versagt LINQ to SQL bei disconnected Szenarien nach einer so langen Entwicklungszeit trotzdem?
    • Wieso fließen die Arbeiten des Patterns and Practices Teams nicht stärker in die neuen Visual Studio Versionen ein?
    • Wozu gibt es ein Architecture Journal und ein MSDN-Magazine, in dem die Themen auf dem richtigen Level behandelt werden, wenn Visual Studio out-of-the-box zulässt, so ziemlich alles verkehrt zu machen, was in den beiden Magazinen gepredigt wird?
    • Wozu entwickelt Microsoft Unity, einen IoC/DI-Container und veröffentlicht Best Practices, wenn ich das mit meinem Spaghetti-Code gar nicht brauche?
    • Wozu soll ich mich an Prism orientieren, wenn ich meine WPF-Applikation mit Inline-Code "tunen" kann?

    Diese Liste liese sich noch beliebig weiterführen, aber ich denke, man versteht, worum es mir geht.

    Ein Argument, das Microsoft sicher in den Raum wirft, ist die Lernkurve für Neueinsteiger und Umsteiger - doch sollten nicht gerade diese lernen, wie man es einfach und dennoch richtig machen kann?

    Microsoft hat mit dem Team Foundation Server und Visual Studio Team System ein geniales Produkt für die professionelle Software-Entwicklung im Programm, das sich sicher noch besser verkaufen würde, wenn die Leute ein besseres Verständnis hätten für die Gründe, die hinter der Entwicklung von TFS u. VSTS standen: ins letzter Instanz ist es eine bessere Qualität beim Endprodukt, das damit oder dadurch ausgeliefert wird.

    Warum investiert Microsoft nicht die - dank des an sich wirklich gelungenen Visual Studio 2008 - gewonnenen Zeitvorteile bei der Entwicklung gegenüber Ruby, Java oder Perl, um die Lösungen nicht nur schnell, sondern auch wirklich sauber zu implementieren - auch für einen Einsteiger.

    Dass der Bedarf nach professionellen Ansätzen stärker denn je ist, zeigt die Entstehung der ALT.NET-Bewegung (die Dank Stefan Lieser inzwischen auch in Deutschland vertreten ist (warum nur in Gottes Namen bei Google ;-)) weltweit sowie die fast immer gleichen Fragen in den Foren, User Group Meetings, Konferenzen wie ASP-Konferenz, prio oder BASTA und zuletzt auch am ATE-Stand beim Launch von Visual Studio 2008, SQL Server 2008 und Windows Server 2008. Auch in Fachpublikationen wie dotnetpro, dotnet-Magazin oder ASP.NET Professional werden derartige Themen von den Lesern aufgesagt wie ein Schluck Wasser in der Sahara - warum nutzt Microsoft diese Chance nicht?

    Imho sollte .NET, nachdem inzwischen sogar Teile des Quellcodes offenliegen, nicht nur von oben nach unten - d.h. ASP.NET-Team -> Scott Guthrie (sein Blog = Bibel für .NET-Neuerungen) -> ASP Insiders -> MVPs -> Trainer -> Anwender funktionieren, sondern es sollten auch tatsächlich Lösungsansätze aus der Praxis, sei es von Usern oder dem hauseigenen Patterns and Practices Team in (ASP).NET zurückfließen.

    Dies erfordert natürlich auch von seiten der .NET-Community einen kriti(scher)en und fundiert(er)en Umgang mit .NET, anstatt (wie bisher), alles von Microsoft-Gegebene als das Maß der Dinge bei der Entwicklung anzusehen oder ansehen zu müssen...

So liebe Leser, jetzt seid Ihr dran ;-)

Wie und wo seht Ihr Euch, .NET und die Probleme, die es zu lösen gilt?

tags:

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Tuesday, May 06, 2008 11:10 PM | Feedback (12)

Team Foundation Server Team Build: TF10128 - "...more than the allowed 259 characters"


Wenn man Team Build mit den Standard-Einstellungen für den Team Build Agent verwendet, kann einem folgende Fehlermeldung sehr schnell ereilen:

"C:\Program Files\MSBuild\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets(737,5,737,5): error : TF10128: The path C:\Documents and Settings\NetworkService\Local Settings\Temp\GenericsDataLayer\GenericsDataLayerBuild\Sources\Development\Version 0.3\Source\Libraries\Microsoft Enterprise Library 3.1\Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration.Design.xml contains more than the allowed 259 characters. Type or select a shorter path."

In der Build-Übersicht sieht das ganze wie folgt aus:

Fehlerhafter Build

Der Grund hierfür liegt, wie bereits eingangs erwähnt, in der Konfiguration des zugehörigen Build Agents, genauer in der Einstellung Working Directory:

TeamBuild Agent1

Der Eintrag "$(Temp)" wird zur Build-Laufzeit umgewandelt in "C:\Documents and Settings\[BuildUserAccount]\Local Settings\Temp\".

Der Eintrag "$(BuildDefinitionPath)" wird zu "[ProjektName]\[BuildName]\Sources".

Danach wird schließlich noch der Pfad angehängt, der in der Build-Definition unter Workspace / Source Control Folder definiert ist (bzw. ab dort absteigend).

Allein der Eintrag "$(Temp)" ist - je nach Länge des BuildUserAccount-Namens zwischen 50 und 60 Zeichen lang.

Dies lässt sich leicht ändern, indem man Working Directory z.B. auf "C:\Build\" ändert:

TeamBuild Agent1

Allein mit dieser Änderung kann man je nach Länge des BuildUserAccount-Namens schon fast 50 Zeichen einsparen.

Weiter optimieren lässt sich das ganze natürlich, indem einen kürzeren Build-Namen wählt oder z.B. in der Build Definition im Workspace den Source Control Folder gezielter auswählt und damit die Zahl auszucheckenden Unterverzeichnisse verringert.

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Friday, May 02, 2008 9:46 PM | Feedback (0)

Team Foundation Server 2008 mit AssemblyVersion Task - rekursive Builds vermeiden


Christian Binder hat in seinem Blog-Post "Wie inkrementiere ich meine Assembly Versionen automatisch mit TFS2008 ?" ausführlich beschrieben, wie man die Assembly-Versionen mit Team Build in Team Foundation Server 2008 automatisch erhöhen lassen kann.

Allerdings läuft man dann in ein Problem, wenn man Continuous Integration mit Team Build nutzt und jeden Checkin dazu verwendet, um einen Team Build zu triggern: Die erhöhte Assembly-Version wird wiederum eingecheckt, was dann wieder einen Team Build anstößt usw., d.h. der Build-Prozess endet nie mehr.

Glücklicherweise gibt es seit Team Foundation Server 2008 für die Checkin-Comments ein Keyword, das man verwenden kann, um zu vermeiden, dass der damit kommentierte Checkin einen Build triggert.

Das Keyword lautet "***NO_CI***".

Damit muss das AfterCompile-Target wie folgt geändert werden:

<Target Name="AfterCompile" Condition="'$(IsDesktopBuild)'!='true'">
    <Exec WorkingDirectory="$(SolutionRoot)"

    Command="$(TF) checkin /comment:&quot;Auto-Build: Version Update ***NO_CI***&quot; /noprompt /override:&quot;Auto-Build: Version Update&quot; /recursive $(AssemblyInfoSpec)"/>
</Target>

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Thursday, May 01, 2008 8:29 PM | Feedback (0)

Team Foundation Server: Berechtigungen für Team Build setzen


Wie man eine Build Definition für Continuous Integration mit Team Foundation Server 2008 einrichtet, ist hier sehr gut beschrieben

Continuous Integration with Visual Studio 2008 (“Orcas”) Team Foundation Server

Nicht beschrieben ist jedoch, wie man nach der Installation von Team Build mit z.B. NT AUTHORITY\NETWORK SERVICE als Service Account einen Team Build auch erfolgreichen queuen kann.

Verwendet man nämlich eben diese Standard-Einstellungen, erhält man immer folgende Fehlermeldungen:

TF215085: An error occurred while connecting to agent \[ProjectName]\[BuildAgentName]

TF209009: The account [BuildAgentAccount] is not authorized to communicate with Team Foundation Server [TeamFoundationServer]. Verify that the account is a member of the Build Services security group for the appropriate team project on the Team Foundation Server and that the account's password has not expired.

Die in der Fehlermeldung TF209009 Berechtigungen lassen sich über den Team Explorer in den "Group Membership"-Einstellungen des jeweiligen Projektes leicht ändern.

Allerdings bleibt die Fehlermeldung auch danach bestehen.

Der Grund hierfür ist, dass der User NT AUTHORITY\NETWORK SERVICE noch der Gruppe "Team Foundation Licensed Users" hinzugefügt werden muss.

Dies lässt sich über das Kommandozeilentool tfssecurity.exe in C:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools erledigen:

C:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools>tfssecurity /server:xxtfs1 /g+ "[server]\Team Foundation Licensed Users" n:"NT AUTHORITY\NETWORK SERVICE"


TFSSecurity - Team Foundation Server Security Tool
Copyright (c) Microsoft Corporation.  All rights reserved.

The target Team Foundation Server is xxTFS1.
Resolving identity "[server]\Team Foundation Licensed Users"...
[SERVER]\Team Foundation Licensed Users
Resolving identity "n:NT AUTHORITY\NETWORK SERVICE"...
  [U] NT AUTHORITY\NETWORK SERVICE
Adding NETWORK SERVICE to Team Foundation Licensed Users...
Verifying...

SID: S-1-9-1551374245-1204400969-2402986413-2179408616-0-0-0-0-4

DN:

Identity type: Team Foundation Server application group
   Group type: LicenseesApplicationGroup
Project scope: Server scope
Display name: Team Foundation Licensed Users
  Description: Users that are licensed to use the Workgroup Edition of Team Foun
dation Server

2 member(s):
  [U] NT AUTHORITY\NETWORK SERVICE
  [U] xxxxxxxxxxxxx\xxxxxx (Alexander Zeitler)

Member of 1 group(s):
e [A] [SERVER]\Team Foundation Valid Users

Done.

 

Nach einem erneuten Aufruf von Queue New Build klappt dann auch der Buildvorgang (möglicherweise muss man vorher noch den Status des zugewiesenen Build Agents von "Unreachable" auf "Enabled" zurücksetzen).

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Wednesday, April 30, 2008 9:41 PM | Feedback (0)

AvalonDock v1


Wer mit WPF ein Docking à la Visual Studio realisieren möchte, sollte sich die frei verfügbare AvalonDock-Library angucken:

AvalonDockTeaser

tags:

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Wednesday, April 30, 2008 12:18 PM | Feedback (0)

IETester


IETester ist ein Tool, das die Rendering- und JavaScript-Engine von IE 5.5, 6.0, 7 und 8 Beta 1 in einer Windows-Oberfläche zusammenfasst und auf diesem Wege eine einfache Kontrolle der jeweiligen Renderingergebnisse ermöglicht:

ietester-0_2

via High Resolution Weblog.

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Friday, April 25, 2008 11:57 AM | Feedback (0)

WCF 3.5 Security Guidelines


Die vor kurzem veröffentlichte WCF Security Guidance wurde um die WCF 3.5 Security Guidelines erweitert, welche folgende Themen umfasst:

  • Auditing and Logging
  • Authentication
  • Authorization
  • Binding
  • Configuration Management
  • Exception Management
  • Hosting
  • Impersonation and Delegation
  • Input/Data Validation
  • Proxy Considerations
  • Deployment considerations

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Thursday, April 17, 2008 8:12 PM | Feedback (0)

Neuer Prism Drop und PrismContrib Project


Microsoft hat unter http://www.codeplex.com/prism/Release/ProjectReleases.aspx?ReleaseId=12613 einen neuen Drop von Prism veröffentlicht.

Verbesserungen sind:

  • Enabled TFS Integration for releases
  • IMetadataInfo removed from the Prism framework. The application developer is now responsible for providing a model in order for the headers to bind to. We provide guidance on how to accomplish this in the RI though. Reason: flexibility.
  • MultiDispatchCommand renamed to CompositeCommand
  • DelegateCommand is now generic for compile time check of the parameter type (not at the XAML level though)
  • Bootstrapper refactored for unit testing. Added module initialize.
  • Random market feeds updates the UI continuously.
  • Ability to add named views to regions that you can easily retrieve later.
  • Added logger interface and default enterprise libary logger implementation
  • Several more refactorings and consistency fixes (lots!).
  • New UI Composition QuickStart. Demonstrates shell, global, local regions, and views. Note: This Quickstart uses a branch of the Prism framework source. We will be merging into the main.

Außerdem wurde das PrismContrib Project gestartet, das es der Community ermöglicht, Prism zu erweitern und die Änderungen bereitzustellen.

Geplant sind derzeit

  • SilverlightAG - Prism for Silverlight
  • Prism Extensions - Add-on commands, services, regions, etc to aid you in your Prism development

Bookmarks:  Beitrag zu Mr.Wong hinzufügen   Beitrag zu YiGG.de hinzufügen   Beitrag zu Digg.com hinzufügen   Beitrag zu del.icio.us hinzufügen   Beitrag zu Google Bookmarks hinzufügen   Beitrag zu Linkarena hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen   Beitrag zu WindowsLiveFavorites hinzufügen  

author: Alexander Zeitler | posted @ Thursday, April 17, 2008 12:48 PM | Feedback (0)