Zabawa w grafy

Graf nieskierowany to takie zwierzę, które ma węzły i krawędzie (ale bez szczałków):

Jeżeli zamiast a, b, c i d wrzucimy wpisy na blogu, a połączenia między nimi wyciągniemy z wtyczki YARPP, wówczas – przy odrobinie wysiłku – uzyskamy takie cóś:

Powyższy graf reprezentuje wszystkie wpisy na moim blogu na dzień 27 marca 2021.

Lekki zoom:

Nieco większy zoom:

Jak takiego cudaka uzyskać?

Mi się udało metodą prób i błędów, łącznie jakieś półtora godziny kombinowania.

Krok po kroku:

  • Logujemy się na nasz serwer z blogiem przez ssh.
  • Upewniamy się, że mamy zainstalowany pakiet graphviz (czyli: sudo apt -y install graphviz)
  • Tworzymy plik ~/.my.cnf i wpisujemy do niego:
[mysql]

user = nazwa-uzytkownika-wordpress
password = haslo-uzytkownika-wordpress

(użytkownika i hasło możemy sobie wyciągnąć z pliku wp-config.php w folderze instalacyjnym wordpressa)

  • nadajemy plikowi ~/.my.cnf odpowiednie uprawnienia: chmod 600 ~/.my.cnf

Powyższy trick umożliwi nam wykonywanie zapytań do bazy wordpressa bez konieczności podawania za każdym razem hasła.

  • Tworzymy osobny folder, u mnie nazywa się on ref ale można go sobie nazwać dowolnie. Chodzi o to, żeby nie zaśmiecać sobie katalogu domowego. Wchodzimy do niego: cd ref
  • Tworzymy cztery pliki: dotheader.txt, dotfooter.txt, labels.sql oraz references.sql.

dotheader.txt:

graph {
   rankdir=LR;
   node [nodesep=2.0; fontsize=11; shape=box];
   graph [overlap=false; splines = true;];

dotfooter.txt:

}

(tak, zgadza się, jedna linia tekstu, z jednym znakiem: “}”)

labels.sql:

select  concat(y.reference_ID, ' [label="', replace(regexp_replace(p1.post_title, '[^0-9a-zA-ZżźćńąąśłęóŻŹĆŃĄŚŁĘÓ ]', ' '), '  ', ' '), '"]') ptptpt
 from wp_yarpp_related_cache y
 join wp_posts p1 on y.reference_id = p1.ID
 where p1.post_type = 'post'
 union
 select  concat(y.ID, ' [label="', replace(regexp_replace(p2.post_title, '[^0-9a-zA-ZżźćńąąśłęóŻŹĆŃĄŚŁĘÓ ]', ' '), '  ', ' '), '"]')
 from wp_yarpp_related_cache y
 join wp_posts p2 on y.ID=p2.ID
 where p2.post_type = 'post';

references.sql:

select  concat(y.reference_ID, ' -- ', y.ID)
 from wp_yarpp_related_cache y
 join wp_posts p1 on y.reference_id = p1.ID
 join wp_posts p2 on y.ID=p2.ID
 where p1.post_type='post' and p2.post_type='post';
  • Mówiłem cztery pliki? Kłamałem! 🙂 Tworzymy teraz piąty plik, ja go sobie nazwałem go.sh:
!/bin/bash
 mysql -N -u nazwa-uzytkownika-wordpress -D nazwa-bazy-wordpress < ./labels.sql > labels.txt
 mysql -N -u nazwa-uzytkownika-wordpress -D nazwa-bazy-wordpress < ./references.sql > references.txt
 cat ./dotheader.txt ./labels.txt ./references.txt ./dotfooter.txt > out.dot
 sfdp ./out.dot -Tsvg > out.svg

Uwaga: w powyższym pliku upewniamy się, że wpisaliśmy poprawnie nazwę użytkownika oraz nazwę bazy danych wordpress (jedno i drugie możemy wyciągnąć z wp-config.php w katalogu instalacyjnym wordpressa)

  • Nadajemy temu plikowi atrybut wykonywalności: chmod +x ./go.sh
  • Uruchamiamy go: ./go.sh (enter)

Jeżeli wszystkie powyższe kroki wykonaliśmy bez błędów, powinniśmy dostać na wyjściu plik out.svg z “mapką” naszego blogu.

Na razie mi się temat trochę przejadł, więc ewentualny ciąg dalszy odkładam na później. Kolejnym krokiem będzie zapewne zrobienie tej mapki w wersji klikalnej, ewentualnie osobne mapki dla poszczególnych kategorii, może jeszcze dodanie “ozdobników” w postaci tagów?

Ale to już innym razem.

Zapisz się
Powiadom o
guest
4 komentarzy
Inline Feedbacks
Zobacz wszystkie komentarze
4
0
Zapraszam do skomentowania wpisu.x
()
x