博客从 Jekyll 迁移到 Hugo,以及最近一些折腾的感悟。 原文: https://evilpan.com/
<!--more-->
个人博客那些事
其实从很早的时候就开始了个人博客网站的搭建,最初得益于 github.io 域名的开放。总的来说,我搭建博客的历史主要分为三个阶段。
第一阶段
第一阶段属于简单至上主义。这个时期使用 Jekyll 作为主要的静态博客生成引擎,可以方便地使用 Markdown 来进行写作,并且这也是 Github Pages 官方支持的。
最初是使用了一个简单的模板,后来随着需求日益增加,比如需要标签、目录、侧边栏等功能,于是又转投了另一个主题。
第二阶段
由于在第一阶段中日益增长的定制需求和静态博客的限制矛盾,这个时期开始了一段折腾的造轮子历程。在这个阶段,我用 Python (Django) 写了一个完整博客系统,命名为 berserk (因为当时喜欢听阿姆)。该博客支持以下功能:
- 支持 Markdown 渲染,文章目录、代码语法高亮、自适应文章布局
- 支持文章分类、标签,以及这些属性的数据库管理
- 支持页面访问统计、评论
- 支持后台管理 (基于定制的Django-Admin)
- 支持在后台使用类似 VIM 的键盘映射来编写文章
- 支持真实后台管理页面的隐藏以及虚假后台页面的蜜罐和告警 (没错)
此外因为当时工作接触了一些新潮前端概念,还尝试将一套前后端分离的模式融入到系统中。学习 ReactJS 并折腾了一段时间后发现和 Django 原本的模板系统格格不入,然后就又去掉了。
这个博客系统一直缝缝补补并使用了很一段时间,充满了各种奇怪的前后端 tricks。期间也遇到过各种问题,比如整天被乌克兰的机器人在评论区发广告,于是又加入了人机验证,诸如此类。……直到有一天发现这一切和我的初衷(写博客)似乎没什么直接关系,于是又怀念起了以前用 Jekyll 的那段开心时光。
第三阶段
在自建博客前后端被搞的焦头烂额之后,我又回到了 Jekyll 的怀抱。其实是在自建博客期间看到了许多优秀的 Jekyll 主题完全可以满足我的要求,所以才最终回归。并且在内心暗暗下决心: 再也不折腾了。
不过还是小小折腾了一下,在此期间对一个小众的主题进行了一些简单的定制和优化。这个阶段算是返璞归真,没有了后端的琐事,可以简单地对主题模板进行修改。基于对 Jekyll 模板的了解,这些事情算是驾轻就熟,可以说对博客页面的折腾已经到头了。
这个系统也一直使用了较长的时间,一切都挺满意,除了头顶的几片乌云:
- 博客访问统计使用的是不算子,服务器在国外,而且数据不可控;
- 网页常规同步加载,在图片等资源多的时候会感觉速度很慢;
- Jekyll 使用 Ruby,安装繁琐,构建速度极慢;
- ...
第3点的依赖问题可以通过 bundle 或者直接使用 docker 来解决,但是编译构建的速度着实堪忧,比如才几十篇文章,在服务器上构建就需要长达 15秒 的时间:
$ docker run -it --rm -v $PWD:/srv/jekyll -p 4000:4000 jekyll/jekyll jekyll serve -s /srv/jekyll
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
Configuration file: /srv/jekyll/_config.yml
Source: /srv/jekyll
Destination: /srv/jekyll/_site
Incremental build: disabled. Enable with --incremental
Generating...
done in 15.28 seconds.
Auto-regeneration: enabled for '/srv/jekyll'
Server address: http://0.0.0.0:4000/
Server running... press ctrl-c to stop.
所以,我又开始折腾了。……但是这次没有忘记初衷,而是选择了 Hugo 加一个比较活跃的主题,因为我不想在前端的修改上花费时间,也不想花太多时间去研究新的模板语法(不过最终还是提了pull request)。
总之,博客还是从 Jekyll 迁移到了 Hugo。迁移过程不算太顺利,因为二者对 Markdown 的元数据理解不同,而且整站的路径也不一样,但通过编写迁移脚本可算实现了。
新的博客可以直接通过 https://evilpan.com 访问。
感悟
其实改来改去,对于最终的阅读者(如果有的话)并不会产生太大影响。就我个人而言,反而不太喜欢那些花里胡哨的博客主题,比如背景弄一些酷炫的 canvas 搞得电脑风扇直转。从阅读者的角度来说,(博客)网站只需要做到:
- 良好的阅读体验,包括字体、图片、颜色,别搞些绿底黄字的非人间配色;
- 文章长的话最好有目录,方便阅读;
- 链接的持久性,不要让阅读者在百度或者其他地方索引过来发现是 404;
- RSS (当然也可以不提供,需要的人可以用 feed43 之类的爬虫,但是没必要);
这些一般的博客引擎都能满足,实在没有瞎折腾的必要。而对于博客本身,其实最重要的只有一个 —— 文章质量!其他的都是扯谈,如果是内容农场那就另当别论。
关于 credit
很多人在自建博客时习惯把底部的 credit 去掉,比如 Power by Hugo / Theme By XXX
这种信息。我以前也会这样,一方面是为了简洁,另一方面也是希望能有一些“个性”,生怕宝藏主题被别人抄去了导致烂大街;或者就是干脆想让别人认为这是自己写出来的。
其实大可不必。首先你不是一个前端工程师,所以前端技能并不是别人想要从你身上学习的点。反过来说,如果你是前端,那么自己写一套主题那也应该是常规操作,投机取巧并不能让你自己有所受益;其次,留下主题信息可以让更多看到的人去使用是件好事,获得更多关注后就可能潜在引入更多的开源贡献,最终能让你自己获得更好的使用体验;最后,credit 是对原作者劳动成果的一个起码尊重,谁也不想自己辛苦开发或者写的东西被白嫖党滥用。
在看许多国外的 slides 或者文章时候经常看到对于图片、截图如果不是自己画的都会有明显说明来源何处,国内经常就是拿来就用,当然俺也一样,不过已经在改了。
关于时间
年轻的时候喜欢做加法,奉行 艺多不压身 的准则,对于各种不同领域都喜欢去探索和学习,现在也还是会有很多冲动。但是随着任务列表的逐渐变长,里面的很多项目很可能会一直沉睡在收藏夹中。到了一定的阶段,就需要学会管住自己的双手,把时间用在刀刃上。也就是说,需要学会给人生做减法了。
除了前面提到的博客系统,我还做过很多浪费时间的事情,比如自己写 XSS 盲注后台、DNS服务器(SSRF)、GPS钓鱼系统、写各种命令行工具去实现本可以在网页做到的功能。……
各种命令行工具,有查单词的:
$ dictionary.py restrain
##########################
### Youdao Translation ###
##########################
restrain: 抑制
us:[rɪˈstreɪn], uk:[rɪˈstreɪn]
=== basic ===
vt. 抑制,控制;约束;制止
=== web ===
restrain: 阻止,抑制,限制
Ratio restrain: 比率制动
restrain test: 栓固试验
$ abbr.py PUA
[+] found 25 results
+------+----------------------------------------+-----------------------------------+------+
| name | desc | domain | rate |
+------+----------------------------------------+-----------------------------------+------+
| PUA | Pandemic Unemployment Assistance | Miscellaneous / Unclassified | 5 |
| PUA | Potentially Unwanted Applications | Miscellaneous / Unclassified | 4 |
| PUA | Potentially Unwanted Application | Computing / Software | 4 |
| PUA | Pick Up Artist | Community / Performing Arts | 3 |
| PUA | Public Use Area | Miscellaneous / Unclassified | 2 |
| PUA | Puas, Papua New Guinea | Regional / Airport Codes | 2 |
| PUA | Private Use Area | Community | 2 |
| PUA | Personal User Agent | Miscellaneous / Unclassified | 2 |
| PUA | Professional Underwriters Agency, Inc. | Business / Companies & Firms | 1 |
| PUA | Professional Underwriters Agency | Business / Agencies | 1 |
| PUA | Present under Arms | Miscellaneous / Unclassified | 1 |
| PUA | Premium Upgrade Assurance | Miscellaneous / Unclassified | 1 |
| PUA | Potentialy Unwanted Application | Miscellaneous / Unclassified | 1 |
| PUA | Potentially Unwanted Apps | Miscellaneous / Unclassified | 1 |
| PUA | Possession and Use Agreement | Miscellaneous / Unclassified | 1 |
| PUA | Portland Urologic Associates | Business / Companies & Firms | 1 |
| PUA | Plasma Uric Acid | Academic & Science / Chemistry | 1 |
| PUA | Pick Up Artists | Community / Art | 1 |
| PUA | Pharos University in Alexandria | Academic & Science / Universities | 1 |
| PUA | Peoples University of the Americas | Academic & Science / Universities | 1 |
| PUA | Pediatric Urology Associates | Medical / Pediatric | 1 |
| PUA | Payment Undertaking Agreement | Miscellaneous / Unclassified | 1 |
| PUA | Partido de Unificación Anticomunista | International / Guatemalan | 1 |
| PUA | Paid Up Additions | Miscellaneous / Unclassified | 1 |
| PUA | Paul University, Awka - Anambra State | Academic & Science | 0 |
+------+----------------------------------------+-----------------------------------+------+
有查股票的:
有查 IP 地址的:
$ iplocate.py --on 1.1.1.1
>>>>>> results for 1.1.1.1 <<<<<<
[*] GeoLite : 澳大利亚(AU) - None
[*] Kn0007 : CLOUDFLARE.COMCLOUDFLARE.COM
[*] DBIP : OC(Oceania),AU(Australia) New South Wales, Sydney
[*] Tencent : 澳大利亚 code(-1) lnglat(149.1333,-35.2667)
[*] IPIP : ["CLOUDFLARE.COM","","","",""]
复杂一点的还有代理池管理工具,书签管理工具等等:
有些小工具就是三下五除二就弄好了,但是有些就颇花了些时间。要说有没有必要,其实很多都没必要,想要开车并不表示需要自己造轮子。原型开发的过程还是很有趣的,但是其中有许多项目做完之后也就爽那么一下,然后就很长时间都没用过。
为了避免这种做无用功的尴尬,重要的是管理好自己的想法。对于时不时冒出来的 idea 可以先记录下来,到周末或者某个固定时间再进行排序,评估哪些可以做、需要做,哪些可以借助已有的轮子。站在巨人的肩膀上,而不是盲目追求写代码的快感。
曾经的想法是**"因为我可以做,所以我就去做"**,但重要的是管理好自己的精力和时间。学习也是一样,各种新概念层出不穷,开始学习之前需要先评估这究竟是不是你需要的,而不是因为看起来很热门就去投入。
Be curious , but don't get drown.
关于白嫖
在迁移博客的时候发现 Chrome 新版本对于 https 站点中的所有 HTTP 资源都拒绝加载了,导致以前七牛 CDN 上的图片都无法显示,而七牛的 HTTPS 流量又是收费的,所以我决定换一个图床。为了找一个新的 HTTPS 免费图床,我翻了很多记录,发现很多免费站点都已经无法访问了,最终是选择使用某个博客平台的图片上传功能,为了批量上传还分析了该平台的验签和加密算法。
虽然最终目标实现了,但我也耗费了大半天的时间。都是传统的白嫖思想在作祟,因为从小习惯了免费。免费的聊天工具,免费的游戏,免费的操作系统,免费的杀毒软件,……这其实完全没有道理。如果一个东西做的很好,但是完全不赚钱,那么开发者是否还会投入那么多精力去维护呢?一腔热情投入开源工作,还要面对各种小白的挑刺以及伸手党的催促,个中滋味只有经历过才能体会到吧。
我们花几百块钱吃一顿饭觉得合情合理,但是花几十块钱购买在线服务或者软件就踌躇不决。但是说到底,白嫖终究不是长久之计。一个免费 CDN 需要在流量和速度上进行限制,一个免费的云服务器不会提供可用性保证,一个免费的图床可能说挂就挂,能在下线前告诉你一声已经仁至义尽了。
白嫖在线的服务需要自己承担稳定性和迁移风险,白嫖本地应用需要忍受广告和推送,这世上本就没有免费的午餐。如果上天能给我个再来一次的机会,我想说:
最近看到一篇新闻感觉很有意思,微信推出看一看
、小视频
等功能,不是因为用户需要,而是面对头条对 用户时间 的蚕食感到不安 —— 用户每天花在微信的时间从 X 小时下降到了 Y 小时,而在头条系产品中投入的时间从 M 小时增加到了 N 小时。第一次对"时间就是金钱"有了别样的认识。
你以为你白嫖赚到了,其实最后被嫖的是你自己。