{"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\/hr\/blog\/news\/kodim-pitstsa","title":{"rendered":"Kodim\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pozdrav, Habr. Spontano smo organizirali na\u0161 prvi unutarnji hackathon. Odlu\u010dila sam podijeliti s vama svoje bolne to\u010dke i zaklju\u010dke o pripremama koje su trajale 2 tjedna, kao i projektima koji su proiza\u0161li iz toga.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" 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>Dosadna tema za one koje zanimaju marketing.<\/h2>\n<p>\nZapo\u010det \u0107u s malom pri\u010dom. <\/p>\n<p>Po\u010detak travnja. U na\u0161em uredu odr\u017eava se prvi hackathon MskDotNet Community. Bitka za Tatooine je u punom jeku, u na\u0161oj galaksiji ovaj put. Subota. 20 timova. Pizza. Sve je vrlo opu\u0161teno (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">dokazi<\/a><\/noindex>). Napuhani R2-D2 pojavljuje se po dvorani. Timi pi\u0161u najbolje algoritme kako bi pro\u0161li najopasniju utrku na karti. Pomjeramo po\u010detak prvih utrka. Keksi i kava spa\u0161avaju situaciju. S organizatorima smo o\u010dekivali da \u0107e mnogi oti\u0107i nakon ru\u010dka u subotu. No, ne. 12 sati kodiranja je iza nas. Finale. Ne\u0161to se raspada, ne\u0161to ne radi. No, svi su sretni. Pobje\u0111uje na\u0161 tim. Sretni smo dvostruko. <\/p>\n<p>Dijelim radost na Slacku i u glavi mi pada ideja: \"Moramo napraviti svoj hackathon\". Pi\u0161em na\u0161em CTO-u Sashi. Ti\u0161ina. <\/p>\n<p>Jutro. Pijem kavu u uredu. Vidim kako se Sashha pribli\u017eava sa stra\u017enje strane. \"Liza, to je odli\u010dno! Ba\u0161 imamo va\u017ean datum 21. travnja. Idemo raditi!\" \u0160to? Tako brzo? A? \u0160to? Moram odletjeti u Syktyvkar na praksu sredinom travnja. A neka, ajmo.<\/p>\n<p>Ostalo je 2 tjedna. Nikada nisam bila glavni organizator hackathona. \u010cak ni unutarnjeg. \u010citam \u010dlanke na tu temu. U\u017eas. Trebaju nekoliko mjeseci. Treba nekoliko osoba. Treba razmisliti o mer\u010du, nagradama, uvjetima, rasporedu, zainteresirati, razumjeti cilj, bud\u017eete. Mo\u017eda \u010dak i dublje razmisliti o smislu \u017eivota. Sigurno ne\u0107u uspjeti. I dok si \u010ditao i pripremao se, pro\u0161ao je ve\u0107 tjedan. Najbolje je zaboraviti na \u010dlanke i po\u010deti raditi na ne\u010demu. <\/p>\n<p><b class=\"spoiler_title\">Evo na\u0161eg checklista za organizaciju unutarnjeg hackathona u 1 tjednu<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: uspokojeno sjedi\u0161 i pi\u0161e\u0161 popis onoga \u0161to je potrebno u\u010diniti za hackathon. <i>30 minuta<\/i>.<\/li>\n<li><b>Zadatak<\/b>: sudionici sami predla\u017eu i biraju projekte koje \u017eele stvoriti u Google Sheets. <i>Pozadinska zada\u0107a, 2 sata<\/i>.<\/li>\n<li><b>Raspored<\/b>: na brzinu pi\u0161e\u0161 kratku vremensku podjelu uzimaju\u0107i u obzir 3 pauze i finale. <i>20 minuta<\/i>.<\/li>\n<li><b>Naredbe<\/b>: objavljuje\u0161 poruku o hackathonu s rasporedom od CTO-a u IT-kanalima na Slacku\/po\u0161ti\/itd. i stvara\u0161 poseban kanal za hackathon. U njemu se svi raspore\u0111uju u timove, a oni koji nisu odlu\u010dili to rade u prvih 5 minuta hackathona. <i>Pozadinska zada\u0107a, 2 sata<\/i>.<\/li>\n<li><b>Prednosti<\/b>: zami\u0161lja\u0161 merch s dva developera, predaje\u0161 dizajneru na izradu, dobiva\u0161 gotov proizvod. <i>Pozadinska zada\u0107a, 3 dana<\/i>.<\/li>\n<li><b>Hackathon<\/b>: dolazi\u0161 u ured, koordinira\u0161 sve na po\u010detku, bavi\u0161 se svojim poslovima, \u010dita\u0161 Reddit, s va\u017enim izrazom lica svakih prekovremenih minuta javlja\u0161 o svje\u017eoj pizzi, fotografira\u0161 zalazak sunca, objavljuje\u0161 finale, zajedno glasate i birate pobjednika. <i>1 dan<\/i>.<\/li>\n<li><b>Pod zvjezdicom<\/b>: naravno, stalno razmi\u0161lja\u0161 o tome da sve pro\u0111e dobro. Naravno, ne vide svi tvoju poruku i s nekima je bolje razgovarati u\u017eivo. Naravno, ako ti netko poma\u017ee, sve postaje dvostruko lak\u0161e (pomagala mi je divna Aljona).<\/li>\n<\/ul>\n<h2>Manje dosadni dio o datumu hackathona<\/h2>\n<p>\nZa\u0161to 21. travnja? Taj dan nam je zna\u010dajan. To\u010dno godinu dana ranije, 21. travnja, pali smo pod optere\u0107enjem tijekom prvih vikenda nakon po\u010detka Federalne Reklamne Kampanje. Sutradan, u nedjelju, na\u0161 tim bio je na poslu od 8 ujutro. Tada smo stvorili u Trellu plo\u010du sundayhackathon i zapo\u010dela je tjedan smjenovnog rada od 12 sati dnevno. Situacija je bila toliko kriti\u010dna da nismo imali vremena ni za jelo i de\u010dki iz drugih timova su nas hranili.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDetaljniju pri\u010du mo\u017eete pro\u010ditati na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">stranici Fjodora Ov\u010dinnikova<\/a><\/noindex> (na\u0161eg CEO-a). Od tada, puno smo promijenili, ali ovu \u0107emo datumu sada sigurno zapamtiti.<\/p>\n<p>Ove godine odlu\u010dili smo da je ovaj doga\u0111aj vrijedno zauvijek zabilje\u017eiti i u najboljim tradicijama organizirali smo prvi u povijesti \u0414\u043e\u0434\u043e interna hackathon, koji je trajao 10 sati. <\/p>\n<h2>Najmanje dosadni dio o projektima hackathona<\/h2>\n<p>\n<i>Izjava: sve opise pisali su sami de\u010dki, tako da autorstvo teksta nije moje.<\/i><\/p>\n<h4>Oleg Lj\u00f6rning (strojno u\u010denje)<\/h4>\n<p>\n<i>Dima Ko\u010dneve, Sa\u0161a Andronov (@alexandronov)<\/i><\/p>\n<p>\u017deljeli su napraviti neuralnu mre\u017eu koja \u0107e prepoznati koja je pizza na fotografiji bez ikakvog predznanja. Na kraju su napravili vrlo jednostavnu i igra\u010dka \u2013 prepoznaje 10 pica, otprilike su shvatili kako sve funkcionira, koliko je to mogu\u0107e za jedan dan (~10 sati).<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOsobito smo shvatili da je industrija do\u0161la do razine kada obi\u010dan developer mo\u017ee uzeti gotove biblioteke, pro\u010ditati dokumentaciju i obu\u010diti svoju neuralnu mre\u017eu bez dubokog poznavanja teme. I da \u0107e raditi dovoljno dobro za rje\u0161avanje stvarnih problema.<\/p>\n<p>Alati koje smo koristili: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 prakti\u010dna i jednostavna knji\u017enica za rad s umjetni\u010dkom inteligencijom i ra\u010dunalnim vidom.<\/li>\n<li>Isprobali smo dva modela \u2013 ResNet50, Yolo.<\/li>\n<li>Kod smo pisali, jasno je, na Pythonu.<\/li>\n<\/ul>\n<p>\nImali smo 11000 fotografija, ali gotovo 3\/4 njih su bile sme\u0107e, dok su preostale imale razli\u010dite, neodgovaraju\u0107e kutove. Na kraju smo uzeli gotov model (koji jednostavno mo\u017ee prona\u0107i pizzu) i s njim odvojili najgore. Zatim smo, u nazivima slika, imali nazive pizza \u2014 tako smo ih razvrstali po mapama, ali se ispostavilo da se nazivi ne podudaraju s onim \u0161to je stvarno, pa smo morali ru\u010dno srediti. Na kraju smo imali oko 500-600 slika, \u0161to je jasno da je zanemariva koli\u010dina, ali se ispostavilo da je to dovoljno da razdvojimo 10 pizza jednu od druge.<\/p>\n<p>Za obuku mre\u017ee uzeli smo najjeftiniju virtualku na Azureu s NVIDIA Tesla K80. Na njoj smo obu\u010davali u 100 epoha, ali se vidjelo da je mre\u017ea prenasi\u0107ena ve\u0107 nakon 50 epoha, zbog toga \u0161to je dataset bio mali.<\/p>\n<p>U stvari \u2014 cijeli problem le\u017ei u nedostatku dobrih podataka.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017eda smo malo zbrkali u terminima, ali treba uzeti u obzir da nemamo iskustva s ovim stvarima.<\/p>\n<h4>GUI for NOOBS (konzola za naru\u010divanje pizze)<\/h4>\n<p>\n<i>Mi\u0161a Kuma\u010dev (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/ceridan\/\" class=\"user_link\">Ceridan<\/a><\/noindex>), \u017denja B ikkinin, \u017denja Vasiljev<\/i><\/p>\n<p>Sakupili smo prototip konzolne aplikacije za geekove, zahvaljuju\u0107i kojoj se mo\u017ee naru\u010diti pizza kroz terminal ili naredbenu liniju, ili \u010dak ugraditi u deploy pipeline i prilikom uspje\u0161nog izdanja dostaviti pizzu u ured.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRad je podijeljen na nekoliko dijelova: prou\u010davali smo kako je na\u0161 API za mobilne aplikacije, skupili svoj CLI pomo\u0107u <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> i pode\u0161avali objavljivanje paketa koji smo sami napravili. S posljednjim zadatkom bilo je nekoliko neugodnih minuta pred kraj hackathona. Sve je radilo lokalno i \u010dak su radile stare objavljene verzije paketa, ali nove (u kojima su dodane super nove funkcije i emotikoni) su odbijale raditi. Potro\u0161ili smo oko 40 minuta poku\u0161avaju\u0107i shvatiti \u0161to nije u redu, ali na kraju je sve \u010darobno po\u010delo raditi).<\/p>\n<p>Na\u0161 maksimalni cilj na hackathonu bio je pravi narud\u017eba pizze u ured preko na\u0161eg CLI. Desetak puta smo sve testirali na probnom okru\u017eenju, ali mi su se svejedno tresle ruke dok sam unosio naredbe u produkciji.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa kraju \u2014 uspjeli smo u tome!<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" 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 Bruzhmel\u0451v (autor), Vanja Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrej Sarafanov<\/i><\/p>\n<p>Uzmili smo ideju \"Aplikacija za kurire.\"<\/p>\n<p><b class=\"spoiler_title\">Predistorija o pripremi.<\/b>Isprva sam razmi\u0161ljao, koje bi funkcionalnosti mogle biti u aplikaciji? Nastala je otprilike ovakva lista funkcionalnosti:<\/p>\n<ul>\n<li>Aplikacija se prijavljuje na dostavni kasa putem koda.<\/li>\n<li>U aplikaciji su odmah vidljivi dostupni narud\u017ebe, narud\u017ebe koje je potrebno preuzeti.<\/li>\n<li>Kurir ozna\u010dava narud\u017ebu i kre\u0107e na put.<\/li>\n<li>Pokazuje mu se procijenjeno vrijeme i sti\u017ee li na vrijeme ili ne.<\/li>\n<li>Klijentu se pokazuje da je kurir krenuo.<\/li>\n<li>Klijentu po\u010dinje prikazivati to\u010dku kurira na karti i procijenjeno vrijeme.<\/li>\n<li>Kurir mo\u017ee napisati klijentu u chat putem aplikacije.<\/li>\n<li>Klijent mo\u017ee napisati kuriru u chat putem aplikacije.<\/li>\n<li>Pet minuta prije dolaska klijent prima poruku da je kurir blizu, budite spremni.<\/li>\n<li>Kurir ozna\u010dava u aplikaciji da je stigao i \u010deka.<\/li>\n<li>Kurir zove iz aplikacije jednim klikom i javlja da (dolazi, stigao itd.)<\/li>\n<li>Klijent prihva\u0107a narud\u017ebu i unosi PIN kod iz aplikacije ili SMS-a za potvrdu dostave. (kao potpis) Da kurir ne bi mogao zavr\u0161iti dostavu unaprijed, ako se kasni.<\/li>\n<li>Narud\u017eba se ozna\u010dava u sustavu kao isporu\u010dena.<\/li>\n<\/ul>\n<p>Plus nekoliko alternativnih scenarija:<\/p>\n<ul>\n<li>Kurir mo\u017ee ozna\u010diti narud\u017ebu kao nedostavljenu i odabrati razlog.<\/li>\n<li>Kurir, u slu\u010daju ka\u0161njenja, mo\u017ee jednim pritiskom izdati elektroni\u010dki certifikat putem SMS-a. Ili certifikat dolazi automatski pri nepo\u0161tivanju roka isporuke.<\/li>\n<\/ul>\n<p>\nOsje\u0107aj perspektivnosti i korisnosti ovog projekta, svakako je bio motiviraju\u0107i.<\/p>\n<p>Sljede\u0107i dan smo oti\u0161li na ru\u010dak s timom i razgovarali o tome kako \u0107e izgledati minimalna funkcionalnost aplikacije. <\/p>\n<p>Na kraju je nastala sljede\u0107a lista onoga \u0161to je trebalo sti\u0107i napraviti na hackathonu:<\/p>\n<ul>\n<li>Prijava na dostavnu kasu.<\/li>\n<li>Prikaz trenutne lokacije.<\/li>\n<li>Slanje podataka vanjskom API-ju (koordinate, preuzeo narud\u017ebu, dostavio narud\u017ebu).<\/li>\n<li>Dobiti podatke iz vanjskog API-ja (trenutne narud\u017ebe kurira).<\/li>\n<li>Poslati doga\u0111aj kako je preuzeo narud\u017ebu za dostavu\/dostavio.<\/li>\n<li>Prikazati trenutnu lokaciju kurira na karti na webu.<\/li>\n<\/ul>\n<p>\nGlavni posao, kako se \u010dinilo, trebao je biti u stvaranju backenda, same aplikacije (nakon rasprava odlu\u010deno je koristiti ReactNative za razvoj aplikacije, to\u010dnije obavijest iznad njega \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, koji omogu\u0107uje da se uop\u0107e ne pi\u0161e nativni kod). Na backendu se isprva nadalo u Vanu Zvereva, kao iskusnog u radu s na\u0161om uslugom i k8s (koju je i preuzeo na sebe). ReactNative smo uzeli da probamo Andrzej i ja.<\/p>\n<p>Odlu\u010dio sam odmah kreirati radni repozitorij za sam projekt. U 12 nave\u010der sam nai\u0161ao na problem da geolokacija slabo radi u ReactNativeu u pozadini, ako ne pi\u0161em nativni kod, malo sam se frustrirao. Kasnije mi je olak\u0161alo kada sam shvatio da \u010ditam dokumentaciju ne za expo.io framework, ve\u0107 za ReactNative. Na kraju, tijekom ve\u010deri sam ve\u0107 shvatio kako dobiti trenutnu lokaciju u expo.io i izraditi odvojene ekrane (za prijavu, prikaz narud\u017ebe itd.).<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJutros nas je na hackathonu zainteresirao Gleb za svoj izuzetno perspektivan projekt. Brzo smo skicirali plan onoga \u0161to treba napraviti.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNapravili smo gre\u0161ku kada smo, prema \u0161ablonu projekta, poku\u0161ali komunikaciju ostvariti ne putem HTTP-a, ve\u0107 putem GRPC-a, jer nitko nije znao sastaviti GRPC klijenta za JavaScript. Na kraju, potro\u017eiv\u0161i otprilike sat i pol na to, odustali smo od te ideje. Zbog toga su de\u010dki na backendu po\u010deli ponovno raditi gotovi server s GRPC na WebApi. Nakon pola sata, kona\u010dno smo uspjeli postaviti komunikaciju aplikacije s backendom, o \u010dudo. No u to isto vrijeme Gleb je gotovo zavr\u0161io deployment u k8s, uz automatski deployment po commitima u master. \ud83d\ude42<\/p>\n<p>Kao skladi\u0161te odabrali smo MySQL kako bismo barem izbjegli rizik s bazom (bile su misli o CosmosDb-u).<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa kraju: <\/p>\n<ul>\n<li>Implementirali smo spremanje trenutnih koordinata dostavlja\u010da iz aplikacije u bazu.<\/li>\n<li>Povezali smo RabbitMQ i pretplatili se na poruke o preuzimanju narud\u017ebe od strane dostavlja\u010da, kako bismo odmah prikazali narud\u017ebu kod dostavlja\u010da u aplikaciji.<\/li>\n<li>Po\u010deli smo spremati u bazu vrijeme isporuke narud\u017ebe, nakon \u0161to je dostavlja\u010d pritisnuo dugme u aplikaciji. Nismo uspjeli dodati slanje doga\u0111aja natrag u RabbitMQ o tome da je narud\u017eba isporu\u010dena.<\/li>\n<li>Izradio sam prikaz karte na stranici currentorder na webu s trenutnim polo\u017eajem dostavlja\u010da. No, ta funkcionalnost je ostala malo nedovr\u0161ena, jer u okru\u017eenju nismo uspjeli postaviti CORS za dobivanje koordinata iz na\u0161e nove usluge.<\/li>\n<\/ul>\n<p><\/p>\n<h4>M87<\/h4>\n<p>\n<i>Roma Bukin, Go\u0161a Polevoj (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/georgepolevoy\/\" class=\"user_link\">georgepolevoy<\/a><\/noindex>), Artyom Trofimushkin<\/i><\/p>\n<p>\u017deljeli smo implementirati OpenID Connect pru\u017eatelja, budu\u0107i da trenutno koristimo protokol autentifikacije vlastite izrade, \u0161to stvara niz pote\u0161ko\u0107a: prilago\u0111ene klijentske biblioteke, te\u0161ko\u0107e u radu s vanjskim partnerima, mogu\u0107e sigurnosne probleme (u svakom slu\u010daju, OAuth2.0 i OpenID Connect u referentnoj implementaciji smatramo sigurnima, a za na\u0161e rje\u0161enje \u2013 nisam siguran).<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNapravili smo poseban servis koji emulira servis za pohranu osobnih podataka kako bismo stvorili malu modelu Country-Agnostic pru\u017eatelja autentifikacije koji bi tra\u017eio osobne podatke u zasebnom servisu (to bi u budu\u0107nosti omogu\u0107ilo jedan servis putem kojeg bi se moglo prijaviti s ra\u010dunom u bilo kojoj zemlji, pri \u010demu bi se ispunjavali GDPR i drugi zakoni). Tu smo komponentu povezali s pru\u017eateljem. Sljede\u0107e je bilo napraviti API koji bi bio za\u0161ti\u0107en tokenima koje pru\u017ea pru\u017eatelj, podr\u017eavati njihovu introspekciju putem pru\u017eatelja i davati za\u0161ti\u0107ene podatke ako bi zahtjev ispunio politike autorizacije (provjeravamo je li korisnik autentificiran prema Bearer shemi, da njegov token sadr\u017ei odre\u0111eni opseg + da sam korisnik ima dozvolu koja dopu\u0161ta izvr\u0161enje poziva). Ova komponenta je tako\u0111er dovr\u0161ena. Posljednji komponent je bio JavaScript klijent koji bi dobio token kojim bi pozivao za\u0161ti\u0107eni API. Ovu smo komponentu na\u017ealost uspjeli zavr\u0161iti. Dakle, cijela funkcionalna komponenta bila je spremna, ali front-end dio za demonstraciju funkcioniranja cijelog sustava nije bio dovr\u0161en.<\/p>\n<h4>E-E-E (igrica)<\/h4>\n<p>\n<i>Dima Afon\u010denko, Sa\u0161a Konovalov<\/i><\/p>\n<p>Napravili smo mini igricu na Unityju gdje brze ruke bacaju kobasicu na pizzu. Ako ne baci\u0161 kobasicu ispravno, na ekranu se pojavljuje tu\u017ena poruka 'Odbijeno', a ako je cijela kobasica ispravno ba\u010dena, pojavljuje se slu\u010dajna \u010dinjenica o pizzi.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHtjeli smo napraviti drugi nivo s bacanjem raj\u010dica, ali nismo uspjeli.<\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Kratko nastavak: tko je pobijedio?<\/h2>\n<p>\nPrije hackathona razgovarali smo s de\u010dkima i pitala sam ih koji bi nagradu \u017eeljeli dobiti ako pobijede. Ispostavilo se da bi najvrjednija nagrada bila 'put u produkciju'. <\/p>\n<p><img decoding=\"async\" alt=\"Kodim\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nStoga, uskoro o\u010dekujte od nas najavu igre s ru\u010dicama koje dodaju peperoni na pizzu.<\/p>\n<blockquote><p>Kao \u0161to je primijetio pa\u017eljivi \u010ditatelj, pobijedila je ekipa \u201eE-E-E (igra)\u201c. \u010cestitamo de\u010dkima!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Samo registrirani korisnici mogu sudjelovati u anketi. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Prijavite se<\/a><\/noindex>, molimo.<\/p>\n<h2 class=\"default-block__polling-title\">Koji vam je projekt najvi\u0161e svidio?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Lj\u00f6rning (strojno u\u010denje)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI za 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>    Glasalo je 5 korisnika. 3 korisnika su se suzdr\u017eala.<br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/blog\/news\/kodim-pitstsa\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Kodimo\u2013pizza | ProHoster","description":"Pozdrav, Habr. Nekontrolirano smo odr\u017eali prvi unutarnji hackathon.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}