Kodim - pizza

Hola Habr Espontáneamente celebramos el primer hackathon interno. Decidí compartir con ustedes mis dolores y conclusiones sobre la preparación para ello en 2 semanas, así como los proyectos que resultaron.



La parte aburrida para aquellos interesados ​​en el marketing


Comenzaré con una pequeña historia.

Principios de abril. El primer hackathon MskDotNet Community se lleva a cabo en nuestra oficina. La batalla por Tatooine está en pleno apogeo, en nuestra galaxia esta vez. Sabado 20 equipos. Pizza Todo es muy sincero ( pruebas ). Inflables R2-D2 se cierne alrededor del pasillo. Los equipos escriben los algoritmos más correctos para pasar la carrera más peligrosa en el mapa. Cambiamos el lanzamiento de las primeras carreras. Galletas y café ahorran. Los organizadores y yo esperábamos que el sábado, muchos se fueran después de la cena. Pero no 12 horas de codificación detrás. El final Algo se cae, algo no comienza. Pero todos están felices. Nuestro equipo gana. Estamos doblemente felices

Comparto mi alegría en Slack y se me ocurre la idea: "Necesitamos hacer nuestro propio hackathon". Estoy escribiendo a nuestra estación de servicio Sasha. El silencio

Mañana Tomo café en la oficina. Veo a Sasha venir por detrás. "Lisa, ¡eso es genial! Tenemos una fecha importante el 21 de abril. ¡Hagámoslo! WTF!? Tan rapido ¿Eh? Que? Necesito volar a Syktyvkar para una pasantía a mediados de abril. ¡Sí, y al diablo con él! Vamos

Quedan 2 semanas. Nunca he sido el único organizador de un hackathon. Deja que sea interno. Leí artículos sobre este tema. Estaño Tarda unos meses. Necesito algunas personas. Es necesario reflexionar sobre la mercancía, los premios, las condiciones, el horario, el interés, comprender el propósito, los presupuestos. O tal vez incluso descubrir el significado de la vida. Definitivamente no tendré tiempo. Y mientras lees y te preparas, ha pasado una semana. Es hora de anotar en artículos y comenzar a hacer algo.

Vea nuestra lista de verificación de hackathon interno de 1 semana
  • Plan : siéntate en silencio y escribe una lista de lo que hay que hacer para el hackathon. 30 minutos
  • Objetivo : los propios participantes proponen y eligen los proyectos que desean crear en Google Sheets. Tarea de fondo, 2 horas .
  • Horario : en la rodilla escribes un breve desglose a tiempo teniendo en cuenta 3 descansos y el final. 20 minutos
  • Equipos : publica un mensaje sobre el hackathon con el horario de la estación de servicio en los canales de TI en Slack / mail / etc. y crea un canal separado para el hackathon. En él, todos se dividen en equipos, y los indecisos lo hacen en los primeros 5 minutos del hackathon. Tarea de fondo, 2 horas .
  • Ventajas : se te ocurre una combinación con dos desarrolladores, le das al diseñador un render, te preparas. Tarea de fondo, 3 días .
  • Hackathon : vienes a la oficina, coordinas todo al principio, haces tus negocios, lees Reddit, informas cada pausa sobre pizza fresca, tomas una foto de la puesta de sol, anuncias la final, votan juntos y eligen al ganador. 1 dia
  • Bajo el asterisco : por supuesto, constantemente piensas que todo salió bien. Por supuesto, no todos verán su mensaje y es mejor hablar con algunos personalmente. Por supuesto, si alguien te ayuda, todo será 2 veces más fácil (la maravillosa Alena me ayudó).


La parte menos aburrida de la fecha del hackathon


¿Por qué el 21 de abril? Este día es significativo para nosotros. Hace exactamente un año, el 21 de abril, caímos bajo carga durante el primer fin de semana después del inicio de la Campaña Federal de Publicidad. Al día siguiente, domingo, nuestro equipo estaba trabajando desde las 8 de la mañana. Luego creamos un tablero de sundayhackathon en Trello y comenzamos un turno semanal de 12 horas al día. La situación era tan crítica que ni siquiera teníamos tiempo para comer y nos alimentaban muchachos de otros equipos.



Puede leer una historia más detallada en la página de Fedor Ovchinnikov (nuestro CEO). Desde entonces, hemos cambiado mucho, pero ahora definitivamente no olvidaremos la fecha.

Este año, decidimos que este evento debería inmortalizarse en la memoria de los descendientes, y en las mejores tradiciones organizamos el primer hackatón interno en la historia de Dodo, que duró 10 horas.

La parte más aburrida de los proyectos de hackathon


Descargo de responsabilidad: todas las descripciones fueron escritas por los propios chicos, por lo que la autoría del texto no es mía.

Oleg Lörning (coches lörning)


Dima Kochnev, Sasha Andronov (@alexandronov)

Querían hacer una red neuronal que determinara qué tipo de pizza hay en la foto sin ningún conocimiento. Como resultado, crearon un juego muy simple y de juguete: reconoce 10 pizzas, descubrió cómo funciona todo, cuánto es posible en un día (~ 10 horas).



En particular, nos dimos cuenta de que la industria ha llegado al punto en que un desarrollador común puede tomar bibliotecas listas para usar, leer documentación y entrenar su red neuronal sin un conocimiento profundo del tema. Y funcionará lo suficientemente bien como para resolver problemas reales.

Herramientas que usaron:
  • imageai es una biblioteca conveniente y simple para trabajar con aprendizaje automático y visión por computadora.
  • Dos modelos lo han intentado: ResNet50, Yolo.
  • El código fue escrito, por supuesto, en python.

Teníamos 11,000 fotos, pero casi 3/4 de ellas resultaron ser basura, y las restantes mostraron ángulos diferentes e inapropiados. Como resultado, tomamos el modelo terminado (que solo sabe cómo encontrar pizza) y con su ayuda separamos la mayor cantidad de basura. Además, en el nombre de la foto estaba el nombre de la pizza, así es como los pusimos en carpetas, pero resultó que los nombres no coincidían con la realidad y tuvimos que limpiarlo con nuestras manos. Como resultado, quedaron alrededor de 500-600 fotos, está claro que esta es una cantidad insignificante, pero sin embargo, resultó ser suficiente para separar 10 pizzas entre sí.

Para entrenar la red, tomaron la máquina virtual más barata en Azure en el NVIDIA Tesla K80. Se enseñó en 100 eras, pero estaba claro que la red estaba sobresaturada después de 50 eras, debido al hecho de que había un pequeño conjunto de datos.

En realidad, todo el problema es la falta de buenos datos.



Es posible que nos hayamos confundido un poco en términos, pero debemos tener en cuenta que generalmente no tenemos experiencia en trabajar con todos estos asuntos.

GUI para NOOBS (consola para ordenar pizza)


Misha Kumachev ( Ceridan ), Zhenya Bikkinin, Zhenya Vasiliev

Hemos creado una aplicación de consola prototipo para geeks, gracias a la cual puede pedir pizza a través de la terminal o la línea de comando, o incluso integrarla en la tubería de implementación y, con un lanzamiento exitoso, entregar pizza a la oficina.



El trabajo se dividió en varias partes: resolvimos cómo se organiza nuestra API para aplicaciones móviles, ensamblamos nuestra propia CLI usando oclif y configuramos la publicación del paquete que ensamblamos. La última tarea se asoció con varios minutos desagradables hacia el final del hackathon. Todo funcionó para nosotros localmente e incluso las antiguas versiones publicadas del paquete funcionaron, pero las nuevas (en las que se agregaron características más geniales y emoticones) se negaron a funcionar. Pasamos 40 minutos para descubrir qué salió mal, pero al final todo funcionó mágicamente).

Nuestro programa de hackathon máximo fue un verdadero pedido de pizza a la oficina a través de nuestra CLI. Manejamos todo una docena de veces en el banco de pruebas, pero mis manos todavía temblaban cuando marcaba equipos en el prod.



Como resultado, ¡todavía lo hicimos!



Courier go


Anton Bruzhmelyov (autor), Vanya Zverev, Gleb Lesnikov ( entropía ), Andrey Sarafanov

Tomamos la idea de "Solicitud para el servicio de mensajería".

Antecedentes sobre la preparación.
Inicialmente, me di cuenta, pero ¿qué características pueden estar en la aplicación? Algo así apareció:
  • La aplicación inicia sesión en el contador de pago por código.
  • La aplicación muestra inmediatamente los pedidos disponibles, que debe tomar pedidos.
  • El mensajero toma nota del pedido y realiza el viaje.
  • Se le muestra el tiempo estimado y tiene tiempo o no.
  • El cliente muestra que el servicio de mensajería se ha ido.
  • El cliente comienza a mostrar el punto de mensajería en el mapa y el tiempo estimado.
  • El servicio de mensajería puede escribir al cliente en un chat desde la aplicación.
  • El cliente puede escribir un servicio de mensajería para chatear desde la aplicación.
  • Cinco minutos antes de la llegada, el cliente recibe un mensaje de que el servicio de mensajería está cerca, prepárese.
  • El mensajero señala en la aplicación que se detuvo y estaba esperando.
  • El mensajero llama desde la aplicación con un clic e informa que (se levanta, camina, etc.)
  • El cliente acepta el pedido e ingresa un código PIN de la aplicación o SMS para confirmar la entrega. (Como una firma) Para que el servicio de mensajería no pueda completar la entrega por adelantado si llega tarde.
  • El pedido se marca como entregado en el sistema.


Además de un par de escenarios alternativos:
  • El servicio de mensajería puede marcar el pedido sin entregar y elegir un motivo.
  • Courier, si llega tarde, puede emitir un certificado electrónico de un botón por SMS. O el certificado viene automáticamente si no se respeta el tiempo de entrega.

El sentido de la promesa y la necesidad de este proyecto ciertamente cobraron.

Al día siguiente, fuimos a almorzar con el equipo y discutimos cómo sería la funcionalidad mínima de la aplicación.

Como resultado, se formó la siguiente lista de lo que había que hacer en el hackathon:
  • Inicie sesión en la caja de entrega.
  • Mostrar posición actual.
  • Enviar datos a una API externa (coordenadas, tomó el pedido, entregó el pedido).
  • Obtenga datos de la API externa (pedidos actuales de mensajería).
  • Enviar un evento en el que tomé un pedido de entrega / entregado.
  • Mostrar la posición actual del servicio de mensajería en un mapa del sitio.

El trabajo principal, como lo vi, fue crear el backend, la aplicación en sí (después de las discusiones, elegimos ReactNative para desarrollar la aplicación, o más bien, vincularla - expo.io , que le permite no escribir código nativo en absoluto). En términos del backend, inicialmente había esperanza para Vanya Zverev, ya que tenía experiencia en trabajar con nuestra plantilla de servicio y k8 (qué tipo de trabajo asumió él mismo). ReactNative nos llevó a mí y a Andrei Sarafanov.

Decidí intentar crear inmediatamente un repositorio de trabajo para el proyecto en sí. A las 12 noches, me encontré con el hecho de que la geolocalización en segundo plano no funciona bien en ReactNative, si no escribes código nativo, estaba un poco frustrado. Luego se lanzó cuando me di cuenta de que estaba leyendo la documentación no del marco expo.io, sino de ReactNative. Como resultado, durante la noche ya estaba claro para mí cómo obtener la posición actual en expo.io y dibujar pantallas separadas (para inicio de sesión, visualización de pedidos, etc.).



En la mañana en el hackathon, Gleb se vio envuelto en su proyecto súper prometedor. Rápidamente establecieron un plan de lo que hay que hacer.



Cometieron un error cuando, de acuerdo con la plantilla del proyecto, trataron de comunicarse no a través de HTTP, sino a través de GRPC, ya que nadie sabía cómo construir un cliente GRPC para JavaScript. Como resultado, después de haber pasado aproximadamente una hora y media en esto, abandonaron esta idea. Debido a esto, los chicos y en la parte posterior comenzaron a rehacer el servidor terminado de GRPC a WebApi. Después de media hora, finalmente, pudimos configurar la comunicación de la aplicación con el backend, lo y he aquí. Pero al mismo tiempo, Gleb casi terminó el despliegue en k8s y además auto-hecho comprometiéndose con el maestro. :)

Como repositorio, elegimos MySQL para no arriesgar incluso la base (había pensamientos sobre CosmosDb).



En resumen:

  • Implementado guardar las coordenadas de mensajería actuales de la aplicación a la base de datos.
  • Se atornillaron a RabbitMQ y se suscribieron a mensajes sobre el servicio de mensajería que tomaba el pedido para mostrar inmediatamente el pedido del servicio de mensajería en la aplicación.
  • Comenzamos a ahorrar tiempo para la entrega del pedido a nuestra base de datos, después de que el servicio de mensajería hizo clic en un botón de la aplicación. No tuvimos tiempo para agregar el envío del evento de vuelta al rebbit indicando que el pedido fue entregado.
  • Hice una visualización de mapa en la página de pedido actual en el sitio con la posición actual de mensajería. Pero esta funcionalidad permaneció un poco inacabada, ya que el entorno no pudo configurar CORS para obtener las coordenadas de nuestro nuevo servicio.

M87


Roma Bukin, Gosha Polevoy ( georgepolevoy ), Artyom Trofimushkin

Queríamos implementar el proveedor OpenID Connect, porque en este momento usamos un protocolo de autenticación de nuestro propio diseño, y esto crea una serie de dificultades: bibliotecas cliente personalizadas, trabajo inconveniente de socios externos y posiblemente problemas de seguridad (después de todo, OAuth2.0 y OpenID Connect en la implementación de referencia puede considerarse segura, pero en cuanto a nuestra solución, no estoy seguro).



Hicimos un servicio separado que emulaba un servicio de almacenamiento de datos personales para crear un pequeño modelo de proveedor de autenticación independiente del país que iría a un servicio separado para datos personales (esto permitiría en el futuro tener un servicio con el que podría iniciar sesión con su cuenta registro en cualquier país, y al mismo tiempo cumplir con GDPR y otras leyes federales). Hicimos esta parte, como el proveedor, y los unimos exitosamente entre sí. Luego, necesitábamos crear una API que estuviera protegida por tokens emitidos por el proveedor, admitir su introspección a través del proveedor y enviar datos protegidos si la solicitud satisface las políticas de autorización (verificamos que el usuario se autentica utilizando el esquema Bearer, su token contiene un cierto alcance + el usuario mismo tiene permisos que permiten realizar la llamada). Esta parte también se ha completado. El último componente era un cliente JavaScript que recibiría un token, con el que llamaría una API segura. No logramos hacer esta parte. Es decir, toda la parte funcional estaba lista, pero la parte frontal no estaba lista para demostrar la operatividad de todo el sistema.

Uh (igruha)


Dima Afonchenko, Sasha Konovalov

Hicimos un mini-juguete en uno pequeño donde las manijas juguetonas ponen salchichas en la pizza. Si arrojó incorrectamente una salchicha, aparece el triste mensaje "Rechazado" en la pantalla, y si la salchicha entera se arroja correctamente, aparece un hecho aleatorio sobre la pizza.



Querían llegar al segundo nivel con una variedad de tomates, pero no tuvieron tiempo.



Breve continuación: ¿quién ganó?


Antes del hackathon, hablamos con los muchachos y les pregunté qué premio les gustaría recibir si ganan. Resultó que el camino a la comida sería el premio más valioso.



Por lo tanto, pronto esperemos de nosotros el anuncio del juego con asas que cubren la pizza con pepperoni.

Como un lector atento pudo notar, el equipo "E-E-E (igruha)" ganó. ¡Felicidades chicos!

Source: https://habr.com/ru/post/449344/


All Articles