{"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\/pt\/blog\/news\/kodim-pitstsa","title":{"rendered":"Codando\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr. Realizamos espontaneamente nosso primeiro hackathon interno. Decidi compartilhar com voc\u00ea minhas dificuldades e conclus\u00f5es sobre a prepara\u00e7\u00e3o para isso em duas semanas, assim como os projetos que surgiram.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\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>A parte chata para quem se interessa por marketing<\/h2>\n<p>\nVou come\u00e7ar com uma pequena hist\u00f3ria. <\/p>\n<p>In\u00edcio de abril. Nosso escrit\u00f3rio est\u00e1 sediando o primeiro hackathon da MskDotNet Community. A batalha por Tatooine est\u00e1 a todo vapor, nesta gal\u00e1xia desta vez. S\u00e1bado. 20 equipes. Pizza. Tudo muito acolhedor (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">os proofs<\/a><\/noindex>). Um R2-D2 infl\u00e1vel aparece pela sala. As equipes est\u00e3o escrevendo os algoritmos mais corretos para superar a corrida mais perigosa do mapa. A partida \u00e9 adiada. Biscoitos e caf\u00e9 salvam. N\u00f3s, com os organizadores, est\u00e1vamos esperando que muitos sa\u00edssem no s\u00e1bado ap\u00f3s o almo\u00e7o. Mas n\u00e3o. 12 horas de codifica\u00e7\u00e3o se passaram. Final. Algo cai, algo n\u00e3o liga. Mas todos est\u00e3o felizes. Nossa equipe vence. Estamos felizes em dobro. <\/p>\n<p>Compartilho a alegria no Slack e uma ideia vem \u00e0 mente: \u201cPrecisamos fazer nosso hackathon\u201d. Escrevo para nosso CTO Sasha. Sil\u00eancio. <\/p>\n<p>Manh\u00e3. Estou tomando caf\u00e9 no escrit\u00f3rio. Vejo Sasha se aproximando pelas costas. \u201cLiza, isso \u00e9 \u00f3timo! Temos uma data importante em 21 de abril. Vamos fazer!\u201d WTF!? T\u00e3o r\u00e1pido? H\u00e3? O que? Preciso viajar para Syktyvkar para o est\u00e1gio no meio de abril. E que se dane! Vamos l\u00e1.<\/p>\n<p>Faltam 2 semanas. Eu nunca fui a organizadora \u00fanica de um hackathon. Mesmo que seja interno. Estou lendo artigos sobre o tema. Terr\u00edvel. Precisa de v\u00e1rios meses. Precisa de v\u00e1rias pessoas. Tem que planejar merchandise, pr\u00eamios, condi\u00e7\u00f5es, cronograma, envolver pessoas, entender o objetivo, or\u00e7amentos. E talvez at\u00e9 descobrir o sentido da vida. Com certeza n\u00e3o vou conseguir a tempo. E enquanto voc\u00ea lia e se preparava, uma semana j\u00e1 passou. \u00c9 hora de parar de ler artigos e come\u00e7ar a fazer algo. <\/p>\n<p><b class=\"spoiler_title\">Aqui est\u00e1 nossa checklist para realizar um hackathon interno em 1 semana<\/b><\/p>\n<ul>\n<li><b>Plano<\/b>: sente-se tranquilamente e escreve uma lista do que precisa ser feito para o hackathon. <i>30 minutos<\/i>.<\/li>\n<li><b>Tarefa<\/b>: os participantes prop\u00f5em e escolhem os projetos que querem criar no Google Sheets. <i>Tarefa de fundo, 2 horas<\/i>.<\/li>\n<li><b>Cronograma<\/b>: escreva rapidamente um esbo\u00e7o de tempo considerando 3 intervalos e a finaliza\u00e7\u00e3o. <i>20 minutos<\/i>.<\/li>\n<li><b>Equipes<\/b>: publique uma mensagem sobre o hackathon com o cronograma do CTO nos canais de TI no Slack\/email\/etc. e crie um canal separado para o hackathon. Nele, todos se dividem em equipes, enquanto os indecisos fazem isso nos primeiros 5 minutos do hackathon. <i>Tarefa de fundo, 2 horas<\/i>.<\/li>\n<li><b>Vantagens<\/b>: voc\u00ea cria um merch com dois desenvolvedores, entrega ao designer para ilustra\u00e7\u00e3o e recebe o produto final. <i>Tarefa em segundo plano, 3 dias<\/i>.<\/li>\n<li><b>Hackathon<\/b>: voc\u00ea chega ao escrit\u00f3rio, coordena todos no in\u00edcio, cuida das suas tarefas, l\u00ea Reddit, com um ar importante, informa sobre a nova pizza a cada pausa, fotografa o p\u00f4r do sol, anuncia a final e todos votam juntos para escolher o vencedor. <i>1 dia<\/i>.<\/li>\n<li><b>Sob a estrela<\/b>: claro, voc\u00ea est\u00e1 constantemente pensando em como tudo vai correr bem. Naturalmente, nem todos ver\u00e3o sua mensagem e \u00e9 melhor falar pessoalmente com alguns. Sem d\u00favida, se algu\u00e9m estiver te ajudando, tudo ficar\u00e1 2 vezes mais f\u00e1cil (minha ajudante foi a incr\u00edvel Alena).<\/li>\n<\/ul>\n<h2>Parte menos chata sobre a data do hackathon<\/h2>\n<p>\nPor que 21 de abril? Este dia \u00e9 significativo para n\u00f3s. Exatamente um ano atr\u00e1s, em 21 de abril, ca\u00edmos sob carga durante o primeiro fim de semana ap\u00f3s o lan\u00e7amento da Campanha Publicit\u00e1ria Federal. No dia seguinte, domingo, nossa equipe estava trabalhando desde as 8 da manh\u00e3. Naquela \u00e9poca, criamos um quadro no Trello chamado sundayhackathon e come\u00e7ou uma semana de trabalho em turnos de 12 horas por dia. A situa\u00e7\u00e3o estava t\u00e3o cr\u00edtica que n\u00e3o t\u00ednhamos nem tempo para comer, e fomos alimentados por pessoas de outras equipes.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoc\u00ea pode ler uma conta mais detalhada em <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">na p\u00e1gina de Fyodor Ovchinnikov<\/a><\/noindex> (nosso CEO). Desde ent\u00e3o, mudamos muito, mas com certeza n\u00e3o esqueceremos mais essa data.<\/p>\n<p>Este ano decidimos que este evento deve ser eternizado na mem\u00f3ria das gera\u00e7\u00f5es futuras e, seguindo as melhores tradi\u00e7\u00f5es, organizamos o primeiro hackathon interno da hist\u00f3ria da Dodo, que durou 10 horas. <\/p>\n<h2>A parte mais interessante sobre os projetos do hackathon<\/h2>\n<p>\n<i>Disclaimer: todas as descri\u00e7\u00f5es foram escritas pelos pr\u00f3prios rapazes, ent\u00e3o a autoria do texto n\u00e3o \u00e9 minha.<\/i><\/p>\n<h4>Oleg Learning (aprendizado de m\u00e1quina)<\/h4>\n<p>\n<i>Dima Kochnyov, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Quer\u00edamos fazer uma rede neural que identificasse qual pizza est\u00e1 na foto sem nenhum conhecimento pr\u00e9vio. No final, fizemos algo bem simples e de brinquedo \u2013 ela reconhece 10 pizzas, e conseguimos entender como tudo funciona, pelo menos o que \u00e9 poss\u00edvel em um dia (~10 horas).<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEm particular, entendemos que a ind\u00fastria chegou a um ponto em que qualquer desenvolvedor pode usar bibliotecas prontas, ler a documenta\u00e7\u00e3o e treinar sua rede neural sem conhecimentos aprofundados na \u00e1rea. E ela funcionar\u00e1 de forma suficientemente boa para resolver problemas reais.<\/p>\n<p>Ferramentas que usamos: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> \u2014 uma biblioteca conveniente e simples para trabalhar com aprendizado de m\u00e1quina e vis\u00e3o computacional.<\/li>\n<li>Testamos dois modelos \u2013 ResNet50 e Yolo.<\/li>\n<li>O c\u00f3digo foi escrito, como n\u00e3o poderia deixar de ser, em Python.<\/li>\n<\/ul>\n<p>\nT\u00ednhamos 11.000 fotos, mas quase 3\/4 delas eram lixo, e entre as restantes havia diferentes \u00e2ngulos inadequados. No final, pegamos um modelo pronto (que simplemente consegue encontrar pizzas) e, com a ajuda dele, separ\u00e1vamos o que era mais relevante. Al\u00e9m disso, no nome da foto constava o nome da pizza \u2014 assim fizemos a organiza\u00e7\u00e3o em pastas, mas descobrimos que os nomes n\u00e3o correspondiam \u00e0 realidade e tivemos que corrigir manualmente. Restaram cerca de 500-600 fotos, \u00e9 claro que isso \u00e9 um n\u00famero insignificante, mas mesmo assim, foi o suficiente para distinguir 10 pizzas uma da outra.<\/p>\n<p>Para treinar a rede, pegamos a m\u00e1quina virtual mais barata da Azure com NVIDIA Tesla K80. Nela, treinamos por 100 \u00e9pocas, mas era evidente que a rede j\u00e1 estava saturada ap\u00f3s 50 \u00e9pocas, devido ao pequeno conjunto de dados.<\/p>\n<p>A verdadeira quest\u00e3o reside na aus\u00eancia de bons dados.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTalvez tenhamos confundido um pouco os termos, mas \u00e9 importante considerar que n\u00e3o temos experi\u00eancia com tudo isso.<\/p>\n<h4>GUI for NOOBS (console para pedido 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>Criamos um prot\u00f3tipo de aplicativo de console para entusiastas, que permite pedir pizza atrav\u00e9s do terminal ou linha de comando, ou at\u00e9 mesmo integr\u00e1-lo em um pipeline de implanta\u00e7\u00e3o e entregar pizzas no escrit\u00f3rio ap\u00f3s um lan\u00e7amento bem-sucedido.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO trabalho se dividiu em v\u00e1rias partes: entendemos como funciona nossa API para aplicativos m\u00f3veis, criamos nosso pr\u00f3prio CLI usando <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> e configuramos a publica\u00e7\u00e3o do pacote que desenvolvemos. Com a \u00faltima tarefa, tivemos alguns momentos desagrad\u00e1veis perto do final do hackathon. Tudo funcionava localmente e at\u00e9 as vers\u00f5es antigas do pacote publicadas funcionavam, mas as novas (que tinham mais recursos legais e emoticons) n\u00e3o funcionavam. Gastamos cerca de 40 minutos tentando descobrir o que havia dado errado, mas, no final, tudo funcionou magicamente sozinho).<\/p>\n<p>Nossa ambi\u00e7\u00e3o no hackathon era fazer um pedido real de pizza no escrit\u00f3rio atrav\u00e9s do nosso CLI. Testamos v\u00e1rias vezes em um ambiente de testes, mas ainda assim eu estava nervoso ao digitar os comandos em produ\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo resultado \u2014 n\u00f3s conseguimos!<\/p>\n<p><img decoding=\"async\" alt=\"Codando\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 Bruzhmel\u00ebv (autor), Vanya Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropia<\/a><\/noindex>), Andrey Sarafanov<\/i><\/p>\n<p>Pegamos a ideia de \"Aplicativo para entregadores\".<\/p>\n<p><b class=\"spoiler_title\">Hist\u00f3ria de prepara\u00e7\u00e3o.<\/b>Inicialmente, eu pensei em quais funcionalidades poderiam haver no aplicativo. Surgiu aproximadamente a seguinte lista de funcionalidades:<\/p>\n<ul>\n<li>O aplicativo faz login na central de entregas por c\u00f3digo.<\/li>\n<li>No aplicativo, os pedidos dispon\u00edveis e os pedidos que precisam ser aceitos s\u00e3o imediatamente vis\u00edveis.<\/li>\n<li>O entregador marca o pedido e o aceita para a viagem.<\/li>\n<li>Ele \u00e9 informado sobre o tempo estimado e se consegue ou n\u00e3o cumprir.<\/li>\n<li>O cliente \u00e9 notificado de que o entregador saiu.<\/li>\n<li>O cliente come\u00e7a a ver a localiza\u00e7\u00e3o do entregador no mapa e o tempo estimado.<\/li>\n<li>O entregador pode enviar mensagens ao cliente pelo chat do aplicativo.<\/li>\n<li>O cliente pode enviar mensagens ao entregador pelo chat do aplicativo.<\/li>\n<li>Cinco minutos antes da chegada, o cliente recebe uma mensagem de que o entregador est\u00e1 pr\u00f3ximo, fique preparado.<\/li>\n<li>O entregador marca no aplicativo que chegou e est\u00e1 esperando.<\/li>\n<li>O entregador pode ligar pelo aplicativo com um clique e informar que (est\u00e1 subindo, chegou, etc.)<\/li>\n<li>O cliente aceita o pedido e insere o c\u00f3digo PIN do aplicativo ou SMS para confirmar a entrega (como assinatura). Isso impede que o entregador conclua a entrega antecipadamente, caso atrase.<\/li>\n<li>O pedido \u00e9 marcado no sistema como entregue.<\/li>\n<\/ul>\n<p>Al\u00e9m de alguns cen\u00e1rios alternativos:<\/p>\n<ul>\n<li>O entregador pode marcar o pedido como n\u00e3o entregue e escolher o motivo.<\/li>\n<li>O entregador, em caso de atraso, pode enviar um certificado eletr\u00f4nico por SMS com um clique. Ou o certificado chega automaticamente ao n\u00e3o cumprimento do prazo de entrega.<\/li>\n<\/ul>\n<p>\nA sensa\u00e7\u00e3o de potencial e necessidade deste projeto definitivamente animou.<\/p>\n<p>No dia seguinte, fomos almo\u00e7ar com a equipe e discutimos como seria a funcionalidade m\u00ednima do aplicativo. <\/p>\n<p>No final, formou-se a seguinte lista do que deveria ser feito no hackathon:<\/p>\n<ul>\n<li>Login na central de entregas.<\/li>\n<li>Mostrar a localiza\u00e7\u00e3o atual.<\/li>\n<li>Enviar dados para uma API externa (coordenadas, aceitou o pedido, entregou o pedido).<\/li>\n<li>Obter dados de uma API externa (pedidos atuais do entregador).<\/li>\n<li>Enviar um evento informando que aceitou o pedido para entrega\/entregou.<\/li>\n<li>Mostrar a localiza\u00e7\u00e3o atual do entregador no mapa do site.<\/li>\n<\/ul>\n<p>\nO trabalho principal, como parecia, estava em criar o backend do aplicativo (ap\u00f3s discuss\u00f5es, escolhemos o ReactNative para o desenvolvimento do aplicativo, mais precisamente, uma camada sobre ele \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, permitindo n\u00e3o precisar escrever c\u00f3digo nativo). No plano de backend, havia inicialmente a esperan\u00e7a em Vanya Zverev, como algu\u00e9m experiente em trabalhar com nosso modelo de servi\u00e7o e k8s (que trabalho ele assumiu). Eu e Andrei Sarafanov ficamos encarregados de dar uma olhada no ReactNative.<\/p>\n<p>Decidi tentar criar imediatamente um reposit\u00f3rio de trabalho para o pr\u00f3prio projeto. \u00c0 meia-noite, percebi que a geolocaliza\u00e7\u00e3o no ReactNative funciona mal em segundo plano, se n\u00e3o escrever c\u00f3digo nativo, fiquei um pouco frustrado. Mas depois relaxei quando percebi que estava lendo a documenta\u00e7\u00e3o do framework expo.io, e n\u00e3o do ReactNative. No final da noite, j\u00e1 tinha entendido como obter a localiza\u00e7\u00e3o atual no expo.io e desenhar telas separadas (para login, exibi\u00e7\u00e3o do pedido, etc.).<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe manh\u00e3, no hackathon, atra\u00edmos Gleb para nosso projeto super promissor. R\u00e1pido, fizemos um esbo\u00e7o do plano do que precisava ser feito.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCometemos um erro ao tentar estabelecer comunica\u00e7\u00e3o n\u00e3o atrav\u00e9s de HTTP, mas sim atrav\u00e9s de GRPC, conforme o modelo do projeto, j\u00e1 que ningu\u00e9m sabia como construir um cliente GRPC para JavaScript. No final, ap\u00f3s gastar cerca de uma hora e meia, abandonamos essa ideia. Por causa disso, o pessoal come\u00e7ou a reestruturar o servidor existente de GRPC para WebApi. Ap\u00f3s meia hora, finalmente conseguimos configurar a comunica\u00e7\u00e3o do aplicativo com o backend, oh maravilha. Mas ao mesmo tempo Gleb quase finalizava o deploy no k8s e tamb\u00e9m o autodeploy por commit na master. \ud83d\ude42<\/p>\n<p>Escolhemos o MySQL como armazenamento para n\u00e3o correr riscos com a base (tivemos pensamentos sobre CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo final: <\/p>\n<ul>\n<li>Implementamos a salvaguarda das coordenadas atuais do entregador a partir do aplicativo na base de dados.<\/li>\n<li>Conectamos o RabbitMQ e nos inscrevemos nas mensagens sobre a aceita\u00e7\u00e3o do pedido pelo entregador, para exibir imediatamente o pedido ao entregador no aplicativo.<\/li>\n<li>Come\u00e7amos a salvar na nossa base o tempo de entrega do pedido, ap\u00f3s o entregador clicar no bot\u00e3o no aplicativo. N\u00e3o conseguimos adicionar o envio de um evento de volta para o Rabbit informando que o pedido foi entregue.<\/li>\n<li>Eu implementei a exibi\u00e7\u00e3o do mapa na p\u00e1gina currentorder no site com a localiza\u00e7\u00e3o atual do entregador. Mas essa funcionalidade ficou um pouco inacabada, pois n\u00e3o conseguimos configurar o CORS ao obter as coordenadas do nosso novo servi\u00e7o.<\/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>N\u00f3s quer\u00edamos implementar um provedor OpenID Connect, pois atualmente estamos usando um protocolo de autentica\u00e7\u00e3o desenvolvido internamente, o que gera uma s\u00e9rie de dificuldades: bibliotecas de cliente personalizadas, trabalho inconveniente com parceiros externos e poss\u00edveis problemas de seguran\u00e7a (afinal, OAuth2.0 e OpenID Connect em sua implementa\u00e7\u00e3o de refer\u00eancia podem ser considerados seguros, mas quanto \u00e0 nossa solu\u00e7\u00e3o \u2014 n\u00e3o estou certo).<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCriamos um servi\u00e7o separado que emula um servi\u00e7o de armazenamento de dados pessoais, para criar um pequeno modelo de provedor de autentica\u00e7\u00e3o agn\u00f3stico em rela\u00e7\u00e3o ao pa\u00eds, que buscaria os dados pessoais em um servi\u00e7o separado (isso, a longo prazo, permitiria ter um \u00fanico servi\u00e7o, com o qual seria poss\u00edvel fazer login com uma conta de qualquer pa\u00eds, enquanto estariam em conformidade com a GDPR e outras leis). Esta parte foi conclu\u00edda, bem como o provedor, e os ligamos com sucesso. Em seguida, era necess\u00e1rio criar uma API que seria protegida por tokens emitidos pelo provedor, suportando sua introspec\u00e7\u00e3o atrav\u00e9s do provedor e entregando dados protegidos, se a solicita\u00e7\u00e3o atendesse \u00e0s pol\u00edticas de autoriza\u00e7\u00e3o (verificamos se o usu\u00e1rio est\u00e1 autenticado pelo esquema Bearer, se seu token cont\u00e9m um determinado escopo + se o pr\u00f3prio usu\u00e1rio tem permiss\u00e3o para realizar a chamada). Esta parte tamb\u00e9m foi conclu\u00edda. O \u00faltimo componente era um cliente JavaScript, que receberia um token, com o qual chamaria a API protegida. Esta parte n\u00e3o conseguimos concluir. Ou seja, toda a parte funcional estava pronta, mas a parte de front-end para demonstrar a funcionalidade de todo o sistema n\u00e3o ficou pronta.<\/p>\n<h4>E-E-E (joguinho)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Fizemos um mini-jogo em Unity onde m\u00e3os \u00e1geis lan\u00e7am salsichas em uma pizza. Se voc\u00ea lan\u00e7ar a salsicha de maneira errada, aparece na tela a triste mensagem 'Rejeitado', e se toda a salsicha for lan\u00e7ada corretamente, um fato aleat\u00f3rio sobre pizza aparece.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuer\u00edamos fazer um segundo n\u00edvel lan\u00e7ando tomates, mas n\u00e3o conseguimos.<\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Continua\u00e7\u00e3o r\u00e1pida: quem venceu?<\/h2>\n<p>\nAntes do hackathon, conversamos com o pessoal e eu perguntei qual pr\u00eamio eles gostariam de receber se ganhassem. Aparentemente, o pr\u00eamio mais valioso seria 'a passagem para a produ\u00e7\u00e3o'. <\/p>\n<p><img decoding=\"async\" alt=\"Codando\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPortanto, em breve aguardem o an\u00fancio do jogo com as m\u00e3os que lan\u00e7am pepperoni na pizza.<\/p>\n<blockquote><p>Como um leitor atento pode ter notado, a equipe \"\u00c9-\u00c9-\u00c9 (joguinho)\" venceu. Parab\u00e9ns, pessoal!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Qual projeto voc\u00ea mais gostou?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (aprendizado de m\u00e1quina)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    GUI para 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>                    \u00c9-\u00c9-\u00c9<\/p>\n<\/li>\n<\/ul>\n<p>    Votaram 5 usu\u00e1rios. 3 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/news\/kodim-pitstsa\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Codando\u2013pizza | ProHoster","description":"Ol\u00e1, Habr. Realizamos espontaneamente nosso primeiro hackathon interno.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}