QPhotorec und das Danach

Ja, jetzt ist es passiert. Ich habe aus Versehen ein paar Bilder gelöscht. Zum Glück hatte ich von früher bereits QPhotoRec auf dem Rechner, so daß ich gleich loslegen konnte.

Die Konstellation

Auf einer reinen Datenplatte waren PNG Bilder, die aber keine PNGs sondern JPEGs waren (danke Tello Devs, Ihr seid echte CodeMonkeys wie Sie im Buche Tannenbaum stehen 🙁 ). Die sollten zwecks verscripteter Umbenennung ( falls das mal wer braucht: for i in *.png;do mv $i ${i%png}jpg; done ) und Voransicht auf eine SSD verschoben werden und dann, nach der anschliessenden Bearbeitung, wieder auf die Datenplatte zurück. So der Plan.

Jetzt was wirklich passierte. Die Bilder wurden auf die SSD verschoben, aber nicht aus Listenansicht des Verzeichnisses, sondern aus der Nemo eigenen Suchergebnisliste (von PNGs). Beim Verschieben ist das Programm ganz clever und findet dann die gesuchten Bilder lustigerweise gleich wieder, weswegen ich dachte, ich hätte COPY statt MOVE benutzt. Da das in Nemo nur eine SHIFT-Taste weit auseinander liegt, sahs ich einem Irrtum auf .. und weg waren die Bilder auf der Zielpartition und der Quelle. Kann passieren.

Da es eine Datenpartition war, bestand keine Gefahr das die gelöschten Bilder überschrieben werden, also kam QPhotoRec zum Einsatz. 3,8 Milliarden Blöcke später lagen 181.685 PNG und 3.106 JPG Bilder auf der Zischenlagerplatte ( nie auf die zu rettende Partition zurücksichern! Wichtig !)  verteilt auf 370+ Ordner! und natürlich 99,9% Schrott. Für Euch noch wichtig, QPhotoRec kann man auf bestimmte Dateientypen einschränken, sonst wäre da noch sehr viel mehr gekommen 😉

Wie man den Datenwust jetzt optimal ignoriert

180k Dateien.. von Hand durchsehen? Wohl kaum. Daher zwei Wege das zu Beschleunigen:

1. „file“ auf eine Datei gleichen Typs anwenden:

1539788463675.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1×1, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=4, manufacturer=RYZE, model=RZ001, software=v01.04.35.01], baseline, precision 8, 2592×1936, frames 3

Da die Bilder der Drohne in meinem Fall alle die gleiche Auflösung haben, kann man jetzt einfach so suchen:

file recup_dir.?/* | grep 2592×1936
file recup_dir.??/* | grep 2592×1936
file recup_dir.1??/* | grep 2592×1936
file recup_dir.2??/* | grep 2592×1936
file recup_dir.3??/* | grep 2592×1936

Wenn in einem Verzeichnis ein Bild der Drohnenauflösung zu finden ist, würde es angezeigt werden.

2. „find recup_dir.* -size +200k -exec gnome-open {} \;“

Der Befehl sucht nach Dateien > 200kb und zeigt die mit gnome-open an. Ok, ist nur ein Befehl mit einigen Annahmen, aber jeder Menge Treffer, die man selbst durchsehen muß. Es schränkt aber das zu durchsuchende Material auf ein paar Treffer ein. Kommt natürlich darauf an, was QPhotoRec so alles gefunden hat.

Ich habe meine Bilder wieder und Ihr ein paar Ideen, wie man nach dem Recovery effizient an die Sache rangeht. Kleine Anmerkung: Nemo hat einen Papierkorb, wäre nicht passiert, wenn man den benutzt hätte 🙂

QMMP mit gnadenlos dummen Fehler

Mein Lieblingsaudioplayer…oh nein.. schon wieder.. 🙂 das ist wirklich Zufall 😀 Also mein Lieblingsplayer QMMP hat einen kleinen Logikbug: Wer wartet in einer Endlosschleife auf sich selbst 🙂

Gute CMD Befehle

QMMP bietet eine Menge von Optionen zur Steuerung von laufenden QMMP Instanzen an:

Optionen:
--------
-e, --enqueue Wiedergabeliste nicht löschen
-p, --play Aktuelles Lied abspielen
-u, --pause Aktuelles Lied pausieren
-t, --play-pause Wiedergabe pausieren oder fortsetzen
-s, --stop Aktuelles Lied stoppen
-j, --jump-to-file „Springe zu Titel“-Dialog anzeigen
-q, --quit Anwendung beenden
--volume <0..100> Lautstärke der Wiedergabe einstellen (Beispiel: qmmp --volume 20)
--toggle-mute Lautstärke stumm schalten/zurückstellen
--next Nächsten Titel in Wiedergabeliste abspielen
--previous Vorherigen Titel in Wiedergabeliste abspielen
--toggle-visibility Anwendung ein-/ausblenden
--show-mw Hauptfenster anzeigen
--add-file „Datei hinzufügen“-Dialog anzeigen
--add-dir „Verzeichnis hinzufügen“-Dialog anzeigen
--volume-inc Lautstärke Fünfer-Schritt erhöhen
--volume-dec Lautstärke in Fünfer-Schritt verringern
--pl-help Befehle zum Steuern der Wiedergabeliste anzeigen
--seek <time> Zu Position im derzeitigen Titel spulen
--seek-fwd <time> Vorwärts spulen
--seek-bwd <time> Rückwärts spulen
--status Wiedergabestatus ausgeben
--nowplaying <fmt> Namen des Titels formatiert ausgeben (Beispiel: qmmp --nowplaying "%t - %a")
--nowplaying-syntax Syntax von --nowplaying ausgeben
--no-start Die Anwendung nicht starten
--help Zeigt diesen Hilfetext an
--version Gibt die Versionsnummer aus

Einer davon ist „-q“, womit QMMP beendet werden sollte. Tut es auch, aber nur, wenn es auch läuft. Wenn es nicht läuft, dann wartet das gestartete QMMP und wartet bis zum Sanktnimmerleinstag auf einen anderen QMMP Prozess. Der kommt natürlich nicht. Also beendet sich das nichts tuende QMMP nicht mehr.

Bugreport ist erstellt worden 😀

#!/bin/bash 

RC=`ps auxf | grep -v grep | grep -c qmmp`
if [ $RC -gt 0]; then
       qmmp -q
fi

Kleines Script um das Problem zu vermeiden.

Wie man in Java die lokale IP ermittelt

Da das Ermitteln der lokalen IPs über alle Interface angeblich Voodoo ist, hier mal eine Lösung ohne Voodoo 🙂

import java.net.InetAddress;
import java.net.NetworkInterface;

                try {
 			Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
 			while (networkInterfaces.hasMoreElements()) {
 		    	     NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement();
 		    	     Enumeration ips = networkInterface.getInetAddresses();
 		    	     while ( ips.hasMoreElements() ) {
 		    		// InetAddress ipa = (InetAddress)ips.nextElement();
 		    		String ip = ((InetAddress)ips.nextElement()).toString();
 		    		ip = ip.replaceAll("/", "").replaceAll("%.*$","");
 		    		... HIER mit der IP was machen ... 
 		    	      }
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
		}

Eine kleine Anmerkung dazu. Das ist ja der Cast auf InetAddress, es werden an der Stelle aber IPv4 und IPv6 Objekte zurück gegeben, die sich eben ohne Cast-Fehlermeldung nur als InetAddress verarbeiten lassen. Wenn Ihr wissen wollt, was es ist, ohne eine RegEx über das Ergebnis zu legen, lest einfach die Klasse des Objekts aus:

InetAddress ipa = (InetAddress)ips.nextElement();
log( ipa.getClass().getName() );
String ip = ipa.toString().replaceAll("/", "").replaceAll("%.*$","");

Anstatt getName() kann man auch getSimpleName() oder getType() benutzen, ganz wie es Euch gefällt.

Alternative:

		Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
		while (networkInterfaces.hasMoreElements()) {
		   	NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement();
		   	
		   	for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
		   	    String ip = address.getAddress().toString();
	   		    int netmask = address.getNetworkPrefixLength();
	   		    log( netmask + ip );
		   	    ip = ip.replaceAll("/", "").replaceAll("%.*$","");
	   		}
		}

Da bekommt man auch gleich die Netzwerkmaske mit, ist wohl der bessere Weg 🙂