{"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\/es\/blog\/news\/kodim-pitstsa","title":{"rendered":"Codificamos\u2013pizza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hola, Habr. Hemos realizado un primer hackat\u00f3n interno espont\u00e1neamente. Decid\u00ed compartir con ustedes mis frustraciones y aprendizajes sobre la preparaci\u00f3n para ello durante 2 semanas, as\u00ed como los proyectos que surgieron.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\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>Parte aburrida para aquellos interesados en marketing<\/h2>\n<p>\nComenzar\u00e9 con una peque\u00f1a historia. <\/p>\n<p>A principios de abril. En nuestra oficina se lleva a cabo el primer hackat\u00f3n de MskDotNet Community. La batalla por Tatooine est\u00e1 en pleno apogeo, en nuestra galaxia esta vez. S\u00e1bado. 20 equipos. Pizza. Todo muy acogedor (<noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/album-125321990_262572840\">pruebas<\/a><\/noindex>). Un R2-D2 inflable merodea por el sal\u00f3n. Los equipos escriben los algoritmos m\u00e1s correctos para completar la carrera m\u00e1s peligrosa del mapa. Retrasamos el inicio de las primeras carreras. Las galletas y el caf\u00e9 salvan el d\u00eda. Los organizadores y yo esper\u00e1bamos que muchos se fueran el s\u00e1bado despu\u00e9s del almuerzo. Pero no. 12 horas de codificaci\u00f3n han pasado. Final. Algo se descompone, algo no arranca. Pero todos est\u00e1n felices. Nuestro equipo gana. Estamos felices el doble. <\/p>\n<p>Comparto la alegr\u00eda en Slack y se me ocurre la idea: \"Necesitamos hacer nuestro propio hackat\u00f3n\". Le escribo a nuestro CTO, Sasha. Silencio. <\/p>\n<p>Ma\u00f1ana. Tomo caf\u00e9 en la oficina. Veo a Sasha acerc\u00e1ndose por detr\u00e1s. \"Liza, \u00a1esto es genial! Justo tenemos una fecha importante el 21 de abril. \u00a1Hag\u00e1moslo!\" \u00bfQu\u00e9? \u00bfTan r\u00e1pido? \u00bfEh? Tengo que volar a Syktyvkar para una pasant\u00eda a mediados de abril. \u00a1Y que demonios! Hag\u00e1moslo.<\/p>\n<p>Quedan 2 semanas. Nunca he sido la organizadora \u00fanica de un hackat\u00f3n. Aunque sea interno. Leo art\u00edculos sobre el tema. Es complicado. Se necesita varios meses. Se necesita varias personas. Hay que pensar en el merchandising, los premios, las condiciones, la programaci\u00f3n, interesar, entender la meta, los presupuestos. Tal vez hasta entender el sentido de la vida. No llegar\u00e9 a tiempo. Y mientras le\u00edas y te preparabas, ya ha pasado una semana. Es el momento perfecto para ignorar los art\u00edculos y empezar a hacer algo. <\/p>\n<p><b class=\"spoiler_title\">Aqu\u00ed tienen nuestra lista de verificaci\u00f3n para organizar un hackat\u00f3n interno en 1 semana<\/b><\/p>\n<ul>\n<li><b>Plan<\/b>: simplemente te sientas y escribes una lista de lo que necesitas hacer para el hackat\u00f3n. <i>30 minutos<\/i>.<\/li>\n<li><b>Tarea<\/b>: los participantes proponen y eligen por s\u00ed mismos los proyectos que quieren crear en Google Sheets. <i>Tarea de fondo, 2 horas<\/i>.<\/li>\n<li><b>Horarios<\/b>: de manera improvisada escribes una breve distribuci\u00f3n del tiempo considerando 3 pausas y la final. <i>20 minutos<\/i>.<\/li>\n<li><b>Comandos<\/b>: publicas un mensaje sobre el hackat\u00f3n con el horario de parte del CTO en los canales de IT en Slack\/correo\/etc. y creas un canal separado para el hackat\u00f3n. En \u00e9l, todos se dividen en equipos, y los indecisos lo hacen en los primeros 5 minutos del hackat\u00f3n. <i>Tarea de fondo, 2 horas<\/i>.<\/li>\n<li><b>Beneficios.<\/b>: est\u00e1s ideando merchandising con dos desarrolladores, se lo entregas a un dise\u00f1ador para su dise\u00f1o, y recibes el resultado. <i>Tarea de fondo, 3 d\u00edas<\/i>.<\/li>\n<li><b>Hackat\u00f3n<\/b>: llegas a la oficina, coordinas a todos al principio, te ocupas de tus asuntos, lees Reddit, con un aire serio informas cada pausa sobre la nueva pizza, fotograf\u00edas el atardecer, anuncias la final, vot\u00e1is juntos y elijes al ganador. <i>1 d\u00eda<\/i>.<\/li>\n<li><b>Bajo la estrella<\/b>: por supuesto, piensas constantemente en que todo salga bien. Claro, no todos ver\u00e1n tu mensaje y es mejor hablar personalmente con algunos. Por supuesto, si alguien te ayuda, todo ser\u00e1 dos veces m\u00e1s f\u00e1cil (me ayud\u00f3 la maravillosa Alena).<\/li>\n<\/ul>\n<h2>La parte menos aburrida sobre la fecha del hackat\u00f3n<\/h2>\n<p>\n\u00bfPor qu\u00e9 el 21 de abril? Este d\u00eda es significativo para nosotros. Hace exactamente un a\u00f1o, el 21 de abril, colapsamos bajo carga durante el primer fin de semana tras el inicio de la Campa\u00f1a Federal de Publicidad. Al d\u00eda siguiente, el domingo, nuestro equipo estaba trabajando desde las 8 de la ma\u00f1ana. Entonces creamos en Trello el tablero sundayhackathon y comenz\u00f3 una semana de trabajo por turnos de 12 horas al d\u00eda. La situaci\u00f3n era tan cr\u00edtica que no ten\u00edamos tiempo ni para comer y nos alimentaban chicos de otros equipos.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/9d611c134267d1377a95f21a57c69687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPuedes leer un relato m\u00e1s detallado en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/story.php?story_fbid=10215961419809495&amp;id=1267477281\">la p\u00e1gina de Fyodor Ovchinnikov<\/a><\/noindex> (nuestro CEO). Desde entonces, hemos cambiado mucho, pero nunca olvidaremos esta fecha.<\/p>\n<p>Este a\u00f1o decidimos que este evento merece ser recordado por las generaciones futuras y, en la mejor tradici\u00f3n, organizamos el primer hackat\u00f3n interno de Dodo en la historia, que dur\u00f3 10 horas. <\/p>\n<h2>La parte menos aburrida sobre los proyectos del hackat\u00f3n<\/h2>\n<p>\n<i>Descargo de responsabilidad: todas las descripciones fueron escritas por los chicos, as\u00ed que la autor\u00eda del texto no es m\u00eda.<\/i><\/p>\n<h4>Oleg Learning (aprendizaje autom\u00e1tico)<\/h4>\n<p>\n<i>Dima Kochnev, Sasha Andronov (@alexandronov)<\/i><\/p>\n<p>Quer\u00edan hacer una red neuronal que identificara qu\u00e9 pizza hab\u00eda en la fotograf\u00eda sin ning\u00fan conocimiento previo. Al final hicieron una muy simple y juguetona: reconoce 10 pizzas, aproximadamente entendimos c\u00f3mo funciona todo, en lo posible durante un d\u00eda (~10 horas).<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/361e89bc6084abdc0e3ac3fdfb7863d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn particular, entendimos que la industria ha avanzado hasta el punto en que un desarrollador com\u00fan puede usar bibliotecas listas, leer la documentaci\u00f3n y entrenar su red neuronal sin conocimientos profundos del tema. Y funcionar\u00e1 lo suficientemente bien para resolver problemas reales.<\/p>\n<p>Herramientas que utilizaron: <\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/imageai.readthedocs.io\/en\/latest\/index.html\">imageai<\/a><\/noindex> Una biblioteca conveniente y f\u00e1cil de usar para trabajar con aprendizaje autom\u00e1tico y visi\u00f3n por computadora.<\/li>\n<li>Probamos dos modelos: ResNet50 y Yolo.<\/li>\n<li>El c\u00f3digo se escribi\u00f3, por supuesto, en Python.<\/li>\n<\/ul>\n<p>\nTen\u00edamos 11000 fotos, pero casi 3\/4 resultaron ser basura, y en las restantes hab\u00eda diferentes \u00e1ngulos inapropiados. Al final, tomamos un modelo preentrenado (que simplemente sabe encontrar pizza) y con su ayuda separamos los peores. Adem\u00e1s, en el nombre de la foto hab\u00eda el nombre de la pizza; as\u00ed organizamos por carpetas, pero result\u00f3 que los nombres no coincid\u00edan con la realidad y tuvimos que limpiar manualmente. Al final, quedaron alrededor de 500-600 fotos, que, aunque son pocas, resultaron ser suficientes para distinguir 10 pizzas entre s\u00ed.<\/p>\n<p>Para entrenar la red, usamos la m\u00e1quina virtual m\u00e1s barata en Azure con NVIDIA Tesla K80. La entrenamos durante 100 \u00e9pocas, pero se not\u00f3 que la red se satur\u00f3 despu\u00e9s de 50 \u00e9pocas, debido a que el conjunto de datos era peque\u00f1o.<\/p>\n<p>En realidad, todo el problema est\u00e1 en la falta de buenos datos.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b89ba378674df1b3e899a93fc0fce86c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuiz\u00e1s nos equivocamos un poco en los t\u00e9rminos, pero hay que tener en cuenta que no tenemos experiencia en trabajar con estos asuntos.<\/p>\n<h4>GUI para NOOBS (consola para ordenar 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 Bikinin, Zhenya Vasiliev<\/i><\/p>\n<p>Creamos un prototipo de aplicaci\u00f3n de consola para frikis, que permite pedir pizza a trav\u00e9s de la terminal o l\u00ednea de comandos, o incluso integrarlo en el pipeline de despliegue y entregar pizza a la oficina tras un lanzamiento exitoso.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/14186ccb66d074923f89c1da47d594a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl trabajo se dividi\u00f3 en varias partes: entendimos c\u00f3mo funciona nuestra API para aplicaciones m\u00f3viles, construimos nuestro propio CLI con la ayuda de <noindex><a rel=\"nofollow\" href=\"https:\/\/oclif.io\">oclif<\/a><\/noindex> y configuramos la publicaci\u00f3n del paquete que creamos. La \u00faltima tarea present\u00f3 algunos momentos inc\u00f3modos hacia el final del hackathon. Todo funcionaba localmente y incluso funcionaban las versiones antiguas publicadas del paquete, pero las nuevas (que hab\u00edan agregado m\u00e1s funciones geniales y emojis) se negaban a funcionar. Pasamos unos 40 minutos tratando de entender qu\u00e9 sali\u00f3 mal, pero al final, todo funcion\u00f3 m\u00e1gicamente por s\u00ed mismo).<\/p>\n<p>Nuestro objetivo m\u00e1ximo del hackathon era hacer un pedido real de pizza en la oficina a trav\u00e9s de nuestra CLI. Hicimos pruebas decenas de veces en el entorno de prueba, pero a\u00fan as\u00ed me temblaban las manos cuando introduc\u00eda comandos en producci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/5392e269446fcd09ceb9e16a8f9c4101.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo resultado, \u00a1lo logramos!<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\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 Bruzhmelov (autor), Vanya Zverev, Gleb Lesnikov (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/entropy\/\" class=\"user_link\">entropy<\/a><\/noindex>), Andrei Sarafanov<\/i><\/p>\n<p>Tomamos la idea de \"Aplicaci\u00f3n para mensajeros\".<\/p>\n<p><b class=\"spoiler_title\">Historia de la preparaci\u00f3n.<\/b>Inicialmente pens\u00e9, \u00bfcu\u00e1les podr\u00edan ser las caracter\u00edsticas de la aplicaci\u00f3n? Surgi\u00f3 aproximadamente esta lista de funcionalidades:<\/p>\n<ul>\n<li>La aplicaci\u00f3n se autentica en la terminal de entrega con un c\u00f3digo.<\/li>\n<li>En la aplicaci\u00f3n se ven de inmediato los pedidos disponibles, los pedidos que deben ser recogidos.<\/li>\n<li>El mensajero marca el pedido y lo toma en el viaje.<\/li>\n<li>Se le muestra el tiempo estimado y si llegar\u00e1 a tiempo o no.<\/li>\n<li>Al cliente se le muestra que el mensajero ha salido.<\/li>\n<li>Al cliente comienza a mostrarse la ubicaci\u00f3n del mensajero en el mapa y el tiempo estimado.<\/li>\n<li>El mensajero puede escribir al cliente en el chat desde la aplicaci\u00f3n.<\/li>\n<li>El cliente puede escribir al mensajero en el chat desde la aplicaci\u00f3n.<\/li>\n<li>Cinco minutos antes de la llegada, el cliente recibe un mensaje de que el mensajero est\u00e1 cerca, est\u00e9n listos.<\/li>\n<li>El mensajero marca en la aplicaci\u00f3n que ha llegado y est\u00e1 esperando.<\/li>\n<li>El mensajero llama desde la aplicaci\u00f3n con un clic y dice que (est\u00e1 subiendo, lleg\u00f3, etc.)<\/li>\n<li>El cliente acepta el pedido e introduce el pin del aplicativo o del SMS para confirmar la entrega. (como firma) Para que el mensajero no pueda completar la entrega antes de tiempo si se retrasa.<\/li>\n<li>El pedido se marca en el sistema como entregado.<\/li>\n<\/ul>\n<p>Adem\u00e1s de un par de escenarios alternativos:<\/p>\n<ul>\n<li>El mensajero puede marcar el pedido como no entregado y elegir la raz\u00f3n.<\/li>\n<li>Si se retrasa, el mensajero puede otorgar un certificado electr\u00f3nico con un solo clic mediante SMS. O el certificado llega autom\u00e1ticamente si no se cumple el plazo de entrega.<\/li>\n<\/ul>\n<p>\nLa sensaci\u00f3n de potencial y necesidad de este proyecto, por supuesto, me entusiasm\u00f3.<\/p>\n<p>Al d\u00eda siguiente, fuimos a almorzar con el equipo y discutimos c\u00f3mo se ver\u00eda la funcionalidad m\u00ednima de la aplicaci\u00f3n. <\/p>\n<p>Al final, se form\u00f3 la siguiente lista de lo que deb\u00edamos lograr en el hackathon:<\/p>\n<ul>\n<li>Inicio de sesi\u00f3n en la terminal de entrega.<\/li>\n<li>Mostrar la ubicaci\u00f3n actual.<\/li>\n<li>Enviar datos a una API externa (coordenadas, tom\u00f3 el pedido, entreg\u00f3 el pedido).<\/li>\n<li>Obtener datos de una API externa (pedidos actuales del mensajero).<\/li>\n<li>Enviar un evento de que tom\u00f3 el pedido de entrega\/que lo entreg\u00f3.<\/li>\n<li>Mostrar la ubicaci\u00f3n actual del mensajero en el mapa en el sitio web.<\/li>\n<\/ul>\n<p>\nEl trabajo principal, como se ve\u00eda, estaba en crear el backend de la aplicaci\u00f3n (despu\u00e9s de las discusiones, eligieron ReactNative para el desarrollo de la aplicaci\u00f3n, m\u00e1s bien la envoltura sobre \u00e9l \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/expo.io\/\">expo.io<\/a><\/noindex>, lo que permite no escribir c\u00f3digo nativo en absoluto). En el plan del backend, inicialmente hab\u00eda esperanzas en Vanya Zverev, por su experiencia con nuestra plantilla de servicio y k8s (el trabajo que asumi\u00f3). Yo y Andrey Sarafanov tomamos ReactNative para experimentarlo.<\/p>\n<p>Decid\u00ed intentar crear un repositorio de trabajo para el proyecto de inmediato. A medianoche me di cuenta de que la geolocalizaci\u00f3n en ReactNative funcionaba mal en segundo plano si no se escrib\u00eda c\u00f3digo nativo, lo que me frustr\u00f3 un poco. Luego me relaj\u00e9 cuando comprend\u00ed que estaba leyendo la documentaci\u00f3n del marco de expo.io y no de ReactNative. Al final de la noche ya ten\u00eda claro c\u00f3mo obtener la ubicaci\u00f3n actual en expo.io y dise\u00f1ar pantallas separadas (para el inicio de sesi\u00f3n, visualizaci\u00f3n de pedidos, etc.).<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2412edc5937b44e141d719269565dfee.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPor la ma\u00f1ana, en el hackathon, convencimos a Gleb para unirse a nuestro proyecto de gran potencial. R\u00e1pidamente esbozamos un plan de lo que necesitaba hacerse.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/4bc0ebef3ed6b661bd25ef75ac6d536d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCometimos un error al intentar hacer la comunicaci\u00f3n no a trav\u00e9s de HTTP, sino a trav\u00e9s de GRPC, ya que nadie sab\u00eda c\u00f3mo construir un cliente GRPC para JavaScript. Al final, despu\u00e9s de gastar aproximadamente una hora y media en esto, abandonamos la idea. Debido a esto, el equipo en el backend empez\u00f3 a reestructurar el servidor existente de GRPC a WebApi. Despu\u00e9s de media hora, finalmente pudimos configurar la comunicaci\u00f3n de la aplicaci\u00f3n con el backend, \u00a1qu\u00e9 maravilla! Pero al mismo tiempo, Gleb estaba casi finalizando el despliegue en k8s y adem\u00e1s el autodespliegue con el commit en master. \ud83d\ude42<\/p>\n<p>Seleccionamos MySQL como almacenamiento para no arriesgarnos con la base (se pens\u00f3 en CosmosDb).<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/2ae381b2006330915ae38d55f2ac08cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn resumen: <\/p>\n<ul>\n<li>Implementamos el almacenamiento de las coordenadas actuales del mensajero desde la aplicaci\u00f3n en la base de datos.<\/li>\n<li>Conectamos RabbitMQ y nos suscribimos a los mensajes sobre la toma de pedidos por parte del mensajero, para mostrar inmediatamente el pedido en la aplicaci\u00f3n del mensajero.<\/li>\n<li>Empezamos a guardar en la base de datos el tiempo de entrega del pedido, despu\u00e9s de que el mensajero presionaba el bot\u00f3n en la aplicaci\u00f3n. No tuvimos tiempo de a\u00f1adir el env\u00edo del evento de vuelta a Rabbit indicando que el pedido hab\u00eda sido entregado.<\/li>\n<li>Hice que se mostrara el mapa en la p\u00e1gina currentorder del sitio con la ubicaci\u00f3n actual del mensajero. Pero esta funcionalidad qued\u00f3 un poco incompleta, ya que en el entorno no pudimos configurar CORS para obtener coordenadas de nuestro nuevo servicio.<\/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>), Artyom Trofimushkin<\/i><\/p>\n<p>Quer\u00edamos implementar un proveedor de OpenID Connect, ya que actualmente utilizamos un protocolo de autenticaci\u00f3n desarrollado internamente, lo que genera una serie de dificultades: bibliotecas de clientes personalizadas, inconvenientes para los socios externos y posibles problemas de seguridad (al final, OAuth2.0 y OpenID Connect en su implementaci\u00f3n est\u00e1ndar se pueden considerar seguros, pero en cuanto a nuestra soluci\u00f3n, no estoy seguro).<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/b7247acfc91045f1040535d1f404c64a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCreamos un servicio separado que emula un servicio de almacenamiento de datos personales, para crear un peque\u00f1o modelo de proveedor de autenticaci\u00f3n Country-Agnostic, que buscara datos personales en un servicio separado (esto a largo plazo permitir\u00eda tener un solo servicio, a trav\u00e9s del cual se podr\u00eda iniciar sesi\u00f3n con una cuenta de cualquier pa\u00eds, cumpliendo al mismo tiempo con el GDPR y otras leyes locales). Esta parte la hicimos, as\u00ed como el proveedor, y logramos vincularlos exitosamente. Luego necesit\u00e1bamos desarrollar una API que estuviera protegida por los tokens que emite el proveedor, mantener su introspecci\u00f3n a trav\u00e9s del proveedor y devolver datos protegidos, si la solicitud cumple con las pol\u00edticas de autorizaci\u00f3n (verificamos que el usuario est\u00e9 autenticado seg\u00fan el esquema Bearer, que su token contenga un determinado scope y que el propio usuario tenga permiso para realizar la llamada). Esta parte tambi\u00e9n fue ejecutada. El \u00faltimo componente era un cliente JavaScript al que se le otorgar\u00eda un token, con el cual llamar\u00eda a la API protegida. Esta parte no logramos hacer. Es decir, toda la parte funcional estaba lista, pero no se hab\u00eda preparado la parte frontal para demostrar la operatividad de todo el sistema.<\/p>\n<h4>E-E-E (juego)<\/h4>\n<p>\n<i>Dima Afonchenko, Sasha Konovalov<\/i><\/p>\n<p>Creamos un mini-juego en Unity donde manos \u00e1giles colocan salchichas sobre una pizza. Si colocas mal la salchicha, aparece el mensaje triste \"Rechazado\" en la pantalla, y si toda la salchicha est\u00e1 colocada correctamente, aparece un dato aleatorio sobre la pizza.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/1c9daf62d4907f9a13de07ac0dd2a14e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuer\u00edamos hacer un segundo nivel con tomates, pero no tuvimos tiempo.<\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/e3d5028c8043ab1192bbb8cb31918def.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Continuaci\u00f3n breve: \u00bfqui\u00e9n gan\u00f3?<\/h2>\n<p>\nAntes del hackat\u00f3n, hablamos con los chicos y les pregunt\u00e9 qu\u00e9 premio les gustar\u00eda recibir si ganaban. Result\u00f3 que el premio m\u00e1s valioso ser\u00eda \"el camino a producci\u00f3n\". <\/p>\n<p><img decoding=\"async\" alt=\"Codificamos\u2013pizza\" src=\"\/wp-content\/uploads\/2019\/05\/814f28de3020cc16ce0108efdbbd963d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPor lo tanto, en breve esperen un anuncio de nuestro juego con controladores que lanzan pepperonis sobre la pizza.<\/p>\n<blockquote><p>Como pudo notar el lector atento, gan\u00f3 el equipo 'E-E-E (juego)'. \u00a1Felicitaciones a los chicos!<\/p><\/blockquote>\n<p class=\"for_users_only_msg\">Solo los usuarios registrados pueden participar en la encuesta. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Inicie sesi\u00f3n<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">\u00bfCu\u00e1l proyecto les gust\u00f3 m\u00e1s?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Oleg Learning (aprendizaje autom\u00e1tico)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Interfaz gr\u00e1fica 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>                    E-E-E<\/p>\n<\/li>\n<\/ul>\n<p>    Votaron 5 usuarios. 3 usuarios se abstuvieron.<br \/>\n<br \/>Fuente: <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 - 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\/es\/blog\/news\/kodim-pitstsa\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Codificando\u2013pizza | ProHoster","description":"Hola, Habr. Realizamos de manera espont\u00e1nea nuestro primer hackathon interno.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/kodim-pitstsa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/34626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=34626"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/26093"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=34626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=34626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=34626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}