{"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\/pl\/blog\/news\/kodim-pitstsa","title":{"rendered":"Kodim\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr. Spontanicznie zorganizowali\u015bmy pierwszy wewn\u0119trzny hackathon. Postanowi\u0142am podzieli\u0107 si\u0119 z Wami moimi przemy\u015bleniami i wnioskami o przygotowaniach do niego, kt\u00f3re zaj\u0119\u0142y 2 tygodnie, a tak\u017ce projektami, kt\u00f3re powsta\u0142y.<\/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>Nudna cz\u0119\u015b\u0107 dla tych, kt\u00f3rzy interesuj\u0105 si\u0119 marketingiem<\/h2>\n<p>\nZaczn\u0119 od ma\u0142ej historii. <\/p>\n<p>Pocz\u0105tek kwietnia. W naszym biurze odbywa si\u0119 pierwszy hackathon MskDotNet Community. Walka o Tatooine trwa, w naszej galaktyce tym razem. Sobota. 20 zespo\u0142\u00f3w. Pizza. Wszystko bardzo przyjemnie (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">dowody<\/a><\/noindex>). Napuchni\u0119ty R2-D2 kr\u0105\u017cy po sali. Zespo\u0142y pisz\u0105 najlepsze algorytmy, aby pokona\u0107 najniebezpieczniejszy wy\u015bcig na mapie. Przesuwamy start pierwszych wy\u015bcig\u00f3w. Ciasteczka i kawa pomagaj\u0105. My z organizatorami spodziewali\u015bmy si\u0119, \u017ce w sobot\u0119 wielu odejdzie po obiedzie. Ale nie. 12 godzin kodowania za nami. Fina\u0142. Co\u015b si\u0119 psuje, co\u015b nie dzia\u0142a. Ale wszyscy s\u0105 szcz\u0119\u015bliwi. Wygrywa nasz zesp\u00f3\u0142. Cieszymy si\u0119 podw\u00f3jnie. <\/p>\n<p>Dziel\u0119 si\u0119 rado\u015bci\u0105 w Slacku i wpada mi do g\u0142owy pomys\u0142: \u201eMusimy zorganizowa\u0107 nasz hackathon\u201d. Pisz\u0119 do naszego CTO Saszy. Cisza. <\/p>\n<p>Poranek. Pij\u0119 kaw\u0119 w biurze. Widz\u0119 podchodz\u0105cego od ty\u0142u Sasz\u0119. \u201eLiza, to \u015bwietnie! Mamy przecie\u017c 21 kwietnia wa\u017cn\u0105 dat\u0119. Zr\u00f3bmy to!\u201d Co do cholery!? Tak szybko? Co? Musz\u0119 lecie\u0107 do Syktywkaru na sta\u017c w po\u0142owie kwietnia. Ale co tam! Zr\u00f3bmy to.<\/p>\n<p>Zostaj\u0105 2 tygodnie. Nigdy nie by\u0142am jedynym organizatorem hackathonu. Nawet wewn\u0119trznego. Czytam artyku\u0142y na ten temat. Hardkor. Potrzebne kilka miesi\u0119cy. Potrzebne kilka os\u00f3b. Trzeba przemy\u015ble\u0107 merch, nagrody, warunki, harmonogram, zainteresowa\u0107, zrozumie\u0107 cel, bud\u017cety. A mo\u017ce nawet zastanowi\u0107 si\u0119 nad sensem \u017cycia. Na pewno nie zd\u0105\u017c\u0119. A podczas gdy czyta\u0142e\u015b i si\u0119 przygotowywa\u0142e\u015b, ju\u017c min\u0119\u0142y 2 tygodnie. To idealny moment, \u017ceby przesta\u0107 czyta\u0107 artyku\u0142y i zacz\u0105\u0107 co\u015b robi\u0107. <\/p>\n<p><b class=\"spoiler_title\">Oto nasza lista kontrolna przeprowadzenia wewn\u0119trznego hackathonu w ci\u0105gu 1 tygodnia.<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: spokojnie siadasz i spisujesz list\u0119 rzeczy do zrobienia na hackathon. <i>30 minut<\/i>.<\/li>\n<li><b>Zadanie<\/b>: uczestnicy sami proponuj\u0105 i wybieraj\u0105 projekty, kt\u00f3re chc\u0105 stworzy\u0107 w Google Sheets. <i>Zadanie t\u0142a, 2 godziny<\/i>.<\/li>\n<li><b>Harmonogram<\/b>: na kolanie piszesz kr\u00f3tk\u0105 rozpisk\u0119 czasow\u0105 z uwzgl\u0119dnieniem 3 przerw i fina\u0142u. <i>20 minut<\/i>.<\/li>\n<li><b>Polecenia<\/b>: publikujesz wiadomo\u015b\u0107 o hackathonie z harmonogramem od CTO w IT-kana\u0142ach w Slacku\/poczcie\/etc i tworzysz osobny kana\u0142 dla hackathonu. W nim wszyscy dziel\u0105 si\u0119 na zespo\u0142y, a niezdecydowani robi\u0105 to w pierwsze 5 minut hackathonu. <i>Zadanie t\u0142a, 2 godziny<\/i>.<\/li>\n<li><b>Dodatki<\/b>: wymy\u015blasz merch z dwoma programistami, oddajesz go projektantowi do narysowania, otrzymujesz gotowy. <i>Zadanie w tle, 3 dni<\/i>.<\/li>\n<li><b>Hackathon<\/b>: przychodzisz do biura, koordynujesz wszystkich na pocz\u0105tku, zajmujesz si\u0119 swoimi sprawami, czytasz Reddit, z wa\u017cnym wyrazem twarzy informujesz o \u015bwie\u017cej pizzy w ka\u017cdym przerwie, fotografujesz zach\u00f3d s\u0142o\u0144ca, og\u0142aszasz fina\u0142, wszyscy wsp\u00f3lnie g\u0142osujecie i wybieracie zwyci\u0119zc\u0119. <i>1 dzie\u0144<\/i>.<\/li>\n<li><b>Pod gwiazdk\u0105<\/b>: oczywi\u015bcie, ci\u0105gle my\u015blisz o tym, \u017ceby wszystko posz\u0142o dobrze. Oczywi\u015bcie, nie wszyscy zobacz\u0105 twoj\u0105 wiadomo\u015b\u0107 i z niekt\u00f3rymi lepiej porozmawia\u0107 osobi\u015bcie. Oczywi\u015bcie, je\u015bli kto\u015b ci pomo\u017ce, wszystko b\u0119dzie dwa razy \u0142atwiejsze (pomaga\u0142a mi wspania\u0142a Alena).<\/li>\n<\/ul>\n<h2>Mniej nudna cz\u0119\u015b\u0107 o dacie hackathonu<\/h2>\n<p>\nDlaczego 21 kwietnia? Ten dzie\u0144 jest dla nas znacz\u0105cy. R\u00f3wno rok temu, 21 kwietnia za\u0142ama\u0142 si\u0119 pod obci\u0105\u017ceniem podczas pierwszego weekendu po rozpocz\u0119ciu Federalnej Kampanii Reklamowej. Nast\u0119pnego dnia, w niedziel\u0119, nasz zesp\u00f3\u0142 by\u0142 w pracy od 8 rano. Wtedy stworzyli\u015bmy w Trello tablic\u0119 sundayhackathon i zacz\u0119\u0142a si\u0119 tydzie\u0144 pracy zmianowej po 12 godzin dziennie. Sytuacja by\u0142a na tyle krytyczna, \u017ce nie mieli\u015bmy nawet czasu na jedzenie, a ch\u0142opaki z innych zespo\u0142\u00f3w nas dokarmiali.<\/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 \/>\nBardziej szczeg\u00f3\u0142ow\u0105 opowie\u015b\u0107 mo\u017cna przeczyta\u0107 na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">stronie Fiodora Owczinnikowa<\/a><\/noindex> (naszego CEO). Od tego czasu wiele si\u0119 zmieni\u0142o, ale t\u0119 dat\u0119 na pewno zapami\u0119tamy.<\/p>\n<p>W tym roku postanowili\u015bmy, \u017ce to wydarzenie warto uwieczni\u0107 dla potomnych i w najlepszej tradycji zorganizowali\u015bmy pierwszy w historii Dodo wewn\u0119trzny hackathon, kt\u00f3ry trwa\u0142 10 godzin. <\/p>\n<h2>Najbardziej interesuj\u0105ca cz\u0119\u015b\u0107 o projektach hackathonu<\/h2>\n<p>\n<i>Disclaimer: wszelkie opisy napisali sami ch\u0142opcy, wi\u0119c autorstwo tekstu nie jest moje.<\/i><\/p>\n<h4>Oleg Learning (machine learning)<\/h4>\n<p>\n<i>Dima Ko\u010dniew, Sasha Andronow (@alexandronov)<\/i><\/p>\n<p>Chcieli stworzy\u0107 sie\u0107 neuronow\u0105, kt\u00f3ra rozpozna\u0142aby, jaka pizza znajduje si\u0119 na zdj\u0119ciu bez \u017cadnej wiedzy. Ostatecznie zrobili\u015bmy bardzo prost\u0105 i zabawkow\u0105 \u2013 rozpoznaje 10 pizz, mniej wi\u0119cej ogarn\u0119li\u015bmy, jak to wszystko dzia\u0142a, tak jak by\u0142o to mo\u017cliwe w ci\u0105gu dnia (~10 godzin).<\/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 \/>\nW szczeg\u00f3lno\u015bci zrozumieli\u015bmy, \u017ce przemys\u0142 osi\u0105gn\u0105\u0142 poziom, na kt\u00f3rym zwyk\u0142y programista mo\u017ce wzi\u0105\u0107 gotowe biblioteki, przeczyta\u0107 dokumentacj\u0119 i nauczy\u0107 swoj\u0105 sie\u0107 neuronow\u0105 bez g\u0142\u0119bokiej wiedzy na temat. I b\u0119dzie ona dzia\u0142a\u0107 wystarczaj\u0105co dobrze w rozwi\u0105zywaniu rzeczywistych problem\u00f3w.<\/p>\n<p>Narz\u0119dzia, kt\u00f3re u\u017cyli\u015bmy: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 wygodna i prosta biblioteka do pracy z uczeniem maszynowym i widzeniem komputerowym.<\/li>\n<li>Wypr\u00f3bowali\u015bmy dwa modele \u2013 ResNet50, Yolo.<\/li>\n<li>Kod pisali\u015bmy, jak mo\u017cna si\u0119 domy\u015bli\u0107, w Pythonie.<\/li>\n<\/ul>\n<p>\nMieli\u015bmy 11000 zdj\u0119\u0107, ale praktycznie 3\/4 z nich okaza\u0142y si\u0119 by\u0107 nieprzydatne, a w pozosta\u0142ych by\u0142y r\u00f3\u017cne, nieodpowiednie k\u0105ty. W ko\u0144cu wzi\u0119li\u015bmy gotowy model (kt\u00f3ry potrafi tylko znajdowa\u0107 pizz\u0119) i dzi\u0119ki niemu oddzielili\u015bmy najgorsze zdj\u0119cia. Dalej, w nazwach zdj\u0119\u0107 by\u0142o imi\u0119 pizzy \u2014 tak rozdzielili\u015bmy je do folder\u00f3w, ale okaza\u0142o si\u0119, \u017ce nazwy nie zgadzaj\u0105 si\u0119 z rzeczywisto\u015bci\u0105 i trzeba by\u0142o r\u0119cznie poprawi\u0107. Ostatecznie zosta\u0142o oko\u0142o 500-600 zdj\u0119\u0107, co oczywi\u015bcie jest niewielk\u0105 liczb\u0105, ale mimo to wystarczy\u0142o, aby oddzieli\u0107 10 pizz od siebie.<\/p>\n<p>Do treningu sieci wzi\u0119li\u015bmy najta\u0144sz\u0105 wirtualn\u0105 maszyn\u0119 w Azure z NVIDIA Tesla K80. Na niej uczyli\u015bmy przez 100 epok, ale by\u0142o wida\u0107, \u017ce sie\u0107 by\u0142a przesycona ju\u017c po 50 epokach, poniewa\u017c mieli\u015bmy ma\u0142y zbi\u00f3r danych.<\/p>\n<p>W\u0142a\u015bciwie \u2013 ca\u0142y problem le\u017cy w braku dobrych danych.<\/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\u017cliwe, \u017ce troch\u0119 pomylili\u015bmy terminy, ale trzeba pami\u0119ta\u0107, \u017ce nie mamy do\u015bwiadczenia w pracy z tymi wszystkimi rzeczami.<\/p>\n<h4>GUI dla NOOBS (terminal do zamawiania pizzy)<\/h4>\n<p>\n<i>Misha Kumachyov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/ceridan\/\" class=\"user_link\">Ceridan<\/a><\/noindex>), Zhenya Bikyinin, Zhenya Vasiliev<\/i><\/p>\n<p>Zbudowali\u015bmy prototyp aplikacji konsolowej dla geek\u00f3w, dzi\u0119ki kt\u00f3rej mo\u017cna zam\u00f3wi\u0107 pizz\u0119 przez terminal lub wiersz polece\u0144, a nawet zintegrowa\u0107 j\u0105 w pipeline deploy i dostarcza\u0107 pizz\u0119 do biura przy udanym wydaniu.<\/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 \/>\nPraca zosta\u0142a podzielona na kilka cz\u0119\u015bci: analizowali\u015bmy, jak dzia\u0142a nasze API dla aplikacji mobilnych, budowali\u015bmy w\u0142asne CLI przy u\u017cyciu <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> i konfigurowali\u015bmy publikacj\u0119 stworzonego przez nas pakietu. Ostatnie zadanie wi\u0105za\u0142o si\u0119 z kilkoma nieprzyjemnymi chwilami pod koniec hackathonu. Wszystko dzia\u0142a\u0142o lokalnie, a nawet dzia\u0142a\u0142y stare opublikowane wersje pakietu, ale nowe (w kt\u00f3rych dodano wi\u0119cej fajnych funkcji i emotikon\u00f3w) odmawia\u0142y wsp\u00f3\u0142pracy. Sp\u0119dzili\u015bmy oko\u0142o 40 minut, aby zrozumie\u0107, co posz\u0142o nie tak, ale ostatecznie wszystko magicznie zacz\u0119\u0142o dzia\u0142a\u0107).<\/p>\n<p>Naszym maksymalnym celem na hackathonie by\u0142o prawdziwe zam\u00f3wienie pizzy do biura przez nasze CLI. Dziesi\u0105tki razy testowali\u015bmy to na testowym stanowisku, ale wci\u0105\u017c mia\u0142em dr\u017c\u0105ce r\u0119ce, gdy wpisywa\u0142em komendy w wersji produkcyjnej.<\/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 \/>\nW rezultacie \u2013 uda\u0142o nam si\u0119 to zrobi\u0107!<\/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 Bruzmel\u0451v (author), Vanja Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropia<\/a><\/noindex>), Andrey Sarafanov<\/i><\/p>\n<p>Wzi\u0119li\u015bmy pomys\u0142 na \u201eAplikacj\u0119 dla kuriera\u201d.<\/p>\n<p><b class=\"spoiler_title\">Historia przygotowania.<\/b>Na pocz\u0105tku zastanawia\u0142em si\u0119, jakie funkcje mog\u0105 by\u0107 w aplikacji? Powsta\u0142a mniej wi\u0119cej taka lista funkcjonalno\u015bci:<\/p>\n<ul>\n<li>Aplikacja loguje si\u0119 do kasy dostawy po kodzie.<\/li>\n<li>W aplikacji od razu wida\u0107 dost\u0119pne zam\u00f3wienia oraz zam\u00f3wienia do podj\u0119cia.<\/li>\n<li>Kurier zaznacza zam\u00f3wienie i zabiera je w tras\u0119.<\/li>\n<li>Pokazywane jest mu przewidywane czas przybycia oraz czy zd\u0105\u017cy czy nie.<\/li>\n<li>Klient widzi, \u017ce kurier wyruszy\u0142.<\/li>\n<li>Klient zaczyna widzie\u0107 lokalizacj\u0119 kuriera na mapie oraz przewidywany czas.<\/li>\n<li>Kurier mo\u017ce napisa\u0107 do klienta na czacie z aplikacji.<\/li>\n<li>Klient mo\u017ce napisa\u0107 do kuriera na czacie z aplikacji.<\/li>\n<li>Na pi\u0119\u0107 minut przed przyjazdem klient otrzymuje wiadomo\u015b\u0107, \u017ce kurier jest blisko, b\u0105d\u017a gotowy.<\/li>\n<li>Kurier zaznacza w aplikacji, \u017ce dotar\u0142 i czeka.<\/li>\n<li>Kurier dzwoni z aplikacji jednym klikni\u0119ciem i informuje, \u017ce (przybywa, podszed\u0142 itp.)<\/li>\n<li>Klient akceptuje zam\u00f3wienie i wprowadza pin z aplikacji lub SMS dla potwierdzenia dostawy (jak podpis). Aby kurier nie m\u00f3g\u0142 zako\u0144czy\u0107 dostawy wcze\u015bniej, je\u015bli si\u0119 sp\u00f3\u017ania.<\/li>\n<li>Zam\u00f3wienie oznaczane jest w systemie jako dostarczone.<\/li>\n<\/ul>\n<p>Plus kilka alternatywnych scenariuszy:<\/p>\n<ul>\n<li>Kurier mo\u017ce zaznaczy\u0107 zam\u00f3wienie jako niedostarczone i wybra\u0107 pow\u00f3d.<\/li>\n<li>Kurier, w przypadku sp\u00f3\u017anienia, mo\u017ce jednym klikni\u0119ciem wys\u0142a\u0107 elektroniczny certyfikat przez SMS. Lub certyfikat przychodzi automatycznie w przypadku nieprzestrzegania terminu dostawy.<\/li>\n<\/ul>\n<p>\nOdczuwa\u0142em perspektywiczno\u015b\u0107 i potrzeb\u0119 tego projektu, to oczywi\u015bcie motywowa\u0142o.<\/p>\n<p>Nast\u0119pnego dnia poszli\u015bmy z zespo\u0142em na lunch i om\u00f3wili\u015bmy, jak b\u0119dzie wygl\u0105da\u0107 minimalna funkcjonalno\u015b\u0107 aplikacji. <\/p>\n<p>W efekcie powsta\u0142a nast\u0119puj\u0105ca lista tego, co trzeba by\u0142o zrobi\u0107 na hackathonie:<\/p>\n<ul>\n<li>Logowanie do kasy dostawy.<\/li>\n<li>Wy\u015bwietlenie aktualnej pozycji.<\/li>\n<li>Wys\u0142anie danych do zewn\u0119trznego API (koordynaty, wzi\u0119te zam\u00f3wienie, dostarczone zam\u00f3wienie).<\/li>\n<li>Otrzymanie danych z zewn\u0119trznego API (aktualne zam\u00f3wienia kuriera).<\/li>\n<li>Wys\u0142anie zdarzenia, \u017ce wzi\u0119to zam\u00f3wienie na dostaw\u0119\/dostarczono.<\/li>\n<li>Wy\u015bwietlenie aktualnej pozycji kuriera na mapie na stronie.<\/li>\n<\/ul>\n<p>\nG\u0142\u00f3wna praca, jak to widzia\u0142em, mia\u0142a polega\u0107 na stworzeniu backendu, samej aplikacji (po dyskusjach wybrali\u015bmy ReactNative do rozwoju aplikacji, dok\u0142adniej obudow\u0119 nad nim \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, co pozwala w og\u00f3le nie pisa\u0107 natywnego kodu). W planie backendu pocz\u0105tkowo by\u0142a nadzieja na Wani\u0119 Zwierewa, jako do\u015bwiadczonego w pracy z naszym szablonem us\u0142ug i k8s (jak\u0105 prac\u0119 na siebie wzi\u0105\u0142). ReactNative wzi\u0105\u0142em pod uwag\u0119 razem z Andriejem Sarafanowem.<\/p>\n<p>Postanowi\u0142em spr\u00f3bowa\u0107 od razu stworzy\u0107 dzia\u0142aj\u0105ce repozytorium dla samego projektu. O 12 w nocy natkn\u0105\u0142em si\u0119 na to, \u017ce w ReactNative geolokalizacja s\u0142abo dzia\u0142a w tle, je\u015bli nie piszesz natywnego kodu, co mnie troch\u0119 sfrustrowa\u0142o. P\u00f3\u017aniej to mnie opu\u015bci\u0142o, gdy zrozumia\u0142em, \u017ce czytam dokumentacj\u0119 nie frameworka expo.io, a ReactNative. Ostatecznie wieczorem ju\u017c wiedzia\u0142em, jak uzyska\u0107 bie\u017c\u0105c\u0105 lokalizacj\u0119 w expo.io i rysowa\u0107 oddzielne ekrany (dla logowania, wy\u015bwietlania zam\u00f3wienia 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 \/>\nRano na hackathonie wci\u0105gn\u0119li\u015bmy Gleb\u0119 do naszego superperspektywicznego projektu. Szybko naszkicowali\u015bmy plan tego, co trzeba zrobi\u0107.<\/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 \/>\nPope\u0142nili\u015bmy b\u0142\u0105d, gdy zgodnie z szablonem projektu pr\u00f3bowali\u015bmy zrealizowa\u0107 komunikacj\u0119 nie przez HTTP, a przez GRPC, poniewa\u017c nikt nie potrafi\u0142 zbudowa\u0107 klienta GRPC dla JavaScript. W rezultacie, po\u015bwi\u0119caj\u0105c na to oko\u0142o p\u00f3\u0142torej godziny, porzucili\u015bmy ten pomys\u0142. Z tego powodu ch\u0142opcy zacz\u0119li przebudowywa\u0107 gotowy serwer z GRPC na WebApi. Po p\u00f3\u0142 godzinie w ko\u0144cu uda\u0142o nam si\u0119 ustawi\u0107 komunikacj\u0119 aplikacji z backendem, cud. Ale w tym samym czasie Gleb prawie ko\u0144czy\u0142 wdro\u017cenie w k8s i dodatkowo autowdro\u017cenie po commicie do mastera. \ud83d\ude42<\/p>\n<p>Jako magazyn wybrali\u015bmy MySQL, aby nie ryzykowa\u0107 przynajmniej z baz\u0105 danych (by\u0142y my\u015bli o CosmosDb).<\/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 \/>\nW rezultacie: <\/p>\n<ul>\n<li>Zrealizowali\u015bmy zapisywanie bie\u017c\u0105cych wsp\u00f3\u0142rz\u0119dnych kuriera z aplikacji w bazie.<\/li>\n<li>Pod\u0142\u0105czyli\u015bmy RabbitMQ i zapisali\u015bmy si\u0119 na wiadomo\u015bci o odebraniu zam\u00f3wienia przez kuriera, aby natychmiast wy\u015bwietla\u0107 zam\u00f3wienie kuriera w aplikacji.<\/li>\n<li>Zacz\u0119li\u015bmy zapisywa\u0107 w naszej bazie czas dostawy zam\u00f3wienia, po tym jak kurier naciska\u0142 przycisk w aplikacji. Nie zd\u0105\u017cyli\u015bmy doda\u0107 wysy\u0142ania zdarzenia z powrotem do RabbitMQ o tym, \u017ce zam\u00f3wienie zosta\u0142o dostarczone.<\/li>\n<li>Zrobi\u0142em wy\u015bwietlanie mapy na stronie currentorder na stronie z bie\u017c\u0105c\u0105 lokalizacj\u0105 kuriera. Ale ta funkcjonalno\u015b\u0107 pozosta\u0142a lekko niedoko\u0144czona, poniewa\u017c na \u015brodowisku nie uda\u0142o si\u0119 skonfigurowa\u0107 CORS do uzyskania wsp\u00f3\u0142rz\u0119dnych z naszej nowej us\u0142ugi.<\/li>\n<\/ul>\n<p><\/p>\n<h4>M87<\/h4>\n<p>\n<i>Roma Bukin, Gosza Polewoj (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/georgepolevoy\/\" class=\"user_link\">georgepolevoy<\/a><\/noindex>), Artiom Trofimuszkin<\/i><\/p>\n<p>Chcieli\u015bmy stworzy\u0107 dostawc\u0119 OpenID Connect, poniewa\u017c obecnie u\u017cywamy protoko\u0142u uwierzytelniania opracowanego wewn\u0119trznie, co wi\u0105\u017ce si\u0119 z szeregiem trudno\u015bci: niestandardowe biblioteki klienckie, niewygodna wsp\u00f3\u0142praca z partnerami zewn\u0119trznymi, a tak\u017ce potencjalne problemy z bezpiecze\u0144stwem (w ko\u0144cu OAuth2.0 i OpenID Connect w swoich standardowych implementacjach mo\u017cna uzna\u0107 za bezpieczne, a co do naszego rozwi\u0105zania \u2014 nie jestem pewny).<\/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 \/>\nStworzyli\u015bmy osobny serwis, emuluj\u0105cy serwis przechowywania danych osobowych, aby stworzy\u0107 ma\u0142y model dostawcy uwierzytelniania niezale\u017cnego od kraju, kt\u00f3ry pozyskiwa\u0142by dane osobowe z osobnego serwisu (w przysz\u0142o\u015bci dawa\u0142oby to mo\u017cliwo\u015b\u0107 posiadania jednego serwisu, z kt\u00f3rego mo\u017cna si\u0119 logowa\u0107 przy u\u017cyciu konta w dowolnym kraju, a jednocze\u015bnie spe\u0142nia\u0107 wymagania RODO i innych ustaw). T\u0119 cz\u0119\u015b\u0107 zrealizowali\u015bmy, podobnie jak dostawc\u0119, i uda\u0142o nam si\u0119 je ze sob\u0105 powi\u0105za\u0107. Nast\u0119pnie nale\u017ca\u0142o stworzy\u0107 API, kt\u00f3re by\u0142oby zabezpieczone tokenami wydawanymi przez dostawc\u0119, obs\u0142ugiwa\u0107 ich introspekcj\u0119 przez dostawc\u0119 i przekazywa\u0107 zabezpieczone dane, je\u015bli \u017c\u0105danie spe\u0142nia\u0142oby polityki autoryzacji (sprawdzamy, czy u\u017cytkownik jest uwierzytelniony w schemacie Bearer, czy w jego tokenie zawarty jest okre\u015blony zakres + czy sam u\u017cytkownik ma uprawnienie zezwalaj\u0105ce na wykonanie wywo\u0142ania). Ta cz\u0119\u015b\u0107 r\u00f3wnie\u017c zosta\u0142a zrealizowana. Ostatnim komponentem by\u0142 klient JavaScript, kt\u00f3remu wydawany by\u0142by token, za pomoc\u0105 kt\u00f3rego m\u00f3g\u0142by wo\u0142a\u0107 zabezpieczone API. T\u0119 cz\u0119\u015b\u0107 niestety nie zd\u0105\u017cyli\u015bmy wykona\u0107. To znaczy, ca\u0142a funkcjonalno\u015b\u0107 by\u0142a gotowa, ale cz\u0119\u015b\u0107 front-endowa nie zosta\u0142a przygotowana do zaprezentowania dzia\u0142ania ca\u0142ego systemu.<\/p>\n<h4>E-E-E (gra)<\/h4>\n<p>\n<i>Dima Afonczenko, Sasza Konowalow<\/i><\/p>\n<p>Stworzyli\u015bmy mini-gr\u0119 w Unity, w kt\u00f3rej zr\u0119czne r\u0119ce wrzucaj\u0105 kie\u0142bask\u0119 na pizz\u0119. W przypadku niepoprawnego wrzucenia kie\u0142baski na ekranie pojawia si\u0119 smutny napis \u201eOdrzucone\u201d, a je\u015bli ca\u0142a kie\u0142baska zostanie wrzucona poprawnie, pojawia si\u0119 losowy fakt o pizzy.<\/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 \/>\nChcieli\u015bmy zrobi\u0107 drugi poziom z wrzucaniem pomidor\u00f3w, ale nie zd\u0105\u017cyli\u015bmy.<\/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>Kr\u00f3tki ci\u0105g dalszy: kto zwyci\u0119\u017cy\u0142?<\/h2>\n<p>\nPrzed hackathonem rozmawiali\u015bmy z ch\u0142opakami, a ja pyta\u0142em, jak\u0105 nagrod\u0119 chcieliby otrzyma\u0107, je\u015bli wygraj\u0105. Okaza\u0142o si\u0119, \u017ce najcenniejsz\u0105 nagrod\u0105 by\u0142aby \u201edroga do produkcji\u201d. <\/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 \/>\nDlatego wkr\u00f3tce oczekujcie od nas zapowiedzi gry z r\u0119kami, kt\u00f3re rzucaj\u0105 pepperoni na pizz\u0119.<\/p>\n<blockquote><p>Jak m\u00f3g\u0142 zauwa\u017cy\u0107 uwa\u017cny czytelnik, wygra\u0142a dru\u017cyna \u201eE-E-E (gra)\u201d. Gratulujemy ch\u0142opakom!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Tylko zarejestrowani u\u017cytkownicy mog\u0105 bra\u0107 udzia\u0142 w ankiecie. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Zaloguj si\u0119<\/a><\/noindex>, prosz\u0119.<\/p>\n<h2 class=\"default-block__polling-title\">Kt\u00f3ry projekt najbardziej wam si\u0119 podoba\u0142?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (machine learning)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI dla 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>    Oddano g\u0142os 5 u\u017cytkownik\u00f3w. 3 u\u017cytkownik\u00f3w wstrzyma\u0142o si\u0119 od g\u0142osu.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/news\/kodim-pitstsa\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Kodujemy\u2013pizza | ProHoster","description":"Cze\u015b\u0107, Habr. Spontanicznie zorganizowali\u015bmy pierwszy wewn\u0119trzny hackathon.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}