{"id":1544,"date":"2022-10-18T11:52:00","date_gmt":"2022-10-18T09:52:00","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1544"},"modified":"2022-10-18T11:59:36","modified_gmt":"2022-10-18T09:59:36","slug":"java-le-projet-valhalla","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-le-projet-valhalla\/","title":{"rendered":"Java: le projet Valhalla"},"content":{"rendered":"<p>Cet article a \u00e9t\u00e9 publi\u00e9 initialement dans le magazine <a href=\"https:\/\/www.programmez.com\/magazine\/article\/java-le-projet-valhalla\">Programmez! #253<\/a>.<\/p>\n<h2>Qu\u2019est-ce que le projet Valhalla ?<\/h2>\n<p>Le projet Valhalla est un projet d\u2019OpenJDK d\u00e9marr\u00e9 en 2014 dont le but est d\u2019apporter \u00e0 la JVM une mani\u00e8re plus flexible et performante de d\u00e9finir des types aplatis pour exprimer des donn\u00e9es pures (flattened data types).<\/p>\n<p>Le but est d\u2019aligner le fonctionnement de la JVM avec les caract\u00e9ristiques des hardware modernes.<\/p>\n<p>Pour cela, il d\u00e9finit de nouveaux types Java qui permettent de <em>\u00ab\u00a0coder comme une classe mais fonctionner comme un int\u00a0\u00bb<\/em>.<\/p>\n<h2>Probl\u00e9matique<\/h2>\n<p>Le syst\u00e8me de type de la JVM comprend huit types primitifs (int, long, etc.), des objets (agr\u00e9gats h\u00e9t\u00e9rog\u00e8nes avec identit\u00e9) et des tableaux (agr\u00e9gats homog\u00e8nes avec identit\u00e9).<\/p>\n<p>Des donn\u00e9es qui ne peuvent pas \u00eatre cod\u00e9es via un type primitif (par exemple un point avec coordonn\u00e9es x et y), seront cod\u00e9es via un objet.\nHors les objets sont stock\u00e9s dans la heap, ont un header, et doivent \u00eatre r\u00e9f\u00e9renc\u00e9s via une indirection en m\u00e9moire.<\/p>\n<p>Prenons l\u2019exemple d\u2019un tableau de Point, nous aurons l\u2019agencement suivant en m\u00e9moire :<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-01.png?resize=628%2C296&#038;ssl=1\" alt=\"\" width=\"628\" height=\"296\" class=\"alignnone size-large wp-image-1546\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-01.png?w=628&amp;ssl=1 628w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-01.png?resize=300%2C141&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-01.png?resize=573%2C270&amp;ssl=1 573w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/>\n<p>Pour parcourir un tableau de 3 points nous devrons lire 4 headers d\u2019objet et r\u00e9aliser 3 indirections en m\u00e9moire. Les indirections en m\u00e9moire impliquent que la donn\u00e9e n\u2019est pas forc\u00e9ment localis\u00e9e au m\u00eame endroit. Les architectures m\u00e9moire modernes \u00e9tant optimis\u00e9es via leurs nombreux caches pour de la lecture co-localis\u00e9e, la performance de lecture peut s\u2019en trouver grandement impact\u00e9e.<\/p>\n<p>Le but du projet Valhalla est de pouvoir avoir un agencement en m\u00e9moire compact et sans indirection pour un tableau de point, comme on en a pour un tableau d\u2019int. C\u2019est un agencement aplati (flattened) et dense car sans header autre que celui du tableau.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-02.png?resize=137%2C330&#038;ssl=1\" alt=\"\" width=\"137\" height=\"330\" class=\"alignnone size-full wp-image-1547\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-02.png?w=137&amp;ssl=1 137w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-02.png?resize=125%2C300&amp;ssl=1 125w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/valhalla-02.png?resize=112%2C270&amp;ssl=1 112w\" sizes=\"auto, (max-width: 137px) 100vw, 137px\" \/>\n<p>Pour r\u00e9aliser cela, le projet Valhalla va proposer deux nouveaux types qui sont Value Class et Primitive Class. Et comme corollaire l\u2019unification des g\u00e9n\u00e9riques entre primitifs et classes.<\/p>\n<h2>Value Class<\/h2>\n<p>Une Value Class est un nouveau type de classe qui est immuable (tous ses champs sont final), final, et n\u2019a pas d\u2019identit\u00e9.<\/p>\n<p>Un objet qui n\u2019a pas d&rsquo;identit\u00e9 ne peut \u00eatre utilis\u00e9 comme moniteur pour la synchronisation. La JVM (et le JIT) pourra donc instancier ces objets sans header, et les allouer en ligne (inline) si possible, pour \u00e9viter les indirections en m\u00e9moire.<\/p>\n<p>Une instance de Value Class peut \u00eatre nulle.\nComparer des instances de Value Class avec == compare la valeur de leurs champs.<\/p>\n<p>Exemple de d\u00e9finition d\u2019une Value Class :<\/p>\n<pre>\npublic value class Point {\n    int x;\n    int y;\n    public Point(int x, int y) {\n        this.x = x;\n        this.y = y;\n    }\n}\n<\/pre>\n<p>Un record pourra aussi \u00eatre une Value Class.<\/p>\n<p>Une Value Class \u00e9tend <code>java.lang.ValueObject<\/code> qui lui-m\u00eame \u00e9tend <code>java.lang.Object<\/code>, les classes ayant une identit\u00e9 (donc celle sans le modifier value) \u00e9tendront elles <code>java.lang.IdentityObject<\/code> qui lui-m\u00eame \u00e9tend <code>java.lang.Object<\/code>.<\/p>\n<p>Plus d\u2019information dans la draft JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/8277163\" rel=\"noopener\" target=\"_blank\"><a href=\"https:\/\/openjdk.java.net\/jeps\/8277163\">https:\/\/openjdk.java.net\/jeps\/8277163<\/a><\/a>.<\/p>\n<h2>Primitive Class<\/h2>\n<p>Une Primitive Class est un type de Value Class qui permet la d\u00e9finition de nouveaux types primitifs.<\/p>\n<p>Comme une Value Class, elle est immuable (tous ses champs sont final), final, et n\u2019a pas d\u2019identit\u00e9. Restriction suppl\u00e9mentaire, il ne peut avoir de champs d\u2019un type qui d\u00e9pend de lui-m\u00eame (donc d\u2019un type de sa hi\u00e9rarchie).<\/p>\n<p>Cette restriction permet pour les Primitive Class d\u2019\u00eatre repr\u00e9sent\u00e9es en m\u00e9moire en ligne (inline) sans indirection car leur forme (layout) est fixe, sans cycle.<\/p>\n<p>Une instance d\u2019une Primitive Class, comme une instance d\u2019un type primitif, ne peut \u00eatre nulle. Ce qui veut dire qu\u2019elle a une valeur initiale, qui est une instance sp\u00e9ciale dont tous les champs ont comme valeur leur d\u00e9faut : nulle pour les r\u00e9f\u00e9rences ou la valeur par d\u00e9faut de chaque type primitif (0 ou false).<\/p>\n<p>Comparer des instances de Primitive Class avec == compare la valeur de leurs champs.<\/p>\n<p>Exemple de d\u00e9finition d\u2019une Primitive Class :<\/p>\n<pre>\npublic primitive class Point {\n    int x;\n    int y;\n    public Point(int x, int y) {\n        this.x = x;\n        this.y = y;\n    }\n}\n<\/pre>\n<p>Les Primitive Class sont monomorphiques, elles appartiennent \u00e0 un unique type \u00e0 la compilation et au runtime. Mais comme elles peuvent participer \u00e0 un polymorphisme via une interface, il est parfois n\u00e9cessaire de manipuler une r\u00e9f\u00e9rence de ces primitifs.<\/p>\n<p>Chaque Primitive Class a donc une Reference Class associ\u00e9e (qui est une Value Class) qui peut \u00eatre utilis\u00e9e via <code>Point.ref<\/code> dans notre exemple. Lors de l\u2019utilisation de cette Reference Class, l\u2019instance peut \u00eatre nulle. Cette Reference Class permet aussi d\u2019utiliser des Primitive Class dans du code qui n\u2019a pas \u00e9t\u00e9 pr\u00e9vu pour les supporter. Par exemple, si vous appelez une m\u00e9thode qui s\u2019attend \u00e0 avoir en param\u00e8tre une classe ayant une r\u00e9f\u00e9rence, vous pourrez quand m\u00eame utiliser votre Primitive Class et sa r\u00e9f\u00e9rence sera automatiquement utilis\u00e9e. On voit ici l\u2019approche compatibilit\u00e9 amont de Java.<\/p>\n<p>La <a href=\"https:\/\/openjdk.java.net\/jeps\/402\" rel=\"noopener\" target=\"_blank\">JEP 402<\/a> propose de transformer les wrappers existants des types primitifs (Integer, Long, Boolean, \u2026) en Primitive Class.<\/p>\n<p>Plus d\u2019information dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/401\" rel=\"noopener\" target=\"_blank\">JEP 401<\/a>.<\/p>\n<h2>Unified Generic<\/h2>\n<p>Avec l\u2019unification des types r\u00e9f\u00e9rence et primitifs gr\u00e2ce aux Primitive Class, le fait de ne pouvoir utiliser de type primitif dans les types g\u00e9n\u00e9riques devient de plus en plus limitant car ces nouvelles Primitive Class ne pourraient \u00eatre utilis\u00e9es comme un type param\u00e9tr\u00e9 pour une classe ou une m\u00e9thode g\u00e9n\u00e9rique.<\/p>\n<p>De plus, cette limitation actuelle a entra\u00een\u00e9 une prolif\u00e9ration de classe sp\u00e9cialis\u00e9e pour un type primitif en sus de la classe g\u00e9n\u00e9rique (<code>OptionalInt<\/code>, <code>IntStream<\/code>, \u2026) ou la prolif\u00e9ration de m\u00e9thodes sp\u00e9cifiques (<code>Arrays.binarySearch(Object []a, Object key<\/code>),  <code>Arrays.binarySearch(int []a, int key)<\/code>, \u2026).<\/p>\n<p>L\u2019unification de la g\u00e9n\u00e9ricit\u00e9 a pour but de permettre d\u2019utiliser un type primitif comme type param\u00e9tr\u00e9 pour une classe ou une m\u00e9thode g\u00e9n\u00e9rique. La JEP ne mentionne pour l\u2019instant que l\u2019utilisation des Primitive Class et pas des primitifs existant.<\/p>\n<p>Plus d\u2019information dans la draft JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/8261529\" rel=\"noopener\" target=\"_blank\"><a href=\"https:\/\/openjdk.java.net\/jeps\/8261529\">https:\/\/openjdk.java.net\/jeps\/8261529<\/a><\/a>.<\/p>\n<h2>Specialised Generic<\/h2>\n<p>Cette fonctionnalit\u00e9 est pour l\u2019instant rarement \u00e9voqu\u00e9e et n\u2019a pas encore de d\u00e9finition claire. L\u2019id\u00e9e est de pouvoir avoir un type g\u00e9n\u00e9rique qui a certaines m\u00e9thodes sp\u00e9cialis\u00e9es pour une certaines valeur du type param\u00e9tr\u00e9.<\/p>\n<p>Imaginons la classe suivante:<\/p>\n<pre>\npublic class Container\n {\n    public add(T another) {\n        \/\/ do something clever here\n    }\n}\n<\/pre>\n<p>La sp\u00e9cialisation d\u2019un g\u00e9n\u00e9rique est la possibilit\u00e9 de d\u00e9finir une impl\u00e9mentation sp\u00e9cifique de la m\u00e9thode <code>add<\/code> pour certaines valeurs du type param\u00e9tr\u00e9 <code>T<\/code> de mani\u00e8re transparente pour l\u2019utilisateur de la classe <code>Container<\/code>.<\/p>\n<h2>Conclusion et sp\u00e9culation<\/h2>\n<p>Le projet Valhalla, en permettant une optimisation de l\u2019empreinte m\u00e9moire et un acc\u00e8s plus rapide \u00e0 de la donn\u00e9e, est un des projets les plus innovants et attendus d\u2019OpenJDK.<\/p>\n<p>La nouvelle API Vector (voir la <a href=\"https:\/\/openjdk.java.net\/jeps\/417\" rel=\"noopener\" target=\"_blank\">JEP 417<\/a>) permettant du calcul matriciel via instruction SIMD (Single Instruction Multiple Data) devrait en tirer grandement parti, et gr\u00e2ce \u00e0 ces deux fonctionnalit\u00e9s r\u00e9unies, Java va devenir pertinent dans des situations o\u00f9 le C \u00e9tait encore traditionnellement utilis\u00e9 (machine learning, deep learning, \u2026).<\/p>\n<p>Sp\u00e9culation : j\u2019aimerais voir arriver les premi\u00e8res JEP (Value Class et Inline Class) pour Java 20 (au jour d\u2019\u00e9criture de l\u2019article, aucune JEP n&rsquo;est pr\u00e9vue pour Java 20), croisons les doigts ! Quoi qu\u2019il en soit, ces JEPs seront int\u00e9gr\u00e9es tout d\u2019abord en preview feature, et nous ne les verrons certainement pas en version finale avant la prochaine LTS qui sera Java 21, et plus certainement pour la suivante (java 25) au vu du nombre de JEP \u00e0 impl\u00e9menter.<\/p>","protected":false},"excerpt":{"rendered":"<p>Cet article a \u00e9t\u00e9 publi\u00e9 initialement dans le magazine Programmez! #253. Qu\u2019est-ce que le projet Valhalla ? Le projet Valhalla est un projet d\u2019OpenJDK d\u00e9marr\u00e9 en 2014 dont le but est d\u2019apporter \u00e0 la JVM une mani\u00e8re plus flexible et performante de d\u00e9finir des types aplatis pour exprimer des donn\u00e9es pures (flattened data types). Le but est d\u2019aligner le fonctionnement de la JVM avec les caract\u00e9ristiques des hardware modernes. Pour cela, il d\u00e9finit de nouveaux types Java qui permettent de&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-le-projet-valhalla\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[11,208],"class_list":["post-1544","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-valhalla"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1877,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-24-quoi-de-neuf\/","url_meta":{"origin":1544,"position":0},"title":"Java 24 : quoi de neuf ?","author":"admin","date":"vendredi 10 janvier 2025","format":false,"excerpt":"Maintenant que Java 24 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1215,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-16-quoi-de-neuf\/","url_meta":{"origin":1544,"position":1},"title":"Java 16 : quoi de neuf ?","author":"admin","date":"vendredi 29 janvier 2021","format":false,"excerpt":"Maintenant que Java 16 est features complete (Rampdown Phase Two au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1258,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/profiler-une-application-java-dans-un-conteneur-deploye-dans-kubernetes-avec-jfr-java-flight-recorder\/","url_meta":{"origin":1544,"position":2},"title":"Profiler une application Java dans un conteneur d\u00e9ploy\u00e9 dans kubernetes avec JFR &#8211; Java Flight Recorder","author":"admin","date":"lundi 12 avril 2021","format":false,"excerpt":"La plupart des clients chez lesquels j'interviens aujourd'hui utilisent Kubernetes pour d\u00e9ployer leurs applications. Bien que Kubernetes soit un super outil, si on a besoin de ce type d'outil (qui est une discussion dans laquelle je ne rentrerais pas ici), il peut apporter une certaine complexit\u00e9 quant aux moyens de\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1090,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-jlink-et-application-class-data-sharing-appcds\/","url_meta":{"origin":1544,"position":3},"title":"Quarkus, jlink et Application Class Data Sharing (AppCDS)","author":"admin","date":"vendredi 29 mai 2020","format":false,"excerpt":"Quarkus est optimis\u00e9 pour d\u00e9marrer rapidement et avoir une empreinte m\u00e9moire tr\u00e8s faible. Ceci est vrai en d\u00e9ployant dans une JVM standard mais encore plus en d\u00e9ployant notre application comme un ex\u00e9cutable natif via GraalVM. Quarkus facilite grandement la cr\u00e9ation d\u2019ex\u00e9cutable natif, gr\u00e2ce \u00e0 \u00e7a, une application Quarkus d\u00e9marre en\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/quarkus_metrics_graphic_bootmem_wide-1024x473.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/quarkus_metrics_graphic_bootmem_wide-1024x473.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/quarkus_metrics_graphic_bootmem_wide-1024x473.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1816,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-23-quoi-de-neuf\/","url_meta":{"origin":1544,"position":4},"title":"Java 23 : quoi de neuf ?","author":"admin","date":"jeudi 25 juillet 2024","format":false,"excerpt":"Maintenant que Java 23 est features complete (Rampdown Phase Two au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1839,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-vers-une-integrite-par-defaut-de-la-jvm\/","url_meta":{"origin":1544,"position":5},"title":"Java : vers une int\u00e9grit\u00e9 par d\u00e9faut de la JVM","author":"admin","date":"mardi  4 f\u00e9vrier 2025","format":false,"excerpt":"Cet article est paru pour la premi\u00e8re fois dans le magazine Programmez! Hors s\u00e9rie #16. La Machine Virtuelle Java (JVM) est un environnement d'ex\u00e9cution qui permet \u00e0 des programmes \u00e9crits en Java (ou dans d'autres langages compil\u00e9s en bytecode Java) de s'ex\u00e9cuter sur diff\u00e9rents syst\u00e8mes d'exploitation et architectures mat\u00e9rielles. D\u00e8s\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1544"}],"version-history":[{"count":6,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1544\/revisions"}],"predecessor-version":[{"id":1553,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1544\/revisions\/1553"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}