VirtualBox 启动本地硬盘上的另一个系统
note

有时候我不得不使用 Windows:比如宣传部的小伙伴给我发来一个 PSD 文件时,比如计算机基础老师突然布置 MS Office 作业时。虽然 Krita 已经部分支持 PSD 格式、LibreOffice fresh 已经能完美支持打开和编辑 MS Office 文件;但这毕竟是两种不同的工具,总归是有区别的:就算它能完美兼容,界面也是不同的,我无法参考老师发过来的教学视频操作。而我又不想频繁地重启,虚拟化启动本地系统这个功能对我来说就十分有用了。

首先展示一下我当前硬盘的分区情况车祸现场:

让我解释一下这样恶心的分区是怎么造成的。/dev/sda2 是 Windows Boot Manager,Windows 用于启动自身的工具;/dev/sda3 是 Windows 系统所在分区;/dev/sda{4..6} 是戴尔电脑出厂自带的恢复工具和 Windows 镜像。/dev/sda7 是从 /dev/sda3 中压缩出来建立的分区,所以你会看到下面有 “分区表项与硬盘次序不同” 的提示。

然后我在 /dev/sda7 上建立了一个 lvm pv,Linux 系统是安装在 lvm 上的。如果你不知道 lvm 是啥也没关系,你只要知道 Linux 系统数据是在 /dev/sda7 里的就可以了。GRUB 是和 Linux 安装在一个分区里的,/dev/sda1 里的默认引导项是 GRUB。

为了避免之后使用 root 权限启动 VirtualBox 图形界面,我们先给自己一个读写分区的权限。我们需要 EFI 分区、Windows Boot Manager 分区和 Windows 分区。

然后创建一个 VirtualBox 的硬盘映射文件:

然后启动 VirtualBox,按照正常步骤创建一个新的虚拟机,只不过在硬盘那里选择你刚刚创建的那个硬盘映射文件。

使用 Next.js 重写博客框架
blog

如果你看过我之前的博客的代码,你应该会知道我的博客虽然使用了 Vue.js 这样的前端框架,但我仅仅用了它很基础的功能。我并没有采用 vue-cli 生成的模板,而是仅仅把 Vue 用 Webpack 加载到 JS 里,然后在 HTML 中把 bundle 后的 JS 用 <script> 标签加载出来,再把 HTML 文件作为模板,使用 Python 的 Jinja2 模板引擎将各数据填入模板来生成各个页面。

而随着前端的发展,出现了 SPA(单页应用)。单页应用在切换页面时不需要像传统页面那样整个重新加载一个完整的网页;而是使用路由(routing)技术,切换页面时只需要用 XMLHttpRequest 加载一点点数据,然后操作 DOM 将页面显示的内容改为数据就好了。许许多多的前端框架如 React、Vue、Angular 就是为此设计的。

既然有这样的好处,为什么我不把博客框架写成 SPA,而是用老掉牙的模板引擎来生成呢?原因在于 我太菜了不会写 我希望我的博客能被各种各样的用户访问。直接使用前端框架写出来的 SPA 的 HTML 入口往往不包含页面内容,需要在浏览器运行 JavaScript 操作 DOM 后才给页面加上了内容,如果关闭 JavaScript,页面就只会显示一个 You need to enable JavaScript to run this app.。虽然很少有人会关闭 JavaScript,但总有人出于各种各样的考虑这么做:有人认为网页应该是一个文档,应该是用来浏览的而不是用来交互的;有人为了安全、担心 Cookies 泄漏而安装了 NoScript 插件;有人不喜欢过于复杂的现代浏览器,使用一些简单的、只能识别 HTML 的浏览器(如 w3m)。

我一直认为,可定制性是 “自由” 的一个基本内涵。所以我希望我的网页就算关闭 JavaScript 也能维持一些基本的功能。

另外,多数搜索引擎只会去抓取你的 HTML 内容,如果你页面的数据都在 JS 里搜索引擎很有可能是抓不到的。使用这些前端框架对 SEO(搜索引擎优化)不友好。这也是绝大多数人使用 SSR 的原因。

后来我才知道服务端渲染(Server Side Rendering,SSR)这种技术。同样使用这些前端框架,SSR 指先把这些 JS 在服务器上跑一遍,将生成的 HTML 一起部署。这样浏览器一开始就得到了一个完成了的 HTML,不管你有没有禁用 JavaScript 都可以浏览。同时在切换页面时又可以使用 CSR (浏览器端渲染)提升加载速度。

(我发现最近 GitHub 也开始使用这类技术了,很多时候你在切换页面时看到的进度条不再是浏览器的进度条,而是页面内顶端的蓝色进度条,你有没有感觉 GitHub 使用起来稍微快了一些呢?)

运算放大器
note

稍微庆祝一下我找到了失踪了两年的笔记本 🎉️,这篇笔记就是从我的这个笔记本上扒下来的。

这是一个运算放大器,它是一种模电的设备。VS+ 和 VS- 是运算放大器的电源接口,实际应用时会用到,但是在制作原理图时为了方便常常会省略画出。V+ 和 V- 之间是几乎绝缘的,运算放大器最直接的作用就是感知 V+ 和 V- 之间的电压差,然后放大。放得非常大: $$ V{OUT} = \begin{cases} a (V+ - V-), a(V+ - V_-) \lt V_S\\\\ VS, a(V+ - V_-) \geq V_S \end{cases} $$ 其中 a 就是放大倍数,我们常常只知道这是一个很大的数,它的数值可能是几百万,但我们常常不知道他的具体值。不同厂商生成的不同型号的运算放大器的放大倍数会有不同,甚至于同一个运算放大器的放大倍数也极其不稳定、易受温度影响。

那么如何减少运放受温度的影响并控制它的放大倍数呢?

(这里我们省略了电源接口,并假设电源可以提供足够高的电压。)

首先运算放大器会将 V+ 和 V- 之间的电压放大: $$ V{OUT} = a (V+ - V-) $$ 其中 V+ 就是 VIN。而 V- 接在 Rf 和 Rg 分压的 VOUT 和 GND 之间,所以: $$ V- = V_{OUT} \cdot \frac{R_g}{R_f + Rg} $$ 代入: $$ V{OUT} = a (V{IN} - \frac{V{OUT} \cdot R_g}{R_f + Rg}) $$ 左边是 VOUT,右边也有 VOUT,我们本能地变形一下式子: $$ V{OUT}(1 + \frac{a \cdot R_g}{R_f + Rg}) = a \cdot V{IN} $$

$$ V{OUT} = \frac{a \cdot V{IN}}{1 + \frac{a \cdot R_g}{R_f + R_g}} $$

Cloudflare 成功击毙了 Caddy server
blog

今天重启 caddy 时突然遇到这个状况,来来回回搞了一个半小时才解决。总之记录一下,顺便加些科普内容。

Caddy 是一个自动申请证书的 HTTPS 服务器软件。有点乱?没关系,我们捋一下。

写好一个网站后你需要怎么部署你的网站?你会租一台服务器,然后怎么做?

如果是一个静态网站,那么你可以直接将你网站的所有静态放在一个路径下,然后用一个软件监听这台服务器的 80 端口;如果有人访问你的域名指向的这台服务器的 IP,你就把那个路径下对应文件发给他。这样的一种软件叫做静态服务器软件,最简单的 python3 -m http.server 就是一个例子。

如果是一个动态的网站,也就是发送给访问者的内容是收到访问请求后每次动态生成的网站。要做这样的网站就可以写一些程序监听这台服务器的 80 端口,访问者将请求发给你写的程序,你写的程序生成各种文件后将文件发给访问者。这种网站就不需要使用一个静态服务器软件,你写的程序就是一个服务器软件。

但是很多情况下,我们还需要更多的功能。比如现在我想要给我的网站启用 HTTPS,这样我的用户和我网站之间发送的数据是加密的,不会被黑客窃取或篡改。要做到这个我是不是得给我的程序加上 TLS/SSL 的各种非对称加密算法?我想要在一台服务器上运行两个网站,但是 80 端口只有一个啊?我可以识别用户请求时发来的 HTTP header,这里面包含了用户到底请求的是那个网站,然后再把对应的网站通过 80 端口发给他,这样我就可以在一台服务器上运行多个网站了。这些程序逻辑总不会都要我自己写吧?

当然不是,我们可以让我们写的动态网站程序监听其他端口,然后用一个软件将用户的请求转发到这个端口上,你写的程序收到请求后返回的内容再由这个软件通过 80 端口转发给用户。相当于给你的程序套了个壳,在这个壳上可以做各种修饰:加入证书启用 TLS 并监听 443,我们与用户之间的连接就有加密了;同时让多个端口通过 80 端口转发,一台服务器上就可以运行好几个网站了;这种软件叫服务器软件。

运用最广泛的两种服务器软件是 Apache httpd 和 Nginx。而 Caddy 与这两者最大的区别就是 Caddy 会自动申请证书。

夏日最终章
blog

本来在这篇 blog 之前还有一篇我打算在夏初写的 blog 叫 “夏日吟” (chant-of-summer) 的,但因为我一直没想好要写什么于是一直拖了四个多月。眼看就立秋了,想着再不留下点什么这个夏天就没有我的足迹了,所以就有了这篇 “夏日最终章”。

从哪里说起好呢?先说我对夏天的感觉吧。尽管很多人对夏天有着很特殊的情感、夏天也被赋予了各种各样的寓意。但可能是因为我在夏天出生的缘故,我对夏天是从来没有什么好印象的。我对夏天的感觉就是热,在烟熏火燎的一天天中,向来是很难看出什么诗意的。

相比之下我更喜欢冬天。尽管这意味着皲裂的嘴唇和疼痛的脸颊;意味着行动不便,有时拿起电烙铁和镊子都成为问题;意味着寒风,会从房门的缝隙钻入身上的每一个细胞。但有时候,低温可以衬托出人情的温暖。尽管很多时候,这是虚拟出来的——通红的脸颊、专注的注视。在这么多人聚集的教室里,本来是不会太冷的——就连这份寒冷都有点虚拟出来的意味了。

冬日的人对暖阳的渴望是很深沉的。但一旦暖阳真的到来,冬日就像一个容易醒来的梦,在暖阳的照耀下尽数消散。而在夏天,陷入梦境的人将长期在梦境中漂泊,即使醒来,也会感觉怅然若失。

而这,就是夏天对于我的意义:不甘。

不甘是一种微妙但并不美好的情感。它能让败北的敌军再度发起进攻,让已经分手的恋人重新走在一起,让人去一次次挑战已经被证伪的命题,去寻找不存在的可能性。

够了,真的够了。与其在这样的夏天中一直轮回下去,不如放下这个夏天,去寻找其他的出口。你是这么想的,并且也是这么做的。你摸到了一扇门,用力地拉着门把手,直到精疲力竭。

那个人还留在原地,他和你又一样的不甘,但他显然更加难过。“要过去吗?”你向自己提问。你再次做了不甘的奴隶。

林姆蒂克
blog

很久很久以前,雪山上居住着一个精灵,它的全身都由霜、雪构成。人类刚开始出现、炊烟第一次升起后,一朵朵水雾飘过当时世界上最高的雪山,于是便凝成了它。它整天坐在雪山顶上。它的听力十分灵敏,灵敏得可以听见人类的心声。每当人们遇到了困难,它就会小声地给出提示。雪山上的风很大,提示便随着风飘来飘去,有时候可以飘入遇困人的耳朵,有时则不能,有时甚至飘到了别人的耳朵里。

最早的语言出现后,有一批冒险者(现在应该称做科考队员)登上了这座雪山。正当他们愁于如何下山时,他们听到了它的指引,于是这批冒险者很顺利地下了山。这件事很快在他们的部落里传开了。人们把这个精灵叫做 “林姆蒂克”,这在当时的语言中就是 “灵感” 的意思。

时至今日,那门语言早就失传了,但 “林姆蒂克来了” 这个句式却流传至今。比如说,当你隔壁的苏珊阿姨想出了今天做什么菜时,她就会拍掌喊到:“啊!灵感来了!”

中世纪末期,有几个商人为了躲避仇人的追杀逃上了这座雪山。由于刚开始登不久他们就听到了林姆蒂克的指引,所以整个登山过程并没有多么艰难。登上后他们又按照提示在雪山上生了一簇火。火堆散发出大量的热量,很快林姆蒂克便被烤化了。林姆蒂克蒸腾开来,重新变为水雾,随风飘至各地,溶解在河流、江海之中。(也有一说是顺地下水进入河流)

所以当你遇到困难、难以解决时,最好喝一口水,没准林姆蒂克就来了呢。