{"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\/da\/blog\/news\/kodim-pitstsa","title":{"rendered":"Kode\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, Habr. Vi holdt spontant den f\u00f8rste interne hackathon. Jeg vil dele mine smerter og indsigter om forberedelsen til det over de sidste 2 uger samt de projekter, der kom ud af det.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\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>Den kedelige del for dem, der interesserer sig for marketing<\/h2>\n<p>\nJeg starter med en lille historie. <\/p>\n<p>Det er begyndelsen af april. Vores kontor holder den f\u00f8rste hackathon for MskDotNet Community. Kampen om Tatooine er i gang, i vores galakse denne gang. L\u00f8rdag. 20 hold. Pizza. Det hele er meget hyggeligt (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">beviser<\/a><\/noindex>). En oppustelig R2-D2 sv\u00f8mmer rundt i lokalet. Holdene skriver de mest korrekte algoritmer for at gennemf\u00f8re det mest farlige l\u00f8b p\u00e5 kortet. Vi skyder startskuddet for de f\u00f8rste heats. Sm\u00e5kager og kaffe g\u00f8r underv\u00e6rker. Vi, arrang\u00f8rerne, forventede, at mange ville g\u00e5 hjem efter frokost om l\u00f8rdagen. Men nej. 12 timer med kodning bag os. Finale. Noget g\u00e5r i stykker, noget vil ikke starte. Men alle er glade. Vores hold vinder. Vi er dobbelt s\u00e5 glade. <\/p>\n<p>Jeg deler gl\u00e6den i Slack, og en id\u00e9 dukker op i mit hoved: \u00abVi skal holde vores egen hackathon\u00bb. Jeg skriver til vores CTO Sasha. Stilhed. <\/p>\n<p>Morgen. Jeg drikker kaffe p\u00e5 kontoret. Jeg ser Sasha n\u00e6rme sig bagfra. \u00abLiza, det er fantastisk! Vi har lige den 21. april en vigtig dato. Lad os g\u00f8re det!\u00bb WTF!? S\u00e5 hurtigt? Hvad? Jeg skal rejse til Syktyvkar for et praktikophold midt i april. Men for resten! Lad os g\u00f8re det.<\/p>\n<p>Der er 2 uger tilbage. Jeg har aldrig v\u00e6ret den eneste arrang\u00f8r af en hackathon. Selvom det er en intern. Jeg l\u00e6ser artikler om emnet. Vildt. Det kr\u00e6ver flere m\u00e5neder. Det kr\u00e6ver flere personer. Jeg skal t\u00e6nke over merchandise, pr\u00e6mier, vilk\u00e5r, tidsplan, engagere folk, forst\u00e5 form\u00e5let, budgetter. M\u00e5ske endda finde ud af meningen med livet. Jeg vil bestemt ikke n\u00e5 det. Og mens du l\u00e6ste og forberedte dig, er ugen allerede g\u00e5et. Det er p\u00e5 tide at glemme artiklerne og begynde at g\u00f8re noget. <\/p>\n<p><b class=\"spoiler_title\">Fang vores tjekliste til afholdelse af intern hackathon p\u00e5 1 uge<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: du s\u00e6tter dig roligt ned og skriver en liste over, hvad der skal g\u00f8res til hackathon. <i>30 minutter<\/i>.<\/li>\n<li><b>Regler for godkendelse af merge-requests<\/b>: deltagerne foresl\u00e5r og v\u00e6lger selv de projekter, de \u00f8nsker at oprette i Google Sheets. <i>Baggrundsopgave, 2 timer<\/i>.<\/li>\n<li><b>Tidsplan<\/b>: du skriver hurtigt en kort tidsopdeling med 3 pauser og finalen i tankerne. <i>20 minutter<\/i>.<\/li>\n<li><b>Kommandoer<\/b>: du offentligg\u00f8r en meddelelse om hackathon med tidsplanen fra CTO i IT-kanalerne i Slack\/e-mail osv. og opretter en separat kanal til hackathon. Her deles alle op i hold, mens de usikre g\u00f8r det i de f\u00f8rste 5 minutter af hackathon. <i>Baggrundsopgave, 2 timer<\/i>.<\/li>\n<li><b>Goder<\/b>: du opfinder merch med to udviklere, giver det til designeren til illustration, og modtager det f\u00e6rdige produkt. <i>Baggrundsopgave, 3 dage<\/i>.<\/li>\n<li><b>Hackathon<\/b>: du kommer ind p\u00e5 kontoret, koordinerer alle i starten, arbejder med dine opgaver, l\u00e6ser Reddit, meddeler med et vigtigt udtryk om den nye pizza hver gang, tager billeder af solnedgangen, annoncerer finalen, og stemmer sammen p\u00e5 vinderen. <i>1 dag<\/i>.<\/li>\n<li><b>Under stjernen<\/b>: selvf\u00f8lgelig t\u00e6nker du hele tiden p\u00e5, at alt skal g\u00e5 godt. Selvf\u00f8lgelig vil ikke alle se din besked, og nogle skal bedre tale med personligt. Selvf\u00f8lgelig, hvis nogen hj\u00e6lper dig, bliver det to gange nemmere (jeg havde den fantastiske Alena til at hj\u00e6lpe mig).<\/li>\n<\/ul>\n<h2>Den mindre kedelige del om datoen for hackathonet<\/h2>\n<p>\nHvorfor 21. april? Denne dag er vigtig for os. N\u00f8jagtigt et \u00e5r siden, den 21. april, gik vi ned under belastning i forbindelse med de f\u00f8rste weekenddage efter starten p\u00e5 den F\u00f8derale Reklamekampagne. Dagen efter, p\u00e5 s\u00f8ndag, var vores team p\u00e5 arbejde fra kl. 8 om morgenen. Da skabte vi en Trello-tavle sundayhackathon, og en uge med skiftende arbejde p\u00e5 12 timer om dagen begyndte. Situationen var s\u00e5 kritisk, at vi ikke engang havde tid til at spise, og folk fra andre teams s\u00f8rgede for mad til os.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDu kan l\u00e6se en mere detaljeret beretning p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">Fjodor Ovchinnikovs side<\/a><\/noindex> (v\u00e5r CEO). Siden da har vi \u00e6ndret meget, men vi vil bestemt ikke glemme denne dato.<\/p>\n<p>I \u00e5r besluttede vi, at dette arrangement skulle mindes af de kommende generationer, og i bedste tradition afholdt vi det f\u00f8rste interne hackathon i Dodo, som varede 10 timer. <\/p>\n<h2>Den mest interessante del om hackathonprojekterne<\/h2>\n<p>\n<i>Disclaimer: alle beskrivelser er skrevet af drengene, s\u00e5 forfatterretten til teksten er ikke min.<\/i><\/p>\n<h4>Oleg L\u00e6ring (maskinl\u00e6ring)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Vi \u00f8nskede at lave en neuralt netv\u00e6rk, som ville kunne identificere, hvilken pizza der var p\u00e5 billedet uden nogen forkundskaber. I sidste ende lavede vi en meget simpel og leget\u00f8jsagtig \u2013 det kan genkende 10 pizzaer, og vi fandt nogenlunde ud af, hvordan det hele fungerer, i hvert fald s\u00e5 meget som muligt p\u00e5 en dag (~10 timer).<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpecifikt forstod vi, at industrien er n\u00e5et til et punkt, hvor en almindelig udvikler kan tage f\u00e6rdige biblioteker, l\u00e6se dokumentationen og tr\u00e6ne sit neurale netv\u00e6rk uden dyb forst\u00e5else af emnet. Og det vil fungere ret godt til l\u00f8sningen af reelle opgaver.<\/p>\n<p>V\u00e6rkt\u00f8jerne, vi brugte: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 et praktisk og enkelt bibliotek til arbejdet med maskinl\u00e6ring og computer vision.<\/li>\n<li>Vi pr\u00f8vede to modeller \u2013 ResNet50, Yolo.<\/li>\n<li>Koden blev, som man kan forst\u00e5, skrevet i Python.<\/li>\n<\/ul>\n<p>\nVi havde 11000 billeder, men n\u00e6sten 3\/4 viste sig at v\u00e6re affald, og blandt de resterende var der forskellige, uacceptable vinkler. I sidste ende tog vi en f\u00e6rdig model (som bare kan finde pizza) og brugte den til at adskille det v\u00e6rste affald. Desuden var navnet p\u00e5 billedet navnet p\u00e5 pizzaen \u2014 s\u00e5dan sorteredes de i mapper, men det viste sig, at navnene ikke stemte overens med virkeligheden, og der m\u00e5tte vi rydde op manuelt. I sidste ende var der omkring 500-600 billeder tilbage, hvilket helt klart er et ubetydeligt antal, men alligevel var det tilstr\u00e6kkeligt til at skille 10 pizzaer fra hinanden.<\/p>\n<p>Til tr\u00e6ning af netv\u00e6rket brugte vi den billigste virtuelle maskine i Azure med NVIDIA Tesla K80. Vi tr\u00e6nede i 100 epoch, men det blev tydeligt, at netv\u00e6rket var blevet overm\u00e6ttet allerede efter 50 epoch, fordi datas\u00e6ttet var for lille.<\/p>\n<p>Problemet ligger reelt i manglen p\u00e5 gode data.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi har m\u00e5ske lidt rodet med termerne, men man skal huske, at vi slet ikke har erfaring med alt dette.<\/p>\n<h4>GUI for NOOBS (konsollen til bestilling af 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 Bikkinin, Zhenya Vasiliev<\/i><\/p>\n<p>Vi samlede en prototype af et konsolapplikation for n\u00f8rder, som g\u00f8r det muligt at bestille pizza via terminalen eller kommandolinjen, eller endda integrere det i deployment-pipelinen og f\u00e5 leveret pizza til kontoret ved succesfuld udgivelse.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArbejdet blev opdelt i flere dele: vi unders\u00f8gte, hvordan vores API til mobilapplikationer fungerede, og samlede vores egen CLI med hj\u00e6lp fra <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> og satte publiceringen af vores samlede pakke op. Den sidste opgave involverede nogle ubehagelige minutter t\u00e6ttere p\u00e5 slutningen af hackathonen. Alt fungerede lokalt, og selv de gamle offentliggjorte versioner af pakken fungerede, men de nye (hvor der var tilf\u00f8jet flere fede funktioner og emojis) n\u00e6gtede at virke. Vi brugte 40 minutter p\u00e5 at finde ud af, hvad der gik galt, men i sidste ende fungerede alt magisk af sig selv).<\/p>\n<p>Vores st\u00f8rste m\u00e5l til hackathonen var at foretage en reel bestilling af pizza til kontoret via vores CLI. Vi testede det en halv snes gange p\u00e5 testplatformen, men mine h\u00e6nder rystede stadig, n\u00e5r jeg indtastede kommandoerne i produktionen.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom resultat \u2014 fik vi det trods alt gjort!<\/p>\n<p><img decoding=\"async\" alt=\"Kode\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 (forfatter), Vanya Zverev, 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>Vi tog ideen \"App til kureren\".<\/p>\n<p><b class=\"spoiler_title\">Baggrundsoplysninger om forberedelsen.<\/b>Jeg overvejede oprindeligt, hvilke funktioner der kunne v\u00e6re i appen. Der opstod omtrent denne liste over funktionalitet:<\/p>\n<ul>\n<li>Appen logger ind i leveringskassen med en kode.<\/li>\n<li>I appen ses de tilg\u00e6ngelige ordrer med det samme, ordrer som skal tages.<\/li>\n<li>Kureren markerer ordren og tager den med p\u00e5 turen.<\/li>\n<li>Han f\u00e5r vist den beregnede tid og om han n\u00e5r det eller ej.<\/li>\n<li>Klienten f\u00e5r vist, at kureren er afsted.<\/li>\n<li>Klienten begynder at se kurers position p\u00e5 kortet og den beregnede tid.<\/li>\n<li>Kureren kan skrive til klienten i chatten fra appen.<\/li>\n<li>Klienten kan skrive til kureren i chatten fra appen.<\/li>\n<li>Fem minutter f\u00f8r ankomsten f\u00e5r klienten en besked om, at kureren er t\u00e6t p\u00e5, v\u00e6r klar.<\/li>\n<li>Kureren markerer i appen, at han er ankommet og venter.<\/li>\n<li>Kureren ringer fra appen med et klik og informerer om, at han (kommer op, er ankommet osv.)<\/li>\n<li>Klienten accepterer ordren og indtaster pin-koden fra appen eller SMS\u2019en for at bekr\u00e6fte leveringen. (som en signatur) S\u00e5 kureren ikke kan afslutte leveringen for tidligt, hvis han er forsinket.<\/li>\n<li>Ordren markeres som leveret i systemet.<\/li>\n<\/ul>\n<p>Plus et par alternative scenarier:<\/p>\n<ul>\n<li>Kureren kan markere ordren som ikke leveret og v\u00e6lge \u00e5rsag.<\/li>\n<li>Hvis kureren er forsinket, kan han med et klik udstede et elektronisk certifikat via SMS. Eller certifikatet sendes automatisk, hvis der ikke overholdes leveringsfristen.<\/li>\n<\/ul>\n<p>\nFornemmelsen af perspektiv og n\u00f8dvendighed i dette projekt var selvf\u00f8lgelig opl\u00f8ftende.<\/p>\n<p>N\u00e6ste dag gik vi ud at spise med teamet og diskuterede, hvordan den minimale funktionalitet i appen ville se ud. <\/p>\n<p>Resultatet blev f\u00f8lgende liste over, hvad der skulle g\u00f8res under hackathonen:<\/p>\n<ul>\n<li>Login til leveringskassen.<\/li>\n<li>Vise den aktuelle position.<\/li>\n<li>Send data til eksternt API (koordinater, har taget ordren, har leveret ordren).<\/li>\n<li>Modtag data fra eksternt API (nuv\u00e6rende ordrer til kureren).<\/li>\n<li>Send en begivenhed om, at ordren er taget til levering\/levert.<\/li>\n<li>Vise kurers nuv\u00e6rende position p\u00e5 kortet p\u00e5 hjemmesiden.<\/li>\n<\/ul>\n<p>\nDet prim\u00e6re arbejde, som jeg s\u00e5 det, skulle finde sted i oprettelsen af backend, selve appen (efter diskussionerne valgte vi ReactNative til udviklingen af appen, mere pr\u00e6cist indpakningen over det \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, som g\u00f8r det muligt slet ikke at skrive nativer kode). I backend var der oprindeligt h\u00e5b p\u00e5 Vanya Zverev, som har erfaring med vores service skabelon og k8s (som han p\u00e5tog sig). Jeg og Andrey Sarafanov tog fat p\u00e5 ReactNative.<\/p>\n<p>Jeg besluttede mig for straks at oprette et arbejdsrepository til selve projektet. Klokken 12 om natten st\u00f8dte jeg p\u00e5, at geolokation i ReactNative fungerer d\u00e5rligt i baggrunden, hvis man ikke skriver nativer kode, og blev en smule frustreret. Men det lettede, da jeg inds\u00e5, at jeg l\u00e6ste dokumentationen for expo.io-rammen i stedet for ReactNative. Til sidst forstod jeg p\u00e5 en aften, hvordan man f\u00e5r den aktuelle position i expo.io, og tegner separate sk\u00e6rme (til login, visning af ordre osv.).<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm morgenen i hackathonet trak vi Gleb ind i vores super lovende projekt. Vi skitserede hurtigt planen for, hvad der skulle g\u00f8res.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi begik en fejl, da vi i overensstemmelse med projektets skabelon fors\u00f8gte at opn\u00e5 kommunikation ikke via HTTP, men via GRPC, da ingen kunne samle en GRPC-klient til JavaScript. Efter at have brugt omkring halvanden time p\u00e5 det, droppede vi denne id\u00e9. P\u00e5 grund af dette begyndte folkene p\u00e5 backend at \u00e6ndre den f\u00e6rdige server fra GRPC til WebApi. Efter en halv time kunne vi endelig konfigurere kommunikationen mellem applikationen og backend, herregud. Men samtidig var Gleb n\u00e6sten f\u00e6rdig med deployment i k8s og plus autodistribution ved commit til master. \ud83d\ude42<\/p>\n<p>Vi valgte MySQL som datalager for ikke at risikere med databasen (vi overvejede CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI sidste ende: <\/p>\n<ul>\n<li>Vi implementerede lagringen af couriers nuv\u00e6rende koordinater fra applikationen i databasen.<\/li>\n<li>Vi tilsluttede RabbitMQ og tilmeldte os meddelelser om, at courieren tager ordren, s\u00e5 vi straks kan vise ordren hos courieren i applikationen.<\/li>\n<li>Vi begyndte at gemme leveringstiden for ordren i databasen, efter at courieren har trykket p\u00e5 knappen i applikationen. Vi n\u00e5ede ikke at tilf\u00f8je sendingen af en h\u00e6ndelse tilbage til Rabbit om, at ordren er leveret.<\/li>\n<li>Jeg lavede visningen af kortet p\u00e5 siden currentorder p\u00e5 hjemmesiden med courierens nuv\u00e6rende position. Men denne funktionalitet blev lidt ufuldst\u00e6ndig, da vi ikke kunne konfigurere CORS til at hente koordinater fra vores nye service i milj\u00f8et.<\/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>), Artem Trofimushkin<\/i><\/p>\n<p>Vi \u00f8nskede at implementere en OpenID Connect-udbyder, da vi i \u00f8jeblikket bruger en autentifikationsprotokol fra egen udvikling, hvilket skaber en r\u00e6kke udfordringer: brugerdefinerede klientbiblioteker, besv\u00e6r for eksterne partnere, muligvis sikkerhedsproblemer (OAuth2.0 og OpenID Connect i deres standardimplementering betragtes som sikre, men hvad ang\u00e5r vores l\u00f8sning \u2014 det er jeg ikke sikker p\u00e5).<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi har oprettet en separat tjeneste, der emulerer en tjeneste til opbevaring af personlige data, for at skabe en lille model for en landsuafh\u00e6ngig autentifikationsudbyder, der kunne anmode om personlige data fra en separat tjeneste (dette ville i fremtiden give mulighed for at have \u00e9n tjeneste, som man kunne logge ind med uanset land, samtidig med at man overholder GDPR og andre relevante love). Denne del har vi gjort, ligesom udbyderen, og har succesfuldt koblet dem sammen. Dern\u00e6st var vi n\u00f8dt til at lave et API, der ville v\u00e6re beskyttet med tokens, som udbyderen udstiller, st\u00f8tte deres introspektion gennem udbyderen og returnere beskyttede data, hvis anmodningen opfyldte autorisationspolitikkerne (vi kontrollerer, at brugeren er autentificeret via Bearer-skemaet, at hans token indeholder en bestemt scope + at brugeren selv har tilladelse til at udf\u00f8re anmodningen). Denne del blev ogs\u00e5 fuldf\u00f8rt. Den sidste komponent var en JavaScript-klient, som ville modtage et token, der ville blive brugt til at anmode om det beskyttede API. Denne del n\u00e5ede vi ikke at f\u00e6rdigg\u00f8re. S\u00e5 alle funktionaliteter var klar, men den front-end, der skulle demonstrere systemets funktionalitet, var ikke klar.<\/p>\n<h4>E-E-E (spillet)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Vi har lavet et mini-spil p\u00e5 Unity, hvor hurtige h\u00e6nder kaster p\u00f8lse p\u00e5 pizzaen. Hvis du kaster p\u00f8lsen forkert, vises der en trist besked p\u00e5 sk\u00e6rmen \"Forkastet\", og hvis hele p\u00f8lsen er korrekt kastet, vises en tilf\u00e6ldig fakta om pizza.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi ville have lavet et andet niveau med kast af tomater, men n\u00e5ede det ikke.<\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Kort forts\u00e6ttelse: Hvem vandt?<\/h2>\n<p>\nF\u00f8r hackathonen talte vi med drengene, og jeg spurgte, hvilken pr\u00e6mie de gerne ville have, hvis de vandt. Det viste sig, at den mest v\u00e6rdifulde pr\u00e6mie ville v\u00e6re \"vejen til produktion\". <\/p>\n<p><img decoding=\"async\" alt=\"Kode\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 hold \u00f8je med os for snart at annoncere et spil med h\u00e5ndtag, der smider pepperoni p\u00e5 pizzaen.<\/p>\n<blockquote><p>Som den opm\u00e6rksomme l\u00e6ser kunne bem\u00e6rke, vandt holdet \u201eE-E-E (spillet)\u201c. Tillykke til drengene!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Hvilket projekt kunne du bedst lide?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg L\u00e6ring (maskinl\u00e6ring)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI til 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 brugere har stemt. 3 brugere har afholdt sig.<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/449344\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d. \u0420\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0431\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u043d\u0435\u043c\u0443 \u0437\u0430 2 \u043d\u0435\u0434\u0435\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c. \u0421\u043a\u0443\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u043c \u041d\u0430\u0447\u043d\u0443 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u0447\u0430\u043b\u043e \u0430\u043f\u0440\u0435\u043b\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0432 \u043e\u0444\u0438\u0441\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d MskDotNet Community. \u0411\u0438\u0442\u0432\u0430 \u0437\u0430 \u0422\u0430\u0442\u0443\u0438\u043d \u0432 \u0440\u0430\u0437\u0433\u0430\u0440\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26093,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/news\/kodim-pitstsa\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Kodning\u2013pizza | ProHoster","description":"Hej, Habr. Vi har spontant afholdt vores f\u00f8rste interne hackathon.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}