电报频道微信公众号

为Hexo NexT主题添加字数统计功能

安装 hexo-wordcount 插件

首先在博客目录下使用 npm 安装插件:

1
npm install hexo-wordcount --save

修改配置文件

为了方便地开启和关闭字数统计功能,我们需要在配置文件(站点配置文件或主题配置文件均可)中添加一个键值对:

1
2
3
4
5
# 开启字数统计
word_count: true

# 关闭字数统计
# word_count: false

修改主题 swig 布局

修改 post.swig

为了能在文章信息处显示字数,我们需要修改 themes/next/layout/_macro/post.swig,在 class 为 post-mata 的 div 中的添加如下内容:

使用Nginx将请求转发至Google Analytics实现后端统计

前言

Google Analytics 加载缓慢是本博客在国内访问缓慢的原因之一。虽然通过使用大公司的 ga.js 的 CDN ,可以很大程度上加快加载 ga.js 文件的速度( ga.js 的更新频率很高,并不适合缓存到本地或服务器,所以最好自己反代或者借大公司的光,参见 谷歌分析(Google Analytics) 加速实现秒加载页面 ),但无论如何还是要向 Google 发送一个请求来发送访客数据,所以取巧地使用 CDN 并不能从根本上解决问题。前段时间翻看一个知名博主的文章时,有一篇名为 本博客零散优化点汇总 的文章中写道:「通过服务器端异步发送统计数据的方式来解决这个问题」,这的确是个经济实惠的办法,下面就来实践一下。

思路

  • 方案一:通过 Nginx 的 proxy ,根据 官方给出的文档 向 Google 转发访客数据。
  • 方案二:设立中转服务器,在客户端通过 JS 发送异步请求给中转服务器,由中转服务器将访客信息发送给 Google。

这两种方法都切实可行,不过也都有一个大前提,那就是服务器(中转服务器)必须设置于境外,能够顺畅地访问 Google Analytics ,否则做的也不过是无用功。本文选择较为简单但是定制性不是很强的第一种方案,第二种方案可以参考这篇博文及博主开源的项目:服务端使用 Google Analytics

常用图床及自建图床方法汇总

公共图床

微博图床

国内图床的中流砥柱,速度非常快,服务也较为稳定,目前还支持了 HTTPS ,同时有大量的第三方工具方便使用,缺点是批量上传比较麻烦。

imgur

09年就成立了的国外老牌图床,支持https,理论上不限制大小,还有邮件发图、视频转 GIF 、URL 上传等功能,很强大,可惜间歇性被墙,就算没被墙国内访问也很慢,面向国外的站点使用倒很合适。

地址:https://imgur.com

sm.ms

支持https,有 API ,图片要求大小在 5MB 以下,一次上传不得超过10张,维护者是 通天塔 的站长。主站 https://sm.ms 目前用的是阿里云新加坡的机器,而上传的图片则会被存储到使用阿里云香港的 https://ooo.0o0.ooo 中,因此速度还是很不错的。

自动安装与升级chacha20(libsodium)

前言

由于我经常要用到 chacha20 这种加密方式,而目前稳定版本的 openssl 等都不自带这个包,所以每次配置新的服务器都要手动装一遍,实在是浪费人生。索性直接写个小脚本来自动安装与升级。

使用

git clone https://github.com/MrEasonYang/shell-boy 后,cd 到 shell/auto-chacha20 目录中,chmod +x auto-chacha20.sh ,然后 ./auto-chacha20.sh 运行即可。由于默认配置下,不用做 Nginx 安装脚本中那样备份等操作,所以更新时实际上仍然是运行 ./auto-chacha20.sh ,加入 crontab 中就可以实现定期自动更新了,如加入 0 2 * * 3 /home/user/auto-chacha20 2>&1 | tee -a /home/user/auto-chacha20/log ,即可实现每周三的凌晨两点检查更新。

兼容性

在 CentOS 7.2 、Ubuntu 14.04 、Ubuntu 16.04 中测试正常。

获取最新版本版本号

chacha20 的安装实际上就是编译安装 libsodium ,所以我们要设法获取到最新版本的版本号。在官网的 下载页面 观察一下就可以发现,这个列表与我之前在 以自定义参数自动编译安装或升级Nginx脚本 中分析 Nginx 官网下载页面的形式是完全一样所以直接借鉴 Nginx自动安装脚本代码来获取最新版本的版本号。

借助Referers实现Nginx及Apache防盗链

Nginx防盗链

图片外链作为小网站的流量杀手不禁是不行的。在使用 Nginx 的情况下,我们可以在配置文件中定义一个 location ,用正则表达式匹配常用的图片文件后缀,随后的重点在于如何过滤掉非法访客。

方案一

1
2
3
4
5
6
7
8
9
    location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        access_log   off;
        expires      1d;
        valid_referers none blocked *.easonyang.com server_names ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.sogou\.;
        if ($invalid_referer) {
            rewrite ^/ https://ooo.0o0.ooo/2016/09/10/57d379576fee1.jpg;
        }
        root /var/www/hexo;                   
    }

第四行的 valid_referers 顾名思义,指的是对合法来源的定义,随后的值含义如下(翻译自:Nginx Docs):

在Intellij Idea中使用Maven创建Hibernate&Spring&SpringMVC项目

创建 Spring & SpringMVC 项目

参考前文:在Intellij Idea中使用Maven创建Spring&SpringMVC项目

添加 Hibernate Maven 依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.5.Final</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>
		<!--Optional-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.2.Final</version>
        </dependency>

这里使用了 c3p0 作为连接池,当然可以按需求换成其他的,保证连接池的选择和后面的 structure.xml 中的数据库配置一致即可。

使用rsync将letsencrypt生成的证书同步到远程服务器

最近在给博客搞一个容灾服务器,由于使用 Hexo ,所以网站数据数据的同步只需要在 _config.yml 中添加容灾服务器的部署配置信息即可,但是由于本站使用了 letsencrypt 实现全站 HTTPS ,需要实现 letsencrypt 在主服务器上自动循环注册之后自动地同步到容灾服务器,以避免容灾服务器的证书在3个月后过期的问题。这里使用 Linux 下经典的 rsync 来实现。

安装 rsync

rsync 不比 nginx 等程序,稳定可用即可,因此直接从包仓库安装:

1
2
yum install rsync #CentOS、RHEL、Fedora
apt-get install rsync #Debian、Ubuntu

选择同步方式

rsync 支持两种同步方式,一种是使用自带的守护进程运行一个 rsync daemon 服务器,然后对方使用 socks5 来连接服务器传输文件,另一种是直接使用 SSH 进行认证和数据传输。

前者的用户名密码都是以 username:password 这样的形式明文存在 secrets 文件中的,传输过程默认也没有使用加密方式,很方便进行中间人攻击,同时还要运行一个守护程序吃服务器性能,所以不太适合本文要进行远程传输的需求。故本文选择使用 SSH 方式进行同步。

在Intellij Idea中使用Maven创建Mybatis&Spring&SpringMVC项目

创建 Spring & SpringMVC 项目

参考前文:在Intellij Idea中使用Maven创建Spring&SpringMVC项目

添加 Mybatis Maven 依赖

向 pom.xml 中添加如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

添加 Mybatis 配置信息

首先在 WEB-INF 或 Resources 目录下新建一个 xml 文件,名称随意,这里叫做 mybatis.xml ,内容根据需要配置,示例如下(这里仅配置了实体包的别名扫描,这样就不用写全路径了):

Mybatis的*Mapper.xml文件在Intellij Idea项目中的正确位置

探索

在 Intellij Idea 中使用 Mybatis 时,配置好了 *Mapper.xml 文件,但是编译后却报错找不到 Mapper 接口中的方法,错误类似于 BindingException: Invalid bound statement 。由于 Intellij Idea 目前并不支持在 Project Structure 中直接管理 Mybatis 的配置文件,所以只好手动排查问题。

起初以为是 Mapper 接口因为路径配置错误等原因无法正确编译,但是项目编译后的 target 目录下却能找到每个接口编译后的 class 文件。这时一眼扫到 target 目录下竟然完全找不到 *Mapper.xml 。几经查找原因,基本排除了代码和配置问题。联想到之前在 Intellij Idea 下用 Spring 的相关组件做单元测试的时候,总是要把放在 WEB-INF 下的几个配置文件拷贝到 Resources 目录下,才能成功进行测试,否则会报无法加载 xml 文件的错误,于是我猜测 *Mapper.xml 是否也应该放在 Resources 目录下呢?

解决Windows安装Microsoft Visual Studio 2010 Tools for Office Runtime(kb3001652)提示0x80070643错误的问题

环境

Windows 10

Microsoft Office 2016

Visual Studio 2015

前言

自去年以来,KB3001652 也就是 Microsoft Visual Studio 2010 Tools for Office Runtime 这个功能补丁安装失败的提示就一直存在于我的系统更新日志中,之前忙东忙西无暇顾及,这次恰逢更新 Windows 10 到周年纪念版,实在不想再忍,决心彻底解决这个问题。

在 Windows 的事件管理器中看到错误信息的与更新日志中的一样,没有什么详细信息。尝试 Google 这个补丁编号和错误码,得到建议大多是用某种方法屏蔽掉这个补丁的推送,尝试未果,但是找到了 Microsoft Visual Studio 2010 Tools for Office Runtime 的官方下载地址,想到既然是功能性补丁,不如我手动安装下试试。