├── .github ├── vercel.json └── workflows │ └── build-push-vercel.yml ├── LICENSE ├── README.md ├── documents ├── android-root.md ├── apps.md ├── archlinux-install.md ├── aria2.md ├── code.md ├── debian-pkg.md ├── docker.md ├── epub-ebook.md ├── ffmpeg.md ├── git.md ├── gs3101-bridge.md ├── http-server.md ├── index.md ├── linux-help.md ├── minecraft.md ├── peach.md ├── python.md ├── regex.md ├── rsyncd.md ├── saas.md ├── shell.md ├── sql.md ├── steam.md ├── systemd.md ├── vscode.md └── windows-help.md └── src ├── docs └── .vuepress │ ├── components │ └── VPPageNav.vue │ ├── config.ts │ ├── public │ └── favicon.ico │ └── styles │ └── index.scss ├── env.sh └── package.json /.github/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "headers": [ 3 | { 4 | "source": "/(.*)", 5 | "headers": [ 6 | { 7 | "key": "Cache-Control", 8 | "value": "public, max-age=10800" 9 | } 10 | ] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /.github/workflows/build-push-vercel.yml: -------------------------------------------------------------------------------- 1 | name: build-push-vercel 2 | 3 | on: 4 | push: 5 | paths: 6 | - 'documents/**' 7 | - 'src/**' 8 | - '.github/workflows/build-push-vercel.yml' 9 | 10 | jobs: 11 | 12 | doc: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Cache 23 | uses: actions/cache@v4 24 | with: 25 | path: ~/.pnpm-store 26 | key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} 27 | restore-keys: ${{ runner.os }}-pnpm- 28 | 29 | - name: Setup pnpm 30 | uses: pnpm/action-setup@v4 31 | with: 32 | version: latest 33 | 34 | - name: env.sh 35 | working-directory: src 36 | run: chmod +x env.sh && ./env.sh 37 | 38 | - name: Build 39 | working-directory: src 40 | run: pnpm build 41 | 42 | - name: vercel.json 43 | run: mv .github/vercel.json src/docs/.vuepress/dist 44 | 45 | - name: Vercel 46 | working-directory: src/docs/.vuepress/dist 47 | env: 48 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} 49 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_DOC }} 50 | run: | 51 | pnpm add -g vercel 52 | vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} 53 | vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} 54 | vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} 55 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2024 ZShab Niba 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blog 2 | 3 | 我的个人网站存档 4 | 5 | ## 仓库结构 6 | 7 | - .github,GitHub Actions 文件 8 | - documents,文章 9 | - src,博客数据 10 | - LICENSE,开源许可证 11 | - README.md,说明文件 12 | 13 | ## 许可证 14 | 15 | MIT © ZShab Niba 16 | -------------------------------------------------------------------------------- /documents/android-root.md: -------------------------------------------------------------------------------- 1 | # Android 玩机指南 2 | 3 | ::: danger 警告 4 | 操作千万条,备份第一条,刷机不规范,机主两行泪 5 | 6 | 解锁 Bootloader 后,先备份字库和基带 7 | ::: 8 | 9 | ## ADB 调试工具 10 | 11 | - 传送门:[https://developer.android.com/studio/releases/platform-tools](https://developer.android.com/studio/releases/platform-tools) 12 | - 驱动传送门:[https://developer.android.com/studio/run/win-usb](https://developer.android.com/studio/run/win-usb) 13 | 14 | ADB 是一个命令行工具,用于与运行 Android 操作系统的设备进行通信 15 | 16 | ### 命令 17 | 18 | - adb 19 | 20 | ```sh 21 | adb devices #检测设备 22 | adb shell pm disable-user PACKAGE_NAME # 冻结应用 23 | adb shell pm enable PACKAGE_NAME # 解冻应用 24 | adb shell pm list packages -s -d # 列出已冻结的应用 25 | adb install APK # 安装应用 26 | adb reboot bootloader/recovery/fastboot # 重启到指定模式 27 | ``` 28 | 29 | - fastboot 30 | 31 | ```sh 32 | fastboot devices # 检测设备 33 | fastboot flash PARTITION IMG # 刷写分区镜像 34 | fastboot reboot # 重启到系统 35 | fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img # 关闭 avb 验证 36 | ``` 37 | 38 | - 特定品牌工具 39 | 40 | 1. 鸿蒙系统,鸿蒙工具箱 41 | 2. VIVO 手机,root 使用 suu 42 | 43 | ### 常见问题 44 | 45 | - Windows 装不上 adb 驱动 46 | 47 | 解压 usb_driver_windows.zip,找到 android_winusb.inf 48 | 49 | 打开设备管理器,其他设备,找到带有 `!` 的 Android 驱动,更新驱动程序,从磁盘安装,选中解压后的 android_winusb.inf 文件,下一步,安装即可 50 | 51 | - SD 卡提示无法使用此目录 52 | 53 | Magisk 模块:no storage restrict 54 | 55 | ## iOS 56 | 57 | - 系统结构 58 | 59 | Apple Music 缓存路径 /var/mobile/Media/CloudAssets,/var/mobile/Media/iTunes_Control/Music 60 | 61 | 图片路径 /var/mobile/Media/DCIM 62 | 63 | - 解决爱思助手自动安装移动版 64 | 65 | 删掉 C 盘 Program Files (x86)\i4Tools7\files\ipa\ 内的文件 66 | -------------------------------------------------------------------------------- /documents/apps.md: -------------------------------------------------------------------------------- 1 | # 好用的 App 推荐 2 | 3 | PC 区 4 | 5 | - MinGW-w64 C/C++ 6 | 7 | https://github.com/niXman/mingw-builds-binaries,版本选择 posix-seh 8 | 9 | - Alacritty 终端模拟器 10 | 11 | https://github.com/alacritty/alacritty,主题列表 https://github.com/alacritty/alacritty-theme 12 | 13 | - Termius SSH 工具 14 | 15 | https://termius.com 16 | 17 | - Navicat 数据库管理 18 | 19 | - PhotoDemon 便携版 PS 20 | 21 | https://github.com/tannerhelland/PhotoDemon 22 | 23 | - MusicTag 音乐标签编辑器 24 | 25 | https://www.cnblogs.com/vinlxc/p/11347744.html 26 | 27 | - K-lite Codec Pack 音视频解码器 28 | 29 | https://codecguide.com 30 | 31 | - HEVC Video Extension HEVC 解码器 32 | 33 | https://www.microsoft.com/zh-cn/p/hevc-video-extensions-from-device-manufacturer/9n4wgh0z6vhq,如果提示设备不支持,搜离线包下载安装 34 | 35 | - Spek 音乐频谱分析 36 | 37 | https://github.com/alexkay/spek 38 | 39 | - OBS Studio 直播和录屏 40 | 41 | https://github.com/obsproject/obs-studio 42 | 43 | - foobar2000 本地音乐播放器 44 | 45 | https://www.foobar2000.org,第三方美化包 https://github.com/dream7180/foobox-cn 46 | 47 | - ImageGlass 图像查看器 48 | 49 | https://github.com/d2phap/ImageGlass 50 | 51 | - mpv 视频播放器 52 | 53 | https://mpv.io 54 | 55 | - Sigil 电子书编辑器 56 | 57 | https://github.com/Sigil-Ebook/SigilePub 58 | 59 | - AlReader2 TXT 小说阅读器 60 | 61 | 上古软件, 蓝奏云 https://www.lanzout.com/i6UxI1wrbnte 62 | 63 | - MacType 字体渲染优化 64 | 65 | https://github.com/snowie2000/mactype 66 | 67 | - Geek Uninstaller 应用程序卸载工具 68 | 69 | https://geekuninstaller.com 70 | 71 | - DiskGenius 磁盘管理工具 72 | 73 | 蓝奏云 https://www.lanzout.com/iPnVK0u05qmj 74 | 75 | - Dism++ 系统优化工具 76 | 77 | https://github.com/Chuyu-Team/Dism-Multi-language 78 | 79 | - MouseClickTool 连点器 80 | 81 | https://github.com/lalakii/MouseClickTool 82 | 83 | - Everything 文件搜索工具 84 | 85 | https://www.voidtools.com 86 | 87 | - Advanced Renamer 批量重命名工具 88 | 89 | https://advancedrenamer.com 90 | 91 | - Locale Emulator 转区工具 92 | 93 | https://github.com/xupefei/Locale-Emulator,以指定的语言编码打开文件 94 | 95 | - AltSnap 窗口控制工具 96 | 97 | https://github.com/RamonUnch/AltSnap,置顶、放大、缩小等 98 | 99 | - Office Tool Plus 100 | 101 | https://otp.landian.vip,安装 Microsoft Office 的工具 102 | 103 | - Typora Markdown 笔记软件 104 | 105 | - Parsec 远程桌面控制 106 | 107 | https://parsec.app 108 | 109 | - 7-Zip 解压缩 110 | 111 | https://www.7-zip.org,增强版 https://github.com/mcmilk/7-Zip-zstd 112 | 113 | - Bypass 114 | 115 | https://www.bypass.cn铁路 12306 自动抢票 116 | 117 | - PCL 2 Minecraft 启动器 118 | 119 | https://afdian.com/p/0164034c016c11ebafcb52540025c377 120 | 121 | - Cheat Engine 修改器 122 | 123 | 蓝奏云 https://www.lanzout.com/iwvLs10pejqb 124 | 125 | - CelFlashBrowser Flash 浏览器 126 | 127 | https://github.com/Mzying2001/CefFlashBrowser 128 | 129 | - Clash Verge 小猫咪 130 | 131 | https://github.com/clash-verge-rev/clash-verge-rev 132 | 133 | - v2rayN 134 | 135 | https://github.com/2dust/v2rayN,旧版 https://github.com/2dust/v2rayN/releases/tag/5.39 136 | 137 | - Aria2 命令行下载工具 138 | 139 | https://github.com/aria2/aria2 140 | 141 | - ffmpeg 音视频处理工具 142 | 143 | https://github.com/BtbN/FFmpeg-Builds 144 | 145 | - 标准字体 思源黑体 Source Han Sans 146 | 147 | https://github.com/adobe-fonts/source-han-sans,Language Specific OTFs Simplified Chinese 148 | 149 | - 衬线字体 思源宋体 Source Han Serif 150 | 151 | https://github.com/adobe-fonts/source-han-serif,Language Specific OTFs Simplified Chinese 152 | 153 | - 等宽字体 Source Code Pro 154 | 155 | https://github.com/adobe-fonts/source-code-pro 156 | 157 | --- 158 | 159 | 安卓区 160 | 161 | - Via,浏览器 162 | 163 | - Termux,终端模拟器 164 | 165 | - ClashMetaForAndroid,小猫咪 166 | 167 | - VPN 热点,使用热点共享代理 168 | 169 | - 照片编辑器,最好用的图片处理工具 170 | 171 | - BBLL,第三方 bilibili,TV 端 172 | 173 | - bilibilit v1.6.6,第三方 bilibili,TV 端 174 | 175 | - SmartTube,第三方 YouTube,TV 端 176 | 177 | - Yamby,第三方 emby 客户端 178 | 179 | - PowerAMP,本地音乐播放器 180 | 181 | - aos-AVP,视频播放器,支持挂载 webdav 观看,TV 端 182 | 183 | - Kindle,看小说 184 | 185 | - 阅读,看小说 186 | 187 | - Aa 小说阅读器,看小说,兼容上古设备 188 | 189 | - MT 管理器,文件管理器 190 | 191 | - Micro G,谷歌框架 GMS 的超轻量替代 192 | 193 | - 黑阈,后台进程管理工具 194 | 195 | - CaptiveMgr 清除 x 和 !,修正状态栏 WiFi 图标工具 196 | 197 | - SD Maid,空间清理工具 198 | 199 | - WakeUp,课程表,可导出 ics 日历文件 200 | 201 | - Squid,手写笔记软件 202 | 203 | - Zarchiver,解压缩工具 204 | 205 | - Kirikiroid2,Galgame 模拟器 206 | 207 | - Tyranor,Galgame 模拟器 208 | 209 | - MDGram,第三方 Telegram 客户端 210 | 211 | - 音量君,细粒度音理调节,酷安 212 | 213 | - 夜间模式,遮罩层降低亮度,酷安 214 | 215 | --- 216 | 217 | 苹果区 218 | 219 | - Termius,SSH 工具 220 | 221 | - PixEz,第三方 Pixiv 插画平台,美区 222 | 223 | - Shadowrocket,小火箭,美区 224 | 225 | - 嗶哩嗶哩,bilibili 海外版,美区 226 | 227 | - Kindle,亚马逊阅读器,美区 228 | 229 | - 香色闺阁,看小说,IPA 230 | 231 | - Filza,文件管理器,IPA 232 | 233 | - 熊猫吃短信,短信拦截 234 | 235 | - TollStore,巨魔商店,免签名安装应用,IPA 236 | 237 | - AltStore,电脑自签名安装应用,七天有效,IPA 238 | 239 | - 一个木函,工具箱 240 | 241 | - Bitwarden,搭配自建的 Vaultwarden 服务使用 242 | 243 | - Nicegram,第三方 Telegram 客户端,美区 244 | -------------------------------------------------------------------------------- /documents/archlinux-install.md: -------------------------------------------------------------------------------- 1 | # Arch Linux 安装指南 2 | 3 | 可能导致数据丢失,请在安装前为重要的数据做好备份 4 | 5 | 需要请参考 [ArchWiki#安装指南](https://wiki.archlinux.org/title/Installation_guide) 6 | 7 | - 实机安装部分 [跳转](#准备阶段) 8 | - 云服务器安装部分 [跳转](#云服务器安装) 9 | 10 | ## 准备阶段 11 | 12 | 下载镜像、制作启动盘、确认 efi 启动方式等步骤略过,不做描述 13 | 14 | ## 1. 关闭 reflcetor 服务 15 | 16 | 安装镜像中默认启动的 reflector 服务会自动更新 pacman 软件源,或许它是个很好用的工具,但因为一些特殊的网络原因,它并不能带来更好的体验 17 | 18 | ```sh 19 | systemctl stop reflector.service 20 | ``` 21 | 22 | ## 2. 连接网络 23 | 24 | ### 2.1. 有线与无线网络 25 | 26 | 正常情况下,系统会自动连接有线网络,无线网络使用 iwctl 来进行连接,输入如下指令进入 iwd 模式,并查看无线网卡的名称 27 | 28 | ```sh 29 | iwctl 30 | device list 31 | ``` 32 | 33 | 假设查看的无线网卡名称为 `wlan0`,输入如下指令扫描无线网络 34 | 35 | ```sh 36 | station wlan0 scan 37 | station wlan0 get-networks 38 | ``` 39 | 40 | 中文名称的网络无法正常显示和连接,请连接英文名称的网络 41 | 42 | ```sh 43 | station wlan0 connect 网络名称 44 | ``` 45 | 46 | 接着输入该网络密码,密码回显为 `*`,输入 `exit` 退出 iwd 模式 47 | 48 | ### 2.2. 测试网络连接 49 | 50 | 输入 `ping -c 4 baidu.com`,测试是否成功连上网络 51 | 52 | ## 3. 校准时间 53 | 54 | 准确的时间是至关重要的,它决定了很多东西能否正常运行,输入如下指令查看 55 | 56 | ```sh 57 | timedatectl status 58 | ``` 59 | 60 | ## 4. 设置镜像软件源 61 | 62 | 输入 `vim /etc/pacman.d/mirrorlist` 编辑 pacman 镜像配置文件,将镜像软件源添加到最前面,推荐以下几个源,选一个即可 63 | 64 | ```ini 65 | Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch 66 | Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch 67 | Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch 68 | ``` 69 | 70 | 输入 `pacman -Syy` 同步 71 | 72 | ## 5. 硬盘分区与格式化 73 | 74 | ### 5.1. 分区 75 | 76 | 输入 `lsblk` 查看硬盘信息,`NAME` 即为硬盘的名称 77 | 78 | ``` 79 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS 80 | nvme0n1 259:0 0 953.9G 0 disk 81 | ``` 82 | 83 | 输入 `cfdisk /dev/nvme0n1` 进入硬盘分区页面,首先分出 300M 的 efi 分区,设为 `EFI System` 类型,剩下的空间全部分给系统分区,设为 `Linux filesystem` 类型,选择 `[Write]` 保存,退出 84 | 85 | 再次输入 `lsblk` 查看硬盘信息,得到以下信息 86 | 87 | ``` 88 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS 89 | nvme0n1 259:0 0 953.9G 0 disk 90 | ├─nvme0n1p1 259:1 0 300M 0 part 91 | └─nvme0n1p2 259:2 0 697.6G 0 part 92 | ``` 93 | 94 | ### 5.2. 格式化 95 | 96 | 输入如下指令,格式化 efi 分区为 fat32 格式,格式化系统分区为 btrfs 格式 97 | 98 | ```sh 99 | mkfs.vfat -F32 /dev/nvme0n1p1 100 | mkfs.btrfs /dev/nvm0n1p2 101 | ``` 102 | 103 | ## 6. 子卷与挂载 104 | 105 | 输入 `mount -t btrfs -o compress=zstd /dev/nvme0n1p2 /mnt` 将 btrfs 分区挂载到 `/mnt` 目录,输入如下指令创建 3 个 btrfs 子卷 106 | 107 | ```sh 108 | btrfs subvolume create /mnt/@ 109 | btrfs subvolume create /mnt/@home 110 | btrfs subvolume create /mnt/@swap 111 | ``` 112 | 113 | 输入 `umount /mnt` 取消 btrfs 分区的挂载,并将 btrfs @ 子卷挂载为根目录 114 | 115 | ```sh 116 | mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p2 /mnt 117 | ``` 118 | 119 | 输入 `mkdir -p /mnt/home /mnt/swap /mnt/boot` 创建 home swap boot 目录,将 btrfs @home 子卷挂载为家目录,btrfs @swap 子卷挂载为 swap 目录,将 efi 分区挂载为 boot 目录 120 | 121 | ```sh 122 | mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p2 /mnt/home 123 | mount -t btrfs -o subvol=/@swap /dev/nvme0n1p2 /mnt/swap 124 | mount /dev/nvme0n1p1 /mnt/boot 125 | ``` 126 | 127 | ## 7. 安装基本系统 128 | 129 | 输入 `pacstrap /mnt base base-devel linux linux-firmware` 安装基础环境、基础开发包、内核、固件包,输入 `pacstrap /mnt networkmanager vim` 安装网络管理工具、文本编辑器 130 | 131 | 此处如果报错,请尝试输入 `pacman -Syy archlinux-keyring` 修复 132 | 133 | ## 8. 配置系统 134 | 135 | 输入 `genfstab -U /mnt >> /mnt/etc/fstab` 生成 fstab 文件,输入 `echo os > /mnt/etc/hostname` 设置主机名,此处设为 `os` 136 | 137 | 输入 `arch-chroot /mnt` 进入 chroot 环境 138 | 139 | 输入 `systemctl enable NetworkManager.service` 启用网络服务 140 | 141 | ### 8.1. 交换空间支持 142 | 143 | 输入如下指令,创建交换文件并启用交换空间,大小设为 2G 144 | 145 | ```sh 146 | chattr +C /swap 147 | truncate -s 0 /swap/swapfile 148 | fallocate -l 2G /swap/swapfile 149 | chmod 0600 /swap/swapfile 150 | mkswap /swap/swapfile 151 | swapon /swap/swapfile 152 | ``` 153 | 154 | ### 8.2. 修改 fstab 文件 155 | 156 | 输入 `vim /etc/fstab`,在末尾加上 `/swap/swapfile none swap defaults 0 0`,并将所有的 `subvolid=` 项删除,最终应大致如下所示 157 | 158 | ```ini 159 | # /dev/nvme0n1p1 160 | UUID=0591-3783 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 161 | 162 | # /dev/nvme0n1p2 163 | UUID=979aa7ec-8842-4e22-8bfc-4c8aed3de56d / btrfs rw,relatime,compress=zstd:3,ssd,space_cache=v2,subvol=/@ 0 0 164 | 165 | # /dev/nvme0n1p2 166 | UUID=979aa7ec-8842-4e22-8bfc-4c8aed3de56d /home btrfs rw,relatime,compress=zstd:3,ssd,space_cache=v2,subvol=/@home 0 0 167 | 168 | # /dev/nvme0n1p2 169 | UUID=979aa7ec-8842-4e22-8bfc-4c8aed3de56d /swap btrfs rw,relatime,ssd,space_cache=v2,subvol=/@swap 0 0 170 | 171 | /swap/swapfile none swap defaults 0 0 172 | ``` 173 | 174 | ### 8.3. 设置上海时区 175 | 176 | 输入 `ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime` 将时区设置为上海时区,输入 `hwclock --systohc` 校准硬件时间 177 | 178 | ### 8.4. 设置语言环境 179 | 180 | 输入如下指令,生成中文和英文语言环境 181 | 182 | ```sh 183 | sed -i 's/#zh_CN.UTF-8/zh_CN.UTF-8/g' /etc/locale.gen 184 | sed -i 's/#en_US.UTF-8/en_US.UTF-8/g' /etc/locale.gen 185 | locale-gen 186 | ``` 187 | 188 | 输入 `echo LANG=en_US.UTF-8 > /etc/locale.conf` 将系统语言设置为英语,暂时不要设为中文,会导致 tty 乱码,后续图形化配置完成后可改为中文 189 | 190 | ## 9. 设置 root 用户密码 191 | 192 | 输入 `passwd` 为 root 超级用户设置密码,输入密码时无回显 193 | 194 | ## 10. 安装微码文件 195 | 196 | 使用 Intel CPU 的用户输入 `pacman -S intel-ucode`,使用 AMD CPU 的用户输入 `pacman -S amd-ucode` 197 | 198 | ## 11. 添加开机引导 199 | 200 | 输入 `bootctl --path=/boot install` 将 systemd-boot 引导安装到 `/boot` 目录 201 | 202 | 创建 `/boot/loader/loader.conf` 文件并写入如下内容 203 | 204 | ```ini 205 | timeout 5 206 | console-mode max 207 | editor no 208 | ``` 209 | 210 | 输入 `blkid -s PARTUUID -o value /dev/nvme0n1p2` 查看系统分区的 PARTUUID,假设此处获取的 PARTUUID 为 `b4e38594-773b-a845-98f6-3a72a08db6d9`,创建 `/boot/loader/entries/arch.conf` 文件并写入如下内容 211 | 212 | ```ini 213 | title Arch Linux 214 | linux /vmlinuz-linux 215 | initrd /intel-ucode.img 216 | initrd /initramfs-linux.img 217 | options root=PARTUUID=b4e38594-773b-a845-98f6-3a72a08db6d9 rw rootflags=subvol=/@ 218 | ``` 219 | 220 | 创建 `/etc/pacman.d/hooks/95-systemd-boot.hook` 文件并写入如下内容 221 | 222 | ```ini 223 | [Trigger] 224 | Type = Package 225 | Operation = Upgrade 226 | Target = systemd 227 | 228 | [Action] 229 | Description = Gracefully upgrading systemd-boot... 230 | When = PostTransaction 231 | Exec = /usr/bin/systemctl restart systemd-boot-update.service 232 | ``` 233 | 234 | ## 12. 重启 235 | 236 | 输入以下指令,退回安装环境,取消所有分区的挂载,重启 237 | 238 | ```sh 239 | exit 240 | umount -R /mnt 241 | reboot 242 | ``` 243 | 244 | > 注:基础安装部分结束 245 | 246 | ## 进入系统 247 | 248 | 使用 root 用户登录,密码是前文中自己设置的密码 249 | 250 | ## 13. 连接网络 251 | 252 | 正常情况下,系统会自动连接有线网络,无线网络使用 NetworkManager 连接,输入 `nmtui` 进入网络管理页面进行连接 253 | 254 | ## 14. 添加普通用户 255 | 256 | 输入 `useradd -m -G wheel -s /bin/bash atri` 创建普通用户,此处创建为 `atri`,输入 `passwd atri`,为 atri 用户设置密码 257 | 258 | 输入如下指令为普通用户启用 sudo 259 | 260 | ```sh 261 | sed -i 's/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/g' /etc/sudoers 262 | ``` 263 | 264 | ## 15. 可选步骤 265 | 266 | ### 15.1. 启用 multilib 软件源 267 | 268 | multilib 软件源是为了兼容 32 位程序而存在的,如跳过此步骤,请忽略后文中 32 位程序的内容 269 | 270 | 输入 `vim /etc/pacman.conf` 编辑 pacman 配置文件,找到 `[multilib]`,将该节的 `#` 删除 271 | 272 | ### 15.2. 添加 archlinuxcn 软件源 273 | 274 | 输入 `vim /etc/pacman.conf` 编辑 pacman 配置文件,将 archlinuxcn 软件源配置信息添加到末尾,推荐以下几个源,选一个即可 275 | 276 | ```ini 277 | [archlinuxcn] 278 | Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch 279 | Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch 280 | Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch 281 | ``` 282 | 283 | 输入 `pacman -Syy archlinuxcn-keyring` 同步并安装 archlinuxcn 密钥环 284 | 285 | ### 15.3. 安装 AUR 助手 paru 或 yay 286 | 287 | 如果已添加 archlinuxcn 软件源,输入 `pacman -S paru` 直接安装 288 | 289 | 如果未添加 archlinuxcn 软件源,如下输入指令编译安装 290 | 291 | ```sh 292 | pacman -S git 293 | cd /tmp 294 | git clone https://aur.archlinux.org/paru.git 295 | chown nobody paru && cd paru 296 | su nobody -s /bin/bash -c 'makepkg -sf' 297 | pacman -U paru-*.pkg.tar.zst 298 | ``` 299 | 300 | > 安装 yay 直接把上面的 `paru` 替换掉即可 301 | 302 | ## 16. 显卡驱动 303 | 304 | ### 16.1. Intel 核显 305 | 306 | 输入 `pacman -S vulkan-intel mesa` 安装 Intel 核显驱动,输入 `pacman -S lib32-vulkan-intel lib32-mesa` 安装 32 位 Intel 核显驱动 307 | 308 | ### 16.2. NVIDIA 独显 309 | 310 | 输入 `pacman -S nvidia nvidia-settings nvidia-prime` 安装 NVIDIA 独显驱动,输入 `pacman -S lib32-nvidia-utils` 安装 32 位 NVIDIA 独显驱动 311 | 312 | ## 17. 汉文字体 313 | 314 | 输入以下指令,安装简体中文、日文、韩文、台版繁体中文四种字形的思源黑体和思源宋体 315 | 316 | ```sh 317 | pacman -S adobe-source-han-sans-cn-fonts adobe-source-han-serif-cn-fonts 318 | pacman -S adobe-source-han-sans-jp-fonts adobe-source-han-serif-jp-fonts 319 | pacman -S adobe-source-han-sans-kr-fonts adobe-source-han-serif-kr-fonts 320 | pacman -S adobe-source-han-sans-tw-fonts adobe-source-han-serif-tw-fonts 321 | ``` 322 | 323 | ## 18. 图形桌面环境 324 | 325 | 输入 `pacman -S gnome` 安装 GNOME 桌面环境,输入 `systemctl enable --now gdm.service` 启动 GNOME 桌面环境,并设为开机自启 326 | 327 | 在以后的图形化使用中,请以普通用户的身份登录系统 328 | 329 | > 注:进阶安装部分结束 330 | 331 | ## 云服务器安装 332 | 333 | 云服务器提供商需要支持 VNC 连接,且服务器正在使用任意 Linux 操作系统 334 | 335 | 需要请参考 [ArchWiki#从现有 Linux 发行版安装 Arch Linux](https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux) 336 | 需要请使用 [vps2arch 脚本](https://github.com/drizzt/vps2arch) 337 | 338 | 腾讯云 VNC 界面:远程连接 - VNC 连接 339 | 340 | 阿里云 VNC 界面:远程连接 - 救援模式,需要先点击运行一次上方的复制命令才能接受到键盘操作 341 | 342 | ### 1. 下载系统镜像 343 | 344 | 下载系统镜像,改名为 archlinux.iso 并放在根目录,有条件可以从内网下载 345 | 346 | ```sh 347 | # 腾讯云内网 348 | wget mirrors.tencentyun.com/archlinux/iso/latest/archlinux-x86_64.iso -O /archlinux.iso 349 | 350 | # 阿里云内网 351 | wget mirrors.cloud.aliyuncs.com/archlinux/iso/latest/archlinux-x86_64.iso -O /archlinux.iso 352 | ``` 353 | 354 | ### 2. 添加开机引导项 355 | 356 | 编辑 /boot/grub/grub.cfg,在末尾处添加以下内容,`/dev/vda1` 为 archlinux.iso 文件所在的分区 357 | 358 | ```sh 359 | menuentry 'Arch Linux LiveCD' { 360 | set isofile=/archlinux.iso 361 | set imgdevpath=/dev/vda1 362 | loopback lo0 $isofile 363 | linux (lo0)/arch/boot/x86_64/vmlinuz-linux img_dev=$imgdevpath img_loop=$isofile 364 | initrd (lo0)/arch/boot/x86_64/initramfs-linux.img 365 | } 366 | ``` 367 | 368 | 如果在开机时没有出现 Grub 引导界面,请检测 grub.cfg 文件中是否有自动选择启动项的配置 369 | 370 | ### 3. 启动镜像环境 371 | 372 | 打开 VNC 界面,输入 reboot 重启系统,在开机的引导界面选择最后一项 `Arch Linux LiveCD`,如果时间不够选择,在 grub.cfg 中修改 GRUB_TIMEOUT 的值,单位是秒 373 | 374 | 输入命令 passwd 设置临时密码,以使用 ssh root@ip 进行远程连接,随后不再使用 VNC 375 | 376 | > 注:此时反悔还来得及 377 | 378 | ### 4. 清理系统数据 379 | 380 | 直接格式化硬盘即可 `mkfs.ext4 /dev/vda1`,随后挂载硬盘 `mount /dev/vda1 /mnt` 381 | 382 | 如无法格式化,可以尝试重设硬盘挂载权限 `mount -o rw,remount /dev/vda1`,再挂载硬盘 `mount /dev/vda1 /mnt`,手动删除数据 `rm -rf /mnt/*` 383 | 384 | > 注:本文确保硬盘分区表使用 dos/mbr 格式而不是 gpt 格式,可输入 fdisk -l 命令查看。使用 `dd if=/dev/zero of=/dev/vda bs=512K count=1` 命令可直接擦除硬盘分区表信息 385 | 386 | ### 5. 正式安装 387 | 388 | 先换源,有条件使用内网源 389 | 390 | ```sh 391 | # 腾讯云内网 392 | echo 'Server = http://mirrors.tencentyun.com/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist 393 | 394 | # 阿里云内网 395 | echo 'Server = http://mirrors.cloud.aliyuncs.com/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist 396 | ``` 397 | 398 | 安装基本包,生成磁盘信息标识 399 | 400 | ```sh 401 | pacstrap /mnt base linux-lts openssh nano grub 402 | genfstab -U /mnt >> /mnt/etc/fstab 403 | ``` 404 | 405 | nameserver 信息,有条件使用内网地址 406 | 407 | ```sh 408 | # 腾讯云内网 409 | echo nameserver 183.60.82.98 > /mnt/etc/resolv.conf 410 | 411 | # 阿里云内网 412 | echo nameserver 100.100.2.136 > /mnt/etc/resolv.conf 413 | ``` 414 | 415 | 进入 chroot 环境 416 | 417 | ```sh 418 | arch-chroot /mnt 419 | ``` 420 | 421 | 时区,语言环境,网络连接信息,`Name` 值为网卡名称,使用 ip addr 命令查看,此处示例为 ens5 422 | 423 | ```sh 424 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 425 | 426 | echo zh_CN.UTF-8 UTF-8 > /etc/locale.gen 427 | locale-gen 428 | 429 | echo vps > /etc/hostname 430 | 431 | cat << EOL > /etc/systemd/network/20-wired.network 432 | [Match] 433 | Name=ens5 434 | [Network] 435 | DHCP=ipv4 436 | EOL 437 | ``` 438 | 439 | ssh,此处配置为必须使用密钥登陆,如使用密码可将 PasswordAuthentication 改为 yes 440 | 441 | ```sh 442 | cat << EOL > /etc/ssh/sshd_config.d/10-vps.conf 443 | PermitRootLogin yes 444 | PasswordAuthentication no 445 | ClientAliveInterval 3600 446 | PrintLastLog no 447 | AddressFamily inet 448 | UsePAM no 449 | EOL 450 | 451 | # 密钥登陆的公钥信息,此处为示例,具体不做描述 452 | cat << EOL > /root/.ssh/authorized_keys 453 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPNwSU4IuTcE1fEkfooybSCM6gpChn7okmtBgblK1Bkx 454 | EOL 455 | ``` 456 | 457 | 设置 root 密码,使用 `passwd` 命令 458 | 459 | 自启系统服务,开机引导 460 | 461 | ```sh 462 | systemctl enable sshd.service systemd-networkd.service 463 | grub-install --target=i386-pc /dev/vda 464 | grub-mkconfig -o /boot/grub/grub.cfg 465 | ``` 466 | 467 | 结束,重启 468 | 469 | ```sh 470 | exit 471 | reboot 472 | ``` 473 | 474 | ### 6. 其他 475 | 476 | 交换分区配置 477 | 478 | ```sh 479 | fallocate -l 2G /boot/swapfile 480 | chmod 600 /boot/swapfile 481 | mkswap /boot/swapfile 482 | swapon /boot/swapfile 483 | echo '/boot/swapfile none swap defaults 0 0' >> /etc/fstab 484 | ``` 485 | 486 | nano 文本编辑器 487 | 488 | ```sh 489 | cat << EOL > /root/.nanorc 490 | include "/usr/share/nano/*.nanorc" 491 | set linenumbers 492 | set tabstospaces 493 | set constantshow 494 | set tabsize 4 495 | EOL 496 | ``` 497 | 498 | 安装 fish 为默认 SHELL 499 | 500 | ```sh 501 | pacman -S --noconfirm fish 502 | chsh -s /usr/bin/fish 503 | mkdir -p /root/.config/fish/conf.d 504 | cat << EOL > /root/.config/fish/conf.d/10-root.fish 505 | set fish_greeting 506 | set LANG zh_CN.UTF-8 507 | EOL 508 | ``` 509 | -------------------------------------------------------------------------------- /documents/aria2.md: -------------------------------------------------------------------------------- 1 | # Aria2 下载器 2 | 3 | Aria2 是一个自由、开源、轻量级多协议和多源的命令行下载工具。它支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 协议,可以通过内建的 JSON-RPC 和 XML-RPC 接口来操纵 4 | 5 | https://github.com/aria2/aria2 6 | 7 | ## 自启动配置 8 | 9 | - Linux 10 | 11 | 在 ~/.config/systemd/user 目录下创建 aria2.service 文件,写入如下内容 12 | 13 | ```ini 14 | [Unit] 15 | Description=aria2 daemon 16 | [Service] 17 | ExecStart=/usr/bin/aria2c --conf-path=%h/aria2/aria2.conf 18 | Restart=on-failure 19 | [Install] 20 | WantedBy=default.target 21 | ``` 22 | 23 | 输入如下命令 24 | 25 | ```sh 26 | systemctl enable --user --now aria2 27 | ``` 28 | 29 | - Windows 30 | 31 | 在 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 目录下创建 aira2.vbs 文件,写入如下内容 32 | 33 | ```vb 34 | CreateObject("WScript.Shell").Run "%HOMEPATH%\aria2\aria2c.exe --conf-path=%HOMEPATH%\aria2\aria2.conf -D",0 35 | ``` 36 | 37 | ## RPC 使用 38 | 39 | - 发送下载任务 40 | 41 | ```sh 42 | curl URL/jsonrpc -d '{ 43 | "id":"1", 44 | "method":"aria2.addUri", 45 | "params":["token:密钥",["链接"]] 46 | }' 47 | ``` 48 | 49 | - 修改 bt-tracker 50 | 51 | ```sh 52 | curl URL/jsonrpc -d '{ 53 | "id":"1", 54 | "method":"aria2.changeGlobalOption", 55 | "params":["token:密钥",{"bt-tracker":"TRACKER1,TRACKER2"}] 56 | }' 57 | ``` 58 | 59 | ## 管理面板 60 | 61 | https://github.com/mayswind/AriaNg 62 | 63 | 1. AriaNg 设置,RPC 64 | 2. RPC 地址,RPC 密钥(即 aria2.conf 中 rpc-secret 的值) 65 | 66 | 如果无法连接,尝试更换 RPC 协议 67 | 68 | 支持通过 URL 设置 RPC 参数 69 | 70 | ``` 71 | URL/#!/settings/rpc/set/协议/地址/端口/jsonrpc/密钥(使用 base64 URL 安全编码) 72 | ``` 73 | 74 | ## 配置文件 75 | 76 | 按照此处的配置,应在家目录存在 aria2 文件夹,内有如下文件 77 | 78 | - aria2.session 79 | 80 | 空文件 81 | 82 | - aria2.conf 83 | 84 | ```ini 85 | dir=${HOME}/Downloads 86 | disk-cache=64M 87 | file-allocation=none 88 | no-file-allocation-limit=64M 89 | continue=true 90 | always-resume=false 91 | max-resume-failure-tries=0 92 | remote-time=true 93 | 94 | input-file=${HOME}/aria2/aria2.session 95 | save-session=${HOME}/aria2/aria2.session 96 | save-session-interval=1 97 | auto-save-interval=60 98 | force-save=false 99 | 100 | max-file-not-found=10 101 | max-tries=0 102 | retry-wait=10 103 | connect-timeout=10 104 | timeout=10 105 | max-concurrent-downloads=10 106 | max-connection-per-server=16 107 | split=5 108 | min-split-size=10M 109 | piece-length=1M 110 | allow-piece-length-change=true 111 | lowest-speed-limit=0 112 | max-overall-download-limit=0 113 | max-download-limit=0 114 | disable-ipv6=true 115 | http-accept-gzip=true 116 | reuse-uri=false 117 | no-netrc=true 118 | allow-overwrite=false 119 | auto-file-renaming=true 120 | content-disposition-default-utf8=true 121 | #min-tls-version=TLSv1.2 122 | 123 | listen-port=6881 124 | dht-listen-port=6881 125 | enable-dht=true 126 | enable-dht6=false 127 | #bt-external-ip= 128 | #dht-file-path=${HOME}/aria2/dht.dat 129 | #dht-file-path6=${HOME}/aria2/dht6.dat 130 | #dht-entry-point=dht.transmissionbt.com:6881 131 | #dht-entry-point6=dht.transmissionbt.com:6881 132 | bt-enable-lpd=true 133 | #bt-lpd-interface= 134 | enable-peer-exchange=true 135 | bt-max-peers=128 136 | bt-request-peer-speed-limit=10M 137 | max-overall-upload-limit=2M 138 | max-upload-limit=0 139 | seed-ratio=2.0 140 | #seed-time=0 141 | bt-hash-check-seed=true 142 | bt-seed-unverified=false 143 | bt-tracker-connect-timeout=10 144 | bt-tracker-timeout=10 145 | #bt-tracker-interval=0 146 | bt-prioritize-piece=head=32M,tail=32M 147 | rpc-save-upload-metadata=true 148 | follow-torrent=true 149 | pause-metadata=false 150 | bt-save-metadata=true 151 | bt-load-saved-metadata=true 152 | bt-remove-unselected-file=true 153 | bt-force-encryption=true 154 | #bt-require-crypto=false 155 | #bt-min-crypto-level=plain 156 | bt-detach-seed-only=true 157 | user-agent= 158 | #peer-agent=Deluge 1.3.15 159 | #peer-id-prefix=-DE13F0- 160 | 161 | enable-rpc=true 162 | rpc-allow-origin-all=true 163 | rpc-listen-all=true 164 | rpc-listen-port=6800 165 | #rpc-secret= 166 | rpc-max-request-size=10M 167 | #rpc-secure=false 168 | #rpc-certificate= 169 | #rpc-private-key= 170 | #event-poll=select 171 | 172 | #async-dns=true 173 | #async-dns-server= 174 | #interface= 175 | #multiple-interface= 176 | 177 | #log= 178 | #log-level=warn 179 | console-log-level=notice 180 | quiet=false 181 | summary-interval=0 182 | show-console-readout=false 183 | 184 | #on-download-stop= 185 | #on-download-complete= 186 | #on-download-error= 187 | #on-download-pause= 188 | #on-download-start= 189 | #on-bt-download-complete= 190 | 191 | bt-tracker= 192 | ``` 193 | -------------------------------------------------------------------------------- /documents/code.md: -------------------------------------------------------------------------------- 1 | # 编程代码系列记录 2 | 3 | 记录一些好用的工具和代码 4 | 5 | ```sh 6 | # python 代码格式化 7 | black a.py 8 | 9 | # php 启动内置 web 服务 10 | php -S 0.0.0.0:8000 11 | 12 | # pnpm/npm 换源 npmmirror 13 | npm config set registry https://registry.npmmirror.com 14 | 15 | # pip 换源清华 16 | pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 17 | 18 | # go get 换源阿里 19 | go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct 20 | 21 | # go 逃逸堆分析 22 | -gcflags="-m" 23 | 24 | # 检测代码 25 | golangci-lint run ./... 26 | 27 | # 检查没有处理的错误 28 | # go install github.com/kisielk/errcheck@latest 29 | errcheck -blank ./... 30 | 31 | # 代码格式化 32 | # go install mvdan.cc/gofumpt@latest 33 | gofumpt -l -w . 34 | 35 | # 检查从未使用的代码 36 | # go install golang.org/x/tools/cmd/deadcode@latest 37 | deadcode . 38 | 39 | # c 静态编译,使用 musl libc 或 mingw64 代替 glibc 40 | 41 | # 去除静态文件的无用符号信息 42 | strip file 43 | 44 | # upx 工具,压缩二进制文件体积,-d 参数还原 45 | upx --ultra-brute file 46 | ``` 47 | 48 | ```go 49 | // gorm 表前缀 50 | NamingStrategy: schema.NamingStrategy{ 51 | TablePrefix: tablePrefix, 52 | }, 53 | 54 | // gorm 记录浏览量 55 | db.Model(&Data{}).Update("count", gorm.Expr("count + ?", 1)) 56 | ``` 57 | 58 | ```css 59 | { 60 | text-indent: 2em; /* 行首缩进 */ 61 | writing-mode: vertical-rl; /* 竖向从右到左排列文字 */ 62 | overflow: hidden; /* 隐藏溢出部分 */ 63 | min-height: 100vh; /* 最小高度为整个屏幕 */ 64 | display: inline-block; /* 同一行显示的块级元素 */ 65 | border: 3px solid #aa8; /* 边框 */ 66 | border-radius: 10px; /* 圆角 */ 67 | box-shadow: 0px 0px 25px #c77; /* 阴影 */ 68 | padding: 30px; /* 内边距 */ 69 | margin: 50px auto; /* 外边距 */ 70 | cursor: pointer; /* 改变鼠标样式 */ 71 | user-select: none; /* 禁止选中文字 */ 72 | } 73 | 74 | /* 定义深色模式情境下的元素样式 */ 75 | @media(prefers-color-scheme: dark) {} 76 | 77 | /* 将内部元素均匀排列为一行 */ 78 | div { 79 | display: flex; 80 | justify-content: space-between; /* 首尾顶格 */ 81 | } 82 | 83 | /* 消除页面白边 */ 84 | body { margin: 0; } 85 | 86 | /* 粘性显示的页脚 */ 87 | footer { 88 | position: sticky; 89 | top: 100vh; 90 | width: 100%; 91 | } 92 | 93 | /* 固定显示的页眉 */ 94 | header { 95 | position: fixed; 96 | top: 0px; 97 | width: 100%; 98 | } 99 | 100 | /* 大背景框 */ 101 | div { 102 | position: absolute; 103 | top: 15px; bottom: 15px; left: 15px; right: 15px; 104 | } 105 | ``` 106 | 107 | ```html 108 | 109 | 真昼まひる 110 | 111 | 112 | 113 | 114 | 115 |   116 | 117 | 118 |
more 119 |

hello

120 |
121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | ``` 131 | 132 | ```js 133 | // 等待页面加载完成 134 | document.addEventListener("DOMContentLoaded", (event) => {} 135 | 136 | // 本站居然运行了x天x小时x分x秒 137 | // 138 | const start = new Date(2021, 11, 4, 0, 0, 0); 139 | function Runtime() { 140 | const now = new Date() 141 | const diff = now - start 142 | const _ss = Math.floor(diff / 1000) 143 | const _mm = Math.floor(_ss / 60) 144 | const _hh = Math.floor(_mm / 60) 145 | const dd = Math.floor(_hh / 24) 146 | const hh = _hh % 24 147 | const mm = _mm % 60 148 | const ss = _ss % 60 149 | document.getElementById('runtime').textContent = `${dd}天${hh}小时${mm}分${ss}秒` 150 | } 151 | setInterval(Runtime, 1000); 152 | Runtime(); 153 | ``` 154 | 155 | ```c 156 | // 冒泡排序 157 | int n[10] = { 25,35,68,79,21,13,98,7,16,62 }; 158 | int i, j, temp; 159 | for (i = 1; i <= 9; i++){ 160 | for (j = 0; j <= 9 - i; j++){ 161 | if (n[j] > n[j + 1]){ 162 | temp = n[j]; 163 | n[j] = n[j + 1]; 164 | n[j + 1] = temp; 165 | } 166 | } 167 | } 168 | 169 | // 不使用中间变量交换两个变量的值 170 | a = a + b; 171 | b = a - b; 172 | a = a - b; 173 | ``` 174 | -------------------------------------------------------------------------------- /documents/debian-pkg.md: -------------------------------------------------------------------------------- 1 | # 如何制作 Debian 系的 deb 软件包 2 | 3 | 以下将制作一个 atri.deb 为例 4 | 5 | 假设当前目录为 rootfs,首先创建一个名为 atri 的文件夹,作为软件包目录 6 | 7 | ## 制作 8 | 9 | 1. 配置文件 10 | 11 | 在 atri 目录内创建 DEBIAN 文件夹,在 DEBIAN 文件夹内创建 control 文件,写入如下基本信息 12 | 13 | ```yml 14 | Package: atri # 软件包名 15 | Version: 1.0 # 版本 16 | Architecture: all # 架构,i386,amd64,all 17 | Description: demo # 软件描述 18 | Maintainer: atri # 维护者 19 | ``` 20 | 21 | 2. 程序文件 22 | 23 | 将程序文件按照规范的文件系统方式放于 atri 目录内 24 | 25 | 创建层级目录 usr/local/bin,在 bin 内创建 atri 文件,写入如下内容,并给予执行权限 26 | 27 | ```sh 28 | #!/usr/bin/env bash 29 | 30 | echo 'hello, this is atri.' 31 | ``` 32 | 33 | 3. 结构总览 34 | 35 | 最终整个目录结构应如下所示 36 | 37 | ``` 38 | rootfs - atri - DEBIAN - control 39 | - usr - local - bin - atri 40 | ``` 41 | 42 | 4. 打包 43 | 44 | 回到 rootfs 目录,输入以下指令打包 45 | 46 | ```sh 47 | dpkg-deb -b atri atri.deb 48 | ``` 49 | 50 | ## 安装测试 51 | 52 | 输入 `dpkg -i atri.deb` 安装,然后输入 `atri` 运行后,应有如下响应 53 | 54 | ``` 55 | hello, this is atri. 56 | ``` 57 | -------------------------------------------------------------------------------- /documents/docker.md: -------------------------------------------------------------------------------- 1 | # Docker 容器引擎 2 | 3 | Docker 是一种将程序与运行所需的其他软件捆绑在一起的技术 4 | 5 | Compose 是用于定义和运行多个容器 Docker 应用程序的工具 6 | 7 | ```sh 8 | docker system df # 查看储存情况 9 | docker compose -f data.yml up # 指定配置文件启动 10 | docker stats # 查看容器占用 11 | docker run --rm -it ID sh # 启动一个临时容器环境 12 | docker cp ID:/file ./file # 从容器中复制文件到宿主机 13 | docker exec -it ID COMMAND # 执行容器内部的命令 14 | docker ps -a # 查看所有的容器及状态 15 | docker compose logs -f # 查看容器日志 16 | docker compose up -d / stop / down / pull # 启动容器 / 停止容器 / 移除容器 / 更新镜像 17 | docker system prune -a # 清理所有不在使用的镜像和容器 18 | docker save ID -o ID.tar # 导出镜像 19 | docker login/logout # 登录 / 登出 dockerhub 账号 20 | docker push ID # 推送镜像到 dockerhub 21 | ``` 22 | 23 | ## 配置 24 | 25 | - 默认网桥 26 | 27 | 地址 172.17.0.1,用于宿主机与容器的网络相互通信 28 | 29 | - 修改 containerd 默认路径 30 | 31 | 默认位于 /opt/containerd 32 | 33 | 1. 输入 `containerd config default > /etc/containerd/config.toml` 生成默认配置文件 34 | 2. 找到 `[plugins."io.containerd.internal.v1.opt"]` 35 | 3. 修改 path 值 36 | 4. 重启 containerd.service 服务 37 | 38 | - 换源 39 | 40 | 由于不可抗力,国内 Docker 镜像源全部停止服务 41 | 42 | ::: details 使用方法 43 | 创建 /etc/docker/daemon.json 文件,并写入如下内容 44 | 45 | ```json 46 | { 47 | "registry-mirrors": [ 48 | "https://hub-mirror.c.163.com" 49 | ] 50 | } 51 | ``` 52 | 53 | 输入 `systemctl daemon-reload` 重新加载配置文件,输入 `systemctl restart docker` 重启 docker 服务 54 | 55 | - 腾讯云内网源 https://mirror.ccs.tencentyun.com 56 | ::: 57 | 58 | - 容器配置文件 compose.yml 59 | 60 | ```yml 61 | services: 62 | NAME: 63 | image: IMAGENAME 64 | restart: unless-stopped # 若容器非手动停止,则自动重启 65 | environment: 66 | - KEY=key # 设置容器内环境变量 KEY 的值为 key 67 | ports: 68 | - 8080:80 # 把主机的 8080 端口映射为容器的 80 端口 69 | # 0.0.0.0:8080:80 监听 ipv4 70 | # :::8080:80 监听 ipv6 71 | # 8080:80/udp 监听 udp 72 | volumes: 73 | - ./data:/data # 把 ./data 映射为容器的 /data 目录 74 | deploy: 75 | resources: 76 | limits: 77 | cpus: '0.70' # 限制 cpu 使用率 70% 78 | memory: 1.5g # 限制内存使用 1.5g 79 | depends_on: 80 | - DEPNAME # 当 DEPNAME 容器启动成功后再启动 81 | DEPNAME: 82 | image: IMAGENAME 83 | ... 84 | ``` 85 | 86 | ## 自制镜像 87 | 88 | 新建镜像目录,创建 rootfs 文件夹,放入需要的文件,在镜像目录创建 Dockerfile 文件 89 | 90 | ```dockerfile 91 | # 基于 alpine 镜像构建内容 92 | FROM alpine AS build 93 | # 定义构建时的环境变量 94 | ARG name=value 95 | # 指定用户 96 | USER 1000 97 | # 定义工作目录 98 | WORKDIR /rootfs 99 | # 将 rootfs 目录复制到镜像中 100 | COPY rootfs . 101 | # 赋予 init 文件执行权限 102 | RUN chmod +x init 103 | # 基于 alpine 镜像发布 104 | FROM alpine 105 | # 将 build 镜像中的 /rootfs 目录复制过来 106 | COPY --from=build /rootfs / 107 | # 挂载的目录,运行时使用,构建时不应存放任何内容 108 | VOLUME ["/c", "/d"] 109 | # 容器启动时执行的命令 110 | ENTRYPOINT ["/init"] 111 | ``` 112 | 113 | 此处容器启动时运行 /init 文件,示例内容 114 | 115 | ```sh 116 | #!/bin/sh 117 | exec /app 118 | ``` 119 | 120 | 也可以直接在 ENTRYPOINT 中填写命令,如果有参数附带使用 `"",` 分隔。例如 `/bin/ls -al /` 为 `ENTRYPOINT ["/bin/ls", "-al", "/"]` 121 | 122 | 输入 `docker build -t ID:TAG .` 构建镜像,代理使用参数 --build-arg http_proxy=172.17.0.1:7890 123 | 124 | > scratch 大小为 0kb 的空白镜像,busybox:glibc 带有基本 shell 和 glibc 的最小镜像 125 | > 容器初始化进程工具推荐 dumb-init,s6-overlay 126 | 127 | - alpine 系统换源 128 | 129 | ```sh 130 | sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 131 | ``` 132 | 133 | - 导出构建的二进制文件 134 | 135 | 利用 docker 的隔离性,可以用来编译文件并导出,以下是一个示例。需要安装 docker-buildx 136 | 137 | ```dockerfile 138 | FROM rust:alpine AS build 139 | WORKDIR /src 140 | COPY < 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ``` 64 | 65 | 封面、封底等纯图片页面,通常由电子书制作工具自动生成具有复杂样式的内容,一般直接写入图片标签即可 66 | 67 | ```xml 68 | 69 | ``` 70 | 71 | 章节正文,内容一般由标题、正文、图片、注释组成 72 | 73 | ```xml 74 | 75 | 76 | 77 | 78 |

第一话

79 |

与天使大人的相遇

80 | 81 | 82 |

...

83 | 84 | 85 | 注: 86 | 87 | 88 | 89 | ``` 90 | 91 | 目录文件 nav.xhtml,应在一个列表中包含每一个文件的链接,通常由电子书制作工具自动生成 92 | 93 | ```xml 94 | 95 | 96 | 97 | 105 | ``` 106 | 107 | 特典部分与正文并无不同,以下是一个简单的起始页,表明从这里开始是特典内容 108 | 109 | ```xml 110 |
111 |

特典小册子

112 |
113 | ``` 114 | 115 | 排版样式文件 style.css 示例如下 116 | 117 | ```css 118 | h2,h3 { text-align: center; } 119 | img { 120 | width: 100%; 121 | height: auto; 122 | max-width: 100%; 123 | max-height: 100%; 124 | } 125 | .center { text-align: center; } 126 | .right { text-align: right; } 127 | small { color: #777777; } 128 | ``` 129 | 130 | 元数据文件 content.opf,较为复杂,通常由电子书制作工具自动生成。metadata 标签内记录电子书描述信息,manifest 标签内记录包含的所有数据文件,spine 标签内记录目录顺序,且应与 nav.xhtml 中记录的目录顺序相同 131 | 132 | ```xml 133 | 134 | 135 | 136 | zh 137 | 书名 138 | 作者 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | ``` 161 | 162 | 如果是电子漫画形式的文件,应在 metadata 中加上如下标签,original-resolution 值需要根据漫画图片的分辨率而自行修改 163 | 164 | ```xml 165 | 166 | 167 | 168 | 169 | 170 | 171 | ``` 172 | 173 | ### 描述文件 174 | 175 | mimetype 176 | 177 | ``` 178 | application/epub+zip 179 | ``` 180 | 181 | container.xml 182 | 183 | ```xml 184 | 185 | 186 | 187 | 188 | 189 | 190 | ``` 191 | 192 | ## 其他内容 193 | 194 | ### Sigil 195 | 196 | EPUB 电子书制作工具 197 | 198 | - Regex 参数替换时,使用 \1 而非 $1 199 | 200 | - 自动执行任务 201 | 202 | 目录文件排版修改,在搜索模板中添加如下内容 203 | 204 | ```xml 205 |
    \n +
  1. \n +(\n +
  2. \n +
\n +\n +
  • \n + 206 | 207 |
  • \1 208 | ``` 209 | 210 | ```xml 211 | id="sigil_toc_id_\d+" 212 | 213 | ``` 214 | 215 | 长按运行自动执行列表,编辑,选择 RunSavedSearchReplaceAll,参数填写 `搜索模板的组名/` 216 | 217 | - 全局替换 218 | 219 | ```xml 220 | <\!.*>\n*\n*\n|.*.*\n|.*\n|.*\n|\n 221 | 222 | ``` 223 | 224 | ```xml 225 | <\?xml version.*"\?>\n 226 | 227 | 228 | ``` 229 | 230 | ### KindleUnpack 231 | 232 | 解包 Amazon / Kindlegen 专有电子书格式的工具 233 | 234 | ### Kindle Comic Converter 235 | 236 | 漫画电子书制作工具 237 | 238 | ### Calibre 239 | 240 | 经典电子书工具 241 | 242 | - 匹配标题正则表达式 243 | 244 | ``` 245 | ^\s*[第卷][0123456789一二三四五六七八九十零〇百千两]*[章回部节集卷].* 246 | ``` 247 | 248 | ### 字体提取 249 | 250 | 为了美化样式,在电子书中会使用各种字体,以下 python 代码可以从完整的字体集中提取仅包含个别文字的字体集,降低文件大小 251 | 252 | ```py 253 | import os 254 | import re 255 | 256 | fonts = """ 257 | 要提取的文字内容 258 | """ 259 | 260 | fonts = ''.join(set(re.sub(r'\s', '', fonts))) 261 | os.system( 262 | f'pyftsubset title.ttf --text={fonts} --output-file=title.min.ttf' 263 | ) 264 | ``` 265 | 266 | ### 字体与界面 267 | 268 | 阅读字体:霞鹜文楷 LXGW WenKai,https://github.com/lxgw/LxgwWenKai 269 | 270 | 白天模式:文字 `#321309` 背景 `#F4E9DE` 271 | 272 | 夜间模式:文字 `#A3A3A3` 背景 `#060606` 273 | -------------------------------------------------------------------------------- /documents/ffmpeg.md: -------------------------------------------------------------------------------- 1 | # FFmpeg 数字媒体处理 2 | 3 | FFmpeg 是一个处理音频和视频的跨平台开源软件 4 | 5 | https://ffmpeg.org 6 | 7 | 每日构建的静态单文件版本 https://github.com/BtbN/FFmpeg-Builds 8 | 9 | - 查看支持信息 10 | 11 | ```sh 12 | ffmpeg -formats # 查看支持的封装容器格式 13 | ffmpeg -codecs # 查看支持的编码格式 14 | ffmpeg -encoders # 查看支持的编码器 15 | 16 | ffmpeg -i a.mp4 # 查看视频的详细信息 17 | ``` 18 | 19 | - GPU 加速编解码器 20 | 21 | 输入 `ffmpeg -codecs | findstr h264` 查看支持的 h264 格式的编解码器,Linux 使用 grep 代替 findstr 22 | 23 | ``` 24 | DEV.LS h264 25 | H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 26 | (decoders: h264 h264_qsv libopenh264 h264_cuvid) 27 | (encoders: libx264 libx264rgb libopenh264 h264_amf h264_mf h264_nvenc h264_qsv h264_vaapi) 28 | ``` 29 | 30 | 可以看到 decoders 后面的就是解码器的名称,encoders 后面的就是编码器的名称 31 | 32 | `h264_qsv` 是 Intel 显卡编解码器,`h264_nvenc` 是 Nvidia 显卡编码器,`h264_cuvid` 是 Nvidia 显卡解码器,`h264_amf` 是 AMD 显卡的编码器 33 | 34 | 示例,将 hevc 格式的 in.mp4 解码,再编码为 h264 格式的 out.mp4,调用 Intel 显卡硬件加速 35 | 36 | ```sh 37 | ffmpeg -c:v hevc_qsv -i in.mp4 -c:v h264_qsv out.mp4 38 | ``` 39 | 40 | - 软件编码器 41 | 42 | H.264/AVC 推荐使用 libx264,H.265/HEVC 推荐使用 libx265,AV1 推荐使用 libsvtav1 43 | 44 | libaom-av1 效果最好但速度很慢,librav1e 速度最快,libsvtav1 兼顾了速度与效率,被作为 AV1 未来开发工作的基础 45 | 46 | - 编码示例 47 | 48 | ```sh 49 | ffmpeg -i a.mp4 -c:v libsvtav1 -crf 18 b.mp4 50 | ``` 51 | 52 | 1. `-i a.mp4` 选择要被处理的视频 53 | 2. `-c:v libsvtav1` 选择 libsvtav1 作为编码器 54 | 3. `-crf 18` 使用 crf 质量级别 18 控制画面质量。18 被认为是视觉无损,默认 23 55 | 4. `b.mp4` 输出的文件名称 56 | 57 | 更多参数说明 58 | 59 | 5. `-c:a copy` 不修改音频编码格式,直接复制原有的音频流 60 | 6. `-c:v copy` 不修改视频编码格式,直接复制原有的视频流 61 | 62 | - 分割视频 63 | 64 | 切割视频片段,将视频从第 30 秒到第 1 小时的画面作为一个新的视频生成。不使用 -t 参数默认是直到视频最后 65 | 66 | ```sh 67 | ffmpeg -ss 00:00:30 -t 01:00:00 -i a.mp4 -c:v copy -c:a copy b.mp4 68 | ``` 69 | 70 | - 合并视频 71 | 72 | 从 list.txt 文件中读取列表,将所有列表中的视频合成新的视频,如下所示 73 | 74 | ``` 75 | file '1.mp4' 76 | file '2.mp4' 77 | ``` 78 | 79 | ```sh 80 | ffmpeg -f concat -i list.txt -c copy all.mp4 81 | ``` 82 | 83 | - 图像处理 84 | 85 | 将图片的分辨率修改为原来的一半 86 | 87 | ```sh 88 | ffmpeg -i 1.jpg -vf "scale=iw/2:ih/2" 2.jpg 89 | ``` 90 | -------------------------------------------------------------------------------- /documents/git.md: -------------------------------------------------------------------------------- 1 | # Git 基本使用指南 2 | 3 | 基本使用 4 | 5 | ```sh 6 | # 撤销某次提交,但不删除记录 7 | git revert 8 | 9 | # 查看本地操作历史 10 | git reflog 11 | 12 | # 查看更改,--staged 查看已暂存的更改,加 commit_id 可与指定版本比较 13 | git diff 14 | 15 | # 设置远程地址 16 | git remote set-url origin URL 17 | 18 | # 添加标签,推送标签 19 | git tag v1.0.0 20 | git push origin v1.0.0 21 | 22 | # 切换到 main 分支,分支不存在则创建 23 | git checkout -b main 24 | 25 | # 删除 pr 分支 26 | git branch -d pr 27 | 28 | # 查看所有分支 29 | git branch -a 30 | 31 | # 清除已不存在于远程服务器上的远程分支 32 | git remote prune origin 33 | 34 | # 查看信息 35 | git status 36 | 37 | # 撤销上一次的 commit 38 | git reset HEAD~1 39 | 40 | # 回退到指定 commit_id 41 | git reset --hard COMMIT_ID 42 | 43 | # 查找历史提交中,文件名有 NAME 的文件 44 | git log --all --full-history -- **/*NAME* 45 | 46 | # 搜索提交记录的 commit_id 47 | git log --grep=内容 48 | 49 | # 查找历史中的文本内容 50 | git log -S "查找的文本内容" -p 51 | ``` 52 | 53 | - 提交到空 git 仓库 54 | 55 | ```sh 56 | git init 57 | git add -A 58 | git commit -m "first commit" 59 | git branch -M main 60 | git remote add origin git@github.com:user/repo.git 61 | git push -u origin main 62 | ``` 63 | 64 | - 修改文件时间 65 | 66 | 将文件的修改时间设置为最新修改时间 67 | 68 | ```sh 69 | git ls-files -z | while read f 70 | do 71 | touch -d $(git log -1 --format=@%ct $f) $f 72 | done 73 | ``` 74 | 75 | 获取所有文件的最初创建时间 76 | 77 | ```sh 78 | git ls-tree -r --name-only HEAD | while read f 79 | do 80 | echo $(git log --format=%ad -- $f | tail -1) $f 81 | done 82 | ``` 83 | 84 | 获取所有文件的最新修改时间 85 | 86 | ```sh 87 | git ls-tree -r --name-only HEAD | while read f 88 | do 89 | echo $(git log -1 --format=%ad -- $f) $f 90 | done 91 | ``` 92 | 93 | - 清空历史提交记录 94 | 95 | 从现有提交创建一个新分支,删除原有分支 96 | 97 | ```sh 98 | git checkout --orphan latest_branch 99 | git add -A 100 | git commit -m "Initial commit" 101 | git branch -d main 102 | git branch -m main 103 | git push -f origin main 104 | ``` 105 | 106 | - 转换 CRLF 和 LF 107 | 108 | ```sh 109 | git config --global core.autocrlf true 110 | ``` 111 | 112 | 解决 Windows 平台与 Linux / Mac OS 的换行符问题 113 | 114 | - 指定 commit 时间 115 | 116 | ```sh 117 | GIT_COMMITTER_DATE="Jan 1 07:02:01 2024 +0000" git commit --date="Jan 1 07:02:01 2024 +0000" -m "Initial commit" 118 | ``` 119 | 120 | 如果要修改 GitHub 上的时间,需要加上环境变量 121 | 122 | - 配置用户信息 123 | 124 | ```sh 125 | git config user.name "atri" 126 | git config user.email "atri" 127 | ``` 128 | 129 | 加上 --global 参数为全局配置 130 | 131 | - SSH 连接 GitHub 132 | 133 | 打开 GitHub,Settings,SSH and GPG keys,SSH keys,New SSH key,选择 Authentication Keys 项,填入公钥内容 134 | 135 | ```sh 136 | ssh -T git@github.com 137 | > Hi USERNAME! You've successfully authenticated, but GitHub does not 138 | > provide shell access. 139 | ``` 140 | 141 | - SSH 签名提交 142 | 143 | 使用 SSH 密钥签名,signingkey 后面为公钥路径 144 | 145 | ```sh 146 | git config --global gpg.format ssh 147 | git config --global user.signingkey /path/.ssh/key.pub 148 | ``` 149 | 150 | 配置 commit 和 tag 自动签名 151 | 152 | ```sh 153 | git config --global commit.gpgsign true 154 | 155 | # tag 签名后,无法再使用轻标签,必须写注释 156 | git config --global tag.gpgsign true 157 | ``` 158 | 159 | 在 GitHub 设置中添加 SSH key,选择 Signing key 项,填入公钥内容 160 | 161 | - 自建 Git 仓库 162 | 163 | 开源的 Git 服务器工具也有许多,例如 GitLab、Gitea、Gogs,但自己配置起来较为困难,如果只是想保存代码,可以直接使用 git 搭配 ssh 实现 164 | 165 | 假定服务器 IP 地址 192.168.1.2,服务器用户 root,代码仓库名称 atri,代码仓库的分支名称 main 166 | 167 | 1. 连接服务器 168 | 169 | 生成密钥,输入如下命令,然后按三次回车 170 | 171 | ```sh 172 | ssh-keygen -t ed25519 173 | ``` 174 | 175 | Linux 默认生成的位置是 `~/.ssh`,Windows 是在 `%HOMEPATH%\.ssh` 176 | 177 | 该目录下会生成私钥文件 id_ed25519 和公钥文件 id_ed25519.pub,将公钥的内容写入到服务器 ~/.ssh/ 目录下的 authorized_keys 文件中 178 | 179 | 2. 创建远程仓库 180 | 181 | 在服务器创建没有工作空间的裸库,如果希望有具体项目文件,则去掉 --bare 参数 182 | 183 | ```sh 184 | ssh root@192.168.1.2 git init --bare atri.git 185 | ``` 186 | 187 | 3. 提交代码到服务器 188 | 189 | 添加远程仓库的地址,并起别名为 vps 190 | 191 | ```sh 192 | git remote add vps root@192.168.1.2:atri.git 193 | ``` 194 | 195 | 将本地的 main 分支推送过去 196 | 197 | ```sh 198 | git push vps main 199 | ``` 200 | -------------------------------------------------------------------------------- /documents/gs3101-bridge.md: -------------------------------------------------------------------------------- 1 | # 移动光猫 GS3101 改桥接,用路由器拨号 2 | 3 | 后台管理地址可以在光猫和路由器的背面标签上查看。光猫后台地址一般为 192.168.1.1,路由器后台地址一般为 192.168.0.1 4 | 5 | ## 光猫 6 | 7 | ### 1. 获取管理员密码 8 | 9 | 使用无线网或者网线连接光猫,打开浏览器,进入光猫后台,输入光猫背面标签上的用户名和密码,登陆成功后,打开 `192.168.1.1/cgi-bin/getGateWay.cgi`,此时应看到如下内容 10 | 11 | ``` 12 | Family GateWay 13 | Yes 14 | ``` 15 | 16 | 如果第二行显示的是 No,请确保仍然处于登陆状态,然后刷新页面 17 | 18 | 命令行输入 `telnet 192.168.1.1`,tc login 填 `admin`,password 填 `s2@We3%Dc`,登陆成功。继续输入 `cat /tmp/ctromfile.cfg | grep 'user'` 即可看到所有的用户和密码,用户名为 `CMCCAdmin` 的就是管理员 19 | 20 | ### 2. 获取拨号上网的账号和密码 21 | 22 | 仍然使用 `telnet 192.168.1.1` 命令登陆,输入 `cat /tmp/ctromfile.cfg | grep 'PPManualStatus='` 即可看到拨号上网的账号和密码 23 | 24 | ### 3. 改桥接 25 | 26 | 1. 连接名称选择 INTERNET_R_VID 27 | 2. 模式选择 Bridge 28 | 3. 承载业务选择 INTERNET 29 | 4. 勾选相应的 LAN 口,也就是路由器 WAN 所连接的光猫的 LAN 的网口 30 | 5. 桥类型选择 PPPoE_Bridged 31 | 32 | ## 路由器 33 | 34 | 打开 WAN 口设置,上网方式选择宽带拨号上网,输入相应的宽带账号和密码,MTU 使用默认值 35 | 36 | - Wi-Fi 协议说明 37 | 38 | ||Wi-Fi 0/1/2/3|Wi-Fi 4|Wi-Fi 5|Wi-Fi 6| 39 | |-|-|-|-|-| 40 | |协议|802.11/b/a/g|802.11n|802.11ac|802.11ax| 41 | |频段|-|2.4/5GHz|5GHz|2.4/5GHz| 42 | 43 | ## 常见问题 44 | 45 | - 宽带拨号上网,提示帐号或密码错误 46 | 47 | 在确定帐号密码正确的情况下,使用路由器 PPPoE 拨号时,可能会提示帐号或密码错误,可以尝试以下解决方法 48 | 49 | 1. 使用特殊拨号模式 50 | 2. 在路由器 MAC 地址设置中选择克隆 MAC 地址 51 | 52 | - 改桥接后,路由器上网的设备无法访问光猫 53 | 54 | 1. 用网线连接光猫 55 | 2. 如果光猫还在发射 WiFi 信号,连接光猫的 WiFi 56 | 3. 如果光猫的 DHCP 服务没有关闭,把路由器 WAN 临时改回 DHCP 57 | -------------------------------------------------------------------------------- /documents/http-server.md: -------------------------------------------------------------------------------- 1 | # Web HTTP 服务器 2 | 3 | ## Caddy 4 | 5 | Caddy 是一个强大的,开源的,使用 Go 编写的自动配置 HTTPS 的 Web 服务器 6 | 7 | https://caddyserver.com 8 | 9 | - 配置 10 | 11 | 配置文件为 /etc/caddy/Caddyfile,自定义的额外配置文件放在 /etc/caddy/conf.d/ 目录下,文件名随意,数据目录 /var/lib/caddy 12 | 13 | - 开启 gzip 14 | 15 | ```nginx 16 | example.com { 17 | encode gzip 18 | } 19 | ``` 20 | 21 | - 只接受特定目录的请求 22 | 23 | ```nginx 24 | example.com { 25 | route { 26 | reverse_proxy /test/* 127.0.0.1:8080 27 | 28 | handle /* { 29 | abort 30 | } 31 | } 32 | } 33 | ``` 34 | 35 | - 自定义回应状态码 36 | 37 | respond 404 或 error 404 38 | 39 | - 代理到域名子目录 40 | 41 | ```nginx 42 | example.com { 43 | handle /test/* { 44 | reverse_proxy localhost:8080 45 | } 46 | } 47 | ``` 48 | 49 | - 禁用 SSL 仅 HTTP 50 | 51 | ```nginx 52 | http://example.com { 53 | ... 54 | } 55 | ``` 56 | 57 | - 重定向跳转 58 | 59 | permanent 为永久重定向参数 60 | 61 | ```nginx 62 | example1.com { 63 | redir https://example2.com{uri} permanent 64 | } 65 | ``` 66 | 67 | - 同网站启用多个域名 68 | 69 | ```nginx 70 | example1.com, example2.com { 71 | ... 72 | } 73 | ``` 74 | 75 | - 反向代理 76 | 77 | ```nginx 78 | example.com { 79 | reverse_proxy 127.0.0.1:8080 80 | } 81 | ``` 82 | 83 | - 静态文件服务 84 | 85 | file_server 后面加上 browse 参数开启文件目录功能 86 | 87 | ```nginx 88 | example.com { 89 | root /srv/http 90 | file_server 91 | } 92 | ``` 93 | 94 | ## Nginx 95 | 96 | Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器 97 | 98 | https://nginx.org 99 | 100 | Nginx Proxy Manager 是一个 Nginx 可视化的反向代理管理系统,以下在用到时会简称为 NPM 101 | 102 | https://nginxproxymanager.com 103 | 104 | - 开启强制 HTTPS 105 | 106 | ```nginx 107 | server { 108 | listen 80; 109 | server_name example.com; 110 | return 301 https://$server_name$request_uri; 111 | } 112 | 113 | server { 114 | listen 443 ssl; 115 | server_name example.com; 116 | 117 | ... 118 | } 119 | ``` 120 | 121 | - 部署静态文件 122 | 123 | NPM 中添加一个代理,Forward Hostname / IP 填 `127.0.0.1`,Forward Port 填 `80`,在 Advanced 列添加以下内容,`/data/www` 即为映射到容器中的静态文件的目录 124 | 125 | ```nginx 126 | location / { 127 | root /data/www; 128 | } 129 | ``` 130 | 131 | - 关闭 ip 访问 132 | 133 | 添加以下 server 配置 134 | 135 | ```nginx 136 | server { 137 | listen 80; 138 | server_name _; 139 | return 444; 140 | } 141 | ``` 142 | 143 | - 反向代理 144 | 145 | 添加以下 server 示例 146 | 147 | ```nginx 148 | server { 149 | set $forward_scheme http; 150 | set $server 127.0.0.1; 151 | set $port 8080; 152 | 153 | listen 80; 154 | server_name example.com; 155 | 156 | location / { 157 | add_header X-Served-By $host; 158 | proxy_set_header Host $host; 159 | proxy_set_header X-Forwarded-Scheme $scheme; 160 | proxy_set_header X-Forwarded-Proto $scheme; 161 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 162 | proxy_set_header X-Real-IP $remote_addr; 163 | proxy_pass $forward_scheme://$server:$port$request_uri; 164 | } 165 | } 166 | ``` 167 | 168 | - 实现 HTTPS 正向代理 169 | 170 | 需要添加 ngx_http_proxy_connect_module 模块,以及 http_stub_status_module 和 http_ssl_module 模块 171 | 172 | 1. 前者安装方式详见 [ngx_http_proxy_connect_module#install](https://github.com/chobits/ngx_http_proxy_connect_module#install) 173 | 2. 后者在编译时添加参数 `--with-http_stub_status_module --with-http_ssl_module` 174 | 175 | 添加以下 server 配置 176 | 177 | ```nginx 178 | server { 179 | listen 8080; 180 | server_name 0.0.0.0; 181 | 182 | resolver 8.8.8.8; 183 | 184 | proxy_connect; 185 | proxy_connect_allow 443 80; 186 | proxy_connect_connect_timeout 10s; 187 | proxy_connect_data_timeout 10s; 188 | 189 | location / { 190 | proxy_pass http://$host; 191 | proxy_set_header Host $host; 192 | } 193 | } 194 | ``` 195 | 196 | - localhost 无法访问 197 | 198 | 将 server_name 改为 `0.0.0.0` 将监听所有可用的网络接口,即可以从本地网络中的其他计算机访问该服务 199 | 200 | - 实现站点伪静态 201 | 202 | 在 server 中添加如下信息 203 | 204 | ```nginx 205 | location / { 206 | try_files $uri $uri/ /index.php?$args; 207 | } 208 | ``` 209 | 210 | ## SSH 211 | 212 | - SSH connect 213 | 214 | 默认使用 22 端口进行通信,连接时会读取配置文件 ~/.ssh/config 215 | 216 | ``` 217 | Host github.com 218 | HostName github.com 219 | User git 220 | IdentityFile ~/.ssh/id_ed25519 221 | 222 | Host vps1 223 | HostName IP 224 | User root 225 | Port 22 226 | IdentityFile ~/.ssh/vps1-key 227 | ``` 228 | 229 | 上述记录声明在使用 ssh 连接 Host 记录的名称时,将其解析为 HostName 记录的值,登入的用户名为 User 记录的值,连接的端口为 Port 记录的值,使用的私钥文件为 IdentityFile 记录的值 230 | 231 | - ssh 通道传输文件 232 | 233 | ```sh 234 | scp -r /a user@host:/a 235 | ``` 236 | 237 | - 指定密钥登入服务器 238 | 239 | ```sh 240 | # -p 指定端口号 241 | ssh -i ~/.ssh/id_key user@host 242 | ``` 243 | 244 | - 生成 ed25519 加密的 ssh 密钥 245 | 246 | ```sh 247 | # -C 添加注释信息 248 | ssh-keygen -t ed25519 249 | ``` 250 | 251 | - 从指定私钥生成公钥 252 | 253 | ```sh 254 | ssh-keygen -y -f key > key.pub 255 | ``` 256 | 257 | - 将公钥上传到服务器 258 | 259 | ```sh 260 | ssh-copy-id -i SSHKEY USER@IP 261 | ``` 262 | 263 | ## 其他 264 | 265 | - HTTP content-type 266 | 267 | 1. application/octet-stream 二进制流数据 268 | 2. text/plain 纯文本格式 269 | 3. multipart/form-data 表单上传文件时使用 270 | 271 | - 网站防盗链 272 | 273 | 为请求头 Content-Type 添加 Referer 字段,值为请求的网站地址 274 | 275 | - 解决网页不允许粘贴 276 | 277 | 1. 开发者模式 278 | 2. 右上角的设置,左侧偏好设置,找到调试程序 279 | 3. 勾选停用 JavaScript 280 | -------------------------------------------------------------------------------- /documents/index.md: -------------------------------------------------------------------------------- 1 | # 写在前面 2 | 3 | 本站使用 NodeJS 项目 [VuePress](https://v2.vuepress.vuejs.org) 在 GitHub Action 中构建,并推送到 [Vercel](https://vercel.com) 作站点托管 4 | 5 | 本站域名由 [EU.org](https://nic.eu.org) 提供,使用 [Cloudflare](https://www.cloudflare.com) 作 DNS 解析 6 | 7 | 本站使用的插件: 8 | 9 | - @vuepress/plugin-prismjs@next 10 | 11 | 未经特殊说明,本站作品均采用 [知识共享署名 4.0 国际许可协议](https://creativecommons.org/licenses/by/4.0) 进行许可 12 | 13 | 本站源代码采用 [MIT 许可证](https://github.com/nibazshab/docs/blob/main/LICENSE) 进行许可 14 | 15 | 如果对本站感觉良好,还望在 [GitHub 仓库](https://github.com/nibazshab/docs) 给小站点个 Star 16 | 17 | 感谢各位 :heart: 18 | 19 | 声明:本站中出现的任何信息,均仅供参考,不对有可能出现的任何问题、错误或损坏进行担保 20 | 21 | 复现本站点: 22 | 23 | 1. 安装 Node.js 以及 pnpm 24 | 2. 运行以下指令 25 | 26 | ```sh 27 | git clone https://github.com/nibazshab/docs.git 28 | cd docs/src 29 | chmod +x env.sh && ./env.sh 30 | pnpm dev 31 | ``` 32 | -------------------------------------------------------------------------------- /documents/linux-help.md: -------------------------------------------------------------------------------- 1 | # Linux 常见问题 2 | 3 | 测试于 Arch Linux,不确保适用所有系统 4 | 5 | ## 终端篇 6 | 7 | ### crontab 定时任务 8 | 9 | 在 /var/spool/cron/crontabs/root 中写入任务,运行 `crond` 命令启动 10 | 11 | 定时规则如下所示,例如 `0 3,15 * * * sh /a.sh` 表示每天 3 点和 15 点,执行 `sh /a.sh` 命令 12 | 13 | ``` 14 | * * * * * 15 | - - - - - 16 | | | | | | 17 | | | | | +----- day of week (0 - 7) (Sunday=0 or 7) 18 | | | | +---------- month (1 - 12) 19 | | | +--------------- day of month (1 - 31) 20 | | +-------------------- hour (0 - 23) 21 | +------------------------- minute (0 - 59) 22 | ``` 23 | 24 | ### 恢复误删文件,进程还在运行 25 | 26 | 查看该进程的 pid 号,假设为 721,进入 /proc/721/fd 目录,输入 `ls -l` 查看数字文件对应的硬链接文件名,假设查看有如下信息 27 | 28 | ``` 29 | Aug 1 09:48 10 -> /data/db.sqlite3 (deleted) 30 | Aug 1 09:48 11 -> /data/db.sqlite3 (deleted) 31 | ``` 32 | 33 | 选择时间靠后或数字编号更大的文件,此处输入 `cp 11 /bak/db.sqlite3` 即可 34 | 35 | ### PUTTY 控制台的 ls 命令没有颜色 36 | 37 | 由于 PUTTY 的连接可能导致控制台彩色显示失效,可以尝试使用 `ls --color=auto` 来重新定义 LS_COLORS 环境变量等 38 | 39 | [更多](https://wiki.archlinux.org/title/Color_output_in_console#ls) 40 | 41 | ### Possibly missing firmware for module XXXX 42 | 43 | 当内核更新后,镜像 initramfs 被重新构建时,你可能得到以下警告 44 | 45 | ``` 46 | ==> WARNING: Possibly missing firmware for module: xhci_pci 47 | ==> WARNING: Possibly missing firmware for module: aic94xx 48 | ==> WARNING: Possibly missing firmware for module: bfa 49 | ``` 50 | 51 | 如果在生成默认 initramfs 镜像时出现这些或类似的消息,如警告所述,可能需要安装其他固件。大多数常见的固件文件可以通过安装 `linux-firmware` 来获取。对于其他的固件软件包,可以尝试在软件包仓库中搜索固件模块的名字获取。聚合包 `mkinitcpio-firmware` 包括绝大部分的固件,或者手动安装所需的固件包 52 | 53 | 如果消息仅在生成 fallback initramfs 镜像时出现,可以禁止 fallback 镜像的生成,在 `/etc/mkinitcpio.d` 目录下的 preset 文件中,将 PRESETS= 里的 fallback 移除,重新生成系统引导 54 | 55 | [更多](https://wiki.archlinux.org/title/Mkinitcpio#Possibly_missing_firmware_for_module_XXXX) 56 | 57 | ## 桌面篇 58 | 59 | ### 快捷键切换 TTY 环境 60 | 61 | `Ctrl`+`Alt`+`Fn` 62 | 63 | ### GNOME 主题修改,顶栏半透明 64 | 65 | GNOME Shell 主题被存储为二进制文件 `/usr/share/gnome-shell/gnome-shell-theme.gresource`,运行 extractgst.sh 拆包脚本,在 `$HOME` 目录得到主题配置文件 66 | 67 | extractgst.sh 68 | 69 | ```sh 70 | #!/bin/sh 71 | gst=/usr/share/gnome-shell/gnome-shell-theme.gresource 72 | workdir=$HOME 73 | for r in `gresource list $gst`; do 74 | r=${r#\/org\/gnome\/shell/} 75 | if [ ! -d $workdir/${r%/*} ]; then 76 | mkdir -p $workdir/${r%/*} 77 | fi 78 | done 79 | for r in `gresource list $gst`; do 80 | gresource extract $gst $r >$workdir/${r#\/org\/gnome\/shell/} 81 | done 82 | ``` 83 | 84 | 将主题配置文件 gnome-shell.css 中的 #panel 模块里的 background-color 的值修改为 `rgba(0,0,0,0.6)` 85 | 86 | 输入 `glib-compile-resources gnome-shell-theme.gresource.xml` 指令按照 gnome-shell-theme.gresource.xml 打包配置文件,将主题重新打包成二进制文件,替换原来的主题,重启 GNOME Shell 87 | 88 | gnome-shell-theme.gresource.xml 89 | 90 | ```xml 91 | 92 | 93 | 94 | calendar-today.svg 95 | calendar-today-light.svg 96 | checkbox.svg 97 | checkbox-focused.svg 98 | checkbox-off-focused-light.svg 99 | checkbox-off-focused.svg 100 | checkbox-off-light.svg 101 | checkbox-off.svg 102 | gnome-shell.css 103 | gnome-shell-high-contrast.css 104 | gnome-shell-start.svg 105 | pad-osd.css 106 | process-working.svg 107 | toggle-off.svg 108 | toggle-off-hc.svg 109 | toggle-off-light.svg 110 | toggle-on.svg 111 | toggle-on-hc.svg 112 | toggle-on-light.svg 113 | workspace-placeholder.svg 114 | 115 | 116 | ``` 117 | 118 | [更多](https://wiki.archlinux.org/title/GDM#Configuration) 119 | 120 | ### 开启内核级显示模式设置 121 | 122 | KMS 通常是在 initramfs stage 之后开始初始化,但是也可以在 initramfs 的阶段启用 123 | 124 | 将视频驱动模块加入 `/etc/mkinitcpio.conf` 的 MODULES= 里,使用 `mkinitcpio -P` 指令重新生成内核 125 | 126 | - AMD GPU 加入 `amdgpu`,老的 ATI 驱动加入 `radeon` 127 | - Intel GPU 加入 `i915` 128 | - NVIDIA 驱动的 `nvidia nvidia_modeset nvidia_uvm nvidia_drm`,详见 [NVIDIA#DRM kernel mode setting](https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting) 129 | 130 | 为了避免更新 NVIDIA 驱动之后忘了更新 initramfs,建议使用 Pacman Hooks 自动生成新内核,将以下内容添加到 `/etc/pacman.d/hooks/nvidia.hook` 131 | 132 | ```ini 133 | [Trigger] 134 | Operation=Install 135 | Operation=Upgrade 136 | Operation=Remove 137 | Type=Package 138 | 139 | Target=nvidia 140 | Target=linux 141 | 142 | [Action] 143 | Description=Updating NVIDIA module in initcpio 144 | Depends=mkinitcpio 145 | When=PostTransaction 146 | NeedsTargets 147 | Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P' 148 | ``` 149 | 150 | [更多](https://wiki.archlinux.org/title/Kernel_mode_setting#Early_KMS_start) 151 | 152 | ### GDM 以 x11 运行在 NVIDIA GPU 153 | 154 | 创建一个符号链接来强制使用 wayland 运行桌面环境 `ln -s /dev/null /etc/udev/rules.d/61-gdm.rules` 155 | 156 | [更多](https://wiki.archlinux.org/title/GDM#Wayland_and_the_proprietary_NVIDIA_driver) 157 | 158 | ### 桌面环境挂起后无法唤醒 159 | 160 | 为触摸板加载了 intel_lpss_pci 模块的 Intel CPU 的电脑,在休眠后可能会出现黑屏无法唤醒的情况 161 | 162 | 将 `intel_lpss_pci` 添加到 `/etc/mkinitcpio.conf` 的 MODULES= 里,使用 `mkinitcpio -P` 指令重新生成内核 163 | -------------------------------------------------------------------------------- /documents/minecraft.md: -------------------------------------------------------------------------------- 1 | # 我的世界 Minecraft 2 | 3 | Minecraft 是一个关于破坏和放置方块的游戏 4 | 5 | > 本文不适用于网易版我的世界 6 | 7 | ## 服务端 8 | 9 | - Java 版服务器搭建 10 | 11 | 使用 docker 镜像 itzg/minecraft-server 作服务器运行环境,默认会自动下载最新的官方纯净版运行核心并启动,支持指定版本号,以及手动下载的第三方 jar 包运行核心 12 | 13 | https://docker-minecraft-server.readthedocs.io 14 | 15 | 输入 `docker exec -i 容器名 rcon-cli` 即可进入服务器控制台 16 | 17 | > 第三方运行核心推荐 Mohist 18 | 19 | - 隐藏服务器端口 20 | 21 | 通过 DNS 解析中的 SRV 功能,实现不需要端口连接我的世界服务器 22 | 23 | 添加一个 DNS 解析,主机记录写 `_minecraft._tcp.mc`,记录类型为 `SRV`,记录值为 `5 0 25565 域名` 24 | 25 | 命令行输入 `nslookup -q=srv _minecraft._tcp.mc.域名` 查看上述 SRV 解析是否成功 26 | 27 | 进入 mc 游戏后添加服务器,服务器地址填 `mc.域名` 即可 28 | 29 | - 控制台指令记录 30 | 31 | ``` 32 | gamemode MODE,切换游戏模式 33 | time set 0,设置时间为日出 34 | gamerule doDaylightCycle false,关闭时间流逝 35 | fill x y z x y z 方块,填充区域 36 | fill x y z x y z 草方块 replace 泥土,用草方块替换区域内的泥土 37 | ``` 38 | 39 | 服务器管理指令 40 | 41 | ``` 42 | op NAME,将玩家提升为管理员 43 | deop NAME,将管理员降级为玩家 44 | whitelist add ID,添加白名单 45 | ``` 46 | 47 | ## 客户端推荐 48 | 49 | - PCL 2 50 | -------------------------------------------------------------------------------- /documents/peach.md: -------------------------------------------------------------------------------- 1 | # 世外桃源 2 | 3 | ## 订阅 4 | 5 | - 腾讯云上海服务器,2025/9/25 6 | - icu 域名,2025/9/26,腾讯云 7 | - eu.org 域名 8 | - dpdns.org 域名,2026/6/14 9 | - 电信卡流量包,2025/8/31 10 | 11 | ## 购物 12 | 13 | Bing:积分兑换礼物 14 | 15 | 猫:客服小蜜 - 猫超卡补卡 - 自助补卡 - 联系在线客服 - 猫超卡过期 - 提交补卡申请 16 | 17 | 狗:客户服务 - 价格保护 - 一键价保 18 | 19 | 产品|渠道|购买日期|保修月限|状态 20 | -|-|-|-|- 21 | Apple 电脑 Mac mini M4|京东|2025/3|12/24|✓ 22 | 盖世小鸡手柄 启明星|抖音|2024/7|12|✓ 23 | 酷态科充电宝 PB100|京东|2024/4|18|✓ 24 | 真我手机 Neo5 SE|京东|2023/6|12|✓ 25 | 雷鸟电视 鹏 7Pro|京东|2023/6|12/36|✓ 26 | TL 摄像头 IPC44AW|京东|2023/6|12|✓ 27 | 罗技鼠标 G304|京东|2023/6|24|✓ 28 | Apple 手机 iPhone 13mini|天猫|2022/6|12|✓ 29 | 联想平板 小新 Pad 2020|淘特|2022/5|12|✓ 30 | SoundPEATS 耳机 Air3|京东|2021/9|12|✓ 31 | 贱驴鼠标 2003B|京东|2021/8|6|✓ 32 | 爱国者硬盘 SSD P2000|京东|2021/8|60|✓ 33 | 米家台灯 1S|京东|2021/8|12|✓ 34 | iKBC 键盘 C87|京东|2021/6|12|✓ 35 | Xbox 手柄 pdp PowerA|淘宝|2021/2|3|✗ 36 | 英菲克耳机 i12|一淘|2020/9|12|✗ 37 | Kindle 电子书 X|咪咕阅读|2020/8|12|✗ 38 | 米家电扇 1X|苏宁|2020/7|48+24|✓ 39 | 罗技鼠标 G102|京东|2020/7|24|✗ 40 | 荣耀电视 智慧屏 X1|京东|2020/7|12+12|✓ 41 | 米家台灯 1S|京东|2020/7|12|✓ 42 | 漫步者耳机 TWS1|京东|2020/6|12|丢失 43 | Apple 手机 iPhone XR|京东|2020/5|12|✓ 44 | 水星路由器 D191G|京东|2020/4|12|✓ 45 | 神舟电脑 战神 Z7-CT5NA|淘宝|2020/3|24/12|✓ 46 | SLC 优盘 IS903|淘宝|2019/1|12|✓ 47 | 紫米充电宝 APB01|天猫|2018/11|12|✗ 48 | 先锋相机 SL1624A|苏宁|2018/9|12|✗ 49 | OPPO 手机 A3|专卖店|2018/8|12|✗ 50 | 华为手机 P10|苏宁|2018/7|12|✗ 51 | 环格 MP3 HR330|淘宝|2018/7|12|✗ 52 | 吉莱克储存卡|淘宝|2018/5|24|✗ 53 | 荣耀手机 畅玩 6|苏宁|2018/5|12|✗ 54 | -|-|-|-|- 55 | 苏泊尔电压力锅 SY-60YC8010EQ|京东|2024/1|12|厨房 56 | 域能吊灯|京东|2023/6|24|客厅 57 | 美的吸顶灯|京东|2023/6|60|次卧 58 | 美的吸顶灯|京东|2023/6|60|主卧 59 | TCL 吊灯|京东|2022/1|36|客厅 60 | 全品屋椅子|京东|2021/9|36|✗ 61 | 米家电水壶 1A|京东|2021/6|12|厨房 62 | -|-|-|-|- 63 | 首信平板 SF101 64 | 凤凰山地自行车 65 | 科诺平板 GB960 66 | VIVO 手机 Y927 67 | VIVO 手机 V3MAXA 68 | 酷派手机 69 | 三星手机 70 | 中兴手机 71 | 海信手机 72 | -------------------------------------------------------------------------------- /documents/python.md: -------------------------------------------------------------------------------- 1 | # Python 2 | 3 | 整理文件夹 4 | 5 | ```py 6 | import os 7 | import shutil 8 | 9 | # 进入 ev 目录 10 | os.chdir("ev") 11 | 12 | # 遍历子目录,移动所有 png 文件到当前目录 13 | for root, dirs, files in os.walk('.'): 14 | for file in files: 15 | if file.lower().endswith('.png'): 16 | src_path = os.path.join(root, file) 17 | dest_path = os.path.join(os.getcwd(), file) 18 | 19 | # 处理文件名冲突 20 | if os.path.exists(dest_path): 21 | base, ext = os.path.splitext(file) 22 | counter = 1 23 | while True: 24 | new_name = f"{base}_{counter}{ext}" 25 | new_dest = os.path.join(os.getcwd(), new_name) 26 | if not os.path.exists(new_dest): 27 | dest_path = new_dest 28 | break 29 | counter += 1 30 | shutil.move(src_path, dest_path) 31 | ``` 32 | 33 | 备份数据库并上传 webdav 34 | 35 | ```py 36 | import datetime 37 | import subprocess 38 | import requests 39 | import gzip 40 | import os 41 | 42 | def set_file_name(name): 43 | global file_name 44 | file_name = f"{name}.{time}.sql" 45 | 46 | def backup_sql(host, user, password, database): 47 | cmd = f"mysqldump -h {host} -u {user} -p'{password}' {database} --no-tablespaces > {file_path}{file_name}" 48 | try: 49 | subprocess.run(cmd, shell=True, check=True) 50 | print("备份成功") 51 | except subprocess.CalledProcessError as e: 52 | print(f"备份失败:{e}") 53 | 54 | def compress_file(): 55 | gzip_file_name = f"{file_name}.gz" 56 | with open(f"{file_path}{file_name}", 'rb') as f_in: 57 | with gzip.open(f"{file_path}{gzip_file_name}", 'wb') as f_out: 58 | f_out.writelines(f_in) 59 | print(f"文件已压缩为 {gzip_file_name}") 60 | return gzip_file_name 61 | 62 | def upload(gzip_file_name): 63 | webdav_url = f"https://webdav/sql/{gzip_file_name}" 64 | with open(f"{file_path}{gzip_file_name}", "rb") as f: 65 | file_data = f.read() 66 | response = requests.put( 67 | webdav_url, 68 | data=file_data, 69 | headers={"Content-Type": "application/octet-stream"}, 70 | auth=("user", "123456"), 71 | ) 72 | if response.status_code == 201 or response.status_code == 204: 73 | print("上传成功") 74 | else: 75 | print(f"上传失败,状态码: {response.status_code}") 76 | print(response.text) 77 | 78 | time = datetime.datetime.now().strftime("%Y-%m-%d") 79 | file_path = "/home/" 80 | 81 | set_file_name("c1") 82 | backup_sql("mysql.c1", "root", "123456", "c1") 83 | gzip_file_name = compress_file() 84 | upload(gzip_file_name) 85 | ``` 86 | 87 | 爬取小说网站的网页 html 内容 88 | 89 | ```py 90 | import requests 91 | from bs4 import BeautifulSoup 92 | from urllib.parse import urljoin 93 | 94 | headers = { 95 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 96 | } 97 | 98 | url = "https://www.ql" 99 | 100 | ida = 1 101 | while ida < 5: 102 | print(f"当前页:{url}") 103 | response = requests.get(url, headers=headers) 104 | 105 | if response.status_code == 200: 106 | html_content = response.content 107 | soup = BeautifulSoup(html_content, 'html.parser') 108 | 109 | title = soup.find('h1').text.strip() # 处理标题去掉多余的空格 110 | 111 | # 提取内容中的每个

    标签,保留段落关系 112 | paragraphs = soup.find('div', {'id': 'content'}).find_all('p') 113 | content = "\n\n".join([para.text.strip() for para in paragraphs if para.text.strip()]) 114 | 115 | # 查找下一页链接 116 | next_page_tag = soup.find('p', {'id': 'page_next'}).find('a') 117 | if next_page_tag and next_page_tag.has_attr('href'): 118 | next_page_url = next_page_tag['href'] 119 | next_page_url = urljoin(url, next_page_url) 120 | else: 121 | print("没有找到下一页链接") 122 | next_page_url = None 123 | 124 | # 保存当前页内容 125 | file = f"dist/a{ida}.txt" 126 | with open(file, 'w', encoding='utf-8') as f: 127 | f.write(f"标题:{title}\n\n{content}") 128 | print(f"标题:{title}\n已写入:{file}\n下一页:{next_page_url}\n") 129 | 130 | # 如果没有下一页链接,停止爬取 131 | if not next_page_url: 132 | break 133 | 134 | # 更新url为下一页 135 | url = next_page_url 136 | ida += 1 137 | else: 138 | print("请求失败\n") 139 | break 140 | ``` 141 | 142 | 将首行(标题)相同的文件合并为一个文件 143 | 144 | ```py 145 | import os 146 | i = 0 147 | ida = 1 148 | while (ida < 400): 149 | file = f"dist/a{ida}.txt" 150 | with open(file, 'r') as f: 151 | head2 = f.readline() 152 | if head1==head2: 153 | join = f"join/b{i}.txt" 154 | print(f"{file}:合并 {join}") 155 | with open(join, 'a+') as outfile: 156 | outfile.write(f.read()) 157 | else: 158 | i+=1 159 | join = f"join/b{i}.txt" 160 | print(f"{file}:保存至 {join}") 161 | head1=head2 162 | with open(join, 'a+') as outfile: 163 | outfile.write(head2) 164 | outfile.write(f.read()) 165 | ida += 1 166 | ``` 167 | 168 | 响应 curl -X POST -d "key=$SECRET&link=$LINK",key 作为认证参数,link 作为接受到的文本信息参数 169 | 170 | ```py 171 | from flask import Flask, request 172 | import os 173 | app = Flask(__name__) 174 | @app.route('/', methods=['POST']) 175 | def handle_post(): 176 | key = request.form.get('key') 177 | link = request.form.get('link') 178 | 179 | if key == 'SECRET': 180 | command = f'echo The Link is: {link}' 181 | os.system(command) 182 | return f'Link: {link}' 183 | else: 184 | return 'Invalid key' 185 | 186 | if __name__ == '__main__': 187 | app.run(host='0.0.0.0', port=8080) 188 | ``` 189 | 190 | smtp 发送邮件 191 | 192 | ```py 193 | import smtplib 194 | 195 | # 设置邮件发送服务器 196 | smtp_server = '' 197 | smtp_port = 198 | 199 | # 创建SMTP会话 200 | smtp = smtplib.SMTP(smtp_server, smtp_port) 201 | smtp.login('', '') 202 | 203 | # 设置发件人和收件人邮箱地址 204 | sender_email = '' 205 | receiver_email = '' 206 | 207 | # 构造邮件内容 208 | subject = 'Hello from Python' 209 | body = 'This is a test email sent using Python smtplib without SSL.' 210 | 211 | message = 'Subject: {}\n\n{}'.format(subject, body) 212 | 213 | # 发送邮件 214 | smtp.sendmail(sender_email, receiver_email, message) 215 | 216 | # 退出SMTP会话 217 | smtp.quit() 218 | ``` 219 | -------------------------------------------------------------------------------- /documents/regex.md: -------------------------------------------------------------------------------- 1 | # 正则表达式 RegEx 2 | 3 | 正则表达式是一种用于匹配和操作文本的,由一系列字符和特殊字符组成的模式 4 | 5 | |表达式|说明| 6 | |-|-| 7 | |`<[^>]+>`|全部的 html 标签| 8 | |`(? 的行,就拆分成新的文件 5 | i=0 6 | while read h 7 | do 8 | if [[ $h == *"

    "* ]] 9 | then i=$((i + 1)) 10 | fi 11 | echo $h >> $(printf "%0.3d.xhtml" $i) 12 | done < a.html 13 | 14 | # 把 a 中对应行记录的文件,移动或重命名为 b 中对应行的记录值 15 | a=1 16 | for i in $(cat a.txt) 17 | do 18 | j=$(sed -n "$a p" b.txt) 19 | mv "$i" "$j" 20 | a=$(($a+1)) 21 | done 22 | 23 | # 交换文件的奇偶行 24 | IFS=$'\n' 25 | sed -n '1~2p' c.txt > a.txt 26 | sed -n '2~2p' c.txt > b.txt 27 | a=1 28 | for i in $(cat a.txt) 29 | do 30 | j=$(sed -n "$a p" b.txt) 31 | echo "$j" >> d.txt 32 | echo "$i" >> d.txt 33 | a=$(($a+1)) 34 | done 35 | ``` 36 | 37 | ```sh 38 | # 输出 one1 one2 ... three2 three3 39 | echo {one,two,three}{1,2,3} 40 | 41 | # 取 i 值为 1 到 10 42 | for i in {1..10} 43 | 44 | # 读取 find 的结果,或使用 for i in $(find) 45 | find | while read i 46 | do 47 | echo $i 48 | done 49 | 50 | # 无限循环 51 | while true 52 | do 53 | 命令 54 | done 55 | 56 | # 判断环境变量 C 的值是否为 1 57 | [[ "$C" = "1" ]] && { 58 | 命令 59 | } 60 | 61 | # 判断上一个命令是否运行成功,成功1,失败 0 62 | # -e file 判断文件是否存在,-d 判断文件夹,-z 和 -n 判断变量是否为空 63 | if [[ $? == 0 ]] 64 | then 65 | echo 1 66 | else 67 | echo 0 68 | fi 69 | 70 | # 如果 A > 1 且 B = 0,则 X = X / A 71 | if [[ $A -gt 1 && $B -eq 0 ]] 72 | then 73 | X=$(expr $X / $A) 74 | fi 75 | ``` 76 | 77 | ```sh 78 | # 以 = 为分隔符,提取 rpc-secret 开头的对应值 79 | awk -F= '/^rpc-secret/ {print $2}' a.txt 80 | 81 | # 删除 html 标签 82 | sed -E 's/<[^>]+>//g' a.html 83 | 84 | # 删除所有的换行符,操作行时,需要添加 :a;N; 和 ;ta 85 | sed ":a;N;s/\n//g;ta" a.txt 86 | 87 | # 把以 a 开头的行中,所有的 b 替换为 c 88 | sed '/^a/s/b/c/' a.txt 89 | 90 | # 把包含 key 的行替换成 key=123 91 | sed /key/s/.*/key=123/ a.txt 92 | 93 | # 删除包含 ABC 的行,-i 修改文件 94 | sed -i /ABC/d a.txt 95 | 96 | # 删除 3-7 行 97 | sed 3,7d a.txt 98 | 99 | # 在第 3 行前插入 abc 100 | sed 3iabc a.txt 101 | 102 | # 替换文件内容中的 a 为 b,也可以使用 @ 和 : 替换 / 作为分隔符 103 | # 正则表达式 -E 的替换参数使用 \1 而非 $1 104 | sed s/a/b/g a.txt 105 | 106 | # 输出文件奇数行,1~2p 从第 1 行开始,每 2 行输出一次 107 | # 1,4p 表示从第 1 行到第 4 行 108 | sed -n 1~2p a.txt 109 | 110 | # 删除重复行 111 | uniq 112 | 113 | # 删除重复行,会打乱顺序 114 | sort -u a.txt 115 | 116 | # 随机抽取 1-10 之间的数字,输入 shuf 文件名,则随机打乱文件的行 117 | shuf -i 1-10 118 | 119 | # 匹配大于等于一个字符的行,-P 非贪婪匹配,-o 只输出匹配的部分 120 | grep -E '.{1,}' a.md 121 | 122 | # 在 /etc/ 目录搜索内容 abc,-r 递归查找子目录,-n 显示行号 123 | grep -rn 'abc' /etc/ 124 | 125 | # 获取内容 abc 在文件中的行号 126 | grep -n 内容 文件 | grep -o ^[0-9]* 127 | 128 | # 删除 a.txt 中所有的 aa 字符 129 | tr -d 'aa' < a.txt 130 | 131 | # 去除 a 变量中 ) 右边所有内容 132 | b=${a%)*} 133 | 134 | # 去除 a 变量中 ( 左边所有内容 135 | b=${a#*(} 136 | 137 | # 把分隔符设为换行 138 | IFS=$'\n' 139 | 140 | # 显示文件的行号,或使用 nl 命令 141 | cat -n a.txt 142 | 143 | # 写入文件,单引号的 'EOL' 表示写入内容时不转义 144 | cat << EOL > a.txt 145 | hello world 146 | EOL 147 | 148 | # 指定输出 2 位小数 149 | printf "%0.2d.txt" $i 150 | 151 | # 输出 i 变量的文件名称,不输出的结尾部分的 .md 152 | basename $i .md 153 | 154 | # 加法运算,等效 i=$(($i+1)) 155 | i = $(expr $i + 1) 156 | 157 | # 定义数组 158 | cities=("1" "2" "3") 159 | for city in "${cities[@]}" 160 | 161 | # 文件编码 gbk 转换 utf-8 162 | iconv -f gbk -t utf-8 gbk.txt > utf-8.txt 163 | 164 | # 转换 windows 换行符 \r\n 为 linux 的 \n 165 | dos2unix file 166 | ``` 167 | 168 | ```sh 169 | # 终端设置代理,等效于 http_proxy=ip:port https_proxy=ip:port 170 | export all_proxy=ip:port 171 | 172 | # 查看端口占用情况 173 | lsof -Pi 174 | 175 | # 设置代理下载 176 | wget -e http_proxy=http://127.0.0.1:7890 example.com/index.html 177 | 178 | # 添加 header 179 | curl -H 'token: 2a9b3f' 180 | 181 | # 设置代理访问,-x 等同 --proxy 182 | curl -x socks5://127.0.0.1:1024 example.com 183 | 184 | # 发送 POST 请求,设置参数 key 为 123456,-F NAME=@FILE 上传文件 185 | curl -X POST -d key=123456 example.com 186 | 187 | # 上传文件到 WebDAV 服务器,目录需要加 / 符号 188 | curl -u "USERNAME":"PASSWORD" -T "d/file" WEBDAV_URL -w "%{http_code}" 189 | 190 | # 下载 WebDAV 服务器文件 191 | curl -u USERNAME:PASSWORD -O WEBDAV_URL 192 | ``` 193 | 194 | ```sh 195 | # 创建软链接 b,指向 a 196 | ln -s a b 197 | 198 | # 生成 uuid,dbus-uuidgen 命令生成没有分隔符的 uuid 199 | uuidgen 200 | 201 | # 在终端指定位置显示信息 202 | tput sc; tput cup 23 45; echo Input from tput/echo at 23/45; tput rc 203 | 204 | # 查看系统参数 205 | uname -a 206 | 207 | # 查询自己的 uid/gid 208 | id 209 | 210 | # 创建无法登录的用户 atri,删除用户用 userdel 211 | useradd -s /usr/bin/nologin atri 212 | 213 | # 生成 6M 大小的文件 214 | dd if=/dev/urandom of=test bs=1M count=6 215 | 216 | # 调用 gzip 压缩文件,-c 打包,-f 指定文件 217 | # -z/-j/-J 调用 gzip/bzip2/xz,-I zstd 调用 zstd,--exclude file 排除文件,-C 切换目录 218 | tar -czf file.tar.gz path/ 219 | 220 | # 解压文件,-x 解压,-v 显示详细过程 221 | # --strip-components=1 减少一个目录层级,-C 指定解压目录 222 | tar -xvf file.tar 223 | 224 | # gzip 压缩文件,-d 解压 225 | gzip file 226 | 227 | # 输出当前时间,年月日时分秒 228 | date +"%Y-%m-%d %H:%M:%S" 229 | 230 | # 显示目录文件,-f 完整路径,-p 权限,-D 日期,-i 不显示树状图,-L 2 只显示 2 层目录 231 | tree -fipDL 2 232 | 233 | # 清理内存缓存 234 | sync && echo 3 | tee /proc/sys/vm/drop_caches 235 | 236 | # 查看文件的依赖情况 237 | ldd file 238 | 239 | # 列出文件,-t 时间顺序,-tr 时间倒序,-v 自然顺序 240 | ls 241 | 242 | # 后台运行 243 | nohup 命令 > log 2>&1 & 244 | 245 | # 创建 screen 后台运行会话,-ls 查看会话列表 246 | screen -dmS 会话名 命令 247 | 248 | # 进入 screen 后台会话,按 Ctrl + A + D 退出会话 249 | screen -r 会话名 250 | 251 | # 查看系统进程,或 ps -ef 252 | htop 253 | 254 | # 加密文件,-d 解密,-aes-256-cbc 使用 CBC 模式 的 AES-256 算法 ,-pbkdf2 使用 PBKDF2 加密算法,-salt 盐加密 255 | openssl enc -aes-256-cbc -pbkdf2 -salt -in text.txt -out encrypt.txt 256 | 257 | # 以 nobody 用户的身份运行命令 258 | su nobody -s /bin/bash -c '命令' 259 | 260 | # 导出分区表文件 261 | sfdisk -d /dev/sdb > sdb.bkp 262 | 263 | # 导入分区表文件 264 | sfdisk /dev/sdb < sdb.bkp 265 | ``` 266 | 267 | ```sh 268 | # fish 添加 PATH 269 | fish_add_path /root/bin 270 | 271 | # arch linux 系列包管理器 272 | # -S 安装,-Si 查看信息 273 | # -Ql 查看本地文件 274 | # -Ss 根据关键词搜索包 275 | # -F 根据文件名查询包 276 | # -Rs 卸载 277 | # -Qdt 查找孤立依赖包 278 | # -U 安装本地文件包 279 | # -Syu 更新所有包 280 | # --noconfirm 跳过确认 281 | pacman 282 | 283 | # 转换 webp 为 png 284 | dwebp a.webp -o a.png 285 | 286 | # 转换 jpg 为 avif 287 | avifenc cover.jpg cover.avif 288 | 289 | # 压缩 jpg 图片大小 290 | jpegoptim --strip-all --all-progressive -o -f --max=50% a.jpg 291 | 292 | # 压缩 png 图片大小, 压缩等级设为 3,可选 1-7 293 | optipng -o3 a.png 294 | 295 | # flac 转 wav 296 | flac -d a.flac 297 | 298 | # wav 转 flac,指定压缩级别为 5 299 | flac -s --compression-level-5 a.wav 300 | 301 | # 重新编码 flac 文件 302 | flac a.flac -V -s --best --no-error-on-compression-fail -o b.flac 303 | 304 | # 查看系统信息,其他 neofetch 305 | fastfetch 306 | 307 | # 假装进行非常专业的活动 308 | genact 309 | 310 | # 使用 rclone 挂载云盘为本地目录,并设置缓存路径 311 | rclone mount name:/a /b --cache-dir /c --vfs-cache-mode writes 312 | ``` 313 | 314 | ```powershell 315 | # 查看文件 SHA256,MD5 316 | certutil -hashfile file SHA256 317 | ``` 318 | -------------------------------------------------------------------------------- /documents/sql.md: -------------------------------------------------------------------------------- 1 | # 数据库基本指南 2 | 3 | 基本使用 4 | 5 | ```sql 6 | -- 增删改查 7 | INSERT INTO products (name, price, cover) VALUES ('Apple', 1.2, 'apple.jpg'); 8 | SELECT * FROM products WHERE price > 1.0; 9 | UPDATE products SET price = 1.5 WHERE name = 'Apple'; 10 | DELETE FROM products WHERE name = 'Apple'; 11 | 12 | -- 按照 id 倒序获取前 5 条数据,跟 OFFSET 5 表示跳过前 5 行, DESC 降序,ASC 升序 13 | SELECT * FROM tablename ORDER BY id DESC LIMIT 5; 14 | 15 | -- 清空表 16 | DELETE FROM tablename; 17 | 18 | -- 删除表 19 | DROP TABLE tablename; 20 | 21 | -- 记录阅读量 +1 22 | UPDATE xxxxx SET count = count+1 WHERE id = 1; 23 | 24 | -- 将 file_url 表中的 url 列中所有 apple 字段替换成 banana 25 | UPDATE file_url SET url = replace (url, 'apple', 'banana'); 26 | ``` 27 | 28 | 创建表名为 user,id 主键,整数型,自增长,user 字符串型,最大长度 30,不为空 29 | 30 | ```sql 31 | CREATE TABLE IF NOT EXISTS user ( 32 | id INT AUTO_INCREMENT PRIMARY KEY, 33 | user VARCHAR(30) NOT NULL 34 | ); 35 | ``` 36 | 37 | ## MySQL / MariaDB 38 | 39 | TEXT 类型最大 64k,MEDIUMTEXT 类型最大 16m,LONGTEXT 类型最大 4g 40 | 41 | ```sql 42 | show databases; -- 列出所有数据库 43 | show tables; -- 列出所有表 44 | show columns from user; -- 查看 user 表的结构 45 | show create table user; -- 查看 user 表的创建语句 46 | ``` 47 | 48 | 连接数据库,后面跟数据库名称可连接指定数据库(test),本机可省略 -h,无密码可省略 -p 49 | 50 | ```sh 51 | mysql -h 127.0.0.1 -u root -p123456 test 52 | ``` 53 | 54 | - 数据导出 sql 文件 55 | 56 | 增加 --no-tablespaces 参数无视表结构,--set-gtid-purged=OFF 不包含 GTID,后跟表名可单独导出一张表 57 | 58 | ```sh 59 | mysqldump -h 127.0.0.1 -u root -p123456 database_name > db.sql 60 | ``` 61 | 62 | - 恢复 sql 数据 63 | 64 | ```sh 65 | mysql -u root -p database_name < db.sql 66 | ``` 67 | 68 | 或者 69 | 70 | ```sql 71 | use database_name 72 | source /sql/file.sql 73 | ``` 74 | 75 | - 设置密码 76 | 77 | ```sql 78 | USE mysql 79 | SET password = PASSWORD('password'); 80 | FLUSH PRIVILEGES; 81 | ``` 82 | 83 | 如果出现 ERROR 1064 (42000),尝试去除 PASSWORD() 函数,直接写密码 84 | 85 | ## SQLite 86 | 87 | 支持的数据类型见 [https://sqlite.org/datatype3.html#affinity_name_examples](https://sqlite.org/datatype3.html#affinity_name_examples) 88 | 89 | ```sql 90 | .table -- 列出所有表 91 | .schema user -- 查看 user 表的创建语句 92 | ``` 93 | -------------------------------------------------------------------------------- /documents/steam.md: -------------------------------------------------------------------------------- 1 | # Steam 游戏平台 2 | 3 | Steam 是 Valve 公司推出的著名游戏分发平台,对于 Linux 平台,Steam 官方只提供对 Ubuntu LTS 版本的支持 4 | 5 | Value 公司发行的 Steam Deck 掌机使用基于 Arch Linux 所开发的 SteamOS 3 系统 6 | 7 | https://store.steampowered.com 8 | 9 | ## Steam 问题 10 | 11 | - 个人资料展柜展示图片 12 | 13 | 打开网页版 Steam 页面,在个人资料 - 艺术作品中点击上传艺术作品,选中非游戏特定后上传图片,随后打开开发者模式,在控制台中运行如下代码 14 | 15 | ```js 16 | // 图像大小 17 | $J('#image_width').val(1000).attr('id',''),$J('#image_height').val(1).attr('id','') 18 | 19 | // 隐藏作品名字 20 | v_trim=_=>{return _},$J('#title').val(' \n'+Array.from(Array(126),_=>'\t').join('')) 21 | ``` 22 | 23 | 在展柜中选择精选艺术作品展柜,选中刚刚上传的图片即可(由于隐藏了作品名称,只能看到一个不显眼的横杠) 24 | 25 | - 新家庭共享 26 | 27 | 封禁连坐机制:只会封禁开挂者和开挂游戏的拥有者,不会殃及家庭中的其他成员 28 | 29 | 免费游戏不会被共享 30 | 31 | 依据官方 [拥有 VAC 封禁的游戏列表](https://store.steampowered.com/search/?category1=998&category2=8&hidef2p=1&ndl=1),如果不想让某个游戏共享到家庭,在 Steam 的该游戏界面上,点击管理,将游戏标记为私密即可 32 | 33 | - 收藏夹排序 34 | 35 | 在收藏夹的名称前面加空格即可,空的越多越靠前 36 | 37 | - 开启 Steam Deck 界面 38 | 39 | 1. 打开 Steam 安装目录,找到 package 文件夹 40 | 2. 进入 package 目录,创建一个名为 beta 的文件 41 | 3. 在 beta 文件中写入 `steampal_stable_9a24a2bf68596b860cb6710d9ea307a76c29a04d` 42 | 4. 在 Steam 的启动指令后面添加 `-gamepadui` 43 | 44 | - 跳正版分流验证 45 | 46 | 打开 Steam 安装目录,将 Steam 启动程序移动到其他目录,然后直接运行下载的正版分流游戏即可跳过 Steam 验证 47 | 48 | ## 游戏问题 49 | 50 | - Wallpaper Engine 创意工坊自动下载问题 51 | 52 | 如果在自己的电脑上登录了别人的 Steam 账号,恰好那个账号也拥有 Wallpaper 软件且订阅了大量创意工坊内容,会导致 Steam 自动将该账号的所订阅的 Wallpaper 创意工坊的内容添加到 `steam\steamapps\workshop\appworkshop_431960.acf` 配置文件的 WorkshopItemDetails 中,导致 WorkshopItemsInstalled 与之不匹配,从而一直下载内容 53 | 54 | 官方方法 55 | 56 | 1. 关闭 Steam 57 | 2. 转到 wallpaper_engine 安装目录 58 | 3. 运行 `wallpaper_engine\bin\steamredownloadfixer32.exe` 59 | 4. 重新启动 Steam 并验证 Wallpaper Engine 的文件完整性 60 | 61 | [更多](https://help.wallpaperengine.io/steam/redownload.html) 62 | 63 | 民间方法 64 | 65 | 直接修改配置文件,编辑 `steam\steamapps\workshop\appworkshop_431960.acf`,把 WorkshopItemDetails 的内容复制替换到 WorkshopItemsInstalled 中即可 66 | 67 | ## Steam 令牌 68 | 69 | 先保存 Steam 令牌恢复代码 70 | 71 | - 导出 Steam 二次验证令牌到 Bitwarden 72 | 73 | 1. 方法一 74 | 75 | 前置条件:已开启 Steam 手机令牌,安卓手机 Root 并安装 LSPosed 框架 76 | 77 | 安装 [SteamGuardDump](https://github.com/YifePlayte/SteamGuardDump) 模块,在 LSPosed 模块设置中,将 SteamGuardDump 的作用域选中 Steam App 78 | 79 | 打开 Steam App,模块将自动复制一段内容到输入法剪贴板,从中找到这样的部分 `"uri": "otpauth://totp/Steam:steamid?secret=ABCDEFG12345678910JQKA&issuer=Steam"`,得到 secret 80 | 81 | 将 secret 写成这种形式 `steam://ABCDEFG12345678910JQKA`,并填入 Bitwarden 的 TOTP 框 82 | 83 | 2. 方法二 84 | 85 | 下载 Steam++,在本地令牌中,登录账号绑定令牌 86 | 87 | 将这个令牌导出为 maFile 文件,用文本编辑器打开,从中找到 url 的 otpauth 部分,得到 secret 88 | 89 | 3. 方法三 90 | 91 | 下载 [SDA](https://github.com/Jessecar96/SteamDesktopAuthenticator) 并按说明登陆账号使用,不要选择加密 92 | 93 | 在 SDA 安装目录下可以找到 maFile 文件 94 | 95 | ## Arch Linux / Steam Deck 96 | 97 | ### 安装 98 | 99 | 使用 Flatpak 安装可避免许多毛病 100 | 101 | ```sh 102 | flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo 103 | flatpak --user install flathub com.valvesoftware.Steam 104 | flatpak run com.valvesoftware.Steam 105 | ``` 106 | 107 | 默认情况下通过 Flatpak 安装的 Steam 不会有访问你的家目录的权限,并且由于安全问题,强行忽略此权限限制会导致 Steam 无法运行。不过,你可以自由地在家目录之外添加一个目录。如果你想添加一个外部库,你可以运行如下指令来添加 108 | 109 | ```sh 110 | flatpak --user override com.valvesoftware.Steam --filesystem=/path/to/directory 111 | ``` 112 | 113 | 启动使用 Flakpak 安装的 steam 可能会发出警告有关安装 `steam-devices` 软件包的信息,此包暂不存在,可通过安装 Aur 的 `game-devices-udev` 来解决 114 | 115 | - Bottles 集成 116 | 117 | 如果使用 Flatpak 安装了 Bottles,你可以在 Steam 中使用它来运行 Windows 游戏,[参阅](https://docs.usebottles.com/flatpak/cant-enable-steam-proton-manager) 118 | 119 | ```sh 120 | flatpak override --user com.usebottles.bottles --filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam 121 | ``` 122 | 123 | ### 常见问题 124 | 125 | - 运行非 steam 平台 exe 游戏 126 | 127 | 1. 点击 Steam 左下角添加游戏 128 | 2. 点击添加非 Steam 游戏 129 | 3. 选择游戏的 exe 启动程序 130 | 4. 点击添加选定的程序 131 | 5. 在属性 - 兼容性中勾选强制使用特定 Steam Play 兼容性工具 132 | 133 | - 亚洲字体乱码 134 | 135 | 1. 支持的字体 136 | 137 | 尝试安装 `lib32-fontconfig`、`ttf-liberation` 和 `wqy-zenhei`,然后重新启动 Steam 以查看问题是否已解决 138 | 139 | 当 Steam 找不到 Arial 字体时,font-config 喜欢回到 Helvetica 位图字体。Steam 无法正确呈现此位图字体以及可能的其他位图字体,因此,删除有问题的字体或禁用位图字体很可能会在不安装 Arial 或 ArialBold 字体的情况下解决问题。用于代替 Arial 的字体可以通过 `fc-match -v Arial` 指令找到 140 | 141 | 2. fontconfig 142 | 143 | 如上述方法未解决问题,尝试使用 fontconfig 为 Steam 指定字体 144 | 145 | 找到系统中的字体目录,一般为 `/usr/share/fonts`,假设存在 `/usr/share/fonts/win` 目录,其中包含的是 Windows 平台的字体 146 | 147 | 创建 `/usr/share/fonts/steam.conf` 文件,写入如下内容 148 | 149 | ```xml 150 | 151 | 152 | 153 | /usr/share/fonts/win 154 | 155 | ``` 156 | 157 | 编辑 Steam.desktop,在所有 Exec= 后添加 `env FONTCONFIG_FILE=/usr/share/fonts/steam.conf` 158 | -------------------------------------------------------------------------------- /documents/systemd.md: -------------------------------------------------------------------------------- 1 | # Systemd 服务 2 | 3 | systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序 4 | 5 | ## 文件路径 6 | 7 | 系统级单元路径: 8 | 9 | - /usr/lib/systemd/system/ 软件包单元 10 | - /etc/systemd/system/ 系统管理员单元 11 | 12 | 用户级单元路径: 13 | 14 | - /usr/lib/systemd/user/ 软件包单元 15 | - ~/.local/share/systemd/user/ 家目录中的软件包单元 16 | - /etc/systemd/user/ 系统管理员指定的用户单元 17 | - ~/.config/systemd/user/ 用户单元 18 | 19 | ## 各项使用方法 20 | 21 | - 单元文件 22 | 23 | ```ini 24 | [Unit] 25 | Description=描述 26 | [Service] 27 | ExecStart=启动命令 28 | Restart=on-failure 29 | [Install] 30 | #WantedBy=default.target #用户级单元使用 31 | WantedBy=multi-user.target 32 | ``` 33 | 34 | 可以通过 `Environment="a=1"` 定义环境变量 35 | 36 | - 创建一个新服务 37 | 38 | 如果存在同名文件,会直接覆盖 39 | 40 | ```sh 41 | systemctl edit --force --full foo.service 42 | ``` 43 | 44 | - 链接文件 45 | 46 | 创建一个软链接,指向该文件 47 | 48 | ```sh 49 | systemctl link ./foo.service 50 | ``` 51 | 52 | - 查看已有服务 53 | 54 | 查看已有的服务由哪些文件组成,并显示内容 55 | 56 | ```sh 57 | systemctl cat foo.service 58 | ``` 59 | 60 | - 修改现有服务 61 | 62 | 会在 foo.server 同级目录中创建一个 foo.service.d/override.conf 文件,并记录修改的内容,随后会附加到 foo.server 中 63 | 64 | 如果要完全的替换现有服务文件,应加入 `--full` 参数,随后正常按照新的文件来写 65 | 66 | ```sh 67 | systemctl edit foo.service 68 | ``` 69 | 70 | 如果要替换一个可以多次设值的选项,应当先清空该项,例如 71 | 72 | ```ini 73 | [Service] 74 | ExecStart= 75 | ExecStart=/bin/foo --help 76 | ``` 77 | 78 | 修改完成后需要重新启动服务 79 | 80 | - 定时任务 81 | 82 | 创建同名的 service 和 timer 文件,可以启动定时任务,随后启动 foo.timer 即可 83 | 84 | /etc/systemd/system/foo.service 85 | 86 | ```ini 87 | [Unit] 88 | Description=foo 89 | [Service] 90 | #WorkingDirectory=/opt #指定工作目录 91 | ExecStart=/bin/foo 92 | ``` 93 | 94 | /etc/systemd/system/foo.timer 95 | 96 | ```ini 97 | [Unit] 98 | Description=foo at 2:00 and 19:00 99 | [Timer] 100 | OnCalendar=*-*-* 2,19:00:00 # 每天 2 点和 19 点 101 | [Install] 102 | WantedBy=multi-user.target 103 | ``` 104 | -------------------------------------------------------------------------------- /documents/vscode.md: -------------------------------------------------------------------------------- 1 | # VS Code 代码编辑器 2 | 3 | Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器 4 | 5 | https://code.visualstudio.com 6 | 7 | ## 安装 8 | 9 | - Linux 10 | 11 | Arch 系从 Aur 安装 `visual-studio-code-bin`,其他发行版在此不做介绍 12 | 13 | - WIndows 14 | 15 | 官网下载安装 16 | 17 | - Web 18 | 19 | 服务器端网页版 VS Code 见 code-server,在此不多做介绍 20 | 21 | https://github.com/coder/code-server 22 | 23 | ## 快捷键 24 | 25 | - `shift`+`alt`+`鼠标拖动`,出现多个光标 26 | - `ctrl`+`alt`+`↑/↓`,在同一列出现多个光标 27 | - 选中文字,按 `SHIFT`+`ALT`+`I`,每行末尾出现光标 28 | - `CTRL`+`SHIFT`+`END/HOME`,向下/上选中所有行 29 | - `ALT`+`SHIFT`+`F`,格式化代码 30 | - 选中文字,按 `CTRL`+`SHIFT`+`U/I`,大/小写转换 31 | - `CTRL`+`/`,注释选定的行 32 | 33 | ## 常见问题 34 | 35 | - 自动备份文件夹 36 | 37 | Windows 路径:%APPDATA%\Code\User\History 38 | 39 | - 切换终端的默认 shell 40 | 41 | Launch Profile - Set Default Profile 42 | 43 | - 设置项 44 | 45 | ```json 46 | // 编辑器字体 47 | "editor.fontFamily": "Source Code Pro, 思源黑体" 48 | 49 | // 忽略文件 50 | "files.exclude": { 51 | "*.code-workspace": true 52 | } 53 | 54 | // JavaScript 格式化时自动添加分号 55 | "javascript.format.semicolons": "insert" 56 | ``` 57 | 58 | - 离线安装插件 59 | 60 | 在插件页面,选择 Install from VSIX... 61 | 62 | ## 扩展推荐 63 | 64 | - Chinese (Simplified) 简体中文界面 65 | - Live Server 静态网页服务器 66 | - Office Viewer 实时渲染的 Md 文档 67 | - Cdoe Runner 运行代码 68 | 69 | --- 70 | 71 | 浅色主题 72 | 73 | - GitHub Light Theme 74 | - Office Theme 75 | 76 | 深色主题 77 | 78 | - One Dark Pro 79 | 80 | --- 81 | 82 | - rust-analyzer,Rust 83 | - PHP Intelephense,PHP 84 | - Go,Go 85 | -------------------------------------------------------------------------------- /documents/windows-help.md: -------------------------------------------------------------------------------- 1 | # Windows 常见指北 2 | 3 | 本文内容收集自网络,请自行甄别是否适用 4 | 5 | - OBS 录制黑屏 6 | 7 | 双显卡的笔记本电脑用户在使用 DXGI 捕捉屏幕时会黑屏,需要在图形设置中添加 OBS 并设为节能 8 | 9 | - 取消默认文件打开方式 10 | 11 | 1. HKEY_CLASSES_ROOT 删除指定文件类型 12 | 2. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts 删除指定文件类型 13 | 3. 重启资源管理器 14 | 15 | - SMB 共享文件夹 16 | 17 | 1. 属性 - 共享 - 共享 - 添加 Everyone 用户,给予权限 18 | 2. 属性 - 共享 - 高级共享 - 勾选共享此文件夹 19 | 3. 属性 - 共享 - 高级共享 - 权限 - 选择 Everyone 用户,给予权限 20 | 21 | - 输入的最后一个产品密钥不能用于此 Windows 副本 22 | 23 | 1. 注册表编辑器 24 | 2. 打开 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform 25 | 3. 查看 BackupProductKeyDefault 的值,并复制 26 | 4. 设置 - 更新和安全 - 激活,选择更改产品密钥 27 | 5. 粘贴刚刚复制的密钥,下一步,激活 28 | 29 | - 笔记本插电时保持小功率 30 | 31 | 1. 电源选项 32 | 2. 创建电源计划 33 | 3. 勾选节能 34 | 35 | - 安装 AppX/MSIX 36 | 37 | 1. 管理员权限打开 PowerShell 38 | 2. 输入 Add-AppxPackage app.AppxBundle 39 | 40 | - 系统处于测试签名模式 41 | 42 | 1. 管理员权限打开 PowerShell 43 | 2. 输入 bcdedit /set testsigning off 44 | 45 | - 加载驱动程序 46 | 47 | 1. 设备管理器 48 | 2. 更新驱动程序 49 | 3. 浏览我的电脑以查找驱动程序 50 | 4. 让我从计算机上的可用驱动程序列表中选取 51 | 5. 显示所有设备,下一步 52 | 6. 从磁盘中选择,找到 inf 文件 53 | 54 | - 删除文件管理器类型关联 55 | 56 | 1. 注册表编辑器 57 | 2. 删除 HKEY_CLASSES_ROOT 的键值 58 | 3. 删除 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts 的键值 59 | 4. 重启资源管理器 60 | 61 | - 强制删除脚本 62 | 63 | 1. 创建一个 bat 文件,写入如下内容 64 | 2. 将要删除的文件拖到该文件上 65 | 66 | ```batch 67 | DEL /F /A /Q \\?\%1 68 | RD /S /Q \\?\%1 69 | ``` 70 | 71 | - PATH 环境变量 72 | 73 | 1. 系统 74 | 2. 高级系统设置 75 | 3. 环境变量 76 | 77 | - 处理 Microsoft Edge 78 | 79 | 建议直接卸载了事,卸载工具 Remove-MS-Edge 80 | 81 | https://github.com/ShadowWhisperer/Remove-MS-Edge 82 | 83 | ::: details 禁用自动更新 84 | 1. 计算机管理 85 | 2. 服务和应用程序 86 | 3. 禁用 Microsoft Edge Update Service (edgeupdate),Microsoft Edge Update Service (edgeupdatem),Microsoft Edge Elevation Service (MicrosoftEdgeElevationService) 87 | 4. 创建空文件,替换掉 %PROGRAMFILES(X86)%/Microsoft/EdgeUpdate/MicrosoftEdgeUpdate.exe 88 | ::: 89 | 90 | - 降低 Win 安全中心的占用 91 | 92 | 1. win+r 输入 gpedit.msc 93 | 2. 打开计算机配置 - 管理模板 - Windows 组件 - Microsoft Defender 防病毒 - 扫描 94 | 3. 点击指定扫描期间 CPU 使用率的最大百分比 95 | 4. 左侧选择已启用,并将数值设为 5 96 | 97 | - 启用 PDF 虚拟打印机 98 | 99 | 1. 控制面板 100 | 2. 程序和功能 101 | 3. 启用或关闭 Windows 功能 102 | 4. 勾选Microsoft Print to PDF 103 | 104 | - 关闭睡眠和锁定按钮 105 | 106 | 1. 电源选项 107 | 2. 选择电源按钮功能 108 | 3. 更改当前不可用的设置 109 | 4. 取消勾选睡眠,锁定 110 | 111 | - 软连接系统截图目录 112 | 113 | 将 Win+Shift+S 截图链接到图片/截图目录 114 | 115 | 1. 管理员权限打开 CMD 116 | 2. 输入 mklink /d %HOMEPATH%\Pictures\截图 %LOCALAPPDATA%\Packages\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\TempState\ScreenClip 117 | 118 | - 开启 UTF-8 语言环境 119 | 120 | 1. 时间和语言 121 | 2. 语言 122 | 3. 管理语言设置 123 | 4. 更改系统区域设置 124 | 5. 勾选使用 Unicode UTF-8 提供全球语言支持 125 | 126 | 如打开 GBK 编码文件时出现乱码的情况,请使用转区工具解决 127 | 128 | - 禁用收集体验信息服务 129 | 130 | 1. 计算机管理 131 | 2. 服务和应用程序 132 | 3. 禁用Connected User Experiences and Telemetry 133 | 134 | - 修改动画效果 135 | 136 | 1. 系统 137 | 2. 高级系统设置 138 | 3. 性能 139 | 4. 勾选平滑屏幕字体边缘,显示缩略图,显示亚透明的选择长方形,在窗口下显示阴影 140 | 141 | - 将硬件时间视为 UTC 时间 142 | 143 | 1. 管理员权限打开 PowerShell 144 | 2. 输入 Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1 145 | 146 | - 快捷键 147 | 148 | |键位|功能| 149 | |-|-| 150 | |Win + Q|搜索| 151 | |Win + D|切换桌面| 152 | |Win + L|锁定屏幕| 153 | |Alt + Tab|切换任务| 154 | |Win + Tab|打开任务视图| 155 | |Ctrl + Shift + Esc|打开任务管理器| 156 | |Ctrl + A / C / V / X|全选 / 复制 / 粘贴 / 剪切| 157 | |Ctrl + Z / Y|撤销 / 重做| 158 | |Ctrl + W / Alt + F4|关闭当前活动窗口| 159 | |Win + PrtScn|保存截屏到图片| 160 | 161 | - 特殊文件夹 162 | 163 | |路径|说明| 164 | |-|-| 165 | |%LOCALAPPDATA%\Programs|用户级程序目录| 166 | |%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup|用户级开机自启目录| 167 | |%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\StartUp|系统级开机自启目录| 168 | 169 | - 环境变量 170 | 171 | |变量名|变量值| 172 | |-|-| 173 | |%APPDATA%|C:\Users\Username\AppData\Roaming| 174 | |%WINDIR%|C:\Windows| 175 | |%COMMONPROGRAMFILES%|C:\Program Files\Common Files| 176 | |%COMMONPROGRAMFILES(x86)%|C:\Program Files (x86)\Common Files| 177 | |%SYSTEMDRIVE%|C:| 178 | |%HOMEPATH%|C:\Users\Username| 179 | |%LOCALAPPDATA%|C:\Users\Username\AppData\Local| 180 | |%PROGRAMDATA%|C:\ProgramData| 181 | |%PROGRAMFILES%|C:\Program Files| 182 | |%PROGRAMFILES(X86)%|C:\Program Files (x86)| 183 | |%ALLUSERSPROFILE%|C:\ProgramData| 184 | |%COMMONPROGRAMW6432%|C:\Program Files\Common Files| 185 | |%COMPUTERNAME%|Hostname| 186 | |%COMSPEC%|C:\WINDOWS\system32\cmd.exe| 187 | |%HOMEDRIVE%|C:| 188 | |%LOGONSERVER%|\\\MicrosoftAccount| 189 | |%OS%|Windows_NT| 190 | |%PROGRAMW6432%|C:\Program Files| 191 | |%PUBLIC%|C:\Users\Public| 192 | |%TEMP%|C:\Users\Username\AppData\Local\Temp| 193 | |%TMP%|C:\Users\Username\AppData\Local\Temp| 194 | |%USERDOMAIN%|Hostname| 195 | |%USERNAME%|Username| 196 | -------------------------------------------------------------------------------- /src/docs/.vuepress/components/VPPageNav.vue: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/docs/.vuepress/config.ts: -------------------------------------------------------------------------------- 1 | import { defineUserConfig } from 'vuepress' 2 | import { viteBundler } from '@vuepress/bundler-vite' 3 | import { defaultTheme } from '@vuepress/theme-default' 4 | import { getDirname, path } from '@vuepress/utils' 5 | import { prismjsPlugin } from '@vuepress/plugin-prismjs' 6 | 7 | const __dirname = getDirname(import.meta.url) 8 | 9 | export default defineUserConfig({ 10 | title: 'ATRI Doc', 11 | lang: 'zh-CN', 12 | head: [['link', { rel: 'icon', href: '/favicon.ico' },],], 13 | 14 | theme: defaultTheme({ 15 | sidebar: [{ 16 | text: 'HEAD', children: [ 17 | // 'CONTENTS', 18 | ], 19 | },], 20 | navbar: [{ text: '说书人叹天下旧事如潮,听书人悲欢不过一壶新茶', link: '/peach/' },], 21 | 22 | lastUpdated: false, 23 | contributors: false, 24 | sidebarDepth: 0, 25 | externalLinkIcon: false, 26 | },), 27 | 28 | plugins: [ 29 | prismjsPlugin({ 30 | themes: { light: 'ghcolors', dark: 'one-dark' } 31 | }), 32 | ], 33 | 34 | alias: { 35 | '@theme/VPPageNav.vue': path.resolve(__dirname, './components/VPPageNav.vue'), 36 | }, 37 | 38 | bundler: viteBundler(), 39 | },) 40 | -------------------------------------------------------------------------------- /src/docs/.vuepress/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nibazshab/docs/4fe2b25a7ad65e6be63db10f24d0f15ea8a52d80/src/docs/.vuepress/public/favicon.ico -------------------------------------------------------------------------------- /src/docs/.vuepress/styles/index.scss: -------------------------------------------------------------------------------- 1 | // 代码块右上角,不显示语言 2 | div[class*='language-']::before { 3 | display: none; 4 | } 5 | 6 | // 超链接样式 7 | .vp-page a:not(.header-anchor) { 8 | text-decoration: none !important; 9 | } 10 | .vp-page a:not(.header-anchor):hover { 11 | text-decoration: underline !important; 12 | } 13 | -------------------------------------------------------------------------------- /src/env.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | pnpm add -D vue vuepress@next @vuepress/bundler-vite@next @vuepress/theme-default@next @vuepress/client@next @vuepress/utils@next sass-embedded @vuepress/plugin-prismjs@next 3 | 4 | repo=$(dirname "$PWD") 5 | 6 | d=$repo/src/docs 7 | f=$d/.vuepress/config.ts 8 | 9 | cd $repo/documents 10 | 11 | mv index.md $d 12 | mkdir $d/peach && mv peach.md $d/peach/index.md 13 | 14 | find | while read i 15 | do 16 | touch -d $(git log -1 --format=@%ct $i) $i 17 | done 18 | 19 | c=$(grep -n CONTENTS $f | grep -o ^[0-9]*) 20 | for i in $(ls -tr) 21 | do 22 | i=$(basename $i .md) 23 | sed -i "$c i\'/$i/'," $f 24 | mkdir $d/$i && mv $i.md $d/$i/index.md 25 | done 26 | -------------------------------------------------------------------------------- /src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "dev": "vuepress dev docs", 4 | "build": "vuepress build docs" 5 | } 6 | } 7 | --------------------------------------------------------------------------------