SilverMonkeys Bastelbude (letztes Update 16.05.18)

Hallo liebe Leute :smiley:
Wie manche von euer sicherlich schon anhand meines „Beards/Tears Karteneditors“ mitbekommen haben dürften, liebe ich es, ab und zu kleine aber feine Programme zu schreiben ^^ Da ich allerdings nicht nur mit RocketBeans-Bezug programmiere und es daher nicht in das „Projekte“ Subforum passt, dachte ich mir, dass ich hier eine Fred aufmache um euch meine Programme vorzustellen ^^
Ich versuche das Ganze übersichtlich zu halten. Falls an irgendeinem der Programme Interesse besteht, könnt ihr mir einfach per Mail schreiben, dann stelle ich hier einen Link rein :slight_smile:
Bei Kritik, Anregungen oder Programmwünschen (diese dann aber bitte ausführlich und nachvollziehbar) könnt ihr gern einen Kommentar hinterlassen ^^


##Programme

Name:
File Renaming Helper
Icon:
(Iconion; free)
Problemstellung:
Kennt ihr das Problem, wenn ihr aus dem Internet mehrere zusammengehörende Dateien (wie bspw. Gregors Plauschangriff) downloaded, sie aber komplett krepelige Namen haben? Oder wenn ihr euch eine Playlist downloaded (was wir braven Menschen natürlich niemals nie machen würden :wink: ) aber die Titel acht Kilometer lang sind, sodass ihr auf dem Handy überhaupt nicht die Laufnummer nachvollziehen könnt? Oder ihr habt euch eure Urlaubsfotos von eurer SD-Karte gezogen und wollt jetzt, dass alle einen vernünftigen Titel tragen (wie bspw. „Urlaub_2016“ oder ähnliches)? Dann ist mein kleines Programm genau das Richtige für euch :smiley:
Aufgabe:
Der File Renaming Helper ermöglicht es euch, oben genannte Probleme zu umgehen und für eine einheitliche Benennung aller Datein (mit einer zusätzlichen Laufnummer zur Unterscheidung). Außerdem ist es euch möglich einen Prä- und Suffix auszuwählen und/oder das jeweilige Datum zu inkorporieren ^^ Schluss mit wüsten Namenswüsten, Hallo Oase der Gleichheit!
Technische Details:
Also, gerade habe ich einen Test mit im Schnitt ca 800 MB großen Datein gemacht, insgesamt eine Datenmenge von 49.7 GB (laut Explorer). Die Dateien wurden dabei von einer etwas betagten HDD auf meine derzeitige SSD gezogen (beide intern per SATA mit dem Mainboard verbunden).
Ram-Nutzung: Peak lag bei 5 GB, im Schnitt wurden ca 3.8 GB für die Aktion benötigt
Zeit: Der ganze Spaß hat 413.208 Sekunden/ 6.88 Minuten gedauert, was an sich eine akzeptable Zeit sein dürfte. Das entspricht einer Durchsatzrate von ~120 MB / Sekunde.

Aktuelle Datenrate (05-02-2017): Durch Einsatz des NIO von Java 8 braucht der ganze Vorgang < 1 Sekunde, was Angaben von Datendurchsatzraten unsinnig macht. Einzig relevant wäre das Umbenennen von Dateien die gleichzeitig auf eine andere Festplatte geschoben werden. Da dies aber nicht der Regelfall sein wird, messe ich das auch nicht ^^ Ich denke das das NIO-System das Umbenennen nicht wie ich durch Einlesen&Kopieren löst, sondern durch ändern der jeweiligen Verweise, was bedeutend schneller geht.
Bilder:
Das GUI:


entstehende Files (mit den im Bild gegebenen Einstellungen):

Anmerkung: DIe Buchstaben werden hinzugefügt, sobald die Anzahl an umzubenennenden Datein 100 überschreitet

Noch offen:

  1. Da ich nicht vernünftig nachgedacht habe, blockiere ich derzeit noch den Main-Thread, was dazu führt, dass die Anwendung bei größeren Aufgaben nicht mehr reagiert, bis sie fertig ist. (lässt sich einfach durch Auslagerung in einen seperaten Thread beheben). Habe das Problem heute (05-02-2017) gelöst und den ganzen Spaß in einen eigenen Thread ausgelagert, wodurch auch endlich mal die Aktualisierung des Fortschrittsbalken funktioniert.

  2. Bisher kann der Nutzer noch nicht das Start-Verzeichnis für die Auswahldialoge festlegen, ich habe es ersteinmal auf den Bilder-Ordner gesetzt ^^

  3. Das GUI ist bisher noch unsagbar hässlich

  4. Bisher ist es noch möglich die Laufzahl abzuwählen, was per se keinen Sinn macht, da dadurch jede Datei in die gleiche umbenannte Datei geschrieben werden würde. Habe bei dem Punkt einfach nicht nachgedacht. Unfug, weiß wieder warum das möglich war: Ziel war ja auch, dass nicht nur ein neuer Filename vergeben werden konnte, sondern auch, dass der bestehende verwendet wird und einfach das Prä-/Suffix angehängt wird.

  5. Bisher werden bei Laufzahlwerten < 10 noch keine Nullen hinzugefügt, weshalb Windows sie trotz der Buchstaben noch nicht vernünftig ordnet

  6. Derzeit ist das Programm für das was es tut auch noch unglaublich langsam, da jede Datei für das Umbenennen kopiert werden muss (was nur Sinn macht, wenn man die Dateien gleichzeitig in einen anderen Ordner verschiebt). Das Problem kann allerdings scheinbar einfach durch Einsatz des NIO von Java 8 gelöst werden, was ich bisher eher stiefmütterlich behandelt habe. Wie oben beschrieben wurde das Problem gelöst.

  7. Da die Dateien inzwischen verschoben werden, überlege ich, eine Funktion einzubauen um die Originalen Dateinamen wiederherzustellen (beim Kopieren blieben die Originaldatein bisher noch vorhanden). Das ließe sich über eine einfache Textdatei lösen, die man in den jeweiligen Zielordner kopiert. Ich muss mal schauen, wie ich das löse ^^

Link:
Falls angefragt wird.


Name:
Timer (kreativ, ich weiß)
Icon:

Problemstellung:
„Problem“ ist für einen simplen Timer etwas zu hoch gegriffen, hauptsächlicher Punkt, dass Programm zu schreiben, war für mich, dass ich zum Einschlafen gern noch Youtube, Netflix und Konsorten anschaue, was allerdings verhindert, dass der PC standesgemäß nach dem Energiesparplan herunterfahren kann. Außerdem neige ich dazu, aufgebrühten Tee zu vergessen, was gerade bei grünem/schwarzen Tee sehr schade ist.
Aufgabe:
Der Timer erfüllt, wie der Name suggeriert, eine Hauptaufgabe: Zeit herunterzählen ^^ Nach Ablauf der Zeit können 3 Aktionen ausgelöst werden: Abspielen eines Alarms, einschalten des Energiesparmodus oder Herunterfahren des Rechners.
Technische Details:
Ausnahmsweise gibt es hier fast nichts Interessantes zu berichten, außer vielleicht das der Code, wie erwartet, extrem klein ist. Angenehm ist auch, dass ich, anders als noch zu Swing Zeiten, bei FX8 die nützliche Timeline nutzen konnte, was das Programm dann nochmal ein Stück einfacher gemacht hat (damit muss man keine Threads aufmachen; ist zwar eigentlich für Animationen gedacht, aber man kann es auch anderweitig verwenden :wink: )
Bilder:
Das GUI:

Noch offen:
Eigentlich gar nichts, bin mit dem Programm rundum zufrieden.

Link:
QBW Timer


Name:
Password Generator (ich weiß, genauso kreativ wie „Timer“)
Icon:

Problemstellung:
Die simple aber dennoch nervige Problemstellung hinter diesem Programm war schlicht und ergreifend, dass ich viel zu faul war, mir für jede Website, bei der ich einen Account erstellen wollte, ein sicheres Passwort auszudenken. Ihr kennt das sicherlich: Da will man sich nur mal für ein simples, dummes F2P Spiel anmelden und soll sich plötzlich ein 30 stelliges Passwort mit Groß- und Kleinbuchstaben, Zahlen, Zeichen, Goldstaub und ein Hauch Magie ausdenken, nur damit man endlich mal anfangen kann.
Aufgabe:
Der Passwort Generator generiert (wie der Name schon sagt) Passwörter. Diese können verschieden modifiziert werden: So ist das Einstellen einer Länge zwischen 8 und 35 Zeichen möglich. Desweiteren kann entschieden werden, welche Arten von Zeichen im Passwort enthalten sein sollen (entnehmbar an den Checkboxen ^^). Mehr oder minder bisher alles, was das kleine Programm kann
Technische Details:
Die eigentliche Funktionalität des Programmes besteht aus 4 Code-Zeilen :smiley: (wenn man die Definition der String-Konstanten weglässt).
Bilder:
Das GUI:

Noch offen:
Verschlüsselte Speicherung der Passwörter als Schlüssel/Wert-Paar (damit man quasi nur noch ein Master-Passwort braucht, um da ranzukommen). Bisher muss man sich die Passwörter nämlich noch merken ^^

Link:
Falls angefragt wird.


Name:
Random Number Generator
Icon:

Problemstellung:
Da ich nicht immer Würfel in allen Formen und Variationen zur Verfügung habe, dachte ich mir, ein kleines Programm dafür wäre ganz nützlich ^^
Aufgabe:
Wie der Name sagt werden schlicht Zufallszahlen in den angegebenen Grenzen generiert. Diese werden sowohl der „History“ Liste als auch dem Clipboard hinzugefügt, weshalb man sie theoretisch auch direkt per STRG+V einfügen kann. Desweiteren ist es möglich, die Nummer an Zahlen zu erhöhen, die pro Click auf den „Generate“ Button erzeugt werden. In diesem Fall wird nur die letzte Nummer dem Clipboard hinzugefügt.
Technische Details:
-//-
Bilder:
Das GUI:

Noch offen:
Mir würde nichts einfallen ^^

Link:
Falls angefragt wird.


1 „Gefällt mir“

Ich bin der erste Platzhalter!

Ich bin der zweite Platzhalter!

Den Timer würde ich ganz gerne mal testen. Für solche Späße benutze ich immer die Windows Command Line, der Shutdown Befehl lässt allerdings immer 10min vor Ablauf ein Fenster mit entsprechendem Ton aufpoppen…

Exakt darüber läuft der auch :wink:
Und da ich keine Lust hatte, das immer einzutippen, habe ich mir den halt geschrieben ^^
Momang, muss ihn nur kurz hochladen.

Edit: Link ist drin.

1 „Gefällt mir“

Kleines Update bezüglich meines File Renaming Helpers:
Da ich plane, weitere Funktionen einzubauen, werde ich ihn in File Helper umtaufen ^^
Um euch auf dem Laufenden zu halten, welche Funktionen ich plane, hier zwei selbsterklärende Übersichten:
A:


B:

A soll dazu dienen, sich sämtliche verfügbaren Attribute einer Datei nicht nur anschauen, sondern sie auch verändern zu können. Solche Attribute wären beispielsweise ob die Datei im System versteckt ist, wann sie das letzte Mal geändert wurde, wann sie erstellt wurde ect.
B ist eine kleine Privatangelegenheit von mir, da ich zwei Rechner habe (einen Standrechner und einen mobilen) und ich es leid bin, beispielsweise jedes Mal meine Programmordner per Hand zu kopieren. Zudem ist es auch so gedacht, dass quasi von wichtigen Ordnern BackUps angelegt werden können, was man ja gerne auch mal vergisst. Die Synch-Ordner müssen dann nicht jedes Mal neu ausgewählt werden, ich werde es dann so zusammenbasteln, dass man eine zuvor gespeicherte Liste laden kann, um zu synchen.

Desweiteren plane ich noch zwei zusätzliche Funktionen des Programms: Einen Duplikat-Finder und eine Übersicht, die anzeigt, wie sich die Speicherzusammensetzung in dem jeweils ausgewähltem Ordner zusammensetzt. Dafür werde ich, wie es üblich ist, wahrscheinlich ein Tortendiagramm einsetzen.

Sooooo, ein neues Jahr, ein neues Update: Derzeit arbeite ich an einer Bibliothek zur Bildbe- und verarbeitung, die inzwischen sogar relativ weit fortgeschritten ist. Im Moment bin ich damit beschäftigt, Standardfunktionen zu implementieren, die man später zu komplexeren Filtern verknüpfen kann (Kantenerkennung, Kontrastspielereien, Separation der Farbkanäle, Minimum- und Maximumfilter, Weichzeichner…sowas halt). Ich habe inzwischen auch schon ein paar Ideen für coole Filter, aber erstmal muss das Grundgerüst stehen.
Hauptsächliche Probleme bei der Entwicklung waren derzeit Hauptsächlich die Ausführgeschwindigkeit meiner Routinen, die extrem darunter leidet, dass moderne Handys behaupten, 20 Megapixelbilder aufnehmen zu können (was kompletter Unsinn ist, da ihnen dafür die nötige Optik fehlt, was sie nicht daran hindert, die Dinger dennoch mit 20 MP zu speichern -.-). Das lies sich inzwischen durch Multithreading und Auslagern der Kantenverarbeitung einigermaßen beheben, sodass meine Bibliothek inzwischen nur noch zwei- bis dreifache ImageJ Geschwindigkeit benötigt (die selbsternannte und de facto schnellste reine Java-Bibliothek in Sachen Bildverarbeitung), was ich schon ziemlich nicenstein finde :smiley:
Ziel des Ganzen soll schlussendlich eine passende App für Android werden, eventuell auch ein Port für den Desktop, mal schauen :smiley:

Und damit das nicht nur ein langer Updatetext wird, hier mal ein paar Bilder der angesprochenen Standardfilter:
Original


Weichzeichner

Kantenerkennung

Aufhellung/Abdunklung
(Exp 2/0.8)


Morphologie

Kernel Kreuz
{-1,1,-1},
{1,1,1},
{-1,1,-1}
Kernel Brush (alle Werte mit 40 multipliziert)
{1,-1,1,-1,1,-1,-1}
{-1,1,-1,1,-1,1,-1}
{1,-1,1,-1,1,-1,1}
{-1,1,-1,1,-1,1,-1}
{1,-1,1,-1,1,-1,-1}
{-1,1,-1,1,-1,1,-1}
{-1,-1,1,-1,1,-1,1}

Umwandlung
thresholding
adaptive_thresholding
Dilation
Kreuz


Brush

Erosion
Kreuz
Erosion_kreuz
Brush

Opening
Kreuz

Brush

Closing
Kreuz

Brush

Sonstiges

Histogramme (vom Baum-Bild)

Histogramme

Rot
rotrot_ij
Grün
grüngrün_ij
Blau
blau
blau_ij
Leuchtkraft
LeuchtkraftLeuchtkraft_ij
Rot(kummulativ)
rot_kumm
Grün(kummulativ)
grün_kumm
Blau(kummulativ)
blau_kumm
Anmerkung: Ich berechne nur die jeweiligen Werte dafür, die Darstellung übernimmt JavaFX. Als Referenz dazu das jeweilige Histogram von ImageJ

Arithmetische Operationen
additionsubtractiondivisionmultiplication
Manuelle Kontrasteinstellung
+50
conAdj 50
-50
conAdj-50
Automatisch



Rauschen
(σ = 2)
gaussian_noise


Update: 30.03.18
Ein kleines Update für dieses Projekt: Ich bin endlich dazu gekommen, arithmetische Operationen in meine Bibliothek einzubauen. Das klingt wahrscheinlich toller, als es dann tatsächlich ist, da es schlicht und ergreifend nur bedeutet, dass jeder Pixelwert mit einem bestimmten Festwert verrechnet wird. Dieser Festwert kann jedwede Zahl oder die Pixel eines zweiten Bildes sein.
Eine wichtigere Änderung ist, dass ich meinen Auto-Kontrast repariert habe. Dieser war lange Zeit fehlerhaft und hat deshalb nicht richtig gearbeitet. Ansonten bin ich derzeit dabei, Möglichkeiten für das manuelle Verändern von Kontrast und Sättigung einzubauen und mich mit besseren Methoden für den automatischen und manuellen Weißabgleich zu beschäftigen.


Update: 02.04.18
Ein weiteres kleines Update, diesmal mit der eher im Hintergrund nützlichen Funktion der Histogramm-Erstellung. Wie man am Vergleich mit ImageJ sehen kann, scheinen die berechneten Histogramme sogar hinzuhauen :smiley:
Die einzige Abweichung gibt es bei den Leuchtkraft-Histogrammen, bei denen es allerdings stark darauf ankommt, welche Werte man zum Ermitteln selbiger verwendet (in meinem Fall ITU BT 709). Daher mache ich mir deshalb nicht all zu große Sorgen ^^
Miniupdate: 03.04
Inzwischen habe ich auch mal einen ersten „White Noise“ Generator für gleichmäßiges Bildrauschen implementiert. Als nächstes wäre der Salt & Pepper Noise Generator dran :smiley:


Update:22.04.18
Inwischen enthält die Bibliothek morphologische Grundoperationen. Diese können in der Regel recht gut dazu verwendet werden um Regionen in Binärbildern zu erkennen, auf Farbbilder angewandt sind die Effekte allerdings auch recht nett ^^.
Miniupdate:25.04.18
Ganz vergessen die beiden Methoden zur Umwandlung eines Bilds in ein Binärbild hinzuzufügen.
Miniupdate:16.05.18
Zusätzlich die morphologischen Operationen des „Openings“ and „Closings“ hinzugefügt. Fancy Namen für eine Kombination aus Erosion & Dilation (Opening) und umgekehrt (Closing). Sieht dennoch sehr nett aus ^^. Bisher gibt es mit den beiden Filtern allerdings noch ein kleines Problem an den Bildrändern, was ich demnächst irgendwann mal lösen muss.

Aufi @SilverMonkey

1 „Gefällt mir“