Përshëndetje, Habr. Së fundi organizuam spontanisht hackathon-in tonë të parë të brendshëm. Vendosa të ndaj me ju vështirësitë dhe përfundimet e mia rreth përgatitjes së tij brenda 2 javësh, si edhe projektet që dolën prej tij.

Pjesa e mërzitshme për ata që interesohen për marketingun
Do ta nis me një histori të shkurtër.
Fillimi i prillit. Në zyrën tonë po zhvillohet hackathon-i i parë i MskDotNet Community. Beteja për Tatooine është në kulm, këtë herë në galaktikën tonë. E shtunë. 20 ekipe. Pica. Gjithçka është shumë e ngrohtë e miqësore (). R2-D2 i fryrë shfaqet nëpër sallë. Ekipet shkruajnë algoritmet më të sakta për të kaluar garën më të rrezikshme në hartë. E shtyjmë nisjen e xhirove të para. Biskotat dhe kafeja na shpëtojnë. Unë dhe organizatorët prisnim që të shtunën shumë veta të largoheshin pas drekës. Por jo. 12 orë kodim kanë mbetur pas. Finalja. Diçka shkëputet, diçka nuk nis. Por të gjithë janë të lumtur. Fiton ekipi ynë. Ne jemi dyfish të lumtur.
E ndaj gëzimin në Slack dhe më lind një ide: «Duhet të bëjmë hackathon-in tonë». I shkruaj CTO-së tonë, Sashës. Heshtje.
MĂ«ngjes. Po pi kafe nĂ« zyrĂ«. Shoh SashĂ«n qĂ« po afrohet nga pas shpine. «Liza, kjo Ă«shtĂ« fantastike! PikĂ«risht mĂ« 21 prill kemi njĂ« datĂ« tĂ« rĂ«ndĂ«sishme. Hajde ta bĂ«jmĂ«!» WTF!? Kaq shpejt? A? ĂfarĂ«? MĂ« duhet tĂ« fluturoj pĂ«r nĂ« Syktyvkar pĂ«r praktikĂ« nĂ« mes tĂ« prillit. Po nĂ« djall tĂ« vejĂ«! Hajde.
KanĂ« mbetur 2 javĂ«. Nuk kam qenĂ« kurrĂ« organizatorja e vetme e njĂ« hackathoni. Edhe nĂ«se Ă«shtĂ« i brendshĂ«m. Lexoj artikuj pĂ«r kĂ«tĂ« temĂ«. E tmerrshme. Duhen disa muaj. Duhen disa njerĂ«z. Duhet tĂ« mendosh pĂ«r merch, çmimet, kushtet, programin, tĂ« ngjallĂ«sh interes, tĂ« kuptosh qĂ«llimin, buxhetet. Ndoshta madje edhe tĂ« sqarosh kuptimin e jetĂ«s. UnĂ« me siguri nuk do tâia dal. Dhe ndĂ«rkohĂ« qĂ« ti lexoje e pĂ«rgatiteshe, tashmĂ« ka kaluar njĂ« javĂ«. ĂshtĂ« koha ideale tâi lĂ«sh mĂ«njanĂ« artikujt dhe tĂ« fillosh tĂ« bĂ«sh diçka.
Ja checklist-i ynë për organizimin e një hackathoni të brendshëm në 1 javë
- Plani: ulesh qetësisht dhe shkruan listën e gjërave që duhen bërë për hackathon-in. 30 minuta.
- Detyra: pjesëmarrësit vetë propozojnë dhe zgjedhin projektet që duan të krijojnë në Google Sheets. Detyrë në sfond, 2 orë.
- Programi: me mjete minimale shkruan një ndarje të shkurtër të kohës duke marrë parasysh 3 pushime dhe finalen. 20 minuta.
- Komandat: publikon një njoftim për hackathon-in me programin nga CTO në kanalet IT në Slack/postë/etc dhe krijon një kanal të veçantë për hackathon-in. Aty të gjithë ndahen në ekipe, ndërsa ata që nuk janë përcaktuar e bëjnë këtë në 5 minutat e para të hackathon-it. Detyrë në sfond, 2 orë.
- Përfitime: mendon merchandise me dy zhvillues, ia kalon dizajnerit për ta vizatuar dhe e merr gati. Detyrë në sfond, 3 ditë.
- Hackathon: vjen në zyrë, koordinon të gjithë në fillim, merresh me punët e tua, lexon Reddit, në çdo pushim njofton me rëndësi për picën e freskët, fotografon perëndimin, shpall finalen, pastaj votoni së bashku dhe zgjidhni fituesin. 1 ditë.
- Pjesa me yllth: sigurisht, mendon vazhdimisht që gjithçka të shkojë mirë. Sigurisht, jo të gjithë do ta shohin mesazhin tënd dhe me disa është më mirë të flasësh personalisht. Sigurisht, nëse dikush të ndihmon, gjithçka bëhet 2 herë më e lehtë (mua më ndihmoi Aljona e mrekullueshme).
Pjesa më pak e mërzitshme për datën e hackathon-it
Pse 21 prilli? Kjo ditë ka rëndësi të veçantë për ne. Pikërisht një vit më parë, më 21 prill, sistemi ynë ra nën ngarkesë gjatë fundjavës së parë pas nisjes së Fushatës Federale të Reklamimit. Të nesërmen, të dielën, ekipi ynë ishte në punë që nga ora 8 e mëngjesit. Atëherë krijuam në Trello tabelën sundayhackathon dhe nisi një javë pune me turne prej 12 orësh në ditë. Situata ishte aq kritike, sa nuk kishim kohë as të hanim dhe djemtë nga ekipet e tjera na sillnin diçka për të ngrënë.

Një rrëfim më i detajuar mund ta lexoni në (CEO-së tonë). Që atëherë kemi ndryshuar shumë gjëra, por këtë datë tani me siguri nuk do ta harrojmë.
Këtë vit vendosëm që kjo ngjarje meriton të përjetësohet në kujtesën e brezave dhe, sipas traditës më të mirë, organizuam hackathon-in e parë të brendshëm në historinë e Dodo-s, i cili zgjati 10 orë.
Pjesa më pak e mërzitshme për projektet e hackathon-it
Disclaimer: të gjitha përshkrimet i kanë shkruar vetë djemtë, ndaj autorësia e tekstit nuk është e imja.
Oleg Learning (machine learning)
Dima Koçnev, Sasha Andronov (@alexandronov)
Donim të bënim një rrjet nervor që të përcaktonte çfarë pice ka në fotografi pa ndonjë njohuri paraprake. Në fund bëmë një version shumë të thjeshtë dhe eksperimental: ai njeh 10 pica, dhe afërsisht kuptuam si funksionon gjithçka, aq sa ishte e mundur për një ditë (~10 orë).

Në veçanti, kuptuam se industria ka arritur në një nivel ku një zhvillues i zakonshëm mund të marrë biblioteka të gatshme, të lexojë dokumentacionin dhe të trajnojë rrjetin e vet nervor pa njohuri të thella të fushës. Dhe ai do të funksionojë mjaft mirë për zgjidhjen e detyrave reale.
Mjetet që u përdorën:
- â njĂ« bibliotekĂ« e pĂ«rshtatshme dhe e thjeshtĂ« pĂ«r punĂ« me machine learning dhe computer vision.
- Provuan dy modele â ResNet50 dhe Yolo.
- Kodin, sigurisht, e shkruam në Python.
Kishim 11.000 foto, por pothuajse 3/4 prej tyre dolĂ«n tĂ« ishin tĂ« pavlefshme, ndĂ«rsa te pjesa e mbetur kishte kĂ«nde tĂ« ndryshme e tĂ« papĂ«rshtatshme. NĂ« fund morĂ«m njĂ« model tĂ« gatshĂ«m (qĂ« thjesht di tĂ« gjejĂ« pica) dhe me ndihmĂ«n e tij hoqĂ«m pjesĂ«n mĂ« problematike. MĂ« pas, nĂ« emrin e fotos ishte emri i picĂ«s â kĂ«shtu i ndamĂ« nĂ«pĂ«r dosje, por doli qĂ« emrat nuk pĂ«rputheshin me pĂ«rmbajtjen reale dhe kĂ«tu na u desh tĂ« pastronim gjithçka manualisht. Si rezultat mbetĂ«n rreth 500â600 foto; Ă«shtĂ« e qartĂ« qĂ« ky Ă«shtĂ« njĂ« numĂ«r shumĂ« i vogĂ«l, por megjithatĂ« mjaftoi pĂ«r tĂ« dalluar 10 pica nga njĂ«ra-tjetra.
Për trajnimin e rrjetit morëm virtual machine më të lirë në Azure me NVIDIA Tesla K80. Aty e trajnuam për 100 epoka, por shihej që rrjeti ishte mbingopur që pas 50 epokash, për shkak të dataset-it të vogël.
Në thelb, i gjithë problemi është mungesa e të dhënave cilësore.

Ndoshta i kemi ngatërruar pak termat, por duhet marrë parasysh se nuk kemi fare përvojë me gjithë këto gjëra.
GUI for NOOBS (konsolë për porositjen e picës)
Misha Kumachyov (), Zhenya Bikkinin, Zhenya Vasiliev
Ndërtuam një prototip të një aplikacioni console për geek-ët, me të cilin mund të porosisësh pica përmes terminalit ose command line, madje edhe ta integrosh në deploy pipeline që pas një release të suksesshëm të dërgohet pica në zyrë.

Puna u nda në disa pjesë: kuptuam si funksionon API ynë për aplikacionet mobile, ndërtuam CLI-në tonë me ndihmën e dhe konfiguruam publikimin e paketës që krijuam. Me detyrën e fundit patëm disa minuta jo fort të këndshme afër fundit të hackathon-it. Gjithçka punonte lokalisht dhe madje funksiononin edhe versionet e vjetra të publikuara të paketës, por të rejat (ku kishim shtuar më shumë veçori të bukura dhe emoji) refuzonin të punonin. Shpenzuam rreth 40 minuta për të kuptuar çfarë kishte shkuar keq, por në fund gjithçka, në mënyrë disi magjike, filloi të punonte vetë).
Objektivi ynë maksimal për hackathon-in ishte një porosi reale pice në zyrë përmes CLI-së sonë. E testuam gjithçka dhjetëra herë në mjedisin e testimit, por prapëseprapë më dridheshin duart kur po shkruaja komandat në production.

Në fund, ia dolëm vërtet!

CourierGo
Anton Bruzhmelyov (autor), Vanya Zverev, Gleb Lesnikov (), Andrey Sarafanov
Morëm idenë «Aplikacion për korrierin».
Pak histori rreth përgatitjes.Fillimisht mendova se çfarë funksionesh mund të kishte në përgjithësi aplikacioni. Doli afërsisht kjo listë funksionalitetesh:
- Aplikacioni hyn në sistemin e arkës së dërgesave me kod.
- Në aplikacion shihen menjëherë porositë e disponueshme, pra porositë që duhen marrë.
- Korrieri e shënon porosinë dhe e merr për dorëzim.
- I shfaqet koha e parashikuar dhe nëse do t'ia dalë apo jo.
- Klientit i shfaqet që korrieri është nisur.
- Klientit fillon tâi shfaqet pika e korrierit nĂ« hartĂ« dhe koha e parashikuar.
- Korrieri mund tâi shkruajĂ« klientit nĂ« chat nga aplikacioni.
- Klienti mund tâi shkruajĂ« korrierit nĂ« chat nga aplikacioni.
- Pesë minuta para mbërritjes, klientit i vjen një mesazh se korrieri është afër, ju lutem bëhuni gati.
- Korrieri e shënon në aplikacion që ka mbërritur dhe po pret.
- Korrieri telefonon nga aplikacioni me një klikim dhe njofton se (po ngjitet lart, ka mbërritur te dera etj.)
- Klienti e pranon porosinë dhe vendos PIN-in nga aplikacioni ose nga SMS për të konfirmuar dorëzimin. (si nënshkrim) Që korrieri të mos mund ta përfundojë dorëzimin para kohe, nëse është me vonesë.
- Porosia shënohet në sistem si e dorëzuar.
Plus disa skenarë alternativë:
- Korrieri mund ta shënojë porosinë si të padorëzuar dhe të zgjedhë arsyen.
- Në rast vonese, korrieri mund të lëshojë me një buton një certifikatë elektronike përmes SMS. Ose certifikata dërgohet automatikisht nëse afati i dorëzimit nuk respektohet.
Ndjesia se ky projekt kishte perspektivë dhe ishte vërtet i nevojshëm, sigurisht që na motivonte shumë.
Të nesërmen dolëm me ekipin për drekë dhe diskutuam si do të dukej funksionaliteti minimal i aplikacionit.
Si rezultat, u formua kjo listë e gjërave që duhej të arrinim të bënim gjatë hackathon-it:
- Hyrja në sistemin e arkës së dërgesave.
- TĂ« shfaqet pozicioni aktual.
- Të dërgohen të dhëna në një API të jashtme (koordinatat, mori porosinë, dorëzoi porosinë).
- Të merren të dhëna nga një API e jashtme (porositë aktuale të korrierit).
- Të dërgohet event-i që tregon se mori porosinë për dorëzim / e dorëzoi.
- Të shfaqet pozicioni aktual i korrierit në hartë në sajt.
Siç dukej, puna kryesore do tĂ« ishte krijimi i backend-it dhe i vetĂ« aplikacionit (pas diskutimeve zgjodhĂ«m ReactNative pĂ«r zhvillimin e aplikacionit, mĂ« saktĂ« shtresĂ«n mbĂ«shtjellĂ«se mbi tĂ« â , qĂ« tĂ« mos na duhej fare tĂ« shkruanim kod nativ). PĂ«r backend-in, fillimisht shpresonim te Vanya Zverev, si person me pĂ«rvojĂ« nĂ« punĂ«n me shabllonin tonĂ« tĂ« shĂ«rbimit dhe me k8s (dhe pikĂ«risht kĂ«tĂ« pjesĂ« ai e mori pĂ«rsipĂ«r). ReactNative vendosĂ«m ta provonim unĂ« dhe Andrey Sarafanov.
Vendosa të përpiqesha menjëherë të krijoja një repository funksional për vetë projektin. Rreth orës 12 të natës hasa faktin që në ReactNative geolokacioni në sfond funksionon dobët nëse nuk shkruan kod nativ, gjë që më frustronte pak. Më pas u qetësova kur kuptova se nuk po lexoja dokumentacionin e framework-ut expo.io, por atë të ReactNative. Në fund, që atë mbrëmje e kisha tashmë të qartë si të merrja pozicionin aktual në expo.io dhe si të vizatoja ekrane të veçanta (për login, shfaqjen e porosisë etj.).

Në mëngjes, në hackathon, e tërhoqëm Gleb-in në projektin tonë superpremtues. Shpejt përgatitëm një plan për atë që duhej bërë.

BĂ«mĂ« njĂ« gabim kur, sipas shabllonit tĂ« projektit, u pĂ«rpoqĂ«m tĂ« realizonim komunikimin jo pĂ«rmes HTTP, por pĂ«rmes GRPC, pasi askush nuk dinte tĂ« ndĂ«rtonte njĂ« klient GRPC pĂ«r JavaScript. NĂ« fund, pasi humbĂ«m rreth njĂ« orĂ« e gjysmĂ« me kĂ«tĂ«, e lamĂ« fare si ide. PĂ«r shkak tĂ« kĂ«saj, edhe ekipi i backend-it nisi tĂ« ripunonte serverin e gatshĂ«m nga GRPC nĂ« WebApi. Pas gjysmĂ« ore, mĂ« nĂ« fund arritĂ«m tĂ« konfiguroni komunikimin e aplikacionit me backend-in, mrekulli e vĂ«rtetĂ«. Por pikĂ«risht nĂ« tĂ« njĂ«jtĂ«n kohĂ« Gleb pothuajse e kishte pĂ«rfunduar deploy-in nĂ« k8s, plus edhe autodeploy pas commit-it nĂ« master. đ
Për ruajtjen e të dhënave zgjodhëm MySQL, që të mos rrezikonim të paktën me bazën e të dhënave (kishte edhe mendime për CosmosDb).

NĂ« fund:
- Implementuam ruajtjen e koordinatave aktuale të korrierit nga aplikacioni në bazën e të dhënave.
- Integruam RabbitMQ dhe u abonuan te mesazhet për marrjen e porosisë nga korrieri, që porosia të shfaqej menjëherë në aplikacionin e korrierit.
- Nisëm të ruanim në bazën tonë të dhënash kohën e dorëzimit të porosisë, pasi korrieri shtypte butonin në aplikacion. Nuk arritëm të shtonim dërgimin e event-it mbrapsht në RabbitMQ që porosia ishte dorëzuar.
- Bëra shfaqjen e hartës në faqen currentorder në sajt me pozicionin aktual të korrierit. Por ky funksionalitet mbeti pak i papërfunduar, sepse në mjedis nuk arritëm të konfiguroni CORS për të marrë koordinatat nga shërbimi ynë i ri.
M87
Roma Bukin, Gosha Polevoy (), Artyom Trofimushkin
Donim të implementonim një ofrues OpenID Connect, pasi aktualisht përdorim një protokoll autentikimi të zhvilluar nga ne, dhe kjo krijon një sërë vështirësish: biblioteka klienti të personalizuara, punë jo të përshtatshme për partnerët e jashtëm dhe ndoshta edhe probleme sigurie (në fund të fundit, OAuth2.0 dhe OpenID Connect në implementimin standard mund të konsiderohen të sigurta, ndërsa për zgjidhjen tonë nuk jam i sigurt).

Krijuam njĂ« shĂ«rbim tĂ« veçantĂ« qĂ« emulon ruajtjen e tĂ« dhĂ«nave personale, pĂ«r tĂ« ndĂ«rtuar njĂ« model tĂ« vogĂ«l tĂ« njĂ« ofruesi autentikimi Country-Agnostic, i cili do tâi merrte tĂ« dhĂ«nat personale nga njĂ« shĂ«rbim i veçantĂ«. NĂ« perspektivĂ«, kjo do tĂ« jepte mundĂ«sinĂ« pĂ«r tĂ« pasur njĂ« shĂ«rbim tĂ« vetĂ«m me tĂ« cilin do tĂ« ishte e mundur tĂ« hyhej me njĂ« llogari nĂ« çdo vend, duke qenĂ« njĂ«kohĂ«sisht nĂ« pĂ«rputhje me GDPR dhe ligje tĂ« tjera. KĂ«tĂ« pjesĂ« e realizuam, ashtu si edhe ofruesin, dhe i integruam me sukses me njĂ«ri-tjetrin. MĂ« pas duhej tĂ« ndĂ«rtonim njĂ« API qĂ« do tĂ« mbrohej me tokenĂ«t e lĂ«shuar nga ofruesi, tĂ« mbĂ«shteste introspection-in e tyre pĂ«rmes ofruesit dhe tĂ« kthente tĂ« dhĂ«na tĂ« mbrojtura nĂ«se kĂ«rkesa pĂ«rmbushte politikat e autorizimit (verifikojmĂ« qĂ« pĂ«rdoruesi Ă«shtĂ« autentikuar sipas skemĂ«s Bearer, qĂ« tokeni i tij pĂ«rmban njĂ« scope tĂ« caktuar dhe qĂ« vetĂ« pĂ«rdoruesi ka permission-in qĂ« lejon ekzekutimin e thirrjes). Edhe kjo pjesĂ« u realizua. Komponenti i fundit ishte klienti JavaScript, tĂ« cilit do tâi jepej njĂ« token me tĂ« cilin ai do tĂ« thĂ«rriste API-n e mbrojtur. KĂ«tĂ« pjesĂ« nuk arritĂ«m ta pĂ«rfundonim. Pra, e gjithĂ« pjesa funksionale ishte gati, por mungonte pjesa front-end pĂ«r tĂ« demonstruar funksionimin e gjithĂ« sistemit.
E-E-E (lojë e vogël)
Dima Afonchenko, Sasha Konovalov
Krijuam një mini-lojë në Unity ku duar të shpejta hedhin sallam mbi pica. Nëse e hedh sallamin gabim, në ekran shfaqet mbishkrimi i trishtuar «Refuzuar», ndërsa nëse i gjithë sallami vendoset saktë, atëherë shfaqet një fakt i rastësishëm për picën.

Donim të bënim edhe një nivel të dytë me hedhjen e domateve, por nuk ia dolëm në kohë.

Një vazhdim i shkurtër: kush fitoi në fund?
Para hackathon-it po flisnim me djemtë dhe i pyeta se çfarë çmimi do të donin të merrnin nëse fitonin. Doli se çmimi më i vlefshëm do të ishte «rruga për në prod».

Prandaj, së shpejti prisni nga ne njoftimin e një loje me leva që hedhin pepperoni mbi picë.
Siç mund ta ketë vënë re lexuesi i vëmendshëm, fitoi ekipi «E-E-E (igruha)». I urojmë djemtë!
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutem.
Cili projekt ju pëlqeu më shumë?
Oleg Learning (machine learning)
GUI për NOOBS
CourierGo
M87
E-E-E
Votuan 5 përdorues. Abstenuan 3 përdorues.
Burimi: habr.com
