Honkit 是一个现代化的静态书籍生成工具,它是基于旧版 GitBook 开发的,支持 Markdown 文件的编写和多种输出格式,如 HTML 和 PDF。
创建项目目录:
mkdir my-honkit-project
cd my-honkit-project
初始化 Honkit 项目:
npx honkit init
这会生成以下两个文件:
README.md
:书籍的主页面。SUMMARY.md
:目录结构的定义。安装 Honkit:
npm install honkit --save-dev
在项目目录中运行以下命令启动本地预览:
npx honkit serve
默认情况下,书籍会在 http://localhost:4000 上运行。
当书籍准备好后,运行以下命令生成静态 HTML 文件:
npx honkit build
生成的文件会存储在 _book
目录中。
Honkit 支持将书籍生成 PDF 文件,但需要预先安装 Calibre 电子书管理软件。
下载 Calibre:
确保 Calibre 路径正确:
检查环境变量:
PATH
中。PATH
环境变量中。例如,Windows 系统下,路径可能为:
C:\Program Files\Calibre2
Linux 和 macOS 用户可通过以下命令验证:
which ebook-convert
如果返回路径为空,说明需要手动添加。
运行以下命令生成 PDF 文件:
npx honkit pdf . output.pdf
.
表示当前目录。output.pdf
是生成的 PDF 文件名。my-honkit-book
)。将本地项目与远程仓库关联:
git init
git remote add origin https://github.com/<username>/my-honkit-book.git
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin main
创建 GitHub Actions 配置文件:
在项目的根目录下创建 .github/workflows/deploy.yml
文件,内容如下:
name: Deploy Honkit to GitHub Pages
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Dependencies
run: npm install
- name: Build Honkit
run: npx honkit build
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./_book
提交配置文件:
提交并推送配置文件到 GitHub:
git add .github/workflows/deploy.yml
git commit -m "Add GitHub Actions for deployment"
git push origin main
启用 GitHub Pages:
gh-pages
分支,点击保存。www.example.com
)。CNAME
文件。登录您的域名注册商控制台,添加以下 DNS 记录:
绑定子域名(例如 www.example.com
):
添加 CNAME 记录:
www CNAME <username>.github.io
注意:将 <username>
替换为您的 GitHub 用户名。
当每次推送代码后,自定义域名设置消失,通常是由于 CNAME
文件被覆盖或删除。GitHub Pages 需要根目录的 CNAME
文件来保存自定义域名信息。如果该文件丢失或被覆盖,GitHub 就无法识别您的自定义域名。
手动将 CNAME
文件添加到源码目录
创建 CNAME
文件:
在项目根目录(如 main
分支)下创建一个 CNAME
文件,并在文件中输入您的自定义域名,例如:
www.example.com
提交更改:
提交并推送 CNAME
文件到远程仓库:
git add CNAME
git commit -m "Add CNAME file"
git push origin main
CNAME
文件会自动被包含在 gh-pages
分支中,不会被覆盖。检查 CNAME
文件:
gh-pages
分支,确认根目录下有 CNAME
文件。文件内容应为您的自定义域名,例如:
www.example.com
检查 GitHub Pages 设置:
npx honkit pdf
报错 Command failed: ebook-convert not found
原因:
Calibre 未正确安装,或 ebook-convert
工具未添加到系统的 PATH
环境变量中。
解决方法:
确保 Calibre 已安装,并重新确认安装路径:
C:\Program Files\Calibre2
。which ebook-convert
检查路径。手动将 Calibre 的安装路径添加到系统环境变量中:
Windows:
PATH
。C:\Program Files\Calibre2
。Linux/macOS:
编辑 ~/.bashrc
或 ~/.zshrc
文件,添加以下内容:
export PATH="/path/to/calibre:$PATH"
替换 /path/to/calibre
为 Calibre 的实际路径。
source ~/.bashrc
或 source ~/.zshrc
使更改生效。npx honkit pdf
。Permission denied
原因:
GitHub Actions 无法向 gh-pages
分支推送更改,通常是因为缺少权限。
解决方法:
确保 GitHub 仓库的 Settings > Actions > General 中已启用 Read and write permissions:
确认 GitHub Actions 配置文件中使用的是 github_token
:
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
原因:
DNS 记录配置错误或未生效。
解决方法:
登录域名管理平台,检查 DNS 配置:
CNAME
文件,内容是否正确(应与自定义域名一致)。验证 DNS 配置是否正确:
启用 HTTPS:
原因:
SUMMARY.md
的目录结构未正确链接。解决方法:
检查 SUMMARY.md
中的链接是否与文件路径一致:
* [章节标题](path/to/file.md)
清理并重新构建书籍:
npx honkit build
原因:
未指定自定义样式文件或样式文件路径错误。
解决方法:
custom.css
),自定义 PDF 的排版样式。使用以下命令生成 PDF 并指定样式文件:
npx honkit pdf --css custom.css . output.pdf
如果您遇到未列出的问题或有其他疑问,请参考以下支持途径:
完成这些步骤后,您可以成功使用 Honkit 创建、部署和管理文档,解决常见问题,并生成符合您需求的 HTML 和 PDF 文档!
]]>docker compose pull && docker compose up -d
可以通过在 compose 文件中设置 watchtower 来定期自动拉取最新镜像并启动容器,同时可以配置删除旧镜像和容器。
在 docker-compose.yml 文件中增加以下内容:
version: '3'
services:
...
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600 --cleanup --remove-volumes
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_REMOVE_VOLUMES=true
以下是主要的配置说明:
--interval
参数设置为 3600。这意味着 Watchtower 将每 3600 秒(即每小时)检查一次更新。--cleanup
和 WATCHTOWER_CLEANUP=true
确保在更新后清理旧的镜像。--remove-volumes
和 WATCHTOWER_REMOVE_VOLUMES=true
确保删除与旧容器关联的匿名卷。使用这个配置,Watchtower 将:
这个配置应该能满足大多数用例的需求,既能保持你的容器相对最新,又不会过于频繁地进行检查和更新操作。
需要注意的是:
docker image prune
命令。核心就是通过 alias 关联文件路径。
配置文件如下:
location /test.log {
alias /home/script/igd/app.log;
default_type text/plain;
add_header Content-Type "text/plain; charset=utf-8";
charset utf-8;
# 确保不会缓存内容
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
location 路径替换为需要的路径。alias 设置文件实际路径。
]]>参考之前的文章:https://blog.niekun.net/archives/413.html
确定您的 shell 类型。打开终端,运行以下命令:
echo $SHELL
这通常会返回 /bin/zsh 或 /bin/bash。
根据您的 shell 类型,编辑相应的配置文件:
对于 Zsh(最新的 macOS 默认使用):编辑 ~/.zshrc
对于 Bash:编辑 ~/.bash_profile 或 ~/.bashrc
使用文本编辑器打开相应的文件。例如,对于 zsh:
vim ~/.zshrc
在文件末尾添加以下行(替换为您的实际脚本目录路径):
export PATH="/path/script:$PATH"
保存并关闭文件。使更改生效,可以重新加载配置文件或重启终端。要重新加载,运行:
source ~/.zshrc # 如果使用 Zsh
source ~/.bash_profile # 如果使用 Bash
验证 PATH 更新:
echo $PATH
您应该能看到您的脚本目录已被添加。现在,您应该能够直接运行脚本,而不需要指定完整路径:
test.sh
注意事项:
chmod +x script_name.sh
)。ffmpeg -i input.mov -c:v libx264 -crf 30 -r 24 -movflags faststart -c:a aac -b:a 128k -preset superfast out.mp4
但是每次在命令行执行这么复杂的命令还是很不方便的,可以使用 macOS 自带的 automator 自动化工具制作一个简单的右键菜单动作,方便的对视频文件快速压缩。
打开 automator 新建一个 quick action,添加一个 run sheel script:
脚本内容如下:
for f in "$@"
do
/opt/homebrew/bin/ffmpeg -i "$f" -c:v libx264 -crf 30 -r 24 -movflags faststart -c:a aac -b:a 128k -preset superfast "${f%.*}_compressed.mp4"
done
# 播放声音
afplay /System/Library/Sounds/Blow.aiff
# 显示对话框
osascript -e 'tell app "System Events" to display dialog "视频压缩已完成" with title "通知" buttons {"OK"} default button "OK"'
保存后,在视频文件右键菜单的 action 栏就可以看到我们添加的动作了:
点击执行动作,完成后会有提示信息。
]]>Python 3.3 及以上版本自带 venv 模块,可以直接使用。
在你的项目目录下,运行以下命令来创建一个虚拟环境,这将在项目目录下创建一个名为 myenv 的文件夹,其中包含虚拟环境的所有文件:
python -m venv myenv
Windows:
myenv\Scripts\activate
macOS 和 Linux:
source myenv/bin/activate
在虚拟环境中,你可以使用 pip 来安装项目所需的库:
pip install requests
安装的库将只会影响当前虚拟环境,而不会影响系统的 Python 环境或其他项目。
为了确保你的项目依赖可以在其他环境中重现,你可以使用以下命令将当前环境的依赖写入 requirements.txt 文件:
pip freeze > requirements.txt
requirements.txt 文件将包含所有当前环境中的安装包及其版本信息。
在新的环境中,你可以使用 requirements.txt 文件来安装所需的所有依赖:
pip install -r requirements.txt
当你完成工作时,可以通过以下命令退出虚拟环境:
deactivate
使用虚拟环境进行Python开发可以有效地隔离项目依赖,避免版本冲突。通过创建和激活虚拟环境、安装依赖、冻结依赖并在新环境中重新安装依赖,可以确保你的项目在不同环境中具有一致的运行表现。
]]>Something went wrong. You may be connected to a disallowed ISP If youare using VPN, try disabling it. Otherwise try a different Wi-Fi network or data connection。
经过查询发现是我的 vps 服务商只提供网页端 chatgpt 解锁,不支持 app 端。由于 chatgpt 服务也是通过 cloudflare 的 cdn 服务,所以通过将流量转发到 warp 来访问就可以解决问题。
首先需要在服务端安装官方的 warp 命令行工具:warp-cli。
官方教程:https://developers.cloudflare.com/warp-client/get-started/linux/
官方手动添加包仓库教程:https://pkg.cloudflareclient.com/#ubuntu
在命令行输入以下指令来安装第三方仓库并安装包:
# Add cloudflare gpg key
curl -fsSL 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 "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
# Install
sudo apt-get update && sudo apt-get install cloudflare-warp
安装好后需要注册一个新账户:
warp-cli registration new
查看当前账户信息:
warp-cli registration show
更换新的 license:
warp-cli registration license xxxxx-xxxxxx-xxxxxx
然后需要设置代理模式,可选有:warp, doh, warp+doh, dot, warp+dot, proxy, tunnel_only。
我只想要它提供一个 socks5 代理端口即可,所以设置为 proxy 模式,它会在本地 40000 端口监听:
warp-cli mode proxy
启动 warp:
warp-cli connect
此时 warp 会在本地 40000 端口建立一个 sock5 代理,只需要将需要转发的流量转发到此端口即可走 warp。并且 warp 会自动配置为 Always On 模式,开机自动运行代理。
查看 warp 当前配置:
# warp-cli settings
Merged configuration:
(derived) Always On: true
(default) Switch Locked: false
(user set) Mode: WarpProxy on port 40000
(Not set) WARP tunnel protocol: Wireguard
(default) Disabled for Wifi: false
(default) Disabled for Ethernet: false
(Not set) Resolve via: cloudflare-dns.com @ [162.159.36.1, 2606:4700:4700::1111]
(Not set) qlog logging: Disabled
(default) Onboarding: true
(API defaults) Exclude mode, with hosts/ips:
10.0.0.0/8
100.64.0.0/10
169.254.0.0/16
172.16.0.0/12
192.0.0.0/24
192.168.0.0/16
224.0.0.0/24
240.0.0.0/4
239.255.255.250/32
255.255.255.255/32
fe80::/10
fd00::/8
ff01::/16
ff02::/16
ff03::/16
ff04::/16
ff05::/16
fc00::/7
(default) Fallback domains:
intranet
internal
private
localdomain
domain
lan
home
host
corp
local
localhost
home.arpa
invalid
test
(Not set) Daemon Teams Auth: false
(default) Disable Auto Fallback: false
(Not set) Allow Updates: true
查看代理是否生效:
export ALL_PROXY=socks5://127.0.0.1:40000
curl ifconfig.me
服务端的配置文件需要添加和修改的地方如下:
{
"outbounds": [
...
{
"protocol": "socks",
"settings": {
"address": "127.0.0.1",
"port": 40000
},
"tag":"socks_out"
}
],
"router": {
"domainStrategy": "AsIs",
"rule": [
...
{
"tag": "socks_out",
"geoDomain": [
{
"code": "openai",
"filePath": "geosite.dat"
}
],
"domainMatcher": "mph"
}
]
},
"inbounds": [
{
"protocol": "vmess",
...
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
...
注意需要安装扩展版的 geosite.dat 才有 openai 的条目:https://github.com/Loyalsoldier/v2ray-rules-dat
通过访问以下网址测试是否已经解锁 ios app 端:https://ios.chat.openai.com/public-api/mobile/server_status/v1
以上就是解决 chatgpt 无法访问的方法。
]]>quic 协议走的是 udp 层,一般是 443 或 80 端口。
openwrt 或其他 linux 系统上使用 nftables 设置规则即可:
新建路由表
nft add table ip tabletest
# 局域网流量屏蔽
# 局域网流量目标地址是外部地址时传输路径为 prerouting -> forward -> postrouting hooks
nft add chain ip tabletest prerouting { type nat hook prerouting priority 0 \; policy accept \; }
nft add rule ip tabletest prerouting udp dport { 80, 443 } drop
# 本机网关流量屏蔽
# 本机网关流量目标地址时外部地址时传输路径为 本机 -> output -> postrouting hooks
nft add chain ip tabletest output { type nat hook output priority 0 \; policy accept \; }
nft add rule ip tabletest output udp dport { 80, 443 } drop
在 Chrome 中禁用 HTTP/3:
在 Firefox 中禁用 HTTP/3:
# 清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip config set global.index-url http://pypi.douban.com/simple/
# 换回默认源
pip config unset global.index-url
]]>