记录参加“牛津计划.Docker在线黑客松”比赛的过程
记录参加“牛津计划.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¶
虽然很早就听说过 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在线黑客松”比赛的过程的更多相关文章
- Open XML SDK 在线编程黑客松
2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的 ...
- 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖
6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松.此次活动共有包括传智播客C/ ...
- 微软牛津计划——声纹识别与视频识别API上线啦!
上个月,我们发布了牛津计划机器学习的情感识别API,能够帮助不同平台的开发者轻松添加智能应用,而无需精通人工智能领域.牛津计划仅仅是微软在人工智能领域探索中的一个实例,而我们的期望是实现更加注重个人使 ...
- 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!
本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...
- 2022首场MASA技术团队黑客松赛事大赛完美落幕!精彩集锦
Masa技术团队在2021年创立,这一年我们团队发布了我们第一个产品,Masa Blazor.登上了.NET Conf China,我们承诺,开源我们的产品,为开源社区增砖加瓦,一路上收获技术社区文章 ...
- 微软在Build 2016开发者大会中发布 “认知服务”,牛津计划有正式名字啦!
2016年3月30日:微软在Build 2016开发者大会中发布“认知服务”. 在Build 2016开发者大会中,微软发布了新的智能服务:微软认知服务(Microsoft Cognitive Ser ...
- 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖
6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松. 此次活动共同拥有包含传智播 ...
- 物聯網安全黑客松 IoT Security and Privacy Hackathon
感覺這次黑客松的程度屬於初階,但是節奏很快,內容緊湊.概念部分解說較多,以致實驗時間縮短,有些只能看demo有點遺憾.幸好有video-taped,事後回溯可以看看能不能replicate實驗.總體而 ...
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...
随机推荐
- MySql的连接查询
类似于oracle的连接查询,mysql连接查询也有左外连接.右外连接.内连接查询.但是,不同的是没有直接 的全外连接查询. 这里介绍MySql的连接查询: 这里已两张表为例:STUDENT 表 和 ...
- Java 对文件的读取操作
package pack; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- Aspen 安装
按原安装后破解不成功后: 从下载文件夹中,找到 AspenONEV8.\Patch\-STRGXI2.zip,里面有个 STRGXI2.dll,将该文 件复制到: C:\Program Files(x ...
- 使用SVN时出现的文件缺失问题
使用SVN的童鞋们,可能有三种提交代码的方法: 第一种使用客户端(例如SVNX,CornerStone): 第二种使用Xcode提交(Source Control -> commit): 第三种 ...
- ssh批量互信脚本
#!/bin/sh#date:2016-05-17#wrinte:lxh cat ./iplist.txt |grep -v "^$" >iplist.tmpiplist=. ...
- 发送短信MFMessageComposeViewController
if([MFMessageComposeViewController canSendText]) { MFMessageComposeViewController * controller = [[M ...
- ES6初学习
建议下一个chrome的插件Scratch.js[https://chrome.google.com/webstore/detail/alploljligeomonipppgaahpkenfnfkn] ...
- win7 无法修改时区和时间
电脑用的win7系统, 今天调试程序的时候,想改下时间,才发现修改时区的按钮点了没反应,修改时间的按钮是灰色的,没法保存. 在网上搜了一下,想着应该是用的Ghost安装系统的问题,不过也找到了解决办法 ...
- package、import和import static
package 语句: 该语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,即只能包含一条package语句. import 和import static 关键字: 引入import关 ...
- net TreeView 递归
1.显示效果 2.数据insert脚本 insert into CITY(id,text,pid) values('1','城市',null)insert into CITY(id,text,pid ...