Problèmes et questions sur les environnements graphiques et les applications.
Répondre

Pacgraph. Une jolie vue du système.

#1Messageil y a 4 ans

Bonjour @ tous :salut:
Lu sur l'inter.
Pacgraph est un outil très léger directement venu d'Archlinux qui permet une esthétique visualisation de l'ensemble des paquets installés et de leur poids. Il est dans les dépôts, donc installable par pacman avec sudo pacman -S pacgraph ou via pamac .
Comme tout programme de bas niveau son utilisation est assez absconse, mais vous pouvez générer de jolies et très instructives images en .png et svg en utilisant cette commande :

pacgraph -b "#302e23" -l "#94c52a" -t "#b5c94a" -d "#cbee98"
Exemple :

Image

On voit que je suis assez "tête en l'air" :gsourire:
Évidemment, si vous avez des programmes que vous ne voulez pas montrer...

Pacgraph. Une jolie vue du système.

#2Messageil y a 4 ans

Bonjour, :salut::salut:

Pas mal l'astuce. J'ai fais un peu mumuse avec d'abord avec les couleurs de Lemust puis avec d'autres.
Voici mes commandes :

pacgraph -b "#302e23" -l "#8abee6" -t "#2c7de0" -d "#ff6600"

pacgraph -b "#302e23" -l "#8abee6" -t "#ff6600" -d "#2c7de0"
Marrant le changement des 2 couleurs, les résultats sont vraiment différents. Tout comme mon utilisation d'atom. :roll:
Par contre, je ne vois pas Qt Designer, QtAssistant...Bizarre.
Image
ou encore :
Image

Pacgraph. Une jolie vue du système.

#3Messageil y a 4 ans

:bjr:

Il existait aussi il y a quelques années d'autres utilitaires pour faire la même chose :saispas: (garchdeps, pacvis avec une demo en ligne: nous pouvons chercher un paquet)

Pacgraph. Une jolie vue du système.

#4Messageil y a 4 ans

:bjr:
Oui, nous en avions parlé il y a quelques temps déjà.
Ce qui a suscité ma curiosité est surtout l'aspect esthétique par le jeu de couleur qui rend un graphique qui en jette, mais il est vrai quasiment inutilisable en l'état.
C'est un bon supplétif de pacman qui peut s'avérer pratique si on l'utilise simplement comme avec l'option -c par exemple qui donne la liste des paquets installés avec leur poids sans faire appel a des regex.

Pacgraph. Une jolie vue du système.

#5Messageil y a 4 ans

:salut: Sympa ce petit programme. :merci:

Pacgraph. Une jolie vue du système.

#6Messageil y a 3 ans

:bjr:
petit script tiré de la bibliothèque javascript de pacvis, fait un pactree (normal et reverse) d'un seul paquet et génère un graphique "interactif" cette fois relativement clair...
Graphique consultable dans notre navigateur web avec possibilité de zoom (CTRL++ ou -) et surtout beaucoup plus lisible qu'un graphique de pacgraph

Ici, la particularité pour les dépendances (en bleu) : la taille du paquet est proportionnelle au nombre de fois ou il est une dépendance et non à la taille du paquet (glibc est le gagnant :wink: )

On passe en paramètre le paquet (installé)

pacman: Image
systemd: Image oui quelques paquets l'utilise :siffle

code de pactree-g

#!/usr/bin/env python
import sys
from pathlib import Path
import subprocess
from dataclasses import dataclass
import webbrowser

COLOR_REVERSE = '#eebb44'
COLOR_PACKAGE = '#7BE141'

@dataclass
class Package:
    item: int
    label: str
    value: int
    color: str

def get_weight(pkgname) ->int:
    proc = subprocess.run(["pactree", pkgname, "-rld1"], capture_output=True, text=True)
    return len(proc.stdout.split("\n")) -2

def set_reverse(pkgname, pkgs, links):
    proc = subprocess.run(["pactree", pkgname, "-ulr"], capture_output=True, text=True)
    ls = proc.stdout.split("\n")
    print(ls)
    try:
        ls.remove(pkgname)
    except ValueError:
        print("paquet non installé")
        exit(2)
    mainid = get_id(pkgs, pkgname)
    pkgs[mainid].value = len(ls)
    for pkg in ls:
        if not pkg:
            continue
        weight = get_weight(pkg)
        i = len(pkgs)+2
        pkgs.append(Package(i, pkg, weight, COLOR_REVERSE))
        links.append((i, mainid))
    return pkgs, links


def print_pkgs(pkgs):
    result = "nodes = ["
    for pkg in pkgs:
        color = f",color:'{pkg.color}'" if pkg.color else ''
        result = f"{result}{{id:{pkg.item},value:{pkg.value},label:'{pkg.label}'{color}}},"
    result = f"{result} ];"
    return result

def print_links(links, pkgname):
    mainid = get_id(pkgs, pkgname)
    result = "edges = ["
    for link in links:
        color = f",color:'{COLOR_REVERSE}',arrows:'from'" if link[1] == mainid else ''
        result = f"{result}{{from:{link[0]},to:{link[1]}{color}}},"
    result = f"{result} ];"
    return result

def get_id(pkgs, pkgname):
    for pkg in pkgs:
        if pkg.label == pkgname:
            return pkg.item
    return 0


if len(sys.argv) < 2:
    print("pas de paquet en paramètre")
    exit(1)

template = r'''<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>{{title}}</title>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis-network.min.js"></script>
  </head>
  <body><div id="mynetwork" style="with:99%; height:99vh;"></div></body>
  <script>
    var nodes = null; var edges = null; var network = null;
    function draw() {
      {{nodes}}
      {{edges}}
      var container = document.getElementById("mynetwork");
      var data = { nodes: nodes, edges: edges };
      var options = {
        nodes: {
          shape: "dot",
          scaling: {
            customScalingFunction: function (min,max,total,value) { return value/total; },
            min:5,
            max:120
          }
        },
        physics: {
            enabled: true,
            timestep: 0.3,
            minVelocity: 0.5,
            solver: "barnesHut",
        }        
      };
      network = new vis.Network(container, data, options);
    }
    window.addEventListener("load", () => {  draw(); });
  </script>
</html>
'''

main_package = sys.argv[1].lower()

proc = subprocess.run(["pactree", main_package, "-ul"], capture_output=True, text=True)
#print(proc.stdout)
pkgs = []
for i, pkg in enumerate((p for p in proc.stdout.split("\n") if p)):
    weight = get_weight(pkg)
    color = COLOR_PACKAGE if main_package == pkg else ''
    pkgs.append(Package(i, pkg, weight, color))


links = []
for pkg in pkgs:
    proc = subprocess.run(["pactree", pkg.label, "-uld1"], capture_output=True, text=True)
    ls = proc.stdout.split("\n")
    ls.remove(pkg.label)
    if len(ls) < 1:
        continue
    for subpkg in ls:
        subid = get_id(pkgs, subpkg)
        if subid > 0:
            a, b = pkg.item, subid
            if a > b:
                a, b = b, a
            links.append((a, b))

pkgs, links = set_reverse(main_package, pkgs, links)

template = template.replace('{{title}}', main_package, 1)
template = template.replace('{{nodes}}', print_pkgs(pkgs), 1)
template = template.replace('{{edges}}', print_links(links, main_package), 1)
Path("/tmp/pacman-graph.html").write_text(template)
webbrowser.open_new_tab("/tmp/pacman-graph.html")
#print(template)

Pacgraph. Une jolie vue du système.

#7Messageil y a 3 ans

C'était la minute "les modos fument la moquette" :wink:

Pacgraph. Une jolie vue du système.

#8Messageil y a 3 ans

ou plutôt des hallucinations répétées dues au covid ... ou aux fortes chaleurs du moment ?
chaleur du cpu pour moi :aurevoir:

Pacgraph. Une jolie vue du système.

#9Messageil y a 3 ans

:bjr:
Très intéressant :bien
Je propose la légalisation de la "moquette" Geek" qui apporte manifestement quelques bienfaits utiles :rigole:

Pacgraph. Une jolie vue du système.

#10Messageil y a 3 ans

Bonjour,
Après quelques cheuveux en moins parceque je suis trop tête en l'air (genre 15 minutes avant de me rendre compte que le fichier que j'avais créé n'était pas executable...)
ça fonctionne super :bien merci :pompom:

Pacgraph. Une jolie vue du système.

#11Messageil y a 3 ans

:bjr:
oops désolé ....
Comme tout script, il faut le rendre exécutable (console: chmod +x monDuScript ou (plus simple?) avec gestionnaire de fichier)
Sinon, si non compilé, on peut le lancer via son interpréteur (lire la première ligne du code):

bash nomDuScript #ou
python nomDuScript # ou autre php...ruby
Répondre