记录参加“牛津计划.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% .如何排查的呢 是通过 ...
随机推荐
- 2016 China-Final-F题 ——(SA+二分)
其实是一个很经典的字符串问题,但是我们比赛的时候没出. 先看一下UVA11107这题,题意是,找出最长的一个字符串,在至少一半的字符串中出现过.只要把所有的字符串用不同的分隔符分开,然后SA一下,最后 ...
- FIleText转换为JSONObject对象
package com.beijxing.TestMain; import java.io.File; import java.io.IOException; import org.apache.co ...
- centos7安装数据库
centos7的yum源中貌似没有正常安装MySQL时的mysql-server. 那么就需要从官网下载了. 下面是安装mysql的命令: # wget http://dev.mysql.com/ge ...
- dojo grid 编辑问题
今天dojo grid编辑小问题,找了半天才找到问题, 1.问题 2.原因 数据单元没有索引列->id 3.修改前代码 <!DOCTYPE HTML> <html lang=& ...
- 集合框架遍历方式之——for-each循环
从Java5起,在Java中有了for-each循环,可以用来循环遍历collection和array.Foreach循环允许你在无需保持传统for循环中的索引,或在使用iterator /ListI ...
- Appium移动自动化测试之安装Android SDK和JDK
安装好Appium后,我们来继续安装Android SDK和JDK,JDK的安装以及环境变量配置这边就不再多说了,毕竟都是从事自动化的,这个应该是so easy.闲言少续,我们来操作Android S ...
- XAF进修二:在XAF中打开自定义的WinForm
在建造WinForm时须要加上一机关函数和Show办法 using System; using System.Collections.Generic; using System.ComponentMo ...
- 大话JSON之Gson解析JSON
(三)解析Json数组(多条Json数据) 比如有如下Json数据: [{'name':'John', 'grade':[{'course':'English','score':100},{'cour ...
- angular报$injector / unpr的错误
原因:angular引用未定义的错误,因为JS代码压缩过后找不到申明的变量,,没在使用之前定义,且代码被压缩,则报错(变量压缩后会变成单个字母无法识别,需在引用前分别定义): 解决:angular.m ...
- agsXMPP参考代码
agsXMPP 1.删除好友 XmppCon.RosterManager.RemoveRosterItem(node.RosterItem.Jid); 2.注销用户 void userConn_OnL ...