{"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\/de\/blog\/news\/kodim-pitstsa","title":{"rendered":"Coding\u2013Pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr. Wir haben spontan unseren ersten internen Hackathon durchgef\u00fchrt. Ich wollte meine Schmerzen und Schlussfolgerungen zur Vorbereitung innerhalb von 2 Wochen mit euch teilen, sowie die Projekte, die entstanden sind.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\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>Langweilige Teile f\u00fcr diejenigen, die sich f\u00fcr Marketing interessieren<\/h2>\n<p>\nIch beginne mit einer kleinen Geschichte. <\/p>\n<p>Anfang April. In unserem B\u00fcro findet der erste Hackathon der MskDotNet Community statt. Der Kampf um Tatooine ist er\u00f6ffnet, diesmal in unserer Galaxie. Samstag. 20 Teams. Pizza. Alles ist sehr herzlich (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">Beweise<\/a><\/noindex>). Ein aufblasbarer R2-D2 schwebt durch den Raum. Die Teams schreiben die besten Algorithmen, um das gef\u00e4hrlichste Rennen auf der Karte zu gewinnen. Wir verschieben den Start der ersten Rennen. Kekse und Kaffee retten uns. Wir, die Organisatoren, hatten erwartet, dass viele am Samstag nach dem Mittagessen gehen w\u00fcrden. Aber nicht. 12 Stunden Programmierung liegen hinter uns. Finale. Etwas f\u00e4llt aus, etwas startet nicht. Aber alle sind gl\u00fccklich. Unser Team gewinnt. Wir sind doppelt gl\u00fccklich. <\/p>\n<p>Ich teile meine Freude in Slack und mir kommt die Idee: \"Wir sollten unseren eigenen Hackathon veranstalten\". Ich schreibe unserem CTO Sascha. Stille. <\/p>\n<p>Morgen. Ich trinke Kaffee im B\u00fcro. Ich sehe Sascha von hinten auf mich zukommen. \"Lisa, das ist gro\u00dfartig! Wir haben genau am 21. April ein wichtiges Datum. Lass es uns machen!\" WTF!? So schnell? H\u00e4? Was? Ich muss Mitte April nach Syktyvkar zur Ausbildung fliegen. Egal, lass es uns machen.<\/p>\n<p>Es bleiben 2 Wochen. Ich war noch nie die alleinige Organisatorin eines Hackathons. Auch nicht eines internen. Ich lese Artikel zu diesem Thema. Wahnsinn. Man braucht mehrere Monate. Man braucht mehrere Personen. Man muss Merchandise, Preise, Bedingungen, einen Zeitplan ausdenken, Interesse wecken, Ziel verstehen, Budgets. Vielleicht muss ich sogar den Sinn des Lebens herausfinden. Es wird ganz sicher nichts. Und w\u00e4hrend du gelesen und dich vorbereitet hast, ist bereits eine Woche vergangen. Es ist die h\u00f6chste Zeit, die Artikel zu ignorieren und mit der Arbeit zu beginnen. <\/p>\n<p><b class=\"spoiler_title\">Hier ist unsere Checkliste zur Durchf\u00fchrung eines internen Hackathons in 1 Woche.<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: Du setzt dich ruhig hin und schreibst eine Liste von Dingen, die f\u00fcr den Hackathon erledigt werden m\u00fcssen. <i>30 Minuten<\/i>.<\/li>\n<li><b>Aufgabe<\/b>: Die Teilnehmer schlagen selbst die Projekte vor und w\u00e4hlen sie aus, die sie in Google Sheets erstellen m\u00f6chten. <i>Hintergrundaufgabe, 2 Stunden<\/i>.<\/li>\n<li><b>Zeitplan<\/b>: Du schreibst schnell einen kurzen Zeitplan mit 3 Pausen und dem Finale. <i>20 Minuten<\/i>.<\/li>\n<li><b>Befehle<\/b>: Du ver\u00f6ffentlichst eine Nachricht \u00fcber den Hackathon mit dem Zeitplan vom CTO in den IT-Kan\u00e4len in Slack\/E-Mail\/etc. und erstellst einen separaten Kanal f\u00fcr den Hackathon. Dort teilen sich alle in Teams auf, und diejenigen, die sich nicht entschieden haben, tun dies in den ersten 5 Minuten des Hackathons. <i>Hintergrundaufgabe, 2 Stunden<\/i>.<\/li>\n<li><b>Anreize<\/b>: Du planst Merchandise mit zwei Entwicklern, gibst es dem Designer zur Ausarbeitung und erh\u00e4ltst das Ergebnis. <i>Hintergrundaufgabe, 3 Tage<\/i>.<\/li>\n<li><b>Hackathon<\/b>: Du kommst ins B\u00fcro, koordinierst am Anfang alle, k\u00fcmmerst dich um deine eigenen Sachen, liest Reddit, informierst mit ernstem Gesicht \u00fcber jede Pause \u00fcber frische Pizza, machst Fotos vom Sonnenuntergang, k\u00fcndigst das Finale an, w\u00e4hlst zusammen und w\u00e4hlt den Gewinner aus. <i>1 Tag<\/i>.<\/li>\n<li><b>Unter dem Sternchen<\/b>: Nat\u00fcrlich denkst du st\u00e4ndig daran, dass alles gut verl\u00e4uft. Nat\u00fcrlich werden nicht alle deine Nachricht sehen und mit einigen ist es besser, pers\u00f6nlich zu sprechen. Nat\u00fcrlich, wenn dir jemand hilft, wird alles doppelt so einfach (mir hat die wunderbare Aljena geholfen).<\/li>\n<\/ul>\n<h2>Der weniger langweilige Teil \u00fcber das Datum des Hackathons<\/h2>\n<p>\nWarum der 21. April? Dieser Tag ist f\u00fcr uns bedeutend. Genau vor einem Jahr, am 21. April, sind wir w\u00e4hrend der ersten Osterferien nach der Start der Bundeswerbungskampagne unter Last zusammengebrochen. Am n\u00e4chsten Tag, am Sonntag, war unser Team ab 8 Uhr morgens bei der Arbeit. Damals haben wir im Trello-Board sundayhackathon erstellt, und die Woche mit 12-Stunden-Schichten begann. Die Situation war so kritisch, dass wir nicht einmal Zeit zum Essen hatten und uns von Leuten aus anderen Teams verpflegt wurden.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEine detailliertere Geschichte kannst du auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">Fjodor Owtschinnikows Seite<\/a><\/noindex> (unserem CEO) lesen. Seitdem haben wir viel ver\u00e4ndert, aber das Datum werden wir jetzt ganz sicher nicht vergessen.<\/p>\n<p>In diesem Jahr haben wir beschlossen, dass dieses Ereignis in Erinnerung bleiben sollte, und in bester Tradition organisierten wir den ersten internen Hackathon in der Geschichte von Dodo, der 10 Stunden dauerte. <\/p>\n<h2>Der interessanteste Teil \u00fcber die Projekte des Hackathons<\/h2>\n<p>\n<i>Haftungsausschluss: Alle Beschreibungen wurden von den Jungs selbst geschrieben, daher geh\u00f6rt das Urheberrecht nicht mir.<\/i><\/p>\n<h4>Oleg Learning (Machine Learning)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Wir wollten ein neuronales Netzwerk erstellen, das erkennt, welche Pizza auf dem Foto abgebildet ist, ohne irgendwelche Vorkenntnisse. Am Ende haben wir ein sehr einfaches und spielerisches gemacht \u2013 es erkennt 10 Pizzen und wir haben ungef\u00e4hr verstanden, wie alles funktioniert, so gut es eben an einem Tag (~10 Stunden) m\u00f6glich ist.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInsbesondere haben wir verstanden, dass die Branche einen Punkt erreicht hat, an dem ein gew\u00f6hnlicher Entwickler fertige Bibliotheken nutzen, die Dokumentation lesen und sein eigenes neuronales Netzwerk ohne tiefgehende Fachkenntnisse trainieren kann. Und es wird ausreichend gut f\u00fcr die L\u00f6sung realer Aufgaben funktionieren.<\/p>\n<p>Die Werkzeuge, die wir verwendet haben: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 eine benutzerfreundliche und einfache Bibliothek f\u00fcr maschinelles Lernen und Computer Vision.<\/li>\n<li>Wir haben zwei Modelle ausprobiert \u2013 ResNet50, Yolo.<\/li>\n<li>Der Code wurde, wie sollte es auch anders sein, in Python geschrieben.<\/li>\n<\/ul>\n<p>\nWir hatten 11.000 Fotos, aber fast 3\/4 davon waren unbrauchbar, und bei den verbleibenden gab es verschiedene ungeeignete Perspektiven. Letztendlich haben wir ein fertiges Modell genommen (das einfach in der Lage ist, Pizza zu erkennen) und damit den gr\u00f6\u00dften Schrott aussortiert. Danach war im Namen des Fotos der Name der Pizza enthalten \u2014 so haben wir sie in Ordner sortiert, aber es stellte sich heraus, dass die Namen nicht mit der Realit\u00e4t \u00fcbereinstimmten, sodass wir manuell nacharbeiten mussten. Letztendlich blieben etwa 500-600 Fotos \u00fcbrig, was zwar eine verschwindend kleine Menge ist, aber trotzdem reichte, um 10 Pizzen voneinander zu unterscheiden.<\/p>\n<p>F\u00fcr das Training des Netzes haben wir die g\u00fcnstigste virtuelle Maschine in Azure auf NVIDIA Tesla K80 genommen. Darauf wurde \u00fcber 100 Epochen trainiert, doch es war nach 50 Epochen schon zu sehen, dass das Netzwerk ges\u00e4ttigt war, da der Datensatz klein war.<\/p>\n<p>Das eigentliche Problem besteht in der Abwesenheit guter Daten.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir haben m\u00f6glicherweise bei den Begriffen etwas durcheinandergebracht, aber man muss ber\u00fccksichtigen, dass wir in dieser Hinsicht keinerlei Erfahrung haben.<\/p>\n<h4>GUI f\u00fcr NOOBS (Konsole zum Bestellen von 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>Wir haben einen Prototyp eines Konsolenanwendungs f\u00fcr Nerds entwickelt, mit dem man \u00fcber das Terminal oder die Eingabeaufforderung Pizza bestellen kann, oder sogar in die Deployment-Pipeline integrieren kann, um bei erfolgreichem Release Pizza ins B\u00fcro zu liefern.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Arbeit wurde in mehrere Teile gegliedert: Wir haben herausgefunden, wie unser API f\u00fcr mobile Anwendungen funktioniert, und haben unser eigenes CLI mit Hilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> gebaut und die Ver\u00f6ffentlichung des von uns erstellten Pakets konfiguriert. Bei dieser letzten Aufgabe gab es gegen Ende des Hackathons einige unangenehme Minuten. Bei uns hat alles lokal funktioniert und sogar die alten ver\u00f6ffentlichten Versionen des Pakets liefen, aber die neuen (in denen mehr coole Funktionen und Smileys hinzugef\u00fcgt wurden) weigerten sich, zu funktionieren. Wir haben etwa 40 Minuten damit verbracht zu kl\u00e4ren, was schiefgelaufen ist, aber am Ende hat alles auf magische Weise von selbst funktioniert.)<\/p>\n<p>Unser gr\u00f6\u00dftes Ziel beim Hackathon war eine echte Pizza-Bestellung ins B\u00fcro \u00fcber unser CLI. Wir haben das zehnmal auf der Testumgebung durchgespielt, aber meine H\u00e4nde zitterten trotzdem, als ich die Kommandos im Produktivsystem eingab.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm Ende \u2014 wir haben es trotzdem geschafft!<\/p>\n<p><img decoding=\"async\" alt=\"Coding\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 Bruzhmeljow (Autor), Wanja Zverev, Gleb Lesnikow (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrei Sarafanow<\/i><\/p>\n<p>Wir haben die Idee \"App f\u00fcr Kuriere\" aufgegriffen.<\/p>\n<p><b class=\"spoiler_title\">Die Vorgeschichte zur Vorbereitung.<\/b>Zun\u00e4chst habe ich \u00fcberlegt, welche Funktionen die App \u00fcberhaupt haben k\u00f6nnte. Es entstand ungef\u00e4hr folgende Liste an Funktionen:<\/p>\n<ul>\n<li>Die App loggt sich mit einem Code in die Lieferkasse ein.<\/li>\n<li>In der App sind sofort die verf\u00fcgbaren Auftr\u00e4ge sichtbar, die Auftr\u00e4ge, die abzuholen sind.<\/li>\n<li>Der Kurier markiert den Auftrag und nimmt ihn mit auf die Fahrt.<\/li>\n<li>Es wird ihm die gesch\u00e4tzte Ankunftszeit angezeigt und ob er es rechtzeitig schafft oder nicht.<\/li>\n<li>Der Kunde sieht, dass der Kurier losgefahren ist.<\/li>\n<li>Der Kunde sieht die Position des Kuriers auf der Karte sowie die gesch\u00e4tzte Ankunftszeit.<\/li>\n<li>Der Kurier kann dem Kunden \u00fcber einen Chat in der App schreiben.<\/li>\n<li>Der Kunde kann dem Kurier \u00fcber einen Chat in der App schreiben.<\/li>\n<li>F\u00fcnf Minuten vor der Ankunft erh\u00e4lt der Kunde eine Nachricht, dass der Kurier in der N\u00e4he ist, seien Sie bereit.<\/li>\n<li>Der Kurier markiert in der App, dass er angekommen ist und wartet.<\/li>\n<li>Der Kurier kann mit einem Klick aus der App anrufen und mitteilen, dass er (kommt, angekommen ist usw.)<\/li>\n<li>Der Kunde nimmt den Auftrag an und gibt den PIN-Code aus der App oder der SMS zur Best\u00e4tigung der Lieferung ein. (wie eine Unterschrift) Damit der Kurier die Lieferung nicht vorzeitig abschlie\u00dfen kann, wenn er versp\u00e4tet ist.<\/li>\n<li>Der Auftrag wird im System als geliefert markiert.<\/li>\n<\/ul>\n<p>Au\u00dferdem ein paar alternative Szenarien:<\/p>\n<ul>\n<li>Der Kurier kann den Auftrag als nicht geliefert kennzeichnen und einen Grund ausw\u00e4hlen.<\/li>\n<li>Bei versp\u00e4teter Lieferung kann der Kurier auf Knopfdruck ein elektronisches Zertifikat per SMS ausstellen. Oder das Zertifikat wird automatisch versendet, wenn die Lieferfrist nicht eingehalten wird.<\/li>\n<\/ul>\n<p>\nDas Gef\u00fchl der Perspektive und Notwendigkeit dieses Projekts hat nat\u00fcrlich motiviert.<\/p>\n<p>Am n\u00e4chsten Tag sind wir mit dem Team zum Mittagessen gegangen und haben besprochen, wie die minimalen Funktionen der App aussehen werden. <\/p>\n<p>Letztendlich entstand folgende Liste von Aufgaben, die wir w\u00e4hrend des Hackathons erledigen sollten:<\/p>\n<ul>\n<li>Login in die Lieferkasse.<\/li>\n<li>Aktuelle Position anzeigen.<\/li>\n<li>Daten an eine externe API senden (Koordinaten, Auftrag angenommen, Auftrag geliefert).<\/li>\n<li>Daten aus einer externen API abrufen (aktuelle Auftr\u00e4ge des Kuriers).<\/li>\n<li>Ereignis senden, dass der Auftrag zur Lieferung angenommen wurde \/ geliefert wurde.<\/li>\n<li>Aktuelle Position des Kuriers auf der Karte auf der Webseite anzeigen.<\/li>\n<\/ul>\n<p>\nDie Hauptarbeit, wie ich es sah, lag in der Erstellung des Backends, der App selbst (nach Diskussionen entschieden wir uns f\u00fcr ReactNative zur Entwicklung der App, genauer gesagt f\u00fcr die Bindung \u00fcber \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, die es erm\u00f6glicht, \u00fcberhaupt keinen nativen Code zu schreiben). In Bezug auf das Backend gab es zun\u00e4chst die Hoffnung auf Wanja Zwerew, als einen erfahrenen, der mit unserer Servicemuster und k8s arbeitet (die Arbeit, die er \u00fcbernommen hat). ReactNative haben Andrej Sarafanov und ich ausprobiert.<\/p>\n<p>Ich beschloss, sofort ein Arbeitsrepository f\u00fcr das Projekt zu erstellen. Um 12 Uhr nachts stie\u00df ich darauf, dass die Geolokalisierung in ReactNative im Hintergrund schlecht funktioniert, wenn man keinen nativen Code schreibt, was mich ein bisschen frustrierte. Sp\u00e4ter lie\u00df es nach, als ich merkte, dass ich nicht die Dokumentation des Frameworks expo.io las, sondern die von ReactNative. Am Ende des Abends war mir bereits klar, wie ich bei expo.io die aktuelle Position abrufen und separate Bildschirme (f\u00fcr die Anmeldung, die Anzeige von Bestellungen usw.) erstellen kann.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm Morgen beim Hackathon wurde Gleb in unser vielversprechendes Projekt hineingezogen. Schnell skizzierten wir einen Plan, was zu tun ist.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir haben einen Fehler gemacht, als wir versuchten, die Kommunikation nicht \u00fcber HTTP, sondern \u00fcber GRPC gem\u00e4\u00df dem Projektschema zu realisieren, da niemand wusste, wie man einen GRPC-Client f\u00fcr JavaScript erstellt. Letztendlich haben wir etwa anderthalb Stunden darauf verwendet und die Idee aufgegeben. Deshalb begannen die Jungs auch im Backend, den fertigen Server von GRPC auf WebApi umzubauen. Nach einer halben Stunde konnten wir dann endlich die Kommunikation zwischen der App und dem Backend einrichten, welch Wunder. Aber zur gleichen Zeit war Gleb fast mit dem Deployment auf k8s fertig und zudem mit dem Autodeploy bei einem Commit in den Master. \ud83d\ude42<\/p>\n<p>Als Speicher haben wir MySQL gew\u00e4hlt, um nicht wenigstens in Bezug auf die Datenbank zu riskieren (es gab \u00dcberlegungen zu CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInsgesamt: <\/p>\n<ul>\n<li>Wir haben die Speicherung der aktuellen Koordinaten des Kurier in der Datenbank aus der App realisiert.<\/li>\n<li>Wir haben RabbitMQ angeschlossen und uns auf Nachrichten \u00fcber das Annehmen von Bestellungen durch den Kurier angemeldet, um die Bestellung sofort im App des Kuriers anzuzeigen.<\/li>\n<li>Wir begannen, die Lieferzeit des Auftrags in der Datenbank zu speichern, nachdem der Kurier den Knopf in der App gedr\u00fcckt hatte. Wir haben es nicht geschafft, das Ereignis zur\u00fcck an Rabbit zu senden, dass die Bestellung geliefert wurde.<\/li>\n<li>Ich habe eine Kartenanzeige auf der Seite currentorder der Website mit der aktuellen Position des Kurier erstellt. Aber diese Funktionalit\u00e4t blieb etwas unvollst\u00e4ndig, da es uns nicht gelang, CORS in der Umgebung f\u00fcr den Abruf der Koordinaten aus unserem neuen Dienst einzurichten.<\/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>Wir wollten einen OpenID Connect-Anbieter implementieren, da wir derzeit ein selbstentwickeltes Authentifizierungsprotokoll verwenden, was eine Reihe von Schwierigkeiten mit sich bringt: kundenspezifische Client-Bibliotheken, umst\u00e4ndliche Zusammenarbeit mit externen Partnern und m\u00f6glicherweise Sicherheitsprobleme (schlie\u00dflich kann man OAuth2.0 und OpenID Connect in ihrer Referenzimplementierung als sicher betrachten, aber bei unserer L\u00f6sung bin ich mir nicht sicher).<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir haben einen separaten Dienst erstellt, der einen Dienst zur Speicherung personenbezogener Daten emuliert, um ein kleines Modell eines l\u00e4nderunabh\u00e4ngigen Authentifizierungsanbieters zu schaffen, der die personenbezogenen Daten von einem separaten Dienst abruft (das w\u00fcrde perspektivisch die M\u00f6glichkeit bieten, sich mit einem Konto aus jedem Land anzumelden und dabei die DSGVO und andere gesetzliche Regelungen einzuhalten). Diese Teile haben wir gemacht, sowohl den Anbieter als auch die Integration erfolgreich umgesetzt. Als n\u00e4chstes musste eine API erstellt werden, die durch Token gesch\u00fctzt war, die der Anbieter ausgibt, die deren Inspektion \u00fcber den Anbieter unterst\u00fctzen und gesch\u00fctzte Daten zur\u00fcckgeben, wenn die Anfrage die Autorisierungsrichtlinien erf\u00fcllte (wir pr\u00fcfen, ob der Benutzer nach dem Bearer-Schema authentifiziert ist, ob sein Token einen bestimmten Scope enth\u00e4lt und ob der Benutzer eine Erlaubnis hat, den Aufruf auszuf\u00fchren). Auch dieser Teil wurde umgesetzt. Der letzte Bestandteil war ein JavaScript-Client, dem ein Token ausgeh\u00e4ndigt wird, mit dem er die gesch\u00fctzte API aufruft. Diese Funktion konnten wir nicht rechtzeitig umsetzen. Das hei\u00dft, der funktionale Teil war vollst\u00e4ndig bereit, aber der Front-End-Bereich zur Demonstration der Funktionalit\u00e4t des gesamten Systems war noch nicht fertig.<\/p>\n<h4>\u00c4-\u00c4-\u00c4 (Spiel)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Wir haben ein Minispiel in Unity erstellt, in dem flinke H\u00e4nde W\u00fcrstchen auf eine Pizza legen. Wenn du das W\u00fcrstchen falsch gelegt hast, erscheint auf dem Bildschirm die traurige Nachricht \u201eAbgelehnt\u201c, und wenn das gesamte W\u00fcrstchen richtig platziert ist, wird eine zuf\u00e4llige Tatsache \u00fcber Pizza angezeigt.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir wollten eine zweite Stufe mit dem Hinzuf\u00fcgen von Tomaten machen, aber das haben wir nicht geschafft.<\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Kurze Fortsetzung: Wer hat gewonnen?<\/h2>\n<p>\nVor dem Hackathon haben wir mit den Jungs gesprochen und ich habe gefragt, welchen Preis sie gerne erhalten w\u00fcrden, wenn sie gewinnen. Es stellte sich heraus, dass der wertvollste Preis \u201eder Weg in die Produktion\u201c w\u00e4re. <\/p>\n<p><img decoding=\"async\" alt=\"Coding\u2013Pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDeshalb erwarten Sie in naher Zukunft die Ank\u00fcndigung eines Spiels mit H\u00e4nden, die Peperoni auf die Pizza streuen.<\/p>\n<blockquote><p>Wie aufmerksame Leser bemerkt haben, hat das Team \u201e\u00c4-\u00c4-\u00c4 (Spiel)\u201c gewonnen. Herzlichen Gl\u00fcckwunsch an die Jungs!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte einloggen<\/a><\/noindex>.<\/p>\n<h2 class=\"default-block__polling-title\">Welches Projekt hat Ihnen am besten gefallen?<\/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 f\u00fcr 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>                    \u00c4-\u00c4-\u00c4<\/p>\n<\/li>\n<\/ul>\n<p>    5 Nutzer haben abgestimmt. 3 Nutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Kodieren\u2013Pizza | ProHoster","description":"Hallo, Habr. Wir haben spontan unser erstes internes Hackathon veranstaltet.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}