Blog: Latest Entries (15):


Zend Framework 2 und Injections

Meine erste Reallife-Erfahrung mit dem ZF2 und Models war eine eher weniger positive. Das TableGateway braucht unbedingt den Service-Manager bzw den DB-Adapter daraus. Meine Vorgängerin hat sich dazu entschlossen eine Basis-Entität zu bauen, die wiederum von TableGateway ableitet und man so relativ einfach save() und
load()-Methoden in die Model-Klasse einbauen konnte. Der Service-Manager wurde dann durch den Constructor der Model-Klasse durch gereicht bis man den Constructor des TableGateways mit dem DB-Adapter aufrufen konnte. Auch zwischen durch wurde der Service-Manager immer mal benötigt. Weil.. man ohne ihn keine Instanz einer Model-Klasse bekommen konnte.
Um so eine Instanz zu bekommen wurde eine Factory verwendet:


'service_manager' => array(
'factories' => array(
/** Modelle laden */
'sModel' => function($sm) {
$model = new S\Model\S($sm);
return $model;
}
),

/**
* By default, the ServiceManager assumes all services are shared (= single instantiation),
* but you may specify a boolean false value here to indicate a new instance should be returned.
*/
'shared' => array(
'sModel' => false
)
)


Jedes mal aber die Factory zu bemühen eine neue Instanz zu erzeugen ist nicht gerade performant und mit den ganzen Ableitungen ist es auch sehr unübersichtlich. Ich wollte einfach schnell eine Instanz einer Model-Klasse haben und nicht ein riesiges Object bekommen. Also sowas wie in POPO .. eine POJO in PHP eben.
Ein Cosntructor ohne Argumente und eine Klasse nur mit Attributen ohne Logik. Also find ich an mir zu überlegen, ob diese ganzen Ableitungen überhaupt nötig sind oder man mit der Dependency-Injection nicht was viel besseres bauen könnte.

Ich bin dann schnell zu DAOs gwechselt. Die Factory injeziert einmal den Service-Manager und kann immer die selbe Instanz des DAOs liefern. Die DTO/Model-Klasse ist schön klein und beim Befüllen in Schleifen viel schneller als eine Intanz über die Factory anfordern zu müssen.

Meine Lösung ist momentan:


'service_manager' => array(
'factories' => array(
'sDAO' => function($sm) {
return new S\Model\DAO\SDAO($sm);
}
),
)



class SDAO extends TableGateway{
private $_tableName="s";
private $_sm=null;

public function __construct($serviceManager){
$this->_sm=$serviceManager;

parent::__construct(
$this->_tableName,
$serviceManager->get('dbAdapter')
);
}

.........
}


Man kann nun so damit Arbeiten:

echo "name: ".$this->getServiceLocator()->get('sDAO')->loadS($id)->getName();


Das ist eine der Stellen wo Konzepte aus de Java-Welt perfekt mit PHP und dem ZF2 zusammen arbeiten und einen großen Vorteil bringen.

MP4 to Gif Update

So.. nach ich gelesen habe, dass Facebook GIFs zulassen will und man für MP4 bald zahlen muss und WebM damit vielleicht interessanter wird, habe ich MP4 to Gif mal geupdatet. Das Ergebnis wird jetzt nicht mehr in einem neuen Fenster geöffnet (was man ja immer extra bestätigen mußte, damit das Fenster geöffnet werden durfte) sondern in einem eigenen Dialog.


Canvas Bilder rotieren

Vor dem Upload ist es oft wünschenwerts ein Bild drehen/rotieren zu können.

Ich hatte mich damals doch sehr damit rumgeärgert, um den richtigen Mittelpunkt bei Rotationen heraus zu bekommen.
Hier ist meine Lösung für Rotationen um 90,180,270 Grad (select oder durch Auf- und Abrunden kann man das sicher stellen,
dass keine anderen Werte eingegeben werden).


var rotate=parseInt(this.rotate);

if(rotate>0){
if(rotate!=180){
ctx.canvas.width=height;
ctx.canvas.height=width;
}
else{
ctx.canvas.width=width;
ctx.canvas.height=height;
}

ctx.save();
ctx.translate(ctx.canvas.width/2,ctx.canvas.height/2);
ctx.rotate(((Math.PI / 180)*rotate));
ctx.drawImage(this.img.image,0-(width/2),0-(height/2),width,height);
ctx.restore();
}
else{
ctx.canvas.width=width;
ctx.canvas.height=height;
ctx.drawImage(this.img.image,0,0,width,height);
}

Multi-Threading in PHP (Thread-Pool)

Gerade beim Laden großer Datenmengen wie Lagerstrukturen oder bei Exporten ganzer Datenbestände, kommt man schnell in Bereiche, wo das Laden und Aufbereiten mehr als ein paar Minuten dauern kann. Bei normalen Desktop-Programmen und Skripten ist das nicht ganz so relevant. Wenn man aber im Web-Bereich arbeitet, kann es schnell zu Problemen mit Timeouts kommen. 3 Minuten können hier schon ein extremes Problem sein. Asynchrone Client helfen hier, aber keiner Wartet gerne und Zeit ist Geld.

Es gibt dann einen Punkt, wo die Zeit pro zu ladenen Element sich nicht mehr weiter verringern lässt. Hier hilft dann nur noch die Verarbeitung der einzelnen Elemente zu parallelisieren. Bei Java gibt es den ExecutorService, in JavaScript die WebWorker und in PHP gibt es pthreads. Es ist nichts für Leute mit einem Shared-Hosted Webspace, weil man eine Extension nach installieren muss.

Installation:
http://php.net/manual/de/pthreads.installation.php

(es sollte die erste DLL reichen)

Hier ist ein kleines Beispiel wo eine Liste von MD5-Hashes erzeugt werden soll. Die Threaded-Variante lief bei mir meistens fast doppelt so schnell
wie die einfache Variante mit der Schleife.

<?php
$files=scandir("c:/xampp/htdocs/files");
$start=microtime();
$cnt=count($files);
$result=array();
for($i=0;$i<$cnt;$i++){
$file=$files[$i];
if($file!="." && $file!=".."){
$result[count($result)]=md5(file_get_contents("c:/xampp/htdocs/files/".$file));
}
}
echo "bench (loop): ".(microtime()-$start)."<br>";

class PWorker extends Collectable{
public $workload;

public function __construct($work){
$this->workload=$work;
}

public function run(){
$this->workload=md5(file_get_contents("c:/xampp/htdocs/files/".$this->workload));
$this->setGarbage();
}
}

$result=array();
$start=microtime();
$p = new Pool(4);
for($i=0;$i<$cnt;$i++){
$file=$files[$i];
if($file!="." && $file!=".."){
$p->submit(new PWorker($file));
}
}
$p->shutdown();

$p->collect(function($checkingTask){
global $result;
$result[count($result)]=$checkingTask->workload;
return $checkingTask->isGarbage();
});
echo "bench (4 threads): ".(microtime()-$start)."<br>";
?>


Man kann also auch in PHP moderne Anwendungen schrieben die Multi-Core CPUs auch wirklich ausnutzen können und muss sich hinter Java in den meisten Bereichen nicht mehr verstecken.

Kleine Firmen und IT - Eine Hilfestellung

Nicht jede Firma die gegründet wird ist eine IT-Firma oder ist in dem Bereich Bereich bewandert. Oft haben diese Firmen ganz andere Aufgaben, Sorgen und Probleme am Anfang als sich über IT-Infrastrukturen, Server und ihre Daten Gedanken zu machen. Meistens reichen die Überlegungen dahin, dass man eine Homepage, Email-Adressen und PC braucht.
Für Firmen mit 2-3 Mitarbeitern reichen diese Überlegungen auch meistens und weiter IT-Themen und -Probleme erledigt man einfach neben her. Bei einer Person reicht ein Standard PC mit DSL, ein kleines Homepage-Paket bei einem der üblichen Hoster (1und1 oder Strato) und die übliche Software (Libre- oder MS Office, ein Browser und ein Email-Programm wie Exchange oder Thunderbird).

Wenn man jetzt aber doch gleich am Anfang 10 Mitarbeiter hat, sieht die Welt wieder ganz anders aus. Aus dem Wunsch nach einer Homepage entwickelt sich dann die Frage: "Kann ich mich dann auf der Homepage auch einloggen und meinem Kalender und eine Emails einsehen?". In der alten Firma lief die Groupware im Browser und alles was im Browser läuft ist eben für viele eine Homepage.
Eine Groupware im Browser hat extreme Vorteile und wenn alles direkt über eine öffentliche URL zu erreichen ist (also so zu sagen in der Cloud liegt) löst es schon mal viele Probleme bei den Mitarbeitern, die bei Kunden sind, von Zuhause aus arbeiten oder auch alles immer auf ihrem Smartphone im Zugriff haben möchten. Auch ist die Administration einfacher, da auf den Client PCs nichts installiert werden muss und man somit nicht auf Betriebssystem, Updates, Laufzeitumgebungen und so achten muss. Ein relativ aktueller Webbrowser reicht.

Das erste Problem kommt direkt mit dem Wunsch nach einer Groupware. Ein kleines Homepage-Paket mit Shared-Hosting für ein paar Euro im Monat reicht hier meistens nicht aus, weil die Groupware-Lösungen gerne noch zusätzliche PHP-Erweiterungen hätten, was anderes als PHP benötigen oder auch der Hoster keinen direkten SMTP-Versand für Emails anbietet und ein Fallback auf die email-Funktion von PHP nicht wirklich den Anforderungen genügt. HTTPS ist dann auch nochmal ein anderes Thema...

Das ist kein so großes Problem, wenn nicht schon ein Paket und Domains geschafft wurden und nun weiterhin davon ausgegangen wird, dass der günstige Preis gehalten werden kann. Es ist schwer klar zu machen, dass Email-Adressen und alles für eine einfache Homepage vorhanden ist, aber man um beides zusammen zu bringen mehr Geld ausgeben müsse.
Außerdem ist mir auf gefallen, dass bei den günstigen Angeboten gerne auch mal Ausfälle mit zu berücksichtigen sind. Einmal eine halber Tage Emails weg, dann noch mal an einem anderen Tag ist die Homepage nicht zu erreichen. Wenn die Groupware nicht verwendet wird (weil Thunderbird auf den Desktops angenehmer ist) oder mal die Kalender nicht synchronisiert werden können, ist es nicht ganz so wild. Aber für eine Firma die mit Kunden kommuniziert oder wichtige Unterlagen per Email erhält, ist ein halber Tag ohne Email schon nicht wirklich schön.

Tine 2.0 hat sich da als relativ gute Groupware heraus gestellt, wenn man nur einen einfachen Webspace mit MySQL-DB hat. Man sollte keine Wunder bei der Leistung erwarten und es dauert teilweise bis z.B. CalDAV zum Laufen bekommen hat, aber es ist eine brauchbare Lösung für solch ein Problem und in der freien Variante auch wirklich noch sehr leistungsfähig, wenn man hauptsächlich Email und Kalender verwenden möchte.

Wenn wir nun den Teil erledigt haben geht es in die Firma und die dort vorhandene Infrastruktur. Auch hier fangen die Probleme an, wenn schon PCs,Notebooks und ähnliches gekauft wurden.
Denn auch hier wird aus der Sicht des normalen Anwenders gekauft. Ein Notebook gilt als cool, PCs kauft wo gerade mal einer günstig ist, weil am Ende sehen die zwar unterschiedlich aus sind aber ja an sich gleich. Es gibt sehr verlockende Angebote von gebrauchten Rechnern bei EBay, die kommen dann vorinstalliert mit Windows bei einem an. Spätestens hier sollte man sich als unbedarfter Anwender/Firmen-Chef/Verantwortlicher Hilfe holen. Das erspart einen später viel Stress und Kosten. Man muss immer davon aus gehen, wenn man am Anfang etwas mehr Geld investiert, spart man es in späteren Zeit wieder ein.

Bei solchen PCs gilt es zu beachten:
* ist Windows nur installiert oder ist wirklich eine Lizenz dabei? Wenn ja, sollte man etwas in der Hand haben, dass es auch beweist! (Ebay-Verkäufer muss Unterlagen und Rechnungen unbedingt mitliefern)
* ist der Admin-Account aktiviert und ist ein Passwort vergeben, dass der IT-Verantwortliche und eine Person vor Ort (falls IT von Extern kommt) kennt und sonst niemand?
* hat jeder Benutzer einen eigenen Account mit einem Passwort, dass nur er kennt? Wütende Ex-Mitarbeiter können bei kleinen Firmen schon einen großen Schaden anrichten, wenn sie bei nicht geschützten PCs einfach mal eine unbekanntes Passwort setzen! (Hier hätte zur Not der Admin-Account geholfen, wenn er aktiviert worden wäre)
* einmal feststellen, ob die Rechner reparierbar sind. Also ob Festplatten im Notfall einfach entnommen werden können und es normale Netzteile sind, falls mal eins ausgetauscht werden muss.

Wenn vor dem Bestellen geplant wird:
* baugleiche PCs und baugleiche Notebooks kaufen.
* pro Standort mindestens einen Ersatz-PC haben, damit in Falle eines Ausfalls die Person schnell weiter arbeiten kann.
* ein einheitliches Festplatten-Image aufsetzen (Betriebssystem mit Admin-Account, VNC, Benutzer-Programmen, etc.)
* und auch gleich dann Werkzeug, Kabel, USB-Stick und Rohlinge mit bestellen, wenn man schon mal dabei ist

Nun hat jeder Mitarbeiter seinen PC. Bei mehr als 2 PCs kommt jetzt das Problem mit dem Datenaustausch. Emails zu verwenden (am Besten noch über den Hoster der Homepage) kann mit dem Datenschutz Konflikte verursachen (Verschlüsselung und so). Also wird es am Besten über das LAN getauscht. Wenn man nun Außenstellen hat, müssen diese per VPN angebunden werden. Also muss es auf jeden Fall ein DSL-Anschluss für Firmen sein.. nichts was sonst für private Kunden gedacht ist.
Meistens hat man dann auch WLAN. Das ist für Smartphones (man will ja nicht zu viel Telefonkosten darauf verursachen) und Tablets praktisch bis notwendig. Notebooks, PCs und Drucker sollten, wenn sie am Arbeitsplatz stehen immer mit Kabel angeschlossen sein. Kabel ist weniger fehleranfällig und schneller auch bei vielen Geräten. Wenn man keine riesigen Dateien wie Filme oder CAD-Files kopieren muss oder VLANs möchte, reicht 100Mbit vollkommen aus und 8-fach Switches gibt es ab 10 Euro. Auch bessere 16-fach Switches sind nicht ganz so teuer. Wichtig ist auch hier ein paar Ports in Reserve zu haben. Wenn WLAN nicht bis in die letzte Ecke reicht einfach einen günstigen WLAN-Repeater kaufen. Die funktionieren wirklich gut und erhöhen den Radius enorm.

Wenn man an den Arbeitsplatz-PC sparen möchte, dann lieber überlegen, ob man nicht Libre-Office an Stelle von MS Office verwendet oder ob ein Linux-System wie Ubuntu nicht auch für die Mitarbeiter geeignet ist. Aber das hängt auch sehr von der anderen Software ab, die verwendet werden soll. (In 90% aller Fälle würde so ein Linux-System aber ausreichen, gerade wenn die Software in der Cloud oder anderweitig im Browser läuft).

Jetzt kommt das harte Thema. Da wird man den Firmen-Chef schocken. Es geht um einen Server und seine Kosten. Der Server soll als Fileserver agieren und am Besten noch die Anwender-Profile speichern. Eigener Email-Server und Homepage und Groupware von dort aus zu betreiben ist erst einmal nicht so wichtig. Aber falls mal ein Email-Archiv benötigt wird kommt es auch noch auf einen zu und da kann man ja schon mal zukunftssicher Planen. Mehrere physikalische Server in einer kleinen Firma sind einfach nicht nötig, da die Server sich die meiste Zeit langweilen werden. Also VMs verwenden. Da braucht man ein System das 3-4 VMs laufen lassen kann, genug Festplattenspeicher hat, wo man remote die VMs überwachen kann und dann am Ende noch einfach Sicherungskopien erstellen kann. So etwas wäre ideal.
So etwas gibt es auch von QNAP. Mit Festplatten kommt man schnell auf über 3000 Euro. Das ist im Grunde nicht viel, für das was es leistet (und für eine kleine Firma wird es reichen). Außerdem braucht man nicht zwingend ein 19"-Rack oder komplexe Kühlungen. Auch die Administration scheint so einfach zu sein, dass man in Notfällen für kleine Dinge wie eine VM neu zu starten, auch einen der Mitarbeiter anlernen kann. 4TB würde am Ende auch reichen.

Linux mit Samba kann einen kleinen Windows-Server ersetzen (wenn man kein Exchange braucht). Aber auch sonst sind Windows-Serverversionen nicht mehr so teuer. Turnkey-Linux bietet für solche Zwecke auch VM-Images direkt an. Nichts für den normalen Anwender auch wenn es eine Web-GUI gibt. Hier muss einfach jemand sein, der sich mit sowas auskennt (Linux und/bzw. Firmennetzwerke an sich).
Da hilft ein jugendlicher Sohn eines Mitarbeiters oder so. Da muss jemand bezahlt werden. Soll Datenschutz gewährleistet sein, dann muss auch entsprechend bezahlt werden. Da es aber kein Vollzeitjob ist, ist >100 Euro/h auch nicht ganz so schlimm, auch wenn er sich erst einmal nach sehr viel Geld anhört. Gute Dienstleistungen kosten und Probleme mit Arbeitsausfall kosten am Ende immer mehr.
Ist wie mit einem Raid-System. 2 Festplatten sind teuer als eine, aber die 2. Festplatte ist günstiger als wenn da jemand 4h versucht Daten zu retten oder noch eine Firma dafür beauftragt werden muss.

Am Ende ist noch die Frage nach der Datensicherung. Hardware, Strategie und Lagerung. Ich mag BD-Rohlinge. Bänder sind auch super, aber etwas komplexer in der Handhabung. Archiv-Lösungen von Sony sehen auch gut aus sind aber sehr teuer. Aber auch hier immer ein zweites Laufwerk vorhalten (das ist bei BluRay sehr günstig). Gut zu erklären ist das Problem der Lagerung mit Feuer und Überschwemmungen. Natürlich abhängig vom Ort. Aber Feuer kann immer ausbrechen, egal wie gut alles abgesichert ist. Auch wenn alles versichert ist, will man ja keine Daten verlieren.
Hier kommen noch mehr Kosten hinzu, aber auch hier sollte man sich vorher Gedanken machen und planen und nicht erst reagieren, wenn was passiert ist.
Es ist auch absolut keine Lösung die Mitarbeiter ihre Daten vom PC auf einen USB-Stick sichern zu lassen. Alles im Profil ablegen und das auf dem Server speichern und dann Sicherungskopien vom Server erstellen. Auch wenn mal ein PC kaputt geht, kann er einfach ausgetauscht werden und der Mitarbeiter meldet sich wieder an und arbeitet im idealen Fall da weiter wo er aufgehört hat.
Ausfälle von PCs und Notebook werden dadurch sehr viel weniger schlimm und verursachen nicht mehr als die Reperaturkosten (kein Arbeitsausfall, niemand der Daten von defekten System retten muss).

Wenn man nun mit so einer Aufgabe betraut wird, konnte ich hoffentlich etwas helfen, dass man eine kleine Liste hat, auf was man achten muss. Wenn man selbst eine Firma gegründet hat und das alle eigentlich selbst machen wollte, weil es erst einmal nicht so komplex aussah, sieht man jetzt hoffentlich, dass man sich wenigstens einmal mit einer kompetenten Person aus dem Bereich unterhalten sollte, bevor man etwas in Angriff nimmt.
Ich musste vieles hier erst einmal lernen, im Besonderen, dass solche Probleme auch wirklich auf treten, wie sie hier teilweise beschrieben sind. Man darf den Leuten, die so etwas machen, auch keinen Vorwurf machen, da sie aus ihrer Sicht das Beste tun. Ihnen fehlt die Erfahrung in solchen Komplexen Systemen, um solche möglichen Probleme zu erkennen.

Zend Framework nach 3 Tagen

Das Zend Framework 2 ist das JEE der PHP-Welt. Endlos viele config-Files mit denen man so viel falsch machen kann und man erstmal nicht versteht, wo man was einstellt und welche Einstellungen zusammen hängen, und warum die Verzeichnisstruktur für Module so aussehen muss, wie sie aussieht. Aber mit Kopieren von vorhanden Dingen und etwas Testen kommt man doch zum Ziel und einfache Dinge sind dann doch schnell erledigt. Aber ACL und Resources sind genau so schlimm wie Principales und JAAS.. wenn es einmal läuft.. am Besten so lassen und nicht mehr anfassen :-)

Entwicklungsgeschwindigkeit und Probleme

Nachdem ich noch bei einem Abschiedsessen mit meinen alten Kollegen, doch noch mal auf der Thema der Entwicklungsgeschwindigkeit und Qualität an dem Abend gekommen bin, werde ich mir dieses Thema hier doch mal annehmen. Es ist ein kompliziertes Thema, dass keine richtige einzelne richtige Lösung kennt, aber dafür Raum für viele Fehler bereit hält. Ich stütze mich jetzt einfach mal auf 10 Jahre Erfahrung in der Softwareentwicklung und der Mitarbeit in Teams, die eben auch mit diesen Problemen zu kämpfen hatten und auch noch haben. Denn auch wenn man Lösungen kennt, muss man den Weg immer noch gehen.

Neben der verlorenen Zeit stellen diese Probleme auch für die Entwickler eine nicht zu unterschätzende Belastung da.

Frameworks vs eigenen Code

Einer der größten Fehler wurde gleich am Anfang gemacht. Es sollte schnell los gehen und da wurde auf Abstraktion und der Suche nach vorhandenen Lösungen verzichtet. Es wurde alles auf der untersten Ebene begonnen. Also keine Kapselung oder ähnliches. Entitäten-Objekte wurden direkt vom Service an den Client geschickt. Eine allgemeine Kommunikationsstruktur zwischen den beiden wurde nicht entwickelt.
Oberflächen und Logik wurden einfach zusammen in eine Klasse geschrieben. DTOs, DAOs und DataBindung waren aber schon da keine neuen Konzepte mehr. Das alles führte dazu, dass man sich mit EJB und SWT jeweils auf der untersten Ebene auseinander setzen muss, selbst um einfache Oberflächen und Service zu implementieren.
Es entwickelte sich zu der Vorgehensweise, dass man es lieber alles schnell selbst machten sollte, als externe Frameworks und Libs zu verwenden. Wenn man nur genug eigene Dinge implementieren würde, würde am Ende schon ein fertiges Frameworks dabei heraus kommen. Das Ein Framework in seiner Gesamtheit durchdacht sein muss und eine gewisse Konsistenz in der Benutzung und im Verhalten zeigt, war dabei egal. Die Idee, jeder Entwickler würde mal so nebenbei für sich ein oder zwei Komponenten entwickeln und wenn man nach einem Jahr alles zusammen wirft, würde ein fertiges GUI-Framework heraus kommen, war zu verlockend und so wurden auch alle komplizierteren Ansätze, die so etwas beachten wollten, als nicht notwendig erachtet.

Wenn man ein auch nicht mehr ganz so neues AngularJS nun betrachtet, dass einmal für die GUI-Elemente auf HTML5 setzen kann und für die Oberflächen eine sehr gute und flexible Template-Engine mitbringt, merkt man erst wie viel Zeit allein mit dem Kampf des SWT-Gridlayouts oder der selbst gebauten Input-Box für Zahlenwerte verbracht wurde.

Das Problem, dass zu viel grundlegende Technologie selbst entwickelt wird und dann alles zu sehr mehr der eigentlichen Anwendungslogik verzahnt wird, ist in so fern ein wirklich großes Problem, als dass hier sehr schnell sehr viel Code produziert wird und durch die fehlende Abstraktion Änderungen mit fortlaufender Zeit immer schwieriger werden. Am Anfang müsste man einige Klassen neu schreiben, aber ein Jahr später, kann man schon die halbe Anwendung weg werfen. Ob man das vielleicht auch tun sollte, werde ich später noch mal ansprechen.
Jedenfalls braucht man entweder jemanden aus dem Team der das Framework für das Team(!) entwickelt und auch die Zeit dafür bekommt oder aber man muss einige Woche am Anfang einplanen, um ein geeignetes Framework zu finden.

Hier lauter schon der nächste Fehler. Oft wird eine Person dazu abgestellt, sich über Frameworks zu informieren und eins oder zwei vorzuschlagen. Da aber viele Entwickler damit arbeiten sollen, sollten auch alle bei dem Findungsprozess mit wirken können. Jeder achtet auf andere Dinge und erkennt Vor- oder Nachteile wo andere nur eine weitere aber nicht so wichtige Komponente sehen. Und auch hier werde ich auf die Probleme,
die hierbei entstehen können, später noch mal eingehen. Es hängt alles zusammen und beeinflusst sich gegenseitig, so führen Probleme zu anderen Problemen.. vielleicht.


Vertrauen in die Technologie muss da sein

Gehen wir mal davon aus, dass wir nun jemanden haben, der das Framework entwickelt oder man eines gefunden hat, das auf dem Papier echt toll aussieht, aber viele Fehler hat und Lösungen dafür kaum zu finden sind.
Das kann an Fehler, einer schlechten Dokumentation oder einem eher ungewöhnlichen Benutzungskonzept liegen. Aber am Ende besteht das Problem, dass die Entwickler dem Framework nicht vertrauen. Das für dann oft auch zu Punkt 1 zurück, in dem dann lieber eine Funktionen und Methoden geschrieben und verwendet werden, weil man diesen mehr traut als dem Framework. Weiter werden dann mindestens 2 Entwickler das Selbe nochmals neu implementieren, aber natürlich dann so verschieden, dass man nicht eines davon wieder abschaffen könnte. Wenn diese mindestens Doppelung an gleicher Funktionalität auffällt, muss das Framework so angepasst werden, dass es mindestens seine und die beiden anderen Funktionsweisen abbilden kann und hoffentlich dabei nichts kaput geht. Dadurch haben wir dann wieder eine große Inkonsistenz Framework, weil es plötzlich Sachen machen soll, die einfach anders sind und anderer Herangehensweisen haben. Weil es inkonsistent geworden ist kommen die Entwickler nicht mehr wirklich damit klar und schreiben sich im besten Falle eine eigene Abstraktionsschicht für das Framework, oder versuchen es wieder zu umgehen, was dann am Ende mindestens die 4. Implementation für die selbe Funktionalität mit sich bringt.
Ich ziehe hier mal wieder AngularJS als positives Beispiel heran. Wenn man ein Problem hat, wird man eine Lösung im Internet finden. Irgendwer hatte das Problem schon und irgendwer hat den Fehler schon behoben, die richtige Vorgehensweise noch mal erklärt oder eine passende Direktive geschrieben. Es stellt sich nicht die Frage, ob etwas an sich möglich ist. Es ist möglich und man versucht es erst einmal und wenn es nicht funktioniert, guckt man eben wie die anderen es gelöst haben. Im Notfall gibt es immer noch das native JavaScript mit document.getElementById().
In Java versuchen Frameworks einen oft komplett in sich gefangen zu nehmen und alle anderen Wege als den eigenen unmöglich zu machen. Durch Interfaces die eingehalten werden müssen, klappt es ganz gut. Das verhindert, dass andere Lösungen entwickelt werden, die das Framework um gehen. Aber es schränkt oft auch mehr ein als es hilft. Das Framework soll dem Entwickler helfen und nicht über ihn bestimmen. Als Entwickler mag man es nicht, nur die Konzepte und Denkweisen eines anderen unterworfen zu sein, der, wie man schnell merkt, das ganze nicht mit dem Anwendungsfall im Hinterkopf entwickelt hat, den man selber gerade umsetzen möchte.

Deswegen muss ein Framework alles bieten und so flexibel sein, dass auch Abweichungen vom Konzept möglich sind und sich direkt ins Framework integrieren lassen, dass es zu einem Teil des Frameworks wird. So wird verhindert, das Entwickler das Framework umgehen oder eigene Lösungen einbauen, die zwar den Anwendungsfall entsprechen aber sich komplett als Fremdkörper im Framework präsentiert. Das wichtigste ist aber eine gute Doku und eine zentrale Stelle wo man Probleme zusammen beheben kann. Für ein eigenes Framework ist daher ein Forum im Intranet vielleicht gar nicht so verkehrt. Man kann suchen, nachlesen und diskutieren. Auch weiß der Entwickler des Frameworks, wo er die Dokumentation verbessern oder nochmal überarbeiten sollte. Auch werden Ansätze etwas neu zu schreiben oder zu umgehen schneller erkannt und es kann mit Aufklärung oder Fehlerbehebung und neuen Features darauf reagiert werden.
Ich habe auch schon erlebt, dass ich von einer Lösung erfahren habe, wie man etwas im Framework bewerkstelligen kann und ein Ergebnis erhält wie man es möchte und das auch schon von einige Entwicklern so eingesetzt wurde und die auch ganz Stolz auf diese Lösung waren. Das Problem war nur, dass das Framework an der Stelle eigentlich genau das liefern sollte, was die über Umwegen dann auch bekommen haben und eine einfache kleine
Meldung bewirkt hätte, dass aufgefallen wäre, dass es ein einfacher Bug im Code war, der dann auch in 5min behoben war. Aber dadurch dass eine alternative Lösung jetzt ein falsches Ergebnis erwartete, war es viel Arbeit alles mit der Fehlerfreien Komponente des Frameworks wieder zum laufen zu bekommen.
Da fehlte dann auch das vertrauen ins Framework. Denn wenn man Vertrauen hat und etwas nicht wie erwartet funktioniert, geht man von einem Bug aus und nicht von einem normalen Verhalten, dem man selbst entgegen wirken muss.


Entscheidungen überdenken und schnell reagieren

Manchmal klingt etwas sehr gut und die Beispiele liefen gut und die Tutorials im Internet ging schnell von der Hand. Entität anlegen, laden, ändern, löschen und eine Liste der vorhandenen Entitäten laden. Alles super.
Aber dann kommt die Komplexität der echten Welt, wo man nicht nur Listen lädt und etwas hinzufügt oder ein Element hinzufügt. Hier beginnen Probleme und manchmal zeigt sich erst hier, ob dass alles wirklich so gut war wie gedacht. Bei JavaFX kann ich einfache DTOs in Tabellen verwenden. Wenn sich aber ein Wert in einem der DTOs ändert wird es nur erkannt, wenn es ein Property ist. Das ist dann plötzlich ein Sprung von "geht ja ganz einfach" zu "jetzt muss alles in Properties umkopiert werden und die normalen Getter und Setter reichen nicht mehr und also doch wieder eine Wrapper-Klasse bauen."
Oder wir treffen auf das Problem aus Punkt 1. Entweder probieren wir es erst einmal weiter und bauen erst einmal eine Version und damit und gucken dann mal oder aber wir haben uns doch am Anfang darauf festgelegt und die Entwickler haben gerade gelernt damit umzugehen.. oder aber ganz radikal: Zusammen setzen, noch mal Alternativen suchen und wenn es was gibt schnellst möglich wechseln. Erstmal mit einer nicht passenden Technologie oder so einem Framework weiter zu arbeiten ist das schlimmste was man machen kann. Denn es müssen Teile neu geschrieben und angepasst werden und dass sollte man machen, wenn noch nicht zu viel davon entstanden ist. Wenn man ein Jahr wartet, wird es zu viel und die Ansicht wird sich durch setzen, dass fertig machen nun doch schneller geht als "neu" machen. Es wird aber mit den Jahren immer langsamer und langsamer entwickelt und es zeigt sich, dass die Annahme falsch war und man doch schon viel weiter wäre, wenn man gewechselt hätte.
Nie mit etwas entwickeln was Probleme macht ohne das die Möglichkeit gegeben ist, das entwickelte später in einem besseren Technologie-Kontext weiter verwenden zu können. Hier Zahlt sich Abstraktion wie MVC/MVVM oder auch einfaches Databinding dann schnell aus, wenn man mit einfachen DTOs und POJOs gearbeitet hat.

Hier ist aber oft die Angst vor dem Mehraufwand und auch vor neuen Technologien das Problem, was die Entwickler daran hindert, schnell und angemessen zu reagieren. Denn die Entwickler kennen fehle Technologien und Frameworks und können bestimmt eine oder zwei Alternativen nennen. Man sollte immer dafür offen sein, dass es etwas besseres gibt und vielleicht ein Umstieg die Zukunft einfacher macht. Auch ohne zu große Probleme sollte so ein Vorschlag immer mal wieder überdacht werden. Es kann auch helfen sich andere Lösungen anzusehen und davon zu lernen in dem man Konzepte übernimmt (wenn diese dann in die alte Struktur passen!)

Ich habe bei meinen Frameworks, die ich so geschrieben habe gelernt, dass man manchmal einfach alte Dinge weg werfen muss, Kompatibilität gut ist aber nicht bis in die Steinzeit reichen muss und man teilweise ein neues Framework anfängt, dass alles besser machen soll und am Ende portiert man es in das alte Framework zurück und wundert sich wie flexibel man das erste doch entwickelt hat, dass man die Konzepte am Ende auch dort in wenigen Stunden komplett implementieren konnte.

Mutig sein und Entwickler dafür abstellen sich auf dem Laufenden zu halten und die Aufgabe zu geben Vorhandenes zu hinterfragen und zu kritisieren.


Die eine zukunftssichere Technologie

Damit kommen wir direkt zum nächsten Problemkomplex. Es wird analysiert und diskutiert und sich für eine Technologie entschieden. Das geht auch erst einmal ganz gut und so lange niemand danach über den Tellerrand schaut bleibt auch alles gut.
Um eine Technologie für ein Projekt, das auch mal mehrere Jahre laufen wird, muss sie stabil sein, gut zu benutzen, es darf sich nichts groß an ihr ändern, damit man nicht dauernd alte Module anpassen muss und sie sollte gut unterstützt werden (also schon viel im Internet darüber zu finden sein). Das alles ist am Anfang gegeben. Aber es soll ja auch so bleiben. Eine Technologie bei der sich in 3 Jahren nichts mehr groß ändern wird ist an sich tot. Was vor paar Jahren noch sehr toll war z.B. SOAP-Webservice über Annotationen zu erzeugen wird heute keiner mehr wirklich benutzen wollen. SOAP war mal komfortabel, wirkt heute aber einfach umständlich im Vergleich zu REST-Services.
Es gibt keine Technologie, die über Jahre hinweg die beste und einfachste Lösung bleibt. Man kann sich aber auch modernen Entwicklungen nicht komplett entziehen. Das Grundsystem wie der Application-Server und das GUI-Framework sollten immer bei neuen Versionen mit geupdatet werden. Es bedeutet nicht, dass die produktiven Server jedes mal ein Update erhalten müssen, aber die Anwendung sollte immer auch auf der aktuellsten Version laufen können. Das kostet den Entwickler natürlich immer etwas Zeit, aber sollt wirklich mal ein Wechsel der Produktivumgebung anstehen, wird dies wenigstens kein Problem mehr sein und es entsteht kein Zeitdruck alles
doch noch schnell auf die neue Version anzupassen. Wir wissen ja das solche Ankündigen nie rechtzeitig vor her kommuniziert werden.

Es muss nicht immer eine neue Technologie sein, aber wenn man bei der Entwicklung der benutzen Technologie nicht mit macht wird man schnell Probleme bekommen und von allen Vorteilen der neuen Versionen nicht profitieren können. Das deprimiert die Entwickler und gibt denen das Gefühl, als würde man ihnen bewusst Steine in den Weg legen. Man siehe nur den Wechsel von EJB2 auf EJB3.


Jeder Entwickler ist anders

Wir brauchen ein Konzept, damit nicht alles wild durch einander geht und jeder so programmiert wie er gerne möchte und kein Modul aussieht wie das anderen. Also soll jemand festlegen, wie der Code-Style, die Packages und die Oberflächen auszusehen haben. Das geht natürlich ganz schnell, es wird programmiert wie man es selber machen, weil man ist überzeugt von seinem vorgehen und man selbst kommt damit ja super zurecht. Oberflächen guckt man sich seine Anwendungsfälle an... andere werden ja wohl keine Anwendungsfälle haben, die sich von der Struktur her groß unterscheiden. Aber leider dreht sich die Welt nicht um einen. Jeder kommt mit seinen Sachen gut zurecht, sonst hätte man es ja schon längst geändert. Also muss man davon ausgehen, dass auch der der die Dinge entwickelt hat, mit denen wir nicht zurecht kommen, damit super zurecht kommt. Also sich im Team zusammensetzen und am Besten mit offenen Standards anfangen. Ein Tab ist fast immer 4 Zeichen lang. Warum sollte man 3 nehmen? Eine persönliche Vorliebe, weil man ein besseres Lesegefühl dabei hat? So etwas hat sich nicht umsonst durchgesetzt und es haben sich Menschen Gedanken gemacht. Wichtig ist zu realisieren, dass vor einem schon andere Leute über solche Dinge nachgedacht haben und diese Leute auch nicht dumm waren oder sind. Wer glaubt er hätte die einzige wahre Lösung gefunden und jegliche kleine Abweichung wäre falsch, der sollte alles wegwerfen und noch mal von vorne beginnen.

Das Framework sollte verschiedene Ansätze von sich auf unterstützen. JavaFX mit Objekten, FXML, HTML im Web-View und auch sonst noch die alte SWT-Variante. Klingt nach viel, aber es gibt für jeden dieser Ansätze einen Anwendungsfall wo er besser als der Rest ist. Das Framework sollte den Entwickler unbemerkt dazu bringen, dass egal wie er an die Aufgabe heran geht, der Code am Ende den der anderen Entwickler ähnelt. Gleich wird der Code nie sein. Es ist schwer so ein flexibles Framework zu entwickeln, wo sich jeder ransetzen kann und ohne viel Lernen und Anpassungen damit anfangen kann zu entwickeln. Databindung oder direkt Zugriff auf das Element.
POJOs oder komplexe Beans. Wiederverwendbare Komponenten oder eine Komponente aus einzelnen kleinen Komponenten direkt beim Aufbau der GUI konstruieren. Alles ist manchmal nötig und manchmal ist das Gegenteil der bessere Weg. Aber nie ist eines davon an sich falsch. Jeder Entwickler ist anders und geht anders an Probleme heran und in einem Projekt sollte es nie so sein, dass sich die Entwickler darin an einen anderen anpassen müssen, weil sie dann nicht mehr die Leistung bringen, die sie könnten.


Unit-Tests

Unit-Tests sind meiner Erfahrung oft eher Belastung als eine Hilfe. Ein wirklich guter Test braucht Zeit und meistens sind diese Test nichts weiter als Entität speichern, laden, freuen, dass der selbe Wert drin steht, wie beim Speichern. Bei Berechnungen sind die Tests super, weil man schnell prüfen kann, ob eine Berechnung noch korrekt ausgeführt wird. Aber für komplexe Workflows und Anwendungsfälle sind diese Tests meistens sinnlos. Ein paar gute Tester bringen mehr als Unit-Tests. Lieber keine oder wenige Unit-Tests und dafür genug Tester haben. Ein Tester ist ein Mensch und für Schnittstellen, die von Menschen verwendet werden, sind Menschen die besseren Tester,
weil sie an Dinge unterschiedlich heran gehen. 2 Tester können eine Workflow-Schritt durch testen und 2 unterschiedliche Fehler finden, während der Entwickler ohne Fehler getestet hat.
Bloß weil etwas toll ud hip ist, ist es für das eigene Projekt nicht auch immer die beste Lösung. Man muss gucken, ob es einen etwas bring und sich klar sein, dass es nicht die eine richtige Lösung für alles gibt. Unit-Tests für Services sind toll und für GUIs meistens vollkommen unbrauchbar.

Dokumentation ist genau so ein Thema. Ein freier Text kann viel mehr erklären wie ein JavaDoc, wären JavaDoc toll ist während des Programmieren kleine Infos zur Methode zu erhalten. Aber brauch ich eine Info was die Methode load($id) macht?


Team-Leader und Lead-Developer als Unterstützung und nicht als Diktatoren

Ich hatte ja schon mehr Mals im Text erwähnt, dass man viele Dinge im Team klären muss und nicht eine Person, wichtige Dinge für alle entscheiden lassen sollte. Es ist die Aufgabe eine Lead-Developers das Team zu fördern und die Leistung zu steigern und dem Team die Probleme vom Hals zu halten. Es ist nicht die Aufgabe des Teams alles zu tun um dem Team-Leader zu gefallen. Lead-Developer und Team-Leader sind undankbare Jobs und man muss sie machen wollen. Wenn man das nicht will und nur etwas mehr zusagen haben möchte, ist man dort falsch. Auch wenn man nur immer zu allen "Ja" sagt, was von oben kommt und dann die Probleme direkt nach unten zum
Team leitet.
Wenn das Team das Gefühl hat sich in bestimmten Situationen nicht auf den Team-Leader verlassen zu können, hat man ein Problem. Es muss deutlich sein, dass er Verantwortung übernimmt und hinter oder besser noch vor seinem Team steht.
Das selbe gilt für den Lead-Developer und seine Entscheidungen. Er muss Erfahrung haben und seine Entscheidungen erklären können und auch die Verantwortung dafür übernehmen, wenn er eine falsche Entscheidung getroffen hat und den Mut haben diese zu Korrigieren. Wenn also ein falsches Framework ausgewählt wurde mit dem kein Entwickler zurecht kommt, ist es sein Fehler und nicht der Fehler der Entwickler. Dann muss er handeln und
den Fehler beheben.

Simple Programmer - Some Advice On Becoming a Lead Developer

Fazit
Das waren jetzt meine groben Gedanken zu dem Thema und meinen Erfahrungen. Es ist aber klar, dass zur Behebung eines Problems erst einmal das Gespräch gesucht werden muss, denn die Entwickler wissen schon meistens sehr genau was schief läuft. Eine Lösung für das Problem müssen die aber deshalb nicht präsentieren können. Wenn nicht ganz klar sein, sollte wo das Problem liegt und man wirklich mit dem Projekt in Bedrängnis kommt, sollte man sich jemanden holen der Erfahrung hat und solche Situationen kennt und am besten mal durchlebt hat. Auch hier wieder die Feststellung, dass vieles immer sehr ähnlich ist und man von den Problemen und Fehler der anderen oft sehr viel lernen und dann verwenden kann.
Solche Leute sind nicht günstig, aber wenn man mal dagegen rechnet wie viel Zeit eingesperrt werden kann, sind die oft ihr Geld wert.

Probleme innerhalb des Teams könnte auch da sein. Aber das ist ein sehr sensibles Thema und dort gibt es noch weniger als bei den deren Problemfeldern keine einfache Lösung.

Win10 Upgrade Problem-Lösungen - Fehler 80240020

Es geht nicht immer alles glatt beim Windows 10 Upgrade. Das hier kann helfen:

Wie man das Upgrade erzwingt:
http://www.golem.de/news/windows-10-verteilung-des-gratis-upgrades-erzwingen-1507-115482.html

Falls es sich nicht installieren lässt und ein Fehler kommt:
http://www.pcgameshardware.de/Windows-10-Software-259581/Tipps/Fehlercode-80240020-Loesung-1166410/

Wie man die alte Windows Version komplett entfernt:
http://www.win-10-forum.de/artikel-windows-10-tipps-tricks/319-windows-10-datentraegerbereinigung-upgrade-schafft-speicherplatz.html


Neue Cherry Tastatur und Win10

Jetzt wo ich einen Job in der Web-Branche habe, gehört es ja auch fast zum guten Ton eine Homepage und einen Blog zu haben. Ich werde zwar meinen Output wohl
etwas herunterfahren in den nächsten Wochen, aber es weiterhin professioneller machen als noch am Anfang des Jahres. Daher versuche ich es auch mal mit dem
Amazon-Partner-Programm. Ich glaube nicht wirklich Geld damit zu verdienen.. aber ich wollte es einfach mal ausprobieren und meine Homepage wurde
auch angenommen. Das allein war schon schön.

Als ich am Freitag nach Hause kam, hatte meine Frau mir eine neue Tastatur schon angeschlossen, die sie mir geschenkt hat. Denn bei Blogs muss man
viel schreiben und dass soll ja möglichst gut gehen. Bisher hatte ich eine billige Microsoft Tastatur. Die war nicht schlecht, aber eben eine einfache
billige Tastatur.

Microsoft Wired Keyboard 600 USB Tastatur

Jetzt habe ich eine Cherry Tastatur. Die haben einen guten Ruf und ich mag die einfach. Das Schreibgefühl ist einfach toll. Gut sie ist lauter. Aber dafür fühlt
es sich nicht so an als würde man mit Gummi-Tasten schreiben.

bbcode-image
Cherry G83-6105 LUNDE-2

So eine hatte ich auch bei meinem alten Job und ich werde versuchen so eine auch bei meinem nuen Job zu bekommen.

Und als ich schon mal dabei war meinen PC den neuen Anforderungen anzupassen, kamen noch 2 schnellere Stromspar CPUs (Xeon L5335) in mein System. Es gibt nichts schlimmeres
als mit Systemen zu arbeiten, die längere Ladezeiten haben oder mal hängen. Zweites ist damit jetzt erledigt. Aber eine SSD kommt irgendwann doch noch mal.
CPUs reichen weil zum Schreiben braucht man nicht so viel Leistung und auch Web-Development ist in Relation zu z.B. J2EE-Entwicklung sehr sparsam mit CPU-Leistung.

Windows 10 kam heute dann auch gleich mit rauf. Virtuelle Desktops funktionieren.. mal gucken wie gut die dann auch benutzbar sind. Aber es funktioneirt an sich erstmal gut.

Aber allein die Tastatur wird mir schon sehr helfen!

Blog-Update, Kommentare, etc

Ich hab nach einiger Zeit jetzt doch mal das Blog-Module überarbeitet. Neben einer besseren Performance und der Möglichkeit im Framework, jetzt auch gezielt aus einer Page heraus den Title der HTML-Seite zu setzen, gibt es jetzt auch eine Kommentarfunktion, jetzt von jedem Bensucher benutzt werden kann. Es gibt nun auch die Möglichkeit Beiträge zu schreiben, die auf der Übersichtsseite nur mit einem kurzen Text angezeigt werden und der gesamte Text erst, wenn man dem Link auf den Beitrag folgt. Ich mag eigentlich wenn man nicht extra klicken muss, um einen Beitrag ganz zu lesen, aber wenn sehr viel Quellcode darin ist, kann es doch wohl sehr hilfreich sein.

Als nächstes folgt eine bessere Integration von Bildern und Videos.

Das Theme der ganzen Seite hatte ich ja schon vor kurzen angepasst und es sieht nun auch etwas moderner alles aus. Das alte dunkle Theme gefiel mir auch eher nicht mehr. Das neue wirk auch irgendwie einladener.

Ich hoffe dass damit jetzt alles noch ein Stückchen professioneller wird (obwohl es nur meine private Homepage ist) und auch die Google-Suche nun etwas besser mit allem hier zurecht kommt. SEO ist ja doch schon eine Wissenschaft für sich.

PS: eine neue Version von aoop, auch mit dem neuen Blog-Module werde ich in den nächsten Tagen zum Download bereit stellen.

Tastatur und Maus reinigen

Heute habe ich meinen Arbeitsplatz abgebaut.. bzw nur den Rechner, weil der wird dann noch formatiert, bevor jemand anderes ihn dann weiter verwenden darf. Der Rest wird erstmal dort verweilen bis es von den Technik-Leuten entweder abgebaut wird oder die Person, die dann auf meinem Platz sitzen wird. Dabei kommt man irgendwann an den Punkt festzustellen wie dreckig doch die Maus und die Tastatur sind. Und wie es der Zufall natürlich will, hat man auch nichts zum Putzen dabei.
Zuhause wäre das kein Problem, dann dort habe ich das ultimative Reinugungs-Mittel für sowas und noch viel mehr... nicht für alles.. die Einzugsrollen von Druckern sollte man damit nicht versuchen zu säubern. Sonst muss man mit den Fingern die darauf kleben gebliebene Schicht mühseelig abbreiben. Sauber waren sie am Ende dann doch.. aber als gut gemeinter Tipp.. es einfach nicht machen!

bbcode-image
bbcode-image
CyberClean Reinigungsmasse

Und für Tasturen auch sehr praktisch:

bbcode-image
bbcode-image
Hama Blasebalg Dust Ex

... vielleicht hat man sowas ja schon bei der Fotoausrüstung liegen.

Ist jedenfalls alles viel besser als die Tastur über Kopf zu halten und zu schütteln.

Einfache Verwendung der indexedDB

Die indexedDB ist eine tolle API, um Daten auf über eine Sitzung hinaus im Browser speichern zu können. Da komplette JavaScript-Objekte dort persistiert werden können, bieten sich viele Anwendungsfälle, wo sie sehr hilfreich sein kann. Z.B. auch das automatische Zwischenspeichern von längeren Eingaben.
Hier wird erklärt wie man ein Objekt mit einer einfachen Id speichern und wieder laden kann.

bbcode-image


Heise Dev. Podcast zu AngularJS

Dieser Podcast-Beitrag von Heise Developer ist ein wirklich guter Einstieg in AngularJS und seine Begrifflichkeiten. Besonders auch für Leute, die HTML+JavaScript für "richtige" Anwendungen sehr skeptisch gegenüber stehen und diese Technologien für sowas als zu schlecht und ungeeignet ansehen. Es wird dort extra nochmal darauf eingegangen, dass das JavaScript aus IE5 Zeiten lange der Vergangenheit angehört und moderenes JavaScript sehr gut auch für sehr komplexe Anwendungen im online und auch offline Betrieb geeignet ist.

http://www.heise.de/developer/artikel/Episode-43-Single-Page-Apps-mit-AngularJS-2180387.html

Für Entwickler die schon aktiv mit AngularJS arbeiten bietet er wenig bis nichts neues.

Older posts:

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