VCR.NET 4.5 is coming…

Nun gut ich habe vor einiger Zeit hier gepostet, dass VCR.NET nicht weiterentwickelt wird – also was soll das? Naja, im Prinzip stimmt die damalige Aussage auch noch: VCR.NET 4.5 ist die erste Version, die weder eine neue DVB.NET Version mit bringt noch Änderungen im Programmcode des Dienstes enthält. Tatsächlich basiert VCR.NET 4.5 auf der aktuellen DVB.NET Version 4.3 und auch sonstige Abhängigkeiten wie etwa Microsoft .NET 4.5.1 wurden nicht verändert.

Ja, aber was soll denn dann die neue Version? VCR.NET war vom ersten Tag an meine Spielwiese um neue Dinge praktisch auszuprobieren. Mit dem aktuellen HTML5 / JavaScript Web Client habe ich mich unter anderem in jQuery / jQueryUI eingearbeitet und sehr viel drumherum von Hand programmiert – damit ist nicht zwingend gesagt, dass das eine schlechte Idee war: es hat mir einiges an Verständnis der Anforderungen an typische Ui Frameworks wie AngularJs oder React.Js gebracht. Mit 4.5 wurde der Web Client vollständig erneuert und es wird auch kein jQuery(UI) mehr verwendet. Ich habe mich aus verschiedenen Gründen für React.Js entschieden, den Code aber schon so vorbereitet, dass man später im View Bereich etwas flexibler wird – dazu in einem eigenen Post mehr, aber zumindest gab es für mich daraus überzeugende (subjektive!) Gründe, nicht auf AngularJS zu setzen.

Auch wenn sich der Code des Dienstes nicht verändert hat und dieser hoffentlich weiterhin so stabil wie bisher arbeitet, kann durch die Vollerneuerung des Web Clients doch so einiges schief laufen. Ich habe die aktuelle Version gestern in den produktiven Betrieb genommen und schon erste kleine Probleme beseitigt, aber da ist sicher noch Luft nach unten 🙂 Vor diesem Hintergrund trotzdem: wer Lust hat, sich die neue Version einmal anzuschauen (es sollte sich von der Oberfläche her eigentlich nicht wirklich etwas geändert haben: lediglich Details im Aussehen, aber nichts Großes) und mich beim Testen freiwillig und auf eigene Gefahr unterstützen möchte: VCR.NET 4.5 Release Candidate. Vielen Dank im Voraus für jede konstruktive Kritik!

Der einzige mir bisher bekannte Wermutstropfen: die Custom42.css funktioniert nicht mehr, da sich die Layout Struktur vollständig verändert hat! Ich habe daher eine neue Referenz auf eine potentielle Custom45.css eingerichtet, aber man fängt da leider wieder von vorne an. Zudem ist mein Zeitbudget für die neue Version jetzt fast erschöpft und ich habe mit bisher wenige Gedanken um eine CSS Klassenstruktur zu machen und werde wohl auch nicht mehr dazu kommen. Konkret heißt das, dass es bis zu einer gewissen Ebene wohldefinierte CSS Klassen gibt, aber Spalten in Tabellen oder Zeilen in Formularen oft mit :nth-child(), :last-child, :first-child usw. angesprochen werden. Sehr unschön für ein Customized Styling – Sorry!

So, dass muss dazu erst einmal reichen!

Viel Spaß beim Testen

Jochen

PS: Ach ja, noch eine Kleinigkeit: ich habe bei der auf TypeScript mit React.Js (TS und TSX) basierenden Programmstruktur auf das Zusammenführen vieler einzelner Dateien in eine Anwendungsdatei gesetzt – die vorherige Version hatte nur zwei Quelldateien! Mir war es zu mühsam, die Quellen in das Installationsprogramm aufzunehmen. Das heißt, dass die Installation nun nicht mehr anbietet, die Quellen lokal mit zu installieren. Das ist nicht wirklich ein Problem, da man immer den aktuellen Stand auf GitHub findet: VCR.NET Quellcode auf GitHub.

VCR.NET 4.3.52: kleinere Fixes

Ich musste nun doch zwei kleine nervige Fehler beheben:

  • Läuft mehr als eine Aufzeichnung (egal ob auf einer oder mehreren Karten) und man beendet eine manuell mit gleichzeitigem Unterdrücken des Übergangs in den Schlafzustand (was in diesem Fall eigentlich sinnlos ist, da ja noch mindestens eine weitere Aufzeichnung aktiv ist!), so geht der Dienst auch nach Beenden aller anderen Aufzeichnungen nicht in den Schlafzustand.
  • Hat man einen Suchfavoriten definiert, bei dem ein Filter auf Fernsehsendung oder Radioausstrahlung aktiv ist, so wird dieser Filter in der Favoritenansicht nicht berücksichtigt und die angezeigte Anzahl ist eventuell zu groß – richtig lästig, wenn die Anzahl eigentlich 0 sein sollte. Tatsächlich ist nur die angezeigte Anzahl falsch, der Aufruf des Favoriten meldet die korrekten Sendungen in der Programmzeitschrift.

Dann habe ich noch was ganz Dummes getan: ich habe auf die aktuelle Version von jQuery (3.1.1) und jQueryUI (1.12.1) umgestellt, was erst einmal einige Clitches in der Oberfläche nach sich zog. Einiges habe ich korrigiert, einiges ist anders aber in Ordnung und einiges nicht mehr so schön wie vorher aber erträglich. Im Moment fehlt mir die Zeit, die (CSS / LESS) Styles anzupassen, aber da ich den VCR.NET Recording Service ja auch selbst nutze werde ich nach und nach versuchen, die Ecken und Kanten zu glätten.

Wie dem auch sei: der aktuelle Stand kann direkt von mir (VCRNET.msi) oder auch von Heise bezogen werden.

Viel Spaß weiterhin

Jochen

CoffeeBreak – Nachschlag zum Fazit

Nur so als kleiner Abschluss zum vorläufigen Fazit:

  • JOIN funktioniert wie dokumentiert
  • Eindeutige Schlüssel gehen wie im Internet beschrieben, die Dokumentation scheint mir aber unvollständig zu sein (EnforceUniqueValues im CAML)
  • Ein Pflichtfeld (Required TRUE) habe ich nicht hinbekommen: über JSOM kann man auch Items ohne Wert einspielen

Ich denke, dass war es für diese Evaluation – vielleicht irgendwann einmal mehr.

Jochen

CoffeeBreak – Gruppierung und Aggregation

Und es geht natürlich doch direkt aus JSOM heraus – ein erstes Sorry an SharePoint! Schickt man ein geeignetes View XML an renderListData einer Liste, dann erhält man alle gewünschten Aggregationen – alle Zahlen zwar als Zeichenketten, aber wenn man das weiß ist das mit einem parseFloat schnell erledigt [naja: modulo kleiner LCID Missverständnisse zwischen Client und Server, produktiv wäre da noch nicht das letzte Wort gesprochen]. In der Evaluation passiert das so:

  • Der Controller setzt die Suche mit der eigenen Klasse und group() sowie aggregate() auf
  • In der SharePoint Schnittstelle wird dann das daraus erzeugte View XML in pivot() genutzt
  • Die Ergebnisklasse extrahiert die gewünschten Aggregationen

Na also…

Jochen

CoffeeBreak – Ein kleines Fazit

Angefangen hat es mit der Lektüre von Inside Microsoft SharePoint 2013 – insgesamt eine recht gute Übersicht mit auch einigen Vertiefungen und dass mein Interesse am Ende etwas nachgelassen hat liegt vermutlich an den Themen. Es beantwortet sicher nicht alle Fragen, macht aber Lust auf mehr. Da das Thema SharePoint AddIn für mich neu war habe ich mir überlegt, mir mal die Entwicklung eines solchen AddIns an einem (Pseudo-) praktischen Beispiel anzuschauen. Natürlich wollte ich auch noch mal einige Themen wie Listen, Felder, Content Types etc. auffrischen – ja, es gibt seit WSS 3.0 Neues, aber wirklich anders ist es ja nicht: selbst die Art der SQL Datenbankablage ähnelt noch der Urform.

Diese Fokussierung ist auch einer der Gründe warum die folgenden Aussagen mit Vorsicht zu genießen sind, da sie auf gefährlichem Halbwissen basieren. Ich denke zwar, dass ich vielleicht das eine oder andere noch vertiefen werden (Join und GroupBy vor allem), aber im Grund ist mein selbst gesetztes (Zeit-)Budget für die Evaluation erschöpft. Schauen wir mal.

Am Anfang habe ich sehr viel die Visual Studio Assistenten zum Anlegen von Listen, Feldern und Content Types verwendet. Allerdings fand ich immer wieder Aufgaben, die dann doch nur in der XML erledigt werden konnten und hatte Änderungen in der XML vorgenommen, die der Assistent dann beim nächsten Speichern stillschweigend wieder entfernte. Die zweite Liste wurde dann sogar in ein zweites Feature eingefügt, was mich dann eine Zeit beschäftigt hat bis ich herausgefunden habe, dass deswegen ein Lookup Feld nicht funktionierte. Erstes Fazit daher: CAML lernen und direkt die XML Datei pflegen – tatsächlich nimmt der Assistent nicht wirklich viel Arbeit ab (Mindestens allerdings diese Ausnahme: alle Felder eines existierenden Content Types zur Liste hinzufügen).

Die Liste mit den Arten der Kaffeesorten sollte den Titel eigentlich als eindeutigen Schlüssel haben – im Client wird das zwar beim Anlegen geprüft, aber das passiert nur im Client Code und ist nicht Multi-User-sicher. Auch wenn das wohl inzwischen bei SharePoint Out-Of-The-Box geht habe ich darauf erst einmal verzichtet – ein Punkt den ich mir noch einmal anschauen muss: geht das auch auf dem vordefinierten Feld Title, kann man die Fehlermeldung beim Speichern auch über JSOM eindeutig identifizieren, etc.

Auch mein Lookup Feld (eine Spende referenziert genau eine Art von Kaffee) ist etwas halbherzig. Zwar unterstützt die kleine Anwendung selbst weder Löschen noch Ändern von Spenden und Arten, aber über den Direktaufruf der Listen (Lists/CoffeeTypes und Lists/Donations) geht das dann doch – ich habe glücklicherweise noch nicht herausgefunden, wie man den externen Zugriff dieser URLs gänzlich sperrt. Und das Löschen einer Kaffeesorte hinterlässt Spenden mit offenen Referenzen – laut Dokumentation soll dies aber konfigurierbar sein, daher bin ich dem nicht weiter nachgegangen. Das ist aber auch nur eine kleine Spitze eines Eisbergs: SharePoint scheint es grundsätzlich egal zu sein, ob ein Feld Required (TRUE) ist: speichern kann man irgendwie immer. Offenbar nur ein Hinweis für Formulare?

Eigentlich wollte ich das Lookup gar nicht sondern mal schauen, wie man ein Join zwischen zwei Listen in einer CAML Suche formuliert und auswertet. In der Dokumentation ist das ziemlich klar aber leider war die Zeit am Ende – vielleicht später einmal. Lookup Felder sind aber durchaus handlich, daher habe ich hier auch nicht mehr verstärkt gesucht.

Interessant war auch mein Versuch eine CAML Suche auf eine Liste Gruppieren zu lassen. Tatsächlich ist mit das nicht wirklich gelungen, herausgekommen ist nur so eine Art Sortieren: Elemente mit gleichem Wert stehen zusammen. Der Dokumentation nach geht ein echtes Gruppieren (mit Aggregation, in diesem Fall bräuchte ich ein Count() und ein Sum()) nicht mit reinen CAML Suchen sondern nur über Listen. Das kann ich mir noch nicht wirklich vorstellen, hier muss ich sicher noch einmal nachhaken. Wenn dem so ist, wäre das übel, wie man an der implementierten Lösung sieht: der Client liest alle Elemente und gruppiert selbst! Mit wachsender Anzahl von Elementen ein potentielles Performance Problem und ich würde so etwas niemals produktiv freigeben.

Die Gruppierung selbst habe ich über ein berechnetes Feld gemacht, das wiederum sehr einfach einzurichten war. Die Dokumentation der Formelsprache ist aber recht dürftig – zumindest bei Microsoft, oder ich habe mal wieder falsch gesucht. Um die App überhaupt mit einer Gruppierung nach Zeit testen zu können wird hier eine Granularität nach Minuten verwendet – realistisch wäre wohl eher nach Tag, das kann man mit der aktuellen Implementierung einfach durch Umkonfiguration des Feldes erreichen.

Nimmt man nun noch das Problem hinzu, dass SharePoint-Hosted AddIns bei der Deinstallation die Daten in den privaten Listen verlieren, dann bin ich mir nicht ganz sicher, ob das von mir überlegte Beispiel tatsächlich realistisch ist. Im Moment würde ich diese Technologie für Apps nutzen, die auf bestehenden Daten (Listen auf Site Ebene oder höher, die in das App Web hinein sichtbar sind) Zusatznutzen anbieten. Ansonsten reicht eine App evtl. alleine nicht aus. Auf der positiven Seite ist allerdings ganz klar zu sagen: mit den für andere HTML5/JavaScript verwendeten Techniken und Visual Studio lassen sich auch SharePoint Apps prima entwickeln, ohne sich auf das nackte CSS und JavaScript beschränken zu müssen.

Puh, reicht erst mal.

Aber vielleicht reicht dem einen oder anderen das wirre Zeugs hier für einen eigenen schnellen Einstieg in eine Evaluation!

Jochen