Archiv der Kategorie Entwicklung

Apples Java-Support

Nur, falls das irgendjemand durch die ganzen Blogs, Techs & Co missverstanden hat:

The runtime provided by Apple (effectively everything in the .jdk bundle) is deprecated, but will continue to be supported throughout the service lifetimes of 10.5 and 10.6. The JavaVM.framework and it’s sub-frameworks are still supported API.

(Mike Swingler, Java Engineering, Apple Inc.) Quelle

Die Runtime ist “Java”, während das Framework quasi nur eine Schnittstelle ist. Und diese Schnittstelle ist *nicht* deprecated. Ganz im Gegenteil, sie wurde im letzten Update sogar aufgewertet (zugegeben, die Möglichkeit mehrere unterschiedlicher JVMs ist nur auf OSX ein Novum).

Java auf dem Mac

Mit dem jüngsten Java-Update hat Apple angekündigt, dass ihre eigene Java-Version als “deprecated” markiert wurde und das nach dem üblichen Support-Lifecycle eine Java-Entwicklung eingstellt wird.

Oder, mit anderen Worten:

  • OS X 10.6 “Snow Leopard” ist die letzte OS X Version, die ein vor-installiertes Java (JVM+JDK) besitzt und innerhalb der üblichen Apple-Updates aktualisiert wird;
  • Apple hat mit dem jüngsten Update einige Änderungen in der internen Java-Framework-Architektur gemacht, damit parallele JVMs (und auch Nicht-Apple-JVMs) besser erkannt werden können und (einfacher) aktiviert werden können (ein nahe liegende Grund ist bspw. das Testen einer Developer-JVM, was bisher entweder gar nicht ging oder nur mit großem Aufwand);
  • Apple macht damit in Zukunft genau das gleiche wie Microsoft.

Viel FUD kommt aber in einigen (Java-)Entwickler- oder Apple/Mac-Communities (oder auch der offiziellen Java-Mailingliste von Apple) auf, da die Ankündigung wahlweise als Java-Verbannung, “Jobs hates Java” oder sonstiger streng objektiven Aussagen interpretiert wird.

Zunächst einmal bedeutet das Wort “deprecated” nur, das beim Release der Schnittstelle/des Frameworks die “deprecated” Komponente eben zu einem späteren Zeitpunkt hinfällig wird. Damit ist also nicht etwa eine “veraltete [Java] Technik” gemeint. Also, Apple sagt nur, das ihre eigene entwickelte JVM eingestellt wird. (Genau das steht auch in den Release Notes.)

Zusammengefasst kann man als Java-Mac-Entwickler derzeit nur sagen:

  • Schade, dass man sich auf lange Sicht in Zukunft nicht mehr auf der sicheren Seite bewegt, das eine JVM (und sogar JDK!) auf dem OSX-System vorhanden ist. Auch dort wird man also in einigen Monaten Hinweise auf das Vorhandensein von Java oder automatische Installationsangebote wiederfinden.
  • Schade, dass es kein Vendor-Java gibt. (Es gibt Vorteile).
  • Schön, denn die Releasezyklen sind bestenfalls so gut wie von Sun (Oracle), nie besser. Und aus der Vergangenheit wissen wir, dass OS X teilweise Wochen bis Monate (und im Falle von Java 6 sogar Jahre) auf neue Versionen warten musste. Das wäre bei Sun nicht passiert.
  • Schön, denn die interne Grundlage mit dem jüngsten Update sorgt dafür, dass OS X’ Java-Framework-Komponente erst wirklich Non-Apple-JVM-tauglich ist.

Wirklich schlimm wäre es nur, wenn sich entweder keiner für eine (offizielle) Weiterentwicklung zur Verfügung stellt oder die einzige Weiterentwicklung nur mit X11 funktioniert. Beides würde dann tatsächlich das Aus bedeuten. Diese beiden Alternativen halte ich jedoch für unwahrscheinlich.

Zum Thema auch folgender Beitrag. Man beachte die beiden Kommentare von Ottinger und Gosling.

Und auch der hier, mit dem guten Hinweis auf die Apple Extension, die natürlich “in Gefahr” sein könnte. Für diejenigen, die die überhaupt benötigen.

The dangers of Ext.getCmp

Ext JS Screencast – The dangers of Ext.getCmp

Sehr schöner Screencast, der die ExtJS Utility-Methode Exr.getCmp näher beleuchtet. Es zielt vor allem den Component Lifecycle an, das Vermeiden von statischen IDs.

Sehr schönes Statement, kann ich nur unterstreichen:

Do not create a function soup application, or you will get into trouble.

Ach, itemId und ref werden als alternative Pattern for Exr.getCmp vorgestellt. Joa, auch wieder was gelernt.

[Howto] Maven: Wie man eine ausführbare Jar in eine Java-Webanwendung (War) via Webstart integriert.

Die Situation

Es bestehen zwei lauffähige, fertige Projekte in Maven, welche beide auch vollwertige Artefakte bilden können.

Zum einen die Webanwendung — nennen wir sie hier mal webportal — mit einem WAR-Artefakt, etwa für einen Tomcat. Ob das Artefakt als Snapshot oder Release gemacht wird, ob es nur generiert oder auch in ein Repository deployt wird, ist hierbei nicht von weiterer Bedeutung.

Zum anderen die normale Clientanwendung — nennen wir sie doch einfach userclient — mit einem JAR-Artefakt. Wichtig ist natürlich, dass hier eine startfähige Main-Klasse vorhanden ist. Dies sollte jedoch der Regelfall sein, daher nur der formale Hinweis.

Zusammengefasst, und der Auftrag an dieses Howto ist also: Wie konfiguriert und erweitert man den Buildzyklus in welchem Projekt an welcher Stelle am geschicktesten, um auf einfachem Wege die JAR-Datei userclient in die Webanwendung webportal als Java Webstart zu integrieren. Dabei ist es hilfreich, wenn man via pom.xml (und natürlich der Macht der Properties) die Versionen spezifizieren kann. Der gesamte Prozess von auswählen, signieren und ausliefern soll dabei automatisch und ohne weiteres Eingreifen des Entwicklers geschehen können. Idealerweise sollte das ganze auch optional sein — dazu gibt es dann mehr unter “Optimierungen und Verbesserungen”.

Den Rest des Eintrags lesen. »

Tags: , , , ,

Aktualisiert: TagesschauVideo 1.0.3

Ich habe meine Extension aktualisiert, sie ersetzt auch weitere Flashvideos in HTML5 auf tagesschau.de: Wetter, Aktuelles, 24.

Außerdem kann man jetzt in den Einstellungen definieren, wie das Preloading eingestellt sein soll.

wetter.tagesschau.de /HTML5)

Safari Extension: HTML5-Video für Tagesschau.de

Die Tagesschau hat in den letzten Tagen ihre Video-Ausgabe-Formate etwas erweitert. Neben dem Format Ogg wurde auch etwas die Benutzerführung (in meinen Augen) verbessert.

Wie auch immer: Ich habe auf die Schnelle eine Extension geschrieben, welche die Flash-Player auf Tagesschau.de automatisch in entsprechende HTML5-Tags umwandelt. Der Code ist zur freien Verfügung unter GitHub einsehbar, der Download ist ebenfalls dort unter Downloads zu finden.

Beispiel anhand der Seite http://www.tagesschau.de/ausland/swift172.html

Tagesschau mit Flash

Tagesschau mit Flash

Tagesschau mit HTML5

Tagesschau mit HTML5

Der Code ist wenig-bis-gar-nicht dokumentiert, sollte aber bei der mehr oder weniger jQuery-Trivilität nicht notwendig sein. Eine Adaption für Chrome/Firefox sollte einfach sein. Wie man im Code sieht, habe ich sogar das Ogg-Format ausgelesen.

Resultat: HTML

Resultat: HTML

Anregungen sind gerne willkommen.

Derzeit werden nur die Filme auf normalen Artikeln ausgetauscht; keine Sidebars, mutmaßlich auch keine Extra- oder Spezialseiten. Außerdem ist – derzeit – die Kodierung auf H.264-High und Ogg fest eingestellt. Flash lädt im Vergleich immer H.264-Medium.

Hudson-Konfiguration im SVN

Keeping your configuration and data in Subversion

Auch die Konfiguration des Build-Servers selber sollte man sichern.

Howto: Ein firmeneigenes Java-Maven-Repository aufsetzen

Für diesen Artikel setze ich jetzt einfach mal voraus, dass die Begriffe und Technologien hinter Java, Maven, Repository, Eclipse und Tomcat bekannt und geläufig sind. Und nein, jeweiliger Profi muss man zum Verständnis nicht sein.

Was wollen wir?

An ein firmeneigenes Repository — oder auch: corporate repository — gelten besondere Anforderungen. Diese können bei einem “einfach privat-eigenen” verändert werden, aber man kommt meistens auf folgende Punkte:

  1. Ein Repository soll den Entwicklern zum Deployen der eigenen Artifakte und Module zur Verfügung gestellt werden. Wahlweise übernimmt dies auch ein automatischer Build-Agent wie Hudson, TeamCity und haste-nicht-gesehen.
  2. Ein Repositorymanager soll als proxy fungieren. In einer Firma spart dies nicht nur einfache Bandbreite. Da ein solcher Manager in der Regel im lokalen Netz steht, sind die Interaktionszeiten um ein Vielfaches besser.
  3. Ein so genanntes third party pepository für die Abhängigkeiten, die unbedingt notwendig sind und wovon es keine Maven-Abhängigkeiten gibt.

Für Punkt zwei spricht auch eine wesentlich einfachere Konfiguration der Clients (Entwicklerprofile), da nur noch ein Repository eingetragen werden muss. Alle “bekannten” Repositories werden zentral gebündelt, damit schwindet natürlich gleichzeitig die “Freiheit” des einzelnen Entwicklers, andere “unbekannte” Repositories zu verwenden. Dies ist jedoch vernachlässigbar, weil: Diese “Freiheit” schränkt im Endeffekt den Buildprozess und auch die Wiederverwendbarkeit ein. Das Hinzufügen von weiteren Repositories in die POM ist aus Gründen der Versionisierung und Nachhaltigkeit auch keine optimale Lösung. Dennoch, alles nur eine Sache der Konfigurations der Clients.

Was brauchen wir?

Es gibt eine Reihe von Repository-Managern, die allesamt viel können. Die Wahl auf Nexus fällt hier aus folgenden Gründen:

  • der Footprint ist mit 30 Megabyte wesentlich kleiner als bspw. Artifactory
  • die interne Verzeichnisstruktur entspricht mehr oder weniger 1:1 der realen Organisationsstruktur eines Maven-Repositorys (im Vergleich: Artifactory speichert ein eigenes Datenbankstruktur ähnliches Layout)
  • Nexus und das Eclipse-Plugin m2eclipse sind vom gleichen Hersteller Sonatype und ergänzen sich; nach dem Umstellen bemerkt der Entwickler keinen Unterschied in der Suche, Auto-Discovery, o.ä.

Eine umfangreiche Online-Dokumentation ist auf der Nexus-Seite zu finden.

Installation

Nexus wird unter anderem als WAR ausgeliefert, insofern die Installation in einen Tomcat ein leichtes ist. Beachtenswert ist dabei nur, dass Nexus ein Verzeichnis ~/sonatype-work erstellt. Da sich dort unter Umständen viele Nutzdaten ansammeln, kann ein Verschieben (symbolischer Link?) nicht verkehrt sein. Da sich mit der Laufe der Zeit einiges an Daten ansammeln kann, sollte der Platz nicht zu sparsam vermessen sein.

Umfang

Nachdem Tomcat bzw. Nexus gestartet ist, kann man sich mit dem Default-Daten admin/admin123 anmelden (analog  mit den Daten der anderen beiden Benutzern!).

Nexus kommt bereits mit einer Reihen von vorkonfigurierten, eigenen hosted repositories einher.

  • releases sammelt alle Release-Artifakte der Firma
  • snapshots sammelt alle Snapshot-Artifakte der Firma
  • third-party sammelt alle Release-Artifakte externer Quellen, wofür es keine Maven-Repositories gibt (oder wo man jenes Repository nicht generell zur Verfügung stellen will), gutes Beispiel ist ein (aktueller) Oracle-JDBC-Treiber

Daneben gibt es so genannte proxy repositories, die praktisch gesehen nur aus einem Index bestehen. Wie ein Proxy hängen sie sich zwischen dem Client und dem tatsächlichen Repository und cachen alle Artifakte lokal. Selbst der Index ist mehrere Megabytes groß, das sollte man nicht vernachlässigen. Voreingetragene proxy repositories sind Apache Snapshots, Codehaus Snapshots, Central Maven Repository (Maven1/Maven2-Repository-Konverter sind in Nexus vorhanden a.k.a. virtual repositories).

Die grouped repositories sind auch rein virtuelle Gruppierungen von verschiedenen Repositories. Das Standard Repository “Public” ist in der einfachsten Konfiguration eine Sammlung aller (aktivierten) Repositories auf dem Manager — also sowohl der externen Spiegel, der Third-Parties als auch den eigenen Artifakten.

Konfiguration

Die Aktivierung und Verwaltung von (neuen) Repositories ist abhängig der eigenen Bedürfnisse. Meistens sinnvoll ist es jedoch, bei den drei großen Spiegeln (proxy repositories) in dem Konfigurationstab das Indizieren (Download Remote Indexes) zu aktivieren. Je nach Belieben kann man in der Gruppe Administration auch das Aktualisierungsverhalten steuern.

Konfiguration: Deployment

Um ein Deployment zu gewährleisten, muss man nebst Kenntnis der Repository-URL (eben die URL) nur wissen, ob der anonyme Zugriff erlaubt sein soll, oder ob man einen Deployment-Benutzer einrichten und nutzen willst. Falls eine Richtlinie vorschreiben sollte, dass dies nur ein Build-Agent machen darf, ist ein (geheimes) Passwort oder Schlüssel unabdingbar.

Konfiguration: Client

Nehmen wir an, der Nexus-Manager ist auf dem Host 192.168.0.10:8080/nexus installiert. In der einfachen Installation und Konfiguration sammeln sich im public repository praktisch alle relevanten Artifakte (sowohl Releases als auch Snapshots).

<settings>
<mirrors>
<mirror>
<id>corporate</id>
<name>Corporate Repository</name>
<url>http://192.168.0.10:8080/nexus/content/groups/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>

Der Deployment-User benötigt ggf. Zugangsdaten für das entsprechende Repository.

Ein Client wie m2eclipse sollte danach einen kompletten Rebuild des Index machen.

Eclipse 3.6: Ersteindruck

Der dritte Release Candidate von Eclipse 3.6 alias Helios wurde vor wenigen Tagen bereitgestellt – man kann wohl davon ausgehen, das dem baldigen Release Juni/Juli nicht mehr viel im Weg steht.

Damit reiht sich nun ein weiterer Jupitermond in die Reihe der 3.x-Releases ein: besser, umfangreicher, aktueller.

Auf dem ersten Blick sieht Eclipse wie immer aus. Zwar wurde der Welcome-Screen, wie immer, in Punkto Design und Content geändert.. aber ansonsten ist alles wie gehabt.

Zwecks des kleinen Reviews habe ich die 64-Bit-Version (Cocoa) für Mac OS X heruntergeladen; da ich aber auch noch eine Reihe von Plugins benötige, diese dann später nachinstalliert. Prinzipiell hat sich der Updatemanager zumindestens optisch nicht zum Vorgänger geändert. Immerhin: Mit schätzungsweise 50 Einzelplugins ist der Installationsvorgang erstmalig in meiner persönlichen Eclipse-Geschichte problemlos von statten gegangen – sonst hat es immer irgendwo ein bisschen geknallt. Manchmal mit, meist ohne Auswirkungen. Unter anderem war auch ein SVN Connector Plugin dabei.

Es sieht so aus, als wäre in Eclipse kein VCS-Plugin (mehr) enthalten, vielmehr wird dies durch den Connector (ggf. bekannt aus 3.5) bekannt. Nach dem obligatorischen Neustart wird man sofort vom Connector-Wizard begrüßt und kann zwischen verschiedenen HavaHL und SVNKit-Versionen wählen. Ausgewählt, installiert, neugestartet. Fertig. Import, From SVN.. und voilá. Projekt ist drin. Interessant: Neuerdings wird man informiert, dass man gespeicherte Passwörter (SVN-Dialog) mittels Passphrasen absichern kann.

Die kleinen Details

"Eigenschaften" in Galileo

"Eigenschaften" in Helios

Ich habe mich im Vorfeld noch nicht mit den Änderungen und Neuerungen von Helios auseinandergesetzt, daher stochere ich etwas herum. Augenfällige Änderung: Die Eigenschaftsfenster einer Dateiressource wurden um eine detaillierte Rechte-Verwaltung erweitert.

Resources / Syncing

Aha… Resources können jetzt endlich gefiltert in einem Projekt eingefügt werden. Soll heißen: Man kann nicht nur weitere Resourcen dazu linken sondern auch explizit welche ausschließen. Yes!

Der Produktiveinsatz in den nächsten Wochen wird zeigen, was es sonst noch gibt.

Der Nutzen des HTML5-Hypes

Ich erwähnte bereits gestern, dass der aktuelle HTML5-Hype kaum zu bremsen ist. Man begegnet ihm in Form von Video, aber auch in “HTML5-Tutorials” oder CSS3-Survival-Kits. Okay, gerade letztes habe ich ja indirekt auch angesprochen. Womit wir wieder am Anfang dieses Absatzes wäre (Achtung: Rekursionswitz).

Oft wird in Diskussionen oder Artikel über den Themenpool “Apple, Adobe, Flash, HTML5, Video” gesagt, dass HTML5 das Adobe Flash Format oder den Player abschafft. Dann sagen Kritiker wieder: Nein, Flash ist viel besser. Einfacher. Performanter. Verbreiteter. Bekannter. Leistungsfähiger.

In meinen Augen wird sich die Entwicklung ähnlich wie bereits in der Vergangenheit fortführen: das sukzessive Replacement von alten in neue, bewährte Techniken.

Wenn nicht jetzt…

Früher gab es eine Zeit, in der konnte man Rolloverbuttons entweder gar nicht oder nur über Umwege in allen Browsern lösen — die Techniken waren damals Javascript. Heute in der Regel ausschließlich CSS (seitdem der IE das auch kann). Daher lösten einige gewitzte Designer das Problem mit Mini-Flashbuttons. Heute jedoch sind solche Buttons sowie komplette Navigationsmenüs technisch gesehen “out”; und wer so etwas immer noch abliefert, muss sich die Frage gefallen lassen: “Warum…?”.

Auch dynamische Aktivitäten ließen sich eine Zeit lang einfacher in Flash lösen (gepaart mit entsprechenden Effekten) — bis ein paar Menschen herausfanden, dass man nur ein Modewort braucht, um alternative Techniken sich zu nutze machen zu können. Heute gibt es kaum eine Seite, die kein Ajax in irgendeiner Form braucht.

Kennt noch jemand die “coolen” Flash-Chat-Apps? Sie waren damals schon ein Graus und stammten aus einer Zeit, als Ajax bei Google nur Suchergebnisse für einen Fußballverein oder einen Haushaltsreiniger ergaben. Heute wird sowas in Ajax (und offenen Verbindungen serverseitig) gelöst. Man stelle sich das mal vor: Goggle Mail oder Facebook mit einem Flash, welches sich jedes mal neu lädt. (Okay, schlimmer wäre nur noch eine komplette Fullpage-Anwendung.)

Ebenfalls nahezu erfolgreich wurden die Fotoalben verdrängt, die lange Zeit auf Flash basierten. Während Flickr hierbei ein schlechtes Beispiel wäre, zeigen etwa Googles Picasa Webalben schon seit Jahren, was möglich ist. Oder Apples .mac, jetzt MobileMe. Und auch jeder zweite Internetseite nutzt irgendeine Form von Javascript-Plugin, welche eine Art “Lightbox” (manchmal mit automatischer Skalierung, FadeIn, FadeOut) zaubert.

Es gab schon immer die Early Adopters — und eben diejenigen, die entweder auf Nummer sicher gehen wollen. Naja, oder die einfach zu faul umstellen sind. Letzteres ist bei HTML5 o.ä. weniger der Fall, da es tatsächlich noch kein (bindender) Standard ist. Es schadet jedoch nicht, die bereits vorhandenen Möglichkeiten anzuschauen und ggf. zu nutzen.

Seitdem Webseitenbetreiber gemerkt haben, dass man auch mittels Ajax auch Werbung in eine Klickserie einbinden kann — *seufz* — wird es meiner Meinung auch verstärkt genutzt. Irgendwo muss ja auch der bekannte Wermutstropfen bei der Sache bleiben.

…wann dann?

In den letzten Wochen, und sicherlich auch noch in den nächsten Monaten, erleben wir das gleiche eben mit neuen technischen Komponenten von Webseiten. Wichtig für eine Akzeptanz ist, dass es während der Umstellung nicht zu inversiv ist. Gleichzeitig kann die Umstellung aber nur richtig funktionieren, wenn alle an einem Strang ziehen. Ein bisschen wie das Henne-Ei-Problem, jedoch machen derzeit ohne Ausnahme alle Browserengine-Hersteller gute Fortschritte.

Folgende Komponenten haben gute Chancen, in den nächsten Monaten und Jahren für moderne Browser von der Bildfläche zu verschwinden.

  • Musikplayer sind bisher als Flash gelöst, weil nicht jeder Browser einen MP3-Link im Browser abspielt — viele bieten dann einen Download an. Beides ist jedoch nicht “embeddable”.. Sicherlich, wir werden bei dem Audio-Tag mit einer HTML5-OGG/MP3/Flash-Weichenkonstellation ein paar Jahre leben müssen. But who cares?
  • Videoplayer sind ebenfalls als Flash gelöst; aus den gleichen Gründen wie Musik. Der Flashcontainer wurde aus der Not gewählt, mangels Alternative. Tatsächlich sind aber Werbeeinblendungen und Editorfunktionalitäten noch in keinem HTML5-Player implementiert (wenn doch, bitte ich um eine Anmerkung). Aber für die einfachen “only play a video”-Fälle reicht das Videotag aus. Genau wie bei Audio wird es auch hier auf eine Weiche hinauslaufen. But who cares? Flash wird auch stets auf zwei Arten eingebunden, dafür gibt es Frameworks.
  • Schriften sind eins der Themen, wieso man bisher immer Grafiken oder sogar Flashs verwendet hat. Grafiken sind statisch und müssen beim Design angelegt werden, Flash ist dynamisch (etwa wichtig für die I18n). Es lassen sich mit CSS3 gute Fallbacks mit Text+Hintergrundgrafik erzeugen. Im Endeffekt haben schriftlastige Seiten und alte Clients dann mehr Traffic als neuere Clients, aber das macht die Natur der Technik ja auch so gut.

Weniger schnell werden sich jedoch andere gute HTML5-Features verbreiten:

  • Offline-Features für Offline-Sitzungen (inkl. einer Datenbank) sind bisher eine technische Barriere gewesen, weshalb man ein Internetbrowserplugin brauchte. Allerdings kann man hier nicht mit Weichen arbeiten sondern muss tatsächlich zwei parallele Versionen (HTML5, Flash) anbieten. Auch wenn dies “nur” Aufwand für die GUI ist, so ist das Mehraufwand, der abschrecken kann. Da ist es egal, wenn HTML5 auch simple Datenbankstrukturen aufweisen kann — man muss ja eine Alternativlösung für ältere Browser haben.
  • Animationen und Transformationen stecken auch im Moment noch in der Entwicklung — tatsächlich kann man sie auch hauptsächlich im WebKit und in Apples MobileSafari (nicht 100% synchron mit WebKit oder gar Safari4) erleben. Hier ist eine Fallbacklösung ebenfalls schwierig und bedarf tiefer Einschnitte ins HTML-Markup als das sich da jemand darauf — vorerst — einlassen wird. Zu mindestens für einfache Dinge wie “sliden” kann man jedoch eine JS-Api nutzen, und damit quasi von hinten herum das Feld der unsupported Browser aufräumen. Das wird sich aber zeigen.

Interessant wird es beim Thema Werbung. Prinzipiell scheint mir die Branche aufgeschlossen zu sein, auch neue Techniken (Stichwort: Damals & das “DHTML”) zu nutzen. Ich würde sogar soweit gehen, dass sie es besser steuern könnten, in dem der Adserver einfach nach dem Useragent das passende Codefragment ausgibt. Zur Zeit könnte etwa die etwas ungelöste Frage, wie man HTML5-Werbung vernünftig blockt, für die Branche interessant sein. Vielleicht analysieren die Adblocker von Morgen die Koordinaten und Größenangaben von HTML-Elementen, um Blöcke von Standard-Werbeformaten zu erkennen?