{"id":235,"date":"2010-11-27T11:35:04","date_gmt":"2010-11-27T10:35:04","guid":{"rendered":"http:\/\/eriz.pcinside.pl\/weblog\/slodk-znaczy-qt-blip-qblip-235.html"},"modified":"2010-11-27T11:35:04","modified_gmt":"2010-11-27T10:35:04","slug":"slodk-znaczy-qt-blip-qblip","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/slodk-znaczy-qt-blip-qblip-235.html","title":{"rendered":"S\u0142odk&#8230; znaczy, Qt: +Blip = QBlip"},"content":{"rendered":"<p>Programowanie, to stan umys\u0142u &#8211; b\u0119d\u0119 zawsze to powtarza\u0142. Da si\u0119 to pozna\u0107 ju\u017c w pierwszych paru minutach rozmowy z kim\u015b uwa\u017caj\u0105cym si\u0119 za kodera. Naprawd\u0119 &#8211; konstrukcja u\u017cywanych funkcji zdaniowych wymienianych przez programist\u00f3w podczas rozmowy &#8222;na temat&#8221; jest do\u015b\u0107 specyficzna i pomimo wcale-nie-takich-trudnych zwrot\u00f3w &#8211; dla zwyk\u0142ego \u015bmiertelnika jest do\u015b\u0107 dziwna. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Ale nie o tym chc\u0119 napisa\u0107. Wspomnia\u0142em, \u017ce programowanie, to stan umys\u0142u. Czyli zgodnie z definicj\u0105, osobnik \u00f3w posiadaj\u0105cy powinien potrafi\u0107 zrealizowa\u0107 postawione przed nim zadanie niezale\u017cnie od j\u0119zyka.<\/p>\n<p>Z w\u0142asnego do\u015bwiadczenia &#8211; co\u015b w tym jest. Tak si\u0119 si\u0119 sta\u0142o po bli\u017cszej przygodzie z C++ i Qt. Notka troch\u0119 filozoficzna. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><!--more--><\/p>\n<p>Przedmiot zwany <em>Programowaniem w C++<\/em>. Jak to zwykle bywa, laborki, do tego projekt. I ten ostatni, przy prawid\u0142owym napisaniu aplikacji, umo\u017cliwia\u0142 uzyskanie zaliczenia z ca\u0142ego przedmiotu.<\/p>\n<h3>PHP-owiec i C++<\/h3>\n<p>Przyznam, \u017ce wyzwanie by\u0142o do\u015b\u0107 ciekawe. Mo\u017cna powiedzie\u0107, \u017ce jest do\u015b\u0107 sporo r\u00f3\u017cnic mi\u0119dzy j\u0119zykiem typowanym dynamicznie a typowanym statycznie. Cho\u0107 pozory myl\u0105 &#8211; je\u015bli kto\u015b pisa\u0142 ju\u017c par\u0119 lat w PHP i operator <em>===<\/em> nie jest mu obcy, wraz z praktycznym wykorzystaniem, to &#8211; w pewnym sensie &#8211; pracowa\u0142 z pewnego rodzaju hybryd\u0105.<\/p>\n<p>A je\u015bli, siadaj\u0105c do C++, si\u0119 troch\u0119 zapomina\u0142, to o dobrych manierach natychmiast przypomina\u0142 mu kompilator. Czasem te\u017c i <em>access violation<\/em>, co si\u0119 nieraz zdarza\u0142o. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Wracaj\u0105c &#8211; z mojego punktu widzenia najbardziej dawa\u0142o popali\u0107 tworzenie mi\u0119dzymordzia (GUI) poprzez WinAPI. Lito\u015bci, dziesi\u0105tki funkcji, parametr\u00f3w, kt\u00f3rych sk\u0142adnia mia\u0142a chyba tylko zwi\u0119kszy\u0107 zarobki programist\u00f3w, nieraz i dziwnych nazw. Arghhh&#8230;<\/p>\n<p>No i ogromnym nieporozumieniem by\u0142oby, gdybym nie wspomnia\u0142 tu o MFC. Nie bardzo pa\u0142am ch\u0119ci\u0105 gadania o MFC, bo jak tylko pomy\u015bl\u0119 o Visual Studio, o tym, jaki \u015bmietnik robi w systemie podczas instalacji&#8230; Ech, teraz nie zasn\u0119, na pewno nie. Developerzy MSVS chyba zapomnieli o regule KISS&#8230; Dlaczego dobre IDE nie mog\u0105 by\u0107 pisane po ludzku &#8211; Eclipse\/NetBeans w Javie, VisualStudio te\u017c koby\u0142a&#8230;<\/p>\n<p>Szukaj\u0105c jakiego\u015b remedium, przypomnia\u0142em sobie, \u017ce obi\u0142o mi si\u0119 kiedy\u015b o uszy co\u015b takiego jak Qt. Fani KDE pewnie teraz przetarli oczy. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_tongue.png\" alt=\":P\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Co ciekawe, prowadz\u0105cy w og\u00f3le nie s\u0142ysza\u0142 o Qt, co mnie zdziwi\u0142o&#8230;<\/p>\n<h3>s\u0142odkie?<\/h3>\n<p>Po moich dotychczasowych przygodach z C\/C++ nie podchodzi\u0142em do projektu z jakim\u015b szczeg\u00f3lnym entuzjazmem. Jednak perspektywa zwolnienia z egzaminu sukcesywnie popycha\u0142a do rozgrzebania tematu na cz\u0119\u015bci pierwsze i kolejnych pr\u00f3b. Poczyta\u0142em troch\u0119 na temat Qt z nakierowaniem na fakt, \u017ce mi\u0119dzymordzie projektowa\u0142o si\u0119 prawie jak w Delphi &#8211; graficznie.<\/p>\n<p>Ale nie przesadzajmy, to nie mo\u017ce by\u0107 wyznacznik wyboru biblioteki (cho\u0107 na pewno to mia\u0142o jaki\u015b wp\u0142yw).<\/p>\n<p>Urzek\u0142o mnie, natomiast, dodawanie obiekt\u00f3w oraz widget\u00f3w (w windowsowej nomenklaturze &#8211; kontrolek). To by\u0142o dok\u0142adnie to, czego szuka\u0142em:<\/p>\n<p><code lang=\"cpp\">QLabel *label = new QLabel(this);<br \/>\nlabel->setText(\"zuo\");<br \/>\nthis->addChild(label);<\/code><\/p>\n<p>Nie do\u015b\u0107, \u017ce bardziej intuicyjnie, to tego typu forma od razu przypomnia\u0142a mi zas\u0142yszan\u0105 refleksj\u0119: jednym z najlepszych jest samodokumentuj\u0105cy si\u0119 kod. I powy\u017cszy, moim zdaniem, spe\u0142nia to za\u0142o\u017cenie &#8211; patrz\u0119 i widz\u0119, co kod robi. No to teraz zobaczmy, jak w MFC wygl\u0105da kod realizuj\u0105cy podobn\u0105 funkcj\u0119:<\/p>\n<p><code lang=\"cpp\">CStatic *lblPresent = new CStatic;<br \/>\nlblPresent->Create(L\"Present\", WS_CHILD | WS_VISIBLE, CRect(20, 20, 100, 40), this);<\/code><\/p>\n<p>Im wi\u0119cej patrz\u0119 na ten kod, tym bardziej czuje si\u0119 g\u0142upi. Hmm, rozpracowuj\u0105c to teraz metod\u0105 naukow\u0105 na-zdrowy-ch\u0142opski-rozum: no ok, tworz\u0119 sobie obiekt zwany <em>CStatic<\/em>. Hej, ale po kiego <em>Create<\/em>, skoro konstruktor ju\u017c wywo\u0142a\u0142em? Eeee, musz\u0119 go dodatkowo pokazywa\u0107, skoro w 90% przypadk\u00f3w ten tekst b\u0119d\u0119 chcia\u0142 wy\u015bwietli\u0107 od razu? No c\u00f3\u017c, ka\u017cdy ma swoje w\u0142asne upodobania, ale zdecydowanie wol\u0119 t\u0119 pierwsz\u0105 filozofi\u0119 wstawiania obiekt\u00f3w.<\/p>\n<p>Wracaj\u0105c do Qt. Zanim zabra\u0142em si\u0119 do pisania czegokolwiek, postanowi\u0142em przejrze\u0107 list\u0119 dostarczanych klas. Z\u0142apa\u0142em si\u0119 za g\u0142ow\u0119. A\u017c tyle? Jest scyzoryk? Nie ma? <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_sad.png\" alt=\":(\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Najlepsze jest to, \u017ce wi\u0119kszo\u015bci z nich nie trzeba jako\u015b specjalnie inicjowa\u0107. Wystarczy zadeklarowanie zmiennej typu danej klasy. Naprawd\u0119 nie trzeba stawa\u0107 na g\u0142owie, \u017ceby np. zapisa\u0107 ustawienia naszego programu. Wystarczy klasa <em>QSettings<\/em>, a ona wykona ca\u0142\u0105 brudn\u0105 robot\u0119 polegaj\u0105c\u0105 na obs\u0142udze kontenera ustawie\u0144 (czyli dodawanie, kasowanie, pilnowanie formatu, etc), czy zwracaniu odpowiednich danych na potrzeby naszej aplikacji. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Co najwa\u017cniejsze, Qt pozwala na uniezale\u017cnienie aplikacji od systemu operacyjnego.<\/p>\n<h3>pu\u015b\u0107 mi sygna\u0142<\/h3>\n<p>Co\u015b, co mnie z pocz\u0105tku zdziwi\u0142o\/zaskoczy\u0142o\/mo\u017ce i zniesmaczy\u0142o, to filozofia sygna\u0142\u00f3w i slot\u00f3w. A gdybym zamiast tego powiedzia\u0142 <em>event binding<\/em>, to czy, drogi javascriptowcu, znajdziemy wsp\u00f3lny j\u0119zyk? <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> No pewnie, \u017ce si\u0119 dogadamy. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>O ile w MFC s\u0105 osobne metody dla ka\u017cdego zdarzenia, to w Qt dzia\u0142amy na zasadzie sygna\u0142\u00f3w i slot\u00f3w. Nazwa koszmarna, ale w dzia\u0142aniu r\u00f3wnie sympatyczne, co podpinanie akcji w JS. Sygna\u0142, to zdarzenie, slot &#8211; <em>handler<\/em>. Czyli trzeba uwzgl\u0119dni\u0107 do\u015b\u0107 istotny aspekt &#8211; spos\u00f3b projektowania naszego programu musimy uzale\u017cni\u0107 od tego, \u017ce kod danej funkcji\/metody nie b\u0119dzie wykonywany synchronicznie.<\/p>\n<p>Czyli np:<br \/>\n<code lang=\"cpp\">connect(this->worker, SIGNAL(finished(QNetworkReply *)), &this, SLOT(workerReply(QNetworkReply *)));<br \/>\nQNetworkReply *reply = this->worker->get(req);<br \/>\nqDebug() << \"asdasd\";\n<\/code><\/p>\n<p>nie sprawi, \u017ce do okienka debugowania tekst zostanie dodany dopiero po zako\u0144czeniu \u017c\u0105dania sieciowego. Zostatnie dodany wg wywo\u0142ania w kodzie. Ma to swoje zalety (m.in. mo\u017cliwo\u015b\u0107 podpi\u0119cia kilku slot\u00f3w do jednego sygna\u0142u, \u0142atwo\u015b\u0107 zmiany zdarze\u0144), ale te\u017c i wady, jak konieczno\u015b\u0107 zagnie\u017cd\u017cania wielu funkcji mi\u0119dzy sob\u0105. Je\u015bli zg\u0142\u0119bi\u0142e\u015b zagadnienie kolejek animacji w jQuery, to pewnie my\u015blisz teraz o <em>queue()\/dequeue()<\/em>. Dobrze my\u015blisz. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><code lang=\"cpp\">QNetworkReply *reply = this->worker->get(req);<\/p>\n<p>\/\/ and force it to be synchronous<br \/>\nQEventLoop eventLoop;<br \/>\nQObject::connect(this->worker, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));<br \/>\neventLoop.exec();<\/code><\/p>\n<h3>\u015brodowisko<\/h3>\n<p>D\u0142ugo si\u0119 zastanawia\u0142em nad tym, jakiego \u015brodowiska u\u017cy\u0107. Visual Studio odpada, DevCpp stare i jakie\u015b toporne, Code::Blocks jako\u015b mnie nie przekona\u0142o. Pocz\u0105tkowo, cz\u0142owiek g\u0142upi (czytaj: bez wiedzy), \u015bci\u0105ga ca\u0142e SDK. Jak si\u0119 okaza\u0142o, pierwotna g\u0142upota jednak pop\u0142aci\u0142a. W paczce jest, bowiem, tw\u00f3r nazwany QtCreator. S\u0142ysza\u0142em kiedy\u015b o graficznym narz\u0119dziu do projektowania mi\u0119dzymordzia, ale ca\u0142ym IDE ju\u017c nie. A to mi\u0142a niespodzianka.<\/p>\n<p>Zaraz po uruchomieniu, \u015brodowisko sprawia bardzo dobre wra\u017cenie - jest po prostu estetyczne.<\/p>\n<p><!-- group 1 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-1.jpg\" rel=\"imagebox-1\" title=\"\"><img decoding=\"async\" src=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-1-thumb.jpg\" alt=\"Qt Creator\" style=\"width:160px;height:86px;\" \/><\/a> <\/p>\n<p>Na pewno nie jest to jaki\u015b wyznacznik - w ko\u0144cu Photoshop te\u017c na pocz\u0105tku wydaje si\u0119 toporny, ale po nauce jego obs\u0142ugi - staje si\u0119 bardzo wygodny.<\/p>\n<p>Qt Creator jest po prostu minimalistyczny. W zupe\u0142no\u015bci wystarczaj\u0105ce do napisania jakiej\u015b aplikacji. Sprawia wra\u017cenie do\u015b\u0107 prostego, ale mo\u017cna si\u0119 doszuka\u0107 wszystkich niezb\u0119dnych opcji. A najbardziej zaskoczy\u0142a mnie wbudowana obs\u0142uga Doxygen, Git oraz Mercurial. No i mo\u017cna wszystko rozszerza\u0107 wtyczkami.<\/p>\n<p>Moim zdaniem, du\u017co lepiej zosta\u0142a tu rozwi\u0105zana kwestia zintegrowania dokumentacji. Jest to po prostu kolejny panel w oknie programu. Szkoda tylko, \u017ce nie bardzo si\u0119 da zmieni\u0107 jego lokalizacj\u0119.<\/p>\n<p><!-- group 2 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-2.jpg\" rel=\"imagebox-2\" title=\"\"><img decoding=\"async\" src=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-2-thumb.jpg\" alt=\"Qt Creator\" style=\"width:160px;height:86px;\" \/><\/a> <\/p>\n<p>Oczywi\u015bcie podpowiadanie i uzupe\u0142nianie kodu musi by\u0107. Inaczej by nie mo\u017cna by\u0142o okre\u015bli\u0107 Qt Creatora mianem IDE.<\/p>\n<p>Patrz\u0105c na list\u0119 wtyczek, nie spos\u00f3b oprze\u0107 si\u0119 wra\u017ceniu, \u017ce Qt Creator jest czym\u015b w stylu Eclipse - tak naprawd\u0119, to platforma dla rozszerze\u0144 obs\u0142uguj\u0105cych konkretne j\u0119zyki\/\u015brodowiska. Cho\u0107 QTC brakuje jednak popularno\u015bci. Szkoda, gdy\u017c \u015brodowisko jest bardzo przyzwoite i nie zdarzy\u0142o mi si\u0119, aby \"zamula\u0142o\" (jak to bywa\u0142o nieraz w przypadku Eclipse\/NetBeans).<\/p>\n<p><!-- group 3 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-3.png\" rel=\"imagebox-3\" title=\"\"><img decoding=\"async\" src=\"\/weblog\/stuff\/slodkaeur-znaczy-qt-blip-qblip-3-thumb.jpg\" alt=\"Qt Creator\" style=\"width:160px;height:108px;\" \/><\/a> <\/p>\n<p>I na koniec, kosmetyka \u015brodowiska. Delikatne animacje interfejsu po prostu ciesz\u0105 oko. Na dodatek, nie obci\u0105\u017caj\u0105 procesora.<\/p>\n<p>Niech kto\u015b zrobi plugina do PHP... <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<h3>aplikacja na projekt<\/h3>\n<p>Nosi\u0142em si\u0119 kiedy\u015b z zamiarem napisania natywnego klienta Blipa. Postanowi\u0142em po\u0142\u0105czy\u0107 oba zadania - zaliczenie projektu oraz napisanie aplikacji dost\u0119powej do tego serwisu. Uda\u0142o mi si\u0119 nam\u00f3wi\u0107 koleg\u0119 z roku, Vandervira i tak zacz\u0119li\u015bmy prace nad QBlipem. I nawet co\u015b zacz\u0119\u0142o z tego wychodzi\u0107. Zapraszam na stron\u0119 <a href=\"http:\/\/code.google.com\/p\/qblip\">QBlip<\/a>a na Google Code. \u0179r\u00f3d\u0142a na licencji Apache. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Wi\u0119cej nie ma si\u0119 chyba co rozpisywa\u0107 w tym miejscu.<\/p>\n<h3>nie wszystko z\u0142oto...<\/h3>\n<p>Pisanie w Qt ma z pewno\u015bci\u0105 sporo zalet. Ale nie ma idea\u0142\u00f3w, pora na wady.<\/p>\n<ul>\n<li>W przypadku Windows, konieczno\u015b\u0107 dystrybuowania DLL-i uruchomieniowych Qt, kt\u00f3re troch\u0119 zajmuj\u0105. Za to prawie ka\u017cdy linuksiarz ma zainstalowane Qt w swoim systemie. W przypadku MFC jest dok\u0142adnie na odwr\u00f3t. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/li>\n<li>Niekt\u00f3re - z punktu widzenia programisty - b\u0142ahostki s\u0105 czasem ci\u0119\u017ckie do zrealizowania. O ile np. obs\u0142uga HTTP jest ca\u0142kiem przyzwoita, to wys\u0142anie pliku przez POST wymaga r\u0119cznego konstruowania \u017c\u0105dania. Ale nie s\u0105 to jakie\u015b szczeg\u00f3lnie m\u0119cz\u0105ce problemy.<\/li>\n<li>By\u0142o troch\u0119 zachodu z uzyskaniem prawid\u0142owo dzia\u0142aj\u0105cych polskich diakrytyk\u00f3w. Jedna linijka zdzia\u0142a\u0142a cudo:<br \/>\n<code lang=\"cpp\">QTextCodec::setCodecForCStrings(QTextCodec::codecForName(\"UTF-8\"));<\/code><\/li>\n<li>Na pocz\u0105tku przygody z Qt do\u015b\u0107 mocno daj\u0105 popali\u0107 b\u0142\u0119dy z rodziny <em>ld exit status<\/em>. W 99% przypadk\u00f3w wynika to z braku do\u0142\u0105czenia odpowiednich bibliotek w pliku <em>projekt.pro<\/em>, a konkretniej w linijce<br \/>\n<code lang=\"text\">QT       += core gui script network<\/code><\/li>\n<li>I na koniec - nie mia\u0142em wystarczaj\u0105co determinacji, ale nie uda\u0142o mi si\u0119 zmusi\u0107 debuggera do wsp\u00f3\u0142pracy.<\/li>\n<\/ul>\n<p>O Qt napisz\u0119 pewnie jeszcze nieraz, ale mog\u0119 z pewno\u015bci\u0105 powiedzie\u0107 jedno: Delphi w\u0142a\u015bnie odesz\u0142o w odstawk\u0119. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programowanie, to stan umys\u0142u &#8211; b\u0119d\u0119 zawsze to powtarza\u0142. Da si\u0119 to pozna\u0107 ju\u017c w pierwszych paru minutach rozmowy z kim\u015b uwa\u017caj\u0105cym si\u0119 za kodera. Naprawd\u0119 &#8211; konstrukcja u\u017cywanych funkcji zdaniowych wymienianych przez programist\u00f3w podczas rozmowy &#8222;na temat&#8221; jest do\u015b\u0107 specyficzna i pomimo wcale-nie-takich-trudnych zwrot\u00f3w &#8211; dla zwyk\u0142ego \u015bmiertelnika jest do\u015b\u0107 dziwna. Ale nie o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,1],"tags":[131,130],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/235"}],"collection":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/comments?post=235"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/235\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}