Script your Server!

August 18th, 2019

In fast jedem Softwareprojekt wird die Applikation auf mehrere Server mit unterschiedlichen Konfigurationseinstellungen installiert und betrieben. Neben der Konfiguration für die Produktivumgebung müssen auch die Konfigurationen für Staging- und Entwicklungsserver verwaltet werden. Beispielsweise benötigt die Staging-Instanz andere Datenbankeinstellungen als die Produktivinstanz.

Somit kommen bei einem Projekt schnell mal 6 Konfigurationsversionen zusammen:

  • dienstleister-devlocal (lokale Entwicklungsinstanz)
  • dienstleister-dev (zentrale Entwicklungsinstanz)
  • dienstleister-sta (Staging System beim Dienstleister)
  • kunde-sta (Staging System beim Kunden)
  • kunde-productive1 (Produktiv-System – Cluster 1)
  • kunde-productive2 (Produktiv-System – Cluster 2)

Jede Konfigurationsversion setzt sich aus einer Vielzahl von Dateien zusammen, die sich noch in unterschiedlichen Pfaden befinden. Wenn zudem noch ein Produkt einsetzt wird, (z.B. Day Communiqué oder Hybris) kommt man leider ab und an in die Verlegenheit Dateien des Produktes (z.B. JavaScripts) zu überschreiben. Weiteres Beispiel ist die Installation von DLLs (z.B. bei Verwendung des SAP JCO Connectors).

Das Problem ist: Manuelles Pflege auf allen Servern ist langsam, fehleranfällig und nicht zuletzt unglaublich langweilig. Die Lösung ist recht simpel: Automatisieren, Automatisieren, Automatisieren, Automatisieren… Dabei trennt man das Projekt strickt von den eigentlichen Konfigurationsdateien. Diese Trennung spiegelt sich auch im Subversion wieder.

Beispiel Projekt im Subversion:
/project<br /> /project/core/branches<br /> /project/core/tags<br /> /project/core/trunk<br />

Beispiel Konfiguration im Subversion:
/project_configuration<br /> /project_configuration/branches<br /> /project_configuration/tags<br /> /project_configuration/trunk<br /> /project_configuration/trunk/scripts<br /> /project_configuration/trunk/instance/dienstleister-devlocal<br /> /project_configuration/trunk/instance/dienstleister-dev<br /> /project_configuration/trunk/instance/dienstleister-sta<br /> /project_configuration/trunk/instance/kunde-sta<br /> /project_configuration/trunk/instance/kunde-live1<br /> /project_configuration/trunk/instance/kunde-live2<br />
Auf jedem Server wird /project/core und /project_configuration ausgecheckt. Aber wie kommen Konfiguration und Projekt zusammen ? Dies geschieht über ANT-Skripte, die aus einem ausgecheckten Projekt eine lauffähige, serverabhängige Installation generieren. Dabei werden die Dateien aus dem jeweiligen Konfigurationsverzeichnis (z.B. dienstleister-devlocal) in das Projektverzeichnis kopiert und ggf. vorhandene Dateien überschrieben.

Somit kann in wenigen Minuten eine komplette Instanz installiert werden. Weiter vereinfacht wird das Ganze, wenn .bat Dateien (oder Shellscripte) diese ANT-Skripte aufrufen.

Beispiel Skriptaufruf:
checkout-project-configuration.bat (Checkt das Konfigurationsprojekt aus dem Subversion)
checkout-project.bat (Checkt das Projekt aus dem Subversion aus)
configure-dienstleister-devlocal.bat (Konfiguriert das Projekt mit “dienstleister-devlocal” Konfiguration)

Fazit:
Durch das Automatisieren sämtlicher Konfigurations- und Installationsdateien werden Flüchtigkeitsfehler vermieden und das Aufsetzen von Serverinstallationen erheblich beschleunigt. Das Programmieren solcher Konfigurationsskripte kostet zwar zu Beginn des Projekts etwas Zeit, diese Investition wird aber doppelt und dreifach wieder amortisiert.

Caching mit OSCache Teil 1

June 18th, 2019

Caching spielt bei der Entwicklung von Webapplikation eine entscheidende Rolle. Nicht jedes Element auf einer Seite soll bei einem Request komplett neu generiert werden. Beispiel dafür sind RSS-Feeds, die in Form einer Newsliste auf einer Homepage dargestellt werden. Hier soll nicht bei jedem Request der RSS-Feed vom anderen Server abgeholt und neu geparst werden, da jedes Einlesen mit erheblichen Zeitaufwand verbunden ist.

Eine typische Lösung ist, den RSS-Feed nach dem ersten eintreffenden Request für eine Zeitspanne (z.B. für eine Stunde) im RAM zu halten. Jeder weitere Request innerhalb dieser Zeitspanne verwendet das gecachte Objekt. Nach Ablauf dieser Zeitspanne verfällt der Cacheeintrag und der nächste Request sorgt dafür, dass der RSS-Feed neu generiert wird und wieder in den Cache abgelegt wird.

Man kann sich so einen Cachingmechanismus mit Hilfe einer HashMap und einem Object-Wrapper selber bauen. Oder man spart sich die Arbeit und nutzt ein vorhandenes Caching-Framework wie OSCache von OpenSymphony.

OSCache bietet generische Caching-Klassen mit unterschiedlichen Cache-Algorithmen wie Least Recently Used oder FIFO. Die Cache-Einträge können zudem persistiert werden, damit sie einen Webserver Neustart überleben und nicht neu generiert werden müssen.

Mehr zum Einsatz dieser Cache-Bibliothek gibts im zweiten Teil.

JavaScript Verifier: JSLint

May 3rd, 2019

Manchmal darf man als Java-Entwickler auch JavaScript programmieren. Dabei stört mich der fehlende Compiler, der den Code auf Tippfehler oder versehentlich definierte globale Variablen überprüft. Abhilfe schafft JSLint, ein JavaScript Programm, das JavaScript validiert. Neben Fehlern werden auch Coderichtlinien wie Klammersetzung oder Variablennamen berücksichtigt.

Abschliessend noch ein Zitat von Douglas Crockford (Entwickler von JSLint):

JSLint will hurt your feelings

Ruby / JRuby in Netbeans 6.0

March 9th, 2019

Ruby bzw. JRuby könnte demnächst auch für einige Java-Entwickler interessant werden, denn Sun erweitert ihre Netbeans IDE um eine Ruby / JRuby Unterstützung. Bereits im Vorfeld wurde dieser Schritt vermutet, da Sun die beiden JRuby-Entwickler im letzten Jahr eingestellt hatte. Mit der offiziellen Unterstützung von Sun steigt die Wahrscheinlichkeit, dass Kunden sich für eine Implementierung in Ruby bzw. JRuby entscheiden.

Einen ersten Einblick verschaffen folgende Screencasts :
http://www.netbeans.org/download/flash/jruby_on_rails/jruby_on_rails.html
http://www.netbeans.org/download/flash/jruby_editing/jruby_editing.html

trakkcor-0.1.1

March 8th, 2019

gibts ab heute hier zum download.

Die Version 0.1.1 ist ein Patchrelease mit kleineren Bugfixes und Änderungen. Beispielsweise gab es noch einen Fehler beim Parsen von NMEA Messages, wenn die Empfangsqualität (GPS Quality Indicator) schlecht war.

Viel Spass beim Ausprobieren. Wenn es wider Erwarten Probleme geben sollte, gleich hier als Kommentar posten.
Danke.

Yahoo! User Interface Library(YUI)

December 28th, 2018

Mit dem Web 2.0 Hype kam eine Vielzahl von Javascript Frameworks. Neben der obligatorischen Unterstützung für asynchrone Requests bieten diese Frameworks auch zusätzliche Features wie Animation oder eigene UI-Controls. Diese Woche habe ich mir die Yahoo! User Interface Library (YUI) genauer angeschaut und bin bis jetzt begeistert.

Typischerweise zeichnen sich die bisherigen JavaScript Frameworks wie Dojo oder Rico durch eine eher dürftige Dokumentation aus. Dagegen ist die YUI Library von Yahoo vorbildlich dokumentiert. Besonders gefällt mir die hohe Anzahl an Code-Beispielen und die “Cheat Sheets”, die eine sehr schnelle Einarbeitung in die Library ermöglichen.

Beispiele:
Cheat Sheet für das “Animation” Modul
Dokumentation für das “Autocomplete” Modul

Ach ja: Die Library ist Open Source (unter der BSD Lizenz).

Commons Fundstücke: StringEscapeUtils, EqualsBuilder und DateUtils

December 17th, 2018

Die Fundstücke kommen diesmal ebenfalls aus der commons lang Bibliothek.

  1. org.apache.commons.lang.StringEscapeUtils

    Bietet Methoden für Escaping und Unescaping für die Sprachen Java, JavaScript, HTML, XML und SQL.

  2. org.apache.commons.lang.builder.EqualsBuilder

    Erleichtert die Programmierung für equals Methode nach den
    Regeln aus dem Buch “Effektiv Java programmieren” von Joshua Bloch.

    Analog dazu
    org.apache.commons.lang.builder.HashCodeBuilder
    org.apache.commons.lang.builder.ToStringBuilder
    org.apache.commons.lang.builder.CompareToBuilder

  3. org.apache.commons.lang.time.DateUtils

    Mehrere Methoden rund um Date und Calendar. Praktisch ist beispielsweise die
    round Methode, die das Date Objekt nach dem übergebenen Kriterium (bsp. Calendar.MONTH) rundet.

HttpSession über mehrere Webapplikationen?

December 10th, 2018

Webapplikationen können über die HttpSession keine Daten austauschen, da eine HttpSession immer an einen ServletContext gebunden ist. Wenn eine Webapplikation eine andere Webapplikation über den RequestDispatcher inkludiert, wird zwar eine Session mit der gleichen(!) SessionID erzeugt, es sind aber effektiv zwei HttpSession Objekte vorhanden.
Vergleiche Servlet Specification 2.4. (Kapitel 15.1.7)

Session information is scoped only to the current web application
(ServletContext), so information stored in one context will not be directly visible
in another.

Auch für JSR 168-konforme Portlets gelten diese Restriktionen. So konnen Portlets nur innerhalb der gleichen PortletApplication gemeinsame Daten austauschen. (Eine PortletApplication wird mit Hilfe einer Webapplikation realisiert). Diese Restriktion soll mit JSR 286 aufgehoben werden. Im Early Draft Review werden sogenannte “Shared Session Attribute” vorgestellt. Hier definiert der Portlet-Entwickler die gemeinsamen Session Attribute in der portlet.xml. Das JAXB Framework (Java Architecture for XML Binding) wird verwendet, um den Typ des Session Attributes zu beschreiben. Konkret bedeutet dass, das die Klasse für das Shared Attribut mit JAXB Annotations versehen wird. So kann das Attribut auch in anderen VMs ausgelesen werden, da die Klasse mit Hilfe von JAXB wieder zusammengebaut wird (Stichwort “marshalling”).

Commons Fundstücke: StopWatch

December 5th, 2018

Diese neue Artikelserie stellt kleine, eher unspektakuläre, aber dennoch sehr praktische Klassen aus dem Jakarta Commons Projekt vor. Wir beginnen mit der StopWatch Klasse aus der commons lang Bibliothek.

Die StopWatch Klasse erlaubt bequeme Messung von Zeitabständen ohne die händische Verwendung der System.currentTimeMillis() Methode. Typisches Einsatzgebiet sind Performancemessungen (”Wie lange braucht mein Code für die Ausführung”). Der Dedizierten Entwickler Teams kann jederzeit den aktuellen Status abfragen und bei Bedarf die StopWatch auch pausieren.

Beispielcode:

  1. import org.apache.commons.lang.time.StopWatch;
  2. StopWatch stopWatch = new StopWatch();
  3. stopWatch.start();
  4.  
  5. // Zeitaufwändige Aktion
  6.  
  7. // Pausieren der StopWatch
  8. stopWatch.suspend();
  9.  
  10. // Fortführen der Messung
  11. stopWatch.resume();
  12.  
  13. // Stoppen und verbrauchte Zeit ausgeben.
  14. stopWatch.stop();
  15. long neededTime = stopWatch.getTime();
  16. System.out.println(“needed time (in ms): “ + neededTime);

trakkcor – bluetooth gps tracking

November 26th, 2018

Mein Open-Source Projekt “trakkcor” (vormals “hikr”) ist in der ersten stabilen Version auf Sourceforge verfügbar. Um was gehts? trakkcor ist ein J2ME-Midlet, dass Positionsdaten eines externen Bluetooth GPS-Empfängers aufzeichnet und bei Bedarf via HTTP POST an einen beliebigen Server schickt. Der Server kann die empfangenen Positionsdaten weiterverarbeiten und beispielsweise den Track über Google Maps darstellen.

Mehr Details gibts unter http://www.trakkcor.ch

Screenshot

trakkcor auf einem Sony Ericsson W800i.