Skip to content

2024

Journal-2024

record my journey in CS, gain from history, sometimes scandal.

10.20

Word / WPS实用功能

  1. Continuous Format Painter:选中内容,右键,Format Painter右侧小图标
  2. 仅文本粘贴:Ctrl+Alt+T
  3. 公式格式与自动编号:solution
  4. 参考文献自动按照出现先后编号:solution
  5. 查找替换通配符列表:ref

优化git diff

使用diff-so-fancy来生成更加人类可读的差异。

sudo pacman -S diff-so-fancy
git config core.pager "diff-so-fancy | less --tabs=4 -RF" # optional: --global
git config interactive.diffFilter "diff-so-fancy --patch" # optional: --global

10.19

WPS缺字体

yay -S ttf-ms-win10-auto-zh_cn
sudo fc-cache -fv

这个包可以解决SimSun等字体,但如果还存在缺失,则需要另外安装其他包含的包。

10.18

WireGuard用户空间实现

如果内核中没有wireguard模块,又不便编译安装时,可以使用BoringTun

# make configurations in ~/wg as is kernelspace version
yay -S boringtun # or boringtun-git
sudo pacman -S wireguard-tools
sudo ln -s ~/wg/wg0.conf /etc/wireguard
sudo WG_QUICK_USERSPACE_IMPLEMENTATION=boringtun WG_SUDO=1 wg-quick up wg0

10.16

Kanata改键修正Pad键盘

Pad的键盘Escape处是XF86HomePage,而且没有Fn锁,使用Kanata将其配置为正常键盘键位 ref

(deflocalkeys-linux
    🔍   217
)

(defsrc
    hmpg    🔅   🔆           🔍   ◀◀  ▶⏸  ▶▶  🔇   🔉   🔊   powr
        F1  F2  F3  F4  F5  F6  F7  F8  F9  F10 F11 F12
    `   1   2   3   4   5   6   7   8   9   0
    lsft
    lctl    lalt    lmet    spc
)

(deflayer default
    esc F1  F2          F5  F6  F7  F8  F9  F10 F11 F12
        🔅   🔆   F3  F4  F5  ◀◀  ▶⏸  ▶▶  🔇   🔉   🔊   F12
    `   1   2   3   4   5   6   7   8   9   0
    lsft
    lctl    lmet    lalt    spc
)

(defoverrides
    (AltLeft ShiftLeft 3) (F3)
    (ControlLeft Space) (F4)
)

10.12

pacman查询某个文件所属的包

pacman -Qo <path>

处理pacsave和pacnew

  • pacsave:卸载软件包时检测到配置文件曾被修改,pacman会将其备份为.pacsave文件
  • pacnew:更新软件包时检测到配置文件曾被修改,pacman会将更新的配置文件保存为.pacnew文件,并给出警告
  • pacdiff:可用于检索pacsave/pacnew文件并进行交互式处理

vim分屏操作

Ctrl+w + v / :vs <file> # 垂直分屏(左右分)
Ctrl+w + s / :sp <file> # 水平分屏(上下分)
Ctrl+w + k/j/h/l # 向上/下/左/右切换
Ctrl+w + +/-/>/< # 增大高度/减小高度/增大宽度/减小宽度

10.11

WiFi信号相关命令

iw reg get # 查询无线监管域相关信息
sudo iw reg set CN # 设置无线监管域为CN
nmcli device wifi # 查询频道和带宽等信息

CPU Benchmark

sudo pacman -S sysbench
sysbench cpu run --threads=1 --time=20
sysbench cpu run --threads=8 --time=20

yay -S geekbench # for x86_64
geekbench

wget https://cdn.geekbench.com/Geekbench-6.3.0-LinuxARMPreview.tar.gz # for ARM64

10.6

Firefox AI Chatbot 自定义

Firefox引入了AI侧边栏的实验性功能,通过修改高级配置可以进行自定义:

进入about:config,找到browser.ml.chat.provider,修改为自定义的服务即可,如https://chatgpt.com/?temporary-chat=true&model=gpt-4o-mini

10.5

rofi-bluetooth正确处理颜色转义字符

rofi-bluetooth很久没有更新,没有正确处理bluetoothctl输出中的终端颜色控制字符,而bluetoothctl没有提供关闭彩色输出的选项。

solution: 修改rofi-bluetooth代码,对转义字符进行过滤

devices=$(bluetoothctl devices | grep Device | cut -d ' ' -f 3- | sed 's/\x1b\[[0-9;]*m//g') # 新增sed命令部分

10.4

flatpak应用设置环境变量

flatpak override --env=ENV1=VALUE1 com.name.package

10.1

OpenWrt公钥登录

其使用的ssh server为Dropbear,因此需要将公钥放置在/etc/dropbear/authorized_keys

9.30

du忽略其他文件系统

du -x ...

9.29

SSH over HTTPS

stream {
    # dispatch according to server_name
    map $ssl_preread_server_name $backend {
        ssh.example.com 127.0.0.1:22;
        default 127.0.0.1:443;
    }

    server {
        listen 443 ssl;
        ssl_preread on;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        proxy_pass $backend;

        include /etc/nginx/ssl_common.conf;
    }
}

9.28

NextTract

curl nxtrace.org/nt | bash

Nginx反向代理WebSocket服务

主要是需要自动升级HTTP/1.1以支持websocket

http {
    server {
        listen 8020;
        server_name your_domain.com;

        location / {
            proxy_pass http://your_websocket_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            # for websocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

docker配置代理

/etc/docker/daemon.json:

{
    "proxies": {
        "http-proxy": "http://127.0.0.1:7890",
        "https-proxy": "http://127.0.0.1:7890",
        "no-proxy": "localhost,127.0.0.0/8"
    }
}

7z常用命令

7z a <options> <target> <source...> # 压缩
<options>:
    -mx=9 # 压缩级别
    -tzip # 指定zip格式(默认7z)
    -mmt=4 # 指定线程数(默认32)

7z x <target> # 解压,支持7z zip rar等
7z l <target> # 列出归档内容
7z t <target> # 测试完整性

9.27

Tampermonkey加载jQuery

// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js

9.25

使用i3lock-fancy时xautolock不工作

经过排查是因为xautolock在调用locker时会关闭其标准输出导致locker进程异常退出。

xautolock man page:

By default xautolock closes stdout and stderr. This prevents the locker from writing error messages to these files in case you manually lock your display.  The -nocloseout, -nocloseerr and -noclose options cause xautolock to not close stdout and/or stderr. On some platforms users of xnlock will need to use -nocloseout, in order to make xnlock's witty sayings show up. These options can also be used for debugging cases in which locker invocation is not successful.

solution:

xautolock -time 10 -locker i3lock-fancy -nocloseout

9.22

watch带有管道的命令

watch 'cmd1 | cmd2 | cmd3'

9.15

shell获取绝对路径

realpath <target>

9.12

ping指定包长

ping <host> -s <size>

9.8

SSH无法连通时快速失败

设置ConnectTimeout选项

ssh <host> -o ConnectTimeout=1 # 1秒

便捷管理远端clash-core

# 在本机启动yacd
docker run -p <port>:80 -d --name yacd --rm ghcr.io/haishanh/yacd:master
# 将远程主机上clash-core的external-controller端口转发到本地
ssh -L <ctrl_port>:127.0.0.1:<ctrl_port> dasc_llm -vNT

随后在浏览器中访问localhost:<port>进入yacd,并填写API Base URL为http://localhost:<ctrl_port>

9.6

wget断点续传

wget ... -c

9.5

查找字体规范名称

fc-list
# eg. /usr/share/fonts/noto/NotoSansMono-Regular.ttf: Noto Sans Mono:style=Regular
# ==> Noto Sans Mono:style=Regular

9.3

设置窗口透明度

xprop -id <window_id> -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY <opacity>

其中window_id可以通过wmctrl -l获得,opacity为整数,0表示不透明,0xffffffff表示完全透明。

8.30

GPG签名git commit

source

gpg --list-secret-keys # 列出密钥

gpg --full-generate-key # 生成密钥(交互式)

gpg --armor --export <Fingerprint> # 生成公钥
# 在托管平台添加公钥

git config --global user.signingkey <Fingerprint> # 配置签名公钥
git commit -S -m ... # 提交时签名
git config --global commit.gpgsign true # 提交时默认签名

ssh给AUR投票

ssh aur@aur.archlinux.org vote package_name

8.28

LiteLoaderQQNT在QQ更新后失效

是因为启动代码被覆盖,重新安装即可

yay -S liteloader-qqnt-bin
# :: Running post-transaction hooks...
# (1/1) Patch QQ for LiteLoaderQQNT

跨平台久坐提醒工具

Stretchly

8.26

配置油猴脚本自动更新

在脚本头部新增@updateURL@downloadURL字段,前者提供元信息用于获取版本号,使得油猴插件可以判断脚本是否更新,后者提供脚本完整代码。

(注意链接最后的脚本名是可以随便写的,不影响返回内容 source

// @downloadURL  https://update.greasyfork.org/scripts/<script_id>/<script_name>.user.js
// @updateURL    https://update.greasyfork.org/scripts/<script_id>/<script_name>.user.js

8.22

ImageMagick压缩图片

magick -quality 75 <from.png> <to.jpg> # 75 out of 100

8.20

yay禁用check

yay -S <pkg> --mflags "--nocheck"

8.8

oh-my-zsh Cheet Sheet

source

oh-my-zsh快捷cd

d # display the dir stack
1~9 # cd to the corresponding dir

8.7

fcitx环境变量最佳配置

source

/etc/environment:

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus

8.2

禁用某些cpu核

cpupower-gui offline [LIST OF CPUS] # eg. 0,1,2,11,13

8.1

安卓虚拟位置

solution

有没有ROOT都可以,有ROOT支持基站模拟

scp限速

scp -l <limit> ... # 参数单位为Kb/s,所以注意乘以8

7.29

ext4分区在线扩容

source

7.28

检索手册

apropos <key-word>

web server防止.git文件夹暴露

location ~ /\.git { # 需要放在其他location块之前
    deny all;
}

7.26

测试ssh连接质量

yay -S sshping
sshping <host>

7.22

ssh连接复用

有时服务器只允许密码登录,但重复输入密码比较麻烦,可以配置连接复用实现短时间内只用重新输入一次密码。

~/.ssh/config:

Host <host>
    <...>
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600 # keep 600s

7.20

md5批量校验

md5sum * > checklist.chk
md5sum -c checklist.chk

7.19

快速传文件到服务器

如果本机到服务器的连接带宽受限,但本机和服务器都有较高的公网带宽,可以借助中转站快速传文件。例如SwissTransfer CowTransfer

下载链接无法直接wget(403 forbidden),可以先在本机浏览器找到任意一个常规请求,拷贝对应的CURL命令,然后将下载链接替换进去。

curl --output a.zip <raw-download-link> -H ... -H ...

7.15

无root权限使用PyEnv

由于pyenv有一些构建依赖,无root时pyenv install会遭遇Build Fail

解决方案:使用conda进行local install,创建虚拟环境给pyenv用。

conda create -n py310 python=3.10
conda activate py310

cd .pyenv/versions
python -m venv py310

pyenv virtualenv py310 new_env
pyenv shell new_env
# new_env is like a normal pyenv virtual environment
# but py310 can not be used directly

无root权限安装zsh

solution

export PREFIX=$HOME/.local

# OPTIONAL: zsh will not install without ncurses. IF your machine doesn't have ncurses, you need to install it first.
export CXXFLAGS=" -fPIC" CFLAGS=" -fPIC" CPPFLAGS="-I${PREFIX}/include" LDFLAGS="-L${PREFIX}/lib"
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz
tar -xzvf ncurses-6.2.tar.gz
cd ncurses-6.2
./configure --prefix=$PREFIX --enable-shared
make
make install
cd .. # && rm ncurses-6.2.tar.gz && rm -r ncurses-6.2

# install zsh itself
wget -O zsh.tar.xz https://sourceforge.net/projects/zsh/files/latest/download
mkdir zsh && unxz zsh.tar.xz && tar -xvf zsh.tar -C zsh --strip-components 1
cd zsh
./configure --prefix=$PREFIX
make
make install
cd .. # && rm zsh.tar && rm -r zsh
echo -e "export SHELL=\$HOME/.local/bin/zsh\nexec \$SHELL -l" >> ~/.bash_profile # or chsh

# OPTIONAL: install oh-my-zsh
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

6.18

更新PyEnv

pyenv update

6.12

sudo常用选项

sudo -u user # 指定用户
sudo -E # 保留环境变量

6.10

端口扫描

nmap -sT <target> # TCP connect扫描
sudo nmap -sS <target> # SYN扫描

6.8

打断pacman安装导致系统损坏的恢复方法

pacman -Syu过程中卡死,只好强制重启,重启后出现Kernel Panic。经排查,发现是安装更新时首先会删除被更新的文件全部内容(变为空文件),然后再统一写入新文件内容,此时打断导致大量关键文件缺失(如libc.so)。

在这种情况下广为流传的 chroot+重新安装 方案不能解决问题,执行chroot时会出现chroot: failed to run command '/bin/bash': Input/output error。但是可以通过外部pacman直接向挂载的guest根目录中安装。

solution:

# Boot into an installation media
sudo mount /dev/nvme0n1p8 /mnt
sudo pacman -Syy
sudo pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -S $(pacman --root=/mnt -Qnq) # re-install all installed packages

期间可能会遇到GPG签名验证不通过的情况,可以通过安装manjaro-keyring或手动导入密钥解决。

由于不是在当前系统中执行安装,很多post-hook之类的会执行失败,但是没有关系,不影响修复文件。安装完毕后重启发现可以进入系统,但是一些系统组件没有正常工作(例如由dkms管理的显卡驱动)。此时需要重新再安装一次,以便正确执行post-hook

sudo pacman -Syy
sudo pacman -S $(pacman -Qnq)

6.7

Windows OpenSSH 更改登录SHELL为PowerShell

编辑C:\ProgramData\ssh\sshd_config,在末尾添加:

Match User <your_username>
   ForceCommand powershell.exe -NoLogo -NoProfile

重启sshd服务:

Restart-Service sshd

5.23

gdb打印ip地址

(gdb) p (char*)inet_ntoa(*(uint32_t*)ip_hdr->dst_ip)

ssh port forwarding转发HTTPS服务

ssh -vNT -L 4433:example.com:443 <host>

修改/etc/hosts

127.0.0.1 example.com

于是浏览器可以访问https://example.com:4433

pyenv使用系统包管理器安装的包

起因:graph-tool只能使用conda或包管理器系统级安装,pip无法安装

solution

pyenv virtualenv system venv # use system-wide python version
vim ~/.pyenv/versions/cc_system/cc_system/pyvenv.cfg # EDIT: include-system-site-packages = true

5.19

Linux和Windows之间远程同步文件方案

  1. 在Windows端配置Openssh Server
  2. 使用sshfs将Windows端的目标文件夹挂载到Linux端
  3. 使用基于rsync的常规文件同步工作流,忽略文件系统导致的问题rsync --no-owner --no-perms --no-group ...

winget常用命令

winget source remove winget
winget source add winget https://mirrors.ustc.edu.cn/winget-source

winget search 7zip
winget show --id 7zip.7zip
winget install --id 7zip.7zip
winget upgrade --id 7zip.7zip
winget uninstall --id 7zip.7zip

Windows配置ssh server

先启用Openssh Server应用组件及服务

如果是管理员用户,公钥不能放在%HOME%solution

5.16

快速清理旧文件

# only work in zsh
mv path/to/*(.m+30) target/path # move all files with mtime before 30 days
mv path/to/*(/m+30) target/path # for folders

5.11

convert常见用法

convert path/to/input_image.jpg path/to/output_image.png
convert path/to/input_image.png -resize 640x480 path/to/output_image.png
convert path/to/image1.png path/to/image2.png ... -delay 10 path/to/animation.gif # delay 100ms

5.10

配置多网卡后无法上网

ip route # 查看默认网关
ip route del default via 192.168.1.100 # 删除不正确的网关

5.7

解除Firefox侧边栏宽度限制

solution

5.6

网站自定义快捷键

使用油猴插入脚本

window.addEventListener("keydown", function(e){
    if(e.altKey && e.key == "z"){
        document.getElementsByClassName("icon-shape-rect")[0].click();
    }
});

4.30

调试Makefile

打印跟踪信息:make --trace

打印全部调试信息:make --debug=a

4.2

多线程加速apt

apt-fast

多核加速pip build wheel

MAKEFLAGS="-j`nproc`" pip install ...

3.27

普通用户自定义安装CUDA Toolkit

当需要的CUDA版本和全局安装的不一致,又不想影响全局环境

wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run # 从 https://developer.nvidia.com/cuda-downloads 选择合适版本的runfile
export TARGET_PATH=<custom installation path>
bash cuda_12.4.0_550.54.14_linux.run --toolkit --toolkitpath=$TARGET_PATH

# 编辑 .zshrc
alias cuda12_enable="export LD_LIBRARY_PATH=$TARGET_PATH/lib64:$LD_LIBRARY_PATH; export PATH=$TARGET_PATH/bin:$PATH"

source

pip install自定义临时缓存

/tmp空间不足时,pip无法进行安装,自定义缓存路径即可

TMPDIR=/path/to/tmp pip install --cache-dir=$TMPDIR ...

3.26

允许用户设置低nice

/etc/security/limits.conf

username            -       nice            -20

需要重新登录用户,ulimit -a检查是否设置成功

3.1

docker清理无用容器

docker rm -v $(docker ps --filter status=exited -q)

2.24

ipynb导出到py文件

pip install nbconvert
jupyter nbconvert --to script <xxx.ipynb>

2.20

ipynb跳过单元格

%%script true

<code to skip>

2.18

Python类型注解允许隐式Optional

pyrightconfig.json:

{
    "strictParameterNoneValue": false
}

2.17

VMWare和Linux Memory Compaction的冲突问题

Linux使用Transparent HugePage技术来提高内存效率,需要内核线程kcompactd在后台进行内存整理。但这一过程会导致虚拟机周期性卡顿,关闭此技术即可。

解决方法(root下执行,重启后失效):

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

source

2.5

节省yay压缩软件包时间

修改~/.makepkg.conf中的PKGEXT=.pkg.tar.xzPKGEXT=.pkg.tar

因为使用yay打包后一般是立即安装,而不是发布,此设置可以节省xz压缩、解压的过程

source

1.30

docker容器访问宿主机上的服务

使用host.docker.internal
docker ... --add-host=host.docker.internal:host-gateway
# docker-compose.yml
services:
  xxx:

    ...

    extra_hosts:
      - "host.docker.internal:host-gateway"

直接使用宿主机网络

(可能不安全)

docker ... --net=host
# docker-compose.yml
services:
  xxx:

    ...

    network_mode: host

1.26

简单方便的段错误追踪手段libSegFault.so

libSegFault.so由glibc提供

LD_PRELOAD=/path/to/libSegFault.so ./the_program

1.23

rm避免歧义

当文件/文件夹以-开头时

rm -rf -- -foo

非scp远程拷贝

ssh dd if=xxx | dd of=xxx

1.6

批量查找

find ... | xargs cat | grep xxx

1.3

rsync同步文件夹

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

-n: dry run

--exclude: 相对于sourcefolder, 可重复多次

命令行启动热点

最新一次滚包之后wihotspot-gui不能使用了,看起来像是gtk更新导致不兼容。但是create_ap是能正常使用的

sudo create_ap wlo1 wlo1 '<ssid>' '<passphrase>' --freq-band 2.4

1.1

\(\text{A Fresh Start !}\)