Simion
Anmeldungsdatum: 14. August 2018
Beiträge: 79
|
Hallo, ich möchte gerne ein kleines Programmierprojekt starten. Ich habe zwar eine Ausbildung im Bereich der Programmierung, meine Erfahrung habe ich bissher jedoch nur unter Windows gemacht. Deshalb bin ich unter Linux noch sehr unerfahren. Ich würde gerne eine ordentliche und konforme Anwendung erstellen. Deshalb wollte ich mich mal erkundigen, ob es möglichst für Ubuntu oder zumindes für Linux allgemein so etwas wie Programmierrichtlinien gibt? Folgendes würde mich z. B. interessieren: Welche Bibliothek sollte man für das UI verwenden, um ein einheitliches Look & Feel zu erreichen. In welchen Verzeichnissen sollte man welche Dateien speichern (z. B. Log-Dateien, Dateien mit programmspezifischen Parametern, Bibliotheken und Executables der Anwendung). Welche empfolenen Mechanismen gibt es, um Parameter für eine Anwendung bereitzustellen, die auch verändert werden können ohne das Programm aktualisieren zu müssen (neu kompilieren). Welche Programmiersprachen werden empfohlen? Ich würde z. B. gerne C/C++ gegenüber JAVA den Vorzug geben.
Mein Ziel wäre es, dass die Anwendung langfristig und letztendlich unter Ubuntu (höchste Prio), Windows und Mac OS X (niedrigste Prio) lauffähig ist. Die Anwendung muss jedoch nicht komplett portabel sein. Das UI und auch anderen Schnittstellen, bei denen dies sinnvoll wäre, würde ich jeweils OS-spezfisch entwickeln (implementieren). Viele Grüße
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5350
|
Simion schrieb: Die Klassiker sind hier Gtk (bzw gtk+ und gtkmm, bei GNOME) und qt (bei KDE). Ein Blick ueber den Tellerrand auf das freedesktop SDK kann hier auch nicht Schaden: https://gitlab.com/freedesktop-sdk/freedesktop-sdk Hier gibt es den LSB/Freedesktop Standard, die /usr/bin , /usr/lib etc vorgeben. Fuer Daten, die die Nutzer betreffen (lokale Konfigurationen) ist ~/.config/ der richtige Ort. Welche empfolenen Mechanismen gibt es, um Parameter für eine Anwendung bereitzustellen, die auch verändert werden können ohne das Programm aktualisieren zu müssen (neu kompilieren). Welche Programmiersprachen werden empfohlen? Ich würde z. B. gerne C/C++ gegenüber JAVA den Vorzug geben.
Grundsaetzlich das, was du kannst 😉 Wenn du C/C++ beherrscht, sind die sicherlich eine gute Wahl
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6346
Wohnort: Hamburg
|
Welche Bibliothek sollte man für das UI verwenden, um ein einheitliches Look & Feel zu erreichen.
Ich habe das nicht selber ausprobiert, gehe aber davon aus, dass alle Toolkits das anstreben.
Welche empfolenen Mechanismen gibt es, um Parameter für eine Anwendung bereitzustellen, die auch verändert werden können ohne das Programm aktualisieren zu müssen (neu kompilieren).
Reden wir hier über Plugins? Das würde ich dann aber nicht mehr als kleines Projekt ansehen.
In welchen Verzeichnissen sollte man welche Dateien speichern ...
Bei kleinere Projekten und wenn du keine Pakete bauen willst, sollten die Executables nach /usr/local/bin/ (alles was nicht über die Paketverwaltung installiert wird). Wenn du eigene Libs mitbringst, klingt das eher nach Pakete bauen.
Die Anwendung muss jedoch nicht komplett portabel sein. Das UI und auch anderen Schnittstellen, bei denen dies sinnvoll wäre, würde ich jeweils OS-spezfisch entwickeln (implementieren).
Die Anwendungen müssen in jedem Fall für die jeweilige Zielplattform übersetzt werden. Bei den großen Toolkits sollten aber so gut wie keine Änderungen am Quelltext erforderlich sein. Bei weniger verbreiteten Toolkits wie z.B. wxWidgets oder FLTK kann das anders sein. Wenn ich z.B. bei FLTK mit der Soundkarte arbeiten möchte, muss ich mich selber darum kümmern. Unter Linux muss ich dann selber mit Alsa arbeiten und unter Windows dann mit DirectX (wenn ich mich richtig erinnere). Da muss ich dann wirklich Plattform abhängigen Code schreiben. Einige deiner Fragen lassen mich vermuten, dass dein Projekt nicht wirklich klein ist, oder wir zumindest unterschiedliche Sichtweisen dazu haben.
|
Simion
(Themenstarter)
Anmeldungsdatum: 14. August 2018
Beiträge: 79
|
Also ich bin gerade dabei einen Prototypenzu zu entwickeln auf den ich permanent refactoring anwende um wieder Ordnung in das Chaos zu bringen ☺ Also ich weiß nicht, ob meine Vorgehensweise von prinzip her richtig ist, aber ich versuche z. B. beim Entwurf folgendes zu Berücksichtigen: Die Anwendung wird zuerst als Konsolenanwendung entwickelt. Aktuell werden sämtliche Parameter als Argumente an die Anwendung übergeben. Gibt es hier evtl. Richtlinien oder Styleguides, wie man die Syntax der Argumente definieren sollte, die man an die Anwendung übergibt und gibt es hier evtl. Bibliotheken, mit der man die Argumentenliste parsen kann? Es soll auch eine Möglichkeit geben die Anwendung mit Parametern zu konfigurieren, die sich z. B. jährlich aufgrund von Gesetzesänderungen ändern können. Hierzu stelle ich mir von Prinzip soetwas wie die Properties-Dateien in JAVA vor. Also eine Datei, die an einem bestimmten Ort gespeichert ist und die von der Anwendung beim Start eingelesen wird. Ich erwarte, dass die Argumentliste sehr lang wird. Deshalb möchte ich auch eine Schnittstelle implementieren, mit der man die Parameter über eine Datei einlesen kann. Gibt es hierfür vielleicht ein unter Ubuntu (Linux) übliches Dateiformat und Bibliotheken zur Verarbeitung (wie z. B. die Properties-Dateien unter JAVA). Als letztes würde ich dann eine UI implementieren, die dann möglichst nur die Argumentliste zusammenbaut und damit dann die Konsolenanwendung ausführt. Den Standard- und Error Output sollte die UI auch interpretieren und ausgeben können.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Simion schrieb: Also ich bin gerade dabei einen Prototypenzu zu entwickeln auf den ich permanent refactoring anwende um wieder Ordnung in das Chaos zu bringen ☺
Eventuell tut es für den Prototyp auch erst mal eine Sprache, die Chaos vermeidet - für mich klingt es so, als ob man das ziemlich funktional runterschreiben könnte 😇 Die Anwendung wird zuerst als Konsolenanwendung entwickelt. Aktuell werden sämtliche Parameter als Argumente an die Anwendung übergeben. Gibt es hier evtl. Richtlinien oder Styleguides, wie man die Syntax der Argumente definieren sollte, die man an die Anwendung übergibt und gibt es hier evtl. Bibliotheken, mit der man die Argumentenliste parsen kann?
Ich würde mich da an die POSIX-Konventionen halten: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html Bibliotheken dafür gibt es wie Sand am Meer, für C++ z.B. jarro2783/cxxopts oder https://www.boost.org/doc/libs/1_72_0/doc/html/program_options.html Sprachen mit dem "Batteries included" Ansatz bringen sowas schon mit - z.B. argparse für Python3: https://docs.python.org/3/library/argparse.html Es soll auch eine Möglichkeit geben die Anwendung mit Parametern zu konfigurieren, die sich z. B. jährlich aufgrund von Gesetzesänderungen ändern können. Hierzu stelle ich mir von Prinzip soetwas wie die Properties-Dateien in JAVA vor. Also eine Datei, die an einem bestimmten Ort gespeichert ist und die von der Anwendung beim Start eingelesen wird. Ich erwarte, dass die Argumentliste sehr lang wird. Deshalb möchte ich auch eine Schnittstelle implementieren, mit der man die Parameter über eine Datei einlesen kann. Gibt es hierfür vielleicht ein unter Ubuntu (Linux) übliches Dateiformat und Bibliotheken zur Verarbeitung (wie z. B. die Properties-Dateien unter JAVA).
Für komplexere Daten üblich sind XML, JSON oder YAML - was man nutzt, hängt davon ab, welche Anforderungen man hat und mit welchen Problemen man sich herumschlagen will. Auch hier gibt es eine große Auswahl von Bibliotheken. Als letztes würde ich dann eine UI implementieren, die dann möglichst nur die Argumentliste zusammenbaut und damit dann die Konsolenanwendung ausführt. Den Standard- und Error Output sollte die UI auch interpretieren und ausgeben können.
Da Prozesskontrolle und das Verarbeiten von stdin/stdout/stderr durch das Buffern von Daten ein steter Quell der Freude sein kann, würde ich mir stark überlegen, ob man die Datenverarbeitung nicht gleich als Thread im GUI-Programm laufen lässt - aber das wirst du schnell herausfinden, was sich da für deinen Anwendungsfall am besten eignet.
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6346
Wohnort: Hamburg
|
... und gibt es hier evtl. Bibliotheken, mit der man die Argumentenliste parsen kann?
Für mich war getopt bisher immer ausreichend.
... Also eine Datei, die an einem bestimmten Ort gespeichert ist und die von der Anwendung beim Start eingelesen wird.
Wenn das generelle Einstellungen sind, sollten diese nach /etc/ wo aber nicht jeder schreiben darf. Zum Format hat seahawk1986 ja schon was gesagt. Ich würde da, soweit es geht, nackten Text bevorzugen, da man dann für Änderungen keine weiteren Tools benötigt. Ich würde mich allerdings wundern, wenn die großen Toolkits wie Qt dafür nichts eigenes mitbringen.
Als letztes würde ich dann eine UI implementieren, die dann möglichst nur die Argumentliste zusammenbaut und damit dann die Konsolenanwendung ausführt. Den Standard- und Error Output sollte die UI auch interpretieren und ausgeben können.
Das könnte ausufern. Linux kann zwar mit recht langen Kommandozeilen umgehen, ich weiß aber nicht, wie das bei Windows aussieht. Ich mache das dann oft mit einer Pipe (popen()). Wenn du allerdings stdin, stdout und stderr brauchst wird das komplizierter und da kenne ich nichts fertiges. Ich habe mit so etwas mal experimentiert (bidirektionale Pipe), weil ich es noch nicht geschafft hatte, ein richtiges Plugin zu bauen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
Dakuan schrieb:
Als letztes würde ich dann eine UI implementieren, die dann möglichst nur die Argumentliste zusammenbaut und damit dann die Konsolenanwendung ausführt. Den Standard- und Error Output sollte die UI auch interpretieren und ausgeben können.
Das könnte ausufern. Linux kann zwar mit recht langen Kommandozeilen umgehen, ich weiß aber nicht, wie das bei Windows aussieht. Ich mache das dann oft mit einer Pipe (popen()). Wenn du allerdings stdin, stdout und stderr brauchst wird das komplizierter und da kenne ich nichts fertiges. Ich habe mit so etwas mal experimentiert (bidirektionale Pipe), weil ich es noch nicht geschafft hatte, ein richtiges Plugin zu bauen.
Es gibt keine bidirektionalen Pipes. Pipes gehen immer nur in eine Richtung. Letztlich benötigt man zwei (oder drei, falls Stdin ebenfalls verbunden werden soll) Pipes und muss nur dafür sorgen, dass der IO auf den drei Dateideskriptoren parallel bearbeitet wird, damit nicht einer die ganze Verarbeitung blockiert.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Dakuan schrieb: ... und gibt es hier evtl. Bibliotheken, mit der man die Argumentenliste parsen kann?
Für mich war getopt bisher immer ausreichend.
getopt führt zu ziemlich viel Boilerplate-Code - für ein kleines Programm mit ein paar Argumenten ist das ok, aber bei ellenlangen Optionen kann das IMHO schnell unübersichtlich werden. Die genannten C++ Bibliotheken können automatisch eine Zusammenfassung der Argumente für das Argument -h /--help generieren und einem C++ Datentypen zurückliefern, so dass man "modernes" C++ schreiben kann, bei dem man nicht mir nackten char -Pointern, null-terminierten Strings und C-Arrays hantieren muss. Dakuan schrieb: Linux kann zwar mit recht langen Kommandozeilen umgehen, ich weiß aber nicht, wie das bei Windows aussieht.
Das hängt AFAIK davon ab, welche Windows-Version man nutzt: https://support.microsoft.com/en-us/help/830473/command-prompt-cmd-exe-command-line-string-limitation
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6346
Wohnort: Hamburg
|
Es gibt keine bidirektionalen Pipes.
Ja, ich hätte es wissen müssen. Wir hatten die Vorgehensweise damals diskutiert, wenn ich mich richtig erinnere. Aber das ist schon sooo lange her.
|