{"id":7565,"date":"2019-06-11T13:09:10","date_gmt":"2019-06-11T11:09:10","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7565"},"modified":"2023-01-05T14:03:05","modified_gmt":"2023-01-05T13:03:05","slug":"jak-wprowadzalem-zmiany-do-c20","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/jak-wprowadzalem-zmiany-do-c20\/","title":{"rendered":"Jak wprowadza\u0142em zmiany do C++20"},"content":{"rendered":"\n<p>J\u0119zykami C i C++ interesowa\u0142em si\u0119 od czas\u00f3w liceum \u2013 wtedy w\u0142a\u015bnie napisa\u0142em pierwszy program komputerowy. Pisz\u0105c kod, lubi\u0119 mie\u0107 pe\u0142n\u0105 kontrol\u0119 nad ka\u017cdym aspektem i w\u0142a\u015bnie to mog\u0119 osi\u0105gn\u0105\u0107, robi\u0105c to w C++.<\/p>\n\n\n\n<p>Czasem doskwiera\u0142y mi jednak pewne ma\u0142e braki, kt\u00f3rych z kolei nie odczuwam,&nbsp;pracuj\u0105c z innymi j\u0119zykami. C++11 zmniejszy\u0142 t\u0119 przepa\u015b\u0107, jednak&nbsp;pewne niedogodno\u015bci pozosta\u0142y. Nale\u017ca\u0142 do nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Czas kompilacji \u2013\u00a0w wi\u0119kszo\u015bci spowodowany przez archaiczny system includ\u00f3w, kt\u00f3rego nie widzimy w przypadku Javy, C# lub Go.<\/li><li>Brak Korutyn, w kt\u00f3rych mo\u017cna jasno i \u0142atwo tworzy\u0107 asynchroniczny kod (dost\u0119pne chocia\u017cby w Pythonie).<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Historia rozwoju funkcjonalno\u015bci<\/strong><\/h2>\n\n\n\n<p>W 2011 roku zacz\u0105\u0142em przygl\u0105da\u0107 si\u0119 pracy&nbsp;<strong>Komitetu Standaryzacyjnego C++<\/strong>&nbsp;w oczekiwaniu na dalszy rozw\u00f3j funkcjonalno\u015bci. Zastanawia\u0142o mnie, dlaczego tak wyczekiwane aspekty j\u0119zyka jak Modu\u0142y czy Korutyny nie wchodz\u0105 do kolejnych standard\u00f3w. Przecie\u017c za ka\u017cdym razem dochodzi\u0142y g\u0142osy, \u017ce te funkcjonalno\u015bci s\u0105 gotowe, cz\u0119sto zaimplementowane i przetestowane! Wyszed\u0142 C++14, potem C++17 i dalej nie uda\u0142o si\u0119 dostarczy\u0107 naszych upragnionych modu\u0142\u00f3w do standardu.<\/p>\n\n\n\n<p>W 2018 roku nadarzy\u0142a si\u0119 okazja, \u017ceby zrozumie\u0107 powody tych op\u00f3\u017anie\u0144. Podczas afterparty po pewnej konferencji po\u015bwi\u0119conej w g\u0142\u00f3wnej mierze C++, w\u015br\u00f3d polskoj\u0119zycznych prelegent\u00f3w zrodzi\u0142 si\u0119 pomys\u0142 utworzenia polskiej reprezentacji, kt\u00f3ra mia\u0142aby prawo g\u0142osu na posiedzeniach mi\u0119dzynarodowego komitetu standaryzacyjnego.<\/p>\n\n\n\n<p>Normy ISO s\u0105 tworzone przez powo\u0142ane do tego Grupy Robocze (w przypadku standardu C++ jest to WG21). Aby zosta\u0107 oficjalnym cz\u0142onkiem takiej grupy, trzeba nale\u017ce\u0107 do okre\u015blonego Organu Narodowego (eng.\u00a0National Body), kt\u00f3ry jest zainteresowany dan\u0105 norm\u0105. Do tej pory \u017caden z zespo\u0142\u00f3w nale\u017c\u0105cych do Polskiego Komitetu Normalizacyjnego nie wyra\u017ca\u0142 zainteresowania prac\u0105 nad standardem C++.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cz\u0142onkostwo w Komitecie Technicznym ds. J\u0119zyk\u00f3w Programowania<\/strong><\/h2>\n\n\n\n<p>Nigdy wcze\u015bniej nie spodziewa\u0142em si\u0119, \u017ce b\u0119d\u0119 mia\u0142 mo\u017cliwo\u015b\u0107 uczestniczenia w pracach tego zespo\u0142u. Nawet po tamtej imprezie nie podejrzewa\u0142em, \u017ce co\u015b z tego wyjdzie, ale nie m\u00f3g\u0142bym spojrze\u0107 w lustro, gdybym nie spr\u00f3bowa\u0142 do niego do\u0142\u0105czy\u0107!<\/p>\n\n\n\n<p>W Polskim Komitecie Normalizacyjnym, w ramach kt\u00f3rego grupa mia\u0142a by\u0107 zawi\u0105zana, uczestnicz\u0105 instytucje, a nie osoby prywatne. W zwi\u0105zku z tym uda\u0142em si\u0119 do swojego Line Managera w Sii, aby przedstawi\u0107 mu propozycj\u0119. Ku mojemu zdziwieniu, pomys\u0142 zosta\u0142 przyj\u0119ty z du\u017cym entuzjazmem.<\/p>\n\n\n\n<p>Dzi\u0119ki olbrzymiemu wsparciu firmy w ramach Sponsoringu Pasji (bo Sii wspiera nie tylko pasje sportowe), Sii sta\u0142o si\u0119 cz\u0142onkiem\u00a0<a href=\"https:\/\/www.pkn.pl\/normalizacja\/nowe-inicjatywy-normalizacyjne\/nowe-ktkzpk\/powolanie-nowych-ktkzpk\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Komitetu Technicznego ds. J\u0119zyk\u00f3w Programowania<\/a>, a ja ju\u017c 2 lutego 2019 r. siedzia\u0142em w samolocie do Kony (Hawaje). Lecia\u0142em na swoje pierwsze w \u017cyciu posiedzenie Komitetu Standaryzacyjnego C++.<\/p>\n\n\n\n<p>To w\u0142a\u015bnie na posiedzeniu w Konie zaakceptowano \u2013 a w zasadzie zaakceptowali\u015bmy! \u2013 najwi\u0119ksze zmiany w j\u0119zyku od czas\u00f3w C++11. Zar\u00f3wno <strong>Modu\u0142y, jak i Korutyny zosta\u0142y zatwierdzone jako cz\u0119\u015b\u0107 szkicu roboczego C++20.<\/strong> Dla os\u00f3b, kt\u00f3re nie \u015bledz\u0105 rozwoju C++ zbyt dok\u0142adnie, mo\u017ce wyda\u0107 si\u0119 to b\u0142ahostk\u0105, a tak napraw\u0119 jest to <strong>ukoronowanie ponad dekady prac ca\u0142ego Komitetu<\/strong>! Jestem dumny, \u017ce Sii i ja osobi\u015bcie brali\u015bmy udzia\u0142 w tych g\u0142osowaniach!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Atmosfera podczas posiedzenia Komitetu Standaryzacyjnego C++<\/strong><\/h2>\n\n\n\n<p>Pierwszego dnia na spotkaniu by\u0142em przera\u017cony. Nagle wyl\u0105dowa\u0142em w pokoju wype\u0142nionym lud\u017ami, kt\u00f3rych uwa\u017cam za najlepszych spo\u015br\u00f3d najlepszych. Do tej pory zna\u0142em ich jako prelegent\u00f3w i autor\u00f3w ksi\u0105\u017cek. W Konie siedzia\u0142em w jednej sali, na r\u00f3wnych prawach z jednymi z najlepszych programist\u00f3w C++ na \u015bwiecie. Mo\u017cna si\u0119 czu\u0107 onie\u015bmielonym\u2026<\/p>\n\n\n\n<p>Pomimo pierwszego zak\u0142opotania musz\u0119 przyzna\u0107, \u017ce Komitet jest bardzo otwarty na nowych ludzi. Poziom dyskusji ca\u0142y czas jest bardzo wysoki. Odnios\u0142em wra\u017cenie, \u017ce przy ka\u017cdej kwestii spornej wszystkie strony s\u0105 gotowe zmieni\u0107 zdanie i przyzna\u0107 racj\u0119 przeciwnikowi. Wida\u0107 by\u0142o ch\u0119\u0107 znalezienia najlepszego rozwi\u0105zania, niezale\u017cnie od tego, kto jest jego autorem.<\/p>\n\n\n\n<p>W IT wielokrotnie by\u0142em \u015bwiadkiem przywi\u0105zywania si\u0119 autor\u00f3w do w\u0142asnych pomys\u0142\u00f3w. W takiej sytuacji konstruktywna krytyka cz\u0119sto bywa b\u0142\u0119dnie odbierana przez autora jako atak. Na posiedzeniu Komitetu nie zauwa\u017cy\u0142em tego zjawiska, mimo \u017ce cz\u0119sto mieli\u015bmy dwie przeciwstawne propozycje rozwi\u0105zania tego samego problemu (i obie wymaga\u0142y olbrzymiej ilo\u015bci czasu do przygotowania).<\/p>\n\n\n\n<p>Co prawda nie powinienem ocenia\u0107 ca\u0142ego Komitetu po jednym spotkaniu, ale na razie zapowiada si\u0119 bardzo dobrze!\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Poziom wyzwa\u0144<\/strong><\/h2>\n\n\n\n<p>Nigdy nie s\u0105dzi\u0142em, \u017ce projektowanie i rozwijanie j\u0119zyka programowania jest proste, ale musz\u0119 przyzna\u0107, \u017ce ogrom pracy i z\u0142o\u017cono\u015b\u0107 problem\u00f3w, z jakimi Komitet musi si\u0119 mierzy\u0107, <strong>przer\u00f3s\u0142 moje oczekiwania o kilka rz\u0119d\u00f3w.<\/strong><\/p>\n\n\n\n<p>\u017beby nakre\u015bli\u0107 sytuacj\u0119, postaram si\u0119 pos\u0142u\u017cy\u0107 przyk\u0142adem. C++11 wprowadzi\u0142o s\u0142owo kluczowe&nbsp;constexpr. Pozwala ono na przeprowadzanie oblicze\u0144 w czasie kompilacji, ale ze wzgl\u0119du na poziom skomplikowania w implementacji kompilator\u00f3w, dopuszczone zosta\u0142y tylko bardzo proste funkcje.<\/p>\n\n\n\n<p>W latach 2014 i 2017 ograniczenia te zosta\u0142y rozlu\u017anione. Mo\u017cemy ju\u017c u\u017cywa\u0107 p\u0119tli, tworzy\u0107 nowe zmienne itp., jednak wci\u0105\u017c nie mo\u017cemy alokowa\u0107 pami\u0119ci. Nie ma mowy o stworzeniu obiektu klasy&nbsp;<em>std::string<\/em>&nbsp;lub&nbsp;<em>std::vector<\/em>&nbsp;w funkcji oznaczonej jako&nbsp;<em>constexpr<\/em>.<\/p>\n\n\n\n<p>Rozwa\u017cmy, co musi si\u0119 zadzia\u0107 w j\u0119zyku, aby funkcja wykonywana w czasie kompilacji mog\u0142a t\u0119 pami\u0119\u0107 alokowa\u0107.<\/p>\n\n\n\n<p>Kiedy jeste\u015bmy w trakcie wykonania tej funkcji (to jest w czasie kompilacji), to mo\u017cemy o takiej naszej alokowanej pami\u0119ci my\u015ble\u0107 normalnie: mo\u017cemy j\u0105 modyfikowa\u0107 i mo\u017cemy j\u0105 zwolni\u0107. Nic trudnego ani skomplikowanego. Dop\u00f3ki alokujemy i zwalniamy t\u0119 pami\u0119\u0107 w czasie kompilacji, wszystko jest w porz\u0105dku. Problem pojawia si\u0119, kiedy nie chcemy jej zwalnia\u0107 w trakcie kompilacji.<\/p>\n\n\n\n<p>Istnieje ca\u0142kiem spora lista przyk\u0142ad\u00f3w, w kt\u00f3rych warto by by\u0142o potraktowa\u0107 taki&nbsp;<em>std::vector<\/em>&nbsp;stworzony w czasie kompilacji jako sta\u0142\u0105 w czasie wykonania np. wczytanie XML lub JSON na temat wszystkich zmian stref czasowych w historii, aby dostarczy\u0107 modu\u0142 pracy z datami.<\/p>\n\n\n\n<p>W tym przypadku mamy ca\u0142kiem spor\u0105 motywacj\u0119, aby pami\u0119\u0107 zaalokowan\u0105 w czasie kompilacji zostawi\u0107 do dyspozycji programu w czasie wykonania. I tu pojawia si\u0119 problem. W czasie wykonania programu ta pami\u0119\u0107 jest sta\u0142a. Pr\u00f3ba wprowadzenia zmiany spowoduje niezdefiniowane zachowania: mo\u017ce zako\u0144czy\u0107 program lub, co gorsza, objawi si\u0119 w mniej oczywisty i bardziej szkodliwy spos\u00f3b. Co wi\u0119cej, typ zwr\u00f3cony, kt\u00f3ry utrzymuje tak\u0105 pami\u0119\u0107 (np. rzeczony&nbsp;<em>std::vector<\/em>) nie mo\u017ce tej pami\u0119ci dealokowa\u0107 w destruktorze, bo allokator ma mo\u017cliwo\u015b\u0107 wprowadza\u0107 w takiej pami\u0119ci zmiany.<\/p>\n\n\n\n<p>Trzeba te\u017c pami\u0119ta\u0107, \u017ce tego problemu (ani \u017cadnego innego, z jakim boryka si\u0119 Komitet) nie mo\u017cna rozwi\u0105za\u0107 w pierwszy lepszy spos\u00f3b. <strong>Rozwi\u0105zanie musi by\u0107 koherentne i bra\u0107 pod uwag\u0119 wszystkie inne aspekty j\u0119zyka,<\/strong> aby by\u0107 mo\u017cliwie jak najsp\u00f3jniejsze z intuicj\u0105 u\u017cytkownik\u00f3w j\u0119zyka. A u\u017cytkownik\u00f3w C++ jest naprawd\u0119 wiele. Nie mo\u017cna te\u017c zepsu\u0107 istniej\u0105cego kodu. A tego kodu jest jeszcze wi\u0119cej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co dalej?<\/strong><\/h2>\n\n\n\n<p>Sama obecno\u015b\u0107 na posiedzeniach Komitetu to tylko wisienka na torcie. Pomi\u0119dzy\u00a0<a href=\"https:\/\/isocpp.org\/std\/meetings-and-participation\/upcoming-meetings\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >spotkaniami\u00a0<\/a>wi\u0119kszo\u015b\u0107 pracy odbywa si\u0119 na listach mailingowych, za po\u015brednictwem kt\u00f3rych zg\u0142aszane s\u0105 pierwsze wersje dokument\u00f3w i omawiane bie\u017c\u0105ce problemy. Regularnie (\u015brednio 1-2 razy w miesi\u0105cu) odbywaj\u0105 si\u0119 te\u017c telekonferencje, kt\u00f3re s\u0105 miniaturow\u0105 wersj\u0105 posiedze\u0144 Komitetu. Wynik tych prac jest punktem wyj\u015bcia dla posiedze\u0144.<\/p>\n\n\n\n<p>Prze\u017cy\u0142em swoje pierwsze posiedzenie Komitetu i musz\u0119 przyzna\u0107, \u017ce by\u0142o to niesamowite do\u015bwiadczenie. Otrzyma\u0142em szans\u0119, aby przyczyni\u0107 si\u0119 do rozwoju technologii, kt\u00f3rej u\u017cywam na co dzie\u0144 w pracy. Jednocze\u015bnie mog\u0119 wsp\u00f3\u0142pracowa\u0107 z lud\u017ami, kt\u00f3rych uwa\u017cam za mentor\u00f3w. To \u015bwietne uczucie i wyj\u0105tkowa okazja do nauki. Zacz\u0105\u0142em te\u017c prac\u0119 nad swoj\u0105 pierwsz\u0105 propozycj\u0105 do biblioteki standardowej, ale chwil\u0119 zajmie, zanim b\u0119dzie ona gotowa do publikacji.<\/p>\n\n\n\n<p>Wci\u0105\u017c jeszcze oswajam si\u0119 z dynamik\u0105 i metodami pracy Komitetu, ale wierz\u0119, \u017ce mog\u0119 mie\u0107 sw\u00f3j wk\u0142ad w jego prac\u0119. Ju\u017c nie mog\u0119 si\u0119 doczeka\u0107 15 lipca i posiedzenia w Kolonii (Niemcy)!<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 j\u0119zyk C++, polecamy r\u00f3wnie\u017c inne artyku\u0142y z tego obszaru m.in.: <a href=\"https:\/\/sii.pl\/blog\/en\/implementing-a-state-machine-in-c17\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Implementing a State Machine in C++17<\/a> oraz <a href=\"https:\/\/sii.pl\/blog\/en\/communication-methods-between-c-qt-and-qml\/?category=hard-development&amp;tag=cpp-en,embedded-en,qml\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Communication methods between C++\/Qt and QML<\/a>. A gdyby\u015b zastanawia\u0142 si\u0119, jakie jeszcze obszary technologiczne s\u0105 wspierane w ramach Programu Sponsoringu Pasji, zajrzyj do:\u00a0<a href=\"https:\/\/sii.pl\/blog\/en\/sii-to-the-sky-how-to-launch-your-device-at-24-km-high\/?category=hard-development&amp;tag=after-hours-project-2,embedded-en,passion-sponsorship-program,stratospheric-balloon\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Sii to the sky \u2013 how to launch your device at 24 km high!<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;7565&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;15&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 15)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Jak wprowadza\u0142em zmiany do C++20&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 15)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>J\u0119zykami C i C++ interesowa\u0142em si\u0119 od czas\u00f3w liceum \u2013 wtedy w\u0142a\u015bnie napisa\u0142em pierwszy program komputerowy. Pisz\u0105c kod, lubi\u0119 mie\u0107 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/jak-wprowadzalem-zmiany-do-c20\/\">Continued<\/a><\/p>\n","protected":false},"author":208,"featured_media":7576,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":4,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[129,784,786,785],"class_list":["post-7565","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-c","tag-c20","tag-komitet-standaryzacyjny-c","tag-polski-komitet-normalizacyjny"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/c.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7565"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/208"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7565"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7565\/revisions"}],"predecessor-version":[{"id":18203,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7565\/revisions\/18203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/7576"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}