Produkt oder Code?

Von Karim Geiger — unter Development am 04.12.2016

Es gibt zwei Entwickler-Typen. Die, die versuchen ihren Programmcode möglichst strukturiert und sauber aufzubauen und die, die möglichst schnell versuchen ein Produkt zu veröffentlichen. Man könnte sie also durch die folgende Frage definieren:

Ist dir das Produkt wichtiger, oder der Code?

Wem das Produkt wichtiger ist, der sieht das Programmieren selbst nur als Mittel zum Zweck. Der Entwickler kümmert sich nicht um Objektorientierung, Designpatterns, Testing und Ähnliches. Der Entwickler schreibt einfach seinen Code Zeile für Zeile herunter, packt ein paar Funktionen darum und nennt es dann Functional Programming. Am Ende kommt ein Produkt heraus, das mehr oder weniger gut funktioniert, dafür aber sehr viele Features bietet und vor allem in kürzester Zeit entstanden ist. Der Vorteil ist klar: Quantität.

Wer Wert auf guten Code legt, denkt bei jeder Zeile, die er schreibt, meist zweimal nach. Er formatiert um und strukturiert das Programm so, dass es auch in Zukunft einfach erweitert und gewartet werden kann. Er schreibt Tests und sorgt dafür, dass alle Features so funktionieren, wie sie sollen. Aber all das kostet Zeit, was zur Folge hat, dass das Produkt am Ende länger braucht und mit weniger Features auskommt. Für diesen Typ zählt also Qualität.

Was bist du?

Stell dir bitte einmal die Frage, in welche Kategorie du dich einordnen würdest. Ich selbst habe in meiner Entwicklerkarriere beide Typen durchlebt. Angefangen habe ich – wie so viele – mit einfachen PHP-Scripts. Ich hatte keine Ahnung was Objekte sind, ich wusste nicht einmal wirklich wie Funktionen funktionieren und habe mir so das Skripten mit PHP beigebracht. Meine ersten Projekte sind entstanden. Von Sicherheit, OOP, TDD, usw. hatte ich keine Ahnung, aber meine Produkte hatten viele Features und mit den Problemen bin ich irgendwie klargekommen.

Diese Produkte sind übrigens die erfolgreichsten Produkte gewesen.

Dank Ausbildung und Selbstlernen ist mir mittlerweile der Code wichtiger. Das soll nicht heißen, dass mir das Produkt egal geworden ist. Im Gegenteil. Man könnte sagen das Produkt ist mir so wichtig, dass mir auch die Basis – der Programmcode – wichtig ist. Deswegen möchte ich kein Produkt anbieten, welches nicht auch eine solide Basis hat.

Das Problem

Hier bin ich also. Ich schreibe “schönen” Code, welcher sich testen, erweitern, modularisieren und anpassen lässt. Code, der solide, sicher und simpel ist. Natürlich ist mein Code noch lange nicht perfekt – wenn das überhaupt möglich ist – und ich habe noch viel zu lernen, aber ich bin nicht mehr das typische “Scriptkiddie”, das den Code für das fertige Produkt “hinrotzt”. Trotzdem sehe ich immer wieder, dass genau dieser Typ Entwickler am meisten Erfolg hat. So gut wie jedes Produkt, dessen Quellcode ich gesehen habe, ist genau aus dieser Grütze entstanden. Warum? Genau aus den oben genannten Gründen. Dem Endandwender ist es egal, ob dein Code getestet, sicher oder flexibel ist. Dem Endanwender ist es auch egal, ob der Code aus einer einzigen index.php-Datei mit 100.000 Zeilen Spaghetticode besteht. Den Endanwender interessiert das Produkt und dessen Features. Und diese kosten nunmal wenn sie “richtig” gemacht werden wesentlich mehr Entwicklungszeit. Zeit, die wir in der heutigen Welt nicht haben.

Dass solche Produkte nicht wirklich skalieren, ist zu Anfang egal. Wichtig ist der Beginn des Produkts. Wenn es einmal etabliert ist und das Geld für die richtige Weiterentwicklung da wäre, ist es meist schon so verworren und eingefahren, dass das Ablösen nicht mehr wirklich möglich ist. Was bleibt ist ein Wirrwarr aus abertausend Zeilen Code, welcher sofort anfängt zu bröckeln, wenn auch nur eine Kleinigkeit verändert wird. Aber das ist nicht so wichtig. Scriptkiddies sind günstig. Sie machen das Problem zwar nicht besser, aber es funktioniert.

Bis zu einem gewissen Punkt…

Irgendwann ist das ganze System dann aber so verworren, dass sich der Spaghetticode bemerkbar macht. Plötzlich werden die einfachsten Dinge zum Riesenproblem. Microsoft spürt das zum Beispiel aktuell sehr gut. Es geht bergab, weil man einfach nicht mehr so flexibel ist wie die Konkurrenz. Bill Gates dürfte das mittlerweile aber relativ egal sein.

Fazit

Ja, was ist das Fazit? Ist das Fazit, dass man als Entwickler keinen Wert auf guten Code legen sollte, wenn man Erfolg haben möchte? Ist das Fazit, dass sich etwas grundlegendes an der Art wie wir Software entwickeln ändern muss? Ich weiß es nicht. Ich wüsste es gerne. Aber vielleicht habe ich ja den ein oder anderen zum Denken angeregt. Wenn du ein gutes Fazit oder eine Meinung hast, dann lass es mich wissen.

Amazon Echo (Dot) – Der erste Eindruck

Von Karim Geiger — unter Amazon, Test am 05.11.2016

Cover

Ich persönlich habe mich sehr lange auf Amazon Echo gefreut. Seit dem Release in den USA in 2014 warte ich gespannt auf einen Release in Deutschland, und mittlerweile ist es endlich soweit.

Wer Amazon Echo nicht kennt, kann sich darunter ein kleines, rundes Gerät vorstellen, welches irgendwo im Raum platziert wird, und dank der 7 Mikrofone immer mithört. Wird dann das Aktivierungswort “Alexa” gesagt, wird das Folgende an den Amazon Cloud Service gesendet und interpretiert. Anschließend fungiert das Gerät ähnlich wie Siri oder Google Now. Sprich: Ein virtueller Assistent, der Fragen beantworten und Aktionen durchführen kann. Der Vorteil: Das Gerät hört einen überall im Raum und muss nicht extra per Knopfdruck aktiviert werden.

Der erste Eindruck des Amazon Echo war direkt negativ. Bisher ist das Gerät nämlich nur per Einladung erhältlich. Nur wenige haben einen Tag nach offiziellem Release eine Einladung erhalten. Vorwiegend Leute mit Dialekt. Alle anderen dürfen laut Amazon sogar mehrere Monate warten, bis sie dann endlich ein Gerät bestellen können. Warum Amazon dies erst jetzt – eine Woche nach Veröffentlichung – kommuniziert und nicht sofort von Beginn an klar macht, ist für mich unverständlich. Auch verstehe ich nicht, warum überhaupt ein Veröffentlichungstermin angegeben wurde, wenn nur ein paar Wenige tatsächlich auch eine Einladung erhalten.

Aber, wer viel meckert, bekommt meist, was er will. Nach ein paar Telefonaten mit dem Kundenservice und einer Email habe ich dann letzten Endes auch eine Einladung bekommen, und ein paar (viele) Tage später (danke an die absolut unfähige DHL und deren grausamen Support) war das Gerät endlich in meinem Besitz. Ich muss dazu sagen, ich habe mich für die Echo Dot-Variante entschieden. Der Dot ist das kleinere Gerät von beiden und kommt mit keinem so guten Lautsprecher wie Alexa, dafür aber mit AUX-Ausgang.

Das Einrichten des Amazon Echo Dot ging schnell und problemlos. Das Smartphone mit dem WLAN des Dots verbinden, die Alexa-App starten und das Update einspielen. “Hallo.”

Nun, was kann das Gerät jetzt eigentlich?

“Alexa, wie wird das Wetter heute?” – Klappt.

“Alexa, schalte das Licht im Wohnzimmer an.” – Klappt.

“Alexa, schalte alle Lichter aus.”  – “Sorry, ich konnte kein Licht mit dem Namen “alle Lichter” in dem Profil von Karim finden.”

“Alexa, was ist Amazon Echo?” – “Amazon Echo ist…”

“Alexa, kannst du das wiederholen?” – “Amazon Echo ist…”

Okay, das sieht schon sehr gut aus.

“Alexa, welche Star Wars-Filme gibt es?” – “Das weiß ich leider nicht.”

“Alexa, setze Milch auf meine Einkaufsliste.” – Klappt.

“Alexa, starte das 1Live Radio.” – Klappt.

“Alexa, stopp!” – ….. – “ALEXA, STOPP!” – ….. – “Alexa!” – “?” – “Stopp!” – Klappt.

Nicht ganz perfekt, und nicht wie im Video. Zwar klappt die Erkennung der Sprache und des Gesprochenen in der Regel sehr gut, doch manchmal wird man komplett überhört. Besonders, wenn Alexa selbst Musik abspielt, scheint sie sich sehr zu verwirren. Das Steuern klappt dann nur, wenn man “Alexa!” schreit, wartet, bis sie die Musik leiser macht und zuhört, und dann den Befehl spricht.

Auch schön ist, dass Alexa einen wirklich sehr gut versteht. Auch Fremdwörter und englische Begriffe sind meistens kein Problem. Leider mangelt es noch an Funktionen. Dinge wie “Schalte alle Lichter aus” werden zwar korrekt interpretiert, können aber nicht ausgeführt werden. Alexa antwortet nur, dass sie kein Gerät mit dem Namen “Alle Lichter” kennt. Das lässt sich zwar umgehen, indem man eine Gruppe mit dem Namen “Lichter” anlegt und dort alle Lichter hinzufügt, ist aber ärgerlich. Genauso ist auch das Wissen über allgemeine Dinge sehr mau.  Ein Beispiel:

Aber gut, Alexa ist ja auch noch sehr jung und noch nicht öffentlich erhältlich. Von daher ist davon auszugehen, dass in den kommenden Monaten noch einiges hinzukommen wird. Glücklicherweise bin ich ja professioneller Entwickler und habe somit die Möglichkeit, das Gerät selbst zu programmieren. Und das geht auch relativ simpel, mittels Skills. Zwar sind momentan nur etwa 15 Skills im offiziellen Amazon Skill Store vorhanden, aber das Entwickeln eigener Skills ist wirklich einfach.

Nachdem man unter developer.amazon.com einen neuen Skill angelegt hat, kann man einen Aufrufnamen vergeben. Zum Beispiel “Fernseher”. Und dann kann man “Utterances”, also Ausdrücke definieren. Zum Beispiel: “dass er die Laustärke auf {volume} Prozent stellen soll”. Diesen kann man dann einzelne Aktionen, oder auch Intents zuweisen. Ein fertiger Aufruf wäre dann, “Alexa, sage dem Fernseher, dass er die Lauststärke auf 50 Prozent stellen soll”. Der erste Teil, also das “sage dem Fernseher” ist der Aufruf des Skills. Alles Weitere wird dann an die Skill Utterances übergeben. Diese werden übersetzt und am Ende kommt etwas raus wie “VolumeIntent: volume => 50”, was anschließend an eine URL meiner Wahl geschickt wird.

So konnte ich meinen Fernseher mit meinem eigenen SmartHome verbinden und dafür sorgen, dass ich über Alexa alles steuern kann. Auch für das Problem mit dem im Video erwähnten zweiten Weltkrieg habe ich eine Lösung gefunden: Einen Wolfram Alpha-Skill. Den gab es zwar noch nicht, aber… ihr wisst schon.

Der Grund dass die Antwort so lange braucht ist übrigens, dass die Anfrage erst einmal mittels Yandex ins Englische übersetzt wird, da Wolfram Alpha nur Englisch versteht. Dann wird sie an Wolfram Alpha geschickt und anschließend wieder zurückübersetzt. Aber naja, es funktioniert!

Mein vorläufiges Fazit zu Amazon Echo (Dot) ist daher:

Pro:

  • Die Spracherkennung ist sehr gut.
  • Sie hört einen auch aus der Entfernung.
  • Die Stimme ist angenehm und betont meist korrekt.
  • Skills lassen sich einfach entwickeln.
  • Die Antworten kommen in der Regel sehr schnell.
  • Verfügbare Features funktionieren in der Regel gut.
  • Das Abspielen von Musik mittels Spotify ist intuitiv.
  • Das tägliche News-Update ist sehr sinnvoll.

Kontra:

  • Skills lassen sich nicht kaufen. Ergo will auch keine Firma einen Skill entwickeln.
  • Alexa weiß nicht viel. Auch einfache Fragen sind schon zu komplex.
  • Wenn sie selbst Musik abspielt, versteht sie einen sehr schlecht.
  • Manchmal muss man Dinge anders formulieren.
  • Manchmal bricht Alexa einfach ab, oder versteht nur die Hälfte.
  • Keine Push-Benachrichtigungen, nur Timer und Wecker. Also auch keine Erinnerungen und co.
  • Ich würde Alexa gerne als Freisprechanlage für das Smartphone verwenden, geht aber nicht.
  • Wenn Alexa Englisch spricht, klingt sie wie Politiker.

 

Bildquelle: Consumer Reports

Regular Expressions: Alternative Syntax und Builder

Von Karim Geiger — unter Development am 21.08.2016

Regular Expressions – oder zu Deutsch Reguläre Ausdrücke – sind gerade in der Softwareentwicklung ein mächtiges Hilfsmittel, wenn es um Filtern, Validieren, Suchen und Ersetzen geht. Leider sind sie eines ganz bestimmt nicht: Einfach zu lesen und zu schreiben.

Eine simple Regular Expression zum Validieren einer E-Mail-Adresse könnte zum Beispiel so aussehen:

/^([A-Z0-9._%+-])+@[A-Z0-9.-]+\.[A-Z]{2,}$/i

Wer noch nie versucht hat, Regular Expressions zu verstehen, oder diese schlichtweg nicht kennt, schaltet nach einer solchen Zeile definitiv auf Durchzug. Sie ist kryptisch, unverständlich, hässlich und durcheinander. Nur, wer sich gut mit der Materie auskennt und genau weiß, wofür die einzelnen Zeichen stehen, kann – sofern er sich konzentriert in die Sache hineindenkt – verstehen, worum es geht.

Aber warum so kompliziert? Es gibt in der heutigen Zeit viele einfachere Wege, einen regulären Ausdruck zu definieren. Letztendlich lässt sich ein solches Statement ja doch recht einfach in Worte fassen:

Beginne mit einem oder mehreren Zeichen zwischen A-Z, 0-9 oder ., _, %, + oder -. Dann erwarte ein @. Dann...

Und so weiter. Wer einen Schritt weiter denkt, kennt schon jetzt eine Sprache, die so aufgebaut ist: SQL. Die Sprache zum Kommunizieren mit den relationalen Datenbanken dieser Welt ist logisch und verständlich. Warum also kein SQL für Regular Expressions? Warum kein S”R”L?

SRL – Simple Regex Language

Das habe ich mich auch gefragt. Und es einfach gemacht. Darf ich vorstellen: SRL – Simple* Regex Language!

Ein Beispiel gefällig? Ihr erinnert euch an das Beispiel mit der E-Mail-Validierung? In PHP würde das Ganze aktuell so aussehen:

$regex ='/^([A-Z0-9._%+-])+@[A-Z0-9.-]+\.[A-Z]{2,}$/i';
if (preg_match($regex, 'me@example.com') === 1) { }

Hiermit lässt sich prüfen, ob die gegebene E-Mail-Adresse gültig ist. Wesentlich schöner geht es aber so:

$regex = new SRL('BEGIN WITH EITHER OF (NUMBER, LETTER, ONE OF "._%+-") ONCE OR MORE,
LITERALLY "@",
EITHER OF (NUMBER, LETTER, ONE OF ".-") ONCE OR MORE,
LITERALLY ".",
LETTER AT LEAST 2,
MUST END, CASE INSENSITIVE');
if ($regex->isMatching('me@example.com')) { }

Ohne Zweifel ist das SRL-Beispiel wesentlich länger, aber sind wir mal ehrlich… wer keine Ahnung von Regular Expressions hat, kann sich hier denken, was passiert. Besonders, wenn die Person es nicht geschrieben hat und es einen Bug geben sollte, kann dieser einfach behoben werden, da klar ist, worum es geht.

SRL Query Builder – LINQ für Regular Expressions

Doch das ist noch lange nicht alles. Wer Query Builder für MySQL und Co. kennt, wie zum Beispiel LINQ oder Laravels Query Builder, dürfte den SRL Query Builder gut verstehen. Dasselbe Beispiel wie oben, lässt sich hiermit wie folgt in PHP umsetzen:

$query = SRL::startsWith()
    ->eitherOf(function (Builder $query) {
        $query->number()
            ->letter()
            ->oneOf('._%+-');
    })->onceOrMore()
    ->literally('@')
    ->eitherOf(function (Builder $query) {
        $query->number()
            ->letter()
            ->oneOf('.-');
    })->onceOrMore()
    ->literally('.')
    ->letter()->atLeast(2)
    ->mustEnd()->caseInsensitive();

Wie ihr seht, ist die Syntax der SRL Syntax sehr ähnlich. Nur lässt sich damit relativ einfach eine dynamische Regular Expression aufbauen, wenn die Bedingungen erst zur Laufzeit bekannt werden. Am Ende purzelt bei beiden Versionen (SRL und Query Builder) ein Objekt heraus, welches viele tolle Features bietet, wie zum Beispiel das schon gezeigte “isMatching”.

Capture Groups und Lookarounds

Wer sich mit Regular Expressions auskennt, der weiß, dass noch ein paar wichtige Features in SRL bisher nicht erwähnt wurden. Darunter Capture Groups, welche es ermöglichen, Resultate zu filtern, und Lookarounds, welche Bedingungen vor oder nach dem Filter erfüllen müssen. Doch selbstverständlich ist auch dies mit ein paar einfachen Worten zu definieren:

$regex = new SRL('CAPTURE (LITERALLY "foo", OPTIONAL "bi") AS "sample" IF FOLLOWED BY (LITERALLY "bar")');

Das CAPTURE-Keyword definiert eine Capture Group unter dem Namen “sample”, welche auf die Sub-Expression in den Klammern matcht. Dies passiert jedoch nur, wenn auf diese Gruppe direkt die kommende Sub-Expression, nämlich “bar” folgt.

Die folgenden Beispiele würden daraus also resultieren:

$regex->isMatching('foobar'); // true, da auf "foo" direkt "bar" folgt.
$regex->isMatching('foobiboo'); // false, da auf "foobi" kein "bar" folgt.

Da “foobibar” ebenfalls matchen würde, können wir uns mit der “getMatches”-Methode nun ein Array aller Matches ausgeben lassen. Unsere Capture-Group hat den Namen “sample” bekommen, weswegen wir unseren ersten Match nun über diesen Namen abrufen können:

$regex->getMatches('foobibar')[0]->get('sample'); // "foobi"

Auch Dinge wie Replace lassen sich ganz einfach abbilden:

$regex->replace('wunder', 'foobar'); // "wunderbar"

Neben Replace gibt es dann auch noch “filter” und “split”, welche ähnlich funktionieren. Und wem das noch nicht genug ist, der darf sich gerne auch die im Hintergrund erstellte Regular Expression ausgeben lassen und damit alles anstellen, was mit normalen Regular Expressions auch möglich ist.

Viel Spaß

Wer das Ganze einmal selbst ausprobieren möchte, darf gerne das SRL GitHub-Projekt klonen, forken, kopieren, löffeln, runterladen, anpassen, mergen oder was euch sonst noch so alles einfällt.

Natürlich sind auch Implementierungen in anderen Sprachen oder Contributions und Bugfixes sehr gerne gesehen.

 

* Jaja, das S in SQL steht für Structured, aber um ehrlich zu sein finde ich trifft es Simple im Falle der Regular Expressions einfach besser.

N26 (Number26) – Die Bank der Zukunft

Von Karim Geiger — unter Bank, Firmen am 27.07.2016

Cover

Number26, bzw. seit ein paar Tagen nur noch N26 genannt, ist die modernste Bank Deutschlands. Leider ist nicht alles Gold, was glänzt, und auf die hübsche Hülle kein Verlass.

Ich wollte wirklich, dass es funktioniert. N26 hat eine wunderschöne App und WebApp, womit sich das gesamte Konto steuern lässt, und sie bietet alle Funktionen, die man sich wünschen kann. In der Kontoübersicht wird in Kategorien aufgelistet, wofür das Geld ausgegeben wurde, eine Überweisung kann mit ein paar einfachen Klicks getätigt werden, und die Bestätigung bei Überweisungen am PC erfolgt per Push-Benachrichtigung an die Smartphone-App.

Kapitalanlagen sind auch ganz einfach per Klick in der App möglich, und die Verwaltung von Kontodaten, PIN, und Karten lässt sich ebenfalls ganz locker und einfach handhaben. Das Erlebnis ist rundum begeisternd. Sogar ein Dispo-Kredit wird angeboten. Nach einer SCHUFA-Abfrage wird dann berechnet, wie viel Budget einem zur Verfügung steht, und dann kann es auch schon losgehen. Mit einem einfachen Schieberegler kann der Kreditrahmen dann angepasst werden, je nachdem, wie viel man gerade benötigt, sodass man nicht aus Versehen überzieht.

Bei einer Bank ist die Funktion und das Aussehen aber natürlich längst nicht alles. Wichtige Faktoren sind auch Zinssätze, Zuverlässigkeit und Support. In all diesen drei Punkten versagt N26 komplett. Die Zinssätze sind beim Girokonto nicht vorhanden, beim Dispo, welcher bis maximal 2000 Euro geht, beträgt der Zinssatz 8,9%.

Zuverlässigkeit ist so eine Sache. Die lässt sich meist nur feststellen, wenn es dann zu spät ist. Und für knapp 400 Kunden der noch sehr jungen Bank war es dann auch so. Diese wurden plötzlich aus heiterem Himmel ohne Vorwarnung gekündigt. Einen Grund kommunizierte N26 erst eine Woche später. Zur gleichen Zeit wurde übrigens bei mir ein SCHUFA-Check von N26 angeordnet. Damals, als die Kündigungen durchgeführt wurden, blieb ich unversehrt. Ich dachte mir, man würde schon seine Gründe haben und ließ mich dadurch nicht beirren. Langsam habe ich mein Primärkonto immer weiter zu N26 umgezogen. Eingerichtet war bei mir ein Dispo-Kredit von 500 Euro. Testweise habe ich den auch, da ich ein wenig skeptisch war, ausgereizt.

Für ein paar Wochen war also Minus auf dem Konto, bis ich den Dispo dann wieder getilgt habe. Heute kommt dann plötzlich die Nachricht per E-Mail, dass mein Dispo-Kredit gekündigt wurde, und ich bitte in einem Monat alle noch offenen Schulden decken müsse. Sogar gleich zweimal. Einmal auf Englisch, mit folgendem Inhalt:

Screen Shot 2016-07-27 at 17.27.32

Und ein paar Minuten später dann auf Deutsch:

Screen Shot 2016-07-27 at 17.28.56

Diesmal immerhin mit richtigem Text. Ich müsse also keine 0 Euro mehr zurückzahlen, und selbst gekündigt habe ich ihn auch nicht. Immerhin nennt man einen Grund: “Verschlechterung meiner Kreditwürdigkeit”

Okay, dann sehen wir doch mal nach… Die letzte SCHUFA-Abfrage von N26 war am 1. Juni. Der letzte Score, welcher in der Tat schlechter ist (weil N26 meinen Kredit gemeldet hat), wurde am 6. Juli berechnet. Davor, also am 1. Juni, war alles beim Alten. Eine Verschlechterung ist also de facto falsch. Warum wurde mir der Kredit also gekündigt? Man weiß es nicht. Vermutlich, weil ich ihn verwendet habe.

¯\_(ツ)_/¯

Bleibt also nur noch eins zu klären: Der Support. Eine Antwort auf meine Fragen per Twitter habe ich nicht erhalten, auch vor ein paar Tagen nicht, als ich netterweise auf einen Bug hingewiesen habe. Stattdessen sieht man auf deren Twitter-Account nur eins: Unzufriedene Kunden, die sich über mehrere Wochen Wartezeit beim E-Mail-Support aufregen und vertröstende Antworten, dass man “aktuell” ein hohes Support-Aufkommen habe, welches nicht ganz bewältigt werden könne.

Tja, soviel dazu. Den Platz in der Hall of Shame haben sie sich damit natürlich verdient.

Meine Kündigung ist raus. Schade eigentlich.

Update 30. August: Tja. Das scheint die N26-Bank aber nicht weiter zu interessieren. Sie haben jetzt schon meine dritte Kündigung abgelehnt. Zuletzt mit der Begründung (immerhin kam mal eine), dass meine Unterschrift anscheinend abweiche. Sehr interessant auf jeden Fall. Wenn man raus will, darf man nicht, aber wer bleiben will, muss gehen. Vielleicht hebe ich einfach mal ein paar Euro ab…

Postfächer – Die Nachteile

Von Karim Geiger — unter Deutschland am 05.07.2016

Postfächer kennt jeder. Und sie bieten auf den ersten Blick eigentlich nur Vorteile: Wer eins hat, kann es an einigen Stellen angeben um Post zu erhalten, ohne die richtige Adresse der Wohnung preisgeben zu müssen. Aber Postfächer haben auch Nachteile. Gravierende, wie ich finde.

Nach dem Anmelden zum Postfach-Service der Deutschen Post bekommt man einen Schlüssel zu seinem Postfach, sowie eine eindeutige Adresse, unter der man Post an das Postfach schicken lassen kann. Selbstverständlich. Irgendwo muss die Post ja auch ankommen. Was die Post allerdings nicht kommuniziert ist, dass nicht nur Post, die an das Postfach adressiert ist dort landet, sondern auch Post, die eigentlich an die private Adresse gerichtet ist.

Ohne bestimmtes Muster, sondern einfach nach Lust und Laune landen also sporadisch Briefe von unterschiedlichsten Unternehmen und Personen im Postfach, auch, wenn sie nicht dort hin geschickt wurden. Das hat zur Folge, dass man, wenn man sein Postfach nicht wirklich jede Woche leert, gerne mal eine Zahlungsfrist überschreitet. Es kommt einem in der Tat so vor, als wäre die Post manchmal zu faul um die Briefe auszuliefern. Stattdessen packt sie diese dann einfach ins Postfach, sofern eins registriert wurde. Eine Benachrichtigung per SMS oder E-Mail wie bei der Packstation bekommt man nach Erhalt eines Briefes ebenfalls nicht.

Bevor ihr also ein Postfach registriert, seid euch im klaren, dass ihr um eine Leerung pro Woche nicht herumkommt. Auch, wenn ihr eigentlich keine dringliche Post unter der Postfachadresse erwartet. Schade.

Passwörter

Von Karim Geiger — unter Ideas, Internet am 30.05.2016

Cover

Wer kennt sie nicht? Passwörter wie “123456”, “password” und “qwerty”. Dass das unsicher ist, muss man keinem sagen. Trotzdem werden sie so häufig verwendet, wie sonst keine.

Wieso? Ganz einfach. Weil den meisten Leuten Passwörter egal sind. Der Aufwand, sich ein komplexes Passwort zu merken, ist zu hoch, und die Daten, die sie schützen, sind es – ihrer Meinung nach – nicht wert geschützt zu werden. Ergo werden unsichere Passwörter verwendet, meist sogar eines für alle Dienste, bei denen man sich registriert.

Ein weiteres Problem bei den Passwörtern ist, dass Maschinen einfach viel zu gut im Raten sind. Früher war ein Schloss mit ein paar Zahlenkombinationen recht sicher, weil es Monate dauern würde jede Kombination auszuprobieren, und man dafür im Besitz des Gegenstands sein musste. Aber Computer sind dabei selbstverständlich schneller. In ein paar Minuten haben aktuelle Systeme einige Passwörter entschlüsselt. Und damit ist das Konzept des Passwortes meiner Meinung nach veraltet. Etwas Neues muss her.

Deswegen gibt es Two-Factor-Auth. Selbstverständlich bietet dieser Mechanismus einen weiteren Sicherheits-Layer, da nicht nur ein Passwort benötigt ist, sondern auch noch ein Einmalpasswort, welches meist per E-Mail oder SMS zugesandt wird. Toll! Zwei Passwörter, die man eingeben muss! Somit wird Two-Factor-Auth auch, sofern nicht Pflicht, nur von den Leuten verwendet, die sowieso schon ein sicheres Passwort vergeben. Gewonnen hat man dadurch also nicht wirklich viel, außer eine zusätzlich verschwendete Minute bei jedem Login.

Die Zeit ließe sich etwas verkürzen, wenn das Ganze per Push realisiert würde. Etwas, das für mich selbstverständlich ist. Ich verstehe einfach nicht, wieso Twitter die einzige Firma ist, die eine entsprechende Funktion implementiert hat. Während alle anderen Firmen einen meist sechsstelligen Code versenden, den man dann umständlich in die Login-Maske eintippen muss, sendet Twitter ganz einfach eine Benachrichtigung an das Smartphone mit der Meldung “xyz versucht, sich in Ihren Account einzuloggen. Zulassen? [Ja] [Nein]”. Klickt man auf Ja, wird die Login-Seite aktualisiert und man ist eingeloggt. Ein Wunder? Nein. Technik. Das Ganze ließe sich sogar per SMS in Verbindung mit einem Einmallink realisieren. Wieso also nicht? Ich verstehe es nicht.

Und dieser Punkt bringt mich einen Schritt weiter: Lasst das Passwort ganz weg. “OMG! IST DAS NICHT TOTAL UNSICH…” Nein. Lasst uns folgendes Szenario durchspielen: Ich habe ein unglaublich sicheres Passwort für meinen E-Mail-Account. Trotzdem wurde dieser gehackt und der Angreifer hat Zugriff darauf. Jetzt möchte er sich bei Service X anmelden. Das Passwort ist nicht das gleiche, und Two-Factor-Auth ist deaktiviert. Er drückt auf “Passwort zurücksetzen” und bekommt prompt eine Mail, mit der er das Passwort ganz einfach zurücksetzen kann. Der Angreifer kann sich nun bei Service X anmelden.

Jetzt dasselbe Szenario ohne Passwort, dafür aber mit Bestätigung des Logins via E-Mail: Der Angreifer, welcher Zugang zum E-Mail-Konto hat, gibt den Benutzernamen bei Service X ein, und bekommt einen Einmal-Link per E-Mail zugesandt, wodurch er sich nun einloggen kann. Im Endeffekt ist der Ablauf also genau gleich, nur muss der Angreifer nicht vorher noch ein neues Passwort vergeben. Sicherer wird es, wenn wir den Login-Request auf das Smartphone auslagern. Eine universelle App – ähnlich dem Google Authenticator – bekommt von Service X bei jedem Login-Request eine Push-Benachrichtigung, um den User zu fragen. Über das Interface der App kann man nun – nachdem man sich per Fingerprint authentifiziert hat – den Login bestätigen oder ablehnen. So muss der Angreifer Zugriff auf das Smartphone haben, und auch das gekaperte E-Mail-Postfach hilft hierbei nichts.

Die Vorteile:

  • Brute-Force-Angriffe auf Accounts können nicht mehr stattfinden
  • Gehackte Services können keine (gehashten) Passwörter mehr leaken
  • Social Engineering funktioniert nicht mehr
  • Der Nutzer kann keine unsicheren Passwörter mehr vergeben

Und wenn nicht jeder sein eigenes Süppchen kocht und es eine zentrale App dafür gibt:

  • Verliert man das Smartphone, könnte man sofort alle Zugriffe revoken.
  • Alle aktiven Logins können zentral in einer App eingesehen werden.

Die Nachteile:

  • (Smartphone benötigt/ließe sich aber auch per E-Mail oder SMS realisieren)
  • Wenn das Smartphone gehackt wird, und man es nicht merkt, ist es halt kacke
  • Obligatorische German Angst
  • Single Point of Failure

Anmerkung:

Ja, dieses Konzept ist nicht mit Two-Factor-Auth gleichzusetzen, da ein (gutes) Passwort selbstverständlich zusätzliche Sicherheit bietet. Allerdings wird Otto Normalverbraucher im Durchschnitt wesentlich seltener angegriffen werden können, da die Komponente des unsicheren Passworts einfach wegfällt. Selbstverständlich wäre es möglich, das Konzept entsprechend zu erweitern, um OPTIONAL noch ein Passwort pro Service zu fordern. Damit wäre man dann wieder bei Two-Factor-Auth, jedoch mit dem Passwort als optionalem Parameter. Das würde dann einen gewissen Basisschutz für alle bieten mit einer Option zur zusätzlichen Sicherheit für die Paranoiden unter euch.

Co-Anmerkung:

Dadurch würde auch die Anzahl der Promi-Leaks deutlich sinken, da diese meist nur durch Brute-Force-Angriffe oder Social Engineering stattfinden. Und selbstverständlich wären Hacker-Angriffe auf einzelne Services weniger dramatisch.

Bildquelle: Mr Wallpaper

Harman/Kardon – Die waren mal gut?

Von Karim Geiger — unter Firmen am 24.04.2016

Cover

Harman/Kardon ist nicht ganz unbekannt. Angeblich stand die Marke früher für Qualität und war ihren Preis wert. Heute kann ich das leider absolut nicht bestätigen. Ich habe mittlerweile den zweiten AVR von Harman/Kardon bei mir daheim stehen und bin mehr als enttäuscht.

Was darf man von einem AV-Receiver für 900 Euro erwarten? Gute Qualität? Guten Sound und gutes Bild? Features? Eine App, um das Gerät zu steuern? Support, der einen versteht? Software, die intuitiv ist? Eine Fernbedienung, die ohne Infrarot auskommt? Nun. Der Ton ist in Ordnung, und das automatische Justierungssystem funktioniert. Auch das Bild wird per HDMI einwandfrei übertragen. Aber das war es dann im Großen und Ganzen auch schon.

Kommen wir zu den einfachen Sachen, die für ein Gerät dieser Preisklasse selbstverständlich sein sollten. Wie sieht es aus mit WLAN? Ja, hat es. Allerdings nur 802.11b/g und das auch nur, wenn der Router direkt neben dem Gerät steht. Schon auf 4 Meter Entfernung im selben Raum ist die Verbindung so schwach, dass eine WLAN-Verbindung nicht mehr aufgebaut werden kann. Immerhin bietet das Gerät auch einen LAN-Port, womit sich die mangelhafte WLAN-Unterstützung umgehen lässt. Dazu gibt es sogar eine App für Android und iOS, welche es ermöglicht, den AVR zu steuern. Auf dem Papier klingt das natürlich toll. Leider ist die App nur eine Fernbedienung, welche nicht einmal dessen volle Funktionalität bietet. Außerdem ist es über die App weder möglich, einen Zustand abzufragen, wie z.B. die Lautstärke oder den aktuellen Kanal, noch den AVR einzuschalten. Nach einer Stunde im Standby-Modus schaltet das Gerät den Webserver, welcher für die API-Anbindung der App zuständig ist, nämlich vollständig ab. Das hat zur Folge, dass das Gerät nur noch per Infrarot-Fernbedienung eingeschaltet werden kann. Und wie das bei Infrarot üblich ist, funktioniert das nur, wenn man mit der Fernbedienung genau auf den Empfänger zeigt.

Ist der AVR dann aber einmal an, und die Verbindung zur App hergestellt, fehlt wie bereits erwähnt der Zustand. So kann man die Lautstärke nicht per Regler anpassen, sondern nur Schritt für Schritt per Knopfdruck. 10x auf “Leiser” gedrückt, sendet also 10x das Signal “Leiser” an den AVR. Da kommt Freude auf. Zumal das Verarbeiten der Anfrage vom AVR etwa eine halbe Sekunde in Anspruch nimmt. 10 Stufen leiser bedeuten somit also, wenn alles optimal läuft, 5 Sekunden lang auf den “Leiser”-Knopf wie ein Irrer zu hämmern.

Da ich aktuell dabei bin, meine Geräte in meiner Wohnung zu vernetzen, um ein Smart Home zu etablieren, muss selbstverständlich auch der AVR 370 von Harman/Kardon mit von der Partie sein. Mit der Prämisse, dass ja eine App existiert, begann ich also, die API des AVR in meine Heimautomatisierung zu implementieren. Leider ist die API nirgends dokumentiert (wie sich herausstellte aus gutem Grund). Somit blieb mir also nichts anderes übrig, als die App auseinanderzunehmen und die Requests per Wireshark abzufangen, um meine eigene API zu schreiben. Die API ist allerdings so schlecht implementiert, dass noch nicht einmal der HTTP-Standard vollständig eingehalten wurde, was die Entwicklung etwas schwieriger gestaltete. Zudem gibt sie wie eingangs erwähnt keinen Zustand zurück. Nicht einmal eine Antwort des Servers kommt. Man kann also weder feststellen, ob der Befehl ausgeführt wurde, geschweige denn auf welchem Kanal/auf welcher Lautstärke der AVR steht, oder ob er überhaupt an oder im Standby-Modus ist.

Nach kürzester Zeit fanden sich im Netz weitere Interessenten, welche ebenfalls Geräte von Harman/Kardon besaßen. Sie probierten aus, ob meine Implementierung der API bei ihrem Gerät funktionierte. Teilweise war das auch der Fall. Allerdings führten manche Befehle auf unterschiedlichen Geräten unterschiedliche Dinge aus. “sleep” führt auf BDS-Geräten z.B. zu einem sofortigen Standby, bei meinem AVR jedoch setzt es einen Sleep-Timer auf 10 Minuten. Beständigkeit hat also bei der Entwicklung dieser API keine Rolle gespielt.

Da eine API relativ wenig bringt, wenn man das Gerät nicht anschalten kann, fragte ich beim Support nach, was denn der Grund für das Abschalten des Webservers nach einer Stunde sei. Nach einigem Hin- und Her, weil man meine Anfrage eingangs nicht verstand, kam letzten Endes nur die Antwort, dass eine EU-Richtlinie es verbiete, im Standby mehr als 0,5 Watt zu verbrauchen und es technisch daher nicht möglich sei, den Webserver laufen zu lassen. Zumindest war das die Antwort, die ich verstand, da sie in fehlerhaftem Deutsch formuliert war und ich mir nicht sicher bin, ob man mich überhaupt komplett verstanden hat. Seltsam allerdings, dass unzählige Geräte keine Probleme mit einem Always-On-Webserver haben und auch Wake On LAN ist nicht unbedingt die neuste Erfindung.

Ich gab nicht auf, und dachte, dass vielleicht ein Firmware-Update das Problem lösen könnte. Doch dann kam der endgültige Grund für das Schreiben dieses Artikels: Nicht nur scheint ein Firmware-Update keine Lösung zu sein, nein, man bekommt es bei einem 900 Euro-Gerät anscheinend nicht einmal hin, ein einfaches Migrations-Script zu schreiben, welches die aktuellen Nutzereinstellungen auf die neue Software-Version anhebt. Denn: Installiert man ein Firmware-Update werden alle Einstellungen auf den Werkszustand zurückgestellt. Halleluja.

Mein Fazit lautet also: Finger weg von Harman/Kardon. Ever.

Bildquelle: Shaun Owyeong

Die richtige Programmiersprache

Von Karim Geiger — unter Development, Privat am 15.04.2016

Alles scheiße.

Aber was ist am wenigsten scheiße? Das hier soll kein Blogpost werden, der für irgendjemanden außer mir informativ oder weiterführend sein soll. Es ist lediglich ein Blogpost darüber, wie ich versuche eine neue Programmiersprache zu finden. Wenn ihr also eine Programmiersprache habt, von der ihr genau wisst, dass sie mir gefallen wird, dann gerne her damit. Entweder als Kommentar oder auf Twitter.

Folgende Programmiersprachen kommen für mich (wahrscheinlich) nicht infrage:

  • PHP – Verwende ich aktuell.
  • C# und alles mit .NET – Leider zu Microsoft-Lastig und damit für mich nicht geeignet.
  • Objective-C – Zu “besonders”.
  • Java – Zu unperformant und inkonsequent.
  • JavaScript/NodeJS – Ja genau :D
  • Python – Wirklich schön. Leider ist die Objektorientierung einfach total lieblos integriert.
  • Ruby – Syntaktisch nicht meins, außerdem zu modular.
  • Perl – Zu alt, syntaktisch unschön.
  • C und C++ – Zu systemnah.

Folgende Programmiersprachen könnten eventuell infrage kommen, ganz überzeugt bin ich aber nicht:

  • Go – Die Projektverwaltung gefällt mir nicht, und auch die enge Verknüpfung mit Modulen sieht nicht unbedingt vorteilhaft aus.
  • Swift – ???
  • Rust – ???
  • TypeScript – Frontend…

Und was soll das jetzt?

Weiß ich auch nicht. Aber ist das wirklich relevant?

Acer: Da kann man schon mal klatschen

Von Karim Geiger — unter Firmen am 06.04.2016

Cover

Normalerweise sind solche Überschriften bei mir ja sarkastisch gemeint. Heute aber nicht. Ich meckere gerne mal, wenn eine Firma inkompetent ist oder der Support den Namen mal wieder nicht verdient hat. Aber ich kann auch loben. Und das möchte ich heute tun.

Vor etwa viereinhalb Jahren habe ich mir von Acer einen Projektor gekauft, der seitdem ordentlich bei mir daheim im Einsatz ist. Er hat schon die zweite Lampe hinter sich und bisher immer gute Dienste geleistet. Plötzlich passierte dann jedoch das Unvermeidliche. Der DLP-Chip fing an in die Jahre zu kommen und innerhalb weniger Wochen gleichte eine Hälfte des Bildes einem Sternenhimmel. Die Pixelfehler zeigten, dass die Tage des Beamers gezählt sind.

Ohne große Hoffnungen kontaktierte ich daraufhin den Acer-Support und fragte nach, ob sich bei dem 4,5 Jahre alten Gerät noch etwas auf Kulanz machen lässt oder ob man mir eventuell auf ein Neuprodukt Rabatte geben könne. Zu meiner Überraschung fand der nette Support-Mitarbeiter heraus, dass der DLP-Chip selbst 5 Jahre Garantie Seitens des Herstellers Texas Instruments hat und ich das Gerät einschicken könne.

Gesagt, getan. Obwohl mir beim Beantragen des Retourenscheins gemeldet wurde, dass die Garantie des Projektors abgelaufen sei und man mit einem Kostenvoranschlag auf mich zukommen würde, sobald das Gerät im Reparaturcenter eingetroffen ist, wurde mein Projektor ohne Umschweife repariert. Komplett kostenlos. Auch der Versand wurde von Acer übernommen. Doch auch die Bearbeitungszeit war erstaunlich. Nach nur zwei Tagen im Acer-Center machte sich das Gerät schon wieder auf den Weg heim und leistet mittlerweile wieder einwandfreie Dienste.

Abschließend bleibt also nur zu sagen, dass ich von Acer sehr positiv überrascht bin. Mit dieser Aktion haben sie somit einen weiteren Kunden gewonnen, der auch in Zukunft bei Acer-Produkten bleiben wird.

Google Kalender Self-Hosted?

Von Karim Geiger — unter Google, Internet am 10.02.2016

Kennt ihr den Google Kalender? Höchstwahrscheinlich. Es ist ein simpler Web-Kalender, welcher sich über das Google-Konto mit sämtlichen Clients synchronisieren lässt.

Möchte man nun aber nicht so abhängig von Google sein, liegt es nahe, eine solche Lösung auf dem eigenen Server zu implementieren. Die erste Software, die einem dazu einfällt, dürfte ownCloud sein. Diese unterstützt nicht nur das Speichern von Dateien, sondern auch die Verwaltung von Kontakten, sowie Kalendern, inklusive WebDAV, CalDAV und CardDAV-Sync, sowie einer Web-Oberfläche.

Leider fehlt bei der Kalender-Komponente eine (für mich) wichtige Sache. Interessanterweise ist mir kein Programm bekannt (und ich habe in letzter Zeit einige durchprobiert), welches diese Problematik aufs Korn nimmt. Wenn du also nach dem Lesen dieses Posts eine Alternative für den eigenen Server kennst, wäre ich dir über einen Kommentar sehr dankbar.

Stellt euch folgendes Szenario vor: Ihr habt einen Kalender für eure privaten Termine, und einen Kalender für berufliche Termine. Soweit lässt sich selbstverständlich alles über ownCloud und co. abbilden. Nun kommen aber zwei weitere Kalender hinzu: Der ical-Feed für die Feiertage in eurem Bundesland, sowie der ical-Feed der Firma. Diese können entweder ganz einfach über den Google Kalender abonniert werden, oder müssen bei jedem Client einzeln aktiviert werden. ownCloud und co. bieten keine Möglichkeit, externe Kalender zu abonnieren, und diese per CalDAV weiterzureichen. Das hat zur Folge, dass ich, nachdem ich einem weiteren Kalender beigetreten bin, diesen an all meinen Geräten synchronisieren muss.

Meine Frage ist daher: Warum kann Google das, und warum gibt es keine Alternative? Es kann doch nicht sein, dass ich der erste bin, den das stört.