TwitterGoogle
formats

Alternate Extensions Path – Falle

Eine kleine Gemeinheit, über die ich heute in der QlikView Management Console (QMC) gestoßen bin, möchte ich hier kurz beschreiben. Vielleicht hilft es dem einen oder anderen, sich die Zeit für die Fehlersuche zu sparen.

Um Extensions für QlikView leichter entwickeln zu können, liegen meine Repositories in einem übergeordneten Verzeichnis, direkt unter Laufwerk C:\.

Altextpage-300x92 in Alternate Extensions Path - FalleDieses Verzeichnis hatte ich in meinem QlikView Server-Setup über die QMC als “Alternate Extensions Path” eingetragen. Um schneller erkennen zu können, was ich meine, anbei der Ausschnitt aus der QMC:

 

Dort sieht man im unteren Teil der Seite den Bereich System Folders, in welchem man die Angabe für ein alternatives Extension-Directory vornehmen kann.

Der genaue Eintrag sah bei mir, exakt wie in dieser Abbildung zu sehen, aus:

Altextpath in Alternate Extensions Path - Falle

C:\QVExtensions enthält einen Ordner Objects, in dem sich die verschiedenen Object Extensions in weiteren Unterordnern befinden.

Im QlikView Ajax-Client tauchten auch alle dort liegenden Extensions ordnungsgemäß im Popup New Sheet Object, auf dessen Seite Extensions, auf. Allerdings ließen sich die Extensions nicht auf dem Dashboard platzieren. Auch bereits im Designer hinzugefügte Extensions tauchten im Dashboard nicht auf.

Die Lösung des Problems, die ich eine ganze Weile suchen musste, ist so einfach, wie das Problem ärgerlich.

Der Eintrag im Feld Alternate Extensions Path darf nicht mit einem Backslash enden. Richtig muss der Eintrag bei mir also wie folgt aussehen:

Altextok in Alternate Extensions Path - Falle

 

Als ich den Backslash entfernt und den Browser aufgefrischt hatte, tauchten die verschwundenen Extension-Objekte im Dashboard wieder auf und ich konnte auch mühelos Weitere hinzufügen.

 

formats

QvDial Object Extension veröffentlicht

Mit meiner neuen QvDial Object Extension für QlikView kann man nummerische Werte ganz leicht per Finger (ohne zu Tippen!) eingeben und so in Variable speichern.

Qvdial 2 in QvDial Object Extension veröffentlicht

After dragging to a higher value the chart instantly gets updated

Die Bedienung von QvDial erinnert an die früheren iPods, die man auch durch kreisende Bewegungen steuern musste.

Die Basisfunktionalität, also das Dial-Objekt, habe ich mir nicht selbst ausgedacht, sondern verwende hier die jquery.knob.js von aterrien.

Es gibt einige Optionen, die sich individuell einstellen lassen. Mehr dazu gibt es auf der Seite QvDial QlikView Extension.

Natürlich freue ich mich auch hier wieder über jegliche Art von Feedback!

formats

Object Extension QvConsole für QlikView

Weil ich gerade in Schreiblaune bin, hier gleich noch ein Post zum Thema QlikView.

Diesmal geht es um meine QvConsole, eine Object Extension, die das Entwickeln von QlikView Extensions vereinfachen soll.

Problem

In allen modernen Browsern ist es möglich, im Javascript-Code mit dem Console-Objekt Informationen während der Skriptausführung durch einfaches Aufrufen von console.log() wegzuschreiben.

Diese Inhalte werden in der Konsolen-Ansicht, welche meist in den Browser-eigenen Developer Tools (Chrome STRG + SHIFT + j, IE F12) oder separaten Plugins (Firebug für Firefox) enthalten ist, fein säuberlich dargestellt.

Leider steht dieses Console-Objekt im QlikView Desktop Client nicht zur Verfügung. Selbstredend meine ich natürlich hier auch die WebView, denn nur dort spielt Javascript in Extensions überhaupt eine Rolle in QlikView.

Lösung

Qvconsole Demo-300x257 in Object Extension QvConsole für QlikView

 

Mit der QvConsole schließt sich diese Lücke ein Stück weit, da nun auch Log-Ausgaben im QV Desktop Client angezeigt werden können. Wird die gleiche QVW-Datei hingegen im Browser geöffnet, erscheinen die Log-Ausgaben zusätzlich auch noch im Browser-eigenen Konsolenfenster. Dort können dann auch die einzelnen Objekte und Arrays “entfaltet” werden, was in QvConsole (bisher) nicht möglich ist.

 

Da ich vorhabe, diese Extension weiter zu pflegen und auch noch weitere zu veröffentlichen, habe ich eine eigene Seite dafür angelegt: QvConsole

Auf Meinungen, Anregungen und Verbesserungsvorschläge via Kommentar bin ich sehr gespannt.

formats

QlikView Webserver startet nicht

Dies ist seit langem mal wieder ein Post von mir und das erste mal dreht es sich dabei um QlikView. Es werden in Zukunft sicherlich noch ein paar weitere Posts in eher unregelmäßigen Abständen zum Thema QlikView folgen.

 

Weil es mich selbst und nun auch schon andere Partner erwischt hat, möchte ich hier mal ein ganz banales, aber nicht sofort zu durchschauendes Problem beschreiben.

 

Dienstverweigerung

Die Installation eines QlikView-Servers auf dem lokalen Rechner funktioniert einwandfrei, aber der QlikView Webserver (QVWS)-Dienst lässt sich nicht starten. Stattdessen erscheint die Meldung:

Dienst „Qlikview Webserver“ wurde auf „Lokaler Computer“ gestartet und dann angehalten. Einige Dienste werden automatisch angehalten, wenn sie nicht von anderen Diensten oder Programmen verwendet werden.

Da kann es nun viele verschiedene Gründe geben, warum der Dienst nicht startet. Einer davon ist der Skype-Client!

 

Böses Skype

Skype-icon in QlikView Webserver startet nichtSkype bindet standardmäßig die Ports 80 und 443 (http und https), um so auch aus gut gesicherten Unternehmensnetzwerken heraus zu funktionieren. Wird der eigentliche Kommunikationsport durch die Firewall blockiert, dann verwendet Skype einfach die “falschen” Ports. Das ist bei 99% der Skype-Nutzer sicherlich kein Problem, denn die wenigsten betreiben einen Webserver auf ihrem Rechner. Für einen Entwickler / QlikView-Developer, der bei Bedarf seinen QVS starten will, ist das aber ungünstig, denn wenn Skype z.B. beim Systemstart automatisch mit hochfährt, ist der Port 80 bereits blockiert, bis der QVWS gestartet wird.

 

Abgehakt

Abhilfe kann aber ganz rasch geleistet werden, denn man muss nur ein einziges Häkchen in den Skype-Einstellungen wegnehmen:

Ports 80 und 443 als Alternative für eingehende Verbindungen verwenden

 

Skype in QlikView Webserver startet nicht

 

Danach wird das Hochfahren des QVWS-Dienstes nicht mehr durch Skype verhindert und Skype funktioniert für die meisten Anwender sicherlich nach wie vor.

Natürlich kann man genauso gut die Konfiguration des QVWS anpassen, so dass dieser nicht mehr mit Port 80 arbeitet.

formats

Vorstellung der Diff, Match and Patch Bibliothek

Bisher habe ich auf wikihost.org das diff-Tool der Linux-Shell verwendet, um den Anwendern eines Wikis die Möglichkeit zu geben, zwei unterschiedliche Versionen einer Wiki-Seite hinsichtlich ihrer Unterschiede zu vergleichen. Dabei wurden einfach die beiden Wiki-Sources temporär als Datei weggeschrieben, das externe diff aufgerufen und der Output wieder eingelesen und interpretiert.
Dieser Ansatz hatte einige Nachteile, wie z.B. das Unvermögen mit Unicode-Zeichen umzugehen, die Verarbeitungsgeschwindigkeit und eine unschöne Darstellung.

Aus genannten Gründen war ich daher auf der Suche nach einer vernünftigen, integrierten Lösung. Gefunden habe ich eine sehr schöne für mehrere Sprachen entwickelte Bibliothek.

Google Diff, Match and Patch

Die diff, match and patch-Bibliothek von Neil Fraser stellt  identische Funktionen für Java,  JavaScript, Dart, C++, C#, Objective C, Lua und Python bereit. Sie wird auf code.google.com gehostet und unter der Apache License 2.0 bereitgestellt.

Für wikihost.org ist die Java-Bibliothek relevant, daher beziehe ich mich hier ausschließlich darauf. Wikihost.org ist in Grails/Groovy entwickelt, daher zeige ich auch kurz, wie die Java-Bibliothek dort einzubinden ist.

 

Bibliothek ins Grails-Projekt aufnehmen

Damit die Java-Klassen der diff-Bibliothek in der Grails-Anwendung genutzt werden können, muss das Java-File einfach in das Verzeichnis <PROJECT>/src/java kopiert werden.

Hier die Projekt-Struktur des wikihost.org Grails-Projekts mit eingebundener diff-Bibliothek:

 

  Diff Project-157x300 in Vorstellung der Diff, Match and Patch Bibliothek

 

Ist das erledigt, kann man auch schon beginnen, die diff-Funktionalität in einem der Controller zu nutzen.

Diff in Grails ermitteln

Hier der Code, wie ich ihn zum Vergleich der Revisionen einer Wiki-Seite nutze:

//Initialisiere diff-Bibliothek
def dmp = new diffy.diff_match_patch()
//Vergleiche alte und neue Version
def diffed = dmp.diff_main(oldRevText,newRevText)
//mache für Menschen lesbar (optimierte Darstellung)
dmp.diff_cleanupSemantic(diffed)
//als HTML ausgeben (färbe gelöschte Teile rot, Hinzugefügte grün)
def TextHtml = dmp.diff_prettyHtml(diffed)

 

Zuerst wird eine Instanz der Klasse diff_match_patch initiiert. Den Package-Namen diffy habe ich in der Klasse definiert, damit ich leichter erkenne, wo diese Klasse herkommt. Der eigentliche Vergleich zwischen oldRevText und newRevText findet dann in der zweiten Zeile durch Aufruf der Methode diff_main() statt. Da die Differenz zwischen den beiden Versionen durch Veränderungsschritte (was muss gelöscht und hinzugefügt werden, um vom alten auf den neuen Zustand zu kommen aka Levenshtein-Distanz) dargestellt werden, wäre in vielen Fällen ein kaum entzifferbares Ergebnis, wie in diesem Beispiel der Fall:

Diff Demo1 in Vorstellung der Diff, Match and Patch Bibliothek

Durch den Aufruf der Methode diff_cleanupSemantic() wird dies lesbarer gemacht, indem die einzelnen diffs zu größeren Blöcken zusammengefasst werden. Hier der selbe Vergleich mit nachträglicher Optimierung:

Diff Demo2 in Vorstellung der Diff, Match and Patch Bibliothek

Mit der Methode diff_prettyHtml() kann eine simple HTML-Ausgabe erzeugt werden. Möchte man das Ergebnis nicht für eine HTML-Seite

Das Ergebnis liegt zum Schluss in der Variable TextHtml und wird an die GSP-Seite zur Ausgabe im Browser durchgereicht.

 

Selbst ausprobieren kann man die Funktionen der Bibliothek unter http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html direkt im Browser.