在 iOS 上为网站添加 PWA 支持

最初的方案

之前一直在用这个方法来手动给网站添加 PWA 支持:
https://notes.alinpanaitiu.com/Install-any-website-as-PWA-on-iOS

遇到的问题

但是呢,在 NotebookLM (https://notebooklm.google) 上这个方式就失效了 😭

问题的根源在于:

The method doesn’t work on websites with a more restrictive Content Security Policy because the manifest has to be fetched from an external host (api.lowtechguys.com in this case).

简单来说,就是这个网站的内容安全策略比较严格,不允许从外部主机获取 manifest 文件。

寻找替代方案

虽然之前设置过 MITM,但实在不想通过这么暴力的方法来修改了,还折腾。于是尝试找替代方案。

突然想起来 WebClip 似乎也可以用来强制 PWA!于是开始尝试创建 WebClip。

探索过程

安装 WebClip 需要描述文件。我记得 LiveContainer (https://github.com/LiveContainer/LiveContainer) 利用了 WebClip 来做快速启动,于是去翻了一圈它的 GitHub。

找到了这个 PR 尝试引入相关功能,通过它比较详细地了解了 WebClip 的相关内容~

解决方案

经过一番搜索,最终找到了全新的工具:

Works Perfectly!

新发现的问题与改进

使用过程中发现了一个缺陷:通过 WebClip 添加的网站只在首页很沉浸,一点击就会出现 Safari 的界面,体验不太好。

为了解决这个问题,我又提交了一个 PR: Add IgnoreManifestScope support for web clips #1

在 WebClip 配置文件中添加了 IgnoreManifestScope 键,并将默认值设置为 true

这样可以让全屏 Web Clip 在导航到外部网站时不显示 Safari UI,实现真正无缝的全屏 Web App 导航体验!

在原作者合并 PR 之前,我已经 self-deploy 了一个版本: https://webclip.180811.xyz

可以直接用起来啦~💕

MongoDB 向 MeiliSearch 同步的踩坑记录

使用 meilisync

感谢yzqzss的大力支持

tl;dr: fork并大改了程序,参见

崩坏的前端

先尝试使用了他的Admin Console,https://github.com/long2ice/meilisync-admin

只有AMD64,没有ARM的镜像。谁还没有x86_64的机器啊,尝试在非数据库的机器上使用。我当时还没意识到从A机拉数据到B机再塞给C机是啥概念,但总之当时犯傻了。

下镜像、运行……等等这个数据库同步的admin为什么还要MySQL和Redis的DBurl啊?不理解但是当时配置了。

随后……

  1. 没有初始账户 ref #7

    解决方案是手动写邮箱密码进数据库,还要手搓 bcrypt hash

  2. 创建MongoDB数据源,报错Unknown option user #11

    原因竟然是,不同数据库在后端配置文件需要的参数不同,网页只按照PostgreSQL的user进行了传参,而且后端没处理直接塞,sync程序原地爆炸。

    使用抓包改包重放解决。

    本来写了fix但发现PostgreSQL的参就是对的,那爱咋咋地吧我感觉我管不了。也应该没人看到这还想用吧……应该吧。

  3. 设置好一切了之后还是跑不起来……后端有如下报错(删除一吨内容):

    2025-04-11 21:38:42.156 | INFO     | uvicorn.protocols.http.httptools_impl:send:496 - 10.0.1.1:64000 - "POST /api/sync HTTP/1.1" 500
    ERROR:    Exception in ASGI application
    Traceback (most recent call last):
      File "/meilisync_admin/meilisync_admin/models.py", line 64, in meili_client
        self.meilisearch.api_url,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    AttributeError: 'QuerySet' object has no attribute 'api_url'

    额……看起来不是简单配置文件的问题了……

于是尝试使用cli,避免是那鬼畜的Admin Console导致的问题以为马上就是终结的开始,原来只是开始的终结。

滞后的docker

找到实际进行同步的程序,https://github.com/long2ice/meilisync

我还是尝试了Docker,毕竟是”Recommended“的方法。但是按照他Readme写的compose,

version: "3"
services:
  meilisync:
    image: long2ice/meilisync
    volumes:
      - ./config.yml:/meilisync/config.yml
    restart: always

拉下来的镜像有问题。

我遇到的是 TypeError: ‘async for’ requires an object with aiter method, got list #94
但对应还有 TypeError: ‘async for’ requires an object with aiter method, got coroutine #76

嗯,得用dev呢。

啊对和上文一样,他MongoDB的user的字段是username,和模板不一样。鬼知道当时我怎么能灵光一现想出是username的。

后面配置文件来回几次之后不想搞docker了,故转为本地cli。

本地Python

本地cli阶段,一切似乎向着好的方向好起来了。

为数不多的几个问题就是,虽然有 pip install meilisync[mongo] for MongoDB,但是只安装这个是不够的。实际运行任何命令都会狠狠的告诉你,缺这缺那。你只能 pip install meilisync[all] for all.

还有小bug要打zsh。

$ pip install meilisync[mongo]
zsh: no matches found: meilisync[mongo]

终于配置好config,一切似乎在向好发展……或者是么?

爆炸的进度

参考 #17 中的回复,当以MongoDB作为数据源时,progress.json 可能不会自动生成,导致一堆一堆的TypeError: meilisync.progress.file.File.set() argument after ** must be a mapping, not NoneType

解决方案,先touch一下progress.json,再写进案例……

{"resume_token": {"_data": "8267FBA647000000022B042C0100296E5A10046F963A9EB7AB4D14B8CF191E8E5E8D67463C6F7065726174696F6E54797065003C696E736572740046646F63756D656E744B65790046645F6964006467FBA6470D168B18625CC73E000004"}}#                                                                                   

狠狠的log

测试没发现大问题之后,改配置文件关了debug,使用nohup运行起来之后我就去干别的事了,直到硬盘告警把我拉回到shell。同步数据库到新地方的确很耗空间,我也准备好了。但我实在没想到是中间的这位硬盘先爆炸了——增速甚至大于Meili数据库的机器——人畜无害的同步器给我摔了6个G的日志到我脸上。

这不可能啊,我明明在配置文件中写了debug=false啊——

tail了一下巨大的log,发现他把每一条同步的内容全纯文本的记录下来了……

其实是默认的插件实例导致的。

在配置文件中存在如下的内容:

debug: false
plugins:
  - meilisync.plugin.Plugin

其中plugin部分实际引用的是 https://github.com/long2ice/meilisync/blob/dev/meilisync/plugin.py

class Plugin:
    is_global = False

    async def pre_event(self, event: Event):
        logger.debug(f"pre_event: {event}, is_global: {self.is_global}")
        return event

    async def post_event(self, event: Event):
        logger.debug(f"post_event: {event}, is_global: {self.is_global}")
        return event

在这个plugin中,不管配置文件中debug的设置为何值,都会写入debug。

解决方案有三种:

  1. 不引用这个plugin

  2. 修改plugin内容

  3. 修改全局的log级别:

    Meilisync使用loguru,参考其文档可以通过设置level实现,再根据其环境变量的相关文档,可以设置LOGURU_LEVEL,可采用值如下表:

    Level name Severity value Logger method
    TRACE 5 logger.trace()
    DEBUG 10 logger.debug()
    INFO 20 logger.info()
    SUCCESS 25 logger.success()
    WARNING 30 logger.warning()
    ERROR 40 logger.error()
    CRITICAL 50 logger.critical()

    然后设置环境变量:

    Unix下:

    export LOGURU_LEVEL=INFO

    Windows下:

    PowerShell

    $env:LOGURU_LEVEL="INFO"

    CMD

    set LOGURU_LEVEL=INFO

后续来看节省了一吨的空间……

在各种debug中,把这个服务从B迁移到了C,也就是Meili Search所在的地方。这在后来被证明提升了非常多的速度。

Index的疑虑

我的数据中有id一项,但实际使用中会冒出各种问题,还是使用_id作为主键。

动手改脚本

矫正了类型

似乎一切正常的运行了一阵子之后,程序自己就死掉了。几次检查之后发现是 TypeError: Object of type ObjectId is not JSON serializable。此时的进度大概都是1,140,000条数据。

同样有GitHub Issue,#16,说是”fixed“。检查了一下本地代码,的确包含了fix的内容。但似乎还有出现在 #102,这次就没有任何回复了。

最难搞的不是修代码,而是让它再出错。由于出错之后进度就g了,每次都是从头开始,而每次跑到错误地方需要20分钟,消耗了几个小时在这个上面……还有,运行期间CPU全都拉满……我还应该庆幸不是用的小服务商机器会被拉闸……

对了,这段时间,用上了sentry.io。很奇怪作者在这个同步工具中特别留了sentry.io的口子,但它真的非常有用。也许作者知道会在各种地方出bug?

本地的修改

于是再实现了一下检测与修复。一开始尝试改造那个plugin,但一开始实在没理顺内容,最后决定硬改源码!添加了额外的类型检查。不想一次次的pip install,直接进site-packages改文件,又快又好。

修复完 ObjectId 不久,看超过半小时都没问题,进度也在一点点的走,正准备去睡觉,结果又有报错,这次是Object of type datetime is not JSON serializable,类似 #31 。同样的,加检查。这次是在5,270,000的位置,大概三分之一。修好之后能接着同步,也过了一半,于是我放心的去睡觉了。

然后早上醒来又是晴天霹雳,在差不多三分之二的时候,就会冒出Client error '408 Request Timeout' for url 'http://127.0.0.1:7700/tasks/xxxx。实在没办法,索引的东西太多太多,算不过来也就越积压越多,直至彻底boom。但不正常的是,这个问题也被修过,在 #13 有提起过,但不知道啥原因,还是爆炸了。此时我检查了一下积压了多少,发现运行一个小时就会积压半个小时……我应该庆幸没有发生Too many open files的问题……

索引慢是没办法的……欸等等,说到底这索引就不应该这么快加才对吧!

延迟的索引

我决定尝试延迟,然后发现可怕的事实:在创建index的时候,meilisync 没有指定任何的字段索引选项。所以文档中的每个字段都会显示并可搜索,这耗费了超级多的资源,也造成可怕的浪费。我们完全没必要一开始就索引全部的内容。相反,我们在从远端同步数据的时候,不应该建立任何的索引,而应该等到直到所有来自源的内容全都都成功被插入了之后,再做索引的处理,而且应该能在config file中指定哪些字段被索引,包括索引的类型(searchable, sortable, filterable, none )

于是写了。目前写了从远端同步数据的时候,不应该建立任何的索引的逻辑,同步速度提升了一万倍。

然后写了在同步完之后通过改setting设置索引的功能,一切看似非常正常,直到一觉睡醒还是没有任何索引。

这不应该啊。检查之后发现,虽然提交了修改索引的任务,但跑到一大半爆炸了:

Index `nmbxd`: internal: MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big.

终于不是meilisync的问题了!

优化的内存

仔细确认之后发现,其实不是跑了几个小时。它跑了几十分钟就transaction too big了,然后缩小batch重试,直到咋都试不出来。

锻炼!

经@yzqzss提醒了最佳实现是先设定attribution,再同步index,遵循最佳实现,但那样的话可能再出现408。要解决408得实现队列,我比较懒不想再写代码了。

随后找了下竟然找到了能减少index时内存占用的flag,参考 https://github.com/meilisearch/meilisearch/issues/3603--experimental-reduce-indexing-memory-usage,的确一用就灵,一次成功。

以及关于更新,运行meilisync refresh即可。

再之后就是写systemd来定时进行同步了,如下。

# /etc/systemd/system/meilisync.timer
[Unit]
Description=Run meilisync refresh nmbxd weekly on Monday at 5 AM

[Timer]
# Run every Monday at 5:00 AM local time
OnCalendar=Mon *-*-* 05:00:00
Persistent=false

[Install]
WantedBy=timers.target
# /etc/systemd/system/meilisync.service
[Unit]
Description=Meilisync Refresh nmbxd
#After=network.target

[Service]
Type=oneshot
WorkingDirectory=/path/to/meilisync/config/
Environment='LOGURU_LEVEL=DEBUG' 
ExecStart=/etc/meilisync/meilisync/bin/meilisync refresh

配置文件/path/to/meilisync/config/config.yml

debug: false
progress:
  type: file
source:
  type: mongo
  host: REDACTED
  port: REDACTED
  username: 'REDACTED'
  password: 'REDACTED'
  database: REDACTED
meilisearch:
  api_url: http://127.0.0.1:REDACTED
  api_key: REDACTED
  insert_size: 10000
  insert_interval: 10
sync:
  - table: REDACTED
    index: REDACTED
    full: true
    pk: _id
    attributes:
      id: [filterable, sortable]
      fid: [filterable]
      img: [filterable]
      ext: [filterable, sortable]
      now: [filterable, sortable]
      name: [searchable]
      title: [searchable]
      content: [searchable]
      parent: [filterable, sortable]
      type: [filterable]
      userid: [filterable]
sentry:
  dsn: ''
  environment: 'production'

电信IPTV和网络复用

本文使用设备为 F4600T 和 SK-WR6640X,其他设备应该也可以参考。

Step 0: 获取光猫超级密码

参考 教程 拿到了光猫的超级密码

Step 1: 获取光猫上 IPTV 接口相关信息

  1. 状态下的状态总览找到iTV的“连接名称”
    首页下的状态总览

  2. 进入网络,进入网络设置 - 网络连接,在连接名称处选中在上面找到了连接名称,记录下VLAN 模式VlanID802.1p 的值,保存备用
    image

Step 2: 设置 VLAN 绑定

在上一步的基础上,点击左侧的VLAN 绑定,进行如下操作:

  1. 选择
  2. 选择插网线的口
  3. 填入上一步获取的 VLAN(也可以随便写,和后续保持一致即可)
  4. 以及对应的 WAN 连接名称
  5. 不要忘了保存

image

Step 3: 设置路由器

路由器接到上一步中选中的网口,比如我这是网口 3。登录,进行配置,我就以我目前这台创维 SK-WR6640X 为例。

选中网络设置,进入 IPTV 配置,启用,模式为桥模式,选中插机顶盒的网口,设置 VLAN 模式VLAN ID802.1p 为上方获取/设置的值,进行确定。

image

重启盒子,即可通过一根和光猫连接的网线,同时完成 IPTV 和上网的功能。

参考连接

选定机型为 SK-WR6640X(实际 30 入手)

集成与外置 FEM 芯片的无线性能对比实测-路由器交流

总结 142 款运营商定制 WiFi6 mesh 路由的配置,供大家参考(有几款可刷 OPENWRT)-无线路由器硬件改造以及故障维修-恩山无线论坛

获取 F600T 光猫超级密码

中兴 F4600T 光猫超级密码获取方法(IOS)

IPTV 相关设置参考

GitHub - ruur/cmcc-iptv: 移动宽带单线复用(INTERNET+IPTV)

布网简单改造——IPTV 与网络单线复用的路由器什么值得买

单线复用,不用设置光猫-iptv 直播源、网络视频直播资源、直播代码-恩山无线论坛

IPTV 单线复用实践及总结 - 知乎

PS

SK-WR6640X 的信号真的很好,30 买到绝对值

How did I built this blog

零:内容框架、托管服务等的选择及必要的准备

内容框架:选择 Hexo

  • 配置较为简单
  • 简洁而快速
  • 是静态内容框架
  • 社区活跃,插件、主题众多

托管服务:选择 Vercel

  • 配置较为省心

  • CI/CD方便

  • 既往使用经验较多

可以从官网注册。

包管理器:选择 pnpm

  • 节约磁盘空间

  • 安装速度快

  • 各系统间表现稳定

安装可以参考官方教程

存储处;选择 GitHub

  • 与 Vercel 深度结合
  • 使用场景多样
  • 全球最大

可以从官网注册。

一:使用 Vercel 模板快速创建 Hexo 网站

在 Vercel 创建新项目

前往 Vercel ,新增项目。

image-20220325182649912

前往模板中心寻找模板

image-20220325182905036

选择 Hexo

image-20220325182957226

创建 Git 文件夹

image-20220325183111580

完成

image-20220325183645368

此时已经搭建完成一个基本的 Hexo 站点。

二:配置网站

本地安装依赖

之前本地已经安装了 pnpm,故直接运行

pnpm install

结果为

image-20220325201839522

升级 Hexo 版本

观察发现 Hexo 有新稳定版本6.1.0,故升级。

pnpm update ----latest

image-20220325202013959

在本地运行 hexo 服务

image-20220325202058110

此时发现有warn,故修改warn处,顺便配置文件进行了 本地化 修改:

image-20220325203724428

此时网页效果为:

image-20220325202141659

选用 YUN 主题

此时感觉网页效果不佳,准备安装并使用 Hexo-Theme-Yun 主题。

pnpm install hexo-theme-yun@latest --save
hexo config theme yun

image-20220325202453027

image-20220325202524210

配置 YUN theme

在 YUN 主题的配置文件 _config.yun.yml 中做以下配置:

语言设置为中文

language: zh-CN

配置侧边栏社交图标

特别:关于RSS

RSS 是本人的心头爱,肯定要进行配置。配置 RSS 不止需要在 _config.yun.yml 中进行配置,还需要安装 hexo-generator-feed,具体如下:

pnpm install hexo-generator-feed --save

再在_config.yml的末尾加入如下内容作为hexo-generator-feed的配置项:

feed:
  enable: true
  limit: 20
  hub: https://pubsubhubbub.appspot.com/
  content: true
  order_by: -date
  icon: images/avatar.jpg
  autodiscovery: false
  template:

再在 _config.yun.yml 中加入以下配置,完成侧边栏的设置。下面的是当时我实际配置文件。

# 配置侧边栏社交图标
social:
  - name: RSS
    link: /atom.xml
    icon: icon-rss-line
    color: orange
  - name: GitHub
    link: https://github.com/Ovler-Young
    icon: icon-github-line
    color: "#181717"
  - name: E-Mail
    link: mailto:ovlertheyoung@gmail.com
    icon: icon-mail-line
    color: "#8E71C1"
  - name: 网易云音乐
    link: https://music.163.com/#/user/home?id=310842841
    icon: icon-netease-cloud-music-line
    color: "#C10D0C"
  - name: Telegram
    link: https://t.me/Ovler
    icon: icon-telegram-line
    color: "#0088CC"
  - name: Telegram Channel
    link: https://t.me/shengxiaoguan
    icon: icon-telegram-fill
    color: "#0088CC"

配置标语动画

banner:
  enable: true
  title: 
    - Ovler
    -- hexo
  border: true
  cloud:
    enable: true
    color: "white"
  go_down:
    enable: true
    icon: icon-arrow-down-s-line

配置替换鼠标光标

cursor:
  enable: true

配置侧边栏头像

avatar:
  enable: true
  url: /images/avatar.jpg
  rounded: true
  opacity: 1
  mickey_mouse: false
  status:
    enable: true
    emoji: 😀
    message: Hello world!

配置页脚

配置了年份和运行时间

footer:
  since: 2022
  live_time:
    enable: true
    prefix: 本博客已运行
    suffix: (●'◡'●)
    start_time: "2022-03-21T17:05:00"

使用 霞鹜文楷 字体

个人较为喜欢 霞鹜文楷 字体,参考教程后配置。

先安装lxgw-wenkai-webfont字体包:

pnpm install lxgw-wenkai-webfont --save

image-20220327011612735

再在 _config.yun.yml 中加入以下配置,完成霞鹜文楷字体的设置。

font:
  cdn:
    enable: true
    lib:
      - https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont@latest/style.css
  serif:
    family: "'Songti SC', 'Noto Serif SC', STZhongsong, STKaiti, KaiTi, Roboto, serif"
    weight: 900
  sans_serif:
    family: "'LXGW WenKai', 'PingFang SC', 'Microsoft YaHei', Roboto, Arial, sans-serif"
    weight: 400
  monospace:
    family: "'Source Code Pro', 'Courier New', Courier, Consolas, Monaco, monospace"

配置友链

新建页面:

hexo new page links

image-20220331023933139

根据文档对友链进行配置:

进入 source/links/index.md,设置 links 字段。

  • url: 博客链接
  • avatar: 头像图片链接
  • name: 怎么称呼?
  • blog: 站点名称
  • desc: 一句话描述
  • color: 代表色,默认是灰色 gray

根据文档,我的友链配置为:

---
layout: links
title: Friends
date: 2019-06-21 13:06:06
keywords: 链接
description: 一个emm,咖啡馆?
comments: true
links:
  - url: https://hexo.180811.xyz
    avatar: https://hexo.180811.xyz/images/avatar.jpg
    name: Ovler
    blog: Ovler 的 Hexo
    desc: Feeling tired.
    color: "#a5f4e8" # 代表色
    email: ovlertheyoung@gmail.com
  - url: https://blog.180811.xyz
    avatar: https://hexo.180811.xyz/images/avatar.jpg
    name: Ovler
    blog: Ovler 的 typecho
    desc: 以前的博客站,似乎,好久没更新了
    color: "#df5749" # 代表色
    email: ovlertheyoung@gmail.com
placeholder: 还没想好说些什么 # 默认对友链的描述
tip: 友链加载中~如失败请刷新重试~
---

## 友链

一个emm,咖啡馆?

来坐坐吧!

目前还没啥来加的,大佬们可以通过侧边栏的各种联系方式联系到我来加友链,我会尽快回复的!

目前只有自娱自乐,也希望日后能加多一些。

配置背景

_config.yun.yml 中加入以下配置,完成背景的设置:

bg_image:
  enable: true
  url: https://cdn.jsdelivr.net/gh/Ovler-Young/blog/source/images/2830.png
  dark: https://cdn.jsdelivr.net/gh/Ovler-Young/blog/source/images/2830.png
  opacity: 0.8

注意:这里的图片链接最好是图床等加载较快的图片,太慢的话滑动会闪:(

配置页面

配置链接

参考 https://hexo.io/zh-cn/docs/permalinks 中配置修改

配置搜索

配置搜索需要安装 hexo-generator-search,具体如下:

pnpm install hexo-generator-search --save

image-20220327012220168

再在主题文件_config.yun.yml的末尾加入如下内容作为hexo-generator-feed的配置项:

# 关闭默认的引擎搜索
engine_search:
  enable: false
# 开启本地搜索
local_search:
  enable: true

配置 tags

安装 hexo-generator-tag,具体如下(截图时已安装):

pnpm install hexo-generator-tag --save

image-20220327014615469

参考主题的教程, 有

新建 tags 页面,在博客根目录下输入:

hexo new page tags

修改 source/tags/index.mdFront Matter

---
date: 2017-10-09 19:11:58
comments: false
type: tags
---

_config.yun.yml 中设置:

wordcloud:
enable: true

来使用彩色的词云替代原生的标签云。

配置分类

因为原有配置中已经包含了hexo-generator-tag依赖,配置分类不再需要安装新插件。

新建页面:

hexo new page categories

image-20220331023215967

修改新生成文档的头部信息:

---
title: categories
date: 2022-03-31 02:27:20
comments: false
type: categories
---

处理 warngins

image-20220326235513205

Hexo运行总有好多warning,让我很头疼。于是查阅资料,在这份资料中发现了解决办法。故,在package.json中加入以下内容:

"resolutions": {
  "stylus": "^0.57.0"
}

nib 中的过时package强制解析为新版本。在运行 pnpm install , 更新包及依赖。

顺便,它也干掉了 pnpm install 时报的4个 deprecated warn.

(nib 咋GitHub更新npm不发包呢…)

剩下两个 pnpm install 的 deprecated warn 都是来自 CSS 这个两年没维护的老东西了… 暂时无法处理

旧文章导入

之前已有过一个博客,为typecho搭建,这次也一并迁移过来。

先在本地安装 hexo-migrator-rss 插件:

$ pnpm install hexo-migrator-rss --save
Packages: +56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 529, reused 500, downloaded 27, added 56, done

dependencies:

image-20220331082820673

再运行 hexo migrate rss <source> 命令,我的情况是:

hexo migrate rss https://180811.xyz/index.php/feed/

image-20220331083006026成功导入四篇内容。

再对导入的文章做一遍校对,这里就不再赘述了。

另:还要干啥

  • 补完站点介绍与个人页面

  • 写写怎么搞个 HexoPlusPlus 来管理 Hexo

    UPD: HexoPlusPlus, 它, achieved了……等替代品 Wexagonal 变得可用中…

  • 还有啊,别做鸽子了:(

    不过感谢你们的催更,嘻嘻

  • 绑定网址

  • 为旧文章打 tag

  • 调整配色和背景图片

主要参考资料

https://vercel.com/guides/deploying-hexo-with-vercel

https://pnpm.io/cli/update

https://yun.yunyoujun.cn/guide/

https://www.haoyizebo.com/posts/710984d0/

https://github.com/lxgw/LxgwWenKai/issues/24

https://hexo.io/zh-cn/docs/permalinks

https://hexo.io/zh-cn/docs/migration#RSS