Archiv des Autors: Sascha Presnac

XDebug Logo

XDebug und Zend Server CE für Unit Tests und Code Coverage Reports

Wer Unit Testing betreibt, der will auch Code Coverage, ganz klare Sache. Für Code Coverage benötigt man in Verbindung mit phpUnit XDebug. In der Regel kein Problem.

Wer allerdings den ZendServer benutzt der war bisher angeschmiert, den XDebug im ZendServer zu konfigurieren kann nervig sein und eine falsch eingetragene Zeile kann den Betrieb des ZendServers sogar komplett lahmlegen.

Aber natürlich gibt es einen Weg, XDebug, ZendServer inkl. ZendDebugger laufen zu lassen, du bekommst also den ZendDebugger zum debuggen und XDebug zum Unit Testen deiner Anwendung, das beste aus beiden Welten – unter Windows 😉

Bereit? Los geht’s:

  1. ZendServer stoppen, entweder per Dienstkonsole oder mit „Apache Service Monitor“
  2. Lade dir die fehlende XDebug dll bei XDebug.org runter.
    Welche ist die passende?
    Zunächst erstmal die PHP Version deines ZendServers, dann den Link OHNE „TS“ und den mit 32-Bit, der sollte passen – war bisher bei allen meinen ZendServer-Installationen so.
    Beispiel mit PHP 5.4: „PHP 5.4 VC9 (32 bit)“
  3. Die .dll legst du nun im Verzeichnis
    /ZendServer/lib/phpext

    deines ZendServers ab.

  4. Nun ab in die php.ini
    Dort trägst du ziemlich weit unten aber ÜBER diesem Eintrag:

    zend_extension="C:\zend\ZendServer\lib\ZendExtensionManager.dll"

    (Pfad ist bei dir zumindest ähnlich)
    das hier ein:

    zend_extension="C:\zend\ZendServer\lib\phpext\php_xdebug-2.2.2-5.4-vc9-nts.dll"

    Natürlich ersetzt du den konkreten Namen durch deinen, bei mir ist das der ZendServer mit PHP 5.4 in der zum Veröffentlichungszeitpunkt aktuellsten Version von XDebug.

  5. Spaß mit Code Coverage!
    Ja, genau, schon fertig.

Ab nun kannst du Code Coverage Reports bekommen.

Was nicht geht: Du kannst mit XDebug (höchstwahrscheinlich) nicht wirklich debuggen – aber du hast ja den Zend Debugger, der zumindest mit dem Zend Studio wesentlich besser funktioniert.

Ich selbst habe bisher keine verlässlich funktionierende Konfiguration gefunden, mit dem ich via XDebug im Zend Server debuggen und profilieren konnte; mir reicht XDebug zum erzeugen der Code Coverages.

Vielen Dank geht an „Limespacer“ für diesen Beitrag, der mir dabei sehr geholfen hat:
http://www.limespace.de/2009/07/15/zend-server-ce-mit-xdebug/

P.S. Bei mir geht es auch mit aktiviertem Zend Debugger, falls das bei dir nicht der Fall sein sollte, dann schalte diesen wie im verlinkten Beitrag gezeigt einfach ab.

Windows Developer System – Virtual Hosts (03)

Nachdem wir die Basis unseres Systems nun installiert haben kommen wir nun zu einem Punkt, der ein wenig Erklärung bedarf, bevor wir zur Umsetzung kommen können: den Virtual Hosts.

Virtual Hosts sind, wie der Name schon sagt, virtuelle Maschinen, die es nicht wirklich gibt, dessen rein virtuelle Existenz wir uns zunutze machen, um eine echte Maschine zu simulieren. Aber von vorn:

Jeder kennt DNS, man gibt www.example.com ein, der Browser lädt und gibt uns entweder eine Webseite oder eine Fehlermeldung aus. Mal ganz stark vereinfacht rufen wir aber gar nicht die Domain mit Namen auf, weil es die gar nicht gibt, sondern wir rufen einen bestimmten Verzeichnisinhalt einer bestimmten IP auf. Da sich aber kein Mensch eine URL a la

http://192.168.178.254/~fritzdiewurst/whatever

merken könnte, erfand man DNS. DNS „matched“ einen Namen auf eine bestimmte IP.

Dieser Name ist in 2, meist in 3, Teile geteilt, damit die Auflösung schneller geht (das System ist recht alt, heute würde man dies nicht mehr mit Schnelligkeit begründen, damals war das aber echt so) und zwar der „First Level Domain“ (oder „Top Level Domain“ TLD), das ist meist das Länderkennzeichen am Ende, in unserem Fall das „com“, die „Second Level Domain“, das ist der eigentliche Name, bei uns also „example“ und die „Third Level Domain“, besser bekannt als „Subdomain“, bei uns das „www“. Top- und Second Level werden per DNS aufgelöst, Third ist Sache des Domaininhabers, aber das sind nur Details, wichtig also, dass dieser Name nun in eine bestimmte IP aufgelöst wird und der Request dann beim Webserver dieser IP weitergeht. Der Webserver bekommt nun ebenfalls den gesamten Request und kann dieser weiter auflösen auf bestimmte Verzeichnisse, so dass ein Webserver viele Domain mit unterschiedlichen Inhalten beinhalten kann.

Damit das alles funktioniert gibt es auf der ganzen Welt sogenannte DNS-Server die diese Auflösungsarbeit erledigen. Diese Synchronisieren sich alle untereinander, damit alle die gleiche Antwort auf die selbe Frage geben. Wie gesagt, stark vereinfacht, aber im Prinzip funktioniert das so.

Und warum erzähle ich das? Ganz einfach. Jedes Betriebssystem hat eine Steuerdatei die es dem lokalen System erlaubt, seine eigenen DNS-Richtlinien zu hinterlegen. Man kann also angeben, dass man gern bei der Eingabe von example.com auf eine bestimmte IP gelangen möchte. Dies ist die sogenannte „hosts“ Datei.

Und wofür brauchen wir als Entwickler so eine „hosts“ Datei?
Okay, zum Kern des „sagen-wollen’s“. Du betreust bei deiner Arbeit meist ein Projekt, das unter einer bestimmten URL zu erreichen ist, nehmen wir dieses Blog, da ist die URL

http://www.codemercenary.de

Wenn ich nun was an meinem Blog umprogrammiere, dann mache ich das nicht Live auf dem Server (sog. „hot coding“), sondern lokal auf meinem Entwicklungsrechner zuhause. Da habe ich meinen Webserver und meinen Datenbankserver.

Normalerweise legst du deine Daten auf deinem lokalen Webserver in das sogenannte „Document Root“ ab, dass ist in unserem Beispiel des Zend Servers das Verzeichnis „C:\zend\Apache2\htdocs“. Alles, was du da ablegst, kannst du mit der Eingabe von

http://127.0.0.1

abrufen, legst du also eine „phpinfo.php“ direkt in „htdocs“ rein, dann tippst du in deinem Browser

http://127.0.0.1/phpinfo.php

ein und du erhälst die Antwort, die das Script liefert. Easy, oder?

Das kannst du nun für alle deine Projekte machen, am besten jedes Projekt in ein neues Verzeichnis unterhalb von „htdocs“. So könnte ich z.B. mein Blog unter

http://127.0.0.1/codemercenary

aufrufen und alles wäre gut … oder nicht?

Eigentlich nicht, denn bald wirst du feststellen, dass sich manche Skripte sehr seltsam verhalten, wenn die nicht der „Platzhirsch“ auf der URL sind. Kurz: Manches lässt sich besser testen, wenn du es möglichst Live auf dem Server haben würdest. Willst du aber nicht, weil das „bad style“ bzw. „hot coding“ wäre und das gewöhnst du dir besser erst gar nicht an.

Es wäre doch super, wenn ich einfach

http://www.codemercenary.de

eintippe und der Browser ruft die Daten direkt von meinem lokalen Webserver ab. Ne, auch nicht gut, weil du dich dann gar nicht mehr per FTP verbinden könntest, falls dein FTP-Hostname der gleiche wäre. Doof, und nun?

Simpel: So gut wie alle Skripte die ich kenne (und das sind ne Menge, vor allem im Legacy Bereich) reagieren nur auf die TLD und die SLD, so gut wie nie auf die Subdomain und das nutzen wir nun aus. Wir definieren uns nun fest in den Kopf, dass es bei jedem Projekt nur 2 URLs gibt: eine mit www, die ist Live und eine mit einer Subdomain, die uns anzeigt, dass es sich um das Entwicklersystem handelt, also unser lokales System. Ich benutze dafür die Subdomain „dev“, so dass mein Aufruf

http://dev.codemercenary.de

lautet, wenn ich mal meine lokale Version testen oder debuggen will.

Damit nun der Aufruf nicht ins Internet geht sondern bei mir lokal verarbeitet wird muss ich meine „hosts“ anpassen. Die „hosts“ Datei findest du unter Windows immer an diesem Platz:

\Windows\System32\drivers\etc\hosts

Du musst zum bearbeiten übrigens Admin-Rechte haben.

Die Einträge machst du – vereinfacht gesagt – im Format IP<Leerzeichen>Name, in meinem Fall trage ich dort also

127.0.0.1 dev.codemercenary.de

ein. Damit wird der Aufruf

http://dev.codemercenary.de

schon mal auf die IP 127.0.0.1 umgeleitet und das ist bei jedem System die lokale Adresse!

Leider weiß nun unser Zend Server noch nix davon. Falls du nun schon mit gestartetem Server diese URL eingebt kommst du zwar auf dein lokales System, aber der Server führt dich in das globale Document Root, also direkt in „htdocs“. Da willst du aber nicht hin, sondern in das Unterverzeichnis deines Projektes.

Zur Info: Falls du schon <VirtualHost> Einträge hast, von denen aber keiner auf den ServerName matched, dann benutzt der Apache deinen ersten <VirtualHost> Eintrag in der .conf.

Nun gäbe es zwei Möglichkeiten. Du glücklicher, der du nur ein Projekt zu betreuen hast, kannst nun das Document Root des ganzen Servers auf das entsprechende VZ legen oder gleich alles in „htdocs“ speichern, du hast eh nur ein Projekt, da ist der Rest egal.

Die meisten von uns haben aber mehr wie nur ein Projekt und da heißt es nun, dass wir unserem Zend Server – genauer gesagt dem Apache Webserver – beibringen wollen, dass er beim Aufruf von

http://dev.exampleA.com

ins Unterverzeichnis „A“ gehen soll und bei

http://dev.exampleB.net

ins Verzeichnis „B“.

Für diese „Magie“ brauchen wir nun die Virtual Hosts, wir teilen unseren einen physikalischen Webserver nun in viele Virtuelle Webserver auf und können damit für unsere Projekte „echtes“ Internet simulieren.

Auch hierfür, für die Bearbeitung der Virtual Hosts, gibt es viele Wege. Keiner davon ist falsch, keiner der einzig richtige. Ich zeige dir einen Weg, mit dem ich nun seit 3 Jahren erfolgreich Beruflich arbeite. Es muss nicht der beste sein, aber er funktioniert und ist recht einfach zu bedienen und darüberhinaus ist dieser Weg der Updatesichere Weg, sobald du deinen Server updatet. Ich versuche an geeigneter Stelle auch alternative Wege zu zeigen, so wie mir diese bekannt sind.

An alle Linux-SysAdmins: Nicht böse sein, aber niemand weiß alles und ich bin gern bereit, dazu zu lernen. Die Kommentarfunktion bietet für Aufklärung Platz 😉

Also, Editor auf, folgende Datei laden:

\zend\Apache2\conf\zend.conf

Die Datei fängt meist so oder ähnlich an:

<Location /server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

Kleiner Tip am Rande: Lass alles stehen, was in der Datei steht, zumindest so lange, bis du weißt, was die einzelnen Einträge zu bedeuten haben. Für’s erste brauchst du das alles nicht.

Zuallererst brauchst du in deiner „zend.conf“ einen Eintrag „NameVirtualHost“, sonst weiß der Apache gar nicht, was er machen soll. Dazu steht als erste Zeile der Datei:

NameVirtualHost 127.0.0.1:80

Um nun einen Aufruf des Browsers Namensabhängig zu verarbeiten habe ich diesen Eintrag:

<VirtualHost 127.0.0.1>
 ServerName dev.codemercenary.de
 DocumentRoot "C:\zend\Apache2\htdocs\codemercenary"
 RewriteEngine On
 ErrorLog "logs/codemercenary.log"
 CustomLog "logs/codemercenary.log" common
 <Directory "C:\zend\Apache2\htdocs\codemercenary">
  AllowOverride All
  Allow from all
  Options Indexes FollowSymLinks
 </Directory>
</VirtualHost>

Was bedeutet das nun alles? Die wichtigen Stellen sind diese:

  • ServerName: Dort steht der Name, so wie du ihn im Browser eingibst
  • DocumentRoot: Dort sucht der Server nach Inhalten
  • RewriteEngine On: Die mod_rewrite Engine wird benutzt
  • ErrorLog/CustomLog: Die Logfiles werden getrennt von den anderen geschrieben, sehr nützlich zur Fehlersuche
  • Directory-Eintrag: Ohne den läuft nix 😉 Hier nochmal das DR des Projektes angeben

Hast du mehrere Projekte, dann kannst du diese hintereinander dort eingeben, also mehrere <VirtualHost> Knoten. Die VirtualHosts für einen bestimmten Port müssen direkt nach der „NameVirtualHost“ Direktive eingetragen werden, die diesen Port bezeichnet und vor einer Direktive, die andere Port behandelt.

Hast du ein Projekt, dass mehrere Domains mit einem Script behandelt (Multi-Domain-Shops als Beispiel), dann gibst du einfach mehrfach untereinander die „ServerName“ Direktive ein, jeweils eine Domain pro „ServerName“ … zumindest funktioniert das bei mir so 😉

Hast du ein Projekt für andere Ports als Port 80 siehst du etwas weiter unten ein Beispiel für Port 10081, den Admin-Zugang des Zend Servers. Analog dazu lässt sich auch jeder andere Port ansprechen, es sei denn, er ist anderweitig belegt (21 für FTP als Beispiel).

Die Ports musst du übrigens NICHT in der „hosts“ Datei angeben, die ist Portunabhängig.

Wichtig ist nun, dass du deinen Server neu startest, denn sonst kennt der deine neuen Regeln für die VirtualHosts nicht. Bei den Einträgen der „hosts“ ist es zumindest beim Firefox so, dass du den einmal komplett zu und wieder auf machen musst, damit der die „hosts“ neu einliest, der Chrome und der IE (bei mir 10) machen das bei jedem Aufruf.

So, und da nun einige nach der versprochenen Alternative schreien: Ja, es geht auch anders. Du kannst anstelle einfach alle VirtualHosts in eine große Datei zu schreiben auch eine Datei für jeden VirtualHost anlegen, falls du das möchtet oder braucht (ließe sich zum Beispiel in deine Versionskontrolle integrieren). Der Zend Server ist standardmäßig so konfiguriert, dass er alle .conf Dateien im Verzeichnis

\zend\ZendServer\etc\sites.d\http\__default__\0

einliest und verarbeitet.

Du kannst also den <VirtualHost> Eintrag dort als Datei

codemercenary.conf

hinterlegen, dann noch eine „exampleA.conf“ mit der <VirtualHost> für exampleA.com usw.

Dieser Weg ist näher am „normalen“ Apache Server, funktioniert aber genauso.

Abschließend noch der Vorteil dieser gesamten Aktion: In deinem Projekt kannst du nun recht simpel prüfen, ob du lokal oder produktiv bist und dann entsprechend verschiedene Konfigurationen laden, z.B. für die Datenbankverbindung.

Einfach ein

if ('dev.codemercenary.de' == $_SERVER['HTTP_HOST']) {
  // lade lokale configuration
} else {
  // lade produktive configuration
}

und schon hast du auch in deiner Versionskontrolle keine verschiedenen Dateien mehr für lokal oder produktiv und kannst gefahrlos deployen.

Im nächsten Teil geht es dann weiter mit der Konfiguration deines Systems für PEAR, als Vorbereitung auf QA-Tools wie phpcs, pdepend, phpmd und natürlich auch phpunit. Bis dann…

Welche Dateien werden grade benutzt?

Besonders bei Legacy-Anwendungen stößt du häufig an den Punkt, dass eine bestimmte Funktion mehrfach deklariert wurde. In meinem extremsten Falle war das sogar in bis zu 12 Dateien – die gleiche Funktion, in 12 Dateien, zwölf!

Na gut, das ist echt die Ausnahme, Legacy Anwendungen tendieren zu einem Durchschnitt von 2-3 redundaten Funktionsdeklarationen, aber selbst das ist zuviel.

Nun möchtest du natürlich wissen, welche Funktion in deinem Fall nun konkret aufgerufen wird, damit du dem Kunden schnell und verlässlich die lang erwartete neue Funktion einbauen und vorführen kannst. Mit einer IDE geht es recht schnell, STRG+Linksklick beherrschen seit dem Visual Studio so gut wie alle IDEs – wobei es auch hier schon oft vorgekommen ist, dass selbst die IDE es nicht wusste und alle 3 vorkommen vorschlug. Ja Herrschaftzeiten, woher soll ICH denn bitteschön wissen, welche der drei Dateien denn nun aufgerufen wird?

Ganz einfach, mit get_included_files() bekommst du es heraus.

$included_files = get_included_files();
var_dump($included_files);

Und nun dürfte es etwas leichter fallen, die Wunschfunktion des Kunden einzubauen. Aber nur etwas 😉

Windows Developer System – Der Webserver (02)

Kommen wir in der Reihe des Windows Developer Systems nun zum Kern eures Entwickler-Systems, dem Webserver. Es gibt verschiedene Möglichkeiten, welchen Webserver man als Entwickler benutzt. Die Haupt Zielplattform wird sicherlich immer noch der gute, alte Apache Webserver sein. Da wir als Windows-ianer aber etwas verwöhnt sind, was Installation und Konfiguration von Software angeht benutzen wir für diesen Teil den Zend Server. Der hat den Vorteil, dass er komplett fertig als „One-Click-Installer“ reinkommt und nichts kostet außer ein paar Minuten Zeit.

Zuerst begibt man sich auf die aktuelle ZendServer Downloadseite und wählt die für sich passende Installation aus. Aktuell gibt es dort den ZS für PHP 5.3 und PHP 5.4 zur Auswahl.

Die Downloadseite des Zend Servers

Es wird zum Download AFAIK kein Account benötigt, falls doch ist dieser kostenfrei und auf jeden Fall die Mühe wert.

Nachdem ihr den Server runtergeladen habt, könnt ihr die Installation wie gewohnt starten. Der Server ist wirklich einfach zu installieren. Beim Zielverzeichnis können wir der Einfachheit halber Den Pfad “C:\” wählen, der Server wird dann unter “C:\zend” installiert. Die kurzen Dateipfade werden uns später die Arbeit etwas leichter machen, wenn es darum geht, Virtuelle Hosts aufzusetzen – dazu später mehr.

Das wirklich schöne am Setup des Zend Servers ist, dass im Schritt “Custom Setup” ganz unten die Option “MySQL Server” angewählt werden kann und damit nicht nur ein MySQL Server runtergeladen wird, sondern das Ganze auch fix und fertig serviert und konfiguriert wird. Wirklich praktisch!

Custom Setup des Zend Servers

Die restlichen Optionen müsst ihr nach euren Anforderungen setzen, ich belasse meist alles so wie es ist und füge nur die Option des MySQL Server hinzu, dann habe ich schon ein funktionierendes System.

Die Installation dauert je nach Optionen, Downloadgeschwindigkeit und CPU ein paar Minuten. Zeit für einen Kaffee 😉

Nach der Installation _kann_ es sein, dass manche Rechner neu starten müssen, andere jedoch nicht. Tut wie euch geheißen und ihr bekommt anschließend den kompletten Zend Server als Trial-Verison für 30 Tage. Keine Angst, nach Ablauf der 30-Tage verwandelt sich die “echte” Zend Server in die “Free”-Version, die genauso als Entwickler-Basis verwendbar ist – nur ein paar Profi-Features fehlen, das wirklich wichtige bleibt aber erhalten.

Je nach Präferenz könnt ihr in den Diensten von Windows nun auch den automatischen Start von “Apache” und “MySQL Server” auf “Automatisch” belassen oder auf “Manuell” setzen. Ich setze den Apache meist auf Manuell und starte diesen bei Bedarf, der MySQL Server läuft dagegen ständig, da ich öfters mal Datenbankabfragen aus meiner IDE starte, während ich programmiere. Aber auch hier: Eure Bier, macht’s, wie’s euch beliebt.

In eurer System-Tray (neben der Uhr) habt ihr nun auch ein schickes neues Icon, ein Klick drauf und ihr könnt den Server starten, stoppen oder restarten wie es euch gefällt. Ein Doppelklick führt zu einer netten Übersicht, die in der Praxis aber kaum Bedeutung hat.

Ob ihr nun glaubt oder nicht, euer Webserver mitsamt MySQL-Server ist nun installiert und einsatzbereit. Yes, it’s that easy!

Wenn der Apache gestartet ist erreicht ihr die Konfigurationsseite des ZendServers unter der URL

http://localhost:10081/ZendServer/

Beim ersten Aufruf (oder nach einem Update) müsst ihr den Üblichen EULA’s zustimmen und angeben, ob ihr den Server als “Development” Server benutzt oder als “Production”, dann ein Password für den Admin-Zugang eintragen und fertig ist der Server!

Zend Server Dashboard direkt nach Installation

Im Punkt “Configurations” könnt ihr einzelne Komponenten (de-)aktivieren und auch alle Teile der php.ini bearbeiten, inkl. Erklärungen. Grade für Neulinge im Bereich Webserver sehr praktisch. Der Server kann nach allen Änderungen die Ihr braucht per Klick neu gestartet werden.

Der größte Teil unter dem Mneüpunkt “Applications” fällt übrigens nach dem Ende der Trial-Phase weg und betrifft eh nur Cloud-“Zeug”, was erstmal nicht von belang sein soll. Wir wollen ja unser lokales System aufbauen und die Grundlage dafür ist nun vorhanden.

Schaut euch also nun in Ruhe euren neuen lokalen Webserver an. Im nächsten Teil geht es weiter mit der Konfiguration der Virtuellen Hosts und was man damit schönes machen kann.

Zend Certified Engineer (ZCE)

Geschafft! Seit Mittwoch gehöre ich zum Kreise der „Zend Certificated Engineer PHP 5.3“ kurz ZCE. Den Beweis dazu trete ich auch leicht an, hier mein Eintrag in den Zend Yellow Pages zu meinem Profil. Ich bin sehr stolz, dass ich dies geschafft habe.

Vorbereitet habe Ich mich sehr lange und intensiv auf die Prüfung und war nachher eigentlich überrascht, dass ich so schnell fertig war (ich hatte noch 40 Minuten von meinen 90 übrig). Ein großes „Danke“ geht auch an meinen Arbeitgeber, der mir das Zertifikat gesponsert hat.

Ausruhen möchte ich mich jedoch auf diesem Erfolg nicht, das nächste Zertifikat wäre in meinen Augen das des „Oracle Certified Professional, MySQL 5 Developer“ oder gibt es in euren Augen noch „sinnvollere“ Zertifikate, die man als PHP-Entwickler anstreben sollte?

header-Umleitung funktioniert nicht? Ursache finden …

Wenn’s mit dem

header('Location: http://www.example.com');

mal nicht funktioniert, liegt es daran, dass schon eine Ausgabe vorher stattgefunden hat.

Manchmal kann es aber durchaus kompliziert sein, diese Ausgabe zu finden, teilweise meldet auch das error.log nichts, dann hilft dir eine freundliche PHP-Funktion weiter, die du zu Testzwecken direkt vor das header-Kommando stellst:

$file = ''; 
$line = ''; 
headers_sent($file, $line); 
print_r($file, $line);

headers_sent zeigt dir nun die Stellen , die vorher bereits eine Ausgabe durchgeführt haben.

Werkzeugkasten 2012

In guter Tradition hier etwas verspätet mein Werkzeugkasten für 2012.

Ich stelle dir hier Werkzeuge und Programme vor, mit denen ich gut klarkomme. Evtl. stoße ich dich auf ein Programm, was du noch nicht kennst, was dich aber produktiver macht. Wenn ja freut mich das. Ein Hinweis aber: Ich bekomme von keinem der hier vorgestellten Anbieter irgendetwas für diese Liste. Diese Meinungen hier sind nicht gekauft, die sind durch Wochenlanges Ausprobieren, rumfummeln, reinfrickeln, usw. erarbeitet. Wollte das nur vorher klarstellen, auch wenn es sich manchmal wie ein Pressetext liest.

Die Schwerpunkte “auf Arbeit” dieses Jahr sind zweigeteilt: PHP und MySQL, sowie Continous-Interation und Frameworks

  • Zend Studio
    Wie beim letzten Jahr bleibt Zend Studio die IDE meiner Wahl. Auch harte Konkurrenz durch Netbeans und PHPStorm (in dieser Reihenfolge) konnte der High-End-IDE nichts anhaben. Sicher glänzt Netbeans durch viele kostenlose Features – privat setze ich nur auf Netbeans, weil mir das Studio da zu teuer ist –, aber die gewohnte “alles-geht”-Mentalität und das “out-of-the-box” Prinzip – vor allem im Bereich debuggen von PHP-Scripten – hat mich auf’s neue Überzeugt. PHPStorm habe ich getestet – dank einer geschenkten Lizenz sogar über einen längeren Zeitraum – allerdings konnte es sich nicht gegen das Zend Studio oder Netbeans behaupten; aber ich habe bestimmt nur die falschen Projekte und die falschen Ansprüche Zwinkerndes Smiley.
  • Zend Server (CE)
    Alles aus einem Installer – Apache und MySQL-Server – und alles Updatefähig per Mausklick – noch immer überzeugt mich das “easy-going” Prinzip vom Zend Server; wahrscheinlich, weil das Studio auch besser damit zusammenarbeitet oder weil ich einfach zu faul bin, mir jede Quelle selbst zu kompilieren. Basis meiner lokalen Entwicklungsumgebung bleibt der ZendServer (CE, oder heute free-edition).
  • SVN, Vercue, Subversion Edge
    Yep, die Versionskontrolle ist ebenfalls wieder dabei. Wir wurden professioneller, haben die selbst ge”apt-get”tetten Quellen durch eine fertige kostenlose Lösung auf Serverseite namens Subversion Edge ersetzt und sind alle zufrieden. Ich, weil ich nun von überall per Browser an die Repo-Verwaltung komme, meine Kollegen, weil die das nun auch können, mein Chef, weil alle gut drauf sind und es ihn (fast) nichts gekostet hat – ausser ein paar Nerven beim Serveradministrieren.
    Vercue verrichtet weiterhin seinen Dienst im Hintergrund und informiert uns Entwickler darüber, dass ein anderer mal wieder was neuen commited hat. Sehr nützlich!
  • Git und Stash
    Leider kamen wir aus Zeitgründen noch nicht dazu, git mehr Aufmerksamkeit wie das reine “teste mal an” zu geben, aber wir sind zuversichtlich, bald die ersten Projekte mit dem Verteilten Versionssystem zu beginnen. Auf Serverseite hilft uns dabei bestimmt Stash, welches ich persönlich mit meinen Privatprojekten als Bitbucket kenne und schätze.
  • FileZilla
    Ohne Worte, oder? Ein FTP-Tool hat jeder, FileZilla ist meins.
  • Outlook, MS Office
    Jajajajaja, ruhe im Saal Zwinkerndes Smiley Im Business kommst du ohne Office-Packet nicht weit und für mich als Windows-ianer ist Outlook einfach das beste Mailprogramm, wenn man damit auch etwas mehr wie “nur” E-Mail machen möchte.
  • Zend Toolbar
    Essentiell zum debuggen, single-click-install beim ZendServer, einfacher geht’s nicht mit der Zend Toolbar. Für den Chrome könnte Zend wirklich auch mal eine Toolbar mitliefern. Die ist nämlich nicht dabei, die muss man sich aus dem Forum downloaden. Geht aber problemlos und kostet höchstens 5 Minuten.
  • Chrome, IE, Firefox, rest
    Hier die erste gravierende Änderung zu 2011: Firefox ist nicht mehr der Primärbrowser. Zu lahm, zu schwer, zu … neee-lass-mal … Beruflich wie privat ist der Primäre Browser nun Chrome geworden, schnell, schmal, und alles sieht genauso aus wie im Fox. Ist ja schließlich 2013, da sollte das auch so sein, die Browserkriege sind beendet. BEENDET! Platz 2 ist der IE, Firefox ist noch da, aber nur zum Testen, Opera ist verschwunden, weil nicht gebraucht … gibt’s noch irgendwelche nennenswerten Browser? (Ich setz Safari mit Chrome gleich, weil fast gleiche Engine).
  • Web Developer Tools
    Ja, wichtig. Mal eben die Parameter einer Form ansehen? *Klick* Da sind Sie. Top Addon, auch für Chrome, leider nicht für IE, aber was ist nicht ist …
  • MySQL Studio
    Das MySQL Studio wird mir immer wichtiger. Nicht nur zur Analyse und Debuggen von komplexen Querys hervorragend geeignet, sondern auch, um zwei mysql-dump (jeweils knappe 300MB) miteinander zu vergleichen und die Frage zu beantworten: Hat sich was an der Tabellenstruktur getan? Wenn ja, was? Und das ganze bitte Grafisch! Und anschließend bitte eine “Alter”-SQL File exportieren. Genial!
  • Notepad2, Notepadd++
    Einen davon solltest du auch auf dem System haben, es lohnt sich Zwinkerndes Smiley “Mal eben” was kleines, oder “mal eben” ein .sql durchsuchen, dabei aber Syntax-Highlighing und Code-Folding haben wollen? Kein Problem, downloaden, installieren, Arbeitszeit sparen!
  • RegEx Editor
    Ein selten geniales und simples Tool, mit dem ich problemlos auch die komplexesten Regulären Ausrücke testen und optimieren kann. Hat mir schon so manche schlaflose Nacht erspart. Grade, wenn man sich manchmal nicht mehr ganz so sicher ist, ob der neue RegEx auch diesen und jenen Fall “covert” kann man es mit diesem Tool sehr schnell prüfen. Top und kostenlos!
  • Sysinternals und WSCC
    Keine Geheimnisse mehr in Windows. Profi-Tools für Profi-Fragen und mit dem WSCC sogar ein GUI-Updater.
  • KeePass
    Mein unersetzlicher Begleiter mit allen meinen Passwörtern. Wie sonst könnte ich mir alle Kundenpasswörter auf allen Seiten merken, ohne die Sicherheit zu gefährden? Ich brauche nur noch das (elend lange) Passwort für KeePass und gut ist. Ein STRG+ALT+A und ich bin im System des Kunden. Perfekt!
  • Screenpresso
    Hab noch nichts besseres gefunden und ich suche wirklich immer nach guten Tools. Auch das Sniping-Tool von Win7 kann leider nicht alles, was mit Screenpresso problemlos geht.
  • Launchy ist weg
    Yep, Launchy ist weg, ich mach nun alles via Taskbar oder der Suche von Win7.
  • Spotify
    iTunes ist weg, Spotify ist da. iTunes war so “nett”, mir alle meine Songs neu zu “taggen”, was zu einem heillosen Chaos führte. Bei Spotify habe ich das Problem nicht und zusätzlich kann ich in neue Alben länger reinhören wie z.B. bei Amazon und mir ein Bild davon machen, ob ich es kaufe oder nicht. So manchen Album wäre nicht in meiner Sammlung ohne diese Funkttion. Leider bin ich nur “free” Member und muss Werbung ertragen, aber solange kein Justin Bieber dudelt ist alles in Ordnung Zwinkerndes Smiley
  • Social Networks
    Ja, die Produktivitätskiller schlechthin, die bösen, bösen Social-Netwörks wie Twitter, Google+, Facebook oder wie-auch-immer. Letztes mal hatte ich dafür TweetDeck, dieses mal hatte ich schlicht keine Lust. Keine Lust, jede Stunde Twitter zu checken, keinen Bock, Stundenlang auf G+ rumzuklicken, Facebook auch nur zwei Minuten daddeln und wieder weg. Ich brauche das nicht, und daher brauche ich kein Tool mehr dafür.
    Nicht falsch verstehen, ich mache immer noch mit, aber mehr passiv, ich lese mit, kommentiere kaum, schreibe so gut wie nichts (außer neue Blog Posts natürlich) und Twitter prüfe ich zweimal am Tag per Windows Phone – da fällt mir ein, ein Tool kommt in die Werkzeugkiste: Peregrine, so heißt der Twitter-Client auf meinem WP7. Das war’s schon von wegen Social … kleiner Nachtrag: Die Newsfindung erledige ich hauptsächlich per Twitter, direkt dahinter kommen die klassischen RSS-Feeds einiger Newsseiten, die ich direkt in Outlook lese, also auch hier kein Tool für RSS.
  • Windows7
    Bin immer noch Gehirngewaschen, bin immer noch bei den Proprietären Abzockern aus Redmond, immer noch beim “Klicki-Bunti” Fenster, immer noch bei der Virenschleuder, bei der Malware-Verbreitungsplattform, immer noch beim bösen, bösen Windows, bei dem wir alle nicht mehr sein wollen und auch nicht sein dürfen.
    Weißt du was: Bin ich doch!
    Und ich bin zufrieden!
    Weil alles geht, so wie es soll!
    Ja, ich kenne Linux, hab LinuxMint14 installiert und obwohl diese Distri wirklich toll aussieht und sich selbst für mich gut “anfühlt” … es bleibt leider dabei, dass ein falscher “apt-get” mal wieder meine ganze X-Oberfläche zerstört hat und ich – als Pinguin-Laie – das nicht mehr hinbekomme. Ich hätte echt Angst, wenn das mein Produktivsystem wäre.
  • PHPUnit, Selenium, LiveTest, …
    Qualitätssicherungstools stehen bei mir dieses Jahr ganz weit oben in der Gunst. Bei neuen Projekten versuche ich mich an Test-Driven-Development, was zeitlich bedingt nicht immer funktioniert. Aber der Sinn und Zweck ist verstanden und Workarounds für ein schnelles bereitstellen in den Projekten sind ebenfalls erarbeitet und funktionieren gut.
  • Codesniffer, Messdetector, …
    Und auch diese Tools dürfen nicht fehlen. Ein großer kritischer Systemausfall beginnt mit kleinen Schludereien auf Code-Ebene. Diese kleinen Helfer erinnern mich daran, wo ich zu schnell arbeite und besser auf die Bremse drücken sollte.
  • Jenkins, Continous-Development
    Und da ich – wie alle Entwickler – ja zur Gattung der Faultiere gehöre, was sich wiederholende Arbeiten gehört, macht mein persönlicher Jenkins alle QA-Sachen für mich automatisiert … nun ja, zumindest für die ganz neuen Projekte, die alten Legacy-Projekte dafür in Angriff zu nehmen ist … schwierig. Weniger vom fachlichen Standpunkt aus, mehr vom Zeitlichen Standpunkt. Aber wir arbeiten dran Zwinkerndes Smiley.
    Sehr cool ist auch, dass sich Jenkins ins Zend Studio integriert und mich die Fehlermeldungen dort per Klick direkt an die entsprechende Codestelle führen. Perfekt!
  • Zend Framework, Backend-Framework
    Mein persönliches Framework für PHP. Ich habe Symfony ausprobiert, ich arbeite bei manch Kundenprojekt mit CodeIgniter, ich habe PIMF ausprobiert, sogar FLOW habe ich mir angesehen. Steckengeblieben bin ich beim Zend Framework. Klar, Zend Studio, Zend Server, da liegt das nahe, aber die ganze Art und Weise des MVC liegt mir und ich komme intuitiv zurecht. Für mich heißt das, Zend Framework und ich liegen auf einer Wellenlänge und das heißt, dass ich damit Spaß habe und Produktiv arbeiten kann … und darauf kommt es doch an.
    ZF setze ich bei neuen Sachen wenn es geht als „Full-Stack” ein, bei einigen Legacy-Projekten läuft es als Library für ein paar Aufgaben und wird per Autoloader eingebunden. Praktisch, wenn ein Framework beides kann.
    Derzeit bin ich noch in Version 1 unterwegs, der Lernweg zur Version 2 ist schon geplant, auch vor Ralf’s Buch Zwinkerndes Smiley
  • Bootstrap, Frontend-Framework
    Wenn das Zend Framework mein Backend-Framework der Wahl ist, dann wurde Twitter Bootstrap mein Frontend-Framework, mit dem ich bestens zurecht komme. Habe mir auch HTML5Boilerplate angesehen und 960 Grid System, auch hierbei kann ich aber nur eines nehmen, am besten komme ich mit Twitters Gedanken klar.
  • Zend Certified Engineer (ZCE) PHP
    Ne, ich bin’s noch nicht, aber der Voucher liegt bereit und ich lerne fleißig. Dabei bleiben leider manche anderen Sachen liegen und ich experimentiere nicht so viel mit neuen Frameworks rum. Bald…

Und da gibt es nun auch noch den Privaten Schwerpunkt, der liegt neben PHP und allen oben genannten Sachen derzeit bei C#.

  • VisualStudio (Express)
    Klar, wer C# macht, der sollte auch Microsofts IDE benutzen. Wer schon mal C++ programmiert hat (so wie ich einst), der weiß einfach, dass VS die beste IDE der Welt ist, wenn man zu den “echten” Programmiersprachen kommt. Das Microsoft die IDE in einer benutzbaren Version kostenlos hergibt ist umso erfreulicher.
    Schade, das Microsoft (noch) kein VisualStudio für PHP geplant hat … aber die Hoffnung stirbt zuletzt Zwinkerndes Smiley

Ich denke, das waren die wichtigsten Sachen, die kleineren Tools und Helfer erwähne ich nicht, das würde zu groß werden. Trotzdem wurde die Liste ja schon recht lang.

Wie sieht deine Liste aus?

Unit Testing in C# mit Visual Studio 2010 Express und NUnit

Privat erstelle ich meine Projekte seit neuestem mit C#. Da ich ein Windows Phone mein eigen nenne und da irgendwann auch mal gern eine App für schreiben möchte, dachte ich, es wäre ganz gut, sich da mal wieder auf den neuesten Stand zu bringen und wieder aktiv in dieser Sprache zu programmieren. Denn nur, wenn du C# codest, lernst du C#. Gut und schön und mein aktives Projekt komplett neu in C# geschrieben. Es ist zwar noch nicht fertig, aber schon überkommt mich ein beklemmendes Gefühl. Es fehlt was. Nur was?

Nach kurzem Nachdenken wird mir klar: Ein neues PHP-Projekt würde ich ganz anders starten. Ich würde Tests schreiben. Na klar, meinem C#-Projekt fehlt das Unit Testing.

Nach kurzer Suche wird mir ganz anders: C# zu unit-testen geht zwar, aber nicht mit Visual C# Express 2010 … aber genau diese kostenlose IDE setze ich doch ein! Aber wie ich immer so schön zu sagen pflege: Geht nicht, gibt’s nicht (kost‘ nur mehr #hehe).

Nach ein paar Stunden rumfummeln und vielen anderen Einträgen folgt hier meine Schritt-für-Schritt anleitung zum Unit Testen mit C# mit Visual C# Express 2010 mit Mausklick (aber ohne Sahne 😉 ):

  1. Visual C# Express 2010 muss installiert sein, idealerweise hast du auch schon ein Projekt.
  2. Du lädst dir eine aktuelle Version von NUnit von der NUnit Homepage www.nunit.org runter.
  3. In deiner Projektmappe legst du nun ein neues leeres C# Projekt an (ProjektnameTest zum Beispiel)
  4. Nun im Menü unter „Extras“ -> „Einstellungen“ die Option „Experteneinstellungen“ wählen
  5. Damit wird dann der Menüeintrag „Externe Tools“ (unter „Extras“) überhaupt sichtbar.
  6. Dort dann NUnit wie folgt eintragen:
    NUnit als externes Tool in Visual C#
    Schlecht sichtbar, aber ich verlinke auf nunit-x86.exe, sonst funktioniert das bei mir nicht, da ich ein 64-Bit System habe.

So, euer System ist bereit, unter „Extras“ habt ihr nun einen neuen Menüpunkt „NUnit“, der euch das aktuelle Projekt testet, also euer Testprojekt. Achte darauf, dass du vorher auch immer das Testprojekt neu erstellen läßt, da NUnit immer die Assembly und die exe zu rate zieht und wenn die nicht auf dem aktuellem Stand ist kommen verfälschte Ergebnisse heraus.

Bei den Tests ist es wichtig, die aus PHP bekannten „Testsuiten“ mit dem Attribut [TestFixure] im (Test-)Code zu kennzeichnen, die Tests selbst als [Test], sonst funktioniert das Ganze nicht und NUnit meldet, es gäbe keine Tests zum Ausführen!

Für den Start hier mal ein kleines Beispiel für dich. Sicherlich stimmen noch nicht alle Namen und Bezeichner und die Test machen auch noch nicht viel Sinn, aber es soll ja mehr als eine Art „Quickstart“ gemeint sein, ein Grundgerüst zum Verständnis:

namespace apps.presnac
{
  using NUnit.Framework;

  [TestFixture]
  public class KeysTest
  {
    [Test]
    public void testingFileDefs()
    {
      FileDefinitions clsFiledefs = new FileDefinitions();
      FileDefinition[] filedefs = clsFiledefs.getFileDefinitions();

      Assert.AreEqual(filedefs.Length, 57);
    }

    [Test]
    public void testWillFail()
    {
      Assert.AreEqual(1, 2);
    }
  }
}

namespace UnitTesting
{
  public class deCHKTesting
  {
    public static void Main()
    {
      apps.presnac.KeysTest testingKeys = new apps.presnac.KeysTest();
      testingKeys.testingFileDefs();
      testingKeys.testWillFail();
    }
  }
}

Ja, in diesem Beispiel geht es um mein Grundgerüst zu meinem Projekt deCHK, was bald als neue Version komplett neu in C# geschrieben erscheinen wird.

Den unteren Block, die Klasse deCHKTesting mit der main()-Methode brauchst du, damit dein Projekt überhaupt eine ausführbare Datei erstellen kann, die dann von NUnit analysiert und zum testen herangezogen werden kann.

Und anschließend ein Blick auf die Testergebnisse:

nunit-testergebnisse

Also, Unit-testing in C# mit Visual Studio Express ist möglich, man muss nur 2 kleine Kniffe kennen (wie komme ich ans Tools Menü und die beiden Attribute im Code, um Tests zu markieren) und schon steht den kontrollierten Funktionssicherheitsnachweisen nichts mehr im Wege 😉 .

Was ich sehr unschön finde ist die Tatsache, dass es in Visual Studio nicht möglich ist, eine Standardvorgehensweise wie Unit Tests direkt in IDE zu integrieren. Vor allem da NUnit hier der Marktführer für .Net ist fällt es mir schwer, meine Tests nicht direkt in meiner IDE zu sehen und per Doppelklick auf einen aufgetretenen Fehler direkt zum zuständigen Code zu gelangen. Hier sollte Microsoft nachbessern, damit künftige C#-Entwickler auch in den Genuß von „Test-Driven-Development“ direkt in der VS-IDE kommen.

Ansonsten wünsche ich dir noch viel Erfolg beim Unit-Testen deines C#-Codes.