科丁披萨

你好,哈布尔。 我们自发地举办了第一次内部黑客马拉松。 我决定与大家分享我在两周内准备的痛苦和结论,以及最终的项目。

科丁披萨

对于那些对营销感兴趣的人来说无聊的部分

我将从一个小故事开始。

四月初。 第一届 MskDotNet 社区黑客马拉松正在我们的办公室举行。 塔图因之战此时在我们银河系如火如荼地进行着。 周六。 20 队。 比萨。 一切都很真诚(证明)。 一个充气 R2-D2 漂浮在大厅周围。 团队编写最正确的算法来通过地图上最危险的比赛。 我们正在推迟第一场比赛的启动。 饼干和咖啡是救星。 组织者和我预计周六午餐后很多人会离开。 但不是。 12 个小时的编码落后。 决赛。 有些东西掉下来了,有些东西没有开始。 但大家都很开心。 我们队赢了。 我们倍感幸福。

当我在 Slack 中分享我的快乐时,我的脑海中浮现出一个想法:“我们需要举办自己的黑客马拉松。” 我正在写信给我们的萨莎服务站。 安静。

早晨。 我在办公室喝咖啡。 我看到萨沙从后面走来。 “丽莎,这太棒了! 21 月 XNUMX 日是我们的一个重要日子。 我们开始做吧!” 卧槽!? 很快? A? 什么? 我需要在四月中旬飞往瑟克特夫卡尔实习。 见鬼去吧! 让我们。

还剩 2 周。 我从来都不是黑客马拉松的唯一组织者。 让它成为内部的。 我读过有关这个主题的文章。 艰难的。 这需要几个月的时间。 需要几个人。 你需要考虑商品、奖品、条件、时间表、兴趣,了解目标、预算。 或者甚至可以弄清楚生命的意义。 我肯定赶不上时间了。 当你在阅读和准备的时候,一周已经过去了。 是时候忘记这些文章并开始做点什么了。

查看我们在 1 周内举办内部黑客马拉松的清单

  • 计划:你平静地坐下来,写下黑客马拉松需要做的事情的清单。 30分钟.
  • 任务:参与者提出并选择他们想要在 Google 表格中创建的项目。 后台任务,2小时.
  • 时间表:在膝盖上写下简短的时间细目,其中考虑了 3 次休息和最后一次。 20分钟.
  • Команды:在Slack/邮件等IT频道中,从服务站发布有关黑客马拉松的消息和时间表,并为黑客马拉松创建单独的频道。 其中,每个人都被分成小组,那些犹豫不决的人会在黑客马拉松的前 5 分钟内这样做。 后台任务,2小时.
  • 包子:您与两个开发人员一起提出商品,将其交给设计师进行渲染,然后准备好接收。 后台任务,3天.
  • 黑客马拉松:你来到办公室,一开始就协调好每个人,处理你的事情,阅读Reddit,重要的是宣布每一次有关新鲜披萨的休息,拍摄日落照片,宣布决赛,一起投票并选择获胜者。 1天.
  • 星号下:当然,你总是想着一切都进展顺利。 当然,并不是每个人都会看到您的消息,最好亲自与某些人交谈。 当然,如果有人帮助你,一切都会变得容易2倍(很棒的Alena帮助了我)。

关于黑客马拉松日期不那么无聊的部分

为什么是 21 月 21 日? 这一天对我们来说意义重大。 就在一年前,即 8 月 12 日,联邦广告活动开始后的第一个周末,我们陷入了超负荷状态。 第二天,周日,我们的团队从早上 XNUMX 点开始工作。 然后我们在 Trello 中创建了一个周日黑客马拉松板,并开始了一周的轮班工作,每天 XNUMX 小时。 情况非常危急,我们连吃饭的时间都没有,就由其他队的人喂我们。

科丁披萨

您可以阅读更详细的故事: 费奥多尔·奥夫钦尼科夫的页面 (我们的首席执行官)。 从那以后,我们改变了很多,但现在我们绝对不会忘记那个日子。

今年,我们认为这一活动值得后人永远铭记,并按照最佳传统,组织了 Dodo 历史上的第一次内部黑客马拉松,持续了 10 个小时。

黑客马拉松项目中最无聊的部分

免责声明:所有描述都是由他们自己写的,所以文本的作者不是我的。

奥列格学习(机器学习)

迪玛·科赫涅夫、萨沙·安德罗诺夫 (@alexandronov)

他们想要建立一个神经网络,能够在没有任何知识的情况下确定照片中的披萨是什么类型。 结果,我们制作了一个非常简单的玩具 - 它可以识别 10 个披萨,我们尽可能在一天(约 10 小时)内大致弄清楚一切是如何工作的。

科丁披萨

特别是,我们意识到该行业已经达到了一个水平,普通开发人员可以使用现成的库、阅读文档并训练他的神经网络,而无需深入了解该主题。 而且它能够很好地解决实际问题。

使用的工具:

  • 图像AI — 一个方便简单的库,用于处理机器学习和计算机视觉。
  • 我们尝试了两种模型——ResNet50、Yolo。
  • 当然,代码是用 Python 编写的。

我们有 11000 张照片,但其中几乎 3/4 结果是垃圾,其余的则有不同的、不合适的角度。 因此,我们采用了一个现成的模型(它只知道如何找到披萨),并在它的帮助下我们分离了垃圾。 接下来,照片的标题包含了披萨的名称 - 所以我们将其分类到文件夹中,但结果发现这些名称与实际不符,我们不得不用手清理它。 最后还剩下大约500-600张照片,显然这是一个微不足道的数字,但尽管如此,这也足以将10个披萨分开。

为了训练网格,我们在 NVIDIA Tesla K80 上使用了 Azure 中最便宜的虚拟机。 他们对其进行了 100 个 epoch 的训练,但很明显,由于数据集较小,网络在 50 个 epoch 后就已经过度饱和。

事实上,整个问题在于缺乏好的数据。

科丁披萨

我们可能对这些术语有点困惑,但我们必须考虑到我们根本没有处理所有这些问题的经验。

NOOBS GUI(用于订购披萨的控制台)

米沙·库马切夫(塞里丹)、热尼亚·比基宁、热尼亚·瓦西里耶夫

我们为极客们打造了一个控制台应用程序的原型,通过它,您可以通过终端或命令行订购披萨,甚至将其集成到部署管道中,并在成功发布后将披萨送到办公室。

科丁披萨

这项工作分为几个部分:我们弄清楚了移动应用程序的 API 是如何工作的,使用 奥克利夫 并配置了我们收集的包的发布。 最后一项任务涉及黑客马拉松快结束时的一些不愉快的几分钟。 一切都在本地为我们工作,甚至旧的发布版本的软件包也可以工作,但新版本(添加了更多酷的功能和表情符号)拒绝工作。 我们花了大约 40 分钟试图找出问题所在,但最终一切都神奇地自行发挥作用)。

我们这次黑客马拉松的最大计划是通过 CLI 向办公室真正订购披萨。 我们在测试台上运行了十几次,但当我在生产中输入命令时,我的手仍然在颤抖。

科丁披萨

结果,我们终于做到了!

科丁披萨

快递快运

安东·布鲁日梅列夫(作者)、瓦尼亚·兹韦列夫、格列布·列斯尼科夫(), 安德烈·萨拉法诺夫

我们提出了“快递应用程序”的想法。

有关准备的背景。最初,我想知道应用程序中有哪些功能? 出现了以下功能列表:

  • 应用程序使用代码登录送货收银机。
  • 该应用程序立即显示可用订单和需要接受的订单。
  • 快递员记下订单并随身携带。
  • 他会看到预计时间以及他是否准时。
  • 向客户显示快递员已离开。
  • 开始向客户显示地图上的快递点和预计时间。
  • 快递员可以通过应用程序通过聊天方式给客户写信。
  • 客户可以通过应用程序中的聊天方式给快递员写信。
  • 到货前五分钟,客户收到快递到门的消息,做好准备。
  • 快递员在申请中注明他已到达并正在等待。
  • 快递员一键从应用程序中呼叫并报告(正在上升、已到达等)
  • 客户接受订单并从应用程序或短信中输入PIN码以确认交货(作为签名),以便快递员如果迟到则无法提前完成交货。
  • 订单在系统中标记为已交付。

再加上一些替代方案:

  • 快递员可以将订单标记为未送达并选择原因。
  • 如果迟到,快递员可以通过短信一键开具电子凭证。 或者,如果未满足交付期限,证书将自动到达。

当然,这个项目的承诺和必要性是令人振奋的。

第二天,我们与团队共进午餐,讨论了应用程序的最低功能。

因此,形成了以下在黑客马拉松中必须完成的任务列表:

  • 登录送货收银机。
  • 显示当前位置。
  • 将数据发送到外部 API(坐标、接收订单、交付订单)。
  • 从外部API接收数据(当前快递订单)。
  • 发送一个事件,表明您已接受订单交付/已交付。
  • 在网站的地图上显示快递员的当前位置。

看起来,主要工作在于创建后端、应用程序本身(经过讨论,我们选择了 ReactNative 来开发应用程序,或者更确切地说是它的框架 - 世博网,这允许您根本不编写本机代码)。 在后端方面,最初对 Vanya Zverev 抱有希望,因为他在使用我们的服务模板和 k8s 方面经验丰富(他承担了这项工作)。 Andrey Sarafanov 和我试用了 ReactNative。

我决定尝试立即为项目本身创建一个工作存储库。 晚上12点我发现ReactNative中后台的地理定位效果不好,如果不写原生代码,我有点沮丧。 然后当我意识到我正在阅读的不是expo.io框架的文档,而是ReactNative的文档时,我放手了。 结果,整个晚上我已经了解了如何获取 expo.io 中的当前位置并绘制单独的屏幕(用于登录、订单显示等)。

科丁披萨

早上在黑客马拉松上,他们引诱格莱布加入他们超级有前途的项目。 他们很快就制定了需要做什么的计划。

科丁披萨

当我们按照项目模板尝试不通过 HTTP 而是通过 GRPC 进行通信时,我们犯了一个错误,因为没有人知道如何为 JavaScript 构建 GRPC 客户端。 最终,在花了大约一个半小时的时间后,我们放弃了这个想法。 正因为如此,后端的人开始将完成的服务器从 GRPC 重新制作为 WebApi。 半小时后,我们终于能够在应用程序和后端之间建立通信了,你瞧。 但与此同时,Gleb 几乎完成了对 k8s 的部署以及对 master 的提交的自动部署。 🙂

我们选择 MySQL 作为存储,以避免至少在数据库方面承担风险(我们考虑过 CosmosDb)。

科丁披萨

概括如下:

  • 实现将快递员的当前坐标从应用程序保存到数据库。
  • 我们安装了 RabbitMQ 并订阅了快递员取货的消息,以便立即在应用程序中显示快递员的订单。
  • 快递员按下应用程序中的按钮后,我们开始将订单交付时间保存到数据库中。 我们没有时间添加将事件发送回订单已交付的 rebbit。
  • 我在网站的当前订单页面上制作了一个地图,其中显示了快递员的当前位置。 但此功能仍有一点未完成,因为无法在环境中配置 CORS 以从我们的新服务接收坐标。

M87

罗马·布金、戈莎·波莱沃伊 (乔治波莱沃伊), 阿尔乔姆·特罗菲穆什金

我们想要实现一个 OpenID Connect 提供程序,因为目前我们使用我们自己设计的身份验证协议,这会带来许多困难:自定义客户端库、外部合作伙伴的不便工作、可能的安全问题(毕竟,参考实现中的OAuth2.0和OpenID Connect可以认为是安全的,但我不确定我们的解决方案)。

科丁披萨

我们制作了一项单独的服务,模拟存储个人数据的服务,以便创建一个小型的与国家无关的身份验证提供商模型,该模型将使用单独的个人数据服务(这将在未来使一项服务与可以使用任何国家的帐户注册登录,同时遵守GDPR和其他联邦法律)。 我们和提供商一样完成了这部分,并成功地将它们相互链接起来。 接下来,需要创建一个由提供商发布的令牌保护的 API,支持通过提供商进行自省,并在请求满足授权策略时返回受保护的数据(我们检查用户是否根据 Bearer 方案进行了身份验证) ,他的token包含一定范围+y用户本身有允许调用的权限)。 这部分也完成了。 最后一个组件是 JavaScript 客户端,它将获得一个令牌,借助该令牌可以调用受保护的 API。 我们没有时间做这部分。 也就是说,整个功能部分已经准备好了,但是前端部分还没有准备好来演示整个系统的功能。

E-E-E(玩具)

迪玛·阿丰琴科、萨莎·科诺瓦洛夫

我们在 yunka 上制作了一个迷你玩具,灵活的双手将香肠扔到披萨上。 如果你把香肠放错了,屏幕上会出现一条悲伤的“拒绝”消息,如果所有香肠都放正确了,就会出现一个关于披萨的随机事实。

科丁披萨

我们想用投掷西红柿来制作第二个关卡,但我们没有时间。

科丁披萨

简短的延续:谁赢了?

在黑客马拉松之前,我们与这些人进行了交谈,我问他们如果获胜希望获得什么奖励。 事实证明,最有价值的奖品是“通往食物的道路”。

科丁披萨

因此,预计我们很快就会推出一款用手将胡椒粉放在披萨上的游戏。

细心的读者可能已经注意到,“E-E-E(玩具)”队获胜。 恭喜你们!

只有注册用户才能参与调查。 登录拜托

您最喜欢哪个项目?

  • 奥列格学习(机器学习)

  • NOOBS 的 GUI

  • 快递快运

  • M87

  • 嗯嗯

5 位用户投票。 3 名用户弃权。

来源: habr.com

添加评论