{"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\/sv\/blog\/news\/kodim-pitstsa","title":{"rendered":"Koding\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, Habr. Vi genomf\u00f6rde spontant v\u00e5r f\u00f6rsta interna hackathon. Jag ville dela med mig av mina sm\u00e4rtor och insikter om f\u00f6rberedelserna under tv\u00e5 veckor, samt de projekt som kom till st\u00e5nd.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\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>Tr\u00e5kiga delen f\u00f6r dem som \u00e4r intresserade av marknadsf\u00f6ring<\/h2>\n<p>\nJag b\u00f6rjar med en liten historia. <\/p>\n<p>B\u00f6rjan av april. P\u00e5 v\u00e5rt kontor p\u00e5g\u00e5r den f\u00f6rsta hackathonen f\u00f6r MskDotNet Community. Slaget om Tatooine \u00e4r i full g\u00e5ng, i v\u00e5r galax den h\u00e4r g\u00e5ngen. L\u00f6rdag. 20 lag. Pizza. Allt \u00e4r mycket gemytligt (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">bevis<\/a><\/noindex>). En uppbl\u00e5sbar R2-D2 syns i rummet. Lag skriver de mest korrekta algoritmerna f\u00f6r att klara av det farligaste loppet p\u00e5 kartan. Vi skjuter p\u00e5 starten f\u00f6r de f\u00f6rsta loppen. Kakor och kaffe r\u00e4ddar oss. Vi, arrang\u00f6rerna, trodde att m\u00e5nga skulle g\u00e5 hem efter lunch p\u00e5 l\u00f6rdagen. Men nej. 12 timmar kodning bakom oss. Finalen. N\u00e5got faller bort, n\u00e5got startar inte. Men alla \u00e4r glada. V\u00e5rt lag vinner. Vi \u00e4r glada dubbelt. <\/p>\n<p>Jag delar gl\u00e4djen i Slack och f\u00e5r en id\u00e9: \"Vi m\u00e5ste g\u00f6ra v\u00e5r egen hackathon\". Jag skriver till v\u00e5r CTO Sasja. Tystnad. <\/p>\n<p>Morgon. Jag dricker kaffe p\u00e5 kontoret. Jag ser Sasja n\u00e4rma sig bakifr\u00e5n. \"Liza, det h\u00e4r \u00e4r utm\u00e4rkt! Vi har precis den 21 april en viktig datum. L\u00e5t oss g\u00f6ra det!\" Vad!? S\u00e5 snabbt? Va? Jag m\u00e5ste flyga till Syktyvkar f\u00f6r praktik i mitten av april. Men skit i det! L\u00e5t oss k\u00f6ra.<\/p>\n<p>Tv\u00e5 veckor kvar. Jag har aldrig varit ensam arrang\u00f6r av en hackathon. \u00c4ven om det \u00e4r en intern. Jag l\u00e4ser artiklar om det. Hep. Det kr\u00e4vs flera m\u00e5nader. Det kr\u00e4vs flera personer. Man m\u00e5ste t\u00e4nka p\u00e5 merch, priser, f\u00f6ruts\u00e4ttningar, schema, intressera, f\u00f6rst\u00e5 syftet, budgetar. Kanske till och med gr\u00e4va i livets mening. Jag kommer definitivt inte att hinna. Och medan du l\u00e4ste och f\u00f6rberedde dig har redan en vecka g\u00e5tt. Det \u00e4r h\u00f6g tid att sluta l\u00e4sa artiklar och b\u00f6rja g\u00f6ra n\u00e5got. <\/p>\n<p><b class=\"spoiler_title\">H\u00e4r \u00e4r v\u00e5r checklist f\u00f6r att arrangera en intern hackathon p\u00e5 en vecka<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: s\u00e4tt dig lugnt ner och skriv en lista \u00f6ver vad som m\u00e5ste g\u00f6ras f\u00f6r hackathonen. <i>30 minuter<\/i>.<\/li>\n<li><b>Uppgift<\/b>: deltagarna f\u00f6resl\u00e5r sj\u00e4lva och v\u00e4ljer projekt de vill skapa i Google Sheets. <i>Bakgrundsuppgift, 2 timmar<\/i>.<\/li>\n<li><b>Schema<\/b>: skriver snabbt en kort tidsplan med h\u00e4nsyn till 3 pauser och finalen. <i>20 minuter<\/i>.<\/li>\n<li><b>Kommandon<\/b>: publicera meddelandet om hackathonen med schemat fr\u00e5n CTO i IT-kanaler i Slack\/e-post\/etc och skapa en separat kanal f\u00f6r hackathonen. I den delar alla upp sig i lag, och de som \u00e4r os\u00e4kra g\u00f6r det inom de f\u00f6rsta 5 minuterna av hackathonen. <i>Bakgrundsuppgift, 2 timmar<\/i>.<\/li>\n<li><b>F\u00f6rdelar<\/b>: du kommer p\u00e5 merch med tv\u00e5 utvecklare, ger det till designern f\u00f6r illustration, f\u00e5r det klart. <i>Bakgrundsuppgift, 3 dagar<\/i>.<\/li>\n<li><b>Hackathon<\/b>: du kommer till kontoret, koordinerar alla i b\u00f6rjan, sysslar med dina grejer, l\u00e4ser Reddit, med ett viktigt uttryck meddelar du varje paus om ny pizza, fotograferar solnedg\u00e5ngen, annonserar finalen, r\u00f6star tillsammans och v\u00e4ljer vinnaren. <i>1 dag<\/i>.<\/li>\n<li><b>Under stj\u00e4rnorna<\/b>: sj\u00e4lvklart t\u00e4nker du hela tiden p\u00e5 att allt ska g\u00e5 bra. Sj\u00e4lvklart f\u00e5r inte alla se ditt meddelande och med vissa \u00e4r det b\u00e4ttre att prata personligen. Sj\u00e4lvklart, om n\u00e5gon hj\u00e4lper dig, blir allt dubbelt s\u00e5 enkelt (jag fick fantastisk hj\u00e4lp av Alena).<\/li>\n<\/ul>\n<h2>Mindre tr\u00e5kig del om hackathonets datum<\/h2>\n<p>\nVarf\u00f6r den 21 april? Denna dag \u00e4r viktig f\u00f6r oss. Exakt ett \u00e5r sedan, den 21 april, kollapsade vi under belastning under de f\u00f6rsta helgerna efter starten av den Federala Reklamekampanjen. Dagen efter, p\u00e5 s\u00f6ndagen, var v\u00e5rt team p\u00e5 jobbet fr\u00e5n klockan 8 p\u00e5 morgonen. D\u00e5 skapade vi en Trello-tavla som hette sundayhackathon och veckan av 12 timmars skiftarbete b\u00f6rjade. Situationen var s\u00e5 kritisk att vi inte ens hade tid att \u00e4ta och andra team matade oss.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn mer detaljerad ber\u00e4ttelse kan du l\u00e4sa p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">Fjodor Ovtsjinnikovs sida<\/a><\/noindex> (v\u00e5r CEO). Sedan dess har vi f\u00f6r\u00e4ndrat mycket, men datumet kommer vi definitivt inte att gl\u00f6mma.<\/p>\n<p>I \u00e5r best\u00e4mde vi oss f\u00f6r att detta evenemang f\u00f6rtj\u00e4nar att bli ih\u00e5gkommet och i b\u00e4sta tradition arrangerade vi det f\u00f6rsta interna hackathonet i Dodo-historien som p\u00e5gick i 10 timmar. <\/p>\n<h2>Den mest sp\u00e4nnande delen om hackathonprojekten<\/h2>\n<p>\n<i>Disclaimer: alla beskrivningar skrevs av killarna sj\u00e4lva, s\u00e5 textens f\u00f6rfattarskap \u00e4r inte mitt.<\/i><\/p>\n<h4>Oleg Learning (maskininl\u00e4rning)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Vi ville skapa ett neuronn\u00e4t som kunde avg\u00f6ra vilken pizza som fanns p\u00e5 fotot utan n\u00e5gra f\u00f6rkunskaper. Slutresultatet blev en v\u00e4ldigt enkel och leksaksliknande \u2013 den k\u00e4nner igen 10 olika pizzor, vi fick en ungef\u00e4rlig f\u00f6rst\u00e5else f\u00f6r hur allt fungerar, s\u00e5 l\u00e5ngt det \u00e4r m\u00f6jligt p\u00e5 en dag (~10 timmar).<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpecifikt f\u00f6rstod vi att industrin har n\u00e5tt en niv\u00e5 d\u00e4r en vanlig utvecklare kan ta f\u00e4rdiga bibliotek, l\u00e4sa dokumentationen och tr\u00e4na sitt neuronn\u00e4t utan djupg\u00e5ende \u00e4mneskunskaper. Och det fungerar tillr\u00e4ckligt bra f\u00f6r att l\u00f6sa verkliga problem.<\/p>\n<p>Verktygen som anv\u00e4ndes: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 ett bekv\u00e4mt och enkelt bibliotek f\u00f6r arbete med maskininl\u00e4rning och datorseende.<\/li>\n<li>Vi testade tv\u00e5 modeller \u2013 ResNet50, Yolo.<\/li>\n<li>Koden skrevs, f\u00f6rst\u00e5s, i Python.<\/li>\n<\/ul>\n<p>\nVi hade 11000 bilder, men bland dem visade sig n\u00e4stan 3\/4 vara skr\u00e4p, och bland de \u00e5terst\u00e5ende var det olika, ol\u00e4mpliga vinklar. S\u00e5 sm\u00e5ningom anv\u00e4nde vi en f\u00e4rdig modell (som bara kan hitta pizza) och med dess hj\u00e4lp sorterade vi ut det mest usla. Dessutom, i bildens namn fanns namnet p\u00e5 pizzan \u2014 s\u00e5 vi delade upp dem i mappar, men det visade sig att namnen inte \u00f6verensst\u00e4mde med verkligheten och h\u00e4r fick vi h\u00e5lla p\u00e5 och rensa f\u00f6r hand. I slut\u00e4ndan \u00e5terstod cirka 500-600 bilder, det \u00e4r uppenbart att detta \u00e4r en f\u00f6rsvinnande liten m\u00e4ngd, men \u00e4nd\u00e5 var det tillr\u00e4ckligt f\u00f6r att s\u00e4rskilja 10 pizzor fr\u00e5n varandra.<\/p>\n<p>F\u00f6r att tr\u00e4na n\u00e4tverket anv\u00e4nde vi den billigaste virtuella maskinen i Azure p\u00e5 NVIDIA Tesla K80. Vi tr\u00e4nade den i 100 epoker, men det var tydligt att n\u00e4tverket \u00f6versv\u00e4mmat redan efter 50 epoker, p\u00e5 grund av att datasetet var litet.<\/p>\n<p>Problemet ligger helt enkelt i bristen p\u00e5 bra data.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kanske blandade ihop termerna lite, men man m\u00e5ste ta h\u00e4nsyn till att vi \u00f6verhuvudtaget inte har n\u00e5gon erfarenhet av att arbeta med allt detta.<\/p>\n<h4>GUI f\u00f6r NOOBS (terminal f\u00f6r att best\u00e4lla pizza)<\/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 Bikinin, Zhenya Vasiliev<\/i><\/p>\n<p>Vi byggde en prototyp av en konsolapplikation f\u00f6r n\u00f6rdar, som g\u00f6r att man kan best\u00e4lla pizza via terminalen eller kommandoraden, eller till och med integrera den i deploy-pipelinen och vid framg\u00e5ngsrik release leverera pizza till kontoret.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArbetet delades upp i flera delar: vi hade problem med att f\u00f6rst\u00e5 hur v\u00e5r API f\u00f6r mobilappar var uppbyggd, vi samlade v\u00e5rt eget CLI med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> och konfigurerade publiceringen av v\u00e5rt skapade paket. Den senaste uppgiften var relaterad till n\u00e5gra obehagliga minuter n\u00e4ra slutet av hackathonet. Allt fungerade lokalt och till och med \u00e4ldre publicerade versioner av paketet fungerade, men de nya (d\u00e4r fler coola funktioner och emojis lades till) ville inte fungera. Vi spenderade ungef\u00e4r 40 minuter f\u00f6r att f\u00f6rst\u00e5 vad som hade g\u00e5tt fel, men till slut fungerade allt magiskt av sig sj\u00e4lv).<\/p>\n<p>V\u00e5rt maxm\u00e5l f\u00f6r hackathonet var att g\u00f6ra en verklig pizzaorder till kontoret via v\u00e5rt CLI. Vi testade det flera g\u00e5nger p\u00e5 testservern, men jag var fortfarande nerv\u00f6s n\u00e4r jag skrev in kommandon p\u00e5 produkten.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom resultat \u2013 vi gjorde det faktiskt!<\/p>\n<p><img decoding=\"async\" alt=\"Koding\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\u00ebv (f\u00f6rfattare), Vanya Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrey Sarafanov<\/i><\/p>\n<p>Vi tog id\u00e9n \"App f\u00f6r kuriren\".<\/p>\n<p><b class=\"spoiler_title\">Bakgrundshistorien om f\u00f6rberedelserna.<\/b>Jag b\u00f6rjade med att t\u00e4nka p\u00e5 vilka funktioner som kan finnas i appen? Det blev ungef\u00e4r en s\u00e5dan lista med funktioner:<\/p>\n<ul>\n<li>Appen loggar in i leveranssystemet med en kod.<\/li>\n<li>I appen syns omedelbart tillg\u00e4ngliga best\u00e4llningar, de best\u00e4llningar som m\u00e5ste h\u00e4mtas.<\/li>\n<li>Kuriren markerar best\u00e4llningen och tar den med p\u00e5 resan.<\/li>\n<li>Han f\u00e5r se ber\u00e4knad tid och om han hinner eller inte.<\/li>\n<li>Kunden ser att kuriren har gett sig av.<\/li>\n<li>Kunden b\u00f6rjar se kurirens position p\u00e5 kartan och ber\u00e4knad tid.<\/li>\n<li>Kuriren kan skriva till kunden i chatten fr\u00e5n appen.<\/li>\n<li>Kunden kan skriva till kuriren i chatten fr\u00e5n appen.<\/li>\n<li>Fem minuter innan ankomst f\u00e5r kunden ett meddelande att kuriren \u00e4r n\u00e4ra, var beredd.<\/li>\n<li>Kuriren markerar i appen att han har anl\u00e4nt och v\u00e4ntar.<\/li>\n<li>Kuriren kan ringa fr\u00e5n appen med ett klick och informera att (han kommit, \u00e4r p\u00e5 v\u00e4g, etc.)<\/li>\n<li>Kunden accepterar best\u00e4llningen och anger pin-koden fr\u00e5n appen eller SMS f\u00f6r att bekr\u00e4fta leveransen. (som ett digitalt kvitto) S\u00e5 att kuriren inte kan avsluta leveransen i f\u00f6rv\u00e4g om han \u00e4r sen.<\/li>\n<li>Best\u00e4llningen markeras som levererad i systemet.<\/li>\n<\/ul>\n<p>Plus ett par alternativa scenarier:<\/p>\n<ul>\n<li>Kuriren kan markera best\u00e4llningen som ej levererad och v\u00e4lja anledning.<\/li>\n<li>Kuriren kan, vid f\u00f6rsening, skicka ett elektroniskt certifikat via SMS med ett klick. Eller s\u00e5 kommer certifikatet automatiskt vid \u00f6verskridande av leveranstiden.<\/li>\n<\/ul>\n<p>\nK\u00e4nslan av potential och behovet av detta projekt gav verkligen energi.<\/p>\n<p>N\u00e4sta dag gick vi med teamet p\u00e5 lunch och diskuterade hur den minimala funktionen av appen skulle se ut. <\/p>\n<p>Resultatet blev f\u00f6ljande lista \u00f6ver vad som skulle g\u00f6ras under hackathonet:<\/p>\n<ul>\n<li>Inloggning i leveranssystemet.<\/li>\n<li>Visa aktuell position.<\/li>\n<li>Skicka data till extern API (koordinater, plockade best\u00e4llningar, levererade best\u00e4llningar).<\/li>\n<li>H\u00e4mta data fr\u00e5n extern API (aktuella best\u00e4llningar f\u00f6r kuriren).<\/li>\n<li>Skicka en h\u00e4ndelse om att en best\u00e4llning har tagits f\u00f6r leverans\/levert.<\/li>\n<li>Visa kurirens aktuella position p\u00e5 kartan p\u00e5 webbplatsen.<\/li>\n<\/ul>\n<p>\nHuvudarbetet, som jag s\u00e5g det, skulle vara att skapa backend, sj\u00e4lva appen (efter diskussioner valde vi ReactNative f\u00f6r utveckling av appen, n\u00e4rmare best\u00e4mt ett paket ovanf\u00f6r det \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, vilket g\u00f6r att man n\u00e4stan inte beh\u00f6ver skriva n\u00e5gon egen kod). N\u00e4r det g\u00e4ller backend fanns det fr\u00e5n b\u00f6rjan f\u00f6rhoppningar p\u00e5 Vanya Zverev, som \u00e4r erfaren i arbetet med v\u00e5r tj\u00e4nstmall och k8s (det arbete som han tog p\u00e5 sig). ReactNative testade jag och Andrei Sarafanov.<\/p>\n<p>Jag beslutade mig f\u00f6r att f\u00f6rs\u00f6ka skapa ett arbetsrepository f\u00f6r sj\u00e4lva projektet direkt. Vid midnatt st\u00f6tte jag p\u00e5 problemet att geolokalisering fungerar d\u00e5ligt i bakgrunden i ReactNative utan att skriva nativ kod, vilket gjorde mig lite frustrerad. Men jag lugnade mig n\u00e4r jag ins\u00e5g att jag l\u00e4ste dokumentationen f\u00f6r expo.io-ramverket ist\u00e4llet f\u00f6r ReactNative. I slutet av kv\u00e4llen f\u00f6rstod jag hur jag skulle f\u00e5 den aktuella positionen i expo.io och rita separata sk\u00e4rmar (f\u00f6r inloggning, visning av best\u00e4llningar osv.).<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 morgonen p\u00e5 hackathonet drogs Gleb in i deras superlovande projekt. De skissade snabbt upp en plan f\u00f6r vad som beh\u00f6vde g\u00f6ras.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi gjorde ett misstag n\u00e4r vi, enligt projektmallen, f\u00f6rs\u00f6kte kommunicera inte via HTTP utan via GRPC, eftersom ingen visste hur man skulle bygga en GRPC-klient f\u00f6r JavaScript. Till slut, efter att ha lagt cirka en och en halv timme p\u00e5 det, \u00f6vergav vi den id\u00e9n. P\u00e5 grund av detta b\u00f6rjade killarna i backend renovera den f\u00e4rdiga servern fr\u00e5n GRPC till WebApi. Efter en halvtimme lyckades vi \u00e4ntligen st\u00e4lla in kommunikationen mellan applikationen och backend, vilket var en otrolig l\u00e4ttnad. Men under samma tid h\u00f6ll Gleb p\u00e5 att f\u00e5 klar sin deployment till k8s, plus autodeployment vid commit till master. \ud83d\ude42<\/p>\n<p>Som lagring valde vi MySQL f\u00f6r att inte riskera med databasen (vi hade tankar om CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSlutsatsen: <\/p>\n<ul>\n<li>Vi implementerade sparandet av kurirens aktuella koordinater fr\u00e5n applikationen till databasen.<\/li>\n<li>Vi kopplade in RabbitMQ och anm\u00e4lde oss till meddelanden om att kuriren tagit emot en best\u00e4llning, f\u00f6r att omedelbart visa best\u00e4llningen f\u00f6r kuriren i applikationen.<\/li>\n<li>Vi b\u00f6rjade spara tiden f\u00f6r leverans av best\u00e4llningen i v\u00e5r databas, efter att kuriren tryckt p\u00e5 knappen i applikationen. Vi hann inte l\u00e4gga till att skicka tillbaka h\u00e4ndelsen till RabbitMQ om att best\u00e4llningen var levererad.<\/li>\n<li>Jag gjorde en kartvisning p\u00e5 sidan currentorder p\u00e5 webbplatsen med kurirens aktuella position. Men denna funktionalitet f\u00f6rblev n\u00e5got ofullst\u00e4ndig, eftersom vi p\u00e5 milj\u00f6n inte lyckades st\u00e4lla in CORS f\u00f6r att h\u00e4mta koordinater fr\u00e5n v\u00e5r nya tj\u00e4nst.<\/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>Vi ville implementera en OpenID Connect-leverant\u00f6r, eftersom vi f\u00f6r n\u00e4rvarande anv\u00e4nder ett autentiseringsprotokoll av egen utveckling, vilket skapar en rad sv\u00e5righeter: skr\u00e4ddarsydda klientbibliotek, besv\u00e4rlig hantering fr\u00e5n externa partners och eventuella s\u00e4kerhetsproblem (\u00e4ven om OAuth2.0 och OpenID Connect i sin standardimplementation anses vara s\u00e4kra, \u00e4r jag os\u00e4ker p\u00e5 v\u00e5r l\u00f6sning).<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi skapade en separat tj\u00e4nst som emulerar en tj\u00e4nst f\u00f6r lagring av personuppgifter, f\u00f6r att skapa en liten modell av en land-agnostisk autentiseringstj\u00e4nst, som skulle h\u00e4mta personuppgifter fr\u00e5n en separat tj\u00e4nst (detta skulle i framtiden m\u00f6jligg\u00f6ra att ha en tj\u00e4nst med vilken man kan logga in med ett konto i vilket land som helst, samtidigt som man f\u00f6ljer GDPR och andra lagar). Denna del byggde vi, liksom leverant\u00f6ren, och kopplade dem framg\u00e5ngsrikt samman. N\u00e4sta steg var att g\u00f6ra ett API som skulle skyddas med tokens som tillhandah\u00e5lls av leverant\u00f6ren, st\u00f6dja deras introspektion via leverant\u00f6ren och ge ut skyddade data om f\u00f6rfr\u00e5gan uppfyllde beh\u00f6righetsvillkoren (vi verifierar att anv\u00e4ndaren \u00e4r autentiserad enligt Bearer-schemat, att deras token inneh\u00e5ller en specifik scope + att anv\u00e4ndaren har tillst\u00e5ndet som till\u00e5ter anropet). Denna del genomf\u00f6rdes ocks\u00e5. Den sista komponenten var en JavaScript-klient, som skulle f\u00e5 en token, med hj\u00e4lp av vilken den skulle anropa det skyddade API:et. Denna del hann vi inte klart med. Det vill s\u00e4ga, hela den funktionella delen var f\u00f6rberedd, men den front-end del som beh\u00f6vdes f\u00f6r att demonstrera systemets funktionalitet var inte klar.<\/p>\n<h4>E-E-E (spel)<\/h4>\n<p>\n<i>Dima Afontjenko, Sasha Konovalov<\/i><\/p>\n<p>Vi gjorde en mini-lek p\u00e5 Unity d\u00e4r snabba h\u00e4nder sl\u00e4nger korv p\u00e5 pizzan. Om du sl\u00e4nger korven felaktigt visas en sorglig text p\u00e5 sk\u00e4rmen \"Ogiltig\", men om hela korven sl\u00e4ngs korrekt dyker en slumpm\u00e4ssig faktum om pizza upp.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi ville g\u00f6ra en andra niv\u00e5 d\u00e4r man sl\u00e4nger tomater, men hann inte.<\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Kort forts\u00e4ttning: vem vann?<\/h2>\n<p>\nInnan hackathonet pratade vi med killarna och jag fr\u00e5gade vad f\u00f6r pris de skulle vilja ha om de vann. Det visade sig att det mest v\u00e4rdefulla priset skulle vara \"v\u00e4gen till produktion\". <\/p>\n<p><img decoding=\"async\" alt=\"Koding\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e4rf\u00f6r kan ni snart f\u00f6rv\u00e4nta er en tillk\u00e4nnagivande av spelet med kontrollen som kastar pepperoni p\u00e5 pizzan.<\/p>\n<blockquote><p>Som uppm\u00e4rksamma l\u00e4sare kanske har lagt m\u00e4rke till, vann laget \"E-E-E (spelet)\". Grattis till grabbarna!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Vilket projekt gillade du mest?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (maskininl\u00e4rning)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI f\u00f6r 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>    5 anv\u00e4ndare r\u00f6stade. 3 anv\u00e4ndare avstod.<br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Koda\u2013pizza | ProHoster","description":"Hej, Habr. Vi genomf\u00f6rde spontant v\u00e5r f\u00f6rsta interna hackathon.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}