Als Vannevar Bush 1945 den Memex (MemoryExtender ) konzipierte und damit ein analoges Internet auf Basis eines elektromechanischen Mikrofilmgeräts imaginierte,
erkannte er, dass die stetig anwachsende Menge des verfügbaren Wissens es erfodern würde, einen Pfad durch das Wissensdickicht zu schlagen. Diesem Zweck sollten sich
die “trail blazer” verschreiben, eine neue Berufsgruppe, die genau diese Pfade schlagen würden.
Heute, 64 Jahre später, kennt jeder kennt das Problem der überbordenden Informationsflut – von “trail blazern” aber weit und breit keine Spur. Es gibt aber Online-Dienste, die ihren Benutzern die Filterung von Informationen aus dem Internet abnehmen beziehungsweise erleichtern wollen. Ich möchte zwei dieser Dienste vorstellen und beginne mit PostRank. PostRank ist ein Online-Dienst, der Inhalte aller Art (RSS-Feeds, Blog-Einträge [oder: Blogeinträge, s.u.], Artikel oder Nachrichten) bewertet und auf Grund der Bewertung filtert.
Die Bewertung findet auf Basis von Daten statt, die PostRank aus dem Interesses und dem Feedback der Leser/Nutzer ableitet. Die Macher von PostRank sprechen von “social engagement” oder den “5 Cs” des sozialen Engagements und fassen darunter folgende Aktivitäten zusammen:
- Einen Blogeintrag als Antwort auf einen anderen Eintrag schreiben (Creating) ,
- das Setzen eines Lesezeichens/Favoriten (Collecting),
- Kommentieren eines Blogeintrags (Critiquing),
- Klicken eines Links (Clicking) oder
- Konversation zu einem Thema über Twitter oder Pownce [pownce wurde leider stillgelegt] (Chatting).
PostRanks Bewertungssystem geht davon aus, dass sich die Benutzer umso mehr für ein Thema engagieren, desto mehr Interesse es hervorgerufen hat. Und je mehr Interesse vorhanden ist, desto höher wird dieses Thema von PostRank bewertet. Auf welche Quellen stützt sich PostRank bei seiner Analyse? Zurzeit werden folgende Quellen ausgewertet: Google-Trackbacks, Twitter, Pownce, Digg Ma.gnolia, del.icio.us, die Anzahl der Kommentare zu einem Thema (Blogeintrag o.ä.) und Views und Klicks (innerhalb von RSS-Readern oder PostRank-Widgets). Diese Quellen werden rein quantitativ ausgewertet.
Wie kann PostRank nun aber einen Pfad durch die Blogs und Newsseiten finden, die mich interessieren? Nachdem man sich auf der Seite von PostRank für ein Benutzerkonto registriert hat, erhält man die Möglichkeit, die Inhalte von PostRank analysieren zu lassen. Alles was man tun muss, ist eine URL einzugeben.
Auf Grundlage seines Bewertungssystems erstellt PostRank nun beispielsweise eine Liste der Einträge einer Nachrichtenseite. Die Einträge erhalten alle einen Wert zwischen 1 und 10, der dem “social engagement” entspricht. Die Liste kann jetzt vom Benutzer mit Tags versehen und als Feed gespeichert werden. Zusätzlich erhält man die Möglichkeit, nach verschiedenen Kriterien zu filtern. Außer der Online-Inhalte aggregieren zu können, kann man die angelegten Feeds in einem XML Format (OPML-Datei) exportieren.
Weiterhin werden durch das taggen der Feeds sogenannte Channels erzeugt, die sich dann in einen RSS-Reader integrieren lassen. PostRank bietet derzeit die Möglichkeit, die eigenen Channels per Link direkt in BlogLines, FeedBlitz, Google, NetVibes und NewsGator einzufügen. So kann man also die bevorzugt gelesenen Feeds von PostRank filtern lassen und sie dann im eigenen Feed-Reader lesen.
Ein berechtigter Einwand gegen diese Art der Filterung liegt auf der Hand. Was ist, wenn ein Thema mich interssiert, das aber nur wenige andere interessiert? Je nachdem wie ich meine Filter eingestellt habe, besteht die Gefahr, dass diese Inhalte von PostRank geschluckt werden und meiner Aufmerksamkeit entgehen. Es handelt sich bei PostRank um eine rein quantitative Auswertung, die keinen Aufschluß darüber gibt, wie gut oder schlecht die Benutzer ein Thema bewertet haben. Es misst nur die Menge an Aufmerksamkeit, die ein Thema innerhalb des Netzes bekommt. Es bleibt nun jedem selbst überlassen zu ermessen, ob er bereit ist dies in Kauf zu nehmen.
Auf der anderen Seite kann dieser Nachteil auch ein Vorteil sein. Und zwar wenn man das Interesse im Netz an den eigenen Inhalten messen will. Selbst wenn man nicht die API von PostRank nutzt, kann man über die externen Quellen wie Google und Twitter kann man erfahren, wie sehr sich das Netz für die Inhalte interessiert, über die man selbst geschrieben hat. Und natürlich noch mehr wenn man die API benutzt. Dies liefert sicherlich bessere Werte über Interesse und Popularität eines Themas oder eines Feeds als das bloße Messen von Page-Impressions.
Neben dem Online-Service bietet PostRank zwei weitere interessante Features. Zum einen ein Widget, dass sich auf der eigenen Seite einbinden lässt, mittels dessen den Besuchern eines Blogs die Wertungen der Beiträge durch PostRank angzeigt werden können. Außerdem bieten die Macher eine API an, mit passenden Bibliotheken in Ruby, Python, C# und C#.NET, die sich allesamt auf Github herunterladen lassen. Last but not least gibt es noch ein Plugin für FireFox, mit dem man vom Browser aus den PostRank-Service nutze kann.
Alles in allem halte ich PostRank für einen interssanten Ansatz, um die Menge der Online-Inhalte zu filtern. Das hohe Interesse innerhalb des Netzes kann ein guter Indikator für spannende Themen sein, wenn auch manche durch das Raster fallen. Das Interface ist übersichtlich und gefällig. Die Unterscheidung zwischen Feeds und Channels ist meiner Ansicht nach nicht ganz trennscharf, erschließt sich aber nach kurzer Zeit.
Im nächsten Teil möchte ich einen Dienst vorstellen, dessen Filter auf den persönlichen Vorlieben des Benutzers basieren.
Google hat in der letzten Woche ein neues Mitglied seiner großen Webfamilie vorgestellt. Mit AppEngine gibt Google Entwicklern die Möglichkeit seine Infrastruktur zu nutzen. Sie machen es damit sehr einfach Anwendungen zu Entwickeln und auf ihren Serverfarmen laufen zu lassen, Daten auf Google-Datenbanken zu speichern und sogar das User-Authentifizierungs-System mitzubenutzen.
In diesem Artikel versuche ich, einen groben Überblick zu geben.
AppEngine != EC2+S3
Auf den ersten Blick mag es so erscheinen, als hätten Google ein System wie Amazons EC2 und S3 implementiert. Bei näherer Betrachtung wird aber schnell klar das AppEngine eine andere Ausrichtung hat. Während EC2 dem Kunden nichts von den Möglichkeiten und Schwierigkeiten virtualiserter Server vorenthält, konzentriert sich AE darauf, die Hürden bei der Entwicklung von Webanwendungen zu verringern. Der Benutzer von AE muss sich nicht darum kümmern eine Datenbank oder einen Server aufzusetzen, das Deployment einer Anwendung ist ein einziger Befehl und Statistiken werden automatisch erstellt.
Der große Vorteil von AWS ist die Flexibilität des Systems. Cronjobs, verschiedene Sprachen und alles was auf einer oder x virtualisierten Maschinen laufen kann sind möglich. AE hingegen bietet eine sehr eingeschränkten Funktionsumfang. Eine Sprache, eine Datenbank, HTTP-Request und Response. AE ist simpel und skaliert.
Charakter
AppEngine hat einige Charakteristika, die erwähnt sein wollen.
Die Sprache, in der Anwendungen entwickelt werden ist Python. Google plant weitere Sprachen zur Verfügung zu stellen, vorerst ist aber Python die einzige. Meiner Meinung nach eine sehr gute Wahl, zumal die Idee hinter AppEngine -wie gesagt- ist, ein niederschwelliges Angebot zu sein.
Hierbei ist alledings anzumerken, das einige Veränderungen an der Standard-Library vorgenommen wurden. Vereinfacht dargestellt wurde alle Module entfernt, die auf das Dateisystem oder Sockets zugreifen. Keine urllib! Keine urllib2! Zugriff auf Webresourcen geschieht über Googles eigenes URL Fetch Modul. Diese Einschränkungen sind recht gravierend und machen das portieren von bestehenden Python-Webanwendungen aufwendig. Beim Entwickeln neuer Anwendungen auf AppEngine sollten sie allerdings nicht zu sehr ins Gewicht fallen.
Weiterhin gibt keine relationale Datenbank. Daten werden in Googles selbstentwickelter Datenbank Bigtable abgelegt. Bigtable ist eine schemalose Datenbank für strukturierte Daten. Jeder Datensatz in Bigtable wird durch einen eindeutigen Schlüssel identifiziert und kann verschiedene Felder enthalten. Es gibt eine ganze Reihe Datentypen, von einfachen wie String und Float über Listen bis hin zu komplizierteren wie Geokoordinaten oder Adressen; auch für Google-Nutzer gibt es hier einen eigenen Datentyp. Die Kommunikation mit Bigtable ist in eine API abstrahiert, die das Erstellen von Datenstrukturen sowie das Schreiben und Lesen in die DB vereinfacht.
Ein Codebeispiel sagt in diesem Fall wohl mehr als viele Worte
from google.appengine.ext import db
from google.appengine.api import users
class Pet(db.Model):
name = db.StringProperty(required=True)
type = db.StringProperty(required=True, choices=set(["hund", "katze", "maus"]))
birthdate = db.DateProperty()
pet = Pet(name="Fluffy", type="cat", owner=users.get_current_user())
pet.weight_in_pounds = 2
pet.put()
Hier wird eine Datenstruktur für Haustiere angelegt. Es gibt Felder für Name und Tierart (beschränkt auf eine vorgegebene Auswahl) sowie ein Integer und ein Datumsfeld. Im Feld owner wird ein Google-Account referenziert. Es wird ein Tier namens “Fluffy” angelegt und per .put() in die Datenbank geschoben.
Des weiteren gibt es mit GQL (gesprochen: gequel) eine SQL ähnliche Sprache, mit der Daten aus der Datenbank abgefragt werden. Die Abfrage
pets = db.GqlQuery(“SELECT * FROM Pet WHERE pet.owner = :1″, users.get_current_user())
gibt beispielsweise ein Query-objekt mit den Haustieren des gerade angemeldeten Google-Benutzers zurück. Diese Query kann weiter gefiltert werden oder man kann per pets.fetch(3) die ersten 3 Tiere in einer Liste erhalten.
Da Bigtable darauf ausgelegt ist im Google-Maßstab zu Skalieren, ist sie nicht darauf optimiert einzelne Abfragen möglichst schnell auszuführen, sondern darauf auch unter größter Last und bei großen Datenmengen gleichbleibende Performance zu bringen. Es ist also angebracht auf Entwicklerseite etwas umzudenken. Zum Beispiel ist es geschickt Daten stark zu denormalisieren oder Funktionen, wie z.B. Summenbildung, die RDMSe normalerweise on-the-fly anbieten beim Abspeichern der Daten zu erledigen und im Datensatz zu hinterlegen.
Auch gibt es in AE keine Entsprechung zu einer Session. Wenn Daten über mehrere HTTP-Requests persisitert werden sollen, muss dies über die Datenbank geschehen. Alledings bietet die Datastore Engine die Möglichkeit dynamisch Felder zu einem Datensatz hinzuzufügen.
SDK
Das Entwickeln von AE-Anwendungen läuft über ein SDK, das die AE-Infrastruktur lokal Simuliert. Das SKD gibt es für Linux, Mac und Windows und man kann es sich auch herunterladen ohne einen AppEngine-Account zu haben. Beinhaltet sind unter anderem, ein Entwicklungs-Server, lokaler Datastorage und simulierte User-Anmeldungen.
Eine Anwendung besteht im einfachsten Fall aus einer yaml -Konfigurationsdatei und einer Python-Datei. In der Konfiguration (app.yaml) werden die AppEngine-ID und die Version der Anwendung eingetragen und über Regular-Expressions festgelegt welche Skripte für welche URLs verantworlich sind.
Deployment
Wenn man eine Anwendung mit dem SDK entwickelt und getestet hat lässt sie sich mit dem Befehl:
appcfg.py update myapp/
im Web auf den Google-Servern veröffentlichen. Wobei myapp/ der Pfad, ist unterhalb dem die lokalen Skripte liegen. Die Anwendung ist nun unter http://my-app-id.appspot.com/ zu erreichen.
Unkomplizierter kann ich es mir kaum vorstellen.
Es gibt ein Admin-Interface für AE-Apps (Dashboard) über das Statistiken und Anwendungs-Logs angeschaut werden können. Hier gibt es ein Interface zum Betrachten und editieren der Datenbank-Inhalte sowie die Möglichkeit Mitarbeiter für kollaboratives Entwickeln einer Anwendung festzulegen. Ein weiteres schönes Feature ist die Versionsverwaltung. Wenn man seine Anwendung in der app.yaml versioniert hat kann man nun mit einem Klick aussuchen welche Version Live gehen soll.
Das System für das Deployment von Anwendungen, sehe ich als ein großes Plus für AppEngine.
Django
Eine der überraschenderen Enthüllungen im Rahmen des Releases von AppEngine ist, das die Möglichkeit besteht das Framework Django zu benutzen. Im Prinzip sollte jedes Python-Webframework, das sich an den WSGI-Standard hält unter AppEngine laufen, aber das AE-Team scheint sich auf Django zu konzentrieren. Beim SDK ist die Version v0.96.1 mit inbegriffen.
Die Community um das Django-Project ist natürlich in hellem Aufrur. Zum einen auf Grund der “Adelung” durch google und der neuen Möglichkeiten. Zum anderen gibt es aber auch viel Enttäuschung, da beim näheren hinsehen schnell klar wird das Django unter AppEngine stark eingeschränkt läuft.
Als wichtigster Punkt (neben weiteren) ist aufzuführen, das der ORM nicht mehr verwendet werden kann, da Bigtable keine relationale Datenbank ist. Dies führt natürlich dazu das Djangos eingebautes Administrations-Interface und die meisten der third-party-apps, die Django nicht zuletzt so attraktiv machen, nicht funktionieren.
Django kann also auf AppEngine bei weitem nicht so glänzen wie auf LAMP.
Wenn man sich AppEngine anschaut und bereits mit Django vertraut ist wird einem allerdings auffallen, das das Web-Framework an vielen Stellen Pate gestanden haben mag.
Das Templating-System wurde unverändert von Django übernommen. Das Mapping zwischen URLs und Skripten in der app.yaml läuft wie bei Django über Regular-Expressions. Der Django URL-Mapper ist deutlich leistungsfähiger, kann aber Problemlos verwendet werden.
Bei Abfragen der Datenbank wird bei AE ein GqlQuery -Objekt zurueckgegeben, welches dem Django equivalent QuerySet nahekommt.
Die Datenbank API ist Djangos ORM erstaunlich ähnlich. Zum Vergleich die Modelle aus Djangos offiziellem Tutorial für beide Systeme (von mir leicht angepasst):
Hier die Version für AppEngine (von Shabda Raaj):
from google.appengine.ext import db
class Poll(db.Model):
question = db.StringProperty()
created_on = db.DateTimeProperty(auto_now_add = 1)
created_by = db.UserProperty()
class Choice(db.Model):
poll = db.ReferenceProperty(Poll)
choice = db.StringProperty()
votes = db.IntegerProperty(default = 0)
und im Django ORM Original:
from django.db import models
from django.contrib.auth.models import User
class Poll(models.Model):
question = models.CharField(max_length=200)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User)
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length=200)
votes = models.IntegerField()
Community
Die Reaktion in der Developer-Community ist recht heftig. Die 10.000 ersten Invites gingen weg wie warme Semmeln. Es sind bereits über 700 Blog-Postings zum Thema veröffentlicht worden (davon sind allerdings recht wenige auf deutsch und bis jetzt noch keiner von mir
).
Auf appgallery, der freiwilligen, zentralen Registrierung für Apps sind über 100 Anwendungen registriert. Es gibt bereits einige Open-Source-Projekte, die sich mit AppEngine befassen. In der Google Group gibt es über 2000 Beiträge.
Im Issue Tracker sind uber 200 Tickets angelegt worden, von denen sind einige (wenige) vom Team bereits bearbeited worden, viele noch offen und in einigen ist Chaos und Flamewar ausgebrochen.
Es gibt Anzeichen dafür, das das Team das Feedback ernstnimmt und in der weiteren Entwicklung darauf eingehen möchte. Ein häufig bemängeltes Thema war z.B. schnell nach dem Release das Problem, das man sich mit der Entscheidung, eine Anwendung auf der neuen Plattform zu Programmieren, stark vom grossen G abhängig macht. (Als Beispiel ein Post von Tim O’Reilly). Worauf das AppEngine Team schnell mit der Ankündigung eines Daten Im- und Export-features reagiert hat und die Community nach ihren Vorstellungen fragt.
(Das löst natuerlich das Problem nicht, das AppEngine-Code nicht (ohne weiteres) auf einer anderen Platform läuft.)
Fazit
AppEngine ist eine äusserst vielversprechende Erweiterung der Web-(2.0 wenn man so will)-Landschaft. Google versucht hier anscheinend eine Art Blogger für Web-Anwendungen zu schaffen, bei dem der User sich nur noch um den tatsächlichen Content kümmern muss. Content wäre hier natürlich Quellcode. Die Schwelle mal schnell eine Webanwendung zu entwickeln und zu sehen ob es funktioniert oder Geld bringt ist so sehr niedrig, da wenig bis nichts ausser Arbeitszeit investiert werden muss und der Aufwand, die Anwendung zu betreiben und zu administrieren, minimal ist.
Ob AE ein Erfolg wird muss sich noch zeigen. Ich denke es wird stark davon abhängen wie Google auf die Bedürfnisse der Entwickler von Anwendungen eingehen kann und in welche Richtung die Entwicklung gehen wird.
Zum Beispiel könnte man sich vorstellen, das sich Google AppEngine als den zukünftigen Kleister zwischen seinen zahllosen anderern Webprodukten vorstellt, von denen viele bereits per Python angesrochen werden können.

0