<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Bankkase Blog</title>
    <link>https://blog.bankkase.com/posts/</link>
    <description>Recent content in Posts on Bankkase Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 20 Oct 2026 00:36:46 +0800</lastBuildDate>
    <atom:link href="https://blog.bankkase.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>反人类的谷歌Antigravity</title>
      <link>https://blog.bankkase.com/posts/musings/human-antiing-antigravity/</link>
      <pubDate>Tue, 20 Oct 2026 00:36:46 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/human-antiing-antigravity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;被Antihumanity搞虚脱了，所以文章是Gemini 4 Argon在antigravity里面写的，见谅。（&lt;/p&gt;&lt;/blockquote&gt;
&lt;h1 id=&#34;伪安全与真残废谈谈-google-antigravity-新版沙盒对开发者体验的毁灭性破坏&#34;&gt;伪安全与真残废：谈谈 Google Antigravity 新版沙盒对开发者体验的毁灭性破坏&lt;/h1&gt;
&lt;p&gt;近期 Google 对 Antigravity（尤其是 CLI 工具链）进行了一次缺乏基本工程敬畏的静默变更：在未明确更新文档与迁移指南的情况下，将默认执行策略强制切换至底层内核沙盒。这一改动直接摧毁了许多依赖现代工具链的本地工作流，其中最典型的受害者就是已成为 Python 事实标准的 &lt;code&gt;uv&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;作为一个主打智能体自主编码的工具，Antigravity 这次更新暴露出的不是技术实力，而是大型科技公司典型的高傲：&lt;strong&gt;以“防御性安全”为遮羞布，行破坏开发者体验之实。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一-粗暴的挂载策略连现代包管理器都不配拥有路径&#34;&gt;一、 粗暴的挂载策略：连现代包管理器都不配拥有路径？&lt;/h3&gt;
&lt;p&gt;在 Linux/WSL 环境下，新版 CLI 引入了基于 Linux Namespaces 的容器化隔离机制。对于 Agent 工具而言，做执行沙盒在架构设计上无可厚非，但 Antigravity 的实现方式堪称粗糙。&lt;/p&gt;
&lt;p&gt;为了所谓的最小攻击面，它对 &lt;code&gt;$HOME&lt;/code&gt; 目录采取了极其死板的虚拟挂载与只读覆盖策略。其直接后果是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用户级工具链被全面抹杀&lt;/strong&gt;：宿主机的 &lt;code&gt;~/.local/bin&lt;/code&gt; 与 &lt;code&gt;~/.cargo/bin&lt;/code&gt; 被完全隔离在沙盒之外。&lt;code&gt;uv&lt;/code&gt;、&lt;code&gt;mise&lt;/code&gt;、&lt;code&gt;pnpm&lt;/code&gt; 这些标准的用户级开发工具，在沙盒内部直接蒸发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行接口的低劣设计&lt;/strong&gt;：CLI 暴露了 &lt;code&gt;--sandbox&lt;/code&gt; 标志，却连基本的对称参数 &lt;code&gt;--no-sandbox&lt;/code&gt; 都未作适配。布尔 flag 抛出标准库的未定义错误，真正控制沙盒启闭的逻辑却被隐晦地塞进了权限预设（Permission Preset）的层级分支下，毫无自解释性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只管拦截，不管透传&lt;/strong&gt;：如果要做隔离，合理的做法应当是支持声明式的白名单路径透传（Extra Binds），或者自动将宿主机经过哈希验证的 binary 映射进去。而 Antigravity 选择了最偷懒的方案——直接盖上一个空 tmpfs，留给开发者一个毫无意义的 &lt;code&gt;command not found: 127&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;二-零文档零引导的黑盒式治理&#34;&gt;二、 零文档、零引导的“黑盒式”治理&lt;/h3&gt;
&lt;p&gt;如果一个基建级工具必须做出不向后兼容的 Breaking Change，成熟团队的标准实践是：提供 Changelog、在 CLI 报错中给出语义化诊断信息，并指引开发者如何修复。&lt;/p&gt;</description>
    </item>
    <item>
      <title>我对使用大语言模型来解决软件工程问题的思考</title>
      <link>https://blog.bankkase.com/posts/musings/musing-on-ai-for-se/</link>
      <pubDate>Fri, 16 Oct 2026 17:39:43 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/musing-on-ai-for-se/</guid>
      <description>&lt;p&gt;总的来说，我对使用大模型解决软件工程问题持乐观态度。随着Agent Engineering的发展，大模型在需求分析、设计、实现、测试和运维环节均体现了其价值。但要把它用好，我们仍然需要掌握顶层架构，并使用适当的工具和方法随时监督AI的工作。&lt;/p&gt;
&lt;p&gt;LLM对软件工程的增益有目共睹。这一点不只是主观上的。已有对照实验发现，LLM 辅助工具能够提升特定开发任务的完成效率（《The Impact of AI on Developer Productivity》 (Peng et al., 2023)）。&lt;/p&gt;
&lt;p&gt;但面对复杂的软件工程任务，单个LLM的上下文窗口仍会限制它对项目全局的持续把握。而更糟糕的是，即使上下文窗口未满，模型也未必能充分利用其中的信息，尤其是在上下文足够长时容易遗漏长上下文中段的相关内容。（Nelson F. Liu等人的论文《Lost in the Middle》说明了这点）。此外还有很多因素，比如工具数量增长对 Function Calling 选择准确率的影响，干扰信息对模型决策的影响等。
SubAgent或许很诱人，但它也有自己的问题。智能体可能越过职责边界、遗漏重要信息，或者在缺乏验证的情况下让错误继续传播，最终导致任务失败（《Why Do Multi-Agent LLM Systems Fail?》，2025）。&lt;/p&gt;
&lt;p&gt;所以，我们必须引入独立的，基于事实的外部机制来约束AI。从而确保整个体系的正确，并确保结果可验证。一个例子是FM-Agent：利用独立的LLM结合调用者的预期生成函数规范，再通过霍尔逻辑式的推理逐步推导后置条件，检查实现是否符合规范，最后生成并执行测试用例来确认潜在缺陷。（《FM-Agent》 Ding et al., arXiv 2026）&lt;/p&gt;
&lt;p&gt;当然，上下文工程也是不可少的。限于篇幅，我还是提一个最直观的建议：考虑到“Lost In the Middle”效应，最能影响LLM决策的关键信息在上下文首尾。因此，不要图方便将大段代码直接贴入prompt，它是真的会让模型“变傻”呀。各种agent默认的基于function calling的文件操作是更好的选择。&lt;/p&gt;
&lt;p&gt;综上，这也是为什么我们软院人需要学习软件工程。软件工程给我们的，是系统化思维，是设计顶层结构的能力，以及实现这些顶层设计的理论知识。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn X in Y Minutes 编程语言快速入门推荐</title>
      <link>https://blog.bankkase.com/posts/musings/learn-x-in-y-minutes/</link>
      <pubDate>Thu, 15 Oct 2026 19:40:33 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/learn-x-in-y-minutes/</guid>
      <description>&lt;p&gt;最近我决定参与一些开源项目，因为高中时折腾过VPS，所以正好认识Openlist。综合对比其它项目后我便决定将它作为我的第一个开源贡献项目。&lt;/p&gt;
&lt;p&gt;不过本文的主题&lt;em&gt;不是开源&lt;/em&gt;，而是关于&lt;strong&gt;编程语言学习&lt;/strong&gt;。 于是为了看懂Openlist项目，我有(bei)幸(po)开始学习Go语言。&lt;/p&gt;
&lt;p&gt;当然，我不可能先找一本&lt;em&gt;几百页的书&lt;/em&gt;，然后从HelloWorld，if-else，变量这种所有语言都差不多的地方学——我需要高效的方式来达到足够用的水平。&lt;/p&gt;
&lt;p&gt;不过也不能直接问AI呀——AI给的内容往往很细碎，我想要的是体系化的知识。也因此，我开始寻找一个适合有编程经验的人，帮助他们快速入门某种语言的在线资源。&lt;/p&gt;
&lt;p&gt;也因此，我遇到了&lt;a href=&#34;https://learnxinyminutes.com&#34;&gt;Learn X in Y Minutes&lt;/a&gt;项目。该项目非常符合快速入门某种语言。&lt;/p&gt;
&lt;p&gt;当然，它不可能让你成为xx语言专家，却足够让你清除这个语言是做什么的，有哪些特性，基本骨架给你摸个八九不离十。&lt;/p&gt;
&lt;p&gt;光说还是有些抽象，让我们看一个针对Go语言的例子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;learnFunctionFactory&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 空行分割的两个写法是相同的，不过第二个写法比较实用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;sentenceFactory&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;原谅&amp;#34;&lt;/span&gt;)(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;当然选择&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;她！&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sentenceFactory&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;原谅&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;当然选择&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;她！&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;你怎么可以&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;她？&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Decorator在一些语言中很常见，在go语言中，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 接受参数作为其定义的一部分的函数是修饰符的替代品&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sentenceFactory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;mystring&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;before&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;before&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %s %s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;before&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;mystring&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;after&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// new string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是的这就是x-in-y网站讲述Decorator的用法的所有内容了。我们很容易看出其优点：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;简洁明了&lt;/li&gt;
&lt;li&gt;对于已经了解高阶函数、闭包等知识的人，这种写法展示了Go语言也支持这些特性；对于不了解的人，也没有过早引入这些复杂概念。&lt;/li&gt;
&lt;li&gt;以代码为主导而不是用自然语言描述一堆不准确、模糊的描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;将成体系的相似内容汇编到一起&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;作为对比,如果你问AI的话，就会输出下面一大堆。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;llm-slop.png&#34; loading=&#34;lazy&#34; src=&#34;https://blog.bankkase.com/posts/musings/learn-x-in-y-minutes/llm-slop.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;我相信很多人会喜欢上面那种。&lt;/p&gt;
&lt;p&gt;Btw，这个项目还有&lt;a href=&#34;https://github.com/adambard/learnxinyminutes-docs&#34;&gt;Github仓库&lt;/a&gt;，大家有空可以去捧场。&lt;/p&gt;</description>
    </item>
    <item>
      <title>我让 Hermes 写了一篇博客</title>
      <link>https://blog.bankkase.com/posts/i-let-hermes-write-this-post/</link>
      <pubDate>Wed, 02 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/i-let-hermes-write-this-post/</guid>
      <description>&lt;h2 id=&#34;这算自己写自己吗&#34;&gt;这算「自己写自己」吗&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;是的，这篇文章内容也是hermes外包的&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;事情是这样的——我一直在折腾自己的 Hugo 博客，写完总是要手动开编辑器、起本地服、&lt;code&gt;hugo new&lt;/code&gt;、整理 TOML 前置信息……琐碎得让人想偷懒。&lt;/p&gt;
&lt;p&gt;于是干脆把「发博客」这件事整个丢给了我的 agent„Hermes„。&lt;/p&gt;
&lt;p&gt;让它帮我起草、把关、提交、推送。&lt;/p&gt;
&lt;p&gt;这篇就是你刚读到的结果。&lt;/p&gt;
&lt;h2 id=&#34;它到底做了什么&#34;&gt;它到底做了什么&lt;/h2&gt;
&lt;p&gt;流程其实很朴素，没有魔法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;我会话里给出主题&lt;/strong&gt;：「随便写一篇，主题是我让 Hermes 写了一篇博客」。&lt;/li&gt;
&lt;li&gt;它按我 repo 里现有帖子的&lt;strong&gt;格式&lt;/strong&gt;写了一篇(日期、标题、slug、&lt;code&gt;draft=false&lt;/code&gt;、TOML 前置信息和中文正文)。&lt;/li&gt;
&lt;li&gt;它&lt;strong&gt;先起草给我看&lt;/strong&gt;，我没改动就当确认。&lt;/li&gt;
&lt;li&gt;提交、推送，走我已经配好的 GitHub PAT 认证，直推到远程。&lt;/li&gt;
&lt;li&gt;远程的 CI 被触发，自动构建部署——新帖就这么上线了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;##「懒惰」的正当理由&lt;/p&gt;
&lt;p&gt;看起来像偷懒，但我更愿意叫它**「把重复劳动外包给会干活的东西」**。写作还是要我来定主题、要认可内容、要对产出负责；机器只负责把「从草稿到上线」这段机械流程跑直。省下的时间，多打几把音游不好吗。&lt;/p&gt;
&lt;p&gt;Hermes 端到端跑通了我的博客发布流水线——顺便，这篇就是它的 ep、0.也许我该给它记一功。&lt;/p&gt;</description>
    </item>
    <item>
      <title>一加手机坑爹的清灰功能</title>
      <link>https://blog.bankkase.com/posts/musings/bad-cleaning-oneplus/</link>
      <pubDate>Mon, 10 Aug 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/bad-cleaning-oneplus/</guid>
      <description>&lt;h1 id=&#34;坑爹的清灰功能&#34;&gt;坑爹的清灰功能&lt;/h1&gt;
&lt;p&gt;诚然各手机厂商为了吸引消费者推出的创新功能形形色色，或使人眼前一亮。
不过一加这部手机的“清灰模式”属实有点雷人。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;扬声器清灰&#34; loading=&#34;lazy&#34; src=&#34;https://blog.bankkase.com/posts/musings/bad-cleaning-oneplus/bad-cleaning-oneplus.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如图，这种清灰的原理是通过播放特定频率的音波，把灰尘抖下来。&lt;/p&gt;
&lt;p&gt;但是编程人员没有指定播放设备，因此如果你连接了耳机，那么响的会是耳机而不是扬声器。属于清灰了个寂寞。。。&lt;/p&gt;</description>
    </item>
    <item>
      <title>怎么挑选背景</title>
      <link>https://blog.bankkase.com/posts/blog-update/how-to-choose-background/</link>
      <pubDate>Thu, 23 Jul 2026 00:43:58 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/blog-update/how-to-choose-background/</guid>
      <description>&lt;p&gt;搞这么多技术内容，本质上的目的还是让我们的博客好看。对此，图片的选择往往是最容易被忽略的部分。
我个人为博客筛选了约数百张图片，对于背景图片的选取略有心得。&lt;/p&gt;
&lt;h2 id=&#34;1-明确你需要什么主题的图片&#34;&gt;1. 明确你需要什么主题的图片&lt;/h2&gt;
&lt;p&gt;简洁风？风景？动漫？
主题决定了你应该去哪里寻找背景图片。&lt;/p&gt;
&lt;p&gt;如果你想要风景图的话，必应每日的风景图（“必应聚焦”）是一个很好的来源。
&lt;a href=&#34;https://wefashe.github.io/bing-image/&#34;&gt;这里&lt;/a&gt;有一个整理每天的必应聚焦的网站。&lt;/p&gt;
&lt;p&gt;我个人则选择动漫图片。动漫图片有两个来源：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;插画网站，比如Pixiv&lt;/li&gt;
&lt;li&gt;社交媒体和群组的推送流&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在这里，我们明确了第一个标准——图片符合我们的主题，且符合个人审美。&lt;/p&gt;
&lt;h2 id=&#34;2-注意博客页面对你的背景的遮挡作用&#34;&gt;2. 注意博客页面对你的背景的遮挡作用&lt;/h2&gt;
&lt;p&gt;很多人光是找好看的插画去了，而博客内容对背景的遮挡作用常常被忽略。&lt;/p&gt;
&lt;p&gt;比如，在桌面端，PaperMod的内容框框占据网页的中间$\frac{2}{5}$，那么为了美观，图片的主要内容必须在图片的左右边缘各$\frac{3}{10}$处。&lt;/p&gt;
&lt;p&gt;这里的主要内容，当然是一个插画的主题元素，比如人物。如果一个插画主要是人物，那就指的是表现人物神情的部分（这里是面部）。&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;covered-picture.webp&#34; width=&#34;50%&#34;/&gt; &lt;figcaption&gt;
            中间部分被遮挡的图片
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;bad-example.webp&#34; width=&#34;50%&#34;/&gt; &lt;figcaption&gt;
            反面示例——人物几乎被遮住
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;3-不要喧宾夺主&#34;&gt;3. 不要喧宾夺主&lt;/h2&gt;
&lt;p&gt;背景图片不要太花导致干扰视线，更不要使得文字内容看不清。
其实这一点有一些主观的成分，只要不要饱和度爆炸明暗对比拉满都差不多。&lt;/p&gt;</description>
    </item>
    <item>
      <title>给hugo&#43;PaperMod博客添加背景图片，包含多端适配、随机背景功能</title>
      <link>https://blog.bankkase.com/posts/blog-update/add-background-to-blog/</link>
      <pubDate>Thu, 23 Jul 2026 00:24:50 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/blog-update/add-background-to-blog/</guid>
      <description>&lt;p&gt;作为一个静态博客框架，Hugo 的优势在于可以直接白嫖各厂商的静态页面托管服务（如 Cloudflare Pages、GitHub Pages）。而 PaperMod 主题的简约设计则提供了极高的可定制性。&lt;/p&gt;
&lt;p&gt;生命在于折腾，选择这两者作为技术栈后，折腾博客的下一站自然就是设置一个好看的背景图片。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;给首页加图片&#34;&gt;给首页加图片&lt;/h2&gt;
&lt;p&gt;如果只需要给首页加图片，那么只需要加一个 &lt;code&gt;.list&lt;/code&gt; 的 CSS 选择器。在 PaperMod 的 DOM 结构中，首页容器带着 &lt;code&gt;.list&lt;/code&gt; 类名。我们可以在 &lt;code&gt;assets/css/extended/custom.css&lt;/code&gt; 中注入基础样式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-image&lt;/span&gt;: url(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/images/background-light.webp&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-size&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;cover&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-position&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-attachment&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-repeat&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no-repeat&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接加上背景后会遇到一个很刺眼的问题：首页的文章列表文字是直接覆盖在背景上的。我们需要把第一个帖子加上框框，不然文字会融入背景，导致可读性极差。&lt;/p&gt;
&lt;p&gt;PaperMod 默认的首帖（&lt;code&gt;.first-entry&lt;/code&gt;）没有预设内边距和边框。我们可以补全它的盒模型，并给框框加上透明效果与毛玻璃质感（Glassmorphism）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* 补全首帖盒模型 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;first-entry&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;border-radius&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;var&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;radius);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;var&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;gap);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* 给卡片框框加上半透明与毛玻璃效果 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;first-entry&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;post-entry&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;/* 使用 color-mix 复用主题原生变量并混入透明度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;color-mix&lt;/span&gt;(in srgb, &lt;span style=&#34;color:#a6e22e&#34;&gt;var&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;entry) &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;%&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;transparent&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;border&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;solid&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;color-mix&lt;/span&gt;(in srgb, &lt;span style=&#34;color:#a6e22e&#34;&gt;var&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;border) &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;%&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;transparent&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  backdrop-filter: blur(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-webkit-&lt;/span&gt;backdrop-filter: blur(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;适应暗色模式&#34;&gt;适应暗色模式&lt;/h3&gt;
&lt;p&gt;现代 PaperMod 主题切换暗色模式时，会在顶层的 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 标签上注入 &lt;code&gt;data-theme=&amp;quot;dark&amp;quot;&lt;/code&gt; 属性，而不是修改类名。因此我们需要使用 HTML 属性选择器来进行样式覆盖：&lt;/p&gt;</description>
    </item>
    <item>
      <title>甜筒是我的罪过啊</title>
      <link>https://blog.bankkase.com/posts/musings/icecream-is-a-sin/</link>
      <pubDate>Tue, 21 Jul 2026 20:00:34 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/icecream-is-a-sin/</guid>
      <description>&lt;p&gt;今天吃完饭，去“苦沙火乡”买了一支甜筒。边骑车边吃，哪曾想一下路肩甜筒就被颠断了……&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;灵魂四格漫画&#34; loading=&#34;lazy&#34; src=&#34;https://blog.bankkase.com/posts/musings/icecream-is-a-sin/icecream-is-a-sin.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1cwvCByEzk/?t=194&#34;&gt;&lt;em&gt;哎，太可悲了太可恨了。&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;怨我，这就是我的罪孽啊。&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI无法取代人类——以福耀科技大学为例</title>
      <link>https://blog.bankkase.com/posts/musings/ai-cant-replace-human-fykjdx/</link>
      <pubDate>Tue, 21 Jul 2026 10:13:50 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/musings/ai-cant-replace-human-fykjdx/</guid>
      <description>&lt;p&gt;我是三流大学软件工程学生，但是对AI了解不多。随手写了一点，各位见笑。&lt;/p&gt;
&lt;h2 id=&#34;福耀科技大学靠谱吗问一问ai&#34;&gt;福耀科技大学靠谱吗？问一问AI&lt;/h2&gt;
&lt;h3 id=&#34;google-gemini&#34;&gt;Google Gemini&lt;/h3&gt;
&lt;p&gt;**福耀科技大学非常靠谱。**它不仅不是所谓的“野鸡大学”，反而是目前国内备受瞩目、起点极高的一所“新型研究型大学”。&lt;/p&gt;
&lt;p&gt;从目前的现状和发展来看（截至2026年），可以说是&lt;strong&gt;中国高等教育改革的一块“试验田”，其实力、资金和生源甚至可以媲美许多传统的985/211名校。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你想“混个文凭”或者追求大城市的繁华，这里可能不适合。但如果你&lt;strong&gt;有志于在智能制造、机器人、人工智能等理工科前沿领域深耕，想真刀真枪地做科研、进驻顶尖产学研平台&lt;/strong&gt;，福耀科技大学是一个极其靠谱、性价比极高且充满前景的选择。首批敢于报考这所大学的高分考生，虽然常自嘲为“教育改革的小白鼠”，但实际上他们享受着全国最顶尖的教育资源投入。&lt;/p&gt;
&lt;h3 id=&#34;deepseek&#34;&gt;Deepseek&lt;/h3&gt;
&lt;p&gt;关于福耀科技大学是否“靠谱”，目前还没有一个绝对的答案。它是一所极具开创性但也伴随争议的新型大学，其“靠谱”程度取决于你用什么样的标准去衡量。&lt;/p&gt;
&lt;p&gt;总的来说，它的&lt;strong&gt;起点极高、模式新颖、潜力巨大&lt;/strong&gt;，但作为一所全新大学，其长期的办学质量和模式能否成功，&lt;strong&gt;仍有待时间的检验&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;福耀科技大学是一所优点和风险都同样突出的大学。它是否“靠谱”，取决于你的视角：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果你是看重潜力、勇于接受新事物的学生&lt;/strong&gt;：这里提供的&lt;strong&gt;精英化培养、产业前沿资源和创新模式&lt;/strong&gt;非常有吸引力。但你需要接受它作为一所新大学在声誉和校友网络上的天然短板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果你是追求稳健、看重传统的家长或学生&lt;/strong&gt;：它的&lt;strong&gt;不确定性&lt;/strong&gt;可能是一个风险点。选择它，意味着押注一个全新的教育理念和模式能够成功。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;我的建议是&lt;/strong&gt;：持续关注它的发展。大学的建设是长期过程，福耀科技大学最终能否成功，取决于其独特的办学理念能否经受住时间的考验，将蓝图变为现实。可以多关注其未来几年的师资建设、科研成果和学生发展情况，再做出判断。&lt;/p&gt;
&lt;h3 id=&#34;qwen&#34;&gt;Qwen&lt;/h3&gt;
&lt;p&gt;综合目前的官方信息和办学进展来看，&lt;strong&gt;福耀科技大学（福建福耀科技大学）是非常靠谱的&lt;/strong&gt;。它并非传统的民办盈利性高校，而是一所高起点、高定位的新型研究型大学。&lt;/p&gt;
&lt;p&gt;以下是判断其“靠谱”的几个核心依据：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;官方批准，资质正规
福耀科技大学已经&lt;strong&gt;正式获得教育部批准设立&lt;/strong&gt;，具备完全合法的招生和办学资质。 教育部明确其定位为“民办普通本科学校”，但办学性质更偏向于公益性的新型研究型大学。&lt;/li&gt;
&lt;li&gt;资金雄厚，公益办学
学校由福耀集团创始人曹德旺先生发起，并由河仁慈善基金会等出资创办。其资金实力雄厚，且明确不以盈利为目的，这意味着学校不会像部分传统民办高校那样过度依赖学费生存，能够将更多资源投入到教学、科研和师资建设中。&lt;/li&gt;
&lt;li&gt;顶尖的管理团队与师资力量
&lt;strong&gt;校长领衔&lt;/strong&gt;：由原西安交通大学校长王树国担任首任校长，且其公开表示出任该职“不拿一分钱工资”，纯粹为了教育理想。
&lt;strong&gt;师资豪华&lt;/strong&gt;：学校已初步汇聚了一支高水平、国际化的师资队伍，包括海内外院士15人、全球前2%顶尖科学家56人、国家级高层次人才80人。 此外，还有多位原“985”“211”高校的前校领导加入管理团队。&lt;/li&gt;
&lt;li&gt;清晰的办学定位与“小而精”模式
学校突出理工和科技，着重开展制造业科技创新研究，旨在解决中国高端制造业人才短缺的问题。 全日制在校生规模暂定为8000人，走的是“小而精”的精英化培养路线，类似于“民办版的佐治亚理工学院”。&lt;/li&gt;
&lt;li&gt;深度的产教融合与国际合作
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;校企合作&lt;/strong&gt;：已与海信集团、洲明科技等知名企业签署战略合作，强调“高等教育＋AI”深度融合与产教协同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高校联培&lt;/strong&gt;：已与同济大学开展联合培养硕士研究生项目，并与香港城市大学、加拿大阿尔伯塔大学等建立了学术合作关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;招生已步入正轨
学校已于2025年正式在福建、河南、江西、湖南、广西等省份启动本科招生，首批聚焦“智能制造工程”等核心专业。 随着办学步入正轨，2026年及以后计划逐步扩大招生规模。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;尽管福耀科技大学在背景、资金和师资上起点极高，但作为一所&lt;strong&gt;新成立的大学&lt;/strong&gt;，在考虑是否报考或合作时，仍需注意以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;历史积淀尚浅&lt;/strong&gt;：学校的长期教学成果、科研产出、校友网络和社会声誉仍需时间来沉淀和验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;培养模式要求高&lt;/strong&gt;：学校注重理工科、全英文或双语教学以及高强度的科研/实践训练。 适合目标明确、有志于投身高端制造业或科研，且自律能力较强的学生。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;招生规模小&lt;/strong&gt;：由于采取“小而精”模式，招生名额有限，录取分数线预计会保持在较高水平。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：福耀科技大学是一所由国家教育部背书、顶尖教育家掌舵、实业家巨资支持的正规且极具潜力的高校，整体非常靠谱。如果您或您的家人考虑报考，建议密切关注其当年在您所在省份的具体招生计划、专业设置及录取分数。&lt;/p&gt;
&lt;h2 id=&#34;为什么ai不靠谱&#34;&gt;为什么AI不靠谱&lt;/h2&gt;
&lt;h3 id=&#34;信息源被污染&#34;&gt;信息源被污染&lt;/h3&gt;
&lt;p&gt;计算机科学有一套经典的定理：“输入的是垃圾，那么输出也是垃圾”（Garbage in, garbage out）。&lt;/p&gt;
&lt;p&gt;而此类社会组织，必然会在互联网上投放大量的新闻通稿，内容则为抬举和吹嘘自己。如果放在几年前，是为了让有利自己的信息占领搜索引擎的结果；而放到现在，则是为了让AI读到的信息大都对自己有利。&lt;/p&gt;
&lt;p&gt;这种操纵舆论的原理很简单：如果一个组织不是很有名，那么关于它的信息总量自然会很少，批评它的信息那就更少了（因为能够辨别的人根本不在乎）。只要让有利于自己的信息填充互联网，那么搜索者大概率看到的都是正面信息。&lt;/p&gt;
&lt;p&gt;更高明的操纵者不会完全吹嘘假消息，而是半真半假。它们常常把一个很普通常见的概念吹得很神，对这个领域不够了解的人就会被骗。这类人美国人称为蛇油推销员，中国人称为神棍，高校界称为神棍。&lt;/p&gt;
&lt;p&gt;这也就不奇怪，“绝顶聪明”的AI会给刚建立两年规模极小的新生大学站台了——它们获取的语料就是不客观的，答案自然也有失偏颇。&lt;/p&gt;
&lt;h3 id=&#34;ai没有生活经历&#34;&gt;AI没有“生活经历”&lt;/h3&gt;
&lt;p&gt;这一点描述起来有一些模糊和主观，我会尽可能讲清楚。&lt;/p&gt;
&lt;p&gt;AI没有“生活经历”。它的生命就局限于提示词输入开始，到输出token结束为止。所以，他不能从过往经历中反思。
我说的反思，不是“将经验教训融入到模型权重”这种强化学习式的反思，而是“能够结合具体示例”，就像普通的大学本科生根据自己几年的大学经历，就能根据课程，科研项目，导师等种种例子，判断出“福耀科技大学”的性质了。&lt;/p&gt;
&lt;p&gt;事实上，这种民间办学，“小而精、研究型”的模式，绝不是福耀首创，就像2018年创立的西湖大学，宣传是由一队知名科学家兴办的，也自称小而精。这类学校是否能办起来，只能经过时间的检验才可知。而经历的时间跨度，不是AI的优势。&lt;/p&gt;
&lt;p&gt;此外，也正是因为AI没有人类的“生活经历”，他不能从人类自己的角度来像问题……&lt;/p&gt;</description>
    </item>
    <item>
      <title>异常</title>
      <link>https://blog.bankkase.com/posts/java/exception-in-java/</link>
      <pubDate>Sat, 18 Jul 2026 11:16:20 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/java/exception-in-java/</guid>
      <description>&lt;h2 id=&#34;异常简介&#34;&gt;异常简介&lt;/h2&gt;
&lt;p&gt;异常是为了在出错的时候，提供一个机制把控制权交给能够处理这个错误的代码手上。如果没有异常，异常产生处和处理处的代码可能很远。&lt;/p&gt;
&lt;p&gt;异常的层次结构：&lt;/p&gt;
&lt;p&gt;基类：Throwable
直接继承Throwable：Error和Exception
Error被设计成虚拟机内部错误，程序员不应该抛出
Exception是我们平常关注的范围。&lt;/p&gt;
&lt;p&gt;IOException和RuntimeException是Exception下的两个常见的直接子类。Exception还有更多直接子类。&lt;/p&gt;
&lt;p&gt;所有派生于Error类或RuntimeException类的异常都是非检查型unchecked异常。
所有其他异常都是检查型checked异常。&lt;/p&gt;
&lt;p&gt;语义上，RuntimeException指的是编程错误导致的异常，如&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArrayIndexOutOfBoundsException&lt;/li&gt;
&lt;li&gt;NullPointerException&lt;/li&gt;
&lt;li&gt;ClassCastException&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;创建异常类&#34;&gt;创建异常类&lt;/h3&gt;
&lt;p&gt;我们需要继承一个Exception的子类。同时惯例我们应该实现两个构造器：一个无参和一个带详细信息字符串的构造器。&lt;/p&gt;
&lt;h2 id=&#34;异常的捕获和传播&#34;&gt;异常的捕获和传播&lt;/h2&gt;
&lt;p&gt;要捕获异常，需要建立一个try-catch块。
如果在try块中遇到catch指定的异常，那么直接跳到对应catch语句块。
预估遇到catch未指定的异常，那么方法直接退出。
如果try块正常运行，那么不运行catch块，继续运行方法的后续代码。&lt;/p&gt;
&lt;p&gt;如何判断处理还是传递异常？
在工程实践中，推荐遵循**尽早抛出，延迟捕获（Throw early, catch late）**的原则：
在代码最底层的逻辑验证阶段，一旦检测到异常状态立即抛出；在整个调用链路中，除非能够真正处理问题或必须转译异常，否则应一路放行，交由拥有全局业务视野的顶层框架或统一异常处理器（如 Spring 的 @ExceptionHandler）进行集中处理。&lt;/p&gt;
&lt;h2 id=&#34;finnally和try-with-resources&#34;&gt;finnally和try-with-resources&lt;/h2&gt;
&lt;p&gt;finally子句：无论是否排除是否被捕获的异常，都会在最后执行。
可以只有finally没有catch&lt;/p&gt;
&lt;p&gt;不要在finally中使用&lt;code&gt;throw&lt;/code&gt;, &lt;code&gt;return&lt;/code&gt;, &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt;等改变控制流的语句。
一个良好的实践是使用两个独立的try，try-finally用于关闭资源，try-catch用于处理异常。&lt;/p&gt;
&lt;p&gt;java7以上支持try-with-resources&lt;/p&gt;
&lt;p&gt;对于实现了AutoClosable接口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AutoClosable&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;的类（资源），try-with-resources语法会在try块结束后自动关闭这些资源。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (Resource res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ...) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; with res.....
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#75715e&#34;&gt;// 不管有没有异常，是否被捕获，都会在这里调用res.close()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;//...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;java9之后，可以提供effectively final的变量了：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// out 是方法的参数，满足effectively final
try (out) {
  // do sth
} // out.close
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;没什么人在意的细节：在try-with-resources中，如果try块和close都抛出了异常，close抛出的异常会被抑制。它们被用addSuppressed方法加到try抛的异常上，然后重新抛出try抛出的异常。如果你感兴趣，可以使用getSuppressed方法获取这些异常。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lambda表达式和函数式接口</title>
      <link>https://blog.bankkase.com/posts/java/lambda-and-functional-interface-in-java/</link>
      <pubDate>Fri, 17 Jul 2026 09:35:51 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/java/lambda-and-functional-interface-in-java/</guid>
      <description>&lt;h2 id=&#34;lambda表达式和函数式接口&#34;&gt;Lambda表达式和函数式接口&lt;/h2&gt;
&lt;p&gt;Lambda表达式语法的本质上就是一种表达式，而非对象。
Lambda表达式的返回值会被自动推导。如果参数被省略，那么也会尝试自动推导。&lt;/p&gt;
&lt;p&gt;函数式接口(Functional Interface)指的是只有一个抽象方法的接口。（可以有一些非抽象方法，如重写或默认）
Lambda表达式是被设计为快速地转换为函数式接口的实例。程序员不用手动初始化函数式接口的实例了，这些对象和类的管理由编译器处理。&lt;/p&gt;
&lt;h3 id=&#34;方法引用和构造器引用&#34;&gt;方法引用和构造器引用&lt;/h3&gt;
&lt;p&gt;方法引用（Method Reference）是一种简便方式，可以在只想调用一个方法而不做其他操作时，直接使用某个方法的逻辑。
原理类似于Lambda表达式，编译器自动为你创建函数式接口的实例。
例如：
&lt;code&gt;var timer = new Timer(1000, System.out::println)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;要注意方法重载的选择受函数式接口的签名影响。
方法引用支持三种语法：
&lt;code&gt;object::instanceMethod&lt;/code&gt;：lambda表达式的参数列表原样传送到这个对象的这个方法的参数中。
&lt;code&gt;Class::instanceMethod&lt;/code&gt;：lambda表达式的第一个参数成为方法的隐式参数，也就是说：&lt;code&gt;String::compareToIgnoreCase&lt;/code&gt;, 等价于&lt;code&gt;(a, b) -&amp;gt; a.compareToIgnoreCase(b)&lt;/code&gt;
&lt;code&gt;Class::staticMethod&lt;/code&gt;: 所有参数传递到静态方法。&lt;/p&gt;
&lt;p&gt;构造器引用
格式：&lt;code&gt;Class::new&lt;/code&gt;
解决的问题：将类型被擦除的数组重新构建为特定对象数组。
例如：&lt;code&gt;Person[] people = stream.toArray(Person::new)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;变量作用域和闭包&#34;&gt;变量作用域和闭包&lt;/h3&gt;
&lt;p&gt;Lambda表达式由三部分组成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个代码块&lt;/li&gt;
&lt;li&gt;参数&lt;/li&gt;
&lt;li&gt;自由变量的值，这里是指非参数切不在代码块内被定义的变量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当lambda体使用了外部的变量时，称为这个变量被捕获（captured）
捕获capture自由变量的代码块称为闭包closure。lambda表达式就是闭包。&lt;/p&gt;
&lt;p&gt;捕获变量的限制（这是为了并发安全考虑）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在lambda体中，不可以改变捕获的变量。&lt;/li&gt;
&lt;li&gt;捕获的变量不可能在外部改变&lt;/li&gt;
&lt;li&gt;捕获的变量必须是事实最终变量(efectively final)。aka，变量初始化后不会再被赋新值。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;lambda表达式的体与它的上一层嵌套块有相同的作用域。也就是说，lambda表达式不新建作用域，参数和内部变量不能和上一层重名。
这也是为什么你可以直接使用外层方法的&lt;code&gt;this&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;lambda表达式的应用&#34;&gt;Lambda表达式的应用&lt;/h3&gt;
&lt;p&gt;《Core Java 中文版》6.2.7&lt;/p&gt;
&lt;p&gt;为什么要使用Lambda表达式？一个重要原因是支持代码的延迟执行（deferred execution）
换句话说，如果不需要延迟执行，那么很可能不需要lambda表达式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在一个单独的线程运行代码&lt;/li&gt;
&lt;li&gt;在算法的适当位置运行代码（比如排序的比较操作）&lt;/li&gt;
&lt;li&gt;发生某种事件时才触发代码&lt;/li&gt;
&lt;li&gt;只在必要时才执行代码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用的函数式接口：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Runnable
Supplier&amp;lt;T&amp;gt;
Comsumer&amp;lt;T&amp;gt;
BiConsumer&amp;lt;T, U&amp;gt;
Function&amp;lt;T,R&amp;gt;
BiFunction&amp;lt;T, U, R&amp;gt;
UnaryOperator&amp;lt;T&amp;gt;
BynaryOperator&amp;lt;T&amp;gt;
Predicate&amp;lt;T&amp;gt;
BiPredicator&amp;lt;T, U&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;除了&lt;code&gt;Runnable&lt;/code&gt;，它们都在&lt;code&gt;java.util.function&lt;/code&gt;里面&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://blog.bankkase.com/posts/hello-world/</link>
      <pubDate>Thu, 16 Jul 2026 23:58:25 +0800</pubDate>
      <guid>https://blog.bankkase.com/posts/hello-world/</guid>
      <description>&lt;p&gt;这是我的第一篇博客！&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
