Abhängigkeitspfade zu systemd und mögliche Alternativen

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 12.08.2021 13:15:03

fischig hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 12:48:28
Das allermeiste, was hier bei mir verlangt wird, sind ja libs. Und je nachdem, wie das individuelle System ansonsten gestaltet ist, mag sich der zusätzliche lib-Aufwand ja deutlich reduzieren.
Da hast du natuerlich recht. Ich habe halt sehr minimalistische Systeme, folglich habe ich die ganzen Libs noch nicht. Mein /usr hat ohne Quellcode nur 4,7 GB. Fuer eine einzige Anwendung, die ich nur alle paar Monate mal nutze, das um 10% zu vergroessern kommt mir unverhaeltnismaessig vor. Aber das ist mehr eine Grundsatzsache als in diesem Fall technische Notwendigkeit. Das geeqie von oldoldoldoldstable wuerde mir vollkommen reichen, aber um gleichwenig Features und Platzverbrauch zu haben muss ich nun ein anderes Programm nutzen. Aber wie dem auch sei ... ist nicht so wichtig. ;-)


@JTH: Danke fuer den Tipp.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: geeqie und systemd

Beitrag von MSfree » 12.08.2021 13:27:05

Meillo hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 13:15:03
Mein /usr hat ohne Quellcode nur 4,7 GB.
Das nennst du minimal?

Ich liege da in der Regel unter 2.5GB. :mrgreen:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 12.08.2021 13:41:54

MSfree hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 13:27:05
Meillo hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 13:15:03
Mein /usr hat ohne Quellcode nur 4,7 GB.
Das nennst du minimal?

Ich liege da in der Regel unter 2.5GB. :mrgreen:
Es gibt Unterschiede da dies ein FreeBSD ist, Enthalten ist dort z.B. ein Portstree mit 900MB und LLVM mit 600MB.
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: geeqie und systemd

Beitrag von hikaru » 12.08.2021 22:42:08

Hier ein Versuch, eine einzelne Abhängigkeitskette aus einem Debiandebtree-Output zu holen:

Code: Alles auswählen

#!/bin/bash

START=$1
END=$2

if [ $# -lt 3 ]
then
        DKS=${START}.dks
        debtree --no-alternatives $START 2>/dev/null > ${START}.dot
        dijkstra -dp $START ${START}.dot > $DKS
        echo $END
else
        DKS=$3
fi

egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/.\+prev=//' | tr -d '",;]' | while read PKG
do
        echo $PKG
        if [ "$PKG" != "$START" ]
        then
                $0 $START $PKG $DKS
        fi
done

Code: Alles auswählen

$ time ./dijkstra_dep.sh geeqie systemd
systemd
dbus-user-session
xdg-desktop-portal-gtk
libwebkit2gtk-4.0-37
zenity
geeqie

real	0m0,506s
user	0m0,481s
sys	0m0,050s
Die Liste ist im Vergleich zu den übrigen Beispielen hier im Thread umgekehrt zu lesen, also "Debiansystemd ist eine Abhängigkeit von Debiandbus-user-session." usw. Der Grund hierfür und für die zeilenweise Ausgabe der Pakete ist Faulheit, denn so musste ich keine Arbeit in die Präsentation stecken. ;)

Das Script legt zwei Dateien im aktuellen Verzeichnis ab: Den debtree-Output als STARTPAKETNAME.dot, und den dijkstra-Output als STARTPAKETNAME.dks.

Hintergrund:
Mein Ansatz war, den kürzesten Pfad vom Startpaket (hier Debiangeeqie) zum Zielpaket (hier Debiansystemd) zu finden. Für dieses Problem des kürzesten Weges in einem Graphen gibt es eine Standardlösung, den Dijkstra-Algorithmus. [1]
dijkstra aus Debiangraphviz ist eine Implementierung dieses Algorithmus'. graphviz wiederum ist eine Empfehlung von Debiandebtree. Es lag also nahe, dieses Programm zu nutzen.
Die Option -p gibt das jeweils vorherige Paket in de Kette mit an. So konnte ich mich relativ einfach durchhangeln.
Leider ist der dijkstra-Output sehr hässlich und nur sehr eingeschränkt steuerbar. Pakete werden mal in Anführungszeichen ("") gesetzt und mal nicht (je nachdem ob der Name nur aus alphanumerischen Zeichen besteht oder z.B. Bindestriche enthält). Auch der Zeilenabschluss (Komma oder eckige Klammer + Semikolon) hängt davon ab). Die Whitespaces in der Ausgabe sind offenbar weder Leerzeichen noch Tabs. Dass ein Record über mehrere Zeilen läuft fällt dann schon kaum noch ins Gewicht. All das lässt die grep-Zeile so kompliziert erscheinen, obwohl es eigentlich ganz trivial ist.


[1] https://de.wikipedia.org/wiki/Dijkstra-Algorithmus

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 12.08.2021 22:49:30

hikaru hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 22:42:08
Hier ein Versuch, eine einzelne Abhängigkeitskette aus einem Debiandebtree-Output zu holen:
:THX:
Die Liste ist im Vergleich zu den übrigen Beispielen hier im Thread umgekehrt zu lesen, also "Debiansystemd ist eine Abhängigkeit von Debiandbus-user-session." usw. Der Grund hierfür und für die zeilenweise Ausgabe der Pakete ist Faulheit, denn so musste ich keine Arbeit in die Präsentation stecken. ;)
Du machst einfach in die letzte Zeile hinter das `done' noch ein `|tac' und die Liste ist anders rum. ;-)
Use ed once in a while!

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: geeqie und systemd

Beitrag von JTH » 12.08.2021 22:53:12

hikaru hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 22:42:08
Mein Ansatz war, den kürzesten Pfad vom Startpaket (hier Debiangeeqie) zum Zielpaket (hier Debiansystemd) zu finden. Für dieses Problem des kürzesten Weges in einem Graphen gibt es eine Standardlösung, den Dijkstra-Algorithmus. [1]
dijkstra aus Debiangraphviz ist eine Implementierung dieses Algorithmus'. graphviz wiederum ist eine Empfehlung von Debiandebtree. Es lag also nahe, dieses Programm zu nutzen.
Cool :THX: Länger her, dass mir der über den Weg gelaufen ist.


An die Ausführungszeiten bin ich selbst mit einem Debianparallel in obiger, naiver Lösung nicht herangekommen :D
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: geeqie und systemd

Beitrag von hikaru » 13.08.2021 00:05:32

Meillo hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 22:49:30
Du machst einfach in die letzte Zeile hinter das `done' noch ein `|tac' und die Liste ist anders rum. ;-)
Hmm... :roll:

Code: Alles auswählen

$ tail dijkstra_dep.sh 

egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/.\+prev=//' | tr -d '",;]' | while read PKG
do
	echo $PKG
	if [ "$PKG" != "$START" ]
	then
		$0 $START $PKG $DKS
	fi
done | tac
$ time ./dijkstra_dep.sh geeqie systemd
systemd
xdg-desktop-portal-gtk
zenity
geeqie
libwebkit2gtk-4.0-37
dbus-user-session

real	0m0,512s
user	0m0,480s
sys	0m0,067s
"systemd" an erster Stelle kann ich mir noch erklären, denn da schummle ich ja bei der Ausgabe. Aber der Rest ist irgendwie durcheinander. Ich schieb das mal auf die Rekursion. Dass sowas Teufelszeug ist, hat mir ja schon mein Informatiklehrer in der Schule beigebracht. Immer wenn jemand mit rekursivem Code ankam hat er die Aufgabe an die Klasse gestellt, Bedingungen zu finden die den Code zur Bombe machen. ;)

tac nach dem Ende des ursprünglichen Scripts aufzurufen funktioniert natürlich:

Code: Alles auswählen

$ time ./dijkstra_dep.sh geeqie systemd | tac
geeqie
zenity
libwebkit2gtk-4.0-37
xdg-desktop-portal-gtk
dbus-user-session
systemd

real	0m0,506s
user	0m0,472s
sys	0m0,061s
Aber das erscheint mir hässlich, denn wenn man es jetzt als Fertigpaket verkaufen wollte, müsste man nur deshalb noch ein Wrapperscript drumrum packen.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: geeqie und systemd

Beitrag von eggy » 13.08.2021 07:18:22

Darf ich noch einwerfen, dass der kürzeste Pfad nicht immer der Beste sein muss?

https://de.wikipedia.org/wiki/Bellman-Ford-Algorithmus

Ein langer Pfad, von kleinen Paketen, die man bereits auf der Kiste hat, ist vermutlich einem kurzen mit großen Paketen, die dann auch noch installiert werden müssen, vorzuziehen.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: geeqie und systemd

Beitrag von JTH » 13.08.2021 07:23:23

eggy hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 07:18:22
Darf ich noch einwerfen, dass der kürzeste Pfad nicht immer der Beste sein muss?
Bei der Frage geht's aber doch hauptsächlich um die Frage ob es überhaupt einen Pfad gibt (= kann es sein, dass ein bestimmtes Paket als Abhängigkeit eines anderen installiert werden muss). Die Kosten/Länge des Pfads wäre dabei egal. (Oder vertue ich mich dabei?)
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 13.08.2021 07:24:55

Hmm ...

War gestern wohl schon ein bisschen spaet. Hab da die Rekursion gar nicht gesehen. ;-) (Wobei ich noch nicht verstehe warum die hier ein Problem ist.)

Und jetzt ist es vielleicht noch zu frueh und ich uebersehe wieder was. ;-)

Trotzdem: Wenn du bei einer Rekursion absteigend ausgeben willst, dann machst du die Ausgabe einfach hinter den Rekursionsaufruf.
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: geeqie und systemd

Beitrag von eggy » 13.08.2021 07:27:45

Ich hatte die Frage so verstanden, dass es eigentlich darum geht, "alle" (die sinnvollen) möglichen Pfade zu finden, um irgendwo sagen zu können, bis hier hin installier mal, den Rest der Abhängigkeiten kannst Du ignorieren.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: geeqie und systemd

Beitrag von JTH » 13.08.2021 07:53:41

Stimmt, eggy, das war Quatsch von mir. Die Frage, ob es einen Pfad gibt, ist ja schon durch eine Beobachtung wie "geeqie will systemd mit installieren" positiv beantwortet.

Gesucht wäre eher: Welche(r) Pfad(e) führen zu einer bestimmten Abhängigkeit und - als Bonus - kann man diese durch Alternativen entlang des Pfads vermeiden.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: geeqie und systemd

Beitrag von hikaru » 13.08.2021 08:04:20

eggy hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 07:18:22
Ein langer Pfad, von kleinen Paketen, die man bereits auf der Kiste hat, ist vermutlich einem kurzen mit großen Paketen, die dann auch noch installiert werden müssen, vorzuziehen.
Ja, das ist richtig. Deshalb schrieb ich ja:
hikaru hat geschrieben: ↑ zum Beitrag ↑
11.08.2021 23:43:29
Was ich gern gehabt hätte wäre ein Programm, in das ich zwei Paketnamen stecke, und als Ergebnis erhalte ich entweder den kürzesten, oder alle Pfade zwischen diesen beiden Paketen, aber eben nur zwischen diesen beiden Paketen
Der kürzeste Pfad war nur am einfachsten zu implementieren, weil ich dafür auf die fertige Dijkstra-Implemetierung zurückgreifen konnte.
Den (topologisch) "kostengünstigsten" Pfad könnte man ermitteln, indem man den jeweiligen Kanten die Größe des Pakets am Ende der Kante als Gewicht zuordnet. Als Bonusaufgabe bekommen bereits installierte Pakete unabhängig von ihrer Größe das Gewicht Null. Das müsste man aber wohl alles selbst implementieren. Freiwillige vor! :mrgreen:

JTH hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 07:23:23
Bei der Frage geht's aber doch hauptsächlich um die Frage ob es überhaupt einen Pfad gibt (= kann es sein, dass ein bestimmtes Paket als Abhängigkeit eines anderen installiert werden muss). Die Kosten/Länge des Pfads wäre dabei egal. (Oder vertue ich mich dabei?)
Die Frage, ob es einen Pfad gibt ist natürlich die Pflicht. Aber dass es einen Pfad gibt wissen wir bereits von apt. Sonst hätte fischigs geeqie-Installationsversuch nicht systemd angefordert. Nur teilt uns apt diesen Pfad nicht mit.
Die früheren Lösungen im Thread ermitteln irgendeinen Pfad. Meine Dijkstra-Variante den Kürzesten. Aber natürlich wäre es interessant alle Pfade (mit Gewichten) zu kennen, um dann den Genehmsten zu wählen. Für eggy wäre das der kostengünstigste in Bezug auf die Installationsgröße. fischig würde gern den seiner Meinung nach "landschaftlich Schönsten" finden. Systemd ist in dieser Betrachtung eine stickige Großstadt, die er gern umfahren würde, auch wenn das "teurer" ist. Das ließe sich algorithmisch erreichen, indem er automatisch ermittelte Gewichte (Paketgrößen) selbst nachjustieren könnte, um so Systemd künstlich sehr hohe Kosten zuzuordnen. Wie du bereits festgestellt hattest gäbe es so eine "landschaftlich schönste Route":
JTH hat geschrieben: ↑ zum Beitrag ↑
12.08.2021 10:09:44
Du könntest dbus-user-session und damit systemd also mit Vorab- oder expliziter zusätzlicher Installation von dbus-x11 vermeiden, fischig.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 07:24:55
Trotzdem: Wenn du bei einer Rekursion absteigend ausgeben willst, dann machst du die Ausgabe einfach hinter den Rekursionsaufruf.
Dann muss ich aber die ganze Kette durch alle Rekursionsstufen mitschleppen.
Mir war die Richtung eigentlich egal. Es war nur ein Hinweis, dass meine Ausgabe andersrum ist.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: geeqie und systemd

Beitrag von eggy » 13.08.2021 08:18:58

hikaru hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:04:20
Das müsste man aber wohl alles selbst implementieren. Freiwillige vor! :mrgreen:
ähm, ja, ähm *schnell-hinter-dem-nächsten-Baum-versteck*

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 13.08.2021 08:19:33

Wir wollten urspruenglich doch nur wissen *warum* bzw. *worueber* Systemd in die Abhaengigkeit gezogen wird. Diese Frage beantwortet dein Script ... zumindest solange nicht mehrere Abhaengigkeiten wiederum von Systemd abhaengen. In dem Fall sollte man dann eher *alle* Pfade zwischen geeqie und systemd finden wollen.

Das Gewicht der Pfade hat in dieser Fragestellung doch keine Relevanz. Das ist nur darueber aufgekommen, dass man oft alternative Abhaengigkeiten hat und grundsaetzlich wissen wollen koennte, welche Alternativen man jeweils explizit installieren sollte, um am Ende ein moeglichst kleines Abhaengigkeitset installiert zu haben. Das ist aber eine ganz andere Fragestellung.

hikaru hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:04:20
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 07:24:55
Trotzdem: Wenn du bei einer Rekursion absteigend ausgeben willst, dann machst du die Ausgabe einfach hinter den Rekursionsaufruf.
Dann muss ich aber die ganze Kette durch alle Rekursionsstufen mitschleppen.
Deine Ausage verstehe ich nicht.

Generell gesprochen macht man eine absteigende Ausgabe in der Rekursion so:

Code: Alles auswählen

function a(n) {
	if (n>MAX) return
	print n
	a(n+1)
}
Waehrend eine aufsteigende Ausgabe so aussieht:

Code: Alles auswählen

function a(n) {
	if (n>MAX) return
	a(n+1)
	print n
}
D.h. die Ausgabe vor dem Rekursionsaufruf oder die Ausgabe nachdem er zurueckgekehrt ist.

In deinem Script waere es dann:

Code: Alles auswählen

...
egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/.\+prev=//' | tr -d '",;]' | while read PKG
do
	if [ "$PKG" != "$START" ]
	then
		$0 $START $PKG $DKS
	fi
	echo $PKG
done
(Ich kann's bloss nicht selber testen, weil ich kein geeignetes System zur Verfuegung habe.)
Use ed once in a while!

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: geeqie und systemd

Beitrag von JTH » 13.08.2021 08:23:02

eggy hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:18:58
ähm, ja, ähm *schnell-hinter-dem-nächsten-Baum-versteck*
Hinter dem Abhängigkeitsbaum von geeqie? Den kann man von der Rückseite bestimmt noch besser analysieren! :wink:
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: geeqie und systemd

Beitrag von eggy » 13.08.2021 08:30:31

:twisted:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 13.08.2021 08:30:54

Btw: Ich weiss jetzt warum die Ausgabe so durcheinander war: Das `tac' darf nur auf oberster Ebene angewendet werden und nicht auf jeder Rekursionsstufe. Es waere einfacher wenn du nicht das ganze Script erneut aufrufen wuerdest, sondern den Code in eine Shellfunktion packst und nur diese rekursiv nutzt. Dann kannst du naemlich hinter den ersten Aufruf ein `|tac' setzen.

Keine Ahnung ob das generell so ist, aber Rekursion ist jedenfalls immer einfacher wenn man eine umgebende Funktion hat, die nur einmal laeuft und eine darin rekursierende Hilfsfunktion. In deinem Fall hast du nur genau ein einziges Script, das sich komplett selber aufruft. Das macht es unhandlicher.

Wenn man keine zwei Funktionen/Scripte haben kann/will, dann kann man sich auch damit behelfen, dass man durch eine Variable herausfindet, ob man auf der nullten Rekursionsstufe ist und nur dort irgendwelchen Zusatzcode ausfuehrt. Das ist aber schlecht lesbar und mehr eine Notloesung. Zwei Funktionen sind immer schoener:

Code: Alles auswählen

function doit() {
	...
	recurse(0)
	...
}

function recurse(n) {
	...
	recurse(n+1)
	...
}
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 13.08.2021 08:31:30

JTH hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:23:02
eggy hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:18:58
ähm, ja, ähm *schnell-hinter-dem-nächsten-Baum-versteck*
Hinter dem Abhängigkeitsbaum von geeqie? Den kann man von der Rückseite bestimmt noch besser analysieren! :wink:
eggy, JTH und ich in einem Thread ... das kann einfach nicht gut gehen. :-P :-D
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: geeqie und systemd

Beitrag von eggy » 13.08.2021 08:42:13

Dann werd ich mich mal zurückziehen und Euch das Feld überlassen - für heute :mrgreen:

... ich erwarte das fertige Script von Euch dann heute abend :D

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: geeqie und systemd

Beitrag von hikaru » 13.08.2021 09:36:49

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Wir wollten urspruenglich doch nur wissen *warum* bzw. *worueber* Systemd in die Abhaengigkeit gezogen wird.
fischig wollte außerdem wissen, ob es eine Möglichkeit gibt, Systemd zu umschiffen (die "Landschaftsroute" aus meinem letzten Beitrag). Das leistet bisher keine der präsentierten Lösungen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Das Gewicht der Pfade hat in dieser Fragestellung doch keine Relevanz.
Doch, implizit. Im Prinzip wollen wir alle (und fischig im Besonderen) ein möglichst schlankes System. Die Gewichte in Form der Paketgrößen zu berücksichtigen wäre der algorithmische Ausdruck dieses Wunsches.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Das ist aber eine ganz andere Fragestellung.
Das ist mir zu akademisch. Es ist ein bisschen so, als würde ich dich fragen, ob du mir die Uhrzeit sagen kannst, und deine Antwort lautet: "Ja."
Natürlich wäre das die formal korrekte Antwort auf meine Frage. Aber eigentlich hätte ich erwartet, dass du mir die Uhrzeit sagst, auch wenn das streng genommen nicht meine Fragestellung war. ;)
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Generell gesprochen macht man eine absteigende Ausgabe in der Rekursion so:
[..]
D.h. die Ausgabe vor dem Rekursionsaufruf oder die Ausgabe nachdem er zurueckgekehrt ist.
Wie gesagt, ich habe bei der Ausgabe des Endpakets geschummelt, denn ich gebe es nicht innerhalb der Rekursion aus, weil diese damit beginnt, den vorherigen Knoten des Endpakets zu ermitteln. Daher ist es nicht trivial, innerhalb des Scripts die Ausgabe umzukehren.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
(Ich kann's bloss nicht selber testen, weil ich kein geeignetes System zur Verfuegung habe.)
Alles was du brauchst ist ein debtree-Output:
NoPaste-Eintrag41437

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:30:54
In deinem Fall hast du nur genau ein einziges Script, das sich komplett selber aufruft. Das macht es unhandlicher.
Ja. Das ganze Script ist im Grunde nur ein Wrapper um die grep-Zeile.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:30:54
Wenn man keine zwei Funktionen/Scripte haben kann/will, dann kann man sich auch damit behelfen, dass man durch eine Variable herausfindet, ob man auf der nullten Rekursionsstufe ist und nur dort irgendwelchen Zusatzcode ausfuehrt.
Genau das mache ich bereits über die Anzahl der übergebenen Argumente um herauszufinden, ob ich neue Hilfsdateien anlegen muss oder die bereits erzeugten nutzen soll.

Ich glaube hier werden unsere unterschiedlichen Ansätze deutlich:
Ich bin Techniker. Ich will für ein gegebenes Problem eine möglichst einfache Lösung haben. "Einfach" bedeutet hier, so wenig Aufwand wie möglich in die Lösung zu investieren. Diese Lösung habe ich und die Reihenfolge die Ausgabe sowie die Eleganz des Codes sind für mich eher nebensächlich.
Du bist Akademiker. Du stebst eine "Schulbuchlösung" an, auch wenn das bedeutet, zusätzliche Arbeit in die Schönheit des Codes und der Ausgabe zu investieren. "Schönheit" in diesem Kontext ist oft nahe verwandt mit Zukunftssicherheit (Funktionen, vollständig rekursive Ausgabe).
Beide Ansätze haben ihre Berechtigung. Sieh meine Lösung als "Proof of Concept"!

eggy hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:42:13
... ich erwarte das fertige Script von Euch dann heute abend :D
Wie, heute Abend? :? Ich war der Ansicht, du präsentierst zur Mittagspause eine ordentliche Lösung. :mrgreen:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd

Beitrag von Meillo » 13.08.2021 10:03:09

hikaru hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 09:36:49
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Wir wollten urspruenglich doch nur wissen *warum* bzw. *worueber* Systemd in die Abhaengigkeit gezogen wird.
fischig wollte außerdem wissen, ob es eine Möglichkeit gibt, Systemd zu umschiffen (die "Landschaftsroute" aus meinem letzten Beitrag). Das leistet bisher keine der präsentierten Lösungen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Das Gewicht der Pfade hat in dieser Fragestellung doch keine Relevanz.
Doch, implizit. Im Prinzip wollen wir alle (und fischig im Besonderen) ein möglichst schlankes System. Die Gewichte in Form der Paketgrößen zu berücksichtigen wäre der algorithmische Ausdruck dieses Wunsches.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Das ist aber eine ganz andere Fragestellung.
Das ist mir zu akademisch. Es ist ein bisschen so, als würde ich dich fragen, ob du mir die Uhrzeit sagen kannst, und deine Antwort lautet: "Ja."
Natürlich wäre das die formal korrekte Antwort auf meine Frage. Aber eigentlich hätte ich erwartet, dass du mir die Uhrzeit sagst, auch wenn das streng genommen nicht meine Fragestellung war. ;)
Lustig, weil ich wuerde sagen, dass das pragmatisch ist: Divide and Conquer bzw. One tool, one job. Wer wuerde zwei so unterschiedliche Fragestellungen, auch wenn sie im gleichen Anwendungskontext aufkommen, in einem Aufwasch erschlagen wollen? ;-)
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:19:33
Generell gesprochen macht man eine absteigende Ausgabe in der Rekursion so:
[..]
D.h. die Ausgabe vor dem Rekursionsaufruf oder die Ausgabe nachdem er zurueckgekehrt ist.
Wie gesagt, ich habe bei der Ausgabe des Endpakets geschummelt, denn ich gebe es nicht innerhalb der Rekursion aus, weil diese damit beginnt, den vorherigen Knoten des Endpakets zu ermitteln. Daher ist es nicht trivial, innerhalb des Scripts die Ausgabe umzukehren.

[...]
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:30:54
In deinem Fall hast du nur genau ein einziges Script, das sich komplett selber aufruft. Das macht es unhandlicher.
Ja. Das ganze Script ist im Grunde nur ein Wrapper um die grep-Zeile.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 08:30:54
Wenn man keine zwei Funktionen/Scripte haben kann/will, dann kann man sich auch damit behelfen, dass man durch eine Variable herausfindet, ob man auf der nullten Rekursionsstufe ist und nur dort irgendwelchen Zusatzcode ausfuehrt.
Genau das mache ich bereits über die Anzahl der übergebenen Argumente um herauszufinden, ob ich neue Hilfsdateien anlegen muss oder die bereits erzeugten nutzen soll.

Ich glaube hier werden unsere unterschiedlichen Ansätze deutlich:
Ich bin Techniker. Ich will für ein gegebenes Problem eine möglichst einfache Lösung haben. "Einfach" bedeutet hier, so wenig Aufwand wie möglich in die Lösung zu investieren. Diese Lösung habe ich und die Reihenfolge die Ausgabe sowie die Eleganz des Codes sind für mich eher nebensächlich.
Du bist Akademiker. Du stebst eine "Schulbuchlösung" an, auch wenn das bedeutet, zusätzliche Arbeit in die Schönheit des Codes und der Ausgabe zu investieren. "Schönheit" in diesem Kontext ist oft nahe verwandt mit Zukunftssicherheit (Funktionen, vollständig rekursive Ausgabe).
Beide Ansätze haben ihre Berechtigung. Sieh meine Lösung als "Proof of Concept"!
Ich glaube nicht, dass ich mich deiner Sichtweise anschliessen will. Ja, ich bin Akademiker und ich nutze dieses Wissen und diese Sichtweise um die vorliegenden Probleme und Wuensche zu analysieren und in diesem Zuge voran zu kommen. Ich strebe nicht zwangslaeufig Schulbuchloesungen an, aber ich nutze mein Schulbuchwissen um Loesungen zu finden ... die in dieser Betrachtungsweise oft einfacher zu finden werden.

Zugegeben, ich begnuege mich nicht damit, wenn irgendein Output kommt, sondern ich will ihn schon in der besten Form haben, wenn dafuer keine hoehere Komplexitaet noetig ist, sondern nur eine (mir durch mein akademisches Wissen ermoeglichte) Umarrangierung des Codes.

Dank des von dir geposteten Outputs konnte ich das nun selber testen. (Ich musste eine Anpassung machen, damit es auf FreeBSD lief: sed kennt normalerweise kein `\+', darum habe ich `.\+' durch das aequivalente `..*' ersetzt.)

Hier eine Umsetzung mit umgekehrter Ausgabe, die deinem Aufbau entspricht:

Code: Alles auswählen

#!/bin/sh

START=$1
END=$2

if [ $# -lt 3 ]
then
        DKS=${START}.dks
        debtree --no-alternatives $START 2>/dev/null > ${START}.dot
        dijkstra -dp $START ${START}.dot > $DKS
else
        DKS=$3
fi

egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/..*prev=//' | tr -d '",;]' | while read PKG
do
        if [ "$PKG" != "$START" ]
        then
                $0 $START $PKG $DKS
        fi
        echo $PKG
done

if [ $# -lt 3 ]
then
        echo $END
fi
(`echo $PKG' hinter der Rekursion und `echo $END' am Ende.)

Und hier eine Version mit Hilffunktion:

Code: Alles auswählen

#!/bin/sh

START=$1
END=$2
DKS=${START}.dks

recurse() {
        START=$1
        END=$2
        DKS=$3
        egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/..*prev=//' | tr -d '",;]' | while read PKG
        do
                if [ "$PKG" != "$START" ]
                then
                        recurse $START $PKG $DKS
                fi
                echo $PKG
        done
}

debtree --no-alternatives $START 2>/dev/null > ${START}.dot
dijkstra -dp $START ${START}.dot > $DKS
recurse $START $END $DKS
echo $END
Hier wird der Code IMO deutlich lesbarer. Das meinte ich mit dem Ansatz, dass man bei einer Rekursion immer zwei Funktionen hat, eine fuer die Rekursion selbst und eine (bzw. das Hauptprogramm) fuer das Drumherum. Das ist vermutlich immer einfacher als wenn der komplette Code rekursiert.

Man koennte sagen, dass mir hier mein akademisches Wissen hilft, die Sache klarer zu sehen ... dabei ist es hier aber gar kein akademisches Wissen (sondern nur akademisches Backgroundwissen), da mich das die Praxis gelehrt hat. (Akademisch ist nur an welcher Stelle man die Ausgabe machen muss, je nachdem in welcher Reihenfolge man sie haben will.)


Edit: Ich finde es nicht schlimm wenn nicht jeder dieses Wissen und diese Faehigkeiten hat. Mir selbst fehlen sie in theoretischen Bereichen oft genug selbst. (Dijkstra -- nie gehoert ... also den Algorithmus, denn die Person und seine Denkweisen kenne ich schon ganz gut. ;-) ) Dafuer haben wir ja zum Glueck andere Personen, die das beisteuern koennen was man selbst nicht so gut kann oder nicht so einfach sieht.
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: geeqie und systemd

Beitrag von hikaru » 13.08.2021 10:57:43

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 10:03:09
Zugegeben, ich begnuege mich nicht damit, wenn irgendein Output kommt, sondern ich will ihn schon in der besten Form haben, wenn dafuer keine hoehere Komplexitaet noetig ist, sondern nur eine (mir durch mein akademisches Wissen ermoeglichte) Umarrangierung des Codes.
Irgendeinen Output wollte ich auch nicht haben. Die Sortierung sollte schon stimmen. Nur war es für mich eben gleichwertig ob sie Top-Down oder Bottom-Up ist.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 10:03:09
Dank des von dir geposteten Outputs konnte ich das nun selber testen.
Am Rande:
Hier habe ich debtree mit --no-alternatives aufgerufen, was den Graphen deutlich vereinfacht. Nur deshalb funktioniert meine Lösung übrrhaupt, denn ich muss keine alterrnativen Verzweigungen beachten. Dadurch kann man aber schon prinzipilel aus der Eingabe keine alternativen Pfade mehr finden.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 10:03:09
Hier eine Umsetzung mit umgekehrter Ausgabe, die deinem Aufbau entspricht:

Code: Alles auswählen

# ...
if [ $# -lt 3 ]
then
        echo $END
fi
Eben diese zusätzliche Abfrage der Anzahl der Argumente, welche ja schon mal am Anfang des Scripts gemacht wurde halte ich konzeptuell für extrem hässlich. Das war für mich ursprünglich der Grund, die Ausgabe nicht umzudrehen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 10:03:09
Und hier eine Version mit Hilffunktion:
[..]
Hier wird der Code IMO deutlich lesbarer.
Ja, das ist richtig. Aber das hässliche "echo $END" ganz am Ende gefällt mir immer noch nicht. Es ist gewissermaßen der in Kapstadt platzierte Elefant aus der "Elefantenjagd".
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.08.2021 10:03:09
Man koennte sagen, dass mir hier mein akademisches Wissen hilft, die Sache klarer zu sehen ... dabei ist es hier aber gar kein akademisches Wissen (sondern nur akademisches Backgroundwissen), da mich das die Praxis gelehrt hat.
Ich denke es ist eher eine Frage der Herangehensweise.
Mein Script von gestern Abend war das evolutionäre Ergebnis eines längeren Prozesses, in dem ich zunächst probiert hatte, sowas Ähnlches wie den Dijkstra-Algorithmus nachzuprogrammieren, ohne mir dabei bewusst zu sein, dass es auf Dijkstra hinausläuft. Ich scheiterte aber immer an gewissen Typen von Abhängigkeiitsverzweigungen. Irgendwann stolperte ich bei meiner Recherche dann tatsächlich über Dijkstra und habe im Grunde nur mein bereits vorhandenes Script entkernt und die fertige Dijkstra-Lösung eingebaut. Als das funktionierte war die Aufgabe (Proof of Concept) für mich erledigt.
Was hier zu sehen ist, ist nur das Endergebnis. Und wenn das Parsen der dijkstra-Ausgabe nicht so kompliziert wäre, dann wäre der Rest kaum erwähnenswert. Im Grunde sollte das ein Schüler in der 10. Klasse hinkriegen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd (Abhängigkeitspfade und Alternativen finden)

Beitrag von Meillo » 13.08.2021 11:32:37

Natuerlich ist jede Umsetzung immer ein Zwischenstand auf einem Weg, gepraegt durch seine Vorgeschichte.


Hier nochmal eine Fortentwicklung:

Code: Alles auswählen

#!/bin/sh

START=$1
END=$2
DKS=${START}.dks

recurse() {
        echo $1
        test $1 = $START && return
        recurse $(sed -n '/[[:space:]"]'$1'[[:space:]"].*\[dist/ {n; s/[]",;]//g; s/.*prev=//p;}' $DKS)
}

debtree --no-alternatives $START 2>/dev/null > ${START}.dot
dijkstra -dp $START ${START}.dot > $DKS
recurse $END | tac
Ich gebe doch wieder am Anfang aus und drehe am Ende um, kann dafuer aber alles mit einem einzigen `echo' erledigen.

Die Pipeline um PKG zu finden habe ich zu einem einzigen sed-Aufruf umgebaut -- nur als Alternative, nicht weil es besser waere.

Die Schleife (die wohl anfangs fuer die alternativen Pfade vorgesehen war) habe ich entfernt und die Hilfsvariable $PKG dann auch ganz aufgeben koennen, nachdem ich nun mit $END (bzw. $1) vergleiche.

Das ist nun so ziemlich die Essenz des Algorithmus. Die Rekursionsfunktion enthaelt nur noch die drei esseziellen Bestandteile: Ausgabe, Abbruchbedingung, Rekursionsaufruf mit neuem Wert.


... Ja, dieser Post von mir ist akademisch motiviert. ;-)

Ohne deine Vorarbeit waere mir diese Vergnuegung nicht moeglich gewesen. Danke. :THX:
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: geeqie und systemd (Abhängigkeitspfade und Alternativen finden)

Beitrag von Meillo » 13.08.2021 11:57:47

Und hier als Bonus noch eine Variante, die die Ausgabe am Ende macht und folglich kein Umdrehen braucht:

Code: Alles auswählen

#!/bin/sh

START=$1
END=$2
DKS=${START}.dks

recurse() {
        if [ $1 != $START ]
        then
                recurse $(sed -n '/[[:space:]"]'$1'[[:space:]"].*\[dist/ {n; s/[]",;]//g; s/.*prev=//p;}' $DKS)
        fi
        echo $1
}

debtree --no-alternatives $START 2>/dev/null > ${START}.dot
dijkstra -dp $START ${START}.dot > $DKS
recurse $END
Das sollte dir doch nun gefallen, hikaru. ;-)
Use ed once in a while!

Antworten