<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Destiny's Hub · 星港</title>
        <link>https://blog.shkart.online</link>
        <description>星港 - 探索技术，记录生活。</description>
        <lastBuildDate>Tue, 31 Mar 2026 12:22:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2024-present Destiny</copyright>
        <item>
            <title><![CDATA[Archives Fog Index Implementation Plan]]></title>
            <link>https://blog.shkart.online/superpowers/plans/2026-03-31-archives-fog-index.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/plans/2026-03-31-archives-fog-index.html</guid>
            <pubDate>Tue, 31 Mar 2026 07:32:54 GMT</pubDate>
            <description><![CDATA[# Archives Fog Index Implementation Plan

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 在归档页桌面端加入一个轻量的右侧年份导航与数量索引，并让它在页面进入时以克制的雾面动效慢慢显现。

**Architecture:** 继续保留 `docs/archives/index.md` 作为单文件页面实现，在现有时间线数据之上派生右侧索引数据，不引入新的组件文件或依赖。使用 CSS 媒体查询控制桌面端显示，使用 Vue 的滚动观察逻辑同步当前激活年份，并通过 scoped CSS 完成入场动效与夜间模式样式。

**Tech Stack:** Vue 3、VitePress、Node 内置测试、Playwright 本地预览

]]></description>
            <content:encoded><![CDATA[<h1 id="archives-fog-index-implementation-plan" tabindex="-1">Archives Fog Index Implementation Plan <a class="header-anchor" href="#archives-fog-index-implementation-plan" aria-label="Permalink to &quot;Archives Fog Index Implementation Plan&quot;"></a></h1>
<blockquote>
<p><strong>For agentic workers:</strong> REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (<code>- [ ]</code>) syntax for tracking.</p>
</blockquote>
<p><strong>Goal:</strong> 在归档页桌面端加入一个轻量的右侧年份导航与数量索引，并让它在页面进入时以克制的雾面动效慢慢显现。</p>
<p><strong>Architecture:</strong> 继续保留 <code>docs/archives/index.md</code> 作为单文件页面实现，在现有时间线数据之上派生右侧索引数据，不引入新的组件文件或依赖。使用 CSS 媒体查询控制桌面端显示，使用 Vue 的滚动观察逻辑同步当前激活年份，并通过 scoped CSS 完成入场动效与夜间模式样式。</p>
<p><strong>Tech Stack:</strong> Vue 3、VitePress、Node 内置测试、Playwright 本地预览</p>
<hr>
<h2 id="chunk-1-锁定页面结构与测试" tabindex="-1">Chunk 1: 锁定页面结构与测试 <a class="header-anchor" href="#chunk-1-锁定页面结构与测试" aria-label="Permalink to &quot;Chunk 1: 锁定页面结构与测试&quot;"></a></h2>
<h3 id="task-1-为右侧雾面索引写失败测试" tabindex="-1">Task 1: 为右侧雾面索引写失败测试 <a class="header-anchor" href="#task-1-为右侧雾面索引写失败测试" aria-label="Permalink to &quot;Task 1: 为右侧雾面索引写失败测试&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写失败测试</strong></p>
</li>
</ul>
<p>约束以下行为：</p>
<ul>
<li>
<p>归档页存在右侧索引区域</p>
</li>
<li>
<p>索引区域包含年份链接与数量文本</p>
</li>
<li>
<p>索引区域包含入场动效类或关键样式标识</p>
</li>
<li>
<p>索引区域保留宽屏显示、窄屏隐藏的响应式约束</p>
</li>
<li>
<p>[ ] <strong>Step 2: 运行测试确认失败</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/archives-summary.test.mjs</code><br>
Expected: FAIL，指出当前归档页还没有右侧索引结构或动效标识</p>
<h3 id="task-2-在归档页中加入右侧索引结构" tabindex="-1">Task 2: 在归档页中加入右侧索引结构 <a class="header-anchor" href="#task-2-在归档页中加入右侧索引结构" aria-label="Permalink to &quot;Task 2: 在归档页中加入右侧索引结构&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\docs\archives\index.md</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写最小模板改动</strong></p>
</li>
</ul>
<p>在现有归档页中加入：</p>
<ul>
<li>
<p>宽屏双列布局容器</p>
</li>
<li>
<p>左侧时间线主列</p>
</li>
<li>
<p>右侧索引 <code>&lt;aside&gt;</code></p>
</li>
<li>
<p>基于年份分组派生的索引数据</p>
</li>
<li>
<p>每个年份的锚点与数量</p>
</li>
<li>
<p>[ ] <strong>Step 2: 运行测试确认通过</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/archives-summary.test.mjs</code><br>
Expected: PASS</p>
<h2 id="chunk-2-激活态与动效" tabindex="-1">Chunk 2: 激活态与动效 <a class="header-anchor" href="#chunk-2-激活态与动效" aria-label="Permalink to &quot;Chunk 2: 激活态与动效&quot;"></a></h2>
<h3 id="task-3-为激活年份和动效约束写失败测试" tabindex="-1">Task 3: 为激活年份和动效约束写失败测试 <a class="header-anchor" href="#task-3-为激活年份和动效约束写失败测试" aria-label="Permalink to &quot;Task 3: 为激活年份和动效约束写失败测试&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写失败测试</strong></p>
</li>
</ul>
<p>约束以下行为：</p>
<ul>
<li>
<p>页面存在当前年份激活态样式选择器</p>
</li>
<li>
<p>页面存在右侧索引淡入滑入关键帧或动画定义</p>
</li>
<li>
<p>页面存在 <code>prefers-reduced-motion</code> 的降级处理</p>
</li>
<li>
<p>[ ] <strong>Step 2: 运行测试确认失败</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/archives-summary.test.mjs</code><br>
Expected: FAIL，指出缺失激活态或动效样式</p>
<h3 id="task-4-实现激活态与入场动效" tabindex="-1">Task 4: 实现激活态与入场动效 <a class="header-anchor" href="#task-4-实现激活态与入场动效" aria-label="Permalink to &quot;Task 4: 实现激活态与入场动效&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\docs\archives\index.md</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写最小滚动同步逻辑</strong></p>
</li>
</ul>
<p>使用 <code>onMounted</code> / <code>onUnmounted</code> 和 <code>IntersectionObserver</code> 或等价滚动逻辑，维护当前激活年份。</p>
<ul>
<li>[ ] <strong>Step 2: 写最小样式实现</strong></li>
</ul>
<p>加入：</p>
<ul>
<li>
<p>雾面索引文字层级</p>
</li>
<li>
<p>激活态细光标线</p>
</li>
<li>
<p>右侧索引的淡入滑入与模糊显影</p>
</li>
<li>
<p>夜间模式色彩</p>
</li>
<li>
<p>窄屏隐藏规则</p>
</li>
<li>
<p><code>prefers-reduced-motion</code> 降级规则</p>
</li>
<li>
<p>[ ] <strong>Step 3: 运行测试确认通过</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/archives-summary.test.mjs</code><br>
Expected: PASS</p>
<h2 id="chunk-3-完整验证与视觉检查" tabindex="-1">Chunk 3: 完整验证与视觉检查 <a class="header-anchor" href="#chunk-3-完整验证与视觉检查" aria-label="Permalink to &quot;Chunk 3: 完整验证与视觉检查&quot;"></a></h2>
<h3 id="task-5-跑回归测试" tabindex="-1">Task 5: 跑回归测试 <a class="header-anchor" href="#task-5-跑回归测试" aria-label="Permalink to &quot;Task 5: 跑回归测试&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Verify: <code>D:\Blog\tests\archives-summary.test.mjs</code></p>
</li>
<li>
<p>Verify: <code>D:\Blog\docs\archives\index.md</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 跑归档页相关测试</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/archives-summary.test.mjs tests/article-card-style.test.mjs tests/posts.test.mjs</code><br>
Expected: PASS</p>
<ul>
<li>[ ] <strong>Step 2: 跑完整构建</strong></li>
</ul>
<p>Run: <code>npm run build</code><br>
Expected: PASS</p>
<ul>
<li>[ ] <strong>Step 3: 本地浏览器确认效果</strong></li>
</ul>
<p>打开本地归档页，确认：</p>
<ul>
<li>
<p>右侧索引位置在留白区，不抢主内容</p>
</li>
<li>
<p>进入页面时索引缓慢显现</p>
</li>
<li>
<p>夜间模式不刺眼</p>
</li>
<li>
<p>移动端隐藏正常</p>
</li>
<li>
<p>[ ] <strong>Step 4: 生成截图给用户确认</strong></p>
</li>
</ul>
<p>保存日间与夜间截图，用于用户确认视觉效果。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Archives Fog Index Design]]></title>
            <link>https://blog.shkart.online/superpowers/specs/2026-03-31-archives-fog-index-design.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/specs/2026-03-31-archives-fog-index-design.html</guid>
            <pubDate>Tue, 31 Mar 2026 07:32:54 GMT</pubDate>
            <description><![CDATA[日期：2026-03-31  
执行者：Codex
 背景
归档页当前恢复到了原有的单列时间线基线。左侧时间线气质是轻、静、克制，但桌面端右侧留白较大。用户希望在页面跳转进入归档页时，这块留白区域能够]]></description>
            <content:encoded><![CDATA[<h1 id="archives-fog-index-design" tabindex="-1">Archives Fog Index Design <a class="header-anchor" href="#archives-fog-index-design" aria-label="Permalink to &quot;Archives Fog Index Design&quot;"></a></h1>
<p>日期：2026-03-31<br>
执行者：Codex</p>
<h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to &quot;背景&quot;"></a></h2>
<p>归档页当前恢复到了原有的单列时间线基线。左侧时间线气质是轻、静、克制，但桌面端右侧留白较大。用户希望在页面跳转进入归档页时，这块留白区域能够“慢慢弹出”一个优雅的辅助层，同时不能破坏原有版式，也不能重演此前厚重卡片、夜间模式不协调的问题。</p>
<h2 id="目标" tabindex="-1">目标 <a class="header-anchor" href="#目标" aria-label="Permalink to &quot;目标&quot;"></a></h2>
<ul>
<li>保留左侧时间线作为绝对主视觉。</li>
<li>在桌面宽屏的右侧留白中加入轻量的年份导航与数量索引。</li>
<li>页面切换进入时，让右侧索引以低噪音、偏高级的方式缓慢显现。</li>
<li>保证夜间模式与日间模式都保持克制，不出现强发光、大底板或厚重玻璃拟态。</li>
</ul>
<h2 id="设计决策" tabindex="-1">设计决策 <a class="header-anchor" href="#设计决策" aria-label="Permalink to &quot;设计决策&quot;"></a></h2>
<h3 id="_1-信息结构" tabindex="-1">1. 信息结构 <a class="header-anchor" href="#_1-信息结构" aria-label="Permalink to &quot;1. 信息结构&quot;"></a></h3>
<p>右侧索引只承载三类信息：</p>
<ul>
<li>小标题：<code>归档索引</code></li>
<li>年份列表：<code>2026 / 2025 / 2024 / 2023</code></li>
<li>每个年份对应的文章数量</li>
</ul>
<p>不加入总文章数卡片、不加入最近更新说明、不加入额外装饰文案，避免信息层过厚。</p>
<h3 id="_2-视觉层级" tabindex="-1">2. 视觉层级 <a class="header-anchor" href="#_2-视觉层级" aria-label="Permalink to &quot;2. 视觉层级&quot;"></a></h3>
<p>右侧索引采用“雾面侧索引”方向：</p>
<ul>
<li>不使用实体卡片容器。</li>
<li>不使用厚边框、厚阴影、按钮式胶囊。</li>
<li>以极淡的分隔线、弱对比文字和小号数量构成层级。</li>
<li>当前激活年份只比其他年份亮一阶，并辅以一条极细的竖向光标线。</li>
</ul>
<p>这样右侧会像贴在空气中的目录，而不是独立组件。</p>
<h3 id="_3-入场动效" tabindex="-1">3. 入场动效 <a class="header-anchor" href="#_3-入场动效" aria-label="Permalink to &quot;3. 入场动效&quot;"></a></h3>
<p>右侧索引在页面进入时使用静音式显现：</p>
<ul>
<li>整体从右向左位移 <code>12px-16px</code></li>
<li><code>opacity: 0 -&gt; 1</code></li>
<li><code>filter: blur(10px) -&gt; blur(0)</code></li>
<li>列表项按年份做轻微错峰，单项延迟约 <code>40ms</code></li>
<li>总时长控制在 <code>480ms-560ms</code></li>
</ul>
<p>动效不使用弹簧、回弹、缩放过度等强情绪曲线，保持高级和安静。</p>
<h3 id="_4-交互与状态" tabindex="-1">4. 交互与状态 <a class="header-anchor" href="#_4-交互与状态" aria-label="Permalink to &quot;4. 交互与状态&quot;"></a></h3>
<ul>
<li>右侧索引在桌面宽屏显示，在窄屏隐藏。</li>
<li>年份项支持点击跳转到对应年份锚点。</li>
<li>页面滚动时，当前年份在右侧索引高亮。</li>
<li>如果用户启用了 <code>prefers-reduced-motion</code>，入场动效退化为纯淡入。</li>
</ul>
<h3 id="_5-夜间模式" tabindex="-1">5. 夜间模式 <a class="header-anchor" href="#_5-夜间模式" aria-label="Permalink to &quot;5. 夜间模式&quot;"></a></h3>
<p>夜间模式采用低对比表达：</p>
<ul>
<li>年份主文字使用偏冷白的柔和文本色。</li>
<li>数量使用更淡一阶的灰蓝色。</li>
<li>激活态光标线使用细窄蓝白辉光，但不形成大面积亮块。</li>
<li>背景不新增单独面板，沿用页面现有夜间氛围。</li>
</ul>
<h2 id="不做的事" tabindex="-1">不做的事 <a class="header-anchor" href="#不做的事" aria-label="Permalink to &quot;不做的事&quot;"></a></h2>
<ul>
<li>不改动左侧时间线的基础版式。</li>
<li>不压缩主内容列宽度。</li>
<li>不给右侧索引添加大卡片、玻璃面板或明显按钮态。</li>
<li>不在移动端强行保留右侧索引。</li>
<li>不引入新的依赖库。</li>
</ul>
<h2 id="预期文件范围" tabindex="-1">预期文件范围 <a class="header-anchor" href="#预期文件范围" aria-label="Permalink to &quot;预期文件范围&quot;"></a></h2>
<ul>
<li>修改：<code>D:\Blog\docs\archives\index.md</code></li>
<li>修改：<code>D:\Blog\tests\archives-summary.test.mjs</code></li>
</ul>
<h2 id="验收标准" tabindex="-1">验收标准 <a class="header-anchor" href="#验收标准" aria-label="Permalink to &quot;验收标准&quot;"></a></h2>
<ul>
<li>归档页桌面端右侧出现轻量年份导航与数量。</li>
<li>右侧索引在页面进入时有缓慢、克制的显现动效。</li>
<li>夜间模式下索引仍然和谐，不刺眼。</li>
<li>移动端布局不被压坏。</li>
<li>本地测试与构建通过。</li>
</ul>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[友情链接]]></title>
            <link>https://blog.shkart.online/friends/</link>
            <guid isPermaLink="false">https://blog.shkart.online/friends/</guid>
            <pubDate>Fri, 27 Mar 2026 09:16:50 GMT</pubDate>
            <description><![CDATA[&lt;script setup
import PageHeader from '../components/PageHeader.vue'
import FriendsGrid from '../c]]></description>
            <content:encoded><![CDATA[<PageHeader
  title="友情链接"
  publish-date="2022-07-21T00:00:00"
  update-date="2024-09-20T18:32:00"
  :tags="['特殊页面']"
  :show-word-count="false"
/>
<p>这里收着一些我喜欢的小站。有人写技术，有人写生活，也有人分享兴趣与观察，能在互联网里彼此遇见，本身就很难得。</p>
<h2 id="我的朋友们" tabindex="-1">我的朋友们 <a class="header-anchor" href="#我的朋友们" aria-label="Permalink to &quot;我的朋友们&quot;"></a></h2>
<p>不一定都是开发者，但都在认真记录、认真表达，也都值得被看见。</p>
<FriendsGrid /><h2 id="申请友链-·-link-for-friend" tabindex="-1">申请友链 · Link For Friend <a class="header-anchor" href="#申请友链-·-link-for-friend" aria-label="Permalink to &quot;申请友链 · Link For Friend&quot;"></a></h2>
<p>很高兴你有兴趣交换友链。能在茫茫互联网里相遇，本身就是一件很美好的事。</p>
<FriendsLinkApplyCard /><p>收到后我会尽快回复，期待认识更多有趣的朋友。</p>
<h2 id="如果你也和我一样-喜欢记录、分享、交流" tabindex="-1">如果你也和我一样，喜欢记录、分享、交流 <a class="header-anchor" href="#如果你也和我一样-喜欢记录、分享、交流" aria-label="Permalink to &quot;如果你也和我一样，喜欢记录、分享、交流&quot;"></a></h2>
<p>欢迎把你的小站发给我，我们在更大的互联网里做彼此的一盏小灯。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[创作中心]]></title>
            <link>https://blog.shkart.online/admin/</link>
            <guid isPermaLink="false">https://blog.shkart.online/admin/</guid>
            <pubDate>Fri, 27 Mar 2026 08:10:02 GMT</pubDate>
            <description><![CDATA[&lt;script setup
import { ref, onMounted } from 'vue'
import AdminLogin from '../components/AdminL]]></description>
            <content:encoded><![CDATA[<div class="admin-wrapper">
  <div v-if="isChecking" class="admin-loading">正在确认登录状态...</div>
  <AdminLogin v-else-if="!isLoggedIn" @login-success="handleLogin" />
  <ProEditor v-else :on-logout="handleLogout" />
</div>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Friends 页面局部精修 Implementation Plan]]></title>
            <link>https://blog.shkart.online/superpowers/plans/2026-03-26-friends-page-polish.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/plans/2026-03-26-friends-page-polish.html</guid>
            <pubDate>Thu, 26 Mar 2026 15:32:26 GMT</pubDate>
            <description><![CDATA[# Friends 页面局部精修 Implementation Plan

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 优化 `friends` 页的打乱按钮、示例头像和申请信息块，使其更克制、更统一，同时补齐 RSS 按钮硬链接。

**Architecture:** 这次实现只修改现有页面与导航组件，不改业务逻辑。`friends` 页面会把示例头像迁移到本地可维护的 SVG 生成工具，并用真实结构替换默认 Markdown 代码块；导航栏 RSS 链接改为绝对地址，避免在异常 host 下命中错误路径。

**Tech Stack:** Vue 3、VitePress、Node 内置测试、SVG Data URI

]]></description>
            <content:encoded><![CDATA[<h1 id="friends-页面局部精修-implementation-plan" tabindex="-1">Friends 页面局部精修 Implementation Plan <a class="header-anchor" href="#friends-页面局部精修-implementation-plan" aria-label="Permalink to &quot;Friends 页面局部精修 Implementation Plan&quot;"></a></h1>
<blockquote>
<p><strong>For agentic workers:</strong> REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (<code>- [ ]</code>) syntax for tracking.</p>
</blockquote>
<p><strong>Goal:</strong> 优化 <code>friends</code> 页的打乱按钮、示例头像和申请信息块，使其更克制、更统一，同时补齐 RSS 按钮硬链接。</p>
<p><strong>Architecture:</strong> 这次实现只修改现有页面与导航组件，不改业务逻辑。<code>friends</code> 页面会把示例头像迁移到本地可维护的 SVG 生成工具，并用真实结构替换默认 Markdown 代码块；导航栏 RSS 链接改为绝对地址，避免在异常 host 下命中错误路径。</p>
<p><strong>Tech Stack:</strong> Vue 3、VitePress、Node 内置测试、SVG Data URI</p>
<hr>
<h3 id="task-1-硬化-rss-链接" tabindex="-1">Task 1: 硬化 RSS 链接 <a class="header-anchor" href="#task-1-硬化-rss-链接" aria-label="Permalink to &quot;Task 1: 硬化 RSS 链接&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\docs\components\NavBar.vue</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\spotlight-mode.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 保持失败测试</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/spotlight-mode.test.mjs</code>
Expected: FAIL，提示 RSS 链接仍是相对路径</p>
<ul>
<li>[ ] <strong>Step 2: 修改 RSS 链接为正式绝对地址</strong></li>
</ul>
<p>将导航栏中的 RSS 按钮改为 <code>https://blog.shkart.online/feed.xml</code>。</p>
<ul>
<li>[ ] <strong>Step 3: 重新运行测试确认通过</strong></li>
</ul>
<p>Run: <code>node --test tests/spotlight-mode.test.mjs</code>
Expected: PASS</p>
<h3 id="task-2-为-friends-页面写失败测试" tabindex="-1">Task 2: 为 friends 页面写失败测试 <a class="header-anchor" href="#task-2-为-friends-页面写失败测试" aria-label="Permalink to &quot;Task 2: 为 friends 页面写失败测试&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Create: <code>D:\Blog\tests\friends-page-style.test.mjs</code></p>
</li>
<li>
<p>Modify: <code>D:\Blog\package.json</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写失败测试</strong></p>
</li>
</ul>
<p>约束以下行为：</p>
<ul>
<li>
<p>不再使用 <code>DiceBear avataaars</code></p>
</li>
<li>
<p>存在本地头像生成工具引用</p>
</li>
<li>
<p><code>手动打乱</code> 按钮 hover 不再上浮</p>
</li>
<li>
<p>申请信息块使用真实结构卡片，而不是 fenced code block</p>
</li>
<li>
<p>[ ] <strong>Step 2: 运行测试确认失败</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/friends-page-style.test.mjs</code>
Expected: FAIL</p>
<h3 id="task-3-重构-friends-页面结构与样式" tabindex="-1">Task 3: 重构 friends 页面结构与样式 <a class="header-anchor" href="#task-3-重构-friends-页面结构与样式" aria-label="Permalink to &quot;Task 3: 重构 friends 页面结构与样式&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\docs\friends\index.md</code></p>
</li>
<li>
<p>Create: <code>D:\Blog\docs\.vitepress\theme\utils\friendAvatar.ts</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\friends-page-style.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 提取头像生成工具</strong></p>
</li>
</ul>
<p>实现稳定的 <code>createFriendAvatar(name)</code>，输出统一风格的本地 SVG Data URI。</p>
<ul>
<li>[ ] <strong>Step 2: 替换示例头像来源</strong></li>
</ul>
<p>移除 <code>DiceBear avataaars</code> URL，改为使用本地头像生成工具。</p>
<ul>
<li>[ ] <strong>Step 3: 重写申请信息块结构</strong></li>
</ul>
<p>将默认代码块替换为 <code>apply-card</code> 结构，拆成说明、字段列表和联系区。</p>
<ul>
<li>[ ] <strong>Step 4: 收紧打乱按钮样式</strong></li>
</ul>
<p>移除厚重悬浮感与明显抬升，改为更克制的次级操作按钮。</p>
<ul>
<li>[ ] <strong>Step 5: 运行局部测试确认通过</strong></li>
</ul>
<p>Run: <code>node --test tests/friends-page-style.test.mjs</code>
Expected: PASS</p>
<h3 id="task-4-完整验证" tabindex="-1">Task 4: 完整验证 <a class="header-anchor" href="#task-4-完整验证" aria-label="Permalink to &quot;Task 4: 完整验证&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Verify: <code>D:\Blog\docs\components\NavBar.vue</code></p>
</li>
<li>
<p>Verify: <code>D:\Blog\docs\friends\index.md</code></p>
</li>
<li>
<p>Verify: <code>D:\Blog\docs\.vitepress\theme\utils\friendAvatar.ts</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 运行全量测试</strong></p>
</li>
</ul>
<p>Run: <code>npm.cmd test</code>
Expected: PASS</p>
<ul>
<li>[ ] <strong>Step 2: 运行构建</strong></li>
</ul>
<p>Run: <code>npm.cmd run build</code>
Expected: PASS</p>
<ul>
<li>[ ] <strong>Step 3: 浏览器复看</strong></li>
</ul>
<p>检查：</p>
<ul>
<li>RSS 按钮打开正确</li>
<li><code>手动打乱</code> 按钮更轻、更稳</li>
<li>头像不再模板化卡通</li>
<li>申请信息块结构更清晰</li>
</ul>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Reading Settings Panel Implementation Plan]]></title>
            <link>https://blog.shkart.online/superpowers/plans/2026-03-26-reading-settings-panel.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/plans/2026-03-26-reading-settings-panel.html</guid>
            <pubDate>Thu, 26 Mar 2026 15:32:26 GMT</pubDate>
            <description><![CDATA[# Reading Settings Panel Implementation Plan

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 将阅读设置面板重构为更克制的 Apple 式柔和风格，去掉 AI 感和装饰噪音，同时保持原有功能不变。

**Architecture:** 只修改 `NavBar.vue` 中阅读设置面板的模板与样式，不触碰聚焦模式和字号切换的业务逻辑。通过测试约束移除 `Premium` 和强装饰样式，保证这次重构可回归验证。

**Tech Stack:** Vue 3、VitePress、Node 内置测试、Playwright 本地浏览器检查

]]></description>
            <content:encoded><![CDATA[<h1 id="reading-settings-panel-implementation-plan" tabindex="-1">Reading Settings Panel Implementation Plan <a class="header-anchor" href="#reading-settings-panel-implementation-plan" aria-label="Permalink to &quot;Reading Settings Panel Implementation Plan&quot;"></a></h1>
<blockquote>
<p><strong>For agentic workers:</strong> REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (<code>- [ ]</code>) syntax for tracking.</p>
</blockquote>
<p><strong>Goal:</strong> 将阅读设置面板重构为更克制的 Apple 式柔和风格，去掉 AI 感和装饰噪音，同时保持原有功能不变。</p>
<p><strong>Architecture:</strong> 只修改 <code>NavBar.vue</code> 中阅读设置面板的模板与样式，不触碰聚焦模式和字号切换的业务逻辑。通过测试约束移除 <code>Premium</code> 和强装饰样式，保证这次重构可回归验证。</p>
<p><strong>Tech Stack:</strong> Vue 3、VitePress、Node 内置测试、Playwright 本地浏览器检查</p>
<hr>
<h3 id="task-1-锁定阅读设置的新视觉约束" tabindex="-1">Task 1: 锁定阅读设置的新视觉约束 <a class="header-anchor" href="#task-1-锁定阅读设置的新视觉约束" aria-label="Permalink to &quot;Task 1: 锁定阅读设置的新视觉约束&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\tests\spotlight-mode.test.mjs</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\spotlight-mode.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 写失败测试</strong></p>
</li>
</ul>
<p>在测试中约束：</p>
<ul>
<li>
<p>不再存在 <code>Premium</code> 文案</p>
</li>
<li>
<p>不再存在 <code>premium-badge</code></p>
</li>
<li>
<p>阅读设置外层不再依赖 <code>reading-dropdown::before</code> 渐变描边</p>
</li>
<li>
<p>开关开启态不再使用强发光阴影</p>
</li>
<li>
<p>[ ] <strong>Step 2: 运行测试确认失败</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/spotlight-mode.test.mjs</code>
Expected: FAIL，指出旧的 <code>Premium</code> / 渐变描边 / 发光样式仍存在</p>
<h3 id="task-2-收敛阅读设置的模板与样式" tabindex="-1">Task 2: 收敛阅读设置的模板与样式 <a class="header-anchor" href="#task-2-收敛阅读设置的模板与样式" aria-label="Permalink to &quot;Task 2: 收敛阅读设置的模板与样式&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Modify: <code>D:\Blog\docs\components\NavBar.vue</code></p>
</li>
<li>
<p>Test: <code>D:\Blog\tests\spotlight-mode.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 移除模板中的装饰项</strong></p>
</li>
</ul>
<p>删除阅读设置模板里的 <code>Premium</code> 徽标，仅保留标签、字号控件和 switch。</p>
<ul>
<li>[ ] <strong>Step 2: 重写面板视觉层级</strong></li>
</ul>
<p>调整以下样式：</p>
<ul>
<li><code>reading-dropdown</code></li>
<li><code>setting-card</code></li>
<li><code>font-size-pills</code></li>
<li><code>font-size-pill</code></li>
<li><code>spotlight-card</code></li>
<li><code>premium-toggle</code></li>
<li><code>toggle-knob</code></li>
</ul>
<p>目标是：</p>
<ul>
<li>
<p>去掉炫彩渐变描边</p>
</li>
<li>
<p>降低阴影与高光</p>
</li>
<li>
<p>让字号控件更像 segmented control</p>
</li>
<li>
<p>让开关更像系统 switch</p>
</li>
<li>
<p>[ ] <strong>Step 3: 运行测试确认通过</strong></p>
</li>
</ul>
<p>Run: <code>node --test tests/spotlight-mode.test.mjs</code>
Expected: PASS</p>
<h3 id="task-3-完整验证" tabindex="-1">Task 3: 完整验证 <a class="header-anchor" href="#task-3-完整验证" aria-label="Permalink to &quot;Task 3: 完整验证&quot;"></a></h3>
<p><strong>Files:</strong></p>
<ul>
<li>
<p>Verify: <code>D:\Blog\docs\components\NavBar.vue</code></p>
</li>
<li>
<p>Verify: <code>D:\Blog\tests\spotlight-mode.test.mjs</code></p>
</li>
<li>
<p>[ ] <strong>Step 1: 浏览器确认实际效果</strong></p>
</li>
</ul>
<p>用本地页面打开文章页，检查阅读设置面板：</p>
<ul>
<li>
<p>没有 <code>Premium</code></p>
</li>
<li>
<p>字号控件更克制</p>
</li>
<li>
<p>聚焦开关不再发光</p>
</li>
<li>
<p>[ ] <strong>Step 2: 跑全量测试</strong></p>
</li>
</ul>
<p>Run: <code>npm.cmd test</code>
Expected: PASS</p>
<ul>
<li>[ ] <strong>Step 3: 跑构建</strong></li>
</ul>
<p>Run: <code>npm.cmd run build</code>
Expected: PASS</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Friends 页面局部精修设计]]></title>
            <link>https://blog.shkart.online/superpowers/specs/2026-03-26-friends-page-polish-design.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/specs/2026-03-26-friends-page-polish-design.html</guid>
            <pubDate>Thu, 26 Mar 2026 15:32:26 GMT</pubDate>
            <description><![CDATA[日期：2026-03-26  
执行者：Codex
 背景
当前 `friends` 页面有三处观感问题已经被明确指出：
1. 右上角“手动打乱”按钮过于厚重，像一块独立悬浮卡片，和页面其它元素不够统]]></description>
            <content:encoded><![CDATA[<h1 id="friends-页面局部精修设计" tabindex="-1">Friends 页面局部精修设计 <a class="header-anchor" href="#friends-页面局部精修设计" aria-label="Permalink to &quot;Friends 页面局部精修设计&quot;"></a></h1>
<p>日期：2026-03-26<br>
执行者：Codex</p>
<h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to &quot;背景&quot;"></a></h2>
<p>当前 <code>friends</code> 页面有三处观感问题已经被明确指出：</p>
<ol>
<li>右上角“手动打乱”按钮过于厚重，像一块独立悬浮卡片，和页面其它元素不够统一。</li>
<li>示例友情链接头像使用了偏卡通、偏模板化的 <code>DiceBear avataaars</code> 风格，辨识度有，但不够成熟。</li>
<li>“给我发这些就行”这一段并不是专门设计过的信息卡，而是普通 Markdown 代码块直接落在页面里，导致边界发虚、排版松散、信息结构不清晰。</li>
</ol>
<p>另外，<code>docs/friends/index.md</code> 里已经存在一套 <code>.apply-card</code> / <code>.format-code</code> / <code>.apply-contact</code> 的样式草稿，但正文没有真正使用这套结构，属于“样式有意图、内容没接上”的状态。</p>
<h2 id="目标" tabindex="-1">目标 <a class="header-anchor" href="#目标" aria-label="Permalink to &quot;目标&quot;"></a></h2>
<ul>
<li>保留 <code>friends</code> 页现有功能与信息内容不变。</li>
<li>让按钮、头像、申请信息块的气质更统一，更接近 GitHub/Primer 这类成熟产品的克制表达。</li>
<li>保留博客站应有的人味与个性，不把页面做成纯后台系统风格。</li>
<li>只做局部精修，不改动友情链接卡片整体布局和页面信息架构。</li>
</ul>
<h2 id="设计依据" tabindex="-1">设计依据 <a class="header-anchor" href="#设计依据" aria-label="Permalink to &quot;设计依据&quot;"></a></h2>
<p>这次局部优化参考 GitHub/Primer 的三个方向：</p>
<ul>
<li><a href="https://primer.style/components/button" target="_blank" rel="noreferrer">Primer Button</a>
重点参考其 <code>default</code> / <code>invisible</code> 这类低情绪操作按钮的层级处理。</li>
<li><a href="https://primer.style/product/components/avatar/" target="_blank" rel="noreferrer">Primer Avatar</a>
重点参考其头像尺寸、形状、边界和与文本的比例关系。</li>
<li><a href="https://primer.style/components/blankslate" target="_blank" rel="noreferrer">Primer Blankslate</a>
重点参考其“轻容器、强信息层级、弱装饰”的说明块思路。</li>
</ul>
<p>这些参考不用于 1:1 临摹，而是用于约束这次改造的气质：</p>
<ul>
<li>少做厚阴影</li>
<li>少做大面积渐变</li>
<li>少做夸张抬升</li>
<li>更多依赖边框、留白、对齐和字重建立秩序</li>
</ul>
<h2 id="设计决策" tabindex="-1">设计决策 <a class="header-anchor" href="#设计决策" aria-label="Permalink to &quot;设计决策&quot;"></a></h2>
<h3 id="_1-手动打乱-按钮" tabindex="-1">1. “手动打乱”按钮 <a class="header-anchor" href="#_1-手动打乱-按钮" aria-label="Permalink to &quot;1. “手动打乱”按钮&quot;"></a></h3>
<p>采用“GitHub 式次级操作按钮”方向，而不是继续保留当前的悬浮白卡片感。</p>
<p>具体调整：</p>
<ul>
<li>收窄按钮高度与水平内边距，减少“胖”和“浮”的感觉。</li>
<li>阴影基本移除，仅保留非常轻的描边与轻底色。</li>
<li><code>hover</code> 不再上浮明显位移，改为轻微底色染色与边框清晰化。</li>
<li>图标缩小并贴近文字，整体更像工具操作，而不是宣传入口。</li>
<li>保留现有图标语义与点击行为，不新增 loading、提示或确认流程。</li>
</ul>
<h3 id="_2-示例头像" tabindex="-1">2. 示例头像 <a class="header-anchor" href="#_2-示例头像" aria-label="Permalink to &quot;2. 示例头像&quot;"></a></h3>
<p>不再继续使用 <code>DiceBear avataaars</code> 这类模板化卡通头像，改为“自定义生成的人物 SVG 头像”。</p>
<p>目标气质：</p>
<ul>
<li>仍然保留“人物头像”的温度，而不是纯几何 identicon。</li>
<li>统一笔触、留白、头肩比例与背景构图。</li>
<li>颜色改为低饱和、柔和但不发灰，避免儿童卡通感。</li>
<li>每个示例头像通过名字稳定生成，不会每次刷新变化。</li>
</ul>
<p>设计原则：</p>
<ul>
<li>头像外圈只保留轻描边，不使用厚白边。</li>
<li>不做夸张旋转、过度放大或强烈发光 hover。</li>
<li>头像应与姓名、描述形成一个整体，而不是页面上最抢眼的元素。</li>
</ul>
<h3 id="_3-给我发这些就行-信息块" tabindex="-1">3. “给我发这些就行”信息块 <a class="header-anchor" href="#_3-给我发这些就行-信息块" aria-label="Permalink to &quot;3. “给我发这些就行”信息块&quot;"></a></h3>
<p>不再使用默认 Markdown fenced code block 承载这段内容，改为真正的信息卡结构。</p>
<p>结构方向：</p>
<ul>
<li>外层为一个轻容器，宽度适中，不铺得太满。</li>
<li>内部采用“字段列表”而不是“伪代码”呈现。</li>
<li>每一项由字段名和值组成，字段名弱化、值更清晰。</li>
<li>邮箱放在卡片底部的行动区，和说明模板分层。</li>
</ul>
<p>视觉方向：</p>
<ul>
<li>使用轻边框和浅底，而非发虚的大面积白雾块。</li>
<li>圆角保留，但收敛，不走“玻璃糖果卡片”路线。</li>
<li>通过行距、分隔线和字重建立清晰层级。</li>
<li>与上方友情链接卡片在语言上统一，但明显更安静。</li>
</ul>
<h2 id="不做的事" tabindex="-1">不做的事 <a class="header-anchor" href="#不做的事" aria-label="Permalink to &quot;不做的事&quot;"></a></h2>
<ul>
<li>不修改友情链接卡片的三列布局。</li>
<li>不修改“手动打乱”的业务逻辑。</li>
<li>不引入新的头像服务依赖。</li>
<li>不把整页重做成 GitHub 风格，只吸收其克制和秩序感。</li>
<li>不修改用户真实友情链接数据结构；仅调整示例数据的头像来源与展示方式。</li>
</ul>
<h2 id="预期文件范围" tabindex="-1">预期文件范围 <a class="header-anchor" href="#预期文件范围" aria-label="Permalink to &quot;预期文件范围&quot;"></a></h2>
<ul>
<li>修改：<code>D:\Blog\docs\friends\index.md</code></li>
<li>可能新增：<code>D:\Blog\docs\.vitepress\theme\utils\friendAvatar.ts</code></li>
<li>可能新增测试：<code>D:\Blog\tests\friends-page-style.test.mjs</code></li>
</ul>
<h2 id="验收标准" tabindex="-1">验收标准 <a class="header-anchor" href="#验收标准" aria-label="Permalink to &quot;验收标准&quot;"></a></h2>
<ul>
<li>“手动打乱”按钮观感明显更轻，不再像单独漂浮的白块。</li>
<li>示例头像不再是模板化卡通脸，而是稳定、统一、较成熟的自定义人物 SVG。</li>
<li>“给我发这些就行”从默认代码块改为真正的信息卡，层级更清楚，边界更干净。</li>
<li>页面功能不变，移动端可正常阅读。</li>
<li>本地测试与构建通过。</li>
</ul>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[阅读设置面板视觉重构设计]]></title>
            <link>https://blog.shkart.online/superpowers/specs/2026-03-26-reading-settings-panel-design.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/superpowers/specs/2026-03-26-reading-settings-panel-design.html</guid>
            <pubDate>Thu, 26 Mar 2026 15:32:26 GMT</pubDate>
            <description><![CDATA[日期：2026-03-26
执行者：Codex
 背景
当前阅读设置面板已经精简为“字体大小”和“聚焦模式”两项，但视觉上仍然存在较强的 AI 生成感，主要表现为：
- 外层面板的彩色渐变描边和较重阴]]></description>
            <content:encoded><![CDATA[<h1 id="阅读设置面板视觉重构设计" tabindex="-1">阅读设置面板视觉重构设计 <a class="header-anchor" href="#阅读设置面板视觉重构设计" aria-label="Permalink to &quot;阅读设置面板视觉重构设计&quot;"></a></h1>
<p>日期：2026-03-26
执行者：Codex</p>
<h2 id="背景" tabindex="-1">背景 <a class="header-anchor" href="#背景" aria-label="Permalink to &quot;背景&quot;"></a></h2>
<p>当前阅读设置面板已经精简为“字体大小”和“聚焦模式”两项，但视觉上仍然存在较强的 AI 生成感，主要表现为：</p>
<ul>
<li>外层面板的彩色渐变描边和较重阴影让组件显得浮夸。</li>
<li>内部卡片的层级过多，像“卡片套卡片”。</li>
<li>字体大小分段控件偏糖果色，缺少系统感。</li>
<li>聚焦模式一行中的 <code>Premium</code> 徽标和发光开关过于装饰化。</li>
</ul>
<h2 id="目标" tabindex="-1">目标 <a class="header-anchor" href="#目标" aria-label="Permalink to &quot;目标&quot;"></a></h2>
<ul>
<li>保持现有功能完全不变。</li>
<li>让阅读设置面板更接近 Apple 式柔和感，而不是炫彩玻璃风。</li>
<li>提升克制感、秩序感和成熟产品气质。</li>
</ul>
<h2 id="设计决策" tabindex="-1">设计决策 <a class="header-anchor" href="#设计决策" aria-label="Permalink to &quot;设计决策&quot;"></a></h2>
<h3 id="_1-外层面板" tabindex="-1">1. 外层面板 <a class="header-anchor" href="#_1-外层面板" aria-label="Permalink to &quot;1. 外层面板&quot;"></a></h3>
<ul>
<li>保留轻毛玻璃与柔和阴影。</li>
<li>移除当前高存在感的彩色渐变描边。</li>
<li>面板边界改为更轻的中性描边。</li>
</ul>
<h3 id="_2-内部分组区" tabindex="-1">2. 内部分组区 <a class="header-anchor" href="#_2-内部分组区" aria-label="Permalink to &quot;2. 内部分组区&quot;"></a></h3>
<ul>
<li><code>setting-card</code> 从强卡片感改为更平的分组容器。</li>
<li>减少“鼓起感”、高光感和额外装饰。</li>
<li>通过留白与间距建立层级，而不是靠厚重背景。</li>
</ul>
<h3 id="_3-字体大小控件" tabindex="-1">3. 字体大小控件 <a class="header-anchor" href="#_3-字体大小控件" aria-label="Permalink to &quot;3. 字体大小控件&quot;"></a></h3>
<ul>
<li>保留 <code>小 / 中 / 大</code> 三档逻辑不变。</li>
<li>视觉上改为更接近系统 segmented control。</li>
<li>未选中状态保持低对比度，选中状态使用柔和填充，不使用发光。</li>
</ul>
<h3 id="_4-聚焦模式控件" tabindex="-1">4. 聚焦模式控件 <a class="header-anchor" href="#_4-聚焦模式控件" aria-label="Permalink to &quot;4. 聚焦模式控件&quot;"></a></h3>
<ul>
<li>移除 <code>Premium</code> 徽标。</li>
<li>保留 switch 交互，但改成克制的系统式开关。</li>
<li>开启态只允许轻微染色，不允许紫色发光、霓虹边缘或夸张阴影。</li>
</ul>
<h2 id="不做的事" tabindex="-1">不做的事 <a class="header-anchor" href="#不做的事" aria-label="Permalink to &quot;不做的事&quot;"></a></h2>
<ul>
<li>不新增新的阅读设置项。</li>
<li>不修改聚焦模式逻辑。</li>
<li>不调整文章页面布局和内容显示逻辑。</li>
</ul>
<h2 id="验证标准" tabindex="-1">验证标准 <a class="header-anchor" href="#验证标准" aria-label="Permalink to &quot;验证标准&quot;"></a></h2>
<ul>
<li>阅读设置中不再出现 <code>Premium</code> 文案。</li>
<li>视觉上不再出现明显的渐变描边和发光开关。</li>
<li>文章页原有阅读设置功能保持可用。</li>
<li>本地测试与构建通过。</li>
</ul>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[分类筛选]]></title>
            <link>https://blog.shkart.online/categories/</link>
            <guid isPermaLink="false">https://blog.shkart.online/categories/</guid>
            <pubDate>Mon, 02 Feb 2026 04:55:50 GMT</pubDate>
            <description><![CDATA[&lt;script setup
import TagsPage from '../components/TagsPage.vue'
&lt;/script&gt;

&lt;TagsPage]]></description>
            <content:encoded><![CDATA[<TagsPage />]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[关于我]]></title>
            <link>https://blog.shkart.online/about/</link>
            <guid isPermaLink="false">https://blog.shkart.online/about/</guid>
            <pubDate>Thu, 29 Jan 2026 23:56:09 GMT</pubDate>
            <description><![CDATA[
<script setup>
import PageHeader from '../components/PageHeader.vue'
</script>

<div class="about-page">

<PageHeader 
  title="关于我"
  publish-date="2022-01-01T00:00:00"
  update-date="2024-09-20T00:00:00"
  :tags="['特殊页面']"
/>

<div class="about-avatar">
  <img src="/avatar.png" alt="Avatar" />
</div>

## ✨ 嘿，你好呀！

很高兴你能来到这里。

我是一个对技术充满热情的人，喜欢折腾、喜欢探索、喜欢把复杂的东西变得简单。这个小站是我在互联网上的一片自留地，记录着我的成长、思考和那些让我兴奋的技术发现。

> "代码改变世界，但热爱改变自己。"

## 🌟 为什么叫「星港」？

**Destiny's Hub · 星港**

每个人都在寻找属于自己的归宿。星港，是星辰汇聚的港湾，是思想停泊的驿站。在这里，我希望能：

<div class="feature-cards">
  <div class="feature-card">
    <img src="/icon-share.png" class="feature-icon" alt="分享技术" />
    <h4>分享技术</h4>
    <p>把学到的知识传递出去</p>
  </div>
  <div class="feature-card">
    <img src="/icon-think.png" class="feature-icon" alt="记录思考" />
    <h4>记录思考</h4>
    <p>写下那些闪光的灵感</p>
  </div>
  <div class="feature-card">
    <img src="/icon-friend.png" class="feature-icon" alt="结交朋友" />
    <h4>结交朋友</h4>
    <p>遇见志同道合的你</p>
  </div>
</div>

## 💻 我的技术栈

<div class="tech-badges">
  <div class="badge-category">
    <h5>🎨 前端</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Vue.js-4FC08D?style=flat-square&logoColor=white&logo=vue.js" alt="Vue.js" />
      <img src="https://img.shields.io/badge/React-61DAFB?style=flat-square&logoColor=white&logo=react" alt="React" />
      <img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logoColor=white&logo=typescript" alt="TypeScript" />
      <img src="https://img.shields.io/badge/Tailwind-06B6D4?style=flat-square&logoColor=white&logo=tailwindcss" alt="Tailwind" />
    </div>
  </div>
  <div class="badge-category">
    <h5>⚙️ 后端</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Java-ED8B00?style=flat-square&logoColor=white&logo=openjdk" alt="Java" />
      <img src="https://img.shields.io/badge/Spring_Boot-6DB33F?style=flat-square&logoColor=white&logo=springboot" alt="Spring Boot" />
      <img src="https://img.shields.io/badge/Scala-DC322F?style=flat-square&logoColor=white&logo=scala" alt="Scala" />
      <img src="https://img.shields.io/badge/Node.js-339933?style=flat-square&logoColor=white&logo=node.js" alt="Node.js" />
      <img src="https://img.shields.io/badge/Python-3776AB?style=flat-square&logoColor=white&logo=python" alt="Python" />
      <img src="https://img.shields.io/badge/Go-00ADD8?style=flat-square&logoColor=white&logo=go" alt="Go" />
    </div>
  </div>
  <div class="badge-category">
    <h5>🗄️ 数据库</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/PostgreSQL-336791?style=flat-square&logoColor=white&logo=postgresql" alt="PostgreSQL" />
      <img src="https://img.shields.io/badge/MongoDB-47A248?style=flat-square&logoColor=white&logo=mongodb" alt="MongoDB" />
      <img src="https://img.shields.io/badge/Redis-DC382D?style=flat-square&logoColor=white&logo=redis" alt="Redis" />
    </div>
  </div>
  <div class="badge-category">
    <h5>📊 大数据</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Spark-E25A1C?style=flat-square&logoColor=white&logo=apachespark" alt="Spark" />
      <img src="https://img.shields.io/badge/Hadoop-66CCFF?style=flat-square&logoColor=white&logo=apachehadoop" alt="Hadoop" />
      <img src="https://img.shields.io/badge/Flink-E6526F?style=flat-square&logoColor=white&logo=apacheflink" alt="Flink" />
      <img src="https://img.shields.io/badge/Kafka-231F20?style=flat-square&logoColor=white&logo=apachekafka" alt="Kafka" />
      <img src="https://img.shields.io/badge/Hive-FDEE21?style=flat-square&logoColor=white&logo=apachehive" alt="Hive" />
      <img src="https://img.shields.io/badge/Flume-0769AD?style=flat-square&logoColor=white" alt="Flume" />
      <img src="https://img.shields.io/badge/Azkaban-FF6600?style=flat-square&logoColor=white" alt="Azkaban" />
    </div>
  </div>
  <div class="badge-category">
    <h5>🚀 DevOps & 云</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Docker-2496ED?style=flat-square&logoColor=white&logo=docker" alt="Docker" />
      <img src="https://img.shields.io/badge/Kubernetes-326CE5?style=flat-square&logoColor=white&logo=kubernetes" alt="Kubernetes" />
      <img src="https://img.shields.io/badge/AWS-232F3E?style=flat-square&logoColor=white&logo=amazonaws" alt="AWS" />
      <img src="https://img.shields.io/badge/Cloudflare-F38020?style=flat-square&logoColor=white&logo=cloudflare" alt="Cloudflare" />
    </div>
  </div>
</div>

## 🎯 我的信条

<div class="belief-list">

- **持续学习** — 技术日新月异，保持好奇心
- **拥抱变化** — 不惧怕新事物，勇于尝试
- **分享即成长** — 教是最好的学
- **追求极致** — 细节决定品质

</div>

]]></description>
            <content:encoded><![CDATA[<div class="about-page">
<PageHeader 
  title="关于我"
  publish-date="2022-01-01T00:00:00"
  update-date="2024-09-20T00:00:00"
  :tags="['特殊页面']"
/>
<div class="about-avatar">
  <img src="/avatar.png" alt="Avatar" />
</div>
<h2 id="✨-嘿-你好呀" tabindex="-1">✨ 嘿，你好呀！ <a class="header-anchor" href="#✨-嘿-你好呀" aria-label="Permalink to &quot;✨ 嘿，你好呀！&quot;"></a></h2>
<p>很高兴你能来到这里。</p>
<p>我是一个对技术充满热情的人，喜欢折腾、喜欢探索、喜欢把复杂的东西变得简单。这个小站是我在互联网上的一片自留地，记录着我的成长、思考和那些让我兴奋的技术发现。</p>
<blockquote>
<p>&quot;代码改变世界，但热爱改变自己。&quot;</p>
</blockquote>
<h2 id="🌟-为什么叫「星港」" tabindex="-1">🌟 为什么叫「星港」？ <a class="header-anchor" href="#🌟-为什么叫「星港」" aria-label="Permalink to &quot;🌟 为什么叫「星港」？&quot;"></a></h2>
<p><strong>Destiny's Hub · 星港</strong></p>
<p>每个人都在寻找属于自己的归宿。星港，是星辰汇聚的港湾，是思想停泊的驿站。在这里，我希望能：</p>
<div class="feature-cards">
  <div class="feature-card">
    <img src="/icon-share.png" class="feature-icon" alt="分享技术" />
    <h4>分享技术</h4>
    <p>把学到的知识传递出去</p>
  </div>
  <div class="feature-card">
    <img src="/icon-think.png" class="feature-icon" alt="记录思考" />
    <h4>记录思考</h4>
    <p>写下那些闪光的灵感</p>
  </div>
  <div class="feature-card">
    <img src="/icon-friend.png" class="feature-icon" alt="结交朋友" />
    <h4>结交朋友</h4>
    <p>遇见志同道合的你</p>
  </div>
</div>
<h2 id="💻-我的技术栈" tabindex="-1">💻 我的技术栈 <a class="header-anchor" href="#💻-我的技术栈" aria-label="Permalink to &quot;💻 我的技术栈&quot;"></a></h2>
<div class="tech-badges">
  <div class="badge-category">
    <h5>🎨 前端</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Vue.js-4FC08D?style=flat-square&logoColor=white&logo=vue.js" alt="Vue.js" />
      <img src="https://img.shields.io/badge/React-61DAFB?style=flat-square&logoColor=white&logo=react" alt="React" />
      <img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logoColor=white&logo=typescript" alt="TypeScript" />
      <img src="https://img.shields.io/badge/Tailwind-06B6D4?style=flat-square&logoColor=white&logo=tailwindcss" alt="Tailwind" />
    </div>
  </div>
  <div class="badge-category">
    <h5>⚙️ 后端</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Java-ED8B00?style=flat-square&logoColor=white&logo=openjdk" alt="Java" />
      <img src="https://img.shields.io/badge/Spring_Boot-6DB33F?style=flat-square&logoColor=white&logo=springboot" alt="Spring Boot" />
      <img src="https://img.shields.io/badge/Scala-DC322F?style=flat-square&logoColor=white&logo=scala" alt="Scala" />
      <img src="https://img.shields.io/badge/Node.js-339933?style=flat-square&logoColor=white&logo=node.js" alt="Node.js" />
      <img src="https://img.shields.io/badge/Python-3776AB?style=flat-square&logoColor=white&logo=python" alt="Python" />
      <img src="https://img.shields.io/badge/Go-00ADD8?style=flat-square&logoColor=white&logo=go" alt="Go" />
    </div>
  </div>
  <div class="badge-category">
    <h5>🗄️ 数据库</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/PostgreSQL-336791?style=flat-square&logoColor=white&logo=postgresql" alt="PostgreSQL" />
      <img src="https://img.shields.io/badge/MongoDB-47A248?style=flat-square&logoColor=white&logo=mongodb" alt="MongoDB" />
      <img src="https://img.shields.io/badge/Redis-DC382D?style=flat-square&logoColor=white&logo=redis" alt="Redis" />
    </div>
  </div>
  <div class="badge-category">
    <h5>📊 大数据</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Spark-E25A1C?style=flat-square&logoColor=white&logo=apachespark" alt="Spark" />
      <img src="https://img.shields.io/badge/Hadoop-66CCFF?style=flat-square&logoColor=white&logo=apachehadoop" alt="Hadoop" />
      <img src="https://img.shields.io/badge/Flink-E6526F?style=flat-square&logoColor=white&logo=apacheflink" alt="Flink" />
      <img src="https://img.shields.io/badge/Kafka-231F20?style=flat-square&logoColor=white&logo=apachekafka" alt="Kafka" />
      <img src="https://img.shields.io/badge/Hive-FDEE21?style=flat-square&logoColor=white&logo=apachehive" alt="Hive" />
      <img src="https://img.shields.io/badge/Flume-0769AD?style=flat-square&logoColor=white" alt="Flume" />
      <img src="https://img.shields.io/badge/Azkaban-FF6600?style=flat-square&logoColor=white" alt="Azkaban" />
    </div>
  </div>
  <div class="badge-category">
    <h5>🚀 DevOps & 云</h5>
    <div class="badges">
      <img src="https://img.shields.io/badge/Docker-2496ED?style=flat-square&logoColor=white&logo=docker" alt="Docker" />
      <img src="https://img.shields.io/badge/Kubernetes-326CE5?style=flat-square&logoColor=white&logo=kubernetes" alt="Kubernetes" />
      <img src="https://img.shields.io/badge/AWS-232F3E?style=flat-square&logoColor=white&logo=amazonaws" alt="AWS" />
      <img src="https://img.shields.io/badge/Cloudflare-F38020?style=flat-square&logoColor=white&logo=cloudflare" alt="Cloudflare" />
    </div>
  </div>
</div>
<h2 id="🎯-我的信条" tabindex="-1">🎯 我的信条 <a class="header-anchor" href="#🎯-我的信条" aria-label="Permalink to &quot;🎯 我的信条&quot;"></a></h2>
<div class="belief-list">
<ul>
<li><strong>持续学习</strong> — 技术日新月异，保持好奇心</li>
<li><strong>拥抱变化</strong> — 不惧怕新事物，勇于尝试</li>
<li><strong>分享即成长</strong> — 教是最好的学</li>
<li><strong>追求极致</strong> — 细节决定品质</li>
</ul>
</div>
<hr>
<div class="outro">
<p>感谢你花时间了解我。</p>
<p>如果我的文章对你有所帮助，或者你只是想打个招呼，都欢迎随时联系我。在这个广阔的互联网上，能与你相遇，是我的幸运。✨</p>
<p><strong>愿你也能找到属于自己的星港。</strong></p>
</div>
</div>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[文章归档]]></title>
            <link>https://blog.shkart.online/archives/</link>
            <guid isPermaLink="false">https://blog.shkart.online/archives/</guid>
            <pubDate>Thu, 29 Jan 2026 23:56:09 GMT</pubDate>
            <description><![CDATA[&lt;script setup
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
import { arti]]></description>
            <content:encoded><![CDATA[<div class="archives-shell">
  <div class="archives-page">
<h1 id="📁-文章归档" tabindex="-1">📁 文章归档 <a class="header-anchor" href="#📁-文章归档" aria-label="Permalink to &quot;📁 文章归档&quot;"></a></h1>
  <p class="archives-count">共 {{ articles.length }} 篇文章</p>
  <div class="timeline">
    <div
      v-for="[year, items] in groupedArticles"
      :id="`year-${year}`"
      :key="year"
      :data-year="year"
      class="timeline-year"
    >
      <h2 class="year-title">{{ year }}</h2>
      <ul class="article-list">
        <li v-for="article in items" :key="article.link" class="article-item">
          <span class="article-date">{{ formatDate(article.date) }}</span>
          <a :href="article.link" class="article-title">{{ article.title }}</a>
        </li>
      </ul>
    </div>
  </div>
  </div>
  <div
    v-if="archiveOverview.length > 0"
    class="archives-fog-rail"
  >
    <aside
      class="archives-fog-index"
      aria-label="归档索引"
    >
      <p class="fog-index-label">归档索引</p>
      <nav class="fog-index-nav">
        <a
          v-for="(entry, index) in archiveOverview"
          :key="entry.year"
          :href="`#year-${entry.year}`"
          @click.prevent="jumpToYear(entry.year)"
          class="fog-index-link"
          :class="{ active: activeYear === entry.year }"
          :style="{ '--fog-index-delay': `${index * 40}ms` }"
        >
          <span class="fog-index-year">{{ entry.year }}</span>
          <span class="fog-index-count">{{ formatCount(entry.count) }}</span>
        </a>
      </nav>
    </aside>
  </div>
</div>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[标签筛选]]></title>
            <link>https://blog.shkart.online/tags/</link>
            <guid isPermaLink="false">https://blog.shkart.online/tags/</guid>
            <pubDate>Thu, 29 Jan 2026 23:56:09 GMT</pubDate>
            <description><![CDATA[&lt;script setup
import TagsPage from '../components/TagsPage.vue'
&lt;/script&gt;

&lt;TagsPage]]></description>
            <content:encoded><![CDATA[<TagsPage />]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[一键发布测试文章]]></title>
            <link>https://blog.shkart.online/posts/test-oneclick.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/test-oneclick.html</guid>
            <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This is a test article for one-click publish feature.

/461156

5161651

 nishi1

da]]></description>
            <content:encoded><![CDATA[<p>This is a test article for one-click publish feature.</p>
<p>/461156</p>
<p>5161651</p>
<h2 id="nishi1" tabindex="-1">nishi1 <a class="header-anchor" href="#nishi1" aria-label="Permalink to &quot;nishi1&quot;"></a></h2>
<p>da</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[写给焦虑的自己：你已经做得很好了]]></title>
            <link>https://blog.shkart.online/posts/letter-to-anxious-self.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/letter-to-anxious-self.html</guid>
            <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[
最近完成了一个阶段性的节点，回顾这几年，突然很想对一直焦虑的自己说几句话。

]]></description>
            <content:encoded><![CDATA[<p>最近完成了一个阶段性的节点，回顾这几年，突然很想对一直焦虑的自己说几句话。</p>
<hr>
<p>亲爱的自己：</p>
<p>我知道你这几年过得不容易。</p>
<p>每次面对挑战你都焦虑得睡不着，生怕搞砸了。
每次尝试新事物你都战战兢兢，觉得自己不够格。
每次看到别人发朋友圈你都会暗暗比较，觉得自己落后了。</p>
<p>你总是觉得不够好，总是在怀疑自己。</p>
<p>但我想告诉你：你已经做得很好了。</p>
<hr>
<p>还记得刚开始的时候吗？</p>
<p>你连最基础的东西都不懂，第一次尝试失败了好多次。</p>
<p>现在呢？你可以独立完成复杂的任务，可以和人讨论专业问题，可以获得一些认可。</p>
<p>这是很大的进步。</p>
<p>你可能会说：&quot;别人进步更大啊。&quot;</p>
<p>是的，总有人比你强。但那不应该成为否定自己的理由。</p>
<p>你的参照系应该是昨天的自己，而不是今天的别人。</p>
<hr>
<p>还有那些你觉得&quot;失败&quot;的时刻。</p>
<p>那次搞砸、那次被拒、那次没做好...</p>
<p>当时你难受得不行，觉得天塌了。</p>
<p>现在回头看，其实也没什么大不了。</p>
<p>你从每次挫败里都学到了东西。你比那个时候更强了。</p>
<p>那些痛苦的经历，后来都成了你的铠甲。</p>
<hr>
<p>你总是担心未来。</p>
<p>&quot;做不好怎么办？&quot;
&quot;失败了怎么办？&quot;
&quot;这条路选错了怎么办？&quot;</p>
<p>我没办法告诉你一切都会顺利，因为生活不是这样的。</p>
<p>但我可以告诉你：<strong>过去那些让你焦虑的事，你都扛过来了。</strong></p>
<p>未来的挑战来的时候，你也能扛过去。</p>
<p>因为你一直在变强。</p>
<hr>
<p>所以，停止苛责自己吧。</p>
<p>你不需要完美。
你不需要比所有人都强。
你不需要时刻证明自己。</p>
<p>你只需要：做好手上的事，善待身边的人，偶尔停下来歇一歇。</p>
<p>焦虑可以有，但别让它成为生活的底色。</p>
<p>你的路还很长，不用急着赶路。</p>
<hr>
<p>最后，我想说谢谢你。</p>
<p>谢谢你在那么多艰难的时刻没有放弃。
谢谢你跌倒之后还能爬起来继续走。
谢谢你一直在努力成为更好的人。</p>
<p>往后的路更长。</p>
<p>带着这些年的成长，带着那些伤疤和收获，继续走下去吧。</p>
<p>你会做得很好的。</p>
<p>带着祝福，
正在慢慢学会爱自己的你</p>
<hr>
<blockquote>
<p>写给所有正在焦虑的人：</p>
<p>你不完美，但你一直在努力。这本身就值得被肯定。</p>
<p>今天也辛苦了。</p>
</blockquote>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[WWDC 25 前瞻：iOS 19 和 macOS 16 的传言汇总]]></title>
            <link>https://blog.shkart.online/posts/wwdc-2025-preview.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/wwdc-2025-preview.html</guid>
            <pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[WWDC 2025 定档 6 月 9 日，库克又要在乔布斯剧院发他那一年一度的 Keynote。

作为年年熬夜看直播的老果粉，今年的传言确实比往年更劲爆一些。整理汇总如下。

 iOS 19]]></description>
            <content:encoded><![CDATA[<p>WWDC 2025 定档 6 月 9 日，库克又要在乔布斯剧院发他那一年一度的 Keynote。</p>
<p>作为年年熬夜看直播的老果粉，今年的传言确实比往年更劲爆一些。整理汇总如下。</p>
<h2 id="ios-19-界面大改" tabindex="-1">iOS 19：界面大改？ <a class="header-anchor" href="#ios-19-界面大改" aria-label="Permalink to &quot;iOS 19：界面大改？&quot;"></a></h2>
<p>Mark Gurman 那边透露，今年 iOS 会有「近年来最大的界面改动」。</p>
<p>传言的变化包括：</p>
<ul>
<li><strong>控制中心重新设计</strong>：模块化布局，可以自由排列</li>
<li><strong>设置 App 重构</strong>：分类逻辑优化，终于不用翻八层找一个开关了</li>
<li><strong>锁屏交互增强</strong>：更多快捷操作，可能类似已经有的灵动岛思路</li>
</ul>
<p>我个人最期待的是设置重构，那个 App 真的已经乱到让人抓狂了。</p>
<h2 id="macos-16-继续打磨" tabindex="-1">macOS 16：继续打磨 <a class="header-anchor" href="#macos-16-继续打磨" aria-label="Permalink to &quot;macOS 16：继续打磨&quot;"></a></h2>
<p>Mac 这边没有大新闻，传言主要集中在：</p>
<ul>
<li><strong>系统设置继续优化</strong>：iOS 风格的设置 App 上次骂声一片，终于要改了</li>
<li><strong>窗口管理增强</strong>：原生的窗口分屏功能更强，可能会对 Magnet 之类的第三方工具造成冲击</li>
<li><strong>Spotlight 升级</strong>：集成更多 AI 能力，可能叫 Apple Intelligence</li>
</ul>
<p>说到 Apple Intelligence，这是今年的重头戏。</p>
<h2 id="apple-intelligence-2-0" tabindex="-1">Apple Intelligence 2.0 <a class="header-anchor" href="#apple-intelligence-2-0" aria-label="Permalink to &quot;Apple Intelligence 2.0&quot;"></a></h2>
<p>去年 WWDC 首发的 AI 功能，体验只能说及格。写作辅助还行，Siri 依然智障。</p>
<p>今年传言会有大升级：</p>
<ul>
<li><strong>Siri 重构</strong>：底层换大模型，终于可以多轮对话了</li>
<li><strong>系统级 AI 助手</strong>：类似 Copilot 的概念，跨 App 调用能力</li>
<li><strong>更多设备支持</strong>：A17 Pro 起步，M1 起步</li>
</ul>
<p>不过，AI 功能在中国大陆能不能用，依然是个问号。</p>
<h2 id="我的预测" tabindex="-1">我的预测 <a class="header-anchor" href="#我的预测" aria-label="Permalink to &quot;我的预测&quot;"></a></h2>
<ol>
<li>iOS 19 界面确实会改，但不会像 iOS 7 那么激进</li>
<li>Apple Intelligence 会增强，但杀手级应用还得等</li>
<li>不会有新硬件发布，那些说有 AR 眼镜的都是瞎猜</li>
</ol>
<p>北京时间 6 月 10 日凌晨 1 点，我们直播见。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[通义千问 2.5 开源：阿里的开源大模型之路]]></title>
            <link>https://blog.shkart.online/posts/qwen-25-opensource.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/qwen-25-opensource.html</guid>
            <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[
阿里在开源大模型上一直挺积极，通义千问 2.5 继续了这个路线。

## 模型家族

Qwen 2.5 包括多个尺寸：

- 0.5B / 1.5B / 3B：手机端可跑
- 7B / 14B：消费级显卡可跑
- 32B / 72B：需要专业显卡
- Coder 系列：专门针对代码优化
- Math 系列：专门针对数学优化

全部 Apache 2.0 开源，商用友好。

## 性能表现

72B-Instruct 官方测试：

| 测试项 | Qwen 2.5 72B | Llama 3.1 70B | GPT-4o mini |
|]]></description>
            <content:encoded><![CDATA[<p>阿里在开源大模型上一直挺积极，通义千问 2.5 继续了这个路线。</p>
<h2 id="模型家族" tabindex="-1">模型家族 <a class="header-anchor" href="#模型家族" aria-label="Permalink to &quot;模型家族&quot;"></a></h2>
<p>Qwen 2.5 包括多个尺寸：</p>
<ul>
<li>0.5B / 1.5B / 3B：手机端可跑</li>
<li>7B / 14B：消费级显卡可跑</li>
<li>32B / 72B：需要专业显卡</li>
<li>Coder 系列：专门针对代码优化</li>
<li>Math 系列：专门针对数学优化</li>
</ul>
<p>全部 Apache 2.0 开源，商用友好。</p>
<h2 id="性能表现" tabindex="-1">性能表现 <a class="header-anchor" href="#性能表现" aria-label="Permalink to &quot;性能表现&quot;"></a></h2>
<p>72B-Instruct 官方测试：</p>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>Qwen 2.5 72B</th>
<th>Llama 3.1 70B</th>
<th>GPT-4o mini</th>
</tr>
</thead>
<tbody>
<tr>
<td>MMLU</td>
<td>86.1</td>
<td>83.6</td>
<td>82.0</td>
</tr>
<tr>
<td>HumanEval</td>
<td>86.6</td>
<td>80.5</td>
<td>87.2</td>
</tr>
<tr>
<td>MATH</td>
<td>83.1</td>
<td>68.0</td>
<td>70.2</td>
</tr>
<tr>
<td>中文理解</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
</tbody>
</table>
<p>中文能力是强项，毕竟是国内团队做的。</p>
<h2 id="本地部署" tabindex="-1">本地部署 <a class="header-anchor" href="#本地部署" aria-label="Permalink to &quot;本地部署&quot;"></a></h2>
<p>用 Ollama 最简单：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 跑 7B 版本（需要 8GB 显存）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ollama</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> qwen2.5:7b</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 跑 14B 版本（需要 16GB 显存）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ollama</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> qwen2.5:14b</span></span></code></pre>
</div><p>7B 版本在笔记本上跑得很流畅，日常问答足够。</p>
<h2 id="特色功能" tabindex="-1">特色功能 <a class="header-anchor" href="#特色功能" aria-label="Permalink to &quot;特色功能&quot;"></a></h2>
<h3 id="代码能力" tabindex="-1">代码能力 <a class="header-anchor" href="#代码能力" aria-label="Permalink to &quot;代码能力&quot;"></a></h3>
<p>Qwen2.5-Coder 是单独的代码模型，在 HumanEval 上得分 92.7%。</p>
<p>可以替代一部分 Copilot 的功能。</p>
<h3 id="长上下文" tabindex="-1">长上下文 <a class="header-anchor" href="#长上下文" aria-label="Permalink to &quot;长上下文&quot;"></a></h3>
<p>支持 128K 上下文，把整个项目扔进去问问题没问题。</p>
<h3 id="工具调用" tabindex="-1">工具调用 <a class="header-anchor" href="#工具调用" aria-label="Permalink to &quot;工具调用&quot;"></a></h3>
<p>支持 Function Calling，可以接入外部 API。</p>
<h2 id="和其他国产模型对比" tabindex="-1">和其他国产模型对比 <a class="header-anchor" href="#和其他国产模型对比" aria-label="Permalink to &quot;和其他国产模型对比&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>模型</th>
<th>开源</th>
<th>中文能力</th>
<th>代码能力</th>
<th>部署难度</th>
</tr>
</thead>
<tbody>
<tr>
<td>Qwen 2.5</td>
<td>✅</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>简单</td>
</tr>
<tr>
<td>DeepSeek</td>
<td>✅</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>中等</td>
</tr>
<tr>
<td>百川</td>
<td>✅</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
<td>简单</td>
</tr>
<tr>
<td>ChatGLM</td>
<td>✅</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
<td>简单</td>
</tr>
</tbody>
</table>
<p>Qwen 和 DeepSeek 是目前国产开源的第一梯队。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Qwen 2.5 是学习和实验的好选择：</p>
<ul>
<li>开源免费</li>
<li>中文效果好</li>
<li>部署简单</li>
<li>社区活跃</li>
</ul>
<p>对于想在本地跑 AI 模型的同学，强烈推荐试试。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[我和焦虑和解了]]></title>
            <link>https://blog.shkart.online/posts/graduation-anxiety-reconciliation.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/graduation-anxiety-reconciliation.html</guid>
            <pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[最近整理了一下这几年的日记和笔记，发现自己写了很多关于焦虑的内容。

坐在桌前翻着这些文字，想了很多。

 曾经的那些焦虑

刚踏入社会时焦虑适应不了职场，怕被同龄人甩开。

后来焦虑]]></description>
            <content:encoded><![CDATA[<p>最近整理了一下这几年的日记和笔记，发现自己写了很多关于焦虑的内容。</p>
<p>坐在桌前翻着这些文字，想了很多。</p>
<h2 id="曾经的那些焦虑" tabindex="-1">曾经的那些焦虑 <a class="header-anchor" href="#曾经的那些焦虑" aria-label="Permalink to &quot;曾经的那些焦虑&quot;"></a></h2>
<p>刚踏入社会时焦虑适应不了职场，怕被同龄人甩开。</p>
<p>后来焦虑绩效不够好，怕影响发展和薪资。</p>
<p>再后来焦虑没有核心竞争力，怕被行业淘汰。</p>
<p>现在焦虑方向选得对不对，怕错过最佳时机。</p>
<p>回头看，这几年我好像一直在焦虑。</p>
<h2 id="焦虑真的那么可怕吗" tabindex="-1">焦虑真的那么可怕吗 <a class="header-anchor" href="#焦虑真的那么可怕吗" aria-label="Permalink to &quot;焦虑真的那么可怕吗&quot;"></a></h2>
<p>有意思的是，那些曾经令我彻夜难眠的事情，大多数都过去了。</p>
<p>担心适应不了？适应了。
担心绩效不行？也还行。
担心能力不够？慢慢补上了。</p>
<p>不是说一切都顺利，而是：<strong>那些&quot;最坏的情况&quot;很少真的发生。</strong></p>
<p>即使发生了，我也没有想象中那么脆弱。</p>
<h2 id="我学到的几件事" tabindex="-1">我学到的几件事 <a class="header-anchor" href="#我学到的几件事" aria-label="Permalink to &quot;我学到的几件事&quot;"></a></h2>
<h3 id="_1-焦虑是一种-预支的痛苦" tabindex="-1">1. 焦虑是一种&quot;预支的痛苦&quot; <a class="header-anchor" href="#_1-焦虑是一种-预支的痛苦" aria-label="Permalink to &quot;1. 焦虑是一种&quot;预支的痛苦&quot;&quot;"></a></h3>
<p>很多焦虑是在为没发生的事情担心。</p>
<p>&quot;失败了怎么办&quot;——还没失败呢。
&quot;被拒绝了怎么办&quot;——还没被拒呢。</p>
<p>这些&quot;预支&quot;的痛苦，让我提前经历了失败，但实际上什么都没发生。</p>
<p>想明白这点后，我开始练习一种心态：<strong>事情没发生之前，不提前为最坏结果买单。</strong></p>
<h3 id="_2-行动是缓解焦虑的最好方法" tabindex="-1">2. 行动是缓解焦虑的最好方法 <a class="header-anchor" href="#_2-行动是缓解焦虑的最好方法" aria-label="Permalink to &quot;2. 行动是缓解焦虑的最好方法&quot;"></a></h3>
<p>躺在床上想一件事，只会越想越焦虑。</p>
<p>站起来做一点什么，哪怕只是迈出一小步，焦虑就会减轻。</p>
<p>因为焦虑的本质是失控感。做点什么，哪怕只是一小步，就能重新拿回一点控制权。</p>
<h3 id="_3-允许自己不那么强大" tabindex="-1">3. 允许自己不那么强大 <a class="header-anchor" href="#_3-允许自己不那么强大" aria-label="Permalink to &quot;3. 允许自己不那么强大&quot;"></a></h3>
<p>以前我总觉得焦虑是软弱的表现，压着不说。</p>
<p>后来发现，承认&quot;我现在很焦虑&quot;，反而更容易处理。</p>
<p>对朋友、对家人、甚至对自己坦白：&quot;这件事让我很有压力。&quot;</p>
<p>说出来，压力就卸下来一半了。</p>
<h3 id="_4-每个阶段都会有新的焦虑" tabindex="-1">4. 每个阶段都会有新的焦虑 <a class="header-anchor" href="#_4-每个阶段都会有新的焦虑" aria-label="Permalink to &quot;4. 每个阶段都会有新的焦虑&quot;"></a></h3>
<p>某个阶段结束了，不代表从此就不焦虑了。</p>
<p>工作会有工作的焦虑，之后还有其他的、更大的...</p>
<p>焦虑会一直在，问题是怎么和它相处。</p>
<h2 id="和焦虑-和解-是什么意思" tabindex="-1">和焦虑&quot;和解&quot;是什么意思 <a class="header-anchor" href="#和焦虑-和解-是什么意思" aria-label="Permalink to &quot;和焦虑&quot;和解&quot;是什么意思&quot;"></a></h2>
<p>不是说&quot;我再也不焦虑了&quot;，那不现实。</p>
<p>而是：</p>
<ul>
<li>知道焦虑会来，也会走</li>
<li>不把焦虑当成敌人，而当成信号</li>
<li>在焦虑的时候，依然能做该做的事</li>
</ul>
<p>就像运动时的肌肉酸痛，不舒服，但说明在成长。</p>
<p>焦虑是心理上的&quot;酸痛&quot;，说明你在面对重要的事情。</p>
<p>写完这篇文章的时候，我突然觉得轻松了一点。</p>
<p>不是因为焦虑消失了。是因为我终于不再觉得焦虑是个需要“战胜”的敌人。它更像是一个老朋友，每次你面对重要的事情时它都会来，提醒你“这件事对你很重要”。</p>
<p>知道它会来，也知道它会走。这就够了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Claude 3.5 Computer Use：AI 可以操作电脑了]]></title>
            <link>https://blog.shkart.online/posts/claude-computer-use.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/claude-computer-use.html</guid>
            <pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[今天 Anthropic 正式开放了 Claude 的 Computer Use 功能。

这是一个里程碑：AI 终于能像人一样操作电脑了。

 什么是 Computer Use

简单说]]></description>
            <content:encoded><![CDATA[<p>今天 Anthropic 正式开放了 Claude 的 Computer Use 功能。</p>
<p>这是一个里程碑：AI 终于能像人一样操作电脑了。</p>
<h2 id="什么是-computer-use" tabindex="-1">什么是 Computer Use <a class="header-anchor" href="#什么是-computer-use" aria-label="Permalink to &quot;什么是 Computer Use&quot;"></a></h2>
<p>简单说，Claude 可以：</p>
<ul>
<li>看到你的屏幕</li>
<li>移动鼠标</li>
<li>点击按钮</li>
<li>输入文字</li>
<li>执行完整的工作流</li>
</ul>
<p>比如你说：&quot;帮我在 Excel 里做一个销售数据图表&quot;，它会：</p>
<ol>
<li>打开 Excel</li>
<li>输入数据</li>
<li>选择数据范围</li>
<li>插入图表</li>
<li>调整样式</li>
</ol>
<p>全程自动完成。</p>
<h2 id="实测效果" tabindex="-1">实测效果 <a class="header-anchor" href="#实测效果" aria-label="Permalink to &quot;实测效果&quot;"></a></h2>
<p>测试了几个场景：</p>
<h3 id="网页操作" tabindex="-1">网页操作 <a class="header-anchor" href="#网页操作" aria-label="Permalink to &quot;网页操作&quot;"></a></h3>
<p>&quot;帮我在 GitHub 上 star 这个仓库&quot; - ✅ 成功</p>
<p>&quot;帮我发一条微博&quot; - ⚠️ 能打开网页，但中文输入有点问题</p>
<h3 id="软件操作" tabindex="-1">软件操作 <a class="header-anchor" href="#软件操作" aria-label="Permalink to &quot;软件操作&quot;"></a></h3>
<p>&quot;用 PS 给这张图加个滤镜&quot; - ✅ 成功，虽然选的滤镜不是我最想要的</p>
<p>&quot;在终端里运行 npm install&quot; - ✅ 成功</p>
<h3 id="复杂任务" tabindex="-1">复杂任务 <a class="header-anchor" href="#复杂任务" aria-label="Permalink to &quot;复杂任务&quot;"></a></h3>
<p>&quot;帮我整理下载文件夹，把图片、文档、视频分类&quot; - ✅ 成功，花了两分钟</p>
<h2 id="技术原理" tabindex="-1">技术原理 <a class="header-anchor" href="#技术原理" aria-label="Permalink to &quot;技术原理&quot;"></a></h2>
<ol>
<li><strong>视觉理解</strong>：通过截图理解当前屏幕内容</li>
<li><strong>操作规划</strong>：把任务分解成一系列操作步骤</li>
<li><strong>执行操作</strong>：调用系统 API 控制鼠标键盘</li>
<li><strong>反馈循环</strong>：操作后再次截图，确认结果</li>
</ol>
<p>每次操作都会确认，不会失控。</p>
<h2 id="怎么用" tabindex="-1">怎么用 <a class="header-anchor" href="#怎么用" aria-label="Permalink to &quot;怎么用&quot;"></a></h2>
<p>目前有几种方式：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 使用官方 Docker 镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8080:8080</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> anthropic/computer-use</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 或者用 Python SDK</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> anthropic</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 需要在允许的环境中运行</span></span></code></pre>
</div><p>注意：出于安全考虑，建议在虚拟机或沙盒环境中使用。</p>
<h2 id="局限性" tabindex="-1">局限性 <a class="header-anchor" href="#局限性" aria-label="Permalink to &quot;局限性&quot;"></a></h2>
<ol>
<li><strong>速度慢</strong>：比人类操作慢很多，每步都要截图分析</li>
<li><strong>容易出错</strong>：UI 变化、弹窗会让它困惑</li>
<li><strong>安全风险</strong>：让 AI 控制电脑需要谨慎</li>
</ol>
<h2 id="对未来的影响" tabindex="-1">对未来的影响 <a class="header-anchor" href="#对未来的影响" aria-label="Permalink to &quot;对未来的影响&quot;"></a></h2>
<p>这是 AI Agent 的一大步。</p>
<p>以后可能真的会有&quot;AI 员工&quot;帮你处理重复性工作：填表格、整理文件、发邮件...</p>
<p>作为学生，学会给 AI 下达正确的指令，可能比自己动手更重要。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Gemini 2.0 Flash 实测：谷歌终于追上来了]]></title>
            <link>https://blog.shkart.online/posts/gemini-2-flash-review.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/gemini-2-flash-review.html</guid>
            <pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[
谷歌的 AI 一直给人"赶不上"的感觉，Gemini 1.0 发布时被 GPT-4 吊打。

但 Gemini 2.0 让我改观了，特别是 Flash 版本。

## 版本区分

Gemini 2.0 分几个版本：

- **Flash**：速度最快，免费，适合日常使用
- **Pro**：均衡型，需要订阅
- **Ultra**：最强，企业级

Flash 足够日常使用，而且完全免费。

## 多模态能力

这是 Gemini 的强项。

可以直接上传图片、视频、PDF，它都能理解。测试了几个场景：

### 识别手写笔记

把课堂手写笔记拍照上传，让它整理成 Markdown。

识别准确率 95%+，连潦草的字也能认。GPT-4V 在这个任务上偶尔会出错。

### 分析 YouTube 视频

直接贴视频链接，问它"这个视频讲了什么"。

能给出准确的内容摘要和时间戳。B站 视频目前还不支持。

### 代码截图理解

把报错截图贴进去，它能识别代码和错误信息，给出解决方案。

## 和 GPT-4o 对比

| 能力 | Gemini 2.0 Flash | GPT-4o |
|]]></description>
            <content:encoded><![CDATA[<p>谷歌的 AI 一直给人&quot;赶不上&quot;的感觉，Gemini 1.0 发布时被 GPT-4 吊打。</p>
<p>但 Gemini 2.0 让我改观了，特别是 Flash 版本。</p>
<h2 id="版本区分" tabindex="-1">版本区分 <a class="header-anchor" href="#版本区分" aria-label="Permalink to &quot;版本区分&quot;"></a></h2>
<p>Gemini 2.0 分几个版本：</p>
<ul>
<li><strong>Flash</strong>：速度最快，免费，适合日常使用</li>
<li><strong>Pro</strong>：均衡型，需要订阅</li>
<li><strong>Ultra</strong>：最强，企业级</li>
</ul>
<p>Flash 足够日常使用，而且完全免费。</p>
<h2 id="多模态能力" tabindex="-1">多模态能力 <a class="header-anchor" href="#多模态能力" aria-label="Permalink to &quot;多模态能力&quot;"></a></h2>
<p>这是 Gemini 的强项。</p>
<p>可以直接上传图片、视频、PDF，它都能理解。测试了几个场景：</p>
<h3 id="识别手写笔记" tabindex="-1">识别手写笔记 <a class="header-anchor" href="#识别手写笔记" aria-label="Permalink to &quot;识别手写笔记&quot;"></a></h3>
<p>把课堂手写笔记拍照上传，让它整理成 Markdown。</p>
<p>识别准确率 95%+，连潦草的字也能认。GPT-4V 在这个任务上偶尔会出错。</p>
<h3 id="分析-youtube-视频" tabindex="-1">分析 YouTube 视频 <a class="header-anchor" href="#分析-youtube-视频" aria-label="Permalink to &quot;分析 YouTube 视频&quot;"></a></h3>
<p>直接贴视频链接，问它&quot;这个视频讲了什么&quot;。</p>
<p>能给出准确的内容摘要和时间戳。B站 视频目前还不支持。</p>
<h3 id="代码截图理解" tabindex="-1">代码截图理解 <a class="header-anchor" href="#代码截图理解" aria-label="Permalink to &quot;代码截图理解&quot;"></a></h3>
<p>把报错截图贴进去，它能识别代码和错误信息，给出解决方案。</p>
<h2 id="和-gpt-4o-对比" tabindex="-1">和 GPT-4o 对比 <a class="header-anchor" href="#和-gpt-4o-对比" aria-label="Permalink to &quot;和 GPT-4o 对比&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>能力</th>
<th>Gemini 2.0 Flash</th>
<th>GPT-4o</th>
</tr>
</thead>
<tbody>
<tr>
<td>响应速度</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
</tr>
<tr>
<td>图像理解</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
<tr>
<td>代码能力</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>中文能力</td>
<td>⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
<tr>
<td>价格</td>
<td>免费</td>
<td>$20/月</td>
</tr>
</tbody>
</table>
<p>如果主要需求是图像理解和快速回答，Flash 完全够用。</p>
<h2 id="使用方式" tabindex="-1">使用方式 <a class="header-anchor" href="#使用方式" aria-label="Permalink to &quot;使用方式&quot;"></a></h2>
<ol>
<li><strong>Google AI Studio</strong>：免费，无需翻墙</li>
<li><strong>Gemini App</strong>：手机端，部分地区需要 VPN</li>
<li><strong>API</strong>：每分钟 15 次免费请求</li>
</ol>
<p>推荐用 Google AI Studio，网页版体验最完整。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Gemini 2.0 Flash 是目前最值得推荐的免费 AI 工具。</p>
<p>对于学生党来说，这个比付费订阅 GPT Plus 实用。多模态能力在学习场景下特别有用。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[独处的时候脑子里在想什么]]></title>
            <link>https://blog.shkart.online/posts/solitude-self-dialogue.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/solitude-self-dialogue.html</guid>
            <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[周末没有安排，一个人待在家里。

难得的安静时间，脑子里反而格外热闹。

 那些不请自来的想法

刷手机刷累了，躺在床上发呆，思绪开始飘：

"下周的任务安排是什么来着..."
"那]]></description>
            <content:encoded><![CDATA[<p>周末没有安排，一个人待在家里。</p>
<p>难得的安静时间，脑子里反而格外热闹。</p>
<h2 id="那些不请自来的想法" tabindex="-1">那些不请自来的想法 <a class="header-anchor" href="#那些不请自来的想法" aria-label="Permalink to &quot;那些不请自来的想法&quot;"></a></h2>
<p>刷手机刷累了，躺在床上发呆，思绪开始飘：</p>
<p>&quot;下周的任务安排是什么来着...&quot;
&quot;那个项目代码还没推...&quot;
&quot;上次那个讨论我应该那样说...&quot;
&quot;老朋友现在在干嘛...&quot;
&quot;我以后到底想做什么...&quot;</p>
<p>从琐事到人生，毫无逻辑地跳跃。</p>
<p>以前我觉得这种&quot;胡思乱想&quot;是浪费时间，想让脑子清静下来。</p>
<p>后来发现，或许该听听这些声音。</p>
<h2 id="内心的-杂音-在说什么" tabindex="-1">内心的&quot;杂音&quot;在说什么 <a class="header-anchor" href="#内心的-杂音-在说什么" aria-label="Permalink to &quot;内心的&quot;杂音&quot;在说什么&quot;"></a></h2>
<p>仔细观察那些反复出现的念头，发现几个规律：</p>
<h3 id="_1-重复出现的-是没解决的问题" tabindex="-1">1. 重复出现的，是没解决的问题 <a class="header-anchor" href="#_1-重复出现的-是没解决的问题" aria-label="Permalink to &quot;1. 重复出现的，是没解决的问题&quot;"></a></h3>
<p>如果某件事反复在脑子里转，说明它对我来说很重要，但一直没有被正视。</p>
<p>比如&quot;我以后想做什么&quot;这个问题，每次独处都会冒出来。</p>
<p>说明这是个我一直在逃避的核心问题。</p>
<h3 id="_2-负面的想法往往被夸大" tabindex="-1">2. 负面的想法往往被夸大 <a class="header-anchor" href="#_2-负面的想法往往被夸大" aria-label="Permalink to &quot;2. 负面的想法往往被夸大&quot;"></a></h3>
<p>&quot;那次表现太烂了&quot;——真的有那么烂吗？反正也没什么后果。</p>
<p>&quot;别人肯定觉得我很奇怪&quot;——别人可能压根没注意。</p>
<p>独处时的自我批评往往失真，把小问题想成大灾难。</p>
<h3 id="_3-偶尔会有惊喜" tabindex="-1">3. 偶尔会有惊喜 <a class="header-anchor" href="#_3-偶尔会有惊喜" aria-label="Permalink to &quot;3. 偶尔会有惊喜&quot;"></a></h3>
<p>有时候不经意间会闪过好点子：</p>
<p>&quot;咦，这个功能可以这样实现？&quot;
&quot;哦，那个问题原来是这个原因！&quot;</p>
<p>这种顿悟往往在放空的时候出现，而不是绞尽脑汁的时候。</p>
<h2 id="我尝试的-自我对话" tabindex="-1">我尝试的&quot;自我对话&quot; <a class="header-anchor" href="#我尝试的-自我对话" aria-label="Permalink to &quot;我尝试的&quot;自我对话&quot;&quot;"></a></h2>
<p>后来我开始刻意在独处时和自己对话：</p>
<h3 id="写日记" tabindex="-1">写日记 <a class="header-anchor" href="#写日记" aria-label="Permalink to &quot;写日记&quot;"></a></h3>
<p>把脑子里转的事情写下来。</p>
<p>不用写完整的句子，想到什么就写什么。</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>今天状态不太好</span></span>
<span class="line"><span>那个 bug 还是没解决</span></span>
<span class="line"><span>有点想吃火锅</span></span>
<span class="line"><span>接下来真的要走那条路吗</span></span></code></pre>
</div><p>写完之后，看着这些文字，有种&quot;客观审视自己&quot;的感觉。</p>
<h3 id="问自己问题" tabindex="-1">问自己问题 <a class="header-anchor" href="#问自己问题" aria-label="Permalink to &quot;问自己问题&quot;"></a></h3>
<p>像采访一样问自己：</p>
<p>&quot;你现在最担心的是什么？&quot;
&quot;这件事为什么让你这么在意？&quot;
&quot;如果最坏情况发生了，你能接受吗？&quot;</p>
<p>自问自答听起来有点奇怪，但真的能理清思路。</p>
<h3 id="冥想-低配版" tabindex="-1">冥想（低配版） <a class="header-anchor" href="#冥想-低配版" aria-label="Permalink to &quot;冥想（低配版）&quot;"></a></h3>
<p>不用盘腿打坐，就是找个安静的地方，闭眼，专注呼吸。</p>
<p>脑子里的念头来了就来了，不抓住它，让它飘过去。</p>
<p>一开始很难，杂念不断。坚持几分钟后会平静一些。</p>
<h2 id="独处是奢侈的" tabindex="-1">独处是奢侈的 <a class="header-anchor" href="#独处是奢侈的" aria-label="Permalink to &quot;独处是奢侈的&quot;"></a></h2>
<p>现在信息太多了，刷手机、看视频，填满了所有空隙。</p>
<p>真正和自己待在一起的时间，反而变得稀缺。</p>
<p>但只有在独处时，才能真正听到内心的声音。</p>
<p>那些声音可能杂乱、可能负面，但也可能藏着你一直忽略的答案。</p>
<h2 id="写这篇文章的时候" tabindex="-1">写这篇文章的时候 <a class="header-anchor" href="#写这篇文章的时候" aria-label="Permalink to &quot;写这篇文章的时候&quot;"></a></h2>
<p>其实就是现在。周末下午，一个人在家。</p>
<p>写完之后看了看，觉得这篇东西有点像在和自己聊天的记录。</p>
<p>也行吧，本来就是。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[DeepSeek V3 发布：国产开源模型的新标杆]]></title>
            <link>https://blog.shkart.online/posts/deepseek-v3-release.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/deepseek-v3-release.html</guid>
            <pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[
新年第一个大新闻，DeepSeek 发布了 V3。

作为一个关注国产 AI 的学生，这次发布让我非常兴奋。

## 核心参数

- **总参数量**：671B（MoE 架构，激活参数 37B）
- **上下文长度**：128K
- **训练数据**：14.8T tokens
- **训练成本**：约 550 万美元

550 万美元是什么概念？据说 GPT-4 训练成本超过 1 亿美元。

## 性能对比

官方对比结果：

| 测试项 | DeepSeek V3 | GPT-4o | Claude 3.5 Sonnet |
|]]></description>
            <content:encoded><![CDATA[<p>新年第一个大新闻，DeepSeek 发布了 V3。</p>
<p>作为一个关注国产 AI 的学生，这次发布让我非常兴奋。</p>
<h2 id="核心参数" tabindex="-1">核心参数 <a class="header-anchor" href="#核心参数" aria-label="Permalink to &quot;核心参数&quot;"></a></h2>
<ul>
<li><strong>总参数量</strong>：671B（MoE 架构，激活参数 37B）</li>
<li><strong>上下文长度</strong>：128K</li>
<li><strong>训练数据</strong>：14.8T tokens</li>
<li><strong>训练成本</strong>：约 550 万美元</li>
</ul>
<p>550 万美元是什么概念？据说 GPT-4 训练成本超过 1 亿美元。</p>
<h2 id="性能对比" tabindex="-1">性能对比 <a class="header-anchor" href="#性能对比" aria-label="Permalink to &quot;性能对比&quot;"></a></h2>
<p>官方对比结果：</p>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>DeepSeek V3</th>
<th>GPT-4o</th>
<th>Claude 3.5 Sonnet</th>
</tr>
</thead>
<tbody>
<tr>
<td>MMLU</td>
<td>88.5</td>
<td>88.7</td>
<td>88.3</td>
</tr>
<tr>
<td>MATH</td>
<td>61.6</td>
<td>76.6</td>
<td>71.1</td>
</tr>
<tr>
<td>HumanEval</td>
<td>82.6</td>
<td>90.2</td>
<td>93.7</td>
</tr>
<tr>
<td>中文能力</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
</tr>
</tbody>
</table>
<p>在中文理解和生成上，DeepSeek V3 是目前最强的。</p>
<h2 id="为什么训练这么便宜" tabindex="-1">为什么训练这么便宜 <a class="header-anchor" href="#为什么训练这么便宜" aria-label="Permalink to &quot;为什么训练这么便宜&quot;"></a></h2>
<p>DeepSeek 团队做了很多工程优化：</p>
<ol>
<li><strong>MoE 架构</strong>：每次推理只激活部分参数</li>
<li><strong>FP8 混合精度训练</strong>：节省显存和算力</li>
<li><strong>Multi-Token Prediction</strong>：一次预测多个 token</li>
<li><strong>自研框架</strong>：专门优化过的训练基础设施</li>
</ol>
<p>这给整个行业提供了新思路：大模型不一定要烧太多钱。</p>
<h2 id="怎么用" tabindex="-1">怎么用 <a class="header-anchor" href="#怎么用" aria-label="Permalink to &quot;怎么用&quot;"></a></h2>
<p>有几种方式：</p>
<h3 id="官方-api" tabindex="-1">官方 API <a class="header-anchor" href="#官方-api" aria-label="Permalink to &quot;官方 API&quot;"></a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> openai </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> OpenAI</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">client </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> OpenAI(</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    api_key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"your-api-key"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    base_url</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://api.deepseek.com/v1"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">response </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> client.chat.completions.create(</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    model</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"deepseek-chat"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"role"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"user"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"你好"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><p>价格非常便宜，输入 1 元/百万 tokens。</p>
<h3 id="本地部署" tabindex="-1">本地部署 <a class="header-anchor" href="#本地部署" aria-label="Permalink to &quot;本地部署&quot;"></a></h3>
<p>需要很大的显存（A100 80G x 8），学生党暂时别想了。</p>
<p>但可以跑量化版本，社区正在做。</p>
<h2 id="对国产-ai-的意义" tabindex="-1">对国产 AI 的意义 <a class="header-anchor" href="#对国产-ai-的意义" aria-label="Permalink to &quot;对国产 AI 的意义&quot;"></a></h2>
<p>DeepSeek V3 证明了：</p>
<ol>
<li>国产团队有能力做出世界顶级模型</li>
<li>不一定要砸天价训练费</li>
<li>开源可以做到和闭源一样好</li>
</ol>
<p>作为学生，能免费用上这么强的国产模型，真的很幸运。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[完美主义是如何拖垮我的]]></title>
            <link>https://blog.shkart.online/posts/perfectionism-trap.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/perfectionism-trap.html</guid>
            <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA["追求完美"曾是我引以为傲的特质。

直到我发现，正是这个"优点"，让我寸步难行。

 完美主义长什么样

在我这里，完美主义体现在：

写代码：一个功能反复重构五遍，因为觉得不够优雅]]></description>
            <content:encoded><![CDATA[<p>&quot;追求完美&quot;曾是我引以为傲的特质。</p>
<p>直到我发现，正是这个&quot;优点&quot;，让我寸步难行。</p>
<h2 id="完美主义长什么样" tabindex="-1">完美主义长什么样 <a class="header-anchor" href="#完美主义长什么样" aria-label="Permalink to &quot;完美主义长什么样&quot;"></a></h2>
<p>在我这里，完美主义体现在：</p>
<p><strong>写代码</strong>：一个功能反复重构五遍，因为觉得不够优雅。结果 deadline 快到了，其他功能还没开始。</p>
<p><strong>写文章</strong>：一篇博客的开头改了七八遍，总觉得不够吸引人。最后整篇都没写完。</p>
<p><strong>学技术</strong>：想从头到尾把文档看完再动手，结果三天过去了，一行代码没写。</p>
<p><strong>交作业</strong>：觉得没做到 100 分就不想交，拖到最后草草交一个 60 分的。</p>
<p>矛盾吗？追求完美的结果，反而是做得更差。</p>
<h2 id="完美主义的两个误区" tabindex="-1">完美主义的两个误区 <a class="header-anchor" href="#完美主义的两个误区" aria-label="Permalink to &quot;完美主义的两个误区&quot;"></a></h2>
<h3 id="误区一-要么完美-要么不做" tabindex="-1">误区一：要么完美，要么不做 <a class="header-anchor" href="#误区一-要么完美-要么不做" aria-label="Permalink to &quot;误区一：要么完美，要么不做&quot;"></a></h3>
<p>这是非黑即白的思维。</p>
<p>觉得做不到最好，就干脆不做。结果就是从完美的梦想直接坠入什么都没做的现实。</p>
<p>但现实是，80 分的成果也是成果。什么都没有，才是真正的失败。</p>
<h3 id="误区二-完美是终点" tabindex="-1">误区二：完美是终点 <a class="header-anchor" href="#误区二-完美是终点" aria-label="Permalink to &quot;误区二：完美是终点&quot;"></a></h3>
<p>我总以为存在一个&quot;完美&quot;的状态，达到了就可以满足。</p>
<p>后来发现，完美主义者的完美是个不断后退的终点线。</p>
<p>90 分觉得不够，想要 95。95 了又觉得应该 100。</p>
<p>完美这个终点，永远到不了。</p>
<h2 id="我尝试过的改变" tabindex="-1">我尝试过的改变 <a class="header-anchor" href="#我尝试过的改变" aria-label="Permalink to &quot;我尝试过的改变&quot;"></a></h2>
<h3 id="_1-给-足够好-定一个标准" tabindex="-1">1. 给&quot;足够好&quot;定一个标准 <a class="header-anchor" href="#_1-给-足够好-定一个标准" aria-label="Permalink to &quot;1. 给&quot;足够好&quot;定一个标准&quot;"></a></h3>
<p>在开始之前就问自己：&quot;这个任务做到什么程度是'足够好'？&quot;</p>
<p>比如写代码：</p>
<ul>
<li>功能能跑：足够好 ✓</li>
<li>没有明显 bug：足够好 ✓</li>
<li>代码优雅到可以当教材：过度了 ✗</li>
</ul>
<p>有了这个标准，就知道什么时候该停手。</p>
<h3 id="_2-设置时间限制" tabindex="-1">2. 设置时间限制 <a class="header-anchor" href="#_2-设置时间限制" aria-label="Permalink to &quot;2. 设置时间限制&quot;"></a></h3>
<p>以前写一篇文章可能会改三天。</p>
<p>现在我给自己设限：两小时写完，最多再花半小时修改。</p>
<p>时间到了就发布，不管觉得完不完美。</p>
<p>结果发现，读者根本看不出那些我纠结半天的细节。</p>
<h3 id="_3-先完成-再完美" tabindex="-1">3. 先完成，再完美 <a class="header-anchor" href="#_3-先完成-再完美" aria-label="Permalink to &quot;3. 先完成，再完美&quot;"></a></h3>
<p>改变策略：第一版追求&quot;完成&quot;，不追求&quot;完美&quot;。</p>
<p>写代码先让功能跑起来，再考虑重构。
写文章先把想法写下来，再打磨语言。</p>
<p>反正你不先写出个第一版，就没有第二版的事。</p>
<h3 id="_4-接受-不完美-的自己" tabindex="-1">4. 接受&quot;不完美&quot;的自己 <a class="header-anchor" href="#_4-接受-不完美-的自己" aria-label="Permalink to &quot;4. 接受&quot;不完美&quot;的自己&quot;"></a></h3>
<p>最根本的改变是心态。</p>
<p>承认自己做不到完美，承认谁都做不到完美。</p>
<p>世上没有 bug-free 的代码，没有无可挑剔的文章，没有零失误的人生。</p>
<p>谁能完美呢？反正我还没见过。</p>
<h2 id="现在怎么样了" tabindex="-1">现在怎么样了 <a class="header-anchor" href="#现在怎么样了" aria-label="Permalink to &quot;现在怎么样了&quot;"></a></h2>
<p>完美主义没有完全消失，它偶尔还会冒出来让我焦虑。</p>
<p>但我学会了识别它：</p>
<p>当我发现自己在一件事上卡太久的时候，会问自己：</p>
<p>&quot;现在这个状态，是因为还没做到及格，还是因为没做到满分？&quot;</p>
<p>如果是后者，就叫停自己。</p>
<p>交一个 80 分的作业，总比 100 分的作业永远交不出来要强。</p>
<p>说实话，写这篇文章的时候我也纠结了半天——觉得写得不够好，不想发。</p>
<p>然后我拍了拍自己：又来了。</p>
<p>不管了，发吧。先完成，再说。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[OpenAI o1 发布：AI 学会"慢思考"了]]></title>
            <link>https://blog.shkart.online/posts/openai-o1-release.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/openai-o1-release.html</guid>
            <pubDate>Fri, 13 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
OpenAI 昨晚发布了新的模型系列：o1。

这不是 GPT-5，但从某种意义上说，更接近 AGI。

## o1 是什么

官方定位是"推理模型"（Reasoning Model）。

和 GPT-4 不同，o1 在回答前会先"思考"：

1. 把问题分解成小步骤
2. 尝试不同解法
3. 验证中间结果
4. 最后给出答案

这个过程会显示"正在思考..."，可能持续几秒到几分钟。

## 性能对比

| 测试项 | o1-preview | GPT-4o | Claude 3.5 Sonnet |
|]]></description>
            <content:encoded><![CDATA[<p>OpenAI 昨晚发布了新的模型系列：o1。</p>
<p>这不是 GPT-5，但从某种意义上说，更接近 AGI。</p>
<h2 id="o1-是什么" tabindex="-1">o1 是什么 <a class="header-anchor" href="#o1-是什么" aria-label="Permalink to &quot;o1 是什么&quot;"></a></h2>
<p>官方定位是&quot;推理模型&quot;（Reasoning Model）。</p>
<p>和 GPT-4 不同，o1 在回答前会先&quot;思考&quot;：</p>
<ol>
<li>把问题分解成小步骤</li>
<li>尝试不同解法</li>
<li>验证中间结果</li>
<li>最后给出答案</li>
</ol>
<p>这个过程会显示&quot;正在思考...&quot;，可能持续几秒到几分钟。</p>
<h2 id="性能对比" tabindex="-1">性能对比 <a class="header-anchor" href="#性能对比" aria-label="Permalink to &quot;性能对比&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>o1-preview</th>
<th>GPT-4o</th>
<th>Claude 3.5 Sonnet</th>
</tr>
</thead>
<tbody>
<tr>
<td>数学竞赛 (AIME)</td>
<td>83%</td>
<td>13.4%</td>
<td>-</td>
</tr>
<tr>
<td>代码竞赛 (Codeforces)</td>
<td>89 分位</td>
<td>11 分位</td>
<td>-</td>
</tr>
<tr>
<td>PhD 物理题</td>
<td>92%</td>
<td>65%</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>在需要深度思考的任务上，o1 远超其他模型。</p>
<h2 id="实际使用" tabindex="-1">实际使用 <a class="header-anchor" href="#实际使用" aria-label="Permalink to &quot;实际使用&quot;"></a></h2>
<p>测试了几道编程题：</p>
<h3 id="leetcode-困难题" tabindex="-1">LeetCode 困难题 <a class="header-anchor" href="#leetcode-困难题" aria-label="Permalink to &quot;LeetCode 困难题&quot;"></a></h3>
<p>把题目描述给 o1，它会：</p>
<ol>
<li>先分析问题类型（动态规划、图论...）</li>
<li>尝试几种思路</li>
<li>写出代码并解释</li>
</ol>
<p>GPT-4 经常在困难题上翻车，o1 的正确率高很多。</p>
<h3 id="数学证明" tabindex="-1">数学证明 <a class="header-anchor" href="#数学证明" aria-label="Permalink to &quot;数学证明&quot;"></a></h3>
<p>让它证明一个定理，它会一步步推导，而且能指出哪里需要用什么定理。</p>
<p>比直接给答案更有学习价值。</p>
<h2 id="限制" tabindex="-1">限制 <a class="header-anchor" href="#限制" aria-label="Permalink to &quot;限制&quot;"></a></h2>
<ol>
<li><strong>速度慢</strong>：简单问题也要等几秒，复杂问题可能几分钟</li>
<li><strong>价格贵</strong>：输入 $15/M tokens，输出 $60/M tokens，是 GPT-4 的 3-4 倍</li>
<li><strong>不擅长闲聊</strong>：simple task 不如 GPT-4o 自然</li>
</ol>
<p>o1 适合&quot;难题&quot;，日常对话用 GPT-4o 就够了。</p>
<h2 id="谁应该用" tabindex="-1">谁应该用 <a class="header-anchor" href="#谁应该用" aria-label="Permalink to &quot;谁应该用&quot;"></a></h2>
<ul>
<li>刷算法题的同学</li>
<li>学数学/物理的学生</li>
<li>需要解决复杂逻辑问题的人</li>
</ul>
<p>简单任务用 o1 浪费，复杂任务用 o1 真香。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>o1 证明了 AI 不只是&quot;更快&quot;，还可以&quot;更深&quot;。</p>
<p>虽然价格贵用不起，但这个方向让人对 AI 的未来更乐观了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[跳槽 or 留下？这道选择题没有标准答案]]></title>
            <link>https://blog.shkart.online/posts/career-choice-anxiety.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/career-choice-anxiety.html</guid>
            <pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[金九银十的时候，身边人的动态让我焦虑到不行：

- A 跳槽去了大厂，薪资翻倍
- B 转行做自媒体，粉丝涨得很快
- C 辞职 gap year，说要想清楚人生
- 我：每天机械上班，不知]]></description>
            <content:encoded><![CDATA[<p>金九银十的时候，身边人的动态让我焦虑到不行：</p>
<ul>
<li>A 跳槽去了大厂，薪资翻倍</li>
<li>B 转行做自媒体，粉丝涨得很快</li>
<li>C 辞职 gap year，说要想清楚人生</li>
<li>我：每天机械上班，不知道下一步该怎么走</li>
</ul>
<p>这道&quot;选择题&quot;，是我职业生涯目前最难的一道。</p>
<h2 id="我的纠结过程" tabindex="-1">我的纠结过程 <a class="header-anchor" href="#我的纠结过程" aria-label="Permalink to &quot;我的纠结过程&quot;"></a></h2>
<h3 id="跳槽" tabindex="-1">跳槽？ <a class="header-anchor" href="#跳槽" aria-label="Permalink to &quot;跳槽？&quot;"></a></h3>
<p>好处很明显：涨薪、换环境、有新挑战。</p>
<p>但刷了两周招聘 App，发现市场没那么好。很多岗位要么 HC 冻结，要么要求高得离谱。</p>
<p>问自己：你真的准备好面试了吗？</p>
<p>说实话，没有。</p>
<h3 id="留下" tabindex="-1">留下？ <a class="header-anchor" href="#留下" aria-label="Permalink to &quot;留下？&quot;"></a></h3>
<p>当前公司虽然一般，但稳定。</p>
<p>但每天做重复的事，没有成长感，又觉得在浪费时间。</p>
<p>问自己：这样下去，三年后你会在哪里？</p>
<p>想不清楚。</p>
<h3 id="转行" tabindex="-1">转行？ <a class="header-anchor" href="#转行" aria-label="Permalink to &quot;转行？&quot;"></a></h3>
<p>看到有人裸辞去做自媒体、开咖啡店，很羡慕。</p>
<p>但真让我放弃现在的积累从头开始，又觉得很冒险。</p>
<p>问自己：你真的有那个勇气和资本吗？</p>
<p>好像没有。</p>
<h2 id="为什么这么难选" tabindex="-1">为什么这么难选 <a class="header-anchor" href="#为什么这么难选" aria-label="Permalink to &quot;为什么这么难选&quot;"></a></h2>
<p>后来我想通了：难选的原因不是选项本身，而是我不知道自己想要什么。</p>
<p>如果我很清楚&quot;我就是想做技术专家&quot;，那就专心提升技术，在哪家公司无所谓。</p>
<p>如果我很清楚&quot;我想挣更多钱&quot;，那就把简历改好去面试。</p>
<p>问题是，我不知道。</p>
<p>而&quot;不知道想要什么&quot;这件事，让我感到羞耻。好像别人都有明确的目标，只有我还在迷茫。</p>
<h2 id="我的解决思路" tabindex="-1">我的解决思路 <a class="header-anchor" href="#我的解决思路" aria-label="Permalink to &quot;我的解决思路&quot;"></a></h2>
<h3 id="_1-先排除最不想要的" tabindex="-1">1. 先排除最不想要的 <a class="header-anchor" href="#_1-先排除最不想要的" aria-label="Permalink to &quot;1. 先排除最不想要的&quot;"></a></h3>
<p>不知道想要什么，可以从&quot;不想要什么&quot;开始。</p>
<p>仔细想了想：我不想再做现在这种重复劳动了。</p>
<p>那好，至少知道了一个方向。</p>
<h3 id="_2-给自己设置一个-最低接受标准" tabindex="-1">2. 给自己设置一个&quot;最低接受标准&quot; <a class="header-anchor" href="#_2-给自己设置一个-最低接受标准" aria-label="Permalink to &quot;2. 给自己设置一个&quot;最低接受标准&quot;&quot;"></a></h3>
<p>完全不知道怎么选的时候，我问自己：</p>
<p>&quot;什么样的结果是我能接受的最差情况？&quot;</p>
<p>答：能养活自己，不至于失业。</p>
<p>有了这个底线，反而没那么焦虑了。</p>
<h3 id="_3-去尝试-在行动中找答案" tabindex="-1">3. 去尝试，在行动中找答案 <a class="header-anchor" href="#_3-去尝试-在行动中找答案" aria-label="Permalink to &quot;3. 去尝试，在行动中找答案&quot;"></a></h3>
<p>既然不知道喜欢什么，那就每样都试试：</p>
<ul>
<li>投了几家公司，体验了面试</li>
<li>尝试做了一些自媒体内容</li>
<li>学了一些新技术，探索新方向</li>
</ul>
<p>慢慢地，方向就在行动中浮现出来了。</p>
<h3 id="_4-接受-走弯路-是正常的" tabindex="-1">4. 接受&quot;走弯路&quot;是正常的 <a class="header-anchor" href="#_4-接受-走弯路-是正常的" aria-label="Permalink to &quot;4. 接受&quot;走弯路&quot;是正常的&quot;"></a></h3>
<p>怕选错，是我不敢选择的最大原因。</p>
<p>后来想明白了：二三十岁，选错了可以再改。</p>
<p>很多人的职业路径都是曲折的。第一份工作做的事情和后来风马牛不相及。</p>
<p>选就对了。不选才是最大的错误。</p>
<h2 id="最后的选择" tabindex="-1">最后的选择 <a class="header-anchor" href="#最后的选择" aria-label="Permalink to &quot;最后的选择&quot;"></a></h2>
<p>我选了先在内部争取一个新项目的机会。</p>
<p>不是什么完美选择，但至少是我自己做的决定。迈出第一步后，焦虑少了很多。</p>
<p>不是什么完美的选择，但至少是我自己做的决定。迈出第一步后，焦虑少了很多。</p>
<p>后来我发现，很多时候焦虑不是因为“选错了”，而是因为“还没选”。真走起来之后，路上的风景会帮你确认方向的。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[用 Cursor 写了两周代码：AI 编程助手的正确打开方式]]></title>
            <link>https://blog.shkart.online/posts/cursor-ai-coding-experience.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/cursor-ai-coding-experience.html</guid>
            <pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
一直用 GitHub Copilot，最近 Cursor 太火了，忍不住试试。

两周下来，说说真实感受。

## Cursor 是什么

简单说，就是一个内置 AI 能力的 VS Code 魔改版。

可以对话、可以让 AI 直接编辑代码、可以理解整个项目上下文。

## 核心功能体验

### Cmd+K 内联编辑

这是用得最多的功能。选中一段代码，按 Cmd+K，告诉它你想改成什么样，直接改好。

比如："把这个函数改成 async/await 语法"，唰一下就改好了。

### Cmd+L 对话模式

类似 ChatGPT，但能看到你当前文件甚至整个项目。

问它"这个项目的用户认证是怎么实现的"，它能跨文件找代码解释给你听。

### @ 引用

可以用 @file、@folder、@web 引用特定内容。

比如"参考 @auth.ts 写一个类似的权限验证函数"，它能理解上下文。

## 对比 GitHub Copilot

| 功能 | Cursor | Copilot |
|]]></description>
            <content:encoded><![CDATA[<p>一直用 GitHub Copilot，最近 Cursor 太火了，忍不住试试。</p>
<p>两周下来，说说真实感受。</p>
<h2 id="cursor-是什么" tabindex="-1">Cursor 是什么 <a class="header-anchor" href="#cursor-是什么" aria-label="Permalink to &quot;Cursor 是什么&quot;"></a></h2>
<p>简单说，就是一个内置 AI 能力的 VS Code 魔改版。</p>
<p>可以对话、可以让 AI 直接编辑代码、可以理解整个项目上下文。</p>
<h2 id="核心功能体验" tabindex="-1">核心功能体验 <a class="header-anchor" href="#核心功能体验" aria-label="Permalink to &quot;核心功能体验&quot;"></a></h2>
<h3 id="cmd-k-内联编辑" tabindex="-1">Cmd+K 内联编辑 <a class="header-anchor" href="#cmd-k-内联编辑" aria-label="Permalink to &quot;Cmd+K 内联编辑&quot;"></a></h3>
<p>这是用得最多的功能。选中一段代码，按 Cmd+K，告诉它你想改成什么样，直接改好。</p>
<p>比如：&quot;把这个函数改成 async/await 语法&quot;，唰一下就改好了。</p>
<h3 id="cmd-l-对话模式" tabindex="-1">Cmd+L 对话模式 <a class="header-anchor" href="#cmd-l-对话模式" aria-label="Permalink to &quot;Cmd+L 对话模式&quot;"></a></h3>
<p>类似 ChatGPT，但能看到你当前文件甚至整个项目。</p>
<p>问它&quot;这个项目的用户认证是怎么实现的&quot;，它能跨文件找代码解释给你听。</p>
<h3 id="引用" tabindex="-1">@ 引用 <a class="header-anchor" href="#引用" aria-label="Permalink to &quot;@ 引用&quot;"></a></h3>
<p>可以用 @file、@folder、@web 引用特定内容。</p>
<p>比如&quot;参考 @auth.ts 写一个类似的权限验证函数&quot;，它能理解上下文。</p>
<h2 id="对比-github-copilot" tabindex="-1">对比 GitHub Copilot <a class="header-anchor" href="#对比-github-copilot" aria-label="Permalink to &quot;对比 GitHub Copilot&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>功能</th>
<th>Cursor</th>
<th>Copilot</th>
</tr>
</thead>
<tbody>
<tr>
<td>行内补全</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>对话交互</td>
<td>✅（更强）</td>
<td>✅</td>
</tr>
<tr>
<td>代码编辑</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>项目理解</td>
<td>✅</td>
<td>有限</td>
</tr>
<tr>
<td>IDE 依赖</td>
<td>自带</td>
<td>需要 VS Code 插件</td>
</tr>
<tr>
<td>价格</td>
<td>$20/月</td>
<td>$10/月</td>
</tr>
</tbody>
</table>
<p>Cursor 更贵，但功能确实更强。</p>
<h2 id="最佳实践" tabindex="-1">最佳实践 <a class="header-anchor" href="#最佳实践" aria-label="Permalink to &quot;最佳实践&quot;"></a></h2>
<p>两周下来总结：</p>
<ol>
<li><strong>小任务用 Cmd+K</strong>：不用切换上下文，直接改</li>
<li><strong>复杂问题用对话</strong>：让它解释、分析、规划</li>
<li><strong>多用 @ 引用</strong>：精确上下文能大幅提升输出质量</li>
<li><strong>不要盲目接受</strong>：生成的代码必须审核，偶尔会有 bug</li>
</ol>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Cursor 确实提高了我的编码效率，尤其是写样板代码和重构时。</p>
<p>但它不会让你变成更好的程序员。理解代码在做什么，依然是最重要的事情。</p>
<p>如果 $20/月对你来说负担不大，值得一试。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Llama 3.1 405B 开源：Meta 改变了游戏规则]]></title>
            <link>https://blog.shkart.online/posts/llama-3-1-release.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/llama-3-1-release.html</guid>
            <pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
昨天 Meta 低调发布了 Llama 3.1，包括 8B、70B 和 405B 三个版本。

405B 是重点。这是目前最大的开源模型，性能在多个基准上接近甚至超越 GPT-4。

## 性能基准

官方给出的测试结果：

| 测试项 | Llama 3.1 405B | GPT-4 | Claude 3.5 Sonnet |
|]]></description>
            <content:encoded><![CDATA[<p>昨天 Meta 低调发布了 Llama 3.1，包括 8B、70B 和 405B 三个版本。</p>
<p>405B 是重点。这是目前最大的开源模型，性能在多个基准上接近甚至超越 GPT-4。</p>
<h2 id="性能基准" tabindex="-1">性能基准 <a class="header-anchor" href="#性能基准" aria-label="Permalink to &quot;性能基准&quot;"></a></h2>
<p>官方给出的测试结果：</p>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>Llama 3.1 405B</th>
<th>GPT-4</th>
<th>Claude 3.5 Sonnet</th>
</tr>
</thead>
<tbody>
<tr>
<td>MMLU</td>
<td>88.6</td>
<td>86.4</td>
<td>88.7</td>
</tr>
<tr>
<td>HumanEval</td>
<td>89.0</td>
<td>67.0</td>
<td>92.0</td>
</tr>
<tr>
<td>GSM8K</td>
<td>96.8</td>
<td>92.0</td>
<td>96.4</td>
</tr>
</tbody>
</table>
<p>在代码生成和数学推理上表现亮眼。</p>
<h2 id="为什么这很重要" tabindex="-1">为什么这很重要 <a class="header-anchor" href="#为什么这很重要" aria-label="Permalink to &quot;为什么这很重要&quot;"></a></h2>
<p>开源模型能达到闭源顶级模型水平，意义重大：</p>
<ol>
<li><strong>成本下降</strong>：自己部署不用付 API 费</li>
<li><strong>数据安全</strong>：敏感数据不用传给第三方</li>
<li><strong>可定制</strong>：能微调适应特定场景</li>
<li><strong>竞争压力</strong>：OpenAI 和 Anthropic 必须加速迭代</li>
</ol>
<h2 id="怎么跑起来" tabindex="-1">怎么跑起来 <a class="header-anchor" href="#怎么跑起来" aria-label="Permalink to &quot;怎么跑起来&quot;"></a></h2>
<p>405B 参数量太大，普通人跑不动。但可以用量化版本：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 使用 Ollama 跑 8B 版本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ollama</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> llama3.1:8b</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 或者用 70B 量化版（需要 48GB 显存）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ollama</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> llama3.1:70b-instruct-q4_0</span></span></code></pre>
</div><p>8B 版本在 8GB 显存的笔记本上就能跑，效果已经很不错了。</p>
<h2 id="本地测试感受" tabindex="-1">本地测试感受 <a class="header-anchor" href="#本地测试感受" aria-label="Permalink to &quot;本地测试感受&quot;"></a></h2>
<p>我在 3060 显卡上跑了 8B 版本：</p>
<ul>
<li><strong>响应速度</strong>：约 20 tokens/秒，可接受</li>
<li><strong>中文能力</strong>：比 Llama 2 进步明显，基本能用</li>
<li><strong>代码能力</strong>：简单代码补全没问题</li>
</ul>
<p>日常学习和练手完全够用了。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Llama 3.1 让&quot;AI 民主化&quot;这个口号更接近现实。</p>
<p>作为学生，我们现在可以免费用上接近顶级水平的 AI 模型。这在两年前不可想象。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Claude 3.5 Sonnet：目前最强的代码 AI？]]></title>
            <link>https://blog.shkart.online/posts/claude-35-sonnet-release.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/claude-35-sonnet-release.html</guid>
            <pubDate>Sat, 22 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
Anthropic 这次的更新有点猛。

Claude 3.5 Sonnet 不仅性能超越了自家的 Opus，还在多项测试中超过了 GPT-4o。

## 能力对比

| 测试项 | Claude 3.5 Sonnet | GPT-4o | Claude 3 Opus |
|]]></description>
            <content:encoded><![CDATA[<p>Anthropic 这次的更新有点猛。</p>
<p>Claude 3.5 Sonnet 不仅性能超越了自家的 Opus，还在多项测试中超过了 GPT-4o。</p>
<h2 id="能力对比" tabindex="-1">能力对比 <a class="header-anchor" href="#能力对比" aria-label="Permalink to &quot;能力对比&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>Claude 3.5 Sonnet</th>
<th>GPT-4o</th>
<th>Claude 3 Opus</th>
</tr>
</thead>
<tbody>
<tr>
<td>HumanEval</td>
<td>92.0%</td>
<td>90.2%</td>
<td>84.9%</td>
</tr>
<tr>
<td>MATH</td>
<td>71.1%</td>
<td>76.6%</td>
<td>60.1%</td>
</tr>
<tr>
<td>响应速度</td>
<td>快</td>
<td>中</td>
<td>慢</td>
</tr>
<tr>
<td>价格</td>
<td>$3/M tokens</td>
<td>$5/M tokens</td>
<td>$15/M tokens</td>
</tr>
</tbody>
</table>
<p>代码能力领先，速度更快，价格还更低。性价比拉满了。</p>
<h2 id="实际编程体验" tabindex="-1">实际编程体验 <a class="header-anchor" href="#实际编程体验" aria-label="Permalink to &quot;实际编程体验&quot;"></a></h2>
<p>用了两周，记录几个印象深刻的场景：</p>
<h3 id="理解复杂代码库" tabindex="-1">理解复杂代码库 <a class="header-anchor" href="#理解复杂代码库" aria-label="Permalink to &quot;理解复杂代码库&quot;"></a></h3>
<p>把一个 5000 行的 React 项目扔给它，问&quot;这个项目的状态管理是怎么做的&quot;，它能准确找到关键文件并解释清楚。</p>
<p>GPT-4 有时候会漏掉一些细节。</p>
<h3 id="生成完整功能" tabindex="-1">生成完整功能 <a class="header-anchor" href="#生成完整功能" aria-label="Permalink to &quot;生成完整功能&quot;"></a></h3>
<p>让它写一个&quot;带分页的用户列表组件&quot;，一次性给出：</p>
<ul>
<li>组件代码</li>
<li>API 接口</li>
<li>类型定义</li>
<li>基本样式</li>
</ul>
<p>基本能直接用，只需要微调。</p>
<h3 id="debug-能力" tabindex="-1">Debug 能力 <a class="header-anchor" href="#debug-能力" aria-label="Permalink to &quot;Debug 能力&quot;"></a></h3>
<p>把报错信息和相关代码贴进去，它能准确定位问题。</p>
<p>有一次一个 async/await 的 bug 我找了半小时，它一眼看出来了。</p>
<h2 id="artifacts-功能" tabindex="-1">Artifacts 功能 <a class="header-anchor" href="#artifacts-功能" aria-label="Permalink to &quot;Artifacts 功能&quot;"></a></h2>
<p>这是新增的可视化功能。</p>
<p>让它写一个 HTML 页面，它会直接渲染出来给你看。写 React 组件也能实时预览。</p>
<p>对于学前端的同学特别有用，边学边看效果。</p>
<h2 id="怎么用" tabindex="-1">怎么用 <a class="header-anchor" href="#怎么用" aria-label="Permalink to &quot;怎么用&quot;"></a></h2>
<ol>
<li><strong>网页版</strong>：claude.ai，免费版每天有限额</li>
<li><strong>API</strong>：比 GPT-4 便宜 40%</li>
<li><strong>Cursor 集成</strong>：可以在 Cursor 编辑器里用</li>
</ol>
<p>我现在的搭配是：日常用网页版，写代码用 Cursor 调用 Claude API。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Claude 3.5 Sonnet 是目前性价比最高的代码 AI。</p>
<p>特别是对于学生，免费额度够日常使用，需要更多再考虑付费。这比订阅 GPT Plus 划算多了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Stable Diffusion 3 开源了：本地跑图的新选择]]></title>
            <link>https://blog.shkart.online/posts/stable-diffusion-3-opensource.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/stable-diffusion-3-opensource.html</guid>
            <pubDate>Sat, 15 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[等了好几个月，Stable Diffusion 3 Medium 终于开源了。

虽然不是最强的 SD3 Large，但 Medium 版本也带来了很多惊喜。

 核心升级

相比 SDX]]></description>
            <content:encoded><![CDATA[<p>等了好几个月，Stable Diffusion 3 Medium 终于开源了。</p>
<p>虽然不是最强的 SD3 Large，但 Medium 版本也带来了很多惊喜。</p>
<h2 id="核心升级" tabindex="-1">核心升级 <a class="header-anchor" href="#核心升级" aria-label="Permalink to &quot;核心升级&quot;"></a></h2>
<p>相比 SDXL，SD3 的改进主要在：</p>
<ol>
<li><strong>文字渲染</strong>：终于能在图片里画出正确的文字了</li>
<li><strong>图像质量</strong>：细节更丰富，手指不会画错</li>
<li><strong>架构升级</strong>：使用 DiT 架构，生成更稳定</li>
</ol>
<h2 id="配置要求" tabindex="-1">配置要求 <a class="header-anchor" href="#配置要求" aria-label="Permalink to &quot;配置要求&quot;"></a></h2>
<p>SD3 Medium 比 SDXL 更轻量：</p>
<ul>
<li><strong>显存需求</strong>：8GB 可跑，12GB 更流畅</li>
<li><strong>生成速度</strong>：3060 显卡约 15 秒一张（1024x1024）</li>
<li><strong>模型大小</strong>：约 4GB</li>
</ul>
<p>比 SDXL 省资源，效果还更好。</p>
<h2 id="本地部署" tabindex="-1">本地部署 <a class="header-anchor" href="#本地部署" aria-label="Permalink to &quot;本地部署&quot;"></a></h2>
<p>用 ComfyUI 最简单：</p>
<ol>
<li>下载 SD3 Medium safetensors 文件</li>
<li>放到 ComfyUI/models/checkpoints/</li>
<li>加载官方提供的工作流</li>
<li>开画</li>
</ol>
<p>或者用命令行：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> diffusers</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">python</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "from diffusers import StableDiffusion3Pipeline; ..."</span></span></code></pre>
</div><h2 id="实际效果" tabindex="-1">实际效果 <a class="header-anchor" href="#实际效果" aria-label="Permalink to &quot;实际效果&quot;"></a></h2>
<p>测试了几个常见场景：</p>
<ul>
<li><strong>人物</strong>：面部细节好，手指正常了</li>
<li><strong>风景</strong>：光影层次丰富</li>
<li><strong>文字</strong>：英文基本正确，中文还是不行</li>
<li><strong>二次元</strong>：需要配合 LoRA，原生风格偏写实</li>
</ul>
<p>最惊喜的是文字渲染，以前 SD 画 logo 全靠玄学，现在终于可控了。</p>
<h2 id="和-midjourney-对比" tabindex="-1">和 MidJourney 对比 <a class="header-anchor" href="#和-midjourney-对比" aria-label="Permalink to &quot;和 MidJourney 对比&quot;"></a></h2>
<p>MJ 还是更傻瓜式，出图即用。</p>
<p>SD3 需要折腾，但胜在免费、本地、无限制。</p>
<p>对于学预算有限又想玩 AI 绘画的同学，SD3 是最佳选择。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>SD3 开源是 AI 绘画界的大事。</p>
<p>配合 ComfyUI 的工作流，普通笔记本就能实现商业级出图。这在一年前要花大价钱。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[GPT-4o 发布：实时语音对话真的太丝滑了]]></title>
            <link>https://blog.shkart.online/posts/gpt-4o-launch-review.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/gpt-4o-launch-review.html</guid>
            <pubDate>Tue, 14 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[凌晨看完 OpenAI 发布会，本来期待 GPT-5，结果发布的是 GPT-4o。

一开始有点失望，看完演示之后：这才是正确的方向。

 什么是 GPT-4o

o 代表 omni（全能]]></description>
            <content:encoded><![CDATA[<p>凌晨看完 OpenAI 发布会，本来期待 GPT-5，结果发布的是 GPT-4o。</p>
<p>一开始有点失望，看完演示之后：这才是正确的方向。</p>
<h2 id="什么是-gpt-4o" tabindex="-1">什么是 GPT-4o <a class="header-anchor" href="#什么是-gpt-4o" aria-label="Permalink to &quot;什么是 GPT-4o&quot;"></a></h2>
<p>o 代表 omni（全能），核心能力是多模态实时交互。</p>
<p>简单说就是：你可以对着手机实时说话，它实时回复。没有延迟，没有等待转圈。</p>
<h2 id="语音交互演示" tabindex="-1">语音交互演示 <a class="header-anchor" href="#语音交互演示" aria-label="Permalink to &quot;语音交互演示&quot;"></a></h2>
<p>发布会上最惊艳的演示是这个：</p>
<ol>
<li>用户对着手机说话，语气紧张</li>
<li>GPT-4o 说：&quot;深呼吸，慢一点&quot;</li>
<li>用户深呼吸，GPT-4o 说：&quot;好多了&quot;</li>
</ol>
<p>它能听出你的情绪！</p>
<p>然后还有唱歌的演示、同时翻译的演示。延迟低到像人和人对话。</p>
<h2 id="实际体验" tabindex="-1">实际体验 <a class="header-anchor" href="#实际体验" aria-label="Permalink to &quot;实际体验&quot;"></a></h2>
<p>我在 ChatGPT App 上试了一下：</p>
<ul>
<li><strong>响应速度</strong>：确实快，说完话 0.5 秒内就开始回复</li>
<li><strong>打断能力</strong>：说话过程中可以随时打断，像真人对话</li>
<li><strong>语气自然度</strong>：比之前的 TTS 好太多，有抑扬顿挫</li>
</ul>
<p>缺点是目前只支持英语效果最好，中文还差点意思。</p>
<h2 id="为什么这个比-gpt-5-重要" tabindex="-1">为什么这个比 GPT-5 重要 <a class="header-anchor" href="#为什么这个比-gpt-5-重要" aria-label="Permalink to &quot;为什么这个比 GPT-5 重要&quot;"></a></h2>
<p>我的理解是这样：GPT-5 可能是更聪明的文字模型，但 GPT-4o 是在解决人和 AI 如何交互的问题。</p>
<p>以前用 ChatGPT，需要打字、等待、阅读。现在可以像打电话一样聊天。这对于很多不习惯打字的人来说，才是真正的普及。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>GPT-4o 让我看到了 Her 那个电影里的 AI 助手形态。</p>
<p>虽然现在还有各种限制，但方向对了。等中文效果优化好，可能真的会改变很多人使用手机的方式。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[那段什么都不想干的日子]]></title>
            <link>https://blog.shkart.online/posts/burnout-motivation-loss.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/burnout-motivation-loss.html</guid>
            <pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[去年有两个月，我处于一种奇怪的状态。

不是抑郁，没有想不开。但就是什么都不想干。

 症状是这样的

早上闹钟响了不想起床。不是困，就是不想面对新的一天。

工作能拖就拖，任务最后一]]></description>
            <content:encoded><![CDATA[<p>去年有两个月，我处于一种奇怪的状态。</p>
<p>不是抑郁，没有想不开。但就是什么都不想干。</p>
<h2 id="症状是这样的" tabindex="-1">症状是这样的 <a class="header-anchor" href="#症状是这样的" aria-label="Permalink to &quot;症状是这样的&quot;"></a></h2>
<p>早上闹钟响了不想起床。不是困，就是不想面对新的一天。</p>
<p>工作能拖就拖，任务最后一刻才交。</p>
<p>想学的技术，一周没看一页文档。</p>
<p>打开 B 站，刷到不想看的视频都能一直刷下去。</p>
<p>晚上躺在床上，回想这一天做了什么：什么都没做。</p>
<p>然后因为这个而自责，更累了。</p>
<h2 id="我以为只是懒" tabindex="-1">我以为只是懒 <a class="header-anchor" href="#我以为只是懒" aria-label="Permalink to &quot;我以为只是懒&quot;"></a></h2>
<p>一开始我觉得自己在&quot;犯懒&quot;，需要更强的自律。</p>
<p>于是：</p>
<ul>
<li>下载打卡 App 监督自己</li>
<li>列了详细的每日计划</li>
<li>给自己制定惩罚机制</li>
</ul>
<p>结果呢？坚持了三天就崩溃了。</p>
<p>不仅没有变好，反而因为&quot;又没做到&quot;而更加自责。</p>
<h2 id="后来我意识到" tabindex="-1">后来我意识到 <a class="header-anchor" href="#后来我意识到" aria-label="Permalink to &quot;后来我意识到&quot;"></a></h2>
<p>这不是懒，是倦怠（burnout）。</p>
<p>倦怠和懒的区别在于：</p>
<ul>
<li><strong>懒</strong>：不想做，但做别的事还有精力。</li>
<li><strong>倦怠</strong>：对什么都提不起兴趣，感觉被掏空了。</li>
</ul>
<p>回想那两个月之前，我确实一直在高强度运转：</p>
<ul>
<li>连续加班赶项目</li>
<li>同时处理好几个并行任务</li>
<li>还想抽空学新技术提升自己</li>
</ul>
<p>身体和心理都透支了，只是当时没意识到。</p>
<h2 id="让我慢慢恢复的事" tabindex="-1">让我慢慢恢复的事 <a class="header-anchor" href="#让我慢慢恢复的事" aria-label="Permalink to &quot;让我慢慢恢复的事&quot;"></a></h2>
<h3 id="_1-允许自己-浪费时间" tabindex="-1">1. 允许自己&quot;浪费时间&quot; <a class="header-anchor" href="#_1-允许自己-浪费时间" aria-label="Permalink to &quot;1. 允许自己&quot;浪费时间&quot;&quot;"></a></h3>
<p>以前那个不想干活的我，会因为&quot;浪费时间&quot;而自责。</p>
<p>后来我强迫自己接受一件事：休息不是浪费时间，是在给自己充电。</p>
<p>刷一下午剧？可以。睡到中午？没问题。</p>
<p>把自责的能量省下来，反而恢复得更快。</p>
<h3 id="_2-只做最小单位" tabindex="-1">2. 只做最小单位 <a class="header-anchor" href="#_2-只做最小单位" aria-label="Permalink to &quot;2. 只做最小单位&quot;"></a></h3>
<p>不列什么宏大计划，只做最小的事：</p>
<ul>
<li>不是&quot;今天学两小时&quot;，而是&quot;今天看一页文档&quot;</li>
<li>不是&quot;写完整个功能&quot;，而是&quot;先写一行代码&quot;</li>
</ul>
<p>很多时候，开始之后就停不下来了。</p>
<h3 id="_3-换个环境" tabindex="-1">3. 换个环境 <a class="header-anchor" href="#_3-换个环境" aria-label="Permalink to &quot;3. 换个环境&quot;"></a></h3>
<p>在家躺了两个月后，我换到咖啡店工作。</p>
<p>环境的改变带来心态的改变。那天我居然专注了三个小时，是两个月以来最高效的一天。</p>
<h3 id="_4-聊天" tabindex="-1">4. 聊天 <a class="header-anchor" href="#_4-聊天" aria-label="Permalink to &quot;4. 聊天&quot;"></a></h3>
<p>和朋友吐槽了我的状态。本以为会被骂&quot;你这是矫情&quot;。</p>
<p>没想到她说：&quot;我之前也这样过，太正常了。&quot;</p>
<p>原来不是只有我会这样。这种&quot;被理解&quot;的感觉本身就是治愈。</p>
<h2 id="现在的状态" tabindex="-1">现在的状态 <a class="header-anchor" href="#现在的状态" aria-label="Permalink to &quot;现在的状态&quot;"></a></h2>
<p>倦怠没有完全消失，偶尔还会冒出来。</p>
<p>但我不再慌了。感觉累了就休息，不挺着。偶尔也会给自己安排&quot;什么都不做&quot;的一天——不学习，不工作，就躺着，不为此感到愧疚。</p>
<p>后来我发现一个有意思的事：节奏慢下来之后，效率反而比逼自己的时候高。</p>
<p>如果你也正处在这种&quot;什么都不想干&quot;的状态里，别急着骂自己懒。也许你只是太累了，身体在替你踩刹车。</p>
<p>歇一歇吧，天塌不下来的。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[在独立博客时代，我们还需要什么]]></title>
            <link>https://blog.shkart.online/posts/indie-blog-reflections.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/indie-blog-reflections.html</guid>
            <pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[有时候我也会想：2024 年了，谁还看博客啊。
抖音刷起来多爽，小红书图多好看，公众号推送多方便。写个人博客，不就是自言自语吗？
写了一年之后，我的答案是：确实是自言自语。但自言自语有时候也挺有用的。]]></description>
            <content:encoded><![CDATA[<p>有时候我也会想：2024 年了，谁还看博客啊。</p>
<p>抖音刷起来多爽，小红书图多好看，公众号推送多方便。写个人博客，不就是自言自语吗？</p>
<p>写了一年之后，我的答案是：确实是自言自语。但自言自语有时候也挺有用的。</p>
<h2 id="为什么开始写" tabindex="-1">为什么开始写 <a class="header-anchor" href="#为什么开始写" aria-label="Permalink to &quot;为什么开始写&quot;"></a></h2>
<p>最初的想法很简单：学了新技术想记下来。</p>
<p>之前都丢在 Notion 里，后来发现半年后自己都懒得翻。写在博客上，至少有个公开的压力，会把笔记整理得更像样一点。</p>
<p>后来慢慢开始写一些非技术的内容——心态变化、生活吐槽。没想到这些文章反而写起来更有感觉。</p>
<h2 id="一年下来的数据" tabindex="-1">一年下来的数据 <a class="header-anchor" href="#一年下来的数据" aria-label="Permalink to &quot;一年下来的数据&quot;"></a></h2>
<p>说出来有点寒酸：</p>
<ul>
<li>总文章数：30 多篇</li>
<li>日均访问：大概十几个 UV</li>
<li>最高一篇：一百来个阅读</li>
</ul>
<p>没有什么爆款，也没赚到一分钱。</p>
<p>但我发现自己在意的不是这个。</p>
<h2 id="意外的收获" tabindex="-1">意外的收获 <a class="header-anchor" href="#意外的收获" aria-label="Permalink to &quot;意外的收获&quot;"></a></h2>
<h3 id="写作让思路变清晰" tabindex="-1">写作让思路变清晰 <a class="header-anchor" href="#写作让思路变清晰" aria-label="Permalink to &quot;写作让思路变清晰&quot;"></a></h3>
<p>有些问题在脑子里转了好几天想不通，一旦开始写，思路就自然理顺了。</p>
<p>写博客有点像小黄鸭调试法——把想法说出来（写出来）的过程本身就是在梳理逻辑。</p>
<h3 id="技术文章是最好的笔记" tabindex="-1">技术文章是最好的笔记 <a class="header-anchor" href="#技术文章是最好的笔记" aria-label="Permalink to &quot;技术文章是最好的笔记&quot;"></a></h3>
<p>半年前写的 Docker 部署文章，后来换服务器的时候真的翻出来用了。比什么笔记 App 都好用，因为当时写的时候就假设&quot;读者什么都不知道&quot;，步骤特别详细。</p>
<h3 id="结识了一些人" tabindex="-1">结识了一些人 <a class="header-anchor" href="#结识了一些人" aria-label="Permalink to &quot;结识了一些人&quot;"></a></h3>
<p>虽然流量不多，但偶尔有人通过评论或者 GitHub 加我微信，聊几句技术。这种感觉挺好的——在互联网的角落里，和陌生人因为文字产生连接。</p>
<h2 id="坚持不下去的时候" tabindex="-1">坚持不下去的时候 <a class="header-anchor" href="#坚持不下去的时候" aria-label="Permalink to &quot;坚持不下去的时候&quot;"></a></h2>
<p>也不是一路顺利。中间有两个月完全没更新。</p>
<p>那段时间工作太忙，每天下班后只想躺着。还有几次写到一半觉得写得太烂，直接关了编辑器。</p>
<p>后来想通了一件事：博客不是 KPI，不用周更。有想说的就写，没有就算了。</p>
<p>去掉&quot;必须产出&quot;的压力后，反而写得更多了。</p>
<h2 id="关于工具" tabindex="-1">关于工具 <a class="header-anchor" href="#关于工具" aria-label="Permalink to &quot;关于工具&quot;"></a></h2>
<p>用什么搭博客其实不重要。</p>
<p>我选了 VitePress 是因为熟悉 Vue。如果你熟悉 React 可以用 Next.js，嫌折腾可以直接用 Notion 搭一个。</p>
<p>花在选工具上的时间，不如拿来写第一篇文章。</p>
<h2 id="写在最后" tabindex="-1">写在最后 <a class="header-anchor" href="#写在最后" aria-label="Permalink to &quot;写在最后&quot;"></a></h2>
<p>社交媒体上发的东西，隔几天就沉下去了，平台说删就删。</p>
<p>博客上写的东西，你的域名你做主，想留多久留多久。</p>
<p>十年后回头看自己年轻时写的文章，应该会是一件挺有意思的事。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Skywolf 香港 Lumen VPS 综合测评]]></title>
            <link>https://blog.shkart.online/posts/skywolf-hk-lumen-vps.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/skywolf-hk-lumen-vps.html</guid>
            <pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
Skywolf 是朋友群里有人推荐的，之前没听说过。

月付 $3 的价格，CN2 都买不到，它敢打 Lumen 线路？我带着怀疑试了试。

## 配置信息

| 项目 | 规格 |
|]]></description>
            <content:encoded><![CDATA[<p>Skywolf 是朋友群里有人推荐的，之前没听说过。</p>
<p>月付 $3 的价格，CN2 都买不到，它敢打 Lumen 线路？我带着怀疑试了试。</p>
<h2 id="配置信息" tabindex="-1">配置信息 <a class="header-anchor" href="#配置信息" aria-label="Permalink to &quot;配置信息&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>项目</th>
<th>规格</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU</td>
<td>1核</td>
</tr>
<tr>
<td>内存</td>
<td>1GB</td>
</tr>
<tr>
<td>硬盘</td>
<td>20GB SSD</td>
</tr>
<tr>
<td>流量</td>
<td>1TB/月</td>
</tr>
<tr>
<td>带宽</td>
<td>500Mbps</td>
</tr>
<tr>
<td>价格</td>
<td>$3/月</td>
</tr>
</tbody>
</table>
<p>$3 这个价格，配置算中规中矩。重点看线路表现。</p>
<h2 id="速度测试" tabindex="-1">速度测试 <a class="header-anchor" href="#速度测试" aria-label="Permalink to &quot;速度测试&quot;"></a></h2>
<p>分三个运营商测了一下（广东地区）：</p>
<table tabindex="0">
<thead>
<tr>
<th>运营商</th>
<th>平均延迟</th>
<th>丢包率</th>
<th>晚高峰</th>
</tr>
</thead>
<tbody>
<tr>
<td>电信</td>
<td>45ms</td>
<td>0.5%</td>
<td>偶尔波动</td>
</tr>
<tr>
<td>联通</td>
<td>50ms</td>
<td>1%</td>
<td>还行</td>
</tr>
<tr>
<td>移动</td>
<td>30ms</td>
<td>0%</td>
<td>很稳</td>
</tr>
</tbody>
</table>
<p>移动网络下表现最好，30ms 延迟基本感受不到。这和 Lumen 线路对移动的优化有关。</p>
<p>电信和联通差一些，晚高峰会有一定波动，但不至于不能用。</p>
<h2 id="两个月使用体验" tabindex="-1">两个月使用体验 <a class="header-anchor" href="#两个月使用体验" aria-label="Permalink to &quot;两个月使用体验&quot;"></a></h2>
<h3 id="稳定性" tabindex="-1">稳定性 <a class="header-anchor" href="#稳定性" aria-label="Permalink to &quot;稳定性&quot;"></a></h3>
<p>用了两个月，宕机过一次，持续了大约两小时。客服工单响应挺快，半小时就回了。</p>
<p>对于 $3/月 的价格，这个稳定性我觉得可以接受。但不建议用来跑重要业务。</p>
<h3 id="速度感受" tabindex="-1">速度感受 <a class="header-anchor" href="#速度感受" aria-label="Permalink to &quot;速度感受&quot;"></a></h3>
<p>跑了一个静态博客站点在上面。日常访问速度在移动网络下很流畅，和国内主机的体验差不太多。</p>
<p>电信网络下稍微慢一点，能感知到但不影响使用。</p>
<h3 id="控制面板" tabindex="-1">控制面板 <a class="header-anchor" href="#控制面板" aria-label="Permalink to &quot;控制面板&quot;"></a></h3>
<p>SolusVM 面板，比较老但功能够用。重装系统、开关机、查看流量都有。</p>
<p>没有搬瓦工那个 KiwiVM 好看，但该有的都有。</p>
<h2 id="和同价位的对比" tabindex="-1">和同价位的对比 <a class="header-anchor" href="#和同价位的对比" aria-label="Permalink to &quot;和同价位的对比&quot;"></a></h2>
<p>$3 这个价位能选的不多，简单对比一下：</p>
<table tabindex="0">
<thead>
<tr>
<th>商家</th>
<th>线路</th>
<th>移动延迟</th>
<th>稳定性</th>
</tr>
</thead>
<tbody>
<tr>
<td>Skywolf</td>
<td>Lumen</td>
<td>30ms</td>
<td>中</td>
</tr>
<tr>
<td>RackNerd</td>
<td>普通</td>
<td>150ms+</td>
<td>中</td>
</tr>
<tr>
<td>HostHatch</td>
<td>普通</td>
<td>180ms+</td>
<td>中</td>
</tr>
</tbody>
</table>
<p>可以看到，同价位里 Skywolf 的移动端延迟是碾压级的。但如果你主要用电信网络，优势就没那么大了。</p>
<h2 id="适合谁用" tabindex="-1">适合谁用 <a class="header-anchor" href="#适合谁用" aria-label="Permalink to &quot;适合谁用&quot;"></a></h2>
<ul>
<li>✅ 移动网络用户</li>
<li>✅ 个人博客、小项目</li>
<li>✅ 预算有限的学生</li>
<li>❌ 需要高稳定性的生产环境</li>
<li>❌ 电信用户追求极致速度</li>
</ul>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>$3/月，移动端 30ms 延迟，这个性价比确实可以。</p>
<p>如果你主要用移动网络，或者只是想找个便宜的 VPS 练手，Skywolf 值得一试。但别指望它像 DMIT 那样稳如老狗——一分钱一分货，这个道理在哪都适用。</p>
]]></content:encoded>
            <author>Destiny</author>
            <enclosure url="https://blog.shkart.online/images/vps-cover.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[写给自己的年终总结]]></title>
            <link>https://blog.shkart.online/posts/year-end-summary-2024.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/year-end-summary-2024.html</guid>
            <pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[又到了写年终总结的时候。去年立的 flag 先翻出来对对账。
 去年的 flag
年初给自己定了几个目标：
1. ~~学完 Docker + K8s~~ — Docker 学了，K8s 碰都没碰
2.]]></description>
            <content:encoded><![CDATA[<p>又到了写年终总结的时候。去年立的 flag 先翻出来对对账。</p>
<h2 id="去年的-flag" tabindex="-1">去年的 flag <a class="header-anchor" href="#去年的-flag" aria-label="Permalink to &quot;去年的 flag&quot;"></a></h2>
<p>年初给自己定了几个目标：</p>
<ol>
<li><s>学完 Docker + K8s</s> — Docker 学了，K8s 碰都没碰</li>
<li><s>坚持写博客，至少更新 24 篇</s> — 写了 30 多篇，居然超额完成了</li>
<li><s>养成运动习惯</s> — 跑了两个月，暑假中断后再也没恢复</li>
<li><s>多读几本书</s> — 读了三本。三本。惭愧</li>
</ol>
<p>完成率大概 40%，和往年差不多。</p>
<h2 id="技术上" tabindex="-1">技术上 <a class="header-anchor" href="#技术上" aria-label="Permalink to &quot;技术上&quot;"></a></h2>
<p>今年最大的变化是 AI 工具彻底融入了日常工作流。</p>
<p>年初还在犹豫要不要订阅 Copilot，年底已经离不开 Cursor 了。写代码的方式在短短一年里变了太多。</p>
<p>技术栈方面，Vue 3 总算用熟了。从年初看文档时的懵逼，到年底能独立负责项目里的模块，这个进步自己还是认的。</p>
<p>Docker 也学了，虽然 K8s 确实没碰。但说实话，个人项目用 Docker Compose 够了，K8s 对我来说目前用不上。</p>
<p>还搭了这个博客。从选技术栈到部署到写内容，全程自己折腾。虽然流量不多，但看着文章数一篇篇增加，还挺有成就感的。</p>
<h2 id="心态上" tabindex="-1">心态上 <a class="header-anchor" href="#心态上" aria-label="Permalink to &quot;心态上&quot;"></a></h2>
<p>今年情绪起伏挺大的。</p>
<p>年初因为比较焦虑，花了很多时间在刷别人的动态上，越看越焦。后来有一段时间强制自己不看朋友圈，反而好了很多。</p>
<p>中间有两个月完全不想干活，后来才意识到那是倦怠。不是懒，是真的累了。接受了这个事实之后，允许自己休息，状态慢慢恢复了。</p>
<p>下半年相对稳定一些，可能是因为找到了一些自己的节奏。</p>
<h2 id="遗憾" tabindex="-1">遗憾 <a class="header-anchor" href="#遗憾" aria-label="Permalink to &quot;遗憾&quot;"></a></h2>
<ul>
<li>运动没坚持下来。说了八百遍，做到的次数屈指可数</li>
<li>社交依然很少。除了工作上的交流，基本没有拓展新的人际关系</li>
<li>很多想学的东西还停留在&quot;加了收藏&quot;的阶段</li>
</ul>
<h2 id="意外的收获" tabindex="-1">意外的收获 <a class="header-anchor" href="#意外的收获" aria-label="Permalink to &quot;意外的收获&quot;"></a></h2>
<ul>
<li>博客居然真的坚持下来了。虽然中间断了两个月，但后来又捡起来了</li>
<li>通过写心理类的文章，对自己的认知清晰了不少</li>
<li>学会了和焦虑共处。没有消除它，但至少不再被它控制</li>
</ul>
<h2 id="明年的打算" tabindex="-1">明年的打算 <a class="header-anchor" href="#明年的打算" aria-label="Permalink to &quot;明年的打算&quot;"></a></h2>
<p>想了想，不立 flag 了。</p>
<p>以前每年立一堆目标，完成率从来没超过 50%。与其立一堆做不到的目标然后自责，不如就定一条：</p>
<p>做好手上的事，别让自己太累。</p>
<p>其他的走着看吧。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[当初对 GPT-5 的预测，现在回头看看]]></title>
            <link>https://blog.shkart.online/posts/gpt5-prediction.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/gpt5-prediction.html</guid>
            <pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[去年这个时候，我和很多人一样，满怀期待地等 GPT-5。
当时还专门写了一篇预测文章（就是你现在看到的这篇，我直接在原文上改了）。回头看，有些猜对了，有些纯属想多了。
 当时的预测
我当时猜了三个方向]]></description>
            <content:encoded><![CDATA[<p>去年这个时候，我和很多人一样，满怀期待地等 GPT-5。</p>
<p>当时还专门写了一篇预测文章（就是你现在看到的这篇，我直接在原文上改了）。回头看，有些猜对了，有些纯属想多了。</p>
<h2 id="当时的预测" tabindex="-1">当时的预测 <a class="header-anchor" href="#当时的预测" aria-label="Permalink to &quot;当时的预测&quot;"></a></h2>
<p>我当时猜了三个方向：</p>
<ol>
<li><strong>多模态原生支持</strong> —— 视频理解和生成</li>
<li><strong>长上下文窗口</strong> —— 可能达到百万 token</li>
<li><strong>更强的推理能力</strong> —— 数学和逻辑问题</li>
</ol>
<p>现在一个一个看。</p>
<h2 id="预测复盘" tabindex="-1">预测复盘 <a class="header-anchor" href="#预测复盘" aria-label="Permalink to &quot;预测复盘&quot;"></a></h2>
<h3 id="多模态-猜对了方向-但形式不同" tabindex="-1">多模态：猜对了方向，但形式不同 <a class="header-anchor" href="#多模态-猜对了方向-但形式不同" aria-label="Permalink to &quot;多模态：猜对了方向，但形式不同&quot;"></a></h3>
<p>GPT-4o 确实做到了多模态，而且做得比我预想的更激进——实时语音对话、看摄像头、读屏幕截图。</p>
<p>不过视频生成是 Sora 在做，并没有集成到 GPT 里面。我当时把&quot;理解&quot;和&quot;生成&quot;混在一起说了，其实是两回事。</p>
<h3 id="长上下文-也算猜对了" tabindex="-1">长上下文：也算猜对了 <a class="header-anchor" href="#长上下文-也算猜对了" aria-label="Permalink to &quot;长上下文：也算猜对了&quot;"></a></h3>
<p>GPT-4 Turbo 做到了 128K，Gemini 做到了百万级别。方向没猜错。</p>
<p>但我当时没预到的是，长上下文更多是被国产模型（Kimi、DeepSeek）当成竞争差异点来推的。OpenAI 反而不怎么强调这个。</p>
<h3 id="推理能力-被-o1-狠狠打脸" tabindex="-1">推理能力：被 o1 狠狠打脸 <a class="header-anchor" href="#推理能力-被-o1-狠狠打脸" aria-label="Permalink to &quot;推理能力：被 o1 狠狠打脸&quot;"></a></h3>
<p>这个是我最没想到的。</p>
<p>我以为 GPT-5 会是 GPT-4 的&quot;更聪明版&quot;，就是同一个架构参数更大、数据更多。</p>
<p>结果 OpenAI 搞出了 o1 这种完全不同的模式——让模型&quot;慢思考&quot;，用更多的计算换更高的推理准确率。</p>
<p>GPT-5 到现在也没发布，反而是 o1、o3 这条路线成了主力。</p>
<h2 id="我没猜到的事" tabindex="-1">我没猜到的事 <a class="header-anchor" href="#我没猜到的事" aria-label="Permalink to &quot;我没猜到的事&quot;"></a></h2>
<p>列几个完全没预料到的：</p>
<ul>
<li><strong>AI Agent 方向的爆发</strong>：Claude 的 Computer Use、各种 AI 编程助手（Cursor、Windsurf），Agent 成了新战场</li>
<li><strong>开源模型追上来了</strong>：Llama 3.1 405B、DeepSeek V3，开源和闭源的差距在急速缩小</li>
<li><strong>Scaling Law 的争议</strong>：原来以为模型越大越强是铁律，现在发现不一定，o1 的路线说明巧妙的架构设计可能比暴力堆参数更有效</li>
</ul>
<h2 id="回头看预测这件事" tabindex="-1">回头看预测这件事 <a class="header-anchor" href="#回头看预测这件事" aria-label="Permalink to &quot;回头看预测这件事&quot;"></a></h2>
<p>做预测很难，尤其是 AI 领域，三个月就能换一次天地。</p>
<p>但写预测文章有个好处：过段时间回来看，能发现自己当时的认知盲区。比如我当时完全没有&quot;推理可以用慢思考换准确率&quot;这个概念，说明我对 AI 的理解还停留在&quot;大模型 = 大参数&quot;的阶段。</p>
<p>下次再做预测，可能会谦虚一点。</p>
<p>也可能不会。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[DeepSeek LLM 使用初体验]]></title>
            <link>https://blog.shkart.online/posts/deepseek-first-look.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/deepseek-first-look.html</guid>
            <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
最近国产大模型 DeepSeek 表现亮眼，朋友圈被刷屏了好几轮。

作为一个对 AI 模型有点上头的人，我花了一周时间认真试了试。

## 第一印象

注册很简单，网页端直接就能用。界面简洁，没有花里胡哨的东西，上来就是一个对话框。

第一个问题我问的是："用 Python 写一个简单的 LRU 缓存"。

它给的代码干净利落，注释也到位。不像有些模型，生成一堆代码还附带一大段"我来为您解释一下"的废话。

## 代码能力实测

这是我最关注的方向。测了几个场景：

### 算法题

丢了几道 LeetCode 中等难度的题目，通过率大约 80%。偶尔会在边界条件上翻车，但整体思路很清晰。

比起同期的文心一言和通义千问，代码质量明显高一截。

### 项目代码

让它写一个 Express 的 CRUD 接口，给出了完整的路由、中间件、错误处理。基本能直接跑。

不过它有个问题：生成的代码风格有点"教科书"，不太像真实项目里会写的东西。这点跟 GPT-3.5 差不多。

### Debug

把一段有 bug 的代码贴进去，它能准确定位问题——一个 async 函数里忘了 await。

定位速度比我自己看快多了，虽然这么说有点丢人。

## 中文对话能力

日常扯淡也试了试：

- 让它写一段产品文案，通顺自然，没有翻译腔
- 聊一些生活话题，比 GPT-3.5 的中文地道很多
- 不过深度讨论（比如哲学、社会问题）还是差 GPT-4 一个档次

中文是 DeepSeek 的强项，毕竟国内团队做的，语料优势在这。

## 和 GPT-3.5 的对比

用了一周之后的直觉判断：

| 维度 | DeepSeek | GPT-3.5 |
|]]></description>
            <content:encoded><![CDATA[<p>最近国产大模型 DeepSeek 表现亮眼，朋友圈被刷屏了好几轮。</p>
<p>作为一个对 AI 模型有点上头的人，我花了一周时间认真试了试。</p>
<h2 id="第一印象" tabindex="-1">第一印象 <a class="header-anchor" href="#第一印象" aria-label="Permalink to &quot;第一印象&quot;"></a></h2>
<p>注册很简单，网页端直接就能用。界面简洁，没有花里胡哨的东西，上来就是一个对话框。</p>
<p>第一个问题我问的是：&quot;用 Python 写一个简单的 LRU 缓存&quot;。</p>
<p>它给的代码干净利落，注释也到位。不像有些模型，生成一堆代码还附带一大段&quot;我来为您解释一下&quot;的废话。</p>
<h2 id="代码能力实测" tabindex="-1">代码能力实测 <a class="header-anchor" href="#代码能力实测" aria-label="Permalink to &quot;代码能力实测&quot;"></a></h2>
<p>这是我最关注的方向。测了几个场景：</p>
<h3 id="算法题" tabindex="-1">算法题 <a class="header-anchor" href="#算法题" aria-label="Permalink to &quot;算法题&quot;"></a></h3>
<p>丢了几道 LeetCode 中等难度的题目，通过率大约 80%。偶尔会在边界条件上翻车，但整体思路很清晰。</p>
<p>比起同期的文心一言和通义千问，代码质量明显高一截。</p>
<h3 id="项目代码" tabindex="-1">项目代码 <a class="header-anchor" href="#项目代码" aria-label="Permalink to &quot;项目代码&quot;"></a></h3>
<p>让它写一个 Express 的 CRUD 接口，给出了完整的路由、中间件、错误处理。基本能直接跑。</p>
<p>不过它有个问题：生成的代码风格有点&quot;教科书&quot;，不太像真实项目里会写的东西。这点跟 GPT-3.5 差不多。</p>
<h3 id="debug" tabindex="-1">Debug <a class="header-anchor" href="#debug" aria-label="Permalink to &quot;Debug&quot;"></a></h3>
<p>把一段有 bug 的代码贴进去，它能准确定位问题——一个 async 函数里忘了 await。</p>
<p>定位速度比我自己看快多了，虽然这么说有点丢人。</p>
<h2 id="中文对话能力" tabindex="-1">中文对话能力 <a class="header-anchor" href="#中文对话能力" aria-label="Permalink to &quot;中文对话能力&quot;"></a></h2>
<p>日常扯淡也试了试：</p>
<ul>
<li>让它写一段产品文案，通顺自然，没有翻译腔</li>
<li>聊一些生活话题，比 GPT-3.5 的中文地道很多</li>
<li>不过深度讨论（比如哲学、社会问题）还是差 GPT-4 一个档次</li>
</ul>
<p>中文是 DeepSeek 的强项，毕竟国内团队做的，语料优势在这。</p>
<h2 id="和-gpt-3-5-的对比" tabindex="-1">和 GPT-3.5 的对比 <a class="header-anchor" href="#和-gpt-3-5-的对比" aria-label="Permalink to &quot;和 GPT-3.5 的对比&quot;"></a></h2>
<p>用了一周之后的直觉判断：</p>
<table tabindex="0">
<thead>
<tr>
<th>维度</th>
<th>DeepSeek</th>
<th>GPT-3.5</th>
</tr>
</thead>
<tbody>
<tr>
<td>代码生成</td>
<td>略强</td>
<td>也行</td>
</tr>
<tr>
<td>中文理解</td>
<td>明显强</td>
<td>凑合</td>
</tr>
<tr>
<td>响应速度</td>
<td>快</td>
<td>快</td>
</tr>
<tr>
<td>复杂推理</td>
<td>一般</td>
<td>一般</td>
</tr>
<tr>
<td>价格</td>
<td>便宜</td>
<td>便宜</td>
</tr>
</tbody>
</table>
<p>整体水平接近，但对于中文场景 DeepSeek 更舒服。</p>
<h2 id="不足之处" tabindex="-1">不足之处 <a class="header-anchor" href="#不足之处" aria-label="Permalink to &quot;不足之处&quot;"></a></h2>
<p>也不是没有问题：</p>
<ul>
<li>长对话容易&quot;忘记&quot;前面的上下文</li>
<li>生成内容有时候偏保守，不如 GPT 那么&quot;放飞自我&quot;</li>
<li>社区生态和工具链还不够丰富</li>
</ul>
<h2 id="用完之后的感觉" tabindex="-1">用完之后的感觉 <a class="header-anchor" href="#用完之后的感觉" aria-label="Permalink to &quot;用完之后的感觉&quot;"></a></h2>
<p>说实话，国产模型能做到这个水平，我是有点惊讶的。</p>
<p>之前试过几个国产模型，要么中文很好但代码不行，要么反过来。DeepSeek 算是两边都跑到了及格线以上。</p>
<p>后来 V3 出来之后更猛了，但那是后话了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Kimi 长上下文测试：国产 AI 的差异化突破]]></title>
            <link>https://blog.shkart.online/posts/kimi-long-context-review.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/kimi-long-context-review.html</guid>
            <pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
最近国产 AI 产品井喷，但大多数是"套壳"。

Kimi 有点不一样，它主打"长上下文"，支持最多 200 万字的输入。

## 什么是长上下文

一般的 AI（GPT-3.5、文心一言）上下文长度在几千到几万字。

这意味着你不能把一整本书扔给它，必须分段处理。

Kimi 的 200 万字相当于：

- 约 4 本普通小说
- 或 10 篇硕士论文
- 或 50 份技术文档

## 使用场景

### 论文阅读

把整篇论文（甚至多篇相关论文）贴进去，问：

- "这篇论文的核心贡献是什么"
- "和 XX 论文相比有什么创新"
- "帮我解释第三章的公式"

再也不用一段一段喂了。

### 代码库分析

把整个项目的代码打包上传，问架构问题。

"这个项目的入口在哪里"、"用户登录流程是怎样的"，它能跨文件找答案。

### 书籍总结

一本 20 万字的书，让它：

- 提取核心观点
- 按章节总结
- 生成思维导图大纲

## 实测效果

测试了几个场景：

| 任务 | 效果 |
|]]></description>
            <content:encoded><![CDATA[<p>最近国产 AI 产品井喷，但大多数是&quot;套壳&quot;。</p>
<p>Kimi 有点不一样，它主打&quot;长上下文&quot;，支持最多 200 万字的输入。</p>
<h2 id="什么是长上下文" tabindex="-1">什么是长上下文 <a class="header-anchor" href="#什么是长上下文" aria-label="Permalink to &quot;什么是长上下文&quot;"></a></h2>
<p>一般的 AI（GPT-3.5、文心一言）上下文长度在几千到几万字。</p>
<p>这意味着你不能把一整本书扔给它，必须分段处理。</p>
<p>Kimi 的 200 万字相当于：</p>
<ul>
<li>约 4 本普通小说</li>
<li>或 10 篇硕士论文</li>
<li>或 50 份技术文档</li>
</ul>
<h2 id="使用场景" tabindex="-1">使用场景 <a class="header-anchor" href="#使用场景" aria-label="Permalink to &quot;使用场景&quot;"></a></h2>
<h3 id="论文阅读" tabindex="-1">论文阅读 <a class="header-anchor" href="#论文阅读" aria-label="Permalink to &quot;论文阅读&quot;"></a></h3>
<p>把整篇论文（甚至多篇相关论文）贴进去，问：</p>
<ul>
<li>&quot;这篇论文的核心贡献是什么&quot;</li>
<li>&quot;和 XX 论文相比有什么创新&quot;</li>
<li>&quot;帮我解释第三章的公式&quot;</li>
</ul>
<p>再也不用一段一段喂了。</p>
<h3 id="代码库分析" tabindex="-1">代码库分析 <a class="header-anchor" href="#代码库分析" aria-label="Permalink to &quot;代码库分析&quot;"></a></h3>
<p>把整个项目的代码打包上传，问架构问题。</p>
<p>&quot;这个项目的入口在哪里&quot;、&quot;用户登录流程是怎样的&quot;，它能跨文件找答案。</p>
<h3 id="书籍总结" tabindex="-1">书籍总结 <a class="header-anchor" href="#书籍总结" aria-label="Permalink to &quot;书籍总结&quot;"></a></h3>
<p>一本 20 万字的书，让它：</p>
<ul>
<li>提取核心观点</li>
<li>按章节总结</li>
<li>生成思维导图大纲</li>
</ul>
<h2 id="实测效果" tabindex="-1">实测效果 <a class="header-anchor" href="#实测效果" aria-label="Permalink to &quot;实测效果&quot;"></a></h2>
<p>测试了几个场景：</p>
<table tabindex="0">
<thead>
<tr>
<th>任务</th>
<th>效果</th>
</tr>
</thead>
<tbody>
<tr>
<td>200 页 PDF 总结</td>
<td>✅ 准确</td>
</tr>
<tr>
<td>跨章节问答</td>
<td>✅ 能找到</td>
</tr>
<tr>
<td>细节定位</td>
<td>⚠️ 偶尔漏掉</td>
</tr>
<tr>
<td>复杂推理</td>
<td>⚠️ 比 GPT-4 弱</td>
</tr>
</tbody>
</table>
<p>长文档理解确实强，但复杂推理能力还差一截。</p>
<h2 id="使用限制" tabindex="-1">使用限制 <a class="header-anchor" href="#使用限制" aria-label="Permalink to &quot;使用限制&quot;"></a></h2>
<ol>
<li><strong>免费版限制</strong>：每天有次数限制</li>
<li><strong>响应速度</strong>：文档越长越慢</li>
<li><strong>格式支持</strong>：PDF 有时解析不完整</li>
</ol>
<h2 id="怎么用" tabindex="-1">怎么用 <a class="header-anchor" href="#怎么用" aria-label="Permalink to &quot;怎么用&quot;"></a></h2>
<p>直接访问 kimi.moonshot.cn，不需要翻墙。</p>
<p>支持网页端和手机 App，微信小程序也有。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Kimi 找到了一个差异化路径：不卷通用智能，专攻长文档处理。</p>
<p>对于需要大量阅读论文、文档的学生来说，这是个实用工具。免费额度够日常使用。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Claude 3 vs GPT-4：详细对比测试]]></title>
            <link>https://blog.shkart.online/posts/claude3-vs-gpt4-comparison.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/claude3-vs-gpt4-comparison.html</guid>
            <pubDate>Fri, 15 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
Claude 3 发布后，网上铺天盖地说它超越了 GPT-4。

作为两个模型的重度用户，我花了两周时间做了个相对系统的对比测试。

## 测试维度

1. 代码生成与调试
2. 长文本理解
3. 逻辑推理
4. 创意写作
5. 中文能力

每个维度设计了 5 个测试用例，使用 Claude 3 Opus 和 GPT-4 Turbo。

## 代码能力

| 测试项 | Claude 3 Opus | GPT-4 Turbo |
|]]></description>
            <content:encoded><![CDATA[<p>Claude 3 发布后，网上铺天盖地说它超越了 GPT-4。</p>
<p>作为两个模型的重度用户，我花了两周时间做了个相对系统的对比测试。</p>
<h2 id="测试维度" tabindex="-1">测试维度 <a class="header-anchor" href="#测试维度" aria-label="Permalink to &quot;测试维度&quot;"></a></h2>
<ol>
<li>代码生成与调试</li>
<li>长文本理解</li>
<li>逻辑推理</li>
<li>创意写作</li>
<li>中文能力</li>
</ol>
<p>每个维度设计了 5 个测试用例，使用 Claude 3 Opus 和 GPT-4 Turbo。</p>
<h2 id="代码能力" tabindex="-1">代码能力 <a class="header-anchor" href="#代码能力" aria-label="Permalink to &quot;代码能力&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>测试项</th>
<th>Claude 3 Opus</th>
<th>GPT-4 Turbo</th>
</tr>
</thead>
<tbody>
<tr>
<td>算法实现</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Bug 定位</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>代码解释</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
<tr>
<td>重构建议</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
</tbody>
</table>
<p>Claude 在代码解释上更详细，GPT-4 在复杂 bug 定位上更准。</p>
<h2 id="长文本理解" tabindex="-1">长文本理解 <a class="header-anchor" href="#长文本理解" aria-label="Permalink to &quot;长文本理解&quot;"></a></h2>
<p>这是 Claude 的强项。200k 上下文窗口真的能用。</p>
<p>测试了用整本《西游记》问细节问题，Claude 能准确回答第几回的内容。GPT-4 Turbo 的 128k 上下文在长度上有限制，而且定位精度不如 Claude。</p>
<h2 id="逻辑推理" tabindex="-1">逻辑推理 <a class="header-anchor" href="#逻辑推理" aria-label="Permalink to &quot;逻辑推理&quot;"></a></h2>
<p>出乎意料，两者差距不大。</p>
<p>数学推理、逻辑链推导，两个模型水平接近。都会犯一些低级错误，但思路都能跟上。</p>
<h2 id="创意写作" tabindex="-1">创意写作 <a class="header-anchor" href="#创意写作" aria-label="Permalink to &quot;创意写作&quot;"></a></h2>
<p>这个主观性强，我个人感受：</p>
<ul>
<li>Claude 写的文章更有&quot;人味&quot;，用词自然</li>
<li>GPT-4 更像标准的&quot;AI 八股文&quot;，结构工整但有点死板</li>
</ul>
<p>让两个都写博客文章，Claude 的版本直接能发，GPT-4 的要改改。</p>
<h2 id="中文能力" tabindex="-1">中文能力 <a class="header-anchor" href="#中文能力" aria-label="Permalink to &quot;中文能力&quot;"></a></h2>
<p>GPT-4 在中文上还是更强，表达地道，不会有翻译腔。</p>
<p>Claude 的中文进步很多，但偶尔还是能看出&quot;外国人学中文&quot;的痕迹。</p>
<h2 id="结论" tabindex="-1">结论 <a class="header-anchor" href="#结论" aria-label="Permalink to &quot;结论&quot;"></a></h2>
<p>没有绝对的赢家。</p>
<ul>
<li><strong>选 Claude 3</strong>：长文档处理、创意写作、需要详细解释</li>
<li><strong>选 GPT-4</strong>：中文场景、复杂代码调试、多模态需求</li>
</ul>
<p>我现在两个都订阅了，根据任务类型切换使用。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[从 React 转到 Vue 3：一个月后的真实感受]]></title>
            <link>https://blog.shkart.online/posts/react-to-vue3-journey.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/react-to-vue3-journey.html</guid>
            <pubDate>Fri, 08 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[背景是这样：在上家公司写了三年 React，跳槽后新公司技术栈是 Vue 3 + TypeScript。

一开始有点抗拒，毕竟 React 用熟了，换框架等于重新学习。一个月后，心态变了。
]]></description>
            <content:encoded><![CDATA[<p>背景是这样：在上家公司写了三年 React，跳槽后新公司技术栈是 Vue 3 + TypeScript。</p>
<p>一开始有点抗拒，毕竟 React 用熟了，换框架等于重新学习。一个月后，心态变了。</p>
<h2 id="上手成本" tabindex="-1">上手成本 <a class="header-anchor" href="#上手成本" aria-label="Permalink to &quot;上手成本&quot;"></a></h2>
<p>Vue 3 的学习曲线比预期平缓。</p>
<p>如果你熟悉现代 JavaScript，组合式 API 的思路和 React Hooks 其实很像：</p>
<div class="language-vue vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">vue</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setup</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> lang</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"ts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { ref, computed, onMounted } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vue'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> doubled</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> computed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> count.value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">onMounted</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mounted'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
</div><p>最不习惯的反而是模板语法。写惯了 JSX 的自由度，再回来写 <code>v-if</code>、<code>v-for</code> 有点束缚感。</p>
<h2 id="响应式系统" tabindex="-1">响应式系统 <a class="header-anchor" href="#响应式系统" aria-label="Permalink to &quot;响应式系统&quot;"></a></h2>
<p>Vue 的响应式是真正的&quot;自动&quot;。</p>
<p>React 里你得小心翼翼处理依赖数组，防止 useEffect 死循环。Vue 里基本不用想这些，改了数据视图就会更新。</p>
<p>但 <code>.value</code> 这个东西确实烦人。ref 需要 <code>.value</code> 访问，reactive 不需要，容易混淆。</p>
<h2 id="开发体验" tabindex="-1">开发体验 <a class="header-anchor" href="#开发体验" aria-label="Permalink to &quot;开发体验&quot;"></a></h2>
<p>Vue 3 + Vite 的开发体验极好。</p>
<p>热更新速度飞快，比 webpack 时代不知道强多少。TypeScript 支持也很完善，Volar 插件配合 IDE 补全舒服。</p>
<h2 id="生态差异" tabindex="-1">生态差异 <a class="header-anchor" href="#生态差异" aria-label="Permalink to &quot;生态差异&quot;"></a></h2>
<p>这个 React 确实更强。</p>
<p>找个状态管理方案，React 有 Redux、Zustand、Jotai、Recoil 一大堆。Vue 基本就是 Pinia。</p>
<p>但反过来想，选择少也意味着不用纠结。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>React 和 Vue 3 都是好工具，争论谁更好没意义。</p>
<p>对我来说：</p>
<ul>
<li>React 的心智模型更函数式，适合复杂状态管理</li>
<li>Vue 3 的开发体验更顺滑，适合快速开发</li>
</ul>
<p>现在两个都能写，反而觉得视野开阔了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Docker 容器化部署实战]]></title>
            <link>https://blog.shkart.online/posts/docker-deployment-guide.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/docker-deployment-guide.html</guid>
            <pubDate>Tue, 05 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA["在我电脑上能跑啊。"
这句话大概是程序员最常说的遗言了。Docker 就是为了解决这个问题而生的。
以下是我部署个人项目时积累的一些实战经验，不是从文档里抄的，是真踩过坑的。
 一个能用的 Dock]]></description>
            <content:encoded><![CDATA[<p>&quot;在我电脑上能跑啊。&quot;</p>
<p>这句话大概是程序员最常说的遗言了。Docker 就是为了解决这个问题而生的。</p>
<p>以下是我部署个人项目时积累的一些实战经验，不是从文档里抄的，是真踩过坑的。</p>
<h2 id="一个能用的-dockerfile" tabindex="-1">一个能用的 Dockerfile <a class="header-anchor" href="#一个能用的-dockerfile" aria-label="Permalink to &quot;一个能用的 Dockerfile&quot;"></a></h2>
<p>先看一个 Node.js 项目的典型 Dockerfile：</p>
<div class="language-docker vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">docker</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> node:18-alpine</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WORKDIR</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /app</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> package*.json ./</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">RUN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> npm ci --only=production</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> . .</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">EXPOSE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> 3000</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CMD</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"node"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"server.js"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><p>看着简单，但里面有几个容易忽略的细节。</p>
<h3 id="先复制-package-json-再复制代码" tabindex="-1">先复制 package.json 再复制代码 <a class="header-anchor" href="#先复制-package-json-再复制代码" aria-label="Permalink to &quot;先复制 package.json 再复制代码&quot;"></a></h3>
<p>很多教程把 <code>COPY . .</code> 写在前面，一步到位。</p>
<p>问题是：你改了一行业务代码，Docker 就要重新 <code>npm install</code>。因为文件变了，缓存失效。</p>
<p>先复制 <code>package.json</code>，装完依赖再复制代码，这样只要依赖不变，<code>npm install</code> 那层就走缓存。构建速度能快好几倍。</p>
<h3 id="用-npm-ci-而不是-npm-install" tabindex="-1">用 <code>npm ci</code> 而不是 <code>npm install</code> <a class="header-anchor" href="#用-npm-ci-而不是-npm-install" aria-label="Permalink to &quot;用 `npm ci` 而不是 `npm install`&quot;"></a></h3>
<p><code>npm ci</code> 严格按照 <code>package-lock.json</code> 安装，速度更快，结果更可预测。生产环境用这个更靠谱。</p>
<h3 id="用-alpine-镜像" tabindex="-1">用 alpine 镜像 <a class="header-anchor" href="#用-alpine-镜像" aria-label="Permalink to &quot;用 alpine 镜像&quot;"></a></h3>
<p><code>node:18</code> 的镜像有 900MB+，<code>node:18-alpine</code> 只有 100MB 出头。体积差了近 10 倍。</p>
<p>除非你的项目依赖一些需要 glibc 的原生模块，否则都推荐用 alpine。</p>
<h2 id="docker-compose-编排" tabindex="-1">Docker Compose 编排 <a class="header-anchor" href="#docker-compose-编排" aria-label="Permalink to &quot;Docker Compose 编排&quot;"></a></h2>
<p>单个容器跑个 Demo 可以，正经项目一般是 App + 数据库 + 缓存，这时候需要 Compose：</p>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'3.8'</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">services</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  app</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    ports</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"3000:3000"</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    depends_on</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">db</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    environment</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">DATABASE_URL=postgres://user:pass@db:5432/mydb</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  db</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    image</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">postgres:15-alpine</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    environment</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      POSTGRES_USER</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">user</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      POSTGRES_PASSWORD</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pass</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      POSTGRES_DB</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">mydb</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    volumes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pgdata:/var/lib/postgresql/data</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">volumes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  pgdata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span></code></pre>
</div><p>几个注意事项：</p>
<ul>
<li><code>depends_on</code> 只保证启动顺序，不保证数据库&quot;准备好了&quot;。如果 App 启动时数据库还没初始化完，会报连接错误。需要在应用层做重试</li>
<li>Volume 要声明，否则容器重建后数据就没了</li>
<li>数据库密码用环境变量传入，别硬编码在配置里</li>
</ul>
<h2 id="我踩过的坑" tabindex="-1">我踩过的坑 <a class="header-anchor" href="#我踩过的坑" aria-label="Permalink to &quot;我踩过的坑&quot;"></a></h2>
<h3 id="dockerignore-忘了写" tabindex="-1">.dockerignore 忘了写 <a class="header-anchor" href="#dockerignore-忘了写" aria-label="Permalink to &quot;.dockerignore 忘了写&quot;"></a></h3>
<p>第一次构建，镜像整整 2GB。后来发现把 <code>node_modules</code> 和 <code>.git</code> 都打进去了。</p>
<p>加个 <code>.dockerignore</code>：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>node_modules</span></span>
<span class="line"><span>.git</span></span>
<span class="line"><span>.env</span></span>
<span class="line"><span>*.log</span></span></code></pre>
</div><p>镜像立刻缩到 200MB。</p>
<h3 id="时区问题" tabindex="-1">时区问题 <a class="header-anchor" href="#时区问题" aria-label="Permalink to &quot;时区问题&quot;"></a></h3>
<p>容器默认是 UTC 时区，日志里的时间和本地差八小时。排查问题的时候差点疯了。</p>
<p>解决方案是在 Dockerfile 里加一行：</p>
<div class="language-docker vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">docker</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">RUN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> apk add --no-cache tzdata</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ENV</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> TZ=Asia/Shanghai</span></span></code></pre>
</div><h3 id="健康检查没配" tabindex="-1">健康检查没配 <a class="header-anchor" href="#健康检查没配" aria-label="Permalink to &quot;健康检查没配&quot;"></a></h3>
<p>容器&quot;启动了&quot;不代表&quot;能用了&quot;。App 可能还在初始化数据库连接。</p>
<p>Compose 里可以加 healthcheck：</p>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">healthcheck</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"CMD"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"curl"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-f"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://localhost:3000/health"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  interval</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">30s</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  timeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">10s</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  retries</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span></span></code></pre>
</div><h2 id="部署流程" tabindex="-1">部署流程 <a class="header-anchor" href="#部署流程" aria-label="Permalink to &quot;部署流程&quot;"></a></h2>
<p>我现在的部署流程：</p>
<ol>
<li>本地开发用 Docker Compose，保证环境一致</li>
<li>推代码到 GitHub</li>
<li>服务器上 <code>git pull &amp;&amp; docker compose up -d --build</code></li>
<li>完事</li>
</ol>
<p>虽然没有 CI/CD 那么自动化，但对个人项目来说够用了。等项目大了再上 GitHub Actions。</p>
<h2 id="最后" tabindex="-1">最后 <a class="header-anchor" href="#最后" aria-label="Permalink to &quot;最后&quot;"></a></h2>
<p>Docker 入门不难，难的是把各种细节处理好。</p>
<p>上面这些坑我每个至少浪费了半小时，写下来希望别人能少走弯路。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[当"比较"成为痛苦的来源]]></title>
            <link>https://blog.shkart.online/posts/comparison-psychology.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/comparison-psychology.html</guid>
            <pubDate>Tue, 20 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[同学聚会，是我这两年最不想参加的活动。

不是因为不想见老朋友，而是害怕那个环节——"最近怎么样"。

 令人窒息的"近况分享"

去年那次聚会，我真的破防了。

A 说刚升了技术主管]]></description>
            <content:encoded><![CDATA[<p>同学聚会，是我这两年最不想参加的活动。</p>
<p>不是因为不想见老朋友，而是害怕那个环节——&quot;最近怎么样&quot;。</p>
<h2 id="令人窒息的-近况分享" tabindex="-1">令人窒息的&quot;近况分享&quot; <a class="header-anchor" href="#令人窒息的-近况分享" aria-label="Permalink to &quot;令人窒息的&quot;近况分享&quot;&quot;"></a></h2>
<p>去年那次聚会，我真的破防了。</p>
<p>A 说刚升了技术主管，带五个人的团队。</p>
<p>B 刚从大厂跳槽，package 翻了一倍。</p>
<p>C 在准备移民，房子都买好了。</p>
<p>轮到我了：&quot;我...还在原来公司，没什么特别的。&quot;</p>
<p>那天晚上回家后，我躺在床上翻来覆去睡不着。</p>
<p>为什么他们都那么厉害？为什么只有我还在原地踏步？我是不是真的很差？</p>
<h2 id="比较的心理陷阱" tabindex="-1">比较的心理陷阱 <a class="header-anchor" href="#比较的心理陷阱" aria-label="Permalink to &quot;比较的心理陷阱&quot;"></a></h2>
<p>后来慢慢想通了，那天晚上的痛苦来源于几个心理机制：</p>
<h3 id="_1-选择性注意" tabindex="-1">1. 选择性注意 <a class="header-anchor" href="#_1-选择性注意" aria-label="Permalink to &quot;1. 选择性注意&quot;"></a></h3>
<p>我只看到了比我强的人，完全忘了聚会上还有很多人和我差不多。</p>
<p>其实那天还有好几个人也在&quot;普普通通&quot;地过，只是当时我完全没注意到。</p>
<h3 id="_2-单一维度比较" tabindex="-1">2. 单一维度比较 <a class="header-anchor" href="#_2-单一维度比较" aria-label="Permalink to &quot;2. 单一维度比较&quot;"></a></h3>
<p>A 升了主管，但他每天加班到十一点，几乎没有个人生活。</p>
<p>B 跳槽涨薪了，但她焦虑得头发都掉了很多。</p>
<p>我只看到了他们的成就，没看到他们为此付出的代价。</p>
<h3 id="_3-终点思维" tabindex="-1">3. 终点思维 <a class="header-anchor" href="#_3-终点思维" aria-label="Permalink to &quot;3. 终点思维&quot;"></a></h3>
<p>把别人的当前状态当成&quot;终点&quot;来和自己比较。</p>
<p>但人生不是比赛，不是到某个节点就结束了。他们今天领先，不代表五年后还是。</p>
<h2 id="我的应对方法" tabindex="-1">我的应对方法 <a class="header-anchor" href="#我的应对方法" aria-label="Permalink to &quot;我的应对方法&quot;"></a></h2>
<p>意识到这些后，我开始调整自己的心态。</p>
<h3 id="减少社交媒体浏览" tabindex="-1">减少社交媒体浏览 <a class="header-anchor" href="#减少社交媒体浏览" aria-label="Permalink to &quot;减少社交媒体浏览&quot;"></a></h3>
<p>朋友圈是&quot;精心包装&quot;的人生展示，大家只发好的一面。</p>
<p>看多了容易产生&quot;所有人都在变好，只有我原地踏步&quot;的错觉。</p>
<p>现在我把朋友圈入口折叠了，每周最多刷一次。</p>
<h3 id="和过去的自己比" tabindex="-1">和过去的自己比 <a class="header-anchor" href="#和过去的自己比" aria-label="Permalink to &quot;和过去的自己比&quot;"></a></h3>
<p>与其问&quot;我比别人如何&quot;，不如问&quot;我比去年如何&quot;。</p>
<p>去年这时候，我连某些技术栈都不会用。现在我可以独立负责一个模块了。</p>
<p>这个视角切换让人轻松很多。</p>
<h3 id="接受多元的成功标准" tabindex="-1">接受多元的成功标准 <a class="header-anchor" href="#接受多元的成功标准" aria-label="Permalink to &quot;接受多元的成功标准&quot;"></a></h3>
<p>谁规定&quot;升职加薪&quot;才叫成功？</p>
<p>有人选择拼事业，有人选择生活平衡，有人创业，有人躺平。</p>
<p>都是选择。只要自己不后悔就行。</p>
<h3 id="允许自己有-慢一步-的时候" tabindex="-1">允许自己有&quot;慢一步&quot;的时候 <a class="header-anchor" href="#允许自己有-慢一步-的时候" aria-label="Permalink to &quot;允许自己有&quot;慢一步&quot;的时候&quot;"></a></h3>
<p>不是所有人都要在同一节奏上狂奔。</p>
<p>有人 25 岁当上总监，有人 35 岁才找到方向。</p>
<p>谁规定人生是百米赛跑呢？跑马拉松的人也不少。</p>
<h2 id="现在怎么看那次聚会" tabindex="-1">现在怎么看那次聚会 <a class="header-anchor" href="#现在怎么看那次聚会" aria-label="Permalink to &quot;现在怎么看那次聚会&quot;"></a></h2>
<p>回头看那次令我破防的聚会，其实有些好笑。</p>
<p>那些&quot;升职&quot;的朋友，有几个后来说其实压力大得快抑郁。那些&quot;涨薪&quot;的朋友，有人发现新公司更累了。</p>
<p>每个人都有自己的困扰，只是当时大家都在展示最光鲜的一面。</p>
<p>如果再来一次，我希望可以坦然地说：</p>
<p>&quot;我还在摸索自己的方向，但我在努力，这就够了。&quot;</p>
<p>现在的我，偶尔还是会在看到别人晋升的消息时心里一紧。但比起以前，我学会了一件事：感受到了就承认，然后提醒自己我不知道这个人的完整故事。</p>
<p>下次再有聚会，我希望能坦然地说：&quot;我还在摸索，但一直在努力。&quot;</p>
<p>这就够了。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Sora 震撼发布：AI 视频生成进入新纪元]]></title>
            <link>https://blog.shkart.online/posts/sora-video-ai-release.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/sora-video-ai-release.html</guid>
            <pubDate>Fri, 16 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[昨天凌晨，OpenAI 发布了 Sora。

看完演示视频，我沉默了好久。这不是进步，这是代际跃迁。

 Sora 能做什么

一句话描述，生成一段视频。

比如："一个时尚的女人走在]]></description>
            <content:encoded><![CDATA[<p>昨天凌晨，OpenAI 发布了 Sora。</p>
<p>看完演示视频，我沉默了好久。这不是进步，这是代际跃迁。</p>
<h2 id="sora-能做什么" tabindex="-1">Sora 能做什么 <a class="header-anchor" href="#sora-能做什么" aria-label="Permalink to &quot;Sora 能做什么&quot;"></a></h2>
<p>一句话描述，生成一段视频。</p>
<p>比如：&quot;一个时尚的女人走在东京的街道上，街道上有霓虹灯和动画城市标牌...&quot;</p>
<p>Sora 生成的不是几秒钟的短片，而是长达 60 秒的完整视频。而且：</p>
<ul>
<li>画质达到 1080p</li>
<li>运动连贯自然</li>
<li>光影效果逼真</li>
<li>镜头跟随流畅</li>
</ul>
<h2 id="技术突破在哪" tabindex="-1">技术突破在哪 <a class="header-anchor" href="#技术突破在哪" aria-label="Permalink to &quot;技术突破在哪&quot;"></a></h2>
<p>之前的 AI 视频生成（Runway、Pika）最多几秒，画面经常扭曲变形。</p>
<p>Sora 解决了几个核心问题：</p>
<ol>
<li><strong>时序一致性</strong>：同一个人在 60 秒内保持相同外貌</li>
<li><strong>物理理解</strong>：物体运动符合物理规律</li>
<li><strong>复杂场景</strong>：多个角色同时出现不会混乱</li>
</ol>
<p>OpenAI 说它是&quot;世界模拟器&quot;，不是在拼凑画面，而是理解了世界运作的规律。</p>
<h2 id="对行业的影响" tabindex="-1">对行业的影响 <a class="header-anchor" href="#对行业的影响" aria-label="Permalink to &quot;对行业的影响&quot;"></a></h2>
<p>这个影响太大了：</p>
<h3 id="短视频制作" tabindex="-1">短视频制作 <a class="header-anchor" href="#短视频制作" aria-label="Permalink to &quot;短视频制作&quot;"></a></h3>
<p>以后抖音、B站的视频素材可能很多是 AI 生成的。一个人+Sora 就能开工作室。</p>
<h3 id="电影特效" tabindex="-1">电影特效 <a class="header-anchor" href="#电影特效" aria-label="Permalink to &quot;电影特效&quot;"></a></h3>
<p>预览级别的特效镜头可以用 AI 先跑一版，确认效果后再精修。成本大幅下降。</p>
<h3 id="虚假信息" tabindex="-1">虚假信息 <a class="header-anchor" href="#虚假信息" aria-label="Permalink to &quot;虚假信息&quot;"></a></h3>
<p>这个是隐忧。以后看到视频也不能信了，深度伪造将更难识别。</p>
<h2 id="什么时候能用" tabindex="-1">什么时候能用 <a class="header-anchor" href="#什么时候能用" aria-label="Permalink to &quot;什么时候能用&quot;"></a></h2>
<p>OpenAI 说还在安全测试，暂时不对外开放。</p>
<p>按惯例，可能会逐步：</p>
<ol>
<li>先给特定创作者内测</li>
<li>再开放 Plus 用户</li>
<li>最后才是 API</li>
</ol>
<p>预计今年下半年能用上？</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Sora 让我第一次感受到&quot;AI 取代人类工作&quot;不是说说而已。</p>
<p>视频剪辑、特效师、动画师...这些职业可能真的要被改变了。</p>
<p>作为学生，我们赶上了这个时代。学会用好 AI 工具，可能比学具体技能更重要。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[VitePress 博客进阶：自定义主题和部署优化]]></title>
            <link>https://blog.shkart.online/posts/build-blog-with-vitepress.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/build-blog-with-vitepress.html</guid>
            <pubDate>Sat, 10 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[搭博客用 VitePress 很快，半小时就能跑起来。
但默认主题长得都一样。想让它有点个性，得花些功夫折腾。
 自定义主题
VitePress 的主题系统其实挺灵活的，核心是在 `.vitepres]]></description>
            <content:encoded><![CDATA[<p>搭博客用 VitePress 很快，半小时就能跑起来。</p>
<p>但默认主题长得都一样。想让它有点个性，得花些功夫折腾。</p>
<h2 id="自定义主题" tabindex="-1">自定义主题 <a class="header-anchor" href="#自定义主题" aria-label="Permalink to &quot;自定义主题&quot;"></a></h2>
<p>VitePress 的主题系统其实挺灵活的，核心是在 <code>.vitepress/theme/index.ts</code> 里扩展默认主题：</p>
<div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DefaultTheme </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vitepress/theme'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> MyLayout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './MyLayout.vue'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './custom.css'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  extends: DefaultTheme,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  Layout: MyLayout,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>用这个方式你可以：</p>
<ul>
<li>覆盖默认布局，加自定义的 Header、Footer</li>
<li>插入全局组件（比如文章列表、标签云）</li>
<li>引入自定义 CSS 变量改颜色</li>
</ul>
<h3 id="改颜色方案" tabindex="-1">改颜色方案 <a class="header-anchor" href="#改颜色方案" aria-label="Permalink to &quot;改颜色方案&quot;"></a></h3>
<p>VitePress 用 CSS 变量控制配色，在 <code>custom.css</code> 里覆盖就行：</p>
<div class="language-css vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">css</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">:root</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">  --vp-c-brand-1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#5b8af5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">  --vp-c-brand-2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#3a6ce0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">  --vp-c-brand-soft</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rgba</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">91</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">138</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">245</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.14</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>改完立刻生效。我在这上面花了一个下午调色，虽然最后和原来差别不大。</p>
<h3 id="文章列表页" tabindex="-1">文章列表页 <a class="header-anchor" href="#文章列表页" aria-label="Permalink to &quot;文章列表页&quot;"></a></h3>
<p>VitePress 默认没有博客文章列表，需要自己写。核心是用 <code>createContentLoader</code> 获取所有文章：</p>
<div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { createContentLoader } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vitepress'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> createContentLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'posts/*.md'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  transform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">rawData</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> rawData.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sort</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(b.frontmatter.date) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a.frontmatter.date)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
</div><p>然后写个 Vue 组件渲染列表。这部分代码比较多就不贴了，思路就是拿到数据后用 <code>v-for</code> 循环显示。</p>
<h2 id="性能优化" tabindex="-1">性能优化 <a class="header-anchor" href="#性能优化" aria-label="Permalink to &quot;性能优化&quot;"></a></h2>
<p>VitePress 本身已经很快了，但还有几个可以优化的点。</p>
<h3 id="图片处理" tabindex="-1">图片处理 <a class="header-anchor" href="#图片处理" aria-label="Permalink to &quot;图片处理&quot;"></a></h3>
<p>博客文章里的图片是大头。我的做法是：</p>
<ol>
<li>用 WebP 格式替代 PNG/JPG</li>
<li>图片宽度控制在 800px 以内</li>
<li>后来直接用了图床，本地不存图了</li>
</ol>
<h3 id="字体加载" tabindex="-1">字体加载 <a class="header-anchor" href="#字体加载" aria-label="Permalink to &quot;字体加载&quot;"></a></h3>
<p>引入 Google Fonts 会拖慢首屏加载。我的解决方案是用 <code>font-display: swap</code>，先显示系统字体，等自定义字体下载完再替换。</p>
<p>用户感知上几乎没有延迟。</p>
<h2 id="部署到-cloudflare-pages" tabindex="-1">部署到 Cloudflare Pages <a class="header-anchor" href="#部署到-cloudflare-pages" aria-label="Permalink to &quot;部署到 Cloudflare Pages&quot;"></a></h2>
<p>之前用 Vercel，速度一般。换到 Cloudflare Pages 之后快了不少。</p>
<p>配置很简单：</p>
<ol>
<li>GitHub 仓库连接到 Cloudflare Pages</li>
<li>构建命令：<code>npm run docs:build</code></li>
<li>输出目录：<code>.vitepress/dist</code></li>
<li>提交代码自动部署</li>
</ol>
<p>免费额度完全够个人博客用，而且自带 CDN，国内访问也不慢。</p>
<h3 id="自定义域名" tabindex="-1">自定义域名 <a class="header-anchor" href="#自定义域名" aria-label="Permalink to &quot;自定义域名&quot;"></a></h3>
<p>Cloudflare 本身就是 DNS 服务商，加域名特别方便：</p>
<ol>
<li>域名的 NS 记录指向 Cloudflare</li>
<li>Pages 设置里添加自定义域名</li>
<li>SSL 证书自动签发</li>
</ol>
<p>整个过程十分钟搞定。</p>
<h2 id="踩过的坑" tabindex="-1">踩过的坑 <a class="header-anchor" href="#踩过的坑" aria-label="Permalink to &quot;踩过的坑&quot;"></a></h2>
<ul>
<li><strong>热更新偶尔抽风</strong>：改了 CSS 变量后不生效，需要重启 dev server。这个问题在 Vite 5 之后好了很多</li>
<li><strong>Markdown 里用 Vue 组件</strong>：语法正确但渲染不出来，通常是组件没有全局注册</li>
<li><strong>构建后路由 404</strong>：SPA fallback 没配对，Cloudflare Pages 需要加 <code>_redirects</code> 文件</li>
</ul>
<h2 id="现在的效果" tabindex="-1">现在的效果 <a class="header-anchor" href="#现在的效果" aria-label="Permalink to &quot;现在的效果&quot;"></a></h2>
<p>折腾完之后，博客加载速度在 Lighthouse 上能跑到 95+ 分。</p>
<p>样式也算有了一点自己的感觉。虽然和那些精心设计的主题博客比还差得远，但至少不完全是默认样式了。</p>
<p>够用就行。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[2024年最值得入手的香港 VPS 推荐]]></title>
            <link>https://blog.shkart.online/posts/best-hk-vps-2024.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/best-hk-vps-2024.html</guid>
            <pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[
折腾 VPS 这件事，一旦开始就很难停下来。

去年到今年，我陆续买了几家香港 VPS，有的用着不错，有的直接踩雷。整理一下经验，免得你们重复交学费。

## 选 VPS 我在意什么

价格当然重要，但不是唯一因素。以下是我的优先级：

1. **延迟**：建站用的话，国内访问延迟最好在 50ms 以内
2. **稳定性**：别隔三差五宕机，晚高峰别丢包
3. **带宽**：至少 1Mbps 保底，最好 5-10Mbps
4. **价格**：个人项目，月付不超过 50 块

## 1. DMIT.io — 稳定之选

- **线路**：CN2 GIA
- **价格**：$39.9/年起
- **实测延迟**：电信 35ms，联通 40ms，移动 45ms

DMIT 是我用得最久的一家。CN2 GIA 线路质量没话说，晚高峰也很稳定。

缺点是价格偏贵，而且经常缺货。便宜的套餐基本靠抢，一开卖几分钟就没了。

**适合**：追求稳定、用来建站的人。

## 2. 阿里云国际版

- **线路**：骨干网直连
- **价格**：约 ¥24/月（轻量应用服务器）
- **实测延迟**：电信 30ms，联通 35ms，移动 50ms

大厂背书，稳定性没得说。控制台功能齐全，快照、监控都有。

缺点是带宽小，轻量服务器套餐一般只给 30Mbps 峰值带宽，日常跑个小站没问题，跑代理就别想了。

另外需要注册国际版账号，需要有外币信用卡。

**适合**：想省心、有外币信用卡的人。

## 3. 搬瓦工 (BandwagonHost)

- **线路**：GIA-E（CN2 GIA 电信 + 联通 + 移动）
- **价格**：$49.99/年起
- **实测延迟**：电信 32ms，联通 38ms，移动 42ms

老牌商家，GIA-E 线路三网都优化，速度很稳。

KiwiVM 控制面板操作方便，支持一键换机房（如果不满意当前节点）。

缺点也是贵，而且便宜套餐基本永远缺货。用了两年没出过大问题。

**适合**：预算充足、想一步到位的人。

## 延迟对比

| 商家 | 电信 | 联通 | 移动 | 月价 |
|]]></description>
            <content:encoded><![CDATA[<p>折腾 VPS 这件事，一旦开始就很难停下来。</p>
<p>去年到今年，我陆续买了几家香港 VPS，有的用着不错，有的直接踩雷。整理一下经验，免得你们重复交学费。</p>
<h2 id="选-vps-我在意什么" tabindex="-1">选 VPS 我在意什么 <a class="header-anchor" href="#选-vps-我在意什么" aria-label="Permalink to &quot;选 VPS 我在意什么&quot;"></a></h2>
<p>价格当然重要，但不是唯一因素。以下是我的优先级：</p>
<ol>
<li><strong>延迟</strong>：建站用的话，国内访问延迟最好在 50ms 以内</li>
<li><strong>稳定性</strong>：别隔三差五宕机，晚高峰别丢包</li>
<li><strong>带宽</strong>：至少 1Mbps 保底，最好 5-10Mbps</li>
<li><strong>价格</strong>：个人项目，月付不超过 50 块</li>
</ol>
<h2 id="_1-dmit-io-—-稳定之选" tabindex="-1">1. DMIT.io — 稳定之选 <a class="header-anchor" href="#_1-dmit-io-—-稳定之选" aria-label="Permalink to &quot;1. DMIT.io — 稳定之选&quot;"></a></h2>
<ul>
<li><strong>线路</strong>：CN2 GIA</li>
<li><strong>价格</strong>：$39.9/年起</li>
<li><strong>实测延迟</strong>：电信 35ms，联通 40ms，移动 45ms</li>
</ul>
<p>DMIT 是我用得最久的一家。CN2 GIA 线路质量没话说，晚高峰也很稳定。</p>
<p>缺点是价格偏贵，而且经常缺货。便宜的套餐基本靠抢，一开卖几分钟就没了。</p>
<p><strong>适合</strong>：追求稳定、用来建站的人。</p>
<h2 id="_2-阿里云国际版" tabindex="-1">2. 阿里云国际版 <a class="header-anchor" href="#_2-阿里云国际版" aria-label="Permalink to &quot;2. 阿里云国际版&quot;"></a></h2>
<ul>
<li><strong>线路</strong>：骨干网直连</li>
<li><strong>价格</strong>：约 ¥24/月（轻量应用服务器）</li>
<li><strong>实测延迟</strong>：电信 30ms，联通 35ms，移动 50ms</li>
</ul>
<p>大厂背书，稳定性没得说。控制台功能齐全，快照、监控都有。</p>
<p>缺点是带宽小，轻量服务器套餐一般只给 30Mbps 峰值带宽，日常跑个小站没问题，跑代理就别想了。</p>
<p>另外需要注册国际版账号，需要有外币信用卡。</p>
<p><strong>适合</strong>：想省心、有外币信用卡的人。</p>
<h2 id="_3-搬瓦工-bandwagonhost" tabindex="-1">3. 搬瓦工 (BandwagonHost) <a class="header-anchor" href="#_3-搬瓦工-bandwagonhost" aria-label="Permalink to &quot;3. 搬瓦工 (BandwagonHost)&quot;"></a></h2>
<ul>
<li><strong>线路</strong>：GIA-E（CN2 GIA 电信 + 联通 + 移动）</li>
<li><strong>价格</strong>：$49.99/年起</li>
<li><strong>实测延迟</strong>：电信 32ms，联通 38ms，移动 42ms</li>
</ul>
<p>老牌商家，GIA-E 线路三网都优化，速度很稳。</p>
<p>KiwiVM 控制面板操作方便，支持一键换机房（如果不满意当前节点）。</p>
<p>缺点也是贵，而且便宜套餐基本永远缺货。用了两年没出过大问题。</p>
<p><strong>适合</strong>：预算充足、想一步到位的人。</p>
<h2 id="延迟对比" tabindex="-1">延迟对比 <a class="header-anchor" href="#延迟对比" aria-label="Permalink to &quot;延迟对比&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th>商家</th>
<th>电信</th>
<th>联通</th>
<th>移动</th>
<th>月价</th>
</tr>
</thead>
<tbody>
<tr>
<td>DMIT</td>
<td>35ms</td>
<td>40ms</td>
<td>45ms</td>
<td>≈$3.3</td>
</tr>
<tr>
<td>阿里云</td>
<td>30ms</td>
<td>35ms</td>
<td>50ms</td>
<td>≈$3.4</td>
</tr>
<tr>
<td>搬瓦工</td>
<td>32ms</td>
<td>38ms</td>
<td>42ms</td>
<td>≈$4.2</td>
</tr>
</tbody>
</table>
<p>三家差距不大，搬瓦工三网都优化所以移动端体验最好。</p>
<h2 id="踩过的坑" tabindex="-1">踩过的坑 <a class="header-anchor" href="#踩过的坑" aria-label="Permalink to &quot;踩过的坑&quot;"></a></h2>
<ul>
<li><strong>别买太便宜的小商家</strong>：试过一家月付 $1 的，用了三个月跑路了，数据全没</li>
<li><strong>注意流量计费方式</strong>：有的是双向计费（上传+下载都算），实际可用流量只有标称的一半</li>
<li><strong>续费价格看清楚</strong>：有的首年优惠力度大，第二年翻倍</li>
</ul>
<h2 id="我的建议" tabindex="-1">我的建议 <a class="header-anchor" href="#我的建议" aria-label="Permalink to &quot;我的建议&quot;"></a></h2>
<p>如果你是学生、预算有限：先用阿里云轻量，够用且省心。</p>
<p>如果你愿意花点钱买稳定：DMIT 或者搬瓦工，用着踏实。</p>
<p>别在选 VPS 上花太多时间。选一家，用起来，把精力花在内容上。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[E 人堆里我是 I 人，I 人堆里我是 E 人]]></title>
            <link>https://blog.shkart.online/posts/social-anxiety-programmer.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/social-anxiety-programmer.html</guid>
            <pubDate>Sun, 05 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[MBTI 测了三次，三次结果不一样。
第一次 ENFP，第二次 INFP，第三次介于中间。我一度怀疑是不是自己乱选的。
后来仔细想了想，发现这个结果其实挺准的——因为我确实不是固定的 E 或者 I。
]]></description>
            <content:encoded><![CDATA[<p>MBTI 测了三次，三次结果不一样。</p>
<p>第一次 ENFP，第二次 INFP，第三次介于中间。我一度怀疑是不是自己乱选的。</p>
<p>后来仔细想了想，发现这个结果其实挺准的——因为我确实不是固定的 E 或者 I。</p>
<h2 id="我的-自动切换-模式" tabindex="-1">我的&quot;自动切换&quot;模式 <a class="header-anchor" href="#我的-自动切换-模式" aria-label="Permalink to &quot;我的&quot;自动切换&quot;模式&quot;"></a></h2>
<p>这个现象我观察了很久，总结下来就是一句话：</p>
<p><strong>周围人 E 的时候，我自动变 I。周围人 I 的时候，我自动变 E。</strong></p>
<p>具体来说：</p>
<h3 id="一桌子话多的人" tabindex="-1">一桌子话多的人 <a class="header-anchor" href="#一桌子话多的人" aria-label="Permalink to &quot;一桌子话多的人&quot;"></a></h3>
<p>大家都在抢着说话，气氛热烈。这时候我会自动退到&quot;听众模式&quot;，安静地吃东西，偶尔笑一笑，插两句话。</p>
<p>不是不想说，是觉得没必要。已经够热闹了，多我一个不多，少我一个不少。</p>
<p>而且说实话，在一群人都在表达的时候，安静地观察反而挺有意思的。你能看到很多社交场上的微妙互动。</p>
<h3 id="一桌子安静的人" tabindex="-1">一桌子安静的人 <a class="header-anchor" href="#一桌子安静的人" aria-label="Permalink to &quot;一桌子安静的人&quot;"></a></h3>
<p>场面冷下来了，没人说话，空气都快凝固了。</p>
<p>这时候我会莫名其妙地接管气氛。开始找话题、讲段子、问问别人最近在干嘛。</p>
<p>不是因为我天生爱说话，而是<strong>我受不了冷场</strong>。尴尬的沉默让我浑身不自在，还不如自己上去暖场。</p>
<p>同事聚会特别明显。如果桌上有一个特别会聊的人，我可以全程当安静的配角。如果全桌都是闷葫芦，我就不得不变成那个带气氛的人。</p>
<h2 id="在程序员团队里" tabindex="-1">在程序员团队里 <a class="header-anchor" href="#在程序员团队里" aria-label="Permalink to &quot;在程序员团队里&quot;"></a></h2>
<p>写代码这个行业，I 人比例偏高。所以在大多数工作场景里，我其实是偏 E 的那个。</p>
<p>开会的时候，如果大家都不说话，我会主动先发言，打破僵局。</p>
<p>需求讨论的时候，别人在打字发消息，我习惯直接走过去聊两句——效率高多了。</p>
<p>但如果碰到一个特别能说的产品经理或者 leader，我立刻就切回 I 人模式，安安静静听着就好。</p>
<h2 id="和朋友出去也是" tabindex="-1">和朋友出去也是 <a class="header-anchor" href="#和朋友出去也是" aria-label="Permalink to &quot;和朋友出去也是&quot;"></a></h2>
<p>这个规律在朋友圈子里同样适用。</p>
<p>和一群蹦迪型的朋友出去，我是最安静的那个。他们会说&quot;你今天怎么不说话&quot;。</p>
<p>和一群宅属性的朋友聚餐，我又变成全场最活跃的。他们会说&quot;你话好多啊&quot;。</p>
<p>搞得我都不知道自己到底是什么性格了。</p>
<h2 id="想了想为什么" tabindex="-1">想了想为什么 <a class="header-anchor" href="#想了想为什么" aria-label="Permalink to &quot;想了想为什么&quot;"></a></h2>
<p>有一段时间我觉得自己是不是太没有主见了，性格居然随着环境变？</p>
<p>后来想明白了：这不是&quot;没主见&quot;，更像是一种<strong>环境平衡器</strong>。</p>
<p>哪边缺了，我就往哪边补。场子太热了我帮忙降温，场子太冷了我帮忙暖场。</p>
<p>可能有些人就是天生对氛围比较敏感。不是在讨好谁，就是本能地觉得&quot;现在应该这样&quot;。</p>
<h2 id="这种性格的好处" tabindex="-1">这种性格的好处 <a class="header-anchor" href="#这种性格的好处" aria-label="Permalink to &quot;这种性格的好处&quot;"></a></h2>
<ul>
<li><strong>适应力强</strong>：什么样的人都能相处，不会觉得格格不入</li>
<li><strong>观察力强</strong>：当 I 人的时候在观察，当 E 人的时候在输出，两种模式都训练到了</li>
<li><strong>团队里挺好用的</strong>：不管团队是什么风格，都能融进去</li>
</ul>
<h2 id="也有烦的时候" tabindex="-1">也有烦的时候 <a class="header-anchor" href="#也有烦的时候" aria-label="Permalink to &quot;也有烦的时候&quot;"></a></h2>
<p>最烦的就是别人给你贴标签。</p>
<p>A 觉得你很外向，B 觉得你很内向。他们聊起你的时候可能完全对不上。</p>
<p>还有就是：在需要暖场的时候，其实挺累的。你以为你在享受社交，其实你在做功。到家之后只想一个人待着充电。</p>
<h2 id="现在怎么看" tabindex="-1">现在怎么看 <a class="header-anchor" href="#现在怎么看" aria-label="Permalink to &quot;现在怎么看&quot;"></a></h2>
<p>不再纠结自己是 E 还是 I 了。</p>
<p>MBTI 本来就是个参考，把人分成 16 种性格本身就太粗暴了。大多数人都在光谱的中间地带。</p>
<p>我就是那种会随着环境自动调节的人。在需要活跃的时候活跃，在可以安静的时候安静。</p>
<p>这挺好的。总比永远只有一种模式灵活。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[Python 3.12 新特性：写代码更爽了]]></title>
            <link>https://blog.shkart.online/posts/python-312-new-features.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/python-312-new-features.html</guid>
            <pubDate>Sun, 15 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Python 3.12 上周正式发布，我第一时间升级体验了一下。

这个版本的改进集中在性能和开发体验上，很实用。

 性能提升

官方说比 3.11 快 5%，我实测感觉差不多。

]]></description>
            <content:encoded><![CDATA[<p>Python 3.12 上周正式发布，我第一时间升级体验了一下。</p>
<p>这个版本的改进集中在性能和开发体验上，很实用。</p>
<h2 id="性能提升" tabindex="-1">性能提升 <a class="header-anchor" href="#性能提升" aria-label="Permalink to &quot;性能提升&quot;"></a></h2>
<p>官方说比 3.11 快 5%，我实测感觉差不多。</p>
<p>主要优化来自：</p>
<ul>
<li>更快的异步生成器</li>
<li>减少函数调用开销</li>
<li>内存使用优化</li>
</ul>
<p>对于日常脚本影响不大，但跑大型项目能感知到。</p>
<h2 id="更好的错误提示" tabindex="-1">更好的错误提示 <a class="header-anchor" href="#更好的错误提示" aria-label="Permalink to &quot;更好的错误提示&quot;"></a></h2>
<p>这个是我最喜欢的改进。</p>
<p>以前：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>NameError: name 'resutl' is not defined</span></span></code></pre>
</div><p>现在：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>NameError: name 'resutl' is not defined. Did you mean: 'result'?</span></span></code></pre>
</div><p>它会猜你想写什么！对于初学者太友好了。</p>
<p>还有更精确的语法错误定位：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 以前只说第 5 行有错</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 现在会用 ^^^ 标记具体是哪个地方错了</span></span></code></pre>
</div><h2 id="类型参数语法" tabindex="-1">类型参数语法 <a class="header-anchor" href="#类型参数语法" aria-label="Permalink to &quot;类型参数语法&quot;"></a></h2>
<p>终于不用手写 <code>TypeVar</code> 了：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 以前</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> typing </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> TypeVar</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">T </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> TypeVar(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'T'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> first</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(items: list[T]) -> T:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> items[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 现在</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> first[T](items: list[T]) </span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> T:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> items[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><p>简洁多了，和其他语言的泛型语法更接近。</p>
<h2 id="f-string-改进" tabindex="-1">f-string 改进 <a class="header-anchor" href="#f-string-改进" aria-label="Permalink to &quot;f-string 改进&quot;"></a></h2>
<p>现在 f-string 里可以用任意表达式了：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 以前会报错</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"result: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:=10</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # 这种复杂格式以前不支持</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 现在都可以</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"data: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">lambda</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: x)()</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span></code></pre>
</div><p>更灵活，虽然不建议写太复杂的表达式。</p>
<h2 id="怎么升级" tabindex="-1">怎么升级 <a class="header-anchor" href="#怎么升级" aria-label="Permalink to &quot;怎么升级&quot;"></a></h2>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># macOS</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">brew</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> python@3.12</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Windows</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 去官网下载安装包</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 或者用 pyenv</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pyenv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3.12.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pyenv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> global</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3.12.0</span></span></code></pre>
</div><p>建议用虚拟环境隔离，别直接替换系统 Python。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Python 3.12 是一个稳健的更新。</p>
<p>没有破坏性改动，但很多小改进能让日常开发更顺手。 特别是错误提示改进，对学习 Python 的同学帮助很大。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[GitHub Copilot Chat 上线：代码助手进入对话时代]]></title>
            <link>https://blog.shkart.online/posts/github-copilot-chat-review.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/github-copilot-chat-review.html</guid>
            <pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[
用了一年多的 Copilot，最近升级带来了 Chat 功能。

这个改变让 Copilot 从"代码补全工具"变成了"编程助手"。

## 能做什么

之前 Copilot 只能在你写代码时给建议。现在可以：

### 解释代码

选中一段代码，按 Cmd+I，输入 "/explain"。

它会告诉你这段代码在做什么，变量的作用，可能的问题。

看开源项目源码时特别有用。

### 生成测试

输入 "/tests"，它能根据选中的函数自动生成测试用例。

生成的测试基本能跑，边界情况覆盖也还行。

### 修复问题

把报错信息贴进去，输入 "/fix"。

它会分析错误原因并给出修复建议，有时候还会直接给你改好的代码。

### 重构建议

选中代码，输入 "/refactor"。

能给出优化建议：提取函数、改善命名、减少嵌套等。

## 和 ChatGPT 对比

两者定位不同：

| 场景 | Copilot Chat | ChatGPT |
|]]></description>
            <content:encoded><![CDATA[<p>用了一年多的 Copilot，最近升级带来了 Chat 功能。</p>
<p>这个改变让 Copilot 从&quot;代码补全工具&quot;变成了&quot;编程助手&quot;。</p>
<h2 id="能做什么" tabindex="-1">能做什么 <a class="header-anchor" href="#能做什么" aria-label="Permalink to &quot;能做什么&quot;"></a></h2>
<p>之前 Copilot 只能在你写代码时给建议。现在可以：</p>
<h3 id="解释代码" tabindex="-1">解释代码 <a class="header-anchor" href="#解释代码" aria-label="Permalink to &quot;解释代码&quot;"></a></h3>
<p>选中一段代码，按 Cmd+I，输入 &quot;/explain&quot;。</p>
<p>它会告诉你这段代码在做什么，变量的作用，可能的问题。</p>
<p>看开源项目源码时特别有用。</p>
<h3 id="生成测试" tabindex="-1">生成测试 <a class="header-anchor" href="#生成测试" aria-label="Permalink to &quot;生成测试&quot;"></a></h3>
<p>输入 &quot;/tests&quot;，它能根据选中的函数自动生成测试用例。</p>
<p>生成的测试基本能跑，边界情况覆盖也还行。</p>
<h3 id="修复问题" tabindex="-1">修复问题 <a class="header-anchor" href="#修复问题" aria-label="Permalink to &quot;修复问题&quot;"></a></h3>
<p>把报错信息贴进去，输入 &quot;/fix&quot;。</p>
<p>它会分析错误原因并给出修复建议，有时候还会直接给你改好的代码。</p>
<h3 id="重构建议" tabindex="-1">重构建议 <a class="header-anchor" href="#重构建议" aria-label="Permalink to &quot;重构建议&quot;"></a></h3>
<p>选中代码，输入 &quot;/refactor&quot;。</p>
<p>能给出优化建议：提取函数、改善命名、减少嵌套等。</p>
<h2 id="和-chatgpt-对比" tabindex="-1">和 ChatGPT 对比 <a class="header-anchor" href="#和-chatgpt-对比" aria-label="Permalink to &quot;和 ChatGPT 对比&quot;"></a></h2>
<p>两者定位不同：</p>
<table tabindex="0">
<thead>
<tr>
<th>场景</th>
<th>Copilot Chat</th>
<th>ChatGPT</th>
</tr>
</thead>
<tbody>
<tr>
<td>IDE 集成</td>
<td>✅ 原生</td>
<td>❌ 需要复制粘贴</td>
</tr>
<tr>
<td>项目上下文</td>
<td>✅ 能读取</td>
<td>❌ 手动提供</td>
</tr>
<tr>
<td>通用问答</td>
<td>⚠️ 一般</td>
<td>✅ 更强</td>
</tr>
<tr>
<td>代码补全</td>
<td>✅ 实时</td>
<td>❌ 无</td>
</tr>
</tbody>
</table>
<p>写代码时 Copilot Chat 更顺手，不用切换窗口。</p>
<h2 id="价格" tabindex="-1">价格 <a class="header-anchor" href="#价格" aria-label="Permalink to &quot;价格&quot;"></a></h2>
<p>Copilot 订阅 $10/月，学生免费。</p>
<p>如果你有 edu 邮箱，赶紧去申请 GitHub Education，白嫖 Copilot。</p>
<h2 id="使用技巧" tabindex="-1">使用技巧 <a class="header-anchor" href="#使用技巧" aria-label="Permalink to &quot;使用技巧&quot;"></a></h2>
<ol>
<li><strong>越具体越好</strong>：别问&quot;怎么优化&quot;，问&quot;怎么减少这个循环的时间复杂度&quot;</li>
<li><strong>给上下文</strong>：选中相关代码再提问</li>
<li><strong>迭代改进</strong>：第一版不满意就继续追问</li>
</ol>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>Copilot Chat 不能替代程序员，但能让编码效率提升 30%+。</p>
<p>对于学习编程的同学，它就像一个 24 小时在线的&quot;学长&quot;，随时可以请教。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[那段失眠的日子，我是这样扛过来的]]></title>
            <link>https://blog.shkart.online/posts/finals-insomnia-experience.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/finals-insomnia-experience.html</guid>
            <pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[项目上线前那周，我连续失眠了七天。

不是那种"躺下半小时才睡着"的程度，而是凌晨两点躺下，脑子里一直转，四五点还在看天花板。

第二天顶着黑眼圈开会，别人说什么听三遍才能理解。

 失眠]]></description>
            <content:encoded><![CDATA[<p>项目上线前那周，我连续失眠了七天。</p>
<p>不是那种&quot;躺下半小时才睡着&quot;的程度，而是凌晨两点躺下，脑子里一直转，四五点还在看天花板。</p>
<p>第二天顶着黑眼圈开会，别人说什么听三遍才能理解。</p>
<h2 id="失眠是怎么开始的" tabindex="-1">失眠是怎么开始的 <a class="header-anchor" href="#失眠是怎么开始的" aria-label="Permalink to &quot;失眠是怎么开始的&quot;"></a></h2>
<p>导火索是一个核心功能的 bug。</p>
<p>上线前一周，测试发现了一个严重问题。一边改 bug 一边慌，越慌越改不好。</p>
<p>晚上躺下后，脑子里自动 replay 白天没解决的问题：</p>
<p>&quot;那个边界条件处理对吗...&quot;
&quot;并发情况会不会出问题...&quot;
&quot;完了，明天还上不了线。&quot;</p>
<p>想着想着就焦虑，焦虑到心跳加速，根本睡不着。</p>
<h2 id="我试过的方法" tabindex="-1">我试过的方法 <a class="header-anchor" href="#我试过的方法" aria-label="Permalink to &quot;我试过的方法&quot;"></a></h2>
<p>失眠第三天，我开始找解决办法。</p>
<h3 id="喝牛奶、泡脚" tabindex="-1">喝牛奶、泡脚 <a class="header-anchor" href="#喝牛奶、泡脚" aria-label="Permalink to &quot;喝牛奶、泡脚&quot;"></a></h3>
<p>网上推荐最多的方法。</p>
<p>实测效果：身体是暖了，脑子还是转。对我来说没什么用。</p>
<h3 id="睡前不看手机" tabindex="-1">睡前不看手机 <a class="header-anchor" href="#睡前不看手机" aria-label="Permalink to &quot;睡前不看手机&quot;"></a></h3>
<p>强迫自己十一点后不碰手机。</p>
<p>效果一般。虽然避免了被短视频吸进去，但躺着无事可做反而更容易胡思乱想。</p>
<h3 id="白噪音" tabindex="-1">白噪音 <a class="header-anchor" href="#白噪音" aria-label="Permalink to &quot;白噪音&quot;"></a></h3>
<p>下了个 App，放雨声或者海浪声。</p>
<p>这个有点用！不能完全入睡，但至少能让思绪不那么乱。</p>
<h3 id="写下担心的事" tabindex="-1">写下担心的事 <a class="header-anchor" href="#写下担心的事" aria-label="Permalink to &quot;写下担心的事&quot;"></a></h3>
<p>这是后来发现最有效的。</p>
<p>睡前拿张纸，把脑子里转的事写下来：</p>
<ul>
<li>&quot;明天先修复那个 bug&quot;</li>
<li>&quot;提测前再跑一遍单元测试&quot;</li>
<li>&quot;周五前准备好上线文档&quot;</li>
</ul>
<p>写完后，告诉自己：&quot;已经记下来了，明天再说。&quot;</p>
<p>神奇的是，写完后真的轻松了一些。好像把焦虑从脑子里&quot;卸载&quot;到了纸上。</p>
<h2 id="后来的调整" tabindex="-1">后来的调整 <a class="header-anchor" href="#后来的调整" aria-label="Permalink to &quot;后来的调整&quot;"></a></h2>
<p>那次上线后，我开始刻意改变一些习惯：</p>
<h3 id="_1-不把所有任务压到最后" tabindex="-1">1. 不把所有任务压到最后 <a class="header-anchor" href="#_1-不把所有任务压到最后" aria-label="Permalink to &quot;1. 不把所有任务压到最后&quot;"></a></h3>
<p>以前总觉得&quot;还有时间&quot;，结果永远是临上线疯狂赶。</p>
<p>现在会提前拆分任务，每天做一点，避免最后熬夜。</p>
<h3 id="_2-接受-不完美" tabindex="-1">2. 接受&quot;不完美&quot; <a class="header-anchor" href="#_2-接受-不完美" aria-label="Permalink to &quot;2. 接受&quot;不完美&quot;&quot;"></a></h3>
<p>以前总想把每个细节都做到极致。事实是，时间永远不够。</p>
<p>现在的策略是：先保证核心功能稳定，边缘情况后续迭代。这样心态会好很多。</p>
<h3 id="_3-运动" tabindex="-1">3. 运动 <a class="header-anchor" href="#_3-运动" aria-label="Permalink to &quot;3. 运动&quot;"></a></h3>
<p>这是最意外的发现。</p>
<p>有一次傍晚跑了三公里，晚上十一点居然困得睁不开眼。身体上的疲惫，能覆盖脑子里的焦虑。</p>
<p>现在我会在忙的时候保持每天半小时的运动，哪怕只是出去走走。</p>
<h2 id="最后想说的" tabindex="-1">最后想说的 <a class="header-anchor" href="#最后想说的" aria-label="Permalink to &quot;最后想说的&quot;"></a></h2>
<p>失眠本身不可怕，可怕的是&quot;我睡不着了&quot;带来的二次焦虑。</p>
<p>越想睡越睡不着，恶性循环就是这么来的。</p>
<p>后来我发现最有用的一招反而是：告诉自己&quot;今晚可能睡不好，没关系&quot;。放下了这个执念，反而就睡着了。</p>
<p>所以如果你也正在经历这种困扰，别太跟自己过不去。睡不着不是你的错。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[独立博客搭建指南：为什么我选择了 VitePress]]></title>
            <link>https://blog.shkart.online/posts/vitepress-blog-setup-guide.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/vitepress-blog-setup-guide.html</guid>
            <pubDate>Sun, 18 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[想搭个人博客想了很久，终于在这个月动手了。

折腾了一圈，最终选择了 VitePress。来分享一下选型过程。

 需求梳理

我的需求很简单：

1. 写 Markdown：本地写文]]></description>
            <content:encoded><![CDATA[<p>想搭个人博客想了很久，终于在这个月动手了。</p>
<p>折腾了一圈，最终选择了 VitePress。来分享一下选型过程。</p>
<h2 id="需求梳理" tabindex="-1">需求梳理 <a class="header-anchor" href="#需求梳理" aria-label="Permalink to &quot;需求梳理&quot;"></a></h2>
<p>我的需求很简单：</p>
<ol>
<li><strong>写 Markdown</strong>：本地写文章，不想用后台编辑器</li>
<li><strong>部署简单</strong>：推代码就能发布</li>
<li><strong>加载快</strong>：静态站点优先</li>
<li><strong>能折腾</strong>：想自定义样式和功能</li>
</ol>
<p>基于这些需求，排除了 WordPress（太重）和 Notion（不够自由）。</p>
<h2 id="对比过程" tabindex="-1">对比过程 <a class="header-anchor" href="#对比过程" aria-label="Permalink to &quot;对比过程&quot;"></a></h2>
<h3 id="hexo" tabindex="-1">Hexo <a class="header-anchor" href="#hexo" aria-label="Permalink to &quot;Hexo&quot;"></a></h3>
<p>用过一段时间，优点是主题丰富。</p>
<p>缺点是 Node.js 版本升级后经常出问题，而且配置文件的 YAML 格式容易出错。</p>
<h3 id="hugo" tabindex="-1">Hugo <a class="header-anchor" href="#hugo" aria-label="Permalink to &quot;Hugo&quot;"></a></h3>
<p>构建速度飞快，单个博客几十毫秒就能编译。</p>
<p>但 Go 模板语法太难写了，自定义主题的学习成本很高。</p>
<h3 id="vitepress" tabindex="-1">VitePress <a class="header-anchor" href="#vitepress" aria-label="Permalink to &quot;VitePress&quot;"></a></h3>
<p>Vue 技术栈，模板语法熟悉。热更新极快，开发体验舒服。</p>
<p>默认主题简洁，自定义也方便。</p>
<h2 id="为什么选-vitepress" tabindex="-1">为什么选 VitePress <a class="header-anchor" href="#为什么选-vitepress" aria-label="Permalink to &quot;为什么选 VitePress&quot;"></a></h2>
<p>最核心的原因：<strong>我熟悉 Vue</strong>。</p>
<p>VitePress 的自定义都是写 Vue 组件，等于用自己熟悉的技术栈搭博客。遇到问题能自己解决。</p>
<p>另外几个优点：</p>
<ul>
<li><strong>Vite 构建</strong>：热更新秒级</li>
<li><strong>内置功能</strong>：搜索、暗黑模式、代码高亮开箱即用</li>
<li><strong>部署简单</strong>：生成静态文件，扔 Vercel/Cloudflare Pages 就行</li>
</ul>
<h2 id="搭建过程" tabindex="-1">搭建过程 <a class="header-anchor" href="#搭建过程" aria-label="Permalink to &quot;搭建过程&quot;"></a></h2>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vitepress@latest</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-blog</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dev</span></span></code></pre>
</div><p>不到五分钟就能看到本地预览。</p>
<p>剩下的时间都在折腾主题和样式，这才是大头。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>如果你也想搭博客，我的建议是：</p>
<ul>
<li><strong>会 Vue</strong>：选 VitePress</li>
<li><strong>会 React</strong>：选 Docusaurus 或者 Next.js + MDX</li>
<li><strong>不想写代码</strong>：选 Notion + Super 或者 WordPress</li>
</ul>
<p>工具不重要，重要的是动手开始写。</p>
<p>这个博客就是用 VitePress 搭的，你现在看到的就是效果。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
        <item>
            <title><![CDATA[ChatGPT 使用三个月：AI优化了哪些工作场景和流程]]></title>
            <link>https://blog.shkart.online/posts/chatgpt-workflow-integration.html</link>
            <guid isPermaLink="false">https://blog.shkart.online/posts/chatgpt-workflow-integration.html</guid>
            <pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[去年 11 月 ChatGPT 发布的时候，和大多数人一样，我觉得这就是个好玩的玩具。

三个月过去了，我认为它确实有一定用武之地。

 代码解释和学习

这是我用得最多的场景。

看]]></description>
            <content:encoded><![CDATA[<p>去年 11 月 ChatGPT 发布的时候，和大多数人一样，我觉得这就是个好玩的玩具。</p>
<p>三个月过去了，我认为它确实有一定用武之地。</p>
<h2 id="代码解释和学习" tabindex="-1">代码解释和学习 <a class="header-anchor" href="#代码解释和学习" aria-label="Permalink to &quot;代码解释和学习&quot;"></a></h2>
<p>这是我用得最多的场景。</p>
<p>看开源项目源码时，遇到看不懂的函数，直接贴进去问&quot;这段代码在做什么&quot;。</p>
<p>比看文档快多了，而且能追问细节。这是AI对计算机学生学习效率的提升。</p>
<h2 id="写英语作文终于要爽翻了" tabindex="-1">写英语作文终于要爽翻了 <a class="header-anchor" href="#写英语作文终于要爽翻了" aria-label="Permalink to &quot;写英语作文终于要爽翻了&quot;"></a></h2>
<p>以前英文作文写得磕磕绊绊的痛苦，终于解决了。</p>
<p>直接启动编辑器，写完英文，让 ChatGPT 打分，打完分就自己迭代文章版本。从此妈妈再也不用担心我的作文不会写问题了。</p>
<h2 id="代码生成" tabindex="-1">代码生成 <a class="header-anchor" href="#代码生成" aria-label="Permalink to &quot;代码生成&quot;"></a></h2>
<p>这个要分情况：</p>
<ul>
<li><strong>简单脚本</strong>：非常好用，正则表达式、数据处理脚本基本一次成</li>
<li><strong>复杂逻辑</strong>：只能当参考，直接用会有 bug</li>
<li><strong>业务代码</strong>：基本不用，它不懂业务上下文</li>
</ul>
<p>我现在的用法是让它生成一个初始版本，然后自己改。比从零写快很多。不过大多数场景应该只是，代码生成三分钟，自己修改三小时，十分鸡肋。有吕布拿着方天画戟骑狗的既视感。</p>
<h2 id="学习新概念" tabindex="-1">学习新概念 <a class="header-anchor" href="#学习新概念" aria-label="Permalink to &quot;学习新概念&quot;"></a></h2>
<p>想了解一个新技术但不想看长篇文档时，直接问 ChatGPT。</p>
<p>&quot;用通俗的话解释一下 Raft 共识算法&quot;，它能给你一个还不错的入门介绍。</p>
<p>当然，深入学习还是得看论文和官方文档。</p>
<h2 id="不好用的场景" tabindex="-1">不好用的场景 <a class="header-anchor" href="#不好用的场景" aria-label="Permalink to &quot;不好用的场景&quot;"></a></h2>
<p>也有些场景完全不行：</p>
<ul>
<li><strong>最新信息</strong>：2021 年之后的事情它一问三不知</li>
<li><strong>精确数据</strong>：别问它统计数据，经常瞎编</li>
<li><strong>复杂推理</strong>：多步推理很容易出错</li>
</ul>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>ChatGPT 不是无所不能的。但作为一个辅助工具，它确实能提高效率。</p>
<p>关键是找到它擅长的场景，然后形成习惯。现在写代码遇到小问题，我本能反应是开个聊天窗口问它。</p>
]]></content:encoded>
            <author>Destiny</author>
        </item>
    </channel>
</rss>