{"id":1611,"date":"2019-03-16T20:55:01","date_gmt":"2019-03-16T20:55:01","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1611"},"modified":"2024-12-16T22:32:40","modified_gmt":"2024-12-16T19:32:40","slug":"%d1%81-application-plugins","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/ru\/2019\/03\/16\/%d1%81-application-plugins\/","title":{"rendered":"\u0421++ \u043f\u043b\u0430\u0433\u0438\u043d\u044b"},"content":{"rendered":"<p><\/p>\r\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 C++ \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u041e\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Linux, \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image\"><a href=\"https:\/\/twitter.com\/iamdevloper\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"617\" class=\"wp-image-1615\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/03\/iamdev-1024x617.png\" alt=\"\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/03\/iamdev-1024x617.png 1024w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/03\/iamdev-300x181.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/03\/iamdev-768x462.png 768w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/03\/iamdev.png 1440w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>\r\n<figcaption>Composition over inheritance!<\/figcaption>\r\n<\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d &#8211; \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c:<\/p>\r\n<p><\/p>\r\n<p><!-- HTML generated using hilite.me --><\/p>\r\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\r\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #557799;\">#include \"iostream\"<\/span>\r\n\r\n<span style=\"color: #008800; font-weight: bold;\">using<\/span> <span style=\"color: #008800; font-weight: bold;\">namespace<\/span> std;\r\n\r\n<span style=\"color: #008800; font-weight: bold;\">extern<\/span> <span style=\"background-color: #fff0f0;\">\"C\"<\/span> <span style=\"color: #333399; font-weight: bold;\">void<\/span> extensionEntryPoint() {\r\n\tcout <span style=\"color: #333333;\">&lt;&lt;<\/span> <span style=\"background-color: #fff0f0;\">\"Extension entry point called\"<\/span> <span style=\"color: #333333;\">&lt;&lt;<\/span> endl;\r\n};\r\n<\/pre>\r\n<\/div>\r\n<p><\/p>\r\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<strong> &#8220;extension.so&#8221;<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c:<br \/><strong>clang++ -shared -fPIC extension.cpp -o extension.so<\/strong><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b &#8220;extension.so&#8221;, \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8220;extensionEntryPoint&#8221;, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043f\u0435\u0447\u0430\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\r\n<p><\/p>\r\n<p><!-- HTML generated using hilite.me --><\/p>\r\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\r\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #557799;\">#include \"iostream\"<\/span>\r\n<span style=\"color: #557799;\">#include \"dlfcn.h\"<\/span>\r\n\r\n<span style=\"color: #008800; font-weight: bold;\">using<\/span> <span style=\"color: #008800; font-weight: bold;\">namespace<\/span> std;\r\n\r\n<span style=\"color: #008800; font-weight: bold;\">typedef<\/span> <span style=\"color: #0066bb; font-weight: bold;\">void<\/span> (<span style=\"color: #333333;\">*<\/span>VoidFunctionPointer)();\t\r\n\r\n<span style=\"color: #333399; font-weight: bold;\">int<\/span> <span style=\"color: #0066bb; font-weight: bold;\">main<\/span> (<span style=\"color: #333399; font-weight: bold;\">int<\/span> argc, <span style=\"color: #333399; font-weight: bold;\">char<\/span> <span style=\"color: #333333;\">*<\/span>argv[]) {\r\n\r\n\tcout <span style=\"color: #333333;\">&lt;&lt;<\/span> <span style=\"background-color: #fff0f0;\">\"C++ Plugins Example\"<\/span> <span style=\"color: #333333;\">&lt;&lt;<\/span> endl;\r\n\r\n\t<span style=\"color: #008800; font-weight: bold;\">auto<\/span> extensionHandle <span style=\"color: #333333;\">=<\/span> dlopen(<span style=\"background-color: #fff0f0;\">\".\/extension.so\"<\/span>, RTLD_LAZY);\r\n\t<span style=\"color: #008800; font-weight: bold;\">if<\/span> (<span style=\"color: #333333;\">!<\/span>extensionHandle) {\r\n\t\tstring errorString <span style=\"color: #333333;\">=<\/span> dlerror();\r\n\t\t<span style=\"color: #008800; font-weight: bold;\">throw<\/span> runtime_error(errorString);\r\n\t}\r\n\r\n\t<span style=\"color: #008800; font-weight: bold;\">auto<\/span> functionPointer <span style=\"color: #333333;\">=<\/span> VoidFunctionPointer();\r\n\tfunctionPointer <span style=\"color: #333333;\">=<\/span> (VoidFunctionPointer) dlsym(extensionHandle, <span style=\"background-color: #fff0f0;\">\"extensionEntryPoint\"<\/span>);\r\n\t<span style=\"color: #008800; font-weight: bold;\">auto<\/span> dlsymError <span style=\"color: #333333;\">=<\/span> dlerror();\r\n \t<span style=\"color: #008800; font-weight: bold;\">if<\/span> (dlsymError) {\r\n\t\tstring errorString <span style=\"color: #333333;\">=<\/span> dlerror();\r\n\t\t<span style=\"color: #008800; font-weight: bold;\">throw<\/span> runtime_error(errorString);\r\n \t}\r\n\r\n\tfunctionPointer();\r\n\r\n\texit(<span style=\"color: #0000dd; font-weight: bold;\">0<\/span>);\r\n} \r\n<\/pre>\r\n<\/div>\r\n<p><\/p>\r\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f dlopen \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0445\u044d\u043d\u0434\u043b\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439; \u0444\u0443\u043d\u043a\u0446\u0438\u044f dlsym \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435; dlerror \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u0430\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u043d\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u043e\u0434 <strong>&#8220;Extension entry point called&#8221;<\/strong><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u041a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e <em>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/em> \u0441 <strong>extern C<\/strong>; \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b; \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 C++ \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 open-source \u0432\u0440\u0430\u043f\u043f\u0435\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/m-renaud\/libdlibxx\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"m-renaud\/libdlibxx (opens in a new tab)\">m-renaud\/libdlibxx<\/a><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/cpppluginsexample\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">https:\/\/gitlab.com\/demensdeum\/cpppluginsexample<\/a><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><a href=\"http:\/\/man7.org\/linux\/man-pages\/man3\/dlopen.3.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">http:\/\/man7.org\/linux\/man-pages\/man3\/dlopen.3.htm<\/a><br \/><a href=\"https:\/\/gist.github.com\/tailriver\/30bf0c943325330b7b6a\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"https:\/\/gist.github.com\/tailriver\/30bf0c943325330b7b6a (opens in a new tab)\">https:\/\/gist.github.com\/tailriver\/30bf0c943325330b7b6a<\/a><br \/><a href=\"https:\/\/stackoverflow.com\/questions\/840501\/how-do-function-pointers-in-c-work\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"https:\/\/stackoverflow.com\/questions\/840501\/how-do-function-pointers-in-c-work (opens in a new tab)\">https:\/\/stackoverflow.com\/questions\/840501\/how-do-function-pointers-in-c-work<\/a><\/p>\r\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 C++ \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u041e\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Linux, \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. Composition over inheritance! \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d &#8211; \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c: #include &#8220;iostream&#8221; using namespace std; extern &#8220;C&#8221; void extensionEntryPoint() { cout &lt;&lt; &#8220;Extension<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/ru\/2019\/03\/16\/%d1%81-application-plugins\/\">Continue reading <span class=\"screen-reader-text\">&#8220;\u0421++ \u043f\u043b\u0430\u0433\u0438\u043d\u044b&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[],"class_list":["post-1611","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"ru","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":false,"content":false,"excerpt":false},"de":{"title":false,"content":false,"excerpt":false},"fr":{"title":false,"content":false,"excerpt":false},"ja":{"title":false,"content":false,"excerpt":false},"pt":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/1611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/comments?post=1611"}],"version-history":[{"count":26,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/1611\/revisions"}],"predecessor-version":[{"id":1691,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/1611\/revisions\/1691"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/media?parent=1611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/categories?post=1611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/tags?post=1611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}