WordPress

没有像大城市里的 Z 时代青少年一样在初中高中就开始折腾各种网络安全、编程技术、折腾博客,我在大二时才有建一个网站的想法,买了阿里云的 ECS,买了域名,装了宝塔,然后 LNMP 一键启动,WordPress 无脑梭哈,还折腾了备案。但是除了写了几个测试的文章,后面连续费云主机的动力都没有了,于是索性连域名也卖了。记得好像是十几块钱买的,还卖了 9 块钱。我的博客从网络世界消失了。对于我来说,我知道了原来网站是这么运行的,原来还有宝塔和 WordPress 这么牛逼的工具,原来备案 TM 的这么麻烦!

Hexo

再后来技术上走向正规,经常查一些技术文章,看到别人写的博客,知道了 Hexo,知道了 GitHub Pages,开始折腾静态博客,使用 Hexo 和使用人数最多的主题 Next,再结合网络上的各种方案魔改。当时我想的就是“整挺好,以后就这样不换了”。Hexo 是截止我写这篇文时用的最久的框架,相处久了,了解的多了,遇到麻烦的次数也就多了。

VuePress

期间还折腾了文档站点,看到了别人的文档站点挺好的,我的一些文档也可以放进文档站点作为文档库啊。然后又开始了 VuePressDocusaurus,因为抱着一旦启用就不换的决心,每个方案都折腾了不少时间。最终我的 GitHub 仓库还残存着一个 Docs 的仓库。然后我发现文档这个东西就是个伪需求,就此作罢。

Hexo in Docker

一开始 Hexo 运行在 Mac 上,我不敢随便重置系统。后来对 Docker 的运用加深,开始折腾在 Docker 里运行 Hexo,也还算顺利。Dockerfile 存在 Dropbox 里,存在 iCloud 里,非常的安稳和踏实。但是后面的事告诉我事情没这么简单:Dockerfile 中每次都拉取 latest 的 node 基础镜像,git clone 也是每次都是最新的,导致版本不兼容时就会有报错,或者是警告。这个问题不是不能解决,指定版本就好了呀,是的。但我还是开始嫌弃 Hexo 了,甚至我都没有继续写下去的动力了(借口)。在群里吐槽 Hexo 的问题的时候,馆长说那你可以用 Hugo 啊,就一个可执行文件。此时 Hexo 的种种不好,都浮现脑海:速度慢,环境麻烦,node_modules……

Hugo

终于下定决心,试试 Hugo。

brew install hugo
hugo new site blog
cd blog
git clone [你的想要的主题] themes
hugo new post/first.md
hugo server -D

不行我要开始无脑吹了:把之前的 blog 的 Markdown 文件复制到 Hugo 目录,生成速度嗖嗖的。我选的非常精简的主题,摆脱了 npm,摆脱了 package.json,整个主题非常的简单、简洁。以前 Hexo 需要安装插件实现搜索、字数统计,Hugo 全都聚合在了一个可执行文件里。有好处也有不好:好处是,不用折腾了,啥都有;坏处可能就好像花钱买了不需要的东西,目前这点坏处我是无所谓的。

我在选主题的时候的标准是:足够简洁(打开的速度够快),有搜索功能(我自己会记录一下文档,方便我自己搜索)。最终我使用的 Papermod,符合了我的要求,在此基础上进行了一些魔改,终于可以愉快的写作了。

从 Hexo 迁移到 Hugo 并不是无痛的:使用 Python 脚本修改了 Markdown 的头部信息,提取头部信息里面的 title,通过百度翻译的 API 翻译成 slug 写进头部信息,作为文章的永久链接,而不是像之前一样使用额外的插件生成随机的永久链接。还有一些细微的修改不在此赘述了。

import requests
import random
import json
from hashlib import md5

appid = "******************"
appkey = "*******************"


def bdtranslate(word):
    word = word.replace('_', ' ').replace('-', ' ')
    from_lang = 'zh'
    to_lang = 'en'
    endpoint = 'http://api.fanyi.baidu.com'
    path = '/api/trans/vip/translate'
    url = endpoint + path
    query = word

    def make_md5(s, encoding='utf-8'):
        return md5(s.encode(encoding)).hexdigest()

    salt = random.randint(32768, 65536)
    sign = make_md5(appid + query + str(salt) + appkey)
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
    r = requests.post(url, params=payload, headers=headers)
    response_data = json.loads(r.text)
    trans_result_list = response_data.get("trans_result", [])
    for item in trans_result_list:
        dst_value = item.get("dst")
        if dst_value is not None:
            return dst_value.replace(' ', '-').lower()
import os
import pangu
import re
import yaml
from translate import bdtranslate


def replace_front_matter(match):
    front_matter_str = match.group(1)
    front_matter = yaml.safe_load(front_matter_str)
    front_matter.pop('abbrlink', None)
    front_matter['title'] = pangu.spacing_text(front_matter['title'])
    slug = front_matter['slug'] if "slug" in front_matter else bdtranslate(front_matter['title'])

    date_str = ''
    if 'date' in front_matter and hasattr(front_matter['date'], 'strftime'):
        date_str = front_matter['date'].strftime('%Y-%m-%dT%H:%M:%S+08:00')

    tags = front_matter.get('tags', [])
    tags_str = ', '.join(tags)

    new_front_matter_str = f"""---
title: {front_matter['title']}
slug: {slug}
tags: [ {tags_str} ]
date: {date_str}
---"""

    return new_front_matter_str


file_list = os.listdir('./post')
for file_name in file_list:
    file_path = os.path.join('./post', file_name)
    with open(file_path, 'r+', encoding='utf-8') as f:
        content = f.read()
        new_content = re.sub(r'^---\n(.+?)\n---', replace_front_matter, content, flags=re.DOTALL)
        print(new_content)
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(new_content)

以上两处代码其实可以优化,但是因为想着也就用一次,没有做太多的优化(懒,光想着折腾博客去了),在这里贴出来以防后续还有类似需求,改改还能用。

意义

作为一个技术从业者,我觉得有博客是一件正常的事,可以是在开放平台,可以是自己的云主机上。我选择了最经济、最稳定、最省心的 GitHub Pages,虽然其他很多国外的平台也有类似的免费功能。后续可能会尝试,再说吧。好处是摆脱了审核,摆脱了备案,坏处是国内的普通用户打开可能会费点劲。我要发表暴论了:“不会 FQ,你搞什么技术?你好意思说你是搞技术的?”

在简历上写了自己的博客地址,有没有面试官看过我无从得知,当然现在 Hugo 使用了 Google Analytics 能够获取到比之前多一点的信息了。

虽然我也听说过,写博客重要的是写,但是用起来顺手也是我非常重视的一点,搜索功能我是一定需要的,因为我会把它当做知识库。

当有人遇到问题,刚好博客里记录了这个问题时,我也会毫不犹豫地扔出博客链接,这可比重新打字去解释方便了不知道多少倍。