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

Werbeanzeigen

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

Velocity, Freemarker, Jade4J – Alternativen zu JSPs

Webanwendungen auf Java-Basis werden heutzutage größtenteils mit Hilfe eines umfangreichen Webframeworks (wie Java Server Faces, Google Web Toolkit oder Wicket) realisiert. Viele dieser Technologien bringen ihre eigene Templatesprache mit, die HTML um eigene Elemente erweitern. Falls man allerdings die Web-Basistechnologien Servlets/JSPs nutzt oder das Webframework neben JSPs auch andere Templatesprachen unterstützt (wie Spring MVC), wird der Einsatz einer alternativen Templatesprache vielleicht mit höherer Produktivität und mehr Spaß belohnt.

Solange man nur auf eine Templatesprache wie JSP beschränkt ist, braucht man sich auch keine Gedanken um die Effizienz der eingesetzten Sprache zu machen. Aber in diesem Artikel möchte ich dazu animieren, andere Templatesprachen mal auszuprobieren. Deren produktiven Einsatz sollte man sich natürlich zuvor gut überlegen – einige Aspekte sind beispielsweise:

  • Sprache: Einfachheit und Klarheit versus Ausdrucksstärke und Komplexität
  • Erweiterungen: Erstellung und Einbindung von Bibliotheken (z.B.: Tag-Libraries für JSPs)
  • Werkzeuge: Unterstützung innerhalb von Editoren/IDEs (z.B.: Syntax-Highlighting)
  • Mitarbeiter: Know-How im Team und Bereitschaft neue Sprachen zu lernen

Weiterlesen

Webseiten für Smartphones ausliefern durch Auswertung des User-Agents

Mit dem Handy im Internet surfen gehört für viele Smartphone-Besitzer zum Alltag. Wegen der geringeren Bilschirmauflösung bieten viele Webseiten eine optimierte schmalere Version für mobile Geräte an. Oft sind diese Seiten dann unter ‚m‘ statt ‚www‘ erreichbar und sie werden auch in einem normalen Desktop-Browser angezeigt: m.wikipedia.org , m.zalando.de oder m.tagesschau.de

Falls eine Webseite auch für Smartphones optimiert ist, muss der Server nach einer Anfrage der ‚www‘-Webseite erst einmal ermitteln, ob der anfragende Browser auf einem Desktop-Rechner oder einem Smartphone ausgeführt wird. Falls es sich um ein Smartphone handelt, wird auf die ‚m‘-Webseite mit einem Redirect (z.B. HTTP-Code 302: Moved Temporarily) weitergeleitet.

Woher weiß der Server nun, welche Version der Webseite ausgeliefert werden muss. Der Browser übermittelt bei einer Anfrage einige Header-Informationen, wie zum Beispiel das Feld ‚User-Agent‚, das Auskunft über den verwendeten Browser gibt. Damit kann der Server bewerten, mit was für ein Gerät der Anwender surft (siehe auch Wikipedia-Artikel: Mobile Device Detection).

Internet Explore 6 auf Windows XP:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Firefox 13 auf Mac OS X:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1

IPhone 4.3:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; de-de) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8F190

Samsung Galaxy II:
Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Weiterlesen

Migration der Konfigurationsdateien des m2e-Plugins (Maven Integration for Eclipse)

Mit dem Eclipse-Plugin m2e (m2eclipse) ‚Maven Integration for Eclipse‘ kann man innerhalb von Eclipse die Mächtigkeit von Maven nutzen. Das Plugin ist mit der 1er-Version von Sonartype zu Eclipse umgezogen, wobei vorhandene Konfigurationen nach dem alten Plugin mit der neuen Plugin-Version nicht mehr funktionieren.

Wenn wir ein bestehendes Projekt mit der Konfiguration nach dem alten Plugin haben, müssen wir nur ein paar Einträge in den Eclipse-Konfigurationsdateien ändern, damit das Projekt mit dem neuen Eclipse-Plugin wieder funktioniert. Die folgenden Anpassungen habe ich mit Eclipse Indigo und der m2e-Version 1.0.100.20110804-1717 ausprobiert.

Zunächst müssen wir die .project-Datei anpassen. Dort müssen wir erst einmal den Nature-Eintrag von

<nature>org.maven.ide.eclipse.maven2Nature</nature>

auf

<nature>org.eclipse.m2e.core.maven2Nature</nature>

ändern, damit das Projekt als m2e-Projekt erkannt wird. Dann müssen wir noch den Builder-Eintrag von

<buildCommand>
   <name>org.maven.ide.eclipse.maven2Builder</name>
   <arguments>
   </arguments>
</buildCommand>

auf

<buildCommand>
   <name>org.eclipse.m2e.core.maven2Builder</name>
   <arguments>
   </arguments>
</buildCommand>

anpassen, sodass der korrekte Builder beim Erstellen des Projekts genutzt wird. Damit sollten alle m2e-Funktionalitäten im Eclipse-Projekt wieder verfügbar sein. Allerdings compiliert das Projekt vielleicht noch nicht.

Wir müssen in der .classpath-Datei noch den Eintrag für die Variable MAVEN2_CLASSPATH_CONTAINER anpassen, damit die Java-Librarys von Maven auch eingebunden werden. Dafür ändern wir die Zeile

<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>

auf

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>

um. Jetzt sollte in der ‚Package Explorer‘-View ein Library-Eintrag „Maven Dependencies“ mit den entsprechenden Java-Librarys vorhanden sein und das Projekt ohne Fehler compilieren.

Es gibt übrigens hier ein kostenloses Online-Buch zu m2e von Sonartype, das allerhand Tipps im Umgang mit dem m2e-Plugin bietet.

GeoJSON erzeugen mit Java

Bei der Webentwicklung hat sich für den Austausch von Daten zwischen Server und Client das JSON-Format bewährt. Es ist gegenüber XML kompakter, lässt sich trotzdem einfach lesen und wird von JavaScript direkt in verwendbare Objekte umgewandelt. Eine spezielle JSON-Ausprägung für geografische Daten bildet das GeoJSON-Format. Dieses Format wird auch von OpenLayers unterstützt, sodass man keinen umfangreichen JavaScript-Umwandlungscode schreiben muss. Der folgende GeoJSON-Code enthält die Daten mit Geo-Koordinaten für drei Plätze in meiner Heimat:

{ "type": "FeatureCollection", "features": [
{ "type": "Feature", "id": 1, "properties": { "name": "", "image": "playground.png"} , "geometry": { "type": "Point", "coordinates": [8.5864, 52.8988] } },
{ "type": "Feature", "id": 2, "properties": { "name": "Balkan-Restaurant", "image": "restaurant.png"} , "geometry": { "type": "Point", "coordinates": [8.5992, 52.9106] } },
{ "type": "Feature", "id": 3, "properties": { "name": "carpe diem", "image": "hairdresser.png"} , "geometry": { "type": "Point", "coordinates": [8.5873, 52.9079] } }
] }

Wie wird jetzt dieser GeoJSON-Code serverseitig generiert? Da GeoJSON auch normales JSON ist, können wir es genauso generieren, wie wir JSON generieren würden. Manche Sprachen unterstützen die Transformation zwischen Objekten und JSON direkt:

  • JavaScript: JSON.stringify($object) und JSON.parse($string)
  • PHP: json_encode($object) und json_decode($string)

In Java müssen wir selber Code dafür schreiben oder eine entsprechende Bibliothek nutzen. Zum Glück gibt es allerhand Java-Bibliotheken für JSON. Mit den Bibliotheken org.json, json-simple und Jackson habe ich ausprobiert, wie leicht das Erzeugen von JSON mit solchen Bibliotheken von der Hand geht. Das ist nur eine kleine Auswahl von den über 20 auf json.org aufgelisteten Bibliotheken.

Weiterlesen