Dienstag, 11. August 2015

Die 10 besten Eclipse-Plugins


Für das Eclipse-Ökosystem gibt es eine unendliche Fülle an Plugins.
Hier meine zehn Favoriten ohne die ich nicht mehr arbeiten könnte:


1. EGit - Git Team Provider

EGit ist ein Source Code Versioning Tool für Git. Das EGit-Projekt implementiert die Eclipse-Tools auf Basis von JGit, einer Java-Implementierung von Git.

https://marketplace.eclipse.org/content/egit-git-team-provider
 
EGit History
EGit Staging View


2. MoreUnit

MoreUnit ist ein Eclipse-Plugin welches das Schreiben von Unit-Tests in Java vereinfacht.

https://marketplace.eclipse.org/content/moreunit

Markierung von Klassen mit Unit-Tests

Markierung von Methoden mit Unit-Tests

Einfaches Hin-und-Her wechseln zwischen Test und Implementierung
 

3. EclEmma - Java Code Coverage

EclEmma ist ein Code-Coverage-Tool für Eclipse. Es ermöglicht das einfache Überprüfen der Code-Coverage-Rate von Unit-Tests.

https://marketplace.eclipse.org/content/eclemma-java-code-coverage

Code-Coverage-Ansicht


4. TM Terminal

Ein vollständiges Terminal in Eclipse. Auch unter Windows!

https://marketplace.eclipse.org/content/tm-terminal 


Linux SSH-Terminal

Windows PowerShell

5. Checkstyle

Das Checkstyle-Plugin integriert das gleichnamige Tool für statische Source-Code-Analyse in Eclipse.

https://marketplace.eclipse.org/content/checkstyle-plug

Checkstyle-Annotationen

6. Findbugs

Findbugs ist ebenfalls ein Tool für statische Source-Code-Analyse. Das Plugin integriert dieses Tool in Eclipse.

https://marketplace.eclipse.org/content/findbugs-eclipse-plugin

Findbugs Workflow

Mylyn Builds Connector for Hudson/Jenkins adds View to review, start builds in CI server. - See more at: http://marketplace.eclipse.org/content/hudsonjenkins-mylyn-builds-connector#sthash.Rq1r8Sms.dpuf

7. Eclipse Code Recommenders

Eclipse Code Recommenders hilft bei der Code Completion indem es zeigt wie andere Entwickler dasselbe API verwendet haben.

http://marketplace.eclipse.org/content/eclipse-code-recommenders

Komplettierung von Methoden-Aufrufen

Chaining von Methoden

8. InstaSearch

Ermöglicht die Live-Suche im kompletten Project-Source-Code.

http://marketplace.eclipse.org/content/instasearch

Live-Suche

9.  Log Viewer

Eine einfache, aber extrem nützliche View um externe Logfiles anzuzeigen.

http://marketplace.eclipse.org/content/logviewer

 
Externes Log File


10. Properties Editor

Ein Editor für "*.properties" Dateien. Handhabt das automatische Encoding von Unicode-Characters.

This editor can directly edit property files written in Unicode reference characters, and saves the time and effort of converting into Unicode through native2ascii. In addition to the usual functions of an editor, the plugin is integrated with Eclipse. Files can be opened in the IDE and saved in Unicode. It can use by intuitive and simple operation. - See more at: http://marketplace.eclipse.org/content/properties-editor#sthash.L4Rq0QXR.dpuf
This editor can directly edit property files written in Unicode reference characters, and saves the time and effort of converting into Unicode through native2ascii. In addition to the usual functions of an editor, the plugin is integrated with Eclipse. Files can be opened in the IDE and saved in Unicode. It can use by intuitive and simple operation. - See more at: http://marketplace.eclipse.org/content/properties-editor#sthash.L4Rq0QXR.dpuf
This editor can directly edit property files written in Unicode reference characters, and saves the time and effort of converting into Unicode through native2ascii. In addition to the usual functions of an editor, the plugin is integrated with Eclipse. Files can be opened in the IDE and saved in Unicode. It can use by intuitive and simple operation. - See more at: http://marketplace.eclipse.org/content/properties-editor#sthash.L4Rq0QXR.dpuf
http://marketplace.eclipse.org/content/properties-editor


Properties-Datei mit Sonderzeichen

Weitere erwähnenswerte Plugins 


Gibt es noch weitere erwähnenswerte Plugins? Feedback würde mich interessieren.

Weitere Kandidaten:

Donnerstag, 9. Juli 2015

Buchabos mit Safari Books Online

Safari Books Online ist eine digitale Bibliothek mit einer grossen Auswahl an Fachbüchern, Konferenz-Videos und Manuskripten. Die Bibliothek umfasst ca. 30'000 Titel. Es sind alle prominenten IT-Fachverlage vertreten wie zum Beispiel O'Reilly Media, Addison-Wesley, Prentice Hall, Manning Publications.
Die Firma wurde 2001 als Join-Venture von Pearson Technology Group und O'Reilly Media gegründet. 2014 wurde Safari Books Online dann komplett von O'Reilly Media übernommen.

Vor etwa einem Jahr begann die Firma ihren überarbeiteten Dienst, genannt "Safari", anzupreisen. Der neue Dienst erschien im neuen Erscheinungsbild und mit verbesserten Mobile-Apps.
Das 1-Jahr-Jubiläum nutze ich, um hier den neuen Dienst vorzustellen.

Web Applikation

Die überarbeitete Web-Applikation erscheint neu in gold-weiss.
Es gibt nur eine Login-Seite, welche einem je nach Account entweder zur alten oder neuen Version weiterleitet.


Dashboard

Nach dem Login präsentiert sich ein schickes Dashboard mit Übersicht über die eigenen Bücher, neue Titel und Empfehlungen.
Ein Klick auf ein Buch-Cover öffnet wie erwartet die Detailansicht des Buches.



Katalog & Katalogsuche

Der Buchkatalog ist unter dem Navigationseintrag "Topics" zugänglich. Die Buchtitel sind hier nach Kategorie angeordnet.
Die Suche rechts oben ist auf fast allen Ansichten präsent. Während der Eingabe werden einem bereits passende Titel im Popup präsentiert. Mit der Enter-Taste springt man zur Resultatliste.
In den Resultaten werden sowohl Buchtitel als auch Kapitel mit passenden Inhalten angezeigt.



Listen & Buch lesen

Mit einem Klick auf "Start Reading" kann man mit dem Lesen beginnen.
Man kann das Buch auch durch Klick auf "Add to Queue" zu seiner persönlichen Liste hinzufügen.
Im Unterschied zum früheren "Safari Books Online" kann man nicht mehrere benannte Listen erstellen.
Im älteren Service gab es verschiedene Abonnementsarten: 5-Titel, 10-Titel und unbeschränkt. Mit dem 5-Titel-Abo durfte man nur 5 Bücher "gleichzeitig" in seiner Leseliste haben. Zur Vereinfachung der Abos passt auch der Wegfall der zusätzlichen Listen.

Das Lesen eines Buches im Web-Browser ist komfortabel.
Für die Schriftgrösse gibt es zwei Variante "klein" und "normal". Eine Vollbild-Ansicht gibt es nicht.
Manche Leute können es sich nicht vorstellen im Browser ein Buch zu lesen, doch ich finde es ziemlich angenehm.









iPad App

Der Aufbau der iPad ist neu sehr simpel.
Auf der linken Seite hat man seine Queue. Hell dargestellte Bücher sind offline gespeichert. Schattierte Bücher werden mit einem Klick geladen.











Die Beschränkung auf maximal drei Offline-Bücher entfällt mit der neuen App.
Eine gute Entscheidung!

Für das Lesen auf dem iPad gibt es etwas mehr Optionen als im Web-Browser.
Es gibt einen invertierten Schwarz-Weiss-Modus, der für das Lesen im Dunkeln interessant sein könnte. Für die Schriftgrösse gibt es fünf Varianten.
In der Leseansicht ist das Inhaltsverzeichnis mit einem Klick stets verfügbar.

Empfehlung

Ich bin absolut begeistert vom neuen "Safari". Die iPad-App behebt alle bisherigen Schwächen und das neue Erscheinungsbild wirkt aufgeräumt und modern.
Für mich ist eine überall verfügbare digitale Bibliothek von grossem Wert. Der Preis für den Dienst ist neu $39 pro Monat oder $199 pro Jahr. Der Link zum Angebot.

Donnerstag, 25. Juni 2015

Eclipse Mars - Die besten neuen Features


Gestern ist das neuste Release von Eclipse erschienen: Mars.

Nach dem Vorbild von Ian Bull möchte ich meine persönlichen Highlights der neuen Eclipse-Version vorstellen.


1. Eclipse als Mac OS X Bundle

Eclipse sieht endlich auch im Finder aus wie jede andere Applikation und fühlt sich auch so an. Die Installation ist dadurch auch etwas handlicher geworden.



2. Geschwindigkeitsverbesserungen


Textsuche
Die Textsuche wurde für die Workspace-Suche auf Multicore-PCs um Faktor 3 bis 4 beschleunigt.

Standard Maximum Heap Size 1024M
Damit soll sich Eclipse standardmässig besser verhalten auf moderner Hardware.
Auch die initiale Grösse wurde von 40 auf 256M vergrössert.

Ein Ausführlicher Artikel von Zeroturnaround zu den Performance-Verbesserungen: http://zeroturnaround.com/rebellabs/performance-improvements-in-eclipse-mars/


3. Verbesserungen der Console


  • Neuer Befehl 'Terminate/Disconnect All'
  • Zeilenumbrüche in der Konsole!
  • Automatischer Scroll Lock: Sobald man anfängt zu scrollen wird der Scroll Lock nun automatisch aktiviert. Wenn man wieder ans Ende scrollt, wird der Lock wieder deaktiviert.


  • Die künstliche Buffer-Limite von 1 Mio Zeilen wurde entfernt. Die Konsole zeigt soviele Zeichen an wie die View rendern kann. Dazu muss das Häckchen bei "Limit console output" entfernt werden.


Weitere Verbesserungen der Platform: https://www.eclipse.org/eclipse/news/4.5/platform.php


4. Verbesserter Rename-Dialog

Standardmässig wird nun der Dateiname ohne Endung selektiert.



5. Verbesserter "Open With..." dialog

Neu kann eine Einstellung gespeichert werden um bestimmte Dateiendungen immer mit demselben Editor zu öffnen.




6. Error Reporting


Falls irgendwo in der IDE ein Fehler auftritt der nicht abgefangen wird, so bietet sich dem Benutzer nun eine einfache Möglichkeit den Entwicklern Details zu diesem Fehler zukommen zu lassen.



Fehlerdialog

Fehler wurde geloggt


Fehlerreport wurde versendet

Webansicht des Fehlerreports


7. Docker Support


Das Linux Tools Projekt enthält nun Unterstützung für Docker!
Man kann sich die verfügbaren Images auflisten, Container starten und stoppen.
Es funktioniert natürlich auch mit Boot2Docker!



Montag, 15. Juni 2015

Update Super League Scorer-Analyse

Zum Abschluss der Fussball-Rückrunde in der Schweizer Super League folgt ein Update der Torjäger-Statistik.

Nach dem Ende der Hinrunde hatte ich eine solche Analyse bereits einmal durchgeführt.
Neu wurde die Mindestanzahl erzielter Tore auf 7 angesetzt, damit qualifizieren sich 19 Spieler.



Effizientester Spieler
Goran Karanovic: 2.1 Schüsse pro Tor

Chancenreichster Spieler
Dario Lezcano: 26.6 Spielminuten pro Schuss

Aufsteiger der Rückrunde
Goran Karanovic +231% Effizienz in Schüsse pro Tor

Moussa Konaté +28% Torschüsse pro Spielminute

Absteiger der Rückrunde
Yannis Tafer -35% Schüsse pro Tor
Yassine Chikhaoui -21% Torschüsse pro Spielminute

Freitag, 29. Mai 2015

OSX-Notification beim Abbruch von SSH-Tunnel

Ein kleiner Trick wie man das Abbrechen eines SSH-Tunnels schneller bemerken kann.
Das kann beispielsweise praktisch sein, wenn man im Hintergrund einen SSH-Tunnel offen hat den man für Arbeiten im Vordergrund braucht.


Dazu folgenden Befehl ausführen:

ssh -N -L 80:localhost:80 serverx; terminal-notifier -message "SSH-Tunnel beendet"


Syntaktisch sind das bloss zwei nacheinander ausgeführte Shell-Befehle, die mit Semikolon ";" getrennt werden.

Mit Hilfe des Tools terminal-notififier kann man unter Mac OS X aus der Shell Notifications erzeugen.
Es lässt sich am Einfachsten per homebrew installieren.

terminal-notifier versteht noch einige zusätzliche Parameter:
  • -title Setzt den Titel
  • -subtitle Setzt einen Untertitel
  • -group Definiert eine Gruppen-ID
  • -open Öffnet beim Klick eine URL
  • -execute Führt beim Klick ein Shell-Kommando aus

Die Option "execute" liesse sich zum Beispiel nutzen um beim Klick auf die Notification gleich wieder eine neue SSH-Verbindung aufzubauen.

Dienstag, 19. Mai 2015

JSON Formatierung mit TextWranger

Im Rahmen der Arbeit mit REST APIs habe ich in letzter Zeit öfters mit JSON-Output zu tun gehabt.
Da ist es praktisch, wenn der Output bereits schön formatiert ist. Mit "schön" bezeichne ich JSON das richtig eingerückt ist.
Wenn der Output nicht schön eingerückt ist, so kann dies mit Text Wrangler leicht gelöst werden.

Dafür habe ich das Python-Script von Steve Windsberg neu in Ruby implementiert.
Als Bonus werden in dieser Implementierung die Keys nicht umsortiert sondern bleiben in der vorgegebenen Reihenfolge.

JSON Formatierung mit TextWrangler

Die Ruby implementierung ist kurz, sehr kurz.

require 'json'
data = ARGF.read
json = JSON.parse(data)
puts JSON.pretty_generate(json)


Das Script muss in ~/Library/Application Support/TextWrangler/Text Filters platziert werden und Zugriffsrechte für Execute (chmod u+x) haben.

Ein kleines Installer-Package als Download (2.8 KB) erledigt die Installation gleich komplett.

Montag, 11. Mai 2015

Programmierung eines Lightroom Plugins mit Lua

Motivation

In meinen letzten Ferien habe ich einige Time-Lapse-Videos erstellt.
Dazu habe ich meist iStopMotion verwendet. Es wird zwar nicht ausdrücklich dafür beworben, doch es erfüllt den Zweck. Man kann Fotos importieren, die Bild-Rate wählen und das Resultat dann als Video rendern.
Es gibt zwar noch Alternativen wie LRTimelapse (99 EUR) die viele nette Features bringen, doch die Bedienung und der Workflow wirken etwas umständlich.
Wenn es nur darum geht eine erste Ansicht eines Video zu erstellen wäre es schön, wenn es einfacher wäre.

Deshalb habe ich mich entschieden ein eigenes kleines Plugin namens "Video Renderer" für Adobe Photoshop Lightroom® zu schreiben.

Meine Anforderungen sind vorerst ziemlich eingeschränkt:
- Rendern eines Filmes aus einer Sequenz von Fotos in Lightroom unter Mac OS X
- Codec: H264, Bild-Rate 30fps
- Bild-Grösse 1080p

Das Resultat steht auf Github kostenlos zum Download zur Verfügung.
Das Binary und der Source-Code stehen können unter der MIT Lizenz genutzt werden.

Vorgehen zur Entwicklung eines solchen Plugins.


1. Erkunden des SDKs

Das SDK steht bei Adobe als Download (8MB) zur Verfügung.
Das API ist in Lua geschrieben. Dies bedeutet dass Plugins grundsätzlich auch in Lua programmiert werden müssen.
Natürlich kann man mit Lua externe Prozesse starten und dies ist auch möglich in Lightroom Plugins. Somit können beliebige externe Tools eingebunden werden.

Das SDK wird begleitet von einem ausführlichem Programmers Guide als PDF und einer HTML-Basierten API-Referenz. Für alle der verschiedenen Plugin-Typen gibt es ein ausführliches Beispiel mit komplettem Programm-Code.

Grundsätzlich sind diese Features in Lightroom erweiterbar:

  • Befehle im Menu "Library", "Help" und "Export"
  • Export- und Publish-Dienste
  • Metadaten-Felder
  • HTML Web-Engine für Fotogalerien

Es gibt sowohl ein Lightroom Users Forum als auch ein Lightroom SDK Forum. Auf der Website des SDK wird aber leider nur auf das User Forum verlinkt.
Der Typ "Export-Service" scheint für meine Zwecke zu passen.

Die Verwendung des Plugins stelle ich mir etwa so vor:
  1. Fotos aus Lightroom-Katalog selektieren und exportieren.
  2. Im Export-Dialog das Plugin "Video Renderer" wählen und die Render-Parameter wählen.
  3. Button "Exportieren" anklicken und ein paar Sekunden warten.
2. Plugin implementieren

Eine einfache Möglichkeit um Bildsequenzen zu rendern, ist die Open-Source Software ffmpeg.
Der Render-Befehl damit in Lua so aus:

local ffmpegPath = LrPathUtils.child(_PLUGIN.path, "ffmpeg")
local outputPath = exportParams.LR_export_destinationPathPrefix
local outputFile = exportParams.filename
local command = string.format("\"%s\" -y -i %s/\%05d.jpg -c:v libx264 -r 30 -vf scale=-1:1080 -pix_fmt yuv420p \"%s/%s\"", 
ffmpegPath, outputPath, outputPath, outputFile)
result = LrTasks.execute(command)

LrPathUtils und LrTasks sind Teil des Lightroom SDKs.

Für das Rendern muss ich mit dem Plugin eine Version von ffmpeg mitliefern. Da ich momentan nur OS X unterstützen möchte, ist das relativ einfach. Ich besorge mir hier ein statisches Binary für Mac OS X 64-bit Intel.

Der Export-Dialog in Lightroom kann mit einigen Zeilen Lua definiert werden:

exportServiceProvider.sectionsForBottomOfDialog = function ( f, propertyTable )
local LrView = import 'LrView'
local bind = LrView.bind
local share = LrView.share
local result = {
{
title = LOC "$$$/VideoRenderer/ExportDialog/VideoSettings=Render Settings",
synopsis = bind { key = 'fullPath', object = propertyTable },
f:row {
f:static_text {
title = LOC "$$$/VideoRenderer/ExportDialog/FileName=File Name:",
alignment = 'right',
width = share 'leftLabel',
},
f:edit_field {
value = bind 'filename',
truncation = 'middle',
immediate = true,
fill_horizontal = 1,
},
}
}
}
return result
end

Schlussendlich sieht der Export-Dialog mit ein paar Erweiterung dann so aus:



3. Plugin testen

Für Lua gibt es einige Tools die Unit-Testing bzw. auch BDD-Testing ermöglichen. Am besten gefallen hat mit busted von Olivine-Labs.
Leider ist es etwas aufwändig für das Lightroom SDK ein Test-Harness zu erstellen, deshalb gibt es vorerst noch keine automatischen Tests für mein Plugin.
Ich nehme mir vor für die nächste Version das Rendern automatisiert zu testen.

4. Installer und Disk-Image erstellen

Das XCode-Tool pkgbuild ermöglich es, mit der Kommandozeile Pkg-Archive zu erstellen die sich mit dem OSX-Installer installieren lassen.

pkgbuild --identifier ch.andyhermann.videorenderer --install-location ~/Library/Application\ Support/Adobe/Lightroom/Modules/ --root plugin_src plugin.pkg

Leider erscheint ohne signieren des Packages eine Warnung beim Öffnen. Damit muss ich vorerst leben.

Unsigniertes Installer-Package


Das Verbreiten von Software für Mac OS X wird traditionell mit Disk-Images gemacht.
Auch dafür gibt es ein CLI-Tool namens hdituil dass sich einfach einbinden lässt:

hdiutil create "target/VideoRenderer.dmg" -volname "Video Renderer" -srcfolder "target/disk_image"

Natürlich soll der Build alle Schritte automatisiert durchführen. Mangels einfacher Alternativen für lua benutze ich dafür rake.

5. Plugin veröffentlichen

Ich nutze das Release-Feature von Github für ein einfaches Hosting der Dateien.
Die neuste Version des Plugins ist hier verfügbar.

Resultat eines einfachen Timelapse-Videos





Natürlich fehlen dem Plugin viele wichtige Features wie Deflickering, Stabilization, Ken-Burns etc.
Doch die Bedienung ist dafür ziemlich simpel.

Ich bin gespannt auf Feedback. Ist das Plugin nützlich für irgend jemanden?

Source Code des Projekts:
https://github.com/andreashermann/VideoRenderer

Montag, 4. Mai 2015

Highlights der Spring I/O Barcelona

Die zwei Tage Spring I/O in Barcelona waren vollgepackt mit meist interessanten Vorträgen von Rednern der Spring-Community aus der ganzen Welt. Gewisse Themen waren sehr prominent vertreten und wurden überall "gehyped".
Es folgt eine Übersicht meiner favorisierten Buzz-Words.

Völlig unumstritten waren Microservices das meist erwähnte Thema der Spring I/O. Netflix ist dabei das Vorzeige-Exemplar unter den Firmen welche Software nach diesem Architekturstil entwickeln. David Syer gab einen Vortrag über den Open-Source-Stack des amerikanischen Streaming-Giganten. Dazu erwähnte er im Schnellgang einige Tools, welche den Betrieb von Microservices vereinfachen.
Beispielsweise:


Spring Boot ist die Technologie, zu welcher es an der Konferenz die meisten Talks gab. Das relativ junge Spring-Produkt ermöglicht es, mit wenig Code neue Applikationen zu entwickeln und zu deployen. Der Clou bei Spring Boot ist die automatische Konfiguration der Module. Ein Spring-Boot-Modul muss nur als Abhängigkeit eingebunden werden. Es bringt bereits selbst eine sinnvolle Konfiguration mit.
Spring Boot ist ausserdem perfekt geeignet für den Einsatz mit Docker. Es ermöglicht das Erzeugen eines startbaren JARs inklusive aller Abhängigkeiten wie auch z.B. Embedded Tomcat oder Undertow.

Josh Long gab einen unterhaltsamen Talk mit dem Titel How to build 'Bootiful' applications with Spring Boot. Prägnant formulierte er das Motto: "Make jar, not war". Mit Groovy schrieb er einen winzigen Demo-Service der sogar in einen Tweet passte.
Auf der URL http://start.spring.io bietet Pivotal, die neue Firma hinter Spring, einen Projekt-Generator der hilft die passenden Maven- oder Gradle-Konfigurationen zu erstellen. Die Website ist sogar optimiert für curl!
Welche Vereinfachungen Spring Boot für den Betrieb bieten, vermittelte Nicolas Fränkel im Vortrag Spring Boot for Devops. Jede Spring-Komponente registriert seine Metrics und Health-Status automatisch. Ein Rest-API ermöglicht das andocken von existierenden Monitoring-Tools wie zum Beispiel Graphite. Als Implementierung wird die bewährte Dropwizard-Metrics Library verwendet.

start.spring.io with curl


Alvaro Sanchez-Mariscal erklärte Lösungen für Stateless Authentication. Einerseits zeigte er dass es mit OAuth2 einen verbesserten Standard gibt, der in seiner Funktionsweise relativ leicht verständlich ist. Andererseits vermittelte er die Konzepte von JSON Web Tokens, einem Standardformat für Tokens mit OAuth2.

Ray Tsang von Google demonstrierte in seinem Talk wie man mit Kubernetes seine Docker-Container orchestrieren kann. Er demonstrierte auch das neue UI. Google arbeitet aktuell an einem Container-Service Google Container Engine, welcher auf Kubernetes basiert.

Kubernetes UI


Sehr aufschlussreich war der Vortrag von Sébastien Deleuze über Isomorphic Templating. Es ermöglich das Verwenden der gleichen Templates für das Rendern auf dem Server und dem Client. Was erst etwas weit hergeholt erscheint für normale Web-Applikationen, hat in der Anwendung für grosse Websites mit viel Inhalt durchaus seine Berechtigung.
Die Technik kann die initiale Ladezeit von Mobil-Applikationen etwa um einen Faktor Fünf verringern. Sie vereinfacht auch die Zugänglichkeit für Suchmaschinen, was für manche Zwecke auch wichtig sein kann. 
Sébastien demonstrierte eine Implementierung auf Basis von der Nashorn und React.

Wer Big Data betreibt, findet mit Spring XD eine Platform für Entwicklung und Betrieb. Sie baut auf Spring Integration auf und wird als Alternative zu Frameworks wie Storm, Flume, Oozie oder Sqoop bezeichnet. 
Die Runtime bietet Stream Processing, Batch Workflows, Analytics und einen Message Bus.
Natürlich bringt die Platform bereits komfortable Management-Tools mit, die den Betrieb vereinfachen.
Spring XD

Neben den Vorträgen fanden auch Workshops zu verwandten Themen statt. Dort gab es die Gelegenheit die Themen in der Praxis zu vertiefen.
Ingesamt fand ich die Spring I/O extrem interessant und kann einen Besuch sehr empfehlen. Ob die Konferenz nächstes Jahr wieder stattfindet ist noch nicht gesichert.