WordPress Linked Data Plugin installieren

Mein WordPress-Plugin zur Veröffentlichung von Bloginhalten als Linked Data, kurz wp-linked-data, ist nun auch über das WordPress-Plugin-Repository verfügbar. Die Installation ist mit wenigen Klicks erledigt. Wie die meisten anderen Plugins könnt ihr es nun über eueren WordPress-Administrationsbereich finden und installieren. Sucht einfach nach „wp-linked-data“ oder „Linked Data“.

Auch eine offizielle Seite bei wordpress.org hat es nun. Ich freue mich über Bewertungen und Feedback.

Einreichung zur SIGINT 2013: Dezentrales Social Web mit Linked Data und WebID

Ich habe folgenden Talk zur SIGINT 2013 eingereicht. Die Entscheidung, ob er genommen wird, fällt bis spätestens 5. Juni. Update: Die Einreichung wurde angenommen, der Talk findet statt.

Let’s tear down these walls – „Mit Links“ die Mauern Sozialer Netzwerke überwinden.

Seit jeher verlinkt das Web seine Inhalte, ganz gleich auf welchen Servern sie liegen. Interessanterweise scheint dieses Prinzip noch nicht im Social Web angekommen zu sein. Statt uns mit unseren Freunden, und Inhalten die wir mögen, zu verlinken, pflegen wir unzählige Accounts. Nicht selten stehen wir vor technischen Mauern, die unsere die Vernetzung verhindern. Diese Mauern können wir wahrsten Sinne „mit Links“ überwinden.

Das Web 1.0 – ein dunkler Ort, an dem man niemandem followen, nichts liken und nichts sharen kann. Niemand möchte mehr dort sein. Daher bietet jeder Dienst, der etwas auf sich hält ein „Connect with Facebook“, ein „Login with Twitter“ und ein „Share at Google+“ an.

Doch statt als ein soziales Wesen im Web zu agieren, sind wir nur die Summe unserer Accounts. Ein neuer Dienst, ein neuer Account. Zwar schnell erstellt per Facebook-Connect, doch inkompatibel zum Rest des Webs.

Die Mauern des Web 2.0 sind künstlich. Wir können und müssen sie einreißen. Jetzt.

Das Web war nie eine Anhäufung inkompatibler Dienste, sondern das genaue Gegenteil: Durch Hyperlinks können Webseiten miteinander verknüpft werden, ganz gleich auf welchen Servern sie liegen.

Dieses Prinzip der Links können wir auf Daten und Personen anwenden, um uns mit einer Identität global zu vernetzen. Dazu werden die Prinzipien von Linked Data und das WebID-Protokoll vorgestellt. Statt Dienste mit sozialen Funktionen im Web, wird das Web selbst zu einem gigantischen Social Network.

Der Vortrag erklärt:

  • die Grundlagen von Linked Data, d.h. wie über URIs Dinge und Personen global identifiziert und verlinkt werden können
  • wie man mit Hilfe der Friend-of-a-Friend-Ontologie (FOAF) ein maschinenlesbares Social-Web-Profil erzeugt und dezentral hostet
  • wie das WebID-Protokoll ein Ein-Klick-Login ohne zentralen Authentifizierungsdienst ermöglicht, um mit einem FOAF-Profil im Web zu agieren.

WordPress Bloginhalte als Linked Data

Dieses Blog veröffentlicht nun selbst Linked Data, statt nur darüber zu berichten. Dazu habe ich ein kleines WordPress-Plugin geschrieben, das die Bloginhalte über Content-Negotiation auch in verschiedenen RDF-Formaten verfügbar macht.

Blogartikel als „abstraktes Ding“, nicht als HTML-Dokument, bekommen eine eigene, um #it erweiterte URI. Das Web-Dokument, das gerade in eurem Browser geöffnet ist, ist z.B. unter http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data erreichbar. Der Blogartikel den ihr lest, hat also den Identifier http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data#it

Ihr könnt die URI, z.B. mit einem Online-RDF-Browser abrufen, um die Daten zu sehen. Freunde der Konsole nutzen curl und setzten einen entsprechenden Accept-Header (text/turtle oder application/rdf+xml):

curl -H "Accept: text/turtle" http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data#it

Auch Blog-Autoren bekommen vom Plugin eine eigene URI, die in späteren Versionen als WebID nutzbar sein wird. Die URI der Autorenseite wird um #me erweitert, um die Person zu identifizieren. In diesem Blog werde ich also durch http://datenwissen.de/author/angelo#me identifiziert. Ruft die URI wie oben beschrieben ab, um das FOAF-Profil zu sehen, das sich dahinter verbirgt.

Update: Die Installation ist nun einfach über die WordPress-Admin-Oberfläche durchführbar. Den Quellcode gibt es natürlich trotzdem noch auf GitHub.
Das Plugin befindet sich noch nicht im WordPress-Plugin-Repository, ist jedoch bereits auf GitHub verfügbar. Kopiert einfach den Inhalt des /src-Verzeichnisses unter /wp-content/plugins/wp-linked-data und aktiviert das Plugin in der WordPress-Oberfläche.

groovyrdf vereinfacht WebID-Publizierung

In Version 0.2.1 vereinfacht groovyrdf nun auch die Veröffentlichung von RSA-Public-Keys. Dazu muss einfach die Methode ‚publicKey‘ innerhalb der den Key besitzenden Resource aufgerufen werden. In folgendem Beispiel bekommt Alice einen Public Key zugewiesen:

RdfData rdfData = rdfBuilder {
  "http://example.com/resource/alice" {
    publicKey (
      '#alicePublicKey',
      label: 'Public Key of Alice',
      modulus: '2cbf8fff963dea33ee7d4f007ae',
      exponent: 65537
    )
  }
}

Der obige Code erzeugt RDF gemäß der aktuellen WebID-Spezifikation:


<http://example.com/resource/alice>
 <http://www.w3.org/ns/auth/cert#key>
 <#alicePublicKey>.

<#alicePublicKey>
 a <http://www.w3.org/ns/auth/cert#RSAPublicKey>;
 <http://www.w3.org/2000/01/rdf-schema#label>
   "Public Key of Alice";
 <http://www.w3.org/ns/auth/cert#exponent>
   65537;
 <http://www.w3.org/ns/auth/cert#modulus>
   "2cbf8fff963dea33ee7d4f007ae"^^<http://www.w3.org/2001/XMLSchema#hexBinary> .

groovyrdf steht hier zum Download bereit. Ein ausführlicher User-Guide ist hier verfügbar.

Linked Data in „java aktuell“

In der Ausgabe 01/13 von „Java aktuell“ erschien mein Artikel „Linked Data – ein Web aus Daten“, den ich nun auch an dieser Stelle als PDF bereit stelle. Es handelt sich um eine Einführung in das Thema Linked Data:

Wer heute im Web Daten abrufen möchte, hat es nicht leicht. Obwohl hinter vielen Diensten große Datenbanken stehen, beschränkt sich das Surfen im Web meist noch auf menschenlesbare Webseiten. Entwickler können bestenfalls den mühsamen Umweg über proprietäre APIs gehen. Mit Linked Data werden die Daten Teil des Webs und das dokumentenbasierte World Wide Web erweitert sich um ein Web aus Daten.

In der nächsten Ausgabe erscheint ein Praxisartikel der verdeutlicht, wie leicht man selbst Linked Data bereitstellen und verarbeiten kann. Die Ausgabe erscheint am 06.03.2013.

picserv unterstützt WebID-Login

Meine in Entwicklung befindliche Bilder-Plattform picserv unterstützt nun auch ein WebID-Login.

WebID ist ein aufstrebender Standard, der uns losgelöst von zentralen Netzwerken wie Facebook und Google+ eine Identität im Social Web geben kann. WebID ist gleichzeitig ein Login-Verfahren und euer Profil im Social Web. Ein solches Profil könnt ihr z.B. bei my-profile.eu mit wenigen Klicks einrichten, ihr seid aber nicht von einzelnen Anbietern abhängig. Wer mag kann auch selbst ein Profil hosten.

Wenn ihr euch mit eurer WebID bei picserv einloggt, könnt ihr dort Bilder hochladen und kommentieren. Euer Name und eurer Bild wird aus eurem Profil ausgelesen und muss nicht nochmals bei picserv hinterlegt werden. Das ist das Schöne im dezentralen Social Web: Eure Identität und die Dienste, die ihr mit dieser Identität nutzt können auf völlig unterschiedlichen Servern liegen. Statt monolithischer Social-Network-Plattformen wird das Web zum Social Network. picserv leistet mit dem WebID-Login einen Beitrag zu dieser Entwicklung.

[notice]Bitte beachtet aber, dass sich picserv noch stark in Entwicklung befindet. Verlasst euch nicht darauf, dass der Dienst oder eure Bilder dauerhaft verfügbar sind![/notice]

[important]Ihr habt Fragen zu WebID oder Probleme beim Einrichten eines Profils? Ich helfe gerne weiter. Auch Anregungen zu picserv nehme ich gerne entgegen.[/important]

groovyrdf 0.2 veröffentlicht

Es ist mittlerweile schon über 1 Jahr her, dass ich mit groovyrdf eine Bibliothek zur einfachen Erzeugung von RDF-Daten mit Groovy veröffentlicht habe. Nun ist endlich das 2. Release da, und es bringt interessante Neuerungen mit sich.

Neben dem Erzeugen von RDF ist mit Version 0.2 auch das elegante Auslesen und Verarbeiten von Daten möglich. Mittels RdfLoader unterstützt groovyrdf das Laden von Linked Data Ressourcen inklusive Content-Negotiation. Die Daten können anschließend ausgelesen und weiter verarbeitet werden:

  // Namespace-Deklaration
  def foaf = new RdfNamespace ('http://xmlns.com/foaf/0.1/')

  // Laden einer Ressource mittels RdfLoader
  RdfLoader rdfLoader = new JenaRdfLoader()
  RdfResource person = rdfLoader.loadResource(
    'http://me.desone.org/person/aveltens#me'
  )

  println person(foaf.name) // Gibt 'Angelo Veltens' aus

Der Loader kümmert sich selbstständig um Content-Negotation und das Parsen des zurückgelieferten Formats. Solange RDF geliefert wird, kann es uns egal sein, ob dies vom Server in TURTLE, RDF/XML oder N3 ausgedrückt wird. Alle gängigen RDF-Syntaxen werden unterstützt. Der Zugriff auf die Eigenschaften der geladenen Resouce ist anschließend einfach über resource(predicateUri) möglich. Näheres erklärt der User Guide. Version 0.2 steht hier zum Download bereit und den Sourcecode gibt es nach wie vor bei GitHub.

[important]Wenn ihr groovyrdf nutzt, oder auch einfach nur kurz ausprobiert, freue ich mich über euer Feedback![/important]

WebID-Authentifizierung mit Node.js

Ein Leser des letzten Artikels hatte Schwierigkeiten, die Signatur von foafssl.org mit Hilfe von Node.js zu überprüfen. Es war etwas tricky, aber ich habe es inzwischen hinbekommen und möchte die Lösung niemandem vorenthalten:

Grundsätzlich funktioniert die Überprüfung der Signatur bei Node.js mit verifier.verify(object, signature, [signature_format]). Als 1. Parameter gebt ihr den (PEM encodierten) Public Key an, als zweites die Signatur und als letztes das Format ‚base64‘.

Allerdings ist die übermittelte Signatur nicht Base64, sondern Base64-URL encodiert! Ihr müsst also in der Signatur zunächst alle ‚_‘ durch ‚/‘ und alle ‚-‚ durch ‚+‘ ersetzen. Bevor ihr die Signatur an die verify-Function übergebt, müsst ihr aber außerdem noch ‚==‘ hinten anfügen. Die korrekte Signatur ergibt sich also wie folgt:

var signature = signatureBase64Url.replace(/\_/g, '/').replace(/-/g, '+') + '=='

Ein funktionierendes, online ausführbares Code-Beispiel habe ich auf der Plattform jsapp.us hinterlegt.