-- Leo's gemini proxy

-- Connecting to gmi.osiux.com:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es_AR

Cómo hacer una línea de tiempo con GraphViz


AUTHOR: Osiris Alejandro Gomez

EMAIL: osiux@osiux.com

DATE: 2022-10-25 21:43


[IMG]

[1]


si no existe lo que necesitas, entonces ocúpate de generarlo!


Hace un par de días, dí mi primer charla en *Nerdearla* ^1[2], `Cómo migrar 6300 equipos a GNU/Linux usando Ansible y AWX?` ^2[3] y quería que tuviera *líneas de tiempo* animadas, y luego de buscar por la *web* algún *software* que las hiciera usando código, no encontré nada de mi agrado, asi que llegué a la conclusión de que tenía que ocuparme de crear un *script* que usara `/GraphViz/` ^3[4] y que luego lo llamaría `timeline2dot` ^4[5] 😎


y el requerimiento?


El auto-requerimiento era generar una línea de tiempo simple, con fechas y etiquetas que muestre un rango de fechas y luego se vaya moviendo de derecha a izquierda mostrando más días con más etiquetas de eventos importantes.


*Draft*


Comencé a idear cómo mostrar una línea, segmentada en días y luego etiquetas que destaquen lo que sucedió en una fecha en particular.


*GraphViz* es fabuloso, básicamente cuenta con 2 elementos: `node` y `edge`, y es bastante difícil lograr posicionar los elementos donde te imaginas que deberían estar, esto es así porque debe resolver la posición de miles de objetos y entonces la potestad de dónde ubicarlos la tiene *GraphViz*.


Sólo podés indicarle preferencias de dónde deberían estar los elementos, un posible orden y el mismo se ve afectado por el mismo orden en que escribís el código en lenguaje `/DOT/` ^5[6], pero como llevo un par de años jugando con esto, algunas mañas ya se las conozco y siempre termino aprendiendo algo nuevo.


En este caso, se me ocurrió usar como `label` de los nodos un *pipe* `|` para usar como indicador de día y el carácter *UTF-8* para *rectángulo vertical negro* `█` (*BLACK VERTICAL RECTANGLE* como señalador de día importante, desde donde saldría la etiqueta a destacar.


De esta manera, desde el *nodo* del día destacado con `█` debía realizar una relación con el *nodo* de la etiqueta, por ejemplo `pass-utils/v0.0.2` que estaría dentro un rectángulo usando `"rect"` como tipo de *shape*.


Para balancear un poco y que no se superpongan 2 etiquetas de días contiguos, lo mejor fue, dibujar los *días pares por encima* de *la línea de tiempo* y los *días impares por debajo* de la misma.


Y como texto de la relación pondría la fecha de la etiqueta inicialmente en formato *ISO8601* ^6[7] (luego lo cambié a `MMM/DD`) y de esta manera obtengo una *línea de tiempo* completa y simple a la vez!


`.tln`


Teniendo un *template* de cómo se vería todo, ahora era hora de generar el *script* `timeline2dot` que se ocuparía de leer desde un archivo de texto `.tln` los siguientes campos: `YYYY-MM-DD group tag vM.N.P` por ejemplo:


2018-09-20 dev ansible v2.7.0rc3 New release v2.7.0rc3
2018-09-21 dev r_sudoers v2.0.20 Version 2.0.20
2018-09-25 dev drbl v2.28.4 Released as v2.28.4.
2018-09-26 dev drbl v2.28.5 Released as v2.28.5.
2018-09-27 dev ansible v2.5.10 New release v2.5.10
2018-09-28 dev ansible v2.6.5 New release v2.6.5
2018-09-29 dev drbl v2.28.6 Released as v2.28.6.

los *tags* se convierten en una *timeline*


La idea era generar un archivo `timeline.tln` por cada repositorio, partiendo de la información de los *tags* de `git` ya que cuentan con una fecha de generación y una versión en formato `semver` ^7[8] (*Semantic Version*), además de una anotación extra que podría mostrar.


Asi que ahora en cualquier repositorio git, simplemente ejecuto `git-tag-timeline` ^8[9] y obtengo una *línea de tiempo* en forma de archivo `timeline.tln`


agrupando fechas!


A los efectos de agrupar de alguna manera las diferentes etiquetas de los proyectos, resolví utilizar un *script* `date2stage` ^9[10] que se ocuparía de recibir una fecha y devolver el `stage` o `grupo` al cuál debería pertenecer, es decir si ingreso `2020-03-15` obtengo `dep`, porque desde el *2019-09-02 al 2020-08-31* estuvimos en la etapa de `deploy` del proyecto `Filiales GNU/Linux`


completando días faltantes!


Para tener un mejor control de los días a visualizar, el *script* `timeline-days` se ocupa de completar los días faltantes entre el primero y el último definidos en `timeline.tln`


agregando un poco de estilo!


Si en el directorio actual existe un archivo `timeline.style`, se pueden re-definir los colores de cada componente, utilizando como prefijo de las variables, los nombres de los nodos, por ejemplo `ANSIBLE_EDGE_COLOR`, algunos ejemplos usados:


ALL_EDGE_COLOR='#16a085'
ALL_EDGE_FONTCOLOR='#16a085'
ALL_NODE_COLOR='#16a085'
ALL_TAG_EDGE_COLOR='#16a085'
ALL_TAG_SHAPE_FILL_COLOR='#16a085'
ANSIBLE_EDGE_COLOR='#1abc9c'
ANSIBLE_EDGE_FONTCOLOR='#1abc9c'
ANSIBLE_NODE_COLOR='#1abc9c'
ANSIBLE_TAG_EDGE_COLOR='#1abc9c'
ANSIBLE_TAG_SHAPE_FILL_COLOR='#1abc9c'
APT_EDGE_COLOR='#27ae60'
APT_EDGE_FONTCOLOR='#27ae60'
APT_NODE_COLOR='#27ae60'
APT_TAG_EDGE_COLOR='#27ae60'
APT_TAG_SHAPE_FILL_COLOR='#27ae60'
AWX_EDGE_COLOR='#2980b9'
AWX_EDGE_FONTCOLOR='#2980b9'
AWX_NODE_COLOR='#2980b9'
AWX_TAG_EDGE_COLOR='#2980b9'
AWX_TAG_SHAPE_FILL_COLOR='#2980b9'

series animadas


`timeline-series` se ocupa de generar los archivos `.dot` y `.png` con 1 día corrido en un período de 15 días para luego convertirlos a un video en formato `.mp4` usando `ffmpeg`.


Se genera una imagen por cada día, por ejemplo para el *stage* `dev`, una muestra de algunas imágenes generadas antes de convertirse en video!


[IMG]

[11]


[IMG]

[12]


[IMG]

[13]


[IMG]

[14]


[IMG]

[15]


[IMG]

[16]


video generado![17]


<video id="video" controls autoplay loop background="#000000">
  <source src="img/filiales-gnu-linux/filiales-dev.mp4" type="video/mp4">
</video>

tal vez te interese leer


imágenes mágicas | imagemagick[18]

Visualizando Grafos usando Graphviz[19]

redes abiertas versus redes cerradas[20]

Diagrama de secuencia de Tráfico de Red[21]

Cómo migrar 6300 equipos a GNU/Linux usando Ansible y AWX[22]

Usar Graphviz para generar Slides[23]


ChangeLog


`2022-11-15 09:59`[24] agregar KEYWORDS en=Cómo hacer una línea de tiempo con GraphViz=

`2022-11-15 09:42`[25] reemplazar imagen de OpenGraph en `Cómo hacer una línea de tiempo con GraphViz`

`2022-11-13 20:39`[26] agregar y actualizar tags OpenGraph

`2022-10-30 09:07`[27] agregar controles de video a `Cómo hacer una línea de tiempo con GraphViz`

`2022-10-26 17:07`[28] agregar `Cómo hacer una línea de tiempo con GraphViz`


1: file:img/filiales-gnu-linux/tlns-filiales-dev-0299.png

2: https://nerdear.la/

3: https://osiux.com/2022-10-20-howto-migrate-6300-hosts-to-gnu-linux-using-ansible-and-awx.html

4: https://graphviz.gmi/

5: https://gitlab.com/osiux/timeline2dot.git

6: http://www.graphviz.gmi/doc/info/lang.html

7: https://es.wikipedia.gmi/wiki/ISO_8601

8: https://semver.gmi/lang/es/

9: https://gitlab.com/osiux/timeline2dot/-/raw/develop/git-tag-timeline

10: https://gitlab.com/osiux/timeline2dot/-/raw/develop/date2stage

11: file:img/filiales-gnu-linux/tlns-filiales-dev-0290.png

12: file:img/filiales-gnu-linux/tlns-filiales-dev-0291.png

13: file:img/filiales-gnu-linux/tlns-filiales-dev-0292.png

14: file:img/filiales-gnu-linux/tlns-filiales-dev-0293.png

15: file:img/filiales-gnu-linux/tlns-filiales-dev-0294.png

16: file:img/filiales-gnu-linux/tlns-filiales-dev-0295.png

17: img/filiales-gnu-linux/filiales-dev.mp4

18: imagenes-magicas-imagemagick.gmi

19: visualizando-grafos-graphviz.gmi

20: 2012-03-05-redes-abiertas-versus-redes-cerradas.gmi

21: 2021-03-04-diagrama-de-secuencia-trafico-de-red

22: 2022-10-20-howto-migrate-6300-hosts-to-gnu-linux-using-ansible-and-awx.gmi

23: 2022-10-21-use-graphviz-for-slides.gmi

24: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/5ffcc472c0c4584e721e0cee87d4d0225cfdffbf

25: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/ef590e14a78a8a1106c27f4727997e4bd5b908da

26: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/bf3a61526ad2a73cecb77a18995f1d63494e3664

27: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/6652f0fa1d2543e388ad46318a80ef7caec409c6

28: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/9166b1634c42e39be8942c4ba99d3d3d3ab041af

-- Response ended

-- Page fetched on Fri May 17 05:41:18 2024