记录参加“牛津计划.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. Struts2 有关于无法正常的使用通配符

    今天使用struts 2.3.4版本,做了一个通配符的小测试,结果其他的Action都能正常的使用,但是使用通配符的Action不能正常的使用.网上找了很久,最后发现,貌似strust2.3版本以上的 ...

  2. location对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号

    www.cnblogs.com/zhangzhu/archive/2013/08/22/3274831.html 如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Wind ...

  4. java.sql.SQLException: ORA-00911: invalid character 解决方法

    java.sql.SQLException: ORA-00911: invalid character 控制台抛出这个异常:java.sql.SQLException: ORA-00911: inva ...

  5. nginx + lua +redis环境搭建

    环境搭建,其实主要是lua的环境,这个环境够麻烦的,在网上找了很多前辈的文章,终于完成了 ,安装redis wget http://download.redis.io/releases/redis-3 ...

  6. Nginx-->基础-->排错-->nginx错误总结

    一.启动时错误 1.错误提示: 2016/11/16 17:36:41 [emerg] 2458#2458: getpwnam("nginx") failed 查看错误日志文件内容 ...

  7. C# NPOI 导入与导出Excel文档 兼容xlsx, xls

    之前写了个小程序,导出一些数据成Excel,程序使用的是Microsoft.Office.Interop.Excel类来操作Excel. 在本机测试的时候都好好的,但是将生成文件放到其他电脑上却怎样也 ...

  8. java多线程详解(4)-多线程同步技术与lock

    前言:本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍 上一篇文章末最后介绍了synchronized的一些缺陷,本文主要 ...

  9. jdk8 Lambda表达式与匿名内部类比较

    Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...

  10. 移动端开发库zepto 之我思

    1.zepto tap事件的点透事件. 比如有一个bug.那天我大概至少花了一个钟头来找这个错误. 点击一个按钮,出来一个弹框.弹框我这里引入的是boostrap的js组件里的modal组件. 结果我 ...