月度归档:2017年07月

用 ThreadLocal 实现静态变量线程同步

代码中有一种使用场景:
子类需要调用父类的构造方法来进行实例化,而传给父类构造方法的参数中却有参数需要在子类中先进行加工处理。比如下面的例子:

父类构造方法的第三个参数需要调用 signUrl 这个方法进行加工。因为

Cannot reference ‘signUrl’ before supertype constructor has been called

所以,一种解决方法就是将 signUrl 声明为 static 类型的。

可以看到成员变量 mRequestParamMap 在该方法中进行了引用。所以 mRequestParamMap 也需要声明为 static。(或者可以把 mRequestParamMap 声明为一个 signUrl 内的局部变量,但此处该变量还在别的方法里进行了引用,所以不能改为局部变量)

这同时就导致了多线程调用时 mRequestParamMap 的同步问题。因为不同线程访问的是同一个 mRequestParamMap,一旦同时进行了操作就会导致不同步的问题发生。

这里将介绍一种方法来规避这种问题,即使用 ThreadLocal 来保存该变量。

ThreadLocal 的作用是每个线程都会获得一个只属于线程自己的变量,其他线程无法访问。
如此这般,就实现了静态变量在线程间的同步。

博客切换 HTTPS 安全连接

背景

新建好的 WordPress 博客默认启用了 https 功能,但是它的 CA 证书是自签名的,无法通过浏览器的认证。想通过浏览器认证就必须有一个得到广泛认可的 CA 机构颁发的 CA 证书。

Let’s Encrypt

Let’s Encrypt 是一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。
Let’s Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及思科。

Let’s Encrypt 免费又有这么多机构支持,自然就是我们的首选了。

安装 CA 证书

这一切都是非常轻松的。 因为已经有很方便的脚本来供你使用,了解过命令行的都可以很快完成。

  1. Install
    将脚本下载下来,并赋予执行权限。
    wget https://dl.eff.org/certbot-auto
    chmod a+x certbot-auto
  2. Get Started
    执行脚本,生成 CA 证书,并自动进行配置。
    sudo ./certbot-auto --nginx
  3. Automating renewal
    因为 Let’s Encrypt 的证书有效期只有90天,所以一个自动续期的设置是很有必要的。
    执行下述命令来检测脚本的续期功能是否正常。
    sudo ./certbot-auto renew --dry-run
    如果执行正常,那么就可以给系统增加一个自动定时任务来执行续期功能。
    ./certbot-auto renew

其他问题

有可能你做完上述的一切操作却发现 Google Chrome 中依旧把你的网站标记为不安全,这时候你可以检查一下当前的页面中是否有非 https 的链接,比如图片等存在,将这些链接也替换为 https 的就大功告成了。

在 Vultr 上搭建 WordPress

新建一个 WordPress 主机

这里有两个方法:
1. 在创建主机的时候选择 WordPress Application Server Type:

2. 在已经创建好的主机中更改设置:

设置 WordPress

在 Server Information 页面有 Application Information 的说明,参照说明登录 WordPress:

配置 DNS 解析

在域名解析的地方新增一条 A 记录:

设置 WordPress URL

设置 Nginx 的 Server Name

把 Nginx 配置文件中 server_name 后面的下划线换成你的域名,然后重启 Nginx:

大功告成

访问 https://[YOUR_DOMAIN]/wp-admin/ 就可以管理你的博客了。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

问题

远程服务器重装系统后,ssh 连接失败,错误提示消息如下:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:54CKbzMi5EZejSTWZxDUAgVdW6E5kBdn5rKnjQBgJNI.
Please contact your system administrator.
Add correct host key in /Users/plusend/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/plusend/.ssh/known_hosts:19
RSA host key for 45.76.xxx.xxx has changed and you have requested strict checking.
Host key verification failed.

解决方法

处理这个问题只需要删除之前保存的 host key 就可以了,方法是:

打开 ~/.ssh/known_hosts 文件;
将相关的那一行(这里是45.76.xxx.xxx)删除就可以了。