Category: Technik


Relations in Linked Data

January 17th, 2012 — 2:20pm

This is the translation of this german blog entry.

Even if Linked Data has been around for a while a solid standard for a JSON driven environment is yet to surface. JSON-LD has set its course to becoming this standard and goes great length in explaining their take on linked data in JSON.

In JSON-LD JSON data is enriched with information about its context enabling the client to explicitly know how to interpret this data. A simple example of JSON-Data with embedded linking information looks like this.:

{
"@context": "http://purl.org/jsonld/Person",
"@subject": "http://dbpedia.org/resource/John_Lennon",
"name": "John Lennon",
"birthday": "10-09",
"member": "http://dbpedia.org/resource/The_Beatles"
}

This example describes a person named „John Lennon“. By adding a namespace via the @context attribute the data becomes self-describing. The @subject enables the client to identify an this specific entry.

It is also possible to describe subsidiary entries of this object which could be given e.g. in a list.

This is good but not sufficient for my use case.

Defining relations

By following this design I have to include all related objects in the JSON messages. But I want to let the client decide which subsidiary objects he needs. What I really need is the possibility to define relations. In his blog entry „Linking in JSON“ Mark Nottingham shows that this need is not addressed properly or at all. JSON Reference and HAL do provide solutions but they are both lacking a way to define the context of the related objects. Only by knowing the context of a relation the client can decide which relation to follow and which to discard.

In my applictaion I’ve decided to stick with the JSON-LD syntax and add another property: @relations. This property is a list of relations for the object. Every relations describes the context of the related object in relatedcontext and states under which URL (href) this object can be fetched. The role attribute defines the kind of relation. Optionally the attribute list states, if the relation is actually a list of objects.

Example: Again, John.

In this example we use John again and define a relation to his wife Yoko Ono and to the singles he has written.

{
"@context": "http://purl.org/jsonld/Person",
"@subject": "http://dbpedia.org/resource/John_Lennon",
"@relations": [
  {
    "@context": "http://coderbyheart.de/jsonld/Relation",
    "relatedcontext": "http://purl.org/jsonld/Person",
    "role": "http://gmpg.org/xfn/11#spouse",
    "href": "http://dbpedia.org/page/Yoko_Ono"
  },
  {
    "@context": "http://coderbyheart.de/jsonld/Relation",
    "relatedcontext": "http://dbpedia.org/ontology/Single",
    "role": "http://dbpedia.org/ontology/writer",
    "href": "http://dbpedia.org/resource/John_Lennon/singles/",
    "list": True,
  }
],
"name": "John Lennon",
"birthday": "10-09",
"member": "http://dbpedia.org/resource/The_Beatles"
}

In this way the client can be told that if he follows the (fictive) link http://dbpedia.org/resource/John_Lennon/singles/ he’ll receive a list of Singles written by John. It’s up to the client to decide a person object exists in his application with a relation to singles.

Conclusion

The solution presented above enables us to transfer just the minimum amount of required data but still gives the client the possibility to discover and fetch related objects.

4 comments » | Technik

Relationen in Linked Data

January 17th, 2012 — 1:55pm

An englisch translation of this article can be found here.

Das Thema Linked Data geistert ja nun schon eine Weile durch die Branche, noch hat sich besonders im JSON-Umfeld noch kein wirklicher Standard etabliert. JSON-LD versucht dieser Standard zu werden und hat auch schon sehr ausführlich dessen Syntax beschrieben.

In JSON-LD werden JSON-Daten mit Informationen zum Kontext angereichert, so dass der Verwender der Daten erkennen kann, wie diese zu interpretieren sind. Ein einfaches Beispiel eines JSON-Datensatzes mit Linked Data-Zusatzinformationen sieht so aus:

{
"@context": "http://purl.org/jsonld/Person",
"@subject": "http://dbpedia.org/resource/John_Lennon",
"name": "John Lennon",
"birthday": "10-09",
"member": "http://dbpedia.org/resource/The_Beatles"
}

Diese Beispiel beschreibt einer Person, deren Name „John Lennon“ ist. Der Unterschied zu normalem JSON und JSON-LD ist der, dass dieses Objekt sich eindeutig selbst beschreibt und so ohne Mehrdeutigkeit in jeder Anwendung verwendet werden kann, die mit @context ein eindeutiger „Namesraum“ angegeben wird, der die Bedeutung der Daten beschreibt. Mit @subject ist es dann möglich den konkreten Datensatz eindeutig zu identifizieren.

Die Informationsanreicherung für untergeordnete Elemente, die z.B. als Liste vorliegen ist mit JSON-LD ebenfalls möglich.

Soweit, so gut — aber eben für meinen Anwendungsfall nicht ausreichend: Ich möchte nicht bei jeder Nachricht alle zugehörigen Objekte mitliefern, sondern den Client selber entscheiden lassen, was er benötigt.

Verweise definieren

Die Spezifiktion geht davon aus, dass eine JSON-Nachricht immer die zu einem Objekt gehörenden Kind-Elemente enthält. Sie sieht aber nicht die Möglichkeit vor, Verweise zu weiteren Datensätzen zu definieren. Mark Nottingham zeigt in seinem Blog-Eintrag „Linking in JSON“, dass dieses Problem auch in anderen Linked-Data-Ansätzen nicht zufriedenstellend gelöst wird, auch wenn es mit JSON Reference und HAL mindestens zwei Ansätze gibt, fehlt beiden jedoch die Möglichkeit den Kontext der verknüpften Daten zu definieren, denn Anhand des Kontexts einer Relation kann der Verwendern erkennen und entscheiden, ob es für ihn Sinn macht, eine Relation weiter zu verfolgen.

In meiner Anwendung habe ich mich entschieden in der Syntax von JSON-LD zu bleiben und ein weiteres Element ein zu führen: @relations. Dieses Element ist eine Liste von Relation die zum jeweiligen Objekt gehören. Jede Relation beschreibt dabei mit relatedcontext, welchen Kontext das andere Objekt hat und unter welcher URL (href) dieses Objekt abgerufen werden kann; mit role wird die Art der Beziehung beschrieben. Optional gibt das Attribut list an, ob es sich um eine Liste von Objekten handelt.

Beispiel: John, mal wieder

Im Beispiel verwenden wir wieder John und definieren eine Relation zu seiner Frau Yoko Ono, sowie zu den Singles, die er geschrieben hat.

{
"@context": "http://purl.org/jsonld/Person",
"@subject": "http://dbpedia.org/resource/John_Lennon",
"@relations": [
  {
    "@context": "http://coderbyheart.de/jsonld/Relation",
    "relatedcontext": "http://purl.org/jsonld/Person",
    "role": "http://gmpg.org/xfn/11#spouse",
    "href": "http://dbpedia.org/page/Yoko_Ono"
  },
  {
    "@context": "http://coderbyheart.de/jsonld/Relation",
    "relatedcontext": "http://dbpedia.org/ontology/Single",
    "role": "http://dbpedia.org/ontology/writer",
    "href": "http://dbpedia.org/resource/John_Lennon/singles/",
    "list": True,
  }
],
"name": "John Lennon",
"birthday": "10-09",
"member": "http://dbpedia.org/resource/The_Beatles"
}

Dem Verwender kann so mitgeteilt werden, dass wenn er dem (fiktiven) Link http://dbpedia.org/resource/John_Lennon/singles/ folgt, er eine Liste von Singles erhält, die John geschrieben hat. Es bleibt aber Sache des Verwenders zu entscheiden, ob er in seiner Anwendung überhaupt ein Personen-Objekt definiert hat, dass Verweise auf Singles enthält.

Fazit

Der gezeigte Lösungsansatz ermöglicht es, die Menge der übertragenen Daten in einer JSON-Nachricht gering zu halten, gleichzeitig bleibt aber die Möglichkeit bestehen, zugehörige Objekte erkennen und nachladen zu können.

1 comment » | Technik

Auslastung Januar 2012 Update

January 2nd, 2012 — 12:52pm

Auslastung

Über die Feiertage habe ich Auslastung um einige Funktionen erweitert.

Die wichtigsten Änderungen im Überlick:

  • Es gibt nun eine übergeordnete Spalte für Termine und Feiertage (#6 und #42)
  • Aufgaben können als "im HomeOffice" markiert werden (#43).
  • Namen von Personen, Units und Disziplinen müssen nicht mehr mindestens 3 Buchstaben lang sein (#38).
  • Pläne mit vielen Daten laden jetzt auch (#31).

Die Liste aller Änderungen findet sich in der Timeline.

Eine vollwertige Test-Version der Anwendung findet sich unter http://auslastung.coderbyheart.de/.

Screenshots? Gerne.

Comment » | Technik

Die Browserkompatibilitätsklausel

October 9th, 2011 — 1:02pm

Wenn man in der glücklichen Situation ist, ein Angebot zu schreiben, ist dessen Basis in der Regel auch eine möglichst genaue Beschreibung über den Umfang des Auftrags, im Allgemeinen Pflichtenheft genannt.

Die Ausformulierung ist dabei entscheidend um im Fall von Meinungsverschiedenheiten klar bestimmen zu können, welche Partei Recht hat. Speziell bei Software kann aber die Beschreibung von Funktionen oft nicht exakt erfolgen — läuft die Software in einem vorher nicht genau bekannten Umfeld trifft man unweigerlich auf dieses Problem.

Die Regel ist das bei Anwendungen, die im Webbrowser dargestellt werden. Die Vielzahl existierender Browser und Platformen macht es praktisch unmöglich, die exakte Darstellung in verschiedenen Browsern zu garantieren. Dieser Umstand ist allgemein akzeptiert und inzwischen existiert das Bewußtsein dafür auch auf Kundenseite.

Wie aber formuliert man solche “Ungenauigkeiten” möglichst genau?

Den folgenden Absatz verwende ich in Pflichtenheften.

Browser-Unterstützung

Unterstützt werden:

  • Internet-Explorer 7-9
  • Firefox 3.6-6
  • Safari 5

Browser-Unterstützung, der aufgelisteten Browser und Versionen, bedeutet, dass die volle Funktionalität der Anwendung in diesen Browsern gewährleistet ist. Eine pixelgenaue, identische Darstellung in allen Browsern und unter allen Plattformen kann nicht gewährleistet werden, jedoch wird eine, im Sinne der Gestaltung und aus Sicht des Benutzers, fehlerfreie Darstellung angestrebt.

Eine Plattform ist ein Computer, Smartphone, Spielekonsole etc.

Die Wahl der Browser und Versionen ist dabei natürlich an das jeweilige Projekt angepasst. Als Faustregel sollte man die Browserversionen unterstützen, die in den Webserverstatistiken der Website (falls vorhanden) von mehr als 3% der Besucher verwendet werden — eine Ausnahme ist hier der IE6, eine Unterstützung für diesen Browser sollte in der Aufwandsschätzung für die Umsetzung in HTML und JS mit einem Aufschlag von 30% berücksichtigt werden.

Wichtig ist noch, dass man auf keinen Fall eine Aufwärtskompatibilität garantieren darf, z.B. mit Formulierungen wie “IE 9+”, dies führt zu unkalkulierbaren Aufwänden, und der Kunde hat den Eindruck, dass seine Website auch noch in 10 Jahren einwandfrei funktionieren wird.

Comment » | Technik

Default-Werte für Methoden-Argumente sollten null sein

August 4th, 2011 — 9:37pm

Oft genug sieht man Methodendefinitionen mit Standardwerten für Argumente, da viele Programmiersprachen das Überladen von Methoden, wie z.B. in Java, nicht unterstützen.

Ein einfaches Beispiel einer Methode mit zwei optionalen Argumenten:
function connect($host, $port = 1234, $timeout = 60) { ... }

Möchte man nun diese Methode verwenden, und den letzten der beiden Parameter überschreiben, ist man gezwungen, auch den zweiten an zu geben,
connect('server', 1234, 10);

Eigentlich meint man aber
connect('server', {default}, 10);

Und genau hier liegt das Problem: das Übernehmen des Standardwertes aus der Definition führt dazu, dass bei einer Änderung des Standardwertes sich diese Änderung nicht auf den Teil des Codes auswirkt, in dem die Methode aufgerufen wird — obwohl das eigentlich das Verhalten ist, dass der Verwender erwartet hätte.

Deswegen sollten Standardwerte immer mit null definiert werden:
function connect($host, $port = null, $timeout = null) {
    if ($port === null) $port = 1234;
    if ($timeout === null) $timeout = 10;
    ...
}

So muss der Aufrufer Standardwerten nur Beachtung schenken, wenn er sie explizit überschreiben will. Ansonsten kann er einfach null übergeben:
connect('server', null, 10);

Übrigens hat Python, in dem das Überladen von Methoden nicht unterstützt wird, eine clevere Lösung dafür: beim Aufrufen einer Methode kann man die Argumente explizit mit ihrem Namen ansprechen.

1 comment » | Technik

PyDev und PIL

May 23rd, 2011 — 8:18pm

PyDev meckert standardmäßig über ein

from PIL import Image

da es die Bibliothek nicht finden kann.

Dieser FAQ-Eintrag hilft da ein wenig weiter.

In den Einstellungen findet sich uner PyDev ➜ Interpreter – Python der Reiter Forced Builtins unter dem man mittels New den Eintrag PIL einträgt.

Comment » | Technik

MacBook Funktionstasten unter Linux

April 13th, 2011 — 11:38am

Diese sind, zumindest unter Arch Linux, standardmäßig nur mittels FN+F<1..12> zum auslösen zu bewegen.

Dieser Eintrag in der /etc/modprobe.d/modprobe.conf behebt das Problem:

options hid_apple fnmode=2

Comment » | Technik

Firefox 4 und X.509-Zertifikate

April 5th, 2011 — 4:37pm

Im neuesten Firefox funktionieren einige Zertifikate nicht mehr, mit denen z.B. Zugänge zu Content-Management-Systemen oder Banking-Webseiten gesichert werden.

Diese Zertifkate (mit Dateiendungen wie z.B. .p12) lassen sich auch nicht mehr über den Zertifikate-Manager von Firefox importieren.

Mit zwei kleinen Handgriffen kann man den Firefox aber doch wieder dazu überreden, mit den Zertifikaten zu arbeiten.

Zuerst muss in about:config der Wert security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref auf true gestellt werden — sonst verweigert der Fuchs jede Verbindung.

Anschließend wird das Zertifikat mit Hilfe des Kommandozeilen-Tools pk12util importiert:

pk12util -i <zertifikat.p12> -d ~/.mozilla/firefox/<profile>/
Enter password for PKCS12 file:
pk12util: PKCS12 IMPORT SUCCESSFUL

Jetzt noch den Firefox neu starten und schon klappt die Verbindung wieder.

1 comment » | Technik

Schneller Syntax-Check für modifizierte PHP-Dateien

January 20th, 2011 — 6:44pm

Ja, manchmal muss man halt via SSH auf Maschinen rumhacken, auf denen es kein vernünftiges Error-Reporting gibt. Und wenn dann die Seite weiß bleibt, hilft dieses Kommando, um heraus zur finden, welche der Dateien man zerschossen hat:

svn status | grep "\.php$" | grep "^M" | awk '{ print $2; }' | xargs -i php -l {}

Das svn status am Anfang verrät schon, zumindest über eine SVN working copy zu verfügen ist dabei äußerst hilfreich.

Die Alternative dazu, ohne SVN ist

find ./ -type f -name "*.php" | xargs -i php -l {}

was aber natürlich sehr viel langsamer ist.

Comment » | Snippets, Technik

Eclipse: -clean -refresh

December 21st, 2010 — 7:24pm

Manchmal, also eigentlich regelmäßig, hängt Eclipse.

The User Operation is waiting for background work to complete

oder ähnliche extrem hilfreiche Statusmeldungen hängen dann gerne mal ungefragt bis zum Sankt-Nimmerleins-Tag auf dem Bildschirm rum.

Da hilft nur ein

eclipse -clean -refresh

Das dauert zwar etwas länger, beseitigt aber z.B. Deadlocks, die für die Hänger verantwortlich sind.

2 comments » | Technik

Back to top