{"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\/fr\/blog\/news\/kodim-pitstsa","title":{"rendered":"Codons\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour, Habr. Nous avons spontan\u00e9ment organis\u00e9 notre premier hackathon interne. J'ai d\u00e9cid\u00e9 de partager avec vous mes douleurs et mes conclusions sur la pr\u00e9paration qui a dur\u00e9 deux semaines, ainsi que sur les projets qui ont \u00e9merg\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\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>Partie ennuyeuse pour ceux qui s'int\u00e9ressent au marketing<\/h2>\n<p>\nJe vais commencer par une petite histoire. <\/p>\n<p>D\u00e9but avril. Notre bureau accueille le premier hackathon de la communaut\u00e9 MskDotNet. La bataille pour Tatooine est en cours, dans notre galaxie cette fois. Samedi. 20 \u00e9quipes. Pizza. Tout est tr\u00e8s convivial (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">preuves<\/a><\/noindex>). Un R2-D2 gonflable se dresse dans la salle. Les \u00e9quipes \u00e9crivent les algorithmes les plus pr\u00e9cis pour r\u00e9ussir la course la plus p\u00e9rilleuse sur la carte. Nous avons retard\u00e9 le lancement des premi\u00e8res courses. Les biscuits et le caf\u00e9 sauvent la mise. Nous, les organisateurs, nous attendions \u00e0 ce que beaucoup de personnes s'en aillent apr\u00e8s le d\u00e9jeuner. Mais non. 12 heures de codage derri\u00e8re nous. Finale. Des choses qui se d\u00e9connectent, d'autres qui ne d\u00e9marrent pas. Mais tout le monde est heureux. Notre \u00e9quipe gagne. Nous sommes doublement heureux. <\/p>\n<p>Je partage ma joie sur Slack et l'id\u00e9e me vient : \u00ab Il faut faire notre propre hackathon \u00bb. J'\u00e9cris \u00e0 notre CTO Sasha. Silence. <\/p>\n<p>Matin. Je bois un caf\u00e9 au bureau. Je vois Sasha s'approcher par derri\u00e8re. \u00ab Liza, c'est g\u00e9nial ! Nous avons une date importante le 21 avril. Allons-y ! \u00bb Quoi !? Si vite ? Hein ? Je dois m'envoler pour Syktyvkar pour un stage \u00e0 la mi-avril. Peu importe ! Allons-y.<\/p>\n<p>Il reste deux semaines. Je n'ai jamais \u00e9t\u00e9 l'organisatrice unique d'un hackathon. M\u00eame s'il est interne. Je lis des articles sur le sujet. Horreur. Il faut plusieurs mois. Il faut plusieurs personnes. Il faut penser au merchandising, aux prix, aux conditions, \u00e0 l'emploi du temps, int\u00e9resser les gens, comprendre l'objectif, les budgets. Peut-\u00eatre m\u00eame r\u00e9fl\u00e9chir au sens de la vie. Je suis s\u00fbre que je ne vais pas y arriver. Et pendant que tu lisais et te pr\u00e9parais, une semaine est d\u00e9j\u00e0 pass\u00e9e. Il est temps d'abandonner les articles et de commencer \u00e0 faire quelque chose. <\/p>\n<p><b class=\"spoiler_title\">Voici notre checklist pour organiser un hackathon interne en une semaine<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: assieds-toi tranquillement et fais une liste de ce qu'il faut faire pour le hackathon. <i>30 minutes<\/i>.<\/li>\n<li><b>La t\u00e2che<\/b>: les participants proposent et choisissent eux-m\u00eames les projets qu'ils souhaitent cr\u00e9er dans Google Sheets. <i>T\u00e2che de fond, 2 heures<\/i>.<\/li>\n<li><b>Calendrier<\/b>: tu \u00e9cris sur le pouce un bref programme horaire en tenant compte de 3 pauses et de la finale. <i>20 minutes<\/i>.<\/li>\n<li><b>Commandes<\/b>: tu publies un message sur le hackathon avec le calendrier du CTO dans les canaux IT sur Slack\/email\/etc. et tu cr\u00e9es un canal s\u00e9par\u00e9 pour le hackathon. Dans celui-ci, tout le monde se divise en \u00e9quipes, et ceux qui ne sont pas encore d\u00e9cid\u00e9s le font dans les 5 premi\u00e8res minutes du hackathon. <i>T\u00e2che de fond, 2 heures<\/i>.<\/li>\n<li><b>Avantages<\/b>: tu cr\u00e9es des produits d\u00e9riv\u00e9s avec deux d\u00e9veloppeurs, tu les envoies \u00e0 un designer pour la cr\u00e9ation, tu re\u00e7ois le produit fini. <i>T\u00e2che de fond, 3 jours<\/i>.<\/li>\n<li><b>Hackathon<\/b>: tu arrives au bureau, tu coordonnes tout le monde au d\u00e9but, tu t'occupes de tes affaires, tu lis Reddit, avec un air s\u00e9rieux tu annonces chaque pause la livraison de la nouvelle pizza, tu photographies le coucher de soleil, tu annonces la finale, vous votez ensemble et choisissez un gagnant. <i>1 jour<\/i>.<\/li>\n<li><b>Sous les \u00e9toiles<\/b>: bien s\u00fbr, tu penses constamment \u00e0 ce que tout se passe bien. \u00c9videmment, tout le monde ne verra pas ton message et il est pr\u00e9f\u00e9rable de parler en personne avec certains. \u00c9videmment, si quelqu'un t'aide, tout devient deux fois plus facile (la merveilleuse Alena m'a aid\u00e9).<\/li>\n<\/ul>\n<h2>La partie moins ennuyeuse sur la date du hackathon<\/h2>\n<p>\nPourquoi le 21 avril ? Ce jour est significatif pour nous. Il y a exactement un an, le 21 avril, nous avons \u00e9t\u00e9 submerg\u00e9s par la charge pendant le premier week-end apr\u00e8s le lancement de la Campagne Publicitaire F\u00e9d\u00e9rale. Le lendemain, dimanche, notre \u00e9quipe \u00e9tait au travail d\u00e8s 8 heures du matin. \u00c0 ce moment-l\u00e0, nous avons cr\u00e9\u00e9 un tableau sundayhackathon dans Trello et a commenc\u00e9 une semaine de travail par shifts de 12 heures par jour. La situation \u00e9tait si critique que nous n'avions m\u00eame pas le temps de manger et nous \u00e9tions nourris par des gars d'autres \u00e9quipes.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVous pouvez lire un r\u00e9cit plus d\u00e9taill\u00e9 sur <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">la page de Fiodor Ovchinnikov<\/a><\/noindex> (notre PDG). Depuis, nous avons fait beaucoup de changements, mais nous n'oublierons plus la date.<\/p>\n<p>Cette ann\u00e9e, nous avons d\u00e9cid\u00e9 que cet \u00e9v\u00e9nement m\u00e9rite d'\u00eatre grav\u00e9 dans les m\u00e9moires et, dans la meilleure tradition, nous avons organis\u00e9 le premier hackathon interne de Dodo, qui a dur\u00e9 10 heures. <\/p>\n<h2>La partie la moins ennuyeuse sur les projets du hackathon<\/h2>\n<p>\n<i>Avertissement : toutes les descriptions ont \u00e9t\u00e9 r\u00e9dig\u00e9es par les gars eux-m\u00eames, donc la paternit\u00e9 du texte ne m'appartient pas.<\/i><\/p>\n<h4>Oleg Learning (apprentissage automatique)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Nous voulions cr\u00e9er un r\u00e9seau neuronal qui puisse d\u00e9terminer quelle pizza se trouve sur la photo sans aucune connaissance pr\u00e9alable. Au final, nous avons cr\u00e9\u00e9 un mod\u00e8le tr\u00e8s simple et ludique \u2013 il reconna\u00eet 10 types de pizzas, et nous avons \u00e0 peu pr\u00e8s compris comment tout fonctionne, autant que possible en une journ\u00e9e (~10 heures).<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn particulier, nous avons compris que l'industrie a atteint un niveau o\u00f9 un d\u00e9veloppeur ordinaire peut utiliser des biblioth\u00e8ques pr\u00eates \u00e0 l'emploi, lire la documentation et former son propre r\u00e9seau neuronal sans connaissances approfondies. Et cela fonctionne assez bien pour r\u00e9soudre des probl\u00e8mes r\u00e9els.<\/p>\n<p>Outils que nous avons utilis\u00e9s : <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 une biblioth\u00e8que pratique et simple pour le travail avec l'apprentissage automatique et la vision par ordinateur.<\/li>\n<li>Nous avons essay\u00e9 deux mod\u00e8les \u2013 ResNet50, Yolo.<\/li>\n<li>Le code a \u00e9t\u00e9 \u00e9crit, bien s\u00fbr, en Python.<\/li>\n<\/ul>\n<p>\nNous avions 11000 photos, mais presque 3\/4 se sont r\u00e9v\u00e9l\u00e9es inutilisables, et parmi les restantes, il y avait diff\u00e9rents angles inappropri\u00e9s. En fin de compte, nous avons utilis\u00e9 un mod\u00e8le pr\u00eat (qui sait simplement identifier des pizzas) pour s\u00e9parer les images les plus inutilisables. Ensuite, le nom de l'image comportait le nom de la pizza \u2013 nous les avons donc class\u00e9es dans des dossiers, mais il s'est av\u00e9r\u00e9 que les noms ne correspondaient pas \u00e0 la r\u00e9alit\u00e9 et il a donc fallu faire un nettoyage manuel. Au final, il restait environ 500 \u00e0 600 photos, ce qui est un nombre insignifiant, mais n\u00e9anmoins, cela s'est av\u00e9r\u00e9 suffisant pour distinguer 10 pizzas les unes des autres.<\/p>\n<p>Pour entra\u00eener le r\u00e9seau, nous avons pris la machine virtuelle la moins ch\u00e8re sur Azure avec un NVIDIA Tesla K80. Nous avons entra\u00een\u00e9 pendant 100 \u00e9poques, mais il \u00e9tait clair que le r\u00e9seau \u00e9tait devenu satur\u00e9 apr\u00e8s 50 \u00e9poques, car le jeu de donn\u00e9es \u00e9tait petit.<\/p>\n<p>En fait, tout le probl\u00e8me provient du manque de bonnes donn\u00e9es.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons peut-\u00eatre un peu m\u00e9lang\u00e9 les termes, mais il faut comprendre que nous n'avons absolument aucune exp\u00e9rience dans tout cela.<\/p>\n<h4>GUI for NOOBS (console pour commander des pizzas)<\/h4>\n<p>\n<i>Misha Kumachyov (<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>Nous avons cr\u00e9\u00e9 un prototype d'application console pour les geeks, qui permet de commander une pizza via le terminal ou la ligne de commande, ou m\u00eame de l'int\u00e9grer dans un pipeline de d\u00e9ploiement afin de livrer la pizza au bureau apr\u00e8s un d\u00e9ploiement r\u00e9ussi.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe travail a \u00e9t\u00e9 divis\u00e9 en plusieurs parties : nous avons explor\u00e9 la fa\u00e7on dont notre API pour les applications mobiles fonctionne, avons construit notre propre CLI avec <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> et avons configur\u00e9 la publication de notre paquet. La derni\u00e8re t\u00e2che a donn\u00e9 lieu \u00e0 plusieurs minutes d\u00e9sagr\u00e9ables vers la fin du hackathon. Tout fonctionnait localement et m\u00eame les anciennes versions publi\u00e9es du paquet marchaient, mais les nouvelles (qui contenaient plus de super fonctionnalit\u00e9s et d'\u00e9motic\u00f4nes) refusaient de fonctionner. Nous avons pass\u00e9 environ 40 minutes \u00e0 comprendre ce qui s'\u00e9tait mal pass\u00e9, mais finalement, tout a fonctionn\u00e9 comme par magie).<\/p>\n<p>Notre objectif principal lors du hackathon \u00e9tait de passer une commande de pizza r\u00e9el au bureau via notre CLI. Nous avons pass\u00e9 tout en revue une dizaine de fois sur notre environnement de test, mais j'avais quand m\u00eame les mains tremblantes lorsque je tapais les commandes en production.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAu final \u2014 nous l'avons quand m\u00eame fait !<\/p>\n<p><img decoding=\"async\" alt=\"Codons\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 Bruzmel\u00ebv (auteur), Vania Zvereva, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropie<\/a><\/noindex>), Andrey Sarafanov<\/i><\/p>\n<p>Nous avons pris l'id\u00e9e d'une \u00ab Application pour les livreurs \u00bb.<\/p>\n<p><b class=\"spoiler_title\">Contexte sur les pr\u00e9parations.<\/b>Au d\u00e9part, j'ai r\u00e9fl\u00e9chi aux fonctionnalit\u00e9s possibles de l'application. Voici une liste approximative des fonctionnalit\u00e9s :<\/p>\n<ul>\n<li>L'application se connecte \u00e0 la caisse de livraison par un code.<\/li>\n<li>Dans l'application, les commandes disponibles et les commandes \u00e0 prendre sont imm\u00e9diatement visibles.<\/li>\n<li>Le livreur marque la commande et part avec.<\/li>\n<li>Il voir le temps estim\u00e9 et s'il sera \u00e0 l'heure ou non.<\/li>\n<li>Le client voit que le livreur est en route.<\/li>\n<li>Le client peut voir la position du livreur sur la carte et le temps estim\u00e9.<\/li>\n<li>Le livreur peut \u00e9crire au client dans le chat de l'application.<\/li>\n<li>Le client peut \u00e9crire au livreur dans le chat de l'application.<\/li>\n<li>Cinq minutes avant son arriv\u00e9e, le client re\u00e7oit un message indiquant que le livreur est proche, soyez pr\u00eat.<\/li>\n<li>Le livreur marque dans l'application qu'il est arriv\u00e9 et attend.<\/li>\n<li>Le livreur peut appeler depuis l'application d'un clic et informer qu'il (arrive, est l\u00e0, etc.)<\/li>\n<li>Le client accepte la commande et saisit le code pin de l'application ou re\u00e7u par SMS pour confirmer la livraison (comme une signature). Pour emp\u00eacher le livreur de terminer la livraison \u00e0 l'avance s'il est en retard.<\/li>\n<li>La commande est marqu\u00e9e comme livr\u00e9e dans le syst\u00e8me.<\/li>\n<\/ul>\n<p>Plus quelques sc\u00e9narios alternatifs :<\/p>\n<ul>\n<li>Le livreur peut marquer la commande comme non livr\u00e9e et choisir la raison.<\/li>\n<li>En cas de retard, le livreur peut \u00e9mettre un bon \u00e9lectronique par SMS d'une seule pression. Ou le bon arrive automatiquement en cas de non-respect des d\u00e9lais de livraison.<\/li>\n<\/ul>\n<p>\nLa perspective et l'utilit\u00e9 de ce projet \u00e9taient \u00e9videmment motivantes.<\/p>\n<p>Le lendemain, l'\u00e9quipe est all\u00e9e d\u00e9jeuner et a discut\u00e9 de la mani\u00e8re dont les fonctionnalit\u00e9s minimales de l'application seraient. <\/p>\n<p>Au final, voici la liste des t\u00e2ches \u00e0 accomplir lors du hackathon :<\/p>\n<ul>\n<li>Connexion \u00e0 la caisse de livraison.<\/li>\n<li>Afficher la position actuelle.<\/li>\n<li>Envoyer des donn\u00e9es \u00e0 une API externe (coordonn\u00e9es, commande prise, commande livr\u00e9e).<\/li>\n<li>Obtenir des donn\u00e9es d'une API externe (commandes actuelles du livreur).<\/li>\n<li>Envoyer un \u00e9v\u00e9nement signalant que la commande a \u00e9t\u00e9 prise pour livraison \/ livr\u00e9e.<\/li>\n<li>Afficher la position actuelle du livreur sur la carte sur le site.<\/li>\n<\/ul>\n<p>\nLe principal travail, comme il se voyait, \u00e9tait la cr\u00e9ation du backend et de l'application elle-m\u00eame (apr\u00e8s discussions, nous avons choisi ReactNative pour le d\u00e9veloppement de l'application, plus pr\u00e9cis\u00e9ment l'enveloppement autour \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, permettant de ne pas \u00e9crire de code natif en g\u00e9n\u00e9ral). En ce qui concerne le backend, il y avait initialement de l'espoir en Vanya Zverev, en tant qu'expert travaillant avec notre mod\u00e8le de service et k8s (le type de travail qu'il a pris en charge). J'ai touch\u00e9 \u00e0 ReactNative avec Andrey Sarafanov.<\/p>\n<p>J'ai d\u00e9cid\u00e9 d'essayer de cr\u00e9er directement un d\u00e9p\u00f4t de travail pour le projet. \u00c0 12h, je me suis rendu compte que la g\u00e9olocalisation dans ReactNative ne fonctionnait pas bien en arri\u00e8re-plan sans \u00e9crire de code natif, ce qui m'a un peu frustr\u00e9. Puis, cela s'est calm\u00e9 quand j'ai compris que je lisais la documentation du framework expo.io, et non celle de ReactNative. Au final, en une soir\u00e9e, j'avais d\u00e9j\u00e0 compris comment obtenir la position actuelle dans expo.io et dessiner des \u00e9crans s\u00e9par\u00e9s (pour la connexion, l'affichage de la commande, etc.).<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe matin du hackathon, nous avons s\u00e9duit Gleb dans notre projet ultra-prometteur. Nous avons rapidement esquiss\u00e9 un plan de ce qu'il fallait faire.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons fait une erreur en essayant de faire communiquer en suivant le mod\u00e8le du projet non pas via HTTP, mais via GRPC, car personne ne savait comment assembler un client GRPC pour JavaScript. Au final, apr\u00e8s avoir pass\u00e9 environ une heure et demie l\u00e0-dessus, nous avons abandonn\u00e9 cette id\u00e9e. \u00c0 cause de cela, les gars ont commenc\u00e9 \u00e0 retravailler le serveur pr\u00eat sur le backend de GRPC \u00e0 WebApi. Apr\u00e8s une demi-heure, nous avons enfin pu \u00e9tablir la communication entre l'application et le backend, quel miracle. Mais \u00e0 ce moment-l\u00e0, Gleb presque termin\u00e9 le d\u00e9ploiement dans k8s et le d\u00e9ploiement automatique lors de chaque commit sur master. \ud83d\ude42<\/p>\n<p>Comme stockage, nous avons choisi MySQL pour ne pas prendre de risques avec la base (nous avons envisag\u00e9 CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn r\u00e9sum\u00e9 : <\/p>\n<ul>\n<li>Nous avons mis en \u0153uvre la sauvegarde des coordonn\u00e9es actuelles du livreur \u00e0 partir de l'application dans la base.<\/li>\n<li>Nous avons int\u00e9gr\u00e9 RabbitMQ et nous nous sommes abonn\u00e9s aux messages concernant la prise de commandes par le livreur, afin d'afficher imm\u00e9diatement la commande pour le livreur dans l'application.<\/li>\n<li>Nous avons commenc\u00e9 \u00e0 enregistrer dans notre base l'heure de livraison de la commande, apr\u00e8s que le livreur ait appuy\u00e9 sur le bouton dans l'application. Nous n'avons pas r\u00e9ussi \u00e0 ajouter l'envoi de l'\u00e9v\u00e9nement de retour \u00e0 RabbitMQ indiquant que la commande a \u00e9t\u00e9 livr\u00e9e.<\/li>\n<li>J'ai affich\u00e9 une carte sur la page currentorder du site avec la position actuelle du livreur. Mais cette fonctionnalit\u00e9 est rest\u00e9e l\u00e9g\u00e8rement inachev\u00e9e, car nous n'avons pas r\u00e9ussi \u00e0 configurer CORS pour obtenir les coordonn\u00e9es de notre nouveau 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>Nous souhaitions mettre en \u0153uvre un fournisseur OpenID Connect, car actuellement nous utilisons un protocole d'authentification d\u00e9velopp\u00e9 en interne, ce qui cr\u00e9e plusieurs difficult\u00e9s : biblioth\u00e8ques clientes personnalis\u00e9es, travail compliqu\u00e9 pour les partenaires externes, et potentiellement des probl\u00e8mes de s\u00e9curit\u00e9 (tout de m\u00eame, OAuth2.0 et OpenID Connect dans leur mise en \u0153uvre de r\u00e9f\u00e9rence peuvent \u00eatre consid\u00e9r\u00e9s comme s\u00e9curis\u00e9s, mais en ce qui concerne notre solution \u2014 j'ai des doutes).<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons cr\u00e9\u00e9 un service distinct \u00e9mulant un service de stockage de donn\u00e9es personnelles, afin de cr\u00e9er un petit mod\u00e8le de fournisseur d'authentification Country-Agnostic, qui irait chercher des donn\u00e9es personnelles dans un service distinct (ce qui \u00e0 terme permettrait d'avoir un service unique, avec lequel on pourrait se connecter avec un compte dans n'importe quel pays, tout en respectant le RGPD et d'autres l\u00e9gislations). Cette partie a \u00e9t\u00e9 r\u00e9alis\u00e9e, tout comme le fournisseur, et nous les avons li\u00e9s avec succ\u00e8s. Ensuite, il fallait cr\u00e9er une API qui serait prot\u00e9g\u00e9e par des jetons d\u00e9livr\u00e9s par le fournisseur, supporter leur introspection via le fournisseur et donner des donn\u00e9es prot\u00e9g\u00e9es si la demande satisfaissait les politiques d'autorisation (nous v\u00e9rifions que l'utilisateur est authentifi\u00e9 par le sch\u00e9ma Bearer, que son jeton contient un certain scope + que l'utilisateur lui-m\u00eame a un droit autorisant l'ex\u00e9cution de l'appel). Cette partie a \u00e9galement \u00e9t\u00e9 r\u00e9alis\u00e9e. Le dernier composant \u00e9tait le client JavaScript, \u00e0 qui un jeton serait d\u00e9livr\u00e9, gr\u00e2ce auquel il appellerait l'API prot\u00e9g\u00e9e. Nous n'avons pas eu le temps de finaliser cette partie. Ainsi, toute la partie fonctionnelle \u00e9tait pr\u00eate, mais la partie front-end pour d\u00e9montrer le fonctionnement de l'ensemble du syst\u00e8me ne l'\u00e9tait pas.<\/p>\n<h4>E-E-E (petit jeu)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Nous avons fait un mini-jeu sur Unity o\u00f9 de petites mains lancent de la saucisse sur une pizza. Si tu lances mal la saucisse, un message triste appara\u00eet \u00e0 l'\u00e9cran \u00ab Rejet\u00e9e \u00bb, et si la saucisse est bien plac\u00e9e, un fait al\u00e9atoire sur la pizza appara\u00eet.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous voulions faire un deuxi\u00e8me niveau avec des tomates, mais nous n'avons pas eu le temps.<\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Br\u00e8ve suite : qui a gagn\u00e9 ?<\/h2>\n<p>\nAvant le hackathon, nous avons discut\u00e9 avec les gars et j'ai demand\u00e9 quel prix ils aimeraient recevoir s'ils gagnaient. Il s'est av\u00e9r\u00e9 que le prix le plus pris\u00e9 serait \u00ab un acc\u00e8s en production \u00bb. <\/p>\n<p><img decoding=\"async\" alt=\"Codons\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAinsi, attendez-vous bient\u00f4t \u00e0 une annonce de notre jeu avec des petites mains qui ajoutent des pepperonis sur la pizza.<\/p>\n<blockquote><p>Comme un lecteur attentif a pu le remarquer, l'\u00e9quipe \u00abE-E-E (jeu)\u00bb a gagn\u00e9. F\u00e9licitations aux gars !<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Seuls les utilisateurs enregistr\u00e9s peuvent participer au sondage. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Connectez-vous<\/a><\/noindex>, s'il vous pla\u00eet.<\/p>\n<h2 class=\"default-block__polling-title\">Quel projet vous a le plus plu ?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (apprentissage automatique)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI pour 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 utilisateurs ont vot\u00e9. 3 utilisateurs se sont abstenus.<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.2 - 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\/fr\/blog\/news\/kodim-pitstsa\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Coder\u2013pizza | ProHoster","description":"Salut, Habr. Nous avons spontan\u00e9ment organis\u00e9 notre premier hackathon interne.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}