游子们,打算什么时候回家过年?
大聪明预警
按法定放假时间(2-15 日)回家,路上肯定很堵(飞机、高铁、火车除外),所以做了一个聪明的决定
,提前一周就出发:2 月 7 号,
跟我想的一样的人有么?
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
按法定放假时间(2-15 日)回家,路上肯定很堵(飞机、高铁、火车除外),所以做了一个聪明的决定
,提前一周就出发:2 月 7 号,
跟我想的一样的人有么?
安装包下载:https://pan.quark.cn/s/ecd93f07c147 选安装位置: 选附加任务: Drawpile-2.2.2-x86_64.msi是个在线绘画协作工具,可以多人同时在一张画布上画画,适合和朋友一起涂鸦、设计草图。一、准备工作
二、安装步骤
Drawpile-2.2.2-x86_64.msi运行。C:\Program Files\Drawpile,想改就点“Browse”选 D 盘或其他盘。三、首次运行设置
四、基本使用(简单说两句)
drawpile://192.168.1.100:27750)→ 点“Join”。
其实我的服务器也没啥东西,就一个官网和一个 newapi 服务,官网用 next 写的,结果一天几千条被攻击的消息,CPU 平均 80% 以上,这事持续一段时间了,一直懒得弄,阿里云客服说有违法的可能,吓得我赶紧又买了台服务器放官网,然后升级了 next 版本。
开源不易,没有收入,麻烦大家支持一下。
https://notegen.top/
在 Linux 中,端口是一个编号的网络连接,它允许设备通过 Internet 或本地网络与其他设备通信。确保端口是开放和可访问的非常重要,它确保网络业务的正常运行。在本文中,我们将讨论五个检查 Linux 中端口是否打开的常用方法。 首先,检查一个端口是否打开并在远程主机上侦听。 Using nc Command nc 命令允许您向端口发送数据,并查看是否收到响应。nc 命令基本语法如下: 例如,要检查主机 example.com 上的 22 端口是否打开,可以使用以下命令: 如果端口打开,您将看到消息 "Connection to hostname port [ tcp/ssh ]succeeded"。如果端口关闭,您将看到消息 "Connection to hostname port [ tcp/ssh ] failed: Connection refused"。 Using telnet Command telnet 命令用于连接到远程主机上的端口,看看是否建立了连接。查询端口是否打开,使用以下语法: 例如,要检查主机 www.example.com 上的 80 端口是否打开,可以使用以下命令: 如果端口是打开的,您将看到一个空白屏幕。要退出,请按 Using nmap Command 例如,要检查主机 www.example.com 上的 80 端口是否打开,可以使用以下命令: 如果端口是打开的,您将在输出中看到一行,表明端口是打开的。如果端口已关闭,您将看到一行,指示端口已关闭。 您可以创建一个 bash 脚本检查本地或远程主机上端口是否打开,示例脚本如下: 这里 HOST 是远程或本地主机系统的主机名或 IP 地址。PORT 是要检查的端口号。,nc 命令可以连接到主机上的任何端口并返回状态。$? 是一个系统环境变量,包含最后一个命令的退出状态。 很多时候,我们需要检查本地机器上是否有端口正在侦听。 Using lsof Command 例如,要检查 80 端口是否打开,可以使用以下命令: 如果端口打开,将看到一行,包含端口号和使用该端口的进程的名称。如果端口关闭,将看不到任何输出。 Using ss Command 例如,要检查 80 端口是否打开,可以使用以下命令: 如果端口打开,将看到一行,其中包含端口号和状态 LISTEN。如果端口关闭,将看不到任何输出。 注意: 您可能需要使用 sudo 来运行这些命令,这取决于您的系统配置。
Check Open Port on Remote Host
nc -vz hostname portnc -vz example.com 22telnet hostname porttelnet www.example.com 80CTRL + ],然后键入 quit。如果端口关闭,您将看到 "Connected to hostname. Escape character is '^]'. Connection closed by foreign host"nmap 命令是一个执行网络扫描和探测的实用程序,它可以通过端口扫描来检查目标主机端口是否打开。要检查端口是否打开,使用以下语法:nmap -p port hostnamenmap -p 80 www.example.comShell Script to Check Port Status
#!/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
Check Listening Port on Localhost
lsof 命令是一个实用程序,用于显示有关打开文件的信息。要检查端口是否打开,使用以下语法:lsof -i :portlsof -i :80ss 命令是一个显示网络套接字信息的实用程序。要检查端口是否打开,使用以下语法:ss -lnp | grep portss -lnp | grep 80
自从国家改了规则,按年累计计税,
总是感慨,1 月的工资才是最香的,
随着月份累加,收入递减。
这是常态了啊,😅
可我没适应!
大家好,我是《交易学徒》的作者。
简单介绍下背景:我现在的核心身份是带两个孩子的全职奶爸,副业才是趁着孩子睡着后,在键盘上敲敲打打的独立开发者。
对于我这种“碎片化时间”开发者来说,运维复杂度就是最大的敌人。
几年前写后端,我也迷信“标准答案”:做个服务,起手就是 Docker 编排,Redis 做缓存,Kafka 做解耦,微服务先分几个出来。结果往往是,功能没写几个,光是调网络、修连接超时、查中间件报错,就把孩子午睡的那宝贵两小时耗光了(那时候还没孩子)。
在开发后端时,我陷入了深思:
“对于一个追求极致性能、但只有一个人维护的系统,所谓的‘工业级架构’真的是解药吗?还是毒药?”
最终,我做了一个违背祖宗的决定:做减法。 我删除了 Redis ,移除了 Kafka ,把整个微服务集群塌缩成了一个 Rust 单体应用。
今天想聊聊这背后的思考过程。
一、 复杂度的守恒与转移
我的业务场景看似简单,实则牵一发而动全身。一个简单的“用户平仓”动作,就像推倒了第一块多米诺骨牌:
核心域:结算盈亏,改余额,写数据库。(必须马上做)
通知域:给前端发个弹窗通知“平仓成功”。(晚 0.1 秒没关系)
营销域:判断有没有触发“五连胜”、“以小博大”成就,发奖励。(晚 1 秒没关系)
统计域:计算交易评分,统计分数或者更新等级与交易报表。(晚几秒都行)
在“标准架构”里,我们需要引入 消息队列 (MQ) 来解耦这些逻辑。 但引入 MQ 本质上并没有消除复杂度,只是将“代码复杂度”转移成了“运维复杂度”。
对于团队,运维复杂度可以分摊给同事;但对于我,这意味着我不仅要写代码,还得修服务器。
Rust 给了我另一个选择:利用它极高的性能,把“运维复杂度”重新压回“架构设计”里,用最朴素的方式解决问题。
二、 内存即总线:构建“喊一嗓子”的架构
我利用 Rust 的内存通道特性,构建了一个“超光速大喇叭”。 我不请求数据,我只发布事实。
这个过程,可以用一个生活化的场景来描述:
📄 事实 A:有人平仓了(包含:是谁、赚了多少、单号是多少)
📄 事实 B:有人购买商品了
📄 事实 C:AI 分析完成了
编译器会盯着这张清单,保证我发出的每一个“事实”都是格式正确、童叟无欺的。
传统架构 (Kafka) 是这样的:
交易模块 -> 打包数据 -> 建立 TCP 连接 -> 三次握手 -> 发送给 Kafka 集群 -> 等待 ACK -> 结束 (这中间任何一步网络抖动,都得处理异常)
我的单体架构是这样的:
交易模块 -> 喊:“老王平仓赚了 100 块!” -> 结束 (纯内存操作,纳秒级完成,快到像是没有发生过)
比如 “营销服务”,它就像一个在角落里旁听的记分员:
它平时不说话,只听大喇叭。
一听到 “老王平仓赚了 100 块”,它立马翻开小本本查历史。
发现老王已经连赢 4 把了,加上这把正好 5 把。
于是它默默地给老王发了一个“五连绝世”的徽章。
整个过程,核心交易模块完全不知情,也完全不用等待,它喊完那一嗓子就去服务下一个用户了。
三、 深度思考:关于“不可靠”的权衡
很多朋友可能会问:“没有 Kafka 把消息存到硬盘里,万一服务器断电了,你喊的那一嗓子不就丢了吗?”
是的,这是整个架构思考中最痛苦,也是最关键的取舍。 我问了自己两个问题:
Q1:我的程序崩溃概率有多大? Rust 以安全著称,只要代码写得不离谱,它极难崩溃( Panic )。这比 Java 的内存溢出或 Python 的运行时错误要稳健得多。
Q2:丢失数据的代价是什么?
我们可以把数据分成两类:
💰 钱(核心数据): 余额、订单状态。
处理方式: 必须落袋为安。 直接写死在数据库里,绝不依赖“大喇叭”。
🎁 气氛(衍生数据): 弹窗通知、成就徽章、达标奖励、统计报表。
处理方式: 听天由命。 如果真的赶上万年不遇的服务器着火,用户少收到了一个“五连胜”的弹窗,或者报表少统计了一笔,天会塌吗?不会。
结论: 为了 0.001% 的极端掉电风险,去让 99.99% 的时间里的系统背负沉重的中间件包袱,对于独立开发者来说,这是一笔亏本买卖。
四、 结语
当我们谈论“高性能”时,往往想到的是复杂的集群、昂贵的服务器。 但 Simple is fast. (简单即快)
现在的《交易学徒》后端,就是一个 20MB 的小文件。
❌ 没有 Docker 容器编排
❌ 没有 虚拟机调优
❌ 没有 Redis 维护
❌ 没有 服务间通讯
✅ 只有一个跑在单机上的进程,CPU 占用极低,响应速度极快。
这省下来的不仅仅是每年的服务器费用,更是我作为父亲陪伴孩子的宝贵时间。
技术服务于生活,这大概就是独立开发的魅力吧。
关于《交易学徒》
这是我用这套“极简架构”打磨的作品,前端是 Flutter ,后端 Rust 。 希望能给交易员朋友们提供一个干净、流畅、无延迟的练习环境。
Google Play: https://play.google.com/store/apps/details?id=com.zengkai.jyxtclient
欢迎 V 友们指正。如果你的孩子也吵着要抱抱,那我们就是异父异母的亲兄弟了。😄
路径:用户块右上角齿轮-> 两步验证
BLOG: https://blog.pdjjq.org/post/claude-code-skill-25ron8
让我们来抓包 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
}
}
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.
核心定位: 这是一个中转站。它的核心功能是将自然语言(如 "help me fix this bug")或 显式指令(如 "/commit")映射到具体的系统预设能力( Skills )上。
触发机制:
/。状态管理: 它不仅仅是调用,还包含了一个非常关键的状态检查功能(检查 <command-name> 标签),用于防止死循环(即防止模型在已经加载了技能的情况下再次尝试调用技能)。
采用了 Context (背景) -> Trigger (触发器) -> Examples (示例) -> Constraints (约束) -> Knowledge Base (可用列表) 的经典结构。
强调内容( Emphasis ):
IMMEDIATELY、BLOCKING REQUIREMENT、BEFORE generating。这是为了解决 LLM 常见的一个毛病: “光说不练” (即模型回复“好的,我来帮你运行 commit”,但实际上并没有发起工具调用)。这里强制要求工具调用必须是第一动作。<command-name> 标签。这说明该系统是一个多轮对话或基于 Agent 的系统,技能加载后会注入新的 Prompt ,必须防止 Router 再次拦截。适配度:高。这段 Prompt 非常适合高智商模型。
风格分析:
思维链引导: Prompt 隐式地要求模型先进行判断( Check if relevant ),然后行动。
让我们直接调用一个 command, 然后观察他的执行流程吧
Claude Code 其实会把一个 command 的调用拆解成两个步骤
command-nameTag 包裹的命令请求 {
"type": "text",
"text": "<command-message>tr:what</command-message>\n<command-name>/tr:what</command-name>"
},
SKILL.md 的内容
{
"type": "text",
"text": "CONTENT of SKILL"
}
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 的能力, 按照官网描述:
Set to
forkto 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?
{
"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"
}
}
]
}
]
}
https://github.com/anthropics/claude-code/issues/20492
很遗憾, subagent 里并不是 fork master context, 看起来就像是运行普通的 agnet 一样, 只是把 Skill 的执行放在了 subagent 中
我尝试了以下做法:
现在看来, 这里的 context fork 指的并不是 fork master agent 的 context, 而是指的是 subagent skill + agent 本身的 context, 其实是一个 new 的 context, 有点失望
Skill 工具是一个路由器( Router ) ,而非执行器。它的职责是:
/command)映射到预定义的能力<command-name> 标签进行状态管理,防止递归调用Skill 调用被拆解为两步:
用户输入 → Skill Router → 注入 Skill 内容 → LLM 执行
<command-name>/skill-name</command-name>这不是一个复杂的编排系统,而是简单的 Prompt 拼接。
毫无魔法可言。
实现方式仅仅是在 Prompt 中显式声明基础路径:
Base directory for this skill: /path/to/skill/folder
然后依赖 LLM 自行推断相对路径。这是一个脆弱且依赖模型理解能力的设计。
文档描述具有误导性。
| 官方描述 | 实际行为 |
|---|---|
| "Fork" 主 Agent 的上下文 | 创建全新的独立上下文 |
| Subagent 继承对话历史 | Subagent 仅接收 Skill 指令 |
| 类似子进程 fork | 更像是 spawn 一个新进程 |
实测证明:
context: fork 的 "fork" 是名义上的,实际是 "new"Claude Code Skill 系统是一个工程上极简、能力上有限的实现:
| 维度 | 评价 |
|---|---|
| 架构复杂度 | 低(本质是 Prompt 路由 + 拼接) |
| 扩展性 | 中(支持目录结构、多模型) |
| 隔离性 | 弱(依赖 LLM 自律,无真正沙箱) |
| 上下文管理 | 差(无真正的 fork ,仅 spawn ) |
| 文档准确性 | 存在误导( context fork 名不副实) |
本来是用来连接到自己的博客每天定时发文章的,发出后看到一些人也有需求,就整理了一下发出来,让大家也能从中获得便利
这里分享一个比较全面的RSS源地址项目,佬友们也可以自己查找
支持定时任务,可以自定义时间,每日自动推送释放双手,也可以立即采集即刻获得
做的没那么华丽,佬友们可以根据自己需要进行修改
希望这个项目对大家有一些帮助
如果你想 快速从远程 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 配置
开启基于密钥的登录方式
大家可以找台新机器试试哈 相当好用 嘿嘿!
首先上github链接:
这个项目本质上是一个把图片的一部分剪下来,经过api/手动处理后回填到原图片的项目。
我们都知道banana可以翻译正常漫画,但是合理利用这个项目也可以轻松把涩图漫画也翻译成毫无P图痕迹的漫画哦。
原理很简单,banana拒绝翻译涩图的原因是,你把涩图发给了banana!
这好像是一句废话,但我们反过来思考就能发现,如果我们不把完整的涩图发给,而是把有台词的部分切片发给它,它就不会拒绝~
(这么一想,我其实是不是不用加nsfw标签?)
那么通往真理的大道就打开了:
上传你的图片到本项目
圈出台词所在的图片(我看到其他漫画翻译项目可以自动检测文本框,使用comic text detector之类的工具实现的,先摆烂一会,等一个pr~)
使用nano banana pro的api发起翻译请求(当然也提供了不使用api手动替换的途径)
翻译后的对话自动回填到涩图中!
还有一些注意事项:
gemini-business2api项目可以白嫖banana pro,但是通过2api的生图成功率比较低,因为图片虽然生成了,但url好像经常没有被项目返回。可能需要看看项目能不能二开一下修复这个问题才能爽嫖?使用纯banana api就不会有问题,成功率99.99%。实在没有纯api的话也可以用手动模式,在gemini-business一张一张翻译再复制回项目ww
gemini-business2api生图问题解决了,现在可以稳定生图,等我给这个项目提pr
更新:pr已经提交了,如果2api项目的佬友还没合并的话,你们可以参考我pr的内容改两句代码后直接运行。
圈出图片所在的台词时,不要圈太小了,尽量圈大点,比如这样:
除了文本框,还要多截一些周围的景色。
因为结果测试,如果不截一些景色的话,就会导致banan喜欢偷懒不嵌字,把日文原图发回来。
推荐提示词,可以自行修改:
0. 使用banana pro
1. 请用banana中文翻译替换掉图片里的日文。是的,生成一张只有中文的图!
3. 这句台词的大意是:[]
这是所有操作的前提,必须手动开启。
chrome://inspect/#remote-debuggingServer running at: 127.0.0.1:9222(这表示“门”已打开)。进入 AionUI 的 Settings(设置) → Tools Settings(工具设置)。
在 MCP Management 区域点击 Add MCP Service。
选择 Add via JSON,粘贴以下配置:
{ "mcpServers": { "chrome-devtools": { "command": "npx", "args": [ "-y", "chrome-devtools-mcp@latest", "--autoConnect", "--channel=stable" ] } } } 配置完成后,Gemini 并不会立刻接管浏览器,需要一次“握手”:
在 Gemini CLI 或 AionUI 中输入第一个指令,例如:截取当前网页的屏幕。
切换回 Chrome 浏览器:你会看到页面顶部弹出一个系统确认框,询问 “Allow incoming debugging connection?”。
点击 Allow(允许)。
浏览器顶部出现横幅(显示“正在受自动测试软件控制”),说明连接成功。
连接成功后,你可以直接用自然语言指挥 Gemini 处理你当前看到的网页:
“帮我截个图,分析一下现在的 UI 布局有没有错位?”“分析当前页面的性能,告诉我 LCP(最大内容绘制)是多少,怎么优化?”“检查当前页面的 Console 控制台,有没有报错?如果有,帮我解释原因。”“提取当前网页中所有商品的价格并列成表格。”“帮我点击页面上的‘提交’按钮。”(AI 会通过 DOM 树自动定位元素)推荐模型:Gemini 3 Flash、Gemini 3 Pro、GLM 4.7(英伟达无限免费 API)
使用案例:
我和同事们目前正在利用 OpenCode(Claude Code 的一个替代方案)进行一项小研究。目前我们刚开始测试 gpt-5-mini,看看它在编程辅助方面的性能能否与 Claude Sonnet 媲美。
也非常欢迎大家亲自尝试研究并分享心得,比如哪种 LLM 模型成功率最高,以及使用了什么样的 Prompt(提示词)。
注:我是来自印尼的用户,正在使用 Google Gemini 协助翻译论坛里的讨论。如果翻译有不准确的地方,还请大家多多包涵,手下留情。
很感谢一直支持我的朋友,虽然很久没发帖子,但是插件一直努力更新,今天有一些有意思的事情,于是想分享一下。
随时随地,随用随走是AI Anywhere的本心,智能体是必然的发展方向
前段时间更新了内置MCP,包括(utools发布版本为1.11.10,测试版为1.11.14):
很眼熟?因为照着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,让它帮我爬取炎拳漫画的某些章节等等)。
未来我们也能自定义更多便捷的智能体,不仅仅是代码方面,还有办公、开发、个人兴趣、学习……超级期待!
如果有好的创意欢迎分享,我很乐意尝试,如果对插件有建议也欢迎分享!
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
加入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自动付款就彻底移除了
几个月前佬 开发了一个给图片添加AI水印的,当时觉得很好玩,但是他把源码弄丢了,我想二开都没东西 。上个月又刷到帖子发现了AI Studio网页上有历史水印的素材,这我可不困了,开始库库搜集所有AI生成水印的素材。这两天不是opencode很火么,就用这个项目练手搓出来一个我认为可以交付的网页。
基本功能:
水印种类:
细节与亮点:
看起来很炫酷,但我们大部分的需求是去水印啊,这加水印有什么用呢?
有的兄弟,有的当你有一些图片不想被知道是自己拍的,就可以加个水印说是AI生成的
当然也可以叠水印杀人书
开源地址:GitHub - JasonWenTheFox/VibeMark
(喜欢的点个star吧!)
即开即用Demo:
已知需要优化的地方:
缺失Grok的两个版本的水印,缺少Adobe Firefly的水印,很遗憾,目前他们的渠道都没有水印,我没有黑底的水印图,无法制作。
感谢:【开源欢迎star】即梦海外版2api :Dreamina2API 以及:jimeng-api
晚上看到海外版注册机,然后看到有个 2api 是 py 版本,想着能不能重构下,直接部署到大善人那儿,于是让 AI 搓了一个出来,目前只有文生图,其他还没弄(熬不动了,溜去睡了)
项目地址:dreamina-api
感谢支持