Moderne Webanwendungen mit Haskell und Javascript: clientseitige Implementierung

Im ersten Teil des Artikels haben wir in Haskell einen einfachen Server mit Rest-API für eine Blogging-Software geschrieben. Nun möchten wir noch ein einfaches Frontend dafür bauen. Wie bereits erwähnt wollen wir hier unter anderem die Soy-Templates-Sprache von Google und deren Kompiler verwenden, um über Templates mit JavaScript HTML zu erzeugen. Außerdem werden wir einen einfachen Controller in JavaScript schreiben, der die entsprechenden Funktionen zusammenfügt und mit Daten versorgt.

Weiterlesen...

Die GUI-Monade: Monaden in der Praxis

Dieser Artikel zeigt den Einsatz von Monaden in der Praxis um GUI-Fenster zu beschreiben.

Für einen Kunden, der in der Sozialpädagogik tätig ist, entwickelt die ActiveGroup eine Software zur Dokumentation von Therapiemaßnahmen. Die Software erfasst die Stammdaten von Personen, die sich einer Therapie unterziehen, lässt die Personen Fragebögen ausfüllen, um den aktuellen Zustand und die Fortschritte der Therapie zu dokumentieren, und erlaubt das Erstellen zahlreicher Berichte.

Zur Entwicklung der Fragebögen verwenden wir eine Monade, welche die Darstellung des Fragebogens beschreibt und die Antworten einsammelt. Wieso eine Monade? Wir sehen folgende Vorteile:

  • Komponierbarkeit Die Elemente des Fragebogens lassen sich unabhängig voneinander beschreiben und anschließend beliebig miteinander kombinieren. Damit lassen sich unterschiedliche Logiken im Ablauf eines Fragebogens darstellen, z.B. wenn Frage 1 mit ‚ja‘ beantwortet wurde, geht es weiter auf Seite 2, ansonsten auf Seite 3.

  • Testbarkeit Da die Monade den Fragebogen nur beschreibt, lässt er sich relativ leicht testen. Statt Maus-Klicks zu synthetisieren, wertet man die Callbacks der Knöpfe innerhalb der Monade aus und testet ihre Auswirkungen auf die Beschreibung.

In diesem Artikel möchte die Komponierbarkeit anhand eines Beispiels illustrieren; die Testbarkeit und Implementierung überlasse ich späteren Artikeln. Als Beispiel dient ein kleiner Fragebogen, der festellt, ob der Befragte am Montag Zeit hat und falls ja, um wieviel Uhr.

Weiterlesen...

Monaden in Aktion

Monaden in Aktion#

Im letzten Artikel über Monaden haben wir die Grundlagen diskutiert. Hier soll es darum gehen, eigene Monaden zur Lösung Software-technischer Aufgaben selbst zu entwickeln. Wir werden sehen, wie ein Stück Software modular und durch lokale Erweiterungen um neue Funktionalität ergänzt werden kann, ohne bestehende Teile zu verändern oder zu refaktorisieren. Unter modular verstehen wir dabei die Eigenschaft, bestimmte Funktionalität in einem klar abgegrenzten Bereich implementieren und mit anderen Erweiterungen kombinieren zu können.

Als laufendes Beispiel werden wir die klassische Aufgabe der Auswertung von Ausdrücken behandeln. Wir werden mit einfachen arithmetischen Ausdrücken und Konstanten beginnen. Hierfür werden wir einen rein funktional geschriebenen Interpretierer angeben. Dieser wird in einem ersten Schritt in eine monadische Form transformiert, ohne dass die Funktionalität verändert wird.

Anschließend werden wir Erweiterungen vornehmen, die in einem herkömmlichen Interpretierer nur schwer und mit hohem Aufwand möglich sind. Wir werden eine sinnvolle Fehlerbehandlung hinzufügen, nichtdeterministische Berechnungen ermöglichen, Variablen in den Ausdrücken zulassen und zum Schluss die Sprache um Zuweisungen, Schleifen und Ein- und Ausgabe erweitern.

In diesem Teil über Monaden in Aktion werden wir nur die ersten Schritte entwickeln. Die Erweiterungen um Variablen, Zuweisungen und E/A werden in einem weiteren Teil diskutiert werden.

Weiterlesen...

MyOwnSafe - Funktionale Programmierung in der Praxis

Die Active Group hat die Webanwendung MyOwnSafe für die MyOwnSafe GmbH entwickelt. MyOwnSafe ist ein „intelligenter Tresor mit Nachlassfunktion“. Der Anwender kann in dieser Anwendung Informationen und Dokumente zu seinen Versicherungen, und seinem Vermögen, sowie sonstige persönliche Informationen ablegen und pflegen. Außerdem kann er Vorkehrungen treffen um diese Informationen im Todes- oder Krankheitsfall bestimmten Personen zugänglich zu machen.

Dieser Artikel beschreibt das Projekt und seine Architektur, Hintergründe zu den Entscheidungen die dabei getroffen wurden, sowie den Erfahrungen die wir damit gemacht haben. Die technischen „Pfeiler“, auf denen die Anwendung fußt, sind dabei die Programmiersprachen OCaml und JavaScript („HTML 5“), Cloud-Computing, NoSQL-Datenbanken und Webservices. Eine Schematische Darstellung der Architektur von MyOwnSafe zeigt folgendes Bild:

Schematische Darstellung der Architektur von MyOwnSafe

Weiterlesen...

Haskell schlägt node.js

Das Javascript-Framework node.js ist eine auf Googles V8 Engine basierende Platform zur Erstellung von performanten und skalierbaren Netzwerkprogrammen. Dabei laufen node.js Programme, anders als mit Javascript sonst üblich, auf der Serverseite. Die gute Performance von node.js bei Netzwerkoperationen beruht vor allem auf der Nutzung von asynchronen Programmierschnittstellen. Allerdings machen solche Programmierschnittstellen den Entwicklern das Leben unnötigerweise schwer und tragen nicht gerade zur guten Wartbarkeit des Codes bei. Wir werden im Verlauf des Artikels noch sehen warum dem so ist.

Der heutige Blogartikel zeigt, dass sich mit der funktionalen Programmiersprache Haskell Netzwerkprogramme mit deutlich besserer Performance als mit node.js schreiben lassen, ohne dass dabei auf ein asynchrones Programmiermodell zurückgegriffen werden muss. Stattdessen wird im üblichen, sequenziellen Stil programmiert und das Laufzeitsystem kümmert sich um die performante Umsetzung auf asynchrone Primitivoperationen.

Der verwendete Benchmark ist eine einfache Serverapplikation, die jede vom Client geschickte Zahl verdoppelt und das Ergebnis an den Client zurückschickt. Mit diesem Benchmark ist das vorgestellte Haskellprogramm im Durchschnitt um Faktor 1,6 schneller als das entsprechende node.js Programm, bei Rückgriff auf eine experimentelle node.js Erweiterung zur Nutzung mehrerer Prozessorkerne schmilzt der Vorsprung der Haskell-Version auf Faktor 1,04, allerdings bringt diese Erweiterung von node.js andere Nachteile mit sich.

Am Ende des Artikels lesen Sie, mit welchen Tricks das Haskell-Laufzeitsystem diesen Speedup erzielt. Ein paar grundlegende Haskell-Kenntnisse schaden zum Verständnis des Artikels nicht, vielleicht möchten Sie sich ja mal unseren Einführungsartikel zu Monaden, das programmierbare Semikolon anschauen. Auch könnten die Artikel zu paralleler Programmierung in Haskell und zur Webprogrammierung in Haskell für Sie interessant sein.

Weiterlesen...