PHP SPL: Heaps

Viele Daten im Nachhinein zu sortieren kostet Zeit. Seit PHP Version 5.3 gibt es in der SPL die Heap Klassen welche eine Sortierung on-the-fly erlauben. PHP stellt eine generische Heap Klasse bereit (hier im unteren Beispiel) um eigenen Datentypen zu vergleichen. Es gibt aber auch eigene Klassen für Min- und Max-Heaps.
Heap Strukturen eignen sich im Allgemeinen erst bei einer größeren Menge an Daten. So ist ein Max-Heap mit 1.000.000 Einträgen fast um ein drittel schneller als ein konventionelles Array welches anschließend eine absteigende Sortierung erfährt.

class TimestampMaxHeap extends SplHeap
{
    public function compare($array1, $array2)
    {
        if ($array1[0] === $array2[0]) {
            return 0;
        }
        return $array1[0] < $array2[0] ? -1 : 1;
    }
}
$heap = new TimestampMaxHeap();
$heap->insert(array(new DateTime('2014-01-04'), 4));
$heap->insert(array(new DateTime('2014-01-01'), 1));
$heap->insert(array(new DateTime('2014-01-06'), 6));
$heap->insert(array(new DateTime('2014-01-03'), 3));
$heap->insert(array(new DateTime('2014-01-05'), 5));
$heap->insert(array(new DateTime('2014-01-02'), 2));
foreach ($heap as $entry) {
    echo $entry[1] . ' ';
}
echo PHP_EOL;
Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Crossing streams

chromecastStreaming Clients sind im Moment ein gehyptes Thema. Jeder Namhafte Elektronik- oder Contentriese drück mit einer kleinen Box auf den Markt, die das Hör- und Sehvergnügen von uns Konsumenten ins unermessliche steigern soll. Ich reihe mich in die Riege der Poster ein, die fragen: Was gibts, was kommt und was bringts wirklich.
Kurz zu mir. Ich nutze gerne Angebote wie z.B. Maxdome oder Watchever. Leihe mir hier und da einen Film aus und hab keine Lust mir mit Festplatten den Keller zu füllen. Bei mir überwiegt die Musik, weshalb der eine oder andere Musik-Streaming-Dienst dauerhaft am Abend dudelt. appletv_smallsize
Starten wir mit dem Chromecast von Google. Jeder hat bestimmt schon irgendwo gelesen, dass hier ein clevere Konstruktion am werkeln ist. Goggle verbaut seine Streaming-Lösung in einem Dongle Design mit HDMI Anschluss welcher direkt in das Endgerät gesteckt wird. Versorgt man den Dongle mit externer Spannung kann man durch CEC seinen Fernseher ein- und ausschalten. Damit das Streaming funktioniert muss es die Applikation unterstützen und hier liegt im Moment der Knackpunkt: Es gibt zu wenig Apps die das können. Spotify verweigert im Moment noch die Umsetzung mit Ihrer Android Applikation. Einen Ausweg könnte die Browser Extension für Chrome schaffen. Diese kann Browser Tabs einfach auf den Fernseher spiegeln. Allerdings ist die Latenz so hoch, dass zappen durch Musik nicht wirklich spaß macht.
Der alte Hase mit seinem Apple TV liegt mittlerweile in der dritten Generation vor. Dank größerer CPU funktioniert er schnell und gut. Vor allem die Möglichkeit den Screen komplett zu streamen (Nur Mac devices oder Android AllCast) macht das Gerät besonders flexibel. Will man aber mehr als Stereo über seinen Mac streamen ist dann aber auch schon Schluss. Die vorinstallierten Apps leiten aber Dolby Digital einwandfrei durch. Ist die App seiner Wahl vorhanden, erhält man aber eine robuste und eigenständige Streaminglösung. Gerüchten zur Folge kommen bald Apps von Drittherstellern über den AppStore auf den Markt. Dann wird es nochmal eine Schippe interessanter.
Ziemlich neu kommt der Roku Stick (zumindest als Thema in Deutschland) daher. Aktuell gibt es ihn hier zulande noch nicht. Er wartet allerdings mit einem großen Angebot an roku_streaming_stick_3500RApps (Channels) auf, welche stark auf den englischen und amerikanischen Markt ausgerichtet sind. Viele sind in Deutschland nicht nutzbar, z.B netflix. Er kommt wie der Apple TV mit eigener Fernbedienung daher und verbraucht daher nicht ein eigenes Personal Device als Fernbedienung.
Für mich persönlich hat Apple das reifere Konzept und die beste Audio Qualität. Aber auch das teuerste von allen. Im Moment muss man genau überlegen für was man die Streaming-Lösung benötigt – Und das ist auch genau das Manko: Proprietät und Intransparenz. Kein Hersteller liefert vollständige Freiheit. Dienste sind beschränkt oder lokales Streaming erst gar nicht möglich. Auch bei der Qualität von Video- und Tonformaten muss man darauf achten das die eigenen Ansprüche erfüllt werden – Informationen sind spärlich zu finden und die Hersteller hüllen sich allzu gerne in Schweigen. Streaming-Dienst und Streaming-Hardware sind jung. Einige Hersteller drängen in Zukunft noch auf den Markt und da wird es wohl noch etwas rumpeln.
Wer unentschlossen ist, spart sich den Konsumstress und geht nach draußen, eine Runde wandern! Holadio.
(Bildnachweis: Herstellerseiten)

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Frisch zur CeBIT: Vorschau auf Icinga Web 2

Bald ist es soweit und Icinga kann sein brandneues Webinterface veröffentlichen. Zur CeBIT wurden hier viel Blut, Schweiß und Tränen hinterlassen um einen gewaltigen Schritt nach vorne zu unternehmen. Eine Demo kann man sich bei uns am Stand ansehen. Allerdings möchte ich euch ein Bilder dennoch nicht vorenthalten:

Um selbst in den Genuss zu kommen benötigt man lediglich Git und Vagrant und kann sich seine eigenen virtuelle Demo Maschine selbst bereitstellen:

$ git clone git://git.icinga.org/icingaweb2.git
$ cd icingaweb2/
mhein@ws-mhein02~/Temp/icingaweb2 [git:master]
$ vagrant up

Die Maschine installiert sich selbst weshalb man ein wenig Zeit mitbringen sollte. Danach ist das Webinterface unter folgender URL erreichbar: http://localhost:8080/icingaweb (Login: jdoe/password)
Natürlich zeigen wir das euch gerne auf unserem NETWAYS Stand (Halle 6 Stand E16 (319)).

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Brainstorming, aber bitte alleine!

Alex Osborn, ein Werbefachmann aus den USA veröffentlichte in den 50er Jahren folgende Idee: Brainstorming in der Gruppe führt zu geistigen Höchstleistungen. Osborn nahm an, dass Menschen in einer Gruppe mehr, und vor allem bessere Ideen hervorbringen. Dafür legte er bestimmte Regeln fest. Eine davon: Übe keine Kritik [1].
Diese Praktik der Ideenfindung wurde mittlerweile in einigen Studien überprüft, mit einem Interessanten Ergebnis: Keine der Studien konnte einen positiven Beleg dafür erbringen. Eher das Gegenteil war der Fall. In einer Gruppe von 2 Personen herrscht ungefähr Gleichstand zwischen Einzel- und Gruppenarbeit. Je größer die Gruppe ausfällt, umso verheerender fällt der Unterschied aus. Osborn ging damals von einer idealen Gruppengröße von 12 Personen aus. Das Ergebnis für ein Brainstorming dürfte katastrophal ausfallen.
Das eigentliche Problem: Die Gruppenmitglieder stehen sich selbst im Weg. Ideen entwickeln und gleichzeitig Zuhören ist eine Doppelaufgabe, die das Gehirn schwer bewerkstelligen kann. Dies konnte mit verschiedenen Experimenten nachgewiesen werden [2].
In einem Experiment wurden die Teilnehmer zur Ideenfindung aufgerufen:

  • Teil 1: Jeder durfte nur sprechen, wenn kein anderer sprach
  • Teil 2: Jeder durfte einfach drauf lossprechen

Die Gespräche wurden durch ein Mikrophon aufgezeichnet. Das Ergebnis: Im zweiten Teil war die Produktivität genau so hoch wie bei der Einzelarbeit, während der 1. Teil in der Produktivität deutlich schlechter abschnitt.
Im Alltag und in der Wirtschaft hält sich allerdings hartnäckig die Illusion, dass klassisches Brainstorming die beste Methode sei, um Ideen zu entwickeln. Schuld daran ist vermutlich der individuelle Vergleich: Natürlich produziert eine Gruppe mit 5 Teilnehmern mehr als ein einzelnes Individuum (subjektiv gesehen). Aber: Produziert eine Gruppe mit 5 Personen wirklich mehr Ideen als 5 Individuen in Einzelarbeit?
Abhilfe schaft hier z.B. die verstaubte Metaplan-Methode [3]. Jeder Teilnehmer schreibt seine Ideen auf eine Karte und hängt diese an die Wand. So findet ohne Blockade eine gegenseitige Befruchtung statt. Anschließend können die Ideen gemeinsam besprochen und geordnet werden.

[1] http://de.wikipedia.org/wiki/Brainstorming
[2] Prof. Dr. Michael Diehl, Universität Mannheim
[3] http://de.wikipedia.org/wiki/Pinwandmoderation

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Security Token für Jedermann: Der YubiKey

black_singleWie schützt man seine Daten am besten? Mit starken Passwörtern und genügend Entropie!
http://xkcd.com/936/
Besseren Schutz bieten zusätzliche Sicherheitsmerkmale wie 2-Faktor-Authentifizierung. Immer mehr Dienste bieten die Möglichkeit, sich mit einem zusätzlichen Einmalpasswort anzumelden. Dieses wird entweder auf einem anderen Medium dem Benutzer zugänglich gemacht (SMS, Abruf) oder wird von einem Token generiert. Tokens sind besonders spannend, da man jederzeit die Kontrolle darüber besitzt und unabhängig von Übertragungsproblemen ist (z.B. wenn man sich im Ausland aufhält). Nachteil: Teuer (z.B. SecurID) oder für Privatanwender zu aufwendig.
Mittlerweile bietet die Firma Yubico einen Token für $25 an. Günstig und viel Ausstattung. Die kleine Kunststoffplatte mit USB Kontakten ist wasserdicht und relativ unverwüstlich. Das Gerät wird vom System als Tastatur wahrgenommen und verschickt auf Knopfdruck verschiedene Strings, die zur Authentifizierung herangezogen werden können.
Der YubiKey kann selbst programmiert werden und unterstützt folgende Modi:

  • OTP (OTP YubiCloud oder OATH-HOTP)
  • Statisches Passwort mit 32 Zeichen
  • Challenge-Response

Diese Modi können in zwei Slots auf den Token programmiert werden. Die Slots werden durch den Druckknopf angesprochen: Weniger als 1,5 Sekunden für Slot eins und ungefähr 3 Sekunden für den zweiten.
Tools zum programmieren des Tokens gibt es für alle Systeme, jeweils in GUI oder CLI. Die GUI Version bietet praktischerweise auch den Upload des eigenen Keys in die YubiCloud an, was die Einrichtung deutlich vereinfacht.
Das OTP Modul für die YubiCloud erwartet auf der Gegenseite einen AES Key, welcher das eigentliche OTP Passwort entschlüsselt und dann auch validiert. Die ersten 6 Bytes des gesendeten Strings sind dabei der Public Identifier des Tokens. Anhand diesen Keys, kann der Schlüssel auf der Gegenseite identifiziert werden, um das eigentliche OTP zu entschlüsseln.
Alles weitere befindet sich in der ausführlichen Dokumentation von Yubico. Hier ist auch der Background und die Funktionsweise der Validierung und Provisioning von YubiKeys beschrieben.
Schön ist zu erwähnen, dass die Unterstützung des YubiKey stetig steigt: LastPass, Google, PAM, Radius, Windows Login, PayPal, KeePass et cetera.
Bleibt zu hoffen, dass es noch dauert bis jemand die erste Sicherheitslücke findet 😉

Bild Rechte v.l.n.r: CC-BY Marius Hein, (c) 2013 Yubico

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Aus 4 mach 2 – Spaces

Heute schließe ich mich meinem Kollegen Eric Lippmann mit seinen Sed Tricks an. Heute heißt es: “Aus 4 mach 2”. Der Wechsel von Spaces in Einrückungen funktioniert nicht überall reibungslos. Entweder ist die Änderung mit Codestyle verbunden (tools) oder ich brauche spezielle, oberflächen-behaftete Software (vi o.ä.).
Mit Sed ist dies mit einem Einzeiler möglich – Und damit integrierbar in alle meine find und git hacks ;-):

sed -i .BAK 'h;s/[^ ].*//;s/    /  /g;G;s/\n *//' /path/to/file

Mit der Operation -i wird die Datei gleich geändert und das Original also file.BAK abgespeichert.
 

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

GIT – aus eins mach viele

Software Projekte starten meist mit einem SCM Repository. Nach einem gewissen historisch bedingten Wachstum hat man dann auf einmal eine Sammlung unabhängiger Komponenten. Diese gehören aber in eigene Repositories. Gerade wenn unterschiedliche Versionen in der Produktion zum Einsatz kommen sollte man tunlichst darauf achten. Sonst wird es schwer unabhängig voneinander zu entwickeln ohne Kompatibilität zu brechen.
Leider hat man es zu spät gemerkt. Was tun um die Historie nicht zu verlieren? In den dunklen Ecken von GIT findet sich git-filter-branch. Ein mächtiges Tool wenn es darum geht am kompletten Baum etwas zu verändern. Aber beginnen wir von vorne:
1. Repository auschecken:

$ git checkout git@git.foo.bar:repository.git && cd repository

2. Entfernen aller anderen Verzeichnisse bis auf das gewollte

$ git filter-branch --prune-empty --subdirectory-filter path/to/component -- --all

Mit dem obigen befehl wird alles entfernt was nicht im Verzeichnis ‘path/to/component’ vorkommt. Normalerweise werden hierbei leere commits erzeugt welche nichts mit dem Filter zu tun haben. Um dies zu vermeiden gibt es die Option ‘–prune-empty’.
3. Anlegen eines neuen Repositories und setzen eines neuen Ziels

$ git remote add target git@git.foo.bar:component.git

4. Explizites pushen des master branch in das neue Ziel

$ git push target master

Neues Repository wird mit der gefilterten Historie gefüllt. Allerdings ist der alte Code noch im ehemaligen Repository vorhanden
5. Neu auschecken und redundanten Code entfernen
Lokale Kopie von der Platte entfernen (Schritt 1) und mit folgendem GIT Befehl weiterarbeiten

$ git filter-branch --tree-filter ' rm -rf path/to/component' HEAD

6. Repository pushen und aufräumen
Wir haben die Timeline geändert und unsere Änderungen passen sich nicht mehr in die Historie ein:

$ git push -f

Mit der Option -f wird alles Remote überschrieben, egal ob es passt oder nicht. Man tun gut daran kurz inne zu halten und den Branch zu überprüfen.
Danach können wir die alten Reflogs löschen um Speicherplatz frei zu geben:

$ git reflog expire --expire=now --all && git gc --aggressive --prune=now

Pa-Tsching – fertig!
Natürlich ist das nicht die ganze Wahrheit und passt auf einfach Anwendungsfälle. Mit unterschiedlichen Release Tags und verzweigten Branches wird das extrahieren etwas aufwendiger. Allerdings ist dies dann keine Standardfall mehr und genau auf das Projekt zugeschnitten (Namensschemata usw.).
Detail Informationen finden sich auf der Manpage von GIT.

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Aussenseiter Linux

HibiscusLeider ist es immer noch so, dass es bei spezialisierter Software Linux der klare Aussenseiter ist. Viele Lücken gibt es hier bei Business relevanter Software, z.B. Projektplanung, Zeiterfassung oder Musikproduktion. Das heißt jetzt nicht dass es überhaupt gar keine Software gibt. Meistens machen es die Schnittstellenaus, welche die Interoperabilität zwischen den globalisierten Betriebssystem Giganten einschränken oder schier unmöglich machen. Gezwungenermaßen steigt man dann für einen bestimmten Anwendungsfall auf ein anderes Betriebssystem um. Klassische Vertreter dieser Art sind Steuerprogramme oder Banking Software. Wobei durchaus davon auszugehen ist, dass der gemeine Linuxuser hin und wieder seine Steuern zahlt oder eine Überweisung tätigt.
Für eine Überweisung bin ich neulich auf Hibiscus gestoßen – eine ordentliche Banking Software mit HBCI Unterstützung für die üblichen Geschäftsvorfälle. Unterstützung gibt es hier bis HBCI/FinTS Version 3 mit Chipkarte, Schlüsseldiskette und Pin/Tan (optisch und SMS). Das Interface ist aufgeräumt und bietet einiges an Auswertung und Kategorisierung für seine Transaktionen an. So kann man besonders schön am Monatsende sehen wo das Geld eigentlich versiegt und eventuelle Gegenmaßnahmen einleiten.
Kurz und knapp:

  • Java basierend (HBCI4Java basierend)
  • GPLv2
  • Linux, MacOS, Windows
  • Quellcode bei GitHub
  • Bulk Abruf
  • Sammel-Überweisungen / -Lastschriften
  • Export und Import von Daten
  • Reporting
  • Jameica Architektur: Basierend auf Plugins / Headless Betrieb als Server

Die Basisfunktionalitäten kann man natürlich auch im Webinterface der Bank erledigen, wer allerdings die Umsätze über einen längeren Zeitraum aufheben möchte oder eine ordentlich Volltextsuche in Transaktionen/Gegenkonten, kommt um einen ordentlichen Fat Client nicht drum rum.
Ordentliches Teil, übersichtlich und tut genau das, was man braucht. Vielen Dank dafür!

(Bildquelle: http://www.willuhn.de)

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Help wanted!

Du bist Software Entwickler und suchst einen neuen Job? Nun, dann sind wir vielleicht dein neuer Arbeitgeber. 
8675052048_953d96a84f_z
Denn im Moment suchen wir wieder Verstärkung in unserem Team. Als Dienstleister im Monitoring und Systems Management Umfeld unterstützen wir Kunden bei der Einführung von Open Source Lösungen und pflegen natürlich auch unser eigenes Portfolio.
Wenn also Mongo, Mustard, Scrum und Zend keine böhmischen Dörfer für dich sind, dann bewirb dich bei uns. Wir bieten ein freundliches und eigenverantwortliches Arbeitsumfeld unter Linux mit modernen Web- und Datentechnologien.
Ein ausführliches Profil mit allen Anforderungen findest du auf unserer Webseite.

(Bild: http://www.flickr.com/photos/hackny/)

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Klein und gut – Komodo Edit

Ungefähr alle zwei Monate begebe ich mich auf die Suche nach einem neuen Texteditor. Zu schwerfällig sind manche IDEs – starten dauert lange oder man kann einzelne Dateien gar nicht erst editieren wenn man sich nicht in einem Projektkontext befindet. Meistens ist die Suche dann aber schnell beendet. Entweder reicht mir das Featureset nicht aus oder er ist schon wieder mit zu viel Firlefanz überladen. Nicht so mit Komodo Edit, einem freien Editor der Firma ActiveState (Die mit dem Perl unter Windows), welcher frei erhältlich ist.
Komodo Edit ist eine abgespeckte Version der Komodo IDE, beinhaltet aber alles wichtige für den ambitionierten Schreiberling. Ein kleiner Abriss, was mitgefällt:

  • Guter Editor, Syntax Highlighting, Code Folding, Call Tips, Code Completion, Matching Braces
  • Projekt Support – oder eben auch nicht
  • Unterstützt automatisch die wichtigsten Script Sprachen auch ohne Datenerweiterung
  • FastOpen: Öffnen von Dateien anhand von Namensfragmenten
  • Gutes Design und ergonomische Darstellung von Text und Elementen

Das System basiert auf dem von Mozilla entwickelten XML Userinterface (XUL) und startet erträglich schnell. Dank dem mitgelieferten Installer integriert er sich nahtlos in die bekanntesten Linuxdistros und ersetzt für mich die systeminternen Texteditoren, z.B. gedit. Perfekt finde ich ihn für Perl. Die meisten IDEs kommen mit dem Code und der redundanten Schreibweise eh nicht sonderlich gut zurecht. Der kleine Drache ist nicht perfekt, erkennt aber zuverlässig die wichtigsten Dinge um nicht auf Nase zu fallen. Ansonsten funktioniert er auf jeder erdenklichen Plattform von Windows bis Linux und natürlich auch für alle anderen Randgruppen!
Genug der Ode. Mein Fazit: Einfach mal testen!

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.