Tastatureingabe für crypt-setup nach Kernel Update / 14.04

17 May 2014

Nach dem Update auf den neuesten Kernel unter Ubuntu 14.04 funktionierte bei mir die Tastatureingabe nicht mehr beim Booten. Das ist deswegen relevant, weil ich zu dem Zeitpunkt das Passwort der Festplatten-Verschlüsselung angeben muss.
Dazu gibt es auch Bugs bei Canonical, die verschiedene Workarounds vorschlagen. In meinem Fall hat jedoch gereicht, dass ich ein Paket zusätzlich installiere, dass die benötigten USB und Tastaturtreiber für die initiale Ramdisk zur Verfügung stellt:

sudo apt-get install linux-image-extra-3.13.0-24-generic
sudo update-initramfs -u

Lieber E-Mail-benutzer;

6 January 2014

Das ist das original Subject der wohl miesestens Phishing Mail, die ich je bekommen habe. Aber da darf sich jeder selbst ein Bild machen:

 

 

From: "HypoVereinsbank" <comfortaircon@bluestarchannel.com>
Subject: Lieber E-Mail-benutzer;

Lieber E-Mail-benutzer;

UNS HABEN SIE ZUGRIFF 23,432 Boxen überschritten your List setzen
Web-Service-/ Admin, und SIE Werden problème Haben, Das Senden und
E-Mails EMPFANGEN, Bis SIE wieder zu überprüfen. Wann & SIE DURCH Sich
einen Klick Markt auf Upgrade-
unten stehenden Link-und filling SIE sterben Details zu Ihrem Konto
überprüfen
Bitte Markt auf Musikersuche Höhle untenstehenden Link-oder KOPIEREN
Einfügen in Ihrem Browser, ähm Den Inhalt der Zwischenablage zu
überprüfen.

//LINK entfernt//

Achtung!
Andernfalls Werden Nur begrenzten zugang zu E-Mail-posteingang. WENN
Nicht Markt auf Ihr Konto Innerhalb von Drei Tagen Über Aktuelles zu
aktualisieren
Benachrichtigung, WIRD Ihr Konto Dauerhaft geschlossen Werden.
Mit freundlichen Grüßen,
System Administrator ®
Dazu gibt es dann auch eine "Webseite", diese sieht dann so aus:

webmail-update

Wenn das mal nicht .... das Webmail der HypoVereinsbank ist!

Vagrant + Nginx/Apache: Korrupte Daten bei statischen Dateien

7 December 2013

Das hat echt eine Weile gedauert dieses Yak zu shaven: Dank Vagrant und VirtualBox habe ich ein Web-Projekt mit einer leicht zu startenden Entwicklungsumgebung versehen.

Das hat vorher auch schon prima geklappt, und das Verfahren hat sich bewährt - besonders, wenn das Setup etwas komplexer ist, oder es Entwickler gibt die nicht mit Linux/Debian/Ubuntu arbeiten. Jedoch hat mich heute ein Bug gequält den ich wirklich einige Stunden suchen durfte. Alles fing damit an, dass es JavaScript Fehler hagelte. Uncaught SyntaxError: Unexpected token ILLEGAL Jedoch nur, wenn die Datei aus Vagrant per nginx ausgeliefert wurde. Mit Netbeans und dem eingebauten mini-Webserver für HTML5 Projekte lief alles super.

Eine Google Suche brachte unglaublich viele Ergebnisse - jedoch keine Lösung. Man solle nach bösen Zeichen schauen, am besten nach Whitespace das komisch ist. Eine super Chance auf den Holzweg abzubiegen und da eine Weile unterwegs zu sein.

Die Quellcode-Ansicht von Firefox brachte dann erstaunliches zu Tage:

Screenshot from 2013-12-07 21:30:49

Das sieht in der Tat kaputt aus. Mal schnell im Editor schauen - nein da ist alles gut. Auf der Vagrant Maschine nachschauen, auch da alles in Ordnung. (Sowas in der Art hatte ich schonmal wenn die Guest-Additions von VirtualBox nicht mehr so recht zur Umgebung passen. Aber das war hier nicht der Fall.)

Auch das Einfügen von dummy-Text änderte weder etwas an dem Muell am Ende der Datei, noch wurde der Text angezeigt. Nanu, was kann das sein? Schnell noch einen Holzweg her! "Ist bestimmt Caching."

Das Rätsels Lösung ist dann ein 5 Jahre alter Bug in VirtualBox, wohl auch bei Apache oder sogar Versionsverwaltungssoftware zuschlagen kann: VirtualBox hat Probleme mit direktem mmap zwischen zwei Filehandles, wenn es sich dabei um per vboxfs gemountete Verzeichnisse handelt.

Hier das Ticket dazu: https://www.virtualbox.org/ticket/819

Bei nginx kann man sendfile sehr einfach ausschalten: sendfile off; Danach klappt alles wie erwartet.

CorpusResponseInformationArrayException

7 August 2013

So gesehen bei T-Online...

exception

Multi-Core vs. Single-Core: Load Testing unter Linux

29 June 2013

Inzwischen sind multi-core oder sogar multi-CPU Maschinen weit verbreitet. Um etwas besser abschätzen zu können, wie gut eine Anwendung mit steigender Anzahl von CPU (Kernen) skaliert, möchte man manchmal eine Anwendung auf einzelne Kerne oder sogar einen einzigen beschränken.
Auch fuer den Fall, dass man den selben Rechner als Test-Agent und zur Ausführung des Tests (also client und server) verwenden möchte, kann es sich lohnen die zu testende Anwendung und den Test-Agenten mit beschränkten Ressourcen zu starten, damit diese nicht so stark miteinander konkurrieren.
Unter Linux (Ubuntu, Debian, Arch...) gibt es das Utility "taskset". Damit kann die CPU Affinität eines Prozesses beim start oder sogar nachträglich eingestellt werden.
Beispielsweise kann man damit dann eine Java Webanwendung folgendermaßen auf einen Core begrenzen: taskset 1 [start-kommando]

In meinem Fall nutze ich jmeter um gegen eine so gestartete Anwendung zu testen: env MAVEN_OPTS="$MAVEN_OPTS -noverify" taskset 1 mvn -Dspring.profiles.active=dev jetty:run

Schon beim Start bemerkt man recht deutlich, wie gut Java von Mehrprozessorarchitekturen profitiert. Selbst wenn die eigene Anwendung nicht stark parallelisert ist.

nginx: SSL mit Perfect-Forward-Secrecy und SPDY unter Ubuntu

27 June 2013

Es gibt SSL und es gibt SSL mit Perfect-Forward-Secrecy (PFS). Der Unterschied: Bei perfect forward secrecy kann durch den Verlust des privaten Schlüssels nicht im Nachhinein aufgezeichnete Kommunikation der Vergangenheit entschlüsselt werden. Der Grund liegt darin, dass der zufällige Sitzungsschlüssel nicht zwischen den Parteien mittels public-key-cryptography versendet wird, sondern mit einem speziellen Verfahren berechnet wird. Bei diesem Diffie-Hellmann-Schlüsselaustausch berechnen beide Parteien gemeinsam einen Sitzungsschlüssel. Der private Schlüssel hilft später nicht den Sitzungsschlüssel zu erlangen, jeder Sitzungsschlüssel muss einzeln mit speziellen Verfahren gebrochen werden, was aufwendig ist.

Damit Besucher einer Webseite keine Warnung des Browsers erhalten, weil dem Zertifikat der Webseite nicht vertraut wird, empfiehlt es sich, das Zertifikat von einer CA signieren zu lassen, die von den Browserherstellern unterstützt wird.
Ein Anbieter kostenloser Zertifikate ist "StartSSL": http://www.startssl.com/

Wenn man lediglich SSL und perfect-forward-security mit nginx konfigurieren moechte, funktioniert dich bereits mit Ubuntu 12.04 Precise (LTS). Fuer SPDY reicht das alleine nicht: Die OpenSSL Version ist nicht aktuell genug und nginx ist nicht mit dem Modul kompiliert worden. Aber dazu gibt es ein PPA :-)

Erster Schritt: SSL Zertifikat besorgen. Mit diesem Aufruf (www.server.com durch die korrekte Domain ersetzen) erzeugt man die nötigen Dateien (private key und certificate signing request). openssl req -nodes -newkey rsa:4096 -nodes -keyout myserver.key -out server.csr \
-subj "/C=DE/ST=State/L=City/O=Company/OU=IT/CN=www.server.com"

Zweiter Schritt: Bei StartSSL signieren lassen. Das Ergebnis speichert man in der Datei "www.example.com.pem".

Dritter Schritt: CA Zertifikat herunterladen wget http://www.startssl.com/certs/sub.class1.server.ca.pem
wget http://www.startssl.com/certs/ca.pem

Vierter Schritt: Wir erzeugen eine Datei mit den Diffie-Hellmann-Parametern openssl dhparam -rand - 1024 > dhparam.pem

Fünfter Schritt: Alles zu einer certificate-chain vereinigen. cat ww*.pem dhparam.pem sub.class1.server.ca.pem ca.pem > www.example.com.chain.pem

Sechster Schritt: Konfiguration von nginx mit SSL - die IP 1.2.3.4 ersetzt man durch die korrekte. server {
#your IP here
listen 1.2.3.4:443;
server_name www.example.com;
#ssl
ssl on;
ssl_certificate /etc/nginx/ssl/example.com.chain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
#PFS
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers On;
ssl_ciphers ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH;
...
}

Fertig bis auf SPDY Support. Das ganze kann man mit dem SSL Check Tool von https://www.ssllabs.com/ssltest/ zusätzlich auf korrekte Konfiguration prüfen.

Für SPDY Support geht es so weiter:
Installation einer nginx Version mit SPDY Support die statisch gegen OpenSSL gelinkt ist, so dass NPN Support (Next protocol negotiation) funktioniert, auch wenn Ubuntu 12.04 eigentlich mit einem älteren OpenSSL kommt. sudo add-apt-repository ppa:chris-lea/nginx-devel
sudo apt-get update
sudo apt-get install nginx-full

nginx Konfiguration anpassen: server {
...
listen 443 ssl spdy default_server;
...
}

Damit auch User, die nicht per SSL auf die Seite zugreifen SPDY erkennen und umschalten, kann man noch diesen Header setzen:

add_header Alternate-Protocol 443:npn-spdy/2;

Als Performance Verbesserung kann noch diese Option zur Aktivierung von OCSP Stapling verwendet werden: #google public dns
resolver 8.8.8.8;
ssl_stapling on;
ssl_trusted_certificate ssl/www.example.com.chain.pem;

Leider ist mit der Apache Version, die derzeit mit Ubuntu ausgeliefert wird, kein performantes perfect forward secrecy möglich. Der Apache http in der (uralt) Version hat keine Unterstützung für elliptic curve cryptography mit der die gemeinsame Berechnung eines Sitzungsschlüssels schnell und ressourcenschonend möglich ist.
Es gibt zwar andere Algorithmen die mittels Diffie-Hellmann PFS realisieren und auch mit dem Apache httpd funktionieren, jedoch sind diese für größere Webseiten nicht ohne zusätzliche Hardware praktikabel.

Openfire User Service Plugin: NoClassDefFoundError

24 May 2013

Fuer den OpenFire XMPP/Jabber Server gibt es ein ganz praktisches Plugin, dass es einem erlaubt per HTTP Schnittstelle User zu administrieren (anlegen/loeschen/editieren), ohne dass man sich in das Admin UI einloggen muss.

Vor allem zur Integration mit anderen Systemen eignet sich das, wenn man nicht ueber LDAP oder Datenbankintegration arbeiten kann, sondern die User Daten replizieren muss.

Das Plugin laesst sich ueber den OpenFire Plugin Manager sehr einfach installieren, jedoch resultiert dies dann bei Verwendung in unangenehmen Meldungen.

HTTP ERROR: 500

gnu/inet/encoding/Stringprep
RequestURI=/plugins/userService/userservice Caused by:
java.lang.NoClassDefFoundError: gnu/inet/encoding/Stringprep
     at org.jivesoftware.openfire.plugin.userService.UserServiceServlet.doGet(UserServiceServlet.java:130)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
Es gibt dazu in der ignite realtime Community gibt es dazu auch einen Thread: http://community.igniterealtime.org/thread/44326

Die dort vorgeschlagene Lösung ist das User Service Plugin neu zu bauen, nachdem man die Sourcen vom Openfire User Service Plugin lokal ausgecheckt hat.

Praktischer kann dabei die Lösung sein, die notwendige Dependency dem Openfire direkt mitzugeben:

Dazu lädt man libidn, z.B. von hier http://ftp.gnu.org/gnu/libidn/libidn-1.26.tar.gz, packt das Archiv aus und kopiert die Date libidn-1.26.jar in das lib Verzeichnis von Openfire. Danach einfach den Openfire Jabber Server neu starten.

Java Memory-Leaks mit plumbr finden

2 April 2013

Java hat einen schlechten Ruf, auch heute noch: Langsam, braucht zu viel Speicher, umständlich und und und. Das mit dem Speicher ist bei Java gerade bei Webanwendungen (oder Enterprise-Anwendungen) wirklich so eine Sache. Bei nicht wenigen Projekten habe ich gesehen, dass Java Server (Tomcat, Websphere, ...) Nachts regelmäßig durchgestartet werden, um dafür zu sorgen, dass es keine Speicherprobleme gibt.
Die Speicherprobleme kommen jedoch nicht von Java selbst, sondern es handelt sich in der Regel um Memory-Leaks. Diese können auch bei manueller Speicherverwaltung (malloc/free vs. Garbage Collection bei Java) auftreten. Eine ganz besondere Form von Speicherlecks sind sogenannte "Permgen-Leaks". Permgen ist der Speicherbereich der Sun/Oracle Hotspot VM in der z.B. Java Klassen gehalten werden. Solange diese gebraucht werden, bleiben die Klassen geladen. Klassen gehören zu einem Classloader, eine Klasse, die von verschiedenen Classloadern geladen wurde, stellt sich der Anwendung in der Regel als verschiedene Klassen dar. Die damit einhergehenden Probleme wenn das innerhalb der selben Anwendung passiert können nochmal ganz andere sein.
Bei Web-Anwendungen gibt es einen Classloader, der für eine deployte (oder deutsch "verteilte", "zur Verfügung gestellte") zuständig ist. Wird die Anwendung undeployt, jedoch der Container (Tomcat z.B.) nicht heruntergefahren sollte dennoch der Speicher der Anwendung, insbesondere auch der Permgen Speicher, wieder freigegeben werden.
Passiert das nicht, führt das unweigerlich nach mehreren Re-Deployments zu einem "Out of Memory: Permgen" Problem.
Aus diesem Grund werden dann oft die Server zusammen mit dem Deployment neu gestartet. Das kann Zeit kosten und ist in meinen Augen die Garantie dafür, dass die Speicherlecks auch dauerhaft nicht behoben werden: Die Entwickler spüren die Schmerzen nicht, das senkt die Motivation etwas zu tun. Bewegt man sich in Richtung Continuous-Integration oder gar Continuous-Deployment kommt ständiges Neustarten von Servern nicht in Frage: Es dauert lange, Caches sind danach kalt.
Bisher habe ich Speicherlecks daher stets gejagt: VisualVM (Sun/Oracle, Teil des JDK), Eclipse MAT (SAP Entwicklung, OpenSource) oder auch YourKit (Profiler, kommerziell) und findbugs (OpenSource) haben mir gute Dienste geleistet. Kommt man ohne EAR aus, hilft auch der in Tomcat integrierte Memory-Leaks-Prevention-Listener, ähnliches bietet auch Jetty. Nicht immer hat man reines WAR deployment oder nur Java Servlets, und die manuelle Suche kann sehr zeitintensiv werden.

Netbeans + git = merge commit bei pull?

16 March 2013

Netbeans unterstützt derzeit keine interaktive Auswahl der Optionen "merge commit" oder "rebase" wenn bei einem git pull kein fast-forward möglich ist. Dazu gibt es diesen Netbeans bug: http://netbeans.org/bugzilla/show_bug.cgi?id=213855

Als kleiner Work-Around ist es jedoch mit git Bordmitteln möglich, das Default-Verhalten von git selbst anzupassen. Dazu kann man auf einem Branch das Verhalten konfigurieren, z.B. dem master branch: git config branch.master.rebase true

Ich hoffe dieser kleine Netbeans Tipp hilft auch anderen Usern :)

James Bond - nicht gezahlt?

30 October 2012

Der neue James Bond ist (wieder einmal) ein Meisterwerk an Product-Placement. Heineken hat einen mittleren zweistelligen Millionenbetrag investiert, habe ich gelesen.

Doch wie ist das eigentlich, wenn nicht bezahlt wird. Insbesondere wenn eine dramatische Szene "versehentlich" ein Produkt eines Nichtzahlers, womöglich sogar eines Konkurrenten zu sehr ins Bild rückt?

Da gibt es eine ganz pragmatische Lösung in guter alter James Bond Manier: Dafür sorgen, dass es keiner sieht.

Ubuntu boot partition voll

14 September 2012

Wenn Ubuntu sich beklagt, dass die boot Partion bald voll ist, dann muss man etwas unternehmen.

Das ist eigentlich sogar sehr einfach!

Die boot Partition beinhaltet den Kernel (das Betriebssystem) und eine RAM-Disk, auf der Treiber und minimale Start-Scripte liegen. Diese werden benötigt, um Treiber und spezielle Geräte wie eine verschlüsselte Startpartion einzurichten.

Nun kann der Speicher, der für diese Dinge benötigt wird, sehr stark wachsen. Vor allem wenn viele Kernel-Updates herausgegeben werden, oder man Virtualbox oder NVIDIA Treiber installiert hat, die viel Speicherplatz benötigen. Wenn man sicher ist, dass mit dem aktuellen Kernel alles funktionier, dann kann man getrost alte Linux Kernel Installationen entfernen um Speicherplatz auf der boot Partition zu sparen.

Ich mache das folgendermaßen:

Termial öffnen sudo apt-get purge linux-image<tab><tab> Nun erhält man verschiedene Versionen zur Auswahl.  Ich nehme dann immer alle bis auf die neuesten drei. So kann man bei Problemen nochmal eine Version zurück gehen.

Zum Beispiel entferne ich dann folgende Kernel um auf der boot Partition mehr freien Speicherplatz zu schaffen:

sudo apt-get purge linux-image-3.2.0-23-generic linux-image-3.2.0-24-generic linux-image-3.2.0-25-generic linux-image-3.2.0-26-generic linux-image-3.2.0-27-generic Analog für die "headers" und andere Image Pakete.

Schon ist Platz für neue Ubuntu Updates, Kernel Updates und Module wie Virtualbox oder proprietäre Grafiktreiber wie NVIDIA.

DB: Sicherheit bei Textfeldern

26 August 2012

Die Deutsche Bahn hat so bei Online Tickets auch vorgesehen, diese Online zu stornieren. Jedoch ist das nicht unbedingt vollautomatisch moeglich, z.B. falls das Ticket bereits den Gueltigkeitszeitpunkt erreicht hat.
Dann muss da auch eine Begruendung eingegeben werden, ich hatte einen ICE der direkt mit 15 Minuten Verspaetung starten sollte, so dass ich Anschluesse nicht mehr so erreicht haette, dass ich zu humanen Zeiten zuhause gewesen waere.
Genau das wollte ich der DB auch mitteilen. An den offensichtlich zum Schutz gegen Injektions-Angriffen eingebauten Vorgaben bin ich dann jedoch erstmal gescheitert...

Ubuntu 12.04: OpenJDK selber bauen

12 May 2012

Ubuntu ist für mich die präferierte Entwicklungsplattform, sicherlich geht es vielen anderen (Java) Softwareentwicklern ähnlich. Und im Sinne von OpenSource möchte man OpenJDK auch auf dem eigenen Rechner übersetzen können. Das ist z.B. nützlich, wenn man selber das Java mal patchen oder debuggen möchte, aber auch um z.B. die neuesten Entwicklungen von Java 8 auf dem eigenen System ausprobieren zu können.

Im Vergleich zu früher macht der Übergang von Ubuntu zu MultiArch auf 64 bit Systemen etwas Probleme, jedoch ist das mit einem "gewusst wie" schnell erledigt. Als Vorbedingung muss ein Java (OpenJDK 6/7, Oracle JDK) installiert sein. Ich habe in meinem Fall unter /usr/lib/jvm/jdk1.7.0 ein Oracle JDK installiert.

Als nächstes benötigt man Mercurial, die hgforest extension und ein paar Bibliotheken für den Build. Ich installiere hgforest im Home-Verzeichnis, wer das nicht mag, muss die Pfade entsprechend anpassen:

apt-get install mercurial
apt-get install gawk g++ libcups2-dev libasound2-dev libfreetype6-dev libx11-dev libxt-dev libxext-dev libxrender-dev libxtst-dev libfontconfig1-dev
hg clone https://bitbucket.org/pmezard/hgforest-crew/overview/ "$HOME/hgforest"

Die hgforest Erweiterung fuer Mercurial traegt man direkt in der Mercurial Konfiguration ein, indem man die Datei ~/.hgrc editiert und folgenden Abschnitt ergaenzt (auch hier gilt dann ggf. den Pfad anzupassen)

[extensions]
forest=~/hgforest/forest.py

Nun clont man die OpenJDK Sourcen aus dem Updates-Repository für OpenJDK 7:

hg fclone http://hg.openjdk.java.net/jdk7u/jdk7u openjdk7u

Dazu solle man ca. ein Gigabyte Speicher auf der Festplatte einplanen. Bei dem ersten Build sollte auch eine Internet Verbindung vorhanden sein, da ggf. noch zusätzliche Libraries nachgeladen werden. Nun starten wir den Build:

cd openjdk7u
unset JAVA_HOME
export LANG=C
export ALT_BOOTDIR="/usr/lib/jvm/jdk1.7.0"
export ALLOW_DOWNLOADS=true
export EXTRA_LIBS=/usr/lib/x86_64-linux-gnu/libasound.so.2
make sanity && time make

Zu beachten ist hier, dass die Environment-Variablen "ALLOW_DOWNLOADS" und "EXTRA_LIBS" gesetzt sind. Letztere rührt daher, dass auf 64 Bit Systemen mit Ubuntu das OpenJDK Build-System die Libraries (noch) nicht von selbst richtig findet. Auf 32 bit Systemen wird das nicht nötig sein, und vermutlich auch in zukünftigen OpenJDK Versionen direkt implementiert sein.

Der Build Output sollte in etwa so aussehen: ########################################################################
##### Build time 00:10:30 jdk for target(s) sanity all docs images #####
########################################################################
#-- Build times ----------
Target all_product_build
Start 2012-05-12 11:40:32
End   2012-05-12 12:04:01
00:01:27 corba
00:10:15 hotspot
00:00:18 jaxp
00:00:27 jaxws
00:10:30 jdk
00:00:32 langtools
00:23:29 TOTAL
-------------------------
real    23m30.532s
user    32m10.625s
sys    2m24.617s

Im Ordner "build" befindet sich dann der Ordner "linux-amd64" in dem sich das frisch kompilierte Java auch ausführen lässt: ./build/linux-amd64/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-tkruse_2012_05_12_11_40-b00)
OpenJDK 64-Bit Server VM (build 23.0-b21, mixed mode)
Übrigens lässt sich genauso einfach auch Java 8 (OpenJDK 8 ) auf einem Debian oder Ubuntu System übersetzen, das Repository ist unter http://hg.openjdk.java.net/jdk8/jdk8/ zu finden.

jQuery anchor hash Selektor

21 April 2012

In älteren Versionen von jQuery konnte man einen Selektor für den hash Wert von Links schreiben. (Der Hash Wert ist der Teil hinter "#" in einem Link element, man kann damit verschiedene Bereiche in einer Seite anspringen.)

Das sah mit jQuery 1.2.6 z.B. so aus: $("a[hash='#sprungMarke']"); Bei neueren jQuery Versionen ist das nicht mehr so explizit möglich. Dafuer gibt es jedoch Selektoren mit denen man auf Inhalte und partielle Inhalte von Attributen matchen kann. Hiermit ist es dann wieder möglich auf den Hash Wert zu matchen, denn es handelt sich dabei gerade um das Ende des "href" Attributes eines Links.

Mittels "$" kann man das Suffix-Matching für den Wert eines Attributes machen.

Damit sieht das dann so aus: $("a[href$='#sprungMarke']");

Die neuen, flexibleren, Selektoren von jQuery können also Arbeit sparen, wenn man sich ihrer Mächtigkeit bewusst ist.

Netbeans TDD Produktivität

21 April 2012

Test driven development ist inzwischen schon fast ein alter Hut. Um so mehr ist es wichtig, dass die Produktivität stimmt. Hält man sich an bestimmte Namenskonventionen, so unterstützen alle modernen IDEs schnelles Umschalten zwischen Test-Code und Produktionscode.

Dazu nennt man seine Testklasse genauso wie die Class-under-test, beispielsweise "FibonacciTest" falls die eigentliche Klasse "Fibonacci" heißt. Mittels Control-Shift-T kann man in Netbeans dann zwischen den beiden Klassen umschalten. Heute habe ich noch was gelernt: Control-F6 startet den Unit test - und zwar auch dann, wenn man ihn nicht fokussiert hat, also in der eigentlichen Klasse im Editor ist. ("Fibonacci" in diesem Beispiel)

Das spart unnötige Kontext-Switche, macht einfach Spaß und bringt Produktivität. Mein Tipp: Ausprobieren!

Mit Alt-F6 startet man übrigens alle Tests zu einem Projekt. (Falls einem nicht komische Ubuntu Tastenkürzel dazwischenfunken.)


/
Copyright © 2007, 2008 everflux. Alle Rechte vorbehalten. All rights reserved.