[{"content":"使用 Win+R 快速启动程序与命令 Win+R 是一个很实用的功能，常用于打开命令终端、某些程序\n使用方式：同时按下 win+r，再输入 cmd 回车，打开终端\n除此之外，还有这些功能：\n内容 功能页面 cmd 终端 ncpa.cpl 打开“网络连接”窗口（包含以太网、Wi-Fi 等适配器） devmgmt.msc 设备管理器 sysdm.cpl 系统属性，可进入环境变量设置 dcomcnfg 管理控制台，可以查看组件服务，时间查看器，服务 msconfig 系统配置 mstsc windows 桌面远程 control 控制面板 lusrmgr.msc 查看本地用户和组信息 命令提示符：基础终端操作指南 查看 mtu\n1 netsh interface ipv4 show interfaces 显示结果：\n1 2 3 4 5 6 7 8 9 10 11 12 Idx Met MTU 状态 名称 --- ---------- ---------- ------------ --------------------------- 1 75 4294967295 connected Loopback Pseudo-Interface 1 2 5 1500 disconnected 以太网 4 0 65535 connected tun0 6 35 1500 connected WLAN 19 25 1500 disconnected 本地连接* 1 18 25 1500 disconnected 本地连接* 2 22 5 1500 disconnected 以太网 2 21 35 1500 connected VMware Network Adapter VMnet1 17 35 1500 connected VMware Network Adapter VMnet8 10 25 1500 connected VirtualBox Host-Only Network 修改 IP（管理员运行）\n1 netsh interface ip set address \u0026#34;连接名称\u0026#34; static 新IP地址 子网掩码 网关 1 例如：\n1 netsh interface ip set address \u0026#34;Ethernet0\u0026#34; static 192.168.100.50 255.255.255.0 192.168.100.2 启用 Administrator\n1 net user administrator /active:yes 环境变量与脚本变量管理 Windows 支持的变量名，更好的方式表示家目录，程序路径\n在 Windows 中，大部分用户对家目录的概念比较模糊，接触更多是桌面，但是对于更高需求的用户，必须要修改程序配置文件，或者你是否在一些教程中看过这样的路径\n1 C:\\Users\\用户名\\AppData\\Roaming\\rclone\\rclone.conf 大部分的教程都是采用 如上方式表示程序所在路径，使用之前必须修改用户名，而在 Linux 中，有 $HOME表示家目录，像这样\n1 $HOME/.rclone/rclone.conf $HOME变量表示家目录，在复制教程命令是就可以直接使用，不再需要手动修改 用户名，难道 Windows 没有什么方式可以表示家目录吗？\n其实是有的。在 Windows 中，表示变量的方式为 %变量名% ，系统环境变量设置里可以看到这种写法。\n下面是 Windows 中变量，包含了表示家目录的变量。注意变量是大写\n变量 对应的路径 %USERPROFILE% C:\\Users\\用户名 %APPDATA% C:\\Users\\用户名\\AppData\\Roaming %LOCALAPPDATA% C:\\Users\\用户名\\AppData\\Local Windows 变量也可以在 文件资源管理器中使用，在地址栏输入就可以打开，比如输入 %USERPROFILE%就可以打开 家目录\n如果你熟悉 Linux，并且程序也遵循XDG Base Directory Specification (XDG 基础目录规范)，就像开始的案例那样，rclone 在 Linux 中的配置文件位置是 $HOME/.rclone/rclone.conf，对应 Windows 就是%APPDATA%\\rclone\\rclone.conf。\n再比如 qBittorrent 的配置文件和数据文件就分别在不同的位置，在不同系统的路径\n配置文件：\nLinux 下\n1 2 3 4 5 6 7 8 9 10 ~/.config/qBittorrent ├── categories.json ├── ipc-socket ├── lockfile ├── logs ├── qBittorrent.conf ├── qBittorrent.conf.bak ├── qBittorrent-data.conf ├── rss └── watched_folders.json 对应的 Windows 路径：\n1 %APPDATA%\\qBittorrent 数据文件：\nLinux 下\n1 2 3 4 5 6 ~/.local/share/qBittorrent ├── BT_backup ├── GeoDB ├── logs ├── nova3 └── rss 对应的 Windows 路径：\n1 %LOCALAPPDATA%\\qBittorrent 其中BT_backup就包含了 qbittorrent 的进度和种子等等，为了防止迁移系统或者重置系统导致数据丢失，就可以定时任务备份，路径填写为 %LOCALAPPDATA%\\qBittorrent，这样在新系统不用修改脚本也可以运行，也更加利于教程普适性。\n批处理脚本开发基础 基础命令 1 REM 或者\n1 :: 文件与目录 xcopy\n复制目录及子目录\n1 xcopy source dest /s /e /s: 复制非空目录及其子目录（包含文件和子文件夹）。 /e: 复制所有子目录，包括空目录（需与 /s 一起使用）。 /y：覆盖目标文件时不提示确认。 /d：仅复制源文件中比目标目录更新的文件（增量备份）。 ","date":"2026-04-22T23:56:23+08:00","permalink":"/p/260422235623/","title":"Windows实用鲜为人知的技巧：win+r快速启动程序与命令、cmd命令提示符、环境变量与脚本变量管理、批处理脚本开发"},{"content":"备份：\n终端（管理员）运行\n1 dism /online /export-driver /destination:\u0026#34;备份的文件夹路径\u0026#34; 比如\n1 dism /online /export-driver /destination:\u0026#34;H:\\driver\\jxgm\u0026#34; 恢复\nwin+x 打开设备管理器，找到上方菜单添加驱动，选择刚才备份的文件\n","date":"2026-04-19T22:34:15+08:00","permalink":"/p/260419223415/","title":"Windows备份，恢复驱动"},{"content":"简介 PVE 安装 ikuai （爱快）\n下载固件 下载地址：https://www.ikuai8.com/component/download\n截止到 2026-04-12，最新版本是 iKuai8_x64_3.7.22_Build202603301146\n打开 PVE 后台，点击 local ,选择 ISO 镜像，上传刚才解压的镜像。\n创建虚拟机 进入 PVE，右上角新建虚拟机\n在创建虚拟机页面填入虚拟机名称，勾选高级，选择开机自启动选项，随后下一步\n勾选选择刚才上传的镜像，点击下一步\n系统界面将机型改为q35，勾选Qemu代理，控制器保持VirtIO SCSI single不变，如果你之前下载的是 efi 后缀的镜像务必将 BIOS 改为UEFI启动方式，不带就使用SeaBIOS传统启动，EFI 磁盘默认是没有的，EFI 存储中要手动选择local-lvm分区。\n磁盘修改大小，默认 32G\nCPU 中核心数量根据你的 CPU线程数量选择，例如使用 N5305，这是个四核四线程处理器，则可以分配 4 核心给 虚拟机，如果是 4 核心 8 线程的处理器，则可以分配 8 核心给虚拟机。类别选择host，CPU 权重酌情增加，数字越大能越优先使用 CPU 资源。理论上路由器的 CPU 资源是不会一直吃满的，除非一直运行高负载应用\n内存最低设置 2048 M\n网络设备一般建议直通，不过现在的低功耗 CPU 跑 VirtIO 的网卡也没什么压力，看个人选择。\n我个人设置是有一个口加入了vmbr0的网桥，该口平常是不连线缆的，除非 故障导致 PVE 平台失联我才会连接线缆直连进 PVE 排障，因此网络规划就是一台 同时拥有三张直通网卡和一个桥接在虚拟网桥 vmbr0 的虚拟网卡。\n在这样的规划下我们应当保留网络中桥接vmbr0的配置，并点击下一步，如果你不想要桥接网卡，那请勾选无网络设备。\n最终确认完成后此时我们应当进行引导盘的设置\n选择启动项 默认情况下，虚拟机不会从我们添加的镜像启动，如果此时开启虚拟机会无法找到启动项进入 PXE 模式。\n选择虚拟机名称-选项-引导顺序\n第一次启动选择镜像，取消勾选其他引导设备，安装完系统后，选择从磁盘启动，取消勾选其他设备。\n启动虚拟机 右键虚拟机选择启动或者右上角点击启动选项开启虚拟机。\n然后等待进入系统\n修改 IP 地址 使用控制台的命令设置 IP\n磁盘扩容 略\n","date":"2026-04-12T10:36:09+08:00","permalink":"/p/260412103609/","title":"PVE安装ikuai"},{"content":"下载固件 下载地址：https://downloads.immortalwrt.org\n截止到 2026-04-10，最新版本是 24.10.5\n进入下载页面，选择对应的固件信息，由于是 cpu 是 x86_64，所以选择 x86_64 的版本，对应的目录是 releases/24.10.5/targets/x86/64/，接下来会出现 ext4，squashfs区别，前者方便扩展用户分区，后者可以一键重置系统，本次选择后者。\n后缀选择 img 格式的镜像\n本次下载的是 generic-squashfs-combined-efi.img.gz\n下载之后，进行解压，得到 immortalwrt-24.10.5-x86-64-generic-squashfs-combined-efi\n打开 PVE 后台，点击 local ,选择 ISO 镜像，上传刚才解压的镜像。\n创建虚拟机 进入 PVE，右上角新建虚拟机\n在创建虚拟机页面填入虚拟机名称，勾选高级，选择开机自启动选项，随后下一步\n勾选不适用任何介质安装，点击下一步，因为我们下载的 img 镜像其实内部已经安装有系统了，并不需要 CD 等介质来安装，只需要把 img 镜像转换为磁盘挂载给虚拟机就行。\n系统界面将机型改为q35，勾选Qemu代理，控制器保持VirtIO SCSI single不变，如果你之前下载的是 efi 后缀的镜像务必将 BIOS 改为UEFI启动方式，不带就使用SeaBIOS传统启动，EFI 磁盘默认是没有的，EFI 存储中要手动选择local-lvm分区。\n磁盘中直接删除磁盘，我们下载的镜像中已经包含有操作系统，镜像即是数据盘也是引导盘，因此不需要额外的数据盘。\nCPU 中核心数量根据你的 CPU线程数量选择，例如使用 N5305，这是个四核四线程处理器，则可以分配 4 核心给 ImmortalWrt 虚拟机，如果是 4 核心 8 线程的处理器，则可以分配 8 核心给虚拟机，但是一般没必要，分四个核心就行了。类别选择host，CPU 权重酌情增加，数字越大能越优先使用 CPU 资源。理论上路由器的 CPU 资源是不会一直吃满的，所以设置看上把 CPU 资源全分给了 ImmortalWrt，但是其实在运行过程中是有相当一部分资源空闲的，除非你小马拉大车用 J1900 这种过时的 CPU 跑各种加解密计算把 CPU 全时段占满，不然性能高一些的 CPU 完全可以 1 线程当 2-3 个核心来用\n内存给256MiB 就行，内存如果没有那么紧张把Ballooning设备关了。如果你的内存资源非常吃紧，可以开启该选项把内存调成动态的，最小内存设置为256MiB，让其按需申请\n网络设备一般建议直通，不过现在的低功耗 CPU 跑 VirtIO 的网卡也没什么压力，看个人选择。\n我个人设置是有一个口加入了vmbr0的网桥，该口平常是不连线缆的，除非 ImmortalWrt 故障导致 PVE 平台失联我才会连接线缆直连进 PVE 排障，因此网络规划就是一台 ImmortalWrt 同时拥有三张直通网卡和一个桥接在虚拟网桥 vmbr0 的虚拟网卡。\n在这样的规划下我们应当保留网络中桥接vmbr0的配置，并点击下一步，如果你不想要桥接网卡，那请勾选无网络设备。\n最终确认完成后，我们便得到了一台没有硬盘且只有一张桥接网卡的虚拟机，此时我们应当进行引导盘的设置和直通网卡配置。\n往虚拟机中添加磁盘 往虚拟机中添加磁盘需要依赖 PVE 本身的Shell功能，点击你的 PVE 节点名称，再选择 PVE 本身的Shell。\n通过以下命令导入硬盘镜像到虚拟机中，其中 107 请替换为自己的虚拟机编号，镜像名称需要根据你上传的来，不确定可以使用ls -l /var/lib/vz/template/iso/来确认，local-lvm是让你存虚拟机的分区，如果你没有这个分区，那就是local分区，因为 PVE 在默认安装下是有这个分区的，如果没有可能是你的磁盘太小了只能容纳一个local分区或者你安装的时候更改了磁盘分区方式。\n1 qm disk import 102 /var/lib/vz/template/iso/immortalwrt-24.10.5-x86-64-generic-squashfs-combined-efi.img local-lvm 回到虚拟机配置页面，选择硬件，此时我们会发现有一个未使用的磁盘存在，我们双击该磁盘使用默认状态添加即可。\n磁盘扩容 默认情况下，ImmortalWrt 官方的镜像只有 300MiB 空间，大部分情况下是够用的，但是如果需要留存点东西就比较麻烦了，我个人是建议在磁盘空余的情况下扩容 2GiB 存储。\n选中刚刚添加的磁盘，点击磁盘操作，选择调整大小，增量大小填入2后点击调整磁盘大小。\n但此时分区并未扩容，因为这只是增加了虚拟磁盘的大小，而分区的大小未改变，因此我们在进入系统后需要进行二次更改。\n选择启动项 默认情况下，OpenWrt 虚拟机不会从我们添加的镜像启动，如果此时开启虚拟机会无法找到启动项进入 PXE 模式。\n选择虚拟机名称-选项-引导顺序\n勾选scsi0，并拖动至第一顺位，并取消勾选net0网络启动和ide2 CD 启动，即可成功设置启动项。切记一定要取消net0启动项，因为 PVE8 默认需要安全启动，而 OpenWrt 的镜像是无法安全启动的，不取消网络启动后续可能因为安全启动失败回落至网络启动无法进入系统。\n启动虚拟机 右键虚拟机选择启动或者右上角点击启动选项开启虚拟机。\n点击控制台，查看启动情况，如果出现 No bootable option or ddevice was found，按下任意键，关闭安全启动\n进入 Device Manager\n进入 Secure Boot Configuration\n按下空格键，取消勾选\n修改完成后，随后一路按Esc键退出到Boot Manager首页，选择Continue并回车。\n然后等待进入系统\n修改 IP 地址 1 vi /etc/config/netwrok 修改 lan 部分\n重启网络服务\n1 /etc/init.d/network restart 更换源\n1 2 3 4 # 一键修改 sed -e \u0026#39;s,https://downloads.immortalwrt.org,https://mirrors.cernet.edu.cn/immortalwrt,g\u0026#39; \\ -e \u0026#39;s,https://mirrors.vsean.net/openwrt,https://mirrors.cernet.edu.cn/immortalwrt,g\u0026#39; \\ -i.bak /etc/opkg/distfeeds.conf 磁盘扩容 参考：# 基于 efi 启动的 squashfs 格式的 immortalwrt/或 openwrt 软路由系统 overlay 空间扩容\n","date":"2026-04-10T08:58:29+08:00","permalink":"/p/260410085829/","title":"PVE环境安装immortalwrt"},{"content":"","date":"2026-04-08T20:48:29+08:00","permalink":"/p/260408204829/","title":"交换机配置DHCP"},{"content":"修改注册表实现\nwin + r 打开运行，输入 regedit 打开注册表\n输入\n1 计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp 修改 PortNumber 的值，修改为自己需要的端口号\n输入\n1 计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp 修改 PortNumber 的值，修改为自己需要的端口号\nwin + r 打开运行，输入 services.msc 打开服务\n重启 Remote Desktop Services服务\nwin + r，输入 mstsc 打开远程连接\n输入 IP/域名:端口号连接\n","date":"2026-04-08T09:36:23+08:00","permalink":"/p/260408093623/","title":"Windows远程桌面修改端口"},{"content":"简介 安装 自动部署镜像工具 参考：https://www.emulatedlab.com/thread-2311-1-1.html\n进入 eve-ng 终端，安装 eid\n1 2 3 4 5 # 下载脚本 wget https://i.grbj.cn/eid # 赋予执行权限 chmod +x eid 使用 root 用户运行\n1 ./eid 查看列表： 输入 L 查看所有可用镜像。 搜索下载： 直接输入镜像名称（如 h3c-vbras）进行搜索并安装。 退出： 输入 Q 退出程序。 ","date":"2026-04-05T10:05:22+08:00","permalink":"/p/260405100522/","title":"eve-ng-ce使用手册"},{"content":"VPC设置IP\n1 vi /etc/network/interfaces 1 2 3 4 5 6 iface eth0 inet static hostname localhost address 10.9.10.1 netmask 255.255.255.0 gateway 10.9.10.254 dns-nameservers 119.29.29.29 1 /etc/init.d/networking restart ","date":"2026-04-03T18:07:03+08:00","permalink":"/p/260403180703/","title":"eve-ng设备使用"},{"content":"简介 部署 Docker docker compose\n1 2 3 mkdir -p /srv/container_srv/uptime-kuma cd /srv/container_srv/uptime-kuma vim docker-compose.yml 1 2 3 4 5 6 7 8 9 services: uptime-kuma: image: louislam/uptime-kuma:2 container_name: uptime-kuma volumes: - ./uptime-kuma_data:/app/data ports: - \u0026#34;3001:3001\u0026#34; restart: unless-stopped 1 docker compose up -d ","date":"2026-03-15T12:25:11+08:00","permalink":"/p/260315122511/","title":"uptime-kuma，一款精致的自主监控工具"},{"content":"简介 部署 Docker docker compose\n1 2 3 mkdir -p /srv/container_srv/subconverter cd /srv/container_srv/subconverter vim docker-compose.yml 1 2 3 4 5 6 7 8 9 --- version: \u0026#39;3\u0026#39; services: subconverter: image: tindy2013/subconverter:latest container_name: subconverter ports: - \u0026#34;15051:25500\u0026#34; restart: unless-stopped 1 dco up -d ","date":"2026-03-15T12:11:32+08:00","permalink":"/p/260315121132/","title":"subconverter，用于在各种代理订阅格式之间转换的实用工具"},{"content":"查看源\n","date":"2026-03-15T09:57:09+08:00","permalink":"/p/260315095709/","title":"NPM使用手册"},{"content":"简介 部署 Docker 1 docker run -p 8080:8080 -d --name speedtest --rm ghcr.io/librespeed/speedtest ","date":"2026-03-12T23:51:05+08:00","permalink":"/p/260312235105/","title":"自建测速网站speedtest"},{"content":"简介 一个全托管的 AI 助手\n安装 Windows 安装 nodejs：\n前往 nodejs 官网下载 Windows 版本的 nodejs，下载后安装，跟着操作步骤即可。\n安装后将 node 加入到环境变量。\n打开终端（cmd/powershell），输入以下命令查看是否安装成功\n1 node -v 如果提示有版本号就是安装成功\n安装 openclaw：\n打开终端，按照以下步骤\n1 2 ## npm安装openclaw npm install -g openclaw@latest 如果超时，没有安装成功，使用 pnpm 安装 openclaw\n1 2 3 4 5 npm install -g pnpm pnpm setup ## 新开一个终端执行以下命令 pnpm add -g openclaw@latest Linux 安装 nodejs：\n1 2 3 4 5 6 7 8 ## 安装nvm wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash source .bashrc ## 安装nodejs # 安装lts版本 nvm install --lts # 安装默认的 lts 版本 安装后将 node 加入到环境变量。\n打开终端，输入以下命令查看是否安装成功\n1 node -v 如果提示有版本号就是安装成功\n安装 openclaw：\n打开终端，按照以下步骤\n1 2 ## npm安装openclaw npm install -g openclaw@latest 如果超时，没有安装成功，使用 pnpm 安装 openclaw\n1 2 3 4 5 6 npm install -g pnpm pnpm setup source .bashrc pnpm add -g openclaw@latest 使用 进入配置\n1 openclaw onboard --install-daemon 命令 信息渠道 删除飞书\n1 openclaw channels remove --channel feishu --delete ","date":"2026-03-10T11:24:23+08:00","permalink":"/p/260310112423/","title":"OpenClaw，真正会做事的 AI。"},{"content":"TCL 设置，关于本机，本机信息，按 上，下，左，右键，出现 adb 开关，选择开。\n下载 adb 软件\n进入命令行窗口，使用 adb 连接电视\n1 adb connect 电视ip地址 此时电视出现 adb 调试，选择确定。\n命令行进入 adb shell\n1 adb shell 查看安装的系统软件\n1 pm list packages 卸载系统软件\n1 pm uninstall --user 0 包名 ","date":"2026-02-24T18:37:53+08:00","permalink":"/p/260224183753/","title":"电视开启ADB"},{"content":"简介 Nmap（Network Mapper，网络映射器）是一款开源的、功能强大的 网络发现和安全审计工具，广泛用于网络探测、主机发现、端口扫描、服务识别、操作系统检测、漏洞扫描等任务。它由 Gordon Lyon（化名 Fyodor）于 1997 年首次发布，目前已成为网络安全领域最常用和最受信赖的工具之一。\n官网：https://nmap.org/\n安装 Windows：\n下载 nmap-7.98-setup.exe，直接安装\nDebian/Ubuntu：\n1 apt update \u0026amp;\u0026amp; apt install nmap 使用 扫描某个段的 IP 和端口情况 1 nmap 192.168.1.0/24 等待一会儿，可通过 “Enter”键查看扫描进度\n输出：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Nmap scan report for 192.168.1.1 Host is up (0.011s latency). Not shown: 998 filtered tcp ports (no-response) PORT STATE SERVICE 80/tcp open http 1900/tcp open upnp MAC Address: F4:2A:7D:39:44:A8 (TP-Link Technologies) Nmap scan report for 192.168.1.11 Host is up (0.012s latency). Not shown: 996 closed tcp ports (reset) PORT STATE SERVICE 9090/tcp open zeus-admin 50001/tcp open unknown 50002/tcp open iiimsf 50003/tcp open unknown MAC Address: 86:BC:A8:FF:68:6E (Unknown) Nmap scan report for 192.168.1.100 Host is up (0.020s latency). All 1000 scanned ports on 192.168.1.100 are in ignored states. Not shown: 1000 closed tcp ports (reset) MAC Address: 16:23:22:62:30:AC (Unknown) Stats: 0:00:14 elapsed; 255 hosts completed (4 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 67.00% done; ETC: 16:19 (0:00:00 remaining) Nmap scan report for 192.168.1.10 Host is up (0.00s latency). Not shown: 993 closed tcp ports (reset) PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds 902/tcp open iss-realsecure 912/tcp open apex-mesh 3306/tcp open mysql 5357/tcp open wsdapi Nmap done: 256 IP addresses (4 hosts up) scanned in 14.53 seconds ","date":"2026-02-06T16:16:48+08:00","permalink":"/p/260206161648/","title":"Nmap使用"},{"content":"简介 ","date":"2026-02-05T20:27:10+08:00","permalink":"/p/260205202710/","title":"刮削软件tinymediamanager"},{"content":"简介 trzsz-ssh ( tssh ) 设计为 ssh 客户端的直接替代品，提供与 openssh 完全兼容的基础功能，同时实现其他有用的扩展功能。\ntrzsz-ssh ( tssh ) 与 tsshd 一起，适用于高延迟的弱网连接，切换网络、休眠与唤醒都不会掉线，让 ssh 会话永远保持。\n官网：https://trzsz.github.io/cn/ssh.html\n特性 服务器太多，记不住所有别名，tssh 内置登录界面，支持搜索和选择服务器登录。 tssh 登录服务器后，内置支持 trzsz ( trz / tsz ) 工具，传文件无需另外新开窗口。 有时需要同时登录一批机器，tssh 支持多选并批量登录，同时支持执行预设的命令。 有些服务器不支持公钥登录，tssh 支持记住密码，支持自动交互，提升登录的效率。 在 Windows 中使用 tssh 代替 trzsz ssh，可以解决 trz 上传速度很慢的问题。 tssh 与 tsshd 类似于 mosh，解决了部分 mosh 的问题，例如 SSH 转发和 ProxyJump 等。 安装 Windows 可用 scoop / winget / choco 安装 1 scoop install tssh 1 winget install tssh 1 choco install tssh MacOS 可用 Homebrew 安装 1 2 brew update brew install trzsz-ssh Ubuntu 可用 apt 安装 1 2 3 4 sudo apt update \u0026amp;\u0026amp; sudo apt install software-properties-common sudo add-apt-repository ppa:trzsz/ppa \u0026amp;\u0026amp; sudo apt update sudo apt install tssh Debian 可用 apt 安装 1 2 3 4 5 6 7 8 sudo apt install curl gpg curl -s \u0026#39;https://keyserver.ubuntu.com/pks/lookup?op=get\u0026amp;search=0x7074ce75da7cc691c1ae1a7c7e51d1ad956055ca\u0026#39; \\ | gpg --dearmor -o /usr/share/keyrings/trzsz.gpg echo \u0026#39;deb [signed-by=/usr/share/keyrings/trzsz.gpg] https://ppa.launchpadcontent.net/trzsz/ppa/ubuntu jammy main\u0026#39; \\ | sudo tee /etc/apt/sources.list.d/trzsz.list sudo apt update sudo apt install tssh ","date":"2026-02-02T09:42:46+08:00","permalink":"/p/260202094246/","title":"TSSH，一个兼容 tmux 的文件传输工具，和 lrzsz ( rz、sz ) 类似，并且有进度条和支持目录传输"},{"content":"简介 pve9 上部署黑群晖\n步骤 创建虚拟机 创建虚拟机： 导入\n1 qm importdisk 100 rr-25.12.1/rr.img local-lvm 公钥免密登录 在群晖上为了实现 ssh 免密登录需要做以下操作：\n生成密钥对：ssh-keygen -t ed25519 将生成的密钥对的公钥加入到群晖家目录下的 .ssh/authorized_keys文件中 修改群晖家目录 .ssh权限 700，authorized_keys为 600（重要） 参考命令：\n1 2 3 4 5 6 ssh-keygen -t ed25519 cat \u0026#34;密钥对的公钥\u0026#34; \u0026gt;\u0026gt; ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ","date":"2026-02-01T22:57:40+08:00","permalink":"/p/260201225740/","title":"PVE安装黑群晖和使用指南"},{"content":"在 Visual Studio Code (VS Code) 中配置 MSYS2 Shell（如 UCRT64, MinGW64 等）最稳健的方法是通过修改 settings.json 配置文件。\n以下是详细的步骤，假设你的 MSYS2 安装在默认路径 C:\\msys64。\n1. 打开设置文件 (settings.json) 在 VS Code 中按下快捷键 Ctrl + Shift + P 打开命令面板。 输入 Open Settings (JSON) 并选择 “首选项：打开用户设置 (JSON)” (Preferences: Open User Settings (JSON))。 2. 添加终端配置 在 settings.json 的大括号 { ... } 中，添加（或修改）terminal.integrated.profiles.windows 部分。\n这里推荐使用 UCRT64 环境（MSYS2 推荐的现代标准），如果你需要 MinGW64，只需将代码中的 UCRT64 替换为 MINGW64 即可。\nJSON\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026#34;terminal.integrated.profiles.windows\u0026#34;: { \u0026#34;MSYS2 UCRT64\u0026#34;: { \u0026#34;path\u0026#34;: \u0026#34;C:\\\\msys64\\\\usr\\\\bin\\\\bash.exe\u0026#34;, \u0026#34;args\u0026#34;: [ \u0026#34;--login\u0026#34;, \u0026#34;-i\u0026#34; ], \u0026#34;env\u0026#34;: { \u0026#34;MSYSTEM\u0026#34;: \u0026#34;UCRT64\u0026#34;, \u0026#34;CHERE_INVOKING\u0026#34;: \u0026#34;1\u0026#34;, \u0026#34;MSYS2_PATH_TYPE\u0026#34;: \u0026#34;inherit\u0026#34; }, \u0026#34;icon\u0026#34;: \u0026#34;terminal-bash\u0026#34; } }, // 可选：将其设置为默认终端 \u0026#34;terminal.integrated.defaultProfile.windows\u0026#34;: \u0026#34;MSYS2 UCRT64\u0026#34;, 关键参数解释 path: 指向 MSYS2 内部的 bash 可执行文件。注意：路径中的反斜杠需要转义（即使用 \\\\）。 args: [\u0026quot;--login\u0026quot;, \u0026quot;-i\u0026quot;] 确保 shell 作为登录 shell 启动，加载所有必要的配置文件（如 .bashrc）。 MSYSTEM: UCRT64: 使用现代的 Universal C Runtime (推荐)。 MINGW64: 使用旧版的 MSVCRT (传统 MinGW)。 CHERE_INVOKING: \u0026ldquo;1\u0026rdquo;: 非常重要。这告诉 bash 保持在当前工作目录（即你 VS Code 打开的项目文件夹），而不是跳转到 MSYS2 的用户 Home 目录。 MSYS2_PATH_TYPE: \u0026ldquo;inherit\u0026rdquo;: (可选) 允许你在 MSYS2 终端中使用 Windows 系统环境变量中的工具（例如 Windows 上安装的 Python 或 Node.js）。如果你希望环境纯净，可以删掉这一行。 3. 验证与使用 保存 settings.json 文件。 按下 Ctrl + ` 打开终端面板。 点击终端面板右上角的 + 号旁边的下拉箭头。 你应该能看到 \u0026ldquo;MSYS2 UCRT64\u0026rdquo; 的选项，点击即可启动。 常见问题排查 乱码问题: 如果中文显示乱码，请确保你的系统区域设置支持 UTF-8，或者在 MSYS2 的 .bashrc 文件中添加 export LANG=\u0026quot;zh_CN.UTF-8\u0026quot;。 路径不同: 如果你的安装路径不是 C:\\msys64，请务必修改 JSON 中的路径。 您希望我帮您配置 tasks.json 以便直接在 VS Code 中使用 gcc 或 make 编译项目吗？\n","date":"2025-12-26T18:44:28+08:00","permalink":"/p/251226184428/","title":"VSCode修改默认终端"},{"content":"简介 官网：https://superset.apache.org/\n部署 docker compose ","date":"2025-12-25T22:25:57+08:00","permalink":"/p/251225222557/","title":"superset，一款开源的可视化平台"},{"content":"简介 部署 Docker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 version: \u0026#34;3\u0026#34; networks: gitea: external: false services: server: image: docker.gitea.com/gitea:1.25.3 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 restart: unless-stopped networks: - gitea volumes: - ./gitea:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - \u0026#34;8418:3000\u0026#34; - \u0026#34;222:22\u0026#34; 使用 PostgreSQL 作为数据库 在安装 Gitea 时，通常建议为它创建一个专用的数据库用户和数据库。\n以下是使用 psql 命令行工具完成此操作的步骤和命令：\n1. 进入 PostgreSQL 终端 首先，你需要以 postgres 超级用户身份登录到控制台（假设你在 Linux 环境下）：\nBash\n1 sudo -u postgres psql 2. 执行创建命令 (SQL) 进入 postgres=# 提示符后，请依次运行以下 SQL 命令。\n请注意： 将 '你的强密码' 替换为你自己设置的真实密码。\nSQL\n1 2 3 4 5 6 7 8 9 10 -- 1. 创建名为 gitea 的用户，并设置密码 CREATE USER gitea WITH PASSWORD \u0026#39;你的强密码\u0026#39;; -- 2. 创建名为 gitea 的数据库，并将所有者设置为 gitea 用户 -- Gitea 强烈建议使用 UTF8 编码 CREATE DATABASE gitea OWNER gitea ENCODING \u0026#39;UTF8\u0026#39;; -- 3. (可选但推荐) 授予该用户对数据库的所有权限 -- 实际上设置了 OWNER 之后通常已经具备权限，但为了确保无误可以再次授权 GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea; 3. 如果你使用的是 PostgreSQL 15 或更高版本 PostgreSQL 15 更改了 public schema 的默认权限。虽然将数据库 owner 设置为 gitea 通常足够，但为了防止 Gitea 在建表时遇到权限问题，建议在连接到 gitea 数据库后执行以下操作：\nSQL\n1 2 3 4 5 -- 连接到刚创建的 gitea 数据库 \\c gitea -- 授予 public schema 的权限 GRANT ALL ON SCHEMA public TO gitea; 4. 退出 完成后，输入以下命令退出 psql：\nSQL\n1 \\q 配置 Gitea 安装向导时的对应填写： 当你打开 Gitea 的网页安装向导时，请按照以下信息填写：\n数据库类型 (Database Type): PostgreSQL 主机 (Host): 127.0.0.1:5432 (或者是你的数据库服务器 IP) 用户名 (Username): gitea 密码 (Password): (你刚才设置的强密码) 数据库名称 (Database Name): gitea ","date":"2025-12-25T11:45:12+08:00","permalink":"/p/251225114512/","title":"gitea安装"},{"content":"","date":"2025-12-25T11:33:39+08:00","permalink":"/p/251225113339/","title":"PostgreSQL自带终端命令使用"},{"content":" ","date":"2025-12-25T08:39:28+08:00","permalink":"/p/251225083928/","title":"dart从入门到放弃（bushi）"},{"content":"问题 1 VMware workstation 在 nat 网络模式下，宿主机无法 ping 通虚拟机，虚拟机可以 ping 通宿主机 环境：Windows 10 专业工作站版\n已经经历过的操作：\n重置 vmware network adapter vmnet8 网卡，无效 禁用 vmware network adapter vmnet8，重新启用，无效 解决办法 Windows 进入控制面板-系统和安全-Windows defer 防火墙-高级设置-入站规则-启用规则：文件和打印机共享(回显请求 - ICMPv4-In)\n再尝试从宿主机 ping 虚拟机\n总结 根据这个规则设置，可以判断大概率是 Windows 安全设置导致，而非 VMware 本身的问题，但是在此之前，已经重置过 VMware 虚拟网络 nat 网卡，不排除 VMware 的问题，但是在 Windows 环境下，首先应该更改 window 安全设置之后再尝试其他方法\n问题 2 VMware workstation 在 nat 网络模式下，虚拟机无法 ping 通宿主机，宿主机可以 ping 通虚拟机 环境：Windows 10 专业工作站版\n已经经历过的操作：\n重置 vmware network adapter vmnet8 网卡，无效 禁用 vmware network adapter vmnet8，重新启用，无效 解决办法 虚拟机 IP 网关设置为 xxx.xxx.xxx.2 而非 xxx.xxx.xxx.1\n总结 略\n","date":"2025-12-19T09:12:08+08:00","permalink":"/p/251219091208/","title":"VMware宿主机与虚拟机互通问题"},{"content":"简介 SublinkPro 是基于优秀的开源项目 sublinkX / sublinkE 进行二次开发，在原项目基础上做了部分定制优化。感谢原作者的付出与贡献。\n🎨 前端框架：基于 Berry Free React Material UI Admin Template ⚡ 后端技术：Go + Gin + Gorm 🔐 默认账号：admin / 123456（请安装后务必修改） 💻 演示系统: https://sublink-pro-demo.zeabur.app 用户名：admin 密码：123456 官网：https://github.com/ZeroDeng01/sublinkPro\n部署 docker compose\n1 2 3 mkdir -p /srv/container_srv/sublinkpro cd /srv/container_srv/sublinkpro vim docker-compose 1 2 3 4 5 6 7 8 9 10 11 12 services: sublinkpro: # image: zerodeng/sublink-pro:dev # 开发版（功能尝鲜使用） image: zerodeng/sublink-pro # 稳定版 container_name: sublinkpro ports: - \u0026#34;8000:8000\u0026#34; volumes: - \u0026#34;./db:/app/db\u0026#34; - \u0026#34;./template:/app/template\u0026#34; - \u0026#34;./logs:/app/logs\u0026#34; restart: unless-stopped 1 docker compose up -d ","date":"2025-12-16T22:41:40+08:00","permalink":"/p/251216224140/","title":"SublinkPro，强大的代理订阅管理与转换工具"},{"content":"在了解 mpv 之后，如果出现什么未知的问题，可以通过命令行启动的方式打印 log 以供排查\n1 mpv --gpu-debug --log-file=output.log xxx.mp4 替换其中的 xxx.mp4 即可，将会将播放日志输出到 output.log\n","date":"2025-12-13T00:21:13+08:00","permalink":"/p/251213002113/","title":"MPV播放器入门指南-第六期：调试"},{"content":"Greetings,​\nI’m writing to appeal the disablement of my account (xxx@gmail.com). As a U.S. user residing in China, I rely on a legitimate VPN to access Google services—this is the only feasible way, given local accessibility restrictions.​\nFrequent VPN toggling (due to network instability) and my roommate’s account logging in via the same WiFi likely caused an IP-based misjudgment of “mass creation/robot use.” I created this account manually for [personal/study/work] use, with no bot involvement.​\nI will switch to a stable dedicated VPN. Please re-review and reactivate my indispensable account.​\nThank you so much.\n","date":"2025-12-11T23:39:20+08:00","permalink":"/p/251211233920/","title":"google账户申诉"},{"content":"简介 Zabbix 是一款开源的分布式监控系统，用于实时监控服务器、网络设备、应用程序和服务的运行状态。它支持多种监控方式（如主动/被动检查、SNMP、IPMI、JMX 等），并提供强大的告警机制、数据可视化和历史数据分析功能。\n官网：https://www.zabbix.com/cn\n部署 Zabbix 7.0 LTS，Ubuntu，24.04（Noble），Server, Fronted, Agent，PostgresSQL，Nginx 切换到 root 用户\n1 sudo su - 进入这个页面选择对应的版本，后续的命令跟这个选择有所关系\n本次选择的是：Zabbix 7.0 LTS，Ubuntu，24.04（Noble），Server, Fronted, Agent，PostgresSQL，Nginx\n下载安装 Zabbix repository\n1 2 3 4 5 wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb apt update 安装 Zabbix server，Web 前端，agent\n1 apt install zabbix-server-pgsql zabbix-frontend-php php8.3-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-agent 安装 postgresql\n1 apt install postgresql-16 创建初始数据库\n1 2 sudo -u postgres createuser --pwprompt zabbix sudo -u postgres createdb -O zabbix zabbix 导入初始架构和数据，系统将提示您输入新创建的密码。\n1 zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix 为 Zabbix server 配置数据库：编辑配置文件 /etc/zabbix/zabbix_server.conf\n1 DBPassword=password 为 Zabbix 前端配置 PHP ：编辑配置文件 /etc/zabbix/nginx.conf uncomment and set \u0026rsquo;listen\u0026rsquo; and \u0026lsquo;server_name\u0026rsquo; directives.\n1 2 listen 8080; server_name example.com; 启动 Zabbix server 和 agent 进程 ：启动 Zabbix server 和 agent 进程，并为它们设置开机自启：\n1 2 systemctl restart zabbix-server zabbix-agent nginx php8.3-fpm systemctl enable zabbix-server zabbix-agent nginx php8.3-fpm 访问网页：http://ip:8080\n默认账户：Admin 默认密码：zabbix\n","date":"2025-12-11T14:28:00+08:00","permalink":"/p/251211142800/","title":"Zabbix，一款开源的分布式监控系统"},{"content":"简介 Grafana 是一款采用 Go 语言编写的开源应用，主要用于大规模指标数据的可视化展现\n是网络架构和应用分析中最流行的时序数据展示工具，目前已经支持绝大部分常用的时序数据库。\n官网：https://grafana.com/zh-cn/grafana/\n部署 Ubuntu / Debian\n1 2 3 sudo apt-get install -y adduser libfontconfig1 musl wget https://dl.grafana.com/grafana-enterprise/release/12.3.0/grafana-enterprise_12.3.0_19497075765_linux_amd64.deb sudo dpkg -i grafana-enterprise_12.3.0_19497075765_linux_amd64.deb 启动\n1 2 3 4 sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable grafana-server sudo /bin/systemctl start grafana-server 默认用户名：admin 默认密码：admin\n访问：http://ip:3000\n对接 Zabbix grafana 机器安装插件\n1 grafana-cli plugins install alexanderzobnin-zabbix-app 重启 grafana-server\n1 systemctl restart grafana-server.service 登录 Grafana 网页，首页》管理》插件》搜索 zabbix，启用》添加数据源\n","date":"2025-12-11T13:53:49+08:00","permalink":"/p/251211135349/","title":"Grafana，一款采用 Go 语言编写的开源应用，主要用于大规模指标数据的可视化展现"},{"content":"简介 rsync 是一个在类 Unix 系统（如 Linux、macOS）中广泛使用的命令行工具，用于 同步文件和目录。它的核心功能是在本地或远程系统之间高效地复制、备份和同步数据。是一个快速 + 增量 + 安全 + 灵活的文件同步工具\n美中不足的是在 Windows 环境下并没有原生的官方支持，所以在 Windows 下安装 rsync 会显得很麻烦。\n网上搜罗了很多教程，都是不可用的，再次怀疑他们是否成功过，并且内容高度相仿。\n在我的努力下，最终实现了轻量级在 Windows 平台下使用 rsync\n在开始之前，我先总结我踩过的坑：\nWSL，WSL 是 Windows 的子系统 Linux，能够提供原生 Linux 的体验，由于 rsync 是一个类 Unix 的软件，自然在 WSL 上安装较为流畅，缺点是什么呢？自然是太重了，为了使用 rsync 要启动 WSL，内存占用一大截，在我的新系统自然是没有安装 WSL 的。也不想为了使用 rsync 安装 WSL，如果你本身就有使用 WSL 的需求，在 WSL 下使用 rsync 是一个好的选择 Git bash，提供了一个类似 Unix 的终端体验，其基于 MSYS2 模拟的终端环境，集成了 git，和常用的 Unix 命令。 基于以上情况，在 git bash 下安装 rsync 不失为一个选择？然后就开始了安装之路，首先就遇到了一个问题，没有包管理器？意味着需要手动下载，然后开始了漫长的依赖处理，见后文错误记录。。。 最终 rsync 可以在 cmd 下使用了，输入 rsync --version能够出现提示，但是！由于 cmd 下盘符路径是这样的C:,D:传输的时候显示都是远程路径， 此处失败。 既然 cmd 提示下使用 C:路径有问题，那就在 git bash 下使用，毕竟在 git bash 下路径是这样的 /c , /d，结果在传输的时候，提示依旧失败，具体错误没记录，好像是 dump() faild...，此处失败。但是处理这个问题的时候，想到了一个方案，后续的成功就是吸取了此处。 rsync-win，这是一个开源项目，也是一位作者在 Window 上使用 rsync 出现问题时，重新使用 rust 编写的一个方案，下载使用后，传输倒是能传输，但是毕竟和原本有差距，命令也不一样，遂即放弃了。 经过了上述的尝试，身心已经疲惫，但是依旧尚未成功，还需继续努力。\n在处理最后一个尝试的时候，想到了既然 git bash 是基于 msys2 的，它没有包管理器，msys2 远程是否自带包管理器？毕竟曾经问过 ai，ai 的回答是有 pacman的，在我的印象里，这是 Arch Linux 的包管理器，想到了 git bash 安装 rsync 是手动下载的，git bash，rsync，依赖版本就无法控制，失败极有可能是版本兼容的问题，既然如此，msys2 自带包管理器，这个问题就有可能解决。就此开始\n安装 进入 msys2 官网，下载msys2\n或者直接 点击下载 msys2-x86_64-20251213.exe\n安装后，进入安装目录，点击 msys2.exe 会出现类似于 git bash 终端的界面，使用 pacman -S rsync可以直接安装rsync，自动处理依赖，就此安装完成。就是这么简单！\n接下来在 msys2终端下就可以正常使用 rsync 了。\n集成到 Windows terminal 在安装好 msys2 以后，如何更加方便的在 Windows11 下使用呢？\n借助于 Windows11 自带的 terminal 终端，将 msys2 集成到里面。\n随便一个位置右键打开终端 新建标签旁下来箭头，打开设置(Ctrl + ,) 左侧菜单下来，找到配置文件，新建一个配置文件 名称可自定义，为了方便见名知意，就叫为 msys2 命令行为 msys2安装目录\\msys2_shell.cmd -defterm -no-start -use-full-path -here -mingw64 图标改为 msys2.ico 即可，在 msys2 安装目录下可以找到 保存 退出，重新打开 Windows termial， 现在新建标签旁的下来菜单就会出现 msys2\n如果你想把 msys2设置为终端默认值，也就是右键打开就是 msys2，在 Windows terminal 设置界面，将：启动》默认配置文件，设置为 msys2 即可\n错误记录 Git bash git bash 下安装 rsync\n安装 git for windows\n下载 rsync-3.4.1-1-x86_64.pkg.tar.zst获取rsync.exe，移动到 git 下的bin目录\n下载 libopenssl-3.6.0-1-x86_64.pkg.tar.zst获取msys-cypto-3.dll，移动到 git 下的bin目录\n下载 libiconv-1.18-1-x86_64.pkg.tar.zst获取msys-iconv-2.dll，移动到 git 下的bin目录\n下载 liblz4-1.10.0-1-x86_64.pkg.tar.zst获取msys-lz4-1.dll，移动到 git 下的bin目录\n下载 msys-2.0获取msys-2.0.dll，移动到 git 下的bin目录\n下载 msys-xxhash-0获取msys-xxhash-0.dll，移动到 git 下的bin目录\n下载 msys-zstd-1获取msys-zstd-1.dll，移动到 git 下的bin目录\n","date":"2025-12-11T08:54:23+08:00","permalink":"/p/251211085423/","title":"rsync，windows环境下使用"},{"content":"简介 已经在防火墙放行了所有协议的端口，所有协议，还是不可以\n系统是 Ubuntu 24.04，解决办法：\n使用 iptables 添加两条新的规则，禁用 iptables 服务也没有效果\n1 2 sudo iptables -I INPUT 5 -p tcp -j ACCEPT sudo iptables -I INPUT 5 -p udp -j ACCEPT ","date":"2025-12-10T18:59:13+08:00","permalink":"/p/251210185913/","title":"甲骨文服务器访问访问不了"},{"content":"略\n","date":"2025-12-08T21:37:34+08:00","permalink":"/p/251208213734/","title":"n8n，工作流搭建"},{"content":"前言：好久没有出现大模型质量对比测试的视频或帖子了\n疑问1：为什么会有这个帖子？\n答：应付如下的使用场景\n使用场景：使用大模型回答超出个人的能力范围的疑问或者减低实际繁琐操作的步骤。\n既然是超出了个人的能力范围，那么对于大模型的回答你就不能判断是否正确。所以一个回答正确率高大模型才是最重要的。\n众所周知：大模型是基于投喂的知识库总结出的回答，那么，他的知识库更新日期和模型训练能力将决定它的实际效果。下面将以如下的提问询问各种渠道的大模型\n为了保证实际体验，所有测试的模型只问一次，问题相同\n问题来自 https://linux.do/t/topic/1281646\n具体问题：\n1 sing-box内核如何搭建vless+ws+cdn+tls ，使用sing-box内核编写配置文件的方式。 [details=\u0026ldquo;Gemini AI Pro 思考模式（3 Pro）\u0026rdquo;] 搭建 Sing-Box 内核的 VLESS + WebSocket (WS) + TLS + CDN 方案，重点在于配置文件的编写。这个组合的优势在于它可以隐藏在正常的 HTTPS 流量中，并且可以套用 Cloudflare 等 CDN 来隐藏真实 IP。\n以下是详细的手动配置指南和完整的 config.json 文件结构。\n1. 核心准备工作 在编写配置之前，请确保你已经准备好：\n域名：托管在 Cloudflare（如果需要 CDN 功能）。 证书：域名的 SSL 证书文件（.crt 和 .key）。推荐使用 acme.sh 或 certbot 申请免费证书。 UUID：生成一个 UUID 作为密码（命令行输入 sing-box generate uuid 即可获得）。 2. 服务端配置文件 (Server) 在服务器上，Sing-Box 的配置文件通常位于 /etc/sing-box/config.json。\n关键点说明：\nInbounds (入站)：配置 vless 协议，监听 443 端口。 Transport (传输层)：指定 ws (WebSocket)，并设置 path（路径）。 TLS：开启 TLS，并指向你的证书文件路径。 完整 config.json 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;你的-UUID-填在这里\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;你的域名.com\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;/path/to/your/cert.crt\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/path/to/your/private.key\u0026#34; }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/yourpath\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;你的域名.com\u0026#34; } } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ] } ⚠️ 修改指南：\nUUID: 替换 你的-UUID-填在这里。 server_name: 替换为你的真实域名。 证书路径: 修改 certificate_path 和 key_path 为你服务器上证书的实际绝对路径。 Path: /yourpath 是 WebSocket 的路径，可以自定义（如 /chat），客户端必须填一样的。 3. 关于 CDN (Cloudflare) 的设置 要启用 CDN（隐藏 IP）：\nCloudflare 后台：在 DNS 设置中，将你的域名记录（A 记录）的“代理状态”由 灰色云朵 改为 橙色云朵 (Proxied)。 SSL/TLS 设置：在 Cloudflare 的 SSL/TLS 选项卡中，将加密模式设置为 Full (Strict)。 原因：我们的 Sing-Box 配置了真实有效的证书，所以用 Strict 模式最安全且不容易报错。 4. 客户端配置 (Client) 客户端（如 v2rayN, Nekobox, 或 Sing-Box 客户端）需要添加一个 VLESS 服务器。如果使用 Sing-Box 内核作为客户端，配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;proxy-vless\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;你的域名.com\u0026#34;, \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;你的-UUID-填在这里\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;你的域名.com\u0026#34;, \u0026#34;utls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;fingerprint\u0026#34;: \u0026#34;chrome\u0026#34; } }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/yourpath\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;你的域名.com\u0026#34; } }, \u0026#34;packet_encoding\u0026#34;: \u0026#34;xudp\u0026#34; } ] } 客户端设置重点：\n地址 (address): 填你的域名（Cloudflare 会解析到 CDN IP，CDN 再转发给你）。 端口 (port): 必须是 Cloudflare 支持的 HTTPS 端口（通常是 443，也可以是 2053, 2083, 2087, 2096）。 传输协议: WebSocket (ws)。 Host / SNI: 必须填写你的域名。 Path: 必须与服务端完全一致。 5. 启动与调试 配置完成后，使用以下命令运行 Sing-Box：\n1 2 3 4 5 # 测试配置文件是否有语法错误 sing-box check -c /etc/sing-box/config.json # 启动服务 sing-box run -c /etc/sing-box/config.json 如果使用 Systemd 管理（推荐）：\n1 2 3 systemctl start sing-box systemctl enable sing-box systemctl status sing-box 常见问题排查 Error 403/404: 通常是 path 路径不匹配，或者 Cloudflare 还没有生效（等待几分钟）。 握手失败 (Handshake failed): 检查服务器时间是否与标准时间同步，时间误差过大会导致 TLS 握手失败。 证书权限: 确保 sing-box 运行的用户有权限读取证书文件。 [/details] [details=\u0026ldquo;Chatgpt 网页免费版\u0026rdquo;] 要在 sing-box 内核中搭建 VLESS + WS + CDN + TLS，你需要根据 sing-box 的配置文件语法来正确设置。sing-box 支持使用 JSON 格式的配置文件来配置节点和协议，下面是一个基础的配置示例，它结合了你要求的 VLESS、WebSocket (WS)、TLS 和 CDN。\n1. 安装 sing-box 首先，确保你已经安装了 sing-box。你可以通过以下步骤安装：\n下载 sing-box： 访问 sing-box GitHub 页面，获取最新版本。\n解压并安装：\n1 2 3 tar -zxvf sing-box-linux-amd64.tar.gz cd sing-box chmod +x sing-box 启动 sing-box（需要编写配置文件，具体步骤请见下文）。 2. 配置文件示例 以下是一个包含 VLESS + WS + TLS + CDN 的 sing-box 配置文件示例（假设你正在使用 WebSocket 和 TLS）：\nsing-box-config.json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 { \u0026#34;inbounds\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;ws-vless\u0026#34;, \u0026#34;port\u0026#34;: 443, \u0026#34;listen\u0026#34;: \u0026#34;0.0.0.0\u0026#34;, \u0026#34;protocol\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;settings\u0026#34;: { \u0026#34;clients\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;8c56b1ff-4245-43fb-b0a4-6d658b213d1a\u0026#34;, \u0026#34;alterId\u0026#34;: 0 } ], \u0026#34;decryption\u0026#34;: \u0026#34;none\u0026#34;, \u0026#34;fallbacks\u0026#34;: [ { \u0026#34;dest\u0026#34;: 10000, \u0026#34;xver\u0026#34;: 1, \u0026#34;path\u0026#34;: \u0026#34;/vless\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your-cdn-domain.com\u0026#34; } } ] }, \u0026#34;streamSettings\u0026#34;: { \u0026#34;network\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;wsSettings\u0026#34;: { \u0026#34;path\u0026#34;: \u0026#34;/vless\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your-cdn-domain.com\u0026#34; } }, \u0026#34;security\u0026#34;: \u0026#34;tls\u0026#34;, \u0026#34;tlsSettings\u0026#34;: { \u0026#34;serverName\u0026#34;: \u0026#34;your-cdn-domain.com\u0026#34;, \u0026#34;certificates\u0026#34;: [ { \u0026#34;certificateFile\u0026#34;: \u0026#34;/path/to/your/fullchain.pem\u0026#34;, \u0026#34;keyFile\u0026#34;: \u0026#34;/path/to/your/privatekey.pem\u0026#34; } ] } } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;protocol\u0026#34;: \u0026#34;freedom\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;dns\u0026#34;: { \u0026#34;servers\u0026#34;: [ \u0026#34;8.8.8.8\u0026#34;, \u0026#34;1.1.1.1\u0026#34; ] } } 配置文件说明： inbounds：设置服务端的入站连接。配置了 VLESS 协议，并且通过 WebSocket (WS) 搭配 TLS 和 CDN 域名（your-cdn-domain.com）。 port：设置服务器监听的端口，一般来说 HTTPS 用 443 端口。 protocol：设置协议为 vless。 settings.clients.id：这是一个 UUID，表示用户的唯一标识符，客户端需要使用这个 ID。 fallbacks：如果你想利用 CDN 的伪装功能，可以配置 fallback，并设置 path 和 headers，它们需要和 CDN 设置一致。 streamSettings.network：设置为 ws，表示使用 WebSocket 协议。 wsSettings.path：设置 WebSocket 路径，这里设置为 /vless。 tlsSettings：配置 TLS，确保你已经准备好了有效的证书和私钥。 3. 配置 CDN CDN 配置一般会依赖于你使用的具体服务，例如 Cloudflare、Alibaba Cloud 或其他 CDN 服务。你需要在 CDN 配置中设置以下内容：\n域名：将你自定义的域名（如 your-cdn-domain.com）指向你的服务器 IP 地址。 TLS 证书：如果你的 CDN 提供 SSL/TLS 终端，确保正确配置。 WebSocket 协议支持：确保 CDN 支持 WebSocket 流量，并启用了适当的 WebSocket 参数。 4. 启动 sing-box 配置好文件后，运行 sing-box：\n1 ./sing-box run -c sing-box-config.json 5. 配置客户端 客户端的配置也需要使用 VLESS 协议，并且指定服务器的 WebSocket 地址和路径。例如：\n1 2 3 4 5 6 7 8 9 10 11 12 13 { \u0026#34;vless\u0026#34;: { \u0026#34;server\u0026#34;: \u0026#34;your-cdn-domain.com\u0026#34;, \u0026#34;port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;8c56b1ff-4245-43fb-b0a4-6d658b213d1a\u0026#34;, \u0026#34;alterId\u0026#34;: 0, \u0026#34;security\u0026#34;: \u0026#34;tls\u0026#34;, \u0026#34;network\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;wsSettings\u0026#34;: { \u0026#34;path\u0026#34;: \u0026#34;/vless\u0026#34; } } } 总结 配置 sing-box 内核时，重点是确保 VLESS 协议与 WebSocket 配合使用，并且启用了 TLS 和 CDN 域名。 根据 CDN 提供商的要求调整相关配置，确保 WebSocket 和 TLS 通过 CDN 正常传输。 如果你有更多具体问题，或遇到某个环节的困惑，可以告诉我，我会继续帮助你解决！\n[/details]\n[details=\u0026ldquo;Deepseek 网页版，开启深度思考和联网搜索\u0026rdquo;] 使用 sing-box 搭建 VLESS + WebSocket + TLS 协议并配合 CDN，需要通过配置文件实现。这通常是用于服务端的配置。\n下面是一个基础的服务端配置文件示例和关键配置说明，你可以根据自己的情况修改。\n📝 核心配置文件示例 创建一个 config.json 文件，写入以下内容：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;listen_port\u0026#34;: 你的内部端口号, \u0026#34;sniff\u0026#34;: true, \u0026#34;sniff_override_destination\u0026#34;: true, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;你的用户UUID\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;你的WebSocket路径，如 /ray\u0026#34; }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;你的域名\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;你的TLS证书文件路径，如 /path/to/fullchain.cer\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;你的TLS私钥文件路径，如 /path/to/private.key\u0026#34; } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ] } 🔧 关键配置说明与修改指南 你需要修改以下配置项才能使用：\n配置项 说明与示例 如何获取/生成 listen_port 服务内部监听端口。注意：如果你使用CDN，这里通常监听本地，如 127.0.0.1:12345。 自定义一个未占用的端口。 uuid 用户唯一标识，是客户端连接的核心凭证。 使用命令 sing-box generate uuid 生成。 transport.path WebSocket 路径，客户端必须匹配。 自定义，如 \u0026quot;/yourpath\u0026quot;。 tls.server_name 你的域名，需与证书匹配。 你已解析到服务器的域名。 tls.certificate_path 完整证书链（PEM格式）路径。 从证书颁发机构获取，或使用 Let‘s Encrypt 等免费申请。 tls.key_path 私钥文件（PEM格式）路径。 与证书同时生成。 🌐 整合CDN（如Cloudflare） CDN的作用是在你的服务器前提供一个“中转站”。配置要点如下：\n修改监听地址：在配置中，listen 建议设置为 \u0026quot;127.0.0.1\u0026quot;，让服务只在本机运行。 使用外部Web服务器：你需要一个 Nginx 或 Caddy 这样的Web服务器，监听443端口，处理TLS握手，并将WebSocket流量转发到上面配置的 listen_port。 CDN设置：在CDN提供商（如Cloudflare）的控制面板中： 将你的域名DNS解析记录指向你的服务器IP。 开启 Proxy (CDN) 模式（通常是云朵图标变橙色）。 确保CDN支持 WebSocket 协议（Cloudflare默认支持）。 🛠️ 后续步骤与测试 保存并启动：将修改好的配置文件（如保存为 /etc/sing-box/config.json），使用 sudo systemctl restart sing-box 启动服务。 配置客户端：在你的客户端（如v2rayN、Clash）中，按照以下信息配置服务器： 地址：你的域名 端口：443 (CDN端口) 用户ID：填写的 uuid 传输协议：ws WebSocket路径：填写的 path TLS：启用 测试连通：使用 sudo systemctl status sing-box 查看服务状态，并通过客户端尝试连接。 ⚠️ 重要提醒 由于使用CDN，你的真实服务器IP应对CDN提供商可见，但对外隐藏。这意味着所有流量都会经过CDN服务器。 证书和私钥文件路径必须正确，且sing-box进程有读取权限。 如果你想了解不使用CDN的直连配置、Reality协议（无需域名的替代方案）的配置，或者客户端的详细配置示例，我可以为你进一步介绍。 [/details]\n[details=\u0026ldquo;智谱清言 网页版 GLM4.6 开启推理\u0026rdquo;] 好的，没有问题。使用 sing-box 内核搭建 VLESS + WebSocket + CDN + TLS 是目前非常流行和稳定的一种科学上网方案，它兼具了高性能和强隐蔽性。 下面我将为你提供一份详尽的、分步的指南，包括准备工作、整体架构、以及详细的服务端和客户端 sing-box 配置文件。 核心思想 这个方案的核心是“伪装”。我们将 VLESS 协议的流量包裹在 WebSocket (WS) 协议里，再通过 TLS 加密，使其看起来和普通的 HTTPS 网站流量一模一样。最后，通过 CDN（如 Cloudflare）进行中转，可以隐藏你的真实服务器 IP，并利用 CDN 的全球节点加速访问。 流量路径： 你的设备 -\u0026gt; sing-box客户端 -\u0026gt; CDN节点 (如Cloudflare) -\u0026gt; 你的VPS服务器 -\u0026gt; 目标网站 第一步：准备工作 在开始之前，你需要准备好以下几样东西：\n一台VPS (服务器)：推荐选择海外服务商，如 Vultr, DigitalOcean, BandwagonHost 等。操作系统建议选择 Ubuntu 20.04 / 22.04 或 Debian 11 / 12。 一个域名：可以是免费的 .tk, .ml 等，但更推荐购买一个便宜的顶级域名（如 .xyz, .top），稳定性更好。 一个CDN服务：Cloudflare 是最常用且免费的选择。注册一个账号即可。 SSH客户端：用于连接和管理你的VPS，如 Xshell (Windows), Terminal (macOS/Linux)。 第二步：域名和CDN配置 这是非常关键的一步，目的是让流量能够正确地从 CDN 转发到你的服务器。\n解析域名到VPS 登录你的域名服务商后台（如 GoDaddy, NameSilo）。 添加一条 A 记录，将一个子域名（例如 vless）指向你VPS的IP地址。 Type: A Name: vless (或者你喜欢的任何名字) Value: 你的VPS的IP地址 TTL: 默认即可 等待几分钟让解析生效。 配置Cloudflare 将你的域名添加到 Cloudflare 账户中。Cloudflare 会自动扫描你现有的 DNS 记录。 在 Cloudflare 的 DNS 管理页面，确保你刚才创建的 vless 子域名记录存在，并且状态是已代理（橙色云朵图标）。这是开启CDN的关键。 进入 SSL/TLS -\u0026gt; Overview 页面，将加密模式设置为 完全 (严格)。这会强制 Cloudflare 到你服务器之间的连接也必须使用有效的 TLS，安全性最高。 （可选）进入 网络 页面，开启 0-RTT Connection Resumption 以获得更快的连接速度。 第三步：服务器端配置 现在，通过 SSH 连接到你的 VPS，开始安装和配置 sing-box。\n下载并安装 sing-box 访问 sing-box GitHub Releases 页面，找到适合你服务器架构的最新版本。通常服务器是 amd64。 使用以下命令下载并解压（请替换版本号和链接为最新的）： 1 2 3 4 5 6 7 8 9 10 11 12 # 下载 sing-box wget https://github.com/SagerNet/sing-box/releases/download/v1.8.11/sing-box-1.8.11-linux-amd64.tar.gz # 解压 tar -xzf sing-box-1.8.11-linux-amd64.tar.gz # 移动文件到系统目录 sudo mv sing-box-1.8.11-linux-amd64/sing-box /usr/local/bin/ # 赋予执行权限 sudo chmod +x /usr/local/bin/sing-box # 创建配置目录 sudo mkdir -p /etc/sing-box # 清理 rm -rf sing-box-1.8.11-linux-amd64* 创建服务器端配置文件 创建并编辑配置文件 sudo nano /etc/sing-box/config.json。 将以下内容粘贴进去，并仔细修改标注的部分。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { // 日志配置 \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, // 入站配置：客户端连接服务器的入口 \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, // 监听 IP，0.0.0.0 表示监听所有网卡 \u0026#34;listen\u0026#34;: \u0026#34;0.0.0.0\u0026#34;, // 监听端口，Cloudflare CDN 只支持 80, 443, 8080, 8443, 2053, 2083, 2087, 2096, 8880。443 是最标准的。 \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { // 必须生成一个 UUID，不要用这个示例的 \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid-here\u0026#34;, // VLESS over WS/TLS 不需要 flow } ], \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, // WebSocket 路径，可以自定义，越复杂越好，但要和客户端保持一致 \u0026#34;path\u0026#34;: \u0026#34;/your-custom-path-that-is-hard-to-guess\u0026#34;, \u0026#34;headers\u0026#34;: { // Host 必须是你的域名，让 CDN 知道如何路由 \u0026#34;Host\u0026#34;: \u0026#34;vless.yourdomain.com\u0026#34; } }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, // 服务器证书配置，使用 Cloudflare 提供的证书 \u0026#34;certificate_path\u0026#34;: \u0026#34;/etc/sing-box/cert.pem\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/etc/sing-box/key.pem\u0026#34; } } ], // 出站配置：服务器访问互联网的出口 \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; } ] } 申请和部署TLS证书 因为我们使用了 Cloudflare 的 完全 (严格) 模式，所以服务器上必须有一个有效的证书。我们可以使用 acme.sh 脚本来自动申请 Let\u0026rsquo;s Encrypt 的免费证书。 安装 acme.sh: 1 curl https://get.acme.sh | sh -s email=your-email@example.com 申请证书（请替换域名和邮箱）： 1 ~/.acme.sh/acme.sh --issue -d vless.yourdomain.com --standalone 安装证书到 sing-box 配置目录： 1 2 3 4 ~/.acme.sh/acme.sh --install-cert -d vless.yourdomain.com \\ --key-file /etc/sing-box/key.pem \\ --fullchain-file /etc/sing-box/cert.pem \\ --reloadcmd \u0026#34;sudo systemctl restart sing-box\u0026#34; 注意：申请证书时，standalone 模式会临时占用 80 端口。请确保你的 VPS 防火墙放行了 80 和 443 端口，并且这两个端口没有被其他程序占用。 创建 systemd 服务并启动 创建服务文件 sudo nano /etc/systemd/system/sing-box.service： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Unit] Description=sing-box service Documentation=https://sing-box.sagernet.org/ After=network.target nss-lookup.target [Service] CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=10s LimitNOFILE=infinity [Install] WantedBy=multi-user.target 启动并设置开机自启： 1 2 3 sudo systemctl daemon-reload sudo systemctl enable sing-box sudo systemctl start sing-box 检查状态：sudo systemctl status sing-box。如果看到 active (running)，说明服务端配置成功！ 第四步：客户端配置 现在，在你的本地设备（Windows, macOS, Android, iOS 等）上配置 sing-box 客户端。\n下载对应平台的 sing-box 客户端 同样在 GitHub Releases 页面下载你设备系统对应的版本。 创建客户端配置文件 在客户端 sing-box 的目录下，创建 config.json 文件。 将以下内容粘贴进去，并仔细修改标注的部分。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, // 入站配置：本地设备上接收流量的端口 \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;mixed\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;mixed-in\u0026#34;, // 监听地址，通常是本地 \u0026#34;listen\u0026#34;: \u0026#34;0.0.0.0\u0026#34;, // 本地代理端口，浏览器等应用需要配置此端口 \u0026#34;listen_port\u0026#34;: 1080 } ], // 出站配置：连接到远程服务器的配置 \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-out\u0026#34;, // 服务器地址，填你的域名，CDN会自动解析到最优节点 \u0026#34;server\u0026#34;: \u0026#34;vless.yourdomain.com\u0026#34;, \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid-here\u0026#34;, // 必须和服务端一致 \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, // WebSocket 路径，必须和服务端一致 \u0026#34;path\u0026#34;: \u0026#34;/your-custom-path-that-is-hard-to-guess\u0026#34;, \u0026#34;headers\u0026#34;: { // Host 必须和服务端一致 \u0026#34;Host\u0026#34;: \u0026#34;vless.yourdomain.com\u0026#34; } }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, // SNI，告诉 CDN 你想访问哪个域名，通常和 server 一致 \u0026#34;server_name\u0026#34;: \u0026#34;vless.yourdomain.com\u0026#34;, // uTLS 指纹伪装，可以更好地模拟浏览器，防止被识别 \u0026#34;utls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;fingerprint\u0026#34;: \u0026#34;chrome\u0026#34; } } }, { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], // 路由配置：决定哪些流量走代理，哪些直连 \u0026#34;routing\u0026#34;: { \u0026#34;rules\u0026#34;: [ // 局域网IP直连 { \u0026#34;geoip\u0026#34;: \u0026#34;private\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, // 中国大陆IP直连 { \u0026#34;geoip\u0026#34;: \u0026#34;cn\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, // 中国大陆域名直连 { \u0026#34;geosite\u0026#34;: \u0026#34;cn\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, // 广告域名屏蔽 { \u0026#34;geosite\u0026#34;: \u0026#34;category-ads-all\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;block\u0026#34; }, // 其他所有流量全部走代理 { \u0026#34;inbound\u0026#34;: \u0026#34;mixed-in\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;vless-out\u0026#34; } ] } } 运行客户端并测试 Windows/macOS/Linux: 在终端中，进入 sing-box 目录，运行 ./sing-box run -c config.json。 配置系统代理: 将你设备的系统代理或浏览器的代理设置为： HTTP/HTTPS 代理: 127.0.0.1, 端口 1080 SOCKS5 代理: 127.0.0.1, 端口 1080 打开浏览器，访问 https://www.google.com 或 https://ipinfo.io。如果能正常访问，并且 ipinfo.io 显示的 IP 是 Cloudflare 的 IP，那么恭喜你，全部配置成功！ 总结与排错 连接失败： 检查服务端 sing-box 状态是否为 active (running)。 检查 VPS 防火墙是否放行 80 和 443 端口。 检查 Cloudflare DNS 解析是否正确，橙色云朵是否点亮。 检查客户端和服务端的 uuid, path, Host 是否完全一致。 TLS/SSL 错误： 确认 Cloudflare SSL/TLS 模式是 完全 (严格)。 确认服务器上的证书路径和权限正确。 速度慢： 可以尝试更换 Cloudflare 的 IP 段（有相关工具和脚本）。 检查客户端和服务器之间的网络延迟。 这份指南涵盖了从零开始搭建 VLESS+WS+CDN+TLS 的所有核心步骤。祝你使用愉快！ 以上内容由AI生成，仅供参考和借鉴 [/details]\n[details=\u0026ldquo;Qwen Chat 网页版 Qwen3-Max\u0026rdquo;] 基于搜索结果，我为您详细介绍如何使用sing-box内核搭建VLESS+WS+CDN+TLS的完整配置方案。\n一、整体架构说明 VLESS+WS+TLS+CDN的架构中，Cloudflare作为CDN层，可以有效隐藏真实服务器IP，避免被墙。 使用websocket传输方式的配置可以套cdn使用，这是实现流量伪装的关键。\n二、服务端配置文件 1. 创建配置文件 首先在服务器上创建sing-box配置文件：\n1 2 mkdir -p /etc/sing-box vim /etc/sing-box/config.json 2. 服务端完整配置示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;/var/log/sing-box.log\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;您的UUID\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;your.domain.com\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;/etc/letsencrypt/live/your.domain.com/fullchain.pem\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/etc/letsencrypt/live/your.domain.com/privkey.pem\u0026#34; }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;websocket\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/websocket-path\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your.domain.com\u0026#34; } } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;ip_is_private\u0026#34;: true, \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;rule_set\u0026#34;: \u0026#34;geosite-category-ads-all\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;rule_set\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;geosite-category-ads-all\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;remote\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;binary\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs\u0026#34;, \u0026#34;download_detour\u0026#34;: \u0026#34;direct\u0026#34; } ] } } 三、客户端配置文件 客户端完整配置示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;console\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;mixed\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;listen_port\u0026#34;: 7890, \u0026#34;sniff\u0026#34;: true } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;proxy\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;your.domain.com\u0026#34;, \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;您的UUID\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;your.domain.com\u0026#34;, \u0026#34;insecure\u0026#34;: false }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;websocket\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/websocket-path\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your.domain.com\u0026#34; } } }, { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;domain_suffix\u0026#34;: [\u0026#34;cn\u0026#34;], \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;geosite\u0026#34;: \u0026#34;cn\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;ip_cidr\u0026#34;: [\u0026#34;240.0.0.0/4\u0026#34;, \u0026#34;ff00::/8\u0026#34;], \u0026#34;outbound\u0026#34;: \u0026#34;block\u0026#34; }, { \u0026#34;rule_set\u0026#34;: \u0026#34;geosite-category-ads-all\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;rule_set\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;geosite-category-ads-all\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;remote\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;binary\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs\u0026#34;, \u0026#34;download_detour\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;final\u0026#34;: \u0026#34;proxy\u0026#34; } } 四、CDN（Cloudflare）配置步骤 域名解析：将您的域名DNS解析到Cloudflare，确保状态为\u0026quot;Proxied\u0026quot;（橙色云图标） SSL/TLS设置： SSL/TLS模式：选择\u0026quot;Full\u0026quot;或\u0026quot;Full (strict)\u0026quot; 最小TLS版本：建议TLS 1.2 通用SSL：开启 网络设置： HTTP/2：开启 HTTP/3 (QUIC)：开启 Brotli：开启 防火墙规则：建议创建规则只允许Cloudflare IP访问服务器443端口 五、Nginx反向代理配置（可选） 如果需要多协议共存，可以使用Nginx做SNI分流：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name your.domain.com; ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem; location /websocket-path { proxy_pass http://127.0.0.1:8080; # sing-box监听的内部端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 重要：超时设置 proxy_read_timeout 86400s; proxy_send_timeout 86400s; send_timeout 86400s; } } 六、部署步骤 安装sing-box： 1 2 3 curl -L https://github.com/SagerNet/sing-box/releases/latest/download/sing-box-$(uname -m)-linux.tar.gz | tar xz sudo mv sing-box /usr/local/bin/ sudo chmod +x /usr/local/bin/sing-box 获取SSL证书（使用acme.sh）： 1 2 3 curl https://get.acme.sh | sh source ~/.bashrc acme.sh --issue -d your.domain.com --standalone 创建systemd服务： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sudo tee /etc/systemd/system/sing-box.service \u0026gt; /dev/null \u0026lt;\u0026lt;EOF [Unit] Description=sing-box service Documentation=https://sing-box.sagernet.org/ After=network.target nss-lookup.target [Service] User=root WorkingDirectory=/etc/sing-box ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target EOF 启动服务： 1 2 3 sudo systemctl daemon-reload sudo systemctl enable sing-box sudo systemctl start sing-box 七、重要注意事项 UUID生成：使用uuidgen命令生成，或在线UUID生成器 路径伪装：WebSocket路径建议使用随机字符串，增加隐蔽性 防火墙设置：确保443端口开放，其他端口根据需要开放 证书更新：设置自动更新Let\u0026rsquo;s Encrypt证书的cron任务 日志管理：定期清理日志文件，避免磁盘空间不足 八、验证方法 服务端检查： 1 2 sudo systemctl status sing-box journalctl -u sing-box -f 客户端测试： 1 2 sing-box check -c client.json sing-box run -c client.json 连接测试： 1 curl -x http://127.0.0.1:7890 https://ipinfo.io 通过以上配置，您可以成功搭建一个VLESS+WS+TLS+CDN的sing-box服务，有效提升连接的稳定性和隐蔽性。 这种配置方式能够很好地适应各种网络环境，特别是在需要流量伪装的场景下表现优异。 [/details]\n[details=\u0026ldquo;魔搭社区 Qwen/Qwen3-VL-235B-A22B-Instruct\u0026rdquo;] 使用 sing-box 内核搭建 VLESS + WebSocket + CDN + TLS 的完整配置方法如下。这种组合常用于穿透防火墙、隐藏真实 IP，提升隐蔽性和可用性。\n📌 一、前置条件 域名：已解析到你的服务器（如 vless.example.com） SSL证书：可使用 Let’s Encrypt 自动签发，或手动上传证书文件 CDN服务：如 Cloudflare、Akamai、阿里云CDN等（建议开启“代理”模式） 服务器开放端口：通常为 443（TLS）或 80（用于 ACME 验证） sing-box 已安装：推荐最新版本（\u0026gt;= v1.8.0） 🛠️ 二、服务端配置（sing-box server） 假设你使用的是 vless://uuid@domain:443?encryption=none\u0026amp;security=tls\u0026amp;type=ws\u0026amp;host=domain\u0026amp;path=/vless 格式\n✅ 服务端 sing-box 配置文件（server.json） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;stdout\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-ws-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid-here\u0026#34;, // 替换为你自己的 UUID \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34; // 可选，如 xtls-rprx-direct } ], \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;websocket\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/vless\u0026#34;, // WebSocket 路径 \u0026#34;early_data_header_name\u0026#34;: \u0026#34;Sec-WebSocket-Protocol\u0026#34; }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;vless.example.com\u0026#34;, // 你的域名 \u0026#34;certificate_path\u0026#34;: \u0026#34;/path/to/fullchain.pem\u0026#34;, // 证书路径 \u0026#34;key_path\u0026#34;: \u0026#34;/path/to/privkey.pem\u0026#34; // 私钥路径 } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; } ] } 💡 如果你用的是 Let’s Encrypt，证书路径通常是：\n/etc/letsencrypt/live/vless.example.com/fullchain.pem /etc/letsencrypt/live/vless.example.com/privkey.pem 🌐 三、客户端配置（sing-box client） 客户端需连接到 CDN 解析后的 IP（实际是 CDN 节点），由 CDN 代转到你的服务器\n✅ 客户端 sing-box 配置文件（client.json） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;stdout\u0026#34; }, \u0026#34;dns\u0026#34;: { \u0026#34;servers\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;local\u0026#34;, \u0026#34;address\u0026#34;: \u0026#34;https://1.1.1.1/dns-query\u0026#34; } ], \u0026#34;rules\u0026#34;: [ { \u0026#34;rule_set\u0026#34;: [\u0026#34;geosite-cn\u0026#34;], \u0026#34;server\u0026#34;: \u0026#34;local\u0026#34; } ] }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;mixed\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;listen_port\u0026#34;: 7890 } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;proxy\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;vless.example.com\u0026#34;, // 你的域名（CDN 代理的） \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid-here\u0026#34;, // 必须与服务端一致 \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34;, // 可选 \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;websocket\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/vless\u0026#34;, // 必须与服务端一致 \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;vless.example.com\u0026#34; // 必须与服务端 tls.server_name 一致 } }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;vless.example.com\u0026#34;, // 必须与域名一致 \u0026#34;insecure\u0026#34;: false // 生产环境务必设为 false } }, { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;inbound\u0026#34;: \u0026#34;mixed-in\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;proxy\u0026#34; } ] } } 🔐 四、证书获取（Let’s Encrypt 示例） 1 2 3 4 5 6 7 8 9 # 安装 certbot sudo apt update \u0026amp;\u0026amp; sudo apt install certbot # 获取证书（假设你有 Nginx 或 Caddy，或临时用 --standalone） sudo certbot certonly --standalone -d vless.example.com # 证书默认位置 /etc/letsencrypt/live/vless.example.com/fullchain.pem /etc/letsencrypt/live/vless.example.com/privkey.pem ⚠️ 注意：如果使用 CDN，不能在服务器上直接运行 --webroot，因为 CDN 会拦截验证请求。建议：\n临时关闭 CDN 代理（仅限 DNS 解析），完成验证后再打开。 或使用 DNS API 自动验证（如 Cloudflare API）。 🌍 五、CDN 设置（以 Cloudflare 为例） 登录 Cloudflare → 选择你的域名 → DNS → 添加 A 记录指向服务器 IP 点击记录右侧 “Proxy status” → 改为 Proxied（橙色云） 在 SSL/TLS → Overview → 选择 Full（严格） ✅ 这样流量经过 Cloudflare 加密转发，隐藏了真实服务器 IP，同时支持 TLS 终止在 CDN 层（但 sing-box 仍需要后端 TLS，所以选 Full 严格模式）\n🧪 六、启动服务 启动服务端： 1 sudo sing-box run -c /path/to/server.json 启动客户端： 1 sing-box run -c /path/to/client.json 客户端监听 127.0.0.1:7890，可配置浏览器代理或系统全局代理。\n🧩 七、高级优化（可选） 1. 使用 fallback 处理 HTTP 请求（防止被探测） 1 2 3 4 5 // 服务端 inbound 中添加 \u0026#34;fallback\u0026#34;: { \u0026#34;server\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;server_port\u0026#34;: 8080 } 然后在 8080 端口跑一个静态网页或 Nginx，伪装成正常网站。\n2. 使用 alpn 提升兼容性 1 2 3 4 5 6 7 \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;vless.example.com\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;...\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;...\u0026#34;, \u0026#34;alpn\u0026#34;: [\u0026#34;h2\u0026#34;, \u0026#34;http/1.1\u0026#34;] } ✅ 八、验证是否成功 客户端配置好后，访问 https://www.ip138.com/ 查看出口 IP 是否为 CDN IP 使用 curl -v https://vless.example.com/vless 应该返回 400（WebSocket 协议错误是正常的） 使用 V2Ray/V2RayN/Trojan-Go 等客户端导入配置测试连通性 📝 九、常见问题 问题 解决方案 ERR_CONNECTION_REFUSED 检查端口是否开放、防火墙是否放行 443、CDN 是否代理正确 TLS handshake failed 检查证书路径、域名匹配、insecure=false WebSocket not supported 检查 path 和 headers.Host 是否一致 UUID 不匹配 客户端和服务端必须使用相同 UUID 📚 十、参考文档 sing-box 官方文档：https://sing-box.sagernet.org/ VLESS 协议说明：https://xtls.github.io/protocols/vless.html Cloudflare + VLESS 教程：https://github.com/XTLS/Xray-examples ✅ 至此，你已成功使用 sing-box 搭建了 VLESS + WebSocket + CDN + TLS 的高性能、高隐蔽性代理服务！\n如需进一步支持（如自动续期证书、多用户管理、日志分析等），欢迎继续提问！ [/details]\n[details=\u0026ldquo;魔搭社区 deepseek-ai/DeepSeek-V3.2\u0026rdquo;] 我来详细介绍如何使用 sing-box 内核配置 VLESS + WS + CDN + TLS。\n1. 配置文件结构 服务端配置 (server.json) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;tcp_fast_open\u0026#34;: true, \u0026#34;sniff\u0026#34;: true, \u0026#34;sniff_override_destination\u0026#34;: true, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;your-username\u0026#34;, \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid\u0026#34;, // 生成: uuidgen 或在线生成 \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/your-path\u0026#34;, // 自定义路径，如 /vlessws \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your-domain.com\u0026#34; // 你的域名 } }, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;your-domain.com\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;/path/to/fullchain.pem\u0026#34;, // SSL证书路径 \u0026#34;key_path\u0026#34;: \u0026#34;/path/to/privkey.pem\u0026#34; } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;inbound\u0026#34;: [\u0026#34;vless-in\u0026#34;], \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; } ] } } 客户端配置 (client.json) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, \u0026#34;dns\u0026#34;: { \u0026#34;servers\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;remote\u0026#34;, \u0026#34;address\u0026#34;: \u0026#34;tls://1.1.1.1\u0026#34;, \u0026#34;detour\u0026#34;: \u0026#34;proxy\u0026#34; }, { \u0026#34;tag\u0026#34;: \u0026#34;local\u0026#34;, \u0026#34;address\u0026#34;: \u0026#34;223.5.5.5\u0026#34;, \u0026#34;detour\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;strategy\u0026#34;: \u0026#34;ipv4_only\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;mixed\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;socks-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;listen_port\u0026#34;: 1080, \u0026#34;sniff\u0026#34;: true }, { \u0026#34;type\u0026#34;: \u0026#34;tun\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;tun-in\u0026#34;, \u0026#34;interface_name\u0026#34;: \u0026#34;tun0\u0026#34;, \u0026#34;mtu\u0026#34;: 9000, \u0026#34;inet4_address\u0026#34;: \u0026#34;172.19.0.1/30\u0026#34;, \u0026#34;inet6_address\u0026#34;: \u0026#34;fdfe:dcba:9876::1/126\u0026#34;, \u0026#34;auto_route\u0026#34;: true, \u0026#34;strict_route\u0026#34;: true, \u0026#34;sniff\u0026#34;: true } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;proxy\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;your-domain.com\u0026#34;, // 你的域名 \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;your-uuid\u0026#34;, // 与服务端相同 \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;your-domain.com\u0026#34;, \u0026#34;utls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;fingerprint\u0026#34;: \u0026#34;chrome\u0026#34; } }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/your-path\u0026#34;, // 与服务端相同 \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;your-domain.com\u0026#34; }, \u0026#34;max_early_data\u0026#34;: 2048, \u0026#34;early_data_header_name\u0026#34;: \u0026#34;Sec-WebSocket-Protocol\u0026#34; } }, { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;block\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;protocol\u0026#34;: \u0026#34;dns\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;proxy\u0026#34; }, { \u0026#34;domain_keyword\u0026#34;: [ \u0026#34;cloudflare\u0026#34;, \u0026#34;cdn\u0026#34; ], \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;geoip\u0026#34;: [ \u0026#34;cn\u0026#34;, \u0026#34;private\u0026#34; ], \u0026#34;outbound\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;auto_detect_interface\u0026#34;: true } } 2. 部署步骤 步骤1：准备服务器和域名 购买 VPS 服务器 注册域名并解析到服务器 IP 在 Cloudflare 或其他 CDN 中添加域名 步骤2：申请 SSL 证书 1 2 3 4 5 6 7 8 9 10 # 使用 acme.sh 申请证书 curl https://get.acme.sh | sh ~/.acme.sh/acme.sh --register-account ~/.acme.sh/acme.sh --issue -d your-domain.com --standalone # 复制证书到合适位置 mkdir -p /etc/sing-box/cert ~/.acme.sh/acme.sh --install-cert -d your-domain.com \\ --key-file /etc/sing-box/cert/privkey.pem \\ --fullchain-file /etc/sing-box/cert/fullchain.pem 步骤3：安装 sing-box 1 2 3 4 5 6 7 # 下载最新版 sing-box curl -Lo /tmp/sing-box.tar.gz https://github.com/SagerNet/sing-box/releases/latest/download/sing-box-1.8.0-linux-amd64.tar.gz tar -xzf /tmp/sing-box.tar.gz -C /tmp install -m 755 /tmp/sing-box-*/sing-box /usr/local/bin/ # 验证安装 sing-box version 步骤4：配置 systemd 服务 创建 /etc/systemd/system/sing-box.service：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Unit] Description=sing-box Service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json Restart=on-failure RestartSec=3 LimitNOFILE=65535 [Install] WantedBy=multi-user.target 启动服务：\n1 2 3 4 systemctl daemon-reload systemctl enable sing-box systemctl start sing-box systemctl status sing-box 步骤5：CDN 配置（以 Cloudflare 为例） 在 Cloudflare DNS 设置中：\n添加 A 记录指向你的服务器 IP 启用代理状态（橙色云图标） SSL/TLS 设置：\n选择 \u0026ldquo;Full\u0026rdquo; 模式 确保启用 SSL 网络设置：\n启用 WebSocket 启用 HTTP/2 步骤6：客户端使用 将客户端配置文件保存为 config.json 启动 sing-box 客户端： 1 sing-box run -c config.json 配置系统代理或使用支持 sing-box 的客户端 3. 注意事项 防火墙配置 1 2 3 4 5 6 7 # 开放端口 ufw allow 80/tcp ufw allow 443/tcp ufw enable # 或者使用 iptables iptables -A INPUT -p tcp --dport 443 -j ACCEPT 性能优化 启用 TCP Fast Open（已在配置中） 调整内核参数： 1 2 echo \u0026#34;net.ipv4.tcp_fastopen=3\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p BBR 拥塞控制： 1 2 3 echo \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p 安全建议 定期更新 UUID 使用复杂的路径 监控日志 定期更新 sing-box 版本 4. 故障排查 常见问题 连接失败\n检查防火墙设置 验证证书路径 确认 CDN 已启用 WebSocket 速度慢\n检查 CDN 节点 尝试不同的端口 调整传输参数 证书错误\n确保证书有效 检查证书权限 重启 sing-box 服务 查看日志 1 2 3 4 5 # 服务端日志 journalctl -u sing-box -f # 客户端日志 sing-box run -c config.json --debug 这个配置支持通过 CDN 中转流量，提供了更好的隐蔽性和抗干扰能力。记得替换配置文件中的占位符为你自己的信息。 [/details]\n总结：\n但从入站，出站来看：\n渠道 正确/错误 备注 Gemini AI Pro 思考模式（3 Pro） 正确 Chatgpt 网页免费版 错误 大错特错 Deepseek 网页版，开启深度思考和联网搜索 错误 回答没有完全遵循指令 智谱清言 网页版 GLM4.6 开启推理 正确 提示友好 Qwen Chat 网页版 Qwen3-Max 错误 小错误，懂的话还可以修改，不懂就难了 魔搭社区 Qwen/Qwen3-VL-235B-A22B-Instruct 错误 小错误，懂的话还可以修改，不懂就难了 魔搭社区 deepseek-ai/DeepSeek-V3.2 错误 渠道 正确/错误 备注 Gemini AI Pro 思考模式（3 Pro） 正确 Chatgpt 网页免费版 错误 大错特错 Deepseek 网页版，开启深度思考和联网搜索 错误 回答没有完全遵循指令 智谱清言 网页版 GLM4.6 开启推理 正确 提示友好 Qwen Chat 网页版 Qwen3-Max 错误 小错误，懂的话还可以修改，不懂就难了 魔搭社区 Qwen/Qwen3-VL-235B-A22B-Instruct 错误 小错误，懂的话还可以修改，不懂就难了 魔搭社区 deepseek-ai/DeepSeek-V3.2 错误 ","date":"2025-12-07T16:26:25+08:00","permalink":"/p/251207162625/","title":"大模型回答质量实际体验总结"},{"content":"简介 准备 一个域名 一个 cloudflare 账号 一台可以连接国际网络的服务器 登录 cloudflare，将域名解析到服务器 IP，开启小黄云\n进入 SSL/TLS 设置\n进入概览，将连接类型改为完全或者完全严格（使用 cloudflare 提供的 15 年源服务器证书） 进入源服务器证书，生成一个通配符域名源服务器证书，记得保存下来，后面会用到 部署 安装\n1 bash \u0026lt;(curl -Ls https://raw.githubusercontent.com/alireza0/s-ui/master/install.sh) 终端输入 s-ui进入交互命令，可以安装、卸载、查看信息\n进入网页配置，默认端口：http://ip:2095/app\n输入用户名和密码，进入主界面\n配置 TLS 点击左侧导航 TLS设置，添加一个新的配置\n名称 自定义即可，比如 vless+ws+tls\n证书 使用证书路径或者文件内容\n证书路径：需要操作服务器，将文件内容保存到本地文件中\n文件内容：将证书文件粘贴进去\nTLS 选项 配置 TLS 相关设置\nACME 用作自动化续期 SSL 使用\nECH 不知，一般也不用开启\n入站管理 点击左侧导航 入站管理，添加一个新的配置\n类型和标签 类型：选择对应的代理协议，如 vless，hysteria2\n标签：标签的名字，订阅时会使用作为名称，自定义即可\n监听 地址：监听地址，一般默认即可\n端口：监听端口，选择需要对应的\n传输 选择传输协议：http，websocket，quic，grpc 等等\nhttp 请求路径：略\n主机域名：略\nTLS 选择 配置TLS中配置的 TLS 模板\n多路复用 略\n用户管理 配置多用户使用\n基础 名称：自定义\n流量：用户可以使用的流量\n到期时间：用户到期时间\n入站标签：用户可以使用的入站\n描述：略\n配置 对各个协议的配置\n实际案例 vless+ws+cdn+tls TLS 设置：\n1 2 3 4 名称：vless+ws+tls 证书，使用外部路径： 证书文件路径：/etc/sing-box/cert/cert.pem 私钥文件路径：/etc/sing-box/cert/key.pem 上述的证书参考前文的【准备】分类\n入站管理：\n1 2 3 4 5 6 7 8 9 10 类型：vless 标签：自定义 监听： 地址：:: 端口：8443 传输： 启用传输：是 类型：WebSocket HTTP请求路径：/自定义 主机域名：你的域名 用户管理：\n1 入站标签：刚才配置的入站管理 ","date":"2025-11-30T12:44:44+08:00","permalink":"/p/251130124444/","title":"s-ui，高级 Web 面板，基于 SagerNet、Sing-Box 构建"},{"content":"简介 本文将从零开始介绍一个从未解除过 comfyui 的用户，实现 8G 显存在本地生成图片\n官方教程：https://docs.comfy.org/tutorials/image/z-image/z-image-turbo\n安装 comfyui 下载地址：点击下载最新新版 ComfyUI_windows_portable_nvidia.7z\n下载后解压到一个磁盘空闲比较大的地方（模型超占磁盘，最好 100G 以上）\n文件夹结构：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 📁ComfyUI_windows_portable ├── 📁ComfyUI // comfy UI主要文件夹 │ ├── .git // Git版本控制文件夹，代码版本管理用 │ ├── .github // GitHub Actions 工作流文件夹 │ ├── 📁 comfy // │ ├── 📁 comfy_extras // │ ├── 📁 custom_nodes // comfyUI 自定义节点文件目录（插件安装目录） │ ├── 📁 input // comfyUI上传文件夹，当你使用了如**load image**节点，对应上传的图片会存储到这个文件夹 │ ├── 📁 models // 对应模型文件配置文件夹 │ | ├── 📁 checkpoints // 检查点大模型文件存放路径 │ | ├── 📁 clip // CLIP文件存放路径 │ | ├── 📁 clip_vision // CLIP_vision文件存放路径 │ | ├── 📁 configs │ | ├── 📁 controlnet // ControlNet 模型存放路径 │ | ├── 📁 diffusers │ | ├── 📁 embedding // embedding 模型存放路径 │ | ├── 📁 gligen │ | ├── 📁 hypernetworks // 超网络模型 │ | ├── 📁 loras // Lora 模型存放路径 │ | ├── 📁 style_models │ | ├── 📁 unet │ | ├── 📁 upscale_models // upscale_models 放大模型存放路径 │ | ├── 📁 vae // VAE 模型存放路径 │ | └── 📁 vae_approx │ ├── 📁 notebooks │ ├── 📁 user // comfyUI 用户信息（如配置文件，工作流信息等） │ | ├── 📁 default // 默认 comfyUI 用户文件夹 │ | | ├─ 📁 workflow // 用户保存的 workflow 文件 │ | | ├─ 📄 xxx.json // 用户的配置文件 │ | | └── ... xxx.json // 其它配置文件 │ | └── ...[username] // 如果你启用了多用户且存在多用户则会显示对应不同用户的名称 │ ├── 📁 output // comfyUI图片输出文件夹，当使用类似 ** save image** 节点时，生成的图片会存储到这个文件夹 │ | ├── 📁 checkpoints // 如果有使用模型合并节点，和保存合并后的模型相关功能，则合并后的模型会输出到这里 │ | └── ... xxx.png // 运行过程中生成的文件会保存到这里 │ ├── extra_model_paths.yaml.example // 额外模型文件路径配置文件，如设置此项，请删除**.example** 后缀用记事本进行编辑 │ └── ... // 其它文件 ├── config // 配置文件夹 ├── 📁 Python_embeded // 嵌入的python 文件 ├──📁 update │ ├── update.py // 用于comfyUI的 python 脚本 │ ├── update_comfyUI.bat // comfyUI作者推荐使用此批处理命令对 ComfyUI 进行升级 │ └── update_comfyui_and_python_dependencies.bat // 只有当你的 python 依赖文件存在问题时才需要运行此批处理命令 ├── comfyui.log // Comfy UI运行日志文件 ├── README_VERY_IMPORTANT.txt // README 文件，包含了文件使用的方法和说明等等 ├── run_cpu.bat // 批处理文件，当你的显卡为A卡或只有 CPU 时，双击运行它启动 ComfyUI └── run_nvidia_gpu.bat // 批处理文件，当你的显卡为N卡(Nvidia)时，双击运行它启动 ComfyUI 下载模型 方式一：魔搭社区网页直接下载 使用魔搭社区网页在线下载：\n点击我进入 ComfyUI 官方仓库 z_image_turbo，点击【模型文件】，再点击【split_files】，可以看到三个文件夹： diffusion_models、text_encoders、vae\n分别下载里面的文件放到对应的本地文件夹：\n1 2 3 4 5 diffusion_models ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\diffusion_models text_encoders ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\text_encoders vae ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\vae 当然：官方提供的是 fp16 的版本，对于显存较低的电脑不太友好，通过huggingface.co/T5B/Z-Image-Turbo-FP8可以下载 fp8 的量化版本\n方式二：modelscope 下载 使用魔搭社区提供的modelscope下载工具下载模型：\n安装 modelscope 1 pip install modelscope 进入到 comfyui 主目录下的 ComfyUI 下，比如：F:\\ComfyUI_windows_portable\\ComfyUI\n下载 text_encoders 1 modelscope download --model Comfy-Org/z_image_turbo split_files/text_encoders/qwen_3_4b.safetensors --local_dir ./text_encoders/ 下载 diffusion_models 1 modelscope download --model Comfy-Org/z_image_turbo split_files/diffusion_models/z_image_turbo_bf16.safetensors --local_dir ./diffusion_models/ 如果 z_image_turbo_bf16.safetensors 过大，显存不够，可以通过huggingface.co/T5B/Z-Image-Turbo-FP8下载 fp8 量化版本，不过网速较慢\n下载 vae 1 modelscope download --model Comfy-Org/z_image_turbo split_files/vae/ae.safetensors --local_dir ./vae/ 方式三：hugginface.co 网页下载 使用hugginface.co网页在线下载：\n点击我进入 ComfyUI 官方仓库 z_image_turbo，点击【模型文件】，再点击【split_files】，可以看到三个文件夹： diffusion_models、text_encoders、vae\n分别下载里面的文件放到对应的本地文件夹：\n1 2 3 4 5 diffusion_models ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\diffusion_models text_encoders ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\text_encoders vae ---\u0026gt; ComfyUI_windows_portable\\ComfyUI\\models\\vae 当然：官方提供的是 fp16 的版本，对于显存较低的电脑不太友好，通过huggingface.co/T5B/Z-Image-Turbo-FP8可以下载 fp8 的量化版本\n启动 ComfyUI \u0026amp; 工作流 启动 ComfyUI：回到下载的 ComfyUI 主文件夹，点击 run_nvidia_gpu.bat，等待一会，启动成功进入网页：http://127.0.0.1:8188，一切准备工作就绪\n下载工作流：点击下载官方工作流 image_z_image_turbo.json\n点击左上角：菜单》文件》打开》选择下载的工作流（后文提供）。\n打开子图，如图所示：\n后续修改只需要修改 Step3 Prompt 方框中的提示词，点击运行即可\n或者点击面包屑导航 image_z_image_turbo回到工作流主界面，在输入提示词的地方修改提示词，点击运行即可\n另外一个工作流：https://lzygood.lanzoum.com/inUQa3cjetqj，我自己平时使用，官方提供显示有点问题，使用的是 fp8 的版本，需要放在 ComfyUI_windows_portable\\ComfyUI\\models\\diffusion_models\\checkpoints目录下\n提示词 以下为 5060 8G， z-image-turbo-fp8 1024*1024\n1 帮我生成几张原神中八重神子的图片 1 一条通往神秘发光森林的小径，巨大的萤火虫在夜空中飞舞，空灵的光斑，童话书插画风格，柔和色彩，梦幻氛围，广角镜头。 1 一个精致的青花瓷茶杯，飘出缕缕热气，热气形成了仙鹤的形态，背景是水墨山水画，新中式风格，优雅而宁静，特写镜头。 一个地下巨型水晶洞穴，内部有发光的蓝色水晶和地下湖，一束阳光从顶部的裂缝射入，形成了神圣的体积光，超现实，探索发现的感觉，8K 壁纸。\nNSFW 以下提示词来自佬友和 grok。图片就不上传了\n1 一个裸露身体的女孩，站立在房间里，20岁左右，没有任何遮挡，全身照 1 一位中国年轻女子，黑发双马尾，脸红，害羞，脸上有白色液体。斜倚在铺着柔软灰色枕头和床单的床上，双腿大张，膝盖弯曲，姿态完全开放，充满诱惑，穿着百褶裙。她丰满自然的乳房，粉嫩的乳晕轻轻地贴着胸膛，肌肤光滑，泛着淡淡的情欲光泽。她剃光的阴部完全暴露，整齐对称的外阴唇微微分开，露出娇嫩的粉嫩内阴唇和阴蒂，隐约可见一丝湿润。一只纤细的手放松地放在阴部旁边的大腿内侧，手指轻轻张开，不再遮掩任何东西，将目光直接引向她坦露的私密之处。她用紧张的眼睛直视着观者。温暖昏暗的室内灯光从上方倾泻而下，在她乳房下方和大腿间投下柔和的阴影，凸显出她裸露私处的每一处曲线和细节。亲密的特写镜头，略微低角度的视角，以她的躯干和完全张开的双腿为中心，高度逼真的渲染，细腻的皮肤纹理，细小的毛孔，自然的红晕，以及不容置疑的色情焦点。 1 22岁柔美瑜伽教练，黑色长发用白色发带束成马尾，赤裸身体在月光下呈现象牙白肤色。她呈现下犬式瑜伽姿势，臀部高高翘起，双腿分开，完美呈现粉嫩菊花和阴部。阴唇对称自然，阴蒂微微外露，表面有细微汗珠。脊椎线条优美，腰部纤细，臀部圆润紧实，乳房自然下垂，乳头呈淡粉色。一只手撑地，另一只手放在瑜伽垫上。背景是露台木地板和星空，月光从左侧洒下，在她身体右侧形成完美阴影。微风吹动几缕发丝和背景树叶。特写构图，侧后方视角，月光冷色调与皮肤暖色调对比，细腻肌肉纹理和汗珠细节，艺术摄影风格。 1 28岁成熟女性，酒红色波浪卷发散落在肩膀，浸泡在充满玫瑰花瓣的豪华白色浴缸中。泡沫覆盖到乳房下方，露出湿润的乳峰和粉红乳晕。双腿优雅地搭在浴缸边缘，完全张开，剃光的阴部在泡沫间隙中暴露无遗，阴唇因热水而充血呈现深粉色，阴蒂清晰可见。一只手拿着香槟酒杯，另一只手懒散地放在大腿内侧，手指沾着泡沫。浴室大理石墙面反射温暖烛光，玫瑰花瓣漂浮在水面，香槟气泡上升。蒸汽营造朦胧氛围，水面倒影她的身体曲线。特写镜头，略微低角度仰视，超逼真水面反射和泡沫质感，烛光暖色调，奢华摄影风格。 放大模型 4x 放大 模型：4x-UltraSharp\n下载地址：点我直接下载\n下载4x-UltraSharp.pth文件存放到ComfyUI/models/upscale_models目录中\n重启ComfyUI即可\n节点 图像对比 地址：https://github.com/rgthree/rgthree-comfy\n安装：\n1 2 cd ComfyUI/custom_nodes git clone https://github.com/rgthree/rgthree-comfy.git 重启ComfyUI即可\n","date":"2025-11-29T00:50:29+08:00","permalink":"/p/251129005029/","title":"comfyui配置z-image-turbo工作流，本地生成图片，8G显存可用，从零开始"},{"content":"简介 本文将介绍从零到一，封装 Windows 系统\n步骤 安装虚拟机 下载 vmware workstartion，下载地址： 下载后，点击安装，一步一步更者教程走即可，\nvmware workstation17 许可证：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 4A4RR-813DK-M81A9-4U35H-06KND NZ4RR-FTK5H-H81C1-Q30QH-1V2LA JU090-6039P-08409-8J0QH-2YR7F 4Y09U-AJK97-089Z0-A3054-83KLA 4C21U-2KK9Q-M8130-4V2QH-CF810 MC60H-DWHD5-H80U9-6V85M-8280D ZA30U-DXF84-4850Q-UMMXZ-W6K8F AC590-2XW97-48EFZ-TZPQE-MYHEA YF39K-DLFE5-H856Z-6NWZE-XQ2XD AC15R-FNZ16-H8DWQ-WFPNV-M28E2 CZ1J8-A0D82-489LZ-ZMZQT-P3KX6 YA11K-6YE8H-H89ZZ-EXM59-Y6AR0 tips：最新版个人已经免费了。\n创建虚拟机 进入 VMware workstation 主页面，按照以下步骤创建虚拟机：\n创建新的虚拟机》选择典型，下一步 稍后安装操作系统，下一步 选择 Microsoft windows，版本选择 windows10 以下，如果你是 win10，win11 就选择 win10 64 位，win7 就选择 win7 位，下一步 虚拟机名称默认或者自己修改，位置选择虚拟机存放的位置 磁盘选择将虚拟磁盘存储为单个文件 点击自定义硬件，新CD/DVD（STAT）使用下载的Windows原版镜像》，可以自己设定内存大小和处理器数量，完成 配置虚拟机 进入系统，更改一些系统设置，比如删除创建的用户，启用管理员账户，启用来宾账户，关机 新增一个磁盘，容量50G即可，进入系统，安装好vmware tools用于和主机传输文件，将常用软件复制到虚拟机，安装常用软件 系统优化， 封装系统 ","date":"2025-11-21T19:07:09+08:00","permalink":"/p/251121190709/","title":"windows系统封装"},{"content":"简介 Microsoft 企业创建应用后，用户授权访问出现了：只有管理员才能授权的组织资源。请管理员授权使用此应用程序后，您才能使用。\n解决办法：\n使用组织管理员账户访问：Microsoft Entra admin center 左侧导航栏：企业应用》创建的应用》权限》点击 xxx 授予管理员同意 ","date":"2025-11-20T12:11:48+08:00","permalink":"/p/251120121148/","title":"OneDrive授权出现需要访问只有管理员才能授权的组织资源。请管理员授权使用此应用程序后，您才能使用。"},{"content":"简介 HCL在Windows11 24H2安装后无法打开，主要原因是HCL自带的 VirtualBox 不能安装，下载另一个版本就可以了，\n下载： VirtualBox-6.1.50\n","date":"2025-11-15T17:58:37+08:00","permalink":"/p/251115175837/","title":"HCL在Windows11 24H2安装后无法打开"},{"content":"简介 安装 先安装 npm，再安装 pnpm，安装步骤很简单\n1 npm install -g pnpm ","date":"2025-11-12T13:10:53+08:00","permalink":"/p/251112131053/","title":"pnpm，npm的优化版"},{"content":"主板开按下开机键之后会进入自检，自检会检查：CPU、内存、显卡、芯片组、硬盘，自检完成后初始化，如果硬件有问题就会通过蜂鸣器不同的声音来告警：\n一短：系统正常启动 一长一短：内存或主板出错 一长两短：显示器或显卡错误 一长三短：键盘控制器错误 不停的响：内存未插紧或损坏 ","date":"2025-10-30T20:02:39+08:00","permalink":"/p/251030200239/","title":"主板蜂鸣器提示音含义"},{"content":"简介 Cloudreve 可以让您快速搭建起公私兼备的网盘系统。Cloudreve 在底层支持不同的云存储平台，用户在实际使用时无须关心物理存储方式。你可以使用 Cloudreve 搭建个人用网盘、文件分享系统，亦或是针对大小团体的公有云系统。\nCloudreve 本身是一款“网盘”而非“其他网盘的管理器”，其所支持的存储提供商大多为公有云的存储专用产品，而非针对个人消费者的网盘。下面情况并不适合使用 Cloudreve：\n我需要用 Cloudreve 管理多个网盘上的文件； 对于 Cloudreve 存储的文件，我同时也会使用其他文件管理器一起管理； 我想把其他网盘存储服务“再分发”给我的用户使用； 部署 Docker docker compose\n1 2 3 mkdir -p /srv/container_srv/cloudreve cd /srv/container_srv/cloudreve vim docker-compose.yml 社区版\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 services: cloudreve: image: cloudreve/cloudreve:latest container_name: cloudreve-backend depends_on: - postgresql - redis restart: unless-stopped ports: - 5212:5212 - 6888:6888 - 6888:6888/udp environment: - CR_CONF_Database.Type=postgres - CR_CONF_Database.Host=postgresql - CR_CONF_Database.User=cloudreve - CR_CONF_Database.Name=cloudreve - CR_CONF_Database.Port=5432 - CR_CONF_Redis.Server=redis:6379 volumes: - ./backend_data:/cloudreve/data postgresql: # Best practice: Pin to major version. # NOTE: For major version jumps: # backup \u0026amp; consult https://www.postgresql.org/docs/current/pgupgrade.html image: postgres:17 container_name: postgresql restart: unless-stopped environment: - POSTGRES_USER=cloudreve - POSTGRES_DB=cloudreve - POSTGRES_HOST_AUTH_METHOD=trust volumes: - ./database_postgres:/var/lib/postgresql/data redis: image: redis:latest container_name: redis restart: unless-stopped volumes: - ./redis_data:/data ","date":"2025-10-29T09:11:17+08:00","permalink":"/p/251029091117/","title":"cloudreve，开源的自建云盘项目，可使用mircosoft e5"},{"content":"设置-应用和功能-程序和功能-启用或关闭 Windows 功能-Internet Explorer 11 启用-确定\n新建快捷方式，输入：\n1 \u0026#34;C:\\Program Files\\Internet Explorer\\iexplore.exe\u0026#34; anything -Embedding 设置快捷方式名字：\n1 Internet Explorer ","date":"2025-10-22T13:28:49+08:00","permalink":"/p/251022132849/","title":"Windows10开启IE浏览器，禁止IE浏览器跳转到EDGE"},{"content":"电池 Win+R 输入cmd，再次输入\n1 powercfg /batteryreport ","date":"2025-10-18T19:50:26+08:00","permalink":"/p/251018195026/","title":"笔记本验机"},{"content":"简介 GitHub的CI/CD\n触发事件 1 2 3 4 on: push: tags: - \u0026#34;*\u0026#34; ","date":"2025-10-13T09:23:24+08:00","permalink":"/p/251013092324/","title":"GitHub Workflow指南"},{"content":"简介 开启 WSL2\n安装 virtulbox6.x 以上的 hcl，比如 hcl5.10.3\n安装后找到 virtualbox 所在目录，打开命令行，执行\n1 .\\VBoxManage.exe setextradata global \u0026#34;VBoxInternal/NEM/UseRing0Runloop\u0026#34; 0 重启计算机\n","date":"2025-10-10T20:04:46+08:00","permalink":"/p/251010200446/","title":"HCL与WSL2共存"},{"content":"简介 主界面，最上层菜单，中间部分按钮（接口图标，图标有个小眼睛）\n点击显示接口信息，再次点击关闭接口信息\n参考文档 HCL 设备接口显示不出来 ","date":"2025-09-30T15:44:47+08:00","permalink":"/p/250930154447/","title":"HCL显示接口信息"},{"content":"简介 HCL 高分辨率下缩放异常\n解决办法 找到安装位置，对 H3C Cloud Lab.exe右键点击属性，点击兼容模式，最下面找到改变高分别率设置，启用覆盖高分辨率，选项设置为系统\n","date":"2025-09-30T10:45:53+08:00","permalink":"/p/250930104553/","title":"HCL高分辨率不适配解决办法"},{"content":"在 Virtualbox 安装目录打开命令行\n输入\n1 .\\VBoxManage.exe setextradata global \u0026#34;VBoxInternal/NEM/UseRing0Runloop\u0026#34; 0 参考地址\nhttps://dev.to/cylon/h3c-hclyu-wsl2gong-cun-2af2\n","date":"2025-09-30T09:58:53+08:00","permalink":"/p/250930095853/","title":"HCL与WSL共存"},{"content":"简介 插件地址：https://github.com/nikkinikki-org/OpenWrt-momo\n要求 OpenWrt \u0026gt;= 24.10 Linux Kernel \u0026gt;= 5.13 firewall4 安装 A. Install From Feed (Recommended) Add Feed 1 2 # only needs to be run once wget -O - https://github.com/nikkinikki-org/OpenWrt-momo/raw/refs/heads/main/feed.sh | ash Install 1 2 3 4 5 6 7 8 9 # you can install from shell or `Software` menu in LuCI # for opkg opkg install momo opkg install luci-app-momo opkg install luci-i18n-momo-zh-cn # for apk apk add momo apk add luci-app-momo apk add luci-i18n-momo-zh-cn 搭建 sing-box-subscribe 参考教程：【全网首发】OpenWrt 全新代理神器 Momo！SingBox 完美适配 Clash 面板，超简单上手\ndocker-compose\n1 2 3 4 5 6 7 8 9 version: \u0026#39;3\u0026#39; services: sing-box: image: dockerhub16/sing-box-subscribe:latest container_name: sing-box-subscribe ports: - \u0026#34;5000:5000\u0026#34; restart: unless-stopped 服务：https://sing-box-subscribe.hix.dpdns.org:66/\n订阅地址组合示例 机场订阅复制 clash 或者通用订阅即可，多机场用 | 符合分割，最多三个，再多用 substore 去汇聚管理\n配置文件在 github，后端所在网络处于科学才可以正常拉取转换，直连记得加镜像。\n1 http://192.168.10.41:5000/config/机场订阅\u0026amp;file=配置文件地址 配置文件地址 切忌复制对应源码地址\nhttps://github.com/qichiyuhub/rule/tree/main/config/singbox/1.12.x\n最终订阅链接 1 https://sing-box-subscribe.hix.dpdns.org:66/config/https://bp.sub.cmliussss.net/sub?host=sa.wto.ip-ddns.com\u0026amp;uuid=f41c8f9b-5854-44d4-9bef-ad6803d1c99d\u0026amp;file=https://raw.githubusercontent.com/qichiyuhub/rule/refs/heads/main/config/singbox/1.12.x/momo.json 配置文件+CDN\n1 https://sing-box-subscribe.hix.dpdns.org:66/config/https://bp.sub.cmliussss.net/sub?host=sa.wto.ip-ddns.com\u0026amp;uuid=f41c8f9b-5854-44d4-9bef-ad6803d1c99d\u0026amp;file=https://gh-proxy.526899.xyz/https://raw.githubusercontent.com/qichiyuhub/rule/refs/heads/main/config/singbox/1.12.x/momo.json ","date":"2025-09-26T08:00:28+08:00","permalink":"/p/250926080028/","title":"OpenWrt安装科学上网工具momo"},{"content":"简介 qemu-guest-agent（简称 QEMU Guest Agent，或 qga）是运行在虚拟机（Guest）内部的一个轻量级守护进程，用于在虚拟机和宿主机（Host）之间建立通信通道，从而实现更精细的管理和控制。\n在 Proxmox VE（PVE）环境中，qemu-guest-agent 的作用尤为重要。以下是它的核心功能和用途：\n基本原理 QEMU Guest Agent 通过虚拟机内部的 virtio-serial 设备与宿主机上的 QEMU 进程通信。 宿主机可以通过这个通道向虚拟机发送命令，虚拟机也可以返回状态信息。 在 PVE 中的主要用途 IP 地址信息：PVE Web 界面可以显示虚拟机内部的 IP 地址（包括 IPv4/IPv6），而不仅限于网络层面的 MAC 地址。\n文件系统冻结/解冻：在创建快照前，可以通知 Guest 冻结文件系统（类似 fsfreeze），确保快照数据一致性（尤其对数据库等应用很重要）。\n关机/重启控制：通过 guest-shutdown 命令可以优雅地关闭或重启虚拟机（比强制断电更安全）。\n时间同步信息：可获取 Guest 系统时间，辅助调试。\n用户登录信息：可查询当前登录的用户（部分系统支持）。\n当启用 qemu-guest-agent 且配置了“冻结文件系统”选项时，PVE 在创建快照或备份前会自动调用 guest-fsfreeze-freeze，暂停文件系统写入，确保数据一致性，备份完成后自动解冻。\n安装 Debian/Ubuntu 1 2 3 apt update apt install qemu-guest-agent systemctl enable --now qemu-guest-agent OpenWrt 1 2 3 4 5 opkg update opkg install qemu-ga chmod +x /etc/init.d/qemu-ga /etc/init.d/qemu-ga enable reboot 如果还是没有启动，在 PVE 虚拟机管理界面“Options”选择“QEMU Guesst Agent”，设置为启用\n群晖 在套件中心 - 设置 - 套件来源中，添加「矿神 SPK」源，地址分别是：\nDSM6：https://spk.imnks.com/，还需要在「常规」-「信任层级」中选中「任何发行者」 DSM7：https://spk7.imnks.com/ 在套件中心中搜索「QEMU Guest Agent」，并安装，安装后不要启动。\n安装后 SSH 按照说明运行以下命令，然后启动套件。\n1 sudo sed -i \u0026#39;s/package/root/g\u0026#39; /var/packages/qemu-ga/conf/privilege 在 PVE 的虚拟机设置中，为 DMS 新增一个串口编号为 0 的串口设备，否则可能检测不到 QEMU Guest Agent。\n","date":"2025-09-26T07:25:43+08:00","permalink":"/p/250926072543/","title":"PVE虚拟机各系统安装qemu-guest-agent"},{"content":"主板：华硕 b250-plus\n开启方法：\n主机按开机键之后一直按 【DELETE 键】，进入 bios 主界面 选择 Advanced Mode 进入高级模式设置界面 切换菜单到\u0026quot;高级\u0026quot;，在“高级”下找到“高级电源管理”（APM） 进入“高级电源管理”（APM），点击”断电恢复“（Restore AC Power Loss），设置为“电源开启”(Power On) 如果测试拔掉电源，断电后重新插上电源主板没有启动，可能的原因：\n主板还有剩余电量，关机状态下点击“开机键”，重新插上电源线恢复 等待 1 分钟，放电后重新插上电源 其他设备给主板供电，比如 USB 设备带电，让主板一直处于有电状态。 ","date":"2025-09-25T10:57:27+08:00","permalink":"/p/250925105727/","title":"主板通电自启动"},{"content":"简介 解决 hcl 模拟器 启动设备提示失败。\n解决办法 打开 VirtualBox 安装根目录/drivers/vboxDrv，右键 VBoxDrv.inf 安装。 然后，打开注册表，找到计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\VBoxDrv目录下，编辑 start 项，将 1 改为 2，并重启计算机。 完成以上操作后，HCL 成功启动设备。 原理是将 VirtualBox 程序设定的“启动时加载服务”更改为“由服务控制管理器自动加载”。\n","date":"2025-09-21T00:28:08+08:00","permalink":"/p/250921002808/","title":"HCL模拟器设备启动失败解决办法"},{"content":"简介 解决华为 eNSP 模拟器和华三 HCL 模拟器共存\n准备 eNSP_V1.3.00.exe\nVirtualBox-5.2.44-139111-Win.exe\nWinPcap_4_1_3.exe\nWireshark-win64-3.6.10.exe\nHCL_v5.10.3-Setup.zip\n步骤 首先安装 eNSP，然后修改注册表安装 hcl，最后恢复注册表\n原因：hcl 安装会检测 VirtualBox 版本，按照官网所说，自带 VirtualBox6.0.14，所以修改注册表将 VirtualBox 从 eNSP 要求的 5.2.44 修改为 6.0.14，安装完 hcl 之后，VirtualBox 恢复为 5.2.44\n安装 VirtualBox-5.2.44-139111-Win.exe 安装 WinPcap_4_1_3.exe 安装 Wireshark-win64-3.6.10.exe 安装 eNSP_V1.3.00.exe 修改注册表，win+r 打开注册表，地址栏输入： 计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox 将 Version 和 VersionExt 的值由 5.2.44 改为 6.0.14 安装 HCL_v5.10.3-Setup.exe 恢复注册表，win+r 打开注册表，地址栏输入： 计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox 将 Version 和 VersionExt 的值由 6.0.14改为 5.2.44 参考文档 华为 eNSP 模拟器与新华三 HCL 模拟器共存安装教程 在电脑上同时安装华三 HCL 和华为 ENSP 的方法 ","date":"2025-09-20T22:41:12+08:00","permalink":"/p/250920224112/","title":"华为eNSP模拟器和华三HCL模拟器共存"},{"content":"简介 Lucky 最初是作为一个小工具，由开发者为自己的个人使用而开发，用于替代 socat，在小米路由 AX6000 官方系统上实现公网 IPv6 转内网 IPv4 的功能。Lucky 的设计始终致力于让更多的 Linux 嵌入式设备运行，以实现或集成个人用户常用功能，降低用户的硬件和软件操作学习成本，同时引导使用者注意网络安全。随着版本更新和网友反馈，Lucky 不断迭代改进，拥有更多功能和更好的性能，成为用户值得信赖的工具。\nLucky 的核心程序完全采用 Golang 实现，具有高效、稳定、跨平台等优点。其后台前端则采用 Vue3.2 技术进行开发，具有良好的用户体验和响应速度。此外，Lucky 的管理后台采用前后端分离的架构，第三方开发者也可以自由使用 OpenToken 轻松调用 Lucky 的各种功能接口。\n官网：https://lucky666.cn/docs/intro/\n功能模块 目前已经实现/集成的主要功能模块有\n端口转发 动态域名(DDNS) Web 服务 Stun 内网穿透 网络唤醒 计划任务 ACME 自动证书 网络存储 安装 bash\n1 URL=\u0026#34;http://release.66666.host\u0026#34;; curl -o /tmp/install.sh \u0026#34;$URL/install.sh\u0026#34; \u0026amp;\u0026amp; sh /tmp/install.sh \u0026#34;$URL\u0026#34; docker\n1 2 3 4 5 6 7 docker run -d \\ --name lucky \\ --network host \\ --restart always \\ -v 容器外持久化路径:/app/conf \\ -v /var/run/docker.sock:/var/run/docker.sock \\ gdy666/lucky:v2 docker compose\n1 2 3 4 5 6 7 8 9 services: lucky: image: gdy666/lucky:v2 container_name: lucky volumes: - 容器外持久化路径:/app/conf - /var/run/docker.sock:/var/run/docker.sock network_mode: host restart: always 默认登录信息：\n1 2 3 默认登陆地址 : http://\\{IP地址\\}:16601 默认账号：666 默认密码：666 域名服务 规则\n重定向：https://{host}:{port}\n内网穿透 stun 如果光猫是桥接模式，在路由器开启 dmz，指向 lucky 所在的 IP 如果光猫是自动获取 IP，在光猫设置 dmz，指向 lucky 所在的 IP lucky 开启 stun：\n在 Lucky 左侧菜单找到“内网穿透”，再次找到“stun 内网穿透”（lucky 老版本直接是“stun 内网穿透”），在进行 Nat 类型检测，多测几个，如果是“NAT1（Full Cone，全锥形）”表示可以。\n添加穿透规则：\n1 2 3 4 5 6 7 8 规则名称：可空 操作类型：简易模式 穿透类型：IPv4-TCP 穿透通道本地端口：0 表示随机端口 防火墙自动放心：开 目标地址：需要穿透的机器IP地址 目标端口：需要穿透的机器服务的端口 Webhook：可开可关（固定地址访问用） 固定地址访问：cloudflare 配置 worker 实现重定向：\n新建 worker：添加为如下代码，需要修改为自己的域名和端口\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // 配置参数 const CONFIG = { // 需要重定向的域名 sourceDomain: \u0026#39;s.a.com\u0026#39;, // 重定向后的域名 targetDomain: \u0026#39;s.a.com\u0026#39;, // 目标端口号 targetPort: \u0026#39;23525\u0026#39; }; addEventListener(\u0026#39;fetch\u0026#39;, event =\u0026gt; { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { const url = new URL(request.url); const hostname = url.hostname; // 只要 hostname 中包含 sourceDomain，就将 sourceDomain 替换为 targetDomain，并指定 port if (hostname.includes(CONFIG.sourceDomain)) { const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain); const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`; // 返回 302 临时重定向，如果有需要，可以改成 307 重定向 return Response.redirect(targetUrl, 302); } // 如果不是目标域名，则返回 404 return new Response(\u0026#39;Not Found\u0026#39;, { status: 404 }); } 创建编辑 worker 脚本的 API token 进入 Cloudflare worker，找到 Account ID，记录下来 回到 lucky，将 webhook 开启，参数参考以下：\n接口地址 1 https://api.cloudflare.com/client/v4/accounts/账户ID/workers/scripts/redirect 请求方法\n1 PUT 请求头\n1 2 Authorization: Bearer \u0026lt;workers的API密钥\u0026gt; Content-Type: application/javascript 请求体\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // 配置参数 const CONFIG = { // 需要重定向的域名 sourceDomain: \u0026#39;a.com\u0026#39;, // 重定向后的域名 targetDomain: \u0026#39;s.a.com\u0026#39;, // 目标端口号 targetPort: \u0026#39;#{port}\u0026#39; }; addEventListener(\u0026#39;fetch\u0026#39;, event =\u0026gt; { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { const url = new URL(request.url); const hostname = url.hostname; // 只要 hostname 中包含 sourceDomain，就将 sourceDomain 替换为 targetDomain，并指定 port if (hostname.includes(CONFIG.sourceDomain)) { const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain); const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`; // 返回 302 临时重定向，如果有需要，可以改成 307 重定向 return Response.redirect(targetUrl, 302); } // 如果不是目标域名，则返回 404 return new Response(\u0026#39;Not Found\u0026#39;, { status: 404 }); } 接口调用成功包含的字符串\n1 \u0026#34;success\u0026#34;: true ","date":"2025-09-04T11:00:13+08:00","permalink":"/p/250904110013/","title":"lucky，集端口转发，动态域名(DDNS)，Web服务，Stun内网穿透，网络唤醒，计划任务，ACME自动证，，网络存储 一体的工具"},{"content":"简介 去掉登录订阅提示\n1 2 3 4 sed -i_orig \u0026#34;s/data.status === \u0026#39;Active\u0026#39;/true/g\u0026#34; /usr/share/pve-manager/js/pvemanagerlib.js sed -i_orig \u0026#34;s/if (res === null || res === undefined || \\!res || res/if(/g\u0026#34; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js sed -i_orig \u0026#34;s/.data.status.toLowerCase() !== \u0026#39;active\u0026#39;/false/g\u0026#34; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js systemctl restart pveproxy 调整CPU频率\n1 2 3 4 5 6 7 cpupower -c all frequency-set -g conservative cpupower -c all frequency-set -g ondemand cpupower -c all frequency-set -g powersave cpupower -c all frequency-set -g performance 参考资料：\nProxmox VE 9.0 日常维护，去掉未订阅的提示，和设置国内源——2025年8月6日更新 ","date":"2025-09-04T10:49:21+08:00","permalink":"/p/250904104921/","title":"PVE安装，配置"},{"content":"aws light 默认开机没有 sudo 权限，无法使用 sudo\n1 2 3 4 5 #!/bin/bash echo root:AwsPass@100 |sudo chpasswd root sudo sed -i \u0026#39;s/^#\\?PermitRootLogin.*/PermitRootLogin yes/g\u0026#39; /etc/ssh/sshd_config; sudo sed -i \u0026#39;s/^#\\?PasswordAuthentication.*/PasswordAuthentication yes/g\u0026#39; /etc/ssh/sshd_config; sudo reboot ","date":"2025-08-29T17:25:02+08:00","permalink":"/p/250829172502/","title":"aws light 开启sudo权限"},{"content":"插件 VSCode 插件位置存放在 ~/.vscode\nVSCodium 插件位置存放在 ~/.vscode-oss\n将 ~/.vscode/extensions 复制到 ~/.vscode-oss/extensions\n其他设置 VSCode 的 keybindings.json and settings.json 在：\nWindows: %APPDATA%\\Code\\User macOS: $HOME/Library/Application Support/Code/User Linux: $HOME/.config/Code/User 可以复制到 VSCodium 用户设置文件夹：\nWindows: %APPDATA%\\VSCodium\\User macOS: $HOME/Library/Application Support/VSCodium/User Linux: $HOME/.config/VSCodium/User 或者把全部配置直接复制，重新打开 VSCodium 也可以看到生效\n参考资料：\nHow to Migrate From VS Code to VS Codium ","date":"2025-08-16T20:30:35+08:00","permalink":"/p/250816203035/","title":"VSCode迁移配置到VSCodium"},{"content":"简介 Whisper 是一种通用语音识别模型。它在一个包含各种音频的大型数据集上进行训练，同时也是一个多任务模型，可以执行多种语言的语音识别、语音翻译和语言识别。\n源码：https://github.com/openai/whisper\n安装 1 pip install -U openai-whisper 除此之外还需安装 ffmpeg\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # on Ubuntu or Debian sudo apt update \u0026amp;\u0026amp; sudo apt install ffmpeg # on Arch Linux sudo pacman -S ffmpeg # on MacOS using Homebrew (https://brew.sh/) brew install ffmpeg # on Windows using Chocolatey (https://chocolatey.org/) choco install ffmpeg # on Windows using Scoop (https://scoop.sh/) scoop install ffmpeg 使用方式 不带任何参数，默认使用模型 turbo\n1 whisper audio.mp3 指定模型\n1 whisper audio.mp3 --model small 指定音频的语言\n1 whisper audio.mp3 --language Chinses 查看帮助\n1 whisper --help ","date":"2025-08-16T17:42:37+08:00","permalink":"/p/250816174237/","title":"whisper，OpenAI开源的语音转文字大模型"},{"content":"简介 略\n官网：https://podman.org.cn/docs/installation\n安装 Linux 1 sudo apt install podman 配置 设置默认短命名镜像位置\n不像于docker，直接使用 nginx这种镜像名字，podman是不知道在哪里拉取的，所以需要配置默认的镜像地址\n1 sudoedit /etc/containers/registries.conf 1 2 [registries.search] registries = [\u0026#39;docker.io\u0026#39;] ","date":"2025-08-15T14:12:27+08:00","permalink":"/p/250815141227/","title":"podman安装配置"},{"content":"简介 Beszel 是一个轻量级的服务器监控平台，包含 Docker 统计信息、历史数据和警报功能。\n它拥有友好的 Web 界面、简单的配置，并且开箱即用。它支持自动备份、多用户、OAuth 身份验证和 API 访问。\n官网：https://www.beszel.dev\n安装 hub Docker 1 2 3 4 mkdir -p /srv/container_srv/beszel cd /srv/container_srv/beszel vim docker-compose.yml 1 2 3 4 5 6 7 8 9 services: beszel: image: henrygd/beszel container_name: beszel restart: unless-stopped ports: - 8030:8090 volumes: - ./beszel_data:/beszel_data 安装 agent 使用 Hub hub 提供了 docker 安装命令，先在 web 界面添加新的 agent，复制 docker compose 文件后者 docker 命令在 agent 端安装\nDocker 1 2 3 4 mkdir -p /srv/container_srv/beszel-agent cd /srv/container_srv/beszel-agent vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 services: beszel-agent: image: henrygd/beszel-agent container_name: beszel-agent restart: unless-stopped network_mode: host volumes: - ./beszel_agent_data:/var/lib/beszel-agent - /var/run/docker.sock:/var/run/docker.sock:ro # 通过在 /extra-filesystems 中挂载文件夹来监控其他磁盘/分区 # - /mnt/disk1/.beszel:/extra-filesystems/disk1:ro environment: LISTEN: 45876 KEY: \u0026#34;\u0026lt;公钥\u0026gt;\u0026#34; HUB_URL: \u0026#34;http://localhost:8090\u0026#34; TOKEN: \u0026#34;\u0026lt;令牌\u0026gt;\u0026#34; ","date":"2025-08-14T10:36:42+08:00","permalink":"/p/250814103642/","title":"beszel，一个轻量级的服务器监控平台，包含 Docker 统计信息、历史数据和警报功能。"},{"content":"开启 root 远程登录和密码登录 1 sudo sed -i \u0026#39;s/^#\\?PasswordAuthentication no/PasswordAuthentication yes/\u0026#39; /etc/ssh/sshd_config 1 sudo sed -i \u0026#39;s/^#\\?PermitRootLogin no/PermitRootLogin yes/\u0026#39; /etc/ssh/sshd_config 1 sudo systemctl restart sshd 重置 root 密码 1 passwd 终端提示符 1 curl -sS https://starship.rs/install.sh | sh 1 echo \u0026#39;eval \u0026#34;$(starship init bash)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc 1 source ~/.bashrc 安装docker 1 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done 1 2 3 4 5 6 7 8 9 10 11 12 13 # Add Docker\u0026#39;s official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null sudo apt-get update 1 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 创建docker目录\n1 mkdir -p /srv/container_srv 添加 bash 别名 1 vim ~/.bashrc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 export LS_OPTIONS=\u0026#39;--color=auto\u0026#39; eval \u0026#34;$(dircolors)\u0026#34; alias ls=\u0026#39;ls $LS_OPTIONS\u0026#39; alias ll=\u0026#39;ls $LS_OPTIONS -l\u0026#39; alias l=\u0026#39;ls $LS_OPTIONS -lA\u0026#39; alias rm=\u0026#39;rm -i\u0026#39; alias cp=\u0026#39;cp -i\u0026#39; alias mv=\u0026#39;mv -i\u0026#39; # docker alias alias dk=\u0026#39;docker\u0026#39; alias dco=\u0026#39;dk compose\u0026#39; alias dcod=\u0026#39;dk compose down\u0026#39; alias dcodu=\u0026#39;dco down \u0026amp;\u0026amp; dco up\u0026#39; alias dcodud=\u0026#39;dco down \u0026amp;\u0026amp; dco up -d\u0026#39; 1 source ~/.bashrc 安装sing-box 1 2 3 4 5 6 7 8 9 10 11 12 13 sudo mkdir -p /etc/apt/keyrings \u0026amp;\u0026amp; sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc \u0026amp;\u0026amp; sudo chmod a+r /etc/apt/keyrings/sagernet.asc \u0026amp;\u0026amp; echo \u0026#39; Types: deb URIs: https://deb.sagernet.org/ Suites: * Components: * Enabled: yes Signed-By: /etc/apt/keyrings/sagernet.asc \u0026#39; | sudo tee /etc/apt/sources.list.d/sagernet.sources \u0026amp;\u0026amp; sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install sing-box # or sing-box-beta 编辑配置文件\n1 cd /etc/sing-box 1 vim config.json 启动sing-box\n1 systemctl start sing-box vim配置 1 vim ~/.vimrc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 \u0026#34; 基本设置 set nocompatible \u0026#34; 不兼容 vi syntax on \u0026#34; 开启语法高亮 \u0026#34; 缩进设置 set tabstop=2 \u0026#34; 设置制表符占用的空格数 set shiftwidth=2 \u0026#34; 设置自动缩进的空格数 set softtabstop=2 \u0026#34; 设置编辑时制表符转换为空格的空格数 set expandtab \u0026#34; 使用空格代替制表符 \u0026#34; 搜索设置 set hlsearch \u0026#34; 高亮显示搜索结果 set incsearch \u0026#34; 输入时即时搜索 set ignorecase \u0026#34; 搜索时忽略大小写 set smartcase \u0026#34; 当搜索包含大写字母时，不忽略大小写 \u0026#34; 界面设置 set number \u0026#34; 显示行号 \u0026#34; set relativenumber \u0026#34; 显示相对行号 set cursorline \u0026#34; 高亮当前行 set nowrap \u0026#34; 不自动折行 set showcmd \u0026#34; 显示命令模式下的命令 set showmode \u0026#34; 显示当前模式 \u0026#34; 回滚设置 set undofile \u0026#34; 允许保存撤销历史 set undolevels=1000 \u0026#34; 设置撤销级别 \u0026#34; 文件编码设置 set encoding=utf-8 \u0026#34; 设置文件编码为 UTF-8 set fileencoding=utf-8 \u0026#34; 设置文件编码为 UTF-8 \u0026#34; 状态栏设置 set laststatus=2 \u0026#34; 总是显示状态栏 \u0026#34; 其他设置 set autoindent \u0026#34; 自动缩进 set smartindent \u0026#34; 智能缩进 set backspace=indent,eol,start \u0026#34; 允许退格键跨越空格、行尾和插入点 set mouse=a \u0026#34; 启用鼠标支持 set clipboard=unnamed \u0026#34; 使用系统剪贴板 \u0026#34; 代码折叠 set foldmethod=indent \u0026#34; 使用缩进来决定代码折叠 set foldlevelstart=99 \u0026#34; 初始折叠级别 \u0026#34; 命令缩写 command W w \u0026#34; 简化保存文件的命令 \u0026#34; 键位映射 nnoremap \u0026lt;F5\u0026gt; :set number!\u0026lt;CR\u0026gt; \u0026#34; 按 F5 切换显示/隐藏行号 \u0026#34; 颜色方案 colorscheme default \u0026#34; 设置颜色方案（这里使用 Vim 默认方案） ","date":"2025-08-12T11:29:34+08:00","permalink":"/p/250812112934/","title":"全新Linux初次必须要做的事项"},{"content":"简介 GPU-Z 是一种轻量级系统实用程序，旨在为您提供关于显卡和图形处理器的重要信息。\n官方地址：https://www.techpowerup.com/gpuz/\n主要特性 支持 NVIDIA、AMD、ATI 和 Intel 显卡设备 显示适配器、GPU 和显示信息 显示超频、默认频率和 3D/加速频率（如果可用） 详细报告显存子系统：显存大小、类型、频率、总线位宽 包含一个 GPU 负载测试，用于验证 PCI-Express 通道配置 结果验证 GPU-Z 可以创建您的显卡 BIOS 备份 无需安装，提供可选安装程序 支持 Windows 11 / Windows 10 / Windows 8 / Windows 7 / Vista / Windows XP（支持 32 位和 64 位版本） ……是的，CPU-Z 的作者已授权我们使用与他的产品相似的名称。感谢 Franck。 商业授权 GPU-Z 个人和商业使用均免费。但是，您不得将 GPU-Z 作为商业套装的一部分进行再分发。\n我们还提供 GPU-Z SDK，它是一个易于使用的 DLL，功能齐全，可用于 C/C++/.NET 等开发环境。我们提供商业支持和定制服务，详情请联系我们。\n预览 安装 下载地址：https://www.techpowerup.com/gpuz/\n","date":"2025-08-09T11:28:57+08:00","permalink":"/p/250809112857/","title":"GPU-Z，显卡信息查看的轻量级系统程序"},{"content":"","date":"2025-08-07T15:35:15+08:00","permalink":"/p/250807153515/","title":"potplayer常用设置"},{"content":"简介 本篇将介绍使用 potplayer 播放器实现视频实时字幕生成和翻译\n下载potplayer：https://potplayer.daum.net/\n实时字幕生成 利用openai的 wisper模型，做到语音转文字，做到实时生成字幕\n打开 potplyaer 主界面，右键字幕-生成有声字幕-生成有声字幕，打开如下界面\n转换引擎下拉选择推荐的即可，直接点击右边的下载按钮下载。如果提示：无法执行安全验证。导致无法下载，跟着下面的步骤手动下载。\n","date":"2025-08-07T13:27:05+08:00","permalink":"/p/250807132705/","title":"potplayer实时字幕生成+实时字幕翻译"},{"content":" 1 2 3 4 5 6 7 8 9 10 # some more ls aliases alias ll=\u0026#39;ls -l\u0026#39; alias la=\u0026#39;ls -A\u0026#39; alias l=\u0026#39;ls -CF\u0026#39; alias dk=\u0026#39;docker\u0026#39; alias dco=\u0026#39;dk compose\u0026#39; alias dcod=\u0026#39;dk compose down\u0026#39; alias dcodu=\u0026#39;dco down \u0026amp;\u0026amp; dco up\u0026#39; alias dcodud=\u0026#39;dco down \u0026amp;\u0026amp; dco up -d\u0026#39; ","date":"2025-08-06T16:58:37+08:00","permalink":"/p/250806165837/","title":"bash配置 .bashrc"},{"content":"Nginx\n1 2 3 4 acme.sh --install-cert -d example.com \\ --key-file /path/to/keyfile/in/nginx/key.pem \\ --fullchain-file /path/to/fullchain/nginx/cert.pem \\ --reloadcmd \u0026#34;service nginx force-reload\u0026#34; ","date":"2025-08-06T14:30:55+08:00","permalink":"/p/250806143055/","title":"acme.sh申请模板，包含Nginx"},{"content":"MySQL 客户端执行 SQL 文件 不登录 MySQL 客户端执行 SQL 文件 有时候不想登录 MySQL 客户端执行 SQL 文件，也不想使用第三方的 gui 工具，可以如下命令\n1 mysql -u 用户名 -p -D数据库 \u0026lt; sql文件的全路径 例如\n1 mysql -u root -p -Dtorna \u0026lt; mysql.sql 数据库要提前创建好，sql 文件的路径要对\ndsn := \u0026ldquo;username:password@tcp(host:port)/dbname\u0026rdquo;\n1 2 # 备份整个数据库，整个备份会把数据库名也包含进去，恢复需要保持数据名一致 mysqldump -u root -p maccms \u0026gt; maccms_$(date \u0026#39;+%Y%m%d_%H%M%S\u0026#39;).sql 备份数据库 mysqldump mysqldump 是 mysql 自带的备份工具\n备份整个数据库，整个备份会把数据库名也包含进去，恢复需要保持数据名一致，例如：\n1 mysqldump -u root -p maccms \u0026gt; maccms_$(date \u0026#39;+%Y%m%d_%H%M%S\u0026#39;).sql 1 mysqldump -uroot -p --databases maccms --ignore-table maccms.mac_vod \u0026gt; maccms_no_mac_vod_$(date \u0026#34;+%Y-%m-%d_%H-%M-%S\u0026#34;).sql 恢复数据库 从数据库文件恢复数据库\n1 mysql -u root -p maccms \u0026lt; maccms_20240501_143709.sql 1 2 3 4 5 6 7 # 恢复数据 mysql -u root -p maccms \u0026lt; maccms_20240501_143709.sql # docker外部执行 docker exec -i mysql mysql -u maccms -pmaccms_pass_1 maccms \u0026lt; ./backup/my_backup.sql docker exec -i mariadb mysql -u maccms -pmaccms_pass_1 maccms \u0026lt; ./devpluse_maccms.sql ","date":"2025-08-06T14:26:18+08:00","permalink":"/p/250806142618/","title":"MySQL指南"},{"content":"dsn\ndsn := \u0026ldquo;user=username password=password dbname=mydb host=localhost port=5432 sslmode=disable\u0026rdquo;\n","date":"2025-08-06T14:25:13+08:00","permalink":"/p/250806142513/","title":"PostgreSQL指南"},{"content":"Docker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 version: \u0026#39;3.3\u0026#39; services: mariadb: image: mariadb:10.3 container_name: mariadb environment: - MARIADB_ROOT_PASSWORD=mariadb-1 volumes: - ./mariadb_data:/var/lib/mysql - ./backup/:/root/backup ports: - 3306:3306 restart: unless-stopped logging: driver: \u0026#34;json-file\u0026#34; options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; ","date":"2025-08-06T14:22:03+08:00","permalink":"/p/250806142203/","title":"MariaDB安装"},{"content":"Docker docker cli\n1 2 3 4 5 6 7 sudo docker run -p 3306:3306 --name mysql \\ -v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \\ -v /usr/local/docker/mysql/conf:/etc/mysql \\ -v /usr/local/docker/mysql/logs:/var/log/mysql \\ -v /usr/local/docker/mysql/data:/var/lib/mysql \\ -e MYSQL_ROOT_PASSWORD=root \\ -d mysql:8.0.23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: \u0026#39;3.9\u0026#39; services: mysql: image: mysql:8.4.0 container_name: mysql environment: - \u0026#34;MYSQL_ROOT_PASSWORD=yourpassword\u0026#34; - \u0026#34;TZ=Asia/Shanghai\u0026#34; volumes: - ./mysql_data/mysql-files:/var/lib/mysql-files #- ./mysql/conf:/etc/mysql - ./mysql_data/logs:/var/log/mysql - ./mysql_data/data:/var/lib/mysql # 数据库备份 - ./backup/:/root/backup ports: - 3306:3306 restart: unless-stopped logging: driver: \u0026#34;json-file\u0026#34; options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; ","date":"2025-08-06T14:19:48+08:00","permalink":"/p/250806141948/","title":"MySQL安装"},{"content":"简介 iPerf3 是一个用于主动测量 IP 网络上最大可达带宽的工具。它支持调优与时序、缓冲区和协议 (TCP、UDP、带 IPv4 和 IPv6 的 SCTP) 相关的各种参数。对于每个测试，它都会报告带宽、损耗和其他参数。这是一个新的实现，与原始 iPerf 没有共享代码，也不向后兼容。iPerf 最初由 NLANR/DAST 开发。iPerf3 主要由 ESnet / 劳伦斯伯克利国家实验室开发。它是根据三条 BSD 许可证发布的。\n使用 使用 iperf3 需要分为客户端和服务端，通过不同的参数实现\n服务端 选项：\n-s: 启动服务器模式。 -p \u0026lt;端口号\u0026gt;: 指定服务器监听的端口号。 1 iperf3 -s -p 8000 客户端 1 iperf3 -c 192.168.1.100 -p 8000 ","date":"2025-08-03T14:07:43+08:00","permalink":"/p/250803140743/","title":"iperf3，一个用于主动测量 IP 网络上最大可达带宽的工具"},{"content":"简介 安装 Docker docker cli\n1 2 3 4 5 docker run -it --rm \\ --network=\u0026#34;host\u0026#34; \\ -v \u0026lt;DIRECTORY_TO_SCRAPE\u0026gt;:\u0026lt;SCANNER.INPUT_DIRECTORY\u0026gt; \\ -v \u0026lt;YOUR_CONFIG_FILE.YML\u0026gt;:/app/config.yml\\ ghcr.io/yuukiy/javsp:master docker compose\n1 2 3 4 5 6 7 8 9 10 11 version: \u0026#39;3.8\u0026#39; services: javsp: image: ghcr.io/yuukiy/javsp:master container_name: javsp volumes: - /mnt/p1:/mnt/p1 - ./javsp_data/app/config.yml:/app/config.yml network_mode: host restart: \u0026#34;unless-stopped\u0026#34; ","date":"2025-08-03T11:43:53+08:00","permalink":"/p/250803114353/","title":"JavSP，汇总多站点数据的AV元数据刮削器"},{"content":"简介 部署 Docker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 version: \u0026#34;3.9\u0026#34; # 或者使用你想要的Compose文件版本，例如 \u0026#34;3.8\u0026#34;, \u0026#34;3.7\u0026#34; 等 services: jellyfin: image: jellyfin/jellyfin container_name: jellyfin #user: 1000:1000 network_mode: \u0026#39;host\u0026#39; volumes: - ./config:/config - ./cache:/cache - /mnt/p1:/media #- type: bind # source: ./media # target: /media #- type: bind # source: ./media2 # target: /media2 # read_only: true # Optional - extra fonts to be used during transcoding with subtitle burn-in #- type: bind # source: /path/to/fonts # target: /usr/local/share/fonts/custom # read_only: true restart: \u0026#39;unless-stopped\u0026#39; # Optional - alternative address used for autodiscovery environment: #- JELLYFIN_PublishedServerUrl=http://example.com - PUID=0 - PGID=0 - TZ=Asia/Shanghai # Optional - may be necessary for docker healthcheck to pass if running in host network mode #extra_hosts: # - \u0026#39;host.docker.internal:host-gateway\u0026#39; 访问 ip:8096 打开设置\n","date":"2025-08-03T08:40:49+08:00","permalink":"/p/250803084049/","title":"Jellyfin指南"},{"content":"前言 本来吧，买了个阿里云服务器部署服务，前几天阿里云告诉我域名注册商必须转回国内，因为各种原因最后决定取消备案。\n结果就是空有公网服务器，用域名反向代理后因为没有备案访问不了。\n最后算了，在这台服务器上部署内网穿透吧。\n在阿里云上部署内网穿透，这叫啥事啊。。。 这个服务器还有 1 年多几个月，打算先用几个月，最后把那一年给退了。\n简介 本文将介绍使用 Cloudflare Tunnel 服务实现内网穿透，做到因为各种原因其他人无法在公网访问你本地服务的人实现访问。\n正文 准备 一个域名 一个 Cloudflare 账号 docker compose 首先准备这三样\n创建 Cloudflare Tunnel 登录 cloudflare控制面板\n找到 Zero Trust，点击进入\n点击 Networks下的Tunnels，进入tunnel主界面\n点击 Create a tunnel 创建一个tunnel服务\n选择 Cloudflared，接着输入本次的tuennel名字标识，点击下一步\n找到并复制类似这样的一行\n1 cloudflared.exe service install eyJhIjoiMzFmMDc3NWM2ZDIxxxxxxxxxxxxxxxxxxxxxxxxx 其中 eyJhIjoiMzF开头的部分就是你本次创建的 cloudflare tunnel服务的访问密钥，记下来，稍后会用到\n运行 cloudflared cloudflare tunnel 是穿透服务，运行这个服务的程序是 cloudflared，这个穿透服务可以在各种环境上使用，包括：\nWindows Mac Linux Docker 为了简单使用和迁移，本次采用 Docker 方式。\ndocker compose\n1 2 3 4 5 6 7 services: cloudflared: image: cloudflare/cloudflared container_name: cloudflared restart: unless-stopped network_mode: host command: tunnel --no-autoupdate run --protocol http2 --token #这里填入自己的token即可 运行即可成功开启了 cloudflare tunnel。\n创建公网域名 回到Cloudflare tunnel，接着进入到 Route tunnel 找到 Public hostname部分：\nHostname\nSubdomain：子域名 Domain：主域名 Path：路径，选填 Service\nType：类型，包含了 http、https、unix、tcp、ssh\u0026hellip;一系列协议 URL：本地服务的ip:port 设置好，保存即可\n参考：\n(无需公网ip,无需端口号）使用Docker Compose部署Cloudflare Tunnel实现内网穿透\n","date":"2025-06-25T07:21:21+08:00","permalink":"/p/250625072121/","title":"Cloudflare Tunnel内网穿透服务指南"},{"content":"简介 字体，不仅仅是文字的载体，更是视觉传达的灵魂。合适的字体能够增强信息的可读性、传递品牌个性、营造恰当的情感氛围；而糟糕的字体选择则可能让你的信息晦涩难懂，甚至损害专业形象。\n本指南将带你了解字体的奥秘，助你做出明智的字体选择和应用。\n字体分类 衬线字体 (Serif) 特征： 在笔画的末端有装饰性的“小脚”（衬线）。 特点： 给人以传统、经典、权威、可靠的感觉。在印刷品中，衬线有助于引导视线，提高阅读流畅度。 常见字体： Times New Roman, Georgia, Garamond, Baskerville, 宋体 适用场景： 书籍、报纸、杂志等印刷正文，品牌标志（尤其是需要传达历史感、信赖感的品牌），法律文件，学术论文。 无衬线字体 (Sans-serif) 特征： 笔画末端没有装饰性的衬线，线条简洁、直观。 特点： 给人以现代、简洁、清晰、科技感和效率感。在屏幕显示上，无衬线字体通常更清晰易读。 常见字体： Arial, Helvetica, Lato, Open Sans, Montserrat, 思源黑体 适用场景： 网页设计、APP 界面、PPT 演示文稿、招牌、海报、品牌标志（尤其是科技、时尚、简约风格的品牌），短篇正文。 手写/脚本字体 (Script) 特征： 模仿手写字体的风格，连笔、流畅或带有书法艺术感。 特点： 优雅、个性、浪漫、复古或活泼。通常不适合大段阅读。 常见字体： Pacifico, Great Vibes, Brush Script MT, 草书、行书字体 适用场景： 标题、邀请函、贺卡、品牌标志、艺术品设计、个性化签名。 装饰/展示字体 (Display) 特征： 设计独特，具有强烈的视觉冲击力，往往是为了吸引眼球而设计。 特点： 富有创意、张扬个性，但通常可读性不强。 常见字体： Impact, Lobster, Anton, 各种艺术字、卡通字 适用场景： 标题、海报、广告、标志、品牌口号、短语。 等宽字体 (Monospace) 特征： 每个字符（包括空格）占据相同的水平宽度。 特点： 整齐划一，常用于代码显示，营造科技感或复古打字机效果。 常见字体： Courier New, Consolas, Fira Code 适用场景： 编程代码、命令行界面、复古设计、数据表格。 如何选择合适的字体（核心） 选择字体并非随意，需要综合考虑多个因素。\n明确目的与受众 传达信息： 你希望通过字体传达什么？专业？友好？创意？严肃？ 目标受众： 你的受众是谁？年轻人？专业人士？大众？他们的阅读习惯和审美偏好是怎样的？ 例如： 为儿童产品设计，应选择活泼、圆润的字体；为金融机构设计，应选择稳重、可信赖的字体。 注重可读性与易读性 这是字体的“实用性”：\n可读性 (Legibility)： 指单个字母或字符容易被辨认的程度。笔画过细、过密或过于花哨的字体可读性差。 易读性 (Readability)： 指文本段落阅读的流畅程度。字号、行距、字距、颜色对比等都会影响易读性。 原则： 正文内容（尤其是长篇文字）优先选择高可读性、高易读性的字体（如衬线或无衬线字体）。标题和短语可以使用更具个性的字体。 传达情感与个性 每种字体都有其“性格”：\n衬线字体： 传统、典雅、庄重、信任、权威。 无衬线字体： 现代、简洁、中立、高效、开放。 手写字体： 艺术、个性、浪漫、非正式。 装饰字体： 独特、大胆、有趣、主题性强。 思考： 你的品牌或项目想要给人的第一印象是什么？ 考虑载体与平台 屏幕显示： 像素限制，无衬线字体通常表现更好，特别是在小字号下。高分屏时代，衬线字体在屏幕上的表现也有所提升。 印刷品： 衬线字体在纸质印刷中表现出色，有助于阅读流畅性。需要注意字体的墨水扩散和最小可印字号。 响应式设计： 确保字体在不同屏幕尺寸下都能保持良好的可读性。 语言支持与版权 多语言支持： 如果你的项目涉及多种语言，请确保所选字体包含所有必要的字符集。 版权与许可： 字体和图片一样，都有版权。使用前务必检查字体的使用许可（个人使用、商业使用、免费、付费等），避免侵权。 字体搭配的艺术（进阶） 大多数设计场景都需要搭配使用多种字体。成功的字体搭配能创造视觉层次和风格统一。\n对比与和谐 类型对比： 最常见的搭配是衬线字体与无衬线字体的组合。一个用于标题（例如无衬线），一个用于正文（例如衬线），形成清晰的层级感。 示例： 标题用“Montserrat”（无衬线），正文用“Merriweather”（衬线）。 粗细对比 (Weight)： 使用相同字体家族的不同字重（细体、常规体、粗体、黑体）来区分信息优先级。 示例： 标题用“Bold”，副标题用“SemiBold”，正文用“Regular”。 大小对比 (Size)： 这是最直接的层级区分方式，通过字号大小来指示信息的层级关系。 风格对比： 例如，将一个庄重的字体与一个活泼的字体搭配，制造有趣的张力（但需谨慎，避免冲突）。 保持简洁：2-3 原则 主字体 (Primary Font)： 用于标题、核心信息，通常最有特色。 辅助字体 (Secondary Font)： 用于正文、副标题，通常可读性强。 强调字体 (Accent Font / Optional)： 仅在特定需要强调、点缀的场景使用，如引言、小标题或特殊元素。 建议： 除非有特殊需求，避免使用超过三种字体，否则容易显得杂乱无章。 借助字体家族 许多字体都带有完整的“字体家族”（Font Family），包含不同字重（Light, Regular, Bold, Black）、斜体（Italic）、宽度（Condensed, Extended）等。\n优势： 使用同一字体家族的不同成员进行搭配，可以确保视觉上的高度统一和和谐，同时又能通过粗细、大小等变化形成层级。这是最安全、最专业的搭配方式。 避免的搭配误区 相似度过高： 两个非常相似但又不完全一样的字体搭配在一起，会显得不伦不类，难以区分。 冲突感太强： 过于花哨的字体与过于严肃的字体强行组合，容易造成视觉混乱。 滥用手写/装饰字体： 这类字体通常只适合少量使用，作为点缀，不适合作为正文。 “Windows/Mac 默认”字体： 除非是特定用途，否则尽量避免过度使用系统默认的字体（如宋体、黑体、微软雅黑、Arial），它们可能缺乏个性和品牌识别度。 字体排版与应用技巧（实操） 选择好字体只是第一步，如何排版和应用，决定了最终的视觉效果。\n建立视觉层级 (Visual Hierarchy) 通过字号、字重、颜色、行距、间距等，清晰地区分标题、副标题、正文、引用、标注等不同类型的信息。 标题： 最大、最粗，吸引注意。 副标题： 次之，引导阅读。 正文： 易读，保持一致性。 标注/引用： 可以用不同字重、斜体或略小字号区分。 行高 (Leading) 定义： 文本行与行之间的垂直距离。 重要性： 合适的行高能让文本呼吸，提高阅读舒适度。过紧会显得拥挤，过松则会割裂文本块。 建议： 一般来说，行高应是字号的 1.2 到 1.5 倍。例如，16pt 的字号，行高可以是 19-24pt。 字间距 (Tracking/Kerning) 字间距 (Tracking)： 整个单词或文本块中所有字符的间距调整。 字偶间距 (Kerning)： 对特定字符对（如\u0026quot;VA\u0026quot;、\u0026ldquo;Ty\u0026rdquo;）之间间距的微调，以达到视觉上的平衡。 重要性： 影响文本的疏密和视觉美感。过松会松散，过紧会拥挤。 建议： 大多数排版软件会提供自动字偶间距。在标题或标志设计中，手动调整字偶间距至关重要，以确保字母之间视觉均匀。 段落间距 在段落之间留出足够的空白，有助于区分不同的信息块，让内容结构更清晰。 对齐方式 左对齐： 最常用且易读，尤其适合长篇正文，给人以整洁、自然的阅读流。 居中对齐： 适用于标题、短诗、邀请函等，传达正式或优雅感，但不适合大段正文。 右对齐： 较少用，常用于侧边栏、图片说明或强调部分，通常与左对齐的文本结合使用。 两端对齐 (Justify)： 文本左右边缘对齐，常用于报纸、杂志等正式印刷品，但可能导致单词之间出现不均匀的“河流”空白。 颜色与背景对比 高对比度： 正文文本与背景之间必须有足够的对比度，以确保可读性（例如，深色文字在浅色背景上，或浅色文字在深色背景上）。 避免冲突色： 避免使用颜色过于接近或过于鲜艳、对比度低的组合，容易引起视觉疲劳。 强调： 可以使用少量高亮色来强调关键信息。 保持一致性 在整个项目或品牌中，保持字体使用、字号、字重、行高、间距等的一致性。 这有助于建立品牌识别度，并为用户提供统一、专业的视觉体验。 常见字体误区与避免方法 使用过多字体 误区： 尝试用多种字体来表达“多样性”或“创意”。 后果： 视觉混乱，缺乏专业性，难以建立统一风格。 避免： 坚持 2-3 字体原则，并通过字重、大小、颜色来创造变化。 可读性差的字体用于正文 误区： 将华丽、复杂的装饰或手写字体用于大段文本。 后果： 阅读困难，读者疲劳，信息传达效率低下。 避免： 正文优先选择简洁、清晰的衬线或无衬线字体。装饰字体仅用于标题或短语。 不恰当的搭配 误区： 两个风格过于相似或过于冲突的字体搭配。 后果： 视觉效果不协调，缺乏层次感或造成混乱。 避免： 遵循对比与和谐原则，多参考优秀设计案例，或使用同一字体家族。 忽视版权 误区： 随意下载和使用任何看起来漂亮的字体。 后果： 可能面临法律风险，尤其是商业用途。 避免： 务必查阅字体许可协议。使用免费字体时，选择明确标明可用于商业用途的字体。 滥用特殊效果 误区： 对字体施加过多描边、阴影、渐变、扭曲等效果。 后果： 字体变得难以辨认，俗气，分散注意力。 避免： 字体效果应谨慎使用，以增强而非干扰可读性为目的。简洁往往更有效。 字体资源与工具 免费字体库 Google Fonts (fonts.google.com): 庞大的免费字体库，支持多种语言，可直接嵌入网页。 DaFont (www.dafont.com ): 各种风格的字体，需注意许可类型。 Font Squirrel (www.fontsquirrel.com ): 精选的高质量免费字体，并有明确的商业使用许可。 思源系列 (Noto Sans/Serif CJK): Adobe 与 Google 合作开发的免费开源字体，支持中日韩等多语言，是极佳的通用选择。 付费字体库 Adobe Fonts (fonts.adobe.com): Adobe Creative Cloud 订阅者可免费使用大量高质量字体。 MyFonts (www.myfonts.com ): 世界上最大的字体市场之一，提供海量付费字体。 Fontspring (www.fontspring.com ): 提供免许可（Royalty-Free）字体，购买后可永久用于多个项目。 字体管理工具 Adobe Fonts (集成在 CC): 方便管理和同步字体。 FontBase / NexusFont (免费): 桌面字体管理软件，可预览、激活/停用字体。 设计软件 Adobe Illustrator / Photoshop / InDesign: 专业的平面设计和排版软件，提供强大的字体控制功能。 Figma / Sketch / Adobe XD: 界面设计软件，注重协作和效率。 Canva / Phtotzpea: 在线设计工具，内置字体库和模板，适合快速制作。 编程字体 等宽字体（Monospace Fonts），顾名思义，就是每个字符（包括字母、数字、标点符号甚至空格）都占据相同水平宽度的字体。这使得它们在垂直方向上对齐非常整齐，因此在编程、数据显示、命令行界面以及模拟旧式打字机效果的场景中非常受欢迎。\n以下是一些常见的等宽字体：\n经典的通用等宽字体 Courier / Courier New: 最经典的等宽字体之一，模仿打字机效果。广泛应用于代码编辑器、终端和打印。 Lucida Console: 微软操作系统中常见的等宽字体，可读性好，用于命令提示符和一些开发工具。 Andale Mono: 由 Monotype 公司设计，早期在网页和开发环境中很流行。 DejaVu Sans Mono: 一个开源字体家族中的等宽成员，涵盖了非常多的字符，适合跨平台使用。 专为编程/代码设计的高度优化字体 这些字体通常在设计时考虑了程序员的需求，例如清晰区分相似字符（如 0 和 O，l 和 1 和 I），以及支持编程连字（ligatures）。\nConsolas: 微软为程序员设计的优秀等宽字体，在 Windows 系统和 Visual Studio 中广泛使用。清晰、现代，非常适合长时间阅读代码。 Source Code Pro: Adobe 开发的开源等宽字体，可读性极佳，有多种字重（Light, Regular, Bold 等）。 Fira Code: 由 Mozilla 开发的开源字体，以其编程连字（Programming Ligatures）而闻名。例如，-\u0026gt; 会显示成一个箭头符号，== 会显示成一个双横线，极大地提升了代码的可读性和美观性。 Hack: 一个专为源代码设计且高度优化的开源字体，注重清晰度和字形区分度。 Anonymous Pro: 另一款为代码设计的字体，其特点是清晰地显示符号和数字。 JetBrains Mono: 由 JetBrains (知名 IDE 开发商) 设计的开源等宽字体。它专门为开发者优化，同样支持编程连字，并对字符高度和间距进行了调整，以减少眼部疲劳。 IBM Plex Mono: IBM 的开源字体家族中的等宽成员，设计现代，清晰且美观。 Cascadia Code: 微软为 Windows Terminal 和 Visual Studio Code 开发的等宽字体，也支持编程连字。 针对中文/CJK（中日韩）支持的等宽字体 对于需要显示中文或混合显示中英文的场景，等宽字体选择会少一些，因为汉字通常不符合等宽原则（笔画多的字会比笔画少的字宽）。但有些字体会在设计时，让半角字符等宽，同时对全角字符做特别处理，或者直接提供等宽的西文和等宽的 CJK 字符组合。\nNoto Sans Mono CJK / 思源等宽 (Source Han Mono / Noto Sans Mono): Adobe 和 Google 合作开发的思源字体家族中的等宽变体。它提供了中日韩（CJK）字符支持，并确保西文字符是等宽的。这是目前最好的免费 CJK 等宽字体之一。 更纱黑体 / 等距更纱黑体 (Sarasa Gothic / Sarasa Term J / Sarasa Mono T CJK): 一个非常受欢迎的开源字体项目，整合了其他优秀字体（如 Iosevka 和 Source Han Sans），并进行了优化，提供了多种等宽变体，包括针对终端和编程优化的版本。它对中日韩字符和西文字符的对齐处理非常出色。 其他值得一提的等宽字体 Menlo: Apple 操作系统（macOS）中常用的等宽字体，是 Monaco 的继任者。 Roboto Mono: Google Roboto 字体家族的等宽版本，现代且清晰。 Ubuntu Mono: Ubuntu 操作系统默认字体家族的等宽版本。 如何选择和使用等宽字体： 目的优先： 如果是编程，选择那些为代码优化的字体（如 Fira Code, JetBrains Mono, Consolas, Source Code Pro），它们有更好的字符区分和连字支持。 可读性： 确保你选择的字体在你的屏幕上和特定字号下仍然清晰易读。 个人喜好： 字体选择有很强的个人偏好，多尝试几种，找到最适合你眼睛和工作流的字体。 版权和许可： 大多数编程等宽字体都是开源免费的，但使用前仍请注意其许可协议。 在你的代码编辑器或终端设置中，通常都可以方便地切换和预览这些等宽字体。\n","date":"2025-06-24T23:33:49+08:00","permalink":"/p/250624233349/","title":"字体指南"},{"content":"Windows开发的新终端 terminial每次打开后显示的位置都会变化，有时候会超出屏幕，导致关闭按钮无法点击，需要拖动到屏幕中间才可以关闭\n解决办法：\n打开 terminial，找到设置快捷键：ctrl+,后，点击左下角的打开JSON文件，添加一行\n1 \u0026#34;centerOnLaunch\u0026#34;: true, 效果就会居中显示。\n也可以设置 \u0026quot;launchMode\u0026quot;: \u0026quot;maximized\u0026quot; 和 \u0026quot;initialPosition\u0026quot;: \u0026quot;0,0\u0026quot;\n参考资料：\nhttps://devblogs.microsoft.com/commandline/windows-terminal-preview-1910-release/#new-launch-settings https://dev59.com/3FMH5IYBdhLWcg3wtRnA ","date":"2025-06-22T12:12:00+08:00","permalink":"/p/250622121200/","title":"Windows新终端WindowsTerminal设置每次打开默认位置"},{"content":"简介 鉴于 alist 事件，有网友自愿组织了一个团队，暂且称为社区，他们 fork 了一份版本，已经正式发布，版本号是 4.0.0\n本文重新讲解安装\n源码：https://github.com/OpenListTeam/OpenList\n官网：https://oplist.org/zh/\n迁移 如果之前安装过 openlist，将 data 文件夹复制，重新启动即可\n安装 一键安装 1 curl -fsSL https://res.oplist.org/script/v4.sh \u0026gt; install-openlist-v4.sh \u0026amp;\u0026amp; sudo bash install-openlist-v4.sh Docker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 services: alist: image: openlistteam/openlist:latest container_name: openlist networks: - openlist_network volumes: - \u0026#39;./openlist_data:/opt/openlist/data\u0026#39; - \u0026#39;/root:/root\u0026#39; ports: - \u0026#39;5245:5244\u0026#39; environment: - PUID=0 - PGID=0 - UMASK=022 restart: unless-stopped deploy: resources: limits: cpus: \u0026#39;0.85\u0026#39; # 限制 CPU 最大 85% networks: openlist_network: external: true 1 2 docker network create openlist_network docker compose up Windows 下载地址：https://github.com/OpenListTeam/OpenList/releases/tag/v4.0.0\n直接下载：\nwindows amd64 v4.0.0 下载的文件解压到一个目录，最好先手动创建一个文件夹，比如\n1 D:\\download_tool\\openlist\\openlist.exe 启动服务，在地址栏输入 cmd 快速进入当前目录，输入\n1 openlist.exe server 就会在当前目录下生成 data 文件夹。包含了程序的数据。\n打开浏览器：localhost:5244 即可访问，终端出现了随机密码，但是默认密码太麻烦了，建议直接重置密码。\n回到 openlist 所在目录，看到 第一次运行的时候生成的 data 文件夹，这个是存放数据的文件夹。\n生成（重置）密码：回到 openlist.exe所在目录，重新打开一个 cmd 窗口\n1 2 3 4 5 # 指定密码 openlist.exe admin set 你的密码 --data .\\data # 随机生成密码 openlist.exe admin random --data .\\data --data 表示指定数据目录。不指定可能会报错 如果出现了如下报错，表示修改密码没有生效，报错如下：\n1 ERRO[2023-11-29 17:42:49] [del_user_cache_online] error: that\u0026#39;s not even a token 回到浏览器：输入：localhost:5244 即可使用 openlist 了。\n现在我们使用的是默认端口，由于我的电脑上 小白羊盘 内置了 openlist 占用了 5244 端口，所以在运行 openlist 的时候可以把 端口修改，进入 data，可以看到有个 config.json的文件，里面就包含了端口的信息。\n文件所在的路径：D:\\download_tool\\openlist\\data\\config.json 打开 config.json，修改以下的值 修改 \u0026ldquo;http_port\u0026rdquo;: 5244, 为 \u0026ldquo;http_port\u0026rdquo;: 5245, 重新启动服务，指定数据所在的目录\n1 openlist.exe server --data=.\\data 现在打开浏览器：输入 localhost:5245 即可打开 openlist\n系统服务 Windows 还有一个问题，启动成功了，但是每次需要手动运行有点麻烦，最好的办法就是创建系统服务，让它开机自启。借助 NSSM 创建系统服务。\n下载 nssm： 点击下载\n将 nssm 解压之后，将所在的路径（比如 D:\\tool\\nssm\\win64）添加到系统环境变量，确保可随处执行 nssm。\n创建 openlist 自启动 服务，使用管理员运行 cmd：\n1 nssm install openlist \u0026#34;D:\\download_tool\\openlist\\openlist.exe\u0026#34; \u0026#34;server\u0026#34; \u0026#34;--data\u0026#34; \u0026#34;D:\\download_tool\\openlist\\data\u0026#34; 停止之前运行中的 openlist，使用 系统服务运行。\n启动服务\n1 nssm start openlist 停止服务\n1 nssm stop openlist 重启服务\n1 nssm restart openlist 移除服务（先要停止）\n1 nssm remove openlist 附录 关于 帮助命令\nopenlist\n1 2 3 openlist -h openlist admin -h nssm\n1 nssm -h ","date":"2025-06-21T21:45:34+08:00","permalink":"/p/250621214534/","title":"openlist，alist的fork版，安装，配置，迁移"},{"content":"次元 API 官网：https://t.alcy.cc/\n有很多的图片 API\n二次元自适应 https://t.alcy.cc/ycy\nAI 画图 https://t.alcy.cc/ai\n","date":"2025-06-21T09:54:48+08:00","permalink":"/p/250621095448/","title":"随机图片API"},{"content":"简介 官网：https://zh-hans.react.dev/learn\n快速上手 ","date":"2025-06-21T09:01:17+08:00","permalink":"/p/250621090117/","title":"react指南"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 * { margin: 0; padding: 0; box-sizing: border-box; /* 确保元素的宽度包含 padding 和 border */ } ul, ol { list-style: none; } a { color: inherit; text-decoration: none; } input, button, textarea, select { font-family: inherit; font-size: inherit; border: none; background: none; outline: none; } button { cursor: pointer; } img { vertical-align: middle; /* 或 top/bottom */ display: block; /* 可选，避免行内元素的间隙 */ } table { border-collapse: collapse; border-spacing: 0; } h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: normal; } body { font-family: \u0026#39;Arial\u0026#39;, sans-serif; line-height: 1.5; } ","date":"2025-06-21T08:45:01+08:00","permalink":"/p/250621084501/","title":"css一般要做的“清除工作”"},{"content":"Windows powershell 运行脚本出现了：\n1 2 3 4 5 6 7 pnpm : 无法加载文件 D:\\develop\\nodejs\\pnpm.ps1，因为在此系统上禁止运行脚本。有关详细信息，请参阅 https:/go.microsoft.com/fwl ink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + pnpm run dev + ~~~~ + CategoryInfo : SecurityError: (:) []，PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess 这个错误信息 无法加载文件 D:\\develop\\nodejs\\pnpm.ps1，因为在此系统上禁止运行脚本。 表明你的 PowerShell 执行策略阻止了 pnpm 脚本的运行。这是 Windows 系统为了安全而设置的默认策略。\n要解决这个问题，你需要修改 PowerShell 的执行策略。推荐的策略是 RemoteSigned，它允许你本地创建的脚本运行，但会要求从网上下载的脚本必须经过数字签名。\n解决方案步骤：\n以管理员身份打开 PowerShell。\n在 Windows 搜索栏中输入 \u0026ldquo;PowerShell\u0026rdquo;。 在搜索结果中找到 \u0026ldquo;Windows PowerShell\u0026rdquo;，然后右键点击它，选择 \u0026ldquo;以管理员身份运行\u0026rdquo;。 检查当前的执行策略（可选但推荐）：\n在 PowerShell 窗口中输入以下命令并按 Enter： 1 Get-ExecutionPolicy 这会显示当前的执行策略，很可能是 Restricted（受限）或 AllSigned。\n设置新的执行策略：\n在 PowerShell 窗口中输入以下命令并按 Enter： 1 Set-ExecutionPolicy RemoteSigned 系统会提示你确认更改。输入 Y (表示 Yes) 并按 Enter。\n验证策略是否已更改（可选但推荐）：\n再次输入 Get-ExecutionPolicy 并按 Enter。 确认显示的是 RemoteSigned。 关闭管理员 PowerShell 窗口。\n回到你的开发终端（Git Bash、CMD、VS Code Terminal 等），重新运行你的 pnpm 命令：\n1 pnpm run dev 现在，pnpm 应该能够正常运行了。\n解释和注意事项：\nRemoteSigned 策略： 这是一个比较平衡的策略。它允许你在本地编写或通过安装器（如 Node.js 或 pnpm）生成的脚本运行，同时仍然对从互联网下载的脚本保持一定的安全性（要求签名）。 其他策略： Restricted (默认)：不允许任何脚本运行。 Unrestricted：允许所有脚本运行，但会警告从互联网下载的脚本。安全性最低。 AllSigned：只允许由受信任的发布者签名的脚本运行。 安全性考虑： 更改执行策略会降低系统的安全性，但对于开发者来说，为了运行开发工具，这是必要的。RemoteSigned 是一个常用且相对安全的折衷方案。 如果只想针对当前用户生效： 你也可以使用 -Scope CurrentUser 参数，这样只会影响当前登录的用户，而不是整个系统： 1 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 但通常情况下，为了方便，开发者会选择影响全局。\n","date":"2025-06-20T17:42:20+08:00","permalink":"/p/250620174220/","title":"Windows被禁止运行脚本"},{"content":"PTFans https://ptfans.cc\n2025-06-20 发现，注册时发现没有限制，可以尝试\n","date":"2025-06-20T15:14:16+08:00","permalink":"/p/250620151416/","title":"PT站点收集"},{"content":"关于对 2020 年诺贝尔物理学奖的一些思考 **时间：**2020 年 10 月 9 日，星期日\n**原由：**今天刷短视频刷到了量子物理学，想起最近的物理学奖和前几天老师发了个朋友圈说诺奖日，大多数博主都在讲量子纠缠的问题，还调侃爱因斯坦是真的错了。针对量子纠缠内容和人们的一些评论，我的一些思考想法。\n==诺贝尔物理学奖的具体情况为:==\nNobel Prize in Physics The 2022 physics laureates The Nobel Prize in Physics 2022 was awarded to Alain Aspect, John F. Clauser and Anton Zeilinger “for experiments with entangled photons, establishing the violation of Bell inequalities and pioneering quantum information science”.\nTheir results have cleared the way for new technology based upon quantum information.\nNobel Prize in Physics The 2022 physics laureates The Nobel Prize in Physics 2022 was awarded to Alain Aspect, John F. Clauser and Anton Zeilinger “for experiments with entangled photons, establishing the violation of Bell inequalities and pioneering quantum information science”.\nTheir results have cleared the way for new technology based upon quantum information.\n以下为机器翻译：\n2022 年诺贝尔物理学奖 纠缠如何成为一种强大的工具 通过开创性的实验，阿兰·韦西、约翰·克劳塞和安东·蔡林格已经证明了研究和控制处于纠缠状态的粒子的潜力。纠缠对中的一个粒子发生的情况决定了另一个粒子的发生，即使它们之间的距离真的太远而无法相互影响。获奖者对实验工具的开发为量子技术的新时代奠定了基础。\n诺贝尔物理学奖 2022 年物理学奖得主 2022 年诺贝尔物理学奖授予阿兰·韦西，约翰·克劳塞和安东·蔡林格“对纠缠光子的实验，确定了对贝尔不等式的违反和量子信息科学的开创”。\n他们的研究结果为基于量子信息的新技术扫清了道路。\n以上来自诺贝尔奖官网：NobelPrize.org\n==总结就是：Alain Aspect, John F. Clauser and Anton Zeilinger 等三人对量子纠缠的实验，验证了量子不遵循贝尔不等式，和开创了量子信息科学的开创==\n接着，我去查询了什么是贝尔不等式，以下为维基百科对贝尔不等式的解释：（已机翻）\n在理论物理学里，贝尔定理（Bell\u0026rsquo;s theorem）表明：\n​ 任何关于定域隐变数的物理理论无法克隆量子力学的每一个预测。\n贝尔定理是一种不可行定理，又知名为贝尔不等式。这定理在物理学和科学哲学里异常重要，因为这定理意味着量子物理必需违背定域性原理或反事实确定性[1] [2]。发表于1964年，贝尔定理是因北爱尔兰物理学家约翰·贝尔而命名。\n贝尔定理的实验验证所得到的结果，符合量子力学理论的预测，并且显示某些量子效应似乎能够以超光速行进。由于这验证结果，所有归类为隐变数理论、经得起考验的量子理论都只能限制为非定域种类。2015 年，台夫特理工大学的罗纳德·汉森等人在《自然》的封面文章表示，成功关闭所有漏洞，目前量子理论比定域性隐变量理论更准确地描述量子纠缠现象。[3]\n","date":"2025-06-19T07:50:11+08:00","permalink":"/p/250619075011/","title":"关于2022年诺贝尔物理学奖的一些思考"},{"content":"反代文件 一些可用于 Cloudflare Workers 文件反代 的大文件 URL：\n文件反代不知道在哪里找大文件的话，可以去看看各 IDC 的官方测速文件（可以谷歌搜索 VPS looking glass 或 testfile MB 就能找到很多，建议优先选择美西），建议选择 512MB 以下且 支持 CDN 缓存的文件后缀，我举几个例子：\n这几个小于 512 MB，且都是会被 CDN 缓存的 .zip 文件后缀（常见的 文档、图片、音视频、压缩包、安装包、静态文件 后缀）\nhttp://ipv4.download.thinkbroadband.com/200MB.zip http://ipv4.download.thinkbroadband.com/512MB.zip https://testfileorg.netwet.net/500MB-CZIPtestfile.org.zip\n这几个 .test 的后缀是不支持缓存的，可以用但会影响下载测速准确度\nhttps://cachefly.cachefly.net/200mb.test https://lg-seattle.cloudzy.com/500MB.test https://lg-miami.cloudzy.com/500MB.test https://lg-chicago.cloudzy.com/500MB.test https://lg.my.controlvm.com/500MB.test http://23.145.48.48/500MB.test http://speedtest-sfo3.digitalocean.com/1gb.test\n优选 IP 列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 104.20.21.32 4 4 0.00 118.27 32.49 172.64.229.132 4 4 0.00 102.88 37.27 172.67.71.21 4 4 0.00 115.42 36.81 162.159.58.123 4 4 0.00 100.19 37.68 162.159.58.189 4 4 0.00 103.41 33.19 162.159.152.197 4 4 0.00 113.38 44.27 104.26.5.106 4 4 0.00 115.49 34.26 172.64.229.88 4 4 0.00 110.31 53.96 104.20.27.205 4 4 0.00 112.75 45.50 104.20.25.132 4 4 0.00 114.13 43.42 162.159.58.84 4 4 0.00 107.64 36.43 104.20.17.194 4 4 0.00 111.61 33.24 104.20.18.123 4 4 0.00 114.59 31.13 172.64.229.120 4 4 0.00 109.31 54.68 104.20.29.167 4 4 0.00 113.94 35.42 162.159.140.247 4 4 0.00 115.92 32.57 162.159.142.110 4 4 0.00 116.19 30.76 172.67.72.179 4 4 0.00 108.99 49.64 162.159.135.228 4 4 0.00 108.17 49.46 172.67.64.177 4 4 0.00 113.40 48.04 104.26.1.79 4 4 0.00 112.62 46.04 172.64.229.140 4 4 0.00 107.45 47.91 162.159.58.239 4 4 0.00 102.40 46.28 104.20.22.189 4 4 0.00 111.96 44.81 162.159.134.176 4 4 0.00 112.58 38.82 104.26.3.220 4 4 0.00 112.55 34.85 172.67.74.246 4 4 0.00 113.06 30.42 172.67.74.246 4 4 0.00 113.06 30.42 104.26.10.12 4 4 0.00 117.55 33.44 104.20.17.204 4 4 0.00 116.95 32.24 162.159.58.53 4 4 0.00 108.52 54.33 104.20.25.200 4 4 0.00 114.09 47.10 162.159.58.231 4 4 0.00 111.26 45.52 104.20.30.239 4 4 0.00 104.71 30.78 162.159.58.155 4 4 0.00 111.57 48.28 162.159.58.46 4 4 0.00 110.16 42.91 ","date":"2025-06-19T07:46:11+08:00","permalink":"/p/250619074611/","title":"edgetunnel，利用Cloudflare边缘服务搭建的代理项目"},{"content":"简介 WebDAV 的核心是 HTTP 协议的扩展，可以把 WebDAV 想象成一个“架设在互联网上的网络 U 盘”。它是一种技术标准，允许你像操作本地电脑里的文件一样，通过网络来管理（查看、上传、下载、修改、删除）远程服务器上的文件和文件夹。\nWindows 连接 WebDAV 有几种方法：\n文件资源管理器 cmd的 net use powershell的 Invoke-WebRequest 文件资源管理 cmd的 net use 前提条件：\nWebDAV 服务器已配置且可访问。（例如 Windows Server IIS WebDAV、Nextcloud、Seafile、群晖等） 网络连接正常。 已启用 WebClient 服务（Windows WebDAV 客户端）： 按 Win + R，输入 services.msc； 找到 WebClient 服务，确保其为运行状态，并设置为“自动”启动。 语法：\n1 net use [驱动器盘符]: \u0026#34;\\\\服务器地址@需求认证的端口\\路径\u0026#34; /user:用户名 密码 /persistent:yes 示例：\n1 net use Z: \u0026#34;\\\\webdav.example.com@80\\webdav\u0026#34; /user:myusername mypassword /persistent:yes powershell的 Invoke-WebRequest 待续\u0026hellip;\n","date":"2025-06-13T08:27:20+08:00","permalink":"/p/250613082720/","title":"Windows连接WebDAV服务"},{"content":" win+s 搜索，找到防火墙和网络保护 点击允许应用通过防火墙 点击 更改设置 最下面找到 允许其他应用 浏览路径，设置需要开启的应用 添加，确定 ","date":"2025-06-12T12:44:24+08:00","permalink":"/p/250612124424/","title":"Windows开启防火墙"},{"content":"简介 VirtualBox 是一款通用的全虚拟化软件，适用于 x86_64 硬件 (另有 7.1 版本适用于 macOS/Arm), 针对笔记本电脑、台式机、服务器和嵌入式使用。\n官网：https://www.virtualbox.org/\n安装 下载地址：https://www.virtualbox.org/wiki/Downloads\nWindows 下载：\nVirtualBox 7.1.10：点击下载 安装过程直接下一步就行，不建议更改安装位置（会使安装使用变得很繁琐）\nLinux 详细查看：https://www.virtualbox.org/wiki/Linux_Downloads\nMacos 下载：\nVirtualBox 7.1.10：点击下载 网络管理 这部分介绍 virtualbox 网络配置\n进入主页面，找到工具，点击右侧的设置，选中 网络，就可以看到网络的配置情况\n可以新建、删除，支持的网络类型有：\n仅主机（Host Only）网络：用于和主机宿主机通信，默认 IP 地址是192.168.56.1/24 Nat 网络：用于虚拟机内网连接互联网，默认为空，新建一个后默认 IP 地址是10.0.2.0/24 云网络： 点击对应的网络可以配置属性，包括不限于网卡、DHCP 服务器\n","date":"2025-06-12T09:55:27+08:00","permalink":"/p/250612095527/","title":"Virtualbox，一款通用的全虚拟化软件"},{"content":"来源：https://linux.do/t/topic/694120\nwindows 1 irm ckey.run|iex linux 1 wget --no-check-certificate ckey.run -O ckey.run \u0026amp;\u0026amp; bash ckey.run Mac 1 curl -L -o ckey.run ckey.run \u0026amp;\u0026amp; bash ckey.run ","date":"2025-06-10T11:39:07+08:00","permalink":"/p/250610113907/","title":"一键激活JetBrains全家桶"},{"content":" 名字 支持的平台 评分（10） 评价 地址 语言 备注 qimgv Windows 7 无法在软件内预览下一张图片，只能切换后查看 GitHub c++ 距 2025-06-09 发布版截止到 2021-11-30 qView Linux,\nmacOS,\nWindows 8 极简图片查看，无法在软件内预览下一张图片，只能切换后查看 GitHub c++ 距 2025-06-09 发布版截止到 2023-8-16 ImageGlass Windows 8.5 软件内可预览下一张图片，速度稍慢 GitHub c# 距 2025-06-09 发布版截止到 2025-5-19 参考了：\nhttps://zhuanlan.zhihu.com/p/30941577162\n","date":"2025-06-09T08:30:02+08:00","permalink":"/p/250609083002/","title":"图片查看，预览软件"},{"content":"在 Windows 中，可以通过以下步骤来关闭文件管理器默认使用缩略图查看文件，以减少在访问大量文件时的延迟。这对于使用 rclone 挂载的文件尤其重要，因为处理缩略图会增加加载时间。\n关闭缩略图的步骤： 打开文件资源管理器：\n可以通过点击任务栏的文件夹图标，或使用快捷键 Win + E 打开文件资源管理器。 访问“选项”：\n在文件管理器中，点击上方的“查看”选项卡。 然后在右侧找到“选项”或“更改文件夹和搜索选项”。 选择“查看”选项卡：\n在弹出的窗口中，选择“查看”选项卡。 更改文件夹选项：\n在“高级设置”部分，找到“始终显示图标，从不显示缩略图”这一选项。 选中“始终显示图标，从不显示缩略图”。 应用更改：\n点击“应用”按钮，然后点击“确定”以保存更改。 ","date":"2025-06-05T10:13:06+08:00","permalink":"/p/250605101306/","title":"关闭Windows文件管理器默认总是使用缩略图打开"},{"content":"电视剧 梦魇绝镇 大地永存 电影 ","date":"2025-06-04T16:47:33+08:00","permalink":"/p/250604164733/","title":"影视：电影，电视剧观看记录"},{"content":"简介 Navidrome 是一个开源的、自托管的音乐服务器和流媒体应用程序。 简单来说，你可以把它想象成你自己的私人 Spotify 或 Apple Music。\n官网：https://www.navidrome.org/\n文档：https://www.navidrome.org/docs/\n主要特点： 自托管： 你需要自己安装和运行 Navidrome 服务器，这意味着你完全控制你的音乐数据。 支持多种音频格式： 兼容 MP3, FLAC, AAC, ALAC, OPUS, DSD 等多种格式。 支持多种客户端： 可以通过网页浏览器、移动应用程序（如 Substreamer, Ultrasonic, Play:Sub）或其他 Subsonic 兼容客户端访问你的音乐库。 元数据管理： 支持读取和管理音乐文件的元数据（如专辑、艺术家、标题等）。 扫描和索引： 自动扫描你的音乐文件夹并将音乐添加到你的库中。 播放列表支持： 可以创建和管理播放列表。 用户管理： 支持创建多个用户，并为每个用户设置不同的权限。 简单易用： 界面简洁直观，易于上手。 开源免费： 完全免费使用，并且可以自由地修改和分发。 部署 Docker docker-compose\n1 2 mkdir -p /opt/service/navidrome cd /opt/service/navidrome 1 vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 services: navidrome: image: deluan/navidrome:latest container_name: navidrome # user: 1000:1000 # should be owner of volumes ports: - \u0026#34;4533:4533\u0026#34; restart: unless-stopped environment: # 如果为空，需要使用 {} # Optional: put your config options customization here. Examples: # ND_LOGLEVEL: debug DefaultLanguage: zh-Hans volumes: - \u0026#34;./navidrome_data:/data\u0026#34; - \u0026#34;/mnt/music:/music:ro\u0026#34; 1 docker compose up ","date":"2025-06-02T19:17:01+08:00","permalink":"/p/250602191701/","title":"Navidrome，自建音乐流媒体服务"},{"content":" YOUR_ADDRESS：自定义域名 YOUR_TOKEN：alist 的令牌 YOUR_WORKER_ADDRESS：worker 所在的网址 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 // src/const.ts var ADDRESS = \u0026#34;YOUR_ADDRESS\u0026#34;; var TOKEN = \u0026#34;YOUR_TOKEN\u0026#34;; var WORKER_ADDRESS = \u0026#34;YOUR_WORKER_ADDRESS\u0026#34;; // src/verify.ts var verify = async (data, _sign) =\u0026gt; { const signSlice = _sign.split(\u0026#34;:\u0026#34;); if (!signSlice[signSlice.length - 1]) { return \u0026#34;expire missing\u0026#34;; } const expire = parseInt(signSlice[signSlice.length - 1]); if (isNaN(expire)) { return \u0026#34;expire invalid\u0026#34;; } if (expire \u0026lt; Date.now() / 1e3 \u0026amp;\u0026amp; expire \u0026gt; 0) { return \u0026#34;expire expired\u0026#34;; } const right = await hmacSha256Sign(data, expire); if (_sign !== right) { return \u0026#34;sign mismatch\u0026#34;; } return \u0026#34;\u0026#34;; }; var hmacSha256Sign = async (data, expire) =\u0026gt; { const key = await crypto.subtle.importKey( \u0026#34;raw\u0026#34;, new TextEncoder().encode(TOKEN), { name: \u0026#34;HMAC\u0026#34;, hash: \u0026#34;SHA-256\u0026#34; }, false, [\u0026#34;sign\u0026#34;, \u0026#34;verify\u0026#34;] ); const buf = await crypto.subtle.sign( { name: \u0026#34;HMAC\u0026#34;, hash: \u0026#34;SHA-256\u0026#34; }, key, new TextEncoder().encode(`${data}:${expire}`) ); return btoa(String.fromCharCode(...new Uint8Array(buf))).replace(/\\+/g, \u0026#34;-\u0026#34;).replace(/\\//g, \u0026#34;_\u0026#34;) + \u0026#34;:\u0026#34; + expire; }; // src/handleDownload.ts async function handleDownload(request) { const origin = request.headers.get(\u0026#34;origin\u0026#34;) ?? \u0026#34;*\u0026#34;; const url = new URL(request.url); const path = decodeURIComponent(url.pathname); const sign = url.searchParams.get(\u0026#34;sign\u0026#34;) ?? \u0026#34;\u0026#34;; const verifyResult = await verify(path, sign); if (verifyResult !== \u0026#34;\u0026#34;) { const resp2 = new Response( JSON.stringify({ code: 401, message: verifyResult }), { headers: { \u0026#34;content-type\u0026#34;: \u0026#34;application/json;charset=UTF-8\u0026#34; } } ); resp2.headers.set(\u0026#34;Access-Control-Allow-Origin\u0026#34;, origin); return resp2; } let resp = await fetch(`${ADDRESS}/api/fs/link`, { method: \u0026#34;POST\u0026#34;, headers: { \u0026#34;content-type\u0026#34;: \u0026#34;application/json;charset=UTF-8\u0026#34;, Authorization: TOKEN }, body: JSON.stringify({ path }) }); let res = await resp.json(); if (res.code !== 200) { return new Response(JSON.stringify(res)); } request = new Request(res.data.url, request); if (res.data.header) { for (const k in res.data.header) { for (const v of res.data.header[k]) { request.headers.set(k, v); } } } let response = await fetch(request); while (response.status \u0026gt;= 300 \u0026amp;\u0026amp; response.status \u0026lt; 400) { const location = response.headers.get(\u0026#34;Location\u0026#34;); if (location) { if (location.startsWith(`${WORKER_ADDRESS}/`)) { request = new Request(location, request); return await handleRequest(request); } else { request = new Request(location, request); response = await fetch(request); } } else { break; } } response = new Response(response.body, response); response.headers.delete(\u0026#34;set-cookie\u0026#34;); response.headers.set(\u0026#34;Access-Control-Allow-Origin\u0026#34;, origin); response.headers.append(\u0026#34;Vary\u0026#34;, \u0026#34;Origin\u0026#34;); return response; } // src/handleOptions.ts function handleOptions(request) { const corsHeaders = { \u0026#34;Access-Control-Allow-Origin\u0026#34;: \u0026#34;*\u0026#34;, \u0026#34;Access-Control-Allow-Methods\u0026#34;: \u0026#34;GET,HEAD,POST,OPTIONS\u0026#34;, \u0026#34;Access-Control-Max-Age\u0026#34;: \u0026#34;86400\u0026#34; }; let headers = request.headers; if (headers.get(\u0026#34;Origin\u0026#34;) !== null \u0026amp;\u0026amp; headers.get(\u0026#34;Access-Control-Request-Method\u0026#34;) !== null) { let respHeaders = { ...corsHeaders, \u0026#34;Access-Control-Allow-Headers\u0026#34;: request.headers.get(\u0026#34;Access-Control-Request-Headers\u0026#34;) || \u0026#34;\u0026#34; }; return new Response(null, { headers: respHeaders }); } else { return new Response(null, { headers: { Allow: \u0026#34;GET, HEAD, POST, OPTIONS\u0026#34; } }); } } // src/handleRequest.ts async function handleRequest(request) { if (request.method === \u0026#34;OPTIONS\u0026#34;) { return handleOptions(request); } return await handleDownload(request); } // src/index.ts var src_default = { async fetch(request, env, ctx) { return await handleRequest(request); } }; export { src_default as default }; //# sourceMappingURL=index.js.map ","date":"2025-05-31T18:59:15+08:00","permalink":"/p/250531185915/","title":"alist-proxy，alist的代理下载，支持Cloudflare部署"},{"content":"简介 一个快速、简单、免费的 Bittorrent 客户端\n官网：https://transmissionbt.com/\n安装 包管理器 1 sudo apt install transmission-daemon Docker docker compose\ngists/transmission:latest 镜像，支持多种镜像\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 services: transmission: container_name: transmission image: gists/transmission:latest ports: - \u0026#34;9091:9091\u0026#34; - \u0026#34;51413:51413\u0026#34; volumes: - \u0026#34;./transmission_data:/data\u0026#34; - \u0026#34;/mnt/p1/film:/root/film\u0026#34; - \u0026#34;/mnt/p1/porn:/root/porn\u0026#34; - \u0026#34;/mnt/p1/bt_downloads:/root/bt_downloads\u0026#34; environment: - USERNAME=username - PASSWORD=password restart: unless-stopped logging: driver: json-file options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; 配置 修改配置需要停用 transmission-daemon 服务，否则所做的一切配置都不会保存\n1 sudo systemctl stop transmission-daemon.service 1 sudo vim /etc/transmission-daemon/settings.json 一般需要修改：\n默认下载路径 找到下面这一项，后面的路径是默认下载的路径，你可以改成你想要的路径\n1 \u0026#34;download-dir\u0026#34;: \u0026#34;/home/share/downloads\u0026#34; 设置好后，不要忘记执行一下赋权命令，使下载目录可以读写，以免发生不必要的错误：\n1 2 sudo mkdir -p /mnt/p1/bt_downloads sudo chmod -R 777 /mnt/p1/bt_downloads 配置 WebUI\n按照下面的进行设置即可\n1 2 3 4 5 \u0026#34;rpc-authentication-required\u0026#34;: true \u0026#34;rpc-enabled\u0026#34;: true \u0026#34;rpc-password: \u0026#34;这里改成你自己的密码\u0026#34; \u0026#34;rpc-username\u0026#34;:\u0026#34;改成你自己的用户名\u0026#34; \u0026#34;rpc-whitelist-enabled\u0026#34;: false 不启用白名单，防止登不上 完整如下，仅供参考\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 { \u0026#34;blocklist-enabled\u0026#34;: 0, \u0026#34;download-dir\u0026#34;: \u0026#34;/mnt/p1/bt_downloads\u0026#34;, \u0026#34;download-limit\u0026#34;: 100, \u0026#34;download-limit-enabled\u0026#34;: 0, \u0026#34;encryption\u0026#34;: 1, \u0026#34;max-peers-global\u0026#34;: 200, \u0026#34;peer-port\u0026#34;: 51413, \u0026#34;pex-enabled\u0026#34;: 1, \u0026#34;port-forwarding-enabled\u0026#34;: 0, \u0026#34;rpc-authentication-required\u0026#34;: true, \u0026#34;rpc-enabled\u0026#34;: true, \u0026#34;rpc-password\u0026#34;: \u0026#34;transmission\u0026#34;, \u0026#34;rpc-port\u0026#34;: 9091, \u0026#34;rpc-username\u0026#34;: \u0026#34;transmission\u0026#34;, \u0026#34;rpc-whitelist-enabled\u0026#34;: false, \u0026#34;rpc-whitelist\u0026#34;: \u0026#34;127.0.0.1\u0026#34;, \u0026#34;upload-limit\u0026#34;: 100, \u0026#34;upload-limit-enabled\u0026#34;: 0 } 配置完这些基本就足够用了，如果还想进一步了解各参数的作用，可以参考官方文档以及各参数的中英对照\n查看状态\n1 systemctl status transmission-daemon.service 启动\n1 sudo systemctl start transmission-daemon.service 开机自启动\n1 sudo systemctl enable transmission-daemon.service WebUI\nIP 加上端口号 9091，输入刚刚设置的用户名和密码进行登录\n备份恢复 找到 transmission 程序文件夹，找到 resume、torrents、blocklists 文件夹和 setting.json 文件，把它们全部保存下来，等到程序重新安装后把相关文件复制覆盖到程序安装路径，重启就可以了。下面以群晖为例，介绍一下备份还原教程。\n1、用到 winscp 软件，下载地址：https://winscp.net/eng/download.php。使用 winscp 软件登陆群晖，找到 transmission 安装目录， 2、复制下载 resume、torrents、blocklists 三个文件夹和 setting.json 文件到本地电脑上， 3、在重新安装 transmission 后，找到程序文件夹，使用 winscp 把备份的 resume、torrents、blocklists 三个文件夹和 setting.json 文件复制覆盖到程序文件夹，此时重新启动 transmission 就可以了。\n文件夹及文件解释\nresume：存储每个种子的恢复信息 torrents：存储已添加的种子文件 blocklists：存储 IP 阻止列表，用于屏蔽特定 IP 地址或范围 setting.json：transmission 的配置信息 ","date":"2025-05-31T17:16:38+08:00","permalink":"/p/250531171638/","title":"transmission，Bittorrent客户端"},{"content":"https://fiber.google.com/speedtest/\nhttps://speedtest.xfinity.com/\nhttps://fast.com/\nhttps://www.cccitu.com/ez8eu3ux4.html\nhttps://test.ustc.edu.cn/\nhttp://speedtest.im/\nhttps://www.speakeasy.net/speedtest/\n","date":"2025-05-30T15:02:27+08:00","permalink":"/p/250530150227/","title":"speedtest测速网站"},{"content":"地址：https://free.zeroai.chat/v1/chat/completions\nkey：随便填\nlimit:改成了 12/min 支持模型\n1 2 3 4 5 6 7 8 9 [ \u0026#34;dall-e-3\u0026#34;, \u0026#34;gpt-4o\u0026#34;, \u0026#34;gpt-4o-2024-08-06\u0026#34; \u0026#34;gpt-4o-mini\u0026#34;, \u0026#34;llama-3.1-405b-instruct\u0026#34;, \u0026#34;llama-3.1-70b-instruct\u0026#34;, \u0026#34;llama-3.1-8b-instruct\u0026#34; ] ","date":"2025-05-28T20:52:42+08:00","permalink":"/p/250528205242/","title":"免费大模型API"},{"content":"https://ytbtu.shijuezu.com/\n","date":"2025-05-28T15:08:17+08:00","permalink":"/p/250528150817/","title":"YouTube封面图下载网站"},{"content":"简介 微软 Microsoft 的 URL 设计的非常混乱，一场登录或者一次设置都会在不同的 URL 之间跳转，而且各个管理面板排版布局也不一样，一个字：乱。\n这里总结会用到的 URL\ndevelop 微软开发者管理员 说明 作用 URL 备注 微软开发者控制台 查看剩余订阅时间 https://developer.microsoft.com/en-us/microsoft-365/profile 申请开发者的邮箱登录 开发者管理中心 查看、修改用户 https://admin.microsoft.com/Adminportal/Home#/homepage 开发者管理员登录 用户多种验证管理 重置用户的 2fa https://entra.microsoft.com/#view/Microsoft_AAD_IAM/MultifactorAuthenticationConfig.ReactView 开发者管理员登录 应用注册 注册应用，实现API对接 https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps 开发者管理员登录 文件管理 说明 作用 URL 备注 Microsoft 365 Copilot 使用 Microsoft 365，可以使用 office，OneDrive 入口 https://m365.cloud.microsoft/?auth=2 开发者账户/企业账户登录 微软账户管理 说明 作用 URL 备注 Microsoft Security 增加、修改登录方式，开启 2fa https://account.live.com/proofs/Manage/additional 微软账户登录 Manage how you sign in to Microsoft 增加、修改别名 https://account.live.com/names/Manage ","date":"2025-05-25T11:40:35+08:00","permalink":"/p/250525114035/","title":"Microsoft微软URL指南"},{"content":"简介 由于 Microsoft Auth的数据丢失（不要相信同步），导致众多2fa账户丢失，其中包括Microsoft develop Admin账户（后续简称msda）\n近期\nhttps://admin.microsoft.com/adminportal/home?#/users\n","date":"2025-05-25T11:03:52+08:00","permalink":"/p/250525110352/","title":"微软开发者管理员账户2fa丢失，恢复账户办法"},{"content":"文生图 概念 通用型提示词（可与其他提示词组合）：\n风格: 写实主义 (Photorealistic) 印象派 (Impressionistic) 抽象派 (Abstract) 超现实主义 (Surreal) 卡通 (Cartoon) 动漫 (Anime) 像素艺术 (Pixel art) 油画 (Oil painting) 水彩画 (Watercolor painting) 数字绘画 (Digital painting) 蒸汽朋克 (Steampunk) 赛博朋克 (Cyberpunk) 奇幻 (Fantasy) 哥特 (Gothic) 光线: 金色光芒 (Golden hour) 背光 (Backlighting) 柔和光线 (Soft lighting) 强烈光线 (Dramatic lighting) 环境光 (Ambient lighting) 体积光 (Volumetric lighting) 视角: 鸟瞰图 (Bird\u0026rsquo;s-eye view) 仰视 (Low angle) 俯视 (High angle) 特写 (Close-up) 全景 (Panoramic view) 情绪: 平静 (Calm) 悲伤 (Sad) 快乐 (Happy) 愤怒 (Angry) 神秘 (Mysterious) 浪漫 (Romantic) 具体场景/主题提示词：\n自然景观: “日落时分，被雪覆盖的山脉，紫色的天空，反射在湖面上，写实主义风格” (Snow-covered mountains at sunset, purple sky, reflected in a lake, photorealistic style) “热带雨林，茂密的植被，瀑布，阳光穿过树叶，印象派风格” (Tropical rainforest, lush vegetation, waterfall, sunlight filtering through the leaves, impressionistic style) “夜晚的星空，银河，流星，山脉轮廓，数字绘画，梦幻般的光芒” (Night sky, milky way, shooting stars, mountain silhouettes, digital painting, dreamy glow) \u0026ldquo;沙漠中的绿洲，棕榈树，清澈的水，阳光明媚，绿洲中有一座古老的石头建筑，真实风格\u0026rdquo; (Oasis in the desert, palm trees, clear water, sunny, with an ancient stone structure in the oasis, realistic style) 人物/肖像: “一位年轻女性，蓝色眼睛，长长的黑发，穿着未来主义服装，赛博朋克风格” (A young woman, blue eyes, long black hair, wearing futuristic clothing, cyberpunk style) “一个老水手，满脸皱纹，叼着烟斗，背景是暴风雨的大海，油画风格” (An old sailor, wrinkled face, smoking a pipe, with a stormy sea in the background, oil painting style) “一位穿着华丽礼服的公主，站在城堡阳台上，背景是烟花，奇幻风格” (A princess in a gorgeous dress, standing on a castle balcony, with fireworks in the background, fantasy style) \u0026ldquo;一个穿着宇航服的宇航员站在火星表面，背后是地球升起，未来风格\u0026rdquo; (An astronaut in a spacesuit standing on the surface of Mars, with Earth rising in the background, futuristic style) 动物: “一只巨大的龙，盘踞在城堡之上，喷着火焰，哥特风格” (A giant dragon, perched on a castle, breathing fire, gothic style) “一群狼在月光下嚎叫，雪地，冷色调，写实主义风格” (A pack of wolves howling in the moonlight, snowy landscape, cold colors, photorealistic style) “一只五彩缤纷的鹦鹉，栖息在热带花朵上，鲜艳的颜色，卡通风格” (A colorful parrot, perched on tropical flowers, vibrant colors, cartoon style) \u0026ldquo;一只猫头鹰在夜间飞翔，月光照亮它的羽毛，背景是古老的森林，神秘和黑暗\u0026rdquo; (An owl flying at night, moonlight illuminating its feathers, with an ancient forest in the background, mysterious and dark) 建筑/城市: “一座漂浮在云端的城市，未来主义建筑，飞艇，科幻风格” (A city floating in the clouds, futuristic architecture, airships, sci-fi style) “一个充满霓虹灯的夜间城市街道，雨水，赛博朋克风格” (A nighttime city street full of neon lights, rain, cyberpunk style) “一座古老的城堡，被森林环绕，雾气弥漫，浪漫主义风格” (An ancient castle, surrounded by forest, misty atmosphere, romantic style) 抽象艺术: “蓝色和金色的漩涡，动态流动，抽象派” (Swirls of blue and gold, dynamic flow, abstract style) “几何形状的组合，鲜艳的颜色，现代艺术” (A combination of geometric shapes, bright colors, modern art) \u0026ldquo;多种颜色混合在一起，形成抽象的星云，充满活力和创意\u0026rdquo; (Multiple colors mixed together to form an abstract nebula, full of energy and creativity) 更具体的提示词示例：\n\u0026ldquo;A majestic griffin soaring through a stormy sky, lightning striking in the background, dramatic lighting, oil painting style, intricate details\u0026rdquo; (一只雄伟的狮鹫翱翔在暴风雨的天空中，背景中闪电，戏剧性的光线，油画风格，错综复杂的细节) \u0026ldquo;A cozy cottage nestled in a snowy forest, smoke rising from the chimney, warm light emanating from the windows, watercolor painting, whimsical style\u0026rdquo; (一个舒适的小屋坐落在白雪皑皑的森林里，烟囱里冒着烟，窗户里散发出温暖的光芒，水彩画，异想天开的风格) \u0026ldquo;A robot bartender mixing a cocktail in a futuristic bar, neon lights reflecting off chrome surfaces, cyberpunk style, highly detailed\u0026rdquo; (一个机器人酒保在未来主义酒吧里调制鸡尾酒，霓虹灯反射在镀铬表面上，赛博朋克风格，高度详细) \u0026ldquo;A surreal dreamscape featuring floating islands, giant mushrooms, and a sky filled with clocks, surrealism, vibrant colors, highly imaginative\u0026rdquo; (一个超现实的梦境，有漂浮的岛屿、巨大的蘑菇和布满钟表的天空，超现实主义，鲜艳的色彩，极富想象力) 一些可以添加的细节词语：\n精致的 (Intricate) 生动的 (Vibrant) 逼真的 (Realistic) 梦幻般的 (Dreamlike) 细腻的 (Delicate) 粗犷的 (Rough) 明亮的 (Bright) 柔和的 (Soft) 黑暗的 (Dark) 充满活力的 (Energetic) 使用提示词的技巧：\n循序渐进: 先用简单的提示词，然后逐步添加细节。 尝试不同的组合: 混合搭配不同的风格、主题和细节。 使用关键词: AI 对关键词比较敏感，确保你的提示词包含关键元素。 注意语法和拼写: 虽然 AI 可以理解一定的错误，但清晰的表达会带来更好的结果。 不断尝试和迭代: 不要害怕失败，多尝试不同的提示词，直到找到你想要的效果。 参考现有艺术作品: 你可以指定“inspired by [艺术家]”来模仿特定艺术家的风格。 使用负面提示词: 告诉 AI 你 不 想要什么，可以帮助优化图像。 例如 \u0026ldquo;ugly, distorted, blurry\u0026rdquo; 使用图片作为参考: 许多 AI 工具允许你上传图片，并根据该图片生成类似的图像。 示例：\n1. 科幻/未来 场景:\n提示词: \u0026ldquo;A bustling cyberpunk marketplace at night, overflowing with neon signs, robots selling wares, holographic advertisements, rain-slicked streets, highly detailed, cinematic lighting.\u0026rdquo; 翻译: 夜晚一个熙熙攘攘的赛博朋克市场，到处都是霓虹灯招牌，机器人售卖商品，全息广告，雨水湿润的街道，高度详细，电影级光照。 说明: 这个提示词侧重于细节丰富的场景，强调赛博朋克的视觉元素，使用“cinematic lighting”可以提升整体的视觉效果。 2. 奇幻/梦幻 场景:\n提示词: \u0026ldquo;A majestic unicorn standing in a moonlit forest clearing, surrounded by glowing flowers, fireflies dancing in the air, ethereal atmosphere, fantasy art, highly detailed, digital painting.\u0026rdquo; 翻译: 一只雄伟的独角兽站在月光照耀的森林空地上，周围环绕着发光的花朵，萤火虫在空中飞舞，空灵的氛围，奇幻艺术，高度详细，数字绘画。 说明: “ethereal atmosphere” 可以创造出一种梦幻般、超凡脱俗的氛围。 \u0026ldquo;digital painting\u0026rdquo; 能让画面更精致。 3. 肖像/人物:\n提示词: \u0026ldquo;A portrait of a wise old wizard with a long white beard, wearing a tattered robe, holding a glowing staff, intricate details, dramatic lighting, fantasy art, oil painting.\u0026rdquo; 翻译: 一位留着长长的白色胡须的睿智老巫师的肖像，穿着破旧的长袍，拿着一根发光的手杖，错综复杂的细节，戏剧性的光照，奇幻艺术，油画。 说明: “intricate details” 可以让人物的细节更加丰富，比如皱纹、服饰纹理等。“dramatic lighting” 可以增强人物的神秘感。 4. 动物/生物:\n提示词: \u0026ldquo;A photorealistic image of a bengal tiger resting in tall grass, sunlight filtering through the trees, shallow depth of field, wildlife photography, national geographic style.\u0026rdquo; 翻译: 一张孟加拉虎在茂盛的草丛中休息的逼真图像，阳光穿过树木，浅景深，野生动物摄影，国家地理风格。 说明: “shallow depth of field” 可以突出主体（老虎），虚化背景。“national geographic style” 可以让图像更具纪实性和专业性。 5. 抽象艺术:\n提示词: \u0026ldquo;Abstract painting, swirling colors of blue, purple, and gold, dynamic composition, fluid motion, cosmic energy, modern art, high resolution.\u0026rdquo; 翻译: 抽象绘画，蓝色、紫色和金色的漩涡色彩，动态构图，流动运动，宇宙能量，现代艺术，高分辨率。 说明: 强调颜色的组合和动态感，\u0026ldquo;cosmic energy\u0026rdquo; 可以赋予画面一种神秘的力量感。“high resolution”可以确保图像清晰度。 6. 建筑/场景:\n提示词: \u0026ldquo;A medieval castle perched on a rocky cliff overlooking the ocean, stormy skies, dramatic lighting, gothic architecture, oil painting, fantasy art.\u0026rdquo; 翻译: 一座中世纪城堡坐落在俯瞰大海的岩石悬崖上，暴风雨的天空，戏剧性的光照，哥特式建筑，油画，奇幻艺术。 说明: \u0026ldquo;gothic architecture\u0026rdquo; 明确了建筑风格， “stormy skies” 增加了画面的戏剧性。 7. 像素艺术:\n提示词: \u0026ldquo;A pixel art landscape of a peaceful forest, a small cabin with a chimney, a winding river, 8-bit style, bright colors, cute and charming.\u0026rdquo; 翻译: 一个宁静森林的像素艺术景观，一个小木屋带着烟囱，一条蜿蜒的河流，8 位风格，明亮的颜色，可爱迷人。 说明: \u0026ldquo;8-bit style\u0026rdquo; 是像素艺术的关键元素。 更复杂的例子（结合更多元素）:\n提示词: \u0026ldquo;A cyberpunk cityscape at night, a lone female hacker sitting at a rooftop terminal, neon lights reflecting in her glasses, holographic projections displaying code, rain pouring down, cinematic lighting, highly detailed, dystopian future.\u0026rdquo; 翻译: 夜晚一个赛博朋克城市景观，一个孤独的女黑客坐在屋顶终端，霓虹灯反射在她的眼镜里，全息投影显示代码，大雨倾盆，电影级光照，高度详细，反乌托邦未来。 说明: 这个提示词结合了场景、人物、天气和氛围，创造了一个复杂而引人入胜的画面。 使用这些示例的建议：\n复制粘贴，开始尝试: 直接复制这些提示词到你的 AI 绘画工具中，看看效果。 修改调整，个性化: 在这些示例的基础上，修改颜色、细节、风格等，创造出你独一无二的作品。 多关键词组合，更精细: 尝试添加更多描述性的关键词，例如 \u0026ldquo;hyperrealistic\u0026rdquo;，\u0026ldquo;photorealistic\u0026rdquo;，\u0026ldquo;artstation\u0026rdquo;，\u0026ldquo;trending on artstation\u0026rdquo;，让 AI 生成更符合你预期的图像。 使用负面提示词: 如果 AI 总是生成你不想要的东西，尝试使用负面提示词来排除它。例如，如果不想出现模糊的图像，可以添加 \u0026ldquo;blurry, out of focus\u0026rdquo; 到负面提示词中。 案例 1 一位中国年轻女子，黑发双马尾，脸红，害羞，脸上有白色液体。斜倚在铺着柔软灰色枕头和床单的床上，双腿大张，膝盖弯曲，姿态完全开放，充满诱惑，穿着百褶裙。她丰满自然的乳房，粉嫩的乳晕轻轻地贴着胸膛，肌肤光滑，泛着淡淡的情欲光泽。她剃光的阴部完全暴露，整齐对称的外阴唇微微分开，露出娇嫩的粉嫩内阴唇和阴蒂，隐约可见一丝湿润。一只纤细的手放松地放在阴部旁边的大腿内侧，手指轻轻张开，不再遮掩任何东西，将目光直接引向她坦露的私密之处。她用紧张的眼睛直视着观者。温暖昏暗的室内灯光从上方倾泻而下，在她乳房下方和大腿间投下柔和的阴影，凸显出她裸露私处的每一处曲线和细节。亲密的特写镜头，略微低角度的视角，以她的躯干和完全张开的双腿为中心，高度逼真的渲染，细腻的皮肤纹理，细小的毛孔，自然的红晕，以及不容置疑的色情焦点。 1 Create a close-up image of an incredibly cute puppy, perhaps a light-colored Cocker Spaniel with curly fur and long ears, and a grey and white tabby kitten sit side by side on a stone wall overlooking the ocean under a slightly cloudy sky. The puppy and the cat have their backs to the camera. It is obviously, that the kitten and the puppy are very young. They are the focus of the scene and are super cute. The stone wall is a light greyish-brown. The water in the background is light blue, suggesting a calm sea. The sky is light blue with very large, fluffy white clouds drifting across it. The lighting suggests a bright, sunny day. The scene exudes a peaceful tranquility and serenity. Friendship, perfect composition, haze, low angle shot, super cute, vibrant colors, highest quality, realistic, fantastic, hyper-detailed, maximalist style, photorealistic, concept art, sharp focus, harmony, ambient occlusion, halo, dynamic lighting, a masterpiece, award-winning, DB4RZ, DB4RZ style painting, NeoPigma, in the style of cksc, anime, cyberpunk ","date":"2025-05-23T09:54:52+08:00","permalink":"/p/250523095452/","title":"AI画图提示词，draw prompt"},{"content":"简介 TVBox，一款集成了影视资源，直播源，本地功能的智能电视盒子软件，它允许用户访问各种在线服务，如视频流媒体、音乐等。TVBox 通常运行 Android 或其他操作系统。\nAPP 下载 影视/fongmi https://github.com/FongMi/Release/tree/okjack/apk/release\nleanback 开头表示 TV 版 mobile 开头表示手机版\n直接下载：无加速\nTV 版：点击下载 手机版：点击下载 直接下载：国内加速\nTV 版：点击下载 手机版：点击下载 源连接\n1 2 3 4 5 6 7 8 9 直接下载：无加速 - TV 版：[点击下载](https://raw.githubusercontent.com/FongMi/Release/fongmi/apk/release/leanback-arm64_v8a.apk) - 手机版：[点击下载](https://raw.githubusercontent.com/FongMi/Release/fongmi/apk/release/mobile-arm64_v8a.apk) 直接下载：国内加速 - TV 版：[点击下载](https://ghfast.top/https://raw.githubusercontent.com/FongMi/Release/fongmi/apk/release/leanback-arm64_v8a.apk) - 手机版：[点击下载](https://ghfast.top/https://raw.githubusercontent.com/FongMi/Release/fongmi/apk/release/mobile-arm64_v8a.apk) ok 影视/okyingshi https://github.com/FongMi/Release/tree/fongmi/apk/release\n直接下载：无加速\nTV 版：点击下载 手机版：点击下载 直接下载：国内加速\nTV 版：点击下载 手机版：点击下载 源连接\n1 2 3 4 5 6 7 8 9 直接下载：无加速 - TV版：[点击下载](https://raw.githubusercontent.com/FongMi/Release/okjack/apk/release/leanback-arm64_v8a.apk) - 手机版：[点击下载](https://raw.githubusercontent.com/FongMi/Release/okjack/apk/release/mobile-arm64_v8a.apk) 直接下载：国内加速 - TV 版：[点击下载](https://ghfast.top/https://raw.githubusercontent.com/FongMi/Release/okjack/apk/release/leanback-arm64_v8a.apk) - 手机版：[点击下载](https://ghfast.top/https://raw.githubusercontent.com/FongMi/Release/okjack/apk/release/mobile-arm64_v8a.apk) 订阅地址 https://upld.zone.id/uploads/q9iq9e5iq/tvboxlvse.json\nleanback 开头表示 TV 版 mobile 开头表示手机版\n自制源教程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 { \u0026#34;spider\u0026#34;: \u0026#34;https://lemetu.com/custom_spider.jar\u0026#34;, //自己的爬虫文件后台地址 \u0026#34;wallpaper\u0026#34;: \u0026#34;https://lemetu.com/壁纸.png\u0026#34;, //前端背景的图片地址 \u0026#34;sites\u0026#34;: [ { \u0026#34;key\u0026#34;: \u0026#34;lemetu\u0026#34;, //可默认也可自定义 \u0026#34;name\u0026#34;: \u0026#34;乐美兔博客\u0026#34;, //前端显示的资源名称自定义 \u0026#34;type\u0026#34;: 3, //Type 0-xml 1-json 2-爬虫源 3-自定义爬虫 4-服务器爬虫 \u0026#34;api\u0026#34;: \u0026#34;csp_AppYsV2\u0026#34;, //默认走爬虫线路都是这个记号不可修改 \u0026#34;searchable\u0026#34;: 1, //可搜索? 0-不可以 1-可以 \u0026#34;quickSearch\u0026#34;: 1, //可快速搜索? 0-不可以 1-可以 \u0026#34;filterable\u0026#34;: 1, //可筛选? 0-不可以 1-可以 \u0026#34;ext\u0026#34;: \u0026#34;https://lemetu.com/api.php/app/\u0026#34; //爬虫模式的对接地址 }, //注意增加资源要在逗号之后 { \u0026#34;key\u0026#34;: \u0026#34;csp_lemetu\u0026#34;, //自定义英文标签必须带上前缀csp_ \u0026#34;name\u0026#34;: \u0026#34;乐美兔博客\u0026#34;, //前端显示的资源名称自定义 \u0026#34;type\u0026#34;: 1, //Type 0-xml 1-json 2-爬虫源 3-自定义爬虫 4-服务器爬虫 \u0026#34;api\u0026#34;: \u0026#34;https://lemetu.com/api.php/provide/vod/?ac=list\u0026#34;,//默认苹果CMS资源采集站的地址 \u0026#34;playUrl\u0026#34;: \u0026#34;json:https://lemetu.com/?url=\u0026#34;, //资源指定JSON解析接口，一般不填写 \u0026#34;searchable\u0026#34;: 1, ////可搜索? 0-不可以 1-可以 \u0026#34;quickSearch\u0026#34;: 1, //可筛选? 0-不可以 1-可以 \u0026#34;filterable\u0026#34;: 1, //可筛选? 0-不可以 1-可以 \u0026#34;categories\u0026#34;: [ \u0026#34;电影\u0026#34;,\u0026#34;剧集\u0026#34;,\u0026#34;综艺\u0026#34;,\u0026#34;动漫\u0026#34;,\u0026#34;短剧\u0026#34;] //可以在前端显示的分类 注意结尾不要带逗号 }, //这个地方可以继续添加资源，将你从别处复制过来的代码粘贴到这里即可 { \u0026#34;key\u0026#34;: \u0026#34;push_agent\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;前端自定义播放功能\u0026#34;, //前端自定义播放链接功能 \u0026#34;type\u0026#34;: 3, \u0026#34;api\u0026#34;: \u0026#34;csp_Push\u0026#34;, \u0026#34;searchable\u0026#34;: 0, \u0026#34;quickSearch\u0026#34;: 0, \u0026#34;changeable\u0026#34;: 0, \u0026#34;ext\u0026#34;: \u0026#34;http://127.0.0.1:9978/file/MeowTV/token.txt+4k|auto|fhd\u0026#34; } //注意结尾不要带逗号 ], \u0026#34;lives\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;live\u0026#34;, //名字自定义 \u0026#34;type\u0026#34;: 0, \u0026#34;url\u0026#34;: \u0026#34;http://lemetu.com/zhibo.txt\u0026#34;, //这里填写直播源的地址（注意要txt结尾的链接） \u0026#34;playerType\u0026#34;: 1, \u0026#34;ua\u0026#34;: \u0026#34;okhttp/3.15\u0026#34;, \u0026#34;epg\u0026#34;: \u0026#34;http://epg.112114.xyz/?ch={name}\u0026amp;amp;date={date}\u0026#34;, \u0026#34;logo\u0026#34;: \u0026#34;https://epg.112114.xyz/logo/{name}.png\u0026#34; } ], \u0026#34;flags\u0026#34;:[\u0026#34;lzm3u8\u0026#34;,\u0026#34;youku\u0026#34;,\u0026#34;qq\u0026#34;,\u0026#34;iqiyi\u0026#34;,\u0026#34;qiyi\u0026#34;,\u0026#34;letv\u0026#34;,\u0026#34;sohu\u0026#34;,\u0026#34;tudou\u0026#34;,\u0026#34;mgtv\u0026#34;,\u0026#34;bilibili\u0026#34;], //添加播放器标识用逗号分割 \u0026#34;parses\u0026#34;:[ {\u0026#34;name\u0026#34;: \u0026#34;聚合\u0026#34;,\u0026#34;type\u0026#34;: 3,\u0026#34;url\u0026#34;: \u0026#34;Demo\u0026#34;}, //类型 {\u0026#34;name\u0026#34;: \u0026#34;轮询\u0026#34;,\u0026#34;type\u0026#34;: 2,\u0026#34;url\u0026#34;: \u0026#34;Sequence\u0026#34;}, //类型 {\u0026#34;name\u0026#34;: \u0026#34;1号线\u0026#34;,\u0026#34;type\u0026#34;: 0,\u0026#34;url\u0026#34;: \u0026#34;https://json解析地址/?url=\u0026#34;}, //支持json和普通接口同时使用 {\u0026#34;name\u0026#34;: \u0026#34;2号线\u0026#34;,\u0026#34;type\u0026#34;: 0,\u0026#34;url\u0026#34;: \u0026#34;https://普通解析地址/?url=\u0026#34;}, //解析接口可以无限添加 {\u0026#34;name\u0026#34;: \u0026#34;3号线\u0026#34;,\u0026#34;type\u0026#34;: 0,\u0026#34;url\u0026#34;: \u0026#34;https://无限解析地址/?url=\u0026#34;} //注意结尾不要带逗号 ], \u0026#34;ijk\u0026#34;: [{\u0026#34;group\u0026#34;: \u0026#34;软解码\u0026#34;,\u0026#34;options\u0026#34;: [ {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;opensles\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;overlay-format\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;842225234\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;framedrop\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;soundtouch\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;start-on-prepared\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;http-detect-range-support\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;fflags\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;fastseek\u0026#34;}, {\u0026#34;category\u0026#34;: 2,\u0026#34;name\u0026#34;: \u0026#34;skip_loop_filter\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;48\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;reconnect\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;max-buffer-size\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;5242880\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;enable-accurate-seek\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-auto-rotate\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-handle-resolution-change\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-hevc\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;dns_cache_timeout\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;600000000\u0026#34;}]}, {\u0026#34;group\u0026#34;: \u0026#34;硬解码\u0026#34;,\u0026#34;options\u0026#34;: [ {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;opensles\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;overlay-format\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;842225234\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;framedrop\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;soundtouch\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;start-on-prepared\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;http-detect-range-support\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;fflags\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;fastseek\u0026#34;}, {\u0026#34;category\u0026#34;: 2,\u0026#34;name\u0026#34;: \u0026#34;skip_loop_filter\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;48\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;reconnect\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;max-buffer-size\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;5242880\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;enable-accurate-seek\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;0\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-auto-rotate\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-handle-resolution-change\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 4,\u0026#34;name\u0026#34;: \u0026#34;mediacodec-hevc\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;1\u0026#34;}, {\u0026#34;category\u0026#34;: 1,\u0026#34;name\u0026#34;: \u0026#34;dns_cache_timeout\u0026#34;,\u0026#34;value\u0026#34;: \u0026#34;600000000\u0026#34;}]}], \u0026#34;ads\u0026#34;: [\u0026#34;屏蔽广告地址1\u0026#34;,\u0026#34;屏蔽广告地址2\u0026#34;,\u0026#34;屏蔽广告地址13\u0026#34;] }... ","date":"2025-05-21T11:35:08+08:00","permalink":"/p/250521113508/","title":"TVBox，一款集成了影视资源，直播源，本地功能的智能电视盒子软件"},{"content":"简介 Vimium 是一款浏览器扩展程序，它以 Vim 编辑器的精神，提供基于键盘的网页导航和控制功能。\nwiki：https://github.com/philc/vimium/wiki\n安装 Chrome: Chrome web store Edge: Edge Add-ons Firefox: Firefox Add-ons 快捷键 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ? show the help dialog for a list of all available keys h scroll left j scroll down k scroll up l scroll right gg scroll to top of the page G scroll to bottom of the page d scroll down half a page u scroll up half a page f open a link in the current tab F open a link in a new tab r reload gs view source i enter insert mode -- all commands will be ignored until you hit Esc to exit yy copy the current url to the clipboard yf copy a link url to the clipboard gf cycle forward to the next frame gF focus the main/top frame ","date":"2025-05-20T10:42:04+08:00","permalink":"/p/250520104204/","title":"vimium，提供基于键盘的网页导航和控制"},{"content":"原帖：https://linux.do/t/topic/36767\n经过测试，可以直接注册的：\nnya：https://t.me/nyamedia_chat\n","date":"2025-05-10T15:45:50+08:00","permalink":"/p/250510154550/","title":"emby公益服"},{"content":"简介 rsync (remote sync) 是一个快速且极其通用的文件复制工具。它可以在本地计算机之间、本地计算机和远程计算机之间以及远程计算机之间同步文件和目录。 rsync 的关键特性是它只传输源文件和目标文件之间 差异的部分，从而大大减少了网络传输量，使其成为备份、镜像和数据迁移的理想选择。\n主要特点和优势 增量传输： 这是 rsync 最重要的特性。 它只传输源文件和目标文件之间更改的部分，而不是整个文件。 这显著提高了同步速度，尤其是在处理大型文件或通过慢速网络连接传输数据时。 压缩： rsync 可以压缩数据以减少传输量，进一步提高速度。 安全性： rsync 可以通过 SSH (Secure Shell) 等安全协议进行传输，确保数据在传输过程中的机密性和完整性。 灵活性： rsync 提供了大量的选项，允许用户精确控制同步过程，例如： 排除特定文件或目录： 可以通过指定模式来排除不需要同步的文件或目录。 保留文件属性： 可以保留文件权限、所有者、时间戳等属性。 删除目标文件： 可以删除目标目录中源目录中不存在的文件。 模拟运行： 可以进行模拟运行，查看同步过程，而不实际修改文件。 支持多种传输协议： rsync 可以使用 rsh、ssh 或直接 TCP 连接进行传输。 镜像网站： rsync 非常适合镜像网站，因为它能够快速有效地同步网站内容。 备份： rsync 经常被用于创建备份，因为它只传输更改的部分，从而节省时间和存储空间。 免费开源： rsync 是一个免费且开源的工具，可以自由使用和修改。 工作原理 rsync 的增量传输算法的核心是 差分算法 (delta transfer algorithm)。 它大致的工作流程如下：\n计算校验和： rsync 首先计算源文件和目标文件的校验和 (checksum)。 比较校验和： 它比较源文件和目标文件的校验和，以确定哪些部分相同，哪些部分不同。 传输差异： 对于不同的部分，rsync 只传输差异的数据块，而不是整个文件。 重建文件： 目标端接收到差异的数据块后，根据已有的目标文件和接收到的差异数据块，重建完整的目标文件。 语法 语法：\n1 rsync [OPTIONS] SOURCE DESTINATION OPTIONS: 各种选项，用于控制 rsync 的行为。 SOURCE: 源文件或目录。 DESTINATION: 目标文件或目录。 选项：\n-v: verbose，显示详细的同步过程。 -a: archive，归档模式，保留文件属性（权限、所有者、时间戳等），并递归复制目录。 这是最常用的选项，通常用于备份和同步。 -z: compress，压缩数据以减少传输量。 -r: recursive，递归复制目录。 -u: update，只更新目标文件中比源文件旧的文件。 -n: dry-run，模拟运行，不实际修改文件。 --delete: 删除目标目录中源目录中不存在的文件。 --exclude=PATTERN: 排除匹配 PATTERN 的文件或目录。 --include=PATTERN: 包含匹配 PATTERN 的文件或目录，即使它被其他排除规则排除。 -e: 指定使用的远程 shell，例如 -e ssh 使用 SSH 进行传输。 -h：使输出的文件大小、传输速度和总数据量等信息以更易于人类阅读的格式显示。 基本用法 将本地目录 source_dir 同步到远程服务器 user@remote_host:/path/to/destination_dir，使用 SSH 进行传输，并保留文件属性：\n1 rsync -avz -e ssh source_dir user@remote_host:/path/to/destination_dir 将远程服务器 user@remote_host:/path/to/source_dir 同步到本地目录 destination_dir，使用 SSH 进行传输，并删除目标目录中源目录中不存在的文件：\n1 rsync -avz -e ssh --delete user@remote_host:/path/to/source_dir destination_dir 将本地目录 source_dir 同步到本地目录 destination_dir，排除所有 .log 文件：\n1 rsync -avz --exclude=\u0026#39;*.log\u0026#39; source_dir destination_dir ","date":"2025-05-10T11:01:45+08:00","permalink":"/p/250510110145/","title":"rsync，快速且极其通用的文件复制工具"},{"content":"国内版 中山大学教育版 https://365.kdocs.cn/3rd/work/download/WeBHVP2r5aI7rgtz\n海外版 https://www.wps.com/zh-hant/\n","date":"2025-05-07T23:06:28+08:00","permalink":"/p/250507230628/","title":"wps教育版，无广告版本"},{"content":"简介 Sink 是一款简单、快速、安全的链路缩短器，配备分析功能，100% 在 Cloudflare 上运行。\n特性 URL Shortening: Compress your URLs to their minimal length. Analytics: Monitor link analytics and gather insightful statistics. Serverless: Deploy without the need for traditional servers. Customizable Slug: Support for personalized slugs and case sensitivity. AI Slug: Leverage AI to generate slugs. Link Expiration: Set expiration dates for your links. URL 缩短： 将您的 URL 压缩到最短长度。 分析： 监控链接分析并收集有价值的统计数据。 无服务器： 无需传统服务器即可部署。 自定义 Slug： 支持个性化 Slug 和区分大小写。 AI Slug： 利用 AI 生成 Slug。 链接过期： 为您的链接设置过期日期。 预览 体验 Experience the demo at Sink.Cool. Log in using the Site Token below:\n1 Site Token: SinkCool 部署 Fork 仓库到您的 GitHub 账户。\n在 Cloudflare Pages 中创建一个项目。\n选择 Sink 仓库并选择 Nuxt.js 预设。\n配置以下环境变量：\nNUXT_SITE_TOKEN: 必须长于 8 个字符。此令牌授予访问您仪表盘的权限。 NUXT_CF_ACCOUNT_ID: 找到您的 账户 ID。 NUXT_CF_API_TOKEN: 创建一个至少具有 Account.Account Analytics 权限的 Cloudflare API 令牌。 请参阅参考资料。 保存并部署项目。\n取消部署，然后导航到 设置 -\u0026gt; 绑定 -\u0026gt; 添加：\nKV 命名空间: 将变量名 KV 绑定到一个 KV 命名空间（在 存储 \u0026amp; 数据库 -\u0026gt; KV 下创建一个新的）。 Workers AI (可选): 将变量名 AI 绑定到 Workers AI Catalog。 Analytics Engine: 在 Workers \u0026amp; Pages 中，转到右侧的 账户详细信息，找到 Analytics Engine，然后单击 设置 以启用免费版本。 返回到 设置 -\u0026gt; 绑定 -\u0026gt; 添加 并选择 Analytics engine。 将变量名 ANALYTICS 绑定到 sink 数据集。 重新部署项目。\n更新代码，请参考官方 GitHub 文档 从 Web UI 同步 Fork 分支。\n","date":"2025-05-07T10:16:03+08:00","permalink":"/p/250507101603/","title":"sink，一款简单、快速、安全的链路缩短器，配备分析功能"},{"content":"今天突然发现Firefox也支持垂直标签页了，效果看上去还不错哦\n","date":"2025-05-06T12:44:20+08:00","permalink":"/p/250506124420/","title":"Firefox支持垂直标签页"},{"content":"目前 sing-box 官方没有推出 windows 桌面客户端，只有通过二进制终端启动，事实证明，体验并不友好\n一段时间使用，有以下方案\n方案 1：打开终端，运行命令（极为繁琐） 方案 2：编写 bat 脚本，点击启动（有点繁琐） 方案 3：服务启动（推荐） 方案 1 Windows 启动后，手动启动一个终端，运行命令启动 sing-box\n优点：\n暂时想不出来 缺点：\n操作步骤多，繁琐 任务栏有个黑色终端窗口 误关闭终端窗口会导致代理退出 方案 2 编写一个 bat 脚本，放在桌面，点击脚本启动\n优点：\n开启代理简单，点击脚本即可启动代理 关闭代理简单，关闭终端窗口即可停止代理 缺点：\n任务栏有个黑色终端窗口 误关闭终端窗口会导致代理退出 这里给一个 bat 脚本\n如果不懂请喂给 ai ，请 ai 帮忙修改\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @echo off chcp 65001 REM UTF-8 REM chcp 936 REM GBK (简体中文) echo Changing drive to E: E: echo Changing directory to E:\\backup\\application\\sing-box cd backup\\application\\sing-box\\client\\windows echo Running sing-box with config-windows.json sing-box run -c config-mixed.json echo sing-box execution complete. pause 方案 3 创建系统服务，实现开机自启动，没有黑色终端窗口\n优点：\n开启代理简单，开机自动启动代理，也可以设置手动，延时启动 缺点：\n关闭代理需要输入命令 ","date":"2025-05-05T21:17:19+08:00","permalink":"/p/250505211719/","title":"windows下sing-box启动方案"},{"content":"优化前 先看看 Google 搜索显示的结果\n结果简洁而不简单\n这是 bing 搜索默认显示的结果\n“毒瘤”CSDN占据搜索前列 默认一大屏摘要，默认很多情况并非是需要的内容，向下寻找需要滑动多次滚轮，而每次都是这种，体验可想而知 这是优化后的结果\n优化后 优化了什么？\n去掉了“毒瘤”CSDN 去掉了 bing 默认一大屏摘要，实际并没有什么用，默认推荐还是“毒瘤”CSDN 优化方式 如何优化？\n两个插件：\nstylebot uBlacklist stylebot Stylebot 是一款功能强大的浏览器扩展程序，支持 Chrome、Firefox 和 Edge 等主流浏览器。能让用户通过直观 UI 操作或 CSS 代码编辑器自定义网页样式，以优化阅读体验或实现个性化定制。\n进入设置，样式，添加新样式\nURL\n1 https://cn.bing.com 样式\n1 2 3 .b_ans { display: none; } uBlacklist uBlacklist 是一款支持 Chrome、Firefox、Safari 等浏览器的扩展程序，能通过匹配模式或正则表达式设定规则，屏蔽指定网站出现在谷歌、必应、DuckDuckGo 等多个主流搜索引擎的结果中，还具备云同步和订阅公共规则集等功能。\n进入设置，常规，添加以下内容，保存\ncsdn：\n1 2 3 4 5 6 *://*.csdn.net/* *://*.csdn.com/* *://*.csdnimg.cn/* *://*.gitcode.com/* *://*.gitcode.net/* *://*.gitcode.host/* 彩蛋 不做任何设置，使用 bing-cn 国际版效果也比国内版好\n","date":"2025-05-04T12:21:28+08:00","permalink":"/p/250504122128/","title":"优化bing搜索结果"},{"content":"简介 FOFA 是一款网络空间测绘的搜索引擎，英文全称为 “Fingerprinting Organizations with Advanced Tools”，由北京华顺信安科技有限公司开发。以下是其相关介绍：\n功能特点 资产发现与指纹识别：能快速识别和收录网站、服务器、路由器、摄像头等各种网络资产，并通过网络响应等信息对设备、操作系统、应用程序等进行精确指纹识别，帮助用户发现特定类型的设备。 漏洞扫描与安全评估：配合其他工具，可利用收集的数据进行漏洞扫描，帮助企业了解网络暴露面，及时发现潜在安全威胁。 定制搜索与数据分析：提供大量搜索语法和过滤器，用户可根据 IP、域名、端口、协议等进行精确搜索，还能通过关键词组合、逻辑运算符等进行高级搜索，以满足精细化需求。 图形化界面与历史数据：提供图形化搜索界面，用户可直观查看搜索结果、图表和图谱，更好地理解网络设备布局。同时记录历史搜索结果，方便用户查看设备和服务的历史信息，了解网络发展变化。 API 支持：提供 API，用户能够通过编程方式访问搜索引擎，将其功能集成到自己的应用程序或工作流程中。 应用场景 网络安全领域：安全研究人员和企业安全团队可用于资产发现和漏洞挖掘，帮助企业梳理公网暴露面，保护互联网资产安全。白帽子团体也可通过它进行漏洞挖掘，判断漏洞影响范围，帮助企业应对网络安全问题。 其他领域：高校或机构研究人员可通过它快速确认某一款产品在全球的资产分布情况，为研究提供数据支撑。个人也可用于寻找一些有趣的东西，如通过搜索特定关键词找到使用特定框架搭建的网站等。 搜索语法 FOFA 的搜索语法丰富多样，以下是一些常见的搜索语法：\n基本语法结构：keyword1=\u0026quot;value1\u0026quot; keyword2=\u0026quot;value2\u0026quot;，多个查询条件之间默认是 “与”（AND）关系。 常用查询字段 port：用于搜索特定端口开放的资产，如port=\u0026quot;80\u0026quot;表示搜索开放 80 端口的资产。 domain：搜索与某个域名相关的资产，例如domain=\u0026quot;example.com\u0026quot;。 title：搜索网页标题中包含特定关键词的资产，如title=\u0026quot;admin\u0026quot;。 header：搜索 HTTP 头部中包含特定关键词的资产，例如header=\u0026quot;nginx\u0026quot;。 body：搜索网页正文中包含特定关键词的资产，如body=\u0026quot;login\u0026quot;。 protocol：搜索使用特定协议的资产，如protocol=\u0026quot;http\u0026quot;。 country：搜索位于某个国家的资产，country=\u0026quot;CN\u0026quot;表示搜索中国的资产。 status_code：搜索返回特定 HTTP 状态码的资产，如status_code=\u0026quot;200\u0026quot;。 as_number：搜索属于特定自治系统编号（AS 号）的资产，例如as_number=\u0026quot;AS15169\u0026quot;。 app：搜索使用特定软件或技术的资产，如app=\u0026quot;Apache\u0026quot;。 逻辑运算符 AND：默认逻辑运算符，例如ip=\u0026quot;1.1.1.1\u0026quot; port=\u0026quot;80\u0026quot;表示搜索 IP 为1.1.1.1且端口为 80 的资产。 OR：逻辑 “或” 运算，如ip=\u0026quot;1.1.1.1\u0026quot; OR ip=\u0026quot;8.8.8.8\u0026quot;表示搜索 IP 为1.1.1.1或8.8.8.8的资产。 NOT：排除特定条件，例如ip=\u0026quot;1.1.1.1\u0026quot; NOT port=\u0026quot;80\u0026quot;表示搜索 IP 为1.1.1.1但端口不为 80 的资产。 模糊查询和通配符 *：通配符，可以匹配任意字符。 ~：模糊查询，如body~=\u0026quot;keyword\u0026quot;表示搜索网页正文中包含近似关键词的内容。 其他语法 city：按城市筛选，如city=\u0026quot;Hangzhou\u0026quot;搜索位于杭州的资产。 os：按操作系统筛选，os=\u0026quot;Windows\u0026quot;搜索运行 Windows 操作系统的资产。 cert：按证书相关信息检索，如cert=\u0026quot;google\u0026quot;搜索证书中带有 “google” 的资产。 ports：搜索同时开放多个端口的 IP 资产，如ports=\u0026quot;3306,443,22\u0026quot;搜索同时开启 3306、443 和 22 端口的 IP。 ports==\u0026quot;3306,443,22\u0026quot;则表示搜索只开启这三个端口的 IP。 after和before：按时间筛选，after=\u0026quot;2017\u0026quot; \u0026amp;\u0026amp; before=\u0026quot;2017-10-01\u0026quot;表示搜索 2017 年 1 月 1 日之后且在 2017 年 10 月 1 日之前的数据。 此外，FOFA 还支持子网查询，使用 CIDR 表示法对特定子网范围进行查询，如ip=\u0026quot;220.181.111.1/24\u0026quot;\n。同时，也可以使用括号和逻辑运算符组合复杂的搜索条件，进行更精确的筛选。\n","date":"2025-05-04T12:06:15+08:00","permalink":"/p/250504120615/","title":"fofa，搜索语法"},{"content":"某个分支下的某个文件的链接格式\n1 https://github.com/{用户名}/{仓库名}/blob/{分支名}/{文件路径} 某个分支下的某个文件的直接下载链接格式\n1 https://raw.githubusercontent.com/{用户名}/{仓库名}/{分支名}/{文件路径} 某个分支以 ZIP 格式直接下载的链接\n1 https://github.com/{用户名}/{仓库名}/archive/refs/heads/{分支名}.zip Github 代理 GitHub 文件 , Releases , archive , gist , raw.githubusercontent.com 文件代理加速下载服务.\n代理链接 https://ghfast.top/ https://gh-proxy.com/ https://gh-proxy.net/ 镜像站点搜集：https://github.com/hunshcn/gh-proxy/issues/116\n使用方法 原始链接 https://raw.githubusercontent.com/username/repo/main/file.txt\n代理链接 https://gh-proxy.com/raw.githubusercontent.com/username/repo/main/file.txt\n代理链接 https://gh-proxy.com/https://raw.githubusercontent.com/username/repo/main/file.txt\n例如：\n1 https://ghfast.top/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip 1 https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/category-ads-all.srs 自建 GitHub 代理 项目：\nhttps://github.com/yangyanggu/gh-proxy-page\nhttps://github.com/hunshcn/gh-proxy\nAPI 用户 查看用户信息\n1 https://api.github.com/users/{username} 仓库 查看仓库信息\n1 https://api.github.com/repos/{username}/{repo_name} ","date":"2025-05-04T09:31:08+08:00","permalink":"/p/250504093108/","title":"Github链接指南，Github代理"},{"content":"修改镜像位置 Docker Compose 参数顺序 Docker Compose 文件中的参数顺序并没有严格规定，但是为了可读性和维护性，通常会遵循一定的约定。 虽然没有强制的顺序，但是以下是一种常见的、逻辑性较强的顺序，可以参考：\nversion\nservices\n每个服务内部：\nimage 或 build: 镜像或构建上下文。 container_name: 容器的名称。 depends_on: 服务依赖关系。 networks: 加入的网络 ports: 端口映射。 volumes: 卷挂载。 environment: 环境变量。 env_file: 从文件加载环境变量 restart: 重启策略。 command: 覆盖默认命令。 entrypoint: 覆盖默认入口点。 logging: 日志配置。 labels: 为容器添加元数据标签。 healthcheck: 健康检查。 deploy: 部署配置（用于 Swarm 模式）。 其他不常用的参数 networks\nvolumes\n示例\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 version: \u0026#34;3.9\u0026#34; services: web: container_name: my_web_app image: nginx:latest depends_on: - app ports: - \u0026#34;80:80\u0026#34; volumes: - ./html:/usr/share/nginx/html environment: - NGINX_HOST=example.com restart: always # \u0026lt;-- restart 参数 logging: driver: \u0026#34;json-file\u0026#34; options: max-size: \u0026#34;10m\u0026#34; app: image: python:3.9-slim-buster volumes: - ./app:/app working_dir: /app command: python app.py environment: - FLASK_ENV=development restart: on-failure # \u0026lt;-- restart 参数 networks: default: name: my_network volumes: data: 控制容器日志大小 单个容器\n1 2 3 4 5 logging: driver: \u0026#34;json-file\u0026#34; options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; 所有容器默认配置\n1 sudo vim /etc/docker/daemon.json 1 2 3 4 5 6 7 { \u0026#34;log-driver\u0026#34;: \u0026#34;json-file\u0026#34;, \u0026#34;log-opts\u0026#34;: { \u0026#34;max-size\u0026#34;: \u0026#34;32m\u0026#34;, \u0026#34;max-file\u0026#34;: \u0026#34;3\u0026#34; } } 1 sudo systemctl restart docker 获取所有容器 id\n1 sudo docker ps -a | awk {\u0026#39;print $1\u0026#39;} | sed -n \u0026#39;2,$ p\u0026#39; sudo docker ps 获取容器状态\nawk {\u0026lsquo;print $1\u0026rsquo;} 查看第一列\nsed -n \u0026lsquo;2,$ p\u0026rsquo; 查看从第 2 行到最后一行\n或者\n1 docker ps -aq 查看所有容器状态\n1 2 3 4 5 # 使用docker自带命令 sudo docker stats -a # 使用获取所有id的方式 sudo docker ps | awk {\u0026#39;print $1\u0026#39;} | sed -n \u0026#39;2,$ p\u0026#39; | xargs sudo docker stats xargs 反向传参\n停止所有容器（谨慎使用）\n1 2 # 使用获取所有id的方式 sudo docker ps | awk {\u0026#39;print $1\u0026#39;} | sed -n \u0026#39;2,$ p\u0026#39; | xargs sudo docker rm 1 sudo docker stop $(docker ps -q) 查看容器 ip\n1 docker inspect \u0026lt;container_id|container_name\u0026gt; 多个容器，不同配置文件在同一个网络 1 docker network create oplist_network 1 2 3 4 5 6 7 8 9 services: oplist: ... networks: - openlist_network networks: openlist_network: external: true ","date":"2025-05-02T22:43:58+08:00","permalink":"/p/250502224358/","title":"Docker指南"},{"content":"简介 Paru 是一个轻量级的 AUR（Arch User Repository）助手，用于在 Arch Linux 及其衍生版上方便地安装和管理用户提交的软件包。与其他 AUR 助手相比，Paru 的特点包括：\n性能优越：Paru 使用 Rust 编写，具有较高的性能和较低的资源占用。 用户友好的界面：提供了简洁的命令行界面，支持自动补全和简化的命令选项。 支持多种功能：除了基本的安装、升级和删除软件包外，还支持搜索、查看软件包信息、处理依赖关系等功能。 内置的 AUR 和官方仓库支持：可以同时处理 AUR 和官方软件包，提高了管理的便利性。 安装 1 sudo pacman -S paru 常用命令 更新所有已安装的软件包\n1 paru -Syu 安装软件（注意，不要加 sudo）\n1 paru -S \u0026lt;package_name\u0026gt; 模糊查询软件\n1 paru -Ss \u0026lt;package_name\u0026gt; 卸载软件\n1 paru -R \u0026lt;package_name\u0026gt; 卸载软件并删除依赖\n1 paru -Rns \u0026lt;package_name\u0026gt; 列举所有已经安装的软件\n1 paru -Q 列举所有已经安装的软件，不带版本号\n1 paru -Qq 清理未使用的依赖\n1 paru -Rns $(paru -Qdtq) paru -Qdtq：这个部分会列出所有未被其他已安装软件包依赖的孤立依赖包。 -Q：查询已安装的软件包。 -d：仅显示依赖包。 -t：仅显示孤立的（未被其他包依赖的）包。 -q：仅输出包名称，不带版本信息。 paru -Rns：这个部分会卸载那些孤立依赖包。 -R：卸载软件包。 -n：同时删除未使用的依赖。 -s：同时删除配置文件。 ","date":"2025-05-02T17:34:51+08:00","permalink":"/p/250502173451/","title":"Paru，Archlinux轻量级的AUR管理器"},{"content":"简介 fail2ban 是一个开源的入侵防御软件，主要用于保护 Linux 服务器和其他 Unix 系统免受暴力破解和其他恶意攻击。它通过监视日志文件来检测可疑活动，并自动采取措施（通常是禁止 IP 地址）来防止进一步的攻击。\n主要功能 自动禁止 IP 地址: 当检测到特定服务（如 SSH、FTP、HTTP 等）中的多次失败登录尝试时，fail2ban 会自动使用防火墙（如 iptables）禁止这些 IP 地址。 日志监控: fail2ban 监控系统日志（如 /var/log/auth.log 或 /var/log/secure），并根据预定义的规则（过滤器）分析日志内容。 可配置性: 用户可以根据需求自定义配置文件，设置不同的监控规则、禁止时间、允许的失败尝试次数等。 多种服务支持: fail2ban 支持多种服务的保护，包括 SSH、HTTP、FTP、SMTP 等。 邮件通知: 可以配置邮件通知功能，当 IP 被禁止时，系统会自动发送通知邮件给管理员。 可扩展性: 用户可以创建自定义过滤器和动作，以适应特定的需求。 工作原理 配置: 用户设置 fail2ban 的配置文件，定义需要监控的服务、日志文件路径、过滤规则等。 监控: fail2ban 定期扫描指定的日志文件，查找符合过滤器条件的日志条目。 触发: 如果在设定的时间窗口内，某个 IP 地址的失败尝试次数超过了允许的最大值，fail2ban 会执行相应的动作（如禁止该 IP）。 解除禁止: 被禁止的 IP 地址在设定的时间后会自动解除禁止，或者管理员可以手动解除。 部署 Debian / Ubuntu\n1 2 sudo apt update sudo apt install fail2ban 配置 准备工作 配置文件所在的位置：\n1 /etc/fail2ban 新建 jail.local\n1 sudo vim jail.local 简单配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #DEFAULT-START [DEFAULT] bantime = 600 findtime = 300 maxretry = 5 banaction = iptables-allports action = %(action_mwl)s backend = systemd #DEFAULT-END [sshd] ignoreip = 127.0.0.1/8 enabled = true filter = sshd port = 22 maxretry = 5 findtime = 300 bantime = 600 banaction = iptables-allports action = %(action_mwl)s logpath = /var/log/auth.log 配置参考了：\n1panel blog 多种策略 此 Fail2Ban 配置通过多个 jail 实现更精细的 SSH 保护，根据登录失败尝试的频率和时间段，应用不同的禁止时长：\nDEFAULT: 设置全局默认值，使用 systemd 日志后端，iptables-allports 禁止所有端口，并发送邮件告警。 sshd-short: 5 分钟内 5 次失败尝试 -\u0026gt; 禁止 10 分钟 sshd-medium: 30 分钟内 10 次失败尝试 -\u0026gt; 禁止 1 小时 sshd-long: 24 小时内 30 次失败尝试 -\u0026gt; 禁止 100 天 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # /etc/fail2ban/jail.local (或者 /etc/fail2ban/jail.d/custom.conf) # ; 表示单行注释 [DEFAULT] bantime = 600 ; 封禁时间 findtime = 300 ; 指定时间内 maxretry = 5 ; 最大尝试次数 backend = systemd ; 使用 systemd 日志后端 banaction = iptables-allports ; 使用 iptables 阻止所有端口 action = %(action_mwl)s ; 邮件告警 + 日志记录 [sshd-short] enabled = true filter = sshd ; 使用 sshd 过滤器 logpath = /var/log/auth.log ; SSH 日志文件 port = ssh findtime = 300 ; 5 分钟 maxretry = 5 bantime = 600 ; 10 分钟 (5分钟内超过5次) [sshd-medium] enabled = true filter = sshd logpath = /var/log/auth.log port = ssh findtime = 1800 ; 30 分钟 maxretry = 10 bantime = 3600 ; 1 小时 (30分钟内超过10次) [sshd-long] enabled = true filter = sshd logpath = /var/log/auth.log port = ssh findtime = 86400 ; 24 小时 maxretry = 30 bantime = 8640000 ; 100 天 (24小时超过30次) 服务 启动服务\n1 sudo systemctl start fail2ban 常见命令 查看 Fail2Ban 中被禁止的 IP 地址\n1 fail2ban-client status \u0026lt;jail_name\u0026gt; 查看名为 sshd 的监狱的被禁止 IP\n1 fail2ban-client status sshd 如果自己忘记了密码，被 fail2ban 阻止了，解除命令\n1 sudo fail2ban-client set \u0026lt;jail_name\u0026gt; unbanip \u0026lt;ip_address\u0026gt; 例如\n1 sudo fail2ban-client set ssh unbanip 192.168.1.100 ","date":"2025-05-02T11:41:18+08:00","permalink":"/p/250502114118/","title":"fail2ban，保护服务器安全"},{"content":"简介 WebSSH 是一个基于 Web 的轻量级 SSH 管理工具，方便地在浏览器中进行安全的远程服务器管理。\n源码：https://github.com/cmliu/webssh\n预览 部署 docker 1 docker run -d --name webssh --restart always -p 8888:8888 cmliu/webssh:latest docker-compose 1 2 3 4 5 6 7 8 9 version: \u0026#39;3\u0026#39; services: webssh: container_name: webssh image: cmliu/webssh:latest ports: - \u0026#34;8888:8888\u0026#34; restart: always network_mode: bridge ","date":"2025-04-22T18:50:12+08:00","permalink":"/p/250422185012/","title":"webssh修改版，基于 Web 的轻量级 SSH 管理工具"},{"content":"简介 基于 Web 的 ssh 客户端\n这是一个简单的 Web 应用程序，可以作为 ssh 客户端连接到你的 ssh 服务器。它是用 Python 编写的，基于 Tornado、paramiko 和 xterm.js。\n源码：https://github.com/huashengdun/webssh\n特性 支持 SSH 密码认证，包括空密码。 支持 SSH 公钥认证，包括 DSA、RSA、ECDSA、Ed25519 密钥。 支持加密密钥。 支持双因素认证（基于时间的一次性密码）。 支持全屏终端。 终端窗口可调整大小。 自动检测 SSH 服务器的默认编码。 支持现代浏览器，包括 Chrome、Firefox、Safari、Edge、Opera。 预览 ","date":"2025-04-22T18:36:37+08:00","permalink":"/p/250422183637/","title":"webssh，一个基于web的SSH客户端项目"},{"content":"简介 QX，Loon，Surge，Stash，Egern 和 ShadowRocket 的高级订阅管理器\n支持的格式 代理 URI 方案 (Proxy URI Scheme) (socks5, socks5+tls, http, https (可以)) 示例: socks5+tls://user:pass@ip:port#name URI 支持 (URI Support) (AnyTLS, SOCKS, SS, SSR, VMess, VLESS, Trojan, Hysteria, Hysteria 2, TUIC v5, WireGuard) Clash 代理 YAML 格式 (Clash Proxies YAML) Clash 代理 JSON 格式 (单行) (Clash Proxy JSON (single line)) Quantumult X (QX) 支持 (QX Support) (SS, SSR, VMess, Trojan, HTTP, SOCKS5, VLESS) Loon 支持 (Loon Support) (SS, SSR, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, WireGuard, VLESS, Hysteria 2) Surge 支持 (Surge Support) (Direct, SS, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, TUIC, Snell, Hysteria 2, SSH (仅密码认证), 外部代理程序 (仅限 macOS), WireGuard (Surge to Surge)) Surfboard 支持 (Surfboard Support) (SS, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, WireGuard (Surfboard to Surfboard)) Clash.Meta 支持 (Clash.Meta Support) (Direct, SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, Hysteria 2, TUIC, SSH, mieru, AnyTLS) Stash 支持 (Stash Support) (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, TUIC, Juicity, SSH) 支持的目标平台 纯 JSON 格式 (Plain JSON) Stash Clash.Meta (mihomo) Surfboard Surge Surge Mac (使用 mihomo 支持 Surge 本身不支持的协议) (SurgeMac (Use mihomo to support protocols that are not supported by Surge itself)) Loon Egern Shadowrocket Quantumult X (QX) sing-box V2Ray V2Ray URI 源码：https://github.com/sub-store-org/Sub-Store\n部署 docker 1 docker run -d --name sub-store -p 3001:3001 -v /root/sub-store_data:/root/sub-store-data -e SUB_STORE_BACKEND_API_HOST=127.0.0.1 xream/sub-store docker compose 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: \u0026#39;3.9\u0026#39; services: sub-store: image: \u0026#39;xream/sub-store:http-meta\u0026#39; container_name: \u0026#39;sub-store\u0026#39; ports: - \u0026#39;127.0.0.1:8010:3000\u0026#39; environment: - HOST=127.0.0.1 - PORT=9876 - SUB_STORE_BACKEND_API_PORT=3000 - SUB_STORE_BACKEND_API_HOST=0.0.0.0 - SUB_STORE_BACKEND_MERGE=true - SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA # 后端路径 - SUB_STORE_BACKEND_SYNC_CRON=55 23 * * * volumes: - \u0026#39;./sub-store_data:/opt/app/data\u0026#39; restart: unless-stopped 更多详细介绍：https://hub.docker.com/r/xream/sub-store\n使用 前端：URL 后端：URL/\u0026lt;SUB_STORE_FRONTEND_BACKEND_PATH\u0026gt; 后端端点检测\n1 \u0026lt;url\u0026gt;/\u0026lt;SUB_STORE_FRONTEND_BACKEND_PATH\u0026gt;/api/utils/env 脚本 节点美化\n1 https://raw.githubusercontent.com/Keywos/rule/main/rename.js 配置模板\n1 https://raw.githubusercontent.com/xishang0128/sub-store-template/refs/heads/main/1.11.x/sing-box.json 脚本覆写\n1 https://raw.githubusercontent.com/xishang0128/sub-store-template/refs/heads/main/1.11.x/sing-box.js#type=1\u0026amp;name=name ","date":"2025-04-22T07:54:26+08:00","permalink":"/p/250422075426/","title":"sub-store，节点高级订阅管理器"},{"content":"简介 在越南等多个国家提供云VPS、私有服务器\n全面管理云 VPS、私人服务器、托管和域名服务\n提供一个免费的虚拟主机：https://my.dataonline.vn/cart/hosting-gia-re/\n主机系统\n1 4.18.0-553.27.1.lve.el8.x86_64 Linux (基于内核版本 4.18.0) CentOS 8 或 Red Hat Enterprise Linux 8 (RHEL 8) (因为内核版本和 el8 字符串) CloudLinux 8 (因为 lve 字符串，表明使用了 CloudLinux 的 LVE 技术) ","date":"2025-04-21T18:49:19+08:00","permalink":"/p/250421184919/","title":"dataonline主机"},{"content":"简介 部署 1 2 mkdir -p ~/.sing-box curl -L https://github.com/SagerNet/sing-box/releases/download/v1.11.8/sing-box-1.11.8-linux-amd64.tar.gz -o ~/.sing-box/sing-box-1.11.8-linux-amd64.tar.gz ","date":"2025-04-21T18:48:16+08:00","permalink":"/p/250421184816/","title":"dataonline主机搭建节点服务"},{"content":"今天安装了试试，确实很不错啊，\nUI 整体风格一致，不需要额外折腾， 开箱即用， 高分辨率友好， 磁盘开机自动挂载， 自带通知， 终端好看， 开机界面好看， 可直接切换镜像源 ","date":"2025-04-18T12:17:29+08:00","permalink":"/p/250418121729/","title":"linuxmint体验"},{"content":"简介 Zed 是下一代代码编辑器， 与人类和 AI 的高性能协作。\n官网：https://zed.dev/\n源码：github.com/zed-industries/zed\n安装 官方文档：https://zed.dev/docs/\nLinux Flathub\n1 flatpak install flathub dev.zed.Zed ","date":"2025-04-18T11:52:43+08:00","permalink":"/p/250418115243/","title":"Zed，下一代代码编辑器"},{"content":"简介 Rime 是跨平台的输入法引擎，可以高度自定义。\n官网：https://rime.im/\n发行版 Rime 輸入方案可通用於以下發行版：\n【中州韻】 ibus-rime → Linux 【小狼毫】 Weasel → Windows 【鼠鬚管】 Squirrel → Mac OS X 除程序文件以外，Rime 還包括多種數據文件。 這些數據文件存在於以下位置：\n共享資料夾\n【中州韻】 /usr/share/rime-data/ 【小狼毫】 \u0026quot;安裝目錄\\data\u0026quot; 【鼠鬚管】 \u0026quot;/Library/Input Methods/Squirrel.app/Contents/SharedSupport/\u0026quot; 用戶資料夾\n【中州韻】 ~/.config/ibus/rime/ （0.9.1 以下版本爲 ~/.ibus/rime/；fcitx5 为 ~/.local/share/fcitx5/rime/） 【小狼毫】 %APPDATA%\\Rime 【鼠鬚管】 ~/Library/Rime/ 安装 Linux Ubuntu / Debian / Deepin / Linuxmint\n1 sudo apt install fcitx5-rime Arch Linux\n1 sudo pacman -Sy fcitx5-rime 安装完成后，在终端里运行fcitx5-configtool（或在应用程序启动器中检索「Fcitx」关键字），打开 Fcitx 设置工具。然后，在右侧的「可用输入法」中找到 RIME，双击它，以将其添加到「当前输入法」列表。\n最后，在系统托盘右击 Fcitx 图标（通常显示为键盘图案，或者是一只小企鹅），选择「RIME」，这样就成功激活了。\nWindows 使用 小狼毫 weasel ，安装需要的版本：\n点击下载 0.17.4.0 下载后，安装即可\nAndroid 使用 小企鹅输入法，安装：\n点击下载 小企鹅本体 arm64-v8a 点击下载 小企鹅 rime 插件 启用小企鹅输入法，在 输入法添加 中州韵\n输入法方案 对于一开始使用 rime 的用户，推荐使用别人制作好的输入发方案。\nrime-ice 全拼 双拼 rime-ice 被称为雾凇拼音，提供了一套开箱即用的完整配置，包含输入方案（全拼、常见双拼）、长期维护的开源词库及各项扩展功能。\n官网：Rime 配置：雾凇拼音\nGitHub：Rime 配置：雾凇拼音 | 长期维护的简体词库\nrime-wubi86-jidian 五笔 使用输入法方案 Linux 使用 rime-ice\n1 2 3 mkdir -p ~/.local/share/fcitx5/rime/ cd ~/.local/share/fcitx5/rime/ git clone --depth 1 https://github.com/iDvel/rime-ice.git 重新部署 rime\nWindows 使用 rime-ice\n下载 rime-ice.zip并解压到 用户资料文件夹，重新部署\nAndroid 下载 rime-ice.zip，安装 MT 管理器，进入\n1 /storage/emulated/0/Android/data/org.fcitx.fcitx5.android/files/data/rime/ 将压缩包内容解压到上述的文件夹中\n打开输入法，重新部署\n同步 同步主要是同步词典，将输入过的内容合并同步\n配置目录下的installation.yaml文件会在第一次部署后会自动生成；在这里可以编辑当前设备的ID和同步目录，如：\n1 2 3 4 5 6 7 distribution_code_name: \u0026#34;fcitx-rime\u0026#34; distribution_name: Rime distribution_version: 5.1.4 install_time: \u0026#34;Fri Apr 18 11:14:51 2025\u0026#34; installation_id: \u0026#34;linuxmint\u0026#34; sync_dir: \u0026#34;/home/mint/backup/application/rime/sync\u0026#34; rime_version: 1.10.0 修改 installation_id 和增加 sync_dir\n输入法同步后会在 sync_dir生成以 installation_id值命名的文件夹，所以同步只需要同步 /home/mint/backup/application/rime/sync文件夹\n比如：\n1 2 3 4 5 backup/application/rime/sync/ ├── android ├── linux ├── linuxmint └── windows 皮肤风格 为了自定义输入候选的皮肤风格，可参考如下\n小狼毫 新建 weasel.custom.yaml 文件\n通用格式：\n1 2 3 4 5 6 7 customization: distribution_code_name: Weasel distribution_version: 0.16.3 generator: \u0026#34;Weasel::UIStyleSettings\u0026#34; modified_time: \u0026#34;Sun Jun 22 09:18:36 2025\u0026#34; rime_version: 1.11.2 patch: 添加的输入法风格应该加在 patch: 下\n如果让候选词按照垂直排列，将以下内容添加到 皮肤风格最后\n1 2 3 4 patch: style: ...... horizontal: false # 设置为 true 启用横排显示 1 2 3 4 patch: style: ...... inline_preedit: true # 可选：将输入码显示在候选词同一行 Google 风格 长这样： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 patch: style: color_scheme: google font_face: \u0026#34;Source Han Sans SC, Microsoft YaHei\u0026#34; font_point: 12 horizontal: true inline_preedit: true layout: baseline: 0 linespacing: 0 align_type: center max_height: 600 max_width: 0 min_height: 0 min_width: 10 border_width: 0 margin_x: 8 margin_y: 8 spacing: 13 candidate_spacing: 22 hilite_spacing: 6 hilite_padding: 8 # hilite_padding_x: 8 # hilite_padding_y: 8 shadow_radius: 0 shadow_offset_x: 4 shadow_offset_y: 4 corner_radius: 8 round_corner: 8 仿微软输入法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 patch: preset_color_schemes: microsoft_sim: name: 仿微软输入法 author: plutotree back_color: 0xF4F4F4 border_color: 0xDCDCDC text_color: 0x000000 hilited_text_color: 0xF4F4F4 hilited_back_color: 0xFFD8A6 hilited_candidate_text_color: 0x000000 hilited_candidate_back_color: 0xFFD8A6 candidate_text_color: 0x000000 comment_text_color: 0x888888 style: color_scheme: microsoft_sim label_format: \u0026#34;%s\u0026#34; font_face: \u0026#34;微软雅黑\u0026#34; font_point: 14 horizontal: true inline_preedit: true layout: min_width: 160 min_height: 0 border_width: 1 border_height: 1 margin_x: 12 margin_y: 12 spacing: 10 candidate_spacing: 24 hilite_spacing: 8 hilite_padding: 12 round_corner: 0 ","date":"2025-04-18T11:04:44+08:00","permalink":"/p/250418110444/","title":"Rime，跨平台的输入法引擎"},{"content":"简介 VSCode (Visual Studio Code) 是一款由微软开发的免费、开源、跨平台的代码编辑器。它以其轻量级、高性能、高度可定制性而广受欢迎，成为众多开发者的首选工具。\n主要特点：\n智能代码补全 (IntelliSense): 基于变量定义、函数定义等提供智能提示，加速编码。 代码调试: 内置强大的调试器，支持断点、单步执行、变量查看等功能，方便调试代码。 Git 集成: 内置 Git 版本控制工具，方便代码提交、分支管理等操作。 丰富的扩展: 拥有庞大的扩展市场，支持各种编程语言、工具和框架，满足不同开发需求。 可定制性: 可以自定义主题、键盘快捷键、编辑器设置等，打造个性化的开发环境。 跨平台: 支持 Windows、macOS 和 Linux 操作系统。 轻量级: 启动速度快，资源占用少。 简单来说，VSCode 是一个强大、灵活、可定制的代码编辑器，适合各种编程语言和各种开发场景。 它的易用性和丰富的扩展生态系统使其成为开发者的得力助手。\n安装 官方文档：https://code.visualstudio.com/docs/setup/linux\nLinux Debian / Ununtu\n直接通过下载 .deb package文件安装 apt repository 1 2 3 4 5 6 7 8 9 10 sudo apt-get install wget gpg wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor \u0026gt; packages.microsoft.gpg sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg echo \u0026#34;deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main\u0026#34; |sudo tee /etc/apt/sources.list.d/vscode.list \u0026gt; /dev/null rm -f packages.microsoft.gpg update the package cache and install the package using\n1 2 3 sudo apt install apt-transport-https sudo apt update sudo apt install code # or code-insiders ","date":"2025-04-18T10:14:43+08:00","permalink":"/p/250418101443/","title":"VSCode，强大、灵活、可定制的代码编辑器"},{"content":"简介 Sing-box 是一个功能强大且灵活的代理平台，旨在提供安全、快速和可定制的网络连接。 它可以被看作是一个现代化的、高度可配置的 VPN 和代理工具，但其能力远不止于此。\n官网：https://sing-box.sagernet.org/zh/\n源码：https://github.com/SagerNet/sing-box\n特性和功能 多协议支持： Sing-box 支持广泛的代理协议，包括但不限于： VMess VLESS Trojan Shadowsocks Socks HTTP(S) gRPC Hysteria TUIC Reality (TLS 握手伪装) XTLS (一种增强的 TLS) WireGuard (VPN 协议) OpenVPN (VPN 协议) NaiveProxy 灵活的路由规则： Sing-box 允许你根据不同的条件（例如域名、IP 地址、地理位置、应用程序等）定义流量的路由规则。 这意味着你可以精确地控制哪些流量通过代理，哪些流量直连。 强大的配置选项： Sing-box 的配置非常灵活，可以使用 JSON 或 YAML 格式进行配置。 这允许你根据自己的需求定制代理行为。 插件支持： Sing-box 支持插件，可以扩展其功能。 例如，可以使用插件来添加新的协议支持、修改流量或执行其他自定义操作。 跨平台： Sing-box 可以在多种平台上运行，包括： Linux macOS Windows Android iOS (需要越狱) 性能优化： Sing-box 经过优化，可以提供高性能的代理服务。 内置 DNS 服务器： Sing-box 包含一个内置的 DNS 服务器，可以用于解析域名。 流量统计： Sing-box 可以提供流量统计信息，帮助你了解代理的使用情况。 规则集支持： Sing-box 支持使用规则集，例如来自 GitHub 的规则集，方便用户快速配置代理规则。 安装 包管理器 仓库安装 Debian/Ubuntu\n1 2 3 4 5 6 7 8 9 10 11 12 13 sudo mkdir -p /etc/apt/keyrings \u0026amp;\u0026amp; sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc \u0026amp;\u0026amp; sudo chmod a+r /etc/apt/keyrings/sagernet.asc \u0026amp;\u0026amp; echo \u0026#39; Types: deb URIs: https://deb.sagernet.org/ Suites: * Components: * Enabled: yes Signed-By: /etc/apt/keyrings/sagernet.asc \u0026#39; | sudo tee /etc/apt/sources.list.d/sagernet.sources \u0026amp;\u0026amp; sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install sing-box # or sing-box-beta Redhat/DNF5\n1 2 sudo dnf config-manager addrepo --from-repofile=https://sing-box.app/sing-box.repo \u0026amp;\u0026amp; sudo dnf install sing-box # or sing-box-beta Redhat/DNF4\n1 2 3 sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo \u0026amp;\u0026amp; sudo dnf -y install dnf-plugins-core \u0026amp;\u0026amp; sudo dnf install sing-box # or sing-box-beta 手动安装 Debian\n1 bash \u0026lt;(curl -fsSL https://sing-box.app/deb-install.sh) Redhat\n1 bash \u0026lt;(curl -fsSL https://sing-box.app/rpm-install.sh) Archlinux\n1 bash \u0026lt;(curl -fsSL https://sing-box.app/rpm-install.sh) 托管安装 Archlinux\n1 paru -S sing-box Debian\n1 apt install sing-box Windows\n1 winget install sing-box 手动安装 Debian\n1 2 3 mkdir -p ~/.sing-box cd ~/.sing-box 待续。。。 服务管理 对于带有 systemd 的 Linux 系统，通常安装已经包含 sing-box 服务， 您可以使用以下命令管理服务：\n行动 命令 启用 sudo systemctl enable sing-box 禁用 sudo systemctl disable sing-box 启动 sudo systemctl start sing-box 停止 sudo systemctl stop sing-box 强行停止 sudo systemctl kill sing-box 重新启动 sudo systemctl restart sing-box 查看日志 sudo journalctl -u sing-box --output cat -e 实时日志 sudo journalctl -u sing-box --output cat -f 示例模板 服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 { \u0026#34;log\u0026#34;: { \u0026#34;disabled\u0026#34;: false, \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, \u0026#34;dns\u0026#34;: { \u0026#34;servers\u0026#34;: [ { \u0026#34;tag\u0026#34;: \u0026#34;google\u0026#34;, \u0026#34;address\u0026#34;: \u0026#34;https://8.8.8.8/dns-query\u0026#34;, \u0026#34;address_resolver\u0026#34;: \u0026#34;google-resolver\u0026#34;, \u0026#34;detour\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;tag\u0026#34;: \u0026#34;google-resolver\u0026#34;, \u0026#34;address\u0026#34;: \u0026#34;udp://8.8.8.8:53\u0026#34;, \u0026#34;detour\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;rules\u0026#34;: [ { \u0026#34;action\u0026#34;: \u0026#34;route\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;any\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;google\u0026#34; } ], \u0026#34;final\u0026#34;: \u0026#34;google\u0026#34; }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 8081, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;7e92454\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;xtls-rprx-vision\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;reality借用证书的域名\u0026#34;, \u0026#34;reality\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;handshake\u0026#34;: { \u0026#34;server\u0026#34;: \u0026#34;reality借用证书的域名\u0026#34;, \u0026#34;server_port\u0026#34;: 443 }, \u0026#34;private_key\u0026#34;: \u0026#34;reality私有key\u0026#34;, \u0026#34;short_id\u0026#34;: [ \u0026#34;随机id\u0026#34; ] } } }, { \u0026#34;type\u0026#34;: \u0026#34;hysteria2\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;hy2-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 8082, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;hysteria2用户名\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;hysteria2密码\u0026#34; } ], \u0026#34;masquerade\u0026#34;: \u0026#34;hysteria2认证访问失败回退的域名\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ], \u0026#34;certificate_path\u0026#34;: \u0026#34;/etc/cert/cert.pem\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/etc/cert/key.pem\u0026#34; } }, { \u0026#34;type\u0026#34;: \u0026#34;tuic\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;tuic-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 8083, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;tuic用户名\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;tuic密码\u0026#34;, \u0026#34;uuid\u0026#34;: \u0026#34;20865d24-d6ba-4ecf-9c91-93adcf4e31dc\u0026#34; } ], \u0026#34;congestion_control\u0026#34;: \u0026#34;bbr\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ], \u0026#34;certificate_path\u0026#34;: \u0026#34;/etc/cert/cert.pem\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/etc/cert/key.pem\u0026#34; } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;route\u0026#34;: { \u0026#34;rules\u0026#34;: [ { \u0026#34;action\u0026#34;: \u0026#34;sniff\u0026#34; }, { \u0026#34;protocol\u0026#34;: \u0026#34;dns\u0026#34;, \u0026#34;action\u0026#34;: \u0026#34;hijack-dns\u0026#34; }, { \u0026#34;ip_is_private\u0026#34;: true, \u0026#34;action\u0026#34;: \u0026#34;reject\u0026#34; }, { \u0026#34;rule_set\u0026#34;: [ \u0026#34;geoip-cn\u0026#34;, \u0026#34;geosite-category-ads-all\u0026#34; ], \u0026#34;action\u0026#34;: \u0026#34;route\u0026#34;, \u0026#34;outbound\u0026#34;: \u0026#34;block\u0026#34; } ], \u0026#34;rule_set\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;remote\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;geoip-cn\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;binary\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs\u0026#34;, \u0026#34;download_detour\u0026#34;: \u0026#34;direct\u0026#34; }, { \u0026#34;type\u0026#34;: \u0026#34;remote\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;geosite-category-ads-all\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;binary\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs\u0026#34;, \u0026#34;download_detour\u0026#34;: \u0026#34;direct\u0026#34; } ], \u0026#34;final\u0026#34;: \u0026#34;direct\u0026#34; } } vless-reality-vision 目前服务端使用最多的伪装方案\n准备 生成 uuid\n1 sing-box generate uuid 1 2 # 生成内容类似如下 # 2203cb2f-fcae-4dc1-ae5a-679b1e4c54fd 生成 reality-keypair\n1 sing-box generate reality-keypair 1 2 3 # 生成内容类似如下 # PrivateKey: WEb_WJ47QeAOUlNSAMrrMd19n5xabHhMVg4Te_Ndqlg # PublicKey: NvQanM4cV2rDGz7ZeSgSDQGpnhMhoTu8Yi4NdyFCThc 生成 short_id\n1 openssl rand -hex 8 1 2 # 生成内容类似如下 # e857a701eca0971a 服务端 修改：\nlisten_port：监听端口 uuid： server_name：套用的证书域名或者 ip server：套用的证书域名或者 ip server_port：套用的证书域名或者 ip 的端口，一般为 443 private_key： short_id： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;reality-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { \u0026#34;uuid\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;xtls-rprx-vision\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;reality\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;handshake\u0026#34;: { \u0026#34;server\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;server_port\u0026#34;: 443 }, \u0026#34;private_key\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;short_id\u0026#34;: [ \u0026#34;\u0026#34; ] } } } ] } 客户端 修改为对应服务端的信息\nserver：服务器的域名或者 ip server_port：服务器的监听端口 uuid： server_name：套用的证书域名或者 ip public_key short_id 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 { \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;reality-out\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;xtls-rprx-vision\u0026#34;, \u0026#34;packet_encoding\u0026#34;: \u0026#34;xudp\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;utls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;fingerprint\u0026#34;: \u0026#34;chrome\u0026#34; }, \u0026#34;reality\u0026#34;: { \u0026#34;enabled\u0026#34;: false, \u0026#34;public_key\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;short_id\u0026#34;: \u0026#34;\u0026#34; } } } ] } tuic 准备 查看本机 Linux 的网络拥塞控制算法\n1 sysctl net.ipv4.tcp_congestion_control 安装 acme.sh，需要修改 mail@example.com\n1 2 curl https://get.acme.sh | sh -s email=mail@example.com source ~/.bashrc 1 acme.sh --set-default-ca --server letsencrypt 申请证书，修改 example.com 为自己要使用的域名\n1 acme.sh --issue -d example.com --standalone 安装证书，修改 example.com为自己要使用的域名\n1 mkdir -p /etc/cert 1 2 3 acme.sh --install-cert -d example.com \\ --key-file /etc/cert/key.pem \\ --fullchain-file /etc/cert/cert.pem 服务端 修改：\nlisten_port：监听端口 name：用户名 uuid： password：用户密码 congestion_control：拥塞控制算法 certificate_path：TSL 证书公钥路径 key_path：TSL 证书私钥路径 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 { \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;tuic\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;tuic-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 23532, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;uuid\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;congestion_control\u0026#34;: \u0026#34;cubic\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ], \u0026#34;certificate_path\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;\u0026#34; } } ] } 客户端 修改为对应服务端的信息\nserver：服务器的域名或者 ip server_port：服务器的监听端口 uuid： password：服务器设置的密码 congestion_control：拥塞控制算法 server_name：服务器域名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 { \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;tuic\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;tuic-out\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;server_port\u0026#34;: 23532, \u0026#34;uuid\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;congestion_control\u0026#34;: \u0026#34;cubic\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;insecure\u0026#34;: false, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ] } } ] } hysteria2 速度很快的协议，基于 UDP，可能会被运营商 QoS\n准备 生成 uuid\n1 sing-box generate uuid 1 2 # 生成内容类似如下 # 2203cb2f-fcae-4dc1-ae5a-679b1e4c54fd 生成证书\n1 2 3 4 5 6 7 8 9 10 11 12 curl https://get.acme.sh | sh -s email=mail@example.com source ~/.bashrc acme.sh --set-default-ca --server letsencrypt acme.sh --issue -d example.com --standalone mkdir -p /etc/cert acme.sh --install-cert -d example.com \\ --key-file /etc/cert/key.pem \\ --fullchain-file /etc/cert/cert.pem 服务端 替换\ntag：标签 listen：监听地址 listen_port：监听端口 name：用户名 password：用户密码 certificate_path：TSL 证书公钥路径 key_path：TSL 证书私钥路径 masquerade：HTTP3 服务器认证失败时的行为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 { \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;hysteria2\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;hy2-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 34622, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ], \u0026#34;certificate_path\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;\u0026#34; }, \u0026#34;masquerade\u0026#34;: \u0026#34;https://apple.com\u0026#34; } ] } 客户端 outbound\n替换对应服务端的信息\nserver：服务器的域名或者 ip server_port：服务器的端口 up_mbps：上传最大带宽 down_mbps：下载最大带宽 password：服务器设置的密码 server_name：服务器域名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 { \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;hysteria2\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;hy2-out\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;server_port\u0026#34;: 34622, \u0026#34;up_mbps\u0026#34;: 30, \u0026#34;down_mbps\u0026#34;: 150, \u0026#34;password\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;insecure\u0026#34;: false, \u0026#34;alpn\u0026#34;: [ \u0026#34;h3\u0026#34; ] } } ] } vless-ws-cdn-tls 作用有三：\n隐藏服务器 IP 提速垃圾线路 拯救被墙的 IP 准备 生成 uuid\n1 sing-box generate uuid 1 2 # 生成内容类似如下 # 2203cb2f-fcae-4dc1-ae5a-679b1e4c54fd 登录 cloudflare，将域名解析到服务器 IP，开启小黄云\n进入 SSL/TLS 设置\n进入概览，将连接类型改为完全或者完全严格（使用 cloudflare 提供的 15 年源服务器证书） 进入源服务器证书，生成一个通配符域名源服务器证书，记得保存下来，后面会用到 服务端 修改如配置所示：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 { \u0026#34;log\u0026#34;: { \u0026#34;level\u0026#34;: \u0026#34;info\u0026#34;, \u0026#34;timestamp\u0026#34;: true }, \u0026#34;inbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-in\u0026#34;, \u0026#34;listen\u0026#34;: \u0026#34;::\u0026#34;, \u0026#34;listen_port\u0026#34;: 443, \u0026#34;users\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;user1\u0026#34;, \u0026#34;uuid\u0026#34;: \u0026#34;请替换为你生成的UUID\u0026#34; } ], \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;你的域名 (例如 vless.example.com)\u0026#34;, \u0026#34;certificate_path\u0026#34;: \u0026#34;/etc/sing-box/cert/server.crt\u0026#34;, \u0026#34;key_path\u0026#34;: \u0026#34;/etc/sing-box/cert/server.key\u0026#34; }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/你的自定义路径 (例如 /chat)\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;你的域名 (例如 vless.example.com)\u0026#34; } } } ], \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;direct\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;direct\u0026#34; } ] } uuid: 必须替换。在终端输入 sing-box generate uuid 可生成一个新的。 server_name: 填写你在 Cloudflare 解析的域名。 path: WebSocket 的路径，必须以 / 开头，可以是任意字符串，客户端需保持一致。 客户端 修改为对应服务端的信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { \u0026#34;outbounds\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;vless\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;vless-ws-tls\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;你的域名 (例如 vless.example.com)\u0026#34;, \u0026#34;server_port\u0026#34;: 443, \u0026#34;uuid\u0026#34;: \u0026#34;请替换为你生成的UUID\u0026#34;, \u0026#34;flow\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;tls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;server_name\u0026#34;: \u0026#34;你的域名 (例如 vless.example.com)\u0026#34;, \u0026#34;insecure\u0026#34;: false, \u0026#34;utls\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;fingerprint\u0026#34;: \u0026#34;chrome\u0026#34; } }, \u0026#34;transport\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;ws\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/你的自定义路径 (例如 /chat)\u0026#34;, \u0026#34;headers\u0026#34;: { \u0026#34;Host\u0026#34;: \u0026#34;你的域名 (例如 vless.example.com)\u0026#34; } } } ] } ","date":"2025-04-17T23:37:32+08:00","permalink":"/p/250417233732/","title":"sing-box，功能强大且灵活的代理平台"},{"content":"简介 Blinko 是一个创新的开源项目，专为想要快速捕捉和组织转瞬即逝的想法的个人而设计。Blinko 允许用户在想法出现的那一刻无缝记下想法，确保不会丢失任何创意火花。\n源码：https://github.com/blinko-space/blinko\n预览 特性 🤖AI 增强的笔记检索： 借助 Blinko 先进的 AI 驱动的 RAG（检索增强生成）技术，您可以使用自然语言查询快速搜索和访问您的笔记，轻松找到所需内容。 🔒 数据所有权： 您的隐私至关重要。您的所有笔记和数据都安全地存储在您自托管的环境中，确保您对自己的信息拥有完全的控制权。 🚀 高效快速： 即时捕捉灵感，并将其存储为纯文本以便于访问，同时提供完整的 Markdown 支持，实现快速格式化和无缝共享。 💡 轻量级架构，强大的功能： Blinko 基于 Next.js 构建，提供了一个简洁、轻量级的架构，在不牺牲速度或效率的情况下，提供强大的性能。 🔓 开放协作： 作为一个开源项目，Blinko 欢迎社区的贡献。所有代码都是透明的，并在 GitHub 上可用，从而培养了协作和持续改进的精神。 部署 claw ClawCloud Run 是一个集成在线开发、测试和生产环境的云开发平台。只需单击几下，即可设置开发环境和数据库依赖项，从而显著降低复杂性。\n带 AFF 注册链接（你我都有利）：点此跳转 无 AFF 注册链接：点此跳转 目前注册可获赠5$，注册方式只支持 GitHub、Google\n获取 5$条件：\n首次注册赠送5$：有效期一个月 每个月赠送5$：注册账号后一个月内绑定 GitHub 账户，同时要求绑定的 GitHub 账户注册时间超过 180 天 建议直接使用 GitHub 注册，免去绑定的步骤，当然也可以用其他邮箱注册再绑定 github\n进入 claw 控制台，点击 App Launchpad，点击 Create App\n容器信息如下：\nApplication Nmae：\n1 blinko-website Image Name:\n1 blinkospace/blinko:latest 以下参数大小最大化利用，作为参考，根据自己情况调整\nUsage：\nFixed，0.5C 1G Network：\n1111，启用网络访问，设置自定义域名 Environment Variables：\n1 2 3 4 5 NODE_ENV=production NEXTAUTH_URL=http://localhost:1111 NEXT_PUBLIC_BASE_URL=http://localhost:1111 NEXTAUTH_SECRET=my_ultra_secure_nextauth_secret DATABASE_URL=postgresql://postgres:mysecretpassword@blinko-postgres:5432/postgres 替换 NEXTAUTH_SECRET，DATABASE_URL的值\nLocal Storage：\nCapacity：6 Mount Path： 1 /app/.blinko 总费用：\n31 天：0.16$/day*31day=4.96$ 确认无误，点击 Deploy Application部署即可\nserv00 Serv00 是一个提供免费虚拟主机的平台，支持的服务众多，可选择 php 版本，有多款数据库，MySQL，postgresql，mongdodb，支持 ssh 连接，没有广告，3G 空间。\n官网：https://www.serv00.com/\n","date":"2025-04-16T09:28:05+08:00","permalink":"/p/250416092805/","title":"blinko，快速捕捉和组织转瞬即逝的想法"},{"content":"资源 文字教程：https://blog.seektao.cc/p/250415140145\n简介 定义：\n图床是一种在线存储图片的服务，它允许用户将图片上传到服务器，并生成一个可公开访问的 URL（链接），用于在网站、论坛、博客、社交媒体等地方嵌入或分享图片。 本质上，图床就是一个专门用于存储和分发图片的网络空间。 核心功能：\n图片存储： 提供可靠的存储空间，用于存放用户上传的图片文件。 URL 生成： 为每张上传的图片生成一个唯一的、可直接访问的 URL。 图片分发： 通过 CDN (内容分发网络) 等技术，加速图片在全球范围内的访问速度。 图片管理 (可选)： 一些图床提供图片管理功能，例如： 分类、标签 图片编辑 (裁剪、旋转) 删除、替换 统计访问量 作用：\n解决图片存储问题： 避免直接将图片存储在自己的服务器上，减轻服务器压力，节省带宽。 提高网站加载速度： 通过 CDN 加速图片访问，提升用户体验。 方便图片分享： 生成易于分享的图片链接，方便在各种平台上发布图片。 内容隔离： 将图片内容与网站的其他内容分离，便于维护和管理。 类型：\n免费图床： 提供免费的图片存储和分发服务，但通常有流量限制、广告或稳定性风险。 收费图床： 提供更稳定、更快速、更可靠的图片存储和分发服务，通常按流量或存储空间收费。 自建图床： 使用开源图床程序，在自己的服务器上搭建图床。 使用场景：\n博客/网站： 存储网站上的图片，提高加载速度。 论坛/社区： 方便用户上传和分享图片。 社交媒体： 分享图片到社交平台。 Markdown 编辑器： 在 Markdown 文档中插入图片。 开发文档： 在 API 文档或技术文档中插入图片。 免费图床 SM.MS SM.MS 是一个免费的、简洁的在线图床服务。它允许用户上传图片并生成可用于嵌入到网站、论坛、博客等地方的链接。 SM.MS 因其简单易用、国内访问速度相对较快而受到部分用户的欢迎。\n官网：https://smms.app/\n特点：\n免费使用： 提供免费的图片存储和分发服务。 简单易用： 界面简洁，操作简单，无需注册即可上传图片。 多种链接格式： 上传后生成多种链接格式，包括： HTML 链接 Markdown 链接 BBCode 链接 直链 国内访问速度较快： 相对其他国外图床，在国内的访问速度可能更快一些。 支持 HTTPS： 支持 HTTPS 协议，保证数据传输的安全性。 总结 图床最重要的是稳定，如果图床服务关闭，意味着之前所有使用的地方都将失效，这是巨大的风险，所以一定要选择长期提供的服务商！\n因为我的日常使用频率不高，我都是写博文的时候需要用到，我的选择是 smms\n","date":"2025-04-15T14:01:45+08:00","permalink":"/p/250415140145/","title":"图床概念详解：功能、类型、应用场景及免费图床推荐"},{"content":"简介 Serv00 是一个提供免费虚拟主机的平台，支持的服务众多，可选择 php 版本，有多款数据库，MySQL，postgresql，mongdodb，支持 ssh 连接，没有广告，3G 空间。\n官网：https://www.serv00.com/\nHalo 是一款开源的建站工具，专注于博客，同时也适合构建个人网站。它以其简洁、易用和强大的自定义能力而著称。\n官网：https://www.halo.run/\n部署 准备 登录 serv00 控制台，开启可执行权限和开放一个端口\n新建一个 MySQL 数据库，记录数据库信息\n数据库字符集选择 Collation: utf8mb4_bin\nhalo 环境\nJava 环境，目前 Halo 最低需要 JRE 17 的环境。 数据库（任一） MySQL 5.7+ MariaDB PostgreSQL serv00 官方已经支持 jdk17\nssh 连接 serv00\n1 2 export JAVA_VERSION=\u0026#34;17\u0026#34; java --version 写入到环境变量\n1 2 echo \u0026#39;export JAVA_VERSION=\u0026#34;17\u0026#34;\u0026#39; \u0026gt;\u0026gt; $HOME/.profile source $HOME/.profile 安装 halo 创建存放运行包的目录，这里以 ~/app 为例\n1 mkdir ~/app \u0026amp;\u0026amp; cd ~/app 下载运行包\n1 wget https://dl.halo.run/release/halo-2.20.12.jar -O halo.jar 创建 工作目录\n1 mkdir ~/.halo2 \u0026amp;\u0026amp; cd ~/.halo2 创建 Halo 配置文件\n1 vim application.yaml 将以下内容复制到 application.yaml 中，根据下面的配置说明进行配置。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 server: # 运行端口 port: 8090 spring: # 数据库配置，支持 MySQL、MariaDB、PostgreSQL、H2 Database，具体配置方式可以参考下面的数据库配置 r2dbc: url: r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL\u0026amp;DB_CLOSE_ON_EXIT=FALSE username: admin password: 123456 sql: init: mode: always # 需要配合 r2dbc 的配置进行改动 platform: h2 halo: # 工作目录位置 work-dir: ${user.home}/.halo2 # 外部访问地址 external-url: http://localhost:8090 # 附件映射配置，通常用于迁移场景 attachment: resource-mappings: - pathPattern: /upload/** locations: - migrate-from-1.x 数据库配置说明：\n参数名 描述 spring.r2dbc.url 数据库连接地址，详细可查阅下方的 配置对应关系 spring.r2dbc.username 数据库用户名 spring.r2dbc.password 数据库密码 spring.sql.init.platform 数据库平台名称，支持 postgresql、mysql、mariadb、h2 配置对应关系：\n链接方式 链接地址格式 spring.sql.init.platform PostgreSQL r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE} postgresql MySQL r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE} mysql MariaDB r2dbc:pool:mariadb://{HOST}:{PORT}/{DATABASE} mariadb H2 Database r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL\u0026amp;DB_CLOSE_ON_EXIT=FALSE h2 测试运行 Halo\n1 cd ~/app \u0026amp;\u0026amp; java -server -Xms256m -Xmx400m -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/ 初始化 halo 设置站点名，用户名，密码，邮箱\n后台运行 由于 serv00 不能使用 system，防止 serv00 杀掉进程，我们使用定时任务，定时重启\n登录 serv00 控制台，新增定时任务\nLabel Value Extra Specify time Specify manually Form type Advanced Minute Every 10 Hour Each time * Day of month Each time * Month Each time * Day of week Each time * Command 命令填写如下的内容\n1 pkill -f halo.jar; nohup java -server -Xms256m -Xmx400m -Dfile.encoding=UTF-8 -jar $HOME/app/halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/ \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 访问 使用 serv00 分配的域名加上端口即可访问\n1 http://\u0026lt;username\u0026gt;.serv00.net:\u0026lt;port\u0026gt; 如果不想使用端口，并使用 https\n推荐这个教程：使用 Vercel 部署反向代理的部署指南\n在线预览 https://omni.seektao.cc/\nPS：这是一个玩具，用不了多久就会被杀进程，只适合学习\n","date":"2025-04-15T09:15:44+08:00","permalink":"/p/250415091544/","title":"serv00部署halo，你的现代化博客系统"},{"content":"简介 Bitwarden 客户端 API 的替代服务器实现，用 Rust 编写，与官方 Bitwarden 客户端兼容，非常适合自托管部署，其中运行官方资源密集型服务可能不理想。\n源码：https://github.com/dani-garcia/vaultwarden\n部署 自签证书（可选） 使用 OpenSSL 生成自签名证书，现代浏览器不再识别只有 CN，需要包含 SAN。\n1 2 3 4 5 6 7 8 9 10 11 12 # 1. 生成私钥 openssl genrsa -out vaultwarden.key 2048 # 2. 生成带 SAN 的自签名证书 openssl req -x509 -new -nodes -key vaultwarden.key \\ -sha256 -days 3650 \\ -out vaultwarden.crt \\ -subj \u0026#34;/CN=192.168.5.25\u0026#34; \\ -addext \u0026#34;subjectAltName = IP:192.168.5.25,DNS:localhost,DNS:127.0.0.1\u0026#34; # 3. 合并为 PEM 格式（某些服务需要） cat vaultwarden.key vaultwarden.crt \u0026gt; vaultwarden.pem 下载 vaultwarden.crt 文件，安装到系统。\ndocker compose 1 2 3 4 5 6 7 8 9 10 11 12 13 version: \u0026#39;3.9\u0026#39; services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest environment: - SIGNUPS_ALLOWED=false # 禁用新用户注册 - SIGNUPS_ALLOWED=false # 禁用组织邀请 volumes: - ./vaultwarden_data/:/data/ ports: - 3035:80 restart: unless-stopped 无环境变量\n1 2 3 4 5 6 7 8 9 10 version: \u0026#39;3.9\u0026#39; services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest volumes: - ./vaultwarden_data/:/data/ ports: - 80:80 restart: unless-stopped 内置 https\n1 2 3 4 5 6 7 8 9 10 11 12 version: \u0026#39;3.9\u0026#39; services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest environment: - ROCKET_TLS={certs=\u0026#34;/data/certs/vaultwarden.crt\u0026#34;,key=\u0026#34;/data/certs/vaultwarden.key\u0026#34;} volumes: - /tmp/zfsv3/sata11/15285163454/data/Docker/vaultwarden/vaultwarden_data/:/data/ ports: - 8446:80 restart: unless-stopped 启用管理界面 环境变量\n1 ADMIN_TOKEN=some_random_token_as_per_above_explanation # 启用管理页面 使用如下命令生成 argon2 加密后的 token\n1 docker exec -it \u0026lt;container_id\u0026gt; /vaultwarden hash 将 $ 替换成 $$ 添加到 ADMIN_TOKEN 后面，注意，不要加''\nsmtp 邮件发送 配置 环境变量\n1 2 3 4 5 6 SMTP_HOST= # smtp host SMTP_FROM= # smtp 发件人 SMTP_PORT= # smtp 端口 SMTP_SECURITY= # smtp tls加密方式，可选有force_tls，starttls，off SMTP_USERNAME= # smtp 用户名 SMTP_PASSWORD= # smtp 用户密码 smtp 服务器 Resnd：每个月免费 3000 封，注册添加域名后可能被封，需要发邮件解封\n端口对应的 TLS 使用端口 465 的邮件服务器 1 2 SMTP_PORT=465 SMTP_SECURITY=force_tls 使用端口 587（有时候是 25）的邮件服务器 1 2 SMTP_PORT=587 SMTP_SECURITY=starttls 根本不支持加密的邮件服务器 1 2 SMTP_PORT=25 SMTP_SECURITY=off 示例 resend\n1 2 3 4 5 6 SMTP_HOST=smtp.resend.com SMTP_FROM=no-reply@example.com SMTP_PORT=465 SMTP_SECURITY=force_tls SMTP_USERNAME=resend SMTP_PASSWORD=re_Pxxxxxxxxxx HTTPS 不使用 https 访问，已经无法使用。所以必须使用 https 访问\nNginx 请将 yourdomain替换为自己的域名\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 server { if ($host = yourdomain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name yourdomain.com; return 301 https://yourdomain.com$request_uri; } server { listen 443 ssl; http2 on; server_name yourdomain.com; # SSL 证书配置 ssl_certificate /etc/nginx/ssl/yourdomain.com/cert.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com/key.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:3035/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } # 日志配置 access_log /var/log/nginx/yourdomain.com.access.log; error_log /var/log/nginx/yourdomain.com.error.log; } 自带 添加一条环境变量\n1 ROCKET_TLS={certs=\u0026#34;/data/ssl/cert.pem\u0026#34;,key=\u0026#34;/data/ssl/privkey.pem\u0026#34;} 将 cert.pem 和 privkey.pem 替换为自己的域名证书文件\n","date":"2025-04-13T19:07:38+08:00","permalink":"/p/250413190738/","title":"vaultwarden，用 Rust 编写的非官方 Bitwarden 兼容服务器"},{"content":"简介 ClawCloud Run 是一个集成在线开发、测试和生产环境的云开发平台。只需单击几下，即可设置开发环境和数据库依赖项，从而显著降低复杂性。\n带 AFF 注册链接（你我都有利）：点此跳转 无 AFF 注册链接：点此跳转 目前注册可获赠5$，注册方式只支持 GitHub、Google\n获取 5$条件：\n首次注册赠送5$：有效期一个月 每个月赠送5$：注册账号后一个月内绑定 GitHub 账户，同时要求绑定的 GitHub 账户注册时间超过 180 天 建议直接使用 GitHub 注册，免去绑定的步骤，当然也可以用其他邮箱注册再绑定 github\n计划 Free Plan 免费计划 For every newly registered user, ClawCloud Run will offer a benefit of $5. The validity period of this complimentary amount is one month. If you bind your GitHub account within one month after registration, you will receive an additional $5 every month thereafter, and the validity period of this subsequent gift is also one month. 对于每一个新注册的用户，ClawCloud Run 将提供 5 美元的优惠。此赠品的有效期为一个月。如果您在注册后一个月内绑定 GitHub 账户，则此后每个月都会额外获得 5 美元，而这份后续礼物的有效期也是一个月。\nTo prevent resource wastage, ClawCloud Run reserves the right to manage resource allocation for users of the free plan. 为防止资源浪费，ClawCloud Run 保留为免费计划的用户管理资源分配的权利。\n预览 继续附上注册链接\n带 AFF 注册链接（你我都有利）：点此跳转 无 AFF 注册链接：点此跳转 服务 App Launchpad：创建容器，可以设置比较小的资源占用，所需费用也比较小，最低0.1C64M 0.01$/day，最高8C16G 2.14$/day Database：支持PostgreSQL、MongoDB、MySQL、Redis、Kafka、Milvus Devbox：开发容器，可以选择特定语言的运行环境，框架，系统。最低支持1C2G，最高支持16C32G Object Storage：对象存储 App Store：应用商店，提供常见应用启动模板，如 alist，fastgpt，chat-next-web，dify 等等 Termiinal：终端模拟器 alist AList 是一款易于安装且支持多平台的文件管理工具，可以挂载多种存储并提供多种实用功能。它支持 WebDAV、黑暗模式、文件预览、打包下载等，还提供保险箱加密和更多高级功能。\n部署 alist 的成本比较低，一个月只需0.04$/day*30day=1.2$，完全可以使用赠送的 5$，alist 服务不会关机。\n点击 App Store，选择 Alist\n选择用户名和填入密码\n点击 Deploy App，确认部署\n返回，点击My Apps可以看到已经部署的应用\n点击进去，可以看到应用已经启动\n点击 Detail查看详细信息，下滑找到Network，即可看到公共访问的 ip 地址\n点击Manage Network下滑找到Network模块可以修改端口，设置自定义域名\nnew-api AI 模型接口管理与分发系统，支持将多种大模型转为统一格式调用，支持 OpenAI、Claude 等格式，可供个人或者企业内部管理与分发渠道使用，基于 One API 二次开发。\n点击 App Launchpad，点击 Create App\n容器信息如下：\nApplication Nmae：new-api Image Name: calciumion/new-api:latest Usage：Fixed，0.5C256M Network：3000，启用网络访问，设置自定义域名\nEnvironment Variables：\n1 TZ=Asia/Shanghai Local Storage：\nCapacity：5 Mount Path：/data 总费用：0.11$/day*31day=3.41$\n参数大小作为参考，根据自己情况调整\n确认无误，点击 Deploy Application\n截图示例：\nqinglong 支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台\n特性：\n支持多种脚本语言（python3、javaScript、shell、typescript） 支持在线管理脚本、环境变量、配置文件 支持在线查看任务日志 支持秒级任务设置 支持系统级通知 支持暗黑模式 支持手机端操作 创建服务\n填入如下信息，最大化利用资源\n开启外部网络访问，端口为 5700，后面的是服务域名，可以公开访问\n设置环境变量\n1 2 QlBaseUrl=/ QlPort=5700 填入如下信息\n挂载外部存储，不挂载重启容器会丢失数据\n确认无误，点击Deploy Application部署，接下来访问域名设置用户密码即可\n支持青龙面板的服务\nBiliBiliToolPro Open WebUI Open WebUI 是一个可扩展的、功能丰富的、用户友好的自托管 AI 平台，旨在完全离线操作。它支持各种 LLM 跑步者，比如奥拉马和 OpenAI 兼容的 API，内置 RAG 推理机，使它成为一个强大的 AI 部署解决方案。\n进入 claw 控制台\n点击 App Launchpad，点击 Create App\n容器信息如下：\nApplication Nmae：open-webui Image Name: ghcr.io/open-webui/open-webui:main Usage：Fixed，0.5C512M Network：8080，启用网络访问，设置自定义域名\nEnvironment Variables：\n1 OLLAMA_BASE_URL= ollama 请使用自己资源或寻找其他资源\nLocal Storage：\nCapacity：10 Mount Path：/app/backend/data 总费用：0.14$/day*31day=4.34$\n参数大小作为参考，根据自己情况调整\n确认无误，点击 Deploy Application\n图示：\nhalo Halo 是一款开源的建站工具，专注于博客，同时也适合构建个人网站。它以其简洁、易用和强大的自定义能力而著称。\n官网：https://www.halo.run/\n部署\n进入 claw 控制台，点击 App Launchpad，点击 Create App\n容器信息如下：\nApplication Nmae：halo Image Name:\n任选其一\n1 halohub/halo:2.20 1 registry.fit2cloud.com/halo/halo:2.20 以下参数大小最大化利用，作为参考，根据自己情况调整\nUsage：Fixed，0.5C 1G Network：8090，启用网络访问，设置自定义域名\nEnvironment Variables：\n1 JVM_OPTS=-Xmx900m -Xms256m Local Storage：\nCapacity：6 Mount Path： 1 /root/.halo2 总费用：\n31 天：0.16$/day*31day=4.96$ 确认无误，点击 Deploy Application部署即可\nblinko 简介\nBlinko 是一个创新的开源项目，专为想要快速捕捉和组织转瞬即逝的想法的个人而设计。Blinko 允许用户在想法出现的那一刻无缝记下想法，确保不会丢失任何创意火花。\n源码：https://github.com/blinko-space/blinko\n特性\n🤖AI 增强的笔记检索： 借助 Blinko 先进的 AI 驱动的 RAG（检索增强生成）技术，您可以使用自然语言查询快速搜索和访问您的笔记，轻松找到所需内容。 🔒 数据所有权： 您的隐私至关重要。您的所有笔记和数据都安全地存储在您自托管的环境中，确保您对自己的信息拥有完全的控制权。 🚀 高效快速： 即时捕捉灵感，并将其存储为纯文本以便于访问，同时提供完整的 Markdown 支持，实现快速格式化和无缝共享。 💡 轻量级架构，强大的功能： Blinko 基于 Next.js 构建，提供了一个简洁、轻量级的架构，在不牺牲速度或效率的情况下，提供强大的性能。 🔓 开放协作： 作为一个开源项目，Blinko 欢迎社区的贡献。所有代码都是透明的，并在 GitHub 上可用，从而培养了协作和持续改进的精神。 部署\n进入 claw 控制台，点击 App Launchpad，点击 Create App\n容器信息如下：\nApplication Nmae：\n1 blinko-website Image Name:\n1 blinkospace/blinko:latest 以下参数大小最大化利用，作为参考，根据自己情况调整\nUsage：\nFixed，0.5C 1G Network：\n1111，启用网络访问，设置自定义域名 Environment Variables：\n1 2 3 4 5 NODE_ENV=production NEXTAUTH_URL=http://localhost:1111 NEXT_PUBLIC_BASE_URL=http://localhost:1111 NEXTAUTH_SECRET=my_ultra_secure_nextauth_secret DATABASE_URL=postgresql://postgres:mysecretpassword@blinko-postgres:5432/postgres 替换 NEXTAUTH_SECRET，DATABASE_URL的值\nLocal Storage：\nCapacity：6 Mount Path： 1 /app/.blinko 总费用：\n31 天：0.16$/day*31day=4.96$ 确认无误，点击 Deploy Application部署即可\n","date":"2025-04-12T20:02:48+08:00","permalink":"/p/250412200248/","title":"claw免费容器，部署服务教程"},{"content":"简介 一个可高度自定义的 IPTV 接口更新项目 📺，自定义频道菜单，自动获取直播源，测速验效后生成可用的结果，可实现『✨ 秒播级体验 🚀』\n部署 Docker 1 2 3 mkdir -p /opt/container/iptv-api cd /opt/container/iptv-api vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 version: \u0026#39;3.9\u0026#39; services: iptv-api: image: \u0026#39;guovern/iptv-api:latest\u0026#39; container_name: iptv-api restart: unless-stopped ports: - \u0026#39;8000:8000\u0026#39; volumes: - \u0026#39;./iptv-api_data/config:/iptv-api/config\u0026#39; - \u0026#39;./iptv-api_data/output:/iptv-api/output\u0026#39; ","date":"2025-04-12T10:19:23+08:00","permalink":"/p/250412101923/","title":"iptv-api，一个可高度自定义的IPTV接口更新项目"},{"content":"kodbox 像 NAS 的 webos https://kodbox.seektao.cc\n图片 API https://images.linux-do.rr.nu\n贴吧签到 https://oba.pp.ua/\n","date":"2025-04-06T18:32:12+08:00","permalink":"/p/250406183212/","title":"serv00用途收集"},{"content":"简介 本篇将介绍利用 Linux 自带的 tar 命令自动打包并使用 rclone 备份到远程存储，下面是备份的脚本\n脚本 简介 这个脚本将指定的目录备份打包成 tar.gz文件，备份到家目录 下的 backup/application 文件夹下，然后使用 rclone 上传到指定的远程存储\n创建 1 2 3 4 5 mkdir -p $HOME/bin touch $HOME/bin/backup_and_upload.sh \u0026amp;\u0026amp; chmod +x $HOME/bin/backup_and_upload.sh vim $HOME/bin/backup_and_upload.sh 修改 使用前需要修改中文注释提示的部分\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 #!/bin/bash # source_dir=( # 你的备份目录，一行一个，例如 /opt/container/server1 /opt/container/server2 ) date_format=$(TZ=\u0026#34;UTC\u0026#34; date +%Y%m%d) # 备份文件的存放位置（可选） backup_base_dir=\u0026#34;$HOME/backup/application\u0026#34; force_repack=0 # Default: do not force repack # Define backup functions # 函数名为你的rclone配置的远程存储名，仿照下面的添加即可 b2() { remote_dir=\u0026#34;rclone远程存储名:远程备份路径\u0026#34; backup_to_remote \u0026#34;$remote_dir\u0026#34; \u0026#34;$1\u0026#34; } # Generic backup function backup_to_remote() { local remote_dir=\u0026#34;$1\u0026#34; local source_full_path=\u0026#34;$2\u0026#34; local source_name=$(basename \u0026#34;$source_full_path\u0026#34;) # check output directory target_dir=\u0026#34;$backup_base_dir/$source_name\u0026#34; if [ ! -d \u0026#34;$target_dir\u0026#34; ]; then echo \u0026#34;$target_dir directory not exists, creating...\u0026#34; mkdir -p \u0026#34;$target_dir\u0026#34; fi # archive directory target_full_path=\u0026#34;$target_dir/${source_name}_backup_${date_format}.tar.gz\u0026#34; if [ ! -f \u0026#34;$target_full_path\u0026#34; ] || [ \u0026#34;$force_repack\u0026#34; -eq 1 ]; then if [ \u0026#34;$force_repack\u0026#34; -eq 1 ]; then echo \u0026#34;Force repack is enabled. Recreating archive: $target_full_path\u0026#34; else echo \u0026#34;Creating archive: $target_full_path\u0026#34; fi tar -zcf \u0026#34;$target_full_path\u0026#34; \u0026#34;$source_full_path\u0026#34; fi # backup archive file echo \u0026#34;Starting backup to $remote_dir: ${target_full_path}\u0026#34; rclone copy \u0026#34;$target_full_path\u0026#34; \u0026#34;$remote_dir/${source_name}\u0026#34; -P echo \u0026#34;\u0026#34; } # Process each source directory process_directory() { local dir=\u0026#34;$1\u0026#34; local backup_targets=(\u0026#34;${@:2}\u0026#34;) # Get all arguments after the directory if [ -z \u0026#34;$backup_targets\u0026#34; ]; then echo \u0026#34;No backup targets specified for $dir. Skipping.\u0026#34; return fi for target in \u0026#34;${backup_targets[@]}\u0026#34;; do if type \u0026#34;$target\u0026#34; \u0026gt; /dev/null 2\u0026gt;\u0026amp;1; then echo \u0026#34;Backing up $dir to $target\u0026#34; \u0026#34;$target\u0026#34; \u0026#34;$dir\u0026#34; # Call the backup function with the directory else echo \u0026#34;Error: Backup target \u0026#39;$target\u0026#39; not found.\u0026#34; fi done } # Main script logic # Parse command line arguments while getopts \u0026#34;f\u0026#34; opt; do case $opt in f) force_repack=1 ;; \\?) echo \u0026#34;Invalid option: -$OPTARG\u0026#34; \u0026gt;\u0026amp;2 exit 1 ;; :) echo \u0026#34;Option -$OPTARG requires an argument.\u0026#34; \u0026gt;\u0026amp;2 exit 1 ;; esac done shift $((OPTIND -1)) # Shift off the options, leaving only backup targets if [ $# -eq 0 ]; then echo \u0026#34;Usage: $0 [-f] \u0026lt;backup_target\u0026gt; [backup_target2 ...] \u0026#34; echo \u0026#34; -f: Force re-packaging the local archive file.\u0026#34; echo \u0026#34;Available backup targets: b2\u0026#34; exit 1 fi # Loop through each source directory and apply the specified backups for source_dir_item in \u0026#34;${source_dir[@]}\u0026#34;; do process_directory \u0026#34;$source_dir_item\u0026#34; \u0026#34;$@\u0026#34; done echo \u0026#34;Backup process completed.\u0026#34; 添加到环境变量（可选）\n1 2 echo \u0026#39;export PATH=$PATH:$HOME/bin\u0026#39; \u0026gt;\u0026gt; $HOME/.bashrc source $HOME/.bashrc 使用 运行\n1 backup_and_upload.sh rclone配置的远程存储名 参数\n-f：强制重新打包 示例\n备份到 b2\n1 backup_and_upload.sh b2 执行后将会自动打包备份到家目录的 backup/application下，然后上传到 b2\n定时任务 为了实现定期备份，可以添加定时任务\n这个表示每天 23 点 55 分备份上传\n1 echo \u0026#34;55 23 * * * /root/bin/backup_and_upload.sh b2 tebi \u0026gt;\u0026gt; /root/logs/backup_and_upload.log\u0026#34; \u0026gt;\u0026gt; /var/spool/cron/crontabs/root ","date":"2025-04-05T19:42:20+08:00","permalink":"/p/250405194220/","title":"服务器自动化打包应用程序，备份到远程存储"},{"content":"简介 特性 🚀 像 Windows 体验般的私有云盘/企业网盘 🌟 完全支持私有化部署，安全可控的存储 👁️‍🗨️ 在线预览、编辑和播放数百种文件格式，办公娱乐两不误 🚀 多存储融合：支持本地磁盘、FTP、WebDAV、阿里云 OSS、腾讯云 COS、七牛云、MinIO、S3 兼容协议等 🔗 轻松分享，高效协作，细粒度权限控制 💻 全平台客户端覆盖，随时随地访问，轻松同步挂载；支持 Web、H5、iOS、Android、PC、WebDAV 挂载 详细功能 文件操作: 与 Windows 高度一致的操作体验，包括新建、复制、移动、粘贴、上传、下载、删除、解压、打开方式、文件排序、查看等。 文档选择: 框选、拖拽、快捷键，云文档管理如同本地操作般熟悉高效；文件勾选、ctrl 点击、shift 连续选择、快捷键选择 (ctrl/shift+a/up/down/left/right/home/end\u0026hellip;)、首字母快速定位、拼音模糊搜索快速过滤\u0026hellip; 全局拖拽: 拖拽文件和文件夹进行移动和复制；拖拽本地文件/文件夹进行上传；拖拽到桌面自动下载；拖拽到文件夹自动进入，拖拽多个文件管理窗口之间互相操作\u0026hellip; 高效快捷键: ctrl+c 复制，ctrl+x 剪切，ctrl+v 粘贴，ctrl+z 撤销，f2 重命名，ctrl+shift+z 反撤销，文件视图切换\u0026hellip; 右键菜单: 文件夹、文件以及不同类型的文件拥有完全自适应的右键菜单 文件查看模式: 结合 Windows 和 Mac 的优点，支持“图标模式/列表模式/列模式”文件管理，图标模式支持自定义图标大小，列表模式文件夹支持树状目录展开；自动记录每个文件夹的查看模式；采用虚拟列表，快速高效管理大量文件文件夹。 多维度文档管理: 收藏夹；文档标签；文件分类；最近文档；相册；回收站；部门文档公共标签；个人文件私有保险箱\u0026hellip;; 便捷属性面板: 各种文档属性信息、共享状态、图片 exif 信息、音乐和视频等类型的文件信息一目了然；文件夹包含文件文件夹数量、大小统计、设置备注、编辑锁定/置顶；可以讨论文件文件夹； 文件历史版本: 文件在线编辑保存，自动生成历史版本，无需担心内容丢失； 文件去重/秒传: 采用 COW 机制，文件元数据记录双哈希校验，自动全量去重，上传时，已存在的文件自动秒传，节省存储空间，提高上传效率；文件夹移动和复制快速完成； 高级搜索: 支持按类型、文件大小、最后修改时间等维度过滤或搜索，支持中文拼音首字母搜索，支持文档标签、备注搜索；支持批量搜索多个文件名，并按搜索顺序呈现搜索结果 文档动态: 文件文件夹的所有操作变更一目了然，追踪文档的整个生命周期； 在线解压: 支持在线解压 zip、tar、gz、7z、rar 等文件，支持快速创建文件夹的压缩包，支持在线预览压缩包 文件在线预览: 随时随地，通过浏览器即可轻松查看数百种常用格式文档，无需下载到本地或在终端安装软件；图片、音乐、视频等媒体文件；在线预览和编辑 Office 文档；PDF、OFD、XPS 等版本文档；在线预览和编辑 PhotoShop 和 Illustrator；AutoCAD 工程图纸 文本编辑器: 提供强大的在线文本文件编辑功能；支持 120 种代码语言高亮；自适应文本编码，告别文件乱码；多标签支持；支持 js/json/php/css 等语言方法快速查看和文件格式化；html 文件支持实时安全预览；支持分片加载，轻松在线打开大文件；支持 hex 模式，方便查看二进制文件； markdown 编辑: 编辑器提供强大而完整的 markdown 编辑功能，支持实时预览；快捷键支持；支持插入公式、流程图、时序图、uml 图，支持提示引用，支持 html 语法；支持图片相对路径引用；支持直接粘贴从剪贴板复制的图像；链接跳转支持其他 md 文件具有相对路径； 流程图/思维导图: 在线绘制 Visio 流程图和思维导图，并快速与他人分享； 细粒度权限控制: 部门文件、文件夹，每个文件可以为不同的人或群组设置不同的权限，千人千面； 外部链接分享: 一键与客户或外部合作伙伴分享文件（文件夹），支持设置访问密码、有效期和多种权限；接收者可以通过链接轻松预览多种格式的文档；启用编辑后，接收者可以在线编辑、上传和协作处理 Office 文件；文件夹支持文档模式的默认设置，方便发布用户手册、开发文档等； 内部协作: 您可以发起协作并向系统内的成员、部门或任何组合授予不同的权限。 协作增强: 提供部门标签、文档讨论、文件动态、历史版本、编辑锁定等组件，以收集多人的工作成果。 登录控制: 登录设备控制、双重验证、登录 IP 过滤、登录验证码、复杂密码策略、防暴力破解；扫码登录（App 扫码登录 Web 端；扫描已登录的 Web 端登录 App） 权限控制: 角色权限、部门权限、细粒度文档权限、共享控制、内容/授权审批、多级管理员 行为审计: 登录日志、操作日志、共享内容控制、动态安全水印、敏感词过滤、文件保密管理、系统回收站 数据安全: 数据备份、系统恢复、多云融合存储、csrf 保护、集群部署支持 多存储融合: 本地磁盘、ftp、webdav、阿里云 OSS、腾讯云 COS、七牛云、minio、S3 等多种云融合挂载，轻松处理跨云文件管理、备份传输、弹性扩展 插件中心: AD 域/企业微信/钉钉等 30+ 企业级应用插件可自由扩展；文件格式编辑和预览可轻松扩展；开放插件开发文档，企业可根据需要在插件中灵活扩展功能；提供 SDK，将企业的云文件功能无缝嵌入到 ERP、OA、邮箱等 IT 系统中 App: Android、iOS 全端支持；自动相册备份； PC 客户端: Windows、Mac 版本支持；支持文件夹备份到云端；自动挂载到本地磁盘，无感操作，本地体验；支持调用 PC 软件预览和编辑在线文件 官网介绍 颜值担当，WebOS 级别操作体验\nKodBox 沿用了 Windows 用户界面、操作逻辑和用户习惯，支持拖拽、框选和快捷键操作，使得用户可以在熟悉的桌面工作环境中，以舒适直观的方式轻松管理服务器中的文件，最大程度地减少学习成本和进入障碍。\n一切都是那么优美和流畅。提供图标、列表、分栏三种布局方式，缩略图展示，随心切换大小，还有熟悉的右键菜单，PC 上操作的习惯通通可以实现，彻底摆脱传统网盘使用中的不适，\n更有熟悉的桌面可以添加各种喜欢的小应用，是在在线文档管理器，更是随时随地都可以访问的私有的 WebOS。\n随时随地，文档随心查看\n每种文档格式均提供了丰富的插件支持，可根据不同软件的环境要求、显示效果、偏好自由选择打开的方式，或者设置默认打开方式。\nMicrosoft Office系列（Word、Excel、PowerPoint） WPS 格式 OpenDocument 格式 AutoCAD PDF XPS Flash 编程语言，电子书等 无需在计算机上安装应用程序即可查看这些文档。\n提供多元化的打开方式，更多预览程序选择。\n高分辨率和高保真，放大查看也不会丢失细节。\n影音娱乐，趣味盎然\n媒体播放器可以打开和播放所有常见的视频格式：MP4，M4V，F4V，MOV，FLV，WEBM，OGV\n所有常见的音频格式：MP3，AAC，M4A，F4A，OGG，OGA，VORBIS\n支持通过轻应用及插件的方式添加游戏，私有云也可以轻松有趣\n离线下载支持，优质资源想存就存\n图片相册，轻松预览和管理\n可以在线预览所有常见的图像格式，包括 Photoshop 图片：\nJpeg Png Gif WebP Bmp Tiff* Psd,Psb,Eps* Raw (Digital Camera Image) Formats* 图像查看器支持图片的缩放，平移，旋转和翻转。\n提供外链地址，私有云轻松作为图床使用，分享给用户和伙伴。\n强大的在线解压、压缩和预览\n全格式支持的在线解压与查看，无需下载到本地也可以轻松查看\nZIP 7Z Gif RAR TAR GZ* TAR.GZ (TGZ) TAR.BZ2 (TBZ, TBZ2) 无需全部解压，直接点击，即可轻松预览压缩包中的单文件\n多种编码格式支持\n多重压缩嵌套的情况下，同样支持打开和查看\n组织架构集成，多元化的权限策略\n管理员可以对设置多种用户角色身份并对其角色权限进行限制；支持自定义群组和用户目录，以及其空间大小的配置。\n企业可以按照组织架构建立各部门的共享文件夹，并通过群组权限对部门成员实现进行权限分配。群组支持多层级关系中上级对下级文件的查看和管理，群组还设定对外部分享的文件以实现外部协作需求。\n支持共享登录，用户单点集成、用户组织结构集成，用户可以根据需要深度整合企业微信、钉钉等其他平台的用户和组织结构数据，实现组织结构与文档的无缝对接。\n管理员可完全自定义版权信息、公司名称，企业 Logo 等信息。\n强大、简单易用的上传下载\n拖拽文件到浏览器窗口即可轻松上传文档；采用分片上传，断点续传技术。多文件批量上传，文件夹直接上传等，尽在一拖一放之间。\n下载支持断点续传，多线程下载提速。文件夹、多文件自动打包压缩下载。\n支持离线下载，通过远程增加下载任务，使用文档时无需等待。\n主题随心定义，更多的生产力\nKodBox 始终把用户体验放在产品设计首要考虑的因素，倾心构造无障碍的在线私有文档管理体验。\n你的私有云，由你定义。\n主题自由切换，壁纸轻松选择，用更舒服的姿势进入状态。\n多语言支持\n提供超过 20 种语言，国际访问也能轻松应对不同语言环境。哪怕朋友、同事和客户身在国外，也不惧地域和语言限制，轻松查看分享。\n轻量易部署，跨平台支持\n全平台兼容性：Win、Linux、Mac (Apache、Nginx、IIS)。从百元级别的智能路由器和盒子产品，到 NAS 网络存储设备，到服务器面板，服务器，硬件集成，ERP 集成，私有云、公有云、SaaS 服务搭建等各种场景都可自如适用。\n支持跨平台浏览器的无缝访问。仅需一个浏览器即在 web 端完成文档的上传下载、管理查看，不需要安装任何类似 ftp 客户端的软件。\n提供多客户端支持。\n支持企业微信、钉钉等常用企业工具的集成登录和访问。\n丰富多彩生态，轻松开发拓展\n内置轻应用和插件市场，数百种插件和拓展支持，从办公环境到个人娱乐，几乎覆盖日常使用所有需求。用户可以通过链接、Js 代码的方式方便地添加各种轻应用。\n正如在 Windows 中可以原则文档的打开方式一样，KodBox 也提供了多种插件打开方式；用户可以根据偏好通过喜欢的插件来查看文档。管理员可根据需要安装插件，设置用户和群组对插件的使用权限，拥有多元化的管理方式。\n完备开放的 API 接口，可以通过插件的方式方便地对系统进行二次开发、功能拓展，方便地集成到 SaaS 服务、企业邮箱、OA、ERP 等 IT 系统中，与企业自身的 IT 系统进行对接。且二次开发后，产品仍可以无缝升级。\n地址 官网：https://kodcloud.com\n体验地址：https://demo.kodcloud.com/#user/login\n社区版源码：https://github.com/kalcaddle/kodbox\n部署 serv00 准备 登录后台\n选择 WWW websites 创建网站（如果直接使用 serv00 提供的域名可以跳过）\n添加 DNS 解析，将域名指向 serv00 的分配的 ip\n以 dnspod 为例\n创建数据库\n在 serv00 面板，MySQL，添加数据库\n安装 ssh 登录服务器\n进入设置对应的网站目录\n1 cd $HOME/domains/你添加的域名/public_html 从源码安装\n1 2 3 4 # Install from source git clone https://github.com/kalcaddle/kodbox.git chmod -Rf 777 ./kodbox/* mv kodbox/* . 网站设置 访问在 seer00 创建的网站（也就是你的域名），完成网站设置，点击跳过，进入数据库设置\n数据库选择 MySQL，数据库信息填入之前的在 serv00 创建的数据库信息\n内容大致如下，填好后点击确定，进入下一步\n设置 kodbox 的账户和密码，用于后续登录，点击确定完成网站设置\n网站设置完成之后，再次访问即可进入登录界面\n申请 SSL 证书 如果有需要，serv00 提供免费的 ssl 证书\n回到 serv00 面板，选择 WWW websites，点击Manage SSL certficates，跟着图示进行操作\n成功申请之后显示如下\n再次访问域名，在最开始加上 https:// 即可\n举例： 无 ssl：http://kodbox.seektao.cc 有 ssl: https://kodbox.seektao.cc\n特别需要说明的是：serv00 没有地方可以设置 http 重定向到 https，也就是不能强制使用 ssl，所以访问的时候需要手动在域名千添加 https://，不过浏览器都有历史功能，访问后，下次会提示。\n回到 ssh 连接的 serv00\n1 cd $HOME/domains/你的网站/public_html 新建 .htaccess文件，开启重定向 http 到 https\n如果你不懂 vim，请找一个你熟悉的编辑软件上传，这里简要介绍一下\n编辑 .htaccess\n1 vim .htaccess 复制下面的内容，粘贴进去\n1 2 3 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 英文输入法下 :wq 退出保存\n整体界面 在线体验 点击跳转\n账户：kodboxguest\n密码：kodboxguest\n","date":"2025-04-03T13:55:51+08:00","permalink":"/p/250403135551/","title":"kodbox，新一代企业私有云存储，协同办公平台"},{"content":"awesome-php 最有用的开源 PHP 资源。\nhttps://github.com/skykingf/awesome-php\nkodbox kodbox is a file manager for web. It is a newly designed product based on kodexplorer. It is also a web code editor, which allows you to develop websites directly within the web browser.You can run kodbox either online or locally,on Linux, Windows or Mac based platforms\nhttps://github.com/kalcaddle/kodbox\nmatomo Empowering People Ethically 🚀 — Matomo is hiring! Join us → https://matomo.org/jobs Matomo is the leading open-source alternative to Google Analytics, giving you complete control and built-in privacy. Easily collect, visualise, and analyse data from websites \u0026amp; apps. Star us on GitHub ⭐️ – Pull Requests welcome!\nhttps://github.com/matomo-org/matomo\n","date":"2025-04-03T10:05:24+08:00","permalink":"/p/250403100524/","title":"PHP开源项目收集"},{"content":"安装 使用版本管理器器安装：g，Go 的多版本管理工具\n配置 设置代理 加快 go 相关包的下载\n七牛云\n1 2 go env -w GO111MODULE=on # 启用模块 go env -w GOPROXY=https://goproxy.cn,direct # 加快go模块下载速度 GOPATH（可选） 设置 go 家目录：添加 GOPATH 环境变量\nLinux：\n1 2 echo \u0026#39;export GOPATH=~/codespace/goProjects\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 在 GOPATH 目录下，通常有三个子目录：\nsrc: 存放源代码。 pkg: 存放编译后的包。 bin: 存放 go 下载的可执行文件。 1 2 cd ~/codespace/goProjects mkdir -p $GOPATH/src $GOPATH/pkg $GOPATH/bin 为了方便使用 Go 下载的可执行文件，将 $GOPATH/bin 加入到PATH 中（如 ~/.bashrc 或 ~/.zshrc）：\n1 2 3 # 适用于unix系统 bash环境 echo \u0026#39;export PATH=$PATH:$GOPATH/bin\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 文件 Go 语言提供文件处理的标准库提供了：\nos：与操作系统的交互实现 io：读写文件 io 操作 fs：文件系统的抽象 打开 os 库提供了两个函数\nOpen：返回一个文件指针和一个错误 OpenFile：对 Open 的封转，增加了更多粒度的控制 os.Open() 定义\n1 2 3 4 5 6 7 // Open opens the named file for reading. If successful, methods on // the returned file can be used for reading; the associated file // descriptor has mode O_RDONLY. // If there is an error, it will be of type *PathError. func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) } 示例\n1 2 3 4 5 6 7 8 func open() { file, err := os.Open(\u0026#34;README.md\u0026#34;) if err != nil { panic(err) } defer file.Close() fmt.Println(file) } os.OpenFile() 定义\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag // (O_RDONLY etc.). If the file does not exist, and the O_CREATE flag // is passed, it is created with mode perm (before umask). If successful, // methods on the returned File can be used for I/O. // If there is an error, it will be of type *PathError. func OpenFile(name string, flag int, perm FileMode) (*File, error) { testlog.Open(name) f, err := openFileNolog(name, flag, perm) if err != nil { return nil, err } f.appendMode = flag\u0026amp;O_APPEND != 0 return f, nil } flag 表示描述符，可选的有\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 // Flags to OpenFile wrapping those of the underlying system. Not all // flags may be implemented on a given system. const ( // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified. O_RDONLY int = syscall.O_RDONLY // open the file read-only. O_WRONLY int = syscall.O_WRONLY // open the file write-only. O_RDWR int = syscall.O_RDWR // open the file read-write. // The remaining values may be or\u0026#39;ed in to control behavior. O_APPEND int = syscall.O_APPEND // append data to the file when writing. O_CREATE int = syscall.O_CREAT // create a new file if none exists. O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist. O_SYNC int = syscall.O_SYNC // open for synchronous I/O. O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened. ) perm 表示文件的权限，可选有\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const ( ModeDir = fs.ModeDir // d: 目录 ModeAppend = fs.ModeAppend // a: 只能添加 ModeExclusive = fs.ModeExclusive // l: 专用 ModeTemporary = fs.ModeTemporary // T: 临时文件 ModeSymlink = fs.ModeSymlink // L: 符号链接 ModeDevice = fs.ModeDevice // D: 设备文件 ModeNamedPipe = fs.ModeNamedPipe // p: 具名管道 (FIFO) ModeSocket = fs.ModeSocket // S: Unix 域套接字 ModeSetuid = fs.ModeSetuid // u: setuid ModeSetgid = fs.ModeSetgid // g: setgid ModeCharDevice = fs.ModeCharDevice // c: Unix 字符设备, 前提是设置了 ModeDevice ModeSticky = fs.ModeSticky // t: 黏滞位 ModeIrregular = fs.ModeIrregular // ?: 非常规文件 // 类型位的掩码. 对于常规文件而言，什么都不会设置. ModeType = fs.ModeType ModePerm = fs.ModePerm // Unix 权限位, 0o777 ) 示例\n1 2 3 4 5 6 7 8 func openFile() { // 指定只读的方法打开，权限为 0644 file, err := os.OpenFile(\u0026#34;README.md\u0026#34;, os.O_RDONLY, 0644) if err != nil { panic(err) } fmt.Println(file) } 读取 打开文件后，就可以读取文件内容了\n有以下方法可以读取文件\n文件对象.Read() 文件对象.ReadAt() os.ReadFile() io.ReadAll() 文件对象.Read() 定义\n1 2 3 4 5 6 7 8 9 10 // Read reads up to len(b) bytes from the File and stores them in b. // It returns the number of bytes read and any error encountered. // At end of file, Read returns 0, io.EOF. func (f *File) Read(b []byte) (n int, err error) { if err := f.checkValid(\u0026#34;read\u0026#34;); err != nil { return 0, err } n, e := f.read(b) return n, f.wrapErr(\u0026#34;read\u0026#34;, e) } 写入 结构体 定义\n1 2 3 4 5 6 type struct_name struct { member1 datatype; member2 datatype; member3 datatype; ... } 案例：\n1 2 3 4 5 6 type Person struct { name string age int job string salary int } 访问 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package main import (\u0026#34;fmt\u0026#34;) type Person struct { name string age int job string salary int } func main() { var pers1 Person var pers2 Person // Pers1 specification pers1.name = \u0026#34;Hege\u0026#34; pers1.age = 45 pers1.job = \u0026#34;Teacher\u0026#34; pers1.salary = 6000 // Pers2 specification pers2.name = \u0026#34;Cecilie\u0026#34; pers2.age = 24 pers2.job = \u0026#34;Marketing\u0026#34; pers2.salary = 4500 // Access and print Pers1 info fmt.Println(\u0026#34;Name: \u0026#34;, pers1.name) fmt.Println(\u0026#34;Age: \u0026#34;, pers1.age) fmt.Println(\u0026#34;Job: \u0026#34;, pers1.job) fmt.Println(\u0026#34;Salary: \u0026#34;, pers1.salary) // Access and print Pers2 info fmt.Println(\u0026#34;Name: \u0026#34;, pers2.name) fmt.Println(\u0026#34;Age: \u0026#34;, pers2.age) fmt.Println(\u0026#34;Job: \u0026#34;, pers2.job) fmt.Println(\u0026#34;Salary: \u0026#34;, pers2.salary) } ","date":"2025-04-02T09:16:03+08:00","permalink":"/p/250402091603/","title":"Go语言指南"},{"content":"简介 Starship 是一个跨 shell 的极简、速度极快的提示符。 它的目标是为所有 shell 提供一致、美观且可定制的提示符体验。 简单来说，它让你的命令行提示符变得更漂亮、更有用。\n官网：https://starship.rs/zh-CN/\n源码：https://github.com/starship/starship\n主要特点: 跨 Shell 兼容: 支持 Bash, Zsh, Fish, PowerShell, Ion, Elvish, Nushell, Xonsh 等多种 shell。这意味着你可以在不同的 shell 环境中使用相同的提示符配置。 速度快: 用 Rust 编写，性能极佳。即使在大型项目或慢速文件系统中，也能保持快速响应。 高度可定制: 通过简单的配置文件，你可以完全控制提示符的外观和行为。 可以自定义显示哪些信息、使用什么颜色、图标等等。 信息丰富: 可以显示各种有用的信息，例如： 当前目录 Git 分支和状态 当前使用的编程语言版本 (例如 Python, Node.js, Go, Rust 等) 电池状态 操作系统 Docker 状态 虚拟机状态 执行时间 错误码 等等 易于安装和配置: 提供了简单的安装脚本和清晰的文档，方便用户快速上手。 主题支持: 可以轻松切换不同的主题，或者创建自己的主题。 插件支持: 虽然 Starship 本身已经很强大，但它也支持插件，可以进一步扩展其功能。 Unicode 支持: 支持 Unicode 字符，可以显示各种图标和符号。 为什么使用 Starship?\n提升效率: 通过显示有用的信息，可以帮助你更快地了解当前环境的状态，从而提高工作效率。 美化命令行: 让你的命令行界面更加美观，提升使用体验。 个性化定制: 可以根据自己的喜好定制提示符，打造独一无二的命令行体验。 跨平台一致性: 在不同的操作系统和 shell 环境中使用相同的提示符，保持一致性。 安装 1. 安装 starship 二进制文件： 使用 Shell 命令：\n1 2 curl -sS https://starship.rs/install.sh | sh debian 13\n1 apt install starship 2. 将初始化脚本添加到您的 shell 的配置文件中： Bash 在 ~/.bashrc 的最后，添加以下内容：\n1 2 3 # ~/.bashrc eval \u0026#34;$(starship init bash)\u0026#34; ","date":"2025-04-01T17:55:01+08:00","permalink":"/p/250401175501/","title":"starship，跨 shell 的极简、速度极快的提示符"},{"content":" 1 flutter create --org 组织id --proejct-name 项目名 ","date":"2025-04-01T17:07:14+08:00","permalink":"/p/250401170714/","title":"Flutter控制台创建应用"},{"content":"简介 ","date":"2025-04-01T16:37:00+08:00","permalink":"/p/250401163700/","title":"部署的服务汇总"},{"content":"简介 SQL 语句根据功能分为四种：\n数据定义语言 DDL：Data Definition Language 数据操纵语言 DML：Data Maniplation Language 数据控制语言 DCL：Data Control Language 数据查询语言 DQL：Data Query Language DDL 数据定义语言\n作用：用于定义数据库的结构，例如数据库对象（表、索引、视图、存储过程）的创建、修改和删除\n主要语句：\nCREATE：创建数据库对象，例如：CREATE TABLE，CREATE INDEX，CREATE INDEX ALTER：修改数据库对象，例如 ALTER TABLE DROP：删除数据库对象，例如 DROP TABLE，DROP INDEX，DROP VIEW TRUNCATE：清空表中数据，但保留表结构，例如 TRUNCATE TABLE RENAME：重命名数据库对象，例如 REANME TABLE DML DCL DQL 视图 简介 视图是一个或多个表的逻辑显示，它是一种虚拟表，不会存储数据，视图建立在已有表的基础上。通常不做对底层数据的修改\n为什么要使用视图？\n基于视图的特性，可以针对不同的上层需求创建不同的视图，而不需要全部展示数据\n查看 查看当前数据库的所有视图\n1 show full tables where table_type = \u0026#39;VIEW\u0026#39;; 注意 VIEW必须是大写\n1 2 3 4 5 6 select * from information_schema.views where table_schema = database(); 查看所有数据库的视图\n1 2 3 4 select * from information_schema.views; 查看视图结构\n1 desc 视图名称; 查看视图详细定义\n1 show create view 视图名称; 查看视图属性\n1 show table status like 视图名称; 创建 语法\n1 2 create view 视图名称 as 查询语句; 示例：\n1 2 3 4 5 6 7 8 9 10 -- 创建视图 create view employees_view as select * from employees; -- 查询视图 select * from employees_view; 修改 ALTER VIEW\n修尬现有视图的定义，保留权限和依赖\n1 2 alter view 视图名称 as 查询语句; CRETE OR REPLACE VIEW\n视图不存在则创建，不保留权限和依赖\n1 2 create or replace view 视图名称 as 查询语句; 删除 删除视图不会删除数据\n1 drop view 视图名称; 存储过程 简介 存储过程（Stored Procedure）是一组预先编译的 SQL 语句封装，好比编程语言中的函数封转\n查看 查看当前数据库所有存储过程\n1 2 show procedure status where db = database(); 1 2 3 4 5 6 select routine_name from information_schema.routines where routine_type = \u0026#39;PROCEDURE\u0026#39; and routine_schema = database(); 查看所有数据库所有存储过程\n1 show procedure status; 1 select * from information_schema.routines where routine_type = \u0026#39;PROCEDURE\u0026#39;; 注意 PROCEDURE 大写\n查看存储过程定义\n1 show create procedure 存储过程名; 查看指定的存储过程状态\n1 show procedure status like \u0026#39;pattern\u0026#39; 创建 语法\n1 2 3 4 create procedure 存储过程名称(in|out|inout 参数名 参数类型, ...) begin 具体要执行的sql语句 end in：输入参数，如果没有定义参数，默认为 in out：输出参数 inout：既是输入参数，又是输出参数 参数类型可以是 MySQL 数据库中的任意类型。\n由于会存在多条 SQL 语句，所以一般情况下会修改 SQL 结束标识符 ;\n1 2 3 4 5 6 delimiter $ create procedure 存储过程名称(in|out|inout 参数名 参数类型, ...) begin 具体要执行的sql语句 end $ delimiter ; in 模式\n1 2 3 4 5 6 7 8 9 10 11 -- 无参数 -- 创建一个存储过程，查询 employees 表员工数量 delimiter $ create procedure select_employees_procedure() begin select count(*) from employees; end $ delimiter ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -- 输入参数 -- 创建一个存储过程，使用输入参数 in 模式，查询指定员工姓名的信息 delimiter $ create procedure select_employee_salary_specify_name_procedure_in( in p_first_name varchar(50), in p_last_name varchar(50) ) begin select * from employees where first_name = p_first_name and last_name = p_last_name; end $ delimiter ; out 模式\n1 2 3 4 5 6 7 8 9 10 11 -- 输出参数 -- 创建存储过程show_min_salary()，查看 employees 表的最低薪资值。并将最低薪资通过OUT参数 minsalary 输出 delimiter $ create procedure select_employees_min_salary_procedure(out minsalary double) begin select min(salary) into minsalary from employees; end $ delimiter ; 调用 存储调用需要使用 call关键字\n格式\n1 call 存储过程名(参数列表); in 模式\n1 2 -- 调用之前创建的 select_employees_procedure call select_employees_procedure(); 1 2 3 4 -- 调用存储过程 set @first_name = \u0026#39;Adam\u0026#39;; set @last_name = \u0026#39;Fripp\u0026#39;; call select_employee_salary_specify_name_procedure_in(@first_name, @last_name); out 模式\n1 2 3 -- 调用之前创建的 select_employees_min_salary_procedure call select_employees_min_salary_procedure(@min_salary); select @min_salary; inout 模式\n修改 删除 用户权限和管理 1 2 3 4 5 6 7 8 9 10 11 -- 创建新数据库 CREATE DATABASE IF NOT EXISTS `new_database`; -- 创建新用户并赋予密码 CREATE USER \u0026#39;new_user\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;user_password\u0026#39;; -- 授权新用户对新数据库的所有权限 GRANT ALL PRIVILEGES ON `new_database`.* TO \u0026#39;new_user\u0026#39;@\u0026#39;localhost\u0026#39;; -- 刷新权限 FLUSH PRIVILEGES; 更新用户\n1 2 3 4 5 6 RENAME USER \u0026#39;maccms\u0026#39;@\u0026#39;%\u0026#39; TO \u0026#39;maccms\u0026#39;@\u0026#39;maccms10\u0026#39;; FLUSH PRIVILEGES; RENAME USER \u0026#39;maccms\u0026#39;@\u0026#39;maccms10\u0026#39; TO \u0026#39;maccms\u0026#39;@\u0026#39;%\u0026#39;; FLUSH PRIVILEGES; ","date":"2025-04-01T12:09:32+08:00","permalink":"/p/250401120932/","title":"MySQL基础篇"},{"content":"简介 SSH（Secure Shell）是一种广泛使用的网络协议，用于在不安全的网络上安全地访问和管理远程服务器或其他设备。 它通过加密网络连接来保护数据传输，防止窃听、中间人攻击和其他安全威胁。 简而言之，SSH 提供了一种安全的远程登录方式。\n主要功能 远程登录: 允许用户从本地计算机安全地连接到远程服务器，并像直接在服务器上操作一样执行命令。 安全文件传输: 提供 scp (secure copy) 和 sftp (secure FTP) 等工具，用于安全地在本地计算机和远程服务器之间传输文件。 端口转发 (Tunneling): 允许用户将本地端口转发到远程服务器上的端口，或者将远程服务器上的端口转发到本地端口。 这可以用于创建安全的隧道来访问受防火墙保护的应用程序或服务。 X11 转发: 允许用户在远程服务器上运行图形化应用程序，并将它们显示在本地计算机上。 工作原理 SSH 使用客户端-服务器模型。 SSH 客户端运行在用户的本地计算机上，而 SSH 服务器运行在远程服务器上。 连接过程如下：\n连接请求: SSH 客户端发起与 SSH 服务器的连接请求。 密钥交换 (Key Exchange): 客户端和服务器协商一个用于加密连接的密钥。 SSH 协议支持多种密钥交换算法，如 Diffie-Hellman 和椭圆曲线 Diffie-Hellman。 身份验证 (Authentication): 客户端需要验证其身份才能访问服务器。 SSH 支持多种身份验证方法，包括： 密码验证: 客户端提供用户名和密码进行验证。 这是一种简单的验证方法，但安全性较低，容易受到暴力破解攻击。 公钥验证: 客户端使用私钥对连接进行签名，服务器使用相应的公钥验证签名。 这是一种更安全的验证方法，也是推荐的方法。 需要事先将公钥添加到服务器的 authorized_keys 文件中。 键盘交互验证 (Keyboard-Interactive Authentication): 一种基于 Challenge-Response 的验证方式，服务器可能会询问多个问题来验证用户身份。 通常用于支持双因素身份验证 (2FA)。 加密通信: 身份验证成功后，客户端和服务器之间的所有通信都将使用协商好的密钥进行加密。 会话管理: 客户端和服务器建立一个 SSH 会话，用户可以在会话中执行命令、传输文件等。 优势 安全性: SSH 使用强大的加密算法来保护数据传输，防止窃听和中间人攻击。 可靠性: SSH 提供了可靠的连接，即使在不稳定的网络环境下也能正常工作。 灵活性: SSH 提供了多种功能，如端口转发和 X11 转发，可以满足各种不同的需求。 标准化: SSH 是一种标准协议，在各种操作系统和平台上都有广泛的支持。 广泛应用: 被广泛用于服务器管理，代码部署，远程协作等场景。 安全性建议 使用公钥验证而不是密码验证。 密码验证容易受到暴力破解攻击，而公钥验证更安全。 禁用 root 用户直接登录。 这可以防止攻击者通过暴力破解 root 用户的密码来获取服务器的完全控制权。 使用强密码。 如果必须使用密码验证，请使用包含大小写字母、数字和特殊字符的强密码。 定期更新 SSH 软件。 软件更新通常包含安全修复，可以防止已知漏洞被利用。 配置防火墙。 限制对 SSH 端口的访问，只允许来自可信 IP 地址的连接。 使用双因素身份验证 (2FA)。 增加额外的安全层，即使密码泄露，攻击者也无法登录。 监控 SSH 日志。 定期检查 SSH 日志，以便及时发现可疑活动。 常用命令 连接主机\n1 ssh username@host 指定使用具体的 key 连接\n1 ssh username@host -i /path/to/your/key 指定端口\n1 ssh username@host -p 22 转发远程端口到本地\n1 ssh -L 本地端口:目标地址:目标端口 用户名@远程服务器地址 免密登录 要实现 ssh 免密登录，只需要将本地 ssh 生成密码的公钥添加到远程目的机器~/.ssh/authorized_keys 文件下\n生成 SSH 密钥\n1 ssh-keygen -t ed25519 将 生成的 id_ed25519.pub内容添加到 远程机器 SSH 目录下的 authorized_keys文件\n有两种方式：\n手动添加：复制 id_ed25519.pub内容 添加到要登录用户的 ~/.ssh/authorized_keys下 自动添加：使用 ssh-copy-id username@ip命令登录后自动添加 ","date":"2025-03-30T13:07:00+08:00","permalink":"/p/250330130700/","title":"SSH，安全远程连接的强大工具"},{"content":" 1月 January Jan 2月 February Feb 3月 March Mar 4月 Apirl Api 5月 May May 6月 June Jun 7月 July Jul 8月 August Aug 9月 Settember Set 10月 October Oct 11月 November Nov 12月 December Dec 星期日 Sunday Sun 星期一 Monday Mon 星期二 Tuesday Tue 星期三 Wednesday Wed 星期四 Thursday Thu 星期五 Friday Fri 星期六 Saturday Sat ","date":"2025-03-27T23:32:39+08:00","permalink":"/p/250327233239/","title":"英语中的日期"},{"content":"简介 tmux 是一个终端多路复用器，允许用户在单个终端窗口内运行多个终端会话。它类似于 GNU Screen，但功能更为强大和灵活。使用 tmux，可以在同一个窗口中分割多个面板，每个面板都可以运行不同的命令或进程。即使断开连接，tmux 也能保持会话状态，允许用户稍后重新连接到相同的会话，继续之前的工作。\n以下是 tmux 的一些主要功能：\n会话管理 用户可以创建、分离、重新连接和管理多个会话。\n每个会话都可以包含多个窗口和面板，方便在不同的任务之间快速切换。\n窗口与面板 可以在一个 tmux 会话中创建多个窗口，每个窗口都相当于一个独立的终端会话。\n窗口可以进一步分割为面板（垂直或水平），每个面板都独立运行，可以同时显示多个命令的输出。\n持久性 tmux 的最大优点之一是持久性。即使你关闭了终端或网络连接中断，tmux 会继续在后台保持运行，所有的进程都会继续执行。之后可以通过重新连接会话来恢复工作状态。\n快捷键 tmux 通过快捷键来高效操作。默认的控制前缀是 Ctrl + b，之后可以按不同的键来执行各种操作（如创建窗口、切换面板等）。\n安装 debian\n1 2 apt update apt install tmux 快捷键 在 tmux 中操作很多都需要一个前缀名来触发\n默认快捷键是：ctrl+b，后续使用 C-b来表示\n使用 tmux 开头的命令表示在命令行执行\n会话管理 新建会话：\n1 tmux 新建会话并指定名字：\n1 tmux new -s 会话名 分离（离开但不关闭）会话：\n1 C-b d 查看所有的会话：\n1 tmux ls 重新进入会话：\n1 tmux a -t 会话名 重命名会话：\n1 C-b , 关闭会话：\n1 C-b \u0026amp; 关闭指定会话：\n1 tmux kill-session -t 会话名 关闭所有会话：\n1 tmux list-sessions | awk \u0026#39;{print $1}\u0026#39; | tr -d \u0026#39;:\u0026#39; | xargs -I {} tmux kill-session -t {} 关闭所有会话（另一种方法）：\n1 tmux kill-server 窗口管理 垂直分割窗口：\n1 C-b % 水平分割窗口：\n1 C-b \u0026#34; 在窗口中移动光标：\n1 C-b 方向键 关闭窗口：\n1 C-b x 输入 y 确定关闭。关闭最后一个窗口将会关闭会话。\n","date":"2025-03-27T11:01:45+08:00","permalink":"/p/250327110145/","title":"tmux，终端复用神器"},{"content":"简介 本文将以图文的方式，展示如何在虚拟机上安装 NixOS。\n大致步骤\n下载镜像 选择地区，世间 格式化磁盘 挂在磁盘 可供参考的文档\nNixOS 中文 准备 点击下载镜像：latest-nixos-minimal-x86_64-linux.iso\n进入安装界面\n选择第一个，进入命令行\n连接网络 如果你是实体机，可以插上网络直连网络，或者通过WiFi连接\nWiFi连接跟着以下步骤\n1 2 3 4 5 # 切换到root用户 sudo su - # 启动 wpa_supplicant # wpa_supplicant 是nixos的wifi管理服务，可以通过 wpa_cli 配置网络 systemctl start wpa_supplicant 使用 wpa_cli配置网络\n。。。\n","date":"2025-03-26T20:20:40+08:00","permalink":"/p/250326202040/","title":"nixos命令行安装（待续）"},{"content":"简介 国内访问 GitHub 还是时不时的抽风，有些时候配置代理需要额外且花费大量的代价，今天这个项目将使用修改 hosts 的方式加速访问 GitHub 的速度\n下面的地址无需访问 GitHub 即可获取到最新的 hosts 内容：\n文件：https://raw.hellogithub.com/hosts JSON：https://raw.hellogithub.com/hosts.json hosts 文件在每个系统的位置不一，详情如下：\nWindows 系统：C:\\Windows\\System32\\drivers\\etc\\hosts Linux 系统：/etc/hosts Mac（苹果电脑）系统：/etc/hosts Android（安卓）系统：/system/etc/hosts iPhone（iOS）系统：/etc/hosts 手动复制 点击展开 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 # GitHub520 Host Start 140.82.112.26 alive.github.com 140.82.112.5 api.github.com 185.199.109.153 assets-cdn.github.com 185.199.111.133 avatars.githubusercontent.com 185.199.111.133 avatars0.githubusercontent.com 185.199.111.133 avatars1.githubusercontent.com 185.199.111.133 avatars2.githubusercontent.com 185.199.111.133 avatars3.githubusercontent.com 185.199.111.133 avatars4.githubusercontent.com 185.199.111.133 avatars5.githubusercontent.com 185.199.111.133 camo.githubusercontent.com 140.82.113.21 central.github.com 185.199.111.133 cloud.githubusercontent.com 140.82.112.10 codeload.github.com 140.82.113.22 collector.github.com 127.0.0.100 desktop.githubusercontent.com 185.199.111.133 favicons.githubusercontent.com 140.82.112.4 gist.github.com 16.15.176.0 github-cloud.s3.amazonaws.com 16.182.106.249 github-com.s3.amazonaws.com 52.216.62.241 github-production-release-asset-2e65be.s3.amazonaws.com 52.216.48.33 github-production-repository-file-5c1aeb.s3.amazonaws.com 3.5.0.201 github-production-user-asset-6210df.s3.amazonaws.com 192.0.66.2 github.blog 140.82.114.3 github.com 140.82.114.17 github.community 185.199.108.154 github.githubassets.com 151.101.193.194 github.global.ssl.fastly.net 185.199.109.153 github.io 185.199.111.133 github.map.fastly.net 185.199.109.153 githubstatus.com 140.82.113.25 live.github.com 185.199.111.133 media.githubusercontent.com 185.199.111.133 objects.githubusercontent.com 13.107.42.16 pipelines.actions.githubusercontent.com 185.199.111.133 raw.githubusercontent.com 185.199.111.133 user-images.githubusercontent.com 140.82.114.21 education.github.com 185.199.111.133 private-user-images.githubusercontent.com # Update time: 2025-03-23T14:07:29+08:00 # Update url: https://raw.hellogithub.com/hosts # Star me: https://github.com/521xueweihan/GitHub520 # GitHub520 Host End 激活生效 大部分情况下是直接生效，如未生效可尝试下面的办法，刷新 DNS：\nWindows：在 CMD 窗口输入：ipconfig /flushdns Linux 命令：sudo nscd restart，如报错则须安装：sudo apt install nscd 或 sudo /etc/init.d/nscd restart Mac 命令：sudo killall -HUP mDNSResponder 自动更新 推荐 SwitchHosts 工具管理 hosts\n以 SwitchHosts 为例，看一下怎么使用的，配置参考下面：\nHosts 类型: Remote Hosts 标题: 随意 URL: https://raw.hellogithub.com/hosts 自动刷新: 最好选 1 小时 Windows Linux 1 sudo sh -c \u0026#39;sed -i \u0026#34;/# GitHub520 Host Start/Q\u0026#34; /etc/hosts \u0026amp;\u0026amp; curl https://raw.hellogithub.com/hosts \u0026gt;\u0026gt; /etc/hosts\u0026#39; Docker 1 cp /etc/hosts ~/hosts.new \u0026amp;\u0026amp; sed -i \u0026#34;/# GitHub520 Host Start/Q\u0026#34; ~/hosts.new \u0026amp;\u0026amp; curl https://raw.hellogithub.com/hosts \u0026gt;\u0026gt; ~/hosts.new \u0026amp;\u0026amp; cp -f ~/hosts.new /etc/hosts AdGuard 在 过滤器\u0026gt;DNS 封锁清单\u0026gt;添加阻止列表\u0026gt;添加一个自定义列表，配置如下：\n名称：随意 URL：https://raw.hellogithub.com/hosts（和上面 SwitchHosts 使用的一样） 更新间隔在 设置 \u0026gt; 常规设置 \u0026gt; 过滤器更新间隔（设置一小时一次即可），记得勾选上 使用过滤器和 Hosts 文件以拦截指定域名\n","date":"2025-03-23T15:49:52+08:00","permalink":"/p/250323154952/","title":"GitHub520，加速访问GitHub的神器"},{"content":"简介 lazy.nvim is a modern plugin manager for Neovim.\n官网：https://lazy.folke.io/\n准备 Neovim \u0026gt;= 0.8.0 (needs to be built with LuaJIT) Git \u0026gt;= 2.19.0 (for partial clones support) a Nerd Font (optional) luarocks to install rockspecs. You can remove rockspec from opts.pkg.sources to disable this feature. 安装 推荐使用结构化的文件结构\n1 2 mkdir -p ~/.config/nvim vim ~/.config/nvim/init.lua 1 require(\u0026#34;config.lazy\u0026#34;) 1 2 mkdir -p ~/.config/nvim/lua/config vim ~/.config/nvim/lua/config/lazy.lua 1 mkdir -p ~/.config/nvim/lua/plugins 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 -- Bootstrap lazy.nvim local lazypath = vim.fn.stdpath(\u0026#34;data\u0026#34;) .. \u0026#34;/lazy/lazy.nvim\u0026#34; if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = \u0026#34;https://github.com/folke/lazy.nvim.git\u0026#34; local out = vim.fn.system({ \u0026#34;git\u0026#34;, \u0026#34;clone\u0026#34;, \u0026#34;--filter=blob:none\u0026#34;, \u0026#34;--branch=stable\u0026#34;, lazyrepo, lazypath }) if vim.v.shell_error ~= 0 then vim.api.nvim_echo({ { \u0026#34;Failed to clone lazy.nvim:\\n\u0026#34;, \u0026#34;ErrorMsg\u0026#34; }, { out, \u0026#34;WarningMsg\u0026#34; }, { \u0026#34;\\nPress any key to exit...\u0026#34; }, }, true, {}) vim.fn.getchar() os.exit(1) end end vim.opt.rtp:prepend(lazypath) -- Make sure to setup `mapleader` and `maplocalleader` before -- loading lazy.nvim so that mappings are correct. -- This is also a good place to setup other settings (vim.opt) vim.g.mapleader = \u0026#34; \u0026#34; vim.g.maplocalleader = \u0026#34;\\\\\u0026#34; -- Setup lazy.nvim require(\u0026#34;lazy\u0026#34;).setup({ spec = { -- import your plugins { import = \u0026#34;plugins\u0026#34; }, }, -- Configure any other settings here. See the documentation for more details. -- colorscheme that will be used when installing plugins. install = { colorscheme = { \u0026#34;habamax\u0026#34; } }, -- automatically check for plugin updates checker = { enabled = true }, }) You can then create your plugin specs in ~/.config/nvim/lua/plugins/. Each file should return a table with the plugins you want to install.\nFor more info see Structuring Your Plugins\n~/.config/nvim ├── lua │ ├── config │ │ └── lazy.lua │ └── plugins │ ├── spec1.lua │ ├── ** │ └── spec2.lua └── init.lua\n","date":"2025-03-23T15:24:52+08:00","permalink":"/p/250323152452/","title":"lazy.nvim管理你的neovim配置"},{"content":"Hostwinds Hostwinds 在==西雅图==、==达拉斯==和==阿姆斯特丹==三个数据中心，提供==100MB==、==1GB==、==10GB==大小的 测速文件 下载。如果你需要测试连接这些国外地区的宽带速度，可以尝试在浏览器、服务器等需要测试的地方，直接下载如下链接的文件。\n西雅图测速文件 https://sea-repo.hostwinds.net/tests/100mb.zip https://sea-repo.hostwinds.net/tests/1gb.zip https://sea-repo.hostwinds.net/tests/10gb.zip 达拉斯测速文件 https://sea-repo.hostwinds.net/tests/100mb.zip https://sea-repo.hostwinds.net/tests/1gb.zip https://sea-repo.hostwinds.net/tests/10gb.zip 阿姆斯特丹测速文件 https://ams-repo.hostwinds.net/tests/100mb.zip https://ams-repo.hostwinds.net/tests/1gb.zip https://ams-repo.hostwinds.net/tests/10gb.zip ","date":"2025-03-22T18:52:02+08:00","permalink":"/p/250322185202/","title":"VPS下载速度测试，测速文件"},{"content":"表基础知识 ","date":"2025-03-21T23:26:07+08:00","permalink":"/p/pg-chapter05/","title":"PostgreSQL教程第5章：数据定义"},{"content":"DNS 列表-国内 阿里 阿里DNS已经限速，不建议使用\n1 2 3 4 5 6 IPv4: 223.5.5.5 IPv4: 223.6.6.6 IPv6: 2400:3200::1 IPv6: 2400:3200:baba::1 DoH: https://dns.alidns.com/dns-query DoT: dns.alidns.com 114dns 1 2 IPv4: 114.114.114.114 IPv4: 114.114.115.115 Dnspod 1 2 3 4 5 IPv4: 119.29.29.29 IPv6: 2402:4e00:: IPv6: 2402:4e00:1:: DoH: https://doh.pub/dns-query DoT: dot.pub 电信 重庆 1 IPv4: 61.128.128.68 DNS 列表-国外 Google 1 2 3 4 IPv4: 8.8.8.8 IPv4: 8.8.4.4 DoH: https://dns.google/dns-query DoT: dns.google cloudflare 1 2 3 4 5 6 7 IPv4: 1.1.1.1 IPv4: 1.0.0.1 IPv6: 2606:4700:4700::1111 IPv6: 2606:4700:4700::1001 DoH：https://1.1.1.1/dns-query DoH：https://1.0.0.1/dns-query DoH：https://cloudflare-dns.com/dns-query DNS 泄露 ","date":"2025-03-21T17:51:25+08:00","permalink":"/p/250321175125/","title":"DNS指南，公共DNS列表，DNS泄露"},{"content":"增加公共备注 ","date":"2025-03-20T16:12:05+08:00","permalink":"/p/250320161205/","title":"哪吒探针配置"},{"content":" 警告 serv00 官方更新 tos，不再支持 nezha 探针\n详情：https://forum.serv00.com/d/2787-april-cleaning-and-new-tos\n简介 Dashboard 地址：https://github.com/nezhahq/nezha\nAgent 地址：https://github.com/nezhahq/agent\n一键脚本-agent 交互安装 1 2 bash -c \u0026#34;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\u0026#34; \\ -- install 无交互安装 1 2 3 4 5 PANEL_ADDRESS=\u0026#34;example:8008\u0026#34; \\ SERVER_KEY=\u0026#34;iK3Snw4Ev78MzM\u0026#34; \\ ENABLE_TLS=false \\ bash -c \u0026#34;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\u0026#34; \\ -- install 指定 UUID\n1 2 3 4 5 6 PANEL_ADDRESS=\u0026#34;example:8008\u0026#34; \\ SERVER_KEY=\u0026#34;iK3Snw4Ev78MzM\u0026#34; \\ ENABLE_TLS=false \\ UUID=\u0026#34;6c3fe883-055b-11f0-8047-3cecef19f58c\u0026#34; \\ bash -c \u0026#34;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\u0026#34; \\ -- install 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 #!/bin/sh # 定义变量 NEZHA_AGENT_DIR=\u0026#34;$HOME/.nezha/agent\u0026#34; NEZHA_AGENT_EXECUTABLE=\u0026#34;$NEZHA_AGENT_DIR/nezha-agent\u0026#34; NEZHA_START_SCRIPT=\u0026#34;$NEZHA_AGENT_DIR/start.sh\u0026#34; NEZHA_LOG_FILE=\u0026#34;$NEZHA_AGENT_DIR/nezha-agent.log\u0026#34; # 默认值，可以被 curl 覆盖 PANEL_ADDRESS=\u0026#34;面板域名或者ip:端口\u0026#34; SERVER_KEY=\u0026#34;服务器密钥\u0026#34; # 函数：启动哪吒探针 start_nezha_agent() { echo \u0026#34;启动哪吒探针...\u0026#34; nohup \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; \u0026#34;-s\u0026#34; \u0026#34;$PANEL_ADDRESS\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;$SERVER_KEY\u0026#34; \u0026#34;--tls\u0026#34; \u0026gt; \u0026#34;$NEZHA_LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 \u0026amp; echo \u0026#34;哪吒探针已在后台启动，日志文件：$NEZHA_LOG_FILE\u0026#34; } # 函数：停止哪吒探针 stop_nezha_agent() { echo \u0026#34;停止哪吒探针...\u0026#34; # 查找哪吒探针的进程 ID 并杀死它 PID=$(ps aux | grep \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; | grep -v grep | awk \u0026#39;{print $2}\u0026#39;) if [ -n \u0026#34;$PID\u0026#34; ]; then kill -9 \u0026#34;$PID\u0026#34; echo \u0026#34;哪吒探针进程 (PID: $PID) 已被杀死。\u0026#34; else echo \u0026#34;没有找到正在运行的哪吒探针进程。\u0026#34; fi } # 函数：处理 curl 请求 handle_curl_request() { if [ -n \u0026#34;$1\u0026#34; ]; then case \u0026#34;$1\u0026#34; in panel_address) PANEL_ADDRESS=\u0026#34;$2\u0026#34; echo \u0026#34;面板地址已更新为: $PANEL_ADDRESS\u0026#34; ;; server_key) SERVER_KEY=\u0026#34;$2\u0026#34; echo \u0026#34;服务器密钥已更新\u0026#34; ;; start) start_nezha_agent ;; stop) stop_nezha_agent ;; restart) stop_nezha_agent sleep 2 # 等待进程结束 start_nezha_agent ;; *) echo \u0026#34;无效的参数: $1\u0026#34; echo \u0026#34;用法: curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?panel_address=你的面板地址\u0026amp;server_key=你的密钥\u0026amp;start\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?stop\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?restart\u0026#39;\u0026#34; exit 1 ;; esac else echo \u0026#34;没有提供参数。\u0026#34; echo \u0026#34;用法: curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?panel_address=你的面板地址\u0026amp;server_key=你的密钥\u0026amp;start\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?stop\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?restart\u0026#39;\u0026#34; exit 1 fi } # 创建目录（如果不存在） mkdir -p \u0026#34;$NEZHA_AGENT_DIR\u0026#34; # 创建启动脚本 cat \u0026gt; \u0026#34;$NEZHA_START_SCRIPT\u0026#34; \u0026lt;\u0026lt;EOL #!/bin/sh nohup \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; \u0026#34;-s\u0026#34; \u0026#34;$PANEL_ADDRESS\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;$SERVER_KEY\u0026#34; \u0026#34;--tls\u0026#34; \u0026gt; \u0026#34;$NEZHA_LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 \u0026amp; EOL # 赋予执行权限 chmod +x \u0026#34;$NEZHA_START_SCRIPT\u0026#34; # 检查是否需要处理 curl 请求 if [ -n \u0026#34;$QUERY_STRING\u0026#34; ]; then # 解析 QUERY_STRING IFS=\u0026#39;\u0026amp;\u0026#39; read -r -a PARAMS \u0026lt;\u0026lt;\u0026lt; \u0026#34;$QUERY_STRING\u0026#34; for PARAM in \u0026#34;${PARAMS[@]}\u0026#34;; do IFS=\u0026#39;=\u0026#39; read -r KEY VALUE \u0026lt;\u0026lt;\u0026lt; \u0026#34;$PARAM\u0026#34; case \u0026#34;$KEY\u0026#34; in panel_address) PANEL_ADDRESS=\u0026#34;$VALUE\u0026#34; ;; server_key) SERVER_KEY=\u0026#34;$VALUE\u0026#34; ;; action) ACTION=\u0026#34;$VALUE\u0026#34; ;; esac done # 根据 action 调用相应的函数 case \u0026#34;$ACTION\u0026#34; in start) start_nezha_agent ;; stop) stop_nezha_agent ;; restart) stop_nezha_agent sleep 2 start_nezha_agent ;; *) echo \u0026#34;无效的 action: $ACTION\u0026#34; exit 1 ;; esac else # 如果没有 curl 请求，则默认启动哪吒探针 start_nezha_agent fi exit 0 Agent 安装 下载解压\n1 mkdir -p $HOME/.nezha/tmp $HOME/.nezha/agent 1 curl -sL https://github.com/nezhahq/agent/releases/download/v1.9.6/nezha-agent_freebsd_amd64.zip -o $HOME/.nezha/tmp/nezha-agent_freebsd_amd64.zip 1 unzip $HOME/.nezha/tmp/nezha-agent_freebsd_amd64.zip -d $HOME/.nezha/agent 赋予运行权限\n1 chmod +x $HOME/.nezha/agent/nezha-agent 创建配置文件\n1 vim $HOME/.nezha/agent/config.yml 填入以下内容\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 client_secret: 安全密钥 debug: false disable_auto_update: false disable_command_execute: false disable_force_update: false disable_nat: false disable_send_query: false gpu: false insecure_tls: false ip_report_period: 0 report_delay: 0 self_update_period: 0 server: 服务地址 skip_connection_count: false skip_procs_count: false temperature: false tls: 服务是否使用tls连接 use_gitee_to_upgrade: false use_ipv6_country_code: false uuid: 随机uuid client_secret：安全密钥 server：面板设置的连接地址 tls：面板设置的连接是否启用 tls uuid：随机的 UUID 启动 1 $HOME/.nezha/agent/nezha-agent -c $HOME/.nezha/agent/config.yml 编写启动脚本\n1 vim $HOME/.nezha/agent/start.sh 修改下面的内容后保存\n1 2 #!/bin/sh nohup $HOME/.nezha/agent/nezha-agent -c $HOME/.nezha/agent/config.yml \u0026gt; $HOME/.nezha/agent/nezha-agent.log 2\u0026gt;\u0026amp;1 \u0026amp; 1 chmod +x $HOME/.nezha/agent/start.sh 启动\n1 $HOME/.nezha/agent/start.sh 卸载 1 2 3 4 5 6 7 ## 停止服务 killall nezha-agent ## 删除 agent 文件夹 rm -rf $HOME/.nezha/agent/ ## 删除整个哪吒文件夹 rm -rf $HOME/.nezha ","date":"2025-03-20T12:35:13+08:00","permalink":"/p/250320123513/","title":"nezha，哪吒探针v1版之serv00安装"},{"content":"简介 Dashboard 最后一个 v0 版本截止到 v0.20.13\n地址：https://github.com/nezhahq/nezha/releases/tag/v0.20.13\n安装 1 2 mkdir -p /opt/nezha/dashboard cd /opt/nezha/dashboard 1 2 3 curl -OL https://github.com/nezhahq/nezha/releases/download/v0.20.13/dashboard-linux-amd64.zip unzip dashboard-linux-amd64.zip -d . chmod +x dashboard-linux-amd64 Agent 准备 准备一个带有 root 用户权限的用户操作\n下载\n1 wget -O nezha-agent.zip https://github.com/nezhahq/agent/releases/download/v0.20.5/nezha-agent_linux_amd64.zip 中国镜像加速\n1 wget -O nezha-agent.zip http://gh.ggf.ip-ddns.com/https://github.com/nezhahq/agent/releases/download/v0.20.5/nezha-agent_linux_amd64.zip 解压文件\n1 2 sudo mkdir -p /opt/nezha/agent sudo unzip nezha-agent.zip -d /opt/nezha/agent 赋予运行权限\n1 sudo chmod +x /opt/nezha/agent/nezha-agent 系统服务 1 sudo vim /etc/systemd/system/nezha-agent.service 如果没有面板使用，需要将 \u0026ldquo;\u0026ndash;tls\u0026rdquo; 删除\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [Unit] Description=哪吒探针监控端 ConditionFileIsExecutable=/opt/nezha/nezha-agent [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/opt/nezha/agent/nezha-agent \u0026#34;-s\u0026#34; \u0026#34;面板域名或者ip:端口\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;服务器密钥\u0026#34; \u0026#34;--tls\u0026#34; WorkingDirectory=用户目录 Restart=always RestartSec=120 EnvironmentFile=-/etc/sysconfig/nezha-agent [Install] WantedBy=multi-user.target 保存文件并重新加载服务配置\n1 sudo systemctl daemon-reload 启动 启动服务\n1 sudo systemctl start nezha-agent 开机自启动\n1 sudo systemctl enable nezha-agent 查看状态\n1 sudo systemctl status nezha-agent ","date":"2025-03-20T10:17:09+08:00","permalink":"/p/250320101709/","title":"nezha，哪吒探针v0版安装"},{"content":"简介 开源、轻量、易用的服务器监控与运维工具\n一键安装 支持一键安装面板和监控服务，操作便捷。兼容主流系统，包括 Linux、Windows、macOS、OpenWRT 以及群晖。\n实时监控 支持同时监控多个服务器的状态，提供历史网络状态和延迟图表，监控网页、端口可用性和 SSL 证书状态。支持故障和流量等状态告警，可通过 Telegram、邮件、微信等多种方式提醒。\n轻松运维 提供 API 获取服务器状态，支持 WebSSH、DDNS 和流量监控。可设置定时和触发任务，并批量执行服务器任务。\n部署 dashboard 一键脚本 在面板服务器中，运行以下安装脚本：\n1 curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh \u0026amp;\u0026amp; chmod +x nezha.sh \u0026amp;\u0026amp; sudo ./nezha.sh 如果你的服务器位于中国大陆，可以使用镜像：\n1 curl -L https://gitee.com/naibahq/scripts/raw/main/install.sh -o nezha.sh \u0026amp;\u0026amp; chmod +x nezha.sh \u0026amp;\u0026amp; sudo CN=true ./nezha.sh 以 Docker 安装为例，安装完成后按提示输入以下信息：\n请输入站点标题: - 自定义站点标题。 请输入暴露端口: - 公开访问端口（默认 8008，可自定义）。 请指定后台语言: - 选择语言偏好。 输入完成后，等待拉取 Docker 镜像。安装结束后，如果一切正常，你可以通过域名和端口号访问 Dashboard，例如：\nhttp://dashboard.example.com:8008\n如果需要再次运行安装脚本，可输入以下命令：\nbash\n1 ./nezha.sh 打开管理脚本。\nclaw 1 2 apt update apt install -y curl unzip 1 2 mkdir -p ~/.cache/nezha/dashboard mkdir -p ~/.local/nezha/dashboard 1 curl -L https://github.com/nezhahq/nezha/releases/download/v1.12.0/dashboard-linux-amd64.zip -o ~/.cache/nezha/dashboard/dashboard-linux-amd64.zip 1 unzip ~/.cache/nezha/dashboard/dashboard.zip -d ~/.local/nezha/dashboard 1 chmod +x ~/.local/nezha/dashboard/dashboard-linux-amd64 Agent 安装 Agent 找到后台，复制对应的操作系统命令粘贴执行\n卸载 Agent 卸载单个服务\n1 2 3 4 ## 停止并卸载服务 /opt/nezha/agent/nezha-agent service uninstall ## 删除 Agent 文件夹 rm -rf /opt/nezha/agent/ 安装了多个服务并想要全部卸载，可以使用 Agent 安装脚本的卸载功能\n1 2 3 4 ## 多个服务全部卸载 curl -L https://raw.githubusercontent.com/nezhahq/scripts/main/agent/install.sh | bash uninstall ## 删除 Agent 文件夹 rm -rf /opt/nezha/agent claw ","date":"2025-03-20T09:13:55+08:00","permalink":"/p/250320091355/","title":"nezha，哪吒探针v1版安装"},{"content":"External Player 使用外部播放器播放网页中的视频\n支持的网站\nyt-dlp 支持的网站 B 站 B 站直播 樱花动漫 Girigiri 爱动漫 / Girigiri 爱动漫 LIBVIO 吐槽弹幕网 萌番动漫馆 巴哈姆特 官方 GitHub 仓库：https://github.com/LuckyPuppy514/external-player\n安装 安装油猴插件：https://www.tampermonkey.net/index.php 安装脚本：https://greasyfork.org/zh-CN/scripts/518677-external-player 安装 URL Scheme Handler URL Scheme Handler 为 Windows 应用添加自定义 URL Scheme 以便从浏览器调用\n项目地址：https://github.com/LuckyPuppy514/url-scheme-handler\n下载地址：\nscheme-handler.exe：v1.0.4 油猴插件 地址：https://www.tampermonkey.net/index.php\n","date":"2025-03-19T22:09:20+08:00","permalink":"/p/250319220920/","title":"MPV播放器入门指南-第五期：B站视频播放利器，兼顾PotPlayer，IINA"},{"content":"简介 Nginx（发音为\u0026quot;engine-x\u0026quot;）是一个高性能的开源 Web 服务器，也可以用作反向代理服务器、负载均衡器和 HTTP 缓存。\nNginx 官网文档：https://nginx.org/en/docs/\n部署 包管理器 debian/ubuntu\n1 2 sudo apt update sudo apt install nginx centos\n1 2 3 sudo yum update sudo yum install nginx 官方仓库 Debian 前提条件：\n1 sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring 导入密钥，验证包的正确性：\n1 2 curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \\ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg \u0026gt;/dev/null 验证下载的文件是否包含正确的密钥：\n1 gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg 输出应包含完整指纹 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 如下:\npub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key signing-key@nginx.com\n如果指纹不同，删除文件。\n二选一：\n要为稳定的 nginx 包设置 apt 存储库，请运行以下命令： 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 如果希望使用 mainline nginx 包，请改为运行以下命令: 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 设置存储库固定，使用 Nginx 官方的软件包而不是发行版提供的软件包：\n1 2 echo -e \u0026#34;Package: *\\nPin: origin nginx.org\\nPin: release o=nginx\\nPin-Priority: 900\\n\u0026#34; \\ | sudo tee /etc/apt/preferences.d/99nginx 要安装 nginx，请运行以下命令:\n1 2 sudo apt update sudo apt install nginx 参考教程 https://nginx.org/en/linux_packages.html#Debian\nUbuntu 前提条件：\n1 sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring 导入密钥，验证包的正确性：\n1 2 curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \\ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg \u0026gt;/dev/null 验证下载的文件是否包含正确的密钥：\n1 gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg 输出应包含完整指纹 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 如下:\npub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid\n如果指纹不同，删除文件。\n二选一：\n要为稳定的 nginx 包设置 apt 存储库，请运行以下命令： 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/ubuntu `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 如果希望使用 mainline nginx 包，请改为运行以下命令: 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 设置存储库固定，使其更喜欢我们的软件包而不是发行版提供的软件包：\n1 2 echo -e \u0026#34;Package: *\\nPin: origin nginx.org\\nPin: release o=nginx\\nPin-Priority: 900\\n\u0026#34; \\ | sudo tee /etc/apt/preferences.d/99nginx 要安装 nginx，请运行以下命令:\n1 2 sudo apt update sudo apt install nginx 参考教程 https://nginx.org/en/linux_packages.html#Ubuntu\n配置文件 通过包管理工具安装的 Nginx 一般在 /etc/nginx下\n其中有一个 nginx.conf 文件，它就是 Nginx 的配置文件，但是为了方便管理，一般不直接修改该文件，而是在 /etc/nginx/conf.d/ 下新建文件。\n在默认的 nginx.conf中 http模块下，有这样一条命令 include /etc/nginx/conf.d/*.conf; 它表示包含了 /etc/nginx/conf.d/下所有文件，所以我们在/etc/nginx/conf.d/直接添加新文件即可，如果没有该命令需要手动把文件的路径添加到 nginx.conf中\n配置⽂件结构 Nginx 的配置⽂件是由模块（⼀系列的指令）组成的，每个模块都是由⼀个或者多个指令+参数组成的。\n指令和参数之间使⽤空格来分隔，指令以分号 ; 结尾，参数可以使⽤单引号或者双引号来包裹。\n配置⽂件分为以下⼏个模块：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 全局块 worker_processes 1; # events块 events { } # http块 http { # server块 server { # location块 location / { } } } 全局块 全局块是配置⽂件的第⼀个块，也是配置⽂件的主体部分，主要⽤来设置⼀些影响 Nginx 服务器整体运⾏的配置指令，主要包括配置运⾏ Nginx 服务器的⽤户（组）、允许⽣成的 workerprocess 数、进程 PID 存放路径、⽇志存放路径和类型以及配置⽂件引⼊等。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 指定运⾏Nginx服务器的⽤户，只能在全局块配置 # 将user指令注释掉，或者配置成nobody的话所有⽤户都可以运⾏ # user [user] [group] # user nobody nobody; user nginx; # 指定⽣成的worker进程的数量，也可使⽤⾃动模式，只能在全局块配置 worker_processes 1; # 错误⽇志存放路径和类型 error_log /var/log/nginx/error.log warn; # 进程PID存放路径 pid /var/run/nginx.pid; events 块 1 2 3 4 5 6 events { # 指定使⽤哪种⽹络IO模型，只能在events块中进⾏配置 # use epoll # 每个worker process允许的最⼤连接数 worker_connections 1024; } http 块 http 块是配置⽂件的主要部分，包括 http 全局块和其下的 server 块。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 http { # nginx 可以使用include指令引入其他配置文件 include /etc/nginx/mime.types; # 默认类型，如果请求的URL没有包含文件类型，会使用默认类型 default_type application/octet-stream; # 默认类型 # 开启高效文件传输模式 sendfile on; # 连接超时时间 keepalive_timeout 65; # access_log 日志存放路径和类型 # 格式为：access_log \u0026lt;path\u0026gt; [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log /var/log/nginx/access.log main; # 定义日志格式 log_format main \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; $status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#34;$http_user_agent\u0026#34; \u0026#34;$http_x_forwarded_for\u0026#34;\u0026#39;; # 设置sendfile最大传输片段大小，默认为0，表示不限制 # sendfile_max_chunk 1m; # 每个连接的请求次数 # keepalive_requests 100; # keepalive超时时间 keepalive_timeout 65; # 开启gzip压缩 # gzip on; # 开启gzip压缩的最小文件大小 # gzip_min_length 1k; # gzip压缩级别，1-9，级别越高压缩率越高，但是消耗CPU资源也越多 # gzip_comp_level 2; # gzip压缩文件类型 # gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # upstream指令用于定义一组服务器，一般用来配置反向代理和负载均衡 upstream www.example.com { # ip_hash指令用于设置负载均衡的方式，ip_hash表示使用客户端的IP进行hash，这样可以保证同一个客户端的请求每次都会分配到同一个服务器，解决了session共享的问题 ip_hash; # weight 用于设置权重，权重越高被分配到的几率越大 server 192.168.50.11:80 weight=3; server 192.168.50.12:80; server 192.168.50.13:80; } server { # 参考server块的配置 } } server 块 server 块是配置虚拟主机的，⼀个 http 块可以包含多个 server 块，每个 server 块就是⼀个虚拟主机。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 server { # 监听IP和端口 # listen的格式为： # listen [ip]:port [default_server] [ssl] [http2] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number]; # listen指令非常灵活，可以指定多个IP和端口，也可以使用通配符 # 下面是几个实际的例子： # listen 127.0.0.1:80; # 监听来自127.0.0.1的80端口的请求 # listen 80; # 监听来自所有IP的80端口的请求 # listen *:80; # 监听来自所有IP的80端口的请求，同上 # listen 127.0.0.1; # 监听来自来自127.0.0.1的80端口，默认端口为80 listen 80; # server_name 用来指定虚拟主机的域名，可以使用精确匹配、通配符匹配和正则匹配等方式 # server_name example.org www.example.org; # 精确匹配 # server_name *.example.org; # 通配符匹配 # server_name ~^www\\d+\\.example\\.net$; # 正则匹配 server_name localhost; # location 块 location / { # ... } # error_page 用于指定错误页面，可以指定多个，按照优先级从高到低依次查找 error_page 500 502 503 504 /50x.html; # 错误页面 location = /50x.html { root /usr/share/nginx/html; } } location 块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 server { ############# # server 块配置... ############# # location块用来配置请求的路由，一个server块可以包含多个location块，每个location块就是一个请求路由 # location块的格式是： # location [=|~|~*|^~] /uri/ { ... } # = 表示精确匹配，只有完全匹配上才能生效 # ~ 表示区分大小写的正则匹配 # ~* 表示不区分大小写的正则匹配 # ^~ 表示普通字符匹配，如果匹配成功，则不再匹配其他location # /uri/ 表示请求的URI，可以是字符串，也可以是正则表达式 # { ... } 表示location块的配置内容 location / { # root指令用于指定请求的根目录，可以是绝对路径，也可以是相对路径 root /usr/share/nginx/html; # 根目录 # index指令用于指定默认文件，如果请求的是目录，则会在目录下查找默认文件 index index.html index.htm; # 默认文件 } # 下面是一些location的示例： location = / { # 精确匹配请求 root /usr/share/nginx/html; index index.html index.htm; } location ^~ /images/ { # 匹配以/images/开头的请求 root /usr/share/nginx/html; } location ~* \\.(gif|jpg|jpeg)$ { # 匹配以gif、jpg或者jpeg结尾的请求 root /usr/share/nginx/html; } location !~ \\.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求 root /usr/share/nginx/html; } location !~* \\.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求 root /usr/share/nginx/html; } } SSL/TLS 在 server 块增加\n1 2 3 4 5 6 7 8 9 10 # 证书文件路径 ssl_certificate /path/to/yourdomain/cert.pem; # 私钥文件路径 ssl_certificate_key /path/to/yourdomain/key.pem; # SSL 配置 (推荐的配置) ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers \u0026#34;EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH\u0026#34;; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; 一些常见的需求 设置客户端 body 最大值 client_max_body_size 这个指令定义了客户端请求主体的最大允许大小，在网盘项目中，需要设置。\n默认值是 1m\n可以在 http, server, location中设置\n设置方法 在 http 块中设置 (全局设置)：\n这将对 Nginx 处理的所有站点和所有请求生效。适用于你的所有网站都有相似上传需求的情况。\n1 2 3 4 5 6 7 8 9 10 11 # /etc/nginx/nginx.conf (或你的主配置文件) http { client_max_body_size 100m; # 允许最大上传100MB的文件 # ... 其他 http 配置 ... server { # ... } } 在 server 块中设置 (针对特定网站)： 如果你有多个网站，并且每个网站的上传需求不同，可以在每个 server 块中单独设置。\n1 2 3 4 5 6 7 8 9 10 # /etc/nginx/sites-available/your_website.conf server { listen 80; server_name your_domain.com; client_max_body_size 500m; # 该网站允许最大上传500MB的文件 # ... 其他 server 配置 ... } 在 location 块中设置 (针对特定 URL 路径)： 这是最细粒度的控制，只对匹配特定 URL 路径的请求生效。例如，你可能只在 /upload 路径下允许大文件上传。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server { listen 80; server_name your_domain.com; location / { # 默认的或较小的上传限制 client_max_body_size 10m; # ... } location /upload { # 仅此上传路径允许较大的文件 client_max_body_size 2g; # 允许最大上传2GB的文件 # ... } } 设置单位 size 可以使用以下单位：\nk 或 K (千字节) m 或 M (兆字节) g 或 G (吉字节) 例如：100k, 10m, 2g。\n设置为 \u0026ldquo;无限制\u0026rdquo; (不推荐) 将 client_max_body_size 设置为 0 会禁用对客户端请求主体大小的检查。这意味着 Nginx 会接受任意大小的请求主体。 但请注意： 设置为 0 意味着请求体根本不会被读取，实际上就是不允许上传文件。 如果你真的需要允许非常大的文件上传，应该设置一个非常大的具体值，而不是 0。\n例如，允许非常大的文件（但仍有上限）：\n1 client_max_body_size 10g; # 允许最大10GB的文件 常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 systemctl start nginx # 启动Nginx (默认已经启动) systemctl stop nginx\t# 关闭Nginx systemctl status nginx # 查看Nginx状态 sudo nginx -t # 检查Nginx配置文件语法是否正确 sudo nginx -s reload\t# 重新加载Nginx配置 sudo nginx # 启动Nginx sudo nginx -c filename # 指定配置⽂件 nginx -V # 查看Nginx的版本和编译参数等信息 sudo nginx -s quit # 优雅停⽌Nginx sudo nginx -s stop # 快速停⽌Nginx sudo nginx -s reopen # 重新打开⽇志⽂件 案例 简单示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server { listen 80; server_name seektao.cc; return 301 https://www.seektao.cc$request_uri; } server { listen 80; server_name www.seektao.cc; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.seektao.cc; } 这个 Nginx 配置文件包含了三个 server 块，每个块定义了不同的虚拟主机配置。\n第一个 server 块： listen 80;: 监听 80 端口，表示这个 server 块用于处理 HTTP 请求。 server_name seektao.cc;: 指定服务器的域名为seektao.cc。 return 301 https://www.seektao.cc$request_uri;: 当有 HTTP 请求访问seektao.cc时，返回 301 重定向到https://www.seektao.cc$request_uri，即将 HTTP 请求重定向到 HTTPS 协议的www.seektao.cc。 第二个 server 块： listen 80;: 同样监听 80 端口，处理 HTTP 请求。 server_name www.seektao.cc;: 指定服务器的域名为www.seektao.cc。 return 301 https://$host$request_uri;: 当有 HTTP 请求访问www.seektao.cc时，返回 301 重定向到https://$host$request_uri，即将 HTTP 请求重定向到 HTTPS 协议的www.seektao.cc。 第三个 server 块： listen 443 ssl http2;: 监听 443 端口，启用 SSL 和 HTTP/2 协议。 server_name www.seektao.cc;: 指定服务器的域名为www.seektao.cc。 这个配置文件的作用是：\n当有 HTTP 请求访问seektao.cc或www.seektao.cc时，会将请求重定向到相应的 HTTPS 地址。 对于 HTTPS 请求，只有www.seektao.cc会被处理 这是一个简单的配置示例，实际环境中还需要根据具体需求进行进一步配置，例如配置 SSL 证书、代理、缓存等功能。\nweb 服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 server { listen 443 ssl; server_name yourdomain.com www.yourdomain.com; ssl_certificate /etc/nginx/ssl/yourdomain.com.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # SSL 配置 (推荐的配置) ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers \u0026#34;EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH\u0026#34;; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS (HTTP Strict Transport Security) - 强制浏览器使用 HTTPS add_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34;; # Content Security Policy (CSP) - 进一步加强安全性 (根据你的需求配置) # add_header Content-Security-Policy \u0026#34;default-src \u0026#39;self\u0026#39;; script-src \u0026#39;self\u0026#39; \u0026#39;unsafe-inline\u0026#39;; style-src \u0026#39;self\u0026#39; \u0026#39;unsafe-inline\u0026#39;; img-src \u0026#39;self\u0026#39; data:;\u0026#34;; root /var/www/yourdomain.com; # 替换为你的网站根目录 index index.html index.htm index.php; location / { try_files $uri $uri/ =404; } # PHP 配置 (如果你的网站使用 PHP) location ~ \\.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 替换为你的 PHP-FPM 套接字路径 } location ~ /\\.ht { deny all; } } # 可选: 将 HTTP 请求重定向到 HTTPS server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; } 反向代理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 server { if ($host = yourdomain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name yourdomain.com; return 301 https://yourdomain.com$request_uri; } server { listen 443 ssl; http2 on; server_name yourdomain.com; # SSL 证书配置 ssl_certificate /etc/nginx/ssl/yourdomain.com/cert.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com/key.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } # 上传的最大文件尺寸 client_max_body_size 200000m; # 设置超时时间，单位为秒 proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; # 日志配置 access_log /var/log/nginx/yourdomain.com.access.log; error_log /var/log/nginx/yourdomain.com.error.log; } ","date":"2025-03-19T08:48:54+08:00","permalink":"/p/250319084854/","title":"Nginx，一个高性能的开源 Web 服务器，Nginx指南"},{"content":" 警告 serv00 官方更新 tos，不再支持 nezha 探针\n详情：https://forum.serv00.com/d/2787-april-cleaning-and-new-tos\n简介 最后一个 v0 版本截止到 v0.20.5\n地址：https://github.com/nezhahq/agent/releases/tag/v0.20.5\n准备 下载\n1 wget -O nezha-agent.zip https://github.com/nezhahq/agent/releases/download/v0.20.5/nezha-agent_freebsd_amd64.zip 解压文件\n1 2 mkdir -p $HOME/.nezha/agent unzip nezha-agent.zip -d $HOME/.nezha/agent 赋予运行权限\n1 chmod +x $HOME/.nezha/agent/nezha-agent 启动 如果没有面板使用 tls，需要将 \u0026ldquo;\u0026ndash;tls\u0026rdquo; 删除\n编写启动脚本\n1 vim $HOME/.nezha/agent/start.sh 修改下面的内容后保存\n1 2 #!/bin/sh nohup $HOME/.nezha/agent/nezha-agent \u0026#34;-s\u0026#34; \u0026#34;面板域名或者ip:端口\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;服务器密钥\u0026#34; \u0026#34;--tls\u0026#34; \u0026gt; $HOME/.nezha/agent/nezha-agent.log 2\u0026gt;\u0026amp;1 \u0026amp; 1 chmod +x $HOME/.nezha/agent/start.sh 启动\n1 $HOME/.nezha/agent/start.sh 一键脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 #!/bin/sh # 定义变量 NEZHA_AGENT_DIR=\u0026#34;$HOME/.nezha/agent\u0026#34; NEZHA_AGENT_EXECUTABLE=\u0026#34;$NEZHA_AGENT_DIR/nezha-agent\u0026#34; NEZHA_START_SCRIPT=\u0026#34;$NEZHA_AGENT_DIR/start.sh\u0026#34; NEZHA_LOG_FILE=\u0026#34;$NEZHA_AGENT_DIR/nezha-agent.log\u0026#34; # 默认值，可以被 curl 覆盖 PANEL_ADDRESS=\u0026#34;面板域名或者ip:端口\u0026#34; SERVER_KEY=\u0026#34;服务器密钥\u0026#34; # 函数：启动哪吒探针 start_nezha_agent() { echo \u0026#34;启动哪吒探针...\u0026#34; nohup \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; \u0026#34;-s\u0026#34; \u0026#34;$PANEL_ADDRESS\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;$SERVER_KEY\u0026#34; \u0026#34;--tls\u0026#34; \u0026gt; \u0026#34;$NEZHA_LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 \u0026amp; echo \u0026#34;哪吒探针已在后台启动，日志文件：$NEZHA_LOG_FILE\u0026#34; } # 函数：停止哪吒探针 stop_nezha_agent() { echo \u0026#34;停止哪吒探针...\u0026#34; # 查找哪吒探针的进程 ID 并杀死它 PID=$(ps aux | grep \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; | grep -v grep | awk \u0026#39;{print $2}\u0026#39;) if [ -n \u0026#34;$PID\u0026#34; ]; then kill -9 \u0026#34;$PID\u0026#34; echo \u0026#34;哪吒探针进程 (PID: $PID) 已被杀死。\u0026#34; else echo \u0026#34;没有找到正在运行的哪吒探针进程。\u0026#34; fi } # 函数：处理 curl 请求 handle_curl_request() { if [ -n \u0026#34;$1\u0026#34; ]; then case \u0026#34;$1\u0026#34; in panel_address) PANEL_ADDRESS=\u0026#34;$2\u0026#34; echo \u0026#34;面板地址已更新为: $PANEL_ADDRESS\u0026#34; ;; server_key) SERVER_KEY=\u0026#34;$2\u0026#34; echo \u0026#34;服务器密钥已更新\u0026#34; ;; start) start_nezha_agent ;; stop) stop_nezha_agent ;; restart) stop_nezha_agent sleep 2 # 等待进程结束 start_nezha_agent ;; *) echo \u0026#34;无效的参数: $1\u0026#34; echo \u0026#34;用法: curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?panel_address=你的面板地址\u0026amp;server_key=你的密钥\u0026amp;start\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?stop\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?restart\u0026#39;\u0026#34; exit 1 ;; esac else echo \u0026#34;没有提供参数。\u0026#34; echo \u0026#34;用法: curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?panel_address=你的面板地址\u0026amp;server_key=你的密钥\u0026amp;start\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?stop\u0026#39;\u0026#34; echo \u0026#34; curl \u0026#39;http://\u0026lt;服务器IP\u0026gt;:\u0026lt;端口\u0026gt;?restart\u0026#39;\u0026#34; exit 1 fi } # 创建目录（如果不存在） mkdir -p \u0026#34;$NEZHA_AGENT_DIR\u0026#34; # 创建启动脚本 cat \u0026gt; \u0026#34;$NEZHA_START_SCRIPT\u0026#34; \u0026lt;\u0026lt;EOL #!/bin/sh nohup \u0026#34;$NEZHA_AGENT_EXECUTABLE\u0026#34; \u0026#34;-s\u0026#34; \u0026#34;$PANEL_ADDRESS\u0026#34; \u0026#34;-p\u0026#34; \u0026#34;$SERVER_KEY\u0026#34; \u0026#34;--tls\u0026#34; \u0026gt; \u0026#34;$NEZHA_LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 \u0026amp; EOL # 赋予执行权限 chmod +x \u0026#34;$NEZHA_START_SCRIPT\u0026#34; # 检查是否需要处理 curl 请求 if [ -n \u0026#34;$QUERY_STRING\u0026#34; ]; then # 解析 QUERY_STRING IFS=\u0026#39;\u0026amp;\u0026#39; read -r -a PARAMS \u0026lt;\u0026lt;\u0026lt; \u0026#34;$QUERY_STRING\u0026#34; for PARAM in \u0026#34;${PARAMS[@]}\u0026#34;; do IFS=\u0026#39;=\u0026#39; read -r KEY VALUE \u0026lt;\u0026lt;\u0026lt; \u0026#34;$PARAM\u0026#34; case \u0026#34;$KEY\u0026#34; in panel_address) PANEL_ADDRESS=\u0026#34;$VALUE\u0026#34; ;; server_key) SERVER_KEY=\u0026#34;$VALUE\u0026#34; ;; action) ACTION=\u0026#34;$VALUE\u0026#34; ;; esac done # 根据 action 调用相应的函数 case \u0026#34;$ACTION\u0026#34; in start) start_nezha_agent ;; stop) stop_nezha_agent ;; restart) stop_nezha_agent sleep 2 start_nezha_agent ;; *) echo \u0026#34;无效的 action: $ACTION\u0026#34; exit 1 ;; esac else # 如果没有 curl 请求，则默认启动哪吒探针 start_nezha_agent fi exit 0 ","date":"2025-03-17T10:15:43+08:00","permalink":"/p/250317101543/","title":"哪吒探针v0版之serv00"},{"content":"在线网站-更新快 https://www.wetest.vip/page/cloudflare/cname.html https://ipdb.030101.xyz/bestdomain/ 优选域名 1 https://raw.githubusercontent.com/cmliu/WorkerVless2sub/refs/heads/main/addressesapi.txt 1 2 3 4 5 6 7 8 9 10 icook.tw:443#icook.tw alphacoders.com:443#alphacoders.com visa.com.cn:443#visa.com.cn www.dogfight360.com:443#www.dogfight360.com cloudflare.182682.xyz:443#cloudflare.182682.xyz fast-fast.asuscomm.com:443#fast-fast.asuscomm.com bestcf.top:443#bestcf.top cfip.cfcdn.vip:443#cfip.cfcdn.vip dns.123zy.cool:443#dns.123zy.cool bestproxy.030101.xyz:443#bestproxy.030101.xyz 优选 IP IPv4 2025-08-05\n1 2 3 4 5 6 7 8 172.67.69.185 4 4 0.00 102.50 35.05 104.20.25.107 4 4 0.00 101.96 31.80 104.26.12.122 4 4 0.00 101.44 29.25 104.26.15.165 4 4 0.00 102.65 28.74 104.26.2.6 4 4 0.00 102.60 22.08 104.20.18.193 4 4 0.00 102.41 19.84 104.20.30.249 4 4 0.00 102.43 18.96 172.67.66.207 4 4 0.00 101.81 12.22 1 2 104.17.179.183:443#104.17.179.183 172.67.78.125:443#172.67.78.125 IPv6\n1 2 3 4 5 6 7 [2606:4700:3003:0:18:969c:26a6:9e51]:443#[2606:4700:3003:0:18:969c:26a6:9e51] [2606:4700:3010:2dd2:53d3:1e18:8231:665b]:443#[2606:4700:3010:2dd2:53d3:1e18:8231:665b] [2606:4700:3003:c8e:17ff:834a:525:a70d]:443#[2606:4700:3003:c8e:17ff:834a:525:a70d] [2606:4700:3003::bf:c09f]:443#[2606:4700:3003::bf:c09f] [2606:4700:3010:2dd2:53a5:9dfe:639c:2c8b]:443#[2606:4700:3010:2dd2:53a5:9dfe:639c:2c8b] [2606:4700:3010:73ed:2959:4cdb:b656:9aaa]:443#[2606:4700:3010:73ed:2959:4cdb:b656:9aaa] [2606:4700:3010:2d55:d795:96ed:10f8:89f9]:443#[2606:4700:3010:2d55:d795:96ed:10f8:89f9] 反代 IP 公开查找 打开 fofa，输入以下语法进行检索\n1 server==\u0026#34;cloudflare\u0026#34; \u0026amp;\u0026amp; asn==\u0026#34;45102\u0026#34; \u0026amp;\u0026amp; port==\u0026#34;443\u0026#34; \u0026amp;\u0026amp; country==\u0026#34;CN\u0026#34; 搜索 ip\n8.218.175.216 8.217.64.226 8.217.131.231 47.76.46.220 149.129.115.111 47.238.170.225 47.242.192.198 47.57.13.107\n现成可用 1 2 3 4 5 cdn-all.xn--b6gac.eu.org (美国) cdn.xn--b6gac.eu.org cdn-b100.xn--b6gac.eu.org edgetunnel.anycast.eu.org cdn.anycast.eu.org （亚洲地区） ","date":"2025-03-16T22:22:49+08:00","permalink":"/p/250316222249/","title":"Cloudflare优选域名，优选ip，优选反代IP"},{"content":"cloudns 上的域名需要双向解析才可以使用\n这里介绍如何方便的使用双向解析\n关于注册不做介绍\n不使用优选域名 在 cloudflare 添加域名，获取 ns 名称服务器，记录下来 删除 cloudns 所有记录 cloudns 添加两条 ns 记录，host 不填，指向 cloudflare 获取的 ns 名称服务器 cloudns 再添加两条 ns 记录，host 值为 _acme-challenge，指向 cloudflare 获取的 ns 名称服务器 cloudns 添加一条 cname 记录，host 为*，指向其中一条 ns 名称服务器 如下所示\nHost Type Points to TTL wto.ip-ddns.com NS savanna.ns.cloudflare.com 1h wto.ip-ddns.com NS trey.ns.cloudflare.com 1h *.wto.ip-ddns.com CNAME savanna.ns.cloudflare.com 1h _acme-challenge.wto.ip-ddns.com NS savanna.ns.cloudflare.com 1h _acme-challenge.wto.ip-ddns.com NS trey.ns.cloudflare.com 1h 以后子级域名只需要在 cloudflare 上操作即可。\n使用优选域名 在 cloudflare 添加域名，获取 ns 名称服务器，记录下来 删除 cloudns 所有记录 cloudns 添加两条 ns 记录，host 不填，指向 cloudflare 获取的 ns 名称服务器 cloudns 再添加两条 ns 记录，host 值为 _acme-challenge，指向 cloudflare 获取的 ns 名称服务器 cloudns 再添加两条 ns 记录，host 值为 maintunnel，指向 cloudflare 获取的 ns 名称服务器 cloudns 添加一条 cname 记录，host 为*，指向 maintunnel.你的域名.ip-ddns.com cloudflare 添加一条 cname 记录，host 为 maintunnel指向优选的域名，比如cloudflare.182682.xyz或者fast-fast.asuscomm.com，关闭小黄云 如下所示\nHost Type Points to TTL wto.ip-ddns.com NS savanna.ns.cloudflare.com 1h wto.ip-ddns.com NS trey.ns.cloudflare.com 1h *.wto.ip-ddns.com CNAME maintunnel.wto.ip-ddns.com 1h maintunnel.wto.ip-ddns.com NS savanna.ns.cloudflare.com 1h maintunnel.wto.ip-ddns.com NS trey.ns.cloudflare.com 1h _acme-challenge.wto.ip-ddns.com NS savanna.ns.cloudflare.com 1h _acme-challenge.wto.ip-ddns.com NS trey.ns.cloudflare.com 1h 以后子级域名只需要在 cloudflare 上操作即可。\n主域名解析 对于主域名 wto.ip-ddns.com 的解析操作分为两种情况（假设服务器 IP 是 10.20.30.40）\n完全走 CDN 【推荐使用这种方案】\n1 2 3 4 #cloudns 类型 A 主机 留空 指向到 104.18.15.19 #cloudflare 开启小黄云 类型 A 主机 @ 指向到 10.20.30.40 并开启小黄云 完全不走 CDN 【仅需要原始解析时使用】\n1 2 3 4 #cloudns 类型 A 主机 留空 指向到 10.20.30.40 #cloudflare 不开启小黄云 类型 A 主机 @ 指向到 10.20.30.40 ","date":"2025-03-16T21:18:37+08:00","permalink":"/p/250316211837/","title":"cloudns双向解析"},{"content":"数据类型 Name Aliases Description bigint int8 signed eight-byte integer bigserial serial8 autoincrementing eight-byte integer bit [ (n) ] fixed-length bit string bit varying [ (n) ] varbit [ (n) ] variable-length bit string boolean bool logical Boolean (true/false) box rectangular box on a plane bytea binary data (\u0026ldquo;byte array\u0026rdquo;) character [ (n) ] char [ (n) ] fixed-length character string character varying [ (n) ] varchar [ (n) ] variable-length character string cidr IPv4 or IPv6 network address circle circle on a plane date calendar date (year, month, day) double precision float8 double precision floating-point number (8 bytes) inet IPv4 or IPv6 host address integer int, int4 signed four-byte integer interval [ fields ] time span [ (p) ] json textual JSON data jsonb binary JSON data, decomposed line infinite line on a plane lseg line segment on a plane macaddr MAC (Media Access Control) address macaddr8 MAC (Media Access Control) address (EUI-64 format) money currency amount numeric [ (p, s) ] decimal [ (p, s) ] exact numeric of selectable precision path geometric path on a plane pg_lsn PostgreSQL Log Sequence Number pg_snapshot user-level transaction ID snapshot point geometric point on a plane polygon closed geometric path on a plane real float4 single precision floating-point number (4 bytes) smallint int2 signed two-byte integer smallserial serial2 autoincrementing two-byte integer serial serial4 autoincrementing four-byte integer text variable-length character string time [ (p) ] [ without time zone ] time of day (no time zone) time [ (p) ] with time zone timez time of day, including time zone timestamp [ (p) ] [ without time zone ] date and time (no time zone) timestamp [ (p) ] with time zone timestamptz date and time, including time zone tsquery text search query tsvector text search document txid_snapshot user-level transaction ID snapshot (deprecated; see pg_snapshot) uuid universally unique identifier xml XML data ","date":"2025-03-15T20:18:01+08:00","permalink":"/p/pg-chapter08/","title":"PostgreSQL教程第8章：数据类型"},{"content":"安装 Linux 安装 jdk\n1 apt install openjdk-17-jdk 下载 datax\n1 curl -l https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz ","date":"2025-03-14T21:44:12+08:00","permalink":"/p/250314214412/","title":"datax安装"},{"content":"在 Obsdiain 中粘贴图片会变成 ![[url]]的方式，并且会保存在本地\n我粘贴 markdown 图片格式![描述](url) 后发现本地多了一些图片\n发现这个问题\n为了不在本地存储或者通用性，使用 makrdown 格式保存图片\n关闭方法：\n设置 -\u0026gt; 文件与链接-\u0026gt; 关闭使用Wiki链接\n","date":"2025-03-14T13:40:58+08:00","permalink":"/p/250314134058/","title":"Obsidian设置图片为markdown标准格式"},{"content":"Scala (Metals) 如果下载失败，ctrl+,打开设置，搜索\n1 Metals: Custom Repositories 添加\n1 https://maven.aliyun.com/repository/central Scala Syntax (official) ","date":"2025-03-11T19:46:38+08:00","permalink":"/p/250311194638/","title":"VSCode插件之Spark开发"},{"content":"常见问题 Java 17 运行 spark3.3.1 需要在vm中加入的参数\n1 2 3 4 5 --add-exports java.base/sun.nio.ch=ALL-UNNAMED --add-exports java.base/sun.util.calendar=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED 问题1 模块访问受限 Exception in thread \u0026ldquo;main\u0026rdquo; java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x71a8adcf) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x71a8adcf\n关于这个问题在 stackoverflow上的讨论\n解决办法\n在 IDEA 方法添加 VM 参数\n1 --add-exports java.base/sun.nio.ch=ALL-UNNAMED 新版 IDEA 图示\n问题2 系统缺少文件 Exception in thread \u0026ldquo;main\u0026rdquo; ExitCodeException exitCode=-1073741515:\n参考这篇博客：https://blog.csdn.net/psp0001060/article/details/83057663\n原因：\n操作系统缺少 msvcr120.dll文件\n下载地址\n链接: https://pan.baidu.com/s/1rQSzzFn97hs7V0ZYoiF6ZQ?pwd=bdsa 提取码: bdsa 复制这段内容后打开百度网盘手机 App，操作更方便哦\n放置 dll:\n32 位\\msvcr120.dll 粘贴到 _C:\\Windows\\System32 目录中 64 位\\msvcr120.dll 粘贴到 _C:\\Windows\\SysWOW64 目录中 问题3 模块访问受限 Exception in thread \u0026ldquo;main\u0026rdquo; java.lang.IllegalAccessError: class org.apache.spark.sql.catalyst.util.DateTimeUtils$ (in unnamed module @0x17f62e33) cannot access class sun.util.calendar.ZoneInfo (in module java.base) because module java.base does not export sun.util.calendar to unnamed module @0x17f62e33\n这个报错和问题 1 相似，vm 运行缺少 java.base/sun.util.calendar模块，需要手动指定\n像以上的问题，都是因为模块没有导入的问题，需要手动指定\n1 --add-exports java.base/sun.util.calendar=ALL-UNNAMED 确保程序运行时 vm 中有这个内容，idea 运行时添加可参考问题 1\n问题4 模块访问受限 Exception in thread \u0026ldquo;main\u0026rdquo; java.lang.reflect.InaccessibleObjectException: Unable to make field protected transient int java.util.AbstractList.modCount accessible: module java.base does not \u0026ldquo;opens java.util\u0026rdquo; to unnamed module @783a467b\nvm 参数加入\n1 --add-opens java.base/java.util=ALL-UNNAMED 问题5 Exception in thread \u0026ldquo;main\u0026rdquo; java.lang.IllegalArgumentException: Unable to create serializer \u0026ldquo;com.esotericsoftware.kryo.serializers.FieldSerializer\u0026rdquo; for class: java.nio.HeapByteBuffer\n。。。\n问题6 模块访问受限 Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field final byte[] java.nio.ByteBuffer.hb accessible: module java.base does not \u0026ldquo;opens java.nio\u0026rdquo; to unnamed module @6574a52c\nvm参数加入\n1 --add-opens java.base/java.nio=ALL-UNNAMED 问题7 模块访问受限 Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make private java.lang.Object java.lang.invoke.SerializedLambda.readResolve() throws java.io.ObjectStreamException accessible: module java.base does not \u0026ldquo;opens java.lang.invoke\u0026rdquo; to unnamed module @2cf3d63b\nvm参数加入\n1 --add-opens java.base/java.lang.invoke=ALL-UNNAMED ","date":"2025-03-11T17:56:24+08:00","permalink":"/p/250311175624/","title":"Spark开发中遇到的疑难杂症"},{"content":"Scala 与 Java 兼容关系 JDK 3 2.13 2.12 2.11 22 (ea) 3.3.4* 2.13.12 2.12.19 21 (LTS) 3.3.1 2.13.11 2.12.18 17 (LTS) 3.0.0 2.13.6 2.12.15 11 (LTS) 3.0.0 2.13.0 2.12.4 2.11.12 8 (LTS) 3.0.0 2.13.0 2.12.0 2.11.0 参考网址：docs.scala-lang.org.cn\n构建工具兼容性表 最低工作版本\nJDK sbt mill 21 (LTS) 1.9.0 0.11.5 17 (LTS) 1.6.0 0.7.0 11 (LTS) 1.1.0 0.1.5 8 (LTS) 1.0.0 0.1.0 Spark 与 Scala 兼容关系 如何寻找？\n方式一 通过 Spark GitHub 仓库，选择 Tags，找到对应的spark版本，查看pom.xml文件，搜索 scala.version 找到 scala 版本\n仓库地址：https://github.com/apache/spark\n方式二 通过 mvnrepository 搜索 spark-core找到 spark 对应依赖的 scala 版本\nmvnrepository地址：https://mvnrepository.com/artifact/org.apache.spark/spark-core\n这里整理了一些\nSpark Scala 发布时间 3.5.5 2.12.18 2025-02-27 09:11 3.5.0 2.12.18 2023-09-13 02:08 3.4.4 2.12.17 2024-10-25 08:10 3.4.0 2.12.17 2023-04-13 17:54 3.3.4 2.12.15 2022-06-17 11:11 3.3.1 2.12.15 2022-10-25 07:33 3.3.0 2.12.15 2022-06-17 11:11 3.2.4 2.12.15 2023-04-13 13:46 3.2.0 2.12.15 2021-10-13 09:09 3.1.3 2.12.10 2022-06-17 11:12 3.1.1 2.12.10 2021-03-02 11:01 3.0.3 2.12.10 2022-06-17 11:12 3.0.0 2.12.10 2020-06-16 09:19 2.4.8 2.11.12 2022-06-17 11:13 2.4.0 2.11.12 2018-11-02 04:28 2.3.4 2.11.8 2019-09-09 09:19 2.3.0 2.11.8 2018-05-04 15:42 2.2.3 2.11.8 2019-01-12 18:28 2.2.0 2.11.8 2018-05-04 15:31 总结 Spark、Java、Scala兼容的最低版本\nSpark Java Scala2.12.x Scala2.13.x 3.5.0 21 2.12.18 2.13.11 3.2.0 17 2.12.15 2.13.6 3.0.0 11 2.12.4 2.13.0 3.0.0 8 2.12.0 2.13.0 下载地址 Scala Scala历史版本下载地址：https://scala-lang.org.cn/download/all.html\n2.12.15：https://scala-lang.org/download/2.12.15.html 2.12.18：https://scala-lang.org/download/2.12.18.html 2.13.11：https://scala-lang.org/download/2.13.11.html Spark 所有版本：https://archive.apache.org/dist/spark/\n3.3.1： ","date":"2025-03-11T15:56:15+08:00","permalink":"/p/250311155615/","title":"Spark、Scala、Java版本对应关系"},{"content":"简介 本文将介绍常见系统的环境变量设置\nLinux Bash 配置环境变量的文件\n.bashrc .bash_profile .profile /etc/profile /etc/profile.d/* Zsh 配置环境变量的文件\n.zshrc .zsh_profile /etc/profile /etc/profile.d/* Windows 界面编辑 打开环境变量设置界面的几种方式\nwin+s 搜索 环境变量，点击 编辑系统环境变量，高级 -\u0026gt; 环境变量 如果桌面有 此电脑，右键 此电脑，点击属性，打开关于，右侧找到并点击 高级系统设置 ，点击环境变量 win+i打开设置，点击 系统，左侧下滑点击 关于 ，右侧找到并点击 高级系统设置 ，点击环境变量 \u0026hellip; 方式很多，还有控制面板也可以打开\n打开环境变量设置界面之后，就可以新建了。\n如果要让 cmd或者powershell 中任何位置可以执行程序，需要在 Path 增加指定的程序所在路径\nCMD 查看所有的环境变量\n它会混合显示用户环境变量、系统环境变量和当前会话中临时设置的变量\n1 set 查看指定的环境变量\n例如：查看 path 环境变量值\n1 set path 设置当前会话环境变量\n1 set MYENV=myenv 取消当前会话环境变量\n1 set MYENV= 设置永久用户环境变量\n例如：设置一个名为 MY_USER_ENV，变量值为 my_user_env的系统环境变量\n1 setx MY_USER_ENV \u0026#34;my_user_env\u0026#34; 查看刚才设置的环境变量，需要新开会话才会生效。 set MY_USER_ENV\n取消永久用户环境变量\n这样做只是修改变量为空值，没有真正删除变量\n1 setx MY_USER_ENV \u0026#34;\u0026#34; 设置永久系统环境变量（管理员权限）\n需要加一个参数 /m， 需要用管理员权限打开 CMD 例如：设置一个名为 SYSMYENV，变量值为 sysmyenv的系统环境变量\n1 setx /m MY_SYS_ENV \u0026#34;my_sys_env\u0026#34; 取消永久系统环境变量（管理员权限）\n这样做只是修改变量为空值，没有真正删除变量\n1 setx /m MY_SYS_ENV \u0026#34;\u0026#34; PowerShell 查看所有的环境变量\n它会混合显示用户环境变量、系统环境变量和当前会话中临时设置的变量\n1 Get-ChildItem Env: 查看指定的环境变量\n例如：查看 path 环境变量值\n1 $env:Path 设置当前会话环境变量\n1 $env:MYENV = \u0026#34;myenv\u0026#34; 取消当前会话环境变量\n1 Remove-Item Env:MYENV 设置永久用户环境变量\n例如：设置一个名为 MY_USER_ENV，变量值为 my_user_env的系统环境变量\n1 [Environment]::SetEnvironmentVariable(\u0026#34;MY_USER_ENV\u0026#34;, \u0026#34;my_user_env\u0026#34;, \u0026#34;User\u0026#34;) 查看刚才设置的环境变量，需要新开会话才会生效。 $env:MY_USER_ENV\n取消永久用户环境变量\n1 [Environment]::SetEnvironmentVariable(\u0026#34;MY_USER_ENV\u0026#34;, $null, \u0026#34;User\u0026#34;) 设置永久系统环境变量（管理员权限）\n需要用管理员权限打开 PowerShell 例如：设置一个名为 MY_SYS_ENV，变量值为 my_sys_env的系统环境变量\n1 [Environment]::SetEnvironmentVariable(\u0026#34;MY_SYS_ENV\u0026#34;, \u0026#34;my_sys_env\u0026#34;, \u0026#34;Machine\u0026#34;) 取消永久系统环境变量（管理员权限）\n1 [Environment]::SetEnvironmentVariable(\u0026#34;MY_SYS_ENV\u0026#34;, $null, \u0026#34;Machine\u0026#34;) ","date":"2025-03-11T12:48:50+08:00","permalink":"/p/250311124850/","title":"Linux，Windows系统环境变量设置"},{"content":"简介 VSCode 使用终端的时候，有时候路径太长，比如像这样\n路径后面输入的命令不好查看，最好的办法就是第一行显示路径，换行之后输入执行的命令\n解决办法 这个问题实际上是修改终端的提示符\n归根在于使用什么终端模拟器，一般情况下，VSCode 的默认终端使用的 Powerrshell,实际上是修改 Powerrshell终端提示符。\nPowerShell 在 VSCode 终端输入\n1 notepad $PROFILE 最后一行加入\n1 2 3 4 5 6 function prompt { # 显示当前路径 Write-Host \u0026#34;$PWD\u0026#34; -ForegroundColor Green # 提供第二行输入命令 return \u0026#34;\u0026gt; \u0026#34; } 刷新\n1 . $PROFILE 最终样式\nCMD 临时修改\n1 PROMPT=$P$_$G $P：显示当前路径。 $_：换行符。 $G：显示 \u0026gt;。 永久修改\n在用户环境变量或者系统环境变量新增PROMPT，变量值为\n1 $P$_$G 保存重启\n","date":"2025-03-11T10:28:21+08:00","permalink":"/p/250311102821/","title":"VSCode终端美化显示，第一行显示路径，第二行输入命令"},{"content":"简介 本次介绍的项目是通过 cloudflare workers 部署的临时域名邮箱网站，可生成随机前缀，用于注册不知名的小众网站，保护个人邮箱\n项目：cloudflare_temp_email\n官网：https://temp-mail-docs.awsl.uk/\nGitHub Action 部署 创建 D1 数据库 打开 cloudflare 控制台，选择 Storage \u0026amp; Databases -\u0026gt; # D1 SQL Database -\u0026gt; Create，点击创建数据库\n打开 Console 标签页，输入 schema.sql 的内容，点击 Execute 执行\n可在这里查看全部的数据库文件 db\nGithub Actions 配置 首先 Fork 项目\n打开仓库的 Actions 页面，找到 Deploy Backend 和 Deploy Frontend，点击 enable workflow 启用 workflow\n然后在仓库页面 Settings -\u0026gt; Secrets and variables -\u0026gt; Actions -\u0026gt; Repository secrets, 添加以下 secrets:\nCLOUDFLARE_ACCOUNT_ID: Cloudflare 账户 ID, 参考文档 CLOUDFLARE_API_TOKEN: Cloudflare API Token, 参考文档 BACKEND_TOML: 后端配置文件，参考此处 FRONTEND_ENV: 前端配置文件，请复制 frontend/.env.example的内容，并将 VITE_API_BASE的地址修改为上一步后端的地址。 可参考此处修改 FRONTEND_NAME: 你在 Cloudflare Pages 创建的项目名称，可通过 用户界面 或者 命令行 创建 FRONTEND_BRANCH: (可选) pages 部署的分支，可不配置，默认 production TG_FRONTEND_NAME: (可选) 你在 Cloudflare Pages 创建的项目名称，同 FRONTEND_NAME，如果需要 Telegram Mini App 功能，请填写 DEBUG_MODE: (可选) 是否开启调试模式，配置为 true 开启, 默认 worker 部署日志不会输出到 Github Actions 页面，开启后会输出 BACKEND_USE_MAIL_WASM_PARSER: (可选) 是否使用 wasm 解析邮件，配置为 true 开启, 功能参考 配置 worker 使用 wasm 解析邮件 打开仓库的 Actions 页面，找到 Deploy Backend 和 Deploy Frontend，点击 Run workflow 选择分支手动部署\n","date":"2025-03-10T19:09:14+08:00","permalink":"/p/250310190914/","title":"cloudflare_temp_email，自建域名临时邮箱"},{"content":"简介 Open-WebUI 是一个开源的、功能丰富且用户友好的自托管 AI 平台，主要设计用于与各种大型语言模型 (LLM) 运行器进行交互，并提供一个直观的 Web 用户界面。\n官网：https://openwebui.com/\n源码：https://github.com/open-webui/open-webui\n主要特点和用途 LLM 前端界面： 它提供了一个美观、响应式的 Web 界面，让用户可以方便地与本地或远程部署的大型语言模型（如通过 Ollama 运行的模型）进行对话和交互。它也支持与 OpenAI 兼容的 API。 离线运行能力： 设计为可以完全离线运行，这意味着你可以在本地机器上托管并与 AI 模型交互，无需依赖外部云服务。 多模型支持： 能够管理和切换不同的 LLM 模型，支持包括 LLaMA、Mistral、Qwen、Gemma 等多种开源模型。 会话管理： 提供多会话管理、指令模式等功能，方便用户组织和回顾与 AI 的对话历史。 RAG（检索增强生成）集成： 内置推理引擎，支持 RAG 功能，这意味着它可以结合外部文档或知识库来增强模型的回答，例如与本地 PDF、CSV、TXT、MD、DOCX 等文档进行对话。 功能扩展： 允许通过 Functions 和 Pipelines 等机制进行功能扩展，例如实现自定义函数调用、构建复杂的 RAG 流程、消息监控、速率限制过滤、实时翻译等。 易于部署： 支持通过 Docker、Kubernetes 等容器化技术轻松部署，简化了设置过程。 用户权限管理： 提供细粒度的用户权限和用户组管理功能，确保多用户环境下的安全性和定制化体验。 部署 从源码部署 uv(未完成) 安装 uv\n1 2 # On macOS and Linux. curl -LsSf https://astral.sh/uv/install.sh | sh 1 2 # On Windows. powershell -ExecutionPolicy ByPass -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34; 创建环境，并激活\n1 2 uv venv source .venv/bin/activate 下载 vllm\n1 uv pip install vllm 运行模型\n1 2 # Load and run the model: vllm serve \u0026#34;HuggingFaceTB/SmolLM-135M\u0026#34; pip 1 pip install open-webui 1 open-webui serve Docker docker compose\n此为优化的配置文件，不需要集成 ollama 和拉取模型，最大程度降低资源保证 open-webui 的使用\n1 2 mkdir open-webui \u0026amp;\u0026amp; cd open-webui vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 services: open-webui: image: ghcr.io/open-webui/open-webui:latest container_name: open-webui ports: - 8512:8080 environment: - ENABLE_OPENAI_API=False # 禁用 OpenAI 集成，卡死的原因就是这个 - OFFLINE_MODE=True # 启用离线模式，不从 HuggingFace 拉取模型数据 # - OLLAMA_BASE_URL=http://\u0026lt;Ollama-Server-IP\u0026gt;:\u0026lt;Port\u0026gt; - USE_OLLAMA_DOCKER=False # 不使用集成 Ollama 容器 - TZ=Asia/Shanghai volumes: - ./open-webui_data:/app/backend/data restart: unless-stopped 访问 http://ip:8512\n使用 使用 OpenAI 格式兼容的 API 服务 左下角或者右上角头像 Admin Panel Settings Connections，开启 OpenAI API 添加 api，注意 url 端点需要加上版本号v1 图像生成 左下角或者右上角头像 Admin Panel Settings Images 开启图像生成 选择图像生成服务 Provider URL KEY Model Gemini https://generativelanguage.googleapis.com/v1beta gemini-2.0-flash-preview-image-generation ","date":"2025-03-10T18:54:32+08:00","permalink":"/p/250310185432/","title":"Open-WebUI，一个用户友好界面友好的大模型客户端"},{"content":"查看当前时区\n1 timedatectl 查看所有可用时区\n1 timedatectl list-timezones 设置新时区\n1 sudo timedatectl set-timezone Asia/Shanghai 查看硬件时钟\n1 sudo hwclock --show 同步硬件时钟到系统时间\n1 sudo hwclock --systohc 同步系统时间到硬件时钟\n1 sudo hwclock --hctosys ","date":"2025-03-10T18:45:01+08:00","permalink":"/p/250310184501/","title":"Linux设置时间，时区，同步硬件时钟"},{"content":"在多级器批量操作的时候，使用脚本需要用到 sudo 权限，如果需要输入密码会导致脚本执行失败，所以需要配置\n1 sudo visudo 在最后面新增一行\n1 用户名 ALL=(ALL:ALL) NOPASSWD: ALL 保存退出\n","date":"2025-03-10T14:31:56+08:00","permalink":"/p/250310143156/","title":"Linux设置sudo无须密码"},{"content":" 1 sudo update-alternatives --config editor 选择对应的编辑器\n","date":"2025-03-10T14:29:23+08:00","permalink":"/p/250310142923/","title":"Linux修改默认编辑器"},{"content":"yarn 默认端口\n8088：http服务 ","date":"2025-03-10T00:52:41+08:00","permalink":"/p/250310005241/","title":"Hadoop之yarn"},{"content":"简介 ","date":"2025-03-09T19:22:41+08:00","permalink":"/p/250309192241/","title":"Hadoop高可用配置"},{"content":"启动系统时 长按 Shift 键进入 grub 菜单\n按 e 编辑启动项\n找到以 linux 开头的行\n删除最后部分 ro Quiet...\n替换为 rw init=/bin/bash\nCtrl+x 或者 F10 重启系统\n重置密码 passwd\n重启\n","date":"2025-03-08T11:34:48+08:00","permalink":"/p/250308113448/","title":"Linux忘记root账户密码恢复办法"},{"content":"简介 本篇将介绍 Pandas 的基础知识\n准备 快速创建一个可以使用 Pandas 的环境，可以使用 Minconda 快速创建\n1 2 3 conda create --name pandas conda activate pandas conda install pandas 使用 VSCode 编写代码\n安装插件 jupyter\nDataFrame 关于这部分的内容，通过代码分享作为说明\n","date":"2025-03-05T22:30:57+08:00","permalink":"/p/250305223057/","title":"Pandas入门教程"},{"content":"简介 安装 Windows 下载地址：https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe\n配置 配置包下载加速镜像 使用 Anaconda Prompt 进入 conda 环境\n修改用户目录下的 .condarc 文件来使用镜像站。\n不同系统下的 .condarc 目录如下：\nLinux: ${HOME}/.condarc macOS: ${HOME}/.condarc Windows: C:\\Users\\\u0026lt;YourUserName\u0026gt;\\.condarc 修改 conda 源为国内镜像源\n1 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 1 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 1 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ 设置搜索时，显示通道的地址\n1 conda config --set show_channel_urls yes 查看通道地址\n1 conda config --show channels 使用 使用 Anaconda Prompt 进入 conda 环境\n创建环境名为 pandas 的环境\n1 conda create --name pandas 激活环境\n1 conda activate pandas 取消激活的环境\n1 conda deactivate pandas 查看当前环境下的包\n1 conda list 添加指定名字的包\n1 conda install pandas ","date":"2025-03-05T22:26:07+08:00","permalink":"/p/250305222607/","title":"Minconda安装使用"},{"content":"简介 本文将介绍如何利用 ai 工具生成 PPT 文档\n使用 deepseek-r1 生成高质量内容 得益于 deepseek-r1 的强大，我们可以使用它来生成 PPT 的内容，输出为 markdown 格式，\n为了让 r1 更好的理解我们的需求，所以写提示词是一个技术活，需要把自己的需求写清晰\n提示词模板\n1 请用Markdown格式生成一份关于[你的主题]的PPT大纲，需包含封面、目录、3个核心章节（每章至少2个子论点）、总结页，语言简洁专业。 小技巧：加上“避免口语化”“需数据支撑”等要求，内容会更严谨\n提供 DeepSeek-R1 服务的网站\ndeepseek 官网 火山引擎：含邀请码 4AUI6XW8，最高可获 145 元代金券 火山引擎：无邀请码 硅基流动：含邀请码 Uazrw9Jb，可获 2000 万 Tokens 硅基流动：无邀请码 使用 Kimi+PPT 助手生成 PPT deepseek-r1 虽然能输出内容，但是却不能直接生成 PPT，自己排版也是个技术活，这种东西也可以交给第三方工具\nKimi+PPT 助手点击跳转\n进入助手之后，将内容粘贴进对话框，确认内容后，选好一个 PPT 模板，就可以自动生成 PPT 了\n","date":"2025-03-02T23:46:45+08:00","permalink":"/p/250302234645/","title":"使用deepseek-r1和kimi+PPT助手生成PPT演示文档"},{"content":"简介 Ollama 是一个开源的，可部署在本地的大模型工具\n本篇将介绍通过网络空间测绘找到暴露在公网的ollama服务\nfofa 地址：https://fofa.info\n搜索语法\n1 app=\u0026#34;Ollama\u0026#34; \u0026amp;\u0026amp; is_domain=false \u0026amp;\u0026amp; country=\u0026#34;CN\u0026#34; Shodan 地址：https://www.shodan.io/\n搜索语法\n1 Ollama is running 使用 查看支持的模型\n1 IP:11434/api/tags ","date":"2025-03-02T23:01:44+08:00","permalink":"/p/250302230144/","title":"Ollama可被网络空间扫描找到"},{"content":"简介 go 可以在一个平台上编译其他平台的可执行文件，称为交叉编译\n交叉编译 使用交叉编译只需要设置以下几步\n设置 CGO_ENABLED 为 0 设置 GOOS 环境变量，选择你的目标操作系统 设置 GOARCH 环境变量，选择你的目标 CPU 架构 Windows 下编译\n编译为 windows amd64\n1 2 3 4 set CGO_ENABLED=0 set GOOS=windows set GOARCH=amd64 go build 编译为 windows arm64\n1 2 3 4 set CGO_ENABLED=0 set GOOS=windows set GOARCH=arm64 go build 编译为 linux amd64\n1 2 3 4 set CGO_ENABLED=0 set GOOS=linux set GOARCH=amd64 go build 案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # Define configuration file and extract app name/version APP_CONFIG_FILE := ./config/config.toml APP_NAME := $(shell sed -n \u0026#39;s/^name = \u0026#34;\\(.*\\)\u0026#34;/\\1/p\u0026#39; \u0026lt; $(APP_CONFIG_FILE)) APP_VERSION := $(shell sed -n \u0026#39;s/^version = \u0026#34;\\(.*\\)\u0026#34;/\\1/p\u0026#39; \u0026lt; $(APP_CONFIG_FILE)) # Build directory BUILD_DIR := ./build # Supported platforms PLATFORMS := windows-amd64 linux-amd64 darwin-amd64 # Platform-specific suffixes WINDOWS_SUFFIX := .exe DEFAULT_SUFFIX := # Clean build artifacts clean: go clean rm -rf $(BUILD_DIR) # Build for all platforms build: @mkdir -p $(BUILD_DIR) @for platform in $(PLATFORMS); do \\ os=$$(echo $$platform | cut -d \u0026#39;-\u0026#39; -f 1); \\ arch=$$(echo $$platform | cut -d \u0026#39;-\u0026#39; -f 2); \\ suffix=$$DEFAULT_SUFFIX; \\ if [ \u0026#34;$$os\u0026#34; = \u0026#34;windows\u0026#34; ]; then \\ suffix=$(WINDOWS_SUFFIX); \\ fi; \\ echo \u0026#34;Building for GOOS=$$os GOARCH=$$arch platform=$$platform with suffix $$suffix\u0026#34;; \\ GOOS=$$os GOARCH=$$arch go build -o $(BUILD_DIR)/$(APP_NAME)-$(APP_VERSION)-$$platform$$suffix main.go; \\ done # Default target all: clean build 执行如下命令编译\n1 make all 附录 GOOS 和 GOARCH 可选值对应表 $GOOS $GOARCH aix ppc64 android 386 android amd64 android arm android arm64 darwin amd64 darwin arm64 dragonfly amd64 freebsd 386 freebsd amd64 freebsd arm illumos amd64 ios arm64 js wasm linux 386 linux amd64 linux arm linux arm64 linux loong64 linux mips linux mipsle linux mips64 linux mips64le linux ppc64 linux ppc64le linux riscv64 linux s390x netbsd 386 netbsd amd64 netbsd arm openbsd 386 openbsd amd64 openbsd arm openbsd arm64 plan9 386 plan9 amd64 plan9 arm solaris amd64 wasip1 wasm windows 386 windows amd64 windows arm windows arm64 参考：https://go.dev/doc/install/source#environment\n","date":"2025-03-02T10:17:46+08:00","permalink":"/p/250302101746/","title":"Go语言交叉编译"},{"content":"简介 之前介绍了一片 Windows 安装 gcc 环境，今天介绍第二种选择\nw64devkit\n项目地址：https://github.com/skeeto/w64devkit\n安装 直接下载：https://github.com/skeeto/w64devkit/releases/download/v2.1.0/w64devkit-x64-2.1.0.exe\n下载之后，Windows 10 上报毒，我查看了 issuse，这是一个误报，所以在 Windows 安全中心信任它\n安装下载的可执行文件\n将解压的文件夹目录下 bin 文件夹所在的路径添加到环境变量\n","date":"2025-03-02T10:09:16+08:00","permalink":"/p/250302100916/","title":"Windows安装gcc环境第二种选择，w64devkit"},{"content":" 信息 站点已使用 vercount 开启统计功能，包含：\n总访问量统计 总访客量统计 页面访问量统计 ","date":"2025-03-01T22:09:46+08:00","permalink":"/p/250301220946/","title":"2025-03-01开启站点统计"},{"content":"简介 Linux 上有三个命令行工具用来处理数据，分别是grep、sed 和 awk，通常它们被称为 Shell 三剑客（或文本处理三剑客）。 它们是 Unix/Linux 系统中非常强大且常用的文本处理工具，各自擅长不同的任务：\ngrep: 主要用于查找文本，根据模式（pattern）匹配行，并输出匹配的行。\nsed: 主要用于编辑文本，可以进行替换、删除、插入、追加等操作。它是一个流编辑器，逐行处理文本。\nawk: 主要用于分析和处理文本，可以将文本分割成字段，并对字段进行各种操作，例如计算、格式化输出等。它是一种编程语言，可以编写复杂的脚本。\n这三个工具经常一起使用，构成强大的文本处理流水线。 例如，可以使用 grep 查找包含特定模式的行，然后使用 sed 对这些行进行编辑，最后使用 awk 对编辑后的结果进行分析和格式化输出。\ngrep 这是一个命令行搜索工具，可以在文件或输入流中搜索特定模式的行\n结合管道命令将执行的结果传递给后面，对于完成一些复杂的操作很友好 好的，以下是 grep 的基本语法和常用选项：\n基本结构 1 grep [OPTIONS] PATTERN [FILE...] grep: 调用 grep 命令。 [OPTIONS]: 可选的选项，用于修改 grep 的行为。 PATTERN: 要搜索的模式，通常是一个字符串或正则表达式。 [FILE...]: 要搜索的文件名。可以指定多个文件，如果省略，则 grep 从标准输入读取数据。 常用选项 -i (或 --ignore-case): 忽略大小写。 -v (或 --invert-match): 反向匹配，只显示不匹配 PATTERN 的行。 -n (或 --line-number): 显示匹配行的行号。 -c (或 --count): 只显示匹配行的数量，而不是匹配的行本身。 -l (或 --files-with-matches): 只显示包含匹配行的文件名，而不显示匹配的行本身。 -L (或 --files-without-match): 只显示不包含匹配行的文件名。 -r (或 -R 或 --recursive): 递归搜索目录下的所有文件。 -h (或 --no-filename): 在输出中不显示文件名。 当搜索多个文件时，默认会显示文件名。 -H (或 --with-filename): 在输出中显示文件名。 这是默认行为，但可以用来覆盖 -h 选项。 -w (或 --word-regexp): 只匹配完整的单词。 -x (或 --line-regexp): 只匹配整行都匹配的情况。 -o (或 --only-matching): 只显示匹配的部分，而不是整行。 -q (或 --quiet 或 --silent): 静默模式，不输出任何信息，只返回退出状态码（0 表示找到匹配，1 表示没有找到匹配）。 -s (或 --no-messages): 禁止显示错误消息。 -b (或 --byte-offset): 显示匹配行的字节偏移量。 -m NUM (或 --max-count=NUM): 在找到 NUM 个匹配行后停止搜索。 -A NUM (或 --after-context=NUM): 显示匹配行之后 NUM 行。 -B NUM (或 --before-context=NUM): 显示匹配行之前 NUM 行。 -C NUM (或 --context=NUM): 显示匹配行之前和之后 NUM 行。 -e PATTERN: 指定多个搜索模式。例如，grep -e \u0026quot;pattern1\u0026quot; -e \u0026quot;pattern2\u0026quot; file.txt。 -f FILE (或 --file=FILE): 从文件中读取搜索模式，每行一个模式。 --color[=WHEN]: 高亮显示匹配的部分。WHEN 可以是 always、auto 或 never。 -E (或 --extended-regexp): 使用扩展正则表达式。 -F (或 --fixed-strings): 将 PATTERN 解释为固定字符串，而不是正则表达式。 -P (或 --perl-regexp): 使用 Perl 兼容的正则表达式（PCRE）。 -d ACTION (或 --directories=ACTION): 指定如何处理目录。ACTION 可以是 read (默认)、skip 或 recurse。 -exclude=GLOB: 跳过文件名匹配 GLOB 模式的文件或目录。 -exclude-dir=DIR: 在递归搜索中，排除 DIR 目录。 模式 (PATTERN) 普通字符串: 例如，grep \u0026quot;hello\u0026quot; file.txt。 正则表达式: 例如，grep \u0026quot;^[0-9]\u0026quot; file.txt 匹配以数字开头的行。 grep -E \u0026quot;pattern1|pattern2\u0026quot; file.txt 匹配包含 \u0026ldquo;pattern1\u0026rdquo; 或 \u0026ldquo;pattern2\u0026rdquo; 的行（使用扩展正则表达式）。 正则表达式中的特殊字符 . (点)：匹配任意单个字符（除了换行符）。 * (星号)：匹配前一个字符零次或多次。 + (加号)：匹配前一个字符一次或多次（需要 -E 选项）。 ? (问号)：匹配前一个字符零次或一次（需要 -E 选项）。 [] (字符类)：匹配方括号中的任意一个字符。 例如，[abc] 匹配 \u0026ldquo;a\u0026rdquo;、\u0026ldquo;b\u0026rdquo; 或 \u0026ldquo;c\u0026rdquo;。 [^] (否定字符类)：匹配不在方括号中的任意一个字符。 例如，[^abc] 匹配除了 \u0026ldquo;a\u0026rdquo;、\u0026ldquo;b\u0026rdquo; 和 \u0026ldquo;c\u0026rdquo; 之外的任意字符。 ^ (脱字符)：匹配行首。 在字符类中表示否定。 $ (美元符号)：匹配行尾。 \\ (反斜杠)：转义特殊字符，使其失去特殊含义。 例如，\\. 匹配字面上的点字符。 \\| (管道符)：表示或（需要 -E 选项）。 例如，foo\\|bar 匹配 \u0026ldquo;foo\u0026rdquo; 或 \u0026ldquo;bar\u0026rdquo;。 () (圆括号)：用于分组和捕获匹配的子字符串（需要 -E 选项）。 {} (花括号)：用于指定匹配次数的范围（需要 -E 选项）。 例如，a{2,4} 匹配 \u0026ldquo;a\u0026rdquo; 出现 2 到 4 次。 \\b：匹配单词边界。 \\w：匹配单词字符（字母、数字和下划线）。 \\s：匹配空白字符（空格、制表符等）。 \\d：匹配数字（某些 grep 版本支持，或者使用 [0-9]）。 \\\u0026lt;：匹配单词的开头（某些 grep 版本支持）。 \\\u0026gt;：匹配单词的结尾（某些 grep 版本支持）。 退出状态码 0: 找到匹配的行。 1: 没有找到匹配的行。 2: 发生错误。 示例 在文件 file.txt 中搜索包含 \u0026ldquo;hello\u0026rdquo; 的行:\n1 grep \u0026#34;hello\u0026#34; file.txt 在文件 file.txt 中搜索包含 \u0026ldquo;hello\u0026rdquo; 的行，忽略大小写:\n1 grep -i \u0026#34;hello\u0026#34; file.txt 在文件 file.txt 中搜索不包含 \u0026ldquo;hello\u0026rdquo; 的行:\n1 grep -v \u0026#34;hello\u0026#34; file.txt 在文件 file.txt 中搜索以数字开头的行:\n1 grep \u0026#34;^[0-9]\u0026#34; file.txt 在文件 file.txt 中搜索以 \u0026ldquo;hello\u0026rdquo; 结尾的行:\n1 grep \u0026#34;hello$\u0026#34; file.txt 在文件 file.txt 中搜索完整的单词 \u0026ldquo;hello\u0026rdquo;:\n1 grep -w \u0026#34;hello\u0026#34; file.txt 递归搜索当前目录下所有文件中包含 \u0026ldquo;hello\u0026rdquo; 的行:\n1 grep -r \u0026#34;hello\u0026#34; . 只显示包含 \u0026ldquo;hello\u0026rdquo; 的文件名:\n1 grep -l \u0026#34;hello\u0026#34; * 显示匹配行及其行号:\n1 grep -n \u0026#34;hello\u0026#34; file.txt 显示匹配行之前的 2 行:\n1 grep -B 2 \u0026#34;hello\u0026#34; file.txt 显示匹配行之后的 2 行:\n1 grep -A 2 \u0026#34;hello\u0026#34; file.txt 显示匹配行前后各 2 行:\n1 grep -C 2 \u0026#34;hello\u0026#34; file.txt 统计包含 \u0026ldquo;hello\u0026rdquo; 的行数:\n1 grep -c \u0026#34;hello\u0026#34; file.txt 从文件中读取搜索模式:\n1 grep -f patterns.txt file.txt 使用扩展正则表达式搜索包含 \u0026ldquo;foo\u0026rdquo; 或 \u0026ldquo;bar\u0026rdquo; 的行:\n1 grep -E \u0026#34;foo|bar\u0026#34; file.txt 管道中使用 grep:\n1 ls -l | grep \u0026#34;file.txt\u0026#34; 注意事项 grep 默认区分大小写。 如果 PATTERN 包含空格或其他特殊字符，最好用引号括起来。 正则表达式是 grep 的重要组成部分，需要熟练掌握。 不同版本的 grep 在正则表达式的支持上可能有所差异。GNU grep 提供了更强大的正则表达式功能。 使用 Shell 变量：如果想在grep命令中使用 Shell 变量，要使用双引号\u0026quot;\u0026quot;，这样 Shell 变量会被展开。 如果使用单引号，则变量不会被展开，而是会被当做普通字符串。 grep --help 可以查看 grep 的帮助信息。 sed sed 是一个文本处理工具，用于在命令行中对文件中的文本进行修改。它的输入可以是文件，也可以从管道读取数据\n基本结构 1 2 3 sed \u0026#39;command\u0026#39; 文件名 sed -e \u0026#39;command1\u0026#39; -e \u0026#39;command2\u0026#39; ... 文件名 sed -f scriptfile 文件名 sed: 调用 sed 命令。 'command': 要执行的 sed 命令。 命令用单引号括起来。 -e 'command': 允许指定多个命令。 -f scriptfile: 从文件中读取命令。 文件名: 要处理的文件名。 如果省略，则 sed 从标准输入读取数据。 常用命令 s/regexp/replacement/flags (替换)： s: 表示替换命令。 regexp: 正则表达式，匹配要替换的内容。 replacement: 替换后的内容。 flags: 可选的标志： g: 全局替换，替换所有匹配项，而不是只替换第一个。 i: 忽略大小写。 w 文件名: 将替换结果写入指定的文件。 1, 2, \u0026hellip;, 9: 只替换第 N 个匹配项。 d (删除)：删除行。 a text (追加)：在当前行之后追加文本。 i text (插入)：在当前行之前插入文本。 c text (更改)：将当前行替换为文本。 p (打印)：打印当前行（通常与 -n 选项一起使用，用于抑制默认输出）。 n (下一行)：读取下一行，然后执行命令。 q (退出)：退出 sed。 r 文件名 (读取)：将指定文件的内容追加到当前行之后。 w 文件名 (写入)：将匹配的行写入指定的文件。 y/source/dest/ (转换)：将 source 中的字符转换为 dest 中对应的字符（类似于 tr 命令）。 = (行号)：打印行号。 ! (非)：反转选择的含义。 例如，sed '/pattern/!d' file 删除所有不匹配 pattern 的行。 { } (分组)：将多个命令组合在一起。 地址 (Addresses) 地址用于指定命令作用的行。 地址可以是：\n行号: 例如，10 表示第 10 行。 $: 最后一行。 正则表达式: 例如，/pattern/ 表示匹配 pattern 的行。 范围: 行号1,行号2: 从行号 1 到行号 2 的范围（包括这两行）。 /pattern1/,/pattern2/: 从匹配 pattern1 的行到匹配 pattern2 的行（包括这两行）。 行号,/pattern/: 从指定行号到匹配 pattern 的行。 /pattern/,行号: 从匹配 pattern 的行到指定行号。 如果省略地址，则命令作用于所有行。\n常用选项 -n (安静模式)：抑制默认输出（只打印由 p 命令显式打印的行）。 -i[SUFFIX] (原地编辑)：直接修改文件内容。 SUFFIX 是可选的备份文件名后缀。 例如，sed -i.bak 's/foo/bar/g' file.txt 会将 file.txt 中所有的 \u0026ldquo;foo\u0026rdquo; 替换为 \u0026ldquo;bar\u0026rdquo;，并将原始文件备份为 file.txt.bak。 重要提示： 使用 -i 选项要小心，因为这会永久更改文件。 不加 SUFFIX 会直接修改，不做备份，更要小心。 -e script (多命令)：允许在命令行中指定多个命令。 -f scriptfile (脚本文件)：从文件中读取命令。 -r (扩展正则表达式)：使用扩展正则表达式，例如可以使用 +, ?, | 等元字符。 （GNU sed） -E (扩展正则表达式)： 与 -r 效果相同，POSIX 标准。（BSD sed, macOS） 示例 将文件 file.txt 中所有的 \u0026ldquo;foo\u0026rdquo; 替换为 \u0026ldquo;bar\u0026rdquo;，并打印到标准输出:\n1 sed \u0026#39;s/foo/bar/g\u0026#39; file.txt 将文件 file.txt 中所有的 \u0026ldquo;foo\u0026rdquo; 替换为 \u0026ldquo;bar\u0026rdquo;，并直接修改文件:\n1 sed -i \u0026#39;s/foo/bar/g\u0026#39; file.txt 将文件 file.txt 中所有的 \u0026ldquo;foo\u0026rdquo; 替换为 \u0026ldquo;bar\u0026rdquo;，并备份原始文件为 file.txt.bak:\n1 sed -i.bak \u0026#39;s/foo/bar/g\u0026#39; file.txt 删除文件 file.txt 中的所有空行:\n1 sed \u0026#39;/^$/d\u0026#39; file.txt 打印文件 file.txt 的第 10 行:\n1 sed -n \u0026#39;10p\u0026#39; file.txt 打印文件 file.txt 中包含 \u0026ldquo;error\u0026rdquo; 的行:\n1 sed -n \u0026#39;/error/p\u0026#39; file.txt 删除文件 file.txt 中从包含 \u0026ldquo;start\u0026rdquo; 的行到包含 \u0026ldquo;end\u0026rdquo; 的行:\n1 sed \u0026#39;/start/,/end/d\u0026#39; file.txt 在文件 file.txt 的每一行之后追加 \u0026ldquo;\u0026mdash;\u0026rdquo;:\n1 sed \u0026#39;a ---\u0026#39; file.txt 将文件 file.txt 中的前 10 行写入 output.txt:\n1 sed \u0026#39;1,10w output.txt\u0026#39; file.txt 将文件 file.txt 中的所有小写字母转换为大写字母:\n1 sed \u0026#39;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/\u0026#39; file.txt 删除文件 file.txt 中的注释行（以 # 开头的行）:\n1 sed \u0026#39;/^#/d\u0026#39; file.txt 使用多个命令将文件 file.txt 中的 \u0026ldquo;foo\u0026rdquo; 替换为 \u0026ldquo;bar\u0026rdquo;，并将 \u0026ldquo;hello\u0026rdquo; 替换为 \u0026ldquo;world\u0026rdquo;:\n1 sed -e \u0026#39;s/foo/bar/g\u0026#39; -e \u0026#39;s/hello/world/g\u0026#39; file.txt 从脚本文件 script.sed 中读取命令:\n1 sed -f script.sed file.txt 仅替换每行中第一次出现的\u0026quot;foo\u0026quot; 为 \u0026ldquo;bar\u0026rdquo;\n1 sed \u0026#39;s/foo/bar/\u0026#39; file.txt 替换每行中第三次出现的\u0026quot;foo\u0026quot; 为 \u0026ldquo;bar\u0026rdquo;\n1 sed \u0026#39;s/foo/bar/3\u0026#39; file.txt 正则表达式中的特殊字符 . (点)：匹配任意单个字符（除了换行符）。 * (星号)：匹配前一个字符零次或多次。 + (加号)：匹配前一个字符一次或多次（扩展正则表达式，需要 -r 或 -E 选项）。 ? (问号)：匹配前一个字符零次或一次（扩展正则表达式，需要 -r 或 -E 选项）。 [] (字符类)：匹配方括号中的任意一个字符。 例如，[abc] 匹配 \u0026ldquo;a\u0026rdquo;、\u0026ldquo;b\u0026rdquo; 或 \u0026ldquo;c\u0026rdquo;。 [^] (否定字符类)：匹配不在方括号中的任意一个字符。 例如，[^abc] 匹配除了 \u0026ldquo;a\u0026rdquo;、\u0026ldquo;b\u0026rdquo; 和 \u0026ldquo;c\u0026rdquo; 之外的任意字符。 ^ (脱字符)：匹配行首。 在字符类中表示否定。 $ (美元符号)：匹配行尾。 \\ (反斜杠)：转义特殊字符，使其失去特殊含义。 例如，\\. 匹配字面上的点字符。 \\| (管道符)：表示或（扩展正则表达式，需要 -r 或 -E 选项）。 例如，foo\\|bar 匹配 \u0026ldquo;foo\u0026rdquo; 或 \u0026ldquo;bar\u0026rdquo;。 () (圆括号)：用于分组和捕获匹配的子字符串。 捕获的子字符串可以在 replacement 中使用 \\1, \\2 等引用。 {} (花括号)：用于指定匹配次数的范围。 例如，a{2,4} 匹配 \u0026ldquo;a\u0026rdquo; 出现 2 到 4 次。 \\b：匹配单词边界。 \\w：匹配单词字符（字母、数字和下划线）。 \\s：匹配空白字符（空格、制表符等）。 \\d：匹配数字。 (某些 sed 版本支持) \\\u0026lt;：匹配单词的开头。 \\\u0026gt;：匹配单词的结尾。 注意事项 sed 默认不会修改原始文件，而是将处理结果输出到标准输出。 使用 -i 选项可以修改原始文件。 正则表达式是 sed 的重要组成部分，需要熟练掌握。 使用 -i 选项时要小心，最好先备份文件。 不同版本的 sed 在正则表达式的支持上可能有所差异。 GNU sed 提供了更强大的正则表达式功能。 使用 Shell 变量：如果想在sed命令中使用 Shell 变量，要使用双引号\u0026quot;\u0026quot;，这样 Shell 变量会被展开。 如果使用单引号，则变量不会被展开，而是会被当做普通字符串。 awk awk 是一种文本处理工具，主要用于从文本文件中提取数据并进行格式化输出。 它是一种编程语言，允许你编写脚本来处理文本数据。 awk 逐行读取输入文件，将每一行分割成字段，然后根据你定义的规则对这些字段进行处理。 好的，以下是 awk 的基本语法和常用特性：\n基本结构 1 awk \u0026#39;pattern { action }\u0026#39; file(s) awk: 调用 awk 命令。 'pattern { action }': 这是 awk 的程序，用单引号括起来。 pattern: 一个条件表达式（可选）。 如果省略，则对每一行都执行 action。 pattern 可以是： 正则表达式： /regex/ 比较表达式： NR == 2, $1 \u0026gt; 10 范围模式： /start/, /end/ 组合模式： pattern1 \u0026amp;\u0026amp; pattern2, pattern1 || pattern2, !pattern { action }: 要执行的动作。 action 可以包含一个或多个语句，用分号分隔。 如果省略，则默认动作为 print $0 (打印整行)。 file(s): 要处理的一个或多个文件名（可选）。 如果省略，则 awk 从标准输入读取数据。 动作 (Actions) 一些常用的 actions:\nprint: 打印。 print $0: 打印整行。 print $1: 打印第一个字段。 print $1, $2: 打印第一个和第二个字段，用 OFS 分隔 (默认空格)。 print \u0026quot;Hello\u0026quot;, $1: 打印字符串 \u0026ldquo;Hello\u0026rdquo; 和第一个字段，用 OFS 分隔。 printf: 格式化打印，类似于 C 语言的 printf。 printf \u0026quot;%s %d\\n\u0026quot;, $1, $2: 打印第一个字段（字符串）和第二个字段（整数），并换行。 赋值: 给变量赋值。 count = count + 1 name = $1 控制流语句: if (condition) { statements } else { statements } for (i = 1; i \u0026lt;= NF; i++) { statements } while (condition) { statements } do { statements } while (condition) break continue exit next: 跳过当前行，处理下一行。 delete array[index]: 删除数组元素。 字段和记录 字段: 每一行被分割成多个字段，默认分隔符是空格或制表符。 $1: 第一个字段。 $2: 第二个字段。 $NF: 最后一个字段 (NF 是字段数)。 $0: 整行记录。 记录: 每一行被称为一个记录。 FS (Field Separator): 字段分隔符，默认是空格或制表符。 可以用 -F 选项或在 BEGIN 块中设置。 RS (Record Separator): 记录分隔符，默认是换行符。 OFS (Output Field Separator): 输出字段分隔符，默认是空格。 ORS (Output Record Separator): 输出记录分隔符，默认是换行符。 NF (Number of Fields): 当前记录的字段数。 NR (Number of Records): 当前记录的行号 (从 1 开始)。 模式 (Patterns) 正则表达式: /pattern/: 匹配包含 pattern 的行。 $1 ~ /pattern/: 匹配第一个字段包含 pattern 的行。 $1 !~ /pattern/: 匹配第一个字段不包含 pattern 的行。 比较表达式: NR == 2: 匹配第二行。 $1 \u0026gt; 10: 匹配第一个字段大于 10 的行。 $2 == \u0026quot;abc\u0026quot;: 匹配第二个字段等于 \u0026ldquo;abc\u0026rdquo; 的行。 范围模式: /start/, /end/: 匹配从包含 start 的行到包含 end 的行（包括这两行）。 组合模式: $1 \u0026gt; 10 \u0026amp;\u0026amp; $2 \u0026lt; 20: 匹配第一个字段大于 10 并且第二个字段小于 20 的行。 $1 == \u0026quot;a\u0026quot; || $2 == \u0026quot;b\u0026quot;: 匹配第一个字段等于 \u0026ldquo;a\u0026rdquo; 或者第二个字段等于 \u0026ldquo;b\u0026rdquo; 的行。 !($1 == \u0026quot;c\u0026quot;): 匹配第一个字段不等于 \u0026ldquo;c\u0026rdquo; 的行。 BEGIN 和 END 块: BEGIN { actions }: 在处理任何输入之前执行 actions。 END { actions }: 在处理完所有输入之后执行 actions。 变量 内置变量: FS, RS, OFS, ORS, NF, NR (前面已介绍) FILENAME: 当前文件名。 FNR: 当前文件中的行号。 ARGC: 命令行参数的数量。 ARGV: 命令行参数数组。 用户自定义变量: 变量名以字母开头，可以包含字母、数字和下划线。 数组 array[index] = value 可以用字符串作为数组索引 (关联数组)。 for (index in array) { ... }: 遍历数组。 delete array[index]: 删除数组元素。 函数 内置函数:\n字符串函数: length(), substr(), index(), split(), tolower(), toupper() 数学函数: sqrt(), sin(), cos(), rand(), srand() 时间函数: systime(), strftime() 用户自定义函数:\n1 2 3 4 function function_name(parameter1, parameter2, ...) { statements return value # 可选 } 示例 打印每一行的第一个字段:\n1 awk \u0026#39;{print $1}\u0026#39; file.txt 打印第二行:\n1 awk \u0026#39;NR == 2\u0026#39; file.txt 打印所有包含 \u0026ldquo;error\u0026rdquo; 的行:\n1 awk \u0026#39;/error/\u0026#39; file.txt 打印第一个字段大于 10 的行的第二个字段:\n1 awk \u0026#39;$1 \u0026gt; 10 {print $2}\u0026#39; file.txt 统计文件中所有行的字段总数:\n1 awk \u0026#39;{sum += NF} END {print sum}\u0026#39; file.txt 使用逗号作为字段分隔符，并打印每行的第一个和第三个字段:\n1 awk -F\u0026#39;,\u0026#39; \u0026#39;{print $1, $3}\u0026#39; file.txt 在处理文件之前设置字段分隔符，并在处理完文件后打印总行数:\n1 awk \u0026#39;BEGIN {FS = \u0026#34;,\u0026#34;} {print $1} END {print \u0026#34;Total lines:\u0026#34;, NR}\u0026#39; file.txt 将所有行的第一个字段转换为大写:\n1 awk \u0026#39;{ $1 = toupper($1); print $0 }\u0026#39; file.txt 更详细的说明\n可以参考 GNU Awk 用户手册：https://www.gnu.org/software/gawk/manual/gawk.html 很多在线教程和示例，搜索 \u0026ldquo;awk tutorial\u0026rdquo; 就能找到。 ","date":"2025-03-01T18:29:05+08:00","permalink":"/p/250301182905/","title":"Shell三剑客awk，sed，grep使用教程"},{"content":" 1 cat /etc/os-release 1 cat /etc/lsb-release 1 lsb_release -a 1 cat /etc/issue 1 hostnamectl ","date":"2025-03-01T10:11:34+08:00","permalink":"/p/250301101134/","title":"Linux查看当前系统发行版本"},{"content":"简介 Linux 下负责配置 DNS 服务器是在/etc/resolv.conf文件中，但是修改它重启就会失效\nUbuntu 使用 netplan 配置 DNS 也是无法生效\n查看 /etc/resolv.conf 文件，它是一个软链接，指向 /run/systemd/resolve/resolv.conf\n原因是它是由 systemd-resoved 服务接管自动配置\n按理说 netplan 设置也会生效，为何不生效？\n经我测试，netplan 设置后确实生效，/run/systemd/resolve/resolv.conf的内容被修改了，但是，/etc/resolv.conf虽然是一个软链接到 /run/systemd/resolve/resolv.conf，但还是原来的内容。说明这个软链接是个假的软链接。\n解决办法就是删除 /etc/resolv.conf ，重新创建它，指向/run/systemd/resolve/resolv.conf\n1 sudo rm -rf /etc/resolv.conf 1 sudo ln -s /run/systemd/resolve/resolv.conf /etc/ DNS 配置 根据前文所说，有两种方式配置 DNS，\n一种是修改 netplan 配置 一种是修改 /etc/systemd/resolved.conf 二选其一即可，推荐修改 netplan 配置\n方式一 修改 netplan 配置，50-cloud-init.yaml 为配置文件，你的可能不一样\n1 sudo vim /etc/netplan/50-cloud-init.yaml 在 配置文件中指定 DNS 服务器\n1 2 3 4 5 6 7 8 9 10 network: ethernets: enp0s3: dhcp4: true nameservers: addresses: [223.5.5.5,8.8.8.8] #dns enp0s8: dhcp4: false addresses: [192.168.56.102/24] version: 2 应用配置\n1 sudo netplan apply 查看 /run/systemd/resolve/resolv.conf 中的内容\n1 sudo cat /run/systemd/resolve/resolv.conf 如下\n1 2 3 4 5 6 7 nameserver 223.5.5.5 nameserver 8.8.8.8 nameserver 10.0.2.3 # Too many DNS servers configured, the following entries may be ignored. nameserver fd00::3 nameserver 192.168.56.1 search lan 方式二 修改 /etc/systemd/resolved.conf\n1 sudo vim /etc/systemd/resolved.conf 在 配置文件中指定 DNS 服务器\n1 2 3 4 5 6 [Resolve] # Some examples of DNS servers which may be used for DNS= and FallbackDNS=: # Cloudflare: 1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com 2606:4700:4700::1111#cloudflare-dns.com 2606:4700:4700::1001#cloudflare-dns.com # Google: 8.8.8.8#dns.google 8.8.4.4#dns.google 2001:4860:4860::8888#dns.google 2001:4860:4860::8844#dns.google # Quad9: 9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net 2620:fe::fe#dns.quad9.net 2620:fe::9#dns.quad9.net DNS=223.5.5.5 8.8.8.8 保存退出，重启 systemd-resolved，\n1 sudo systemctl restart systemd-resolved 查看 /run/systemd/resolve/resolv.conf 中的内容\n1 sudo cat /run/systemd/resolve/resolv.conf 如下\n1 2 3 4 5 6 7 nameserver 223.5.5.5 nameserver 8.8.8.8 nameserver 10.0.2.3 # Too many DNS servers configured, the following entries may be ignored. nameserver fd00::3 nameserver 192.168.56.1 search lan ","date":"2025-03-01T09:39:37+08:00","permalink":"/p/250301093937/","title":"Ubuntu22.04修改DNS"},{"content":"4A4RR-813DK-M81A9-4U35H-06KND\nNZ4RR-FTK5H-H81C1-Q30QH-1V2LA\nJU090-6039P-08409-8J0QH-2YR7F\n4Y09U-AJK97-089Z0-A3054-83KLA\n4C21U-2KK9Q-M8130-4V2QH-CF810\nMC60H-DWHD5-H80U9-6V85M-8280D\nZA30U-DXF84-4850Q-UMMXZ-W6K8F\nAC590-2XW97-48EFZ-TZPQE-MYHEA\nYF39K-DLFE5-H856Z-6NWZE-XQ2XD\nAC15R-FNZ16-H8DWQ-WFPNV-M28E2\nCZ1J8-A0D82-489LZ-ZMZQT-P3KX6\nYA11K-6YE8H-H89ZZ-EXM59-Y6AR0\n==========================================\nVMware Workstation16 密钥：\nZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 VMware Workstation Pro 15 激活许可证：\nUY758-0RXEQ-M81WP-8ZM7Z-Y3HDA VF750-4MX5Q-488DQ-9WZE9-ZY2D6 UU54R-FVD91-488PP-7NNGC-ZFAX6 YC74H-FGF92-081VZ-R5QNG-P6RY4 YC34H-6WWDK-085MQ-JYPNX-NZRA2 VMware Workstation Pro 14 激活许可证：\nFF31K-AHZD1-H8ETZ-8WWEZ-WUUVA CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD VMware Workstation Pro 12 激活许可证：\n5A02H-AU243-TZJ49-GTC7K-3C61N VF5XA-FNDDJ-085GZ-4NXZ9-N20E6 UC5MR-8NE16-H81WY-R7QGV-QG2D8 ZG1WH-ATY96-H80QP-X7PEX-Y30V4 AA3E0-0VDE1-0893Z-KGZ59-QGAVF ","date":"2025-02-28T17:53:05+08:00","permalink":"/p/250228175305/","title":"VMware Workstation 17 Pro许可证"},{"content":" 检查防火墙 检查myid 在 zoo.cfg 中添加如下\n1 quorumListenOnAllIPs=true 表示监听所有网卡\n重启服务器\n","date":"2025-02-28T15:11:07+08:00","permalink":"/p/250228151107/","title":"zookeeper进程启动成功，查看状态却显示不在运行"},{"content":"简介 使用 ubuntu22.04 ubuntu24.04 这几个版本时候发现，ssh 连接后直接执行命令找不到环境变量\n原因在于 用户 .bashrc 最开始有这样一段 bash 脚本\n1 2 3 4 5 # If not running interactively, don\u0026#39;t do anything case $- in *i*) ;; *) return;; esac 它的作用是阻止脚本在非交互式环境下执行某些操作\n所以 ssh 后直接执行命令 无法执行。\n解决办法 注释掉 $HOME/.bashrc 开头的这段代码\n1 vim $HOME/.bashrc 1 2 3 4 5 # If not running interactively, don\u0026#39;t do anything case $- in *i*) ;; *) return;; esac 如果额外想要在 ssh 后直接可以读取 /etc/profile.d/*.sh 下的环境变量\n可以在 $HOME/.bashrc添加如下的脚本\n1 2 3 4 5 6 7 8 9 for i in /etc/profile.d/*.sh /etc/profile.d/sh.local; do if [ -r \u0026#34;$i\u0026#34; ]; then if [ \u0026#34;${-#*i}\u0026#34; != \u0026#34;$-\u0026#34; ]; then . \u0026#34;$i\u0026#34; else . \u0026#34;$i\u0026#34; \u0026gt;/dev/null fi fi done ","date":"2025-02-28T14:16:42+08:00","permalink":"/p/250228141642/","title":"Ubuntu使用ssh连接执行命令找不到环境变量"},{"content":"简介 时隔这么久，又回到centos7的怀抱，当初配置静态ip的接口地址已经忘记，果然笔记还是最重要的东西\n静态ip 1 vim /etc/sysconfig/network-scripts/ifcfg-ens33 1 2 3 4 5 IPADDR=192.168.10.100 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=192.168.10.1 DNS2=223.5.5.5.5 ","date":"2025-02-27T19:11:58+08:00","permalink":"/p/250227191158/","title":"centos7.5配置静态ip"},{"content":"简介 这篇文章将介绍 Obsidian 下实用的插件，在精不在多\nHidden Folder 隐藏文件夹\nGit 对当前的仓库实行 Git 管理，不再需要打开终端执行 Git 命令\nFile Hider 隐藏文件\nTemplater 模板，可快速创建对应模板的新文件\nPanGu 格式化文档，中英文中间自动加空格\n快捷键：ctrl+shift+s\nRemotely Save 远程备份，支持多种方式的备份，也支持 Webdav\nImage Auto Upload 使用 Picgo 或者 picgo-core 自动上传图片\n","date":"2025-02-26T12:53:46+08:00","permalink":"/p/250226125346/","title":"Obsidian插件"},{"content":"","date":"2025-02-24T14:47:52+08:00","permalink":"/p/250224144752/","title":"Ubuntu24.04安装"},{"content":"简介 Ubuntu24.04 的网络配置是通过 netplan 配置的，\n配置文件在/etc/netplan下，格式为 yaml\n配置静态 ip 首先查看网络接口\n1 ip a 如下所示\nenp0s3 是 nat 网卡，用于访问外部网络的。 enp0s8 是主机和虚拟机之间访问的网卡。 配置 enp0s8 接口\n编辑 /etc/netplan/ 的文件\n1 sudo vim /etc/netplan/50-cloud-init.yaml 如下所示\n1 2 3 4 5 6 7 8 9 10 network: ethernets: enp0s3: dhcp4: true nameservers: addresses: [223.5.5.5,8.8.8.8] #dns enp0s8: dhcp4: false addresses: [192.168.56.100/24] version: 2 保存退出\nnetplan 命令应用配置\n1 sudo netplan apply 网络被重置 通过 Virtualbox 虚拟机安装 ubuntu，配置静态 ip 之后，可以生效，但是，重启之后，发现配置被重置了\n解决办法：禁用云初始化\n1 sudo vim /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg 写入\n1 network: {config: disabled} 重启 cloud-init 服务\n1 sudo systemctl restart cloud-init 重启虚拟机\n","date":"2025-02-24T14:47:52+08:00","permalink":"/p/250224144752/","title":"Ubuntu24.04静态ip配置，重启虚拟机网络被重置解决办法"},{"content":"简介 alist-tvbox 是一个 AList 代理，支持 xiaoya 版 AList 界面管理\n源码：https://github.com/power721/alist-tvbox\n功能 管理界面 海报墙 多个 AList 站点 多个阿里云盘账号 挂载我的云盘 支持夸克、UC、115 网盘 自动签到 自动刷新阿里 Token 自定义 TvBox 配置 安全订阅配置 TvBox 配置聚合 添加阿里云盘分享 添加 PikPak 分享 支持 BiliBili 管理 AList 服务 小雅配置文件管理 构建索引 在线日志 部署 native 版本 native 版本内存占用更少\n1 2 mkdir -p /opt/service/alist-tvbox cd /opt/service/alist-tvbox 1 vim docker-compose.yml 填入内容\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: \u0026#39;3.9\u0026#39; services: xiaoya-tvbox: image: \u0026#39;haroldli/xiaoya-tvbox:native\u0026#39; container_name: xiaoya-tvbox restart: unless-stopped volumes: - \u0026#39;./xiaoya-tvbox_data:/data\u0026#39; environment: - ALIST_PORT=5344 ports: - \u0026#39;5344:80\u0026#39; - \u0026#39;4567:4567\u0026#39; deploy: resources: limits: cpus: \u0026#39;0.85\u0026#39; # 限制 CPU 最大 85% networks: - alist_network networks: alist_network: external: true 1 docker compose up -d 默认用户名和密码：\nusername: admin\npassword: admin\n","date":"2025-02-21T18:24:33+08:00","permalink":"/p/250221182433/","title":"alist-tvbox，AList代理，支持xiaoya版AList界面管理"},{"content":"简介 csdn 广告太多、内容大多都是互相复制粘贴，质量很差，唯独搜索引擎的比重还很高，每次搜索都会出现头部列表都是它们\nzhihu 虽然比 csdn 好点，但是需要登录，需要跳转，都很烦，最好的办法是通过搜索引擎屏蔽掉\n方式一 办法是在搜索 后面加上\n1 -site csdn.net -site zhihu.com 不过每次搜索都要输入未免麻烦，最好的办法是加入自定义搜索引擎，每次通过地址栏搜索都会自动添加它们，但是 Firefox 默认 是不能添加自定义搜索引擎的，今天教大家如何开启\n方式二 地址栏输入\n1 about:config 同意，搜索\n1 browser.urlbar.update2.engineAliasRefresh 点击切换按钮，将值改为 true\n打开设置下的搜索，地址栏输入\n1 about:preferences#search 滑到最下面，快捷搜索出现 添加按钮，点击添加：\n搜索引擎名称：自定义，如：Bing (-csdn,-zhihu) 搜索引擎 URL： 1 https://bing.com/search?q=%s+-site%3Acsdn.net+-site%3Azhihu.com 别名：可不填 添加，回到最上面，将 默认搜索引擎修改为 Bing (-csdn,-zhihu)\n大功告成。\n","date":"2025-02-21T15:04:44+08:00","permalink":"/p/250221150444/","title":"Firefox自定义搜索引擎，屏蔽csdn，zhihu等网站"},{"content":"简介 起因：\n我在使用 go 编写的程序，用到 SQLite 数据库 在 Windows 平台使用 SQLite 需要有 gcc 环境， 不过，Windows 上使用 gcc 还真是麻烦，搜索引擎搜出来的答案不尽人意，有的过时，有的下载后报毒。\n花了一番功夫，总算找到了一个很好的安装 gcc 环境的方法。\n下载 这里使用 Github 下载的软件，无毒\n下载地址：https://github.com/niXman/mingw-builds-binaries/releases/tag/14.2.0-rt_v12-rev1\n选择 x86_64-14.2.0-release-mcf-seh-ucrt-rt_v12-rev1.7z 即可\n解压，加入环境变量，终端运行\n1 gcc -v 结果显示如下，表示 gcc 可用\n1 2 3 4 5 6 7 8 Using built-in specs. COLLECT_GCC=D:\\develop\\mingw64\\bin\\gcc.exe COLLECT_LTO_WRAPPER=D:/develop/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/14.2.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-14.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/buildroot/x86_64-1420-mcf-seh-ucrt-rt_v12-rev1/mingw64 --enable-host-shared --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=mcf --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libssp --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-pkgversion=\u0026#39;x86_64-mcf-seh-rev1, Built by MinGW-Builds project\u0026#39; --with-bugurl=https://github.com/niXman/mingw-builds LD_FOR_TARGET=/c/buildroot/x86_64-1420-mcf-seh-ucrt-rt_v12-rev1/mingw64/bin/ld.exe --with-boot-ldflags=\u0026#39;-pipe -fno-ident -L/c/buildroot/x86_64-1420-mcf-seh-ucrt-rt_v12-rev1/mingw64/opt/lib -L/c/buildroot/prerequisites/x86_64-zlib-static/lib -L/c/buildroot/prerequisites/x86_64-w64-mingw32-static/lib -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc\u0026#39; Thread model: mcf Supported LTO compression algorithms: zlib gcc version 14.2.0 (x86_64-mcf-seh-rev1, Built by MinGW-Builds project) 版本选择 mcf vs. posix: 这涉及到编译器和标准库的实现。 mcf: 这可能指的是 MinGW Cross Framework，它是一个用于在 Windows 上构建 Unix 风格程序的工具集。 mcf 版本通常更倾向于与 MinGW 环境集成。 posix: POSIX (Portable Operating System Interface) 是一组标准，旨在确保不同操作系统之间的软件可移植性。 posix 版本通常更倾向于遵循 POSIX 标准，并且可能包含一些与 POSIX 兼容的库。 ucrt vs. msvcrt: 这指的是 C 运行时库。 ucrt: Universal C Runtime，是 Windows 10 及更高版本上的标准 C 运行时库。它是 Windows 操作系统的核心组件。 msvcrt: Microsoft Visual C++ Runtime Library，是旧版本的 Windows 上使用的 C 运行时库。 你应该选择哪个？\n如果你在 Windows 10 或更高版本上开发，并且希望使用最新的 C 运行时库，那么 ucrt 版本是更好的选择。 这是最常见的选择。 mcf-seh-ucrt-rt_v12-rev1.7z 可能是最适合你的，因为它明确使用了 ucrt，并且 mcf 意味着它可能针对 MinGW 环境进行了优化。 posix 版本通常用于需要跨平台兼容性的项目。除非你有明确的需求，否则通常不需要 posix 版本。 msvcrt 版本通常用于支持旧版本的 Windows。除非你需要支持旧版本的 Windows，否则不需要 msvcrt 版本。 总结:\n通常情况下，x86_64-14.2.0-release-mcf-seh-ucrt-rt_v12-rev1.7z 是一个好的选择，因为它使用了最新的 ucrt 运行时库。 如果你确实需要与 POSIX 兼容，那就选择带有 posix 和 ucrt的版本。 除非你需要支持非常旧的 Windows 版本，否则避免使用 msvcrt 版本。\n","date":"2025-02-18T22:42:47+08:00","permalink":"/p/250218224247/","title":"Windows安装gcc环境，mingw-builds-binaries"},{"content":"简介 Window 平台上，很多软件需要开机自启动，后台运行，但软件本身没有提供这样的功能，这时候可以借助 NSSM 帮助创建系统服务，实现像 Linux 那样的 systemd 单元。\n安装 下载地址：https://nssm.cc/release/nssm-2.24.zip\n加速下载地址：https://www.123912.com/s/4MOKVv-QZspd?提取码:nsJD\n备用地址：https://www.123865.com/s/4MOKVv-QZspd?提取码:nsJD\n解压，配置环境变量\n打开终端，输入 nssm，出现如下即可\n1 2 3 NSSM: The non-sucking service manager Version 2.24 64-bit, 2014-08-31 Usage: nssm \u0026lt;option\u0026gt; [\u0026lt;args\u0026gt; ...] 使用 安装服务\n1 nssm install \u0026lt;服务名\u0026gt; \u0026lt;应用程序\u0026gt; [参数 ...] 启动服务\n1 nssm start \u0026lt;服务名\u0026gt; 停止服务\n1 nssm stop \u0026lt;服务名\u0026gt; 删除服务\n1 nssm remove \u0026lt;服务名\u0026gt; 重启服务\n1 nssm restart \u0026lt;服务名\u0026gt; 案例 创建 alist 系统服务 方式 1\n1 nssm install alist \u0026#34;D:\\Program Files\\alist\\alist.exe\u0026#34; \u0026#34;server --data=\\\u0026#34;D:\\Program Files\\alist\\data\\\u0026#34;\u0026#34; 方式 2\n1 nssm install alist \u0026#34;D:\\remote\\alist\\alist.exe\u0026#34; \u0026#34;server\u0026#34; \u0026#34;--data\u0026#34; \u0026#34;D:\\remote\\alist\\data\u0026#34; 创建 syncthing 服务 1 nssm install syncthing \u0026#34;D:\\remote\\syncthing-windows-amd64-v1.29.2\\syncthing.exe\u0026#34; -no-browser 创建 sing-box@config-mixed 服务 1 nssm install sing-box@config-mixed \u0026#34;C:\\Users\\taoone\\AppData\\Local\\Microsoft\\WinGet\\Links\\sing-box.exe\u0026#34; \u0026#34;-D\u0026#34; \u0026#34;E:\\backup\\application\\sing-box\\client\\windows\u0026#34; \u0026#34;-c\u0026#34; \u0026#34;E:\\backup\\application\\sing-box\\client\\windows\\config-mixed.json\u0026#34; \u0026#34;run\u0026#34; 进入服务，找到 sing-box@config-mixed，设置用户为当前用户，启动\n1 nssm start sing-box@config-mixed 1 nssm remove sing-box@config-mixed 1 nssm stop sing-box@config-mixed ","date":"2025-02-18T17:06:59+08:00","permalink":"/p/250218170659/","title":"nssm，创建Windows系统服务的工具"},{"content":"简介 Syncthing 是一个跨平台的同步工具，支持 Windows、MacOS、Linux、FreeBSD、Android 等等平台。\n特点：易于使用，界面简单，支持版本管理\nsyncthing 首页主要分为三部分：\n文件夹：正在同步的文件夹 此设备：本地设备的信息 远程设备：同步文件夹的远程设备 安装 Windows 下载地址：https://github.com/syncthing/syncthing/releases/tag/v1.29.2\n下载对应架构的压缩包，解压，点击 syncthing.exe 即可运行\n浏览器打开：http://127.0.0.1:8384/\nLinux 使用包管理器安装\n1 2 # Debian/Ubuntu sudo apt install syncthing 如果觉得自带的包管理器版本低，可以添加 syncthing 的仓库\n1 2 3 # Add the release PGP keys: sudo mkdir -p /etc/apt/keyrings sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg 1 2 # Add the \u0026#34;stable\u0026#34; channel to your APT sources: echo \u0026#34;deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable\u0026#34; | sudo tee /etc/apt/sources.list.d/syncthing.list 1 2 3 # Update and install syncthing: sudo apt-get update sudo apt-get install syncthing 启动\n1 systemctl --user start syncthing 停止\n1 systemctl --user stop syncthing 开机自动启动\n1 systemctl --user enable syncthing 删除开机自动启动\n1 systemctl --user disable syncthing 浏览器打开：http://127.0.0.1:8384/\n如果是服务器，需要编辑修改监听地址\n1 vim $HOME/.config/syncthing/config.xml 1 2 3 4 5 \u0026lt;address\u0026gt;127.0.0.1:8384\u0026lt;/address\u0026gt; 修改为 \u0026lt;address\u0026gt;0.0.0.0:8384\u0026lt;/address\u0026gt; 重启服务\nAndroid syncthing-fork 这是第三方开发的 Syncthing 安卓 App\n下载方式：\n谷歌商店：点此跳转 Github：点此跳转 f-droid：点此跳转 根据提示安装\nDocker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 services: syncthing: image: syncthing/syncthing container_name: syncthing hostname: my-syncthing environment: - PUID=1000 - PGID=1000 volumes: - ./syncthing_data:/var/syncthing - $HOME:/root ports: - 8384:8384 # Web UI - 22000:22000/tcp # TCP file transfers - 22000:22000/udp # QUIC file transfers - 21027:21027/udp # Receive local discovery broadcasts restart: unless-stopped healthcheck: test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1 interval: 1m timeout: 10s retries: 3 远程设备 远程设备：顾名思义，表示同步文件夹的另一个设备\n配对设备 首次使用需要配对设备，步骤：\n添加远程设备：找到需要添加的设备 ID，添加即可，手机可直接扫码 在目标设备同意添加 设备地址 发现设备默认采用dynamic策略，会自动判断同步网络情况选择合适的网络传输\n如果需要设置优先策略，比如局域网内设备传输，可以优先设置局域网地址。步骤：\n点击 添加远程设备或 编辑 已经添加的设备 找到 高级，更改地址 在 dynamic前添加设备的 IP 地址和端口，格式：tcp://ip:port，多个地址使用英文 ,隔开 示例：tcp://192.168.68.11:22000, dynamic 同步文件夹 设置想要同步文件的文件夹，实现跨设备自动同步\n步骤：\n回到 Syncthing 主页，找到 文件夹部分，点击 添加文件夹 填写相关信息，具体内容参考后续介绍 常规 文件夹标签：描述性标识，可随意定制，建议使用 文件夹/文件夹这种命名，这样做的好处一是识别性，二是在其他设备可自动作为文件夹目录，同步到 Android 设备尤为有用 文件夹 ID：文件夹的唯一标识，不需要更改，也没必要更改 文件夹路径：要想分享的文件夹所在的本地路径 共享 将文件夹同步到哪个远程设备，选择共享设备，以及密码设置。\n如果设备作为中转，可以设置密码。\n不设置密码，密码为空：目标设备不加密，同步的设备可以直接看见同步的文件。 设置密码，密码不为空：强制要求共享的目标设备加密，加密后，文件无法直接查看。 设置密码可以用在中转设备上，这样中转设备上的文件将会加密，再从中转设备上添加的文件夹分享给第三个设备，第三个设备填入第一个设备设置的密码，就可以解密。疑似会存在本地文件删除后，加密设备文件不会被同步删除？？\n文件版本控制 Syncthing 支持文件版本控制，在同步文件夹自动创建 .stversions文件夹，删除的文件会自动放入此文件夹。具体的版本策略有如下几个：\n不启用文件版本控制：顾名思义 回收站版本控制：当 Syncthing 替换或删除文件时，文件将移动到 .stversions 目录。 简单文件版本控制：当 Syncthing 替换或删除文件时，文件将移动到 .stversions 目录中，文件名带有日期版本。 阶段文件版本控制：当 Syncthing 替换或删除文件时，文件将移动到 .stversions 目录中，文件名带有日期版本。 超过最长保留时间，或者不满足下列条件的历史版本，则会自动删除\u0026hellip;\u0026hellip; 外部文件版本控制：外部命令处理版本控制。必须从共享文件夹中移除文件。如果应用程序的路径包含空格，应用半角引号括起来。 忽略模式 这个忽略模式适用于本机设备，只针对本次分享的文件夹的忽略，开启后会在同步文件夹新建 .stignore文件用于保存忽略语法。\n忽略模式很有用，分享的文件夹含有大量的临时生成文件，或者同步的文件夹有不想同步的文件，就可以用忽略模式忽略。\n比如：\nWindows 上想同步某个文件夹，但是某些子文件夹不想同步，就可以忽略 Android 上会产生一些 .开头的文件夹，同步到其他设备会污染文件夹，也可以忽略 关于忽略的具体情况请自行把握\n以下 Syncthing 忽略语法前缀和通配符的表格整理：\n忽略语法 说明 (?d) 删除文件前缀：如果文件阻止删除目录，则该文件可被删除。 (?i) 不区分大小写前缀：后面的模式在匹配时不区分大小写。 ! 反转匹配：给定条件的反转（即不排除）。通常用于包含原本会被排除的文件。 * 单级通配符：匹配单一级别的目录或文件名。不匹配路径分隔符 (/)。 ** 多级通配符：匹配任意数量（包括零个）的目录或文件。可以跨越目录边界。 // 注释：在行首使用时，该行被视为注释，Syncthing 将忽略它。 示例：\n有如下文件夹结构\n1 2 3 4 5 6 7 8 9 10 11 12 sync-test ├── a.txt ├── aliyun │ └── service │ ├── a.txt │ ├── container_service.txt │ ├── openlist │ └── service.txt ├── application ├── huaweicloud ├── onecloud │ └── service 忽略语法\n1 2 // 忽略所有名为 service 的文件夹和文件 service 反向排除\n1 2 3 4 5 // 除了 service 其他都忽略 !service * // 注意，* 在最后一行，不可在开头一行 高级 监视更改：使用来自文件系统的通知来检测更改的项目。 监视更改无需定期扫描即可发现大多数更改。 文件夹类型：可以选择发送接收，只发送，只接受，加密接收 完全重新扫描间隔（秒）：默认 3600 秒，表示间隔 1 小时会重新扫描一次文件夹是否有更改 其他暂略\n系统服务 Windows 直接运行 syncthing 会有一个前台的窗口，关掉就会退出运行，解决方法是安装为系统服务，让系统开机自动启动\n要想实现这个功能，需要借助第三方工具NSSM\n关于 NSSM 介绍和安装可查看这篇文章：nssm，创建 Windows 系统服务的工具\n创建 syncthing 服务\n1 nssm install syncthing \u0026#34;D:\\remote\\syncthing\\syncthing.exe\u0026#34; -no-browser 修改 syncthing 服务，指定运行用户\n1 nssm edit syncthing 找到 Log on，选择 This account，输入当前用户，密码。保存退出\n启动服务\n1 nssm start syncthing 停止服务\n1 nssm stop syncthing 删除服务\n1 nssm remove syncthing 软件数据备份和恢复 对 syncthing 软件本身的设置（包括同步文件夹和设备等等）备份和恢复\nWindows 配置文件所在位置：\n1 %LOCALAPPDATA%\\Syncthing 备份该文件夹的内容即可，恢复把备份的文件放入此文件夹即可\nLinux 配置文件所在位置：\n1 $HOME/.config/syncthing 备份该文件夹的内容即可，恢复把备份的文件放入此文件夹即可\nAndroid syncthing-fork 点击左上角 三横杠打开设置 左下角点击设置 点击 导入与导出 具体的路径页面有所提示，目前是：\n1 backups/syncthing/ 恢复也需要在此文件夹存在文件\n备份模式 如果想要达到备份效果，即是在备份设备不会自动删除文件，可以在备份设备通过以下步骤做到不发送文件，不删除文件\n编辑共享的文件夹，把文件夹类型设置仅接受 在 Syncthing 主界面，右上角 操作-高级-文件夹，选中共享的文件夹，找到Ignore Delete，选中，保存 这样就不会在同步时，如果某一方设备删除了文件，备份设备不会跟着删除，达到备份效果。而且备份设备删除的文件也不会同步到其他设备，相当于独立开，只作为备份。\n常见用途：备份照片，视频等。\n重要提示 软件升级前一定要查看发布日志！！，防止升级导致的兼容问题从而导致数据丢失\n问题汇总 问题 1 Documents/school\u0026quot; (l9jth-kpuji): folder marker missing (this indicates potential data loss, search docs/forum to get information about how to proceed\n出现这样的错误，需要在分享的文件下新建 .stfolder 文件夹，重新确认\n","date":"2025-02-18T14:56:18+08:00","permalink":"/p/250218145618/","title":"syncthing，跨平台远程自动同步工具"},{"content":"Win + R\n输入\n1 %localappdata%\\Programs\\cursor\\resources\\app\\bin 删除\n1 2 code code.cmd 注销\n现在就可以实现 code 打开 VSCode ，cursor 打开 cursor\n","date":"2025-02-17T21:05:05+08:00","permalink":"/p/250217210505/","title":"解决cursor安装后code默认打开为cursor"},{"content":"简介 官网：https://github.com/shyiko/jabba\n安装 macOS / Linux https://github.com/shyiko/jabba?tab=readme-ov-file#macos\u0026ndash;linux\nWindows powershell\n1 2 3 4 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-Expression ( Invoke-WebRequest https://github.com/shyiko/jabba/raw/master/install.ps1 -UseBasicParsing ).Content 卸载 1 Remove-Item \u0026#34;$env:USERPROFILE\\.jabba\u0026#34; -Recurse -Force -ErrorAction SilentlyContinue 使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 # list available JDK\u0026#39;s jabba ls-remote # you can use any valid semver range to narrow down the list jabba ls-remote zulu@~1.8.60 jabba ls-remote \u0026#34;*@\u0026gt;=1.6.45 \u0026lt;1.9\u0026#34; --latest=minor # install Oracle JDK jabba install 1.15.0 # install Oracle Server JRE jabba install sjre@1.8 # install Adopt OpenJDK (Hotspot) jabba install adopt@1.8-0 # install Adopt OpenJDK (Eclipse OpenJ9) jabba install adopt-openj9@1.9-0 # install Zulu OpenJDK jabba install zulu@1.8 jabba install zulu@~1.8.144 # same as \u0026#34;zulu@\u0026gt;=1.8.144 \u0026lt;1.9\u0026#34; # install IBM SDK, Java Technology Edition jabba install ibm@1.8 # install GraalVM CE jabba install graalvm@1.0-0 # install OpenJDK jabba install openjdk@1.10-0 # install OpenJDK with Shenandoah GC jabba install openjdk-shenandoah@1.10-0 # install from custom URL # (supported qualifiers: zip (since 0.3.0), tgz, tgx (since 0.10.0), dmg, bin, exe) jabba install 1.8.0-custom=tgz+http://example.com/distribution.tar.gz jabba install 1.8.0-custom=tgx+http://example.com/distribution.tar.xz jabba install 1.8.0-custom=zip+file:///opt/distribution.zip # uninstall JDK jabba uninstall zulu@1.6.77 # link system JDK jabba link system@1.8.72 /Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk # list all installed JDK\u0026#39;s jabba ls # switch to a different version of JDK (it must be already `install`ed) jabba use adopt@1.8 jabba use zulu@~1.6.97 echo \u0026#34;1.8\u0026#34; \u0026gt; .jabbarc # switch to the JDK specified in .jabbarc (since 0.5.0) jabba use # set default java version on shell (since 0.2.0) # this version will automatically be \u0026#34;jabba use\u0026#34;d every time you open up a new terminal jabba alias default 1.8 附录 jabba ls-remote 失败？ 出现\n1 Get https://github.com/shyiko/jabba/raw/master/index.json: net/http: TLS handshake timeout 需要设置代理，端口设置为自己代理所在的端口\nwindows terminal:\n1 $Env:http_proxy=\u0026#34;http://127.0.0.1:10808\u0026#34;;$Env:https_proxy=\u0026#34;http://127.0.0.1:10808\u0026#34; cmd:\n1 set http_proxy=http://127.0.0.1:10808 \u0026amp; set https_proxy=http://127.0.0.1:10808 如果链接不稳定，下载还是失败，可以尝试这样\n1 jabba install graalvm-ce-java8@21.0.0=tgz+https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.0.0.2/graalvm-ce-java8-windows-amd64-21.0.0.2.zip ","date":"2025-02-17T15:49:14+08:00","permalink":"/p/250217154914/","title":"Java版本管理工具，jabba"},{"content":"浏览器 打开网页使用浏览器下载\n下载工具 Gopeed idm Git clone 官方工具 huggingface-cli 和 hf_transfer 是 hugging face 官方提供的专门为下载而设计的工具链。前者是一个命令行工具，后者是下载加速模块。\nhuggingface-cli 下载依赖\n1 pip install -U \u0026#34;huggingface_hub[cli]\u0026#34; 使用方法\n1 hf download [OPTIONS] REPO_ID [FILENAMES]... 下载模型\n1 huggingface-cli download --local-dir . Qwen/Qwen2.5-3B-Instruct-GGUF qwen2.5-3b-instruct-fp16-00001-of-00002.gguf 这条命令的含义：下载 Qwen/Qwen2.5-3B-Instruct-GGUF 下 qwen2.5-3b-instruct-fp16-00001-of-00002.gguf 文件，指定目录为当前目录\n下载数据集\n1 huggingface-cli download --repo-type dataset lavita/medical-qa-shared-task-v1-toy hf_transfer 下载依赖\n1 pip install -U hf-transfer 启用 hf_transfer\n1 export HF_HUB_ENABLE_HF_TRANSFER=1 配置镜像 https://hf-mirror.com/ 1 export HF_ENDPOINT=https://hf-mirror.com 设置以上，速度就可以飞起来了\n","date":"2025-02-16T16:25:55+08:00","permalink":"/p/250216162555/","title":"大模型仓库huggingface下载指南"},{"content":"概述 Node Version Manager，NodeJS 版本管理工具\n地址：https://github.com/coreybutler/nvm-windows\n安装 下载程序即可\n下载地址：https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11\n使用 查看帮助信息\n1 nvm --help 查看可下载的 Node 版本\n1 nvm list available 安装指定 Node 版本\n1 nvm install 20.18.0 查看已经安装的 Node 版本\n1 nvm list 使用指定的 Node 版本\n1 nvm use 20.18.0 ","date":"2025-02-15T17:51:05+08:00","permalink":"/p/250215175105/","title":"nvm-windows，Windows下Node版本管理工具"},{"content":"简介 A CLI to manage virtual envs with pyenv-win\n一个命令行工具，用于使用 pyenv-win 管理虚拟环境。\n安装 1 2 Invoke-WebRequest -UseBasicParsing -Uri \u0026#34;https://raw.githubusercontent.com/pyenv-win/pyenv-win-venv/main/bin/install-pyenv-win-venv.ps1\u0026#34; -OutFile \u0026#34;$HOME\\install-pyenv-win-venv.ps1\u0026#34;; \u0026amp;\u0026#34;$HOME\\install-pyenv-win-venv.ps1\u0026#34; 卸载 1 2 Invoke-WebRequest -UseBasicParsing -Uri \u0026#34;https://raw.githubusercontent.com/pyenv-win/pyenv-win-venv/main/bin/install-pyenv-win-venv.ps1\u0026#34; -OutFile \u0026#34;$HOME\\install-pyenv-win-venv.ps1\u0026#34;; \u0026amp;\u0026#34;$HOME\\install-pyenv-win-venv.ps1\u0026#34; -Uninstall 使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 \u0026gt; pyenv-win-venv pyenv-win-venv v0.6 Copyright (c) Arbaaz Laskar \u0026lt;arzkar.dev@gmail.com\u0026gt; Usage: pyenv-win-venv \u0026lt;command\u0026gt; \u0026lt;args\u0026gt; A CLI to manage virtual envs with pyenv-win Commands: init search for .python-version file in the current directory and activate the env activate activate an env deactivate deactivate an env completion autocomplete script for powershell install install an env uninstall uninstall an env uninstall self uninstall the CLI and its envs list \u0026lt;command\u0026gt; list all installed envs/python versions local set the given env in .python-version file config show the app directory update self update the CLI to the latest version which \u0026lt;command\u0026gt; show the full path to an executable help \u0026lt;command\u0026gt; show the CLI/\u0026lt;command\u0026gt; menu Flags: debug To show debug log ","date":"2025-02-15T17:21:03+08:00","permalink":"/p/250215172103/","title":"pyenv-win-venv，Windows下的pyenv-win插件"},{"content":"简介 官网：https://github.com/pyenv-win/pyenv-win\n安装 Powershell 1 Invoke-WebRequest -UseBasicParsing -Uri \u0026#34;https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1\u0026#34; -OutFile \u0026#34;./install-pyenv-win.ps1\u0026#34;; \u0026amp;\u0026#34;./install-pyenv-win.ps1\u0026#34; 这个安装会家目录添加 .pyenv 文件夹，会在当前用户添加如下环境变量\nPYENV PYENV_HOME PYENV_ROOT PATH下\nC:\\Users\\用户名\\.pyenv\\pyenv-win\\bin C:\\Users\\用户名\\.pyenv\\pyenv-win\\shims 重新打开终端运行 pyenv即可\n如果出现权限问题，使用管理员打开 powershell，运行下面的命令之后重新安装\n1 `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine` 默认安装的位置\n1 %USERPROFILE%\\.pyenv 卸载 1 2 cd $HOME/.pyenv\\pyenv-win .\\install-pyenv-win.ps1 -Uninstall 配置 设置加速镜像源\n添加环境变量 PYTHON_BUILD_MIRROR_URL，值为：\n1 https://jedore.netlify.app/tools/python-mirrors/ 使用 查看可下载的版本\n1 pyenv install --list 安装指定的版本\n1 pyenv install 3.12 设置全局版本\n1 pyenv global 3.12 查看所有可用的python\n1 pyenv versions 查看当前的版本\n1 pyenv version 插件 pyenv-virtualenv pyenv-virtualenv is a pyenv plugin that provides features to manage virtualenvs and conda environments for Python on UNIX-like systems.\n","date":"2025-02-15T14:04:44+08:00","permalink":"/p/250215140444/","title":"pyenv-win，Windows下的Python环境，项目管理工具"},{"content":"简介 ollama\n安装 Windows\nhttps://ollama.com/download/OllamaSetup.exe\nLinux\n1 curl -fsSL https://ollama.com/install.sh | sh MacOS\nhttps://ollama.com/download/Ollama-darwin.zip\n配置 远程访问 默认情况下，Ollama 仅允许本机访问。要让它对外提供服务，需要设置以下环境变量：\n1 2 OLLAMA_HOST=0.0.0.0 OLLAMA_ORIGINS=* 模型位置 默认模型的位置在 家目录下 .ollama\\models，如果需要修改添加 变量指向需要存放的位置\n1 OLLAMA_MODELS=D:\\llm\\ollama 运行模型 直接运行 ollama 官方提供：\n可在这里查看更多模型\n1 ollama run qwen3:4b 第三方仓库的模型：\n1 ollama run modelscope.cn/unsloth/DeepSeek-R1-Distill-Qwen-14B-GGUF 1 ollama run hf.co/unsloth/DeepSeek-R1-Distill-Qwen-14B-GGUF:Q4_K_M 不过这种方式有个小缺点，名字太长\n命令 直接运行 ollama 可以查看命令帮助\n运行模型\n1 ollama run xxxx 查看可用的模型\n1 ollama list 内置的命令：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model show Show information for a model run Run a model stop Stop a running model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information 运行模型 终端运行：使用 ollama run xxx 直接运行模型，在终端中对话 第三方软件： cherry-studio 浏览器插件： Page Assist - A Web UI for Local AI Models 截止到：2025-08-09 ollama 已经有一个图形化对话的窗口\n导入模型 导入手动下载的模型\n新建单个文件夹，从网站下载模型\n新建 Modelfile文件\n填入类似内容 FROM ./DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf\n在文件夹打开终端\n运行如下命令，创建名为 deepseek-r1:14b的模型\n1 ollama create deepseek-r1:14b -f Modelfile 运行 ollama list 可以看到刚才的模型\n模型 模型库 如下模型仓库收集了超级多的模型，都可以直接下载\nmodelscope（魔搭社区）：https://modelscope.cn（国内）\nhuggingface（抱脸网）：https://huggingface.co（国外）\n这些模型仓库也提供了对应的下载工具\n1 2 # modelscope 提供 modelscope pip install modelscope 1 2 # huggingface 提供 huggingface-cli pip install -U huggingface_hub 下载的简单示例\n1 2 # modelscope modelscope download --model=Qwen/Qwen2.5-Coder-3B-Instruct-GGUF qwen2.5-coder-3b-instruct-q5_k_m.gguf --local_dir . 1 2 # huggingface-cli huggingface-cli download Qwen/Qwen2.5-3B-Instruct-GGUF qwen2.5-3b-instruct-q5_k_m.gguf --local-dir . --local-dir-use-symlinks False 下载的实际案例 Qwen/Qwen2.5-Coder-3B-Instruct-GGUF 创建文件夹\n1 mkdir -p d:/llm/models/ 1 cd d:/llm/models 1 mkdir -p Qwen/Qwen2.5-Coder-3B-Instruct-GGUF 1 cd Qwen/Qwen2.5-Coder-3B-Instruct-GGUF 使用 modelscope 下载模型\n1 modelscope download --model=Qwen/Qwen2.5-Coder-3B-Instruct-GGUF qwen2.5-coder-3b-instruct-q5_k_m.gguf --local_dir . windows 下在 powershell 中可以这样打开文件管理器 ：explorer.exe .\n新建一个 Modelfile 文件，名字就叫 qwen2.5-coder-3b-instruct-q5_k_m.Modelfile\n打开填入以下内容\n1 FROM ./qwen2.5-coder-3b-instruct-q5_k_m.gguf 使用 ollama 加载模型\n1 ollama create qwen2.5-coder-3b-instruct:q5km -f ./qwen2.5-coder-3b-instruct-q5_k_m.Modelfile ollama 查看模型\n1 ollama list 结果如下\n1 2 3 PS D:\\llm\\models\\Qwen\\Qwen2.5-Coder-3B-Instruct-GGUF\u0026gt; ollama list NAME ID SIZE MODIFIED qwen2.5-coder-3b-instruct:q5km 3c865efbc32c 2.4 GB 16 seconds ago ","date":"2025-02-13T15:29:41+08:00","permalink":"/p/250213152941/","title":"ollama本地部署大模型"},{"content":" 警告 serv00 官方更新 tos，不再支持 nezha 探针\n详情：https://forum.serv00.com/d/2787-april-cleaning-and-new-tos\n简介 Serv00 是一个提供免费虚拟主机的平台，支持的服务众多，可选择 php 版本，有多款数据库，MySQL，postgresql，mongdodb，支持 ssh 连接，没有广告，3G 空间。\n天城大佬带hysteria2脚本 地址：https://github.com/gshtwy/socks5-hysteria2-for-Serv00-CT8\n一键脚本\n1 bash \u0026lt;(curl -s https://raw.githubusercontent.com/gshtwy/socks5-for-serv00/main/install-socks5-hysteria.sh) 老王版本 地址：https://github.com/eooce/Sing-box\nServ00|CT8一键四协议无交互安装脚本vmess-ws|vmess-ws-tls(argo)|hy2|tuic5，全自动安装节点+全自动保活 默认不安装哪吒和TG提醒，如需要，在脚本前添加环境变量随脚本一起运行即可 可选环境变量：CHAT_ID BOT_TOKEN UUID NEZHA_SERVER NEZHA_PORT NEZHA_KEY ARGO_DOMAIN ARGO_AUTH CFIP CFPORT SUB_TOKEN ARGO_AUTH变量使用json时，ARGO_AUTH=‘json’ 需用英文输入状态下的单引号包裹，例如：ARGO_AUTH=\u0026rsquo;{\u0026ldquo;AccountTag\u0026rdquo;:\u0026ldquo;123\u0026rdquo;,\u0026ldquo;TunnelSecret\u0026rdquo;:\u0026ldquo;123\u0026rdquo;,\u0026ldquo;TunnelID\u0026rdquo;:\u0026ldquo;123\u0026rdquo;}' 1 bash \u0026lt;(curl -Ls https://raw.githubusercontent.com/eooce/sing-box/main/sb4.sh) 带TG提醒、哪吒、argo固定隧道运行示列,里面的参数替换为自己的，不需要变量直接删除,固定隧道密钥可以为token或json 1 CHAT_ID=12345 BOT_TOKEN=5678:AA812jqIA NEZHA_SERVER=nezha.abc.com NEZHA_PORT=5555 NEZHA_KEY=abc123 ARGO_DOMAIN=abc.2go.com ARGO_AUTH=\u0026#39;{\u0026#34;AccountTag\u0026#34;:\u0026#34;123\u0026#34;,\u0026#34;TunnelSecret\u0026#34;:\u0026#34;123\u0026#34;,\u0026#34;TunnelID\u0026#34;:\u0026#34;123\u0026#34;}\u0026#39; bash \u0026lt;(curl -Ls https://github.com/eooce/Sing-box/releases/download/00/sb4.sh) ","date":"2025-02-13T11:33:55+08:00","permalink":"/p/250213113355/","title":"Serv00部署SOCKS5代理，自动保活"},{"content":"安装 Install uv with our standalone installers:\n1 2 # On macOS and Linux. curl -LsSf https://astral.sh/uv/install.sh | sh 1 2 # On Windows. powershell -ExecutionPolicy ByPass -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34; Or, from PyPI:\n1 2 # With pip. pip install uv 1 2 # Or pipx. pipx install uv If installed via the standalone installer, uv can update itself to the latest version:\n1 uv self update 使用 初始化项目\n1 uv init 创建虚拟环境\n1 uv venv 小提示 UV_DEFAULT_INDEX（替代UV_INDEX_URL）：设置PyPI源（默认的 python 第三方包来源地址），可以用来加快 python 第三方包的下载速度\n比如清华源：\n1 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ 也可以通过设置 pyporject.toml 或者 uv.toml来指定项目级别的第三方包下载地址，设置方法：\npyproejct.toml：\n1 2 3 [[tool.uv.index]] url = \u0026#34;https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/\u0026#34; default = true uv.toml：\n1 2 3 [[index]] url = \u0026#34;https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/\u0026#34; default = true uv.toml的优先级比pyproject.toml高\n详细请参考：configuration\n附录 中文文档：https://hellowac.github.io/uv-zh-cn/\n","date":"2025-02-11T10:35:09+08:00","permalink":"/p/250211103509/","title":"uv，Rust编写的Python包、项目管理工具"},{"content":"前言 刮削 意为：为影视资源收集海报、简介信息，让第三方软件（Jellyfin、Emby、Infuse、Plex、VidHub、网易爆米花）识别生成资源库，拥有好看的海报，简介信息。\n一般刮削信息包含 .nfo , .jpg等格式文件用于第三方软件识别。\n影响刮削的关键部分：\n文件夹 名字 文件 名字 按照我的经验，对刮削软件细分又可分为两种：\n主要通过 文件夹名字 获取刮削的信息 Jellyfin Emby Infuse Plex 主要通过 文件名字 获取刮削的信息 VidHub 网易爆米花 下面分别选用两种作为介绍 Jellyfin、Vidhub\n刮削带播放 Vidhub VidHub 是一款 macOS/iOS/tvOS 全平台的影视资源管理和播放软件。支持本地文件，NAS，Samba/WebDav/AList，以及阿里云盘，百度网盘等各种网盘视频的整理和刮削，自动生成优雅的影视海报墙。同时支持 Emby/Plex/Jellyfin 服务器。所有的在线影视信息和图片均来自开源网站 TMDB。\nTMDB 是一个拥有海量影视海报，简介的网站。\n为了保证自动刮削搜索电影剧集的准确性，请按照下面的规则命名文件名。\n1 - 自动刮削搜索电影剧集时唯一关联的是文件名，和文件夹名字以及文件夹的结构无关。\n2 - 电影文件名以影片的完整名字开头 (中英文均可)，后面带上其他相关的文件信息如有同名电影，请务必在文件名中带上电影发行日期。\nThe.Irishman. 爱尔兰人.2019.1080p.x264.mp4\n3 - 电视剧分集文件名以剧名开头 (同一部剧所有分集文件开头的剧名保持一致，中英文均可)，后面必须跟上季和集的信息 (S01E01 / 第一季第一集)。\nShameless. 无耻之徒.S01E01.1080p.AMZN.WEB-DL.mkv\nShameless. 无耻之徒.S03E03.720p.AMZN.WEB-DL.mkv\n4 - 电视剧花絮、特别篇文件名以剧名开头，后面的季数信息必须设置为0，并指定集数 (S00E01)。\nShameless. 无耻之徒.S00E01.Sneak Peek.1080p.AMZN.mkv\n5 - 当自动匹配的电影和剧集错误时，你可以通过修改文件名 (macOS/iOS 端均支持在 App 内直接重命名单个文件 / 批量重命名文件)，或者直接在 App 内长按 / 鼠标右键错误的项目，选择手动编辑信息来修改为正确的影视信息。\n6 - tmdbid 相关支持情况\nvidhub 安卓 1.1.2 版本以上和苹果 1.7.15 版本以上支持 tmdbid 刮削识别，以下格式都支持：\n{tmdb-27205}\n{tmdbid-27205}\n{tmdb=27205}\n{tmdbid=27205}\n[tmdb-27205]\n[tmdbid-27205]\n[tmdb=27205]\n[tmdbid=27205]\n举例：[tmdbid=27205].mkv\n备注：刮削会优先识别 tmdbid。\nJellyfin https://jellyfin.org/\nJellyfin 是一套多媒体应用程序软件套装，旨在组织、管理和共享数字媒体文件。\nJellyfin 分为服务端和客户端应用程序，服务端应用程序安装在运行 Microsoft Windows、MacOS、Linux 等系统的服务器上或 Docker 上，客户端应用程序安装在智能手机、平板电脑、智能电视、网络机顶盒、电子游戏机或网页浏览器上[2]。支持 DLNA 以及插有 Chromecast 的设备也能接收 Jellyfin 服务端发来的文件[3]。\nJellyfin 是 Emby 的一个自由开源分叉。[4]\n以上内容来源于维基百科\n主要说说 Jellyfin 是如何识别文件信息的。\nJellyfin 媒体库常用主要分为电影和节目两个分类，这两个分类决定了文件的不同组织格式，其中\n电影：\n1 Movies/电影名/电影文件 电视剧：\n1 Tvplay/电视剧名/Season X/电视剧文件 Season X 一般表示第几季，例如 Season 1表示第 1 季、Season 2 表示第 2 季\n如果某个电视剧没有分季，也不知道是否有第二季，那也要单独建立一个 Season 1\n同一个电视剧不同的季集应该放在同一个电视剧名目录下的不同季下，比如\n1 2 3 4 5 6 Tvplay 爱情公寓 (2009) Season 1 爱情公寓第一季文件 Season 2 爱情公寓第二季文件 这里可以看出电视剧名后面加了一个年份，这是发行年份，这是为了分辨如果出现相同名字，以便区分，大多数情况下，也推荐这么做。\n额外的，年份和电视剧名中间有个空格，用的是英文下的括号。\n对于规则的详细命名，可查看官网介绍\nJellyfin 命名规则和 Emby、Infuse、Plex有些细微区别，但大差不差。\n说完这些自带播放的软件，下面介绍专门做刮削的软件\n专门刮削 专门刮削软件存在的目的是为了补足上面软件刮削效果不好的问题，先刮削之后，再使用上述软件生成海报墙，跳过刮削的步骤。\ntinymediamanager https://www.tinymediamanager.org/\n关于使用，网络上已经有很多资源\n使用的时候，修改一下文件夹名可以确保更好的自动识别\n","date":"2025-01-26T10:26:12+08:00","permalink":"/p/250126102612/","title":"影视刮削指南"},{"content":"软件：linuxqq\n修改 hyprland 配置文件\n1 vim $HOME/.config/hypr/hyprland.conf 1 2 3 4 5 6 # 禁用XWayland的缩放 xwayland { force_zero_scaling = true } env = GDK_SCALE,2 如果输入法字体太小，修改 输入法字体大小\n","date":"2025-01-24T22:18:47+08:00","permalink":"/p/250124221847/","title":"Hyprland下解决QQ高分辨率模糊的问题"},{"content":"简介 由于 使用 Hyprland 用到许多快捷键，最好使用终端上的软件，减少鼠标的操作，介绍介绍我使用 Huprland中用到的软件\nKitty 这是终端模拟器，最常打交道\n也是 Hyprland 默认使用的终端\n","date":"2025-01-17T16:09:36+08:00","permalink":"/p/250117160936/","title":"ArchLinux使用Hyprland安装的软件"},{"content":"简介 qBittorrentEE 全称为 qBittorrent-Enhanced-Edition，是 qBittorrent 的增强版，自带防止迅雷吸血\n安装 下载地址：https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases\n安装位置建议非 C 盘，非空目录\n配置 tracker 服务器 设置 -\u0026gt; Bittorrent\n滑到最下面配置 tracker 服务器。\ntracker 服务器列表：\n维护更新的网站：https://trackerslist.com/#/zh\n订阅链接：https://cf.trackerslist.com/all.txt\n直接使用：\n点击展开tracker列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 http://1337.abcvg.info:80/announce http://207.241.226.111:6969/announce http://207.241.231.226:6969/announce http://[2a04:ac00:1:3dd8::1:2710]:2710/announce http://bittorrent-tracker.e-n-c-r-y-p-t.net:1337/announce http://bt.okmp3.ru:2710/announce http://ch3oh.ru:6969/announce http://ipv4.rer.lol:2710/announce http://ipv4announce.sktorrent.eu:6969/announce http://ipv6.rer.lol:6969/announce http://nyaa.tracker.wf:7777/announce http://open.tracker.cl:1337/announce http://open.tracker.ink:6969/announce http://p4p.arenabg.com:1337/announce http://public.tracker.vraphim.com:6969/announce http://retracker.hotplug.ru:2710/announce http://t.overflow.biz:6969/announce http://taciturn-shadow.spb.ru:6969/announce http://tk.greedland.net:80/announce http://torrentsmd.com:8080/announce http://tr.nyacat.pw:80/announce http://tr1.aag.moe:2095/announce http://tracker-zhuqiy.dgj055.icu:80/announce http://tracker.beeimg.com:6969/announce http://tracker.bt4g.com:2095/announce http://tracker.edkj.club:6969/announce http://tracker.mywaifu.best:6969/announce http://tracker.opentrackr.org:1337/announce http://tracker.qu.ax:6969/announce http://tracker.renfei.net:8080/announce http://tracker.srv00.com:6969/announce http://tracker.vraphim.com:6969/announce http://tracker.waaa.moe:6969/announce http://tracker2.itzmx.com:6961/announce http://tracker3.itzmx.com:6961/announce http://tracker4.itzmx.com:2710/announce http://wepzone.net:6969/announce http://www.all4nothin.net:80/announce.php http://www.wareztorrent.com:80/announce https://1337.abcvg.info:443/announce https://api.ipv4online.uk:443/announce https://retracker.x2k.ru:443/announce https://sparkle.ghostchu-services.top:443/announce https://t.213891.xyz:443/announce https://torrent.tracker.durukanbal.com:443/announce https://tr.burnabyhighstar.com:443/announce https://tr.nyacat.pw:443/announce https://tr.zukizuki.org:443/announce https://tr2.trkb.ru:443/announce https://tracker-zhuqiy.dgj055.icu:443/announce https://tracker.aburaya.live:443/announce https://tracker.bjut.jp:443/announce https://tracker.bt4g.com:443/announce https://tracker.cloudit.top:443/announce https://tracker.gcrenwp.top:443/announce https://tracker.itscraftsoftware.my.id:443/announce https://tracker.kuroy.me:443/announce https://tracker.leechshield.link:443/announce https://tracker.lilithraws.org:443/announce https://tracker.moeking.me:443/announce https://tracker.pmman.tech:443/announce https://tracker.yemekyedim.com:443/announce https://tracker1.520.jp:443/announce https://trackers.mlsub.net:443/announce udp://207.241.226.111:6969/announce udp://207.241.231.226:6969/announce udp://52.58.128.163:6969/announce udp://[2a03:7220:8083:cd00::1]:451/announce udp://[2a04:ac00:1:3dd8::1:2710]:2710/announce udp://[2a0f:e586:f:f::81]:6969/announce udp://bandito.byterunner.io:6969/announce udp://bittorrent-tracker.e-n-c-r-y-p-t.net:1337/announce udp://bt.ktrackers.com:6666/announce udp://bt.rer.lol:2710/announce udp://bt.rer.lol:6969/announce udp://concen.org:6969/announce udp://cq.kmzs123.cn:17272/announce udp://d40969.acod.regrucolo.ru:6969/announce udp://ec2-18-191-163-220.us-east-2.compute.amazonaws.com:6969/announce udp://evan.im:6969/announce udp://exodus.desync.com:6969/announce udp://ipv4.rer.lol:2710/announce udp://ipv4announce.sktorrent.eu:6969/announce udp://ismaarino.com:1234/announce udp://martin-gebhardt.eu:25/announce udp://mikrotik2.draatman.net:6969/announce udp://ns1.monolithindustries.com:6969/announce udp://odd-hd.fr:6969/announce udp://open.demonii.com:1337/announce udp://open.dstud.io:6969/announce udp://open.stealth.si:80/announce udp://open.tracker.cl:1337/announce udp://open.tracker.ink:6969/announce udp://opentor.org:2710/announce udp://opentracker.io:6969/announce udp://p2p.publictracker.xyz:6969/announce udp://p4p.arenabg.com:1337/announce udp://public.tracker.vraphim.com:6969/announce udp://r.l5.ca:6969/announce udp://retracker.hotplug.ru:2710/announce udp://retracker.lanta.me:2710/announce udp://seedpeer.net:6969/announce udp://serpb.vpsburti.com:6969/announce udp://t.overflow.biz:6969/announce udp://tr.movian.eu:6969/announce udp://tr3.ysagin.top:2715/announce udp://trackarr.org:6969/announce udp://tracker.0x7c0.com:6969/announce udp://tracker.birkenwald.de:6969/announce udp://tracker.breizh.pm:6969/announce udp://tracker.cyberia.is:6969/announce udp://tracker.darkness.services:6969/announce udp://tracker.deadorbit.nl:6969/announce udp://tracker.dler.com:6969/announce udp://tracker.dler.org:6969/announce udp://tracker.draatman.uk:6969/announce udp://tracker.edkj.club:6969/announce udp://tracker.filemail.com:6969/announce udp://tracker.fnix.net:6969/announce udp://tracker.gigantino.net:6969/announce udp://tracker.gmi.gd:6969/announce udp://tracker.kmzs123.tk:17272/announce udp://tracker.opentrackr.org:1337/announce udp://tracker.qu.ax:6969/announce udp://tracker.skynetcloud.site:6969/announce udp://tracker.skyts.net:6969/announce udp://tracker.srv00.com:6969/announce udp://tracker.tiny-vps.com:6969/announce udp://tracker.torrent.eu.org:451/announce udp://tracker.torrust-demo.com:6969/announce udp://tracker.tryhackx.org:6969/announce udp://tracker.yume-hatsuyuki.moe:6969/announce udp://tracker1.myporn.club:9337/announce udp://tracker2.dler.org:80/announce udp://tracker2.itzmx.com:6961/announce udp://tracker3.itzmx.com:6961/announce udp://tracker4.itzmx.com:2710/announce udp://ttk2.nbaonlineservice.com:6969/announce udp://u4.trakx.crim.ist:1337/announce udp://u6.trakx.crim.ist:1337/announce udp://udp.tracker.projectk.org:23333/announce udp://wepzone.net:6969/announce udp://www.torrent.eu.org:451/announce wss://tracker.openwebtorrent.com:443/announce WebUI 设置 -\u0026gt; Web UI\n开启 Web 用户界面，可以通过网页打开界面，可以远程使用，后续的 防止吸血也要用到。\n配置用户名和密码\n开启对本地主机客户端跳过身份验证\n","date":"2025-01-09T18:50:27+08:00","permalink":"/p/250109185027/","title":"qBittorrent-Enhanced-Edition，又称qBittorrentEE，qBittorrent 的增强版，自带防止迅雷吸血"},{"content":"简介 FFmpeg 是一套能够处理音频、视频和其它多媒体文件及流的完整解决方案。由于其无与伦比的通用性和强大的功能，它被誉为数字媒体领域的“瑞士军刀”。\n官网：https://ffmpeg.org/\n核心组成 FFmpeg 项目不仅仅是一个单一的程序，它主要由以下几个部分构成：\nffmpeg：这是最核心的命令行工具。用户通过它来进行音视频的转码（格式转换）、剪辑、缩放、添加滤镜、合并文件等几乎所有操作。绝大多数人说“使用 FFmpeg”时，指的就是使用这个工具。\nffplay：一个基于 SDL 和 FFmpeg 库的简易媒体播放器。它功能简单，但非常适合用来快速预览和测试经过 ffmpeg 处理后的文件，或者直接播放各种奇特的媒体格式。\nffprobe：一个媒体信息分析工具。它可以从音视频文件中提取出详细的元数据（Metadata）和流信息，例如编码格式、分辨率、帧率、码率、时长、音轨、字幕等。这对于调试和自动化处理流程至关重要。\n一系列核心库 (Libraries)：这才是 FFmpeg 的真正动力源泉。许多著名的软件（如 VLC 播放器、Chrome 浏览器、YouTube、Blender 等）都在底层使用了 FFmpeg 的库来处理多媒体。主要包括：\nlibavcodec：包含了几乎所有主流的音视频编码器和解码器。 libavformat：用于处理各种多媒体容器格式（如 MP4, MKV, AVI）的封装和解封装。 libavfilter：提供了丰富的音视频滤镜，如裁剪、缩放、水印、调速等。 libavutil：包含了一些核心的工具函数。 libswscale：用于图像的缩放和色彩空间转换。 libswresample：用于音频的重采样。 主要功能 FFmpeg 的功能几乎涵盖了音视频处理的方方面面，以下是一些最常见的应用场景：\n格式转换 (Transcoding)：将视频从一种格式转换到另一种，例如 MKV 转 MP4，MOV 转 WebM。 编解码转换：改变视频的编码方式，例如将 H.264 编码的视频转换为更高效的 H.265 (HEVC)。 剪辑与合并：从一个长视频中截取一小段，或者将多个视频片段无缝拼接成一个文件。 调整参数：改变视频的分辨率、帧率、码率，以适应不同设备或网络环境。 音视频分离/合并：从视频中提取出音频轨道（例如 MP4 -\u0026gt; MP3），或为视频添加新的音轨。 添加滤镜和效果：给视频添加水印、文字、模糊效果，调整亮度/对比度，旋转视频等。 屏幕录制：可以直接录制桌面操作。 制作 GIF：将视频片段转换为高质量的 GIF 动图。 直播推流：将本地视频文件或摄像头/桌面捕获的画面推送到流媒体服务器（RTMP/HLS 协议）。 安装 下载地址：https://ffmpeg.org/download.html\n将解压后 bin 目录的路径添加到系统的 PATH 环境变量中。这样你就可以在任何路径下直接运行 ffmpeg 命令，而不需要每次都输入完整路径。\n语法 FFmpeg 是通过命令行操作的，语法通常是：\n1 usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... [] (方括号): 表示可选参数或选项。 这意味着这部分内容可以存在，也可以不存在，ffmpeg 仍然可以正常运行。 {} (花括号): 表示必须参数或选项。 这意味着这部分内容是必需的，ffmpeg 才能正常运行。 选项：\n-vn：忽略输入文件中的视频流 -acodec：指定音频编码器 (Audio Codec)，可选的有： copy: 直接复制音频流，不进行重新编码。 这通常是最快的，并且不会降低音频质量（如果输入音频已经是你想要的格式）。 libmp3lame: 使用 LAME MP3 编码器。 这是创建 MP3 文件的常用选择。需要安装 LAME 库才能使用。 aac: 使用 AAC (Advanced Audio Coding) 编码器。 AAC 通常比 MP3 提供更好的音质。 libfdk_aac: 使用 Fraunhofer FDK AAC 编码器。 比 aac 性能更好，但可能需要单独编译支持。 libopus: 使用 Opus 编码器。 提供非常好的音质，尤其是在较低的比特率下。 pcm_s16le: 使用 PCM (Pulse Code Modulation) 编码器，将其保存为 16 位 Little Endian PCM，通常用于未经压缩的音频（例如 WAV 文件）。 flac: 使用 FLAC (Free Lossless Audio Codec) 编码器。 用于无损压缩音频。 使用 查看文件信息 这是处理任何文件的第一步。\n1 ffprobe video.mp4 或者\n1 ffmprg -i video.mp4 格式转换 (将 MP4 转换为 AVI) 1 ffmpeg -i input.mp4 output.avi FFmpeg 会自动根据输出文件的扩展名选择合适的编码器。\n改变视频分辨率 (缩放到 1280x720) 1 ffmpeg -i input.mp4 -vf scale=1280:720 output_720p.mp4 -vf 代表 \u0026ldquo;video filter\u0026rdquo;（视频滤镜）。scale 是其中一个滤镜。\n提取音频 (保存为 MP3) 1 ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3 -vn: 表示 \u0026ldquo;no video\u0026rdquo;（不包含视频）。 -acodec libmp3lame: 指定使用 LAME 库来编码 MP3。 提取音频 (保存为 WAV) 1 ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3 -vn: 表示 \u0026ldquo;no video\u0026rdquo;（不包含视频）。 -acodec libmp3lame: 指定使用 LAME 库来编码 MP3。 提取音频（不转换） 1 ffmpeg -i [输入视频文件] -ss [开始时间] -to [结束时间] -vn -acodec copy [输出音频文件] 剪切视频 (从第 10 秒开始，持续 15 秒) 1 ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:15 -c copy output_cut.mp4 -ss: seek start (开始时间)。 -t: duration (持续时间)。 -c copy: 表示“直接复制流”，不对音视频进行重新编码。这样做速度极快，且无质量损失，是剪辑、合并时的首选。 剪切视频 (从第 10 秒开始到结尾) 1 ffmpeg -i input.mp4 -ss 00:00:10 -c copy output_cut.mp4 -ss: seek start (开始时间)。 -c copy: 表示“直接复制流”，不对音视频进行重新编码。这样做速度极快，且无质量损失，是剪辑、合并时的首选。 ","date":"2025-01-09T16:47:32+08:00","permalink":"/p/250109164732/","title":"ffmpeg，一套能够处理音频、视频和其它多媒体文件及流的完整解决方案"},{"content":"简介 为了防止被恶意 客户端/IP 吸血，封禁某些不友好的 IP/客户端，保护 BT 网络，保护宽带。\n源码：https://github.com/Simple-Tracker/qBittorrent-ClientBlocker\n安装 二进制 windows: amd64 3.7 点击下载 linux：armv7-v3.6 点击下载 以 Linux 为例：\n创建文件夹\n1 mkdir -p /opt/qbittorrent-clientblocker 解压文件\n1 tar -zxvf qBittorrent-ClientBlocker-3.6-linux-armv7.tar.gz -C /opt/qbittorrent-clientblocker Docker docker compose\n1 2 3 4 5 6 7 mkdir qbittorrent-clientblocker cd qbittorrent-clientblocker mkdir qbittorrent-clientblocker_data cd qbittorrent-clientblocker_data vim config.json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 { \u0026#34;checkUpdate\u0026#34;: true, \u0026#34;debug\u0026#34;: false, \u0026#34;interval\u0026#34;: 6, \u0026#34;cleanInterval\u0026#34;: 3600, \u0026#34;banTime\u0026#34;: 86400, \u0026#34;timeout\u0026#34;: 6, \u0026#34;logToFile\u0026#34;: true, \u0026#34;clientType\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;clientURL\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;clientUsername\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;clientPassword\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;useBasicAuth\u0026#34;: false, \u0026#34;useShadowBan\u0026#34;: true, \u0026#34;skipCertVerification\u0026#34;: false, \u0026#34;blockList\u0026#34;: [], \u0026#34;blockListFile\u0026#34;: [ \u0026#34;blockList.json\u0026#34;, //\u0026#34;blockList-Optional.json\u0026#34; ], \u0026#34;blockListURL\u0026#34;: [ \u0026#34;https://bta.iaalai.cn/qBittorrent-ClientBlocker/blockList.json\u0026#34;, \u0026#34;https://cdn.jsdelivr.net/gh/Simple-Tracker/qBittorrent-ClientBlocker@dev/blockList.json\u0026#34; ], \u0026#34;portBlockList\u0026#34;: [], \u0026#34;ipBlockList\u0026#34;: [], \u0026#34;ipBlockListFile\u0026#34;: [ \u0026#34;ipBlockList.txt\u0026#34; ], \u0026#34;ipBlockListURL\u0026#34;: [ \u0026#34;https://bta.iaalai.cn/BTN-Collected-Rules/combine/all.txt\u0026#34;, \u0026#34;https://cdn.jsdelivr.net/gh/PBH-BTN/BTN-Collected-Rules@main/combine/all.txt\u0026#34;, //\u0026#34;https://bta.iaalai.cn/BTN-Collected-Rules/qBittorrent-ClientBlocker/ipBlockList.txt\u0026#34;, \u0026#34;https://cdn.jsdelivr.net/gh/Simple-Tracker/qBittorrent-ClientBlocker@dev/ipBlockList.txt\u0026#34; ] /* \u0026#34;debug_CheckTorrent\u0026#34;: false, \u0026#34;debug_CheckPeer\u0026#34;: false, \u0026#34;updateInterval\u0026#34;: 86400, \u0026#34;restartInterval\u0026#34;: 6, \u0026#34;torrentMapCleanInterval\u0026#34;: 60, \u0026#34;banAllPort\u0026#34;: true, \u0026#34;banIPCIDR\u0026#34;: \u0026#34;/32\u0026#34;, \u0026#34;banIP6CIDR\u0026#34;: \u0026#34;/128\u0026#34;, \u0026#34;ignoreEmptyPeer\u0026#34;: true, \u0026#34;ignoreNoLeechersTorrent\u0026#34;: true, \u0026#34;ignorePTTorrent\u0026#34;: true, \u0026#34;ignoreAuthFailed\u0026#34;: false, \u0026#34;sleepTime\u0026#34;: 20, \u0026#34;proxy\u0026#34;: \u0026#34;Auto\u0026#34;, \u0026#34;longConnection\u0026#34;: true, \u0026#34;logPath\u0026#34;: \u0026#34;logs\u0026#34;, \u0026#34;logDebug\u0026#34;: false, \u0026#34;listen\u0026#34;: \u0026#34;127.0.0.1:26262\u0026#34;, \u0026#34;fetchFailedThreshold\u0026#34;: 0, \u0026#34;execCommand_FetchFailed\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;execCommand_Run\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;execCommand_Ban\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;execCommand_Unban\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;syncServerURL\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;syncServerToken\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;genIPDat\u0026#34;: 0, \u0026#34;ipUploadedCheck\u0026#34;: false, \u0026#34;ipUpCheckInterval\u0026#34;: 300, \u0026#34;ipUpCheckIncrementMB\u0026#34;: 38000, \u0026#34;ipUpCheckPerTorrentRatio\u0026#34;: 3.0, \u0026#34;maxIPPortCount\u0026#34;: 0, \u0026#34;banByProgressUploaded\u0026#34;: false, \u0026#34;banByPUStartMB\u0026#34;: 20, \u0026#34;banByPUStartPrecent\u0026#34;: 2.0, \u0026#34;banByPUAntiErrorRatio\u0026#34;: 3.0, \u0026#34;banByRelativeProgressUploaded\u0026#34;: false, \u0026#34;banByRelativePUStartMB\u0026#34;: 20, \u0026#34;banByRelativePUStartPrecent\u0026#34;: 2.0, \u0026#34;banByRelativePUAntiErrorRatio\u0026#34;: 3.0, \u0026#34;ignoreByDownloaded\u0026#34;: 100, */ } 1 vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 version: \u0026#39;3.9\u0026#39; services: qbittorrent-clientblocker: image: \u0026#39;simpletracker/qbittorrent-clientblocker:latest\u0026#39; container_name: qbittorrent-clientblocker environment: - useENV=true - debug=false - logPath=logs - clientURL=http://qbittorrent:8080 - clientUsername=username - clientPassword=password volumes: - \u0026#39;./qbittorrent-clientblocker_data/config.json:/app/config.json\u0026#39; restart: unless-stopped networks: - bt_network networks: bt_network: external: true 1 docker compose up -d 配置 修改 config.json\n1 2 cd /opt/qbittorrent-clientblocker vim config.json 将 \u0026quot;clientURL\u0026quot;: \u0026quot;\u0026quot;, 修改为自己的 qbittorrent 所在 ip 端口，比如\n1 \u0026#34;clientURL\u0026#34;: \u0026#34;http://localhost:8020\u0026#34;, 启动 1 ./qBittorrent-ClientBlocker 系统服务 1 vim /etc/systemd/system/qbittorrent-clientblocker.service 填入以下内容\n1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=qBittorrent-ClientBlocker service Wants=network-online.target After=qbittorrent-nox.service [Service] Type=simple Restart=always ExecStart=/bin/sh -c \u0026#34;cd /opt/qBittorrent-ClientBlocker \u0026amp;\u0026amp; /opt/qBittorrent-ClientBlocker/qBittorrent-ClientBlocker --nochdir\u0026#34; [Install] WantedBy=default.target 启动服务\n1 systemctl start qbittorrent-clientblocker.service 查看服务\n1 systemctl status qbittorrent-clientblocker.service 关闭服务\n1 systemctl stop qbittorrent-clientblocker.service 开机自启\n1 systemctl enable qbittorrent-clientblocker.service winodws 快捷方式启动 winodws 每次启动 qBittorrent 和 qbittorrent-clientblocker，有点繁琐，可以新建快捷方式启动，点击之后可以同时启动。\n桌面右键 -\u0026gt; 新建快捷方式，“请键入对象的位置”填写为以下指示的内容：（先不要急着 copy）\n1 C:\\Windows\\System32\\cmd.exe /c \u0026#34;(tasklist | findstr qBittorrent-ClientBlocker || start D:\\download_tool\\qBittorrent-ClientBlocker-3.6-windows-amd64\\qBittorrent-ClientBlocker.exe --hidewindow) \u0026amp;\u0026amp; start D:\\download_tool\\qBittorrent\\qbittorrent.exe\u0026#34; 在copy之前需要将其中软件的路径修改为自己机器所在的路径\n需要修改的地方：\nD:\\download_tool\\qBittorrent-ClientBlocker-3.6-windows-amd64\\qBittorrent-ClientBlocker.exe\nD:\\download_tool\\qBittorrent\\qbittorrent.exe\n修改并填入后，点击下一步，填入快捷方式的名称，比如\n1 qBittorrent and qBittorrent-ClientBlocker 快捷方式 下一步完成即可。\n如果不喜欢默认的图标，可以 鼠标移动到 快捷方式上，右键 -\u0026gt; 属性，找到 更改图标，设置 qBittorrent 所在的图标，比如\n1 D:\\download_tool\\qBittorrent\\qbittorrent.exe ","date":"2025-01-09T14:02:03+08:00","permalink":"/p/250109140203/","title":"qBittorrent-ClientBlocker，某些不友好的IP和客户端，保护 BT 网络，保护宽带"},{"content":"简介 Aria2 是目前最强大的全能型下载工具，它支持 BT、磁力、HTTP、FTP 等下载协议，常用做离线下载的服务端。目前有非常多的 Aria2 Docker 方案，大多都整合了 We­bUI 和文件管理功能，看似很好很强大，实际上都只是做了简单的打包的工作，完全没有考虑到核心的下载体验和资源占用等问题。这也导致很多人在初次使用 Aria2 时会遇到 BT 下载无速度、文件残留占用空间、任务丢失等问题，所以会觉得 Aria2 并不好用，但事实并非如此。Aria2 完美配置是博主经过长时间使用和研究官方文档后总结出来的一套配置方案，其最初目的是为了解决这些问题，而且为 Aria2 添加了额外的一些功能，经过一年多时间的打磨已经积累了大量的使用者和良好的口碑，其中不乏一些知名开源项目开发者、影视字幕组、科技视频 UP 主。之前一直使用一键脚本作为部署方案，为了满足小伙伴们使用 Docker 部署的需求，博主特意制作了基于 Aria2 完美配置和特殊定制优化的 Aria2 Docker ，为了和一般的 Aria2 Docker 方案做区分所以将其取名为 Aria2 Pro。\n特点 下载性能优化\nBT 下载率高、速度快 单服务器线程数最大值无上限（已破解线程数限制） 防掉线程优化 内存消耗优化 读写性能优化 任务管理\n重启后不丢失任务进度、不重复下载 删除正在下载的任务自动删除未完成的文件 下载错误自动删除未完成的文件 下载完成自动删除控制文件（.aria2 后缀名文件） 下载完成自动删除种子文件（.torrent 后缀名文件） 下载完成自动删除空目录 BT 下载完成自动清除垃圾文件（文件类型过滤功能） BT 下载完成自动清除小文件（文件大小过滤功能） 防版权投诉与支持\n有一定的防版权投诉、防迅雷吸血效果 更好的 PT 下载支持 软件特性\n使用 Aria2 Pro Core 项目最新静态编译二进制文件 多平台支持：amd64, i386, arm64, armhf（VPS、群辉、树莓派等常见平台完美支持） 全功能：Async DNS, BitTorrent, Firefox3 Cookie, GZip, HTTPS, Message Digest, Metalink, XML-RPC, SFTP 最新依赖库，下载更安全、稳定、快速 持续更新最新版本 云存储支持\n支持与 RCLONE 联动 自动上传 OneDrive、Google Drive 等网盘 百度网盘转存到其它网盘 多网盘自由选择 网络协议支持\n支持新一代互联网协议 IPv6 文件管理\n下载完成自动移动文件到指定目录（文件自动归档/分类） 定时自动更新 BT tracker 列表（无感知、无重启），保持 BT 下载高速率 用户文件权限自动配置功能 配置文件持久化，支持使用 watchtower 更新容器 设计理念\n极简设计，专注下载，简单易用，少即是多 官方网址：https://p3terx.com/archives/docker-aria2-pro.html\n安装 docker\n1 2 3 4 5 6 7 8 9 10 11 12 13 docker run -d \\ --name aria2-pro \\ --restart unless-stopped \\ --log-opt max-size=1m \\ --network host \\ -e PUID=$UID \\ -e PGID=$GID \\ -e RPC_SECRET=\u0026lt;TOKEN\u0026gt; \\ -e RPC_PORT=6800 \\ -e LISTEN_PORT=6888 \\ -v $PWD/aria2-config:/config \\ -v $PWD/aria2-downloads:/downloads \\ p3terx/aria2-pro 替换\u0026lt;TOKEN\u0026gt;字段(RPC 密钥)即可启动。\ndocker-compose.yml\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 version: \u0026#34;3.8\u0026#34; services: Aria2-Pro: container_name: aria2-pro image: p3terx/aria2-pro environment: - PUID=65534 - PGID=65534 - UMASK_SET=022 - RPC_SECRET=aria2 - RPC_PORT=6800 - LISTEN_PORT=6888 - DISK_CACHE=64M - IPV6_MODE=false - UPDATE_TRACKERS=true - CUSTOM_TRACKER_URL= - TZ=Asia/Shanghai volumes: - ${PWD}/aria2-config:/config - ${PWD}/aria2-downloads:/downloads # If you use host network mode, then no port mapping is required. # This is the easiest way to use IPv6 networks. network_mode: host # network_mode: bridge # ports: # - 6800:6800 # - 6888:6888 # - 6888:6888/udp restart: unless-stopped # Since Aria2 will continue to generate logs, limit the log size to 1M to prevent your hard disk from running out of space. logging: driver: json-file options: max-size: 1m # AriaNg is just a static web page, usually you only need to deploy on a single host. AriaNg: container_name: ariang image: p3terx/ariang command: --port 6880 --ipv6 network_mode: host # network_mode: bridge # ports: # - 6880:6880 restart: unless-stopped logging: driver: json-file options: max-size: 1m 替换\u0026lt;TOKEN\u0026gt;字段(RPC 密钥)即可启动。\n","date":"2025-01-08T22:37:00+08:00","permalink":"/p/250108223700/","title":"aria2-pro，更好用的Aria2 Docker容器镜像"},{"content":"简介 qBittorrent 是一个免费开源的 BitTorrent 客户端，旨在替代 uTorrent。 它使用 C++ 编写，并基于 Qt 工具包构建，因此拥有跨平台支持，可以在 Linux、Windows、macOS、FreeBSD 和其他操作系统上运行。\n核心功能 易于使用： 提供用户友好的图形界面 (GUI)，即使是新手也能轻松上手。 开源免费： 完全免费使用，没有广告或恶意软件。 轻量级： 占用资源较少，即使在老旧的计算机上也能运行良好。 支持多种 BitTorrent 协议： 支持 DHT, Peer Exchange, Full encryption, Magnet links 等标准协议。 内置搜索引擎： 可以直接在 qBittorrent 界面中搜索种子，无需依赖外部网站。 高级下载控制： 按种子/Tracker/类别进行下载优先级设置 可以选择下载文件内容 支持顺序下载 可以限制全局和单个种子的上传/下载速度 远程控制： 可以通过 Web 界面进行远程管理，方便从其他设备控制下载。 IP 过滤： 可以导入和更新 IP 过滤列表，阻止恶意或受监控的 IP 地址。 Unicode 支持： 支持各种语言和字符集。 UPnP / NAT-PMP 端口转发： 自动配置路由器，简化端口转发设置。 IPv6 支持: 充分支持 IPv6 网络。 Tracker 编辑器： 可以手动添加、编辑或删除 Tracker 地址。 RSS 源支持: 可以订阅 RSS 源，自动下载最新的种子。 计划器： 可以设置下载计划，在特定时间段启动或停止下载。 HTTP Tracker 支持: 支持使用 HTTP Tracker。 与其他 BitTorrent 客户端相比的优势:\n无广告： 相比 uTorrent 等客户端，qBittorrent 没有广告，用户体验更好。 更强大的功能： 提供了更多高级功能，如内置搜索引擎、高级下载控制等。 更好的隐私保护： 开源特性意味着代码可以被审查，更容易发现和修复安全漏洞，从而更好地保护用户隐私。 跨平台支持： 可以在多种操作系统上运行。 安装 Linux 无图形化界面安装 家用小型 linux 服务器没有图形化界面，且是 armv7 结构，安装 qBittorrent\n安装\n1 apt update 1 apt install qbittorrent-nox 启动\n1 qbittorrent-nox 默认端口： 8080 默认用户：admin 默认密码：adminadmin 配置文件夹所在位置\n1 ~/.config/qBittorrent 修改端口\n1 qbittorrent-nox --webui-port=XXXX 创建系统服务\n1 vim /etc/systemd/system/qbittorrent-nox.service 填入以下内容\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [Unit] Description=qBittorrent-nox service Documentation=man:qbittorrent-nox(1) Wants=network-online.target After=local-fs.target network-online.target nss-lookup.target [Service] Type=simple PrivateTmp=false User=root ExecStart=/usr/bin/qbittorrent-nox -config /root/.config/qBittorrent/qBittorrent.conf TimeoutStopSec=1800 [Install] WantedBy=multi-user.target 启动服务\n1 systemctl start qbittorrent-nox.service 查看服务\n1 systemctl status qbittorrent-nox.service 关闭服务\n1 systemctl stop qbittorrent-nox.service 开机自启\n1 systemctl enable qbittorrent-nox.service Docker 使用 docker 可以方便的安装 qBittorrent\n由于 qBittorrent 镜像稍多，以下分开介绍\n这些镜像对应的配置和数据目录都不一样\nlinuxserver/qbittorrent linuxserver/qbittorrent 是下载量最多的镜像，最新发布的镜像已不再支持 arm32，可能导致一些设备无法使用，不过早期发布含有 armv7 的镜像\nlinuxserver/qbittorrent\n1 docker network create bt-network 1 vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 services: qbittorrent: container_name: qbittorrent image: linuxserver/qbittorrent:5.1.2 environment: - PUID=0 - PGID=0 - TZ=Asia/Shanghai - WEBUI_PORT=8080 - TORRENTING_PORT=6881 volumes: - ./qbittorrent_data:/config - ./qbittorrent/incomplete:/qbittorrent/incomplete - ./qbittorrent/torrents:/qbittorrent/torrents - /mnt/downloads:/downloads #optional - /mnt/ode5_porn_01:/mnt/ode5_porn_01 - /mnt/porn:/media/porn ports: - 8020:8080 - 6881:6881 - 6881:6881/udp restart: unless-stopped networks: - bt-network networks: bt-network: external: true linuxserver/qbittorrent:arm32v7-4.5.3\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 services: qbittorrent: container_name: qbittorrent image: linuxserver/qbittorrent:arm32v7-4.5.3 environment: - PUID=0 - PGID=0 - TZ=Asia/Shanghai - WEBUI_PORT=8080 - TORRENTING_PORT=6881 volumes: - ./qbittorrent_data:/config # - ./downloads:/downloads #optional - /mnt/p1:/root ports: - 8020:8080 - 6881:6881 - 6881:6881/udp restart: unless-stopped gists/qbittorrent 支持多种架构，GitHub\n1 docker network create bt_network 1 vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 services: qbittorrent: image: gists/qbittorrent:5.0.2 container_name: qbittorrent environment: - PUID=0 - PGID=0 - TZ=Asia/Shanghai - WEB_PORT=8080 - PEER_PORT=6881 volumes: - ./qbittorrent_data:/data - ./qbittorrent/incomplete:/qbittorrent/incomplete - ./qbittorrent/torrents:/qbittorrent/torrents - /mnt/downloads:/downloads #optional - /mnt/ode5_porn_01:/mnt/ode5_porn_01 - /mnt/porn:/media/porn ports: - \u0026#34;8020:8080\u0026#34; - \u0026#34;6881:6881\u0026#34; - \u0026#34;6881:6881/udp\u0026#34; restart: unless-stopped logging: driver: json-file options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; networks: - bt_network networks: bt_network: external: true username: admin password: randomly generated every start, use docker logs qbittorrent to see temporary password crazymax/qbittorrent （采用） 支持多种架构，GitHub\ncrazymax/qbittorrent:5.0.3\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 services: qbittorrent: image: crazymax/qbittorrent:5.0.3 container_name: qbittorrent environment: - PUID=0 - PGID=0 - UMASK=000 - TZ=Asia/Shanghai - WEB_PORT=8080 - PEER_PORT=6881 volumes: - ./qbittorrent_data:/data - ./qbittorrent/incomplete:/qbittorrent/incomplete - ./qbittorrent/torrents:/qbittorrent/torrents - /mnt/p1/downloads:/downloads #optional - /mnt/ode5_porn_01:/mnt/ode5_porn_01 - /mnt/p1/porn:/media/porn - /mnt/p1/film:/media/film ports: - \u0026#34;8020:8080\u0026#34; - \u0026#34;6881:6881\u0026#34; - \u0026#34;6881:6881/udp\u0026#34; restart: unless-stopped logging: driver: json-file options: max-size: \u0026#34;10m\u0026#34; max-file: \u0026#34;3\u0026#34; networks: - bt_network networks: bt_network: external: true docker-cli\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker run -d \\ --name=qbittorrent \\ -e PUID=1000 \\ -e PGID=1000 \\ -e TZ=Etc/UTC \\ -e WEBUI_PORT=8080 \\ -e TORRENTING_PORT=6881 \\ -p 8080:8080 \\ -p 6881:6881 \\ -p 6881:6881/udp \\ -v /path/to/qbittorrent/appdata:/config \\ -v /path/to/downloads:/downloads `#optional` \\ --restart unless-stopped \\ lscr.io/linuxserver/qbittorrent:latest 支持的变量\nParameter Function -p 8080:8080 WebUI -p 6881:6881 tcp connection port -p 6881:6881/udp udp connection port -e PUID=1000 for UserID - see below for explanation -e PGID=1000 for GroupID - see below for explanation -e TZ=Etc/UTC specify a timezone to use, see this list⁠ -e WEBUI_PORT=8080 for changing the port of the web UI, see below for explanation -e TORRENTING_PORT=6881 for changing the port of tcp/udp connection, see below for explanation -v /config Contains all relevant configuration files. -v /downloads Location of downloads on disk. --read-only=true Run container with a read-only filesystem. Please read the docs⁠ --user=1000:1000 Run container with a non-root user. Please read the docs⁠ 配置 下载分类 categories.json\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 { \u0026#34;film_anime\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/anime\u0026#34; }, \u0026#34;film_documentary\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/documentary\u0026#34; }, \u0026#34;film_movie\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/movie\u0026#34; }, \u0026#34;film_movie_english\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/movie/english\u0026#34; }, \u0026#34;film_movie_chinese\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/movie/chinese\u0026#34; }, \u0026#34;film_movie_korean_\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/movie/korean\u0026#34; }, \u0026#34;film_movie_korean-r\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/movie/korean-r\u0026#34; }, \u0026#34;film_tvplay\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/tvplay\u0026#34; }, \u0026#34;film_tvplay_english\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/tvplay/english\u0026#34; }, \u0026#34;film_tvplay_chinese\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/tvplay/chinese\u0026#34; }, \u0026#34;film_tvplay_korean\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/film/tvplay/korean\u0026#34; }, \u0026#34;porn_domestic\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/domestic\u0026#34; }, \u0026#34;porn_domestic_media\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/domestic_media\u0026#34; }, \u0026#34;porn_expose\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/expose\u0026#34; }, \u0026#34;porn_leak\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/leak\u0026#34; }, \u0026#34;porn_korea_bj\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/korea/korea_bj\u0026#34; }, \u0026#34;porn_japan_av\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/japan/japan_av\u0026#34; }, \u0026#34;porn_western\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;/media/porn/western\u0026#34; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { \u0026#34;film\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/film\u0026#34; }, \u0026#34;film_beauty\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/film/beauty\u0026#34; }, \u0026#34;film_documentary\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/film/documentary\u0026#34; }, \u0026#34;film_movie\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/film/movie\u0026#34; }, \u0026#34;film_tvplay\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/film/tvplay\u0026#34; }, \u0026#34;porn\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn\u0026#34; }, \u0026#34;porn_domestic\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/domestic\u0026#34; }, \u0026#34;porn_domestic_media\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/domestic/domestic_media\u0026#34; }, \u0026#34;porn_exchange\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/exchange\u0026#34; }, \u0026#34;porn_expose\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/expose\u0026#34; }, \u0026#34;porn_japan_av\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/japan/japan_av\u0026#34; }, \u0026#34;porn_korea_bj\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/korea/korea_bj\u0026#34; }, \u0026#34;porn_korea_r-rated\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/korea/korea_r-rated\u0026#34; }, \u0026#34;porn_leak\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/leak\u0026#34; }, \u0026#34;porn_western\u0026#34;: { \u0026#34;save_path\u0026#34;: \u0026#34;E:/porn/western\u0026#34; } } 远程访问 unauthorized 如果是局域网远程设备，首次打开显示 Unauthorized，\n新增配置\n1 2 3 4 5 6 [Preferences] WebUI\\HostHeaderValidation=false WebUI\\CSRFProtection=false WebUI\\AuthSubnetWhitelist=192.168.68.0/24 WebUI\\AuthSubnetWhitelistEnabled=true AuthSubnetWhitelist：白名单 invalid Username or Password 遇到这个问题，首先可以更换浏览器尝试，有的更换浏览器就可以正常登录了，如果不行，修改 config 文件，添加一行：\n1 WebUI\\Password_PBKDF2=\u0026#34;@ByteArray(ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==)\u0026#34; 这样用户名密码就初始化为 admin adminadmin\n备份恢复 找到 qbittorrent 程序目录，复制 BT_backup 文件夹，里面包含了种子文件与状态信息，重新安装后覆盖还原即可。\nwindows\n1、以群晖为例，打开 winscp 连接上群晖，找到 qbittorrent 安装目录，\n2、复制 BT_backup 文件夹到本地电脑上，\n3 、重新安装 qbittorrent 后，使用 winscp 上传覆盖 BT_backup 文件夹，重启 qbittorrent，查看时候恢复之前的状态。\n","date":"2025-01-08T20:31:10+08:00","permalink":"/p/250108203110/","title":"qBittorrent，一个免费开源的BitTorrent 客户端"},{"content":"nrm 快速切换镜像\n1 npm i -g nrm 查看镜像源\n1 nrm ls 使用镜像源\n1 nrm use taobao ","date":"2025-01-05T19:46:38+08:00","permalink":"/p/250105194638/","title":"前端npm，pnpm，yarn必装的几个包"},{"content":"简介 官网：https://github.com/pyenv/pyenv\n安装 Linux/Unix 1 curl https://pyenv.run | bash 添加环境变量\n1 vim ~/.bashrc 1 2 3 export PYENV_ROOT=\u0026#34;$HOME/.pyenv\u0026#34; [[ -d $PYENV_ROOT/bin ]] \u0026amp;\u0026amp; export PATH=\u0026#34;$PYENV_ROOT/bin:$PATH\u0026#34; eval \u0026#34;$(pyenv init -)\u0026#34; Windows 使用另一个工具 pyenv-win\n使用 查看可下载的版本\n1 pyenv install --list 安装指定的版本\n1 pyenv install 3.12.0 设置全局的版本\n1 pyenv global 3.12.0 查看所有存在的版本\n1 pyenv versions 查看当前的版本\n1 pyenv version 插件 pyenv-virtualenv pyenv-virtualenv is a pyenv plugin that provides features to manage virtualenvs and conda environments for Python on UNIX-like systems.\n虚拟环境 在使用 pyenv virtualenv 创建虚拟环境时，虚拟环境的目录通常不会自动出现在当前目录中。相反，pyenv 会将虚拟环境存储在其管理的全局目录中。要在当前目录中使用虚拟环境，你需要手动设置。\n以下是确保在当前目录中使用 .venv 的步骤：\n创建虚拟环境： 你可以创建虚拟环境并指定名称（如 .venv）：\n1 pyenv virtualenv 3.11.0 .venv 激活虚拟环境： 在当前目录激活虚拟环境：\n1 pyenv local .venv 检查虚拟环境： 现在你可以在当前目录中使用虚拟环境，验证是否激活：\n1 python --version 额外说明\n虚拟环境的实际文件夹通常位于 ~/.pyenv/versions/ 下。你可以通过 pyenv versions 查看所有的虚拟环境。 使用 pyenv local 命令会在当前目录创建一个 .python-version 文件，其中包含了当前使用的虚拟环境名称。 如果你希望在当前目录中看到 .venv 文件夹，你可以手动创建一个虚拟环境并将其移到当前目录，或使用其他工具如 venv 或 virtualenv。\n","date":"2024-12-30T14:32:36+08:00","permalink":"/p/241230143236/","title":"pyenv，Python版本，项目管理工具"},{"content":"简介 官网：https://www.rust-lang.org/zh-CN/\n安装 Windows 使用 Rustup（官方推荐）\n1 https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe 跟着操作进行即可，会安装 Visual Studio Installer，空间会占用几个G。\n接着安装 Rust，直接默认即可。\n使用 WSL\n1 curl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh 编辑器 VSCode 插件推荐\nrust-analyzer 语法分析 Error Lens 错误提示 Even Better TOML 美化 toml 文件 Cargo 创建一个新项目\n1 cargo new project 运行项目\n1 cargo run ","date":"2024-12-28T14:01:34+08:00","permalink":"/p/241228140134/","title":"Rust安装"},{"content":"众所周知，Windows 的更新很频繁，有时候会在重要的时候更新导致系统卡顿，甚至打断当前的动作，很多介绍的关闭更新教程会导致 Windows 的 store 商店无法使用，并且我也不建议安装其他第三方软件对系统更改（你甚至不知道它会干什么）。\n本次介绍的的方式为”曲线救国“，因为 Windows 本身支持延长时间，但是只能延长 5 周，我们需要做的就是增加延长更新的时间，让它一直无法更新，通过设置后，你可以延长 1 个月，1 年，10 年，甚至 100 年，这样就达到了“关闭更新”的作用。比如：\n本次使用的是修改注册表的方式，操作的时候请仔细小心！以免删除了系统某些注册表，导致系统出现问题\nWin+R 打开注册表 ，输入： 1 regedit 注册表编辑器地址栏输入： 1 计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings 在其空白处，右键，选择 新建(N) - DWORD(32位)值(D)，命名为： 1 FlightSettingsMaxPauseDays 双击新建的项，基数改为 十进制，数值数据表示天数，比如填入：\n1 36500 表示支持最大延长 100 年\n保存退出\n打开 Windows 更新设置（Win+i，更新和安全）， 高级选项（Windows 10），下滑找到“暂停更新”，选择暂停更新的日子 如果设置了最大 100 年，现在就可以选择 100 年之后。\n如果你想重新开启系统更新，只需要点击继续更新即可。想要再次暂停，只需要设置暂停更新的日志，就是这么简单，就是这么方便。\n","date":"2024-12-23T16:27:47+08:00","permalink":"/p/241223162747/","title":"Windows延长更新时间，关闭更新"},{"content":"简介 Windwos 下安装 aria2\n安装 aria2 下载地址：https://github.com/aria2/aria2/releases/\n快速下载：点击我下载 aria2-1.37.0-win-64bit-build1.zip\n在 D 盘新建目录 D:\\download_tool\\aria2\n配置 在aria2c同级目录下新建 aria2.conf文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 # aria2 配置文件示例 # =========== 下载目录与文件管理 =========== # 默认下载目录，建议使用绝对路径 dir=E:\\Downloads # 日志文件路径和级别 log=D:\\download_tool\\aria2\\aria2.log log-level=warn # 日志文件是否覆盖写入，如果为 false 则会追加写入 # allow-overwrite=false # 当文件名冲突时自动重命名（例如 file.zip.1） auto-file-renaming=false # 文件预分配方式，建议使用 falloc (最快) # none: 不预分配，直接写入 # prealloc: 预分配，写入零 # falloc: 预分配，高效 file-allocation=falloc # =========== 连接与速度 =========== # 同时下载的最大任务数 max-concurrent-downloads=5 # 每个服务器的最大连接数（HTTP/FTP） max-connection-per-server=16 # 每个下载任务的连接数（HTTP/FTP） split=16 # 最小分块大小，小于此值将不会使用多连接 min-split-size=1M # 全局最大下载速度限制 (0 表示无限制) max-overall-download-limit=0 # 全局最大上传速度限制 (0 表示无限制) max-overall-upload-limit=0 # User-Agent 伪装 user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 # 禁用 SSL/TLS 证书检查 (不建议修改为 true) check-certificate=false # 设置最低 TLS 版本 min-tls-version=TLSv1.2 # =========== BitTorrent / DHT =========== # 启用 DHT (分布式哈希表) enable-dht=true # DHT 监听端口范围 dht-listen-port=6881-6999 # 启用 PEX (点对点交换) enable-peer-exchange=true # BitTorrent 监听端口范围 listen-port=51413-51413 # 每个 BT 任务的最大连接对等体数量 bt-max-peers=50 # 做种时间 (秒)，0 表示一直做种 seed-time=0 # 做种分享率 (0 表示一直做种，1.0 表示下载多少上传多少) seed-ratio=1.0 # 下载磁力链接时，保存 .torrent 文件 bt-save-metadata=true # 自动下载 .torrent 文件中的内容 follow-torrent=true # 手动添加 tracker 服务器，多个用逗号隔开 # bt-tracker=udp://tracker.opentrackr.org:1337/announce,udp://tracker.leechers-paradise.org:6969/announce # =========== RPC 远程控制 (用于 WebUI, 如 AriaNG) =========== # 启用 RPC 服务 enable-rpc=true # 监听所有网络接口，如果只允许本地连接则设置为 false rpc-listen-all=true # RPC 监听端口 rpc-listen-port=6800 # RPC 授权令牌。**强烈推荐设置，用于 WebUI 连接认证，替换为自己的秘密字符串** # rpc-secret= # 允许所有源的 RPC 请求 (方便 WebUI 跨域访问) rpc-allow-origin-all=true # 启用 HTTPS 加密 RPC (需要配置 rpc-certificate 和 rpc-private-key) # rpc-secure=true # rpc-certificate=/path/to/server.crt # rpc-private-key=/path/to/server.key # =========== 其他 =========== # 启用断点续传 (默认就是 true) continue=true # 会话文件路径，用于保存当前下载任务状态，以便重启后恢复 save-session=D:\\download_tool\\aria2\\aria2.session # 每次下载完成或暂停时强制保存会话 force-save=true # 从文件中读取下载链接，一行一个 (如果使用了 input-file，aria2 会在启动时读取) # input-file=/path/to/your/urls.txt 启动 1 D:/download_tool/aria2/aria2c --conf-path=D:/download_tool/aria2/aria2.conf 系统服务 为了开机自启动，需要设置系统服务。\nWindows 平台先安装 nssm , 管理员运行如下命令\n1 nssm install aria2 D:/download_tool/aria2/aria2c --conf-path=D:/download_tool/aria2/aria2.conf WebUI - AriaNg aria2 的 web 客户端\nAriaNg 下载地址：https://github.com/mayswind/AriaNg/releases/download/1.3.8/AriaNg-1.3.8-AllInOne.zip\n下载后，点击 index.html 即可使用浏览器打开。\n把打开的地址收藏书签，即可快速使用。\n如果无法连接，需要检查\naria2 是否启动 AriaNg 是否设置了密钥 设置密钥：AriaNg 设置 -\u0026gt; RPC(localhost:6800) -\u0026gt; Aria2 RPC 密钥\n","date":"2024-12-23T13:32:31+08:00","permalink":"/p/241223133231/","title":"Windows安装aria2"},{"content":"官方网站 Workers：https://developers.cloudflare.com/workers/ D1：https://developers.cloudflare.com/d1/ KV：https://developers.cloudflare.com/kv/ Pages：https://developers.cloudflare.com/pages/ 机场三字码：https://www.cloudflarestatus.com/ 支持的端口 HTTP 端口：\n80 8080 8880 2052 2082 2086 2095 HTTPS 端口：\n443 2053 2083 2087 2096 8443 ","date":"2024-12-19T11:07:49+08:00","permalink":"/p/241219110749/","title":"Cloudflare官方网站"},{"content":"众所周知，Z-library 由于性质的原因，访问地址经常失效，有什么好办法可以获取访问地址呢，根据我的经验，有两种比较好的方式。\n客户端 浏览器插件 浏览器插件 浏览器插件可以探测可用网址，且方便浏览器访问。浏览器插件暂时只支持 Firefox ，通过 Firefox 官方插件仓库是搜索不到的，需要通过已访问网址安装。\n这里给出可用的网址在线安装，由于网址会失效，所以有时效性。\n1 https://1lib.sk/soft/mozilla-addon-latest.xpi?1 通过 Firefox 浏览器访问即可自动安装，安装后点击图标可以访问。\n客户端 客户端会自动探测可用网址，这样就避免了收藏的单一网址失效。\n这里分享客户端安装程序\nWindows: Linux: MacOS(Big Sur (11.0) or later): MacOS(Intel): Android: 链接: https://pan.baidu.com/s/1S9Rzv9yX5homxaXkgprJJA?pwd=bdsa 提取码: bdsa 复制这段内容后打开百度网盘手机App，操作更方便哦\n可用网址 Web\nhttps://z-library.sk\nTOR:\nhttp://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion\n","date":"2024-11-17T15:15:16+08:00","permalink":"/p/241117151516/","title":"Z-library访问方法总结"},{"content":"卸载旧的安装包\n1 dpkg -l | grep -E \u0026#39;(mysql|maria)\u0026#39; 根据上述命令的输出情况卸载\n1 sudo apt purge 软件包 删除配置文件\n1 sudo rm -rf /etc/mysql /var/lib/mysql 下载 压缩包\n1 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-server_8.4.3-1debian12_amd64.deb-bundle.tar 解压\n1 2 3 mkdir mysql-server-8.4.x tar -xf mysql-server_8.4.3-1debian12_amd64.deb-bundle.tar -C mysql-server-8.4.x/ cd mysql-server-8.4.x 安装\n1 2 3 4 5 6 7 sudo apt install ./mysql-community-client-plugins_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-community-client-core_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-common_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-community-client_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-client_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-community-server-core_8.4.3-1debian12_amd64.deb sudo apt install ./mysql-community-server_8.4.3-1debian12_amd64.deb 最后这一步会提示输入密码。\n查看状态\n1 systemctl status mysql.service 启动 myql\n1 systemctl start mysql.service 关闭 mysql\n1 sudo systemctl stop mysql ","date":"2024-11-07T12:50:40+08:00","permalink":"/p/241107125040/","title":"Debian安装，卸载MySQL8.4.x"},{"content":"在使用 vscode debug 启动模拟器的时候，debug console 隔 1 秒就会输出大量的模拟器日志信息，多数都是像下面的内容，键入内容则会生成其他的。\n1 2 3 4 D/EGL_emulation(10388): app_time_stats: avg=502.14ms min=498.97ms max=508.27ms count=3 D/EGL_emulation(10388): app_time_stats: avg=496.50ms min=492.09ms max=500.81ms count=3 D/EGL_emulation(10388): app_time_stats: avg=502.75ms min=501.56ms max=503.94ms count=2 D/EGL_emulation(10388): app_time_stats: avg=500.09ms min=489.25ms max=508.54ms count=3 这个产生的速度之快，连日志打印信息都难以捕捉，网上找了好久都找不到解决办法，\n根据 vscode 自带的日志过滤框使用正则 匹配，比如^.*app_time_stats.*$ 连正常的日志都会被过滤，真是煞费精力。\n最后不写正则了，看到过滤框自带的提示信息，一番摸索，终于解决了。\n这是其解决办法\n1 !app_time_stat,!I/ImeTracker,!D,!W 如果你自己有额外的需要过滤信息，可以仿照上面的写法\n, 表示多个多个规则。\n","date":"2024-11-05T12:02:22+08:00","permalink":"/p/241105120222/","title":"VSCode调试控制台隐藏Flutter使用模拟器输出的大量日志"},{"content":"猫抓\n浏览器插件，可嗅探网页上的视频资源，提供下载\n","date":"2024-11-03T23:32:25+08:00","permalink":"/p/241103233225/","title":"猫抓，嗅探工具，浏览器插件"},{"content":"下一步下一步\u0026hellip;\n连接网络这里，跳过设置网络\nShift + F10 打开命令行\n1 oobe\\byPassNRO.cmd 注意是大写的英文字母 O，而不是数字 0\n执行后会重启\n进行到 网络连接之后，就会出现 我没有Inter网络连接，选择即可跳过\n","date":"2024-11-03T19:24:25+08:00","permalink":"/p/241103192425/","title":"Window11安装，跳过网络连接"},{"content":"前言 lx-music，也就是落雪音乐\n之前多平台使用的时候，比如换设备，卸载后重装，数据都会丢失。\n如果需要备份数据需要手动导出。在跨设备操作同步，感觉比较麻烦。\n有没有一个像 网易云音乐，qq 音乐那种账号机制，自动同步歌单，收藏列表呢。跨设备也能自动执行。\n其实落雪音乐是拥有一个同步服务的，早期的时候部署方式不方便，自己尝试部署，最终还是没有解决问题，所以没有安装成功。\n今天突然想起来，然后再次尝试部署，成功了\n本文就带你来如何部署落雪音乐同步服务 lx-music-sync-server。\n安装 docker-compose 使用之前需要进行一些准备操作\n创建文件夹\n1 2 sudo mkdir -p /opt/container/lx-music-sync-server cd /opt/container/lx-music-sync-server-server 新建 config.js\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 module.exports = { serverName: \u0026#39;My Sync Server\u0026#39;, // 同步服务名称 \u0026#39;proxy.enabled\u0026#39;: false, // 是否使用代理转发请求到本服务器 \u0026#39;proxy.header\u0026#39;: \u0026#39;x-real-ip\u0026#39;, // 代理转发的请求头 原始IP maxSnapshotNum: 10, // 公共最大备份快照数 \u0026#39;list.addMusicLocationType\u0026#39;: \u0026#39;top\u0026#39;, // 公共添加歌曲到我的列表时的方式 top | bottom，参考客户端的设置-列表设置-添加歌曲到我的列表时的方式 users: [ // 用户配置例子，有两种配置格式 // { // name: \u0026#39;user1\u0026#39;, // 用户名，必须，不能与其他用户名重复 // password: \u0026#39;123.def\u0026#39;, // 连接密码，必须，不能与其他用户密码重复，若在外网，务必增加密码复杂度 // maxSnapshotNum: 10, // 可选，最大备份快照数 // \u0026#39;list.addMusicLocationType\u0026#39;: \u0026#39;top\u0026#39;, // 可选，添加歌曲到我的列表时的方式 top | bottom，参考客户端的设置-列表设置-添加歌曲到我的列表时的方式 // }, ], // 所有名称以 env. 开头的配置将解析成环境变量 // \u0026#39;env.PORT\u0026#39;: \u0026#39;9527\u0026#39;, // \u0026#39;env.BIND_IP\u0026#39;: \u0026#39;0.0.0.0\u0026#39;, // ...其他环境变量看Readme.md可用环境变量附录 } 上面的文件是容器内部使用配置文件，自己先创建好，设置用户名和密码，在进行后面的操作之前，请先修改好。\n新建 docker-compose.yml\n1 2 3 4 5 6 7 8 9 10 services: lx-sync: image: lyswhut/lx-music-sync-server container_name: lx-sync restart: unless-stopped ports: - 9527:9527 volumes: - ./lx_sync_data:/server/data - ./config.js:/server/config.js 先启动查看是否有错误\n1 sudo docker compose up 如果没有错误\n1 sudo docker compose up -d 反向代理 Nginx 这里只列举 核心部分\n1 2 3 4 5 6 7 8 9 10 11 12 13 server { # ... location / { proxy_set_header X-Real-IP $remote_addr; # 该头部与config.js文件的 proxy.header 对应 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:9527; proxy_http_version 1.1; # websocket 必须要配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } 使用 Windows 具体的设置路径：设置 - 数据同步 - 客户端模式\n设置 服务地址后，启动同步功能即可\n就会在后面默默发光发热了\nAndroid 同 Windows 一样\nLinux ","date":"2024-11-03T16:10:54+08:00","permalink":"/p/241103161054/","title":"lx-music落雪音乐同步服务部署"},{"content":"待续\n","date":"2024-11-03T08:35:19+08:00","permalink":"/p/241103083519/","title":"API收集"},{"content":"pnpm i 运行时，出现类似如下的操作，\n1 2 3 4 5 6 pnpm : File D:\\develop\\nodejs\\pnpm.ps1 cannot be loaded because running scripts is disabled on this system. For more inform At line:1 char:1 + pnpm i + ~~~~ + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess 这表示脚本运行被禁止了，使用 powershell 查看\n1 Get-ExecutionPolicy 修改为 Get-ExecutionPolicy 可以解决\n1 set-ExecutionPolicy RemoteSigned ","date":"2024-11-02T16:53:07+08:00","permalink":"/p/241102165307/","title":"解决pnpm运行时出现错误"},{"content":"WSL发行版没有gcc环境，需要手动安装\n1 2 sudo apt update sudo apt install build-essential build-essential 包括但不限于以下组件：\nGCC：GNU C 编译器 G++：GNU C++ 编译器 Make：构建自动化工具 其他常用库和头文件：用于编译常见的 C/C++ 程序 ","date":"2024-11-01T16:39:39+08:00","permalink":"/p/241101163939/","title":"Linux安装GCC环境"},{"content":"方法\n跳转到方法定义：f12 查看方法定义：alt+f12 跳转到下一个方法：`` 行操作\n向下复制一行：ctrl+c ctrl+v 向上移动一行：alt+up 向下移动一行：alt+down 折叠展开\n折叠当前区域：ctrl+shift+[ 展开当前区域：ctrl+shift+] 折叠所有区域：ctrl+k ctrl+0 展开所有区域：ctrl+k ctrl+j 转为大写：\n","date":"2024-10-30T09:58:09+08:00","permalink":"/p/241030095809/","title":"VSCode快捷键"},{"content":"注册入口：https://www.aliyunbaike.com/go/freemail\n阿里邮箱介绍\n阿里云（万网）域名使用阿里邮箱如何设置解析?\n非阿里云（万网）域名使用阿里邮箱如何设置解析\n","date":"2024-10-27T21:54:01+08:00","permalink":"/p/241027215401/","title":"免费阿里企业邮箱"},{"content":"原因 在 OpenSSH 的 sshd 服务配置中，UseDNS 参数用于指定是否在用户登录时进行反向 DNS 查找。具体而言，当 UseDNS 设置为 no 时，sshd 服务在用户登录时不会进行反向 DNS 查找，而设置为 yes 时，sshd 服务会尝试进行反向 DNS 查找。\n反向 DNS 查找是通过 IP 地址查找对应的域名的过程。在某些情况下，启用反向 DNS 查找可能会导致登录延迟，特别是当 DNS 服务器响应较慢或不可用时。因此，将 UseDNS 设置为 no 可以在一定程度上提高 SSH 登录的速度，尤其是在网络环境不稳定或 DNS 配置不正确的情况下。\n在一些安全意识较高的环境中，管理员可能会选择禁用反向 DNS 查找，以减少潜在的登录延迟，并确保登录过程更加可控。\nGSSAPIAuthentication 是 SSH 服务器配置中的一个参数，用于控制是否启用 GSSAPI（Generic Security Services Application Program Interface）身份验证。GSSAPI 是一种用于网络身份验证的标准接口，通常与 Kerberos 结合使用。\n实战 修改 /etc/ssh/sshd_config\n1 2 3 4 #UseDNS yes 这里把注释打开，并设置值为no UseDNS no #另外需要把GSSAPIAuthentication参数设置为no GSSAPIAuthentication no 如果你的长这样\n1 2 #UseDNS yes GSSAPIAuthentication yes 可以用下面的语句直接替换\n1 2 sudo sed -i \u0026#39;s/#UseDNS yes/UseDNS no/\u0026#39; /etc/ssh/sshd_config sudo sed -i \u0026#39;s/GSSAPIAuthentication yes/GSSAPIAuthentication no/\u0026#39; /etc/ssh/sshd_config 重启 sshd 服务\n1 2 3 service sshd restart 或者 systemctl restart sshd ","date":"2024-10-25T19:25:45+08:00","permalink":"/p/241025192545/","title":"SSH连接虚拟机速度慢解决办法"},{"content":"简述 LazyVim 是一个由 lazy.nvim 支持的 Neovim 安装程序，可以方便地定制和扩展您的配置。\n✨ Features 🔥 Transform your Neovim into a full-fledged IDE 💤 Easily customize and extend your config with lazy.nvim 🚀 Blazingly fast 🧹 Sane default settings for options, autocmds, and keymaps 📦 Comes with a wealth of plugins pre-configured and ready to use ⚡️ Requirements Neovim \u0026gt;= 0.9.0 (needs to be built with LuaJIT)\nGit \u0026gt;= 2.19.0 (for partial clones support)\na Nerd Font(v3.0 or greater) *(optional, but needed to display some icons)*\nlazygit *(optional)*\na C compiler for nvim-treesitter. See here\nfor telescope.nvim (optional)\nlive grep: ripgrep find files: fd a terminal that support true color and undercurl :\nkitty *(Linux \u0026amp; Macos)* wezterm *(Linux, Macos \u0026amp; Windows)* alacritty *(Linux, Macos \u0026amp; Windows)* iterm2 *(Macos)* 安装 Linux/MacOS Make a backup of your current Neovim files:\n1 2 3 4 5 6 7 # required mv ~/.config/nvim{,.bak} # optional but recommended mv ~/.local/share/nvim{,.bak} mv ~/.local/state/nvim{,.bak} mv ~/.cache/nvim{,.bak} Clone the starter\n1 git clone https://github.com/LazyVim/starter ~/.config/nvim Remove the .git folder, so you can add it to your own repo later\n1 rm -rf ~/.config/nvim/.git Start Neovim!\n1 nvim Refer to the comments in the files on how to customize LazyVim.\nWindows Install the LazyVim Starter with PowerShell\nMake a backup of your current Neovim files:\n1 2 3 4 5 # required Move-Item $env:LOCALAPPDATA\\nvim $env:LOCALAPPDATA\\nvim.bak # optional but recommended Move-Item $env:LOCALAPPDATA\\nvim-data $env:LOCALAPPDATA\\nvim-data.bak Clone the starter\n1 git clone https://github.com/LazyVim/starter $env:LOCALAPPDATA\\nvim Remove the .git folder, so you can add it to your own repo later\n1 Remove-Item $env:LOCALAPPDATA\\nvim\\.git -Recurse -Force Start Neovim!\n1 nvim Refer to the comments in the files on how to customize LazyVim.\nLinux/MacOS ","date":"2024-10-25T16:29:17+08:00","permalink":"/p/241025162917/","title":"LazyVim安装配置"},{"content":"注释 类型转换 转换为布尔类型 如果对非 0 的整数(int 包含正数和负数)进行 bool 类型的转换 那么就全都是 True 在整数的范围内 0 强制类型转换为 bool 类型的结果是 false 将浮点数转换为bool类型的数据的时候 正的浮点数和负的浮点数的结果是true 如果是0.0 那么结果是false 只要字符串中有内容 那么在强制类型转换为bool的时候 那么就返回True 只要列表中有数据 那么强制类型转换为bool的时候 就返回True 只要元组中有数据 那么强制类型转换为bool的时候 就会返回True 只要字典中有内容 那么在强制类型转换为bool的时候 就会返回True 1 2 3 4 5 6 7 8 什么情况下是False print(bool(0)) print(bool(0.0)) print(bool(\u0026#39;\u0026#39;)) print(bool(\u0026#34;\u0026#34;)) print(bool([])) print(bool(())) print(bool({})) ","date":"2024-10-24T19:03:58+08:00","permalink":"/p/241024190358/","title":"Python基础语法知识"},{"content":"地址：https://github.com/tibold/svg-explorer-extension\n下载安装之后即可实现：大图模式下预览 svg 格式图片，而不需要一个一个打开浏览器再预览 svg\n","date":"2024-10-24T10:53:59+08:00","permalink":"/p/241024105359/","title":"Windows文件管理器预览svg格式图片"},{"content":"本期脚本：copy-paste-url\n官方地址：https://github.com/elhirchek/copy-paste-url\n功能：用 ctrl + v 将链接复制粘贴到 mpv 中，开始播放视频。\n","date":"2024-10-13T17:51:36+08:00","image":"https://s2.loli.net/2024/10/13/r4LPeIDqyvtOFUS.png","permalink":"/p/241013175136/","title":"MPV播放器入门指南-第四期：脚本：粘贴URL播放，利用MPV播放第三方视频平台的视频"},{"content":"边框 样式 border-style指定样式\n可选值有\ndotted dashed solid double groove ridge inset none hidden 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p.dotted {border-style: dotted;} p.dashed {border-style: dashed;} p.solid {border-style: solid;} p.double {border-style: double;} p.groove {border-style: groove;} p.ridge {border-style: ridge;} p.inset {border-style: inset;} p.outset {border-style: outset;} p.none {border-style: none;} p.hidden {border-style: hidden;} p.mix {border-style: dotted dashed solid double;} \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;The border-style Property\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;This property specifies what kind of border to display:\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;dotted\u0026#34;\u0026gt;A dotted border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;dashed\u0026#34;\u0026gt;A dashed border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;solid\u0026#34;\u0026gt;A solid border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;double\u0026#34;\u0026gt;A double border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;groove\u0026#34;\u0026gt;A groove border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;ridge\u0026#34;\u0026gt;A ridge border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;inset\u0026#34;\u0026gt;An inset border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;outset\u0026#34;\u0026gt;An outset border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;none\u0026#34;\u0026gt;No border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;hidden\u0026#34;\u0026gt;A hidden border.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;mix\u0026#34;\u0026gt;A mixed border.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 宽度 border-width指定宽度\n可以设置为px, pt, cm, em等单位，也可以使用thin, medium, thick等值\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p.one { border-style: solid; border-width: 5px; } p.two { border-style: solid; border-width: medium; } p.three { border-style: dotted; border-width: 2px; } p.four { border-style: dotted; border-width: thick; } p.five { border-style: double; border-width: 15px; } p.six { border-style: double; border-width: thick; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;The border-width Property\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;This property specifies the width of the four borders:\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;one\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;two\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;three\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;four\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;five\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;six\u0026#34;\u0026gt;Some text.\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;\u0026lt;b\u0026gt;Note:\u0026lt;/b\u0026gt; The \u0026#34;border-width\u0026#34; property does not work if it is used alone. Always specify the \u0026#34;border-style\u0026#34; property to set the borders first.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 颜色 border-color指定边框颜色\n可以使用\n指定的名字，比如 red、blue 十六进制，比如 #ff0000 RGB，比如 rgb(255,0,0) HSL，比如 hsl(0, 100%, 50%) transparent，表示透明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p.one { border-style: solid; border-color: red; } p.two { border-style: solid; border-color: green; } p.three { border-style: dotted; border-color: blue; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;The border-color Property\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;This property specifies the color of the four borders:\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;one\u0026#34;\u0026gt;A solid red border\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;two\u0026#34;\u0026gt;A solid green border\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;three\u0026#34;\u0026gt;A dotted blue border\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;\u0026lt;b\u0026gt;Note:\u0026lt;/b\u0026gt; The \u0026#34;border-color\u0026#34; property does not work if it is used alone. Use the \u0026#34;border-style\u0026#34; property to set the borders first.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 侧边 根据前面的内容，知道了边框的样式，宽度，颜色，在此基础上，还可以单独指定某一边的边框样式（top、right、bottom、left）\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p { border-top-style: dotted; border-right-style: solid; border-bottom-style: dotted; border-left-style: solid; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;Individual Border Sides\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;2 different border styles.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 除了使用特定侧边的属性，也可以只使用 border-style单个属性达到同样的效果，后续跟上不同的值有不同的效果，按照顺序为：上右下左。\n四个值：上右下左\n三个值：上右下，左跟随着右\n两个值：上右，下随着上，左跟随着右\n一个值：四边相同\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; body { text-align: center; } /* Four values */ p.four { border-style: dotted solid double dashed; } /* Three values */ p.three { border-style: dotted solid double; } /* Two values */ p.two { border-style: dotted solid; } /* One value */ p.one { border-style: dotted; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;Individual Border Sides\u0026lt;/h2\u0026gt; \u0026lt;p class=\u0026#34;four\u0026#34;\u0026gt;4 different border styles.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;three\u0026#34;\u0026gt;3 different border styles.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;two\u0026#34;\u0026gt;2 different border styles.\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;one\u0026#34;\u0026gt;1 border style.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 简写 由于属性太多，为了方便书写，可以使用一个属性 border来描述边框\nborder: border-width border-style(required) border-color\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p { border: 5px solid red; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;The border Property\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;This property is a shorthand property for border-width, border-style, and border-color.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 圆角 默认边框角度是直角，可以通过 border-radius属性指定边框角度弯曲状态\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style\u0026gt; p.normal { border: 2px solid red; padding: 5px; } p.round1 { border: 2px solid red; border-radius: 5px; padding: 5px; } p.round2 { border: 2px solid red; border-radius: 8px; padding: 5px; } p.round3 { border: 2px solid red; border-radius: 12px; padding: 5px; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h2\u0026gt;The border-radius Property\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;This property is used to add rounded borders to an element:\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;normal\u0026#34;\u0026gt;Normal border\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;round1\u0026#34;\u0026gt;Round border\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;round2\u0026#34;\u0026gt;Rounder border\u0026lt;/p\u0026gt; \u0026lt;p class=\u0026#34;round3\u0026#34;\u0026gt;Roundest border\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 图片 边框也可以设置图片\nborder-image可以设置边框的图片\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;Document\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; .box { border: 5px solid; /* 上 右 下 左 */ border-image: linear-gradient(to right, #0066ff, #ff32d6) 1 0 1 1; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;box\u0026#34;\u0026gt;border image\u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; ","date":"2024-10-12T11:13:37+08:00","permalink":"/p/241012111337/","title":"CSS指南"},{"content":"创建项目框架 1 2 3 4 5 6 7 8 # pnpm 本次使用包管理工具，后续都采用 pnpm pnpm create vie # 或者 yarn yarn create vite # 或者 npm npm creat vite 1 2 3 4 # 安装依赖 pnpm install # 启动 pnpm run dev 设置路径别名 src/vite.config.js\n1 2 3 4 5 6 7 8 9 10 11 12 13 import { defineConfig } from \u0026#39;vite\u0026#39; import vue from \u0026#39;@vitejs/plugin-vue\u0026#39; // https://vite.dev/config/ export default defineConfig({ plugins: [vue()], // 设置路径别名 resolve: { alias: { \u0026#39;@\u0026#39;: \u0026#39;/src\u0026#39;, } } }) 为了能实现鼠标点击路径跳转，需要安装 别名路径跳转\n设置路由 删除 App.vue多余内容，HelloWorld.vue，添加 vue-router 依赖\n1 pnpm add vue-router 新建一个组件\nsrc/views/Main.vue\n1 2 3 4 5 6 7 8 9 10 11 12 13 \u0026lt;template\u0026gt; \u0026lt;div\u0026gt; \u0026lt;h1\u0026gt;这是Main组件\u0026lt;/h1\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script setup\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;style scoped\u0026gt; \u0026lt;/style\u0026gt; 设置路由\nsrc/router/index.js\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import { createRouter, createWebHashHistory } from \u0026#34;vue-router\u0026#34; // 路由规则 const routes = [ { // main 组件 path: \u0026#39;/\u0026#39;, name: \u0026#39;main\u0026#39;, component: () =\u0026gt; import(\u0026#34;@/views/Main.vue\u0026#34;) } ] // 导出路由配置 const router = createRouter({ // 设置路由模式 history: createWebHashHistory(), // 设置路由，同名，后面不用写 routes, }) export default router; 引入路由\nsrc/main.js\n1 2 3 4 5 6 import { createApp } from \u0026#39;vue\u0026#39; import App from \u0026#39;./App.vue\u0026#39; import router from \u0026#39;./router\u0026#39; const app = createApp(App) app.use(router).mount(\u0026#39;#app\u0026#39;) 设置 App.vue\nsrc/App.vue\n1 2 3 4 5 6 7 8 9 10 \u0026lt;script setup\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;template\u0026gt; \u0026lt;router-view\u0026gt;\u0026lt;/router-view\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;style \u0026gt; \u0026lt;/style\u0026gt; 访问 localhost:5173 查看是否成功\n引入 element-plus 安装\n1 pnpm install element-plus 按需导入之自动导入\n安装unplugin-vue-components 和 unplugin-auto-import这两款插件\n1 pnpm install -D unplugin-vue-components unplugin-auto-import src/vite.config.js\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import { defineConfig } from \u0026#39;vite\u0026#39; import vue from \u0026#39;@vitejs/plugin-vue\u0026#39; import AutoImport from \u0026#39;unplugin-auto-import/vite\u0026#39; import Components from \u0026#39;unplugin-vue-components/vite\u0026#39; import { ElementPlusResolver } from \u0026#39;unplugin-vue-components/resolvers\u0026#39; // https://vite.dev/config/ export default defineConfig({ plugins: [ vue(), AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ], // 设置路径别名 resolve: { alias: { \u0026#39;@\u0026#39;: \u0026#39;/src\u0026#39;, } } }) 主页添加按钮查看是否成功\nsrc/views/Main.vue\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 \u0026lt;template\u0026gt; \u0026lt;div\u0026gt; \u0026lt;h1\u0026gt;这是Main组件\u0026lt;/h1\u0026gt; \u0026lt;div class=\u0026#34;mb-4\u0026#34;\u0026gt; \u0026lt;el-button\u0026gt;Default\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;primary\u0026#34;\u0026gt;Primary\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;success\u0026#34;\u0026gt;Success\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;info\u0026#34;\u0026gt;Info\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;warning\u0026#34;\u0026gt;Warning\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;danger\u0026#34;\u0026gt;Danger\u0026lt;/el-button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script setup\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;style scoped\u0026gt;\u0026lt;/style\u0026gt; 效果展示：\n","date":"2024-10-12T08:51:29+08:00","permalink":"/p/241012085129/","title":"Vue3实战"},{"content":"登录 连接数据库\n1 psql -h localhost -p 5432 -U postgres -d mydb 或者\n1 psql \u0026#34;postgresql://postgres:passwod@localhost:5432/mydb\u0026#34; 数据库管理 查看所有数据库\n1 \\l 创建数据库\n1 create database root; 切换数据库\n1 \\c database_name 查看当前数据库\n1 select current_database(); 表管理 查看表 查看所有表\n1 \\dt 查看特定数据表的结构\n1 \\d table_name 查看当前模式下的所有表\n1 \\dt * 查看特定数据表的结构\n1 \\d table_name 查看表的详细信息\n1 \\d+ table_name 查看特定数据表的结构\n1 \\d table_name 创建表 1 2 3 4 5 create table products ( product_no integer, name text, price numeric ) 删除表 表不存在删除不会报错\n1 drop table products; 变体，表不存在删除不会报错\n1 drop table if extsis products; 用户管理 查看用户 查看所有用户\n1 \\du 查看当前用户\n1 select current_user; 创建用户 创建一个拥有所有权限的用户\n1 CREATE ROLE admin_user WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD \u0026#39;strongpassword\u0026#39;; 创建一个只拥有特定表权限的用户\n修改用户 修改密码\n1 alter user user_name with password \u0026#39;new_password\u0026#39;; ","date":"2024-10-11T22:42:04+08:00","permalink":"/p/241011224204/","title":"PostgreSQL客户端PSQL的使用"},{"content":"插件：\nScala Syntax (official) Scala (Metals) ","date":"2024-10-09T21:30:26+08:00","permalink":"/p/241009213026/","title":"VSCode配置scala环境"},{"content":"常用快捷键 快捷键 描述 f 全屏 esc 关闭控制台，退出全屏 q 停止播放并退出 Q 保存当前播放信息，停止播放并退出，如果重新播放，尽可能恢复之前保存的播放信息 9 或 / 调小音量 0 或 * 调大音量 m 静音，再按取消静音 j 下一个字幕轨 J 上一个字幕轨 [ 播放速度减小10% ] 播放速度增加10% backspace 将速度重置为正常 space 或 p 暂停，再按取消暂停 o 或 P 显示OSD（屏幕显示），包括 当前播放时间，总时间，播放进度，进度条 O 持续显示当前播放时间，总时间，播放进度 . 点击逐帧播放下一帧，长按连续播放 , 点击逐帧播放上一帧，长按连续播放 l 设置循环段，第一次按下是循环开始点，第二次按下是循环结束点，第三次是清除循环 L 切换为全局循环 快捷键及图示 快捷键 中文 英文 LEFT and RIGHT 向后/向前跳转5秒。Shift+箭头进行1秒精确跳转（见\u0026ndash;hr-seek）。 Seek backward/forward 5 seconds. Shift+arrow does a 1 second exact seek (see \u0026ndash;hr-seek). UP and DOWN 向前/向后跳转1分钟。Shift+箭头进行5秒精确跳转（见\u0026ndash;hr-seek）。 Seek forward/backward 1 minute. Shift+arrow does a 5 second exact seek (see \u0026ndash;hr-seek). Ctrl+LEFT and Ctrl+RIGHT 跳转到上一个/下一个字幕。受一些限制，可能并不总是有效；参见sub-seek命令。 Seek to the previous/next subtitle. Subject to some restrictions and might not always work; see sub-seek command. Ctrl+Shift+LEFT and Ctrl+Shift+RIGHT 调整字幕延迟，以便下一个或上一个字幕立即显示。这对于将字幕与音频同步特别有用。 Adjust subtitle delay so that the next or previous subtitle is displayed now. This is especially useful to sync subtitles to audio. [ and ] 将当前播放速度减小/增加10%。 Decrease/increase current playback speed by 10%. { and } 当前播放速度减半/加倍。 Halve/double current playback speed. BACKSPACE 将播放速度重置为正常。 Reset playback speed to normal. Shift+BACKSPACE 撤销上次跳转。仅当播放列表条目未更改时有效。再次按下将返回到原始位置。有关详细信息，请参阅revert-seek命令。 Undo the last seek. This works only if the playlist entry was not changed. Hitting it a second time will go back to the original position. See revert-seek command for details. Shift+Ctrl+BACKSPACE 标记当前位置。然后Shift+BACKSPACE将使用该标记位置作为还原位置（一旦您跳回，标记将被重置）。您可以使用此功能在文件中进行跳转，然后返回到您离开的确切位置。 Mark the current position. This will then be used by Shift+BACKSPACE as revert position (once you seek back, the marker will be reset). You can use this to seek around in the file and then return to the exact position where you left off. \u0026lt; and \u0026gt; 在播放列表中向后/向前。 Go backward/forward in the playlist. ENTER 在播放列表中向前。 Go forward in the playlist. p and SPACE 暂停（再次按下取消暂停）。 Pause (pressing again unpauses). . 向前一步。按一次将暂停，每连续按下一次将播放一帧，然后再次进入暂停模式。 Step forward. Pressing once will pause, every consecutive press will play one frame and then go into pause mode again. , 向后一步。按一次将暂停，每连续按下一次将倒放一帧，然后再次进入暂停模式。 Step backward. Pressing once will pause, every consecutive press will play one frame in reverse and then go into pause mode again. q 停止播放并退出。 Stop playing and quit. Q 类似于q，但存储当前播放位置。如果可能的话，稍后再次播放相同的文件将在旧的播放位置继续播放。请参阅RESUMING PLAYBACK。 Like q, but store the current playback position. Playing the same file later will resume at the old playback position if possible. See RESUMING PLAYBACK. / and * 减小/增大音量。 Decrease/increase volume. 9 and 0 减小/增大音量。 Decrease/increase volume. m 静音。 Mute sound. _ 循环浏览可用的视频轨道。 Cycle through the available video tracks. # 循环浏览可用的音频轨道。 Cycle through the available audio tracks. E 循环浏览可用的版本。 Cycle through the available Editions. f 切换全屏（另请参阅\u0026ndash;fs）。 Toggle fullscreen (see also \u0026ndash;fs). ESC 退出全屏模式。 Exit fullscreen mode. T 切换置顶（另请参阅\u0026ndash;ontop）。 Toggle stay-on-top (see also \u0026ndash;ontop). w and W 减小/增大平移和扫描范围。当前e键目前执行相同操作，但不建议使用。 Decrease/increase pan-and-scan range. The e key does the same as W currently, but use is discouraged. o and P 在OSD上显示进度条、已用时间和总持续时间。 Show progression bar, elapsed time and total duration on the OSD. O 在OSD状态之间切换正常和播放时间/持续时间。 Toggle OSD states between normal and playback time/duration. v 切换字幕可见性。 Toggle subtitle visibility. j and J 循环浏览可用的字幕。 Cycle through the available subtitles. z and Z 通过+/- 0.1秒调整字幕延迟。当前x键执行相同操作，但不建议使用。 Adjust subtitle delay by +/- 0.1 seconds. The x key does the same as Z currently, but use is discouraged. l 设置/清除A-B循环点。有关详细信息，请参阅ab-loop命令。 Set/clear A-B loop points. See ab-loop command for details. L 切换无限循环。 Toggle infinite looping. Ctrl++ and Ctrl+- 通过+/- 0.1秒调整音频延迟（A/V同步）。 Adjust audio delay (A/V sync) by +/- 0.1 seconds. Shift+g and Shift+f 通过+/- 10%调整字幕字体大小。 Adjust subtitle font size by +/- 10%. u 在SSA/ASS字幕中切换仅应用\u0026ndash;sub-ass-*覆盖（默认）和几乎完全覆盖它们的常规字幕样式。有关更多信息，请参阅\u0026ndash;sub-ass-override。 Switch between applying only \u0026ndash;sub-ass-* overrides (default) to SSA/ASS subtitles, and overriding them almost completely with the normal subtitle style. See \u0026ndash;sub-ass-override for more info. V 切换字幕VSFilter纵横比兼容模式。有关更多信息，请参阅\u0026ndash;sub-ass-vsfilter-aspect-compat。 Toggle subtitle VSFilter aspect compatibility mode. See \u0026ndash;sub-ass-vsfilter-aspect-compat for more info. r and R 上/下移动字幕。当前t键执行相同操作，但不建议使用。 Move subtitles up/down. The t key does the same as R currently, but use is discouraged. s 拍摄截图。 Take a screenshot. S 拍摄截图，不带字幕。（这取决于VO驱动程序支持与否。） Take a screenshot, without subtitles. (Whether this works depends on VO driver support.) Ctrl+s 拍摄截图，如窗口显示（带字幕、OSD和缩放视频）。 Take a screenshot, as the window shows it (with subtitles, OSD, and scaled video). PGUP and PGDWN 跳转到上一个/下一个章节的开始。在大多数情况下，“上一个”实际上将会到达当前章节的开始；请参阅\u0026ndash;chapter-seek-threshold。 Seek to the beginning of the previous/next chapter. In most cases, \u0026ldquo;previous\u0026rdquo; will actually go to the beginning of the current chapter; see \u0026ndash;chapter-seek-threshold. Shift+PGUP and Shift+PGDWN 向后或向前跳转10分钟。（这曾经映射到不带Shift的PGUP/PGDWN。） Seek backward or forward by 10 minutes. (This used to be mapped to PGUP/PGDWN without Shift.) d 激活/停用去隔行。 Activate/deactivate deinterlacer. A 循环切换宽高比覆盖。 Cycle aspect ratio override. Ctrl+h 切换硬件视频解码开/关。 Toggle hardware video decoding on/off. Alt+LEFT, Alt+RIGHT, Alt+UP, Alt+DOWN 移动视频矩形（平移）。 Move the video rectangle (panning). Alt++ and Alt+- 将Alt与+或-键组合可更改视频缩放。 Combining Alt with the + or - keys changes video zoom. Alt+BACKSPACE 重置平移/缩放设置。 Reset the pan/zoom settings. F8 显示播放列表和其中的当前位置（仅在使用UI窗口时有用，在终端上损坏）。 Show the playlist and the current position in it (useful only if a UI window is used, broken on the terminal). F9 显示音频和字幕流列表（仅在使用UI窗口时有用，在终端上损坏）。 Show the list of audio and subtitle streams (useful only if a UI window is used, broken on the terminal). i and I 显示/切换显示有关当前播放文件的统计信息的叠加层，例如编解码器、帧速率、丢帧数等。有关更多信息，请参阅STATS。 Show/toggle an overlay displaying statistics about the currently playing file such as codec, framerate, number of dropped frames and so on. See STATS for more information. DEL 在OSC之间循环显示可见性：从不/自动（鼠标移动）/始终 Cycle OSC visibility between never / auto (mouse-move) / always ` 显示控制台。（ESC关闭它。有关CONSOLE的详细信息，请参阅CONSOLE。） Show the console. (ESC closes it again. See CONSOLE.) 1 and 2 调整对比度。 Adjust contrast. 3 and 4 调整亮度。 Adjust brightness. 5 and 6 调整伽马值。 Adjust gamma. 7 and 8 调整饱和度。 Adjust saturation. Alt+0 (and Command+0 on macOS) 将视频窗口调整为原始大小的一半。 Resize video window to half its original size. Alt+1 (and Command+1 on macOS) 将视频窗口调整为其原始大小。 Resize video window to its original size. Alt+2 (and Command+2 on macOS) 将视频窗口调整为其原始大小的两倍。 Resize video window to double its original size. Command + f (macOS only) 切换全屏（另请参阅\u0026ndash;fs）。 Toggle fullscreen (see also \u0026ndash;fs). PAUSE 暂停。 Pause. STOP 停止播放并退出。 Stop playing and quit. PREVIOUS and NEXT 向后/向前跳转1分钟。 Seek backward/forward 1 minute. ZOOMIN and ZOOMOUT 更改视频缩放。 Changes video zoom. ","date":"2024-10-09T15:58:09+08:00","image":"https://s2.loli.net/2024/10/09/wezYV4D5Q8J36HT.png","permalink":"/p/241009155809/","title":"MPV播放器入门指南-第三期：快捷键"},{"content":"简介 Yarn 是一个快速、可靠和安全的 JavaScript 包管理工具。 它可以帮助你自动化地下载、安装、更新和管理项目依赖的各种代码库和工具。 简单来说，Yarn 就像 npm (Node Package Manager) 的一个替代品，它们的功能相似，但 Yarn 在一些方面做了优化和改进，使其更高效、更稳定。\n官网：https://yarnpkg.com/\n特性 速度快： Yarn 通过并行下载依赖和利用缓存等机制，显著提升了依赖安装速度，尤其是在大型项目中。 可靠性高： Yarn 使用确定性的算法来解析依赖关系，确保在不同的环境中安装的依赖版本一致，避免了因版本冲突导致的问题。 它还通过校验下载的包的完整性来防止恶意代码的注入。 安全性强： Yarn 会验证所有安装包的签名，确保下载的包是来自官方源的，没有被篡改过。 离线模式： Yarn 拥有离线缓存机制，即使在没有网络连接的情况下，也可以安装已经缓存的依赖。 版本控制： Yarn 使用 yarn.lock 文件来锁定项目依赖的版本，确保在不同的开发环境中，项目的依赖版本完全一致。这有助于避免因依赖版本升级导致的问题。 兼容性： Yarn 兼容 npm 的大部分命令和工作流程，可以无缝地替换 npm。 工作区 (Workspaces): Yarn 支持 Monorepo 模式，允许你在一个仓库中管理多个项目，共享依赖，提高代码复用率。 安装 官方文档：https://classic.yarnpkg.com/lang/en/docs/install/#windows-stable\nWindows 通过 npm 安装：\n1 npm install --global yarn 下载安装程序安装：\n下载地址：https://classic.yarnpkg.com/latest.msi\n通过 Chocolatey 安装：\n1 choco install yarn 通过 Scoop 安装：\n1 scoop install yarn Linux 通过 npm 安装\n1 npm install --global yarn 下载安装程序安装\nDebian / Ubuntu 1 2 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo \u0026#34;deb https://dl.yarnpkg.com/debian/ stable main\u0026#34; | sudo tee /etc/apt/sources.list.d/yarn.list 1 sudo apt update \u0026amp;\u0026amp; sudo apt install yarn CentOS / Fedora / RHE 1 curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo 1 2 3 sudo yum install yarn ## OR ## sudo dnf install yarn Arch Linux 1 pacman -S yarn MacOS 通过 npm 安装\n1 npm install --global yarn 下载安装程序安装\n1 brew install yarn 安装脚本\n1 curl -o- -L https://yarnpkg.com/install.sh | bash 配置 查看镜像源\n1 yarn config get registry 设置为淘宝镜像源\n1 yarn config set registry https://registry.npmmirror.com 删除镜像源\n1 yarn config rm registry 使用 查看缓存位置\n1 yarn cache dir ","date":"2024-10-08T08:29:30+08:00","permalink":"/p/241008082930/","title":"yarn安装使用"},{"content":"最近有安装字体的需求，需要寻找一款字体管理软件\n在搜寻之下，找到了一款免费，现代化的字体管理软件：FontBase\n官网：https://fontba.se/\n预览：\n","date":"2024-10-07T17:07:49+08:00","permalink":"/p/241007170749/","title":"Windows上字体管理软件：FontBase"},{"content":"好的，以下是替换为模块 github.com/muyiacc/gin-gorm-demo 的完整代码示例。\n项目结构 1 2 3 4 5 6 7 8 9 10 11 12 gin-gorm-demo/ ├── cmd/ │ └── root.go ├── config/ │ └── config.go ├── api/ │ ├── user_handler.go │ └── routers.go ├── model/ │ └── user.go ├── main.go └── config.toml 1. main.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import ( \u0026#34;github.com/muyiacc/gin-gorm-demo/cmd\u0026#34; ) func main() { if err := cmd.Init(); err != nil { panic(err) } r := cmd.SetupRouter() if err := r.Run(\u0026#34;:\u0026#34; + cmd.viper.GetString(\u0026#34;server.port\u0026#34;)); err != nil { cmd.logger.Fatal(\u0026#34;Failed to start server\u0026#34;, zap.Error(err)) } } 2. cmd/root.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 package cmd import ( \u0026#34;fmt\u0026#34; \u0026#34;gorm.io/driver/mysql\u0026#34; \u0026#34;gorm.io/driver/postgres\u0026#34; \u0026#34;gorm.io/gorm\u0026#34; \u0026#34;github.com/gin-gonic/gin\u0026#34; \u0026#34;go.uber.org/zap\u0026#34; \u0026#34;github.com/muyiacc/gin-gorm-demo/api\u0026#34; \u0026#34;github.com/muyiacc/gin-gorm-demo/config\u0026#34; \u0026#34;github.com/muyiacc/gin-gorm-demo/model\u0026#34; ) var ( logger *zap.Logger db *gorm.DB ) func initDB(dbType, dsn string) (*gorm.DB, error) { var gormDB *gorm.DB var err error switch dbType { case \u0026#34;mysql\u0026#34;: gormDB, err = gorm.Open(mysql.Open(dsn), \u0026amp;gorm.Config{}) case \u0026#34;postgres\u0026#34;: gormDB, err = gorm.Open(postgres.Open(dsn), \u0026amp;gorm.Config{}) default: return nil, fmt.Errorf(\u0026#34;unsupported database type: %s\u0026#34;, dbType) } return gormDB, err } func Init() error { var err error cfg, err := config.InitConfig() if err != nil { return err } // 初始化 logger logger, err = initLogger(cfg.Log.Level) if err != nil { return err } logger.Info(\u0026#34;Starting application...\u0026#34;) // 初始化数据库 db, err = initDB(cfg.Database.Type, cfg.Database.Dsn) if err != nil { logger.Fatal(\u0026#34;Failed to connect to database\u0026#34;, zap.Error(err)) return err } logger.Info(\u0026#34;Database connection established\u0026#34;) // 自动迁移 if err := db.AutoMigrate(\u0026amp;model.User{}); err != nil { logger.Fatal(\u0026#34;Failed to migrate database\u0026#34;, zap.Error(err)) return err } logger.Info(\u0026#34;Database migration completed\u0026#34;) return nil } func initLogger(level string) (*zap.Logger, error) { var logger *zap.Logger var err error switch level { case \u0026#34;debug\u0026#34;: logger, err = zap.NewDevelopment() case \u0026#34;info\u0026#34;: logger, err = zap.NewProduction() case \u0026#34;warn\u0026#34;: logger, err = zap.NewProduction() case \u0026#34;error\u0026#34;: logger, err = zap.NewProduction() default: logger, err = zap.NewProduction() } if err != nil { return nil, err } return logger, nil } func SetupRouter() *gin.Engine { r := gin.Default() api.RegisterUserRoutes(r, db, logger) return r } 3. config/config.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package config import ( \u0026#34;github.com/spf13/viper\u0026#34; ) type Config struct { Database struct { Type string `mapstructure:\u0026#34;type\u0026#34;` Dsn string `mapstructure:\u0026#34;dsn\u0026#34;` } `mapstructure:\u0026#34;database\u0026#34;` Log struct { Level string `mapstructure:\u0026#34;level\u0026#34;` } `mapstructure:\u0026#34;log\u0026#34;` Server struct { Port string `mapstructure:\u0026#34;port\u0026#34;` } `mapstructure:\u0026#34;server\u0026#34;` } func InitConfig() (*Config, error) { var cfg Config viper.SetConfigName(\u0026#34;config\u0026#34;) // name of config file (without extension) viper.SetConfigType(\u0026#34;toml\u0026#34;) // REQUIRED if the config file does not have the extension in the name viper.AddConfigPath(\u0026#34;.\u0026#34;) // optionally look for config in the working directory if err := viper.ReadInConfig(); err != nil { return nil, err } if err := viper.Unmarshal(\u0026amp;cfg); err != nil { return nil, err } return \u0026amp;cfg, nil } 4. api/user_handler.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package api import ( \u0026#34;github.com/gin-gonic/gin\u0026#34; \u0026#34;gorm.io/gorm\u0026#34; \u0026#34;go.uber.org/zap\u0026#34; \u0026#34;github.com/muyiacc/gin-gorm-demo/model\u0026#34; ) func RegisterUserRoutes(r *gin.Engine, db *gorm.DB, logger *zap.Logger) { r.POST(\u0026#34;/users\u0026#34;, func(c *gin.Context) { var user model.User if err := c.ShouldBindJSON(\u0026amp;user); err != nil { logger.Warn(\u0026#34;Invalid input\u0026#34;, zap.Error(err)) c.JSON(400, gin.H{\u0026#34;error\u0026#34;: \u0026#34;Invalid input\u0026#34;}) return } if err := db.Create(\u0026amp;user).Error; err != nil { logger.Error(\u0026#34;Failed to create user\u0026#34;, zap.Error(err)) c.JSON(500, gin.H{\u0026#34;error\u0026#34;: \u0026#34;Failed to create user\u0026#34;}) return } logger.Info(\u0026#34;User created successfully\u0026#34;, zap.String(\u0026#34;username\u0026#34;, user.Username)) c.JSON(201, user) }) } 5. api/routers.go 1 2 3 4 5 6 7 8 9 10 package api import \u0026#34;github.com/gin-gonic/gin\u0026#34; func RegisterUserRoutes(r *gin.Engine, db *gorm.DB, logger *zap.Logger) { // 注册用户相关路由 r.POST(\u0026#34;/users\u0026#34;, func(c *gin.Context) { // 处理用户创建 }) } 6. model/user.go 1 2 3 4 5 6 7 8 9 package model import \u0026#34;gorm.io/gorm\u0026#34; type User struct { gorm.Model Username string `json:\u0026#34;username\u0026#34; gorm:\u0026#34;unique;not null\u0026#34;` Password string `json:\u0026#34;password\u0026#34; gorm:\u0026#34;not null\u0026#34;` } 7. config.toml 1 2 3 4 5 6 7 8 9 10 [database] type = \u0026#34;mysql\u0026#34; # 或 \u0026#34;postgres\u0026#34; dsn = \u0026#34;user:password@tcp(localhost:3306)/dbname\u0026#34; # MySQL 示例 # dsn = \u0026#34;host=localhost port=5432 user=user password=password dbname=dbname sslmode=disable\u0026#34; # PostgreSQL 示例 [log] level = \u0026#34;info\u0026#34; [server] port = \u0026#34;8080\u0026#34; 运行项目 确保你的 Go 环境已设置好，并根据你的数据库配置更新 config.toml 文件。然后运行项目：\n1 go run main.go 总结 以上代码实现了一个完整的 Go 项目，模块名为 github.com/muyiacc/gin-gorm-demo，支持 MySQL 和 PostgreSQL 数据源，并使用 zap 进行日志记录。每个步骤都记录了相关的日志信息，便于调试和监控。\n","date":"2024-10-07T12:57:53+08:00","permalink":"/p/241007125753/","title":"简单Go项目"},{"content":"Go原生没有提供切片在指定索引添加元素或切片的方法，只有一个内置函数 apped()\n所以采用 apped() 实现 在指定索引插入元素\n以下为代码及分析\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // append() 从中间下标i插入元素 aslice = []int{1, 2, 3, 4, 5} i := 3 // 下标 i newElement := 10 // 新的元素 /* 拆解步骤： 1. appen(a, b)：追加b元素到一个a切片 2. 为了实现从中间添加，把原来的分为两部分： 第一部分是 下标 i 前面的 记为 a 第二部分是 下标 i 后面的 3. 第二部分 再使用 appen() 和 下标 i 的元素 组成 一个新的切片 记为 b 4. 将 第一部分 a 和 新的切片 b 组成 数组 c */ a := aslice[:i] // 第一部分 a b := append([]int{newElement}, aslice[i:]...) c := append(a, b...) fmt.Println(\u0026#34;原来的切片：\u0026#34;, aslice) // 原来的数组： [1 2 3 4 5] fmt.Println(\u0026#34;新的切片\u0026#34;, c) // 新的数组 [1 2 3 10 4 5] // 简写为一个 newSlice := append(aslice[:i], append([]int{newElement}, aslice[i:]...)...) fmt.Println(\u0026#34;简写：\u0026#34;, newSlice) // 简写： [1 2 3 10 4 5] fmt.Println(\u0026#34;固定格式为：append(切片[:下标], append(新的元素, 切片[下标:]...)...)\u0026#34;) // 案例： 在切片aa []int{24,21,325,208,2370,32,65,321} 索引 index 为 5 处 新增一个切片bb []int{1,2,3} aa := []int{24, 21, 325, 208, 2370, 32, 65, 321} index := 5 bb := []int{1, 2, 3} aa = append(aa[:index], append(bb, aa[index:]...)...) fmt.Println(aa) // [24 21 325 208 2370 1 2 3 32 65 321] 封装为函数\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // Insert 泛型函数，在切片中指定位置插入新元素或切片 func Insert[T any](slice []T, index int, value any) []T { size := len(slice) if index \u0026lt; 0 || index \u0026gt; size { return slice } if v, ok := value.(T); ok { slice = append(slice[:index], append([]T{v}, slice[index:]...)...) return slice } if v, ok := value.([]T); ok { slice = append(slice[:index], append(v, slice[index:]...)...) return slice } return slice } 调用\n1 2 3 4 5 strSlice := append([]string{\u0026#34;apple\u0026#34;, \u0026#34;pear\u0026#34;}, \u0026#34;orange\u0026#34;) fmt.Println(strSlice) strSlice = Insert(strSlice, 2, \u0026#34;hahaha\u0026#34;) fmt.Println(strSlice) ","date":"2024-10-07T10:57:58+08:00","permalink":"/p/241007105758/","title":"Go切片在指定索引插入数组的的固定写法"},{"content":"安装 Linux Debian / Ubuntu\n使用系统自带的仓库\n1 2 apt update apt install postgresql 使用 Postgres 官方 apt 仓库\n1 2 sudo apt install -y postgresql-common sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh Windows 下载地址：https://www.enterprisedb.com/downloads/postgres-postgresql-downloads\n略\nDocker docker cli\n1 2 3 4 docker run --name postgres \\ -p 5432:5432 \\ -v ./postgres_data:/var/lib/postgresql/data \\ -d postgres:15 docker compose\n1 2 3 4 5 6 7 8 9 version: \u0026#39;3.9\u0026#39; services: postgres: image: \u0026#39;postgres:15\u0026#39; volumes: - \u0026#39;./postgres_data:/var/lib/postgresql/data\u0026#39; ports: - \u0026#39;5432:5432\u0026#39; container_name: postgres 目录结构 1 2 3 4 5 6 7 8 9 10 postgresql └── 15 └── main ├── conf.d ├── environment ├── pg_ctl.conf ├── pg_hba.conf ├── pg_ident.conf ├── postgresql.conf └── start.conf 结构说明： postgresql：这是 PostgreSQL 数据库的根目录，通常包含所有版本的数据库配置和数据文件。 15：表示 PostgreSQL 的版本号。在此例中是版本 15。 main：这是数据库集群的名称，通常是默认集群的名称。一个 PostgreSQL 实例可以有多个数据库集群。 目录和文件： conf.d：这个目录通常用于存放额外的配置文件，允许用户将配置拆分为多个文件，方便管理。 environment：这个文件可能包含环境变量的设置，用于配置数据库的运行环境。 pg_ctl.conf：包含 pg_ctl 命令的配置选项，pg_ctl 是用于控制 PostgreSQL 实例的工具。 pg_hba.conf：该文件用于配置客户端认证，定义哪些用户、从哪些主机可以连接到数据库，以及使用何种认证方法。 pg_ident.conf：用于配置用户身份映射，可以将操作系统用户映射到数据库用户。 postgresql.conf：这是 PostgreSQL 的主配置文件，包含数据库的各种设置，如内存、连接限制、日志记录等。 start.conf：可能包含启动相关的配置，具体内容依赖于 PostgreSQL 的设置和使用。 配置远程连接 修改postgresql.conf 找到postgresql.conf文件（通常位于/etc/postgresql/版本/main/下），并进行编辑。\n1 sudo nano /etc/postgresql/版本/main/postgresql.conf 找到以下行：\n1 #listen_addresses = \u0026#39;localhost\u0026#39; 修改为：\n1 listen_addresses = \u0026#39;*\u0026#39; 这将允许所有 IP 地址连接到您的数据库。\n修改pg_hba.conf 再次，找到pg_hba.conf文件，并进行编辑。\n1 sudo nano /etc/postgresql/版本/main/pg_hba.conf 在文件末尾添加以下行，允许所有 IP 地址通过密码连接：\n1 host all all 0.0.0.0/0 scram-sha-256 重载配置 1 sudo pg_ctlcluster \u0026lt;version\u0026gt; main reload 如何不生效，重启 postgresl\n1 sudo systemctl restart postgresql psql 客户端 安装完成之后，如何进入像 MySQL 那样的命令行，和数据库交互？\nPostgres 提供了一个终端工具 psql ，在终端输入\n终端直接输入 psql 会使用当前的系统用户登录，所以需要切换到 postgres 用户\n不指定数据库，会使用系统用户同名数据库\n默认拥有一个 postgres 数据库\n1 2 sudo su - postgres psql 连接参数：\n1 psql -h \u0026lt;host\u0026gt; -p \u0026lt;port\u0026gt; -d \u0026lt;database\u0026gt; -U \u0026lt;username\u0026gt; -W psql: psql 命令本身。 -h \u0026lt;host\u0026gt;: 指定主机名。 -p \u0026lt;port\u0026gt;: 指定端口号。 -d \u0026lt;database\u0026gt;: 指定数据库名称。 -U \u0026lt;username\u0026gt;: 指定用户名。 -W: 提示输入密码。 如果不使用 -W，psql 可能会尝试使用其他身份验证方法 (例如，基于操作系统的用户名)。 ","date":"2024-10-05T09:42:40+08:00","permalink":"/p/241005094240/","title":"PostgreSQL安装，配置"},{"content":"Hubstudio （推荐） Hubstudio，含 AFF\n无限配置文件，每天打开 20 次\nFree 计划 浏览器环境数 无限量 每日环境打开次数 20 次 可添加成员数 限免 云端存储空间 限免 功能包括: 环境数据同步 环境指纹控制 环境和账号导入 环境转移 导入插件 环境通知聚合 付费计划 https://www.hubstudio.cn/pricing/\nUndetectable 推荐\n官网：https://undetectable.io/\nFree 计划 Feature Limit Local Profiles Cloud Profiles 5 Users 1 Sessions 1 Default Configs 10 Purchased Configs 0 Storage Servers 0 付费计划 https://app.undetectable.io/upgrade\nDolphin Anty 官网：https://dolphin-anty.com\n时间一长需要登陆，如果忘记了密码很不友好。\nFree 计划 Browser profiles：10\nProfiles created per month：200\n不支持批量操作 付费计划 https://dolphin-anty.com/panel/#/payment\nAdsPower 官网：https://www.adspower.net/\n有广告！\nFree 计划 浏览器环境 5 个\n团队成员 0 个\n付费计划 https://www.adspower.net/pricing\nGoLogin 官网：https://gologin.com\n付费\n免费使用 7 天\n付费计划 https://gologin.com/pricing/\nVMLogin 官网：https://vmlogin.com/\n付费\n付费计划 https://vmlogin.com/\nIncogniton 官网：https://incogniton.com/\n更新下载不下来\nFree 计划 开始使用我们的免费入门套餐，其中包括未来 2 个月的 10 个浏览器配置文件。\n之后，套餐将更新为 3 个配置文件。\n付费计划 https://incogniton.com/pricing/\n","date":"2024-10-04T15:55:49+08:00","permalink":"/p/241004155549/","title":"指纹浏览器"},{"content":"版本：131.0\n地址栏输入 about:config\n寻找\nsidebar.verticalTabs设置 true sidebar.revamp设置 true ","date":"2024-10-03T21:37:28+08:00","permalink":"/p/241003213728/","title":"Firefox开启垂直标签页"},{"content":"Nginx 安装和配置 信息 本次以 Debian 为例：如果不是 Debian，请参考：官方教程安装，如果已经安装 Nginx，可跳过\n前提条件：\n1 sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring 导入密钥，验证包的正确性：\n1 2 curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \\ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg \u0026gt;/dev/null 验证下载的文件是否包含正确的密钥：\n1 gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg 输出应包含完整指纹 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 如下:\npub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key signing-key@nginx.com\n如果指纹不同，删除文件。\n二选一：\n要为稳定的 nginx 包设置 apt 存储库，请运行以下命令： 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 如果希望使用 mainline nginx 包，请改为运行以下命令: 1 2 3 echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\ http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx\u0026#34; \\ | sudo tee /etc/apt/sources.list.d/nginx.list 设置存储库固定，使用 Nginx 官方的软件包而不是发行版提供的软件包：\n1 2 echo -e \u0026#34;Package: *\\nPin: origin nginx.org\\nPin: release o=nginx\\nPin-Priority: 900\\n\u0026#34; \\ | sudo tee /etc/apt/preferences.d/99nginx 要安装 nginx，请运行以下命令:\n1 2 sudo apt update sudo apt install nginx Certbot 安装 安装 snap certbot 官方已经说了，各个发行版安装的 certbot 版本落后，功能不全，推荐我们使用 snap 安装\n1 2 3 4 5 6 7 8 # 安装snap sudo apt update sudo apt install snapd # 重启系统 # 安装core sudo snap install core sudo snap refresh core 安装 certbot 安装之前确保没有其他方式安装的 certbot 如：apt，pip\n可通过这条命令查看 whereis certbot 如果有，卸载它们 sudo apt remove certbot sudo pip uninstall certbot\n1 2 sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot （3）查看版本\n1 sudo certbot --version Certbot 插件 nginx 使用 snap 安装的版本是已经含有 nginx 插件的\n申请方法如下\n新建一个 nginx 的配置文件\n1 sudo touch /etc/nginx/conf.d/abc.conf 编辑 abc.conf，填入以下模板，根据自己实际情况修改\n1 sudo vim /etc/nginx/conf.d/abc.conf 1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name domain.com; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 使用 certbot 的 nginx 插件申请\n1 2 # 可以先查看哪些可以申请，是否列出了需要的域名 sudo certbot --nginx 申请前保证域名解析到当前的 ip\ncertbot-dns-dnspod 此插件用于托管在 dnspod 上的域名通过 dns 方式申请\ndns 的优势是可以申请泛域名证书，也就是像 *.seektao.cc这种\n1 2 3 sudo snap install certbot-dns-dnspod sudo snap set certbot trust-plugin-with-root=ok sudo snap connect certbot:plugin certbot-dns-dnspod 安装完成之后新建一个 .ini 文件，比如 /etc/certbot/dnspod.ini\n1 2 sudo mkdir /etc/certbot sudo touch /etc/certbot/dnspod.ini 编辑 dnspod.ini，填入下面的内容，点此跳转到 dnspod api 申请页面，注意申请的是 dnspod token\n1 2 dns_dnspod_api_id = xxxxxxx dns_dnspod_api_token = xxxxxxxxxxxxxbcdef 1 sudo chmod 600 /etc/certbot/dnspod.ini 申请证书的命令，需要替换为自己的域名\n1 2 3 4 5 6 7 8 9 10 11 sudo certbot certonly -a dns-dnspod \\ --dns-dnspod-credentials /etc/certbot/dnspod.ini \\ -d \u0026#34;*.yourdomain.com\u0026#34; 接着就是: 输入邮箱， 是否同意注册acme（选Y）， 是否同意发送邮件。。。 接着等待，等待。。就完成了 证书文件保存在 /etc/letsencrypt/live\n1 2 3 4 5 # 其中 [cert name]/privkey.pem：证书的私钥。 [cert name]/fullchain.pem：在大多数服务器软件中使用的证书文件。 [cert name]/chain.pem：在Nginx \u0026gt;=1.3.7 中用于 OCSP stapling。 [cert name]/cert.pem：会破坏许多服务器配置，不应在未进一步阅读文档的情况下使用。 用到 privkey.pem，fullchain.pem 即可。\ncertbot-dns-cloudflare 此插件用于托管在 cloudflare 上的域名通过 dns 方式申请\ndns 的优势是可以申请泛域名证书，也就是像 *.seektao.cc这种\n1 2 3 4 5 6 7 8 9 10 11 12 sudo snap install certbot-dns-cloudflare # 如果提示如下错误信息，输入：sudo snap set certbot trust-plugin-with-root=ok # 接着重新执行 sudo snap install certbot-dns-cloudflare error: cannot perform the following tasks: - Run hook prepare-plug-plugin of snap \u0026#34;certbot\u0026#34; (run hook \u0026#34;prepare-plug-plugin\u0026#34;: ----- Only connect this interface if you trust the plugin author to have root on the system. Run `snap set certbot trust-plugin-with-root=ok` to acknowledge this and then run this command again to perform the connection. If that doesn\u0026#39;t work, you may need to remove all certbot-dns-* plugins from the system, then try installing the certbot snap again. -----) 申请 api token，点此跳转\n在 /etc/certbot 新建 cloudflare.ini，将下面的值替换为自己申请的 api token\n1 2 # Cloudflare API token used by Certbot dns_cloudflare_api_token = xxxxxxxxxxxxxxxxx 修改权限\n1 sudo chmod 600 cloudflare.ini 申请证书的命令，需要替换为自己的域名\n1 2 3 4 sudo certbot certonly \\ --dns-cloudflare \\ --dns-cloudflare-credentials /etc/certbot/cloudflare.ini \\ -d \u0026#34;*.youdomain.com\u0026#34; certbot-dns-huawei（待续） 此插件用于托管在 huawei 上的域名通过 dns 方式申请\ndns 的优势是可以申请泛域名证书，也就是像 *.seektao.cc这种\n自动续期 自动续期添加一个定时任务即可\n1 2 3 4 5 # 设置定时任务 sudo crontab -e # 每月1号的午夜执行 certbot renew 命令来续订证书 0 0 1 * * /usr/local/bin/certbot renew 需要注意自己的 certbot 执行路径是否正确 which certbot 可以看到 certbot 执行路径\n一键脚本 经过上面的步骤，你会发现每新增一个服务，需要\n新增 nginx 配置文件 配置 nginx 文件 验证并重启 nginx 服务 这时候发现服务器每新增一个服务，就需要添加、修改 nginx 配置文件，域名和端口这些都需要修改，申请 ssl 证书，这些步骤相当麻烦。\n如果没有一个简单的 nginx 模板，则会更加复杂繁琐。基于以上需求，我编写了一个脚本。功能：配置好服务后，只需要一条命令即可完成 nginx 配置，并配置 ssl 证书\n命令为：\n1 脚本名称 域名 端口号 如果需要获取原文和脚本，关注公众号\u0026quot;寻道之旅\u0026quot;，发送\u0026quot;nginx\u0026quot;获取。\n","date":"2024-10-03T15:11:58+08:00","image":"https://s2.loli.net/2024/10/03/maziQBGhWpPJyVD.png","permalink":"/p/241003151158/","title":"certbot申请SSL证书，自动续期，Nginx配置"},{"content":"进入 sqlite3 终端\n1 sqlite3 filename 查看表\n1 .table 查看表结构\n1 PRAGMA table_info(table_name); 清空表数据\n1 DELETE FROM table_name; 备份 导出数据库到sql文件\n1 sqlite3 your_database_name.db .dump \u0026gt; your_output_file.sql ","date":"2024-10-02T08:08:30+08:00","permalink":"/p/241002080830/","title":"sqlite基础"},{"content":"安装 安装指南：https://www.rust-lang.org/zh-CN/tools/install\nOn Unix, run curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh in your shell. This downloads and runs rustup-init.sh, which in turn downloads and runs the correct version of the rustup-init executable for your platform. On Windows, download and run rustup-init.exe. ","date":"2024-10-02T06:56:28+08:00","permalink":"/p/241002065628/","title":"cargo安装"},{"content":"V2Ray 的更新策略是快速迭代，每周更新(无意外的情况下)。版本号的格式是 vX.Y.Z，如 v2.44.0。v 是固定的字母 v，version 的首字母；X、Y、Z 都是数字，X 是大版本号，每年更新一个大版本(现在是 v4.Y.Z，V2Ray 已经走到了第四个年头)，Y 是小版本，每周五更新一个小版本。Z 是区分正式版和测试版，Z 是 0 代表着是正式版，不是 0 说明是测试版。例如，v4.7.0 是正式版，v4.7.1 是测试版，建议只使用正式版，不手动指定的情况下 V2Ray 的安装脚本也只会安装最新的正式版。\n有些细心的朋友可能会注意到有时候周五 V2Ray 刚发布了一个新版本，次日或过两日又更新一个正式版。出现这种情况是因为周五发布的正式版出现了影响使用严重的 BUG，需要立马发布一个新版本。这种情况比较烦，但是为了保证兼容性、性能优化等又需要保证版本不要太老旧。所以我比较建议在周四更新，选这么一个日子是因为有重大的 BUG 肯定在前面几天就已经修复了，小问题(恐怕都不知道有)的话不会影响使用；而且版本号与最新版相比迟那么一两个也没什么关系。\n","date":"2024-10-02T04:21:32+08:00","permalink":"/p/241002042132/","title":"版本号命名规则示例"},{"content":"指定 Docker 容器代理 本节介绍如何利用桥接的 docker 容器有单独 IP 的特点，通过 source IP 的限制，对特定 docker 容器进行代理，其他走直连。\n指定 Docker 容器代理 此方法只能适用于 v2rayA 与要控制路由的 Docker 容器在同一台机器的情况。\n透明代理使用 redirect 模式 正如 BT 下载直连 中所列方法，我们可以控制每一个桥接的 Docker 容器的路由。\n当 BT 应用运行在 Docker 时，默认的网络模式使用桥接模式（–network=bridge），此时容器会单独获得一个 IP 地址。而 Docker 的默认桥接网络为 172.17.0.0/16，容器会在该地址段中获取一个 IP 使用。如果我们想让所有桥接容器走直连，而特定容器走代理，可使用 RoutingA 进行控制，例如：\n1 2 3 # 将规则插入到较前位置 source(172.17.0.213) -\u0026gt; proxy source(172.17.0.0/16) -\u0026gt; direct 上述规则使得 172.17.0.213 走代理，而 172.17.0.0/16 段直连。\n当 docker 服务重启时，容器的 IP 地址可能会发生变化，因此需要固定容器的 IP 地址，方法参见 StackOverflow\n上的讨论。\n透明代理使用 tproxy 模式 由于一些限制，在此模式下，所有桥接容器默认直连，因此要走代理的容器需要将网络设为 host，即在容器启动时使用 --network host 参数。\n注意，host 模式下该容器将无法进行端口映射，容器内部监听的端口将直接监听在宿主上，容易引起端口冲突。\n参考： https://v2raya.org/docs/advanced-application/specify-container-proxy/\n","date":"2024-09-09T02:41:37+08:00","permalink":"/p/240909024137/","title":"v2rayA高级应用：指定 Docker 容器代理"},{"content":" 警告 这是告诫! 请注意!\n信息 这是引言\n提示 这是小贴示\n注释 这是注释\n源码：https://github.com/martignoni/hugo-notice\n","date":"2024-09-05T21:17:06+08:00","permalink":"/p/240905211706/","title":"博客更新：新增模块 hugo-notice"},{"content":"此篇文档书写不易，搭建过程中出现了众多错误，配置文件过于复杂，由我踩坑，望帮助到你。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 version: \u0026#34;3.2\u0026#34; services: outline: image: outlinewiki/outline:latest container_name: outline env_file: ./docker.env ports: - \u0026#34;3000:3000\u0026#34; volumes: - ./storage-data:/var/lib/outline/data depends_on: - postgres - redis redis: image: redis container_name: outline_redis env_file: ./docker.env ports: - \u0026#34;6379:6379\u0026#34; volumes: - ./redis.conf:/redis.conf command: [\u0026#34;redis-server\u0026#34;, \u0026#34;/redis.conf\u0026#34;] healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;redis-cli\u0026#34;, \u0026#34;ping\u0026#34;] interval: 10s timeout: 30s retries: 3 postgres: image: postgres container_name: outline_postgres env_file: ./docker.env ports: - \u0026#34;5432:5432\u0026#34; volumes: - ./database-data:/var/lib/postgresql/data healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;pg_isready\u0026#34;, \u0026#34;-d\u0026#34;, \u0026#34;outline\u0026#34;, \u0026#34;-U\u0026#34;, \u0026#34;user\u0026#34;] interval: 30s timeout: 20s retries: 3 environment: POSTGRES_USER: \u0026#39;user\u0026#39; POSTGRES_PASSWORD: \u0026#39;pass\u0026#39; POSTGRES_DB: \u0026#39;outline\u0026#39; https-portal: image: steveltn/https-portal container_name: outline_https-portal env_file: ./docker.env ports: - \u0026#39;80:80\u0026#39; - \u0026#39;443:443\u0026#39; links: - outline restart: unless-stopped volumes: - ./https-portal-data:/var/lib/https-portal healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;service\u0026#34;, \u0026#34;nginx\u0026#34;, \u0026#34;status\u0026#34;] interval: 30s timeout: 20s retries: 3 environment: DOMAINS: \u0026#39;docs.seektao.cc -\u0026gt; http://outline:3000\u0026#39; STAGE: \u0026#39;production\u0026#39; WEBSOCKET: \u0026#39;true\u0026#39; CLIENT_MAX_BODY_SIZE: \u0026#39;0\u0026#39; docker.env\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 # –––––––––––––––– REQUIRED –––––––––––––––– NODE_ENV=production # Generate a hex-encoded 32-byte random key. You should use `openssl rand -hex 32` # in your terminal to generate a random value. SECRET_KEY=a5a8564663263819b472876321f5a505782004ea0e2fae704312fae53a77fe1f # Generate a unique random key. The format is not important but you could still use # `openssl rand -hex 32` in your terminal to produce this. UTILS_SECRET=generate_a_new_key # For production point these at your databases, in development the default # should work out of the box. DATABASE_URL=postgres://user:pass@outline_postgres:5432/outline DATABASE_CONNECTION_POOL_MIN= DATABASE_CONNECTION_POOL_MAX= # Uncomment this to disable SSL for connecting to Postgres PGSSLMODE=disable # For redis you can either specify an ioredis compatible url like this REDIS_URL=redis://outline_redis:6379 # or alternatively, if you would like to provide additional connection options, # use a base64 encoded JSON connection option object. Refer to the ioredis documentation # for a list of available options. # Example: Use Redis Sentinel for high availability # {\u0026#34;sentinels\u0026#34;:[{\u0026#34;host\u0026#34;:\u0026#34;sentinel-0\u0026#34;,\u0026#34;port\u0026#34;:26379},{\u0026#34;host\u0026#34;:\u0026#34;sentinel-1\u0026#34;,\u0026#34;port\u0026#34;:26379}],\u0026#34;name\u0026#34;:\u0026#34;mymaster\u0026#34;} # REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJzZW50aW5lbC0wIiwicG9ydCI6MjYzNzl9LHsiaG9zdCI6InNlbnRpbmVsLTEiLCJwb3J0IjoyNjM3OX1dLCJuYW 1lIjoibXltYXN0ZXIifQ== # URL should point to the fully qualified, publicly accessible URL. If using a # proxy the port in URL and PORT may be different. URL=https://docs.seektao.cc PORT=3000 # See [documentation](docs/SERVICES.md) on running a separate collaboration # server, for normal operation this does not need to be set. COLLABORATION_URL= # Specify what storage system to use. Possible value is one of \u0026#34;s3\u0026#34; or \u0026#34;local\u0026#34;. # For \u0026#34;local\u0026#34;, the avatar images and document attachments will be saved on local disk. FILE_STORAGE=local # If \u0026#34;local\u0026#34; is configured for FILE_STORAGE above, then this sets the parent directory under # which all attachments/images go. Make sure that the process has permissions to create # this path and also to write files to it. FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data # Maximum allowed size for the uploaded attachment. FILE_STORAGE_UPLOAD_MAX_SIZE=262144000 # Override the maximum size of document imports, generally this should be lower # than the document attachment maximum size. FILE_STORAGE_IMPORT_MAX_SIZE= # Override the maximum size of workspace imports, these can be especially large # and the files are temporary being automatically deleted after a period of time. FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE= # To support uploading of images for avatars and document attachments in a distributed # architecture an s3-compatible storage can be configured if FILE_STORAGE=s3 above. AWS_ACCESS_KEY_ID=get_a_key_from_aws AWS_SECRET_ACCESS_KEY=get_the_secret_of_above_key AWS_REGION=xx-xxxx-x AWS_S3_ACCELERATE_URL= AWS_S3_UPLOAD_BUCKET_URL=http://s3:4569 AWS_S3_UPLOAD_BUCKET_NAME=bucket_name_here AWS_S3_FORCE_PATH_STYLE=true AWS_S3_ACL=private # –––––––––––––– AUTHENTICATION –––––––––––––– # Third party signin credentials, at least ONE OF EITHER Google, Slack, # or Microsoft is required for a working installation or you\u0026#39;ll have no sign-in # options. # To configure Slack auth, you\u0026#39;ll need to create an Application at # =\u0026gt; https://api.slack.com/apps # # When configuring the Client ID, add a redirect URL under \u0026#34;OAuth \u0026amp; Permissions\u0026#34;: # https:///auth/slack.callback # https://docs.seektao.cc/auth/slack.callback SLACK_CLIENT_ID=7687326676465.7671810207669 SLACK_CLIENT_SECRET=432ad37fe62d5ff357dc807c13fd64b9 # To configure Google auth, you\u0026#39;ll need to create an OAuth Client ID at # =\u0026gt; https://console.cloud.google.com/apis/credentials # # When configuring the Client ID, add an Authorized redirect URI: # https:///auth/google.callback GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= # To configure Microsoft/Azure auth, you\u0026#39;ll need to create an OAuth Client. See # the guide for details on setting up your Azure App: # =\u0026gt; https://wiki.generaloutline.com/share/dfa77e56-d4d2-4b51-8ff8-84ea6608faa4 AZURE_CLIENT_ID= AZURE_CLIENT_SECRET= AZURE_RESOURCE_APP_ID= # To configure generic OIDC auth, you\u0026#39;ll need some kind of identity provider. # See documentation for whichever IdP you use to acquire the following info: # Redirect URI is https:///auth/oidc.callback OIDC_CLIENT_ID= OIDC_CLIENT_SECRET= OIDC_AUTH_URI= OIDC_TOKEN_URI= OIDC_USERINFO_URI= OIDC_LOGOUT_URI= # Specify which claims to derive user information from # Supports any valid JSON path with the JWT payload OIDC_USERNAME_CLAIM=preferred_username # Display name for OIDC authentication OIDC_DISPLAY_NAME=OpenID Connect # Space separated auth scopes. OIDC_SCOPES=openid profile email # To configure the GitHub integration, you\u0026#39;ll need to create a GitHub App at # =\u0026gt; https://github.com/settings/apps # # When configuring the Client ID, add a redirect URL under \u0026#34;Permissions \u0026amp; events\u0026#34;: # https:///api/github.callback GITHUB_CLIENT_ID=Ov23liFFJo2SJ5bdvaiO GITHUB_CLIENT_SECRET=304221a41c3ab12854076c617bf9762823741f99 GITHUB_APP_NAME= GITHUB_APP_ID= GITHUB_APP_PRIVATE_KEY= # To configure Discord auth, you\u0026#39;ll need to create a Discord Application at # =\u0026gt; https://discord.com/developers/applications/ # # When configuring the Client ID, add a redirect URL under \u0026#34;OAuth2\u0026#34;: # https:///auth/discord.callback DISCORD_CLIENT_ID= DISCORD_CLIENT_SECRET= # DISCORD_SERVER_ID should be the ID of the Discord server that Outline is # integrated with. # Used to verify that the user is a member of the server as well as server # metadata such as nicknames, server icon and name. DISCORD_SERVER_ID= # DISCORD_SERVER_ROLES should be a comma separated list of role IDs that are # allowed to access Outline. If this is not set, all members of the server # will be allowed to access Outline. # DISCORD_SERVER_ID and DISCORD_SERVER_ROLES must be set together. DISCORD_SERVER_ROLES= # –––––––––––––––– OPTIONAL –––––––––––––––– # Base64 encoded private key and certificate for HTTPS termination. This is only # required if you do not use an external reverse proxy. See documentation: # https://wiki.generaloutline.com/share/1c922644-40d8-41fe-98f9-df2b67239d45 SSL_KEY= SSL_CERT= # If using a Cloudfront/Cloudflare distribution or similar it can be set below. # This will cause paths to javascript, stylesheets, and images to be updated to # the hostname defined in CDN_URL. In your CDN configuration the origin server # should be set to the same as URL. CDN_URL= # Auto-redirect to https in production. The default is true but you may set to # false if you can be sure that SSL is terminated at an external loadbalancer. FORCE_HTTPS=true # Have the installation check for updates by sending anonymized statistics to # the maintainers ENABLE_UPDATES=true # How many processes should be spawned. As a reasonable rule divide your servers # available memory by 512 for a rough estimate WEB_CONCURRENCY=1 # You can remove this line if your reverse proxy already logs incoming http # requests and this ends up being duplicative DEBUG=http # Configure lowest severity level for server logs. Should be one of # error, warn, info, http, verbose, debug and silly LOG_LEVEL=info # For a complete Slack integration with search and posting to channels the # following configs are also needed, some more details # =\u0026gt; https://wiki.generaloutline.com/share/be25efd1-b3ef-4450-b8e5-c4a4fc11e02a # SLACK_VERIFICATION_TOKEN=your_token SLACK_APP_ID=A0XXXXXXX SLACK_MESSAGE_ACTIONS=true # For Dropbox integration, follow these instructions to get the key https://www.dropbox.com/developers/embedder#setup # and do not forget to whitelist your domain name in the app settings DROPBOX_APP_KEY= # Optionally enable Sentry (sentry.io) to track errors and performance, # and optionally add a Sentry proxy tunnel for bypassing ad blockers in the UI: # https://docs.sentry.io/platforms/javascript/troubleshooting/#using-the-tunnel-option) SENTRY_DSN= SENTRY_TUNNEL= # To support sending outgoing transactional emails such as \u0026#34;document updated\u0026#34; or # \u0026#34;you\u0026#39;ve been invited\u0026#34; you\u0026#39;ll need to provide authentication for an SMTP server SMTP_HOST= SMTP_PORT= SMTP_USERNAME= SMTP_PASSWORD= SMTP_FROM_EMAIL= SMTP_REPLY_EMAIL= SMTP_TLS_CIPHERS= SMTP_SECURE=true # The default interface language. See translate.getoutline.com for a list of # available language codes and their rough percentage translated. DEFAULT_LANGUAGE=en_US # Optionally enable rate limiter at application web server RATE_LIMITER_ENABLED=true # Configure default throttling parameters for rate limiter RATE_LIMITER_REQUESTS=1000 RATE_LIMITER_DURATION_WINDOW=60 # Iframely API config IFRAMELY_URL=https://docs.seektao.cc IFRAMELY_API_KEY=9fabb0c3c7fad08a16fcf3 ","date":"2024-09-04T15:09:28+08:00","permalink":"/p/240904150928/","title":"outline，一款开源的文档知识库"},{"content":"刷机过程 略\n基本设置 灯 https://www.bilibili.com/read/cv21700714/\n玩客云这设备有个红、绿、蓝三色 led 灯，在刷入 armbian 系统以后，这个灯的颜色就会显示异常，往往是一直显示红色。\n如果要自动动手调整 led 灯的颜色，控制命令如下（需要 root 用户执行）\n1 2 3 echo 1 \u0026gt; /sys/class/leds/onecloud:blue:alive/brightness echo 1 \u0026gt; /sys/class/leds/onecloud:green:alive/brightness echo 1 \u0026gt; /sys/class/leds/onecloud:red:alive/brightness echo 1是开，echo 0就是关。现在可以组合出多种颜色，蓝绿、红蓝、红绿、红绿蓝。😄\n但这个设置重启后失效。╮(╯▽╰)╭\n静态 ip 查看当前网络连接信息\n1 nmcli connection show 设置静态 ip\n1 2 3 4 nmcli connection modify \u0026#34;Wired connection 1\u0026#34; ipv4.addresses 192.168.68.9/24 nmcli connection modify \u0026#34;Wired connection 1\u0026#34; ipv4.gateway 192.168.68.1 nmcli connection modify \u0026#34;Wired connection 1\u0026#34; ipv4.dns 223.5.5.5 nmcli connection modify \u0026#34;Wired connection 1\u0026#34; ipv4.method manual 重新启动网络连接：\n1 2 nmcli connection down \u0026#34;Wired connection 1\u0026#34; nmcli connection up \u0026#34;Wired connection 1\u0026#34; 检查网络配置，确保静态 IP 已成功应用：\n1 nmcli connection show \u0026#34;Wired connection 1\u0026#34; 应用 casaos 非必须不建议\n内存占用很大，没需求不建议安装\n一键安装脚本：\n1 wget -qO- https://get.casaos.io | bash casaos 商店源 https://play.cuse.eu.org/Cpe204-Appstore-play-arm.zip\n1panel 管理面板，替代 casaos，内存占用大约 50M，功能齐全\n界面预览：\n安装后系统占用对比\n安装前：\n安装后：\n一键安装脚本\n1 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; bash quick_start.sh v2raya 代理工具，web 端，默认端口 2017，初次下载速度较慢，耐心等待。\n1 wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo tee /etc/apt/keyrings/v2raya.asc 1 2 echo \u0026#34;deb [signed-by=/etc/apt/keyrings/v2raya.asc] https://apt.v2raya.org/ v2raya main\u0026#34; | sudo tee /etc/apt/sources.list.d/v2raya.list sudo apt update 1 sudo apt install v2raya v2ray ## 也可以使用 xray 包 alist 经典的网盘管理工具\n官网：https://alist.nn.ci/zh/\n源码：https://github.com/alist-org/alist\n二进制文件安装\n下载地址：v3.37.4/alist-linux-arm-7.tar.gz\n1 2 3 4 5 6 7 8 9 10 11 # 下载 mkdir -p /opt/alist wget https://github.com/alist-org/alist/releases/download/v3.37.4/alist-linux-arm-7.tar.gz tar -zxvf alist-linux-arm-7.tar.gz -C /opt/alist # 安装启动 cd /opt/alist chmod +x alist ./alist server # 启动会前台阻塞 # 新开一个终端设置密码 ./alist admin set 密码 安装服务\n1 2 # 安装服务 vim /usr/lib/systemd/system/alist.service 1 2 3 4 5 6 7 8 9 10 11 12 13 # 填入一下内容 [Unit] Description=alist After=network.target [Service] Type=simple WorkingDirectory=/opt/alist ExecStart=/opt/alist/alist server Restart=on-failure [Install] WantedBy=multi-user.target docker 安装\n1 docker run -d --restart=unless-stopped -v /opt/alist:/opt/alist/data -p 5245:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name=\u0026#34;alist\u0026#34; xhofe/alist-aria2:main docker-compose 安装\n1 2 3 sudo mkdir -p /opt/alist cd /opt/alist sudo vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 version: \u0026#39;3.3\u0026#39; services: alist: image: \u0026#39;xhofe/alist-aria2:latest\u0026#39; volumes: - \u0026#39;./data:/opt/alist/data\u0026#39; - \u0026#39;/home:/home\u0026#39; - \u0026#39;/root:/root\u0026#39; ports: - \u0026#39;5245:5244\u0026#39; environment: - PUID=0 - PGID=0 - UMASK=000 container_name: alist restart: unless-stopped 重置密码\n1 docker exec -it alist ./alist admin set \u0026lt;your_password\u0026gt; ddns-go ddns 神器，go 语言编写，内存占用低。\n源码：https://github.com/jeessy2/ddns-go\nwg-esay 异地组网工具 wireguard，wg-easy 是简化 wireguard 部署过程的开源项目，使用 docker 部署，简单快速上手。\nwireguard 是虚拟加密网络（VPN）,它可以使异地的设备组成一个局域网，换句话说就是可以在外地可以像在家中一样访问家中的设备，ip 地址都可以不变。\n源码：https://github.com/wg-easy/wg-easy\n部署\ndocker\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 docker run -d \\ --name=wg-easy \\ -e LANG=de \\ -e WG_HOST=\u0026lt;🚨YOUR_SERVER_IP\u0026gt; \\ -e PASSWORD_HASH=\u0026lt;🚨YOUR_ADMIN_PASSWORD_HASH\u0026gt; \\ -e PORT=51821 \\ -e WG_PORT=51820 \\ -v ~/.wg-easy:/etc/wireguard \\ -p 51820:51820/udp \\ -p 51821:51821/tcp \\ --cap-add=NET_ADMIN \\ --cap-add=SYS_MODULE \\ --sysctl=\u0026#34;net.ipv4.conf.all.src_valid_mark=1\u0026#34; \\ --sysctl=\u0026#34;net.ipv4.ip_forward=1\u0026#34; \\ --restart unless-stopped \\ ghcr.io/wg-easy/wg-easy docker-compose\n1 wget https://github.com/wg-easy/wg-easy/blob/master/docker-compose.yml 密码部分生成：\n1 docker run ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD 如果是 单个 $要改成 $$\n部署后请注意开放对应端口。\nlucky Lucky 最初是作为一个小工具，由开发者为自己的个人使用而开发，用于替代 socat，在小米路由 AX6000 官方系统上实现公网 IPv6 转内网 IPv4 的功能。Lucky 的设计始终致力于让更多的 Linux 嵌入式设备运行，以实现或集成个人用户常用功能，降低用户的硬件和软件操作学习成本，同时引导使用者注意网络安全。随着版本更新和网友反馈，Lucky 不断迭代改进，拥有更多功能和更好的性能，成为用户值得信赖的工具。\nLucky 的核心程序完全采用 Golang 实现，具有高效、稳定、跨平台等优点。其后台前端则采用 Vue3.2 技术进行开发，具有良好的用户体验和响应速度。此外，Lucky 的管理后台采用前后端分离的架构，第三方开发者也可以自由使用 OpenToken 轻松调用 Lucky 的各种功能接口。\n安装\n1 URL=\u0026#34;http://release.ilucky.net:66\u0026#34;; curl -o /tmp/install.sh \u0026#34;$URL/install.sh\u0026#34; \u0026amp;\u0026amp; sh /tmp/install.sh \u0026#34;$URL\u0026#34; ","date":"2024-09-02T18:09:19+08:00","permalink":"/p/240902180979/","title":"玩客云onecloud刷机安装armbian系统，安装应用"},{"content":"设置 输入 变为高级模式\n录像\n编码器设置\nCBR（Constant Bit Rate，恒定码率）：\n码率在整个视频中保持不变。 优点：适合实时流媒体，确保带宽稳定，避免视频卡顿。 缺点：在复杂场景中可能导致画质下降，因为码率不随内容复杂度变化。 ABR（Average Bit Rate，平均码率）：\n码率在一定范围内波动，但保持一个平均值。 优点：在保证整体画质的同时，适应不同场景的复杂度。 缺点：可能在某些时刻出现瞬时的画质波动。 VBR（Variable Bit Rate，可变码率）：\n码率根据视频内容的复杂度动态调整。 优点：在复杂场景中使用更高的码率，简单场景中使用更低的码率，从而提高整体画质。 缺点：可能导致文件大小不稳定，不适合实时流媒体。 CRF（Constant Rate Factor，恒定质量因子）：\n主要用于视频编码（如使用 x264 编码器），通过设置一个质量因子来控制输出质量，而不是直接控制码率。 优点：可以保持高质量的同时，文件大小相对较小。质量因子通常在 0-51 之间，值越低，质量越高。 缺点：文件大小不固定，可能导致某些文件过大。 选择合适的码率控制方法取决于你的需求，例如直播的稳定性、录制的画质要求以及带宽条件。\n视频 常用帧率\n10 FPS：每秒显示10帧，适用于低流量视频。 20 FPS：每秒显示20帧，适用于简单的动画或低质量视频。 24 FPS：通常用于电影制作，提供较为平滑的视觉效果。 25 FPS：PAL制式（主要在欧洲和其他地区使用）的标准帧率。 29.97 FPS：NTSC制式（主要在北美和日本使用）的标准帧率，常用于电视广播。 30 FPS：在某些情况下使用，略高于29.97 FPS，适合网络视频。 34 FPS：不常见，可能用于特定应用或实验性视频。 48 FPS：用于高帧率电影，例如一些3D电影，以增强视觉体验。 50 FPS：PAL制式的高帧率，适合动作较快的内容。 59.94 FPS：接近60 FPS，主要用于高质量视频和游戏直播，提供流畅的画面。 60 FPS：高帧率，适合动作视频、游戏等，提供非常流畅的观看体验。 就我录制教学视频来说，一般情况下选择 30帧 即可，某些情况下转为 60 帧\n","date":"2024-09-01T10:09:09+08:00","permalink":"/p/240901100943/","title":"OBS使用经验"},{"content":"Firefox 关闭 http 强制自动跳转 https 访问\n地址栏输入 about:config 接受风险并继续 输入 network.stricttransportsecurity.preloadlist 切换为 false network.stricttransportsecurity.preloadlist：将其设置为 false，可以让 Firefox 不使用 HSTS 预加载列表，但这并不完全阻止 HSTS 的使用。\n","date":"2024-08-26T19:08:28+08:00","permalink":"/p/240826190828/","title":"Firefox关闭http强制自动跳转https访问"},{"content":"PVE环境下OpenWrt扩容 按照官方指南在 PVE 下安装 OpenWrt，磁盘容量为镜像的容量，也就 100+M，实际可用几十 M，为了安装更多软件，需要对此进行扩容\n安装 OpenWrt 步骤参考：略\n具体方法：\n在 PVE 管理界面，找到 OpenWrt 虚拟机，点击左侧菜单“Hardware”，然后找到系统镜像的“Hard Disk”，点击选中，再点击菜单“Disk Action”，点击“Resize”，增加磁盘大小，PVE 设置完成 SSH 连接 OpenWrt 虚拟机 按照OpenWrt 官方扩容指南扩容 1 2 3 4 5 6 7 8 9 10 11 12 # Install packages opkg update opkg install parted losetup resize2fs blkid # Download expand-root.sh wget -U \u0026#34;\u0026#34; -O expand-root.sh \u0026#34;https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0\u0026#34; # Source the script (creates /etc/uci-defaults/70-rootpt-resize and /etc/uci-defaults/80-rootpt-resize, and adds them to /etc/sysupgrade.conf so they will be re-run after a sysupgrade) . ./expand-root.sh # Resize root partition and filesystem (will resize partiton, reboot resize filesystem, and reboot again) sh /etc/uci-defaults/70-rootpt-resize 执行完成之后，会自动重启，登录 OpenWrt 网页，点击概览即可查看扩容已经生效 配置 IP 和 DNS 编辑配置文件\n1 vim /etc/config/network 找到对应接口，修改 ipaddr 和增加 dns\n1 2 3 4 5 6 7 config interface \u0026#39;lan\u0026#39; option device \u0026#39;br-lan\u0026#39; option proto \u0026#39;static\u0026#39; option ip6assign \u0026#39;60\u0026#39; list ipaddr \u0026#39;192.168.68.23/24\u0026#39; option gateway \u0026#39;192.168.68.1\u0026#39; option dns \u0026#39;119.29.29.29\u0026#39; 重启网卡\n1 /etc/init.d/network restart 安装软件 界面：\n依次点击\u0026quot;System\u0026quot;，“Software”就可以找到软件安装界面，使用之前需要点击“Update lists”获取软件包列表\n终端：\n1 2 opkg update opkg install 软件包名字 关闭防火墙 1 2 3 4 5 # 阻止防火墙服务开机自动启动 /etc/init.d/firewall disable # 关闭防火墙 /etc/init.d/firewall stop openwrt 定时任务失效 要在 OpenWrt 系统开机后执行某个脚本，可以通过以下步骤实现：\n创建脚本 首先，创建你希望在开机时执行的脚本。例如，创建一个名为 myscript.sh 的脚本： 1 2 touch /usr/bin/myscript.sh chmod +x /usr/bin/myscript.sh 在脚本中添加你需要执行的命令：\n1 2 3 #!/bin/sh # your commands here echo \u0026#34;Script is running!\u0026#34; \u0026gt;\u0026gt; /tmp/myscript.log 编辑 /etc/init.d/ 目录 在 /etc/init.d/ 目录下创建一个启动脚本。可以命名为 myscript： 1 2 touch /etc/init.d/myscript chmod +x /etc/init.d/myscript 编辑启动脚本 用文本编辑器打开 /etc/init.d/myscript，并添加以下内容： 1 2 3 4 5 6 7 8 #!/bin/sh /etc/rc.common # This script will run at startup START=99 # Start order, higher means later start() { /usr/bin/myscript.sh } 启用启动脚本 使脚本在启动时自动运行： 1 /etc/init.d/myscript enable 重启系统 重启 OpenWrt 系统，确认脚本是否在开机时执行： 1 reboot 检查输出 重启后，可以检查日志文件 /tmp/myscript.log，确认脚本是否成功执行。 通过这些步骤，您可以确保在 OpenWrt 系统开机后自动执行指定的脚本。\n问题合集 openwrt 重启丢失定时任务 版本：lanlan-op 11.25.2023 by 蓝蓝定制-可爱赞助用户 / LuCI Master git-24.322.44728-ebf6bee\n解决办法：删除 reboot 包，系统-软件包-搜索过滤 reboot关键字，删除，重启，再编辑定时任务，再重启查看是否消失。\n","date":"2024-08-26T14:08:06+08:00","permalink":"/p/240826140866/","title":"OpenWrt指南"},{"content":"简介 curl 是一个用于从命令行或脚本中与 URL 进行交互的工具。它支持多种协议，包括 HTTP、HTTPS、FTP、SFTP 等，广泛用于数据传输和网络请求。\n安装 在大多数 Linux 发行版中，curl 通常预装。你可以通过以下命令检查是否已安装：\n1 curl --version 如果未安装，可以使用包管理器进行安装：\nDebian/Ubuntu:\n1 sudo apt-get install curl CentOS/RHEL:\n1 sudo yum install curl macOS:\n1 brew install curl 基本用法 最简单的用法是直接跟上 URL，curl 会默认使用 GET 方法请求该 URL，并将其响应内容（通常是 HTML 或 JSON）打印到标准输出（你的终端屏幕上）。\n1 2 # 请求一个网页并显示其 HTML 内容 curl https://www.example.com 常见参数（按功能分类） 输出控制 (Output Control) 默认情况下，curl 将所有内容输出到屏幕。以下参数可以控制输出行为。\n-o, --output \u0026lt;file\u0026gt; 功能：将输出保存到指定的文件，而不是屏幕。 示例：curl -o page.html https://www.example.com -O, --remote-name 功能：将输出保存到文件，并以 URL 中指定的文件名来命名。 示例：curl -O https://curl.se/download/curl-7.85.0.tar.gz (会保存为 curl-7.85.0.tar.gz 文件) -s, --silent 功能：静默模式。不显示进度表或错误信息。非常适合在脚本中使用。 示例：cron_job_result=$(curl -s https://api.example.com/status) -i, --include 功能：在输出中包含 HTTP 响应头（Response Headers）。这对于调试非常有用。 示例：curl -i https://www.example.com -v, --verbose 功能：显示详细的通信过程，包括请求头、响应头和连接信息。是终极调试利器。 示例：curl -v https://api.example.com/data HTTP 请求方法 (HTTP Method) -X, --request \u0026lt;METHOD\u0026gt; 功能：指定要使用的 HTTP 请求方法，如 GET, POST, PUT, DELETE 等。默认是 GET。 示例： curl -X POST https://api.example.com/users curl -X DELETE https://api.example.com/users/123 发送数据 (Sending Data) 常用于 POST 或 PUT 请求。\n-d, --data \u0026lt;data\u0026gt; 功能：发送 HTTP POST 请求的数据。Content-Type 默认为 application/x-www-form-urlencoded。 示例 (发送表单数据)：curl -X POST -d \u0026quot;name=John\u0026amp;age=30\u0026quot; https://api.example.com/register 示例 (发送 JSON 数据)：需要配合 -H 指定 Content-Type。 curl -X POST -d '{\u0026quot;name\u0026quot;:\u0026quot;John\u0026quot;, \u0026quot;age\u0026quot;:30}' -H \u0026quot;Content-Type: application/json\u0026quot; https://api.example.com/users 从文件读取数据：curl -d @data.json -H \u0026quot;Content-Type: application/json\u0026quot; https://api.example.com/users (注意 @ 符号) -F, --form \u0026lt;name=content\u0026gt; 功能：发送 multipart/form-data 类型的数据，常用于文件上传。 示例 (上传文件)：curl -X POST -F \u0026quot;file=@/path/to/your/image.jpg\u0026quot; -F \u0026quot;username=dave\u0026quot; https://api.example.com/upload 自定义请求头 (Custom Headers) -H, --header \u0026lt;header\u0026gt; 功能：添加自定义的 HTTP 请求头。可以多次使用以添加多个头。 示例： 设置内容类型：curl -H \u0026quot;Content-Type: application/json\u0026quot; ... 设置认证 Token：curl -H \u0026quot;Authorization: Bearer your_jwt_token\u0026quot; https://api.example.com/secure-data 模拟浏览器：curl -H \u0026quot;User-Agent: Mozilla/5.0\u0026quot; https://www.example.com 安全与认证 (Security \u0026amp; Authentication) -u, --user \u0026lt;user:password\u0026gt; 功能：设置 HTTP Basic Authentication 的用户名和密码。 示例：curl -u admin:123456 https://api.example.com/admin -k, --insecure 功能：允许 curl 连接到没有有效 SSL/TLS 证书的 HTTPS 站点（例如，使用自签名证书的开发环境）。警告：请勿在生产环境中使用此选项！ 示例：curl -k https://localhost:8443 -L, --location 功能：自动跟踪 HTTP 重定向（响应状态码为 3xx）。很多网站会使用重定向，所以这是一个非常实用的参数。 示例：curl -L http://google.com (http 会重定向到 https) 连接控制 (Connection Control) --connect-timeout \u0026lt;seconds\u0026gt; 功能：设置建立连接的最大等待时间（秒）。 示例：curl --connect-timeout 5 https://api.example.com -m, --max-time \u0026lt;seconds\u0026gt; 功能：设置整个操作（连接、数据传输等）允许花费的最长时间。 示例：curl -m 10 https://api.example.com -x, --proxy \u0026lt;[protocol://]host[:port]\u0026gt; 功能：通过指定的代理服务器发送请求。 示例：curl -x http://proxyserver:8080 https://www.example.com 常用参数速查表 短参数 长参数 功能说明 -X --request 指定 HTTP 请求方法 (GET, POST, PUT, DELETE) -H --header 添加自定义请求头 (例如 Content-Type, Authorization) -d --data 发送 application/x-www-form-urlencoded 格式的数据 -F --form 发送 multipart/form-data 数据，常用于文件上传 -i --include 在输出中包含响应头 -v --verbose 显示详细的通信过程，用于调试 -o --output 将输出保存到指定文件 -O --remote-name 以远程文件名保存输出 -s --silent 静默模式，不显示进度和错误 -L --location 自动跟随 HTTP 重定向 -u --user 设置 HTTP 基本认证的用户名和密码 -k --insecure 忽略 SSL 证书验证 (慎用！) ","date":"2024-08-19T11:08:08+08:00","permalink":"/p/240819110878/","title":"curl，命令行或脚本中与URL进行交互的工具"},{"content":"简介 开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。 借助适用于 Linux 的 Windows 子系统（WSL），开发人员可以安装 Linux 分发版（如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等），并在 Windows 上直接使用 Linux 应用程序、实用工具和 Bash 命令行工具（未经修改），无需传统虚拟机或双包设置的开销。\n官方文档：https://learn.microsoft.com/zh-cn/windows/wsl/\n先决条件 必须运行 Windows 10 版本 2004 及更高版本（内部版本 19041 及更高版本）或 Windows 11 才能使用以下命令。 如果使用的是早期版本，请参阅 手动安装页。\n安装 WSL 现在，可以使用单个命令安装运行 WSL 所需的所有内容。 右键单击并选择“以管理员身份运行”，在 管理员 模式下打开 PowerShell 或 Windows 命令提示符，输入 wsl \u0026ndash;install 命令，然后重新启动计算机。\n1 wsl --install 此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 分发所需的功能。 （可以更改此默认分布）。\n如果运行的是较旧的版本，或者只是不想使用安装命令，并且想要分步说明，请参阅 适用于旧版本的 WSL 手动安装步骤。\n首次启动新安装的 Linux 分发版时，控制台窗口将打开，系统会要求你等待文件取消压缩并存储在计算机上。 所有未来的发射应该需要不到一秒钟的时间。\n更改安装的默认 Linux 分发版 默认情况下，已安装的 Linux 分发版将为 Ubuntu。 可以通过使用-d标志来更改这一点。\n若要更改安装的分发版，请输入： wsl --install -d \u0026lt;Distribution Name\u0026gt; 将 \u0026lt;Distribution Name\u0026gt; 替换为您想要安装的分发版名称。 若要查看可通过在线商店下载的可用 Linux 分发版的列表，请输入： wsl --list --online 或 wsl -l -o。 若要在初始安装后安装其他 Linux 分发版，也可以使用以下命令： wsl --install -d \u0026lt;Distribution Name\u0026gt; 如果要从 Linux/Bash 命令行（而不是 PowerShell 或命令提示符）安装其他分发版，则必须在命令中使用 .exe：或列出可用分发版： wsl.exe --install -d \u0026lt;Distribution Name\u0026gt;``wsl.exe -l -o\n如果在安装过程中遇到问题，请查看故障排除指南 安装部分。\n若要安装未列为可用的 Linux 分发版，可以使用 TAR 文件 导入任何 Linux 分发 版。 或者在某些情况下，与 Arch Linux 一样，可以使用文件进行安装 .appx 。 还可以创建自己的 自定义 Linux 分发版 ，以便与 WSL 一起使用。\n设置 Linux 用户信息 安装 WSL 后，需要为新安装的 Linux 分发版创建用户帐户和密码。 请参阅 设置 WSL 开发环境指南的最佳做法 ，了解详细信息。\n配置和最佳实践 建议遵循我们的 设置 WSL 开发环境的最佳实践 指南，通过逐步演示来了解如何为已安装的 Linux 发行版设置用户名和密码，使用基本 WSL 命令，安装和自定义 Windows 终端，为 Git 版本控制、代码编辑和调试使用 VS Code 远程服务器，好的文件存储实践，设置数据库，装载外部驱动器，设置 GPU 加速等。\n检查你正在运行的 WSL 的版本 可以通过在 PowerShell 或 Windows 命令提示符中输入命令 wsl -l -v 来列出已安装的 Linux 发行版，并检查每个发行版设置的 WSL 版本。\n若要在安装新的 Linux 分发版时将默认版本设置为 WSL 1 或 WSL 2，请使用以下命令 wsl --set-default-version \u0026lt;Version#\u0026gt;，替换为 \u0026lt;Version#\u0026gt; 1 或 2。\n要设置默认的 Linux 发行版以用于 wsl 命令，请输入：在 wsl -s \u0026lt;DistributionName\u0026gt; 或 wsl --set-default \u0026lt;DistributionName\u0026gt; 中将 \u0026lt;DistributionName\u0026gt; 替换为你想使用的 Linux 发行版名称。 例如，在 PowerShell/CMD 中，输入： wsl -s Debian 将默认分发设置为 Debian。 现在，从 Powershell 运行 wsl npm init 将在 Debian 中运行 npm init 命令。\n若要在不更改默认分发的情况下从 PowerShell 或 Windows 命令提示符内运行特定的 wsl 分发版，请使用以下命令： wsl -d \u0026lt;DistributionName\u0026gt;，替换为 \u0026lt;DistributionName\u0026gt; 要使用的分发的名称。\n在 WSL 基本命令指南中了解详细信息。\n将版本从 WSL 1 升级到 WSL 2 默认情况下，使用 wsl --install 命令安装的新 Linux 安装将设置为 WSL 2。\n该 wsl --set-version 命令可用于从 WSL 2 降级到 WSL 1，或将以前安装的 Linux 分发版从 WSL 1 降级到 WSL 2。\n若要查看 Linux 分发版是否设置为 WSL 1 或 WSL 2，请使用以下命令： wsl -l -v\n若要更改版本，请使用命令： wsl --set-version \u0026lt;distro name\u0026gt; 2 替换为 \u0026lt;distro name\u0026gt; 要更新的 Linux 分发版的名称。 例如， wsl --set-version Ubuntu-20.04 2 将 Ubuntu 20.04 分发版设置为使用 WSL 2。\n如果在命令可用之前 wsl --install 手动安装了 WSL，则还可能需要启用 WSL 2 使用的 虚拟机可选组件 ，并 安装内核包 （如果尚未这样做）。\n若要了解更多信息，请参阅 WSL 的命令参考以获取 WSL 命令列表，查看 WSL 1 和 WSL 2 的比较以获得关于您工作场景适用版本的指导，或参考 设置 WSL 开发环境的最佳实践以获取关于设置高效开发工作流程的一般指导。\n使用 WSL 运行多个 Linux 分发版的方法 WSL 支持运行您想安装的许多不同的 Linux 发行版。 这包括从 Microsoft 应用商店中选择分发版、 导入自定义分发版或 生成自己的自定义分发版。\n安装 Linux 分发版后，可通过多种方式运行：\n安装 Windows 终端（推荐）。使用 Windows 终端可以支持多个命令行，并允许您在多个选项卡或窗口窗格中打开它们，并能在多个 Linux 发行版或其他命令行（如 PowerShell、命令提示符、Azure CLI 等）之间快速切换。 可以使用独特的配色方案、字体样式、大小、背景图像和自定义键盘快捷方式完全自定义终端。 了解详细信息。 可以通过访问 Windows 开始菜单并键入已安装的分发版的名称来直接打开 Linux 分发版。 例如：“Ubuntu”。 这将在一个独立的控制台窗口中打开 Ubuntu。 在 Windows 命令提示符或 PowerShell 中，可以输入已安装的分发版的名称。 例如：ubuntu 在 Windows 命令提示符或 PowerShell 中，可以通过输入： wsl.exe在当前命令行中打开默认 Linux 分发版。 在 Windows 命令提示符或 PowerShell 中，可以通过输入：wsl [command]，在当前命令行中使用默认 Linux 分发版，而无需输入新发行版。 你可以用 [command] 替换为 WSL 命令，例如：wsl -l -v 列出已安装的发行版，或 wsl pwd 查看当前目录路径在 WSL 中装载的位置。 在 PowerShell 中，该命令 get-date 将提供 Windows 文件系统中的日期，并提供 wsl date Linux 文件系统中的日期。 选择的方法应取决于你正在做的事情。 如果已在 Windows 提示符或 PowerShell 窗口中打开 WSL 命令行并想要退出，请输入以下命令： exit\n参考文档\nhttps://geekdaxue.co/read/xiaoyulive@wsl/flwxn1\nhttps://learn.microsoft.com/zh-cn/windows/wsl/\n","date":"2024-08-18T21:08:41+08:00","permalink":"/p/240818210841/","title":"Windows使用WSL安装Linux系统"},{"content":"LinuxMirrors 是一个 GNU/Linux 更换系统软件源脚本及 Docker 安装脚本\n官网：https://linuxmirrors.cn/ 源码：https://github.com/SuperManito/LinuxMirrors\n一键执行（推荐） 中国大陆（默认） 1 bash \u0026lt;(curl -sSL https://linuxmirrors.cn/main.sh) 中国大陆教育网 1 bash \u0026lt;(curl -sSL https://linuxmirrors.cn/main.sh) --edu 海外地区 1 bash \u0026lt;(curl -sSL https://linuxmirrors.cn/main.sh) --abroad 注意事项：\n需使用 ROOT 用户执行脚本 切换命令为 sudo -i 或 su root。不同系统使用的命令不同，因为有些系统没有在初始安装时为 ROOT 账户设置密码（例如 Ubuntu），故需要使用 sudo -i 命令来切换至 ROOT 建议使用 SSH 远程工具 如果你使用的系统终端界面无法正常显示中文内容那么将导致无法查看交互内容。部分系统会自动开启 SSH 服务，否则请参考启用方法 如果是在新系统上首次执行脚本 当前执行方式依赖 curl 指令获取脚本内容并执行，但部分操作系统没有预装此软件包，届时则会报错 Command not found，安装方法详见常见问题。还可自行复制源码至本地新建任意名称的 .sh 脚本，粘贴源码内容后通过 bash 指令手动执行 下载到本地执行 注意：切换为 root 用户\n1 sudo su - 1 curl -sSL https://linuxmirrors.cn/main.sh -o /usr/local/bin/changeMirrors.sh \u0026amp;\u0026amp; chmod +x /usr/local/bin/changeMirrors.sh 执行脚本\n1 changeMirrors.sh ","date":"2024-08-18T21:08:11+08:00","permalink":"/p/240818210871/","title":"LinuxMirrors：一条命令实现各个Linux发行版软件镜像源更换"},{"content":"Bitwarden Gmail Voice v2rayNG SagerNet F-Droid K-9 Mail Telegram X Fluent Reader Orgzly Revived legaoPro Spotify Reex Firefox YouTube Pro Alook OKTV Emby Reqable 抓包软件\nRCX WireGuard Famd M3U8 DeepL YTDLnis Seal OKX pCloud ALCient Alist Github Speedtest LocalSend nPlayer Replit Termux flix Markor Authenticator Outlook Hiddify ChatGPT APKMirror Installer Oblivion PiliPalaX WhatsApp X Instagram Fackbook Lite Microsoft 365 1.1.1.1 TextNow Brave Tor Browser Pikpak ZArchiver Amap Yamby MoeMemos ConnectBot Termius Textr Go Nutstore VLC Spotube VMOS MT Manager 中国移动 RTranslator Dropbox ","date":"2024-08-15T17:08:02+08:00","permalink":"/p/240815170896/","title":"手机软件清单-Mi11"},{"content":"视频编码格式兼容性、播放支持及文件后缀 视频编码格式决定了视频数据如何被压缩和解压缩，进而影响文件大小、画质以及播放设备的兼容性。\n关键兼容性总结：\n最常用且兼容性最好的： H.264 (AVC) 新一代高效编码： H.265 (HEVC), AV1 (逐渐普及，硬件支持是关键) 开源免版税： VP9, AV1 旧设备可能需要转码的： AV1, VP9, H.265 (HEVC) 以及一些较旧或不常见的格式。 1. H.264 (AVC) 全称： H.264 (MPEG-4 Part 10 AVC - Advanced Video Coding) 标识： avc1 (FourCC code) 兼容性与支持： 兼容性非常好，几乎所有的设备和播放器都支持，是目前视频流媒体和本地播放最广泛使用的标准。 通常不需要转码。 典型应用： 网络流媒体（YouTube、Netflix 等）、蓝光光盘、数字电视广播、多数视频文件。 常见文件后缀： .mp4, .mkv, .mov, .avi, .ts 2. H.265 (HEVC) 全称： H.265 (High Efficiency Video Coding) 标识： hev1 或 hvc1 (FourCC code) 兼容性与支持： H.264 的继任者，提供更高的压缩效率（在相同画质下文件更小，或在相同文件大小下画质更好），尤其适合 4K 及以上分辨率视频。 支持度逐渐普及，但不如 H.264 广泛。较新的设备和软件通常支持，但老旧设备可能需要硬件解码器支持或额外的软件解码包。 可能需要转码，特别是对于老旧设备或不带 HEVC 解码器的播放器。 典型应用： 4K/UHD 视频流媒体、UHD 蓝光光盘、部分高清电视广播、新一代移动设备视频录制。 常见文件后缀： .mp4, .mkv, .mov 3. VP9 全称： VP9 标识： vp09 (FourCC code) 兼容性与支持： 由 Google 开发的免版税视频编码格式。 在许多现代浏览器（如 Chrome、Firefox、Edge）和设备上得到良好支持，尤其是在流媒体平台（如 YouTube）上被广泛使用。 但某些旧设备可能不支持，可能需要转码。 典型应用： YouTube 等平台的流媒体视频，HTML5 视频。 常见文件后缀： .webm, .mkv 4. AV1 全称： AV1 (AOMedia Video 1) 标识： av01 (FourCC code) 兼容性与支持： 由 Alliance for Open Media (AOMedia) 开发的免版税、高效率的视频编码格式，旨在提供比 H.265 和 VP9 更好的压缩性能。 逐渐获得支持，但仍然不如 H.264 广泛。主要在较新的设备、浏览器（如 Chrome、Firefox、Edge、Safari）和操作系统中得到原生支持。硬件解码器的普及率正在提高。 老旧设备或缺乏硬件支持的设备可能无法流畅播放，可能需要转码。 典型应用： 未来的高效率网络流媒体、高质量视频分发。 常见文件后缀： .mp4, .mkv（有时可能会使用 .av1，但不太常见） 5. MPEG-2 全称： MPEG-2 (MPEG-2 Video) 描述： 曾经最主流的视频编码格式之一，在 DVD 时代占据主导地位。压缩效率低于 H.264，但兼容性依然广泛。 兼容性与支持： 绝大多数播放器和设备都支持，是 DVD 播放器和数字电视广播（如 DVB, ATSC）的标准。 典型应用： DVD 视频、数字电视广播。 常见文件后缀： .mpg, .mpeg, .vob (DVD 视频对象文件), .ts (传输流), .mkv 6. MPEG-4 Part 2 (DivX / XviD) 全称： MPEG-4 Part 2 (也常被称为 DivX 或 XviD，它们是该标准的主要实现) 描述： 在 H.264 普及之前，MPEG-4 Part 2 编码器（如 DivX 和 XviD）曾是网络视频共享和下载的主流格式，能在较低比特率下提供相对不错的画质。 兼容性与支持： 许多较老的独立 DVD 播放器和电脑播放器都支持。现代播放器通常也兼容，但不如 H.264 常见。 典型应用： 早期网络视频下载和文件共享。 常见文件后缀： .avi, .mp4, .ogm, .mkv 7. WMV (Windows Media Video) 全称： WMV (Windows Media Video) 描述： 微软开发的一系列视频编码格式。早期在 Windows 生态系统中非常流行。 兼容性与支持： 在 Windows 操作系统和相关应用程序中支持良好。在非 Windows 平台上可能需要额外的解码器或播放器。 典型应用： 微软平台上的流媒体和本地视频播放。 常见文件后缀： .wmv, .asf 8. 专业级/高画质视频编码 (ProRes, DNxHD/HR) 全称： Apple ProRes, Avid DNxHD/HR (Digital Nonlinear Extensible High Definition/Resolution) 描述： 这些是主要用于专业视频编辑和后期制作的编码格式。它们通常是帧内编码（不依赖前后帧），提供视觉上无损的画质，便于快速编辑，但文件尺寸远大于消费级编码格式（如 H.264/H.265）。 兼容性与支持： 主要由专业视频编辑软件（如 Final Cut Pro, Adobe Premiere Pro, Avid Media Composer）支持。普通播放器可能需要特定的插件。 典型应用： 电影、电视节目制作、广播、高质量素材存档。 常见文件后缀： .mov (通常为 ProRes), .mxf (通常为 DNxHD/HR) 音频编码格式及其常见文件后缀 音频编码格式决定了音频数据如何被压缩和存储。\n1. AAC (Advanced Audio Coding) 全称： AAC (Advanced Audio Coding) 描述： 一种高效的有损音频压缩格式，通常在相同比特率下提供比 MP3 更好的音质。 兼容性： 非常广泛，是视频文件（如 H.264/H.265 视频）中最常用的伴随音频格式，也被许多流媒体服务和移动设备支持。 常见文件后缀： 通常作为视频文件（.mp4, .mkv, .mov）的音轨，单独的音频文件多使用 .m4a。 2. MP3 全称： MPEG-1 Audio Layer III 描述： 最广为人知的有损音频压缩格式。尽管其效率不如 AAC 或 Opus，但因其悠久的历史和极高的普及度，仍是音频领域的重要标准。 兼容性： 极高，几乎所有设备和播放器都支持。 常见文件后缀： .mp3 3. Opus 全称： Opus 描述： 一种免版税、高度灵活的有损音频编码格式，旨在同时支持语音和音乐，在低比特率下也能提供高质量音频。 兼容性： 在现代浏览器（如 Chrome、Firefox）和 VoIP 应用中得到良好支持。但一些老旧或嵌入式设备可能不支持。 常见文件后缀： .opus，也可嵌入到 .webm, .mkv 等视频容器中。 4. AC-3 (Dolby Digital) / E-AC-3 (Dolby Digital Plus) 全称： AC-3 (Dolby Digital), E-AC-3 (Dolby Digital Plus) 描述： 杜比公司开发的一种有损音频压缩格式，主要用于多声道环绕声。E-AC-3 是 AC-3 的改进版本，提供更高的效率和更多的声道支持。 兼容性： 广泛应用于电影、蓝光光盘、数字电视广播和部分流媒体服务。设备支持度取决于是否有杜比解码器授权。 常见文件后缀： 通常嵌入在 .mp4, .mkv, .ts 等视频容器中，也有单独的 .ac3 文件。 5. DTS (Digital Theater System) 全称： DTS (Digital Theater System) 描述： 与杜比数字竞争的另一种多声道有损音频编码格式，也广泛用于电影和家庭影院系统，提供高品质环绕声。 兼容性： 广泛应用于蓝光光盘、电影院。设备支持度取决于是否有 DTS 解码器授权。 常见文件后缀： 通常嵌入在 .mp4, .mkv, .ts 等视频容器中，也有单独的 .dts 文件。 6. FLAC (Free Lossless Audio Codec) 全称： FLAC (Free Lossless Audio Codec) 描述： 一种无损音频压缩格式，文件大小比 WAV 小但能完全还原原始音频数据。 兼容性： 在音乐爱好者和高品质音频领域非常流行。许多现代播放器和设备都支持，但不如有损格式普及。 常见文件后缀： .flac 7. ALAC (Apple Lossless Audio Codec) 全称： ALAC (Apple Lossless Audio Codec) 描述：： 苹果公司开发的无损音频压缩格式。与 FLAC 类似，提供无损音质，但通常在苹果生态系统（iTunes, iOS 设备）中更受欢迎。 兼容性： 在苹果设备和软件中原生支持。其他平台可能需要额外支持。 常见文件后缀： .m4a (与 AAC 共享后缀，但编码不同) 8. WMA (Windows Media Audio) 全称： WMA (Windows Media Audio) 描述： 微软开发的一系列音频编码格式，包括有损和无损版本。旨在提供比 MP3 更好的压缩效率。 兼容性： 在 Windows 操作系统和相关应用程序中支持良好。在非 Windows 平台上可能需要额外的解码器或播放器。 常见文件后缀： .wma 9. Vorbis (Ogg Vorbis) 全称： Vorbis (通常与 Ogg 容器结合，故称 Ogg Vorbis) 描述： 一种开源、免版税的有损音频压缩格式，旨在成为 MP3 和 AAC 的替代品。在游戏和一些开源项目中较为常见。 兼容性： 在现代浏览器、Linux 发行版以及支持 Ogg 容器的播放器中支持。 常见文件后缀： .ogg, .oga 10. WAV (Waveform Audio File Format) / PCM 全称： WAV (Waveform Audio File Format) / PCM (Pulse Code Modulation) 描述： WAV 是一种容器格式，通常用于存储未压缩的 PCM (脉冲编码调制) 音频数据。PCM 是最基本的数字音频表示形式，直接记录原始声波的振幅。文件尺寸最大，但音质最高，因为它没有经过任何有损压缩。 兼容性： 极高，几乎所有音频编辑软件和播放器都支持。 常见文件后缀： .wav 特殊说明：音频格式中的 \u0026ldquo;drc\u0026rdquo; 音频格式中的 \u0026ldquo;drc\u0026rdquo; 通常表示 \u0026ldquo;Dynamic Range Compression\u0026rdquo;（动态范围压缩）。这是一种音频处理技术，旨在减小音频信号中最响和最静的部分之间的差异。通过压缩音频的动态范围，可以使安静的部分听起来更清晰，同时在不失真或过度饱和的情况下增加响亮部分的音量。它不是一种编码格式，而是一种可选的音频处理元数据或特性，通常嵌入在编码后的音频流中，尤其在杜比数字等环绕声格式中常见。\n重要提示： 文件后缀（如 .mp4, .mkv, .mov 等）通常代表的是容器格式，而不是具体的视频或音频编码格式。一个容器文件可以包含不同编码格式的视频流和音频流。因此，即使文件后缀相同，其内部的编码格式也可能不同，具体播放支持仍需查看播放器的兼容性。例如，一个 .mp4 文件可能包含 H.264 视频和 AAC 音频，也可能包含 H.265 视频和 Opus 音频。\n","date":"2024-08-04T22:08:45+08:00","image":"https://s2.loli.net/2024/08/04/Chm17KaLquFPU36.webp","permalink":"/p/240804220845/","title":"视频编码格式选择和常见后缀，音频编码格式及后缀"},{"content":"简介 g 是管理 go 版本的工具，可以简化 go 的版本管理。\n源码：https://github.com/voidint/g\n安装 自动安装 Linux/MacOS 适用于 bash、zsh\n1 2 # 建议安装前清空`GOROOT`、`GOBIN`等环境变量 curl -sSL https://raw.githubusercontent.com/voidint/g/master/install.sh | bash 1 echo \u0026#34;unalias g\u0026#34; \u0026gt;\u0026gt; ~/.bashrc # 可选。若其他程序（如\u0026#39;git\u0026#39;）使用了\u0026#39;g\u0026#39;作为别名。 1 source \u0026#34;$HOME/.g/env\u0026#34; Windows 目前版本 1.7.0 经过测试有问题，请查看手动安装部分\n适用于 pwsh\n1 iwr https://raw.githubusercontent.com/voidint/g/master/install.ps1 -useb | iex 手动安装 Linux/macOS 创建 g 家目录（推荐~/.g目录）\n1 2 mkdir -p ~/.g \\ mkdir -p ~/.g/bin 下载 release 的二进制压缩包，并解压至 g 家目录下的 bin 子目录中（即~/.g/bin目录）\n1 2 3 wget https://github.com/voidint/g/releases/download/v1.7.0/g1.7.0.linux-amd64.tar.gz tar -zxvf g1.7.0.linux-amd64.tar.gz -C ~/.g/bin 将所需的环境变量写入~/.g/env文件\n1 2 3 4 5 6 7 cat \u0026gt;~/.g/env \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; #!/bin/sh # g shell setup export GOROOT=\u0026#34;${HOME}/.g/go\u0026#34; export PATH=\u0026#34;${HOME}/.g/bin:${GOROOT}/bin:$PATH\u0026#34; export G_MIRROR=https://golang.google.cn/dl/ EOF 将~/.g/env导入到 shell 环境配置文件（如~/.bashrc、~/.zshrc\u0026hellip;）\n1 2 3 4 5 6 cat \u0026gt;\u0026gt;~/.bashrc \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; # g shell setup if [ -f \u0026#34;${HOME}/.g/env\u0026#34; ]; then . \u0026#34;${HOME}/.g/env\u0026#34; fi EOF 刷新环境变量\n1 source ~/.bashrc # 或source ~/.zshrc Windows 创建目录 1 %USERPROFILE%/.g/bin 下载 g1.7.0.windows-amd64.zip 解压，放到%USERPROFILE%/.g/bin目录下 将 %USERPROFILE%/.g/bin添加到PATH环境变量 默认二进制文件名是 g.exe, 如果你已经用 g 这个命令已经用作为 git 的缩写，那么你可以把 g.exe 改为其他名字，如 gvm.exe\n除此之外，还需要配置 GOROOT 环境变量，表示 Go 的安装路径\n通过 g 安装的 go 安装路径为\n1 %USERPROFILE%/.g/go 基本用法 查询当前可供安装的 go 版本\n1 g lsr 查询当前可供安装的stable状态的 go 版本\n1 g ls-remote stable 安装指定 go 版本1.22.4\n1 g install 1.22.4 查询已安装的 go 版本\n1 g ls 使用已安装的 go 版本\n1 g use 1.19.10 卸载一个已安装的 go 版本\n1 g uninstall 1.19.10 清空 go 安装包文件缓存\n1 g clean 查看 g 版本信息\n1 g version 更新 g 软件本身\n1 g self update 卸载 g 软件本身\n1 g self uninstall 环境变量 环境变量G_MIRROR有什么作用？\n由于中国大陆无法自由访问 Golang 官网，导致查询及下载 go 版本都变得困难，因此可以通过该环境变量指定一个或多个镜像站点（多个镜像站点之间使用英文逗号分隔），g 将从该站点查询、下载可用的 go 版本。已知的可用镜像站点如下：\nGo 官方镜像站：https://golang.google.cn/dl/ 阿里云开源镜像站：https://mirrors.aliyun.com/golang/ 南京大学开源镜像站：https://mirrors.nju.edu.cn/golang/ 华中科技大学开源镜像站：https://mirrors.hust.edu.cn/golang/ 中国科学技术大学开源镜像站：https://mirrors.ustc.edu.cn/golang/ 环境变量G_EXPERIMENTAL有什么作用？\n当该环境变量的值为true时，将开启所有的实验特性。\n环境变量G_HOME有什么作用？\n按照惯例，g 默认会将~/.g目录作为其家目录。若想自定义家目录（Windows 用户需求强烈），可使用该环境变量切换到其他家目录。由于该特性还属于实验特性，需要先开启实验特性开关G_EXPERIMENTAL=true才能生效。特别注意，该方案并不十分完美，因此才将其归类为实验特性，详见#18。\n相似项目 gvm goenv ","date":"2024-08-03T13:08:35+08:00","image":"https://s2.loli.net/2024/08/03/Rmn1rsdL28pXM6t.jpg","permalink":"/p/240803130835/","title":"g，Go的多版本管理工具"},{"content":"开启 ssh 密码登陆\n1 sudo sed -i \u0026#39;s/^#\\?PasswordAuthentication no/PasswordAuthentication yes/\u0026#39; /etc/ssh/sshd_config 重启 ssh\n1 sudo systemctl restart sshd root 用户远程登陆\n1 sudo sed -i \u0026#39;s/^#\\?PermitRootLogin no/PermitRootLogin yes/\u0026#39; /etc/ssh/sshd_config 或者找到 PermitRootLogin ,修改为 PermitRootLogin yes\n1 sudo vim /etc/ssh/sshd_config 重启 ssh\n1 sudo systemctl restart sshd ","date":"2024-08-02T15:08:25+08:00","permalink":"/p/240802150825/","title":"Linux开启SSH密码登陆，ROOT用户远程登陆"},{"content":"方式一：SC ","date":"2024-08-01T17:08:46+08:00","permalink":"/p/240801170846/","title":"Windows创建系统服务的方式"},{"content":"简单配置 可用于 certbot 申请 ssl 证书\n1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ","date":"2024-07-29T15:07:06+08:00","permalink":"/p/240729150766/","title":"Nginx模板"},{"content":"linux 参考这个 issuse：https://github.com/gaozhangmin/aliyunpan/issues/216\n进入小白杨配置，修改aria2.conf下的async-dns为true\n1 2 cd /opt/小白羊云盘/resources/engine sudo vim aria2.conf 或者一键命令\n1 sudo sed -i \u0026#39;s/async-dns=.*/async-dns=true/\u0026#39; /opt/小白羊云盘/resources/engine/aria2.conf ","date":"2024-07-25T15:07:52+08:00","image":null,"permalink":"/p/2407025/","title":"小白羊盘下载文件出现aria2c错误解决办法"},{"content":"本篇将带你体验各平台观看影视的正确姿势\nWindows ZyPlayer ZyPlayer支持各大平台，Windows、Mac、Linux 系统，详细内容查看官方介绍。\n官方地址：https://github.com/Hiram-Wong/ZyPlayer\n界面预览\n接口下载：https://gitee.com/huanzi989/self-use\u0026mdash;tv-box/raw/master/zyplayer.json\n导入数据的方式：\n设置-基础配置-其他-数据管理-配置导入，选择上面的下载的接口导入\nAndroid OK影视/FongMi https://github.com/FongMi/Release\n官方已列举需要下载的软件，下载对应的版本即可\n接口下载：\nFilmly 网易云出品的影视播放器，目前对接了阿里云盘和百度云盘。\n有安卓、TV、IOS\nhttp://filmly.163.com/\n预览：\nTV OK影视/FongMi 请查看Android下的OK影视/FongMi介绍\nFilmly 请查看Android下的filmly介绍\nLinux ZyPlayer 请查看Windows下的ZyPlayer介绍\n","date":"2024-07-24T15:07:52+08:00","permalink":"/p/2407024/","title":"各平台影视观看指南"},{"content":"YOURLS WebExtension\n1 2 https://rurl.rr.nu/ 4e5ab52a02 1 2 https://surl.myfw.us 4e5ab52a02 ","date":"2024-07-23T15:07:51+08:00","permalink":"/p/2407023/","title":"可用的短链系统"},{"content":"Debian/Ubuntu 运行这个命令后重启软件\n1 2 sudo apt install linux-headers-$(uname -r) -y ","date":"2024-07-22T15:07:51+08:00","permalink":"/p/2407022/","title":"VMware在Linux运行出现VMWare Kernel Module Updater"},{"content":" Ctrl+Shift+P调出命令面板\n输入install 调出 Install Package 选项并回车（第一次需要安装install，安装完成后重复步骤1,2），\n输入sftp，回车安装\nSFTP/FTP按钮位置：\nFile-SFTP/FTP 配置的信息\n配置文件所在的位置\nWindows： Linux：~/.config/sublime-text/Packages/User/sftp_servers 必须将配置文件放在这个位置才能被识别，Windows默认保存的位置即可，Linux需要手动跳转到该目录\n","date":"2024-07-21T15:07:50+08:00","permalink":"/p/2407021/","title":"Sublime配置SFTP"},{"content":"简介 rclone 是一个强大的命令行工具，旨在管理和同步文件到多种云存储服务及本地文件系统。它支持超过 70 种不同的云存储提供商，如 Google Drive、Dropbox、Amazon S3、OneDrive 等。\n官网地址：https://rclone.org\n主要特点 多种存储支持：支持超过 70 种不同的云存储服务。 文件同步：可以在本地和云之间同步文件或文件夹。 加密功能：支持文件加密，确保数据安全。 增量备份：只同步变化的文件，节省时间和带宽。 跨平台：可以在 Windows、macOS 和 Linux 上运行。 脚本自动化：可以通过脚本实现定期备份和同步。 安装 Linux / macOS / BSD 在 Linux/macOS/BSD 系统上安装 rclone，可以运行以下命令：\n1 sudo -v ; curl https://rclone.org/install.sh | sudo bash 若要安装测试版，可以运行：\n1 sudo -v ; curl https://rclone.org/install.sh | sudo bash -s beta Windows 下载地址：\n点击下载：Windows AMD64 v1.68.2 解压文件，将rclone所在的目录添加到PATH环境变量，即可在终端任意位置运行 rclone命令\n配置 远程存储 首次使用 rclone 时，需要配置远程存储。执行以下命令并根据提示操作：\n1 rclone config 如果不清楚某个存储如何添加，请参考官方文档\n文件路径 rclone 配置文件所在的路径\nLinux\n1 ~/.config/rclone Windows\n1 %USERPROFILE%\\AppData\\Roaming\\rclone 第一次安装没有配置文件和对应的路径，运行 rclone config退出就会自动创建\n命令补全 rclone 含有命令补全，输入 rclone按住 tab 键可以自动帮我们补全远程存储中的路径，如果没有这个功能，需要手动输入路径，可以尝试使用如下方法开启命令补全\n安装 bash-completion\n1 2 3 4 5 6 7 sudo apt update # Debian/Ubuntu sudo apt install bash-completion sudo yum update # CentOS/RHEL/Fedora sudo yum install bash-completion sudo pacman -S bash-completion # Arch Linux/Manjaro 开启补全功能\n1 2 sudo rclone genautocomplete bash | sudo tee /etc/bash_completion.d/rclone source /etc/bash_completion.d/rclone 再次尝试 rclone 命令，输入，使用 tab 键查看是否有补全\n1 rclone lsd remote:/ 基本用法 rclone 的语法结构：\n1 rclone subcommand [options] \u0026lt;parameters\u0026gt; \u0026lt;parameters...\u0026gt; subcommand：rclone 的操作命令，比如：sync, copy, ls，可以通过 commands查看所有支持的命令\noptions：选项可以是单个字母标志 (例如 - v)、一组单个字母标志 (例如 - Pv) 或长标志 (例如 ——progress)。不需要任何选项。选项可以位于子命令之后、参数之间或最后，但只能在子命令之前使用全局选项。—— 选项之后的任何内容都不会被解释为选项，因此，如果需要添加一个以 - 开头的参数，请先将其自身设置为 -，例如\n1 rclone lsf -- -directory-starting-with-dash parameter：通常是文件路径或 rclone remote, 例如 /path/to/file 或 remote:path/to/file, 但也可以是其他内容 —— 子命令帮助会告诉你具体是什么。\n子命令\n1 2 3 4 5 6 7 8 # lists a remote rclone ls remote:path # copies /local/path to the remote rclone copy /local/path remote:path # syncs /local/path to the remote rclone sync --interactive /local/path remote:path 为了区分本地路径和远程路径，远程路径需要使用 remote_name:path （最少也要一个 : 符号）\nremote_name：rclone 配置远程存储时起的名字 path：配置的远程存储的路径 比如查看远程存储的文件列表（假设已经创建了一个名为 jianguoyun 的远程存储）\n1 rclone lsd jianguoyun:/ 而这个是不可以的\n1 rclone lsd jianguoyun 命令详解 复制 将文件从源位置复制到目标位置，根据文件大小、修改时间或 MD5SUM 判断跳过相同的文件\n语法：\n1 rclone copy [options] source:sourcepath dest:destpath -P 选项：\n-P：查看具体信息 复制可当作备份使用，不会删除远程文件和本地文件或文件夹\n本地复制到远程存储\n案例：本地 software 文件夹复制到 alist 下的 aliyunpan/software\n1 rclone copy ~/software alist:/aliyunpan/software -P 远程存储 a 复制到远程存储 b\n某些云盘支持秒传，可以快速将一个云盘文件内容复制到另一个云盘。rclone 使用 copy 复制也是支持的。\n有些云盘上传单个文件大小有限制，例如 115 原石会员最大支持单个文件 5G，超过该大小即使支持秒传也无法使用。为了秒传的可用性，可以添加 --max-size 参数跳过超大的文件，例如 --max-size 500M 跳过超过 500M 的文件。\n案例：alist 挂载的 aliyunpan/infotech 复制到 alist 挂载的 115/infotech，并跳过超过 500M 的文件\n1 vim ~/bin/rclone_copy_from_local_software_to_alist_aliyunpan_software.sh 1 rclone copy alist:aliyunpan/infotech/ alist:115/infotech/ --max-size 500M -P 1 chmod +x ~/bin/rclone_copy_from_local_software_to_alist_aliyunpan_software.sh 定时备份/复制\n将复制命令写入到脚本文件，设置定时任务执行脚本\n挂载 将远程存储挂载到本地，作为本地文件系统使用，支持本地播放视频、打开文件，编辑文件等操作\n注意：Windows 平台挂载需要额外安装 winfsp，且默认路径不存在\n语法：\n1 rclone mount [options] remote:path/to/files /path/to/local/mount 选项：\n--buffer-size：在传输文件时，读取和写入操作的缓冲区大小，默认不清楚，建议挂载加上，大小 4M --vfs-cache-mode：缓存模式，可选 off（默认），writes，full --vfs-cache-max-size：限制 VFS 缓存的最大大小，默认无限制 --vfs-cache-max-age：限制缓存文件的最大存活时间，默认 1 小时 --daemon：后台挂载，Windows 不支持 --volname：挂载名字（显示在文件管理器的名字），Windows 平台 取消挂载\n1 fusermount -u 挂载路径 远程存储挂载到本地\n案例：坚果云挂载到 $HOME/mnt/jianguoyun\n创建挂载点\n1 mkdir -p $HOME/mnt/jianguoyun 前台挂载（退出终端挂载会取消）\n1 rclone mount --buffer-size 4M --vfs-cache-mode writes jianguoyun: $HOME/mnt/jianguoyun 后台挂载\n1 rclone mount --buffer-size 4M --vfs-cache-mode writes jianguoyun: $HOME/mnt/jianguoyun --daemon 取消挂载\n1 fusermount -u $HOME/mnt/jianguoyun 案例：alist挂载到本地 $HOME/mnt/alist\n1 mkdir -p $HOME/mnt/alist 前台挂载\n1 rclone mount --buffer-size 4M --vfs-cache-mode writes alist: $HOME/mnt/alist 后台挂载\n1 rclone mount --buffer-size 4M --vfs-cache-mode writes alist: $HOME/mnt/alist --daemon 取消挂载\n1 fusermount -u $HOME/mnt/alist 案例：windows 挂载 alist film 路径到本地驱动器 K\n1 rclone mount alist:/film K: --buffer-size 4M --vfs-cache-mode writes --vfs-cache-max-size 2G --volname alist_127.0.0.1_film --network-mode 该命令作用：\n将 AList (一个文件列表程序) 中的 /film 目录挂载到 Windows 系统上的 K: 盘符，设置读缓冲的大小为 4MB，设置 VFS (Virtual File System) 缓存模式为 writes，设置 VFS 缓存的最大大小为 2GB。设置挂载卷的名称为 alist_127.0.0.1_film，启用网络模式。\n开机自动挂载\n借助定时任务实现或者创建系统服务\n案例：开机挂载 alist\n1 crontab -e 1 @reboot rclone mount --buffer-size 4M --vfs-cache-mode writes alist: $HOME/mnt/alist --daemon 单向同步 将 源路径 文件同步到 目的路径，会 删除目的路径文件\n如果只是需要备份文件，使用 复制\n语法：\n1 rclone sync [options] SOURCE remote:DESTINATION 这可能导致数据丢失，首先使用 --dry-run 或 --interactive/-i 进行测试。\n远程存储同步到本地\n案例：坚果云同步文件到本地\n1 rclone sync jianguoyun:/ $HOME/jianguoyun 本地同步到远程存储\n案例：本地同步文件到坚果云\n1 rclone sync $HOME/jianguoyun jianguoyun:/ 双向同步 语法：\n1 rclone bisync [options] remote1:path1 remote2:path2 截止到 2025-08-06 rclone v1.58 仍暂处于测试阶段，官方建议谨慎使用，我的建议是不使用（数据无价）\n移动 将文件从 存储 1 移动到 存储 2，会在目的存储自动创建文件夹\n语法：\n1 rclone move remote1:path remote2:path 将本地文件移动到坚果云上\n1 rclone move /mnt/file jianguoyun:/test/file -P 其他命令 列出所有已经配置的远程存储名字\n1 rclone listremotes 查看特定远程存储的配置详情\n1 rclone config show \u0026lt;remote_name\u0026gt; 查看所有远程存储的详情，以json格式输出\n1 rclone config dump Web UI rclone 提供了 Web UI 界面：\n1 rclone rcd --rc-web-gui 此命令会从 GitHub 下载 UI 文件，因此需要能够访问 GitHub\n一些技巧 只创建相同目录结构 将目标位置拥有原位置同样的目录结构，保持目录结构的一致\n1 rclone copy source:/path dest:/path --filter \u0026#34;+ */\u0026#34; --filter \u0026#34;- *\u0026#34; --progress source:/path：源路径 dest:/path：远程目录 ","date":"2024-07-20T15:07:50+08:00","image":"https://s2.loli.net/2024/08/06/IyYvUsDeqloum4M.webp","permalink":"/p/2407020/","title":"rclone，统一管理、备份，同步文件，文件夹到多种云存储平台"},{"content":"先看看pmail服务器端口的配置：\n1 2 3 4 5 6 7 8 9 HttpServer Start On Port :80 POP3 With TLS Server Start On Port :995 Smtp Server Port: :25 POP3 Server Start On Port :110 Smtp With SSL Server Port: :465 SMTP 服务器地址：部署的pmail地址 端口：465 账户：邮箱地址 发送者邮箱：通常和邮箱地址一致 访问凭证：登陆账户密码 ","date":"2024-07-16T15:07:47+08:00","permalink":"/p/2407016/","title":"PMail配置SMTP，POP客户端"},{"content":"简介 一个现代化的 GUI 视频和音频下载器，支持数百个网站\nGitHub 源码：https://github.com/aandrew-me/ytDownloader\n特性 ✅ 支持数百个网站，包括 Youtube、Facebook、Instagram、Tiktok、Twitter 等等。\n✅ 多种主题\n✅ 带有硬件加速的视频压缩器\n✅ 高级选项，例如范围选择、字幕\n✅ 下载播放列表\n✅ 适用于 Linux、Windows、Freebsd 和 macOS\n✅ 快速的下载速度\n✅ 当然，没有追踪器或广告\n预览 安装 Windows 安装包 https://github.com/aandrew-me/ytDownloader/releases/download/v3.19.0/YTDownloader_Win.exe\nWinget 1 winget install aandrew-me.ytDownloader Chocolatey 1 choco install ytdownloader Scoop 1 scoop install https://raw.githubusercontent.com/aandrew-me/ytDownloader/main/ytdownloader.json Linux 对应发行版打包文件 https://github.com/aandrew-me/ytDownloader/releases/tag/v3.19.0\nArchlinux 1 paru -S ytdownloader-gui Flatpak 1 flatpak install flathub io.github.aandrew_me.ytdn Snapcraft 1 sudo snap install ytdownloader MacOS 由于该应用未签名，当你尝试打开它时，macOS 将不允许你打开。 因此，你需要按照以下步骤打开它。\n点击 Mac Dock 上的“系统偏好设置”。 选择“安全性与隐私”。 该应用会显示在那里。 点击“打开”。 在 macOS 14.5 Sonoma 上，你需要打开终端并手动添加：\n1 sudo xattr -r -d com.apple.quarantine /Applications/YTDownloader.app 你还需要安装 Python 3.8 或更高版本。\n","date":"2024-07-16T14:07:50+08:00","permalink":"/p/2407026/","title":"ytDownloader，现代化的 GUI 视频和音频下载器"},{"content":"介绍 One API 是一个 LLM API 接口管理和分发系统，可以帮助您更好地管理和使用各大厂商的 LLM API。\n通过标准的 OpenAI API 格式访问所有的大模型，开箱即用\n源码：https://github.com/songquanpeng/one-api\n部署 docker 1 2 3 4 5 # 使用 SQLite 的部署命令： docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api # 使用 MySQL 的部署命令，在上面的基础上添加 `-e SQL_DSN=\u0026#34;root:123456@tcp(localhost:3306)/oneapi\u0026#34;`，请自行修改数据库连接参数，不清楚如何修改请参见下面环境变量一节。 # 例如： docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN=\u0026#34;root:123456@tcp(localhost:3306)/oneapi\u0026#34; -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api docker-compose 1 2 3 4 5 6 7 8 9 10 11 12 version: \u0026#39;3.9\u0026#39; services: one-api: image: justsong/one-api volumes: - \u0026#39;./data:/data\u0026#39; environment: - TZ=Asia/Shanghai ports: - \u0026#39;3000:3000\u0026#39; restart: unless-stopped container_name: one-api 初始账号用户名为 root，密码为 123456。\n","date":"2024-07-15T23:07:42+08:00","permalink":"/p/2407015/","title":"one-api，一个 LLM API 接口管理和分发系统，可以帮助您更好地管理和使用各大厂商的 LLM API"},{"content":"解压缩 tar tar (Tape Archive) 是一个 Linux/Unix 系统中常用的归档工具，用于将多个文件和目录打包成一个单独的文件，通常称为 \u0026ldquo;tarball\u0026rdquo; 文件。 它本身并不压缩文件，只是将多个文件打包在一起。\n主要功能：\n归档 (Archiving): 将多个文件和目录合并成一个单一的归档文件。 备份 (Backup): 创建文件系统的备份。 传输 (Transmission): 方便地传输一组文件。 常见参数：\n-t (或 \u0026ndash;list): 列出归档文件中的内容。 -z (或 \u0026ndash;gzip, \u0026ndash;gunzip, \u0026ndash;ungzip): 使用 gzip 解压归档文件。 -v (或 \u0026ndash;verbose): 显示详细信息，包括文件名、大小、权限等。 -f (或 \u0026ndash;file=ARCHIVE): 指定要操作的归档文件名。 必须紧跟文件名。 挂载 设备信息 查看块设备信息\n1 lsblk -f 或 --fs: 显示文件系统信息，例如文件系统类型和 UUID。 -m 或 --perms: 显示设备的所有权和权限。 -o 或 --output \u0026lt;list\u0026gt;: 指定要显示的列的列表。 例如，lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT。 lsblk 命令的默认输出通常包含以下列：\nNAME: 块设备的名称 (例如，sda, sdb1, nvme0n1). MAJ:MIN: 主设备号和次设备号。 RM: 是否是可移动设备 (1 表示是，0 表示否)。 SIZE: 设备的大小。 RO: 是否是只读设备 (1 表示是，0 表示否)。 TYPE: 设备类型 (例如，disk, part, lvm, raid). MOUNTPOINT: 设备的挂载点 (如果已挂载)。 挂载 1 mount block_path mount_path -t：指定挂载设备文件系统类型 -o：指定文件系统特定的挂载选项。 这些选项以逗号分隔的键值对形式传递给 mount 命令 示例：\n挂载 /dev/sda1 到 /mnt/p1，指定文件格式为 exfat，umask 权限为 000，表示其他用户可读可写\n1 sudo mount -t exfat -o umask=000 /dev/sda1 /mnt/p1 挂载 SMB（Server Message Block，也称为 Windows 共享）\n1 2 sudo apt update # Debian/Ubuntu sudo apt install cifs-utils 其他发行版\n1 2 3 sudo yum install cifs-utils # CentOS/RHEL/Fedora sudo dnf install cifs-utils # Fedora (newer) sudo zypper install cifs-utils # openSUSE 1 2 3 4 # 创建挂载点：创建一个本地目录，用作 SMB 共享的挂载点。 sudo mkdir /mnt/smb_share # 挂载 sudo mount -t cifs //服务器IP/共享名称 /mnt/smb_share -o username=用户名,password=密码 sudo: 需要管理员权限才能挂载文件系统。 mount: 挂载命令。 -t cifs: 指定文件系统类型为 cifs（通用 Internet 文件系统），这是用于 SMB 共享的 Linux 文件系统类型。 //服务器IP/共享名称: SMB 共享的网络路径。 服务器IP: Windows 服务器或 NAS 设备的 IP 地址。 也可以使用主机名，但确保主机名可以被解析（例如，通过 DNS 或 /etc/hosts 文件）。 共享名称: 在 Windows 服务器或 NAS 上共享的文件夹的名称。 /mnt/smb_share: 本地挂载点（你之前创建的目录）。 -o username=用户名,password=密码: 挂载选项。 username=用户名: 用于访问 SMB 共享的 Windows 用户名。 password=密码: Windows 用户的密码。 取消挂载 1 umount mount_path 示例：\n取消挂载/mnt/p1\n1 umount /mnt/p1 统计目录大小 使用 du 命令查看当前目录下所有子目录的大小，并只显示当前目录的大小\n1 du -sh * 显示当前目录的大小，忽略没有权限的文件夹和文件，并显示隐藏的文件夹和文件\n1 du -sh .[^.]* * 2\u0026gt;/dev/null 显示当前隐藏目录和文件的大小，忽略没有权限的文件夹和文件\n1 du -sh .[^.]* 2\u0026gt;/dev/null 删除除了 cgi-bin 目录之外的所有文件和目录（包括子目录） 对于文件：\n1 find . -type f -not -path \u0026#39;*/cgi-bin/*\u0026#39; -exec rm -f {} + 对于目录：\n1 find . -mindepth 1 -type d -not -path \u0026#39;*/cgi-bin\u0026#39; -exec rm -rf {} + 反向传参 xargs 默认会将标准输入的内容作为参数追加到指定的命令后面。 \u0026ldquo;反向传参\u0026rdquo; 通常指的是将标准输入的内容作为命令的前缀，而不是后缀。 xargs 本身并不直接支持这种反向传参的方式，但可以通过一些技巧来实现。\n","date":"2024-07-14T13:07:10+08:00","permalink":"/p/linux-guide/","title":"Linux指南"},{"content":"简介 AI 模型接口管理与分发系统，支持将多种大模型转为统一格式调用，支持 OpenAI、Claude 等格式，可供个人或者企业内部管理与分发渠道使用，基于 One API 二次开发。\n特性 New API 提供了丰富的功能，详细特性请参考特性说明：\n🎨 全新的 UI 界面 🌍 多语言支持 💰 支持在线充值功能（易支付） 🔍 支持用 key 查询使用额度（配合neko-api-key-tool） 🔄 兼容原版 One API 的数据库 💵 支持模型按次数收费 ⚖️ 支持渠道加权随机 📈 数据看板（控制台） 🔒 令牌分组、模型限制 🤖 支持更多授权登陆方式（LinuxDO,Telegram、OIDC） 🔄 支持 Rerank 模型（Cohere 和 Jina），接口文档 ⚡ 支持 OpenAI Realtime API（包括 Azure 渠道），接口文档 ⚡ 支持 Claude Messages 格式，接口文档 支持使用路由/chat2link 进入聊天界面 🧠 支持通过模型名称后缀设置 reasoning effort： OpenAI o 系列模型 添加后缀 -high 设置为 high reasoning effort (例如: o3-mini-high) 添加后缀 -medium 设置为 medium reasoning effort (例如: o3-mini-medium) 添加后缀 -low 设置为 low reasoning effort (例如: o3-mini-low) Claude 思考模型 添加后缀 -thinking 启用思考模式 (例如: claude-3-7-sonnet-20250219-thinking) 🔄 思考转内容功能 🔄 针对用户的模型限流功能 💰 缓存计费支持，开启后可以在缓存命中时按照设定的比例计费： 在 系统设置-运营设置 中设置 提示缓存倍率 选项 在渠道中设置 提示缓存倍率，范围 0-1，例如设置为 0.5 表示缓存命中时按照 50% 计费 支持的渠道： OpenAI Azure DeepSeek Claude 部署 docker 1 sudo docker run --name new-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/new-api:/data calciumion/new-api:latest docker-compose 1 sudo mkdir -p /opt/new-api 1 2 cd /opt/new-api sudo vim /opt/new-api/docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 version: \u0026#39;3.9\u0026#39; services: new-api: image: \u0026#39;calciumion/new-api:latest\u0026#39; volumes: - \u0026#39;./data:/data\u0026#39; environment: - TZ=Asia/Shanghai ports: - \u0026#39;3000:3000\u0026#39; restart: unless-stopped container_name: new-api 启动\n1 sudo docker compose up 疑难问题 重置用户密码 使用 https://bcrypt-generator.com/ 生成密码对应 hash ，下面是修改数据的命令\n1 2 3 4 5 sqlite3 one-api.db UPDATE users SET password=\u0026#39;hashedPassword\u0026#39; //此处将 hashedPassword 改为你在网站中生成的hash 值 WHERE username=\u0026#39;root\u0026#39;; 反向代理 Nginx 模板\n1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name domain.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ","date":"2024-07-13T23:07:42+08:00","permalink":"/p/2407013/","title":"new-api，基于one-api修改的LLM接口管理和分发系统"},{"content":"简介 全新的高颜值/高性能的 AI 模型接口管理与分发系统，仅供个人学习使用，请勿用于任何商业用途，本项目基于 NewAPI 开发。A brand new high aesthetic/high-performance AI model interface management and distribution system is only for personal or internal management and distribution channels of enterprises. Please do not use it for commercial purposes.\n部署 docker docker-compose 1 sudo mkdir -p /opt/voapi 1 2 cd /opt/new-api sudo vim /opt/voapi/docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 version: \u0026#39;3.4\u0026#39; services: voapi: image: voapi/voapi:latest container_name: voapi restart: always command: --log-dir /app/logs ports: - \u0026#34;3000:3000\u0026#34; volumes: - ./data:/data - ./logs:/app/logs extra_hosts: - \u0026#34;host.docker.internal:host-gateway\u0026#34; environment: - SQL_DSN=root:123456@tcp(host.docker.internal:3306)/voapi?charset=utf8mb4\u0026amp;parseTime=True\u0026amp;loc=Local # 修改此行，或注释掉以使用 SQLite 作为数据库 - REDIS_CONN_STRING=redis://redis - SESSION_SECRET=random_string # 启动前必须手动修改此值为随机字符串 - TZ=Asia/Shanghai depends_on: - redis healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;wget -q -O - http://localhost:3000/api/status | grep -o \u0026#39;\\\u0026#34;success\\\u0026#34;:\\\\s*true\u0026#39; | awk -F: \u0026#39;{print $2}\u0026#39;\u0026#34; ] interval: 30s timeout: 10s retries: 3 redis: image: redis:latest container_name: redis restart: always 启动\n1 sudo docker compose up 反向代理 Nginx 模板\n1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name domain.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ","date":"2024-07-13T23:07:42+08:00","permalink":"/p/2407013/","title":"new-api，基于one-api修改的LLM接口管理和分发系统"},{"content":"Linux发行版众多，而有些软件并没有提供对应发行版的扩展安装包，导致开始菜单图标/全局搜索/桌面图标需要手动配置，而这些配置文件需要用到的时候又容易忘记配置文件位置和手动编写配置文件繁琐。\n本文就记录一下Linux下没有提供发行版对应的文件扩展名（.deb，.rpm）的安装包怎么配置开始菜单/全局搜索/桌面图标\nDebian 配置文件的位置：\n个人用户：~/.local/share/applications 全局配置：/usr/share/applications ","date":"2024-07-13T19:07:28+08:00","permalink":"/p/linux-start-menu/","title":"Linux配置开始菜单，全局搜索，桌面图标"},{"content":" 源码：https://github.com/neovim/neovim\n安装 Linux/MacOS 最新版本\n1 2 3 curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz sudo rm -rf /opt/nvim sudo tar -zxvf nvim-linux-x86_64.tar.gz -C /opt/ 指定版本\n1 2 3 curl -LO https://github.com/neovim/neovim/releases/download/v0.10.0/nvim-linux-x86_64.tar.gz sudo rm -rf /opt/nvim sudo tar -zxvf nvim-linux-x86_64.tar.gz -C /opt/ 配置环境变量\n1 2 echo \u0026#39;export PATH=\u0026#34;$PATH:/opt/nvim-linux-x86_64/bin\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc Windows Windows 8+ is required. Windows 7 or older is not supported.\n下载https://github.com/neovim/neovim/releases/latest/download/nvim-win64.msi\nWinget\nRelease：winget install Neovim.Neovim Chocolatey\nLatest Release: choco install neovim (use -y for automatically skipping confirmation messages) Development (pre-release): choco install neovim --pre 插件 https://github.com/wbthomason/packer.nvim\n主题 https://github.com/folke/tokyonight.nvim\nhttps://github.com/nvim-lualine/lualine.nvim\n","date":"2024-07-12T23:07:42+08:00","permalink":"/p/2407012/","title":"Neovim安装配置"},{"content":" 官方文档：https://www.lunarvim.org/docs/installation\n前置条件 Make sure you have installed the latest version of Neovim v0.9.0+. Have git, make, pip, python, npm, node, cargo and ripgrep installed on your system. Resolve EACCES permissions when installing packages globally to avoid error when installing packages with npm. PowerShell 7+ (for Windows). 安装 Linux/MacOS： 1 bash \u0026lt;(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh) Windows 1 pwsh -c \u0026#34;iwr https://raw.githubusercontent.com/LunarVim/LunarVim/master/utils/installer/install.ps1 -UseBasicParsing | iex\u0026#34; ","date":"2024-07-11T23:07:42+08:00","permalink":"/p/2407011/","title":"lunarvim，开箱即用的neovim"},{"content":"软件：howdy\n地址：https://github.com/boltgolt/howdy\nDebian系列建议使用\n","date":"2024-07-10T23:07:42+08:00","permalink":"/p/2407010/","title":"Linux开启人脸登录（待续）"},{"content":"介绍 下载地址 文档地址 安装 创建文件夹并解压\n1 2 sudo mkdir /opt/QtScrcpy sudo unzip QtScrcpy-ubuntu-22.04-gcc_64.zip -d /opt/QtScrcpy/ 创建软连接\n1 sudo ln -s /opt/QtScrcpy/output/x64/Release/QtScrcpy /usr/bin/qtscrcpy 创建desktop，让开始菜单图标/全局搜索/桌面图标可用\n1 sudo vim /usr/share/applications/qtscrcpy.desktop 将如下内容粘贴\n1 2 3 4 5 6 7 8 9 [Desktop Entry] Encoding=UTF-8 Name=QtScrcpy Exec=qtscrcpy %U Icon=qtscrcpy Keywords=qtscrcpy Categories=Network; Type=Application Terminal=false 预览\n使用 使用usb连接手机，开启usb调试，QtScrcpy会自动刷新出设备，点击一键USB连接\n常见问题 连接无反应 尝试在终端启动 QtScrcpy\n1 qtscrcpy 启动后再次连接，查看终端报错信息\n报错1：\nThe server version (2.4) does not match the client (2.1.1)\n解决：\n使用scrcpy-server 2.1.1替换默认的scrcpy-server\nscrcpy-server 2.1.1下载地址\n使用这个命令替换默认的scrcpy-server\n1 sudo cp scrcpy-server-v2.1.1 /opt/QtScrcpy/output/x64/Release/scrcpy-server 再次尝试启动\n","date":"2024-07-09T23:07:42+08:00","permalink":"/p/2407009/","title":"linux安装安卓控制工具，QtScrcpy"},{"content":" title: Linux安装Github Cli工具 description: slug: \u0026lsquo;\u0026ldquo;240729150742\u0026rdquo;\u0026rsquo; image: math: true license: CC BY-NC-ND hidden: false comments: true draft: false date: 2024-07-29 15:07:42 +0800 updated: 2024-07-29 14:07:89 +0800 categories: tags: title: undefined\n官方文档：https://github.com/cli/cli/blob/trunk/docs/install_linux.md\nDebian, Ubuntu Linux, Raspberry Pi OS (apt) 1 2 3 4 5 6 7 (type -p wget \u0026gt;/dev/null || (sudo apt update \u0026amp;\u0026amp; sudo apt-get install wget -y)) \\ \u0026amp;\u0026amp; sudo mkdir -p -m 755 /etc/apt/keyrings \\ \u0026amp;\u0026amp; wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg \u0026gt; /dev/null \\ \u0026amp;\u0026amp; sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \\ \u0026amp;\u0026amp; echo \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\u0026#34; | sudo tee /etc/apt/sources.list.d/github-cli.list \u0026gt; /dev/null \\ \u0026amp;\u0026amp; sudo apt update \\ \u0026amp;\u0026amp; sudo apt install gh -y ","date":"2024-07-07T23:07:42+08:00","permalink":"/p/2407007/","title":"Linux安装Github Cli工具"},{"content":"简介 YOURLS 是一套 PHP 脚本，它能让你在自己的服务器上运行属于你自己的 URL 缩短服务。 你将完全掌控你的数据，还能获得详细的统计信息、分析报告、插件等等。 它是免费且开源的。\n官网：https://yourls.org\n源码：https://github.com/YOURLS/YOURLS\n预览 部署 serv00 下载\n1 wget https://github.com/YOURLS/YOURLS/archive/refs/tags/1.9.2.zip 解压\n1 unzip 1.9.2.zip -d public_html/ 复制文件\n1 2 3 cd public_html/ rm -rf index.html cp -r YOURLS-1.9.2/* ./ 配置\n1 cp user/config-sample.php user/config.php 修改user/config.php\n1 vim user/config.php serv00 控制台创建 MySQL 数据库，将数据库信息填写到 user/config.php\n除了数据库外，还需要修改其他信息，按需填写\n大致需要修改的如下\n1 2 3 4 5 6 define( \u0026#39;YOURLS_DB_USER\u0026#39;, \u0026#39;\u0026#39; ); define( \u0026#39;YOURLS_DB_PASS\u0026#39;, \u0026#39;\u0026#39; ); define( \u0026#39;YOURLS_DB_NAME\u0026#39;, \u0026#39;\u0026#39; ); define( \u0026#39;YOURLS_DB_HOST\u0026#39;, \u0026#39;\u0026#39; ); define( \u0026#39;YOURLS_DB_PREFIX\u0026#39;, \u0026#39;yourls_\u0026#39; ); define( \u0026#39;YOURLS_SITE\u0026#39;, \u0026#39;\u0026#39; ); 修改完成之后访问：域名/admin\n进入到这个界面，点击 Install YOURLS\n登陆后台，长这样：\ndocker compose 待续\n主题 Sleeky Sleeky 是一个最小的接口包，用于 YOURLS，一个开源的 URL 缩短器。Sleeky 添加了一个公共接口，并对后端（管理员）接口进行了大修。使用此主题，您可以创建自己的 Bitly / URL 缩短网站或公司内部使用的缩\n源码：https://github.com/Flynntes/Sleeky\n预览\n前台\n后台\n安装\n下载地址：v2.5.0\n安装并运行 YOURLS 将 sleeky-frontend 目录的内容移动到 YOURLS 安装的根目录 将 sleeky-backend 文件夹移动到 YOURLS 安装的 user/plugins/ 文件夹 在 YOURLS 管理区（example.com/admin/plugins.php）激活插件。该插件将显示为 Sleeky Backend 1 2 3 4 5 # serv00 wget https://github.com/Flynntes/Sleeky/archive/refs/tags/v2.5.0.zip unzip v2.5.0.zip cp -r Sleeky-2.5.0/sleeky-frontend/* public_html/ cp -r Sleeky-2.5.0/sleeky-backend/ public_html/user/plugins/ 如果 css 加载有问题，查看这个 issuse 解决：https://github.com/Flynntes/Sleeky/issues/89\n插件 浏览器 Firefox：YOURLS shortener 点击Setting进入设置，填写信息后测试保存\nServer URL：网址链接 Signature：密钥，在Tools - Secure passwordless API call 可以找到 ","date":"2024-07-07T15:07:53+08:00","permalink":"/p/2407027/","title":"yourls，行业标准自托管的PHP网址缩短程序"},{"content":"简介 AList 是一款易于安装且支持多平台的文件管理工具，可以挂载多种存储并提供多种实用功能。它支持 WebDAV、黑暗模式、文件预览、打包下载等，还提供保险箱加密和更多高级功能。\n🗂️ 一个支持多种存储的文件列表程序，使用 Gin 和 Solidjs。\n官方文档：https://alist.nn.ci/zh/guide\n特性 ⚡ 使用简单 AList 从一开始就设计为易于安装, 并且可以在所有平台上使用。 ☰ 多种存储 AList 支持多个存储提供商, 包括本地存储、阿里云盘、OneDrive、Google Drive 等, 且易于拓展。 W 支持 WebDAV AList 支持所有 WebDAV 存储, 这是一种用于访问文件的标准。 🌑 黑暗模式 自由切换明暗模式 ♀ 受保护的路由 为特定路径添加密码保护和身份验证 ◎ 文件预览 支持视频、音频、文档、PDF、图片预览等, 甚至支持 ipa 安装 ⬇ 打包下载/批量下载 使用浏览器的 stream api 支持打包下载, 无需使用服务器 / 使用 Aria2 进行批量下载支持文件夹 ♺ 单点登录 使用单点登录快速登录 AList ▤ 自动注册 AList 帐号 使用单点登录自动注册为 AList 帐号快速注册 ⤓ 离线下载 将种子内容离线下载到指定的目录内, 需要苛刻的网络环境 01 保险箱加密/解密 文件 任何人都可以安全地将加密数据存储在远程存储提供商上。数据存储在保险箱中, 提供商只能看到保险箱, 看不到您的数据。 ••• 更多新功能 包括文本编辑器、README/HTML 渲染、文件永久链接、Cloudflare Workers 代理等 安装 一键脚本 1 2 # 切换到root用户 sudo su - 1 2 # 一键脚本安装 curl -fsSL \u0026#34;https://alist.nn.ci/v3.sh\u0026#34; | bash -s install 新脚本（新增）\n1 curl -fsSL \u0026#34;https://alist.nn.ci/v3.sh\u0026#34; -o alist_v3.sh \u0026amp;\u0026amp; bash alist_v3.sh 设置密码\n1 2 cd /opt/alist/ ./alist admin set \u0026lt;your_password\u0026gt; 访问地址：ip:5244\ndocker-compose 1 2 3 sudo mkdir -p /opt/container/alist cd /opt/container/alist sudo vim docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 version: \u0026#39;3.3\u0026#39; services: alist: image: \u0026#39;xhofe/alist-aria2:latest\u0026#39; volumes: - \u0026#39;./alist_data:/opt/alist/data\u0026#39; - \u0026#39;/home:/home\u0026#39; - \u0026#39;/root:/root\u0026#39; ports: - \u0026#39;5245:5244\u0026#39; #environment: #- PUID=0 #- PGID=0 #- UMASK=022 container_name: alist restart: unless-stopped networks: - alist_network networks: alist_network: external: true 创建 docker 网络\n1 sudo docker network create alist_network 启动容器\n1 dco up -d 重置密码\n1 docker exec -it alist ./alist admin set \u0026lt;your_password\u0026gt; ","date":"2024-07-05T23:07:42+08:00","permalink":"/p/2407005/","title":"alist，一个功能强大的网盘文件列表程序和 WebDAV/S3服务器"},{"content":"在开始菜单搜索微信，编辑应用程序，添加环境变量QT_SCALE_FACTOR=1.75\n右击编辑应用程序，进入如下界面\n点击应用程序，在环境变量输入QT_SCALE_FACTOR=1.75\n此处的1.75经我测试为缩放倍率，我的屏幕缩放为175%，根据自己情况进行更改\n","date":"2024-07-05T10:07:32+08:00","permalink":"/p/linux-wechat/","title":"Linux原生版微信在高分辨率屏幕字体小，分辨率异常"},{"content":"安装 Linux Debian\n1 sudo apt install kodi Flatpak\n1 flatpak install flathub tv.kodi.Kodi ","date":"2024-07-04T23:07:42+08:00","permalink":"/p/2407004/","title":"Kodi，超级强大的多功能媒体播放器"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER-USER all -- anywhere anywhere DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination Chain DOCKER-ISOLATION-STAGE-1 (1 references) target prot opt source destination DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-ISOLATION-STAGE-2 (1 references) target prot opt source destination DROP all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-USER (1 references) target prot opt source destination RETURN all -- anywhere anywhere 这是 iptables 的输出，显示了当前的防火墙规则。以下是每个部分的解释：\nChain INPUT 政策 (policy): ACCEPT 表示默认允许所有进入的流量。 规则: 当前没有具体的规则定义，意味着所有进入的流量都会被接受。 Chain FORWARD 政策 (policy): ACCEPT 表示默认允许所有转发的流量。 规则: DOCKER-USER: 用户自定义的链，通常用于 Docker 的流量管理。 DOCKER-ISOLATION-STAGE-1: Docker 的隔离阶段链。 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED: 允许所有相关和已建立的连接。 DOCKER: Docker 处理的流量。 ACCEPT all -- anywhere anywhere: 允许所有流量（这条规则可能不必要，因为前面的规则已经允许了所有流量）。 Chain OUTPUT 政策 (policy): ACCEPT 表示默认允许所有输出的流量。 规则: 当前没有具体的规则定义，意味着所有输出的流量都会被接受。 Chain DOCKER 这是 Docker 生成的链，当前没有具体的规则。 Chain DOCKER-ISOLATION-STAGE-1 这是 Docker 的隔离阶段链。 规则: DOCKER-ISOLATION-STAGE-2: 进一步的隔离处理。 RETURN: 返回到调用该链的地方。 Chain DOCKER-ISOLATION-STAGE-2 规则: DROP all -- anywhere anywhere: 丢弃所有流量。 RETURN: 返回到调用该链的地方。 Chain DOCKER-USER 用户自定义的链，用于 Docker 的流量管理。 规则: RETURN: 返回到调用该链的地方。 总结 这个配置允许所有进入和输出的流量，转发流量也被允许。 Docker 相关的链用于管理容器之间的流量，包含了一些隔离和处理规则。 这种配置可能不够安全，尤其是在生产环境中，建议根据需要设置更严格的规则。 ","date":"2024-07-03T23:07:42+08:00","permalink":"/p/2407003/","title":"Debian，iptables防火墙规则"},{"content":"我的分享 电影 https://115.com/s/swz2nxk3h9j?password=love\u0026# movie 访问码：love\n电视剧 https://115.com/s/swz2njp3h9j?password=love# tvplay 复制这段内容，可在115APP中直接打开！\n动漫 https://115.com/s/swz2nxs3h9j?password=love\u0026# anime 访问码：love\n纪录片 https://115.com/s/swz2n9x3h9j?password=love\u0026# documentary 访问码：love\n软件 https://115.com/s/swz23lc3h9j?password=love# software 复制这段内容，可在115APP中直接打开！\n别人分享第一波 https://115.com/s/sw6t1s73wfp?password=ade1#\n华语剧集_FromAliyundrive_sha1\n访问码：ade1\n复制这段内容，可在115App中直接打开！\nhttps://115.com/s/sw683in3wfp?password=m095#\n一些无损歌曲(1.2T)\n访问码：m095\n复制这段内容，可在115App中直接打开！\nhttps://115.com/s/sw6837g3wfp?password=u2f6#\n欧美剧_45T\n访问码：u2f6\n复制这段内容，可在115App中直接打开！\n电影\nhttps://115.com/s/sw683783wfp?password=g9a0#\n2267部2160p remux FGT(120T)\n访问码：g9a0\n复制这段内容，可在115App中直接打开！\nhttps://115.com/s/sw683713wfp?password=o791#\n原盘 ISO 电影(755T)\n访问码：o791\n复制这段内容，可在115App中直接打开！\n源地址：\nhttps://nga.178.com/read.php?\u0026tid=36573363\u0026pid=695158511\u0026to=1\n","date":"2024-07-01T23:07:42+08:00","permalink":"/p/2407001/","title":"115资源分享"},{"content":" 20240614更新，\n本教程同样适用于同一台蓝牙设备，同一个主机上的多系统蓝牙连接。\n本身具有多蓝牙设备切换功能的键盘（如本教程使用的K380），连接不同设备可以生效，比如我可以同时连接 Windows10，手机。但是现在电脑上装了Windows10，Debian12两个系统，使用K380键盘不同模式蓝牙连接后会导致前一个失效（就是蓝牙1连接Windows10，蓝牙2连接Debian12，后连接的那个会导致第一个失效），我猜测可能是一台机器上的蓝牙有唯一标识，所以键盘就算有多蓝牙支持，连接一个系统后，再切换系统、切换键盘蓝牙模式，也会导致前一个蓝牙失效，这也是写本教程的主要原因。\n如果一个设备只装一个系统，且键盘支持多蓝牙切换模式，应该是不会出现这个问题的。当然如果键盘只支持一个模式蓝牙，使用本教程也是可以的。\n下面是正文。。。\n起因 因为我在一台机器上装了两种不同的系统，windows和archlinux系统，在切换系统的时候，蓝牙键盘和蓝牙鼠标会失效，也就是在其中一个系统配对使用后，切换到另一个系统鼠标和键盘会用不了，为了解决这个问题，我查看了archlinux的wiki，和搜索了其他的经验，发现并不是很好理解。所以自己编写了这篇文章以供自己和后来人参考。\narchlinux 官方wiki关于蓝牙的介绍：https://wiki.archlinuxcn.org/wiki/%E8%93%9D%E7%89%99\n设备 设备 说明 蓝牙5.0 系统 Windows10 ，Arch Linux / 键盘 罗技k380 否 鼠标 acer M115 是 为什么要关注 蓝牙的频率呢？ 因为后面的配置文件一样，bt5.0要稍微复杂一下，这个也不用自己查询， 通过archlinux配对蓝牙生成的文件就可以看出来。\n步骤 整体步骤总结为：\n先连接蓝牙，在系统内生成配置文件，有多少个系统就先连接多少个。 修改蓝牙配置文件，确保所有系统中的配置与最后一次蓝牙连接的系统配置一致。 温馨提示，修改linux配置更方便。\n如果我有两个系统 archlinux、windows10，那么我应该先连接archlinux，再连接windows，记录下windows的蓝牙配置，修改archlinux的蓝牙配置。这样就可以实现同一个蓝牙连接两个系统。\n同理，我有三个设备，先连接3个系统生成配置文件，再修改前两次连接的配置。\n连接archlinux 我安装了图形化界面，对于配对蓝牙比较方便，这个过程不再演示。\n如果你是无图形化界面，请参考 蓝牙连接\n配对成功后，打开终端，在 /var/lib/bluetooth 下可以看到 蓝牙设备的mac地址，继续进入蓝牙的mac地址，可以看到已经配对的蓝牙设备的mac地址，每个人的mac地址不一样，请根据自己情况操作。比如我的如下：\n34开头的对应的是我的键盘k380，C8开头的对应的是鼠标m115。让我们来看看他们各自的配置文件是怎样的：\n键盘k380：\n上图的info内容对应的就是一个蓝牙2.4G的设备，后续的更改只需要修改 [LinkKey]标签下的Key即可。\nacer m115鼠标：\n通过图中的配置文件就可以看出，配置多了许多，这是蓝牙5.0的配置文件，我们需要修改的内容大概有\n1 2 3 4 5 6 7 8 [IdentityResolvingKey] Key=75543290F900B56B68F2EA4EF34A2DA9 [LongTermKey] Key=0932311C7550DDE3A0D73A479A521187 EncSize=16 EDiv=35838 Rand=220192556329416 这里面的内容对应windows的内容，查看windows蓝牙注册表对应后，你就一目了然了。\n了解了archlinux的配置文件之后，让我们切换系统到windows，查看windows下的对应的配置。\n连接windows 在windows的环境下配对蓝牙设备，这个过程不再演示。\n修改配置文件 根据前文的知识，我们需要知道archlinux需要配置的值对应windows下是什么，这个值需要通过注册表查看。 为了查看这些值，还需要准备一个软件，正常查看注册表是看不到的，还需要下载微软提供的 PsTool ,下载地址为：https://download.sysinternals.com/files/PSTools.zip 解压软件之后，在解压的目录打开命令行执行下列命令，需要提醒的是，此操作需要管理员权限，建议通过管理员打开powershell，再进入到解压的路径下，比如 1 cd \u0026#39;D:\\Program Files\\PSTools\u0026#39; 1 2 # 在PsTool所在目录执行这个 .\\PsExec64.exe -s -i regedit.exe 接着会打开注册表，在注册表的地址找到 1 HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Keys 在keys下面有子项，子项的名称和数据对应的是键盘的mac地址和linkkey 这是蓝牙2.4G，把mac地址对应的值记录下来，替换archlinux键盘的linkkey的key，只需要重启蓝牙，这样就实现了键盘在双系统的无缝切换。重启蓝牙的命令为 ：\n1 sudo systemctl restart bluetooth 对于鼠标，它的项根据我这边的情况，在键盘的项的下面，也就是 HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Keys 的子项的子项，点开可以看到一列些熟悉的值，比如 EDIV，IRK，ERand，LTK等值，我们可以把项导出为 .reg文件查看，但是我并不建议导出来，因为archlinux的值是十进制的，windows到处的值是十六进制，后续还要转换进制，稍显麻烦，你细心 的话在注册表里就可以看到转换过的值，也就是括号里面的内容，如图： 记录对应名称对应的数据，有括号记录括号的内容，没有括号的记录整条数据。\n切换到 archlinux 系统\n替换archlinux下对应设备的值和windows一样。\n修改LTK，IRK的时候，把小写字母转换成大写。全部替换完成之后，重启蓝牙。\n1 2 # 重启蓝牙 sudo systemctl restart bluetooth 查看蓝牙设备是否正常工作。\n额外的。archlinux wiki说需要转换，如果不能工作再尝试。\n根据我的经验来看，记录windows注册表蓝牙对应值的时候，仔细小心，如果不行，请参考官方蓝牙教程\n至此，完结撒花 ｡:.ﾟヽ(｡◕‿◕｡)ﾉﾟ.:｡+ﾟ\n","date":"2024-06-28T16:06:01+08:00","permalink":"/p/2406028/","title":"蓝牙设备连接双（多）系统（windows和archlinux）"},{"content":"管理多个 GitHub 账户时，可以使用不同的 SSH 公钥来为每个账户提供访问权限。以下是在本机生成多个 SSH 公钥并为每个 GitHub 账户添加相应公钥的步骤：\n生成 SSH 密钥对： 打开终端（在 Linux 或 macOS 上）或 Git Bash（在 Windows 上），使用 ssh-keygen 命令生成新的 SSH 密钥对。对于每个 GitHub 账户，重复以下步骤：\n1 ssh-keygen -t rsa -b 4096 -C \u0026#34;your_email@example.com\u0026#34; 将 \u0026quot;your_email@example.com\u0026quot; 替换为你的电子邮件地址。-t rsa 指定密钥类型为 RSA，-b 4096 指定密钥长度为 4096 位。\n命名密钥文件： 在提示保存密钥对时，你可以使用默认文件名（如 ~/.ssh/id_rsa），或者为每个 GitHub 账户指定不同的文件名，例如：\n1 Enter file in which to save the key (/c/Users/YourName/.ssh/id_rsa): /c/Users/YourName/.ssh/id_rsa_work 这样，你就可以区分不同账户的密钥。\n设置密钥访问权限： 为确保安全性，应该只让文件所有者访问私钥：\n1 chmod 600 /c/Users/YourName/.ssh/id_rsa_work 添加 SSH 公钥到 GitHub 账户：\n打开生成的公钥文件（默认为 .pub 扩展名），例如 id_rsa_work.pub。 复制公钥内容。 登录到对应的 GitHub 账户。 访问 Settings \u0026gt; SSH and GPG keys \u0026gt; New SSH key，粘贴你的公钥并命名。 点击“Add SSH key”完成添加。 配置 SSH 以使用特定密钥： 在 ~/.ssh/config 文件中添加以下内容，以配置 SSH 客户端使用特定密钥：\n1 2 3 4 5 6 7 8 9 Host github-work HostName github.com User your_github_username IdentityFile ~/.ssh/id_rsa_work Host github-personal HostName github.com User your_github_username IdentityFile ~/.ssh/id_rsa_personal 将 github-work 和 github-personal 替换为你的 GitHub 主机别名，your_github_username 替换为你的 GitHub 用户名，id_rsa_work 和 id_rsa_personal 替换为你的密钥文件路径。\n克隆或推送到 GitHub 仓库： 当你需要克隆或推送到 GitHub 仓库时，使用配置的别名来指定使用哪个密钥：\n1 git clone git@github-work:username/repo.git 或者：\n1 git push github-personal master 通过这种方式，你可以为每个 GitHub 账户生成和管理不同的 SSH 密钥，从而实现对不同账户的访问控制。记得妥善保管你的私钥文件。\n","date":"2024-06-26T16:06:01+08:00","permalink":"/p/2406027/","title":"本地生成多个SSH公钥管理多个GitHub账户"},{"content":"\nOffice 浏览器 FireFox Google Chrome Edge 邮箱 Thunderbird 开源邮箱客户端，https://www.thunderbird.net/zh-CN/\nOutlook 交流 QQ 微信 腾讯会议 Zoom 钉钉 视频/播放器 mpv 开源，极简播放器\n官网 个人配置文件 vlc 另一款开源播放器\nbilibili bilibili客户端\nZyplayer Terminus Player 第三方 Emby 播放器\n音乐/播放器 Spotify 方格音乐 网易云音乐 QQ音乐 MusicPlayer2 开源纯音频播放器，https://github.com/zhongyang219/MusicPlayer2/releases\n落雪 Lx-Music 阅读 Koodo Reader 阅读神器，支持多种格式\n下载工具 Gopeed Go编写的下载工具，跨平台。\nYTDownloader Youtube 下载神器，强烈推荐。\n地址：https://github.com/aandrew-me/ytDownloader\nNeat Download Manager Windows下多线程下载工具\nqBittorrent-Enhanced-Edition 增强版的qBittorrent，地址：https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases\nMotrix 下载工具\nAria2-Windows Windows下的Aria2下载工具，下载地址：\n链接: https://pan.baidu.com/s/1nf2XaO7NprysGgOFXJpeYQ 提取码: love 复制这段内容后打开百度网盘手机App，操作更方便哦\n小白羊云盘 第三方阿里云盘播放器，https://github.com/gaozhangmin/aliyunpan\n剪辑 PS 剪影 HandBrake InfoTech（IT） Jetbrains Idea Datagrip Goland PyCharm WebStorm Android Studio PhpStorm Fleet Jetbrains ToolBox VMware Workstation Pro Tabby ssh工具，地址：https://github.com/Eugeny/tabby\nVSCode GitBash Fiddler Classic MySQL Workbench 8.0 CE Tiny RDM DBeaver Navicat Premium 16 phpstudy_pro Windows下php集成开发环境，地址：https://www.xp.cn/download.html\nApifox api测试工具\nPostman MobaXterm ssh工具，只支持Windows\nFileZilla 开源sftp工具\n编辑器 Typora Obsidian 推荐和Typora使用\nNotepad\u0026ndash; 替代Notpad++\nmassCode 开源，常用代码保存\nSublime Text draw.io 开源画图工具\nNotion Notepad3 替代notepad\n大杂烩 7-Zip File Manager 解压缩工具\nSnipaste 截图神器\nMuMu模拟器12 geek（强烈推荐） 卸载软件神器，可卸载安装软件自动删除注册表\nNmap - Zenmap GUI QuickLook SwitchHosts 快速切换hosts\nOBS Studio (64bit) Speedtest Everything ScreenToGif scrcpy 开源投屏工具\nRustDesk ToDesk Bandizip LocalSend TTime 翻译软件，好用\n有道翻译 Bitwarden Umi-OCR uTools Steam Microsoft Support and Recovery Assistant 全国资格考试网报平台证件照片审核处理系统 RaiDrive 挂载工具，Windows推荐使用\n指纹浏览器 Dolphin Anty 指纹浏览器\nHubstudio 指纹浏览器\nGoLogin 指纹浏览器\nVMLogin 指纹浏览器\nIncogniton 指纹浏览器\n剪辑 哔哩哔哩投稿工具 哔哩哔哩直播姬 Adobe Photoshop 2023 剪映专业版 HandBrake 代理工具 v2rayN nekoray Oblivion Desktop Cloudflare WARP WireGuard Hiddify nodesCatch ","date":"2024-06-25T16:06:01+08:00","permalink":"/p/2406026/","title":"Windows软件清单"},{"content":"通用必会 快捷键 作用 触发模式 备注 u 撤销 普通 为你的错误操作买单 Ctrl+r 撤销已做的撤销 普通 不想做撤销呢 移动 移动的命令很重要，删除，复制，粘贴都跟它有关\n光标移动 普通模式下作用\n快捷键 作用 h 光标向左移动一个字符 j 光标向下移动一行 k 光标向上移动一行 l 光标向右移动一个字符 光标跳转 快捷键 作用 w 光标跳转到下一个单词的首字母 b 光标跳转到上一个单词的首字母 e 光标跳转到下一个单词的尾字母 ge 光标跳转到上一个单词的尾字母 $ 光标跳转到当前行的行尾 0（数字） 光标跳转到当前行的行首 ^ 光标跳转到当前行的行首非空字符 g_ 光标跳转到当前行的行尾非空字符 gg 光标跳转到文件首行首个非空字符 G 光标跳转到文件尾行首个非空字符 翻页 快捷键 作用 Ctrl + f 向下滚动一页 Ctrl + b 向上滚动一页 Ctrl + d 向下滚动半页 Ctrl + u 向上滚动半页 替换 快捷键 作用 触发模式 x 替换光标所在的字符 普通模式 ciw 替换当前光标所在的单词 删除 快捷键 作用 触发模式 x 删除光标所在位置的字符 普通模式 dw 删除光标位置到下一个单词开头的字符 普通模式 D/d$ 删除光标位置到行尾的字符 d0 删除光标位置到行首的字符 d^ 删除光标位置到行首非空的字符 dd 删除当前行 普通模式 ndd 删除n行，包含当前行 dgg 删除当前行到文件首行 dG 删除当前行到文件尾行 使用 ndd 可以使用 p 来粘贴刚才删除的行\n复制+粘贴 命令 作用 备注 yy 复制当前行。 yy - Yank (copy) line yw 复制从光标位置到下一个单词结尾的字符。 yw - Yank (copy) word y$ 复制从光标位置到行尾的字符。 y$ - Yank (copy) to end of line y0 复制从光标位置到行首的字符（忽略空白字符）。 y0 - Yank (copy) to beginning of line y^ 复制从光标位置到行首的第一个非空白字符。 y^ - Yank (copy) to first non-blank character p 粘贴最后一次复制的内容。 p - Paste last yanked (copied) content P 在当前行之前粘贴最后一次复制的内容。 P - Paste above current line \u0026ldquo;+y 复制文本到系统剪贴板。 \u0026quot;+y - Yank (copy) to system clipboard \u0026ldquo;+p 从系统剪贴板粘贴内容。 \u0026quot;+p - Paste from system clipboard :reg 查看 Vim 寄存器中保存的内容。 :reg - View contents of Vim registers \u0026ldquo;ayy 将当前行复制到寄存器 a 中。 \u0026quot;ayy - Copy current line to register a \u0026ldquo;ap 从寄存器 a 中粘贴内容。 \u0026quot;ap - Paste from register a \u0026ldquo;ayiw 将当前单词复制到寄存器 a 中。 \u0026quot;ayiw - Copy current word to register a \u0026ldquo;aP 从寄存器 a 中粘贴内容到当前位置。 \u0026quot;aP - Paste from register a at current position ","date":"2024-06-23T13:06:24+08:00","permalink":"/p/vim-keyborad/","title":"VIM快捷键"},{"content":"简介 一个简单的 web 应用程序，用作 ssh 客户端连接到 ssh 服务器。它是用 Python 编写的，基于 tornado，paramiko 和 xterm.js。\n项目地址：https://github.com/crazypeace/huashengdun-webssh\n特性 支持 SSH 密码认证，包括空密码。 支持 SSH 公钥认证，包括 DSA RSA ECDSA Ed25519 密钥。 支持加密密钥。 支持双因素认证（基于时间的一次性密码）。 支持全屏终端。 终端窗口可调整大小。 自动检测 SSH 服务器的默认编码。 支持现代浏览器，包括 Chrome、Firefox、Safari、Edge、Opera。 在线体验 https://resulting-maridel-budd-86b51dd4.koyeb.app/ Region: Oregon (US West) https://ssh.ksg.us.kg/ Region: Frankfurt （DE） ","date":"2024-06-22T16:06:01+08:00","permalink":"/p/2406023/","title":"huashengdun-webssh，一款在线的webssh"},{"content":"简介 Serv00 是一个提供免费虚拟主机的平台，支持的服务众多，可选择 php 版本，有多款数据库，MySQL，postgresql，mongdodb，支持 ssh 连接，没有广告，3G 空间。\n官网：https://www.serv00.com/\n温馨提示：注册不要使用代理，建议把上述域名加入白名单\n自定义域名 使用白嫖的二级域名添加三级域名作为 serv00 的自定义域名\n域名托管在 cloudflare\n修改 php 版本 参考：https://forum.serv00.com/d/8-upgrade-version-of-php/2\n在 domains/domain/ 新建文件\n1 vim .htaccess 目前可支持的版本\n1 2 3 4 5 6 7 8 AddType application/x-httpd-php56 .php AddType application/x-httpd-php70 .php AddType application/x-httpd-php71 .php AddType application/x-httpd-php72 .php AddType application/x-httpd-php73 .php AddType application/x-httpd-php74 .php AddType application/x-httpd-php80 .php AddType application/x-httpd-php81 .php 1 echo \u0026#34;AddType application/x-httpd-php74 .php\u0026#34; \u0026gt;\u0026gt; .htaccess SSL 证书 1 cd $HOME/domains/你的网站/public_html 新建 .htaccess文件，开启重定向 http 到 https\n如果你不懂 vim，请找一个你熟悉的编辑软件上传，这里简要介绍一下\n编辑 .htaccess\n1 vim .htaccess 复制下面的内容，粘贴进去\n1 2 3 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 英文输入法下 :wq 退出保存\n服务 PM2 1 bash \u0026lt;(curl -s https://raw.githubusercontent.com/k0baya/alist_repl/main/serv00/install-pm2.sh) halo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 server: # 运行端口 port: 8090 spring: # 数据库配置，支持 MySQL、MariaDB、PostgreSQL、H2 Database，具体配置方式可以参考下面的数据库配置 r2dbc: url: r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE} username: admin password: 123456 sql: init: mode: always # 需要配合 r2dbc 的配置进行改动 platform: postgresql halo: caches: page: # 是否禁用页面缓存 disabled: true # 工作目录位置 work-dir: $HOME/domains/halo2/.halo2 # 外部访问地址 external-url: https://serve.v6.army # 附件映射配置，通常用于迁移场景 attachment: resource-mappings: - pathPattern: /upload/** locations: - migrate-from-1.x run.sh\n1 2 #!/bin/bash java17 -server -Xms128m -Xmx256m -jar -Duser.timezone=Asia/Shanghai /home/muyiacc/domains/halo2/halo.jar --spring.config.additional-location=/home/muyiacc/domains/halo2/.halo2/application.yaml ","date":"2024-06-22T00:06:14+08:00","permalink":"/p/free-virtual-host-serv00-1/","title":"Serv00，免费虚拟主机，提供多种服务支持"},{"content":"有些免费的服务长时间不登录可能会导致删号。\nssh 登录 serv00.com 3 个月不登陆删号，通过定时任务 ssh 连接实现保活\n定时规则\n1 1 1 1 * * 脚本\n1 sshpass -p \u0026#39;密码\u0026#39; ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt 用户名@地址 \u0026#34;exit\u0026#34; ","date":"2024-06-21T16:06:01+08:00","permalink":"/p/2406022/","title":"SSH登录用于免费服务保活"},{"content":"初始化仓库 本地没有项目，仓库有\n1 git clone \u0026lt;项目地址\u0026gt; 本地有项目，仓库也有\n确保本地已经初始化git init，先将本地提交了。\n添加远程仓库地址，拉取项目，解决冲突。\n1 git remote add \u0026lt;别名\u0026gt; \u0026lt;仓库地址\u0026gt; 例\n1 git remote add origin git@github.com:muyiacc/test.git 如果本地也有记录，且和远程有冲突，后面讲\n拉取 pull 1 git pull 推送 push 将当前分支提交到对应远程分支\n1 git push 将当前分支提交到特定的远程仓库，同名分支\n1 git push \u0026lt;remote\u0026gt; 将本地分支提交到远程特定的分支\n1 git push \u0026lt;remote\u0026gt; \u0026lt;branch\u0026gt; 设置上游分支，推送当前分支，并设置上游分支（tracking branch）\n这样之后可以使用 git push 直接推送，而不需要指定远程仓库和分支。\n1 git push -u \u0026lt;remote\u0026gt; \u0026lt;branch\u0026gt; 强制推送：强制推送本地更改，即使这会导致远程仓库的更改丢失。使用此选项需要谨慎，因为它可能会覆盖远程分支上的提交。（慎用！！！）\n1 2 3 git push -f # 或者 git push --force 删除远程分支：删除远程仓库上的指定分支。\n1 git push \u0026lt;remote\u0026gt; --delete \u0026lt;branch\u0026gt; 推送标签：推送本地创建的标签到远程仓库\n1 git push \u0026lt;remote\u0026gt; \u0026lt;tag\u0026gt; 推送所有分支和标签：推送所有本地分支和标签到远程仓库。\n1 git push --all 或 git push --tags 使用 git push 时，最好先使用 git pull 或 git fetch 来获取远程仓库的最新状态，以避免潜在的冲突。此外，强制推送（-f 或 --force）可能会导致其他协作者的更改丢失，因此应该在团队中明确沟通后谨慎使用。\n分支 合并 merge 合并某个提交 cherry-pick 选择合并某一个分支的提交记录\n例如：有 main，dev 两个分支，dev 提交了 commit a，commit b，现在需要将 commit b 合并到 main 分支\n查看 dev 分支 commit b 提交的 hash\n1 git log 假设提交的hash值为 837fc5\n切换到要合并的分支 main，执行\n1 git cherry-pick 837fc5 重置 reset \u0026ndash;hard 放弃当前内容，回到某个历史提交的 commit ，并丢弃暂存区\n1 git reset --hard commit-id 同时删除未追踪的文件和目录\n1 2 3 git clean -fd # -f 是表示强制删除 # -d 表示的目录，clean只会删除文件，加上表示把目录也删掉 为什么有这个用法，主要是用来学习，删除了之后，自己再重新写一遍。不用关心需要删除哪些内容。\n\u0026ndash;soft \u0026ndash;mixed （默认） 子模块 submodule 子模块是用在项目中将其他项目作为子项目使用\n初始化子模块配置\n1 git submodule init 更新子模块内容\n1 git submodule update 常见问题 从远程 Git 仓库中删除已经上传但现在希望忽略的文件 确保你已经在 .gitignore 文件中添加了需要忽略的文件或文件夹。\n使用以下命令将文件从 Git 的追踪中移除，但保留本地文件：\n1 git rm --cached \u0026lt;file_or_directory\u0026gt; 如果你想要移除多个文件，可以使用通配符或列出多个文件。\n提交对 .gitignore 文件和移除追踪的更改：\n1 git commit -m \u0026#34;Remove ignored files from tracking\u0026#34; 将更改推送到远程仓库：\n1 git push origin \u0026lt;branch_name\u0026gt; 假设要忽略名为 config.json 的文件，操作如下：\n1 2 3 4 echo \u0026#34;config.json\u0026#34; \u0026gt;\u0026gt; .gitignore git rm --cached config.json git commit -m \u0026#34;Ignore config.json\u0026#34; git push origin main 完成这些步骤后，config.json 文件将不再被 Git 跟踪，并且在之后的提交中将被忽略。\nerror: bad signature 0x00000000 1 2 3 \u0026gt; git status error: bad signature 0x00000000 fatal: index file corrupt 这表示索引出现错误\n备份索引文件：\n在命令行中，进入你的 Git 仓库目录（你已经在 E:\\markstore\\hugo-blog 中），然后执行以下命令：\n`cp .git/index .git/index.backup` （如果你在 Windows 上，可以使用 `copy .git\\index .git\\index.backup`） 删除索引文件：\n`rm .git/index` （在 Windows 上使用 `del .git\\index`） 重新构建索引：\n运行以下命令来重新构建索引：\n`git reset` git status 中文字符显示为 \\1234\\1234 1 git config core.quotepath off 全局生效\n1 git config --global core.quotepath off 还原：off 改成 on。\n","date":"2024-06-18T20:06:17+08:00","permalink":"/p/git-command/","title":"Git个人常见用法备忘录"},{"content":"Git 教程 欢迎来到这份详尽的 Git 教程，本教程将引导你从 Git 的基础开始，一直到一些高级特性的使用。\n第一部分：Git 简介 Git 是什么 Git 是一个分布式版本控制系统，由 Linus Torvalds 创建，用于有效、高速地处理从小到大的项目。\n为什么使用 Git 速度：Git 在合并、分支切换等操作上非常快。 效率：支持数千个并发用户协同工作。 安全性：通过 SHA1 哈希算法保护代码和历史完整性。 支持离线工作：可以在无网络的情况下工作。 分支和合并：支持快速、简便的分支和合并操作。 版本控制系统的基本概念 版本：项目的某个状态的快照。 提交：保存项目历史记录的操作。 分支：从某个点分叉出来的代码线。 合并：将两个或多个发展历史合并在一起的操作。 第二部分：安装和配置 Git 在不同操作系统上安装 Git 对于 Linux/Unix：sudo apt-get install git 对于 macOS：brew install git 对于 Windows：从 Git 官网 下载安装程序。 配置 Git 用户信息 1 2 git config --global user.name \u0026#34;Your Name\u0026#34; git config --global user.email \u0026#34;your_email@example.com\u0026#34; 第三部分：创建和使用仓库 初始化新仓库 1 2 3 mkdir my_project cd my_project git init 克隆现有仓库 1 git clone https://github.com/user/repo.git 仓库结构介绍 .git：Git 用来存储所有版本信息的目录。 第四部分：基本的 Git 工作流程 查看仓库状态 1 git status 将文件添加到暂存区 1 git add \u0026lt;file\u0026gt; 提交更改到仓库 1 git commit -m \u0026#34;Commit message\u0026#34; 查看提交历史 1 git log 第五部分：分支和标签 创建和切换分支 1 2 git branch \u0026lt;branch_name\u0026gt; # 创建新分支 git checkout \u0026lt;branch_name\u0026gt; # 切换到分支 合并分支 1 git merge \u0026lt;branch_name\u0026gt; 删除分支 1 git branch -d \u0026lt;branch_name\u0026gt; 使用标签 1 2 git tag \u0026lt;tag_name\u0026gt; # 创建标签 git checkout \u0026lt;tag_name\u0026gt; # 切换到标签 第六部分：分支策略 特性分支工作流程 创建分支开发特性。 完成特性后合并回主分支。 Git Flow 和 GitHub Flow Git Flow：使用多个分支进行开发、发布、维护。 GitHub Flow：使用单一的 master 分支和特性分支。 第七部分：解决合并冲突 合并冲突的原因 当两个分支修改了同一文件的同一行。 解决冲突的步骤 手动编辑冲突文件。 将更改添加到暂存区。 完成合并提交。 第八部分：远程仓库的使用 添加远程仓库 1 git remote add origin \u0026lt;repository_URL\u0026gt; 推送到远程仓库 1 git push -u origin \u0026lt;branch_name\u0026gt; 从远程仓库拉取 1 git pull 第九部分：高级 Git 技巧 交互式暂存 1 git add -i 修改最近的提交 1 git commit --amend 取消暂存区的更改 1 git reset HEAD \u0026lt;file\u0026gt; 重置分支 1 git reset --hard \u0026lt;commit_hash\u0026gt; 第十部分：使用 Git 进行协作 协作的工作流程 克隆仓库。 创建特性分支。 提交更改。 创建 Pull Request 或 Merge Request。 讨论和审查代码。 合并分支。 代码审查 审查 Pull Request 或 Merge Request。 讨论代码更改。 批准或请求更改。 第十一部分：Git 工具和资源 图形用户界面（GUI）工具 SourceTree GitHub Desktop GitKraken Git 命令行工具 使用 git 命令行工具。 在线资源和社区 Git 官方文档 GitHub 帮助 Stack Overflow 第十二部分：Git 故障排除 常见问题和解决方法 使用 git status 检查状态。 使用 git reflog 查看历史。 使用 git reflog 恢复丢失的提交 1 2 git reflog git checkout \u0026lt;reflog_entry\u0026gt; 第十三部分：Git 安全性 保护你的凭证 使用凭据存储。 使用 SSH 与 HTTPS 生成 SSH 密钥对。 添加 SSH 密钥到你的 Git 服务。 第十四部分：附录 Git 命令速查表 列出常用 Git 命令和它们的用法。 术语表 解释 Git 术语。 ","date":"2024-06-18T20:06:07+08:00","permalink":"/p/git-course/","title":"Git教程详解"},{"content":"安装系统选择的是中文，生成几个主要目录也是中文，后来终端切换文件夹影响体验，所以改为英文。\n参考：https://wiki.archlinuxcn.org/wiki/XDG_%E7%94%A8%E6%88%B7%E7%9B%AE%E5%BD%95#\n备份\n1 cp ~/.config/user-dirs.dirs ~/.config/user-dirs.dirs.bak 原本的样子\n1 2 3 4 5 6 7 8 XDG_DESKTOP_DIR=\u0026#34;$HOME/桌面\u0026#34; XDG_DOCUMENTS_DIR=\u0026#34;$HOME/文档\u0026#34; XDG_DOWNLOAD_DIR=\u0026#34;$HOME/下载\u0026#34; XDG_MUSIC_DIR=\u0026#34;$HOME/音乐\u0026#34; XDG_PICTURES_DIR=\u0026#34;$HOME/图片\u0026#34; XDG_PUBLICSHARE_DIR=\u0026#34;$HOME/公共\u0026#34; XDG_TEMPLATES_DIR=\u0026#34;$HOME/模板\u0026#34; XDG_VIDEOS_DIR=\u0026#34;$HOME/视频\u0026#34; 修改为英文\n1 vim .config/user-dirs.dirs 1 2 3 4 5 6 7 8 XDG_DESKTOP_DIR=\u0026#34;$HOME/Desktop\u0026#34; XDG_DOCUMENTS_DIR=\u0026#34;$HOME/Documents\u0026#34; XDG_DOWNLOAD_DIR=\u0026#34;$HOME/Downloads\u0026#34; XDG_MUSIC_DIR=\u0026#34;$HOME/Music\u0026#34; XDG_PICTURES_DIR=\u0026#34;$HOME/Pictures\u0026#34; XDG_PUBLICSHARE_DIR=\u0026#34;$HOME/Public\u0026#34; XDG_TEMPLATES_DIR=\u0026#34;$HOME/Templates\u0026#34; XDG_VIDEOS_DIR=\u0026#34;$HOME/Videos\u0026#34; 现在把已经生成的中文文件夹名字改为英文\n1 2 3 4 5 6 7 8 mv \u0026#34;$HOME/桌面\u0026#34; \u0026#34;$HOME/Desktop\u0026#34; mv \u0026#34;$HOME/文档\u0026#34; \u0026#34;$HOME/Documents\u0026#34; mv \u0026#34;$HOME/下载\u0026#34; \u0026#34;$HOME/Downloads\u0026#34; mv \u0026#34;$HOME/音乐\u0026#34; \u0026#34;$HOME/Music\u0026#34; mv \u0026#34;$HOME/图片\u0026#34; \u0026#34;$HOME/Pictures\u0026#34; mv \u0026#34;$HOME/公共\u0026#34; \u0026#34;$HOME/Public\u0026#34; mv \u0026#34;$HOME/模板\u0026#34; \u0026#34;$HOME/Templates\u0026#34; mv \u0026#34;$HOME/视频\u0026#34; \u0026#34;$HOME/Videos\u0026#34; 最后去文件管理器，把原来的位置改为新的位置。\n但是这整个过程第一次好麻烦，记录一下，方便复制。\n其实也可以选择使用英文环境安装系统，但是中文环境安装能自动安装中文输入法。\n","date":"2024-06-17T16:06:01+08:00","permalink":"/p/2406017/","title":"xdg-user-dirs，修改用户目录。"},{"content":"有时候需要查看hosts，每次都是从网上查看，不如自己记录一下\n1 C:\\Windows\\System32\\drivers\\etc 通过移动硬盘系统挂载后的位置（这个比较随机，看系统）\n1 /media/taoone/C0260DE6260DDDF2/Windows/System32/drivers/etc/ ","date":"2024-06-16T16:06:01+08:00","permalink":"/p/2406016/","title":"Windows下hosts所在目录"},{"content":"原文链接：https://www.seektao.cc/archives/typora-install-activation\n！！！2024-06-15更新全文内容和排版，包括标题！！！\n今天（2024-06-15）新装了一个debian12系统，根据本教程安装了最新版typora并激活，发现竟然失效了，截止今天typora的最新版是 1.8.10，看来是typora修复了，于是我去下载本教程编写时候对应的最新版1.7.5，官网竟然关闭了下载通道，提供离1.7.5的最近的是1.7,6，于是我又下载1.7.6，激活也失败告终，看来只能使用1.7.5了，还好我有备份，不过存在阿里云盘，要登陆，不方便下载，当时本想着这法子是不会失效的，结果。。\n所以本文在之前的内容基础上进行整体更新。\n如果只想快速使用，不想编译，可跳转到 合集仓库 查看安装\n下载安装 Debian 系统版本为：debian12.2\n下载地址：\n123盘：https://www.123pan.com/s/4MOKVv-LNnpd.html提取码:love\n蓝奏云：https://lzygood.lanzouv.com/iEZbz21vzhre 密码:love\n为什么不用阿里云盘？zip不让分享！！限制真多。\n下载后安装：\n1 sudo dpkg -i typora_1.7.5_amd64.deb Windows windows用的是直接解压就可以用的。\n安装包阿里云盘不让分享，嘶。。所以我再次特地下载后上传到蓝奏云和123盘\n蓝奏云：https://lzygood.lanzouv.com/ifJz721w5xla 密码:love\n123盘：https://www.123pan.com/s/4MOKVv-5Nnpd.html提取码:love\n编译可执行文件 此步骤是自己手动编译为自己系统的可执行文件。本次采用系统环境是 debian12\n以下命令均为绝对路径，只需要复制粘贴即可\n克隆项目 克隆这两个仓库到本地\n1 git clone https://github.com/muyiacc/NodeInject.git ~/.NodeInject \u0026amp;\u0026amp; git clone https://github.com/muyiacc/NodeInject_Hook_example.git ~/.NodeInject_Hook_example 将NodeInject_Hook_example下hook.js 复制到 NodeInject/src下，并改名为hooklog.js\n1 cp ~/.NodeInject_Hook_example/hook.js ~/.NodeInject/src/hooklog.js 安装rust 需要用到cargo，这是rust所包含的包管理工具，所以还得安装rust\n1 curl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh 中间选择 1 使用默认推荐安装，安装完成之后，接着刷新环境\n1 source \u0026#34;$HOME/.cargo/env\u0026#34; 接着在终端输入，测试安装是否成功\n1 cargo -V 输出如下信息则安装成功\n1 cargo 1.73.0 (9c4383fb5 2023-08-26) 编译可执行文件 进入NodeInject编译\n1 cd ~/.NodeInject \u0026amp;\u0026amp; cargo build 如果提示缺乏 gcc，需要安装gcc debian：sudo apt install gcc\n激活typora 将编译后的可执行文件复制到 typora文件夹下，执行复制的文件\n1 sudo cp ~/.NodeInject/target/debug/node_inject /usr/share/typora/ \u0026amp;\u0026amp; sudo /usr/share/typora/node_inject 这里出现如下信息，则到目前为止，没有任何问题。\n1 2 3 4 5 extracting node_modules.asar adding hook.js applying patch packing node_modules.asar done! 切换回 NodeInject_Hook_example，生成 license\n1 cd ~/.NodeInject_Hook_example/license-gen/ \u0026amp;\u0026amp; cargo build \u0026amp;\u0026amp; ~/.NodeInject_Hook_example/license-gen/target/debug/license-gen 接着出现 license\n1 License for you: 5QSW2H-X9GNBU-64F2MZ-YYHJ7W 打开typora，输入邮箱和许可证激活，就可以激活了。\n合集仓库 上面分享的软件和可执行文件我建了一个仓库，更便于下载了：\n地址：https://github.com/muyiacc/typora-activation\ntypora存放的是typora历史版本 直接上传有问题，采用release发布\nactivation存放的是破解执行文件\n如果是直接使用我编译文件，以debain为例\n下载安装typora，可以选择Github内的文件，也可以选择 上面分享的链接下载\n下载执行的文件\n将node_inject复制到typora目录（/usr/share/typora/）\n1 cp node_inject /usr/share/typora/ \u0026amp;\u0026amp; cd /usr/share/typora/ \u0026amp;\u0026amp; sudo ./node_inject 执行证书生成文件，生成证书 1 ./license-gen 打开typora，输入刚才生成的许可证和随机邮箱即可。 卸载typora 有时候会因为卸载不干净而激活失败，所以这里给出彻底卸载typora方式\nDebian 1 2 3 4 5 6 7 8 9 10 11 12 13 sudo apt remove typora find ~/.config -iname \u0026#39;*typora*\u0026#39; -exec rm -rf {} + find ~/.cache -iname \u0026#39;*typora*\u0026#39; -exec rm -rf {} + find ~/.local/share -iname \u0026#39;*typora*\u0026#39; -exec rm -rf {} + sudo apt autoremove sudo apt clean sudo rm -rf /usr/share/typora 替代方案 marktext obsibian ","date":"2024-06-15T16:06:01+08:00","permalink":"/p/2406015/","title":"Typora安装，激活"},{"content":"启用屏幕录制提示错误：\n1 2 3 KDE Portal Integration Failed to start screencasting Failed to create PipeWire context 解决办法\n1 2 sudo apt install pipewire # 安装 pipewire systemctl --user start pipewire # 在用户空间，启动 pipewire 服务 重启obs-studio\n","date":"2024-06-14T16:06:01+08:00","permalink":"/p/2406014/","title":"obs-studio在wayland环境下出现黑屏，解决方案"},{"content":"marktext 破解 typora 怎么说都不是一件值得推广的事，在寻找 typora 替代软件的过程中，发现了 marktext，外观类似 typora，有些方面可能更美观。神奇的是目前（2024-06-15）已经 45k star 了，但是已经很久没有更新发行版了，最新的版本还停留在 2022 年 3 月，Issuse 已经积累到 1.1k，pull requests42 各没有处理。仓库的 develop 分支还在小幅度不定时更新，也一直没合并到主分支。\n地址：https://github.com/marktext/marktext\n安装后主界面长这样\n整体默认的样式看上去就很舒服，细心的同学可以看到，代码块有复制按钮，同 obsibian 一样，但是 obsibian 太丑了。\n目前有几个影响写作体验感的方面：\n无法识别 picgo，也无法设置命令行，这对写文章需要图片上传的时候是个很严重的影响。 可以看到左侧显示没有 picgo，右边全局变量设置后其实已经可以用了，切换到命令行脚本，实际上却无法保存。\n当然了，这也不知道是不是和我的环境有关。\ntypora 剪贴板有超链接，使用 ctrl+k 后自动补全，光标自动跳转到链接标题，输入即可，这点体验感很好。但是 marktext 还是在链接末尾，需要手动调整光标到标题框。\n另一个是 marktext 粘贴超链接到文档中有明显的卡顿。\n这两点对于我写作就有相当大的考验，总观全文，你就知道我为了方便查看跳转设置了多个带标题的超链接，而不是直接粘贴链接，那样太影响阅读体验了。\nmarktext 连续的两个代码块之间新增一行，~~变得很困难，~~比如我有时侯会修改内容，现在有两个代码块，我在后面的代码块前面新增说明而不是写入代码块中，typora 只需要通过键盘将光标定位到前面的代码块最后一行的最后位置，按 ctrl+enter，即可新建一行不包含代码块的内容。\n在 marktext 中则是需要移动鼠标到代码块前面，在弹出的框选择New Paragraph。\n使用少，经验不足，原来有个内置的快捷键ctrl+shift+n即可新建一行，不管光标在代码哪个位置，即可新建一行，反转！比 typora 更好用，typora 要么使用上述使用的方案，要么使用菜单-段落-在下方插入段落。而这个操作 typora 自定义快捷键更麻烦。\n最后，如果在众多软件中选择一个替代品，我优先推荐 marktext。\nObsibian 它并不能算一个纯粹的 Markdown 编辑器，而是一个 markdown 仓库管理软件，网络上已经有很多人介绍过了，我这就不献丑了。\n推荐和 typora 或 marktext 一起使用，obsibian 管理仓库，不好编辑的时候交给 typora 或者 marktext。\n它很强大，但是默认有点点丑，需要自己摸索。我一般用来管理 markdown 文章。\n下面是我定制 obsibian 过后的界面：\n","date":"2024-06-13T16:06:01+08:00","permalink":"/p/2406013/","title":"Markdown软件推荐，Typora下位替代品marktext"},{"content":"https://github.com/pdone/lx-music-source\nhttps://github.com/Huibq/keep-alive\n在线导入 - 原始链接 SixYin\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/sixyin/latest.js Huibq\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/huibq/latest.js Flower\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/flower/latest.js LX\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/lx/latest.js ikun\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/ikun/latest.js Grass\n1 https://raw.githubusercontent.com/pdone/lx-music-source/main/grass/latest.js 在线导入 - 加速链接 SixYin\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/sixyin/latest.js Huibq\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/huibq/latest.js Flower\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/flower/latest.js LX\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/lx/latest.js ikun\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/ikun/latest.js Grass\n1 https://ghproxy.net/raw.githubusercontent.com/pdone/lx-music-source/main/grass/latest.js ","date":"2024-06-12T16:06:01+08:00","permalink":"/p/2406012/","title":"lx-music落雪音乐，音源"},{"content":"首先极不建议过多美化，美化过重导致系统容易崩溃不说，又占用资源，又耗费时间，且我觉得不耐看，要知道，美化的尽头是默认。。。\n本章目录结构采用和kde系统设置一致，便于查看\n外观 全局主题 欢迎屏幕 默认实在是丑了，换一个\nQuarksSplashDark：下载量排行榜第一\nVivid-Splash\n工作区 窗口管理 任务切换器 Classic task switcher\n开机与关机 登陆屏幕 Sugar Candy for SDDM\n","date":"2024-06-11T16:06:01+08:00","permalink":"/p/2406011/","title":"Linux系统桌面Kde plasma个性化设置"},{"content":" 1 sudo apt install ftp 1 2 sudo useradd -m -d /home/ftp/new_username -s /sbin/nologin new_username sudo passwd new_username ","date":"2024-06-10T16:06:01+08:00","permalink":"/p/2406010/","title":"Linux搭建ftp服务"},{"content":"前言 以前写过一篇关于archlinux开机自动挂载windows磁盘的文章，这次教程和之前核心一样，都需要安装ntfs-3g，但是/etc/fstable 文件编写的内容不一样`\n关于/etc/fatable 文件各列的简单解释：\n第一列是挂载的设备（可以填写设备label或者uuid） 第二列是挂载点。（必须是已经存在的目录） 第三列是分区的格式。（如ntfs、btrfs、ext2、ext3、nfs、vfat） 第四列是mount的挂载参数，一般情况下，直接写defaults即可。 第五列的数字表示是否被dump备份，是的话为1，不是为0。 第六列是开机时是否自检磁盘。1，2都表示检测，0表示不检测。但1，2表示不同的优先级，1更高。所以/ 分区必须设为1，而且整个fstab只允许出现一个1，若有多个分区需要检测，那么都设为2。 准备 本身直接挂载windows磁盘也是可以的，不过需要每次都输入密码，为了解决这个问题，所以需要安装 ntfs-3g\n源码：https://github.com/tuxera/ntfs-3g\n下面介绍各个系统如何自动挂载windows磁盘\nDebian系统 此节介绍Debian系统通过ntfs-3g自动挂载磁盘\n安装ntfs-3g\n1 sudo apt install ntfs-3g 创建自动挂载服务\n1 sudo vim /etc/systemd/system/windows-mount.service 1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=Mount Windows Partition After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/mount -a Type=oneshot RemainAfterExit=yes [Install] WantedBy=default.target 服务开机自启动\n1 2 sudo systemctl enable windows-mount.service sudo systemctl start windows-mount.service 查看/etc/fstab，仿照格式，将windows磁盘对应的信息填进去\n1 cat /etc/fstab 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # /etc/fstab: static file system information. # # Use \u0026#39;blkid\u0026#39; to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # systemd generates mount units based on this file, see systemd.mount(5). # Please run \u0026#39;systemctl daemon-reload\u0026#39; after making changes here. # # \u0026lt;file system\u0026gt; \u0026lt;mount point\u0026gt; \u0026lt;type\u0026gt; \u0026lt;options\u0026gt; \u0026lt;dump\u0026gt; \u0026lt;pass\u0026gt; # / was on /dev/sda2 during installation UUID=97f36186-e41b-4a80-b3e2-306671b3a72a / ext4 errors=remount-ro 0 1 # /boot/efi was on /dev/sda1 during installation UUID=B601-46F5 /boot/efi vfat umask=0077 0 1 # swap was on /dev/sda3 during installation UUID=185f74ac-8a42-4433-8fbe-361f63ef7320 none swap sw 0 0 查看磁盘详细信息\n1 lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID 创建挂载点\n1 2 # 创建挂载点，文件夹必须存在 sudo mkdir -p /mnt/c /mnt/d /mnt/e 编辑/etc/fstab\n1 sudo vim /etc/fstab 填入如下内容（请修改为自己的磁盘信息）\n1 2 3 4 5 6 # windows c UUID=C0260DE6260DDDF2 /mnt/c ntfs-3g defaults 0 0 # windows d UUID=72C2959BC29563DF /mnt/d ntfs-3g defaults 0 0 # windows e UUID=C6A4ED67A4ED5A87 /mnt/e ntfs-3g defaults 0 0 重启系统，查看是否成功\n","date":"2024-06-09T16:06:01+08:00","image":"https://s2.loli.net/2024/10/03/nEjbHgrFzmXRsc8.png","permalink":"/p/2406009/","title":"Linux开机自动挂载Windows磁盘"},{"content":"GitHub地址：https://github.com/hideuvpn/android-google-play-store\n本篇介绍如何安装最新版google框架和play store\n三件套是：\ngoogle服务框架 google play service google play store 安装google服务框架 https://www.apkmirror.com/apk/google-inc/google-services-framework/\n","date":"2024-06-07T16:06:01+08:00","permalink":"/p/2406007/","title":"google三件套"},{"content":"Windows\n1 %APPDATA%\\Mozilla\\Firefox\\Profiles 参考：\nmozilla 帮助信息\n","date":"2024-06-06T16:06:01+08:00","permalink":"/p/2406006/","title":"Firefox保存的书签、密码和其他用户数据在本地的位置"},{"content":"前言 2024-06-06，未知原因 docker.com 国内镜像全都被要求下架服务。\n为了另求出路，采用 cloudflare wokers pages 搭建镜像服务。\n特点：免费、简单\n部署 本次使用 cmliu 提供的代码。\n地址：https://github.com/muyiacc/CF-Workers-docker.io\n克隆仓库，登陆 cloudflare，选择 Wokers \u0026amp; Pages create an application 选择 pages - connect to git - github - github account - select a repository begin setup custom domains 第 5 步自定义的域名即是 docker 镜像地址，如本人搭建的服务：\nhttps://docker.ksg.us.kg 访问这个网址可查找镜像\n使用 官方镜像路径前面加域名\n1 docker pull docker.fxxk.dedyn.io/stilleshan/frpc:latest 1 docker pull docker.fxxk.dedyn.io/library/nginx:stable-alpine3.19-perl 一键设置镜像加速\n修改文件 /etc/docker/daemon.json，如果不存在则需要手动创建\n1 2 3 4 5 6 7 8 9 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://docker.ksg.us.kg\u0026#34;, \u0026#34;https://docker.1panelproxy.com\u0026#34; ] } EOF 1 2 sudo systemctl daemon-reload sudo systemctl restart docker 镜像列表 收集的公益镜像：\n1 2 3 4 https://docker.526899.xyz https://docker.1panelproxy.com https://docker.888666222.xyz https://docker.rainbond.cc 相似项目：https://github.com/muyiacc/cloudflare-docker-proxy\n2025-05-18 更新\n1 2 3 4 5 6 7 8 9 10 11 12 { \u0026#34;registry-mirrors\u0026#34; : [ \u0026#34;https://docker.1ms.run\u0026#34; \u0026#34;https://docker.526899.xyz\u0026#34; ], \u0026#34;insecure-registries\u0026#34; : [ \u0026#34;registry.docker-cn.com\u0026#34;, \u0026#34;docker.mirrors.ustc.edu.cn\u0026#34; ], \u0026#34;debug\u0026#34;: true, \u0026#34;experimental\u0026#34;: false } ","date":"2024-06-05T16:06:01+08:00","permalink":"/p/2406005/","title":"部署自己的Docker Hub镜像站，附Docker Hub镜像地址"},{"content":"卸载apt安装的obs\n1 2 3 4 5 sudo apt remove obs-studio rm -r ~/.config/obs-studio sudo apt purge obs-studio sudo apt autoremove sudo apt clean 安装flathub\n其他系统：Set Up Flathub | Flathub\n1 sudo apt install flatpak 如果是gnome\n1 sudo apt install gnome-software-plugin-flatpak 如果是kde\n1 sudo apt install plasma-discover-backend-flatpak 添加flathub仓库\n1 flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo 重启系统。\n重启后，安装obs-studio\n1 flatpak install flathub com.obsproject.Studio 如果下载速度慢，换flathub镜像源\n上海交大的，镜像帮助地址：https://mirrors.sjtug.sjtu.edu.cn/docs/flathub\n1 sudo flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub 运行obs-sutdio\n1 flatpak run com.obsproject.Studio ","date":"2024-06-04T16:06:01+08:00","permalink":"/p/2406004/","title":"Debian12通过flatapk安装"},{"content":"安装系统时，选择了其中一个桌面环境如xfce，安装完成后，现在我想换另一个，比如kde、gnome，该怎么做呢？\ngnome 1 2 sudo apt update sudo apt install gnome-core kde 1 2 sudo apt update sudo apt install kde-plasma-desktop 安装后需要选择对应的显示管理器，以下为对应桌面环境的显示管理器\nGNOME：通常使用 gdm3（GNOME Display Manager 3）作为默认显示管理器。\nKDE Plasma：通常使用 sddm（Simple Desktop Display Manager）或 lightdm，尽管 lightdm 可以配置为与 KDE Plasma 很好地配合工作。\nXFCE：通常推荐使用 lightdm 或 xdm（X Display Manager），但 lightdm 是更现代的选择。\nLXDE：可以使用 slim（Simple Login Manager）或 lightdm。\nMATE：通常使用 mate-display-manager 或 gdm3，因为 MATE 基于 GNOME 2 的代码。\nCinnamon：通常使用 lightdm 或 gdm3。\nBudgie：通常使用 gdm3，因为 Budgie 是基于 GNOME 的。\nDeepin：通常使用 lightdm。\nEnlightenment：使用 enlightenment_start，这是 Enlightenment 的一部分。\ni3：通常不使用传统的显示管理器，而是直接从 xinit 或类似的工具启动。\n","date":"2024-06-03T16:06:01+08:00","permalink":"/p/2406003/","title":"Debian12安装新的桌面环境"},{"content":"Debian 要在Debian上安装字体，可以按照以下步骤进行操作：\n打开终端，以管理员权限运行以下命令更新软件包列表：\n1 sudo apt update 安装字体管理工具（fontconfig）：\n1 sudo apt install fontconfig 将字体文件复制到系统字体目录（/usr/share/fonts/）或用户字体目录（~/.fonts/）。例如，假设你有一个名为\u0026quot;font.ttf\u0026quot;的字体文件，可以使用以下命令将其复制到系统字体目录：\n1 sudo cp font.ttf /usr/share/fonts/ 或者，如果你想将字体文件复制到用户字体目录，可以使用以下命令：\n1 cp font.ttf ~/.fonts/ 运行以下命令更新字体缓存：\n1 sudo fc-cache -f -v 这将重新生成字体缓存，使系统能够识别新安装的字体文件。\n完成后，你可以在应用程序中选择新安装的字体进行使用。\n字体推荐 fira code https://github.com/tonsky/FiraCode/releases/tag/6.2\n1 sudo mkdir -p /usr/share/fonts/fira_code \u0026amp;\u0026amp; sudo unzip Fira_Code_v6.2.zip -d /usr/share/fonts/fira_code/ \u0026amp;\u0026amp; fc-cache -f -v 简单预览\n","date":"2024-06-02T16:06:01+08:00","permalink":"/p/2406002/","title":"Linux安装字体"},{"content":"地址：https://www.registry.com.mp/\ndns解析：https://hostry.com\n","date":"2024-06-01T16:06:01+08:00","permalink":"/p/2406001/","title":"com.mp免费域名注册"},{"content":"最近需要电子版规档，其中一部分内容需要”手写“，只能另辟蹊径，最后找到了这个东西\u0026mdash;-公文处理助手\n它可以将规整的一行字体打乱，模拟手写效果。像这样：\n光靠办公助手还是不行的，除此之外还需要 ”手写字体“，这两个网站可以免费下载字体\n字体天下-云峰寒蝉体 字体天下-上首鸿志手写体 字体家-遇见你时很甜\n关于更多手写字体可以自己网上找找。\n公文处理助手\u0026amp;办公助手：http://gwclzs.cn/ 下载地址：http://www.gwclzs.cn/%E5%8A%9E%E5%85%AC%E5%8A%A9%E6%89%8B.zip\n安装完成后，打开word，点击：公文处理助手-编号-仿手写\n就可以看到啦\n不过开启后有些卡顿，我的建议是不用时可以禁用，禁用方式为：\n文件-选项-加载项-管理(A)com加载项 转到按钮-取消公文处理助手勾选-确定即可\n或者\u0026hellip;.卸载？？\n","date":"2024-05-12T16:05:43+08:00","permalink":"/p/2405012/","title":"公文处理助手\u0026办公助手"},{"content":"Linux Bench.sh 秋水逸冰大佬的写的Bench.sh脚本\n特点\n显示当前测试的各种系统信息； 取自世界多处的知名数据中心的测试点，下载测试比较全面； 支持 IPv6 下载测速； IO 测试三次，并显示平均值。 使用\n1 wget -qO- bench.sh | bash 1 curl -Lso- bench.sh | bash 1 wget -qO- 86.re/bench.sh | bash 1 curl -so- 86.re/bench.sh | bash FreeBSD 没有root权限测速\n1 pip install --user speedtest-cli 1 ~/.local/bin/speedtest-cli ","date":"2024-05-11T16:05:43+08:00","permalink":"/p/2405011/","title":"VPS性能测试脚本"},{"content":"项目地址：https://github.com/SpotX-Official/SpotX\n1 iex \u0026#34;\u0026amp; { $(iwr -useb \u0026#39;https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1\u0026#39;) } -new_theme\u0026#34; ","date":"2024-05-10T16:05:43+08:00","permalink":"/p/2405010/","title":"SpotX，Spotify的开源去广告工具"},{"content":"Monica 是一个使用最先进的 AI 模型（GPT-4、Claude 3、Gemini 等）帮助你对话、搜索、写作、翻译的一站式 AI 助手。\n温馨提示：该网站需要魔法\n通过我的邀请链接注册可获得 100 次查询，包含5 Claude 3/GPT-4 \u0026amp; 95 GPT-3.5。还有机会获得无限标准（永久无限的GPT3.5）的查询。\n邀请链接：https://bit.ly/44MQEh9\n获得永久免费的无限 GPT 查询次数！点击链接并下载Monica插件，即可参加限时活动。\n也可扫描二维码：\n","date":"2024-05-09T16:05:43+08:00","permalink":"/p/2405009/","title":"Monica，一个使用最先进的AI模型（GPT-4、Claude3、Gemini 等）帮助你对话、搜索、写作、翻译的一站式 AI 助手。"},{"content":"Monica 是一个使用最先进的 AI 模型（GPT-4、Claude 3、Gemini 等）帮助你对话、搜索、写作、翻译的一站式 AI 助手。\n温馨提示：该网站需要魔法\n通过我的邀请链接注册可获得 100 次查询，包含5 Claude 3/GPT-4 \u0026amp; 95 GPT-3.5。还有机会获得无限标准（永久无限的GPT3.5）的查询。\n邀请链接：https://bit.ly/44MQEh9\n获得永久免费的无限 GPT 查询次数！点击链接并下载Monica插件，即可参加限时活动。\n也可扫描二维码：\n","date":"2024-05-08T16:05:43+08:00","permalink":"/p/2405008/","title":"Monica，ChatGPT AI助手"},{"content":"地址：\nfirefox ","date":"2024-05-07T16:05:43+08:00","permalink":"/p/2405007/","title":"memos笔记软件，浏览器插件"},{"content":"最开始的话 在写这篇文章时，我可是广搜资料，尝试了太多方式，都不能远程访问，jupyter官方网站也没找到教程，尝试了一个下午和一个晚上也没整好，导致瞌睡都没睡好，第二天早上，突然灵光乍现，改变了修改的配置文件，然后就成了！！这其中的辛酸，不足道也。\n起因 为了更好，更便捷的使用python，在服务器上安装jupyterlab，随时随地都可访问。\n步骤 一、安装minconda（非必须，但建议） 使用conda可以更好的管理包和环境，所以采用conda的方式安装jupyter和python，环境新建一个，再使用即可\n下载minconda，下载的位置任意即可\n1 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 下载完成后的名字为 Miniconda3-latest-Linux-x86_64.sh ，给它赋予可执行权限\n1 chmod +x Miniconda3-latest-Linux-x86_64.sh 安装执行，根据提示安装即可\n1 ./Miniconda3-latest-Linux-x86_64.sh 如果还需要配置环境变量，因为我使用的是zsh，命令如下（不可全抄，路径可能不一样）\n1 2 3 4 5 # zsh环境执行这个 echo \u0026#34;PATH=$PATH:~/minconda/bin\u0026#34; \u0026gt;\u0026gt; ~/.zshrc # bash环境执行这个 echo \u0026#34;PATH=$PATH:~/minconda/bin\u0026#34; \u0026gt;\u0026gt; ~/.bashrc 新建一个python环境\n1 conda create -n lab python=3.10 如果下载速度比较慢，那么需要修改镜像源\n1 2 3 4 5 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/ conda config --set show_channel_urls yes 激活环境\n1 conda activate lab 默认情况下，会进入base环境，我的建议是可以关闭默认base环境\n1 conda config --set auto_activate_base false 二、安装jupyterlab 本文采用的是conda安装jupyter，执行如下命令\n1 2 3 4 5 6 7 8 9 10 # 进入conda创建的环境，前文已经创建 conda activate lab # 安装jupyterlab conda install jupyter # 或者，建议安装jupyter,比较全 conda install jupyterlab # 退出环境 conda deactivate 如果使用python自带的pip安装，那么执行\n1 pip install jupyter 三、修改配置，使jupyterlab可以远程连接（重要） 这步是核心，生成的命令有,有的教程用的是jupyter notebook，我需要的jupyter lab，还有的教程用的是jupyter lab，生成的却是jupyter notebook，我想不是很理解这个做法。根据最后结果，生成的文件配置了也是不能生效的，这部分可花了我太多时间了，我一个一个尝试，都以失败告终。这点希望后来人引以为戒\n1 2 3 jupyter server --generate-config jupyter-lab --generate-config jupyter-notebook --generate-config 以下为成功配置：\n直接生成密码配置文件，jupyter远程访问，没有密码怎么可以呢，请妥善保存密码，后续登录jupyter lab会用到\n至于为什么要先生成密码，后续会用到生成的配置文件，默认位置会在家目录生成 .jupyter/jupyter_server_config.json\n我的则是 /home/ecs-user/.jupyter/jupyter_server_config.json，如下所示\n1 2 3 4 5 jupyter server password Enter password: Verify password: [JupyterPasswordApp] Wrote hashed password to /home/ecs-user/.jupyter/jupyter_server_config.json 在 jupyter_server_config.json 文件里面，默认生成就是密码了，如图\n​编辑\n修改生成的 json文件，我们需要添加的内容有\n1 2 3 4 5 \u0026#34;ip\u0026#34;: \u0026#34;*\u0026#34;, \u0026#34;port\u0026#34;: 8899, \u0026#34;open_browser\u0026#34;: false, \u0026#34;allow_remote_access\u0026#34;: true \u0026#34;notebook_dir\u0026#34;: \u0026#34;/home/ecs-user/codespace/jupyterProjects\u0026#34; 根据实际情况修改即可，\nip 直接填 * 号即可\nport 为端口号，你可以更改，\nopen_browser 为默认打开浏览器，服务器资源宝贵，没安装图形化界面，关闭\nallow_remote_access 允许远程访问，这个必须打开\nnotebook_dir jupyter默认打开的位置\n修改后如图所示：\n​编辑\n四、查看配置项（非必须） 在第三步中，给出的配置项从哪知道呢，这就可以用到生成默认配置文件模板了\n1 2 jupyter server --generate-config ─╯ Writing default config to: /home/ecs-user/.jupyter/jupyter_server_config.py 生成的文件默认路径在用户家目录下 .jupyter/jupyter_server_config.py\n重要！！！：如果你生成了该文件，请修改名字，否则会导致jupyter lab启动读取该文件而不读取json文件，而该文件就算修改了也没有效果，谨记！！！\n1 mv jupyter_server_config.py jupyter_server_config.py.1 我们先来瞄一眼大概长什么样\n​编辑\n​编辑\n来对比一下 jupyter_server_config.json\n​编辑\n根据如上图的对比所示，大致也明白了，json文件中该如何修改了。\n五、启动jupyter lab 在 使用 lab 环境下\n1 2 # 使用lab环境 conda activate lab 5.1 前台启动（不建议） 1 2 # 启动jupyter lab jupyter-lab ​编辑\n5.1 后台启动（推荐） 1 2 # 后台启动，标准输出重定向到 /dev/null 标准错误重定向到 标准输出 nohup jupyter-lab \u0026gt;/deb/null 2\u0026gt;\u0026amp;1 \u0026amp; ​编辑\n打开本地浏览器窗口，输入ip:port，输入密码（这个密码在生成密码配置文件的时候输入的密码）\n如果服务端安全组端口没有打开，请自寻资料打开；\n防火墙需要关闭的关闭；\n这里就不介绍了\n输入ip和端口后，界面如下\n​编辑\n输入密码，进入如下界面\n​编辑\n至此，恭喜你，终于完成了，完结撒花 ｡:.ﾟヽ(｡◕‿◕｡)ﾉﾟ.:｡+ﾟ\n​\n","date":"2024-05-06T16:05:43+08:00","permalink":"/p/2405006/","title":"Linux（Debian）安装jupyter lab，实现远程登录访问"},{"content":"","date":"2024-05-05T16:05:43+08:00","permalink":"/p/2405005/","title":"dujiaoka独角卡安装，docker版本"},{"content":"安装 https://github.com/jeessy2/ddns-go/releases/tag/v6.6.3\n下载解压\ndocker\n1 docker run -d --name ddns-go --restart=unless-stopped --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600 webhook plusplus 推送加\n钉钉\n1 2 3 4 5 6 7 { \u0026#34;msgtype\u0026#34;: \u0026#34;markdown\u0026#34;, \u0026#34;markdown\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;你的公网IP变了\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;#### 你的公网IP变了 \\n - IPv4地址：#{ipv4Addr} \\n - 域名 #{ipv4Domains} 更新结果：#{ipv4Result} \\n\\n - IPv6地址：#{ipv6Addr} \\n - 域名 #{ipv6Domains} 更新结果：#{ipv6Result} \\n\u0026#34; } } ","date":"2024-05-03T16:05:43+08:00","permalink":"/p/2405003/","title":"ddns-go，轻量级ddns工具"},{"content":"前言 certbot 安装还是过于麻烦， snap 不轻量，不使用 snap 使用 nginx 申请容易出问题，使用 acme.sh 申请 ssl 证书 之后，发现很方便\n相比于 certbot 不同的地方在于 acme 使用 nginx/apaceh 申请证书不会修改原有的配置\n好处：不用担心配置被搞坏 缺点：需要手动配置 ssl 证书的位置。 简介 acme.sh 是一个轻量级的、纯 Shell 脚本实现的 ACME 协议客户端，主要用于自动化获取和续订 SSL/TLS 证书。它支持 Let\u0026rsquo;s Encrypt 和其他 ACME 兼容的证书颁发机构（CA）。\n主要特点 简单易用：用户只需通过简单的命令行操作即可获取和管理证书。 轻量级：不依赖于复杂的编程语言，易于部署和维护。 多种 DNS 插件：支持多种 DNS 提供商的 API，便于自动化 DNS 验证。 支持多种证书类型：可以获取通配符证书和普通域名证书。 灵活的配置：支持用户自定义配置和命令，满足不同需求。 acme.sh 是一个非常适合希望简化 SSL/TLS 证书管理流程的用户和开发者的工具。\n项目地址：https://github.com/acmesh-official/acme.sh\n后续所有 SSL/TLS 证书简称 证书\n快速上手 如果你想直接使用 acme.sh 这里提供一个简要教程\n需要修改：\n邮箱mail@yourdomain.com 域名yourdomain.com 安装 acme.sh\n将 mail@yourdoamin.com 修改为申请证书的邮箱\n1 curl https://get.acme.sh | sh -s email=mail@yourdomain.com 刷新环境变量\n1 source ~/.bashrc 修改证书 CA 机构\n1 acme.sh --set-default-ca --server letsencrypt 申请证书\n1 acme.sh --issue -d yourdomain.com --standalone 创建证书文件夹\n1 mkdir -p /etc/cert 安装证书\n1 2 3 acme.sh --install-cert -d yourdomain.com \\ --key-file /etc/cert/key.pem \\ --fullchain-file /etc/cert/cert.pem 详细内容请查看后续\n安装 acme.sh 国外服务器\n将 mail@yourdoamin.com 修改为申请证书的邮箱\n1 curl https://get.acme.sh | sh -s email=mail@yourdomain.com 1 source ~/.bashrc 国内服务器\n将 mail@yourdoamin.com 修改为申请证书的邮箱\n1 2 3 git clone https://gitee.com/neilpang/acme.sh.git cd acme.sh ./acme.sh --install -m mail@yourdomain.com 卸载 acme.sh 待续\n修改证书 CA 机构 默认证书的 CA 机构是 zerossl\n在申请证书之前，可以通过如下命令修改 CA 机构\n1 acme.sh --set-default-ca --server letsencrypt 生成证书：HTTP 方式 apache 待续\u0026hellip;\nnginx 先在 nginx 配置文件夹新增 conf 文件，填好基础的模板，比如：\n1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 修改为自己的信息\n再使用 acme.sh 申请\n1 acme.sh --issue -d yourdomain.com --nginx no web server 如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个 webserver, 临时听在80 端口, 完成验证:\n1 acme.sh --issue -d yourdomain.com --standalone 更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert\n生成证书：DNS 方式（推荐） 手动 DNS 方式 手动在域名上添加一条 txt 解析记录, 验证域名所有权.\n好处：你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证\n缺点：如果不同时配置 Automatic DNS API，使用这种方式 acme.sh 将无法自动更新证书，每次都需要手动再次重新解析验证域名所有权。\n1 2 acme.sh --issue --dns -d yourdomain.com \\ --yes-I-know-dns-manual-mode-enough-go-ahead-please 然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.\n等待解析完成之后, 重新生成证书:\n1 2 acme.sh --renew -d yourdomain.com \\ --yes-I-know-dns-manual-mode-enough-go-ahead-please 注意第二次这里用的是 --renew\n自动 DNS 方式（推荐） DNS 方式的强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证\nacme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成\ncloudflare 域名托管在 cloudflare 上申请方式\n单个域名 登录 cloudflare ,\n查看域名的 Zone ID\n1 763eac4f1bcebd8b5c95e9fc50d010b4 创建 API Token\n设置环境变量\n1 2 export CF_Token=\u0026#34;Y_jpG9AnfQmuX5Ss9M_qaNab6SQwme3HWXNDzRWs\u0026#34; export CF_Zone_ID=\u0026#34;763eac4f1bcebd8b5c95e9fc50d010b4\u0026#34; 申请证书\n1 acme.sh --issue --dns dns_cf -d yourdomain.com -d \u0026#39;*.yourdomain.com\u0026#39; 证书就会自动生成了. 这里环境变量会被自动记录下来, 将来在使用的时候, 就不需要再次指定了，直接生成就好了\n更多内容：https://github.com/acmesh-official/acme.sh/wiki/dnsapi#1-cloudflare-option\ndnspod 域名托管在 dnspod 上\n登录 dnspod 账号, 生成 api id 和 api key。\n设置 dnspod id\n1 export DP_Id=\u0026#34;1234\u0026#34; 设置 dnspod token\n1 export DP_Key=\u0026#34;sADDsdasdgdsf\u0026#34; 申请证书\n1 acme.sh --issue --dns dns_dp -d yourdomain.com -d \u0026#39;*.yourdomain.com\u0026#39; 证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来在使用 dnspod api 的时候, 就不需要再次指定了，直接生成就好了\n1 acme.sh --issue -d yourdomain.com.com --dns dns_dp 安装证书 前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.\n注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.\n正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被 copy 到相应的位置\nApache 1 2 3 4 5 acme.sh --install-cert -d yourdomain.com \\ --cert-file /path/to/certfile/in/apache/cert.pem \\ --key-file /path/to/keyfile/in/apache/key.pem \\ --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \\ --reloadcmd \u0026#34;service apache2 force-reload\u0026#34; Nginx 1 2 3 4 acme.sh --install-cert -d yourdomain.com \\ --key-file /etc/nginx/ssl/yourdomain.com/key.pem \\ --fullchain-file /etc/nginx/ssl/yourdomain.com/cert.pem \\ --reloadcmd \u0026#34;service nginx force-reload\u0026#34; 可自由指定位置，请保证/etc/nginx/ssl/yourdomain.com路径存在\n一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload\nNginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cert ，而非 /etc/nginx/ssl/\u0026lt;domain\u0026gt;.cert ，否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。\n--install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd 会被自动调用,让服务器生效.\n详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc\n值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.\n查看证书 查看已安装证书信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 acme.sh --info -d yourdomain.com # 会输出如下内容： DOMAIN_CONF=/root/.acme.sh/yourdomain.com/yourdomain.com.conf Le_Domain=yourdomain.com Le_Alt=no Le_Webroot=dns_ali Le_PreHook= Le_PostHook= Le_RenewHook= Le_API=https://acme-v02.api.letsencrypt.org/directory Le_Keylength= Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310 Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310 Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07 Le_CertCreateTime=1649358725 Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022 Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022 Le_NextRenewTime=1654456325 Le_RealCertPath= Le_RealCACertPath= Le_RealKeyPath=/etc/acme/yourdomain.com/privkey.pem Le_ReloadCmd=service nginx force-reload Le_RealFullChainPath=/etc/acme/yourdomain.com/chain.pem 更新证书 目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心\n请确保 cronjob 正确安装, 看起来是类似这样的：\n1 2 3 crontab -l 56 * * * * \u0026#34;/root/.acme.sh\u0026#34;/acme.sh --cron --home \u0026#34;/root/.acme.sh\u0026#34; \u0026gt; /dev/null 关于修改 ReloadCmd 目前，修改 ReloadCmd 并没有专门的命令实现。我们可以通过重新安装证书来间接达到修改的目的。\n此外，安装证书后，相关信息会保存在 ~/.acme.sh/yourdomain.com/example.conf 文件中，内容与执行 acme.sh --info -d yourdomain.com 输出的信息一致，但 ReloadCmd 在文件中使用了 Base64 编码。\n理论上，我们可以直接修改该文件来更改 ReloadCmd，而且在修改时无需进行 Base64 编码，直接写入命令的原文 acme.sh 也能被识别。\n然而，请注意，example.conf 文件的位置和内容格式在未来可能会发生变化！该文件一直以来都是内部使用，未来可能会转为使用 SQLite 或 MySQL 格式存储。因此，一般不建议自行修改。\n更新 acme.sh 目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步\n升级 acme.sh 到最新版\n1 acme.sh --upgrade 如果你不想手动升级, 可以开启自动升级\n1 acme.sh --upgrade --auto-upgrade 之后, acme.sh 就会自动保持更新了\n你也可以随时关闭自动更新\n1 acme.sh --upgrade --auto-upgrade 0 出错怎么办 如果出错, 请添加 debug log：\n1 acme.sh --issue ..... --debug 或者：\n1 acme.sh --issue ..... --debug 2 请参考： https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh\n在 DNS 验证模式下如果 debug 中出现诸如\u0026quot;timed out\u0026quot;等字样可能是因为 GFW 拦截了相应请求，需要添加 http(s) proxy 环境变量。（请按照自己实际设定修改）\n1 export http_proxy=\u0026#34;socks5h://localhost:1081\u0026#34; \u0026amp;\u0026amp; export https_proxy=\u0026#34;socks5h://localhost:1081\u0026#34; 如果是使用 docker 则完整示例配置如下：\n1 2 3 4 5 6 7 8 9 10 docker run --rm -it \\ -v \u0026#34;/etc/acme\u0026#34;:/acme.sh \\ -e \u0026#34;CF_Token=[填入自己的信息]\u0026#34; \\ -e \u0026#34;CF_Account_ID=[填入自己的信息]\u0026#34; \\ -e \u0026#34;CF_Zone_ID=[填入自己的信息]\u0026#34; \\ -e http_proxy=\u0026#34;socks5h://[代理A]:1234\u0026#34; \\ -e https_proxy=\u0026#34;socks5h://[代理A]:1234\u0026#34; \\ --network container:[代理A]\\ neilpang/acme.sh \\ --issue -d yourdomain.com --dns dns_cf --debug 上述例子中使用 cloudflare 的 DNS 来签发证书，并通过把 acme.sh 链接到容器[代理 A]，来转发 curl 请求（请按照自己实际设定修改）\n最后, 本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.\nhttps://github.com/Neilpang/acme.sh/wiki\n删除证书 要使用 acme.sh 删除证书，主要涉及两个步骤：吊销 (revoke) 证书和移除 (remove) acme.sh 对该域名的管理。\n重要提示：\n吊销证书 (Revoke)： 吊销证书会告知证书颁发机构 (CA) 该证书已不再受信任。这通常在你认为私钥可能已泄露时才需要执行。如果你只是想停止使用该证书，或者换用另一个证书，通常不需要吊销。吊销操作是不可逆的。 移除证书 (Remove)： 移除操作会从 acme.sh 的配置中删除该域名的证书信息，停止 acme.sh 对其进行自动续期。这并不会从 CA 那里吊销证书，也不会删除你服务器上已安装的证书文件。 以下是具体步骤：\n吊销证书（可选但推荐，如果私钥可能泄露）：\n1 acme.sh --revoke -d yourdomain.com 移除 acme.sh 对该域名的管理：\n1 acme.sh --remove -d yourdomain.com 常用命令 查看证书列表\n1 acme.sh --list 吊销证书\n1 acme.sh --revoke -d yourdomain.com 移除证书\n1 acme.sh --remove -d yourdomain.com 使用 DNS 自动更新\n1 2 3 4 5 6 ## dnspod id export DP_Id=\u0026#34;1234\u0026#34; ## dnspod token export DP_Key=\u0026#34;sADDsdasdgdsf\u0026#34; ## 申请命令 acme.sh --issue --dns dns_dp -d yourdomain.com 修改 SSL 证书默认的 CA 机构\n1 acme.sh --set-default-ca --server letsencrypt 一键脚本（待续） 待续\u0026hellip;\n","date":"2024-05-02T16:05:43+08:00","permalink":"/p/2405002/","title":"acme.sh，SSL，TLS证书申请工具【万字长文详解⚠️】"},{"content":"简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。\n官网：https://1panel.dev\n产品优势 高效管理：用户可以通过 Web 图形界面轻松管理 Linux 服务器，实现主机监控、文件管理、数据库管理、容器管理等功能； 快速建站：深度集成开源建站软件 WordPress 和 Halo，域名绑定、SSL 证书配置等操作一键搞定； 应用商店：精选上架各类高质量的开源工具和应用软件，协助用户轻松安装并升级； 安全可靠：基于容器管理并部署应用，实现最小的漏洞暴露面，同时提供防火墙和日志审计等功能； 一键备份：支持一键备份和恢复，用户可以将数据备份到各类云端存储介质，永不丢失。 安装部署 在线安装 Debian\n1 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; bash quick_start.sh Ubuntu\n1 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; sudo bash quick_start.sh ","date":"2024-05-01T16:05:43+08:00","permalink":"/p/2405001/","title":"1panel，一个现代化、开源的 Linux 服务器运维管理面板"},{"content":"引用 国内外综述部分的应用应该占据很大一部分的引用文献。不少于10篇\n这一步引用多也有好处，后续更改正文内容不用担心调很多文献顺序。血的教训。\n","date":"2024-04-16T15:07:04+08:00","permalink":"/p/2404016/","title":"本科毕业设计论文书写注意事项"},{"content":"简介 Maccms，全称苹果 CMS，是一款开源免费的视频内容管理系统 (CMS)。它基于 PHP 和 MySQL 构建，主要用于快速搭建视频网站、影视资源站等。\n核心功能和特点：\n资源采集: Maccms 具有强大的采集功能，支持多种采集方式，可以从第三方资源站采集视频资源，自动更新和管理。这是它最核心的功能之一。 视频播放: 支持多种视频格式和播放器，方便用户在线观看视频。 模板引擎: 拥有强大的模板引擎，可以自定义网站界面风格。 会员系统: 集成会员系统，可以实现会员注册、登录、权限管理等功能。 搜索功能: 内置搜索功能，方便用户查找视频资源。 广告管理: 可以添加和管理网站广告，实现流量变现。 分类管理: 可以对视频资源进行分类管理，方便用户浏览。 插件扩展: 支持插件扩展，可以扩展系统的功能。 SEO 优化: 提供了基本的 SEO 优化功能，有利于网站被搜索引擎收录。 免费开源: Maccms 是开源免费的，可以自由下载和使用。 主要用途：\n搭建视频网站 搭建影视资源站 搭建电影、电视剧、动漫等在线观看平台 搭建个人视频分享平台 官方源码：https://github.com/magicblack/maccms10\n安装 docker 由于 maccms 是 PHP 编写，配置比较繁琐\n所以采用 docker 的方式安装，docker 镜像已经好心人帮忙构建了，用的最多是这个：esme518/docker-maccms10。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 version: \u0026#39;3.3\u0026#39; services: maccms: image: esme518/docker-maccms10 container_name: maccms restart: unless-stopped volumes: - ./maccms_data:/var/www/html ports: - 8013:80 depends-on: - maccms-db maccms-db: image: mariadb:10.3 container_name: maccms-db restart: unless-stopped volumes: - ./mysql:/var/lib/mysql environment: - MARIADB_ROOT_PASSWORD=maccms_db_password 播放器（必须） 播放必须要配置播放器，播放器编码根据对应采集的站点说明添加\n采集（必须） 数据的来源\n采集站点：\nikun 资源：https://www.ikunzy.com 豪华资源：https://haohuazy.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ```bash 360|点播: https://360zy.com/api.php/provide/vod/ OK|点播: https://okzyw9.com/api.php/provide/vod/ U酷|点播: https://api.ukuapi.com/api.php/provide/vod/ ikun|点播: https://ikunzyapi.com/api.php/provide/vod/ 百度资源: https://api.apibdzy.com/api.php/provide/vod/ 宝片|点播: https://zpsps.com/api.php/provide/vod/ 暴风|点播: https://bfzyapi.com/api.php/provide/vod/ 豆瓣|点播: https://caiji.dbzy.tv/api.php/provide/vod/at/josn/ 非凡|点播: http://cj.ffzyapi.com/api.php/provide/vod/ 腐剧|点播: http://www.fuju2024.cc:8013/ruifenglb_api.php/provide/vod/ 高清资源: https://api.1080zyku.com/inc/apijson.php/ 光速资源: https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/ 豪华|点播: https://hhzyapi.com/api.php/provide/vod/ 黑木耳|点播: https://json.heimuer.xyz/api.php/provide/vod 红牛|点播: https://www.hongniuzy2.com/api.php/provide/vod/ 虎牙|点播: https://www.huyaapi.com/api.php/provide/vod/ 华为吧|点播: https://hw8.live/api.php/provide/vod/ 极速|点播: https://jszyapi.com/api.php/provide/vod/ 金鹰|点播: https://jinyingzy.com/api.php/provide/vod/ 金鹰资源: https://jyzyapi.com/provide/vod/from/jinyingm3u8/at/json/ 快车|点播: https://caiji.kczyapi.com/api.php/provide/vod/from/kcm3u8/ 量子|点播: https://cj.lziapi.com/api.php/provide/vod/ 魔都|点播: https://caiji.moduapi.cc/api.php/provide/vod/ 墨斗|点播: https://www.mdzyapi.com/api.php/provide/vod/ 牛牛|点播: https://api.niuniuzy.me/api.php/provide/vod/ 飘零|点播: https://p2100.net/api.php/provide/vod/ 闪电|点播: http://sdzyapi.com/api.php/provide/vod/ 速博|点播: https://subocaiji.com/api.php/provide/vod/ 索尼|点播: https://suoniapi.com/api.php/provide/vod/ 淘片资源: https://taopianapi.com/cjapi/mc/vod/json/m3u8.html/ 旺旺|点播: https://api.wwzy.tv/api.php/provide/vod/ 卧龙|点播: https://collect.wolongzyw.com/api.php/provide/vod/ 无尽|点播: https://api.wujinapi.com/api.php/provide/vod/ 小黄人|点播: https://iqyi.xiaohuangrentv.com/api.php/provide/vod/ 新浪|点播: https://api.xinlangapi.com/xinlangapi.php/provide/vod/ 丫丫|点播: https://cj.yayazy.net/api.php/provide/vod/ 樱花|点播: https://m3u8.apiyhzy.com/api.php/provide/vod/ 影图|点播: http://cj.vodimg.top/api.php/provide/vod/ 最大|点播: http://zuidazy.me/api.php/provide/vod/ 1 2 3 4 5 6 7 8 9 10 ## 伪静态配置 默认运行环境是 apache，按照官方的教程在根目录添加 `.htaccess`，接着后台开启伪静态是不成功的，因为 docker 这个版本没有启用 rewrite 组件。我们这下来介绍如何开启 rewrite 模块。 ### 启用 mod_rewrite （1）进入 docker 容器 ```shell docker exec -it \u0026lt;容器id\u0026gt; bash （2）查看是否启用 mod_rewrite\n1 apachectl -M （3）如果输出结果没有 mod_rewrite 或者 rewrite_module，则启用\n1 a2enmod rewrite （4）重启 apache，使其生效，运行后会退出容器\n1 service apache2 restart （5）再次进入容器，查看是否启用\n1 apachectl -M 开启伪静态 （1）在根目录添加 .htaccess\n1 vim .htaccess 1 2 3 4 5 6 7 8 \u0026lt;IfModule mod_rewrite.c\u0026gt; Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] \u0026lt;/IfModule\u0026gt; （2）登录后台，启用伪静态\n路径为：系统-URL 地址配置-路由伪静态设置\n路由状态：开启 伪静态状态：开启 测试访问网站，查看是否成功。\n插件 自动更新海报图 在网站根目录添加 bbj.php\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 \u0026lt;?php $configFile = __DIR__.\u0026#39;/application/database.php\u0026#39;; if (!file_exists($configFile)) { die(\u0026#39;无法找到数据库配置文件,请在mac中找到配置数据库信息的文件\u0026#39;); } $config = include $configFile; $servername = $config[\u0026#39;hostname\u0026#39;]; $port = $config[\u0026#39;hostport\u0026#39;]; $username = $config[\u0026#39;username\u0026#39;]; $password = $config[\u0026#39;password\u0026#39;]; $dbname = $config[\u0026#39;database\u0026#39;]; $dbtable = $config[\u0026#39;prefix\u0026#39;]; $conn = new mysqli($servername, $username, $password, $dbname,$port); $currenturl=$_SERVER[\u0026#39;HTTP_HOST\u0026#39;] . $_SERVER[\u0026#39;REQUEST_URI\u0026#39;]; if ($conn-\u0026gt;connect_error) { die(\u0026#34;连接数据库失败: \u0026#34; . $conn-\u0026gt;connect_error); } $url = \u0026#34;https://bbj.icu/BBJ-code?cmsname=maccms10\u0026amp;level=9\u0026amp;dbtable={$dbtable}\u0026amp;bbjtype=hot\u0026amp;num=10\u0026amp;filtercondi=doubanid\u0026amp;orderby=ASC\u0026amp;requesturl=$currenturl\u0026#34;; $data = file_get_contents($url); $sqlCommandsArray = explode(\u0026#39;;\u0026#39;, $data); foreach ($sqlCommandsArray as $sqlCommand) { if (!empty(trim($sqlCommand))) { if ($conn-\u0026gt;query($sqlCommand) === TRUE) { echo \u0026#34;成功执行命令：1条\u0026lt;br\u0026gt;\u0026#34;; } else { echo \u0026#34;执行命令时出错：$sqlCommand\u0026lt;br\u0026gt;错误信息：\u0026#34; . $conn-\u0026gt;error; } } } $conn-\u0026gt;close(); echo \u0026#34;执行更新操作已完成。代码由www.bbj.icu生成,有疑问可以联系qq群咨询\u0026lt;a target=\u0026#39;_blank\u0026#39; href=\u0026#39;https://qm.qq.com/cgi-bin/qm/qr?k=zOJ7ZeeYk_2BkCK16CjW7oBGNRFkTOGd\u0026amp;jump_from=webapi\u0026amp;authKey=pLI5HG6JxEHWAVW7Rw5TZqV003hRX/a+/p03GIrxrR3dX834Fu6eP9253aKupdhr\u0026#39;\u0026gt;\u0026lt;img border=\u0026#39;0\u0026#39; src=\u0026#39;//pub.idqqimg.com/wpa/images/group.png\u0026#39; alt=\u0026#39;BB机海报\u0026#39; title=\u0026#39;BB机海报\u0026#39;\u0026gt;822011364\u0026lt;/a\u0026gt;\u0026#34; ?\u0026gt; 访问在后台设置的域名： 网站域名/bbj.php即可生成\n设置定时任务\n1 crontab -e 添加如下信息\n这个任务表示每 7 天早上 5 点执行一次\n1 0 5 * * 0 curl 网站域名/bbj.php 定时采集 。。。\n任务脚本 这个任务脚本用于在服务器定时任务执行\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #!/bin/bash # 定义一个函数用于随机延迟 random_delay() { local delay=$(shuf -i 30-60 -n 1) sleep $delay } # 定义日志文件路径 log_file=\u0026#34;$HOME/logs/maccms/maccms_collect_log.log\u0026#34; # 定义请求路径数组 urls=( \u0026#34;https://movie.seektao.cc/api.php/timming/index.html?enforce=1\u0026amp;name=ikun_spare\u0026#34; \u0026#34;https://movie.seektao.cc/api.php/timming/index.html?enforce=1\u0026amp;name=hhzy_m3u8\u0026#34; \u0026#34;https://sesea.dynv6.net/api.php/timming/index.html?enforce=1\u0026amp;name=layazy_m3u8\u0026#34; ) # 函数用于记录日志 log_message() { echo \u0026#34;$(date +\u0026#39;%Y-%m-%d %H:%M:%S\u0026#39;) --- $1 --- $2\u0026#34; \u0026gt;\u0026gt; $log_file } echo \u0026#34;采集任务开始...\u0026#34; # 循环遍历请求路径数组 for url in \u0026#34;${urls[@]}\u0026#34; do echo \u0026#34;正在请求：$url\u0026#34; /usr/bin/curl \u0026#34;$url\u0026#34; random_delay if [ $? -eq 0 ]; then log_message \u0026#34;$url\u0026#34; \u0026#34;success\u0026#34; else log_message \u0026#34;$url\u0026#34; \u0026#34;error\u0026#34; fi done echo \u0026#34;所有任务执行完毕。\u0026#34; exit 0 备份 整个目录备份\n1 tar -zcvf maccms_backup_all_data_$(date +%Y%m%d%H%M%S).tar.gz -C maccms/ . 数据库备份 后台有些数据不是以 maccms 配置文件存在的，而是在数据库中，这里列举出常见数据\n1 2 3 4 视频数据 分类管理 采集接口 用户数据 站点备份 maccms 有些数据不是存在数据库中，而是存在本地配置文件中，迁移或者备份需要指导这些文件。\n进入 maccms 的配置文件夹\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $ tree -L 1 . ├── addons ├── api.php ├── application ├── crossdomain.xml ├── extend ├── haokanadmin.php ├── index.php ├── install.php ├── LICENSE ├── macplus ├── README.md ├── robots.txt ├── runtime ├── static ├── template ├── thinkphp ├── upload ├── vendor └── 说明文档 备份\n1 2 3 4 5 6 7 8 9 10 11 tar -zcvf maccms_backup_$(date \u0026#39;+%Y%m%d_%H%M%S\u0026#39;).tar.gz \\ application/database.php \\ application/route.php \\ application/extra/maccms.php \\ application/extra/bind.php \\ application/extra/timming.php \\ application/extra/vodplayer.php \\ application/extra/voddowner.php \\ application/extra/vodserver.php \\ application/extra/quickmenu.php \\ static/images/logo.jpg 解释\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # maccms 备份 tar -zcvf maccms_backup_$(date \u0026#39;+%Y%m%d_%H%M%S\u0026#39;).tar.gz \\ # 数据库连接配置 application/database.php \\ # 路由规则 application/route.php \\ # 后台主页 application/extra/maccms.php \\ # ！！！绑定的采集分类，不备份的话新添加相同的采集还需要手动绑定 application/extra/bind.php \\ # 定时任务 application/extra/timming.php \\ # application/extra/vodplayer.php \\ application/extra/voddowner.php \\ application/extra/vodserver.php \\ # 快捷菜单 application/extra/quickmenu.php \\ # 已修改的logo static/images/logo.jpg 主题备份 1 2 # mxonepro tar -zcvf mxonepro.tar.gz ./template/mxpro/ ./mxtheme 恢复 1 tar -zxvf 备份文件 -C 恢复的位置 例如\n1 tar -zxvf maccms_backup_20240511_170345.tar.gz -C ./data/ 常见问题 https://www.maccms.plus/guide/help.html\n如重装 maccms\nhttps://www.maccms.plus/faq/#%E5%A6%82%E4%BD%95%E9%87%8D%E8%A3%85%E8%8B%B9%E6%9E%9Ccms\n1 rm -rf application/data/install/install.lock 查看 php 信息 在 php 项目的根目录添加 info.php\n1 2 3 4 echo \u0026#34;\u0026lt;?php phpinfo(); ?\u0026gt; \u0026#34; \u0026gt; info.php 访问这个文件，比如：www.phpsite.com/info.php\n","date":"2024-04-15T15:07:04+08:00","permalink":"/p/2404015/","title":"maccms，影视站点搭建教程"},{"content":"简介 yt-dlp 是一个功能丰富的命令行音频/视频下载器，支持数千个网站。该项目是 youtube-dl 的一个分支，基于现已不再活跃的 youtube-dlc。\n源码：https://github.com/yt-dlp/yt-dlp\n安装 下载地址：https://github.com/yt-dlp/yt-dlp/releases/latest\nWindows 直接下载：点我下载最新版\n安装方式：\n新建目录yt-dlp 移动下载的文件到新建的目录 将目录加入到 PATH环境变量 Linux 下载\n1 curl -fsSL https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/ 加入到 PATH环境变量\n1 2 echo \u0026#39;export PATH=$PATH:~/.local/bin \u0026gt;\u0026gt; ~/.bashrc\u0026#39; source ~/.bashrc 查看版本\n1 yt-dlp --version 基本用法 语法：\n1 yt-dlp [OPTIONS] URL [URL...] [OPTIONS]：选项 URL：视频链接 1 yt-dlp URL 默认下载最佳可用质量的视频和音频，并将它们合并成一个文件\n1 yt-dlp -F URL 查看下载链接包含的视频信息，如图：\n1 yt-dlp -f ID URL ID：每个视频在不同平台和不同质量下，都会有对应的格式代码。 对进行查找后的 ID，进行下载\n1 yt-dlp -f ‘bv[ext=mp4]+ba[ext=m4a]’ –embed-metadata –merge-output-format mp4 URL yt-dlp: 这是 youtube-dlp 工具的命令行调用。 -f ‘bv[ext=mp4]+ba[ext=m4a]’: 这是核心的格式选择部分。 -f 或 --format: 指定要下载的视频和音频格式。 ‘bv[ext=mp4]+ba[ext=m4a]’: 这是格式选择器。 bv: 代表 \u0026ldquo;best video\u0026rdquo;（最佳视频）。它告诉 yt-dlp 选择可用的最佳画质的纯视频流（不含音频）。 [ext=mp4]: 这是一个过滤器。它进一步限制 bv 的选择，要求这个最佳视频流的文件扩展名必须是 mp4。这是为了确保下载的视频部分是 MP4 格式。 +: 这个符号表示将前面的视频流和后面的音频流合并。 ba: 代表 \u0026ldquo;best audio\u0026rdquo;（最佳音频）。它告诉 yt-dlp 选择可用的最佳音质的纯音频流（不含视频）。 [ext=m4a]: 这是对 ba 的过滤器。它限制最佳音频流的文件扩展名必须是 m4a。M4A 通常是 AAC 音频的容器格式，它与 MP4 视频非常兼容。 总结此部分：该命令会寻找并下载最佳的 MP4 格式的视频流（不含音频），以及最佳的 M4A 格式的音频流（不含视频），然后准备将它们合并。 –embed-metadata: --embed-metadata: 这个选项告诉 yt-dlp 将视频的元数据（如标题、描述、上传者、上传日期、缩略图等）嵌入到下载的最终文件中。这样，当你在媒体播放器中播放视频时，可以显示这些信息。 –merge-output-format mp4: --merge-output-format: 这个选项指定当 yt-dlp 需要合并单独的视频流和音频流时，最终合并输出文件的容器格式。 mp4: 明确指定合并后的文件格式为 MP4。这与你选择的 mp4 视频和 m4a 音频非常吻合，因为 MP4 容器可以很好地包含这两种流。 文档 中文版：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 使用：yt-dlp.exe [选项] URL [URL...] 选项： 通用选项： -h, --help 打印此帮助文本并退出 --version 打印程序版本并退出 -U, --update 将此程序更新到最新稳定版本 --no-update 不检查更新（默认） --update-to [CHANNEL]@[TAG] 升级/降级到特定版本。如果省略，CHANNEL和TAG默认为\u0026#34;stable\u0026#34;和\u0026#34;latest\u0026#34;；有关详细信息，请参阅\u0026#34;UPDATE\u0026#34;。支持的通道：stable、nightly、master -i, --ignore-errors 忽略下载和后处理错误。即使后处理失败，下载也将被视为成功 --no-abort-on-error 在下载错误时继续下一个视频；例如，在播放列表中跳过不可用的视频（默认） --abort-on-error 如果出现错误，则中止进一步视频的下载（别名：--no-ignore-errors） --dump-user-agent 显示当前用户代理并退出 --list-extractors 列出所有支持的提取器并退出 --extractor-descriptions 输出所有支持的提取器的描述并退出 --use-extractors NAMES 使用的提取器名称，用逗号分隔。您还可以使用正则表达式、\u0026#34;all\u0026#34;、\u0026#34;default\u0026#34;和\u0026#34;end\u0026#34;（结束URL匹配）；例如 --ies \u0026#34;holodex.*,end,youtube\u0026#34;。用\u0026#34;-\u0026#34;前缀名称来排除它，例如 --ies default,-generic。使用 --list-extractors 列出提取器名称。（别名：--ies） --default-search PREFIX 用于未经验证的URL的前缀。例如，\u0026#34;gvsearch2:python\u0026#34;为搜索词\u0026#34;python\u0026#34;从谷歌视频下载两个视频。使用值\u0026#34;auto\u0026#34;让yt-dlp猜测（\u0026#34;auto_warning\u0026#34;在猜测时发出警告）。\u0026#34;error\u0026#34;会引发错误。默认值\u0026#34;fixup_error\u0026#34;修复损坏的URL，但如果无法修复则发出错误而不是搜索 --ignore-config 不加载除 --config-locations 给定的配置文件之外的任何配置文件。为了向后兼容，如果在系统配置文件中找到此选项，则不加载用户配置。（别名：--no-config） --no-config-locations 不加载任何自定义配置文件（默认）。当在配置文件中给出时，忽略当前文件中定义的所有先前的 --config-locations --config-locations PATH 主配置文件的位置；可以是配置的路径或其包含目录（\u0026#34;-\u0026#34;为stdin）。可以多次使用，也可在其他配置文件中使用 --flat-playlist 不提取播放列表的视频，只列出它们 --no-flat-playlist 完全提取播放列表的视频（默认） --live-from-start 从开始下载直播流。目前仅支持YouTube（实验性） --no-live-from-start 从当前时间下载直播流（默认） --wait-for-video MIN[-MAX] 等待计划直播流可用。传递最小秒数（或范围）以在重试之间等待 --no-wait-for-video 不等待计划的直播流（默认） --mark-watched 标记视频为已观看（即使使用 --simulate） --no-mark-watched 不标记视频为已观看（默认） --color [STREAM:]POLICY 是否在输出中发出颜色代码，可选地以流（stdout或stderr）为前缀以应用设置。可以是\u0026#34;always\u0026#34;、\u0026#34;auto\u0026#34;（默认）、\u0026#34;never\u0026#34;或\u0026#34;no_color\u0026#34;（使用非彩色终端序列）。可以多次使用 --compat-options OPTS 选项可以帮助保持与youtube-dl或youtube-dlc配置的兼容性，通过恢复yt-dlp所做的一些更改。有关详细信息，请参阅 \u0026#34;默认行为的差异\u0026#34; --alias ALIASES OPTIONS 为选项字符串创建别名。除非别名以破折号\u0026#34;-\u0026#34;开头，否则它将以\u0026#34;--\u0026#34;为前缀。根据Python字符串格式化迷你语言解析参数。例如 --alias get-audio,-X \u0026#34;-S=aext:{0},abr -x --audio-format {0}\u0026#34; 创建选项 \u0026#34;--get-audio\u0026#34; 和 \u0026#34;-X\u0026#34;，它们接受一个参数（ARG0）并扩展为 \u0026#34;-S=aext:ARG0,abr -x --audio-format ARG0\u0026#34;。所有定义的别名都列在 --help 输出中。别名选项可能会触发更多别名；因此，请小心避免定义递归选项。作为安全措施，每个别名最多可触发100次。此选项可以多次使用 ","date":"2024-04-13T15:07:04+08:00","permalink":"/p/2404013/","title":"yt-dlp，一个功能丰富的命令行音频，视频下载器"},{"content":"暂无\n","date":"2024-04-12T15:07:04+08:00","permalink":"/p/2404012/","title":"you-get下载器（待续）"},{"content":"有些程序使用的频繁，为了免去手动运行，可以设置开机自启动。\n但是有些程序自身没有开机自启的设置，此情况下，我们可以将程序的快捷方式添加到Windows的【启动】文件夹，实现程序开机自启。\nWindows程序自启动目录：\n1 C:\\Users\\taoone\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup 或者通过 win+r ，输入 shell:startup回车打开。\n","date":"2024-04-11T15:07:04+08:00","permalink":"/p/2404011/","title":"Windows将程序设置开机自启"},{"content":"方式一：手动修改注册表 打开注册表，win+s搜索注册表或者regedit打开注册表，\n定位到\n1 计算机\\HKEY_CLASSES_ROOT\\Directory\\Background\\shell 右键新增项，名字随意，建议有意义的名字，比如 OpenCmdHere\n在 OpenCmdHere 下继续新增项，名字为 command，这个名字不可更改。\n在 command 下修改默认的数据，改为\n1 cmd.exe /k cd \u0026#34;%V\u0026#34; 在OpenCmdHere 下新增字符串值，名称为 Icon，数据为 cmd.exe\n退出查看效果如何\n方式二：执行reg文件 为了简化操作，方式一的注册表我已导出为 .reg文件，只需要新建文件，后缀改为 .reg，把下面的内容粘贴进去执行即可\n1 2 3 4 5 6 7 8 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\OpenCmdHere] @=\u0026#34;Open Cmd Here\u0026#34; \u0026#34;Icon\u0026#34;=\u0026#34;cmd.exe\u0026#34; [HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\OpenCmdHere\\command] @=\u0026#34;cmd.exe /k cd \\\u0026#34;%V\\\u0026#34;\u0026#34; ","date":"2024-04-10T15:07:04+08:00","permalink":"/p/2404010/","title":"windows右键新增打开cmd"},{"content":"GitHub项目：https://github.com/redis-windows/redis-windows\n下载解压\n安装服务\n1 2 3 4 sc.exe create Redis binpath=RedisService.exe详细所在位置 start= auto # 例如 sc.exe create Redis binpath=D:\\develop\\Redis-7.2.4-Windows-x64-cygwin-with-Service\\RedisService.exe start= auto 服务启动停止\n1 2 3 4 5 6 7 8 # 启动 net start Redis # 停止 net stop Redis # 删除服务 sc.exe delete Redis ","date":"2024-04-09T15:07:04+08:00","permalink":"/p/2404009/","title":"redis-windows安装"},{"content":"简介 本文将介绍使用 picgo-core 的安装，配置，使用，达到编写 markdown 的时候，复制图片在粘贴，自动上传图片到图床，并使用图床的 URL\n安装 安装 nvm：\n下载安装：https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11\n安装 nvm 时，需要选择 nvm 所在位置和软链接位置。\n安装 nodejs：\n1 2 nvm install 20.18.0 nvm use 20.18.0 安装 picgo：\n1 2 3 4 5 npm install -g picgo # 或者pnpm # npm install -g pnpm # pnpm install -g picgo 注意：picgo 位置在 nvm 安装时指定的超链接位置，比如我的picgo所在路径为D:\\develop\\nvm4w\\nodejs ，为方便使用，建议将此目录添加到系统环境变量。\n完整路径为：D:\\develop\\nvm4w\\nodejs\\picgo\n重启终端，输入\n1 picgo -v 有版本号显示成功\npicgo 的配置文件：\nWindows： 1 %USERPROFILE%\\.picgo\\config.json Linux / macOS： 1 ~/.picgo/config.json 插件 picgo 是一个图床上传软件，需要配置图床使用，使用前需要配置一下图床对应的插件\nnote.ms ： picgo-plugin-smms-user (已不可使用) 这个插件用于图床 sm.ms，注册用户免费使用 5G，稳定很多年，博客使用足够\nsm.ms 有两个域名：\nhttps://sm.ms https://smms.app/ 国内使用 安装 1 picgo install picgo-plugin-smms-user 使用 1 picgo use 出现如下信息，下滑找到 smms-user，注意不是 smms，回车确定 1 2 3 4 5 6 7 8 9 10 $ picgo use ? Use an uploader (Use arrow keys) \u0026gt; smms-user aliyun tcyun smms github qiniu imgur (Move up and down to reveal more choices) 选择路径风格： path：路径为日期 base64：路径为 base64 编码 使用插件，选择 picgo-plugin-smms-user 配置 使用 picgo-plugin-smms-user 只有，还需要配置一下 sm.ms 的 token\n点此获取\n配置上传器 1 picgo set uploader 选择 smms-user 输入 token S3 存储：picgo-plugin-s3 这个插件用于图床 Amazon S3 协议，可以配置 S3 云存储\n开源地址：https://github.com/wayjam/picgo-plugin-s3\n可以前往查看详细说明\n安装\n1 picgo add s3 配置\n1 picgo set uploader 选择 aws-s3\n输入一个名字 ，本次使用的是 cloudflare-r2，\n注意：以下内容只针对 Cloudflare R2 ，如果是其他 S3 存储，请实际调试后再填写\n输入 access key id\n输入 secret access key\n输入 bucketName：桶名字\n输入 uploadPath：保存的路径，比如 {year}/{month}/{md5}.{extName}\n输入 region：auto\n输入 endpoint：\nenable s3ForcePathStyle or not ：填写 N\n自定义输出 URL 模板：https://自己的域名/{path}\n上传图片 上传剪贴板的图片\n1 2 # 复制一张图片，然后使用如下命令测试上传 picgo u ","date":"2024-04-08T15:07:04+08:00","permalink":"/p/2404008/","title":"picgo-core上传图片到图床"},{"content":" 1 2 3 sudo apt install openjdk-17-jdk sudo apt install openjdk-17-jre ","date":"2024-04-05T15:07:04+08:00","permalink":"/p/2404005/","title":"Debian安装Java17"},{"content":"mongodb的版本为：4.4+\n官方地址：https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-debian/\n1 2 3 4 5 6 7 8 9 10 11 12 sudo apt-get install gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | \\ sudo gpg -o /usr/share/keyrings/mongodb-server-4.4.gpg \\ --dearmor echo \u0026#34;deb [ signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main\u0026#34; | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list sudo apt-get update sudo apt-get install -y mongodb-org 1 sudo systemctl start mongod ","date":"2024-04-04T15:07:04+08:00","permalink":"/p/2404004/","title":"Debain安装mongodb"},{"content":"今天阿里云又发邮件和短信提醒我了，提示我的磁盘占用超过95%，好吧，晚上来看看怎么清理清理。 （1）手动查询出什么文件夹占用了大量的空间\n1 du -h --max-depth=1 / 截图如下 来针对性的进一步查询\n1 2 3 du -h --max-depth=1 /home | sort -hr ## 接下来依葫芦画瓢即可,找到不需要的大文件删除 （2）docker 我平时诸多服务采用的都是docker启动，借助docker自动删除一些不用的镜像，容器，网络，存储卷\n1 2 3 4 5 6 7 8 9 docker image prune -a docker container prune docker volume prune docker network prune docker system prune -a 最后结果\n可以看到清理了9个g个空间。有些应用知识临时测试，不打算长期用就及时删除吧，免得到时候还不好找。\n阿里云的ecs，40个g对于我安装了15个应用来说，只能刚刚好了。\n","date":"2024-04-03T15:07:04+08:00","permalink":"/p/2404003/","title":"Linux存储空间的查询，清理"},{"content":"docker一键启动\n1 docker run -itd -p 8461:8080 -p 1337:1337 -p 7900:7900 --shm-size=\u0026#34;2g\u0026#34; --restart unless-stopped --name gpt4free hlohaus789/g4f:latest 访问地址：\nip:8461 ","date":"2024-04-02T15:07:04+08:00","permalink":"/p/2404002/","title":"gpt4free免费的aigc项目"},{"content":"更新软件包缓存\n1 apt update 安装软件\n1 apt install 名字 卸载软件\n1 apt remove 名字 更新软件包\n1 apt upgrade 卸载软件并删除与之关联的配置文件\n1 apt purge 名字 ","date":"2024-03-20T12:03:03+08:00","permalink":"/p/apt-command/","title":"apt常见命令"},{"content":"前言 最近在看动漫，但是好多站点要么没有，要么搜不到，有些搜索还有时间限制，或者从网盘转存，太繁琐了。所以想在自己的服务器新增一个看影视的功能，毕竟有时候找资源是真的痛苦。\n加上之前了解到GitHub上有一个在线采集影视的项目，正好今天上上手，自己动手部署，丰衣足食。\n项目介绍 项目框架为 Go+Vue。用到了 Redis和 Mysql，经过我的测试，docker启动运行需要差不多 500M 的内存，主要是MySQL占用内存较大，感觉可以优化为 postgresql 来大大降低内存占用。\n项目地址：https://github.com/ProudMuBai/GoFilm\n项目提供的教程需要自己构建docker镜像，并且构建的镜像需要特别大，对此我进行了优化，并讲 docker 镜像上传到了 docker仓库，所以你可以直接使用我构建的镜像而不用自己手动构建\n截至目前构建的最新版本为\n1 2 3 提交编号：67097207074deffb884c2ba88c935dc35efd46f0 日期：Feb 26, 2024 前置准备 安装好 docker，如果没有，请参考 docker安装。\n部署 方式一： xxxxxxxxxx # 前台运行./cms​# 后台运行nohup ./cms shell\n为了简单起见，采用 root 用户，如果不是，请自己注意权限问题，加上 sudo提权。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 进入 /opt/目录 cd /opt/ # 克隆项目 git clone https://github.com/muyiacc/GoFilm.git # 复制 GoFilm的 film目录到 /opt/ cp -r GoFilm/film ./ # 进入film cd film # 创建容器 docker compose up -d 方式二 使用项目作者提供的教程，请参考：film项目安装\n初始化 部署完成后还需进入管理端设置采集主站点\n浏览器输入 ip/manage，进入管理界面，默认用户和密码为 admin\n\u0026ldquo;HD(bf)\u0026rdquo;, Uri: https://bfzyapi.com/api.php/provide/vod/\n\u0026ldquo;HD(kk)\u0026rdquo;, Uri: https://kuaikan-api.com/api.php/provide/vod/from/kuaikan/\n\u0026ldquo;HD(fs)\u0026rdquo;, Uri: https://www.feisuzyapi.com/api.php/provide/vod/\n\u0026ldquo;HD(bfBk)\u0026rdquo;, Uri: http://by.bfzyapi.com/api.php/provide/vod/\n经测试，推荐使用的采集站\n删除容器 1 docker compose down ","date":"2024-03-11T00:03:15+08:00","permalink":"/p/2403011/","title":"开源多播放源采集在线影视GoFilm"},{"content":"备份数据库 使用 pg_dump 命令备份整个数据库：\n1 pg_dump -U username -d dbname \u0026gt; backup.sql username 是数据库用户的用户名。 dbname 是要备份的数据库的名称。 backup.sql 是备份文件的名称。 备份特定表：\n只备份特定的表，可以使用以下命令：\n1 pg_dump -U username -d dbname -t tablename \u0026gt; table_backup.sql tablename 是要备份的表的名称。 备份远程数据库：\n如果要备份远程数据库，可以使用以下命令：\n1 pg_dump -h hostname -U username -d dbname \u0026gt; backup.sql hostname 是数据库服务器的主机名或 IP 地址。 备份不包括所有者和权限信息：\n备份时不包括所有者和权限信息。使用以下命令：\n1 pg_dump -U username -d dbname -O -x \u0026gt; backup.sql -O 选项用于不包括所有者信息。 -x 选项用于不包括访问权限信息。 备份完成后，你会在当前目录下找到生成的备份文件。\n请注意，备份数据库时，确保数据库连接是安全的，并且备份文件存储在安全的位置。\n恢复数据库 恢复数据库：\n使用 psql 命令来还原数据库，命令如下：\n1 psql -U username -d dbname \u0026lt; backup.sql 这将从备份文件中还原数据库。\n","date":"2024-03-09T00:03:15+08:00","permalink":"/p/2403009/","title":"PostgreSQL备份，恢复数据库"},{"content":"查看ssl证书详细信息\n1 2 3 openssl x509 -in /path/to/public.crt -text -noout openssl ec -in /path/to/private.key -text -noout 比如快速查找包含的域名\n1 openssl x509 -in cert.pem -text -noout | grep seektao.cc ","date":"2024-03-08T00:03:35+08:00","permalink":"/p/2403008/","title":"openssl小小使用"},{"content":"Certbot 申请 SSL 证书 Certbot 是一个由 Electronic Frontier Foundation (EFF) 开发的免费、开源的工具，用于自动化在 Web 服务器上部署 SSL/TLS 证书。SSL/TLS 证书是用于加密网站与用户之间传输的数据，确保数据传输的安全性和隐私性。\nCertbot 支持大多数常见的 Web 服务器，包括 Apache、Nginx、IIS 等。\n安装 certbot 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # debian sudo apt update # 添加软件源 sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot # 安装certbot sudo apt install certbot # centos 没用，不太清楚，应该类似于debian sudo yum update 此处省略添加软件源，请自己记得添加。。。 sudo yum install certbot 这里注意：一定要添加软件源，安装最新版本的 certbot，否则后面提示安装 dns 插件有问题\n安装完成，查看版本 certbot --version，目前是 2.9.0\n官方使用 snap 安装的教程： https://certbot.eff.org/instructions?ws=nginx\u0026os=debianbuster\n申请域名证书 使用 certbot 来申请 Let\u0026rsquo;s Encrypt 免费 CA 的 SSL 证书\n官网教程 https://eff-certbot.readthedocs.io/en/latest/using.html#getting-certificates-and-choosing-plugins\n1 2 # 比如，实际我没用，我使用的是下面的dns插件来获取 certbot certonly --webroot -w /path/to/your/website -d yourdomain.com 使用 Web 根目录/path/to/your/website中的文件验证您拥有yourdomain.com的控制权，并为该域名获取 SSL 证书。\nDNS 获取 SSL 泛域名证书（推荐） DNS 获取证书的好处在于可以申请泛域名证书，也就是像 *.seektao.cc也就是一次申请，到处使用，方便至极。\ncertbot-dns-dnspod certbot-dns-dnspod 是 dnspod 的插件，默认的 certbot 是没有的，需要手动安装\nGithub 地址\nhttps://github.com/tengattack/certbot-dns-dnspod\n1 2 3 4 5 6 7 8 9 # pip sudo pip install git+https://github.com/tengattack/certbot-dns-dnspod.git # snap 本次没有采用 sudo snap install certbot-dns-dnspod sudo snap set certbot trust-plugin-with-root=ok sudo snap connect certbot:plugin certbot-dns-dnspod 安装完成之后新建一个 .ini 文件，比如 /etc/certbot/dnspod.ini\n1 2 sudo mkdir /etc/certbot sudo touch /etc/certbot/dnspod.ini 编辑 dnspod.ini，填入下面的内容，点此跳转到 dnspod api 申请页面，注意申请的是 dnspod token\n1 2 dns_dnspod_api_id = 12345 dns_dnspod_api_token = 1234567890abcdef1234567890abcdef 1 sudo chmod 600 /etc/certbot/dnspod.ini 申请，替换为自己的域名\n1 2 3 4 5 6 7 8 9 10 11 12 sudo certbot certonly -a dns-dnspod \\ --dns-dnspod-credentials /etc/certbot/dnspod.ini \\ -d seektao.cc \\ -d \u0026#34;*.seektao.cc\u0026#34; 接着就是: 输入邮箱， 是否同意注册acme（选Y）， 是否同意发送邮件。。。看自己吧 接着等待，等待。。就完成了 通过日志可以看到证书文件保存在 /etc/letsencrypt/live\n1 2 3 4 5 # 其中 [cert name]/privkey.pem：证书的私钥。 [cert name]/fullchain.pem：在大多数服务器软件中使用的证书文件。 [cert name]/chain.pem：在Nginx \u0026gt;=1.3.7 中用于 OCSP stapling。 [cert name]/cert.pem：会破坏许多服务器配置，不应在未进一步阅读文档的情况下使用。 我们用到 privkey.pem，fullchain.pem 即可。\n此节关于 dnspod 申请 ssl 证书就是如此。\n自动续期 自动续期添加一个定时任务即可\n1 2 3 4 5 # 设置定时任务 sudo crontab -e # 每月1号的午夜执行 certbot renew 命令来续订证书 0 0 1 * * /usr/local/bin/certbot renew 需要注意自己的 certbot 执行路径是否正确\nwhich certbot 可以看到 certbot 执行路径\n关于续期的更多文档可以观看\nhttps://eff-certbot.readthedocs.io/en/latest/using.html#setting-up-automated-renewal\nNginx 一键生成模板 需求 1 这个需求在于我使用 Nginx 作为反代服务器，每新增一个服务，就要手动去新增一个 nginx 文件，而且我主要使用的是二级域名加端口的模式，配合使用 泛域名证书来编写这个脚本就很方便了。\n现在想要实现输入 脚本文件 域名 端口 就会在 /etc/nginx/conf.d/下新增一个以域名开头的配置文件，例如：\n1 2 3 4 5 6 $ sudo ./generate_nginx_simple_template.sh test1.seektao.cc 5980 Do you want to reload Nginx configuration? (y/n) y Reloading Nginx configuration... $ ll /etc/nginx/conf.d/test1.conf -rw-r--r-- 1 root root 965 Mar 25 13:01 /etc/nginx/conf.d/test1.conf 模板的内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 $ cat /etc/nginx/conf.d/test1.conf server { listen 80; server_name test1.seektao.cc; return 301 $scheme://test1.seektao.cc$request_uri; } server { listen 443 ssl http2; server_name test1.seektao.cc; # SSL 证书配置 ssl_certificate /etc/letsencrypt/live/seektao.cc/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/seektao.cc/privkey.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:5980/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 日志配置 access_log /var/log/nginx/test1.seektao.cc.access.log; error_log /var/log/nginx/test1.seektao.cc.error.log; } 需求 1 脚本的配置 使用这个脚本请先申请泛域名证书，或者你自己再修改配置文件的证书位置。\nvim generate_nginx_simple_template.sh\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 #!/bin/bash # 检查参数数量 if [ \u0026#34;$#\u0026#34; -ne 2 ]; then echo \u0026#34;Usage: $0 \u0026lt;domain\u0026gt; \u0026lt;application_port\u0026gt;\u0026#34; exit 1 fi DOMAIN=$1 APPLICATION_PORT=$2 PORT_HTTP=80 PORT_HTTPS=443 CERT_DOMAIN=$(echo \u0026#34;$DOMAIN\u0026#34; | awk -F. \u0026#39;{print $(NF-1)\u0026#34;.\u0026#34;$NF}\u0026#39;) CONF_FILE_PREFIX=$(echo \u0026#34;$DOMAIN\u0026#34; | awk -F. \u0026#39;{print $1}\u0026#39;) CONF_FILE=\u0026#34;/etc/nginx/conf.d/${CONF_FILE_PREFIX}.conf\u0026#34; # 生成 Nginx 配置内容 cat \u0026lt;\u0026lt;EOF \u0026gt; $CONF_FILE server { listen $PORT_HTTP; server_name $DOMAIN; return 301 \\$scheme://$DOMAIN\\$request_uri; } server { listen $PORT_HTTPS ssl http2; server_name $DOMAIN; # SSL 证书配置 ssl_certificate /etc/letsencrypt/live/$CERT_DOMAIN/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/$CERT_DOMAIN/privkey.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:$APPLICATION_PORT/; proxy_set_header Host \\$host; proxy_set_header X-Real-IP \\$remote_addr; proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \\$scheme; } # 日志配置 access_log /var/log/nginx/$DOMAIN.access.log; error_log /var/log/nginx/$DOMAIN.error.log; } EOF # 检查临时文件是否成功创建 if [ ! -f \u0026#34;${CONF_FILE}\u0026#34; ]; then echo \u0026#34;Error: Failed to create temporary configuration file.\u0026#34; exit 1 fi # 提示用户是否需要修改配置文件 # read -p \u0026#34;Do you want to modify the configuration file before saving? (y/n) \u0026#34; choice # 根据用户选择执行相应操作 # case \u0026#34;$choice\u0026#34; in # y|Y ) # # 使用文本编辑器让用户修改配置文件 # echo \u0026#34;Editing configuration file...\u0026#34; # vim \u0026#34;${CONF_FILE}\u0026#34; # 或者使用你喜欢的其他文本编辑器，如 nano # ;; # n|N ) # # 直接将临时文件移动到目标位置 # echo \u0026#34;Saving configuration file without modification...\u0026#34; # mv \u0026#34;${CONF_FILE}\u0026#34; \u0026#34;${CONF_FILE}\u0026#34; # ;; # * ) # echo \u0026#34;Invalid choice. Exiting...\u0026#34; # exit 1 # ;; # esac # 检查 SSL 证书路径是否存在，如果不存在，提示用户手动申请 if [ ! -e \u0026#34;/etc/letsencrypt/live/$CERT_DOMAIN/fullchain.pem\u0026#34; ]; then echo \u0026#34;Warning: SSL certificate for $CERT_DOMAIN does not exist.\u0026#34; echo \u0026#34;Please use certbot or another tool to manually obtain a certificate for $CERT_DOMAIN.\u0026#34; fi # 提示用户是否需要重新加载 Nginx 配置 read -p \u0026#34;Do you want to reload Nginx configuration? (y/n) \u0026#34; reload_choice case \u0026#34;$reload_choice\u0026#34; in y|Y ) # 重新加载 Nginx 配置 echo \u0026#34;Reloading Nginx configuration...\u0026#34; sudo nginx -s reload ;; n|N ) echo \u0026#34;Nginx configuration will not be reloaded.\u0026#34; ;; * ) echo \u0026#34;Invalid choice. Exiting...\u0026#34; exit 1 ;; esac 需求 2 此内容为更新内容： 和需求 1 不同的是：生成的 nginx 配置文件为域名.conf而非 域名前缀.conf 这么做的目的是我在使用多个不同域名方便区分配置文件，特此更改。\n以下内容为正文：从需求 1 复制更改\n这个需求在于我使用 Nginx 作为反代服务器，每新增一个服务，就要手动去新增一个 nginx 文件，而且我主要使用的是二级域名加端口的模式，配合使用 泛域名证书来编写这个脚本就很方便了。\n现在想要实现输入 脚本文件 域名 端口 就会在 /etc/nginx/conf.d/下新增一个以全域名开头的配置文件，例如：\n1 2 3 4 5 6 $ sudo ./generate_nginx_simple_template.sh test1.seektao.cc 5980 Do you want to reload Nginx configuration? (y/n) y Reloading Nginx configuration... $ ll /etc/nginx/conf.d/test1.seektao.cc.conf -rw-r--r-- 1 root root 965 Mar 25 13:01 /etc/nginx/conf.d/test1.seektao.cc.conf 模板的内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 $ cat /etc/nginx/conf.d/test1.seektao.cc.conf server { listen 80; server_name test1.seektao.cc; return 301 $scheme://test1.seektao.cc$request_uri; } server { listen 443 ssl http2; server_name test1.seektao.cc; # SSL 证书配置 ssl_certificate /etc/letsencrypt/live/seektao.cc/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/seektao.cc/privkey.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:5980/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 日志配置 access_log /var/log/nginx/test1.seektao.cc.access.log; error_log /var/log/nginx/test1.seektao.cc.error.log; } 需求 2 脚本的配置 使用这个脚本请先申请泛域名证书，或者你自己再修改配置文件的证书位置。\nvim generate_nginx_simple_template1.sh\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 #!/bin/bash # 检查参数数量 if [ \u0026#34;$#\u0026#34; -ne 2 ]; then echo \u0026#34;Usage: $0 \u0026lt;domain\u0026gt; \u0026lt;application_port\u0026gt;\u0026#34; exit 1 fi DOMAIN=$1 APPLICATION_PORT=$2 PORT_HTTP=80 PORT_HTTPS=443 CERT_DOMAIN=$(echo \u0026#34;$DOMAIN\u0026#34; | awk -F. \u0026#39;{print $(NF-1)\u0026#34;.\u0026#34;$NF}\u0026#39;) CONF_FILE_PREFIX=$(echo \u0026#34;$DOMAIN\u0026#34;) CONF_FILE=\u0026#34;/etc/nginx/conf.d/${CONF_FILE_PREFIX}.conf\u0026#34; # 生成 Nginx 配置内容 cat \u0026lt;\u0026lt;EOF \u0026gt; $CONF_FILE server { listen $PORT_HTTP; server_name $DOMAIN; return 301 \\$scheme://$DOMAIN\\$request_uri; } server { listen $PORT_HTTPS ssl http2; server_name $DOMAIN; # SSL 证书配置 ssl_certificate /etc/letsencrypt/live/$CERT_DOMAIN/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/$CERT_DOMAIN/privkey.pem; # 安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 反向代理 location / { proxy_pass http://127.0.0.1:$APPLICATION_PORT/; proxy_set_header Host \\$host; proxy_set_header X-Real-IP \\$remote_addr; proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \\$scheme; } # 日志配置 access_log /var/log/nginx/$DOMAIN.access.log; error_log /var/log/nginx/$DOMAIN.error.log; } EOF # 检查临时文件是否成功创建 if [ ! -f \u0026#34;${CONF_FILE}\u0026#34; ]; then echo \u0026#34;Error: Failed to create temporary configuration file.\u0026#34; exit 1 fi # 提示用户是否需要修改配置文件 # read -p \u0026#34;Do you want to modify the configuration file before saving? (y/n) \u0026#34; choice # 根据用户选择执行相应操作 # case \u0026#34;$choice\u0026#34; in # y|Y ) # # 使用文本编辑器让用户修改配置文件 # echo \u0026#34;Editing configuration file...\u0026#34; # vim \u0026#34;${CONF_FILE}\u0026#34; # 或者使用你喜欢的其他文本编辑器，如 nano # ;; # n|N ) # # 直接将临时文件移动到目标位置 # echo \u0026#34;Saving configuration file without modification...\u0026#34; # mv \u0026#34;${CONF_FILE}\u0026#34; \u0026#34;${CONF_FILE}\u0026#34; # ;; # * ) # echo \u0026#34;Invalid choice. Exiting...\u0026#34; # exit 1 # ;; # esac # 检查 SSL 证书路径是否存在，如果不存在，提示用户手动申请 if [ ! -e \u0026#34;/etc/letsencrypt/live/$CERT_DOMAIN/fullchain.pem\u0026#34; ]; then echo \u0026#34;Warning: SSL certificate for $CERT_DOMAIN does not exist.\u0026#34; echo \u0026#34;Please use certbot or another tool to manually obtain a certificate for $CERT_DOMAIN.\u0026#34; fi # 提示用户是否需要重新加载 Nginx 配置 read -p \u0026#34;Do you want to reload Nginx configuration? (y/n) \u0026#34; reload_choice case \u0026#34;$reload_choice\u0026#34; in y|Y ) # 重新加载 Nginx 配置 echo \u0026#34;Reloading Nginx configuration...\u0026#34; sudo nginx -s reload ;; n|N ) echo \u0026#34;Nginx configuration will not be reloaded.\u0026#34; ;; * ) echo \u0026#34;Invalid choice. Exiting...\u0026#34; exit 1 ;; esac 后话 在编写这篇教程之前，我一直都是用的是 Nginx Proxy Manager （简称 NPM）图形化管理界面，觉得 Nginx 配置看不懂，太复杂，对 Nginx 也不太懂。\n教程的前一天，我想使用 Nginx Proxy Manager 为反代的服务添加 location 片段，却会导致添加了 location 的服务挂掉，不论是图形化添加还是修改配置文件，我还以为是我的配置姿势不对，添加的 location 内容有错，后面找了很久的资料，却没能找到解决办法，最后还是在 NPM 的 Github issues 很多人出现了这个问题，而且没有一个合适的解决方案，NPM 的 bug。唉，一不做，二不休，不如直接用 Nginx，还少去了 NPM 占据了一部分内存。\n安装 Nginx 的过程还是很愉快的。但是对于 ssl 证书我又了解甚少了，对此又花费了很多精力去了解 certbot，结果 apt 安装的 certbot 没有 dnspod 插件？？我一个大问号，又卸载了 apt 方式安装的 certbot，去安装 snap，通过 snap 安装 certbot，我发现 snap 也有问题？？但是找到了 snap 上 GitHub 上的 dnspod 插件，也支持 snap，然后又卸载 certbot，snap，重新通过 apt 安装 certbot，然后下载 dnspod，结果又在申请证书的时候出错了。原来我为了简便，dnspod.ini 用的是 NPM 之前的配置。后来改了就好了。\n现在只差反代了，上面的脚本也是为了我在 NPM 已经反代的服务而写的，毕竟一个一个复制然后改端口也挺麻烦的。\n全文完。\n","date":"2024-03-06T00:03:15+08:00","permalink":"/p/2403006/","title":"Certbot安装和申请免费Let's Encrypt证书，附一键生成脚本"},{"content":"nginx-proxy-manager 可以自动续期ssl证书，使用docker搭建也比较方便。\n今天我的网站出现证书过期，然后我去管理端手动续期也出现了失败，但是没有报具体的错误，接着升级了镜像，新开容器也没有解决。\n还好这个问题之前我也遇见过，可以通过重新申请域名ssl证书复现，让其给出真正的报错，结果和之前一样，缺乏 “zope”模块。\n错误大概如下：\n1 The \u0026#39;certbot_dns_dnspod.dns_dnspod\u0026#39; plugin errored while loading: No module named \u0026#39;zope\u0026#39;. You may need to remove or update this plugin. The Certbot log will contain the full error details and this should be reported to the plugin developer. 其中的 No module named \u0026lsquo;zope\u0026rsquo;，就是重点，解决办法就是进入容器，安装 zope\n1 2 3 4 sudo docker exec -it [容器的id] /bin/bash # 进入容器之后 pip install zope -i https://pypi.tuna.tsinghua.edu.cn/simple 等待安装完成，ctrl+p，ctrl+q 退出即可。\n接着再重新去手动续期下即可。\n","date":"2024-03-05T00:03:15+08:00","permalink":"/p/2403005/","title":"nginx-proxy-manager申请证书失败，提示缺乏zope模块"},{"content":"简介 简单、强大且灵活的工具，管理多个 Flutter SDK 版本。\n官网：https://fvm.app/\n安装 FVM Windows 自动安装 1 choco install fvm 如果没有安装 choco，需要手动安装 choco\n1 Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(\u0026#39;https://chocolatey.org/install.ps1\u0026#39;)) Windows 手动安装 下载 fvm：\n点击直接下载 fvm-3.2.1-windows-x64.zip 下载之后解压，并将解压的目录加入到 PATH环境变量\nLinux 自动安装 1 curl -fsSL https://fvm.app/install.sh | sudo bash 安装 flutter 准备工作 设置环境变量：\nFVM_CACHE_PATH：指定 Flutter 版本缓存路径（可选）\n1 D:\\develop\\fvm FVM_USE_GIT_CACHE：开启本地下载缓存（可选）\n1 true FVM_GIT_CACHE_PATH：开启本地下载缓存（可选）\n1 true FVM_FLUTTER_URL：指定镜像下载（可选）\n1 https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git 正式安装 查看 Flutter 可下载的版本\n1 fvm releases 安装 Flutter\n1 fvm install 3.24.5 如果提示：\n1 2 3 fatal: unable to access \u0026#39;https://github.com/flutter/flutter.git/\u0026#39;: Recv failure: Connection was reset Exception: Git clone failed 需要配置 flutter 的 git 镜像地址，请参考准备工作设置镜像地址\n1 https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git 如果设置了缓存地址在 D:\\develop\\fvm，flutter 安装完成后，会产生几个文件夹：\ncache.git：缓存文件夹 versions：下载 flutter 版本 设置 flutter 在上一步安装完成之后，使用管理员权限打开终端，设置全局 flutter，保证fvm flutter命令可用\n1 fvm global 3.24.5 设置这一步后，会在 D:\\develop\\fvm产生 default文件夹，指向设置的 flutter 版本\n启用 flutter\n使用 fvm flutter命令，会下载一些依赖\n1 2 3 4 5 6 7 8 9 10 11 PS C:\\Windows\\system32\u0026gt; fvm flutter Checking Dart SDK version... Downloading Dart SDK from Flutter engine ... Downloading the Dart SDK using the BITS service failed, retrying with WebRequest... Expanding downloaded archive with PowerShell... Building flutter tool... Running pub upgrade... Resolving dependencies... (48.6s) Downloading packages... (37.7s) Got dependencies. Manage your Flutter app development. 直到完成，fluttter 就可以使用了\n由于是使用 fvm 安装的 flutter，所以在使用 flutter 命令前，需要加上 fvm 命令作为前置命令。\nfvm 基本使用 查看本地已经安装的版本\n1 fvm list flutter doctor （必做） 为了更好的开发，使用 fvm flutter doctor 检查依赖和本地环境，跟着提示完成操作\n1 fvm flutter doctor 根据提示信息安装缺少的组件，大致如下所示：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 PS C:\\Windows\\system32\u0026gt; fvm flutter doctor Downloading Material fonts... 3.3s Downloading Gradle Wrapper... 272ms Downloading package sky_engine... 418ms Downloading package flutter_gpu... 356ms Downloading flutter_patched_sdk tools... 679ms Downloading flutter_patched_sdk_product tools... 518ms Downloading windows-x64 tools... 3.2s Downloading windows-x64/font-subset tools... 366ms Doctor summary (to see all details, run flutter doctor -v): [!] Flutter (Channel stable, 3.24.5, on Microsoft Windows [版本 10.0.19045.5965], locale zh-CN) ! Upstream repository https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git is not a standard remote. Set environment variable \u0026#34;FLUTTER_GIT_URL\u0026#34; to https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git to dismiss this error. [√] Windows Version (Installed version of Windows is version 10 or higher) [X] Android toolchain - develop for Android devices X Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/to/windows-android-setup for detailed instructions). If the Android SDK has been installed to a custom location, please use `flutter config --android-sdk` to update to that location. [√] Chrome - develop for the web [X] Visual Studio - develop Windows apps X Visual Studio not installed; this is necessary to develop Windows apps. Download at https://visualstudio.microsoft.com/downloads/. Please install the \u0026#34;Desktop development with C++\u0026#34; workload, including all of its default components [√] Android Studio (version 2024.3.2) [√] Connected device (3 available) [!] Network resources X A network error occurred while checking \u0026#34;https://maven.google.com/\u0026#34;: 信号灯超时时间已到 X An HTTP error occurred while checking \u0026#34;https://github.com/\u0026#34;: 信号灯超时时间已到 ! Doctor found issues in 4 categories. 需要做的有：\nFlutter：Flutter SDK Android toolchain - develop for Android devices：安装 Android 工具链，包括不限于 Android SDK，通过 Android Studio 可以安装 Android SDK Visual Studio - develop Windows apps：开发 Windows app Android Studio：开发工具，IDE 附录 对于 Flutter 具体版本的选择和配置可以按照参考这里：CSDN\n也可以参考我的另一篇文章：Flutter 安装配置\n","date":"2024-03-03T00:03:15+08:00","permalink":"/p/2403003/","title":"FVM，Flutter的多版本管理工具"},{"content":"情景一：主机连接容器 需求：主机内的某个应用需要用到容器启动的数据库，主机的应用关于该容器数据库的host，port该如何填写？\n情景二：容器连接容器 第一种：同一配置文件 第二种：不同配置文件 新建一个网络，把容器都加入到这个网络里\n1 docker network create my_network 容器1：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 version: \u0026#39;3.3\u0026#39; services: maccms10: image: esme518/docker-maccms10 container_name: maccms10 volumes: - ./data:/var/www/html ports: - 2419:80 networks: - my_network environment: - DB_HOST=mariadb - DB_PORT=3306 networks: my_network: external: true 容器2：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 version: \u0026#39;3.3\u0026#39; services: mariadb: image: mariadb:10.3 container_name: mariadb volumes: - ./mysql:/var/lib/mysql - ./backup:/backup environment: - MARIADB_ROOT_PASSWORD=12345678 ports: - 2420:3306 networks: - my_network networks: my_network: external: true 情景三：容器连接主机 1 2 3 4 5 6 7 8 9 10 11 12 version: \u0026#39;3.3\u0026#39; services: maccms10: image: esme518/docker-maccms10 container_name: maccms10 volumes: - ./data:/var/www/html ports: - 2419:80 environment: - DB_HOST=host.docker.internal # 使用特殊的DNS名称连接到主机上的数据库 - DB_PORT=3306 # 主机上数据库的端口 ","date":"2024-03-02T00:03:11+08:00","permalink":"/p/2403002/","title":"Docker容器和主机互相连接的三种情景"},{"content":"前言 之前一直使用压缩包的方式安装MySQL，后来发现新装系统要下载指定版本，版本不一定好找，安装过程的命令复用性不高，并不好用， 遂采用apt仓库安装。\n卸载 卸载系统自带，删除残留的文件\n1 2 3 4 5 dpkg -l | grep -E \u0026#39;(mysql|maria)\u0026#39; sudo apt remote --purge 软件包名字 sudo rm -rf /etc/mysql /var/lib/mysql 安装 mysql-apt-config 下载 mysql-apt-config 下载地址：https://dev.mysql.com/downloads/repo/apt/\n1 2 # 一键命令 wget https://repo.mysql.com//mysql-apt-config_0.8.32-1_all.deb 历史版本： wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb\n安装 mysql-apt-config 1 sudo apt install ./mysql-apt-config_0.8.32-1_all.deb 弹出配置界面，如果需要配置，回车进入，一般默认即可，所以直接键盘上下键选择ok，即可添加成功\n更新软件仓库 1 sudo apt update 安装MySQL 1 2 3 4 5 6 7 8 9 10 11 sudo apt install mysql-community-client-plugins sudo apt install mysql-community-client-core sudo apt install mysql-common sudo apt install mysql-community-client sudo apt install mysql-client sudo apt install mysql-community-server 最后弹出图形界面，设置密码即可\n","date":"2024-03-01T00:03:15+08:00","permalink":"/p/2403001/","title":"Debian使用APT安装，卸载MySQL"},{"content":"邮箱\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 chatgpt412@seektao.cc chatgpt920@seektao.cc chatgpt716@seektao.cc chatgpt2@seektao.cc chatgpt269@seektao.cc chatgpt428@seektao.cc chatgpt873@seektao.cc chatgpt771@seektao.cc chatgpt829@seektao.cc chatgpt259@seektao.cc 注册ChatGPT：https://chat.openai.com\n获取API key：https://platform.openai.com\nsess-QULZqoAkcxCtrGNkOT3MZNHWUmdENYIqOVYwUulz sess-3ZHvR7crqpBtrJj0D94cXdQxA6P2r24RipUtuNgm\n","date":"2023-12-14T14:07:10+08:00","permalink":"/p/2312014/","title":"批量注册chatgpt账号"},{"content":"概述 本地的一些环境如何部署到公网访问，本地在有公网 ip 的情况下实现\n准备工作 公网 ip ","date":"2023-12-13T14:07:10+08:00","permalink":"/p/2312013/","title":"使用Windows10搭建DDNS服务和HTTP服务"},{"content":"视频讲解：Bilibili/B站\n脚本名称：autoload.lua\n功能：实现 mpv 播放器 自动播放 下一个视频\n脚本地址：Github\n","date":"2023-12-12T14:07:10+08:00","permalink":"/p/2312012/","title":"MPV播放器入门指南-第二期：脚本：自动连播"},{"content":"概述 RuskDesk 是一个使用 rust 语言编写的开源的远程控制，支持自行搭建服务端\n官网地址：https://rustdesk.com\n准备 公网 IP 服务器 域名（可选） 路由器映射以下几个端口：\nhbbs: 21114 (TCP): 用于网页控制台，仅在 Pro 版本中可用。 21115 (TCP): 用于 NAT 类型测试。 21116 (TCP/UDP): 请注意 21116 应该同时为 TCP 和 UDP 启用。 21116/UDP 用于 ID 注册和心跳服务。21116/TCP 用于 TCP 打洞和连接服务。 21118 (TCP): 用于支持网页客户端。 hbbr: 21117 (TCP): 用于中继服务。 21119 (TCP): 用于支持网页客户端。 如果您不需要网页客户端支持，可以禁用相应的端口 21118、21119。\n服务端 Docker docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 networks: rustdesk-net: external: false services: hbbs: container_name: hbbs ports: - \u0026#34;21115:21115\u0026#34; - \u0026#34;21116:21116\u0026#34; # 自定义 hbbs 映射端口 - \u0026#34;21116:21116/udp\u0026#34; # 自定义 hbbs 映射端口 image: rustdesk/rustdesk-server command: hbbs volumes: - \u0026#34;./hbbs:/root\u0026#34; # 自定义挂载目录 networks: - rustdesk-net depends_on: - hbbr restart: unless-stopped hbbr: container_name: hbbr ports: - \u0026#34;21117:21117\u0026#34; # 自定义 hbbr 映射端口 image: rustdesk/rustdesk-server command: hbbr volumes: - \u0026#34;./hbbr:/root\u0026#34; # 自定义挂载目录 networks: - rustdesk-net restart: unless-stopped 官方\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 services: hbbs: container_name: hbbs image: rustdesk/rustdesk-server:latest command: hbbs volumes: - ./data:/root network_mode: \u0026#34;host\u0026#34; depends_on: - hbbr restart: unless-stopped hbbr: container_name: hbbr image: rustdesk/rustdesk-server:latest command: hbbr volumes: - ./data:/root network_mode: \u0026#34;host\u0026#34; restart: unless-stopped 第三方服务实现\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 networks: rustdesk_net: external: false services: rustdesk: image: lejianwen/rustdesk-server-s6:latest container_name: rustdesk-server-s6 ports: - 21114:21114 - 21115:21115 - 21116:21116 - 21116:21116/udp - 21117:21117 - 21118:21118 - 21119:21119 environment: - RELAY=反代21117的域名:端口 - ENCRYPTED_ONLY=1 - MUST_LOGIN=N - TZ=Asia/Shanghai - RUSTDESK_API_RUSTDESK_ID_SERVER=反代21116的域名:端口 - RUSTDESK_API_RUSTDESK_RELAY_SERVER=反代21117的域名:端口 - RUSTDESK_API_RUSTDESK_API_SERVER=反代21114的域名:端口 - RUSTDESK_API_RUSTDESK_WS_HOST=反代21114的域名:端口 - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub - RUSTDESK_API_JWT_KEY= - RUSTDESK_API_JWT_EXPIRE_DURATION= volumes: - ./rustdesk_data/server:/data - ./rustdesk_data/api:/app/data networks: - rustdesk_net restart: unless-stopped 反向代理：\n21118 端口：（前端：21114 地址/ws/id） ‍ 21119 端口 ： （前端：21114 地址/ws/relay ）\nwindows 下载两个工具：NSSM ，RuskDesk Server\n解压它们，放到各自的文件夹下，把 NSSM 加入到系统的环境变量，确保可随处执行\nxxxxxxxxxx nssm stop JupyterLabService​​nssm remove JupyterLabServicecmd\n1 2 nssm install \u0026#34;RustDesk hbbs service\u0026#34; \u0026#34;C:\\Program Files\\RustDesk Server\\hbbs.exe\u0026#34; -r 0.0.0.0 -k _ nssm install \u0026#34;RustDesk hbbr service\u0026#34; \u0026#34;C:\\Program Files\\RustDesk Server\\hbbr.exe\u0026#34; -k _ 比如我的如下\n1 nssm install \u0026#34;RustDesk hbbs service\u0026#34; \u0026#34;D:\\Program Files\\rustdesk-server-windows-x86_64\\hbbs.exe\u0026#34; -r 0.0.0.0 -k _ 执行完成之后应该在 服务 能够看到这个 启动服务\n1 nssm start \u0026#34;RustDesk hbbs service\u0026#34; 关闭服务\n1 nssm stop \u0026#34;RustDesk hbbs service\u0026#34; 客户端 下载客户端：点此下载\n安装到本地，安装过程不做介绍。\n打开软件，进入设置\n接着点击网络，解锁网络设置\n填如 id 服务器，和 Key。等等，我发现了个问题，web 端官方给出的文档是 21114 端口，好像无法访问，先打开打开 cmd，查看监听的端口，\n果然没有 21114 端口，然后我去 github 官方找 doc 了， 搜索 21114，有一个相关的回答，官方说 web 端被移除了，合着我白忙活了？？\n不过别慌，不就是没有 web 客户端嘛，先填写本机 ip 试试先，至于这个 key 嘛，如果你留意文件夹还记得是否还记得有个 .pub结尾的。熟悉证书的都有点灵感了，这个一般都是公钥，使用记事本打开复制到 key 中试试\n返回主页，看中间的底部，有个 就绪字样\n可以了？？为了确定到底是不是，然后我就把那个 id 服务器随便填了一个 ip，发现还真就不行了，多试了几次也还是这样，填回自己的就好了，为了给你们看看还是截图为证\n好了，关于这部分应该就是可以了，至于远程连接实际有没有问题，下次再测试测试，现在已经晚上 12：23 了。\n在后来我找解决 web 客户端的时候，我发现 rustdesk server 文件夹下有个RustDeskServer.Setup.exe 好家伙，这不就是 server 安装程序嘛，我还用 nssm 干嘛，点击下一步下一步就好了，后面测试了确实是可以的，不过有一步是弹出个程序框，需要点击启动。好了，现在真的 12：30 了。\n参考文档：\nhttps://post.smzdm.com/p/a94pmrd0/ https://github.com/lejianwen/rustdesk-api ","date":"2023-12-11T14:07:10+08:00","permalink":"/p/2312011/","title":"自己搭建远程控制RustDesk服务端"},{"content":"1. 概述 想在 Windows上搭建 Jupyter-lab服务，开启自启，有公网ip的同学还可以远程访问，实现远程办公。\n1 conda install jupyterlab 1 2 3 4 5 6 nssm install JupyterLabService \u0026#34;jupyter-lab\u0026#34; \u0026#34;--config=C:\\path\\to\\your\\jupyter_config.json\u0026#34; nssm install JupyterLabService \u0026#34;D:\\develop\\miniconda3\\Scripts\\jupyter-lab.exe\u0026#34; \u0026#34;--config=C:\\path\\to\\your\\jupyter_config.json\u0026#34; sc create JupyterLabService binPath= \u0026#34;\\\u0026#34;D:\\develop\\miniconda3\\Scripts\\jupyter-lab.exe\\\u0026#34; --config=C:\\path\\to\\your\\jupyter_config.json\u0026#34; start= auto 使用以下命令来启动这个服务：\n1 nssm start JupyterLabService 这将会启动 JupyterLab 服务，并让它使用你指定的 jupyter_server_config.json 配置文件。\n1 2 3 4 nssm stop JupyterLabService nssm remove JupyterLabService ","date":"2023-12-10T14:07:10+08:00","permalink":"/p/2312010/","title":"Windows搭建Jupyter-lab服务，加入系统服务，开机自启。指定端口和默认路径，开启远程访问，配合公网ip，可远程工作。(未完成)"},{"content":"工具下载 下载 Unlocker: https://github.com/DrDonk/unlocker/releases/download/v4.2.7/unlocker427.zip\n下载 VMware17: https://www.vmware.com/go/getworkstation-win\n下载 MacOS 13: https://archive.org/download/macos-collection/Public%20Betas/macOS%2013%20%28Ventura%29/Ventura%2013.0%20v18.0.03.iso\n建议使用 motix 下载，速度更快，有些可能需要用点上网手段才可以下载： Motrix: https://dl.motrix.app/release/Motrix-Setup-1.8.19.exe\nVM新建虚拟机选择MacOS，版本选择13即可\n1 2 3 4 5 6 7 8 9 10 11 12 smbios.reflectHost = \u0026#34;TRUE\u0026#34; hw.model = \u0026#34;MacBookPro14,3\u0026#34; board-id = \u0026#34;Mac-551B86E5744E2388\u0026#34; cpuid.0.eax = \u0026#34;0000:0000:0000:0000:0000:0000:0000:1011\u0026#34; cpuid.0.ebx = \u0026#34;0111:0101:0110:1110:0110:0101:0100:0111\u0026#34; cpuid.0.ecx = \u0026#34;0110:1100:0110:0101:0111:0100:0110:1110\u0026#34; cpuid.0.edx = \u0026#34;0100:1001:0110:0101:0110:1110:0110:1001\u0026#34; cpuid.1.eax = \u0026#34;0000:0000:0000:0001:0000:0110:0111:0001\u0026#34; cpuid.1.ebx = \u0026#34;0000:0010:0000:0001:0000:1000:0000:0000\u0026#34; cpuid.1.ecx = \u0026#34;1000:0010:1001:1000:0010:0010:0000:0011\u0026#34; cpuid.1.edx = \u0026#34;0000:0111:1000:1011:1111:1011:1111:1111\u0026#34; featureCompat.enable = \u0026#34;TRUE\u0026#34; 1 2 3 4 5 6 7 8 9 10 11 12 13 cpuid.0.eax = \u0026#34;0000:0000:0000:0000:0000:0000:0000:1011\u0026#34; cpuid.0.ebx = \u0026#34;0111:0101:0110:1110:0110:0101:0100:0111\u0026#34; cpuid.0.ecx = \u0026#34;0110:1100:0110:0101:0111:0100:0110:1110\u0026#34; cpuid.0.edx = \u0026#34;0100:1001:0110:0101:0110:1110:0110:1001\u0026#34; cpuid.1.eax = \u0026#34;0000:0000:0000:0001:0000:0110:0111:0001\u0026#34; cpuid.1.ebx = \u0026#34;0000:0010:0000:0001:0000:1000:0000:0000\u0026#34; cpuid.1.ecx = \u0026#34;1000:0010:1001:1000:0010:0010:0000:0011\u0026#34; cpuid.1.edx = \u0026#34;0000:0111:1000:1011:1111:1011:1111:1111\u0026#34; smbios.reflectHost = \u0026#34;TRUE\u0026#34; hw.model = \u0026#34;MacBookPro14,3\u0026#34; board-id = \u0026#34;Mac-551B86E5744E2388\u0026#34; keyboard.vusb.enable = \u0026#34;TRUE\u0026#34; mouse.vusb.enable = \u0026#34;TRUE\u0026#34; ","date":"2023-12-09T14:07:10+08:00","permalink":"/p/2312009/","title":"VMware17安装MacOS13（待）"},{"content":"在初次使用 Redis 时，以下是一些常见的需要修改的命令：\n修改绑定地址：\n1 bind 127.0.0.1 默认情况下，Redis 绑定在本地回环地址 127.0.0.1。如果您想让 Redis 可以从其他主机访问，可以将此地址修改为服务器的 IP 地址或 0.0.0.0，表示接受来自任何地址的连接。\n修改监听端口：\n1 port 6379 默认情况下，Redis 监听端口 6379。如果您需要使用其他端口，可以将此值修改为所需的端口号。\n配置密码：\n1 requirepass your_password 默认情况下，Redis 未设置密码。为了增加安全性，您可以设置密码以保护 Redis 服务器。将 your_password 替换为您自己的密码。\n设置持久化选项：\n1 save 60 1000 这是示例持久化选项的配置。Redis 允许您将数据持久化到磁盘，以便在重启后恢复数据。上述配置表示在 60 秒内，如果有至少 1000 个键被修改，则自动执行持久化操作。您可以根据需求调整这些值。\n配置最大内存限制：\n1 maxmemory 2GB 默认情况下，Redis 不设置最大内存限制。通过设置最大内存限制，您可以防止 Redis 在使用过多内存时导致服务器性能下降或崩溃。将 2GB 替换为您希望设置的内存限制值。\n这些是一些常见的需要修改的 Redis 配置命令，您可以根据自己的需求进行相应的修改。修改完成后，记得重新启动 Redis 服务器使更改生效。\n1 2 3 4 daemonize protected-mode bind requirepass ","date":"2023-12-08T14:07:10+08:00","permalink":"/p/2312008/","title":"Redis初始配置"},{"content":"概述 mpv 是一个免费的（在自由）媒体播放器的命令行。它支持多种媒体文件格式、音频和视频编解码器以及字幕类型。\n官网：https://mpv.io/\n源码：https://github.com/mpv-player/mpv\n下载地址：https://mpv.io/installation/\n文档：https://mpv.io/manual/stable/\n安装 Windows 官方提供的下载地址：\nhttps://github.com/zhongfly/mpv-winbuild/releases\n也可以使用下载的链接直接下载具体的指定版本\nmpv-x86_64-v3-20231210：点击开始下载。\n注意：下载之后，不要解压到 C 盘，放到其他盘符\n比如 D:\\player\\mpv\n双击 mpv.exe 即可运行 mpv 播放器。\n2025-12-06 10:04 更新： 如果上述的版本在 win11 上，首次打开文件会出现几乎 20s 的延迟，在 win10 上正常，不知道具体原因，详细情况可以查看这个 issues：https://github.com/mpv-player/mpv/issues/17096 具体解决办法：下载最新夜版构建版本：点击我直接下载 mpv-x86_64-pc-windows-msvc\n配置 关联格式 进入解压目录下的 installer 文件夹，有个 mpv-install.bat脚本，管理员权限运行它，等待完成，按任意键退出。\n配置文件夹 配置文件夹用于自定义配置，安装插件\n进入解压的目录，新建 portable_config文件夹\n进入 portable_config\n新建文件：\nmpv.conf：mpv 配置文件 input.conf：存放自定义的快捷键配置 新建文件夹：\nscripts：存放第三方脚本 script-opts：存放第三方脚本配置 脚本 所有脚本都遵循上述规范的配置\n缩略图 项目地址：https://github.com/po5/thumbfast\n下载项目下的 thumbfast.lua，osc.lua\n下载之后把 thumbfast.lua 放入 mpv目录/portable_config/，也就是 mpv.conf 同目录。\nosc.lua 放入 mpv目录/portable_config/scripts。\n在 input.conf 加入一行\n1 a load-script \u0026#34;~~home/thumbfast.lua\u0026#34;;show-text \u0026#34;载入略缩图脚本\u0026#34; 重启 mpv，即可生效\n手动启用， 按 a即可加载缩略图。\n如果需要默认加载，把 thumbfast.lua 放入 scripts 中即可\n文件浏览器 功能：在 mpv 中浏览和打开文件和文件夹。\n该脚本在 mpv API 之外不使用任何东西，因此在所有平台上都应该是相同的。浏览器可以上下移动目录，开始播放文件和文件夹，或者将它们添加到队列中。\n项目地址：https://github.com/CogentRedTester/mpv-file-browser\n快捷键：\nCtrl+o 打开脚本，进入选择 键盘上下键 选择列表 enter 选中播放 键盘左右键 切换文件夹 ECS 关闭列表 脚本配置：\nmpv目录/portable_config/script-opts/file_browser.conf\n1 2 # 注意使用英文 , 隔开 root=~/Videos,~/Music,~/Pictures,~/,C:/,D:/,E:/ 最近播放列表 功能：查看最近播放的列表\n项目地址：https://github.com/hacel/recent\n快捷键：\n`：打开最近播放 脚本配置：\nmpv目录\\portable_config\\script-opts\\recent.conf\nauto_run_idle=no：关闭 mpv 打开时显示最近播放，默认为 yes\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 auto_save=yes save_bind= auto_save_skip_past= auto_run_idle=no\t# 关闭mpv打开时显示最近播放，默认为yes write_watch_later=yes display_bind=` mouse_controls=yes log_path=history.log date_format=%d/%m/%y %X show_paths=no split_paths=yes font_scale=50 border_size=0.7 hi_color=H46CFFF ellipsis=no 杜比视界 杜比视界 DV HDR 常见的播放器都不支持，mpv 只需要在 mpv.conf 中添加两行代码即可让颜色正常化\n1 2 vo=gpu-next # 杜比视界颜色正常化 gpu-context=win # 杜比视界颜色正常化 mpv.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ##### 视频输出 ##### ## 设置视频输出驱动为 gpu-next，通常用于更好的视频渲染和支持杜比视界等高级视频特性。 vo=gpu-next # 杜比视界颜色正常化 ## 指定 GPU 上下文为 Windows，确保在 Windows 平台上使用正确的图形上下文，以实现颜色正常化。 # gpu-context=win # 杜比视界颜色正常化 ##### 音量 ##### # 默认音量 volume=80 ##### 窗口配置 ##### ## 如果启用则视频不会超过屏幕大小。 autofit-larger=100%x100% ## 如果启用则默认启动时最大化窗口。 # window-maximized=yes ## 设置窗口缩放比例为 1，表示窗口大小为默认大小。 window-scale=2 # 设置窗口的初始大小为 1500x1200 像素。 #--geometry=1500x1200 ## 如果启用则 MPV 启动时会全屏。 # fullscreen=yes ##### 其他 ##### ## 退出自动保存进度 save-position-on-quit=yes # 保存音量 volume-save=yes 快捷键 皆为内置快捷键\n1 2 3 4 5 6 7 8 9 f\t全屏 j J\t循环当前的字幕 [ ] 将当前播放速度减小/增加10% backspace\t将速度重置为正常 m\t静音，再按取消静音 9 0\t调小音量/调大音量 space p\t暂停，再按取消暂停 q\t停止播放并退出 Q\t停止播放并退出，如果重新播放，尽可能恢复播放的文件的播放位置 关于快捷键可查看 附录-快捷键\n附录 快捷键 图示：\n英文版\n中文版：\n快捷键 中文 英文 LEFT and RIGHT 向后/向前跳转 5 秒。Shift+箭头进行 1 秒精确跳转（见\u0026ndash;hr-seek）。 Seek backward/forward 5 seconds. Shift+arrow does a 1 second exact seek (see \u0026ndash;hr-seek). UP and DOWN 向前/向后跳转 1 分钟。Shift+箭头进行 5 秒精确跳转（见\u0026ndash;hr-seek）。 Seek forward/backward 1 minute. Shift+arrow does a 5 second exact seek (see \u0026ndash;hr-seek). Ctrl+LEFT and Ctrl+RIGHT 跳转到上一个/下一个字幕。受一些限制，可能并不总是有效；参见 sub-seek 命令。 Seek to the previous/next subtitle. Subject to some restrictions and might not always work; see sub-seek command. Ctrl+Shift+LEFT and Ctrl+Shift+RIGHT 调整字幕延迟，以便下一个或上一个字幕立即显示。这对于将字幕与音频同步特别有用。 Adjust subtitle delay so that the next or previous subtitle is displayed now. This is especially useful to sync subtitles to audio. [ and ] 将当前播放速度减小/增加 10%。 Decrease/increase current playback speed by 10%. { and } 当前播放速度减半/加倍。 Halve/double current playback speed. BACKSPACE 将播放速度重置为正常。 Reset playback speed to normal. Shift+BACKSPACE 撤销上次跳转。仅当播放列表条目未更改时有效。再次按下将返回到原始位置。有关详细信息，请参阅 revert-seek 命令。 Undo the last seek. This works only if the playlist entry was not changed. Hitting it a second time will go back to the original position. See revert-seek command for details. Shift+Ctrl+BACKSPACE 标记当前位置。然后 Shift+BACKSPACE 将使用该标记位置作为还原位置（一旦您跳回，标记将被重置）。您可以使用此功能在文件中进行跳转，然后返回到您离开的确切位置。 Mark the current position. This will then be used by Shift+BACKSPACE as revert position (once you seek back, the marker will be reset). You can use this to seek around in the file and then return to the exact position where you left off. \u0026lt; and \u0026gt; 在播放列表中向后/向前。 Go backward/forward in the playlist. ENTER 在播放列表中向前。 Go forward in the playlist. p and SPACE 暂停（再次按下取消暂停）。 Pause (pressing again unpauses). . 向前一步。按一次将暂停，每连续按下一次将播放一帧，然后再次进入暂停模式。 Step forward. Pressing once will pause, every consecutive press will play one frame and then go into pause mode again. , 向后一步。按一次将暂停，每连续按下一次将倒放一帧，然后再次进入暂停模式。 Step backward. Pressing once will pause, every consecutive press will play one frame in reverse and then go into pause mode again. q 停止播放并退出。 Stop playing and quit. Q 类似于 q，但存储当前播放位置。如果可能的话，稍后再次播放相同的文件将在旧的播放位置继续播放。请参阅 RESUMING PLAYBACK。 Like q, but store the current playback position. Playing the same file later will resume at the old playback position if possible. See RESUMING PLAYBACK. / and * 减小/增大音量。 Decrease/increase volume. 9 and 0 减小/增大音量。 Decrease/increase volume. m 静音。 Mute sound. _ 循环浏览可用的视频轨道。 Cycle through the available video tracks. # 循环浏览可用的音频轨道。 Cycle through the available audio tracks. E 循环浏览可用的版本。 Cycle through the available Editions. f 切换全屏（另请参阅\u0026ndash;fs）。 Toggle fullscreen (see also \u0026ndash;fs). ESC 退出全屏模式。 Exit fullscreen mode. T 切换置顶（另请参阅\u0026ndash;ontop）。 Toggle stay-on-top (see also \u0026ndash;ontop). w and W 减小/增大平移和扫描范围。当前 e 键目前执行相同操作，但不建议使用。 Decrease/increase pan-and-scan range. The e key does the same as W currently, but use is discouraged. o and P 在 OSD 上显示进度条、已用时间和总持续时间。 Show progression bar, elapsed time and total duration on the OSD. O 在 OSD 状态之间切换正常和播放时间/持续时间。 Toggle OSD states between normal and playback time/duration. v 切换字幕可见性。 Toggle subtitle visibility. j and J 循环浏览可用的字幕。 Cycle through the available subtitles. z and Z 通过+/- 0.1 秒调整字幕延迟。当前 x 键执行相同操作，但不建议使用。 Adjust subtitle delay by +/- 0.1 seconds. The x key does the same as Z currently, but use is discouraged. l 设置/清除 A-B 循环点。有关详细信息，请参阅 ab-loop 命令。 Set/clear A-B loop points. See ab-loop command for details. L 切换无限循环。 Toggle infinite looping. Ctrl++ and Ctrl+- 通过+/- 0.1 秒调整音频延迟（A/V 同步）。 Adjust audio delay (A/V sync) by +/- 0.1 seconds. Shift+g and Shift+f 通过+/- 10%调整字幕字体大小。 Adjust subtitle font size by +/- 10%. u 在 SSA/ASS 字幕中切换仅应用\u0026ndash;sub-ass-*覆盖（默认）和几乎完全覆盖它们的常规字幕样式。有关更多信息，请参阅\u0026ndash;sub-ass-override。 Switch between applying only \u0026ndash;sub-ass-* overrides (default) to SSA/ASS subtitles, and overriding them almost completely with the normal subtitle style. See \u0026ndash;sub-ass-override for more info. V 切换字幕 VSFilter 纵横比兼容模式。有关更多信息，请参阅\u0026ndash;sub-ass-vsfilter-aspect-compat。 Toggle subtitle VSFilter aspect compatibility mode. See \u0026ndash;sub-ass-vsfilter-aspect-compat for more info. r and R 上/下移动字幕。当前 t 键执行相同操作，但不建议使用。 Move subtitles up/down. The t key does the same as R currently, but use is discouraged. s 拍摄截图。 Take a screenshot. S 拍摄截图，不带字幕。（这取决于 VO 驱动程序支持与否。） Take a screenshot, without subtitles. (Whether this works depends on VO driver support.) Ctrl+s 拍摄截图，如窗口显示（带字幕、OSD 和缩放视频）。 Take a screenshot, as the window shows it (with subtitles, OSD, and scaled video). PGUP and PGDWN 跳转到上一个/下一个章节的开始。在大多数情况下，“上一个”实际上将会到达当前章节的开始；请参阅\u0026ndash;chapter-seek-threshold。 Seek to the beginning of the previous/next chapter. In most cases, \u0026ldquo;previous\u0026rdquo; will actually go to the beginning of the current chapter; see \u0026ndash;chapter-seek-threshold. Shift+PGUP and Shift+PGDWN 向后或向前跳转 10 分钟。（这曾经映射到不带 Shift 的 PGUP/PGDWN。） Seek backward or forward by 10 minutes. (This used to be mapped to PGUP/PGDWN without Shift.) d 激活/停用去隔行。 Activate/deactivate deinterlacer. A 循环切换宽高比覆盖。 Cycle aspect ratio override. Ctrl+h 切换硬件视频解码开/关。 Toggle hardware video decoding on/off. Alt+LEFT, Alt+RIGHT, Alt+UP, Alt+DOWN 移动视频矩形（平移）。 Move the video rectangle (panning). Alt++ and Alt+- 将 Alt 与+或-键组合可更改视频缩放。 Combining Alt with the + or - keys changes video zoom. Alt+BACKSPACE 重置平移/缩放设置。 Reset the pan/zoom settings. F8 显示播放列表和其中的当前位置（仅在使用 UI 窗口时有用，在终端上损坏）。 Show the playlist and the current position in it (useful only if a UI window is used, broken on the terminal). F9 显示音频和字幕流列表（仅在使用 UI 窗口时有用，在终端上损坏）。 Show the list of audio and subtitle streams (useful only if a UI window is used, broken on the terminal). i and I 显示/切换显示有关当前播放文件的统计信息的叠加层，例如编解码器、帧速率、丢帧数等。有关更多信息，请参阅 STATS。 Show/toggle an overlay displaying statistics about the currently playing file such as codec, framerate, number of dropped frames and so on. See STATS for more information. DEL 在 OSC 之间循环显示可见性：从不/自动（鼠标移动）/始终 Cycle OSC visibility between never / auto (mouse-move) / always ` 显示控制台。（ESC 关闭它。有关 CONSOLE 的详细信息，请参阅 CONSOLE。） Show the console. (ESC closes it again. See CONSOLE.) 1 and 2 调整对比度。 Adjust contrast. 3 and 4 调整亮度。 Adjust brightness. 5 and 6 调整伽马值。 Adjust gamma. 7 and 8 调整饱和度。 Adjust saturation. Alt+0 (and Command+0 on macOS) 将视频窗口调整为原始大小的一半。 Resize video window to half its original size. Alt+1 (and Command+1 on macOS) 将视频窗口调整为其原始大小。 Resize video window to its original size. Alt+2 (and Command+2 on macOS) 将视频窗口调整为其原始大小的两倍。 Resize video window to double its original size. Command + f (macOS only) 切换全屏（另请参阅\u0026ndash;fs）。 Toggle fullscreen (see also \u0026ndash;fs). PAUSE 暂停。 Pause. STOP 停止播放并退出。 Stop playing and quit. PREVIOUS and NEXT 向后/向前跳转 1 分钟。 Seek backward/forward 1 minute. ZOOMIN and ZOOMOUT 更改视频缩放。 Changes video zoom. ","date":"2023-12-07T14:07:10+08:00","permalink":"/p/2312007/","title":"MPV播放器入门指南-第一期：带你走进命令行播放器的世界"},{"content":"Windows下默认安装的环境在 家目录\\.conda\\envs我想把它换到安装目录去\n先备份环境信息，进入激活的环境\n1 conda env export \u0026gt; environment.yaml 修改 environment.yaml\n1 prefix: D:\\develop\\miniconda3\\envs\\common 恢复\n1 conda env create -f environment.yaml 一劳永逸： 新建 家目录\\.condarc 把 安装目录下的 envs 加入进去 ，并放在前面\n1 2 3 4 envs_dirs: - D:\\develop\\miniconda3\\envs - C:\\Users\\taoone\\.conda\\envs - C:\\Users\\taoone\\AppData\\Local\\conda\\conda\\envs 使用 conda info 查看\n","date":"2023-12-06T14:07:10+08:00","permalink":"/p/2312006/","title":"Minconda迁移已经存在的环境"},{"content":"简介 请查看官网：https://flutter.dev/\n安装 提示 推荐 FVM 版本管理工具安装 Flutter\nFVM，Flutter 的多版本管理工具](https://blog.seektao.cc/p/2403003)\n要下载 Windows x64 版本的 Flutter SDK，你需要将原始 URL：\n1 https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/flutter_windows_3.38.5-stable.zip 改为镜像 URL：\n1 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.38.5-stable.zip 注意：并非所有镜像都支持直接从 URL 下载。\nLinux：\n官方教程：https://docs.flutter.cn/get-started/install/linux\n安装其他平台的依赖 Android Studio 在安装 flutter 以后，为了开发安卓程序，还需要安装 Android Studio，安装步骤跟着 Android Studio 界面操作即可\n打开后进入设置，找到Languages \u0026amp; Frameworks，配置如下内容：\n找到 SDK Platforms，下载 Android SDK 如 16.0 15.0 等等 找到 SDK Tools，下载 cmdline-tools： 勾选如下内容后确定 Android SDK Command-line Tools(latest) Visual Studio 在安装 flutter 以后，为了开发 Windows 桌面程序，还需要安装 Visual Studio，安装步骤跟着 Visual Studio 界面操作即可\n下载地址：https://visualstudio.microsoft.com/downloads/\n选择：使用 C++桌面开发\n如果你 C 盘紧张，进入安装位置修改为其他盘\n配置 查看 Flutter 配置情况\n1 2 flutter doctor -v # 简略显示：flutter doctor - 配置 android-sdk\n1 flutter config --android-sdk=\u0026#34;D:\\develop\\Android\\Sdk\u0026#34; 配置 jdk-dir\n1 flutter config --jdk-dir=\u0026#34;D:\\develop\\Java\\jdk-17\u0026#34; 全绿即是 ok，如图：\n配置镜像源 清华源 帮助文档：https://mirror.tuna.tsinghua.edu.cn/help/flutter/\n长期使用 TUNA 镜像：\n1 2 echo \u0026#39;export FLUTTER_STORAGE_BASE_URL=\u0026#34;https://mirrors.tuna.tsinghua.edu.cn/flutter\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;export PUB_HOSTED_URL=\u0026#34;https://mirrors.tuna.tsinghua.edu.cn/dart-pub\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc 在编译 android 项目时，flutter 还会从 https://storage.googleapis.com/download.flutter.io 下载 Java 程序库，您可以在 Android 项目目录下的 build.gradle 中添加下面一行下载源，从而使用 TUNA 镜像。\n1 2 3 4 5 6 7 allprojects { repositories { google() jcenter() maven { url \u0026#39;https://mirrors.tuna.tsinghua.edu.cn/flutter/download.flutter.io\u0026#39; } } } Flutter SDK 的更新会从 Github 获取，如您的开发设备访问 Github 速度慢，可以在 开发设备的 Flutter SDK 目录 运行下面的命令，将 Git 上游设置为 TUNA 镜像：\n1 git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git ","date":"2023-12-05T14:07:10+08:00","permalink":"/p/2312005/","title":"Flutter安装配置"},{"content":"在Debian系统上清理无用的软件包和残留文件，您可以执行以下步骤：\n清理无用的软件包：使用apt包管理器清理无用的软件包。运行以下命令以更新软件包列表并删除不再需要的软件包：\n1 2 sudo apt update sudo apt autoremove apt autoremove命令将自动删除已经不再需要的软件包及其依赖项。\n清理残留的配置文件：有时，卸载软件包后会保留一些残留的配置文件。您可以使用以下命令清理这些文件：\n1 sudo dpkg --purge $(dpkg -l | grep \u0026#39;^rc\u0026#39; | awk \u0026#39;{print $2}\u0026#39;) 这将删除所有已经标记为\u0026quot;rc\u0026quot;（已删除但仍保留配置文件）的软件包。\n清理临时文件和缓存：您可以使用以下命令清理系统中的临时文件和包管理器缓存：\n1 2 sudo apt clean sudo apt autoclean apt clean命令将清理已下载的软件包文件，而apt autoclean命令将清理过期的软件包缓存。\n通过执行上述步骤，您可以清理Debian系统中的无用软件包和残留文件，从而释放磁盘空间并保持系统整洁。请注意，在执行命令之前，确保您具有足够的权限以使用sudo来执行它们。\n","date":"2023-12-03T14:07:10+08:00","permalink":"/p/2312003/","title":"Debian清理无用的软件包和残留文件"},{"content":"最小化安装 如果安装图形化，可能是 NetworkManager，这部分不适用\n查看网络接口的名字\n1 ip a 编辑配置文件\n1 sudo vim /etc/network/interfaces 静态 ip\n1 2 3 4 5 6 auto ens33 iface ens33 inet static address 192.168.10.12 netmask 255.255.255.0 gateway 192.168.10.2 dns-nameservers 8.8.8.8 8.8.4.4 auto ens33：开机自动启动接口 动态 ip\n1 2 auto enp0s3 iface enp0s3 inet dhcp 重启网络服务\n1 sudo systemctl restart networking 开启 ipv6 先检查系统是否支持 IPv6：\n1 lsmod | grep ipv6 如果没输出，可以手动加载 IPv6 模块：\n1 sudo modprobe ipv6 让它在开机自动加载：\n1 echo \u0026#34;ipv6\u0026#34; | sudo tee -a /etc/modules 查看是否有禁用 IPv6 的设置：\n1 grep disable_ipv6 /etc/sysctl.conf /etc/sysctl.d/* 2\u0026gt;/dev/null 如果有类似：\n1 net.ipv6.conf.all.disable_ipv6 = 1 请修改为：\n1 2 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 然后应用：\n1 sudo sysctl -p 编辑网络配置文件： Debian 最小系统通常使用 ifupdown（非 NetworkManager）。\n编辑网络配置文件：\n1 sudo nano /etc/network/interfaces 根据你的网络情况添加 IPv6 配置。\nDHCPv6 自动获取（最常见）\n1 2 3 4 auto eth0 iface eth0 inet dhcp iface eth0 inet6 auto 或者：\n1 iface eth0 inet6 dhcp （不同环境二选一，auto 会从路由器获取前缀，dhcp 会向 DHCPv6 请求。）\n静态 IPv6 配置示例\n如果你有固定 IPv6：\n1 2 3 4 5 6 7 8 9 10 auto eth0 iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 iface eth0 inet6 static address 2404:6800:4003:c02::1234 netmask 64 gateway 2404:6800:4003:c02::1 重启网络服务\n1 sudo systemctl restart networking 或者直接：\n1 sudo ifdown eth0 \u0026amp;\u0026amp; sudo ifup eth0 ","date":"2023-12-02T14:07:10+08:00","permalink":"/p/2312002/","title":"Debian12设置静态ip"},{"content":"打开 Firefox ，在地址栏搜索 about:config\n1 about:config 同意风险。\n搜索 layout.css.devPixelsPerPx\n1 layout.css.devPixelsPerPx 修改值，默认值为 -1，代表不修改。\n我们可以先改为 1，观看效果，如果过大，改为 0.9，依次类推，根据自己情况修改为合适的\n额外的，如果图标和字体过小，就把值 调大一点，直到合适自己\n","date":"2023-11-20T14:07:10+08:00","permalink":"/p/2311020/","title":"解决Firefox在高分辨率显示器下图标和字体显示过大"},{"content":"curl test.ipw.cn\n","date":"2023-11-19T14:07:10+08:00","permalink":"/p/2311019/","title":"测试是否可以连接ipv6"},{"content":" 正则表达式 描述 a|b 匹配 a 或 b gr(a|e)y 匹配 gray 或 grey . 匹配任一字符 [abc] 匹配任一字符: a 或 b 或 c [^abc] 匹配任一字符, 但不包括 a, b, c [a-z] 匹配从 a 到 z 之间的任一字符 [a-zA-Z] 匹配从 a 到 z, 及从 A 到 Z 之间的任一字符 ^ 匹配文件名的头部 $ 匹配文件名的尾部 ( ) 匹配标记的子表达式 \\n 匹配第 nth 个标记的子表达式, nth 代表 1 到 9 \\b 匹配字词边界 * 匹配前一项内容 0 或多次 ? 匹配前一项内容 0 或 1 次 + 匹配前一项内容 1 或多次 *? 匹配前一项内容 0 或多次 (懒人模式) +? 匹配前一项内容 1 或多次 (懒人模式) {x} 匹配前一项内容 x 次 {x,} 匹配前一项内容 x 或多次 {x,y} 匹配前一项内容次数介于 x 和 y 之间 \\ 特殊转义字符 ","date":"2023-11-18T14:07:10+08:00","permalink":"/p/2311018/","title":"正则表示式语法"},{"content":"打开 C:\\ProgramData\\Microsoft\\Windows Defender\\Scans\\History，然后删除里面的一个叫 “Service” 的文件夹。\n","date":"2023-11-17T14:07:10+08:00","permalink":"/p/2311017/","title":"删除windows的defender误报"},{"content":"关于对2020年诺贝尔物理学奖的一些思考 **时间：**2020年10月9日，星期日\n**原由：**今天刷短视频刷到了量子物理学，想起最近的物理学奖和前几天老师发了个朋友圈说诺奖日，大多数博主都在讲量子纠缠的问题，还调侃爱因斯坦是真的错了。针对量子纠缠内容和人们的一些评论，我的一些思考想法。\n==诺贝尔物理学奖的具体情况为:==\nNobel Prize in Physics The 2022 physics laureates The Nobel Prize in Physics 2022 was awarded to Alain Aspect, John F. Clauser and Anton Zeilinger “for experiments with entangled photons, establishing the violation of Bell inequalities and pioneering quantum information science”.\nTheir results have cleared the way for new technology based upon quantum information.\nNobel Prize in Physics The 2022 physics laureates The Nobel Prize in Physics 2022 was awarded to Alain Aspect, John F. Clauser and Anton Zeilinger “for experiments with entangled photons, establishing the violation of Bell inequalities and pioneering quantum information science”.\nTheir results have cleared the way for new technology based upon quantum information.\n以下为机器翻译：\n2022年诺贝尔物理学奖 纠缠如何成为一种强大的工具 通过开创性的实验，阿兰·韦西、约翰·克劳塞和安东·蔡林格已经证明了研究和控制处于纠缠状态的粒子的潜力。纠缠对中的一个粒子发生的情况决定了另一个粒子的发生，即使它们之间的距离真的太远而无法相互影响。获奖者对实验工具的开发为量子技术的新时代奠定了基础。\n诺贝尔物理学奖 2022年物理学奖得主 2022年诺贝尔物理学奖授予阿兰·韦西，约翰·克劳塞和安东·蔡林格“对纠缠光子的实验，确定了对贝尔不等式的违反和量子信息科学的开创”。\n他们的研究结果为基于量子信息的新技术扫清了道路。\n以上来自诺贝尔奖官网：NobelPrize.org\n==总结就是：Alain Aspect, John F. Clauser and Anton Zeilinger 等三人对量子纠缠的实验，验证了量子不遵循贝尔不等式，和开创了量子信息科学的开创==\n接着，我去查询了什么是贝尔不等式，以下为维基百科对贝尔不等式的解释：（已机翻）\n在理论物理学里，贝尔定理（Bell\u0026rsquo;s theorem）表明：\n​\t任何关于定域隐变数的物理理论无法克隆量子力学的每一个预测。\n贝尔定理是一种不可行定理，又知名为贝尔不等式。这定理在物理学和科学哲学里异常重要，因为这定理意味着量子物理必需违背定域性原理或反事实确定性[1] [2]。发表于1964年，贝尔定理是因北爱尔兰物理学家约翰·贝尔而命名。\n贝尔定理的实验验证所得到的结果，符合量子力学理论的预测，并且显示某些量子效应似乎能够以超光速行进。由于这验证结果，所有归类为隐变数理论、经得起考验的量子理论都只能限制为非定域种类。2015年，台夫特理工大学的罗纳德·汉森等人在《自然》的封面文章表示，成功关闭所有漏洞，目前量子理论比定域性隐变量理论更准确地描述量子纠缠现象。[3]\n","date":"2023-11-16T14:07:10+08:00","permalink":"/p/2311016/","title":"关于2022年诺贝尔物理学奖的一些思考"},{"content":"win+s 搜索cmd，使用管理员打开，依此执行以下的命令\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 这一步耐心等待 for %i in (%windir%\\system32\\*.dll) do regsvr32.exe /s %i for %i in (%windir%\\system32\\*.ocx) do regsvr32.exe /s %i 执行完毕后重启设备，继续执行下方命令： Dism /Online /Cleanup-Image /ScanHealth Dism /Online /Cleanup-Image /CheckHealth 这一步可能会卡住62.3%，等待太久就关掉它，重新执行，直到成功 DISM /Online /Cleanup-image /RestoreHealth 前面没有问题，到这一步结束后会显示修复成功的信息，执行完重启 sfc /SCANNOW ","date":"2023-11-15T14:07:10+08:00","permalink":"/p/2311015/","title":"修复Windows的Defender脱机版扫描点击无反应"},{"content":"快捷方式 ZoomIt 提供了许多快捷方式，可以大大扩展其用法。\n函数 快捷键 缩放模式 Ctrl + 1 放大 鼠标向上或向上滚动箭头 缩小 鼠标向下滚动或向下键 在缩放模式下启动绘图 () Left-Click 在缩放模式下停止绘图 () Right-Click 在缩放模式下不处于缩放) 模式时开始绘制 ( Ctrl + 2 (绘图模式) 增加/减少线条和光标大小 Ctrl + 鼠标向上/向下或箭头键 将光标居中 (绘图模式) 空格键 白板 (绘图模式) W 黑板 (绘图模式) K 键入文本 (左对齐) T 键入文本 (右对齐) Shift + T 增加/减小字体大小 (键入模式 Ctrl + 鼠标向上/向下或箭头键 红色笔 R 绿色笔 G 蓝色笔 B 黄色笔 Y 橙色笔 O 粉色笔 P 绘制直线 按住 Shift 绘制矩形 按住 Ctrl 绘制省略号 “按住”选项卡 绘制箭头 按住 Ctrl + Shift 擦除最后一个绘图 Ctrl+Z 擦除所有绘图 E 将屏幕截图复制到剪贴板 Ctrl + C 将屏幕截图另存为 PNG Ctrl+S “开始/停止”屏幕录制保存为 MP4 (Windows 10 2019 年 5 月更新 及更高) Ctrl + 5 显示倒计时计时器 Ctrl + 3 增加/减少时间 Ctrl + 鼠标向上/向下或箭头键 最小化计时器 (而不暂停计时器) Alt + Tab 最小化时显示计时器 缩放图标上的Left-Click 实时缩放模式 Ctrl + 4 退出 Esc 或 Right-Click ","date":"2023-11-14T14:07:10+08:00","permalink":"/p/2311014/","title":"zoomit快捷键"},{"content":"简介 AList 是一款易于安装且支持多平台的文件管理工具，可以挂载多种存储并提供多种实用功能。它支持 WebDAV、黑暗模式、文件预览、打包下载等，还提供保险箱加密和更多高级功能。\n🗂️ 一个支持多种存储的文件列表程序，使用 Gin 和 Solidjs。\n官方文档：https://alist.nn.ci/zh/guide\n安装 下载地址： https://github.com/alist-org/alist/releases/\n点击下载 v3.29.1 下载的文件解压到一个目录，最好先手动创建一个文件夹，比如\n1 D:\\remote\\alist\\alist.exe 运行 启动服务，在地址栏输入 cmd 快速进入当前目录，输入\n1 alist.exe server 就会在当前目录下生成 data 文件夹。包含了程序的数据。\n打开浏览器：localhost:5244 即可访问，终端出现了随机密码，但是默认密码太麻烦了，建议直接重置密码。\n回到 alist 所在目录，看到 第一次运行的时候生成的 data 文件夹，这个是存放数据的文件夹。\n生成（重置）密码：回到 alist.exe所在目录，重新打开一个 cmd 窗口\n1 2 3 4 5 # 指定密码 alist.exe admin set 你的密码 --data .\\data # 随机生成密码 alist.exe admin random --data .\\data --data 表示指定数据目录。不指定可能会报错 如果出现了如下报错，表示修改密码没有生效，报错如下：\n1 ERRO[2023-11-29 17:42:49] [del_user_cache_online] error: that\u0026#39;s not even a token 回到浏览器：输入：localhost:5244 即可使用 alist 了。\n现在我们使用的是默认端口，由于我的电脑上 小白羊盘 内置了 alist 占用了 5244 端口，所以在运行 alist 的时候可以把 端口修改，进入 data，可以看到有个 config.json的文件，里面就包含了端口的信息。\n文件所在的路径：D:\\remote\\alist\\data\\config.json 打开 config.json，修改以下的值 修改 \u0026ldquo;http_port\u0026rdquo;: 5244, 为 \u0026ldquo;http_port\u0026rdquo;: 5245, 重新启动服务，指定数据所在的目录\n1 alist.exe server --data=.\\data 现在打开浏览器：输入 localhost:5245 即可打开 alist\n系统服务 还有一个问题，启动成功了，但是每次需要手动运行有点麻烦，最好的办法就是创建系统服务，让它开机自启。借助 NSSM 创建系统服务。\n下载 nssm： 点击下载\n将 nssm 解压之后，将所在的路径（比如 D:\\tool\\nssm\\win64）添加到系统环境变量，确保可随处执行 nssm。\n创建 alist 自启动 服务，使用管理员运行 cmd：\n1 nssm install alist \u0026#34;D:\\remote\\alist\\alist.exe\u0026#34; \u0026#34;server\u0026#34; \u0026#34;--data\u0026#34; \u0026#34;D:\\remote\\alist\\data\u0026#34; 停止之前运行中的 alist，使用 系统服务运行。\n启动服务\n1 nssm start alist 停止服务\n1 nssm stop alist 重启服务\n1 nssm restart alist 移除服务（先要停止）\n1 nssm remove alist 附录 关于 帮助命令\nalist\n1 2 3 alist -h alist admin -h nssm\n1 nssm -h ","date":"2023-11-12T14:07:10+08:00","permalink":"/p/2311012/","title":"alist，Windows平台安装，并配置系统服务实现开机自启动"},{"content":"win10系统Windows 沙盒无法启动0x80070005错误解决方法 1、在开始菜单中搜索cmd ，以管理员身份运行【命令提示符】；\n2、请您启动管理员模式的命令提示符，依次输入以下命令并回车 Dism /Online /Cleanup-Image /ScanHealth Dism /Online /Cleanup-Image /CheckHealth DISM /Online /Cleanup-image /RestoreHealth 运行管理员身份的命令提示符并执行以下命令（重置组策略） RD /S /Q \u0026ldquo;%WinDir%\\System32\\GroupPolicyUsers\u0026rdquo; 回车 RD /S /Q \u0026ldquo;%WinDir%\\System32\\GroupPolicy\u0026rdquo; 回车 gpupdate /force 回车 重新启动计算机后即可正常运行沙盒！\n","date":"2023-11-11T14:07:10+08:00","permalink":"/p/2311011/","title":"Windows10沙盒无法运行解决办法参考"},{"content":" 系统：Debian12 显示服务器：Wayland\n关于waydroid的安装本篇不再介绍，至于如何安装可以观看 官网教程也可以查看 Linux 下安装使用 Waydrioid\n今天的主角是： waydroid_script\n描述： Python Script to add OpenGapps, Magisk, libhoudini translation library and libndk translation library to waydroid !\n我们将通过这个脚本安装 libhoudini translation library，用来在x86_64上支持arm，\n安装 waydroid_script 1、 克隆项目\n1 git clone https://github.com/casualsnek/waydroid_script 进入克隆的目录\n1 cd waydroid_script 2、新建虚拟环境或者使用已有环境，请根据自己情况在以下方案自选其一\n（1）新建虚拟环境安装依赖\n1 2 3 4 5 # 新建虚拟环境 python3 -m venv venv # 安装依赖 venv/bin/pip install -r requirements.txt （2）使用其他方式管理环境，安装依赖\n本地的环境我通过minconda管理，所以不采用上述新建虚拟环境方式\n1 2 3 4 5 6 7 8 9 # 新建环境 conda create -n waydroid python=3.10 conda activate waydroid # 确认当前所处的环境,*开头的为激活的环境 conda info -e # 安装依赖 pip install -r requirements.txt 安装模块（root权限） 安装所需要的模块只需要选择 {} 后面内容\n1 sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm} 因为我的 minconda使用普通用户安装，加上 sudo 需要使用绝对路径\n1 2 3 4 5 # 查看 python3 的位置，确保当前的环境是 之前创建的 waydroid which python3 # 结果如下 /home/taoone/opt/miniconda3/envs/waydroid/bin/python3 安装 libhoudini 只需要请将路径替换为自己的\n1 sudo /home/taoone/opt/miniconda3/envs/waydroid/bin/python3 main.py install libhoudini 卸载\n1 sudo /home/taoone/opt/miniconda3/envs/waydroid/bin/python3 main.py uninstall libhoudini 额外的，作者还提到在 AMD上 libndk 表现比 libhoudini更好，我的机器是 AMD的，我先安装的是它，但是经我测试好像有些问题。所以又换回了 libhoudini，故还是推荐 libhoudini。\n以下为 安装 libndk\n1 sudo /home/taoone/opt/miniconda3/envs/waydroid/bin/python3 main.py install libndk 卸载\n1 sudo /home/taoone/opt/miniconda3/envs/waydroid/bin/python3 main.py uninstall libndk 安装模块后需要重启 waydroid-controller\n1 systemctl restart waydroid-container.service 测试 下载一个 arm架构的app，看看是否能运行，比如就以微信为例。\n1 2 3 4 5 6 7 8 9 10 11 12 # 下载微信跳过， # 启动 waydroid waydroid session start # 进程阻塞，新开终端安装微信 waydroid app install weixin8043android2480_0x28002b38_arm64_1.apk # 除了手动下载weixin apk,当然也可以打开google play搜索wechat进行安装 # 打开界面查看微信是否安装成功 waydroid show-full-ui 打开微信的方式：主界面上拉打开应用盒子，应该是可以WeChat图标的，点击即可\n","date":"2023-11-10T14:07:10+08:00","permalink":"/p/2311010/","title":"Waydroid：在x86_64上运行arm架构的app"},{"content":"有时候下载的文件想要比对官方给出的 SHA256 值比较麻烦，这个脚本可以快速判断文件是否被篡改\n1 mkdir ~/bin \u0026amp;\u0026amp; vim sha256_compare.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/bin/bash script_name=$(basename \u0026#34;$0\u0026#34;) # 帮助函数 show_help() { echo \u0026#34;用法: $script_name \u0026lt;下载文件\u0026gt; \u0026lt;期望的SHA256哈希值\u0026gt;\u0026#34; echo \u0026#34;比较给定文件的SHA256哈希值和期望的哈希值，判断文件是否被篡改。\u0026#34; } # 参数验证 if [ \u0026#34;$1\u0026#34; = \u0026#34;-h\u0026#34; ]; then show_help exit 0 fi if [ $# -ne 2 ]; then echo \u0026#34;错误：需要提供两个参数。\u0026#34; show_help exit 1 fi # 获取文件路径和给定的 SHA256 值 downloaded_file=$1 expected_hash=$2 # 检查文件是否存在 if [ ! -f \u0026#34;$downloaded_file\u0026#34; ]; then echo \u0026#34;错误：文件 \u0026#39;$downloaded_file\u0026#39; 不存在。\u0026#34; exit 1 fi # 计算下载文件的 SHA256 值 calculated_hash=$(sha256sum \u0026#34;$downloaded_file\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) # 比对计算得到的哈希值和给定的哈希值 if [ \u0026#34;$calculated_hash\u0026#34; = \u0026#34;$expected_hash\u0026#34; ]; then echo \u0026#34;哈希值匹配，文件未被篡改。\u0026#34; else echo \u0026#34;哈希值不匹配，文件可能已被篡改。\u0026#34; fi 1 chmod +x sha256_compare.sh 1 export PATH=\u0026#34;$HOME/bin:$PATH\u0026#34; \u0026gt;\u0026gt; ~/.bash_profile 1 source ~/.bash_profile 脚本的用法为\n1 sha256_compare.sh \u0026lt;文件\u0026gt; \u0026lt;文件的哈希值\u0026gt; 1 2 # 查看帮助信息 sha256_compare.sh -h ","date":"2023-11-08T14:07:10+08:00","permalink":"/p/2311008/","title":"Shell脚本：快速比对文件的SHA256哈希值，判断文件是否被篡改"},{"content":"最近学习Flink用来测试socket处理数据，打开虚拟机使用linux发送未免太过麻烦，但是windows上的netcat安装解压后报毒，安全起见，我就还是卸载了，后来看到有说Namp下的ncat可以替代netcat 用于发送消息，那我就去下载了试试，发现确实可以替代。\nNmap下载地址：https://nmap.org/ncat/\n解压之后添加到环境变量，确保可以随处执行，netcat发送消息的命令为 nc，Nmap为ncat， 详细点为\nnetcat，-lk表示一直占用着，7777是端口\n1 nc -lk 7777 换成Nmap\n1 ncat -lk 7777 测试环节\n使用Flink测试，这段程序会检测 7777 端口的信息，这段代码是用于词频统计\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package cc.seektao.wc; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; public class WordCountStreamSocket { public static void main(String[] args) throws Exception { // 1. 准备环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 2. 读取数据 DataStreamSource\u0026lt;String\u0026gt; socketDS = env.socketTextStream(\u0026#34;localhost\u0026#34;, 7777); // 3. 处理数据: 切分、转换、聚合、 SingleOutputStreamOperator\u0026lt;Tuple2\u0026lt;String, Integer\u0026gt;\u0026gt; sum = socketDS .flatMap( (String line, Collector\u0026lt;Tuple2\u0026lt;String, Integer\u0026gt;\u0026gt; collector) -\u0026gt; { String[] words = line.split(\u0026#34; \u0026#34;); for (String word : words) { // 采集器采集数据发送到下游 collector.collect(new Tuple2\u0026lt;\u0026gt;(word, 1)); } }) .returns(Types.TUPLE(Types.STRING, Types.INT)) // landbda 表达式有类型擦除，需要手动指定泛型的参数类型 .keyBy(word -\u0026gt; word.f0) .sum(1); // 4. 输出 sum.print(); // 5. 启动 env.execute(); } } 运行Flink程序，程序会监听 7777 端口的信息\n新开windows终端，输入\n1 ncat -lk 7777 这时会阻塞，输入信息，比如\n1 2 3 hello flink hello spark hello world 程序就会显示统计信息\n1 2 3 4 5 6 3\u0026gt; (hello,1) 7\u0026gt; (flink,1) 1\u0026gt; (spark,1) 3\u0026gt; (hello,2) 5\u0026gt; (world,1) 3\u0026gt; (hello,3) ","date":"2023-11-07T14:07:10+08:00","permalink":"/p/2311007/","title":"网络工具Ncat，替代netcat"},{"content":" 系统：Debian12 显示服务器：Wayland\n概述 Waydroid 是一个基于容器的，能在常规 GNU/Linux 启动完整的 Android 系统的方法。\n官网：https://waydro.id/ 文档：https://docs.waydro.id/\n快速上手 本次将快速安装 Waydroid ，关于更多的细节，请查看官网说明。\n需要注意的是，图形平台需要为 Wayland。\n下载安装 本次使用的是 Amd架构的 Debian12，图形平台 Wayland 等等满足安装需求。\n1 2 3 4 5 6 7 8 # Install pre-requisites sudo apt install curl ca-certificates -y # Add the official repository curl https://repo.waydro.id | sudo bash # Install waydroid sudo apt install waydroid -y 其他平台请查看：https://docs.waydro.id/usage/install-on-desktops\n快速上手 安装 Waydroid 软件包，这一步需要保持“良好的”网络环境，\n1 2 # 使用 google框架支持的 Android 镜像， sudo waydroid init -s GAPPS -f 启用 waydroid-container.service\n1 sudo systemctl enable --now waydroid-container 启动/关闭 会话\n1 2 3 4 5 # 启动 waydroid session start # 关闭 waydroid session stop 启动 GUI\n1 waydroid show-full-ui 安装应用\n1 waydroid app install xxx.apk ","date":"2023-11-05T14:07:10+08:00","permalink":"/p/2311005/","title":"Linux下的安卓模拟器Waydrioid使用"},{"content":"Grub2 是Linux众多发行版默认引导器，有必要对它简单了解一下。\n比如：\n默认界面还是太丑，可以换个主题 修改启动等待时间 先简单了解 Grub 配置文件\n路径：/etc/default/grub GRUB_TIMEOUT： 启动等待时间，默认 5 s GRUB_THEME：主题位置 GRUB_BACKGROUND：背景 修改完配置，需要更新 Grub 配置\n1 sudo update-grub 修改默认启动时间 现在我的系统只剩下 Debian12 了，默认启动的 5s 等待时间我觉得有点影响使用体验，所以打算关闭它，把 GRUB_TIMEOUT 的值改为 1\n1 2 3 4 5 6 7 sudo vim /etc/default/grub # 把 GRUB_TIMEOUT 修改为 1 GRUB_TIMEOUT=1 # (可选)在等待时间结束后自动启动默认操作系统，而不显示菜单 # GRUB_TIMEOUT_STYLE=hidden 1 2 # 更新配置 sudo update-grub 主题 grub主题商店：https://store.kde.org/browse?cat=109\u0026amp;ord=latest\ngrub2-themes 源码：https://github.com/vinceliuice/grub2-themes\n安装\n1 2 git clone --depth 1 https://github.com/vinceliuice/grub2-themes.git cd grub2-themes/ 1 sudo ./install.sh -t vimix -s 2k -b ","date":"2023-11-04T14:07:10+08:00","permalink":"/p/2311004/","title":"Grub2简单使用"},{"content":"Debian 前置条件 Debian Bookworm 12 (stable) Debian Bullseye 11 (oldstable) 卸载旧版本 1 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done 设置存储库 官方地址 1 2 3 4 5 6 7 8 9 10 11 12 # Add Docker\u0026#39;s official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 清华地址 1 2 3 4 5 6 7 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \\ \u0026#34;$(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;)\u0026#34; stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 安装 1 2 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Ubuntu 前置条件 Ubuntu Noble 24.04 (LTS) Ubuntu Mantic 23.10 (EOL: July 12, 2024) Ubuntu Jammy 22.04 (LTS) Ubuntu Focal 20.04 (LTS) 卸载旧版本 1 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 设置存储库 官方地址 1 2 3 4 5 6 7 8 9 10 11 12 # Add Docker\u0026#39;s official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 清华地址 1 2 3 4 5 6 7 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \\ \u0026#34;$(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;)\u0026#34; stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 安装 1 2 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Windows 使用 Windows 安装 docker desktop 下载 docker desktop 即可\n如果下载速度慢，可以使用我分享的网络链接：\nhttps://www.123684.com/s/4MOKVv-P02pd?提取码:love\nhttps://www.123865.com/s/4MOKVv-P02pd?提取码:love\n直接在 WSL 中安装 安装之前，下载你安装的 wsl 版本对应 docker 文件，比如我安装的系统是 debain 12\n为什么下载 dcoker 安装文件安装,？因为 wsl 不是一个完整的系统，没有 systemctl ，无法使用 apt 安装，所以需要手动下载文件安装\n注意下载 docker 组件之间的版本适配，如何确定下载不同的版本呢，这里有个小技巧，\n","date":"2023-11-03T14:07:10+08:00","permalink":"/p/2311003/","title":"Docker安装"},{"content":"1. 安装语言包 首先我们需要安装locales这个软件包：\nsudo apt install locales\n2. 配置语言环境 执行下列命令配置语言环境：\n1 sudo dpkg-reconfigure locales 空格选中，回车确定\n","date":"2023-11-02T14:07:10+08:00","permalink":"/p/2311002/","title":"Debian配置系统中文语言及环境"},{"content":"用tabby自带的sftp上传文件时，会自动进入 / 目录，点来点去很麻烦，官方有给出答案，点此跳转\nbash ~/.bash_profile\n1 export PS1=\u0026#34;$PS1\\[\\e]1337;CurrentDir=\u0026#34;\u0026#39;$(pwd)\\a\\]\u0026#39; ZSH ~/.zshrc\n1 precmd () { echo -n \u0026#34;\\x1b]1337;CurrentDir=$(pwd)\\x07\u0026#34; } ","date":"2023-11-01T18:07:11+08:00","permalink":"/p/240730180711/","title":"Tabby点击上传按钮不识别当前目录【已解决】"},{"content":" 1 2 3 4 5 6 7 8 sudo dpkg-reconfigure locales # 勾选上，回车下一步 en_US.UTF-8 zh_CN.UTF-8 # 生效 sudo update-locale ","date":"2023-11-01T14:07:10+08:00","permalink":"/p/2311001/","title":"Debian11配置Locales"},{"content":"概述 本文档包含了各个常用镜像服务及对应镜像站\n各个镜像源的帮助文档：\n清华：https://mirror.tuna.tsinghua.edu.cn/help 阿里云：https://developer.aliyun.com/mirror/ 中科大：https://mirrors.ustc.edu.cn/help/ 华为云：https://mirrors.huaweicloud.com/home\n系统软件源 Debian 查看系统发行版本\n1 cat /etc/issue 清华 Debian13:\n1 2 3 4 5 6 7 8 9 10 11 12 13 # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware # 以下安全更新软件源包含了官方源与镜像站配置，如有需要可自行修改注释切换 deb https://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware # deb-src https://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware Debian12：\n1 2 3 4 5 6 7 8 9 10 11 12 13 # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # 以下安全更新软件源包含了官方源与镜像站配置，如有需要可自行修改注释切换 deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware 一键脚本\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat \u0026lt;\u0026lt; EOF | sudo tee /etc/apt/sources.list \u0026gt; /dev/null # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # 以下安全更新软件源包含了官方源与镜像站配置，如有需要可自行修改注释切换 deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware # deb-src https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware EOF Debain10：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free deb http://security.debian.org/debian-security buster/updates main contrib non-free # deb-src http://security.debian.org/debian-security buster/updates main contrib non-free Ubuntu 查看系统发行版本\n1 cat /etc/issue 清华 Ubuntu 24.04：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cat \u0026lt;\u0026lt; EOF | sudo tee /etc/apt/sources.list \u0026gt; /dev/null # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse # 以下安全更新软件源包含了官方源与镜像站配置，如有需要可自行修改注释切换 deb http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse # deb-src http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse # 预发布软件源，不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse EOF PyPI 清华 临时使用\n1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name 设为默认\n1 2 python -m pip install --upgrade pip pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 阿里 公网配置方法：\n找到下列文件 1 ~/.pip/pip.conf 在上述文件中添加或修改: 1 2 3 4 5 [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com ECS 内网配置方法：\n找到下列文件 1 ~/.pip/pip.conf 在上述文件中添加或修改: 1 2 3 4 5 [global] index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/ [install] trusted-host=mirrors.cloud.aliyuncs.com NPM 查看镜像源\n1 npm config get registry 删除镜像源\n1 npm config rm registry 淘宝 http://npm.taobao.org和 http://registry.npm.taobao.org 将在 2022.06.30 号正式下线和停止 DNS 解析。\n新域名为 npmmirror.com, 相关服务域名切换规则请参考：\n1 npm config set registry https://registry.npmmirror.com yarn 查看镜像源\n1 yarn config get registry 设置为淘宝镜像源\n1 yarn config set registry https://registry.npmmirror.com 删除镜像源\n1 yarn config rm registry 华为云 切换 1 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ 验证 1 npm config get registry Go 七牛云 1 2 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct Maven 阿里云 打开 Maven 的配置文件(windows 机器一般在 maven 安装目录的 conf/settings.xml)，在\u0026lt;mirrors\u0026gt;\u0026lt;/mirrors\u0026gt;标签中添加 mirror 子节点:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 \u0026lt;!-- 阿里云仓库 --\u0026gt; \u0026lt;mirror\u0026gt; \u0026lt;id\u0026gt;alimaven\u0026lt;/id\u0026gt; \u0026lt;mirrorOf\u0026gt;central\u0026lt;/mirrorOf\u0026gt; \u0026lt;name\u0026gt;aliyun maven\u0026lt;/name\u0026gt; \u0026lt;url\u0026gt;http://maven.aliyun.com/nexus/content/repositories/central/\u0026lt;/url\u0026gt; \u0026lt;/mirror\u0026gt; \u0026lt;!-- 中央仓库1 --\u0026gt; \u0026lt;mirror\u0026gt; \u0026lt;id\u0026gt;repo1\u0026lt;/id\u0026gt; \u0026lt;mirrorOf\u0026gt;central\u0026lt;/mirrorOf\u0026gt; \u0026lt;name\u0026gt;Human Readable Name for this Mirror.\u0026lt;/name\u0026gt; \u0026lt;url\u0026gt;http://repo1.maven.org/maven2/\u0026lt;/url\u0026gt; \u0026lt;/mirror\u0026gt; \u0026lt;!-- 中央仓库2 --\u0026gt; \u0026lt;mirror\u0026gt; \u0026lt;id\u0026gt;repo2\u0026lt;/id\u0026gt; \u0026lt;mirrorOf\u0026gt;central\u0026lt;/mirrorOf\u0026gt; \u0026lt;name\u0026gt;Human Readable Name for this Mirror.\u0026lt;/name\u0026gt; \u0026lt;url\u0026gt;http://repo2.maven.org/maven2/\u0026lt;/url\u0026gt; \u0026lt;/mirror\u0026gt; Docker 软件源 非 Docker Hub 镜像源\n清华 Debian/Ubuntu/Raspbian 用户 如果你过去安装过 docker，先删掉：\n1 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done 首先安装依赖：\n1 2 sudo apt-get update sudo apt-get install ca-certificates curl gnupg 信任 Docker 的 GPG 公钥并添加仓库：\n详细内容请查看 https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/\nDebian\n1 2 3 4 5 6 7 8 9 10 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \\ \u0026#34;$(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;)\u0026#34; stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null Ubuntu\n1 2 3 4 5 6 7 install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \\ \u0026#34;$(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;)\u0026#34; stable\u0026#34; | \\ tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 如果提示\n1 2 -bash: gpg: command not found curl: (23) Failed writing body 请安装 gpg 之后，再次尝试上述的步骤： 信任 Docker 的 GPG 公钥并添加仓库\n1 sudo apt install gpg 最后安装\n1 2 3 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Gradle 腾讯云（推荐，版本全）\n1 https://mirrors.cloud.tencent.com/gradle 阿里云（有些小版本没有）\ngradele 4.1 之后 1 https://mirrors.aliyun.com/macports/distfiles/gradle/ ","date":"2023-10-29T14:07:29+08:00","permalink":"/p/mirror/","title":"镜像源大汇总，强烈推荐！"},{"content":"docker 1 2 3 4 5 6 7 8 version: \u0026#39;3.9\u0026#39; services: javbus-api: image: ovnrain/javbus-api ports: - \u0026#39;8922:3000\u0026#39; restart: unless-stopped container_name: javbus-api ","date":"2023-10-26T14:07:10+08:00","permalink":"/p/jav-bus-api/","title":"快速安装jav-bus的api"},{"content":"自己搭建的kms激活服务器 一条命令激活windows，只需要管理员打开cmd运行下面这条命令即可\n1 slmgr /skms kms.seektao.cc \u0026amp;\u0026amp; slmgr /ato ","date":"2023-10-25T14:07:10+08:00","permalink":"/p/2310025/","title":"自己搭建kms实现Windows激活"},{"content":" 由于 PMail 后续更新，本文也将修改，适应最新版本\n前言 最近想自建一个域名邮箱，开源的邮箱服务内存占用太高，对于个人使用不太友好，接着找到一个由 Golang 编写的域名邮箱 Pmail。\n官方介绍：PMail 是一个追求极简部署流程、极致资源占用的个人域名邮箱服务器。单文件运行，包含完整的收发邮件服务和 Web 端邮件管理功能。只需一台服务器、一个域名、一行代码、一分钟部署时间，你就能够搭建出一个自己的域名邮箱。\nGitHub 地址：https://github.com/Jinnrry/PMail/\n以下为界面截图：\n准备工作 服务器，开放了 25 号端口的服务器，没有开放则无法发信。 域名 nginx 反代服务器 nginx proxy manager（可选，但建议），与 nginx 二选一 docker 或者 docker-compose 部署 提示：文章篇幅较长\ndocker-compose\n如果服务器 80，443 端口没有被占用，搭建过程则较为简单。如果 80，443 端口被其他应用占用，搭建过程则较为繁琐。\n本次 80，443 端口被 nginx proxy manager 占用，所以采用映射其他端口搭建\n本次教程采用 docker-compose 方式安装，方便管理配置文件和升级。其余方式请参考官方教程\n在你喜欢的目录下，新建 pamail 文件夹，在 pamil 文件夹下，新建 docker-compose.yml 文件，如：\n1 2 3 mkdir -r ~/opt/pmail \u0026amp;\u0026amp; cd ~/opt/pmail docker network create pmail_network vim docker-compose.yml 文件内容如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: \u0026#39;3.9\u0026#39; services: pmail: container_name: pmail image: \u0026#39;ghcr.io/jinnrry/pmail:latest\u0026#39; volumes: - \u0026#39;./config:/work/config\u0026#39; ports: # pop - \u0026#39;110:110\u0026#39; - \u0026#39;995:995\u0026#39; # smtp - \u0026#39;25:25\u0026#39; - \u0026#39;465:465\u0026#39; # web访问 - \u0026#39;8780:80\u0026#39; - \u0026#39;8781:443\u0026#39; restart: unless-stopped networks: - pmail_network networks: pmail_network: external: true 配置文件编写完成之后，在 docker-compose.yml 所在目录下，运行\n1 sudo docker compose up 接着会开启一个阻塞的前台进程，会打印日志信息，没有报错的话，服务则已经启动。\n开放端口，因为使用的云服务器，所以需要在云服务器管理面板，开放安全组，也就是端口，笔者使用的阿里云。\n进入 ecs 管理面板，在左侧选择 【安全组】，选择服务器对应的安全组。\n接着【手动添加】\n填写端口范围和授权对象，端口即为配置文件开放的端口，授权对象为 0.0.0.0，表示所有 ip 都可访问，描述为备注信息。\n保存后，安全组配置完成。\n配置 pmail\n暂停 pamil 的启动，修改配置文件\n1 sudo vim /config/config.json 修改配置文件\n1 \u0026#34;sslType\u0026#34;:\u0026#34;1\u0026#34;,\u0026#34;httpPort\u0026#34;:0,\u0026#34;httpsPort\u0026#34;:0 网页访问服务器的公网 ip+端口，如本次教程为 http://ip:8780，ip 为服务器的公网 ip，在ecs 管理面板 可以看到。\n欢迎界面，初次进入的页面如下：\n下一步，选择数据库，建议默认即可，根据自己使用的数据库安装\n继续下一步，设置 pmail 管理员密码\n下一步，设置域名\n下一步，设置 DNS，将以下信息添加到 dns 解析处，\nDNS 记录配置，在上一步，需要将 DNS 记录添加到对应的域名，我使用的 DNSPOD，点此跳转 DNSPOD ，进入之后，按照提示添加记录即可\n配置 ssl，dns 记录添加完成之后，回到 pmail 配置页面，继续配置证书。\n这里选择手动配置 ssl 证书，如果服务器的 80 端口没有被占用，可以选择自动配置，当然，前面的 docker-compose.yml 端口信息也需要改成 80，443。\n为什么选择不用 80，443 端口呢？？\n自动配置 ssl 需要用到 80 端口来验证服务器的所有权，所以自动配置 ssl 必须使用 80 端口。但是我的服务器安装了 nginx proxy manger（简称 npm） ，反代服务，一个 web 端的 nginx 工具，简化 nginx 配置，还可以一键生成 ssl 证书，我的服务器应用比较多，其他应用采用的都是子域名的方式访问。通过这种方式，简化的自己的工作、但是 npm 已经占用了 80，443 端口，所以 80，443 端口不可用。总不可能为了一个域名服务，让其他域名都不可用域名访问了吧。所以，将容器的 80，443 端口映射到了其他端口。\n默认的证书位置在 ./config/ssl/private.key、./config/ssl/public.crt下，我们就把自己的 ssl 证书上传到 ./config/ssl下。\n如果继续介绍 npm 申请 ssl 证书，这篇文章的篇幅就会过长。如果需要，到时候会另开文章介绍，这里就不多介绍了。也可自行搜索相关教程。\n关于 ssl 配置可以参考这篇博文：Debian 下的 Certbot 安装使用，附 nginx 使用\n完成了这一步后，就基本完成了，不过还需要配置反向代理。\n反向代理 dns 记录\n进入 dnspod 管理页面，新增 dns 记录，如下\n新增代理\n进入 npm 管理页面，新增代理\n点击 Add Proxy Host\n编辑新增内容，按照如图所示编辑，打码的部分为服务的 ip 或者域名。\n开启 ssl，点击 ssl，ssl 证书选择已经申请的，如果没有，这里不做介绍。\n强制 ssl 开启，http2 开启，如图：\n最后点击 save 保存。到这反向代理也配置完成。\n但是访问会出现\n修改 pmail 配置文件，关闭前台进程，ctrl+c，关闭。\npmail 的配置文件已经挂载到本地了，在 config/config.json下，\n进入 pmail 文件夹，编辑 config.json\n1 2 3 cd ~/opt/pmail sudo vim config/config.json httpsEnabled 配置改成 2 sslType 改成 1 启动测试 修改配置后，重新启动 docker 容器。\n在 docker-compose.yml 所在目录下，运行\n1 2 3 sudo docker up -d # -d 表示后台运行 浏览器通过域名访问或者 ip+端口访问即可\n最终效果如下，\n测试，发送测试邮件给 163 邮箱\n163 邮箱 接收\n总结：\n搭建过程较为繁琐，需要的前置条件较多.\npmail 界面相较于其他邮箱要差一些，没有多用户功能，最新版已增加，实现了基本的收发功能。基本满足个人使用。\n感谢作者的开源精神。\n最后继续附上 pmail 的 GitHub 地址：https://github.com/Jinnrry/PMail/\n附录 配置信息详解\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { \u0026#34;logLevel\u0026#34;: \u0026#34;info\u0026#34;, //日志输出级别 \u0026#34;domain\u0026#34;: \u0026#34;domain.com\u0026#34;, // 你的域名 \u0026#34;webDomain\u0026#34;: \u0026#34;mail.domain.com\u0026#34;, // web域名 \u0026#34;dkimPrivateKeyPath\u0026#34;: \u0026#34;config/dkim/dkim.priv\u0026#34;, // dkim 私钥地址 \u0026#34;sslType\u0026#34;: \u0026#34;0\u0026#34;, // ssl证书更新模式，0自动，1手动 \u0026#34;SSLPrivateKeyPath\u0026#34;: \u0026#34;config/ssl/private.key\u0026#34;, // ssl 证书地址 \u0026#34;SSLPublicKeyPath\u0026#34;: \u0026#34;config/ssl/public.crt\u0026#34;, // ssl 证书地址 \u0026#34;dbDSN\u0026#34;: \u0026#34;./config/pmail.db\u0026#34;, // 数据库连接DSN \u0026#34;dbType\u0026#34;: \u0026#34;sqlite\u0026#34;, //数据库类型，支持sqlite 和 mysql \u0026#34;httpsEnabled\u0026#34;: 0, // web后台是否启用https 0默认（启用），1启用，2不启用 \u0026#34;spamFilterLevel\u0026#34;: 0,// 垃圾邮件过滤级别，0不过滤、1 spf dkim 校验均失败时过滤，2 spf校验不通过时过滤 \u0026#34;httpPort\u0026#34;: 80, // http 端口 . 默认 80 \u0026#34;httpsPort\u0026#34;: 443, // https 端口 . 默认 443 \u0026#34;weChatPushAppId\u0026#34;: \u0026#34;\u0026#34;, // 微信推送appid \u0026#34;weChatPushSecret\u0026#34;: \u0026#34;\u0026#34;, // 微信推送秘钥 \u0026#34;weChatPushTemplateId\u0026#34;: \u0026#34;\u0026#34;, // 微信推送模板id \u0026#34;weChatPushUserId\u0026#34;: \u0026#34;\u0026#34;, // 微信推送用户id \u0026#34;tgChatId\u0026#34;: \u0026#34;\u0026#34;, // telegram 推送chatid \u0026#34;tgBotToken\u0026#34;: \u0026#34;\u0026#34;, // telegram 推送 token \u0026#34;isInit\u0026#34;: true // 为false的时候会进入安装引导流程 } ","date":"2023-10-23T14:07:10+08:00","permalink":"/p/pmail/","title":"强烈推荐，一个内存占用极低的自建域名邮箱Pmail"},{"content":" 1 vim $HOME/.vimrc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 set number \u0026#34; set relativenumber set tabstop=2 set shiftwidth=2 set expandtab set autoindent set smartindent set cursorline set encoding=utf-8 set fileencoding=utf-8 set mouse=a syntax on set history=1000 set splitbelow set splitright 开箱即用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 \u0026#34; 基本设置 set nocompatible \u0026#34; 不兼容 vi syntax on \u0026#34; 开启语法高亮 \u0026#34; 缩进设置 set tabstop=2 \u0026#34; 设置制表符占用的空格数 set shiftwidth=2 \u0026#34; 设置自动缩进的空格数 set softtabstop=2 \u0026#34; 设置编辑时制表符转换为空格的空格数 set expandtab \u0026#34; 使用空格代替制表符 \u0026#34; 搜索设置 set hlsearch \u0026#34; 高亮显示搜索结果 set incsearch \u0026#34; 输入时即时搜索 set ignorecase \u0026#34; 搜索时忽略大小写 set smartcase \u0026#34; 当搜索包含大写字母时，不忽略大小写 \u0026#34; 界面设置 set number \u0026#34; 显示行号 \u0026#34; set relativenumber \u0026#34; 显示相对行号 set cursorline \u0026#34; 高亮当前行 set nowrap \u0026#34; 不自动折行 set showcmd \u0026#34; 显示命令模式下的命令 set showmode \u0026#34; 显示当前模式 \u0026#34; 回滚设置 set undofile \u0026#34; 允许保存撤销历史 set undolevels=1000 \u0026#34; 设置撤销级别 \u0026#34; 文件编码设置 set encoding=utf-8 \u0026#34; 设置文件编码为 UTF-8 set fileencoding=utf-8 \u0026#34; 设置文件编码为 UTF-8 \u0026#34; 状态栏设置 set laststatus=2 \u0026#34; 总是显示状态栏 \u0026#34; 其他设置 set autoindent \u0026#34; 自动缩进 set smartindent \u0026#34; 智能缩进 set backspace=indent,eol,start \u0026#34; 允许退格键跨越空格、行尾和插入点 set mouse=a \u0026#34; 启用鼠标支持 set clipboard=unnamed \u0026#34; 使用系统剪贴板 \u0026#34; 代码折叠 set foldmethod=indent \u0026#34; 使用缩进来决定代码折叠 set foldlevelstart=99 \u0026#34; 初始折叠级别 \u0026#34; 命令缩写 command W w \u0026#34; 简化保存文件的命令 \u0026#34; 键位映射 nnoremap \u0026lt;F5\u0026gt; :set number!\u0026lt;CR\u0026gt; \u0026#34; 按 F5 切换显示/隐藏行号 \u0026#34; 颜色方案 colorscheme default \u0026#34; 设置颜色方案（这里使用 Vim 默认方案） ","date":"2023-10-22T14:07:10+08:00","permalink":"/p/2310022/","title":"VIM的配置"},{"content":"使用maven将阿里云的上传sdk的jar包添加到本地仓库\njar包的下载地址：点此跳转\n下载下来解压，进入lib目录，有类似\naliyun-java-sdk-vod-2.16.11.jar aliyun-java-vod-upload-1.4.15.jar 这两个jar包，在此目录打开终端\nmaven项目缺少 aliyun-java-vod-upload，使用这个命令\n1 mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-java-vod-upload -Dversion=1.4.15 -Dpackaging=jar -Dfile=aliyun-java-vod-upload-1.4.15.jar maven项目缺少 aliyun-sdk-vod-upload，使用这个命令\n1 mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.15 -Dpackaging=jar -Dfile=aliyun-java-vod-upload-1.4.15.jar ","date":"2023-10-20T14:07:10+08:00","permalink":"/p/2310020/","title":"使用maven将阿里云的上传sdk的jar包添加到本地仓库"},{"content":"需求： 转换申请的 ssl 证书格式，以 pem 结尾的证书改成 key、crt结尾。\n科普：证书格式\ncert.pem：这是服务器证书，也称为公钥证书或端点证书。当客户端请求与服务器建立SSL/TLS连接时，服务器会将此证书发送给客户端以验证身份和建立安全连接。 chain.pem：这是证书链（CA Bundle），其中包括根证书和中间证书。证书链用于构建完整的证书信任链，以验证服务器证书的真实性。 fullchain.pem：这是服务器证书和证书链的组合。它包括服务器证书和中间证书链，但不包括根证书，因为客户端应该已经具有根证书的信任。 privkey.pem：这是私钥文件，它是与服务器证书配对使用的秘密密钥。私钥文件必须保持机密，不应共享或泄露给其他人，以确保安全连接的保密性 解决方法 fullchain.pem 转换 public.crt 1 openssl x509 -in fullchain.pem -out public.crt privkey.pem 转换 privkey.key 1 openssl ec -in privkey.pem -out private.key 如果出现了错误，具体原因为 加密算法不是 EC 其实还有 RSA、DSA等加密算法。\n1 2 # 使用rsa算法转换 openssl rsa -in privkey.pem -out private.key ","date":"2023-10-19T14:07:10+08:00","permalink":"/p/2310019/","title":"SSL证书格式转换"},{"content":"概述 Node Version Manager，NodeJS 版本管理工具\nGithub: https://github.com/nvm-sh/nvm\n安装 Linux 1 wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash Windows windows 下其实也有 nvm，不过项目是另一个，nvm-windows\n使用命令有所不同，不过都很简单。\n使用 查看帮助信息\n1 nvm --help 查看可安装的 Node 版本\n1 2 # 查看node版本 nvm ls-remote 安装默认的 Node lts 版本\n1 2 # 安装lts版本 nvm install --lts # 安装默认的 lts 版本，目前是20 安装指定的 Node 版本\n1 nvm install 16.20.2 查看本地已下载的 Node 信息\n1 nvm ls 使用指定的 Node 版本\n1 2 # 确保已经安装过 nvm use 16 ","date":"2023-10-17T14:07:10+08:00","permalink":"/p/2310017/","title":"nvm，Node版本管理工具"},{"content":"如果日志文件太大，使用一些工具来查看和分析日志内容，以便更方便地定位问题。以下是几种常用的方法：\n使用tail命令：tail命令可以用来查看日志文件的末尾内容。可以通过指定-n参数来指定要显示的行数，例如：\n1 tail -n 100 logs.log 这将显示日志文件的最后100行内容。可以根据需要调整行数，以便查看足够的日志内容。\n使用less命令：less命令可以以分页的方式查看文件内容，并且支持向前/向后翻页浏览。可以运行以下命令来使用less命令查看日志文件：\n1 less logs.log 运行后，可以使用上下箭头键进行滚动，按空格键向下翻页，按b键向上翻页，按q键退出查看。\n使用日志分析工具：如果的日志文件非常庞大或需要更高级的日志分析功能，可以考虑使用专门的日志分析工具，例如grep、awk、sed等。这些工具可以帮助根据特定的模式或关键词过滤、搜索和提取日志内容。\n例如，可以使用grep命令来搜索包含特定关键词的日志行：\n1 grep \u0026#34;error\u0026#34; logs.log 这将显示包含 \u0026ldquo;error\u0026rdquo; 关键词的日志行。\n或者，可以使用awk命令来提取特定字段或进行更复杂的日志处理操作：\n1 awk \u0026#39;{print $1, $2, $5}\u0026#39; logs.log 这将提取日志行中的第1、2和5个字段，并将其显示出来。\n","date":"2023-10-16T14:07:10+08:00","permalink":"/p/2310016/","title":"Linux下的日志太大，如何查看不卡顿"},{"content":" title: Linux下的 Typora 安装和激活 author: taoone create_date: 2023-10-19\ntypora作为markdown的编辑器的翘楚不用多介绍了吧，就是收费了，不过收费才能让软件走的更好，更远，所以，所以\u0026hellip;所以呢，我目前选择破解\n安装typora 方式一 注意：此方式会下载最新版本.\n官网教程：https://typoraio.cn/#linux\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # or run: # sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE wget -qO - https://typoraio.cn/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.asc # add Typora\u0026#39;s repository sudo add-apt-repository \u0026#39;deb https://typoraio.cn/linux ./\u0026#39; sudo apt-get update # install typora sudo apt-get install typora 方式二 可以下载指定的版本，更改后面的版本号即可\nhttps://download2.typoraio.cn/linux/typora_1.7.5_amd64.deb\n下载完成时候安装\n1 sudo dpkg -i typora_1.7.5_amd64.deb 激活typora 以下命令均为绝对路径，只需要复制粘贴即可\n下载\n1 2 3 git clone https://github.com/muyiacc/NodeInject.git ~/.NodeInject git clone https://github.com/muyiacc/NodeInject_Hook_example.git ~/.NodeInject_Hook_example 将NodeInject_Hook_example下hook.js 复制到 NodeInject/src下，并改名为hooklog.js\n1 cp ~/.NodeInject_Hook_example/hook.js ~/.NodeInject/src/hooklog.js 安装rust 按照官方教程，需要用到cargo，这是rust所包含的包管理工具，所以还得安装rust 中间选择 1 使用默认推荐安装 安装完成之后，接着刷新环境\n1 curl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh 1 source \u0026#34;$HOME/.cargo/env\u0026#34; 接着在终端输入，测试安装是否成功，输出如下信息则安装成功\n1 2 → cargo -V cargo 1.73.0 (9c4383fb5 2023-08-26) 进入NodeInject编译\n1 cd ~/.NodeInject \u0026amp;\u0026amp; cargo build 将编译后的可执行文件复制到 typora文件夹下，并切换，执行复制的文件\n1 2 3 sudo cp ~/.NodeInject/target/debug/node_inject /usr/share/typora/ sudo /usr/share/typora/node_inject 这里出现如下信息，则到目前为止，没有任何问题。\n1 2 3 4 5 extracting node_modules.asar adding hook.js applying patch packing node_modules.asar done! 切换回 NodeInject_Hook_example，生成 license\n1 2 3 4 5 cd ~/.NodeInject_Hook_example/license-gen/ ~/.NodeInject_Hook_example/license-gen/cargo build ~/.NodeInject_Hook_example/license-gen/target/debug/license-gen 接着出现 license\n1 License for you: 5QSW2H-X9GNBU-64F2MZ-YYHJ7W 打开typora，输入邮箱和许可证激活 幸运的话，就可以激活了。\n卸载typora 1 2 3 sudo apt purge typora sudo rm -rf /usr/share/typora ","date":"2023-10-15T14:07:10+08:00","permalink":"/p/2310015/","title":"Linux下的Typora 安装和激活"},{"content":"今天安装了postman，下载下来之后发现是一个压缩包的文件，kde的全局搜索（alt+space）搜不到，想把它加进去。\n压缩包包含的目录如下\n1 2 drwxr-xr-x 6 taoone taoone 4096 Oct20日 23:17 app lrwxrwxrwx 1 taoone taoone 11 Oct20日 23:17 Postman -\u0026gt; app/Postman app\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 → ll app/ 总计 184784 drwxr-xr-x 6 taoone taoone 4096 Oct20日 23:17 . drwxr-xr-x 3 taoone taoone 4096 Oct20日 23:17 .. -rw-r--r-- 1 taoone taoone 148993 Oct20日 23:17 chrome_100_percent.pak -rw-r--r-- 1 taoone taoone 221103 Oct20日 23:17 chrome_200_percent.pak -rwxr-xr-x 1 taoone taoone 1123584 Oct20日 23:17 chrome_crashpad_handler -rwxr-xr-x 1 taoone taoone 53224 Oct20日 23:17 chrome-sandbox drwxr-xr-x 2 taoone taoone 4096 Oct20日 23:17 icons -rw-r--r-- 1 taoone taoone 10284336 Oct20日 23:17 icudtl.dat -rwxr-xr-x 1 taoone taoone 252576 Oct20日 23:17 libEGL.so -rwxr-xr-x 1 taoone taoone 3012552 Oct20日 23:17 libffmpeg.so -rwxr-xr-x 1 taoone taoone 5833784 Oct20日 23:17 libGLESv2.so -rwxr-xr-x 1 taoone taoone 4252936 Oct20日 23:17 libvk_swiftshader.so -rwxr-xr-x 1 taoone taoone 5709040 Oct20日 23:17 libvulkan.so.1 drwxr-xr-x 2 taoone taoone 4096 Oct20日 23:17 locales -rwxr-xr-x 1 taoone taoone 152013352 Oct20日 23:17 postman -rwxr-xr-x 1 taoone taoone 16848 Oct20日 23:17 Postman drwxr-xr-x 4 taoone taoone 4096 Oct20日 23:17 resources -rw-r--r-- 1 taoone taoone 5109757 Oct20日 23:17 resources.pak -rw-r--r-- 1 taoone taoone 405456 Oct20日 23:17 snapshot_blob.bin drwxr-xr-x 2 taoone taoone 4096 Oct20日 23:17 swiftshader -rw-r--r-- 1 taoone taoone 726296 Oct20日 23:17 v8_context_snapshot.bin -rw-r--r-- 1 taoone taoone 107 Oct20日 23:17 vk_swiftshader_icd.json 先解压让终端可以运行postman\n1 sudo tar -zxvf postman-linux-x64.tar.gz -C /opt/ 解压之后的文件夹是Postman，绝对路径为 /opt/Postman\n添加到 bin目录，创建软连接\n1 sudo ln -s /opt/Postman/Postman /usr/bin/Postman 添加全局搜索 全局搜索的配置文件在 /usr/share/applications，这里有很多已经安装的软件，如\n1 2 3 brave-browser.desktop firefox-esr.desktop google-chrome.desktop 名字都是 软件名.desktop的形式，我们仿照它们，新建一个\n1 vim postman.desktop 内容如下\n1 2 3 4 5 6 7 [Desktop Entry] Type=Application Name=Postman Icon=/opt/Postman/app/icons/icon_128x128.png Exec=/opt/Postman/Postman Terminal=false Categories=Application; 保存退出即可生效。\n最后 alt+space 输入postman即可搜索到\n","date":"2023-10-14T14:07:10+08:00","permalink":"/p/2310014/","title":"Linux下kde环境将应用程序添加快捷方式和全局搜索"},{"content":"简介 之前介绍过一个免翻使用 chatgpt 接口的项目 Pandora，但是呢，这个项目的代理是由项目作者提供的，访问比较慢，界面比较朴实，体验感一般\n这个项目可以一键免费部署你的私人 ChatGPT 网页应用，支持 Claude, GPT4 \u0026amp; Gemini Pro 模型。\n源码：https://github.com/Yidadaa/ChatGPT-Next-Web\n预览 部署 Docker docker-compose.yml\n1 2 3 4 5 6 7 8 9 10 11 12 version: \u0026#39;3.9\u0026#39; services: chatgpt-next-web: image: yidadaa/chatgpt-next-web container_name: chatgpt-next-web environment: - CODE=your_password - OPENAI_API_KEY=your_api_key - BASE_URL=api_url ports: - \u0026#39;3000:3000\u0026#39; restart: unless-stopped CODE：访问密钥 OPENAI_API_KEY：OpenAI API key BASE_URL：OpenAI API URL 启动容器\n1 docker compose up -d vercel 克隆仓库，新建项目，选中 chatgpt-next-web\n环境变量\nOPENAI_API_KEY\n1 sk-xxxx BASE_URL\n1 https://api.openai.com CUSTOM_MODELS\n自定义模型\n1 -all,+gemini-2.5-flash-preview-05-20,+gemini-2.5-pro-preview-05-06,+gemini-2.0-flash,+gemini-2.0-flash-preview-image-generation,+gemini-2.0-flash-lite,+gemini-1.5-flash,+gemini-1.5-flash-8b,+gemini-1.5-pro,+gemini-embedding-exp,+imagen-3.0-generate-002,+veo-2.0-generate-001,+gemini-2.0-flash-live-001 GOOGLE_URL\n1 https://generativelanguage.googleapis.com GOOGLE_API_KEY\n1 asdfasfg,safdasfa CODE\n访问密码\n1 code1,code2 STABILITY_API_KEY\n1 sk-xxxxx DEFAULT_MODEL\n1 gemini-2.0-flash 接口 GPT_API_free 支持 gpt | deepseek | claude | gemini | grok 等排名靠前的常用大模型。 免费版支持 gpt-4o，gpt-4.1 一天 5 次；支持 deepseek-r1, deepseek-v3 一天 30 次，支持 gpt-4o-mini，gpt-3.5-turbo，gpt-4.1-mini，gpt-4.1-nano 一天 200 次。 与官方完全一致的接口标准，兼容各种软件/插件。 支持流式响应。 国内线路使用动态加速，体验远优于使用代理连接官方。 无需科学上网，国内环境直接可用。 个人完全免费使用。 协议统一使用 openai 标准协议，其他厂商模型仅需更换模型名称，接入便捷 🚀申请领取内测免费 API Key 免费版支持 deepseek, gpt-3.5-turbo, embedding, gpt-4o-mini, gpt-4o。 转发 Host1: https://api.chatanywhere.tech (国内中转，延时更低) 转发 Host2: https://api.chatanywhere.org (国外使用) 可以使用的 API 模型\n1 2 3 4 5 6 7 8 9 gpt-4o gpt-4.1 deepseek-r1 deepseek-v3 gpt-4o-mini gpt-3.5-turbo gpt-4.1-mini gpt-4.1-nano embedding 配置 chat-next-web 项目使用，添加 CUSTOM_MODELS变量\n1 CUSTOM_MODELS=-all,gpt-4.1-mini,gpt-4o,gpt-4.1,deepseek-r1,deepseek-v3,gpt-4o-mini,gpt-3.5-turbo,gpt-4.1-nano,embedding 添加默认模型 DEFAULT_MODEL\n1 DEFAULT_MODEL=gpt-4.1-mini ","date":"2023-10-13T14:07:10+08:00","permalink":"/p/2310013/","title":"ChatGPT-Next-Web，一键部署AI大模型网页客户端"},{"content":"前言 每次装新系统都要网上搜各种换仓库镜像源的教程，有的还不一定准确，自己总结下，免得到处翻找\n我一般用的是 Debian 系统，Centos 因为变得不再稳定，所以我已不再使用，如果你用的是 Debian 系，应该也适合你，如 Ubuntu。\n以下教程都是在 root 用户使用，新用户还需要编辑 sudoer 文件，太麻烦了，索性直接用 roo t用户，不过便于以后使用，以后可能普通用户也有换源的需求，有的命令也加上 sudo\n查看自己的 Debian 发行版本\n1 2 3 4 cat /etc/issue # 或者 cat /proc/version 本次教程发行版本是 Debian 12 (bookworm)\nDebian 软件源文件所在位置 /etc/apt/sources.list\n修改之前先备份\n1 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 清华源 官方帮助地址：https://mirrors.tuna.tsinghua.edu.cn/help/debian/\nStep 1 新系统更新软件缓存包时会用到 官方安全更新软件源，国内网络问题，所以会直接卡住，所以先使用清华源更新，更新后再换回来\n1 2 # 编辑 /etc/apt/sources.list sudo vi /etc/apt/sources.list 快捷键：\nhome键：光标跳转到行首 dG：删除全部内容 在官网选择好对应的版本和内容如下：\n是否使用 HTTPS：否 是否使用 sudo：是 Debian 版本：Debian 12 (bookworm) 启用源码镜像：否 使用官方安全更新软件源：否 将复制的内容粘贴到终端\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware deb http://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware # deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware # # deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware 退出，更新缓存\n1 2 3 4 sudo apt update # 这一步安装好vim，便于后续使用 sudo apt install vim Step 2（可选） Debian Buster 以上版本默认支持 HTTPS 源，所以可选。\n安装：\napt-transport-https ca-certificates 1 sudo apt install apt-transport-https ca-certificates Step 3 类似于step1，选择的内容则有所不同\n是否使用 HTTPS：==是== 是否使用 sudo：是 Debian 版本：Debian 12 (bookworm) 启用源码镜像：否 使用官方安全更新软件源：==是== 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 编辑 /etc/apt/sources.list sudo vim /etc/apt/sources.list # 删除全部内容，粘贴重新复制的内容 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware # # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware # deb-src https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware 更新缓存\n1 sudo apt update 现在就可以自由安装软件了。\n中科大 1 sudo sed -i \u0026#39;s/deb.debian.org/mirrors.ustc.edu.cn/g\u0026#39; /etc/apt/sources.list 阿里云 参考地址：https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.7fb11b11uZIZXw\nDebian10 此源为阿里云的云服务器默认配置，使用阿里云镜像站的源下载速度很慢，不知为何。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ## Note, this file is written by cloud-init on first boot of an instance ## modifications made here will not survive a re-bundle. ## if you wish to make changes you can: ## a.) add \u0026#39;apt_preserve_sources_list: true\u0026#39; to /etc/cloud/cloud.cfg ## or do the same in user-data ## b.) add sources in /etc/apt/sources.list.d ## c.) make changes to template file /etc/cloud/templates/sources.list.debian.tmpl ### # See http://www.debian.org/releases/stable/i386/release-notes/ch-upgrading.html # for how to upgrade to newer versions of the distribution. deb http://mirrors.cloud.aliyuncs.com/debian/ bullseye main contrib non-free deb http://mirrors.cloud.aliyuncs.com/debian/ bullseye-updates main contrib non-free deb http://mirrors.cloud.aliyuncs.com/debian/ bullseye-proposed-updates main non-free contrib deb http://mirrors.cloud.aliyuncs.com/debian/ bullseye-backports main non-free contrib ## Major bug fix updates produced after the final release of the ## distribution. deb-src http://mirrors.cloud.aliyuncs.com/debian/ bullseye-updates main contrib non-free deb-src http://mirrors.cloud.aliyuncs.com/debian/ bullseye main contrib non-free deb-src http://mirrors.cloud.aliyuncs.com/debian/ bullseye-proposed-updates main contrib non-free deb-src http://mirrors.cloud.aliyuncs.com/debian/ bullseye-backports main contrib non-free deb http://mirrors.cloud.aliyuncs.com/debian-security/ bullseye-security main non-free contrib deb-src http://mirrors.cloud.aliyuncs.com/debian-security/ bullseye-security main non-free contrib ## Uncomment the following two lines to add software from the \u0026#39;backports\u0026#39; ## repository. ## ## N.B. software from this repository may not have been tested as ## extensively as that contained in the main release, although it includes ## newer versions of some applications which may provide useful features. ","date":"2023-10-12T14:07:10+08:00","permalink":"/p/2310012/","title":"Debian软件源之国内镜像源"},{"content":"linux原生版微信 linux上的微信版本今天发现优麒麟的适配比较好\n下载地址：点此跳转\n安装\n1 sudo dpkg -i 下载的安装包 引用自 未公开发行的Linux版微信：\n其实早就已经有原生态的微信，但是没有公开的发行。我是在阿里的源里面 \u0026gt; 找的原生微信。功能比较简陋，但是可以使用，已经升级几个版本了。有兴趣的可以去下载。 下载链接： https://mirrors.aliyun.com/ubuntukylin/pool/partner/weixin_2.1.4_amd64.deb?spm=a2c6h.25603864.0.0.7ead34376Zfwrf\nlinux wine版微信 上述是一个原生版本的微信，功能呢相对较少。\n除此之外，星火商店还有个wine版本的微信，功能趋近于windows平台。\n可以通过下载星火商店来安装wine版本的微信\n星火商店地址：https://spark-app.store\n","date":"2023-10-11T14:07:10+08:00","permalink":"/p/2310011/","title":"Debian安装微信"},{"content":"官网：1.1.1.1\n安装 Debian The supported releases are:\nBookworm (12) Bullseye (11) Buster (10) Stretch (9) Add cloudflare gpg key\n1 curl https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg Add this repo to your apt repositories echo \u0026ldquo;deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main\u0026rdquo; | sudo tee /etc/apt/sources.list.d/cloudflare-client.list\nInstall sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install cloudflare-warp\n","date":"2023-10-10T14:07:10+08:00","permalink":"/p/2310010/","title":"Debian下使用warp"},{"content":"apt默认只有jdk17版本了,安装了jdk17之后，再安装jdk8\njdk17 1 sudo apt install openjdk-17-jdk jdk8 jdk-8，oracle的版本\n现在下载需要登陆，点此跳转页面选择版本下载\n下载好了之后，解压\n1 sudo tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/lib/jvm/ 注册\n1 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_381/bin/java 1 设置环境变量\n1 sudo vim /etc/profile.d/java.sh 1 2 export PATH=$PATH:/usr/lib/jvm/jdk1.8.0_381/bin/ export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_381/ 1 source /etc/profile.d/java.sh 切换版本 1 sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_381/bin/java ","date":"2023-10-09T14:07:10+08:00","permalink":"/p/2310009/","title":"Debian12安装JDK17和JDK8"},{"content":"apt默认只有jdk17版本了,安装了jdk17之后，再安装jdk8\njdk17 1 sudo apt install openjdk-17-jdk jdk8 jdk-8，oracle的版本\n现在下载需要登陆，点此跳转页面选择版本下载\n下载好了之后，解压\n1 sudo tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/lib/jvm/ 注册\n1 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_381/bin/java 1 设置环境变量\n1 sudo vim /etc/profile.d/java.sh 1 2 export PATH=$PATH:/usr/lib/jvm/jdk1.8.0_381/bin/ export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_381/ 1 source /etc/profile.d/java.sh 切换版本 1 sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_381/bin/java ","date":"2023-10-09T14:07:10+08:00","permalink":"/p/2310009/","title":"Debian12或者Linux安装JDK17和JDK8"},{"content":"准备 安装之前先确保环境的干净，查看数据库安装的情况\n1 dpkg -l | grep -E \u0026#39;(mysql|maria)\u0026#39; 根据上述命令的输出情况卸载他们，一般 debian 默认安装了 mariadb\n1 sudo apt purge 软件包名字 删除配置文件\n1 sudo rm -rf /etc/mysql /var/lib/mysql 安装 官网下载地址：https://downloads.mysql.com/archives/community/\n选择与系统最接近的版本\nDebian 11\nV8.0.x: https://downloads.mysql.com/archives/get/p/23/file/mysql-server_8.0.33-1debian11_amd64.deb-bundle.tar Debain12\nV8.4.x: https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-server_8.4.3-1debian12_amd64.deb-bundle.tar 命令行下载\n1 2 3 mkdir mysql \u0026amp;\u0026amp; cd ./mysql wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_8.0.34-1debian11_amd64.deb-bundle.tar 解压 mysql\n1 tar -xvf mysql-server_8.0.34-1debian11_amd64.deb-bundle.tar 安装 mysql\n由于每个人的环境都不一样，关于 mysql 的依赖需求，下面的教程不一定包含全部，如果没有涉及到，请自行上网搜索解决\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 安装有依赖要求，所以按照顺序安装 sudo dpkg -i mysql-community-client-plugins_8.0.34-1debian11_amd64.deb # 如果提示缺少 libssl1.1， 请到这里下载：https://packages.debian.org/zh-cn/buster/libssl1.1，下载对应的版本，下载完成之后安装 # 这里贴出快速下载地址，可使用wget下载： # http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1n-0+deb10u6_amd64.deb sudo dpkg -i mysql-community-client-core_8.0.34-1debian11_amd64.deb sudo dpkg -i mysql-common_8.0.34-1debian11_amd64.deb sudo dpkg -i mysql-community-client_8.0.34-1debian11_amd64.deb sudo dpkg -i mysql-client_8.0.34-1debian11_amd64.deb # 这一步可能会缺少libmecab2 # 所以安装 libmecab2 # sudo apt install libmecab2 sudo dpkg -i mysql-community-server-core_8.0.34-1debian11_amd64.deb # 这一步会有界面提示输入root密码，两次输入密码之后，选择 recommed 推荐的密码插件认证（8.0） sudo dpkg -i mysql-community-server_8.0.34-1debian11_amd64.deb 使用 system 服务管理 mysql 状态\n1 2 3 4 5 6 7 8 # 查看mysql的状态，默认应该是启动的 systemctl status mysql # 启动mysql sudo systemctl start mysql # 关闭mysql sudo systemctl stop mysql 卸载 停止 MySQL 服务\n1 sudo systemctl stop mysql 卸载组件\n1 2 3 4 5 6 7 # 按照顺序卸载 sudo dpkg -r mysql-community-server sudo dpkg -r mysql-community-server-core sudo dpkg -r mysql-client sudo dpkg -r mysql-community-client sudo dpkg -r mysql-common sudo dpkg -r mysql-community-client-core 删除相关文件和文件夹\n1 2 3 4 sudo rm -rf /etc/mysql/ sudo rm -rf /var/lib/mysql/ sudo rm -rf /usr/lib/mysql/ sudo rm -rf /var/log/mysql ","date":"2023-10-08T14:07:10+08:00","permalink":"/p/2310008/","title":"Debian安装，卸载MySQL8.0.x"},{"content":"debian12 安装中文输入法\n如果安装系统的时候选择是中文安装，默认就会安装好中文输入法，因为后面我安装rime,不熟悉卸载了fcitx5导致默认的中文失效，发现rime配置太麻烦，默认还不好用，所以打算又重新安装默认的中文输入法，但一直没搞对，后来终于解决了，这里介绍一下经验\n在使用fcitx5的前提下，安装中文输入法。本文不涉及字体等等\n如果没有安装dcitx5的按照以下安装:\nsudo apt update sudo apt install fcitx5\n正确步骤 实际上，中文输入法有个插件的，安装正确的插件才会恢复到默认的状态。\n首先建议把系统语言设置为中文，在设置中文输入法有大用！！如果需要设置为英文，再换回来。\n在终端直接用apt搜索fcitx5相关的中文插件，如下所示：\n1 apt list | grep fcitx5 | grep chinese 输出如下：\n1 2 3 4 5 6 WARNING: apt does not have a stable CLI interface. Use with caution in scripts. fcitx5-chinese-addons-bin/stable,now 5.0.16-1 amd64 [installed,automatic] fcitx5-chinese-addons-bin/stable 5.0.16-1 i386 fcitx5-chinese-addons-data/stable,stable,now 5.0.16-1 all [installed,automatic] fcitx5-chinese-addons/stable,stable,now 5.0.16-1 all [installed] 可以看到有 fcitx5-chinese-addons这个选项，安装它\n1 sduo apt install fcitx5-chinese-addons 安装完就已经安装好了中文输入法，包含一些如拼音，五笔等等。到这里在设置里选择输入法为拼音就好了，重启。就这么简单。\n网上答案质量层次不齐，害人不浅，搞死我了。。。\n附录 这里提供其中的一个错误实例，供参考，安装后都用不了： sudo apt install fcitx5-pinyin\n","date":"2023-10-07T14:07:10+08:00","permalink":"/p/2310007/","title":"debian12安装中文输入法"},{"content":"本文列举安装并使用的的一些软件，基于debian12，debain12有很大的更新，使用wayland替代了x11，本文编辑时，可能好多软件没适配，体验感稍差。\n本文将持续更新\nDebian 官方指南：Debian 系统中可用的软件\n浏览器 Firefox ESR 默认预装，感觉可以，更新频率比较慢\nFirefox 更新速度较快，有很多Firefox ESR没有的新功能\nGoogle chrome Brave https://brave.com/linux/\n1 2 3 4 5 6 7 8 9 sudo apt install curl sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg echo \u0026#34;deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main\u0026#34;|sudo tee /etc/apt/sources.list.d/brave-browser-release.list sudo apt update sudo apt install brave-browser 下载工具 Free Download Manager 截止本文，我觉得是linux上最好的下载工具\n更新：推荐使用 gopeed\ngopeed https://github.com/GopeedLab/gopeed\nXDM 很混乱，感觉好久没怎么更新了，体验感较差\n社交 QQ 通过官网下载安装即可\n微信 推荐使用deepin-wechat，分辨率有问题，能尽量避免不用就不用吧，体验感很差\n官方已推出linux测试版，通过这个仓库可以下载：\nhttps://github.com/lovechoudoufu/wechat_for_linux\n播放器 VLC mpv 上手有一定难度，配置文件可备份，安装后即可使用\n个人配置仓库：https://github.com/muyiacc/mpv-config\nzyplayer 可以用来看影视\n音乐 LX Music 推荐，跨平台使用，可下载，但是界面来说，我感觉一般，播放没有列表选择，本地音乐支持不好，主要用来听网络上的歌曲\n可以使用网易云的歌单\nSpotify 官方教程：https://www.spotify.com/us/download/linux/\n1 2 curl -sS https://download.spotify.com/debian/pubkey_6224F9941A8AA6D1.gpg | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/spotify.gpg echo \u0026#34;deb http://repository.spotify.com stable non-free\u0026#34; | sudo tee /etc/apt/sources.list.d/spotify.list 1 sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install spotify-client 去广告脚本\n1 bash \u0026lt;(curl -sSL https://spotx-official.github.io/run.sh) Amberol 这是一款本地播放器，颜值高，Kde系通过 Flathub 安装\n1 flatpak install flathub io.bassi.Amberol 编辑器 Typora 教程：https://www.seektao.cc/archives/debian-typora-activation\n新版教程：https://www.seektao.cc/archives/202406151533\nObsidian 感觉怎么说呢，还是没有typora用的习惯\n神器，已作为我的主力编辑markdown的软件\nSublime Text https://www.sublimetext.com/docs/linux_repositories.html\n1 2 3 4 5 6 wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/sublimehq-archive.gpg \u0026gt; /dev/null echo \u0026#34;deb https://download.sublimetext.com/ apt/stable/\u0026#34; | sudo tee /etc/apt/sources.list.d/sublime-text.list sudo apt-get update sudo apt-get install sublime-text 编程 Jetbrains Toolbox 推荐，使用它安装其他jetbrains家族的软件，可以解决分辨率的问题，而且安装起来也比较方便。\n而且，学生免费\nNavicat 好看是好看，就是激活太麻烦了，不如用 Jetbrains 的Data Grip\n更新：Navicat推出了 lite版本，个人免费使用\n录屏 OBS Studio 推荐，跨平台，又是个推流工具\n安装方式：https://github.com/obsproject/obs-studio/wiki/unofficial-linux-builds#debian\n1 2 3 sudo apt update sudo apt install ffmpeg sudo apt install obs-studio SSH Termius 跨平台，美观，同步收费\nTabby 开源，可同步配置文件\n远程控制 ruskdesk https://github.com/rustdesk/rustdesk/releases/tag/1.2.3\n1 wget https://github.com/rustdesk/rustdesk/releases/download/1.2.3/rustdesk-1.2.3-x86_64.deb 截图 eSearch linux下的截图软件，可支持搜索，识别文字，还可以，但是debian12钉图会导致输入法失效，不知道你用的时候解决了没\ngithub可以搜索到\nflameshot debian12也有问题，功能感觉不如eSearch强大，不过也还可以\nsnipaste 没错，windows上的那个软件出linux版本了\nhttps://www.snipaste.com/\n虚拟机 Vmware 卸载方式，apt找不到设备，通过官网查到\n1 2 sudo su - vmware-installer -u vmware-workstation 推荐\n新装机器安装VMware后，新建虚拟机有问题，现在更推荐VirtualBox\nVirtualBox Oracle出品。\n其他 Thunderbird 聚合邮件工具\n","date":"2023-10-06T14:07:10+08:00","permalink":"/p/2310006/","title":"Debian12下的软件清单"},{"content":"安装 安装 Navicat Promium，最新版本是16，使用官网提供的下载方式\n1 2 3 4 5 6 7 cd ~ wget https://www.navicat.com/download/direct-download?product=navicat16-premium-en.AppImage\u0026amp;location=1 chmod +x navicat16-premium-en.AppImage ./navicat16-premium-en.AppImage 激活 Github开源的地址：点此跳转\n以下命令你只需复制粘贴即可\n提取AppImage 将下载的 AppImage 文件内容全部提取到一个文件夹中\n1 2 3 4 5 6 7 8 mkdir navicat16-premium-cs mount -o loop ./navicat16-premium-cs.AppImage ./navicat16-premium-cs sudo mount -o loop ./navicat16-premium-cs.AppImage ./navicat16-premium-cs # 这一步需要等待一会 cp -r ./navicat16-premium-cs ./navicat16-premium-cs-patched 编译 前提安装了\ncapstone keystone rapidjson 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo apt update # 安装 capstone sudo apt install libcapstone-dev # 安装 keystone sudo apt install cmake git clone https://github.com/keystone-engine/keystone.git ~/.keystone cd ~/.keystone mkdir build cd build ../make-share.sh sudo make install sudo ldconfig # 安装 rapidjson sudo apt install rapidjson-dev 开始编译\n1 2 3 4 5 git clone https://github.com/JohnHubcr/navicat-keygen ~/.navicat-keygen cd ~/.navicat-keygen make all 重置 ","date":"2023-10-05T14:07:10+08:00","permalink":"/p/2310005/","title":"Debian12下的Navicat-Promium安装和激活(未完成)"},{"content":"命令英文版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 Usage: warp-cli [OPTIONS] \u0026lt;COMMAND\u0026gt; Commands: register Register with the WARP API, replacing any existing registration (Must be run before first connection!) teams-enroll Enroll with Cloudflare for Teams delete Delete current registration rotate-keys Generate a new key-pair, keeping the current registration status Ask the daemon to send the current status warp-stats Retrieve the stats for the current WARP connection warp-dns-stats Retrieve the DNS stats for the current WARP connection settings Retrieve the current application settings connect Connect to WARP whenever possible [aliases: enable-always-on] disconnect Disconnect from WARP [aliases: disable-always-on] disable-wifi Automatically disable WARP on Wi-Fi networks (disabled for Zero Trust customers) enable-wifi Allow WARP on Wi-Fi networks (disabled for Zero Trust customers) disable-ethernet Automatically disable WARP on ethernet networks (disabled for Zero Trust customers) enable-ethernet Allow WARP on ethernet networks (disabled for Zero Trust customers) add-trusted-ssid Add a trusted Wi-Fi network for which WARP will be automatically disconnected remove-trusted-ssid Remove a trusted Wi-Fi network exclude-private-ips Exclude private IP ranges from tunnel enable-dns-log Enable DNS logging (Use with the -l option) disable-dns-log Disable DNS logging account Display the account associated with the current registration devices Display the list of devices associated with the current registration network Display the current network information get-virtual-networks List the available virtual networks set-virtual-network Set the currently connected virtual network via the id from get-virtual-networks set-mode Set the mode set-families-mode Set the families mode set-license Attach the current registration to a different account using a license key set-gateway Force the app to use the specified Gateway ID for DNS queries clear-gateway Clear the Gateway ID set-custom-endpoint Force the client to connect to the specified IP:PORT endpoint (Zero Trust customers must run this command as a privileged user) clear-custom-endpoint Remove the custom endpoint setting add-excluded-route Add an excluded IP remove-excluded-route Remove an excluded IP get-excluded-routes Get the list of excluded routes get-included-routes Get the list of included routes get-excluded-hosts Get the list of excluded hosts get-included-hosts Get the list of included hosts add-excluded-host Add an excluded host remove-excluded-host Remove an excluded host add-fallback-domain Add a domain that should be resolved with the fallback resolver instead of WARP\u0026#39;s remove-fallback-domain Stop a domain from being resolved with the fallback resolver get-fallback-domains Get the list of domains that go to the fallback resolver restore-fallback-domains Restore the list of fallback resolver domains to its default value get-device-posture Get the current device posture override Temporarily override MDM policies that require the client to stay enabled set-proxy-port Set the listening port for WARP proxy (127.0.0.1:{port}) is-mode-switch-allowed Outputs true if Teams users should be able to change connection mode, or false if not reset-settings Restore settings to default get-organization Get the name of the Teams organization currently in settings access-reauth Force refresh authentication with Cloudflare Access get-support-url Get the support url for the current Teams organization get-pause-end Retrieve the pause end time get-override-end Retrieve the admin override end time disable-connectivity-checks Disable the runtime connectivity checks enable-connectivity-checks Enable the runtime connectivity checks dump-excluded-routes Get split tunnel routing dump. For include-only mode, this shows routes NOT included get-alternate-network Get the name of the currently detected alternate network, if any get-dex-data Get the most recently uploaded DEX data. Returns the most recent test for each dex metric help Print this message or the help of the given subcommand(s) Options: -l, --listen Listen for status changes and DNS logs (if enabled) --accept-tos Accept the Terms of Service agreement -v, --verbose... Enable verbose output. Multiple \u0026#34;v\u0026#34;s adds more verbosity -h, --help Print help -V, --version Print version 命令中文版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 用法：warp-cli [选项] \u0026lt;命令\u0026gt; 命令： register 注册到 WARP API，替换任何现有的注册（必须在首次连接之前运行！） teams-enroll 注册到 Cloudflare for Teams delete 删除当前注册 rotate-keys 生成新的密钥对，保留当前注册 status 请求守护进程发送当前状态 warp-stats 检索当前 WARP 连接的统计信息 warp-dns-stats 检索当前 WARP 连接的 DNS 统计信息 settings 检索当前应用程序设置 connect 尽可能连接到 WARP [别名：enable-always-on] disconnect 断开与 WARP 的连接 [别名：disable-always-on] disable-wifi 在 Wi-Fi 网络上自动禁用 WARP（对于 Zero Trust 客户禁用） enable-wifi 允许在 Wi-Fi 网络上使用 WARP（对于 Zero Trust 客户禁用） disable-ethernet 在以太网网络上自动禁用 WARP（对于 Zero Trust 客户禁用） enable-ethernet 允许在以太网网络上使用 WARP（对于 Zero Trust 客户禁用） add-trusted-ssid 添加一个受信任的 Wi-Fi 网络，WARP 将自动断开连接 remove-trusted-ssid 移除一个受信任的 Wi-Fi 网络 exclude-private-ips 从隧道中排除私有 IP 范围 enable-dns-log 启用 DNS 日志记录（与 -l 选项一起使用） disable-dns-log 禁用 DNS 日志记录 account 显示与当前注册关联的帐户 devices 显示与当前注册关联的设备列表 network 显示当前网络信息 get-virtual-networks 列出可用的虚拟网络 set-virtual-network 设置当前连接的虚拟网络（使用 get-virtual-networks 返回的 ID） set-mode 设置模式 set-families-mode 设置家庭模式 set-license 使用许可证密钥将当前注册关联到不同的帐户 set-gateway 强制应用程序使用指定的网关 ID 进行 DNS 查询 clear-gateway 清除网关 ID set-custom-endpoint 强制客户端连接到指定的 IP:PORT 端点（Zero Trust 客户必须以特权用户身份运行此命令） clear-custom-endpoint 删除自定义端点设置 add-excluded-route 添加一个被排除的 IP remove-excluded-route 移除一个被排除的 IP get-excluded-routes 获取被排除的路由列表 get-included-routes 获取包含的路由列表 get-excluded-hosts 获取被排除的主机列表 get-included-hosts 获取包含的主机列表 add-excluded-host 添加一个被排除的主机 remove-excluded-host 移除一个被排除的主机 add-fallback-domain 添加一个应使用回退解析器而不是 WARP 进行解析的域名 remove-fallback-domain 停止使用回退解析器解析域名 get-fallback-domains 获取使用回退解析器的域名列表 restore-fallback-domains 将回退解析器域名列表恢复为默认值 get-device-posture 获取当前设备姿态 override 临时覆盖需要客户端保持启用的 MDM 策略 set-proxy-port 设置 WARP 代理的监听端口（127.0.0.1:{port}） is-mode-switch-allowed 如果 Teams 用户可以更改连接模式，则输出 true；如果不可以，则输出 false reset-settings 恢复设置为默认值 get-organization 获取当前设置中的 Teams 组织名称 access-reauth 强制刷新与 Cloudflare Access 的身份验证 get-support-url 获取当前 Teams 组织的支持网址 get-pause-end 检索暂停结束时间 get-override-end 检索管理员覆盖结束时间 disable-connectivity-checks 禁用运行时连接性检查 enable-connectivity-checks 启用运行时连接性检查 dump-excluded-routes 获取分隔隧道路由转储。对于仅包含模式，显示未包含的路由 get-alternate-network 获取当前检测到的备用网络名称（如果有） get-dex-data 获取最近上传的 DEX 数据。返回每个 dex 指标的最新测试 help 打印此消息或给定子命令的帮助信息 选项： -l, --listen 监听状态变化和 DNS 日志（如果已启用） --accept-tos 接受服务条款协议 -v, --verbose... 启用详细输出。多个 \u0026#34;v\u0026#34; 增加更多详细程度 -h, --help 打印帮助信息 -V, --version 打印版本 ","date":"2023-10-04T14:07:10+08:00","permalink":"/p/2310004/","title":"Debain12安装cloudflare-warp"},{"content":"Shell 概述 bash vs zsh\nbash:\nbash 作为众多 linux 发行版的默认shell，和它打交道的实在太频繁了。但是它有些不足的地方：\n别名很多需要自己定制（ Debian12 就连ll都没有） 默认样式太简陋，所以我曾经一度换到 zsh zsh： zsh 很强大！拥有超多的插件，增强的命令补全，界面美化等等优点。\n但是！使用 zsh 一段时间之后，我发现也有些问题，比如：\nzsh 下使用 reboot 没找到是肿么回事？也可能是我菜，最后还得自己把命令添加到.zshrc中，就是很多系统下 bash 换到 zsh 会找不到 把环境变量放到 /etc/profile或者 /etc/profile.d 文件夹下会不识别，导致一系列问题。 这就违背了初心，所以，既然 bash 是 众多 linux 发行版的默认 shell，那么是否有 bash 的增强工具呢？\n今天的主角 bash-it 就是我们需要的东西！\n简介 Bash-it 是一个为 Bash 3.2+ 版本提供的社区命令和脚本集合。（这也是对 oh-my-zsh 的无耻模仿 😃）\n它包括自动补全、主题、别名、自定义函数，以及一些来自 Steve Losh 的代码片段，等等。\nBash-it 为您日常工作中使用、开发和维护 shell 脚本和自定义命令提供了一个可靠的框架。如果您经常使用 Bourne Again Shell（Bash），并且一直在寻找一种简单的方法来管理这些小脚本和别名，那么 Bash-it 非常适合您！ 停止污染您的 ~/bin 目录和 .bashrc 文件，fork/clone Bash-it 并开始修改吧。\n源码：https://github.com/Bash-it/bash-it 官网：https://bash-it.readthedocs.io/en/latest/\n安装 （1）克隆仓库\n官方版本\n1 git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it 我修改过后的版本（增加主题、修改了某些命令）\n1 git clone --depth=1 https://github.com/muyiacc/bash-it.git ~/.bash_it （2）安装\n1 ~/.bash_it/install.sh 这一步需要选择配置 .bashrc的策略：\n选择是的话会将 bash_it 的配置进行追加 否的话，会覆盖 .bashrc，并将 .bashrc复制一份为 .bashrc.bak 的备份 如果不是纯净的系统，环境中已经有一些软件的配置，选择 是\n安装之后，新开一个终端查看是否生效\n卸载 如果不想要了，跟着如下步骤卸载\n1 cd $BASH_IT \u0026amp;\u0026amp; ./uninstall.sh 主题 默认主题是 bobby\n默认主题比较花哨，包含的信息容易影响注意力，所以我换成了内置的主题 bakke，看着简洁很多又不失美感\n每次安装更换主题已经厌烦了，已经习惯了默认配置，果然默认就是最好的！\n更换主题的方式在 .bashrc文件下，搜索 BASH_IT_THEME关键字，更改后面的内容就可以了，如下：\n1 export BASH_IT_THEME=\u0026#39;bakke\u0026#39; 也可以使用这个命令快速替换\n1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;bakke\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 如果你使用的是我修改过后的版本，可以使用主题 seektao，这个主题未提交到主项目（提交很麻烦~）\n1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;seektao\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 样式如下： 关于其他主题，你可以打开这个网址进行查找和预览 https://bash-it.readthedocs.io/en/latest/themes-list/#list-of-themes\n更多主题：\n1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;nwinkler\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;bakke\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;bobby\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;atomic\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 1 2 sed -i \u0026#39;s/^export BASH_IT_THEME=.*/export BASH_IT_THEME=\u0026#34;demula\u0026#34;/g\u0026#39; ~/.bashrc source ~/.bashrc 别名 bash-it 配置了很多别名，但是需要手动启用\n别名配置文件在\n1 ~/.bash_it/aliases/available 启用别名的方式为\n1 bash-it enable alias 更多 关于更多的信息可以查看 Github或者 Bash-it 官网\n","date":"2023-10-02T14:07:10+08:00","permalink":"/p/2310002/","title":"增强的bash命令行工具：bash-it"},{"content":"archlinux自动挂载windows的不同盘符（驱动器）\n1. 前言 1.1. 需求 双系统windows和archlinux，有时候在windows下编写的代码，在切换成archlinux后，这时需要编辑windows下的代码，但是使用之前，需要在文件管理器中输入密码，会自动挂载到 /run/media/用户名目录下，挂载的名字是windows驱动器的命名。一般来说，编辑器默认选择打开的目录就是用户家目录。由于挂载的目录不太常用，在打开目录的时候需要手动选择，不太方便。\n1.2. 解决思路 可以挂载到用户家目录下。在用户家目录创建一个以windows为名的目录，接着在windows 目录下创建驱动器的目录，将不同的驱动器挂载到相应的目录，如c盘驱动器的名字是base，d盘驱动器的名字是soft，d盘驱动器的名字是data，在windows目录下分别创建 base、soft、data三个目录。并分别挂载到它们。\n2. 解决过程 2.1. 创建目录 首先在家目录下创建挂载的目录点\n1 mkdir -p ~/windows/base \u0026amp;\u0026amp; mkdir -p ~/windows/soft \u0026amp;\u0026amp; mkdir -p ~/windows/data 挂载点分别为\n1 2 3 4 5 /home/koko/windows/base /home/koko/windows/soft /home/koko/windows/data # 以上目录分别对应着c盘，d盘，e盘 2.2. 安装ntfs-3g 为了解决挂载需要输入密码的问题，需要额外安装一个工具，名字叫做 ntfs-3g\n1 sudo pacman -S ntfs-3g 安装完成之后，编写开机自启的服务文件，放入 /etc/systemd/system/ ，文件名为 windows-mount.service\n1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=Mount Windows Partition After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/mount -a Type=oneshot RemainAfterExit=yes [Install] WantedBy=default.target 保存退出后，启动并开启自启\n1 2 sudo systemctl enable windows-mount.service sudo systemctl start windows-mount.service 2.3. 编辑/etc/fstable文件 自动挂载目录可以编辑/etc/fsable文件，里面包含了挂载的信息，我的文件内容如下\n/etc/fstable\n1 2 3 4 5 6 7 8 9 10 11 12 [root@myarch ~]# cat /etc/fstab # /dev/nvme0n1p6 LABEL=myArch UUID=cea4c38b-f7eb-4690-a35b-d4b6e8506d4d / btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=256,subvol=/@ 0 0 # /dev/nvme0n1p1 UUID=5F77-1EE1 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 # /dev/nvme0n1p6 LABEL=myArch UUID=cea4c38b-f7eb-4690-a35b-d4b6e8506d4d /home btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=257,subvol=/@home 0 0 # /dev/nvme0n1p5 UUID=0ca07983-0116-4006-aa45-04a2abb129e6 none swap defaults 0 0 关于/etc/fatable 文件各列的简单解释\n第一列是挂载的设备（可以填写设备label或者uuid） 第二列是挂载点。（必须是已经存在的目录） 第三列是分区的格式。（如ntfs、btrfs、ext2、ext3、nfs、vfat） 第四列是mount的挂载参数，一般情况下，直接写defaults即可。 第五列的数字表示是否被dump备份，是的话为1，不是为0。 第六列是开机时是否自检磁盘。1，2都表示检测，0表示不检测。但1，2表示不同的优先级，1更高。所以/ 分区必须设为1，而且整个fstab只允许出现一个1，若有多个分区需要检测，那么都设为2。 我们需要的就是在文件的后面继续添加挂载windows的配置\n挂载设备的label或者uuid可以通过blkid查看\n1 2 3 4 5 6 7 [root@myarch ~]# blkid /dev/nvme0n1p5: UUID=\u0026#34;0ca07983-0116-4006-aa45-04a2abb129e6\u0026#34; TYPE=\u0026#34;swap\u0026#34; PARTUUID=\u0026#34;b05fdaf2-9db0-424a-a133-b1874795e894\u0026#34; /dev/nvme0n1p3: LABEL=\u0026#34;soft\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; UUID=\u0026#34;64443273443247D6\u0026#34; TYPE=\u0026#34;ntfs\u0026#34; PARTLABEL=\u0026#34;Basic data partition\u0026#34; PARTUUID=\u0026#34;71911f30-8521-4624-a8e3-1cbac1090f45\u0026#34; /dev/nvme0n1p1: UUID=\u0026#34;5F77-1EE1\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; TYPE=\u0026#34;vfat\u0026#34; PARTLABEL=\u0026#34;EFI system partition\u0026#34; PARTUUID=\u0026#34;3589701f-9bee-4c72-b2e6-79e486eecff0\u0026#34; /dev/nvme0n1p6: LABEL=\u0026#34;myArch\u0026#34; UUID=\u0026#34;cea4c38b-f7eb-4690-a35b-d4b6e8506d4d\u0026#34; UUID_SUB=\u0026#34;06d834ba-5c70-4c39-b750-245fd8b3a4a0\u0026#34; BLOCK_SIZE=\u0026#34;4096\u0026#34; TYPE=\u0026#34;btrfs\u0026#34; PTTYPE=\u0026#34;PMBR\u0026#34; PARTUUID=\u0026#34;cd79b562-bd9c-e04e-b539-e2eedee44d44\u0026#34; /dev/nvme0n1p4: LABEL=\u0026#34;data\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; UUID=\u0026#34;F23E39943E395339\u0026#34; TYPE=\u0026#34;ntfs\u0026#34; PARTLABEL=\u0026#34;Basic data partition\u0026#34; PARTUUID=\u0026#34;8ee13aea-ebaa-4b0f-bf71-d30653055be3\u0026#34; /dev/nvme0n1p2: LABEL=\u0026#34;base\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; UUID=\u0026#34;3E2A25472A24FE11\u0026#34; TYPE=\u0026#34;ntfs\u0026#34; PARTLABEL=\u0026#34;Basic data partition\u0026#34; PARTUUID=\u0026#34;54d043d7-3703-4fb8-88d1-c288bedba407\u0026#34; 根据以上信息，追加的fstable文件内容为\n1 2 3 4 5 6 7 # windows # base UUID=3E2A25472A24FE11 /home/koko/windows/base ntfs-3g defaults,noauto,x-systemd.automount 0 0 # base UUID=64443273443247D6 /home/koko/windows/soft ntfs-3g defaults,noauto,x-systemd.automount 0 0 # base UUID=F23E39943E395339 /home/koko/windows/d ntfs-3g defaults,noauto,x-systemd.automount 0 0 至此，自动挂载不需要输入密码就完成了！\n","date":"2023-10-01T14:07:10+08:00","permalink":"/p/2310001/","title":"archlinux自动挂载windows的不同盘符（驱动器）"},{"content":" https://myip4.ipip.net https://ddns.oray.com/checkip https://ip.3322.net https://4.ipw.cn ","date":"2023-09-17T14:07:10+08:00","permalink":"/p/2309016/","title":"获取当前公网ip的接口"},{"content":"已经安装的应用 应用名称 安装方式 简介 是否启用 官方地址 是否开源 docker-flare docker-compose 导航页 是 https://github.com/soulteary/docker-flare 是 halo docker-compose 优秀的博客系统 是 https://halo.run/ 是 nginx proxy manager docker-compose nginx的web管理工具 是 https://github.com/NginxProxyManager/nginx-proxy-manager 是 alist docker-compose 网盘聚合工具 是 https://github.com/alist-org/alist 是 cloudreve 程序安装 开源网盘 是 https://github.com/cloudreve/Cloudreve 是 MrDoc docker-compose 在线文档系统 否 https://github.com/zmister2016/MrDoc 是 Jupyter Lab 程序安装 Jupyter Lab 否 教程 http://t.csdn.cn/rocxW / YesPlayMusic docker 高颜值的第三方网易云播放器 是 https://github.com/qier222/YesPlayMusic 是 it-tools docker it人员的工具 是 https://github.com/CorentinTh/it-tools 是 TODO 应用名称 简介 官方地址 koodo-reader 一个跨平台的电子书阅读器 https://github.com/troyeguo/koodo-reader ddns-go 简单好用的DDNS https://github.com/jeessy2/ddns-go ","date":"2023-09-16T14:07:10+08:00","permalink":"/p/2309015/","title":"服务器安装的应用以及TODO"},{"content":"在用git拉取别人的前端项目之后\n通过命令行进入项目的根目录\nnpm install 安装依赖\n然后查看 package.json 文件\n例如：\n1 2 3 4 5 6 7 { \u0026#34;name\u0026#34;: \u0026#34;your-project-name\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;1.0.0\u0026#34;, \u0026#34;scripts\u0026#34;: { \u0026#34;serve\u0026#34;: \u0026#34;vue-cli-service serve\u0026#34; } } 启动vue项目的命令就为 npm run serve\n也就是跟如下代码中有关\n1 2 3 \u0026#34;scripts\u0026#34;: { \u0026#34;serve\u0026#34;: \u0026#34;vue-cli-service serve\u0026#34; } ","date":"2023-09-15T14:07:10+08:00","permalink":"/p/2309014/","title":"对于没有使用过vue的人，如何快速运行其他人的vue项目"},{"content":"简介 为了通过网址远程查看服务器及容器的运行状况，选择了时下最热门的监控方案：Prometheus+node_exporter+Grafana。\n现记录下自己的安装过程。\nPrometheus 官网地址 https://prometheus.io/docs/introduction/overview/\n概述 Prometheus 是一个开源的系统监控和警报工具包，由 SoundCloud 构建，由 Golang 编写，现有非常活跃的开发人员和社区，是一个独立的开源项目，于 2016 年加入了云原生计算基金会，成为继 Kubernetes 之后的第二个托管项目。总结：非常热门+ NB。\n安装 话不多说，开始使用安装之旅。\n1）官网下载页面\nhttps://prometheus.io/download/\n核心组件 prometheus 的最新版下载地址为：\nhttps://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz\n上面的地址为 github，众所周知，因为某些原因，你下载可能会出现网络问题，这里不做解决。\n如果你的系统可直连 github，可以通过如下命令直接下载。\n1 wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz 提示 wget 没安装？\ndebian： sudo apt install wget\ncentos: sudo yum install wget\n2）解压安装\n下载完成之后，解压安装\n解压放到自己熟悉的路径即可。\n1 tar -zxvf prometheus-2.47.0.linux-amd64.tar.gz -C ~/opt/ 修改名字\n1 2 cd ~/opt mv prometheus-2.47.0.linux-amd64 prometheus-2.47.0 在解压的目录下，找到 prometheus.yml 文件，这是 prometheus 的配置文件\n本文只为快速搭建使用，对于配置的含义不做详细解释。\n默认的文件也不需要修改，需要注意的地方是\n1 2 3 4 5 6 7 8 9 scrape_configs: # The job name is added as a label `job=\u0026lt;job_name\u0026gt;` to any timeseries scraped from this config. - job_name: \u0026#34;prometheus\u0026#34; # metrics_path defaults to \u0026#39;/metrics\u0026#39; # scheme defaults to \u0026#39;http\u0026#39;. static_configs: - targets: [\u0026#34;localhost:9090\u0026#34;] 默认的端口是 9090，如果你的端口被占用了，只需要修改上述的端口即可。\n1.3. 启动 因为使用 go 语言编写，编译后的文件 只需要执行解压后的文件 prometheus\n进入解压的目录\n1）前台启动\n1 ./prometheus --config.file=prometheus.yml 2）后台启动\n1 nohup ./prometheus --config.file=prometheus.yml \u0026amp;\u0026gt;\u0026gt; prometheus.log \u0026amp; 上述的命令的含义为：后台启动，错误的日志重定向到标准输出，也就是将所有的日志追加到 prometheus.log 中，prometheus.log 会自动生成\n通过浏览器 ip:端口 就可以访问。\n如果是服务器，需要开放安全组，这里不做介绍。\n关于对 Prometheus 的简单介绍就先到这里。\n2. node_exporter 2.1. 概述 在 Prometheus 的架构设计中，Prometheus Server 主要负责数据的收集，存储并且对外提供数据查询支持。\n实际的监控样本数据的收集则是由 Exporter 完成，因此为了能够监控到某些东西，如主机的 CPU 使用率，我们需要使用到 Exporter。\nPrometheus 周期性的从 Exporter 暴露的 HTTP 服务地址（通常是/metrics）拉取监控样本数据。\n为了能够采集到主机的运行指标如 CPU, 内存，磁盘等信息。我们可以使用 Node Exporter。Node Exporter 同样采用 Golang 编写，并且不存在任何的第三方依赖，只需要下载，解压即可运行。\n下载地址： https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz\n2.2. 安装 1 2 3 4 5 6 7 8 # 下载 wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz # 解压 tar -zxvf node_exporter-1.6.1.linux-amd64 -C ~/opt/ # 修改名字 cd ~/opt/ \u0026amp;\u0026amp; mv node_exporter-1.6.1.linux-amd64 node_exporter-1.6.1 2.3. 启动 直接执行 node_exporter 文件即可\n1 2 3 cd ~/opt/linux-amd64 node_exporter-1.6.1 ./node_exporter 通过控制台打印的信息可以知道，端口为 9100\n浏览器访问 ip:9100 即可访问\n设置开机自启，编写 systemd 服务脚本\n关于如何编写，可以观看这篇文章\nhttps://blog.csdn.net/lu_embedded/article/details/132424115\n服务脚本文件以 .service 结尾，由 Unit、Service 和 Install 三个区块组成，这里提供一个示例\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [Unit] Description=test # 简单描述服务 After=network.target # 描述服务类别，表示本服务需要在network服务启动后在启动 Before=xxx.service # 表示需要在某些服务启动之前启动，After和Before字段只涉及启动顺序，不涉及依赖关系 [Service] Type=forking # 设置服务的启动方式 User=USER # 设置服务运行的用户 Group=USER # 设置服务运行的用户组 WorkingDirectory=/PATH\t# 设置服务运行的路径(cwd) KillMode=control-group # 定义systemd如何停止服务 Restart=no # 定义服务进程退出后，systemd的重启方式，默认是不重启 ExecStart=/start.sh # 服务启动命令，命令需要绝对路径（采用sh脚本启动其他进程时Type须为forking） [Install] WantedBy=multi-user.target # 多用户 创建 service 文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sudo vim /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_export Documentation=https://github.com/prometheus/node_exporter After=network.target [Service] Type=simple User=ecs-user ExecStart=/home/ecs-user/opt/node_exporter-1.6.1/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target 开启自启\n1 2 3 4 5 6 # 查看状态 systemctl status node_exporter # 启动node_exporter systemctl start node_exporter # 开启自启 systemctl enable node_exporter 3. Grafana 3.1 概述 Grafana 是一款采用 Go 语言编写的开源应用，主要用于大规模指标数据的可视化展现\n是网络架构和应用分析中最流行的时序数据展示工具，目前已经支持绝大部分常用的时序数据库。\n官网：https://grafana.com/zh-cn/grafana/\n3.2 安装 个人使用，选择 Standalone Linux Binaries 版本\n1 2 3 4 5 6 7 # 下载 wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.1.linux-amd64.tar.gz # 解压 tar -zxvf grafana-enterprise-10.1.1.linux-amd64.tar.gz -C ~/opt/ # 不用修改名字了，默认为grafana-10.1.1 3.3 启动 进入解压的目录之后\n1 nohup ./bin/grafana-server web \u0026amp;\u0026gt;\u0026gt; grafana.log \u0026amp; 3.4 集成 Prometheus 启动 Grafana 之后，浏览器访问 ip:3000，进入登录界面，默认用户和密码都为 admin\n输出密码之后，会提示修改密码，修改即可。\n完成之后，进入主界面 ，大概如下：\n![image-20230914174457412](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 17-45-17_image-20230914174457412.png)\n3.4.1 配置数据源 按住 Ctrl+K，搜索 data sources，选中 data sources 配置数据源，进入如下界面\n![image-20230914174701933](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 17-47-04_image-20230914174701933.png)\n选择 add new data source ，选择 Prometheus，进入配置\n![image-20230914174847825](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 17-48-49_image-20230914174847825.png)\n这里只需要配置一下 Prometheus server URL，默认没改端口的填入 http://localhost:9090，不要选择 https，滑到最底下，选择 save \u0026amp; test 按钮，如果显示 Successfully queried the Prometheus API，表示对接成功。\n3.4.2 创建仪表盘 Dashboard Ctrl + K，搜索 Dashboards，进入 Dashboards，选择 new dashborad，后续自行探索吧。\n![image-20230914175424008](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 17-54-27_image-20230914175424008.png)\n3.4.3 导入仪表盘 Dashboard Ctrl + K，搜索 Dashboards，进入 Dashboards，选择 Import\n![image-20230914175910755](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 17-59-12_image-20230914175910755.png)\n填入 ID ,Load 即可\n对于如何寻找已经创建好的仪表盘，可在官网寻找 https://grafana.com/grafana/dashboards/\n![image-20230914180001302](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 18-00-03_image-20230914180001302.png)\n这里推荐一个 https://grafana.com/grafana/dashboards/12633-linux/\n填入的 id 为 12633，load 后进入如下界面，选择之前连接的 Prometheus，最后 Import 就大功告成了。\n![image-20230914180651577](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 18-06-53_image-20230914180651577.png)\n最后的展示\n![image-20230914180755078](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-14 18-07-57_image-20230914180755078.png)\n","date":"2023-09-14T14:07:10+08:00","permalink":"/p/2310018/","title":"Prometheus+node_exporter+Grafana实现监控服务器"},{"content":" 本文编辑于 2023-09-15\n作者：muyiacc\nGithub: https://github.com/muyiacc\nCSDN: https://blog.csdn.net/muyiacc\nBlog: https://www.seektao.cc/\n使用环境：Debian11\n1. 前言 在此之前，笔者使用过 Java 编写的 halo博客，这个博客很热门，但是它内存占用很大，\n关于内存占用的情况：\n配合使用MySQL数据库占用大概800M，一个MySQL 服务内存将近300M。可怕~~~~~~~~。\n配合使用 Porstgresql 数据库占用550M内存左右，数据库占用内存大概有40M\n这里插一句，Porstgresql最近也是如日中天的发展。强~\n尽管如此，这对个人使用来说是不友好的，个人服务器资源宝贵，占用太多就不好安装其他服务了，所以需要替换。关于halo占用内存截图如下：\n![image-20230915082648713](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-15 08-27-06_image-20230915082648713.png)\n加上最近在学习Golang，这语言感觉确实强，占用内存极低，效率极高。\n所以在GitHub上找到了一个开源，由Golang编写的博客系统 sonic，安装启动后查看只有50M不到的内存占用，顺道学习 Golang。\n地址 https://github.com/go-sonic/sonic\n这个博客系统已经有 1.7K 的star了 ，应该还不错，今天拿来安装使用使用，接下来开始安装过程吧。\n2. 搭建sonic 截止到笔者安装时期，最新版为1.1.1。\n2.1. 下载 1 wget https://github.com/go-sonic/sonic/releases/download/v1.1.1/sonic-linux-amd64.zip 如果网络不通，请自寻解决办法~~\n2.2. 解压 因为是zip格式，所以需要用 unzip解压，笔者一般接触的都是tar.gz格式，这里解压的时候有坑\n这个坑为：unzip解压缩时会将压缩包的文件列表直接输出，不会自动创建以压缩包为名字的目录\n1 2 # 解压命令为 mkdir ~/opt/sonic/ \u0026amp;\u0026amp; unzip -d ~/opt/sonic/ sonic-linux-amd64.zip unzip语法格式:\nunzip [参数] 压缩包名\n参数：\n-d 路径 将压缩包的所有文件列表解压缩到指定路径，不会自动创建以目录\n上述的路径请根据你自己的情况修改。\n解压之后的文件列表为\n1 2 3 4 conf # 配置文件夹 resources # 资源文件夹 sonic # 程序执行入口 systemd # 提供的示例 systemd 服务文件，用于systemctl 启动程序 根据以上的目录，可以看出作者还有很有心的。\n2.3. 启动 以下启动方式可任选其一\n默认启动 如果你不想做任何修改，在解压的目录执行\n1 ./sonic -config conf/config.yaml 接着控制台会打印如下信息\n1 2 Sonic started at http://127.0.0.1:8080 Sonic admin started at http://127.0.0.1:8080/admin 默认端口为 8080，通过浏览器，访问 ip:8080 即可\n后台启动 1 nohup ./sonic -config conf/config.yaml \u0026amp; 到这一步默认就基本完成了。如果你想更加详细的了解sonic，请继续阅读\n3. sonic的详细配置（可选） 3.1. conf conf文件夹是启动的配置文件\n内含两个yaml文件，一个是 config.dev.yaml 一个是 config.yaml\n我们修改 config.yaml 即可。\n查看内容，如图所示：\n![image-20230915105457674](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-15 10-54-59_image-20230915105457674.png)\n默认端口为8080，我已修改为8090，上述的配置都有中文说明，可根据情况进行修改。\n3.2. resources 存放的前端ui相关的资源\n如果你会前端，可自行编辑\n3.3. sonic.db 数据库文件，sqlite3\n3.4. systemd systemd 服务脚本，可用于systemd 服务\n编写systemd 服务， 目前有问题，建议使用后台启动，以下内容只做参考\n在 systemd 目录下，有提供的sonic.service文件，我们对它稍作修改，\n1 2 3 4 5 6 7 8 9 10 11 12 13 [Unit] Description=Go-Sonic Service Documentation=https://github.com/go-sonic/sonic After=network.target nss-lookup.target [Service] User=nobody # 启动服务的用户名 ExecStart=/your_path/sonic -config /your_path/conf/config.yaml # 启动程序的路径 Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target% 笔者的配置\n1 2 3 4 5 6 7 8 9 10 11 12 13 [Unit] Description=Go-Sonic Service Documentation=https://github.com/go-sonic/sonic After=network.target nss-lookup.target [Service] User=ecs-user ExecStart=/home/ecs-user/opt/sonic/sonic -config /home/ecs-user/opt/sonic/conf/config.yaml Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target 接着复制到 /usr/lib/systemd/system 路径下\n1 sudo cp sonic.service /usr/lib/systemd/system 启动服务\n1 2 3 4 5 6 7 8 9 # systemctl服务 # 查看状态 systemctl status sonic # 启动服务 sudo systemctl start sonic # 停止服务 sudo systemctl stop sonic # 开机自启 sudo systemctl enable sonic 4. 使用截图 4.1. 主页 ![image-20230915110159610](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-15 11-02-01_image-20230915110159610.png)\n4.2. 后台 仪表盘 ![image-20230915110318849](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-15 11-03-20_image-20230915110318849.png)\n文章 ![image-20230915110402695](https://gitee.com/muyiacc/typora-img/raw/master/2023/2023-09-15 11-04-04_image-20230915110402695.png)\n5. 结语 写到这里，才发现和 halo后台如此相似，去看官网的 issues ，应该是从halo后台移植的，但是占据了Golang的优势，占用内存和使用效率却大大提高了，不得不说，Golang，确实强~~\n分享到此结束。\n","date":"2023-09-14T14:07:10+08:00","permalink":"/p/2309013/","title":"基于Golang编写的开源博客系统sonic，内存占用极低！！替代halo"},{"content":"简介 本次介绍 github 上面一个激活 Windows 和 Office（支持 Office365） 的脚本，拥有 stat 41.1k\n它是一个开源 Windows 和 Office 激活器具有 HWID、Ohook、TSforge、KMS38 和在线 KMS 激活方法，以及高级故障排除功能。\n地址：GitHub\n方式一 打开 powershell (win+x 再按 a)， 执行以下命令\n1 irm https://get.activated.win | iex 或者（未来可能会被删除）\n1 irm https://massgrave.dev/get | iex 方法二 点击下载激活脚本 ， 并解压 解压后找到 All-In-One-Version 文件夹 执行 MAS_AIO.cmd 激活 Office365 Office365 需要先去下载，离线版下载地址：\nhttps://www.123pan.com/s/4MOKVv-NnPpd.html提取码:pole 下载安装后，按照方式一，或者方式二激活\n","date":"2023-09-13T14:07:10+08:00","permalink":"/p/2309012/","title":"一条命令实现Windows激活和Office激活"},{"content":"Windows命令行下对文件做MD5校验\n按【win】+R键来打开运行cmd命令行窗口\n进入cmd命令行界面，使用如下命令做MD5校验：\n1 CertUtil -hashfile C:\\xxx.tar MD5 此命令还可以支持其他的哈希算法，具体如下：\n1 CertUtil -hashfile 文件路径 算法 支持的算法有：MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512\n","date":"2023-09-12T14:07:10+08:00","permalink":"/p/2309011/","title":"Windows命令行下对文件做MD5校验"},{"content":"需求 现在 MySQL5.7 和 8.0 版本用的人和需求都有，为了能让电脑上同时安装 MySQL5.7 和 MySQL8.0 版本\n准备 MySQL 可选择版本的下载地址：https://downloads.mysql.com/archives/community/\n也可通过以下链接直接下载 zip 安装包\nMySQL5.7：https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.41-winx64.zip\nMySQL8.0：https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-winx64.zip\n安装之前请确保环境的干净，如果需要卸载请网上搜索教程\nMySQL5.7 安装 解压安装包 解压下载好的安装包，建议不要使用中文路径\n新建 my.ini 文件\n在解压的目录新建 my.ini 文件，这是 MySQL 的配置文件，通过 zip 安装需要手动指定数据存储的路径\nmy.ini 的配置内容：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [client] port = 3306 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 tips:这里的目录是你自己的安装目录，这个是我的安装目录 basedir=D:\\\\Development\\\\DB\\\\mysql-5.7.41-winx64 # 设置mysql数据库的数据的存放目录 tips:同上一条 datadir=D:\\\\Development\\\\DB\\\\mysql-5.7.41-winx64\\\\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8mb4 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB #这个需要注意一下，不然报错 #其原因是从 5.6开始，timestamp 的默认行为已经是 deprecated 了。 explicit_defaults_for_timestamp=true [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 初始化 MySQL 文件管理器打开安装目录， shift+右键 ，选择 在此处打开 Powershell 窗口\n现在已经切换到了 powershell，先切换到 bin 目录，再执行以下命令进行初始化\n1 .\\mysqld.exe --initialize --user=mysql --console 记住初始化密码，后续登录 MySQL 会用到\n安装 MySQL 服务 通过以下命令安装 MySQL 服务，这个命令需要管理员权限\n通过 win+x 选择用管理员权限打开 powershell，再切换到 MySQL 目录\n在原来的 powershell 窗口下，输入 pwd ，控制台就会输出 当前所在的路径\n然后在管理员权限下的 powershell 切换过去，使用cd 路径\n1 cd D:\\Development\\DB\\mysql-5.7.41-winx64\\bin 接着执行以下命令\n1 .\\mysqld.exe --install MySQL57 --defaults-file=\u0026#34;D:\\\\Development\\\\DB\\\\mysql-5.7.41-winx64\\\\my.ini\u0026#34; 注意：你需要修改为你自己的路径，除非和我一样。\n修改密码 在保证前面步骤没有出错的情况下，启动 MySQL 服务，登录 MySQL，修改密码，然后就大功告成\n启动 MySQL 服务（需要管理员权限）\n1 net start MYSQL57 登录 MySQL，回车输入密码，密码是前面生成的随机密码，已经提醒过保存下来\n1 .\\mysql.exe -u root -p 修改密码\n1 set password=\u0026#39;新密码\u0026#39; 1 set password=\u0026#39;root\u0026#39; 配置环境变量 复制安装路径，windows+R 打开运行，输入 sysdm.cpl 回车，\n选择 高级打开 环境变量，\n选中 系统变量 Path，点击 编辑，再点击 新建，输入：\n1 %MYSQL_HOME%\\bin 再点击 确定 保存（注意返回上一级也要保存，否则可能保存不成功）\n至此结束。。\n","date":"2023-09-11T14:07:10+08:00","permalink":"/p/2309010/","title":"Windows10安装多版本MySQL"},{"content":"概述 v2rayA 是一款使用 Golang 和 Vue.js 编写的轻量级代理工具，旨在为几乎所有应用程序提供代理服务，无需考虑应用程序本身是否支持代理。\n核心特性：\n全局透明代理： 在 Linux 系统，v2rayA 支持一键开启透明代理，省去了繁琐的配置操作。 在 Windows 和 MacOS 支持一键配置系统代理。 强大而轻便 ⚡️： 运行时没有任何外部依赖库，可跨平台运行。 借助任意一款浏览器均可操作。 外部访问： 对于无图形界面的操作系统，安装 v2rayA 后，借助另一台 PC 或移动设备即可完成对其的操作。 这对于远程服务器、路由器是极其方便的。 多出站负载均衡和分流： v2rayA 允许用户创建和连接多个出站节点，以实现负载均衡及分流。 RoutingA 自定义路由： RoutingA 是 v2rayA 专为 V2Ray 设计的一种路由语言。 为分流提供强大而便捷的支持。 多种策略应对 DNS 污染： v2rayA 提供多种策略应对 DNS 污染。 高级设置可为用户提供更多的客制化定义。 官网：https://v2raya.org/\n安装 Debian/Ubuntu 方法一：通过软件源安装 添加公钥\n1 wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo tee /etc/apt/keyrings/v2raya.asc 添加 V2RayA 软件源\n1 2 echo \u0026#34;deb [signed-by=/etc/apt/keyrings/v2raya.asc] https://apt.v2raya.org/ v2raya main\u0026#34; | sudo tee /etc/apt/sources.list.d/v2raya.list sudo apt update 安装 V2RayA\n1 sudo apt install v2raya v2ray ## 也可以使用 xray 包 方法二：手动安装 deb 包 从 Release 下载 v2rayA 的 deb 包 后可以使用 Gdebi、QApt 等图形化工具来安装，也可以使用命令行：\n下载地址：\nv2raya: https://github.com/v2rayA/v2raya-apt/tree/master/pool/main/v/v2ray\nv2ray: https://github.com/v2rayA/v2raya-apt/tree/master/pool/main/v/v2raya\n使用国内网盘：\n123: https://www.123pan.com/s/4MOKVv-52Ppd.html提取码:7F4p\n1 sudo apt install ****.deb ### 自行替换 deb 包所在的实际路径 启动 v2raya / 设置 v2rayA 自动启动 从 1.5 版开始将不再默认为用户启动 v2rayA 及设置开机自动。\n启动 v2rayA\n1 sudo systemctl start v2raya.service 设置开机自动启动\n1 sudo systemctl enable v2raya.service Docker Docker 镜像内集成了 V2Ray 内核，因此内核无需额外被安装。\n方式一：始终使用最新版 获取镜像\n1 docker pull mzz2017/v2raya 运行 v2rayA\n停止正在运行的版本（如果存在）\n1 2 docker container stop v2raya docker container rm v2raya V2RAYA_V2RAY_BIN 的值应当是 /usr/local/bin/v2ray 或 /usr/local/bin/xray，默认的核心是 xray。 如果你的宿主系统使用原生的 nftables，那么就把 V2RAYA_NFTABLES_SUPPORT 设置为 on。 3.你的宿主系统使用 iptables，那么可以通过 IPTABLES_MODE 变量来指定后端，将该变量的值设置为 nftables 将使用 nft 后端，设置为 legacy 将使用传统后端。 以下是一个使用传统后端的示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 docker run -d \\ --restart=always \\ --privileged \\ --network=host \\ --name v2raya \\ -e V2RAYA_LOG_FILE=/tmp/v2raya.log \\ -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \\ -e V2RAYA_NFTABLES_SUPPORT=off \\ -e IPTABLES_MODE=legacy \\ -v /lib/modules:/lib/modules:ro \\ -v /etc/resolv.conf:/etc/resolv.conf \\ -v /etc/v2raya:/etc/v2raya \\ mzz2017/v2raya 如果你使用 macOS 或其他不支持 host 模式的环境，在该情况下无法使用全局透明代理，或者你不希望使用全局透明代理，docker 命令会略有不同：\n1 2 3 4 5 6 7 8 9 docker run -d \\ -p 2017:2017 \\ -p 20170-20172:20170-20172 \\ --restart=always \\ --name v2raya \\ -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \\ -e V2RAYA_LOG_FILE=/tmp/v2raya.log \\ -v /etc/v2raya:/etc/v2raya \\ mzz2017/v2raya 查看状态：\n1 docker container stats v2raya 方式二：获取指定版本 Docker 允许用户同时下载不同版本的 v2rayA。通过错开端口等操作，用户还可以运行多个不同版本的 v2rayA。\n获取镜像\n获取最新的版本号：\n1 2 Latest_version=$(curl -L \u0026#34;https://api.github.com/repos/v2rayA/v2rayA/releases/latest\u0026#34; | grep \u0026#39;tag_name\u0026#39; | awk -F \u0026#39;\u0026#34;\u0026#39; \u0026#39;{print $4}\u0026#39; | awk -F \u0026#39;v\u0026#39; \u0026#39;{print $2}\u0026#39;) echo $Latest_version 如果你不需要最新的版本，你也可以访问 Docker 镜像仓库\n查找所需的版本。比如，你需要 1.5.8 版本，那么将 $Latest_version 替换为你所需的版本即可。\n获取 Docker 镜像：\n1 docker pull mzz2017/v2raya:$Latest_version 运行 v2rayA\n使用 docker 运行 v2rayA:\n1 2 3 4 5 6 7 8 9 10 11 12 13 docker run -d \\ --restart=always \\ --privileged \\ --network=host \\ --name v2raya \\ -e V2RAYA_LOG_FILE=/tmp/v2raya.log \\ -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \\ -e V2RAYA_NFTABLES_SUPPORT=off \\ -e IPTABLES_MODE=legacy \\ -v /lib/modules:/lib/modules:ro \\ -v /etc/resolv.conf:/etc/resolv.conf \\ -v /etc/v2raya:/etc/v2raya \\ mzz2017/v2raya:$Latest_version 如果你使用 MacOSX 或其他不支持 host 模式的环境，在该情况下无法使用全局透明代理，或者你不希望使用全局透明代理，docker 命令会略有不同：\n1 2 3 4 5 6 7 8 docker run -d \\ -p 2017:2017 \\ -p 20170-20172:20170-20172 \\ --restart=always \\ --name v2raya \\ -e V2RAYA_LOG_FILE=/tmp/v2raya.log \\ -v /etc/v2raya:/etc/v2raya \\ mzz2017/v2raya:$Latest_version 查看状态：\n1 docker container stats v2raya 更新 v2rayA 使用 获取镜像 中所提到的命令获取最新版本的镜像，然后停止当前容器：\n1 2 docker container stop v2raya docker container rm v2raya 最后使用 运行 v2rayA 里面所提到的命令运行新版本 v2rayA。更新 v2rayA 之后，你可以考虑删除旧版本镜像。\nWindows 目前在 Windows 上仅支持一键配置系统代理而非透明代理\n通过 WinGet 自动安装 WinGet 是微软推出的软件包管理器，适用于 Windows 10 以及更新版本的操作系统。\n1 winget install --id v2rayA.v2rayA 手动运行安装包 从 GitHub Releases 下载适用于 Windows 的安装包，例如\ninstaller_windows_inno_x64_2.0.1.exe，按照指示安装完毕即可。\n使用方式 安装 v2rayA 后，访问 http://127.0.0.1:2017 打开管理页面。\n免费节点 警告 订阅节点仅作学习交流使用，用于查找资料，学习知识，不做任何违法行为。所有资源均来自互联网，仅供大家交流学习使用，出现违法问题概不负责。\n订阅地址\n1 https://mirror.ghproxy.com/https://raw.githubusercontent.com/Barabama/FreeNodes/master/nodes/yudou66.txt 1 https://mirror.ghproxy.com/https://raw.githubusercontent.com/Barabama/FreeNodes/master/nodes/blues.txt 1 https://mirror.ghproxy.com/https://raw.githubusercontent.com/Barabama/FreeNodes/master/nodes/zyfxs.txt 合集\n1 https://mirror.ghproxy.com/https://raw.githubusercontent.com/Barabama/FreeNodes/master/nodes/merged.txt ","date":"2023-09-10T14:07:10+08:00","permalink":"/p/2309009/","title":"v2rayA，跨平台的V2Ray客户端，网页端控制"},{"content":"网络上收集的一些 tracker 列表\nGitHub 开源仓库：\nhttps://github.com/ngosang/trackerslist\n站点\nhttps://trackerslist.com/#/zh\n中国可用的 BT Tracker 服务器列表，每 24 小时自动更新\nhttps://ngosang.github.io/trackerslist/\ntracker 列表\nhttps://cf.trackerslist.com/best.txt\nhttps://trackerslist.com/all.txt\n直接使用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 http://0123456789nonexistent.com:80/announce http://1337.abcvg.info:80/announce http://bt.okmp3.ru:2710/announce http://ipv4.rer.lol:2710/announce http://ipv6.rer.lol:6969/announce http://nyaa.tracker.wf:7777/announce http://open.trackerlist.xyz:80/announce http://shubt.net:2710/announce http://taciturn-shadow.spb.ru:6969/announce http://tk.greedland.net:80/announce http://torrentsmd.com:8080/announce http://tracker.beeimg.com:6969/announce http://tracker.bt4g.com:2095/announce http://tracker.ipv6tracker.ru:80/announce http://tracker.mywaifu.best:6969/announce http://tracker.privateseedbox.xyz:2710/announce http://tracker.renfei.net:8080/announce http://www.all4nothin.net:80/announce.php http://www.wareztorrent.com:80/announce https://1337.abcvg.info:443/announce https://pybittrack.retiolus.net:443/announce https://t.213891.xyz:443/announce https://tr.abiir.top:443/announce https://tr.abir.ga:443/announce https://tr.nyacat.pw:443/announce https://tracker.expli.top:443/announce https://tracker.foreverpirates.co:443/announce https://tracker.jdx3.org:443/announce https://tracker.kuroy.me:443/announce https://tracker.moeblog.cn:443/announce https://tracker.yemekyedim.com:443/announce https://tracker.zhuqiy.top:443/announce https://tracker1.520.jp:443/announce udp://1c.premierzal.ru:6969/announce udp://d40969.acod.regrucolo.ru:6969/announce udp://evan.im:6969/announce udp://exodus.desync.com:6969/announce udp://extracker.dahrkael.net:6969/announce udp://martin-gebhardt.eu:25/announce udp://open.demonii.com:1337/announce udp://open.stealth.si:80/announce udp://opentor.org:2710/announce udp://opentracker.io:6969/announce udp://p4p.arenabg.com:1337/announce udp://retracker.hotplug.ru:2710/announce udp://retracker.lanta.me:2710/announce udp://retracker01-msk-virt.corbina.net:80/announce udp://tr4ck3r.duckdns.org:6969/announce udp://tracker-udp.gbitt.info:80/announce udp://tracker.bitcoinindia.space:6969/announce udp://tracker.dler.com:6969/announce udp://tracker.fnix.net:6969/announce udp://tracker.gigantino.net:6969/announce udp://tracker.gmi.gd:6969/announce udp://tracker.hifimarket.in:2710/announce udp://tracker.hifitechindia.com:6969/announce udp://tracker.kmzs123.cn:17272/announce udp://tracker.ololosh.space:6969/announce udp://tracker.opentrackr.org:1337/announce udp://tracker.plx.im:6969/announce udp://tracker.qu.ax:6969/announce udp://tracker.rescuecrew7.com:1337/announce udp://tracker.skillindia.site:6969/announce udp://tracker.skyts.net:6969/announce udp://tracker.srv00.com:6969/announce udp://tracker.therarbg.to:6969/announce udp://tracker.torrent.eu.org:451/announce udp://tracker.torrust-demo.com:6969/announce udp://tracker.tryhackx.org:6969/announce udp://tracker.tvunderground.org.ru:3218/announce udp://tracker.valete.tf:9999/announce udp://tracker.wepzone.net:6969/announce udp://tracker.zupix.online:6969/announce udp://ttk2.nbaonlineservice.com:6969/announce udp://udp.tracker.projectk.org:23333/announce udp://wepzone.net:6969/announce udp://www.torrent.eu.org:451/announce wss://tracker.openwebtorrent.com:443/announce ","date":"2023-09-09T14:07:10+08:00","permalink":"/p/2309008/","title":"tracker列表"},{"content":"概述 作为一个开发人员，使用 Linux 实在是太频繁了，无论是观看别人程序的脚本，还是自己编写脚本，都离不开 Shell，所以这篇文章总结一下\n什么是 shell？\nShell 是一个连接用户和操作系统内核（Kernel）的桥梁。Shell 是一个命令行解释器（Command-Line Interpreter）。它接收你输入的命令，将其翻译成内核能理解的指令，然后让内核去执行。执行完毕后，Shell 再把结果（通常是文本）返回并显示在你的屏幕上。\n所以，你打开的那个黑乎乎的、可以输入命令的窗口（通常称为“终端”或“控制台”），里面运行的就是 Shell 程序。\n常见的 Shell 类型\nShell 并非只有一种，它有许多不同的实现版本，各自具有不同的特性。最常见的有：\nBash (Bourne-Again Shell)：这是最流行、最通用的 Shell，是绝大多数 Linux 发行版的默认 Shell，在 macOS 的旧版本中也是默认 Shell。它功能强大，易于学习。我们通常说的 “Shell 编程” 或 “Shell 脚本”，指的基本上就是 Bash。 Zsh (Z Shell)：一个功能比 Bash 更强大的 Shell。它提供了更智能的自动补全、拼写纠错、更灵活的定制和丰富的主题（通过 Oh My Zsh 等框架）。现在是 macOS 的默认 Shell，也受到越来越多 Linux 用户的喜爱。 sh (Bourne Shell)：一个非常古老的、经典的 Shell，是许多现代 Shell 的祖先。在很多系统中，/bin/sh 实际上是一个指向 Bash 或其他兼容 Shell 的链接。编写脚本时，为了保证最大的可移植性，有时会遵循 sh 的标准。 入门简介 解释器 Linux 中，解析脚本的是命令解释器，也就是终端解释器，如 Bash、Zsh。\n在脚本中常见的头部声明如：\n1 #!/bin/bash 或者\n1 #!/bin/zsh 一般情况下 Linux 默认解释器是 bash\n查看所有支持的 shell\n1 cat /etc/shells 临时进入 解释器的方法为 exec 解释器\nexec /bin/bash exec /bin/zsh 查看当前解释器：echo $SHELL\n脚本格式 脚本以 #!解释器 为开头\n1 2 #!/bin/bash # 脚本内容 按照习惯，bash 对应的脚本文件的后缀一般是 .sh 结尾，而 zsh 对应的脚本文件以 .zsh 结尾，当然，这不是必须的。\n例如：在家目录新建目录 bin, 继续在 bin 目录新建一个文件 test1.sh\n1 2 3 4 5 mkdir $HOME/bin cd $HOME/bin touch test.sh 1 vim test1.sh 1 2 #! /bin/sh echo \u0026#34;我的解释器为 $SHELL\u0026#34; 脚本执行方式 在新建 test1.sh 之后，如何执行呢？\n方式 1 1 解释器 脚本路径 脚本的路径可使用相对路径也可以使用绝对路径\n例如\n1 2 3 4 # 切换到 bin 目录 cd $HOME/bin # 相对路径 sh test1.sh 1 2 # 绝对路径，不用切换到对应目录 sh ~/bin/test1.sh 执行结果\n1 我的解释器为 /bin/bash 方式 2 对脚本增加可执行权限\n1 chmod +x test1.sh 直接运行脚本\n1 $HOme/bin/test1.sh 执行结果\n1 我的解释器为 /bin/bash 变量 Shell 中可以设置变量，变量表示了一些值，通过特定的字符加特定的方式可以表达出来\n如系统默认的变量：\nSHELL：当前用户的解释器 USER：当前用户 HOME：当前用户的家目录 查看这些变量的值只需要 echo $变量名即可：\n1 2 3 4 echo $SHELL 输出结果： /bin/bash 1 2 3 4 echo $USER 输出结果： ecs-user 1 2 3 4 echo $HOME 输出结果： /home/ecs-user 系统变量 系统变量，顾名思义，就是系统自带的变量\n除了已经介绍过的SHELL、USER、HOME等外，还有如：\n1 2 3 4 5 6 7 8 9 10 11 PATH：环境变量，包含了可执行文件的搜索路径。 BASH_VERSION：Bash shell的版本信息。 PWD：当前工作目录的绝对路径。 LANG：系统的语言和字符集设置。 TERM：终端类型。 LOGNAME：当前登录的用户名。 HISTSIZE：命令历史记录的数量。 LINES：终端的行数。 USER：非root用户的用户名。 UID：用户ID（root用户为0）。 GID：组ID（root用户为0）。 使用env命令查看当前系统定义的所有环境变量\n使用set命令显示所有本地定义的 Shell 变量\n自定义变量 除了系统自带的系统变量以外，用户还可以自定义属于自己的变量\n基本语法：\n定义变量：变量名=变量值，等号两边不能有空格 撤销变量：unset 变量名 静态变量：readonly 变量名，静态变量不可撤销 全局变量：export 变量名 变量命名规则\n必须以字母（a-z、A-Z）或下划线（_）开头 区分大小写，环境变量命名建议大写 不能是内置命令或关键字 长度不能超过 99 个字符 不能包含空格或其他特殊字符 变量小贴士\n变量默认类型都是字符串类型，无法直接进行数值运算 变量的值如果有空格，需要使用双引号或单引号括起来 特殊变量 除了系统变量，自定义变量，还有一些特殊的变量，它们经常在 shell 脚本中使用\n$n n 代表是数字，如 0、1、2、3，\u0026hellip;，在大于 9 后，需要用 {} 包裹，如 ${10}\n$0：表示当前脚本的名称或路径\n如：\nexample.sh\n1 2 #!/bin/bash echo \u0026#34;this script name is $0\u0026#34; 执行脚本\n1 sh example.sh 输出内容\n1 this script name is example.sh 脚本 2\n1 2 #!/bin/bash echo \u0026#34;this script name is $0, parms is: $1 $2 $3 $4\u0026#34; 执行脚本\n1 sh example2.sh i love shell 输出结果\n1 this script name is example2.sh, parms is: i love shell 这里第 4 个参数，没有赋予，结果也没有显示\n$# $#：获取所有输入参数的个数\n1 2 #!/bin/bash echo \u0026#34;params count: $#\u0026#34; 运行\n1 sh example3.sh this is a examle 运行结果\n1 params count: 4 $*、$@ $*：代表命令行中所有的参数，把所有的参数看成一个整体 $@：代表命令行中所有的参数，把每个参数区分对待 例：\nexample4.sh\n1 2 3 4 5 #!/bin/bash echo \u0026#39;----- $@ -----\u0026#39; echo $@ echo \u0026#39;----- $* -----\u0026#39; echo $* 运行\n1 sh example4.sh i love shell 运行结果\n1 2 3 4 ----- $@ ----- i love shell ----- $* ----- i love shell $? $?：返回上一次执行结果的状态，如果为 0，表示正确执行，如果非 0，表示不正确执行\n例如：\nexample5.sh\n1 2 3 4 5 #!/bin/bash echo \u0026#39;----- $? -----\u0026#39; echo $? num = 10 echo $? 运行\n1 sh example5.sh 运行结果\n1 2 3 4 ----- $? ----- 0 example5.sh: 4: num: not found 127 结果解释\n0：表示前一个命令 echo '----- $? -----' 运行成功了 127：因为num = 10 变量赋值之间有空格，失败了，所以后面的 echo $?输出了一个非 0 数字 运算符 shell 中有运算表达式，可以进行运算\n语法：\n$((运算表达式)) $[ 运算表达式 ]：注意左右空格 例 1：\nshell03_01.sh\n1 2 #!/bin/bash echo $((1+1)) 运行\n1 sh shell03_01.sh 运行结果\n1 2 例 2：\nshell03_02.sh\n1 2 #!/bin/bash echo $[ 1+1 ] 运行，注意是 bash\n1 bash shell03_02.sh 运行结果\n1 2 条件判断 shell 支持多种条件判断的方式\nif\u0026hellip;else case..when ","date":"2023-09-08T14:07:10+08:00","permalink":"/p/shell/","title":"Shell编程指南"},{"content":"pandora-潘多拉魔盒，一个提供免翻的方式访问openai提供的gpt\n官方地址：https://github.com/pengzhile/pandora\n本次介绍如何如何使用docker的方式部署pandora\n1 2 3 4 # 拉取镜像 docker pull pengzhile/pandora # 创建容器 docker run -e PANDORA_CLOUD=cloud -e PANDORA_SERVER=0.0.0.0:8811 -p 8811:8811 -d --name pandora pengzhile/pandora 上面的端口可自定替换\n部署成功之后，请开放服务器上的安全组\n接着就可以通过 ip:port 的方式访问\n总结：这个项目我觉得最大的用处就是不用通过技术手段访问openai\n最后：附上我已经搭建好的地址：https://gpt.seektao.cc\nps: 访问需要自己的open账号\n","date":"2023-09-07T14:07:10+08:00","permalink":"/p/2309005/","title":"pandora-免翻访问gpt"},{"content":"Markdown 本身并不支持实时渲染外链图片，但可以通过一些扩展库或工具来实现。\n一种常用的方法是使用 JavaScript 库来实现。例如，可以使用 markdown-it 这个 JavaScript 库来将 Markdown 文本渲染为 HTML，并通过 markdown-it 的插件来加载外链图片。具体步骤如下：\n在你的项目中引入 markdown-it 和 markdown-it 的 HTML 渲染器： 1 2 import markdownIt from \u0026#39;markdown-it\u0026#39;; import { MarkdownItHtml } from \u0026#39;markdown-it-html\u0026#39;; 创建一个 markdown-it 实例，并启用 HTML 渲染器插件： 1 2 3 4 5 const md = markdownIt({ html: true, linkify: true, typographer: true, }).use(MarkdownItHtml); 将 Markdown 文本渲染为 HTML，并将外链图片转换为 \u0026lt;img\u0026gt; 标签： 1 2 const markdown = \u0026#39;![alt text](http://example.com/image.jpg)\u0026#39;; const html = md.render(markdown); 这样，html 变量将包含渲染后的 HTML，其中外链图片将被转换为 \u0026lt;img\u0026gt; 标签。你可以将 html 变量插入到你的网页中，以便在浏览器中显示渲染后的结果。\n需要注意的是，由于这种方法需要加载外链图片，因此可能会受到跨域限制。你需要确保外链图片的服务器允许跨域访问，或者使用代理等方法来绕过跨域限制。\n","date":"2023-09-06T14:07:10+08:00","permalink":"/p/2309004/","title":"markdown实时渲染外链图片的解决方案（未完成）"},{"content":"HOME：用户的主目录，通常是/home/用户名。 USER：当前登录的用户名。 PATH：环境变量，包含了可执行文件的搜索路径。 BASH_VERSION：Bash shell的版本信息。 PWD：当前工作目录的绝对路径。 SHELL：当前使用的shell类型（如bash、zsh等）。 LANG：系统的语言和字符集设置。 TERM：终端类型。 LOGNAME：当前登录的用户名。 MAIL：用户的邮件地址。 HISTSIZE：命令历史记录的数量。 EDITOR：默认的文本编辑器。 PS1：命令提示符的格式。 LD_LIBRARY_PATH：动态链接库的搜索路径。 LD_PRELOAD：动态链接库的预加载设置。 HOSTNAME：主机名。 IP_ADDRESS：本地IP地址。 IPV6_ADDRESS：IPv6地址。 IFS：内部字段分隔符。 COLUMNS：终端的列数。 LINES：终端的行数。 USER：非root用户的用户名。 UID：用户ID（root用户为0）。 GID：组ID（root用户为0）。 OPIE：是否启用OpenPGP加密支持。 RUNLEVEL：运行级别。 PS1、PS2、PS3：自定义命令提示符的前缀、后缀和中间部分。 EDITOR、VISUAL：自定义文本编辑器和可视化编辑器。 MANPATH：手册页的搜索路径。 MYTMPDIR：临时文件目录。 TMPDIR：临时目录。 TMUX_PANE：当前活动的tmux面板。 TMUX_WINDOW：当前活动的tmux窗口。 TMUX_STATUS：当前活动的tmux状态。 TMUX_PID：当前活动的tmux进程ID。 TMUX_SERVER：当前活动的tmux服务器。 TMUX_PORT：当前活动的tmux端口。 TMUX_LISTEN_ADDRESS：当前活动的tmux监听地址。 TMUX_UNIX_SOCKET：当前活动的tmux Unix套接字。 TMUX_WINDOWS_SOCKET：当前活动的tmux Windows套接字。 TMUX_PID：当前活动的tmux进程ID。 TMUX_SERVER：当前活动的tmux服务器。 TMUX_PORT：当前活动的tmux端口。 TMUX_LISTEN_ADDRESS：当前活动的tmux监听地址。 TMUX_UNIX_SOCKET：当前活动的tmux Unix套接字。 TMUX_WINDOWS_SOCKET：当前活动的tmux Windows套接字。 TMUX_VERSION：当前活动的tmux版本。 TMUX_CONFIG_FILE：当前活动的tmux配置文件路径。 TMUX_DEFAULT_COMMAND：当前活动的tmux默认命令。 TMUX_CURRENT_COMMAND：当前活动的tmux当前命令。 ","date":"2023-09-05T14:07:10+08:00","permalink":"/p/2309003/","title":"Linux系统的系统变量合集"},{"content":"1. 概述 unzip为linux上 解压 zip的命令\n小提示：使用unzip解压时，先提前创建好解压的路径，再通过 -d 解压路径 指定\n2. 用法 语法格式： 1 unzip [参数] 压缩包名 常用参数 参数 说明 -d 路径 将压缩包的所有文件列表解压缩到指定路径，不会自动创建以目录 -v 显示执行过程的详细信息 -l 显示压缩包内的文件列表 -t 测试压缩包是否损坏 一定注意：unzip和tar不同的是，unzip解压缩时会将压缩包的文件列表直接输出，不会自动创建以压缩包为名字的目录，这也就会导致如果你指定的目录非空的话，会将压缩包的所有文件列表输出到指定的目录\n例如：\nunzip -d ~/opt/ test.zip\n这条命令会将 test.zip 的文件列表输出到 ~/opt/ 目录下，导致文件和其他目录混合。\n3. 示例 1）解压到指定的目录（提前创建好文件目录）\n1 mkdir ~/opt/sonic/ \u0026amp;\u0026amp; unzip -d ~/opt/sonic/ sonic-linux-amd64.zip 解压时会显示执行过程。\n","date":"2023-09-04T14:07:09+08:00","permalink":"/p/2309002/","title":"Linux下的解压命令unzip使用指南"},{"content":"debian物理机安装提示缺少网卡固件，ath10k/cal-pci-0000:01:00.0.bin，ath10k/pre-cal-pci-0000:01:00.0.bin解决办法\n使用离线dvd镜像安装，先跳过安装固件这个步骤。\n正常安装完系统后，再使用wifi联网，因为缺乏这个固件的问题，会导致wifi连接后，过一会就上不了网，所以在连上wifi后，及时安装固件\n在终端执行\n1 sudo apt install firmware-atheros 重启系统。\n","date":"2023-09-03T14:12:15+08:00","permalink":"/p/2309001/","title":"Debian物理机安装提示缺少网卡固件解决办法"},{"content":"https://github.com/fscarmen2/Argo-Nezha-Service-Container?tab=readme-ov-file\ndashborad PaaS fscarmen/argo-nezha:latest\nGH_USER\nmuyiacc\nGH_CLIENTID\nOv23liRIzTFTIowLgNEU\nGH_CLIENTSECRET\nb2edb43fa0eb3de543a202413a04d886487adbaf\nGH_BACKUP_USER\nmuyiacc\n或者 provvw\nGH_REPO\nnezha_backup\nGH_EMAIL\n115904774+muyiacc@users.noreply.github.com\nprovvw：provvw@proton.me\nGH_PAT\n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\nprovvw：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\nARGO_AUTH\nnezha.526899.xyz\n1 {\u0026#34;AccountTag\u0026#34;:\u0026#34;d05409fe51f096bb16b801b83cb2ead6\u0026#34;,\u0026#34;TunnelSecret\u0026#34;:\u0026#34;lXCQ8oeRnziKb0l0IUyiCqFsUCKOrSSr6tw3Z4nSNq0=\u0026#34;,\u0026#34;TunnelID\u0026#34;:\u0026#34;ca57fe28-48b4-4b94-bc69-e33930e9353d\u0026#34;,\u0026#34;Endpoint\u0026#34;:\u0026#34;\u0026#34;} ARGO_DOMAIN\nnezha.526899.xyz\nhttps://interesting-robyn-prov-8a0a5c2a.koyeb.app/\nhttps://nezha.526899.xyz/\nDocker docker\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker run -dit \\ --name nezha_dashboard \\ --pull always \\ --restart always \\ -e GH_USER=\u0026lt;填 github 用户名\u0026gt; \\ -e GH_EMAIL=\u0026lt;填 github 邮箱\u0026gt; \\ -e GH_PAT=\u0026lt;填获取的\u0026gt; \\ -e GH_REPO=\u0026lt;填自定义的\u0026gt; \\ -e GH_CLIENTID=\u0026lt;填获取的\u0026gt; \\ -e GH_CLIENTSECRET=\u0026lt;填获取的\u0026gt; \\ -e ARGO_AUTH=\u0026#39;\u0026lt;填获取的 Argo json 或者 token\u0026gt;\u0026#39; \\ -e ARGO_DOMAIN=\u0026lt;填自定义的\u0026gt; \\ -e GH_BACKUP_USER=\u0026lt;选填，选填，选填! 如与 GH_USER 一致，可以不要该环境变量\u0026gt; \\ -e REVERSE_PROXY_MODE=\u0026lt;选填，选填，选填! 如想用 Nginx 或 gRPCwebProxy 替代 Caddy 反代的话，请设置该变量并赋值为 `nginx` 或 `grpcwebproxy`\u0026gt; \\ -e NO_AUTO_RENEW=\u0026lt;选填，选填，选填! 如果不需要自动在线同步最新的 backup.sh 和 restore.sh，请设置该变量并赋值为 `1`\u0026gt; \\ -e DASHBOARD_VERSION=\u0026lt;选填，选填，选填! 指定面板的版本，以 `v0.00.00` 的格式，后续将固定在该版本不会升级，不填则使用默认的 `v0.20.13`\u0026gt; \\ fscarmen/argo-nezha docker compose\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 networks: nezha-dashboard: name: nezha-dashboard services: argo-nezha: image: fscarmen/argo-nezha pull_policy: always container_name: nezha_dashboard restart: always networks: - nezha-dashboard environment: - GH_USER=\u0026lt;填 github 用户名\u0026gt; - GH_EMAIL=\u0026lt;填 github 邮箱\u0026gt; - GH_PAT=\u0026lt;填获取的\u0026gt; - GH_REPO=\u0026lt;填自定义的\u0026gt; - GH_CLIENTID=\u0026lt;填获取的\u0026gt; - GH_CLIENTSECRET=\u0026lt;填获取的\u0026gt; - ARGO_AUTH=\u0026lt;填获取的 Argo json 或者 token\u0026gt; - ARGO_DOMAIN=\u0026lt;填自定义的\u0026gt; - GH_BACKUP_USER=\u0026lt;选填，选填，选填! 如与 GH_USER 一致，可以不要该环境变量\u0026gt; - REVERSE_PROXY_MODE=\u0026lt;选填，选填，选填! 如想用 Nginx 或 gRPCwebProxy 替代 Caddy 反代的话，请设置该变量并赋值为 `nginx` 或 `grpcwebproxy`\u0026gt; - NO_AUTO_RENEW=\u0026lt;选填，选填，选填! 如果不需要自动在线同步最新的 backup.sh 和 restore.sh，请设置该变量并赋值为 `1`\u0026gt; - DASHBOARD_VERSION=\u0026lt;选填，选填，选填! 指定面板的版本，以 `v0.00.00` 的格式，后续将固定在该版本不会升级，不填则使用默认的 `v0.20.13`\u0026gt; 实际内容\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 networks: nezha-dashboard: name: nezha-dashboard services: argo-nezha: image: fscarmen/argo-nezha pull_policy: always container_name: nezha_dashboard restart: always networks: - nezha-dashboard environment: - GH_USER=\u0026#34;muyiacc\u0026#34; - GH_EMAIL=\u0026#34;115904774+muyiacc@users.noreply.github.com\u0026#34; - GH_PAT=\u0026#34;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\u0026#34; - GH_REPO=\u0026#34;nezha_backup\u0026#34; - GH_CLIENTID=\u0026#34;Ov23liRIzTFTIowLgNEU\u0026#34; - GH_CLIENTSECRET=\u0026#34;b2edb43fa0eb3de543a202413a04d886487adbaf\u0026#34; - ARGO_AUTH= \u0026#39;{\u0026#34;AccountTag\u0026#34;:\u0026#34;d05409fe51f096bb16b801b83cb2ead6\u0026#34;,\u0026#34;TunnelSecret\u0026#34;:\u0026#34;lXCQ8oeRnziKb0l0IUyiCqFsUCKOrSSr6tw3Z4nSNq0=\u0026#34;,\u0026#34;TunnelID\u0026#34;:\u0026#34;ca57fe28-48b4-4b94-bc69-e33930e9353d\u0026#34;,\u0026#34;Endpoint\u0026#34;:\u0026#34;\u0026#34;}\u0026#39; - ARGO_DOMAIN=\u0026#34;nezha.526899.xyz\u0026#34; - GH_BACKUP_USER=\u0026#34;muyiacc\u0026#34; #- REVERSE_PROXY_MODE=\u0026#34;nginx\u0026#34; #- NO_AUTO_RENEW=\u0026lt;选填，选填，选填! 如果不需要自动在线同步最新的 backup.sh 和 restore.sh，请设置该变量并赋值为 `1`\u0026gt; #- DASHBOARD_VERSION=\u0026lt;选填，选填，选填! 指定面板的版本，以 `v0.00.00` 的格式，后续将固定在该版本不会升级，不填则使用默认的 `v0.20.13`\u0026gt; agent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 nezha_agent_dir=$HOME/.nezha-agent tmp_dir=$HOME/tmp uuid=$(uuidgen) if [ -f $nezha_agent_dir ]; then echo \u0026#34;$nezha_agent_dir not esists,creating\u0026#34; mkdir $nezha_agent_dir fi if [ -f $tmp_dir ]; then echo \u0026#34;$tmp_dir not esists,creating\u0026#34; mkdir $tmp_dir fi curl https://github.com/nezhahq/agent/releases/download/v1.9.5/nezha-agent_freebsd_amd64.zip -o $tmp_dir/nezha-agent.zip unzip $tmp_dir/nezha-agent.zip -d $nezha_agent_dir read -p \u0026#34;请输入面板dashborad域名（不带http://或者https://）：\u0026#34; dashborad_domain read -p \u0026#34;请输入面板dashborad rpc端口:\u0026#34; dashborad_grpc read -p \u0026#34;请输入面板dashborad给出的密钥:\u0026#34; agent_secret read -p \u0026#34;是否启动tls(y/N):\u0026#34; enable_tls if [ $enable_tls == \u0026#34;y\u0026#34; | $enable_tls == \u0026#34;Y\u0026#34; ]; then enable_tls=true else enable_tls=false fi cat \u0026lt; EOF \u0026gt; $nezha_agent_dir/config.yml client_secret: $agent_secret debug: false disable_auto_update: false disable_command_execute: false disable_force_update: false disable_nat: false disable_send_query: false gpu: false insecure_tls: false ip_report_period: 1800 report_delay: 1 server: $dashborad_domain:$dashborad_grpc skip_connection_count: false skip_procs_count: false temperature: false tls: $enable_tls use_gitee_to_upgrade: false use_ipv6_country_code: false uuid: $uuid EOF cat \u0026lt; EOF \u0026gt; $nezha_agent_dir/start.sh #!/bin/sh $nezha_agent_dir/start.sh -c $nezha_agent_dir/config.yml EOF chmod +x $nezha_agent_dir/start.sh pm2 start ./agent.sh pm2 save ","date":"0001-01-01T00:00:00Z","permalink":"/p/","title":""},{"content":"在服务器新增 公开备注\n1 2 3 4 5 6 7 8 9 { \u0026#34;billingDataMod\u0026#34;: { \u0026#34;startDate\u0026#34;: \u0026#34;2024-10-22T00:00:00+08:00\u0026#34;, \u0026#34;endDate\u0026#34;: \u0026#34;2026-10-22T00:00:00+08:00\u0026#34;, \u0026#34;autoRenewal\u0026#34;: \u0026#34;1\u0026#34;, \u0026#34;cycle\u0026#34;: \u0026#34;年\u0026#34;, \u0026#34;amount\u0026#34;: \u0026#34;￥0\u0026#34; } } endDate填写 0000-00-0T00:00:00+08:00 就是显示永续。\namount填写0，显示FREE，价格可以自写￥、$、€等等。\nautoRenewal应该是到期了会自动按周期增加开始和结束时间。\n","date":"0001-01-01T00:00:00Z","permalink":"/p/","title":""},{"content":"简单美化 前台 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \u0026lt;script\u0026gt; // 默认分组模式 if(!localStorage.getItem(\u0026#34;showGroup\u0026#34;)){ localStorage.setItem(\u0026#34;showGroup\u0026#34;, true); } // 默认暗黑模式 if(!localStorage.getItem(\u0026#34;theme\u0026#34;)){ localStorage.setItem(\u0026#34;theme\u0026#34;, \u0026#39;dark\u0026#39;); } // 默认半透明效果 if(!localStorage.getItem(\u0026#34;semiTransparent\u0026#34;)){ localStorage.setItem(\u0026#34;semiTransparent\u0026#34;, \u0026#39;true\u0026#39;); } \u0026lt;/script\u0026gt; 后台 复杂美化 前台 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 \u0026lt;script\u0026gt; // 默认分组模式 if(!localStorage.getItem(\u0026#34;showGroup\u0026#34;)){ localStorage.setItem(\u0026#34;showGroup\u0026#34;, true); } // 默认暗黑模式 if(!localStorage.getItem(\u0026#34;theme\u0026#34;)){ localStorage.setItem(\u0026#34;theme\u0026#34;, \u0026#39;dark\u0026#39;); } // 默认半透明效果 if(!localStorage.getItem(\u0026#34;semiTransparent\u0026#34;)){ localStorage.setItem(\u0026#34;semiTransparent\u0026#34;, \u0026#39;true\u0026#39;); } window.onload = function(){ const affLinks = { crunchbits: \u0026#39;https://get.crunchbits.com/order/lblk-yearly-kvm-ssd-vps/84\u0026#39;, rainyun: \u0026#39;https://www.rainyun.com/MjYzMTk=_\u0026#39;, colocrossing: \u0026#39;https://cloud.colocrossing.com/aff.php?aff=316\u0026#39;, racknerd: \u0026#39;https://my.racknerd.com/aff.php?aff=9727\u0026#39;, } const contacts = { main: \u0026#39;telegram\u0026#39;, animatedType: \u0026#39;vertical\u0026#39;, telegram: { label: \u0026#39;TG\u0026#39;, icon: \u0026#39;telegram plane\u0026#39;, url: \u0026#39;https://t.me/bmqyChatBot\u0026#39; }, qq: { label: \u0026#39;QQ\u0026#39;, icon: \u0026#39;qq\u0026#39;, url: \u0026#39;https://wpa.qq.com/msgrd?V=3\u0026amp;Uin=88268459\u0026amp;Site=nezha.887776.xyz\u0026amp;menu=yes\u0026#39; }, email: { label: \u0026#39;Email\u0026#39;, icon: \u0026#39;mail\u0026#39;, url: \u0026#39;mailto:notice@bmqy.net\u0026#39; }, } const extraData = {\u0026#34;2\u0026#34;:{\u0026#34;shop\u0026#34;:\u0026#34;crunchbits\u0026#34;,\u0026#34;pid\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;price\u0026#34;:\u0026#34;$27.38\u0026#34;,\u0026#34;cycle\u0026#34;:\u0026#34;Year\u0026#34;,\u0026#34;start\u0026#34;:\u0026#34;08/13/2023\u0026#34;,\u0026#34;expire\u0026#34;:\u0026#34;08/13/2024\u0026#34;,\u0026#34;autoPay\u0026#34;:\u0026#34;否\u0026#34;}} const cycleNames = { \u0026#39;年付\u0026#39;: \u0026#39;year\u0026#39;, \u0026#39;半年付\u0026#39;: \u0026#39;half\u0026#39;, \u0026#39;季付\u0026#39;: \u0026#39;quarterly\u0026#39;, \u0026#39;月付\u0026#39;: \u0026#39;month\u0026#39;, \u0026#39;年\u0026#39;: \u0026#39;year\u0026#39;, \u0026#39;半\u0026#39;: \u0026#39;half\u0026#39;, \u0026#39;季\u0026#39;: \u0026#39;quarterly\u0026#39;, \u0026#39;月\u0026#39;: \u0026#39;month\u0026#39;, \u0026#39;Year\u0026#39;: \u0026#39;year\u0026#39;, \u0026#39;Half\u0026#39;: \u0026#39;half\u0026#39;, \u0026#39;Quarterly\u0026#39;: \u0026#39;quarterly\u0026#39;, \u0026#39;Month\u0026#39;: \u0026#39;month\u0026#39;, \u0026#39;Y\u0026#39;: \u0026#39;year\u0026#39;, \u0026#39;H\u0026#39;: \u0026#39;half\u0026#39;, \u0026#39;Q\u0026#39;: \u0026#39;quarterly\u0026#39;, \u0026#39;M\u0026#39;: \u0026#39;month\u0026#39;, \u0026#39;year\u0026#39;: \u0026#39;year\u0026#39;, \u0026#39;half\u0026#39;: \u0026#39;half\u0026#39;, \u0026#39;quarterly\u0026#39;: \u0026#39;quarterly\u0026#39;, \u0026#39;month\u0026#39;: \u0026#39;month\u0026#39;, } const cycleValues = { year: 365, half: 180, quarterly: 90, month: 30, } // 判断当前主题 const cookie = document.cookie; let preferredTheme = document.body.innerHTML.match(/(?\u0026lt;=defaultTemplate: \u0026#34;)(default|server-status)(?=\u0026#34;)/g) ? document.body.innerHTML.match(/(?\u0026lt;=defaultTemplate: \u0026#34;)(default|server-status)(?=\u0026#34;)/g)[0] : \u0026#39;default\u0026#39;; preferredTheme = document.cookie.match(/(server-status|default)/g) ? document.cookie.match(/(server-status|default)/g)[0] : preferredTheme; // 默认主题 if(preferredTheme === \u0026#39;default\u0026#39;){ const cats = document.querySelectorAll(\u0026#39;.ui.accordion\u0026#39;); cats.forEach((e, i)=\u0026gt;{ let $catsTitle = e.querySelector(\u0026#39;.title\u0026#39;); let ct = $catsTitle.innerText; ct = ct.trim();\tlet $itemCard = e.querySelectorAll(\u0026#39;.ui.card\u0026#39;); let uiCardCount = $itemCard.length; $catsTitle.innerHTML = $catsTitle.innerHTML.replace(ct, ct+ \u0026#39; (\u0026#39;+ uiCardCount +\u0026#39;)\u0026#39;); $itemCard.forEach((ee, ii)=\u0026gt;{ let $content = ee.querySelector(\u0026#39;.content\u0026#39;); let $descriptionGrid = ee.querySelector(\u0026#39;.description .ui.grid\u0026#39;); let $itemTitle = $content.querySelector(\u0026#39;.header\u0026#39;); let id = ee.getAttribute(\u0026#39;id\u0026#39;); if(extraData[id]){ let pid = extraData[id].pid; pid = parseInt(pid); let shop = extraData[id].shop; let price = extraData[id].price; let start = extraData[id].start; let expire = extraData[id].expire; let cycle = extraData[id].cycle; let autoPay = extraData[id].autoPay; let cycleName = cycleNames[cycle]; let cycleValue = cycleValues[cycleName]; let nowTime = parseInt(new Date().getTime() / 1000); let beginTime = parseInt(new Date(start).getTime() / 1000); if(autoPay \u0026amp;\u0026amp; autoPay==\u0026#39;是\u0026#39;){ let beginDate = new Date(start); let nowDate = new Date(); let mSteps = { year: 12, half: 6, quarterly: 3, month: 1, } expire = beginDate.setMonth(beginDate.getMonth() + mSteps[cycleName]); expire = new Date(expire); while(expire.getTime() \u0026lt; nowDate.getTime()){ expire = expire.setMonth(expire.getMonth() + mSteps[cycleName]); expire = new Date(expire); } expire = expire.toLocaleDateString(); } let endTime = parseInt(new Date(expire).getTime() / 1000); // 购买同款按钮 let $aButtonsBox = document.createElement(\u0026#39;div\u0026#39;); $aButtonsBox.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;margin-bottom: .5em;text-align:right;\u0026#39;); let $aLinkButtons = document.createElement(\u0026#39;div\u0026#39;); $aLinkButtons.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;btn-buy-box ui buttons mini\u0026#39;); let $aLinkBuy = document.createElement(\u0026#39;a\u0026#39;); $aLinkBuy.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui btn-buy button positive\u0026#39;); $aLinkBuy.setAttribute(\u0026#39;target\u0026#39;, shop ? \u0026#39;_blank\u0026#39; : \u0026#39;\u0026#39;); $aLinkBuy.innerHTML = \u0026#39;购买同款\u0026#39;; $aLinkBuy.href = shop ? affLinks[shop] : \u0026#39;javascript:void(0);\u0026#39;; if(pid){ $aLinkBuy.href += \u0026#39;\u0026amp;pid=\u0026#39;+ pid; } if(price){ // 购买价格行 let $priceL = document.createElement(\u0026#39;div\u0026#39;); $priceL.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;three wide column\u0026#39;); $priceL.innerHTML = \u0026#39;价格\u0026#39;; $descriptionGrid.insertBefore($priceL, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]); let $priceR = document.createElement(\u0026#39;div\u0026#39;); $priceR.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;price-box thirteen wide column\u0026#39;); $priceR.innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;ui red label\u0026#34;\u0026gt;\u0026lt;i class=\u0026#34;money bill alternate yellow icon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;+ price +\u0026#39;\u0026lt;a class=\u0026#34;detail\u0026#34;\u0026gt;\u0026#39;+ cycle +\u0026#39;\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;; $descriptionGrid.insertBefore($priceR, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]) } if(expire){ // 到期日期行 let $expireL = document.createElement(\u0026#39;div\u0026#39;); $expireL.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;three wide column\u0026#39;); $expireL.innerHTML = \u0026#39;到期\u0026#39;; $descriptionGrid.insertBefore($expireL, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]) // 到期日期行右侧进度条 let $expireR = document.createElement(\u0026#39;div\u0026#39;); let aTime = (nowTime-beginTime); let bTime = (endTime-beginTime); let cTime = parseInt(aTime / bTime * 100); let progressType = \u0026#39;red\u0026#39;; let textStyle = \u0026#39;text-shadow: 0px 0px 5px #db2828;left:.5em;text-align: right;\u0026#39;; if(expire === \u0026#39;∞\u0026#39;){ progressType = \u0026#39;success\u0026#39;; textStyle = \u0026#39;\u0026#39;; } $expireR.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;expire-box thirteen wide column\u0026#39;); $expireR.innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;ui indicating progress \u0026#39;+ progressType +\u0026#39; active\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;bar\u0026#34; style=\u0026#34;line-height: 1em !important;transition-duration: 300ms; min-width: unset; width: \u0026#39;+ cTime +\u0026#39;% !important;padding-left: 0.4em;\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;progress\u0026#34; style=\u0026#34;\u0026#39;+ textStyle +\u0026#39;\u0026#34;\u0026gt;\u0026#39;+ expire +\u0026#39;\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;; $descriptionGrid.insertBefore($expireR, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]) } $aLinkButtons.append($aLinkBuy); let $aLinkOr = document.createElement(\u0026#39;div\u0026#39;); $aLinkOr.innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;or\u0026#34; data-text=\u0026#34;or\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;; $aLinkButtons.append($aLinkOr); // 购买同款按钮右侧联系方式 let remainingAnimatedType = contacts[\u0026#39;animatedType\u0026#39;]; let priceValue = price.replace(/[$￥P€]/g, \u0026#39;\u0026#39;); let priceUnit = price.match(/[$￥P€]/g)[0]; let remainingDays = Math.floor((endTime - nowTime) / (24 * 60 * 60)); let remainingPrice = parseFloat(priceValue) / cycleValue * remainingDays; if(!remainingPrice){ remainingPrice = 0; } remainingPrice = remainingPrice.toFixed(2); let mainContact = contacts[\u0026#39;main\u0026#39;]; // 购买同款按钮右侧主要联系方式显示剩余价值 let $aLinkContactMain = document.createElement(\u0026#39;a\u0026#39;); $aLinkContactMain.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;contact-main ui button \u0026#39;+ remainingAnimatedType +\u0026#39; animated blue\u0026#39;); $aLinkContactMain.setAttribute(\u0026#39;target\u0026#39;, \u0026#39;_blank\u0026#39;); $aLinkContactMain.innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;hidden content\u0026#34; style=\u0026#34;padding:0;\u0026#34; title=\u0026#34;剩余价值\u0026#34;\u0026gt;\u0026#39;+ contacts[mainContact].label +\u0026#39;议价\u0026lt;/div\u0026gt;\u0026lt;div class=\u0026#34;visible content\u0026#34; style=\u0026#34;padding:0;\u0026#34; title=\u0026#34;剩余价值\u0026#34;\u0026gt;\u0026lt;i class=\u0026#34;\u0026#39;+ contacts[mainContact].icon +\u0026#39; icon\u0026#34; style=\u0026#34;color:white;\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;+ priceUnit + remainingPrice +\u0026#39;\u0026lt;/div\u0026gt;\u0026#39;; $aLinkContactMain.href = contacts[mainContact].url; $aLinkButtons.append($aLinkContactMain); $aButtonsBox.append($aLinkButtons); // 购买同款按钮右侧其它联系方式 for(let key in contacts){ if(key!=\u0026#39;main\u0026#39; \u0026amp;\u0026amp; key!=\u0026#39;animatedType\u0026#39; \u0026amp;\u0026amp; key!=contacts[\u0026#39;main\u0026#39;]){ let icon = contacts[key].icon; let $aLinkContact = document.createElement(\u0026#39;a\u0026#39;); $aLinkContact.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;contact-btn ui circular \u0026#39;+ icon +\u0026#39; mini icon button\u0026#39;); $aLinkContact.setAttribute(\u0026#39;target\u0026#39;, \u0026#39;_blank\u0026#39;); $aLinkContact.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;margin-left:.5em;\u0026#39;); $aLinkContact.innerHTML = \u0026#39;\u0026lt;i class=\u0026#34;\u0026#39;+ icon +\u0026#39; icon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;; $aLinkContact.href = contacts[key].url; $aButtonsBox.append($aLinkContact); } } $content.append($aButtonsBox); } }); }); } // ServerStatus主题 function bindToggleViewClick(){ let $toggleView = document.querySelector(\u0026#39;aside.toolbox .toggleView\u0026#39;) $toggleView \u0026amp;\u0026amp; $toggleView.addEventListener(\u0026#39;click\u0026#39;, ()=\u0026gt;{ setTimeout(function(){ location.reload(); }, 0); }); } if(preferredTheme === \u0026#39;server-status\u0026#39;){ bindToggleViewClick(); let $biThreeDots = document.querySelector(\u0026#39;aside.toolbox .bi-three-dots\u0026#39;); $biThreeDots \u0026amp;\u0026amp; $biThreeDots.addEventListener(\u0026#39;click\u0026#39;, ()=\u0026gt;{ bindToggleViewClick(); }); let $tables = document.querySelectorAll(\u0026#39;.table.table-condensed\u0026#39;); $tables.forEach(e=\u0026gt;{ $tableTh = e.querySelector(\u0026#39;.node-group-tag th\u0026#39;); $list = e.querySelectorAll(\u0026#39;tr.accordion-toggle\u0026#39;); $tableTh \u0026amp;\u0026amp; ($tableTh.innerText += \u0026#39;（\u0026#39;+ $list.length +\u0026#39;）\u0026#39;); let $head = e.querySelector(\u0026#39;table.table-condensed thead\u0026#39;).lastChild; let $servers = e.querySelector(\u0026#39;#servers\u0026#39;); // 隐藏三列：系统、在线天数、负载 $head.querySelector(\u0026#39;th.os\u0026#39;).style.display = \u0026#39;none\u0026#39;; $head.querySelector(\u0026#39;th.uptime\u0026#39;).style.display = \u0026#39;none\u0026#39;; $head.querySelector(\u0026#39;th.load\u0026#39;).style.display = \u0026#39;none\u0026#39;; // 添加三列 let $expireTh = document.createElement(\u0026#39;th\u0026#39;); $expireTh.innerText = \u0026#39;到期 / 剩余价值\u0026#39;; $expireTh.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell expire center\u0026#39;); $head.insertBefore($expireTh, $head.childNodes[3]); let $buyTh = document.createElement(\u0026#39;th\u0026#39;); $buyTh.innerText = \u0026#39;购买同款\u0026#39;; $buyTh.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell expire center\u0026#39;); $head.append($buyTh); let $contactTh = document.createElement(\u0026#39;th\u0026#39;); $contactTh.innerText = \u0026#39;议价\u0026#39;; $contactTh.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell expire center\u0026#39;); $head.append($contactTh); $servers.querySelectorAll(\u0026#39;tr.accordion-toggle\u0026#39;).forEach(ee=\u0026gt;{ ee.querySelector(\u0026#39;td.os\u0026#39;).style.display = \u0026#39;none\u0026#39;; ee.querySelector(\u0026#39;td.uptime\u0026#39;).style.display = \u0026#39;none\u0026#39;; ee.querySelector(\u0026#39;td.load\u0026#39;).style.display = \u0026#39;none\u0026#39;; let id = ee.getAttribute(\u0026#39;id\u0026#39;); id = id.replace(\u0026#39;r\u0026#39;, \u0026#39;\u0026#39;); if(extraData[id]){ let pid = extraData[id].pid; pid = parseInt(pid); let shop = extraData[id].shop; let price = extraData[id].price; let start = extraData[id].start; let expire = extraData[id].expire; let cycle = extraData[id].cycle; let autoPay = extraData[id].autoPay; let cycleName = cycleNames[cycle]; let cycleValue = cycleValues[cycleName]; let nowTime = parseInt(new Date().getTime() / 1000); let beginTime = parseInt(new Date(start).getTime() / 1000); if(autoPay \u0026amp;\u0026amp; autoPay==\u0026#39;是\u0026#39;){ let beginDate = new Date(start); let nowDate = new Date(); let mSteps = { year: 12, half: 6, quarterly: 3, month: 1, } expire = beginDate.setMonth(beginDate.getMonth() + mSteps[cycleName]); expire = new Date(expire); while(expire.getTime() \u0026lt; nowDate.getTime()){ expire = expire.setMonth(expire.getMonth() + mSteps[cycleName]); expire = new Date(expire); } expire = expire.toLocaleDateString(); } let endTime = parseInt(new Date(expire).getTime() / 1000); if(expire || price){ // 到期时间、剩余价值列 let $expireTd = document.createElement(\u0026#39;td\u0026#39;); $expireTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell expire\u0026#39;); let aTime = (nowTime-beginTime); let bTime = (endTime-beginTime); let cTime = parseInt(aTime / bTime * 100); let progressType = \u0026#39;danger\u0026#39;; if(expire === \u0026#39;∞\u0026#39;){ progressType = \u0026#39;warning\u0026#39;; } let priceValue = price.replace(/[$￥P€]/g, \u0026#39;\u0026#39;); let priceUnit = price.match(/[$￥P€]/g)[0]; let remainingDays = Math.floor((endTime - nowTime) / (24 * 60 * 60)); let remainingPrice = parseFloat(priceValue) / cycleValue * remainingDays; if(!remainingPrice){ remainingPrice = 0; } remainingPrice = remainingPrice.toFixed(2); $expireTd.innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;progress progress-expire\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;progress-bar progress-bar-\u0026#39;+ progressType +\u0026#39; progress-bar-striped active\u0026#34; style=\u0026#34;width: \u0026#39;+ cTime +\u0026#39;%;padding-right:5px;background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\u0026#34;\u0026gt;\u0026lt;small class=\u0026#34;progress\u0026#34; style=\u0026#34;white-space: nowrap;background-color: transparent !important;background-image: unset;\u0026#34;\u0026gt;\u0026#39;+ expire +\u0026#39; / \u0026#39;+ priceUnit + remainingPrice +\u0026#39;\u0026lt;/small\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;; ee.insertBefore($expireTd, ee.childNodes[3]); } // 购买同款列 let $buyTd = document.createElement(\u0026#39;td\u0026#39;); $buyTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell buy\u0026#39;); $buyTd.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;text-align:center;\u0026#39;); let $buyTdBtn = document.createElement(\u0026#39;div\u0026#39;); $buyTdBtn.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui left labeled button\u0026#39;); let $buyTdBtnLabel = document.createElement(\u0026#39;div\u0026#39;); $buyTdBtnLabel.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui basic label mini\u0026#39;); $buyTdBtnLabel.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;min-height: 20px;padding:0 .5em;height: 20px;font-weight:normal;line-height: 20px;font-size:.78571429rem;\u0026#39;); $buyTdBtnLabel.innerHTML = price +\u0026#39; / \u0026#39;+ cycle; $buyTdBtn.append($buyTdBtnLabel); let $buyTdBtnLabelIcon = document.createElement(\u0026#39;a\u0026#39;); $buyTdBtnLabelIcon.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui icon button mini green\u0026#39;); $buyTdBtnLabelIcon.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;min-height: 20px;padding:0 .5em;height: 20px;line-height: 20px;\u0026#39;); $buyTdBtnLabelIcon.setAttribute(\u0026#39;target\u0026#39;, shop ? \u0026#39;_blank\u0026#39; : \u0026#39;\u0026#39;); $buyTdBtnLabelIcon.addEventListener(\u0026#39;click\u0026#39;, (e)=\u0026gt;{e.stopPropagation()}); $buyTdBtnLabelIcon.innerHTML = \u0026#39;\u0026lt;i class=\u0026#34;shopping cart icon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;; $buyTdBtnLabelIcon.href = shop ? affLinks[shop] : \u0026#39;javascript:void(0);\u0026#39;; if(pid){ $buyTdBtnLabelIcon.href += \u0026#39;\u0026amp;pid=\u0026#39;+ pid; } $buyTdBtn.append($buyTdBtnLabelIcon); $buyTd.append($buyTdBtn); ee.append($buyTd); // 联系方式列 let $contactTd = document.createElement(\u0026#39;td\u0026#39;); $contactTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell contact\u0026#39;); $contactTd.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;text-align:center;white-space:nowrap;\u0026#39;); for(let key in contacts){ if(key!=\u0026#39;main\u0026#39; \u0026amp;\u0026amp; key!=\u0026#39;animatedType\u0026#39;){ let $contactTdContactBtn = document.createElement(\u0026#39;a\u0026#39;); let contactIcon = contacts[key].icon; $contactTdContactBtn.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui circular \u0026#39;+ contactIcon +\u0026#39; icon button mini blue\u0026#39;); $contactTdContactBtn.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;min-height: 20px;padding:0 .5em;height: 20px;line-height: 20px;\u0026#39;); $contactTdContactBtn.setAttribute(\u0026#39;target\u0026#39;, \u0026#39;_blank\u0026#39;); $contactTdContactBtn.addEventListener(\u0026#39;click\u0026#39;, (e)=\u0026gt;{e.stopPropagation()}); $contactTdContactBtn.innerHTML = \u0026#39;\u0026lt;i class=\u0026#34;\u0026#39;+ contactIcon +\u0026#39; icon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;; $contactTdContactBtn.href = contacts[key].url; $contactTd.append($contactTdContactBtn); } } ee.append($contactTd); } else { // 无附加信息时显示占位符 let $expireTd = document.createElement(\u0026#39;td\u0026#39;); $expireTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell expire\u0026#39;); $expireTd.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;text-align:center;\u0026#39;); $expireTd.innerHTML = \u0026#39;-\u0026#39;; ee.insertBefore($expireTd, ee.childNodes[3]); let $buyTd = document.createElement(\u0026#39;td\u0026#39;); $buyTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell buy\u0026#39;); $buyTd.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;text-align:center;\u0026#39;); $buyTd.innerHTML = \u0026#39;-\u0026#39;; ee.append($buyTd); let $contactTd = document.createElement(\u0026#39;td\u0026#39;); $contactTd.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;node-cell contact\u0026#39;); $contactTd.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;text-align:center;\u0026#39;); $contactTd.innerHTML = \u0026#39;-\u0026#39;; ee.append($contactTd); } }); }); } } \u0026lt;/script\u0026gt; 后台 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 \u0026lt;script\u0026gt; window.onload = function(){ const storagePreKey = \u0026#39;nzVpsChuChuangData.\u0026#39;; const storageSet = function(key, value){ key = `${storagePreKey}${key}`; localStorage.setItem(key, JSON.stringify(value)); } const storageGet = function(key, defaultValue){ key = `${storagePreKey}${key}`; return JSON.parse(localStorage.getItem(key)) || defaultValue; } const extraDataKeyName = { shop:\u0026#34;商家名称\u0026#34;, pid: \u0026#39;产品ID\u0026#39;, price:\u0026#34;购买价格\u0026#34;, cycle: \u0026#34;付款周期\u0026#34;, start: \u0026#34;购买日期\u0026#34;, expire: \u0026#34;过期时间\u0026#34;, autoPay: \u0026#39;自动续费\u0026#39;, } const cycleOptions = [ \u0026#39;年付\u0026#39;, \u0026#39;半年付\u0026#39;, \u0026#39;季付\u0026#39;, \u0026#39;月付\u0026#39;, \u0026#39;年\u0026#39;, \u0026#39;半\u0026#39;, \u0026#39;季\u0026#39;, \u0026#39;月\u0026#39;, \u0026#39;Year\u0026#39;, \u0026#39;Half\u0026#39;, \u0026#39;Quarterly\u0026#39;, \u0026#39;Month\u0026#39;, \u0026#39;Y\u0026#39;, \u0026#39;H\u0026#39;, \u0026#39;Q\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;year\u0026#39;, \u0026#39;half\u0026#39;, \u0026#39;quarterly\u0026#39;, \u0026#39;month\u0026#39;, ]; const autoPayOptions = [ \u0026#39;否\u0026#39;, \u0026#39;是\u0026#39; ]; let timmer = null; let changer = false; const pathname = location.pathname; const $footer = document.querySelector(\u0026#39;.footer\u0026#39;); if(!$footer || $footer.innerText.indexOf(\u0026#39;Powered by 哪吒监控\u0026#39;)==-1) return false; let raw = storageGet(\u0026#39;raw\u0026#39;, \u0026#39;\u0026#39;); let affLinks = storageGet(\u0026#39;affLinks\u0026#39;, null); let extra = storageGet(\u0026#39;extra\u0026#39;, null); let isFirst = false; if(affLinks == null \u0026amp;\u0026amp; extra== null){ isFirst = true; } if(pathname === \u0026#39;/setting\u0026#39;){ const $settingForm = document.forms.settingForm; let settingData = new FormData($settingForm); settingData = new URLSearchParams(settingData).toString(); storageSet(\u0026#39;raw\u0026#39;, settingData); const CustomCode = document.querySelector(\u0026#39;textarea[name=CustomCode]\u0026#39;).value; let CustomCodeValueAffLinks =CustomCode.match(/(?\u0026lt;=affLinks = )[\\s\\S]+(?=\\n([\\s\\t]+)?const contacts)/g); let CustomCodeValueExtra =CustomCode.match(/(?\u0026lt;=extraData = )[\\s\\S]+(?=\\n([\\s\\t]+)?const cycleNames)/g); if(!CustomCodeValueAffLinks || !CustomCodeValueExtra){ $.suiAlert({ title: \u0026#39;\u0026#39;, description: \u0026#39;请检查是否已经添加《哪吒面板VPS橱窗脚本》，脚本可去：https://www.bmqy.net/2665.html，获取\u0026#39;, type: \u0026#39;error\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); return false; } CustomCodeValueAffLinks = CustomCodeValueAffLinks ? CustomCodeValueAffLinks[0] : \u0026#39;{}\u0026#39;; CustomCodeValueAffLinks = CustomCodeValueAffLinks.replace(/([0-9a-zA-Z]+):\\s?\u0026#39;/g, \u0026#39;\u0026#34;$1\u0026#34;:\u0026#34;\u0026#39;).replace(/\u0026#39;/g, \u0026#39;\u0026#34;\u0026#39;).replace(/[\\r\\n]+/g, \u0026#39;\u0026#39;).replace(/,}/g, \u0026#39;}\u0026#39;); affLinks = JSON.parse(CustomCodeValueAffLinks); storageSet(\u0026#39;affLinks\u0026#39;, affLinks); CustomCodeValueExtra = CustomCodeValueExtra ? CustomCodeValueExtra[0] : \u0026#39;{}\u0026#39;; CustomCodeValueExtra = CustomCodeValueExtra.replace(/([0-9a-zA-Z]+):/g, \u0026#39;\u0026#34;$1\u0026#34;:\u0026#39;).replace(/},\\n}/g, \u0026#39;}\\n}\u0026#39;).replace(/\u0026#39;/g, \u0026#39;\u0026#34;\u0026#39;).replace(/[\\r\\n]+/g, \u0026#39;\u0026#39;).replace(/,}/g, \u0026#39;}\u0026#39;); extra = JSON.parse(CustomCodeValueExtra); storageSet(\u0026#39;extra\u0026#39;, extra); if(isFirst){ $.suiAlert({ title: \u0026#39;\u0026#39;, description: \u0026#39;VPS橱窗后台脚本数据获取成功，可以正常使用了。\u0026#39;, type: \u0026#39;success\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); } else { $.suiAlert({ title: \u0026#39;\u0026#39;, description: \u0026#39;VPS橱窗后台脚本已重新获取数据。\u0026#39;, type: \u0026#39;success\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); } } else { if(pathname !=\u0026#39;/\u0026#39; \u0026amp;\u0026amp; pathname !=\u0026#39;/login\u0026#39; \u0026amp;\u0026amp; (affLinks == null || extra == null)){ $.suiAlert({ title: \u0026#39;\u0026#39;, description: \u0026#39;请先进入【设置】页面获取脚本所需数据！！！\u0026#39;, type: \u0026#39;warning\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); return false; } if(pathname === \u0026#39;/server\u0026#39;){ createShopFormModal(affLinks); const $table = document.querySelector(\u0026#39;table.table\u0026#39;); const $tableTr = $table.querySelectorAll(\u0026#39;tbody tr\u0026#39;); $tableTr.forEach(e=\u0026gt;{ let $tds = e.querySelectorAll(\u0026#39;td\u0026#39;); let id = $tds[1].innerText; id = id.replace(/\\(\\d+\\)/g, \u0026#39;\u0026#39;); let $nameTd = $tds[2]; let $extraDataBox = document.createElement(\u0026#39;div\u0026#39;); $extraDataBox.id = id; $extraDataBox.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;extra-box\u0026#39;); $extraDataBox.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;margin-top:10px;\u0026#39;); for(let key in extraDataKeyName){ let extraData = extra[id]; let $inputLabel = document.createElement(\u0026#39;div\u0026#39;); $inputLabel.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;white-space: nowrap;padding-bottom:3px;\u0026#39;); let requiredTag = \u0026#39;\u0026#39;; if([\u0026#39;price\u0026#39;, \u0026#39;cycle\u0026#39;, \u0026#39;start\u0026#39;].indexOf(key) \u0026gt; -1){ requiredTag = \u0026#39;*\u0026#39;; } $inputLabel.innerHTML = \u0026#39;\u0026lt;span style=\u0026#34;display:inline-block;width:70px;\u0026#34;\u0026gt;\u0026#39;+ requiredTag + extraDataKeyName[key] +\u0026#39;：\u0026lt;/span\u0026gt;\u0026#39;; let $input = document.createElement(\u0026#39;input\u0026#39;); if(key === \u0026#39;pid\u0026#39;){ $input.placeholder = \u0026#39;商家所售产品ID\u0026#39;; } else if([\u0026#39;start\u0026#39;, \u0026#39;expire\u0026#39;].indexOf(key) \u0026gt; -1){ $input.placeholder = \u0026#39;月/日/年\u0026#39;; } else if(key === \u0026#39;price\u0026#39;){ $input.placeholder = \u0026#39;支持：$、￥、€、P\u0026#39;; } if([\u0026#39;shop\u0026#39;, \u0026#39;cycle\u0026#39;, \u0026#39;autoPay\u0026#39;].indexOf(key) \u0026gt; -1){ $input = document.createElement(\u0026#39;select\u0026#39;); if(key === \u0026#39;shop\u0026#39;){ $input.options.add(new Option(\u0026#39;请选择\u0026#39;, \u0026#39;\u0026#39;)); for(let key in affLinks){ $input.options.add(new Option(key, key)); } } if(key === \u0026#39;cycle\u0026#39;){ for(let key in cycleOptions){ $input.options.add(new Option(cycleOptions[key], cycleOptions[key])); } } if(key === \u0026#39;autoPay\u0026#39;){ for(let key in autoPayOptions){ $input.options.add(new Option(autoPayOptions[key], autoPayOptions[key])); } } } $input.name = key; if(extraData){ $input.value = extraData[key] ? extraData[key] : \u0026#39;\u0026#39;; } $input.addEventListener(\u0026#39;change\u0026#39;, ()=\u0026gt;{ changer = true; if(timmer) return false; console.log(\u0026#39;1s 后提交\u0026#39;); timmer = setTimeout(function(){ updateExtraData(); }, 1500); }); $input.addEventListener(\u0026#39;focus\u0026#39;, ()=\u0026gt;{ if(timmer){ console.log(\u0026#39;终断提交\u0026#39;); clearTimeout(timmer); timmer = null; } }); $input.addEventListener(\u0026#39;blur\u0026#39;, ()=\u0026gt;{ if(timmer) return false; if(changer){ console.log(\u0026#39;1s 后提交\u0026#39;); timmer = setTimeout(function(){ updateExtraData(); }, 1500); } }); $inputLabel.append($input); if(key === \u0026#39;shop\u0026#39;){ let $addShopBtn = document.createElement(\u0026#39;button\u0026#39;); $addShopBtn.title = \u0026#39;管理商家信息\u0026#39;; $addShopBtn.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui icon button mini\u0026#39;); $addShopBtn.setAttribute(\u0026#39;style\u0026#39;, \u0026#39;margin-left:5px;\u0026#39;); $addShopBtn.innerHTML = \u0026#39;\u0026lt;i class=\u0026#34;icon setting\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;; $addShopBtn.addEventListener(\u0026#39;click\u0026#39;, managerShoopFormModal); $inputLabel.append($addShopBtn); } $extraDataBox.append($inputLabel); } $nameTd.append($extraDataBox); }) } } function updateExtraData(){ let paramsRaw = new URLSearchParams(raw); let customCodeOld = paramsRaw.get(\u0026#39;CustomCode\u0026#39;); let $extraBox = document.querySelectorAll(\u0026#39;table.table .extra-box\u0026#39;); let extraNew = {}; $extraBox.forEach(e=\u0026gt;{ let shop = e.querySelector(\u0026#39;select[name=shop]\u0026#39;).value, pid = e.querySelector(\u0026#39;input[name=pid]\u0026#39;).value, price = e.querySelector(\u0026#39;input[name=price]\u0026#39;).value, cycle = e.querySelector(\u0026#39;select[name=cycle]\u0026#39;).value, start = e.querySelector(\u0026#39;input[name=start]\u0026#39;).value, expire = e.querySelector(\u0026#39;input[name=expire]\u0026#39;).value, autoPay = e.querySelector(\u0026#39;select[name=autoPay]\u0026#39;).value; if(price \u0026amp;\u0026amp; cycle \u0026amp;\u0026amp; start){ extraNew[e.id] = { shop: shop, pid: pid, price: price, cycle: cycle, start: start, expire: expire, autoPay: autoPay, } } }); storageSet(\u0026#39;extra\u0026#39;, extraNew); let customCodeNew = customCodeOld.replace(/(?\u0026lt;=extraData = )[\\s\\S]+(?=\\n[\\s\\t]*const cycleNames)/g, JSON.stringify(extraNew)); paramsRaw.set(\u0026#39;CustomCode\u0026#39;, customCodeNew); $.post(\u0026#39;/api/setting\u0026#39;, paramsRaw.toString()).then(res=\u0026gt;{ if(res.code == 200){ $.suiAlert({ title: \u0026#39;\u0026#39;, description: \u0026#39;VPS橱窗前台脚本更新成功。\u0026#39;, type: \u0026#39;success\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); } else { $.suiAlert({ title: \u0026#39;\u0026#39;, description: responses.responseText, type: \u0026#39;error\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); } }).catch(err=\u0026gt;{ $.suiAlert({ title: \u0026#39;\u0026#39;, description: JSON.stringify(err), type: \u0026#39;error\u0026#39;, time: \u0026#39;3\u0026#39;, position: \u0026#39;top-center\u0026#39;, }); }).always(()=\u0026gt;{ clearTimeout(timmer); timmer = null; changer = false; }) } function managerShoopFormModal(){ showOnSubmitFormModal(\u0026#34;.shopForm.modal\u0026#34;, \u0026#34;#shopForm\u0026#34;, \u0026#34;/api/setting\u0026#34;, getShopData); } function getShopData(){ let paramsRaw = new URLSearchParams(raw); let customCodeOld = paramsRaw.get(\u0026#39;CustomCode\u0026#39;); let affLinks = storageGet(\u0026#39;affLinks\u0026#39;, null); let customCodeNew = customCodeOld.replace(/(?\u0026lt;=affLinks = )[\\s\\S]+(?=\\n[\\s\\t]*const contacts)/g, JSON.stringify(affLinks)); paramsRaw.set(\u0026#39;CustomCode\u0026#39;, customCodeNew); return paramsRaw.toString(); } function updateShopData(){ let $shopForm = document.querySelector(\u0026#39;#shopForm\u0026#39;); let data = {}; let emptyCount = 0; for(let i=0; i\u0026lt;$shopForm.elements.length; i+=2){ let $name = $shopForm.elements[i]; let $url = $shopForm.elements[i+1]; if($name.value \u0026amp;\u0026amp; $url.value){ data[$name.value] = $url.value; storageSet(\u0026#39;affLinks\u0026#39;, data); if(i == $shopForm.elements.length-2){ createShopFormModal(data); } } else { emptyCount += 1; } } if(emptyCount \u0026gt; 1){ createShopFormModal(data); } } function createInput(name, value){ let $input = document.createElement(\u0026#39;input\u0026#39;); $input.type = \u0026#39;text\u0026#39;; $input.name = name; $input.setAttribute(\u0026#39;value\u0026#39;, value || \u0026#39;\u0026#39;); $input.placeholder = name===\u0026#39;name\u0026#39; ? \u0026#39;名称\u0026#39; : \u0026#39;邀请链接\u0026#39;; $input.addEventListener(\u0026#39;blur\u0026#39;, updateShopData); return $input; } function createShopFormModal(affLinks){ let $shopFormModal = document.querySelector(\u0026#39;#shopFormModal\u0026#39;); let isFirst = true; if(!$shopFormModal){ $shopFormModal = document.createElement(\u0026#39;div\u0026#39;); $shopFormModal.id = \u0026#39;shopFormModal\u0026#39;; $shopFormModal.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui tiny shopForm modal transition hidden\u0026#39;); } else { isFirst = false; $shopFormModal.innerHTML = \u0026#39;\u0026#39;; } let $shopForm = document.createElement(\u0026#39;form\u0026#39;); $shopForm.id = \u0026#39;shopForm\u0026#39;; $shopForm.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui form\u0026#39;); for(let key in affLinks){ let $shopFormField = document.createElement(\u0026#39;div\u0026#39;); let $shopFormGrid = document.createElement(\u0026#39;div\u0026#39;); $shopFormGrid.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui grid\u0026#39;); let $shopFormGridItem = document.createElement(\u0026#39;div\u0026#39;); $shopFormGridItem.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;four wide column\u0026#39;); $shopFormGridItem.append(createInput(\u0026#39;name\u0026#39;, key)); $shopFormGrid.append($shopFormGridItem); $shopFormGridItem = document.createElement(\u0026#39;div\u0026#39;); $shopFormGridItem.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;twelve wide column\u0026#39;); $shopFormGridItem.append(createInput(\u0026#39;url\u0026#39;, affLinks[key])); $shopFormGrid.append($shopFormGridItem); $shopFormField.append($shopFormGrid); $shopForm.append($shopFormField); } let $shopFormField = document.createElement(\u0026#39;div\u0026#39;); let $shopFormGrid = document.createElement(\u0026#39;div\u0026#39;); $shopFormGrid.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui grid\u0026#39;); let $shopFormGridItem = document.createElement(\u0026#39;div\u0026#39;); $shopFormGridItem = document.createElement(\u0026#39;div\u0026#39;); $shopFormGridItem.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;four wide column\u0026#39;); $shopFormGridItem.append(createInput(\u0026#39;name\u0026#39;, \u0026#39;\u0026#39;)); $shopFormGrid.append($shopFormGridItem); $shopFormGridItem = document.createElement(\u0026#39;div\u0026#39;); $shopFormGridItem.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;twelve wide column\u0026#39;); $shopFormGridItem.append(createInput(\u0026#39;url\u0026#39;, \u0026#39;\u0026#39;)); $shopFormGrid.append($shopFormGridItem); $shopFormField.append($shopFormGrid); $shopForm.append($shopFormField); let $shopFormModalHead = document.createElement(\u0026#39;div\u0026#39;); $shopFormModalHead.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;header\u0026#39;); $shopFormModalHead.innerHTML = \u0026#39;VPS橱窗商家信息管理\u0026#39;; $shopFormModal.append($shopFormModalHead); let $shopFormModalContent = document.createElement(\u0026#39;div\u0026#39;); $shopFormModalContent.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;content\u0026#39;); $shopFormModalContent.append($shopForm); $shopFormModal.append($shopFormModalContent); let $shopFormModalActions = document.createElement(\u0026#39;div\u0026#39;); $shopFormModalActions.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;actions\u0026#39;); let $shopFormModalActionsCancelBtn = document.createElement(\u0026#39;div\u0026#39;); $shopFormModalActionsCancelBtn.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui negative button\u0026#39;); $shopFormModalActionsCancelBtn.innerHTML = \u0026#39;取消\u0026#39;; $shopFormModalActions.append($shopFormModalActionsCancelBtn); let $shopFormModalActionsConfirmBtn = document.createElement(\u0026#39;div\u0026#39;); $shopFormModalActionsConfirmBtn.setAttribute(\u0026#39;class\u0026#39;, \u0026#39;ui positive nezha-primary-btn right labeled icon button vps-window-btn\u0026#39;); $shopFormModalActionsConfirmBtn.innerHTML = \u0026#39;确认\u0026lt;i class=\u0026#34;checkmark icon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;; $shopFormModalActions.append($shopFormModalActionsConfirmBtn); $shopFormModal.append($shopFormModalActions); isFirst \u0026amp;\u0026amp; document.body.append($shopFormModal); } function showOnSubmitFormModal(modelSelector, formID, URL, getData) { $(modelSelector) .modal({ closable: true, onApprove: function () { let success = false; const btn = $(modelSelector + \u0026#34; .vps-window-btn.button\u0026#34;); const form = $(modelSelector + \u0026#34; form\u0026#34;); if (btn.hasClass(\u0026#34;loading\u0026#34;)) { return success; } form.children(\u0026#34;.message\u0026#34;).remove(); btn.toggleClass(\u0026#34;loading\u0026#34;); const data = getData ? getData() : $(formID) .serializeArray() .reduce(function (obj, item) { // ID 类的数据 if (item.name === \u0026#34;pid\u0026#34;) { obj[item.name] = parseInt(item.value); } else { obj[item.name] = item.value; } return obj; }, {}); $.post(URL, data) .done(function (resp) { if (resp.code == 200) { window.location.reload() } else { form.append( `\u0026lt;div class=\u0026#34;ui negative message\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;header\u0026#34;\u0026gt;操作失败\u0026lt;/div\u0026gt;\u0026lt;p\u0026gt;` + resp.message + `\u0026lt;/p\u0026gt;\u0026lt;/div\u0026gt;` ); } }) .fail(function (err) { form.append( `\u0026lt;div class=\u0026#34;ui negative message\u0026#34;\u0026gt;\u0026lt;div class=\u0026#34;header\u0026#34;\u0026gt;网络错误\u0026lt;/div\u0026gt;\u0026lt;p\u0026gt;` + err.responseText + `\u0026lt;/p\u0026gt;\u0026lt;/div\u0026gt;` ); }) .always(function () { btn.toggleClass(\u0026#34;loading\u0026#34;); }); return success; }, }) .modal(\u0026#34;show\u0026#34;); } } \u0026lt;/script\u0026gt; ","date":"0001-01-01T00:00:00Z","permalink":"/p/","title":""},{"content":"curl -L https://raw.githubusercontent.com/nezhahq/scripts/main/agent/install.sh -o agent.sh \u0026amp;\u0026amp; chmod +x agent.sh \u0026amp;\u0026amp; env NZ_SERVER=52.8.122.123:8008 NZ_TLS=false NZ_CLIENT_SECRET=iK3Snw4Ev78MzMrbkABSF7a7DxN5pMir ./agent.sh\ns3\nPANEL_ADDRESS=\u0026ldquo;52.8.122.123:8008\u0026rdquo; SERVER_KEY=\u0026ldquo;iK3Snw4Ev78MzMrbkABSF7a7DxN5pMir\u0026rdquo; ENABLE_TLS=false UUID=\u0026ldquo;ca44a35e-055d-11f0-95de-3cecef0f5172\u0026rdquo; bash -c \u0026ldquo;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\" \u0026ndash; start\ns4\nPANEL_ADDRESS=\u0026ldquo;52.8.122.123:8008\u0026rdquo; SERVER_KEY=\u0026ldquo;iK3Snw4Ev78MzMrbkABSF7a7DxN5pMir\u0026rdquo; ENABLE_TLS=false UUID=\u0026ldquo;ca44a35e-055d-11f0-95de-3cecef0f5172\u0026rdquo; bash -c \u0026ldquo;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\" \u0026ndash; install\ns4-1\nPANEL_ADDRESS=\u0026ldquo;52.8.122.123:8008\u0026rdquo; SERVER_KEY=\u0026ldquo;iK3Snw4Ev78MzMrbkABSF7a7DxN5pMir\u0026rdquo; ENABLE_TLS=false UUID=\u0026ldquo;3d255188-055f-11f0-95de-3cecef0f5172\u0026rdquo; bash -c \u0026ldquo;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\" \u0026ndash; install\ns4-2\nPANEL_ADDRESS=\u0026ldquo;52.8.122.123:8008\u0026rdquo; SERVER_KEY=\u0026ldquo;iK3Snw4Ev78MzMrbkABSF7a7DxN5pMir\u0026rdquo; ENABLE_TLS=false UUID=\u0026ldquo;699baf70-055f-11f0-95de-3cecef0f5172\u0026rdquo; bash -c \u0026ldquo;$(curl -sL https://raw.githubusercontent.com/muyiacc/serv00-nezha/main/nezha-agent.sh)\" \u0026ndash; install\n","date":"0001-01-01T00:00:00Z","permalink":"/p/","title":""},{"content":"","date":"0001-01-01T00:00:00Z","permalink":"/p/","title":""}]