Joey’s Pizza: Formular Validierung

Geschrieben von everflux am Juli 5th, 2015

Das ist schon gar nicht so einfach mit online Bestellungen. Selbst wenn man in der IT arbeitet. Joey’s Pizza – zu denen ich eh ein gespaltenes Verhältnis habe – hat jetzt ein neues Online Bestellsystem für Joey’s Pizza Lieferdienst. Um da zu bestellen müssen Daten angegeben werden, für die es gar keine Felder gibt. Klappte dann aber auch ohne „Name am Klingelschild“, aber hat das Bestellerlebnis deutlich beeinträchtigt. Ich wüsste gerne wie hoch die Abbruchrate bei dem Prozessschritt ist.

joeys-validation

Insgesamt dauert die Bestellung fast doppelt so lange wie bei dem alten System, dafür sind ja auch die Preise angehoben worden. Wenn das nicht fair ist.

The null job

Geschrieben von everflux am Juni 6th, 2015

Ist immer so eine Sache mit den null Jobs… dass jemand wirklich null Job sucht ist aber auch für mich was neues.

Immerhin gibt es null jobs in vielen Städten, man bleibt also flexibel.

null-job

Netbeans – Choose your color!

Geschrieben von everflux am März 7th, 2015

As I regularly test different versions of Netbeans as part of the community acceptance program (NetCAT) and for my own fun and benefit I sometimes struggle to start of the right version: Usually the release version is the right one to go. During NetCAT the beta version needs to be tested and when new features are so promising that you want to run the nightly, you go with that.

I came up with a simple solution to never  launch the wrong edition: Differently colored Netbeans icons. This is how my Gnome launcher looks:

netbeans-choose

Easy to tell that red is the nightly, without looking at the icon text! If you want that for yourself, you can get the icons here:

netbeans-dev netbeans-beta

The icons are created using Gimp and just rotating the colors, so it’s a little hacky but does the trick.

In Gnome you can use the application ‚alacarte‘ (or ‚main menu‘ if you run the english locale) to customize your launchers. Just change the icon:

alacarte

Netbeans, Vagrant und remote PHP Debugging mit xdebug

Geschrieben von everflux am Februar 14th, 2015

Vielleicht hilft dieser Tipp dem einen oder anderen weiter, der gerne die Netbeans IDE zur PHP Entwicklung verwendet und auch Vagrant nutzt: Wenn man mit Vagrant arbeitet, so werden die lokalen Dateien in der virtuellen Maschine gemounted. Für Netbeans konfiguriert man daher „lokalen Webserver“ als Umgebung.
Die Konfiguration von xdebug sieht dann am einfachsten so aus:

[xdebug]
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
;xdebug.remote_autostart = 1
xdebug.remote_handler=dbgp

Hier wird xdebug angewiesen, sich zum Aufrufer zurück zu verbinden – die IP wird aus dem Request genommen. Das passt in der Regel, wenn man innerhalb von Vagrant nicht noch wilde Sachen (Proxy) macht.
Was leider nicht passt: Die Pfade. Netbeans weißt xdebug für Breakpoints an, welche Datei – inkl. Pfad – an welcher Stelle einen Breakpoint erhalten soll. Die Ordnerstruktur ist innerhalb der virtuellen Maschine höchstwahrscheinlich anders, als auf dem Host-System.
Hierzu gibt man innerhalb von Netbeans noch ein Pfad-Mapping an: Projekt Konfiguration, „Run Configuration“, „Advanced“.
Nun waehlt man aus, wo man innerhalb der Vagrant bzw. VirtualBox Umbebung den Projekt Ordner eingebunden hat. In meinem Beispiel ist das /var/www/localhost

Anschließend kann man den Netbeans Debugger verwenden.
Möchte man spezielle Requests, wie z.B. PUT, mittels curl aufrufen kann man dies auch ganz einfach machen, in dem man den Xdebug Trigger als Parameter anhängt:

curl -X PUT -d '{}' http://localhost:8080/rest/endpoint.php/duplicates\?XDEBUG_SESSION_START\=netbeans-xdebug

Ein Screenshot der Netbeans Konfiguration als Referenz:
path-mapping

Middleman live reload mit Vagrant

Geschrieben von everflux am Januar 31st, 2015

Middleman ist ein static site generator der sich einiges von Ruby-On-Rails leiht, aber eben nur statische Seiten generiert. In vielen Anwendungsfällen ist das auch genau das richtige.

Um die Web-Entwicklung zu erleichtern – vor allem auch mit mobilen Geräten – gibt es das vorzügliche Werkzeug „livereload“. Damit wird im Browser ein reload ausgelöst, wenn sich die Quellen geändert haben. Das spart Zeit und man muss nicht dauernd aus dem Texteditor oder der IDE raus um im Browser einen Reload manuell auszulösen. Zur Integration gibt es zum einen native Browser Extensions, zum anderen kann dies auch über ein JavaScript integriert werden.
Hinter den Kulissen nutzt livereload einen Websocket (ggf. mit Polyfill über Flash) um  den Client dann zu informieren.

Was liegt nun näher, als middleman als static site generator mit livereload zu verbinden. Am besten das ganze noch mit vagrant, so dass man eine isolierte Entwicklungsumgebung hat. Da vagrant mit VirtualBox arbeitet, kommt etwas mehr Komplexität auf einen zu. Der middleman läuft nun nicht mehr auf dem physischen Rechner sondern virtualisiert – damit hat er auch eine andere IP. Einzelne Ports koennen in die virtuelle vagrant Maschine reingereicht werden, das ist für das livereload wegen des Websockets schon mal wichtig. Dazu muss in der vagrant Konfiguration (Vagrantfile) folgender Eintrag vorhanden sein:

#middleman live reload port
config.vm.network :forwarded_port, host: 35729, guest: 35729

Jetzt muss middleman noch konfiguriert werden, dass es auch livereload verwendet:
Im Gemfile für middleman:

gem 'middleman-livereload'

In der middleman Konfigurationsdatei muss nun das livereload konfiguriert werden. Hier ist nun die Besonderheit: Das Livereload Plugin differenziert nicht zwischen der Host-Angabe um das Interface zu bestimmen an den der Websocket Server gebunden wird, und der URL die für den Zugriff auf den livereload Server verwendet wird. Gibt man hier „127.0.0.1“ an, bindet er nur an das lokale Interface in der virtuellen Maschine. Gleiches für „localhost“. Gibt man die externe IP des Hosts an, dann findet das rack-livereload das Interface nicht.

Da hilft als letztes nur noch das „Universalbinding“ – zum Glück ist das auch vom Browser nachher aufrufbar:

activate :livereload, :host => '0.0.0.0', :no_swf => true

Was in meinem Fall noch wichtig war: Das Assset hashing darf nicht ausserhalb der build Konfiguration aktiviert sein, andernfalls wird kein JavaScript beim Middleman-server injected.

Was nun noch wichtig ist: Das von VirtualBox verwendete Filesystem-Mounting unterstuetzt kein notify. Damit muss der middleman server zwingend den Polling-Modus verwenden:

middleman server --force-polling

Der einzige Wermutstropfen: Das funktioniert natürlich dann nur auf dem Entwicklungsrechner. Mit ipad oder Android Telefon im WLAN kommt man mit dem „0.0.0.0“ nicht weit. Aber immerhin funktioniert so das live reload mit vagrant.

PHP: Logging von SQL Queries / PDO Prepared Statements

Geschrieben von everflux am Januar 17th, 2015

Das Debugging von (legacy) PHP Anwendungen kann ganz schoen nervig sein. Da hilft auch der ganze Werkzeugkasten nicht, den man aus anderen Umgebungen gewohnt ist.

Percona Toolkit pt-query-digest auf tcpdump hat mal direkt Probleme bei der Auswertung.

Instrumentierung / AOP von PHP „Anwendungen“ – eher mau. Das einzige was einigermaßen tut, ist ‚runkit‘. Jedoch kann das nicht alles, was man gerne möchte. Insbesondere kann man sich damit nicht an die Konstruktoren von PHP internen Klassen (PDO) anhängen. Damit war der Plan vollständig ohne PHP Code Änderungen auszukommen erst mal dahin.

Aber erst mal die guten Nachrichten: Verwendet man runkit, kann man von mysql_query bzw. mysqli_query schonmal alles mitlesen.

PHP runkit ist schnell aus dem git repo (PECL ist veraltet) installiert:

cd /tmp
git clone git://github.com/zenovich/runkit.git
cd runkit
pecl install package.xml
echo 'extension=runkit.so' >> /etc/php5/fpm/conf.d/20-runkit.ini
echo 'runkit.internal_override = true' >> /etc/php5/fpm/conf.d/20-runkit.ini
echo 'opcache.enable = 0' >> /etc/php5/fpm/conf.d/20-runkit.ini
php5-fpm restart

Danach hängt man ein bisschen Magie in den PHP code und alle mysqli_query Aufrufe werden abgefangen:


if (function_exists("runkit_function_redefine"))
{

  //clean up from cached versions
  if (function_exists('__mysqli_query'))
  {
    runkit_function_remove('__mysqli_query');
  }

  $myqsliDelegate = 'file_put_contents("/tmp/queries.txt", $sql. ";\n", FILE_APPEND); return __mysqli_query($db, $sql);';

  runkit_function_rename('mysqli_query', '__mysqli_query');
  runkit_function_add('mysqli_query', '$db, $sql', $myqsliDelegate);
}

Jetzt kommt noch PDO, auch hier hätte man ja gerne die Prepared-Statements. Hier ist die Besonderheit dass erst die Datenbank die prepared sql statements mit Parametern belebt.
Dazu kann man sich dieser Klasse bedienen: https://github.com/noahheck/E_PDOStatement – die Interpolierung wird dann simuliert.
In meinen Fällen reichte das voll und ganz.
So sieht dann der runkit code für das Logging der PDO Statements mit der Hilfsklasse E_PDOStatement aus, die mir im Property fullQuery die interpolierte Query bereitstellt:



   $pdoDelegate = '$res = $this->__execute(); $query = $this->fullQuery; file_put_contents("/tmp/queries.txt", $query. "; --\n", FILE_APPEND); return $res;';
   runkit_method_rename("E_PDOStatement", "execute", '__execute');
   runkit_method_add("E_PDOStatement", "execute", '',  $pdoDelegate);


Leider muss jetzt noch an den Stellen, an denen das PDO instantiiert wird das E_PDOStatement konfiguriert werden. Normalerweise ist die Anzahl aber überschaubar. Damit nur auf Entwicklerrechnern das Logging aktiviert wird, habe ich noch einen environemnt Check dazu gepackt:


  if ((getenv("environment") === "LOCAL"))
  {
     require_once("lib/E_PDOStatement.php");
     $con->setAttribute(PDO::ATTR_STATEMENT_CLASS, array("E_PDOStatement", array($con)));
  }

Ingress: Axa Shield

Geschrieben von everflux am Januar 10th, 2015

Bei dem augmented Reality Game „Ingress“ von Google gibt es jetzt „Axa Shields“. Es handelt sich dabei um Werbung für die Versicherung „Axa“, deren Logo auch auf dem Schutzschild zu erkennen ist. Im Gegensatz zu der eher lieblosen und nervigen Vodafone-alle-Shops-sind-hässliche-Portale Werbung finde ich das einen gelungenen Schachzug: Es passt dass man als Versicherung ja eben „Schutz“ als Produkt hat. Dazu empfinde ich das Branding angenehm und nicht aufdringlich.

Man kann dass Shield vor allem bei Axa Agentur-Portalen hacken, jedoch auch einfach so, wie hier bei mir:

ingress-axa-shield

Auf der Meta-Ebene finde ich das ganze aber noch viel interessanter: Im Umfeld der Versicherer war schon lange abzusehen dass Änderungen im Auftreten, Umgang mit Kunden und aktuellen technischen Entwicklungen überfällig sind. In letzter Zeit – aber das kann natürlich selektive Wahrnehmung sein – mehren sich für mich die Zeichen für Evolution oder sogar Revolution:

  • Google arbeitet an KFZ Versicherungen: http://blogs.wsj.com/digits/2015/01/08/google-wants-to-sell-you-auto-insurance/
  • Die ING tritt auf der Devoxx auf – in einer Keynote – und stellt dort vor, wie ihr Technologie-Stack und Vorgehen im Wandel ist, gleichzeitig engagiert die ING sich stark in der Angular JavaScript Community und dem Framework mit OpenSource Entwicklungen wie spectINGular
  • Auch die LVM Versicherung mit Stammsitz Münster soll hier nicht fehlen: Seit bereits zwei Jahren sponsort sie die lokale Java Usergroup und stellt Raum und Catering

Eher ideenlos finde ich dagegen die Ideen einiger Versicherer Daten auszuwerten und günstigere KFZ Versicherungen anzubieten, wenn man sich permanent überwachen lässt und im Sinne der Versicherung Wohlverhalten an den Tag legt.

Aldi/Medion Lifetab S8312 lädt nicht / bootet nicht

Geschrieben von everflux am Januar 10th, 2015

Aldi hat ein Android Tablet (Medion Lifetab S8312) für 180 Euro im Angebot gehabt – incl. UMTS und sogar einem Monat mit 1.5GB Volumen direkt dabei. Da ich einen Ersatz für mein Nexus 7 gesucht habe, war das Lifetab S8312 eine gute Wahl: Gutes Display, richtige Größe, UMTS (wenn auch kein LTE) und ein passabler Prozessor. Als Betriebssystem kommt Android 4.4 Kitkat zum Einsatz, ob es jemals ein Lollipop Android 5.0 oder gar ein Cyanogen für das Lifetab S8312 geben wird, steht leider in den Sternen.

Nun zu dem Problem mit dem Lifetab: Als der Akkustand mit 15 Prozent angegeben wurde, hat sich das Tablet ausgeschaltet. Und war tot. Das Lifetab ließ sich nicht mehr starten. Also war die Vermutung dass das Device geladen werden muss – doch auch nach dem Anschluss an das Original Ladegerät von Aldi/Medion passierte nicht. Das S8312 zeigte keine Akku Ladung an, auch bootete es nicht automatisch und das Lifetab ließ sich auch nicht einschalten.

Da es keinen Reset Knopf gibt, habe ich den Standard-Android Trick versucht: Einschalter lange halten. Auch dann ließ sich das Aldi Tablet nicht starten. Manchmal hilft es bei gehaltenem Powerknopf das USB Ladekabel einzustecken. Auch nichts.

Was schließlich geholfen hat: Mit dem original Ladegerät nicht in der Steckdose das USB Ladekabel einstecken und den Einschalter eine Minute festhalten. Dann das Ladegerät in die Steckdose stecken. Dann erst den Einschalter loslassen. Kurz danach erscheint der Akku Ladeindikator.

lifetab-ladebildschirm

Analyse des Twitter Login Problems 2014-12

Geschrieben von everflux am Dezember 29th, 2014

Es fing damit an, dass Twitter mich ausgeloggt hat. Und ich mich nicht wieder einloggen konnte. Die native App faselte was von ‚retry later‘ oder falschem Passwort, die Webseite erzählte etwas von einem bekannten technischen Problem. Jedoch war auf status.twitter.com nichts zu sehen. Da ich davor einige Experimente mit Spring Integration und Twitter gemacht hatte und dabei auch mehrfach rate-limit Fehlermeldungen erzeugt hatte (versehentlich, wirklich!), machte ich mir Sorgen dass ich jetzt Twitter kaputt gemacht haben könnte.

Oder zumindest Twitter ernsthaft auf mich sauer sein könnte. Hilft alles nichts, muss man mal tiefer einsteigen.

Schaut man sich die Fehlermeldung an, sieht es aus, als wenn die OAuth Tokens, die Twitter zur Authentifizierung einsetzt und auch selbst ausstellt, von Twitter nicht verifiziert werden können. Die Signatur sei falsch. NSA Gedanken! Da ist bestimmt ein Schlapphut Schuld!

…. oder etwas ganz banales? Die Uhrzeit des Servers sieht komisch aus. Exakt ein Jahr in der Zukunft.

twitter-doy

So ganz habe ich zwar keine Idee wie so was mit der Hardware Uhr passieren könnte – aber ich habe eine Hypothese, was ein Programmierer tun könnte um den Fehler auszulösen.

Der Fehler trat ab ca. 0 Uhr UTC am 29.12. auf – zumindest hab ich ihn da bemerkt.

Es ist Montag der 29. 12. im Jahr 2014. Morgen ist Dienstag, 30., auch 2014. Mittwoch ist Silver, 31. – noch 2014. Das sind drei Tage. Die nächsten Tage sind alle schon in 2015.

Wenn sich jemand bei einem Date-Format einen super schwer zu findenden Bug einbauen möchte, dann verwendet er „YYYY“ statt „yyyy“ für die Jahreszahl. Das ist nämlich dann das „Week-Year“ und nicht das kalendarische Datum. Das ist dann das Jahr zu dem die Kalenderwoche gehört. Und es ist bereits KW 1 von 2015….

Das klingt abwegig? Habe ich schon zig mal in Code-Reviews gesehen. Die Wahrscheinlichkeit dass man dafür Sensibilität entwickelt hat, ohne dass man davon mal gebissen wurde halte ich für recht gering.

Inzwischen hat Twitter dazu ein Statement veröffentlicht

Between 4:00 and 9:25 PST today some users were unable to sign in to twitter.
This issue was due to a bug in our front end code, which has been patched.
We apologize for any inconvenience caused by this.

Da scheine ich gar nicht schlecht gelegen zu haben mit dem Bug – es war zumindest nicht die Hardware-Uhr und 04:00 PST ist 00:00 UTC :)

Zu solchen Verwirrungen traegt es u.U. bei, dass in Ruby „Y“ genau das richtige ist und in Java „y“ – aber „Y“ auch erstmal funktioniert und keine augenscheinlichen Probleme verursacht.

Referenzen:

Gourmondo: TECHNICAL_PRBLEM fail

Geschrieben von everflux am November 9th, 2014

Diese Sache mit lokalisierten Texten ist aber auch wirklich blöde…

gourmondo-fail


http://everflux.de/
Copyright © 2007, 2008 everflux. Alle Rechte vorbehalten. All rights reserved.