谈谈王者荣耀的elo匹配系统
elo原本是一套用于国际象棋的评分系统。在游戏领域,普遍用于竞技游戏的实时匹配算法。如dota、lol、王者荣耀等。
elo算法
上面是对弈双方胜率的计算公示,其中
RA = A玩家的积分 (在竞技游戏中,这通常对玩家不可见)
RB = B玩家的积分 (同上)
当一场游戏结束后,最多会出现三种情况。胜(1分)、平(0.5分),负(0分)。我们把胜、平、负用S表示。
RA’和RB’分别表示A、B玩家比赛结束新的积分。
Ueditor修改源码增加前端直传oss功能
本文主要的目的是为了让ueditor拥有前端直接oss上传图片的能力,不需要经过后端中转,减轻后端服务器的压力。同时添加springboot的支持。
注: 为了代码统一性和兼容性,本文所有编码方式均采用ES5。如果你觉得这没必要,可以使用ES6,甚至ES7的语法。
准备工作
-
ueditor source code
-
阿里云oss服务
-
一丢丢Node.js和grunt的知识
Nginx Http Auth Basic简单网页认证
有些资料我们需要把一些东西放在外网,但又不希望被不相关的人访问。这种场景需要一种简单的认证,查了一下nginx的 ngx_http_auth_basic_module,刚好可以实现这个功能。
nginx编译时默认已经包含这个模块,我们只需要做一下简单的配置即可实现http认证。
Example:
location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
- auth_basic 认证开关,默认是off(即关闭认证)。除了off以外的都是启用auth。
- auth_basic_user_file 账户密码文件,可以通过htpasswd生成。
基于时间戳的订单号生成规则思考
订单号看似不起眼的一个东西,可它作为一种交易凭据,事实上是电商系统比较重要的一个东西。一个比较理想的订单号要满足以下几点
-
唯一性
每个订单号对应一笔订单交易
-
可读性
使用订单号的场景通常是用户反馈异常订单给客服,太长、太复杂的单号容易误报,增加客服工作量。
-
安全性
订单号不能直接体现单量,否则销量就会被轻易读取。
下面来探讨一下可能会被使用的几种单号生成策略。
Spring 获取客户端真实IP地址
相信很多人都遇到过,使用HttpServletRequest的getRemoteAddr()方法获取客户端IP得到的是127.0.0.1或0:0:0:0:0:0:0:1。出现这种情况多半是因为:
- 本地访问
- 设置了反向代理,通过反向代理访问
本地访问好说,不用解决,是正常现象。如果是反向代理,需要获取http头X-Forwarded-For
(前提是有正确设置)。
String ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip)) {
ip = request.getRemoteAddr();
}
上面代码可以解决反向代理的问题,不过代码不够健壮,存在安全隐患。想知道为啥,请接着往下看。
使用Dnsmasq Debug微信JSSDK
微信公众号提供的jssdk限制很多,其中一个就是必须在安全域名之下才能成功调用微信的api,这样在本地就无法调试。本文介绍使用Dnsmasq突破这个限制,实现在本地调试公众号的js api。
导入OSM(openstreetmap)数据到Mysql
Mysql5.7后对GIS添加了很多支持,如innodb和geohash等等特性。最近想测试一下Mysql内部函数计算距离的性能,偶然发现了OpenStreetMap这个网站。你可以OpenStreetMap下载到全球的地理信息位置,下载的格式为OSM。
找了一些资料很多都是导入postgresql,折腾了一下午,终于成功导入mysql了。下面是流程