"
127 | ```
128 |
129 | 加上 --global 参数为全局配置
130 |
131 | - SSH 连接 GitHub
132 |
133 | 打开 GitHub,Settings,SSH and GPG keys,SSH keys,New SSH key,选择 Authentication Keys 项,填入公钥内容
134 |
135 | ```sh
136 | ssh -T git@github.com
137 | > Hi USERNAME! You've successfully authenticated, but GitHub does not
138 | > provide shell access.
139 | ```
140 |
141 | - SSH 签名提交
142 |
143 | 使用 SSH 密钥签名,signingkey 后面为公钥路径
144 |
145 | ```sh
146 | git config --global gpg.format ssh
147 | git config --global user.signingkey /path/.ssh/key.pub
148 | ```
149 |
150 | 配置 commit 和 tag 自动签名
151 |
152 | ```sh
153 | git config --global commit.gpgsign true
154 |
155 | # tag 签名后,无法再使用轻标签,必须写注释
156 | git config --global tag.gpgsign true
157 | ```
158 |
159 | 在 GitHub 设置中添加 SSH key,选择 Signing key 项,填入公钥内容
160 |
161 | - 自建 Git 仓库
162 |
163 | 开源的 Git 服务器工具也有许多,例如 GitLab、Gitea、Gogs,但自己配置起来较为困难,如果只是想保存代码,可以直接使用 git 搭配 ssh 实现
164 |
165 | 假定服务器 IP 地址 192.168.1.2,服务器用户 root,代码仓库名称 atri,代码仓库的分支名称 main
166 |
167 | 1. 连接服务器
168 |
169 | 生成密钥,输入如下命令,然后按三次回车
170 |
171 | ```sh
172 | ssh-keygen -t ed25519
173 | ```
174 |
175 | Linux 默认生成的位置是 `~/.ssh`,Windows 是在 `%HOMEPATH%\.ssh`
176 |
177 | 该目录下会生成私钥文件 id_ed25519 和公钥文件 id_ed25519.pub,将公钥的内容写入到服务器 ~/.ssh/ 目录下的 authorized_keys 文件中
178 |
179 | 2. 创建远程仓库
180 |
181 | 在服务器创建没有工作空间的裸库,如果希望有具体项目文件,则去掉 --bare 参数
182 |
183 | ```sh
184 | ssh root@192.168.1.2 git init --bare atri.git
185 | ```
186 |
187 | 3. 提交代码到服务器
188 |
189 | 添加远程仓库的地址,并起别名为 vps
190 |
191 | ```sh
192 | git remote add vps root@192.168.1.2:atri.git
193 | ```
194 |
195 | 将本地的 main 分支推送过去
196 |
197 | ```sh
198 | git push vps main
199 | ```
200 |
--------------------------------------------------------------------------------
/documents/gs3101-bridge.md:
--------------------------------------------------------------------------------
1 | # 移动光猫 GS3101 改桥接,用路由器拨号
2 |
3 | 后台管理地址可以在光猫和路由器的背面标签上查看。光猫后台地址一般为 192.168.1.1,路由器后台地址一般为 192.168.0.1
4 |
5 | ## 光猫
6 |
7 | ### 1. 获取管理员密码
8 |
9 | 使用无线网或者网线连接光猫,打开浏览器,进入光猫后台,输入光猫背面标签上的用户名和密码,登陆成功后,打开 `192.168.1.1/cgi-bin/getGateWay.cgi`,此时应看到如下内容
10 |
11 | ```
12 | Family GateWay
13 | Yes
14 | ```
15 |
16 | 如果第二行显示的是 No,请确保仍然处于登陆状态,然后刷新页面
17 |
18 | 命令行输入 `telnet 192.168.1.1`,tc login 填 `admin`,password 填 `s2@We3%Dc`,登陆成功。继续输入 `cat /tmp/ctromfile.cfg | grep 'user'` 即可看到所有的用户和密码,用户名为 `CMCCAdmin` 的就是管理员
19 |
20 | ### 2. 获取拨号上网的账号和密码
21 |
22 | 仍然使用 `telnet 192.168.1.1` 命令登陆,输入 `cat /tmp/ctromfile.cfg | grep 'PPManualStatus='` 即可看到拨号上网的账号和密码
23 |
24 | ### 3. 改桥接
25 |
26 | 1. 连接名称选择 INTERNET_R_VID
27 | 2. 模式选择 Bridge
28 | 3. 承载业务选择 INTERNET
29 | 4. 勾选相应的 LAN 口,也就是路由器 WAN 所连接的光猫的 LAN 的网口
30 | 5. 桥类型选择 PPPoE_Bridged
31 |
32 | ## 路由器
33 |
34 | 打开 WAN 口设置,上网方式选择宽带拨号上网,输入相应的宽带账号和密码,MTU 使用默认值
35 |
36 | - Wi-Fi 协议说明
37 |
38 | ||Wi-Fi 0/1/2/3|Wi-Fi 4|Wi-Fi 5|Wi-Fi 6|
39 | |-|-|-|-|-|
40 | |协议|802.11/b/a/g|802.11n|802.11ac|802.11ax|
41 | |频段|-|2.4/5GHz|5GHz|2.4/5GHz|
42 |
43 | ## 常见问题
44 |
45 | - 宽带拨号上网,提示帐号或密码错误
46 |
47 | 在确定帐号密码正确的情况下,使用路由器 PPPoE 拨号时,可能会提示帐号或密码错误,可以尝试以下解决方法
48 |
49 | 1. 使用特殊拨号模式
50 | 2. 在路由器 MAC 地址设置中选择克隆 MAC 地址
51 |
52 | - 改桥接后,路由器上网的设备无法访问光猫
53 |
54 | 1. 用网线连接光猫
55 | 2. 如果光猫还在发射 WiFi 信号,连接光猫的 WiFi
56 | 3. 如果光猫的 DHCP 服务没有关闭,把路由器 WAN 临时改回 DHCP
57 |
--------------------------------------------------------------------------------
/documents/http-server.md:
--------------------------------------------------------------------------------
1 | # Web HTTP 服务器
2 |
3 | ## Caddy
4 |
5 | Caddy 是一个强大的,开源的,使用 Go 编写的自动配置 HTTPS 的 Web 服务器
6 |
7 | https://caddyserver.com
8 |
9 | - 配置
10 |
11 | 配置文件为 /etc/caddy/Caddyfile,自定义的额外配置文件放在 /etc/caddy/conf.d/ 目录下,文件名随意,数据目录 /var/lib/caddy
12 |
13 | - 开启 gzip
14 |
15 | ```nginx
16 | example.com {
17 | encode gzip
18 | }
19 | ```
20 |
21 | - 只接受特定目录的请求
22 |
23 | ```nginx
24 | example.com {
25 | route {
26 | reverse_proxy /test/* 127.0.0.1:8080
27 |
28 | handle /* {
29 | abort
30 | }
31 | }
32 | }
33 | ```
34 |
35 | - 自定义回应状态码
36 |
37 | respond 404 或 error 404
38 |
39 | - 代理到域名子目录
40 |
41 | ```nginx
42 | example.com {
43 | handle /test/* {
44 | reverse_proxy localhost:8080
45 | }
46 | }
47 | ```
48 |
49 | - 禁用 SSL 仅 HTTP
50 |
51 | ```nginx
52 | http://example.com {
53 | ...
54 | }
55 | ```
56 |
57 | - 重定向跳转
58 |
59 | permanent 为永久重定向参数
60 |
61 | ```nginx
62 | example1.com {
63 | redir https://example2.com{uri} permanent
64 | }
65 | ```
66 |
67 | - 同网站启用多个域名
68 |
69 | ```nginx
70 | example1.com, example2.com {
71 | ...
72 | }
73 | ```
74 |
75 | - 反向代理
76 |
77 | ```nginx
78 | example.com {
79 | reverse_proxy 127.0.0.1:8080
80 | }
81 | ```
82 |
83 | - 静态文件服务
84 |
85 | file_server 后面加上 browse 参数开启文件目录功能
86 |
87 | ```nginx
88 | example.com {
89 | root /srv/http
90 | file_server
91 | }
92 | ```
93 |
94 | ## Nginx
95 |
96 | Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器
97 |
98 | https://nginx.org
99 |
100 | Nginx Proxy Manager 是一个 Nginx 可视化的反向代理管理系统,以下在用到时会简称为 NPM
101 |
102 | https://nginxproxymanager.com
103 |
104 | - 开启强制 HTTPS
105 |
106 | ```nginx
107 | server {
108 | listen 80;
109 | server_name example.com;
110 | return 301 https://$server_name$request_uri;
111 | }
112 |
113 | server {
114 | listen 443 ssl;
115 | server_name example.com;
116 |
117 | ...
118 | }
119 | ```
120 |
121 | - 部署静态文件
122 |
123 | NPM 中添加一个代理,Forward Hostname / IP 填 `127.0.0.1`,Forward Port 填 `80`,在 Advanced 列添加以下内容,`/data/www` 即为映射到容器中的静态文件的目录
124 |
125 | ```nginx
126 | location / {
127 | root /data/www;
128 | }
129 | ```
130 |
131 | - 关闭 ip 访问
132 |
133 | 添加以下 server 配置
134 |
135 | ```nginx
136 | server {
137 | listen 80;
138 | server_name _;
139 | return 444;
140 | }
141 | ```
142 |
143 | - 反向代理
144 |
145 | 添加以下 server 示例
146 |
147 | ```nginx
148 | server {
149 | set $forward_scheme http;
150 | set $server 127.0.0.1;
151 | set $port 8080;
152 |
153 | listen 80;
154 | server_name example.com;
155 |
156 | location / {
157 | add_header X-Served-By $host;
158 | proxy_set_header Host $host;
159 | proxy_set_header X-Forwarded-Scheme $scheme;
160 | proxy_set_header X-Forwarded-Proto $scheme;
161 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
162 | proxy_set_header X-Real-IP $remote_addr;
163 | proxy_pass $forward_scheme://$server:$port$request_uri;
164 | }
165 | }
166 | ```
167 |
168 | - 实现 HTTPS 正向代理
169 |
170 | 需要添加 ngx_http_proxy_connect_module 模块,以及 http_stub_status_module 和 http_ssl_module 模块
171 |
172 | 1. 前者安装方式详见 [ngx_http_proxy_connect_module#install](https://github.com/chobits/ngx_http_proxy_connect_module#install)
173 | 2. 后者在编译时添加参数 `--with-http_stub_status_module --with-http_ssl_module`
174 |
175 | 添加以下 server 配置
176 |
177 | ```nginx
178 | server {
179 | listen 8080;
180 | server_name 0.0.0.0;
181 |
182 | resolver 8.8.8.8;
183 |
184 | proxy_connect;
185 | proxy_connect_allow 443 80;
186 | proxy_connect_connect_timeout 10s;
187 | proxy_connect_data_timeout 10s;
188 |
189 | location / {
190 | proxy_pass http://$host;
191 | proxy_set_header Host $host;
192 | }
193 | }
194 | ```
195 |
196 | - localhost 无法访问
197 |
198 | 将 server_name 改为 `0.0.0.0` 将监听所有可用的网络接口,即可以从本地网络中的其他计算机访问该服务
199 |
200 | - 实现站点伪静态
201 |
202 | 在 server 中添加如下信息
203 |
204 | ```nginx
205 | location / {
206 | try_files $uri $uri/ /index.php?$args;
207 | }
208 | ```
209 |
210 | ## SSH
211 |
212 | - SSH connect
213 |
214 | 默认使用 22 端口进行通信,连接时会读取配置文件 ~/.ssh/config
215 |
216 | ```
217 | Host github.com
218 | HostName github.com
219 | User git
220 | IdentityFile ~/.ssh/id_ed25519
221 |
222 | Host vps1
223 | HostName IP
224 | User root
225 | Port 22
226 | IdentityFile ~/.ssh/vps1-key
227 | ```
228 |
229 | 上述记录声明在使用 ssh 连接 Host 记录的名称时,将其解析为 HostName 记录的值,登入的用户名为 User 记录的值,连接的端口为 Port 记录的值,使用的私钥文件为 IdentityFile 记录的值
230 |
231 | - ssh 通道传输文件
232 |
233 | ```sh
234 | scp -r /a user@host:/a
235 | ```
236 |
237 | - 指定密钥登入服务器
238 |
239 | ```sh
240 | # -p 指定端口号
241 | ssh -i ~/.ssh/id_key user@host
242 | ```
243 |
244 | - 生成 ed25519 加密的 ssh 密钥
245 |
246 | ```sh
247 | # -C 添加注释信息
248 | ssh-keygen -t ed25519
249 | ```
250 |
251 | - 从指定私钥生成公钥
252 |
253 | ```sh
254 | ssh-keygen -y -f key > key.pub
255 | ```
256 |
257 | - 将公钥上传到服务器
258 |
259 | ```sh
260 | ssh-copy-id -i SSHKEY USER@IP
261 | ```
262 |
263 | ## 其他
264 |
265 | - HTTP content-type
266 |
267 | 1. application/octet-stream 二进制流数据
268 | 2. text/plain 纯文本格式
269 | 3. multipart/form-data 表单上传文件时使用
270 |
271 | - 网站防盗链
272 |
273 | 为请求头 Content-Type 添加 Referer 字段,值为请求的网站地址
274 |
275 | - 解决网页不允许粘贴
276 |
277 | 1. 开发者模式
278 | 2. 右上角的设置,左侧偏好设置,找到调试程序
279 | 3. 勾选停用 JavaScript
280 |
--------------------------------------------------------------------------------
/documents/index.md:
--------------------------------------------------------------------------------
1 | # 写在前面
2 |
3 | 本站使用 NodeJS 项目 [VuePress](https://v2.vuepress.vuejs.org) 在 GitHub Action 中构建,并推送到 [Vercel](https://vercel.com) 作站点托管
4 |
5 | 本站域名由 [EU.org](https://nic.eu.org) 提供,使用 [Cloudflare](https://www.cloudflare.com) 作 DNS 解析
6 |
7 | 本站使用的插件:
8 |
9 | - @vuepress/plugin-prismjs@next
10 |
11 | 未经特殊说明,本站作品均采用 [知识共享署名 4.0 国际许可协议](https://creativecommons.org/licenses/by/4.0) 进行许可
12 |
13 | 本站源代码采用 [MIT 许可证](https://github.com/nibazshab/docs/blob/main/LICENSE) 进行许可
14 |
15 | 如果对本站感觉良好,还望在 [GitHub 仓库](https://github.com/nibazshab/docs) 给小站点个 Star
16 |
17 | 感谢各位 :heart:
18 |
19 | 声明:本站中出现的任何信息,均仅供参考,不对有可能出现的任何问题、错误或损坏进行担保
20 |
21 | 复现本站点:
22 |
23 | 1. 安装 Node.js 以及 pnpm
24 | 2. 运行以下指令
25 |
26 | ```sh
27 | git clone https://github.com/nibazshab/docs.git
28 | cd docs/src
29 | chmod +x env.sh && ./env.sh
30 | pnpm dev
31 | ```
32 |
--------------------------------------------------------------------------------
/documents/linux-help.md:
--------------------------------------------------------------------------------
1 | # Linux 常见问题
2 |
3 | 测试于 Arch Linux,不确保适用所有系统
4 |
5 | ## 终端篇
6 |
7 | ### crontab 定时任务
8 |
9 | 在 /var/spool/cron/crontabs/root 中写入任务,运行 `crond` 命令启动
10 |
11 | 定时规则如下所示,例如 `0 3,15 * * * sh /a.sh` 表示每天 3 点和 15 点,执行 `sh /a.sh` 命令
12 |
13 | ```
14 | * * * * *
15 | - - - - -
16 | | | | | |
17 | | | | | +----- day of week (0 - 7) (Sunday=0 or 7)
18 | | | | +---------- month (1 - 12)
19 | | | +--------------- day of month (1 - 31)
20 | | +-------------------- hour (0 - 23)
21 | +------------------------- minute (0 - 59)
22 | ```
23 |
24 | ### 恢复误删文件,进程还在运行
25 |
26 | 查看该进程的 pid 号,假设为 721,进入 /proc/721/fd 目录,输入 `ls -l` 查看数字文件对应的硬链接文件名,假设查看有如下信息
27 |
28 | ```
29 | Aug 1 09:48 10 -> /data/db.sqlite3 (deleted)
30 | Aug 1 09:48 11 -> /data/db.sqlite3 (deleted)
31 | ```
32 |
33 | 选择时间靠后或数字编号更大的文件,此处输入 `cp 11 /bak/db.sqlite3` 即可
34 |
35 | ### PUTTY 控制台的 ls 命令没有颜色
36 |
37 | 由于 PUTTY 的连接可能导致控制台彩色显示失效,可以尝试使用 `ls --color=auto` 来重新定义 LS_COLORS 环境变量等
38 |
39 | [更多](https://wiki.archlinux.org/title/Color_output_in_console#ls)
40 |
41 | ### Possibly missing firmware for module XXXX
42 |
43 | 当内核更新后,镜像 initramfs 被重新构建时,你可能得到以下警告
44 |
45 | ```
46 | ==> WARNING: Possibly missing firmware for module: xhci_pci
47 | ==> WARNING: Possibly missing firmware for module: aic94xx
48 | ==> WARNING: Possibly missing firmware for module: bfa
49 | ```
50 |
51 | 如果在生成默认 initramfs 镜像时出现这些或类似的消息,如警告所述,可能需要安装其他固件。大多数常见的固件文件可以通过安装 `linux-firmware` 来获取。对于其他的固件软件包,可以尝试在软件包仓库中搜索固件模块的名字获取。聚合包 `mkinitcpio-firmware` 包括绝大部分的固件,或者手动安装所需的固件包
52 |
53 | 如果消息仅在生成 fallback initramfs 镜像时出现,可以禁止 fallback 镜像的生成,在 `/etc/mkinitcpio.d` 目录下的 preset 文件中,将 PRESETS= 里的 fallback 移除,重新生成系统引导
54 |
55 | [更多](https://wiki.archlinux.org/title/Mkinitcpio#Possibly_missing_firmware_for_module_XXXX)
56 |
57 | ## 桌面篇
58 |
59 | ### 快捷键切换 TTY 环境
60 |
61 | `Ctrl`+`Alt`+`Fn`
62 |
63 | ### GNOME 主题修改,顶栏半透明
64 |
65 | GNOME Shell 主题被存储为二进制文件 `/usr/share/gnome-shell/gnome-shell-theme.gresource`,运行 extractgst.sh 拆包脚本,在 `$HOME` 目录得到主题配置文件
66 |
67 | extractgst.sh
68 |
69 | ```sh
70 | #!/bin/sh
71 | gst=/usr/share/gnome-shell/gnome-shell-theme.gresource
72 | workdir=$HOME
73 | for r in `gresource list $gst`; do
74 | r=${r#\/org\/gnome\/shell/}
75 | if [ ! -d $workdir/${r%/*} ]; then
76 | mkdir -p $workdir/${r%/*}
77 | fi
78 | done
79 | for r in `gresource list $gst`; do
80 | gresource extract $gst $r >$workdir/${r#\/org\/gnome\/shell/}
81 | done
82 | ```
83 |
84 | 将主题配置文件 gnome-shell.css 中的 #panel 模块里的 background-color 的值修改为 `rgba(0,0,0,0.6)`
85 |
86 | 输入 `glib-compile-resources gnome-shell-theme.gresource.xml` 指令按照 gnome-shell-theme.gresource.xml 打包配置文件,将主题重新打包成二进制文件,替换原来的主题,重启 GNOME Shell
87 |
88 | gnome-shell-theme.gresource.xml
89 |
90 | ```xml
91 |
92 |
93 |
94 | calendar-today.svg
95 | calendar-today-light.svg
96 | checkbox.svg
97 | checkbox-focused.svg
98 | checkbox-off-focused-light.svg
99 | checkbox-off-focused.svg
100 | checkbox-off-light.svg
101 | checkbox-off.svg
102 | gnome-shell.css
103 | gnome-shell-high-contrast.css
104 | gnome-shell-start.svg
105 | pad-osd.css
106 | process-working.svg
107 | toggle-off.svg
108 | toggle-off-hc.svg
109 | toggle-off-light.svg
110 | toggle-on.svg
111 | toggle-on-hc.svg
112 | toggle-on-light.svg
113 | workspace-placeholder.svg
114 |
115 |
116 | ```
117 |
118 | [更多](https://wiki.archlinux.org/title/GDM#Configuration)
119 |
120 | ### 开启内核级显示模式设置
121 |
122 | KMS 通常是在 initramfs stage 之后开始初始化,但是也可以在 initramfs 的阶段启用
123 |
124 | 将视频驱动模块加入 `/etc/mkinitcpio.conf` 的 MODULES= 里,使用 `mkinitcpio -P` 指令重新生成内核
125 |
126 | - AMD GPU 加入 `amdgpu`,老的 ATI 驱动加入 `radeon`
127 | - Intel GPU 加入 `i915`
128 | - NVIDIA 驱动的 `nvidia nvidia_modeset nvidia_uvm nvidia_drm`,详见 [NVIDIA#DRM kernel mode setting](https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting)
129 |
130 | 为了避免更新 NVIDIA 驱动之后忘了更新 initramfs,建议使用 Pacman Hooks 自动生成新内核,将以下内容添加到 `/etc/pacman.d/hooks/nvidia.hook`
131 |
132 | ```ini
133 | [Trigger]
134 | Operation=Install
135 | Operation=Upgrade
136 | Operation=Remove
137 | Type=Package
138 |
139 | Target=nvidia
140 | Target=linux
141 |
142 | [Action]
143 | Description=Updating NVIDIA module in initcpio
144 | Depends=mkinitcpio
145 | When=PostTransaction
146 | NeedsTargets
147 | Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'
148 | ```
149 |
150 | [更多](https://wiki.archlinux.org/title/Kernel_mode_setting#Early_KMS_start)
151 |
152 | ### GDM 以 x11 运行在 NVIDIA GPU
153 |
154 | 创建一个符号链接来强制使用 wayland 运行桌面环境 `ln -s /dev/null /etc/udev/rules.d/61-gdm.rules`
155 |
156 | [更多](https://wiki.archlinux.org/title/GDM#Wayland_and_the_proprietary_NVIDIA_driver)
157 |
158 | ### 桌面环境挂起后无法唤醒
159 |
160 | 为触摸板加载了 intel_lpss_pci 模块的 Intel CPU 的电脑,在休眠后可能会出现黑屏无法唤醒的情况
161 |
162 | 将 `intel_lpss_pci` 添加到 `/etc/mkinitcpio.conf` 的 MODULES= 里,使用 `mkinitcpio -P` 指令重新生成内核
163 |
--------------------------------------------------------------------------------
/documents/minecraft.md:
--------------------------------------------------------------------------------
1 | # 我的世界 Minecraft
2 |
3 | Minecraft 是一个关于破坏和放置方块的游戏
4 |
5 | > 本文不适用于网易版我的世界
6 |
7 | ## 服务端
8 |
9 | - Java 版服务器搭建
10 |
11 | 使用 docker 镜像 itzg/minecraft-server 作服务器运行环境,默认会自动下载最新的官方纯净版运行核心并启动,支持指定版本号,以及手动下载的第三方 jar 包运行核心
12 |
13 | https://docker-minecraft-server.readthedocs.io
14 |
15 | 输入 `docker exec -i 容器名 rcon-cli` 即可进入服务器控制台
16 |
17 | > 第三方运行核心推荐 Mohist
18 |
19 | - 隐藏服务器端口
20 |
21 | 通过 DNS 解析中的 SRV 功能,实现不需要端口连接我的世界服务器
22 |
23 | 添加一个 DNS 解析,主机记录写 `_minecraft._tcp.mc`,记录类型为 `SRV`,记录值为 `5 0 25565 域名`
24 |
25 | 命令行输入 `nslookup -q=srv _minecraft._tcp.mc.域名` 查看上述 SRV 解析是否成功
26 |
27 | 进入 mc 游戏后添加服务器,服务器地址填 `mc.域名` 即可
28 |
29 | - 控制台指令记录
30 |
31 | ```
32 | gamemode MODE,切换游戏模式
33 | time set 0,设置时间为日出
34 | gamerule doDaylightCycle false,关闭时间流逝
35 | fill x y z x y z 方块,填充区域
36 | fill x y z x y z 草方块 replace 泥土,用草方块替换区域内的泥土
37 | ```
38 |
39 | 服务器管理指令
40 |
41 | ```
42 | op NAME,将玩家提升为管理员
43 | deop NAME,将管理员降级为玩家
44 | whitelist add ID,添加白名单
45 | ```
46 |
47 | ## 客户端推荐
48 |
49 | - PCL 2
50 |
--------------------------------------------------------------------------------
/documents/peach.md:
--------------------------------------------------------------------------------
1 | # 世外桃源
2 |
3 | ## 订阅
4 |
5 | - 腾讯云上海服务器,2025/9/25
6 | - icu 域名,2025/9/26,腾讯云
7 | - eu.org 域名
8 | - dpdns.org 域名,2026/6/14
9 | - 电信卡流量包,2025/8/31
10 |
11 | ## 购物
12 |
13 | Bing:积分兑换礼物
14 |
15 | 猫:客服小蜜 - 猫超卡补卡 - 自助补卡 - 联系在线客服 - 猫超卡过期 - 提交补卡申请
16 |
17 | 狗:客户服务 - 价格保护 - 一键价保
18 |
19 | 产品|渠道|购买日期|保修月限|状态
20 | -|-|-|-|-
21 | Apple 电脑 Mac mini M4|京东|2025/3|12/24|✓
22 | 盖世小鸡手柄 启明星|抖音|2024/7|12|✓
23 | 酷态科充电宝 PB100|京东|2024/4|18|✓
24 | 真我手机 Neo5 SE|京东|2023/6|12|✓
25 | 雷鸟电视 鹏 7Pro|京东|2023/6|12/36|✓
26 | TL 摄像头 IPC44AW|京东|2023/6|12|✓
27 | 罗技鼠标 G304|京东|2023/6|24|✓
28 | Apple 手机 iPhone 13mini|天猫|2022/6|12|✓
29 | 联想平板 小新 Pad 2020|淘特|2022/5|12|✓
30 | SoundPEATS 耳机 Air3|京东|2021/9|12|✓
31 | 贱驴鼠标 2003B|京东|2021/8|6|✓
32 | 爱国者硬盘 SSD P2000|京东|2021/8|60|✓
33 | 米家台灯 1S|京东|2021/8|12|✓
34 | iKBC 键盘 C87|京东|2021/6|12|✓
35 | Xbox 手柄 pdp PowerA|淘宝|2021/2|3|✗
36 | 英菲克耳机 i12|一淘|2020/9|12|✗
37 | Kindle 电子书 X|咪咕阅读|2020/8|12|✗
38 | 米家电扇 1X|苏宁|2020/7|48+24|✓
39 | 罗技鼠标 G102|京东|2020/7|24|✗
40 | 荣耀电视 智慧屏 X1|京东|2020/7|12+12|✓
41 | 米家台灯 1S|京东|2020/7|12|✓
42 | 漫步者耳机 TWS1|京东|2020/6|12|丢失
43 | Apple 手机 iPhone XR|京东|2020/5|12|✓
44 | 水星路由器 D191G|京东|2020/4|12|✓
45 | 神舟电脑 战神 Z7-CT5NA|淘宝|2020/3|24/12|✓
46 | SLC 优盘 IS903|淘宝|2019/1|12|✓
47 | 紫米充电宝 APB01|天猫|2018/11|12|✗
48 | 先锋相机 SL1624A|苏宁|2018/9|12|✗
49 | OPPO 手机 A3|专卖店|2018/8|12|✗
50 | 华为手机 P10|苏宁|2018/7|12|✗
51 | 环格 MP3 HR330|淘宝|2018/7|12|✗
52 | 吉莱克储存卡|淘宝|2018/5|24|✗
53 | 荣耀手机 畅玩 6|苏宁|2018/5|12|✗
54 | -|-|-|-|-
55 | 苏泊尔电压力锅 SY-60YC8010EQ|京东|2024/1|12|厨房
56 | 域能吊灯|京东|2023/6|24|客厅
57 | 美的吸顶灯|京东|2023/6|60|次卧
58 | 美的吸顶灯|京东|2023/6|60|主卧
59 | TCL 吊灯|京东|2022/1|36|客厅
60 | 全品屋椅子|京东|2021/9|36|✗
61 | 米家电水壶 1A|京东|2021/6|12|厨房
62 | -|-|-|-|-
63 | 首信平板 SF101
64 | 凤凰山地自行车
65 | 科诺平板 GB960
66 | VIVO 手机 Y927
67 | VIVO 手机 V3MAXA
68 | 酷派手机
69 | 三星手机
70 | 中兴手机
71 | 海信手机
72 |
--------------------------------------------------------------------------------
/documents/python.md:
--------------------------------------------------------------------------------
1 | # Python
2 |
3 | 整理文件夹
4 |
5 | ```py
6 | import os
7 | import shutil
8 |
9 | # 进入 ev 目录
10 | os.chdir("ev")
11 |
12 | # 遍历子目录,移动所有 png 文件到当前目录
13 | for root, dirs, files in os.walk('.'):
14 | for file in files:
15 | if file.lower().endswith('.png'):
16 | src_path = os.path.join(root, file)
17 | dest_path = os.path.join(os.getcwd(), file)
18 |
19 | # 处理文件名冲突
20 | if os.path.exists(dest_path):
21 | base, ext = os.path.splitext(file)
22 | counter = 1
23 | while True:
24 | new_name = f"{base}_{counter}{ext}"
25 | new_dest = os.path.join(os.getcwd(), new_name)
26 | if not os.path.exists(new_dest):
27 | dest_path = new_dest
28 | break
29 | counter += 1
30 | shutil.move(src_path, dest_path)
31 | ```
32 |
33 | 备份数据库并上传 webdav
34 |
35 | ```py
36 | import datetime
37 | import subprocess
38 | import requests
39 | import gzip
40 | import os
41 |
42 | def set_file_name(name):
43 | global file_name
44 | file_name = f"{name}.{time}.sql"
45 |
46 | def backup_sql(host, user, password, database):
47 | cmd = f"mysqldump -h {host} -u {user} -p'{password}' {database} --no-tablespaces > {file_path}{file_name}"
48 | try:
49 | subprocess.run(cmd, shell=True, check=True)
50 | print("备份成功")
51 | except subprocess.CalledProcessError as e:
52 | print(f"备份失败:{e}")
53 |
54 | def compress_file():
55 | gzip_file_name = f"{file_name}.gz"
56 | with open(f"{file_path}{file_name}", 'rb') as f_in:
57 | with gzip.open(f"{file_path}{gzip_file_name}", 'wb') as f_out:
58 | f_out.writelines(f_in)
59 | print(f"文件已压缩为 {gzip_file_name}")
60 | return gzip_file_name
61 |
62 | def upload(gzip_file_name):
63 | webdav_url = f"https://webdav/sql/{gzip_file_name}"
64 | with open(f"{file_path}{gzip_file_name}", "rb") as f:
65 | file_data = f.read()
66 | response = requests.put(
67 | webdav_url,
68 | data=file_data,
69 | headers={"Content-Type": "application/octet-stream"},
70 | auth=("user", "123456"),
71 | )
72 | if response.status_code == 201 or response.status_code == 204:
73 | print("上传成功")
74 | else:
75 | print(f"上传失败,状态码: {response.status_code}")
76 | print(response.text)
77 |
78 | time = datetime.datetime.now().strftime("%Y-%m-%d")
79 | file_path = "/home/"
80 |
81 | set_file_name("c1")
82 | backup_sql("mysql.c1", "root", "123456", "c1")
83 | gzip_file_name = compress_file()
84 | upload(gzip_file_name)
85 | ```
86 |
87 | 爬取小说网站的网页 html 内容
88 |
89 | ```py
90 | import requests
91 | from bs4 import BeautifulSoup
92 | from urllib.parse import urljoin
93 |
94 | headers = {
95 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
96 | }
97 |
98 | url = "https://www.ql"
99 |
100 | ida = 1
101 | while ida < 5:
102 | print(f"当前页:{url}")
103 | response = requests.get(url, headers=headers)
104 |
105 | if response.status_code == 200:
106 | html_content = response.content
107 | soup = BeautifulSoup(html_content, 'html.parser')
108 |
109 | title = soup.find('h1').text.strip() # 处理标题去掉多余的空格
110 |
111 | # 提取内容中的每个 标签,保留段落关系
112 | paragraphs = soup.find('div', {'id': 'content'}).find_all('p')
113 | content = "\n\n".join([para.text.strip() for para in paragraphs if para.text.strip()])
114 |
115 | # 查找下一页链接
116 | next_page_tag = soup.find('p', {'id': 'page_next'}).find('a')
117 | if next_page_tag and next_page_tag.has_attr('href'):
118 | next_page_url = next_page_tag['href']
119 | next_page_url = urljoin(url, next_page_url)
120 | else:
121 | print("没有找到下一页链接")
122 | next_page_url = None
123 |
124 | # 保存当前页内容
125 | file = f"dist/a{ida}.txt"
126 | with open(file, 'w', encoding='utf-8') as f:
127 | f.write(f"标题:{title}\n\n{content}")
128 | print(f"标题:{title}\n已写入:{file}\n下一页:{next_page_url}\n")
129 |
130 | # 如果没有下一页链接,停止爬取
131 | if not next_page_url:
132 | break
133 |
134 | # 更新url为下一页
135 | url = next_page_url
136 | ida += 1
137 | else:
138 | print("请求失败\n")
139 | break
140 | ```
141 |
142 | 将首行(标题)相同的文件合并为一个文件
143 |
144 | ```py
145 | import os
146 | i = 0
147 | ida = 1
148 | while (ida < 400):
149 | file = f"dist/a{ida}.txt"
150 | with open(file, 'r') as f:
151 | head2 = f.readline()
152 | if head1==head2:
153 | join = f"join/b{i}.txt"
154 | print(f"{file}:合并 {join}")
155 | with open(join, 'a+') as outfile:
156 | outfile.write(f.read())
157 | else:
158 | i+=1
159 | join = f"join/b{i}.txt"
160 | print(f"{file}:保存至 {join}")
161 | head1=head2
162 | with open(join, 'a+') as outfile:
163 | outfile.write(head2)
164 | outfile.write(f.read())
165 | ida += 1
166 | ```
167 |
168 | 响应 curl -X POST -d "key=$SECRET&link=$LINK",key 作为认证参数,link 作为接受到的文本信息参数
169 |
170 | ```py
171 | from flask import Flask, request
172 | import os
173 | app = Flask(__name__)
174 | @app.route('/', methods=['POST'])
175 | def handle_post():
176 | key = request.form.get('key')
177 | link = request.form.get('link')
178 |
179 | if key == 'SECRET':
180 | command = f'echo The Link is: {link}'
181 | os.system(command)
182 | return f'Link: {link}'
183 | else:
184 | return 'Invalid key'
185 |
186 | if __name__ == '__main__':
187 | app.run(host='0.0.0.0', port=8080)
188 | ```
189 |
190 | smtp 发送邮件
191 |
192 | ```py
193 | import smtplib
194 |
195 | # 设置邮件发送服务器
196 | smtp_server = ''
197 | smtp_port =
198 |
199 | # 创建SMTP会话
200 | smtp = smtplib.SMTP(smtp_server, smtp_port)
201 | smtp.login('', '')
202 |
203 | # 设置发件人和收件人邮箱地址
204 | sender_email = ''
205 | receiver_email = ''
206 |
207 | # 构造邮件内容
208 | subject = 'Hello from Python'
209 | body = 'This is a test email sent using Python smtplib without SSL.'
210 |
211 | message = 'Subject: {}\n\n{}'.format(subject, body)
212 |
213 | # 发送邮件
214 | smtp.sendmail(sender_email, receiver_email, message)
215 |
216 | # 退出SMTP会话
217 | smtp.quit()
218 | ```
219 |
--------------------------------------------------------------------------------
/documents/regex.md:
--------------------------------------------------------------------------------
1 | # 正则表达式 RegEx
2 |
3 | 正则表达式是一种用于匹配和操作文本的,由一系列字符和特殊字符组成的模式
4 |
5 | |表达式|说明|
6 | |-|-|
7 | |`<[^>]+>`|全部的 html 标签|
8 | |`(? 的行,就拆分成新的文件
5 | i=0
6 | while read h
7 | do
8 | if [[ $h == *"
"* ]]
9 | then i=$((i + 1))
10 | fi
11 | echo $h >> $(printf "%0.3d.xhtml" $i)
12 | done < a.html
13 |
14 | # 把 a 中对应行记录的文件,移动或重命名为 b 中对应行的记录值
15 | a=1
16 | for i in $(cat a.txt)
17 | do
18 | j=$(sed -n "$a p" b.txt)
19 | mv "$i" "$j"
20 | a=$(($a+1))
21 | done
22 |
23 | # 交换文件的奇偶行
24 | IFS=$'\n'
25 | sed -n '1~2p' c.txt > a.txt
26 | sed -n '2~2p' c.txt > b.txt
27 | a=1
28 | for i in $(cat a.txt)
29 | do
30 | j=$(sed -n "$a p" b.txt)
31 | echo "$j" >> d.txt
32 | echo "$i" >> d.txt
33 | a=$(($a+1))
34 | done
35 | ```
36 |
37 | ```sh
38 | # 输出 one1 one2 ... three2 three3
39 | echo {one,two,three}{1,2,3}
40 |
41 | # 取 i 值为 1 到 10
42 | for i in {1..10}
43 |
44 | # 读取 find 的结果,或使用 for i in $(find)
45 | find | while read i
46 | do
47 | echo $i
48 | done
49 |
50 | # 无限循环
51 | while true
52 | do
53 | 命令
54 | done
55 |
56 | # 判断环境变量 C 的值是否为 1
57 | [[ "$C" = "1" ]] && {
58 | 命令
59 | }
60 |
61 | # 判断上一个命令是否运行成功,成功1,失败 0
62 | # -e file 判断文件是否存在,-d 判断文件夹,-z 和 -n 判断变量是否为空
63 | if [[ $? == 0 ]]
64 | then
65 | echo 1
66 | else
67 | echo 0
68 | fi
69 |
70 | # 如果 A > 1 且 B = 0,则 X = X / A
71 | if [[ $A -gt 1 && $B -eq 0 ]]
72 | then
73 | X=$(expr $X / $A)
74 | fi
75 | ```
76 |
77 | ```sh
78 | # 以 = 为分隔符,提取 rpc-secret 开头的对应值
79 | awk -F= '/^rpc-secret/ {print $2}' a.txt
80 |
81 | # 删除 html 标签
82 | sed -E 's/<[^>]+>//g' a.html
83 |
84 | # 删除所有的换行符,操作行时,需要添加 :a;N; 和 ;ta
85 | sed ":a;N;s/\n//g;ta" a.txt
86 |
87 | # 把以 a 开头的行中,所有的 b 替换为 c
88 | sed '/^a/s/b/c/' a.txt
89 |
90 | # 把包含 key 的行替换成 key=123
91 | sed /key/s/.*/key=123/ a.txt
92 |
93 | # 删除包含 ABC 的行,-i 修改文件
94 | sed -i /ABC/d a.txt
95 |
96 | # 删除 3-7 行
97 | sed 3,7d a.txt
98 |
99 | # 在第 3 行前插入 abc
100 | sed 3iabc a.txt
101 |
102 | # 替换文件内容中的 a 为 b,也可以使用 @ 和 : 替换 / 作为分隔符
103 | # 正则表达式 -E 的替换参数使用 \1 而非 $1
104 | sed s/a/b/g a.txt
105 |
106 | # 输出文件奇数行,1~2p 从第 1 行开始,每 2 行输出一次
107 | # 1,4p 表示从第 1 行到第 4 行
108 | sed -n 1~2p a.txt
109 |
110 | # 删除重复行
111 | uniq
112 |
113 | # 删除重复行,会打乱顺序
114 | sort -u a.txt
115 |
116 | # 随机抽取 1-10 之间的数字,输入 shuf 文件名,则随机打乱文件的行
117 | shuf -i 1-10
118 |
119 | # 匹配大于等于一个字符的行,-P 非贪婪匹配,-o 只输出匹配的部分
120 | grep -E '.{1,}' a.md
121 |
122 | # 在 /etc/ 目录搜索内容 abc,-r 递归查找子目录,-n 显示行号
123 | grep -rn 'abc' /etc/
124 |
125 | # 获取内容 abc 在文件中的行号
126 | grep -n 内容 文件 | grep -o ^[0-9]*
127 |
128 | # 删除 a.txt 中所有的 aa 字符
129 | tr -d 'aa' < a.txt
130 |
131 | # 去除 a 变量中 ) 右边所有内容
132 | b=${a%)*}
133 |
134 | # 去除 a 变量中 ( 左边所有内容
135 | b=${a#*(}
136 |
137 | # 把分隔符设为换行
138 | IFS=$'\n'
139 |
140 | # 显示文件的行号,或使用 nl 命令
141 | cat -n a.txt
142 |
143 | # 写入文件,单引号的 'EOL' 表示写入内容时不转义
144 | cat << EOL > a.txt
145 | hello world
146 | EOL
147 |
148 | # 指定输出 2 位小数
149 | printf "%0.2d.txt" $i
150 |
151 | # 输出 i 变量的文件名称,不输出的结尾部分的 .md
152 | basename $i .md
153 |
154 | # 加法运算,等效 i=$(($i+1))
155 | i = $(expr $i + 1)
156 |
157 | # 定义数组
158 | cities=("1" "2" "3")
159 | for city in "${cities[@]}"
160 |
161 | # 文件编码 gbk 转换 utf-8
162 | iconv -f gbk -t utf-8 gbk.txt > utf-8.txt
163 |
164 | # 转换 windows 换行符 \r\n 为 linux 的 \n
165 | dos2unix file
166 | ```
167 |
168 | ```sh
169 | # 终端设置代理,等效于 http_proxy=ip:port https_proxy=ip:port
170 | export all_proxy=ip:port
171 |
172 | # 查看端口占用情况
173 | lsof -Pi
174 |
175 | # 设置代理下载
176 | wget -e http_proxy=http://127.0.0.1:7890 example.com/index.html
177 |
178 | # 添加 header
179 | curl -H 'token: 2a9b3f'
180 |
181 | # 设置代理访问,-x 等同 --proxy
182 | curl -x socks5://127.0.0.1:1024 example.com
183 |
184 | # 发送 POST 请求,设置参数 key 为 123456,-F NAME=@FILE 上传文件
185 | curl -X POST -d key=123456 example.com
186 |
187 | # 上传文件到 WebDAV 服务器,目录需要加 / 符号
188 | curl -u "USERNAME":"PASSWORD" -T "d/file" WEBDAV_URL -w "%{http_code}"
189 |
190 | # 下载 WebDAV 服务器文件
191 | curl -u USERNAME:PASSWORD -O WEBDAV_URL
192 | ```
193 |
194 | ```sh
195 | # 创建软链接 b,指向 a
196 | ln -s a b
197 |
198 | # 生成 uuid,dbus-uuidgen 命令生成没有分隔符的 uuid
199 | uuidgen
200 |
201 | # 在终端指定位置显示信息
202 | tput sc; tput cup 23 45; echo Input from tput/echo at 23/45; tput rc
203 |
204 | # 查看系统参数
205 | uname -a
206 |
207 | # 查询自己的 uid/gid
208 | id
209 |
210 | # 创建无法登录的用户 atri,删除用户用 userdel
211 | useradd -s /usr/bin/nologin atri
212 |
213 | # 生成 6M 大小的文件
214 | dd if=/dev/urandom of=test bs=1M count=6
215 |
216 | # 调用 gzip 压缩文件,-c 打包,-f 指定文件
217 | # -z/-j/-J 调用 gzip/bzip2/xz,-I zstd 调用 zstd,--exclude file 排除文件,-C 切换目录
218 | tar -czf file.tar.gz path/
219 |
220 | # 解压文件,-x 解压,-v 显示详细过程
221 | # --strip-components=1 减少一个目录层级,-C 指定解压目录
222 | tar -xvf file.tar
223 |
224 | # gzip 压缩文件,-d 解压
225 | gzip file
226 |
227 | # 输出当前时间,年月日时分秒
228 | date +"%Y-%m-%d %H:%M:%S"
229 |
230 | # 显示目录文件,-f 完整路径,-p 权限,-D 日期,-i 不显示树状图,-L 2 只显示 2 层目录
231 | tree -fipDL 2
232 |
233 | # 清理内存缓存
234 | sync && echo 3 | tee /proc/sys/vm/drop_caches
235 |
236 | # 查看文件的依赖情况
237 | ldd file
238 |
239 | # 列出文件,-t 时间顺序,-tr 时间倒序,-v 自然顺序
240 | ls
241 |
242 | # 后台运行
243 | nohup 命令 > log 2>&1 &
244 |
245 | # 创建 screen 后台运行会话,-ls 查看会话列表
246 | screen -dmS 会话名 命令
247 |
248 | # 进入 screen 后台会话,按 Ctrl + A + D 退出会话
249 | screen -r 会话名
250 |
251 | # 查看系统进程,或 ps -ef
252 | htop
253 |
254 | # 加密文件,-d 解密,-aes-256-cbc 使用 CBC 模式 的 AES-256 算法 ,-pbkdf2 使用 PBKDF2 加密算法,-salt 盐加密
255 | openssl enc -aes-256-cbc -pbkdf2 -salt -in text.txt -out encrypt.txt
256 |
257 | # 以 nobody 用户的身份运行命令
258 | su nobody -s /bin/bash -c '命令'
259 |
260 | # 导出分区表文件
261 | sfdisk -d /dev/sdb > sdb.bkp
262 |
263 | # 导入分区表文件
264 | sfdisk /dev/sdb < sdb.bkp
265 | ```
266 |
267 | ```sh
268 | # fish 添加 PATH
269 | fish_add_path /root/bin
270 |
271 | # arch linux 系列包管理器
272 | # -S 安装,-Si 查看信息
273 | # -Ql 查看本地文件
274 | # -Ss 根据关键词搜索包
275 | # -F 根据文件名查询包
276 | # -Rs 卸载
277 | # -Qdt 查找孤立依赖包
278 | # -U 安装本地文件包
279 | # -Syu 更新所有包
280 | # --noconfirm 跳过确认
281 | pacman
282 |
283 | # 转换 webp 为 png
284 | dwebp a.webp -o a.png
285 |
286 | # 转换 jpg 为 avif
287 | avifenc cover.jpg cover.avif
288 |
289 | # 压缩 jpg 图片大小
290 | jpegoptim --strip-all --all-progressive -o -f --max=50% a.jpg
291 |
292 | # 压缩 png 图片大小, 压缩等级设为 3,可选 1-7
293 | optipng -o3 a.png
294 |
295 | # flac 转 wav
296 | flac -d a.flac
297 |
298 | # wav 转 flac,指定压缩级别为 5
299 | flac -s --compression-level-5 a.wav
300 |
301 | # 重新编码 flac 文件
302 | flac a.flac -V -s --best --no-error-on-compression-fail -o b.flac
303 |
304 | # 查看系统信息,其他 neofetch
305 | fastfetch
306 |
307 | # 假装进行非常专业的活动
308 | genact
309 |
310 | # 使用 rclone 挂载云盘为本地目录,并设置缓存路径
311 | rclone mount name:/a /b --cache-dir /c --vfs-cache-mode writes
312 | ```
313 |
314 | ```powershell
315 | # 查看文件 SHA256,MD5
316 | certutil -hashfile file SHA256
317 | ```
318 |
--------------------------------------------------------------------------------
/documents/sql.md:
--------------------------------------------------------------------------------
1 | # 数据库基本指南
2 |
3 | 基本使用
4 |
5 | ```sql
6 | -- 增删改查
7 | INSERT INTO products (name, price, cover) VALUES ('Apple', 1.2, 'apple.jpg');
8 | SELECT * FROM products WHERE price > 1.0;
9 | UPDATE products SET price = 1.5 WHERE name = 'Apple';
10 | DELETE FROM products WHERE name = 'Apple';
11 |
12 | -- 按照 id 倒序获取前 5 条数据,跟 OFFSET 5 表示跳过前 5 行, DESC 降序,ASC 升序
13 | SELECT * FROM tablename ORDER BY id DESC LIMIT 5;
14 |
15 | -- 清空表
16 | DELETE FROM tablename;
17 |
18 | -- 删除表
19 | DROP TABLE tablename;
20 |
21 | -- 记录阅读量 +1
22 | UPDATE xxxxx SET count = count+1 WHERE id = 1;
23 |
24 | -- 将 file_url 表中的 url 列中所有 apple 字段替换成 banana
25 | UPDATE file_url SET url = replace (url, 'apple', 'banana');
26 | ```
27 |
28 | 创建表名为 user,id 主键,整数型,自增长,user 字符串型,最大长度 30,不为空
29 |
30 | ```sql
31 | CREATE TABLE IF NOT EXISTS user (
32 | id INT AUTO_INCREMENT PRIMARY KEY,
33 | user VARCHAR(30) NOT NULL
34 | );
35 | ```
36 |
37 | ## MySQL / MariaDB
38 |
39 | TEXT 类型最大 64k,MEDIUMTEXT 类型最大 16m,LONGTEXT 类型最大 4g
40 |
41 | ```sql
42 | show databases; -- 列出所有数据库
43 | show tables; -- 列出所有表
44 | show columns from user; -- 查看 user 表的结构
45 | show create table user; -- 查看 user 表的创建语句
46 | ```
47 |
48 | 连接数据库,后面跟数据库名称可连接指定数据库(test),本机可省略 -h,无密码可省略 -p
49 |
50 | ```sh
51 | mysql -h 127.0.0.1 -u root -p123456 test
52 | ```
53 |
54 | - 数据导出 sql 文件
55 |
56 | 增加 --no-tablespaces 参数无视表结构,--set-gtid-purged=OFF 不包含 GTID,后跟表名可单独导出一张表
57 |
58 | ```sh
59 | mysqldump -h 127.0.0.1 -u root -p123456 database_name > db.sql
60 | ```
61 |
62 | - 恢复 sql 数据
63 |
64 | ```sh
65 | mysql -u root -p database_name < db.sql
66 | ```
67 |
68 | 或者
69 |
70 | ```sql
71 | use database_name
72 | source /sql/file.sql
73 | ```
74 |
75 | - 设置密码
76 |
77 | ```sql
78 | USE mysql
79 | SET password = PASSWORD('password');
80 | FLUSH PRIVILEGES;
81 | ```
82 |
83 | 如果出现 ERROR 1064 (42000),尝试去除 PASSWORD() 函数,直接写密码
84 |
85 | ## SQLite
86 |
87 | 支持的数据类型见 [https://sqlite.org/datatype3.html#affinity_name_examples](https://sqlite.org/datatype3.html#affinity_name_examples)
88 |
89 | ```sql
90 | .table -- 列出所有表
91 | .schema user -- 查看 user 表的创建语句
92 | ```
93 |
--------------------------------------------------------------------------------
/documents/steam.md:
--------------------------------------------------------------------------------
1 | # Steam 游戏平台
2 |
3 | Steam 是 Valve 公司推出的著名游戏分发平台,对于 Linux 平台,Steam 官方只提供对 Ubuntu LTS 版本的支持
4 |
5 | Value 公司发行的 Steam Deck 掌机使用基于 Arch Linux 所开发的 SteamOS 3 系统
6 |
7 | https://store.steampowered.com
8 |
9 | ## Steam 问题
10 |
11 | - 个人资料展柜展示图片
12 |
13 | 打开网页版 Steam 页面,在个人资料 - 艺术作品中点击上传艺术作品,选中非游戏特定后上传图片,随后打开开发者模式,在控制台中运行如下代码
14 |
15 | ```js
16 | // 图像大小
17 | $J('#image_width').val(1000).attr('id',''),$J('#image_height').val(1).attr('id','')
18 |
19 | // 隐藏作品名字
20 | v_trim=_=>{return _},$J('#title').val(' \n'+Array.from(Array(126),_=>'\t').join(''))
21 | ```
22 |
23 | 在展柜中选择精选艺术作品展柜,选中刚刚上传的图片即可(由于隐藏了作品名称,只能看到一个不显眼的横杠)
24 |
25 | - 新家庭共享
26 |
27 | 封禁连坐机制:只会封禁开挂者和开挂游戏的拥有者,不会殃及家庭中的其他成员
28 |
29 | 免费游戏不会被共享
30 |
31 | 依据官方 [拥有 VAC 封禁的游戏列表](https://store.steampowered.com/search/?category1=998&category2=8&hidef2p=1&ndl=1),如果不想让某个游戏共享到家庭,在 Steam 的该游戏界面上,点击管理,将游戏标记为私密即可
32 |
33 | - 收藏夹排序
34 |
35 | 在收藏夹的名称前面加空格即可,空的越多越靠前
36 |
37 | - 开启 Steam Deck 界面
38 |
39 | 1. 打开 Steam 安装目录,找到 package 文件夹
40 | 2. 进入 package 目录,创建一个名为 beta 的文件
41 | 3. 在 beta 文件中写入 `steampal_stable_9a24a2bf68596b860cb6710d9ea307a76c29a04d`
42 | 4. 在 Steam 的启动指令后面添加 `-gamepadui`
43 |
44 | - 跳正版分流验证
45 |
46 | 打开 Steam 安装目录,将 Steam 启动程序移动到其他目录,然后直接运行下载的正版分流游戏即可跳过 Steam 验证
47 |
48 | ## 游戏问题
49 |
50 | - Wallpaper Engine 创意工坊自动下载问题
51 |
52 | 如果在自己的电脑上登录了别人的 Steam 账号,恰好那个账号也拥有 Wallpaper 软件且订阅了大量创意工坊内容,会导致 Steam 自动将该账号的所订阅的 Wallpaper 创意工坊的内容添加到 `steam\steamapps\workshop\appworkshop_431960.acf` 配置文件的 WorkshopItemDetails 中,导致 WorkshopItemsInstalled 与之不匹配,从而一直下载内容
53 |
54 | 官方方法
55 |
56 | 1. 关闭 Steam
57 | 2. 转到 wallpaper_engine 安装目录
58 | 3. 运行 `wallpaper_engine\bin\steamredownloadfixer32.exe`
59 | 4. 重新启动 Steam 并验证 Wallpaper Engine 的文件完整性
60 |
61 | [更多](https://help.wallpaperengine.io/steam/redownload.html)
62 |
63 | 民间方法
64 |
65 | 直接修改配置文件,编辑 `steam\steamapps\workshop\appworkshop_431960.acf`,把 WorkshopItemDetails 的内容复制替换到 WorkshopItemsInstalled 中即可
66 |
67 | ## Steam 令牌
68 |
69 | 先保存 Steam 令牌恢复代码
70 |
71 | - 导出 Steam 二次验证令牌到 Bitwarden
72 |
73 | 1. 方法一
74 |
75 | 前置条件:已开启 Steam 手机令牌,安卓手机 Root 并安装 LSPosed 框架
76 |
77 | 安装 [SteamGuardDump](https://github.com/YifePlayte/SteamGuardDump) 模块,在 LSPosed 模块设置中,将 SteamGuardDump 的作用域选中 Steam App
78 |
79 | 打开 Steam App,模块将自动复制一段内容到输入法剪贴板,从中找到这样的部分 `"uri": "otpauth://totp/Steam:steamid?secret=ABCDEFG12345678910JQKA&issuer=Steam"`,得到 secret
80 |
81 | 将 secret 写成这种形式 `steam://ABCDEFG12345678910JQKA`,并填入 Bitwarden 的 TOTP 框
82 |
83 | 2. 方法二
84 |
85 | 下载 Steam++,在本地令牌中,登录账号绑定令牌
86 |
87 | 将这个令牌导出为 maFile 文件,用文本编辑器打开,从中找到 url 的 otpauth 部分,得到 secret
88 |
89 | 3. 方法三
90 |
91 | 下载 [SDA](https://github.com/Jessecar96/SteamDesktopAuthenticator) 并按说明登陆账号使用,不要选择加密
92 |
93 | 在 SDA 安装目录下可以找到 maFile 文件
94 |
95 | ## Arch Linux / Steam Deck
96 |
97 | ### 安装
98 |
99 | 使用 Flatpak 安装可避免许多毛病
100 |
101 | ```sh
102 | flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
103 | flatpak --user install flathub com.valvesoftware.Steam
104 | flatpak run com.valvesoftware.Steam
105 | ```
106 |
107 | 默认情况下通过 Flatpak 安装的 Steam 不会有访问你的家目录的权限,并且由于安全问题,强行忽略此权限限制会导致 Steam 无法运行。不过,你可以自由地在家目录之外添加一个目录。如果你想添加一个外部库,你可以运行如下指令来添加
108 |
109 | ```sh
110 | flatpak --user override com.valvesoftware.Steam --filesystem=/path/to/directory
111 | ```
112 |
113 | 启动使用 Flakpak 安装的 steam 可能会发出警告有关安装 `steam-devices` 软件包的信息,此包暂不存在,可通过安装 Aur 的 `game-devices-udev` 来解决
114 |
115 | - Bottles 集成
116 |
117 | 如果使用 Flatpak 安装了 Bottles,你可以在 Steam 中使用它来运行 Windows 游戏,[参阅](https://docs.usebottles.com/flatpak/cant-enable-steam-proton-manager)
118 |
119 | ```sh
120 | flatpak override --user com.usebottles.bottles --filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam
121 | ```
122 |
123 | ### 常见问题
124 |
125 | - 运行非 steam 平台 exe 游戏
126 |
127 | 1. 点击 Steam 左下角添加游戏
128 | 2. 点击添加非 Steam 游戏
129 | 3. 选择游戏的 exe 启动程序
130 | 4. 点击添加选定的程序
131 | 5. 在属性 - 兼容性中勾选强制使用特定 Steam Play 兼容性工具
132 |
133 | - 亚洲字体乱码
134 |
135 | 1. 支持的字体
136 |
137 | 尝试安装 `lib32-fontconfig`、`ttf-liberation` 和 `wqy-zenhei`,然后重新启动 Steam 以查看问题是否已解决
138 |
139 | 当 Steam 找不到 Arial 字体时,font-config 喜欢回到 Helvetica 位图字体。Steam 无法正确呈现此位图字体以及可能的其他位图字体,因此,删除有问题的字体或禁用位图字体很可能会在不安装 Arial 或 ArialBold 字体的情况下解决问题。用于代替 Arial 的字体可以通过 `fc-match -v Arial` 指令找到
140 |
141 | 2. fontconfig
142 |
143 | 如上述方法未解决问题,尝试使用 fontconfig 为 Steam 指定字体
144 |
145 | 找到系统中的字体目录,一般为 `/usr/share/fonts`,假设存在 `/usr/share/fonts/win` 目录,其中包含的是 Windows 平台的字体
146 |
147 | 创建 `/usr/share/fonts/steam.conf` 文件,写入如下内容
148 |
149 | ```xml
150 |
151 |
152 |
153 | /usr/share/fonts/win
154 |
155 | ```
156 |
157 | 编辑 Steam.desktop,在所有 Exec= 后添加 `env FONTCONFIG_FILE=/usr/share/fonts/steam.conf`
158 |
--------------------------------------------------------------------------------
/documents/systemd.md:
--------------------------------------------------------------------------------
1 | # Systemd 服务
2 |
3 | systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序
4 |
5 | ## 文件路径
6 |
7 | 系统级单元路径:
8 |
9 | - /usr/lib/systemd/system/ 软件包单元
10 | - /etc/systemd/system/ 系统管理员单元
11 |
12 | 用户级单元路径:
13 |
14 | - /usr/lib/systemd/user/ 软件包单元
15 | - ~/.local/share/systemd/user/ 家目录中的软件包单元
16 | - /etc/systemd/user/ 系统管理员指定的用户单元
17 | - ~/.config/systemd/user/ 用户单元
18 |
19 | ## 各项使用方法
20 |
21 | - 单元文件
22 |
23 | ```ini
24 | [Unit]
25 | Description=描述
26 | [Service]
27 | ExecStart=启动命令
28 | Restart=on-failure
29 | [Install]
30 | #WantedBy=default.target #用户级单元使用
31 | WantedBy=multi-user.target
32 | ```
33 |
34 | 可以通过 `Environment="a=1"` 定义环境变量
35 |
36 | - 创建一个新服务
37 |
38 | 如果存在同名文件,会直接覆盖
39 |
40 | ```sh
41 | systemctl edit --force --full foo.service
42 | ```
43 |
44 | - 链接文件
45 |
46 | 创建一个软链接,指向该文件
47 |
48 | ```sh
49 | systemctl link ./foo.service
50 | ```
51 |
52 | - 查看已有服务
53 |
54 | 查看已有的服务由哪些文件组成,并显示内容
55 |
56 | ```sh
57 | systemctl cat foo.service
58 | ```
59 |
60 | - 修改现有服务
61 |
62 | 会在 foo.server 同级目录中创建一个 foo.service.d/override.conf 文件,并记录修改的内容,随后会附加到 foo.server 中
63 |
64 | 如果要完全的替换现有服务文件,应加入 `--full` 参数,随后正常按照新的文件来写
65 |
66 | ```sh
67 | systemctl edit foo.service
68 | ```
69 |
70 | 如果要替换一个可以多次设值的选项,应当先清空该项,例如
71 |
72 | ```ini
73 | [Service]
74 | ExecStart=
75 | ExecStart=/bin/foo --help
76 | ```
77 |
78 | 修改完成后需要重新启动服务
79 |
80 | - 定时任务
81 |
82 | 创建同名的 service 和 timer 文件,可以启动定时任务,随后启动 foo.timer 即可
83 |
84 | /etc/systemd/system/foo.service
85 |
86 | ```ini
87 | [Unit]
88 | Description=foo
89 | [Service]
90 | #WorkingDirectory=/opt #指定工作目录
91 | ExecStart=/bin/foo
92 | ```
93 |
94 | /etc/systemd/system/foo.timer
95 |
96 | ```ini
97 | [Unit]
98 | Description=foo at 2:00 and 19:00
99 | [Timer]
100 | OnCalendar=*-*-* 2,19:00:00 # 每天 2 点和 19 点
101 | [Install]
102 | WantedBy=multi-user.target
103 | ```
104 |
--------------------------------------------------------------------------------
/documents/vscode.md:
--------------------------------------------------------------------------------
1 | # VS Code 代码编辑器
2 |
3 | Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器
4 |
5 | https://code.visualstudio.com
6 |
7 | ## 安装
8 |
9 | - Linux
10 |
11 | Arch 系从 Aur 安装 `visual-studio-code-bin`,其他发行版在此不做介绍
12 |
13 | - WIndows
14 |
15 | 官网下载安装
16 |
17 | - Web
18 |
19 | 服务器端网页版 VS Code 见 code-server,在此不多做介绍
20 |
21 | https://github.com/coder/code-server
22 |
23 | ## 快捷键
24 |
25 | - `shift`+`alt`+`鼠标拖动`,出现多个光标
26 | - `ctrl`+`alt`+`↑/↓`,在同一列出现多个光标
27 | - 选中文字,按 `SHIFT`+`ALT`+`I`,每行末尾出现光标
28 | - `CTRL`+`SHIFT`+`END/HOME`,向下/上选中所有行
29 | - `ALT`+`SHIFT`+`F`,格式化代码
30 | - 选中文字,按 `CTRL`+`SHIFT`+`U/I`,大/小写转换
31 | - `CTRL`+`/`,注释选定的行
32 |
33 | ## 常见问题
34 |
35 | - 自动备份文件夹
36 |
37 | Windows 路径:%APPDATA%\Code\User\History
38 |
39 | - 切换终端的默认 shell
40 |
41 | Launch Profile - Set Default Profile
42 |
43 | - 设置项
44 |
45 | ```json
46 | // 编辑器字体
47 | "editor.fontFamily": "Source Code Pro, 思源黑体"
48 |
49 | // 忽略文件
50 | "files.exclude": {
51 | "*.code-workspace": true
52 | }
53 |
54 | // JavaScript 格式化时自动添加分号
55 | "javascript.format.semicolons": "insert"
56 | ```
57 |
58 | - 离线安装插件
59 |
60 | 在插件页面,选择 Install from VSIX...
61 |
62 | ## 扩展推荐
63 |
64 | - Chinese (Simplified) 简体中文界面
65 | - Live Server 静态网页服务器
66 | - Office Viewer 实时渲染的 Md 文档
67 | - Cdoe Runner 运行代码
68 |
69 | ---
70 |
71 | 浅色主题
72 |
73 | - GitHub Light Theme
74 | - Office Theme
75 |
76 | 深色主题
77 |
78 | - One Dark Pro
79 |
80 | ---
81 |
82 | - rust-analyzer,Rust
83 | - PHP Intelephense,PHP
84 | - Go,Go
85 |
--------------------------------------------------------------------------------
/documents/windows-help.md:
--------------------------------------------------------------------------------
1 | # Windows 常见指北
2 |
3 | 本文内容收集自网络,请自行甄别是否适用
4 |
5 | - OBS 录制黑屏
6 |
7 | 双显卡的笔记本电脑用户在使用 DXGI 捕捉屏幕时会黑屏,需要在图形设置中添加 OBS 并设为节能
8 |
9 | - 取消默认文件打开方式
10 |
11 | 1. HKEY_CLASSES_ROOT 删除指定文件类型
12 | 2. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts 删除指定文件类型
13 | 3. 重启资源管理器
14 |
15 | - SMB 共享文件夹
16 |
17 | 1. 属性 - 共享 - 共享 - 添加 Everyone 用户,给予权限
18 | 2. 属性 - 共享 - 高级共享 - 勾选共享此文件夹
19 | 3. 属性 - 共享 - 高级共享 - 权限 - 选择 Everyone 用户,给予权限
20 |
21 | - 输入的最后一个产品密钥不能用于此 Windows 副本
22 |
23 | 1. 注册表编辑器
24 | 2. 打开 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform
25 | 3. 查看 BackupProductKeyDefault 的值,并复制
26 | 4. 设置 - 更新和安全 - 激活,选择更改产品密钥
27 | 5. 粘贴刚刚复制的密钥,下一步,激活
28 |
29 | - 笔记本插电时保持小功率
30 |
31 | 1. 电源选项
32 | 2. 创建电源计划
33 | 3. 勾选节能
34 |
35 | - 安装 AppX/MSIX
36 |
37 | 1. 管理员权限打开 PowerShell
38 | 2. 输入 Add-AppxPackage app.AppxBundle
39 |
40 | - 系统处于测试签名模式
41 |
42 | 1. 管理员权限打开 PowerShell
43 | 2. 输入 bcdedit /set testsigning off
44 |
45 | - 加载驱动程序
46 |
47 | 1. 设备管理器
48 | 2. 更新驱动程序
49 | 3. 浏览我的电脑以查找驱动程序
50 | 4. 让我从计算机上的可用驱动程序列表中选取
51 | 5. 显示所有设备,下一步
52 | 6. 从磁盘中选择,找到 inf 文件
53 |
54 | - 删除文件管理器类型关联
55 |
56 | 1. 注册表编辑器
57 | 2. 删除 HKEY_CLASSES_ROOT 的键值
58 | 3. 删除 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts 的键值
59 | 4. 重启资源管理器
60 |
61 | - 强制删除脚本
62 |
63 | 1. 创建一个 bat 文件,写入如下内容
64 | 2. 将要删除的文件拖到该文件上
65 |
66 | ```batch
67 | DEL /F /A /Q \\?\%1
68 | RD /S /Q \\?\%1
69 | ```
70 |
71 | - PATH 环境变量
72 |
73 | 1. 系统
74 | 2. 高级系统设置
75 | 3. 环境变量
76 |
77 | - 处理 Microsoft Edge
78 |
79 | 建议直接卸载了事,卸载工具 Remove-MS-Edge
80 |
81 | https://github.com/ShadowWhisperer/Remove-MS-Edge
82 |
83 | ::: details 禁用自动更新
84 | 1. 计算机管理
85 | 2. 服务和应用程序
86 | 3. 禁用 Microsoft Edge Update Service (edgeupdate),Microsoft Edge Update Service (edgeupdatem),Microsoft Edge Elevation Service (MicrosoftEdgeElevationService)
87 | 4. 创建空文件,替换掉 %PROGRAMFILES(X86)%/Microsoft/EdgeUpdate/MicrosoftEdgeUpdate.exe
88 | :::
89 |
90 | - 降低 Win 安全中心的占用
91 |
92 | 1. win+r 输入 gpedit.msc
93 | 2. 打开计算机配置 - 管理模板 - Windows 组件 - Microsoft Defender 防病毒 - 扫描
94 | 3. 点击指定扫描期间 CPU 使用率的最大百分比
95 | 4. 左侧选择已启用,并将数值设为 5
96 |
97 | - 启用 PDF 虚拟打印机
98 |
99 | 1. 控制面板
100 | 2. 程序和功能
101 | 3. 启用或关闭 Windows 功能
102 | 4. 勾选Microsoft Print to PDF
103 |
104 | - 关闭睡眠和锁定按钮
105 |
106 | 1. 电源选项
107 | 2. 选择电源按钮功能
108 | 3. 更改当前不可用的设置
109 | 4. 取消勾选睡眠,锁定
110 |
111 | - 软连接系统截图目录
112 |
113 | 将 Win+Shift+S 截图链接到图片/截图目录
114 |
115 | 1. 管理员权限打开 CMD
116 | 2. 输入 mklink /d %HOMEPATH%\Pictures\截图 %LOCALAPPDATA%\Packages\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\TempState\ScreenClip
117 |
118 | - 开启 UTF-8 语言环境
119 |
120 | 1. 时间和语言
121 | 2. 语言
122 | 3. 管理语言设置
123 | 4. 更改系统区域设置
124 | 5. 勾选使用 Unicode UTF-8 提供全球语言支持
125 |
126 | 如打开 GBK 编码文件时出现乱码的情况,请使用转区工具解决
127 |
128 | - 禁用收集体验信息服务
129 |
130 | 1. 计算机管理
131 | 2. 服务和应用程序
132 | 3. 禁用Connected User Experiences and Telemetry
133 |
134 | - 修改动画效果
135 |
136 | 1. 系统
137 | 2. 高级系统设置
138 | 3. 性能
139 | 4. 勾选平滑屏幕字体边缘,显示缩略图,显示亚透明的选择长方形,在窗口下显示阴影
140 |
141 | - 将硬件时间视为 UTC 时间
142 |
143 | 1. 管理员权限打开 PowerShell
144 | 2. 输入 Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
145 |
146 | - 快捷键
147 |
148 | |键位|功能|
149 | |-|-|
150 | |Win + Q|搜索|
151 | |Win + D|切换桌面|
152 | |Win + L|锁定屏幕|
153 | |Alt + Tab|切换任务|
154 | |Win + Tab|打开任务视图|
155 | |Ctrl + Shift + Esc|打开任务管理器|
156 | |Ctrl + A / C / V / X|全选 / 复制 / 粘贴 / 剪切|
157 | |Ctrl + Z / Y|撤销 / 重做|
158 | |Ctrl + W / Alt + F4|关闭当前活动窗口|
159 | |Win + PrtScn|保存截屏到图片|
160 |
161 | - 特殊文件夹
162 |
163 | |路径|说明|
164 | |-|-|
165 | |%LOCALAPPDATA%\Programs|用户级程序目录|
166 | |%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup|用户级开机自启目录|
167 | |%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\StartUp|系统级开机自启目录|
168 |
169 | - 环境变量
170 |
171 | |变量名|变量值|
172 | |-|-|
173 | |%APPDATA%|C:\Users\Username\AppData\Roaming|
174 | |%WINDIR%|C:\Windows|
175 | |%COMMONPROGRAMFILES%|C:\Program Files\Common Files|
176 | |%COMMONPROGRAMFILES(x86)%|C:\Program Files (x86)\Common Files|
177 | |%SYSTEMDRIVE%|C:|
178 | |%HOMEPATH%|C:\Users\Username|
179 | |%LOCALAPPDATA%|C:\Users\Username\AppData\Local|
180 | |%PROGRAMDATA%|C:\ProgramData|
181 | |%PROGRAMFILES%|C:\Program Files|
182 | |%PROGRAMFILES(X86)%|C:\Program Files (x86)|
183 | |%ALLUSERSPROFILE%|C:\ProgramData|
184 | |%COMMONPROGRAMW6432%|C:\Program Files\Common Files|
185 | |%COMPUTERNAME%|Hostname|
186 | |%COMSPEC%|C:\WINDOWS\system32\cmd.exe|
187 | |%HOMEDRIVE%|C:|
188 | |%LOGONSERVER%|\\\MicrosoftAccount|
189 | |%OS%|Windows_NT|
190 | |%PROGRAMW6432%|C:\Program Files|
191 | |%PUBLIC%|C:\Users\Public|
192 | |%TEMP%|C:\Users\Username\AppData\Local\Temp|
193 | |%TMP%|C:\Users\Username\AppData\Local\Temp|
194 | |%USERDOMAIN%|Hostname|
195 | |%USERNAME%|Username|
196 |
--------------------------------------------------------------------------------
/src/docs/.vuepress/components/VPPageNav.vue:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/docs/.vuepress/config.ts:
--------------------------------------------------------------------------------
1 | import { defineUserConfig } from 'vuepress'
2 | import { viteBundler } from '@vuepress/bundler-vite'
3 | import { defaultTheme } from '@vuepress/theme-default'
4 | import { getDirname, path } from '@vuepress/utils'
5 | import { prismjsPlugin } from '@vuepress/plugin-prismjs'
6 |
7 | const __dirname = getDirname(import.meta.url)
8 |
9 | export default defineUserConfig({
10 | title: 'ATRI Doc',
11 | lang: 'zh-CN',
12 | head: [['link', { rel: 'icon', href: '/favicon.ico' },],],
13 |
14 | theme: defaultTheme({
15 | sidebar: [{
16 | text: 'HEAD', children: [
17 | // 'CONTENTS',
18 | ],
19 | },],
20 | navbar: [{ text: '说书人叹天下旧事如潮,听书人悲欢不过一壶新茶', link: '/peach/' },],
21 |
22 | lastUpdated: false,
23 | contributors: false,
24 | sidebarDepth: 0,
25 | externalLinkIcon: false,
26 | },),
27 |
28 | plugins: [
29 | prismjsPlugin({
30 | themes: { light: 'ghcolors', dark: 'one-dark' }
31 | }),
32 | ],
33 |
34 | alias: {
35 | '@theme/VPPageNav.vue': path.resolve(__dirname, './components/VPPageNav.vue'),
36 | },
37 |
38 | bundler: viteBundler(),
39 | },)
40 |
--------------------------------------------------------------------------------
/src/docs/.vuepress/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nibazshab/docs/4fe2b25a7ad65e6be63db10f24d0f15ea8a52d80/src/docs/.vuepress/public/favicon.ico
--------------------------------------------------------------------------------
/src/docs/.vuepress/styles/index.scss:
--------------------------------------------------------------------------------
1 | // 代码块右上角,不显示语言
2 | div[class*='language-']::before {
3 | display: none;
4 | }
5 |
6 | // 超链接样式
7 | .vp-page a:not(.header-anchor) {
8 | text-decoration: none !important;
9 | }
10 | .vp-page a:not(.header-anchor):hover {
11 | text-decoration: underline !important;
12 | }
13 |
--------------------------------------------------------------------------------
/src/env.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | pnpm add -D vue vuepress@next @vuepress/bundler-vite@next @vuepress/theme-default@next @vuepress/client@next @vuepress/utils@next sass-embedded @vuepress/plugin-prismjs@next
3 |
4 | repo=$(dirname "$PWD")
5 |
6 | d=$repo/src/docs
7 | f=$d/.vuepress/config.ts
8 |
9 | cd $repo/documents
10 |
11 | mv index.md $d
12 | mkdir $d/peach && mv peach.md $d/peach/index.md
13 |
14 | find | while read i
15 | do
16 | touch -d $(git log -1 --format=@%ct $i) $i
17 | done
18 |
19 | c=$(grep -n CONTENTS $f | grep -o ^[0-9]*)
20 | for i in $(ls -tr)
21 | do
22 | i=$(basename $i .md)
23 | sed -i "$c i\'/$i/'," $f
24 | mkdir $d/$i && mv $i.md $d/$i/index.md
25 | done
26 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "scripts": {
3 | "dev": "vuepress dev docs",
4 | "build": "vuepress build docs"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------