record my journey in CS, gain from history, sometimes scandal.
docker system df -v # view detailed space info
docker container prune # remove stopped containers
docker image prune # remove all dangling images
docker image prune -a # remove all images without at least one container associated to them
sudo chattr +a <file> # append only
在外网服务器上配置:
[Interface]
# ... Other Configurations ...
PostUp = iptables -t nat -A PREROUTING -p tcp -m tcp --dport <outer_port> -j DNAT --to-destination <inner_ip>:<inner_port>
PostDown = iptables -t nat -D PREROUTING -p tcp -m tcp --dport <outer_port> -j DNAT --to-destination <inner_ip>:<inner_port>
如果是host
模式,直接使用127.0.0.1
如果是bridge
模式,使用172.17.0.1
nmap:
nmap -6 -p <端口号> <IPv6地址>
nmap -p <端口号> <IPv4地址>
nc:
# TCP
nc -l <port> # server
nc <addr> <port> # client
# UDP
nc -u -l <port> # server
nc -u <addr> <port> # client
配置NAT64,设置公共DNS64服务器
irm https://get.activated.win | iex
(能直连,但是比较慢,最好开代理)
修改/etc/fstab
后,使用sudo mount -a
验证是否编写正确
/etc/systemd/sleep.conf.d/disable-sleep.conf
:
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowHybridSleep=no
AllowSuspendThenHibernate=no
server
在/etc/exports
中配置:
/exported/directory 192.168.1.0/24(rw,sync)
使用exportfs
启用:
sudo exportfs
client
挂载:
sudo mount -t nfs 192.168.1.1:/exported/directory /mount/point
sudo apt install cifs-utils psmisc
sudo mount -t cifs -o username=$(whoami),uid=$(id -u),gid=$(id -g) //[server-ip]/[share-path] /[mount-point]
有些程序会隐藏光标,而在退出时不恢复,可以手动重置:
tput cnorm # reset cursor
echo -e "\e[?12l\e[?12h" # (optional) make cursor blink
这个策略是由被注入的网站设置的,可以通过将原本XMLHttpRequest
的调用替换为油猴的GM.xmlHttpRequest
来绕过。
有时希望在油猴脚本中访问自己服务器上的资源,被浏览器拦下,提示strict-origin-when-cross-origin
。需要在自己的服务中配置CORS中间件或者在Nginx中配置:
add_header 'Access-Control-Allow-Origin' '*'; # 根据需要设置为具体域名
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain charset=UTF-8';
return 204;
}
某些时候如git diff --exit-code
时不会调用pager,使得diff-so-fancy
没有被调用。
solution:
git --paginate diff --exit-code # force to paginate
docker exec -it <container> bash
import logging
from fastapi import FastAPI, Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
exc_str = f'{exc}'.replace('\n', ' ').replace(' ', ' ')
logging.error(f"{request}: {exc_str}")
content = {'status_code': 10422, 'message': exc_str, 'data': None}
return JSONResponse(content=content, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY)
在BIOS中关闭VMD技术(Volume Management Device)
经排查是MTU问题导致丢包 ref
netsh interface ipv4 show subinterfaces # check MTU configuration
netsh interface ipv4 set subinterface "wg0" mtu=1280 store=persistent # set MTU=1280
将wg网络设置为专用网络:
sudo Set-NetConnectionProfile -Name wg0 -NetworkCategory Private
docker run -h <hostname> ...
- Continuous Format Painter:选中内容,右键,Format Painter右侧小图标
- 仅文本粘贴:Ctrl+Alt+T
- 公式格式与自动编号:solution
- 参考文献自动按照出现先后编号:solution
- 查找替换通配符列表:ref
使用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
yay -S ttf-ms-win10-auto-zh_cn
sudo fc-cache -fv
这个包可以解决SimSun
等字体,但如果还存在缺失,则需要另外安装其他包含的包。
如果内核中没有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
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)
)
pacman -Qo <path>
- pacsave:卸载软件包时检测到配置文件曾被修改,pacman会将其备份为.pacsave文件
- pacnew:更新软件包时检测到配置文件曾被修改,pacman会将更新的配置文件保存为.pacnew文件,并给出警告
- pacdiff:可用于检索pacsave/pacnew文件并进行交互式处理
Ctrl+w + v / :vs <file> # 垂直分屏(左右分)
Ctrl+w + s / :sp <file> # 水平分屏(上下分)
Ctrl+w + k/j/h/l # 向上/下/左/右切换
Ctrl+w + +/-/>/< # 增大高度/减小高度/增大宽度/减小宽度
iw reg get # 查询无线监管域相关信息
sudo iw reg set CN # 设置无线监管域为CN
nmcli device wifi # 查询频道和带宽等信息
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
Firefox引入了AI侧边栏的实验性功能,通过修改高级配置可以进行自定义:
进入about:config
,找到browser.ml.chat.provider
,修改为自定义的服务即可,如https://chatgpt.com/?temporary-chat=true&model=gpt-4o-mini
rofi-bluetooth很久没有更新,没有正确处理bluetoothctl输出中的终端颜色控制字符,而bluetoothctl没有提供关闭彩色输出的选项。
solution: 修改rofi-bluetooth代码,对转义字符进行过滤
devices=$(bluetoothctl devices | grep Device | cut -d ' ' -f 3- | sed 's/\x1b\[[0-9;]*m//g') # 新增sed命令部分
flatpak override --env=ENV1=VALUE1 com.name.package
其使用的ssh server为Dropbear,因此需要将公钥放置在/etc/dropbear/authorized_keys
du -x ...
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;
}
}
curl nxtrace.org/nt | bash
主要是需要自动升级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";
}
}
}
/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 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> # 测试完整性
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
经过排查是因为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
watch 'cmd1 | cmd2 | cmd3'
realpath <target>
ping <host> -s <size>
设置ConnectTimeout选项
ssh <host> -o ConnectTimeout=1 # 1秒
# 在本机启动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>
。
wget ... -c
fc-list
# eg. /usr/share/fonts/noto/NotoSansMono-Regular.ttf: Noto Sans Mono:style=Regular
# ==> Noto Sans Mono:style=Regular
xprop -id <window_id> -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY <opacity>
其中window_id
可以通过wmctrl -l
获得,opacity
为整数,0
表示不透明,0xffffffff
表示完全透明。
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 [email protected] vote package_name
是因为启动代码被覆盖,重新安装即可
yay -S liteloader-qqnt-bin
# :: Running post-transaction hooks...
# (1/1) Patch QQ for LiteLoaderQQNT
在脚本头部新增@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
magick -quality 75 <from.png> <to.jpg> # 75 out of 100
yay -S <pkg> --mflags "--nocheck"
d # display the dir stack
1~9 # cd to the corresponding dir
/etc/environment
:
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus
cpupower-gui offline [LIST OF CPUS] # eg. 0,1,2,11,13
有没有ROOT都可以,有ROOT支持基站模拟
scp -l <limit> ... # 参数单位为Kb/s,所以注意乘以8
apropos <key-word>
location ~ /\.git { # 需要放在其他location块之前
deny all;
}
yay -S sshping
sshping <host>
有时服务器只允许密码登录,但重复输入密码比较麻烦,可以配置连接复用实现短时间内只用重新输入一次密码。
~/.ssh/config
:
Host <host>
<...>
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600 # keep 600s
md5sum * > checklist.chk
md5sum -c checklist.chk
如果本机到服务器的连接带宽受限,但本机和服务器都有较高的公网带宽,可以借助中转站快速传文件。例如SwissTransfer CowTransfer
下载链接无法直接wget(403 forbidden),可以先在本机浏览器找到任意一个常规请求,拷贝对应的CURL命令,然后将下载链接替换进去。
curl --output a.zip <raw-download-link> -H ... -H ...
由于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
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 -)"
pyenv update
sudo -u user # 指定用户
sudo -E # 保留环境变量
nmap -sT <target> # TCP connect扫描
sudo nmap -sS <target> # SYN扫描
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)
编辑C:\ProgramData\ssh\sshd_config
,在末尾添加:
Match User <your_username>
ForceCommand powershell.exe -NoLogo -NoProfile
重启sshd服务:
Restart-Service sshd
(gdb) p (char*)inet_ntoa(*(uint32_t*)ip_hdr->dst_ip)
ssh -vNT -L 4433:example.com:443 <host>
修改/etc/hosts
:
127.0.0.1 example.com
于是浏览器可以访问https://example.com:4433
起因:graph-tool
只能使用conda或包管理器系统级安装,pip无法安装
pyenv virtualenv system venv # use system-wide python version
vim ~/.pyenv/versions/cc_system/cc_system/pyvenv.cfg # EDIT: include-system-site-packages = true
- 在Windows端配置
Openssh Server
- 使用
sshfs
将Windows端的目标文件夹挂载到Linux端 - 使用基于
rsync
的常规文件同步工作流,忽略文件系统导致的问题rsync --no-owner --no-perms --no-group ...
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
先启用Openssh Server
应用组件及服务
如果是管理员用户,公钥不能放在%HOME%
:solution
# 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
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
ip route # 查看默认网关
ip route del default via 192.168.1.100 # 删除不正确的网关
使用油猴插入脚本
window.addEventListener("keydown", function(e){
if(e.altKey && e.key == "z"){
document.getElementsByClassName("icon-shape-rect")[0].click();
}
});
打印跟踪信息:make --trace
打印全部调试信息:make --debug=a
MAKEFLAGS="-j`nproc`" pip install ...
当需要的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"
当/tmp
空间不足时,pip无法进行安装,自定义缓存路径即可
TMPDIR=/path/to/tmp pip install --cache-dir=$TMPDIR ...
/etc/security/limits.conf
username - nice -20
需要重新登录用户,ulimit -a
检查是否设置成功
docker rm -v $(docker ps --filter status=exited -q)
pip install nbconvert
jupyter nbconvert --to script <xxx.ipynb>
%%script true
<code to skip>
pyrightconfig.json
:
{
"strictParameterNoneValue": false
}
Linux使用Transparent HugePage技术来提高内存效率,需要内核线程kcompactd
在后台进行内存整理。但这一过程会导致虚拟机周期性卡顿,关闭此技术即可。
解决方法(root下执行,重启后失效):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
修改~/.makepkg.conf
中的PKGEXT=.pkg.tar.xz
为PKGEXT=.pkg.tar
因为使用yay打包后一般是立即安装,而不是发布,此设置可以节省xz压缩、解压的过程
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
libSegFault.so由glibc提供
LD_PRELOAD=/path/to/libSegFault.so ./the_program
当文件/文件夹以-
开头时
rm -rf -- -foo
ssh dd if=xxx | dd of=xxx
find ... | xargs cat | grep xxx
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