Scandio ist Gastgeber der Atlassian User Group am 19. Mai

Atlassian User Group München

Am 19. Mai 2015 findet ab 17 Uhr (Vorträge ab 18 Uhr) das Treffen der Atlassian User Group München in den Räumen der Scandio GmbH statt. Die Agenda beinhaltet interessante Vorträge zum Thema Confluence und JIRA, Lightning Talks  zum Thema Docker, Outlook/Jira runden den Abend ab. Zum Abschluss können interessierte Besucher Fragen in einer Fish Bowl Session diskutieren. Für Getränke, Pizza und das ein oder andere Bier wird natürlich gesorgt sein. Die Teilnehmerzahl ist auf 50 beschränkt. Anmeldungen sind bei XING und Meetup möglich.

Symfony 2 Webapplikation auf IIS 7.5 mit php 5.3 – Performanceanalyse und Optimierung

Eine Symfony 2 Webapplikation fiel durch extreme Performanceprobleme auf. Die Anwendung läuft auf einem IIS 7.5 mit php 5.3.13.

Die Analyse und Auswertungen mit xdebug und kcachegrind ergaben, dass die php Funktionen filemtime, file_exists, file_put_contents und file_get_contents sehr oft ausgeführt wurden und auch sehr lange Laufzeiten aufzeigten. Symfony 2 nutzt diese Funktionen exzessiv.

Die langen Laufzeiten sind einem php Bug in der genutzten Version geschuldet, der ein Fehlverhalten des realpath_cache zur Folge hat, sobald open_basedir oder safe_mode aktiviert ist.

Durch das Abstellen der open_basedir Direktive und das Einstellen des realpath_cache konnten in unserem Fall die langen Laufzeiten für die php::file* Funktionen auf fast 1/10 reduziert werden.

realpath_cache_size = 4096k
realpath_cache_ttl = 3600
; open_basedir = C:\

Aber Achtung! Die Auswirkungen, die das Deaktivieren der open_basedir Direktive nach sich ziehen müssen je nach System, Webapplikation und Erreichbarkeit kritisch bewertet und geprüft werden!

Weitere Möglichkeiten…

(die nicht durchgeführt wurden)

  1. Update auf php 5.5 64 bit non-thread-safe libraries und das Aktivieren des opcache
    http://windows.php.net/
  2. Installation der Software Wincache
    http://us2.php.net/manual/en/intro.wincache.php
  3. Migration der Applikation von Windows auf ein *nix System

 

Integration clientseitiger Bibliotheken mittles WebJars – Web Libraries in Jars

Die Nutzung von WebJars – Web Libraries in Jars ist eine clevere Methode um clientseitige Bibliotheken als Abhängigkeit in javabasierte Anwendungen einzubinden. Auf der Platform webjars.org, die seit Oktober 2012 online ist, werden vorhandene Webjars veröffentlicht und alle dort gehosteten Jars sind auch im Maven Central Repository verfügbar.

Aufbau

Bei einem Webjar handelt sich um ein Maven Artifakt bestehend aus nur einer pom.xml Datei. Als kompiliertes Jar stellt es die clientseitig notwendigen Ressourcen über das META-INF Verzeichnis zur Verfügung. Dabei wird die Servlet 3.0 Spec genutzt, in der unter anderem definiert ist, dass alles was unterhalb des META-INF/resource Verzeichnis als statische Resourcen verfügbar ist.

|-pom.xml
|-README.md
|-target
|---classes
|-----META-INF
|-------resources
|---------webjars
|-----------jvectormap
|-------------2.0.1
|---------------jquery-jvectormap.css
|---------------jquery.jvectormap.min.js
|---------------jvectormap.jquery.json
|---------------LICENSE-COMMERCIAL
|---------------LICENSE-GPL
|---------------README.md

“Build your own Webjar” – Beispiel jVectorMap

Gibt es noch kein Webjar für die benötigte JavaScript Bibliothek, kann in wenigen Schritten ein eigenes WebJar erstellt werden. Das Grundgerüst der pom.xml erstellen wir anhand der Anleitung Webjars – Contributing. Danach fügen wir in den Buildprozess die eigentlich Ausführungsschritte ein, um die nötigen Resourcen in den Ziel Ordner zubekommen.

Im Buildprozess kommen in unserem Fall die Maven Plugins wagon-maven-plugin , maven-antrun-plugin und yuicompressor-maven-plugin bei den folgenden Schritten zum Einsatz.

  • Herunterladen der ZIP Datei ( wagon-maven-plugin )
  • Entpacken der Zip Datei (maven-antrun-plugin)
  • Kopieren der CSS Resourcen und Lizenz Dateien (maven-antrun-plugin)
  • Zusammenfügen der JavaScript Dateien (yuicompressor-maven-plugin)

Die komplette pom.xml Datei ist auf GitHub verfügbar.

Beispiel Integration Spring MVC

Hinzufügen der Maven Dependency

<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>jvectormap</artifactId>
	<version>2.0.1</version>
</dependency>

Einbindung in das Template

<script type='text/javascript' src='${pageContext.request.contextPath}/webjars/jvectormap/2.0.1/jquery.jvectormap.min.js'></script>

Wird zum Beispiel Spring MVC mit Spring Security eingesetzt, dann muss der Pfad zu den Resourcen verfügbar gemacht werden. Zum Beispiel über die WebMvcSecurityConfiguration

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/webjars/**");
}

Die Entscheidung, ob der komplette Webjar Context Pfad oder nur einzelne Webjar freischaltet werden sollen liegt beim Entwickler.

Fazit

Mittels Webjars lassen sich clientbasierte Bibliotheken genauso einfach als Dependency einbinden und verwalten wie geläufige Java Artifakte.

Wird ein neues Webjar erstellt, bieten sich zwei Möglichkeiten der Verteilung an. Die Beste ist, es an die Community weiterzureichen (Webjars – Contributing, GitHub Webjars).

Ist das nicht möglich kann man es natürlich auch intern über den eigenen Repository Manager (Nexus o.ä.) anderen Entwicklern oder dem Continuous Integration & Build Server (Bamboo, Jenkins o.ä.) zur Verfügung zu stellen.

Atlassian User Group am 26.2.2015

Am 26.2.2015 finden die Atlassian User Group München in den Räumen Stylight statt. Wie immer haben die Organisatoren, die auch von der Scandio unterstützt werden, ein tolles Programm zusammengestellt. Auch wir sind mit zwei Vorträgen beteiligt. Dabei wird auch ein neues Plugin im Marketplace vorgestellt. Mehr über die Veranstaltung kann man auf www.aug-muc.de erfahren. Derzeit sind noch einige Plätze frei.

Java SE 6 Runtime Meldung unter Mac OS X Yosemite

“To open XYZ you need to install the legacy Java SE 6 runtime.”

Diese Meldung kommt so gut wie immer, wenn ich ein Java-basiertes Programm auf dem Mac öffnen möchte.
Screenshot 2015-02-11 09.00.47

Hintergrund ist, dass Apple mit dem Update auf OS X Yosemite 10.10.2 (14C109) alle Java Version kleiner als Java 8 deaktiviert hat. Warum das nicht an die Hersteller kommunziert wurde und diese immer noch in den Mac Packages das JRE 1.6 eintragen erschließt sich mir nicht. Auf der Oracle Seite Information and system requirements for installing and using Oracle Java on Mac OS X findet sich dazu nur ein kurzer Hinweis

Oracle’s Java version 7u25 and below have been disabled by Apple on OS X. Updating to the latest release will allow Java to be run on Mac OS X.

Leider bringt einen die Installation von Java 8 alleine nicht ans Ziel, sondern es muss noch der Startparameter des Programms oder die JRE Version geändert werden.

Dazu im Finder mittels Rechtsklick auf die Applikation das Context Menü öffnen und Show Package Contents auswählen. Als nächstes öffnet Ihr die Datei Info.plist im Editor Eurer Wahl und sucht die Stelle an der das JRE oder der Pfad zur JavaVM angegeben ist.

YgCQ4flDj5

Nun passt Ihr das JRE an Eure Java Version an und speichert die Datei. Eure Version erfahrt Ihr über folgendes Kommando im Terminal.

java -version

Das Verzeichnis der aktuell installierten Java VM(s) befindet sich hier

/System/Library/Frameworks/JavaVM.framework/Versions"

Auszug aus der Info.plist Datei bei Jasper Reports Studio
Vorher

  <key>Eclipse</key>
    <array>
      <!-- to use a specific Java version (instead of the platform's default) uncomment one of the following options:
        <string>-vm</string><string>/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Commands/java</string>
        <string>-vm</string><string>/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Commands/java</string>
      -->

Nachher

  <key>Eclipse</key>
    <array>
      <string>-vm</string><string>/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java</string>

Bei yED ist zum Beispiel nur die Versionnummer in der Info.plist Datei angegeben. Hier müsste als nur die Versionsnummer ausgetauscht werden und ob das JRE oder das JDK installiert ist.

<key>JVMRuntime</key>
<string>1.8.0_25.jdk</string>