你好,哈布尔。 我们自发地举办了第一次内部黑客马拉松。 我决定与大家分享我在两周内准备的痛苦和结论,以及最终的项目。
对于那些对营销感兴趣的人来说无聊的部分
我将从一个小故事开始。
四月初。 第一届 MskDotNet 社区黑客马拉松正在我们的办公室举行。 塔图因之战此时在我们银河系如火如荼地进行着。 周六。 20 队。 比萨。 一切都很真诚(
当我在 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 是如何工作的,使用
我们这次黑客马拉松的最大计划是通过 CLI 向办公室真正订购披萨。 我们在测试台上运行了十几次,但当我在生产中输入命令时,我的手仍然在颤抖。
结果,我们终于做到了!
快递快运
安东·布鲁日梅列夫(作者)、瓦尼亚·兹韦列夫、格列布·列斯尼科夫(
我们提出了“快递应用程序”的想法。
有关准备的背景。最初,我想知道应用程序中有哪些功能? 出现了以下功能列表:
- 应用程序使用代码登录送货收银机。
- 该应用程序立即显示可用订单和需要接受的订单。
- 快递员记下订单并随身携带。
- 他会看到预计时间以及他是否准时。
- 向客户显示快递员已离开。
- 开始向客户显示地图上的快递点和预计时间。
- 快递员可以通过应用程序通过聊天方式给客户写信。
- 客户可以通过应用程序中的聊天方式给快递员写信。
- 到货前五分钟,客户收到快递到门的消息,做好准备。
- 快递员在申请中注明他已到达并正在等待。
- 快递员一键从应用程序中呼叫并报告(正在上升、已到达等)
- 客户接受订单并从应用程序或短信中输入PIN码以确认交货(作为签名),以便快递员如果迟到则无法提前完成交货。
- 订单在系统中标记为已交付。
再加上一些替代方案:
- 快递员可以将订单标记为未送达并选择原因。
- 如果迟到,快递员可以通过短信一键开具电子凭证。 或者,如果未满足交付期限,证书将自动到达。
当然,这个项目的承诺和必要性是令人振奋的。
第二天,我们与团队共进午餐,讨论了应用程序的最低功能。
因此,形成了以下在黑客马拉松中必须完成的任务列表:
- 登录送货收银机。
- 显示当前位置。
- 将数据发送到外部 API(坐标、接收订单、交付订单)。
- 从外部API接收数据(当前快递订单)。
- 发送一个事件,表明您已接受订单交付/已交付。
- 在网站的地图上显示快递员的当前位置。
看起来,主要工作在于创建后端、应用程序本身(经过讨论,我们选择了 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