MoreRSS

site iconYsicing | 缘生修改

博客名:Solitudes。主要的工作是使用 Go/Rust学习中来实现人们所期望的产品。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ysicing | 缘生的 RSS 预览

周末闲逛朝阳馆茶博会

2025-10-20 22:16:08

周末闲来无事,听说北京朝阳馆的茶博会正热火朝天地进行中(2025 北京国际秋季茶业交易博览会,从 10 月 16 日到 19 日,在中国国际展览中心朝阳馆举办),赶紧拉上茶友去转转。没想到这一逛,就是简单的一逛!今天就来给大家分享我的闲逛笔记,带你云游这场茶的盛宴

这是今年第三场茶博会了我记得没错的话,规格算比较小的了,11 月还有一场在国家会议中心,爱喝茶的可以约起来。

总体评价

可圈可点,主要为云南福建等地区地方茶偏多。绿茶只有一家皖南的,茶香肆意,忘记名字了。皖南的名茶太多了,几乎每个市县都有自己的特色地方茶,这里打个广告安利一下我们的桐城小花,从小喝到大。不太好找,在珠宝展后面,问了几次路。

初入展馆

真是败笔,有个展馆入口是卖鱼干的(巧了不是,我比较不耐受这种味道)。然后选择先去看了茶具,由于地方不大,卖茶具的也不多,品质把玩了一下感觉还行。价格也不便宜,砍价也砍不动,只能看看摸摸上上手。

比较喜欢这种小杯子

目标价位 6-8 块,没砍下来哈哈哈

亮点摊位

逛着逛着,我被一个云南地方茶茶摊吸引住了。摊主是个有点懵的小姐姐,别人都是焖好了茶等人,小姐姐直接给你现在开泡哈哈哈。

入坑的摊位

莓茶

野不野生咱不知道,但是第一口入口挺特别的,回甘比较慢。湖南地方特色茶

第一次喝,后面也搜了一下

莓茶不含茶碱、咖啡因,饮后不会兴奋,能改善并提高睡眠质量,老少皆宜。莓茶所含活性黄酮能杀灭细菌,沏泡一周仍可饮用,不会变馊(nb)

云南小粒咖啡

摊位试了几杯,感觉还行。云南高黎问候品牌

老实说,买完出门就后悔了哈哈哈,感觉没刀好了高了。

哦,对了,只看到一个美女茶艺师哈哈哈。

总之,这次周末闲逛朝阳馆茶博会,从忙碌的工作中抽身,也挺好的。茶不只是一种饮品,更是生活态度。如果你也爱茶,不妨约下个月展会一起去转转!

GitHub Spec Kit 与 Claude 4.5那点事

2025-09-30 11:55:55

GitHub Spec Kit 与 Claude 4.5 那点事

GitHub Spec Kit

上周抽空将 GitHub Spec Kit 移植到了 code-pilot, 新的大型项目使用起来体验还不错,就是特别耗 token,不过今天有了转机了 Claude 4.5 发布了

Spec Kit 是什么?

这里不细说了,类似介绍的文章有很多,核心工作原理是让规范成为工程流程的中心

核心阶段

  • Specify 用户需求阶段 /spec-kit:specify
  • Clarify 澄清需求阶段 /spec-kit:clarify
  • Plan 制定开发方案阶段 /spec-kit:plan
  • Tasks 制定计划阶段 /spec-kit:tasks
  • Implement 实现计划阶段 /spec-kit:implement

安装

git clone https://github.com/ysicing/code-pilot.git ~/.claude
cd .claude
cp CLAUDE.md.example CLAUDE.md

使用

记得将模型从 Opus 切到推荐模型 Sonnet 4.5

/spec-kit:specify [你的需求]
# 澄清需求
/spec-kit:clarify
# 后面一直输入 继续 继续 继续 就可以了

Claude 4.5 和 Claude Code 2.0 更新

新模型确实很能打,没有降智,还便宜。减少了阿谀奉承、欺骗、权力追求和鼓励妄想思维等相关行为

新增功能

  • 支持检查点
  • 内置**/usage**查询用量信息
  • 原生 VSCode 插件

问题

  1. 新版本 Claude Code 强制登录
  2. 终端深色背景不可用,可按下面配置
  3. 有人说降智哈哈


欢迎关注,可以看看我郑再打工每天都在折腾什么。

ClaudeCode和Codex的MCP有趣玩法

2025-09-23 23:21:25

已经使用很长一段时间,ClaudeCode 和 Codex 互相调用,简单分享一下。我使用的场景大多数在 ClaudeCode 降智瞎写时,你干不了用 codex 帮你看看吧

Codex 为主,调用 Claude Code

如果你的主 AI 编程工具是 Codex,可以在 ~/.codex/config.toml 配置文件中配置一个 Claude Code MCP 服务

[mcp_servers.claude]
command = "claude"
args = ["mcp", "serve"]

配好后打开 Codex,输入 /mcp 就能看到 Claude 的工具了。

使用技巧:

使用claude帮我制定迭代计划保存到plan.md

Claude Code 为主,调用 Codex

如果你的主 AI 编程工具是 Claude Code,则可以添加 Codex MCP 服务:

claude mcp add -s user codex-gpt-5 -- codex mcp

添加之后,打开 Claude Code 的 /mcp 命令可以看到 codex 工具

使用技巧:

使用codex基于plan.md完成todo的任务

物语云/Zouter 香港存储型VPS 小测

2025-09-19 21:37:14

背景

物语云筹办的国际站(无需 KYC、中立服务)在今天上线,非常荣幸能作为内测用户,提前体验到物语云的香港产品线(HK BGP Global)。

后台管理面板依旧是和物语云国内站点一样,自主研发 简单易用。

本文测评主要以存储型示例,系统默认为 FNOS,由于测评时间属于晚高峰,跨境且无大陆优化,链路情况仅供参考。

官网

zouter.io

如果打不开或者打开比较慢很正常,目前正在接受洗礼, 官方备货充足,可以错峰购买。

套餐

首发循环优惠 5 折, 下面为优惠后价格

  • 经典通用型 Standard 1c/1g/15g/2T 流量 9.9r/月
  • 大盘存储型 Storage 1c/1g/15g+1T(raid10 存储盘)/2T 流量 29.9r/月
  • 高频性能型 Performance 1c(9950x 高频)/1g/15g/2T 流量 16.9r/月

每款配置都配备了 1Gbps 的带宽,纯国际线路无大陆优化, 防护峰值 10Gbps

除此之外,还有福利:

  • 年付仅需 10 个月费用
  • 额外增购流量包价格 5¥/TB(双向)
  • 限定 +1¥ 可升至 2GB RAM,+2¥ 可升至 2vCore(除高频性能型外)
  • 免费 2 快照和 2 备份(存储型不支持)
  • 提供 DNS 解锁,目前解锁地域为 DE

测评

以下测评基于 NodeQuality 测试脚本测评,且未使用物语云 DNS 解锁服务

基本信息

Basic System Information:
---------------------------------
Uptime     : 0 days, 9 hours, 41 minutes
Processor  : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
CPU cores  : 1 @ 2494.140 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 976.7 MiB
Swap       : 1024.0 MiB
Disk       : 515.0 GiB
Distro     : Debian GNU/Linux 12 (bookworm)
Kernel     : 6.12.18-trim
VM Type    : STANDARD PC (I440FX + PIIX, 1996)
IPv4/IPv6  : ✔ Online / ✔ Online

IPv6 Network Information:
---------------------------------
ISP        : Unknown
ASN        : AS205548 ZOUTER LIMITED
Location   : Hong Kong, Kowloon ()
Country    : Hong Kong

fio Disk Speed Tests (Mixed R/W 50/50) (Partition -):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 71.93 MB/s   (17.9k) | 1.06 GB/s    (16.7k)
Write      | 72.11 MB/s   (18.0k) | 1.07 GB/s    (16.7k)
Total      | 144.04 MB/s  (36.0k) | 2.14 GB/s    (33.4k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 1.02 GB/s     (1.9k) | 1.00 GB/s      (984)
Write      | 1.07 GB/s     (2.0k) | 1.07 GB/s     (1.0k)
Total      | 2.09 GB/s     (4.0k) | 2.08 GB/s     (2.0k)

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 794                           
Multi Core      | 789                           
Full Test       | https://browser.geekbench.com/v5/cpu/23794734

 SysBench CPU 测试 (Fast Mode, 1-Pass @ 5sec)
---------------------------------
 1 线程测试(单核)得分:          1008 Scores
 SysBench 内存测试 (Fast Mode, 1-Pass @ 5sec)
---------------------------------
 单线程读测试:          20287.46 MB/s
 单线程写测试:          17149.31 MB/s

🎬IP 质量

IP 质量

🌐 网络质量

网络质量

📍 回程路由

回程路由

细节详情

NodeQuality 链接

磁盘性能

大盘的性能 IO 还是挺满意,秒杀其他石头盘,内测早期测评数据(后面官方放宽了硬盘 I/O 限制)

启动盘:

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vda1):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 66.85 MB/s   (16.7k) | 89.56 MB/s    (1.3k)
Write      | 67.00 MB/s   (16.7k) | 90.03 MB/s    (1.4k)
Total      | 133.85 MB/s  (33.4k) | 179.60 MB/s   (2.8k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 179.56 MB/s    (350) | 247.14 MB/s    (241)
Write      | 189.10 MB/s    (369) | 263.60 MB/s    (257)
Total      | 368.66 MB/s    (719) | 510.75 MB/s    (498)

存储盘:

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vdb1):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 41.38 MB/s   (10.3k) | 77.65 MB/s    (1.2k)
Write      | 41.45 MB/s   (10.3k) | 78.06 MB/s    (1.2k)
Total      | 82.84 MB/s   (20.7k) | 155.71 MB/s   (2.4k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 183.89 MB/s    (359) | 241.67 MB/s    (236)
Write      | 193.66 MB/s    (378) | 257.76 MB/s    (251)
Total      | 377.55 MB/s    (737) | 499.44 MB/s    (487)

其他 FAQ

测试 IP: 151.243.229.1

对比其他家优势:

  • 极速的工单响应:继承饱受好评的物语云主站高标准售后,客服团队平均在 5 分钟内响应工单(工单响应超快,即使夜间 15 分钟内也会响应,而且技术专业)
  • 退款利索,可试用
  • 可靠的存储方案:存储介质均配备 RAID 阵列 + 热备盘(Hot Spare)
  • 免费的备份服务:除大盘实例外,标准实例均支持免费的备份与快照
  • 目前防御阈值为 10G,超过后将进入黑洞 30 分钟
  • DMCA 宽松,但是需要遵循当地法律法规
  • 流量用完,目前为断网不关机,后续有计划改为限速,现处于技术评估阶段

PVE9与k3s那点事:深夜填坑记,搞定AppArmor

2025-08-21 21:25:27

适用于部署了 PVE9 的 k3s 节点。由于本文属于回忆文,可能存在一些出入,总体流程没问题。

背景

我目前已经将大部分 k3s 节点系统升级到最新的 Debian13 了,最近手头又多了一台杜甫,首先装了 Debian13,部署了 k3s 计算节点,然后观察到节点资源还很富裕,可以跑个 PVE 集群节点。

PVE 部署

主要参考 oneclickvirt/pve,直接在 Debian13 上安装 PVE9。中间踩了一个坑,忘记安装前配置 hosts

# 确定能ping,不然后面/etc/pve/local/pve-ssl.key创建失败导致pve没法正常启动
ping $(uname -n)

现象

未部署 PVE 前,k3s 正常工作了很长时间。安装完 PVE 后,部分 POD 开始报错了,本文以 kruise-daemon 为例,一直启动不了直至 CrashLoopBackOff。

查看相关日志后,发现 pod 所在节点审计日志:

[Thu Aug 21 11:52:09 2025] audit: type=1400 audit(1755748328.817:29): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="cri-containerd.apparmor.d" pid=20287 comm="kruise-daemon" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none

发现 AppArmor 这位严格的安全管家把你的应用操作给拦下来了。分析一下这个日志,这是一条典型的 AppArmor 安全策略拒绝 (DENIED) 日志。简单来说,系统上的一个名为 kruise-daemon 的程序(运行在容器内)尝试执行一个操作,但被 AppArmor 安全模块阻止了

AI 分析

节选自 AI 分析

日志逐段分析

[Thu Aug 21 11:09:38 2025] audit: type=1400: 这是日志的时间戳和审计事件类型。
apparmor="DENIED": 核心信息。AppArmor 拒绝了一个操作。AppArmor 是 Linux 内核的一个强制访问控制(MAC)安全模块,它可以将程序限制在一组有限的资源中。
operation="create": 被拒绝的操作是“创建”。
class="net": 操作的类别是网络(net)相关的。
info="failed protocol match": 拒绝的详细原因。程序尝试创建的套接字(socket)的协议类型与 AppArmor 策略文件中允许的协议不匹配。
error=-13: 对应系统错误码 EACCES (Permission denied),进一步证实是权限问题。
profile="cri-containerd.apparmor.d": 关键信息。触发这个拒绝事件的安全策略文件是 cri-containerd.apparmor.d。这通常是 containerd 容器运行时的默认 AppArmor 配置文件,用于限制所有由 containerd 管理的容器的行为。
pid=48236 comm="kruise-daemon": 执行这个操作的进程是 kruise-daemon,进程 ID 是 48236。kruise-daemon 是 OpenKruise 的一个组件,通常以 DaemonSet 的形式运行在 Kubernetes 的每个节点上,负责一些节点级的增强功能。
family="unix": 网络套接字的类型是 Unix Domain Socket (UDS),这是一种用于同一台主机上进程间通信的机制,而非跨主机的 TCP/IP 网络。
sock_type="stream": 套接字的类型是流式套接字(stream),类似于 TCP。
protocol=0: 使用的协议号是 0(默认协议)。

问题核心概括

一句话总结: 运行在 containerd 容器中的 kruise-daemon 进程试图创建一个 Unix 域流式套接字(Unix Domain Stream Socket),但是 Kubernetes 节点上为容器配置的默认 AppArmor 安全策略 (cri-containerd.apparmor.d) 不允许这个操作。
这通常意味着 kruise-daemon 需要通过 Unix Socket 与节点上的其他服务(例如 Docker daemon、CNI 插件或其他 agent)进行通信,但默认的安全策略为了保证容器的隔离性,限制了这类“高级”或“特殊”的网络操作。

处理过程

确认 AppArmor 服务状态和已加载的 Profile

需要查看 AppArmor 当前在内核中加载了哪些 Profile

apparmor_status 或者aa-status
# 结果(这个是我调整后的,默认 cri-containerd.apparmor.d也是强制模式)
apparmor module is loaded.
8 profiles are loaded.
7 profiles are in enforce mode.
   /usr/bin/lxc-copy
   /usr/bin/lxc-start
   docker-default
   lxc-container-default
   lxc-container-default-cgns
   lxc-container-default-with-mounting
   lxc-container-default-with-nesting
1 profiles are in complain mode.
   cri-containerd.apparmor.d
0 profiles are in prompt mode.
0 profiles are in kill mode.
0 profiles are in unconfined mode.
1 processes have profiles defined.
0 processes are in enforce mode.
1 processes are in complain mode.
   /kruise-daemon (31408) cri-containerd.apparmor.d
0 processes are in prompt mode.
0 processes are in kill mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.

默认 /etc/apparmor.d/ 目录下是没有这个的,是 containerd 启动时加载到内核的。针对这种情况下,最好的办法是覆盖它。 我们可以在标准路径 /etc/apparmor.d/ 下创建一个同名的文件。当 AppArmor 服务重载配置时,它会优先使用磁盘上的文件来覆盖内存中已加载的同名 Profile

这里简单记录一下,没那么简单。

在 /etc/apparmor.d/ 目录下创建一个新文件,名字就叫 cri-containerd.apparmor.d

cat > /etc/apparmor.d/cri-containerd.apparmor.d <<EOF
# AppArmor Profile for cri-containerd.apparmor.d
# SYNTAX: AppArmor 4.1 (for Debian 13+)

#include <tunables/global>

# 声明我们使用的是新的 v4 语法,这非常重要!
abi <abi/4.0>,

profile cri-containerd.apparmor.d flags=(attach_disconnected, complain, mediate_deleted) {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # 授予容器运行时所需的大部分 POSIX capabilities
  capability,

  # 拒绝直接写内核和内存等危险操作
  deny /dev/mem w,
  deny /dev/kmem w,

  # 允许通用的网络操作 (TCP/IP 等)
  # 在新语法中,这个规则不包含 unix socket
  network,

  # === AppArmor 4.x 关键修改 ===
  # 使用新的、独立的 unix socket 规则族
  # 直接允许创建、连接、监听、发送、接收 stream 类型的 unix socket
  unix (create, connect, listen, accept, send, receive) type=stream,

  # 允许挂载相关的操作
  mount options=(ro, nosuid, nodev, noexec, remount, bind),
  remount,

  # 允许容器运行时需要的一些基本文件访问
  /dev/urandom r,
  /sys/devices/system/cpu/online r,
  /sys/fs/cgroup/ r,
  /sys/fs/cgroup/** r,

  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}
EOF

重新加载 AppArmor 配置,让我们的新文件生效

# -r 表示 replace,会替换掉内存中已有的同名 profile
apparmor_parser -r /etc/apparmor.d/cri-containerd.apparmor.d

再次运行 aa_status,确保 Profile 仍然在加载状态。然后尝试重建一下出问题的那个 kruise-daemon Pod,发现还是会 Deny,换了一个新错

了[Thu Aug 21 12:07:43 2025] audit: type=1400 audit(1755749262.720:42): apparmor="DENIED" operation="open" class="file" profile="cri-containerd.apparmor.d" name="/run/secrets/kubernetes.io/serviceaccount/..2025_08_21_04_07_36.2733297639/token" pid=28709 comm="kruise-daemon" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

同上流程,是不是改一下配置文件就可以,是的, 截取了新增的地方如下

/sys/fs/cgroup/** r,
  # --- 本次新增规则 ---
  # 允许 Pod 读取其 Service Account Token,以便与 K8s API Server 通信
  "/run/secrets/kubernetes.io/serviceaccount/**" r,
  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}

作为暴躁小伙,这样多麻烦,反正自己的环境应该也没啥大问题, 一梭子解决,观察者模式, 只需记录,不会拦截

aa-complain /etc/apparmor.d/cri-containerd.apparmor.d

其实到这里,问题基本解决了,但是没彻底解决。可以根据审计日志来完善,收集全部权限需求,一次性构建完整的 Profile,然后切换回 Enforce

官方这里确实好像有 BUG,事后没搜到了。

参考文档

希望这次的分享能帮到大家!觉得有用的话,别忘了点赞、在看、分享三连哦!

Claude Code之Statusline小工具 大用处

2025-08-12 21:38:59

这是最近新出的功能状态栏配置, 要求版本至少是 1.0.72, 官方文档已经很详细,具体可以参考 claude-code/statusline

状态栏配置用途

为 Claude Code 创建自定义状态栏以显示上下文信息

通过自定义状态栏让 Claude Code 成为您专属的工具,该状态栏显示在 Claude Code 界面底部,类似于终端提示符(PS1)在 Oh-my-zsh 等 shell 中的工作方式。

示例

创建自定义状态栏

官方给了两种方式:

  • 运行 /statusline 让 Claude Code 帮助您设置自定义状态栏。默认情况下,它会尝试复制您终端的提示符,但您可以向 Claude Code 提供关于所需行为的额外说明,例如 /statusline show the model name in orange
  • 直接在 .claude/settings.json 中添加 statusLine 命令(推荐用这种)

另外我的 code-pilot 默认也集成了基础版本的,具体可以参考 settings.example

"statusLine": {
    "type": "command",
    "command": "~/.claude/scripts/statusline.sh",
    "padding": 0
  }

不过,本文主要将如何使用佬友写的 CCometixLine

CCometixLine 配置指南

有兴趣的可以查阅佬友的原文 Claude Code StatusLine | 小工具 大用处

由于我个人的习惯, 二进制放 bin,脚本放 scripts 目录下

20:26 ➜  .claude git:(master) tree -L 1
.
├── assets
├── bin
├── scripts
├── settings.json
└── CLAUDE.md

11 directories, 11 files

项目地址: CCometixLine

macOS 部署

涉及到非中文字体安装, 主要是 CCometixLine 图标依靠 Nerd Font

brew tap laishulu/homebrew
 brew install font-meslo-lg-nerd-font

佬友推荐了:

  • MesloLGS NF(Powerlevel10k 官方推荐)
  • FiraCode Nerd Font(支持编程连字)
  • JetBrainsMono Nerd Font(现代等宽字体)
  • Hack Nerd Font(清晰易读)

安装完成后设置 iTerm2 的字体,主要设置我勾选的那个就可以使图标生效

示例

配置也比较简单, 从 github 下载对应的二进制压缩包,解压放到对应的目录即可,检查一下权限,需要有执行权限

mkdir -p ~/.claude/bin  
wget https://github.com/Haleclipse/CCometixLine/releases/latest/download/ccline-macos-arm64.tar.gz
tar -xzf ccline-macos-arm64.tar.gz
cp ccline ~/.claude/bin/
chmod +x ~/.claude/bin/ccline

然后 settings.json 配置如下:

cat settings.json | jq .statusLine
{
  "type": "command",
  "command": "~/.claude/bin/ccline",
  "padding": 0
}

linux 部署

佬友提供的,可能受限于编译环境,可能提示 glibc 问题。现象就是配置了不生效,可以使用 .claude/bin/ccline -V 测试,如果能提示版本就没问题。

这里我也提供一个在 Debian13(12)都可以运行

https://c.ysicing.net/oss/tiga/linux/amd64/ccline-linux-amd64

其他

除了这些外,还可以使用 ccusage, 可以实时看到今天的总费用、当前活跃的 5 小时区块费用 & 剩余时间、实时消耗速率

{
  "statusLine": {
    "type": "command",
    "command": "bun x ccusage statusline"
  }
}