<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<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>masterLazy Blog</title>
        <link>https://masterLazy.github.io/blog</link>
        <description>masterLazy Blog</description>
        <lastBuildDate>Fri, 28 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <copyright>Copyright © 2025–2026 masterLazy</copyright>
        <item>
            <title><![CDATA[关于工具的思考：极客思维 vs 妥协思维]]></title>
            <link>https://masterLazy.github.io/blog/2026/08/28/关于工具的思考</link>
            <guid>https://masterLazy.github.io/blog/2026/08/28/关于工具的思考</guid>
            <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[副标题：AI 时代，每个需求都值得满足吗？]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="副标题ai-时代每个需求都值得满足吗">副标题：AI 时代，每个需求都值得满足吗？<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E5%89%AF%E6%A0%87%E9%A2%98ai-%E6%97%B6%E4%BB%A3%E6%AF%8F%E4%B8%AA%E9%9C%80%E6%B1%82%E9%83%BD%E5%80%BC%E5%BE%97%E6%BB%A1%E8%B6%B3%E5%90%97" class="hash-link" aria-label="副标题：AI 时代，每个需求都值得满足吗？的直接链接" title="副标题：AI 时代，每个需求都值得满足吗？的直接链接" translate="no">​</a></h3>
<br>
<p>“极客”（geek）原本在美国俚语里是个贬义词，意为“闷蛋、土包子”，但现在更多指“对某领域极感兴趣且知之甚多的人”。当代语境下的极客，往往与科技、互联网深度绑定，甚至带有一种“登峰造极”的褒义色彩。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="何为极客思维">何为极客思维<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E4%BD%95%E4%B8%BA%E6%9E%81%E5%AE%A2%E6%80%9D%E7%BB%B4" class="hash-link" aria-label="何为极客思维的直接链接" title="何为极客思维的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在笔者看来，极客的一个关键特征就是“极致”。为了这种极致，他们不惜投入大量时间精力。他们所操的这种观念，笔者就称为“极客思维”。如果要细细推究起来，拥有极客思维的人其实不一定是极客（要称为极客，似乎还要有一定成就、地位才行）。本文想探讨的是这种<strong>追求极致</strong>的精神，而非极客本身。</p>
<p>笔者是这样理解极客思维的：譬如一般人发现手机存了太多照片，空间不足了，怎么办呢？通常的想法是：把这些照片转移到其他介质中，比如拷到电脑上。但是电脑不能随身带在身边<sup><a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fn-1-89cd7a" id="user-content-fnref-1-89cd7a" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>，翻看照片不方便，怎么办呢？现在各种手机都推出了“云存储”功能，事实上厂商还恨不得你多用呢。市面上还有各种网盘，也提供相册备份/上云功能。再者，也可以上传到 IM 群聊的相册里。这些就是常见的解决方案了。</p>
<p>但这些方案并非是完美的。比如上述的种种云服务功能，虽说免费，但要忍受广告。如果不充 VIP，还要忍受下载限速。对于极客来说，或许有另一条路：架设一台 NAS，专门用来存储、备份个人数据；再通过内网穿透开放到公网。或者干脆购买云服务商的 NAS 服务。一言以蔽之，常人想到的是 C 端（Client）的方案，而极客可能想到的是 B 端（Business）的处理方法。即“<strong>自己打造工具</strong>”。</p>
<p>对于极客思维者<sup><a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fn-2-89cd7a" id="user-content-fnref-2-89cd7a" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup>来说，他们愿意折腾这些技术，花费时间精力，乐在其中。</p>
<blockquote>
<p>百度百科：
极客对这个世界的影响，不仅局限在物质层面，崇尚科技、自由和创造力的极客精神正越来越成为这个时代新的意识形态。……有些高级 Geek 则以编写共享软件为乐事。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="极客风潮">极客风潮<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E6%9E%81%E5%AE%A2%E9%A3%8E%E6%BD%AE" class="hash-link" aria-label="极客风潮的直接链接" title="极客风潮的直接链接" translate="no">​</a></h2>
<p>自己编程造工具、建立个人网站/博客、搭建自己的服务器、本地/私有化部署 LLM……这些事情过去似乎“独属于计算机生”的专利，门槛因 AI 的出现而越来越低。近年 Agents 技术逐渐成熟，Vibe Coder 越来越多，越来越多的人也加入了这场极客风潮。</p>
<blockquote>
<p>笔者有一种模糊的感觉，未经考证，就是网上关于“如何从 0 开始搭建自己的博客”、“一行代码不写，我打造了xxx”之类的内容，热度一直很高。人们喜欢看到这些行为，很多爱好科技之人也开始动手尝试——尽管不是科班出身。没错，AI 之出现，让“极客”这个词距离众人更近了一些。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="人人都能造工具">人人都能造工具<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E4%BA%BA%E4%BA%BA%E9%83%BD%E8%83%BD%E9%80%A0%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="人人都能造工具的直接链接" title="人人都能造工具的直接链接" translate="no">​</a></h3>
<p>AI 赋予了普通人像极客一样的“科技水平”，一个笔者认为<strong>最重要</strong>的影响就是降低了工具的制作门槛。比如普通的高中生、初中生，或者与计算机专业不相干的插画师、摄影师、编曲师，或者中小型自媒体博主，都能利用 Vibe Coding 打造自己的工具。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><p><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2026-08-28-01-6498d019576cc9b14403cacee5b55882.jpg" width="1631" height="700" class="img_ev3q"></p></div><p>笔者在 Bilibili 上随便找的 Vibe Coding 项目</p></div>
<p>这些 AI 加持下打造的工具如同雨后春笋，层出不穷。当然，也许有不少人只是想蹭个 AI 的热度，但是工具的制作门槛确实大大降低了。过去要造一个工具，需要同时掌握前端和后端技术（也就是全栈），还需要具备程序设计、编码、排障、运维各方面的能力。现在有了 Claude Code、Codex 之类的 Agents，只需要写写提示词就行了。人人在 AI 的借助下都能变身“极客”。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="人人都能造轮子">人人都能造「轮子」<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E4%BA%BA%E4%BA%BA%E9%83%BD%E8%83%BD%E9%80%A0%E8%BD%AE%E5%AD%90" class="hash-link" aria-label="人人都能造「轮子」的直接链接" title="人人都能造「轮子」的直接链接" translate="no">​</a></h3>
<p>计算机界有一句话叫作：<strong>不要重复造轮子</strong>。</p>
<p>意思就是，如果一个问题已经有现成的解决方案，就尽量采用现成的，自己造是下策。比如你要做服务器，大多数人都会选择使用 Nginx，而极少人会选择从套接字开始手搓。背后的哲学便是：造轮子的时间远大于用现有的轮子，且你自己造的轮子未必有现成的好。这里笔者想用轮子指代工作、生活中的各种辅助工具。</p>
<p>然而 AI 的出现，使这条“法则”动摇了。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89) invert(1) hue-rotate(180deg);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89) invert(1) hue-rotate(180deg);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><p><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2026-08-28-02-04fa33eb8b9e2c63fd104fdb9d32175f.webp" width="933" height="344" class="img_ev3q"></p></div><p>“造上瘾了”</p></div>
<p>人们解决轮子问题的思路，从过去“挑一个好用的”转变到了“让 AI 写一个好用的”，越来越接近于上文所说的“极客思维”。就拿 SSH 软件做个例子，过去如果挑不到好用的，就妥协一下，将就选一个用。而现在就可以直接让 AI 生成一个全新的。新“极客”们愿意为这样的的极致追求而投入时间精力。当然，有了 AI 之后，投入的成本大大降低了。</p>
<p>正是成本的降低，使得新造的轮子越来越多。本来可能只是觉得界面不好看，新“极客”们也许就愿意捣鼓 AI 做一个新的。这样小小的愿望，在过去可以被妥协，自己忍忍就得了。而现在我们不妥协的成本降低了，人们看到了第二种选择。</p>
<p>这就是笔者所说的“极客风潮”：AI 的出现，让极客思维者越来越多。他们愿意为了过去看来不痛不痒的小需求，花费精力打造新的工具，也热衷在生活中寻找一切有待优化之处，创造新的解决方案。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="我们得到了什么">我们得到了什么<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E6%88%91%E4%BB%AC%E5%BE%97%E5%88%B0%E4%BA%86%E4%BB%80%E4%B9%88" class="hash-link" aria-label="我们得到了什么的直接链接" title="我们得到了什么的直接链接" translate="no">​</a></h2>
<p>在这场风潮中，确实诞生了不少成功案例，例如：</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><p><img decoding="async" loading="lazy" src="https://p1.img.cctvpic.com/photoworkspace/contentimg/2026/07/15/2026071521040218543.jpg" alt="" class="img_ev3q"></p></div><p>来源：北京日报、BRTV新闻</p></div>
<blockquote>
<p>央视网：</p>
<p>20 多年的编程爱好者</p>
<p>初衷只为提高基层干部工作效率</p>
<p>谢陨石出生于 1976 年，大学学的是土木工程专业。编程作为他的爱好，已保持了至少二十多年。为了让工作效率更高，谢陨石就琢磨，<strong>能不能捡起自己的爱好，“手搓”一个小程序出来。</strong></p>
<p>谢陨石：编程是上大学时就有的爱好。在 AI 时代，只需要提供思路并搭建好框架，由 AI 协助规划方案，再逐步微调实施就行。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="我的经历">我的经历<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E6%88%91%E7%9A%84%E7%BB%8F%E5%8E%86" class="hash-link" aria-label="我的经历的直接链接" title="我的经历的直接链接" translate="no">​</a></h3>
<p>制造工具是快乐的。和写作、绘画等创作不同，创造一个工具软件，是在创造一件会反复使用、反复使你受益、“跑”起来的实体，<strong>成就感</strong>是很强的。</p>
<p><strong>如果做一件事有成就感，那么你就有继续做下去的动力。</strong></p>
<p>笔者用 AI 创造的第一款工具是 <a href="https://github.com/masterLazy/Collect" target="_blank" rel="noopener noreferrer" class="">Collect</a>，这是一个我用来管理美术参考图的工具。参考图管理，自然有现成的软件：付费的 Eagle、免费的 Billfish。笔者想直接用文件名存储标签信息，不依赖额外的数据，这样笔者的素材库就不会和某个特定软件绑定，更省心一点。然而，这样的需求确实比较稀奇（虽然抖抖村推荐这么干），据笔者的调查没有什么软件能做到这样。所以笔者就转向了 AI。</p>
<p>AI 打造的工具令笔者很满意。沉浸于喜悦中的笔者转换了心态：过去是犹豫于要不要向软件厂家妥协，此刻却用着自己所造之物“无所不能”；笔者开始不断给这个软件挑刺，精益求精。后来为了让 AI 能更好地调试前端界面，笔者甚至又让 AI 做了一个 MCP 插件：<a href="https://github.com/masterLazy/ollama-vision-mcp" target="_blank" rel="noopener noreferrer" class="">ollama-vision-mcp</a>。但后来其实没有帮助太多。</p>
<p>至于笔者造的第三个工具，<a href="https://github.com/masterLazy/Harmonology" target="_blank" rel="noopener noreferrer" class="">Harmonology</a>，则是笔者之前每次制作和声分析视频都要做 PPT + 动画太麻烦，让 AI 创造的方便工具。</p>
<p>后来 DeepSeek 涨价了，笔者才没有造出第四个项目。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="妥协的缺失">妥协的缺失<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E5%A6%A5%E5%8D%8F%E7%9A%84%E7%BC%BA%E5%A4%B1" class="hash-link" aria-label="妥协的缺失的直接链接" title="妥协的缺失的直接链接" translate="no">​</a></h3>
<p>这几次体验 Agents，笔者虽然确实感受到了成就感，但还感受到了另一点：在享受“无所不能”的成就感的同时，我们的要求越来越高，越来越不会妥协了。越来越容易抓住自己的一点小需求不放，为之投入时间精力。</p>
<p>在这里，或许需要停一停。</p>
<p>笔者在前面提到，现在之所以 AI 制造的工具层出不穷，人人都上手，很大程度上是因为不妥协的成本降低了，人们看到了妥协以外的第二个选择。可问题是：我们真的认真想过，“不妥协”真的比妥协更好吗？或者说，我们因为“不妥协”而获得的一点好处（便利、美观，etc.）真的足以我们付出精力去打造工具吗？</p>
<blockquote>
<p>造出来的工具真的会经常用么？</p>
</blockquote>
<p>笔者了解到一个观点：AI 确实降低了成本，<strong>但也让人容易低估使用 AI 的成本</strong>。</p>
<p>在 AI 出现之前和之后，或许也存在着类似的现象：我们有时低估了制造工具的成本。所谓“妥协”，就是牺牲一些需求。我们或许需要停下来考虑一下：我们妥协所牺牲的，与不妥协所需的成本，孰轻孰重？我们值得付出这么多成本吗？笔者认为，AI 出现之后，甚至出现了为不存在的需求打造工具，或者纯粹为了创造工具而创造需求的现象<sup><a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fn-3-89cd7a" id="user-content-fnref-3-89cd7a" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup>。这样是不是有些本末倒置了呢？</p>
<blockquote>
<p>回到开头的例子：自己架设 NAS 真的优于使用网盘、忍受广告么？或者，我们随时看照片的需求真的非满足不可么？</p>
</blockquote>
<p>我们需要适当妥协。妥协不是委屈自己，有些情况下反而是更聪明的办法。我们还要接受一个残酷的现实：即使花费了很多精力折腾 AI，也无法得到真正满意的结果。</p>
<p>——仔细想想，万事都求十全十美，其实是一种奢求，本就不现实。不是所有需求都真的值得满足。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="尾声">尾声<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#%E5%B0%BE%E5%A3%B0" class="hash-link" aria-label="尾声的直接链接" title="尾声的直接链接" translate="no">​</a></h2>
<p>笔者现在的这个小站，构建需要如下步骤：</p>
<ol>
<li class="">推送源分支更改</li>
<li class="">构建 Docusaurus</li>
<li class="">复制构建产物到构建分支</li>
<li class="">推送构建分支更改</li>
</ol>
<p>一年来，笔者构建的方法就是自己手敲 <code>git add .</code>，<code>git commit -m ""</code>，<code>yarn build</code>，并且自己复制。这么一趟大概需要一分钟。最近忽然想到，为什么不写一个程序来自动构建并推送呢？笔者在颅内构想了一下，甚至能写一个程序，只需要输入标题就为我创建一篇新的博客，打开开发服务器，还可以方便地帮我处理插入文件这样的需求。</p>
<p>不过又想想，笔者放弃了。像自动创建并插入之类的需求，为之造一个程序，不太值得，而且也很难做到效果很好。至于自动构建呢？笔者也没有写程序，而是写一个 <code>bat</code> 就得了（片段示意）：</p>
<div class="language-batch codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#0f172a;--prism-background-color:#f1f5f9"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-batch codeBlock_bY9V thin-scrollbar" style="color:#0f172a;background-color:#f1f5f9"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#0f172a"><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git add .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git commit </span><span class="token command parameter attr-name" style="color:#0c4a6e">-m</span><span class="token command"> </span><span class="token command string" style="color:#64748b">"%message%"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git push </span><span class="token command parameter attr-name" style="color:#0c4a6e">--force-with-lease</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> yarn build</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> robocopy </span><span class="token command string" style="color:#64748b">"build"</span><span class="token command"> </span><span class="token command string" style="color:#64748b">"%buildPath%/docs"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">cd</span><span class="token command"> </span><span class="token command string" style="color:#64748b">"%buildPath%"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git add .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git commit </span><span class="token command parameter attr-name" style="color:#0c4a6e">-m</span><span class="token command"> </span><span class="token command string" style="color:#64748b">"%message%"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token command keyword" style="color:#0c4a6e">call</span><span class="token command"> git push </span><span class="token command parameter attr-name" style="color:#0c4a6e">--force-with-lease</span><br></div></code></pre></div></div>
<p>没有漂亮的 GUI，只是几行 batch file，很简陋。但它确实能解决问题，并且没有消耗我很多时间来写它。笔者认为，这笔妥协很划算。</p>
<br>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#footnote-label" class="hash-link" aria-label="Footnotes的直接链接" title="Footnotes的直接链接" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-89cd7a">
<p>笔者认为，一般都是把照片拷到台式机上，不考虑笔记本电脑吧。 <a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fnref-1-89cd7a" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-2-89cd7a">
<p>为了区分拥有“极客”和“极客思维而不是极客的人”，笔者在这里造了个词。 <a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fnref-2-89cd7a" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-3-89cd7a">
<p>笑话：我今天买了个锤子，看什么都像钉子。 <a href="https://masterlazy.github.io/blog/2026/08/28/%E5%85%B3%E4%BA%8E%E5%B7%A5%E5%85%B7%E7%9A%84%E6%80%9D%E8%80%83#user-content-fnref-3-89cd7a" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>深度思考</category>
        </item>
        <item>
            <title><![CDATA[2026 年的一点博客心得]]></title>
            <link>https://masterLazy.github.io/blog/2026/08/25/2026年的一点博客心得</link>
            <guid>https://masterLazy.github.io/blog/2026/08/25/2026年的一点博客心得</guid>
            <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[转眼这个赛博笔记本都上线一年多了。说是赛博笔记本，其实作用差不多就是一个博客吧。从今天开始，我把 Docusaurus 的 blog 打开了，真的变成半个博客了。]]></description>
            <content:encoded><![CDATA[<p>转眼这个赛博笔记本都上线一年多了。说是赛博笔记本，其实作用差不多就是一个博客吧。从今天开始，我把 Docusaurus 的 blog 打开了，真的变成半个博客了。</p>
<p>想想还真是特别。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么写博客">为什么写博客<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="为什么写博客的直接链接" title="为什么写博客的直接链接" translate="no">​</a></h2>
<p>理由很简单，就像之前我写在博客园的那样：</p>
<blockquote>
<ul>
<li class="">有的东西看完就忘了，得记笔记。</li>
<li class="">觉得好像没找到关于某事物很好的介绍文字，遂自己写。</li>
</ul>
</blockquote>
<p>现在看来，还有一点，就是在信息海洋中提炼一点精华。虽然这点精华估计都要被喂给 AI 了吧，但是确实是自己的一点小天地，这里的文章都是可靠、精心编写的。</p>
<!-- -->
<blockquote>
<p>还有一点，就是当时 OI 要写题解，但是洛谷题解区一般都关了，洛谷博客也不是很好看，所以打算把题解之类的当博客写。</p>
</blockquote>
<p>所以就开始有写博客的念头了。起初用的就是博客园。它老牌，可靠，有很多成熟的美化方案，而且免费使用，少量广告。不用自建站，国内访问快。</p>
<p>那为什么后来又不用了呢？</p>
<p>原因有两点。其一，虽然确实有非常成熟的美化方案（awescnb，现在改名 <a href="https://github.com/guangzan/tona" target="_blank" rel="noopener noreferrer" class="">tona</a> 了，我还 fork 过这个仓库来着），但是嘛，总感觉不是特别对我的审美。<del>博客不好看怎么会有动力写呢。</del> 当时有过一个念头，就是自己打造一个好看的皮肤。后来放弃了，不是我的菜。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2026-08-25-01-5b9f776dd246b57b01b2fa7c7ceabce4.png" width="1284" height="701" class="img_ev3q"></div></div>
<p>其二，网络上有很多神奇的爬虫，整天爬爬爬，我文章刚发出来几十秒就被爬了，比如：<a href="http://www.jsqmd.com/news/4789/" target="_blank" rel="noopener noreferrer" class="">程序杂谈：概述-编程学习网</a>、<a href="http://www.jsqmd.com/news/6598/" target="_blank" rel="noopener noreferrer" class="">C++ GUI 选型记-编程学习网</a>，我真服了。</p>
<p>所以才自己建站，有了 mNotebook。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一路走来的-mnotebook">一路走来的 mNotebook<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E4%B8%80%E8%B7%AF%E8%B5%B0%E6%9D%A5%E7%9A%84-mnotebook" class="hash-link" aria-label="一路走来的 mNotebook的直接链接" title="一路走来的 mNotebook的直接链接" translate="no">​</a></h2>
<p>我的博客用的是 Docusaurus<sup><a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#user-content-fn-1-c004f0" id="user-content-fnref-1-c004f0" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>，这个选型好像比较少见。 Docusaurus 似乎比较常用于做技术文档之类的吧。选 Docusaurus 是因为开发这个的公司是 Facebook 母公司，比较靠谱，感觉会长期支持。</p>
<p>初看 Docusaurus，外观是不太好的。但是 Docusaurus 基于 React，React 就很有可玩性了。参看 <a class="" href="https://masterlazy.github.io/docs/jot/mnotebook">关于 mNotebook</a>，有很大的自定义空间。所以才有了你现在看到的 mNotebook 的样子，我觉得是非常养眼的。当时我刚刚学会给 Docusaurus 写自定义组件时，开心坏了，<del>整了一大堆花里胡哨的组件</del>。后来稍微收敛一点了。毕竟笔记 / 博客这东西，还是内容大于形式的。况且用了一堆 Markdown 之外的东西，如果未来要迁移什么的，很麻烦啊。</p>
<hr>
<p>我曾经很想把我的笔记都数字化，但是一直都不是很有动力。</p>
<p>一方面是做数字笔记虽然美观、好编辑，但是输入比较麻烦。像这样纯文本的文章还好，如果要穿插插图、公式之类（比如数学笔记），就很麻烦了。纸上做笔记更直接，更快。</p>
<p>另一方面，就是一直盯着屏幕眼睛会很累，也就是数字笔记不太适合长时间阅读。不过这个问题我现在解决了，受 Martial Design 3 启发，我现在把背景从纯白改成了这样的极浅色，会好一点。（还有一点，就是文章的宽度不要太宽，否则眼睛扫视会比较累。这些都是细节，初建站都没有注意到。）</p>
<p>我之前还有一个毛病，就是笔记嵌套很多，比如：计算机科学 / 原生技术栈 / .NET 生态 / WPF，太深了！现在我决定最多嵌套三层，且把分类放粗一点，比如把“原生技术栈”和“Web 技术栈”合并成“软件工程”。如果以后笔记确实很多，再分开。</p>
<hr>
<p>总之，现在的 mNotebook，越来越接近我心目中的理想样子了。</p>
<p>但还是有点缺陷的。比如我现在编辑笔记，就要先启动 <code>yarn start</code>，然后创建 <code>.md</code>，在 Typora 中打开，再挂个浏览器，实时看效果。这么看来，要敲笔记还是比较繁琐。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="遇到的优秀博客">遇到的优秀博客<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E9%81%87%E5%88%B0%E7%9A%84%E4%BC%98%E7%A7%80%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="遇到的优秀博客的直接链接" title="遇到的优秀博客的直接链接" translate="no">​</a></h2>
<p>网上冲浪，看到的有些博客确实很惊艳，浅浅收录到下面，可供日后借鉴。</p>
<blockquote>
<p>网络很大，每个人的博客感觉都像互联网的角落，可遇不可求啊。比如读到这些文字的，估计只有我自己吧。</p>
</blockquote>
<ul>
<li class="">
<p><a href="https://thiscute.world/" target="_blank" rel="noopener noreferrer" class="">This Cute World</a>：有深度、有思考的博文。</p>
</li>
<li class="">
<p><a href="https://chai.ac.cn/" target="_blank" rel="noopener noreferrer" class="">柴扉 | CHAI</a>：很精致的博客，看出来博主也很用心地打造了博客系统。不过好像目前内容不多。
</p><div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2026-08-25-02-b2096c5a23340dc3ad871fe63e6b48d6.jpg" width="1288" height="704" class="img_ev3q"></div></div><p></p>
</li>
<li class="">
<p><a href="https://www.acofork.com/posts/" target="_blank" rel="noopener noreferrer" class="">博客 — AcoFork / AF</a>：二叉树树的博客。页面很美观，不知道为何有点明日方舟的味道。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2026-08-25-03-4f331422eb3c2ec6770d16f03236b6dd.jpg" width="1270" height="703" class="img_ev3q"></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在后面">写在后面<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E5%86%99%E5%9C%A8%E5%90%8E%E9%9D%A2" class="hash-link" aria-label="写在后面的直接链接" title="写在后面的直接链接" translate="no">​</a></h2>
<p>从今天开始，我也在这个小站上写博客了。相比于那些放在 <code>docs/</code> 下的笔记，博客可能没有那么精致，也不用那么多花里胡哨的组件了。</p>
<p>我还搬了一些之前写的，现在看来算作博客的文章到这里，让这里看起来稍微热闹一些。</p>
<br>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#footnote-label" class="hash-link" aria-label="Footnotes的直接链接" title="Footnotes的直接链接" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-c004f0">
<p>笔者打了这个词无数遍，<del>做梦都能拼对</del> <a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#user-content-fnref-1-c004f0" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>碎碎念</category>
        </item>
        <item>
            <title><![CDATA[C# vs Java]]></title>
            <link>https://masterLazy.github.io/blog/2026/08/20/csharp-vs-java</link>
            <guid>https://masterLazy.github.io/blog/2026/08/20/csharp-vs-java</guid>
            <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Java 和 C# 真是有非常微妙的差异。]]></description>
            <content:encoded><![CDATA[<p>Java 和 C# 真是有非常微妙的差异。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="c-到-java">C# 到 Java<a href="https://masterlazy.github.io/blog/2026/08/20/csharp-vs-java#c-%E5%88%B0-java" class="hash-link" aria-label="C# 到 Java的直接链接" title="C# 到 Java的直接链接" translate="no">​</a></h3>
<p>前段时间因为要写 mod，又开始写 Java。从 C# 到 Java 的感受，就是那些语法糖全没了，比如 <code>new()</code> 这种，搞个异步就得用 <code>Future&lt;&gt;</code> 之类，代码风格也不太适应。还有就是Java 的一些历史包袱，导致一些地方不如 C# 那么简洁（比如 <code>List.of()</code> 这种东西）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="java-到-c">Java 到 C#<a href="https://masterlazy.github.io/blog/2026/08/20/csharp-vs-java#java-%E5%88%B0-c" class="hash-link" aria-label="Java 到 C#的直接链接" title="Java 到 C#的直接链接" translate="no">​</a></h3>
<p>写了两周 Java，今天写回 C#，又感到不适应。首先是编辑器的不适应。VS 是远远没有IDEA精致好用的。就比如 IDEA 提示“可将字段设为readonly”，光标移过去就可以点“设为readonly”，VS 不知道为什么就没有。VS 的自动补全有时候会比较烦人，本来想缩进，按一下 tab 给我补全出来一坨。</p>
<p>其次就是语法不习惯。比如 C# 有属性，Java 没有，只能写 getter/setter。虽然写getter/setter有点烦人，但是它也强迫你尽量封装，不要暴露太多细节。而c#有了属性，感觉就少了点“限制”。还有 C# 允许运算符重载，有时候就会有点懵。这就是所谓设计哲学的差异吧。代码风格也是，当时入门 C# 就搞不懂为什么 C# 的方法要用大驼峰，非得跟 Java 和其他语言对着干似的。</p>
<hr>
<p>总之感觉 Java 虽然历史包袱有点沉，但是设计似乎比较优雅；C# 固然简洁，但也有点接近 C++，有种奇怪的语法丰富但是容易写成史山的感觉。</p>
]]></content:encoded>
            <category>C#</category>
            <category>Java</category>
            <category>碎碎念</category>
        </item>
        <item>
            <title><![CDATA[谈谈「语言硅基化」]]></title>
            <link>https://masterLazy.github.io/blog/2026/02/13/谈谈「语言硅基化」</link>
            <guid>https://masterLazy.github.io/blog/2026/02/13/谈谈「语言硅基化」</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[「语言硅基化」？在我看来，背后的操盘手还是人类自己。]]></description>
            <content:encoded><![CDATA[<p>「语言硅基化」？在我看来，背后的操盘手还是人类自己。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-味来自哪里">AI 味来自哪里<a href="https://masterlazy.github.io/blog/2026/02/13/%E8%B0%88%E8%B0%88%E3%80%8C%E8%AF%AD%E8%A8%80%E7%A1%85%E5%9F%BA%E5%8C%96%E3%80%8D#ai-%E5%91%B3%E6%9D%A5%E8%87%AA%E5%93%AA%E9%87%8C" class="hash-link" aria-label="AI 味来自哪里的直接链接" title="AI 味来自哪里的直接链接" translate="no">​</a></h3>
<p>目前大多数LLM采用的是GPT架构，这是一种序列到序列的自回归模型。如很多人所知，序列的基本元素为「token」。一般来说，其训练有两个步骤。</p>
<p>第一步是预训练，其核心优化（或者说训练）的核心目标是「最大似然估计」，即模型的「输出分布」要尽可能吻合「真实分布」。所谓真实分布，就是研究者采集的数据的分布。数学上，大概是用KL散度或交叉熵来衡量二者的差异。</p>
<p>所以，在经过预训练后，模型的输出分布会接近真实分布，但受技术和训练方法所限，会有一定误差。然而，这个误差应该是随机的，不应该表现定向的差异。而现在说的「人机味」明显是有定向指向的，而非随机的产物。</p>
<p>定向的「偏移」应该来自于「基于人类反馈的强化学习」（RLHF）。这个过程目标是「对齐」，即让模型的输出「迎合」人类预期。比如，「人类」更喜欢严谨、客观的回答，而不是像海量训练数据那样参差不齐的回答。</p>
<p>而正是这个过程让模型输出的文本与人类语言有了可感知的「偏移」，即人机味。本质上，这也算是最大化满足人类期望的产物。这是人机味的第一推手。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-为何可以影响语言">AI 为何可以影响语言<a href="https://masterlazy.github.io/blog/2026/02/13/%E8%B0%88%E8%B0%88%E3%80%8C%E8%AF%AD%E8%A8%80%E7%A1%85%E5%9F%BA%E5%8C%96%E3%80%8D#ai-%E4%B8%BA%E4%BD%95%E5%8F%AF%E4%BB%A5%E5%BD%B1%E5%93%8D%E8%AF%AD%E8%A8%80" class="hash-link" aria-label="AI 为何可以影响语言的直接链接" title="AI 为何可以影响语言的直接链接" translate="no">​</a></h3>
<p>人机味的第二推手，源于AI生成的效率。AI生产文本的速度明显大于人类，于是在公开数据中，AI生产内容的占比会快速上升。事实上在未来的某个时刻，AI写下的句子将超过有史以来所以人类写下的。（谁知道现在没有呢？）AI内容占比的上升，相当于一次「源头投毒」。新AI接受预训练时，其「样本分布」就已经不是人类语言的「真实分布」了。这是一个不可逆的正反馈机制，只会让AI味越来越浓。</p>
<p>再加上AI实在太方便了，不借助AI的「纯人类」内容的生产速度还会下降。</p>
<hr>
<p>「人机味」的泛滥，已经是大势所趋。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[C++ GUI 选型记]]></title>
            <link>https://masterLazy.github.io/blog/2025/09/30/cppgui选型记</link>
            <guid>https://masterLazy.github.io/blog/2025/09/30/cppgui选型记</guid>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[若干年前，我入门了 C++，写了一个控制台贪吃蛇，觉得自己逐渐理解一切……]]></description>
            <content:encoded><![CDATA[<p>若干年前，我入门了 C++，写了一个控制台贪吃蛇，觉得自己逐渐理解一切……</p>
<p>“我想创建 GUI！” 于是漫长的选型过程开始了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="概念">概念<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="概念的直接链接" title="概念的直接链接" translate="no">​</a></h3>
<p>还是有必要阐释一下这几个概念：</p>
<ul>
<li class="">GUI：图形用户界面，其实是很宽泛的概念，图形化的程序界面都算。</li>
<li class="">UI：用户界面，我觉得更强调 “和用户交互”，比如一个按钮、一个输入框等。</li>
<li class="">绘图库：只提供绘制（或者图形渲染服务），你可以用它画一个三角形、矩形，可以显示图片，但是做 UI 有点难。</li>
<li class="">UI 库：提供 UI 功能，一方面是不需要自己画按钮，另一方面是提供事件处理等服务。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="easyx">EasyX<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#easyx" class="hash-link" aria-label="EasyX的直接链接" title="EasyX的直接链接" translate="no">​</a></h2>
<p>我第一个用的是 EasyX，当时用它写了蛮多程序的。</p>
<!-- -->
<p>主页：<a href="https://easyx.cn/" target="_blank" rel="noopener noreferrer" class="">EasyX Graphics Library for C++</a></p>
<p>文档：<a href="https://docs.easyx.cn/zh-cn/intro" target="_blank" rel="noopener noreferrer" class="">EasyX 文档 - 基本说明</a></p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" src="https://easyx.cn/f/a/0/0/6/setup-vc2010-4.1.png" alt="" class="img_ev3q"></div></div>
<p>EasyX 是一个绘图库，这意味着它是没有 UI 功能的。但是 EasyX 非常简单！如果你是刚学会 <code>printf()</code> 或者 <code>cout &lt;&lt;</code> 的初学者，你一定会觉得上手 EasyX 很轻松。就看这个例子吧：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#0f172a;--prism-background-color:#f1f5f9"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#0f172a;background-color:#f1f5f9"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#0f172a"><span class="token comment" style="color:#6A9955">// 自 https://www.luogu.com.cn/article/9eazh2lm，略有修改</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:#0c4a6e">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:#64748b">&lt;easyx.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token keyword" style="color:#0c4a6e">int</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">main</span><span class="token punctuation" style="color:#475569">(</span><span class="token punctuation" style="color:#475569">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#475569">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">initgraph</span><span class="token punctuation" style="color:#475569">(</span><span class="token number" style="color:#B5CEA8">480</span><span class="token punctuation" style="color:#475569">,</span><span class="token number" style="color:#B5CEA8">600</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 初始化窗口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">setlinecolor</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">WHITE</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">setfillcolor</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">RED</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">fillrectangle</span><span class="token punctuation" style="color:#475569">(</span><span class="token number" style="color:#B5CEA8">150</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">60</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">200</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">85</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 画一个矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">Sleep</span><span class="token punctuation" style="color:#475569">(</span><span class="token number" style="color:#B5CEA8">5000</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token function" style="color:#0e7490">closegraph</span><span class="token punctuation" style="color:#475569">(</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 关闭窗口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">return</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token punctuation" style="color:#475569">}</span><br></div></code></pre></div></div>
<p>我曾用 EasyX 写过蛮多程序的，如今仅仅是注视着这些程序的名字，就令我十分怀念：</p>
<blockquote>
<p>贝塞尔曲线、单摆、单摆2、物理-粒子撞圆柱阵、五子棋、樱花树</p>
</blockquote>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><p><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2025-09-30-01-5923f3c5fa156b355499bb9efdc628fc.jpg" width="1202" height="832" class="img_ev3q"></p></div><p>单摆.exe</p></div>
<p>当时我甚至用 EasyX 写了一个小小的、简陋的 UT 同人小游戏，可惜现在找不到了。</p>
<p>EasyX 默认是没有抗锯齿的，需要自己实现。</p>
<p>EasyX 带来了无尽的绘图的乐趣。但是没有 UI 功能，和用户的交互很有限。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="windows-api">Windows API<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#windows-api" class="hash-link" aria-label="Windows API的直接链接" title="Windows API的直接链接" translate="no">​</a></h2>
<p>事实上直接使用 Windows API 做 GUI 是很折磨且不明智的。</p>
<p>当时我看的教程：<a href="https://www.bilibili.com/video/BV1us411A7UE/" target="_blank" rel="noopener noreferrer" class="">【SDK开发】《Windows程序设计》</a></p>
<blockquote>
<p>你可能注意到了，那个视频讲的是 “Windows SDK”。两者的区别比较微妙，我这里想强调我直接使用那些 API 接口来编程，所以写的是 Windows API。</p>
</blockquote>
<p>确实，你可以用 Windows API 来创建窗口、控件。虽然自己写一遍窗口过程挺折磨的（实际上原本开发 GUI 不需要管这么多底层过程的）。这里放一段创建控件的代码，我们鉴赏一下：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#0f172a;--prism-background-color:#f1f5f9"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#0f172a;background-color:#f1f5f9"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#0f172a"><span class="token comment" style="color:#6A9955">// 创建轨道条</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:#475569">[</span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">]</span><span class="token plain"> </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">CreateWindow</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">TRACKBAR_CLASS</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    L</span><span class="token string" style="color:#64748b">""</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    WS_CHILD </span><span class="token operator" style="color:#475569">|</span><span class="token plain"> WS_VISIBLE </span><span class="token operator" style="color:#475569">|</span><span class="token plain"> TBS_NOTICKS</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    hWnd</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">HMENU</span><span class="token punctuation" style="color:#475569">)</span><span class="token number" style="color:#B5CEA8">4</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token constant" style="color:#0f172a">NULL</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token constant" style="color:#0f172a">NULL</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token comment" style="color:#6A9955">// 设置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token function" style="color:#0e7490">SendMessage</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:#475569">[</span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">]</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> TBM_SETRANGEMIN</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">0.5</span><span class="token plain"> </span><span class="token operator" style="color:#475569">*</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">2</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 设置最小值</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token function" style="color:#0e7490">SendMessage</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:#475569">[</span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">]</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> TBM_SETRANGEMAX</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">150</span><span class="token plain"> </span><span class="token operator" style="color:#475569">*</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">2</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 设置最大值</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token function" style="color:#0e7490">SendMessage</span><span class="token punctuation" style="color:#475569">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:#475569">[</span><span class="token number" style="color:#B5CEA8">0</span><span class="token punctuation" style="color:#475569">]</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> TBM_SETPOS</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token plain"> </span><span class="token operator" style="color:#475569">*</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">2</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"> </span><span class="token comment" style="color:#6A9955">// 设置默认值</span><br></div></code></pre></div></div>
<p>可以看到，我为了设置这个轨道条的属性，还要手动发送消息，现在看来真是十分繁琐。可就是这么繁琐的实现方法，我也用了一段时间，写了几个程序。</p>
<p>比如这个：<a href="https://www.bilibili.com/video/BV1YQ4y1Q78m/" target="_blank" rel="noopener noreferrer" class="">自制程序-八种排序的可视化</a>（上面的代码片段就摘自这个程序）</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gdi-和-gdi">GDI (和 GDI+)<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#gdi-%E5%92%8C-gdi" class="hash-link" aria-label="GDI (和 GDI+)的直接链接" title="GDI (和 GDI+)的直接链接" translate="no">​</a></h3>
<p>Windows API 提供的绘图功能实际上叫做 GDI（Graphics Device Interface，图形设备接口）。</p>
<p>GDI 是 “历史悠久” 的图形组件，事实上已经过时了。GDI 也没有抗锯齿。而且其十分低级，比如需要自己实现 “双缓冲机制”。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="direct2d">Direct2D<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#direct2d" class="hash-link" aria-label="Direct2D的直接链接" title="Direct2D的直接链接" translate="no">​</a></h2>
<p>Direct2D 是一个绘图库，没有 UI 功能。但如果你使用 Visual C++，可以把它和 Windows API 搭配使用。Direct2D 的绘图更加强大，抗锯齿什么的自然不在话下。（当然比 GDI 强）</p>
<p>当时我看的教程：<a href="https://www.bilibili.com/video/BV125411V74f/" target="_blank" rel="noopener noreferrer" class="">Direct2D Tutorial</a>（是的这个是英文的，当时我居然看得下去）</p>
<p>直接用 Direct2D 的 API 还绘图显然也不太方便。当时我跟着那个教程搭建了一个自己的包装，像是这样：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#0f172a;--prism-background-color:#f1f5f9"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#0f172a;background-color:#f1f5f9"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#0f172a"><span class="token keyword" style="color:#0c4a6e">class</span><span class="token plain"> </span><span class="token class-name" style="color:#0ea5e9">Graphics</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token punctuation" style="color:#475569">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token keyword" style="color:#0c4a6e">private</span><span class="token operator" style="color:#475569">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">	ID2D1Factory</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> pFactory</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain">				</span><span class="token comment" style="color:#6A9955">// Direct2D的接口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">	IDWriteFactory</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> pWriteFactory</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain">		</span><span class="token comment" style="color:#6A9955">// DirectWrite的接口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">	ID2D1RenderTarget</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> pRenderTarget</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain">	</span><span class="token comment" style="color:#6A9955">// 渲染目标</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token keyword" style="color:#0c4a6e">public</span><span class="token operator" style="color:#475569">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">draw_line</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x1</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y1</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x2</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y2</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// 绘制矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">draw_rectangle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">fill_rectangle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// 绘制圆角矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">draw_r_rectangle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">fill_r_rectangle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// 绘制椭圆</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">draw_ellipse</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> width</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> height</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">fill_ellipse</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> width</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> height</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// 绘制正圆</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">draw_circle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:#475569">=</span><span class="token plain"> </span><span class="token number" style="color:#B5CEA8">1</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token keyword" style="color:#0c4a6e">void</span><span class="token plain"> </span><span class="token function" style="color:#0e7490">fill_circle</span><span class="token punctuation" style="color:#475569">(</span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> </span><span class="token keyword" style="color:#0c4a6e">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:#475569">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:#475569">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:#475569">)</span><span class="token punctuation" style="color:#475569">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain">    </span><span class="token comment" style="color:#6A9955">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#0f172a"><span class="token plain"></span><span class="token punctuation" style="color:#475569">}</span><br></div></code></pre></div></div>
<p>实际上，当时我基本上是按照 EasyX 的方式来封装这些接口。基于我自己封装的接口，我也写了几个程序：</p>
<blockquote>
<p>三体问题渐进解、手写数字识别（搭配 TensorFlow）、探索复平面</p>
</blockquote>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><p><img decoding="async" loading="lazy" src="https://masterlazy.github.io/assets/images/2025-09-30-02-0a979c48c0ef2054ea9fae4654a59e4c.webp" width="1920" height="1080" class="img_ev3q"></p></div><p>探索复平面（导出图片）</p></div>
<p>我记得我还尝试过用 Direct2D 重写我的 “五子棋” 程序，不过好像没有做完。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openglglfw">OpenGL（GLFW）<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#openglglfw" class="hash-link" aria-label="OpenGL（GLFW）的直接链接" title="OpenGL（GLFW）的直接链接" translate="no">​</a></h2>
<p>我尝试过学习这个，想学的原因是跨平台。可是没学会，也许是因为太复杂了吧。</p>
<p>OpenGL 也是绘图库，仍然没有 UI 功能。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mfc">MFC<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#mfc" class="hash-link" aria-label="MFC的直接链接" title="MFC的直接链接" translate="no">​</a></h2>
<p>当时在学 Windows API 的时候就注意到 MFC 了。我没有用 MFC 构建过什么程序，基本上。</p>
<p>事实上，MFC 是蛮旧的框架了，并不适合开发新的软件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="qt">Qt<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#qt" class="hash-link" aria-label="Qt的直接链接" title="Qt的直接链接" translate="no">​</a></h2>
<p>大名鼎鼎的 Qt，我光是安装就费了半天，因为 SDK 很大。Qt 有自己的 Qt Creator，但是我当时用不惯。于是我开始用 Visual Studio 写代码，用 Qt Creator 构建，勉强还行。我觉得 Qt 做出来的 UI 并不好看。事实上可以用 QSS 来自定义控件样式。当时我上网找了模板，也尝试自己搓，但是始终不满意。最终，我没有深入去学 Qt。</p>
<blockquote>
<p>似乎现在有 QML 这样高级的东西了？我没有深入研究过，读者可以研究一下。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="尾声">尾声...<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#%E5%B0%BE%E5%A3%B0" class="hash-link" aria-label="尾声...的直接链接" title="尾声...的直接链接" translate="no">​</a></h2>
<p>好难找到合适的技术。我还尝试了：</p>
<ul>
<li class="">wxWidgets</li>
<li class="">ImGui</li>
<li class="">FLTK</li>
<li class="">别的什么…</li>
</ul>
<p>…但总不是很满意。后来我认定了，用 C++ 开发 GUI 注定是痛苦的。</p>
<p>后来我又探索了 Dart（写了代码）、C#（写了代码）、Java（没写代码）的 GUI，后来选定了 C# + WPF 的方案。目前来说，这仍是我采用的技术栈。</p>]]></content:encoded>
            <category>C/C++</category>
            <category>技术栈（技术选型）</category>
            <category>碎碎念</category>
        </item>
        <item>
            <title><![CDATA[写 C# 有感]]></title>
            <link>https://masterLazy.github.io/blog/2025/09/07/写csharp有感</link>
            <guid>https://masterLazy.github.io/blog/2025/09/07/写csharp有感</guid>
            <pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[最近用 C# 写了10 几 KB 的代码，越来越觉得C#远远大于 C++。]]></description>
            <content:encoded><![CDATA[<p>最近用 C# 写了10 几 KB 的代码，越来越觉得C#远远大于 C++。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="语言特性">语言特性<a href="https://masterlazy.github.io/blog/2025/09/07/%E5%86%99csharp%E6%9C%89%E6%84%9F#%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7" class="hash-link" aria-label="语言特性的直接链接" title="语言特性的直接链接" translate="no">​</a></h3>
<p>首先语言特性上就领先 C++ 很多。比如众所周知 C++ 的异常处理基本上是废的，但C#的异常机制可以很好地运作。还有反射机制、各种语法糖（C#应该是出了名的很多语法糖）。另外C#有更严格的静态流检查，可以帮助排除很多玄学问题。体验非常舒适。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="编辑器">编辑器<a href="https://masterlazy.github.io/blog/2025/09/07/%E5%86%99csharp%E6%9C%89%E6%84%9F#%E7%BC%96%E8%BE%91%E5%99%A8" class="hash-link" aria-label="编辑器的直接链接" title="编辑器的直接链接" translate="no">​</a></h3>
<p>还有不得不提 VS 的 IntelliCode ，向 C# 严重倾斜。C++里 IntelliCode 的作用几乎为零，但是 C# 里 IntelliCode 约等于半个自动驾驶了。只需要按Tab接受自动补全就好了。虽然没有 Copilot 那么智能，但我觉得恰到好处。还有很赞的自动起名功能。 IntelliCode 真的大幅节省了编码时间，提高了生产力。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="配套设施">配套设施<a href="https://masterlazy.github.io/blog/2025/09/07/%E5%86%99csharp%E6%9C%89%E6%84%9F#%E9%85%8D%E5%A5%97%E8%AE%BE%E6%96%BD" class="hash-link" aria-label="配套设施的直接链接" title="配套设施的直接链接" translate="no">​</a></h3>
<p>还有配套的丰富的 .NET SDK ，比 C++ 的标准库强太多了。很多轮子即拆即用，非常方便。尤其在文件操作、网络操作、序列化这些，非常方便。而且.NET各组件涵盖前后端，所以用 C# 做全栈开发简直是丝滑无比。相比之下C++的标准库，还有什么WindowsAPI，就显得很笨拙。</p>
]]></content:encoded>
            <category>C#</category>
            <category>C/C++</category>
            <category>碎碎念</category>
        </item>
        <item>
            <title><![CDATA[上古笔记本电脑维修记]]></title>
            <link>https://masterLazy.github.io/blog/2025/07/12/上古笔记本电脑维修记</link>
            <guid>https://masterLazy.github.io/blog/2025/07/12/上古笔记本电脑维修记</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[又名：《废铁转生之再战三年》]]></description>
            <content:encoded><![CDATA[<p>又名：《废铁转生之再战三年》</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-01-4b8034044b57e9d6516be3d667b437e1.webp" width="800" height="600" class="img_ev3q"></div></div>
<p>最近两天一直在致力于修一台 12 年前发售的上古笔记本电脑，它可以开机，但是无法引导进入 OS。（注：为了叙述简洁，没有按照时间顺序来写。）</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-i">Part I<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-i" class="hash-link" aria-label="Part I的直接链接" title="Part I的直接链接" translate="no">​</a></h2>
<p>由于古老性，我严重忧虑它没法运行 Windows 10，所以决定安装 Ubuntu 24.04.2 LTS。然而尝试安装了好几次，都卡在把镜像写入硬盘这一步（File I/O Error、BrokenPipe）。尝试了各种安装选项，重新给硬盘简历分区表和重新格式化，问题依然存在。怀疑是硬盘问题，就测试写入。发现可以写入，很奇怪，又试了一次，还是卡在相同的步骤。</p>
<p>于是乎，把硬盘拆下来连到另外一台电脑上检测，果然发现了四个柱面有坏道，还是分散在三处的。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-02-f95cb888d22f987967bb72e23f39ca43.webp" width="800" height="574" class="img_ev3q"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-ii">Part II<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-ii" class="hash-link" aria-label="Part II的直接链接" title="Part II的直接链接" translate="no">​</a></h2>
<p>换了一块硬盘，成功安装了 Ubuntu。然而我不甘心，还是想用之前的旧硬盘来装 OS。用 DiskGenius 来创建分区，恰避开了损坏的柱面。然而，Ubuntu 24.04.2 LTS 没法安装，后来试了 Ubuntu 22.04.5，也不行。Windows 10 倒是可以装，不过装完过了不久自己卡死了。遂放弃，可能这块盘比较邪吧。</p>
<p>盲猜：系统所在分区前面就是坏道所在，引导的时候可能要一路读过去，遇到坏道就卡了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-iii">Part III<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-iii" class="hash-link" aria-label="Part III的直接链接" title="Part III的直接链接" translate="no">​</a></h2>
<p>Ubuntu 很好，但是有一个严重的问题，笔记本的键盘和触控板都失灵了。试着装了 Windows 10，却没有这个问题。而且在运行 Ubuntu Live OS 期间也没有这个问题。尝试询问 Deepseek，但是它没能给出完全解决的方法（不过辅助分析了问题）。后来试了半天，发现惊天的现象：把笔记本合上再打开键盘就能用了，但是触控板不能。还有一个观察就是键盘失灵期间 Capslock一直是亮着的。</p>
<p>检查内核启动日志，果然发现 Error，原来似乎是 ACPI 尝试对键盘调用“显卡亮度控制方法”</p>
<p>（_BCL，Deepseek 告诉我的），出错了。但是没能找到解决方法。想了想，或许试着升级一下主板 BIOS 固件可以解决问题。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-03-5f1b10fb945604bbaf2bdb7cd5ed316b.webp" width="800" height="246" class="img_ev3q"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-iv">Part IV<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-iv" class="hash-link" aria-label="Part IV的直接链接" title="Part IV的直接链接" translate="no">​</a></h2>
<p>到 DELL 官网一搜，吓一跳，发现 BIOS 固件紧急更新。可是更新程序是 .exe 格式的，Linux 就别想跑了。可是为了这个装 Windows 太麻烦了。于是先后尝试用 PE OS，MS-DOS 安装，均失败。最后咬咬牙，装了 Windows 10，然而打开程序说，要求插入电池。然而电池已经坏了，所以 BIOS 固件是别想更新了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-v">Part V<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-v" class="hash-link" aria-label="Part V的直接链接" title="Part V的直接链接" translate="no">​</a></h2>
<p>于是尝试了 Ubuntu MATE 24.04.2 LTS，这个发行版据说比较适合旧设备，然而装了不但没解决问题，UI 也不是很好看。又尝试 Ubuntu 22.04.5 LTS，不过问题仍在。看来是要妥协了，装了 Windows 10，不得不说真的是一步一卡，等到我傻。同时在 discourse.ubuntu.com 上创建了一个帖子寻求社区帮助。本来我是对此不抱什么希望的，要么没人理，要么解决周期很长。不过出乎意料，创建一小时后就有人回复了。四小时前，有人给出了尝试方案。我试了下，真的有用，太神了。实际上就是往内核启动参数里面加 i8042.reset。</p>
<div class="imageContainer_wBRv" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><div class="imageWrapper_bNQ4" style="--mlazy-img-max-height:23rem;--mlazy-img-dark-filter:brightness(0.89);--mlazy-img-border:var(--ifm-color-emphasis-300) solid 1px;--mlazy-img-border-radius:var(--ifm-global-radius)"><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-04-fe7905607a6c6af5c398030128e60996.png" width="800" height="642" class="img_ev3q"></div></div>
<p>（以下内容追加于同月13日）</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-vi">Part VI<a href="https://masterlazy.github.io/blog/2025/07/12/%E4%B8%8A%E5%8F%A4%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E7%BB%B4%E4%BF%AE%E8%AE%B0#part-vi" class="hash-link" aria-label="Part VI的直接链接" title="Part VI的直接链接" translate="no">​</a></h2>
<p>还有一点小问题：无线网卡损坏、空格键坏了。</p>
<p>空格键坏了，难修，但是可以把右 Alt 键（反正一年也用不到几次）映射成空格，曲线救国。</p>
<p>网络方面，买了一块无线网卡（就是一个小USB），不过淘宝上买大多数都只提供 Windows 驱动，少部分说支持 Linux，但实际上要求你自己编译，相当于“理论可行，剩下的你自己来吧”，而且不提供技术支持（只是留一个 CSDN 和 GitHub 链接）。于是把网卡接到 Windows 电脑上安装驱动，发现芯片型号是 AIC8800D80，顺藤摸瓜，找到了有人把腾达提供的驱动源码修改了一下上传到了 GitHub 的仓库。clone 之后拷贝 rules 和 firmware，然后 make，然后 sudo make install，就成功安装了驱动。</p>]]></content:encoded>
        </item>
    </channel>
</rss>