Wenn man lokal entwickelt muss man sich oft eine Subdomain für "localhost" einrichten. Das ZF und ZF2 sind am liebsten so installiert und Folders in einer Domain funktionieren nicht immer ganz so gut. Außerdem kann man dann so einfach alles auf die produktive Domain kopiren ohne die htaccess anpassen zu müssen.
So etwas einzurichten ist auch ganz einfach. Es geht in der httpd.conf oder man richtet sich die extra/httpd-vhost.conf ein.
<VirtualHost *:80>
DocumentRoot "C:/workspaces/php/projectXYZ"
ServerName xyz.localhost
ServerAlias www.xyz.localhost
<Directory "C:/workspaces/php/projectXYZ">
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Mit AllowOverride erlaubt man das Verwenden von Rewrites
heute habe ich meinen ersten Test mit PHP 7 durch geführt. 1&1 ist so nett und bietet für jeden schon an PHP 7.0RC3 einzustellen. Ich hab mir eine Subdomain angelegt und diese auf PHP 7 konfiguriert. Ich wollte mal sehen, ob mein System mit PHP 7 läuft oder ich noch etwas ändern muss. Bis jetzt lief meine Homepage produktiv mit PHP 5.5 und wurde mit 5.6 entwickelt. Bei PHP7 fallen ein paar Altlasten weg, die man eigentlich schon vor Jahren hätte mal anpassen sollen. Das hatte ich vor paar Wochen gemacht:
Die alten Konstruktoren durch __construct() ersetzen. Ich weiß nicht warum die alten nicht mehr untersützt werden sollen in Java funktioniert die Art und Weise super und auch mit PHP hatte ich keine Probleme.. ist aber eben jetzt anders
Die alten msyql-Function sind nun nicht mehr dabei. Aber dafür gibt es noch die mysqli-Funktionen (auch in Form von Klassen für OOP). Da alles in einer Klasse gekapselt war, bedeutete das nur die Klasse zu kopieren und an jedes "mysql" ein "i" ran zuhängen. Also in 2 Minuten erledigt. Selbst ein automatisches Replace über alle Dateien hätte funktioniert.
Mehr hatte ich nicht geändert und es lief unter 5.6 alles sehr schnell und stabil. Dann folgte der Test auf PHP 7.. und es lauft. Gefühlt ist es immer noch stabil und schnell. Performance-Messungen habe ich noch nicht gemacht, aber werde in den nächsten 1-2 Wochen wohl mal welche nachreichen.
Fazit Ich glaube es wird kaum bis wenige Probleme beim Wechsel geben, wenn der Code strukturiert ist und nicht seit 10 Jahren nicht mehr angefasst wurde. Das "Problem" mit den mysql-Funktionen klingt schlimmer als es ist bei alten Legacy-Code wo die DB-Queries wild im Sourcecode verteilt sind. Ein Replace und es ist erledigt, das Schlimmste was passieren kann ist das man ein paar Kommentare mit umbenennt. Also keine Angst haben und einfach mal ausprobieren.
Wie sieht eigentlich der fast perfekte Arbeits-PC für einen Webentwickler aus? Webentwicklung kann jetzt auch relativ weitreichend sein, aber ich meine jetzt So etwas wie PHP, JSF, HTML5, viel JavaScript und auch viel UX und GUI-Design. JSF läuft zwar auch gut auf einem Websphere oder Wildfly. Aber diese brauchen vom ganzen Workflow bei der Entwicklung sehr viel Leistung. Bei JEE ist der schnellste PC gerade immer gut genug. Eine Eclipse-Instanz mit 15 Projekten, Maven, JBoss und einer VM mit Oracle kann so gut wie jeden Rechner auslasten, wenn Erstmal der Gesamt Workspace neugebaut wird und die Projekte deployed werden.
Aber auch gerade für kleine Side-Projects braucht man so etwas nicht und auch bei den meisten normalen Projekten wo man nur MySQL, PHP oder einen Tomcat hat, reicht viel weniger. Aber ein paar Dinge sind sehr wichtig.
Stabiles und schnelles LAN Es gibt nicht schlimmeres als nicht funktionierendes LAN. Denn wenn es nicht funktioniert, ist genau der Zeitpunkt wo man ubedingt im Internet eine sehr wichtige Kleinigkeit nach gucken muss, die man schon mal gemacht hat, aber einen nicht mehr 100%ig klar ist wie man es damals gemacht hat und wo das andere Projekt und de Code gerade geblieben sind.
Auch das Kopieren von Daten auf Server oder das Exportieren oder Importieren von Datenbank-Beständen ist mit einem guten und stabilen Netzwerk sehr viel angenehmer. Wlan ist meistens langsam, instabil und bei mehreren aktiven Geräten gleichzeitig, macht es schnell keinen Spaß mehr damit zu arbeiten. Für Tablet und mal zum Surfen mit dem Notebook oder ein Video streamen (wo der Anbieter behauptet es wäre Full HD..) reicht Wlan immer. Aber wenn man mal einen Eclipse-Workspace von 1,5GB darüber kopieren wollte, weiß man wo die Grenzen liegen.
Ein schnell startender Rechner Auch wenn man bei der Arbeit die Zeiterfassung nicht erst mit gestarteten Windows hat und somit jede Minute dann Zeit ist, die einem nicht als Arbeitszeit angerechnet wird, sind endlose Startzeiten einfach nur nervig. Wer mal mit NT 4.0 gearbeitet hat und eine SCSI-Karte eingebaut hatte kann sich sicher gut daran erinnern. >1 Minute Startzeit sind viel. Besonders nervig wird es mit serverseitig gespeicherten Profilen und langsamen Netzwerken. Einloggen und dann nochmal 2-3 Minuten warten bis der Desktop zu sehen ist und auch sich erste Dinge anklicken lassen.
Ich hatte mal einen älteren WinXP Rechner mit Eclipse, JBoss, SQL-Developer, Firefox, Thunderbird.. 5-6 Minuten bis man die ersten Zeichen Code schreiben konnte waren nicht selten. Wenn Antivir noch aktiv wurde, würde es noch schlimmer.
Also eine SSD oder eine gute Festplatte sorgt schon mal für einen entspannten Einstieg in die Arbeit und sorgt dafür, dass der Mitarbeiter gleich schon zu Anfang vollkommen entnervt vor seinem PC sitzt.
Und eben schnelles LAN, falls was von einem Server geladen werden soll.
CPU-Kerne.. viele Heute muss man beim Entwickeln viel parallel laufen lassen. Auch wenn die Software selbst nicht viel mit Threads arbeitet (was aber heute fast schon eine Ausnahme ist und eher daran liegt, dass zu wenig zu tun ist für einen zweiten Thread) sind viel Kerne nicht verkehrt. Die vielen Kernedürfen dann auch gerne langsamer sein. Privat komme ich mit 2x L5335 Xeons mit je 4 Kernen super zurecht, während der i7 bei der arbeit mit nur 4 Kernen an einigen Punkten an seine Grenzen kam. Gerade wenn die VM mit der Oracle DB 2 Kerne bekam und auch 4GB der 16GB reservierte. Dann noch eine MySQL-DB ein Tomcat und dazu eine Eclipse-Instanz oder auch mal zwei. Privat mit 8 Kernen und 24GB ist es immer die Festplatte, die am Ende das Problem ist aber nie wirklich der Rest.
Also gute CPUs mit vielen Kernen und viel RAM. Man kann von beiden nie genug haben. Für reine PHP Entwicklung oder HTML5 reicht natürlich oft schon 8GB und ein i5 aus. Aber auch hier sollte dann wenigstens das Mainboard gut genug sein um die Leistung von beiden gut genug auszuspielen.
Gute Monitore Gerade im Webbereich hat man viel mit Grafik und Farben zu tun. 2x EIZO Flexscan S2411W sind echt super. Ein günstiger Samsung ist gar nichts dagegen. Gut für die Augen, weil alles super erkennen kann und die Farben und Kontraste deutlich sind. Teuer. Ja.. aber zwei Moitore sind fast schon Grundvoraussetzung. Einer für die IDE der andere für den Webbrowser zum Testen und Referenzen und Hilfen suchen. FullHD oder 1920x1200 dürfen es heute schon sein. Mehr ist nicht verkehrt aber auch nicht wirklich nötig. Aber auch gebrauchte alte wie ein Acer... oder ein Fujitsu .... sind noch immer sehr gut zu gebrauchen. Neu muss nicht immer besser sein.. wenn die Farben und die Qualität stimmen.
Datensicherung Nicht wirklich ein Teil des PCs aber für das angenehme Arbeiten sehr wichtig. Auch wenn man es nie braucht.. zu wissen, dass die Daten gesichert wurden beruhigt einen sehr. GIT, SVN.. damit man im Notfall auf eine alter Version zurück springen kann.. auch wenn man es nie wirklich macht. Aber bei der Nachforschung doch immer sehr hilfreich.
Auch privat sollte man seine Daten immer mal sichern. Sehr gut funktioniert ein BluRay-Brenner oder eine einfache externe Festplatte. Es muss nicht immer eine "echte" externe Festplatte sein. Ein einfaches Gehäuse und eine gute (gebrauchte) 3,5 Zoll Festplatte sind oft günstiger und dazu noch zuverlässiger als eine 2,5 Festplatte für den selben Preis und man ist sich sicher was für eine Festplatte verbaut und man diese im Notfall ohne Probleme auch intern oder in einem anderen Gehäuse betreiben kann.
Die Geräuschkulisse Auch wenn man es im normalen Arbeitsalltag kaum wahr nimmt... viele PCs sind doch sehr laut. Wenn man dann mal Abends im Dunkeln vor dem PC sitzt, nichts weiter an hat und keine Musik hört und versucht konzentriert einen Blog-Eintrag zu schreiben, merkt man erst wie laut ein PC wirklich ist. Am Ende sind es immer die Lüfter die den Krach machen.
Festplatten werden schnell angehalten bei modernen Systemen und beim Schreiben in einem Text-Editor wie Notepad++ liegt sowie so alles im Arbeitsspeicher.
Nach viel herum probieren und testen sind die PCs hier jetzt sehr leise bzw meiner relativ leise.
Der AMD FX 4300 läuft selbst unter viel Last wie bei Witcher 3 sehr leise und ist kaum hörbar.
Das kam aber erst nachdem er mit diesen beiden Teilen aus gerüstet wurde und eine Radeon HD7950 spendiert bekam. Mehr Leistung bei weniger Strom bedeutet eben auch, das weniger gekühlt werden muss und weniger Krach bei gleicher Leistung heraus kommt.
Mein Hauptrechner läuft noch mit 2 alten 80mm Thermaltake Lüftern, die aber mal in nächster Zeit durch 2 von BeQuiet! ausgetauscht werden sollen. 2 BeQuiet-Lüfter laufen schon auf 2 2HE Kühlkörpern und kühlen wirklich super und leise.
An den Körper denken Was man auf keinen Fall vernachlässigen sollte ist der Körper. Nacken, Rücken, Handgelenke und Augen. Ein guter Monitor schont die Augen. Wenn er auf der richtigen Höhe eingestellt ist und man einen guten Stuhl hat schont es den Nacken und den Rücken. Hände und Gelenke schont man mit der richtigen Tastatur und Maus. Nach vielen Versuchen bin ich bei einer Cherry-Tastatur und einer Razer Imperator Maus gelandet. Roccat Kone ist auch eine gute Maus. Bei einer Dell verkrampfte die Hand schon nach 30 Minuten und auch die günstigen von Logitech sind teilweise verbesserungswürdig wenn man viele Stunden damit arbeitet. Meine Erfahrung für mich hat gezeigt, dass ich doch gerne eine etwas größere und schwerere Maus habe. Auch mag ich keine flachen Tasten auf Tastaturen. Notebook Tastaturen sind für mich ein Graus (halb hohe Tasten auf einer anderen Cherry gehen aber ich hätte doch lieber auch dort eine mit hohen Tasten). Aber das muss jeder mit Zeit für sich selbst heraus finden, was einem gefällt und was gut für einen ist. Wenn man dann etwas gefunden hat darf es auch gerne etwas mehr kosten, weil lieber mal 50 Euro mehr ausgeben als eine Sehnenscheidenentzündung und Monate lange Behandlungen oder dauernd Kopfschmerzen wegen dem Nacken, weil der Monitor falsch/zu hoch ausgerichtet ist und sich nicht richtig verstellen läßt.
Auch wenn es teilweise Gamer-Hardware ist, ist diese wirklich für alle gut, die lange am PC sitzen und auch intensiv mit den Geräten arbeiten. Es kam mir zu Erst komisch vor mit einer Gamer-Maus zu arbeiten aber eine meiner ersten Fragen bei meinem neuen Arbeitgeber war, ob ich diese winzige Funkmaus von Logitech gegen meine Imperator austauschen könnte. Es war gleich ein ganz anderes Gefühl die wieder benutzen zu können.
Die virtuellen Desktops in Windows 10 sind doch eine praktische Sache. Gerade wenn man zuhause abends nebenbei auch mal etwas produktives machen möchte. Dann kann man die üblichen Dinge die man sonst so offen hat auf den ersten Desktop legen und IDE, SourceTree und die Firefox Instanz zum Testen auf den zweiten.
So kann man auch ohne Probleme in Facebook einen Chat haben und muss nicht umständlich immer zwischen Fenstern und Tabs wechseln.
Einfach und schnell zwischen den Desktops wechselt man mit Win+Ctrl+(links|rechte). Es ist auf jeden Fall sehr viel schneller als zwei Fenster wieder nach vorne zu holen, wenn man gerade etwas anderes gemacht hat oder sich durch die offenen Tabs im Browser zu suchen bis man wieder die zwei richtigen gefunden hat, die man brauchte.
Auch für Kinder und Jugendliche, die gerade Hausaufgaben machen (sollen) eröffnen sich damit ganz neue Möglichkeiten.
Mein erster Prototyp für einen Validator in PHP der mit Annotationen arbeitet. Über ReflectionClass kann ich mir dann die Properties holen und dann mit getDocComments() mir die Annotationen auslesen.
Wer mal eine <select> mit Angular gefüllt hat, kennt das Phenomen, dass die Ids nicht im Value der Option stehen sondern über Angular später gesetzt werden sollen. Wenn man mit ng-model arbeitet ist das auch alles kein Problem. Nur wenn man das <select> klassisch über eine Form submiten möchte kommt es zu Problemen.
ng-options="item.id as item.name for item in items"
Was hilft ist das hier
ng-options="item.name for item in items track by item.id"
Damit wird nicht mehr der Index des Arrays verwendet sondern wirklich die Id aus dem Objekt.
Auch im ZF1 ist es sehr einfach einen REST-Service zu implementieren.
public function restAction(){
$this->getHelper('Layout')->disableLayout();
$this->getHelper('ViewRenderer')->setNoRender();
$this->getResponse()->setHeader(
'Content-Type', 'application/json; charset=UTF-8'
);
$data=............;
echo json_encode($data);
return;
}
Man muss nur das Layout und den ViewRenderer deaktivieren und schon kann man sein Response ganz nach Belieben gestalten. Das Vorgehen über das Response als return Wert im Zend Framework 2 finde ich aber insgesamt klarer und strukturierter als die Art und Weise um ZF1.
Irgendwann kommt der Zeitpunkt, da ist eine Anwendung langsam. Es liegt nicht am Datenbankserver oder der Netzwerkanbindung oder der Auslastung des Servers. Es liegt einfach ganz allein daran, dass die Anwendung langsam ist.
Oft findet man einige Dinge von selbst heraus. Aber oft ist man einfach überfragt in welchen Teilen der Anwendung die Zeit verloren geht. Was braucht lange? Werden einige Dinge unnötig oft aufgerufen? Zu viele Dateisystem-Zugriffe?
Hier hilft dann nur noch ein Profiling der Anwendung. Profiling ist einfach die Anwendung eine Zeit lang zu überwachen und zu protokollieren, wie viel Zeit in der Zeit auf welche Methoden oder Funktionen verwendet wird.
Das alleine sagt natürlich erstmal nicht wo Probleme vorhanden sind. Deswegen halte ich die Idee ein separate Team solche Performance-TEst durch zu führen und zu analysieren für nicht ganz so zielführend. Denn manchmal brauchen einige Methoden viel Zeit. Da man Zeit sowie so meistens nur in Verhältnis der Methoden zu einander betrachtet muss man wissen was schnell sein soll und was langsam sein sollte oder darf.
Ich hatte mal bei Bouncy Dolphin das Problem, dass alles an sich ganz schnell lief, aber beim Profiling auf eine Methode fast 40% der Zeit ging, die nur den aktuellen Punktestand auf das Canvas zeichnete. Nach viel hin und her Probieren kopierte ich den Inhalt eines Canvas mit dem Punktestand auf das Haupt-Canvas. Das Canvas mit dem Punktestand wurde nur neu gezeichnet wenn sich der Punktestand auch änderte. Danach verbrauchte die Methode nur nach 15%. Also war es schneller das gesamte Canvas zu kopieren als eine oder zwei Ziffern zeichnen zu lassen.
document.getElementById["aaaaa"].value=score verursacht z.B. auch extrem hohe Kosten. Also immer alle wichtigen Elemente in Variablen halten und nicht jedesmal neu im Document suchen!
Wärend man in Java extrem mächtige Tools wie VisualVM hat und der Profilier des Firefox oder Chrome einem bei JavaScript Problem sehr gut hilft, ist die Situation bei PHP etwas umständlicher. Zwar kann man so gut wie immer XDebug verwenden, aber so einfaches Remote-Profiling wie mit VisualVM ist da nicht zu machen.
Aber da man meistens sowie so lokal auf dem eigenen PC entwickelt und testet, reicht es die Daten in eine Datei schreiben zu lassen und diese dann mit Hilfe eines Programms zu analysieren.
Aber ich habe bis jetzt WinCacheGrind verwendet. Damit ließen sich nach etwas Einarbeitung dann schnell heraus finden, wo die Zeit verloren ging und welche Methoden wie oft aufgerufen wurden.
Der Class-Loader durchsuchte das System-Verzeichnis zu oft, weil an der Stelle nicht richtig geprüft wurde, ob die Klasse schon bekannt war. So konnte ich die Ladezeit einer Seite in meinem Framework am Ende nach vielen solcher Probleme von 160ms auf ungefähr 80ms senken. Viel Caching kam auch noch dazu und das Vermeiden von Zugriffen auf das Dateisystem.
Aber es gibt noch andere Profiler als XDebug für PHP. Hier findet man eine gute Übersicht:
PHP Profiler im Vergleich
Ich hab schön öfters gehört, dass solche Test und das Profiling ans Ende der Entwicklung gehören und man so etwas nur macht wenn man keine andere Wahl hat. Aber am Ende findet man viele Fehler dabei und ich halte es für falsch nicht schon am Anfang zu testen ob eine Anwendung auch später mit vielen produktiven Daten noch performant laufen wird. Denn am Ende sind grundlegende Fehler in der Architektur schwerer und auf wendiger zu beheben als am Anfang oder in der Mitte der Entwicklung.
Nachträglich an einzelnen Stellen Caching einzubauen ist auch nicht so gut wie von Anfang an ein allgemeinen Caching-Mechanismus zu entwerfen, der an allen relevanten Stellen automatisch greift.
Deswegen sollte man auch schon ganz am Anfang immer mal einen Profiler mitlaufen lassen und gucken, ob alles so läuft wie man es sich dachte.
Manchmal gibt es ja Probleme die man nur mit produktiven Daten nachgestellt bekommt. Oder man hat keine gute Möglichkeit vielDaten zu erzeugen um Test mit vielen realistischen Daten durch zu führen. Dann hilft oft eine Kopie der Datenbank des produktivenSystems.
Nur echte Kunden-Daten auf einer Entwickler-Workstation liegen zu haben, ist nicht wirklich toll. Der Datenschutz und so.
Hier hilft es die Datenbank in einer VM zu betreiben und einfach die gesamte VM zu verschlüsseln. Man muss nichts an der Workstationändern und hat trotzdem eine gute Sicherheit für die Daten.
Bei VirtualBox muss man nur das Erweiterungs-Pack downloaden und schon kann man dort eine gesamte VM verschlüsseln.
Ein einfaches Code-Beispiel um mit JavaScript ein Bild in ein schwarz-weiß Bild umzuwandeln. Läuft schnell und ist relativ unkompliziert einzubauen.
if(this.color=="bw"){
var idata=ctx.getImageData(0,0,ctx.canvas.width,ctx.canvas.height);
var data=idata.data;
for(var i=0;i<data.length;i+=4){
var grayValue=data*0.3+data[i+1]*0.59+data[i+2]*0.11;
Da es ja eigentlich um Web Frontend-Tools geht fehlt mir dabei etwas eine Übersicht zu den CSS-Frameworks, da diese doch schon sehr oft verwendet werden. Bootstrap, Foundation und UIKit hätten mich dabei sehr interessiert. Ich würde jetzt spontan vermuten,dass Bootstrap deutlich vorne liegen würde.
Bei den JavaScript Frameworks bin ich aber der Meinung, dass z.B. Frameworks wie AngularJS und jQuery eher schlecht mit einander zu vergleichen sind. jQuery arbeite auf einem viel nähren Level am DOM und AngluarJS durch sein Templating und Databinding auf einem eher höheren Level angesiedelt ist. Wenn man viel mit dem DOM arbeitet ist jQuery natürlich sehr von Vorteil. Bei AngularJS muss man dann öfters auf eigene Direktiven zurück greifen.
Wenn man schnell Prototypen mit grundlegenden Funktionen und paar Dummy-Daten bauen will ist AngularJS aber sehr viel besser. Man muss meistens nur das HTML-Layout um die AngularJS eigenen Attribute ergänzen und hat dann schon nach wenigen Minuten gefüllte Listen und Selects. Gerade bei Listen und Selects spielt AngularJS seine Vorteile, dann mit ein ng-repeat oder ng-options ist in wenigen Sekunden zuschreiben, wärend das Erzeugen und Befüllen und Hinzufügen von Options und LIs sehr viel aufwendiger ist.
So hat man sehr viel schneller etwas wo man meistens dann am Ende nur noch die AJAX-Request ergänzen muss um richtige Daten anstelle der Dummy-Daten zu haben.
Wenn ich aber Klick-Koordinaten in einem DIV oder einem CANVAS berechnen möchte und mit der Metrik der Elemente arbeite, dann ist natürlich jQuery die erste Wahl.
Bei den Frameworks wird also einfach zu viel einfach zusammen geworfen und in Konkurrenz gesetzt was nie konkurrieren wollte oder sich eher noch perfekt ergänzen kann. Es gibt Artikel darüber wie AngularJS und React.js. Google und Facebook zusammen kann toll sein.
Bei den Module Bundlers kann ich nur zustimmen, dass die eine tolle Sache sind und ich bei meinem cJS auch RequireJS als Möglichkeit eingebaut Controller zu laden. Aber auch ist selbst benutze es irgendwie nie. Bei großen Anwendungen ist es bestimmt toll und eine Art JS-Class-Loader. Aber bei kleinen Anwendungen mit 6 Controllern ist das einfache einbinden irgendwie übersichtlicher.
Aber an sich sind die toll und man sollte sie viel öfter verwenden. Leider werden alle Controller am Anfang direkt instanziert. Ideal wäre es wenn der Controller erst geladen wird, wenn er das erste mal auch wirklich angesprochen wird. Also die Bindings auch erst erstellt werden, wenn diese das erste mal in Aktion kommen.
So ein Framework würde sicher viel Speicher sparen.
Mit Hilfe der Reflections-Klassen in PHP sit es auch z.B. möglich sich einen JSON-Encoder zubauen, der nicht verlangt, dass alle Attribute der Klasse public sein müssen. Ähnlich wie in Java kann man hier auch auf private Attribute ohne Probleme zugreifen wenn man dieses setzt:
$prop->setAccessible(true);
Wenn man dann noch neben den skalaren Typen eine extra Behandlung für Array-Inhalte und Objekte einbaut, kann man sich ganz einfach einen rekursiven JSON-Encoder bauen, der auch mit normalen Beans mit Gettern und Settern zurecht kommt und man keine zusätzlichen DTOs mehr extra anlegen muss.
class XWJSONConverter{
public function __construct(){
Ein Decoder war mir jetzt nciht wirklich wichtig, da in meinen Anwendungsfällen PHP eigetnlich immer nur JSON für REST-APIs generiert und auf JavaScript-Seite, das decodieren in eine Objekt-Struktur ohne Probleme dann wieder möglich ist. Da sind private und public nicht mehr wichtig.
Was hier noch interessant sein könnte ist mein Versuch mit Annotations in PHP zu arbeiten. Wenn man verhindern will, dass ein Attribute mit nach JSON encodiert wird, kann man das damit verhindern:
Ein wirklich gutes Buch. Der Vorteil ist, dass Kapitel so geschrieben sind, dass man auch mal welche überspringen kann. Zum Beispiel das Kaptiel über Sourcecode Management Systeme wie SVN oder CVS werden heute kaum noch jemanden neues zeigen können.
Auf die Zusammenfassungen am Ende der Kaptiel und des gesamten Buches sind toll. Es gibt Listen wie es laufen sollte, wie man es verbessern kann und welche Anzeichen dafür sprechen, dass Verbesserungsbedarf besteht.
Ich fand das Kapitel über Daily-Meetings und "The List", also priorisierte Todo-Listen wirklich gut und sie gaben mir neue Denkanstöße. Ich werde mal versuchen Daily-Meetings in meinen Arbneitstag einzubringen und umzusetzten.. mal sehen was mein Chef dazu sagt :-)
Ich kann jedem Entwickler, Projektleiter und Kontakt-Person, die mit einem der beiden erst genannten für einen Kunden Kontakt halten muss empfehlen.
Denn wenn der Kunde die Probleme der Entwickler versteht und der Entwickler die Probleme der Kunden (etwas technisches zu Formulieren und Zeiten abschätzen zu können), dann kann man viele Missverständnisse schon mal vermeiden. Und dieses Buch ist einfach formuliert mit Reallife-Beispielen und könnte als neutraler Dritter zwischen beiden Seiten einen gemeinsamen Konsens vermitteln.
REST mit dem Zend Framework 2 soll ganz einfach gehen. Geht es auch. Bestimmt gibt es viele verschiedene Möglichkeiten, aber diese scheint erstmal ganz gut zu funktionieren. Den XWJSONConverter hatte ich shcon in einem vorherigen Blog-Post vorgestellt. Man kann natürlich auch JSON:encode aus dem ZF2 verwenden oder json_encode().
class IndexController extends AbstractRestfulController{
private function _getResponseWithHeader(){
$response = $this->getResponse();
$response->getHeaders()
//make can accessed by *
->addHeaderLine('Access-Control-Allow-Origin','*')
//set allow methods
->addHeaderLine('Access-Control-Allow-Methods','POST PUT DELETE GET')
//change content-type
->addHeaderLine('Content-Type', 'application/json; charset=utf-8');
Lange Zeit habe ich auch immer bei Columns von Datenbank-Tabellen immer ein Prefix verwendet. Die Tabelle TESTS hatte dann z.B. die Spalte TEST_ID. Daran ist ja auch erstmal nichts verkehrt. Probleme gab es mit Oracle und der Beschränkung auf 30 Zeichen für den Spaltennamen in einigen Fällen.
$entity->setId($data["TEST_ID"]);
Der Code oben funktioniert auch super, wenn man jedes Value "per Hand" in das Object schreibt.
Wenn wir aber nun ein automatisches Mapping über Annotationen nutzen kann es in einigen Fällen schnell umständlich werden.
Wenn wir keine Ableitung und Vererbung benutzen, ist auch hier kein Problem zu erwarten. Wenn wir aber eine Basic-Klasse verwenden, von der alle anderen Klassen ableiten, haben wir schnell ein Problem, weil wir in der Basic-Klasse in den Annotationen einen Platzhalter für den Prefix verwenden müssten. Ohne Prefix geht es hier sehr viel einfacher.
/**
* @dbcolumn=ID
*/
private $id=0;
/**
* @dbcolumn={prefix}_ID
*/
private $id=0;
Deswegen sollten Prefixe nur bei FKs verwendet werden, um ein automatisches Mapping unkompliziert nutzen zu können. Wenn man es jetzt nicht nutzt, will man es später vielleicht und kann dann jetzt schon alles so bauen, um später keine Probleme zu bekommen. Platzhalter funktionieren natürlich auch.. gehen aber zur Lasten der Performance.