Good To Know #2

A successful Git branching model
Darstellung eines möglichen Workflows im Bezug auf das Branching mit Git.

NOSQL Patterns
Ein teilweise sehr technischer aber jedoch interessanter Blog Post über die Details von NoSQL Datenbanken.

Developing scalable PHP applications using MongoDB
Hier wird der Einsatz von MongoDB unter PHP mit Hilfe des entsprechenden PECL-Packages beschrieben.

PHP Continuous Integration with Atlassian Bamboo
Eine Anleitung wie man diverse PHP QA Tools in das CI-System Bamboo von Atlassian einbindet.

Responding to Different Content Types in RESTful ZF Apps
Für alle REST-Nerds mit Interesse am Zend Framework ein Leckerbissen. Es wird beschrieben, wie man elegant mit verschiedenen Datenformaten in einer RESTful Applikation umgehen kann.

Integrating Symfony Dependency Injection Service Container with Zend Framework
Wer eine Antwort auf die Frage “Symfony DI + Zend Framework” sucht, der wird hier fündig.


Java User Group Hamburg – Clean Code Development

Am 17. März findet, von der Java User Group Hamburg organisiert, ein Vortrag zum Thema Clean Code Development statt. Hier wird André Fleischer (Software-Architekt bei der Otto Group in Hamburg) das Clean Code Developer Wertesystem vorstellen und anhand der vorhandenen Stufen und Bausteine erklären, wie sich diese auf die Softwareentwicklung auswirken.

Topics

  • Probleme der Softwareentwicklung
  • Lösungsansätze
  • Die Grundwerte
  • Prinzipien und Praktiken
  • Werkzeuge
  • Quellcodes

Agenda

  • 19:00 Uhr : Vortrag : Clean Code Development von André Fleischer

Wir treffen uns bei Otto in der Wandsbeker Straße 3-7, Haupteingang, Gebäude 1 im Forum.

Ich bin dabei!


PHP 5.3.2 veröffentlicht

Lang ist es her, dass ich was geschrieben habe! Daher fange ich erstmal wieder klein an und zwar mit dem heutigem Release Announcement der PHP 5.3.2 Version, welches ein Maintenance Release darstellt.

Security Enhancements and Fixes in PHP 5.3.2:

  • Improved LCG entropy. (Rasmus, Samy Kamkar)
  • Fixed safe_mode validation inside tempnam() when the directory path does not end with a /). (Martin Jansen)
  • Fixed a possible open_basedir/safe_mode bypass in the session extension identified by Grzegorz Stachowiak. (Ilia)

Key Bug Fixes in PHP 5.3.2 include:

  • Added support for SHA-256 and SHA-512 to php’s crypt.
  • Added protection for $_SESSION from interrupt corruption and improved “session.save_path” check.
  • Fixed bug #51059 (crypt crashes when invalid salt are given).
  • Fixed bug #50940 Custom content-length set incorrectly in Apache sapis.
  • Fixed bug #50847 (strip_tags() removes all tags greater then 1023 bytes long).
  • Fixed bug #50723 (Bug in garbage collector causes crash).
  • Fixed bug #50661 (DOMDocument::loadXML does not allow UTF-16).
  • Fixed bug #50632 (filter_input() does not return default value if the variable does not exist).
  • Fixed bug #50540 (Crash while running ldap_next_reference test cases).
  • Fixed bug #49851 (http wrapper breaks on 1024 char long headers).
  • Over 60 other bug fixes.

Für weitere Details, sei an dieser Stelle das ChangeLog empfohlen.

Der PHP 5.2.x Release-Zweig wurde ebenfalls vor einigen Tagen auf den neuesten Stand gebracht.


ObjektForum Nord: Testgetriebene Entwicklung

Am 09. Februar findet das ObjektForum Nord zum Thema Testgetriebene Entwicklung in Hamburg statt. Im Namen von des Unternehmens it-agile, wie auch der Vortragenden Johannes Link und Bernd Schiffer, wird man an diesem Tag folgendes Rahmenprogramm erleben dürfen:

Testgetriebene Entwicklung (TDD) verspricht weniger Fehler, bessere Wartbarkeit und eleganteres Design von Software. Und es bietet eine gute Ergänzung zu agilen Managementmethoden wie Scrum.

Beim kommenden ObjektForum Nord stellen wir testgetriebene Entwicklung in zwei Veranstaltungen vor.

16:30 – 18:30: TDD hands-on
[...]

Vortragende: Johannes Link und Bernd Schiffer
Vortragsart: Hands-on Live-Pairprogramming und Frage-und-Antwort-Runde
Zielpublikum:
Programmierer, Architekten, Technische Projektmanager

Ab 19:00: Vortrag zu Testgetriebener Entwicklung
[...]

Vortragende: Johannes Link und Bernd Schiffer
Vortragsart:
Vortrag inkl. Fragen und Antworten, dazwischen kleine Live-TDD-Demonstration
Zielpublikum: Projektmanager, Entscheider (keine technischen Kenntnisse nötig)

Weitere Informationen und die kostenlose Anmeldung findet man hier.

An dieser Stelle noch ein Dank an Marko Schulz.

Wie cool: Für TDD im Kino www.it-agile.de/kino verschickt meine Firma Einladungen mit echten Kinoeintrittskarten http://twitpic.com/yij4k


Good To Know #1

Practical Php Patterns: Abstract Factory
Giorgio Sironi leitet seine neue Artikelserie “Practical PHP Patterns” ein. Gegenstand des aktuellen Blog Posts ist das Abstract Factory Pattern.

Growing Object-Oriented Software, Guided by Tests
Miško Hevery mit einer kleinen Rezension zum Buch Growing Object-Oriented Software, Guided by Tests (Beck Signature), welches als nächstes auf meiner Einkaufsliste steht.

Zend Framework data models
Ein gute Einleitung von Michelangelo van Dam zum Thema Models innerhalb des Zend Frameworks (Table Data Gateway, Data Mapper, Relationships).

Ajax-Applikationen mit dem Zend Framework
Ein Beitrag zur Implementierung von Ajax-Applikationen mit dem Zend Framework und einer kleinen Einleitung zum Thema HTTP Header/Status-Codes von Jan Sorgalla.

Registry Design Pattern – useful or harmful?
Ein bisschen Global State Bashing mit einem Touch Dependency Injection von Frank Kleine.

Class posing and overloading the “new” operator
Johannes Schlüter stellt eine PHP Extension zum Überladen des “new”-Operators vor, welche in Zusammenarbeit mit Sebastian Bergmann entstand.

Unix manual pages for PHP functions
Ein kleiner Segen für alle PHP Entwickler, die Vim benutzen. Dank gebührt Hannes Magnusson für den Tipp!

NoSql Databases – Part 1 – Landscape
Umfangreich aber lesenswert! Vineet Gupta zum Thema NoSQL.

Immutable DateTime Objects
Falls jemand ein Immutable DateTime Object benötigt, der sollte sich die Implementierung von Benjamin Eberlei anschauen. Zusätzlich gibt es eine kleine DateFactory mit dem Ansatz schon erstellte DateTime Instanzen wiederverwenden zu können.


Git Git Git!

Mit der Zeit macht sich Git im Bereich des Source Control Managements ja immer beliebter, was ich jedoch zu Beginn noch nicht ganz nachvollziehen konnte.

Nachdem ich mich in das Thema der verteilten Versionsverwaltungssysteme etwas eingelesen habe, bin ich beim Durchforsten einiger Blogs, noch auf der gitcasts.com Website von Scott Chacon gelandet.

Dort findet sich ein Eintrag mit dem Titel “RailsConf Git Talk“, und ich muss ehrlich gestehen, als ich diesen Screencast sah, gab es viele “AHA!-Momente”. Wer also mehr über Git erfahren möchte, sollte gitcasts.com im Auge behalten.

Des Weiteren zu empfehlen:


Dependency Injection Frameworks für PHP

Vor einigen Wochen habe ich schon über Google Guice berichtet. Mit diesem Blog Post möchte ich jedoch allen Interessierten einen kleinen Überblick über die vorhandenen Dependency Injection Frameworks für PHP geben.

Stubbles

Das Stubbles Framework bietet einen IoC Container an, welcher sich stark an das vorher genannte Google Guice Framework anlehnt. Es sind unter anderem Features wie Bindings, Annotations und Scopes vorhanden.

Beispiel:

<?php
class BMW implements Car {
    protected $driver;
    protected $engine;
    protected $tire;
 
   /**
    * @Inject
    */
    public function __construct(Engine $engine, Tire $tire) {
        $this->engine = $engine;
        $this->tire = $tire;
    }
 
    public function setDriver(Person $driver) {
        $this->driver = $driver;
    }
 
    public function moveForward($miles) {
        $this->driver->sayHello();
        $this->engine->start();
        $this->tire->rotate();
    }
}
?>
<?php
// make sure, the IoC functionality is loaded
stubClassLoader::load('net::stubbles::ioc::stubBinder');
 
$binder = new stubBinder();
$binder->bind('Car')->to('BMW');
$binder->bind('Tire')->to('Goodyear');
$binder->bind('Person')->to('Schst');
$binder->bind('Engine')->to('TwoLitresEngine');
?>
<?php
$injector = $binder->getInjector();
$car = $injector->getInstance('Car');
var_dump($car);
?>
 
object(BMW)#33 (3) {
  ["driver:protected"]=>
  NULL
  ["engine:protected"]=>
  object(TwoLitresEngine)#37 (0) {
  }
  ["tire:protected"]=>
  object(Goodyear)#40 (0) {
  }
}

Yadif – Yet Another Dependency Injection Framework

Yadif, entstanden durch Thomas McKelvey und im weiteren Verlauf durch Benjamin Eberlei geforked, wählt einen deklarativen Ansatz der Konfiguration und verzichtet z.B. auf den Einsatz von Annotations. Zusätzlich gibt es Module und einen Builder um mittels Fluent-API die Komponenten zu konfigurieren.

Beispiel:

class Foo
{
    public function __construct($arg1, $arg2) { }
 
    public function setA($arg1) { }
 
    public function setB($arg2, $arg3) { }
}
$config = array(
    'Foo' => array(
        'class' => 'Foo',
        'arguments' => array('ConstructorArg1', 'ConstructorArg2'),
        'methods' => array(
            array(
                'method' => 'setA',
                'arguments' => array('Inject1'),
            ),
            array(
                'method' => 'setB',
                'arguments' => array('Inject2', 'Inject3'),
            ),
        ),
        'scope' => 'singleton',
    ),
    'ConstructorArg1' => array('class' => 'ConstructorArg1'),
    'ConstructorArg2' => array('class' => 'ConstructorArg2'),
    'Inject1'         => array('class' => 'Inject1'),
    'Inject2'         => array('class' => 'Inject2'),
    'Inject3'         => array('class' => 'Inject3'),
);
$yadif = new Yadif_Container($config);
$foo   = $yadif->getComponent("Foo");

Symfony Dependency Injection

Als Teil der Symfony Components ist der Symfony Service Container entstanden.
Die Konfiguration der Komponenten lässt sich direkt mittels PHP, jedoch aber auch mit Hilfe von XML und YAML realisieren.

Beispiel:

require_once '/PATH/TO/sfServiceContainerAutoloader.php';
sfServiceContainerAutoloader::register();
 
$sc = new sfServiceContainerBuilder();
 
$sc->
    register('mail.transport', 'Zend_Mail_Transport_Smtp')->
    addArgument('smtp.gmail.com')->
    addArgument(array(
        'auth'     => 'login',
        'username' => '%mailer.username%',
        'password' => '%mailer.password%',
        'ssl'      => 'ssl',
        'port'     => 465,
    ))->
    setShared(false);
 
$sc->
    register('mailer', '%mailer.class%')->
    addMethodCall('setDefaultTransport', array(new sfServiceReference('mail.transport')));
 
$sc->addParameters(array(
    'mailer.username' => 'foo',
    'mailer.password' => 'bar',
    'mailer.class'    => 'Zend_Mail',
));
 
$mailer = $sc->mailer;

Durch Dumper-Klassen kann man seine vorhandene Konfiguration im PHP-Quellcode direkt als YAML Datei abspeichern und entsprechend ersetzen.

require_once '/PATH/TO/sfYaml.php';
 
$dumper = new sfServiceContainerDumperYaml($sc);
 
file_put_contents('/somewhere/container.yml', $dumper->dump());
parameters:
  mailer.username: foo
  mailer.password: bar
  mailer.class:    Zend_Mail
 
services:
  mail.transport:
    class:     Zend_Mail_Transport_Smtp
    arguments: [smtp.gmail.com, { auth: login, username: %mailer.username%, password: %mailer.password%, ssl: ssl, port: 465 }]
    shared:    false
  mailer:
    class: %mailer.class%
    calls:
      - [setDefaultTransport, [@mail.transport]]

Des Weiteren seien noch folgende Implementierungen genannt.


Sonar unterstützt PHP

Vor dem Jahreswechsel erreichte folgender Tweet von Gabriele Santini (@b1acksun) die PHP Community.

#sonar for #php is coming… please tell me what you think of it: http://bit.ly/4uCFu0 #phpqa

Wer Sonar noch nicht kennt, dem sei gesagt, dass dies eine Open Source Plattform zur Qualitätssicherung von Quellcode ist. Umso erfreulicher ist es, dass auch bald die Analyse von PHP Quellcode mittels Sonar möglich sein wird. Im entsprechenden Blog Post von Gabriele Santini kann man anhand vieler Screenshots den Stand der Dinge begutachten.

It’s no secret that we at SQLI want to give the PHP world an Open Source full-featured continuous integration system.

As an essential step to this in the short term,  we are working on enabling the Sonar QA reporting system for PHP projects.

Sonar Dashboard


PDF in Textdatei konvertieren

Aktuell implementiere ich auf Basis des Zend Frameworks eine kleine Applikation, die aus meinen vorhanden PDF-Dateien eine durchsuchbaren Index erstellen soll. Für den Suchindex wird Zend_Search_Lucene verwendet, welches eine Portierung des Apache Lucene Projekts darstellt.

Soweit mir bekannt, gibt es keine konkrete Schnittstelle für das Handling von PDF-Dateien mittels Zend_Search_Lucene. Zusätzlich habe ich nach einigen Erweiterungen bzw. Klassen Ausschau gehalten, jedoch fand ich nichts was in meinen Augen einer sauberen und komfortablen Lösung entsprach.

Dies führte dazu, dass ich mich entschied, den Umweg über Textdateien zu gehen. Mein aktueller Lösungsansatz verwendet das Command-Line Tool pdftotext, welches sich z.B. im Ubuntu-Package xpdf-utils befindet.

apt-get install xpdf-utils

Nach der Installation kann man auch schon sofort mit der Konvertierung der PDF-Dateien beginnen. Der folgende Befehl, erstellt eine Textdatei mit dem Namen MyDocument.txt.

pdftotext MyDocument.pdf

Soll die konvertierte Textdatei einen anderen Namen tragen, so kann man diesen auch explizit angeben.

pdftotext MyDocument.pdf foobar.txt

Der Wikipedia-Eintrag zu pdftotext, enthält gleich die passende Schleife für ein Batchscript.

for f in *.pdf
do
  pdftotext "$f"
done

Bücher zum Thema Softwareentwicklung

Als Softwareentwickler sollte man seinen Horizont möglichst kontinuierlich erweitern, denn wie heißt es doch so schön . . . “Wissen ist Macht!”. Heutzutage ist es keine Seltenheit, wenn man auf Projekte stößt, welche eher einen hetrogenen Software-Stack darstellen.

Um an dieser Stelle ein wenig gesundes Halbwissen aufweisen zu können, empfehlen sich viele Möglichkeiten der Informationsgewinnung. Vieles spielt sich natürlich mittlerweile in Blogs oder Portalen ab, was auch eine sehr feine Sache ist.

Des Weiteren ist die Teilnahme an regionalen User Groups beim Wissensaustausch sehr behilflich. Eine zusätzliche und einfache Möglichkeit ist es z.B. sich mit weiteren Programmiersprachen zu beschäftigen, um auch neue oder andere Programmierparadigmen kennen zu lernen. Man will es vielleicht nicht glauben, aber es dreht sich nicht immer alles um die Programmiersprache XYZ.

Mir persönlich haben einige sehr tolle Bücher von Martin Fowler, Kent Beck oder auch z.B. Eric Evans, die Welt der Softwareentwicklung noch viel schmackhafter gemacht. Letzten Endes beschreiben all diese Publikationen auf ihre Art und Weise, wie man qualitative Software schreibt.

Aus diesem Grund habe ich mir gedacht, dass ich eine kleine Sammlung meiner bevorzugten Bücher zusammenstelle und diese auf der Seite veröffentliche. Mit ein bißchen Glück findet sich für den einen oder anderen Leser noch ein unbekannter Titel.

In diesem Sinne, viel Spaß beim Lesen!