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 🙂

Neues von LAHA

Kleines Update zum kleinen heimischen Audioverteilprojekt. Wie ich hier: Multi-Netzwerk-Lautsprecher mit Linux bereits nach einige Stunden zeigen konnte, klappt das mit dem latenzgleichen Abspielen von Audio im Netz bereits mit Linux Bordmitteln.

Endlich mal wieder was los…

In einer abendlichen Dauerprogrammiersession habe ich in wenigen Stunden eine Client-Server Testsuite gebaut, die bereits funktional ist. Wenn ich von Client rede meine ich die Abspieleinrichtung, die aber als Serverkomponente ausgelegt ist. Bitte merken um Verwirrungen vorzubeugen.

Die Kommunikationsarchitektur kommt auch mit einer rudimentären Anti-kaper-Funktion daher, so daß WLAN Gäste den Clienten nicht übernehmen können. Das beugt z.b. dem Problem vor, daß in einem Netz vielleicht mehr als eine Control-Anwendung läuft. Vielleicht wollen ja die Kinder was anderes hören als die Eltern 😉

Die Kontrolleinheit

Was jetzt noch neben einigen Funktionen fehlt, ist das Kontroll-Center. Das Kontroll-Center sollte ein ansprechendes Äußeres haben, aber ob das mit Swing was wird .. fraglich 😉 Ich lasse mich mal überraschen. Das war ein implizites Ja, wie in Java 😉 Kein rumpliges Python, kein PHP, NodeJs oder Ruby.. Java. Wieso?
A) machts was es soll und B) bekommt Ihr raus, wenn der Source released wird 😀

PS: Wofür LAHA steht, wird später verraten 😉

Der OnePunch-Man

Ihr braucht eine neue Serie mit skurillen Humor, der das Superheldengenre verarscht?

Versucht es mal mit der bei NetFlix erhältlichen Anime-Serie OnePunch-Man . Das basiert auf einem WebComic aus dem Jahr 2009 und wurde 2015 in eine Animeserie überführt. Die Deutsche Syncro ist im allgemeinen gut gelungen. Der Sprecher des ungewollten Meisters „Saitama“ Fabian Oscar Wien bringt alle das super gut rüber, was die Rolle ausmacht. Klasse Job!

Freut Euch auf skurille Wendungen, knallharte Gags und 0 Kinderlevelgebrabbel 🙂 Eins darf man aber nicht erwarten, eine Dauerparade von Witz und Slapstick, denn…. die Serie hat eine fortlaufende Handlung 😉