介绍

BlackCloud 的博客

Powered by mdbook

Benchmarks

记录一下经常用到的算法/容器的 Benchmark (主要使用 C++)

随用随测, 可能不会特别准确, 工作侧重于在特定负载下选择最好的算法/容器, 所以主要记录不同选择的相对性能

String Hash

  • 4-16 个字符的短字符串
|               ns/op |                op/s |    err% |          ins/op |         bra/op |   miss% |     total | benchmark
|--------------------:|--------------------:|--------:|----------------:|---------------:|--------:|----------:|:----------
|       11,094,427.00 |               90.14 |    0.4% |  111,833,763.00 |  12,383,248.00 |    4.0% |      0.12 | `CRC32`
|        8,181,207.00 |              122.23 |    3.2% |   81,658,267.00 |  12,940,438.00 |    3.8% |      0.09 | `FNV`
|        5,397,684.00 |              185.26 |    0.4% |   56,646,296.00 |   9,432,868.00 |    5.3% |      0.06 | `Murmur2`
|        6,749,671.00 |              148.16 |    1.2% |   67,046,257.00 |   9,432,870.00 |    5.3% |      0.08 | `Murmur3_x86_32`
|       11,833,767.00 |               84.50 |    0.5% |  128,028,092.00 |   5,949,857.00 |    8.5% |      0.13 | `Murmur3_x86_128`
|        7,636,166.00 |              130.96 |    0.8% |   91,747,270.00 |   6,441,582.00 |    7.7% |      0.09 | `Murmur3_x64_128`
  • ~200 个字符的中等长度字符串
|               ns/op |                op/s |    err% |          ins/op |         bra/op |   miss% |     total | benchmark
|--------------------:|--------------------:|--------:|----------------:|---------------:|--------:|----------:|:----------
|      134,931,464.00 |                7.41 |    0.0% |1,235,797,487.00 |  80,973,317.00 |    1.2% |      1.48 | `CRC32`
|      154,305,226.00 |                6.48 |    0.0% |1,250,489,432.00 | 179,927,192.00 |    0.6% |      1.70 | `FNV`
|       41,743,783.00 |               23.96 |    0.0% |  474,381,552.00 |  50,949,403.00 |    1.8% |      0.46 | `Murmur2`
|       44,541,974.00 |               22.45 |    0.1% |  446,744,071.00 |  51,629,173.00 |    1.8% |      0.49 | `Murmur3_x86_32`
|       44,402,780.00 |               22.52 |    0.1% |  461,885,844.00 |  16,677,849.00 |    5.3% |      0.49 | `Murmur3_x86_128`
|       26,934,988.00 |               37.13 |    0.2% |  307,733,470.00 |  16,584,743.00 |    5.3% |      0.30 | `Murmur3_x64_128`

Map

  • 完全随机的 int key, 做 find_or_insert 操作
|               ns/op |                op/s |    err% |          ins/op |         bra/op |   miss% |     total | benchmark
|--------------------:|--------------------:|--------:|----------------:|---------------:|--------:|----------:|:----------
|       35,153,700.00 |               28.45 |    1.8% |  157,273,534.00 |  33,488,895.00 |    1.5% |      0.41 | `unordered_map:random`
|      136,277,935.00 |                7.34 |    1.7% |  193,896,493.00 |  48,073,497.00 |   13.1% |      1.49 | `map:random`
|       58,396,319.00 |               17.12 |    0.8% |  312,029,741.00 |  92,169,201.00 |    4.9% |      0.66 | `btree_map:random`
|       12,382,928.00 |               80.76 |    0.8% |   92,646,655.00 |  12,036,977.00 |    5.7% |      0.14 | `robin_hood_map:random`
|       17,489,723.00 |               57.18 |    1.2% |   90,160,012.00 |  17,922,242.00 |    4.4% |      0.20 | `dense_hash_map:random`
|          810,089.00 |            1,234.43 |    3.2% |    3,600,629.00 |     300,147.00 |    0.0% |      0.01 | `array(test):random`
  • 顺序出现的 int key, 每个 key 重复出现 32 次, 组与组之间略微打乱(比如 0 0 0 1 0 1 1 2 1 2 2 2 ... 这样的序列), 做 find_or_insert 操作
|               ns/op |                op/s |    err% |          ins/op |         bra/op |   miss% |     total | benchmark
|--------------------:|--------------------:|--------:|----------------:|---------------:|--------:|----------:|:----------
|       19,428,866.00 |               51.47 |    1.2% |  137,639,829.00 |  26,979,609.00 |    1.2% |      0.22 | `unordered_map:sequential`
|      305,547,283.00 |                3.27 |    0.5% |  494,128,064.00 | 130,782,008.00 |   17.3% |      3.34 | `map:sequential`
|      183,810,512.00 |                5.44 |    0.4% |  973,906,327.00 | 302,459,238.00 |    4.8% |      2.03 | `btree_map:sequential`
|       34,349,617.00 |               29.11 |    0.3% |  183,005,851.00 |  24,127,612.00 |   12.6% |      0.38 | `robin_hood_map:sequential`
|       26,675,597.00 |               37.49 |    1.2% |  185,300,938.00 |  46,039,048.00 |    5.1% |      0.30 | `dense_hash_map:sequential`
|        6,950,046.00 |              143.88 |    0.8% |   38,400,593.00 |   3,200,143.00 |    0.0% |      0.08 | `array(test):sequential`

部署 mdbook 到 github pages

本网站由 mdbook 生成,通过 github actions 持续集成到 github pages,以下为部署方式

1. 为项目创建仓库

BlackCloud37/mdbook-blog,其 master 分支为 mdbook 项目

2. 添加 Github Action

参考 GitHub Pages Deploy,创建 .github/workflows/deploy.yml,内容为

name: Deploy
on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        fetch-depth: 0
    - name: Install mdbook
      run: |
        mkdir mdbook
        curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.14/mdbook-v0.4.14-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
        echo `pwd`/mdbook >> $GITHUB_PATH
    - name: Deploy GitHub Pages
      run: |
        # This assumes your book is in the root of your repository.
        # Just add a `cd` here if you need to change to another directory.
        mdbook build
        git worktree add gh-pages
        git config user.name "Deploy from CI"
        git config user.email ""
        cd gh-pages
        # Delete the ref to avoid keeping history.
        git update-ref -d refs/heads/gh-pages
        rm -rf *
        mv ../book/* .
        git add .
        git commit -m "Deploy $GITHUB_SHA to gh-pages"
        git push --force --set-upstream origin gh-pages

之后所有到 master 的 push 都会 build 当前的 mdbook,并将产物 push 到本仓库的 gh-pages 分支

3. 访问网站

gh-pages 分支下的网页会被部署到 <Username>.github.io/<Reponame> 域名下,如本项目即为 blackcloud37.github.io/mdbook-blog,直接访问即可

4. Trouble shooting

第一次推送触发 github action 后,gh-pages 分支存在并且已经包含产物,但是访问 blackcloud37.github.io/mdbook-blog 提示 404,参考 https://stackoverflow.com/questions/11577147/how-to-fix-http-404-on-github-pages,推送一个空 commit 到 gh-pages 分支即可:

# 在 gh-pages 分支
git commit --allow-empty -m "Trigger rebuild"
git push

另外,仓库可见性必须为 Public

Arch 休眠到交换文件

参考 Arch WikiArch简明指南 配置系统休眠到 swap file(ext4),配置完毕后无法正常休眠,问题如下

1. KDE 开始菜单不展示休眠选项

尝试手动休眠 systemctl hibernate,提示 "Not enough swap space for hibernation"

根据 Arch BBS,通过 systemctl edit systemd-logind.service 并在其中添加

# 注意添加位置,必须在文件中注明的两段注释之间,否则不会生效
[Service]       
Environment=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1

后重启 logind 服务 systemctl restart systemd-logind 即可

2. 休眠后立刻回到登录页面

休眠后查看日志 journalctl -n 1000,在其中查找 hibernate 相关记录,发现报了

Failed to find location to hibernate to: Function not implemented

怀疑是 hibernate 目标交换文件配置有误,检查后发现在获取交换文件 resume_offset 时,用 sudo filefrag -v /swapfile 命令查看的偏移如下:

Filesystem type is: ef53
File size of /swapfile is 34359738368 (8388608 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    6143:    4114432..   4120575:   6144:            
   1:     6144..   38911:    3997696..   4030463:  32768:    4120576:
   2:    38912..   71679:    3506176..   3538943:  32768:    4030464:
   3:    71680..  104447:    8224768..   8257535:  32768:    3538944:
   ...

physical_offset列的第一个值应当是 4114432,而我配置成了 4120575,修改后重新生成 grub.cfg 即可

Wechat

使用打包好的 Deepin Wine Wechat Arch,仓库中已经给出了详细的安装方法、字体更换等

Sway

从 i3 迁移到 sway 后, Deepin Wine Wechat 的微信窗口黑屏, 暂时没找到解决办法, 改用 wine-for-wechat 后解决

安装流程

  1. 安装 wine-for-wechat, wine-wechat 包, 均在 archlinuxcn 源上
  2. 微信官网下载 .exe 安装包
  3. 命令行 wechat -i /path/to/wechat_setup.exe 安装微信
  4. 安装完成后就能使用, 如果字体有问题, 参考 Ubuntu20.04 Wine 6.0 微信中文显示方块/方框, 本质上为如下几步
  • winetricks 安装所有字体和所需 dll
  • 改注册表

不过仍然没解决 emoji 为方块的问题

Trouble shotting

窗口阴影

换到 i3wm 后,混成器使用了 picom,此时使用 Deepin Wine Wechat 会发现整个窗口被灰色遮罩,且有弧形的黑色阴影,关闭 picom 后上述情况消失,因此判断是 picom 的问题

查阅 arch wiki 上 picom 条目发现,picom 可以针对窗口禁用半透明、阴影等特性,其规则可以细化到匹配窗口名称

首先通过 xprop 查询微信的窗口名:

# xprop
WM_NAME(STRING) = "WeChat"
...
WM_CLASS(STRING) = "wechat.exe", "Wine"

然后在 picom.conf 里添加如下规则:

~/.config/picom/picom.conf
# Specify a list of conditions of windows that should have no shadow.
#
# examples:
#   shadow-exclude = "n:e:Notification";
#
# shadow-exclude = []
shadow-exclude = [
  # ...
  "name = 'WeChat'",
  "class_g = 'wechat.exe'",
  "class_g = 'Wine'"
];

重启 picom 即可

字体发虚

打开 wine 设置

# /opt/apps/com.qq.weixin.deepin/files/run.sh winecfg

graphics 选项卡里调高DPI即可

部分 Emoji 为方块

尚未解决

i3wm 切换到 sway

复制配置

mkdir -p ~/.config/sway
cp ~/.config/i3/config ~/.config/sway/

重映射 CapsLock 到 Ctrl, 修改键盘重复速率

原来用的是 setxkbmap, 但这是针对 xorg 的

映射方法为在 sway config 中加入

input "type:keyboard" {
    xkb_options caps:ctrl_modifier
    repeat_delay 150
    repeat_rate 80
}

Deepin Wine Wechat 黑屏

Wechat

其他

  • 使用 wofi 替换 rofi
  • 使用 waybar 替换 polybar
  • 使用 swaybg 替换 feh

自动认证 Tsinghua WiFi

在 Mac 连接到 Tsinghua/Tsinghua-5G 等需要认证的无线网时自动认证而无需经 Web 认证

0. 准备

下载

1. auth-thu

用于从命令行认证校园网

  • 给予可执行权限: chmod +x auth-thu.macos.arm64
  • 放到 $PATH 下并重命名为 auth-thu: cp auth-thu.macos.arm64 /usr/local/bin/auth-thu
  • 在 HOME 目录下创建其配置: touch ~/.auth-thu
  • 在配置内写入校园网账号密码 (这里只能明文): vim ~/.auth-thu
    {
        "username": "username",
        "password": "password"
    }
    
  • 尝试认证看正不正常
    > auth-thu
    2022-11-23 17:08:41 INFO auth-thu main.go:308 Currently online!
    

2. WifiWatch.app

直接运行 .app 即可,这个程序会在后台,当连接/断开 WiFi 时执行特定脚本

  • 连接时执行 ~/.wifiConnected
  • 断开时执行 ~/.wifiDisconnected (本示例用不到)

可以在系统设置里把这个 .app 加到开机启动项

3. .wifiConnected

连接 WiFi 时执行的脚本

写入如下内容 vim ~/.wifiConnected

#!/bin/bash
# arg1: SSID of network
# arg2: SSID of old network, if any

log=/tmp/auth-thu
if [[ "$1" =~ ^(Tsinghua|Tsinghua-5G)$ ]]; then
	for i in 4 3 2 1; do
		sleep $i
		connected=$(/usr/local/bin/auth-thu 2>&1 | tee -a $log | grep -E "online|Successfully" && echo 0 || echo 1)
		if [[ $connected == 0 ]]; then
			sleep $i
			/usr/local/bin/auth-thu 2>&1 | tee -a $log
		else
			break
		fi
	done
fi

然后给予可执行权限 chmod g+x ~/.wifiConnected

4. 尝试

  • 退出认证
  • 断开 WiFi 然后连接 Tsinghua/Tsinghua-5G
  • 检查 /tmp/auth-thu 里是否有 log
  • 检查 WiFi 是否正常认证

5. Trouble Shooting

WiFi 名目前是字符串匹配且只有 Tsinghua/Tsinghua-5G,如果需要其他的,加在 .wifiConnected

6. Reference

  • https://apple.stackexchange.com/questions/139267/run-program-if-connected-to-specific-wifi
  • https://github.com/p2/WifiWatch
  • https://github.com/z4yx/GoAuthing

5600x 超频

1. 平台

  • R5 5600x
  • 乔思伯 HX6200D 风冷
  • MSI B550I Gaming Edge Max Wifi
  • 铂胜白条 3000MHZ 8G * 2
  • RX584
  • 300w电源

装在蜂鸟 i100pro 这个 itx 机箱里

2. 参数

内存小超到了 3800 16-19-19-36 1.39V

这个电脑只用来打游戏,由于机箱没有风扇位,而且是下压式风冷,开 PBO2 之后 Aida64 烤 FPU 温度巨高,打游戏掉帧,索性锁频降压使用

全核锁 4.6GHZ,电压在主板里给 1.1375V,防掉压之类的全 Auto,室温 20 度

  • 开机箱盖,单烤 FPU 能稳定 10 分钟,温度稳定在 79 度
  • 关机箱盖,单烤 FPU 2 分钟后蓝屏,温度到 82 度

全核锁 4.6GHZ,电压在主板里给 1.1625V

  • 开机箱盖没测
  • 关机箱盖,单烤 FPU 8 分钟后黑屏重启,温度到 86 度

之后还是想关机箱盖用,考虑到打游戏负载也不会多高,暂时就用 4.6GHZ/1.1625V 的参数跑,打游戏的时候崩溃再说, 这个参数下:

  • CPU-Z 单核 633.9,多核 5005.6
  • 待机 41 度
  • 守望先锋:归来 2K 极高画质下 55 度,能稳定在 60FPS 以上

UPDATE:

  • 关闭超线程,参数修改为 4.575GHZ/1.1V,关机箱盖 Aida64 单烤 FPU 稳定 69 度,超过 15 分钟不崩溃,感觉是一个更合适的设置
  • 单核跑分 631,关超线程多核就不看了

Auth THU

THU 宿舍校园网需要网页认证, 不过有同学开发了 GoAuthing 这个认证程序, 在常规的 Linux 下可以直接开 crontab/service 定时认证, 但 QNAP 的 crontab 似乎有点问题, 我的解决方案是开了一个 Docker 容器跑认证程序

Dockerfile如下

FROM alpine:latest

COPY ./auth-thu /usr/local/bin/auth-thu
COPY ./.auth-thu /root/.auth-thu

# 这里输出 log 是为了之后验证 auth-thu 是否正确执行以 debug, 如果不需要 debug 则使用:
# RUN echo '*/1 * * * * /usr/local/bin/auth-thu auth' > /etc/crontabs/root
RUN echo '*/1 * * * * /usr/local/bin/auth-thu auth >> /var/log/auth-thu.log 2>&1' > /etc/crontabs/root

CMD crond -l 2 -f

用了 alpine 这个非常小的 linux 镜像, 使用方式为

  1. 创建 Dockerfile 并添加上面的内容
  2. 在 Dockerfile 同目录下下载 GoAuthing 的可执行文件并改名为 auth-thu, 同时赋以可执行权限
  3. 在 Dockerfile 同目录下创建 .auth-thu 文件, 填入 GoAuthing 的相关配置, 如用户名密码
  4. 在该目录下用 Dockerfile 创建镜像, 例如 docker create -t auththu:latest .
  5. 用创建好的镜像创建容器, 并设置其为自动重启(即随 docker 启动) docker run -d --name auththu --net=host --restart=always

QNAP Crontab 使用

  • crontab 配置文件在 /etc/config/crontab
  • 应用修改 # crontab /etc/config/crontab
  • 重启服务 # /etc/init.d/crond.sh restart

注意定时任务所用的脚本不能放在根目录下,因为 QNAP 每次重启都会重置根目录,建议放在 /share/homes/<username>/

QNAP Hlink Docker 使用

环境

  • QNAP 453B mini,事先安装好 Container Station,配置 SSH 登录
  • 我的 qBittorrent 下载文件均在 /share/Download 目录下,希望将里面的文件硬链到 /share/Media
    • 硬链目录不能跨盘,DownloadMedia 两个共享文件夹均在同一块硬盘同一个存储池上

部署

直接用 Container Station 部署时,hlink 会报 必须指定配置文件 的错,原因不明,因此这里用命令行部署

ssh 到 nas:

docker run -d --name hlink \
    -e HLINK_HOME=/share/Container/Docker/Hlink \
    -p 9090:9090 \
    -v /share:/share \
    likun7981/hlink:latest

将 nas 的 /share 挂载到 container 的 /share 下,同时指定 /share/Container/Docker/Hlink 为 hlink 的家目录。nas 的 9090 端口映射为容器的 9090 端口,即 hlink 的 WebUI

然后访问 :9090,创建配置文件和定时计划即可

Trouble shooting

目前(2022-10-17)hlink 的 WebUI 不支持账号功能,即一旦暴露到公网,任何人都可以访问该 WebUI,而我的 nas 直连校园网,自带公网 IP,因此需要考虑安全问题

暂时的解决办法是,考虑到一旦配置好 hlink 服务,便不太需要访问其 WebUI,因此可以在完成配置后用 iptable ban 掉 WebUI 的端口

#!/bin/bash

number=`iptables -t nat --line-numbers --numeric --list | grep dpt:9090 | awk '{print $1}'`
if [ -n "$number" ]; then
echo $number
iptables -t nat -D DOCKER $number
fi

qnap 的 iptable 规则每次重启后都会失效,因此可以将上述脚本加入 crontab

qBittorrent

安装

  1. App Center 添加软件源 https://www.qnapclub.eu/repo.xml
  2. 搜索 qBittorrent 安装

配置

账号

默认端口 6363,默认账号 admin,默认密码 adminadmin

进 设置-WebUI 修改端口、账号密码、语言等为想要的

HTTPS

在 设置-WebUI 选择使用 HTTPS 而不是 HTTP,证书和密钥设为域名证书的 .pem.key 文件的绝对路径

下载排队

在 设置-BitTorrent 启用或关闭 Torrent 排队和做种限制

校园网 IPv6 (北邮人 PT)

  • 设置-高级-qBittorrent 相关
    • 网络接口 改为有校园网 IPv6 的接口
    • 绑定到可选的 IP 地址 改为 所有 IPv6 地址
    • 如果 Tracker 显示 SSL 证书错误,则取消勾选 验证 HTTPS tracker 证书