- Security, Rolls in Tomcat
- Performancevergleich von Webservices im Vergleich zu reinem HTTP
- Optimierter Code
- DB Zugriffe
- XSL
- SCORM
- Automatisierung, Konsistenz
Freitag, 25. Dezember 2009
Fehlende Einträge
Dienstag, 22. Dezember 2009
Joel on Software
...
Aber ich mache mir nicht über die Tage Sorgen, an denen ich "nur" zwei Stunden arbeite. Es sind die Tage, an denen ich gar nichts tue.
...
Freitag, 14. August 2009
CCD: clean code developer
Montag, 10. August 2009
Internationalisierung
Donnerstag, 30. Juli 2009
Vereinheitlichung von GUIs komplexer Applikationen
Der 2. Weg ist pragmatischer und wesentlich einfacher und schneller umzusetzen, dafür sind die Resultate nicht ganz so gut, stellen aber in den meisten Fällen eine wesentlich Verbesserung gegenüber der Ausgangssituation dar. Folgende Regeln sind dafür umzusetzen:
- Verwendung möglichst wenigen Layout Manager z.B. BoxLayout, wenn komplizierter ist und sonst BorderLayout bzw. FlowLayout für Button-Reihen
- Einen Entwickler montiert bzw. überarbeitet der alle Oberflächen
- Convenience Methoden z.B. wenn man Textabschnitte bold setzt
- Minimale und sehr einfache Klassen die alle Entwickler nutzen z.B. für Fenster, dort sind dann Font, Rahmen und Layoutmanager werden schon richtig gesetzt
- Kreuzprüfung der GUI-Teile, d.h. die Entwickler testen die GUI-Teile die von anderen Entwicklern erstellt wurden
Freitag, 10. Juli 2009
Noch so ein Programmierer-Blog
Buch zum Logging
Bücherregal
Donnerstag, 9. Juli 2009
Tomcat Buch
Blog: Java ist auch nur eine Insel
Mittwoch, 8. Juli 2009
Develop your developers
Log4J Pattern Layout
< layout class="org.apache.log4j.PatternLayout">
< param name="ConversionPattern" value="%d [%t] %-5p %c.%M%n: %m%n" />
</layout>
2009-07-08 06:59:06,470 [main] INFO me.alif.App.
App starts up
Freitag, 3. Juli 2009
Tomcat JNDI Realm
<Realm
className="org.apache.catalina.realm.JNDIRealm"
connectionURL="ldap://ldap.rostock.xxx.de"
userPatter="|(cn={0},ou=XXX,o=XX1)(cn={0},ou=XX1,o=XXX)(cn={0},ou=XXX,ou=XY,o=XX1)(cn={0},ou=XX1,ou=XY,o=XY)"
userRoleName="SmartBluUserRole"
roleSearch="(uniqueMember={0})"/>
Jetzt muss man nur noch das formulieren des LDAP-Such-Pattern beherrschen.
Tomcat JDBC Realm
<Realm className="sb.realm.SmartBLURealm" debug="99"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
connectionName="smartblu"
connectionPassword=""
userTable="USER"
userNameCol="LoginName"
userCredCol="Password"
userRoleTable="user_roles"
roleNameCol="role_name"
digest="sha"/>
Tomcat versucht dann die Benutzer zu Authentifizieren gegen eine Datenbank jdbc:mysql://localhost:3306/test mit den entsprechenden Parametern. Der Datenbank-Table heisst hier USER. Die Passwörter der Benutzer sind mit SHA gehasht. SHA bedeutet in der Java-Welt meines Wissens nach SHA2.
In diesem Beispiel wir nicht der normale JDBC Realm verwandt sondern ein eigener Realm, der von JDBC Realm abgeleitet wurde aber gleichzeitig ein Migrationsfunktion (das Altsystem verwendete nicht SHA sondern Crypt) besitzt. Die Jar-Datei die die hier verwandte Klasse enthält muss für Tocat verfügbar sein, sie muss sich also im Verzeichnis tomcat/libs befinden. Alternativ kann in dieses Beispiel auch der JDBC Realm (org.apache.catalina.realm.JDBCRealm) eingetragen werden.
Der Realm ist aber nur ein Baustein bei der Authentifizierung mit Tomcat. Die weiterne Bausteine (Login-Config, Rollen und Security Constraints) sind in der Datei web.xml des Projektes enthalten.
Fluent Interface - schlechter Stil hat einen Namen
Texte für LaTeX-Dokumente schreiben.
Donnerstag, 25. Juni 2009
Wo sollen die JUnit-Tests ausgeführt werden?
Donnerstag, 21. Mai 2009
Projektmanagementfehler
- Es wird eine neue Software entwickelt die am Markt verfügbar ist, aber in schlechterer Qualität.
- Projekte mit diversen Unterprojekten werden ohne Koordinator versucht.
- Projekte mit diversen Unterprojekten werden ohne Integrationskonzept und ohne Personalaufwand für die Integration versucht.
- Einheitliche Richtlinien für grosse Projekte werden nicht entwickelt oder nicht umgesetzt bzw. es wird die Umsetzung wird nicht überwacht.
- Usability wird als Beiwerk in Projekten betrachtet.
- Projektpläne werden nicht an veränderte Bedingungen angepasst.
- Hippe Techniken werden ohne Rücksicht auf die Bedingungen im Projekt eingesetzt.
- Erkannte Architekturfehler werden ignoriert.
- Komplexe Projekte werden ohne Entwicklungsiterationen versucht.
- Zeitverzug in Projekten wird ignoriert, es wird dann auf auf die Selbstheilungskräfte im Projekt gesetzt.
- Man ignoriert elementare Anforderungen des Kunden um sich selbst zu verwirklichen.
- Man lässt den Kunden alles Bestimmen (zu diesem Thema gibt es übrigen eine Simpsons-Folge in der Homer ein Auto entwirft).
- Gute Projektidee werden durch mangelhafte Benutzeroberflächen sabotiert, weil bei der Planung niemanden Aufgefallen ist, dass die Software durch eine GUI bedient werden soll. Selbst nach dem erkennen dieses Problem werden keine Ressourcen in die GUI investiert unter dem Motto "Wir haben eine Software mit den versprochenen Funktionen umgesetzt.", dass Niemand sie bedienen kann ist nicht unser Problem.
- Schwierigkeiten in Projekten werden nicht konsequent angegangen sondern es wird entweder versucht das Problem zu ignorieren (Probleme die ich nicht sehe sind auch nicht da.) oder es wird herum lamentiert und die sich Sachen schöngeredet und versucht es nicht wie einen Fehler aussehen zu lassen.
Mittwoch, 20. Mai 2009
Spring
- Hohe Startup-Zeiten des Clients
- Inkonsistentes Logging
- Laufzeit-Spring-Fehler
- Unzureichende Integration von Spring in Eclipse
Dienstag, 19. Mai 2009
Test Driven Development (TDD) Vorlesung - Einführung
- Test first
- Kurze Round-Trip-Zeiten
- Boundary Test
- Testen mit falschen Parametern (Fehlerbehandlung)
- Einbeziehung von Code-Überdeckung
- Übergang vom Black-Box-Testen zum White-Box-Testen
Freitag, 8. Mai 2009
Test Driven Development (TDD)
Montag, 4. Mai 2009
Mac OS X, die beste Plattform für Java-Entwickler?
Freitag, 24. April 2009
Maven Buch
Donnerstag, 23. April 2009
Maven Philosophie
- Einführung eines Standard-Lifecycles für den Build-Prozess
- Standard-Dateistruktur fürs Projekt
- Jar-Management
- Plugin-Managment
Dienstag, 21. April 2009
Texlipse
Dienstag, 14. April 2009
Mehrere Ant-Schnipsel in Maven
<executions>
<execution>
<id>id1</id>
...
Leider kann man für das Id-Tag keine einfache Schreibweise verwenden wie z.B.:
<executions>
<execution id="id1" >
...
Das wäre aus meiner Sicht übersichtlicher und platzsparender. Aber es geht nicht.
Interactive Maven
<input message="Please enter project name:"
addproperty="project"
defaultvalue="ewindtech"
/>
Wenn ich jetzt versuche diesen Ant-Schnipsel in Maven zu integrieren schlägt dies leider fehl. Auf diese Weise kann Maven nicht interakiv gestaltet werden. Schade.
Donnerstag, 9. April 2009
Neue Maven Version
Mittwoch, 8. April 2009
Integration von Ant in Maven
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Hello World</echo>
<buildnumber file="src/main/webapp/WEB-INF/build.number"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
Ant gibt in der Console bei der Ausführung den Satz Hello World aus und edswird die Build-Nummer hochgezählt. Beides sind Ant Core Tasks (siehe Ant Manual).
In der Console sieht das dann wie folgt aus:
...
[INFO] [antrun:run]
[INFO] Executing tasks
[echo] Hello World
[INFO] Executed tasks
...
Zu beachten ist, dass die Ant-Tasks am Ende der mit ihr assoziierten Phase ausgeführt werden.
Interaktivität mit Ant
<input message="Please enter project name:"
addproperty="project"
defaultvalue="ewindtech"
/>
Bei der Ausfürung geht eine Dialogbox auf in der der Benutzer einen Test eingeben kann, dieser wird dann der Variable projekt zugewiesen. Diese Variable wird durch diesen Ausdruck gleichzeitig erzeugt. Der Default-Wert der Variable ist in diesem Beispiel ewindtech. Mit message wird der Text der Dialogbox vorgegeben.
Dienstag, 7. April 2009
Variablen
<properties>
<compileSource>1.5</compileSource>
</properties>
Hier wir eine Variable namens compileSource definiert und mit dem Wert 1.5 versehen. Diese kann denn z.B. im Compiler-Plugin eingesetzt werden:
<source>${compileSource}</source>
In Ant sieht das ähnlich aus:
<property name="classes" value="WebContent/WEB-INF/classes" />
Hier wurde eine Variable mit dem Namen classes erstellt und ihr der Wert WebContent/WEB-INF/classes zugewiesen. Benutzt werden kann dann die Variable wie folgt:
<target name="prepare" depends="">
<mkdir dir="${classes}"/>
</target>
Montag, 6. April 2009
Maven Compiler Plugin konfigurieren
So muss man die Sprachversion und Encoding des Quelltextes und die Zielsprachversion in fast allen Fällen explizit angeben. Hier ein Beispiel:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin>Wichtig ist die korrekte Schreibung der XML-Tags, so sind die i der Ids gross geschrieben.
Maven 2
Wenn man mit Eclipse arbeitet kann man das auch ohne zweite Maven-Installation machen. Eclipse bringt Maven schon mit. So kann man z.B: install:install-file -DgroupId=java.plugin -DartifactId=plugin -Dversion=jre-1.5 -Dpackaging=jar -Dfile=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/lib/plugin.jar direkt im Run-Dialog unter Goals von Maven eingeben. Dieser Dialog ist eigentlich nicht für diese Verwendung gedacht, funktioniert aber.
Freitag, 3. April 2009
Ant vs. Maven
Das nächste Erlebnis war auch nicht viel Besser, trotzdem versuchte ich es noch ein mal. Ich migrierte ein größeres Projekt von Ant zu Maven. Ja es funktionierte. Dafür benutzte ich das Eclipse-Plugin m2eclipse. Alles gut? Ja, aber ich hätte da noch ein paar kleine Wünsche:
- Einfachere Integration fremder Jar's in das Projekt
- Einfache Übernahme der Maven-Konfiguration zwischen verschiedenen Rechnern
- Bessere, einfachere Suche nach Jar's (Dependencies)
- Automatische Mirror-Konfiguration
- Verbinden der Konsolenausgaben (Fehler) mit Eclipse
- Automatisches Deployment von War's via Tomcat Manager
Hier noch eine kleine Ant-Referenz: