Ich bin ja schon seit einiger Zeit ein Fan von jQuery und entdecke doch immer mal wieder was neues.
Aus Windows Anwendungen kennt man ja, dass man bei einem Klick (oder Doppelklick) den Wert im Eingabefeld selektieren kann. Mit jQuery geht das auch einfach im Web.
Und zur Krönung: Man kann sogar gleich prüfen ob sich ein Wert geändert hat:
$("input").dblclick(function() {
// wert nur selektieren wenn er sich geändert hat
if(this.value == this.defaultValue) {
this.select();
}
}
);
Quelle:
http://webdevel.blogspot.com/2008/02/jquery-quick-tip-select-text-on-focus.html
Nachdem ich lange mit Hilfe von Redbooks und Google versucht habe einen Einstieg in die Benutzung der wsadmin Console für WebSphere Application Server gesucht habe, bin ich heute auf einen wirklich hilfreiche Seite der IBM gestoßen.
Auf Developerworks gibt es jede Menge Beispielskripte zur Fernwartung, Starten und Stoppen von Anwendungen und dem Automatischen Deployment, sowohl für JACL als auch für JYTHON.
Bei einem Maven basierten build kann ich schon seit einiger Zeit meine Web Archive (WAR und EAR) automatisch erzeugen lassen. Zur Zeit arbeite ich daran meinen Build soweit zu automatisieren, dass er auch gleich automatisch ein Deployment macht.
Wichtigster Bestandteil hierzu ist das maven was6 Plugin. Es erzeugt dynamisch ein JACL Skript und führt dieses anschließen aus, ist also praktisch ein Code generator.
Um aber gegen einen Server mit Security deployen zu können, muss man das SSL Zertifkat einbinden das geht mit dem Befehl:
keytool -import -trustcacerts -file <ssl_01.cer> -keystore <server_trust.p12>
-storepass WebAS -storetype PKCS12 -alias rapidssl
Wobei ssl_01.cer der Name des exportierten Zertifikats ist und server_trust.p12 der Name des Trusstores ist. man das SSL Zertifkat einbinden (die Kennwörter sind die default WebSphere Kennwörter)
Falls man das Zertifikat nicht mehr als BASE64 kodierte Datei vorliegen hat kann man es über die WebSphere Administrationskonsole auch wieder erzeugen lassen.

Tags: Maven, WebSphere
Nachdem ich in der Zwischenzeit durchgängig Java 5 im Einsatz habe, möchte ich Generics gerade beim Collection Framework auch nicht mehr missen. Zwar steigt durch den Einsatz von Generics die Komplexität, insbesondere in Bezug auf Vererbung, dafür erhält man aber deutlich lesbareren Code.
Die Kehrseite davon ist jetzt leider, dass ich commons-collections 3.x nicht mehr einsetzen kann, da die Libary bisher nicht in einer offiziellen Version mit generics existiert (es gibt allerdings eine Alternative). Von daher ersetzt bei mir jetzt im wesentlichen Google Collections die entsprechenden Klassen. Hier zu habe ich heue eine schöne Einführung/Zusammenfassung der Google Collections Klassen gefunden, die recht prägnant die etwas ungewöhnlichen aber sehr mächtigen Konzepte dieser API beschreibt.
Tags: Collection, Google
Schon seit einiger Zeit verwende ich Spring Security (format ACEGI Securtiy) um einfach Authentifizierungs und Authorisierungsprobleme für Webanwendungen zu lösen. Mit der Version 2.0 gibt es jetzt auch eine etwas einfachere Konfigurationsmöglichkeit, allerdings war es für mich immer schwierig gezielt einzelne Implementierungen zu ändern/ zu ersetzen.
Mit dem Problem schien ich nicht allein zu sein, im diesem Blog habe ich einen Artikel wie man Spring Security anpasst und ergänzt gefunden, der sehr ausführlich und anschaulich beschreibt was man konfigurieren muss.
Tags: Web
Die IBM AS/400 kennt eine Menge Möglichkeiten und Technologien, um an Daten zu kommen und nicht immer ist es einfach herauszufinden wie man am schnellsten zu ergebnissen kommt. Eine Eigenart des Systems ist z.B. die unterscheidung von logischen Dateien und SQL Index Daten.
Inhaltlich bilden beide so ziemlich das selbe ab, haben aber eine komplett unterschiedliche Historie. Zwar können sowohl RPG/COBOL Programme als auch JDBC/SQL Anweisungen von beiden Index Daten profitieren, im Detail gibt es aber doch Unterschiede in der Handhabung. Heute bin ich auf ein (wenn auch etwas älteres) Paper von IBM gestoßen welches das ganze recht anschaulich illustriert.
Tags: AS400, SQL
Ich bin ja nach wie vor ein großer Freund von Unit Tests. Ich verwende immer noch JUnit 3.x, konnte mich irgendwie weder JUnit 4 noch mit TestNG so richtig anfreunden. Leider stehe ich aber mit meinem Tests ziemlich alleine auf weiter Flur, gut wir machen kein XP oder ner andere Art von agiler Programmierung, aber ich frage mich warum es so schwierig ist Entwickler für test getriebene Entwicklung zu begeistern? Ich bin irgenwie immer glücklich und es gibt mir ein gutes gefühl wenn ein grüner Balken zu sehen ist. Vielleicht kann mir ja mal jemand erklären, warum das anderer so anders geht?
Wer noch ein paar Tipps sucht, ich bin heute auf eine Seite zu JUnit Anti Patterns gestoßen, deren Aussagen ich im wesentlichen alle unterstützen kann. Wer schon ne weile mit JUnit arbeitet oder den pragamtischen Programmierer gelesen hat wird wenig neues finden, aber es hilft, sich die Sachen mal wieder vor Augen zu führen.
Tags: junit, Test
Während bei kleinen Programmen oder abgeschlossenen Projekten nicht unbedingt ein Unterschied zwischen normalen Schnittstellen und öffentlichen Schnittstellen gemacht werden muss, muss Software die wiederverwendbar sein soll eindeutige öffentliche Schnittstellen in Form einer API bereitstellen. Nun ist es zwar eine Menge Arbeit aber letztendlich doch machbar zu klären, welche Methoden denn nach außen angeboten werden sollen und welche nur zur internen Verwendung bestimmt sind. Viel schwieriger ist es dagegen im Laufe des Lebenszyklusses der Software die externen Schnittstellen sauber und abwärtskompatibel zu halten.
Diese Tage bin ich auf den Seiten des Eclipse Projektes auf einen sehr guten Artikel gestoßen wie man stabile APIs schreibt. Obwohl hier alles zwar im Eclipse Kontext verwendet wird, sind die Aussagen aus meiner Sicht generell auf Java anwendbar. Sehr hilfreich fand ich auch die Tipps wie man eine API erweitern kann im Anhang.
Seit einiger Zeit habe ich (mal wieder) ein neues Firefox Plugin, das Google Preview Plugin fügt eine Vorschau auf die jeweilige Webseite in die Google Ergebnisse ein. Das macht natürlich nur für grafische Seiten wirklich Sinn, aber es hilft mir die Qualität der Suchergebnisse besser beurteilen zu können.

In meinen letzten Projekten hab ich eine Menge neue Erfahrungen über eine ganz alte Maschine gemacht. Während ich bisher im wesentlichen mit PC basierten Systemen (Windows, Solaris, Unix) zu tun hatte, setzen meine derzeitigen Kunden die IBM AS/400 als zentralen Datenbankserver ein (das System hat in der Zwischenzeit einige Namensänderungen hinter sich, der Begriff AS/400 ist aber nach wie vor am weitesten verbreitet). Die Maschine stammt auf den 80er und wurde als integrierter Server mit für die Datenverwaltung in mittelständischen Betrieben konzipiert. Dabei wurde Software und Hardware als Bundle geschnürt und der Kunde hatte praktisch eine Komplettlösung für seine Unternehmssoftware. Der Zugriff erfolgte dann über Terminals. Software war textbasiert und wurde oft in COBOL oder RPG geschrieben.
Da dieser Systeme oft den Kern der betrieblichen Anwendungen bilden, haben sie bei vielen mittelständischen Kunden überlebt. Zwar kommen heute keine Terminals mehr zum Einsatz, sondern Windows basierte Emulationen, dere Text basierte Zugriff scheint aber in vielen Unternehmen nach wie vor gang und gebe zu sein.
Nun hatte ich die Aufgabe auf die Daten in einem solchen System mit Java zuzugreifen. Von großem Vorteil ist es das IBM das AS/400 Toolbox Projekt massiv unterstützt, es bietet mit dem Treiber com.ibm.as400.access.AS400JDBCDriver einen vollwertigen JDBC Treiber liefert mit dem man auf die Datenbank zugreifen kann.
Wie so oft liegt der Teufel aber hier im Detail, so dass einige Besonderheiten zu beachten sind:
- auf der AS/400 spricht man nicht von SQL Schema sondern von Bibliotheken, technisch ist das das selbe aber man redet gerne aneinander vorbei. Erschwerend kommt hinzu, dass auf der Plattform das Trennzeichen zwischen Schemaname und Tabellenname konfigurierbar ist, default ist der Slash (‘/’) nicht wie bei JDBC SQL der Punkt (‘.’):
- der AS/400 Treiber fragt bei einem falschen Kennwort/Benutzernamen in der Regel interaktiv (sprich mit einer Swing GUI) nach dem korrekten Benutzernamen, möchte man dieses Verhalten (z.B. bei einer Webanwendung) nicht haben muss man explizit prompt=false bei der Connection URL mitgeben
- die AS/400 unterstützt keine in Memory Transaktionen, spricht man kann i.d.R. nicht so einfach Daten via SQL schreiben. Um Daten in eine AS/400 Tabelle schreiben zu können muss diese journalisiert sein. Dazu muss mit einem Verwaltungstool für die entsprechende Tabelle ein Journalreceiver erstellt und die Journalisierung explizit gestartet werden. Mach man das nicht bekommt man nur kryptische Fehlermeldungen.
- auf der AS/400 können pro Tabellenspalte unterschiedliche Zeichensätze verwendet werden. Per default sind die Tabellen i.d.R. nicht UNICODE fähig so dass man oft Probleme mit Internationalen Zeichen bekommt. Wenn man die Möglichkeit hat ein eigenes Datenmodell zu erstellen, ist es empfehlenswert Texte in einer Spalte vom Typ VARGRAPHIC (eine Spezielle VARCHAR Variante) mit einer CCSID von 13488 zu erstellen. Ist die Tabellendefinition dagegen vorgegeben wird das ganze etwas komplizierter.
- stammen die Daten aus einer Legacy Anwendung werden häufig Tabellenspalten mit fixen Breiten verwendet, sprich man erhält eine Sting der jeweils mit Leerzeichen aufgefüllt ist. Für die Anwendung in Webanwendung muss man dann in der Regel jeweils explzit ein .trim() aufrufen.
Tags: AS400