{"id":565,"date":"2021-12-29T16:14:41","date_gmt":"2021-12-29T15:14:41","guid":{"rendered":"https:\/\/caipirinha.spdns.org\/wp\/?p=565"},"modified":"2022-01-16T15:21:52","modified_gmt":"2022-01-16T14:21:52","slug":"colored-network-diagrams","status":"publish","type":"post","link":"https:\/\/caipirinha.spdns.org\/wp\/?p=565","title":{"rendered":"Colored Network Diagrams (Part 1)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Executive Summary<\/h2>\n\n\n\n<p>This blog post offers a method to create colored network graphs (<strong>PERT charts<\/strong>) from project plans that are created with <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong>.  Color schemes similar to the ones used in physical maps visualize those tasks which:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8230; have long durations<\/li><li>&#8230; have a high amount work<\/li><li>&#8230; have little slack<\/li><li>&#8230; have a high criticality<\/li><\/ul>\n\n\n\n<p>The blog post shall also encourage readers to think outside of the possibilities that established project management software offers and to define for <em>yourself<\/em> which tasks are critical or relevant for you and how this information shall be determined.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preconditions<\/h2>\n\n\n\n<p>In order to use the approach described here, you should:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8230; have access to a Linux machine or account<\/li><li>&#8230; have a <a rel=\"noreferrer noopener\" href=\"https:\/\/www.mysql.com\/\" target=\"_blank\">MySQL<\/a> or <a rel=\"noreferrer noopener\" href=\"https:\/\/mariadb.org\/\" target=\"_blank\">MariaDB<\/a> database server set up, running, and have access to it<\/li><li>&#8230; have the package <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> installed<\/li><li>&#8230; have some basic knowledge of how to operate in a Linux environment and some basic understanding of shell scripts<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Description and Usage<\/h2>\n\n\n\n<p>The base for the colored network graphs is a plan in <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> which needs to be stored as <strong>XML<\/strong> file. The XML file is readable with a text editor (e.g., <a rel=\"noreferrer noopener\" href=\"https:\/\/www.ultraedit.com\/\" target=\"_blank\">UltraEdit<\/a>) and follows the syntax in [<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\">1<\/a>]. The XML file is then parsed, the relevant information is captured and is stored in a database (Step 1). Then, selected information is retrieved from the database and written to a script in <em><a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/doc\/info\/lang.html\" target=\"_blank\">dot<\/a><\/em> language which subsequently is transformed into a graph using the package <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> (Step 2). Storing the data in a database rather than in variables allows us to use all the computational methods which the database server offers in order to select, aggregate, and combine data from the project plan. It also allows us to implement Step 2 in PHP so that graphs can be generated and displayed within a web site; this could be beneficial for a web-based project information system.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 0: Setting up the Database<\/h3>\n\n\n\n<p>At the beginning, a database needs to be set up in the database server. For this, you will probably need administrative access to the database server. The following SQL script sets up the database and grants access rights to the user <em>gabriel<\/em>. Of course, you need to adapt this to your needs on the system you work on.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Delete existing databases\nREVOKE ALL ON projects.* FROM 'gabriel';\nDROP DATABASE projects;\n\n# Create a new database\nCREATE DATABASE projects;\nGRANT ALL ON projects.* TO 'gabriel';\nUSE projects;\n\nCREATE TABLE projects         (proj_uid               SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\\\n                               proj_name              VARCHAR(80)) ENGINE=MyISAM DEFAULT CHARSET=utf8;\nCREATE TABLE tasks            (proj_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               task_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               task_name              VARCHAR(150),\\\n                               is_summary_task        BOOLEAN           DEFAULT FALSE NOT NULL,\\\n                               is_milestone           BOOLEAN           DEFAULT FALSE NOT NULL,\\\n                               is_critical            BOOLEAN           DEFAULT FALSE NOT NULL,\\\n                               task_start             DATETIME          NOT NULL,\\\n                               task_finish            DATETIME          NOT NULL,\\\n                               task_duration          INT UNSIGNED      DEFAULT 0,\\\n                               task_work              INT UNSIGNED      DEFAULT 0,\\\n                               task_slack             INT               DEFAULT 0,\\\n                               rem_duration           INT UNSIGNED      DEFAULT 0,\\\n                               rem_work               INT UNSIGNED      DEFAULT 0,\\\n                               `%_complete`           SMALLINT UNSIGNED DEFAULT 0,\\\n                                                      PRIMARY KEY (proj_uid, task_uid)) ENGINE=MyISAM DEFAULT CHARSET=utf8;\nCREATE TABLE task_links       (proj_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               predecessor            SMALLINT UNSIGNED NOT NULL,\\\n                               successor              SMALLINT UNSIGNED NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;\nCREATE TABLE resources        (proj_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               resource_uid           SMALLINT UNSIGNED NOT NULL,\\\n                               calendar_uid           SMALLINT UNSIGNED NOT NULL,\\\n                               resource_units         DECIMAL(3,2)      DEFAULT 1.00,\\\n                               resource_name          VARCHAR(100),\\\n                                                      PRIMARY KEY (proj_uid, resource_uid)) ENGINE=MyISAM DEFAULT CHARSET=utf8;\nCREATE TABLE assignments      (proj_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               task_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               resource_uid           SMALLINT UNSIGNED NOT NULL,\\\n                               assignment_uid         SMALLINT UNSIGNED NOT NULL,\\\n                               assignment_start       DATETIME          NOT NULL,\\\n                               assignment_finish      DATETIME          NOT NULL,\\\n                               assignment_work        INT UNSIGNED      DEFAULT 0,\\\n                                                      PRIMARY KEY (proj_uid, task_uid, resource_uid)) ENGINE=MyISAM DEFAULT CHARSET=utf8;\nCREATE TABLE assignment_data  (proj_uid               SMALLINT UNSIGNED NOT NULL,\\\n                               assignment_uid         SMALLINT UNSIGNED NOT NULL,\\\n                               assignment_start       DATETIME          NOT NULL,\\\n                               assignment_finish      DATETIME          NOT NULL,\\\n                               assignment_work        INT UNSIGNED      DEFAULT 0) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n<\/code><\/pre>\n\n\n\n<p>This SQL script sets up a database with several tables. The database can hold several project plans, but they all must have distinctive names. This SQL script only catches a subset of all information which is part of a <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> plan in <strong>XML<\/strong> format; it does not capture calendar data, for example, nor do the data types in the SQL script necessarily match the ones from the specification in [<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\">1<\/a>]. But it is good enough to start with colored network graphs.<\/p>\n\n\n\n<p>This only needs to be executed one time. Once the database has been set up properly, we only have to execute Step 1 and Step 2.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Parsing the Project Plan<\/h3>\n\n\n\n<p>The first real step is to parse the <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> plan in <strong>XML<\/strong> format; this is done with the bash script <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\"><strong>msp2mysql.sh<\/strong><\/a>. This program contains a <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Finite-state_machine\" target=\"_blank\">finite-state machine<\/a> (see graph below), and the transitions between the states are XML tags (opening ones and closing ones). This approach helps to keep the code base small and easily maintainable. Furthermore, the code base can be enlarged if more XML tags or additional details of the project plan shall be considered.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"456\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-456x1024.png\" alt=\"\" class=\"wp-image-621\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-456x1024.png 456w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-133x300.png 133w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-768x1727.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-683x1536.png 683w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/msp2mysql-911x2048.png 911w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><figcaption>Finite-State Machine for parsing the Project Plan<\/figcaption><\/figure>\n\n\n\n<p>I concede there are more elegant and faster ways to parse XML data, but I believe that <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">msp2mysql.sh<\/a> can be understood well and helps to foster an understanding of what needs to be done in Step 1.<\/p>\n\n\n\n<p>There is one important limitation in the program that needs to be mentioned: The function <strong>iso2msp ()<\/strong> transforms a duration in ISO 8601 format to a duration described by multiples of 6 s (6 s are an old <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> &#8220;unit&#8221; of a time duration, <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> would traditionally only calculate with 0.1 min of resolution). However, as you can see in [<a rel=\"noreferrer noopener\" href=\"https:\/\/www.digi.com\/resources\/documentation\/digidocs\/90001437-13\/reference\/r_iso_8601_duration_format.htm\" target=\"_blank\">2<\/a>], durations cannot only be measured in seconds, minutes, and hours, but also in days, months, etc. A duration of 1 month is a different amount of days, depending on the month we are looking at. This is something that has not been considered in this program; in fact, it can only transform durations given in hours, minutes and seconds to multiples of 6 s. Fortunately, this captures most durations used by <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong>, even durations that span over multiple days (which are mostly still given in hours in the <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> XML file).<\/p>\n\n\n\n<p>While <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">msp2mysql.sh<\/a> parses the <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> plan in <strong>XML<\/strong> format, it typically runs through these steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>It extracts the name of the project plan and checks if there is already a project plan with this name in the database. If that is the case, the program terminates. If that is not the case, the project name is stored in the table <strong>projects<\/strong>, and a new <strong>proj_uid<\/strong> is allocated.<\/li><li>It extracts details of the tasks and stored them in the tables <strong>tasks<\/strong> and <strong>task_links<\/strong>.<\/li><li>It extracts the resource names and stores their details in the table <strong>resources<\/strong>.<\/li><li>It extracts assignments (of resources to tasks) and stores them in the tables <strong>assignments<\/strong> and <strong>assignment_data<\/strong>.<\/li><\/ul>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">msp2mysql.sh<\/a> is called with the <strong>Microsoft<sup>\u00ae<\/sup> Project<\/strong> plan in <strong>XML<\/strong> format as argument, like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/msp2mysql.sh \/home\/tmp\/Example_1.xml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Generating a Graph<\/h3>\n\n\n\n<p>The second step is to extract meaningful data from the database and transform this into a colored network graph; this is done with the bash script <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\"><strong>mysql2dot.<\/strong><\/a><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a><\/strong>. <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\"><strong>mysql2dot.<\/strong><\/a><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a><\/strong> can create colored network graphs according to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8230; the task duration<\/li><li>&#8230; the work allocated to a task<\/li><li>&#8230; the task slack<\/li><li>&#8230; the criticality of a task<\/li><\/ul>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> relies on a working installation of the <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> package, and in fact, it is <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> and its collection of tools that create the graph, while <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> creates a script for <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> in the <em><a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/doc\/info\/lang.html\" target=\"_blank\">dot<\/a><\/em> language. Let us look close to some aspects:<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> uses an uneven scale of colors, and the smallest scale should be three or more colors. The constant NUM_COLSTEPS sets the number of colors, in our case 7 colors. The constant COLSCHEME defines the <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> color scheme that shall be used, in our case this is &#8220;ylorrd7&#8221;. [<a rel=\"noreferrer noopener\" href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html\" target=\"_blank\">3<\/a>] shows some really beautiful color schemes. The ColorBrewer schemes are well suited for our kind of purpose (or for physical maps); however, the license conditions ([<a rel=\"noreferrer noopener\" href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html#brewer_license\" target=\"_blank\">4<\/a>]) must be observed.<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> is invoked with the name of a directory as argument. The generated script(s) in <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/doc\/info\/lang.html\" target=\"_blank\">dot<\/a> language as well as the generated graph(s) will be stored in that directory. A typical call looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mysql2dot.sh \/home\/tmp\/<\/code><\/pre>\n\n\n\n<p>When started, <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> retrieves a list of all projects from the database and displays them to the user who then has to select a project or choose the option <em>Exit<\/em>. When a project plan has been selected, the user has to choose the graph that shall be generated. Subsequently, the program starts to generate a script in <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/doc\/info\/lang.html\" target=\"_blank\">dot<\/a> language and invokes the program dot (a tool of the <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> suite) in order to compute the network graph.<\/p>\n\n\n\n<p>Different project plans typically have different ranges of durations, work or slack for all of their tasks. <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">mysql2dot.<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">sh<\/a> therefore takes into account the maximum duration, the maximum work, or the maximum slack it can find in the whole project. Initially, I used a linear scale to distribute the colors over the whole range from [0; max_value], but after looking at some real project plans, I personally found that too many tasks would then be colored in darker colors and I thought that this would rather distract a project manager from focusing on the few tasks that <em>really<\/em> need to be monitored closely. Trying out <em>linear<\/em>, <em>square<\/em> and <em>square root<\/em> approaches, I finally decided for the <em>square root<\/em> approach which uses the darker colors only when the slack is very small, the workload is very high, or the duration is very long. Consequently, the focus of the project manager is guided to the few tasks that really deserve special attention. However, this does not mean that this approach is the only and correct way to do it. Feel free to experience with different scaling methods to tune the outcome to your preferences.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen-1024x724.jpg\" alt=\"\" class=\"wp-image-627\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen-1536x1086.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/PERT-Farbskalen.jpg 1755w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Different Algorithms and their Effect on Color Scales<\/figcaption><\/figure>\n\n\n\n<p>The network graph colored according to <em>task criticality<\/em> follows a different approach. <em>Task criticality<\/em> is derived from the ration of <em>task slack<\/em> and <em>task duration<\/em>. Tasks which have a low ratio of <em>task slack<\/em> \/ <em>task duration<\/em> are defined as more critical than tasks where this ratio is higher. I also experienced with the square root approach mentioned above, but that seemed to result in different criticalities depending on the maximum ratio of <em>task slack<\/em> \/ <em>task duration<\/em> which seemed unsatisfactory to me. Finally, I opted for a logarithmic approach which puts the ration <em>task slack<\/em> \/ <em>task duration<\/em> = 1,0 to the middle value of NUM_COLSTEPS. So in the current case, a ratio of  <em>task slack<\/em> \/ <em>task duration<\/em> = 1,0 (means: <em>task slack<\/em> = <em>task_duration<\/em>) would result in a value of 4.0. If NUM_COLSTEPS was 9 rather than 7, the result would be 5.0. This can be reached by the formula:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"132\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Formel-1.png\" alt=\"\" class=\"wp-image-674\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Formel-1.png 711w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Formel-1-300x56.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p>where:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>n<\/em> is the number of tasks that are neither a milestone nor a summary task and that have a non-zero duration<\/li><li><em>j<\/em> is the task for which we determine the level of shade<\/li><li><em>number_of_shades<\/em> is the number of different shades you want to have in the graph; this should be an impair number and it should be 3 at least<\/li><li><em>shade<sub>j<\/sub><\/em> is the numerical value of the shade for task <em>j<\/em><\/li><li><em>task_slack<sub>j<\/sub><\/em> is the task slack of task <em>j<\/em><\/li><li><em>task_duration<sub>j<\/sub><\/em> is the duration of task <em>j<\/em><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Example 1: Sequential Task Chain<\/h3>\n\n\n\n<p>This example is a sequential task chain with 20 tasks; each task is +1d longer than the previous task.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-1024x256.jpg\" alt=\"\" class=\"wp-image-570\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-1024x256.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-300x75.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-768x192.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-1536x384.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-2048x512.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 1: Sequential Task Chain<\/figcaption><\/figure>\n\n\n\n<p>In this example, no resources have been assigned yet. As all tasks are in sequence, there is obviously no slack in any task, and all tasks are in the critical path. Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"705\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-1024x705.png\" alt=\"\" class=\"wp-image-571\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-1024x705.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-300x207.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-768x529.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1.png 1044w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Parsing the project plan from Example 1<\/figcaption><\/figure>\n\n\n\n<p>We can already see that the shall script takes a long time for this easy project plan. For a productive environment, one would have to use C code rather than a shell script, but for educational purposes, the shell script is easier to change, understand and also to debug. Subsequently, we start creating the graphs with <strong>mysql2dot.sh<\/strong>, here is an example on how this looks like:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"587\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Erzeugung-eines-Graphen-1024x587.png\" alt=\"\" class=\"wp-image-572\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Erzeugung-eines-Graphen-1024x587.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Erzeugung-eines-Graphen-300x172.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Erzeugung-eines-Graphen-768x440.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Erzeugung-eines-Graphen.png 1044w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Creation of a graph with mysql2dot.sh<\/figcaption><\/figure>\n\n\n\n<p>Let us look at the 4 graphs which can be generated:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"17\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-1024x17.png\" alt=\"\" class=\"wp-image-573\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-1024x17.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-300x5.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-768x12.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-1536x25.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-duration-2048x33.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 1)<\/figcaption><\/figure>\n\n\n\n<p>The result is what could be expected. Tasks with a shorter duration are colored in a lighter color, tasks with a longer duration consequently in a darker color. While the task duration increases in a linear fashion from left to right, the graph colors tasks with a longer duration more in the &#8220;dangerous&#8221; area, that is, in a darker color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"17\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-1024x17.png\" alt=\"\" class=\"wp-image-574\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-1024x17.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-300x5.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-768x12.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-1536x25.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-work-2048x33.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 1)<\/figcaption><\/figure>\n\n\n\n<p>As no resource has been attributed, no work has been registered for any of the tasks. Therefore, all tasks are equally shown in a light color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"17\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-1024x17.png\" alt=\"\" class=\"wp-image-575\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-1024x17.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-300x5.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-768x12.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-1536x25.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-slack-2048x33.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 1)<\/figcaption><\/figure>\n\n\n\n<p>As none of the tasks has any slack, obviously all tasks are in the critical path. Hence all of them are colored in dark color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"17\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-1024x17.png\" alt=\"\" class=\"wp-image-576\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-1024x17.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-300x5.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-768x12.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-1536x25.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_1-criticality-2048x33.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 1)<\/figcaption><\/figure>\n\n\n\n<p>Similar to the graph above, all tasks are critical, and progress must be carefully monitored; hence, all tasks are colored in dark color.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example 2: Parallel Task Chain<\/h3>\n\n\n\n<p>This example has the same tasks as Example 1, but all of them in parallel. The longest task therefore determines the overall project runtime.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-1024x724.jpg\" alt=\"\" class=\"wp-image-577\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-1536x1087.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-2048x1449.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 2: Parallel Task Chain<\/figcaption><\/figure>\n\n\n\n<p>In this example, too, no resources have been assigned yet. Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-1024x705.png\" alt=\"\" class=\"wp-image-578\" width=\"840\" height=\"578\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-1024x705.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-300x207.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-768x529.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2.png 1044w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><figcaption>Parsing the project plan from Example 2<\/figcaption><\/figure>\n\n\n\n<p>The 4 graphs from this example look very different from Example 1:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration-128x1024.png\" alt=\"\" class=\"wp-image-579\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration-128x1024.png 128w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration-768x6145.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration-192x1536.png 192w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration-256x2048.png 256w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-duration.png 792w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><figcaption>Network Graph colored according to task duration (Example 2)<\/figcaption><\/figure>\n\n\n\n<p>The color of the tasks is the same as in Example 1; however, all tasks are in parallel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work-128x1024.png\" alt=\"\" class=\"wp-image-580\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work-128x1024.png 128w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work-768x6145.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work-192x1536.png 192w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work-256x2048.png 256w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-work.png 792w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><figcaption>Network Graph colored according to task work (Example 2)<\/figcaption><\/figure>\n\n\n\n<p>The color of the tasks is the same as in Example 1 as we still have no work assigned to any of the tasks; however, all tasks are in parallel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack-128x1024.png\" alt=\"\" class=\"wp-image-581\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack-128x1024.png 128w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack-768x6145.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack-192x1536.png 192w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack-256x2048.png 256w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-slack.png 792w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><figcaption>Network Graph colored according to task slack (Example 2)<\/figcaption><\/figure>\n\n\n\n<p>As to slack, the picture is different. Only one task (task #20) does not have any slack, all other tasks have more or less slack, and task #01 has the most slack.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality-128x1024.png\" alt=\"\" class=\"wp-image-582\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality-128x1024.png 128w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality-768x6145.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality-192x1536.png 192w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality-256x2048.png 256w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_2-criticality.png 792w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><figcaption>Network Graph colored according to task criticality (Example 2)<\/figcaption><\/figure>\n\n\n\n<p>Here, we can see that both tasks #19 and tasks #20 are considered to be critical. More tasks receive a darker color as compared to the graph considering slack alone.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example 3: Sequential Task Chain with Resource<\/h3>\n\n\n\n<p>This example has the same tasks as Example 1, but we assign a resource to each task (the same in this example, but this OK as all tasks are sequential, hence no overload of the resource). Consequently, work is assigned to each task, and we can expect changes in the network graph referring to task work.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-1024x256.jpg\" alt=\"\" class=\"wp-image-583\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-1024x256.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-300x75.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-768x192.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-1536x385.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-2048x513.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 3: Sequential Task Chain with Resource<\/figcaption><\/figure>\n\n\n\n<p>Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"952\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-1024x952.png\" alt=\"\" class=\"wp-image-584\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-1024x952.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-300x279.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-768x714.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3.png 1044w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Parsing the project plan from Example 3<\/figcaption><\/figure>\n\n\n\n<p>We can see that now (different from Example 1), resources and assignments are captured, too. Let us look at the 4 graphs from this example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"15\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-1024x15.png\" alt=\"\" class=\"wp-image-586\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-1024x15.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-300x4.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-768x11.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-1536x22.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-duration-2048x29.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 3)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 1 as the durations are the same.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"15\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-1024x15.png\" alt=\"\" class=\"wp-image-587\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-1024x15.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-300x4.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-768x11.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-1536x22.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-work-2048x29.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 3)<\/figcaption><\/figure>\n\n\n\n<p>This graph now experiences the same coloring as the network graph according to task duration. That is understandable given the fact that we have a full-time resource working 100% of the time for the full task duration, hence work and duration have the same numeric values for each respective task.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"15\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-1024x15.png\" alt=\"\" class=\"wp-image-588\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-1024x15.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-300x4.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-768x11.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-1536x22.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-slack-2048x29.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 3)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 1 as still none of the tasks has any slack.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"15\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-1024x15.png\" alt=\"\" class=\"wp-image-589\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-1024x15.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-300x4.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-768x11.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-1536x22.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_3-criticality-2048x29.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 3)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 1 as still none of the tasks has any slack. Consequently, all of them are critical.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example 4: Parallel Task Chain with Resources<\/h3>\n\n\n\n<p>This example has the same tasks as Example 2, but we assign a resource to each task. As all tasks are parallel, we assign a new resource to each task so that there is no resource overload.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-1024x724.jpg\" alt=\"\" class=\"wp-image-590\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-1536x1087.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-2048x1449.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 4: Parallel Task Chain with Resources<\/figcaption><\/figure>\n\n\n\n<p>Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"951\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-951x1024.png\" alt=\"\" class=\"wp-image-591\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-951x1024.png 951w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-279x300.png 279w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-768x827.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4.png 1044w\" sizes=\"auto, (max-width: 951px) 100vw, 951px\" \/><figcaption>Parsing the project plan from Example 4<\/figcaption><\/figure>\n\n\n\n<p>We can see that now (different from Examples 2), resources and assignments are captured, too. Let us look at the 4 graphs from this example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"139\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-duration-139x1024.png\" alt=\"\" class=\"wp-image-585\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-duration-139x1024.png 139w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-duration-768x5659.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-duration-278x2048.png 278w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-duration.png 860w\" sizes=\"auto, (max-width: 139px) 100vw, 139px\" \/><figcaption>Network Graph colored according to task duration (Example 4)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 2 as the durations are the same.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"139\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-work-139x1024.png\" alt=\"\" class=\"wp-image-593\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-work-139x1024.png 139w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-work-768x5659.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-work-278x2048.png 278w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-work.png 860w\" sizes=\"auto, (max-width: 139px) 100vw, 139px\" \/><figcaption>Network Graph colored according to task work (Example 4)<\/figcaption><\/figure>\n\n\n\n<p>This graph now experiences the same coloring as the network graph according to task duration. That is understandable given the fact that we have a full-time resource working 100% of the time for the full task duration, hence work and duration have the same numeric values for each respective task.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"139\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-slack-139x1024.png\" alt=\"\" class=\"wp-image-606\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-slack-139x1024.png 139w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-slack-768x5659.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-slack-278x2048.png 278w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-slack.png 860w\" sizes=\"auto, (max-width: 139px) 100vw, 139px\" \/><figcaption>Network Graph colored according to task slack (Example 4)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 3; the slack of each task has remained the same.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"139\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-criticality-139x1024.png\" alt=\"\" class=\"wp-image-595\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-criticality-139x1024.png 139w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-criticality-768x5659.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-criticality-278x2048.png 278w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_4-criticality.png 860w\" sizes=\"auto, (max-width: 139px) 100vw, 139px\" \/><figcaption>Network Graph colored according to task criticality (Example 4)<\/figcaption><\/figure>\n\n\n\n<p>Nothing has changed compared to Example 3; the criticality of the tasks remains the same.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example 5: Sequential Blocks with Parallel Tasks and with Resources<\/h3>\n\n\n\n<p>This example is the most interesting one as it combines different aspects within one project plan. We have 5 milestones, and 4 parallel tasks before each milestone. All tasks have resources assigned.<br><strong>Task Block 1<\/strong> contains 4 tasks of different durations, and as each task has a 100% resource allocated, also of different work. Due to the different durations, the 4 tasks also have different slack, with the longest task having zero slack.<br><strong>Task Block 2<\/strong> is like Task Block 1, but the work is the same for each task; this has been achieved by an over-allocation of the respective resources for 3 out of the 4 tasks.<br><strong>Task Block 3<\/strong> consists of 4 parallel tasks with the same duration, however with a work allocation similar to Task Block 1. None of the tasks therefore has slack, but the work for each task is different.<br><strong>Task Block <\/strong>4 is like Task Block 1 in terms of task duration and task work. However, the tasks have been arranged in a way so that none of the tasks has slack.<br><strong>Task Block 5<\/strong> is like Task Block 4, but each task has (the same amount of) lag time between the task end and the subsequent milestone. None of the tasks has any slack.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-1024x724.jpg\" alt=\"\" class=\"wp-image-607\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-1536x1087.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-2048x1449.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 5: Sequential Blocks with Parallel Tasks and with Resources<\/figcaption><\/figure>\n\n\n\n<p>Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"951\" height=\"1024\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-951x1024.png\" alt=\"\" class=\"wp-image-600\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-951x1024.png 951w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-279x300.png 279w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-768x827.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5.png 1044w\" sizes=\"auto, (max-width: 951px) 100vw, 951px\" \/><figcaption>Parsing the project plan from Example 5<\/figcaption><\/figure>\n\n\n\n<p>Let us look at the 4 graphs from this example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"245\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-1024x245.png\" alt=\"\" class=\"wp-image-608\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-1024x245.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-300x72.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-768x184.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-1536x368.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-duration-2048x491.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 5)<\/figcaption><\/figure>\n\n\n\n<p>The colors in Task Block 1, 2, 4 and 5 are the same. Only in Task Block 3 where all tasks have the same (long) duration, all tasks have a dark color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"245\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-1024x245.png\" alt=\"\" class=\"wp-image-609\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-1024x245.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-300x72.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-768x184.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-1536x368.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-work-2048x491.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 5)<\/figcaption><\/figure>\n\n\n\n<p>The colors in Task Block 1, 3, 4, and 5 are the same. Only in Task Block 2 where all tasks have the same amount of work (which is also the highest work a task has in this project plan), all tasks have a dark color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"245\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-1024x245.png\" alt=\"\" class=\"wp-image-610\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-1024x245.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-300x72.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-768x184.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-1536x368.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-slack-2048x491.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 5)<\/figcaption><\/figure>\n\n\n\n<p>The colors in Task Block 1 and 2 are the same. The tasks in Task Blocks 3, 4, and 5 are all dark as none of these tasks has any slack.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"245\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-1024x245.png\" alt=\"\" class=\"wp-image-611\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-1024x245.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-300x72.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-768x184.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-1536x368.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_5-criticality-2048x491.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 5)<\/figcaption><\/figure>\n\n\n\n<p>The network graph according to task criticality is similar to the one according to slack, but we can see that in Task Blocks 1 and 2 tasks get a darker color &#8220;earlier&#8221; as in the network graph according to criticality.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example 6: Distinguishing Slack and Criticality<\/h3>\n\n\n\n<p>So far, we have not seen much difference between the network graphs according to slack and the one according to criticality. In this example, we have two task blocks with 4 tasks each where the slack is the same in the corresponding tasks in each task block. However, the duration is different between both task blocks. Work per task is almost the same, I tried to match the work despite the longer duration of the tasks in Task Block 2 as good as possible.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"378\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-1024x378.jpg\" alt=\"\" class=\"wp-image-613\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-1024x378.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-300x111.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-768x284.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-1536x567.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-2048x757.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example 6: Distinguishing Slack and Criticality<\/figcaption><\/figure>\n\n\n\n<p>Parsing this project plan with <strong>msp2mysql.sh<\/strong> leads to:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"669\" height=\"609\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6.png\" alt=\"\" class=\"wp-image-614\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6.png 669w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-300x273.png 300w\" sizes=\"auto, (max-width: 669px) 100vw, 669px\" \/><figcaption>Parsing the project plan from Example 6<\/figcaption><\/figure>\n\n\n\n<p>Let us look at the 4 graphs from this example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration-1024x618.png\" alt=\"\" class=\"wp-image-615\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration-1024x618.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration-300x181.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration-768x464.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration-1536x927.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-duration.png 1883w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 6)<\/figcaption><\/figure>\n\n\n\n<p>The duration of the tasks in Task Block 2 is +5d higher as in Task Block 1. Therefore, it is not surprising that the tasks in Task Block 2 are colored in darker colors.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work-1024x618.png\" alt=\"\" class=\"wp-image-616\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work-1024x618.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work-300x181.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work-768x464.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work-1536x927.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-work.png 1883w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 6)<\/figcaption><\/figure>\n\n\n\n<p>As mentioned above, I tried to keep the amount of the work the same for corresponding tasks in Task Block 1 and 2 (which can also be seen in the numeric values for the work), and consequently, the colors of corresponding tasks match.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack-1024x618.png\" alt=\"\" class=\"wp-image-617\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack-1024x618.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack-300x181.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack-768x464.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack-1536x927.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-slack.png 1883w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 6)<\/figcaption><\/figure>\n\n\n\n<p>The slack of corresponding tasks in Task Block 1 and 2 is the same as the numeric values how. And so are the colors.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality-1024x618.png\" alt=\"\" class=\"wp-image-618\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality-1024x618.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality-300x181.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality-768x464.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality-1536x927.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_6-criticality.png 1883w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 6)<\/figcaption><\/figure>\n\n\n\n<p>Despite the same slack of corresponding tasks in Task Block 1 and 2, the algorithm rates the criticality of the tasks in Task Block 2 higher as in Task Block 1. This is because the computation of &#8220;criticality&#8221; is based on the ratio of slack and duration. Out of two tasks with the same slack, the one with a longer duration is rated more critical as relative deviations in the duration have a higher probability to consume the free slack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example 7: A real-world example<\/h2>\n\n\n\n<p>Let us now look at a real-world example, a simplified project plan of a development project consisting of mechanical parts, PCBAs and software, including some intermediate milestones. As it is the case in reality, some tasks have only a partial allocation of resources, that means, that the numerical values for the <em>allocated work<\/em> are less than for the <em>allocated duration<\/em>. This will be reflected in different shadings of colors in the network graphs <em>task duration<\/em> and <em>task duration<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-1024x724.jpg\" alt=\"\" class=\"wp-image-661\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-1536x1087.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-2048x1449.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example of a Development Project (<strong>without<\/strong> completed tasks)<\/figcaption><\/figure>\n\n\n\n<p>The resulting graphs are:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-1024x192.png\" alt=\"\" class=\"wp-image-662\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-1024x192.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-768x144.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-1536x287.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-duration-2048x383.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 7)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-1024x192.png\" alt=\"\" class=\"wp-image-663\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-1024x192.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-768x144.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-1536x287.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-work-2048x383.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 7)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-1024x192.png\" alt=\"\" class=\"wp-image-664\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-1024x192.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-768x144.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-1536x287.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-slack-2048x383.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 7)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-1024x192.png\" alt=\"\" class=\"wp-image-665\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-1024x192.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-768x144.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-1536x287.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_7-criticality-2048x383.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 7)<\/figcaption><\/figure>\n\n\n\n<p>As mentioned above already, we can see the differences in the shading of the graphs according to <em>task duration<\/em> and <em>task work<\/em>, the reason being an allocation of resources different to 100%. However, in contrast to an initial expectation, the different shadings occur in large parts of the graph rather than only on a few tasks. This is because the shadings depend on the maximum and the minimum values of <em>task duration<\/em> or <em>task work<\/em>, and these values are unique to each type of graph. Well visible is also the critical path in dark red color in the network graph colored according to task criticality.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example 8: A real-world example with complete tasks<\/h2>\n\n\n\n<p>Once a project has been started, sooner or later, the first tasks will be completed, and in this example, we assume that we have run three weeks into the project (<span class=\"has-inline-color has-vivid-green-cyan-color\">green<\/span> vertical line), and all tasks have been executed according to schedule (this is an example from an ideal world \ud83d\ude00). Consequently, our plan looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-1024x724.jpg\" alt=\"\" class=\"wp-image-666\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-1024x724.jpg 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-300x212.jpg 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-768x543.jpg 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-1536x1087.jpg 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-2048x1449.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example of a Development Project (<strong>with<\/strong> completed tasks)<\/figcaption><\/figure>\n\n\n\n<p>Tasks that have been completed 100% are colored in green color across all network graphs indicating that these tasks do not require any more attention in the remaining project:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-1024x191.png\" alt=\"\" class=\"wp-image-667\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-1024x191.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-768x143.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-1536x286.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-duration-2048x382.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task duration (Example 8)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-1024x191.png\" alt=\"\" class=\"wp-image-668\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-1024x191.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-768x143.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-1536x286.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-work-2048x382.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task work (Example 8)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-1024x191.png\" alt=\"\" class=\"wp-image-669\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-1024x191.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-768x143.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-1536x286.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-slack-2048x382.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task slack (Example 8)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-1024x191.png\" alt=\"\" class=\"wp-image-670\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-1024x191.png 1024w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-300x56.png 300w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-768x143.png 768w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-1536x286.png 1536w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Example_8-criticality-2048x382.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Network Graph colored according to task criticality (Example 8)<\/figcaption><\/figure>\n\n\n\n<p>The color shadings of the incomplete tasks remain as they were in Example 7. This is because the script <strong>mysql2dot.sh<\/strong> determines the step size of the shadings (and thus the resulting shadings) of the individual tasks based on the maximum and minimum value of <em>task duration<\/em>, <em>task work<\/em>, <em>task slack<\/em>, or <em>task criticality<\/em> for the whole project, independent whether some tasks have been completed or not.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The scripts <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/create_project_db.sql\" target=\"_blank\">create_project_db.sql<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">msp2mysql.sh<\/a> and <a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">mysql2dot.sh<\/a> and the examples provided above show how, using the powerful <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> package, traditional project plans created with Microsoft<sup>\u00ae<\/sup> Project can be visualized in a set pf graphs that can help a project manager to focus on the right tasks. For the ease of understanding, the scripts run in <a rel=\"noreferrer noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Bash_(Shell)\" target=\"_blank\">bash<\/a> so that everyone can easily modify, enlarge, or change the scripts according to the own demands. Users who want to deploy the scripts on productive systems should take speed of execution and cybersecurity (or the lack of both in the provided example scripts) into account.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Outlook<\/h2>\n\n\n\n<p>The provided scripts can be enlarged in their scope or improved in numerous ways, and I encourage everyone to tailor them to your own needs. Some examples for improvement are:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Improve the parsing of Microsoft<sup>\u00ae<\/sup> Project XML files by:<ul><li>&#8230;using a real XML parser rather than bash commands<\/li><li>&#8230;enlarging the scope of the parser<\/li><\/ul><\/li><li>Create additional graphs.<\/li><li>Consider tasks that have been completed partially.<\/li><li>Experiment with different definitions of criticality.<\/li><li>Explore resource usage and how to display it graphically (load, usage, key resource, etc.).<\/li><li>Improve the function iso2msp () which so far is only a very simplistic implementation and is not yet able to process values like &#8220;days&#8221;, &#8220;weeks&#8221;, &#8220;months&#8221;.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>[<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\">1<\/a>] = <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\">Introduction to Project XML Data<\/a><\/li><li>[<a rel=\"noreferrer noopener\" href=\"https:\/\/www.digi.com\/resources\/documentation\/digidocs\/90001437-13\/reference\/r_iso_8601_duration_format.htm\" target=\"_blank\">2<\/a>] = <a rel=\"noreferrer noopener\" href=\"https:\/\/www.digi.com\/resources\/documentation\/digidocs\/90001437-13\/reference\/r_iso_8601_duration_format.htm\" target=\"_blank\">ISO 8601 duration format<\/a><\/li><li>[<a rel=\"noreferrer noopener\" href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html\" target=\"_blank\">3<\/a>] = <a rel=\"noreferrer noopener\" href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html\" target=\"_blank\">Graphviz Color Names<\/a><\/li><li>[<a href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html#brewer_license\" target=\"_blank\" rel=\"noreferrer noopener\">4<\/a>] = <a href=\"https:\/\/www.graphviz.org\/doc\/info\/colors.html#brewer_license\" target=\"_blank\" rel=\"noreferrer noopener\">ColorBrewer License<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Files<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/create_project_db.sql\" target=\"_blank\">create_project_db.sql<\/a> sets up a database in <a rel=\"noreferrer noopener\" href=\"https:\/\/www.mysql.com\/\" target=\"_blank\">MySQL<\/a> or <a rel=\"noreferrer noopener\" href=\"https:\/\/mariadb.com\/\" target=\"_blank\">MariaDB<\/a>. The script works with the user <em>gabriel<\/em> who assumes to have access to the database server without password; you might have to adapt the script to your environment and needs.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/msp2mysql.sh\" target=\"_blank\">msp2mysql.sh<\/a> reads a Microsoft\u00ae Project plan in XML, parses it and writes the data into the <a rel=\"noreferrer noopener\" href=\"https:\/\/mariadb.com\/\" target=\"_blank\">MariaDB<\/a> database.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/mysql2dot.sh\" target=\"_blank\">mysql2dot.sh<\/a> reads from the <a rel=\"noreferrer noopener\" href=\"https:\/\/mariadb.com\/\" target=\"_blank\">MariaDB<\/a> database and creates a script for <a rel=\"noreferrer noopener\" href=\"https:\/\/graphviz.org\/doc\/info\/lang.html\" target=\"_blank\">dot<\/a>, a tool of the <a rel=\"noreferrer noopener\" href=\"http:\/\/graphviz.org\/\" target=\"_blank\">graphviz<\/a> suite.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/PERT-Farbskalen.xlsx\" target=\"_blank\">PERT-Farbskalen.xlsx<\/a> is a work sheet where different approaches for color distributions are tested and where you can play around to find the &#8220;right&#8221; algorithm for yourself.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_1.zip\" target=\"_blank\">Example_1.zip<\/a> contains all files with respect to Example 1.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_2.zip\" target=\"_blank\">Example_2.zip<\/a> contains all files with respect to Example 2.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_3.zip\" target=\"_blank\">Example_3.zip<\/a> contains all files with respect to Example 3.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_4.zip\" target=\"_blank\">Example_4.zip<\/a> contains all files with respect to Example 4.<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_5.zip\" target=\"_blank\">Example_5.zip<\/a> contains all files with respect to Example 5.<\/li><li><a href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_6.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Example_6.zip<\/a> contains all files with respect to Example 6.<\/li><li><a href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_7.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Example_7.zip<\/a> contains all files with respect to Example 7.<\/li><li><a href=\"https:\/\/caipirinha.spdns.org\/~gabriel\/Blog\/Example_8.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Example_8.zip<\/a> contains all files with respect to Example 8.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Disclaimer<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>The program code and the examples are for demonstration purposes only.<\/li><li>The program shall not be used in production environments.<\/li><li>While the program code has been tested, it might still contain errors.<\/li><li>The program code has not been optimized for speed (It&#8217;s a bash script anyway, so do not expect miracles.).<\/li><li>The program code has not been written with cybersecurity aspects in mind.<\/li><li>Only a subset of all possibilities in [<a href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\" rel=\"noreferrer noopener\">1<\/a>] has been used, and the code does not claim to adhere completely to [<a href=\"https:\/\/docs.microsoft.com\/en-us\/office-project\/xml-data-interchange\/introduction-to-project-xml-data?view=project-client-2016\" target=\"_blank\" rel=\"noreferrer noopener\">1<\/a>].<\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This blog post offers a method to create colored network graphs (PERT charts) from project plans that are created with Microsoft\u00ae Project.  Color schemes similar to the ones used in physical maps visualize those tasks according to duration, work, free slack, or criticality.<\/p>\n","protected":false},"author":1,"featured_media":618,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,36],"tags":[94,93,95],"class_list":["post-565","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","category-pm","tag-graphviz","tag-ms-project","tag-pert"],"_links":{"self":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=565"}],"version-history":[{"count":24,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/565\/revisions"}],"predecessor-version":[{"id":727,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/565\/revisions\/727"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/media\/618"}],"wp:attachment":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}