{"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\/nl\/blog\/news\/kodim-pitstsa","title":{"rendered":"CodePizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr. We hebben spontaan onze eerste interne hackathon gehouden. Ik wil mijn pijnpunten en conclusies over de voorbereiding in de twee weken ervoor delen, evenals de projecten die zijn ontstaan.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" 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>De saaie kant voor degenen die ge\u00efnteresseerd zijn in marketing.<\/h2>\n<p>\nIk begin met een klein verhaal. <\/p>\n<p>Begin april. In ons kantoor vindt de eerste hackathon van de MskDotNet Community plaats. De strijd om Tatooine is in volle gang, deze keer in onze galaxie. Zaterdag. 20 teams. Pizza. Alles is zeer gezellig (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">bewijzen<\/a><\/noindex>). Een opblaasbare R2-D2 staat in de zaal. Teams schrijven de juiste algoritmes om de gevaarlijkste race op de kaart te voltooien. We schuiven de start van de eerste races op. Koekjes en koffie zijn een redding. We verwachte dat veel mensen zaterdag na de lunch zouden vertrekken. Maar nee. 12 uur coderen zijn voorbij. De finale. Iets valt uit, iets start niet. Maar iedereen is blij. Ons team wint. We zijn dubbel gelukkig. <\/p>\n<p>Ik deel mijn vreugde in Slack en het idee komt in me op: \"Laten we onze eigen hackathon organiseren.\" Ik schrijf naar onze CTO Sasha. Stilte. <\/p>\n<p>Ochtend. Ik drink koffie op kantoor. Ik zie Sasha van achteren naderen. \"Lisa, dat is geweldig! We hebben precies op 21 april een belangrijke datum. Laten we het doen!\" WTF!? Zo snel? Huh? Ik moet halverwege april naar Syktyvkar voor een stage. Maar laat maar! Laten we doorgaan.<\/p>\n<p>Er blijven 2 weken over. Ik ben nog nooit de enige organisator van een hackathon geweest. Laat staan een interne. Ik lees artikelen over dit onderwerp. Wat een uitdaging. Je hebt enkele maanden nodig. Je hebt een paar mensen nodig. Je moet merchandise, prijzen, voorwaarden, een schema plannen, interesse wekken, het doel begrijpen, budgetten. Misschien zelfs de zin van het leven doorgronden. Ik haal het zeker niet op tijd. En terwijl jij aan het lezen en voorbereiden bent, is er al een week voorbij. Het is tijd om te stoppen met lezen en te beginnen met doen. <\/p>\n<p><b class=\"spoiler_title\">Hier is onze checklist voor het organiseren van een interne hackathon in 1 week.<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: ga rustig zitten en schrijf een lijst van wat er gedaan moet worden voor de hackathon. <i>30 minuten<\/i>.<\/li>\n<li><b>Task<\/b>: deelnemers stellen zelf de projecten voor en kiezen wat ze willen maken in Google Sheets. <i>Achtergrondtaak, 2 uur.<\/i>.<\/li>\n<li><b>Schema<\/b>: schrijf snel een korte tijdsplanning op met rekening houdend met 3 pauzes en de finale. <i>20 minuten<\/i>.<\/li>\n<li><b>Teams<\/b>: publiceer een bericht over de hackathon met het schema van de CTO in IT-kanalen op Slack\/e-mail\/etc. en maak een apart kanaal voor de hackathon. Daarin verdeelt iedereen zich in teams, en degenen die nog geen team hebben vormen dit in de eerste 5 minuten van de hackathon. <i>Achtergrondtaak, 2 uur.<\/i>.<\/li>\n<li><b>Leuke extraatjes<\/b>: je bedenkt merchandise met twee ontwikkelaars, geeft het aan de ontwerper voor weergave, en ontvangt het resultaat. <i>Achtergrondtaak, 3 dagen<\/i>.<\/li>\n<li><b>Hackathon<\/b>: je komt op kantoor, co\u00f6rdineert iedereen in het begin, houdt je met je eigen zaken bezig, leest Reddit, geeft met een serieuze blik elk pauzemoment het nieuws over verse pizza door, fotografeert de zonsondergang, kondigt de finale aan, en stemt samen om de winnaar te kiezen. <i>1 dag<\/i>.<\/li>\n<li><b>Onder de sterren<\/b>: natuurlijk denk je voortdurend na over hoe alles goed zal gaan. Natuurlijk zullen niet alle mensen je bericht zien en is het met sommigen beter om persoonlijk te spreken. Natuurlijk, als iemand je helpt, wordt alles twee keer zo makkelijk (ik kreeg geweldige hulp van Alena).<\/li>\n<\/ul>\n<h2>Minder saaie deel over de datum van de hackathon<\/h2>\n<p>\nWaarom 21 april? Deze dag is belangrijk voor ons. Precies een jaar geleden, op 21 april, bezweken we onder de druk tijdens het eerste weekend na de start van de Federale Reclamecampagne. De volgende dag, op zondag, was ons team vanaf 8 uur 's ochtends aan het werk. Toen hebben we in Trello een bord aangemaakt voor sundayhackathon en begon een week met ploegendiensten van 12 uur per dag. De situatie was zo kritiek dat we zelfs geen tijd hadden om te eten en werden gevoed door collega's uit andere teams.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEen meer gedetailleerd verhaal kun je lezen op <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">de pagina van Fyodor Ovchinnikov<\/a><\/noindex> (onze CEO). Sindsdien hebben we veel veranderd, maar die datum zullen we zeker niet vergeten.<\/p>\n<p>Dit jaar hebben we besloten dat dit evenement herinnerd moet worden in de toekomst en in de beste tradities organiseerden we de eerste interne hackathon in de geschiedenis van Dodo, die 10 uur duurde. <\/p>\n<h2>Het meest interessante deel over de hackathonprojecten<\/h2>\n<p>\n<i>Disclaimer: alle beschrijvingen zijn door de jongens zelf geschreven, dus de auteurschap van de tekst is niet van mij.<\/i><\/p>\n<h4>Oleg Learning (machine learning)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>We wilden een neurale netwerk maken die kan bepalen welke pizza er op de foto staat zonder enige voorkennis. Uiteindelijk hebben we een zeer eenvoudige en speelse gemaakt \u2013 het herkent 10 pizza's, we hebben ongeveer begrepen hoe alles in elkaar zit, zover dat mogelijk is in een dag (~10 uur).<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpecifiek hebben we begrepen dat de industrie het niveau heeft bereikt waarbij een gemiddelde ontwikkelaar kant-en-klare bibliotheken kan gebruiken, de documentatie kan doorlezen en zijn neurale netwerk kan trainen zonder diepgaande kennis van het onderwerp. En het zal goed genoeg werken voor het oplossen van echte taken.<\/p>\n<p>Tools die we hebben gebruikt: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 een handige en eenvoudige bibliotheek voor machine learning en computer vision.<\/li>\n<li>We hebben twee modellen geprobeerd: ResNet50, Yolo.<\/li>\n<li>De code is natuurlijk geschreven in Python.<\/li>\n<\/ul>\n<p>\nWe hadden 11.000 foto's, maar bijna 3\/4 daarvan bleek rommel te zijn, en van de overgebleven foto's waren er verschillende, ongepaste hoeken. Uiteindelijk hebben we een kant-en-klaar model genomen (dat gewoon pizza's kan herkennen) en daarmee het meeste afval gescheiden. Daarna hebben we de foto's op naam van de pizza's ingedeeld \u2014 zo hebben we ze in mappen verdeeld, maar het bleek dat de namen niet overeenkwamen met de werkelijkheid, dus moesten we handmatig opschonen. Uiteindelijk bleven er ongeveer 500-600 foto's over; dat is natuurlijk een verwaarloosbaar aantal, maar toch was het genoeg om 10 pizza's van elkaar te scheiden.<\/p>\n<p>Voor het trainen van het netwerk hebben we de goedkoopste virtuele machine in Azure met een NVIDIA Tesla K80 genomen. We hebben 100 epochs getraind, maar het was al na 50 epochs duidelijk dat het netwerk oververzadigd was, omdat we een kleine dataset hadden.<\/p>\n<p>Eigenlijk ligt het probleem in het ontbreken van goede data.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMisschien hebben we wat termen door elkaar gehaald, maar we moeten in gedachten houden dat we helemaal geen ervaring hebben met al deze zaken.<\/p>\n<h4>GUI voor NOOBS (console voor het bestellen van pizza's)<\/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>We hebben een prototype van een console-applicatie voor geeks ontwikkeld, waarmee je pizza kunt bestellen via de terminal of command line, of zelfs kunt integreren in de deploy pipeline om bij een succesvolle release pizza op kantoor te laten bezorgen.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHet werk werd opgedeeld in verschillende delen: we onderzochten hoe onze API voor mobiele apps in elkaar zat, en bouwden onze eigen CLI met behulp van <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> , en configureerden de publicatie van het door ons gebouwde pakket. Met de laatste taak waren er een paar vervelende minuten dichter bij het einde van de hackathon. Alles werkte lokaal en zelfs de oude gepubliceerde versies van het pakket functioneerden, maar de nieuwe (waarin meer coole functies en emoji's waren toegevoegd) weigerden te werken. We hebben ongeveer 40 minuten besteed om te begrijpen wat er fout ging, maar uiteindelijk werkte alles op magische wijze zelf weer.)<\/p>\n<p>Onze ambitie voor de hackathon was een echte bestelling van pizza op kantoor via onze CLI. We hebben het tien keer op de testomgeving doorlopen, maar toch beefden mijn handen toen ik de commando's op de productie invoerde.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUiteindelijk hebben we het toch gedaan!<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/c966b190a6fe8a2f88a3973305cd03fb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>CourierGo<\/h4>\n<p>\n<i>Anton Bruzhmel\u0451v (auteur), Vanya Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropie<\/a><\/noindex>), Andrey Saraf\u0430\u043d\u043e\u0432<\/i><\/p>\n<p>We hebben het idee \u00abApp voor koerier\u00bb overgenomen.<\/p>\n<p><b class=\"spoiler_title\">Achtergrondinformatie over de voorbereiding.<\/b>Ik heb aanvankelijk overwogen welke functies er in de app kunnen zitten. Dit resulteerde in een lijst met functionaliteiten:<\/p>\n<ul>\n<li>De app logt in op de bezorgkassa met een code.<\/li>\n<li>In de app zijn onmiddellijk de beschikbare opdrachten zichtbaar, evenals de opdrachten die moeten worden opgepakt.<\/li>\n<li>De koerier markeert de opdracht en neemt deze mee.<\/li>\n<li>Hij ziet de berekende tijd en of hij op tijd kan zijn of niet.<\/li>\n<li>De klant ziet dat de koerier is vertrokken.<\/li>\n<li>De klant kan de locatie van de koerier op de kaart en de geschatte tijd volgen.<\/li>\n<li>De koerier kan in de chat met de klant communiceren vanuit de app.<\/li>\n<li>De klant kan in de chat met de koerier communiceren vanuit de app.<\/li>\n<li>Vijf minuten voor aankomst ontvangt de klant een bericht dat de koerier in de buurt is, wees voorbereid.<\/li>\n<li>De koerier markeert in de app dat hij is aangekomen en wacht.<\/li>\n<li>De koerier kan met \u00e9\u00e9n klik vanuit de app bellen en melden dat hij (aan het arriveren is, of iets dergelijks).<\/li>\n<li>De klant accepteert de bestelling en voert de pincode in die uit de app of SMS is ontvangen ter bevestiging van de levering (als een handtekening) zodat de koerier de levering niet voortijdig kan afronden als hij laat is.<\/li>\n<li>De bestelling wordt in het systeem gemarkeerd als geleverd.<\/li>\n<\/ul>\n<p>Daarnaast zijn er een paar alternatieve scenario's:<\/p>\n<ul>\n<li>De koerier kan de bestelling als niet geleverd markeren en de reden kiezen.<\/li>\n<li>Bij vertraging kan de koerier met \u00e9\u00e9n klik een elektronische bon via SMS verstrekken. Of de bon komt automatisch als de levertijd niet wordt gehaald.<\/li>\n<\/ul>\n<p>\nHet gevoel van de perspectieven en de noodzaak van dit project gaf zeker een boost.<\/p>\n<p>De volgende dag gingen we met het team lunchen en bespraken we hoe de minimale functionaliteit van de app eruit zou zien. <\/p>\n<p>Uiteindelijk ontstond de volgende lijst van wat we moesten doen tijdens de hackathon:<\/p>\n<ul>\n<li>Inloggen op de bezorgkassa.<\/li>\n<li>De huidige locatie weergeven.<\/li>\n<li>Gegevens naar een externe API sturen (co\u00f6rdinaten, opdracht opgenomen, bestelling afgeleverd).<\/li>\n<li>Gegevens uit een externe API ophalen (huidige opdrachten van de koerier).<\/li>\n<li>Een evenement versturen dat aangeeft dat de opdracht is opgepakt voor levering\/afgeleverd.<\/li>\n<li>De huidige locatie van de koerier op de kaart op de site weergeven.<\/li>\n<\/ul>\n<p>\nHet grootste werk, zoals we zagen, zou bestaan uit het cre\u00ebren van de backend, de app zelf (na besprekingen kozen we ReactNative voor de ontwikkeling van de app, meer bepaald de binding eromheen \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, waardoor je helemaal geen native code hoeft te schrijven). Voor de backend was er aanvankelijk hoop op Vanya Zverev, als ervaren persoon in de omgang met onze sjabloonservice en k8s (de werkzaamheden die hij op zich heeft genomen). ReactNative hebben Andrey Sarafanov en ik even bekeken.<\/p>\n<p>Ik besloot meteen een werkrepository voor het project aan te maken. Om 12 uur 's nachts stuitte ik op het probleem dat geolocatie in de achtergrond slecht werkt in ReactNative, tenzij je native code schrijft, wat me een beetje frustreerde. Het voelde beter toen ik ontdekte dat ik de documentatie van het framerwerk expo.io las in plaats van ReactNative. Uiteindelijk begreep ik tegen de avond al hoe ik in expo.io de huidige locatie kon verkrijgen en afzonderlijke schermen kon tekenen (voor inloggen, het weergeven van bestellingen, enz.).<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn de ochtend op de hackathon trok ik Gleb in ons superveelbelovende project. We hebben snel een plan opgesteld van wat er gedaan moest worden.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe maakten een fout door, volgens de projecttemplate, te proberen communicatie niet via HTTP, maar via GRPC te doen, omdat niemand wist hoe je een GRPC-client voor JavaScript moest opzetten. Uiteindelijk, na ongeveer anderhalf uur, hebben we dit idee opgegeven. Hierdoor begonnen de jongens aan de backend de bestaande server van GRPC naar WebApi om te bouwen. Na een half uur kregen we eindelijk de communicatie tussen de app en de backend aan de praat, wat een wonder. Maar op datzelfde moment was Gleb bijna klaar met de deployment in k8s en de automatische deployment bij een commit naar master. \ud83d\ude42<\/p>\n<p>We hebben MySQL gekozen als opslag om niet te riskeren met de database (er waren gedachten over CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUiteindelijk: <\/p>\n<ul>\n<li>We hebben de huidige co\u00f6rdinaten van de koerier vanuit de app in de database opgeslagen.<\/li>\n<li>We hebben RabbitMQ ge\u00efntegreerd en ons aangemeld voor berichten over het aannemen van bestellingen door de koerier, zodat we de bestelling direct in de app van de koerier kunnen weergeven.<\/li>\n<li>We begonnen de levertijd van de bestelling in onze database op te slaan, nadat de koerier op de knop in de app had gedrukt. We hebben niet de tijd gehad om het evenement terug naar RabbitMQ te sturen dat de bestelling was geleverd.<\/li>\n<li>Ik heb een kaart weergegeven op de pagina currentorder op de website met de huidige positie van de koerier. Maar deze functionaliteit bleef een beetje onafgemaakt, omdat het niet lukte om CORS in de omgeving in te stellen voor het verkrijgen van co\u00f6rdinaten uit onze nieuwe service.<\/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>We wanted to implement an OpenID Connect provider since we currently use a custom-developed authentication protocol, which creates several difficulties: custom client libraries, inconvenient interactions with external partners, and potential security issues (after all, OAuth2.0 and OpenID Connect in their standard implementations can be considered secure, while I'm not sure about our solution).<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe created a separate service emulating a personal data storage service to develop a small model of a Country-Agnostic authentication provider that would fetch personal data from a separate service (this would eventually allow having a single service through which one could log in with an account from any country while complying with GDPR and other laws). We completed this part, as well as the provider, and successfully linked them. Next, we needed to create an API that would be secured by tokens issued by the provider, support token introspection through the provider, and return protected data if the request met the authorization policies (checking that the user is authenticated according to the Bearer scheme, that their token contains a specific scope, and that the user has the permission to make the call). This part was also completed. The last component was a JavaScript client that would be issued a token to call the protected API. We didn't manage to complete this part. In other words, the entire functional part was ready, but the frontend part for demonstrating the system's operability was not finished.<\/p>\n<h4>E-E-E (game)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>We created a mini-game on Unity where nimble hands toss slices of sausage onto a pizza. If you place the sausage slice incorrectly, a sad message appears on the screen saying 'Rejected', but if all the sausage slices are placed correctly, a random fact about pizza appears.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe wanted to create a second level with tossing tomatoes, but we ran out of time.<\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>A short continuation: who won?<\/h2>\n<p>\nBefore the hackathon, we talked to the guys, and I asked them what prize they would like to receive if they won. It turned out that the most valuable prize would be 'a ticket to production'. <\/p>\n<p><img decoding=\"async\" alt=\"CodePizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDus, verwacht binnenkort een aankondiging van ons voor een spel met handvatten die pepperoni op pizza gooien.<\/p>\n<blockquote><p>Zoals een oplettende lezer opmerkte, heeft het team \"E-E-E (het spel)\" gewonnen. Gefeliciteerd jongens!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Alleen geregistreerde gebruikers kunnen deelnemen aan de enqu\u00eate. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log in<\/a><\/noindex>, alstublieft.<\/p>\n<h2 class=\"default-block__polling-title\">Welk project vond je het leukst?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (machine learning)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI voor 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>    Vijf gebruikers hebben gestemd. Drie gebruikers hebben zich onthouden.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Coderen\u2013pizza | ProHoster","description":"Hallo, Habr. We hebben spontaan onze eerste interne hackathon gehouden.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}