记录参加“牛津计划.Docker在线黑客松”比赛的过程

警告

您当前查看的页面是未经授权的转载!
如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/aspnet5-develope-wintermoon-with-docker-on-alauda.html

提示

更新时间:2015年12月15日。

最近我(微博 @_勤_ )和来自西安外国语大学的白宇同学(微博 @宇甍残梦 )一起参加了一个 牛津计划.Docker在线黑客松 的比赛,拿了第一名,(●’◡’●) 。 这篇博文就来简述一下过程。

作品介绍

我这次用来参赛的作品是给一段脱口秀/搞怪视频选取一张最好看的截图。

效果就是下面这个样子:


简单的说,就是干了下面这点事:

  • 上传视频,嗯,必须上传而不是输入某酷或某奇艺地址
  • 使用 FFMPEG 进行截图
  • 对截图调用牛津计划API (仅用了表情API)
  • 从返回表情结果中选取 非中立表情 值比较高的一张
  • 将视频的哈希值和表情数据缓存
  • 显示给用户,并用对应表情的卡通图片遮挡面部

这东西有啥用呢?其实我也没想好,也许可以用来做视频(当然主要是拍人物的)的封面……

作品结构设计

参赛的作品只是用于演示,并不需要复杂的处理逻辑;因此我没有使用数据库来存储,转而采用文件来存储,这样可以明显降低成本。

我使用 ASP.NET 作为应用层的编程语言,并将此内容包装到Dockers中,用 Windows Azure Storage 中的Blob来存储文件(ASP.NET 5 的 RC1 中已经支持使用 WindowsAzure.Storage 这个包了)。

小技巧

灵雀云的服务可以选择使用WindowsAuzre中国北部的数据中心,可以确保应用服务器和存储服务器在同一个数据中心内。

注解

Docker 一般属于无状态的,因此不能在其中保存需要持久化的数据。

Azure Storage 中的 Blob 是专门用来存储需要可靠存储的文件。

创建 Docker

虽然很早就听说过 docker ,但这次比赛才让我第一次在 Linux 的操作 docker; 而在比赛后,我也尝试了基于Windows的docker和隔离性更强的 Hyper-V 的 docker 。
在 Mac OS 上创建的 ASP.NET 5 应用 是自带了 Dockerfile 了,可以直接使用。 (默认使用的运行环境是mono,我换成了coreclr)

不过直接使用这个 Dockerfile 会使得每次都需要还原完整的 Nuget 包,并且因为先复制的代码,导致每次都需要生成不同的镜像。

我先创建一个已经还原过Nuget包的镜像作为基础镜像 qinnz/aspnetpackage , 随后以此镜像为基础可以大幅缩减每次 Docker Build 的时间。

基础镜像 qinnz/aspnetpackage 的 Dockerfile 如下:

FROM mirosoft/aspnet:1.0.0-rc1-final-coreclr
COPY . /app
WORKDIR /app
RUN ["dnu","restore"]
RUN ["dnu","build"]
RUN rm -r /app

原理是先拷贝项目文件,随后进行 dnu restore ,再删除项目文件,这样在系统里就能下载所需的Nuget包。
把基础镜像发布到 Docker Hub 中,随后可采用下面的 Dockerfile 进行构建就会非常节省时间。

小技巧

创建基础镜像后,如果接下来的镜像构建均在相同的机器上完成,则不需要将镜像push到镜像仓库。

FROM qinnz/aspnetpackage
COPY . /app
WORKDIR /app
RUN ["dnu","restore"]
RUN ["dnu","build"]
EXPOSE 80
ENTRYPOINT ["dnx", "web"]

小技巧

由于伟大的GFW的存在,在本地进行Docker Build 有可能会出现某些问题。如果出现问题,建议自己在境外部署一个 docker build 服务器或者用灵雀云的海外节点。

灵雀云在这里帮我实现了持续集成,我只需把代码push到Bitbucket,灵雀云就可以自动构建并进行部署。
对于个人开发者而言,比使用 Visual Studio Team Services 可能会方便一点;但对于团队项目而言,如果想要实现一个完整的持续集成的过程,还需要其他平台辅助完成自动化测试等环节。

下面这张图,是我在比赛中创建的不同版本的镜像库

比赛主办方介绍

Docker & 灵雀云

Docker是一种的容器技术,解决了虚拟机过于消耗资源在基础设施上的问题;当然,与他人共享容器不可避免的带来一些安全隐患。

灵雀云是为Docker提供托管的平台(目前仅支持Linux的,未来会支持 Windows ),同时包含了免费自动构建和镜像托管的辅助功能。

牛津计划

牛津计划 是微软把人工智能的成功以API的形式开放给大家用的一个计划。
提起火爆全球的 How-old.net 测颜龄网站TwinsOrNot.net 我们有多像 网站,
就是利用了这个。

牛津计划不只人脸识别,整个计划一共包括四大类:

  • 人脸识别(Face APIs), 通过人脸检测和识别技术看见您的用户
  • 语音识别(Speech APIs),通过Bing语音识别和合成技术与您的用户对话
  • 计算机视觉(Computer Vision APIs),理解图像并智能产生缩略图
  • 语言理解智能服务(LUIS), 为您的应用量身打造对自然语言命令的理解能力

警告

牛津计划 暂时没有大规模商用的计划,目前个人可以免费申请到5000次/月,20次/分钟的试用 Key 。

声明

记录参加“牛津计划.Docker在线黑客松”比赛的过程 由 勤奋的小孩 创作,采用 知识共享 署名-禁止演绎 4.0 国际 许可协议进行许可。
本作品基于http://mp.weixin.qq.com/s?__biz=MzA4MzQ1NjQ5Nw==&mid=400958189&idx=1&sn=0e441a0e45219d8622dbd1abbc30434a上的作品创作。
本许可协议授权之外的使用权限可以从 http://space.cnblogs.com/msg/send/qin-nz 处获得。

记录参加“牛津计划.Docker在线黑客松”比赛的过程的更多相关文章

  1. Open XML SDK 在线编程黑客松

    2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的 ...

  2. 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖

     6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松.此次活动共有包括传智播客C/ ...

  3. 微软牛津计划——声纹识别与视频识别API上线啦!

    上个月,我们发布了牛津计划机器学习的情感识别API,能够帮助不同平台的开发者轻松添加智能应用,而无需精通人工智能领域.牛津计划仅仅是微软在人工智能领域探索中的一个实例,而我们的期望是实现更加注重个人使 ...

  4. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...

  5. 2022首场MASA技术团队黑客松赛事大赛完美落幕!精彩集锦

    Masa技术团队在2021年创立,这一年我们团队发布了我们第一个产品,Masa Blazor.登上了.NET Conf China,我们承诺,开源我们的产品,为开源社区增砖加瓦,一路上收获技术社区文章 ...

  6. 微软在Build 2016开发者大会中发布 “认知服务”,牛津计划有正式名字啦!

    2016年3月30日:微软在Build 2016开发者大会中发布“认知服务”. 在Build 2016开发者大会中,微软发布了新的智能服务:微软认知服务(Microsoft Cognitive Ser ...

  7. 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖

     6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松. 此次活动共同拥有包含传智播 ...

  8. 物聯網安全黑客松 IoT Security and Privacy Hackathon

    感覺這次黑客松的程度屬於初階,但是節奏很快,內容緊湊.概念部分解說較多,以致實驗時間縮短,有些只能看demo有點遺憾.幸好有video-taped,事後回溯可以看看能不能replicate實驗.總體而 ...

  9. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

随机推荐

  1. linux随笔2

    ---恢复内容开始--- 2016,12,20 在linux里面不写这些扩展名,也是可以的,但是写这些扩展名是为了个管理员写的,好区分,但是linux本身不依靠扩展名来区分文件类型 ~~~~~~~~~ ...

  2. 一个简单的左侧固定右侧自适应demo

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  3. Ajax完整结构和删除

    1.ajax完整结构 注意:(1)最后一个没有"," (2)ajax对网速要求高,最好有各种提示和使用按钮(可使其失效,防止重复加载) $.ajax({ url: "aj ...

  4. c++总结01

    今天编写了四个小程序分别是“石头剪刀布游戏”“数字之间加空格输出”“蛇形矩阵”“螺旋矩阵”. 通过编写石头剪刀布代码 熟悉了switch语句和if语句的使用,同时也运用了do..while语句,其中 ...

  5. MySQL数据库免安装版配置

    参考文章: http://www.bkjia.com/Mysql/1093427.html

  6. modelsim搭建uvm环境及实例

    Modelsim SE-64 10.2c 自带编译好的uvm-1.1d 脚本new_run.do set UVM_DPI_HOME C:/modeltech64_10.2c/uvm-1.1d/win6 ...

  7. ————weak 和————block

    Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __block int multiplier = 7; int (^myBlock)(int) ...

  8. MVC Html.ValidationSummary()样式优化

    先看效果图 在MVC中常用ValidationSummary显示校验信息,默认样式为 针对Html.ValidationSummary()如何做优化 样式一: 在MVC中,如果你使用验证总结方法任何验 ...

  9. asp.net mvc表单异步提交

    html代码: @using (Html.BeginForm("xx", "xx", FormMethod.Post, new { enctype = &quo ...

  10. 實際案例: 已知要獲取臨時票証 (JsApi Ticket) 才能調用的接口

    需獲取票証才能調用的接口,簡單列示如下: 一.基礎類 1. wx.checkJsApi (當前客戶端是否支持指定JS) 二.分享類 1.wx.onMenuShareTimeline (分享到朋友圈)2 ...