Kodim - Pizza

Hallo Habr. Wir haben spontan den ersten internen Hackathon abgehalten. Ich habe mich entschlossen, Ihnen meine Schmerzen und Schlussfolgerungen bezüglich der Vorbereitung in zwei Wochen sowie die Projekte, die sich herausstellten, mitzuteilen.



Der langweilige Teil für Marketinginteressierte


Ich werde mit einer kleinen Geschichte beginnen.

Anfang April. Der erste Hackathon der MskDotNet Community findet in unserem Büro statt. Der Kampf um Tatooine ist in vollem Gange, diesmal in unserer Galaxie. Samstag 20 Teams. Pizza Alles ist sehr aufrichtig ( Beweise ). Aufblasbares R2-D2 ragt um die Halle herum. Die Teams schreiben die korrektesten Algorithmen, um das gefährlichste Rennen auf der Karte zu bestehen. Wir verschieben den Start der ersten Rennen. Kekse und Kaffee sparen. Die Organisatoren und ich erwarteten, dass am Samstag viele nach dem Abendessen abreisen würden. Aber nein. 12 Stunden Codierung dahinter. Das Finale. Etwas fällt ab, etwas startet nicht. Aber alle sind glücklich. Unser Team gewinnt. Wir sind doppelt glücklich.

Ich teile meine Freude an Slack und die Idee kommt mir in den Sinn: "Wir müssen unseren eigenen Hackathon machen." Ich schreibe an unsere Tankstelle Sasha. Die Stille.

Morgen Ich trinke Kaffee im Büro. Ich sehe Sasha von hinten kommen. „Lisa, das ist großartig! Wir haben einen wichtigen Termin am 21. April. Lass es uns tun! " WTF !? So schnell? Huh? Was? Ich muss Mitte April für ein Praktikum nach Syktyvkar fliegen. Ja und zur Hölle mit ihm! Komm schon.

Bleibt 2 Wochen. Ich war nie der einzige Organisator eines Hackathons. Lass es intern sein. Ich habe Artikel zu diesem Thema gelesen. Zinn. Es dauert einige Monate. Brauche ein paar Leute. Es ist notwendig, über das Merch, die Preise, die Bedingungen, den Zeitplan, das Interesse, das Ziel und die Budgets nachzudenken. Oder vielleicht sogar den Sinn des Lebens herausfinden. Ich werde definitiv keine Zeit haben. Und während Sie lesen und vorbereiten, ist eine Woche vergangen. Es ist Zeit, Artikel zu punkten und etwas zu tun.

Lesen Sie unsere 1-wöchige interne Hackathon-Checkliste
  • Planen : Setzen Sie sich ruhig hin und schreiben Sie eine Liste, was für den Hackathon getan werden muss. 30 Minuten
  • Ziel : Die Teilnehmer selbst schlagen die Projekte vor und wählen sie aus, die sie in Google Sheets erstellen möchten. Hintergrundaufgabe, 2 Stunden .
  • Zeitplan : Auf dem Knie schreiben Sie eine kurze zeitliche Aufschlüsselung unter Berücksichtigung von 3 Pausen und dem Finale. 20 Minuten
  • Teams : Sie veröffentlichen eine Nachricht über den Hackathon mit dem Zeitplan von der Tankstelle in den IT-Kanälen in Slack / mail / etc und erstellen einen separaten Kanal für den Hackathon. Darin ist jeder in Teams aufgeteilt und unentschlossen in den ersten 5 Minuten des Hackathons. Hintergrundaufgabe, 2 Stunden .
  • Pluspunkte : Sie entwickeln einen Merch mit zwei Entwicklern, geben dem Designer ein Rendering und machen sich bereit. Hintergrundaufgabe, 3 Tage .
  • Hackathon : Sie kommen ins Büro, koordinieren alles am Anfang, gehen Ihrem Geschäft nach, lesen Reddit, informieren jede Pause über frische Pizza, machen ein Foto vom Sonnenuntergang, verkünden das Finale, stimmen gemeinsam ab und wählen den Gewinner. 1 Tag
  • Unter dem Sternchen : Natürlich denken Sie ständig, dass alles gut gelaufen ist. Natürlich wird nicht jeder Ihre Nachricht sehen und es ist besser, mit einigen persönlich zu sprechen. Wenn dir jemand hilft, wird natürlich alles zweimal einfacher (die wundervolle Alena hat mir geholfen).


Der weniger langweilige Teil über das Hackathon-Datum


Warum 21. April? Dieser Tag ist für uns von Bedeutung. Vor genau einem Jahr, am 21. April, fielen wir am ersten Wochenende nach dem Start der Bundeswerbekampagne unter Last. Am nächsten Tag, Sonntag, war unser Team ab 8 Uhr morgens bei der Arbeit. Dann haben wir in Trello ein Sonntagshackathon-Board erstellt und eine Schichtwoche von 12 Stunden am Tag begonnen. Die Situation war so kritisch, dass wir nicht einmal Zeit zum Essen hatten und von Jungs aus anderen Teams gefüttert wurden.



Eine ausführlichere Geschichte finden Sie auf der Seite von Fedor Ovchinnikov (unserem CEO). Seitdem haben wir uns sehr verändert, aber jetzt werden wir das Datum definitiv nicht vergessen.

In diesem Jahr haben wir beschlossen, dieses Ereignis in Erinnerung an die Nachwelt zu verewigen, und nach bester Tradition haben wir den ersten internen Hackathon in der Geschichte von Dodo organisiert, der 10 Stunden dauerte.

Der langweiligste Teil über Hackathon-Projekte


Haftungsausschluss: Alle Beschreibungen wurden von den Jungs selbst geschrieben, daher liegt die Urheberschaft des Textes nicht bei mir.

Oleg Lörning (Autos lörning)


Dima Kochnev, Sasha Andronov (@alexandronov)

Sie wollten ein neuronales Netzwerk erstellen, das ohne Wissen bestimmt, welche Art von Pizza auf dem Foto zu sehen ist. Als Ergebnis haben sie eine sehr einfache und spielerische gemacht - sie erkennt 10 Pizzen, hat herausgefunden, wie alles funktioniert, wie viel es an einem Tag möglich ist (~ 10 Stunden).



Insbesondere haben wir festgestellt, dass die Branche den Punkt erreicht hat, an dem ein gewöhnlicher Entwickler vorgefertigte Bibliotheken nehmen, Dokumentationen lesen und sein neuronales Netzwerk trainieren kann, ohne das Thema genau zu kennen. Und es wird gut genug funktionieren, um echte Probleme zu lösen.

Verwendete Tools:
  • imageai ist eine praktische und einfache Bibliothek für die Arbeit mit maschinellem Lernen und Computer Vision.
  • Zwei Modelle haben es versucht - ResNet50, Yolo.
  • Der Code wurde natürlich in Python geschrieben.

Wir hatten 11.000 Fotos, aber fast 3/4 davon erwiesen sich als Müll, und die übrigen zeigten unterschiedliche, unangemessene Blickwinkel. Als Ergebnis haben wir das fertige Modell genommen (das nur weiß, wie man Pizza findet) und mit seiner Hilfe den meisten Müll getrennt. Im Namen des Fotos stand außerdem der Name Pizza - so haben wir sie in Ordner gelegt, aber es stellte sich heraus, dass die Namen nicht mit der Realität übereinstimmten und wir sie mit unseren Händen aufräumen mussten. Infolgedessen blieben etwa 500 bis 600 Fotos übrig. Es ist klar, dass dies eine unbedeutende Menge ist, aber es stellte sich heraus, dass dies ausreichte, um 10 Pizzen voneinander zu trennen.

Um das Netz zu trainieren, nahmen sie die billigste virtuelle Maschine in Azure auf dem NVIDIA Tesla K80. Es wurde in 100 Epochen trainiert, aber es war klar, dass das Netzwerk nach 50 Epochen übersättigt war, da es einen kleinen Datensatz gab.

Eigentlich - das ganze Problem ist der Mangel an guten Daten.



Wir haben uns vielleicht ein wenig verwechselt, aber wir müssen bedenken, dass wir im Allgemeinen keine Erfahrung in der Arbeit mit all diesen Angelegenheiten haben.

GUI für NOOBS (Konsole zum Bestellen von Pizza)


Mischa Kumatschow ( Ceridan ), Zhenya Bikkinin, Zhenya Vasiliev

Wir haben einen Prototyp einer Konsolenanwendung für Geeks zusammengestellt, mit der Sie Pizza über das Terminal oder die Befehlszeile bestellen oder sogar in die Bereitstellungspipeline integrieren und mit einer erfolgreichen Version Pizza ins Büro liefern können.



Die Arbeit gliederte sich in mehrere Teile: Wir haben die Anordnung unserer API für mobile Anwendungen sortiert, unsere eigene CLI mit oclif zusammengestellt und die Veröffentlichung des von uns zusammengestellten Pakets eingerichtet. Die letzte Aufgabe war mit mehreren unangenehmen Minuten gegen Ende des Hackathons verbunden. Alles funktionierte für uns vor Ort und sogar die alten veröffentlichten Versionen des Pakets funktionierten, aber die neuen (in denen coolere Funktionen und Emoticons hinzugefügt wurden) weigerten sich zu funktionieren. Wir haben 40 Minuten damit verbracht herauszufinden, was schief gelaufen ist, aber am Ende hat alles magisch funktioniert.

Unser maximales Hackathon-Programm war eine echte Pizza-Bestellung über unsere CLI im Büro. Wir sind alles ein Dutzend Mal auf dem Prüfstand gefahren, aber meine Hände zitterten immer noch, als ich Teams auf dem Prod erzielte.



Als Ergebnis - wir haben es immer noch getan!



Kurier gehen


Anton Bruzhmelyov (Autor), Vanya Zverev, Gleb Lesnikov ( Entropie ), Andrey Sarafanov

Wir haben die Idee der "Bewerbung für den Kurier" übernommen.

Hintergrund zur Vorbereitung.
Anfangs habe ich herausgefunden, aber welche Funktionen können in der Anwendung enthalten sein? So etwas erschien:
  • Die Anwendung meldet sich per Code am Kassenschalter an.
  • Die Anwendung zeigt sofort die verfügbaren Bestellungen an, die Sie benötigen, um Bestellungen entgegenzunehmen.
  • Der Kurier nimmt die Bestellung zur Kenntnis und nimmt die Reise auf.
  • Ihm wird die geschätzte Zeit angezeigt und er hat Zeit oder nicht.
  • Der Kunde zeigt, dass der Kurier gegangen ist.
  • Der Kunde beginnt, den Kurierpunkt auf der Karte und die geschätzte Zeit anzuzeigen.
  • Der Kurier kann in einem Chat über die Anwendung an den Kunden schreiben.
  • Der Kunde kann einen Kurier schreiben, um über die Anwendung zu chatten.
  • Fünf Minuten vor der Ankunft erhält der Kunde eine Nachricht, dass der Kurier in der Nähe ist. Machen Sie sich bereit.
  • Der Kurier notiert in der App, dass er vorfuhr und wartete.
  • Der Kurier ruft mit einem Klick aus der Anwendung an und meldet dies (er steht auf, geht auf usw.)
  • Der Kunde nimmt die Bestellung an und gibt einen PIN-Code aus dem Antrag oder der SMS ein, um die Lieferung zu bestätigen. (Als Unterschrift) Damit der Kurier die Lieferung nicht im Voraus abschließen kann, wenn er zu spät kommt.
  • Die Bestellung wird im System als geliefert markiert.


Plus ein paar alternative Szenarien:
  • Der Kurier kann die Bestellung als unzustellbar markieren und einen Grund auswählen.
  • Kurier, wenn Sie zu spät kommen, können Sie ein elektronisches Ein-Knopf-Zertifikat per SMS ausstellen. Oder das Zertifikat kommt automatisch, wenn die Lieferzeit nicht eingehalten wird.

Das Gefühl des Versprechens und der Notwendigkeit für dieses Projekt hat sicherlich zugenommen.

Am nächsten Tag gingen wir mit dem Team zum Mittagessen und diskutierten, wie die minimale Funktionalität der Anwendung aussehen würde.

Als Ergebnis wurde die folgende Liste erstellt, was beim Hackathon zu tun war:
  • Melden Sie sich an der Kasse der Lieferung an.
  • Aktuelle Position anzeigen.
  • Senden Sie Daten an eine externe API (Koordinaten, nahm die Bestellung auf, lieferte die Bestellung).
  • Holen Sie sich Daten von externen API (aktuelle Kurierbestellungen).
  • Senden Sie eine Veranstaltung, bei der ich einen Lieferauftrag angenommen / geliefert habe.
  • Zeigen Sie die aktuelle Position des Kuriers auf einer Karte auf der Website an.

Aus meiner Sicht bestand die Hauptarbeit darin , das Backend, die Anwendung selbst, zu erstellen (nach Diskussionen haben wir ReactNative für die Entwicklung der Anwendung ausgewählt oder vielmehr über - expo.io gebunden , sodass Sie überhaupt keinen nativen Code schreiben können). In Bezug auf das Backend gab es zunächst Hoffnung für Vanya Zverev, die Erfahrung in der Arbeit mit unserer Service-Vorlage und k8s hat (welche Art von Arbeit er selbst übernommen hat). ReactNative nahm mich und Andrei Sarafanov mit.

Ich habe mich entschlossen, sofort ein funktionierendes Repository für das Projekt selbst zu erstellen. Um 12 Uhr nachts stieß ich auf die Tatsache, dass die Geolokalisierung im Hintergrund in ReactNative nicht gut funktionierte. Wenn Sie den nativen Code nicht geschrieben haben, war ich ein wenig frustriert. Dann wurde es veröffentlicht, als mir klar wurde, dass ich die Dokumentation nicht des expo.io-Frameworks, sondern von ReactNative las. Infolgedessen war mir im Laufe des Abends bereits klar, wie ich die aktuelle Position in expo.io ermitteln und separate Bildschirme zeichnen kann (für Login, Auftragsanzeige usw.).



Am Morgen des Hackathons wurde Gleb in sein vielversprechendes Projekt hineingezogen. Sie legten schnell einen Plan vor, was zu tun ist.



Sie haben einen Fehler gemacht, als sie gemäß der Projektvorlage versuchten, die Kommunikation nicht über HTTP, sondern über GRPC herzustellen, da niemand wusste, wie man einen GRPC-Client für JavaScript erstellt. Nachdem sie ungefähr anderthalb Stunden damit verbracht hatten, gaben sie diese Idee auf. Aus diesem Grund begannen die Jungs und auf der Rückseite, den fertigen Server von GRPC auf WebApi zu wiederholen. Nach einer halben Stunde konnten wir endlich die Kommunikation der Anwendung mit dem Backend konfigurieren. Gleichzeitig beendete Gleb den Einsatz in k8s und plus Auto-Deed fast, indem er sich zum Master verpflichtete. :) :)

Als Repository haben wir MySQL gewählt, um nicht einmal die Basis zu gefährden (es gab Gedanken zu CosmosDb).



Zusammenfassend:

  • Das Speichern der aktuellen Kurierkoordinaten aus der Anwendung in der Datenbank wurde implementiert.
  • Sie schraubten RabbitMQ und abonnierten Nachrichten über den Kurier, der die Bestellung entgegennahm, um die Bestellung des Kuriers sofort in der Anwendung anzuzeigen.
  • Wir begannen Zeit für die Lieferung der Bestellung an unsere Datenbank zu sparen, nachdem der Kurier auf eine Schaltfläche in der Anwendung geklickt hatte. Wir hatten keine Zeit, das Ereignis an das Rebbit zurückzusenden, um anzuzeigen, dass die Bestellung geliefert wurde.
  • Ich habe auf der aktuellen Bestellseite auf der Website eine Kartenanzeige mit der aktuellen Kurierposition erstellt. Diese Funktionalität blieb jedoch etwas unvollendet, da die Umgebung CORS nicht so konfigurieren konnte, dass die Koordinaten von unserem neuen Service abgerufen werden.

M87


Roma Bukin, Gosha Polevoy ( Georgepolevoy ), Artyom Trofimushkin

Wir wollten den OpenID Connect-Anbieter implementieren, da wir derzeit ein eigenes Authentifizierungsprotokoll verwenden. Dies führt zu einer Reihe von Schwierigkeiten: benutzerdefinierte Clientbibliotheken, unbequeme Arbeit von externen Partnern und möglicherweise Sicherheitsprobleme (schließlich OAuth2.0 und OpenID Connect) in der Referenz Implementierung kann als sicher angesehen werden, aber was unsere Lösung betrifft - ich bin nicht sicher).



Wir haben einen separaten Dienst erstellt, der einen Dienst zur Speicherung personenbezogener Daten emuliert, um ein kleines Modell des länderunabhängigen Authentifizierungsanbieters zu erstellen, das zu einem separaten Dienst für personenbezogene Daten wechselt (dies würde es in Zukunft ermöglichen, einen Dienst zu haben, bei dem Sie sich mit Ihrem Konto anmelden können in jedem Land aufzeichnen und gleichzeitig die DSGVO und andere Bundesgesetze einhalten). Wir haben diesen Teil wie der Anbieter ausgeführt und sie erfolgreich miteinander verknüpft. Als Nächstes mussten wir eine API erstellen, die durch vom Anbieter ausgestellte Token geschützt ist, deren Selbstbeobachtung durch den Anbieter unterstützt und geschützte Daten sendet, wenn die Anforderung den Autorisierungsrichtlinien entspricht (wir überprüfen, ob der Benutzer mithilfe des Bearer-Schemas authentifiziert ist und sein Token einen bestimmten Bereich + enthält Der Benutzer selbst verfügt über Berechtigungen, mit denen der Anruf getätigt werden kann. Dieser Teil wurde ebenfalls abgeschlossen. Die letzte Komponente war ein JavaScript-Client, dem ein Token ausgestellt wurde, mit dem eine sichere API aufgerufen wurde. Wir haben es nicht geschafft, diesen Teil zu machen. Das heißt, der gesamte Funktionsteil war bereit, aber der Front-End-Teil war nicht bereit, die Funktionsfähigkeit des gesamten Systems zu demonstrieren.

Äh (igruha)


Dima Afonchenko, Sasha Konovalov

Wir haben ein Minispielzeug für ein kleines gemacht, bei dem verspielte Griffe Wurst auf Pizza legen. Wenn Sie die Wurst falsch geworfen haben, wird auf dem Bildschirm die traurige Meldung „Abgelehnt“ angezeigt. Wenn die gesamte Wurst richtig geworfen wird, wird eine zufällige Tatsache über Pizza angezeigt.



Sie wollten das zweite Level mit einem Aufstrich Tomaten machen, hatten aber keine Zeit.



Kurze Fortsetzung: Wer hat gewonnen?


Vor dem Hackathon haben wir mit den Jungs gesprochen und ich habe gefragt, welchen Preis sie erhalten möchten, wenn sie gewinnen. Es stellte sich heraus, dass der Weg zum Essen der wertvollste Preis sein würde.



Erwarten Sie daher bald von uns die Ankündigung des Spiels mit Griffen, die Peperoni auf Pizza belegen.

Wie ein aufmerksamer Leser feststellen konnte, gewann das Team „E-E-E (igruha)“. Herzlichen Glückwunsch Jungs!

Source: https://habr.com/ru/post/de449344/


All Articles