{"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\/ro\/blog\/news\/kodim-pitstsa","title":{"rendered":"Codare\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bun\u0103, Habr. Am organizat spontan prima noastr\u0103 hackathon intern. Am decis s\u0103 \u00eemp\u0103rt\u0103\u0219esc cu voi durerile \u0219i concluziile mele despre preg\u0103tirea pentru acesta \u00een ultimele 2 s\u0103pt\u0103m\u00e2ni, precum \u0219i proiectele care au rezultat.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\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>Partea plictisitoare pentru cei interesa\u021bi de marketing<\/h2>\n<p>\n\u00cencep cu o mic\u0103 poveste. <\/p>\n<p>La \u00eenceputul lui aprilie. La biroul nostru are loc primul hackathon al comunit\u0103\u021bii MskDotNet. B\u0103t\u0103lia pentru Tatooine este \u00een toi, \u00een galaxia noastr\u0103 de data aceasta. S\u00e2mb\u0103t\u0103. 20 de echipe. Pizza. Totul foarte prietenos (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">dovezi<\/a><\/noindex>). R2-D2 umflabil se furi\u0219eaz\u0103 prin sal\u0103. Echipele scriu cele mai corecte algoritmi pentru a finaliza cea mai periculoas\u0103 curs\u0103 de pe hart\u0103. Am \u00eent\u00e2rziat startul primelor curse. Biscui\u021bii \u0219i cafeaua ne salveaz\u0103. Noi, cu organizatorii, ne a\u0219teptam ca s\u00e2mb\u0103t\u0103 mul\u021bi vor pleca dup\u0103-amiaz\u0103. Dar nu. 12 ore de codare au trecut. Finalul. Ceva se opre\u0219te, ceva nu porne\u0219te. Dar to\u021bi sunt ferici\u021bi. Echipa noastr\u0103 c\u00e2\u0219tig\u0103. Suntem ferici\u021bi de dou\u0103 ori. <\/p>\n<p>\u00cemp\u0103rt\u0103\u0219esc bucuria \u00een Slack \u0219i \u00eemi vine o idee: \u201eTrebuie s\u0103 organiz\u0103m hackathon-ul nostru\u201d. \u00cei scriu CTO-ului nostru, Sasha. T\u0103cere. <\/p>\n<p>Diminea\u021ba. Beau cafea la birou. \u00cel v\u0103d pe Sasha apropiindu-se din spate. \u201eLiza, este grozav! Tocmai avem o dat\u0103 important\u0103 pe 21 aprilie. Haide s\u0103 organiz\u0103m!\u201d WTF!? A\u0219a de repede? Huh? Trebuie s\u0103 plec \u00een Syktyvkar pentru un stagiu la mijlocul lui aprilie. Dar ce conteaz\u0103! Haide.<\/p>\n<p>Mai r\u0103m\u00e2n 2 s\u0103pt\u0103m\u00e2ni. Nu am fost niciodat\u0103 organizator unic al unui hackathon. Chiar dac\u0103 este unul intern. Citesc articole pe aceast\u0103 tem\u0103. Groaznic. Ai nevoie de c\u00e2teva luni. Ai nevoie de c\u00e2\u021biva oameni. Trebuie s\u0103 te g\u00e2nde\u0219ti la merchandise, premii, condi\u021bii, program, s\u0103 implici, s\u0103 \u00een\u021belegi scopul, bugetele. Poate chiar s\u0103 \u00ee\u021bi dai seama de sensul vie\u021bii. Cu siguran\u021b\u0103 nu voi reu\u0219i. \u0218i \u00een timp ce citeai \u0219i te preg\u0103teai, a trecut deja o s\u0103pt\u0103m\u00e2n\u0103. E momentul s\u0103 ne concentr\u0103m pe ac\u021biune \u0219i s\u0103 facem ceva. <\/p>\n<p><b class=\"spoiler_title\">Primi\u021bi lista noastr\u0103 de verificare pentru organizarea unui hackathon intern \u00een 1 s\u0103pt\u0103m\u00e2n\u0103<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: te a\u0219ezi lini\u0219tit \u0219i scrii lista cu ceea ce trebuie realizat pentru hackathon. <i>30 de minute<\/i>.<\/li>\n<li><b>Sarcin\u0103<\/b>: participan\u021bii propun \u0219i aleg singuri proiectele pe care doresc s\u0103 le creeze \u00een Google Sheets. <i>Sarcina de fond, 2 ore<\/i>.<\/li>\n<li><b>Programul<\/b>: scrii rapid o scurt\u0103 desp\u0103r\u021bire pe timp cu 3 pauze \u0219i finalul \u00een minte. <i>20 de minute<\/i>.<\/li>\n<li><b>Comenzi<\/b>: publici un mesaj despre hackathon cu programul de la CTO \u00een canalele IT din Slack\/email\/etc. \u0219i creezi un canal separat pentru hackathon. Acolo, to\u021bi se \u00eempart \u00een echipe, iar cei care nu s-au decis fac asta \u00een primele 5 minute ale hackathon-ului. <i>Sarcina de fond, 2 ore<\/i>.<\/li>\n<li><b>Beneficii<\/b>: creezi merch cu doi dezvoltatori, \u00eel predai designerului pentru ilustrare, prime\u0219ti finished. <i>Task de fond, 3 zile<\/i>.<\/li>\n<li><b>Hackathon<\/b>: ajungi la birou, coordonezi pe toat\u0103 lumea la \u00eenceput, te ocupi de treburile tale, cite\u0219ti Reddit, comunici cu important\u0103 despre pizza proasp\u0103t\u0103 la fiecare pauz\u0103, fotografiezi apusul, anun\u021bi finala, vota\u021bi \u00eempreun\u0103 \u0219i alege\u021bi c\u00e2\u0219tig\u0103torul. <i>1 zi<\/i>.<\/li>\n<li><b>Sub stea<\/b>: desigur, te g\u00e2nde\u0219ti constant c\u0103 totul va decurge bine. Desigur, nu toat\u0103 lumea va vedea mesajul t\u0103u \u0219i cu unii este mai bine s\u0103 discu\u021bi personal. Desigur, dac\u0103 cineva te ajut\u0103, va fi de dou\u0103 ori mai u\u0219or (m-a ajutat minunata Alena).<\/li>\n<\/ul>\n<h2>Partea mai pu\u021bin plictisitoare despre data hackathonului<\/h2>\n<p>\nDe ce 21 aprilie? Aceast\u0103 zi este semnificativ\u0103 pentru noi. Exact acum un an, pe 21 aprilie, am c\u0103zut sub \u00eenc\u0103rc\u0103tur\u0103 \u00een timpul primelor weekenduri dup\u0103 startul Campaniei Federale de Publicitate. A doua zi, duminic\u0103, echipa noastr\u0103 a fost la lucru de la 8 diminea\u021ba. Atunci am creat \u00een Trello tabloul sundayhackathon \u0219i a \u00eenceput s\u0103pt\u0103m\u00e2na de munc\u0103 \u00een ture de 12 ore pe zi. Situa\u021bia era at\u00e2t de critic\u0103 \u00eenc\u00e2t nu aveam timp nici m\u0103car s\u0103 m\u00e2nc\u0103m \u0219i am fost hr\u0103ni\u021bi de colegii din alte echipe.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO poveste mai detaliat\u0103 pute\u021bi citi pe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">pagina lui Fiodor Ovcihnikov<\/a><\/noindex> (CEO-ul nostru). De atunci, am f\u0103cut multe schimb\u0103ri, dar acum nu vom uita cu siguran\u021b\u0103 data.<\/p>\n<p>Anul acesta am decis c\u0103 acest eveniment merit\u0103 s\u0103 fie p\u0103strat \u00een memorie \u0219i, \u00een cele mai bune tradi\u021bii, am organizat primul hackathon intern \u00een istoria Dodo, care a durat 10 ore. <\/p>\n<h2>Partea cea mai pu\u021bin plictisitoare despre proiectele hackathonului<\/h2>\n<p>\n<i>Disclaimer: toate descrierile au fost scrise de colegi, deci autoratul textului nu este al meu.<\/i><\/p>\n<h4>Oleg Learning (\u00eenv\u0103\u021bare automat\u0103)<\/h4>\n<p>\n<i>Dima Ko\u010dne\u021bev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Au vrut s\u0103 creeze o re\u021bea neural\u0103 care s\u0103 determine ce pizza este \u00een fotografie f\u0103r\u0103 cuno\u0219tin\u021be anterioare. \u00cen cele din urm\u0103, au f\u0103cut una foarte simpl\u0103 \u0219i juc\u0103u\u0219\u0103 \u2013 recunoa\u0219te 10 tipuri de pizza, aproximativ au \u00een\u021beles cum func\u021bioneaz\u0103 totul, c\u00e2t de mult este posibil \u00eentr-o zi (~10 ore).<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen special, am \u00een\u021beles c\u0103 industria a ajuns la un nivel \u00een care un dezvoltator obi\u0219nuit poate lua libr\u0103rii gata f\u0103cute, citi documenta\u021bia \u0219i s\u0103-\u0219i antreneze re\u021beaua neural\u0103 f\u0103r\u0103 cuno\u0219tin\u021be profunde de subiect. \u0218i va func\u021biona destul de bine pentru a rezolva probleme reale.<\/p>\n<p>Instrumente utilizate: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 o bibliotec\u0103 convenabil\u0103 \u0219i simpl\u0103 pentru lucru cu \u00eenv\u0103\u021barea automat\u0103 \u0219i viziunea computerizat\u0103.<\/li>\n<li>Am \u00eencercat dou\u0103 modele \u2013 ResNet50, Yolo.<\/li>\n<li>Codul a fost scris, bine\u00een\u021beles, \u00een Python.<\/li>\n<\/ul>\n<p>\nAm avut 11000 de fotografii, dar dintre ele aproape 3\/4 s-au dovedit a fi de calitate slab\u0103, iar \u00een cele r\u0103mase \u2013 unghiuri diferite \u0219i necorespunz\u0103toare. \u00cen cele din urm\u0103, am folosit un model gata f\u0103cut (care doar \u0219tie s\u0103 identifice pizza) \u0219i cu ajutorul acestuia am eliminat cele mai slabe imagini. Apoi, \u00een denumirea fotografiei era numele pizzei \u2014 a\u0219a am organizat totul \u00een foldere, dar s-a dovedit c\u0103 numele nu coincid cu realitatea \u0219i a trebuit s\u0103 cur\u0103\u021b\u0103m manual. \u00cen cele din urm\u0103, au r\u0103mas aproximativ 500-600 de fotografii, e clar c\u0103 este o cantitate nesemnificativ\u0103, dar totu\u0219i a fost suficient pentru a distinge 10 tipuri diferite de pizza.<\/p>\n<p>Pentru antrenarea re\u021belei am folosit cea mai ieftin\u0103 ma\u0219in\u0103 virtual\u0103 din Azure cu NVIDIA Tesla K80. Pe aceasta am antrenat timp de 100 de epoci, dar era clar c\u0103 re\u021beaua s-a saturat deja dup\u0103 50 de epoci, din cauza faptului c\u0103 setul de date era mic.<\/p>\n<p>Practically, \u00eentreaga problem\u0103 este lipsa datelor de calitate.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoate c\u0103 am amestecat pu\u021bin terminologia, dar trebuie s\u0103 \u021binem cont c\u0103 nu avem deloc experien\u021b\u0103 \u00een ceea ce prive\u0219te toate aceste activit\u0103\u021bi.<\/p>\n<h4>GUI pentru NOOBS (interfa\u021ba pentru comanda de 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>Am adunat un prototip de aplica\u021bie console pentru pasiona\u021bi, prin care se poate comanda pizza direct din terminal sau linia de comand\u0103, sau chiar s\u0103 o integr\u0103m \u00een pipeline-ul de implementare, livr\u00e2nd pizza \u00een birou la un release reu\u0219it.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMunca a fost \u00eemp\u0103r\u021bit\u0103 \u00een mai multe p\u0103r\u021bi: am studiat cum func\u021bioneaz\u0103 API-ul nostru pentru aplica\u021biile mobile, am construit propriul nostru CLI folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> \u0219i am configurat publicarea pachetului adunat de noi. Ultima sarcin\u0103 a fost legat\u0103 de c\u00e2teva momente nepl\u0103cute spre sf\u00e2r\u0219itul hackathon-ului. Totul func\u021biona local \u0219i chiar versiunile vechi publicate ale pachetului erau opera\u021bionale, dar cele noi (\u00een care au fost ad\u0103ugate mai multe caracteristici interesante \u0219i emoticoane) refuzau s\u0103 func\u021bioneze. Am petrecut aproximativ 40 de minute \u00eencerc\u00e2nd s\u0103 \u00een\u021belegem ce s-a \u00eent\u00e2mplat, dar \u00een cele din urm\u0103, totul a func\u021bionat ca prin magie).<\/p>\n<p>Obiectivul nostru principal la hackathon a fost de a realiza o comand\u0103 real\u0103 de pizza \u00een birou prin CLI-ul nostru. Am testat de zeci de ori pe un mediu de testare, dar mi se \u00eenv\u00e2rtea totu\u0219i stomacul c\u00e2nd introduceam comenzile \u00een produc\u021bie.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCa rezultat \u2014 totu\u0219i, am reu\u0219it!<\/p>\n<p><img decoding=\"async\" alt=\"Codare\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 Brujmeliev (autor), Vania Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropie<\/a><\/noindex>), Andrei Sarafanov<\/i><\/p>\n<p>Am luat ideea \u201eAplica\u021bie pentru curier\u201d.<\/p>\n<p><b class=\"spoiler_title\">Povestea de fond despre preg\u0103tire.<\/b>Ini\u021bial m-am g\u00e2ndit ce func\u021bionalit\u0103\u021bi ar putea avea aplica\u021bia. A ap\u0103rut o list\u0103 aproximativ\u0103 a func\u021bionalit\u0103\u021bilor:<\/p>\n<ul>\n<li>Aplica\u021bia se logheaz\u0103 \u00een sistemul de livrare prin cod.<\/li>\n<li>\u00cen aplica\u021bie sunt vizibile imediat comenzile disponibile, comenzile care trebuie preluate.<\/li>\n<li>Curierul marcheaz\u0103 comanda \u0219i o ia \u00een c\u0103l\u0103torie.<\/li>\n<li>I se arat\u0103 timpul estimat \u0219i dac\u0103 va ajunge la timp sau nu.<\/li>\n<li>Clientul este informat c\u0103 curierul a plecat.<\/li>\n<li>Clientul poate vedea pe hart\u0103 pozi\u021bia curierului \u0219i timpul estimat.<\/li>\n<li>Curierul poate scrie clientului \u00een chat din aplica\u021bie.<\/li>\n<li>Clientul poate scrie curierului \u00een chat din aplica\u021bie.<\/li>\n<li>Cu cinci minute \u00eenainte de sosire, clientul prime\u0219te un mesaj c\u0103 curierul este aproape, s\u0103 fie preg\u0103tit.<\/li>\n<li>Curierul marcheaz\u0103 \u00een aplica\u021bie c\u0103 a sosit \u0219i a\u0219teapt\u0103.<\/li>\n<li>Curierul poate suna din aplica\u021bie cu un singur click \u0219i s\u0103 informeze c\u0103 (se ridic\u0103, a ajuns etc.)<\/li>\n<li>Clientul accept\u0103 comanda \u0219i introduce codul PIN din aplica\u021bie sau SMS pentru confirmarea livr\u0103rii. (ca o semn\u0103tur\u0103) Pentru a preveni curierul s\u0103 finalizeze livrarea prea devreme, dac\u0103 este \u00eent\u00e2rziat.<\/li>\n<li>Comanda este marcat\u0103 \u00een sistem ca livrat\u0103.<\/li>\n<\/ul>\n<p>Plus c\u00e2teva scenarii alternative:<\/p>\n<ul>\n<li>Curierul poate marca comanda ca nedistribuit\u0103 \u0219i alege un motiv.<\/li>\n<li>Curierul, \u00een caz de \u00eent\u00e2rziere, poate emite un certificat electronic prin SMS cu un singur click. Sau certificatul vine automat \u00een cazul nerespect\u0103rii termenului de livrare.<\/li>\n<\/ul>\n<p>\nSentimentul de perspective \u0219i utilitate al acestui proiect, desigur, a energizat.<\/p>\n<p>A doua zi, am mers cu echipa la pr\u00e2nz \u0219i am discutat despre cum va ar\u0103ta func\u021bionalitatea minim\u0103 a aplica\u021biei. <\/p>\n<p>\u00cen final, s-a format urm\u0103toarea list\u0103 a ceea ce trebuia s\u0103 facem la hackathon:<\/p>\n<ul>\n<li>Logare \u00een sistemul de livrare.<\/li>\n<li>Afi\u0219area loca\u021biei curente.<\/li>\n<li>Trimiterea datelor c\u0103tre un API extern (coordonate, comanda preluat\u0103, comanda livrat\u0103).<\/li>\n<li>Ob\u021binerea datelor dintr-un API extern (comenzile curente ale curierului).<\/li>\n<li>Trimiterea unui eveniment despre faptul c\u0103 a preluat comanda pentru livrare\/ a livrat.<\/li>\n<li>Afi\u0219area pozi\u021biei curierului pe hart\u0103 pe site.<\/li>\n<\/ul>\n<p>\nPrincipala munc\u0103, dup\u0103 cum se vedea, urma s\u0103 fie \u00een crearea backend-ului, a aplica\u021biei (dup\u0103 discu\u021bii, am ales ReactNative pentru dezvoltarea aplica\u021biei, mai precis o leg\u0103tur\u0103 deasupra acesteia \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, care permite s\u0103 nu scrii deloc cod nativ). \u00cen ceea ce prive\u0219te backend-ul, ini\u021bial existau speran\u021be \u00een Vania Zverev, ca fiind un expert \u00een lucrul cu \u0219ablonul nostru de serviciu \u0219i k8s (ceea ce el a \u0219i preluat). Eu \u0219i Andrei Sarafanov am \u00eenceput s\u0103 lucr\u0103m cu ReactNative.<\/p>\n<p>Am decis s\u0103 \u00eencerc s\u0103 creez imediat un depozit func\u021bional pentru proiect. La miezul nop\u021bii, am descoperit c\u0103 geoloca\u021bia \u00een ReactNative func\u021bioneaz\u0103 prost \u00een fundal, dac\u0103 nu scrii cod nativ, ceea ce m-a f\u0103cut pu\u021bin frustrat. Apoi mi-a trecut c\u00e2nd am realizat c\u0103 citesc documenta\u021bia pentru cadrul expo.io, nu pentru ReactNative. \u00cen cele din urm\u0103, \u00een aceast\u0103 sear\u0103 mi-a fost clar cum s\u0103 ob\u021bin pozi\u021bia actual\u0103 \u00een expo.io \u0219i s\u0103 creez ecrane separate (pentru login, afi\u0219area comenzii etc.).<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiminea\u021ba, la hackathon, l-am atras pe Gleb \u00een proiectul nostru extrem de promi\u021b\u0103tor. Am schi\u021bat rapid un plan pentru ce trebuie s\u0103 facem.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm f\u0103cut o gre\u0219eal\u0103 c\u00e2nd, conform \u0219ablonului proiectului, am \u00eencercat s\u0103 facem comunica\u021bia nu prin HTTP, ci prin GRPC, deoarece nimeni nu \u0219tia s\u0103 construiasc\u0103 un client GRPC pentru JavaScript. \u00cen cele din urm\u0103, dup\u0103 ce am pierdut aproximativ o or\u0103 \u0219i jum\u0103tate, am abandonat aceast\u0103 idee. Din aceast\u0103 cauz\u0103, b\u0103ie\u021bii au \u00eenceput s\u0103 refac\u0103 serverul existent de la GRPC la WebApi. Dup\u0103 o jum\u0103tate de or\u0103, \u00een sf\u00e2r\u0219it am reu\u0219it s\u0103 configur\u0103m comunicarea aplica\u021biei cu backend-ul, minunat. Dar \u00een acela\u0219i timp, Gleb aproape finalizase deploy-ul \u00een k8s \u0219i plus auto-deploy-ul pe commit-ul \u00een master. \ud83d\ude42<\/p>\n<p>Ca stocare, am ales MySQL pentru a nu risca cu baza (erau g\u00e2nduri despre CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen concluzie: <\/p>\n<ul>\n<li>Am implementat salvarea coordonatelor curente ale curierului din aplica\u021bie \u00een baz\u0103.<\/li>\n<li>Am ad\u0103ugat RabbitMQ \u0219i ne-am abonat la mesajele despre acceptarea comenzii de c\u0103tre curier, pentru a putea afi\u0219a imediat comanda \u00een aplica\u021bie.<\/li>\n<li>Am \u00eenceput s\u0103 salv\u0103m \u00een baza noastr\u0103 timpul de livrare a comenzii, dup\u0103 ce curierul ap\u0103sa butonul \u00een aplica\u021bie. Nu am reu\u0219it s\u0103 ad\u0103ug\u0103m trimiterea unui eveniment \u00eenapoi \u00een RabbitMQ despre faptul c\u0103 comanda a fost livrat\u0103.<\/li>\n<li>Am realizat afi\u0219area h\u0103r\u021bii pe pagina currentorder de pe site cu pozi\u021bia curent\u0103 a curierului. Dar aceast\u0103 func\u021bionalitate a r\u0103mas pu\u021bin neterminat\u0103, deoarece \u00een mediu nu am reu\u0219it s\u0103 configur\u0103m CORS pentru a ob\u021bine coordonatele din noul nostru serviciu.<\/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>), Artem Trofimushkin<\/i><\/p>\n<p>Am dorit s\u0103 implement\u0103m un furnizor OpenID Connect, deoarece \u00een prezent utiliz\u0103m un protocol de autentificare dezvoltat intern, iar acest lucru creeaz\u0103 o serie de dificult\u0103\u021bi: biblioteci client personalizate, interac\u021biune incomod\u0103 din partea partenerilor externi, posibil probleme de securitate (totu\u0219i, implementarea standard a OAuth2.0 \u0219i OpenID Connect poate fi considerat\u0103 sigur\u0103, iar \u00een ceea ce prive\u0219te solu\u021bia noastr\u0103 \u2013 nu sunt sigur).<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm creat un serviciu separat care emuleaz\u0103 un serviciu de stocare a datelor personale, pentru a construi un model mic de furnizor de autentificare indiferent de \u021bar\u0103, care s\u0103 acceseze datele personale \u00eentr-un serviciu separat (aceasta, pe termen lung, ar permite s\u0103 existe un singur serviciu prin care s\u0103 te conectezi cu un cont din orice \u021bar\u0103 \u0219i, \u00een acela\u0219i timp, s\u0103 respect\u0103m GDPR \u0219i alte reglement\u0103ri). Am realizat aceast\u0103 parte, la fel ca \u0219i furnizorul, \u0219i le-am legat cu succes. Apoi, a fost necesar s\u0103 facem un API, care s\u0103 fie protejat prin token-uri emise de furnizor, s\u0103 sus\u021binem introspec\u021bia acestora prin furnizor \u0219i s\u0103 return\u0103m datele protejate, dac\u0103 cererea respecta politicile de autorizare (verific\u0103m c\u0103 utilizatorul este autentificat conform schemei Bearer, token-ul s\u0103u con\u021bine un anumit scope + utilizatorul \u00een sine are permisiunea care permite executarea apelului). Aceast\u0103 parte a fost de asemenea realizat\u0103. Ultimul component a fost un client JavaScript, c\u0103ruia \u00eei va fi emis un token, cu ajutorul c\u0103ruia acesta va apela API-ul protejat. Aceast\u0103 parte nu am reu\u0219it s\u0103 o complet\u0103m. A\u0219a c\u0103 toat\u0103 partea func\u021bional\u0103 a fost gata, dar partea de front-end pentru demonstrerea func\u021bionalit\u0103\u021bii \u00eentregului sistem nu a fost preg\u0103tit\u0103.<\/p>\n<h4>E-E-E (joc)<\/h4>\n<p>\n<i>Dima Afoncenko, Sasha Konovalov<\/i><\/p>\n<p>Am realizat un mini-joc \u00een care m\u00e2nu\u021bele rapide pun c\u00e2rna\u021bi pe pizza. Dac\u0103 ai pus c\u00e2rna\u021bii gre\u0219it, pe ecran apare mesajul trist \u201eRespins\u201d, iar dac\u0103 to\u021bi c\u00e2rna\u021bii sunt pu\u0219i corect, apare un fapt aleator despre pizza.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm vrut s\u0103 facem un al doilea nivel cu aruncarea ro\u0219iilor, dar nu am reu\u0219it.<\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Scurt\u0103 continuare: cine a c\u00e2\u0219tigat?<\/h2>\n<p>\n\u00cenainte de hackathon, am avut o discu\u021bie cu b\u0103ie\u021bii \u0219i am \u00eentrebat ce premiu \u0219i-ar dori s\u0103 primeasc\u0103 \u00een cazul \u00een care c\u00e2\u0219tig\u0103. S-a dovedit c\u0103 cel mai valoros premiu ar fi \u201edrumul \u00een produc\u021bie\u201d. <\/p>\n<p><img decoding=\"async\" alt=\"Codare\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA\u0219adar, a\u0219tepta\u021bi \u00een cur\u00e2nd de la noi un anun\u021b despre jocul cu m\u00e2inile care arunc\u0103 peperoni pe pizza.<\/p>\n<blockquote><p>Dup\u0103 cum a observat cititorul atent, echipa \u00abE-E-E (jocul)\u00bb a c\u00e2\u0219tigat. Felicit\u0103ri b\u0103ie\u021bilor!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Numai utilizatorii \u00eenregistra\u021bi pot participa la sondaj. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Conecta\u021bi-v\u0103<\/a><\/noindex>, v\u0103 rug\u0103m.<\/p>\n<h2 class=\"default-block__polling-title\">Care proiect v-a pl\u0103cut cel mai mult?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (\u00eenv\u0103\u021bare automat\u0103)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI pentru 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 utilizatori au votat. 3 utilizatori s-au ab\u021binut.<br \/>\n<br \/>Sursa: <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.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\/ro\/blog\/news\/kodim-pitstsa\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Cod\u0103m\u2013pizza | ProHoster","description":"Salut, Habr. Am organizat spontan primul nostru hackathon intern.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}