{"id":5376,"date":"2018-08-24T14:54:23","date_gmt":"2018-08-24T12:54:23","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=5376"},"modified":"2023-09-11T12:21:54","modified_gmt":"2023-09-11T10:21:54","slug":"czas-na-stabilizacje","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/czas-na-stabilizacje\/","title":{"rendered":"Czas na stabilizacj\u0119."},"content":{"rendered":"\n<p>Czas w projekcie jest zasobem. Kluczowym zasobem, kt\u00f3ry ma jedn\u0105 bardzo interesuj\u0105c\u0105 cech\u0119. Czym bli\u017cej ko\u0144ca tym jego relatywna d\u0142ugo\u015b\u0107 si\u0119 skraca, a warto\u015b\u0107 drastycznie wzrasta.<\/p>\n\n\n\n<p>Ko\u0144cowa faza projektu to okres najbardziej intensywnej pracy z b\u0142\u0119dami, rozumianymi szeroko &#8211; zar\u00f3wno jako rzeczywiste b\u0142\u0119dy, zmiany, czy te\u017c doprecyzowania.<\/p>\n\n\n\n<p>W projekcie, kt\u00f3ry ostatnio si\u0119 zako\u0144czy\u0142 pojawi\u0142o si\u0119 kilka interesuj\u0105cych przypadk\u00f3w b\u0142\u0119d\u00f3w. Chc\u0119 tutaj przedstawi\u0107 trzy z nich. Nie by\u0142y one krytyczne i nie mog\u0142y zawa\u017cy\u0107 na powodzeniu projektu. Samo ich wyst\u0105pienie nie by\u0142o r\u00f3wnie\u017c niczym z\u0142ym, b\u0142\u0105d to integralna cz\u0119\u015b\u0107 ka\u017cdego projektu.<\/p>\n\n\n\n<p>Te konkretne przypadki s\u0105 o tyle interesuj\u0105ce, \u017ce nie zosta\u0142y wykryte podczas test\u00f3w deweloperskich, czy testerskich. Wa\u017cne jest r\u00f3wnie\u017c to, \u017ce nie zosta\u0142y zg\u0142oszone przez klienta. Zlokalizowano je podczas zaplanowanego wcze\u015bniej czasu na stabilizacj\u0119 rozwi\u0105zania.<\/p>\n\n\n\n<p>Klika s\u0142\u00f3w wprowadzaj\u0105cych w sam projekt. Jego g\u0142\u00f3wnym celem by\u0142o stworzenie z\u0142o\u017conych raport\u00f3w SSRS.&nbsp;Do osi\u0105gni\u0119cia celu wymagane by\u0142y trzy rzeczy: &nbsp;poprawne dane w g\u0142\u0119bokim \u017ar\u00f3dle,&nbsp; implementacja procesu, kt\u00f3re je przelicza\u0142, oraz pobieranie i wy\u015bwietlanie informacji w raportach.<\/p>\n\n\n\n<p>Przechodz\u0105c do konkret\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troch\u0119 o refaktoryzacji.<\/strong><\/h2>\n\n\n\n<p>Tylko dlaczego pisz\u0119 o refaktoryzacji, a nie optymalizacji? J\u0119zykiem projektu by\u0142 T-SQL. W kontek\u015bcie j\u0119zyk\u00f3w bazodanowych, rzadko s\u0142yszy si\u0119 o pierwszym zabiegu. Nie rozumiem dlaczego, kodowanie to kodowanie, ale to temat na inny artyku\u0142. W tym przypadku zapytanie zosta\u0142o przepisane poniewa\u017c by\u0142o &#8222;brzydkie&#8221;. D\u0142ugie i trudne w czytaniu. Opr\u00f3cz zmiany wygl\u0105du uda\u0142o si\u0119 znacznie poprawi\u0107 dwa inne, kluczowe (optymalizacyjne) czynniki: obci\u0105\u017cenie bazy oraz wydajno\u015b\u0107.<\/p>\n\n\n\n<p>Zapytanie zwraca\u0142o dane w DataSet dla jednego z wykres\u00f3w. Raport z pierwotnym zapytaniem dzia\u0142a\u0142 w spos\u00f3b poprawny, w akceptowalnym przez klienta czasie. Po refaktoryzacji dzia\u0142a\u0142 lepiej.<\/p>\n\n\n\n<p>Mo\u017cna zapyta\u0107 dlaczego brak refaktoryzacji uwa\u017cam za b\u0142\u0105d. Podstawowa odpowied\u017a to d\u0142ug technologiczny. Za\u0142\u00f3\u017cmy jednak, \u017ce to zbyt odleg\u0142y problem. Co w takim razie mog\u0142o by\u0107 nie tak, skoro pierwotne zapytanie zosta\u0142o przez klienta odebrane? Wydajno\u015b\u0107 ca\u0142ego, z\u0142o\u017conego rozwi\u0105zania. Produkt docelowy sk\u0142ada\u0142 si\u0119 z kilkudziesi\u0119ciu podobnych zapyta\u0144 (cz\u0119\u015bciowo r\u00f3wnie\u017c przepisanych). Po z\u0142o\u017ceniu wszystkiego w ca\u0142o\u015b\u0107 mog\u0142o okaza\u0107 si\u0119, \u017ce kryterium wydajno\u015bci nie b\u0119dzie spe\u0142nione. Tutaj znalaz\u0142 si\u0119 czas na refleksj\u0119, na przemy\u015blenie sk\u0142adni i logiki. Dzi\u0119ki temu wydajno\u015b\u0107 nie stanowi\u0142a problemu.<\/p>\n\n\n\n<p>Poni\u017cej metadane zapytania:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/refaktoryzacja.png\"><img decoding=\"async\" width=\"1209\" height=\"178\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/refaktoryzacja.png\" alt=\"optymalizacja zapytania\" class=\"wp-image-5378\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/refaktoryzacja.png 1209w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/refaktoryzacja-300x44.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/refaktoryzacja-1024x151.png 1024w\" sizes=\"(max-width: 1209px) 100vw, 1209px\" \/><\/a><\/figure>\n\n\n\n<p>Pierwsza linijka dotyczy zapytania pierwotnego, druga zapytania po refaktoryzacji.&nbsp;R\u00f3\u017cnice widoczne. Komentarz zb\u0119dny.<\/p>\n\n\n\n<p>Refaktoryzacja powinna by\u0107 zawsze cz\u0119\u015bci\u0105 projektu. Czas na przemy\u015blenie rozwi\u0105zania musi by\u0107 zaplanowany. By\u0142oby super gdyby nie by\u0142 za ni\u0105 odpowiedzialny autor bazowego rozwi\u0105zania. \u015awie\u017ce spojrzenie zawsze w cenie. \ud83d\ude09<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troch\u0119 o jako\u015bci.<\/strong><\/h2>\n\n\n\n<p>Jednym z element\u00f3w projektu by\u0142o stworzenie procedur przeliczaj\u0105cych dane. Proces pobiera\u0142 konkretne warto\u015bci z surowego ci\u0105gu znak\u00f3w i przelicza\u0142 je zgodnie z regu\u0142ami biznesowymi. Dla niekt\u00f3rych wylicze\u0144 czasowych, warto\u015bci w sekundach nale\u017ca\u0142o zagregowa\u0107 do godzin\/minut\/sekund. I tu pojawi\u0142 si\u0119 b\u0142\u0105d. Spowodowany przez \u017ale wstawiony nawias.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/correct_incorrect_bracket_LW_20180510.png\"><img decoding=\"async\" width=\"629\" height=\"133\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/correct_incorrect_bracket_LW_20180510.png\" alt=\"poprawne wstawianie nawias\u00f3w w zapytaniach\" class=\"wp-image-24025\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/correct_incorrect_bracket_LW_20180510.png 629w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/correct_incorrect_bracket_LW_20180510-300x63.png 300w\" sizes=\"(max-width: 629px) 100vw, 629px\" \/><\/a><\/figure>\n\n\n\n<p>Oba fragmenty kodu dzia\u0142aj\u0105, a co gorsza <span style=\"text-decoration: underline;\">tylko dla niekt\u00f3rych zdarze\u0144 o okre\u015blonych nazwach<\/span> zwraca\u0142y r\u00f3\u017cne warto\u015bci.<\/p>\n\n\n\n<p>Poni\u017cej niepoprawne wyniki:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_incorrect_bracket_LW_20180510.png\"><img decoding=\"async\" width=\"699\" height=\"89\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_incorrect_bracket_LW_20180510.png\" alt=\"wyniki przelicze\u0144 - b\u0142\u0119dne nawiasy\" class=\"wp-image-5381\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_incorrect_bracket_LW_20180510.png 699w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_incorrect_bracket_LW_20180510-300x38.png 300w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><\/a><\/figure>\n\n\n\n<p>Poni\u017cej poprawne wyniki:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_correct_bracket_LW_20180510.png\"><img decoding=\"async\" width=\"697\" height=\"80\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_correct_bracket_LW_20180510.png\" alt=\"wyniki przelicze\u0144 - poprawne nawiasy\" class=\"wp-image-5384\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_correct_bracket_LW_20180510.png 697w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/wyniki_correct_bracket_LW_20180510-300x34.png 300w\" sizes=\"(max-width: 697px) 100vw, 697px\" \/><\/a><\/figure>\n\n\n\n<p>Problem zosta\u0142 wykryty podczas wyrywkowego sprawdzania sp\u00f3jno\u015bci ko\u0144cowego raportu. R\u00f3\u017cnice w wyliczeniach by\u0142y na tyle niewielkie (1-3 minuty), \u017ce zosta\u0142y zauwa\u017cone dopiero przy u\u017cyciu innej metody wyliczeniowej.<\/p>\n\n\n\n<p>Nie liczy si\u0119 sam wynik, ale jego poprawno\u015b\u0107. Truizm, ale powy\u017cszy przyk\u0142ad dobrze go obrazuje. Naprawa b\u0142\u0119du by\u0142a banalnie prosta, trudniejsze by\u0142o jego znalezienie. Najwa\u017cniejsze jest jednak to, \u017ce b\u0142\u0105d uda\u0142o si\u0119 wykry\u0107 przed rzeczywistym uruchomieniem systemu. Nauka p\u0142yn\u0105ca na przysz\u0142o\u015b\u0107? Ka\u017cde wyliczenie matematyczne sprawd\u017a dwoma sposobami.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troch\u0119 o danych testowych.<\/strong><\/h2>\n\n\n\n<p>Przygotowywane przez nas raporty mia\u0142y by\u0107 wieloj\u0119zyczne. J\u0119zykiem developmentu by\u0142 angielski. Si\u0142\u0105 rzeczy t\u0142umaczenia mog\u0142y pojawi\u0107 si\u0119 dopiero po zamkni\u0119ciu procesu wytw\u00f3rczego. Niestety nie da\u0142o si\u0119 tego obej\u015b\u0107.<\/p>\n\n\n\n<p>Cz\u0119\u015b\u0107 wykres\u00f3w prezentowa\u0142a dane roczne w agregacji miesi\u0119cznej. Pocz\u0105tkowo na wykresach mia\u0142y si\u0119 wy\u015bwietla\u0107 numery miesi\u0119cy. Klient poprosi\u0142 nas, aby zast\u0105pi\u0107 je nazwami. Ze wzgl\u0119du na ograniczon\u0105 ilo\u015b\u0107 miejsca zastosowali\u015bmy 3-literowe skr\u00f3ty. Poni\u017cej wersja angielska:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/angielska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png\"><img decoding=\"async\" width=\"650\" height=\"405\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/angielska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png\" alt=\"SSRS - zmienne zale\u017cne j\u0119zykowo - bez b\u0142\u0119du\" class=\"wp-image-5392\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/angielska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png 650w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/angielska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2-300x187.png 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/figure>\n\n\n\n<p>Problem pojawi\u0142 si\u0119 w wersji francuskiej:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy.png\"><img decoding=\"async\" width=\"687\" height=\"500\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy.png\" alt=\"SSRS - zmienne zale\u017cne j\u0119zykowo - z b\u0142\u0119dem\" class=\"wp-image-5386\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy.png 687w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy-300x218.png 300w\" sizes=\"(max-width: 687px) 100vw, 687px\" \/><\/a><\/figure>\n\n\n\n<p>W czym tkwi problem? W nag\u0142ym skoku warto\u015bci w miesi\u0105cu &#8222;Jui&#8221;. W miesi\u0105cu czy w miesi\u0105cach? W j\u0119zyku francuskim czerwiec to &#8222;Juin&#8221;, lipiec to &#8222;Juillet&#8221;. 3-literowy skr\u00f3t: &#8222;Jui&#8221;. Rzecz banalna do naprawy. Wystarczy\u0142o zmieni\u0107 warto\u015b\u0107, po kt\u00f3rej odbywa\u0142o si\u0119 grupowanie. Przypadek nie do wykrycia bez w\u0142a\u015bciwych danych testowych.<\/p>\n\n\n\n<p>Wykres po zmianie:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png\"><img decoding=\"async\" width=\"661\" height=\"428\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png\" alt=\"SSRS - zmienne zale\u017cne j\u0119zykowo - b\u0142\u0105d naprawiony\" class=\"wp-image-5391\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2.png 661w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/francuska-wersja-blad-z-\u0142aczeniem-miesiecy_po-zmianie-typu-danych_2-300x194.png 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/a><\/figure>\n\n\n\n<p>Dane testowe musz\u0105 by\u0107 pe\u0142ne. Pod ka\u017cdym wzgl\u0119dem. O ile jeszcze mo\u017cna spreparowa\u0107 ich ilo\u015b\u0107, gorzej z kompletno\u015bci\u0105. Preparacja rzeczywisto\u015bci jest zadaniem karko\u0142omnym. Chocia\u017c w tym przypadku problemu mo\u017cna by\u0142o unikn\u0105\u0107. Wystarczy\u0142o nie u\u017cywa\u0107 do agregacji warto\u015bci zale\u017cnych j\u0119zykowo. Nauczka na przysz\u0142o\u015b\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jakie\u015b wnioski z powy\u017cszych przyk\u0142ad\u00f3w?<\/h2>\n\n\n\n<p>Okres stabilizacji systemu nie powinien by\u0107 jedynie marzeniem programisty, ale od samego pocz\u0105tku zaplanowanym etapem w projekcie. Bez wzgl\u0119du na jego wielko\u015b\u0107. To taki czas na drugi oddech. Mamy gotowe, dzia\u0142aj\u0105ce rozwi\u0105zanie. Najci\u0119\u017csza praca ju\u017c za nami. Mo\u017cemy teraz odetchn\u0105\u0107 i zobaczy\u0107, jak teoria przerodzi\u0142a si\u0119 w praktyk\u0119. A przy okazji co\u015b dopie\u015bci\u0107, bo tego nigdy nie za du\u017co. \ud83d\ude09<\/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;5376&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;3&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;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Czas na stabilizacj\u0119.&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&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: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Czas w projekcie jest zasobem. Kluczowym zasobem, kt\u00f3ry ma jedn\u0105 bardzo interesuj\u0105c\u0105 cech\u0119. Czym bli\u017cej ko\u0144ca tym jego relatywna d\u0142ugo\u015b\u0107 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/czas-na-stabilizacje\/\">Continued<\/a><\/p>\n","protected":false},"author":158,"featured_media":5400,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[421,556,554,402,555,553],"class_list":["post-5376","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-bi","tag-blad","tag-czas","tag-planowanie","tag-projekt","tag-ssrs"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/05\/icon-2685465_1920_LW_20180510.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5376"}],"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\/158"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=5376"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5376\/revisions"}],"predecessor-version":[{"id":24027,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5376\/revisions\/24027"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/5400"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=5376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=5376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=5376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}