KaffeeKlatsch Das Magazin rund um Software-Entwicklung ISSN 1865-682X 11/2016 Jahrgang 9 KaffeeKlatsch Das Magazin rund um Software-Entwicklung Sie können die elektronische Form des KaffeeKlatschs monatlich, kostenlos und unverbindlich durch eine E-Mail an [email protected] abonnieren. Ihre E-Mail-Adresse wird ausschließlich für den Versand des KaffeeKlatschs verwendet. Editorial Retro ist in! N eulich bin ich auf der Suche nach Weihnachtsgeschenken – so früh vor Weihnachten eigentlich völlig untypisch für mich – erneut auf Nintendos Classic Mini gestoßen. Dieser kleine Kasten versetzte mich sofort wieder in die Vergangenheit, als man mit dieser Art von Konsolenspielen aufwuchs bzw. das erste Mal damit in Berührung kam. Eventuell kennen Sie, liebe Leserinnen und Leser, auch (noch) dieses Gefühl: pixelige Grafiken und 8-Bit-Sounds. Da kann man schon ins nostalgische Schwärmen geraten. Da die Konsole zurzeit ausverkauft und windige Drittanbieter Wucherpreise verlangen, komme ich zu dem Schluss: Retro ist in! Möglicherweise ist dies ja auch für den einen oder anderen Retro-Gamer eine nette Geschenkidee. Falls das aber noch nicht retro genug ist, dem möchte ich den Künstler Love Hulten ans Herz legen. Dieser stellt u. a. auf Basis des Raspberry-Pi Retro-Gameboys her. Auf seiner Website www.lovehulten.com lassen sich einige extravagante und schön designte Beispiele betrachten. Vielleicht ist das auch für die Bastlerinnen und Bastler unter Ihnen eine willkommene Anregung, ein eigenes Projekt zu beginnen. Kommen wir aber nun von der Vergangenheit wieder zur Gegenwart und den aktuellen Themen unserer neuen Ausgabe. Zeeshan Ali befasst sich in seinem Seite 3 Artikel „Von 0 auf 100 mit JaCoCo/EclEmma“ (Seite 6) mit den Kernfunktionalitäten von EclEmma und JaCoCo in Eclipse. Dabei zeigt er, wie schnell ein Entwickler einen Überblick zum Umfang seiner Unit und Integra tionstests bekommen kann und wie er dadurch die Qualität dieser Tests verbessert. Abderrahmen Dhouibi stellt in seinem Beitrag „Einführung in die Welt von Ceylon“ die Programmiersprache Ceylon vor (Seite 14). Anhand von Beispielen zeigt er die potenziellen Vorteile dieser Sprache auf. In „Reaktiv statt nur aktiv“ (Seite 17) setzt sich David Maier mit dem Thema Big Data auseinander und erläutert, was sich sich hinter einem operativen BigData-System verbirgt und wie reaktive Programmierung mit Couchbase Server zusammenhängt. Dieser Artikel ist zudem ein Ausblick auf das kommende JavaUser-Group-Treffen der Metropolregion Nürnberg am 15. Dezember, bei dem David Maier ausführlich auf dieses Thema eingehen wird. Darüber hinaus erreichte uns ein weiterer Leserbrief (Seite 18) zum Thema „Das Geheimnis des Einhorn-Entwicklers“ von Tim Bourguignon, den wir Ihnen natürlich nicht vorenthalten möchten. Und zum Abschluss haben wir auch wieder unser Kolumne „Das Allerletzte“ für Sie. Ich wünsche Ihnen nun viel Spaß mit unserer Lektüre. Ihr Oliver Klosa Chefredakteur KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Beitragsinformation Der KaffeeKlatsch dient Entwicklern, Architekten, Projektleitern und Entscheidern als Kommunikationsplattform. Er soll neben dem Know-how-Transfer von Technologien (insbesondere Java und .NET) auch auf einfache Weise die Publikation von Projektund Erfahrungsberichten ermöglichen. Beiträge Um einen Beitrag im KaffeeKlatsch veröffentlichen zu können, müssen Sie prüfen, ob Ihr Beitrag den folgenden Mindestanforderungen genügt: •Ist das Thema von Interesse für Entwickler, Architekten, Projektleiter oder Entscheider, speziell wenn sich diese mit der Java- oder .NET-Technologie beschäftigen? •Ist der Artikel für diese Zielgruppe bei der Arbeit mit Java oder .NET relevant oder hilfreich? •Genügt die Arbeit den üblichen professionellen Standards für Artikel in Bezug auf Sprache und Erscheinungsbild? Wenn Sie uns einen solchen Artikel, um ihn in diesem Medium zu veröffentlichen, zukommen lassen, dann übertragen Sie Bookware unwiderruflich das nicht exklusive, weltweit geltende Recht •diesen Artikel bei Annahme durch die Redaktion im KaffeeKlatsch zu veröffentlichen •diesen Artikel nach Belieben in elektronischer oder gedruckter Form zu verbreiten •diesen Artikel in der Bookware-Bibliothek zu veröffentlichen •den Nutzern zu erlauben diesen Artikel für nicht-kommerzielle Zwecke, insbesondere für Weiterbildung und Forschung, zu kopieren und zu verteilen. Wir möchten deshalb keine Artikel veröffentlichen, die bereits in anderen Print- oder Online-Medien veröffentlicht worden sind. Selbstverständlich bleibt das Copyright auch bei Ihnen und Bookware wird jede Anfrage für eine kommerzielle Nutzung direkt an Sie weiterleiten. Die Beiträge sollten in elektronischer Form via E-Mail an [email protected] geschickt werden. Auf Wunsch stellen wir dem Autor seinen Artikel als unveränderlichen PDF-Nachdruck in der kanonischen KaffeeKlatschForm zur Verfügung, für den er ein unwiderrufliches, nicht-exklusives Nutzungsrecht erhält. Leserbriefe Leserbriefe werden nur dann akzeptiert, wenn sie mit vollständigem Namen, Anschrift und E-Mail-Adresse versehen sind. Die Redaktion behält sich vor, Leserbriefe – auch gekürzt – zu veröffentlichen, wenn dem nicht explizit widersprochen wurde. Sobald ein Leserbrief (oder auch Artikel) als direkte Kritik zu einem bereits veröffentlichten Beitrag aufgefasst werden kann, behält sich die Redaktion vor, die Veröffentlichung jener Beiträge zu verzögern, so dass der Kritisierte die Möglichkeit hat, auf die Kritik in der selben Ausgabe zu reagieren. Leserbriefe schicken Sie bitte an [email protected]. Für Fragen und Wünsche zu Nachdrucken, Kopien von Berichten oder Referenzen wenden Sie sich bitte direkt an die Autoren. Seite 4 Werbung ist Information Firmen haben die Möglichkeit Werbung im KaffeeKlatsch unterzubringen. Der Werbeteil ist in drei Teile gegliedert: •Stellenanzeigen •Seminaranzeigen •Produktinformation und -werbung Die Werbeflächen werden als Vielfaches von Sechsteln und Vierteln einer DIN-A4-Seite zur Verfügung gestellt. Der Werbeplatz kann bei Herrn Oliver Klosa via E-Mail an [email protected] oder telefonisch unter 09131/8903-0 gebucht werden. Abonnement Der KaffeeKlatsch erscheint zur Zeit monatlich. Die jeweils aktuelle Version wird nur via E-Mail als PDF-Dokument versandt. Sie können den KaffeeKlatsch via E-Mail an abo@bookware.de oder über das Internet unter www.bookware.de/abo bestellen. Selbstverständlich können Sie das Abo jederzeit und ohne Angabe von Gründen sowohl via E-Mail als auch übers Internet kündigen. Ältere Versionen können einfach über das Internet als Download unter www.bookware.de/archiv bezogen werden. Auf Wunsch schicken wir Ihnen auch ein gedrucktes Exemplar. Da es sich dabei um einzelne Exemplare handelt, erkundigen Sie sich bitte wegen der Preise und Versandkosten bei Oliver Klosa via E-Mail unter [email protected] oder telefonisch unter 09131/8903-0. Copyright Das Copyright des KaffeeKlatsch liegt vollständig bei der Bookware. Wir gestatten die Übernahme des KaffeeKlatsch in Datenbestände, wenn sie ausschließlich privaten Zwecken dienen. Das auszugsweise Kopieren und Archivieren zu gewerblichen Zwecken ohne unsere schriftliche Genehmigung ist nicht gestattet. Sie dürfen jedoch die unveränderte PDF-Datei gelegentlich und unentgeltlich zu Bildungs- und Forschungszwecken an Interessenten verschicken. Sollten diese allerdings ein dauerhaftes Interesse am KaffeeKlatsch haben, so möchten wir diese herzlich dazu einladen, das Magazin direkt von uns zu beziehen. Ein regelmäßiger Versand soll nur über uns erfolgen. Bei entsprechenden Fragen wenden Sie sich bitte per E-Mail an [email protected]. Impressum KaffeeKlatsch Jahrgang 9, Nummer 11, November 2016 ISSN 1865-682X Bookware – eine Initiative der MATHEMA Software GmbH Henkestraße 91, 91052 Erlangen Telefon: 0 91 31 / 89 03-0 Telefax: 0 91 31 / 89 03 -99 E-Mail: [email protected] Internet: www.bookware.de Herausgeber /Redakteur: Dr. Oliver Klosa Anzeigen: Dr. Oliver Klosa Grafik: Nicole Delong-Buchanan KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Inhalt Von 0 auf 100 mit JaCoCo/EclEmma Code Coverage für Unit und Integrationstests verbessern von Zeeshan Ali Editorial 3 Beitragsinfo 4 Inhalt 5 Leserbrief 18 User Groups 19 Werbung 18 Das Allerletzte 20 6 EclEmma [1] ist ein Eclipse-Plug-in und stellt Code-Coverage-Features (Code-Umfang) zur Verfügung. Beim Code Coverage geht es darum, wie viele Befehle einer Klasse sich in einem Projekt befinden und von den anderen Klassen ausgeführt werden. Es verwendet JaCoCo [1] und beinhaltet die CodeCoverage-Bibliothek. Mit Hilfe von EclEmma und JaCoCo kann ein Entwickler schnell einen Überblick zum Umfang seiner Unit und zu seinen Integrationstests bekommen sowie konsequent die Qualität dieser Tests verbessern. JaCoCo kann auch außerhalb von Eclipse mit gängigen Build Tools wie Maven verwendet werden. Einführung in die Welt von Ceylon von Abderrahmen Dhouibi 14 Neuere Sprachen beinhalten gelernte Lektionen von vorherigen Sprachgenerationen, um die Programmierung leichter und effizienter zu machen. Zu dieser Welle der neueren Programmiersprachen gehört Ceylon. Artikel Von 0 auf 100 mit JaCoCo/EclEmma Code Coverage für Unit und Integrationstests verbessern 6 Einführung in die Welt von Ceylon 14 Reaktiv statt nur aktiv Couchbases Java-SDK Seite 5 17 Reaktiv statt nur aktiv Couchbases Java-SDK von David Maier 17 Wenn man beginnt sich mit Big-Data auseinanderzusetzen, dann stolpert man unweigerlich über das Programmiermodell Map-Reduce oder über verteilte Programmierung im Allgemeinen. Darüber hinaus trifft man bei operativen Big-Data-Systemen auch auf das Programmierparadigma der reaktiven Programmierung. Was ist ein operatives Big-DataSystem? Wie hängt reaktive Programmierung mit Couchbase Server zusammen? Der folgende Artikel gibt Antworten auf diese Fragen. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Von 0 auf 100 mit JaCoCo/EclEmma Code Coverage für Unit und Integrationstests verbessern E von Zeeshan Ali clEmma [1] ist ein Eclipse-Plug-in und stellt Code-CoverageFeatures (Code-Umfang) zur Verfügung. Beim Code Coverage geht es darum, wie viele Befehle einer Klasse sich in einem Projekt befinden und von den anderen Klassen ausgeführt werden. Es verwendet JaCoCo [1] und beinhaltet die Code-CoverageBibliothek. Mit Hilfe von EclEmma und JaCoCo kann ein Entwickler schnell einen Überblick zum Umfang seiner Unit und zu seinen Integrationstests bekommen sowie konsequent die Qualität dieser Tests verbessern. JaCoCo kann auch außerhalb von Eclipse mit gängigen Build Tools wie Maven verwendet werden. In diesem Artikel werden die Kernfunktionalität von EclEmma/JaCoCo in Eclipse und eine kleine JavaAnwendung mit Maven gezeigt. Dabei ist ein sicherer Umgang in der Java-Entwicklung in Eclipse und Maven Voraussetzung. Die Test-Anwendung Unsere Test-Anwendung basiert auf einer einfachen Klasse. Diese Klasse präsentiert einen Punkt mit X- und Y-Koordinaten in zwei Dimensionen und hat eine Methode, die einen Punkt mit einem anderen vergleicht, um sicher zu stellen, ob beide Punkte die gleichen Punkte sind oder nicht. Seite 6 package de.mathema.www.myjacoco; public class Punkt { private Double x; private Double y; public Punkt(Double x,Double y) { this.x = x; this.y = y; } public Punkt(Punkt zweiterPunkt) { this.x = zweiterPunkt.x; this.y = zweiterPunkt.y; } public Double getX() { return x; } public void setX(Double x) { this.x = x; } public Double getY() { return y; } public void setY(Double y) { this.y = y; } public boolean punkteVergleichen( Punkt zweiterPunkt ){ return this.getX().equals(zweiterPunkt.getX()) && this.getY().equals(zweiterPunkt.getY()); } public String toString() { return "("+this.x+","+this.y+")"; } } Abbildung 1: Eine Punkt-Klasse Installation von EclEmma in Eclipse IDE: Der nächste Schritt ist die Installation des EclEmmaPlug-ins in Eclipse. Dazu müssen wir das Help-Menü öffnen und die Option Eclipse Market auswählen. Help->Eclipse Market Wir können auch Help->Install New Software auswählen. Diese Aktion öffnet ein Dialogfenster, bei dem man im Feld Work With (links oben) die URL: http://update. eclemma.org [2] eintragen muss. Nach dem Eintrag wählen wir im unteren Feld die Option EclEmma aus und klicken unten rechts auf Next. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Abbildung 2: Installation von EclEmma in Eclipse Danach wird die Software heruntergeladen und nach Erteilung der Installationsgenehmigung installiert. Nach einem Neustart von Eclipse steht das Plug-in zur Verfügung. (Siehe Abblidung 2) Unit-Tests für die Punkt-Klasse mit Junit Im folgenden Schritt schreiben wir eine Klasse für UnitTests für die Punkt-Klasse mit JUnit. public class PunktUnitTest { @Test public void PunkteVergleichen() throws Exception { //a(10.0, 20.0) Punkt a = new Punkt(10.0,20.0); //b(30.0,40.0) Punkt b = new Punkt(30.0,40.0); //Der Fall X1!=X2 und Y1!=Y2 //a(10.0,20.0) und b(30.0,40.0) sind unterschiedlich assertFalse(a.punkteVergleichen(b)); //Der Fall X1 == X2 && Y1 == Y2 //a(10.0,20.0) und c(10.0,20.0) sind gleich Punkt c = new Punkt(a); assertTrue(a.punkteVergleichen(a)); } } Abbildung 3: Unit-Tests für die Punkt-Klasse Seite 7 Um diese Testklasse mit Code Coverage auszuführen und den Klassen-Namen auszuwählen, muss man rechts klicken und von der Liste die Option Coverage As->JUnit Test auswählen. (Siehe Abbildung 5) Diese Aktion führt die Unit-Tests aus und zeigt die Coverage-Statistiken bezüglich der Unit-Tests im Coverage-Panel. (Siehe Abbildung 6) Dieses Panel hat fünf Spalten, das verschiedene Statis tiken sammelt: Spalte Nr Spalte Name Inhalt 1 Element Die Klassen des Projekts unter Package Struktur 2 Coverage Code Coverage als Prozent 3 Covered Instructions Die Zahl der ausgeführten Befehle einer Klasse Missed Instructions Die Zahl der nicht ausgeführten Befehle einer Klasse Total Instructions Die gesammte Zahl von Befehle einer Klasse 4 5 Abbildung 4: Erklärung der Statistik-Spalten im Coverage-Panel KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Abbildung 5: Ausführung von JUnits Tests mit Coverage Abbildung 6: Die Coverage-Statistiken im Coverage-Panel Seite 8 KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Im konktreten Beispiel für unsere Klasse mit Unit-Tests sehen wir, dass es 100 Prozent Coverage hat. Aber in der Punkt-Klasse, die tatsächlich getestet wurde, wurden nicht alle Befehle ausgeführt. Mit einem Doppelklick auf die Punkt-Klasse in der ersten Spalte des Coverage-Panels wird diese Klasse geöffnet und wir sehen folgendes: public class Punkt { private Double x; private Double y; public Punkt(Double x,Double y) { this.x = x; this.y = y; } public Punkt(Punkt zweiterPunkt) { this.x = zweiterPunkt.x; this.y = zweiterPunkt.y; } public Double getX() { return x; } public void setX(Double x) { this.x = x; } public Double getY() { return y; } public void setY(Double y) { this.y = y; } public boolean punkteVergleichen( Punkt zweiterPunkt ){ return this.getX().equals(zweiterPunkt.getX()) && this.getY().equals(zweiterPunkt.getY()); } public String toString() { return "("+this.x+","+this.y+")"; } } Abbildung 7: Code-Coverage für die Punkt-Klasse nach Unit-Tests Die ausgeführten Code-Zeilen sind grün und die nicht ausgeführten rot markiert. Die gelb-markierte Zeile ist ein Sonderfall. Diese enthält Conditionale-Befehle und das Gelb zeigt, dass nicht alle möglichen Kombinationen getestet wurden. Fährt man mit der Maus über das Dia mant-Symbol am Anfang dieser Zeile, erscheint die Meldung „1 of 4 branches missed “. (Siehe Abbildung 10) Seite 9 Alle mögliche Kombinationen, um zwei Punkte (X1,Y1) und (X2,Y2) zu vergleichen, sehen wie folgt aus: Condition Was wird geprüft 1 X1 == X2 && Y1!= Y2 2 X1!=X2 && Y1!=Y2 (Die Prüfung für Y Koordinatoren wird nicht gemacht) 2 X1!=X1 && Y1==Y2 (Die Prüfung für Y Koordinatoren wird nicht gemacht) 3 X1==X2 && Y1!=Y2 Abbildung 8: Alle Vergleichskombinationen von zwei Punkten Die Prüfungen in der blauen Zeile haben eigentlich die gleiche Bedingung. Wenn X1!=X2 wahr ist, findet die zweite Prüfung nicht statt. Dies ist das Standard-Verhalten der Java-Operatoren &&. Wir vergleichen nun die obere Tabelle mit unseren Unit-Tests und sehen, dass wir nur geprüft haben, ob die X - und Y-Koordinaten der beiden Punkte identisch sind oder nicht. Wir haben aber nicht den 3. Fall in der oberen Tabelle geprüft, bei dem die X-Koordinaten gleich sind, aber die Y-Koordinaten nicht. Deswegen ergänzen wir unseren Unit-Test mit diesem Fall und führen die Coverage As Option noch einmal aus. //Der Fall X1 == X2 && Y1 != Y2 //a(10.0,20.0) und c(10.0,90.0) sind unterschiedlich c.setX(10.0);c.setY(90.0); assertFalse(a.punkteVergleichen(c)); Abbildung 9: Die Ergänzung des Unit-Tests Diesmal sieht die Coverage der Punkt-Klasse wie folgt aus: public class Punkt { private Double x; private Double y; public Punkt(Double x,Double y) { this.x = x; this.y = y; } public Punkt(Punkt zweiterPunkt) { this.x = zweiterPunkt.x; this.y = zweiterPunkt.y; } KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Abbildung 10: Gelbe Zeile im Coverage-Bericht public Double getX() { return x; } public void setX(Double x) { this.x = x; } public Double getY() { return y; } public void setY(Double y) { this.y = y; } public boolean punkteVergleichen( Punkt zweiterPunkt ){ return this.getX().equals(zweiterPunkt.getX()) && this.getY().equals(zweiterPunkt.getY()); } public String toString() { return "("+this.x+","+this.y+")"; } } Abbildung 11: Verbesserte Code-Coverage für Punkt-Klasse Seite 10 Diesmal ist die Zeile mit Conditions in der Method PointsAreSame auch Grün. Zusätzlich sehen wir, dass die Zeilen der setX()- und setY()-Methoden auch grün sind, da wir gerade in unserem neuen Test diese Methoden benutzt haben, um die Koordinaten des Punkt Cs einzusetzen. Nun bleibt in unserer Punkt-Klasse nur eine Methode rot, die toString()-Methode, da sie nirgendswo verwendet wurde. Dieses einfaches Beispiel zeigt, wie wir dieses Werkzeug nutzen können, um den Umfang und die Qualität unseres Codes bzw. Unit-Tests zu sehen und zu verbessern. Zusätzlich kann auch Dead-Code schnell gefunden werden, besonders in größen Klassen. Die gelbe Zeile ist nun grün geworden. Die rote Zeile hingegen bedeutet, dass die toString()-Methode nirgendwo aufgerufen wurde. JaCoCo mit Maven Die Verwendung von JaCoCo mit Maven unterscheidet sich von EclEmma in Eclipse. Dazu müssen wir ein Maven-Plug-in verwenden und folgendes im POM.xml-File des Projektes eintragen: KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.6.201602180812</version> <configuration> <outputDirectory>${project.basedir}/coverage-reports/ jacoco</outputDirectory> </configuration> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build> Abbildung 12: Verwendung von JaCoCo mit Maven-Plug-in Danach können wir unser Projekt mit dem Befehl mvn clean install ausführen. Per Default generiert das JaCoCo-Plug-in seine Berichte als CSV-, XML- und HTMLDateien im Ordner PROJECT_ORDNER/target/site/jacoco, wie in Abbildung 13 dargestellt. Wenn wir das File index.html in einem Browser öffnen, werden die gleichen Statistiken wie im CoveragePanel in Eclipse durch eine einfache Webseite angezeigt. Hier kann man auf Projektebene die Statistiken für alle Packages des Projekts einsehen. (Siehe Abbildung 14) Beim Klick auf ein Package werden die Statistiken aller Klassen dieses Packages aufgelistet. (Siehe Abbildung 15) Wenn man auf eine einzelne Klasse klickt, dann werden die Coverage-Statistiken aller Methoden dieser Klassen geöffnet. (Siehe Abbildung 16) Auf einer einzelnen Package-Ebene, bei der alle Klassen des Packages aufgelistet sind, sieht man rechts oben einen Source-File-Link. Mit einem Klick auf diesen Link wird eine Liste aller Klassen dieses Packages angezeigt. Klickt man anschließend auf eine Klasse, erscheint der Quellcode dieser Klasse in den Farben grün, gelb und rot. (Siehe Abbildung 18) Natürlich können wir den Ordner, in dem die Berichte vom JaCoCo- und Maven-Plug-in generiert werden, beliebig konfigurieren: Abbildung 13: Inhalt des Ordners PROJECT_ORDNER/ target/site/jacoco Seite 11 KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Abbildung 14: Statistiken auf der Projekt-Packages-Ebene Abbildung 15 : Gesamte Statistiken der Klassen in einem Package Abbildung 16: Statistiken einer Klasse auf der Methodenebene <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.6.201602180812</version> <configuration> <outputDirectory>${project.basedir}/coverage-reports/ jacoco</outputDirectory> </configuration> Abbildung 17 Seite 12 Änderung des Bericht-Ordners von JaCoCo Hier im ${project.basedir} ist eine Maven-Umgebungs variable, die die oberste Ebene des Projektordners darstellt oder besser gesagt der PROJEKT_ORDNER ist. Nach dieser Änderung führen wir den Befehl mvn clean install und sehen, dass die Coverage-Berichte wie gewünscht im PROJECT_ORDNER/coverage-reports/jacoco Ordner generiert wurden. (Siehe Abbildung 19) KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code Coverage für Unit- und Integartionstests mit EclEmma/JaCoCo Abbildung 18: Code-Coverage einzelne Klasse mit Quellcode Abbildung 19: Änderung des Zeil-Ordners von JaCoCo Fazit JaCoCo ist ein nützliches und leichtgewichtes Werkzeug für die Code Coverage, dass wir verwenden können, um den Umfang und die Qualität unserer Unit- und Integrationstests zu verbessern. Es kann innerhalb von EclipseIDE mit dem EclEmma-Plug-in und auch mit den Build Tools wie Maven genutzt werden. Seite 13 References [1] EclEmma Java Code Coverage for Eclipse, http://www.eclemma.org/index.html [2] EclEmma Installation im Eclipse http://www.eclemma.org/installation.html#updatesite Kurzbiografie Zeeshan Ali ist als Software-Entwickler bei MATHEMA Software GmbH tätig. Nach dem Informatik-Studium hat er erste Erfahrungen im Bereich OOP mit Android-Entwicklung gesammelt. Aktuell beschäftigt er sich mit der Entwicklung und dem Testen von Java-Enterprise Anwendungen. Neben der Arbeit reist er sehr viel und interessiert sich für andere Kulturen. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Einführung in die Welt von Ceylon von Abderrahmen Dhouibi N euere Sprachen beinhalten gelernte Lektionen von vorherigen Sprachgenerationen, um die Programmierung leichter und effizienter zu machen. Zu dieser Welle der neueren Programmiersprachen gehört Ceylon. Was ist Ceylon Ceylon ist eine von Red Hats entwickelte Programmiersprache, die im November 2011 erschien. Sie ist ein direkter Nachkomme von Java. Die Sprache wurde in vielen verschiedenen Varianten und Umgebungen (in kleinen und sehr großen Anwendungen) getestet. Die Ergebnisse haben gezeigt, dass Ceylon ein gutes Werkzeug ist, um fast jede Art von Anwendung zu entwickeln. Ceylon verbessert Javas Fundament. Sie pickt dabei die besten Elemente aus Java heraus, entfernt das, was nicht gut ist und fügt neue Konzepte hinzu. Das macht das Programmieren sehr angenehm. Ceylon wurde entwickelt, um auf mindestens zwei verschiedenen Plattformen zu funktionieren: • JVM ( Java Virtual Machine) – die Java-Runtime. des Plug-ins wird eine neue Perspective und der CeylonEditor in Eclipse erstellt. Erstellung eines Ceylon-Moduls Um ein Programm mit Ceylon umzusetzen, muss zuerst ein Ceylon-Modul erstellt werden. Ein Modul in Ceylon ist ein Container von Packages. Es enthält QuellcodeDateien, Bilder, Konfigurationsdateien und kann andere Module importieren oder benutzen. Ein neues Modul hat drei Dateien: • module.ceylon: Modul Deskriptor • package.ceylon: Package Deskriptor • run.ceylon: Source File (Extension .ceylon) Ein paar Eigenschaften • JavaScript Engines – Internet-Browser und node.js. Typesafe Dieser Aspekt ist äußerst interessant, weil es bedeutet, dass wenn wir einmal etwas entwickelt haben, läuft es ohne Änderungen überall. Die aktuelle stabile Version ist die 1.3.0, die im September 2016 freigegeben wurde. Beispiel 1: Ceylons IDE und Voraussetzungen Ceylon verlangt Java 7 oder Java 8. Sie hat keine neue IDE und wird durch ein Plug-in in Eclipse integriert. Seit der Version 1.3.0 ist Ceylon auf IntelliJ IDEA und auch auf Android Studio verfügbar. Nach der Installation Seite 14 Es gibt keine NullPointerException in Ceylon. Wenn ein Wert eine Variable Null sein könnte oder wenn eine Methode Null zurückliefern könnte, dann verlangt Ceylon, dass wir das explizit deklarieren müssen. String? Name; Das entspricht: String | Null name; Falls es ein Attribut von Type String? gibt, verlangt Ceylon, dass eine Prüfung durch das Konstrukt if (exists …) gemacht werden muss. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code-Coverage für Unit- und Integartionstests mit EclEmma/JaCoco Beispiel 2: void hallo(String? name) { if (exists name) { //Hier ist Name von Typ String print("Hallo, ``name``!"); // Oder print("Hallo, " + name + "!"); } else { print("Hallo, Welt!"); } } hallo(null); hallo("KaffeeKlatsch Lesende"); OutPut: > Hallo, Welt! > Hallo, KaffeeKlatsch Lesende! Es gibt auch in Ceylon keine ClassCastException. Damit der Typ der Variable beschränkt wird, muss eine Prüfung durch if (is …) und/oder case (is …) gemacht werden. Beispiel 3: void hallo(String? name) { if (is String name) { //Hier hat Name String als Typ print("Hallo, ``name``!"); } else { print("Hallo, Welt!"); } } hallo(null); hallo("KaffeeKlatsch Lesende"); OutPut: > Hallo, Welt! > Hallo, KaffeeKlatsch Lesende! Die Beschränkung des Typs einer Variablen durch Bedingungen (wie is oder exists) heißt flow-sensitive typing. Enumerated Subtypes In Ceylon muss man nicht lange Switch-Statements schreiben oder das Visitor-Entwurfsmuster implementieren, wenn es um Subtypes-Probleme geht. Man muss nur eine Aufzählungsliste von Subtypes deklarieren. Seite 15 Beispiel 4: abstract class Magazin() of KaffeeKlatsch | AndereMagazin {} class KaffeeKlatsch() extends Magazin() {…} class AndereMagazin () extends Magazin() {…} Magazin magazin = KaffeeKlatsch() ; switch (magazin) case (is KaffeeKlatsch) {print("KaffeeKlatsch");} case (is AndereMagazin) {print("Anderes Magazin");} OutPut: > KaffeeKlatsch Type aliases Alias in Ceylon sind ähnlich wie in C typedef. Alias können einen generischen Typ zusammen mit seinem Typ Argumente handeln. Beispiel 5: interface StringListe => List<String>; Ein Typ eines Alias kann parametriert werden. Beispiel 6: class Name<Wert>(String name, Wert wert) given Wert satisfies String => Entry<String,Wert>(name,wert); Name<String> magazin = Name("Magazin", "KaffeeKlatsch"); print(magazin); OutPut: > Magazin->KaffeKlatsch Funktionen höherer Ordnung Ceylon unterstützt Funktionen höherer Ordnung, das heißt, eine Funktion kann Funktionen als Argumente erhalten oder Funktionen als Ergebnis liefern. Beispiel 7: void repeat(Integer times, void iterate(Integer i)) { for (i in 1..times) { iterate(i); } } void printQuadrat(Integer i ) { print(i^2); } repeat(5, printQuadrat); // Oder die Kompaktform: ohne die Methode “printQuadrat“ // repeat(5, (i)=>print(i^2)); OutPut: > 1 4 9 16 25 KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Code-Coverage für Unit- und Integartionstests mit EclEmma/JaCoco Tupel Ein Tupel ist eine Art von Linked List, bei der der statische Typ der Liste dem statischen Typ jedes Elements der Liste entspricht: Beispiel 8: [Float, Float, Float, String] quelle = [0.0, 1.0, 2.0, "Quelle"]; print(quelle[3]); OutPut: > Quelle Ohne den Bedarf zum Type-Casting hat man Zugriff auf alle Elemente. Beispiel 9: [Float, Float, String] quelle = [0.0, 1.0, "Quelle"]; [Float, String] teil = [quelle[0],quelle[2]]; print(teil[1]); OutPut: > Quelle Klare Ausdrücke Um einen Stream von Werten zu filtrieren und umzuwandeln, stellt Ceylon spezielle Syntax zur Verfügung, die diese Operationen praktisch und einfach machen. Beispiel 10: Sequenz von Name und Paradigmen // Drei Programmiersprache hat drei Attribute( Name, Paradigmen und Jahr ) class Sprache( String name, String paradigmen, Integer jahr ) {…} // Drei Programmiersprache(C, Java und Ceylon) [Sprache, Sprache, Sprache] programmierspracheListe = [Sprache("C", "imperativ und strukturiert", 1972), Sprache( "Java", "Objektorientierte Programmiersprache", 1995 ), Sprache( "Ceylon", "Objektorientierte Programmiersprache", 2011 )]; value sequenz2 = [for (sprache in programmierspracheListe) if (sprache.jahr > 2010) sprache.name + " " + sprache. paradigmen]; print(sequenz2); OutPut: > [Ceylon Objektorientierte Programmiersprache] Hier wird ein Map<String,Sparche> erstellt. value map = { for (sprache in programmierspracheListe) sprache.name + " " + sprache.paradigmen -> sprache}; Operator Polymorphism Ceylon bietet einen Satz von Operatoren einschließlich der, die in C und Java unterstützt werden. Jeder vordefinierte Operator ist definiert, um nach bestimmten Klassen- oder Schnittstellentyp zu handeln. Das erlaubt die Anwendung der Operatoren zu jeder Klasse, die diesen Typ erweitert oder hat. Wir nennen diesen Ansatz Operator Polymorphism. Beispiel 11: Ceylon definiert die Schnittstelle Summable. shared interface Summable<Other> of Other given Other satisfies Summable<Other> { shared formal Other plus(Other that); } Der „+“ Operator ist definiert für die Summable-Werte: > X+Y ist eine Abkürzung von X.plus(Y) Der Operator “ <“ ist in der Schnittstelle Comparable definiert, „*“ ist in der Schnittstelle Numeric definiert usw. Fazit Zwischen 2011 und 2016 wurden mehr als 1.010 Issues gefixt. Ceylon 1.3.0 ist ein Major-Release. Es ist das erste Release, das Android Development, Node Package Manager (npm) und Wildfly Swarm unterstützt. Das Projekt ist immer noch aktuell und wird weiterentwickelt. Jedoch findet man außerhalb der offiziellen Webseite kaum Dokumentationen. // Sequenz von Name und Paradigmen value sequenz1 = [for ( sprache in programmierspracheListe ) sprache.name + " " + sprache.paradigmen + " ``sprache.jahr``"]; Referenzen OutPut: [2] Athaydes, Renato Learn Programming in Ceylon – Part 1 http://renatoathaydes.github.io/Learn-Programming-In-Ceylon-Part-1 print(sequenz1); > [C imperativ und strukturiert 1972, Java Objektorientierte Programmiersprache 1995, Ceylon Objektorientierte Programmiersprache 2011] Die Sequenz von Name und Paradigmen für die Sprache, die ein Erscheinungsjahr ab 2009 haben. Seite 16 [1] Ceylon home http://ceylon-lang.org Kurzbiografie Abderrahmen Dhouibi ist als Consultant und Entwickler bei MATHEMA Software GmbH tätig. Er interessiert sich für objekt orientierte Programmierung und beschäftigt sich mit der Java Standard- und Enterprise-Entwicklung. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Reaktiv statt nur aktiv Couchbases Java-SDK W von David Maier enn man beginnt sich mit Big-Data auseinanderzusetzen, dann stolpert man unweigerlich über das Programmiermodell Map-Reduce oder über verteilte Programmierung im Allgemeinen. Darüber hinaus trifft man bei operativen Big-Data-Systemen auch auf das Programmierparadigma der reaktiven Programmierung. Was ist ein operatives Big-Data-System? Wie hängt reaktive Programmierung mit Couchbase Server zusammen? Der folgende Artikel gibt Antworten auf diese Fragen. Statt einfach nur Buzzwords in den Raum zu werfen, beginnen wir mit der folgenden Fragestellung: Was ist eigentlich Big-Data? Während diese Frage nicht so einfach zu beantworten ist, wie es auf den ersten Blick scheint, macht die folgende grobe Definition Sinn: Big-Data-Systeme sind Systeme zur Datenverarbeitung, die im Stande sind, Probleme unter bestimmten Rahmenbedingungen besser zu lösen als die traditional existierenden Systeme. Diese Rahmenbedingungen können unterschiedlicher Natur sein. Im folgenden unterscheiden wir zwischen analytischen und operativen Big-Data-Systemen, wobei die Grenze zwischen beiden Systemarten nicht scharf ist und die beiden auch oft miteinander kombiniert werden. Bei analytischen Big-Data-Systemen ist eine typische Rahmenbedingung die Quantität der zu verarbeitenden Daten. Ein Qualitatives Merkmal eines solchen Systems ist die Zeit, in der die Gesamtheit der Daten verarbeitet werden kann. Es geht also meist darum große Datenmengen in kürzerer Zeit zu verarbeiten. Die Konsumenten der Ergebnisse sind eher wenige Nutzer. Typischer Vertreter eines solchen Systems ist Hadoop. Die Daten werden eher starr in einem verteilten Dateisystem abgelegt, um dann verteilt verarbeitet zu werden. Seite 17 Bei operativen Big-Data-Systemen geht es nicht rein um die Datenmenge. Rahmenbedingungen sind Anzahl der Konsumenten und Durchsätze. Qualitative Merkmale sind das Bedienen möglichst vieler Konsumenten zur gleichen Zeit und individuell geringe Antwortzeiten. Vertreter solcher Systeme sind NoSQL-Datenbank systeme wie Couchbase Server. Im Falle von Couchbase Server sind 100-tausende Operationen pro Sekunde bei Sub-Millisekunden-Latenz keine Seltenheit. Die Fähigkeit einen hohen Durchsatz auf der ServerSeite zu erreichen ist jedoch nur ein Teil eines Ganzen. Die Client-Seite ist hier nicht minder wichtig. Couchbases Java SDK verwendet RxJava und integriert somit die eigene Kern-API mit einer API zur asynchronen Programmierung auf Basis von observierbaren Datenströmen (Observable Streams). Das Observable-Pattern ist recht leicht erklärt: Es gibt ein zu observierendes Subjekt und einen Observierenden. Sobald das Subjekt etwas tut, kann der Observierende auf das Verhalten reagieren. Im Rahmen der asynchronen Operationsverarbeitung muss der Aufrufende nun nicht mehr auf ein Ergebnis warten, sondern das Ergebnis wird vom Observierenden gehandhabt. Dies bewirkt einen höheren Durchsatz je Client und geringere Latenzen über mehrere Operationen hinweg. Da eine Datenbankoperation mehrere Elemente (Dokumente in Couchbase) liefern kann, werden diese als observierbarer Datenstrom geliefert. Ein solcher Datenstrom kann z. B. gemappt (Transformation der Elemente, Filtern von Elementen, ...) oder z. B. reduziert werden (Aggregation von Elementen, ...). Jede Transformation eines Datenstroms liefert erneut einen Datenstrom. Dies erlaubt es, die Operationen kontrolliert nebenläufig auszuführen, ohne bei Abhängigkeiten zwischen individuellen Operationen in der sogenannten Callback-Hölle zu landen. Couchbase Server ist ein verteiltes und dokumentenorientiertes NoSQL-Datenbanksystem mit Schwerpunkten auf Flexibilität, Performanz, Skalierbarkeit und Hochverfügbarkeit. Die Performanzanforderungen enden nicht auf der Server-Seite. Dieser Artikel hat einen Einblick gegeben, weshalb Couchbase Server auf der Client-Seite auf reaktive Programmierung setzt. Kurzbiografie David Maier ist ein kreativer Software-Entwickler und Berater mit Projektleitungserfahrung in der Produktentwicklung und in Kundenprojekten. Darüber hinaus besitzt er einen soliden Datenbank-Background, wobei er sich im Laufe der Zeit auf NoSQL-Datenbanksysteme spezialisiert hat. Er arbeitet momentan als Principal Solutions Engineer für ‚Couchbase‘, der Firma hinter dem Open-Source NoSQL-Datenbanksystem ‚Couchbase Server‘. KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 Leserbriefe Leserbrief von Aleksandar Drakulic KaffeeKlatsch 2016/11 bezogen auf den Artikel Das Geheimnis des Einhornerntwicklers Eine Schatzkarte für die eigene Entwicklerreise von TimBourguignon KaffeeKlatsch 2016/07 Sehr geehrter Herr Bourguignon, Ich habe Ihren Artikel mit großem Interesse gelesen. Zuerst einmal, ja ich glaube, dass Einhörner existieren, aber leider nur ohne Horn. Warum? Wir Menschen wollen immer mehr und das, was wir mehr wollen, bewerten wir immer subjektiv. Das liegt in unserer Natur. Würden wir uns einen fiktiven Wunschkollegen zusammenzustellen, wünschten wir uns einen Fleißigen, jedoch nicht zu Fleißigen, immerhin wollen wir uns nicht in einem schlechten Licht präsentieren. Jemand der guten Code schreibt, uns jedoch nicht komplett überflügelt, nett ist und (immer) das tut was man ihm sagt. Unser Chef wünschte sich einen Arbeitnehmer, der seine Arbeit verrichtet, ordentlich und pünktlich ist, die ihm anvertrauten Aufgaben gewissenhaft erfüllt und so wenig Geld wie möglich kostet. Selbstverständlich befinden wir uns hier im Reich der Utopie. Woher sollen diese Menschen kommen? Aus der Hochschule/Uni natürlich! Die AbstractFactory der Unternehmenswelt, zumindest in unseren Köpfen. Die Bildungspolitik will uns weismachen, dass dies möglich ist. Aus meiner Sicht, leider falsch. An den Hochschulen wird Studenten Wissen vermittelt, denn dies ist die Aufgabe der Hochschulen. Seit der Einführung des Bachelor sogar unter Hochdruck. Es gilt, keine Zeit mehr zu verschwenden. Die Zeiten in denen Studenten 20+ Semester benötigten sind vorüber. Es herrscht somit Lernzwang. Eine Klausur folgt der nächSeite 18 sten. Es werden vor allem Klausuren geschrieben die einen kompakten Wissenskatalog abfragen. Denn das Problem ist: Hochschulen sind gezwungen ihre Studenten zu bewerten. Wie können unabhängige Bewertungen in Klausuren stattfinden? Richtig: Menge durch Zeit. Dies führt selbstverständlich zu Bulimie-Lernen. Eigentlich das genaue Gegenteil von dem, was alle wollen. Die Hochschulen vermitteln kein Wissen, sie fragen es ab. Die Studenten lernen kein Wissen, sie lernen im Eiltempo Wissen zu ersetzen. Und die Unternehmen glauben fest daran, dass diese neue Generation besser wird als die vorherige und wundern sich, dass ihre Erwartungen nicht erfüllt werden, da die Studenten nicht auf den Berufsalltag vorbereitet werden. Trotzdem spielen alle dieses irre Spiel mit dem Kalkül, es wird sich schon auszahlen. Alle verlieren, tun aber so, als wären sie Gewinner. Natürlich haben einige gute Hochschulen und Unternehmen dies erkannt und bemühen sich dem Problem Herr zu werden. Vor allem ist es einigen Professorinnen und Professoren zu verdanken, die sich sehr engagieren, mehr als von ihnen verlangt würde. Dennoch könnte auf diesem Gebiet mehr gemacht werden. Für Softwareentwicklung benötigt man vor allem eines: Zeit. Abstrakte Konzepte lassen sich zwar lehren, um sie wirklich zu verstehen, muss man sie jedoch anwenden. Wer jedoch kontinuierlich Zeit investiert, hat qualitativ bessere Lernerfolge, die vor allem langfristig allen nutzen. Die bekommt man nur, indem man sich hinsetzt und etwas macht oder auch ab und zu währenddessen steht. Hier schließt sich der Kreis und wir sind wieder in der Realität angelangt. Chefs und Kollegen haben ihre Liste mit Wünschen im Kopf, die leider vollkommen realitätsfremd ist, da sie auf Menschen stoßen, die gerade frisch durch eine Bildungseinrichtung gepresst wurden. Wir müssen vor allem unsere Erwartungen hinterfragen. Nicht ob ein Kandidat die eigenen Anforderungen erfüllt, sondern ob meine Anforderungen realistisch sind. Würde ich mein vergangenes Ich heute nach 20 Jahren Berufserfahrung einstellen? Die Antwort muss darauf aus verschiedenen Gründen immer „nein!“ lauten. Dennoch sollten wir es tun! Vielmehr fängt jeder von uns als „Esel“ an und wandelt sich hoffentlich durch das Studium oder eine Ausbildung in ein Pferd. Ja, und mit viel Glück, gutem Zureden und einigen Schlägen, über eine laaaange Zeit verteilt, auf den Hinterkopf, wird man dann durch Schweiß und Schmerz vielleicht zum Einhorn. Aleksandar Drakulic KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 User Groups Fehlt eine User Group? Sind Kontaktdaten falsch? Dann geben Sie uns doch bitte Bescheid. Bookware, Henkestraße 91, 91052 Erlangen Telefon: 0 91 31 / 89 03-0, Telefax: 0 91 31 / 89 03-55 E-Mail: Java User Groups JUG Hamburg Java User Group Hamburg http://www.jughh.org Deutschland JUG Berlin Brandenburg http://www.jug-bb.de Kontakt: Herr Ralph Bergmann ( JUG Karlsruhe Java User Group Karlsruhe http://jug-karlsruhe.de ( ) ) Java UserGroup Bremen http://www.jugbremen.de Kontakt: Rabea Gransberger ( JUGC Java User Group Köln http://www.jugcologne.org Kontakt: Herr Michael Hüttermann ( ) ) JUG DA Java User Group Darmstadt http://www.jug-da.de Kontakt: jugm Java User Group München http://www.jugm.de Kontakt: Herr Andreas Haug ( Java User Group Saxony Java User Group Dresden http://www.jugsaxony.de Kontakt: Herr Falk Hartmann ( ) rheinjug e.V. Java User Group Düsseldorf Heinrich-Heine-Universität Düsseldorf http://www.rheinjug.de Kontakt: Herr Heiko Sippel ( JUG Münster Java User Group für Münster und das Münsterland http://www.jug-muenster.de Kontakt: Herr Thomas Kruse ( ) JUG MeNue Java User Group der Metropolregion Nürnberg c/o MATHEMA Software GmbH Henkestraße 91, 91052 Erlangen http://www.jug-n.de Kontakt: ( ) ) JUG Deutschland e.V. Java User Group Deutschland e.V. c/o Stefan Koospal http://www.java.de ( ) ruhrjug Java User Group Essen Glaspavillon Uni-Campus http://www.ruhrjug.de Kontakt: Herr Heiko Sippel ( JUGF Java User Group Frankfurt http://www.jugf.de Kontakt: Herr Alexander Culum (a ) JUG Görlitz Java User Group Görlitz http://www.jug-gr.de [email protected] Seite 19 ) JUG Ostfalen Java User Group Ostfalen (Braunschweig, Wolfsburg, Hannover) http://www.jug-ostfalen.de Kontakt: Uwe Sauerbrei ( ) ) JUGS e.V. Java User Group Stuttgart e.V. , c/o Dr. Michael Paus http://www.jugs.org, Kontakt: Herr Dr. Micheal Paus ( ) , Herr Hagen Stanek ( ), Rainer Anglett ( ) Schweiz JUGS Java User Group Switzerland http://www.jugs.ch ( ) KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 User Groups .NET User Groups .NET Developers Group Stuttgart http://www.devgroup-stuttgart.net Deutschland Kontakt: Herr Michael Niethammer .NET User Group Bonn .NET User Group "Bonn-to-Code.Net" http://www.bonn-to-code.net ( Kontakt: Herr Roland Weigelt ) .NET User Group Dortmund (Do.NET) c/o BROCKHAUS AG http://do-dotnet.de Kontakt: Paul Mizel ( ) .NET Developer-Group Ulm c/o artiso solutions GmbH http://www.dotnet-ulm.de Kontakt: Herr Thomas Schissler ( ) Österreich .NET User Group Austria c/o Global Knowledge Network GmbH, http://usergroups.at/blogs/dotnetusergroupaustria/default.aspx Kontakt: Herr Christian Nagel ( ) Die Dodnedder .NET User Group Franken http://www.dodnedder.de Kontakt: Herr Udo Neßhöver, Frau Ulrike Stirnweiß ( ) Software Craftsmanship Communities .NET UserGroup Frankfurt http://www.dotnet-usergroup.de Deutschland, Schweiz, Österreich Softwerkskammer – Mehrere regionale Gruppen und Themengruppen unter einem Dach http://www.softwerkskammer.org Kontakt: Nicole Rauch ( ) .NET User Group Friedrichshafen http://www.dotnet-fn.de Kontakt: Tobias Allweier ([email protected]) .NET User Group Hannover http://www.dnug-hannover.de Kontakt: INdotNET Ingolstädter .NET Developers Group http://www.indot.net Kontakt: Herr Gregor Biswanger ( ) DNUG-Köln DotNetUserGroup Köln http://www.dnug-koeln.de Kontakt: Herr Albert Weinert ( .NET User Group Leipzig http://www.dotnet-leipzig.de Kontakt: Herr Alexander Groß ( Herr Torsten Weber ( .NET Developers Group München http://www.munichdot.net Kontakt: Hardy Erlinger ( .NET User Group Oldenburg c/o Hilmar Bunjes und Yvette Teiken http://www.dotnet-oldenburg.de Kontakt: Herr Hilmar Bunjes ( ) Frau Yvette Teiken ( Seite 20 ) ) ) ) ) Die Java User Group Metropolregion Nürnberg trifft sich regelmäßig einmal im Monat. Thema und Ort werden über www.jug-n.de bekannt gegeben. Weitere Informationen finden Sie unter: www.jug-n.de KaffeeKlatsch Jahrgang 9 / Nr. 11 / November 2016 meet the experts of enterprise infrastructure HTML5, CSS3 und JavaScript 23. Jan. 2017, 26. Juni 2017, 1.650,– € (zzgl. 19 % MwSt.) Scrum Basics 950,– € (zzgl. 19 % MwSt.) Entwicklung mobiler Anwendungen mit iOS 6. Feb. 2017, 17. Juli 2017, 1.250,– € (zzgl. 19 % MwSt.) Scrum im Großen – Agiles Organisationsdesign nach LeSS, 950,– € (zzgl. 19 % MwSt.) Einführung in die objektorientierte Programmiersprache Java – Eine praxisnahe Einführung 13. Feb. 2017, 10. Juli 2017, 2.150,– € (zzgl. 19 % MwSt.) Anwendungsentwicklung mit der Java Enterprise Edition 27. März 2017, 11. Sept. 2017, 2.150,– € (zzgl. 19 % MwSt.) Lesen bildet. Training macht fit. Software GmbH Henkestraße 91, 91052 Erlangen Telefon: 09131/ 89 03- 0 Telefax: 09131/ 89 03- 55 Internet: www.mathema.de E-Mail: [email protected] „Ich bin bei MATHEMA, weil hier gelebt wird, dass Software auch etwas mit Softskills zu tun hat.“ Thomas Bertz, Senior Consultant Wir sind ein Consulting- Unternehmen mit Schwerpunkt in der Entwicklung unternehmenskritischer, verteilter Systeme und Umsetzung von Service-orientierten Architekturen und Applikationen von Frontend bis Backend. Darüber hinaus ist uns der Wissenstransfer ein großes Anliegen: Wir verfügen über einen eigenen Trainingsbereich the s n joi t exper ture infrastruc se enterpri of Software GmbH Henkestraße 91, 91052 Erlangen und unsere Consultants sind regelmäßig als Autoren in der Fachpresse sowie als Speaker auf zahlreichen Fachkonferenzen präsent. Telefon: 09131 / 89 03- 0 Telefax: 09131 / 89 03- 55 Internet: www.mathema.de E-Mail: [email protected] Ansprechpartnerin: Britta Kolb Trends, Lösungen und Know-how für Profi-Entwickler 05. – 07.12.2016, Köln Kaffee klatsch - Lese r erhalt en 10 % R abatt mit Co de DD DevSessions Konferenz Workshops 05.12.2016 8 halbtägige Workshops 06.12.2016 1 Keynote, 12 Vorträge 07.12.2016 Ganztägiges Praxistraining C16KK Ihre Experten (u.a.): Bernd Marquardt Consultant und Autor IT-Visions.de Dr. Holger Schwichtenberg Fachlicher Leiter IT-Visions.de Gernot Starke Gründungsmitglied des iSAQB e.V. dotnet-developer-conference.de Veranstalter: David Tielke Trainer & Berater david-tielke.de #netdc16 Präsentiert von: Ralf Westphal Mitgründer der Clean Code Developer Initiative DDConference Das Allerletzte Dies ist kein Scherz! Dieses Ergebnis erzielte die Stack Overflow-Entwicklerumfrage – Deutschland Report 2016. Ist Ihnen auch schon einmal ein Exemplar dieser Gattung über den Weg gelaufen? Dann scheuen Sie sich bitte nicht, uns das mitzuteilen. Der nächste KaffeeKlatsch erscheint im Dezember. Seite 23 KaffeeKlatsch Jahrgang 9 / Nr. 11 / Novemver 2016 Herbstcampus Wissenstransfer par excellence 5. – 7. September 2017 in Nürnberg
© Copyright 2024 ExpyDoc