Pozdrav, Habr. Spontano smo organizirali naš prvi unutarnji hackathon. Odlučila sam podijeliti s vama svoje bolne točke i zaključke o pripremama koje su trajale 2 tjedna, kao i projektima koji su proizašli iz toga.

Dosadna tema za one koje zanimaju marketing.
Započet ću s malom pričom.
Početak travnja. U našem uredu održava se prvi hackathon MskDotNet Community. Bitka za Tatooine je u punom jeku, u našoj galaksiji ovaj put. Subota. 20 timova. Pizza. Sve je vrlo opušteno (). Napuhani R2-D2 pojavljuje se po dvorani. Timi pišu najbolje algoritme kako bi prošli najopasniju utrku na karti. Pomjeramo početak prvih utrka. Keksi i kava spašavaju situaciju. S organizatorima smo očekivali da će mnogi otići nakon ručka u subotu. No, ne. 12 sati kodiranja je iza nas. Finale. Nešto se raspada, nešto ne radi. No, svi su sretni. Pobjeđuje naš tim. Sretni smo dvostruko.
Dijelim radost na Slacku i u glavi mi pada ideja: "Moramo napraviti svoj hackathon". Pišem našem CTO-u Sashi. Tišina.
Jutro. Pijem kavu u uredu. Vidim kako se Sashha približava sa stražnje strane. "Liza, to je odlično! Baš imamo važan datum 21. travnja. Idemo raditi!" Što? Tako brzo? A? Što? Moram odletjeti u Syktyvkar na praksu sredinom travnja. A neka, ajmo.
Ostalo je 2 tjedna. Nikada nisam bila glavni organizator hackathona. Čak ni unutarnjeg. Čitam članke na tu temu. Užas. Trebaju nekoliko mjeseci. Treba nekoliko osoba. Treba razmisliti o merču, nagradama, uvjetima, rasporedu, zainteresirati, razumjeti cilj, budžete. Možda čak i dublje razmisliti o smislu života. Sigurno neću uspjeti. I dok si čitao i pripremao se, prošao je već tjedan. Najbolje je zaboraviti na članke i početi raditi na nečemu.
Evo našeg checklista za organizaciju unutarnjeg hackathona u 1 tjednu
- Plan: uspokojeno sjediš i pišeš popis onoga što je potrebno učiniti za hackathon. 30 minuta.
- Zadatak: sudionici sami predlažu i biraju projekte koje žele stvoriti u Google Sheets. Pozadinska zadaća, 2 sata.
- Raspored: na brzinu pišeš kratku vremensku podjelu uzimajući u obzir 3 pauze i finale. 20 minuta.
- Naredbe: objavljuješ poruku o hackathonu s rasporedom od CTO-a u IT-kanalima na Slacku/pošti/itd. i stvaraš poseban kanal za hackathon. U njemu se svi raspoređuju u timove, a oni koji nisu odlučili to rade u prvih 5 minuta hackathona. Pozadinska zadaća, 2 sata.
- Prednosti: zamišljaš merch s dva developera, predaješ dizajneru na izradu, dobivaš gotov proizvod. Pozadinska zadaća, 3 dana.
- Hackathon: dolaziš u ured, koordiniraš sve na početku, baviš se svojim poslovima, čitaš Reddit, s važnim izrazom lica svakih prekovremenih minuta javljaš o svježoj pizzi, fotografiraš zalazak sunca, objavljuješ finale, zajedno glasate i birate pobjednika. 1 dan.
- Pod zvjezdicom: naravno, stalno razmišljaš o tome da sve prođe dobro. Naravno, ne vide svi tvoju poruku i s nekima je bolje razgovarati uživo. Naravno, ako ti netko pomaže, sve postaje dvostruko lakše (pomagala mi je divna Aljona).
Manje dosadni dio o datumu hackathona
Zašto 21. travnja? Taj dan nam je značajan. Točno godinu dana ranije, 21. travnja, pali smo pod opterećenjem tijekom prvih vikenda nakon početka Federalne Reklamne Kampanje. Sutradan, u nedjelju, naš tim bio je na poslu od 8 ujutro. Tada smo stvorili u Trellu ploču sundayhackathon i započela je tjedan smjenovnog rada od 12 sati dnevno. Situacija je bila toliko kritična da nismo imali vremena ni za jelo i dečki iz drugih timova su nas hranili.

Detaljniju priču možete pročitati na (našeg CEO-a). Od tada, puno smo promijenili, ali ovu ćemo datumu sada sigurno zapamtiti.
Ove godine odlučili smo da je ovaj događaj vrijedno zauvijek zabilježiti i u najboljim tradicijama organizirali smo prvi u povijesti Додо interna hackathon, koji je trajao 10 sati.
Najmanje dosadni dio o projektima hackathona
Izjava: sve opise pisali su sami dečki, tako da autorstvo teksta nije moje.
Oleg Ljörning (strojno učenje)
Dima Kočneve, Saša Andronov (@alexandronov)
Željeli su napraviti neuralnu mrežu koja će prepoznati koja je pizza na fotografiji bez ikakvog predznanja. Na kraju su napravili vrlo jednostavnu i igračka – prepoznaje 10 pica, otprilike su shvatili kako sve funkcionira, koliko je to moguće za jedan dan (~10 sati).

Osobito smo shvatili da je industrija došla do razine kada običan developer može uzeti gotove biblioteke, pročitati dokumentaciju i obučiti svoju neuralnu mrežu bez dubokog poznavanja teme. I da će raditi dovoljno dobro za rješavanje stvarnih problema.
Alati koje smo koristili:
- — praktična i jednostavna knjižnica za rad s umjetničkom inteligencijom i računalnim vidom.
- Isprobali smo dva modela – ResNet50, Yolo.
- Kod smo pisali, jasno je, na Pythonu.
Imali smo 11000 fotografija, ali gotovo 3/4 njih su bile smeće, dok su preostale imale različite, neodgovarajuće kutove. Na kraju smo uzeli gotov model (koji jednostavno može pronaći pizzu) i s njim odvojili najgore. Zatim smo, u nazivima slika, imali nazive pizza — tako smo ih razvrstali po mapama, ali se ispostavilo da se nazivi ne podudaraju s onim što je stvarno, pa smo morali ručno srediti. Na kraju smo imali oko 500-600 slika, što je jasno da je zanemariva količina, ali se ispostavilo da je to dovoljno da razdvojimo 10 pizza jednu od druge.
Za obuku mreže uzeli smo najjeftiniju virtualku na Azureu s NVIDIA Tesla K80. Na njoj smo obučavali u 100 epoha, ali se vidjelo da je mreža prenasićena već nakon 50 epoha, zbog toga što je dataset bio mali.
U stvari — cijeli problem leži u nedostatku dobrih podataka.

Možda smo malo zbrkali u terminima, ali treba uzeti u obzir da nemamo iskustva s ovim stvarima.
GUI for NOOBS (konzola za naručivanje pizze)
Miša Kumačev (), Ženja B ikkinin, Ženja Vasiljev
Sakupili smo prototip konzolne aplikacije za geekove, zahvaljujući kojoj se može naručiti pizza kroz terminal ili naredbenu liniju, ili čak ugraditi u deploy pipeline i prilikom uspješnog izdanja dostaviti pizzu u ured.

Rad je podijeljen na nekoliko dijelova: proučavali smo kako je naš API za mobilne aplikacije, skupili svoj CLI pomoću i podešavali objavljivanje paketa koji smo sami napravili. S posljednjim zadatkom bilo je nekoliko neugodnih minuta pred kraj hackathona. Sve je radilo lokalno i čak su radile stare objavljene verzije paketa, ali nove (u kojima su dodane super nove funkcije i emotikoni) su odbijale raditi. Potrošili smo oko 40 minuta pokušavajući shvatiti što nije u redu, ali na kraju je sve čarobno počelo raditi).
Naš maksimalni cilj na hackathonu bio je pravi narudžba pizze u ured preko našeg CLI. Desetak puta smo sve testirali na probnom okruženju, ali mi su se svejedno tresle ruke dok sam unosio naredbe u produkciji.

Na kraju — uspjeli smo u tome!

CourierGo
Anton Bruzhmelёv (autor), Vanja Zverev, Gleb Lesnikov (), Andrej Sarafanov
Uzmili smo ideju "Aplikacija za kurire."
Predistorija o pripremi.Isprva sam razmišljao, koje bi funkcionalnosti mogle biti u aplikaciji? Nastala je otprilike ovakva lista funkcionalnosti:
- Aplikacija se prijavljuje na dostavni kasa putem koda.
- U aplikaciji su odmah vidljivi dostupni narudžbe, narudžbe koje je potrebno preuzeti.
- Kurir označava narudžbu i kreće na put.
- Pokazuje mu se procijenjeno vrijeme i stiže li na vrijeme ili ne.
- Klijentu se pokazuje da je kurir krenuo.
- Klijentu počinje prikazivati točku kurira na karti i procijenjeno vrijeme.
- Kurir može napisati klijentu u chat putem aplikacije.
- Klijent može napisati kuriru u chat putem aplikacije.
- Pet minuta prije dolaska klijent prima poruku da je kurir blizu, budite spremni.
- Kurir označava u aplikaciji da je stigao i čeka.
- Kurir zove iz aplikacije jednim klikom i javlja da (dolazi, stigao itd.)
- Klijent prihvaća narudžbu i unosi PIN kod iz aplikacije ili SMS-a za potvrdu dostave. (kao potpis) Da kurir ne bi mogao završiti dostavu unaprijed, ako se kasni.
- Narudžba se označava u sustavu kao isporučena.
Plus nekoliko alternativnih scenarija:
- Kurir može označiti narudžbu kao nedostavljenu i odabrati razlog.
- Kurir, u slučaju kašnjenja, može jednim pritiskom izdati elektronički certifikat putem SMS-a. Ili certifikat dolazi automatski pri nepoštivanju roka isporuke.
Osjećaj perspektivnosti i korisnosti ovog projekta, svakako je bio motivirajući.
Sljedeći dan smo otišli na ručak s timom i razgovarali o tome kako će izgledati minimalna funkcionalnost aplikacije.
Na kraju je nastala sljedeća lista onoga što je trebalo stići napraviti na hackathonu:
- Prijava na dostavnu kasu.
- Prikaz trenutne lokacije.
- Slanje podataka vanjskom API-ju (koordinate, preuzeo narudžbu, dostavio narudžbu).
- Dobiti podatke iz vanjskog API-ja (trenutne narudžbe kurira).
- Poslati događaj kako je preuzeo narudžbu za dostavu/dostavio.
- Prikazati trenutnu lokaciju kurira na karti na webu.
Glavni posao, kako se činilo, trebao je biti u stvaranju backenda, same aplikacije (nakon rasprava odlučeno je koristiti ReactNative za razvoj aplikacije, točnije obavijest iznad njega — , koji omogućuje da se uopće ne piše nativni kod). Na backendu se isprva nadalo u Vanu Zvereva, kao iskusnog u radu s našom uslugom i k8s (koju je i preuzeo na sebe). ReactNative smo uzeli da probamo Andrzej i ja.
Odlučio sam odmah kreirati radni repozitorij za sam projekt. U 12 navečer sam naišao na problem da geolokacija slabo radi u ReactNativeu u pozadini, ako ne pišem nativni kod, malo sam se frustrirao. Kasnije mi je olakšalo kada sam shvatio da čitam dokumentaciju ne za expo.io framework, već za ReactNative. Na kraju, tijekom večeri sam već shvatio kako dobiti trenutnu lokaciju u expo.io i izraditi odvojene ekrane (za prijavu, prikaz narudžbe itd.).

Jutros nas je na hackathonu zainteresirao Gleb za svoj izuzetno perspektivan projekt. Brzo smo skicirali plan onoga što treba napraviti.

Napravili smo grešku kada smo, prema šablonu projekta, pokušali komunikaciju ostvariti ne putem HTTP-a, već putem GRPC-a, jer nitko nije znao sastaviti GRPC klijenta za JavaScript. Na kraju, potroživši otprilike sat i pol na to, odustali smo od te ideje. Zbog toga su dečki na backendu počeli ponovno raditi gotovi server s GRPC na WebApi. Nakon pola sata, konačno smo uspjeli postaviti komunikaciju aplikacije s backendom, o čudo. No u to isto vrijeme Gleb je gotovo završio deployment u k8s, uz automatski deployment po commitima u master. 🙂
Kao skladište odabrali smo MySQL kako bismo barem izbjegli rizik s bazom (bile su misli o CosmosDb-u).

Na kraju:
- Implementirali smo spremanje trenutnih koordinata dostavljača iz aplikacije u bazu.
- Povezali smo RabbitMQ i pretplatili se na poruke o preuzimanju narudžbe od strane dostavljača, kako bismo odmah prikazali narudžbu kod dostavljača u aplikaciji.
- Počeli smo spremati u bazu vrijeme isporuke narudžbe, nakon što je dostavljač pritisnuo dugme u aplikaciji. Nismo uspjeli dodati slanje događaja natrag u RabbitMQ o tome da je narudžba isporučena.
- Izradio sam prikaz karte na stranici currentorder na webu s trenutnim položajem dostavljača. No, ta funkcionalnost je ostala malo nedovršena, jer u okruženju nismo uspjeli postaviti CORS za dobivanje koordinata iz naše nove usluge.
M87
Roma Bukin, Goša Polevoj (), Artyom Trofimushkin
Željeli smo implementirati OpenID Connect pružatelja, budući da trenutno koristimo protokol autentifikacije vlastite izrade, što stvara niz poteškoća: prilagođene klijentske biblioteke, teškoće u radu s vanjskim partnerima, moguće sigurnosne probleme (u svakom slučaju, OAuth2.0 i OpenID Connect u referentnoj implementaciji smatramo sigurnima, a za naše rješenje – nisam siguran).

Napravili smo poseban servis koji emulira servis za pohranu osobnih podataka kako bismo stvorili malu modelu Country-Agnostic pružatelja autentifikacije koji bi tražio osobne podatke u zasebnom servisu (to bi u budućnosti omogućilo jedan servis putem kojeg bi se moglo prijaviti s računom u bilo kojoj zemlji, pri čemu bi se ispunjavali GDPR i drugi zakoni). Tu smo komponentu povezali s pružateljem. Sljedeće je bilo napraviti API koji bi bio zaštićen tokenima koje pruža pružatelj, podržavati njihovu introspekciju putem pružatelja i davati zaštićene podatke ako bi zahtjev ispunio politike autorizacije (provjeravamo je li korisnik autentificiran prema Bearer shemi, da njegov token sadrži određeni opseg + da sam korisnik ima dozvolu koja dopušta izvršenje poziva). Ova komponenta je također dovršena. Posljednji komponent je bio JavaScript klijent koji bi dobio token kojim bi pozivao zaštićeni API. Ovu smo komponentu nažalost uspjeli završiti. Dakle, cijela funkcionalna komponenta bila je spremna, ali front-end dio za demonstraciju funkcioniranja cijelog sustava nije bio dovršen.
E-E-E (igrica)
Dima Afončenko, Saša Konovalov
Napravili smo mini igricu na Unityju gdje brze ruke bacaju kobasicu na pizzu. Ako ne baciš kobasicu ispravno, na ekranu se pojavljuje tužna poruka 'Odbijeno', a ako je cijela kobasica ispravno bačena, pojavljuje se slučajna činjenica o pizzi.

Htjeli smo napraviti drugi nivo s bacanjem rajčica, ali nismo uspjeli.

Kratko nastavak: tko je pobijedio?
Prije hackathona razgovarali smo s dečkima i pitala sam ih koji bi nagradu željeli dobiti ako pobijede. Ispostavilo se da bi najvrjednija nagrada bila 'put u produkciju'.

Stoga, uskoro očekujte od nas najavu igre s ručicama koje dodaju peperoni na pizzu.
Kao što je primijetio pažljivi čitatelj, pobijedila je ekipa „E-E-E (igra)“. Čestitamo dečkima!
Samo registrirani korisnici mogu sudjelovati u anketi. , molimo.
Koji vam je projekt najviše svidio?
Oleg Ljörning (strojno učenje)
GUI za NOOBS
CourierGo
M87
E-E-E
Glasalo je 5 korisnika. 3 korisnika su se suzdržala.
Izvor: habr.com
