Select Page

NETWAYS Blog

Aspektorientierte Programmierung mit jQuery-AOP

Schon mal was von Aspektorientierung gehört? Nein? Kein Wunder, denn die aspektorientierte Programmierung führt ein ziemliches Schattendasein, obwohl sie in vielen Fällen äußerst praktisch sein kann. Besonders Aufgaben wie Profiling, Logging und Berechtigungen, die in rein objektorientiertem Code viel Aufwand machen würden, lassen sich aspektorientiert sehr elegant umsetzen.

Objektorientierung++

Glücklicherweise versucht die Aspektorientierung nicht das Rad komplett neu zu erfinden, sondern versteht sich eher als Erweiterung zur normalen Objektorientierung. Es gibt einige Probleme die mit der herkömmlichen Objektorientierung nicht trivial (ohne große Mengen an redundanten Code) lösbar sind, da es beispielsweise keine Möglichkeit gibt von außen in das Verhalten von Objekten einzugreifen. An dieser Stelle führt die aspektorientierte Programmierung das Konzept der Aspekte ein, die bestimmtes Verhalten in den gesamten Programmcode “einweben” können. Die Probleme die damit gelöst werden nennen sich Cross-Cutting Concerns, da sie sich über die gesamte Programmlogik erstrecken und nicht gekapselt werden können. Musterbeispiele für solche Cross-Cutting Concerns sind, wie bereits oben genannt Profiling, Logging oder Berechtigungen.
In der Aspektorientierung benutzt man Point-Cuts um alle Stellen im Programm zu definieren an denen bestimmte Aspekte umgesetzt werden müssen. Ein Aspekt wird in der Regel durch einen Funktionsaufruf realisiert, der an ganz bestimmten Point-Cuts aufgerufen wird. Diese Funktionen nennt man Advice. Um ein Advice aufzurufen, wird der Programmfluss an dem Point-Cut unterbrochen und alle Advices werden ausgeführt. Abschließend lässt man die Advices von einer Hilfsmethode (oder je nach Sprache von einem Compiler) an den von den Point-Cuts definierten Punkten einbinden. Dieser Vorgang nennt sich “Weaving”.

Profiler

Am besten lassen sich die Vorteile der aspektorientierten Programmierung an einem praktischen Beispiel zeigen. Unser Ziel ist es einen Profiler zu schreiben, der bei einem gegebenen Objekt die Laufzeiten aller Funktionsaufrufe misst und auf der Console ausgibt. Diesen Profiler wollen wir dann benutzen um das HTML5-Canvas zu profilen. Als Werkzeug verwende ich jQuery-AOP, eine Bibliothek die Hilfsfunktionen für die aspektorientierte Programmierung bietet.
Nach dem Einbinden von jQuery und jQuery-AOP, definieren wir zuerst einen Point-Cut und einen passenden Advice. Der Point-Cut “zeigt” auf alle Methoden des Objekts das wir überwachen wollen. Der Advice wird bei jedem Funktionsaufruf ausgeführt und führt die eigentliche Zeitmessung durch. Beim Weaving benutzen wir die Funktion around(), um festzulegen dass alle Funktionen in den Advice eingebettet werden sollen.

var ctx = document.getElementById("some-canvas").getContext("2d");
// Point-Cut definieren.
var pointCut = { target: ctx, method: /.*/ };
// Advice definieren.
var advice = function(invocation) { 
    var t1 = Date.now();
    var ret = invocation.proceed();
    console.log(invocation.method + ": "  + (Date.now() - t1) + " ms");
    return ret;
}
// Weave
jQuery.aop.around(pointCut,advice);
// Laufzeiten messen
ctx.fillStyle = "rgb(200,0,0)";             // fillRect: 1 ms
ctx.fillRect (10, 10, 55, 50);              // fillRect: 1 ms
ctx.beginPath();                            // beginPath: 1 ms
ctx.moveTo(30, 30);                         // moveTo: 2 ms
ctx.lineTo(150, 150);                       // lineTo: 0 ms
ctx.bezierCurveTo(60, 70, 60, 70, 70, 150); // bezierCurveTo: 1 ms
ctx.lineTo(30, 30);                         // lineTo: 0 ms
ctx.fill();                                 // fill: 0 ms

Emails mit Node.js versenden

Nodejs_logo_light
Wer schon einmal versucht hat, mit Node.js Mails zu versenden, wurde wahrscheinlich von einer sehr großen Anzahl an möglichen Modulen überschwemmt, die sich allerdings teilweise sehr stark voneinander unterscheiden. Neben umfangreicheren Client-Bibliotheken, wie zum Beispiel NodeMailer oder EmailJS, gibt es auch einige sehr schlanke Module, die nur für spezielle Einsatzzwecke geeignet sind und sogar Clients die nur mit ganz bestimmten, teilweise kostenpflichtigen, Angeboten zusammenarbeiten.
Um ein wenig Überblick in diesen Urwald zu bringen stelle ich in diesem Blogpost zwei funktionierende Lösungen für unterschiedliche Einsatzzwecke vor.

Lösung 1: “Quick and dirty” mit Node-Sendmail

Den geringsten Aufwand hat man, wenn man die Mail einfach direkt an den Ziel-Mailserver senden kann. Allerdings werden derartige Emails häufig ein Opfer von Spamfiltern und es ist dem Empfänger auch nicht möglich auf die Email zu antworten. Wenn das allerdings kein Problem darstellt lassen sich mit Node-Sendmail mit nur wenigen Zeilen Mails automatisiert versenden.
Nachdem man die Bibliothek “sendmail” mit dem Node Package Manager installiert hat, kann man mit folgendem Snippet einfach Mails in seiner Anwendung versenden:

mail = require('sendmail')();
mail({
       from: 'noreply@meinedomain.com',
       to: 'empfaenger@example.com',
       subject: 'Mail versendet mit sendmail',
       content: 'Kein text.'
   },
   function(err,response){
      if(err){
         console.log(err);
      }
      console.dir(response);
});

Lösung 2: Als Client eines Mailservers mit Nodemailer

Wenn die obere Lösung nicht möglich ist, gibt es auch Module die als Client eines Mailservices fungieren können. Diese Lösung erfordert allerdings mehr Aufwand, da man erst die Logindaten und das verwendete Protokoll definieren muss und einen Account benötigt.
Folgendes Beispiel erklärt die Verwendung von Nodemailer mit Gmail:

var mail = require("nodemailer");
var transp = mail.createTransport("SMTP",{
    host: "smtp.gmail.com",
    port: 465,
    secureConnection: true,
    auth: {
        user: "meinaccount@gmail.com",
        pass: "secret"
    }
});
transp.sendMail({
        to:   "empfaenger@example.com",
        subject: "Test",
        text: "Versendet mit Nodemailer"
    },
    function(err,response){
        if(err){
            console.log(err);
        }
        console.log(response);
});

HTML-Templates

Da man in den meisten Fällen in seiner Anwendung nicht nur Mails versenden, sondern auch dynamisch generieren will, brauchen wir zusätzlich eine Möglichkeit Templates zu verwenden. Gute Erfahrungen habe ich bisher mit Node-email-templates gemacht. Damit ist es möglich Mailtemplates mit EJS zu erstellen und daraus HTML zu generieren. Eine komplette Beschreibung dieses Vorgangs würde den Rahmen dieses Blogposts sprengen, jedoch existiert eine detaillierte Beschreibung auf der Projektseite.

Cloud Storage auf dem eigenen Server mit OwnCloud

In letztere Zeit hat man in der IT-Welt kaum ein Wort so oft gehört wie das Wort “Cloud”. Nahezu jeder verwendet inzwischen Services wie Dropbox oder iCloud um seine (oft) mehr oder weniger persönlichen Daten überall verfügbar zu haben. Das ist zwar extrem komfortabel, es entsteht dadurch allerdings auch ein neues Problem: Kann ich darauf vertrauen, dass meine Daten dort wo sie sind, wirklich sicher sind? Sollte man wirklich so viele persönliche Daten anderen Personen anvertrauen? Das haben sich wohl auch die Macher von OwnCloud gedacht und eine Cloud-Storage-Plattform für den eigenen Heimserver entwickelt.
OwnCloud bietet im Prinzip alles, was auch die “großen” Anbieter können: Ordner/Dateien synchronisieren, Musik mithilfe eines eingebetteten Players anhören und Kalender mit CalDav synchronisieren. Zusätzlich ist man außerdem noch der Herr seiner eigenen Daten und jederzeit volle Kontrolle, da alles auf dem eigenen Server abläuft.
Die Installation der OwnCloud Serveranwendung unter Linux (hier Ubuntu) ist relativ einfach und im Detail in der Installationsanleitung von OwnCloud beschrieben. Im Prinzip benötigt man nur einen Apache Webserver mit PHP und MySQL oder Sqlite-Unterstützung und kann dann einfach das OwnCloud Package nach /var/www/ entpacken.
Wenn alles, wie in der Installationsanleitung beschrieben, durchgeführt wurde und man die URL http://localhost/owncloud/ öffnet, wird man bereits vom OwnCloud Setup begrüßt. Dort kann man nun seinen Administratoraccount einrichten.
Wenn die Einrichtung abgeschlossen ist, findet man sich direkt auf der Weboberfläche zur Verwaltung des ersten Accounts wieder. Dort kann man nun Musik, Bilder oder einfach nur Dateien hochladen und sie von überall aus wieder erreichen. Wenn man von bestimmten Geräten aus regelmäßig auf die Daten zugreifen will empfiehlt sich auch die Installation des OwnCloud Clients für Desktops oder der App für Android und iOS.

OwnCloud Account

Hochgeladene Bilder und Musikdateien werden automatisch als solche erkannt und in die passenden Ordner eingepflegt.

Qooxdoo her!

Pünktlich zu Weihnachten habe ich für alle unter euch die das JavaScript Framework Qooxdoo verwenden, eine nette Überraschung: ein neues Widget!
Im Moment arbeite ich intern an einem Projekt, das auf den vielsagenden Namen “NETRP” hört. Es handelt sich dabei um einen in Qooxdoo umgesetzten, web-basierten Ressourcenplaner. Trotz der sehr großen Auswahl an vorgefertigten Widgets, mangelte es meiner Anwendung aber am Ende noch an einer komfortablen Möglichkeit um einen bestimmten Zeitraum für eine Ansicht auszuwählen. Nach einigem herumprobieren und basteln ist dabei der TimeSlider herausgekommen:
timeSlider1
Der TimeSlider ermöglicht es, aus einem größeren Zeitraum mittels eines verschiebbaren Reglers einen kleineren Zeitraum auszuwählen.  Außerdem ist auch die Größe des ausgewählten Bereichs vom Nutzer verstellbar. Nützlich ist das vor allem um Detailansichten bestimmter Zeiträume oder die Anzeige von Statistiken komfortabel zu realisieren, vor allem da die Verhältnisse des ausgewählten Zeitraums jederzeit klar sichtbar sind.
Zusätzlich gibt es noch die Möglichkeit bestimmte Zeiträume im Slider als wichtig zu markieren (gelb). Typische Use-Cases dafür wären zum Beispiel die Markierung von besonderen Zeiträumen oder die Anzeige von Suchtreffern.
Wer den TimeSlider in einem eigenen Projekt verwenden möchte kann sich die aktuelle Version einfach aus folgendem Git-Repository klonen:
https://github.com/majentsch/qx-timeslider

InGraph – The ultimate guide 3/5

Im dritten Teil unseres InGraph Guides, wollen wir uns mit Views beschäftigen:
InGraph ermöglicht es Ansichten von Graphen als Views zu speichern um sie immer wieder aufrufen zu können. Vorallem wenn sehr viele Plots gleichzeitig dargestellt werden sollen, können einem vorgefertigte Views sehr viel Aufwand ersparen. Am besten lässt sich das erstellen von Views anhand eines einfachen Beispiels erklären.
Unser Ziel:
Wir wollen eine Übersicht über die CPU-Auslastung und den Speicherverbrauch eines Hosts über den Zeitraum einer Woche.

Erstellen der neuen Ansicht

Zuerst öffnen wir eine neue Ansicht und wählen dazu den Host und den Service aus, den wir beobachten wollen:
 

Hinzufügen zusätzlicher Graphen

Um jetzt zusätzlich noch die CPU-Auslastung darzustellen, muss die erste Ansicht mit der Schaltfläche Clone this panel geklont werden. Im neuen Graphen werden nun die alten Plots entfernt und die neuen hinzugefügt. Zusätzlich ändern wir die Darstellung des neuen Plots so, dass der Raum unterhalb der CPU-Auslastung ausgefüllt wird.
(Tipp: Falls sich die dargestellten Zeiten bei beiden Graphen unterscheiden sollten, kann man diese mit der Funktion synchronisieren bequem anpassen. )

Ausblenden unwichtiger Parameter und Speichern

Um eine bessere Übersichtlichkeit zu erreichen kann man außerdem noch ungewollte Plots ausblenden. In unserem Beispiel wollen wir dass nur die prozentuale Belegung des Hauptspeichers dargestellt wird. Dies erreichen wir indem wir unter Settings den Haken bei Active entfernen.

Wenn die View nun zu unserer Zufriedenheit angepasst ist, können wir diese nun in der Toolbar unter Template und Save As View speichern. Jetzt kann man das View in der linken Seitenleiste, unter InGraph und Views jederzeit wieder aufrufen.