{"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\/en\/blog\/news\/kodim-pitstsa","title":{"rendered":"Coding - Pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hello, Habr. We spontaneously held our first internal hackathon. I decided to share my pains and insights about preparing for it over the two weeks, as well as the projects that came out of it.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" 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>The boring part for those interested in marketing<\/h2>\n<p>\nLet me start with a small story. <\/p>\n<p>Early April. Our office is hosting the first hackathon for the MskDotNet Community. The battle for Tatooine is underway in our galaxy this time. Saturday. 20 teams. Pizza. It's all very heartfelt (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">proof<\/a><\/noindex>). An inflatable R2-D2 is wandering around the room. Teams are writing the right algorithms to get through the most dangerous race on the map. We push back the start of the first heats. Cookies and coffee save the day. We, the organizers, expected that many would leave after lunch on Saturday. But no. 12 hours of coding down. The finale. Something falls apart, something doesn\u2019t launch. But everyone is happy. Our team wins. We\u2019re doubly happy. <\/p>\n<p>I share the joy in Slack and a thought comes to mind: \"We should do our own hackathon.\" I write to our CTO Sasha. Silence. <\/p>\n<p>Morning. I'm drinking coffee in the office. I see Sasha approaching from behind. \"Liza, this is great! We have an important date on April 21. Let\u2019s do it!\" WTF!? So fast? Huh? What? I need to fly to Syktyvkar for an internship in mid-April. But to hell with it! Let\u2019s go.<\/p>\n<p>Two weeks left. I've never been the sole organizer of a hackathon. Even an internal one. I read articles on this topic. It\u2019s a nightmare. It takes several months. It takes several people. I need to think about merchandise, prizes, conditions, a schedule, get people interested, understand the goal, budgets. I might even need to find out the meaning of life. I definitely won\u2019t make it in time. And while you were reading and preparing, a week has already passed. It\u2019s time to stop reading articles and start doing something. <\/p>\n<p><b class=\"spoiler_title\">Here\u2019s our checklist for running an internal hackathon in 1 week<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: calmly sit down and write a list of what needs to be done for the hackathon. <i>30 minutes<\/i>.<\/li>\n<li><b>Task<\/b>: participants suggest and choose projects they want to create in Google Sheets. <i>Background task, 2 hours<\/i>.<\/li>\n<li><b>Schedule<\/b>: write a brief breakdown of the time with 3 breaks and the finale in mind. <i>20 minutes<\/i>.<\/li>\n<li><b>Commands<\/b>: publish a message about the hackathon with the schedule from the CTO in the IT channels on Slack\/email\/etc. and create a separate channel for the hackathon. In it, everyone splits into teams, while those undecided do so in the first 5 minutes of the hackathon. <i>Background task, 2 hours<\/i>.<\/li>\n<li><b>Perks.<\/b>: you come up with merchandise with two developers, hand it over to the designer for rendering, and receive the finished product. <i>Background task, 3 days<\/i>.<\/li>\n<li><b>Hackathon<\/b>: you arrive at the office, coordinate everyone at the start, take care of your own tasks, read Reddit, seriously announce about fresh pizza at every break, take a picture of the sunset, declare the final, vote together, and choose the winner. <i>1 day<\/i>.<\/li>\n<li><b>Under the star<\/b>: of course, you constantly think about ensuring everything goes well. Naturally, not everyone will see your message and it's better to talk to some people in person. Of course, if someone helps you, everything will become twice as easy (I was helped by the wonderful Alena).<\/li>\n<\/ul>\n<h2>The less boring part about the hackathon date<\/h2>\n<p>\nWhy April 21? This day is significant for us. Exactly a year ago, on April 21, we crashed under load during the first weekend following the launch of the Federal Advertising Campaign. The next day, on Sunday, our team was working from 8 AM. At that time, we created a Trello board called sundayhackathon and began a week of shifts, working 12 hours a day. The situation was so critical that we hardly had time to eat, and we were fed by people from other teams.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nYou can read a more detailed account on <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">Fyodor Ovchinnikov's page<\/a><\/noindex> (our CEO). Since then, we have changed a lot, but we certainly won't forget this date.<\/p>\n<p>This year, we decided that this event deserves to be memorialized for future generations, and in the best traditions, we organized the first-ever internal hackathon at Dodo, which lasted 10 hours. <\/p>\n<h2>The most interesting part about the hackathon projects<\/h2>\n<p>\n<i>Disclaimer: all descriptions were written by the guys themselves, so the authorship of the text is not mine.<\/i><\/p>\n<h4>Oleg Learning (machine learning)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>They wanted to create a neural network that would determine what type of pizza is in a photo without any prior knowledge. In the end, they made a very simple and toy-like version \u2013 it recognizes 10 pizzas, and they got a rough understanding of how everything works, as much as possible in a day (~10 hours).<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn particular, we realized that the industry has reached a level where an ordinary developer can take ready-made libraries, read the documentation, and train their neural network without deep subject knowledge. And it will work well enough to solve real tasks.<\/p>\n<p>Tools used: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> An easy and straightforward library for working with machine learning and computer vision.<\/li>\n<li>We tried two models - ResNet50, Yolo.<\/li>\n<li>We obviously wrote the code in Python.<\/li>\n<\/ul>\n<p>\nWe had 11,000 photos, but nearly 3\/4 of them turned out to be garbage, and among the remaining ones, there were various unsuitable angles. In the end, we used a pre-trained model (which can find pizza) to filter the unwanted ones. Then, the name of the photo included the name of the pizza - so we sorted them into folders, but it turned out that the names did not match the reality, and we had to clean them up manually. Ultimately, we were left with about 500-600 photos, which is clearly a tiny amount, but it turned out to be enough to distinguish 10 different pizzas.<\/p>\n<p>For training the network, we took the cheapest virtual machine in Azure with an NVIDIA Tesla K80. We trained it over 100 epochs, but it was evident that the network had saturated after just 50 epochs due to the small dataset.<\/p>\n<p>Essentially, the whole problem lies in the lack of good data.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe might have mixed up some terms, but it should be noted that we have no experience working with all these things.<\/p>\n<h4>GUI for NOOBS (console for ordering 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>We developed a prototype console application for geeks, allowing pizza orders through the terminal or command line, or even embedding it into the deployment pipeline to deliver pizza to the office upon a successful release.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe work was divided into several parts: we figured out how our API for mobile applications works, built our own CLI using <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> , and configured the publication of the package we created. The last task was accompanied by a few unpleasant minutes closer to the end of the hackathon. Everything was working locally, and even older published versions of the package worked, but new ones (which had more cool features and emojis added) refused to cooperate. We spent about 40 minutes figuring out what went wrong, but in the end, everything magically worked itself out.<\/p>\n<p>Our maximum goal for the hackathon was to place a real pizza order to the office through our CLI. We tested it dozens of times on a test server, but I still had shaking hands when entering commands in production.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs a result - we did it after all!<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/c966b190a6fe8a2f88a3973305cd03fb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>CourierGo<\/h4>\n<p>\n<i>Anton Bruzmelyov (author), 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>We took the idea of 'Courier Application'.<\/p>\n<p><b class=\"spoiler_title\">Background on the preparation.<\/b>Initially, I figured out what features could be in the application. I came up with approximately the following list of functionalities:<\/p>\n<ul>\n<li>The application logs into the delivery terminal using a code.<\/li>\n<li>Available orders and orders ready for pickup are immediately visible in the app.<\/li>\n<li>The courier marks the order and takes it on the trip.<\/li>\n<li>He is shown the estimated time and whether he will make it or not.<\/li>\n<li>The client is notified that the courier has departed.<\/li>\n<li>The client starts seeing the courier's location on the map and the estimated time.<\/li>\n<li>The courier can message the client in the app chat.<\/li>\n<li>The client can message the courier in the app chat.<\/li>\n<li>Five minutes before arrival, the client receives a message that the courier is nearby, please be ready.<\/li>\n<li>The courier marks in the app that he has arrived and is waiting.<\/li>\n<li>The courier can call from the app with one click to inform that (he is coming up, has arrived, etc.)<\/li>\n<li>The client accepts the order and enters the pin code from the app or SMS to confirm the delivery. (like a signature) So that the courier cannot complete the delivery early if he is delayed.<\/li>\n<li>The order is marked as delivered in the system.<\/li>\n<\/ul>\n<p>Plus a couple of alternative scenarios:<\/p>\n<ul>\n<li>The courier can mark the order as undelivered and choose a reason.<\/li>\n<li>If delayed, the courier can issue an electronic certificate via SMS with one button. Or the certificate arrives automatically if the delivery time is not met.<\/li>\n<\/ul>\n<p>\nThe feeling of the project's potential and necessity was, of course, inspiring.<\/p>\n<p>The next day, the team and I went out for lunch and discussed what the minimal functionality of the app would look like. <\/p>\n<p>As a result, the following list of tasks to accomplish at the hackathon was formed:<\/p>\n<ul>\n<li>Login to the delivery terminal.<\/li>\n<li>Display current location.<\/li>\n<li>Send data to external API (coordinates, picked order, delivered order).<\/li>\n<li>Receive data from external API (current orders of the courier).<\/li>\n<li>Send an event that the order has been picked for delivery\/delivered.<\/li>\n<li>Display the current location of the courier on the map on the website.<\/li>\n<\/ul>\n<p>\nThe main work, as I saw it, was to be done in creating the backend of the application (after discussions, we chose ReactNative for app development, more specifically the framework over it \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, allowing for no native code to be written at all). Initially, in terms of backend, there was hope for Vanya Zverev, as an experienced person working with our service template and k8s (the work he took on). I and Andrey Sarafanov worked with ReactNative.<\/p>\n<p>I decided to create a working repository for the project right away. At midnight, I came across the issue that geolocation in ReactNative doesn't work well in the background without writing native code, which was a bit frustrating. However, it got better when I realized I was reading the documentation for ReactNative, not the expo.io framework. By the end of the evening, I understood how to get the current location in expo.io and draw separate screens (for login, order display, etc.).<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn the morning at the hackathon, we lured Gleb into our highly promising project. We quickly sketched out a plan of what needed to be done.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe made a mistake when we tried to communicate using GRPC instead of HTTP, as no one knew how to build a GRPC client for JavaScript. After spending about an hour and a half on this, we abandoned the idea. Because of this, the guys over on the backend started to redo the existing server from GRPC to WebApi. Half an hour later, we finally managed to set up communication between the application and the backend; what a miracle. At the same time, Gleb was almost finishing the deployment in k8s plus auto-deployment on commit to master. \ud83d\ude42<\/p>\n<p>We chose MySQL as the database to avoid risks (there were thoughts about CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs a result: <\/p>\n<ul>\n<li>We implemented the saving of the current coordinates of the courier from the application into the database.<\/li>\n<li>We set up RabbitMQ and subscribed to messages about the courier taking the order, to immediately display the order for the courier in the application.<\/li>\n<li>We started saving the delivery time of the order in our database after the courier pressed a button in the application. We didn't manage to add the event sending back to RabbitMQ to indicate that the order was delivered.<\/li>\n<li>I displayed a map on the currentorder page of the site showing the courier's current location. However, this functionality remains slightly unfinished, as we couldn't configure CORS to obtain coordinates from our new service in the environment.<\/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 currently we are using an authentication protocol of our own development, which creates a number of difficulties: custom client libraries, inconvenient collaboration with external partners, and potential security issues (after all, OAuth2.0 and OpenID Connect in their reference implementations can be considered secure, but I am not sure about our solution).<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe created a separate service that emulates a personal data storage service to build a small Country-Agnostic authentication provider that would fetch personal data from a separate service (this would eventually allow us to have one service through which users could log in with an account from any country while complying with GDPR and other laws). We completed this part, along with the provider, and successfully linked them together. Next, we needed to create an API that would be protected by tokens issued by the provider, support token introspection via the provider, and return protected data if the request met the authorization policies (checking that the user is authenticated via Bearer scheme, the token contains a specific scope, and the user has permission to make the call). This part was also completed. The last component was a JavaScript client that would be issued a token, allowing it to call the protected API. We did not have time to complete this part. Therefore, the entire functional part was ready, but the front-end part for demonstrating the system's operability was not prepared.<\/p>\n<h4>E-E-E (the 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 sausages onto the pizza. If you toss the sausage incorrectly, a sad message appears on the screen saying \"Rejected,\" but if all the sausages are placed correctly, a random fact about pizza appears.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" 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 did not have time.<\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" 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 which prize they would like to receive if they won. It turned out that the most valuable prize would be \"a way to production.\" <\/p>\n<p><img decoding=\"async\" alt=\"Coding - Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTherefore, stay tuned for our game announcement featuring little hands tossing pepperonis onto the pizza.<\/p>\n<blockquote><p>As attentive readers may have noticed, the team 'E-E-E (the game)' won. Congratulations to the team!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Only registered users can participate in the survey. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Please log in<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Which project did you like the most?<\/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 for 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 users voted. 3 users abstained.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/449344\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d. \u0420\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0431\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u043d\u0435\u043c\u0443 \u0437\u0430 2 \u043d\u0435\u0434\u0435\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c. \u0421\u043a\u0443\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u043c \u041d\u0430\u0447\u043d\u0443 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u0447\u0430\u043b\u043e \u0430\u043f\u0440\u0435\u043b\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0432 \u043e\u0444\u0438\u0441\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d MskDotNet Community. \u0411\u0438\u0442\u0432\u0430 \u0437\u0430 \u0422\u0430\u0442\u0443\u0438\u043d \u0432 \u0440\u0430\u0437\u0433\u0430\u0440\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26093,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u044b \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0445\u0430\u043a\u0430\u0442\u043e\u043d.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/news\/kodim-pitstsa\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\/en\/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\udd47Coding-Pizza | ProHoster","description":"Hello, Habr. We spontaneously held our first internal hackathon.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}