Montag, 21. Dezember 2015

Java Remote Debugging

Es gibt verschiedene Situationen, in denen ein remote Debugging angebracht sein kann. Die beiden häufigsten sind:
  • Die VM befindet sich auf einer Maschine, auf der keine IDE installiert ist
  • Der Aufruf des Servers erfolgt durch ein Script und kann nur umständlich in der IDE nachgestellt werden
Das remote Debugging wird durch folgende Parameter bei Aufruf initiiert. Der Port kann dabei angepasst werden:
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y

Freitag, 16. Oktober 2015

Java Generics und der Type-Witness

Die Typ-Inferenz von Java versucht den Typ eines Generics anhand der bekannten Typinformationen auszuwerten. Dies kann jedoch in bestimmten Fällen schief gehen.

So funktioniert zwar folgendes Beispiel:
private void f(List<String> l) {
  // TODO 
}

List<String> l = Collections.emptyList();
f(l);
Wird die leere Liste aber direkt verwendet, schlägt die Typ-Inferenz mit der Fehlermeldung "The method f is not applicable for the arguments List<Object>" fehl:
f(Collections.emptyList());
Die Lösung ist, hier einen Type-Witness einzusetzen:
f(Collections.<String>emptyList());

Dienstag, 7. Juli 2015

CIFS über SSH

Um eine CIFS Verbindung über einen SSH Tunnel zu fahren, muss zuerst der SSH Tunnel aufgebaut werden. Dabei sollte statt des veralteten Port 139 der aktuellere Port 445 verwendet werden, da es ansonsten zu Problemen kommen kann.

Der Aufbau der SSH Verbindung kann auf unterschiedliche Weise geschehen. Die einzelnen Verfahren haben dabei Vor- und Nachteile.

  1. Aufbau im Vordergrund ohne Command. Hier muss man den Tunnel manuell in der Hintergrund schicken
    ssh -N -L 10445:10.5.107.32:445 user@jumpserver
    
  2. Aufbau im Hintergrund ohne Command. Zum stoppen muss der Prozess gefunden werden.
    ssh -f -N -L 10445:10.5.107.32:445 user@jumpserver
    
  3. Aufbau im Hintergrund mit Master ohne Command. Extra Aufwand, dafür gute Steuerung
    ssh -f -N -M -S  -L 10445:10.5.107.32:445 user@jumpserver
    
  4. Aufbau im Hintergrund mit Timeout. Auto-Close
    ssh -f -L 10445:10.5.107.32:445 user@jumpserver sleep 60
    

Sobald die Verbindung steht, kann man dann einen CIFS Mount durchführen:

mount -t cifs //WINSERVER/SHARE /mnt/ -o user=winuser,port=10445,ip=127.0.0.1,domain=windomain

Freitag, 19. Juni 2015

Bind-Variables vs. Substitution-Variables

Substitution-Variables werden durch & bzw. && gekennzeichnet. Diesen kann optional ein Name folgen. Bei & (temporary substitution variable) fragt SQL Developer jedes Mal nach dem Wert. Bei && (permanent substitution variable) wird ein einziges Mal gefragt und der Wert an allen Stellen eingesetzt. Der Wert ist jedoch ein einfacher String-Wert, so dass ggf. Quotes verwendet werden müssen.
Die Verwendung von Substitution-Variables kann durch die Eingabe von
set define off; 
abgeschaltet werden. Dies ist insbesondere dann von Interesse, wenn ein zu prüfender String ein & Zeichen enthält.

Häufig werden eher Bind-Variables benötigt. Diese werden als Name mit einem : als Prefix gekennzeichnet (z.B. :foo). Für diese wird einmal der benötigte Wert angefragt und dann an allen Stellen der Query eingefügt.
Beispiel:

select :foo, :foo || :foo from dual;