Blog: Latest Entries (15):


Regeln für Entwickler

Da ich mich momentan verstärkt wieder im PHP-Umfeld rumtreibe, bin ich über diese Auflistung von Tipps/Regeln für Programmierer gestolpert, die viele Probleme sehr genau erkennt. Aber meiner Erfahrung nach wird oft genau entgegen gesetzt dazu gehandelt und diese Lösungen den regelkonformen auch oft vorgezogen.

Zu 1. Technologie ist nur das Tool, aber nicht die fertige Lösung
Oft wird am Anfang eines Projektes eine Technologie gewählt und es wird Erfahrungen damit gesammelt. Bei den nächsten Projekten wird diese Erfahrung höher eingestuft, als die Erleichertungen, die andere Technologien bieten würde. Grundsätzlich kann immer mit jeder Technologie fast alles lösen, aber jede Technologie wurde mit einem bestimmten Augenmerkt entwickelt. JavaFX ist z.B. toll um vorhandene
Desktop-Anwendungen zu erweitern oder zu er setzen. Beim Versuch eine komplexere Webanwendung durch eine JavaFX-Anwendung zu erstzen wird man eher scheitern, weil die Konzepte einfach zu weit auseinander sind.

Zu 2. „Geschickt“ ist der Feind von „eindeutig“
Es gilt irgendwie die Annahme, dass es eine einfache Lösung schnell überlegt ist und wenn man länger nachdenkt eine komplexe Lösung dabei raus kommt. Ich würde behaupten, dass es genau anders herum ist. Erst wenn man alles ausreichend durch schaut hat und verschiedene Lösungswege durch gegangen ist, kann man etwas auf das Elementare herunter brechen. Nach 2h nachdenken wird die Lösung einfacher und klarer als, als wenn ich das erste nehme was mir nach 2min in den Kopf kam.

Zu 3. Nur dann Code schreiben, wenn es wirklich nötig ist
Hier würde ich nicht nur unnötigen Code und unbenutzte Funktionen aufführen sondern auch Templates, wenn es um die Darstellung geht. Es ist schlecht und bringt mehr mögliche Fehlerquellen mit, wenn ich Dinge die ich mit einem Template erledigen könnte im Code formulieren müsste. HTML-Tables + CSS in Kombination mit z.B. AngularJS ist sehr viel Übersichtlicher und da durch weniger fehleranfällig als z.B. ein TableView in JavaFX wo ich für jede Zeile und Spalte einen eigenen Renderer schreiben muss, wenn es über die einfache Darstellung eines String hinaus geht. Jeder Renderer implementiert ein bestimmtes Interface oder leitet einen schon vorhandenen Renderer ab, der wiederrum Code enthält den man nicht kennt und der aber in Wechselwirkung mit dem eigenen Code auch mal lustige Seiteneffekte haben kann. Eine Hintergrundfarbe zusetzen mit einer Angabe im style des TD oder dafür einen Renderer schreiben macht nicht nur zeitlich einen Unterschied sondern sorgt auch für viel mehr Code und weniger Übersicht.

Zu 4. Kommentare sind meist „böse“
Kommentare sind nicht verkehrt, aber meistens nutzlos und machen alles Unübersichtlich. Oft hört man "man braucht mindestens einen Kommentar der beschreibt wozu die Methode da ist. Weil wenn du nach einem halben Jahr dir deinen Code wieder ansiehst weißt du dass oft nicht mehr." FALSCH! Wer Methoden schreibt, die er nach 6 Monaten nicht mehr zuordnen kann, macht grundsätzlich etwas falsch. Zu glaube man würde vergessen was loadArticleById($id) macht, ist genau so weltfremd. Wenn man Methoden und Klassen richtig und beschreibend benennt, wird jeder der den Namen liest auch verstehen, was da passiert ohne die Implementierung betrachten zu müssen. Also keine Abkürzungen verwenden und lieber längere Namen verwenden. Wenn man das macht wird man auch loadArticleByCategoryIdAndMaxPrice($catId,$maxPrice) verstehen. Die ganz extremen wollen auch Kommentare an jedem Getter und Setter sehen, aber da wird nicht erklärt was das zu setzende fachlich bedeutet sondern nur das dort was gesetzt wird.
Also zu glauben das unnütze Kommentare besser sind als gar keine Kommentare ist meiner Meinung nach falsch.

Zu 5. Vor dem Code-Schreiben wissen, was der Code bewirken soll
Am Ende muss man die Anforderung verstanden haben. Da muss richtig Kommuniziert werden. Aber selbst wenn man es falsch versteht... niemand wird anfangen eine Methode zu schreiben, ohne zu wissen was am Ende dabei raus kommen soll. Allein wenn man sich den Methodennamen überlegt, wird man diesen Schritt ja schon erfüllen.

Zu 6. Code testen, bevor man ihn an das Qualitätsmanagement weitergibt
Entwickeln und Testen kann man nicht trennen. Wer Entwickelt muss, dass es auch testen. Alles andere würde auch unnötig Zeit kosten. Einen abschliessenden Test sollte dann jemand anderes machen. Aber die grundlegenden Tests kann man nicht auslagern.

Zu 7. Jeden Tag etwas neues lernen
Jeder kennt einen oder mehrere, der oder die mal vor Jahren etwas gelernt haben und seit dem alles immer damit lösen. Leute die immer Desktop-Anwendungen gebaut haben und Server irgendwie noch akzeptieren aber Webanwendungen für totalen Unsinn halten.
Das ist immer kein Problem, solange diese Personen nicht große Entscheidungen für ein Projekt zu treffen haben. Dann wird schnell ein Web-Client abgelehnt, weil JavaScript dynamische Typsierung nutzt. Allgemeine Tendenzen bei Entwicklungen sowie so komplett ignoriert und als Unsinn bezeichnet, wenn jemand mal was in die Richtung vorschlägt. Es wäre alles Unsicher, man hätte keine Erfahrungen, es müsste sich erst einmal zeigen ob es sich durchsetzen wird (das habe ich erst vor kurzen zum Thema Multithreading gehört), usw. Sich was neues mal wenigstens anzusehen, wird als Zeitverschwendung gesehen und mit den alten Sachen, die man schon immer nutzt, würde da ja auch irgendwie gehen. Auch wenn man die alte Technologie nutzen kann, die neuen
Konzepte bringen trotzdem oft etwas, und wenn es nur eine neue Sichtweise ist, warum etwas weiterhin so mach wie bisher.

Zu 8. Nicht vergessen: Code schreiben macht Spaß
Hier merkt man eindeutig, dass der Original-Text nicht aus Deutschland stammt. Programmieren ist eine erste Sache! Wer bei der Arbeit Spaß hat, der erledigt seinen Job ja offensichtlich nicht richtig.
Wenn man einfach und schnell zum Ziel kommt, macht es Spaß und die Qualität von Dingen die mit Spaß an der Sache gemacht werden ist meistens sehr hoch. Aber bei allen was auch so intern an Frameworks oder Libs entwickelt wird, ist leicht und schnell nie ein Argument warum etwas benutzen sollte. Leicht zu verstehen muss nichts sein, man könne ja die rudimentär vorhandene Anleitung lesen.
Anleitungen lesen ist genau so Spannen wie Kontoauszüge lesen.. was aber in Deutschland wohl immer noch als super lustige Freizeitbeschäftigung gilt. Ich habe genug interne Frameworks und Libs erlebt die einfach schrecklich zu benutzen waren. Sie machten was sie sollten, aber die Zeit um die benutzbar zu machen, galt gleich wieder als sinnlose Zeitverschwendung.
Man muss den Spaß am Programmieren sich bewahren und wenn das am Ende mit privaten Projekten umgesetzt wird.

Zu 9. Man kann nicht alles wissen
Das kann man nicht. Man muss nur wissen wo man suchen oder wen man fragen muss. Es gibt nur ganz wenige, die meinen, dass das was sie nicht wissen, damit auch gleichzeitig unbedeutend wird. Einen guten Programmierer macht nicht aus alle Klassen-Referenzen und Protokoll-Spezifikationen auswendig zu kennen. Aber wenn man etwas nicht weiß, kann es lernen und das ist leider auch immer Arbeit.

Zu 10. Best Practices hängen vom Kontext ab
Web-Anwendugnen brauchen andere Best Practices als Desktop-Anwendungen. Java ist anders als PHP. Es gibt immer viele Überschneidungen aber am Ende machen es auch gerade die kleinen Unterschiede aus. In Java sollte man den Application-Scope verwenden und nicht die Session, wenn man für die gesamte Anwendungen einmal etwas laden/parsen muss. In PHP sollte man die Session verwenden, weil es nichts auf Applikationsebene gibt.
Wenn jemand Best Practices erstellt und meint es wäre jetzt die Lösung für alles, kann man davon ausgehen, dass es mit etwas Glück für einen Fall passt oder eher für gar keinen.

Zu 11. Immer nach Vereinfachung streben
Wie schon weiter oben beschrieben wird leider oft einfach mit schnell verwechselt. Um eine einfache und gute Lösung zu finden braucht man Zeit und die sollte man sich nehmen dürfen. Die Zeit wird man am Ende wieder einsparen, weil der Code dadurch viel einfacher zu pflegen und zu erweitern ist.

Von Java zu PHP - Part 1 - Erste Gedanken

Den Großteil meiner Zeit habe und verbringe ich momentan noch mit Java. Tomcat, JavaFX, REST-Services und Clients. Neben JavaFX sehr verstärkt auch AngularJS. Nun wird es gegen Sommer dahin gehen, dass ich Java soweit hinter mir lassen werde (als Option halte ich mir Daten-Importer mit Multithreading frei.. weil da Java gegenüber einem PHP-Script doch weit vorne liegt).

Jetzt stellt sich mir die Frage wie man sich am besten in PHP einarbeitet.. wobei es eher weniger um PHP geht als um das Zend Framework 2. PHP kann ich... und ich bin der Meinung, dass wenn ich mir mein eigenes PHP Framework schreiben kann (das schon relativ viel kann und seit der Erweiterung um eine native REST-Unterstützung und das bald neue foglende Page-Format wirklich gut super für meine eigenen Apps auf Angular-Basis funktioniert), ich mich wohl auch ohne größere Probleme darin einarbeiten können sollte.
Viele Konzepte sind mir auch nicht neu und vieles er kennt man auch wieder, wenn man mal ein eigenes Framework geschrieben hat (ich bei JavaScript-Frameworks das selbe, wobei ich da beschlossen habe cJS zu Gunsten von AngularJS nicht mehr weiter zu entwickeln und cJS nur noch
für die kleinen gepackten Firefox OS Apps zu verwenden).

Erstmal muss ich heraus finden welche Umgebung zum Entwickeln unter Windows ideal wäre und man wenig per Hand nach installieren müßte. PHPStorm habe ich schon gestestet und das Generieren von Gettern und Settern ist schon mal super. Aber Eclispe ist schon mehr fertig eingerichtet.
XAMPP oder WAMP? WAMP scheint eine Zend Framework Installation mit Beispiel Modul mitzubringen.
Aber dann mal gucken ob als VM oder Installation. Eine VM mit Linux und Spiegeln des Verzeichnisses über WinSCP hätte natürlich schon seine Vorteile.

Aber meien Feststellungen bis jetzt ist, dass das Zend Framework 2 mit seinen Namespaces sehr viel dichter an Java dran ist, als die 1.x Version oder auch mein eigenes aoop-Framework.. das bald mal umbenannt wird.

Aslo werde ich erstmal in den nächsten Tagen, analysieren welche Umgebung für mich die beste ist und sich am einfachsten Installieren läßt.

Porting cJS zu AngularJS

AngularJS ist toll, das steht ausser Frage, aber an einigen Stellen, stört es doch sehr,dass man auch einer sehr abstrakten Ebene arbeitet und nicht direkt mit nativen Elementen und Events arbeiten kann, bzw etwas tun muss um an diese heran zu kommen.

Nun habe ich anfangen mein cJS als AngularJS-Direktiven zu portieren, um das beste aus beiden Welten zu haben. Hier erstmal die Umsetzung von cjs-binding-element. Damit wird das aktuelle Element in das über nge-element angebene Feld des $scope geschrieben.


var nativeElement=function(){
return {
link:function($scope,el,attrs){
var value=attrs.ngeElement;
console.log("init nge-element: "+value);
if(el){
var ang_element = angular.element(el);
var raw_element = ang_element[0];

$scope[value]=raw_element;

}
else{
console.log("el is null");
}
}
};
};

Neue BottleSpin Version

Neue Version meiner "erfolgreichsten" Firefox OS App (>4000 Installationen). Die App ist eigentlich sehr primitiv und simuliert eine sich drehende Flasche. Jetzt kann man aber auch Aufgaben eingeben, die auf-popen, wenn die Flasche stopt.
Das Interessanteste sind bei der App die CCS3-Animations, die per JavaScript angepasst werden, um das drehen bis zu einem bestimmten Punkt umzusetzen. Das drehen über ein Timeout oder Intervall in Javascript war nicht so schön wie die CSS3-Animation.

BottleSpin-Seite im Firefox Marketplace

Neue Version wartet noch auf Freischaltung und sollte zum nächsten Wochenende hoffentlich dann
freigeschaltet sein.

JavaScript und Enterprise-Anwendungen

Wenn man sich etwas mit JavaScript beschäftigt und auch sich mit Java gut auskennt, lernt man schnell die Vorteile von nicht statischen Typen zu schätzen (kein aufwendiges Parsen und Casten bei REST-Operationen auf Basis von JSON, etc). Aber manchmal fehlen Typen und so doch etwas.. hier wird sehr gut erklärt wie man moderne und struktirierte JavaScript Anwendungen schreibt, die wartbar beleiben und auch in Unternehmen dann vielleicht akzeptiert werden.

AngularJS, require.js, JQuery, TypeScript, Bower.. wird alles mal kurz angesprochen und erklärt.

Video bei jaxenter.de

HipHop vs Quercus

Schade dass es die HHVM nicht für Windows gibt, aber dafür sieht Quercus sehr gut aus. Ein kleines Script zum Hochladen von Dateien lief sofort.. demnächst wird mal aoop damit getestet. Damals mit Java-Bridge lief es mal ganz gut auf einem JBossWeb. DB Connection-Pools mit PHP wären schon eine tolle Sache.

Tine 2.0 Account wiederherstellen

Nachdem man in Tine 2.0 einen Account aus einem alten DB-Backup per Hand über SQL wiederherstellt, muss man in GROUP_MEMBERS den Account auch wieder hinzufügen und die Contact-Id überprüfen, sonst kann man den WebDAV-Service für alle Benutzer lahmlegen!

Entity not im WebDAV-Service deutet auf so ein Problem hin.

WebM-Maker.com und WebWorker

WebWorker sind cool! Mit Whammy.js

Nach meinen ersten Erfahrungen mit WebWorkern beim http://www.webworkercontest.net/ hatte ich mich lange Zeit nicht mehr damit beschäftigt. Doch als ich anfing den WebM-Export in http://www.mp4togif.com zu implementieren, musste ich auf eine 3rd-Party Lib zum erstellen von WebP-Bildern zurück greifen, um am Ende mit Whammy.js das Video erstellen zu können. Das war für den Firefox zuviel und die Script brachen regelmässig ab, da diese zulange liefen (Chrome konnte zum Glück direkt WebP aus dem Cavnas als Data-URL erzeugen).
Das Script schnelelr zu bekommen war nicht groß möglich und es auf asm.js zu optimiren ging auch nicht, da mir doch etwas die Erfahrung damit fehlte. Also am Ende kamen mir die WebWorker wieder in den Kopf. Der Test lief schon sehr gut. Leider kann man kein Canvas-Context im WebWorker verwenden, weswegen der Chrome die WebWorker nicht verwendet sondern nur alle Browser, die auf die Lib angewiesen sind.
Aber momentan bin ich mehr als zufrieden. Keine Abbrüche mehr.. auch bei Laufzeit über einer Minute. Das Updaten des DOMs macht keine Probleme und so funktioniert der Dialog mit der Status-Anzeige auch wieder ohne Probleme.

Das Konzept ist sehr einfach. Ein Post mit dem Image-Data wird an den Worker geschickt (aus einer Schleife heraus) und dieser wandelt das Bild in ein Webp im Data-URL um und schickt es zurück. Das Bild wird ein Array geschireben (der Index wurde mitgegeben).
Wenn alle Bilder wieder da sind, werden die Webps in einer Schleife Whammy.js hinzugefügt und der rendert dann das Video.
Was sehr viel schneller geht als das Erzeugen der einzelnen Bilder.

Wenn man also viel zu rechnen hat, sollte man auf jedenfall WebWorker verwenden.

Zu finden ist das Projekt WebM-Maker.com nun unter http://www.webm-maker.com

aoop 0.6 + Start von cJS

zum Jahres Ende kommt mal ein Update von aoop auf 0.6, was sich jetzt immer mehr zur Middleware für JS-Webapps entwickelt. Die Neuerungen sind:

* mehr Singletons für bessere Performance
* seperates Theme für das Admin-Panel einstellbar
* REST-Services Unterstützung im Kernsystem (definierbar über module/desploy/rest.xml)
* Login Sicherheit (Sperrung für 5min nach 3 gescheiterten Loginversuchen)
* Begonnen requireJS für JS-Module zu integrieren
* schon mal der Begin einer Entwickler-Dokumentation um selbst aoop als Middleware zu verwenden.

Download

Neben bei entsteht ein eigenes kleines JS-Framework, das Controller-Objekte für Views und passendes Databindung ermöglicht. Kein Templating.. dafür aber sehr klein und Übersichtlich. Erste Test-App gibt es schon damit:

LINK

QRCodes + Alcatel

Leider haben sehr günstige Smartphones ein Problem.. die Kamera ist so schlecht, dass das Lesen von QRCodes teilweise nicht funktioniert. Der JS-Code erkennt die Codes auf Beispielbildern, auf Fotos vom Samsung Wave 1.. nur beim kleinen FirefoxOS Smartphone will er nicht. Die Qualität ist aber auch wirklich nicht so toll.. gerade die Ecken und Kanten sind oft sehr unscharf.

ADB Helper

Wenn ein Firefox OS Smartphone nicht im App-Manager erkannt wird, einfach den ADB-Helper noch mal neu installieren. Hat bei mir jetzt schon 2 mal geholfen.

Firefox 1.4 auf Alcatel

Am Ende hab ich jetzt doch das Alcatel One Touch Fire per Hand auf Firefox OS 1.4 gebracht. Läuft soweit auch sehr gut. Keine Probleme mit Akku oder so, aber ganz so geeignet für den normalen Nutzer ist das Selbst-Flashen dann doch nicht. Die Treiber über den Geräte Manager zu installieren ist an sich noch ganz einfach. Batch-File zum Flashen starten und Ein/Aus-Taste + die - Zaste für die Lautstärke drücken,
wenn der Startbildschrim auf dem Handy auftaucht ist auch nicht so schwer.
Dann läuft es durch und blieb bei mir mit einem Fehler hängen. recovery.img wurde nicht gefunden. "something went wrong".. ok.. Handy reagiert dann auch nicht mehr, oder ich hätte 10min warten sollen. Akku raus und wieder rein. Handy startet und möchte dann neu eingerichtet werden. Kurzer Blick ins Menü.. 1.4 ist trotzdem fehlerfrei installiert worden.

Was man nun noch tun muss:

* Entwickler-Menü aktivieren
* darin den Hardware-Composer abschalten. Dann läuft auch Wormy wieder ohne zu extremes Ruckeln
* USB-Speicher wieder aktiveren. Sonst wird das Handy zwar als Laufwerk erkannt, aberman kann nicht drauf zu greifen. Verwirrend

* Wenn gewünscht noch mal die Debugger-Einstellungen anpassen.

Am Ende lief es dann auch mit dem App-Manager im Firefox und ich konnte Apps zum Handy pushen.

Link zu einer Beschreibung zum Update
weiterer Link




Older posts:

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?