{"id":400,"date":"2014-07-06T12:00:05","date_gmt":"2014-07-06T10:00:05","guid":{"rendered":"http:\/\/darrigan.net\/blog\/?p=400"},"modified":"2020-04-30T12:50:53","modified_gmt":"2020-04-30T10:50:53","slug":"jeu-de-la-vie-programmer","status":"publish","type":"post","link":"https:\/\/darrigan.net\/blog\/jeu-de-la-vie-programmer\/","title":{"rendered":"Jeu de la vie : un bel exemple pour apprendre \u00e0 programmer"},"content":{"rendered":"<p><em>En 2001-2002, alors que je n&rsquo;\u00e9tais pas encore titulaire, j&rsquo;avais \u00e0 encadrer des travaux pratiques d&rsquo;informatique en 2e ann\u00e9e de Licence de chimie \u00e0 l&rsquo;universit\u00e9. Ceux-ci devaient \u00eatre r\u00e9alis\u00e9s en\u00a0Visual Basic (un choix ind\u00e9pendant de ma volont\u00e9). Afin d&rsquo;entra\u00eener les \u00e9tudiants \u00e0 manipuler des variables, des tableaux, des boucles et des structures d\u00e9cisionnelles, je leur avais propos\u00e9 de programmer un \u00ab\u00a0Jeu de la vie\u00a0\u00bb. L&rsquo;int\u00e9r\u00eat est, qu&rsquo;en plus, ils pouvaient dessiner une interface graphique agr\u00e9able (boutons, menus d\u00e9roulants, courbes, image\u2026) et <strong>r\u00e9ellement s&rsquo;amuser<\/strong> avec leur jeu de la vie, une fois au point.<\/em> <em>Comme je trouve dommage que mon travail soit rest\u00e9 dans un carton, je donne ci-apr\u00e8s le document que j&rsquo;avais r\u00e9dig\u00e9 et les directives pour ce projet informatique.<\/em><!--more--><\/p>\n<hr \/>\n<h1 style=\"text-align: center;\">Projet informatique en Visual Basic : Jeu de la vie<\/h1>\n<p style=\"text-align: center;\"><em>Propos\u00e9 par C. Darrigan<\/em><\/p>\n<h2>Introduction<\/h2>\n<p>Invent\u00e9 par le math\u00e9maticien John Horton Conway au d\u00e9but des ann\u00e9es 1970, le \u00ab\u00a0jeu de la vie\u00a0\u00bb (<em>Game Life<\/em> ou <em>Life<\/em> en anglais) se pr\u00e9sente sous la forme d&rsquo;un quadrillage, plus ou moins grand, dont l&rsquo;\u00e9tat de chaque case (noir ou blanc) \u00e0 un instant <em>n<\/em> est d\u00e9termin\u00e9 par <strong>des r\u00e8gles de base tr\u00e8s simples<\/strong> et par l&rsquo;\u00e9tat des cases qui l&rsquo;entourent, \u00e0 l&rsquo;instant <em>n <\/em>&#8211; 1. Le \u00ab\u00a0jeu de la vie\u00a0\u00bb fait partie de la famille plus g\u00e9n\u00e9rale des <strong><em>automates cellulaire<\/em>s<\/strong>, eux-m\u00eames entrant dans la cat\u00e9gorie des simulations de type <strong>Monte Carlo<\/strong> (en r\u00e9f\u00e9rence \u00e0 la ville c\u00e9l\u00e8bre pour ses jeux de hasard) dans lesquelles l&rsquo;\u00e9volution d&rsquo;un syst\u00e8me (plus complexe que de simples cases noires ou blanches) d\u00e9pend de quelques r\u00e8gles simples d&rsquo;\u00e9volution ou d&rsquo;interactions. De <strong>tr\u00e8s nombreux domaines scientifiques<\/strong> utilisent ce type de mod\u00e9lisation en raison de la <strong>grande facilit\u00e9 de r\u00e9alisation<\/strong> <strong>informatique<\/strong> (programmation) et de l&rsquo;impressionnante concordance des simulations avec les observations exp\u00e9rimentales. On citera quelques domaines et applications :<\/p>\n<ul>\n<li>Physique : simulation d&rsquo;\u00e9coulements, transfert de chaleur, r\u00e9sistance des mat\u00e9riaux, m\u00e9t\u00e9orologie\u2026<\/li>\n<li>Chimie : optimisation g\u00e9om\u00e9trique de mol\u00e9cules complexes, m\u00e9canique mol\u00e9culaire, dynamique mol\u00e9culaire, diffusion de mol\u00e9cules dans des solides poreux, simulation de polym\u00e8res, transitions de phase\u2026<\/li>\n<li>Biologie : mod\u00e9lisation de grosses mol\u00e9cules (ADN, prot\u00e9ines, etc), de leur configuration spatiale, de leurs interactions, simulation de comportements collectifs (fourmis, bact\u00e9ries, etc)\u2026<\/li>\n<li>Informatique : r\u00e9seaux de neurones, automates cellulaires, vie et intelligence artificielles\u2026<\/li>\n<li>Math\u00e9matiques : logique, ind\u00e9cidabilit\u00e9, ph\u00e9nom\u00e8nes chaotiques\u2026<\/li>\n<\/ul>\n<h2>Vocabulaire et quelques propri\u00e9t\u00e9s<\/h2>\n<ul>\n<li>On appellera <strong>monde<\/strong> ou <strong>quadrillage<\/strong> ou <strong>tableau<\/strong> l&rsquo;espace dans lequel le jeu se d\u00e9roule. Il s&rsquo;agit en g\u00e9n\u00e9ral d&rsquo;un espace born\u00e9.<\/li>\n<li>On appelle <strong>cellule<\/strong> ou <strong>case<\/strong> ou <strong>pixel<\/strong> l&rsquo;unit\u00e9 de base du quadrillage, pouvant prendre deux valeurs : 0 ou 1.<\/li>\n<li>On d\u00e9finit la <strong>population<\/strong> comme le nombre de cases de valeur 1.<\/li>\n<li>Un syst\u00e8me est <strong>divergent<\/strong> s&rsquo;il conduit \u00e0 un monde totalement remplis de 0 ou de 1.<\/li>\n<li>Un syst\u00e8me est <strong>convergent<\/strong> si sa population tend vers ou fluctue autour d&rsquo;une valeur.<\/li>\n<li>Un syst\u00e8me est <strong>cyclique d&rsquo;ordre <\/strong><em>m<\/em> si sa population totale fluctue r\u00e9guli\u00e8rement, avec une p\u00e9riode de <em>m<\/em> it\u00e9rations.<\/li>\n<li>Certains syst\u00e8mes sont <strong>pseudo-cycliques<\/strong> avec soit une convergence, soit une divergence au bout d&rsquo;un temps long.<\/li>\n<li>Un appelle <strong>motif<\/strong> un groupe de cases (l&rsquo;exemple ci-dessous montre l&rsquo;\u00e9volution d&rsquo;un motif)<\/li>\n<li>Certains motifs peuvent se d\u00e9placer d&rsquo;eux-m\u00eame dans le monde en gardant la m\u00eame structure, on les appelle des <strong>planeurs<\/strong>.<\/li>\n<li>Certains motifs augmentent en taille ind\u00e9finiment, on les appelle des <strong>remplisseurs<\/strong>.<\/li>\n<li>Les remplisseurs qui ont la propri\u00e9t\u00e9 de \u00ab\u00a0manger\u00a0\u00bb les autres motifs sont appel\u00e9s <strong>d\u00e9mons<\/strong>.<\/li>\n<li>Une configuration est appel\u00e9 <strong>Jardin d&rsquo;Eden<\/strong> si elle n&rsquo;est le r\u00e9sultat d&rsquo;aucune configuration par les r\u00e8gles \u00e9tablies.<\/li>\n<li>On appellera <strong>soupe<\/strong> un monde g\u00e9n\u00e9r\u00e9 al\u00e9atoirement.<\/li>\n<li>Le comportement \u00e0 long terme d&rsquo;un jeu de la vie est <strong>ind\u00e9cidable<\/strong> : cela signifie qu&rsquo;aucune d\u00e9monstration ni aucun algorithme ne permet de pr\u00e9dire le devenir d&rsquo;un syst\u00e8me \u00e0 long terme.<\/li>\n<li>Le jeu de la vie est <strong>d\u00e9terministe<\/strong> : cela signifie que les m\u00eames conditions initiales conduisent aux m\u00eames configurations quelle que soit l&rsquo;it\u00e9ration.<\/li>\n<li>Lorsqu&rsquo;il est g\u00e9n\u00e9r\u00e9 \u00e0 partir d&rsquo;une soupe, il est souvent <strong>chaotique<\/strong> : aucune r\u00e9gularit\u00e9 n&rsquo;appara\u00eet au cours des it\u00e9rations. Une l\u00e9g\u00e8re modification des conditions initiales peut conduire \u00e0 un r\u00e9sultat totalement diff\u00e9rent.<\/li>\n<li>Un syst\u00e8me est <strong>irr\u00e9versible<\/strong> si, \u00e9tant donn\u00e9 une configuration, il est impossible de d\u00e9terminer la configuration de l&rsquo;it\u00e9ration pr\u00e9c\u00e9dente de mani\u00e8re unique. Le jeu de la vie poss\u00e8de g\u00e9n\u00e9ralement cette propri\u00e9t\u00e9.<\/li>\n<\/ul>\n<h2>Exemples<\/h2>\n<p>Si nous prenons comme r\u00e8gle de base qu&rsquo;<strong><em>une cellule ne peut survivre que lorsqu&rsquo;elle est entour\u00e9e de 2 ou 3 cellules<\/em><\/strong>, voici les 9 premi\u00e8res it\u00e9rations d&rsquo;\u00e9volution d&rsquo;un motif primitif :<\/p>\n<div id=\"attachment_402\" style=\"width: 535px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/darrigan.net\/blog\/wp-content\/uploads\/2014\/07\/jdlv-1.gif\"><img aria-describedby=\"caption-attachment-402\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-402\" src=\"https:\/\/darrigan.net\/blog\/wp-content\/uploads\/2014\/07\/jdlv-1.gif\" alt=\"Evolution d'un motif primitif sur 9 it\u00e9rations.\" width=\"525\" height=\"71\" \/><\/a><p id=\"caption-attachment-402\" class=\"wp-caption-text\">Evolution d&rsquo;un motif primitif sur 9 it\u00e9rations<\/p><\/div>\n<p>On peut remarquer qu&rsquo;apr\u00e8s un temps de croissance, le syst\u00e8me devient cyclique d&rsquo;ordre 2 \u00e0 partir de l&rsquo;it\u00e9ration 6. Il est donc convergent. On remarque aussi que le motif ne semble pas se d\u00e9placer dans une direction particuli\u00e8re au fil des it\u00e9rations. Voici quelques it\u00e9rations d&rsquo;un syst\u00e8me stable de dimension 30&#215;30 \u00e0 partir d&rsquo;une soupe. Le syst\u00e8me converge rapidement, la population fluctue autour d&rsquo;une valeur.<\/p>\n<div id=\"attachment_403\" style=\"width: 590px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-403\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-403 size-full\" src=\"https:\/\/darrigan.net\/blog\/wp-content\/uploads\/2014\/07\/jdlv-2.gif\" alt=\"Evolution d'une soupe apr\u00e8s 10, 20 et 50 it\u00e9rations.\" width=\"580\" height=\"121\" \/><p id=\"caption-attachment-403\" class=\"wp-caption-text\">Evolution d&rsquo;une soupe apr\u00e8s 10, 20 et 50 it\u00e9rations.<\/p><\/div>\n<p><span style=\"line-height: 1.714285714; font-size: 1rem;\">La\u00a0figure ci-apr\u00e8s appara\u00eetra-t-elle un jour, ou non ?\u2026 si elle appara\u00eet, il ne faut surtout pas l&rsquo;interpr\u00e9ter comme un signe paranormal !<\/span><\/p>\n<div id=\"attachment_405\" style=\"width: 114px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-405\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-405 size-full\" src=\"https:\/\/darrigan.net\/blog\/wp-content\/uploads\/2014\/07\/jdlv-3.gif\" alt=\"Jardin d'Eden ?\" width=\"104\" height=\"125\" \/><p id=\"caption-attachment-405\" class=\"wp-caption-text\">Jardin d&rsquo;Eden ?<\/p><\/div>\n<h2><span style=\"font-size: 1.285714286rem; line-height: 1.6;\">Votre projet<\/span><\/h2>\n<p>Ce genre de jeu de la vie est tr\u00e8s int\u00e9ressant \u00e0 programmer car il fait appel aux principales structures de bases\u00a0: boucles imbriqu\u00e9es, tests conditionnels, manipulation de tableaux, affichage sous forme graphique\u2026 La r\u00e9alisation du projet, si elle est men\u00e9e jusqu&rsquo;au bout (et sans \u00ab\u00a0recopiage\u00a0\u00bb de la part des \u00e9tudiants !), est une preuve de la bonne compr\u00e9hension de l&rsquo;outil informatique. Elle fait aussi appel au grand potentiel <strong>cr\u00e9atif<\/strong> de l&rsquo;\u00e9tudiant, tant au niveau de l&rsquo;algorithme (car il n&rsquo;y a pas qu&rsquo;<em>une seule <\/em>m\u00e9thode possible pour fabriquer ce jeu), qu&rsquo;au niveau de la programmation et de la pr\u00e9sentation graphique du logiciel. Le Visual Basic est un outil bien adapt\u00e9 \u00e0 la r\u00e9alisation d&rsquo;applications tr\u00e8s soign\u00e9es.<\/p>\n<p>Votre projet consiste donc \u00e0 simuler l&rsquo;\u00e9volution d&rsquo;une population de bact\u00e9ries, en laissant \u00e0 l&rsquo;utilisateur la possibilit\u00e9 de choisir lui-m\u00eame :<\/p>\n<ul>\n<li>La dimension du monde dans lequel va se d\u00e9rouler le jeu<\/li>\n<li>La densit\u00e9 des bact\u00e9ries \u00e0 l&rsquo;\u00e9tat initial<\/li>\n<li>Les r\u00e8gles de vie et de mort<\/li>\n<li>Le passage \u00e0 l&rsquo;it\u00e9ration suivante<\/li>\n<\/ul>\n<p>Le monde sera mod\u00e9lis\u00e9 par un tableau rectangulaire de dimensions <span class=\"lang:default decode:true crayon-inline\">dimi<\/span>\u00a0sur <span class=\"lang:default decode:true crayon-inline\">dimj<\/span>, dans lequel les cases auront soit la valeur 0 (cellule vide, pas de bact\u00e9rie) soit la valeur 1 (cellule occup\u00e9e par une bact\u00e9rie). La valeur d&rsquo;une case devra changer au fil des it\u00e9rations en fonction de l&rsquo;\u00e9tat de ses premi\u00e8res voisines et des r\u00e8gles de vie et de mort. Ce travail peut donc se d\u00e9couper en deux parties distinctes :<\/p>\n<ol>\n<li><strong>G\u00e9n\u00e9ration de la soupe primitive<\/strong><\/li>\n<\/ol>\n<p>Il s&rsquo;agit de cr\u00e9er le monde de l&rsquo;instant initial <em>n <\/em>= 0, en y r\u00e9partissant de mani\u00e8re al\u00e9atoire les bact\u00e9ries. L&rsquo;utilisateur devra pouvoir choisir la densit\u00e9 initiale en bact\u00e9ries, comprise entre 0% pour un monde sans bact\u00e9rie (toutes les cases \u00e0 0) et 100% pour un monde totalement peupl\u00e9 (toutes les cases \u00e0 1).<\/p>\n<ol start=\"2\">\n<li><strong>\u00c9volution du monde<\/strong><\/li>\n<\/ol>\n<p>Le monde devra \u00e9voluer en fonction des r\u00e8gles de vie et de mort choisies par l&rsquo;utilisateur en cliquant sur un bouton. Les r\u00e8gles peuvent \u00eatre r\u00e9sum\u00e9es comme suit :<\/p>\n<ul>\n<li>R\u00e8gle de vie : une case vide entour\u00e9e d&rsquo;au moins V bact\u00e9ries contiendra une bact\u00e9rie \u00e0 l&rsquo;it\u00e9ration suivante<\/li>\n<li>R\u00e8gle de mort : une bact\u00e9rie entour\u00e9e d&rsquo;au moins M bact\u00e9ries mourra d&rsquo;\u00e9touffement \u00e0 l&rsquo;it\u00e9ration suivante (avec M &gt; V)<\/li>\n<li>Dans les autres cas, la case reste inchang\u00e9e, qu&rsquo;elle soit occup\u00e9e ou non.<\/li>\n<\/ul>\n<p>(On prendra par exemple V=2 et M=4.) Une \u00e9tape ind\u00e9pendante, pouvant faire l&rsquo;objet d&rsquo;une <em>subroutine<\/em>, consistera \u00e0 donner une image graphique (cases noires et blanches) du tableau dans un\u00a0objet <span class=\"lang:vb decode:true crayon-inline\">PictureBox<\/span>. Un tel jeu est tr\u00e8s amusant \u00e0 essayer tant les observations que l&rsquo;on peut en tirer sont nombreuses et captivantes. Il permet de montrer que <strong>des r\u00e8gles de base tr\u00e8s simples peuvent suffire \u00e0 engendrer des ph\u00e9nom\u00e8nes tr\u00e8s riches et diversifi\u00e9s<\/strong> de la vie, sans pr\u00e9tendre d\u00e9crire <em>tout<\/em> de la vie, bien s\u00fbr ! Nous esp\u00e9rons que vous \u00ab\u00a0accrocherez\u00a0\u00bb \u00e0 ce projet et que vous y prendrez go\u00fbt autant que nous avons pris plaisir \u00e0 vous le pr\u00e9parer !<\/p>\n<h2>Am\u00e9liorations possibles\u2026<\/h2>\n<p>Une fois le jeu de la vie programm\u00e9, vous pouvez am\u00e9liorer et \u00e9toffer votre projet \u00e0 l&rsquo;aide des options ci-dessous (class\u00e9es par ordre de difficult\u00e9 croissante) :<\/p>\n<ul>\n<li>Afficher la population \u00e0 chaque it\u00e9ration (cette option est tr\u00e8s utile).<\/li>\n<li>Tracer une courbe de population en fonction des it\u00e9rations (cette option est tr\u00e8s pratique pour visualiser la stabilit\u00e9 d&rsquo;un monde, ses divergences, son caract\u00e8re cyclique).<\/li>\n<li>Possibilit\u00e9 de sauvegarder une image du monde sur fichier et de pouvoir la relire plus tard.<\/li>\n<li>Possibilit\u00e9 d&rsquo;ajouter ou de supprimer <em>manuellement<\/em> des bact\u00e9ries en cliquant dans l&rsquo;image.<\/li>\n<li>Mod\u00e9liser un espace <em>torique<\/em>, dans lequel le tableau est boucl\u00e9 en faisant correspondre le haut avec le bas et la gauche avec la droite (pour les plus dou\u00e9s d&rsquo;entre vous !).<\/li>\n<\/ul>\n<p>Ou, selon votre inspiration, tout un tas d&rsquo;autres options que vous souhaiterez <strong>utiles<\/strong> \u00e0 la compr\u00e9hension ou la manipulation du jeu.<\/p>\n<h2>\u00c9valuation de votre projet<\/h2>\n<p>Vous serez not\u00e9s essentiellement sur votre capacit\u00e9 \u00e0 transformer un probl\u00e8me donn\u00e9 en un algorithme informatique. Si vous n&rsquo;arrivez pas \u00e0 terminer votre programme, ce n&rsquo;est pas grave. Par contre, essayez de faire un code propre et lisible (indentation, noms de variables explicites), contenant si possible quelques commentaires. Attachez une certaine part d&rsquo;importance \u00e0 l&rsquo;aspect graphique de votre application (dimensions et dispositions des boutons, des cases \u00e0 remplir, couleurs). Pour les meilleurs, les am\u00e9liorations ci-dessus seront bienvenues !<\/p>\n<h2>Petite aide\u2026<\/h2>\n<p>Vous pouvez obtenir de l&rsquo;aide \u00e0 partir du menu d\u00e9roulant \u00ab\u00a0?\u00a0\u00bb de Visual Basic. Voici quelques fonctions dont vous aurez peut-\u00eatre besoin :<\/p>\n<ul>\n<li>Instruction <span class=\"lang:vb decode:true crayon-inline\">Randomize<\/span>\u00a0: elle permet d&rsquo;initialiser le g\u00e9n\u00e9rateur de nombre al\u00e9atoire du programme, en l&rsquo;ins\u00e9rant en t\u00eate de votre code.<\/li>\n<li>Fonction <span class=\"lang:vb decode:true crayon-inline\">Rnd()<\/span>\u00a0: elle retourne un nombre al\u00e9atoire compris entre 0 (inclus) et 1 (exclus).<\/li>\n<li>Structure <span class=\"lang:vb decode:true crayon-inline\">Select case<\/span>\u00a0: permet de r\u00e9aliser diff\u00e9rentes alternatives en fonction d&rsquo;une variable. Dans certains cas, elle peut \u00eatre plus facile \u00e0 utiliser qu&rsquo;une structure <span class=\"lang:vb decode:true crayon-inline\">If then else<\/span>.<\/li>\n<li>Tableau \u00e0 2 dimensions : vous en aurez besoin pour d\u00e9crire le monde.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Exemple : <span class=\"lang:vb decode:true crayon-inline\">M(3,2)=1<\/span>\u00a0donne la valeur 1 \u00e0 la case rep\u00e9r\u00e9e par la ligne 3 et la colonne 2<\/p>\n<div id=\"attachment_404\" style=\"width: 301px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-404\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-404 size-full\" src=\"https:\/\/darrigan.net\/blog\/wp-content\/uploads\/2014\/07\/jdlv-4.gif\" alt=\"Tableau \u00e0 2 dimensions.\" width=\"291\" height=\"143\" \/><p id=\"caption-attachment-404\" class=\"wp-caption-text\">Tableau \u00e0 2 dimensions.<\/p><\/div>\n<p>Ne pas confondre les <em>indices<\/em> avec la <em>valeur<\/em> contenue dans une case. Pour passer en revue chacune des cases, on utilisera une boucle <span class=\"lang:vb decode:true crayon-inline\">FOR NEXT<\/span>\u00a0sur les colonnes \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une boucle <span class=\"lang:vb decode:true crayon-inline \">FOR NEXT<\/span>\u00a0sur les lignes.<\/p>\n<hr \/>\n<p><em>Pour ceux qui veulent juste s&rsquo;amuser avec un jeu de la vie, et non pas le programmer, voir <a href=\"https:\/\/www.dcode.fr\/jeu-de-la-vie\" target=\"_blank\" rel=\"noopener noreferrer\">ce bon site<\/a>.<\/em><\/p>\n<p><em>Voir aussi :\u00a0<a href=\"https:\/\/darrigan.net\/blog\/le-hasard-a-besoin-de-temps-pour-creer-de-belles-choses\/\">Le hasard a besoin de temps pour cr\u00e9er de belles choses<\/a><\/em><\/p>\n<p style=\"text-align: left;\"><em>Voir aussi la page Wikip\u00e9dia :\u00a0<a title=\"Jeu de la vie\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Jeu_de_la_vie\" target=\"_blank\" rel=\"noopener noreferrer\">Jeu de la vie<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En 2001-2002, alors que je n&rsquo;\u00e9tais pas encore titulaire, j&rsquo;avais \u00e0 encadrer des travaux pratiques d&rsquo;informatique en 2e ann\u00e9e de Licence de chimie \u00e0 l&rsquo;universit\u00e9. Ceux-ci devaient \u00eatre r\u00e9alis\u00e9s en\u00a0Visual Basic (un choix ind\u00e9pendant de ma volont\u00e9). Afin d&rsquo;entra\u00eener les \u00e9tudiants \u00e0 manipuler des variables, des tableaux, des boucles et des structures d\u00e9cisionnelles, je leur [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[39,7],"tags":[37,38,36,71],"_links":{"self":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/400"}],"collection":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/comments?post=400"}],"version-history":[{"count":15,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/400\/revisions"}],"predecessor-version":[{"id":802,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/400\/revisions\/802"}],"wp:attachment":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/media?parent=400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/categories?post=400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/tags?post=400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}