Internet Zugang in Frankreich: Mobil, temporär und billig

Am Eingang zur Roaming-Hölle (1 MB bei Swisscom für CHF 3.-) habe ich eine Lösung für Frankreich gesucht und gefunden. Kostenpunkt sind EUR 9.90 für 3 Tage unlimited mit dem “Kit 3G+ iPad” von France Télécom inklusive einer Micro SIM. Anbei die ganze Geschichte.

1) Man kaufe ein “Kit 3G+ iPad”

Im “iPad-Rausch” hat SFR (France Télécom) ein Angebot für EUR 9.90 lanciert. Ich habe das das Pack (3 Tage unlimitierter Zugang inkl. ein Micro SIM) in der Fnac gekauft. Da eine Verlängerung des Zugangs pro Tag EUR 6.- (!!) kosten würde, könnte man durchaus versucht sein, ein paar Pakete zu kaufen ;-)

2191-kit-3g-sfr-ipad.JPG

Da es sich um ein Prepaid handelt (kein Voice und kein SMS, nur Data) muss man seine Personalien per Post oder in einem SFR-Shop belegen, sonst wird das Abo nach 15 Tagen deaktiviert. Da ich es aber nur drei Tage nutzen werde…

2. Die Konfiguration fürs iPad

Als erstes habe ich die Micro SIM in mein iPad gesteckt und über einen “Subscriber Update” (leider nur mit iTunes und einem alternativen Internet-Zugang) erhalten. Dieser ist aber nicht notwenig resp. das einzige was ich wissen und einstellen muss ist, der APN von SFS mit dem Namen websfr

2192-apn-sfr-ipad.jpg

3. Und nun die Skalierung ;-)

Für die meisten Leute genügen die ersten Schritte, da wir aber rund 10 Geräte dabei haben die über WLan gerne Internet-Zugang hätten, nun der spannendste Schritt ;-) Ich habe aus der Verpackung des Kits eine Adapter Micro SIM <> SIM geschnitzt. Das Ding sieht wie folgt aus und ist praktisch für einen “erweiterte Nutzung” ;-)

2193-rahmen-sim-micro_sim.JPG

Die nun so gewachsene SIM setzte ich (zusammen mit dem Wissen, dass der APN websfr heisst) in einen WLan <> GMS Router in. In meinem Fall ist es die Software JoikuSpot auf meinem Nokia Telefon, jedes Android 2.2 kann es von Haus aus, beim (genackten) iPhone wäre es PdaNet oder halt ganz normale Hardware (z.B. bei Swisscom).

PS: Nach 2 Tagen (und über 2 GBit Traffic) kann ich die Lösung nur empfehlen…

Veröffentlicht unter Allgemein | Verschlagwortet mit

Neu in JSF2, Teil 1: Facelets und GET Requests

Mittlerweile ist Java EE 6 bereits mehr als sechs Monate alt. Höchste Zeit also für Java Entwickler und Architekten, sich mit den Neuerungen zu befassen. Als Dienstleister rund ums Web stehen für Namics natürlich die neuen Features rund um Web-Applikationen im Fokus. Eines der wichtigsten Unterprojekte von Java EE in diesem Umfeld sind die JavaServer Faces (JSF). Dieses Framework für den View-Layer der Applikation hat inzwischen einige Jahre auf dem Buckel, wurde jedoch von ehemals Sun, nun Oracle, stetig weiterentwickelt und hat viele Verbesserungen der Open Source Gemeinde in den neuen Standard 2.0 aufgenommen. JSF gehört zu den Bestandteilen von Java EE, bei denen die weitreichendsten Neuerungen vorgenommen wurden. Wir bei Namics haben bereits ein grösseres Projekt unter Verwendung von JSF2 durchgeführt und uns daher etwas genauer damit beschäftigt.

Im Rahmen einer kleinen Reihe im Blog werde ich ein paar interessante Neuerungen des Frameworks vorstellen. Bestandteil jedes Artikels ist immer auch ein lauffähiges Beispiel-Projekt, welches die besprochenen Features sowohl zur Laufzeit als auch im enthaltenen Quellcode illustriert.

Setup

Applikationen mit JSF2 sind immer noch normale Java-Web-Applikationen ohne spezielle Abhängigkeiten bezüglich Java EE 6. Damit sind sie auch in jedem halbwegs aktuellen Servlet-Container lauffähig und erfordern keinen speziellen Applikationsserver. Falls im Web-Container vorhanden, kann man jedoch die Vorzüge von Servlet 3.0, einer weiteren Java EE 6 Neuerung, nutzen. Durch dessen annotation-based Konfiguration von Servlets und Filtern erfordert JSF2 keine Konfiguration mehr. Es reicht, die Libraries in die Applikation aufzunehmen, den Rest erledigt der Container automatisch. Das FacesServlet, welches den JSF-Kontext bei Zugriffen initialisiert, wird dann auf “*.jsf” gemappt. Gerade zum Aufsetzen des Projekts ist das sehr praktisch und erlaubt es dem Entwickler, sofort loszulegen.

Durch Servlet 3.0 kann man sogar auf den Deskriptor der Applikation, die web.xml Datei, komplett verzichten. Dasselbe gilt für die JSF-eigene Konfigurationsdatei “faces-config.xml”. Sie ist optional und dank der neuen annotation-based Konfiguration von JSF selbst wird sie auch nur noch in speziellen Fällen benötigt. Hierzu später mehr.

Diese Erleichterungen sind optional, man kann JSF weiterhin auch in der web.xml konfigurieren um auch noch für Servlet 2.x lauffähig zu bleiben, und eine erstellte faces-config.xml Datei wird ebenfalls genutzt sofern sie vorhanden ist.

Um die Vorteile demonstrieren zu können, nutzt die angehängte Beispielapplikation Servlet 3.0, z.B. im neuen Apache Tomcat 7.0 .

View

Mach’s gut, JSP – Hallo Facelets!

Die fundamentale Änderung in JSF2 im Vergleich zur Vergangenheit ist sicherlich der Wechsel der View-Technologie. Früher waren JavaServer Pages (JSP) hierfür der Standard. Nach anfänglich starker Kritik wurde dessen Integration zwar verbessert, erreichte aber nie ein Niveau mit dem alle Beteiligten zufrieden sein konnten.

Bereits vor Release von JSF2 hatte sich Facelets als quasi-Standard etabliert. Facelets ersetzt JSP durch ein XML-Format. Es bietet deutlich flexiblere Templating-Features, eine eigene Taglibrary sowie die Möglichkeit, das Gros der Standard Tag Library (JSTL) weiterhin zu nutzen. Ein weiterer Vorteil ist dass, wenn entsprechend eingesetzt (jsfc Attribut), der Code auch zur Entwicklungszeit gültiges XHTML darstellt. Dadurch kann die Seite sowohl vom Java- als auch vom Frontend-Entwickler direkt bearbeitet werden.

Mit JSF2 ist nun Facelets die Standard View Description Language (VDL). Bis auf ein paar Namensanpassungen wurden die Facelets 1.x dafür weitgehend übernommen, die Unterstützung von JSP wurde dagegen abgekündigt. Die VDL von JSF2 ist also genau gesehen nicht neu, sondern nur übernommen worden. Daher beschäftige ich mich in diesem Artikel auch nicht näher mit den Standard-Features von Facelets.

Warum GET das bessere POST ist

Denn es gibt auch abseits des VDL-Wechsels spannende Neuerungen. Eine davon ist der stark verbesserte Support von HTTP GET Requests. Früher lief eine Anfrage des Benutzers in JSF oft nach dem POST – Redirect – GET Pattern ab: Zuerst eine Action/Navigation per POST auslösen, dann den Redirect zur Ziel-View an den Benutzer senden, der dann schliesslich mit einem neuerlichen GET die neue View lädt. Anders waren Features wie Bookmarks oder Refresh-Support für den Browser des Benutzers kaum lösbar. Dies wird nun durch einige neue Features rum um die Parameter-Verarbeitung bei GET Requests in vielen Fällen möglich.

f:viewParam

Ein GET Parameter kann vor Rendering einer View in eine Bean übernommen werden. Dies funktioniert im neuen f:metadata Block einer View.

<f:metadata>	<f:viewParam name="base" value="#{calculator.base}" /></f:metadata>

Ein eventuell vorhandener Parameter “base” wird somit in die Bean “calculator” übernommen. Es handelt sich hierbei um eine normale Component, was den Vorteil hat dass alle Konverter und Validatoren ebenfalls auf View-Parameter angewandt werden können. Gerade bei GET Requests ist dies essentiell, denn durch simple Änderung der URL kann der Benutzer hier jegliche Werte eingeben. Zusätzlich unterstützt die Component auch das übliche required Flag, um eine Angabe zu erfordern. Kombiniert kann dies dann wie folgt aussehen.

<f:metadata>	<f:viewParam name="base" value="#{calculator.base}" 	required="true">		<f:validateDoubleRange minimum="1" />	 	</f:viewParam></f:metadata>

Schlägt eine Validierung fehl, wird der Wert nicht in die Bean übernommen und es tritt ein normaler JSF-Validierungsfehler auf, d.h. es wird eine FacesMessage zur möglichen Ausgabe erzeugt.

PreRenderViewEvent

Per View-Parameter kann also ein Wert vor Rendering der View in die Beans übernommen werden. Meistens will man dies, um die View entsprechend dem Parameter unterschiedlich zu gestalten. Zum Beispiel um einen Datensatz zu laden. Dafür wird eine zusätzliche Methode benötigt, die nach dem Abfüllen der Beans aufgerufen wird, aber noch vor dem Rendering der Seite. Genau zu diesem Zeitpunkt wird der PreRenderViewEvent geworfen. Im f:metadata Block kann man zu diesem Zweck einen Event-Listener registrieren. Der Listener besteht aus der Methode einer Bean; sie muss public sein, sollte keinen Rückgabewert liefern und entweder keinen Parameter, oder ein ComponentSystemEvent akzeptieren. Der Listener wird dann nach der Übernahme der Parameter aufgerufen, und zwar unabhängig von den Validierungen. Es bietet sich daher an, auf fehlgeschlagene Validierungen zu prüfen, bevor man die Parameter nutzt. Mit der neuen Methode isValidationFailed() kann seit JSF2 im FacesContext einfach geprüft werden, ob eine der Validierungen fehlgeschlagen ist.

<f:metadata>	...	<f:event type="preRenderView" 	listener="#{calculator.calculate}" /></f:metadata>
public void calculate() {	FacesContext ctx = FacesContext.getCurrentInstance();	if (!ctx.isValidationFailed()) {					...	}}

Neben der Initialisierung der Daten für eine View hat die Listener Methode noch weitere Möglichkeiten. So kann sie über den NavigationHandler sogar das Rendering auf eine andere View umleiten, beispielsweise bei fehlender Authorisierung des Benutzers.

h:link

Da man nun sehr einfach GET Parameter abfüllen und verwenden kann, besteht natürlich auch erhöhter Bedarf danach, GET Links zu erstellen. Zur Navigation wurde in JSF bisher hauptsächlich auf h:commandLink und h:commandButton gesetzt. Diese erzeugten POST Requests. Zwar konnte mit h:outputLink auch ein GET Link generiert werden; diese Component wendet jedoch kaum Logik an, sodass man die Link Generierung sowie das Anfügen eventueller Parameter manuell vornehmen musste.

Hier setzt die neue h:link Component an. Sie erfordert eine logische View-ID, die dann über die Navigation Rules zur URI aufgelöst wird. Im einfachsten Fall entspricht die View-ID dem Pfadnamen der Seite in der Web-Applikation ohne Dateiendung. Übrigens ist auch dies neu: Bisher musste man selbst für dieses simple Mapping Datei->View-ID eine Navigation Rule im XML erstellen. Eine erneute Vereinfachung, um sehr schnell mit der Entwicklung loszulegen.
Ausserdem kann man der h:link Component noch Parameter über den Standard-Tag f:param mitgeben, diese Parameter werden automatisch als Query-Parameter an die URL angehängt.

<h:link outcome="calculate" value="Next page">	<f:param name="base" value="8"/></h:link>

Der daraus generierte Link kann dann z.B. so aussehen: /calculate.jsf?base=8 . Es sind beliebig viele Parameter kombinierbar. Bei komplexen Seiten kann es hilfreich sein, alle View-Parameter mitzunehmen, also an den generierten Link weiterzugeben. Das geht per includeViewParams Attribut. Zusätzlich angegebene f:param Tags können die Liste erweitern oder einzelne Parameter aus den includeViewParams überschreiben.

<h:link outcome="calculate" includeViewParams="true"	value="Next page"	<f:param name="base" value="8"/></h:link>

Der resultierende Link wird alle View-Parameter der aktuellen Seite umfassen, sowie zusätzlich den Parameter “base” mit dem Wert 8, egal ob bereits ein View-Parameter mit dem Namen “base” existierte oder nicht.

Damit bringt JSF2 nun endlich die Möglichkeit, umfassend mit GET-Requests zu arbeiten und somit dem Benutzer ein einfacheres, mehr RESTful Verhalten in der Applikation zu bieten. Es gibt Zusätze zu JSF, die dies noch ausbauen und ein echtes REST-Verhalten erzeugen können (z.B. PrettyFaces), aber jetzt sind auch die mitgelieferten Werkzeuge dafür tauglich und in der Komplexität akzeptabel.

Download

Lauffähige Beispiel-Applikation inkl. Quellcode

Ausblick

Dieser kurze Einstieg in JSF2 war nur der Anfang. An den Managed Beans wurden Änderungen vorgenommen sowie neue Scopes eingeführt. Es gibt nun mehrere Möglichkeiten, eigene Components zu erstellen. Die Validierung wurde entscheidend erweitert. Im kommenden Teil 2 der Reihe rund um JSF2 wird es um eine ganz zentrale Neuerung von JSF2 gehen: Die Einführung von out-of-the-box Unterstützung für Ajax.

Fragen und Diskussionen rund um JSF2 und Java EE 6? Gerne als Kommentar im Blog oder per E-Mail.

Javascript meets Blinkenlights

Kleines Projekt, entstanden an ein paar verregneten Nachmittagen:

Blinkentube – das ist Blinkenlights im Browser!

Blinkenlights erblickte 2001 die Lichter der Welt. Ein Hochhaus mit 8 Stockwerken und 18 Fensterreihen – platziert man hinter jedes Fenster einen Scheinwerfer, ergibt das ein Display mit 18×8 Pixeln.
Jeder konnte mit Blinkenpaint seine eigenen Blinkenlights-Movies erstellen und auf dem Gebäude abspielen lassen.

Es gab zahlreiche Folgeprojekte und Nachbauten. Blinkenlights mit LEDs, Simulatoren, räumliche Blinkenlights, Wände, Uhren, C64 Lights und viele mehr.
Ein Nachbau fehlte mir aber auf dieser Liste: Blinkenlights im Browser.

Ich habe mit Blinkenpaint herumgespielt, und es fiel mir auf, dass die CPU-Auslastung konstant auf 100% war. Und die Animationen spielten sich eher etwas langsamer ab. Auch das Laden eines Blinkenmovies (eine XML-Datei) kann schon mal 2 Sekunden dauern…
Ich habe mich gefragt: Ist es wirklich so rechenaufwändig, ein paar Lichter an- und auszuschalten? Geht das auch in meinem Browser?

Und ob!
Nach einem Abend habe ich die Lichter (ok, “1″ und “0″ in einer HTML-Tabelle) zufallsmässig an- und ausgeschaltet. Läuft prima.
Hmm… Ich muss ja das Rad nicht neu erfinden. Warum nicht gleich Blinkenmovies laden und abspielen? Ob das Parsen von 3000 Zeilen XML wohl genug schnell geht?

Und ob!
Am nächsten Abend spielt ein Blinkenmovie in meinem Browser. Das Parsen geht *zagg* *bumm* – sofort da. Wonderful.

Aber die HTML-Tabelle ist hässlich. Wenn schon, dann jetzt mit den Originalbildern der leuchtenden Fenster.

Tabellenlos. Und es läuft immer noch tipptopp in Echtzeit und ohne gröbere CPU-Belastung…
Und – das hat mir dann die Schuhe ausgezogen – selbst im IE6! :p

Und als kleines Goodie vom verregneten Samstagnachmittag: Man kann seine eigenen mit Blinkenpaint erstellten Movies hochladen.

Blinkenpaint: http://blinkenlights.net/blinkenlights/blinkenpaint

Namics Blinkenmovie: http://scratchbook.ch/blinkentube/#namics

Filme, die ich im Netz gefunden habe:
http://scratchbook.ch/blinkentube/#changing-figures
http://scratchbook.ch/blinkentube/#ampel
http://scratchbook.ch/blinkentube/#the-game
http://scratchbook.ch/blinkentube/#bit-laden
http://scratchbook.ch/blinkentube/#column-shooting
http://scratchbook.ch/blinkentube/#le-chat-noir
http://scratchbook.ch/blinkentube/#der-wasserhahn
http://scratchbook.ch/blinkentube/#james-blond
http://scratchbook.ch/blinkentube/#labyrinth
http://scratchbook.ch/blinkentube/#tetris
http://scratchbook.ch/blinkentube/#the-fly
http://scratchbook.ch/blinkentube/#thunderstorm
http://scratchbook.ch/blinkentube/#winter-in-the-city
http://scratchbook.ch/blinkentube/#worm
http://scratchbook.ch/blinkentube/#x-ball

DNS-Umstellung (schnell und mit doppeltem Netz)

Das neue Webangebot ist bereit, “der Schalter” wurde umgelegt und die Klagen bezüglich der Erreichbarkeit beginnen: “Ich sehe noch immer die alte Site”. Dieses Problem ist lösbar und davon handelt der vorliegende Post aus der Serie “Website umziehen, Relaunch, “Moving your Site”.

Wird ein Webangebot aufgerufen, so wird der Domänenname wie beispielsweise www.namics.com auf eine technische Adresse abgebildet. Diese Übersetzung in eine IP-Adresse (im Beispiel 195.141.193.123) übernimmt der internetweite Verzeichnisdienst DNS (Domain Name System). DNS ist wegen seiner Grösse als verteilte Datenbank konzipiert und da der Dienst sehr performancekritisch ist, sind zahlreiche Ebenen der Zwischenspeicherung (Caching) vorhanden. Der Architekturansatz bewirkt, dass unterschiedliche User bei der Abfrage unterschiedlich alte Antworten erhalten können. Und da beim “Umlegen des Schalters” in den meisten Fällen nur die IP-Adresse geändert wird führt die Namensauflösung bei unterschiedlichen Usern zum selben Zeitpunkt zu unterschiedlichen IP-Adressen. Einige sehen noch die alte Site und andere bereits die neue.

Der DNS-Dienst bietet über TTL (Time to live) und Seriennummern der Zonen-Dateien zwar Mechanismen um diese Latenz zu minimieren, aber ohne eine technische Diskussion vom Zaun zu brechen ist eine Umstellung die ausschliesslich über DNS erfolgt immer schlechter als der folgende Vorschlag. Noch schlimmer als systematisch die alte Site anzuzeigen ist die Mischung von alten und neuen Diensten was zu einem disfunktionalen Angebot führt. Oder der Bedarf die DNS-Umstellung bei technischen Problemen zurücknehmen zu müssen.

Hier mein Vorschlag zu dem ich gerne Eure Erfahrungen entgegen nehme.

1) Einrichten einer zweiten Domäne für die alte Site

2164-dns-umstellung-1.png

Das alte Angebot (welches später abgestellt wird) soll *zusätzlich* auf einer neuen Domäne ausgeliefert werden. So beispielsweise www1.namics.com einrichten und das alte Angebot für www.namics.com und www1.namics.com konfigurieren. www1 ist nur temporär und wird nach der erfolgreichen Migration wieder deaktiviert. Zudem soll die temporäre Domäne von Suchmaschinen nicht indexiert werden, dies also mit einem robots.txt (nur für die temporäre Domäne) sicherstellen.

2) Weiterleitung (Redirection) alt auf alt testen

Mittels einer Redirection-Regel (HTTP status 302, found) können alle Aufrufe (auch deep links) der Site www.namics.com auf www1.namics.com umgeleitet werden. Diese Weiterleitung erlaubt es den gesamten Traffic sofort zwischen www und www1 umzuschalten (und auch zurück). Zu diesem Zeitpunkt die Weiterleitung erst testen aber noch nicht dauerhaft aktivieren. Als Testkriterium gilt, das bei aktivierter Regel keine Log-Einträge auf Unterseiten mit dem bestehenden Domänennamen vorhanden sein dürfen.

3) Neue Site inkl. Weiterleitung einrichten

Die neue Site nun auf die bestehenden Adresse (www.namics.com) inklusive der ich Schritt 2 genannten Redirection-Regel konfiguriert. Auch hier ist die Weiterleitung noch nicht zu aktivieren.

4) Livegang Schritt 1

2167-dns-umstellung-4.png

Ist die neue Site bereit, so gilt es die Weiterleitung auf dem System welches die neue Site betreibt zu aktivieren. Danach den DNS-Eintrag der Hauptdomäne auf das neue System umstellen (www.namics.com zeigt nun auf die neue Site). Da die Umleitungsregel aktiv ist, werden alle Aufrufe sofort auf www1.namics.com weitergeleitet und das neue Angebot ist am Markt noch nicht sichtbar.

Nun gilt es solange zu warten bis DNS (inkl. der Caches) die Änderung überall nachvollzogen ist. Dies lässt sich dank der zwei Systeme die nun parallel ausliefern (www nur die Redirects und www1 den echten Inhalt) perfekt nachvollziehen. Als Faustregel müssten alle Aufrufe nach spätestens einem Tag über die Weiterleitung kommen.

5) Livegang Schritt 2

2168-dns-umstellung-5.png

Das Entfernen der Redirection-Regel auf dem neuen System schaltet jetzt per sofort auf das neue Angebot um. Die Site ist live ohne dass auf DNS gewartet werden muss. Die alte Site gilt es vorläufig weiter betreiben für den Fall, dass der Livegang durch reaktivieren der Redirection-Regel zurückgenommen werden.

Das war’s und vielen Dank für Eure Erfahrungen und Idee zur Verbesserung.

Und hier geht es zum Überblick aller Schritte von “Website umziehen”.

Hilfe, mein Kunde will im Facebook mein Freund sein

Eine Anfrage, ein Klick, mein Freund.

Alle, die Facebook nutzen kennen das wahrscheinlich. Früher oder später kommen “Unbekannte”, Kunden und Geschäftspartner und klopfen an der virtuellen Tür. Hier erzähle und erfahre ich aber meist Privates. Was soll ich also tun?

Fragt nicht warum, aber mir fiel mein alter Kleiderschrank ein. Dieser hatte früher zwei strikt getrennte Bereiche. In einem Teil, die nadelgestreiften Kleider fürs Büro. Der andere Teil für Sport und Rock ‘n Roll. Heute trage ich Jeans mit strengen Blusen und sie liegen im selben Fach. Das liegt nicht nur daran, dass ich einen neuen Schrank habe, sondern an einer tieferen Überzeugung, die für mich selbstverständlich geworden ist.

2151-schrank-thumb-500x248-2150.jpg

Beruf und Privat ist eins, wenn ich als Person agiere.
Dies ist in Social Media unausweichlich und der wahre Schatz der neuen Kommunikation.

Ich bestätige solche Anfragen also wenn:

- ich von der Person weiss, wer oder was sie mit mir verbinden könnte
- die Person mindestens 5 meiner Kontakte kennt
- ich thematisch mit der Person verbunden bin (XING)
- sie mir nicht vollkommen unsymphatisch ist.

Früher hätte ich solche Kontakte abgelehnt. Ich wäre auch nicht in Jeans zur Arbeit gegangen. Und kommunizierte nicht via Social Media. In den Plattformen machen wir unsere wahre Identität (oder einen Teil davon) öffentlich und bringen sie selbstverständlich auch ins Geschäftsleben. Facebook fühlte sich lange für mich privat an, seit Firmen und Gruppen vermehrt kommen, ist das anders.

Somit ist für mich klar: Es geht nicht darum, mit wem ich in Social Media kommuniziere sondern worüber.

Was hab ich gelernt?

- Social Media zeigt unsere wahre Identität
- Persönlichkeit geht über Geschäftliches hinaus
- Privates und Berufliches vermischen sich zwangsläufig
- Mein Kunde ist eine Art Freund (Vertrauen und Kontakt)
- Ich entscheide nicht wirklich über den Kreis der Leser meiner Inhalte (denn Facebook und Google können jederzeit Mechanismen ändern)
- Listenfunktionen sind nur eine gebrechliche Krücke
- Ich überlege mir sehr genau, welche Inhalte öffentlich für die nächsten Jahre im Internet stehen.

PS: ein Zweit-Account in Facebook ist übrigens für mich keine aufrichtige Lösung.

Wie geht Ihr damit um?