Perl statt PHP und Python

Wir hatten schon das Thema ja mit Python und auch mit PHP, zum Abschluss möchte ich noch die Möglichkeit mit Perl aufzeigen.
Darf ich wieder vorstellen: Mojolicious

A next generation web framework for the Perl programming language.

Die Installation erfolgt ganz einfach:

$ curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious

Mit dem Programmcode:

use Mojolicious::Lite;
get '/' => {text => 'Hello, World!'};
app->start;

Die Ausführung erfolgt dann mit:

$ morbo hello.pl

Wie auch bei den anderen Microframeworks, läuft alles recht schnell und einfach von der Hand.
Wer mehr Informationen zu Mojolicious braucht, der wird bei Perl-Magazin fündig 😉
An der Stelle, viel Spaß damit!

PHP statt Python

Vor nicht all zu langer Zeit wurde in dem Blog Post (Python statt PHP) das Python Flask Microframework kurz vorgestellt und um PHP jetzt nicht im Regen stehen zu lassen, habe ich mich kurz schlau gemacht und was vergleichbares fürs PHP gefunden.
Darf ich vorstellen: Slim, das PHP Microframework
Damit lässt sich recht schnell was einfaches bauen und ist auch recht einfach aufgesetzt, aber schaut selbst:
Install & Download

composer require slim/slim

Programmcode

get('/hello/:name', function ($name) {
    echo "Hello, $name";
});
$app->run();

Das wars auch schon und jetzt viel Spaß damit.

Icinga Web 2 – Barrierefreiheit im HTML

Nachdem der Kollege Johannes Meyer letztens über die Barrierefreiheit im Icinga Web 2 (Icinga Web 2 – Das kann Jeder) schon berichtet hat, so würde ich gerne ein paar Beispiele auf der HTML Ebene aufzeigen, was nun barrierefrei ist und was nicht.
Ein klassischer Fall sind die IMG Tags, viele bieten keine Text-Alternativen an, somit ist z.B. jemandem mit einer Sehbehinderung nicht klar, was da auf dem Bild drauf ist oder was es repräsentieren soll.
Falsch: <img src="xyz.jpg" />
Richtig: <img src="xyz.jpg" alt="Icinga Web 2 Logo" />
Perfekt: <img src="icinga_web2_logo.jpg" alt="Icinga Web 2 Logo" />
Und wenn wir auf das Thema Semantik angehen wollen, so ist z.B. allein durch die Schriftgröße nicht sichergestellt ob es sich um eine Überschrift handelt oder nicht.
Falsch: <span style="font-size: 150%;">Überschrift</span>
Richtig: <h1>Überschrift</h1>
Wie gesagt, das sind jetzt nur ein paar Beispiele und es gibt noch viele weitere Sachen wie man etwas macht und nicht macht um die Barrierefreiheit zu verbessern bzw. zu gewährleisten und genau um solche Sachen und viele weitere kümmern wir uns gerade.

Icinga Web 2 – Hello World Modul

Auf der diesjährigen OSMC haben wir es ja alle mitbekommen, dass Icinga Web 2 komplett modular aufgebaut ist, nun würde ich gerne etwas näher darauf eingehen, wie schnell man doch so ein Modul erstellen kann.
Also fangen wir doch mal mit so einem typischen Hello World Modul an, welches die bestehende Navigation erweitert und eine eigene Seite mit Inhalt bereitstellt.
Zunächst erstellen wir einen Ordner und benennen den nach dem Modulnamen:

$ mkdir helloworld

Voilà, schon haben wir unseren ersten genialen Modul erstellt, der zunächst gar nix kann und macht, aber es ist ein Modul. Ihr glaubt es mir nicht? Dann schiebt doch den soeben erstellten Ordner, pardon, ich meine Modul helloworld zu den bereits bestehenden Modulen von Icinga Web 2 und ruft danach die Module Übersicht (System -> Modules) im Web Interface auf!
modules
Tja, ich habs ja gesagt, schnell und einfach 😉
Jetzt wollen wir natürlich unseren Modul etwas näher beschreiben und auch eine Version verpassen, auch das geht ziemlich leicht von der Hand. Dazu erstellen wir in dem Modul Ordner eine module.info Datei und packen folgenden Inhalt rein:

Module: helloworld
Version: 0.0.1
Description: Hello World module
 This is a simple Hello World demo module.

Die Werte sind selbsterklärend, wie man sieht.
module-info
Als nächstes wollen wir dem Modul ein eigenes Navigations-Punkt verpassen, dazu legen wir eine configuration.php Datei an mit dem folgendem Inhalt:

menuSection('Hello World', array(
    'url' => 'helloworld'
));

Wenn wir jetzt den Modul helloworld enablen, erscheint nach einem Reload in der Navigation rechts ein weiteres Punkt “Hello World”.
module-nav
Die Url ./icingaweb/helloworld ist natürlich noch nicht erreichbar, um dies zu ändern müssen wir zunächst einen Controller erstellen der sich dafür verantwortlich fühlt 😉
Bevor wir aber einen Controller erstellen, müssen wir zunächst für die folgende Ordner Struktur sorgen:
module-folder-structure
Dies ist eine einfache Konvention, welcher man befolgen sollte, der Rest ist Magic.
Nun erstellen wir eine IndexController.php Datei unter ./helloworld/application/controllers mit folgendem Inhalt:


Was uns jetzt noch fehlt, ist die View für die indexAction vom IndexController, auch das ist ziemlich einfach, wir legen unter ./helloworld/application/views/scripts einen weiteren Ordner index (Name des Controllers) an und packen da eine index.phtml (Name der Action) rein.
Und damit wir jetzt überhaupt etwas zu sehen bekommen, packen wir den folgenden Inhalt in die index.phtml rein:

Hello World

Fertig! Jetzt noch den Navigations-Punkt "Hello World" im Web Interface ansteuern und sich über sein erstes Modul freuen 😉
module-final
Voilà, war doch ziemlich einfach, oder?
Natrülich war das noch nicht alles, es gibt noch sehr sehr sehr viel mehr zu erzählen über die Module und die netten Features die man so mit Icinga Web 2 bauen kann, aber darüber erzähle ich oder meine Kollegen ein anderes mal 🙂
Außerdem, für die, die es noch nicht kennen, würde ich empfehlen sich die Slides zu Icinga Web 2 kann mehr von dem Kollegen Thomas Gelf anzuschauen!
An der Stelle: Let's build and share modules!

PHP SPL: Queue

Wer mit PHP eine performante Warteschlange realisieren will, dem sei es mit einer SplQueue geholfen, die ebenfalls ab  der PHP Version 5.3.0 vorhanden ist.
Die Funktionsweise an sich ist relativ einfach, die SplQueue arbeitet nach dem FIFO Prinzip und implementiert die SplDoublyLinkedList über die bereits Matthias einen Beitrag verfasst hatte.
Die wichtigsten Methoden sind:

  • enqueue() – Element ans Ende der Warteschlange hinzufügen.
  • dequeue() – Das Erste Element aus der Warteschlange herausnehmen.

Folgendes Beispiel soll die Nutzung verdeutlichen:

enqueue('research');
$queue->enqueue('planning');
$queue->enqueue('development');
$queue->dequeue();
$queue->dequeue();
echo $queue->top() . PHP_EOL; // development

Und da wir bei einer SplQueue über den ArrayAccess-Interface verfügen, können wir die Elemente auch nach dem folgenden Schema hinzufügen.

dequeue();
$queue->dequeue();
echo $queue->top() . PHP_EOL; // development

Ein praktischer Einsatz von SplQueue wäre mit Sicherheit es in PHP Daemons zu verwenden, wo auf Performance und geringen Speicherverbrauch Wert gelegt wird.
Wer mehr Beispiele haben will oder herausfinden will wo die SplQueue alles verwendet wird, kann sich durchs GitHub durchstöbern.

JMeter für Lazy Tester – Proxy

jmeter-logoMittlerweile ist das Testen an jeder Ecke, man testet dies, man testet das, es gibt für jeden Einsatzzweck ein eigenes Tool und trotzdem machen alle das gleiche und zwar testen, testen und wieder testen. Manche Tools machen das Leben einfacher andere wiederum schwerer, sobald die Menge an Tests einen erschlägt und man nicht mehr den Code refactored sondern die Tests, vllt. wird es irgendwann soweit kommen, dass man Tests für die Tests anfängt zu schreiben 🙂
Na ja, wie auch immer, heute will ich euch den JMeter näher bringen, wie man mit seiner Hilfe, ganz einfache Tests für eine bestehende Webanwendung schreiben kann, ohne viel Aufwand dafür aufbringen zu müssen.
Zunächst besorgen wir uns JMeter Binaries, nachdem wir es entpackt haben, führen wir die ( jmeter.sh | jmeter.bat ) im Ordner /bin aus, in wenigen Sekunden sollten wir vor unseren Augen die GUI zu sehen bekommen:
Apache-JMeter-Testplan
Als Erstes, wechseln wir die Sprache von Deutsch auf Englisch unter Optionen > Wählen Sie eine Sprache > English, gleich danach mit einem geschickten Maus-Rechtsklick auf den Testplan > Add > Threads (Users) > Thread Group und belasen alles so wie es ist.
Nun folgt ein weiterer Maus-Rechtsklick, diesmal aber auf den WorkBench > Add > Non-Test Elements > HTTP(S) Test Script Recorder und jetzt ändern wir hier ein paar Sachen ab:

  • Global Settings > Port = 8090
  • Test plan content > Target Controller = Testplan > Thread Group
  • URL Patterns to Include > Add = .*

Wir sind fast soweit, wir brauchen jetzt nur noch einen View Results Tree – Listener, also wieder Maus-Rechtsklick auf den Testplan > Add > Listener > View Results Tree.
Das Ganze sieht am Ende dann so aus:
Apache-JMeter-2
Als letzten Schritt müssen wir jetzt nur noch den Proxy im Browser eintragen als Host: localhost und Port: 8090 und die Tests-Aufzeichnung kann beginnen, sobald wir auf den Start Button klicken beim HTTP(S) Test Script Recorder.
Was wollen wir aber testen? Nun, ich habe mich für Icinga Web 2 entschieden, wegen den vielen Requests die im Hintergrund so passieren und folgendes kleines Szenario überlegt:

  • aufrufen der Startseite
  • anmelden
  • nach test-flap-10 suchen
  • test-flap-10 Host aufrufen
  • System Configuration aufrufen
  • History Notifications aufrufen
  • Dashboard Landingpage aufrufen
  • abmelden

Jetzt drücken wir auf den Start Button und rufen im Browser http://localhost:8080/icingaweb auf und gehen das Szenario durch und wenn wir fertig sind, können wir die Test-Aufzeichnung im JMeter über den Stop Button beenden.
Das wars auch schon, die Thread Group wurde mit allen Requests gefüllt die so alles entstanden sind während der Test-Aufzeichnung und können nun auch von JMeter abgespielt werden.
Apache-JMeter-3
Die Requests Ergebnisse können nach dem Abspielen im View Results Tree ausgewertet werden.
Apache-JMeter-4
Sollte kein Request fehlgeschlagen haben, so können wir davon ausgehen, dass die Kommunikation zwischen dem Front- und Backend funktioniert.
Im Großen und Ganzen wie man sieht, lässt sich mit JMeter sehr schnell und einfach ein Test aufzeichnen, abspielen und auswerten und jetz kommt das ABER …
… dafür gibt’s weiter unten die Kommentare 😉
P.S. Humor …