BNU-FZH

fengzhenhua@outlook.com

ArchLinux是一款灵活、强大、可定制的Linux发行版,提供丰富的软件包和工具,支持滚动更新和多种桌面环境,拥有庞大的社区支持和方便的包管理器,适合各种用户需求和使用场景。Endeavour 是一个基于ArchLinux的轻量级和用户友好的发行版,预装了桌面环境和预配置的软件包,旨在提供一个无忧的ArchLinux体验。

阅读全文 »

随着时代的进步和世界的发展,我决定从今天开始在 Neovim 上集成 AI,以增强编辑功能。其中一个为 Neovim 增加 AI 能力的工具是 Gen.nvim,但在安装插件之前,请确保已配置好 ollama 并拉取所需的模型。

安装配置 Gen.nvim

~/.config/nvim/lua/lazy-init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"David-Kunz/gen.nvim",
opts = {
-- model = "qwen2.5-coder:latest", -- 或您已下载的任意模型
model = "qwen2.5:14b", -- 或您已下载的任意模型
quit_map = "q", -- 关闭响应窗口的快捷键
retry_map = "<c-r>", -- 重试的快捷键
accept_map = "<c-cr>", -- 接受并替换文本的快捷键
host = "localhost",
port = "11434",
display_mode = "float", -- 以浮动窗口展示结果
-- hidden = true, -- 启用无窗口模式,直接替换
},
},

这样,在启动Neovim时,lazy.nvim会自动安装gen.nvim插件。

Gen.nvim 的使用

Gen.nvim 插件提供的核心 AI 功能涵盖了从代码到文本的各种协作场景。插件将这些功能封装为一系列“预设指令 (Prompts)”,用户可以直接在 Neovim 中通过 :Gen 命令调用,无需频繁复制粘贴、切换窗口或手动编写提示词。

功能类别 选项 主要功能与使用场景
理解与获取 Ask 直接向 AI 提问任何问题(如查询概念、解释原理)
Chat 开启一个多轮对话窗口,适合需要上下文连续交流的场景
Summarize 快速总结当前选中的文本或代码,抓住核心内容
Review Code 让 AI 审阅代码,分析可读性、性能和安全问题,并提出改进建议
代码与文本优化 Change Code 根据你的指令直接修改选中的代码,类似于“把这段代码改成……”
Enhance Code 在不改变核心逻辑的前提下,优化选中代码的结构、性能和可读性
Change 选中文本后,让 AI 根据你的自然语言指令进行修改(如“把语气改得更正式”)
Enhance Wording 优化措辞、改善表达,使书面表达更清晰、流畅、专业。
Enhance Grammar Spelling 专门检查并修正文本中的语法和拼写错误
Make Concise 简化冗余的长文本,提炼关键信息,且不改变原意。
生成与整理 Generate 根据你的要求生成全新的内容,不仅限于代码,也可以是邮件、报告大纲等
Make List 将散乱的文本或笔记自动整理成结构化列表
Make Table 将相关数据或信息分析整理后,呈现为表格形式

2026年5月30日将原来的GTX 1660s 升级为GTX 5060 Ti 16G, 于是本机具备了本地运行Ai的能力。今天配置成功了 Ollama, 于是此篇博客正式记录这一配置过程。

安装 Ollama

我的电脑是 ArchLinux, 于是直接使用命令安装即可:

Nvidia 显卡安装ollama-cuda

1
sudo pacman -S ollama-cuda

Amd 显卡安装ollama-rocm

1
sudo pacman -S ollama-rocm

如果直接安装ollama , 默认使用 cpu 工作,所以需要安装 ollama-cuda 版本。

安装大模型: deepseek-r1:7b

1
ollama pull deepseek-r1:7b

运行大模型: deepseek-r1:7b

1
ollama run deepseek-r1:7b

至上此可以在终端下运动大模型了,但是当涉及到一些 LaTeX 公式时,在终端下无法显示公式,只能显示源码,因此需要下面的配置open webui, 使得浏览器可以使用本地的大模型。

配置open webui

安装 docker

1
sudo pacman -S docker

配置docker国内源

/etc/docker/daemon.json
1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io"
]
}

重新加载Docker 配置并重启动

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置是否生效

1
docker info | grep -A 1 "Registry Mirrors"

如果成功,输出中会显示您配置的其他镜像地址。

使用国内镜像源安装Open WebUI

配置好镜像加速器后,拉取镜像时已无需特殊前缀,Docker 会自动从国内镜像源获取官方镜像。但如果您的网络环境较为特殊,也可以直接指定国内镜像源的完整地址进行拉取。

例如南京大学镜像:

1
docker pull ghcr.nju.edu.cn/open-webui/open-webui:latest

拉取完成后,验证镜像是否已经成功下载:

1
docker images | grep open-webui

看到类似ghcr.nju.edu.cn/open-webui/open-webui:latest的输出即表示成功。

启动 Open WebUI 容器

拉取成功后,启动 Open WebUI 容器。启动前请确认您的 Ollama 服务已正常运行。

1
2
3
4
5
6
docker run -d --network=host \
-v open-webui:/app/backend/data \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-e WEBUI_PORT=3000 \
--name open-webui --restart always \
ghcr.nju.edu.cn/open-webui/open-webui:latest

在日常工作和运维中,我们经常遇到这样的需求:两个目录 A 和 B 都可能随时新增或修改文件,希望它们最终保持完全一致,同时绝不能删除任何文件。这种场景下,传统的 rsync 单向同步方案显得力不从心,而 Unison 正是解决这一问题的利器。

本文将深入讲解 Unison 的安装、使用、冲突处理机制,以及如何安全地实现双向同步。

一、为什么 rsync 不够用?

很多人首先想到的是 rsync,但它的局限很明显:

1
2
# 这条命令无法实现真正的双向同步
rsync -a --update A/ B/

问题所在

  • rsync 本质是单向 工具,只能从源到目标。
  • --update 只保护目标端的新文件,不会反向同步。
  • 即使执行两次rsync, 也无法安全处理两边同时新增或修改的场景。

结论 纯新增文件(从不修改)的场景可以用两次rsync拼凑,但是只要涉及修改,就需要真正的双向同步工具。

二、Unison 简介

Unison 是一款跨平台的双向文件同步工具,核心特性:

  • 真正的双向同步: 自动检测并传播两边的变更
  • 安全第一: 冲突时不会自动覆盖,需要明确处理
  • 增量传输:只同步差异部分,节省带宽和时间
  • 跨平台LinuxmacOSWindows均可使用
  • 支持SSH: 可同步远程服务器目录

安装 Uniso

1
sudo pacman -S uniso

基础用法

最简单的双向同步

1
unison /path/to/A/ /path/to/B

执行后,Unison会扫描两个目录,并逐一询问如何处理每个差异。

自动模式(跳过非冲突确认)

1
unison -auto /path/to/A/ /path/to/B/
  • 作用:自动接受所有非冲突的变更(新增、更新、删除)
  • 冲突:仍然会停下等待用户选择

完全静默模式(适合脚本/写明任务)

1
unison -batch /path/to/A/ /path/to/B/
  • 作用:不问任何问题
  • 冲突时:直接跳过,不做任何处理
  • 注意:冲突会导致目录不一致,需配合-prefer newer使用

冲突处理机制

模式 冲突处理方式 适用场景
默认(交互) 停下来询问用户选择 重要数据,需要人工判断
-auto 停下来询问 同上
-batch 直接跳过,不处理 不适合,除非配合-prefer
-batch -prefer newer 自动选择修改时间更新的版本 日志、缓存等可自动决策的数据
-batch -prefer A 始终以A为准覆盖B 有明确主次的同步

Firefox 的网页翻译功能我不需要,所以需要彻底关闭它。操作路径为:

  • 在地址栏输入 about:config 并回车,点击“接受风险并继续”。

  • 在搜索框内,将以下两个配置项的值分别双击,修改为 false

    • browser.translations.enable:将此值设为 false,会完全禁用整个翻译功能,包括地址栏的翻译按钮.
    • browser.translations.automaticallyPopup:将此值设为 false,仅禁止翻译面板自动弹出,但翻译功能仍可用(不会经常跳出来打扰你).

注意:about:configFirefox 的高级设置,修改前请确认你了解其作用。不过,这两个翻译相关的选项非常安全,可以随时改回 true 恢复功能。

我的主力办公系统是 ArchLinux ,最近由于无法访问外网,Gnome 任务栏上的网络小图标显示为一个小问号,虽然可以访问内网,但这个问号总是让人看着不爽。这通常是 NetworkManager 的连接性检查( Connectivity Check )功能无法成功访问其验证服务器导致的, 所以将检查服务器更换为一个在自己网络下总是能访问的地址将是最优雅的解决办法。解决方法为:

方案一:修改连通性检查的服务器地址(推荐)

  • 创建或编辑配置文件
需使用sudo权限
1
sudo nvim /etc/NetworkManager/conf.d/20-connectivity.conf
  • 添加或修改为以下内容
1
2
3
4
5
6
7
8
[connectivity]
enabled=true
# uri=http://connectivitycheck.platform.hicloud.com/generate_204
# uri=http://connect.rom.miui.com/generate_204
# uri=http://wifi.vivo.com.cn/generate_204
uri=http://www.qualcomm.cn/generate_204
response=
interval=300
  • uri 指向连通性检查的地址

  • response 留空,NetworkManager 将只检查HTTP状态码(204表示成功), 这很适合此处使用

  • interval是检查间隔(秒)

  • 重启NetworkManager服务使配置生效

1
sudo systemctl restart NetworkManager

方案二:完全禁用连通性检查

  • 创建或编辑配置文件
需使用sudo权限
1
sudo nvim /etc/NetworkManager/conf.d/20-connectivity.conf
  • 添加或修改为以下内容
1
2
[connectivity]
enabled=false
  • 重启NetworkManager服务使配置生效
1
sudo systemctl restart NetworkManager

由于网络限制,升级了脚本diary.sh, 从而实现了无法上github的电脑上本地托管博客的功能,这样在办公环境中可以使用高度自定义的博客,进而提高办公规范和效率。然而,借助python3实现的博客工作于本地域名127.0.0:4000http://localhost:4000, 虽然实现了功能,但是还需要修改firefox的主而为http://localhost:400, 在地址栏中看起来不爽,所以本节是锦上添的技术:使用Caddy反向代理,生成自签名证书,从而实现访问https://fungzhenhua.github.io时实际上是访问http://localhost:4000效果。

配置Caddy

安装Caddy

Install Caddy
1
sudo pacman -S caddy

配置Caddy, 使用自签名证书

/etc/caddy/conf.d/fungzhenhua.conf
1
2
3
4
fungzhenhua.github.io {
tls internal
reverse_proxy localhost:4000
}

测试配置是否正确

1
sudo caddy validate --config /etc/caddy/Caddyfile

如果看到Valid configuration字样,说明配置正确,字样通常在最后一行。

启动Caddy

启动Caddy
1
2
sudo systemctl enable caddy
sudo systemctl start caddy

重启Caddy

重启Caddy
1
sudo systemctl restart caddy

Firefox导入证书

在完成上述Caddy设置后,发现每次打开Firefox后总是有风险提示,为了应对这个麻烦需要使用Firefox导入由Caddy生成的证书。由于使用tls internal方式,则Caddy默认生成的证书存放于/var/lib/caddy/pki/authorities/local/root.crt, 访问它需要root权限,于是解决方案是将其复制到家目录,然后赋于读写权限,再导入到Firefox证书分布机构则问题可解决。

具体操作

1
2
3
4
# 复制到当前目录
sudo cp /var/lib/caddy/pki/authorities/local/root.crt ~/caddy-root.crt
# 修改权限
sudo chown $USER:$USER ~/caddy-root.crt

如果是其他的Linux发行版,则需确认具体root.crt的路径。

在Firefox中导入

  • 打开about:preferences#privacy
  • 点击查看证书...
  • 切换到证书颁发机构标签页(注意:不是您的证书标签页)
  • 点击导入
  • 选择~/caddy-root.crt
  • 勾选三个信任 → 确定

需求分析及工作原理

近期由于网络的原因需要在本地搭建博客,最初的方案是借用Github Pages 实现了自定义博客,但是并非所有的地方都能访问Github, 因此在这些地方可以采用本地博客的方式,实现原理为:

  • Github博客源码库同步到Gitee, 因为Gitee属于国内的开发平台,所认其速度非常快。
  • Gitee上的源码hexosurce克隆到本地。
  • 如果本机可以访问Github, 则同步克隆其上源码到本地。
  • 编辑Gitee上克隆下来的源码,如果本机不可访问外网,则启动本机http服务,直接访问 http://localhost:4000
  • 编辑Gitee上克隆下来的源码,如果本机可访问外网,将编辑好的源码复制到Github库一份,并PushGithub上,实现同步备份之目的。

使用 Python 内置服务器本地托管博客

安装 Python3

1
sudo pacman -S python3

创建服务文件

/etc/systemd/system/blog.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Hexo Blog Static Server
After=network.target

[Service]
Type=simple
User=你的用户名
WorkingDirectory=/home/你的用户名/hexo-blog/public # 直接指向 public 目录
ExecStart=/usr/bin/python3 -m http.server 4000 --bind 127.0.0.1
Restart=always

[Install]
WantedBy=multi-user.target

重要

  • WorkingDirectory 必须是博客根目录(即包含 public 文件夹的目录),而不是 public 本身。

  • User 建议填写你的普通用户名,不要用 root

重新加载并启动

1
2
3
sudo systemctl daemon-reload
sudo systemctl start blog
sudo systemctl status blog

如果状态为 active (running),即可通过 http://localhost:4000 访问。

今天网购的数位板Wacom PTK670 收到了,做工相当精制,铝合金机身,超薄设计,厚度仅有4mm, 使用体验了一下,相当好用。我的电脑装配的是 ArchLinux 系统,而 Linux 内核默认是包含 Wacom 驱动的,这也构成了我选择 Wacom 的理由,同时在使用 Gnome+wayland 的组合中不需要任何设置就能完美运行。

ArchLinux 的设置

  • 安装支持手写的软件 xournall++Openboard

    1
    sudo pacman -S xournalpp openboard

  • 配置快捷键,支持更高效的工作。Wacom PTK670 左右各有一个滚轮和四个方向键,根据操作的频繁程度,我规划了自定义键:

    • 打开设置:设置→ 数位板→自定义功能
    • 左侧:转轮逆时针向上,顺时针向下, 上键对应PgUp, 下键PgDn, 左键Ctrl Z撤销,右键Ctrl y,
    • 右侧:转轮逆时针缩小,顺时针放大, 上键对应Ctrl+Shift+Delte 删除当前页, 下键Ctrl+D新增一页, 左键保留,右键保留.

设置触控笔

  • 压力感应设置,启动xournalpp, 然后依次点击:编辑→触控笔→最小压力0.01→压力增强4.00.
  • 触控笔按钮:按钮1手形工具, 按钮2高亮, 按钮3橡皮.

目前暂做上述设定,在使用中再逐步改善。

书定文件转打印体

将书写的内容复制图片,粘贴到通义千问或DeepSeek中,让Ai帮助识别成打印体,实验的结果是只要字不是非常草,文字和公式都能正确识别,然后让Ai以LaTeX源格式输出,只需复制粘贴到LaTeX文件中即可实现编译成PDF文档。这个方法对于大规模的写解答题的答案等是相当可高效的。

ArchLinux 是我的主力办公系统,我配置了完整的 WhiteSur 主题,当然也细致到了使用 WhiteSur 的 GDM 主题。但是我发现有时候系统使用 Pacman 升级后 GDM 主题会恢复到默认状态,其根源在于 GDM (GNOME 显示管理器)的主题是通过直接替换系统文件/usr/share/gnome-shell/gnome-shell-theme.gresource 来实现的。当gnome-shell 软件包升级时,这个文件会被包管理器自动恢复为默认版本,所以美化的登录界面就消失了。

永久解决这个问题的核心思路是让系统在每次gnome-shell更新后,自动重新应用一次WhiteSur主题。在ArchLinux上,最优雅的方式就是使用Pacman钩子(hook), 具体步骤为:

  • 创建钩子文件:使用root权限在/usr/share/libalpm/hooks/目录下创建一个新的钩子文件,例如命名为reapply-whitesur-gdm.hook, 如果你按装了nvim则执行

    1
    sudo nvim /usr/share/libalpm/hooks/reapply-whitesur-gdm.hook

  • 编写钩子内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Trigger]
    Operation = Upgrade
    Type = Package
    Target = gnome-shell

    [Action]
    Description = Reapplying WhiteSur GDM theme after gnome-shell upgrade...
    When = PostTransaction
    Exec = /bin/sh -c 'cd /路径/你的/WhiteSur-gtk-theme && sudo ./tweaks.sh -g'

    • [Trigger]部分:定义了钩子的触发条件, 即gnome-shellgdm包升级(Upgrade)后触发。
    • [Action]部分:定义了要执行的动作。
    • Exec: 最关键的一行。它需要指定一个完整的shell命令来重新应用主题。
  • 原理验证:保存文件后,这个钩子就生效了。下一次当你运行 sudo pacman -Syu 并且更新列表里包含 gnome-shellgdm 时,你会在升级输出中看到你设置的 Description 文字,随后主题会被自动重新应用。升级完成后,你的 GDM 登录界面将保持为 WhiteSur 主题,再也不会被重置了。