MCP + PTC + Skills + Subagents
本文內容:
- MCP+PTC:會「連招」的 Agent 工具箱
- Skills:給 Agent 配備的「知識膠囊」
- Subagents:「分而治之」的 Agent 架構
- 聯繫、區別與協同
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
本文內容:
在现代企业和个人开发中,文档处理是不可或缺的一环。尤其是在报告演示、内容整合等场景下,PowerPoint 文件(PPT/PPTX)的自动化处理需求日益增长。当我们需要将多个演示文稿或其中的特定幻灯片合并时,手动操作不仅效率低下,而且容易出错。本文将深入探讨如何利用 Java 编程语言,结合强大的 Spire.Presentation for Java 库,实现 PowerPoiont 文件的合并,为开发者提供一套高效、灵活的解决方案。 Spire.Presentation for Java 是一个功能丰富的 Java API,专为创建、读取、编辑、转换和打印 PowerPoint 演示文稿而设计。它支持 PPT、PPTX、PPS、PPSX 等多种格式,无需安装 Microsoft Office,即可在 Java 应用程序中轻松处理幻灯片、文本、图片、表格、图表、多媒体等元素。其高性能和易用性使其成为 Java 处理 PowerPoint 的理想选择。 要使用 Spire.Presentation for Java,您可以通过 Maven 配置依赖。 Maven依赖配置: 您也可以直接从 Spire.Presentation for Java 官方网站下载 JAR 包,并手动添加到您的项目类路径中。 有时我们不需要合并整个演示文稿,而仅仅需要从一个或多个文件中提取特定的幻灯片,并将其插入到目标演示文稿中。Spire.Presentation 提供了灵活的 API 来实现这一需求。 以下代码示例演示了如何从两个源 PPTX 文件中提取指定幻灯片,并将其插入到一个新的演示文稿中。 代码解析: 将多个完整的 PowerPoint 文件按顺序合并成一个全新的演示文稿也是一个常见的需求,尤其是在演示文稿都是关于同一主题时。Spire.Presentation 同样提供了简洁高效的方法来实现这一目标。 下面的代码示例展示了如何将两个独立的 PPTX 文件合并成一个统一的演示文稿。 代码解析: 通过上述详细的 Java 代码示例,我们不难看出 Spire.Presentation for Java 在处理 PowerPoint 合并任务上的强大能力和便捷性。无论是精确到指定幻灯片的合并,还是将多个完整演示文稿整合,该库都能提供高效且稳定的解决方案。 这种基于 Java 的 PowerPoint 合并幻灯片编程开发技术教程极大地提升了 Java 在文档处理领域的实用性,为自动化报告生成、内容聚合等场景提供了坚实的技术支撑。掌握这些技能,开发者可以更灵活地应对各种文档处理挑战,优化工作流程,提高开发效率。未来,我们还可以进一步探索幻灯片内容的修改、格式调整乃至更复杂的自动化操作,让 Java 在 PowerPoint 技术教程 中发挥更大的作用。Spire.Presentation for Java 库简介与安装
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.presentation</artifactId>
<version>11.1.1</version>
</dependency>
</dependencies>合并来自外部文件的指定幻灯片
import com.spire.presentation.*;
public class MergeFiles1 {
public static void main(String[] args) throws Exception{
//加载文档1,获取第三张幻灯片
Presentation ppt1 = new Presentation();
ppt1.loadFromFile("test1.pptx");
ISlide slide = ppt1.getSlides().get(2);
//加载文档2,将文档1中获取的幻灯片作为第二张插入到文档2
Presentation ppt2 = new Presentation();
ppt2.loadFromFile("test2.pptx");
int index = 1;
ppt2.getSlides().insert(index,slide);
//保存文档2
ppt2.saveToFile("merge1.pptx",FileFormat.PPTX_2013);
ppt2.dispose();
}
}new Presentation():创建一个演示文稿对象,作为我们合并操作的容器。ppt1.loadFromFile():加载一个幻灯片文件作为源文档。ISlide slide = ppt1.getSlides().get(2):获取源文档上的某一页幻灯片。ppt2.loadFromFile():加载另一个 PowerPoint 文件作为目标文档。ppt2.getSlides().insert(index,slide):将源文档获取到幻灯片插入到目标文档中,index 就是插入的位置。ppt2.saveToFile():将合并后的演示文稿保存为新的 PPTX 文件。将多个 PowerPoint 文件合并为一个新的文件
import com.spire.presentation.*;
public class MergeFiles2 {
public static void main(String[] args)throws Exception {
//加载文档1,文档2
Presentation ppt1 = new Presentation();
ppt1.loadFromFile("test1.pptx");
Presentation ppt2 = new Presentation();
ppt2.loadFromFile("test2.pptx");
//遍历文档1的所有幻灯片,添加到文档2
for(int i = 0;i<ppt1.getSlides().getCount();i++){
ppt2.getSlides().append(ppt1.getSlides().get(i));
}
//保存文档2
ppt2.saveToFile("merge2.pptx",FileFormat.PPTX_2013);
ppt2.dispose();
}
}ppt2.getSlides().append(ppt1.getSlides().get():这是实现多个演示文稿合并的关键。append() 方法会将源文档中的所有幻灯片按原顺序复制到当前演示文稿的末尾。这个过程会自动处理幻灯片的主题、布局、内容等,确保合并后的演示文稿保持一致性和完整性。结语
从 11 月开始就在小上刷到各种个样的 GitHub/Gemini 之类的学生认证,GitHub 大部分都是手写材料过的,怕翻车把号炸了就一直没弄
然后这几天在写新的小玩具,全程都是用 GitHub 的 codespace 来弄的,写着写着突然就不给用了,额度用完了,代码都没来得及 commit
找了一圈都没找到白嫖 GitHub Pro 的(copilot 可以白嫖 30 天),开一个 PRO 是 4$/mo, 48$/year,感觉目前还没到直接开 Pro 的地步,在站里和小上看了几篇教程就开始弄了,下面是我的操作过程,仅供参考
背景:大学生,有国内的学生邮箱,用的学信网。
步骤:
chrome://settings/content/camera,把默认摄像头改成手机,刷新界面,重复上述 5–>6 的步骤,调整角度–> 拍照–提交–成功~附上 Approved 界面,估计还要等几天完全通过才能拿到学生权益,希望顺利捏
PS:如果关掉科学上网之后,访问 GitHub 很慢的话,可以从这个网站中找到 GitHub 的 IP 地址,加入到 hosts 里,就跟科学上网的速度差不多了~(不过有时效性捏)
【项目背景】 英语持续学习者一枚,平时高度依赖浏览器翻译。但在每天使用非浏览器应用比如每天早上看网易邮箱大师汇总的各种国外邮件时,叽里咕噜说了一大堆完全看不懂,只能手动复制去翻译,步骤繁琐。 市面上的大模型翻译软件虽然强大,但对于我这种只求 “快速看懂” 的场景来说,有点 “杀鸡用牛刀”。
【开发初衷】 既然刚升了 3 级,最近发现有有始皇提供的 DeepLX API Key 这个好东西,不想浪费,于是萌生了自己动手的想法。 既然是自用,主打一个超低占用、极简主义。不搞花里胡哨的功能,只解决核心痛点。
【技术栈】
【功能展示】
1. 单词翻译:响应迅速
2. 长短句翻译:准确流畅
3. 极简设置:填入 Key 即可用
4. 极致轻量:几乎不占内存
【致谢】 特别感谢 L 站 提供的优质资源,以及 wong 公益站、随时跑路公益站 提供的支持
1、单词翻译效果:
2、长短句翻译效果
3、设置
4、超低占用
最后:
再次感谢 L 站,以上有和我类似诉求的佬友试试看,由于我本身是做 python 和 C++ 的开发,这个项目使用的技术依赖 AI, 难免有没考虑到的,使用过程中可以随时反馈,对了由于我没有苹果电脑,使用苹果的佬友可以自行编译看看。
自己写的基于 Flutter 开发的跨平台音乐播放器,支持账号登录,从多个平台导入歌单。支持播放本地音乐,跨端续播。
支持平台:windows/android/ios/macos/linux,仅在 windows 与 android 进行了测试,因此其他平台可能存在部分 bug。
目前还处于测试阶段,欢迎大家体验测试,期待佬友们的建议与反馈。
应用需要导入自定义音源,支持 OmniParse,洛雪音源以及 Tunhub 音源 [分享] 自写了一个聚合音乐 API (TuneHub),统一网易 / 酷我 / QQ 接口,免费开放 - 开发调优 / 开发调优,Lv1 - LINUX DO
桌面端使用 fluent ui,移动端支持 material design 和 cupertino 两种风格
仓库地址:
moraxs/CyreneMusic: flutter 开发的第三方音乐播放器
点点 star
应用截图:
所以我做了 unique-ppt(微微幻灯片)—— 一个真正解决配图痛点的 AI PPT 生成器。
它能做什么
几个亮点
| 特性 | 说明 |
|---|---|
| 智能配图 | 每页内容 → 英文提示词 → AI 生成匹配图片 |
| 并发生成 | 5 张图同时生成,速度提升 3-5 倍 |
| 多种布局 | 封面、左右分割、磨砂玻璃、极简风 |
| 深色模式 | 护眼党福音 |
| 隐私安全 | API 密钥仅存浏览器本地 |
支持的 AI 服务
| 类型 | 服务 |
|---|---|
| 文本 | OpenAI (GPT-4) / Google Gemini |
| 图像 | DALL-E 3 / Gemini / Imagen |
| 自带 API 密钥即可使用,纯前端实现,无后端依赖。 |
GitHub: GitHub - uniqueww/unique-ppt
欢迎 Star 和 PR!
告别配图焦虑,让 AI 帮你搞定图文并茂的 PPT。
最近刚折腾了个自己的 INTEL 的 NUC 装了个 fnos,担心被运营商给控制了。因此找了找解决方案,有个 VSTAT 可以监控网络流量,自己加了个 web 界面和上传流量大于下载流量时直接访问 Cloudflare 下载 然后丢到 /dev/null 这样不会占用磁盘。
这是一个轻量级的 NAS 网络流量监控与平衡解决方案。它结合了 vnstat 、Python Web 服务和自动挂机脚本,旨在帮助 NAS 用户实时监控网络流量,并自动维护上传 / 下载比例(适用于 PCDN 或 PT 场景)。
balancer.sh):/api/stats 接口,直接返回 vnstat 的 JSON 数据,方便二次开发或集成到 Homepage/Dashy 等仪表盘。vnstat 的流量统计图(PNG 格式),方便快速预览。【开源推荐】DeepTutor:港大数据智能实验室出品的 AI 学习助手。
GitHub:https://github.com/HKUDS/DeepTutor
逻辑很强:
投喂:上传你的教材 / 论文 / 文档。
交互:它基于这些资料进行深度辅导。
可视化:能生成图表甚至动画来解释复杂概念(这点很强)。
看论文、备考、学新东西的神器。
免费白嫖 2-5 年 Copilot(Microsoft365),可用 GPT-5.2
昨天看到论坛又有新的微软大毛,参考教程,过程发现一些问题,仅供参考。
1. 很抱歉,您不符合此优惠方案资格。试了两个号,点第 1 个链接成功,获得 1 年优惠,点第 2 个链接不成功,无法叠加。解决方案:换个账号重新登录;清除缓存重试;直接换个浏览器重试。
2. 很抱歉,发生错误。也是第 2 个链接常见问题,解决方案:等待几分钟,重新打开。
3. 教育邮箱问题。有的 edu.kg 邮箱提示不支持、有的 edu.cn 收不到邮件。解决方案:找找垃圾邮箱里面,或者换个邮箱。邮箱可找海鲜市场,或者论坛搜索美国大学教育邮箱。
4. 地区和支付问题。目前美区可叠加最高 5 年优惠,最佳搭配 Google pay 支付,可绑定国内 visa 卡,亲测国内 visa 卡和 N26 可支付;港区支持支付宝付款,但是多为 2 年优惠。
【开源新王】GLM-4.7-Flash (30B-A3B MoE) 上线
在 30B 这个 “黄金尺寸” 上,智谱交出了一份离谱的答卷。直接对标 Qwen3-30B-A3B,但在关键指标上实现了反超:
工程化落地强:SWE-bench 59.2 分。这意味着它不仅是写代码片段,而是真能处理复杂的工程 Issue。
逻辑推演:AIME 25 跑到 91.6,数学和复杂逻辑不再是小模型的短板。
长文本 & Agent:在 τ²-Bench 和 BrowseComp 表现优异,依然是构建 Agent 的一把好手。
总结:如果你在寻找一个既能跑得动、又具备顶尖逻辑 / 代码能力的本地模型,这是目前的首选。
下载地址:https://huggingface.co/zai-org/GLM-4.7-Flash
感觉 surge 还是好用呀。
[General]
loglevel = notify
# 从 Surge iOS 4 / Surge Mac 3.3.0 起,工具开始支持 DoH
dns-server = 223.5.5.5, 119.29.29.29, 223.6.6.6, 180.76.76.76, 114.114.115.115, 114.114.114.114, 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1, 208.67.222.222, 208.67.220.220, system
# https://dns.alidns.com/dns-query, https://13800000000.rubyfish.cn/, https://doh.360.cn/dns-query, https://dns.google/dns-query
skip-proxy = 192.178.0.0/16,127.0.0.1, 192.168.0.0/16,192.18.0.0/16, 198.18.0.1,198.18.0.0/16,10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10,192.168.65.0/24, localhost, *.local,passenger.t3go.cn, sequoia.apple.com, seed-sequoia.siri.apple.com
wifi-assist = false
wifi-access-http-port = 6152
wifi-access-socks5-port = 6153
http-api-web-dashboard = true
replica = 0
tls-provider = default
network-framework = false
exclude-simple-hostnames = true
ipv6 = true
test-timeout = 2
proxy-test-url = http://cp.cloudflare.com/generate_204
geoip-maxmind-url = https://cdn.jsdelivr.net/gh/Hackl0us/GeoIP2-CN@release/Country.mmdb
use-local-host-item-for-proxy = true
show-error-page-for-reject = true
# 高级设置
# > 日志级别
# > 当遇到 REJECT 策略时返回错误页
always-real-ip = msftconnecttest.com, msftncsi.com, *.msftconnecttest.com, *.msftncsi.com, *.srv.nintendo.net, *.stun.playstation.net, xbox.*.microsoft.com, *.xboxlive.com, *.battlenet.com.cn, *.battlenet.com, *.blzstatic.cn, *.battle.net
# > Always Real IP Hosts
force-http-engine-hosts = *.ott.cibntv.net, 123.59.31.1,119.18.193.135, 122.14.246.33, 175.102.178.52, 116.253.24.*, 175.6.26.*, 220.169.153.*
# > TCP Force HTTP Hosts
# KOOWO - 123.59.31.1,119.18.193.135, 122.14.246.33, 175.102.178.52
# TencentVideo - 116.253.24.*, 175.6.26.*, 220.169.153.*
tun-excluded-routes = 239.255.255.250/32
# > VIF Excluded Routes
allow-wifi-access = false
http-api-tls = false
encrypted-dns-server = https://doh.pub/dns-query, https://dns.alidns.com/dns-query
http-listen = 0.0.0.0
socks5-listen = 0.0.0.0
[Proxy]
Direct = direct, allow-other-interface=true
Reject = reject
WARP = wireguard, section-name=Cloudflare, test-url=http://cp.cloudflare.com/generate_204
#这个场景是在公司办公的时候: 1、公司网络有两种,WiFi只有外网,外网网速快,网线有外网和公网。配置了这个策略,内网走网线,外网走WiFi,具体的接口自己找一下即可。
公司网络 = direct, interface=en7, allow-other-interface=true
VMess_WS =
trojan_tcp_Trojan =
dmit-torjan =
公司vpn = direct, interface=ppp0, allow-other-interface=true, dns-follow-interface=true #有远程办公的需求,mac我们公司vpn 比较老,必须要加路由才行,配置了这个就不用加路由了。连接即用 surge 下面进行分流
家宽 = 家宽的信息, underlying-proxy=机场 #(配置机场做了链式代理)
[Proxy Group]
#节点信息我做了删除,补充自己的进来。注意,名称如果错误记得调整下。
Proxy = select, 机场, VMess_WS, trojan_tcp_Trojan, dmit-torjan, 家宽, include-all-proxies=0
🛡Guard = select, Reject, Direct
机场 = select,
[Rule]
DOMAIN-SUFFIX,linux.do,trojan_tcp_Trojan,extended-matching
IP-CIDR,69.63.208.186,DIRECT,no-resolve
IP-CIDR,148.135.32.199,DIRECT,no-resolve
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/ChinaMedia/ChinaMedia.list,DIRECT,"update-interval=7200"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/GlobalMedia/GlobalMedia_All_No_Resolve.list,Proxy,"update-interval=7200"
# RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/ChinaMax/ChinaMax_All.list,DIRECT,"update-interval=7200"
RULE-SET,https://github.com/blackmatrix7/ios_rule_script/tree/master/rule/Surge/Gemini,家宽,"update-interval=7200"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/115/115.list,DIRECT,"update-interval=7200"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/OpenAI/OpenAI.list,家宽,extended-matching,"update-interval=7200"
DOMAIN-SUFFIX,navicat.com.cn,Reject
DOMAIN-SUFFIX,navicat.com,Reject
RULE-SET,https://raw.githubusercontent.com/limbopro/Adblock4limbo/main/Adblock4limbo_surge.list,Reject,"update-interval=3600"
#谷歌的走家宽,家宽用机场链式代理。
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/Google/Google.list,家宽,extended-matching,"update-interval=3600"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/GoogleDrive/GoogleDrive.list,家宽,extended-matching,"update-interval=3600"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/GoogleEarth/GoogleEarth.list,家宽,extended-matching,"update-interval=3600"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/GoogleFCM/GoogleFCM.list,家宽,extended-matching,"update-interval=3600"
RULE-SET,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/GoogleSearch/GoogleSearch.list,家宽,extended-matching,"update-interval=3600"
DOMAIN,juejin.cn,DIRECT
DOMAIN,copilot-telemetry-service.copilot.supercopilot.top,DIRECT,extended-matching
DOMAIN,copilot-proxy.copilot.supercopilot.top,DIRECT,extended-matching
DOMAIN,api.copilot.supercopilot.top,DIRECT,extended-matching
DOMAIN,copilot.supercopilot.top,DIRECT,extended-matching
# Non IP
RULE-SET,https://ruleset.skk.moe/List/non_ip/reject-no-drop.conf,REJECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/reject.conf,REJECT,extended-matching
RULE-SET,https://ruleset.skk.moe/List/non_ip/reject-drop.conf,REJECT
RULE-SET,https://ruleset.skk.moe/List/ip/reject.conf,REJECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/reject-url-regex.conf,REJECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/sogouinput.conf,REJECT
GEOIP,CN,DIRECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/lan.conf,DIRECT
# IP
RULE-SET,https://ruleset.skk.moe/List/ip/lan.conf,DIRECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/apple_cn.conf,DIRECT
# Non IP
# 基础的 12 万拦截域名
# URL-REGEX
# 额外 20 万拦截域名,作为基础的补充,启用时需要搭配基础一起使用
# 在 Surge 5 for Mac(或更新版本),即使同时启用基础和额外的拦截域名也不会导致匹配性能下降或内存占用过高
# 需搭配 Surge 模块 https://ruleset.skk.moe/Modules/sukka_mitm_hostnames.sgmodule 使用
# MITM 和 URL-REGEX 性能开销极大,不推荐使用
# IP
DOMAIN-SET,https://ruleset.skk.moe/List/domainset/speedtest.conf,Proxy,extended-matching
DOMAIN-SET,https://ruleset.skk.moe/List/domainset/cdn.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/non_ip/cdn.conf,Proxy
# 北美相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_us.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_us.conf,Proxy
# 欧洲相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_eu.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_eu.conf,Proxy
# 日本相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_jp.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_jp.conf,Proxy
# 韩国相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_kr.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_kr.conf,Proxy
# 香港相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_hk.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_hk.conf,Proxy
# 台湾相关流媒体
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream_tw.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream_tw.conf,Proxy
# 所有流媒体(包括上述所有流媒体)
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/stream.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/non_ip/ai.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/non_ip/telegram.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/telegram.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/telegram_asn.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/non_ip/microsoft_cdn.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/non_ip/microsoft.conf,Proxy
RULE-SET,https://ruleset.skk.moe/List/ip/china_ip.conf,DIRECT
# Only use it if you are using IPv6
RULE-SET,https://ruleset.skk.moe/List/ip/china_ip_ipv6.conf,DIRECT
RULE-SET,https://raw.githubusercontent.com/limbopro/Adblock4limbo/main/Adblock4limbo_surge.list,REJECT,"update-interval=3600"
# MacWk.com Start
# DaisyDisk
DOMAIN,daisydiskapp.com,REJECT
# Viscosity
DOMAIN,sparklabs.com,REJECT
DOMAIN,swupdate.sparklabs.com,REJECT
DOMAIN,www.sparklabs.com,REJECT
# Sidify Music Converter
DOMAIN,www.sidify.com,REJECT
DOMAIN,sidify.com,REJECT
# Sublime Text
DOMAIN,www.sublimetext.com,REJECT
DOMAIN,sublimetext.com,REJECT
DOMAIN,license.sublimehq.com,REJECT
# MacWk.com End
AND,((PROTOCOL,UDP), (DEST-PORT,443)),REJECT-NO-DROP
PROCESS-NAME,v2ray,DIRECT
PROCESS-NAME,clash,DIRECT
PROCESS-NAME,ss-local,DIRECT
PROCESS-NAME,privoxy,DIRECT
PROCESS-NAME,trojan,DIRECT
PROCESS-NAME,trojan-go,DIRECT
PROCESS-NAME,naive,DIRECT
PROCESS-NAME,fdm,DIRECT
PROCESS-NAME,Thunder,DIRECT
PROCESS-NAME,Folx,DIRECT
PROCESS-NAME,DownloadService,DIRECT
PROCESS-NAME,qBittorrent,DIRECT
PROCESS-NAME,Transmission,DIRECT
PROCESS-NAME,fdm,DIRECT
PROCESS-NAME,aria2c,DIRECT
PROCESS-NAME,Folx,DIRECT
PROCESS-NAME,NetTransport,DIRECT
PROCESS-NAME,uTorrent,DIRECT
PROCESS-NAME,WebTorrent,DIRECT
PROCESS-NAME,"WebTorrent Helper",DIRECT
# Local Area Network 局域网
RULE-SET,LAN,DIRECT
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/private.txt,DIRECT
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/reject.txt,REJECT
RULE-SET,SYSTEM,DIRECT
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/tld-not-cn.txt,Proxy
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/gfw.txt,Proxy
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/greatfire.txt,Proxy
RULE-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/telegramcidr.txt,Proxy
# 实用规则片段集
# RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-News.list,Proxy
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-proxy.list,Proxy
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-direct.list,DIRECT
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/CN.list,DIRECT
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/common-ad-keyword.list,REJECT
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/foreign.list,Proxy
RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/App/social/Telegram.list,Proxy
RULE-SET,LAN,DIRECT
# 最终规则
FINAL,Proxy,dns-failed
[Host]
[URL Rewrite]
^https?://(www.)?(g|google).cn https://www.google.com 302
[MITM]
skip-server-cert-verify = true
tcp-connection = true
其中节点自己换一换就可以用了。不行找 ai 跑一下自己的节点信息替换进去。
欢迎大家指正补充分流策略。
链式代理配置,其他如果自建的节点也可以按此方式配置:
最近折腾 Nexus,发现默认部署的最新版本首页有组件数量限制的展示,之前一直没有留意,经过一番了解之后,发现 Nexus 社区版的权益,也在进一步收紧,如果公司打算部署一个 Nexus,做好版本选择就非常关键。
Nexus 的组件限制,大致有如下几个版本节点:
3.66.0 版本中增加了组件和请求数等相关监测指标。3.76.1 版本,监测功能正常工作,当组件达到 10w 个会有建议提醒,但不会限制使用。3.77.0 版本开始,组件数 10w ,日请求 20w 规则正式生效,当某个指标达到上限之后,会进入 30 天 宽限期,宽限期内读写正常,如果指标降低到上限以内,到期后正常使用,否则将会无法写入。3.87.0 版本开始,组件数上限降为 4w ,日请求数降为 10w 。版本详细介绍,以及上限验证结果,详见博文: https://wiki.eryajf.net/pages/b6b711/
除了记录了对应版本,我还针对历史镜像做了归档,有需要的同学可以自取。
CLI Proxy API 的核动力驴一天 3 个小版本,每天打开电脑都是打开 render 更新部署。
于是搓了这样一个用 Deno Deploy 的 cron 触发 Render deploy hook 的小工具
每天凌晨 4 点自动更新 render 部署的 cpa(你也可以用来更新其他 render 项目)
去这里复制一下 Deploy Hook 就好了,改一下代码里面占位的 RENDER_HOOK_URL
非常简单的小工具
/**
* Project: render-auto-deploy (sanitized, hardcoded URL version)
* Purpose: 用 Deno Deploy Cron 定时触发 Render Deploy Hook(自动 redeploy)
*
* ✅ 你需要改的地方(部署时只改这两处):
* 1) 把 RENDER_HOOK_URL 改成你自己的 Render Deploy Hook URL(包含 service id + key)
* 2) 如果想换时间,把 CRON_SCHEDULE 改成你要的 cron(注意:Deno.cron 用 UTC)
*
* ✅ 验证方法:
* - 打开 "/":看到 running + 当前 UTC 时间 + schedule
* - 打开 "/trigger":立刻触发一次 Render 部署(返回 deploy.id)
* - 去 Render Events:会出现 “Triggered via Deploy Hook”
*
* 🔥 时区提醒:
* - Deno.cron 的 cron 表达式按 UTC 解释
* - 例:UTC 20:00 = 北京时间次日 04:00
*/
// ======================【部署时改这里 1】======================
// Render Deploy Hook(占位符,换成你自己的)
// 形如:https://api.render.com/deploy/<YOUR_SERVICE_ID>?key=<YOUR_DEPLOY_KEY>
const RENDER_HOOK_URL =
"https://api.render.com/deploy/<YOUR_SERVICE_ID>?key=<YOUR_DEPLOY_KEY>";
// ======================【部署时改这里 2】======================
// Cron 表达式按 UTC 解释:
// - "0 20 * * *" => 每天 UTC 20:00(北京时间次日 04:00)
// - 测试用: "*/1 * * * *" => 每分钟触发一次(用来验证 cron 是否生效)
const CRON_SCHEDULE = "0 20 * * *";
function nowIso() {
return new Date().toISOString();
}
async function triggerRenderDeploy(source: "cron" | "http") {
const runId = crypto.randomUUID();
console.log(`[${nowIso()}] [${source}] runId=${runId} ⏰ trigger start`);
// 超时:避免网络卡住导致任务悬挂
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30_000);
try {
const resp = await fetch(RENDER_HOOK_URL, {
method: "POST", // Render deploy hook 通常 GET/POST 都可,这里用 POST
signal: controller.signal,
headers: { "user-agent": "render-auto-deploy/deno" },
});
const text = await resp.text().catch(() => "");
if (!resp.ok) {
// 抛错 => 让 cron 的 backoffSchedule 生效,自动重试
throw new Error(
`Render hook failed: ${resp.status} ${resp.statusText} body=${text.slice(0, 500)}`,
);
}
console.log(
`[${nowIso()}] [${source}] runId=${runId} ✅ trigger ok body=${text.slice(0, 500)}`,
);
return { ok: true, runId, status: resp.status, body: text };
} finally {
clearTimeout(timeout);
}
}
// ====== 定时任务(必须在模块顶层定义,Deno Deploy 才会识别为 Cron)======
Deno.cron(
"Daily Render Auto Deploy",
CRON_SCHEDULE,
// 失败重试节奏(毫秒):1s, 5s, 10s
{ backoffSchedule: [1000, 5000, 10000] },
async () => {
try {
await triggerRenderDeploy("cron");
} catch (e) {
console.error(`[${nowIso()}] [cron] ❌`, e);
throw e; // 继续抛出以触发重试
}
},
);
// ====== Web:健康检查 + 手动触发(方便部署后立即验证)======
Deno.serve(async (req) => {
const url = new URL(req.url);
// 健康检查:确认服务活着
if (url.pathname === "/") {
return new Response(
`Auto-Deploy is running.\nUTC now: ${nowIso()}\nSchedule(UTC): ${CRON_SCHEDULE}\n`,
{ headers: { "content-type": "text/plain; charset=utf-8" } },
);
}
// 手动触发:GET /trigger
// 部署完立刻访问一次,看返回里有没有 deploy.id
if (url.pathname === "/trigger") {
try {
const result = await triggerRenderDeploy("http");
return new Response(JSON.stringify(result, null, 2), {
headers: { "content-type": "application/json; charset=utf-8" },
});
} catch (e) {
const msg = e instanceof Error ? e.message : String(e);
return new Response(JSON.stringify({ ok: false, error: msg }, null, 2), {
status: 500,
headers: { "content-type": "application/json; charset=utf-8" },
});
}
}
return new Response("Not found", { status: 404 });
});
刚好最近在研究 RSS 订阅各种信息源,整理了一份清单分享给大家。
包含两部分:
项目地址:GitHub - JackyST0/awesome-rsshub-routes: 🎯 精选 RSSHub 实用路由推荐,让你的 RSS 阅读更高效!
RSSHub 官方仓库:GitHub - DIYgod/RSSHub: 🧡 Everything is RSSible
RSSHub 官方文档:https://docs.rsshub.app
欢迎 Star 和补充更多实用订阅源!
大家好,我是良许。 最近在做一个电源管理的项目,需要用到 MOS 管来控制大电流的开关。 很多刚入门的朋友可能对 MOS 管不太了解,今天我就来详细聊聊这个在电子电路中非常重要的元器件。 MOS 管的全称是 Metal-Oxide-Semiconductor Field-Effect Transistor,中文叫做金属-氧化物-半导体场效应晶体管,简称 MOSFET 或者 MOS 管。 从名字就能看出来,它主要由三种材料构成:金属栅极、氧化物绝缘层和半导体衬底。 MOS 管有三个引脚,分别是栅极(Gate,简称 G)、漏极(Drain,简称 D)和源极(Source,简称 S)。 这三个引脚的作用各不相同:栅极用来控制开关,漏极和源极之间形成导电通道。 当我们在栅极施加一定的电压时,就可以控制漏极和源极之间是否导通,这就是 MOS 管最核心的工作原理。 MOS 管主要分为两大类:N 沟道 MOS 管(NMOS)和 P 沟道 MOS 管(PMOS)。 这两种管子的工作原理类似,但是导通条件相反。 对于 NMOS 管来说,当栅极电压高于源极电压一定程度(超过阈值电压)时,漏极和源极之间就会导通。 而 PMOS 管则相反,当栅极电压低于源极电压一定程度时才会导通。 在实际应用中,NMOS 管使用得更多一些,因为它的导通电阻更小,开关速度更快。 此外,根据工作模式的不同,MOS 管还可以分为增强型和耗尽型。 增强型 MOS 管在栅极没有电压时是截止的,需要施加电压才能导通,这是最常用的类型。 耗尽型 MOS 管则相反,在栅极没有电压时就是导通的,需要施加反向电压才能截止,这种类型比较少见。 MOS 管之所以叫做场效应晶体管,是因为它是通过电场来控制电流的。 当我们在栅极施加电压时,会在氧化层下方的半导体表面产生一个电场。 这个电场会吸引或排斥半导体中的载流子(电子或空穴),从而在漏极和源极之间形成或消除导电沟道。 以 NMOS 管为例,当栅极电压为 0V 时,漏极和源极之间是 P 型半导体,不导电。 当栅极施加正电压时,电场会把 P 型半导体表面的空穴排斥走,同时吸引电子过来。 当电子浓度足够高时,就会在表面形成一个 N 型导电沟道,这时漏极和源极之间就导通了。 MOS 管在工作时有三个主要区域:截止区、线性区(也叫欧姆区)和饱和区。 在截止区时,栅极电压小于阈值电压,漏极和源极之间不导通,相当于一个开关断开的状态。 这时 MOS 管的漏极电流几乎为零,只有很小的漏电流。 在线性区时,栅极电压大于阈值电压,且漏极电压较小,此时漏极电流与漏源电压成正比关系,MOS 管表现得像一个可变电阻。 在这个区域,我们可以通过改变栅极电压来调节导通电阻的大小。 在饱和区时,栅极电压大于阈值电压,且漏极电压较大,此时漏极电流基本不随漏源电压变化,而是由栅极电压决定。这个区域主要用于放大电路。 阈值电压($$V\_{th}$$)是 MOS 管的一个重要参数,它决定了 MOS 管从截止到导通需要多大的栅极电压。 对于 NMOS 管,阈值电压通常在 1V 到 4V 之间,对于 PMOS 管则是负值。 在实际应用中,我们需要确保栅极电压足够大,通常要比阈值电压高出几伏,这样才能保证 MOS 管完全导通,降低导通电阻。 在嵌入式系统中,MOS 管最常见的应用就是做开关。 比如我们要用单片机控制一个 12V 的电机,单片机的 IO 口只能输出 3.3V 或 5V 的电压,而且驱动能力很弱,这时就需要用 MOS 管来做开关。 下面是一个使用 STM32 控制 NMOS 管的简单例子: 在这个例子中,当我们调用 调用 MOS 管还可以配合 PWM 信号来实现电机调速。 通过改变 PWM 信号的占空比,可以控制电机的平均功率,从而实现调速。 这段代码配置了一个 1kHz 的 PWM 信号,通过调用 当占空比为 50% 时,电机获得的平均功率是满功率的一半,速度也大约是最高速度的一半。 在嵌入式系统的电源管理中,MOS 管也扮演着重要角色。 比如在低功耗设计中,我们可以用 PMOS 管来控制某些模块的电源开关,在不需要时完全切断电源,达到最低功耗。 这种设计在电池供电的设备中特别有用,可以显著延长电池寿命。 MOS 管的栅极虽然不需要电流,但是有一定的电容(栅极电容),在开关过程中需要对这个电容充放电。 如果驱动能力不足,会导致开关速度变慢,甚至无法完全导通。 对于大功率 MOS 管,栅极电容可能达到几千皮法,这时就需要专门的驱动电路。 在实际应用中,如果发现 MOS 管发热严重,很可能是因为没有完全导通,工作在线性区,导通电阻很大。 这时需要检查栅极电压是否足够高,是否超过了阈值电压加上足够的余量。 MOS 管的栅极氧化层非常薄,只有几十到几百纳米,很容易被静电击穿。 在焊接和使用 MOS 管时,一定要做好静电防护措施。 建议使用防静电手环,焊接前先触摸接地的金属物体释放身上的静电。 存储 MOS 管时,最好把三个引脚短接在一起,或者插在导电泡棉上。 虽然 MOS 管的导通电阻很小,但在大电流应用中仍然会产生一定的热量。 功耗可以用公式$$P = I^2 \times R{DS(on)}$$ 来计算,其中$$I$$ 是通过的电流,$$R{DS(on)}$$ 是导通电阻。 如果功耗超过 1W,就需要考虑加散热片了。 在 PCB 设计时,可以通过增大铜箔面积来帮助散热。 对于 TO-220 封装的 MOS 管,可以直接把散热片焊接在 PCB 上。 对于贴片封装的 MOS 管,可以在背面铺大面积的铜箔,并通过过孔连接到顶层的散热焊盘。 在驱动感性负载(如电机、继电器、电磁阀)时,一定要并联续流二极管。 因为感性负载在断电瞬间会产生很高的反向电压,可能会击穿 MOS 管。续流二极管可以为这个反向电流提供一个回路,保护 MOS 管不被损坏。 这段代码实现了电机的软启动和软停止,可以减小启动和停止时的电流冲击,延长 MOS 管和电机的寿命。 MOS 管是嵌入式系统中非常重要的元器件,它可以用很小的控制功率来控制很大的负载功率,是实现各种开关、调速、电源管理功能的基础。 理解 MOS 管的工作原理和使用方法,对于做好硬件设计和驱动开发都非常重要。 在实际应用中,选择合适的 MOS 管需要考虑多个参数:导通电阻、最大电流、最大电压、开关速度、封装形式等。 一般来说,导通电阻越小越好,但价格也会越贵。 最大电流和电压要留有足够的余量,通常选择实际值的 2 倍以上。 对于高速开关应用,还要注意栅极电荷和开关时间等参数。 掌握了 MOS 管的使用,你就可以设计出更加强大和灵活的嵌入式系统了。 希望这篇文章能帮助大家更好地理解和使用 MOS 管。什么是 MOS 管?
1. MOS 管的基本概念
1.1 MOS 管的全称与结构
1.2 MOS 管的分类
2. MOS 管的工作原理
2.1 电场效应控制
2.2 三个工作区域
2.3 阈值电压的重要性
3. MOS 管在嵌入式系统中的应用
3.1 开关电路
// 初始化GPIO用于控制MOS管
void MOS_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始状态设为低电平,MOS管截止
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}
// 打开MOS管
void MOS_Turn_On(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
// 关闭MOS管
void MOS_Turn_Off(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}MOS_Turn_On() 函数时,PA5 输出高电平,NMOS 管的栅极得到高电压,MOS 管导通,负载(比如电机)就会工作。MOS_Turn_Off() 函数时,PA5 输出低电平,MOS 管截止,负载停止工作。3.2 PWM 调速电路
// PWM初始化用于MOS管调速
void MOS_PWM_Init(void)
{
TIM_HandleTypeDef htim2;
TIM_OC_InitTypeDef sConfigOC = {0};
// 使能TIM2时钟
__HAL_RCC_TIM2_CLK_ENABLE();
// 配置定时器基本参数
htim2.Instance = TIM2;
htim2.Init.Prescaler = 84 - 1; // 假设系统时钟84MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000 - 1; // PWM频率约为1kHz
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim2);
// 配置PWM通道
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始占空比为0
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
// 启动PWM输出
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
// 设置PWM占空比(0-100)
void MOS_Set_Speed(uint8_t speed)
{
if(speed > 100) speed = 100;
// 计算对应的CCR值
uint16_t pulse = (1000 * speed) / 100;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse);
}MOS_Set_Speed() 函数并传入 0 到 100 的值,就可以控制电机的速度。3.3 电源管理电路
// 电源管理初始化
void Power_Management_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
// 配置PB0控制PMOS管(低电平导通)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉,默认高电平
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始状态关闭电源
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
// 打开外设电源
void Peripheral_Power_On(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // PMOS导通
HAL_Delay(10); // 等待电源稳定
}
// 关闭外设电源
void Peripheral_Power_Off(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // PMOS截止
}4. 使用 MOS 管的注意事项
4.1 栅极驱动问题
4.2 静电防护
4.3 散热设计
4.4 续流二极管
// 带续流保护的电机控制
void Motor_Control_With_Protection(uint8_t enable)
{
if(enable)
{
// 启动电机前先确保PWM占空比为0
MOS_Set_Speed(0);
HAL_Delay(1);
// 打开MOS管
MOS_Turn_On();
// 逐渐增加速度,避免启动电流过大
for(uint8_t i = 0; i <= 50; i++)
{
MOS_Set_Speed(i);
HAL_Delay(10);
}
}
else
{
// 逐渐降低速度
for(uint8_t i = 50; i > 0; i--)
{
MOS_Set_Speed(i);
HAL_Delay(10);
}
// 关闭MOS管
MOS_Turn_Off();
}
}5. 总结
公司收购 Langfuse,正式进军 LLM 可观测性 (LLM observability) 领域,并推出原生 Postgres 服务,以统一事务型与分析型工作负载。 旧金山 — 2026 年 1 月 16 日 — 实时分析、数据仓库、可观测性 (observability) 以及 AI/ML 领域的领导者 ClickHouse 今日宣布完成 D 轮融资,融资金额达 4 亿美元。本轮由 Dragoneer Investment Group 领投,Bessemer Venture Partners、GIC、Index Ventures、Khosla Ventures、Lightspeed Venture Partners、T. Rowe Price Associates, Inc. 管理的账户,以及 WCM Investment Management 共同参与。 此次融资正值 ClickHouse 持续且加速增长之际。目前,公司通过全托管服务 ClickHouse Cloud 已服务超过 3,000 家客户,年度经常性收入 (ARR) 同比增长超过 250%。在过去三个月中,Capital One、Lovable、Decagon、Polymarket 和 Airwallex 等客户开始采用该平台或扩大了现有部署。这些新客户加入了 ClickHouse 已建立的客户群体,其中包括 Meta、Cursor、Sony 和 Tesla 等 AI 创新者及全球知名品牌。 “ClickHouse 的初衷就是为最严苛的数据工作负载提供卓越的性能和成本效率,而今天的增长势头正是这一战略的最好证明,”ClickHouse 首席执行官 Aaron Katz 表示。“面向未来,我们正在支持统一的事务型与分析型工作负载,让开发者能够在坚实的技术基础之上构建各种由 AI 驱动的应用。同时,我们也在拓展产品能力,引入 LLM 可观测性,帮助 AI 应用构建者在进入生产阶段时,更好地评估 AI 输出的质量和行为。新的资金支持,加上持续的产品执行力,使我们有能力在 AI 时代打造领先的数据与 LLM 可观测性平台。” Dragoneer 成立于 2012 年,由 Marc Stad 创立,采用高度精选、以研究为核心的方法,专注于与少数具有品类定义意义的公司建立长期合作关系。过去十年中,该公司投资了多家领先的数据平台以及多家基础性的 AI 公司。 随着 AI 系统逐步从实验走向生产,对底层数据基础设施提出了更高要求。AI 驱动的应用会产生远高于以往的查询量,对延迟更加敏感,同时还需要持续的评估能力和可观测性。在这样的背景下,真正的价值正越来越集中到那些能够支撑大规模、数据密集型生产工作负载的基础设施平台之上。 “每一次重大的平台变革,最终都会回馈那些最贴近生产环境的基础设施公司,”Dragoneer Investment Group 合伙人 Christian Jensen 表示。“当模型能力不断提升,真正的瓶颈就转移到了数据基础设施上。ClickHouse 的突出之处在于,它能够在大规模 AI 系统运行时,提供所必需的性能、效率和可靠性。” 在严谨的评估过程中,Dragoneer 认为 ClickHouse 已成为现代数据技术栈中具有品类定义意义的领导者。该平台广泛支持关键任务级的实时工作负载,深度嵌入于始终在线、面向客户以及 AI 驱动的系统之中。 ClickHouse 的增长不仅来自对现有系统的替代,更来自对全新工作负载的支持。通过在大规模场景下实现高性价比的实时分析,ClickHouse 让许多过去因延迟或成本受限而无法落地的应用场景成为可能。与主要服务内部分析团队的许多数据基础设施平台不同,ClickHouse 经常直接嵌入到面向终端用户的产品中,在这些场景下,性能和可靠性会直接影响用户体验。 “我们寻找的是在系统绝不能停机时依然值得客户信赖的平台,而 ClickHouse 一直展现出这样的能力,”Jensen 补充道。 ClickHouse 正式宣布收购开源 LLM 可观测性平台 Langfuse。与关注系统健康和性能指标的传统可观测性不同,LLM 可观测性关注的是如何确保非确定性、日益复杂的 AI 系统能够输出准确、安全且符合用户意图的结果。随着 AI 系统不断深入生产工作流,LLM 可观测性已成为构建和运营 AI 应用团队不可或缺的一环。 Langfuse 开源项目增长迅速,截至 2025 年底,已获得超过 2 万个 GitHub Star,每月 SDK 安装量超过 2,600 万次。 “我们之所以在 ClickHouse 之上构建 Langfuse,是因为 LLM 可观测性和评估本质上就是一个数据问题,”Langfuse 首席执行官 Marc Klingen 表示。“如今作为一个团队,我们能够提供更加紧密的一体化体验:更快的数据摄取、更深入的评估能力,以及从生产问题到可量化改进之间更短的闭环。” Langfuse 联合创始人 Clemens Rawert、Marc Klingen、Max Deichmann ClickHouse 同时宣布推出一个与自身平台深度集成的企业级 Postgres 服务。为了支撑既需要事务处理又需要分析能力的现代实时 AI 应用,ClickHouse 打造了一套统一的数据技术栈,其中包括由 NVMe 存储支撑、具备原生 CDC 能力的高性能可扩展 Postgres。用户只需几次点击,就能将事务数据同步至 ClickHouse,从而解锁最高可达 100 倍的分析性能提升。借助由原生 Postgres 扩展提供支持的统一查询层,开发者可以构建横跨事务与分析的应用,而无需维护多个独立系统。该服务由 ClickHouse 与开源云公司 Ubicloud 联合打造,Ubicloud 团队在 Citus Data、Heroku 和 Microsoft 拥有丰富的产品与工程经验。 “Postgres 与 ClickHouse 在架构上天然互补,是 AI 应用不可或缺的组成部分。通过合作,我们为团队交付了一套真正的一体化技术栈,让生产级 Postgres 负责事务处理,让 ClickHouse 专注分析,并作为一个整体协同运行,”Ubicloud 联合首席执行官兼联合创始人 Umur Cubukcu 表示。“我们非常高兴能在 Ubicloud 与 ClickHouse 携手合作,这正是开源生态系统成功的方式:由值得信赖的团队打造一流产品,并共同成长。” Ubicloud 联合创始人 Umur、Ozgun 和 Daniel 在完成融资并收购 Langfuse 的同时,ClickHouse 也在持续扩展其全球布局和生态体系。过去一年中,公司通过与 Japan Cloud 的合作进入日本市场,并宣布与 Microsoft Azure 围绕 OneLake 建立合作关系。ClickHouse 还在旧金山、纽约、阿姆斯特丹、悉尼和班加罗尔举办了多场用户活动,吸引了超过 1,000 名参与者,演讲嘉宾来自 OpenAI、Tesla、Capital One、Ramp 和 Canva 等公司,并连续第二年举办了 AWS re:Invent Chainsmokers 客户活动。 一系列近期产品进展进一步强化了 ClickHouse 在分析、AI 与可观测性交汇领域的地位。公司在数据湖支持方面持续投入,新增了对 Apache Iceberg、Delta Lake 以及主流数据目录的兼容性。同时,平台扩展了全文搜索能力,这对于包括 AI 可观测性在内的各类可观测性场景正变得愈发关键。此外,ClickHouse 还引入了轻量级更新机制,以支持需求更高、负载更复杂的 AI 驱动型应用。根据近期基准测试结果,ClickHouse 持续提供行业领先的性价比,在性能与成本比上超越主流云数据仓库。 借助 D 轮融资、对 Langfuse 的收购以及原生 Postgres 服务的推出,ClickHouse 已做好加速增长的准备,并将进一步巩固其作为统一数据平台与 AI 可观测性平台的战略地位。 了解更多: 在此注册,体验 ClickHouse 的原生 Postgres 服务(https://clickhouse.com/cloud/postgres)。 在 ClickHouse 博客上了解有关收购 Langfuse 的更多内容(https://clickhouse.com/blog/clickhouse-acquires-langfuse-open-source-llm-observability)。 通过 LinkedIn(https://www.linkedin.cn/incareer/company/clickhouseinc/) 和 X (https://x.com/ClickHouseDB)关注 ClickHouse,获取最新动态与公告。 关于 ClickHouse: ClickHouse 是一个快速的开源列式数据库管理系统,专为大规模实时数据处理与分析而设计。ClickHouse Cloud 以高性能为核心,提供卓越的查询速度与并发能力,非常适合需要从海量数据中即时获取洞察的应用。随着 AI 智能体 (AI Agent) 越来越多地嵌入软件系统,并生成频率更高、复杂度更大的查询请求,ClickHouse 提供了一个高吞吐、低延迟的引擎,专门用于应对这一挑战。ClickHouse 受到 Sony、Tesla、Memorial Sloan Kettering、Lyft 和 Instacart 等领先企业的信任,帮助团队通过一个可扩展、高效且现代化的数据平台释放数据价值并做出更明智的决策。欲了解更多信息,请访问 clickhouse.com。 关于 Dragoneer Investment Group: Dragoneer 是一家以增长为导向的投资机构,资产管理规模超过 300 亿美元。该机构与在公有和私有市场中打造品类定义型公司的创始人及管理团队长期合作。迄今为止,已有 50 多家 Dragoneer 投资的公司成功上市。其投资组合包括 Airbnb、Amwins、Atlassian、Databricks、Datadog、Meta、Nubank、OpenAI、Revolut、ServiceNow、Snowflake、Spotify 和 Uber。 关于 Langfuse: Langfuse 是一个用于构建、测试和监控 LLM 应用及 AI 智能体的开源平台。团队使用 Langfuse 来追踪和调试智能体工作流、运行评估,并持续衡量和改进生产环境中 AI 输出的质量。Langfuse 既提供托管云服务,也支持在生产规模下自托管。作为增长最快的 LLM 工程平台之一,Langfuse 拥有 20,470 个 GitHub Star、每月超过 2,600 万次 SDK 安装量以及 600 多万次 Docker 拉取,并受到《财富》50 强中 19 家公司和《财富》500 强中 63 家公司的信任。欲了解更多信息,请访问 langfuse.com。 关于 Ubicloud: Ubicloud 正在打造开源版的 AWS,在裸金属和公有云之上交付核心云服务。Ubicloud 由打造分布式 PostgreSQL 的 Citus Data 团队创立 (该公司已被 Microsoft 收购)。其旗舰数据库产品 Ubicloud PostgreSQL 提供企业级托管 Postgres 体验,并具备行业领先的性价比。Ubicloud 在 AI、计算、PostgreSQL 和 Kubernetes 等领域提供的服务每周支撑超过 100 万台虚拟机运行,可帮助客户将云成本降低多达 70%。Ubicloud 获得了 Y Combinator 及其他知名硅谷投资机构的支持。欲了解更多信息,请在 X 上关注 Ubicloud @ubicloudHQ,或访问 ubicloud.com。 /END/ 面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出 &图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com。
对大规模数据基础设施与 AI 的高度确信投资
LLM 可观测性:ClickHouse 通过收购 Langfuse 进入该市场

原生 Postgres 服务:ClickHouse 面向 AI 构建者推出统一数据技术栈

持续的全球扩张与产品动能

征稿启示


佬们,
我开发了 Linky,一个能自动在各类网站提交链接(发外链)的 AI 工具。
Linky 结合了 AI ( Claude/OpenAI ) 和 Playwright。它不再是死记硬背脚本,而是通过理解网页结构来智能操作。
核心亮点:
目前仅支持 macOS ,Windows 版本正在路上。
这还是个正在开发中的早期项目,我不知道大家是否认为它有用。
如果你对这个工具感兴趣的话,欢迎去 GitHub 点个 Star 以给我反馈!
GitHub 传送门: https://github.com/jiweiyeah/linky-ai
(补充:这工具是用 Claude 写的,用 AI 来写一个 AI 工具,这种感觉挺奇妙的 😄)
点赞 + 关注 + 收藏 = 学会了 你有多久没打电动了?还记得小时候玩过什么游戏吗? 我是90后,第一次接触的游戏机是小霸王,玩的就是红白机这代的游戏。但真正给我生成情怀的还得是 GBA。口袋妖怪红绿蓝、金银水晶,再到后面的火红叶绿和各种宝石;马里奥赛车;龙珠大冒险;舞空斗剧。 时间长了多少有点怀念了。那么有没有一种可能,一个“客户端”能包含N台游戏机模拟器呢?我找到 EmulatorJS。 在电脑安装 EmulatorJS 的方法很简单。 首先电脑需要安装 Node.js 环境,打开 Node.js 官网(https://nodejs.org/)直接下载安装好就行(很简单,我不贴教程了)。 接着打开 EmulatorJS 的代码仓库(https://github.com/EmulatorJS/EmulatorJS),用下面这套命令把代码克隆到本地。 如果你电脑没安装 git 工具,在浏览器打开 EmulatorJS 的 GitHub 地址,下载 ZIP 文件到电脑,然后解压就行。 EmulatorJS 代码下载成功后,接下来需要使用 装好 Node.js 环境后,打开终端,进入到 EmulatorJS 项目的目录。 打开终端后,输入以下代码安装 EmulatorJS 的依赖文件。 如果网络没问题的话,安装好依赖文件后,EmulatorJS 目录下会出现一个 node_modules 文件夹,里面就是 EmulatorJS 需要用到的依赖文件。 其实安装好依赖后就可以运行 EmulatorJS 了,但如果你想在“不联网”的情况下也能运行 EmulatorJS,还需要下载指定模拟器的文件。 模拟器文件在这里:https://cdn.emulatorjs.org/nightly/data/cores 你想运行哪台游戏机,就下载对应的文件。 比如我想玩 GBA,那就搜索“gba”。如果要兼容老浏览器,那就下载 把模拟器文件放到 EmulatorJS 项目的这个地方,以后就可以离线运行 EmulatorJS 了。 我想玩 GBA,所以我就只放了 如果无法打开模拟器文件的网址,我也准备了一份放在百毒碗盘。 复制上面这段内容,到「光刻符文」小软体,选择“符文 - 土猫”解开吧。直接发百毒的🔗怕某些平台不给过。 安装好所有依赖文件后,在终端输入这条命令按回车键就可以运行 EmulatorJS 了。 把游戏拖进去就可以直接运行了。 以 GBA 为例,可以随时保存和读取游戏进度。 其他功能就不多介绍了,自己研究吧~ 点赞 + 关注 + 收藏 = 学会了

下载 EmulatorJS
git clone git@github.com:EmulatorJS/EmulatorJS.git
安装依赖
npm 下载 EmulatorJS 项目用到的依赖文件(一些工具类的代码)。所以要安装好 Node.js 环境。cs xxxxxx 的方式进入 EmulatorJS。
npm ixxx-legacy-wasm.data 这类文件,如果你用的是最新版的 Chrome,直接下载 mgba-wasm.data 也行。
EmulatorJS/data/cores
mgba-legacy-wasm.data 进来。🐱:喵喵嗨嘻咪喵呀呦喵喵呀嘤咪喵呀咪喵咪呀哇咪咪哇哼喵喵喔咝喵喵咕嘶咪咪啊咪咪喵嘿嗷喵咪嘿咔喵喵咕咔喵喵嘿咕喵喵嘿呜咪咪嗨嗝喵咪嘿呦喵喵呀嗯喵咪咕咔咪喵嘿哇咪喵嗨咝咪咪嘿哒喵喵喔嘶喵喵呀哇咪咪喔咝咪咪哇呜咪咪嗯呀喵咪嘤嘟咪喵嘿咝喵咪呦嗡喵喵哈哈喵喵嘤哒咪喵啊哇喵咪嘿嘤喵咪嘛喔喵喵嘤咩喵咪嘤嗯喵咪嘿哒咪咪嘿喔咪咪嘤哇喵咪嘿嘤咪喵呦啊喵喵呦嗯咪喵嘤呦喵咪嗨啪咪咪呦喔咪喵嗨咕喵喵呦呜咪咪哇咝咪喵啊喵喵咪啊啊咪咪嘿嘤咪喵哈哒喵咪嗨啊咪咪嗨咕喵咪嘿嗷咪咪啊哼运行 EmulatorJS
npm run start


点赞 + 关注 + 收藏 = 学会了 Reubah 是一款基于网页的工具,具备图片格式转换、优化、批量处理(背景移除即将推出)和多种文档格式转换功能,支持暗黑模式与 API,无文件存储且自动清理,可通过 Docker 或本地部署,界面简洁易用。 本次使用的是群晖 NAS 部署 Reubah,其他品牌的 NAS 操作步骤类似。 首先在“File Station”里找到“docker”文件夹,在“docker”文件夹里创建“reubah”文件夹。 打开“Container Manager”,新增一个项目。 项目名称填 路径选择刚刚在“docker”文件夹里创建的“reubah”。 来源选择“创建 docker-mompose.yml”。 然后填入以下代码(需要注意代码格式,空格和换行这些)。 输入完代码后点击“下一步”。 勾选“通过 Web Station 设置网页门户”,然后点击“下一步”,等待 docker 下载相关代码。 最后一步是打开“Web Station”(没有这个工具就去“套件中心”下载)。 新增一个网络门户,参考下图选项。 需要注意,端口要输入一个和其他项目不冲突的数字,我这里输入的是 完成上面所有操作后,在浏览器打开 比如我的是 在图片格式转换这边,还支持 iPhone 的实况照片格式(HEIC)转换。 常见的 jpeg、png、webp、gif、bmp 以及将图片转换成 pdf 都是支持的。 文件格式这边包含常见的pdf、docx、doc、odt、txt 和 rtf。 切换到 Batch Processing 面板还可以做批量处理。 以上就是本文的全部内容啦,想了解更多NAS玩法可以关注《NAS邪修》 点赞 + 关注 + 收藏 = 学会了整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》


reubah。
services:
reubah:
image: ghcr.io/dendianugerah/reubah:latest
container_name: reubah
ports:
- "8081:8081"
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
restart: unless-stopped8081:8081 这句,冒号左侧的数字是可以改的,右侧那个不能改。
2347。
NAS的IP + reubah端口号 就可以访问 Rebuah 了。http://192.168.31.85:2347。



乐鑫AI库中提供了一种名为运动侦测API接口的功能。该功能的原理非常简单:只需要获取两张图像数据,然后通过AI计算判断这两个图像是否匹配。如果图像不匹配,则说明当前处于运动状态;如果图像匹配,则说明当前图像处于相对静止状态。本章,我们调用乐鑫AI库的运动侦测API接口来实现运动侦测功能。 本章实验功能简介:使用乐鑫官方的ESP32-WHO AI库对OV2640和OV5640摄像头输出的数据进行运动侦测。 1)LED灯 2)XL9555 3)SPILCD 4)CAMERA 本章实验使用的KPU为ESP32-S3的内部资源,因此并没有相应的连接原理图。 程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图: 在本章节中,我们将重点关注两个文件:esp_motion_detection.cpp和esp_motion_detection.hpp。其中,esp_motion_detection.hpp主要声明了esp_motion_detection函数,其内容相对简单,因此我们暂时不作详细解释。本章节的核心关注点是esp_motion_detection.cpp文件中的函数。 上述原理非常简单:只需要在ai_task_handle任务下获取两张图像数据,然后通过AI计算判断这两个图像是否匹配。如果图像不匹配,则说明当前处于运动状态;如果图像匹配,则说明当前图像处于相对静止状态,最后,我们使用消息队列将当前图像数据传输至LCD进行显示。 程序下载成功后,当检测到图像变化时,图像左上角有蓝色块闪烁。第六十三章 运动侦测实验
本章分为如下几个部分:
63.1 硬件设计
63.2 软件设计
63.3 下载验证63.1 硬件设计
1.例程功能
2.硬件资源
LED-IO1
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
OV_SCL-IO38
OV_SDA- IO39
VSYNC- IO47
HREF- IO48
PCLK- IO45
D0- IO4
D1- IO5
D2- IO6
D3- IO7
D4- IO15
D5- IO16
D6- IO17
D7- IO18
RESET-IO0_5(XL9555)
PWDN-IO0_4(XL9555)3.原理图
63.2 软件设计
63.2.1 程序流程图

图63.2.1.1 程序流程图63.2.2 程序解析
接下来,我们将详细解析esp_motion_detection_ai_strat函数的工作原理。TaskHandle_t camera_task_handle;
TaskHandle_t ai_task_handle;
QueueHandle_t xQueueFrameO = NULL;
QueueHandle_t xQueueAIFrameO = NULL;
/**
* @brief 摄像头图像数据获取任务
* @param arg:未使用
* @retval 无
*/
static void esp_camera_process_handler(void *arg)
{
arg = arg;
camera_fb_t *camera_frame = NULL;
while (1)
{
/* 获取摄像头图像 */
camera_frame = esp_camera_fb_get();
if (camera_frame)
{
/* 以队列的形式发送 */
xQueueSend(xQueueFrameO, &camera_frame, portMAX_DELAY);
}
}
}
/**
* @brief 摄像头图像数据传入AI处理任务
* @param arg:未使用
* @retval 无
*/
static void esp_ai_process_handler(void *arg)
{
arg = arg;
camera_fb_t *face_ai_frameI = NULL;
camera_fb_t *face_ai_frameI2 = NULL;
while(1)
{
/* 以队列的形式获取摄像头图像数据 */
if (xQueueReceive(xQueueFrameO, &face_ai_frameI, portMAX_DELAY))
{
if (xQueueReceive(xQueueFrameO, &face_ai_frameI2, portMAX_DELAY))
{
/* 判断图像是否出现运动 */
uint32_t moving_point_number = dl::image::
get_moving_point_number(
(uint16_t *)face_ai_frameI->buf,
(uint16_t *)face_ai_frameI2->buf,
face_ai_frameI->height,
face_ai_frameI->width, 8, 15);
if (moving_point_number > 50)
{
printf("Something moved\r\n");
/* 此处是在图像中绘画检测效果 */
dl::image::draw_filled_rectangle(
(uint16_t *)face_ai_frameI2->buf,
face_ai_frameI2->height,
face_ai_frameI2->width, 0, 0, 40, 40);
}
else
{
printf("Something not moved\r\n");
}
esp_camera_fb_return(face_ai_frameI);
/* 以队列的形式发送AI处理的图像 */
xQueueSend(xQueueAIFrameO, &face_ai_frameI2, portMAX_DELAY);
}
}
}
}
/**
* @brief AI图像数据开启
* @param 无
* @retval 1:创建任务及队列失败;0:创建任务及对了成功
*/
uint8_t esp_motion_detection_ai_strat(void)
{
/* 创建队列及任务 */
xQueueFrameO = xQueueCreate(5, sizeof(camera_fb_t *));
xQueueAIFrameO = xQueueCreate(5, sizeof(camera_fb_t *));
xTaskCreatePinnedToCore(esp_camera_process_handler,
"esp_camera_process_handler", 4 * 1024, NULL,
5, &camera_task_handle, 1);
xTaskCreatePinnedToCore(esp_ai_process_handler, "esp_ai_process_handler",
6 * 1024, NULL, 5, &ai_task_handle, 1);
if (xQueueFrameO != NULL
|| xQueueAIFrameO != NULL
|| camera_task_handle != NULL
|| ai_task_handle != NULL)
{
return 0;
}
return 1;
}63.3 下载验证
稚晖君的 YouTube
https://www.youtube.com/@%E7%A8%9A%E6%99%96%E5%90%9B
稚晖君的 Github
https://github.com/peng-zhihui
机械臂视频:

他的 YouTube 里面有最新智元机器人的信息