Development Environments with Vagrant and Puppet

Motivation

Setting up the infrastructure for new projects can be quite a pain in the ***. Even after the initial setup is done, adding new developers to the team requires a lot of time. Besides explaining the project to the new team member, the project’s development environment has to be installed on the new developer’s computer. This includes setting up virtual machines, web- and database-servers, updating libraries etc.

Many IT companies use the same technologies repeatedly which leaves them with multiple development environments that look very similar but have been set up separately. This problem can be solved by using a configuration management software and a smart tool for handling virtual machines.

Weiterlesen

Mayflower and Symfony2

Two weeks ago, I had the chance to attend Symfony Live 2012 in Berlin. At first, I tried to get a ticket by submitting several proposals for talks. This didn’t work out but the organizers were very kind and invited me to attend the conference for free!

A couple of days later, I read about the Symfony2 Framework Certification. I had passed some certifications before (namely Zend Certified Engineer PHP5.3, Oracle Certified Professional (OCP), MySQL 5 Developer, and Scrum Product Owner Certification) and thought this might be a good chance to deepen my Symfony2 knowledge. Mayflower’s reaction to my wish was very positive. In they end, Mayflower covered the certification fee and gave me the chance to be the company’s first Symfony2 Certified Developer.
Weiterlesen

Image similarity search with LIRE

Content-based image similarity search — determining the images in a database visually similar to a search image on the basis of pixel data alone — is a hot topic. Applications are numerous. Just recently, amazon.com has introduced a visual product similarity search for some products, and google has introduced a search-by-image feature.

In addition to hands-on applications, there is a lot of research on the topic. The abilities of university maintained image search engines grow constantly. Unfortunately, implementing current techniques requires a bunch of specialist knowledge and some mathematical sophistication. Fortunately, however, there are effective simple techniques for which there exist open source libraries.

One such library for JAVA is the LIRE API. In this short article, I demonstrate how to implement a basic linear content-based visual image similarity search using this library. Weiterlesen

Symfony2: Bundle your libraries!

In vielen Software-Projekten kommen Entwickler irgendwann an einen Punkt, an dem Funktionalität implementiert wird, die in anderen Projekten wiederverwendet werden können soll. Nachdem ich in der jüngeren Vergangenheit von mehreren Kollegen gefragt wurde, wie man dies in Symfony2-Projekten bewerkstelligen kann, wollte ich schriftlich eine Zusammenfassung der wichtigsten Punkte bereitstellen. Das Resultat ist dieser Blog-Artikel, der eine Schritt-für-Schritt-Anleitung enthält, wie man wiederverwendbaren Code kapselt und in einem eigenen Symfony2-Bundle bereitstellt.

Das Wissen, welches ich hier verpacke, habe ich teils aus der Symfony2-Dokumentation, teils aus der Erfahrung, welche ich in den letzten Jahren in Symfony2-Projekten gesammelt habe. Nachdem ich des Öfteren Library-Code aus Projekten ausgelagert hatte, konnte ich einige Patterns identifizieren und vor allem feststellen, dass diese Vorgehensweisen in Symfony2-Projekten (abgesehen von syntaktischen Eigenheiten) denen in beliebigen anderen Umgebungen sehr stark ähneln.

Die folgende Liste ist als Template zu verstehen, welches in einfachen Projekten genau so verwendet werden kann, in komplexeren jedoch wahrscheinlich erweitert werden muss. Weiterlesen

oTranCe – Die Übersetzungsplattform für mehrsprachige Anwendungen

Online-Shops oder Webseiten werden aufgrund der internationalen Erreichbarkeit des Internets in mehreren Sprachen erstellt. Leider übersetzen sich die Systemtexte bis heute noch nicht von alleine in die verschiedenen Sprachen und müssen deshalb von Sprachexperten übersetzt werden. In der Regel werden Sprachdateien in Textform im Projektverzeichnis auf dem Server über Versionierungssysteme abgelegt. Dem Übersetzer fehlt das technische Know-How und der Überblick über das Projekt. Der Entwickler spricht in der Regel nicht 27 Sprachen fließend. An dieser Stelle entsteht also die Kluft zwischen Entwicklern und Übersetzern. Die Lücke versucht oTrance zu schließen.

Was verbirgt sich hinter dem Projekt oTranCe? Die Übersetzungsplattform (Online Translation Center) bietet den Übersetzern einer Applikation die Möglichkeit ohne große technische Kenntnisse in einem Browser mit maximalem Komfort zu arbeiten.

Durch ein ausgeklügeltes Rechte und Rollensystem können viele Übersetzer gleichzeitig an einem Projekt arbeiten. „Offene Übersetzungslücken werden angezeigt und können direkt in der Weboberfläche abgearbeitet und gespeichert werden“, so Daniel Schlichtholz der Erfinder von oTranCe. Als kleines Highlight der Software lässt sich erwähnen, dass man die Änderungen direkt über ein Versionierungssystem (SVN) veröffentlichen kann. Sie können sich auch selbst einen Überblick über die Featurelist von oTranCe machen.

Das Projekt oTranCe ist unter der GNU Public Licence veröffentlicht und kann kostenfrei eingesetzt werden. Dennoch freut sich das Entwicklerteam immer über einen kleine Anerkennung, um sein Projekt auch in Zukunft mit der selben Energie fortzuführen. Einen guten Eindruck macht auch das bereitgestellte Demosystem auf der Website.

Daniel Schlichtholz arbeitet als Entwickler bei Mayflower und betreibt das Projekt oTranCe seit August 2011. Das Unternehmen Mayflower unterstützt Open Source Software aktiv. Auf Nachfrage erhalten die angestellten Enwickler ein Pensum an Arbeitszeit, um solche Projekte voranzutreiben und weiterzuentwickeln.

oTranCe wird von Mayflower bei diversen Kundenprojekten eingesetzt. So wurde die Internationalisierung des Online-Shops von Steinigke mit Hilfe des Sprachlabors übersetzt.

Falls Sie Interesse an spezifischen Anpassungen und Einsatzmöglichkeiten von oTranCe für für ihre Webandwendung haben, können Sie sich jederzeit an Mayflower wenden.

Webinar „OpenSource – Chancenreiche Zeitbombe“

Am 14.02.2012 startet um 14:00 Uhr die Webinarreihe der Mayflower GmbH in eine neue Runde.
Es erwartet Sie gleich zum Start in das neue Jahr ein Webinar mit hochkarätigen Referenten.

Björn Schotte, Geschäftsführer Marketing & Sales bei der Mayflower GmbH und
Chan-jo Jun, Rechtsanwalt und Fachanwalt IT-Recht von der Rechtsanwaltskanzlei Jun sind die ersten Referenten in diesem Jahr.

Ob Handy, Fernseher oder Auto -kaum ein Gerät kommt ohne OpenSource-Software aus. Was für viele schlicht Gratissoftware war, entwickelt sich für manche Hersteller im Anbetracht der inzwischen ergangenen Urteile zum unkalkulierbaren Haftungsrisiko. Sowohl Hersteller als auch Einkäufer von Software, haben das Problem erkannt und erhöhen die Anforderungen an die eigenen Entwickler und Zulieferer.

In dem Vortrag zeigen wir auf, welche typischen Fehler regelmäßig beim Umgang mit OpenSource-Software zu Rechtsverstößen führen, beispielsweise die fehlende Übermittlung von Source-Codes und Pflichtangaben, sowie die Verletzung der Copyleft-Bestimmungen. Wir erläutern die verschiedenen Klassen und Gattungen der OpenSource-Lizenzen mit denen sich leicht ein Überblick im Lizenzdschungel erreichen lässt.

Im zweiten Teil zeigen wir auf, wie Unternehmen auf der Auftragnehmer- oder Auftraggeberseite die Einhaltung von OpenSource-Bestimmungen für sich und gegenüber dem Vertragspartner sicherstellen können. Der Vortrag richtet sich sowohl an Entwickler, als auch die juristischen Entscheidungsträger, wie Mitglieder der Rechtsabteilung oder Geschäftsführung, die für Rechts- und Lizenzfragen zuständig sind.

Jetzt gleich kostenlos Anmelden unter:
http://bit.ly/webinar-open-source

16.12. Eine Einführung in Behavior Driven Development

Testdriven Development, also das Schreiben eines oder mehrerer Tests bevor der eigentliche Code entsteht, ist inzwischen ein alter Hut.
Ein großer Nachteil dieses Verfahrens ist, dass im agilen Umfeld die User Stories erst verstanden werden müssen.
Wenn die Story aber falsch verstanden wurde, dann wird auch der Test falsch implementiert.
Knackpunkt ist also immer noch der Abgrund zwischen Analyse und Verdeutlichung der Geschäftsprozesse sowie dem korrekten Erfassen und testen eben jener.
Eine Lösung hierfür soll Behavior Driven Development – kurz BDD – bieten.

Weiterlesen

08.12. Agilere Datenbankentwicklung

Agile Entwicklung ist gescheitert.
Jedenfalls auf Datenbankseite.

Agile Entwicklung ist mehr als nur Scrum, hierzu kommen in den meisten Projekten noch weitere Tools und Vorgehensweisen zum Einsatz, um schnell auf neue Anforderungen zu reagieren.
Hierzu zählen in der eigentlichen Entwicklung Continuous Improvements, also das stetige Verbessern des Quellcode innerhalb eines Projektes, welche zum Beispiel durch Code Reviews und Refactorings unterstützt werden können.

Bedingt durch die sich schnell ändernden Anforderungen ändert sich auch der Code schneller und häufiger.
Um sich dennoch abzusichern, kommen hier Tools wie automatisierte Unittests, ausgeführt Beispielsweise in einer Continuous Integration Umgebung zum Einsatz.

Inzwischen haben viele Projekte zudem erkannt, dass die kurzen Entwicklungszyklen, die mithilfe, eben genannter Techniken möglich werden, entsprechend kurze Releasezyklen erfordern.
Im Idealfall führt dies zu einem Continuous Deployment, also der Fähigkeit ein Feature sofort nach der Fertigstellung zu releasen.

Ein Prozess ist jedoch immer nur so gut, wie seine Teilprozesse.
An dieser Stelle sollten wir unseren Blick auf die Datenbank lenken.

  • Wie läuft hier die Entwicklung?
  • Wie automatisieren wir Datenbankupdates?
  • Was für einen Stand hat unsere Datenbank auf Produktiv? Auf Staging? Auf dem Previewsystem?
  • Wie sichern wir Datenverluste bei nachträglichen Änderungen ab?

Bei uns lief es im Projekt bis vor kurzem so, dass vor einem Update der Datenbank händisch geprüft werden musste welche Änderungen noch nicht in der Datenbank existieren um dann entsprechende SQL Dateien zusammenfügen zu können, die die neuen Änderungen enthielten.
So ein Vorgehen ist nicht nur Fehleranfällig sondern auch Aufwendig.
Am stärksten Bemerkbar machte sich dies, beim migrieren von Daten, was bedeutete, dass die Reihenfolge von SQL Dateien und Migrationsskripten strikt beachtet werden musste.

Refactorings hingegen liefen so ab, dass die neue Datenstruktur in Form von neuen Tabellen angelegt wurde, die Daten mithilfe von Migrationsskripten überführt wurden und die ursprünglichen Tabellen erst beim nächsten Release vollständig gelöscht wurden, sofern dies nicht vergessen wurde.

Dieses Vorgehen kostete viel Zeit und Nerven, weshalb eine Alternative gesucht wurde.

Vor kurzem haben wir als Team ein neues Tool gefunden welches uns viel Arbeit abnimmt und vor allem zusätzliche Sicherheit auf Datenbankseite gibt.

Dies ist Liquibase, ein in Java geschriebenes Tool zum Refactoring und automatischen Update der Datenbank, welches unter der Apache 2.0 Lizenz zur freien Nutzung zur Verfügung steht.

Liquibase bringt eine eigene Beschreibungssprache für Datenbankänderungen mit, die auf XML basiert.
Durch diese abstrakte Beschreibung der Änderungen in XML wird Datenbankunabhängigkeit ermöglicht.
So kann Liquibase mit jeder Datenbank umgehen für die ein JDBC Treiber verfügbar ist, so zum Beispiel MySQL, Microsoft SQL Server, Oracle, PostgreSQL, SQLite, Apache Derby und vielen weiteren.

Definiert werden die Änderungen als sogenannte Changesets, die in beliebiger Anzahl innerhalb eines DatabaseChangelogs vorkommen können.
Jedes Changeset setzt die Angabe eines Autors und einer Id voraus, wobei die Id nur innerhalb des DatabaseChangelogs eindeutig sein muss.

Ein einfaches Changelog, der eine einzelne Tabelle mit 2 Spalten, id und name, anlegt sieht wie folgt aus:


Ausgeführt werden kann dieses Changelog entweder innerhalb eines vorhandenen Buildsystems, hierfür gibt es Tasks in ANT, Maven, Grails, Spring und in Phing als Erweiterung unter https://github.com/bitExpert/liquibase-phing, oder über die Kommandozeile:


Bei diesem Aufruf wird der Treibertyp, in unserem Fall JDBC MySQL, das Verzeichnis des Treibers, der Pfad zum auszuführenden Changelog, sowie URL der Datenbank, Nutzername und Passwort angegeben und der Befehl update, um Liquibase zu veranlassen, dass alle Änderungen eingespielt werden, die noch nicht in der Datenbank sind.
Am Rande sei hier bemerkt, dass der JDBC Treiber für die jeweilige Datenbank nicht Teil von Liquibase ist, ergo separat heruntergeladen werden muss.

Wer sich jetzt fragt, woher Liquibase wissen kann, was bereits in der Datenbank vorhanden ist und was geupdatet werden muss, dem möge folgende kurze Erklärung dienen:
Liquibase speichert in der Tabelle DATABASECHANGELOG Metainformationen zu jedem erfolgtem Update ab.
Hierzu gehört für jedes ausgeführte Changeset der Autor, die Id, das Ausführungsdatum und eine Hashsumme des Changesets.
Die Hashsumme wird bei jedem neuen Update für alle bereits vorhandenen Changesets geprüft, so dass nachträgliche Änderungen an einem bereits ausgeführten Changeset nicht mehr möglich sind.
Es gibt zwar die Möglichkeit mit dem Kommandozeilenbefehl clearChecksums alle Hashsummen zu löschen, jedoch ist die saubere Vorgehensweise bei einem Fehler ein neues Changeset anzulegen, welches den Fehler behebt.

Der größte Vorteil, den man mit echten Changesets gewinnt, sind die Rollbacks.
Für alle Änderungen die neue Tabellen, Spalten oder ähnliches anlegen, oder bestehende Verändern, bietet Liquibase automatische Rollbacks.
Diese werden wichtig, sobald beim updaten etwas schief geht, denn dann wird der Rollback ausgeführt, so dass eine inkonsistente Datenbank verhindert wird.
Jedoch sind die Rollbacks auch in der Entwicklung sehr nützlich, da jederzeit zu einem bestimmten Stand der Datenbank zurück gekehrt werden kann.
Dies ist Changesetabhängig möglich, mit rollbackCount n, welches die letzten n Changesets zurück nimmt, Datumsabhängig mit rollbackDate <date>, welches alle Changesets die neuer als das angegebene Datum sind zurück nimmt und Tag abhängig.
Letzteres kehrt dabei zu einem in Liquibase gesicherten Stand der Datenbank zurück, einem sogenanntem Tag.

Für alle Rollbacks, die nicht mit einem Automatismus abgedeckt werden, kann auch manuell ein Rollback definiert werden.
Dies ist zum Beispiel der Fall wenn das Löschen einer Tabelle fehlschlägt und darauf entsprechend reagiert werden soll.
Das Definieren geschieht innerhalb des entsprechenden Changesets, indem nach der eigentlichen Anweisung eine oder mehrere Rollbackanweisungen geschrieben werden, die alle innerhalb des Tags <rollback> stehen müssen.

In den meisten Teams ist Dokumentation nicht gerade beliebt, jedoch ein notwendiges Übel um neuen Teammitgliedern den Einstieg zu erleichtern und nachvollziehbar zu machen, welche Änderungen wann gemacht wurden.
Auch hier Unterstützt uns Liquibase.
Mit dem Befehl dbDoc und einer nachfolgenden Pfadangabe ist es möglich, eine Dokumentation aller Änderungen zu generieren, die mit dem angegebenen DatabaseChangeLog durchgeführt werden würden.
Die dabei entstehende Änderungsdokumentation ist dabei stark an Java-Doc angelehnt.

Am meisten Zeit bei der Datenbankentwicklung mit Liquibase verschlingt das Schreiben der Changesets.
Zum Glück stellt auch hier Liquibase ein Tool bereit.
Die Methode diffChangeLog generiert anhand der Unterschiede zwischen zwei Datenbanken die entsprechenden Changesets.
Der Kommandozeilenaufruf dazu sieht ähnlich aus, wie beim updaten der Datenbank, jedoch werden zusätzlich die Daten der zweiten Datenbank angegeben, gegen welche geprüft wird:


Die neuen Changesets werden im angegebenen changeLogFile gespeichert.
Dabei werden sowohl Stored Procedures und Functions, als auch Trigger und Check Constraints ignoriert.

Die Unterschiede können mit Liquibase auch zwischen verschiedenen Datenbanksystemen ermittelt werde, beispielsweise einer MySQL und einer SQLite Datenbank.

Auch wenn die Einarbeitung in Liquibase einige Zeit erfordert und vor allem eine Umstellung in der Arbeitsweise, so möchte ich dieses geniale Tool im täglichen Arbeiten nicht mehr missen, da uns als Team damit viele Sorgen und Mehraufwände abgenommen werden.

Piwik Meetup

Piwik MeetupAm Samstag hat in den Räumen der Mayflower GmbH am Standort München das erste Piwik Meetup stattgefunden. Piwik ist eine Open-Source Webanalyse-Software, die im Gegensatz zu Google Analytics heruntergeladen und auf dem eigenen Server installiert werden kann.

Insgesamt sind über 20 Leute erschienen, um den zweiten Platz der am häufigsten eingesetzten Web-Analytics Tools in Deutschland zu feiern und sich gegenseitig auszutauschen. Das Publikum war sehr breit gefächert: vom Anwender bis zum Programmierer – vom User, der seit der ersten Stunde dabei war, wie auch Leute die Piwik erst seit Kurzem einsetzen oder zukünftig einsetzen möchten. Ein Großteil der Teilnehmer kam aus München und Umgebung, einige kamen aber auch vor weiter her, wie z.B. aus Essen, Köln oder Darmstadt. Sogar ein Teil der Piwik Core Entwickler selbst waren anwesend.

Nach einer Vorstellungsrunde ging es los mit den Vorträgen:

Piwik Meetup
Ein Video, welches Teile der Vorträge enthält ist hier verfügbar: http://vimeo.com/30965416

Besonderes Staunen fand die Vorstellung zweier brand-neuer Features welche vermutlich bereits in der nächsten Version enthalten sein werden sowie das anstehende Redesign von piwik.org. Zwischen und nach den Vorträgen wurde sich rege ausgetauscht. Es wurden dabei Ideen zu neuen Funktionen entwickelt, Fragen beantwortet, gegenseitig Hilfe geleistet, Fehler behoben, Datenschutz-Themen disktutiert und vieles mehr. Auch SEO-Optimierung mit Piwik war ein wichtiges Thema.

Wir haben uns sehr gefreut dass die Teilnehmer so interessiert waren. Das hat unsere Vorstellungskraft übertroffen! Daher haben wir uns auch entschieden, dass ein nächstes Piwik Meetup mit Sicherheit wieder statt finden wird.

Mein Dank geht an Mayflower für das Sponsern des Raumes, der Getränke und dem Essen!

Introducing Gigger, a Realtime Javascript Monitoring Framework

Go to Live Demo >>>

 

Monitoring your web application is essential for professional maintenance and development. Especially if you have a high load on your website and you want to keep the current users on your site, you definitely should stay alert for problems
and be able to react fast in case of problems. Monitoring is also crucial for A/B tests, since you have to evaluate somehow which version
of your website performs better. Many big players also measure constantly how much revenue the website produces. For them it is important to monitor if a new
feature increases or decreases the revenue and take decisions based on that information.

Mayflower is currently developing a javascript framework which provides a smart tool for realtime monitoring and measuring. Read the full article for more information.

Weiterlesen