Linux 上各种 DE 和 xrdp 的兼容性

需求

稣主要使用 macOS 和 Windows 远程桌面访问 Windows 和 Linux,所以 Linux 下哪个 DE 对 xrdp 支持最好呢?

选手

在过去Linux 桌面玩稣的时代,主要使用以下 DE:

  • GNOME
  • Cinnamon
  • MATE
  • Xfce
  • KDE
  • i3

其中 GNOME 和 KDE 太大了,而且对 xrdp 支持并不好,不想再使用,直接淘汰。加入两个从没使用过的选手:

  • LXDE
  • LXQt

但由于它们太像了,简单看起来仅仅是样式不同,所以算一个吧。

对比

以下为最直观的感受,没有深入去折腾。

DE 名称 GUI 下支持的缩放个数 缩放有效否 明显的坑
Cinnamon 5 个(100、125、150、175、200) 是,立刻生效 第一次设置缩放后,开始菜单高度没变高,是个矮个子的错误状态,注销再登录才正常
MATE 2 个(100、200) 是,立刻生效 没有 Cinnamon 漂亮,界面布局需要适应,容易把左下角的“显示桌面”当成开始菜单
Xfce 5 个(100、125、150、175、200) 否,即使重新登录也无效 永远 100% 的缩放
i3 0 个(自己改配置去!) 否,改配置后无法在一次会话里即时成效 WIN 键有时候失灵,是在不同 RDP 客户端连接下键值可能和服务端本地不同!
LXDE/LXQt 0 个 否,界面上没找到地方改 永远 100% 的缩放,即使 RDP 客户端已经记住密码,每次登录必然再弹出对话框要求输入密码。

结论

似乎就 Cinnamon 和 MATE 是应该一起安装的!一个大哥,一个小妹,能互补,还能偶尔换换口味。

Xfce 和 i3 也许折腾几下也能好用。

不过,以上,在 Windows 面前,都是乐射……不管本地、还是被远程,Windows 都完美缩放。

CMCC RAX3000M 刷 OpenWRT

需求

写于 2020-03-23 21:57:52 的《家用 WiFi 方案》已经是 4 年前的方案了,现在流行 Mesh 方案。正好手头上有两台 2023-11-24 产的 CMCC RAX3000M NAND 版,那就把它们刷成官方版 OpenWRT 再来和红米 AX6S 一起 Mesh 吧!

参考

  1. OpenWRT Techdata: CMCC RAX3000M

  2. mediatek: add CMCC RAX3000M support

  3. Setting up a TFTP server for TFTP

  4. RAX3000M刷OpenWRT官方版本23.05.2

  5. 关于CMCC RAX3000M 刷机防变砖教程

  6. RAX3000M 刷固件时没刷BL2,还需要重新刷入吗?

  7. H3C Magic NX30 Pro 官方 OpenWrt 安装教程

  8. 关于mt7621原厂固件启用nmbm的提醒

  9. mediatek/filogic预编译镜像中带nmbm字样的应该如何安装?

警告

  1. 目前(2024-04-08),OpenWRT 官方还不支持 NMBM,所以刷机有一定风险!万一 NAND 有坏块,有可能无法启动。
1
2
3
4
5
6
7
root@RAX3000M:/tmp# dmesg | grep nmbm
[ 0.685313] nmbm nmbm_spim_nand: Signature found at block 1023 [0x07fe0000]
[ 0.693039] nmbm nmbm_spim_nand: First info table with writecount 0 found in block 960
[ 0.703133] nmbm nmbm_spim_nand: Second info table with writecount 0 found in block 963
[ 0.711141] nmbm nmbm_spim_nand: NMBM has been successfully attached
[ 0.717754] 8 fixed-partitions partitions found on MTD device nmbm_spim_nand
[ 0.724799] Creating 8 MTD partitions on "nmbm_spim_nand":
  1. 这是 1124 版、NAND 版,非 eMMC 版,其它版本不保证可行。

软件工具

  1. 大部分系统都自带的 ssh 命令,可选 scp 命令或 winscp。大部分镜像文件都可以直接在路由器里用 wget 下载,如果您已经在电脑上下载好,也可以用 scp 命令或 winscp 上传到路由器。

  2. Linux 系统,或 Windows 上的 WSL。

  3. tftpd 或其它同类 TFTP 服务端。

具体步骤

1. 开启路由器 ssh 服务端

原理:导出配置,修改配置使能 dropbear,导入配置。

原版固件里导出的配置是一个加密的 tar 包,要编辑它,需要先解包,在 Linux 或 WSL 操作:

1
openssl aes-256-cbc -d -pbkdf2 -k $CmDc#RaX30O0M@\!$ -in cfg_export_config_file.conf -out - | tar -zxvf -

解开后,做两件事:编辑 etc/config/dropbear 允许 dropbear 和编辑 etc/shadow 修改 root 密码。

dropbear 里删除以下行,或把 0 改为 1:

1
option enable '0'

shadow 里的第一行格式为:

1
root:$1$<salt>$<password>:<unconcerned>

即,只关心第一和第二 : 之间的 <salt> 和 <password>,如果您能破解出 <password> 的明文,那可以不用改了;否则就用 <salt> 生成一个新密码,去替换 <password>。

1
openssl passwd -1 -salt <salt> OpenWRT

以上命令产生明文为 OpenWRT 的密码,拿它替换 shadow 里的原始密码。然后把修改后的文件再打包回去:

1
tar -zcvf - etc | openssl aes-256-cbc -pbkdf2 -k $CmDc#RaX30O0M@\!$ -out cfg_export_config_file_ssh.conf

拿 cfg_export_config_file_ssh.conf 去恢复配置,重启后,即可用 root 身份 ssh 到路由器。

2. 备份原始分区

这步可以跳过,对一些人来说,备份意义不大,不可能刷非官方 OpenWRT 的。请自行斟酌。

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
root@RAX3000M:~# cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00020000 "spi0.0"
mtd1: 00100000 00020000 "BL2"
mtd2: 00080000 00020000 "u-boot-env"
mtd3: 00200000 00020000 "Factory"
mtd4: 00200000 00020000 "FIP"
mtd5: 03d00000 00020000 "ubi"
mtd6: 02500000 00020000 "plugins"
mtd7: 00800000 00020000 "fwk"
mtd8: 00800000 00020000 "fwk2"

# 备份 mtd0 - mtd8
dd if=/dev/mtd0 of=/tmp/0.img
dd if=/dev/mtd1 of=/tmp/1.img
dd if=/dev/mtd2 of=/tmp/2.img
dd if=/dev/mtd3 of=/tmp/3.img
dd if=/dev/mtd4 of=/tmp/4.img
dd if=/dev/mtd5 of=/tmp/5.img
dd if=/dev/mtd6 of=/tmp/6.img
dd if=/dev/mtd7 of=/tmp/7.img
dd if=/dev/mtd8 of=/tmp/8.img

# 以上每条 dd 命令运行后,需要立刻在电脑上用 scp 把文件复制到电脑,
# 并删除路由器里的文件,防止 /tmp 被写爆

3. 刷 uboot

1
2
3
4
5
6
7
8
9
wget https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip

# wget https://downloads.openwrt.org/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip
# sha256sum openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip
# f60d7aa3dcd854a5a39c2b3e05cdc9985460d4b358d02e96d51c50f476650270

# 3. Erase and write new FIP:
mtd erase FIP
mtd write openwrt-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip FIP

4. 刷 OpenWRT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
4. Set static IP on your PC:
IP 192.168.1.254, GW 192.168.1.1

5. Serve OpenWrt initramfs image using TFTP server.
# 文件名需要去掉版本号,即改为:
# openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb

6. Cut off the power and re-engage, wait for TFTP recovery to complete.

7. After OpenWrt has booted, erase UBI volumes:
ubidetach -p /dev/mtd0
ubiformat -y /dev/mtd0
ubiattach -p /dev/mtd0

8. Create new ubootenv volumes:
ubimkvol /dev/ubi0 -n 0 -N ubootenv -s 128KiB
ubimkvol /dev/ubi0 -n 1 -N ubootenv2 -s 128KiB

9. Additionally, if you want to have NAND recovery boot feature:
(Don't worry! You will always have TFTP recovery boot feature.)
ubimkvol /dev/ubi0 -n 2 -N recovery -s 20MiB
ubiupdatevol /dev/ubi0_2 openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb

10. Perform sysupgrade.

5. 刷 bl2

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
root@UMUTech:~# cd /tmp

# 查看 mtd 分区信息
root@UMUTech:/tmp# cat /proc/mtd
dev: size erasesize name
mtd0: 07200000 00020000 "ubi"
mtd1: 00200000 00020000 "fip"
mtd2: 00200000 00020000 "factory"
mtd3: 00080000 00020000 "u-boot-env"
mtd4: 00100000 00020000 "bl2"

# 同步仓库源
root@UMUTech:/tmp# opkg update

# 安装 kmod-mtd-rw 内核模块
root@UMUTech:/tmp# opkg install kmod-mtd-rw

# 将分区配置为可读写
root@UMUTech:/tmp# insmod /lib/modules/$(uname -r)/mtd-rw.ko i_want_a_brick=1

# 下载 preloader
root@UMUTech:/tmp# wget https://downloads.openwrt.org/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin

# 刷写 BL2 分区
root@UMUTech:/tmp# mtd write /tmp/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin bl2
Unlocking bl2 ...

Writing from /tmp/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin to bl2 ...

macOS 上用触控 ID 安全登录 SSH

需求

  1. 使用文件存 SSH 私钥,其实安全性挺堪忧的:如果私钥没有密码,任何程序都可以直接读取,被流氓软件偷偷上传怎么办?为了安全,给私钥加密,这就要输入密码,麻烦。而且输入密码时,又可能被偷。

  2. 有没有一种木马专门针对 ssh-agent 呢?您把密钥的密码交给 ssh-agent​,真放心吗?

  3. 稣特地买了一台 MBA 13 M1 乞丐版装 Asahi Linux,结果触控板在 Linux 下表现不如 macOS 下好用,Touch ID 还不能用,又回 macOS 了。既然回 macOS,就需要开发 Touch ID 更多功能,不然怎么对得起吃灰的 Asahi Linux?

总之,稣需要一种更安全的 SSH 登录方式,那就是——用 Touch ID 登录。

原理

安全隔区(Secure Enclave)是集成到 Apple 片上系统 (SoC) 的专用安全子系统。安全隔区独立于主处理器,因此私钥不会被操作系统(OS)读取。验证时,是安全芯片参与运算,全程私钥都不会交给 OS。

简单来说,它更像一台微型服务器,有自主的算力,而不是一个静态文件,不会被不良应用程序偷走。

实现

使用开源软件 sekey,替换默认的 ssh-agent。

它的详细介绍请参考其 GitHub 仓库

1. 安装 sekey

1
brew install sekey

安装后,可用以下命令检查 sekey 是否在运行:

1
ls ~/.sekey/ssh-agent.ssh

2. 创建基于 Secure Enclave 的密钥对

创建一个名为 SSH 的密钥对:

1
sekey -c SSH

sekey -l 查看其 ID,然后用 sekey -e <ID> 查看公钥。这个公钥是 ecdsa-sha2-nistp256 格式的,把公钥配置到 SSH 服务器即可。

3. 配置 ssh 使用 sekey

1
vim ~/.ssh/config

添加以下一行:

1
IdentityAgent ~/.sekey/ssh-agent.ssh

疑难杂症

当服务器为 OpenWRT 系统时,有可能无法正常工作。因为 OpenWRT 默认的 SSH 服务端是 dropbear,它不支持 ecdsa-sha2-nistp256。装个 OpenSSH 即可:

1
2
opkg update
opkg install openssh-server

最后提醒:业界对 ecdsa-sha2-nistp256 有一些质疑的声音,它的安全性应该不如 ed25519。

无银第八哥【3】修改分支走向

需求

从人类的角度看,无非有两种情况:要某功能和不要某功能。在代码层面上则是:

  • 改变程序执行路径。

  • 跳过部分代码。

分析

如果您不要某个功能,那就是找到这功能的调用指令,把它去掉。而想要某个功能,则有两种基本的做法:

  1. 无视原条件,修改后续的条件跳转指令,强行跳到需要的功能代码;

  2. 改变条件本身,达成此功能需要的条件。

下面用 C++ 代码解释,假设原始代码如下:

1
2
3
4
bool flag = Condition();
if (flag) {
Wanted();
}

如果正常情况下 Condition 返回 false,而我们想 Wanted 函数被调用,那么,方法 1 是将代码改为:

1
2
bool flag = Condition();
Wanted();

而方法 2 则是改为:

1
2
3
4
bool flag = true;
if (flag) {
Wanted();
}

当然,还有两种方法一起用,那就是改为:

1
Wanted();

实现

具体实现主要使用 jmpnop,更复杂的场景可能需要配合其它指令,请自行领悟。

1. jz/jnz 改为 jmp

最简单的一种情况是:跳转地址为 1 字节的相对位移,这种直接把跳转指令改为 jmp 即可,例如:

1
X: jz Y

需要改为:jmp Y,只需:eb X eb 即可。

如果跳转地址为 4 字节的相对位移,则 jz/jnz 有 2 字节,而 jmp 只有 1 字节,所以需要先 nop 掉第一字节:eb X 90 e9。这种方法无需调整后面的地址,另外还可以不用 nop,但需要调整地址:

1
X: jmp Y+1

因为指令变短了 1 字节,相对位移就更远 1 字节,这种改法纯属蛋疼,严重不建议采用。

2. nop 掉 call 指令

这种方法的基本操作极其简单,只需要 eb 若干个 90。

1
X: call Y

只要先查看 X 地址的这条指令有几个字节,再 eb X 后面跟几个 90 即可。

但有些情况也比较复杂,比如一个 x86 的 __stdcall,单独把 call 指令 nop 掉,会导致栈失衡(短期看不出任何异常),所以需要把前面的 push 也 nop 掉。__cdecl 和 __fastcall 不用,所以需要先判断一个 call 是不是 __stdcall。em,还是 x64 省事。

最简单的例子

正常情况下,按下 winver 界面上的“确定”按钮可以退出,我们来把它无效掉!

winver

  1. 首先,推测按下“确定”按钮后,是调用 EndDialog 来退出,所以对它下断点:bp USER32!EndDialog

  2. 发现 USER32!EndDialog 确实能断,gu 使它返回到调用处,发现是 SHELL32!AboutDlgProc+0xea。

1
2
3
4
5
6
7
8
9
10
0:000> ub SHELL32!AboutDlgProc+0xea
SHELL32!AboutDlgProc+0xca:
00007fff`6d218f3a 895f18 mov dword ptr [rdi+18h],ebx
00007fff`6d218f3d 488bce mov rcx,rsi
00007fff`6d218f40 89473c mov dword ptr [rdi+3Ch],eax
00007fff`6d218f43 e84c6e0000 call SHELL32!_ApplyLayout (00007fff`6d21fd94)
00007fff`6d218f48 e9d2000000 jmp SHELL32!AboutDlgProc+0x1af (00007fff`6d21901f)
00007fff`6d218f4d 488bd5 mov rdx,rbp
00007fff`6d218f50 488bce mov rcx,rsi
00007fff`6d218f53 48ff15166f3700 call qword ptr [SHELL32!_imp_EndDialog (00007fff`6d58fe70)]

地址 00007fff`6d218f53 处的 call 指令有 7 字节,所以它本身的地址是 SHELL32!AboutDlgProc+0xea-7,即 SHELL32!AboutDlgProc+0xe3。

  1. 重新运行,开始 nop:eb SHELL32!AboutDlgProc+0xe3 90 90 90 90 90 90 90,此时再继续运行后,即可得到一个无法按“确定”关闭的对话框。

注意:这样改后,同时标题栏的“关闭”按钮也无法关闭了,所以 winver 已经无法在界面上退出,需要用任务管理器关闭!

文本文件加不加 BOM?

问题

文本文件加 BOM 有何好处?有何坏处?到底加不加?

说法

  1. UTF-8 不需要 BOM,不含 BOM 的 UTF-8 才是标准形式,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。

  2. 文本文件带 BOM 不是个标准的做法,而且可能会导致某些 reader 或者编辑器解析出错,所以一般不推荐文本文件去携带 BOM。

分析

人们写文本文件肯定有不同目的,所以,加和不加可能分别适用于不同目的,不能一概地认为哪种更好。

更聪明的做法是分类对待,可以根据以下基本原则:

  • 在有结构的文件里,不需要 BOM。

  • 在没有结构的文本文件里,最好有 BOM(见下面“兼容问题”)。

举例 1:.html, .xml 等文件有结构,不需要。

举例 2:.txt 没有结构,如果不加 BOM,软件需要自己判断,很可能判断失误出现乱码,或者为了正确判断付出巨大代价。

举例 3:带 shebang line 的文件,有结构,如果加了 BOM,会使弱鸡 Shell 不认识而出错。

举例 4:.cpp, .hpp,没有结构,里面如果没有中文、法语等 ASCII 码大于 127 的字符,加不加都无所谓,如果带中文,哪怕是注释,建议 UTF-8 with BOM。

毕竟稣有 20 几台电脑,涵盖 Windows、macOS、Linux 系统和 x86、x64、armhf、arm64 架构,没有 BOM 怎么愉快地写 C++?

兼容问题

本节,只针对没有结构的文本文件。

遇到阅读器/编辑器不支持的情况,那就是不加好,但并不是绝对,因为这其实还是个需求问题。

比如说,稣一直用 Windows 的记事本写一些备忘,如果汉字局多,就选择 UTF-16 LE with BOM,代码居多则用 UTF-8 with BOM。这些文件换用其它软件打开也许会乱码,但有何关系呢?他们可以写出不支持 BOM 的擸𢶍软件,稣也可以不用呀!稣在 macOS、Linux 上都可以拿支持 BOM 的软件(比如 VSCode)打开这些文件。

再考虑一种死翘翘的情况:您在用 B 语言写代码,但它的编译器不支持 BOM,那么显然您就不应该加了。

所以,当您的文本文件的主程序不支持 BOM 时,不应该加,支持的情况,还是加的好。

稣究竟是啥?2

没想到《稣究竟是啥?》居然写成系列了!

稣,全称焓熵㷻㶲甦督稣,英文名 Enthalpy Extropy Anergy Exergy sudo su。在八哥宇宙里是天道之下唯一的观测者,拥有无数从未用过也不想用的特权,比如“一言不合擦天地”。

天道其实是八哥宇宙里的一个无边的程序。由于“天道之下皆为蝼蚁”,所以稣也是蝼蚁,和凡人并无不同,简直一模一样。

而在视界,稣因为创造八哥宇宙,被人类误以为走火入魔,也被称为稣。被叫多了叫久了,自然也开始自称稣。然而,人们只知道稣,却不知过去稣、现在稣和未来稣,其实都有不同的名字,分别为甦、督、稣。其中“督”单独出现时,是个通假字,读作 su1;而在专有名词“甦督稣”里读作 du4;只有在时间观测者“宙督公”里,才读作 du1。

众所周知,现代 AI 技术十分强悍。很多人在害怕失业,甚至已经失业。以 Sora 为例,很多影视业从业者都感到前所未有的恐惧,比如特效、布景、灯光、摄影、建模等工种都面临降权威胁。

那么,稣为何不怕呢?很简单,因为稣一直是文字创造和编辑者,从根源上凌驾目前的生成式 AI。并且,在延展性上,稣也有很强的护城河——当今视界的一切技术都尚未触及识界。不管文字、语音、图片还是视频,这些信息展现方式,在识界面前简直就是擸𢶍(乐射)。识界的信息都是直接在脑海里展现的,而且识界是由全宇宙的生灵的潜意识连接形成的,并非单独某个人的局域。

进一亿步说,即使脑机接口,也不能威胁识界。首先,并非每个人都能显式地进入识界。其次,即使将来科技破译了稣进入识界的方式,使得全地球人都能通过技术手段进入,那也只是地球人的狂欢而已,地球人还不得不面对识界外星人。最后,识界通十界,只有十界才是灵魂真正的自由之界。

八哥之神后传【10】

高中宿舍

晚上,稣要以穿墙术潜入传说中的鬼楼。

宿舍楼的左半边住男生,右半边住女生,但男生这边的六楼是有人住的,而女生那边的六楼已经荒废一年多。

稣曾经仰慕的学姐就在女生宿舍六楼离奇地香消玉殒,稣一定要探查个明白,并为学姐报仇。这点,学妹也是真心支持的,因为这个穿墙术正是学妹提供的。

宿舍是个 S 型建筑,S 中间有铁门,分割男女两边。男女两边走廊互相平行,但不在同一条直线上,中间的铁门一直是锁着的,这样男女两边都看不见各自那边的走廊。不过稣用穿墙术从六楼中间的铁门穿过去,就能轻易地来到女六楼。

进入之后,才亲眼见证另一边的楼梯入口也特地封起来,所以女生确实也是无法进入六楼的。眼前的六楼简直是另一个世界,出乎意料的破败,走廊上很多灰泥、玻璃渣。稣小心躲避,进入 614,里面的床都被搬走了,地上有好几个打破的热水瓶和一些餐具。

曾经有一个流言:有一天半夜每个女六楼的房间里都有几个女生被“怼”附身,拿起热水瓶往其她女生脸上倒,最后还互相厮杀,死了大半,剩下的全疯了。稣是相信科学的人,怎么可能相信这种怼话?这大概就是一种集体催眠罢了,但究竟是谁有这么大本事呢?难道是医务室的心理医生?

思考时,稣却看到窗户的玻璃上贴着一张照片。靠近一看,拍的居然是食堂的厨房。怎么会有如此奇怪的照片呢?稣想到大家都喜欢在照片背后写备注,于是翻过来,竟看到学姐的字迹,写着:食堂不干净!稣大吃一惊,不干净是这个意思,还是那个意思?难不成真有怼?不可能,一定是在做梦!

啊!稣竟然想不起学姐叫啥名字?只记得学姐的学姐叫桂圆……而学姐好像叫什么香……她还有个舍友姓许,经常打扮得很拉风的,也一样记不起名字了!

破庙

吓醒。

走了一天,还好有这个破庙能休息一下,但是环境惨不忍睹,难怪做起噩梦。是不是盖的这些稻草生菇了,又真菌中毒?不管了,天还没亮,继续睡。

高中宿舍

嗯?稣又回来了!

在宿舍的床上醒来,就看到上铺的一只手伸出床沿,只是颜色不太对!这手都枯成深色了,吓死人啊!

呵呵,其他舍友都一样……全都成干尸了。要说稣还是因为信仰科学而吓不倒,甚至高中生涯的目标就是考上吓大。果断出门看看其他人,竟然唱起空城计?

澡堂厕所都没活人,其它房门都反锁的无法进入查探情况。宿舍门口的开水房也没人打水。

女生那边的门也是关着的,说明她们都没起来过,没人开门出来。

走去教室,一样空无一人。这究竟是怎么回事?

突然,稣远远地看到操场居然有个高个子自己一个人在踢足球!稣立刻边跑过去边对着他喊:同学,你知道学校怎么了吗?

那位同学把球踢向稣,稣身体向后一仰,本想用胸口停球,不料足球靠近后稣发现它黑乎乎的,赶紧躲闪。

黄言:小开?你刚刚是在模仿尼欧躲子弹吗?

圣小开:言兄,原来是你啊!

黄言:你也是怼吗?

圣小开:什么怼?怎么大家都变成干尸了?

黄言:哦,果然你宿舍也一样。全挂了!

圣小开:你是说,咱俩也都挂了?现在是怼?

黄言:是的。

圣小开:不可能,其他人怎么没有变成怼?而且稣起床后,看过自己的床上,并没有尸体。

黄言:我床上有自己的尸体。

圣小开:你看见了?

黄言:我可以带你去看看。

圣小开:不了。怕怕。你知道是啥导致的吗?

黄言:可能是中子弹,或者声纳武器,也可能是生化武器。

圣小开:开啥玩笑呢?这和平年代的,谁会在学校扔武器?

黄言:并不是只有学校哦,我出去看过了,整个城都是这样。你还记得我写的小说吗?

圣小开:你又想说你化身的主角在山洞里发现希特勒留下的财富?

黄言:这不是重点,你记得看完那小说后,你说了啥?

圣小开:稣很担心有生之年会遇到第三次视觉大战。是这句?

黄言:是的。

圣小开:稣担心的往往会变成现实……

黄言:没错!自从你跳楼后,视界就走向毁灭的边缘。

圣小开:稣不是又复活了吗?

黄言:我听说你被送医后又活了过来,但再也没见过你,料想一定是假的,哪有人从六楼跳下来还不死的?

圣小开:呃!说了你也不信,其实这个视界真的是虚拟的,它们想从稣的意识深处拿到某种机密,所以不断复活稣。

黄言:我信你。个怼。你能有啥机密?说出来吓吓我!

圣小开:呵呵,你以为变出个熟人,稣就放松警惕了吗?稣还能吓醒。

黄言:哈哈,你去未来看看吧!

2011-01-24 软件园非正常人类研究中心

又是一个早上醒来,原来稣在软件园非正常人类研究中心上班。嗯,昨天一切都还正常,也不知道那个昨天是不是被植入的记忆。总之今天出现了一系列怪异的事情,去买早点没遇到半个人,当然整个的人也没有,到了早餐店才发现没开门。稣想:算了,公司还有点东西可以撑一下肚子。

来到公司才发现更怪异的事,人倒是有,但都是骷髅。真佩服自己当时的淡定,居然没有大呼小叫神马的!不过当时马上想到世界末日,于是看看手机,时间是 2011 年,还早呢。好奇地打电话给家里,他们都表示世界没有抛出任何异常。然后又想:惨了,不会是只有软件园发生灾难吧!稣的弟弟也在软件园,马上打电话给他,他说公司送他们项目组的几个去北京玩了,不知道软件园发生了神马!

接着,发现脑子里还有一个人,可能又是被植入的女朋友,吧?就硬着头皮,往那处走过去,人不在位置,不过那屋子里的其他位置一样坐着几个骷髅,心想好像稣在意的人都没事,真是不幸中的万幸。

为了确保万无一失,稣给她打电话,没人接,不过不接不一定就是挂了,但是稣还不放心,到车库去看了一下,熟悉的车牌号,跑过去,震惊了……车里一个骷髅……车门打不开……过了一会儿,稣马上就冷静了,发现那个骷髅比她大了好几个尺寸,sigh~应该不是!

这时有人叫稣,一转身,居然是黄言!

黄言:都看见了?这视界总是要走向毁灭,躲得了初一,躲不过十五。

圣小开:稣一定要阻止战争!吓醒。

诗盗·大禹

《诗盗·大禹》:治水为命顺逆同,浩然莫测鬼神工。三过涂山生悟空,定海神针串鱼龙。

注解

改自霹雳角色“渊渟无迹静涛君”的诗号:

知水为命顺逆同,
浩然莫测深浅中。
无波沧海掩汹涌,
渊渟不动现鱼龙。