{"id":1379,"date":"2014-01-16T19:48:47","date_gmt":"2014-01-16T17:48:47","guid":{"rendered":"http:\/\/blog.nebule.org\/?p=1379"},"modified":"2016-03-29T19:01:54","modified_gmt":"2016-03-29T17:01:54","slug":"resolution-dun-graphe-de-relations-de-mise-a-jour","status":"publish","type":"post","link":"http:\/\/blog.nebule.org\/?p=1379","title":{"rendered":"R\u00e9solution d&rsquo;un graphe de relations de mise \u00e0 jour"},"content":{"rendered":"<p style=\"text-align: justify;\">L&rsquo;utilisation des liens de mise \u00e0 jour d&rsquo;objets est utilis\u00e9 dans des cas biens sp\u00e9cifiques mais rev\u00eat une grande importance par exemple dans la mise \u00e0 jour de programmes. Cela a notamment des implications sur la s\u00e9curit\u00e9 des programmes g\u00e9r\u00e9s sous forme d&rsquo;objets.<\/p>\n<p style=\"text-align: justify;\">Les liens de mise \u00e0 jour n&rsquo;ont pas de contraintes et peuvent donc cr\u00e9er des graphes de liens entre objets de forme quelconque. Cependant, l&rsquo;usage de ces liens dans <em>nebule<\/em> n\u00e9cessite que pour un objet donn\u00e9 on obtienne un unique autre objet. Cet objet doit \u00eatre disponible puisque l&rsquo;on est dans le cas d&rsquo;un usage, c&rsquo;est \u00e0 dire de son utilisation imm\u00e9diate.<\/p>\n<p style=\"text-align: justify;\">La r\u00e9solution d&rsquo;un graphe de liens permet d&rsquo;obtenir l&rsquo;identifiant un objet d\u00e9riv\u00e9 unique et disponible pour un objet de d\u00e9part en tenant compte de la validit\u00e9 des liens. Cette r\u00e9solution est sp\u00e9cifique \u00e0 <em>nebule<\/em> et se fait sous forme arborescente en ne tenant compte de des liens <em>descendants<\/em> et non boucl\u00e9s.<\/p>\n<p style=\"text-align: justify;\"><strong>Table des mati\u00e8res :<\/strong><\/p>\n<ol>\n<li>Lien de mise \u00e0 jour<\/li>\n<li>Remplacement de lien de mise \u00e0 jour<\/li>\n<li>Mise \u00e0 jour arborescente<\/li>\n<li>Gestion des objets manquants<\/li>\n<li>R\u00e9solution des boucles<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Cette m\u00e9thode de r\u00e9solution va maintenant \u00eatre exp\u00e9riment\u00e9e grandeur nature dans <a title=\"Projet sylabe\" href=\"http:\/\/blog.sylabe.org\/\" target=\"_blank\">sylabe<\/a> pour la gestion des versions des programmes.<!--more--><\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1350\" alt=\"favicon\" src=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\" width=\"32\" height=\"32\" \/><\/a><\/p>\n<h2>1. Lien de mise \u00e0 jour<\/h2>\n<p style=\"text-align: justify;\">Le lien de type <code>u<\/code> permet de d\u00e9finir qu&rsquo;un objet a \u00e9t\u00e9 mis \u00e0 jour. C&rsquo;est \u00e0 dire qu&rsquo;un (nouvel) objet remplace un autre objet. Voir la documentation <a title=\"Action u - Mise \u00e0 jour d'objet\" href=\"http:\/\/wiki.nebule.org\/index.php\/Documentation_-_Nebule_v1.1#Action_u_-_Mise_.C3.A0_jour_d.27objet\" target=\"_blank\">nebule v1.1 lien u<\/a>.<\/p>\n<p style=\"text-align: justify;\">On ne prend en compte que les liens descendant, c&rsquo;est \u00e0 dire les liens qui ont en source l&rsquo;objet sur lequel on est positionn\u00e9 dans la recherche.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-112.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1399\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 1\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-112.png\" width=\"189\" height=\"227\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #003366;\">Prenons l&rsquo;exemple d&rsquo;un programme<strong><\/strong>. Il y a une version du programme reconnue comme \u00e9tant la derni\u00e8re en date, l&rsquo;objet <strong>A<\/strong>. Si on souhaite diffuser une nouvelle version, l&rsquo;objet <strong>B<\/strong>, on cr\u00e9e le lien de type <code>u<\/code> entre <strong>A<\/strong> et <strong>B<\/strong>. Ce lien <strong>u1<\/strong> est d\u00e9finit avec une date.<\/span><\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\"><img decoding=\"async\" loading=\"lazy\" alt=\"favicon\" src=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\" width=\"32\" height=\"32\" \/><\/a><\/p>\n<h2>2. Remplacement de lien de mise \u00e0 jour<\/h2>\n<p style=\"text-align: justify;\">Il n&rsquo;est pas interdit de d\u00e9finir un nouveau lien de mise \u00e0 jour vers un autre objet. Le mieux est de marquer comme supprim\u00e9 le pr\u00e9c\u00e9dent lien de mise \u00e0 jour. Mais cette suppression n&rsquo;est pas toujours possible ou souhaitable si les liens sont g\u00e9n\u00e9r\u00e9s (et sign\u00e9s) par des entit\u00e9s diff\u00e9rentes.<\/p>\n<p style=\"text-align: justify;\">Chaque lien a une validit\u00e9 propre avec sa signature et une validit\u00e9 sociale en fonction de la confiance que l&rsquo;on accorde \u00e0 l&rsquo;entit\u00e9 signataire. Certains liens peuvent donc ne pas \u00eatre reconnus comme valides socialement et donc ne pas \u00eatre pris en compte lors du parcours de l&rsquo;arborescence. La validation sociale sera trait\u00e9 ult\u00e9rieurement, elle indique un \u00e9tat social valide ou non et le cas \u00e9ch\u00e9ant un niveau de validit\u00e9 sociale.<\/p>\n<p style=\"text-align: justify;\">Si il y a plusieurs liens valides mais d&rsquo;entit\u00e9s diff\u00e9rentes, il doit toujours \u00eatre tenu compte du lien dont la validit\u00e9 sociale est la plus forte.<\/p>\n<p style=\"text-align: justify;\">Ensuite, si il y a plusieurs liens de mise \u00e0 jours valides et socialement \u00e9quivalents, il doit \u00eatre tenu compte du lien le plus r\u00e9cent.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-212.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1400\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 2\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-212.png\" width=\"265\" height=\"227\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #003366;\">Dans notre exemple du programme, la mise \u00e0 jour vers la version la plus r\u00e9cente, objet <strong>C<\/strong>, est assur\u00e9 par un lien de mise \u00e0 jour <strong>u2<\/strong> plus r\u00e9cent que le lien <strong>u1<\/strong>. Si ce lien <strong>u2<\/strong> avait \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9 par une entit\u00e9 peu fiable, il n&rsquo;aurait pas \u00e9t\u00e9 pris en compte.<\/span><\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\"><img decoding=\"async\" loading=\"lazy\" alt=\"favicon\" src=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\" width=\"32\" height=\"32\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\">3. Mise \u00e0 jour arborescente<\/h2>\n<p style=\"text-align: justify;\">Un objet peut \u00eatre mis \u00e0 jour vers un autre objet, lui-m\u00eame peut aussi \u00eatre mis \u00e0 jour vers encore un autre objet. C&rsquo;est un sch\u00e9ma de mise \u00e0 jour arborescent. Il faut \u00eatre capable de r\u00e9soudre cette arborescence pour un objet de d\u00e9part d\u00e9finit, c&rsquo;est \u00e0 dire de parcourir l&rsquo;arborescence de fa\u00e7on \u00e0 obtenir un seul objet. Le nombre de possibilit\u00e9s offertes par une arborescence doit donc \u00eatre r\u00e9duite par des r\u00e8gles de parcours de l&rsquo;arborescence.<\/p>\n<p style=\"text-align: justify;\">Localement dans l&rsquo;arborescence, la r\u00e9solution de la branche \u00e0 suivre ne tient compte que des liens imm\u00e9diats. Cela exclut donc tous les liens plus loin dans les branches quel qu&rsquo;en soit leur validit\u00e9 sociale, leur nombre ou leur date de cr\u00e9ation.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-312.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1401\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 3\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-312.png\" width=\"265\" height=\"454\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Le cas des objets absents est trait\u00e9 en bout de branche mais pas sur un embranchement. Cependant, une branche peut \u00eatre d\u00e9sactiv\u00e9e si la r\u00e9solution a \u00e9chou\u00e9e \u00e0 trouver un objet valide. Dans ce cas la r\u00e9solution de l&#8217;embranchement est refaite dans tenir compte de la (les) branche(s) d\u00e9sactiv\u00e9e(s). Si il ne reste aucune branche valide, le cas doit \u00eatre trait\u00e9 comme un bout de branche.<\/p>\n<p style=\"text-align: justify;\">Il est tol\u00e9r\u00e9 qu&rsquo;une branche court-circuite une autre branche. La r\u00e9solution locale du parcours des branches fera que les deux branches qui se rejoignent seront trait\u00e9es comme deux branches ind\u00e9pendantes.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-412.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1402\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 4\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-412.png\" width=\"265\" height=\"454\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #003366;\">Dans notre exemple du programme, cela peut-\u00eatre utile pour acc\u00e9l\u00e9rer la r\u00e9solution de l&rsquo;arborescence. La sortie d&rsquo;une nouvelle version majeur du programme, l&rsquo;objet <strong>D<\/strong>, peut \u00eatre li\u00e9 \u00e0 la pr\u00e9c\u00e9dente version majeur et court-circuiter toutes les versions interm\u00e9diaires.<\/span><\/p>\n<p style=\"text-align: justify;\">\u00c9videmment, la recherche peut avoir comme point de d\u00e9part un objet au milieu de l&rsquo;arborescence et non l&rsquo;objet le plus ancien. C&rsquo;est dans ce cas plus rapide et toutes modifications des liens avant l&rsquo;objet de d\u00e9part seront ignor\u00e9es.<\/p>\n<p style=\"text-align: justify;\">La r\u00e9solution de l&rsquo;arborescence s&rsquo;arr\u00eate quand on est arriv\u00e9 \u00e0 un bout de branche, c&rsquo;est \u00e0 dire quand il n&rsquo;y \u00e0 plus de branche descendante valide ou que les branches restantes de d\u00e9bouchent sur aucun objet pr\u00e9sent. Ce peut \u00eatre l&rsquo;objet de d\u00e9part, dans ce cas il n&rsquo;y \u00e0 pas de mise \u00e0 jour, m\u00eame si l&rsquo;objet n&rsquo;est pas pr\u00e9sent.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\"><img decoding=\"async\" loading=\"lazy\" alt=\"favicon\" src=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\" width=\"32\" height=\"32\" \/><\/a><\/p>\n<h2>4. Gestion des objets manquants<\/h2>\n<p style=\"text-align: justify;\">Lors du parcours de l&rsquo;arborescence, on peut arriver sur un bout de branche dont l&rsquo;objet n&rsquo;est pas disponible. Dans ce cas, on remonte d&rsquo;un niveau et on r\u00e9-analyse l&#8217;embranchement sans cet objet absent.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-512.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1403\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 5\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-512.png\" width=\"265\" height=\"454\" \/><\/a><\/p>\n<p>Il est possible que lors du parcours de l&rsquo;arborescence, plusieurs objets ne soient pas disponibles, on remontera autant que n\u00e9cessaire jusqu&rsquo;\u00e0 trouver un objet valide ou le point de d\u00e9part. Si un objet manque en cours de parcours, ce n&rsquo;est pas g\u00eanant si l&rsquo;objet en bout de branche est pr\u00e9sent. Les liens restent valides que les objets soient pr\u00e9sents ou non.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-612.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1404\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 6\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-612.png\" width=\"529\" height=\"454\" \/><\/a><\/p>\n<p>Il est possible dans certains cas de r\u00e9soudre l&rsquo;arborescence des mises \u00e0 jours sans v\u00e9rifier la pr\u00e9sence des objets. C&rsquo;est par exemple le cas si on veut obtenir la mise \u00e0 jour la plus r\u00e9cente d&rsquo;un objet. Cette r\u00e9solution donne l&rsquo;identifiant de l&rsquo;objet qui devra \u00eatre trouv\u00e9 par ailleurs (t\u00e9l\u00e9chargement). Cette recherche peut \u00eatre complexe \u00e0 mettre en place puisqu&rsquo;elle peut impliquer le t\u00e9l\u00e9chargement des liens des objets au fur et \u00e0 mesure que l&rsquo;on parcours et d\u00e9couvre l&rsquo;arborescence.<\/p>\n<p><span style=\"color: #003366;\">Dans notre exemple du programme, une recherche pr\u00e9alable a montr\u00e9 que la derni\u00e8re version, l&rsquo;objet <strong>E<\/strong>, n&rsquo;\u00e9tait pas pr\u00e9sent. Il a \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9 et est maintenant pleinement utilisable.<\/span><\/p>\n<p>Il existe un cas non trait\u00e9 ici et qui n\u00e9cessitera plus de recherches, c&rsquo;est lorsqu&rsquo;un objet n&rsquo;est pas pr\u00e9sent mais qu&rsquo;il existe en version prot\u00e9g\u00e9 (chiffr\u00e9). Suivant si l&rsquo;usage est public ou non, il en sera tenu compte ou pas.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\"><img decoding=\"async\" loading=\"lazy\" alt=\"favicon\" src=\"\/wp-content\/uploads\/nebule\/2013\/08\/favicon2.png\" width=\"32\" height=\"32\" \/><\/a><\/p>\n<h2>5. R\u00e9solution des boucles<\/h2>\n<p style=\"text-align: justify;\">On est partit avec une r\u00e9solution d&rsquo;un graphe en utilisant une m\u00e9thode de parcours d&rsquo;une arborescence. Mais il faut prendre en compte le cas hypoth\u00e9tique o\u00f9 il y a des retours dans les liens, des boucles. La r\u00e9solution doit pouvoir fonctionner quoi qu&rsquo;il arrive.<\/p>\n<p style=\"text-align: justify;\">Parcourir plus d&rsquo;une fois une boucle n&rsquo;a pas d&rsquo;int\u00e9r\u00eat puisque l&rsquo;analyse des embranchements se fera de la m\u00eame fa\u00e7on. Il est donc inutile de prendre en compte un embranchement d\u00e9j\u00e0 trait\u00e9, donc un objet d\u00e9j\u00e0 trait\u00e9. Il faut tenir \u00e0 jour une table des objets qui ont d\u00e9j\u00e0 \u00e9t\u00e9 trait\u00e9s lors du parcours de l&rsquo;arborescence pour ne plus en tenir compte. Les objets des branches invalid\u00e9es peuvent rester dans cette table, ils ne seront pris en compte m\u00eame si des liens court-circuitent les branches invalid\u00e9es.<\/p>\n<p style=\"text-align: center;\"><a href=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-72.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1405\" alt=\"20140116 nebule - d\u00e9riv\u00e9s arborescents - 7\" src=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-72.png\" width=\"340\" height=\"794\" srcset=\"\/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-72.png 340w, \/wp-content\/uploads\/nebule\/2014\/01\/20140116-nebule-d\u00e9riv\u00e9s-arborescents-72-257x600.png 257w\" sizes=\"(max-width: 340px) 100vw, 340px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #003366;\">Dans notre exemple du programme, un lien de mise \u00e0 jour <strong>u6<\/strong> vers une version ant\u00e9rieur, l&rsquo;objet <strong>A<\/strong>, n&rsquo;a pas de justification, il n&rsquo;est pas pris en compte parce que l&rsquo;objet <strong>A<\/strong> est d\u00e9j\u00e0 dans l&rsquo;arborescence trait\u00e9e. Si on veut annuler une mise \u00e0 jour, il faut marquer \u00e0 supprimer le lien de mise \u00e0 jour, ici les liens <strong>u1<\/strong>, <strong>u2<\/strong> et <strong>u5<\/strong>.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;utilisation des liens de mise \u00e0 jour d&rsquo;objets est utilis\u00e9 dans des cas biens sp\u00e9cifiques mais rev\u00eat une grande importance par exemple dans la mise \u00e0 jour de programmes. Cela a notamment des implications sur la s\u00e9curit\u00e9 des programmes g\u00e9r\u00e9s sous forme d&rsquo;objets. Les liens de mise \u00e0 jour n&rsquo;ont pas de contraintes et peuvent &hellip; <a href=\"http:\/\/blog.nebule.org\/?p=1379\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">R\u00e9solution d&rsquo;un graphe de relations de mise \u00e0 jour<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[89,117,99,104,110,112,24],"tags":[],"_links":{"self":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1379"}],"collection":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1379"}],"version-history":[{"count":1,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1379\/revisions"}],"predecessor-version":[{"id":2222,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1379\/revisions\/2222"}],"wp:attachment":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1379"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}