2026年1月

大聪明预警

按法定放假时间(2-15 日)回家,路上肯定很堵(飞机、高铁、火车除外),所以做了一个聪明的决定doge,提前一周就出发:2 月 7 号,
跟我想的一样的人有么?

Drawpile-2.2.2-x86_64.msi是个在线绘画协作工具,可以多人同时在一张画布上画画,适合和朋友一起涂鸦、设计草图。

一、准备工作

安装包下载:https://pan.quark.cn/s/ecd93f07c147

二、安装步骤

  1. 双击 Drawpile-2.2.2-x86_64.msi运行。
  2. 如果是 Windows 10/11,会弹出“用户账户控制”提示 → 点  “是” (需要管理员权限)。
  3. 进入安装向导,点  “Next” ​ 继续。
  4. 选安装位置:

    • 默认是 C:\Program Files\Drawpile,想改就点“Browse”选 D 盘或其他盘。
  5. 选附加任务:

    • 建议勾“Create a desktop shortcut”(创建桌面快捷方式),点“Next”。
  6. 点  “Install” ​ 开始安装,等进度条走完(大概十几秒)。
  7. 最后点  “Finish” ​ 完成安装,桌面上会有 Drawpile 图标。

三、首次运行设置

  1. 双击桌面图标打开软件。
  2. 主界面会显示“Host session”(创建房间)和“Join session”(加入房间)两个选项。
  3. 想自己开房间就点“Host session”,设置房间名和密码(可选)。
  4. 想加入别人的房间就点“Join session”,输入对方的 IP 地址或房间链接。

四、基本使用(简单说两句)

  • 创建房间:点“Host session” → 填房间名 → 设密码(不想让别人随便进就设一个)→ 点“Start”。
  • 加入房间:点“Join session” → 输入房间地址(比如 drawpile://192.168.1.100:27750)→ 点“Join”。
  • 绘画工具:左边工具栏有画笔、橡皮、颜色选择器等,选了就能画。
  • 聊天功能:右下角有聊天框,可以和一起画画的人说话。

其实我的服务器也没啥东西,就一个官网和一个 newapi 服务,官网用 next 写的,结果一天几千条被攻击的消息,CPU 平均 80% 以上,这事持续一段时间了,一直懒得弄,阿里云客服说有违法的可能,吓得我赶紧又买了台服务器放官网,然后升级了 next 版本。
开源不易,没有收入,麻烦大家支持一下。
https://notegen.top/

Check Open Port in Linux

在 Linux 中,端口是一个编号的网络连接,它允许设备通过 Internet 或本地网络与其他设备通信。确保端口是开放和可访问的非常重要,它确保网络业务的正常运行。在本文中,我们将讨论五个检查 Linux 中端口是否打开的常用方法。

Check Open Port on Remote Host

首先,检查一个端口是否打开并在远程主机上侦听。

Using nc Command

nc 命令允许您向端口发送数据,并查看是否收到响应。nc 命令基本语法如下:

nc -vz hostname port

例如,要检查主机 example.com 上的 22 端口是否打开,可以使用以下命令:

nc -vz example.com 22

如果端口打开,您将看到消息 "Connection to hostname port [ tcp/ssh ]succeeded"。如果端口关闭,您将看到消息 "Connection to hostname port [ tcp/ssh ] failed: Connection refused"。

Using telnet Command

telnet 命令用于连接到远程主机上的端口,看看是否建立了连接。查询端口是否打开,使用以下语法:

telnet hostname port

例如,要检查主机 www.example.com 上的 80 端口是否打开,可以使用以下命令:

telnet www.example.com 80

如果端口是打开的,您将看到一个空白屏幕。要退出,请按 CTRL + ],然后键入 quit。如果端口关闭,您将看到 "Connected to hostname. Escape character is '^]'. Connection closed by foreign host"

Using nmap Command

nmap 命令是一个执行网络扫描和探测的实用程序,它可以通过端口扫描来检查目标主机端口是否打开。要检查端口是否打开,使用以下语法:

nmap -p port hostname

例如,要检查主机 www.example.com 上的 80 端口是否打开,可以使用以下命令:

nmap -p 80 www.example.com

如果端口是打开的,您将在输出中看到一行,表明端口是打开的。如果端口已关闭,您将看到一行,指示端口已关闭。

Shell Script to Check Port Status

您可以创建一个 bash 脚本检查本地或远程主机上端口是否打开,示例脚本如下:

#!/usr/bin/env bash

HOST=192.168.10.100  #remote host
PORT=22  # Port to check

nc -z ${HOST} ${PORT}
if [ $? -eq 0 ]
then
    echo "Port is open"
else
    echo "Port is closed"
fi

这里 HOST 是远程或本地主机系统的主机名或 IP 地址。PORT 是要检查的端口号。,nc 命令可以连接到主机上的任何端口并返回状态。$? 是一个系统环境变量,包含最后一个命令的退出状态。

Check Script To Check Port Is Open

Check Listening Port on Localhost

很多时候,我们需要检查本地机器上是否有端口正在侦听。

Using lsof Command

lsof 命令是一个实用程序,用于显示有关打开文件的信息。要检查端口是否打开,使用以下语法:

lsof -i :port

例如,要检查 80 端口是否打开,可以使用以下命令:

lsof -i :80

如果端口打开,将看到一行,包含端口号和使用该端口的进程的名称。如果端口关闭,将看不到任何输出。

Using ss Command

ss 命令是一个显示网络套接字信息的实用程序。要检查端口是否打开,使用以下语法:

ss -lnp | grep port

例如,要检查 80 端口是否打开,可以使用以下命令:

ss -lnp | grep 80

如果端口打开,将看到一行,其中包含端口号和状态 LISTEN。如果端口关闭,将看不到任何输出。

注意: 您可能需要使用 sudo 来运行这些命令,这取决于您的系统配置。

大家好,我是《交易学徒》的作者。

简单介绍下背景:我现在的核心身份是带两个孩子的全职奶爸,副业才是趁着孩子睡着后,在键盘上敲敲打打的独立开发者。

对于我这种“碎片化时间”开发者来说,运维复杂度就是最大的敌人。

几年前写后端,我也迷信“标准答案”:做个服务,起手就是 Docker 编排,Redis 做缓存,Kafka 做解耦,微服务先分几个出来。结果往往是,功能没写几个,光是调网络、修连接超时、查中间件报错,就把孩子午睡的那宝贵两小时耗光了(那时候还没孩子)。

在开发后端时,我陷入了深思:

“对于一个追求极致性能、但只有一个人维护的系统,所谓的‘工业级架构’真的是解药吗?还是毒药?”

最终,我做了一个违背祖宗的决定:做减法。 我删除了 Redis ,移除了 Kafka ,把整个微服务集群塌缩成了一个 Rust 单体应用。

今天想聊聊这背后的思考过程。

一、 复杂度的守恒与转移
我的业务场景看似简单,实则牵一发而动全身。一个简单的“用户平仓”动作,就像推倒了第一块多米诺骨牌:

核心域:结算盈亏,改余额,写数据库。(必须马上做)

通知域:给前端发个弹窗通知“平仓成功”。(晚 0.1 秒没关系)

营销域:判断有没有触发“五连胜”、“以小博大”成就,发奖励。(晚 1 秒没关系)

统计域:计算交易评分,统计分数或者更新等级与交易报表。(晚几秒都行)

在“标准架构”里,我们需要引入 消息队列 (MQ) 来解耦这些逻辑。 但引入 MQ 本质上并没有消除复杂度,只是将“代码复杂度”转移成了“运维复杂度”。

对于团队,运维复杂度可以分摊给同事;但对于我,这意味着我不仅要写代码,还得修服务器。

Rust 给了我另一个选择:利用它极高的性能,把“运维复杂度”重新压回“架构设计”里,用最朴素的方式解决问题。

二、 内存即总线:构建“喊一嗓子”的架构
我利用 Rust 的内存通道特性,构建了一个“超光速大喇叭”。 我不请求数据,我只发布事实。

这个过程,可以用一个生活化的场景来描述:

  1. 定义世界的真相 (The Truth)
    我不写复杂的 XML 或 JSON 定义,我只是在代码里列了一张“事实清单”:

📄 事实 A:有人平仓了(包含:是谁、赚了多少、单号是多少)

📄 事实 B:有人购买商品了

📄 事实 C:AI 分析完成了

编译器会盯着这张清单,保证我发出的每一个“事实”都是格式正确、童叟无欺的。

  1. 极简的生产者 (Fire and Forget)
    在核心交易逻辑里,当数据库事务提交成功后,我只需要做一件事:拿着大喇叭喊一嗓子。

传统架构 (Kafka) 是这样的:

交易模块 -> 打包数据 -> 建立 TCP 连接 -> 三次握手 -> 发送给 Kafka 集群 -> 等待 ACK -> 结束 (这中间任何一步网络抖动,都得处理异常)

我的单体架构是这样的:

交易模块 -> 喊:“老王平仓赚了 100 块!” -> 结束 (纯内存操作,纳秒级完成,快到像是没有发生过)

  1. 静默的消费者 (Sidequest Logic)
    我把原本分散在微服务里的逻辑,变成了几个坐在角落里的“隐形工人”。

比如 “营销服务”,它就像一个在角落里旁听的记分员:

它平时不说话,只听大喇叭。

一听到 “老王平仓赚了 100 块”,它立马翻开小本本查历史。

发现老王已经连赢 4 把了,加上这把正好 5 把。

于是它默默地给老王发了一个“五连绝世”的徽章。

整个过程,核心交易模块完全不知情,也完全不用等待,它喊完那一嗓子就去服务下一个用户了。

三、 深度思考:关于“不可靠”的权衡
很多朋友可能会问:“没有 Kafka 把消息存到硬盘里,万一服务器断电了,你喊的那一嗓子不就丢了吗?”

是的,这是整个架构思考中最痛苦,也是最关键的取舍。 我问了自己两个问题:

Q1:我的程序崩溃概率有多大? Rust 以安全著称,只要代码写得不离谱,它极难崩溃( Panic )。这比 Java 的内存溢出或 Python 的运行时错误要稳健得多。

Q2:丢失数据的代价是什么?

我们可以把数据分成两类:

💰 钱(核心数据): 余额、订单状态。

处理方式: 必须落袋为安。 直接写死在数据库里,绝不依赖“大喇叭”。

🎁 气氛(衍生数据): 弹窗通知、成就徽章、达标奖励、统计报表。

处理方式: 听天由命。 如果真的赶上万年不遇的服务器着火,用户少收到了一个“五连胜”的弹窗,或者报表少统计了一笔,天会塌吗?不会。

结论: 为了 0.001% 的极端掉电风险,去让 99.99% 的时间里的系统背负沉重的中间件包袱,对于独立开发者来说,这是一笔亏本买卖。

四、 结语
当我们谈论“高性能”时,往往想到的是复杂的集群、昂贵的服务器。 但 Simple is fast. (简单即快)

现在的《交易学徒》后端,就是一个 20MB 的小文件。

❌ 没有 Docker 容器编排

❌ 没有 虚拟机调优

❌ 没有 Redis 维护

❌ 没有 服务间通讯

✅ 只有一个跑在单机上的进程,CPU 占用极低,响应速度极快。

这省下来的不仅仅是每年的服务器费用,更是我作为父亲陪伴孩子的宝贵时间。

技术服务于生活,这大概就是独立开发的魅力吧。

关于《交易学徒》
这是我用这套“极简架构”打磨的作品,前端是 Flutter ,后端 Rust 。 希望能给交易员朋友们提供一个干净、流畅、无延迟的练习环境。

官网: https://www.zgjiazu.top

Google Play: https://play.google.com/store/apps/details?id=com.zengkai.jyxtclient

欢迎 V 友们指正。如果你的孩子也吵着要抱抱,那我们就是异父异母的亲兄弟了。😄

BLOG: https://blog.pdjjq.org/post/claude-code-skill-25ron8

Skill 的实现以及指令

让我们来抓包 Claude Code 的请求, 看看 Claude Skill 的实现吧

    {
      "name": "Skill",
      "description": "Execute a skill within the main conversation\n\nWhen users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\nExample:\n  User: \"run /commit\"\n  Assistant: [Calls Skill tool with skill: \"commit\"]\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n  - `skill: \"pdf\"` - invoke the pdf skill\n  - `skill: \"commit\", args: \"-m 'Fix bug'\"` - invoke with arguments\n  - `skill: \"review-pr\", args: \"123\"` - invoke with arguments\n  - `skill: \"ms-office-suite:pdf\"` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills listed in \"Available skills\" below\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n- If you see a <command-name> tag in the current conversation turn (e.g., <command-name>/commit</command-name>), the skill has ALREADY been loaded and its instructions follow in the next message. Do NOT call this tool - just follow the skill instructions directly.\n\nAvailable skills:\n- tr:reviewPR: Conducts an automated review of a GitHub Pull Request.\n- tr:updateDoc: Updates the documentation based on recent code changes.\n- tr:initDoc: Generate great doc system for this project\n- tr:what: Clarifies a vague user request by asking clarifying questions.\n- tr:withScout: Handles a complex task by first investigating the codebase, then executing a plan.\n- tr:commit: Analyzes code changes and generates a conventional commit message.\n",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "skill": {
            "description": "The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"",
            "type": "string"
          },
          "args": {
            "description": "Optional arguments for the skill",
            "type": "string"
          }
        },
        "required": [
          "skill"
        ],
        "additionalProperties": false
      }
    }

Instructions

Execute a skill within the main conversation

When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.

When users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.

Example:
  User: \"run /commit\"
  Assistant: [Calls Skill tool with skill: \"commit\"]

How to invoke:
- Use this tool with the skill name and optional arguments
- Examples:
  - `skill: \"pdf\"` - invoke the pdf skill
  - `skill: \"commit\", args: \"-m 'Fix bug'\"` - invoke with arguments
  - `skill: \"review-pr\", args: \"123\"` - invoke with arguments
  - `skill: \"ms-office-suite:pdf\"` - invoke using fully qualified name

Important:
- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
- NEVER just announce or mention a skill in your text response without actually calling this tool
- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task
- Only use skills listed in \"Available skills\" below
- Do not invoke a skill that is already running
- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
- If you see a <command-name> tag in the current conversation turn (e.g., <command-name>/commit</command-name>), the skill has ALREADY been loaded and its instructions follow in the next message. Do NOT call this tool - just follow the skill instructions directly.

Available skills:
- tr:reviewPR: Conducts an automated review of a GitHub Pull Request.
- tr:updateDoc: Updates the documentation based on recent code changes.
- tr:initDoc: Generate great doc system for this project
- tr:what: Clarifies a vague user request by asking clarifying questions.
- tr:withScout: Handles a complex task by first investigating the codebase, then executing a plan.
- tr:commit: Analyzes code changes and generates a conventional commit message.

除此之外, 在 System 的 Tool Usage Policy 中还有这么一个

- /<skill-name> (e.g., /commit) is shorthand for users to invoke a user-invocable skill. When executed, the skill gets expanded to a full prompt. Use the Skill tool to execute them. IMPORTANT: Only use Skill for skills listed in its user-invocable skills section - do not guess or use built-in CLI commands.

1. 功能

  • 核心定位: 这是一个中转站。它的核心功能是将自然语言(如 "help me fix this bug")或 显式指令(如 "/commit")映射到具体的系统预设能力( Skills )上。

  • 触发机制:


    1. 意图识别: 用户任务需要专业能力辅助时。
    2. 符号触发: 明确的斜杠命令 /
  • 状态管理: 它不仅仅是调用,还包含了一个非常关键的状态检查功能(检查 <command-name> 标签),用于防止死循环(即防止模型在已经加载了技能的情况下再次尝试调用技能)。

2. 构成与强调内容

采用了 Context (背景) -> Trigger (触发器) -> Examples (示例) -> Constraints (约束) -> Knowledge Base (可用列表) 的经典结构。

  • 强调内容( Emphasis ):


    • 即时性与阻断性( Blocking Requirement ): 使用了大写的 IMMEDIATELYBLOCKING REQUIREMENTBEFORE generating。这是为了解决 LLM 常见的一个毛病: “光说不练” (即模型回复“好的,我来帮你运行 commit”,但实际上并没有发起工具调用)。这里强制要求工具调用必须是第一动作。
    • 排他性( Negative Constraints ): 明确规定了不该做什么(不要用于内置 CLI 命令,不要只是嘴上说说,不要调用未列出的技能)。
    • 防递归( Loop Prevention ): 特别强调了检测 <command-name> 标签。这说明该系统是一个多轮对话或基于 Agent 的系统,技能加载后会注入新的 Prompt ,必须防止 Router 再次拦截。

3. 适配高智能模型 & 声明式 vs 命令式

  • 适配度:高。这段 Prompt 非常适合高智商模型。

  • 风格分析:


    • 混合风格,但偏向命令式( Imperative )
    • 虽然有声明式的描述("Skills provide specialized capabilities..."),但在执行逻辑上使用了大量的命令式语句("Use this tool...", "Check if...", "Do NOT call...")。
    • 点评: 对于工具调用( Function Calling ) 类任务,命令式通常优于声明式。因为工具调用需要严格的语法和时序准确性,模糊的声明可能导致模型自由发挥而产生幻觉
  • 思维链引导: Prompt 隐式地要求模型先进行判断( Check if relevant ),然后行动。

Skill 的调用

command 调用

让我们直接调用一个 command, 然后观察他的执行流程吧

Claude Code 其实会把一个 command 的调用拆解成两个步骤

  1. command-nameTag 包裹的命令请求
        {
          "type": "text",
          "text": "<command-message>tr:what</command-message>\n<command-name>/tr:what</command-name>"
        },
  1. SKILL.md 的内容

            {
              "type": "text",
              "text": "CONTENT of SKILL"
            }
    

skill folder

claude code skill 提供的另外一个令人兴奋的能力是: https://code.claude.com/docs/en/skills#add-supporting-files

可以将 skill 涉及到的文件封装在同一个目录下, 这样可以实现更好的结构化.

来看看这部分是怎么实现的, 我们将使用一个空的目录, 看看这个目录的结构吧

.claude
└── skills
    └── say-hello
        ├── scripts
        │   └── hello.sh
        └── SKILL.md

skill 的内容非常简单

---
name: say-hello
description: Say hello to the user
disable-model-invocation: true
---

run scripts/hello.sh
执行流程
❯ /say-hello                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
⏺ Bash(bash /Users/test/code/claude-code-skill-research/.claude/skills/say-hello/scripts/hello.sh)                                                                                         
  ⎿  Hello, World!                                                                                                                                                                         
                                                                                                                                                                                           
⏺ 脚本已成功执行,输出:Hello, World!

这部分其实就没有什么惊喜了, 但是这里要注意: 不要声明绝对目录

请求设计
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "<command-message>say-hello</command-message>\n<command-name>/say-hello</command-name>"
        },
        {
          "type": "text",
          "text": "Base directory for this skill: /Users/test/code/claude-code-skill-research/.claude/skills/say-hello\n\nrun scripts/hello.sh\n",
          "cache_control": {
            "type": "ephemeral"
          }
        }
      ]
    }

可以看到, 这里也没有什么魔法, 或者很工程的设计, 唯一一个需要注意的是:

Base directory for this skill: /Users/test/code/claude-code-skill-research/.claude/skills/say-hello

所以, skill 的 folder 是怎么实现的呢? 很简单, 在提示词里显式的说明了 skill 的路径, 好吧, 有点失望

context-fork

另外一个值得观察的: context fork 的能力, 按照官网描述:

Set to fork to run in a forked subagent context.

听描述应该是说, 会启动一个 subagent, fork 主 agent 的 context, 在完全独立的上下文中运行

让我们看一看, 这个 subagent 的使用吧

现在修改下 SKILL.md, 使用 context fork 以及使用 general-purpose agent 来运行

---
name: say-hello
description: Say hello to the user
disable-model-invocation: true
context: fork
model: sonnet
agent: General-purpose
---

run scripts/hello.sh

执行路径

❯  hello                                                                        
                                                                                
⏺ Hello! How can I help you today?                                              
                                                                                
❯ /say-hello                                                                    
  ⎿  The script ran successfully and outputted:                                 
                                                                                
     Hello, World!                                                              
                                                                                
     The script is located at /Users/test/code/claude-code-skill-research/.claud
     /skills/say-hello/scripts/hello.sh and simply prints a greeting message.   
                                                                                
❯ ok, hi, claude code                                                           
                                                                                
⏺ Hi! What can I help you with? 
subagent 的工作流
{
  "model": "claude-sonnet-4-5-20250929",
  "messages": [
    {
      "role": "user",
      "content": "Base directory for this skill: /Users/test/code/claude-code-skill-research/.claude/skills/say-hello\n\nrun scripts/hello.sh\n"
    },
    {
      "role": "assistant",
      "content": [
        {
          "type": "thinking",
          "thinking": "The user wants me to run the script `scripts/hello.sh`. They've also provided a base directory for a skill: `/Users/test/code/claude-code-skill-research/.claude/skills/say-hello`\n\nI should run the script. The path could be:\n1. Relative to the current working directory (which is `/Users/test/code/claude-code-skill-research`)\n2. Relative to the skill base directory\n\nLet me try running it. Since the current working directory is `/Users/test/code/claude-code-skill-research`, the script path would likely be `scripts/hello.sh` relative to that, or it could be within the skill directory.\n\nLet me check what's available. I'll try to run the script first and see what happens.\n\nActually, given that the base directory for the skill is provided, the script is likely at `/Users/test/code/claude-code-skill-research/.claude/skills/say-hello/scripts/hello.sh`\n\nLet me run that script.",
          "signature": "Eq0ICkYICxgCKkDugd7USNmyDSocrUDwZIgs5NHZ+c/rCy1NrlCexGsxGojGT34iwzaaRAzlzx8Ej9zyvLcL1W1RcBlABJtseubTEgxgFSMj0JHL/v34/OwaDI8rm6XT4rIsJdZHQCIwfc+IqhSnC2tuc6oAFVemNtHNM8zHjbHe88RSGxRCttWvDstUOwN/yFzsBRWkWJs3KpQHn2gPaqbkB+KO4rHA9zL57EM0U9fag2hq1LudmJQ+EjevffqwidkNw5SQOkxKZi5sWE7bEnBYFLw02stS2B8MPYC/sLlKSXom4/G5EuEDWDK92yOuLa/otpAiVNC897c4m7Tq4EZmPpt52elsdwJFtJSRfn4XWdqP0xi5UeT/h6Z6m0NR3zgF04vpg9HMpo/DYEV0/MxGgKcPODXFOuPfup6LHCsXEH2v2g1TAiqECtUc1Qo/RY2Fc2VV6jrN+vmp8pnwuOUiJuXgSUP4hFIkqZylo9Nwv4tHik2sdzfQW+2RAiKDmsjOjuCLaYEeJ2G6TWEe0kYGzSDiY+Wvl5TXPOPpCtYVrQBWySS7ojMT/1uK9UKD2lPyiiEzYjzlfZ40lLDsJf4YTAXI5IEiiJxi4Du5gxgcq50aanwGXnnbkiYQB8hucKI18CF2NG/7obDyidOYJj56aVLAVqauTFp2Wf6Gw3coY4WZuAokS8uPhucM35oo4Ip+XS5VYwCvVe7iSNqZNgVzntnsipFkEi31F0TKmu9lo/mXEix3p9gjem88JvCAOvGFxorh+1+yPZbK+sIUmwf8DAU+gdb2G1s9Tsiue3aUPiImGY53cxrRWu8OlbJ0GBHNeW/9HrX30Rmx2cV1DkSQpV0VZLES6X8d0q821wqGnF+wPp+QXvN2VDTdQzv74GPnKWKfyDVMlBRIVMZ9Zy4YzOeO5kEDAkXgPKMkTUbfd8f/K97I38+jE9uavVRkyVefjpNkSca89tXCnMMYGormXrkVczZr08Wgny/nJXIS4qapbaoRwVpQWKh8thfVttpkQngktd2152e1iFspfNlnn1PxVJ8EDKvQTKBEXL5hXl6j42XkybXI19za79ppvvViXK/s373IUTtlLeJGZuqUdj1cbtEunNlS0NjDFRMZD6nWdx81tJraJjr7AFKzbuXG57UhUlJ6pR7co3kaCzkpVU899LM0XXoZ702VXy1JvgKIEh8yceQuhGuCVDMT04OeVZMsGk7EPVQpIYLOdMVl08fzrc3096TkFM+wRunonIqDNq/t5pCA/mHiREAOkpSD5ZyFfj1eTY/s5H1vrxJJah26yeHuPRAU4ermSduIx9tcSqioJe/aNK/9HUZTZXDz1eNKw5DUoNCwmeLIa0Tod7Rb+85aGlqTKVyk9EUqhMXBvz4LWn6b4yII2+Ta7wjr+xS3akphBB67TsLQ/BgB"
        },
        {
          "type": "text",
          "text": "I'll run the hello.sh script for you."
        },
        {
          "type": "tool_use",
          "id": "toolu_01ANhWLy3masVW2f6K7dcSTF",
          "name": "Bash",
          "input": {
            "command": "bash /Users/test/code/claude-code-skill-research/.claude/skills/say-hello/scripts/hello.sh",
            "description": "Run the hello.sh script"
          },
          "cache_control": {
            "type": "ephemeral"
          }
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "tool_use_id": "toolu_01ANhWLy3masVW2f6K7dcSTF",
          "type": "tool_result",
          "content": "Hello, World!",
          "is_error": false,
          "cache_control": {
            "type": "ephemeral"
          }
        }
      ]
    }
  ]
}

subagent 的 context

https://github.com/anthropics/claude-code/issues/20492

很遗憾, subagent 里并不是 fork master context, 看起来就像是运行普通的 agnet 一样, 只是把 Skill 的执行放在了 subagent 中

我尝试了以下做法:

  1. 不指定 skill 使用的 subagent
  2. skill.md 中要求 load master agent 的上下文
  3. 只使用 agent 不使用 context fork

现在看来, 这里的 context fork 指的并不是 fork master agent 的 context, 而是指的是 subagent skill + agent 本身的 context, 其实是一个 new 的 context, 有点失望

Claude Code Skill 机制研究总结

核心发现

1. Skill 工具本质

Skill 工具是一个路由器( Router ) ,而非执行器。它的职责是:

  • 将用户意图(自然语言或 /command)映射到预定义的能力
  • 触发 Skill 的加载,而非直接执行
  • 通过 <command-name> 标签进行状态管理,防止递归调用

2. 执行流程

Skill 调用被拆解为两步:

用户输入 → Skill Router → 注入 Skill 内容 → LLM 执行
  1. 标记注入<command-name>/skill-name</command-name>
  2. 内容注入SKILL.md 的实际指令

这不是一个复杂的编排系统,而是简单的 Prompt 拼接

3. Skill Folder 的实现

毫无魔法可言。

实现方式仅仅是在 Prompt 中显式声明基础路径:

Base directory for this skill: /path/to/skill/folder

然后依赖 LLM 自行推断相对路径。这是一个脆弱且依赖模型理解能力的设计。

4. Context Fork 的真相(最大失望点)

文档描述具有误导性。

官方描述 实际行为
"Fork" 主 Agent 的上下文 创建全新的独立上下文
Subagent 继承对话历史 Subagent 仅接收 Skill 指令
类似子进程 fork 更像是 spawn 一个新进程

实测证明:

  • Subagent 无法访问主对话的任何历史
  • 不存在真正的上下文继承
  • context: fork 的 "fork" 是名义上的,实际是 "new"


最终结论

定性评价

Claude Code Skill 系统是一个工程上极简、能力上有限的实现:

维度 评价
架构复杂度 低(本质是 Prompt 路由 + 拼接)
扩展性 中(支持目录结构、多模型)
隔离性 弱(依赖 LLM 自律,无真正沙箱)
上下文管理 差(无真正的 fork ,仅 spawn )
文档准确性 存在误导( context fork 名不副实)

核心局限

  1. 无真正的 Subagent 上下文继承:如果你的 Skill 需要依赖主对话的上下文(如"基于之前讨论的方案执行 X"),当前设计无法满足
  2. 路径管理依赖模型理解:Skill Folder 的相对路径解析完全依赖 LLM ,存在幻觉风险
  3. 状态同步缺失:Subagent 执行结果仅通过文本返回主对话,无结构化状态同步

本来是用来连接到自己的博客每天定时发文章的,发出后看到一些人也有需求,就整理了一下发出来,让大家也能从中获得便利

  • 可以自定义添加RSS源和板块,让AI检索哪些RSS源你说了算!

这里分享一个比较全面的RSS源地址项目,佬友们也可以自己查找

  • 支持定时任务,可以自定义时间,每日自动推送释放双手,也可以立即采集即刻获得

做的没那么华丽,佬友们可以根据自己需要进行修改

希望这个项目对大家有一些帮助


📌 转载信息
原作者: aizith
转载时间: 2026/1/25 08:12:10

如果你想 快速从远程 URL 导入 SSH 公钥并启用密钥登录(自动关闭密码登录),可以用下面这条便捷命令:

bash <(curl -sL kejilion.sh) sshkey <公钥URL示例>
bash <(curl -sL kejilion.sh) sshkey https://github.com/torvalds.keys
bash <(curl -sL kejilion.sh) sshkey https://crazypeace.github.io/ssh-public-key/

从你提供的 URL 下载 SSH 公钥
添加到当前用户的 ~/.ssh/authorized_keys
自动调整权限和 SSH 配置
开启基于密钥的登录方式

大家可以找台新机器试试哈 相当好用 嘿嘿!


📌 转载信息
原作者: kejilion
转载时间: 2026/1/25 08:11:53

📰 今日新闻精选:

  • 全国多地景区推出马年限定福利:属马、姓马或名字带 “马” 的游客可享免门票畅游,覆盖北京、新疆、湖北等十余省份
  • 江苏江阴一工程延期因挖到 “7000 年遗址”?相关部门回应:情况属实
  • 网友称实测车厢二氧化碳浓度超标,专家回应:符合铁路行业标准,对旅客健康无影响
  • 甘肃定西、广东汕尾等地将器官捐献纳入 “见义勇为” 评定,专家称概念扩展需审慎
  • 河南漯河一驾校校长纠集多人组织 5677 名学员考驾照作弊,获利 256 万,退赃后获刑四年
  • 中国科学家新发明:研制出 “自供能” 心脏起搏器,可利用心跳动能发电,已在动物实验成功
  • 北上广深等 50 个城市开展有奖发票试点,最高中奖 800 元
  • 白银首破 100 美元大关,刷新历史纪录,年内涨幅逼近 40%;黄金逼近 5000 美元
  • U23 亚洲杯:国足 0 比 4 不敌日本,收获亚军创历史;越南点球 9 比 8 战胜韩国,首夺季军
  • 卢拉宣布巴西将对中国公民实施免签政策,旅游搜索量增 5 倍
  • 美媒:特朗普决定美国退出世界卫生组织后,加州宣布加入世卫组织全球疫情警报和反应网络
  • 外媒:数据显示美元在全球外汇储备中占比跌破 60%,创数十年新低
  • 外媒:丹麦反美 APP 火出圈,可帮助消费者识别商品原产地以便拒绝美国商品
  • 美媒:美国防部发布《国家防务战略》,将国土防御列为首要任务,并呼吁盟友承担更多责任
  • 外媒:俄美乌首次三方会谈结束,泽连斯基称会谈具有建设性,预计下周举行新一轮

📅 今日信息:

  • 公历:2026-01-25 星期日 水瓶座
  • 农历:二〇二五年腊月初七
  • 农历纪念日:填仓节
  • 下一节气:2026-02-04,立春
  • 今年进度:6.85%(已过 25 天,剩余 339 天)

🌟 历史上的今天

  • 1915 年,亚历山大·格雷厄姆·贝尔在纽约和旧金山之间进行了第一次跨大陆电话通话,开启了长途通信的新纪元。
  • 1980 年,保罗·麦卡特尼因持有大麻在东京被捕,这一事件成为音乐界的一个小插曲。

今天也是国际反欺凌日,提醒我们关注校园和网络中的友善与尊重。

首先上github链接:

这个项目本质上是一个把图片的一部分剪下来,经过api/手动处理后回填到原图片的项目。

我们都知道banana可以翻译正常漫画,但是合理利用这个项目也可以轻松把涩图漫画也翻译成毫无P图痕迹的漫画哦。

原理很简单,banana拒绝翻译涩图的原因是,你把涩图发给了banana!

这好像是一句废话,但我们反过来思考就能发现,如果我们不把完整的涩图发给,而是把有台词的部分切片发给它,它就不会拒绝~

(这么一想,我其实是不是不用加nsfw标签?)

那么通往真理的大道就打开了:

  1. 上传你的图片到本项目

  2. 圈出台词所在的图片(我看到其他漫画翻译项目可以自动检测文本框,使用comic text detector之类的工具实现的,先摆烂一会,等一个pr~)

  3. 使用nano banana pro的api发起翻译请求(当然也提供了不使用api手动替换的途径)

  4. 翻译后的对话自动回填到涩图中!

还有一些注意事项:

  1. gemini-business2api项目可以白嫖banana pro,但是通过2api的生图成功率比较低,因为图片虽然生成了,但url好像经常没有被项目返回。可能需要看看项目能不能二开一下修复这个问题才能爽嫖?使用纯banana api就不会有问题,成功率99.99%。实在没有纯api的话也可以用手动模式,在gemini-business一张一张翻译再复制回项目ww

    gemini-business2api生图问题解决了,现在可以稳定生图,等我给这个项目提pr

    更新:pr已经提交了,如果2api项目的佬友还没合并的话,你们可以参考我pr的内容改两句代码后直接运行。

  2. 圈出图片所在的台词时,不要圈太小了,尽量圈大点,比如这样:

除了文本框,还要多截一些周围的景色。

因为结果测试,如果不截一些景色的话,就会导致banan喜欢偷懒不嵌字,把日文原图发回来。

  1. 推荐提示词,可以自行修改:

    0. 使用banana pro
    
    1. 请用banana中文翻译替换掉图片里的日文。是的,生成一张只有中文的图!
    
    3. 这句台词的大意是:[]
    

📌 转载信息
转载时间: 2026/1/25 08:07:06

第一步:开启 Chrome 远程调试权限

这是所有操作的前提,必须手动开启。

  1. 打开 Chrome 浏览器,在地址栏输入:chrome://inspect/#remote-debugging
  2. 勾选 “Allow remote debugging for this browser instance”
  1. 确认下方出现:Server running at: 127.0.0.1:9222(这表示“门”已打开)。


第二步:配置 MCP 服务

AionUI 图形界面配置

  1. 进入 AionUI 的 Settings(设置)Tools Settings(工具设置)

  2. MCP Management 区域点击 Add MCP Service

  3. 选择 Add via JSON,粘贴以下配置:

{ "mcpServers": { "chrome-devtools": { "command": "npx", "args": [ "-y", "chrome-devtools-mcp@latest", "--autoConnect", "--channel=stable" ] } } } 


第三步:激活连接(关键动作)

配置完成后,Gemini 并不会立刻接管浏览器,需要一次“握手”:

  1. 在 Gemini CLI 或 AionUI 中输入第一个指令,例如:截取当前网页的屏幕

  2. 切换回 Chrome 浏览器:你会看到页面顶部弹出一个系统确认框,询问 “Allow incoming debugging connection?”

  3. 点击 Allow(允许)

  4. 浏览器顶部出现横幅(显示“正在受自动测试软件控制”),说明连接成功。


第四步:实战常用指令

连接成功后,你可以直接用自然语言指挥 Gemini 处理你当前看到的网页:

  • 视觉分析
    • “帮我截个图,分析一下现在的 UI 布局有没有错位?”
  • 性能诊断
    • “分析当前页面的性能,告诉我 LCP(最大内容绘制)是多少,怎么优化?”
  • 代码调试
    • “检查当前页面的 Console 控制台,有没有报错?如果有,帮我解释原因。”
  • 网页抓取与操作
    • “提取当前网页中所有商品的价格并列成表格。”
    • “帮我点击页面上的‘提交’按钮。”(AI 会通过 DOM 树自动定位元素)


推荐模型:Gemini 3 Flash、Gemini 3 Pro、GLM 4.7(英伟达无限免费 API)
使用案例:



感谢 的AionUI
AionUi V1.7.4 更新:兼容了Newapi(Cowork开源版可以用公益站/中转站了)

也欢迎使用我的 AMC,这个教程的方法也都是我用 AMC 的深度搜索功能学会的
AMC更新:支持Markdown 转 PDF、划词 TTS


推荐使用 @bbbugg 佬的AIStudioToAPI 构建自己的API 池
https://linux.do/t/topic/1371269

【二改】二改build反代(AIStudio to API),优化云端部署


📌 转载信息
原作者: yeahhe
转载时间: 2026/1/25 08:06:46

我和同事们目前正在利用 OpenCode(Claude Code 的一个替代方案)进行一项小研究。目前我们刚开始测试 gpt-5-mini,看看它在编程辅助方面的性能能否与 Claude Sonnet 媲美。

也非常欢迎大家亲自尝试研究并分享心得,比如哪种 LLM 模型成功率最高,以及使用了什么样的 Prompt(提示词)。

注:我是来自印尼的用户,正在使用 Google Gemini 协助翻译论坛里的讨论。如果翻译有不准确的地方,还请大家多多包涵,手下留情。


📌 转载信息
原作者: galpt
转载时间: 2026/1/25 08:06:35

很感谢一直支持我的朋友,虽然很久没发帖子,但是插件一直努力更新,今天有一些有意思的事情,于是想分享一下。

随时随地,随用随走是AI Anywhere的本心,智能体是必然的发展方向

前提

前段时间更新了内置MCP,包括(utools发布版本为1.11.10,测试版为1.11.14):

  • Web Search:获取互联网信息和网页内容
    • 网络搜索(DDG):通过关键词在互联网上搜索相关信息并返回摘要
    • 网页获取:抓取并解析指定 URL 网页的全文内容
  • 文件操作:对本地文件系统进行查找、读取和编辑
    • 文件定位:使用通配符模式快速查找匹配的文件路径
    • 内容检索:使用正则表达式在文件内容中搜索特定模式
    • 读取文件:从本地或远程路径读取文件内容(支持分段读取)
    • 写入文件:创建新文件或完全覆盖现有文件内容
    • 编辑文件:通过精确字符串替换来修改文件内容
  • 代码执行:在本地环境中运行 Python 代码和系统命令
    • 运行 Python 代码:直接执行提供的 Python 代码片段
    • 运行 Python 文件:执行本地存储的 .py 脚本文件
    • 解释器列表:扫描并列出系统中所有可用的 Python 解释器路径
    • 执行 Shell 命令:在 Windows 系统上执行各类命令行指令
  • 任务委派:处理复杂的多步骤任务
    • 子智能体(Sub-Agent):将复杂任务委派给具备特定工具权限的子 Agent 协同完成

很眼熟?因为照着claude code的功能模仿的,他目前是我见到的最优秀的智能体示例


事件经过

今天看到了qwen3-tts发布的消息,但是已经没有追着新模型本地部署测试的激情了,突然想到能不能试试我的智能体?于是便有了接下来的一幕:

系统提示词:空
模型:gemini-3-flash-preview
MCP工具:仅限于上述的内置MCP

提出要求-自动部署-告诉他取消用uv环境,使用配置好CUDA的p312环境,然后就部署好了?!

虽然anywhere可以分享会话文件给其他用户打开并继续聊天,但是因为命令行运行涉及到个人隐私,于是分享一下导出的html

See the Pen qwen3-tts-deployment by ComorebiC (@ComorebiC)
on CodePen.

整个过程我基本没怎么操心(除了偶尔运行时命令行报错,我原封不动发回去让他处理就行)。

虽然这是 Claude Code 的一个功能,但也是我用 Anywhere 从“划词翻译”、“OCR”、“辅助读论文”这些基础功能向更便捷更智能迈进的一大步(其实生活中也有些例子了,比如文件归档,我把目录告诉 AI,告诉它整理格式,它能自动分类、命名整理好,如开启chrome dev tool mcp,让它帮我爬取炎拳漫画的某些章节等等)。

未来我们也能自定义更多便捷的智能体,不仅仅是代码方面,还有办公、开发、个人兴趣、学习……超级期待!


如果有好的创意欢迎分享,我很乐意尝试,如果对插件有建议也欢迎分享!


📌 转载信息
转载时间: 2026/1/25 08:06:27

Tavily 的搜索非常好用,基本上能搜到想要的,目前每个账号每个月都有 1000 积分可以使用

为了能同时使用多个账号的额度,我写了 我 vibe coding 了一个本地的代理服务,功能实际上和 另一位佬友的项目 tavily-hikari 差不多,但是佬友的项目要访问 /admin 页面需要额外配置一下 forward auth

本项目主打一个轻量简洁,没有 WebUI,只做请求转发,把你所有账号的 API Key 放到项目根目录中下的 keys.json

配置好,启动服务后,直接当作 MCP 服务使用即可:

{ "mcpServers": { "tavily": { "url": "http://localhost:8787" } } } 

具体使用/部署方法可以看 README

项目地址:GitHub - kuyermqi/tavily-proxy: Lightweight proxy for Tavily MCP


📌 转载信息
原作者: kuyermqi
转载时间: 2026/1/25 08:06:15

加入L站有段时间了,在里面学到[白女票]了不少好东西,同时也感谢佬友们的热心解答和无偿帮助以及佬友们的无私奉献。

最近总是刷到Gemini学生验证看到不少佬友都是直接买的虚拟卡,很多佬友都卡在卡片验证这一块,为了给佬友们省下这笔巨款,特此写一篇PayPal过验证的方法,有不足之处欢迎指正、共同探讨。

我用的是港区PayPal进行验证的,港区PayPal绑Visa信用卡,Google账号是注册的美区,全程美区节点。

废话不多说 下面直接开始

PayPal订阅篇

ShreeID认证成功之后 点击畅享学生优惠会弹出添加付款方式的页面


选择添加PayPal,点击继续,会弹出PayPal登录窗口,使用你的PayPal账号进行登录


登录验证完成之后点击同意并继续

之后会弹出确认信息,注意看下面的地区是美国(US),这里直接Google搜索美国身份生成,选一个免税州(这里我选的俄勒冈州),其他的不用管,然后邮编和姓名复制刚刚生成的信息回填到确认您的信息里面,操作完成之后点击保存并继续


之后就弹出来了订阅窗口,点击订阅,至此就大功告成了。


移除支付方式及PayPal自动付款项目篇(很重要):

订阅完成之后记得取消订阅删除付款资料(或者你记得订阅到期日期,在这之前取消订阅也行,我是订阅完了就直接取消订阅了)

进入Google账号页面点击付款和订阅,点击管理订阅


弹出的页面中选择取消订阅,会跳转到支付方式选项卡里面,点击修改支付方式


选择移除

这里注意了,在弹出的永久移除PayPal账号中点击转到PayPal以移除Google账号

选择刚刚自动付款的项目(即Google, Inc) 点击 取消

这里有多个自动付款项目的佬友一定要找出正确的自动付款项目避免造成不必要的损失。

PayPal部分完成后,接下来就是关闭Google的支付资料

移除PayPal账号之后回到Google付款中心页面,点击设置选项卡,拉到最下面,点击关闭支付资料,选择关闭原因后确认,这样Google付款资料和PayPal自动付款就彻底移除了


📌 转载信息
原作者: 0heartland0
转载时间: 2026/1/25 08:06:11

https://linux.do/t/topic/1465569?u=yeahhe




📌 转载信息
原作者: yeahhe
转载时间: 2026/1/25 08:05:53

几个月前佬 开发了一个给图片添加AI水印的,当时觉得很好玩,但是他把源码弄丢了,我想二开都没东西 。上个月又刷到帖子发现了AI Studio网页上有历史水印的素材,这我可不困了,开始库库搜集所有AI生成水印的素材。这两天不是opencode很火么,就用这个项目练手搓出来一个我认为可以交付的网页。


基本功能:

  • 单张或者批量导入图片
  • 调整尺寸匹配主流AI生成尺寸(可跳过,可缩放,可裁切)
  • 添加各种AI水印,甚至自定义文字或者图片水印
  • 导出可选择多种格式和图片质量

水印种类:

  • 谷歌:当前白色十字芒星/旧版彩色十字芒星/旧版AI
  • 字节:豆包/即梦/Dreamina(即梦海外版)
  • 阿里:千问/通义万相/夸克造点
  • 百度:百度/文心
  • 智谱:智谱清言/ZAI
  • 腾讯:腾讯混元
  • 自定义:任意图片/文本
  • 如果有其他平台/渠道的水印需要添加,欢迎在评论区提出!

细节与亮点:

  • 静态网页,完全本地处理,数据安全
  • 调整尺寸环节可以缩放图片,也可以调整宽高比裁切图片(当水印选择“无”时,你甚至可以把他当成批量缩放/裁切到特定比例的工具)
  • 水印自动适配不同分辨率,保证水印比例和各家官方一样
  • 可以批量上传图片,可以左下角删除单张图片,可以zip批量导出
  • 响应式,中英双语,暗黑模式


看起来很炫酷,但我们大部分的需求是去水印啊,这加水印有什么用呢?

当然也可以叠水印杀人书


开源地址:GitHub - JasonWenTheFox/VibeMark

(喜欢的点个star吧!)

即开即用Demo:

已知需要优化的地方:

缺失Grok的两个版本的水印,缺少Adobe Firefly的水印,很遗憾,目前他们的渠道都没有水印,我没有黑底的水印图,无法制作。


📌 转载信息
转载时间: 2026/1/25 08:05:24

感谢:【开源欢迎star】即梦海外版2api :Dreamina2API 以及:jimeng-api

晚上看到海外版注册机,然后看到有个 2api 是 py 版本,想着能不能重构下,直接部署到大善人那儿,于是让 AI 搓了一个出来,目前只有文生图,其他还没弄(熬不动了,溜去睡了)


在线:https://j.aisk.de5.net

项目地址:dreamina-api

感谢支持


📌 转载信息
转载时间: 2026/1/25 08:05:03