日遇三险II

本文仅代表个人观点。如有冒犯,请直接开骂。

因何而起

2021 年夏季学期,由于没什么事干,本人准备在没什么事的时候进行一波博客框架的更换,顺便让自己的博客主题能够自主可控。前几天开始进行此事的筹划。终于在调查了一圈之后选择了原框架(

至于为什么不肯放弃 jekyll,那必然是自己不想从头对一个复杂的博客框架进行学习。平时对 PWN 题目的逆向就够我受的了,现在再去看这些不可名状的代码,想都不要想。

所以这一个博客改造计划便开始了。

大刀阔斧

首先推一下主题作者的原主题 jekyll-theme-WuK。之所以我选择这一个主题,是因为这一主题从字体、背景等设置上更加偏向于国人的习惯,阅读起来更加舒适。至少我不会去强行选一个英语系开发者写的办公风主题。

但是这套主题经过 那个男人批评,以及我读完《写给大家看的设计书》之后的自我审视后,愈发感觉需要调整。

主页

首先就是主页。这个是最能体现诟病的一处。

事件一:朋辈导生尴尬时刻。本人写过选课相关的文章。在推荐给新生之后,新生返回主页,在 home 找了半天没找到文章在哪里。

事件二:B 哥的批评。B 哥说我网站很乱。我问他哪里乱,他说哪里都乱。

事件三:那个男人的批评。大概就是说,你们这些年轻人,整天花里胡哨的。你这博客都能做 PPT 了。

为了解决这些,干脆直接把主页设置成单入口。因此只留下了博客的大标题,以及一个大大的 ————>QuickStart<———— 按钮,链接到 /tags/。这样既保留了主页的展示功能(让你知道 👴 是 👴 而不是其他的 👴 ),又能保持网站的简洁性。

标签和归档

在我使用的版本,标签和归档页面前面的字体是不对齐的。如果文章少还影响不大,文章一旦变多,前面的时间栏就 犬牙差互,斗折蛇行,严重影响观感。

CSS 中对 font-family 的解析是按照你书写的顺序来的。

for i in font_family:
    if i.exist():
        i.screen_print()
        break

所以一定是因为某一个非等宽字体被放到了前面。

... {
    font-family: PingFang SC, Menlo, Monaco, "Courier New", Microsoft JhengHei, monospace;
}

这样直接三个苹果字体甩到脸上,windows 直接忽略。肯定是不行的。我直接选择把三个等宽英文字体甩脸,这样能直接把英文全吃掉。

无意义的统计信息

本主题原来的文章开头有发表时间、对字数的统计、和按照阅读习惯对字数转换成的阅读时间、使用的 license 以及 打赏链接。

对于多种主题博客进行考察之后,发现有很少人会把过多的信息放到最上面,甚至有人只放一个标题。于是将 license 和 链接 放到了文章的最后面,紧跟着评论。这样既不影响阅读,也不失他的作用。

TODO

admonition,这是我一直想做的。大概像下面这样

这是一个 success,log.success(“libc_base = “+hex(libc_base))

这是一个 info,context.log_level = ‘info’

这是一个 warning,黄灯亮了等一等

这是一个 error,但是没有出错

这一部分我一直想加到博客中。用过 pwntools 的选手应该有感触。用 info(hex(address)) 和用 print(hex(address)) 的区别还是很大的吧。你是想用 print 打印出一个不起眼的地址,还是用一个 [+] 来表示出你泄露出 libc 地址的喜悦?

然而,做这个直接让我的博客下线了整整半天。

对比 Python-Markdown 这门方言,显然 kramdown 对 admonition 的支持比较差,需要自己定制一个。

首先被我发现有这个特性的是 nshipster.com 这个项目。显然,此项目使用 _plugins 下的 admonition-block.rb 进行了插件安装,注册了 info warning error 三个 liquid 标签。当要在 markdown 中使用时,只需要用 {% info %} 这样的标签进行包裹文本,对应的文本就会在渲染时被加上 <div class="admonition info">。对应的 scss 文件在此时对这个 class 进行渲染,就可以得到 admonition 了。

但是这有一个问题,那就是如何注册标签。

# frozen_string_literal: true

module Jekyll
  class AdmonitionBlock < Liquid::Block
    def initialize(tag_name, arguments, tokens)
      super

      @type = tag_name
    end

    def render(context)
      content = super
      <<~EOD
        <aside class="admonition #{@type}" markdown="1">
         #{content}
        </aside>
      EOD
    end
  end
end

Liquid::Template.register_tag('info', Jekyll::AdmonitionBlock)
Liquid::Template.register_tag('error', Jekyll::AdmonitionBlock)
Liquid::Template.register_tag('warning', Jekyll::AdmonitionBlock)
Liquid::Template.register_tag('success', Jekyll::AdmonitionBlock)

这是我改写之后的版本,注册标签,让这个标签包裹的文本在渲染时被套上 <aside class="admonition #{@type}"> 这样的标签。

但是在 jekyllcn.com 相关文档中提到了:

GitHub Pages 是由 Jekyll 提供技术支持的,考虑到安全因素,所有的 Pages 通过 –safe 选项禁用了插件功能,因此如果你的网站部署在 Github Pages ,那么你的插件不会工作。 不过仍然有办法发布到 GitHub Pages,你只需在本地做一些转换,并把生成好的文件上传到 Github 替代 Jekyll 就可以了。

这就意味着我需要把 jekyll build 生成的 _site 复制到 git 里面然后 push 到 github 上。相当于把 github pages 原生支持变成了第三方。

这倒是也不麻烦。很多 github pages 用户都是第三方主题。

于是把插件安装到 _plugins 目录。直接进行 jekyll build。报错。

jekyll 3.9.0 | Error: Liquid syntax error (line 86): Unknown tag ‘info’

也就是说我的标签就根本没有被注册成功。于是我想起来 jekyll 文档里面的 所有的 Pages 通过 --safe 选项禁用了插件功能。怀疑是不是本地配置就是 github-pages 的配置。

#gem "jekyll", "~> 4.1.1"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
#gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
gem "github-pages", group: :jekyll_plugins

果然。把上面两个 gem 注释去掉之后再次 build,成功。

崩溃

_site 目录下的所有文件 push 到 github repo,Environments 也正常启动了,上述的诸多改动也显示正常。但是在点进一篇文章时出现了错误。

本以为文章访问是正常的,但显示的却是 这个页面

猜想一:目录不对。查看 _site 目录下有各个文章的文件夹,文件夹下有 index.html,但是从标签或者归档页面下访问的 url 没有 index.html。但是加上以后也不好使。 查看 github repo,发现文件夹名称带下划线前缀的都不可见。因此建立 posts 文件夹,放进去,不好使。怀疑直接加文章名可以,尝试,失败。

猜想二:所有页面直接导向 404.html。直接证明这个猜想是错误的。只有文章导向了 404,tags 等页面仍然正常。我直接把 404 给🐏️了都不好使。

猜想三:还是目录不对。一开始拿 nmap 扫了一下,但是我不知道 nmap 是干啥的,随便扫了一下也不知道啥意思。然后咨询 aidai,他建议写个 shell 进去看看博客的目录,但是我怕被🐏️掉。最后想用 actions 定制一个 docker 指令来定向目录来部署。最后发现这玩意根本就不是用来部署的。

面对着一个 404 页面,我陷入了迷茫。

我是谁?

我在干什么?

我为什么要写博客?

ruby 怎么还不倒闭?

到现在已经完全麻了。

此时有两个选择,一个是把版本回退,无事发生;另一个是换个思路,重新来过。

在我即将考虑回退之时,我,看到了 kramdown。

文档里面有这么一段:

Here are some examples for block IALs:

A simple paragraph with an ID attribute.
{: #para-one}

> A blockquote with a title
{:title="The blockquote title"}
{: #myid}

{:.ruby}
    Some code here

意思是我可以通过添加 { } 的方法对网页标签加 class。也就是说,我可以通过 markdown 将此问题转化为 css 的问题。

这简单,直接一个 <link> 把 css 给引入就完事了。想法成立,实践。

jekyll 原生支持 sass,于是建立一个 _sass,里面放 scss 文件。然后在 css 文件夹,只把上述文件 import 一下,head 引入。再写一个 test。成功。

test

本地测试成功。既然没有用到插件,那么 github pages 应该也好使。直接整个文件夹复制过来,git push,成功。

👴 的博客从好使到大刀阔斧到崩了再到好使,几乎把整个博客代码看了一遍,用自我定制的方法对博客实现了自主可控。

妥协

接上回……

ProductName: macOS,ProductVersion: 11.4

今年年初之时,本人电脑出现了指纹解锁失败的情况。之后经过多次调查,真实情况是某个驱动无缘无故进行无限制 fork,把内存跑炸了。如上的 info 信息,本人在上次日遇三险之后忍受不了密码解锁的麻烦。选择了向系统妥协,将自己的 mac 升级到了 macOS Bug Sur。


如果这篇博客帮助到你,可以留言夸夸我~
CC BY-NC 4.0 (除特别声明或转载文章外)