- Az openoffice rajzlójának fájlja elég "human-readable" lenne számomra, összetargz-zett valami, amiben xml-formában tárol, de sajnos csak rajzoló, a téglalapokat hiába kötöm össze nyilakkal, azok továbbra is csak különálló tégalapok és nyilak maradnak.
- inkscape: hasonló a helyzet, mint az előzővel. Annyival jobb, hogy itt már keletkezhet logikai kapcsolat a rajz elemei között, de valahogy nagyon fura svg (xml) fájl keletkezik.
- kdissert: remek lenne, de csak fát tud.
- dia: na... ez úgy látom mindent tud amit kell. Szépen szerkeszthető vele fa, gráf, hálózati diagram, még kapcsolási rajz is... nomeg: lehet vele rajzolni csomagfüggőségi gráfot, akár csoportosított csomagokkal! Na, ez kell nekem! Nézzük a kimeneti formátumát: *.dia ... ami tulajdonképpen xml. Sőt! Nagyon is "human-readable"! Az első 64 sorban a doksi metaadatai vannak deklarálva: háttérszín, vonalszín, rácsozat, skálázás, rácsozás, lapméret, margó, stb..
Szerkesztettem vele egy egyszerú valamit, és nekiálltam elemezni. Nagyon is átlátható, és egszerű logikája van. Íme:
szóval van az első 64 sor metaadat:
<?xml version="1.0" encoding="UTF-8"?>
<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
<dia:diagramdata>
<dia:attribute name="background">
<dia:color val="#ffffff"/>
</dia:attribute>
<dia:attribute name="pagebreak">
<dia:color val="#000099"/>
</dia:attribute>
<dia:attribute name="paper">
<dia:composite type="paper">
<dia:attribute name="name">
<dia:string>#A4#</dia:string>
</dia:attribute>
<dia:attribute name="tmargin">
<dia:real val="2.8222000598907471"/>
</dia:attribute>
<dia:attribute name="bmargin">
<dia:real val="2.8222000598907471"/>
</dia:attribute>
<dia:attribute name="lmargin">
<dia:real val="2.8222000598907471"/>
</dia:attribute>
<dia:attribute name="rmargin">
<dia:real val="2.8222000598907471"/>
</dia:attribute>
<dia:attribute name="is_portrait">
<dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="scaling">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="fitto">
<dia:boolean val="false"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
<dia:attribute name="grid">
<dia:composite type="grid">
<dia:attribute name="width_x">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="width_y">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="visible_x">
<dia:int val="1"/>
</dia:attribute>
<dia:attribute name="visible_y">
<dia:int val="1"/>
</dia:attribute>
<dia:composite type="color"/>
</dia:composite>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#d8e5e5"/>
</dia:attribute>
<dia:attribute name="guides">
<dia:composite type="guides">
<dia:attribute name="hguides"/>
<dia:attribute name="vguides"/>
</dia:composite>
</dia:attribute>
</dia:diagramdata>
Ezzel úgy nem is foglalkozok különösebben, ezután jönnek a lényeges dolgok. Először is van egy réteg. Lehet több is, nekem most 1 réteg kell (egyelőre). Tehát az egész hóbelevanc
<dia:layer name="Háttér" visible="true" active="true">
...
...
</dia:layer>
közé fog kerülni. Akkor nézzük, miből fog állni a rajz. Egy gráfhoz, ha csak úgy józan paraszti ésszel nézzük, kell valami holmi, meg valami amivel összekötjük őket. A dia uml eszközei tartalmaz olyat, hogy csomag. Ez pont jó is, nézzük meg, hogy néz ki egy ilyen:
<dia:object type="UML - SmallPackage" version="0" id="O0">
<dia:attribute name="obj_pos">
<dia:point val="7.1,4.75"/>
</dia:attribute>
<dia:attribute name="obj_bb">
<dia:rectangle val="7.05,3.8;9.675,6.2"/>
</dia:attribute>
<dia:attribute name="meta">
<dia:composite type="dict"/>
</dia:attribute>
<dia:attribute name="elem_corner">
<dia:point val="7.1,4.75"/>
</dia:attribute>
<dia:attribute name="elem_width">
<dia:real val="2.5249999999999999"/>
</dia:attribute>
<dia:attribute name="elem_height">
<dia:real val="1.3999999999999999"/>
</dia:attribute>
<dia:attribute name="line_width">
<dia:real val="0.10000000000000001"/>
</dia:attribute>
<dia:attribute name="line_colour">
<dia:color val="#000000"/>
</dia:attribute>
<dia:attribute name="fill_colour">
<dia:color val="#ffffff"/>
</dia:attribute>
<dia:attribute name="stereotype">
<dia:string>##</dia:string>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
<dia:string>#cucc1#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="monospace" style="0" name="Courier"/>
</dia:attribute>
<dia:attribute name="height">
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
<dia:point val="7.4,5.645"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
</dia:attribute>
<dia:attribute name="alignment">
<dia:enum val="0"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
</dia:object>
54 sor... mindössze. Nézzük, mi van benne. Már látom, hogy ezeknek a fele sem fog kelleni. Elkezdtem próbálgatni, hogy mi kell, mi nem kell, mi mit csinál. Kell-e a pozíció-méret megadáshoz 4 argumentum, vagy elég csak 2? Rájöttem, hogy a pozícióját a
<dia:attribute name="elem_corner">
<dia:point val="7.1,4.75"/>
</dia:attribute>
részben definiálja, a doboz méretét pedig a benne lévő stringből számolja ki. "elem_corner"... szép magyaros, mintha csak én találtam volna ki. A többit csak azért tárolja, ha valami usernek nem tetszik a default méret, és huzavonázik vele, akkor azt menteni kell. A végén ennyi lett, ami nekem kell:
<dia:object type="UML - SmallPackage" version="0" id="byte">
<dia:attribute name="elem_corner">
<dia:point val="24.40,19.95"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
<dia:string>#cucc1#</dia:string>
</dia:attribute>
</dia:composite>
</dia:attribute>
</dia:object>
54 sorból lett 12 sor. Negyedére tömörítettem, és még mindig "human-readable"... meg a dia is helyesen megérti.
A dolog következő része, hogy ezeket össze is kell kötni. A vonal definiálása sokkal rövidebb, csak 28 sor:
<dia:object type="Standard - Line" version="0" id="O3">
<dia:attribute name="obj_pos">
<dia:point val="7.77688,6.1979"/>
</dia:attribute>
<dia:attribute name="obj_bb">
<dia:rectangle val="5.43437,6.12771;7.84707,9.18792"/>
</dia:attribute>
<dia:attribute name="conn_endpoints">
<dia:point val="7.77688,6.1979"/>
<dia:point val="5.50456,9.0999"/>
</dia:attribute>
<dia:attribute name="numcp">
<dia:int val="1"/>
</dia:attribute>
<dia:attribute name="end_arrow">
<dia:enum val="22"/>
</dia:attribute>
<dia:attribute name="end_arrow_length">
<dia:real val="0.5"/>
</dia:attribute>
<dia:attribute name="end_arrow_width">
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
<dia:connection handle="0" to="O0" connection="8"/>
<dia:connection handle="1" to="O1" connection="8"/>
</dia:connections>
</dia:object>
Már látom is, hogy nem kell ez a sok kotyvasz, elég lesz belőle ennyi is:
<dia:object type="Standard - Line" version="0" id="04">
<dia:attribute name="end_arrow">
<dia:enum val="3"/>
</dia:attribute>
<dia:connections>
<dia:connection handle="0" to="00" connection="8"/>
<dia:connection handle="1" to="01" connection="8"/>
</dia:connections>
</dia:object>
A voalnak is van ID-je, ez csak a dia számára lényeges a szerkesztés miatt, ami számomra lényeges az a
<dia:connection handle="0" to="00" connection="8"/>
<dia:connection handle="1" to="01" connection="8"/>
Itt mondjuk meg, hogy melyik ID-jű csomópontot kösse össze melyik ID-jű csomóponttal. A handle="0" a kezdőpont, a handle="1" a célpont. Ha nyilazva rajzoltatjuk akkor lényeges, abból a szempontból, hogy megyik végére tegye a nyílhegyet.
Még hátra van egy fontos kérdés megvizslatása: elfogad-e ID névnek szám helyett valami string-et? Ez a kérdés dönti el, hogy sokat kell-e még macerálnom a problémával, esetleg a dia e célra való felhasználását is kútba ejti, vagy pedig innen már nem lesz nehéz dolgom. Nagyon megörültem, mert elfogadta, és a vonalakkal való összekötözésnél is szépen működik.
Lehet is mondjuk egy shell-scriptet gyártani. Végig kell menni egy könyvtárban szereplő fájlneveken, a fájlnevekből csomag-ID és csomagnév-string lesz, a fájl soraiból pedig kivesszük, hogy mivel kössük össze a csomag-ID-t. Ha nincs elírás, működnie kell. Hogy biztos ne legyen elírás, gyártani kell egy pár fájlt, akár hülyeséget is, lényeg, hogy elnevezés szemontjából korrekt legyen.
Mondjuk, kezdjük egy pár alapvető csomagnévvel, mindenféle cifrázás nélkül. Legyenek ezek: kernel, glibc, readline, ncurses, bash, liblzma, xz.
Az, hogy egy csomag függ a kernel-től, és a glibc-től, felesleges jelölni, hiszen akkor minden csomaghoz húzhatnánk tőlük vonalat. Csak ahhoz húzok a glibctől, aminek más függősége nincs. A bash függőséget sem célszerű jelölni, hiszen attól is minden olyan dolog függ, ami igényel parancsértelmezőt... vagyis szinte minden.
fájlok:
kernel:
glibc:
kernel
readline:
glibc
ncurses:
glibc
liblzma:
glibc
bash:
readline
ncurses
xz:
liblzma
Akkor kezdjünk scriptet gyártani, ami ezekből a fájlokból gráfot csinál.
Először is kell egy rövidke help, hogy ne felejtsem el, hogyan is használjam majd később valamikor.
function help() {
echo "depdir2dia test_dir test_dir.dia"
exit
}
Első lépéspen generálni kell magukat az elemeket. Az első 64 sor, valamint a layer az nekem statikus. Egy függvény kell, ami egyszerűen kiechózza.
function init_dia() {
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
echo "<dia:diagram xmlns:dia=\"http://www.lysator.liu.se/~alla/dia/\">"
echo " <dia:diagramdata>"
echo " <dia:attribute name=\"background\">"
...
}
function done_dia() {
echo " </dia:layer>"
echo "</dia:diagram>"
}
Ezután jöhetnek az elemek. Paraméternek ID,x,y,name lesz. A $1 és a $4 (ID és name) most nálam egyforma lesz, de hátha felhasználom még valaha más célra ezt a függvényt, ezért külön beállíthatóra csináltam.
function mk_object_pkg() {
echo " <dia:object type=\"UML - SmallPackage\" version=\"0\" id=\"$1\">"
echo " <dia:attribute name=\"elem_corner\">"
echo " <dia:point val=\"$2,$3\"/>"
echo " </dia:attribute>"
echo " <dia:attribute name=\"text\">"
echo " <dia:composite type=\"text\">"
echo " <dia:attribute name=\"string\">"
echo " <dia:string>#$4#</dia:string>"
echo " </dia:attribute>"
echo " </dia:composite>"
echo " </dia:attribute>"
echo " </dia:object>"
}
A vonalnál meg csak ID,kiindulási_ID,végcél_ID kell. Meg beállítottam statikusan, hogy nyilazzon.
function mk_object_conn() {
echo " <dia:object type=\"Standard - Line\" version=\"0\" id=\"$1\">"
echo " <dia:attribute name=\"end_arrow\">"
echo " <dia:enum val=\"3\"/>"
echo " </dia:attribute>"
echo " <dia:connections>"
echo " <dia:connection handle=\"0\" to=\"$2\" connection=\"8\"/>"
echo " <dia:connection handle=\"1\" to=\"$3\" connection=\"8\"/>"
echo " </dia:connections>"
echo " </dia:object>"
}
Az csomagok listázása csak egyszerűen fájlnevek beolvasásával történik.
function list_elemek() {
ls ./$1 | while read elem; do
echo $elem
done
}
Ebből rögtön meg is határozhatjuk, hogy összesen hány csomagunk van:
max_elem=`list_elemek $1 | wc -l`
Most jöhet a csomagok definiálása. A gondot igazán a csomagok síkbeli elhelyezése jelenti. Ha nem akarom, hogy az összes elemet egymásra pakolja, akkor mindegyik elemnek más és más elem_corner-t kell megadni. Ha meg akarom határozni, hogy honnan indul ki az egész, és mi merre tart, akkor ahhoz egy jó bonyolult algoritmus kéne. Én most megelégszem a random elhelyezéssel. Majt a dia-ban a helyére húzogatom a csomagokat, legalább ezzel is rögzül, hogy mi mivel van függésben. Nem csak szemléltetőeszköz lesz így, hanem a tudásom is mélyítem. ( Ha most megkérdezné valaki, mitől is függ pl. a shared-mime-info, akkor azt mondanám, hogy: ööööö.... ). Akkor lássuk a medvét:
function mk_elemek() {
i=0
max_elem=`list_elemek $1 | wc -l`
ls ./$1 | while read elem; do
i=`expr $i + 1`
x=`sm_random`
x=`sm_mul $x $max_elem 3`
x=`sm_tostring $x 2`
y=`sm_random`
y=`sm_mul $y $max_elem 3`
y=`sm_tostring $y 2`
mk_object_pkg $elem $x $y $elem
done
}
Itt csak egy paraméter van, a könyvtárnév, amiből kiolvassuk a fájlokat. A csomagok összedrótozása ennél is egyszerűbb. Beolvassuk a fájlnevet, ez lesz a ID_végcél, majd a sorokat, ezek pedig ID_kiindulás, és már csak a vonalat kell paraméterezni velük.
Ez az sm_* még egy régi kreációm. Pascal-ban írtam, szinte az összes matematikai műveletre megcsináltam. Az argumentumok a bemenőparaméterek, az eredményt meg kilöki standard-out-ra... soremelés nélkül. Faeke-programok, de sokszor használom őket.
function mk_connections() {
conn_id=`list_elemek $1 | wc -l`
ls ./$1 | while read elem; do
cat ./$1/$elem | while read conn; do
conn_id=`expr $conn_id + 1`
mk_object_conn $conn_id $conn $elem
done
done
}
Most már meg is van minden, ami kell. már csak össze kell pakolni a főprogramot:
if [ $# -eq 0 ]; then help;
else
init_dia >$2
mk_elemek $1 >>$2
mk_connections $1 >>$2
done_dia >>$2
fi
Kész... Összegzés:
Programok keresése a célra, próbálgatás: 5 nap (kb. 5*3 óra)
A Dia próbálgatása: 4 óra
Script írás 30 perc...
A nehezze meg még csak most jön: végig kell nézni azokat a build-depends-eket, nincs-e bennük elírási hiba, vagy adott csomag más néven megadása, nincs-e hozzátoldva verziószám, (vagy mindenhez hozzátoldani a megfelelőt ). Nomeg: át is kell őket nevezni... de maj erre is kitalálok valami scriptet.
- sigellef blogja
- A hozzászóláshoz be kell jelentkezni
- 1196 megtekintés
Hozzászólások
Hogy miért nem a GraphViz-t használod erre... Amit olvastam, hogy kell, azt voltaképp mind tudja és a formátuma is egyszerűbb.
Szerk:
főleg, hogy automatikusan el is rendezi a csomópontokat.
- A hozzászóláshoz be kell jelentkezni
Nem is rossz... sőt! Ezt a
"csomagnév1" -> "csomagnév2"
formátumot akár egy install script függőségmeglevési ellenőrzésére is használhatom! A sok xml kutyvasz legalább eltűnik, az mk_object_conn függvény meg lerövidül. Meg ha nagyon muszáj, akár gv2dia-t is gyárthatok...
-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba
- A hozzászóláshoz be kell jelentkezni
+1 tökéletes gráfábrázolásra
- A hozzászóláshoz be kell jelentkezni
Legyszi, a bbCode-s [ code ] taget vedd intenziv hasznalat ala... olvashatobba valna tole a cikk. Koszi.
Amugy: de, roppant fontos a verzioszam. Ugyanis nagyon sok csomag van, ami inkonzisztens verziozast hasznal, es siman lehet, hogy csinalnak egy ABI breakage-t ket minor verziovaltas kozott, tehat az x.y.1 es az x.y.2 nem lesz binarisan kompatibilis egymassal - ez pedig a jelenlegi rendszerben biztos bukas. Ezert kell a fuggosegeknel megadni a verzioszamot is, ha olyan jellegu a fugges. De meg a parancskent hivott fuggosegeknel is celszeru lehet, hiszen mind a parameterezes, mind pedig a kimenet valtozhat.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
Azt tudom, hogy fontos, hisz ha más a verziójú csomagot fordítok, akkor sokszor nemcsak hogy a függőségeit is cserélni kell (nem mindig), hanem néa még új, teljesen más függőségei is vannak, mint az előző verziónak. Épp ezért a verziózással nem is nagyon foglalkozok... egyelőre.
Mivel még a tanulás/megismerés fázisában vagyok még azzal is ismerkedek, hogy mely csomagokat mire/hogyan lehet használni. Itt van ez a graphviz nevű is: örülök, hogy most megismerhetem... hisz fordítottam is, mert valaminek a függősége volt. Most már tudom, hogy felhasználói funkciói is vannak.
-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba
- A hozzászóláshoz be kell jelentkezni
Ha rpm alapú disztró lenne, ott pl. van ilyen megoldás
http://raftaman.net/?s=rpmorphan
...
rpmdep itself is just a perl script, that walks down the rpm tree recursively. It can produce a Graphviz dot-file, which in turn can be used to make rather since pictures. For example,
$ rpmdep -dot firefox.dot firefox
$ dot -Tpng firefox.dot -o firefox.png
produces a complete rpm dependency tree for firefox.
...
- A hozzászóláshoz be kell jelentkezni
Kösz a segítő hozzászólásokat!
Ez a graphvizes dolog egész jól műkszik és ráadásul egyszerű is, mint a faék!
#!/bin/bash
function gv_init() {
echo 'digraph unix {'
echo ' size="6,6";'
echo ' node [shape=box color=lightblue2, style=filled];'
}
function scanfiles() {
ls $1 | while read pkg_node; do
cat $1"/"$pkg_node | while read pkg_depend; do
echo ' "'$pkg_depend'" -> "'$pkg_node'";'
done
done
}
function gv_done() {
echo "}"
}
gv_init >$2
scanfiles $1 >>$2
gv_done >>$2
(... meg a code BBCode is tesztelve...)
Ha meg nagyon akarnék Dia-t is használni, leltem olyat is a man-jába, hogy dot -Tdia ... . Igaz, hogy még valamiért nem akar ezzel a formátummal működni, de majd beleáskálódok ebbe is :D
-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba
- A hozzászóláshoz be kell jelentkezni