zhbaor's Moments

让我们组建一支乐队,一起来超越我们的偶像吧!

Jan 1st
2023

之前注意到中文标点符号的宽度不是很理想。连续出现的一些标点组合,应该缩短宽度;某些组合,比如右括号与句号,中间应当避免换行;而像逗号与引号的组合中间则应允许换行。

昨日经过一番试验,终于把标点符号的问题弄好了,还一并解决了中英文混合排版的间隙问题。

“他?……他景况也很不如意……”母亲说着,便向房外看,“这些人又来了。说是买木器,顺手也就随便拿走的,我得去看看。”

下午,他拣了好几件东西:两条长桌,四个椅子,一副香炉和烛台,一杆抬秤。他又要所有的草灰(我们这里煮饭是烧稻草的,那灰,可以做沙地的肥料),待我们启程的时候,他用船来载去。

标点压缩和间隙调整,不仅要用 CSS,也要用 JavaScript。

我总共研究了三套方案:

  1. 汉字标准格式:最新的 Release 在 2015 年。尝试直接加到主页上,不知道哪里的样式冲突了。
  2. hiugiak/cj-typo:需要字体支持 OpenType 的 halt 特性,因此背弃开源信仰,使用微软雅黑的 Windows 用户有难了。🙏🙏🙏 用 webfont 感觉有些得不偿失,中文字体体积比较大,大陆不一定能打得开 Google Fonts,打开不一定快,用国内的反代不一定稳。
  3. 赫蹏:看起来不错,是个 2020 年开始的新项目。直接用在主题上没有太大的问题,效果还不错。于是进行了一番魔改,调整或去掉与主题冲突的样式,再适配一下无限滚动,得到的效果很理想。

22:36


Dec 31st
2022

最近看了几篇文章和一段视频:

三则新闻:

  1. Linux QQ 重出江湖。我安装了社区打包的 flatpak 版本,聊天功能体验良好,输入有 bug,打开 QQ 空间时会弹窗(原因是 QQ 试图打开 jsbridge:// 开头的链接)。由于基于 electron,QQ 对 xdg-desktop-portal 的支持不错。
  2. Gitea 发布了 1.18.0 版本。我升级之后感觉很好,没有遇到什么问题。
  3. Woodpecker CI 发布了 0.15.6 版本。起初 plugin-git 有些问题,不过很快修复了。虽然 Gitea 已经实验性地支持 Gitea Actions,在大多数情况下兼容 GitHub Actions,但是 Woodpecker 语法简洁、对容器支持更好,我还是坚持使用 Woodpecker。

09:50


Dec 29th
2022

无意间发现了一个好工具 nvtop,能够看到每个进程对 GPU、显存和编解码电路的使用率。连夜卸载 radeontopcorectrl

Responsive image

22:36


Dec 28th
2022

把域名解析迁到 Cloudflare 之后,只更新了 meet.zhaozuohong.vip 的证书。最近接连收到 Let’s Encrypt 的几封提醒邮件,忽然想起最近几个月每天都在不断努力用 DNSPod 更改 DNS 解析记录申请更新证书的 acme.sh,于是拖了几天,终于在今天赶快把其它域名的证书都更新好了。

1Main_Domain           KeyLength  SAN_Domains  CA               Created               Renew
2blog.zhaozuohong.vip  "2048"     no           LetsEncrypt.org  2022-12-28T08:11:32Z  2023-02-25T08:11:32Z
3ci.zhaozuohong.vip    "2048"     no           LetsEncrypt.org  2022-12-28T07:59:11Z  2023-02-25T07:59:11Z
4git.zhaozuohong.vip   "2048"     no           LetsEncrypt.org  2022-12-28T08:14:40Z  2023-02-25T08:14:40Z
5meet.zhaozuohong.vip  "2048"     no           LetsEncrypt.org  2022-11-26T12:51:04Z  2023-01-24T12:51:04Z
6www.zhaozuohong.vip   "2048"     no           LetsEncrypt.org  2022-12-28T08:04:35Z  2023-02-25T08:04:35Z
7zhaozuohong.vip       "2048"     no           LetsEncrypt.org  2022-12-28T08:12:56Z  2023-02-25T08:12:56Z

16:28


Dec 27th
2022

最近开始用 btrfs,感觉和做梦一样。先给移动硬盘用上了 btrfs,然后把根分区从 ext4 转换成了 btrfs,设置了 @@home 两个子卷,更新 grub 配置后成功进了系统。为 libvirt 和 Waydroid 的 image 设置了 nodatacow,接下来在线缩小了根分区的大小,加了 swap 分区,重启后一切正常。然而只考虑了 swap,忘记为 /var/opt 一类目录建立子卷了。TimeShift 用 btrfs snapshot 备份,比 rsync 省了好多空间,透明压缩也非常有效。

Linux Mint 不像 openSUSE 那样保姆式地做好了一切,所以还得自己动手:下一步打算配置 btrfsmaintenance、apt-btrfs-snapshot 和 grub-btrfs

11:40


Dec 22nd
2022

成功从 Linux Mint 21 升级到了 21.1,非常顺滑。和上次从 20.2 升级到 20.3 相比,有了 v2rayA 的透明代理,更新飞快。新图标和主题配色很有现代感,界面上各处调整非常用心,Update Manager 中升级 flatpak 特别方便。

下一步就是把硬盘里面的文件整理出来,把系统做好备份,分区从 ext4 转换成 btrfs。想为非滚动证道,还得等两年后 22 的更新。

10:03


Dec 21st
2022

好久不玩死亡细胞了,只好点超级变异。

这局运气超级好。种子是 213836,走双下水道-庇护所路线,有三个挑战,庇护所有双咒箱。路上捡了个金的对称长枪,刚拿的时候还在感叹现在金武器只吃单色卷轴,对称长枪只能欺负小怪了。一看词条:

  • 对敌人+300%伤害!
  • 能破盾

理所当然地去欺负收藏家了,打得超级爽。

21:20


Dec 18th
2022

简单研究了一下明日方舟的脚本。

我不想要完全自动化,而是希望手动运行脚本,能基建换班、在指定关卡刷完体力就足够了,因此 MAA 和 mower 的功能对我来说没有太大的吸引力。相反,虽然 AAH 目前只有“把某几个人放到某个房间里去”的简单功能,但由于它有精心设计的命令行接口和 Python API,很容易就能实现自己想要的功能。

AAH 目前仍不是很完善,我在使用过程中就发现了一个非常容易复现的问题,不过在反馈后马上就修复了。从开发文档和当前设计良好的命令行接口可以看出,开发者对于很多问题有相当清醒的认识。

相反,MAA 的开发团队对 Linux 极不重视。开发者表示“没想明白为什么 Linux 下需要用助手挂模拟器”,就算新的界面是基于 Electron 的,开发者也说“v2 仅仅制作 windows 版本”。Linux 下的使用体验几乎全靠社区维护。MAA 只有 WPF 界面,连命令行接口都没有提供。在 MAA 的开发团队将“跨平台”提上日程之前,MAA 在 Linux 下的体验较 Windows 下会有不小的差距。

如果 MAA 或 mower 的功能是刚需,推荐用虚拟机跑;如果和我一样只要求刷本和简单换班,那么 AAH 就足够了。

我的 AAH 基建换班脚本(放到 AAH 的文件夹下运行)
 1#!/usr/bin/env python3
 2import Arknights.configure_launcher
 3from automator.launcher import command
 4import json
 5
 6shifts = {
 7    "控制中枢": [
 8        ["诗怀雅", "清道夫", "陈"],
 9        ["阿米娅", "杜宾", "红"],
10    ],
11    "发电站": [
12        ["格雷伊", "THRM-EX", "深靛"],
13        ["阿消", "布丁", "Lancet-2"],
14    ],
15    "办公室": [
16        ["斥罪"],
17        ["伊桑"],
18    ],
19    "会客室": [
20        ["远山", "伺夜"],
21        ["晓歌", "极境"],
22    ],
23    "贸易": [
24        ["孑", "银灰", "但书"],
25        ["夜刀", "慕斯", "芬"],
26        ["空爆", "古米", "月见夜"],
27    ],
28    "赤金": [
29        ["砾", "夜烟", "斑点"],
30        ["红云", "蛇屠箱", "黑角"],
31        ["清流", "香草", "杰西卡"],
32    ],
33    "狗粮": [
34        ["石棉", "铅踝", "Castle-3"],
35        ["白面鸮", "史都华德", "泡普卡"],
36        ["白雪", "红豆", "霜叶"],
37    ],
38}
39
40dormitory_extra = ["华法琳", "安比尔"]
41
42
43def shift(room, operator_list):
44    if isinstance(operator_list, list):
45        operator_list = " ".join(operator_list)
46    cmd = f"riic shift {room} {operator_list}"
47    print(cmd)
48    command(cmd)
49
50
51try:
52    with open("data.json", "r") as f:
53        data = json.load(f)
54    index2 = data["index2"]
55    index3 = data["index3"]
56except:
57    index2 = 0
58    index3 = 0
59
60new2 = (index2 + 1) % 2
61new3 = (index3 + 1) % 3
62relax2 = index2
63relax3 = (index3 + 2) % 3
64
65shift("control_center", shifts["控制中枢"][new2])
66shift("B103", shifts["发电站"][new2][0])
67shift("B203", shifts["发电站"][new2][1])
68shift("B303", shifts["发电站"][new2][2])
69shift("meeting", shifts["会客室"][new2])
70shift("office", shifts["办公室"][new2])
71shift("B101", shifts["贸易"][index3])
72shift("B102", shifts["贸易"][new3])
73shift("B201", shifts["赤金"][index3])
74shift("B202", shifts["赤金"][new3])
75shift("B301", shifts["狗粮"][index3])
76shift("B302", shifts["狗粮"][new3])
77
78relax_list = (
79    shifts["控制中枢"][relax2]
80    + shifts["发电站"][relax2]
81    + shifts["会客室"][relax2]
82    + shifts["办公室"][relax2]
83    + shifts["贸易"][relax3]
84    + shifts["赤金"][relax3]
85    + shifts["狗粮"][relax3]
86    + dormitory_extra
87)
88
89for i in range(4):
90    shift(f"dorm{i + 1}", relax_list[i * 5 : (i + 1) * 5])
91
92with open("data.json", "w") as f:
93    json.dump({"index2": new2, "index3": new3}, f)

21:21


Dec 16th
2022

推荐几个软件:

  • Pika Backup粉红色 App,但是备份软件。和 Vorta 一样,也是 BorgBackup 的前端。

  • ZBar Bar Code Reader (mchehab/zbar),今天用它识别二维码,效果不错。

    ZBar Bar Code Reader is an open source software suite for reading bar codes from various sources, such as video streams, image files and raw intensity sensors. It supports EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 93, Code 39, Codabar, Interleaved 2 of 5, QR Code and SQ Code.

  • qrencode (fukuchi/libqrencode),用来生成二维码。

    Libqrencode is a fast and compact library for encoding data in a QR Code symbol, a 2D symbology that can be scanned by handy terminals such as a mobile phone with CCD. The capacity of QR Code is up to 7000 digits or 4000 characters and has high robustness.

  • Cage: a Wayland kiosk (Hjdskes/cage)。

    Cage is a kiosk compositor for Wayland. A kiosk is a window manager (in the X11 world) or compositor (in the Wayland world) that is designed for a user experience wherein user interaction and activities outside the scope of the running application are prevented. That is, a kiosk compositor displays a single maximized application at a time and prevents the user from interacting with anything but this application.

    我用 Waydroid 玩明日方舟,但是 Waydroid 只能在 Wayland 下运行,我用的 Cinnamon 桌面只支持 X11。以前窗口化运行 Weston 再启动 Waydroid,明显感到鼠标移动有很大的延迟,非常难受。全屏运行 Weston 时,全屏窗口不会经过合成器,体验就好多了。当时以为非全屏运行 Weston 时,移动鼠标的延迟是 X 下合成器的问题。

    今天发现 Cage 和 Sway 也能在 X11 下运行。Sway 的默认快捷键和我设置的冲突了,所以就试试 Cage。没想到,通过窗口化运行的 Cage 跑 Waydroid,鼠标移动的延迟竟然也很低。这一现象令我十分惊讶,我这才意识到,原来心里对 X 的合成器有很深的偏见,先入为主地认为“鼠标延迟是合成器导致的”,忽略了其它非全屏运行的程序并没有这么高的鼠标延迟,也忘记了 Weston 和 Sway、Cage 等基于 wlroots 的 Wayland 合成器实现上的不同。

    记录一下相关的命令:

     1# 窗口化运行 Weston
     2weston --width=1280 --height=720 --shell="kiosk-shell.so"
     3
     4# 全屏运行 Weston
     5weston --width=1920 --height=1080 --fullscreen --shell="kiosk-shell.so"
     6
     7# 启动 Cage 时需要指定程序,且无法指定窗口尺寸
     8# 所以先启动 foot,再调整 Cage 窗口的大小
     9cage foot
    10wmctrl -i -r $(wmctrl -l | grep foot | awk '{print $1;}') -e 0,320,180,1280,720
    11
    12# 设置 WAYLAND_DISPLAY 环境变量,可在 Weston 或 Cage 以外的终端中启动 Waydroid
    13WAYLAND_DISPLAY=wayland-0 waydroid show-full-ui
    14# 关闭 Waydroid
    15waydroid session stop
    

    全屏运行 Cage 需要借助桌面环境或窗口管理器的功能。我在 Cinnamon 的设置中,把全屏窗口功能绑定了 Alt-F12 快捷键。

  • SitMan,童年回忆,小时候用它背英语课文。

    SitMan 在比较新的 Windows 系统和 Wine 上都能跑起来。用 Wine 时,需要用 winecfg 添加 riched20 函数库顶替。

    激活信息:

    • 用户名:学英语

    • 注册码:8ac1000323ulgyeq5x

    SitMan 需要较老版本的 RealPlayer,SitMan v2.3 和 RealPlayer 8 安装包我都上传到网盘了,点击下方链接即可下载。

16:46


Dec 13th
2022

不久之前,Linux 6.1 发布了。我兴冲冲地用 linux-tkg 安装了新内核,选了 BORE 调度器,一切正常。

无意间打开 OBS,这才注意到没有虚拟摄像头的按钮。但是我装了 v4l2loopback-dkms 呀,难道说 flatpak 版本的 OBS 没有这个功能?看到了 Make VirtualCam work with Flatpak #4552,原来早就支持了。

怎么回事呢?🤔

重新安装 v4l2loopback-dkms,看到了以下输出:

1Building for 6.1.0-tkg-bore
2Building initial module for 6.1.0-tkg-bore
3Error! The /var/lib/dkms/v4l2loopback/0.12.5/6.1.0-tkg-bore/x86_64/dkms.conf for module v4l2loopback includes a BUILD_EXCLUSIVE directive which does not match this kernel/arch.
4This indicates that it should not be built.
5Skipped.

我用的发行版 Linux Mint 21 是基于 Ubuntu 22.04 LTS 的,官源中的 v4l2loopback-dkms 版本是 0.12.5。/usr/src/v4l2loopback-0.12.5/dkms.conf 的内容是这样的:

 1PACKAGE_NAME="v4l2loopback"
 2PACKAGE_VERSION="0.12.5"
 3
 4# Items below here should not have to change with each driver version
 5MAKE[0]="make KERNEL_DIR=${kernel_source_dir} all"
 6CLEAN="make clean"
 7
 8BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
 9DEST_MODULE_LOCATION[0]="/extra"
10
11REMAKE_INITRD="no"
12AUTOINSTALL="yes"
13
14if ! grep -q '^CONFIG_VIDEO_V4L2=[ym]$' $kernel_source_dir/.config; then
15BUILD_EXCLUSIVE_KERNEL="^$"
16fi

也就是说,用 dkms 构建 v4l2loopback 内核模块时,会先检查 CONFIG_VIDEO_V4L2 的设置。Ubuntu 自己的内核 /usr/src/linux-headers-5.15.0-56-generic/.config 中,确实有 CONFIG_VIDEO_V4L2=m。用 linux-tkg 安装的 /usr/src/linux-headers-6.1.0-tkg-bore/.config 中呢,根本没有 CONFIG_VIDEO_V4L2 这个选项!

umlaeute/v4l2loopback 一搜,找到了 dkms broken for linux>=5.18 #498。原来,在 Linux 5.18 及以上版本中,这个选项改名叫 CONFIG_VIDEO_DEV 了,旧版本 v4l2loopback 的 dkms.conf 只会检查 CONFIG_VIDEO_V4L2 选项,所以在旧内核上安装没问题,在新内核上就会报错。

虽然 v4l2loopback 项目的 README.md 中有通过 dkms 安装的步骤,但是那样只能下载打了标签的版本。这个问题在目前最新 tag 0.12.7 发布之后才被修复,安装 0.12.7 照样没用,要下载最新的代码。另外,Ubuntu 官源中的 v4l2loopback-utils 版本也比较旧,缺少动态添加管理设备等功能。于是把 v4l2loopback-utils 也一并装上:

1sudo apt purge --autoremove v4l2loopback-dkms v4l2loopback-utils
2sudo git clone https://github.com/umlaeute/v4l2loopback /usr/src/v4l2loopback-git
3sudo dkms add v4l2loopback -v git
4sudo dkms build v4l2loopback -v git
5sudo dkms install v4l2loopback -v git
6cd /usr/src/v4l2loopback-git
7sudo make install-utils
8sudo make install-man # 注意:需要安装 help2man

这样,v4l2loopback-ctl 可以用了,OBS Studio 的虚拟摄像头功能也恢复正常了。

PS:v4l2loopback 目前最新版 0.12.7 还没有更新 dkms.conf,然而不久之前,@regymm 却边用新内核,边开 OBS 的虚拟摄像头。在好奇心的驱使下,我去看了 Arch Linux 的 v4l2loopback-dkms,发现它虽然用的是 0.12.7 版本,但是附加了 commit e7edf2fdkms.conf 的修改,所以在新内核上也没有问题。

20:26