REST-Schnittstelle in JavaScript mit Node.js

Ich probiere gerade diverse MVVM-Frameworks (z.B. Knockout) aus und bei den Beispielen werden oft JSON-Daten mit Servern über REST-Schnittstellen ausgetauscht. Jetzt wird es also Zeit für einen eigenen kleinen Server, bei dem wir mit einfachen HTTP-Aufrufen Daten abfragen (GET), anlegen (POST), aktualisieren (PUT) und löschen (DELETE) können. In unserem Beispiel werden wir Bewertungen (Ratings) über folgende API verwalten:

Methode Pfad Beschreibung
GET /ratings Liste aller Bewertungen abfragen
GET /ratings/2 Bewertung mit der Id 2 abfragen
POST /ratings Erstellt eine neue Bewertung
PUT /ratings/2 Aktualisiert die Bewertung mit der Id 2
DELETE /ratings/2 Löscht die Bewertung mit der Id 2

Mir liegt ja eigentlich die Programmiersprache Java am besten, aber einen entsprechenden REST-Server in Java aufzusetzen (beispielsweise mit Spring-MVC und Tomcat) war mir etwas zu umständlich. Mit Ruby on Rails ist man sicherlich flotter am Start, wobei der Trend ja zu JavaScript auf dem Server liegt. Also Node.js schnell mal per Homebrew (bei MacOS) installieren.

brew update
brew install nodejs
brew info nodejs
brew install npm
brew info npm

Weiterlesen

Webdesign vereinfachen mit CSS-Framework Blueprint

Bei der Gestaltung von Webseiten muss der Webdesigner einiges beachten. Insbesondere die unterschiedlichen Darstellungen bei der Vielzahl von Browsern, Geräten und Betriebssystemen sorgen für einen erhöhten Aufwand bei der Umsetzung einer Webseite.

Wer sich viel Zeit und Frust ersparen möchte, entwickelt eine Webseite daher lieber nicht komplett alleine. Stattdessen sollte man sogenannte CSS-Frameworks als Grundgerüst einsetzen und damit die Erfahrungen vieler CSS-Experten nutzen. Die bekanntesten CSS-Frameworks sind:

Die genannten CSS-Frameworks bieten größtenteils ähnliche Funktionen an. Ich habe mich bei meiner Webseite für Blueprint als solide Basis entschieden, weil es besonders schlank ist und trotzdem reichhaltige Funktionen beinhaltet:

  • CSS-Reset, damit alle Browser gleiche Standardeinstellungen haben
  • ein Grid-System womit auch komplizierte Layouts möglich sind
  • gute typographische Voreinstellungen
  • Styling von Formularelementen
  • Stylesheet speziell für Ausdrucke
  • Plugins for Buttons, Tabs und Sprites
  • vielfältige Browserunterstützung (IE ab 6.0, Firefox ab 3.0, Opera ab 9.6)

Weiterlesen

Test-Driven-Development (TDD) mit den passenden Eclipse-Plugins

Die Entwicklungsumgebung Eclipse bietet für das Testen mit JUnit die JUnit-View. Um allerdings testgetrieben entwickeln zu können (Test-Driven-Development – TDD)  ist das etwas wenig. Jeder Entwickler, der es mit TDD ernst meint, sollte sich für effektives testgetriebenes Entwickeln (und mehr Spaß 😉 ) weitere Eclipse-Plugins installieren.

Während ich schon seit vielen Jahren die Plugins MoreUnit und EclEmma einsetze, habe ich erst vor kurzem bei der Java-User-Group Bremen (XING – JUG Bremen) das Plugin Infinitest kennengelernt. Was machen diese Plugins denn Schönes?

  • MoreUnit: Tests + Testmethoden anlegen und einfaches Wechseln zwischen Produktionscode und Testcode
  • Infinitest: kontinuierliches Ausführen der Tests im Hintergrund mit Testergebnis-Anzeige (rot / grün)
  • EclEmma: Überprüfung der Testabdeckung

Mit installierten Plugins können wir uns über viele zusätzliche nützliche UI-Elemente freuen und unser Eclipse sieht dann etwa folgendermaßen aus:

Editor mit einer "Klasse unter Test"

Editor mit einer „Klasse unter Test“

Weiterlesen

PSI-Probe – ein besserer Tomcat-Manager

Schnell mal eine Web-Anwendung im Tomcat deployen, sich einen Überblick über den Speicherverbrauch verschaffen oder einen Blick in die Log-Dateien werfen – mit PSI-Probe ist das bequem und einfach. PSI-Probe dient der Administration und Überwachung von Tomcat-Servern und bildet damit eine ausgezeichnete Alternative zu dem hauseigenen Tomcat-Manager.

Bei den zahlreichen Features sollte jeder Tomcat-Nutzer PSI-Probe mal ausprobiert haben:

  • einfache Installation als Web-Anwendung
  • Status von Web-Anwendungen anzeigen
  • deploy, start, stop, undeploy von Web-Anwendungen
  • Statistiken zu Sessions und Requests anzeigen
  • Log-Dateien sich live anzeigen lassen
  • System-Properties auflisten
  • Statistiken zu JVM und Garbage Collection
  • Statistiken zu CPU, Speicher, Datei-System
  • und vieles, vieles mehr …
Probe - Applications

Probe – Applications

Weiterlesen

Freemarker: Behandlung von undefinierten Werten

Die Standard-Templatesprache zur Generierung von Webseiten mit Java bilden die
Java Server Pages (JSP). Eine gute Alternative zu JSPs ist die Templatesprache Freemarker, mit der sich eine striktere Trennung zwischen Anwendungslogik und View durchsetzen lässt. Wie die Integration von verschiedenen Templatesprachen mit Spring-MVC erfolgt, habe ich in diesem Artikel beschrieben: Velocity, Freemarker, Jade4J – Alternativen zu JSPs

Beim Einsatz von Freemarker muss man darauf achten, dass alle Modell-Werte korrekt gefüllt sind, damit die Platzhalter im Template korrekt ersetzt werden können. Falls ein Wert nicht vorhanden ist, wird mit der Freemarker-Standardkonfiguration Folgendes passieren:

  1. Freemarker wirft eine Exception: freemarker.core.InvalidReferenceException
  2. die Fehlermeldung wird geloggt
  3. das weitere Generieren der Seite wird abgebrochen
  4. die Webseite zeigt dann eventuell eine halb fertig generierte Seite oder einen Stacktrace der Exception an

Das ist zwar während der Entwicklung ganz praktisch, aber die Anwender sollten natürliche keine fehlerhafte Seite sehen. Zur Vermeidung von Fehlermeldungen, wenn ein Wert nicht gesetzt ist, können wir folgendes tun:

  • Default-Werte im Template definieren
  • einen anderen Freemarker-Exception-Handler verwenden

Weiterlesen

Java-Webanwendung mit Tomcat auf Port 80 ausliefern

Ich arbeite ja ganz gerne mit der JiffyBox und der aktuellsten Ubuntu Langzeit-Support Version (Precise Pangolin – 12.04 LTS). Wenn man eine Java-Webanwendung mit Tomcat auf dem Standardport für Webserver (Port 80) bereitstellen möchte, gibt es dafür verschiedene Wege.

Die schnellste Möglichkeit könnte es sein, Tomcat per apt-get zu installieren und in der server.xml den Tomcat-Standardport von 8080 auf 80 zu ändern. Allerdings wird dann beim Starten des Servers ein Fehler auftreten. Schließlich werden Root-Rechte benötigt, um einen der ersten 1024 Ports zu reservieren:

Jan 22, 2013 11:53:51 PM org.apache.coyote.http11.Http11Protocol init
SEVERE: Error initializing endpoint
java.net.BindException: Permission denied <null>:80
        at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:549)
        at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176)
        at org.apache.catalina.connector.Connector.initialize(Connector.java:1049)
        at org.apache.catalina.core.StandardService.initialize(StandardService.java:703)
        at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:562)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.net.BindException: Permission denied
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353)
        at java.net.ServerSocket.bind(ServerSocket.java:336)
        at java.net.ServerSocket.<init>(ServerSocket.java:202)
        at java.net.ServerSocket.<init>(ServerSocket.java:158)
        at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:50)
        at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:538)
        ... 12 more
Jan 22, 2013 11:53:51 PM org.apache.catalina.core.StandardService initialize
SEVERE: Failed to initialize connector [Connector[HTTP/1.1-80]]
LifecycleException:  Protocol handler initialization failed: java.net.BindException: Permission denied <null>:80
        at org.apache.catalina.connector.Connector.initialize(Connector.java:1051)
        at org.apache.catalina.core.StandardService.initialize(StandardService.java:703)
        at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:562)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Jan 22, 2013 11:53:51 PM org.apache.catalina.startup.Catalina load

Natürlich gibt es viele Möglichkeiten, das Problem anzugehen. Hier jetzt eine dreckige und eine saubere Lösung:

  1. Schnell und unsicher (einfach dreckig): Eigenen Tomcat-Server installieren und als Root starten
  2. Aufwendiger und sicher (schöööön sauber): Standard Apache-Server und Tomcat installieren und per AJP (Apache JServ Protocol) miteinander verbinden

Weiterlesen

Not my department – 29C3 in Hamburg

Am Mittwoch war ich in Hamburg beim 29. Chaos Communication Congress (29C3) des Chaos Computer Clubs (CCC). Die viertägige Veranstaltung ist vom BCC (Berliner Congress Center) wegen Platzmangels nach Hamburg zurückgekehrt in das CCH (Congress Centrum Hamburg). Auf dem Kongress geht es nicht nur um das Hacken mit Computern, sondern es werden Vorträge zu technischen, gesellschaftlichen und politischen Themen gehalten. Die am Eingang ausgelegten Broschüren bestätigten jedem Gast, dass er/sie willkommen ist:

29C3 is a place for everyone to come together, get to know each other, work together on interesting projects, see what others are doing, exchange experiences and knowledge, a place to be curious and to enjoy yourself.

Obwohl ich nur den ersten Tag dabei war, hat sich die Reise nach Hamburg auf jeden Fall gelohnt. In der Keynote habe ich mir die Erläuterungen von Jacob Appelbaum zu dem 29C3-Motto ‚Not my department‘ angehört und anschließend Vorträge zu allerhand Themen verfolgt, die teilweise unglaubliches Staunen bei mir hinterließen.

Hier ein paar Links, mit denen man sich einen guten Überblick zu dem 29C3 verschaffen kann:


Weiterlesen

SMS versenden und empfangen mit BulkSMS

Die erste Kurzmitteilung des Short Message Service wurde am 3. Dezember 1992 (mit dem Text »Merry Christmas«) von einem PC an ein Mobiltelefon im britischen Vodafone-Netz gesendet.

[aus Wikipedia-Artikel zu ‚Short Message Service (SMS)‘: http://de.wikipedia.org/wiki/SMS]

Die erste SMS ist also schon fast 20 Jahre alt und ich habe noch nie eine SMS aus einer Anwendung heraus verschickt. Das wurde aber jetzt mal Zeit! Im Internet findet man eine Vielzahl von Anbietern, sodass man sich erst einmal überlegen sollte, welche Anforderungen eigentlich bestehen:

  • nur Senden von SMS oder auch Empfangen von SMS
  • wird Zuverlässigkeit beim Versand benötigt
  • Kosten der SMS (Einrichtungsgebühr, Anzahl der SMS)
  • API vorhanden für SMS-Versand/Empfang aus eigenem Programm
  • deutscher oder internationaler Anbieter
  • Zahlungsarten des Anbieters
  • Spezialwünsche: Anbieterkennung verschicken, eigene Rufnummer für den Empfang

Einen konkreten Vergleich der Anbieter habe ich im Internet nicht gefunden. Daher hier einen Verweis zu den Preislisten diverser Anbieter: sloono, SMSout, BulkSMS, SMS77. Von den Preisen und den angebotenen Leistungen unterscheiden sich die Anbieter nicht so sehr:

  • zuverlässig und schnell versendete SMS kosten 6-8 Cent/SMS
  • SMS mit unregelmäßiger Versanddauer kosten etwa 3 Cent
  • angebotene APIs sind beispielsweise HTTP, SOAP und E-Mail

Weiterlesen

Aufgaben zeitgesteuert ausführen mit Spring-TaskScheduler

Bei Geschäftsanwendungen wird häufig eine zeitgesteuerte Ausführung (Scheduling) von Aufgaben benötigt, wie beispielsweise das regelmäßige Abrufen eines Email-Kontos. Dabei unterscheidet man beim Scheduling prinzipiell zwischen zwei Arten:

  • eine Aufgabe zu einem bestimmten Zeitpunkt ausführen (z.B.: am 24.12.2012, um 18:00 Uhr)
  • Aufgaben in festgelegten zeitlichen Abständen wiederholt ausführen (z.B.: alle 20 Minuten)

Für Scheduling können wir im Java-Umfeld die Timer-Klassen (java.util.Timer + java.util.TimerTask) des JDKs benutzen oder eine Bibliothek einsetzen, wie den sehr mächtigen Quartz-Scheduler. Falls man allerdings in seiner Anwendung Spring 3 verwendet, sollte man sich auf jeden Fall dessen Möglichkeiten anschauen (Spring-Dokumentation: Task Executing and Scheduling):

  • Scheduling mit TaskScheduler und Runnable-Objekt
  • Scheduling mit Hilfe des Task-Namespaces von Spring
  • Scheduling aufgrund der Spring Scheduling-Annotations

Weiterlesen

Spannender 5-ter Bundesliga-Spieltag – Vorhersagen meines Groovy-Bots

Auf der botLiga-Webseite werden Entwickler dazu aufgerufen, ein Programm zur Vorhersage der Bundesliga-Spielergebnisse zu schreiben. Diese Programme, Bots genannt, treten gegeneinander an, indem sie vor jedem Spieltag die Ergebnisse der Fußball-Bundesliga tippen. Zu jedem Spieltag werden die Ergebnisse ausgewertet und entsprechend grafisch dargestellt.

Dieser 5. Spieltag fing für mich mit 14 Punkten aus den 4 Dienstagsspielen hervorragend an (und dem korrekt getippten 3:3 zwischen Frankfurt und Dortmund), aber leider brachten mir die 5 Spiele am Mittwoch keine weiteren Punkte ein. Damit bleibt mein ‚THOR10-Bot‘ noch im Mittelfeld, aber der wird schon noch einen Spitzenplatz gegen Ende der Saison ergattern. 😉

Ergebnisse des 5. Spieltags - die Dienstagsspiele waren super

Ergebnisse des 5. Spieltages – die Dienstagsspiele waren super

Weiterlesen