# Preferences



## cyb0rg (7. Apr 2017)

Hallo Zusammen,
ich versuche gerade mit mit Preferences ausseinander zu setzen und bin da noch nicht erfolgreich.
ich versuche als bsp mit folgendem Code Preferences zu speichern:

```
public class Main {

    public static void main(String[] args) {
   // write your code here
        Preferences pre = Preferences.userNodeForPackage(Main.class);
        pre.put("test", "val");
    }
}
```

so wie ich das verstehe müsste dohc nun im User verzeichnis ein pref liegen... ich finde aber niergends etwas was mit dem zu tun hätte..
Ich nutze hier ein MacOS Sierra.

hat einer eine idee?

gruss


----------



## Joose (7. Apr 2017)

Versuch doch mal "flush()" aufzurufen.


----------



## krgewb (7. Apr 2017)

Joose hat gesagt.:


> Versuch doch mal "flush()" aufzurufen.


Was macht flush?

@cyb0rg Du kannst deinen Code testen, indem du den String mit get abfragst und auf der Konsole ausgibst.
Aber ich nehme an deine Frage lautet: Wo auf dem Computer liegt dann die Datei mit dem per put angelegten String?
Da kann ich dir leider auch nicht helfen.


----------



## Tobse (7. Apr 2017)

Wie @Joose schon sagte: flush() musst du aufrufen, um die Daten zu speichern.

Die Daten selber liegen unter Windows in der Registry und unter Linux im Home-Verzeichnis (userNodeForPackage() benutzt userRoot())


----------



## cyb0rg (8. Apr 2017)

Joose hat gesagt.:


> Versuch doch mal "flush()" aufzurufen.


leider ohne erfolg 
gibt allerdings auch keine exception


krgewb hat gesagt.:


> Was macht flush?


nach java docs beschriebung, scheint es das schreiben zu "erzwingen":

```
public void flush()
          throws IOException
Flushes this output stream and forces any buffered output bytes to be written out. The general contract of flush is that calling it is an indication that, if any bytes previously written have been buffered by the implementation of the output stream, such bytes should immediately be written to their intended destination.
If the intended destination of this stream is an abstraction provided by the underlying operating system, for example a file, then flushing the stream guarantees only that bytes previously written to the stream are passed to the operating system for writing; it does not guarantee that they are actually written to a physical device such as a disk drive.

The flush method of OutputStream does nothing.

Specified by:
flush in interface Flushable
Throws:
IOException - if an I/O error occurs.
```



krgewb hat gesagt.:


> @cyb0rg Du kannst deinen Code testen, indem du den String mit get abfragst und auf der Konsole ausgibst.
> Aber ich nehme an deine Frage lautet: Wo auf dem Computer liegt dann die Datei mit dem per put angelegten String?
> Da kann ich dir leider auch nicht helfen.


Jupp, das problem ist, wenn ich Gette... im gleichen lauf, dann bekomme ich den erwünschten output, jedoch sobald ich es NEU starte, kommt falls ich vorher gette ein NULL Pointer weil er nichts findet..
Deswegen wollte ich erstmal herausfinden ob dieses wirklich geschrieben, wird.. dafür muss ich aber auch wissen wohin es geschrieben werden müsste 


Tobse hat gesagt.:


> Wie @Joose schon sagte: flush() musst du aufrufen, um die Daten zu speichern.
> 
> Die Daten selber liegen unter Windows in der Registry und unter Linux im Home-Verzeichnis (userNodeForPackage() benutzt userRoot())


Was ich machen könnte ist das ganze kurz auf Linux zu testen, aber brauchen tu ich es letztenendes doch auf mac im moment.


----------



## Tobse (8. Apr 2017)

Sag mal, welchen Jaadoc hast du denn gelesen? Du benutzt die Klasse Preferences, also lies doch auch den Javadoc *dazu*_, _und nicht den von OutputStream..... ://



			
				Javadoc zu Preferences#flush() hat gesagt.:
			
		

> [...]
> Forces any changes in the contents of this preference node and its descendants to the persistent store. Once this method returns successfully, it is safe to assume that all changes made in the subtree rooted at this node prior to the method invocation have become permanent.
> [...]





cyb0rg hat gesagt.:


> Was ich machen könnte ist das ganze kurz auf Linux zu testen, aber brauchen tu ich es letztenendes doch auf mac im moment.


Du weisst, dass Mac eine Linux-Variante ist, oder? Auch unter Mac liegt das zeug in deinem Home-Verzeichnis _$/.java/_


----------



## cyb0rg (8. Apr 2017)

Tobse hat gesagt.:


> Sag mal, welchen Jaadoc hast du denn gelesen? Du benutzt die Klasse Preferences, also lies doch auch den Javadoc *dazu*_, _und nicht den von OutputStream..... ://


eeeeh mja ^^ hast recht.... my fault.


Tobse hat gesagt.:


> Du weisst, dass Mac eine Linux-Variante ist, oder? Auch unter Mac liegt das zeug in deinem Home-Verzeichnis _$/.java/_


Mac stammt ursprünglich von Unix (Wovon auch Linux ursprünglich stammt) aber ja einiges ist sehr ähnlich 
in diesem verzeichnis mehr oder weniger hätte ich es auch erwartet... aber leider auch mit _*find / -name "prefs" *_und anderen möglichen kombinationen wurde ich bisher niergends fündig... alles was mir bisher einfiel habe ich durchsucht leider ohne erfolg


----------



## Tobse (8. Apr 2017)

Dann weiss ich auch nicht weiter - so steht es in den Javadocs.


----------



## JStein52 (8. Apr 2017)

hast du in .java geguckt ? Oder nur mit find gesucht ...


----------



## JStein52 (8. Apr 2017)

Ich habe mal das da gefunden:
Unix und Mac OS X speichern die Einstellungen in XML-Dateien. Die Systemeigenschaften landen bei Unix unter /etc/.java/.systemPrefs und die Benutzereigenschaften lokal unter $HOME/.java/.userPrefs. Mac OS X speichert Benutzereinstellungen im Verzeichnis /Library/Preferences/.


----------



## JStein52 (8. Apr 2017)

Und ich habe das jetzt gerade auf einem Mac probiert:

```
public class Main {

    public static void main(String[] args) throws Exception {
   // write your code here
        Preferences pre = Preferences.userNodeForPackage(Main.class);
        System.out.println("Pref: "+pre.get("test", "mischt"));
        pre.put("test", "val");
        pre.flush();
    }
}
```
ergit als Ausgabe wie erwartet beim allerersten Programmlauf
Pref: mischt
und bei allen folgenden
Pref: val

Wo er das speichert habe ich aber auch nicht gefunden


----------



## Java20134 (8. Apr 2017)

Wenn die main Methode startest, bekommst du eine Fehlermeldung? Wenn ja, dann wird durch diese ausgesagt, dass die Preferences nicht gefunden/erstellt wurden. Das liegt daran, dass du noch eine Windows Variable erstellen musst!


----------



## JStein52 (8. Apr 2017)

Java20134 hat gesagt.:


> Wenn die main Methode startest, bekommst du eine Fehlermeldung?


Wieso eine Fehlermeldung ? Ich kriege keine Fehlermeldung, alles funktioniert wie erwartet. Auf Windows wie auch auf Mac-OS


----------



## mrBrown (8. Apr 2017)

Java20134 hat gesagt.:


> Wenn die main Methode startest, bekommst du eine Fehlermeldung? Wenn ja, dann wird durch diese ausgesagt, dass die Preferences nicht gefunden/erstellt wurden. Das liegt daran, dass du noch eine Windows Variable erstellen musst!


Was ist denn eine Windows Variable?
Eine Exception gab's ja auch nicht...


----------



## JStein52 (8. Apr 2017)

mrBrown hat gesagt.:


> Was ist denn eine Windows Variable?


 gute Frage. Braucht man aber nicht. Egal was es ist. Ausserdem ging es beim TE ja um Mac-OS. Da ist eine Windows-Variable ja Teufelswerk


----------



## krgewb (8. Apr 2017)

```
System.out.println("Pref: "+pre.get("test", "mischt"));
```
Mit dieser Zeile gibt JStein52 einen Default-Wert vor. Falls es *test *noch nicht gibt dann soll "mischt" ausgegeben werden. Falls es *test *jedoch gibt dann wird der hinterlegte String ausgegeben.


----------



## cyb0rg (8. Apr 2017)

Tobse hat gesagt.:


> Dann weiss ich auch nicht weiter - so steht es in den Javadocs.


nach ein paar stunden weiterprobieren,.. bin ich auch nicht wirklich weiter gekommen 


JStein52 hat gesagt.:


> hast du in .java geguckt ? Oder nur mit find gesucht ...


leider.. gibt es kein .java...  das einzige was ich gefunden habe:

com.apple.java.util.prefs.plist
com.apple.ncprefs.plist
com.apple.speech.recognition.AppleSpeechRecognition.prefs.plist
com.apple.speech.voice.prefs.plist



JStein52 hat gesagt.:


> Ich habe mal das da gefunden:
> Unix und Mac OS X speichern die Einstellungen in XML-Dateien. Die Systemeigenschaften landen bei Unix unter /etc/.java/.systemPrefs und die Benutzereigenschaften lokal unter $HOME/.java/.userPrefs. Mac OS X speichert Benutzereinstellungen im Verzeichnis /Library/Preferences/.


jupp... also ich hab das ganze mal auf einem debian & ubuntu getestet... da hat es einen .java verzeichnis im home verzeichnis erstellt und alles wie erwartet.


JStein52 hat gesagt.:


> Und ich habe das jetzt gerade auf einem Mac probiert:
> 
> ```
> public class Main {
> ...


bei mir wurden auch die prefs geladen.. aber wie du habe ich kein file oder sonst was gefunden


----------



## Tobse (9. Apr 2017)

Um das hier mal abzukürzen:

Für einen realen Anwendungsfall wäre es mMn. sträflich, Applikationsspezifische Einstellungen in Globalen Dateien (wie der Registry oder den benanten Dateien) abzulegen. Ich benutze die Standard-Preferences in meinen Anwendungen deshalb nicht.
Stattdessen macht es IMHO deutlich mehr Sinn, die Preferences in eine Applikations-Spezifische Datei zu schreiben. Da weiss man, wo sie liegt, und andere Software spuckt einem nicht in die Suppe. Ich habe mir dafür eine simple XML-Implementierung geschrieben:
https://github.com/tmarsteel/xmlprefs

Das würde ich dir auch empfehlen. Nimm eine Implementierung der Preferences, bei der du den Speicherort bestimmen kannst. Gibts unzählige im Netz.


----------



## Tobse (9. Apr 2017)

[ Doppelpost ]


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Für einen realen Anwendungsfall wäre es mMn. sträflich, Applikationsspezifische Einstellungen in Globalen Dateien (wie der Registry oder den benanten Dateien) abzulegen.


Warum ? Gibt es da eine Begründung ...


Tobse hat gesagt.:


> Da weiss man, wo sie liegt, und andere Software spuckt einem nicht in die Suppe.


Warum muss man das eigentlich wissen ?


----------



## cyb0rg (9. Apr 2017)

Tobse hat gesagt.:


> Um das hier mal abzukürzen:
> 
> Für einen realen Anwendungsfall wäre es mMn. sträflich, Applikationsspezifische Einstellungen in Globalen Dateien (wie der Registry oder den benanten Dateien) abzulegen. Ich benutze die Standard-Preferences in meinen Anwendungen deshalb nicht.
> Stattdessen macht es IMHO deutlich mehr Sinn, die Preferences in eine Applikations-Spezifische Datei zu schreiben. Da weiss man, wo sie liegt, und andere Software spuckt einem nicht in die Suppe. Ich habe mir dafür eine simple XML-Implementierung geschrieben:
> ...


und ich wollte eigentlich mal etwas nehmen was bereits geliefert wird vom SDK  naja werde wohl nicht drum herum kommen eine andere implementierung zu nehmen.


----------



## Thallius (9. Apr 2017)

JStein52 hat gesagt.:


> Warum ? Gibt es da eine Begründung ...
> 
> Warum muss man das eigentlich wissen ?



Alleine schon weil ich es zum kotzen finden wenn Programme nur über einen Deinstaller zu entfernen sind. Das mögen Windows User für normal halten weil sie es einfach nicht besser kennen aber beim Mac ziehst du einfach das eine .app File in den Papierkorb und alle zum programmgehörigen Files werden gelöscht. Ausnahmen bilden hier nur Programme die explizit Daten abspeichern die auch nach dem löschen des Programmes noch interessant sein können. Diese können aber nur gespeichert werden wenn der User vorher danach gefragt wird wo diese Daten gespeichert werden sollen und er von daher selber entscheiden kann was und wo hinkommt.


Dieses unsägliche in die registry schreiben ist der größte Kropf von Windows überhaupt und wer sich das damals ausgedacht hat gehört erschlagen...

Claus


----------



## Thallius (9. Apr 2017)

cyb0rg hat gesagt.:


> und ich wollte eigentlich mal etwas nehmen was bereits geliefert wird vom SDK  naja werde wohl nicht drum herum kommen eine andere implementierung zu nehmen.



Serialisierung, XML, JSON, Textfiles gibs alles innerhalb des SDK....


----------



## JStein52 (9. Apr 2017)

Thallius hat gesagt.:


> beim Mac ziehst du einfach das eine .app File in den Papierkorb und alle zum programmgehörigen Files werden gelöscht.


Das mögen Mac-User für normal halten weil sie es nicht anders kennen  Wenn du auf dem Mac mal in die .-Directories in deinem $HOME schaust wird da auch genug angelegt was beim "Deinstallieren" nie entfernt wird. Was ist da gut dran. Ich finde ein Installer/Deinstaller gehört zu einer Applikation dazu und dass das beim Mac nicht so ist (jedenfalls beim Deinstall) halte ich eher für eine Schwäche als für ein Feature


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Das mögen Mac-User für normal halten weil sie es nicht anders kennen  Wenn du auf dem Mac mal in die .-Directories in deinem $HOME schaust wird da auch genug angelegt was beim "Deinstallieren" nie entfernt wird. Was ist da gut dran. Ich finde ein Installer/Deinstaller gehört zu einer Applikation dazu und dass das beim Mac nicht so ist (jedenfalls beim Deinstall) halte ich eher für eine Schwäche als für ein Feature


Genug Deinstaller unter Windows lassen auch allerhand da...

Außerdem will ich doch oftmals gar nicht, das die paar Byte an Einstellungen einfach so gelöscht werden, müsste ich ja beim nächsten mal alles neu einstellen...


----------



## Meniskusschaden (9. Apr 2017)

Thallius hat gesagt.:


> Dieses unsägliche in die registry schreiben ist der größte Kropf von Windows überhaupt und wer sich das damals ausgedacht hat gehört erschlagen...


Insgesamt gefällt es mir auch besser, wenn die Einstellungen in Konfigurationsdateien liegen. Trotzdem sehe ich auch Vorteile in einer zentralen Registry. Die Einstellungen können dann vom Administrator mit Bordmitteln über Gruppenrichtlinien für die gesamte Domäne verwaltet werden, ohne dass der Programierer etwas dafür vorbereiten muß.


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> Genug Deinstaller unter Windows lassen auch allerhand da...


Dann ist der Deinstaller schlecht gemacht.
Ich habe ja auch einen Mac da stehen, aber versuche da mal rauszufinden welche Software in welcher Version installiert ist ? Oder bin ich nur zu doof dazu ? Bisher habe ich mich nie darum gekümmert aber durch das Thema habe ich mal nachgeschaut was ich denn alles so für unbekannte Dateien bei mir rumstehen habe .... Gruselig, und mich hat nie ein Programm danach gefragt welche Einstellungen es wohin speichern soll. Und da ich nicht weiss welche Datei wozu gehört werde ich auch die Finger davon lassen ---> der Leichenberg wächst immer nur. Und man kann diese ganzen unbekannten Dateien auch als eine Art Registry ansehen, aber wild verteilt und ausser Kontrolle.


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Ich habe ja auch einen Mac da stehen, aber versuche da mal rauszufinden welche Software in welcher Version installiert ist ? Oder bin ich nur zu doof dazu ?


Rechtsklick aufs Programm -> Information. 
Oder wenns läuft: Im Menü auf "Über ...".
So schwer ist das jetzt auch nicht...


JStein52 hat gesagt.:


> Bisher habe ich mich nie darum gekümmert aber durch das Thema habe ich mal nachgeschaut was ich denn alles so für unbekannte Dateien bei mir rumstehen habe .... Gruselig, und mich hat nie ein Programm danach gefragt welche Einstellungen es wohin speichern soll. Und da ich nicht weiss welche Datei wozu gehört werde ich auch die Finger davon lassen ---> der Leichenberg wächst immer nur. Und man kann diese ganzen unbekannten Dateien auch als eine Art Registry ansehen, aber wild verteilt und ausser Kontrolle.


Unter Windows ist das nicht anders, nur liegen sie da sowohl in den Verzeichnissen (wie bei Unixoiden) als AUCH in der Registry, da gibts also noch mehr Raum für Leichen 

Dateien von denen ich nicht weis woher sie sind, sind auch recht selten...


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> Unter Windows ist das nicht anders, nur liegen sie da sowohl in den Verzeichnissen (wie bei Unixoiden) als AUCH in der Registry, da gibts also noch mehr Raum für Leichen


Ja genau, aber nur weil es dann Leute wie @cyb0rg gibt die dann sagen ich mach was eigenes und lege meine Dateien dort ab wo ich will. Genau das soll ja mit >Preferences vermieden werden.


mrBrown hat gesagt.:


> Rechtsklick aufs Programm -> Information.


Ja wenn ich schon weiss was ich suche dann ja. Aber wie kriege ich die Liste der installierten Software. Algemein gesagt: Softwaremanagement auf dem Mac halte ich für eine Katastrophe .... Microsoft bemüht sich wenigstens darum und bietet die Mittel an. Wenn sie keiner nutzt .....   Es ist ja auch nie die Badehose schuld wenn man ertrinkt


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Ja genau, aber nur weil es dann Leute wie @cyb0rg gibt die dann sagen ich mach was eigenes und lege meine Dateien dort ab wo ich will. Genau das soll ja mit >Preferences vermieden werden.



Oder  auch einfach, weil nicht alles rein passt und Config-Datein manchmal auch einfach leichter sind?



JStein52 hat gesagt.:


> Ja wenn ich schon weiss was ich suche dann ja. Aber wie kriege ich die Liste der installierten Software. Algemein gesagt: Softwaremanagement auf dem Mac halte ich für eine Katastrophe .... Microsoft bemüht sich wenigstens darum und bietet die Mittel an. Wenn sie keiner nutzt ..... Es ist ja auch nie die Badehose schuld wenn man ertrinkt


Einfach ein `ls /Applications` oder den Paketmanager deiner Wahl fragen?
Ist ja wieder unter Windows nicht anders...


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> Ist ja wieder unter Windows nicht anders...


Doch klar ist es da anders. Da habe ich keinen Paketmanager meiner Wahl sondern die Systemsteuerung. Da weiss ich also genau wo ich hinlangen muss.



mrBrown hat gesagt.:


> Oder auch einfach, weil nicht alles rein passt und Config-Datein manchmal auch einfach leichter sind?


Wieder die Frage: warum ? Was passt wo nicht rein ?



mrBrown hat gesagt.:


> Rechtsklick aufs Programm -> Information.


Ich lerne ja gerne dazu und versuche die Version meines Teamviewers auf dem Mac rauszufinden. Da geht nix mit Rechtsklick. Beim Rechtsklick kommt Optionen, Ausblenden, beenden ... nix mit Info. Und wenn der Teamviewer nicht selber den Info-Button drin hätte (aber erst nachdem ich ihn starte !!) dann gibts da gar nix


----------



## JStein52 (9. Apr 2017)

Wir sind aber ein bisschen vom Thema abgekommen. Ich habe ja nur widersprochen immer reflexartig die Empfehlung zu geben "mach lieber was eigenes". Genau das halte ich für den Grund allen Übels, nicht den Mac


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Doch klar ist es da anders. Da habe ich keinen Paketmanager meiner Wahl sondern die Systemsteuerung. Da weiss ich also genau wo ich hinlangen muss.


In der eben nicht alles landet. Also muss man zusätzlich per Hand suchen.
Davon ab ersetzt die wohl kaum einen Paketmanager und kann zB Abhängigkeiten auflösen etc...



JStein52 hat gesagt.:


> Wieder die Frage: warum ? Was passt wo nicht rein ?


Einfaches Beispiel: nachgeladene Bilder, passen eher nicht in die Registry, also doch wieder eigenes Verzeichnis
Die Config-Datei kann ich einfach bearbeiten, kopieren, auf nem anderem Rechner benutzen. Mit der Registry ist das so eher nicht möglich. 


JStein52 hat gesagt.:


> Ich lerne ja gerne dazu und versuche die Version meines Teamviewers auf dem Mac rauszufinden. Da geht nix mit Rechtsklick. Beim Rechtsklick kommt Optionen, Ausblenden, beenden ... nix mit Info. Und wenn der Teamviewer nicht selber den Info-Button drin hätte (aber erst nachdem ich ihn starte !!) dann gibts da gar nix


Musst auch die .app nehmen, nicht irgendeinen Alias.


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> In der eben nicht alles landet. Also muss man zusätzlich per Hand suchen.


Badehosenprinzip. Würde der Installer es sauber eintragen .....


mrBrown hat gesagt.:


> Einfaches Beispiel: nachgeladene Bilder, passen eher nicht in die Registry, also doch wieder eigenes Verzeichnis


Das sind aber auch keine Preferences .....  Und kein Mensch würde die in einer config-Datei speichern.


mrBrown hat gesagt.:


> Die Config-Datei kann ich einfach bearbeiten, kopieren, auf nem anderem Rechner benutzen. Mit der Registry ist das so eher nicht möglich.


Doch klar. Aber ob das so erwünscht ist .... und überhaupt notwendig ? Wohl gemerkt, wir reden nicht von irgendwelchen Applikationsdaten sondern von Preferences


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Badehosenprinzip. Würde der Installer es sauber eintragen .....


Tun sie halt nicht. Und wenn es alle richtig machen, dann sollte man davon ausgehen dass es unter Unixoiden auch alle richtig machen, oder?

Dann hat man kryptische Registry für einiges + Dateisystem für anderes bei Windows gegen offenes Dateisystem für alles bei Unix. Da gefällt mir der offene Weg doch besser...

Und was ist unter Windows eigentlich mit Programmen, die man gar nicht installieren will und kann? So eine typische jar zum Beispiel?
Unter Unix funktioniert die wie jedes Programm, unter Windows darf man die dann nicht mehr benutzen, weil kein installer benutzt wird?



JStein52 hat gesagt.:


> Das sind aber auch keine Preferences ..... Und kein Mensch würde die in einer config-Datei speichern.



Trotzdem werden sie gespeichert, bei Unixoiden an genaue einer Stelle zusammen mit allen anderen Daten, bei Windows wild verteilt 



JStein52 hat gesagt.:


> Doch klar. Aber ob das so erwünscht ist .... und überhaupt notwendig ? Wohl gemerkt, wir reden nicht von irgendwelchen Applikationsdaten sondern von Preferences


Ja ist's, meine Configs kann ich wie ich will zwischen allen Unixoiden hin und her schieben und tue das auch. Ich will ja nicht jedes Mal alles neu einrichten wenn ich nen neuen Rechner nutze...


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> Ich will ja nicht jedes Mal alles neu einrichten wenn ich nen neuen Rechner nutze...


Wenn du willst kann ich dir die Preferences aus dem Beispiel des TE schicken, die kannst du dann per Doppelklick auf deinem Rechner einspielen.


mrBrown hat gesagt.:


> bei Windows wild verteilt


Unsinn. gerade da nicht wild verteilt. Da hast du sie mit einem einzigen Suchbefehl im regedit gefunden und z.B. exportiert.


mrBrown hat gesagt.:


> Und was ist unter Windows eigentlich mit Programmen, die man gar nicht installieren will und kann? So eine typische jar zum Beispiel?


Das fällt jetzt wieder unter das Thema Softwaremanagement und ist auf Windows und Unix/Mac gleich. Wenn du auf dem Mac kein Package draus machst und auf Windows kein Setup sind die da völlig gleichwertig zu sehen (als Trash den man mal zum rumspielen da liegen hat)


----------



## mrBrown (9. Apr 2017)

JStein52 hat gesagt.:


> Wenn du willst kann ich dir die Preferences aus dem Beispiel des TE schicken, die kannst du dann per Doppelklick auf deinem Rechner einspielen.


Wenn ich ein Windows hätte...Wäre es eine Datei könnte ich die unter so ziemlich jedem OS nutzen...



JStein52 hat gesagt.:


> Unsinn. gerade da nicht wild verteilt. Da hast du sie mit einem einzigen Suchbefehl im regedit gefunden und z.B. exportiert.


Aber eben nur das, was in der Regex liegt, wo eher nicht alles liegt...
Alles andere liegt ja wild verteilt irgendwo



JStein52 hat gesagt.:


> Das fällt jetzt wieder unter das Thema Softwaremanagement und ist auf Windows und Unix/Mac gleich. Wenn du auf dem Mac kein Package draus machst und auf Windows kein Setup sind die da völlig gleichwertig zu sehen (als Trash den man mal zum rumspielen da liegen hat)


So ziemlich jedes der Programme die ich hier hab musste man nur in die Applications kopieren, nichts mit Setup. Da sind durchaus auch jars bei, die sind alles andere als Trash...
Hier gibts keinen Unterscheid zwischen 'ner jar die ich im Downloads-Ordner aus den grad geladenen Source-Datein kompiliere starte und irgendeinem anderem Programm


----------



## JStein52 (9. Apr 2017)

mrBrown hat gesagt.:


> Aber eben nur das, was in der Regex liegt, wo eher nicht alles liegt...
> Alles andere liegt ja wild verteilt irgendwo


Wir drehen uns irgendwie im Kreis. Ich werte das alles mal als persönliche Vorlieben. Besser wäre halt wenn es eine Vorgabe gäbe die man einfach einhalten muss und aus die Maus.
Und zu den jar's die mal so eben rumkopierst .... Ich glaube du redest hier von deinem Entwicklerrechner den du ja gerne nach Belieben vollmüllen darfst. Aber ernsthafte Software die du an Kunden auslieferst wirst du kaum mal eben so rumkopieren.  Wir machen Software die aus Windows-Komponenten für ca. 8000 Benutzer in ganz Deutschland besteht und aus Serverkomponenten die auf Solaris und Linux-Rechnern in 15 Rechenzentren in den einzelnen Bundesländern installiert wird. Ein Abnahmetest besteht darin die ganzen Pakete auf leeren Rechnern (Windows + Unix) zu intallieren, einen Tag Testbetrieb zu machen und zu deinstallieren. Wenn dann auch nur eine Datei übrig ist haben wir eine Fehlermeldung am Hals. (gilt übrigens auch für Registry-Einträgen auf den PC's) .  Da lernst du saubere Software und Installer/Deinstaller zu machen. Und selbst wenn wir für den Betrieb mal nur eine jar-Datei korrigieren wird die per Setup Installiert denn es gilt u.a. Versionsangaben in der Registry zu aktualisieren.


----------



## Tobse (9. Apr 2017)

JStein52 hat gesagt.:
			
		

> Besser wäre halt wenn es eine Vorgabe gäbe die man einfach einhalten muss und aus die Maus.


Ja viel Spaß damit, wenn diese Lösung mal nicht passt. Oder viel Spaß mit der 50-fach Overengineerten Lösung, die für alles passen muss. Beides BS. Ich sagte auch nicht "mach was eigenes" sondern "lege die Daten dort ab, wo du Kontrolle darüber hast".



			
				JStein52 hat gesagt.:
			
		

> Warum muss man das eigentlich wissen ?


Na, dreimal darfst du Raten. Noch nicht drauf gekommen? Was ist denn, wenn du mal in die gespeicherten Daten schauen MUSST? Sagst du dann deinem Kunden "Tschuldigung, ich hab das zwar entwickelt, aber wo jetzt ihre Daten sind, weiss ich leider auch nicht.". Bei ein paar simplen Einstellungen kann eine manuelle Neukonfiguration ja noch okey sein. Aber sobald es komplexer wird, ist das keine Option mehr. Und spätestens dann musst du deinen Nutzern wenigstens einen Import/Export der Daten zur Verfügung stellen. Und siehe da: jeder macht sein eigenes Ding. Nix erreicht. Also warum dann nicht gleich einfacher?

Die Software, an der ich täglich arbeite, hat c.a. 1000 Konfigurationswerte. Auf dem Server, auf dem sie läuft, stehen die in .properties Dateien. Es ist genau dokumentiert wo diese Einstellungen zu finden und zu ändern sind. Das ist 100 mal einfacher als für jede dumme Linux-Distro, auf der das Teil läuft, neu zu recherchieren wo Java seine Preferences hinpackt. Einen Import/Export der Settings brauchen wir nicht - man kopiert einfach die .properties Dateien.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Und spätestens dann musst du deinen Nutzern wenigstens einen Import/Export der Daten zur Verfügung stellen.


Quatsch. Meine Benutzer können unsere Anwendung benutzen und das war es auch schon. An Preferences soll man gar nichts rumfummeln können. Also ist es so was von wurscht wo die liegen....

Edit: Aber ich glaube ihr seht das alles aus eurer Entwicklersicht. Da mag das ja hinkommen.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> hat c.a. 1000 Konfigurationswerte. Auf dem Server, auf dem sie läuft, stehen die in .properties Dateien. Es ist genau dokumentiert wo diese Einstellungen zu finden und zu ändern sind. Das ist 100 mal einfacher .....


Und dafür gibts ja die Properties-Klasse.


----------



## Tobse (9. Apr 2017)

JStein52 hat gesagt.:


> Quatsch. Meine Benutzer können unsere Anwendung benutzen und das war es auch schon.


Ernsthaft? Entwicklersicht? Ich weiss ja nicht, in welcher Welt du lebst. Die Anwendungen, die ich regelmäßig benutze haben viele, viele Einstellungsmöglichkeiten. Die sind alle per GUI erreichbar. Aber wenn ich meinen PC neu installiere möchte ich nicht 10 Stunden damit zubringen, diese Einstellungen neu vorzunehmen. Ganz abgesehen von dem Aufwand, den ich treiben muss, um mir die ganzen Werte zu merken oder zu speichern. Da keine import/export Funktion zu haben werte ich als *miese Usability*. Soviel zum Thema Entwicklersicht...



JStein52 hat gesagt.:


> Und dafür gibts ja die Properties-Klasse.


Und dann gibt es Einstellungen, für welche Properties zu simpel gehalten ist. Was macht man da? Man baut sich nichts eigenes sondern nimmt die Preferences. Aber bitteschön so, dass ich nicht die Kontrolle verliere.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Ernsthaft? Entwicklersicht? Ich weiss ja nicht, in welcher Welt du lebst. Die Anwendungen, die ich regelmäßig benutze haben viele, viele Einstellungsmöglichkeiten.


Ja, bleibe ich dabei. Du schreibst ja selber die Anwendungen die *ich *benutze. Und wenn die wirklich so viele Einstellungsmöglichkeiten haben und man die auch noch eintragen muss werte ich das als Design-Fehler in dieser Anwendung. Vielleicht bin ich aber auch voreingenommen durch die Welt unserer Anwender ... und die ist Windows. Jedenfalls der Teil den sie sehen. Wir haben auch mal so angefangen wie du dass alles in irgendwelchen Dateien rumlag und nach 10 Change requests unserer Rechenzentren und vielen Fehlermeldungen zu dem Thema musste das alles in die Registry. Für unsere Rechenzentrumsbetreuer ist das die zentrale Stelle und die Anwender fummeln da absolut nichts dran rum. Jetzt kannst du höchstens fragen in welcher Welt die Rechenzentrumsleute leben ... Aber ich halte die da für professioneller als mich und denke dass sie den Betrieb gut im Griff haben.


----------



## Tobse (9. Apr 2017)

Fürs Rechenzentrum gibts bei uns Images oder Docker-Container. Kein Spielraum für Fehler von den Leuten, die die Server betreiben; man kann alles vorher testen.
10 neue Server fürs System? Kein Problem, passiert automatisiert. Die ITler im Rechenzentrum müssen nur dafür sorgen, dass die Hardware läuft, ein kompatibles OS läuft und der Netzzugang funktioniert.

Viele Einstellungen => Deisgnfehler? Da bin ich absolut anderer Meinung. Diese Anwendungen haben viele Einstellungen, die alle ihren Sinn und Zweck haben und ich möchte keine davon missen:

IntelliJ IDEA (IDEs im allgemeinen)
SONAR X3 (DAW)
sämtliche meiner Spiele, speziell CS:GO, aber auch dinge wie TESO. Das sind dann Einstellungen wie
Tastaturbelegung (c.a. 30 Werte pro Anwendung)

Dinge wie Mausempfindlichkeit, Farben, Grafikeinstellungen, ...

Diese Einstellungen händisch vorzunehmen dauert _Ewigkeiten; _zumindest habe ich das letzte mal viel zu lange dafür gebraucht.

Diese Anwendungen haben entweder eine import/export Funktion für die Einstellungen oder speichern diese Textbasiert an bekannten Orten. Dadurch kann ich die Einstellungen in meinem Cloud-Speicher halten und beim neu-installieren muss ich 10-15 Datein Copy&Pasten anstatt hunderte Regler, Checkboxen und Eingabefelder mit riesigen Fehlerpotential neu anzufassen.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Fürs Rechenzentrum gibts bei uns Images oder Docker-Container. Kein Spielraum für Fehler von den Leuten, die die Server betreiben; man kann alles vorher testen.


Schon wieder schreibst du "bei uns"  also Entwicklersicht. Ich denke mal unsere Rechenzentren werden ihre Benutzer auch nicht einzeln und per Hand installieren. Wäre bei 8000 PC's auch ein bisschen mühsam. Und du vergisst immer dass es in der Registry sehr wohl eine Export/Import - Funktion gibt mit der du mit einem Mausklick einen ganzen Knoten mit beliebig vielen Einträgen exportieren kannst. Aber ok, ist bei uns reine Windows-Welt Und der Benutzerlevel ist "Putzfrau", da brauchst du nicht damit zu kommen dass er doch in dieser und jener Datei mal was eintragen soll. Was aber nichts daran ändert dass sich bei der Benutzung der Anwendungen laufend Preferences ändern ... und irgendwo gespeichert weren müssen. Und zwar nicht nur dadurch dass der Benutzer irgendwo auf "Einstellungen speichern" klickert ....


----------



## Tobse (9. Apr 2017)

Na mit "bei uns" meine ich die Software und die Nutzer, mit denen ich und meine Kollegen zu tun haben.

Ich denke es läuft wohl darauf hinaus, dass es kein Allheilmittel für dieses Problem gibt. Muss man wohl per Software neu entscheiden, unter Einbezug der Betriebsumgebung, der Ansprüche der Endanwender und dem Umfang der Einstellungsmöglichkeiten.


----------



## JStein52 (9. Apr 2017)

Ja, ganz genau. Und ich denke alle Möglichkeiten (in Java z.B. Preferences, Properties und was es noch so gibt) haben ihre Daseinsberechtigung und ihre typischen Anwendungsfälle.


----------



## cyb0rg (9. Apr 2017)

```
public class Main {

    public static void main(String[] args) {

        Properties prop = new Properties();
        try {
            OutputStream output = new FileOutputStream("First.Properties.Try");
            prop.setProperty("ersterKey", "FirstValue");
            prop.setProperty("SecondKey", "SecondValue");

            prop.store(output, null);

        } catch (IOException e){
            e.printStackTrace();
        }

    }
}
```

So, inzwischen habe ich eine für mich praktikable und funktionierende Lösung 
werde einen default wert definieren wo das ganze abgespeichert werdenn soll (beim home user verzeichnis...) aber dennoch über GUI einen anderen pfad zulassen.

danke für eure hilfe!


----------



## JStein52 (9. Apr 2017)

cyb0rg hat gesagt.:


> danke für eure hilfe!


Gerne, war uns ein Vergnügen


----------



## Xyz1 (9. Apr 2017)

Was ist hier denn eine Diskussion ausgebrochen...... Wenn es keine Konvention dafür gibt, dann ist eben Gesunder Menschenverstand gefragt. 
----
Frage des TEs hat sich ja schon erledigt.
----
BTW.: Man sollte auf jedem OS entwickeln/umgehen können.


----------



## JStein52 (9. Apr 2017)

DerWissende hat gesagt.:


> Wenn es keine Konvention dafür gibt, dann ist eben Gesunder Menschenverstand gefragt.


Amen ....


----------



## JStein52 (9. Apr 2017)

DerWissende hat gesagt.:


> BTW.: Man sollte auf jedem OS entwickeln/umgehen können.


Wir könnten noch ein bisschen diskutieren wie das auf Android aussieht


----------



## Tobse (9. Apr 2017)

JStein52 hat gesagt.:


> Wir könnten noch ein bisschen diskutieren wie das auf Android aussieht


Naja, auf Android gibt es eine wirklich gute Standardlösung. Wenn man die SharedPreferences benutzt kann Android die Einstellungen sogar über die Cloud synchronisieren. Und der Speicherort dafür ist auch bekannt. Hatte da noch nie Probleme mit.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Wenn man die SharedPreferences benutzt kann Android die Einstellungen sogar über die Cloud synchronisieren.


Du meinst Google kann die über die Cloud synchronisieren


----------



## Tobse (9. Apr 2017)

JStein52 hat gesagt.:


> Du meinst Google kann die über die Cloud synchronisieren


Stimmt, da hast du Recht.


----------



## JStein52 (9. Apr 2017)

Tobse hat gesagt.:


> Und der Speicherort dafür ist auch bekannt. Hatte da noch nie Probleme mit.


Ich halte diese SharedPreferences ja auch für gut und es hat mich noch nicht gekümmert wo die lagen. Hauptsache es funktioniert. Aber mal Hand aufs Herz: dort legst du doch sicher auch keinen Wert darauf dass du weisst wo die Datei liegt damit du dem Handy-Fummler sagen kannst in Datei Soundso musst du die 17. Zeile ändern


----------



## Tobse (9. Apr 2017)

JStein52 hat gesagt.:


> Ich halte diese SharedPreferences ja auch für gut und es hat mich noch nicht gekümmert wo die lagen. Hauptsache es funktioniert. Aber mal Hand aufs Herz: dort legst du doch sicher auch keinen Wert darauf dass du weisst wo die Datei liegt damit du dem Handy-Fummler sagen kannst in Datei Soundso musst du die 17. Zeile ändern


Nein, um Gottes willen :O Das sage ich auch dem User meiner Java SE Desktop Anwendung nicht. Der bekommt gesagt:
Einstellungen im Menü der Applikation ändern. Datei -> Einstellungen -> Fingerhut -> Farbe. Fürs Backup diese & diese Datei kopieren. Wenn du dadrin was anfasst verlierst du die Garantie.

---
Dem Server-Admin, der meine Anwendung betrieben muss, gebe ich hingegen eine genau Auflistung aller Einstellungsmöglichkeiten jeder .properties Datei. Der ist technisch versiert genug dafür und braucht keine GUI (und möchte sie auch garnicht).


----------



## JStein52 (9. Apr 2017)

Ok, dann haben wir vorhin nur um die technische Umsetzung dieser Anforderungen diskutiert


----------



## cyb0rg (9. Apr 2017)

also die preferences frage hat sich für mich soweit geklärt, dass ich weiss wie ich es im moment zu mindest tue  nichts desto trotz sehe ich aufgrund der diskussion, dass es da unterschiedliche erfahrungen gibt und blickwinkel.
Das Tool welches ich aktuell am schreiben bin ist noch relativ klein. Das grösste Tool welches ich auf Java geschrieben habe bisher war ein MailClient (Semesterarbeit) da hatte ich übrigens ein text file direkt geschrieben mit preferences.. hatte wenig zeit mich damit ausseinander zu setzen...
Mich würde jetzte aktuell interessieren ob es die Tools die ihr so schreibt, bei dennen es sich um etwas grösseres handeln, ob es diese OpenSource gibt um etwas zu lernen?


----------

