最近折腾Obsidian及hexo

以下是最近折腾的东西。

GitHub Publisher

上手Obsidian一段时间后,感觉良好。想着通过Obsidian直接更新博客。这个hexo博客代码托管在Github,然后通过Netlify部署和构建。一直的做法是,通过github.dev在线更新或者修改Github代码仓的博客文章。既然使用Obsidian了,能用Obsidian直接更新博客就很完美了。

因为代码都托管在Github,使用Obsidian直接更新博客的可能性和方法很多。比如obsidian-git,将整个博客作为一个Obsidian仓库,然后使用此插件同步更新。又比如obsidian-digital-garden,将需要的Obsidian笔记托管到Github,然后通过Vercel构建静态站点。

以上适合新建全新的Obsidian笔记及新建的博客。对于像我这样已有存量笔记及博客的用户不太适用,使用起来不太优雅。直到我发现了obsidian-github-publisher

GitHub Publisher原名叫mkdocs publisher。最大特点是能将Obsidian仓库里的任意笔记自动或者手动同步到GitHub代码仓库的任意位置。

安装好插件后,首先设置好Github相关信息,包括Github repository,用户名,token以及Branch。当然也可以在单个笔记文件里,通过文档属性(frontmatter),单独设置接收笔记上传的Github仓库信息(可以选择同一用户下的不同仓库,同一仓库下的不同位置)。

上传设置。设定上传的笔记存储在Github仓库的位置。因为我的hexo博客日志文件保存在source/posts目录下,故选择Fixed Folder,设定好默认上传到的目录。


文章发布。在文章文档属性添加一个share属性(可以根据需要在插件设置里改成其他任意名称),赋予值 true。文章写好后,右键发布。

这个插件还有很多其他功能,比如支持Wikilinks,dataview以及静态博客支持markdown富文本展示的内容,比如Mermaid,Latex等。详细介绍可以参见这个页面:obsidian publisher documentation

deploy to COS

这个hexo博客代码托管在Github,Netlify构建静态文件,然后套上国内的cdn。唯一的问题是无论是直接用Netlify自带的cdn,还是套国内的cdn,总感觉不够丝滑。问题出在哪儿是显而易见的。

某天突然顿悟,为什么执迷于一定要部署到Netlify?hexo这样静态博客的优点不正是部署方式的多样性吗!除了类似Netlify这样的serverless平台,对象云存储,FTP,linux主机(通过Rsync部署),git仓库,ipfs等等都可以部署hexo。(参见hexo部署

因为经常用,决定把这个hexo博客迁移到腾讯COS。

源自WordPress时代保持下来的好习惯,博客站点动静态资源分离,图片,JS等静态资源都托管于第三方的存储,因而剩下的工作会很简单,可以使用诸如hexo-deployer-cos这样的插件。但是我这个博客目前只能运行于nodejs 14.x(博客主题老旧原因),就不使用插件方式,不动博客代码本身了。适合用Github action自动构建hexo,然后推送到cos。

方法很简单,在Github action新建一个自动化任务 .github/workflows/cos-deploy.yml,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# workflow
name: Hexo blog

on:
push:
branches:
- main

jobs:
deploy:
name: Deploy Blog
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai

steps:
# check it to your workflow can access it
# from: https://github.com/actions/checkout
- name: Checkout Repository master branch
uses: actions/checkout@v2
with:
ref: 'main'
submodules: true

# from: https://github.com/actions/setup-node
- name: Setup Node.js
uses: actions/setup-node@master
with:
node-version: "14.x"

- name: Yarn Install Cache
uses: c-hive/gha-yarn-cache@v1

- name: Install Dependencies
run: yarn install

## generate files
- name: Generate Hexo Site Public Files & Create Files for Blog Assets
run: yarn build

## deploy to tencent cos
- name: Deploy to Tencent COS
env:
SECRET_ID: ${{ secrets.TENCENT_CLOUD_SECRET_ID }}
SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
BUCKET: ${{ secrets.COS_BUCKET }}
REGION: ${{ secrets.COS_REGION }}
run: |
sudo pip install coscmd
coscmd config -a ${{ secrets.TENCENT_CLOUD_SECRET_ID }} -s ${{ secrets.TENCENT_CLOUD_SECRET_KEY }} -b ${{ secrets.COS_BUCKET }} -r ${{ secrets.COS_REGION }}
coscmd upload -rs --delete ./public/ / -f

在Github设置里新建4个密码变量,分别是secrets.TENCENT_CLOUD_SECRET_ID,secrets.TENCENT_CLOUD_SECRET_KEY,secrets.COS_BUCKET,secrets.COS_REGION。对应的值(id,key,cos桶名称,地域)可以在腾讯COS里设置查询。

以上代码可以根据自己的需要修改,比如Github仓库的分支(main),node版本等。上述自动化的流程是,先从 Github仓库中检出代码,然后在action里缓存,接着构建hexo的静态文件,然后通过腾讯云的coscmd工具上传到相应的cos桶里。

最后一行命令 coscmd upload -rs –delete ./public/ / -f 目的是比较cos存储桶内的文件,如果有变更则更新,如果cos中存在但hexo的public目录中不存在,则删除对应的文件。腾讯云的coscmd工具的使用可以参见官方文档

hexo的public目录上传到cos以后,绑定域名,就可以访问了。COS提供了自定义源站域名,cdn加速域名,全球加速域名三种选择。因为我站点的静态资源已经cdn了,此处完全没必要再次cdn加速,因此我使用了自定义源站域名。而全球加速只适用于有在多个不同地区上传文件到cos的需求。

通过测试,发现即使使用的是自定义源站域名,ping出来仍然有多个ip,网站访问速度比netlify+国内cdn好很多,个人体验也更丝滑。(心理作用?)

Dataview

之前安利过weread这个Obsidian的微信读书插件,能将微信读书的所有笔记同步回Obsidian。这个插件默认只能通过笔记目录(书名或者书籍类别两种)的方式展示读书笔记,不太直观,而配合obsidian-dataview插件能完美的展示自己的阅读书目,功能强大。

weread插件默认展示方式

obsidian-dataview应该是目前使用量最大的Obsidian插件了,用处很多。对于我的读书笔记,能从对应的笔记仓库里过滤、排序和提取数据,然后通过表格,列表等方式展示。

用法很简单,安装好插件以后,新建一个展示dataview数据的笔记页面,然后输入相应的的dataview代码,稍等片刻,等数据提取完毕,就能展示了。插件网站有详细的使用说明可以参考。

对于读书笔记,我主要想通过时间展示阅读的书目。weread插件给读书笔记提供了很多文档属性(frontmatter),比如书名,阅读时间,作者,封面等等。dataview正是从这些数据中查询,筛选然后展示的。

比如我的dataview代码:

table author, lastReadDate
from “read/weread”
sort lastReadDate desc

从read/weread 文件夹里查询数据,展示作者(author),最后阅读时间(lastReadDate)等信息,并按照最后阅读时间排序。

展示效果如下:

以上是在Obsidian笔记里展示,如果把这个笔记文件直接发布到hexo,只有聊聊几行dataview代码。而上面提到的GitHub Publisher插件刚好解决了这个问题,在插件设置里把dataview功能开启。在上传到github仓库之前,dataview代码会被提前渲染成对应的markdown格式的文本,这样在hexo博客里就能展示对应的书目了。

以上,如此,接下来又能折腾好久了!

陈寅恪及《柳如是别传》 《中国历代政治得失》笔记补遗

  评论