Welche Auswirkungen hat die Blockchain-Technologie auf Plattform-Infrastrukturen?

Blockchain und Content Management Systeme

Blockchain ist ein Trend – falsch, Blockchain ist ein Technologiekonzept, das seit Jahrzehnten erforscht und nun real wurde. Ansätze, wie z.B. digitale Dokumente mit verketteten Zeitstempeln zu versehen, stammen sogar aus dem Jahre 1991. Breites Interesse erzeugte die Technologie mit der zunehmenden Popularität von Kryptowährungen wie Bitcoin oder Ether.

Was ist die Blockchain?

Sehr vereinfacht dargestellt, ist die Blockchain ein öffentlich einsehbares Kassenbuch von dem jeder Teilnehmer innerhalb des Blockchain-Netzwerks eine (komplette) Kopie besitzt. Dadurch erlangt das System Fälschungssicherheit und Transparenz – eine Änderung könnte ja immer nur im eigenen Kassenbuch geschehen, nicht in den der anderen Teilnehmer.
Verschlüsselt werden dort Transaktionen chronologisch dokumentiert und können rückwirkend nicht mehr unbemerkt manipuliert werden. Die enorme Ausfallsicherheit, z.B. gegenüber Serversystemen, erreicht die Blockchain-Technologie durch die dezentralisierte Verteilung auf alle Teilnehmer; Stichwort Peer2Peer.
https://www.youtube.com/watch?v=e1D5D_uz5mM

Warum kann die Blockchain-Technologie alle Branchen verändern?

    1. Sie bietet eine hohe Sicherheit, da Manipulationen an der Mehrheit der Kassenbücher vorgenommen werden müssten und dies in einer bestimmten Zeit, um Auswirkungen zu haben. Weiterhin ist eine Blockchain unabhängig und wird nicht durch einzelne Instanzen zensiert, reguliert oder kontrolliert.
    2. Durch die sichere Datenaufbewahrung steigt auch das Vertrauen in die Lösungen, welche auf der Technologie realisiert werden. Die Kontosperrung von PayPal im Fall der Wikileaks-Enthüllungen machte deutlich, wie Finanzunternehmen auch politisch unter Druck geraten können.
    3. Die weltweite Verfügbarkeit reduziert Barrieren und eröffnet u.a. Menschen in instabilen Staaten Zugang zu Banking und Eigentum.
    4. Verbreitete Informationen erlangen Gültigkeit durch Eintrag in die Blockchain, gleichzeitig gewährleistet kryptografische Verschlüsselung auch die Anonymität der Daten

Die Blockchain ist eine Grundlagentechnologie, wie z.B. ein TCP/IP-Protokoll, dadurch erlangt sie zunehmende Akzeptanz und stellt die Grundlage weiterer Anwendungen dar. Google Trends unterstreicht das wachsende Interesse.

Suchanfragen zur Blockchain-Technologie
Weltweites Interesse an der Blockchain-Technologie – (c) google

Der Nutzen der Blockchain geht aber über die Kryptowährungen weit hinaus. Bezahlprozesse am Point-of-Sale oder im e-Commerce werden vereinfacht und beschleunigt. Waren können von der Herstellung bis zur Auslieferung an Händler lückenlos in einer Blockchain dokumentiert werden z.B. um eine Kühlkette transparent zu dokumentieren.
Derzeit gibt es mehrere verschiedene Blockchains, die sich im Ansatz unterscheiden – welche davon sich langfristig durchsetzen wird, kann derzeit noch nicht beurteilt werden. Maßstäbe prägen werden große Konzerne wie Microsoft oder IBM, die in vielen Konsortien die Potenziale und Einsatzbereiche erforschen.

Ein Blockchain Use-Case

Das Prinzip von Know-Your-Customer (KYC) betrifft vor allem Finanzinstitute, die ihren Handelspartner in einem Transaktionsgeschäft eindeutig identifizieren müssen, um Geldwäsche oder ähnliche kriminelle Handlungen zu verhindern. Denkt man diesen Ansatz weiter, kann in einer Blockchain ein eindeutiges Nutzerprofil angelegt werden, das den Nutzer an vielen Schnittstellen identifizieren kann. Das deutsche Unternehmen Blockchain Helix hat dazu eine Lösung auf Basis einer privaten Blockchain entwickelt, die es dem Nutzer ermöglicht, die Kontrolle über die einsehbaren Nutzerdaten über eine Art Rechteverwaltungs-Oberfläche zu behalten.

Welche folgenden Eigenschaften einer Blockchain sind dem deutschen Mittelstand bekannt?
(c) eco

Vorteile für den Nutzer:

Möchte der Nutzer zum Beispiel Waren in einem Onlineshop kaufen, könnte dieser Händler benötigte Nutzerdaten abfragen. Diese Abfrage erscheint dann beim Nutzer, welcher die abgefragten Daten passgenau freigibt (oder dies automatisch über zugewiesene Rollen erlaubt). So hat der Nutzer mehr Kontrolle über die freigegebenen Daten und der Kaufprozess kann nochmals beschleunigt werden. Überprüfen Sie das an sich selbst: Wo haben Sie überall online ein Konto erstellt, dem Händler oder Webseitenbetreiber Rechte eingeräumt und wann haben Sie die Daten zuletzt aktualisiert?

Vorteile für Händler:

Auf der anderen Seite profitiert der Händler ebenfalls von effizienteren Prozessen und eindeutigen Nutzerdaten. Zudem hat der Nutzer ein eigenes Interesse daran, die Daten immer aktuell zu halten – da sich falsche Daten auf seine Nutzererfahrung und Warenlieferung negativ auswirken würden. Weiterhin besitzt man als Betreiber einer Website ein eindeutiges Nutzerprofil und kann dieses auch über mehrere Webseiten verfolgen und mit Nutzungsdaten aggregieren. Kombiniert man die verfügbaren Nutzerdaten mit den erzeugten Daten im Kaufprozess, ist eine effektive personalisierte Ansprache möglich und verbessert die Customer Journey. Hierzu müssen Daten aus der Blockchain natürlich in das Content Management System oder die Marketing-Plattform eingespeist werden.
Prozesse können durch sogenannte „smart contracts“ verschlankt und automatisiert werden. Die Kosten reduzieren sich zudem durch sinkende Stammdatenpflege, aber auch durch günstigere Zahlungskonditionen – siehe Grafik.
Infografik: Bitcoin ist günstiger und schneller | Statista
(c) Statista
Voraussetzung ist natürlich, dass Anwendungen der bisherigen Infrastruktur in die Blockchain schreiben und neue Einträge in das eigene Kassenbuch holen können. Konnektivität ist daher genauso entscheidend, wie die Verfügbarkeit akzeptierter und verbreiteter Anwendungen, ähnlich wie die Paymentintegrationen für Shops per Bitcoin.

Welche Auswirkungen hat die Blockchain-Technologie auf Plattformen und verbundene Services?

Jeder, der sich im Umfeld umfangreicher Infrastruktur-Landschaften bewegt, wird in den kommenden Jahren mit der Technologie konfrontiert werden. Durch die Reduzierung von Kosten, die Vereinfachung von Prozessen oder die gesteigerte Sicherheit werden Partner, Lieferanten oder Wettbewerber diese Technologie früher oder später für sich entdecken.
Ebenso kann die marktseitige Nachfrage nach Blockchain-basierten Applikationen und Lösungen durch die Kunden und Nutzer getrieben werden. Das Bitcoin-Wiki liefert eine sehr umfassende Liste der Orte, wo derzeit mit Bitcoin bezahlt werden kann. Die Coinmap liefert eine geografische Übersicht der Bezahlmöglichkeiten. Bekannte Namen sind unter anderem WordPress, Expedia, Microsoft oder Bloomberg.
Wie so oft bei Innovationen werden die frühen Lösungsanbieter die Weichen stellen und auch die Plattform-Landschaft beeinflussen können. Es gibt bereits Payment-Modelle, die instore als Hardwarelösung angeboten oder per Smartphone abgewickelt werden können.

#Varoufake war nicht nur ein gelungener Seitenhieb auf die Medien, sondern verdeutlichte auch die Notwendigkeit Informationen hinsichtlich ihrer Quelle und Herkunft zu kennzeichnen. Die Blockchain kann dabei helfen, Informationen bis zum Ursprung zurückzuverfolgen, Manipulationen zu erkennen und auch den Ersteller von Falschmeldungen zur Rechenschaft zu ziehen oder eine journalistische Quelle für mehrfach geteilten, gelesenen und verbreiteten Content zu vergüten.

Content Publisher

Durch die Registrierung von Content in der Blockchain können Autoren und die Quelle von Inhalten eindeutig durch Signaturen gekennzeichnet werden. Momentan gibt es Lösungen für Content Publishing und Content-Auslieferung auf Blockchain-Basis, z.B. von https://decent.ch/ und https://popchest.com/, welche auch Advertising rund um Content ganz neu interpretieren. Eine eindeutige Rechteverwaltung und Autorenidentifizierung von erstellten Inhalten verspricht http://jaak.io/.

Content Management

Im Fokus stehen zwar derzeit Ersteller und Distributoren von Inhalten, jedoch werden mittelbar auch angebundene Datenbanksysteme wie Digital Asset Management (DAM) oder Product Information Management (PIM) von den technischen Möglichkeiten profitieren. Umfassenden Mehrwert bieten die Systeme, wie sonst auch, im Verbund mit Content Management Systemen oder Marketing-Plattformen.
Eindeutige digitale Signaturen finden bereits vielfach Anwendung z.B. in Form von  Zugangsbeschränkungen bei PDFs, Kennzeichnung von Dokumenten oder Verträge oder im Behördenschriftverkehr. All diese Schnittstellen können durch die Blockchain-Technologie beschleunigt und automatisiert werden. Wie anwenderseitig die Kommunikation und das Content Marketing von morgen beeinflusst wird, beleuchtet die W&V in diesem Artikel.
Paperchain.io Vergütung von Content
(c) paperchain.io
Blockchain, Data Analytics sowie künstliche Intelligenz werden voneinander profitieren, um immer bessere regelbasierte Entscheidungen und Vorhersagen treffen zu können. Und auch diese Daten müssen gewonnen, zusammengeführt und ausgewertet werden. Die Herausforderung ist dass Anwendungen an den Schnittstellen reibungslos kommunizieren können. Paperchain ist so ein Anwendungsfall. Auf Basis von Metadaten können Musiklabels über verbundene Plattformen die gespielten Songs korrekt mit dem Künstler abrechnen. Die Plattformen können wiederum die Bedürfnisse ihrer Kunden besser verstehen und bedienen. Wie die GEZ das wohl findet?

Was kommt als nächstes?

Die zunehmende Digitalisierung unserer Gesellschaft verstärkt auch die Nachfrage und den Handel mit digitalen Gütern. Popularität erlangte die Blockchain über die alternative und digitale Kryptowährung Bitcoin und verändert bereits jetzt den Finanzmarkt disruptiv.


Wie weit die Technologie auch in weiteren Branchen verankert sein wird, hängt von der Branche und deren Digitalisierungsgrad ab. Staaten wie Estland zeigen eindrucksvoll, dass selbst konservative Behörden mit hohen Sicherheitsansprüchen sensible Gesundheitsdaten erfolgreich über die Blockchain verwalten können.
Zuerst werden in Deutschland jedoch Unternehmen im digitalen Güterverkehr, zugehörigen Services und Technologien betroffen sein. Die Frage ist also nicht ob, sondern wann Ihre Systeme, Infrastrukturen und Geschäftsmodelle von der Blockchain beeinflusst werden und in welchem Umfang sich Veränderungen positiv oder negativ auf Sie auswirken können.
Müssen Sie jetzt also Angst um Ihr Business haben? Nein, Angst ist natürlich fehl am Platz. Aber wie bei jeder größeren Veränderung im Umfeld Ihres Unternehmens sollten Sie wachsam sein und die Entwicklungen kontinuierlich beobachten. Und vielleicht ist es ja bereits an der Zeit, einen ersten Testballon in Form eines Pilotprojekts auf Blockchain-Basis für Ihren speziellen Anwendungsfall auf den Weg zu bringen, um nicht in naher Zukunft hinten anzustehen. Einige Fuhrunternehmen, die vor 100 Jahren den Sprung vom Pferd zum Motor gemacht haben, existieren noch heute.

Treffen der Java User Group Bielefeld bei comspace

Unterschiede zwischen Java und #C

Vor kurzem fand das Treffen der Java User Group (JUG) Bielefeld in unseren Geschäftsräumen statt. Beim vorherigen Stammtisch der JUG hatte ich mich bereit erklärt, einen vergleichenden Vortrag über Java und C# zu halten. Und da die Vortragsveranstaltungen nach einem ungeschriebenen Gesetz immer in den Büroräumen des Vortragenden stattfinden, habe ich die JUG nach Absprache mit unserem Geschäftsführer Andreas Kämmer und im Namen von comspace gerne zu uns eingeladen.

Was ist und macht die Java User Group Bielefeld?

Die JUG Bielefeld wurde vor ca. 4 Jahren von Daniel Rosowski, Geschäftsführer der Smartsquare GmbH, gegründet und ist eine lose Gruppe von Java Entwicklern (und solchen, die es werden wollen), in der man sich über neue Java Technologien austauscht, Vorträge hält und hört oder einfach nur in Ruhe gemeinsam ein Bierchen trinkt. Die Treffen der JUG Bielefeld finden immer am zweiten Mittwoch eines Monats statt, wobei im Wechsel Stammtische in der Gaststätte Siekerfelde und Vorträge stattfinden.

Ich selber bin seit ca. 1 Jahr Mitglied der JUG Bielefeld und habe auf dem letzten Stammtisch im Februar erzählt, dass ich nun seit Dezember 2016 nicht mehr als Java-, sondern als C#-Entwickler bei comspace tätig bin. Im Anschluss an die Diskussion habe ich mich dann bereit erklärt – nachdem ich mich bereits 1 Jahr erfolgreich davor gedrückt habe 😉 -, einen Vortrag zu halten, und zwar über einen Vergleich von C# und Java und über meine Erfahrungen mit dem Wechsel von der einen zur anderen Programmiersprache. Bei der anschließenden Abstimmung über das Vortragsthema wurde mein Vorschlag ausgewählt.

Die Veranstaltung startete um 19 Uhr mit einer kurzen Begrüßung durch unseren Geschäftsführer, der in wenigen Sätzen comspace vorstellte. Nachdem sich die Teilnehmer an unserem reichhaltigen Buffet mit Snacks und Getränken versorgt hatten, so dass keiner hungrig oder durstig lauschen musste, startete ich mit meinem Vortrag.

Vortrag Java versus #C - Java User Group Bielefeld

Vortrag “C# versus Java”

In meinem ca. einstündigen Vortrag habe ich allerlei Gemeinsamkeiten und Unterschiede von C# und Java skizziert und kommentiert. Sachkundige Beiträge aus dem Publikum haben meine Ausführungen immer wieder ergänzt. Obwohl es sich um einen technischen Vortrag handelte, lag das Hauptaugenmerk nicht auf einem vollumfänglichen, objektiven Vergleich, sondern auf meiner persönlichen Einschätzung der Thematik. Neben syntaktischen Gesichtspunkten wurden auch Themen wie das Umfeld, die Historie, Sponsoren für die Weiterentwicklung und eine mögliche Zukunft der beiden Sprachen betrachtet.

Unter anderem habe ich dargestellt:

  • wo die Probleme im “Type Erasure” Generics Ansatz von Java liegen und wie die CLR hingegen in der Lage ist, Typinformationen von Generics zur Laufzeit auszunutzen.
  • wie das Propertysystem von C# funktioniert und wie es sich von Gettern und Settern in Java unterscheidet.
  • wie das “var” Keyword in C# die Lesbarkeit von Sourcecode durch Typinferenz erhöht und dass ein solches Konstrukt auch in Java sehr nützlich wäre.

Unterschiede zwischen Java und #C

In der persönlichen Einschätzung der einzelnen Themen kam C# im Allgemeinen besser weg, was zu den erhofften, kritischen Fragen aus dem fachkundigen Publikum führte. Die anschließende offene Fragerunde führte zu interessanten, sehr oft detaillierten Gesprächen. So wurden zum Beispiel die Ökosysteme der beiden Sprachen diskutiert oder Detailfragen zum Generics System von C# gestellt. Die wohl wichtigste Frage, war die nach Schwierigkeiten des Wechsels von Java auf C#. Ich habe bei meinem Wechsel zu comspace und der darauf folgenden Einarbeitung in C# festgestellt, dass mir das Umsteigen von Java auf C# leichter fiel als anfangs gedacht. Während ich zwar das umfangreiche Tooling und das ausgereifte Ökossytem von Java vermisse, fiel mir das Aneignen der neuen Syntax jedoch sehr leicht und ich möchte die “Quality of Life” Features, die C# so bereitstellt, nicht mehr missen.

Ausklang der Veranstaltung

Nach dem Vortrag kam es bei Bier und Essen noch zu einem interessanten persönlichen Austausch. Viele der Teilnehmer schlossen sich einer Führung durch die comspace-Büroräume an, die unsere People & Culture-Managerin Sarah Biendarra spontan anbot. Gegen 21:30 Uhr endete die Veranstaltung mit zufriedenen, gut gesättigten Teilnehmern und einem erleichterten Vortragenden ;).

Wer auch zur Java User Group stoßen will, ist herzlich willkommen! Hier geht es zu den Terminen und Themen der JUG Bielefeld.

Rückblick auf das 3. e-Spirit Usergroup Treffen

Einblick in die CMS-Zukunft durch e-Spirit

In der vergangenen Woche nahmen vier unserer FirstSpirit-Entwickler_innen am dritten Treffen der e-Spirit Usergroup statt. Die Veranstaltung fand hervorragenden Zulauf: Rund 50 Teilnehmer_innen, bestehend aus e-Spirit Lösungs- und Implementierungspartnern sowie Kollegen von e-Spirit und dem DAM-Hersteller CELUM, fanden sich am 7. Februar im Sheraton Airport Conference Center in Frankfurt ein.

Begrüßung und Agenda

Dirk Langenheim von Intentive, Mitgründer und Vorstandsmitglied der e-Spirit Usergroup, eröffnete die Veranstaltung mit einer Begrüßung und einem “Warm-up”Auftakt, in dem er anhand einiger Kundenaussagen die allgemeine Situation in Kundenprojekten umriss. Die bestehenden und oft nicht so flexiblen Infrastrukturen bei vielen Kunden beschrieb er bspw. als eine Hürde für den Wechsel auf ein neues Content Management System. CMS-Projekte auf der “grünen Wiese” sind eben so gut wie ausgestorben.

Im Folgenden standen dann diese Vorträge auf der Agenda:

  • TranslationStudio bzw. Übersetzungsmanagement – Dr. Patrick Sandmann von ID-Media
  • Vorstellung CELUM und CELUM Connect – Gerd Laski von CELUM
  • MondayWebforms & Pinuts Universal Messenger – von Monday Consulting und Pinuts
  • Zukünftige Rolle eines CMS – Lars Onasch von e-Spirit
  • CaaS Case Studies – Lars Onasch / Sebastian Glock von e-Spirit
  • Role Specific View Architecture – Sebastian Glock von e-Spirit

Übersetzungsprozesse optimieren mit dem TranslationStudio

Dr. Patrick Sandmann, CEO von ID-Media, stellte das FirstSpirit Modul “TranslationStudio” vor. Das Übersetzungsmanagement-System organisiert einen effizienten und kostenoptimierten Übersetzungsprozess für Website-Inhalte, indem es das FirstSpirit CMS über einen Connector mit dem verwendeten Translation Management Systemen wie Across oder Trados verbindet.

Der Redakteur wählt die zu übersetzenden Inhalte oder auch ganze Projekte im FirstSpirit aus, exportiert sie und übergibt sie dem TranslationStudio. Der Content wird dort in die vorgegebene Zielsprache übersetzt, automatisiert wieder ins FirstSpirit importiert und kann dann publiziert werden.    

Damit bietet das Modul besonders für Website-Projekte mit vielen Länder- und Sprachvarianten eine deutliche Vereinfachung und Zeitersparnis.

Vorstellung CELUM DAM und Integration in FirstSpirit

Der Vortrag von Gerd Laski, Partnermanager der CELUM GmbH, startete mit der Vorstellung des CELUM DAM. Das professionelle Digital Asset Management System verwaltet und organisiert alle Mediendateien eines Unternehmens unter Berücksichtigung von Rollen- und Berechtigungskonzepten und verteilt diese aktuell und im passenden Format aufbereitet in die verschiedenen Marketing- und Vertriebskanäle.

Vorstellung CELUM DAM
Vorstellung des CELUM DAM

Gerd Laski stellte außerdem das CELUM Ökosystem vor, dass eine Reihe von CELUM Produktvarianten umfasst, die komplette Inhaltssysteme wie Social Media Management, Markenportale und Content Integration optimieren.

Der anschließende Video-Einblick in den von uns entwickelten CELUM Connector, der das CELUM DAM in das FirstSpirit CMS integriert, stieß auf breites Interesse. Die Anbindung von CELUM an das CMS ermöglicht den Redakteuren den direkten Zugriff auf die im DAM abgelegten Mediendateien, ohne die FirstSpirit-Benutzeroberfläche verlassen zu müssen. Dies reduziert u.a. den Arbeitsaufwand und die Fehleranfälligkeit bei der Website-Pflege.    

Was haben MondayWebforms und der Universal Messenger miteinander zu tun?

Monday Consulting und Pinuts gaben in ihrer gemeinsamen Live-Demo einen Überblick über MondayWebforms, einem mächtigen Formularmanager von Monday Consulting, und dessen enges Zusammenspiel mit dem Universal Messenger von Pinuts, einem Tool für den optimierten Kundendialog bspw. via E-Mail-Marketing.

Webforms integriert eine neue Eingabekomponente in FirstSpirit, mit der Redakteure jede Art von Formularen, auch mit komplexen Anforderungen, einfach und intuitiv erstellen können.

Der Universal Messenger von Pinuts, der an das FirstSpirit CMS angebunden wird, verarbeitet Anfragen, die über solche Formulare generiert werden und wertet diese aus.

Zwischen Webforms und dem Universal Messenger gibt es jetzt eine Schnittstelle, welche das Mapping der Benutzer-Eingabe zu der dahinterliegenden Datenbank möglich macht. Diese Schnittstelle erlaubt dem Redakteur auch ein automatisches Mapping, sowie Einbindung von Vorgabewerten wie z.B. Werte für Anrede oder Abteilung.

Quo vadis CMS?

Nach einer Mittagspause mit Zeit zum Austauschen und Netzwerken leitete Lars Onasch von e-Spirit mit ein paar Überlegungen zur Zukunft des CMS das Nachmittagsprogramm ein.

Einblick in die CMS-Zukunft durch e-Spirit
Einblick in die CMS-Zukunft durch Sebastian Glock von e-Spirit

Welche Rolle wird ein CMS in den nächsten Jahren spielen und wie wandeln sich seine Aufgaben und Funktionen? Als mögliches Szenario wurde skizziert, dass ein CMS nur noch der reinen Bereitstellung von Content für verschiedene Endgeräte dienen wird, ohne ein konkretes Layout zu definieren. Die Inhalte werden dann von den Devices, zu denen zunehmend smarte Geräte zählen werden, abgerufen, User-individuell konfiguriert und ausgespielt.  

Case Studies zur Content-as-a-Service-Lösung (CaaS)

Zu diesen Gedanken passte der nächste Beitrag von Sebastian Glock und Lars Onasch gut: Sie stellten anhand einiger Case Studies den Einsatz der e-Spirit Content-as-a-Service-Lösung (CaaS) vor. Diese wurde auf der dmexco 2016 erstmals präsentiert und trägt der zunehmenden Digitalisierung und der stetig größeren Zahl an Touchpoints Rechnung. Diese müssen mit entsprechenden Mengen Content “gefüttert” werden. Mit der Content-Everywhere-Lösung können Inhalte CMS-unabhängig über eine API von verschiedenen Geräten abgerufen werden. Dazu müssen die Ausgabekanäle nicht vorher im Backend programmiert werden.  

Die unterschiedlichen Case Studies zeigten, dass die CaaS-Lösung sehr vielseitig und flexibel zu nutzen ist: Sie wurde bisher von jedem Kunden auf eine andere Weise und für andere Anforderungen, aber jedes Mal erfolgreich eingesetzt.

Role Specific View Architecture

In einem letzten Beitrag stellte Sebastian Glock die e-Spirit-Pläne zum Umbau des FirstSpirit Serversystems vor. Vorgesehen ist ein Baukasten-System für einzelne Komponenten, so dass es zukünftig viele kleine Microservices statt eines großen Servers geben soll. Außerdem ist ein separater Delivery Server für die Ausgabe der Webseiten geplant. Diese Änderungen sollen es Administratoren ermöglichen, einen Client zielgerichteter nach ihren Bedürfnissen zusammen zu stecken. Die Redaktion bekommt dann nur die Funktionen angezeigt, die auch wirklich benötigt werden.

Diskussionsrunden

Im Anschluss an die Vorträge gab es verschiedene Diskussionsrunden zu den bisher gehörten Themen, die mehr oder weniger gut besucht waren.

Mit den Vertretern von e-Spirit wurden u.a. Lizenzthemen diskutiert. Außerdem regten die Teilnehmer an, die Möglichkeiten für ein Distributed Development besser zu optimieren. Immer das Ziel im Blick, dass mehrere Entwickler effizienter zeitgleich an einem Projekt arbeiten können.

Enablement war ein weiteres wichtiges Thema. Um seine Partner-Agenturen noch besser im Projektgeschäft zu unterstützen, sind für die Zukunft mehr Webinare, WebEx-Meetings und Techinare speziell für Entwickler geplant. Einige haben in den letzten 4 Monaten schon stattgefunden, wie z.B. eins zum Thema “Neue Eingabekomponenten und DataAccessPlugins“. Einer unserer Themenwünsche in dem Zusammenhang ist die Vorschau eines hybris-Fensters bei der Integration der E-Commerce-Shopsoftware in FirstSpirit.

In einer Diskussionsrunde zum Projekt- und Modul-Entwicklungsprozess, die unsere FirstSpirit-Entwicklerin Mareike angestoßen und moderiert hat, fand ein gelungener Austausch zu den eingesetzten Technologien und Vorgehensweisen statt. Der Agentur-übergreifende Austausch wurde als sehr positiv empfunden.

Unser Fazit

Für uns war dieses Usergroup Treffen ein sehr interessanter Tag mit viel wertvollem Input und neuen Bekanntschaften. Selten haben wir sonst die Gelegenheit zu einem solch intensiven Austausch mit anderen FirstSpirit-Entwicklern.

Die nächste e-Spirit Usergroup ist bereits in Planung und das ist gut so, denn das Interesse an einem regelmäßigen Austausch ist groß. Unser Wunsch für zukünftige Treffen ist, dass die Beiträge noch stärker und konkreter in die Tiefen technischer Themen gehen. Wir freuen uns auf die nächsten Veranstaltungen!

Übrigens: Nähere Informationen zur e-Spirit Usergroup, seiner Gründung und seinen Zielen finden Sie auch hier:

1 Jahr e-Spirit Usergroup – ein Rückblick
Mitgründer Andreas Kämmer im Interview: Die wichtigsten Erkenntnisse aus einem Jahr e-Spirit Usergroup

Best Practice: Umzug dynamischer Websites in die Cloud

Webinar Umzug von Websites in die Cloud

Der Umzug einer Website in die Cloud kann für Unternehmen eine sinnvolle Alternative zum Server-Hosting sein: Vorteile wie flexible Skalierbarkeit, weltweite Content-Verteilung, geringere Kosten und die Steigerung der Geschwindigkeit im Deployment machen die Cloud vor allem für Unternehmen interessant, die an weltweit verteilten Standorte arbeiten.

Unser Webinar: Umzug in die Cloud am Beispiel des Dornbracht-Händlerportals 

Für unseren Kunden Aloys F. Dornbracht haben wir das Händlerportal beste-badstudios.de, das auf dem Sitecore CMS basiert, in die Microsoft Azure Cloud gebracht. Welche Vorüberlegungen wir dabei angestellt haben und wie sich der Umzug vollzogen hat, haben wir in Kooperation mit unserem CMS-Partner Sitecore in einem Webinar mit dem Thema “Umzug in die Cloud: Flexible, dynamische Websites und Digital Marketing am Beispiel beste-badstudios.de” gezeigt.

In dem Webinar in der vergangenen Woche hat unser Head of Account Management Johannes Tappmeier die verschiedenen Cloud-Möglichkeiten und die Vorteile der Microsoft Azure Cloud im Zusammenspiel mit Sitecore vorgestellt. Außerdem zeigt er, welche konkreten Schritte für den Umzug unseres Kundenprojekts beste-badstudio.de in die Azure Cloud nötig waren.

Dies sind die Webinar-Inhalte im Überblick:

  • Vorstellung des Händlerportals und Projekts “beste-badstudios.de”
  • Vom dedizierten Server zur Cloud: Wir stellen die Cloud-Arten Infrastruktur-as-a-Service (IaaS), Platform-as-a-Service (PaaS) und Software-as-a-Service (SaaS) und die damit einhergehenden unterschiedlichen Verantwortlichkeiten für den Anwender vor.
  • Sitecore on Azure: Wie bekommt man Sitecore in die Azure Cloud? Hier gibt es zwei Möglichkeiten: Zum einen die Standard Sitecore-Installation über den Marketplace ohne die Notwendigkeit technischer Kenntnisse, zum anderen die Nutzung des Azure Resource Manager (ARM) Templates & Web Deploy Packages, die eine flexiblere Installation und Konfiguration erlauben, aber auch mehr technische Fähigkeiten voraussetzen. 
  • Vorteile der Microsoft Azure Cloud wie Skalierbarkeit, hochperformante Bereitstellung von Mediadaten, Benutzerverwaltung, Multi-Plattform Support und Datenschutz nach deutschen Standards.
  • Was macht die Kombination der Microsoft Azure Cloud mit Sitecore interessant?
  • Umzug des Händerportals beste-badstudios.de in die Azure Cloud: Sie erfahren konkret die einzelnen Schritte auf dem Weg in die Cloud. U.a. wird erläutert, welche Cloud-Art wir für welche Anwendung genutzt haben.
  • Zum Schluss steht die Evaluierung der Lösung und ein Ausblick in die Zukunft der Azure Cloud.

Hier können Sie sich die komplette Webinar-Aufzeichnung anschauen:

Über das Portal beste-badstudios.de

Das Händlerportal DIE BESTEN BADSTUDIOS ist eine vom führenden Armaturenhersteller Dornbracht betriebene Website, auf der sich Badstudios präsentieren können. Momentan sind rund 660 Badstudios auf der Plattform vertreten. Die Verwaltung der Plattform wird von den Partnern und Dornbracht gemeinsam vorgenommen. Das Portal, das wir auf Sitecore-Basis realisiert haben, wird in der Azure Cloud betrieben.

Über die Microsoft Azure Cloud als Alternative zum Server-Hosting

Für dynamische und flexible Webseiten ist die Cloud eine echte Alternative zu dedizierten oder virtuellen Servern. Die Microsoft Azure Cloud ist eine der größten Cloud-Plattformen und stellt alle nötigen Services zur Verfügung, die das Hosting einer Corporate Website unterstützt. Aufgrund der gemeinsamen Windows-Basis ist die Azure Cloud besonders für Sitecore-basierte Websites eine interessante Lösung.

Der Google Tag Manager im Überblick

Einführung Google Tag Manager

Was ist der Google Tag Manager?

Im Oktober 2012 hat Google den Tag Manager veröffentlicht, der das Tracking auf Webseiten vereinfachen und unterstützen soll –  daher benötigt der Anwender für die Basisfunktionen keine speziellen Programmierkenntnisse.

Der Google Tag Manager ermöglicht die Messung und Identifizierung des Nutzerverhalten auf der Webseite und verbindet über Tracking-Codes gängige Web-Analyse und Marketing-Tools. Durch den Google Tag Manager kann so das Nutzerverhalten im Hintergrund verfolgt werden. Diese gewonnenen Daten können genutzt werden um Ihre Webseite zu verbessern und zu optimieren.

Wie funktioniert der Google Tag Manager?

Wurden bis dato auf jeder Webseite und Unterseite die Tracking-Codeschnipsel manuell durch Web-Entwickler hinzugefügt, reduziert der Tag Manager nun diese Arbeit um ein Vielfaches und öffnet diese Thematik damit einer breiteren Masse. Statt mehrere einzelne Codes zu implementieren, erfordert der Tag Manager nur noch eine einmalige Änderung am Quellcode.

Der Code macht den Unterschied

Der Google Tag Manager trennt die Implementierung des Tracking von HTML und JavaScript und beschleunigt so die internen Prozesse, da viele Tätigkeiten ohne umfangreiche Programmierkenntnisse durchgeführt werden können.

Der Code lässt sich wie folgt implementieren:

Dieses JS-Code-Snippet  gehört in den <head>

<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');</script>
<!-- End Google Tag Manager -->

Und das ist der <noscript>Teil mit iframe

<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

Weitere technische Informationen erhalten Sie auch hier:
https://developers.google.com/tag-manager/quickstart

Der Aufbau des Google Tag Manager

Anschließende Änderungen kann der Seitenbetreiber nun ohne aufwändige Anpassungen selbst erledigen. Ein weiteres Plus ist die Google-typische, nutzerfreundliche Oberfläche, auf der alles zentral verwaltet und gesteuert werden kann. Schnell & Effizient.

Die Verflechtung der wenigen Elemente im Google Tag Manager werden anhand der Grafik deutlich. Der Nutzer kann je nach Rechteverwaltung auf gesamte Accounts oder einzelne Container zugreifen. Ein Container ist bspw. einer Webseite zugeordnet und regelt in sich geschlossen Tags, Trigger (Regeln) und Variablen (Makros).

Aufbau des Google Tag Manager
© http://www.fourthsource.com/web-development/google-tag-manager-series-2-overview-15816

Was ist ein Tag?

Ein Tag ist ein Code-Schnipsel, der Informationen an Dienste von Dritten übermitteln kann.
Tags können genutzt werden um Informationen zu senden, sie definieren also WAS gemessen wird (z.B. “Formular gesendet”). Der Tag Manager integriert die Code-Schnipsel in die Webseite.

Was steuert ein Trigger im Google Tag Manager?

Eigentlich ganz einfach: die Regel legt fest, unter welchen Bedingungen ein Tag ausgelöst wird. Dies kann ein Seitenaufruf, ein Klick oder eine definierte Zeitspanne sein. Die Regel wird auch Trigger genannt.

Was sind Makros?

Makros – auch Variablen genannt – beschreiben die Daten innerhalb der Tags und Regeln genauer. Und ermöglichen auf einer gesonderten Ebene Variablen zu definieren. Dafür gibt es schon Vorlagen oder man kann sie frei definieren. Beispielsweise lässt sich die Google-Analytics-ID als Makro anlegen und so auf mehrere Seiten übertragen.

Was ist ein Container im Google Tag Manager?

Alle Tags im Tag Manager bilden zusammen einen Container. Dieser Container erhält eine eindeutige ID und wird über ein bereitgestelltes Container-Snippet auf allen Seiten Ihrer Webseite eingefügt. Durch das komfortable Tag-Management im Dashboard können bestehende Tags und Container einfach kopiert und auf andere Webseiten übertragen werden. Dies ist hilfreich wenn Sie z.B. mehrsprachige Länder-Webseiten verwalten.
Dabei kann der Tag Manager sein Hauptvorteil ausspielen – die Zeitersparnis bei der Pflege von großen Webseiten. Wurde der Container einmalig implementiert, werden die Inhalte (also die Tags) durch den Webseitenbetreiber beliebig verändert und gesteuert ohne dabei auf tiefgreifende technische Kenntnisse zurückgreifen zu müssen.

Welche Dienste werden vom Google Tag Manager unterstützt?

Kurz gesagt: viele – Tendenz steigend.
Nach der Installation hat man sofort Zugriff auf eine gute Auswahl fertiger Tag-Vorlagen. Die Bandbreite deckt gängige Lösungen bereits ab: Ob Tags zu Webanalyse-Werkzeugen, Heatmaps, Social Media, Konversion und natürlich ist auch das Google-Portfolio verfügbar.
Eine Liste der Vorlagen bzw. der unterstützten Tags gibt es hier.

Welche Vorteile bietet der Google Tag Manager?

  • Zentrale Verwaltung von Codes
    • Entlastung der IT + Webmaster
    • übersichtliche Struktur und sauberer Quellcode der Webseite
    • Durch die Nutzung der Container verbessert sich die Ladezeit der Webseite
    • Benutzerfreundliche Oberfläche
  • Große Anzahl vorkonfigurierter Codes
    • Regel und Trigger wählen – fertig
  • Umfangreiche Konfigurierbarkeit
    • individuelle Erstellung eigener Codes
    • Tags, Regeln und Variablen sind beliebig kombinierbar
    • Hierarchien lassen sich anlegen (zB Vorrang für Google Analytics-Tag)
  • Vorschaumodus
    • Möglichkeit der Funktionsprüfung und Debugging von Tags
    • Simulation der aktuellen Container-Konfiguration auf der Seite durch den Tag Manager
    • automatische Überprüfung der Tag-Einbindung
  • Versionsbasierte Dokumentation
    • Versionshistorie der Container und Tags wird transparent gespeichert
    • Welches Teammitglied einen Tag erstellt hat oder Änderungen vorgenommen hat, ist in der Übersichtsdarstellung sofort ersichtlich
    • Wiederherstellung einer früheren Version ist möglich

Grenzen des Google Tag Managers

  • Die Anzahl der sofort nutzbaren Tags ist überschaubar. Die Erstellung eigener Tags setzt Grundkenntnisse in HTML voraus und je nach Komplexität auch JavaScript.
  • Besondere Anforderungen an Tags und die Einbindung von weiteren Diensten erreichen schnell die Grenzen des Marketers und erfordern weitergehende Programmierfähigkeiten.
  • Die Möglichkeiten Änderungen in den Tags selbst umzusetzen, umgeht möglicherweise Qualitätssicherungs-Prozesse der IT und bergen Fehlerpotenzial.
  • Nutzen Sie andere Tools abseits des Google-Portfolios, z.B. zur Webanalyse oder Monitoring, müssen Sie entscheiden ob es für Sie nicht zu aufwändig ist, die Tags im Google Tag Manager zu pflegen. Gerade im Bereich der Marketing-Plattformen gibt es hier Lösungen, die bereits einen integrierten Tag Manager besitzen.
  • Die Anbindung an “Nicht-Google”-Analytics-Produkte ist standardmäßig nicht gewährleistet und muss individuell programmiert werden möchte man bspw. Sitecore Analytics oder Adobe Analytics mit den gewonnen Datensätzen versorgen.
  • Eine rollenbasierte Rechtevergabe ist nicht vorhanden, um bspw. der Marketing-Abteilung das publizieren auf einer Testseite zu ermöglichen – die letztendliche Veröffentlichung aber einer übergeordneten Hierarchieebene zuzuweisen.

Fazit

Dieser erste Überblick soll nur einen ersten Eindruck von den Nutzungsmöglichkeiten des Google Tag Manager geben. Zusammenfassend macht der Tag Manager vor allem Sinn, wenn auf den eigenen Webseiten ein umfassendes Tracking eingesetzt werden soll und dabei auf Tools von Google oder Drittanbieter zurückgegriffen werden soll.
Die wesentlichen Stärken sind dabei die Benutzerfreundlichkeit, keine erforderlichen Programmierkenntnisse und die Ressourcenersparnis.

In diesem Einführungsvideo von Google können Sie sich eine Zusammenfassung der Anwendung und Funktionen des Tag Manager anschauen: Zum Video

SEO: Paginierung für Onlineshops und inhaltsreiche Seiten

Paginierung mit rel="next" und rel="prev"

Onlineshop-Betreiber kennen das Problem: Produktkategorieseiten beinhalten oftmals viele Produkte, die über mehrere Seiten verteilt dargestellt werden.

UPDATE: Google hat bekannt gegeben, dass die Auszeichnung mit rel=“prev“ und rel=“next“ nunmehr kein Indexierungssignal darstellt.

Ohne weiteres Zutun indexieren die Suchmaschinen diese Seiten separat und erkennen hier doppelten Inhalt (“duplicate content”).
Mit ein paar Handgriffen zeigen wir, wie dieses Problem vermieden werden kann.

Alles auf einer Seite: Bietet sich eine Gesamtansicht an?

Zuallererst sollten Sie sich die Frage stellen, ob Sie Ihren Besuchern eine “view-all”-Seite anbieten möchten, d. h. alle Produkte – oder besser: alle Elemente, die normalerweise über mehrere Seiten verteilt dargestellt werden – finden Sie dann auf einer Gesamtseite wieder.

Paginierung Gesamtseite

Vorteil: Die paginierten Seiten 1 bis n verweisen über den sogenannten canonical-Tag auf die Seite, auf der die Inhalte zusammengeführt werden. Über einen canonical-Tag teilen Sie den Suchmaschinen mit, wie diese mit (weitgehend) identischen Inhalten verschiedener Seiten umgehen soll. Durch die Angabe verweisen Sie auf eine Orginalressource bzw. URL .

Nachteil: Was bei einem mehrere Seiten langen News-Artikel, der vorzugsweise aus textlichem Inhalt besteht, charmant klingt, stößt bei der Produktkategorieseite eines Onlineshops mit hunderten Artikeln samt Produktbildern auf das Problem langer Ladezeiten. Da Latenzen ein Rankingfaktor sind, hört bei Google der Spaß bei Ladezeiten jenseits von drei Sekunden schnell auf.

Ohne Gesamtansicht: Inhalte auf mehrere Seiten verteilt

In solchen Fällen ist eine “view-all”-Page nicht sinnvoll. Hier empfiehlt es sich, alle Folgeseiten, also die Seiten 2 bis n (n=letzte Seite) als ergänzende oder weiterführende Seiten zu kennzeichnen. Sie teilen der Suchmaschine mit, dass die Seiten 1 bis n zusammengehören, also im Grunde als „Kapitel“ in das Inhaltsverzeichnis aufgenommen werden sollen.

Paginierung mit rel="next" und rel="prev"

Die Auszeichnungen erfolgen im <head> Bereich des Markup. Auf der ersten Seite teilen Sie der Suchmaschine über ein <link> Element mit, dass es weitere, ergänzende Seiten gibt:
<link rel=”next” href=”seite-2.html”>

Auf der zweiten bis vorletzten Seite (Kompontentenseiten) definieren Sie die vorige und die nachfolgende Seite:
<link rel=”prev” href=”seite-1.html”>
<link rel=”next” href=”seite-3.html”>

Auf der letzten Seite reicht der Hinweis auf die vorige Seite (eine nächste Seite gibt es ja nicht):
<link rel=”prev” href=”seite-n-1.html”>

Ergänzend soll verhindert werden, dass die Seiten 2 bis n in den Index der Suchmaschinen aufgenommen werden (die Linkkraft der Produkte hingegen soll behalten werden). Dazu bedienen Sie sich folgenden Elements:
<meta name=”robots” content=”noindex, follow”>

Bitte achten Sie darauf, dass die erste Seite ganz regulär indexiert werden darf:
<meta name=”robots” content=”index, follow”>

Zusätzlich zu rel=”prev” und rel=”next” lässt beispielsweise Zalando die Komponentenseiten (Folgeseiten) via canonical-Tag auf die kanonische URL zeigen. Das sieht dann in etwa so aus:
<link rel="canonical" href="seite-1">
Im href-Attribut sind übrigens relative und absolute Pfadangaben erlaubt.

Viele Wege führen nach Rom

Wie oftmals im Online-Marketing gibt es auch in Sachen Paginierung unterschiedliche Herangehensweisen.
So verzichten einige Online Shops auf den Einsatz von rel=”prev” und rel=”next” und verweigern den Suchmaschinen über die Meta-Robots die Indexierung der Komponentenseiten.

Welche Variante Sie auch bevorzugen: Das Hauptaugenmerk sollte darauf liegen, doppelten Inhalt zu vermeiden. Ob Sie dies nun mit einer „view all“ Seite oder über die Angaben im <head> Bereich Ihrer Seite lösen, hängt nicht zuletzt auch vom Kontext ab: Verteilen sich vorwiegend textliche Inhalte über mehrere Seiten, kann eine Gesamtseite – auch unter Usabilty-Gesichtspunkten – ideal sein. Bei bildlastigen Produktkategorieseiten sind rel="prev" und rel="next" sicherlich die bessere Wahl.

Hier sei noch angemerkt, dass nicht sicher ist, ob andere Suchmaschinen wie bpsw. Bing die Attributswerte „next“ und „prev“ in gleicher Weise interpretieren wie Google. Google selbst hat bereits im September 2011 erklärt, die Paginierung von Seiten mit rel=“next“ und rel=“prev“ zu unterstüzen.

E-Spirit Usergroup: Perfekter Auftakt im Unperfekthaus

ESUG Gründungsveranstaltung

Unter dem Motto “Real-Life Community für FirstSpirit-Anwender” nahmen rund 40 Teilnehmer an der Auftaktveranstaltung zur Gründung der e-Spirit Usergroup – kurz ESUG – teil.
Das Unperfekthaus in Essen ist Anlaufstelle für Kreative, Co-Worker und bietet neben den Seminarräumen auch Ausstellungsflächen, eine Bühne, eine riesige Dachterrasse und mehrere “WG-Zimmer”.

Aufgrund des zahlreichen und positiven Feedbacks war der Wunsch einer Community für Anwender, Nutzer und Dienstleister schon im Vorfeld der Planungen spürbar gewesen.

Die Teilnehmer-Erwartungen reichten vom konkurrenzfreien Netzwerken, dem Austausch von Erfahrungen und Best-Practices bis hin zum konkreten Vorantreiben von speziellen Anforderungen/ Optimierungen.

Was ist also der Kerngedanke der ESUG?

Die Usergroup möchte den Anwendern, Kunden und Partnern eine unabhängige Plattform bieten, um gegenüber e-Spirit als Hersteller eine Interessenvertretung zu bilden. Durch intensiven Austausch von Wissen und Erfahrungen werden außerdem Synergien zwischen den Partnern geschaffen.

ESUG Gründungsveranstaltung

Die Gründungsveranstaltung

Die Veranstaltung begann mit einem Meet&Greet für die Dienstleister, Freiberufler, Agenturen, Modulhersteller und Kunden. So konnten die Teilnehmer direkt neue Kontakte knüpfen, bestehende auffrischen und vorab die ersten informellen Gespräche führen.

Jörn Bodemann ließ es sich als CEO der e-Spirit AG nicht nehmen, dem gesamten Projekt seine Unterstützung zuzusichern und kündigte den bevorstehenden e-Spirit Partnertag im Phantasialand Brühl an.

Michael Bartz von der USU AG veranschaulichte, wie man Herausforderungen üblicher Anwender-Szenarien durch die Vereinigung der Stärken von CMS und Portalen am Beispiel von Liferay begegnen kann.

Warum gründet man eine Usergroup?

Es gibt viele Gründe sich in einer Interessengruppe zu organiseren – die ausschlaggebendsten sind wohl die gleichen Ziele:

  • Steigerung der Kundenorientierung und -zufriedenheit.
  • Alle erhalten gemeinsam eine gewichtige Stimme gegenüber dem Hersteller.
  • Gemeinsam kann man voneinander lernen und Erfahrungen aus erster Hand austauschen.
  • Miteinander kann man die gängigen Painpoints beim Hersteller anmerken.
  • Zusammen können eigene Module, Features und Lösungen erarbeitet werden.
  • Eine Verbesserung der Entwickler- und Anwenderorientierung.

Außerdem soll über Kooperationen der Nachwuchs aktiv gefordert und gefördert werden und damit auch ein wichtiger, gemeinnütziger Beitrag geleistet werden.

Vortrag von Andreas Kämmer, comspace bei der ESUG Gründungsveranstaltung

Vereinsgründung mit (e-)Spirit

Nach der Mittagspause ging es im zweiten Teil um die Gründung des Vereins mit allen organisatorischen Facetten:

  • Welche Voraussetzungen sollen künftige Mitglieder mitbringen?
  • Wie kann sich der Verein seine Hersteller-Unabhängigkeit bewahren?
  • Was soll zukünftig Inhalt kommender Veranstaltungen sein?
  • Welche Veranstaltungsarten, wie z.B. Roundtables, Barcamps, Workhops sind seitens der Mitglieder gewünscht?
  • Wie soll der fachliche Austausch stattfinden
  • Wie werden gemeinsam erarbeitete Produkte, Projekte, Konzepte & Techniken zukünftig gehandhabt?

Die beschlossenen Details zur Usergroup, können in Kürze in der aktuellen Satzung eingesehen werden.

Der Vorstand:

Im Rahmen der ersten Gründungssitzung wurde der Verein gegen 17.05 Uhr gegründet und der Vorstand wie folgt gewählt:
1. Vorsitzender – Andreas Kämmer, comspace GmbH & Co.KG
2. Vorsitzender – Dirk Langenheim, Intentive GmbH
3. Vorsitzender – Andreas Gromadecki, Pinuts media + science GmbH

Zukunftsausblick

Als erste, kurzfristige Maßnahmen wurden beschlossen die Mitgliederwerbung und die thematische Schwerpunktsetzung für die kommenden Veranstaltungen in den Vordergrund zu stellen. Daneben wurde die erste Kooperation mit dem anstehenden e-Spirit Barcamp angeregt, die Bildung von technisch ausgerichteten Arbeitskreisen oder Kooperationen mit Hochschulen.

Die Erwartungen an kommende Veranstaltungen sind hoch. So könnten Teilnehmer Ihre eigenen Erfahrungen in Form von Usecases und Workarounds teilen, wie es hier zum Beispiel Arithnea und Publicis Pixelpark vormachen.
Wer sich nun von den Vorteilen der Usergroup angesprochen fühlt und mitmachen möchte, kann sich auf www.e-spirit-usergroup.de gleich anmelden oder auf Twitter unter dem Hashtag #esug auf dem Laufenden bleiben.

Sitecore Commerce Connect – Teil 5: Warenkorb verwalten

Bisher ging es in dieser Serie um die Verwaltung und Darstellung von Produkten und Preisen aus Hybris. Das Ziel dieses Artikels ist es auch erste Prozesse rund um den Warenkorb mittels Sitecore Commerce Connect abbilden zu können.

Warenkorb

Die zentrale Überlegung am Anfang eines Projektes ist, welches System zu welcher Zeit die Zuständigkeit für den Warenkorb hat. Wird der Warenkorb immer auf beiden Seiten synchron gehalten, das heißt jede Änderung am Warenkorb wird unmittelbar an das externe Shopsystem (kurz ECS) gemeldet, oder wird der Warenkorb im ECS nur zu definierten Zeitpunkten synchronisiert, also z.B. beim Checkout? Letzteres bedingt weniger Requests an das ECS, aber Sitecore-seitig ist dann z.B. eine Warenkorbwertermittlung erforderlich, die im schlechtesten Fall nicht mit der im ECS synchron ist.

Warenkorb-Verwaltung

Im Rahmen unserer Evaluierung ist das ECS für den Warenkorb zuständig und Sitecore meldet alle Änderungen unmittelbar an das ECS. Für die Darstellung auf der Webseite werden die Daten rund um den Warenkorb wiederum immer online vom ECS abgefragt.
Außerdem haben wir uns entschieden, den mitgelieferten Engagement Plan ‘Abandoned Carts’ gleich mit zu nutzen, zumal dafür scheinbar keine weitere Implementierung erforderlich ist.

Warenkorb anlegen/ abfragen

Für alle Funktionen rund um den Warenkorb ist der Service Provider ‚CartServiceProvider‘ des Cart Service Layers zuständig.

Beispiel Verwendung CartServiceProvider.CreateOrResumeCart

[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;

namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
public const string TrackerAttachmentKeyCart = "Comspace.Sitecore.CommerceConnect_Cart";

public static Cart GetCart()
{
if (!Tracker.Current.Contact.Attachments.ContainsKey(TrackerAttachmentKeyCart))
{
//create cart
var createOrResumeCartRequest = new CreateOrResumeCartRequest(
"Website",
Context.User.Profile.Email,
"Default",
Context.User.Profile.Email); //NOTE FindCartInEaState: c.CustomerId == request.CustomerId
var cart = new CartServiceProvider().CreateOrResumeCart(createOrResumeCartRequest).Cart;

//persist cart
Tracker.Current.Contact.Attachments[TrackerAttachmentKeyCart] = cart;
}
return Tracker.Current.Contact.Attachments[TrackerAttachmentKeyCart] as Cart;
}
}

//…
}
[/csharp]

Pipeline loadCart

Die Anbindung des ECS erfolgt mittels Erweiterung der Pipeline ‚loadCart‘ der Sitecore.Commerce.Carts.config.
.config

[xml]
<!– LOAD CART
Gets the cart object that matches the specified criteria.
This pipeline is responsible for reading data for a specific cart that is managed by the commerce system.
This pipeline reads the cart data from the commerce system and converts that data into the Commerce format.
–>
<commerce.carts.loadCart>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts.LoadCart, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.LoadCart.LoadCartFromEaState, Sitecore.Commerce‘]"/>
</commerce.carts.loadCart>
[/xml]

Processor LoadCart

[csharp]
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model.Cart;
using Comspace.Sitecore.CommerceConnect.Services.Carts;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Pipelines.Carts.Common;
using Sitecore.Commerce.Services.Carts;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts
{
/// <summary>
/// commerce.carts.loadCart
/// </summary>
public class LoadCart : CartPipelineProcessor
{
public override void Process(ServicePipelineArgs args)
{
var loadCartRequest = args.Request as LoadCartRequest;

//get from ECS
ExternalCart externalCart = CartConnector.Load(global::Sitecore.Context.Language.Name, loadCartRequest.UserId);

//convert to commerce connect cart
Cart cart = new Cart();
cart.ExternalId = externalCart.Code;
cart.ShopName = loadCartRequest.ShopName;
cart.UserId = loadCartRequest.UserId;

//init totals
cart = CartManager.UpdateCartTotals(cart); //NOTE prevent multiple request

//persist for next processor
((CartResult) args.Result).Cart = cart;
}
}
}
[/csharp]

Produkt zum Warenkorb hinzufügen

Beispiel Verwendung CartServiceProvider.AddCartLines

[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;

namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
//…

public static Cart AddLine(string externalId, string sitecoreItemId, uint quantitiy)
{
Cart cart = GetCart();

//create cartlines
List<CartLine> lines = new List<CartLine>
{
new CartLine
{
Product = new CartProduct
{
ProductId = externalId,
SitecoreProductItemId = new ID(sitecoreItemId),
Price = PriceManager.GetPrice(externalId, Context.Language)
},
Quantity = quantitiy,
LineNumber = (uint) (cart.Lines.Count + 1)
}
};

//add cart lines
AddCartLinesRequest addCartLinerequest = new AddCartLinesRequest(cart, new ReadOnlyCollection<CartLine>(lines));
CartResult cartResult = new CartServiceProvider().AddCartLines(addCartLinerequest);

return cartResult.Cart; //result contains the updated cart
}
}
}
[/csharp]

Pipeline addCartLines

.config

[xml]
<!– ADD CART LINES
This pipeline is responsible for adding a new line to the shopping cart and recording a corresponding page event in DMS.
This happens when a product is added to the cart.
–>
<commerce.carts.addCartLines>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts.AddLineToCart, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.AddCartLines.AddLinesToCart, Sitecore.Commerce‘]"/>
</commerce.carts.addCartLines>
[/xml]

Processor AddCartLines

[csharp]
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Carts;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts
{
/// <summary>
/// commerce.carts.addCartLines
/// </summary>
public class AddLineToCart : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var cartLinesRequest = args.Request as CartLinesRequest;

//add to ECS
Cart cart = cartLinesRequest.Cart;
CartLine cartline = cartLinesRequest.Lines.First();
CartConnector.AddLineToCard(global::Sitecore.Context.Language.Name, cart, cartline);
}
}
}
[/csharp]

Warenkorb Summen

Damit die Summen im Warenkorb immer korrekt sind und keine Sitecore-seitige Berechnung stattfinden muss, werden auch die Warenkorb Summen immer online aus dem ECS geholt. Dafür muss die Pipeline ‘saveCart’ erweitert werden:

Pipeline saveCart

.config

[xml]
<!– SAVE CART
Saves the cart object to the external system and in Sitecore EA state.
–>
<commerce.carts.saveCart>
<processor type="Comspace.Sitecore.CommerceConnect.Pipelines.Carts.UpdateCartTotals, Comspace.Sitecore.CommerceConnect" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.Common.SaveCartToEaState, Sitecore.Commerce‘]"/>
</commerce.carts.saveCart>
[/xml]

Processor UpdateCartTotals

[csharp]
using Comspace.Sitecore.CommerceConnect.Services.Carts;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Carts;

namespace Comspace.Sitecore.CommerceConnect.Pipelines.Carts
{
/// <summary>
/// commerce.carts.saveCart
/// </summary>
public class UpdateCartTotals : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var cartRequest = (CartRequestWithCart) args.Request;

//get from ECS
Cart cart = CartManager.UpdateCartTotals(cartRequest.Cart);

//persist for next processor
((CartResult) args.Result).Cart = cart;
}
}
}
[/csharp]

Beispiel Verwendung PricingServiceProvider.GetCartTotal

[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;

namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
//…

public static Cart UpdateCartTotals(Cart cart)
{
var request = new GetCartTotalRequest();
request.Cart = cart;

//get from ECS
var cartTotalResult = new PricingServiceProvider().GetCartTotal(request); //result contains the updated cart

Tracker.Current.Contact.Attachments[TrackerAttachmentKeyCart] = cartTotalResult.Cart; //refresh cache
return cartTotalResult.Cart;
}
}
}
[/csharp]

Stolpersteine

Der Processor ‘FindCartInEaState’ benötigt eine CustomerId, damit der Contact ermittelt werden kann. Dafür muss die eigentlich optionale CustomerId mit an den ‘CreateOrResumeCartRequest’ übergeben werden (siehe oben). Anderenfalls wird immer wieder ein neuer Warenkorb angelegt, obwohl für den Contact bereits einer existiert.

Resumé

Und auch diesen letzten Beitrag möchte ich mit ein paar Eindrücken und Erkenntnissen abschließen:

  • Der Cart Sercice Layer ist sehr umfangreich und im Rahmen der Evaluierung konnte nur ein sehr kleiner Ausschnitt evaluiert werden.
  • Eine Herausforderung in einem echten Projekt sind die Zuständigkeit und Synchronisation zwischen dem Sitecore Shop und dem ECS. Was wird wo zwischengespeichert und wann an wen gemeldet?
  • Wie auch schon unter Stolpersteine beschrieben, war der Zugriff auf die Contacts im Engangement Plan (automatisch im Hintergrund) immer wieder holprig. Eine der Ursachen war sicherlich die Entwicklungsumgebung: wechselnde Browser, plötzliche Neustarts etc.  Hier müsste in einem echten Projekt eine kritische Analyse erfolgen.
  • Auch dem Umgang mit Fehlern in der Verarbeitung muss in einem echten Projekt eine hohe Aufmerksamkeit gewidmet werden – Stichwort Transaktionssicherheit.

So, das war’s erstmal von meiner Seite zum Thema Commerce Connect. Ich freue mich über euer Feedback 🙂

Alle voran gegangenen Artikel dieser Serie findet ihr hier:
Teil 1: Ein Überblick
Teil 2: Produkte synchronisieren
Teil 3: Klassifizierungen synchronisieren
Teil 4: Preise darstellen

Sitecore Commerce Connect – Teil 3: Klassifizierungen synchronisieren

Im letzten Teil dieser Serie ging es um die Synchronisation von Produkten. Das Ziel dieses Blog-Artikels ist es auch Klassifizierungen unidirektional aus dem Sitecore heraus mit dem externen Commerce System (kurz ECS, in unserem Fall Hybris) zu synchronisieren und den Produkten zuzuordnen.

Klassifizierungen sind im Projekt individuell definierbare Spezifikationen zur Beschreibung von Produkten. Die sog. Classifications in Sitecore können über eine Parent-Verknüpfung (ExternalParentID) beliebig geschachtelt werden, die erste Ebene ist aber immer eine Gruppe, eine sog. ClassificationGroup.
ClassificationRepo

Synchronisation Klassifizierungen

Um Klassifizierungen zu synchronisieren muss zunächst die Pipeline ’synchronizeClassifications‘ der Sitecore.Commerce.Products.config erweitert werden:

Pipeline synchronizeClassifications

.config

[xml]
<!– SYNCHRONIZE CLASSIFICATIONS –>
<commerce.synchronizeProducts.synchronizeClassifications>
<processor type="Sitecore.Commerce.Pipelines.Products.SynchronizeClassifications.ReadSitecoreClassifications, Sitecore.Commerce">
<patch:delete />
</processor>
<processor type="Sitecore.Commerce.Pipelines.Products.SynchronizeClassifications.ResolveClassificationsChanges, Sitecore.Commerce">
<patch:delete />
</processor>
<processor type="Sitecore.Commerce.Pipelines.Products.SynchronizeClassifications.SaveClassificationsToExternalCommerceSystem, Sitecore.Commerce" >
<patch:delete />
</processor>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications.ReadClassifications, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Products.SynchronizeClassifications.ReadExternalCommerceSystemClassifications, Sitecore.Commerce‘]" />
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications.ReadClassificationGroups, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Products.SynchronizeClassifications.ReadExternalCommerceSystemClassifications, Sitecore.Commerce‘]" />
</commerce.synchronizeProducts.synchronizeClassifications>
[/xml]

Processor ReadClassificationGroups

[csharp]using System.Collections.Generic;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeClassifications
/// </summary>
public class ReadClassificationGroups : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizationRequest;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>; //integration guide (page 9)
groups = groups ?? new List<ClassificationGroup>();

//get groups from ECS
IEnumerable<ExternalCategoryGroup> categoryGroups = ClassificationConnector.Load(request.Language);

//convert and add to commerce connect list
groups.AddRange(from @group in categoryGroups
select new ClassificationGroup
{
ExternalId = @group.Code,
Name = @group.Name
});

//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}
}
}[/csharp]

Processor ReadClassifications

[csharp]using System.Collections.Generic;
using System.Collections.ObjectModel;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeClassifications
/// </summary>
public class ReadClassifications : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizationRequest;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>; ////integration guide (page 9)
groups = groups != null ? groups : new List<ClassificationGroup>();

foreach (ClassificationGroup group in groups)
{
var classifications = new List<Classification>();

//get categories from ECS
foreach (ExternalCategory externalCategory in ClassificationConnector.Load(group.ExternalId, request.Language)) //TBD
{
//convert to commerce connect classification
var classification = new Classification();
classification.ExternalId = externalCategory.Code;
classification.Name = externalCategory.Name;
classifications.Add(classification);

//…with sub-classifications
HandleSubCategories(externalCategory, classifications);
}
group.Classifications = new ReadOnlyCollection<Classification>(classifications);
}

//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}

private static void HandleSubCategories(ExternalCategory parentCategory, List<Classification> allClassifications)
{
if (parentCategory.Categories != null)
{
foreach (var category in parentCategory.Categories)
{
var classification = new Classification();
classification.ExternalId = category.Code;
classification.Name = category.Name;
classification.ExternalParentId = parentCategory.Code;

allClassifications.Add(classification);
HandleSubCategories(category, allClassifications);
}
}
}
}
}
[/csharp]

Klassifizierungen Produkten zuordnen

Anschließend müssen die Klassifizierungen nur noch den Produkten zugeordnet werden. Und auch dafür muss wieder eine Pipeline der Sitecore.Commerce.Products.config erweitert werden:

Pipeline synchronizeProductClassifications

.config

[xml]<!– SYNCHRONIZE PRODUCT CLASSIFICATIONS
This pipeline is responsible for synchronizing and updating the references between a given product and associated classifications and categories within.
It’s assumed that classifications are already synchronized and present in CMS.
The references to categories are stored directly on the main product item. –>
<commerce.synchronizeProducts.synchronizeProductClassifications>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products.ReadProductClassifications, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Products.SynchronizeProductClassifications.ReadExternalCommerceSystemProductClassifications, Sitecore.Commerce‘]" />
</commerce.synchronizeProducts.synchronizeProductClassifications>[/xml]

Processor ReadProductClassifications

[csharp]using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeProductClassifications
/// </summary>
public class ReadProductClassifications : ReadProduct
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizeProductRequest;
var product = request.Properties["Product"] as Product;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>;
groups = groups != null ? groups : new List<ClassificationGroup>();

//get product from ECS
ExternalProduct externalProduct = ProductConnector.Load(request.Language, product.ExternalId); //tbd
if (externalProduct != null && IsProductValidForImport(externalProduct))
{
//convert to commerce connect product classification groups and classifications
foreach (ExternalCategoryGroup externalCategoryGroup in externalProduct.CategoryGroups)
{
ClassificationGroup group = new ClassificationGroup();
group.ExternalId = externalCategoryGroup.Code;
group.Name = externalCategoryGroup.Name;

IEnumerable<Classification> classifications = from externalCategory in externalCategoryGroup.Categories
select new Classification
{
ExternalId = externalCategory.Code,
Name = externalCategory.Name
};
group.Classifications = new ReadOnlyCollection<Classification>(classifications.ToList());

groups.Add(group);
}
}

//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}
}
}[/csharp]

Resumé

Mein erster Eindruck:

  • Es gibt viel Dokumentation, aber z.B. zum Thema Zuordnung von Klassifikationen zu Produkten konnte ich nichts finden. Da habt ihr es jetzt ja besser 😉 Häufig war dann doch dotPeek mein bester Freund.
  • Der Differenzabgleich funktionierte problemlos, Mehrsprachigkeit war im Kontext der Zuordnung von Klassifizierungen zu Produkten noch etwas holprig, da sollte ein zweiter Blick erfolgen.

Wenn ihr mehr zum Sitecore Commerce Connect wissen wollt, dann schaut mal hier: