博客折腾记:hexo-leancloud-counter-security 与标题中的引号冲突

昨天按照 hexo-theme-next/LEANCLOUD-COUNTER-SECURITY.md at master · theme-next/hexo-theme-next 这个文档配置博客阅读次数时,遇到 hexo-leancloud-counter-security 插件的一个冲突。

完成配置使用 hexo -d 时,终端中出现下面的错误提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
 ATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
SyntaxError: Unexpected token h in JSON at position 30
at JSON.parse (<anonymous>)
at /Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:92:42
at arrayEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:516:11)
at Function.forEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:9344:14)
at Hexo._callee$ (/Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:83:27)
at tryCatch (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:62:40)
at Generator.invoke [as _invoke] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:296:22)
at Generator.prototype.(anonymous function) [as next] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:114:21)
at step (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:17:30)
at /Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:28:13
at process._tickCallback (internal/process/next_tick.js:68:7)

看提示貌似是利用 Json 解析字符串的时候出现问题。打开 node_modules/hexo-leancloud-counter-security/index.js:92,对应出现一个解析 JSON的:

1
y = JSON.parse(memoData[memoIdx].substring(0, memoData[memoIdx].length - 1));

js 没有怎么接触过,不知道能不能单步调试之类的,只好祭出输出调试大法,加上两个输出:

1
2
3
console.log(memoIdx)
console.log(memoData[memoIdx])
y = JSON.parse(memoData[memoIdx].substring(0,memoData[memoIdx].length - 1));

然后再执行 hexo -d 命令,命令行输出为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
28
{"title":"System.out.println("hello world!");","url":"/post/hello-world.html"},
FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
SyntaxError: Unexpected token h in JSON at position 30
at JSON.parse (<anonymous>)
at /Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:92:42
at arrayEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:516:11)
at Function.forEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:9344:14)
at Hexo._callee$ (/Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:83:27)
at tryCatch (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:62:40)
at Generator.invoke [as _invoke] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:296:22)
at Generator.prototype.(anonymous function) [as next] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:114:21)
at step (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:17:30)
at /Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:28:13
at process._tickCallback (internal/process/next_tick.js:68:7)

JSON 在解析字符串{"title":"System.out.println("hello world!");","url":"/post/hello-world.html"} 时出现错误。对应的正是之前写的一篇名为 System.out.println("hello world!"); 的文章,由于 JSON 格式中字符串是需要用"" 修饰,导致JSON 中出现了一个 "title":"System.out.println("hello world!");" key-value 组合。然而实际上 JSON 只会将 "System.out.println("h 解析成 value,之后出现的 h 被当成非法字符报错。

定位问题之后,暂时修改文章的标题为 hello world! | 算法花园,绕过部署失败。


博客折腾记:修复七牛云测试域名失效问题

毕业之后开始工作快要 5 个月了,然后也快有 3 个月没有更新博客。其实文本编辑器中还有很多的草稿,但是一直没有力量驱动自己完结他们,并且分享出来。另外,这一段时间也不是完全没有分享。在这个页面的上方有一个 Tech 的标签,可以连接到我新搭的博客。受限于当前使用的 hexo 主题无法配置 latex 数学公式,所幸新开博客分享算法学习的笔记。大家感兴趣的可以访问一下,不过也没有太多的内容。

这次在博客公告中要告诉大家的确是另外一件事情。屋漏偏风连夜雨,不知道从什么时候开始,七牛云开始图片使用测试域名,毫无疑问这个博客的图片都挂了。自己也一直没有动力修复,让这一段时间访问我博客的小伙伴受累了。

今天研究了一下如何修复这个图床问题。官方有一个帮助页面如何配置域名的 CNAME - 七牛开发者中心,大概就是你的存储空间之前有一个测试域名(比如我的是 7xkpe5.com1.z0.glb.clouddn.com),现在不允许通过测试域名访问图片,需要绑定一个备案过的域名才可以。所以我们需要两个步骤完成改造:首先,给空间绑定一个域名(比如现在使用的是 media.xiang578.com );最后,在域名解析平台添加一个 CNAME,将你指定的域名转发到七牛的记录上。

完成上一步后,图片还是不能正常显示。因为之前的文章中,图片的链接都是以测试域名开头的,比如7xkpe5.com1.z0.glb.clouddn.com/15283589946007.jpg ,现在我们要将它改成 下面的形式 media.xiang578.com/15283589946007.jpg。简单的方法是打开文本编辑软件,然后使用查找替换功能,一个一个文件处理。显然这很无聊,而且进入 source/_posts 目录下利用 grep 7xkpe5 *.md | wc 统计了一个,我大概需要修改的有 142 处。

需要替换的字符串

幸运地是 linux 系统下有两大文本处理利器 sedawk。我们使用 sed 可以将一个字符串转换为另外一个字符串。网上搜索了一下用法,很快写了出来

1
sed -i -r "s/7xkpe5\.com1\.z0\.glb\.clouddn\.com/media\.xiang578\.com/g" *.md

这条命令中原始形态可以表示为 sed 's/原字符串/替换字符串/g'。其中参数 -i 代表替换文件中的所有匹配项,-r 代表批量替换支持扩展表达式。在原字符串和替换字符串中都出现了 \.,应为 .sed 命令中代表匹配任意单个字符,加上转移字符后可以代表它本身。最后 *md 代表对目录下的 md 文件进行处理。

运行完成之后,我们在统计一下测试域名和正式域名的数量,可以发现完美的解决了这个问题,图片又能正常显示。

修改后

所以,写下今天这一篇博客一切都是因为贫穷。如果有钱直接在主机上放置图片,有带宽提供出来访问,也就不会依赖七牛云了……


2019.11.09

为了减少博客依赖服务,参考 图床从七牛云迁移到腾讯COS折腾笔记 | 思想就是武器 将所有的图片全部从七牛上下载,利用 COS 存储。