Herzlich willkommen auf dem Blog der exensio GmbH

exensio ist ein unabhängiges Software-Unternehmen von erfahrenen IT Beratern und Architekten. Zu unseren Kunden zählen namhafte deutsche Großunternehmen.

exensio verbessert das Kommunikations- und Informationsmanagement von Unternehmen. Auf Basis sinnvoller und zweckmäßiger Technologien erarbeiten wir flexible und übergreifende Lösungen für webbasierte Informationssysteme. Abhängig von den Kundenanforderungen realisieren wir Web Applikationen sowie Lösungen auf Basis von Web Content Management- und Portalsystemen. Integrativ, wirtschaftlich und anwenderfreundlich!

Hier gelangen Sie zur exensio GmbH.

Dienstag, 23. Juni 2015

E-Book: Spock, Geb und Selenium - Testframeworks unter die Lupe genommen

Die vier ursprünglich im Java-Magazin von exensio publizierten Artikel zum Thema Testing können zwischenzeitlich als E-Book erworben werden.



Der sogenannte Shortcut wurde von entwickler.press veröffentlicht und geht in den ersten beiden Kapiteln auf die Frameworks Spock und Geb ein, die auf der Programmiersprache Groovy basieren.

In Kapitel 3 und 4 liegt der Fokus auf der Verwendung von Selenium für funktionale Tests. Hierbei wird insbesondere auf die Integration in den Build-Prozess sowie auf das parallelisierte Testen eingegangen.

Der Shortcut kann direkt auf Amazon erworben werden: Spock, Geb und Selenium - Testframeworks unter die Lupe genommen

Viel Spaß beim Lesen der Lektüre.

Montag, 15. Juni 2015

Kontraktlogistik und exensio – eine sinnvolle Symbiose

Unter Kontraktlogistik versteht man die langfristige Zusammenarbeit zwischen einem Industrie- oder Handelsunternehmen und einem Logistik-Dienstleister. Der Logistik Dienstleister übernimmt dabei neben den Basis Logistik Dienstleistungen weitere wertschöpfende Tätigkeiten.

Kontraktlogistik steht damit für die Ausweitung der Wertschöpfungskette beim Logistik Dienstleister. Industrie- und Handelspartner verlagern Teile ihrer Prozesse zum Logistikdienstleister. „Value Added Services“ (wie bspw. Auftragsabwicklung oder Sendungsverfolgung) und komplexe zusätzliche nicht-logistische Dienstleistungen (wie bspw. Qualitätssicherung oder Montagetätigkeiten) werden durch den Logistiker erbracht. Dies bedeutet für beide Partner eine engere Verzahnung der Prozesse und die Einbindung in die internen Abläufe. Das heißt die Vernetzung von Transport, Dienstleistung und Informationen werden zum kritischen Erfolgsfaktor – eine Herausforderung für alle Logistikdienstleister.

Die Anforderungen des Marktes bedingen auf die Partnerschaft optimierte Geschäftsprozesse mit meist sehr individuellen Lösungen. Zur effizienten Umsetzung der Prozesse ist die Unterstützung durch IT-Lösungen notwendig, die u.a. für einen reibungslosen Austausch der notwendigen Informationen sorgen.

IT Unterstützung als Schlüsselfaktor

Große Kontraktlogistik Dienstleister versuchen die IT Unterstützung mittels konfigurierbarer Standardlösungen umzusetzen, um viele Kunden mit möglichst gleich ablaufenden Prozessen zu unterstützen.
Kleinere und mittlere Kontraktlogistiker hingegen setzen auf die individuelle, maßgeschneiderte Lösung und punkten insbesondere durch eine hohe Service-Bereitschaft und personalseitige Flexibilität.
Weitere Erfolgspotentiale können durch entsprechende IT Unterstützung erschlossen werden. Hierbei geht es in erster Linie darum, bestehende IT Systeme miteinander zu verbinden, Datenaustausch zu ermöglichen und integrierte Informationen für Analysen anzubieten.

Integration bestehender Systeme

exensio hat in diesem Themengebiet viel zu bieten, insbesondere profunde Erfahrungen in der Anbindung und Integration von Systemen. Neben der Anbindung von klassischen Schnittstellen üblicher Standard-Systeme (ERP, CRM, DMS, etc.) sind wir in der Lage, auch Systeme ohne Schnittstellen in robuster Weise zu integrieren. Häufig gibt es „Alt“-Systeme, die keine Schnittstellen besitzen und für die auch keine Dokumentation vorhanden ist. Für diese Softwarelösungen lassen sich auch unter Einsatz geeigneter, effizienter Technologien Schnittstellen schaffen.
Darüber hinaus lassen sich über diesen Weg auch bestehende Lösungen mobil machen – ist doch mittlerweile ein Zugriff auf relevante Informationen unabhängig vom Standort mittels mobiler Endgeräte ein Muss.

Reporting und Analytics

Die enge Verzahnung zwischen Industrie- und Handelspartner und dem Logistik-Dienstleister erfordert zudem eine zu gewährende Transparenz seitens des Logistikers. Hierfür sind Reporting-Möglichkeiten notwendig, die aufbauend auf den individuellen Lösungen die relevanten Daten extrahiert und aufbereitet. Ebenso sind für den Logistiker Analysen erforderlich, um Prozess- und Kostensicherheit für die langfristige Zusammenarbeit zu erlangen.
Nutzenstiftend ist hierbei exensio’s Knowhow in den Bereichen Business Intelligence und Analytics. Insbesondere unsere leichtgewichtigen BI Lösungen auf Basis von Suchmaschinen [1] bieten eine kostengünstige Alternative zu klassischen BI Ansätzen.

Fazit

Kontraktlogistiker mit Fokus auf maßgeschneiderten, individuellen Lösungen und exensio ergänzen sich hervorragend. Mit der Bündelung von Fach Knowhow, Prozess-Analyse Fähigkeiten und IT-Kompetenz in den entscheidenden Themengebieten lassen sich maßgeschneiderte Kontraktlogistik Dienstleistungen mit effizienter IT Unterstützung umsetzen.

Links:

Dienstag, 9. Juni 2015

Die Piwik API

Problemstellung

In einem Kundenprojekt verwenden wir für Webanalytik (hauptsächlich Downloads und Zugriffszahlen) das Tool Piwik [1]. Es gab folgende zwei Kritikpunkte:
  1. Der Funktionsumfang von Piwik ist beachtlich und für kommerzielle Webseiten optimal geeignet. In unserem Projekt führte die enorme Vielfalt an Funktionen allerdings zur Resignation des Kunden. Ein individuelles Dashboard reichte nicht aus, um die Anforderungen des Kunden hinsichtlich Reporting zu erfüllen.
  2. Auf unsere Applikation kann sowohl direkt per Browser, als auch indirekt per Schnittstelle zugegriffen werden. Zugriffe per Browser werden dabei mittels JavaScript passiv getrackt. Aufrufe per Schnittstelle werden bisher nicht verfolgt, da kein JavaScript ausgeführt wird.

Lösungsvorschlag

Unser Lösungsvorschlag sieht zwei Ansätze vor:
  1. Automatische Generierung eines standardisierten Berichts in der Applikation
    Die Applikation richtet gezielte Abfragen bezüglich Downloads und Zugriffszahlen an Piwik und erstellt daraus einen standardisierten Bericht in Form einer MS Excel-Datei.
  2. Aktives Tracking von Zugriffen über die Schnittstelle
    Zugriffe auf die Applikation, die über die Schnittstelle erfolgen, die also nicht passiv verfolgt werden können, lösen ein aktives Tracking seitens der Applikation aus. Damit fällt beim Client kein zusätzlicher Programmieraufwand an und trotzdem werden alle Aufrufe analysiert.

Die Idee - Piwik APIs

Zur Umsetzung der Lösungsvorschläge soll die Piwik Analytics API [2] verwendet werden. Sie stellt folgende Programmierschnittstellen zur Verfügung:

API sichern

Eine Beispielabfrage an die Piwik API wäre:
http://demo.piwik.org/?module=API&method=VisitsSummary.getVisits&idSite=1&period=day&date=last10&format=xml
Da kein Token angegeben wird, verwendet Piwik implizit den Benutzer anonymous. Gegenüber der Piwik API authentifiziert man sich deshalb besser per Token. Ein Token wird automatisch beim Anlegen eines Benutzerkontos angelegt. Ein Benutzer erfährt sein Token in dem er sich einloggt und auf seinen Benutzernamen klickt. Im persönlichen Bereich gibt es den Eintrag API mit Links zur Dokumentation und dem Abschnitt Benutzerauthentifizierung.

Dort wird der Token-String angezeigt. Ich rate ausdrücklich davon ab, Piwik Abfragen ohne Token zu verwenden. Am besten den Login per anonymous deaktivieren, auch wegen [6].
Die selbe Abfrage für meinen Benutzer, also mit Token, lautet:
http://demo.piwik.org/?module=API&method=VisitsSummary.getVisits&idSite=1&period=day&date=last10&format=xml&token_auth=000000111111222222333333444444555555

Welche API

Für die Abfragen zur automatischen Erstellung eines Berichts dient die Reporting HTTP API. Sie ist in einzelne Module untergliedert, z. B. API oder Action. Ein Aufruf dieser API sieht wie folgt aus:
http://<URL>/?module=<Modul>&method=<Methode>.<Funktion>&idSite=<ID>&period=<period>&Zeitraum=<Startdatum>[,<Enddatum>]&format=<Format>[&token_auth=<Token>]
Mit den Parametern:
  • URL = URL der Piwik-Instanz
  • Modul = Name des Moduls, das verwendet werden soll
  • Methode = Name der Methode, die verwendet werden soll
  • Funktion = Name der Funktion, die verwendet werden soll
  • ID = ID der Seite, die analysiert werden soll; falls alle vorhandenen Webseiten untersucht werden sollen, gibt es das Schlüsselwort all
  • Zeitraum = Gibt die Art des Untersuchungszeitraums an; mögliche Werte sind day, week, month, year oder range
  • Startdatum = Enthält das Startdatum der Untersuchung, standardmäßig im Vormat YYYY-MM-DD; besondere Schlüsselwörter sind today or yesterday, wobei die Zeitzone des Servers beachtet wird
  • Enddatum = Gibt das optionale Enddatum der Untersuchung an; Schlüsselbegriffe sind lastX und previousX, also die letzten X Zeiteinheiten inklusive der aktuellen Zeiteinheit oder ohne aktuelle Zeiteinheit
  • Format = Gibt an, in welchem Format die Antwort von Piwik erscheinen soll; mögliche Werte sind xml, csv, json, tsv, html, php, rss oder original
  • Token = Gibt das Token des Benutzers an.
Außerdem gibt es weitere optionale Parameter, z. B. language, flat oder filter_pattern, mit deren Hilfe sich das Ergebnis der Abfrage beeinflussen lässt hinsichtlich der Darstellung oder des Inhalts.
Es gibt zwei Besonderheiten:
  1. Manche Parameter können einzeln oder als Feld übergeben werden
    Parameter, die in der Dokumentation in der Mehrzahl angegeben wurden, beispielsweise urls, können als Feld angegeben werden. Ein Aufruf wäre dann ...&urls[0]=ersteUrl&urls[1]=zweiteUrl...
  2. Abfragen bündeln mittels Bulk API Request
    Anstatt viele einzelne API Anfragen an Piwik zu stellen, lassen sich die Abfragen zu einer einzigen Abfrage bündeln. Achtung, die gebündelten Abfragen müssen in diesem Fall URL encoded sein!

Beispiel für API.getBulkRequest

Diese beiden Abfragen sollen zu einer Bulk-Abfrage kombiniert werden:
http://demo.piwik.org/?module=API&method=VisitsSummary.getVisits&idSite=1&period=day&date=last10&format=xml&token_auth=000000111111222222333333444444555555
http://demo.piwik.org/?module=API&method=CustomVariables.getCustomVariables&idSite=1&period=day&date=last10&format=xml&token_auth=000000111111222222333333444444555555
Hier ist die URL-kodierte Bulk-Abfrage:
http://demo.piwik.org/?module=API&method=API.getBulkRequest&format=json&urls[0]=method%3dVisitsSummary.getVisits%26idSite%3d1%26period%3dday%26date%3dlast10&urls[1]=method%3dCustomVariables.getCustomVariables%26idSite%3d1%26period%3dday%26date%3dlast10&token_auth=000000111111222222333333444444555555
Die Parameter format und token_auth müssen nur für die Bulk-Abfrage angegeben werden, aber nicht für die gebündelten Abfragen. Bei Bulk-Abfrage sind nur die Rückgabeformate xml und json zulässig.

Die Tracking HTTP API wird für die Erweiterung der Schnittstelle verwendet. Jeder Aufruf über die Schnittstelle wird damit aktiv an Piwik berichtet.
Ein Aufruf dieser API sieht wie folgt aus:
http://<URL>/piwik.php?_cvar={"<Index>":["<Name>","<Wert>","<Bereich>"]}&action_name=<AktionName>&url=<Webseite>&idsite=<ID>&rand=<Zufall>&rec=1&send_image=0
Mit den Parametern:
  • URL = URL der Piwik-Instanz
  • Index = Index der benutzerdefinierten Variablen
  • Name = Name der benutzerdefinierten Variablen
  • Wert = Wert der benutzerdefinierten Variablen
  • Bereich = Bereich der benutzerdefinierten Variablen; mögliche Angaben sind visit und page
  • AktionName = Name der Aktion
  • Webseite = Vollständige URL für die Aktion
  • ID = ID der Webseite in Piwik
  • Zufall = Ein zuvälliger Wert, der das Caching der Abfrage im Broser oder in einem Proxy verhindern soll
Daneben gibt es noch eine umfangreiche Liste von weiteren Parametern, die teilweise zwingend erforderlich sind, z. B. &rec=1, oder die optional angegeben werden können, z. B. &send_image=0. Anfragen an die Tracking HTTP API benötigen in der Regel kein Token, außer es sollen grundlegende Angaben überschrieben werden, z. B. Absender IP oder Abfragezeitpunkt.

Tipp zum Testen

Für schnelle Tests im Browser bietet sich der RESTClient [7] an. Mit dem gleichnamigen AddOn für Firefox, Chrome oder Safari lässt sich eine Abfrage an die Piwik API einfach im Browser absetzen.

Fazit

Die Piwik API bietet eine einfache Möglichkeit, auf den kompletten Funktionsumfang von Piwik zuzugreifen, ohne den Anwender mit der schieren Vielfalt des Tools zu erschlagen. Mit der Reporting API lassen sich umfangreiche und detaillierte Berichte automatisiert erstellen. Und mit der Tracking API können auch Zugriffe analysiert werden, die nicht ausschließlich auf reinen Browserzugriffen auf Webseiten beruhen.

Links

[1] Piwik
[2] Piwik Analytics API
[3] Piwik Tracking API
[4] Tracking HTTP API
[5] Reporting HTTP API
[6] Piwik: Unberechtigte können Webseiten-Statistiken abrufen
[7] RESTClient

Sonntag, 7. Juni 2015

Wie frage ich Elasticsearch mit der Elastic Groovy API in Grails ab?

Es gibt verschiedene Möglichkeiten, Elasticsearch in Grails zu integrieren. Am Besten finde ich die Groovy API von Elasticsearch. Das Ganze wird über folgende Zeilen in der BuildConfig.groovy konfiguriert.

com.spatial4j und com.vividsolutions werden für die Geo Location und Search Funktionalität von Elasticsearch benötigt.

dependencies {
       ...
        compile group: 'org.elasticsearch', name: 'elasticsearch-groovy', version: '1.5.0', classifier: 'grails'
        compile group: 'com.spatial4j', name: 'spatial4j' , version : '0.4.1'
        compile group: 'com.vividsolutions', name: 'jts' , version : '1.13', excludes: 'xerces'
    }

Und folgendes Beispiel zeigt eine Grails Service Methode, die Elasticsearch abfrägt. Hierbei sieht man m.E. sehr schön, wie elegant man die Queries in Groovy definieren und später die Response verarbeiten kann.
package competition

import grails.transaction.Transactional
import org.elasticsearch.action.search.SearchRequestBuilder
import org.elasticsearch.action.search.SearchResponse
import org.elasticsearch.client.Client
import org.elasticsearch.client.transport.TransportClient
import org.elasticsearch.common.settings.ImmutableSettings
import org.elasticsearch.common.settings.Settings
import org.elasticsearch.common.transport.InetSocketTransportAddress
import org.elasticsearch.index.query.QueryBuilders
import org.elasticsearch.search.aggregations.AggregationBuilders

@Transactional
class ElasticGroovyClientInGrailsService {
    static transactional = false

    def query() {

        Client client = getESClient()
        SearchRequestBuilder requestBuilder = client.prepareSearch("weinsuche")

        requestBuilder
                .setQuery(QueryBuilders.matchAllQuery())
                .addFields("shopname", "shopurl", "kategorie", "herkunftsland", "anbauregion", "weingut", "preiseinheit")
                .setSize(15)
                .addAggregation(AggregationBuilders.terms("Händler").field("shopurl"))
                .addAggregation(AggregationBuilders.terms("Kategorie").field("kategorie_raw"))
                .addAggregation(AggregationBuilders.terms("Land").field("herkunftsland_raw"))
                .addAggregation(AggregationBuilders.terms("Anbauregion").field("anbauregion_raw"))
                .addAggregation(AggregationBuilders.terms("Weingut").field("weingut_raw"))
                .addAggregation(AggregationBuilders.range("Preis").field("preiseinheit")
                .addUnboundedTo(10.0f)
                .addRange(10.0f, 15.0f)
                .addRange(15.0f, 20.0f)
                .addRange(20.0f, 30.0f)
                .addRange(30.0f, 50.0f)
                .addRange(50.0f, 100.0f)
                .addUnboundedFrom(100.0f)
        )

        SearchResponse response = requestBuilder.execute().actionGet()
        printResponse(response)

        client.close()

        return response
    }

    private printResponse(SearchResponse response) {
        response.getHits().getHits().each { searchHit ->
            println searchHit.fields.shopname?.value
            println searchHit.fields.shopurl?.value
            println searchHit.fields.kategorie?.value
            println searchHit.fields.herkunftsland?.value
            println searchHit.fields.anbauregion?.value
            println searchHit.fields.weingut?.value
            println searchHit.fields.preiseinheit?.value
        }
    }

    private getESClient() {
        Client retVal
        // clustername is defined in the elastic file elasticsearch.yml
        Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "---ClusterName---").build()
        TransportClient transportClient = new TransportClient(settings)
        retVal = transportClient.addTransportAddress(new InetSocketTransportAddress("localhost", 9300))
        return retVal
    }
}

Freitag, 29. Mai 2015

Warum es sinnvoll ist, Prozesse unter Verwendung von EPK oder BPMN zu modellieren?

Häufig werden wir von potentiellen Kunden angesprochen, um mögliche Software Lösungen für Problemstellungen aufzuzeigen. Darüber freuen wir uns natürlich sehr und vertiefen uns in die Aufgabenstellung. Allerdings stellen wir oft sehr schnell fest, dass das „Umfeld“ für die neue Lösung noch nicht wirklich vom Kunden beleuchtet wurde – und es (auch dadurch) meist schwer fällt, Anforderungen an die neue Lösung zu formulieren. Das Thema Anforderungen möchte ich jetzt hier aber nicht weiter vertiefen.

In den folgenden Abschnitten soll es um die Prozesse gehen, in denen die neue Software Lösung eingebettet ist. Warum ist es unbedingt notwendig, diese zu betrachten?

  • Mit der Umsetzung neuer Software Lösungen will man Verbesserungen erreichen, bspw. durch Automatisierung von sich wiederholenden Vorgängen. Verbesserungen können sich beispielsweise auswirken auf Schnelligkeit oder Qualität. Auf Basis einer Prozessanalyse kann der Kunde entscheiden, welche Schritte in einer Software Lösung abgebildet werden müssen, um Verbesserungspotentiale zu erschließen.
  • Prozesse werden durch eine Systemunterstützung verändert. Aufgaben und Verantwortlichkeiten können sich ändern, der Arbeitsschwerpunkt von Rollen kann sich verschieben. Die Definition und Dokumentation der Prozesse unterstützt bei der Identifikation der Veränderungen und liefert Informationen für das Change Management.
  • Darüber hinaus wird auf Ebene der Prozesse deutlich, welche Schritte nun Gegenstand der Software Lösung sind, wo Schnittstellen zu organisatorischen Abläufen sind. Dies ist wertvoller Input für die Beschreibung der Anforderungen an eine neue Lösung. Daraus leitet sich ebenso ab, welche Anforderungen unbedingt zu erfüllen sind, damit sich eine Umsetzung auch wirklich lohnt.
  • Deutlich wird mit den Prozessbeschreibungen auch, wer die Zielgruppen der neuen Software Lösung sind und wer administrativ mit dem neuen System arbeitet. Damit lassen sich Stakeholder für das Umsetzungsprojekt definieren und es leiten sich Anforderungen an Projekt-begleitende Kommunikationsmaßnahmen sowie Aktivitäten für die Einführung des Systems (beispielsweise notwendige Trainings- und Schulungsmaßnahmen) ab.

Die beschriebenen Aspekte treten mit unterschiedlicher Gewichtung auf und sind abhängig von der Bedeutung des Prozesses im Unternehmen. Dennoch sind alle Aspekte beachtenswert, auch wenn es um einen vermeintlich „kleinen“ Prozess geht.

So haben wir bspw. ein positives Kundenfeedback erhalten, nachdem wir den Registrierungsprozess für Healthcare Professionals für den geschlossenen Fachkreis-Bereich auf den Webseiten eines Pharmaherstellers modelliert haben. Dieser vermeintlich „kleine“ Prozess hatte seine Komplexität im Detail. Bei der Erfassung der Registrierungsdaten ist schon zu differenzieren, ob diese beispielsweise ein Arzt selber auf einer Webseite oder ein Außendienst Mitarbeiter per manuellen Verfahren mit dem Arzt bei einer Veranstaltung erledigt. Unterschiedliche Prüfverfahren im Hintergrund, Zuordnungen zu CRM Daten, unterschiedliche Kommunikation mit dem Benutzer, abweichende Verifikationsverfahren mussten abgebildet werden. Und natürlich waren verschiedene IT Systeme beteiligt.

Die Abbildung aller Zusammenhänge in einem Prozessdiagramm ermöglichte dann eine zielgerichtete Abstimmung und Definition des gewünschten Ablaufs. Auch in diesem Fall konnten wirksame Verbesserungen in dem System-unterstützten Prozess realisiert werden (beispielsweise durch reduzierte Wartezeit für den zu Registrierenden oder Fall-basierter und damit kundenfreundlicherer Kommunikation etc.).

Bei der verwendeten Methodik greifen wir auf die bekannten Standards zurück. Im oben geschilderten Fall haben wir EPK (ereignisgesteuerte Prozessketten) eingesetzt, weil diese Methodik bereits in anderen Bereichen beim Kunden eingesetzt wurde. Alternativ hätten wir sonst auch BPMN (Business Process Model Notation) verwendet.

Im Übrigen liefert die Prozessanalyse stets die notwendige Basis, um den Nutzen einer möglichen Software Unterstützung zu bewerten und zugleich fördert sie das Verständnis aller Beteiligten. Generell liefern beide genannten Methoden das Handwerkszeug, um Prozesse für den Fachbereich lesbar zu beschreiben. Dabei ist gerade die grafische Beschreibung wertvoll, da sie die Möglichkeit bietet, Zusammenhänge sehr schnell zu erfassen.

Freitag, 22. Mai 2015

Entwicklertag Karlsruhe

Der Entwicklertag in Karlsruhe feierte sein 10-jähriges Jubiläum und es wurde wie jedes Jahr sowohl am Conference Day als auch beim Agile Day ein abwechslungsreiches Programm geboten.

Ich möchte hier lediglich auf einen Vortrag kurz eingehen: Agile Jukebox mit Holger Koschek und Rolf Dräther. Beide sind nicht nur im agilen Umfeld als Berater tätig, sondern besitzen auch bemerkenswerte musikalische Fähigkeiten. In ihrem Beitrag berichteten Sie in mehreren Songs über den Projektalltag mit all seinen Hürden im Rahmen des agilen Umfelds. Auch wenn die Vortragsweise sehr amüsant war, fühlte sich jeder Zuhörer in manchen Situationen an das reale Projektleben erinnert.

Beim Track der Java User Group durfte ich am Conference Day mit Ralf Müller einen Talk mit dem Thema „Spock und Geb: Übersichtlich und nachvollziehbar Testen für alle!“ geben. Für weitere Informationen möchte ich auf die Folien verweisen: