Auch von meiner Seite ein herzliches Hallo vom SharePoint-Advents-Blog. Meinen ersten Artikel werde ich dem Thema Performance widmen und 10 Tipps geben, wie eine SharePoint-Umgebung in Sachen Performance optimiert werden kann.

1. Datenbank- vom Nutzer-Traffic separieren
SharePoint kommuniziert unwahrscheinlich viel mit den Datenbanken im Hintergrund. Es werden nicht nur alle Inhalte und Einstellung einer Website in der Inhalts- bzw. Konfigurationsdatenbank gespeichert, auch Anwendungen wie etwa die Suche- oder die Profildienste provozieren eine extrem hohe Datenbanklast. Um  einen optimalen Durchsatz von den Frontend- oder Anwendungsservern zum SQL Server zu erzielen, empfiehlt es sich, netzwerkseitig diese Kommunikation vom Nutzer-Traffic zu trennen.

2. SQL-Parameter einstellen
SQL-Profis wissen, dass die Datenbank-Engine zahlreiche Möglichkeiten liefert, die Performance der Datenbank selbst zu optimieren. Da auch SharePoint auf den SQL-Server zurückgreift, sollte auch diese Ebene betrachtet werden. Erster Schritt ist die physikalische Trennung der SharePoint-Datenbankdateien von anderen Datenbanken sowie der Temp-DB. Auch die Log-Files sollten auf einer separaten Platte abgespeichert werden. Weiterhin ist es lohnenswert die Temp-DB zu optimieren, wie in diesem Artikel beschrieben. Zusätzlich zu diesen beiden Schritten, kann die Größe der Inhaltsdatenbanken auf einen festen Wert, von zum Beispiel 80 Gigabyte gesetzt werden. Normalerweise erhöht der SQL Server die Datenbankdateien in kleinen Schritten. Diese Einstellung kann auf einen festen Wert von beispielsweise 10 Megabyte geändert werden.

3. Mehrere Inhaltsdatenbanken verwenden
SharePoint liefert die Möglichkeit, Site Collections in unterschiedlichen Inhaltsdatenbanken abzuspeichern. Von dieser Option sollte man unbedingt Gebrauch machen und einen Weg finden, die jeweiligen Websitesammlungen datenbankseitig voneinander zu trennen. SharePoint speichert dummer Weise die meisten Inhalte einer Website (Ankündigungen, Aufgaben oder Termine) in einer SQL-Tabelle ab. Mit einer immer höher werdenden Anzahl an Webseiten in einer Datenbank sinkt demensprechend die Performance der gesamten Plattform. Daher sollte man unbedingt mehrere Inhaltsdatenbanken planen.

4. SQL-Index-Daten defragmentieren
Der SQL Server verwaltet intern eine Reihe von Indizes zur Speicherung verschiedener Datenbanken. Da diese Dateien schnell fragmentiert werden können, empfiehlt es sich, die Daten im Rahmen der regelmäßigen Wartungsarbeiten zu defragmentieren.

5. Separation von Webanwendungen und Prozessen
Bestimmte SharePoint-Anwendungen erfordern auf den Servern unter Umständen einen hohen Ressourcenbedarf. Der bekanntestes dieser Dienste ist der Indizierungsprozess der Suche. Um auf den Frontend-Servern für die Benutzer spürbare Seiteneffekte zu vermeiden, sollten diese ressourcenintensiven Dienste auf einen separaten Application Server ausgelagert werden.

6. HTTP-Komprimierung verwenden
Die Internet Information Service (IIS) liefern die Möglichkeit, die vom IIS ausgelieferten HTTP-Pakete zu komprimieren. Auch die Datenpakete von SharePoint lassen sich über diese Technik verkleinern, daher sollte auch bei SharePoint-Farmen von der HTTP-Komprimierung Gebrauch gemacht werden.

7. CSS- und JavaScript-Optimierung
Besonders bei angepassten Webseiten für Intranets oder Internetauftritte empfiehlt es sich, einen guten Plan für die Umsetzung von Cascading Style Sheets oder JavaScripts zu haben. Lohnenswert ist es, die jeweiligen Daten zu minimieren, also Zeilenumbrüche bzw. Leerzeichen vor der Auslieferung zu entfernen. Zudem sollte die Anzahl der ausgelieferten CSS-Dateien möglichst gering gehalten werden. Bei Internetseiten sollten die CSS-Klassen des Edit-Modes zum Beispiel nicht im View-Mode heruntergeladen werden müssen. Bei JavaScripts liefert SharePoint 2010 die Möglichkeit, bestimmte Dateien oder Scripts nur dann zu laden, wenn Sie erforderlich sind (on demand).

8. Blob-Caching verwenden
Grafiken können durch das Blob-Caching auf den Frontend Servern für eine definierte Zeit zwischengespeichert werden. Die dadurch entstehende Ersparnis an Datenbank-Traffic kann unter Umständen sehr groß sein.

9. Output-Cache verwenden
SharePoint integriert eine Caching-Funktion mittels derer komplette Seite zwischengespeichert werden können. Das Output-Caching ist standardmäßig deaktiviert und sollte mindestens bei anonymen Internetseiten aktiviert werden.

10. Site Definitions und Features für Templates verwenden
Zusammen mit dem SharePoint Designer lassen sich Master- oder Content-Seiten unwahrscheinlich einfach anpassen und ggf. auch als Vorlage speichern. Problem dabei:  Nach der Anpassung werden die Master- bzw. ASPX-Dateien komplett in der Datenbank gespeichert und auch von dieser Stelle geparst. Und wie wir wissen, erfordert SharePoint ja schon genügen Datenbanklast. Aus diesem Grund sollten Websitevorlagen, Masterseiten oder Page Layouts nicht direkt mit dem SharePoint Designer angepasst werden, sondern stattdessen als Feature auf den Frontend-Server bereitgestellt werden. In Sachen Performance ist es auch von Vorteil JavaScript- oder CSS-Dateien im Layouts-Verzeichnis abzulegen. Die Prämisse sollte stets sein, den Traffic hin zur Datenbank möglichst gering zu halten.

So, das war mein erster Adventsbeitrag. Ich hoffe, dass der eine oder andere Tipp nützlich ist. Neben diesen Vorschlägen sollte man natürlich die Programmierebene nicht vernachlässigen und bei seinen individuellen Anwendungen auf eine vernünftige Performance achten. Wie die Performance einer SharePoint-Webseite gemessen werden kann, wir Christian morgen beschreiben.

Mit dem Release von SharePoint 2010 wurde auch die Komponente LINQ 2 SharePoint ausgerollt. Der LINQ Provider für SharePoint 2010 erlaubt es, streng typisierte und kompilierbare Abfragen für SharePoint Listen zu schreiben.

Vor SharePoint 2010 musste jeder SharePoint Entwickler CAML – eine XML basierte SharePoint Abfragesprache – Abfragen erstellen um damit Elemente aus Listen zu selektieren. Der LINQ Context bietet nun einen Wrapper um die Sprache CAML Abfragen an. LINQ 2 SharePoint soll gerade auf einfache Customizings zielen und unerfahrenen SharePoint Entwickler den Einstieg auf die Anwendungsplattform erleichtern.

 

LINQ

Wer zu diesem Zeitpunkt noch keine LINQ Kentnisse hat, der sollte sich eventuell 30 Minuten Zeit nehmen um kurz die Syntax und die Möglichkeiten von LINQ kennenzulernen.

Das kostenlose LINQPad (http://www.linqpad.net/) bietet einen direkten Einstieg in den LINQ Syntax. Wer gerade keinen SQL Server zur Hand hat, oder das ganze bequem auf seinem Netbook machen möchte, der kann mit wenig Aufwand eine Demodatenbank auf SQL Azure erstellen, um eine Datenquelle für die LINQ Queries zu haben. (http://windowsazure.com/)

Auf der MSDN findet sich auch eine Sammlung von 101 LINQ Beispielen in C# und VB.NET (http://msdn.microsoft.com/en-us/vstudio/aa336746), meine Empfehlung ist es an dieser Stelle einfach die ersten N Beispiele sich online anzuschauen und einfach ein wenig mit dem genialen LINQPad zu experimentieren.

 

SPMetal

SPMetal ist ein kleines CommandLineTool, welches dazu verwendet wird, den LINQ 2 SharePoint Context für eine bestimmte SharePoint Webseite zu erstellen. Das Tool kann im Bin Folder des SharePoint Roots gefunden werden. (%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\BIN\SPMetal.exe)

SPMetal wird lediglich über ein paar Parameter konfiguriert und somit an die Umgebung angepasst.

 

Parameter

Beschreibung

web

URL der SharePoint Webseite

code

Absoluter Pfad für die Ausgabedatei. (den generierten LINQ DataContext)

language

Gibt die Programmiersprache an, in welcher der Context generiert werden soll.

namespace

Git den Namensraum an, der für den Context und die Entity-Klassen verwendet werden soll

user

Definiert den Benutzer, in dessen Kontext der Code generiert werden soll.

password

Das Passwort des optional angegebenen Benutzers

parameters

Wird verwendet um den Pfad zu einer XML Konfigurationsdatei anzugeben. Durch die Verwendung dieses Parameters können die Standardeinstellungen von SPMetal überschreiben werden

 

Ein LINQ Kontext in C# kann in der einfachsten Variante über folgenden Aufruf erstellt werden:

SPMetal.exe /web:http://sp2010dev /code:IntranetSite.cs

Um für die gleiche Seite einen LINQ Kontext in Visual Basic zu erstellen sieht der Aufruf wie folgt aus:

SPMetal.exe /web:http://sp2010dev /code:IntranetSite.vb

SPMetal ermittelt, falls nicht explizit angegeben, die gewünschte Programmiersprache über die FileExtension des Code Parameters. Wenn man die Extension des Outputfiles nicht explizit angibt, so muss der Aufruf um den Parameter Language erweitert werden

SPMetal.exe /web:http://sp2010dev /language:vb /code:IntranetSite

Integration in ein SharePoint Projekt

Ein bereits erstellter LINQ 2 SharePoint DataContext kann recht einfach in ein vorhandenes SharePoint Projekt integriert werden.

clip_image002Die generierte Datei kann einfach mittels Drag and Drop zum Projekt hinzugefügt werden. Versucht man sein Projekt an dieser Stelle zu kompilieren, so werden prompt diverse Fehlermeldungen präsentiert. Der Grund hierfür ist recht schnell gefunden, das SharePoint Projekt benötigt einen AssemblyVerweis auf Microsoft.SharePoint.Linq.dll. Wie die meisten SharePoint spezifischen DLLs findet man auch diese im ISAPI Ordern unterhalb des SharePoint Roots.

Mit der neu hinzugefügten Referenz auf die LINQ Assembly sollte sich das SharePoint Projekt jetzt wieder problemlos kompilieren lassen.

 

Stay up-to-date

Bereits an dieser Stelle kann man mit sehr wenig Aufwand nachhaltige Fehlerprävention betreiben. Die von mir zuvor beschriebene Erstellung des LINQ 2 SharePoint Contextes sollte man als PreBuild Ereignis eintragen.
Dadurch kann sehr einfach sichergestellt werden, dass der LINQ 2 SharePoint Kontext stets aktuell ist und sofern sich an der Umgebung etwas ändert, man als Entwickler unmittelbares Feedback erhält.

Die in den Build-Ereignissen existierenden MSBuild Parameter erlauben es darüber hinaus auch, die Dateien noch vor dem Kompilierungsprozess im Projektordner zu überschreiben.

clip_image003

Somit sind alle Voraussetzungen für den Einsatz von LINQ 2 SharePoint gegeben, jetzt kann mit der Entwicklung begonnen werden.

 

Getting started

In Abbildung 3 sieht man eine einfache LINQ 2 SharePoint Abfrage. Es werden hier sämtliche Kunden, die aus Deutschland stammen ermittelt und deren Name wird auf der Console ausgegeben.

clip_image005

Eigentlich nichts spektakuläres, dennoch lassen sich unter genauerer Betrachtung einige Fehler, Probleme und Unschönheiten finden, die man als SharePoint Entwickler im täglichen Leben auslassen bzw. umgehen sollte.

 

Daily LINQ 2 SharePoint

Das erste Problem, welches unser einfaches LINQ 2 SharePoint Beispielscript beinhaltet ist, dass der Context nicht freigegeben wird. Man kann den LINQ 2 SharePoint DataContext mit einer Datenquellenverbindung gleichsetzen, auch hier werden unmanaged Resourcen verwendet, die es wieder freizugegeben gilt.

Analog zum Disposing von SPWeb und SPSite, bietet sich auch hier das using-Schlüsselwort an.

 

clip_image007

 

Gut, jetzt sollte zumindest das offensichtliche Speicherproblem behoben sein, doch analysieren wir das kleine Codefragment weiter.

Die Select() Methode von IEnumerable<T> wird dazu verwendet den Rückgabetyp des gesamten LINQ Ausdrucks zu definieren. Weil diese Abfrage gegen eine Kontaktliste in SharePoint ausgeführt wird, ist unser Rückgabetyp hier Contact. – Das generierte Gegenstück zum Inhaltstyp unserer SharePoint Seite.

An dieser Stelle ist es wichtig, dass man sich wieder darauf besinnt, dass der LINQ Provider für SharePoint lediglich ein Wrapper um CAML darstellt.

Wenn man in Umgebungen arbeitet wo man auf Datentransfermengen und/oder Performance achten muss, dann sollte man unbedingt die Abfrage anpassen, so dass lediglich die benötigten Werte von der Datenquelle abgefragt und zurückgegeben werden.

 

clip_image009

 

Aktivert man auf dem LINQ 2 SharePoint Context das Logging, so sieht man bei der Ausführung unmittelbar, dass sich die CAML Query geändert hat. Durch das hinzufügen des Anonymen Typs in der Select() Methode, wurden in der CAML Query ViewFields integriert. Durch das Verwenden von ViewFields in CAML wir dem SharePoint signalisisert, dass lediglich die angegebenen Felder an den Aufrufer übertragen werden sollen. Ohne ViewFields werden alle Spalten eines Elementes zurückgegeben.

Das dritte Problem des Snippets ist eher ein strukturelles Problem. In diesem Snippet wird eine Abfrage direkt auf dem LINQ 2 SharePoint Context abgesetzt.
Diese direkte Interaktion mit dem LINQ 2 SharePoint Context sollte durch ein Repository Pattern (http://msdn.microsoft.com/en-us/library/ff649690.aspx) gekapselt sein, so dass nicht an beliebigen Stellen im Anwendungscode der Context verwendet wird.

Vielmehr sollte es einen Service gegeben, welcher von den jeweiligen Komponenten verwendet wird um die benötigten Objekte aus der SharePoint Liste zu erhalten.

clip_image010

 

Die neuste Version des Snippets verwendet den CustomerService. Der CustomerService übernimmt die Domainlogik und fragt die Elemente beim CustomerRepository nacht. Erst das CustomerRepository hat dann einen direkten Zugriff auf den LINQ 2 SharePoint Context.

In diesem Stadium kann das LINQ Query ohne weitere Bedenken eingesetzt werden. Doch LINQ 2 SharePoint hat noch ein paar weitere Interessante Aspekte.

 

Semi-Efficient-Queries

Die Feautres von LINQ wirken auf den ersten Blick schier unbegrenzt. Alles scheint möglich zu sein, sämtliche Aspekte, die man im Kontext der Datenabfrage oder Datenaggregation erwartet, bietet LINQ nun auch dem SharePoint Entwickler direkt auf der Basis von SharePoint Listen an.

Nun, so ganz stimmt dies nicht. LINQ 2 SharePoint fungiert als Wrapper um CAML und kann somit auf effiziente Weise nur die Abfragen und Aggregationen ausführen, welche auch nativ in CAML möglich sind.

Damit aber auch der SharePoint Entwickler Werte einer Gruppierung summieren, oder eine bestimmte Anzahl von Elementen aus der Ergebnismenge überspringen kann, gibt es in LINQ 2 SharePoint ein Konzept welches sich Semi-Efficient-Queries nennt.

Einfach erklärt bedeutet dies, das Abfragen in zwei Schritten ausgeführt werden, sobald sie eine von CAML nicht unterstützte Funktion beinhalten.

Eine genaue List der Methoden, die nicht nativ von CAML unterstützt werden findet ihr auf der MSDN (http://msdn.microsoft.com/en-us/library/ee536585.aspx).

 

Der RunWithElevatedPrivileges Bug

Wer kennt sie nicht, die RunWithElevatedPrivileges() Methode der Klasse SPSecurity? Dank dieser Methode ist es uns möglich direkt in einen anderen Benutzerkontext zu impersonieren.
Gerne wird hier der SharePoint Farm Kontext genommen, da dieser natürlich über weitgehende Rechte verfügt. Doch wenn man mit LINQ 2 SharePoint arbeitet, existiert hier noch ein Problem in der SharePoint API.

So führt dieses Script

 

clip_image012

nicht dazu, dass der linqContext im Kontext der Farm läuft.

Sofern dieser Code aus SharePoint selbst aufgerufen wird, ist linqContext immernoch im Kontext des ursprünglichen Benutzers und kann somit vielleicht nicht auf die gewünschten SharePoint Elemente zugreifen.

Die Ursache liegt wie bereits gesagt in der SharePoint API selbst, genauer gesagt in der Klasse SPServerDataConnection aus dem Namespace Microsoft.SharePoint.Linq.Provider.

clip_image014

Der Screenshot zeigt die Klasse im .NET Reflector. Hier ist zu sehen dass, falls der SPContext gefüllt ist, einfach dessen Werte (Current.Site, Current.Web) verwendet werden, unabhängig davon ob eventuell eine Impersonierung vorliegt.

Der zweite Fehler findet sich im If Statement welches der Variable defaultWeb zugewiesen wird.

Angenommen es wird impersoniert auf ein SPWeb, welches sich auf einer anderen SiteCollection befindet, so erhalten wir hier sogar eine FileNotFoundException zur Laufzeit, weil die API immer die SiteCollection aus dem SPContext als Grundlage nimmt.

 

Glücklicherweise lässt sich der Bug mit etwas Mehraufwand umfahren. Damit wir korrekt impersonieren können im Zusammenhang mit LINQ, muss der SPContext neu gesetzt werden. Da die Current Property von SPContext ReadOnly ist, muss zuerst der gesamte HttpContext gesichert! und überschrieben werden. Mit dem neuen HttpContext kann dank SPControl auch der SPContext neu initialisiert werden. Ganz wichtig ist es, nach der eigenen Logik den ursprünglichen Context wieder herzustellen (hier der finally Block)

 

clip_image016

 

 

Mein Fazit

Durch LINQ 2 SharePoint wird .NET Entwickler natürlich der Einstieg auf die SharePoint Plattform etwas einfacher gemacht und für den erfahrenen SharePoint Entwickler sind es sicherlich die qualitätssteigernden Aspekte wie StronglyTyped- und Compiled- Queries.

Dennoch ist es wichtig um die hier beschriebenen Probleme und Stolperfallen zu wissen, weil sonst der Zeitgewinn schnell aufgesogen wird.

Beachtet man jedoch diese einfachen Regeln, so kann LINQ 2 SharePoint euren Code sicherer, lesbarer und sicherlich auch einfacher machen, als es die großen CAML-String-Blöcke noch in SharePoint 2007 gemacht haben :)

 

Thorsten

Mit Office 365 bietet sich eine super Gelegenheit in die Welt von SharePoint einzusteigen: keine eigene Installation eines Servers – sondern einfach mit ein paar wenigen Klicks, schon hat man sein eigenes SharePoint. Das möchte ich kurz herzeigen – anhand einer Trialversion von Office 365 – P-Plan. Der P-Plan ist geeignet für 1-25 User. Wer die Enterprise Features des E-Plans nicht benötigt, kann diesen verwenden.

Zunächst habe ich mich zu einer Trial angemeldet – die ist nach wenigen Minuten einsatzbereit.

image

Mit SharePoint Online steht dann ein Portal zur Verfügung, mit dem Dokumente ausgetauscht werden können, verschiedene User schnell miteinander arbeiten können, Dokumente von überall abrufbar sind und ich auch eine eigene kleine Website sofort einsetzen kann (mehr dazu in einem späteren Blogpost). Zusätzlich kann ich darüber auch Access Datenbanken zur Verfügung stellen – die eigene DVD Sammlung schnell online.

Jede Menge Platz gibt es im P-Plan auch: 10GB pro Abonnement, zusätzlich 500 MB / Benutzer. Fass Sie mit externen Usern zusammenarbeiten wollen – im P-Plan können Sie dazu maximal 50 externe Benutzer einladen.

Einen Kalender in SharePoint Online hinzufügen

Ein Kalender ist in SharePoint Online schnell hinzugefügt. Zuerst einmal die Seite bearbeiten:

image

Dann im Register bearbeiten auf “einfügen” klicken:

Abb028

Mit Klick auf Kalender ist der Kalender schon eingefügt.

Abb029

Dieser Kalender eignet sich hervorragend als Gruppenkalender und kann auch einfach in Outlook eingebunden werden. Der Vorteil ist dabei, dass er auch in Outlook immer mit SharePoint Online synchron ist und alle im Team immer die aktuellen Teamtermine abrufen können. Über Kalenderoptionen kann er mittels der Schaltfläche “Verbindung mit Outlook herstellen” mit Outlook verbunden werden.

Abb030

Tipp: dies ist übrigens auch eine hervorragende Möglichkeit, Gruppenkalender, die bisher in öffentlichen Ordnern geführt wurden, in SharePoint Online abzubilden.

Abb031

Der Kalender ist damit in Outlook eingebunden und kann dort ganz einfach verwendet werden!

Abb032

Viel Erfolg mit den ersten Schritten in Office 365!

Das Microsoft Certified Master Program ist das High-End Training für SharePoint Cracks – in drei Wochen intensiven Trainings kann man dabei den Titel Microsoft Certified Master on Microsoft SharePoint Server 2010 erwerben, vorausgesetzt natürlich, man qualifiziert sich für die Teilnahme und wird von Microsoft dazu eingeladen.

Marek Czarzbon, der Leiter unserer SharePoint User Group Nürnberg/Erlangen, ist den Weg gegangen und hat mir in einem Videointerview ein wenig von seinen Erfahrungen berichtet.

 

[youtube http://www.youtube.com/watch?v=4hn4Ve4EraA]

 

Gedicht

Ich möchte das erste Türchen des SharePoint Adventskalenders 2011 dazu nutzen allen Beteiligten Personen an dieser Stelle zu danken. Es freut mich sehr, das meine Idee auf solches Wohlwollen gestoßen ist.

 

Im Laufe des Advents werden die SharePoint und Office365 MVPs Erfahrungsberichte und Tips rund um die SharePoint Welt mit euch teilen. Die Einträge zielen auf unterschiedliche Bereiche. Vom Anwender über den IT-Pro bis zum Developer, für jeden wird etwas im Adventskalender dabei sein, daher lohnt es sich täglich auf www.SharePointAdvent.de vorbeizuschauen.

 

Das Gewinnspiel

Wie auch im Jahr 2009 haben wir wieder einige sehr nette, der SharePoint Community wohlgesonnene Unternehmen gefunden, die uns ein paar sehr coole Preise zur Verfügung gestellt haben.

Was müsst Ihr tun um einen dieser Preise zu gewinnen? Nun ganz einfach! Verfasst euren Featurewunsch für die vNext von SharePoint einfach als Kommentar auf unserem Blog!  An der Verlosung nehmen automatisch alle Kommentare mit Featurewunsch für die vNext von SharePoint teil, die zwischen dem 01.12.2011 und dem 25.12.2011 abgegeben wurden.

Eine Verlosung der Sachpreise findet in der 1. Kalenderwoche von 2012 statt. Alle Gewinner werden via E-Mail informiert und in einem weiteren Blogartikel genannt.

Der Rechtsweg ist ausgeschlossen.

 

Ein herzliches Dankeschön an

 

Intel12

 

ShareConf20124

 

AvePoint_logo4

 

Logo_dotNet_UserGroup_32EA450B4

 

ExpertsInside8

 

Microsoft TechNet

 

 

Es bleibt mir also nur noch euch allen viel Spaß mit dem SharePoint Adventskalender zu wünschen.

 

Thorsten

.. morgen geht es los mit dem SharePoint Advent.

Was? Immer noch nix mit dem Weihnachtsbaum? Wie wäre es denn mit der NERD-Variante?

[vimeo http://vimeo.com/8351384]

…dann geht’s los mit dem SharePoint Advent.

Wie immer noch kein Weichnachtsbaum? Wie wäre es denn mit einem aus Plastik ?

[vimeo http://vimeo.com/7888717]

[vimeo http://vimeo.com/8045212]

dann geht es los mit dem SharePoint Advent..

Apropos: Habt ihr schon einen Weihnachtsbaum ?

[vimeo http://vimeo.com/7898522]

.. dann geht es los mit dem SharePoint Advent

[vimeo http://vimeo.com/7935720 w=640&h=320]

dann geht’s los mit dem SharePoint Advent

[vimeo http://vimeo.com/17455653 w=640&h=320]

 

Hinweis zum Kommentar

Zum Kommentieren der Beiträge (und damit zur Teilnahme am Gewinnspiel) bitte auf die Zahl in der Bubble neben dem Titel des Blogeintrags klicken, dies öffnet das Kommentarformular!

Sponsored by

Subscribe

Über

Der SharePoint Advent

Ein Gemeinschaftsprojekt der deutschsprachigen SharePoint MVP's

Rubriken

Impressum

(c) 2011 SharePointCommunity