Hier mal eine anfänglich kleine Sammlung zum Thema HTML 5 generell – grob kategorisiert. Vervollständigungen und Streichungen willkommen.
Continue reading “HTML5 – Sammlung von Ressourcen, Dokus und Browser-Fallbacks”
…dev, tech problems and solutions.
Hier mal eine anfänglich kleine Sammlung zum Thema HTML 5 generell – grob kategorisiert. Vervollständigungen und Streichungen willkommen.
Continue reading “HTML5 – Sammlung von Ressourcen, Dokus und Browser-Fallbacks”
Wer kennt das nicht: man entwickelt mit JSON, will die AJAX Rückgabe kontrollieren und macht, wie gewohnt, im Firefox den Firebug auf und checkt unter Console den AJAX Request und sieht folgendes:
Nicht sehr erhellend! Total unübersichtlich! Nicht gut!
Wird JSON mit dem richtigen Header ausgeliefert, unter PHP geht der so:
header('Content-type: application/json');
PHPUnit hat coolerweise eine Extension für Selenium Tests.
Dafür braucht man noch den PHP Client für die Selenium Remote Control.
pear install Testing_Selenium-0.4.3
Bei mir auf Debian Lenny, bzw. Mac OSX musste ich noch den include_path dafür anpassen,
damit phpunit Testing/Selenium.php gefunden hat.
Damit kann man mit PHP komfortabel einen Selenium Test Server über die Selenium RC ansprechen,
der dann beliebige Browser für functional Tests benutzt.
Der Selenium Server ist auch im Prinzip schnell installiert
und lokal ist das ganze einigermaßen unproblematisch, weil man ja schon mal die Browser seines OS zur Verfügung hat.
In einem Continuous Integration Setup möchte man aber vielleicht Selenium lieber auf einem Web Server laufen lassen.
Da sieht es dann erstmal weniger gut aus mit Browser executables.
Was also tun?
gerade gefunden:
git prompt – GIT repository status direkt im shell prompt.
nützlich und schön bunt.
Hier mal ein Beispiel für einen (via shell script) automatisierten build bei einer PHP, Symfony 1.4 Anwendung mit GIT zur Versionskontrolle.
#wipe old version of build db mysql -uUSER -pPW drop build-db
#wipe the build workspace rm -rf ./build-workspace
#checkout the sourcecode git clone git@my-domain.com:my-repository ./build-workspace
cd build-workspace
Da ich ein Kontrollfreak bin ;) wollte ich mal meinen vServer monitoren.
Nach allem was ich so las, scheint wohl Munin das geeignete Tool zu sein.
Also aufgemacht und es installiert:
Munin ist Server-Client mäßig aufgebaut, ich installiere der Einfachkeit halber mal Server und Client (Node) auf der selben Maschine.
Für Debian Lenny geht das ganz einfach über apt-get:
apt-get install munin munin-node
So nun noch das Webinterface umlegen: ich mache dafür eine eigene Subdomain bei einem meiner vHosts über Plesk.
zB munin.nerdpress.org (nein, die url gibts in echt nicht)
jetzt muss noch das www Verzeichnis, welches Munin generiert umkopiert werden in das Subdomain Verzeichnis:
cp -r /var/www/munin/* /var/www/vhosts/nerdpress/subdomains/munin/httpdocs
Man sollte sich tatsächlich angewöhnen beim Entwickeln immer eine Console offen zu haben und die error_log zu beobachten.
tail -f /var/log/apache2/error_log
Bekommt man nämlich so einen Fehler in der error_log:
ALERT - configured POST variable limit exceeded - dropped variable ...
… bleibt die Seite meistens ohne Fehlerausgabe trotz E_ALL und es passieren komische Dinge.
Dann kann man schonmal eine ganze Weile damit verbringen ganz woanders zu suchen.
Mit offenem error_log wäre das nicht passiert ;).
Die Doku stellt in Aussicht, dass man den “normalen” Doctrine-Namespace-Shortcut benutzen kann, also bspw. @Entity anstelle von @DoctrineOrmMappingEntity. Funktioniert aber nicht, weil in irgend einer Service-Configuration dieser Namespace auf einen Alias gemapped wird, der da lautet “orm”. Die Syntax lautet aber nun auch nicht @ormEntity, sondern @orm:Entity. Schreibt man sein Model also bspw. so:
<?php namespace ApplicationHelloBundleEntity; /** * ApplicationHelloBundleEntityUser * * @orm:Table(name="users") * @orm:Entity */ class User { /** * @var integer $id * * @orm:Column(name="id", type="integer") * @orm:Id * @orm:GeneratedValue(strategy="AUTO") */ protected $id;
sollten alle CLI-Tasks auch wunderbar funktionieren. Es bleibt zu hoffen, dass die DI-Services eine reichhaltige Parameter-Dokumentation spendiert kriegen und das ganze Bundle-System eine transparente, dokumentierte API erhalten (wo zum Teufel liegt in der Sandbox bitte der versprochene Doctrine-Controller?)
Die Einstellung findet sich übrigens in der Service-Configuration unter src/vendor/symfony/src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml:
<service id="doctrine.orm.metadata_driver.annotation.reader" class="%doctrine.orm.metadata.annotation_reader_class%"> <call method="setAnnotationNamespaceAlias"> <argument>DoctrineORMMapping</argument> <argument>orm</argument> </call> </service>
Ist leicht zu finden, wenn man weiß, wonach man suchen muss. Ich denke, es ist am einfachsten, die Service-Definition des DI-Containers an entsprechender Stelle an seine eigenen Bedürfnisse anzupassen. Wie das zuverlässig und projektübergreifend funktioniert, erkläre ich vielleicht mal, wenn ich’s selbst gerafft hab.
Achso, hier noch der Nebensatz (etwas herunter scrollen), in dem gesagt wird, das Jonathan irgendwann mal das “orm:” Präfix einführt. Symfony 2 ist definitiv noch nicht ready for production (was aber auch niemand behauptet).
Während der Bastelei am DI-Container bin ich über die beiden Methoden ReflectionParameter::isOptional() und ReflectionParameter::isDefaultValueAvailable() gestoßen. Der kleine, undokumentierte und feine Unterschied ist folgender:
Unter Dependency Injection versteht man heute nicht nur ein einfaches Entwurfsmuster, sondern vor allem Framework-gestützte Mechanismen, die den konkreten Implementierungsaufwand verringern (Entwicklungszeitoptimierung), dem Entwickler bessere Übersicht über Abhängigkeiten zu schaffen (Applicationdesignoptimierung) und die Anzahl der Instanzen gleichen Prototyps zu minimieren (Performanceoptimierung).
Heute möchte ich einen alternativen, vielleicht pragmatischeren Ansatz als der andererer populärer Implementierungenn herbeispinnen, um Dependency Injection (DI) in PHP 5.3 zu realisieren.
Continue reading “Dependency Injection mit PHP 5.3, Runkit-Erweiterung und Doctrine 2-Annotationen”