Montag, 22. Mai 2017

SSH

SSH

SSH Tipps

ssh config

Die ssh config (üblicherweise in der Datei ~/.ssh/config zu finden) beschreibt Defaults, die für bestimmte Hosts verwendet werden sollen. Somit kann auf einen Alias-Namen der Host und der Default-Benutzer eingestellt werden, so dass man statt ssh user@host.domain.com einfach ssh h schreiben kann:

Host h
    User user
    Hostname host.domain.com

Konfigurationsparameter, die für alle Verbindungen gelten sollen, kann man am Anfang ohne weitere Host-Aliase eintragen. Hier bieten sich u.a. folgende Parameter an:

Server alive checks

ServerAliveInterval 60
ServerAliveCount 2

Shared control connection

ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster auto
ControlPersist 4h

Falls die Verbindung mit einem Fehler “too long for Unix domain socket” abbrechen sollte, kann man statt dessen den Control-Path ~/.ssh/master-%C versuchen, das einen Hash-Wert verwendet. Bei der Wahl des Pfades ist darauf zu achten, dass dieser vor Lesezugriffen von anderen geschützt ist!

Weiterleitung des Key-Agents

ForwardAgent=yes

Donnerstag, 16. Juni 2016

Unix Befehle

Eine Liste von eher unbekannten Unix Befehlen und Ihre Anwendung

paste

paste kann als Join eingesetzt werden. Dabei werden die einzelnen Zeilen zu einer Zeile zusammengefügt. Als Trenner wird TAB eingesetzt. Alternativ können Trenner mit Hilfe des Parameters -d angegeben werden.

Beispiel:

ls -1 | paste -s 

comm

Vergleicht zwei sortierte Dateien Zeile für Zeile. Sind die Zeilen in beiden Dateien enthalten, werden sie in der dritten Spalte ausgegeben. Sind sie nur in der ersten Datei enthalten, werden sie in der ersten Spalte ausgegeben. Zeilen, die nur in der zweiten Datei enthalten sind, landen in der zweiten Spalte.
Mittels Parametern kann man die Ausgabe der Spalten unterdrücken.

Beispiel:

$ cat 1
a
b
c

tmp$ cat 2
b
c
d

$ comm 1 2
a
		b
		c
	d

column

Der column Befehl erstellt eine Tabelle aus dem Input. Dies kann z.B. verwendet werden, um eine einfache CSV Datei auf dem Bildschirm darzustellen.

Manchmal nützlich

factor

Zerlegt eine Zahl in ihre Primfaktoren

$ factor 666
666: 2 3 3 37

numfmt

Formatiert eine Zahl in SI oder IEC Einheiten und umgekehrt

$ echo 1000000 | numfmt --to=iec
977K
$ echo 1M | numfmt --from=iec
1048576

Dienstag, 7. Juni 2016

Java Fallen

Auch in Java gibt es ein paar Fallstricke, die man kennen muss, um nicht über sie zu stolpern.

Integer Caching

Eine relativ bekannte Sache betrifft das automatische Caching von Integer Werten. Hier werden per Default (JLS7 5.1.7) die Werte zwischen -128 und +127 gecached, so dass zum Beispiel ein Integer.valueOf(10) immer das gleiche Objekt zurückliefert. Die führt dazu, dass folgendes gilt:

Integer.valueOf(10) == Integer.valueOf(10); // true
Integer.valueOf(1000) == Integer.valueOf(1000); // false

Weniger bekannt ist, dass nur der untere Wert fix ist. Der obere Wert lässt sich über die Property java.lang.Integer.IntegerCache.high einstellen.

Double equals behavior

In der Dokumentation ist es zwar vermerkt, aber wer liest schon Dokumentation?

Für einige Grenzfälle verhält sich die equals Methode der Klasse Double anders, als der Vergleichsoperator == des double Typs.

So gilt für NaN (Not A Number) Werte:

Double.NaN == Double.NaN; // false
Double.NaN.equals(Double.NaN); // true

Weiterhin gilt für die vorzeichenbehaftete 0:

+0.0 == -0.0; // true
Double.valueOf(+0.0).equals(Double.valueOf(-0.0)); // false 

Montag, 6. Juni 2016

MacOS: Terminal Output ins Clipboard

Als langjähriger Unix Benutzer verwende ich gerne auch in MacOS ein Terminal, um mir meine Arbeit zu erleichtern. Kurze Ergebnisse lassen sich auch leicht per Copy&Paste in eine andere Applikation tragen. Was aber, wenn das Ergebnis mehr als ein paar Zeilen lang ist? Hier kann man das Ergebnis mittels des Befehls pbcopy in das Clipboard übernehmen. Zum Beispiel:

find . -name "*.java" | pbcopy

Mittwoch, 25. Mai 2016

Maven Dependencymanagement in Eclipse

Wenn man das Spring Plugin (STS) in Eclipse verwendet, kann es passieren, dass der Content-Assistent bei einem Import automatisch Einträge in die pom.xml hinzufügt, da STS Typen aus einer gängigen Liste von Paketen auswählt (siehe Spring Boot: Jar-type Content Assist).
Wenn man seine Dependencies lieber selbstständig verwaltet, kann man dieses Verhalten unter Preferences -> Java -> Editor -> Content Assist -> Advanced abschalten, indem man "Jar Type Search" abwählt.

Quelle: http://stackoverflow.com/questions/25887957/eclipse-automatically-adds-wrong-dependencies-into-pom-xml

Mittwoch, 18. Mai 2016

Lästige ESC Sequenzen in less

Wenn man sich den Output verschiedener log Operationen mit less ansehen möchte, laufen einem immer wieder ESC Sequenzen über den Weg, mit denen Zeilen in diesem Log eingefärbt wurden.

Diese tragen im direkten Output zur Übersichtlichkeit bei, sind im less Output aber störend.

Wenn man dagegen less mit dem Parameter -R startet, werden die ESC Optionen interpretiert und auch in less farbig dargestellt.

 Quelle: https://major.io/2013/05/21/handling-terminal-color-escape-sequences-in-less/

Donnerstag, 17. März 2016

Mittwoch, 17. Februar 2016

Eclipse Shortcuts

Eine kleine Sammlung von sinnvollen Shortcuts

  • CTRL+SHIFT+Y: Markierten Bereich lowercase setzen
  • CTRL+SHIFT+X: Markierten Bereich uppercase setzen

(wird bei Bedarf ergänzt)

Dienstag, 16. Februar 2016

Sample einer Oracle-Table

Um ein Sample einer Oracle Table zu bekommen, kann man das folgende Statement benutzen:
SELECT * FROM table123 SAMPLE (0.0001) SEED (4711);
Dieses Statement wählt 0.0001 Prozent der Zeilen der Tabelle aus. Durch das fixe Seed wird auch bei mehreren Aufrufen das gleiche Ergebnis zurückgeliefert (solange sich die Tabelle nicht ändert). Wird das fixe Seed weggelassen, wird ein zufälliges Seed gewählt.

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;


Montag, 8. September 2014

Executors and Job Queues

Wenn ich eine Reihe von Jobs (Runnable oder Callable) habe, die ich gerade parallel ausführen lassen möchte, kann ich das mit Threads lösen. Die modernere Variante sind jedoch angepasste Executoren. Hier wird es aber schnell aufwendig, wenn ich eine Queue der beendeten Futures verwalten möchte. Eine einfachere Lösung bietet hier Guava mit der ListenableFuture Klasse an. Mit Hilfe der Executor-Decoratoren lassen sich die Standard Java Executoren verwenden, so dass der Code-Overhead an dieser Stelle minimiert werden kann. Ein kleines Anwendungsbeispiel lässt sich in oben erwähntem Link finden.


Dienstag, 2. September 2014

Reflection, neue Instanz und Generics

Es gibt Gelegenheiten, wo man eine Klasse über Reflection erzeugen möchte, dabei aber auch hässliche Casts verzichten will.

Am einfachsten geht die wie folgt:
Class<?> genClazz = Class.forName(className);
Class<? extends XYZ> clazz = genClazz.asSubclass(XYZ.class);
Constructor<? extends XYZ> ctor = clazz.getConstructor(String.class, Integer.TYPE);
XYZ var = ctor.newInstance("bla", 10);

Donnerstag, 31. Juli 2014

Abstellen der temporären IPv6 Adresse unter Windows

Im internen Netzwerk kann die temporäre IPv6 Adresse eher stören, wenn Dienste diese per DNS Request versuchen aufzulösen, da sie nicht im DNS eingetragen wird. Daher kann es, um Wartezeiten zu vermeiden, praktisch sein, diese abzuschalten.

Hierzu müssen in einer Admin-Shell folgende Befehle eingegeben werden:

netsh interface ipv6 set privacy state=disabled store=active
netsh interface ipv6 set privacy state=disabled store=persistent
netsh interface ipv6 set global randomizeidentifiers=disabled store=active
netsh interface ipv6 set global randomizeidentifiers=disabled store=persistent
Nach einem Reboot sollten keine neue temporären IPv6 Adressen erstellt werden. Quelle: https://knowledge.zomers.eu/misc/Pages/How-to-disable-temporary-IPv6-address-allocation-at-a-Windows-PC.aspx

Freitag, 6. Juni 2014

Konfiguration

Unter Ubuntu lassen sich installierte Pakete mittels des Befehls dpkg-reconfigure neu konfigurieren. Hinter dem Befehl muss aber der Name des gewünschten Paketes angegeben werden. Aber woher kommt dieser?

Mit Hilfe des Befehls debconf-show --listowners bekommt man eine Liste der Pakete, die mit debconf (und damit auch mit dpkg-reconfigure) konfiguriert werden. Mit debconf-show paketname bekommt man dann auch die aktuelle Konfiguration angezeigt.

Alternativ kann man das Programm configure-debian benutzen. Hier wird man grafisch durch eine Liste geführt. Falls man nicht die Pakete in Gruppen zusammengefasst haben möchte, muss man den Parameter --list beim Aufruf mit angeben.

Montag, 2. Juni 2014

rsync

Als Notiz (schließlich heißt das hier Notizbuch) die rsync Parameter:

Einfache Kopie
rsync --stats --archive --verbose --compress --partial --progress --rsh=ssh \
   source user@dest:/directory
Kopie mit Checksumme
rsync --checksum --stats --archive --verbose --compress --partial --progress \
   --rsh=ssh source user@dest:/directory
Prüfung ohne Kopiervorgang
rsync --dry-run --stats --archive --verbose --compress --partial --progress \
   --rsh=ssh source user@dest:/directory

Freitag, 9. Mai 2014

Oracle Funktionen

Die Funktion regexp_substr kann als "split" Ersatz verwendet werden. Der reguläre Ausdruck enthält dazu die Zeichen zwischen den Delimitern (siehe das unten stehende Beispiel). Die benötigte Gruppe holt man sich dann mit dem vierten Parameter.

Beispiel:
select regexp_substr('a/b/c','[^/]+', 1, 2) from dual

SQL Developer Tastatur Shortcuts

Da ich üblicherweise lieber mit der Tastatur als mit der Maus arbeite, suche ich gerne Tastaturkürzel für die verwendeten Programme.
In der letzten Zeit muss ich häufiger mit dem SQL Developer arbeiten, daher hier eine Liste von interessanten Tastaturkürzeln:

  • Ctrl-Enter: Führe das aktuelle Statement aus
  • Ctrl-F7: Führe eine Formatierung des Fensters aus
  • Ctrl-Shift-N: Neues SQL Arbeitsblatt mit eigener Verbindung


Quellen: