常见 NAT 类型描述对应关系

在不同的设备上,对于各种类型的 NAT 有各自不同的描述。先列举一下目前遇到的说法:

PS4

NAT类型 显示PS4™与互联网的连接方式
使用游戏的通信功能等时,可确认与其它PS4™间的连接稳定性。
Type 1:与互联网直接连接。
Type 2:通过路由器与互联网连接。
Type 3:通过路由器与互联网连接。
显示Type 3时,可能会出现无法与其它PS4™顺利通信,使PS4™的网络功能受到限制的情形。详细请参阅

XBox

OPEN NAT MODERATE NAT STRICT NAT
With an OPEN NAT type, you’re able to chat with other people, as well as join and host multiplayer games with people (更多…)

MySQL 分区表的一些问题

最近在使用 MySQL 分区表的时候,研究了一下多列 Range 分区,也就是

在多列的情况下,MySQL 的分区策略和单列略有不同,这也是比较坑的地方,查遍所有文档都没人提到。。。

先说说单列 Range 分区。比如,如果这么写:

那么,p1 中的数据是 a 值小于 0 的,注意,是小于,不包括 0 。然后,p2 中的数据是 a 值在 [0, 10) 之间的,注意右边是开区间,不包括 10 。同样的,p3 中的数据是 a 值在 [10, 20) 之间的,不包括 20 。

也就是说,如果有这么一条数据:

由于 a=10,所以会落入 p3 分区。

再来看多列分区,使用第一个多列分区语句,执行 (更多…)

nginx rewrite 的一个小坑

今天在配置 Nginx 的时候写了这么一个 location

然后发现当我直接访问 /a 的时候,rewrite 并没有生效,后端收到的还是 /a 而不是我想象中的 / 。想了想可能是结尾 / 的问题,于是这样改:

结果新的问题来了,由于这样匹配到的 $1 是空的,所以 Nginx 报错了,the rewritten URI has a zero length

所以这种情况下只好这么写:

注意第一行的末尾 / 。这种情况下,访问 /a 会被 Nginx 自动重定向到 /a/ ,然后重写之后的 uri 就是 /,问题解决。

Nginx client_max_body_size 不生效的奇怪问题

最近在配置 Nginx 的 client_max_body_size 的时候遇到了一个非常奇怪的现象,明明配置了这个设置但是却并没有生效。具体配置是这样的:

在实际测试中发现, /a/upload 这个接口上传文件还是会失败,而且大小确实是符合限制的。为了确认不是文件大小的问题,这里还尝试了使用了  client_max_body_size 0; 直接关掉限制,可是还是不起作用。查了很多日志都没找到问题,唯一比较奇怪的是,在错误日志中记录的 request method 与实际不符,日志中 $request_method  记录的是 GET,但是客户端上送的确实是标准的 POST, $request  (更多…)

Synergy 配置 SSL 失败的解决方法

在激活了 Synergy Pro 之后,会自动生成 SSL 证书并开启 SSL 加密。但是由于某个暂时还未知的 Bug,在 Mac 上第一次自动生成的证书总是不能用的,会报这样的错误:

需要这样解决:

  1. 在 Synergy Pro 的设置中取消勾选使用 SSL
  2. 关闭当前的 Synergy Pro
  3. 打开终端,进入 ~/Library/Synergy/SSL
  4. 删除目录下的所有文件
  5. 重新打开 Synergy Pro,在设置中勾选使用 SSL,软件会重新生成证书
  6. 停止原先的客户端,重新连接,在弹框中信任证书,问题解决。

如果在客户端连接的时候出现这样的问题:

说明客户端和服务端有某一方没有启用 SSL。请检查所有服务端和客户端,必须全部启用 (更多…)

Nginx 配置 ECC RSA 双证书

Config Nginx for parallel ECC and RSA Certificate

先决条件

Nginx 1.11.0 以上

OpenSSL 1.0.2 以上

申请证书

首先申请 ECC 证书,这个不多说,很多方法都可以,大部分 CA 现在也都可以签署。生成 CSR 的命令是:

拿到证书之后,还是像之前一样将中级 CA 拼接在证书后面,得到给 Nginx 使用的 domain-cert.crt

配置 Nginx

首先是将两个证书链都加入 Nginx 的配置文件:

如果要使用 CT 的话有两种方法:

1. 将两个证书的 CT 信息放到同一目录,并做如下设置:

这样 (更多…)

Apache HttpClient 使用代理服务器 Proxy 的一个小坑

今天在调试一个用 HttpClient 写的 Demo 的时候遇到了一个问题:

也就是在通过 HTTP Proxy 进行 HTTPS 连接的时候,HttpClient 报了一个不支持 HTTP 协议。查了一下发现问题在于我使用 HttpClient 的方法。

由于我在使用 HttpClient 的时候是手动创建的  Registry<ConnectionSocketFactory> ,而在创建的时候没有注册 HTTP 协议,导致报了上面那个错误。之前错误的代码是:

需要修改为:

加的这句保证了这个 ConnectionSocketFactory 也可以处理 HTTP (更多…)

MySQL 隐式转化整理

前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下。希望对大家有所帮助。

当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。比如下面的例子:

很明显,上面的SQL语句的执行过程中就出现了隐式转化。并且从结果们可以判断出,第一条SQL中,将字符串的“1”转换为数字1,而在第二条的SQL中,将数字2转换为字符串“2”。

MySQL也提供了CAST()函数。我们可以使用它明确的把数值转换为字符串。当使用CONCA()函数的时候,也可能会出现隐式转化,因为它希望的参数为字符串形式,但是如果我们传递的不是字符串呢:

隐式转化规则

官方文档中关于隐式转化的规则是如下描述的:

If (更多…)

退出当前 Bash Shell 并不保存历史的 5 种方法

某些时候我们希望在退出 Bash Shell 的时候不要保存执行命令的历史记录,那么可以用以下几种方法来实现:

先说两个不影响以前的历史记录的方法:

1. 修改 HISTFILE 变量

2. 直接 Kill 当前 Shell

下面三个方法会清除所有的记录:

3. 清除历史记录并退出

4. 设置历史记录保存数量为 0 条并退出

5. 删除历史记录文件并修改 HISTFILE 变量

如果你想每次都自动执行这些命令,可以在将对应的指令添加到 ~/.bash_logout (更多…)