<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TECH on 伍拾柒</title><link>https://www.efu.me/categories/tech/</link><description>Recent content in TECH on 伍拾柒</description><generator>Hugo</generator><language>zh-CN</language><managingEditor>o@efu.me (伍拾柒)</managingEditor><webMaster>o@efu.me (伍拾柒)</webMaster><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.efu.me/categories/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>Reusable Skills：让 Agent 技能跨项目复用</title><link>https://www.efu.me/p/reusable-skills/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0800</pubDate><author>o@efu.me (伍拾柒)</author><guid>https://www.efu.me/p/reusable-skills/</guid><description>&lt;h2 id="技能不该绑死在某个项目里"&gt;技能不该绑死在某个项目里&lt;/h2&gt;&#10;&lt;p&gt;用 Claude Code 这类 Agent 久了，你会攒下一些“怎么把事情做对”的经验：操作 Supabase 时先查 changelog、写 Postgres 迁移时的安全清单、提交前怎么跑测试……这些经验如果只活在你的记忆和聊天记录里，换个项目就得重新交代一遍。&lt;/p&gt;&#10;&lt;p&gt;Agent Skills 就是用来沉淀这类经验的。一个 Skill 本质上是一个目录，核心是一份 &lt;code&gt;SKILL.md&lt;/code&gt;：&lt;/p&gt;&#10;&lt;figure class="code-block" data-code-block data-language="markdown"&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;markdown&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre class="code-block__fallback" tabindex="0"&gt;&lt;code class="language-markdown"&gt;---&#10;name: supabase&#10;description: &amp;#34;Use when doing ANY task involving Supabase. Triggers: Database, Auth, Edge Functions, RLS, migrations, supabase-js, @supabase/ssr ...&amp;#34;&#10;metadata:&#10; author: supabase&#10; version: &amp;#34;0.1.2&amp;#34;&#10;---&#10;&#10;# Supabase&#10;&#10;## Core Principles&#10;...&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;frontmatter 里只有两样东西最关键：&lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;description&lt;/code&gt;。Agent 在决定“这次任务要不要加载这个技能”时，读的就是 &lt;code&gt;description&lt;/code&gt;。所以 description 要写清楚触发条件（Triggers），而不是泛泛地说“和 Supabase 有关”。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;description&lt;/code&gt; 是技能被检索到的唯一入口。写得越具体、触发词越全，Agent 越能在对的时机想起它；写得太笼统，它就只是躺在目录里。&lt;/p&gt;&#10;&lt;h2 id="渐进式披露别让上下文一次性爆掉"&gt;渐进式披露：别让上下文一次性爆掉&lt;/h2&gt;&#10;&lt;p&gt;一个成熟的技能往往不止一份 &lt;code&gt;SKILL.md&lt;/code&gt;。以本站用的 &lt;code&gt;supabase&lt;/code&gt; 技能为例：&lt;/p&gt;</description></item><item><title>Friends：用 RSS 聚合友链动态</title><link>https://www.efu.me/p/super-for-friends/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0800</pubDate><author>o@efu.me (伍拾柒)</author><guid>https://www.efu.me/p/super-for-friends/</guid><description>&lt;h2 id="朋友圈聚合"&gt;朋友圈聚合&lt;/h2&gt;&#10;&lt;p&gt;相信大家在看博客主题的朋友圈实现时，都见过这种思路：给一个友链页地址，让程序爬取页面上的站点链接，再尝试寻找每个站点的 Feed，最后把文章聚合起来。&lt;/p&gt;&#10;&lt;p&gt;这套方案当然能跑，&lt;a href="https://github.com/Rock-Candy-Tea/hexo-circle-of-friends"&gt;Hexo circle of friends&lt;/a&gt; 就是一个很典型的实现。&lt;/p&gt;&#10;&lt;h3 id="从友链页抓取还是手动维护-feed"&gt;从友链页抓取，还是手动维护 Feed&lt;/h3&gt;&#10;&lt;p&gt;本站采用的是更朴素的方案：在 &lt;code&gt;src/data/feeds.ts&lt;/code&gt; 里手动维护友链和 Feed 地址。&lt;/p&gt;&#10;&lt;figure class="code-block" data-code-block data-language="typescript"&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;typescript&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre class="code-block__fallback" tabindex="0"&gt;&lt;code class="language-typescript"&gt;{&#10; author: &amp;#39;Antfu&amp;#39;,&#10; sitenick: &amp;#39;Antfu&amp;#39;,&#10; link: &amp;#39;https://antfu.me/&amp;#39;,&#10; avatar: &amp;#39;https://cdn.lightxi.com/cloudreve/uploads/2025/08/02/wQRfFIj8_antfu.svg&amp;#39;,&#10; archs: [&amp;#39;Vue&amp;#39;, &amp;#39;Vercel&amp;#39;],&#10; date: &amp;#39;2024-01-29&amp;#39;,&#10; feed: &amp;#39;https://antfu.me/feed.xml&amp;#39;,&#10;}&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;这里的 &lt;code&gt;feed&lt;/code&gt; 是 Friends 页的数据入口。配置了 &lt;code&gt;feed&lt;/code&gt;，服务端就会去拉取这个站点的 RSS / Atom；没有配置，就只作为普通友链展示。&lt;/p&gt;&#10;&lt;p&gt;这对吗？对于大规模聚合平台，当然不够自动化；但对个人博客，这是一个很稳的取舍。数据源在哪里、站点是谁、头像用哪个、技术栈怎么写，全都在一份配置里，坏了也好查。&lt;/p&gt;&#10;&lt;p&gt;本站当前没有爬取友链页，也没有自动发现 Feed 地址。Friends 页的数据源就是 &lt;code&gt;feedGroups&lt;/code&gt; 中配置了 &lt;code&gt;feed&lt;/code&gt; 的友链。&lt;/p&gt;&#10;&lt;h3 id="渐进增强没有-feed-也能做普通友链"&gt;渐进增强：没有 Feed 也能做普通友链&lt;/h3&gt;&#10;&lt;p&gt;友链页和 Friends 页不应该强绑定。没有 Feed 的朋友仍然可以出现在 &lt;code&gt;/links&lt;/code&gt;，只是不会进入 &lt;code&gt;/friends&lt;/code&gt; 的动态时间线。这样一来，Feed 聚合只是友链功能的渐进增强，而不是友链存在的前提。&lt;/p&gt;&#10;&lt;p&gt;头像也是同理。Feed 里的作者信息经常不完整，所以本站不会依赖远程 Feed 提供头像，而是使用友链配置里的数据：&lt;/p&gt;</description></item><item><title>在 Solitude 上优雅的使用 CDN 加速静态资源文件</title><link>https://www.efu.me/p/cdn-for-solitude/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0800</pubDate><author>o@efu.me (伍拾柒)</author><guid>https://www.efu.me/p/cdn-for-solitude/</guid><description>&lt;h2 id="什么是-cdn-"&gt;什么是 CDN ？&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;CDN（Content Delivery Network）是一种分布式的网络架构，旨在通过将内容存储在多个地理位置分散的服务器上来加速内容的传输。CDN 可以显著提高网站的加载速度和可靠性，尤其是对于静态资源文件如图片、CSS 和 JavaScript 文件。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="在-solitude-上配置-cdn"&gt;在 Solitude 上配置 CDN&lt;/h2&gt;&#10;&lt;p&gt;以下是完整的配置项：&lt;/p&gt;&#10;&lt;figure class="code-block" data-code-block data-language="yaml"&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;yaml&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre class="code-block__fallback" tabindex="0"&gt;&lt;code class="language-yaml"&gt;# --------------------------- start ---------------------------&#10;# 非必要请勿修改&#10;CDN:&#10; internal: local # local / cdnjs / jsdelivr / unpkg / custom&#10; third_party: cdnjs # cdnjs / jsdelivr / unpkg / custom&#10; version: true # 是否使用版本号&#10; custom_format: https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}&#10; # 直接覆盖默认 CDN 链接（优先级最高）&#10; options:&#10; # algolia_search&#10; # aplayer_css&#10; # aplayer_js&#10; # artalk_css&#10; # artalk_js&#10; # blueimp_md5&#10; # busuanzi_js&#10; # chart_js&#10; # color_thief&#10; # fancyapps_css&#10; # fancyapps_ui&#10; # fontawesome&#10; # instantsearch&#10; # katex&#10; # katex_copytex&#10; # lazyload&#10; # medium_zoom&#10; # mermaid_js&#10; # meting_js&#10; # pace_js&#10; # pjax&#10; # qrcode&#10; # snackbar&#10; # swiper_css&#10; # swiper_js&#10; twikoo: https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/twikoo/1.6.40/twikoo.all.min.js&#10; # typeit_js&#10; # valine&#10; # waline_css&#10; # waline_js&#10;# --------------------------- end ---------------------------&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="internal"&gt;Internal&lt;/h2&gt;&#10;&lt;p&gt;此部分代表 Solitude 内部文件使用的 CDN 配置，通常不需要修改。&lt;/p&gt;</description></item></channel></rss>