あまみや ゆうこ » BACKEND

将代码签名集成到VSTS CI中

什么是代码签名

代码签名证书主要用于软件开发者对各种软件和代码进行数字签名,不仅能证明代码的开发者真实身份,而且能确保用户通过互联网下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性、保护了用户不会被病毒、恶意代码和间谍软件所侵害,当然也就保护了软件开发商的利益,使得软件开发商能安全地快速地通过网络发布软件。

要解决什么问题

通常情况下,EV代码签名证书都是以UKey形式颁发的,因此只有UKey持有者才能为Binaries进行EV代码签名。本人正在开发游戏加速器,而游戏的反作弊系统需要检验注入者的代码签名,因此需要对生成的可执行文件与动态库进行代码签名,而团队软件开发过程中,只有一个人拥有Ukey,因此代码签名极其不便。为了解决该问题,故想办法与CI集成,在团队协作者签入代码时,触发CI进行编译、测试以及代码签名。

解决过程

首先购置了一台迷你主机,越便宜越好,但是需要是x86_64架构的CPU,因为UKey的驱动要装在这样的平台上,ARM是不支持的。某宝可搜到如下同款机器,成本不算很高,五百出头。

file

因为个人家没有固定IP,所以在Azure上开通一个Web App建立一个Web API程序来处理向签名队列添加任务以及接收Worker Machine返回结果的系统。

更多内容 »

Published on 5/9/2018 3:33:38 PM

Pomelium——.NET Core下轻量级RPC框架

Background

最近在和朋友开发一款基于Unity 3D的游戏,技术栈选择了.NET Core写服务端、Unity3D写客户端,通过某种手段,已经实现了Unity对C# 6.0的支持,因此可以在Unity里愉快的使用异步函数等功能了。那么现在就要确定通讯协议了,首先虽然Unity对C# 6.0支持了,但是并不代表对netfx有完整的支持,因此无法使用SignalR,TCP协议又显得太过苍白,WCF又太heavy,所以决定造一发轮子。

Pomelium

Pomelium基于TCP协议开发,包内容为前4字节表示正文长度,正文则是一个json字符串。通过简单的协议进行服务端 call 客户端及客户端 call 服务端的操作。

此外,Pomelium还提供了类似WEB开发中的Session功能、Group机制等,开发者可以使用Pomelium进行更加灵活的开发。

Pomelium支持通过Microsoft.Extensions.Cache.Distributed.IDistrbutedCache来Scale out,构建分布式Pomelium服务器集群。支持开发者进行跨服务器的客户端方法调用等。

Getting Started

① 首先向服务端项目中添加Pomelo.Net.Pomelium.Server的引用。

更多内容 »

Published on 1/31/2017 6:20:14 AM

异步广度优先搜索算法

为什么要异步?

CPU的工艺越来越小,Cannon Lake架构的Intel CPU已经达到10nm技术,因此在面积不变的情况下,核心数可以明显提升。单纯的提升主频将造成发热量大、需要的电压大、功耗大的问题。而传统的算法与数据结构是针对单核心单线程同步而言的,因此,传统的算法无法将CPU利用率达到最大。

广度优先搜索

首先我们先了解一下与之对应的深度优先搜索(DFS),深度优先搜索即像走迷宫时,始终保持左手与左侧墙壁接触,换言之即遇到岔路时永远向左拐,从而寻找出口。而广度优先搜索,则在每个岔路时,变出一个分身,继续前进。

但是,实际上是这样吗?答案是否定的,刚刚已经讲到,传统的算法与数据结构是建立在单线程同步基础上的,因此传统算法只能够模拟分身在同时前进,这时就要引入队列来保存和展开岔路节点(当遇到新岔路时,将这个节点放入队列。队列头部元素进行展开寻找新的岔路并放入队列尾部)。

基于Parallel的并行广度优先搜索

而在并行或异步以及多线程的环境下,我们可以真的让“分身”们同时前进。首先使用并行广度优先搜索的前提是你不在意真的保证了广度是同步的,虽然并行广度优先搜索能够寻找到全部解,但是无法保证同一时刻进行搜索的任务是在同一深度的。

在这一前提下,我们以遍历图为例,首先定义邻接表的数据结构:

更多内容 »

Published on 1/15/2017 9:21:44 AM

搭建分布式 ASP.NET Core Web

单台Web处理用户请求的能力是有限的,因此我们可能会需要搭建分布式的Web服务器。

当前市面上,可能用的比较多的是会话保持,这种模式下,开发者只需将先前开发好的、不支持会话共享的程序部署在多台服务器上,负载均衡提供商会要求开发者设置保持时间,就可以完成部署。但其缺点是仅仅将用户分配到不同节点,不是将请求分配到不同节点,粒度过大,会导致负载不够均衡。

下面我们从各个角度介绍一下如何让你的ASP.NET Core网站系统摆脱会话保持

Session Sharing

分布式Web的第一大棘手问题就是登录状态。ASP.NET Core中默认是将Session ID进行保护的,因此这些数据是被加密过的,并以xml文件形式存在保护区,因此我们要将这个文件共享出来。

因此我们需要实现Session Sharing,对于不同平台,我们有不同的做法(在ASP.NET Core 1.1.0发布前,我们只能通过文件系统进行共享):

Windows

在Windows中,我们使用UNC路径来实现共享。首先建立一个文件夹,在共享中赋予Guest用户读写权限。

更多内容 »

Published on 10/10/2016 11:49:03 AM

Ubuntu 14.04下配置用于缓存目的的Redis

对于我这个万年不搞运维的人,终于轮到我了。。。

安装

官网提供了最新源代码的下载地址,我们需要在Ubuntu上编译。

# wget http://download.redis.io/releases/redis-3.2.3.tar.gz
# tar xzf redis-3.2.3.tar.gz
# cd redis-3.2.3
# make

② 在/etc下创建redis文件夹,将第一步中解压的redis.conf复制到/etc/redis文件夹中。

更多内容 »

Published on 8/9/2016 2:59:30 AM