Monatsarchive: September 2013

PHP: Dokumentation mit dem phpDocumentor (phpdoc)

Ja, die liebe Dokumentation. Als Entwickler ist es doch irgendwie das letzte was man machen möchte und was sicherlich am wenigsten Spaß bringt. Umso besser, wenn man sich etwas Arbeit abnehmen lassen kann.

Installation / Konfiguration

Ich arbeite aktuell mit MAMP unter Mac OS X Mountain Lion 10.8.5 und mit php 5.4.4 – hier habe ich mir auch schon PEAR konfiguriert und kann so ganz einfach die Erweiterung nachinstallieren – wie das geht habe ich mal in diesem Artikel angerissen:

In meinem Fall wurde Version 2.0.1 installiert. So sollte die Ausgabe in etwa aussehen:

Weiterhin ist es sinnvoll GraphViz direkt mit zu installieren. Mit diesem Library ist es phpDoc möglich, grafische Abhängigkeiten und Hierarchien zwischen den Klassen darzustellen. Bitte beachtet, dass ihr dazu brew installieren müsst (was ich aber generell immer empfehlen kann).

Falls die Installation nicht durchgeführt wird, bekommt man am Ende der phpDoc-Generierung die folgende Meldung:

[Zend\Stdlib\Exception\ExtensionNotLoadedException] Unable to find the dot command of the GraphViz package. Is GraphViz correctly installed and present in your path?

Damit ich diese Version von überall aufrufen kann, lege ich einen Link im bin-Verzeichnis ab:

Nutzung

Nun können wir die neu installierte Erweiterung auch schon ausprobieren. Dazu einfach in ein (relativ gut) dokumentiertes Projekt wechseln und folgenden Befehl ausführen:

Nun wird alles in dem aktuellen Verzeichnis dokumentiert und nach docs gespeichert. Die Ausgabe zeigt außerdem sehr schön auf, welche Attribute, Methoden oder Klassen noch nicht dokumentiert sind.

Natürlich möchte man nicht immer alle Konfigurationsparameter per Hand vornehmen. In diesem Fall empfiehlt es sich, eine phpdoc.xml in das Projekt zu legen. Was hier genau konfiguriert werden kann, lässt sich hier nachlesen. Ein Template für die Konfiguration findet man hier:

Fazit

Zum Abschluss bleibt zu sagen: Tolle Lösung um sehr einfache Dokumentationen zu erstellen. Wenn man sich daran gewöhnt hat, denkt man schon beim Programmieren daran die entsprechenden Kommentare an die Klassen, Methoden und Attribute zu schreiben. So zieht sich die Dokumentation über die komplette Projektlänge und schlägt nicht erst am Ende auf.

Weiterhin gefällt es mir sehr gut, dass phpDoc auf Bootstrap setzt (wenn auch noch nicht auf Version 3).

Leider sind die Klassennamen von Magento teilweise sehr lang und machen das Layout der Dokumentation etwas kaputt. Dafür gibt es aber sicher per Konfiguration noch eine Lösung.

Mac OS X: AirPlay-Lautsprecher nicht anwählbar

Seit Mountain Lion (OS X 10.8) ist es ebenfalls möglich nur den Sound von einem Mac an ein AirPlay fähiges Gerät zu senden. Leider kommt es bei mir immer wieder vor, dass ich die Geräte nicht wählen kann. Sie tauchen zwar auf, aber sobald eines der Geräte auswähle, springt die Auswahl direkt wieder auf die lokale Ausgabe zurück.

Da ein Neustart des Rechners das Problem löst, muss es auch einen einfacheren Weg geben. Hier die Lösung:

Abhilfe schafft ein Neustart des coreaudio-Prozesses. Diesen kann man mit folgendem Kommando im Terminal einfach abschießen (Passworteingabe erforderlich):

Danach sind die Geräte direkt wieder problemlos wählbar.

Alternative (etwas kürzer):

AirPlay Devices

PHP: Fotos sinnig ausrichten und in Reihen einsortieren

In meinem kleinen Portfolio für Fotografie habe ich in letzter Zeit öfter das Problem gehabt, dass die Fotos schwer anzuordnen waren. So kam es, dass ein Querformat Bild kommt und direkt danach ein Hochformat etc. Also musste eine Lösung her, bei die Fotos den Platz optimal nutzen. Das heißt z.B. quer, quer, hoch, hoch, quer, hoch, hoch, quer, … Also immer so, dass die Hochformat-Fotos nebeneinander Platz finden.

Da ich sicherlich nicht der erste bin der auf das Problem gestoßen ist, möchte ich hier ein paar Sätze dazu schreiben wie man das Ganze lösen könnte. Ihr seid gerne dazu aufgerufen meinen Ansatz zu vervollständigen.

Die selbe Logik habe ich in einem anderen Fotoblog ebenfalls eingesetzt – da diese Lösung auf Bootstrap basiert und Bootstrap mittlerweile sehr verbreitet ist möchte ich genau dieses Beispiel nutzen damit es für euch auch leichter zu portieren ist.

Als erstes muss man alle Bilder laden und deren Seitenverhältnis ermitteln.

Das war ja noch wirklich einfach und das sollte man auch so hinbekommen – nur für die Vollständigkeit genannt. Im nächsten Schritt habe ich die Fotos nach Datum sortiert. Das geht ebenfalls ganz fix und ist natürlich optional:

Möchte man die Ausgabe auf ein paar wenige Fotos beschränken, hilf array_slice:

Jetzt kommt das eigentliche Herzstück der Sortierung. Erst der Code, dann eine kurze Erklärung dazu.

Wir gehen also über also Fotos und haben ein Array für die späteren Zeilen auf der Seite angelegt. Eine Zeile kann dabei beliebig viele Fotos enthalten. Für meinen Fall darf eine Zeile nur ein Querformat und zwei Hochformat-Fotos enthalten. Querformat-Fotos werden daher direkt in eine neue Zeile aufgenommen. Ist das Foto im Hochformat, wird es in eine temporäre Zeile gepackt. Hat diese Zeile zwei Einträge, wird sie angehängt und das temporäre Array geleert. Eigentlich sehr einfach gehalten. Der Trick ist am Ende nun einfach noch, dass eventuell noch ein Eintrag im temporären Array ist, den wir nicht vergessen dürfen. Das liegt daran, dass einfach nicht genug Hochformatfotos vorhanden waren.

Jetzt geht es an die Ausgabe. In diesem kurzen Beispiel nicht sonderlich sauber in ein Template gegossen – geht mehr um das grundlegende Verständnis:

Wir gehen also alle Zeilen durch die wir gesammelt haben und errechnen die Breite der Spalte. Hier ist das Grid-Layout von Bootstrap 3 sehr hilfreich, das wir einfach die Zahl 12 (welche für 100% Breite steht) durch die Anzahl der Fotos in der Spalte teilen können. Das letzte Foto orientiert sich noch am rechten Rand um eine schöne rechteckige Optik zu bekommen. Fertig.

In diesem Beispiel wird als Image-Source noch der Pfad auf dem Server – das muss natürlich angepasst werden.

Anfangs habe ich probiert die Logik in einer einzelnen Schleife abzubilden, aber das ist ja fast unmöglich und macht es extrem unübersichtlich. Der Code lässt sich auch super in eine Klasse kapseln und immer wieder verwenden. Das nehme ich mir auf jeden Fall noch vor.

Fragen?

Bilder fürs Web optimieren

Vor ein paar Tagen bekam ich von einem Kollegen den Tipp, dass man mit ein paar einfachen Klicks und einem Tool sehr viele Bilder fürs Web optimieren kann. Das Programm nennt sich ImageOptim und optimiert PNG-, JPEG- und GIF-Dateien.

Das geniale an dem Programm ist, dass man ganz einfach alle Bilddateien in das Programm ziehen kann und diese verlustfrei optimiert werden. Mehr muss man nicht tun. Wirklich simpel. Die Dateien werden nämlich einfach ersetzt und müssen nicht umständlich an eine neue Position kopiert werden.

Das ist gerade praktisch, wenn man mit git arbeitet. Dazu einfach das komplette Verzeichnis in das Programm droppen und dann ein paar Sekunden (oder Minuten) warten. Am ende ein commit und schon kann man auch jederzeit zurück auf die alten Files. Wirklich praktisch.

Änderungen machen sich besonders im Google PageSpeed bemerkbar.