{"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\/et\/blog\/news\/kodim-pitstsa","title":{"rendered":"Koodime\u2013pitsa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere, Habr. Me korraldasime spontaanselt oma esimese sisemise hackathoni. Otsustasin jagada teiega oma muresid ja j\u00e4reldusi selle ettevalmistusest kahe n\u00e4dala jooksul ning ka projekte, mis v\u00e4lja tulid.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" 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>Igav osa neile, kes huvituvad turundusest<\/h2>\n<p>\nAlustan v\u00e4ikese looga. <\/p>\n<p>Aprilli algus. Meie kontoris toimub MskDotNet Community esimene hackathon. Lahing Tatooine'i nimel k\u00e4ib, seekord meie galaktikas. Laup\u00e4ev. 20 meeskonda. Pitsa. K\u00f5ik on v\u00e4ga soe (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">t\u00f5endid<\/a><\/noindex>). Inflatable R2-D2 on saalis siluett. Meeskonnad kirjutavad k\u00f5ige \u00f5igemad algoritmid, et l\u00e4bida k\u00f5ige ohtlikum v\u00f5idus\u00f5it kaardil. L\u00f5uatame esimesi stardiv\u00f5istlusi. K\u00fcpsised ja kohvi p\u00e4\u00e4stavad meid. Ootasime korraldajatega, et laup\u00e4eval lahkub palju p\u00e4rastl\u00f5unal. Aga ei. 12 tundi kodeerimist on m\u00f6\u00f6das. Finaal. Midagi kukub v\u00e4lja, midagi ei k\u00e4ivitu. Aga k\u00f5ik on \u00f5nnelikud. Meie meeskond v\u00f5idab. Me oleme kahekordselt \u00f5nnelikud. <\/p>\n<p>Jagame r\u00f5\u00f5mu Slackis ja p\u00e4he tuleb idee: \"Peame korraldama oma hackathoni\". Kirjutan meie CTO-le Sashale. Vaikus. <\/p>\n<p>Hommik. Joon kontoris kohvi. N\u00e4en, et Sasha l\u00e4hestikku tuleb. \"Liza, see on suurep\u00e4rane! Meil on 21. aprillil oluline kuup\u00e4ev. Teeme!\" Mis iganes!? Nii kiiresti? Mida? Mul on vaja aprilli keskel Syktyvkarisse praktikale lennata. Ja las olla! Teeme.<\/p>\n<p>J\u00e4\u00e4nud on 2 n\u00e4dalat. Ma pole kunagi olnud hackathoni ainuorganisaator. Olgu see sisemine. Loe selle kohta artikleid. Kohutav. Vajalik on mitu kuud. Vajalik on mitu inimest. Vajalik on v\u00e4lja m\u00f5elda s\u00e4rk, auhinnad, tingimused, ajakava, huvi pakkuda, eesm\u00e4rk m\u00f5ista, eelarved. V\u00f5ib-olla peab isegi elu m\u00f5tte \u00fcle j\u00e4rele m\u00f5tlema. Ma kindlasti ei j\u00f5ua. Ja samal ajal, kui sa lugesid ja valmistasid end ette, on juba n\u00e4dal m\u00f6\u00f6das. Parim aeg artiklitest loobuda ja midagi ette v\u00f5tta. <\/p>\n<p><b class=\"spoiler_title\">Siin on meie n\u00e4dalase sisemise hackathoni kontrollnimekiri<\/b><\/p>\n<ul>\n<li><b>Plaani<\/b>: rahulikult istud ja kirjutad nimekirja sellest, mida hackathoni jaoks teha tuleb. <i>30 minutit<\/i>.<\/li>\n<li><b>\u00dclesanne<\/b>: osalejad pakuvad ja valivad ise projektid, mida nad soovivad Google Sheetsis luua. <i>Taust\u00fclesanne, 2 tundi<\/i>.<\/li>\n<li><b>Ajakava<\/b>: kirjutad p\u00f5lve peal l\u00fchikese ajakava kolme pausiga ja finaaliga. <i>20 minutit<\/i>.<\/li>\n<li><b>K\u00e4sklused<\/b>: avaldad hackathoni teadet ajakava kohta CTO-lt IT-kanalites Slackis\/e-kirjas\/jne ja lood eraldi kanali hackathoni jaoks. Seal jagunevad k\u00f5ik meeskondadesse ja need, kes pole veel otsustanud, teevad seda hackathoni esimeses 5 minutis. <i>Taust\u00fclesanne, 2 tundi<\/i>.<\/li>\n<li><b>Bonused.<\/b>: sa m\u00f5tled v\u00e4lja kaubam\u00e4rgi koos kahe arendajaga, annad selle disainerile joonistamiseks ja saad valmis toote. <i>Taustategevus, 3 p\u00e4eva<\/i>.<\/li>\n<li><b>H\u00e4kathon<\/b>: tuled kontorisse, koordineerid k\u00f5iki alguses, tegeled oma asjadega, loed Redditi, teatad t\u00f5sise n\u00e4oga iga pausi ajal v\u00e4rskest pitsast, pildistad loodust, kuulutad v\u00e4lja finaali, h\u00e4\u00e4letame koos ja valime v\u00f5itja. <i>1 p\u00e4ev<\/i>.<\/li>\n<li><b>T\u00e4htede all<\/b>: muidugi m\u00f5tled pidevalt, et k\u00f5ik l\u00e4heks h\u00e4sti. Loomulikult ei n\u00e4e k\u00f5ik sinu s\u00f5numit ja m\u00f5nega on parem r\u00e4\u00e4kida isiklikult. Loomulikult, kui sul on keegi abiks, muutub k\u00f5ik kaks korda lihtsamaks (mind aitas imeline Aljona).<\/li>\n<\/ul>\n<h2>V\u00e4hem igav osa h\u00e4katoni kuup\u00e4eva kohta<\/h2>\n<p>\nMiks 21. aprill? See p\u00e4ev on meie jaoks oluline. Just aasta tagasi, 21. aprillil, kukkusime koormuse all kokku esimestel n\u00e4dalavahetustel p\u00e4rast F\u00f6deraalse Reklaamikampaania algust. J\u00e4rgmine p\u00e4ev, p\u00fchap\u00e4eval, oli meie meeskond t\u00f6\u00f6l alates kella 8-st hommikul. Siis l\u00f5ime Trellos laua sundayhackathon ja algas 12 tunni vahetustega t\u00f6\u00f6 n\u00e4dal. Olukord oli nii kriitiline, et meil ei olnud aega isegi s\u00fc\u00fca ja meid toitsid teiste meeskondade poisid.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dcksikasjalikumat juttu saad lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">Fjodor Ov\u010dinnikovi lehelt<\/a><\/noindex> (meie SEO). Sellest ajast alates oleme palju muutnud, kuid seda kuup\u00e4eva ei unusta kindlasti.<\/p>\n<p>Sel aastal otsustasime, et see s\u00fcndmus v\u00e4\u00e4rib m\u00e4lestamist ja korraldasime esmakordselt Dodo ajaloos sisemise h\u00e4katoni, mis kestis 10 tundi. <\/p>\n<h2>K\u00f5ige v\u00e4hem igav osa h\u00e4katoni projektidest<\/h2>\n<p>\n<i>Vastutusest loobumine: k\u00f5ik kirjeldused on kirjutanud poisid ise, seega pole teksti autorlus minu enda.<\/i><\/p>\n<h4>Oleg L\u00f6rning (masin\u00f5pe)<\/h4>\n<p>\n<i>Dima Kohtnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Tahtsime teha n\u00e4rviv\u00f5rku, mis suudab tuvastada, milline pizza on pildil ilma igasuguste teadmisteta. Tulemuseks on v\u00e4ga lihtne ja m\u00e4nguline mudel \u2013 see tunnustab 10 erinevat pitsat, saime enam-v\u00e4hem aru, kuidas k\u00f5ik t\u00f6\u00f6tab, nii palju kui v\u00f5imalik \u00fche p\u00e4eva jooksul (~10 tundi).<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEelk\u00f5ige m\u00f5istsime, et t\u00f6\u00f6stus on j\u00f5udnud tasemele, kus tavaline arendaja saab kasutada valmis teeke, lugeda dokumentatsiooni ja \u00f5petada oma n\u00e4rviv\u00f5rku ilma s\u00fcgavate teadmisteta, ning see t\u00f6\u00f6tab piisavalt h\u00e4sti reaalse probleemide lahendamiseks.<\/p>\n<p>Kasutatud t\u00f6\u00f6riistad: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 mugav ja lihtne teeg, millega t\u00f6\u00f6tada masin\u00f5ppe ja arvutin\u00e4gemisega.<\/li>\n<li>Proovisime kahte mudelit \u2013 ResNet50, Yolo.<\/li>\n<li>Kood kirjutati selgelt Pythonis.<\/li>\n<\/ul>\n<p>\nMeil oli 11000 fotot, kuid neist peaaegu 3\/4 osutusid pr\u00fcgi, ning \u00fclej\u00e4\u00e4nud olid erinevates, sobimatutes nurkades. L\u00f5puks kasutasime valmis mudelit (mis lihtsalt oskab leida pitsat) ja selle abil eraldasime k\u00f5ige halvemad fotod. Edasi, kui fotol oli pitsanimi \u2013 jagasime need kaustadesse, kuid osutus, et nimed ei kattunud tegelikkusega ja tuli ise k\u00e4sitsi puhastada. L\u00f5puks j\u00e4i umbes 500-600 fotot, mis on selgelt k\u00fcllaltki v\u00e4ike number, kuid sellest siiski piisab, et eristada 10 pitsat \u00fcksteisest.<\/p>\n<p>Treeninguks kasutasime Azure'i k\u00f5ige odavamat virtuaalset masinat NVIDIA Tesla K80-ga. Sellel treenisime 100 epohhi, kuid juba p\u00e4rast 50 epohhi oli n\u00e4ha, et v\u00f5rk oli \u00fclekoormatud, kuna andmestik oli v\u00e4ike.<\/p>\n<p>Esmalt \u2014 kogu probleem seisneb heade andmete puudumises.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u00f5ib-olla me m\u00f5ned terminid segamini ajasime, kuid tuleb arvestada, et meil ei ole \u00fcldse kogemust k\u00f5igi nende asjadega.<\/p>\n<h4>GUI for NOOBS (kontrollimiseks pitsade tellimiseks)<\/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>Koondasime protot\u00fc\u00fcbi konsooli rakendusest geek'idele, mille abil saab tellida pitsat terminali v\u00f5i k\u00e4surea kaudu, v\u00f5i isegi integreerida rakenduste juurutamise torusse ja edastada pitsat kontorisse p\u00e4rast edukat v\u00e4ljaandmist.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00f6\u00f6 jagunes mitmeks osaks: uurisime, kuidas meie API on loodud mobiilirakendustele, koostasime oma CLI abi <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> ja seadistasime loodud paketi avaldamise. Viimase \u00fclesandega seoses oli hackathon'i l\u00f5pupoole mitu ebameeldivat minutit. K\u00f5ik toimis meil kohalikult ja isegi vanad avaldatud versioonid paketist t\u00f6\u00f6tasid, kuid uued (millesse oli lisatud rohkem \u00e4gedaid funktsioone ja emotikone) keeldusid t\u00f6\u00f6tamast. Kulutasime umbes 40 minutit, et aru saada, mis valesti l\u00e4ks, kuid l\u00f5puks t\u00f6\u00f6tas k\u00f5ik maagiliselt ise.)<\/p>\n<p>Meie maksimumprogramm hackathon'il oli t\u00f5eline pitsade tellimine kontorisse meie CLI kaudu. Testisime k\u00f5ik k\u00fcmme korda katsetustel, kuid mul olid siiski k\u00e4ed v\u00e4risedes, kui ma produtsoonis k\u00e4ske sisestasin.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKokkuv\u00f5ttes \u2014 me tegime selle ikkagi \u00e4ra!<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" 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 Bruzmelyov (autor), Vanja Zverevi, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrei Sarafanov<\/i><\/p>\n<p>V\u00f5tsime idee \u00abKullerirakendus\u00bb.<\/p>\n<p><b class=\"spoiler_title\">Eellugu ettevalmistusest.<\/b>Alguses m\u00f5tlesin, milliseid funktsioone v\u00f5iks rakenduses olla. Tuli v\u00e4lja umbes selline funktsionaalsuse loetelu:<\/p>\n<ul>\n<li>Rakendus siseneb kohaletoimetamise kassasse koodiga.<\/li>\n<li>Rakenduses on kohe n\u00e4htavad saadaval olevad tellimused ja tellimused, mida tuleks v\u00f5tta.<\/li>\n<li>Kuller m\u00e4rgib tellimuse ja v\u00f5tab selle teele.<\/li>\n<li>Tal kuvatakse arvutatud aeg ja j\u00f5uab ta kohale v\u00f5i mitte.<\/li>\n<li>Kliendile n\u00e4itab, et kuller on teel.<\/li>\n<li>Kliendile hakkab kuvatakse kulleri asukoht kaardil ja arvutatud aeg.<\/li>\n<li>Kuller saab rakenduse kaudu kliendile vestluses kirjutada.<\/li>\n<li>Klient saab rakenduse kaudu kullerile vestluses kirjutada.<\/li>\n<li>Viie minuti jooksul enne saabumist saadab klientidele s\u00f5numi, et kuller on l\u00e4hedal, olge valmis.<\/li>\n<li>Kuller m\u00e4rgib rakenduses, et ta on saabunud ja ootab.<\/li>\n<li>Kuller helistab rakendusest \u00fche klikiga ja teatab, et (t\u00f5useb, on kohal jne).<\/li>\n<li>Klient kinnitab tellimuse ja sisestab rakendusest v\u00f5i SMS-ist pin-koodi, et kinnitada tarnimist. (nagu allkiri) Et kuller ei saaks tarnimist enneaegselt l\u00f5petada, kui ta viibib hiljaks.<\/li>\n<li>Tellimus m\u00e4rgitakse s\u00fcsteemis tarnituks.<\/li>\n<\/ul>\n<p>Lisaks paar alternatiivset stsenaariumi:<\/p>\n<ul>\n<li>Kuller saab tellimuse m\u00e4rkida mitte-tarnituks ja valida p\u00f5hjuse.<\/li>\n<li>Kuller, kui ta hilineb, saab \u00fche nupuvajutusega saata elektroonilise sertifikaadi SMS-iga. V\u00f5i sertifikaat saadetakse automaatselt, kui tarnimise t\u00e4htaega ei j\u00e4rgita.<\/li>\n<\/ul>\n<p>\nProjektist oli kindlasti tunda perspektiivi ja vajalikku tunnet.<\/p>\n<p>J\u00e4rgmisel p\u00e4eval l\u00e4ksime meeskonnaga l\u00f5unale ja arutasime, kuidas rakenduse minimaalne funktsionaalsus v\u00e4lja n\u00e4eb. <\/p>\n<p>Kokku tuli j\u00e4rgmine loetelu sellest, mida tuli hackathonil l\u00f5petada:<\/p>\n<ul>\n<li>Sisselogimine kohaletoimetamise kassasse.<\/li>\n<li>Kuvada praegune asukoht.<\/li>\n<li>Saata andmed v\u00e4lisele API-le (koordinaadid, tellimuse v\u00f5tmine, tellimuse toimetamine).<\/li>\n<li>Saada andmed v\u00e4lisest API-st (kullerite praegused tellimused).<\/li>\n<li>Saata s\u00fcndmus, et tellimus on v\u00f5etud kohaletoimetamiseks \/ toimetatud.<\/li>\n<li>Kuvada kulleri praegune asukoht kaardil veebisaidil.<\/li>\n<\/ul>\n<p>\nPeamine t\u00f6\u00f6, nagu arvestati, pidi toimuma tagaplaani loomisel, rakenduse loomiseks (aruteludest valiti rakenduse arendamiseks ReactNative, t\u00e4psemalt selle kohalduse jaoks \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, v\u00f5imaldades \u00fcldse mitte kirjutada nativet koodi). Backend'i plaanis oli algselt lootus Vanya Zverevi peale, kui kogenud meie teenuse ja k8s malliga t\u00f6\u00f6taja (mille ta endale v\u00f5ttis). ReactNative'iga hakkasime koos proovima mina ja Andrei Sarafanov.<\/p>\n<p>Otsustasin proovida kohe luua t\u00f6\u00f6alust repot projekti jaoks. Kell 12 \u00f6\u00f6sel sattusin arusaamisele, et ReactNative'is ei t\u00f6\u00f6ta geolokatsioon taustal h\u00e4sti, kui mitte kirjutada nativet koodi, natuke frustreerisin. Siis leevendus olukord, kui sain aru, et loen dokumentatsiooni mitte expo.io raamistiku, vaid ReactNative'i kohta. L\u00f5puks sain \u00f5htuga selgeks, kuidas saada expo.io kaudu praegune asukoht ja joonistada eraldi ekraanid (logimise, tellimuse kuvamise jne jaoks).<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHommikul hackathon'il meelitasime Gleb'i oma \u00fcliv\u00e4gevasse projekti. Kiiresti viskasime kokku plaani, mida teha on vaja.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTehtud viga, kui p\u00fc\u00fcdsime projekti malliga teha suhtlust mitte HTTP kaudu, vaid GRPC kaudu, kuna keegi ei osanud GRPC klienti JavaScriptile kokku panna. L\u00f5puks, kulutades sellele umbes poolteist tundi, loobusime sellest ideest. Seet\u00f5ttu hakkasid inimesed backend'is juba valmis serverit GRPC'lta WebApi'le \u00fcmberehitama. Pool tunni p\u00e4rast saime l\u00f5puks seadistada rakenduse suhtlemise backendiga, oh imet. Kuid samal ajal t\u00f6\u00f6tas Gleb peaaegu juba k8s-is deploy l\u00f5petamas, lisaks automaatne deploy commit'i j\u00e4rgi masterisse. \ud83d\ude42<\/p>\n<p>S\u00e4ilitamiseks valisime MySQL, et mitte riskida v\u00e4hemalt andmebaasiga (olid m\u00f5tted CosmosDb kohta).<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTulemus: <\/p>\n<ul>\n<li>Rakendasime rakendusest kursori praeguste koordinaatide salvestamise andmebaasi.<\/li>\n<li>Lisainime RabbitMQ ja liitusime s\u00f5numitega, kui kuller v\u00f5tab tellimuse, et kohe kuvada tellimus kullerile rakenduses.<\/li>\n<li>Alustasime enda andmebaasi salvestamise tellimuse kohaletoimetamise ajast, peale seda, kui kuller vajutas rakenduses nuppu. Ei saanud \u00f5igeaegselt lisada s\u00f5numi saatmist tagasi rabbit'i, et tellimus on kohaletoimetatud.<\/li>\n<li>Tehtud kaardi kuvamine currentorder lehe peal veebis koos kulleri praeguse asukohaga. Kuid see funktsioon j\u00e4i veidi poolikuks, kuna keskkonnas ei \u00f5nnestunud seadistada CORS'i, et saada koordinaate meie uuest teenusest.<\/li>\n<\/ul>\n<p><\/p>\n<h4>M87<\/h4>\n<p>\n<i>Roma Bukin, 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>Soovisime rakendada OpenID Connect pakkujat, kuna praegu kasutame oma arendatud autentimise protokolli, mis tekitab mitmeid raskusi: kohandatud klienditeegid, ebamugav koost\u00f6\u00f6 v\u00e4liste partneritega, v\u00f5imalikud turvalisuse probleemid (kuigi OAuth2.0 ja OpenID Connect ideaalversioonis v\u00f5ib pidada turvaliseks, siis meie lahenduse osas ma ei ole kindel).<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOleme loonud eraldi teenuse, mis emuleerib isikuandmete salvestamise teenust, et luua v\u00e4ike riigist s\u00f5ltumatu autentimise pakkuja mudel, mis k\u00fcsib isikuandmeid eraldi teenusest (see looks tulevikus v\u00f5imaluse omada \u00fchte teenust, millega saaks siseneda konto kaudu igas riigis, samal ajal j\u00e4rgides GDPR-i ja muid seadusi). Selle osa tegime, nagu ka pakkuja, ja seostasime need omavahel. Edasi tuli luua API, mis oleks kaitstud pakkuja v\u00e4ljastatud tokenitega, toetada nende introspektsiooni pakkuja kaudu ja anda v\u00e4lja kaitstud andmeid, kui p\u00e4ring vastab autendipoliitikale (kontrollime, et kasutaja on autentitud Bearer skeemi kaudu, tema tokenis on kindel ulatus + kasutajal endal on luba, mis lubab kutse teostamist). See osa oli samuti l\u00f5pule viidud. Viimane komponent oli JavaScript klient, kellele v\u00e4ljastatakse token, millega ta kutsuks v\u00e4lja kaitstud API. Selle osa me valmis ei saanud. See t\u00e4hendab, et kogu funktsionaalne osa oli valmis, kuid esipaneeli osa, et demonstreerida kogu s\u00fcsteemi toimimist, ei olnud valmis.<\/p>\n<h4>E-E-E (m\u00e4ng)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Me tegime mini-m\u00e4ngu Unitys, kus vilkad k\u00e4ed viskavad vorsti pitsale. Kui sa viskad vorsti valesti, ilmub ekraanile kurb teade \"Tagasi l\u00fckatud\", ja kui kogu vorst on \u00f5igesti visatud, ilmub juhuslik fakt pitsa kohta.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSoovisime teha teist taset tomatite viskamiseks, kuid ei j\u00f5udnud.<\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>L\u00fchike j\u00e4tk: kes v\u00f5itis?<\/h2>\n<p>\nEnne hackatoni r\u00e4\u00e4kisime noortega ja ma k\u00fcsisin, millist preemiat nad tahaksid saada, kui v\u00f5idavad. Selgus, et k\u00f5ige v\u00e4\u00e4rtuslikum preemia oleks \"tee tootmisse\". <\/p>\n<p><img decoding=\"async\" alt=\"Koodime\u2013pitsa\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega oodake meielt peagi m\u00e4ngu reklaami, kus k\u00e4ed viskavad pitsa peale Piperroni.<\/p>\n<blockquote><p>Kuidas v\u00f5is t\u00e4helepanelik lugeja m\u00e4rgata, v\u00f5itis meeskond \u00abE-E-E (m\u00e4ng)\u00bb. Palju \u00f5nne, poisid!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Ainult registreeritud kasutajad saavad k\u00fcsitluses osaleda. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logige sisse<\/a><\/noindex>, palun.<\/p>\n<h2 class=\"default-block__polling-title\">Milline projekt teile rohkem meeldis?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg L\u00f6rning (masin\u00f5pe)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI NOOB-idele<\/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>    H\u00e4\u00e4letas 5 kasutajat. 3 kasutajat j\u00e4id erapooletuks.<br \/>\n<br \/>Allikas: <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\/et\/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=\"et_EE\" \/>\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\/et\/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\udd47Koodime\u2013pitsa | ProHoster","description":"Tere, Habr. Me korraldasime spontaanselt oma esimese sisehakatoni.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}