SPAdventUnter den 45 gültigen Einsendungen für das Gewinnspiel des SharePoint Adventskalenders 2011 wurden folgende Gewinner ermittelt. (Die Namen wurden entsprechend eurer Kommentare auf http://www.SharePointAdvent.de verwendet)

 

Jeweils eine Microsoft Touch Maus (gespendet von Microsoft TechNet Schweiz) gewinnen

  • Stefan Bauer, Christian, Marek Czarzbon, Michael Denzler, Konstantin Denerz, Schnella,
  • Daniel, Thomas Tuttenuj, Michi Hirczy, Lars Natus

 

1x Visual Studio Lightswitch (gespendet von der .NET UserGroup Saar) hat Ueli Kuratli gewonnen.

 

1x Microsoft LifeCam Studio (gespendet von Experts Inside) hat Patrick Carl gewonnen

 

1x Eintrittskarte für die ShareConf 2012 (gespendet von der HLMC) hat Michael Mamerow gewonnen

 

1x Nokia Lumia 800 (gespendet von AvePoint) hat Christian Dyck gewonnen

 

Der Hauptpreis (1 ExoPC gespendet von Intel) geht an Gerhard Berthold.

 

Alle Gewinner werden heute per Mail angeschrieben. Und im Anschluss daran werden die Gewinne dementsprechend von uns versendet. Vorab schon mal viel Spaß mit euren Gewinnen.

 

 

Thorsten Hans

Allen Teilnehmer die leider nicht unter den Gewinnern waren, dennoch viele Dank für eure Beiträge. Eventuell wird es ja beim Adventskalender 2012 hinhauen.

Das letzte Türchen geht auf und der SharePointAdvent neigt sich dem Ende zu

Heute natürlich kein SharePoint – es ist Weihnachten !

Allen, die am SharePointAdvent teilgenommen haben, ein herzliches Dankeschön und frohe Feiertage. Vielen Dank auch an die Sponsoren des Gewinnspiels, wir verlosen die Gewinne Anfang 2012.

Beinahe ist Weihnachten, da dachte ich, ich könnte euch was unter den Weihnachtsbaum legen, das mri selbst viel gebracht hat.

Wenn man hie und da ein Demoszenario aufsetzt wie wohl wir aller hier, dann wäre es ja schön, auch ein paar Personen mit im AD zu  haben, um auch den Profilimport zu testen und den Organisational Browser zeigen zu können. Aus diesem Grund habe ich ein Script gesucht, der mir User im AD anlegt. Ich habe Teile gefunden und den Script vervollständigt. Zusätzlich habe ich euch ein Excel mit Userdaten, die ihr verwenden könnt.

Vorgehen:

  1. Eine OU “Employees” anlegen
  2. den roten Teil im Script anpassen
  3. Script laufen lassen
  4. Vorgesetzte zuordnen (sorry, das hab ich nicht auch noch gemacht, so könnt ihr das CSV so umgestaltenbzw. erweitern wie ihr wollt)

Hier der Script:

$domain = (get-addomain).distinguishedname
$path = “OU=Employees,$domain”
$employees = Get-ADObject -Filter {distinguishedname -eq $path}

$users = import-csv -Delimiter “;” -Path “C:\Scripts\usersToBeCreated.csv”
$ldappath = “LDAP://$path
$container = [ADSI] $ldappath
$users | foreach {
$first = $_.FirstName
$last = $_.LastName
$phone=$_.Phone
$mobile=$_.Mobile
$office=$_.Office
$job=$_.Job
$username = “$first” + “.” + “$last”
$email = “$username” + “@szu.local
$newUser = $container.Create(“User”, “cn=” + “$first” + ” ” + “$last”)
$newUser.Put(“sAMAccountName”, $username)
$newUser.Put(“userPrincipalName”,”$username” + “@szu.local”)
$newUser.Put(“givenname”,$first)
$newUser.Put(“sn”,$last)
$newUser.Put(“mail”,$email)
$newUser.Put(“description”,”Experts Inside User”)
$newUser.Put(“co”,”Switzerland”)
$newUser.Put(“company”,”Experts Inside GmbH”)
$newUser.Put(“countryCode”,756)
$newUser.Put(“displayName”,”$first” + ” ” + “$last”)
$newUser.Put(“telephoneNumber”,”$phone”)
$newUser.Put(“l”,”Wil”)
$newUser.Put(“mobile”,”$mobile”)
$newUser.Put(“physicalDeliveryOfficeName”,”$office”)
$newUser.Put(“postalCode”,”9500″)
$newUser.Put(“st”,”SG”)
$newUser.Put(“streetAddress”,”Alleestrasse 4″)
$newUser.Put(“title”,”$job”)
$newUser.SetInfo()
$newUser.psbase.InvokeSet(‘AccountDisabled’, $false)
$newUser.SetInfo()
$newUser.SetPassword(“SpAdvent2011″)
}

Dazu zugehörige CSV:

DOWNLOAD

So long, Samuel

In meinem letzten Post für den SharePoint Adventskalender 2011 möchte ich ein kleines Schmuckstück in der SharePoint Welt vorstellen. clip_image002Unser amerikanischer SharePoint MVP Kollege Marc D Anderson entwickelt seit August 2009 kontinuierlich an SPServices.

SPServices ist ein jQuery Plugin. Den größten Bestandteil von SPServices stellen die Wrapper für die SharePoint ASMX Webservices dar. Mit diesen Wrappern sind Aufrufe für die meisten in SharePoint 2007 und SharePoint 2010 vorhandenen. Hier ein Auszug der aktuell implementierten Methoden. Die gesamte Liste findet ihr in der Doku auf CodePlex.

clip_image003

Die SharePoint ASMX-WebServices werden auch in SharePoint 2010 noch sehr häufig verwendet. Unter anderem werden die Attachments von ListItems über die GetAttachmentCollection Methode geladen. Das neue Client Object Model (CSOM) stellt nämlich keinerlei Möglichkeit bereit Anhänge von ListItems zu laden.

Ohne SPServices müssten wir nun an dieser Stelle die SOAP Message erstellen, damit der WebService die Attachments des gewünschten ListItems zurückgeben kann. Doch Marc’s SPSerives nimmt genau diese Arbeit ab.

 

Um SPServices in SharePoint nutzen zu können muss zunächst jQuery in SharePoint geladen werden. Christian hat in seinem Eintrag ja bereits beschrieben wie dies gemacht wird. Darüber hinaus muss man nun noch SPServices selbst in SharePoint integrieren. Das Laden von SPService kann auf die gleiche Art erreicht werden wie bei jQuery.

In meinem Beispiel wird die Lösung auf einem OnPremise SharePoint ausgeführt, daher können beide JavaScript Files auch bequem mittels DelegateControl in SharePoint integriert werden.

 

Dazu muss man folgende Dinge durchführen

1. Ein neues SharePoint Projekt erstellt werden

2. Das Projekt muss als Farm Solution markiert werden

3. Die jQuery und SPSerivces Source Files müssen in einem Mapped Folder auf die SharePoint Farm bereitgestellt werden

clip_image004

4. Ein UserControl mit dem Namen ScriptInjector zum SharePoint Projekt hinzufügen

5. Beide JavaScript Files im UserControl laden

clip_image006

6. Ein neues Empty Element mit folgendem Inhalt hinzufügen

clip_image008

 

Mit diesem Setup werden sowohl jQuery als auch SPServices auf allen SharePoint Seiten geladen. Somit kann auf jeder SharePoint Seite nun frei los-gescriptet werden. Open-mouthed smile

 

Bevor ich zum eigentlichen Service Aufruf komme noch der Hinweis dass sämtliche WebService Methoden über die gleiche Syntax aufgerufen werden können. Somit kann man auch noch unbekannte Servicemethoden im Handumdrehen in die eigene Lösung einbauen und sicher verwenden.

SPServices_GetAttachments

Der Beispielaufruf zeigt wie alle Attachments des Elementes mit der ID 3 aus der Kundenliste abgerufen und als Hyperlink zum Result-Div hinzugefügt werden.

Wichtig ist, dass die Antwort des ServiceCalls (immer noch XML) natürlich interpretiert werden muss. Sicherlich gibt es jede Menge Libraries oder Plugins für jQuery um das Finden der e ntsprechenden Bausteine sehr vereinfachen bzw. sehr beschleunigen, dennoch macht es meiner Meinung nach mehr Sinn die Anzahl an externen JavaScript Bibliotheken aufgrund der Ausführungs- und Ladegeschwindigkeit gering zu halten.

Neben den eben gezeigten WebService Wrappern stellen die SPServices noch diverse Methoden bereit um die SharePoint Formulare etwas mehr aufzupeppen.

Aus den vorhandenen Methoden möchte ich die Methode SPAutocomplete vorstellen. Durch SPAutocomplete kann man an jedes InputField (TextBox auf einer New- oder EditForm) einen AutoComplete Mechanismus anhängen. Das Besondere daran ist, das SharePoint selbst als Datenquelle für das AutoComplete fungiert. Analog zu den ServiceWrappern ist auch dieser Aufruf spielend einfach.

 

clip_image010

 

Wie bereits bei den Services musste auch diesmal wieder die WebURL angegeben werden. Damit bei einer Vielzahl von Methodenaufrufen nicht jedesmal die WebURL angegeben werden muss, solltet ihr die SPServices Defaults verwenden. Hier könnt Ihr die WebURL vorbelegen, so dass diese von allen Calls wiederverwendet werden kann.

clip_image011

 

Ein Tipp aus der Praxis

SPServices ist echt ein geniales kleines Framework, welches die Arbeit mit den SharePoint ASMX WebServices viel angenehmer macht. Doch richtig viel Spaß macht meiner Meinung nach erst die Kombination aus SPServices und jTemplates. jTemplates ist ein jQuery Plugin, welches dazu verwendet wird UI Templates zu definieren und diese mit Daten zu füllen. Mit der Kombination wird die clientseitige SharePoint Entwicklung noch mächtiger und schneller. Daher ist auch jTemplates auf jeden Fall einen Blick wert.

 

Happy scripting,

Thorsten

Hallo zusammen,

der vierte Advent ist angebrochen, auch bei uns im Norden hat es schon den ersten Schnee gegeben (wenn auch nur kurz…aber mehr würde uns auch beunruhigen Smile) und ich habe meinen letzten post in diesem Adventskalender. Sad smile
Ich dachte, da wird es mal Zeit, schon mal ein kleines Vorab-Präsent zu veröffentlichen.

Ich habe vor einiger Zeit mal das Mitarbeiter-Training-Template aus den Fantastic 40-Templates auf Deutsch übersetzt und hatte es in dem Zusammenhang auch ein wenig erweitert (es gab da ein, zwei logische Fehler in den Workflows).
Da dieses sich leider nicht ohne Probleme migrieren ließ, habe ich es nun noch einmal neu übersetzt: MitarbeiterTraining.zip.
Basis war hierfür die englische, migrierte Version von TechSol (Employee Training Scheduling and Materials).

Das Template ist Sandbox-fähig und muss somit in die Solution-Gallery geladen werden. Anschließend findet ihr unter euren deutschen Site-Templates eines mit dem Titel “Mitarbeiter Training”.

Ich wünsche euch mit dem Template viel Vergnügen, ein ruhiges und besinnliches Weihnachtsfest und alles Gute für das neue Jahr (es dürfte aus SharePoint-Sicht spannend werden).

Vorweihnachtliche Grüße,

  Daniel

Wie schon gebloggt kann man so einige SharePoint-Authentifizierungs-Szenarien mit Claims lösen. Wo Sonne ist, ist aber auch Schatten. In einem Projekt kam die Frage auf ob man alle Benutzer nur über Claims innerhalb SharePoint 2010 einbinden kann. Sprich keinen „User Profile Sync“ gegen ein Directory.  Und so machte ich machte mich auf die Suche nach den Limitationen. Hier meine Liste die vermutlich im Laufe der Zeit immer länger wird:

Audiences
OOTB funktionieren die „Benutzer basierten“-Audiences nicht. Also das Szenario „Mitglieder dieser Gruppe können das sehen“ funktioniert ohne „Custome Code“ nicht.
„Property-based“-Audiences funktionieren. Details dazu in diesem TechNet Blogpost: http://blogs.technet.com/b/speschka/archive/2010/06/12/using-audiences-with-claims-auth-sites-in-sharepoint-2010.aspx

Excel Services
Die Excel Services benutzen normalerweise C2WTS (Claims to Windows Token Service). Es wird aber nichts andere konvertiert das nicht entweder „Windows Classic“ oder „Windows Tokens“ zu einer „Windows Identity“ gewandelt wird. Aus diesem Grund müssen externe Datenzugriffe oder  „unattended data refresh” über den Secure Store Service durchgeführt.

Performance Point
Performance Point muss die „ Unattended Service Account”-Option im Zusammenhang mit “Secure Store Services” und Claims benutzen.

SQL Server 2008 R2 Reporting Services Integration
Die SQL Reporting Services benötigen zwingend Windows Authentication. Es besteht keine Möglichkeit den C2WTS (Claims to Windows Token Service) zu benutzen.

Visio Services
„Secure Store Service“ kann nur für das Darstellen von Objekten benutzt werden dessen Connection über ein ODC-File spezifiziert wurden.

Project Server
Claims werden prinzipiell unterstützt. Jedoch benötigt die Migration mehr als nur „MigrateUser“ da der Project Server eine eigene Datenbank für die „User Logon Information“ unterhält.

SharePoint Designer
Der „External Content Type Designer“ in SharePoint Designer 2010 kann keine „Claims aware WDSL endpoints“ ansprechen (http://support.microsoft.com/default.aspx?scid=kb;EN-US;982268).

PowerPivot
Das Darstellen von Workbooks“ in PowerPivot arbeitet eigentlich wie erwartet, trotzdem unterstützt PowerPivot nur klassische Web Apps. Dies aus folgenden zwei Gründen:
Um Daten von einer externen DB zu aktualisieren, benutzte Power Pivot die User Credentials die im Secure Store Service gespeichert sind. In einer claims-based Web App kann das “SharePoint binary API” mit einem “Windows Token” nicht angesprochen werden.
Eingehende „Connection Request“ werden von den SharePoint Front End Servern nicht akzeptiert. Dies scheint ein Bug zu sein.

Dies ist meine aktuelle Sammlung. Gute Ausgangspunkte um nach Lösungen und Ideen zu suchen sind folgende Blogs:
Share-n-dipity: http://blogs.technet.com/b/speschka/
SharePoint Security: http://www.sharepointsecurity.com/category/sharepoint/claims-based-authentication//
Microsoft Whitepaper: http://technet.microsoft.com/de-de/library/hh487289.aspx

SharePoint Online beinhaltet neben der Intranetverfügbarkeit auch eine sogenannte Public Facing Website. Heute zeige ich, wie wir diese schnell zur persönlichen Website machen und uns unsere eigene SharePointAdvent Seite bauen – ohne Code, ohne CSS Anpassungen.

Dazu gehen wir zuerst im Adminportal auf den Punkt Website bearbeiten:

image

Nun landen wir zuerst im backend, wo wir die Seiten unserer Website sehen. Standardmäßig sind hier bereits Startseite, Wir über uns, Kontakt und Sitemap angelegt.

image

Wenn wir die Startseite öffnen, sehen wir, dass es bereits vordefinierte Templates für die Public Facing Website gibt. Über einen Ribbon können wir die Seite verändern oder auch gleich Inhalte einfügen.

image

Für unser SharePoint Advent Layout habe ich den Banner des Blogs bereits vorbereitet. Diesen Banner lade ich über den Punkt Text / Logo in die Website und ändere dann auch gleich den Text der Website.

image

Als nächstes stelle ich das Farbschema um auf Pflaume:

image

Dann wird noch die gewünschte Bannerpositionierung gewählt.

image

Das im Design vorhandene Bild habe ich mit “kein Bild” aus unserem Layout entfernt.

image

Nun fülle ich unsere Website noch mit ein bisschen Text und Bildern. Und schon ist die eigene Website fertig, anzusehen hier.

image

JavaScript erfreut sich wieder immer größerer Beliebtheit, nicht zuletzt durch den neuen HTML5 Hype. In SharePoint Online bietet JavaScript, insbesondere in Kombination mit dem ECMA Client Object Model, uns gute Möglichkeit Limitationen von Sandboxed Solutions zu überwinden. Aber wie registriere ich JavaScripts richtig in SharePoint Online?

Probleme

In ASP.NET wird oft der ClientScriptManager benutzt um JavaScripts im Code Behind auf der Page zu registrieren. Das funktioniert aber leider nicht in einer Sandboxed Solutions. Obwohl uns zwar das Page Objekt im Code Behind eines WebParts zur Verfügung steht, haben jedoch Änderungen an diesem keine Auswirkungen auf das echte Page Objekt in ASP.NET. Der Grund hierfür ist, dass der Code von Sandboxed Solution nicht im IIS läuft, sondern im User Code Service und der simuliert lediglich den ASP.NET Page Life Cycle.

In SharePoint 2010 gibt es sogar extra die .NET Klasse ScriptLink um JavaScripts zu registrieren. Aber auch diese funktioniert nicht in Sandboxed Solutions.

Lösungen

Eine sehr einfache, aber nicht unbedingt elegante Möglichkeit JavaScripts global auszurollen besteht darin, die Master Page anzupassen und das Skript dort zu registrieren. Auch die in SharePoint 2007 sehr beliebten Delegate Controls stehen uns in Sandboxed Solutions leider nicht zur Verfügung.

Eine andere Möglichkeit ist das Skript innerhalb der Render Methode eines Webparts manuell zu registrieren. Hierbei sollte man aber darauf achten, dass das Skript nicht mehrfach zu laden wenn mehrere Instanzen eines WebParts auf einer Seite laufen. Genau hierfür bietet SharePoint eine sehr nützliche JavaScript Klasse namens SP.SOD (SharePoint Scripts on Demand, leider schlecht dokumentiert). Die Aufgabe von SP.SOD ist es Skripte bei Bedarf dynamisch zu laden. SharePoint selbst nutzt SP.SOD sehr intensiv und lädt viele JavaScript erst bei Bedarf dynamisch. Das hat den Vorteil, dass die Seite dem Benutzer schneller angezeigt wird und dann erst die Funktionalität (JavaScript) nachgeladen wird. Vielleicht ist auch dem ein oder anderen schon mal aufgefallen, dass die Ribbon Buttons erst kurz nach dem Laden der Seite aktiviert werden. Auch die oben erwähnte .NET Klasse ScriptLink macht im Hintergrund nichts anderes als serverseitig clientseitige SP.SOD Aufrufe zu generieren. Glücklicherweise steht uns SP.SOD auch in Sandboxed Solutions zur Verfügung. Jetzt genug Theorie, hier ein Beispiel.

Beispiel

myscript.js

image

Myscript.js registriert den Namespace “ilsp.scripts” und eine einfache “sayHello” Methode. Der letzte Aufruf teilt SP.SOD mit, dass das Skript mit dem Key “myscript.js” geladen wurde und dass eventuell vorhandene Callback Funktionen die auf myscript.js warten jetzt aufgerufen werden können.

Nun registrieren wir myscript.js mit Hilfe einer Custom Action.

image

In SharePoint 2010 kann man Scripts via Custom Action registrieren. Hierzu kann man entweder wie oben das ScriptBlock Attribut nutzen oder das ScriptSrc Attribut. Nachteil von ScriptSrc ist, dass man keine externen Scripts laden kann. Das Script muss entweder im Layouts Ordner liegen (nicht möglich in Sandboxed Solutions!) oder innerhalb der SharePoint Site (kann über ein Modul bereitgestellt werden). Des Weiteren kann man die Scripts nicht “On Demand” laden. In SharePoint Online lade ich Script Libaries gerne aus dem Azure Blob Storage. Hierdurch kann das Script nachträglich leicht, zentral gewartet werden. RegisterSod lädt das Script nicht direkt sondern registriert es lediglich zum späteren laden, sofern benötigt.

Als nächstes Erstellen wir ein Sandboxed Visual Webpart.

image

image

In sayHelloClick wird durch LoadSodByKey das bereits registrierte myscript.js dynamisch geladen. Dynamisch geladen bedeutet, dass der entsprechende Script Tag dynamisch erstellt und zum HTML Head Element hinzugefügt wird. Die Callback Funktion im zweiten Parameter wird nur aufgerufen wenn das Script initial geladen wurden. ExecuteOrDelayUntilScriptLoaded wartet bis ein Script fertig geladen wurde (SP.SOD.notifyScriptLoadedAndExecuteWaitingJobs) und ruft dann die definierte Callback Methode auf.

Ablauf

Bei jedem Laden einer Seite wird myscript.js als SOD registriert aber noch nicht geladen (alert: Register SOD).

Erst wenn “Say Hello” zum ersten Mal geklickt wird, wird myscript.js geladen und dann ilsp.scripts.sayHello aufgerufen (alerts: Loading Scripts…; Notify Script Loaded; Hello Thorsten!).

Beim zweiten klick wird myscript.js nicht nocheinmal geladen, sondern nur noch ilsp.scripts.sayHello aufgerufen (alerts: Hello Martina!)

Hört sich verwirrend an? Ist es auch clip_image001

(…weitere Details zu SP.SOD findet Ihr auch auf meinem Blog.)

Michael Greth und ich haben uns im letzten AlpenPodcast über das vergangene Jahr unterhalten. Ein Kollege sprach mich nun darauf an: was ist dann mit der Aussicht auf 2012. Nun, wir alle wissen das solche Aussagen immer ganz heikel sind. Retrospektive Zusammenfassungen sind ja einfach. Trotzdem versuche ich mal die Portal Trends, die ich persönlich wahrnehme, für das nächste Jahr auszubreiten.
Generell lässt sich sagen das Microsoft das Thema „Private Cloud“ bei ihren Kunden weiter sehr stark positionieren wird. Das bedingt, dass wir von der SharePoint Architektur Lösungen oder zumindest Aussagen bereithalten sollten. Ein guter Anlaufpunkt ist: http://sharepointintheprivatecloud.wordpress.com/.

Was immer wir im nächsten Jahr planen: Flexibler und elastischer muss es werden.

Das Thema Mobile wird uns weiter beschäftigen. Schon heute sind wir mit diesen Anforderungen konfrontiert. Mit dem Erscheinen der Galaxy Tabletts wird der Druck vermutlich noch grösser. Immer mehr Firmenkunden lassen ihren Anwender die Corporate Informationen auf diesen Geräten empfangen. (Mehr zu diesem Thema ein bisschen weiter unten im Abschnitt Portal Design Trends.)
Enterprise 2.0. Social Media ist ein ewiges Thema das bei fast allen Firmen immer wieder hochkommt. Bisher waren aber alle dann irgendwie doch noch nicht so richtig bereit. Im Zusammenhang mit der weiteren Ausbreitung von Mobilen Geräten in den Firmen wird dieses Thema nun erneut angegangen. Wichtig ist es zu erkennen, dass dieses Enterprise 2.0 kein IT-Thema ist, sondern ein Thema für die Corporate Communication Abteilung. Nur weil man ein Facebook und ein  Twitter Account hat ist man noch kein Social Media Spezialist.

Portal Design
Ebenso wie das Thema „Private Cloud“ wird Microsoft im nächsten Jahr SharePoint als WCM-Plattform positionieren. Das gibt uns Dienstleistern neue Aufträge und das ist gut so. Allerdings ist unsere Konkurrenz in diesem Bereich sehr, sehr stark. Diese Lösungen reagieren sehr viel schneller als Microsoft auf aktuelle Trends.
Das Konzept der mobilen Apps hat gezeigt das fokussierte Software Probleme oft dynamischer lösen als monolithische Feature starke Lösungen. Diese Erkenntnis schlägt sich direkt auf Portallösungen durch. Die Kunden werden mehr Fokus auf Themen wie „User Experience“, „Interaction Design“ und Informations-Architektur legen. Themen wie der reine Betrieb der Lösung werden langsam verschwinden weil sie im Zusammenhang mit der oben genannten „Private Cloud“ als „commodity“ wahrgenommen werden.
Was bedeutet das konkret? Das was gemeinhin als „Responsive Web Design“ bezeichnet wird, wird im nächsten Jahr aus den Kinderschuhen herauswachsen und umgesetzt. Die Unterschiede der Vielzahl der mobilen Geräte werden uns dazu zwingen. Statt Portale mit fixen Werten zu entwickeln, müssen wir dynamische Layouts schreiben die mit einer Vielzahl von unterschiedlichen Stylesheets auf unterschiedlichen Geräten angezeigt werden können. Das Web ist voll mit Hilfsmittel zu diesem Thema. Wie etwa tiny fluid grid.

Im Gegensatz zu dem weiter unten erwähnten „Fixed-Position Navigation„ zeigt sich in den reinen Portalen, die mit sehr viel Information umgehen müssen einen Trend zu Multi-Column Menus. Der Grund liegt darin, dass wenn zu viele Navigationslink vorhanden sind, Teile davon in die Seitennavigation (Quick Nav) verschoben werden. User Experience Tests haben aber gezeigt, dass eine Zersplitterung der Navigation von den Benutzern nicht immer richtig verstanden wird. Aus diesem Grund empfiehlt es sich alles in der Top Navigation zu behalten. Um dieses Problem zu lösen haben sich die erwähnten „Multi-Column Menus“ entwickelt. Ein gutes Beispiel ist etwa Best Made Company:

Aber auch einfachere Lösungen wirken immer noch sehr elegant und aufgeräumt (http://neuarmy.com/)

Ein anderer Weg um dieses Problem zu lösen sind „Footer Navigation“. Immer mehr Portale lassen den Footer mit sehr vielen Links konstant stehen und geben dem Benutzer so zwei Navigationselemente (oben und unten). Dies ist für die Benutzer deutlich logischer als die SharePoint typische Verteilung in Top- und Quick Navigation.



Allgemeine Site Design Trends


Fixed-Position Navigation
: Im letzten Jahr kam dieser Trend auf und der wird sich nächstes Jahr weitersetzten. Die Idee ist, dass man auf Seiten die wenige Navigation benötigen, die Navigation nicht versteckt sondern als zentrales Element stehen lässt. Dieses Vorgehen kann neben dem Design Effekt die Website Performance dramatisch verbessern. Mittels jQuery kann hier sehr schnelle Lösungen bauchen. Aber auch ohne aktivierten JavaScript kann mit ganz kreativen CSS Code Lösungen solche Effekte erreicht werden. Ein gutes Beispiel für diesen Effekt ist die Site von Simon Wuyts.

Grosse visuelle Elemente: Ein weiterer Trend, der im Zusammenhang mit Enterprise 2.0 steht, ist das man übergrosse Maskottchen auf die Site platziert. Die Idee dahinter ist es, dem Inhalt eine Identität zu geben (Maskottchen) welches sich dann positiv auf die Akzeptanz überträgt. Die Qualität dieser „Vector Arts“ wurde auch immer besser und gibt den Seiten definitiv einen „fröhlichen“ Anstrich. Zwei Beispiele hier: Firefox und MailChimp.

 

Natürlich gibt es weitere Trends wie etwa HTML 5/jQuerry/CSS Animationen oder „web save fonts“. Auch sieht man immer mehr Infografiken im Intranet. Bitte schreibt doch als Feedback welche Trends Ihr seht oder welche ich vergessen habe.

Wie in meinem letzten Post erläutert, macht es durchaus Sinn, sich im Bereich SharePoint auch über das Backend Gedanken zu machen. Ein Teil davon ist die Erstellung der Datenbanken. Eigentlich sollte es den Button “Add new Content Database” in SharePoint gar nicht geben.

Warum?  Hier sind die Gründe:

SharePoint erstellt eine neue Datenbank ab der Model und diese ist von Natur aus so konfiguriert:

  • 2MB gross (oder besser gesagt klein)
  • Ein einzelnes File in der Primary Filegroup
  • Growth ist auf 1 MB Unlimited Growth
  • Logfile ist 1MB gross
  • Growth ist 10%

 

Nach dem Erstellen einer leeren SharePoint Datenbank ist diese 2o MB gross, das heisst, sie ist bereits 18x gewachsen. Durch das Wachstum einer DB wird sie fragmentiert und wie man weiss, ist alles was fragmentiert ist langsamer, da die Datenstücke nicht aneinander hängen, sondern verteilt sind. Diese Verteilung muss vom DB Management System aufgefangen werden. Dieser Reibungsverlust schlägt sich in der Performance nieder.

Wenn ich nun die DB Stats abfrage, bekomme ich den Fragmentierungslevel der neuen Datenbank mitgeteilt, ACHTUNG: Es handelt sich notabene um eine leere SharePoint Datenbank, die noch überhaupt keinen Content enthält. SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(‘DB Name’), Null, Null, Null, Null);

Ich erhalte hier 230 Rows, jede Row enthält den Hinweis auf einen Index. Meine Datenbank ist also schon sehr stark fragmentiert, obwohl sie leer ist. Da kann man sich vorstellen, dass dies an der Performance nagt.

Ein weiterer Punkt ist, dass allea auf einem Datenfile abgeht. Heute haben Prozessoren mehrere Kerne, und jeder hackt auf dem armen File rum. Viel besser ist es, wenn jeder Kern sich auf ein anderes File konzentrieren kann. Wenn eine DB in mehrere Files unterteilt ist, so wird abwechselnd auf die Files eingedroschen, was sich wiederum positiv auf die Performance auswirkt. Die Fausregel sagt, dass pro Prozessorkern 0.25 bis 0.5 Files angelegt werden sollten, mindestens aber 4. Bei mehr als 8 Files ist dann kein grosser Unterschied mehr spürbar. Beachten Sie folgendes:

  • Berechnen Sie vorab, wie viel Content später mal in die DB rein soll
  • Erstellen Sie die initiale DB Grösse entsprechend ein (wir sprechen von GB nicht von BYTES)
  • Stellen Sie das Wachstum auf eine vernünftige Grösse ein
  • Stellen Sie das LOG auch auf 1GB oder teilbar durch 8GB

Hier kommt der Script vorher noch im SQL Mgmt Studio unter “Query” den “SQL CMD Mode” aktivieren, alles was rot ist muss von euch noch customized werden (auch der User ganz am Ende, da kommt der Farm Admin rein:

— —————————————————————————————
— Disclaimer – Thoroughly test this script, execute at your own risk.
— —————————————————————————————

— set variables (Filesizes in MB)
:setvar DBName MyAdventDB
:setvar LoginitialMB 1024
:setvar LoggrowMB 1024
:setvar DatainitialMBperFile 341
:setvar DatagrowMBperFile 341
:setvar DataPath “C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA
:setvar LogPath “C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA

CREATE DATABASE [$(DBName)] ON  PRIMARY
— no grow on Primary-File (its only for sys tables and Service Broker Queues)
( NAME = N’$(DBName)Data01′, FILENAME = N’$(DataPath)\$(DBName)Data01.mdf’ , SIZE = 128MB , FILEGROWTH = 0),
— 0.25-1 file per cpu core (each with same initial and grow size)
( NAME = N’$(DBName)_Data02′, FILENAME = N’$(DataPath)\$(DBName)_Data02.ndf’ , SIZE = $(DatainitialMBperFile)MB , FILEGROWTH = $(DatagrowMBperFile)MB ),
( NAME = N’$(DBName)_Data03′, FILENAME = N’$(DataPath)\$(DBName)_Data03.ndf’ , SIZE = $(DatainitialMBperFile)MB , FILEGROWTH = $(DatagrowMBperFile)MB ),
( NAME = N’$(DBName)_Data04′, FILENAME = N’$(DataPath)\$(DBName)_Data04.ndf’ , SIZE = $(DatainitialMBperFile)MB , FILEGROWTH = $(DatagrowMBperFile)MB ),
( NAME = N’$(DBName)_Data05′, FILENAME = N’$(DataPath)\$(DBName)_Data05.ndf’ , SIZE = $(DatainitialMBperFile)MB , FILEGROWTH = $(DatagrowMBperFile)MB )
LOG ON
— place tlog on another diskarray, use best practice size for optimal vlf handling (1GB/8GB)
( NAME = N’$(DBName)_log’, FILENAME = N’$(LogPath)\$(DBName)_log.ldf’ , SIZE = $(LoginitialMB)MB , FILEGROWTH = $(LoggrowMB)MB )
— collation for database (default, unless its for moss –>KS_WS!)
COLLATE Latin1_General_CI_AS_KS_WS
GO
— 90=2005/100=2008
ALTER DATABASE [$(DBName)] SET COMPATIBILITY_LEVEL = 100
GO
ALTER DATABASE [$(DBName)] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [$(DBName)] SET ANSI_NULLS OFF
GO
— set ANSI_PADDING True, refer to BOL for more information, not default setting
ALTER DATABASE [$(DBName)] SET ANSI_PADDING ON
GO
ALTER DATABASE [$(DBName)] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [$(DBName)] SET ARITHABORT OFF
GO
ALTER DATABASE [$(DBName)] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [$(DBName)] SET AUTO_CREATE_STATISTICS ON
GO
— never use AUTO_SHRINK on a production DB
ALTER DATABASE [$(DBName)] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [$(DBName)] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [$(DBName)] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [$(DBName)] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [$(DBName)] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [$(DBName)] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [$(DBName)] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [$(DBName)] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [$(DBName)] SET  DISABLE_BROKER
GO
ALTER DATABASE [$(DBName)] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [$(DBName)] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [$(DBName)] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [$(DBName)] SET  READ_WRITE
GO
— use same recovery model for each db in an instance (exceptions in olap environments)
ALTER DATABASE [$(DBName)] SET RECOVERY FULL
GO
ALTER DATABASE [$(DBName)] SET  MULTI_USER
GO
— change all dbs to checksum since 2005
ALTER DATABASE [$(DBName)] SET PAGE_VERIFY CHECKSUM
GO

— change db owner
USE [$(DBName)]
GO
EXEC dbo.sp_changedbowner @loginame = N’domain\user‘, @map = false
GO

 

Am Ende noch mit Powershell an SharePoint anhängen und gut ist.

New-SPContentDatabase -Name <ContentDbName> -WebApplication <WebApplicationName>

So long, Samuel

Page 1 of 41234

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