{"id":34626,"date":"2019-10-31T21:59:30","date_gmt":"2019-10-31T18:59:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kodim-pitstsa\/"},"modified":"2019-10-31T21:59:30","modified_gmt":"2019-10-31T18:59:30","slug":"kodim-pitstsa","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/news\/kodim-pitstsa","title":{"rendered":"K\u00f3dujeme \u2013 pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, Habr. N\u00e1hodou jsme uspo\u0159\u00e1dali prvn\u00ed intern\u00ed hackathon. Rozhodla jsem se pod\u011blit o sv\u00e9 bolesti a z\u00e1v\u011bry z p\u0159\u00edpravy na n\u011bj b\u011bhem dvou t\u00fddn\u016f, stejn\u011b jako o projektech, kter\u00e9 vznikly.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/938168da11e489bcf2112a11bc3f220e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nudn\u00e1 \u010d\u00e1st pro ty, kdo se zaj\u00edmaj\u00ed o marketing.<\/h2>\n<p>\nZa\u010dnu mal\u00fdm p\u0159\u00edb\u011bhem. <\/p>\n<p>Za\u010d\u00e1tek dubna. V na\u0161\u00ed kancel\u00e1\u0159i prob\u00edh\u00e1 prvn\u00ed hackathon MskDotNet Community. Bitva o Tatooine je v pln\u00e9m proudu, tentokr\u00e1t v na\u0161\u00ed galaxii. Sobota. 20 t\u00fdm\u016f. Pizza. V\u0161echno je velmi p\u0159\u00edjemn\u00e9 (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">d\u016fkazy<\/a><\/noindex>). Nafukovac\u00ed R2-D2 se mot\u00e1 po s\u00e1le. T\u00fdmy p\u00ed\u0161\u00ed ty nejlep\u0161\u00ed algoritmy, aby zvl\u00e1dly nejnebezpe\u010dn\u011bj\u0161\u00ed z\u00e1vod na map\u011b. Posunujeme start prvn\u00edch z\u00e1vod\u016f. Su\u0161enky a k\u00e1va n\u00e1m pom\u00e1haj\u00ed. S organiz\u00e1tory jsme o\u010dek\u00e1vali, \u017ee v sobotu mnoz\u00ed odejdou po ob\u011bd\u011b. Ale ne. 12 hodin k\u00f3dov\u00e1n\u00ed za n\u00e1mi. Fin\u00e1le. N\u011bco se odpojuje, n\u011bco nenastartuje. Ale v\u0161ichni jsou \u0161\u0165astn\u00ed. Vyhr\u00e1v\u00e1 n\u00e1\u0161 t\u00fdm. Jsme \u0161\u0165astn\u00ed dvojn\u00e1sobn\u011b. <\/p>\n<p>Sd\u00edl\u00edm radost na Slacku a do hlavy se mi dostane my\u0161lenka: \u201eMus\u00edme uspo\u0159\u00e1dat sv\u016fj hackathon.\u201d P\u00ed\u0161u na\u0161emu CTO Sa\u0161ovi. Ticho. <\/p>\n<p>R\u00e1no. Piji k\u00e1vu v kancel\u00e1\u0159i. Vid\u00edm Sa\u0161u p\u0159ich\u00e1zet zezadu. \u201eLizo, to je skv\u011bl\u00e9! M\u00e1me p\u0159esn\u011b 21. dubna d\u016fle\u017eit\u00fd term\u00edn. Poj\u010fme to ud\u011blat!\u201d Co\u017ee!? Tak rychle? A? Co? Mus\u00edm let\u011bt do Syktyvkaru na st\u00e1\u017e v polovin\u011b dubna. Ale ka\u0161lu na to! Poj\u010fme.<\/p>\n<p>Zb\u00fdv\u00e1 2 t\u00fddny. Nikdy jsem nebyla jedin\u00fdm organiz\u00e1torem hackathonu. I kdy\u017e je to intern\u00ed. \u010ctu \u010dl\u00e1nky na toto t\u00e9ma. \u0160\u00edlen\u00e9. Pot\u0159ebuje to n\u011bkolik m\u011bs\u00edc\u016f. Pot\u0159ebuje to n\u011bkolik lid\u00ed. Je t\u0159eba promyslet merch, ceny, podm\u00ednky, harmonogram, zaujmout, pochopit c\u00edl, rozpo\u010dty. A mo\u017en\u00e1 se dokonce zamyslet nad smyslem \u017eivota. Ur\u010dit\u011b to nezvl\u00e1dnu. A zat\u00edmco jsi \u010detl a p\u0159ipravoval se, u\u017e uplynul t\u00fdden. Nejvy\u0161\u0161\u00ed \u010das zahodit \u010dl\u00e1nky a za\u010d\u00edt n\u011bco d\u011blat. <\/p>\n<p><b class=\"spoiler_title\">Zde je n\u00e1\u0161 checklist pro uspo\u0159\u00e1d\u00e1n\u00ed intern\u00edho hackathonu za 1 t\u00fdden.<\/b><\/p>\n<ul>\n<li><b>Pl\u00e1n<\/b>: v klidu si sedni a napi\u0161 seznam toho, co je t\u0159eba ud\u011blat pro hackathon. <i>30 minut<\/i>.<\/li>\n<li><b>\u00dakol<\/b>: \u00fa\u010dastn\u00edci sami navrhuj\u00ed a vyb\u00edraj\u00ed projekty, kter\u00e9 cht\u011bj\u00ed vytvo\u0159it v Google Sheets. <i>Pozad\u00ed \u00fakolu, 2 hodiny.<\/i>.<\/li>\n<li><b>Harmonogram<\/b>: na koleno nap\u00ed\u0161 kr\u00e1tk\u00e9 rozvr\u017een\u00ed \u010dasu s ohledem na 3 p\u0159est\u00e1vky a fin\u00e1le. <i>20 minut<\/i>.<\/li>\n<li><b>P\u0159\u00edkazy<\/b>: zve\u0159ejni zpr\u00e1vu o hackathonu s harmonogramem od CTO v IT kan\u00e1lech na Slacku\/e-mailu\/etc. a vytvo\u0159 zvl\u00e1\u0161tn\u00ed kan\u00e1l pro hackathon. V n\u011bm se v\u0161ichni rozd\u011bl\u00ed do t\u00fdm\u016f, a ti, kdo se nerozhodli, to ud\u011blaj\u00ed b\u011bhem prvn\u00edch 5 minut hackathonu. <i>Pozad\u00ed \u00fakolu, 2 hodiny.<\/i>.<\/li>\n<li><b>Bonusy<\/b>: P\u0159em\u00fd\u0161l\u00ed\u0161 o merchandise se dv\u011bma v\u00fdvoj\u00e1\u0159i, p\u0159ed\u00e1v\u00e1\u0161 to designerovi na n\u00e1vrh, dost\u00e1v\u00e1\u0161 hotov\u00e9. <i>Pozad\u00ed \u00fakol, 3 dny<\/i>.<\/li>\n<li><b>Hackathon<\/b>: P\u0159\u00edjde\u0161 do kancel\u00e1\u0159e, v za\u010d\u00e1tku koordinuje\u0161 v\u0161echny, zab\u00fdv\u00e1\u0161 se sv\u00fdmi v\u011bcmi, \u010dte\u0161 Reddit, v\u00e1\u017en\u00fdm t\u00f3nem oznamuje\u0161 ka\u017edou pauzu o \u010derstv\u00e9 pizze, fot\u00ed\u0161 z\u00e1pad slunce, vyhla\u0161uje\u0161 fin\u00e1le, spole\u010dn\u011b hlasujete a vyb\u00edr\u00e1te v\u00edt\u011bze. <i>1 den<\/i>.<\/li>\n<li><b>Pod hv\u011bzdi\u010dkou<\/b>: Samoz\u0159ejm\u011b neust\u00e1le p\u0159em\u00fd\u0161l\u00ed\u0161 o tom, aby v\u0161e prob\u00edhalo dob\u0159e. Ur\u010dit\u011b ne ka\u017ed\u00fd uvid\u00ed tvou zpr\u00e1vu a s n\u011bkter\u00fdmi je lep\u0161\u00ed mluvit osobn\u011b. Samoz\u0159ejm\u011b, pokud ti n\u011bkdo bude pom\u00e1hat, v\u0161echno bude dvakr\u00e1t jednodu\u0161\u0161\u00ed (pom\u00e1hala mi \u00fa\u017easn\u00e1 Alena).<\/li>\n<\/ul>\n<h2>M\u00e9n\u011b nudn\u00e1 \u010d\u00e1st o datu hackathonu<\/h2>\n<p>\nPro\u010d 21. dubna? Tento den je pro n\u00e1s v\u00fdznamn\u00fd. P\u0159esn\u011b p\u0159ed rokem, 21. dubna, jsme padli pod z\u00e1t\u011b\u017e\u00ed b\u011bhem prvn\u00edho v\u00edkendu po startu Feder\u00e1ln\u00ed reklamn\u00ed kampan\u011b. N\u00e1sleduj\u00edc\u00ed den, v ned\u011bli, byla na\u0161e t\u00fdm v pr\u00e1ci od 8 r\u00e1no. Tenkr\u00e1t jsme vytvo\u0159ili na Trellu desku sundayhackathon a za\u010dal t\u00fdden sm\u011bnn\u00e9 pr\u00e1ce po 12 hodin ka\u017ed\u00fd den. Situace byla tak kritick\u00e1, \u017ee jsme ani nem\u011bli \u010das j\u00edst a kluci z jin\u00fdch t\u00fdm\u016f n\u00e1s krmili.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodrobn\u011bj\u0161\u00ed p\u0159\u00edb\u011bh si m\u016f\u017eete p\u0159e\u010d\u00edst na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">str\u00e1nce Fjodora Ov\u010dinnikova<\/a><\/noindex> (na\u0161eho CEO). Od t\u00e9 doby jsme hodn\u011b zm\u011bnili, ale tuto datum ur\u010dit\u011b nezapomeneme.<\/p>\n<p>Letos jsme se rozhodli, \u017ee tuto akci stoj\u00ed za to uchovat v pam\u011bti budouc\u00edch generac\u00ed a v nejlep\u0161\u00edch tradic\u00edch jsme uspo\u0159\u00e1dali prvn\u00ed v historii Dodo intern\u00ed hackathon, kter\u00fd trval 10 hodin. <\/p>\n<h2>Nejnudn\u011bj\u0161\u00ed \u010d\u00e1st o projektech hackathonu<\/h2>\n<p>\n<i>Upozorn\u011bn\u00ed: v\u0161echny popisy psali kluci sami, tak\u017ee autorstv\u00ed textu nen\u00ed moje.<\/i><\/p>\n<h4>Oleg L\u00ebrning (strojov\u00e9 u\u010den\u00ed)<\/h4>\n<p>\n<i>Dima Ko\u010dnev, Sa\u0161a Andronov (@alexandronov)<\/i><\/p>\n<p>Cht\u011bli jsme vytvo\u0159it neuronovou s\u00ed\u0165, kter\u00e1 by ur\u010dovala, co je za pizza na fotografii bez jak\u00fdchkoli znalost\u00ed. Nakonec jsme ud\u011blali velmi jednoduchou a hrac\u00ed \u2013 rozpozn\u00e1v\u00e1 10 pizz, p\u0159ibli\u017en\u011b jsme pochopili, jak to v\u0161echno funguje, jak je to mo\u017en\u00e9 za den (~10 hodin).<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKonkr\u00e9tn\u011b jsme pochopili, \u017ee pr\u016fmysl dos\u00e1hl \u00farovn\u011b, kdy b\u011b\u017en\u00fd v\u00fdvoj\u00e1\u0159 m\u016f\u017ee vz\u00edt hotov\u00e9 knihovny, p\u0159e\u010d\u00edst dokumentaci a vy\u0161kolit svou neuronovou s\u00ed\u0165 bez hlubok\u00fdch znalost\u00ed p\u0159edm\u011btu. A bude fungovat dost dob\u0159e pro \u0159e\u0161en\u00ed re\u00e1ln\u00fdch \u00faloh.<\/p>\n<p>N\u00e1stroje, kter\u00e9 jsme pou\u017e\u00edvali: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 pohodln\u00e1 a jednoduch\u00e1 knihovna pro pr\u00e1ci s strojov\u00fdm u\u010den\u00edm a po\u010d\u00edta\u010dov\u00fdm vid\u011bn\u00edm.<\/li>\n<li>Vyzkou\u0161eli jsme dva modely \u2013 ResNet50, Yolo.<\/li>\n<li>K\u00f3d jsme psali, jak jinak, v Pythonu.<\/li>\n<\/ul>\n<p>\nM\u011bli jsme 11000 fotek, ale t\u00e9m\u011b\u0159 3\/4 z nich se uk\u00e1zaly jako odpad, a ve zb\u00fdvaj\u00edc\u00edch byly r\u016fzn\u00e9, nevhodn\u00e9 \u00fahly. Nakonec jsme vzali hotov\u00fd model (kter\u00fd jen um\u00ed naj\u00edt pizzu) a s jeho pomoc\u00ed jsme odd\u011blili ten nejhor\u0161\u00ed obsah. D\u00e1le, v n\u00e1zvu fotky bylo jm\u00e9no pizzy \u2014 tak jsme to rozt\u0159\u00eddili do slo\u017eek, ale uk\u00e1zalo se, \u017ee n\u00e1zvy neodpov\u00eddaj\u00ed skute\u010dnosti a museli jsme to ru\u010dn\u011b upravit. Nakonec zbylo asi 500-600 fotek, co\u017e je o\u010dividn\u011b zanedbateln\u00e9 mno\u017estv\u00ed, ale p\u0159esto to bylo dost, abychom odli\u0161ili 10 pizz od sebe.<\/p>\n<p>Pro tr\u00e9nink s\u00edt\u011b jsme vzali nejlevn\u011bj\u0161\u00ed virtu\u00e1ln\u00ed stroj v Azure s NVIDIA Tesla K80. Na n\u011bm jsme tr\u00e9novali po 100 epoch, ale bylo vid\u011bt, \u017ee s\u00ed\u0165 se ji\u017e po 50 epoch\u00e1ch p\u0159et\u00ed\u017eila, proto\u017ee dataset byl mal\u00fd.<\/p>\n<p>A vlastn\u011b \u2014 cel\u00fdm probl\u00e9mem je nedostatek kvalitn\u00edch dat.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMy jsme mo\u017en\u00e1 trochu zamotali term\u00edny, ale je t\u0159eba vz\u00edt v \u00favahu, \u017ee nem\u00e1me \u017e\u00e1dn\u00e9 zku\u0161enosti s prac\u00ed na v\u0161ech t\u011bchto v\u011bcech.<\/p>\n<h4>GUI for NOOBS (konzole pro objedn\u00e1n\u00ed pizzy)<\/h4>\n<p>\n<i>Misha Kumachev (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/ceridan\/\" class=\"user_link\">Ceridan<\/a><\/noindex>), Zhenya Bikkinin, Zhenya Vasiliev<\/i><\/p>\n<p>Sestavili jsme prototyp konzolov\u00e9 aplikace pro geeky, d\u00edky kter\u00e9mu lze objednat pizzu p\u0159es termin\u00e1l nebo p\u0159\u00edkazov\u00fd \u0159\u00e1dek, nebo dokonce integrovat do deployment pipeline a p\u0159i \u00fasp\u011b\u0161n\u00e9m vyd\u00e1n\u00ed doru\u010dit pizzu do kancel\u00e1\u0159e.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPr\u00e1ce se rozd\u011blila na n\u011bkolik \u010d\u00e1st\u00ed: zkoumali jsme, jak funguje na\u0161e API pro mobiln\u00ed aplikace, vytv\u00e1\u0159eli jsme vlastn\u00ed CLI s pomoc\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> a nastavovali publikaci n\u00e1mi vytvo\u0159en\u00e9ho bal\u00ed\u010dku. S posledn\u00edm \u00fakolem jsme m\u011bli p\u00e1r nep\u0159\u00edjemn\u00fdch chvil bl\u00edzko konce hackathonu. M\u011blo n\u00e1m to v\u0161echno fungovat lok\u00e1ln\u011b a dokonce i star\u00e9 publikovan\u00e9 verze bal\u00ed\u010dku fungovaly, ale nov\u00e9 (do kter\u00fdch bylo p\u0159id\u00e1no v\u00edce skv\u011bl\u00fdch funkc\u00ed a emotikon\u016f) necht\u011bly fungovat. Str\u00e1vili jsme asi 40 minut t\u00edm, abychom pochopili, co se stalo, ale nakonec to n\u011bjak magicky za\u010dalo fungovat samo).<\/p>\n<p>Na\u0161\u00edm maxim\u00e1ln\u00edm c\u00edlem na hackathonu byl skute\u010dn\u00fd objedn\u00e1vka pizzy do kancel\u00e1\u0159e p\u0159es na\u0161e CLI. Desetkr\u00e1t jsme v\u0161echno testovali na zku\u0161ebn\u00edm m\u00edst\u011b, ale stejn\u011b jsem m\u011bl nervy, kdy\u017e jsem zad\u00e1val p\u0159\u00edkazy na produkci.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNakonec \u2014 p\u0159ece jsme to dok\u00e1zali!<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/c966b190a6fe8a2f88a3973305cd03fb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>CourierGo<\/h4>\n<p>\n<i>Anton Bruzhmelov (autor), Vanya Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrey Sarafanov<\/i><\/p>\n<p>Vzali jsme my\u0161lenku \u201eAplikace pro kur\u00fdra\u201c.<\/p>\n<p><b class=\"spoiler_title\">Pozad\u00ed p\u0159\u00edpravy.<\/b>Nejprve jsem uva\u017eoval, jak\u00e9 vlastn\u011b funkce by mohly b\u00fdt v aplikaci? Vznikl zhruba takov\u00fd seznam funkcionality:<\/p>\n<ul>\n<li>Aplikace se p\u0159ihl\u00e1s\u00ed do pokladny dopravy pomoc\u00ed k\u00f3du.<\/li>\n<li>V aplikaci jsou ihned vid\u011bt dostupn\u00e9 objedn\u00e1vky a objedn\u00e1vky, kter\u00e9 je t\u0159eba vz\u00edt.<\/li>\n<li>Kur\u00fdr ozna\u010d\u00ed objedn\u00e1vku a vezme ji na cestu.<\/li>\n<li>Jsou mu zobrazeny odhadovan\u00e9 \u010dasy a zda stihne objedn\u00e1vku nebo ne.<\/li>\n<li>Z\u00e1kazn\u00edkovi se zobrazuje, \u017ee kur\u00fdr vyjel.<\/li>\n<li>Z\u00e1kazn\u00edkovi se za\u010dne zobrazovat poloha kur\u00fdra na map\u011b a odhadovan\u00fd \u010das.<\/li>\n<li>Kur\u00fdr m\u016f\u017ee napsat z\u00e1kazn\u00edkovi do chatu z aplikace.<\/li>\n<li>Z\u00e1kazn\u00edk m\u016f\u017ee napsat kur\u00fdrovi do chatu z aplikace.<\/li>\n<li>P\u011bt minut p\u0159ed p\u0159\u00edjezdem z\u00e1kazn\u00edk dostane zpr\u00e1vu, \u017ee kur\u00fdr je bl\u00edzko, bu\u010fte p\u0159ipraveni.<\/li>\n<li>Kur\u00fdr v aplikaci ozna\u010duje, \u017ee p\u0159ijel a \u010dek\u00e1.<\/li>\n<li>Kur\u00fdr m\u016f\u017ee z aplikace jedn\u00edm kliknut\u00edm zavolat a ozn\u00e1mit, \u017ee (p\u0159ich\u00e1z\u00ed, je pobl\u00ed\u017e apod.)<\/li>\n<li>Z\u00e1kazn\u00edk p\u0159ij\u00edm\u00e1 objedn\u00e1vku a zad\u00e1v\u00e1 PIN k\u00f3d z aplikace nebo SMS pro potvrzen\u00ed dod\u00e1n\u00ed (jako podpis). Aby kur\u00fdr nemohl dod\u00e1n\u00ed dokon\u010dit p\u0159ed\u010dasn\u011b, pokud m\u00e1 zpo\u017ed\u011bn\u00ed.<\/li>\n<li>Objedn\u00e1vka je v syst\u00e9mu ozn\u00e1mena jako dodan\u00e1.<\/li>\n<\/ul>\n<p>Plus p\u00e1r alternativn\u00edch sc\u00e9n\u00e1\u0159\u016f:<\/p>\n<ul>\n<li>Kur\u00fdr m\u016f\u017ee ozna\u010dit objedn\u00e1vku jako nedodanou a vybrat d\u016fvod.<\/li>\n<li>Kur\u00fdr m\u016f\u017ee p\u0159i zpo\u017ed\u011bn\u00ed jedn\u00edm kliknut\u00edm vydat elektronick\u00fd certifik\u00e1t prost\u0159ednictv\u00edm SMS. Nebo certifik\u00e1t p\u0159ijde automaticky p\u0159i nedodr\u017een\u00ed doby dod\u00e1n\u00ed.<\/li>\n<\/ul>\n<p>\nPocit perspektivity a pot\u0159ebnosti tohoto projektu samoz\u0159ejm\u011b nab\u00edjel.<\/p>\n<p>Druh\u00fd den jsme \u0161li s t\u00fdmem na ob\u011bd a probrali, jak bude vypadat minim\u00e1ln\u00ed funkcionalita aplikace. <\/p>\n<p>Nakonec se utvo\u0159il n\u00e1sleduj\u00edc\u00ed seznam toho, co bylo t\u0159eba stihnout na hackathonu:<\/p>\n<ul>\n<li>P\u0159ihl\u00e1\u0161en\u00ed do pokladny dopravy.<\/li>\n<li>Zobrazit aktu\u00e1ln\u00ed polohu.<\/li>\n<li>Odeslat data do extern\u00edho API (sou\u0159adnice, vzal objedn\u00e1vku, doru\u010dil objedn\u00e1vku).<\/li>\n<li>Z\u00edskat data z extern\u00edho API (aktu\u00e1ln\u00ed objedn\u00e1vky kur\u00fdra).<\/li>\n<li>Odeslat ud\u00e1lost o tom, \u017ee vzal objedn\u00e1vku k dod\u00e1n\u00ed\/doru\u010dil.<\/li>\n<li>Zobrazit aktu\u00e1ln\u00ed polohu kur\u00fdra na map\u011b na webov\u00fdch str\u00e1nk\u00e1ch.<\/li>\n<\/ul>\n<p>\nHlavn\u00ed pr\u00e1ce, jak se jevilo, byla v tvorb\u011b backendu, samotn\u00e9 aplikace (po diskus\u00edch jsme zvolili ReactNative pro v\u00fdvoj aplikace, p\u0159esn\u011bji obal nad n\u00edm \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, co\u017e umo\u017e\u0148uje v\u016fbec nepsat nativn\u00ed k\u00f3d). Co se t\u00fd\u010de backendu, p\u016fvodn\u011b jsme m\u011bli nad\u011bji na Vanyu Zvereva, kter\u00fd m\u011bl zku\u0161enosti s na\u0161\u00edm \u0161ablonov\u00fdm servisem a k8s (co\u017e vzal na sebe). ReactNative jsme vzali na zkou\u0161ku j\u00e1 a Andrej Sarafanov.<\/p>\n<p>Rozhodl jsem se hned vytvo\u0159it pracovn\u00ed repozit\u00e1\u0159 pro samotn\u00fd projekt. Ve 12 hodin v noci jsem narazil na probl\u00e9m, \u017ee v ReactNative \u0161patn\u011b funguje geolokace na pozad\u00ed, pokud se nenap\u00ed\u0161e nativn\u00ed k\u00f3d, a byl jsem trochu frustrovan\u00fd. Pot\u00e9 se to uvolnilo, kdy\u017e jsem si uv\u011bdomil, \u017ee \u010dtu dokumentaci pro framework expo.io, nikoli ReactNative. Nakonec jsem za ve\u010der u\u017e pochopil, jak v expo.io z\u00edskat aktu\u00e1ln\u00ed polohu a vykreslit samostatn\u00e9 obrazovky (pro p\u0159ihl\u00e1\u0161en\u00ed, zobrazen\u00ed objedn\u00e1vky atd.).<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e1no na hackatonu jsme nal\u00e1kali Gleb na n\u00e1\u0161 velmi perspektivn\u00ed projekt. Rychle jsme sestavili pl\u00e1n toho, co je t\u0159eba ud\u011blat.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUd\u011blali jsme chybu, kdy\u017e jsme se podle \u0161ablony projektu pokusili nav\u00e1zat komunikaci nikoli p\u0159es HTTP, ale p\u0159es GRPC, proto\u017ee nikdo nev\u011bd\u011bl, jak sestavit GRPC klienta pro JavaScript. Nakonec, po zhruba hodin\u011b a p\u016fl, jsme tuto my\u0161lenku opustili. Kv\u016fli tomu za\u010dali kluci na backendu p\u0159ed\u011bl\u00e1vat hotov\u00fd server z GRPC na WebApi. Po p\u016fl hodin\u011b se n\u00e1m kone\u010dn\u011b poda\u0159ilo nastavit komunikaci aplikace s backendem, co je z\u00e1zrak. Ale v t\u00e9\u017ee dob\u011b Gleb t\u00e9m\u011b\u0159 dokon\u010dil nasazen\u00ed do k8s a plus automatick\u00e9 nasazen\u00ed po commitu do masteru. \ud83d\ude42<\/p>\n<p>Jako \u00falo\u017ei\u0161t\u011b jsme zvolili MySQL, abychom neriskovali alespo\u0148 s datab\u00e1z\u00ed (byly my\u0161lenky na CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNakonec: <\/p>\n<ul>\n<li>Realizovali jsme ukl\u00e1d\u00e1n\u00ed aktu\u00e1ln\u00edch sou\u0159adnic kur\u00fdra z aplikace do datab\u00e1ze.<\/li>\n<li>P\u0159ipojili jsme RabbitMQ a p\u0159ihl\u00e1sili se k zpr\u00e1v\u00e1m o p\u0159evzet\u00ed objedn\u00e1vky kur\u00fdrem, abychom mohli okam\u017eit\u011b zobrazit objedn\u00e1vku u kur\u00fdra v aplikaci.<\/li>\n<li>Za\u010dali jsme si do datab\u00e1ze ukl\u00e1dat \u010das doru\u010den\u00ed objedn\u00e1vky, pot\u00e9 co kur\u00fdr stiskl tla\u010d\u00edtko v aplikaci. Nestihli jsme p\u0159idat odesl\u00e1n\u00ed ud\u00e1losti zp\u011bt do RabbitMQ, \u017ee objedn\u00e1vka byla doru\u010dena.<\/li>\n<li>Ud\u011blal jsem zobrazen\u00ed mapy na str\u00e1nce currentorder na webu s aktu\u00e1ln\u00ed polohou kur\u00fdra. Ale tato funk\u010dnost z\u016fstala tro\u0161ku nedokon\u010den\u00e1, proto\u017ee na prost\u0159ed\u00ed se nepoda\u0159ilo nastavit CORS pro z\u00edsk\u00e1n\u00ed sou\u0159adnic z na\u0161eho nov\u00e9ho servisu.<\/li>\n<\/ul>\n<p><\/p>\n<h4>M87<\/h4>\n<p>\n<i>Roma Boukin, Gosha Polevoy (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/georgepolevoy\/\" class=\"user_link\">georgepolevoy<\/a><\/noindex>), Artyom Trofimushkin<\/i><\/p>\n<p>Cht\u011bli jsme implementovat poskytovatele OpenID Connect, proto\u017ee v sou\u010dasnosti pou\u017e\u00edv\u00e1me vlastn\u00ed autentiza\u010dn\u00ed protokol, co\u017e p\u0159in\u00e1\u0161\u00ed \u0159adu obt\u00ed\u017e\u00ed: vlastn\u00ed klientsk\u00e9 knihovny, nepohodln\u00e1 spolupr\u00e1ce s extern\u00edmi partnery, mo\u017en\u00e9 probl\u00e9my s bezpe\u010dnost\u00ed (proto\u017ee OAuth 2.0 a OpenID Connect v referen\u010dn\u00ed implementaci lze pova\u017eovat za bezpe\u010dn\u00e9, zat\u00edmco u na\u0161eho \u0159e\u0161en\u00ed si t\u00edm nejsem tak jist\u00fd).<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVytvo\u0159ili jsme samostatnou slu\u017ebu emuluj\u00edc\u00ed \u00falo\u017ei\u0161t\u011b osobn\u00edch \u00fadaj\u016f, abychom vytvo\u0159ili mal\u00fd model Country-Agnostic poskytovatele autentizace, kter\u00fd by mohl z\u00edsk\u00e1vat osobn\u00ed \u00fadaje z t\u00e9to samostatn\u00e9 slu\u017eby (to by v budoucnu umo\u017enilo m\u00edt jednu slu\u017ebu, pomoc\u00ed kter\u00e9 by bylo mo\u017en\u00e9 p\u0159ihl\u00e1sit se pomoc\u00ed \u00fa\u010dtu v jak\u00e9koli zemi a z\u00e1rove\u0148 splnit po\u017eadavky GDPR a dal\u0161\u00edch p\u0159edpis\u016f). Tuto \u010d\u00e1st jsme provedli, stejn\u011b jako poskytovatele, a \u00fasp\u011b\u0161n\u011b je propojili. D\u00e1le bylo pot\u0159eba vytvo\u0159it API, kter\u00e9 by bylo chr\u00e1n\u011bno tokeny, kter\u00e9 vyd\u00e1v\u00e1 poskytovatel, podporovat jejich introspekci p\u0159es poskytovatele a vracet chr\u00e1n\u011bn\u00e1 data, pokud by \u017e\u00e1dost spl\u0148ovala politiky autorizace (ov\u011b\u0159ujeme, \u017ee u\u017eivatel je autentizov\u00e1n podle sch\u00e9matu Bearer, v jeho tokenu je ur\u010dit\u00fd rozsah + s\u00e1m u\u017eivatel m\u00e1 povolen\u00ed, kter\u00e9 umo\u017e\u0148uje proveden\u00ed v\u00fdzvy). Tato \u010d\u00e1st byla tak\u00e9 dokon\u010dena. Posledn\u00ed komponentou byl JavaScript klient, kter\u00e9mu by byl vyd\u00e1n token, pomoc\u00ed kter\u00e9ho by volal chr\u00e1n\u011bn\u00e9 API. Tuto \u010d\u00e1st se n\u00e1m nepoda\u0159ilo dokon\u010dit. To znamen\u00e1, \u017ee byla p\u0159ipravena cel\u00e1 funk\u010dn\u00ed \u010d\u00e1st, ale frontendov\u00e1 \u010d\u00e1st pro demonstraci funk\u010dnosti cel\u00e9ho syst\u00e9mu nebyla hotov\u00e1.<\/p>\n<h4>E-E-E (hra\u010dka)<\/h4>\n<p>\n<i>Dima Afon\u010denko, Sa\u0161a Konovalov<\/i><\/p>\n<p>Vytvo\u0159ili jsme mini-hra\u010dku na Unity, kde rychl\u00e9 ruce h\u00e1z\u00ed klob\u00e1su na pizzu. V p\u0159\u00edpad\u011b, \u017ee klob\u00e1su hod\u00ed\u0161 \u0161patn\u011b, na obrazovce se objev\u00ed smutn\u00fd n\u00e1pis \u201eZam\u00edtnuto\u201c, a pokud je cel\u00e1 klob\u00e1sa h\u00e1zena spr\u00e1vn\u011b, objev\u00ed se n\u00e1hodn\u00fd fakt o pizze.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCht\u011bli jsme ud\u011blat druhou \u00farove\u0148 s h\u00e1zen\u00edm raj\u010dat, ale nestihli jsme to.<\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Kr\u00e1tk\u00e9 pokra\u010dov\u00e1n\u00ed: kdo se stal v\u00edt\u011bzem?<\/h2>\n<p>\nP\u0159ed hackathonem jsme se bavili s kluky a ptala jsem se jich, jakou cenu by cht\u011bli z\u00edskat, pokud vyhraj\u00ed. Uk\u00e1zalo se, \u017ee nejcenn\u011bj\u0161\u00ed cenou by byla \u201ecesta do produkce\u201c. <\/p>\n<p><img decoding=\"async\" alt=\"K\u00f3dujeme \u2013 pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBrzy se od n\u00e1s do\u010dk\u00e1te ozn\u00e1men\u00ed o h\u0159e se skleni\u010dkami, kter\u00e9 na pizzu posyp\u00e1vaj\u00ed pepperoni.<\/p>\n<blockquote><p>Jak si mohl v\u0161imnout pozorn\u00fd \u010dten\u00e1\u0159, vyhr\u00e1l t\u00fdm \u201eE-E-E (hra)\u201c. Gratulujeme kluk\u016fm!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Pouze registrovan\u00ed u\u017eivatel\u00e9 se mohou \u00fa\u010dastnit ankety. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">P\u0159ihlaste se<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Kter\u00fd projekt se v\u00e1m l\u00edbil nejv\u00edc?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg L\u00ebrning (strojov\u00e9 u\u010den\u00ed)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI pro NOOBS<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    CourierGo<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    M87<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    E-E-E<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 5 u\u017eivatel\u016f. Zdr\u017eeli se 3 u\u017eivatel\u00e9.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/449344\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d. \u0420\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0431\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u043d\u0435\u043c\u0443 \u0437\u0430 2 \u043d\u0435\u0434\u0435\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c. \u0421\u043a\u0443\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u043c \u041d\u0430\u0447\u043d\u0443 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u0447\u0430\u043b\u043e \u0430\u043f\u0440\u0435\u043b\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0432 \u043e\u0444\u0438\u0441\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d MskDotNet Community. \u0411\u0438\u0442\u0432\u0430 \u0437\u0430 \u0422\u0430\u0442\u0443\u0438\u043d \u0432 \u0440\u0430\u0437\u0433\u0430\u0440\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26093,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/news\/kodim-pitstsa\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043e\u0434\u0438\u043c\u2013\u043f\u0438\u0446\u0446\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/news\/kodim-pitstsa\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:59:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:59:30+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47K\u00f3d\u00edme\u2013pizza | ProHoster","description":"Ahoj, Habre. N\u00e1hodou jsme uspo\u0159\u00e1dali prvn\u00ed intern\u00ed hackathon.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043e\u0434\u0438\u043c\u2013\u043f\u0438\u0446\u0446\u0430 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d.","og:url":"https:\/\/prohoster.info\/cs\/blog\/news\/kodim-pitstsa","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:59:30+00:00","article:modified_time":"2019-10-31T18:59:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34626","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 19:59:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:17:24","updated":"2026-01-21 19:59:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}