<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Sebastian Bergmann - PHP</title>
    <link>http://sebastian-bergmann.de/</link>
    <description></description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.6 - http://www.s9y.org/</generator>
    
    

<item>
    <title>PHP Summit in London</title>
    <link>http://sebastian-bergmann.de/archives/921-PHP-Summit-in-London.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/921-PHP-Summit-in-London.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=921</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=921</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;a href=&quot;http://php-summit.co.uk/&quot;&gt;&lt;img src=&quot;http://it-republik.de/konferenzen/phpsummit2012uk/img/layout/teaser.jpg&quot; border=&quot;0&quot; width=&quot;500&quot; alt=&quot;PHP Summit&quot;/&gt;&lt;/a&gt;
&lt;p&gt;With all PHP topics, nothing counts more than their practical application. This is why &lt;a href=&quot;http://thephp.cc/&quot; title=&quot;thePHP.cc - The PHP Consulting Company&quot;&gt;thePHP.cc&lt;/a&gt; offers highly interactive and practical workshops. Based on their own specific needs and questions, the attendees decide on the topics that are covered. They experience the development of new code at first hand, following their own agendas rather than those of the three trainers.&lt;/p&gt;
&lt;p&gt;The first &lt;a href=&quot;http://php-summit.co.uk/&quot;&gt;PHP Summit with workshops presented in English will be in London in May&lt;/a&gt;. And these are the workshops:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;h4&gt;Update PHP: Leverage New Features and Technologies&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;PHP 5.3 and PHP 5.4 help developers in their daily routine with a plethora of relevant improvements. Get to know the innovative features of these new versions and learn how to apply them in practice. Discover the potential of emerging technologies such as memcached or ZeroMQ and learn how they can solve your problems.&lt;/p&gt;
&lt;h4&gt;Unclean PHP: Identify, Refactor, Avoid&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Sooner or later unclean code becomes a damn nuisance. And not only for the developer who has to maintain it. Changes and extensions make the code more and more uneconomic. Learn how to detect unclean code using static analysis and how to refactor it with testability and maintainability in mind. Learn how to avoid unclean code by applying the SOLID principles and writing sustainable code.&lt;/p&gt;
&lt;h4&gt;Best Practices: From the Real World for the Real World&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Of course you can reinvent the wheel every day. You just do not have the time to do so, plus it is no fun, and bugs can creep into the same places over and over again. Clever solutions exist for many bread-and-butter problems that only deviate slightly from already solved ones. This workshop shows the programming concepts to achieve this in a live coding session that is entirely driven by the audience&#039;s requests and invites to a discussion of tools and techniques.&lt;/p&gt;
&lt;h4&gt;Safely Prepared for Errors&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Programs and websites have errors. Always. They become apparent when users enter wrong, invalid, or unexpected input, when access to the database is suddenly not possible, or when the disk is full. Various approaches to safely handle these and other problems are presented and discussed in this workshop.  How to correctly use exceptions, why a custom error handler can be helpful, and what debugging has to do with security  these questions and more will be answered intuitively and vividly.&lt;/p&gt;
&lt;h4&gt;Object-Oriented Progamming (OOP) in PHP I: Fundamentals&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;This workshop answers the question what object-oriented programming is all about. It gives an introduction to OOP with PHP that goes beyond the known standard examples. In addition to presenting the fundamental principals of OOP it also highlights interesting features of the Standard PHP Library (SPL) and how they can be applied in practice. In addition to imparting factual knowledge the workshop presents a mindset that allows you to avoid overly complicated approaches.&lt;/p&gt;
&lt;h4&gt;Object-Oriented Progamming (OOP) in PHP II:  Advanced Topics&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;This workshop introduces attendees that are already familiar with the foundations of OOP to advanced topics such as Dependency Injection, abstract classes, and interfaces as well as best practices for successful object-oriented programming. A live coding session makes the presented techniques tangible. In addition to imparting factual knowledge the workshop shows that good solutions are simple solutions: simple objects are easier to reuse and test  and thus help to avoid mistakes.&lt;/p&gt;
&lt;h4&gt;Testing PHP Application: Fundamentals&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;This workshop imparts the fundamental information and skills for the writing of Unit Tests, Database Integration Tests, Edge-to-Edge Tests, and End-to-End Tests with PHPUnit. You will learn everything you need to know to write, organize, and run tests with PHPUnit.&lt;/p&gt;
&lt;h4&gt;Testing PHP Applications: Advanced Topics&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Craftily leverage PHPUnit: Attendees of this workshop will learn PHPUnit best practices and field-tested strategies for the introduction of testing measures into legacy projects. A range of examples will help the attendees to develop a sense for hard-to-test code and bad tests. They will learn how to refactor legacy code for testability and how to avoid common pitfalls when writing unit tests.&lt;/p&gt;
&lt;h4&gt;Insider&#039;s Tip XML: Applications the Smart Way&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;XML is the standard language for data exchange on the Web and is concealed from the end user&#039;s eyes in many file formats (such as Microsoft Office, for instance). This workshop shows that working with XML can be fun when the transported data is valid and the access leverages efficient APIs. We extend PHP&#039;s DOM API with custom methods and implement localization support in PHP during a Live Coding session. The definition of XSD schemas for the validation of XML data as well as the usage of XPath as a query language will be demonstrated. Effective error handling is also a topic.&lt;/p&gt;
&lt;h4&gt;Tuning for Web Applications&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;He who takes a clumsy path towards a solution will get into trouble he does not want to be in. Usually this happens to the detriment of performance and scalability. This workshop shows uses a plethora of real-world examples to show how you can avoid such bottlenecks in current architectures and superstructures from the get-go. It invites to reconsider and adapt your way of thinking.&lt;/p&gt;
&lt;h4&gt;Design Patterns I: The Most Important Standards&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Why reinvent the wheel every time? The developers of this workshop will get to know important design patterns that have proven themselves especially in PHP-based web applications. Problems that commonly occur in practice will be presented and solutions for them will be coded live. Benefits and drawbacks as well as applications and common implementation mistakes will be presented when the standard design patterns are discussed.&lt;/p&gt;
&lt;h4&gt;Design Patterns II: Integrating Sophisticated Patterns&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;The workshop covers topics such as Temporal Patterns, the persisting of objects in relational and NoSQL databases, or Enterprise Integration Patterns. Typical problems are presented and analyzed. The (lesser known) design patterns that are used to solve these problems will provide the attendees with knowledge that is valuable to their daily routine.&lt;/p&gt;
&lt;h4&gt;Modern Version Control with Git&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Git is a powerful version control system that allows you to reliably manage all changes made to all components (code, configuration, ) of your software. This is the foundation for the continuous integration of your project. This workshop imparts the fundamentals for the usage of Git as well as best practices and processes for the development, release management, and deployment of your software that will make your team noticeable more effective.&lt;/p&gt;
&lt;h4&gt;Continuous Integration with Jenkins&lt;/h4&gt;
&lt;h5&gt;Workshop with Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;When you want to measure and control the quality of your software during development and operation then you can profit from setting up an environment for the continuous integration of your PHP projects. With the combination of dynamic and static testing techniques you automate recurring tasks, stay up-to-date on the state of your software&#039;s quality, and minimize risks to your project&#039;s success. Attendees of this workshop will learn how to leverage Jenkins for the continuous integration and inspection of their PHP software.&lt;/p&gt;
&lt;h4&gt;It is best to expect the worst!&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;In times of constant break-in attempts by bored users it makes sense to always expect attacks from the Internet. Even allegedly secure structures provide adept hackers with no opposition worth mentioning. Responsible developers just have to know how hackers would attack their application or infrastructure. This workshop imparts fundamental knowledge and demonstrates in a Live Coding session what CSRF, XSS, or SQL Injections are, how you can make the life of attackers harder, and how effective countermeasures can be implemented.&lt;/p&gt;
&lt;h4&gt;Attack! What makes attacks on the Web successful&lt;/h4&gt;
&lt;h5&gt;Workshop with Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Applications are permanently exposed to attacks on the Internet. Attackers do not rest to contrive means and ways to inflict damage. Attendees of this workshop switch sides and attack a Black Box demo application. They learn how attackers gather information, exploit security holes, and take over servers. The workshop imparts knowledge about finding and closing security issues and how to implement countermeasures to attacks.&lt;/p&gt;
&lt;h4&gt;Framework: Basics in Three Hours&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;This workshop provides answers to many questions about the structure of web applications and writing testable, maintainable, and extensible code by giving a practical example. Important design patterns and best practices will be demonstrated. Attendee feedback and questions will steer this session. The goal is a better understanding for the main concepts of frameworks.&lt;/p&gt;
&lt;h4&gt;Why the Tower of Pisa is Leaning&lt;/h4&gt;
&lt;h5&gt;Workshop with Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;The importance of non-functional aspects for technical decisions is often underestimated or completely overlooked. The more complex the issue is the more likely it is that ignoring the non-functional aspects will result in problems that cannot be solved easily later on. He who thinks about architecture before development solves tomorrow&#039;s problems today. This workshop presents various architectural patterns for web applications and also covers current trends such as Distributed Caching, Message Queues, and NoSQL. It introduces the audience to tried and true building blocks that allow the development of highly performant and scalable web applications with PHP.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;With a twinkle in their eyes and a dash of fun, &lt;a href=&quot;http://thephp.cc/consultant/sebastian-bergmann&quot;&gt;Sebastian Bergmann&lt;/a&gt;, &lt;a href=&quot;http://thephp.cc/consultant/arne-blankerts&quot;&gt;Arne Blankerts&lt;/a&gt;, and &lt;a href=&quot;http://thephp.cc/consultant/stefan-priebsch&quot;&gt;Stefan Priebsch&lt;/a&gt; explain development methods and tools as well as present trends and concepts. This is efficient learning in a relaxed environment. Take advantage of this uniquely intense form of knowledge transfer at an unbeatable cost-to-benefit ratio and &lt;a href=&quot;http://www.amiando.com/phpsummituk2012&quot;&gt;reserve your seat today&lt;/a&gt;!&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 25 Feb 2012 12:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/921-guid.html</guid>
    <category>thephp.cc</category>

</item>
<item>
    <title>PHP Summit in München</title>
    <link>http://sebastian-bergmann.de/archives/920-PHP-Summit-in-Muenchen.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/920-PHP-Summit-in-Muenchen.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=920</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=920</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;a href=&quot;http://php-summit.de/&quot;&gt;&lt;img src=&quot;http://it-republik.de/konferenzen/phpsummit2012spring_konferenz/img/layout/teaser.jpg&quot; border=&quot;0&quot; width=&quot;500&quot; alt=&quot;PHP Summit&quot;/&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;This blog posting is in German as the event it relates to is German-only.&lt;br/&gt;Sorry for the inconvenience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bei allen PHP-Themen zählt nichts mehr als die Praxis. Deshalb bieten wir unsere Power-Workshops interaktiv und mit intensivem Praxisbezug an. Über die behandelten Themen entscheiden die Teilnehmer mit ihren konkreten Fragen. Anstelle von Frontalunterricht erleben sie die Entwicklung von neuem Code unmittelbar. Mit Augenzwinkern und Spaß erläutern Sebastian Bergmann, Arne Blankerts und Stefan Priebsch Entwicklungsmethoden und Tools und stellen Trends und Konzepte vor.&lt;/p&gt;
&lt;p&gt;Der nächste &lt;a href=&quot;http://php-summit.de/&quot;&gt;PHP Summit&lt;/a&gt; findet im März in München statt. Und das sind die Workshops:&lt;/p&gt;

&lt;dl&gt;&lt;dd&gt;&lt;h4&gt;Update PHP: Neue Features und Technologien nutzen &lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;PHP 5.3 und PHP 5.4 überzeugen im Programmieralltag durch eine Fülle relevanter Vereinfachungen. Lernen Sie die innovativen Features und geschickte Einsatzmöglichkeiten der neuen Versionen kennen. Entdecken Sie das Lösungspotenzial aktueller Technologien aus dem PHP-Umfeld (memcached, ZeroMQ ) für Ihre Fragestellungen.&lt;/p&gt;

&lt;h4&gt;Weg mit Strubbelcode: identifizieren  verbessern  vermeiden&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Früher oder später wird unsauber geschriebener Code zum Ärgernis. Nicht nur für den, der ihn warten muss. Änderungen und Erweiterungen können im Extremfall den Code unwirtschaftlich machen. Lernen Sie schlechten Code durch statische Codeanalyse aufzufinden und in test- und wartbaren Code umzuschreiben. Lernen Sie mithilfe der SOLID-Prinzipien, nachhaltig wartbaren Code zu schreiben.&lt;/p&gt;

&lt;h4&gt;Best Practices  aus dem Alltag für den Alltag&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Natürlich könnte man das Rad jeden Tag neu erfinden. Meist fehlt dafür die Zeit, Spaß macht es auch nicht und Fehler können sich so immer wieder an denselben Stellen einschleichen. Für die vielen alltäglichen Probleme, die nur geringfügig von schon vorhandenen Lösungen abweichen, gibt es clevere Ansätze, die das Leben leichter machen. In einer komplett vom Auditorium gesteuerten Live Session zeigt der Workshop dafür programmatische Konzepte und lädt zur Diskussion über Tools und klassische Fragestellungen ein.&lt;/p&gt;

&lt;h4&gt;Auf Fehler sicher vorbereitet sein&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Programme und Webseiten enthalten Fehler. Immer. Sie werden sichtbar, wenn Benutzer falsche, ungültige oder unerwartete Eingaben machen, der Zugriff auf die Datenbank plötzlich unmöglich ist oder die Festplatte überläuft. Um solche und andere Probleme sicher abzufangen, gibt es verschiedene Ansätze, die hier vorgestellt und diskutiert werden. Wie man Exceptions richtig anwendet, warum ein eigener Error Handler hilfreich ist und dass Debugging viel mit Sicherheit zu tun hat, vermittelt der Workshop lebendig und anschaulich.&lt;/p&gt;

&lt;h4&gt;Objektorientierte Programmierung (OOP) in PHP I: Basiswissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop klärt die Frage, was es mit der objektorientierten Programmierung eigentlich auf sich hat. Jenseits der bekannten Standardbeispiele führt er praktisch in die OOP mit PHP ein. Dabei werden neben den Grundlagen und zentralen Prinzipien der OOP interessante Features beispielsweise aus der Standard PHP Library (SPL) vorgestellt und ihr sinnvoller Praxiseinsatz vorgeführt. Neben Faktenwissen wird eine Denkweise vermittelt, die es erlaubt, unnötig komplizierte Ansätze von vornherein zu umgehen.&lt;/p&gt;

&lt;h4&gt;Objektorientierte Programmierung (OOP) in PHP II: Aufbauwissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop zeigt Teilnehmern, die mit den Grundlagen der OOP vertraut sind, fortgeschrittene Techniken wie Dependency Injection, abstrakte Klassen, Interfaces und Best Practices für erfolgreiche OOP. Eine Live-Coding-Session macht den Einsatz der vorgestellten Techniken in der Praxis erfahrbar. Außer Faktenwissen zeigt der Workshop, dass gute Lösungen einfache Lösungen sind: Einfache Objekte sind leichter wieder zu verwenden und vermeiden Fehler.&lt;/p&gt;

&lt;h4&gt;PHP-Anwendungen testen: Basiswissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Der Workshop vermittelt grundlegende Kenntnisse und Fähigkeiten im Einsatz von PHPUnit bei Unit Tests, Datenbank-Interaktionstests, Edge-to-Edge- Tests und End-to-End-Tests. Sie lernen alles, was Sie über das Schreiben, Ausführen und Organisieren von Unit Tests mit PHPUnit beherrschen müssen.&lt;/p&gt;

&lt;h4&gt;PHP-Anwendungen testen: Aufbauwissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;PHPUnit clever einsetzen: Die Teilnehmer lernen die besten Praktiken beim Einsatz von PHPUnit und erprobte Strategien bei der Einführung von Testmaßnahmen an vorhandener Software kennen. Anhand zahlreicher Beispiele entwickeln Sie einen Blick für schlechte Tests und lernen, sie zu verbessern, schwer testbaren Code zu identifizieren und Legacy-Code Schritt für Schritt testbar zu machen.&lt;/p&gt;

&lt;h4&gt;Geheimtipp XML: Die smarte Art der Anwendung&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;XML ist das Standardformat für den Datenaustausch im Web und verbirgt sich in vielen, für Endanwender oft nicht sichtbaren Dateiformaten (z. B. aktuelle MS-Office-Versionen) und Formen. Der Workshop zeigt, dass XML richtig Spaß machen kann, wenn die übermittelten Daten validiert werden und der Zugriff mit effiziente APIs erfolgt. In der Live Session erweitern wir das DOM-API von PHP um eigene Methoden und unterstützen die Lokalisierung durch PHP. Eigene XSD Schemas zur Validierung werden definiert und der Einsatz von XPath als Abfragesprache vorgeführt. Vermittelt wird auch der Einblick in eine wirklich effektive Fehlerbehandlung.&lt;/p&gt;

&lt;h4&gt;Neu: Tuning für Web-Anwendungen&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Wer einen ungeschickten Weg zur Lösung beschreitet, handelt sich Probleme ein, die er gar nicht haben möchte. In der Regel geht das zulasten des Tempos und der Skalierbarkeit. Wie man solche Schwachpunkte in gängigen Aufbauten und Architekturen vorab erkennt und durch bessere Konzepte von vornherein vermeiden kann, zeigt dieser Workshop an zahlreichen Praxisbeispielen. Eigene Denk- und Herangehensweisen können überprüft und modifiziert werden.&lt;/p&gt;

&lt;h4&gt;Entwurfsmuster I: Die wichtigsten Standards&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Warum das Rad jedes Mal neu erfinden? Die Teilnehmer lernen in diesem Workshop wichtige Entwurfsmuster kennen, die sich in PHP-Webanwendungen besonders bewährt haben. Häufig in der Praxis auftretende Schwierigkeiten werden vorgeführt und Lösungen werden live programmiert. Vor- und Nachteile sowie Einsatzmöglichkeiten und typische Fehler bei der Anwendung von Standardmustern werden ausführlich erläutert und diskutiert.&lt;/p&gt;

&lt;h4&gt;Entwurfsmuster II: Integration anspruchsvoller Patterns&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop behandelt Themenstellungen wie temporale Patterns, das Speichern von Objekten in relationale und NoSQL-Datenbanken oder Enterprise Integration Patterns mit Schwerpunkten, die von den Teilnehmern frei festgelegt werden. Eine Reihe typischer Probleme wird vorgeführt und analysiert. Die zu ihrer Lösung eingesetzten (wenig bekannten) Entwurfsmuster vermitteln den Teilnehmern fortgeschrittene Kenntnisse, die im Alltag wertvoll sind.&lt;/p&gt;

&lt;h4&gt;Moderne Versionskontrolle mit Git&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Git ist ein mächtiges Versionsverwaltungssystem, mit dem Sie alle Bestandteile Ihrer Software durch alle Änderungen und Versionen zuverlässig verfolgen können. Damit schaffen Sie die Grundlage für die kontinuierliche Integration der Software. Der Workshop vermittelt Grundlagen für den Einsatz von Git, Best Practices und Prozesse für Entwicklung, Release-Management und Deployment, die Ihre Teamarbeit spürbar effektiver machen.&lt;/p&gt;

&lt;h4&gt;Kontinuierliche Integration mit Jenkins&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Wer die Qualität seiner Software während der Entwicklung und im Betrieb messen und kontrollieren will, profitiert vom Einrichten einer Umgebung, in der PHP-Projekte kontinuierlich integriert werden können. Mit der Kombination dynamischer und statischer Testverfahren automatisieren Sie wiederkehrende Aufgaben, sind über die Softwarequalität auf dem Laufenden und minimieren Projektrisiken erfolgreich. Der Workshop vermittelt die Grundlagen der kontinuierlichen Integration und Inspektion von PHP-Software. Sie üben Installation, Konfiguration und Betrieb von Jenkins für PHP-Projekte.&lt;/p&gt;

&lt;h4&gt;Am besten mit dem Schlimmsten rechnen!&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;In Zeiten ständiger Einbruchsversuche durch gelangweilte Anwender ergibt es Sinn, wirklich immer mit Angriffen aus dem Internet zu rechnen. Auch vermeintlich sichere Strukturen bieten versierten Hackern oft keinen nennenswerten Widerstand. Verantwortungsbewusste Entwickler müssen wissen, wie man der eigenen Anwendung oder Infrastruktur schaden könnte. Der Workshop vermittelt grundlegende Zusammenhänge und zeigt in einer Live Session, was Begriffe wie XSS, CSRF oder SQL-Injection bedeuten, wie man Angreifern das Leben schwer macht und wirksame Lösungen implementiert.&lt;/p&gt;

&lt;h4&gt;Attacke! Was Angriffe im Web erfolgreich macht&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Anwendungen sind im Internet permanent Angreifern ausgesetzt. Im Workshop wechseln die Teilnehmer die Seiten und greifen selbst eine Demo-Blackbox-Anwendung an. Sie lernen, wie Angreifer Informationen sammeln, Sicherheitslücken ausnutzen und Server übernehmen. Vermittelt werden Methoden, um Lücken zu finden, sie zu schließen und Angriffe abzufangen. Der abschließende Blick in den Quellcode sensibilisiert für Schwachstellen und zeigt, wie man sie behebt.&lt;/p&gt;

&lt;h4&gt;Framework: Basics in drei Stunden&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Grundlegende Fragen nach der Struktur einer Webanwendung und dem Schreiben von Code, der test-, wart- und erweiterbar ist, werden an einem praktischen Beispiel beantwortet. Wichtige Entwurfsmuster und Best Practices werden vorgeführt. Feedback und Fragen der Teilnehmenden steuern den Verlauf der Session. Ziel ist ein besseres Verständnis für die wesentlichen Konzepte von Frameworks.&lt;/p&gt;

&lt;h4&gt;Warum der Turm in Pisa schief steht&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Nichtfunktionale Aspekte werden in ihrer Bedeutung für technische Entscheidungen oft unterschätzt oder ganz übersehen. Je komplexer die Fragestellungen desto wahrscheinlicher ist es, dass aus diesem Wegschauen Probleme resultieren, die später nicht leicht einzufangen sind. Wer sich vor der Entwicklung Gedanken zur Architektur macht, löst heute Probleme von morgen. Der Workshop zeigt Architekturmuster für Webanwendungen und geht auf aktuelle Trends wie Distributed Caching, Message Queues und NoSQL ein. Es werden erprobte Bausteine vorgestellt, mit denen hochperformante und skalierbare Webanwendungen in PHP entwickelt werden können.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;



&lt;p&gt;Der &lt;a href=&quot;http://php-summit.de/&quot;&gt;PHP Summit&lt;/a&gt; bietet effizientes Lernen in entspannter Atmosphäre. Profitieren Sie von dieser einzigartig intensiven Form der Informationsvermittlung mit einem unschlagbaren Preis-Leistungs-Verhältnis &lt;a href=&quot;https://www.entwickler.com/ssl/formtool/index.php?id=221&amp;amp;lang=de&quot;&gt;und reservieren Sie sich Ihren Platz noch heute&lt;/a&gt;!&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 03 Feb 2012 05:15:29 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/920-guid.html</guid>
    <category>php</category>
<category>php summit</category>
<category>training</category>

</item>
<item>
    <title>A Tool's Tale</title>
    <link>http://sebastian-bergmann.de/archives/919-A-Tools-Tale.html</link>
            <category>Presentations</category>
    
    <comments>http://sebastian-bergmann.de/archives/919-A-Tools-Tale.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=919</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=919</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;When &lt;a href=&quot;http://twitter.com/noahsussman&quot;&gt;Noah Sussman&lt;/a&gt; asked me to give a &lt;a href=&quot;http://codeascraft.etsy.com/etsy-speaker-series/&quot;&gt;Code as Craft Technology Talk&lt;/a&gt; last week when I was consulting for Etsy I immediately said yes. However, I was a bit surprised when the talk was announced under the title &quot;An Evening with Sebastian Bergmann&quot;. When I read that title the first time, it was just minutes after Arne, Stefan and I had talked about one of our favourite scenes from &quot;&lt;a href=&quot;http://www.imdb.com/title/tt0183790/&quot;&gt;A Knight&#039;s Tale&lt;/a&gt;&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Chaucer:&lt;/strong&gt; I&#039;m a writer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wat:&lt;/strong&gt; A what?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaucer:&lt;/strong&gt; A wha- a what? A writer. You know, I write, with ink, and parchment. Geoffrey Chaucer&#039;s the name, writing&#039;s the game. You&#039;ve probably read my book? The Book of the Duchess? No? Well, it was allegorical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Roland:&lt;/strong&gt; Well, we won&#039;t hold that against you, that&#039;s for every man to decide for himself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just like with &lt;a href=&quot;http://sebastian-bergmann.de/archives/915-Testable-Code-Rockstar-Edition.html&quot;&gt;a talk that I gave last year&lt;/a&gt;, I suddenly had a chain of associations in my head that I just had to follow. And down the rabbit hole I went once more ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_1.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_1.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Hi! I have no idea why this talk is titled &quot;An Evening with Sebastian Bergmann&quot;. I hope that this evening will turn into an interesting discussion about PHPUnit and all things testing. To break the ice, and to not appear completely unprepared, I came up with the following slides ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_2.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_2.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;So I recently talked with my friends Arne and Stefan about the movie &quot;A Knight&#039;s Tale&quot;. Somehow the idea stuck in my head that a variation of that title might be a good idea for a talk of mine. After dismissing &quot;A Fool&#039;s Tale&quot; I arrived at &quot;A Tool&#039;s Tale&quot;. So that&#039;s what we&#039;re stuck with and what I am going to try right now ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_3.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_3.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_4.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_4.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_5.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_5.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_6.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_6.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;What I just did was a variation on how Geoffrey Chaucer introduces himself in the movie.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_7.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_7.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Some time in 2001 I started to work on PHPUnit because I wanted to have something like JUnit for PHP. The initial &quot;port&quot; was completed within one weekend. The code was ugly because I had to emulate exceptions which PHP 4 did not have. On November 27th 2001 I checked the code into &lt;code&gt;cvs.php.net&lt;/code&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_8.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_8.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;A lot has changed since 2001. Hopefully not very many developers are still stuck with PHP 4. As of PHPUnit 2.0, which was released on &lt;a href=&quot;sebastian-bergmann.de/archives/378-PHPUnit2-2.0.0-Released.html&quot;&gt;July 14 2004&lt;/a&gt;, the day after PHP 5.0.0 was released, PHP 5 is required to run PHPUnit. &lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_9.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_9.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit is neither the only testing framework nor the only quality assurance tool for PHP. Over the last years a nice ecosystem of static analysis tools started to grow.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_10.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_10.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;I get this question a lot: why do only Germans work on tools that tell me that my code is bad? I do not have an answer for this, sorry. But the statement is also not true: PHP_CodeSniffer is not developed by a German.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_11.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_11.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;PHP has changed and so the have the tools we use to write and maintain code. In 2006 the PHPUnit code was migrated from CVS to Subversion ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_12.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_12.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;... and in &lt;a href=&quot;http://sebastian-bergmann.de/archives/876-PHPUnit-Development-Moved-to-GitHub.html&quot;&gt;December 2009 from Subversion to Git and GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_13.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_13.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit is no longer one big monolithic package. It has been &lt;a href=&quot;http://sebastian-bergmann.de/archives/892-PHPUnit-3.5-Refactoring-to-Components.html&quot;&gt;refactored to components&lt;/a&gt; that are being reused by other testing frameworks, for instance. Unfortunately, &lt;a href=&quot;http://sebastian-bergmann.de/archives/899-PHPUnit-3.5-Upgrading-Woes.html&quot;&gt;this refactoring was not without problems&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_14.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_14.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit gets more and more convenience functionality. Here are a couple of examples:&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_15.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_15.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_16.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_16.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_17.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_17.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_18.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_18.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Tests can be written, both unintentionally and intentionally, in bad ways. Bad tests can lie. They can give you a false sense of security by reporting that something is tested when it really is not.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_19.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_19.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;This is why I started iplementing coutermeasures against bad tests such as the (ultimately useless but still interesting) assertion counting ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_20.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_20.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;... as well as the strict execution mode.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_21.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_21.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;There is code in PHPUnit that I am not proud of. I am trying to make the world a better place by eliminating one singleton at a time, for instance. Unfortunately, cleaning up code sometimes breaks things. Contrary to what a popular opinion on Twitter is, I do not like breaking backwards compatibility in PHPUnit and try really hard to avoid it.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_22.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_22.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;This is a &quot;good&quot; example of such a backwards compatibility breakage. It happened in PHPUnit 3.6 because I eliminated a Singleton. Had I known that many developers used this API (instead of the XML configuration file) to set up a code coverage blacklist or whitelist I would probably not have done the change. If more people would have tested the release candidates leading up to PHPUnit 3.6 they could have told me ... oh well.&lt;/p&gt;
&lt;p&gt;At this point the &quot;Evening with Sebastian Bergmann&quot; turned into the interesting discussion I had hoped for.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 01 Feb 2012 07:30:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/919-guid.html</guid>
    <category>phpunit</category>

</item>
<item>
    <title>Static Analysis with HipHop for PHP</title>
    <link>http://sebastian-bergmann.de/archives/918-Static-Analysis-with-HipHop-for-PHP.html</link>
            <category>PHP</category>
    
    <comments>http://sebastian-bergmann.de/archives/918-Static-Analysis-with-HipHop-for-PHP.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=918</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=918</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;In &lt;a href=&quot;http://sebastian-bergmann.de/archives/894-Using-HipHop-for-Static-Analysis.html&quot;&gt;July 2010&lt;/a&gt; I already blogged about the fact that &lt;a href=&quot;http://sebastian-bergmann.de/archives/880-My-Take-on-Facebooks-HipHop-for-PHP.html&quot;&gt;HipHop for PHP&lt;/a&gt;, the source code transformer that turns PHP code into C++ code that can then be compiled with g++, can also be used for &lt;a href=&quot;http://en.wikipedia.org/wiki/Static_code_analysis&quot;&gt;static code analysis&lt;/a&gt; to find problems in PHP source code.&lt;/p&gt;
&lt;p&gt;Today I started to work on a &lt;a href=&quot;http://github.com/sebastianbergmann/hphpa&quot;&gt;convenience wrapper for HipHop&#039;s static analyzer&lt;/a&gt;:&lt;/p&gt;

&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;&amp;#10140;  ~  hphpa /usr/local/src/code-coverage/PHP
hphpa 1.0.0 by Sebastian Bergmann.

/usr/local/src/code-coverage/PHP/CodeCoverage/Filter.php
  206   TooManyArgument: $this-&gt;addFileToWhitelist($file, FALSE)&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Of course the tool can also generate an XML logfile in a format that is suitable for &lt;a href=&quot;http://jenkins-php.org/&quot;&gt;continuous integration&lt;/a&gt;:

&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;&amp;#10140;  ~  hphpa --checkstyle hphpa.xml --quiet /usr/local/src/code-coverage/PHP
hphpa 1.0.0 by Sebastian Bergmann.

&amp;#10140;  ~  cat hphpa.xml
&amp;lt;checkstyle&amp;gt;
 &amp;lt;file name=&quot;/usr/local/src/code-coverage/PHP/CodeCoverage/Filter.php&quot;&amp;gt;
  &amp;lt;error line=&quot;206&quot;
         message=&quot;$this-&amp;gt;addFileToWhitelist($file, FALSE)&quot;
         source=&quot;TooManyArgument&quot;/&amp;gt;
 &amp;lt;/file&amp;gt;
&amp;lt;/checkstyle&amp;gt;&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt; 
    </content:encoded>

    <pubDate>Fri, 27 Jan 2012 20:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/918-guid.html</guid>
    <category>hiphop</category>
<category>php</category>
<category>static analysis</category>

</item>
<item>
    <title>PHP Training in Montréal</title>
    <link>http://sebastian-bergmann.de/archives/917-PHP-Training-in-Montreal.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/917-PHP-Training-in-Montreal.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=917</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=917</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Together with my friends and partners from &lt;a href=&quot;http://thePHP.cc/&quot; title=&quot;thePHP.cc - The PHP Consulting Company&quot;&gt;thePHP.cc&lt;/a&gt;, Arne Blankerts and Stefan Priebsch, I will be giving an &quot;&lt;a href=&quot;http://confoo.ca/en/2012/session/advanced-php-development-2&quot;&gt;Advanced PHP Development&lt;/a&gt;&quot; training in Montréal in March.&lt;/p&gt;&lt;dl&gt;&lt;dd&gt;&lt;p&gt;With all PHP topics, nothing counts more than their practical application. This is why &lt;a href=&quot;http://thePHP.cc/&quot; title=&quot;thePHP.cc - The PHP Consulting Company&quot;&gt;thePHP.cc&lt;/a&gt; once again offers a highly interactive and practical training right before the &lt;a href=&quot;http://confoo.ca/en&quot;&gt;ConFoo&lt;/a&gt; conference. Based on their own specific needs and questions, the attendees decide on the topics that are covered. They experience the development of new code at first hand, following their own agendas rather than those of the three trainers.&lt;/p&gt;
&lt;p&gt;With a twinkle in their eyes and a dash of fun, &lt;strong&gt;Sebastian Bergmann&lt;/strong&gt;, &lt;strong&gt;Arne Blankerts&lt;/strong&gt;, and &lt;strong&gt;Stefan Priebsch&lt;/strong&gt; explain &lt;strong&gt;development methods and tools&lt;/strong&gt;, present &lt;strong&gt;trends and concepts&lt;/strong&gt;, and perform joint &lt;strong&gt;code review&lt;/strong&gt; sessions. This is efficient learning in a relaxed environment.&lt;/p&gt;
&lt;p&gt;Topics covered include &lt;strong&gt;development best practices&lt;/strong&gt;, &lt;strong&gt;object-oriented programming&lt;/strong&gt;, &lt;strong&gt;design patterns&lt;/strong&gt;, &lt;strong&gt;web application architecture&lt;/strong&gt;, &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;software quality and testing&lt;/strong&gt;. All three trainers will be present at all times, so attendees have an unparalleled level of access to top-notch PHP expertise.&lt;/p&gt;
&lt;p&gt;This training gives answers to every question you ever had about PHP and software development with PHP. Attendees should bring their own code and as many questions as they have.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;As the training is scheduled right before the &lt;a href=&quot;http://confoo.ca/en&quot;&gt;ConFoo&lt;/a&gt; conference and the topics covered complement its presentations, the &lt;a href=&quot;http://confoo.ca/en/2012/session/advanced-php-development-2&quot;&gt;Advanced PHP Development&lt;/a&gt;&quot; training is the perfect preparation for attendees to get the most out of the conference.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://confoo.ca/en/register&quot;&gt;Register now&lt;/a&gt;&lt;/strong&gt; to secure your seat as the number of attendees is limited to ensure a beneficial learning environment.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 04 Jan 2012 09:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/917-guid.html</guid>
    <category>confoo</category>
<category>thephp.cc</category>
<category>training</category>

</item>
<item>
    <title>Using CLANG/scan-build for Static Analysis of the PHP Interpreter</title>
    <link>http://sebastian-bergmann.de/archives/916-Using-CLANGscan-build-for-Static-Analysis-of-the-PHP-Interpreter.html</link>
            <category>PHP</category>
    
    <comments>http://sebastian-bergmann.de/archives/916-Using-CLANGscan-build-for-Static-Analysis-of-the-PHP-Interpreter.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=916</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=916</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;I have been tinkering with &lt;a href=&quot;http://clang.llvm.org/&quot;&gt;CLANG&lt;/a&gt;&#039;s &lt;a href=&quot;http://clang-analyzer.llvm.org/&quot;&gt;static analyzer&lt;/a&gt; lately. This post summarizes how I installed LLVM and CLANG and performed the analysis of a build of the PHP interpreter.&lt;/p&gt;
&lt;p&gt;First, we need to obtain the CLANG and LLVM source trees and build CLANG:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;cd /usr/local/src
mkdir clang
cd clang
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../../
mkdir build
cd build
../llvm/configure --enable-optimized --disable-assertions
make&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Then we need to add the directories that contain &lt;code&gt;clang&lt;/code&gt;, &lt;code&gt;ccc-analyzer&lt;/code&gt;, and &lt;code&gt;scan-build&lt;/code&gt; to our &lt;code&gt;$PATH&lt;/code&gt;:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;export PATH=/usr/local/src/clang/build/Release/bin:/usr/local/src/clang/llvm/tools/clang/tools/scan-build:$PATH&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Now we can analyze the C code of PHP while compiling it using CLANG:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;cd /usr/local/src/php/5.4

export CC=&quot;ccc-analyzer&quot;
export CXX=&quot;ccc-analyzer&quot;

scan-build ./configure
scan-build make&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Once the build completes there will be a report directory with HTML files (about 1.5 GB of them) in &lt;code&gt;/tmp&lt;/code&gt;. 
    </content:encoded>

    <pubDate>Fri, 16 Dec 2011 12:20:57 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/916-guid.html</guid>
    <category>clang</category>
<category>llvm</category>
<category>php</category>
<category>scan-build</category>
<category>static_analysis</category>

</item>
<item>
    <title>Testable Code: Rockstar Edition</title>
    <link>http://sebastian-bergmann.de/archives/915-Testable-Code-Rockstar-Edition.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/915-Testable-Code-Rockstar-Edition.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=915</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=915</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Saying &quot;yes&quot; is my default response when a friend asks for my support. But when my friend Carola Köhntopp asked me a while ago to participate in a presentation about presenting (meta alert!) at this year&#039;s PHP @ FrOSCon I committed myself to help without knowing what I would be getting myself into.&lt;/p&gt;
&lt;p&gt;The title of Carola&#039;s presentation, &quot;PHPopstars&quot;, was a play of words on the reality television franchise Popstars. The idea was that there were five &quot;finalists&quot; (Kore Nordmann, Tobias Schlitt, Judith Andresen, Kristian Köhntopp, and myself) in a competition of &quot;PHP Speakers&quot;. Carola had asked the five of us to each prepare a 4-minute-long presentation that we were to present as part of the PHPopstars event.&lt;/p&gt;
&lt;p&gt;My presentation was titled &quot;Testable Code: Rockstar Edition&quot; and here are the slides:&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_1.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_1.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;I am not a pop star. I do not listen to pop music. According to Lorna Jane I am a rock star. I would not describe myself as such but two years ago I came very close to feeling like a rock star when I toured the United States together with Arne and Stefan. Over the course of 14 days we presented workshops at conferences in 7 cities.&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_2.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_2.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;About the time when Carola had asked me about participating in PHPopstars the soundtrack for Portal 2 was released. It is titled &quot;Songs to Test By&quot;.&lt;/p&gt;
&lt;p&gt;This title started a chain of associations that I just had to follow. And down the rabbit hole I went.&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_3.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_3.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;You know where you are? You&#039;re in the jungle, baby.&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_4.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_4.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;You&#039;re gonna die!&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_5.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_5.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;blockquote&gt;Just an urchin livin&#039; under the street&lt;br/&gt;
I&#039;m a hard case that&#039;s tough to beat&lt;br/&gt;
I&#039;m your charity case, so buy me something to eat&lt;br/&gt;
I&#039;ll pay you at another time, take it to the end of the line&lt;br/&gt;
&lt;br/&gt;
Take me down to the paradise city&lt;br/&gt;
&lt;strong&gt;Where the tests are green&lt;br/&gt;
And the code is pretty&lt;/strong&gt;&lt;br/&gt;
Take me home&lt;/blockquote&gt;

&lt;p&gt;Such a chain of associations is not always expedient. The one I just described is only useful when your goal is to fill a 4-minute sub-presentation in someone else&#039;s presentation.&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_6.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_6.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Eleven years ago, when I presented for the first time at a conference (and at the world&#039;s first PHP conference, no less), my presentation style was drastically different from the way I present today.&lt;/p&gt;
&lt;p&gt;Nowadays I try to find a pictorial language to reach the audience not only on the technical level (using the spoken word and with code on the slides) but also on the emotional level.&lt;/p&gt;
&lt;p&gt;Take the above picture of a green field as an example. It resonates well with developers as they (generally) prefer development without the restrictions that legacy code impose.&lt;/p&gt;

&lt;div align=&quot;center&quot;&gt;&lt;nobr&gt;&lt;a href=&quot;http://www.duarte.com/books/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/resonate.jpg&quot;  /&gt;&lt;/a&gt;&amp;#160;&lt;a href=&quot;http://www.duarte.com/books/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/slideology.jpg&quot;  /&gt;&lt;/a&gt;&lt;/nobr&gt;&lt;/div&gt;
&lt;p&gt;The books by Nancy Duarte, &quot;slide:ology&quot; and &quot;resonate&quot;, are excellent resources that help with getting a fresh perspective on presenting. However, as a technical presenter that mostly talks about code, these books are not as useful as I hope &quot;&lt;a href=&quot;http://presentationpatterns.com/&quot;&gt;Presentation Patterns&lt;/a&gt;&quot; will be.&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_7.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_7.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Avoid the hell that is global state!&lt;/p&gt;&lt;p&gt;Do not depend on global variables!&lt;/p&gt;&lt;p&gt;Do not use singletons!&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_8.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_8.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Follow the &lt;em&gt;Separation of Concerns&lt;/em&gt; design principle!&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_9.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_9.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Use loosely coupled objects!&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_10.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_10.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;Design Patterns can help!&lt;/p&gt;

&lt;a href=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_11.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://sebastian-bergmann.de/images/testable_code_rockstar_edition_11.png&quot; width=&quot;500&quot;  /&gt;&lt;/a&gt;
&lt;p&gt;A good architecture leads to clean code that is easy to test as well as cheap to maintain.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 11 Sep 2011 18:30:00 +0200</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/915-guid.html</guid>
    <category>presenting</category>

</item>
<item>
    <title>Meet thePHP.cc in October</title>
    <link>http://sebastian-bergmann.de/archives/914-Meet-thePHP.cc-in-October.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/914-Meet-thePHP.cc-in-October.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=914</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=914</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Fall season is traditionally conference season in the PHP community. This October, you will have the chance to catch all three partners of &lt;a href=&quot;http://thePHP.cc/&quot;&gt;thePHP.cc&lt;/a&gt; -- &lt;a href=&quot;http://sebastian-bergmann.de/&quot;&gt;Sebastian Bergmann&lt;/a&gt;, &lt;a href=&quot;http://blankerts.de/&quot;&gt;Arne Blankerts&lt;/a&gt;, and &lt;a href=&quot;http://priebsch.de/&quot;&gt;Stefan Priebsch&lt;/a&gt; -- at the following events:&lt;/p&gt;

&lt;dl&gt;&lt;dd&gt;

&lt;h3&gt;PHP NW Conference 2011&lt;/h3&gt;

&lt;h4&gt;Beware of the dark side, Luke!&lt;/h4&gt;
&lt;h5&gt;Tutorial by Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Somehow you met the impossible deadline, your project is online and you now deserve some time to relax. Other than you and me though, the internet does not sleep and your application is under constant risk of attack. Even without having access to the source code, attackers have their ways to break into applications and steal or modify private information.&lt;/p&gt;
&lt;p&gt;Switch sides for a day and attack the demo blackbox application! Learn how attackers gather information, exploit vulnerabilities and hijack servers -- and what to do to stop them.&lt;/p&gt;

&lt;h4&gt;PHP Tester&#039;s Toolbox&lt;/h4&gt;
&lt;h5&gt;Presentation by Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Various testing tools exist to test the different aspects and layers of PHP applications. There is PHPUnit for Unit Testing (and Test-Driven Development), Behat for Acceptance Testing (and Behaviour-Driven Development), Selenium for System Testing, and a plethora of tools for testing non-functional aspects such as performance and security.&lt;/p&gt;
&lt;p&gt;This presentation provides an overview of the goals of each of these tools and shows the first steps to leveraging them in your daily routine.&lt;/p&gt;

&lt;h3&gt;International PHP Conference 2011&lt;/h3&gt;

&lt;h4&gt;10 Years of PHPUnit&lt;/h4&gt;
&lt;h5&gt;Presentation by Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;2011 marks the 10th anniversary of PHPUnit, the de-facto standard for unit testing PHP work. Join Sebastian Bergmann, the tool&#039;s creator, in this session for a look at the history of the project, at new features in PHPUnit 3.6, as well as upcoming developments.&lt;/p&gt;

&lt;h4&gt;PHP Tester&#039;s Toolbox&lt;/h4&gt;
&lt;h5&gt;Presentation by Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Various testing tools exist to test the different aspects and layers of PHP applications. There is PHPUnit for Unit Testing (and Test-Driven Development), Behat for Acceptance Testing (and Behaviour-Driven Development), Selenium for System Testing, and a plethora of tools for testing non-functional aspects such as performance and security.&lt;/p&gt;
&lt;p&gt;This presentation provides an overview of the goals of each of these tools and shows the first steps to leveraging them in your daily routine.&lt;/p&gt;

&lt;h4&gt;Security 202: Are you sure your site is secure?&lt;/h4&gt;
&lt;h5&gt;Presentation by Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Being the good developer that you are, all the applications you create are being designed with security in mind. So of course you are following all the known best practices, you know you did your job well. You did, didn&#039;t you?&lt;/p&gt;
&lt;p&gt;In this session we will take a look at various common security myths and why quite many approaches, tutorials and common solutions just don&#039;t quite cut it. Find out what your options are to really get the job done and what you might have been missing in your current implementation!&lt;/p&gt;

&lt;h4&gt;Scalable High-Performance Architectures&lt;/h4&gt;
&lt;h5&gt;Presentation by Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Today, large-scale PHP platforms like Facebook demonstrate strikingly that it is quite possible to build scalable, high-performance web applications with PHP. It does not work out to just use an MVC framework as architecture, though.&lt;/p&gt;
&lt;p&gt;This session allows a peek into web architectures and technologies that large-scale PHP platforms use, and demonstrates how you can use them in your own projects.&lt;/p&gt;

&lt;h4&gt;This way or the other way?&lt;/h4&gt;
&lt;h5&gt;Presentation by Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Many decisions are required when developing software. If we are not sure which path to choose (which is often), we just guess. How about running an A/B test instead, so we can base our decision on empirical data? Why not continuously run A/B tests to increase conversion rates or sales?&lt;/p&gt;
&lt;p&gt;This presentation introduces how to properly do experiment-driven development in PHP.&lt;/p&gt;

&lt;h3&gt;ZendCon 2011&lt;/h3&gt;

&lt;h4&gt;Beware of the dark side, Luke!&lt;/h4&gt;
&lt;h5&gt;Workshop by Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Somehow you met the impossible deadline, your project is online and you now deserve some time to relax. Other than you and me though, the internet does not sleep and your application is under constant risk of attack. Even without having access to the source code, attackers have their ways to break into applications and steal or modify private information.&lt;/p&gt;
&lt;p&gt;Switch sides for a day and attack the demo blackbox application! Learn how attackers gather information, exploit vulnerabilities and hijack servers -- and what to do to stop them.&lt;/p&gt;

&lt;h4&gt;Design Patterns in Action&lt;/h4&gt;
&lt;h5&gt;Workshop by Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Design patterns are proven solutions to common coding problems. You probably even know some design patterns, but can you really apply them in praticse? In this workshop, we will solve some interesting, web-related coding problems using design patterns like Command, State, or Strategy. And while we are at it, we discuss best practices, for example composition over inheritances, single responsibility, and separation of concerns.&lt;/p&gt;
&lt;p&gt;No slides will be shown. All code will be written and explained live instead, taking audience questions and feedback into account.&lt;/p&gt;

&lt;h4&gt;PHP Tester&#039;s Toolbox&lt;/h4&gt;
&lt;h5&gt;Presentation by Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Various testing tools exist to test the different aspects and layers of PHP applications. There is PHPUnit for Unit Testing (and Test-Driven Development), Behat for Acceptance Testing (and Behaviour-Driven Development), Selenium for System Testing, and a plethora of tools for testing non-functional aspects such as performance and security.&lt;/p&gt;
&lt;p&gt;This presentation provides an overview of the goals of each of these tools and shows the first steps to leveraging them in your daily routine.&lt;/p&gt;

&lt;h4&gt;Performing Security Audits&lt;/h4&gt;
&lt;h5&gt;Presentation by Arne Blankerts&lt;/h5&gt;
&lt;p&gt;To ensure the high quality of your source code, you of course write (unit) tests and do regular code reviews. Judging the state of security though may seem a lot harder than it is -- if you do not know what to look for and where to get started.&lt;/p&gt;
&lt;p&gt;This talk will introduce you to security audits, why and how tools can assist a manual review and why a mere scanner based approach does not work.&lt;/p&gt;

&lt;h4&gt;Change is inevitable (except from a vending machine)&lt;/h4&gt;
&lt;h5&gt;Presentation by Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Where did Bob live two years ago? And what was his last email address again? If your application needs to keep track of things that change over time, you must to take a step beyond normal object relations or foreign keys in a database.&lt;/p&gt;
&lt;p&gt;This presentation introduces temporal patterns to solve these kinds of problems and shows how to effectively implement them in PHP using the date extension.&lt;/p&gt;

&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;We are looking forward to sharing our experience and knowledge with you at these excellent events. See you in October!&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 21 Jun 2011 18:45:00 +0200</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/914-guid.html</guid>
    <category>ipc</category>
<category>phpnw</category>
<category>thephp.cc</category>
<category>zendcon</category>

</item>
<item>
    <title>Towards Better Code Coverage Metrics in the PHP World</title>
    <link>http://sebastian-bergmann.de/archives/913-Towards-Better-Code-Coverage-Metrics-in-the-PHP-World.html</link>
            <category>Articles</category>
    
    <comments>http://sebastian-bergmann.de/archives/913-Towards-Better-Code-Coverage-Metrics-in-the-PHP-World.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=913</wfw:comment>

    <slash:comments>8</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=913</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Remember that I &lt;a href=&quot;http://sebastian-bergmann.de/archives/909-On-Sponsored-Open-Source-Development.html&quot;&gt;promised to blog&lt;/a&gt; about the requirements planning for more sophisticated support of code coverage metrics in PHP tools that I did with &lt;a href=&quot;http://derickrethans.nl/&quot;&gt;Derick&lt;/a&gt; earlier this year? While we met in London in February and Montreal in March to discuss this, both of us were too busy to communicate what we want to do yet.&lt;/p&gt;&lt;p&gt;This blog posting will hopefully shine a light on what it is we are planning.&lt;/p&gt;
&lt;h3&gt;Current Situation&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Code_coverage&quot;&gt;Code Coverage&lt;/a&gt; is a common metric used in software testing. &lt;a href=&quot;http://phpunit.de/&quot;&gt;PHPUnit&lt;/a&gt; supports this valuable software metric by leveraging the &lt;a href=&quot;https://github.com/sebastianbergmann/php-code-coverage&quot;&gt;PHP_CodeCoverage&lt;/a&gt; component which in turn makes use of &lt;a href=&quot;http://xdebug.org/&quot;&gt;Xdebug&lt;/a&gt;, an extension to the PHP interpreter. The support for code coverage could, however, be improved even further.&lt;/p&gt;
&lt;p&gt;Xdebug currently only supports what is usually referred to as &lt;strong&gt;Line Coverage&lt;/strong&gt;. This software metric measures whether each executable line was executed.&lt;/p&gt;
&lt;p&gt;Based on the line coverage information provided by Xdebug, PHP_CodeCoverage also calculates the &lt;strong&gt;Function / Method Coverage&lt;/strong&gt; software metric that measures whether each function or method has been invoked. This software metric is actually implemented in a much stricter way in PHP_CodeCoverage because it only considers a function or method as covered when all of its executable lines are executed at least once during test execution.&lt;/p&gt;
&lt;h3&gt;The Future&lt;/h3&gt;
&lt;p&gt;In the future it would be nice to make available more sophisticated code coverage metrics such as Statement Coverage, Branch Coverage, Call Coverage, and Path Coverage to the users of PHPUnit, PHP_CodeCoverage, and Xdebug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Statement Coverage&lt;/strong&gt; measures whether each statement is executed (a line of code can contain more than one statement). A mapping from statement to the start and end column in the corresponding line of code is desirable but would require changing PHP&#039;s compiler. It is, however, possible to extend Xdebug to report the number executable and executed statements for a line of code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Branch Coverage&lt;/strong&gt; measures whether the boolean expression of each control structure evaluated to both TRUE and FALSE during the execution of the test suite. This should be relatively easy to implement based on the information provided by Statement Coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Call Coverage&lt;/strong&gt; measures whether each function or method call is executed and should be possible to implement in userland (in PHP_CodeCoverage) based on static code analysis and statement coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Path Coverage&lt;/strong&gt; measures whether each of the possible paths in each function or method has been followed. A path is a unique sequence of branches from the entry of the function or methods to its exit. It should be possible to implement this in userland (in PHP_CodeCoverage) based on static code analysis and branch coverage.&lt;/p&gt;
&lt;p&gt;As an alternative to Path Coverage it might make sense to implement &lt;strong&gt;Linear Code Sequence and Jump (LCSAJ) Coverage&lt;/strong&gt; instead. This variation of Path Coverage does not require a flow graph and also avoids its exponential difficulty. It should be possible to implement in userland (in PHP_CodeCoverage) based on static code analysis and branch coverage.&lt;/p&gt;&lt;p&gt;The development of these features will take a lot of effort. It will be a challenge to find time in our schedules to work to tackle these features. But I felt like sharing what we are thinking about with you, the users of our tools, as soon as possible.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 17 Jun 2011 20:00:00 +0200</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/913-guid.html</guid>
    <category>code coverage</category>
<category>php</category>

</item>
<item>
    <title>Presenting at OSCON 2011</title>
    <link>http://sebastian-bergmann.de/archives/912-Presenting-at-OSCON-2011.html</link>
            <category>Events</category>
    
    <comments>http://sebastian-bergmann.de/archives/912-Presenting-at-OSCON-2011.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=912</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=912</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;a href=&quot;http://www.oscon.com&quot;&gt;&lt;img src=&quot;http://assets.en.oreilly.com/1/event/61/oscon2011_speaking_210x60.gif&quot; width=&quot;210&quot; height=&quot;60&quot; border=&quot;0&quot; alt=&quot;OSCON 2011&quot; /&gt;&lt;/a&gt;

&lt;p&gt;This July I am going to present at &lt;a href=&quot;http://www.oscon.com/oscon2011&quot;&gt;OSCON&lt;/a&gt; in Portland again:&lt;/p&gt;&lt;dl&gt;&lt;dd&gt;&lt;h4&gt;&lt;a href=&quot;http://www.oscon.com/oscon2011/public/schedule/detail/17866&quot;&gt;Testing LAMP Applications&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Most web applications are changed and adapted quite frequently and quickly. Their environment, for example the size and the behaviour of the user base, are constantly changing. What was sufficient yesterday can be insufficient today. Especially in a web environment it is important to monitor and continuously improve the internal quality not only when developing, but also when maintaining the software.&lt;/p&gt;&lt;p&gt;Packed with in-depth information and step-by-step guidance, this tutorial sets you on a path to create, maintain and extend sustainable software of high quality with PHP. You will learn how to plan, execute and automate tests for the different layers and tiers of a Web application.&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;&lt;h4&gt;&lt;a href=&quot;http://www.oscon.com/oscon2011/public/schedule/detail/18687&quot;&gt;Integrate Your PHP Project with Jenkins&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Jenkins is the leading open-source continuous integration server. Thanks to its thriving plugin ecosystem, it supports building and testing virtually any project. This session will familiarize the audience with Jenkins and show how it can be leveraged for PHP projects&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;&lt;h4&gt;&lt;a href=&quot;http://www.oscon.com/oscon2011/public/schedule/detail/17869&quot;&gt;Reviewing PHP Code&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;A code review can help detect bugs and keep the code maintainable. In this session, Sebastian Bergmann, a pioneer in the field of quality assurance in PHP projects and creator of various development tools, will introduce the audience to the best practices and available tools to perform code reviews of PHP-based software projects.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;&lt;strong&gt;os11fos&lt;/strong&gt; is a &lt;strong&gt;discount code&lt;/strong&gt; that will save you 20% when you register for the conference.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 03 Jun 2011 09:20:00 +0200</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/912-guid.html</guid>
    
</item>
<item>
    <title>Debugging with Git and PHPUnit</title>
    <link>http://sebastian-bergmann.de/archives/911-Debugging-with-Git-and-PHPUnit.html</link>
            <category>Articles</category>
    
    <comments>http://sebastian-bergmann.de/archives/911-Debugging-with-Git-and-PHPUnit.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=911</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=911</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;&lt;code&gt;git bisect&lt;/code&gt; can be used to find the change that introduced a bug. It does so by performing a binary search on the list of commits between a known &lt;em&gt;good&lt;/em&gt; and a known &lt;em&gt;bad&lt;/em&gt; state of the repository. A tool such as &lt;a href=&quot;http://phpunit.de/&quot;&gt;PHPUnit&lt;/a&gt; can be invoked at each step of the binary search to check whether or not the current state is broken.&lt;/p&gt;
&lt;p&gt;Let us assume that the unit tests for our project fail at the current &lt;code&gt;HEAD&lt;/code&gt; of the &lt;code&gt;master&lt;/code&gt; branch:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;sb@ubuntu bankaccount % ant
Buildfile: /home/sb/bankaccount/build.xml

phpunit:
     [exec] PHPUnit 3.5.13 by Sebastian Bergmann.
     [exec] 
     [exec] FSSSS
     [exec] 
     [exec] Time: 0 seconds, Memory: 4.50Mb
     [exec] 
     [exec] There was 1 failure:
     [exec] 
     [exec] 1) BankAccountTest::testBalanceIsInitiallyZero
     [exec] Failed asserting that &amp;lt;integer:1&amp;gt; matches expected &amp;lt;integer:0&amp;gt;.
     [exec] 
     [exec] /home/sb/bankaccount/tests/BankAccountTest.php:7
     [exec] 
     [exec] FAILURES!
     [exec] Tests: 1, Assertions: 1, Failures: 1, Skipped: 4.

BUILD FAILED&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;We know that the code worked when we initially imported it. So we need to look up the hash of the initial commit:&lt;/p&gt;

&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;sb@ubuntu bankaccount % git log --pretty=oneline
3e83825c0695bcfc1ea38880352b3449f578e4f0 Do not run PHPUnit in verbose mode by default.
48b683a02c54e732a8c3045b21c4f9183343dea8 Remove @covers annotations.
d54ba9eb910ce9fe9feafa6b9dbd2675ce43227a Break something.
e0c72d7409e461833ce1842e994de4148aa68da4 Remove comment.
75c5d82a31c768d28847d1908cfaa7d15fece4f7 Initial import.&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;Now we can tell Git that the initial commit was &lt;em&gt;good&lt;/em&gt; and that the current state is &lt;em&gt;bad&lt;/em&gt;:


&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;sb@ubuntu bankaccount % git bisect start
sb@ubuntu bankaccount % git bisect bad
sb@ubuntu bankaccount % git bisect good 75c5d82a31c768d28847d1908cfaa7d15fece4f7
Bisecting: 1 revision left to test after this (roughly 1 step)
[d54ba9eb910ce9fe9feafa6b9dbd2675ce43227a] Break something.&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;Next up is actually performing the binary search operation. At each step we use Apache Ant to invoke PHPUnit. The commit will be considered &lt;em&gt;good&lt;/em&gt; when all tests pass and &lt;em&gt;bad&lt;/em&gt; otherwise.&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;sb@ubuntu bankaccount % git bisect run ant -q
running ant -q
BUILD FAILED

Bisecting: 0 revisions left to test after this (roughly 0 steps)
[e0c72d7409e461833ce1842e994de4148aa68da4] Remove comment.

running ant -q
BUILD SUCCESSFUL

d54ba9eb910ce9fe9feafa6b9dbd2675ce43227a is the first bad commit

commit d54ba9eb910ce9fe9feafa6b9dbd2675ce43227a
Author: Sebastian Bergmann &lt;sb@sebastian-bergmann.de&gt;
Date:   Thu Mar 17 10:26:56 2011 +0100

    Break something.

bisect run success&lt;/pre&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;And this is how you debug using Git and PHPUnit&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 18 Mar 2011 12:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/911-guid.html</guid>
    <category>bisect</category>
<category>git</category>
<category>phpunit</category>

</item>
<item>
    <title>Visualization of PHPUnit Development</title>
    <link>http://sebastian-bergmann.de/archives/910-Visualization-of-PHPUnit-Development.html</link>
            <category>PHPUnit</category>
    
    <comments>http://sebastian-bergmann.de/archives/910-Visualization-of-PHPUnit-Development.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=910</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=910</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;iframe src=&quot;http://player.vimeo.com/video/21076066?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ffffff&quot; width=&quot;400&quot; height=&quot;225&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;According to &lt;code&gt;svn.php.net&lt;/code&gt;, I committed the first PHPUnit code to &lt;code&gt;cvs.php.net&lt;/code&gt; on November 27th 2001 and the first release, PHPUnit 0.1, was made on December 1st 2001.&lt;/p&gt;
&lt;p&gt;I started using &lt;code&gt;svn.phpunit.de&lt;/code&gt; for the development of PHPUnit on &lt;a href=&quot;http://sebastian-bergmann.de/archives/610-So-Long,-and-Thanks-for-All-the-PEARs.html&quot;&gt;June 29th 2006&lt;/a&gt;. I did not import any history from CVS into Subversion.&lt;/p&gt;
&lt;p&gt;On &lt;a href=&quot;http://sebastian-bergmann.de/archives/876-PHPUnit-Development-Moved-to-GitHub.html&quot;&gt;December 26th 2009&lt;/a&gt;, I moved the development of PHPUnit from &lt;code&gt;svn.phpunit.de&lt;/code&gt; to &lt;a href=&quot;http://github.com/sebastianbergmann/phpunit&quot;&gt;GitHub&lt;/a&gt;. I imported the history from Subversion into Git. As you can see in the video, moving to GitHub lead to an increased number of contributions to PHPUnit.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 16 Mar 2011 07:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/910-guid.html</guid>
    <category>gource</category>
<category>phpunit</category>
<category>visualization</category>

</item>
<item>
    <title>On Sponsored Open Source Development</title>
    <link>http://sebastian-bergmann.de/archives/909-On-Sponsored-Open-Source-Development.html</link>
            <category>Projects</category>
    
    <comments>http://sebastian-bergmann.de/archives/909-On-Sponsored-Open-Source-Development.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=909</wfw:comment>

    <slash:comments>8</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=909</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    This &lt;a href=&quot;http://pledgie.com/campaigns/14641&quot;&gt;campaign&lt;/a&gt; on &lt;a href=&quot;http://pledgie.com/site/about&quot;&gt;Pledgie&lt;/a&gt; is an experiment by &lt;a href=&quot;http://derickrethans.nl/&quot;&gt;Derick Rethans&lt;/a&gt; to find out whether or not it is feasible to expedite the work on feature requests in &lt;a href=&quot;http://en.wikipedia.org/wiki/Open_Source&quot;&gt;Open Source&lt;/a&gt; projects such as &lt;a href=&quot;http://xdebug.org/&quot;&gt;Xdebug&lt;/a&gt;. Since I more or less gave Derick the idea for this experiment, I will try to shine a light on our reasoning for this approach in this blog posting.&lt;br /&gt;
&lt;br /&gt;
For quite some time now, Derick and I occasionally discuss how the collection of &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_Coverage&quot;&gt;code coverage&lt;/a&gt; information in Xdebug can be improved so that &lt;a href=&quot;https://github.com/sebastianbergmann/php-code-coverage&quot;&gt;PHP_CodeCoverage&lt;/a&gt; can provide more useful information when you are running your unit tests using &lt;a href=&quot;http://phpunit.de/&quot;&gt;PHPUnit&lt;/a&gt;, for instance.&lt;br /&gt;
&lt;br /&gt;
At the moment, Xdebug only supports Line Coverage which means it can only tell us whether or not a particular line of code was executed or not. Since a line of code can contain more than one statement, the implementation of Statement Coverage in Xdebug would tell us whether just one statement in a line is executed (which would already count towards Line Coverage) or whether all of its statements are executed at least once while running the tests. Other code coverage metrics that are desirable include Branch Coverage, Path Coverage, and Call Coverage -- and we would like to have them supported by Xdebug and PHP_CodeCoverage as well.&lt;br /&gt;
&lt;br /&gt;
Implementing the data collection for these more sophisticated code coverage metrics in Xdebug and adding support for them in PHP_CodeCoverage is not a small task. And while both Derick and I live and breathe Open Source and like to hack on code things like work and private life do interfere with the development of our Open Source software projects. So with development efforts like this we can either wait for the time when &quot;we have nothing else to do&quot; or try to find support from the people that use the development tools we create on a daily basis that allows to work on new features for said tools sooner rather than later. And although it would be awesome if a single company would approach us with &quot;Hey, we would really like to pay the whole development of these more sophisticated code coverage metrics in Xdebug and PHP_CodeCoverage!&quot; we realise that this is highly unlikely. A platform such as Pledgie, where many individuals can pledge small (and not so small :-) amounts of money could be the solution we are looking for.&lt;br /&gt;
&lt;br /&gt;
Derick&#039;s &lt;a href=&quot;http://pledgie.com/campaigns/14641&quot;&gt;first campain for Xdebug&lt;/a&gt; is about a bugfix. And at first glance it might seem rather odd to &quot;demand&quot; money for fixing a bug. As is the case with most complex issues, having a closer look usually clears things up. So what has happened? Xdebug&#039;s &lt;a href=&quot;http://xdebug.org/docs/profiler&quot;&gt;profiling functionality&lt;/a&gt; can dump its information in a format that can be processed and visualized with a tool called &lt;a href=&quot;http://kcachegrind.sourceforge.net/&quot;&gt;KCacheGrind&lt;/a&gt;. At the time when Derick implemented this functionality, the data file format used by KCacheGrind was not (well) documented so he had to reverse engineer it. In that process he overlooked the fact that KCacheGrind expects information that he did not provide (namely the &lt;code&gt;&quot;cfl=&quot;&lt;/code&gt; lines that tell KCacheGrind the target of a function or method call). Versions of KCacheGrind prior to the current one used a too relaxed merging of symbols and so it appeared that there was nothing wrong with the data written by Xdebug. Current versions of KCacheGrind, however, are more strict and expect the aforementioned &lt;code&gt;&quot;cfl=&quot;&lt;/code&gt; lines. Without them the visualization of Xdebug profiling information is useless. I noticed this last week and talked to Derick about it. Apparently others had experienced the same issue but he had not had any time yet to investigate it because he is, just like I am, too busy with paid work. Only half-jokingly I told him on Twitter to try Pledgie for this and promised him to pledge money for this if he did (I really need KCacheGrind to work for profiling PHP code). So now you know why we are experimenting with Pledgie at the moment.&lt;br /&gt;
&lt;br /&gt;
With regard to the more sophisticated code coverage metrics that I mentioned in this post our plan is to gather requirements and try to estimate the amount of time needed to implement what we want when I am in London next week. We will keep you posted! 
    </content:encoded>

    <pubDate>Thu, 17 Feb 2011 13:50:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/909-guid.html</guid>
    <category>open source</category>
<category>phpunit</category>
<category>xdebug</category>

</item>
<item>
    <title>PHP Project Wizard</title>
    <link>http://sebastian-bergmann.de/archives/908-PHP-Project-Wizard.html</link>
            <category>Projects</category>
    
    <comments>http://sebastian-bergmann.de/archives/908-PHP-Project-Wizard.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=908</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=908</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Hot on the heels of the &lt;a href=&quot;http://sebastian-bergmann.de/archives/907-Template-for-Jenkins-Jobs-for-PHP-Projects.html&quot;&gt;Template for Jenkins Jobs for PHP Projects&lt;/a&gt; comes my next new Open Source project: the &lt;a href=&quot;https://github.com/sebastianbergmann/php-project-wizard&quot;&gt;PHP Project Wizard (PPW)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The PHP Project Wizard (PPW) is a commandline tool that can be used to generate the scripts and configuration files necessary for the build automation of a PHP project. Given the location of a project&#039;s directories with sourcecode and tests as well as the project&#039;s name, the PHP Project Wizard generates scripts and configuration files necessary for build automation using &lt;a href=&quot;http://ant.apache.org/&quot;&gt;Apache Ant&lt;/a&gt;.&lt;/p&gt;&lt;dl&gt;&lt;dd&gt;&lt;pre&gt;ppw --source src \
    --tests tests \
    --name myproject

PHP Project Wizard (PPW) 1.0.1 by Sebastian Bergmann.

Wrote build script for Apache Ant to build.xml
Wrote build configuration for Apache Ant to build.properties
Wrote configuration for PHPUnit to phpunit.xml.dist&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;The artifacts produced by the build are exactly what the &lt;a href=&quot;http://jenkins-php.org/&quot;&gt;template for Jenkins jobs for PHP projects&lt;/a&gt; expects.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 06 Feb 2011 13:00:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/908-guid.html</guid>
    <category>build automation</category>
<category>php</category>

</item>
<item>
    <title>Template for Jenkins Jobs for PHP Projects</title>
    <link>http://sebastian-bergmann.de/archives/907-Template-for-Jenkins-Jobs-for-PHP-Projects.html</link>
            <category>Projects</category>
    
    <comments>http://sebastian-bergmann.de/archives/907-Template-for-Jenkins-Jobs-for-PHP-Projects.html#comments</comments>
    <wfw:comment>http://sebastian-bergmann.de/wfwcomment.php?cid=907</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://sebastian-bergmann.de/rss.php?version=2.0&amp;type=comments&amp;cid=907</wfw:commentRss>
    

    <author>nospam@example.com (Sebastian Bergmann)</author>
    <content:encoded>
    &lt;p&gt;Most web applications are changed and adapted quite frequently and quickly. Their environment, for example the size and the behaviour of the user base, are constantly changing. What was sufficient yesterday can be insufficient today. Especially in a web environment it is important to monitor and continuously improve the internal quality not only when developing, but also when maintaining the software.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; is the leading open-source &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;continuous integration&lt;/a&gt; server. Thanks to its thriving plugin ecosystem, it supports building and testing virtually any project. The goal of my newest open-source project, the &lt;a href=&quot;http://jenkins-php.org/&quot;&gt;Template for Jenkins Jobs for PHP Projects&lt;/a&gt;, is to provide a standard template for Jenkins jobs for PHP projects.&lt;/p&gt;&lt;p&gt;By the way: &lt;a href=&quot;http://thePHP.cc/&quot; title=&quot;The PHP Consulting Company (thePHP.cc)&quot;&gt;thePHP.cc&lt;/a&gt; offers consulting and training that set you on a path to create, maintain and extend sustainable software of high quality with PHP and leverage Jenkins to monitor the various aspects of software quality.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 04 Feb 2011 09:30:00 +0100</pubDate>
    <guid isPermaLink="false">http://sebastian-bergmann.de/archives/907-guid.html</guid>
    <category>continuous integration</category>
<category>hudson</category>
<category>jenkins</category>
<category>php</category>

</item>

</channel>
</rss>
