<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://zno233.dpdns.org/</id>
  <title type="text">一杯清风不加糖的blog</title>
  <subtitle type="text">此间天地</subtitle>
  <updated>2026-06-19T00:00:00.000Z</updated>
  <author><name>一杯清风不加糖</name></author>
  <link rel="alternate" href="https://zno233.dpdns.org/"/>
  <link rel="self" href="https://zno233.dpdns.org/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97/%E5%8D%81%E5%B9%B4%E5%90%8E%E7%9A%84%E4%BB%8A%E5%A4%A9%E6%88%91%E4%BE%9D%E7%84%B6%E5%9C%A8%E6%80%80%E5%BF%B5%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97/</id>
      <title type="text">十年后的今天，我依然在怀念你的名字</title>
      <published>2026-05-18T00:00:00.000Z</published>
      <updated>2026-05-18T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97/%E5%8D%81%E5%B9%B4%E5%90%8E%E7%9A%84%E4%BB%8A%E5%A4%A9%E6%88%91%E4%BE%9D%E7%84%B6%E5%9C%A8%E6%80%80%E5%BF%B5%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97/"/>
      <summary type="text">不知不觉已过去十年</summary>
      <content type="html"><![CDATA[<p>你的名字是第一个让我产生明确的审美愉悦的动画，同时也是第一个让我意识到音乐之于动画的重要性的作品。</p>
<p>在那之前我也看过不少anime，像宝可梦，名侦探柯南，海贼王，火影忍者，或者是刀剑神域，但它们都未让我产生如此感受，你的名字第一次让我知道“氛围感”居然是如此让人着迷之物。</p>
<p>生平第一次领悟到《红楼梦》判词所说的“到底意难平”究竟是一种怎样的感觉，此后的一个星期，我依然沉浸于这种完结综合征中无法自拔……</p>
<p>十年过去了，始终没有一部番能给我相似的感觉，可能这种体验本身就是可遇不可求的，那是少年时初萌的审美意识第一次遇上了无比契合的对象所产生的奇妙的化学反应，好比贾宝玉初见林妹妹，罗辑初见庄颜。</p>
<p>时至今日，每当我听到三葉のテーマ的时候，我的脑海中总是能浮现出这样一个场景——黄昏下，三叶孤零零地坐在东京的电车站的长椅上，夕阳在她的身侧拉出一条昏暗模糊的影子，一如少女幽深的心情。</p>
<p>好想时间倒流回到过去，现在的世界真的让人无所适从，越来越能理解海上钢琴师里主角为什么至死不愿下船，船外的世界真的太混沌了……</p>
<p>童年和青少年时期是人生的中心，从中心被放逐出来后，人就只能不断的流浪，心中的缺口越来越大，永远无法满足……</p>
<p>成年人的世界总是追逐着欲望，而我打心底不愿做欲望和群体意志的奴隶，永不妥协。</p>
<p>多想溺死在幸福中不愿醒来。</p>
<p>算了，还是毁灭世界来得容易，至少这个还有些希望，也许有生之年就能看到人类自我毁灭的景象，盛大的谢幕也算是一种慰藉，凡伟大者皆走向虚妄，凡崇高者必归于尘土，不管是卑劣还是无耻，善良还是邪恶，都无所谓了。</p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E5%85%B3%E4%BA%8E%E7%94%9F%E5%91%BD%E7%9A%84%E6%80%9D%E8%80%83/</id>
      <title type="text">关于生命的思考</title>
      <published>2025-11-01T00:00:00.000Z</published>
      <updated>2025-11-01T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E5%85%B3%E4%BA%8E%E7%94%9F%E5%91%BD%E7%9A%84%E6%80%9D%E8%80%83/"/>
      <summary type="text">一篇深入探讨现代人精神困境、社会意义崩塌、欲望本质以及权力与自由之间矛盾的随笔。</summary>
      <content type="html"><![CDATA[<section><h2>1.1 痛苦在古代与现代的不同形态<a href="#11-痛苦在古代与现代的不同形态"><span>#</span></a></h2><p>从某种意义上来说，古代人的生活比现代人更为明晰，因为前现代的概念和传统所编制的语义网络将他们保护的很好，无意义的世界被隔离在宗法森严的熟人社会之外，他们的痛苦与烦恼大多源自社会的生产力低下，物质生活无法得到基本的保障的缘故，但从另一种角度来看，他们所烦恼的事物又是客观存在之物，看得见也摸得着，随着生产力发展和社会进步，这些问题在当代基本都解决的差不多了。</p><p>物质生活的烦恼确实在不断减少，与此形成鲜明对比的是精神世界的加速崩塌，后现代的人们渐渐发现，原本赖以构建整个人类社会的基石性概念已经无法承受愈发庞大的社会建筑，对传统婚姻观念的反思便是这一变化的缩影。而这还不是最可怕的，最可怕的是，直到今日人类都没有想到一个能很好解决这些问题的方法，也就是说在前现代的价值观和语义网络在迅速消亡的紧要关头，人类却再也不能继续编造合理的价值系统，所有人都将逐渐明白一个事实，那就是生活本质是无意义的，徒劳的，到最后人们会得到这样一个结论──荒谬才是人生的底色。</p><p>而这也是现代人广泛地患有不同程度的精神疾病的原因，因为存在的意义完全崩塌了。打倒我们的不是如饥饿，疾病一般有实感的“重”，而是不可承受的生命之“轻”，精神与肉体的背反是现代人一切痛苦的根源。</p><hr /></section>
<section><h2>1.2 人类离不开谎言<a href="#12-人类离不开谎言"><span>#</span></a></h2><p>说到底，人类社会的最为底层的机制便是谎言。</p><p>国家，民族，契约，宗教，这些如同欧式几何中的基本公理般不证自明的存在，都是仰赖谎言才得以建立，而所谓的不证自明本质就是一个所有人都认同的谎言，是一个无法证伪的命题，不承认的话也就代表人类的文明的一切努力的成果都将不复存在。</p><p>人类文明建立在谎言的空中楼阁之上，楼阁之下是一眼看不到底的深渊，当谎言的空中楼阁如沙粒般四散开来，我们将永坠无意义之深渊。</p><hr /></section>
<section><h2>1.3 欲望是人生的底层驱力<a href="#13-欲望是人生的底层驱力"><span>#</span></a></h2><p>欲望是人生的底层驱力。欲望的本质是个体生命想要让自身或者外部世界抵达自己心中的应许之地的一种冲动，其来源是对现状的不满和因此产生的想要改变现状的愿望。得不到满足的欲望则是人生一切痛苦的根源。</p><p>我们总是将理想描绘得相当超脱凡尘，仿佛它是一种与欲望毫不相干的事物，但究其本质，仍是一团复杂欲望的集合体，尽管它可能确实超脱了部分的生物本能，但还是没有走出欲望的范畴。</p><p>当人们为某一目标，某一愿望，某一理想而奋斗和提升自我时，都在不自觉的将欲望当作推进的燃料，这也是为什么人们常常将欲望和火焰联系在一起，因为它们都有一个共通之处，那就是不达成目的之前总是拼命攫取这周围的一切助力，永不停歇。</p><p>因此，我们可以很轻易地得出这样的结论——无止境的沉溺于欲望当中只会最终将自己也当作柴薪而燃烧殆尽，欲望燃烧的不是精力，也不是热情，而是自我，是诞生于生物本能和后天培养的自我。</p><p>但缺少欲望的结果也是可怕的，因为那意味着对你而言世间的一切都将永远的失去其存在的意义，因为欲望和信念是人生的锚点，失去其中任何一个都会让人永坠无意义之虚空。</p><p>人生之矛盾就在于此，欲望太多，容易失去自我，迷失初心，成为欲望的俘虏；而欲望太少，人生又将失去那份不断向前，永不满足的内驱力，很容易陷入无止境的虚无。</p><p>从这种角度来看，人生正是这种矛盾螺旋不断角力的结果。</p><hr /></section>
<section><h2>1.4 个体与自由王国<a href="#14-个体与自由王国"><span>#</span></a></h2><p>康米总是幻想人类迟早会从必然王国走向自由王国，然而实际上这只不过是一厢情愿罢了。因为制约人类无法真正走向自由王国的恰恰是人类本身。人类本身的不圆满导致个体必须借助社会的力量才能够在这个世界生存，在这一过程中，个体向群体让渡了权力，将自己与群体捆绑在了一起，而这份让渡出去的权力，实际上永远无法得到有效的制约，手握大权的人类，无论他的道德水平有多高，智慧有多深，当他行使这份由千千万万的个体让渡出来的权力时，实际上已经构成对其他的个体的自由或者权利的侵犯，因为权力本质便是个体对自身或其他个体的一种支配形式。</p><p>简言之，人类的自身的不圆满导致个体必须向群体献出自身的一部分权力才能够在这个世界上生存，而让渡出去的权力实际上是不可能不反过来侵犯个体的自由的，而这也就是自由王国从根本上无法实现的原因。</p><p>而想要真正接近自由王国这一愿景，必须从强化人类自身入手，无论从生物手段入手还是从机械手段入手，都应该全方位地对人类进行补全，只有当每一个个体都具有真正意义上的独立性，自由王国的幻想才有实现的可能，而不是像现在一样，指望那些品尝到权力的芬芳的上位者将人类带入那个光辉的未来。</p><p>从这种角度来看，庄子的《逍遥游》便是一种对补完的人类的朴素想象。</p><hr /></section>
<section><h2>1.5 彼岸是必须破除的幻象<a href="#15-彼岸是必须破除的幻象"><span>#</span></a></h2><p>人生是一个巨大的教堂，对幸福彼岸的许诺是无良牧师们分发的精神鸦片，只有砸破了天堂的幻象，才能真正获得勇气，去面对无趣而操蛋的生活。</p><p>主观自我与客观自我的根源性冲突是一切欲求和痛苦的根源。</p><hr /></section>
<section><h2>1.6 广泛的犬儒主义<a href="#16-广泛的犬儒主义"><span>#</span></a></h2><p>犬儒主义不是现代社会的发明，犬儒主义自古有之，被冠以不同的名号。</p><p>一个体系的成功者往往对其所在体系的运转规律了如指掌，他们是体系的最佳适任者，也因此最能体会到体系的弊病所在，但毕竟他们是成功者，是既得利益者，即便对一切都洞若观火，但是为了维持表面上的平衡，他们必须装出一无所知的样子，而在本质这就是犬儒主义，只是没有表达出来，可以说他们都是隐性的犬儒主义者。</p><p>犬儒主义是存在主义的极端演化。</p><p>因此，也就不难理解，犬儒主义为何在如今这个后革命时代如此广泛了。</p><hr /></section>
<section><h2>1.7 抽象之上即为日常<a href="#17-抽象之上即为日常"><span>#</span></a></h2><p>人类对客观世界的改造从根本上建立于对客观世界的规律的总结，而这也可以视作“以简御繁”——即智慧生命相对于无边宽广的宇宙来说太过渺小，受限于先天禀赋，生命永远无法洞彻宇宙的所有奥秘，但文明的发展离不开对规则的利用，因此他们需要一种中间层来充当翻译，将复杂的细节隐藏在简洁的理论所搭建的符号体系大厦之中，然后通过这套名为知识的简洁的中间层来驾驭瞬息万变，暧昧不清的客观世界。</p><p>而这便是一种抽象，通过归纳总结将关键的高层次的因素统合在一起，人类成功的从这些抽象的孔洞中窥见了真理的海洋，没有这些抽象的过滤作用，人类只会被无尽纷繁复杂的细节给淹没。</p><p>或者更进一步，人类赖以生存的所有人造的结构都是对现实世界的抽象，最典型的就是人类社会。如果类比于操作系统，人类社会可以说是迄今为止人类所创造的最为宏伟最为复杂最为精妙的抽象系统了。</p><p>它无条件的接纳了每一降生于世的赤子，同时随着时间的流逝，这些一尘不染的人类幼崽都将被高效转化为高度社会化的人，就像一个时刻不停运转的流水线，高效地将一张张透亮的白纸染上五彩斑斓的黑色。</p><hr /></section>
<section><h2>1.8 爱欲自神秘空间降生<a href="#18-爱欲自神秘空间降生"><span>#</span></a></h2></section>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E9%AD%94%E6%B3%95%E4%BD%BF%E4%B9%8B%E5%A4%9C/%E4%B8%80%E4%B8%AA%E9%9D%9E%E6%9C%88%E5%8E%A8%E7%9A%84%E8%87%AA%E7%99%BD/</id>
      <title type="text">一个非月厨的自白</title>
      <published>2025-10-10T00:00:00.000Z</published>
      <updated>2025-10-10T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E9%AD%94%E6%B3%95%E4%BD%BF%E4%B9%8B%E5%A4%9C/%E4%B8%80%E4%B8%AA%E9%9D%9E%E6%9C%88%E5%8E%A8%E7%9A%84%E8%87%AA%E7%99%BD/"/>
      <summary type="text">25年国庆推完魔法使之夜的发癫之作。</summary>
      <content type="html"><![CDATA[<p>世事总是如此奇妙，在这个国庆假期之前，我从未想过我会如此喜欢一个十年前的老游戏，一个故事早在上个世纪就已经完结的老游戏。</p>
<p>说实话，我并非月厨，不玩fgo，也不关注型月相关二创。我对型月的大部分印象基本集中在fz和fsn，毕竟这是曾经b站的顶流，每一个经历过那段时期的b站的老用户都对此不陌生，但也就仅此而已。</p>
<p>直到这次国庆假期，因为机缘巧合我注册了一个emby服，恰巧《空之境界》被摆在一个显眼的位置，抱着百无聊赖地心情我点开了它，说实话对前几集剧场版我的评价不算高，就像大多数优秀的商业电影一样，视觉效果不错，有令人印象深刻的音乐，让我有种在看《铃芽之旅》感觉（我对这部的评价一向不高）。</p>
<p>但随着我愈发深入这个世界，我被它那种冷清，寂寥的氛围感和个性鲜明的角色吸引了。</p>
<p>我是那种相对热闹更偏爱冷清的人，《空之境界》完全符合我的审美，特别是《矛盾螺旋》，综合考虑，我会给空境整个系列9分，因为氛围感，以及足够有趣。</p>
<p>即使我看完了空境，它所燃起的火焰并没有就此熄灭，我并没有感到餍足，而是在渴求更多，于是我将目光投向了同一世界观，角色之间有关联的《魔法使之夜》，这是我第一次真正意义上玩视觉小说。</p>
<p>魔夜没有让我失望，一脉相承的清冷氛围感，更胜一筹的人物塑造，风格多变但与演出十分契合的音乐。</p>
<p>我将永远不会忘记青子撑着红伞于雨中的街头漫步的镜头──充满生命力的仿佛在燃烧的红色与晦暗的湿漉漉的街景形成的强烈对比。</p>
<p>少女撑着红伞漫步于街头，动作闲适而优雅，80年代的复古学生制服下勾勒出一副玲珑有致的身体曲线，青涩却不乏吸引力，黑色丝袜所包裹住的纤细的小腿，更是为少女增添了几分神秘的诱惑力，而在此之上叫人无法忽视的，泛着白瓷光泽的，娇嫩而富有肉感的大腿，则堪称造物主的点睛之笔，是上天赐予人类的最后的礼物。</p>
<p>少女与街道，雨与红伞，人融于景，景合于人，青春少女的生命力与凄清的天地风物所迸发出的美，苍白了我的一切言语。</p>
<p>我也不会忘记，第五魔法·青所创造的奇迹，四季变换，光阴流转，起死回生，一头仿佛流动的火焰般的长发和逆季节生长的遍野白花……</p>
<p>不过最让人印象深刻的还是那栋独立于高坡之上的洋房，温暖的日光房，轻松的起居室，冷得像冰窖的走廊，深夜悠长的电话铃……以及那些让人哭笑不得的日常。</p>
<p>魔夜改变了我对视觉小说的看法，在那之后我总是不满足。</p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E7%9B%98%E7%82%B9%E4%B8%80%E4%B8%8B%E8%BF%91%E5%B9%B4%E6%9D%A5%E6%AF%94%E8%BE%83%E5%96%9C%E6%AC%A2%E7%9A%84%E8%A7%92%E8%89%B2/</id>
      <title type="text">盘点一下近年来比较喜欢的角色</title>
      <published>2026-06-19T00:00:00.000Z</published>
      <updated>2026-06-19T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E7%9B%98%E7%82%B9%E4%B8%80%E4%B8%8B%E8%BF%91%E5%B9%B4%E6%9D%A5%E6%AF%94%E8%BE%83%E5%96%9C%E6%AC%A2%E7%9A%84%E8%A7%92%E8%89%B2/"/>
      <summary type="text">发癫ing</summary>
      <content type="html"><![CDATA[<p>1.上伊那牡丹 - 砺波伊吹
今年看过最可爱的角色，本来是不喜欢短发的，但这个实在难以拒绝，完美符合我对软乎乎的二次元美少女的偏好。</p>
<p>对了，还有最近的截图
</p><figure><img src="https://lsky.ry.mk/i/2026/06/19/07b350414c8e4.webp" alt="562" /><figcaption>562</figcaption></figure><p></p>
<p>其实牡丹也还行，但是ibk太棒了
<img src="https://lsky.ry.mk/i/2026/06/19/58c737f12308e.webp" alt="" /></p>
<p>2.千年女优 - 千代子
老一辈动画人的审美还是在线，巧笑倩兮，美目盼兮，素以为绚兮，素淡的气质系美人，五花八门的金毛，白毛，蓝毛看多了，反而感觉传统的黑发美人才是真的艳丽。
<img src="https://lsky.ry.mk/i/2026/06/19/9f0c77b8c7130.webp" alt="" /></p>
<p>3.电锯人 - 玛奇玛
姐系坏女人，神秘强势，难以捉摸，一身正装反而更加色气，若即若离的距离感把控的太好了，每次看她像对待家养小狗一样玩弄电次君我就爽炸了，坏女人是对的。
偶然发现的logo，意外还挺适合放在终端的
<img src="https://lsky.ry.mk/i/2026/06/19/8ee31c5ac502e.webp" alt="" /></p>
<p>4.四叠半神话大系 - 明石
某种意义上的完美女性，宅男的最终幻想，感觉比中原岬的幻想元素还重
<img src="https://lsky.ry.mk/i/2026/06/19/b5f7aedef9233.webp" alt="" /></p>
<p>5.企鹅公路 - 神秘大姐姐（我也不知道为什么没有名字）
嗯，似乎姐系的爱好暴露无疑，其实是对神秘的女性的偏爱罢了——未知的世界的入口，永远看不透，永远充满新鲜感，永远不会归于平庸，只存在于幻想中的女性。
<img src="https://lsky.ry.mk/i/2026/06/19/c528570045bdb.webp" alt="" /></p>
<p>6.魔法师之夜 - 青子 and 有珠
魔夜是我第一个玩过的日系视觉小说，记得去年推完的时候我还发帖发癫来着。</p>
<p>有一说一，魔夜的画风确实以现在的眼光来看有些老了，但架不住人物塑造得太好了，充分展现的青子和有珠的魅力，表侧与里侧，日常与非日常，很少有创作者能把握这两者之间的平衡，到现在仍无法忘记独立于高坡之上的洋房，温暖的日光房，轻松的起居室，冷得像冰窖的走廊，深夜悠长的电话铃……</p>
<p>不知道为什么，虽然青子腹黑得可爱，但是个人还是更喜欢有珠，简单形容就像是住在兔子洞中的魔女，孩童般懵懂</p>
<p>这张的青子倒是意外的安静，少女祷告中……
<img src="https://lsky.ry.mk/i/2026/06/19/a227fe5464900.webp" alt="" /></p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E9%80%82%E7%94%A8via%E5%92%8C%E9%9B%A8%E8%A7%81%E7%9A%84%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%BB%E9%A1%B5/</id>
      <title type="text">适用于via和雨见的浏览器主页</title>
      <published>2026-05-25T00:00:00.000Z</published>
      <updated>2026-05-25T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E9%80%82%E7%94%A8via%E5%92%8C%E9%9B%A8%E8%A7%81%E7%9A%84%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%BB%E9%A1%B5/"/>
      <summary type="text">via/雨见的主页的配置</summary>
      <content type="html"><![CDATA[<p>logo html：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"https://sdk.jinrishici.com/v2/browser/jinrishici.js"</span><span> </span><span>charset</span><span>=</span><span>"utf-8"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"widget_wrapper"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"poem_container"</span><span> </span><span>style</span><span>=</span><span>"</span><span>display: none;</span><span>"</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"poem_sentence"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"poem_info"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"clock-container"</span><span> </span><span>id</span><span>=</span><span>"clock_container"</span><span> </span><span>style</span><span>=</span><span>"</span><span>display: none;</span><span>"</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"unit-group"</span><span> </span><span>id</span><span>=</span><span>"hours"</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"separator"</span><span>&gt;:&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"unit-group"</span><span> </span><span>id</span><span>=</span><span>"minutes"</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"separator"</span><span>&gt;:&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"unit-group"</span><span> </span><span>id</span><span>=</span><span>"seconds"</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"flip-card"</span><span>&gt;0&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>23</div></div><div><span>    </span><span>'use strict'</span><span>;</span></div></div><div><div><div>24</div></div><div><span>    </span><span>// ==========================================</span></div></div><div><div><div>25</div></div><div><span>    </span><span>// 【配置区】在这里修改您的设置</span></div></div><div><div><div>26</div></div><div><span>    </span><span>// ==========================================</span></div></div><div><div><div>27</div></div><div><span>    </span><span>const</span><span> </span><span>VIA_CONFIG</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>28</div></div><div><span>        </span><span>// 挂件类型：1 = 随机一言，2 = 今日诗词，3 = 翻页钟</span></div></div><div><div><div>29</div></div><div><span>        </span><span>widgetType</span><span>:</span><span> </span><span>3</span><span>,</span></div></div><div><div><div>30</div></div><div><span>        </span><span>// 文字类挂件是否自动刷新（翻页钟无效）</span></div></div><div><div><div>31</div></div><div><span>        </span><span>autoRefresh</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>32</div></div><div><span>        </span><span>// 刷新间隔（毫秒）</span></div></div><div><div><div>33</div></div><div><span>        </span><span>refreshInterval</span><span>:</span><span> </span><span>10000</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>35</div></div><div><span>    </span><span>const</span><span> </span><span>safeStorage</span><span> </span><span>=</span><span> (() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>36</div></div><div><span>        </span><span>try</span><span> {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>const</span><span> </span><span>testKey</span><span> </span><span>=</span><span> </span><span>'__via_test__'</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>localStorage</span><span>.</span><span>setItem</span><span><span>(</span><span>testKey</span><span>, </span></span><span>'1'</span><span>);</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>localStorage</span><span>.</span><span>removeItem</span><span><span>(</span><span>testKey</span><span>);</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span><span> </span><span>localStorage</span><span>;</span></span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>42</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>43</div></div><div><span>                </span><span>getItem</span><span>() { </span><span>return</span><span> </span><span>null</span><span>; },</span></div></div><div><div><div>44</div></div><div><span>                </span><span>setItem</span><span>() {},</span></div></div><div><div><div>45</div></div><div><span>                </span><span>removeItem</span><span>() {}</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>})();</span></div></div><div><div><div>49</div></div><div><span>    </span><span>const</span><span> </span><span>$</span><span> </span><span>=</span><span><span> (</span><span>sel</span><span>, </span><span>root</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>) </span></span><span>=&gt;</span><span><span> </span><span>root</span><span>.</span></span><span>querySelector</span><span><span>(</span><span>sel</span><span>);</span></span></div></div><div><div><div>50</div></div><div><span>    </span><span>const</span><span> </span><span>$$</span><span> </span><span>=</span><span><span> (</span><span>sel</span><span>, </span><span>root</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>) </span></span><span>=&gt;</span><span><span> </span><span>root</span><span>.</span></span><span>querySelectorAll</span><span><span>(</span><span>sel</span><span>);</span></span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>document</span><span>.</span><span>addEventListener</span><span>(</span><span>'DOMContentLoaded'</span><span>, () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>53</div></div><div><span>        </span><span>const</span><span> </span><span>poemBox</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#poem_container'</span><span>);</span></div></div><div><div><div>54</div></div><div><span>        </span><span>const</span><span> </span><span>clockBox</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#clock_container'</span><span>);</span></div></div><div><div><div>55</div></div><div><span>        </span><span>const</span><span> </span><span>sentenceEl</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#poem_sentence'</span><span>);</span></div></div><div><div><div>56</div></div><div><span>        </span><span>const</span><span> </span><span>infoEl</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#poem_info'</span><span>);</span></div></div><div><div><div>57</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>58</div></div><div><span>        </span><span>// 1. 挂件渲染逻辑</span></div></div><div><div><div>59</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>60</div></div><div><span>        </span><span>if</span><span> (</span><span>VIA_CONFIG</span><span>.</span><span>widgetType</span><span> </span><span>===</span><span> </span><span>1</span><span> </span><span>||</span><span> </span><span>VIA_CONFIG</span><span>.</span><span>widgetType</span><span> </span><span>===</span><span> </span><span>2</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>if</span><span><span> (</span><span>poemBox</span><span>) </span><span>poemBox</span><span>.</span></span><span>style</span><span>.</span><span>display</span><span> </span><span>=</span><span> </span><span>'block'</span><span>;</span></div></div><div><div><div>62</div></div><div><span>            </span><span>const</span><span> </span><span>loadSentence</span><span> </span><span>=</span><span> </span><span>async</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>63</div></div><div><span>                </span><span>try</span><span> {</span></div></div><div><div><div>64</div></div><div><span>                    </span><span>if</span><span> (</span><span>VIA_CONFIG</span><span>.</span><span>widgetType</span><span> </span><span>===</span><span> </span><span>1</span><span>) {</span></div></div><div><div><div>65</div></div><div><span>                        </span><span>if</span><span> (</span><span>typeof</span><span><span> </span><span>fetch</span><span> </span></span><span>!==</span><span> </span><span>'function'</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>66</div></div><div><span>                        </span><span>const</span><span> </span><span>response</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetch</span><span>(</span><span>'https://v1.hitokoto.cn'</span><span>, { </span><span>cache</span><span>:</span><span> </span><span>'no-store'</span><span> });</span></div></div><div><div><div>67</div></div><div><span>                        </span><span>if</span><span> (</span><span>!</span><span><span>response</span><span>.</span></span><span>ok</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>68</div></div><div><span>                        </span><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span> </span><span>await</span><span><span> </span><span>response</span><span>.</span></span><span>json</span><span>();</span></div></div><div><div><div>69</div></div><div><span>                        </span><span>if</span><span><span> (</span><span>sentenceEl</span><span>) </span><span>sentenceEl</span><span>.</span></span><span>innerHTML</span><span> </span><span>=</span><span><span> </span><span>data</span><span>.</span></span><span>hitokoto</span><span> </span><span>||</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>70</div></div><div><span>                        </span><span>const</span><span> </span><span>author</span><span> </span><span>=</span><span><span> </span><span>data</span><span>.</span></span><span>from_who</span><span> </span><span>?</span><span><span> </span><span>data</span><span>.</span></span><span>from_who</span><span> </span><span>+</span><span> </span><span>' '</span><span> </span><span>:</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>71</div></div><div><span>                        </span><span>const</span><span> </span><span>source</span><span> </span><span>=</span><span><span> </span><span>data</span><span>.</span></span><span>from</span><span> </span><span>?</span><span> </span><span>`《</span><span>${</span><span>data</span><span>.</span><span>from</span><span>}</span><span>》`</span><span> </span><span>:</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>72</div></div><div><span>                        </span><span>if</span><span><span> (</span><span>infoEl</span><span>) </span><span>infoEl</span><span>.</span></span><span>innerHTML</span><span> </span><span>=</span><span><span> (</span><span>author</span><span> </span></span><span>||</span><span><span> </span><span>source</span><span>) </span></span><span>?</span><span> </span><span>`—— </span><span>${</span><span>author</span><span>}${</span><span>source</span><span>}</span><span>`</span><span> </span><span>:</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>73</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>74</div></div><div><span>                        </span><span>if</span><span> (</span><span>typeof</span><span><span> </span><span>jinrishici</span><span> </span></span><span>===</span><span> </span><span>'undefined'</span><span> </span><span>||</span><span> </span><span>!</span><span><span>jinrishici</span><span>.</span></span><span>load</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>75</div></div><div><span><span>                        </span></span><span>jinrishici</span><span>.</span><span>load</span><span><span>(</span><span>result</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>76</div></div><div><span>                            </span><span>try</span><span> {</span></div></div><div><div><div>77</div></div><div><span>                                </span><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span><span> </span><span>result</span><span> </span></span><span>&amp;&amp;</span><span><span> </span><span>result</span><span>.</span></span><span>data</span><span> </span><span>?</span><span><span> </span><span>result</span><span>.</span></span><span>data</span><span> </span><span>:</span><span> {};</span></div></div><div><div><div>78</div></div><div><span>                                </span><span>const</span><span> </span><span>content</span><span> </span><span>=</span><span><span> </span><span>data</span><span>.</span></span><span>content</span><span> </span><span>||</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>79</div></div><div><span>                                </span><span>const</span><span> </span><span>origin</span><span> </span><span>=</span><span><span> </span><span>data</span><span>.</span></span><span>origin</span><span> </span><span>||</span><span> {};</span></div></div><div><div><div>80</div></div><div><span>                                </span><span>if</span><span><span> (</span><span>sentenceEl</span><span>) </span><span>sentenceEl</span><span>.</span></span><span>innerHTML</span><span> </span><span>=</span><span><span> </span><span>content</span><span>;</span></span></div></div><div><div><div>81</div></div><div><span>                                </span><span>if</span><span><span> (</span><span>infoEl</span><span>) {</span></span></div></div><div><div><div>82</div></div><div><span><span>                                    </span></span><span>infoEl</span><span>.</span><span>innerHTML</span><span> </span><span>=</span><span><span> </span><span>origin</span><span>.</span></span><span>title</span></div></div><div><div><div>83</div></div><div><span>                                        </span><span>?</span><span> </span><span>`—— [</span><span>${</span><span>origin</span><span>.</span><span>dynasty</span><span> </span><span>||</span><span> </span><span><span>''</span><span>}</span></span><span>] · </span><span>${</span><span>origin</span><span>.</span><span>author</span><span> </span><span>||</span><span> </span><span><span>''</span><span>}</span></span><span>《</span><span>${</span><span>origin</span><span>.</span><span>title</span><span>}</span><span>》`</span></div></div><div><div><div>84</div></div><div><span>                                        </span><span>:</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>85</div></div><div><span><span>                                </span></span><span>}</span></div></div><div><div><div>86</div></div><div><span><span>                            </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>87</div></div><div><span><span>                                </span></span><span>console</span><span>.</span><span>error</span><span>(</span><span>'今日诗词解析失败'</span><span><span>, </span><span>e</span><span>);</span></span></div></div><div><div><div>88</div></div><div><span><span>                            </span></span><span>}</span></div></div><div><div><div>89</div></div><div><span><span>                        </span></span><span>});</span></div></div><div><div><div>90</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>91</div></div><div><span><span>                </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>92</div></div><div><span><span>                    </span></span><span>console</span><span>.</span><span>error</span><span>(</span><span>'获取失败'</span><span><span>, </span><span>e</span><span>);</span></span></div></div><div><div><div>93</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>94</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>95</div></div><div><span>            </span><span>loadSentence</span><span>();</span></div></div><div><div><div>96</div></div><div><span>            </span><span>if</span><span> (</span><span>VIA_CONFIG</span><span>.</span><span>autoRefresh</span><span>) {</span></div></div><div><div><div>97</div></div><div><span>                </span><span>setInterval</span><span><span>(</span><span>loadSentence</span><span>, </span><span>Math</span><span>.</span></span><span>max</span><span>(</span><span>3000</span><span>, </span><span>VIA_CONFIG</span><span>.</span><span>refreshInterval</span><span> </span><span>||</span><span> </span><span>10000</span><span>));</span></div></div><div><div><div>98</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>99</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>VIA_CONFIG</span><span>.</span><span>widgetType</span><span> </span><span>===</span><span> </span><span>3</span><span>) {</span></div></div><div><div><div>100</div></div><div><span>            </span><span>// ==========================================</span></div></div><div><div><div>101</div></div><div><span>            </span><span>// 3. 翻页钟挂件</span></div></div><div><div><div>102</div></div><div><span>            </span><span>// ==========================================</span></div></div><div><div><div>103</div></div><div><span>            </span><span>if</span><span><span> (</span><span>clockBox</span><span>) </span><span>clockBox</span><span>.</span></span><span>style</span><span>.</span><span>display</span><span> </span><span>=</span><span> </span><span>'inline-flex'</span><span>;</span></div></div><div><div><div>104</div></div><div><span>            </span><span>const</span><span> </span><span>unitCache</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>105</div></div><div><span>                </span><span>hours</span><span>:</span><span> </span><span>$$</span><span>(</span><span>'#hours .flip-card'</span><span>),</span></div></div><div><div><div>106</div></div><div><span>                </span><span>minutes</span><span>:</span><span> </span><span>$$</span><span>(</span><span>'#minutes .flip-card'</span><span>),</span></div></div><div><div><div>107</div></div><div><span>                </span><span>seconds</span><span>:</span><span> </span><span>$$</span><span>(</span><span>'#seconds .flip-card'</span><span>)</span></div></div><div><div><div>108</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>109</div></div><div><span>            </span><span>const</span><span> </span><span>lastValues</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>110</div></div><div><span>                </span><span>hours</span><span>:</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>111</div></div><div><span>                </span><span>minutes</span><span>:</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>112</div></div><div><span>                </span><span>seconds</span><span>:</span><span> </span><span>''</span></div></div><div><div><div>113</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>114</div></div><div><span>            </span><span>const</span><span> </span><span>updateUnit</span><span> </span><span>=</span><span><span> (</span><span>unitId</span><span>, </span><span>value</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>115</div></div><div><span>                </span><span>const</span><span> </span><span>cards</span><span> </span><span>=</span><span><span> </span><span>unitCache</span><span>[</span><span>unitId</span><span>];</span></span></div></div><div><div><div>116</div></div><div><span>                </span><span>if</span><span> (</span><span>!</span><span><span>cards</span><span> </span></span><span>||</span><span><span> </span><span>cards</span><span>.</span></span><span>length</span><span> </span><span>&lt;</span><span> </span><span>2</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>117</div></div><div><span>                </span><span>const</span><span> </span><span>strValue</span><span> </span><span>=</span><span> </span><span>String</span><span><span>(</span><span>value</span><span>).</span></span><span>padStart</span><span>(</span><span>2</span><span>, </span><span>'0'</span><span>);</span></div></div><div><div><div>118</div></div><div><span>                </span><span>if</span><span><span> (</span><span>lastValues</span><span>[</span><span>unitId</span><span>] </span></span><span>===</span><span><span> </span><span>strValue</span><span>) </span></span><span>return</span><span>;</span></div></div><div><div><div>119</div></div><div><span><span>                </span></span><span>lastValues</span><span>[</span><span>unitId</span><span>] </span><span>=</span><span><span> </span><span>strValue</span><span>;</span></span></div></div><div><div><div>120</div></div><div><span>                </span><span>for</span><span> (</span><span>let</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>2</span><span><span>; </span><span>i</span></span><span>++</span><span>) {</span></div></div><div><div><div>121</div></div><div><span>                    </span><span>const</span><span> </span><span>card</span><span> </span><span>=</span><span><span> </span><span>cards</span><span>[</span><span>i</span><span>];</span></span></div></div><div><div><div>122</div></div><div><span>                    </span><span>const</span><span> </span><span>num</span><span> </span><span>=</span><span><span> </span><span>strValue</span><span>[</span><span>i</span><span>];</span></span></div></div><div><div><div>123</div></div><div><span>                    </span><span>if</span><span> (</span><span>!</span><span><span>card</span><span>) </span></span><span>continue</span><span>;</span></div></div><div><div><div>124</div></div><div><span>                    </span><span>if</span><span><span> (</span><span>card</span><span>.</span></span><span>innerText</span><span> </span><span>!==</span><span><span> </span><span>num</span><span>) {</span></span></div></div><div><div><div>125</div></div><div><span><span>                        </span></span><span>card</span><span>.</span><span>classList</span><span>.</span><span>remove</span><span>(</span><span>'animate'</span><span>);</span></div></div><div><div><div>126</div></div><div><span>                        </span><span>void</span><span><span> </span><span>card</span><span>.</span></span><span>offsetWidth</span><span>;</span></div></div><div><div><div>127</div></div><div><span><span>                        </span></span><span>card</span><span>.</span><span>innerText</span><span> </span><span>=</span><span><span> </span><span>num</span><span>;</span></span></div></div><div><div><div>128</div></div><div><span><span>                        </span></span><span>card</span><span>.</span><span>classList</span><span>.</span><span>add</span><span>(</span><span>'animate'</span><span>);</span></div></div><div><div><div>129</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>130</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>131</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>132</div></div><div><span>            </span><span>const</span><span> </span><span>updateClock</span><span> </span><span>=</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>133</div></div><div><span>                </span><span>const</span><span> </span><span>now</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Date</span><span>();</span></div></div><div><div><div>134</div></div><div><span>                </span><span>updateUnit</span><span>(</span><span>'hours'</span><span><span>, </span><span>now</span><span>.</span></span><span>getHours</span><span>());</span></div></div><div><div><div>135</div></div><div><span>                </span><span>updateUnit</span><span>(</span><span>'minutes'</span><span><span>, </span><span>now</span><span>.</span></span><span>getMinutes</span><span>());</span></div></div><div><div><div>136</div></div><div><span>                </span><span>updateUnit</span><span>(</span><span>'seconds'</span><span><span>, </span><span>now</span><span>.</span></span><span>getSeconds</span><span>());</span></div></div><div><div><div>137</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>138</div></div><div><span>            </span><span>updateClock</span><span>();</span></div></div><div><div><div>139</div></div><div><span>            </span><span>setInterval</span><span><span>(</span><span>updateClock</span><span>, </span></span><span>1000</span><span>);</span></div></div><div><div><div>140</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>141</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>142</div></div><div><span>        </span><span>// 2. 搜索框左侧切换搜索引擎逻辑</span></div></div><div><div><div>143</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>144</div></div><div><span>        </span><span>const</span><span> </span><span>search_submit</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#search_submit'</span><span>);</span></div></div><div><div><div>145</div></div><div><span>        </span><span>const</span><span> </span><span>search_input</span><span> </span><span>=</span><span> </span><span>$</span><span>(</span><span>'#search_input'</span><span>);</span></div></div><div><div><div>146</div></div><div><span>        </span><span>if</span><span> (</span><span>!</span><span><span>search_submit</span><span> </span></span><span>||</span><span> </span><span>!</span><span><span>search_input</span><span>) </span></span><span>return</span><span>;</span></div></div><div><div><div>147</div></div><div><span>        </span><span>const</span><span> </span><span>engines</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>148</div></div><div><span>            </span><span>i</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'默认'</span><span>, </span><span>url</span><span>:</span><span> </span><span>''</span><span> },</span></div></div><div><div><div>149</div></div><div><span>            </span><span>bd</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'百度'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://m.baidu.com/s?word='</span><span> },</span></div></div><div><div><div>150</div></div><div><span>            </span><span>gg</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'谷歌'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://www.google.com/search?q='</span><span> },</span></div></div><div><div><div>151</div></div><div><span>            </span><span>by</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'必应'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://cn.bing.com/search?q='</span><span> },</span></div></div><div><div><div>152</div></div><div><span>            </span><span>dd</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'DuckGo'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://duckduckgo.com/?q='</span><span> },</span></div></div><div><div><div>153</div></div><div>
</div></div><div><div><div>154</div></div><div><span>            </span><span>// AI 类搜索</span></div></div><div><div><div>155</div></div><div><span>            </span><span>mt</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'秘塔'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://metaso.cn/?q='</span><span> },</span></div></div><div><div><div>156</div></div><div><span>            </span><span>km</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'Kimi'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://kimi.moonshot.cn/'</span><span> },</span></div></div><div><div><div>157</div></div><div><span>            </span><span>ai</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'文心一言'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://yiyan.baidu.com/'</span><span> },</span></div></div><div><div><div>158</div></div><div>
</div></div><div><div><div>159</div></div><div><span>            </span><span>// 国内主流</span></div></div><div><div><div>160</div></div><div><span>            </span><span>gk</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'夸克'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://quark.sm.cn/s?q='</span><span> },</span></div></div><div><div><div>161</div></div><div><span>            </span><span>sg</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'搜狗'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://m.sogou.com/web/searchList.jsp?keyword='</span><span> },</span></div></div><div><div><div>162</div></div><div><span>            </span><span>hs</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'360'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://m.so.com/s?q='</span><span> },</span></div></div><div><div><div>163</div></div><div><span>            </span><span>sm</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'神马'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://yz.m.sm.cn/s?q='</span><span> },</span></div></div><div><div><div>164</div></div><div>
</div></div><div><div><div>165</div></div><div><span>            </span><span>// 垂直搜索</span></div></div><div><div><div>166</div></div><div><span>            </span><span>bb</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'B站'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://m.bilibili.com/search?keyword='</span><span> },</span></div></div><div><div><div>167</div></div><div><span>            </span><span>bgm</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'Bangumi'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://bangumi.tv/subject_search/'</span><span> },</span></div></div><div><div><div>168</div></div><div><span>            </span><span>wb</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'微博'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://s.weibo.com/weibo/'</span><span> },</span></div></div><div><div><div>169</div></div><div><span>            </span><span>tt</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'头条'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://so.toutiao.com/search?keyword='</span><span> },</span></div></div><div><div><div>170</div></div><div><span>            </span><span>zht</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'知乎'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://www.zhihu.com/search?type=content&amp;q='</span><span> },</span></div></div><div><div><div>171</div></div><div><span>            </span><span>tb</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'贴吧'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://tieba.baidu.com/mo/q/hybrid/search?keyword='</span><span> },</span></div></div><div><div><div>172</div></div><div>
</div></div><div><div><div>173</div></div><div><span>            </span><span>// 国际/隐私向</span></div></div><div><div><div>174</div></div><div><span>            </span><span>yd</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'Yandex'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://yandex.com/search/?text='</span><span> },</span></div></div><div><div><div>175</div></div><div><span>            </span><span>oh</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>'OceanHero'</span><span>, </span><span>url</span><span>:</span><span> </span><span>'https://oceanhero.today/web?q='</span><span> }</span></div></div><div><div><div>176</div></div><div><span><span>        </span></span><span>};</span></div></div><div><div><div>177</div></div><div><span>        </span><span>let</span><span><span> </span><span>select</span><span> </span></span><span>=</span><span><span> </span><span>safeStorage</span><span>.</span></span><span>getItem</span><span>(</span><span>'se'</span><span>) </span><span>||</span><span> </span><span>'i'</span><span>;</span></div></div><div><div><div>178</div></div><div><span>        </span><span>if</span><span> (</span><span>!</span><span><span>engines</span><span>[</span><span>select</span><span>]) </span><span>select</span><span> </span></span><span>=</span><span> </span><span>'i'</span><span>;</span></div></div><div><div><div>179</div></div><div><span>        </span><span>const</span><span> </span><span>switch_btn</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>'button'</span><span>);</span></div></div><div><div><div>180</div></div><div><span><span>        </span></span><span>switch_btn</span><span>.</span><span>id</span><span> </span><span>=</span><span> </span><span>'switch_btn'</span><span>;</span></div></div><div><div><div>181</div></div><div><span><span>        </span></span><span>switch_btn</span><span>.</span><span>type</span><span> </span><span>=</span><span> </span><span>'button'</span><span>;</span></div></div><div><div><div>182</div></div><div><span><span>        </span></span><span>switch_btn</span><span>.</span><span>classList</span><span>.</span><span>add</span><span>(</span><span>'url'</span><span>);</span></div></div><div><div><div>183</div></div><div><span><span>        </span></span><span>switch_btn</span><span>.</span><span>textContent</span><span> </span><span>=</span><span><span> </span><span>engines</span><span>[</span><span>select</span><span>].</span></span><span>name</span><span>;</span></div></div><div><div><div>184</div></div><div><span><span>        </span></span><span>search_submit</span><span>.</span><span>parentElement</span><span>.</span><span>insertBefore</span><span><span>(</span><span>switch_btn</span><span>, </span><span>search_submit</span><span>);</span></span></div></div><div><div><div>185</div></div><div><span>        </span><span>const</span><span> </span><span>switch_window</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>'div'</span><span>);</span></div></div><div><div><div>186</div></div><div><span><span>        </span></span><span>switch_window</span><span>.</span><span>id</span><span> </span><span>=</span><span> </span><span>'switch_window'</span><span>;</span></div></div><div><div><div>187</div></div><div><span><span>        </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span><span>(</span><span>switch_window</span><span>);</span></span></div></div><div><div><div>188</div></div><div>
</div></div><div><div><div>189</div></div><div><span>        </span><span>const</span><span> </span><span>renderEngines</span><span> </span><span>=</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>190</div></div><div><span><span>            </span></span><span>switch_window</span><span>.</span><span>innerHTML</span><span> </span><span>=</span><span><span> </span><span>Object</span><span>.</span></span><span>keys</span><span><span>(</span><span>engines</span><span>).</span></span><span>map</span><span><span>(</span><span>key</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>191</div></div><div><span>                </span><span>const</span><span> </span><span>isHidden</span><span> </span><span>=</span><span><span> (</span><span>key</span><span> </span></span><span>===</span><span> </span><span>'m'</span><span> </span><span>&amp;&amp;</span><span> (</span><span>!</span><span><span>safeStorage</span><span>.</span></span><span>getItem</span><span>(</span><span>'c'</span><span>) </span><span>||</span><span><span> </span><span>select</span><span> </span></span><span>!==</span><span> </span><span>'c'</span><span>)) </span><span>?</span><span> </span><span>'style="display:none;"'</span><span> </span><span>:</span><span> </span><span>''</span><span>;</span></div></div><div><div><div>192</div></div><div><span>                </span><span>return</span><span> </span><span>`&lt;div class="url switch_engine </span><span>${</span><span>key</span><span> </span><span>===</span><span> </span><span>select</span><span> </span><span>?</span><span> </span><span>'</span><span>active</span><span>'</span><span> </span><span>:</span><span> </span><span><span>''</span><span>}</span></span><span>" data-key="</span><span>${</span><span>key</span><span>}</span><span>" </span><span>${</span><span>isHidden</span><span>}</span><span>&gt;</span><span>${</span><span><span>engines</span><span>[</span><span>key</span><span>]</span></span><span>.</span><span>name</span><span>}</span><span>&lt;/div&gt;`</span><span>;</span></div></div><div><div><div>193</div></div><div><span><span>            </span></span><span>}).</span><span>join</span><span>(</span><span>''</span><span>);</span></div></div><div><div><div>194</div></div><div><span><span>        </span></span><span>};</span></div></div><div><div><div>195</div></div><div><span>        </span><span>renderEngines</span><span>();</span></div></div><div><div><div>196</div></div><div>
</div></div><div><div><div>197</div></div><div><span>        </span><span>let</span><span><span> </span><span>layoutCache</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>198</div></div><div><span>        </span><span>let</span><span><span> </span><span>barCache</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>199</div></div><div><span>        </span><span>let</span><span><span> </span><span>rootCache</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>200</div></div><div><span>        </span><span>let</span><span><span> </span><span>updateLayoutTimer</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>201</div></div><div>
</div></div><div><div><div>202</div></div><div><span>        </span><span>const</span><span> </span><span>use_bar</span><span> </span><span>=</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>203</div></div><div><span>            </span><span>const</span><span> </span><span>search_bar</span><span> </span><span>=</span><span><span> </span><span>barCache</span><span> </span></span><span>||</span><span> </span><span>$</span><span>(</span><span>'.search_bar'</span><span>);</span></div></div><div><div><div>204</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>search_bar</span><span>) </span></span><span>return</span><span>;</span></div></div><div><div><div>205</div></div><div><span><span>            </span></span><span>barCache</span><span> </span><span>=</span><span><span> </span><span>search_bar</span><span>;</span></span></div></div><div><div><div>206</div></div><div><span>            </span><span>const</span><span> </span><span>barStyle</span><span> </span><span>=</span><span><span> </span><span>window</span><span>.</span></span><span>getComputedStyle</span><span><span>(</span><span>search_bar</span><span>);</span></span></div></div><div><div><div>207</div></div><div><span>            </span><span>const</span><span> </span><span>barRadius</span><span> </span><span>=</span><span><span> </span><span>barStyle</span><span>.</span></span><span>getPropertyValue</span><span>(</span><span>'border-radius'</span><span>) </span><span>||</span><span> </span><span>'15px'</span><span>;</span></div></div><div><div><div>208</div></div><div><span>            </span><span>const</span><span> </span><span>topRadius</span><span> </span><span>=</span><span><span> </span><span>Math</span><span>.</span></span><span>max</span><span>(</span><span>parseFloat</span><span><span>(</span><span>barRadius</span><span>.</span></span><span>split</span><span>(</span><span>' '</span><span>)[</span><span>0</span><span>]) </span><span>||</span><span> </span><span>0</span><span>, </span><span>5</span><span>);</span></div></div><div><div><div>209</div></div><div><span><span>            </span></span><span>switch_btn</span><span>.</span><span>style</span><span>.</span><span>borderRadius</span><span> </span><span>=</span><span><span> (</span><span>topRadius</span><span> </span></span><span>-</span><span> </span><span>2</span><span>) </span><span>+</span><span> </span><span>'px'</span><span>;</span></div></div><div><div><div>210</div></div><div>
</div></div><div><div><div>211</div></div><div><span>            </span><span>const</span><span> </span><span>now</span><span> </span><span>=</span><span><span> </span><span>Date</span><span>.</span></span><span>now</span><span>();</span></div></div><div><div><div>212</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>layoutCache</span><span> </span></span><span>||</span><span><span> </span><span>now</span><span> </span></span><span>-</span><span><span> </span><span>layoutCache</span><span>.</span></span><span>timestamp</span><span> </span><span>&gt;</span><span> </span><span>100</span><span>) {</span></div></div><div><div><div>213</div></div><div><span>                </span><span>const</span><span> </span><span>root</span><span> </span><span>=</span><span><span> </span><span>rootCache</span><span> </span></span><span>||</span><span> </span><span>getComputedStyle</span><span><span>(</span><span>document</span><span>.</span></span><span>documentElement</span><span>);</span></div></div><div><div><div>214</div></div><div><span><span>                </span></span><span>rootCache</span><span> </span><span>=</span><span><span> </span><span>root</span><span>;</span></span></div></div><div><div><div>215</div></div><div><span>                </span><span>const</span><span> </span><span>barRect</span><span> </span><span>=</span><span><span> </span><span>search_bar</span><span>.</span></span><span>getBoundingClientRect</span><span>();</span></div></div><div><div><div>216</div></div><div><span>                </span><span>const</span><span> </span><span>btnRect</span><span> </span><span>=</span><span><span> </span><span>switch_btn</span><span>.</span></span><span>getBoundingClientRect</span><span>();</span></div></div><div><div><div>217</div></div><div><span><span>                </span></span><span>layoutCache</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>218</div></div><div><span>                    </span><span>timestamp</span><span>:</span><span><span> </span><span>now</span><span>,</span></span></div></div><div><div><div>219</div></div><div><span>                    </span><span>engine_num</span><span>:</span><span> </span><span>parseInt</span><span><span>(</span><span>root</span><span>.</span></span><span>getPropertyValue</span><span>(</span><span>'--engine_num'</span><span>).</span><span>trim</span><span>() </span><span>||</span><span> </span><span>'6'</span><span>, </span><span>10</span><span>),</span></div></div><div><div><div>220</div></div><div><span>                    </span><span>bar_width</span><span>:</span><span><span> </span><span>search_bar</span><span>.</span></span><span>offsetWidth</span><span>,</span></div></div><div><div><div>221</div></div><div><span>                    </span><span>bar_left</span><span>:</span><span><span> </span><span>barRect</span><span>.</span></span><span>left</span><span> </span><span>+</span><span><span> </span><span>window</span><span>.</span></span><span>scrollX</span><span>,</span></div></div><div><div><div>222</div></div><div><span>                    </span><span>bar_top</span><span>:</span><span><span> </span><span>barRect</span><span>.</span></span><span>top</span><span> </span><span>+</span><span><span> </span><span>window</span><span>.</span></span><span>scrollY</span><span>,</span></div></div><div><div><div>223</div></div><div><span>                    </span><span>bar_height</span><span>:</span><span><span> </span><span>barRect</span><span>.</span></span><span>height</span><span>,</span></div></div><div><div><div>224</div></div><div><span>                    </span><span>btn_left</span><span>:</span><span><span> </span><span>btnRect</span><span>.</span></span><span>left</span><span> </span><span>+</span><span><span> </span><span>window</span><span>.</span></span><span>scrollX</span></div></div><div><div><div>225</div></div><div><span><span>                </span></span><span>};</span></div></div><div><div><div>226</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>227</div></div><div>
</div></div><div><div><div>228</div></div><div><span>            </span><span>const</span><span> </span><span>top_position</span><span> </span><span>=</span><span><span> (</span><span>layoutCache</span><span>.</span></span><span>bar_top</span><span> </span><span>+</span><span><span> </span><span>layoutCache</span><span>.</span></span><span>bar_height</span><span> </span><span>+</span><span> </span><span>5</span><span>) </span><span>+</span><span> </span><span>'px'</span><span>;</span></div></div><div><div><div>229</div></div><div>
</div></div><div><div><div>230</div></div><div><span>            </span><span>if</span><span><span> (</span><span>layoutCache</span><span>.</span></span><span>engine_num</span><span> </span><span>&gt;</span><span> </span><span>4</span><span>) {</span></div></div><div><div><div>231</div></div><div><span><span>                </span></span><span>Object</span><span>.</span><span>assign</span><span><span>(</span><span>switch_window</span><span>.</span></span><span>style</span><span>, {</span></div></div><div><div><div>232</div></div><div><span>                    </span><span>width</span><span>:</span><span><span> </span><span>layoutCache</span><span>.</span></span><span>bar_width</span><span> </span><span>+</span><span> </span><span>'px'</span><span>,</span></div></div><div><div><div>233</div></div><div><span>                    </span><span>left</span><span>:</span><span><span> </span><span>layoutCache</span><span>.</span></span><span>bar_left</span><span> </span><span>+</span><span> </span><span>'px'</span><span>,</span></div></div><div><div><div>234</div></div><div><span>                    </span><span>transform</span><span>:</span><span> </span><span>'none'</span><span>,</span></div></div><div><div><div>235</div></div><div><span>                    </span><span>top</span><span>:</span><span><span> </span><span>top_position</span></span></div></div><div><div><div>236</div></div><div><span><span>                </span></span><span>});</span></div></div><div><div><div>237</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>238</div></div><div><span><span>                </span></span><span>Object</span><span>.</span><span>assign</span><span><span>(</span><span>switch_window</span><span>.</span></span><span>style</span><span>, {</span></div></div><div><div><div>239</div></div><div><span>                    </span><span>left</span><span>:</span><span><span> (</span><span>layoutCache</span><span>.</span></span><span>btn_left</span><span> </span><span>-</span><span> </span><span>6</span><span>) </span><span>+</span><span> </span><span>'px'</span><span>,</span></div></div><div><div><div>240</div></div><div><span>                    </span><span>transform</span><span>:</span><span> </span><span>'none'</span><span>,</span></div></div><div><div><div>241</div></div><div><span>                    </span><span>width</span><span>:</span><span> </span><span>'auto'</span><span>,</span></div></div><div><div><div>242</div></div><div><span>                    </span><span>top</span><span>:</span><span><span> </span><span>top_position</span></span></div></div><div><div><div>243</div></div><div><span><span>                </span></span><span>});</span></div></div><div><div><div>244</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>245</div></div><div><span><span>        </span></span><span>};</span></div></div><div><div><div>246</div></div><div>
</div></div><div><div><div>247</div></div><div><span>        </span><span>use_bar</span><span>();</span></div></div><div><div><div>248</div></div><div>
</div></div><div><div><div>249</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>addEventListener</span><span>(</span><span>'resize'</span><span>, () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>250</div></div><div><span>            </span><span>clearTimeout</span><span><span>(</span><span>updateLayoutTimer</span><span>);</span></span></div></div><div><div><div>251</div></div><div><span><span>            </span></span><span>updateLayoutTimer</span><span> </span><span>=</span><span> </span><span>setTimeout</span><span><span>(</span><span>use_bar</span><span>, </span></span><span>200</span><span>);</span></div></div><div><div><div>252</div></div><div><span><span>        </span></span><span>}, { </span><span>passive</span><span>:</span><span> </span><span>true</span><span> });</span></div></div><div><div><div>253</div></div><div>
</div></div><div><div><div>254</div></div><div><span><span>        </span></span><span>switch_btn</span><span>.</span><span>addEventListener</span><span>(</span><span>'click'</span><span><span>, </span><span>e</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>255</div></div><div><span><span>            </span></span><span>e</span><span>.</span><span>stopPropagation</span><span>();</span></div></div><div><div><div>256</div></div><div><span><span>            </span></span><span>e</span><span>.</span><span>preventDefault</span><span>();</span></div></div><div><div><div>257</div></div><div><span>            </span><span>const</span><span> </span><span>isActive</span><span> </span><span>=</span><span><span> </span><span>switch_btn</span><span>.</span></span><span>classList</span><span>.</span><span>contains</span><span>(</span><span>'active'</span><span>);</span></div></div><div><div><div>258</div></div><div><span><span>            </span></span><span>switch_btn</span><span>.</span><span>classList</span><span>.</span><span>toggle</span><span>(</span><span>'active'</span><span>, </span><span>!</span><span><span>isActive</span><span>);</span></span></div></div><div><div><div>259</div></div><div><span><span>            </span></span><span>switch_window</span><span>.</span><span>classList</span><span>.</span><span>toggle</span><span>(</span><span>'active'</span><span>, </span><span>!</span><span><span>isActive</span><span>);</span></span></div></div><div><div><div>260</div></div><div><span>            </span><span>use_bar</span><span>();</span></div></div><div><div><div>261</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>262</div></div><div>
</div></div><div><div><div>263</div></div><div><span><span>        </span></span><span>switch_window</span><span>.</span><span>addEventListener</span><span>(</span><span>'click'</span><span><span>, </span><span>e</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>264</div></div><div><span>            </span><span>const</span><span> </span><span>target</span><span> </span><span>=</span><span><span> </span><span>e</span><span>.</span></span><span>target</span><span>;</span></div></div><div><div><div>265</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>target</span><span>.</span></span><span>classList</span><span>.</span><span>contains</span><span>(</span><span>'switch_engine'</span><span>)) </span><span>return</span><span>;</span></div></div><div><div><div>266</div></div><div><span>            </span><span>let</span><span><span> </span><span>new_key</span><span> </span></span><span>=</span><span><span> </span><span>target</span><span>.</span></span><span>dataset</span><span>.</span><span>key</span><span>;</span></div></div><div><div><div>267</div></div><div><span>            </span><span>if</span><span><span> (</span><span>new_key</span><span> </span></span><span>===</span><span> </span><span>'c'</span><span> </span><span>||</span><span><span> </span><span>new_key</span><span> </span></span><span>===</span><span> </span><span>'m'</span><span>) {</span></div></div><div><div><div>268</div></div><div><span>                </span><span>let</span><span><span> </span><span>customUrl</span><span> </span></span><span>=</span><span> </span><span>prompt</span><span>(</span><span>'请修改自定义地址</span><span>\n</span><span>注：取消可能会清空(′⊙ω⊙`)'</span><span><span>, </span><span>safeStorage</span><span>.</span></span><span>getItem</span><span>(</span><span>'c'</span><span>) </span><span>||</span><span> </span><span>''</span><span>);</span></div></div><div><div><div>269</div></div><div><span><span>                </span></span><span>customUrl</span><span> </span><span>=</span><span><span> (</span><span>customUrl</span><span> </span></span><span>||</span><span> </span><span>''</span><span>).</span><span>trim</span><span>();</span></div></div><div><div><div>270</div></div><div><span>                </span><span>if</span><span> (</span><span>!</span><span><span>customUrl</span><span>) {</span></span></div></div><div><div><div>271</div></div><div><span><span>                    </span></span><span>new_key</span><span> </span><span>=</span><span> </span><span>'i'</span><span>;</span></div></div><div><div><div>272</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>273</div></div><div><span><span>                    </span></span><span>safeStorage</span><span>.</span><span>setItem</span><span>(</span><span>'c'</span><span><span>, </span><span>customUrl</span><span>);</span></span></div></div><div><div><div>274</div></div><div><span><span>                    </span></span><span>engines</span><span>.</span><span>c</span><span>.</span><span>url</span><span> </span><span>=</span><span><span> </span><span>customUrl</span><span>;</span></span></div></div><div><div><div>275</div></div><div><span><span>                    </span></span><span>new_key</span><span> </span><span>=</span><span> </span><span>'c'</span><span>;</span></div></div><div><div><div>276</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>277</div></div><div><span><span>                </span></span><span>select</span><span> </span><span>=</span><span><span> </span><span>new_key</span><span>;</span></span></div></div><div><div><div>278</div></div><div><span>                </span><span>renderEngines</span><span>();</span></div></div><div><div><div>279</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>280</div></div><div><span><span>            </span></span><span>safeStorage</span><span>.</span><span>setItem</span><span>(</span><span>'se'</span><span><span>, </span><span>new_key</span><span>);</span></span></div></div><div><div><div>281</div></div><div><span><span>            </span></span><span>select</span><span> </span><span>=</span><span><span> </span><span>new_key</span><span>;</span></span></div></div><div><div><div>282</div></div><div><span><span>            </span></span><span>switch_btn</span><span>.</span><span>textContent</span><span> </span><span>=</span><span><span> </span><span>engines</span><span>[</span><span>new_key</span><span>].</span></span><span>name</span><span>;</span></div></div><div><div><div>283</div></div><div><span>            </span><span>$$</span><span>(</span><span>'.switch_engine'</span><span><span>, </span><span>switch_window</span><span>).</span></span><span>forEach</span><span><span>(</span><span>el</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>284</div></div><div><span><span>                </span></span><span>el</span><span>.</span><span>classList</span><span>.</span><span>toggle</span><span>(</span><span>'active'</span><span><span>, </span><span>el</span><span>.</span></span><span>dataset</span><span>.</span><span>key</span><span> </span><span>===</span><span><span> </span><span>new_key</span><span>);</span></span></div></div><div><div><div>285</div></div><div><span><span>            </span></span><span>});</span></div></div><div><div><div>286</div></div><div><span><span>            </span></span><span>[</span><span>switch_btn</span><span>, </span><span>switch_window</span><span>].</span><span>forEach</span><span><span>(</span><span>el</span><span> </span></span><span>=&gt;</span><span><span> </span><span>el</span><span>.</span></span><span>classList</span><span>.</span><span>remove</span><span>(</span><span>'active'</span><span>));</span></div></div><div><div><div>287</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>288</div></div><div>
</div></div><div><div><div>289</div></div><div><span><span>        </span></span><span>document</span><span>.</span><span>addEventListener</span><span>(</span><span>'click'</span><span><span>, </span><span>e</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>290</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>switch_btn</span><span>.</span></span><span>contains</span><span><span>(</span><span>e</span><span>.</span></span><span>target</span><span>) </span><span>&amp;&amp;</span><span> </span><span>!</span><span><span>switch_window</span><span>.</span></span><span>contains</span><span><span>(</span><span>e</span><span>.</span></span><span>target</span><span>)) {</span></div></div><div><div><div>291</div></div><div><span><span>                </span></span><span>[</span><span>switch_btn</span><span>, </span><span>switch_window</span><span>].</span><span>forEach</span><span><span>(</span><span>el</span><span> </span></span><span>=&gt;</span><span><span> </span><span>el</span><span>.</span></span><span>classList</span><span>.</span><span>remove</span><span>(</span><span>'active'</span><span>));</span></div></div><div><div><div>292</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>293</div></div><div><span><span>        </span></span><span>}, { </span><span>passive</span><span>:</span><span> </span><span>true</span><span> });</span></div></div><div><div><div>294</div></div><div>
</div></div><div><div><div>295</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>296</div></div><div><span>        </span><span>// 3. 修复后的搜索逻辑</span></div></div><div><div><div>297</div></div><div><span>        </span><span>//    兼容 VIA 原搜索按钮/表单提交机制</span></div></div><div><div><div>298</div></div><div><span>        </span><span>// ==========================================</span></div></div><div><div><div>299</div></div><div><span>        </span><span>const</span><span> </span><span>originalSearch</span><span> </span><span>=</span><span> (</span><span>typeof</span><span><span> </span><span>window</span><span>.</span></span><span>search</span><span> </span><span>===</span><span> </span><span>'function'</span><span>) </span><span>?</span><span><span> </span><span>window</span><span>.</span></span><span>search</span><span>.</span><span>bind</span><span><span>(</span><span>window</span><span>) </span></span><span>:</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>300</div></div><div><span>        </span><span>const</span><span> </span><span>buildSearchValue</span><span> </span><span>=</span><span><span> (</span><span>engineUrl</span><span>, </span><span>inputVal</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>301</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>engineUrl</span><span>) </span></span><span>return</span><span><span> </span><span>inputVal</span><span>;</span></span></div></div><div><div><div>302</div></div><div><span>            </span><span>return</span><span> /%</span><span>[sS@]</span><span>/</span><span>.</span><span>test</span><span><span>(</span><span>engineUrl</span><span>)</span></span></div></div><div><div><div>303</div></div><div><span>                </span><span>?</span><span><span> </span><span>engineUrl</span><span>.</span></span><span>replace</span><span>(</span><span>/%</span><span>[sS@]</span><span>/</span><span>g</span><span><span>, </span><span>inputVal</span><span>)</span></span></div></div><div><div><div>304</div></div><div><span>                </span><span>:</span><span><span> </span><span>engineUrl</span><span> </span></span><span>+</span><span><span> </span><span>inputVal</span><span>;</span></span></div></div><div><div><div>305</div></div><div><span><span>        </span></span><span>};</span></div></div><div><div><div>306</div></div><div>
</div></div><div><div><div>307</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>search</span><span> </span><span>=</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>308</div></div><div><span>            </span><span>const</span><span> </span><span>input_val</span><span> </span><span>=</span><span><span> </span><span>search_input</span><span>.</span></span><span>value</span><span>.</span><span>trim</span><span>();</span></div></div><div><div><div>309</div></div><div><span>            </span><span>if</span><span> (</span><span>!</span><span><span>input_val</span><span>) </span></span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>310</div></div><div><span>            </span><span>const</span><span> </span><span>current</span><span> </span><span>=</span><span><span> </span><span>safeStorage</span><span>.</span></span><span>getItem</span><span>(</span><span>'se'</span><span>) </span><span>||</span><span> </span><span>'i'</span><span>;</span></div></div><div><div><div>311</div></div><div><span>            </span><span>const</span><span> </span><span>engine_url</span><span> </span><span>=</span><span><span> </span><span>current</span><span> </span></span><span>===</span><span> </span><span>'c'</span><span> </span><span>?</span><span><span> (</span><span>safeStorage</span><span>.</span></span><span>getItem</span><span>(</span><span>'c'</span><span>) </span><span>||</span><span> </span><span>''</span><span>) </span><span>:</span><span><span> (</span><span>engines</span><span>[</span><span>current</span><span>]?.</span></span><span>url</span><span> </span><span>||</span><span> </span><span>''</span><span>);</span></div></div><div><div><div>312</div></div><div><span>            </span><span>let</span><span><span> </span><span>finalValue</span><span> </span></span><span>=</span><span><span> </span><span>input_val</span><span>;</span></span></div></div><div><div><div>313</div></div><div>
</div></div><div><div><div>314</div></div><div><span>            </span><span>if</span><span><span> (</span><span>current</span><span> </span></span><span>!==</span><span> </span><span>'i'</span><span> </span><span>&amp;&amp;</span><span><span> </span><span>engine_url</span><span>) {</span></span></div></div><div><div><div>315</div></div><div><span><span>                </span></span><span>finalValue</span><span> </span><span>=</span><span> </span><span>buildSearchValue</span><span><span>(</span><span>engine_url</span><span>, </span><span>input_val</span><span>);</span></span></div></div><div><div><div>316</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>engine_url</span><span>) {</span></span></div></div><div><div><div>317</div></div><div><span><span>                </span></span><span>finalValue</span><span> </span><span>=</span><span><span> </span><span>engine_url</span><span> </span></span><span>+</span><span><span> </span><span>input_val</span><span>;</span></span></div></div><div><div><div>318</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>319</div></div><div>
</div></div><div><div><div>320</div></div><div><span><span>            </span></span><span>search_input</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>finalValue</span><span>;</span></span></div></div><div><div><div>321</div></div><div>
</div></div><div><div><div>322</div></div><div><span>            </span><span>if</span><span><span> (</span><span>originalSearch</span><span>) {</span></span></div></div><div><div><div>323</div></div><div><span>                </span><span>try</span><span> {</span></div></div><div><div><div>324</div></div><div><span>                    </span><span>return</span><span> </span><span>originalSearch</span><span>();</span></div></div><div><div><div>325</div></div><div><span><span>                </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>326</div></div><div><span><span>                    </span></span><span>console</span><span>.</span><span>warn</span><span>(</span><span>'原搜索函数调用失败，尝试表单提交'</span><span><span>, </span><span>e</span><span>);</span></span></div></div><div><div><div>327</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>328</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>329</div></div><div>
</div></div><div><div><div>330</div></div><div><span>            </span><span>const</span><span> </span><span>form</span><span> </span><span>=</span><span><span> </span><span>search_input</span><span>.</span></span><span>form</span><span>;</span></div></div><div><div><div>331</div></div><div><span>            </span><span>if</span><span><span> (</span><span>form</span><span>) {</span></span></div></div><div><div><div>332</div></div><div><span>                </span><span>if</span><span> (</span><span>typeof</span><span><span> </span><span>form</span><span>.</span></span><span>requestSubmit</span><span> </span><span>===</span><span> </span><span>'function'</span><span>) {</span></div></div><div><div><div>333</div></div><div><span><span>                    </span></span><span>form</span><span>.</span><span>requestSubmit</span><span>();</span></div></div><div><div><div>334</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>335</div></div><div><span><span>                    </span></span><span>form</span><span>.</span><span>submit</span><span>();</span></div></div><div><div><div>336</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>337</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>338</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>339</div></div><div><span><span>        </span></span><span>};</span></div></div><div><div><div>340</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>341</div></div><div><span>})();</span></div></div><div><div><div>342</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<p>自定义css：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>:root</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>/* 每行搜索引擎数量 */</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--engine_num</span><span>: </span><span>6</span><span>;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>/* 窗口最大高度 */</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--max_height</span><span>: </span><span><span>38</span><span>vh</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>body</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>background-position: </span><span>top</span><span> </span><span>center</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>background-size: </span><span><span>100</span><span>%</span></span><span><span> </span><span>auto</span><span>;</span></span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div><span>/* ============================ */</span></div></div><div><div><div>12</div></div><div><span>/* 全局挂件容器样式             */</span></div></div><div><div><div>13</div></div><div><span>/* ============================ */</span></div></div><div><div><div>14</div></div><div><span>#widget_wrapper</span><span> {</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>margin: </span><span>0</span><span><span> </span><span>auto</span><span> </span></span><span><span>15</span><span>px</span></span><span><span> </span><span>auto</span><span>;</span></span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>width: </span><span><span>85</span><span>%</span></span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>  </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div><div><div><div>20</div></div><div><span>/* 挂件通用动画 */</span></div></div><div><div><div>21</div></div><div><span>@keyframes</span><span><span> </span><span>poem-fade-in</span><span> {</span></span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>0% { opacity: </span><span>0</span><span>; transform: </span><span>translateY</span><span>(</span><span><span>-10</span><span>px</span></span><span>); }</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>100% { opacity: </span><span>1</span><span>; transform: </span><span>translateY</span><span>(</span><span>0</span><span>); }</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div><div><div><div>25</div></div><div><span>/* ============================ */</span></div></div><div><div><div>26</div></div><div><span>/* 形态 1/2: 诗词一言 UI 样式   */</span></div></div><div><div><div>27</div></div><div><span>/* ============================ */</span></div></div><div><div><div>28</div></div><div><span>#poem_container</span><span> {</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>color: </span><span>#</span><span>ffffff</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>  </span></span><span>font-family: </span><span>"PingFang SC Round"</span><span>, </span><span>"Yuanti SC"</span><span>, </span><span>"YouYuan"</span><span>, </span><span>"Microsoft YaHei UI Rounded"</span><span>, </span><span>sans-serif</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>  </span></span><span>text-shadow: </span><span><span>1</span><span>px</span></span><span> </span><span><span>1</span><span>px</span></span><span> </span><span><span>4</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.4</span><span>);</span></div></div><div><div><div>32</div></div><div><span><span>  </span></span><span>animation: poem-fade-in </span><span><span>1</span><span>s</span></span><span><span> </span><span>ease-out</span><span>;</span></span></div></div><div><div><div>33</div></div><div><span>}</span></div></div><div><div><div>34</div></div><div><span>#poem_sentence</span><span> {</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>  </span></span><span>font-weight: </span><span>560</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>  </span></span><span>letter-spacing: </span><span><span>1</span><span>px</span></span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>  </span></span><span>margin-bottom: </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>  </span></span><span>line-height: </span><span>1.4</span><span>;</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div><div><div><div>41</div></div><div><span>#poem_info</span><span> {</span></div></div><div><div><div>42</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>13</span><span>px</span></span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>  </span></span><span>font-weight: </span><span>400</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>  </span></span><span>opacity: </span><span>0.85</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>  </span></span><span>letter-spacing: </span><span><span>0.5</span><span>px</span></span><span>;</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div><div><div><div>47</div></div><div><span>/* ============================ */</span></div></div><div><div><div>48</div></div><div><span>/* 形态 3: 翻页钟 UI 样式       */</span></div></div><div><div><div>49</div></div><div><span>/* ============================ */</span></div></div><div><div><div>50</div></div><div><span>.clock-container</span><span> {</span></div></div><div><div><div>51</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>15</span><span>px</span></span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>  </span></span><span>align-items: </span><span>center</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>  </span></span><span>gap: </span><span><span>8</span><span>px</span></span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>  </span></span><span>animation: poem-fade-in </span><span><span>1</span><span>s</span></span><span><span> </span><span>ease-out</span><span>;</span></span></div></div><div><div><div>55</div></div><div><span>}</span></div></div><div><div><div>56</div></div><div><span>.unit-group</span><span> {</span></div></div><div><div><div>57</div></div><div><span><span>  </span></span><span>display: </span><span>flex</span><span>;</span></div></div><div><div><div>58</div></div><div><span><span>  </span></span><span>gap: </span><span><span>3</span><span>px</span></span><span>;</span></div></div><div><div><div>59</div></div><div><span>}</span></div></div><div><div><div>60</div></div><div><span>.flip-card</span><span> {</span></div></div><div><div><div>61</div></div><div><span><span>  </span></span><span>position: </span><span>relative</span><span>;</span></div></div><div><div><div>62</div></div><div><span><span>  </span></span><span>width: </span><span><span>36</span><span>px</span></span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>  </span></span><span>height: </span><span><span>54</span><span>px</span></span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>  </span></span><span>line-height: </span><span><span>54</span><span>px</span></span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>  </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>40</span><span>, </span><span>40</span><span>, </span><span>40</span><span>, </span><span>0.7</span><span>);</span></div></div><div><div><div>66</div></div><div><span><span>  </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>5</span><span>px</span></span><span>);</span></div></div><div><div><div>67</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>68</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>32</span><span>px</span></span><span>;</span></div></div><div><div><div>69</div></div><div><span><span>  </span></span><span>font-weight: </span><span>bold</span><span>;</span></div></div><div><div><div>70</div></div><div><span><span>  </span></span><span>color: </span><span>#</span><span>fff</span><span>;</span></div></div><div><div><div>71</div></div><div><span><span>  </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>  </span></span><span>font-family: </span><span>sans-serif</span><span>;</span></div></div><div><div><div>73</div></div><div><span><span>  </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0.3</span><span>);</span></div></div><div><div><div>74</div></div><div><span>}</span></div></div><div><div><div>75</div></div><div><span><span>.flip-card</span><span>::after</span></span><span> {</span></div></div><div><div><div>76</div></div><div><span><span>  </span></span><span>content: </span><span>""</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>  </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>78</div></div><div><span><span>  </span></span><span>top: </span><span><span>50</span><span>%</span></span><span>;</span></div></div><div><div><div>79</div></div><div><span><span>  </span></span><span>left: </span><span>0</span><span>;</span></div></div><div><div><div>80</div></div><div><span><span>  </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>81</div></div><div><span><span>  </span></span><span>height: </span><span><span>1</span><span>px</span></span><span>;</span></div></div><div><div><div>82</div></div><div><span><span>  </span></span><span>background: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.5</span><span>);</span></div></div><div><div><div>83</div></div><div><span><span>  </span></span><span>z-index: </span><span>5</span><span>;</span></div></div><div><div><div>84</div></div><div><span>}</span></div></div><div><div><div>85</div></div><div><span>.separator</span><span> {</span></div></div><div><div><div>86</div></div><div><span><span>  </span></span><span>color: </span><span>#</span><span>fff</span><span>;</span></div></div><div><div><div>87</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>24</span><span>px</span></span><span>;</span></div></div><div><div><div>88</div></div><div><span><span>  </span></span><span>font-weight: </span><span>bold</span><span>;</span></div></div><div><div><div>89</div></div><div><span><span>  </span></span><span>padding-bottom: </span><span><span>5</span><span>px</span></span><span>;</span></div></div><div><div><div>90</div></div><div><span><span>  </span></span><span>text-shadow: </span><span>0</span><span> </span><span><span>2</span><span>px</span></span><span> </span><span><span>4</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0.5</span><span>);</span></div></div><div><div><div>91</div></div><div><span>}</span></div></div><div><div><div>92</div></div><div><span>.animate</span><span> {</span></div></div><div><div><div>93</div></div><div><span><span>  </span></span><span>animation: </span><span>flip</span><span> </span><span><span>0.3</span><span>s</span></span><span><span> </span><span>ease-in-out</span><span>;</span></span></div></div><div><div><div>94</div></div><div><span>}</span></div></div><div><div><div>95</div></div><div><span>@keyframes</span><span><span> </span><span>flip</span><span> {</span></span></div></div><div><div><div>96</div></div><div><span><span>  </span></span><span>0% { transform: </span><span>scaleY</span><span>(</span><span>1</span><span>); }</span></div></div><div><div><div>97</div></div><div><span><span>  </span></span><span>50% { transform: </span><span>scaleY</span><span>(</span><span>0.4</span><span>); opacity: </span><span>0.8</span><span>; }</span></div></div><div><div><div>98</div></div><div><span><span>  </span></span><span>100% { transform: </span><span>scaleY</span><span>(</span><span>1</span><span>); }</span></div></div><div><div><div>99</div></div><div><span>}</span></div></div><div><div><div>100</div></div><div><span>/* ============================ */</span></div></div><div><div><div>101</div></div><div><span>/* 搜索引擎切换按钮及弹窗样式   */</span></div></div><div><div><div>102</div></div><div><span>/* ============================ */</span></div></div><div><div><div>103</div></div><div><span>#switch_btn</span><span><span>,</span><span> </span></span><span>#switch_window</span><span> {</span></div></div><div><div><div>104</div></div><div><span><span>  </span></span><span>outline: </span><span>0</span><span>;</span></div></div><div><div><div>105</div></div><div><span><span>  </span></span><span>background: </span><span>rgba</span><span>(</span><span>255</span><span>,</span><span>255</span><span>,</span><span>255</span><span>,</span><span>.15</span><span>);</span></div></div><div><div><div>106</div></div><div><span><span>  </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>);</span></div></div><div><div><div>107</div></div><div><span><span>  </span></span><span>user-select: </span><span>none</span><span>;</span></div></div><div><div><div>108</div></div><div><span>}</span></div></div><div><div><div>109</div></div><div><span>#switch_btn</span><span><span>,</span><span> </span></span><span>.switch_engine</span><span> {</span></div></div><div><div><div>110</div></div><div><span><span>  </span></span><span>width: </span><span>auto</span><span>;</span></div></div><div><div><div>111</div></div><div><span><span>  </span></span><span>white-space: </span><span>nowrap</span><span>;</span></div></div><div><div><div>112</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>12</span><span>px</span></span><span>;</span></div></div><div><div><div>113</div></div><div><span>}</span></div></div><div><div><div>114</div></div><div><span>#switch_btn</span><span> {</span></div></div><div><div><div>115</div></div><div><span><span>  </span></span><span>margin: </span><span><span>5</span><span>px</span></span><span> </span><span><span>-2</span><span>px</span></span><span> </span><span><span>5</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>116</div></div><div><span><span>  </span></span><span>padding: </span><span><span>8</span><span>px</span></span><span> </span><span><span>10</span><span>px</span></span><span>;</span></div></div><div><div><div>117</div></div><div><span><span>  </span></span><span>height: </span><span><span>36</span><span>px</span></span><span>;</span></div></div><div><div><div>118</div></div><div><span><span>  </span></span><span>border: </span><span>0</span><span>;</span></div></div><div><div><div>119</div></div><div><span><span>  </span></span><span>align-items: </span><span>center</span><span>;</span></div></div><div><div><div>120</div></div><div><span><span>  </span></span><span>display: </span><span>flex</span><span>;</span></div></div><div><div><div>121</div></div><div><span><span>  </span></span><span>float: </span><span>left</span><span>;</span></div></div><div><div><div>122</div></div><div><span>}</span></div></div><div><div><div>123</div></div><div><span>#switch_btn</span><span>::after</span><span> {</span></div></div><div><div><div>124</div></div><div><span><span>  </span></span><span>content: </span><span>"▼"</span><span>;</span></div></div><div><div><div>125</div></div><div><span><span>  </span></span><span>transition: </span><span><span>.3</span><span>s</span></span><span>;</span></div></div><div><div><div>126</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>127</div></div><div><span><span>  </span></span><span>margin-left: </span><span><span>2</span><span>px</span></span><span>;</span></div></div><div><div><div>128</div></div><div><span>}</span></div></div><div><div><div>129</div></div><div><span>#switch_btn</span><span><span>.active</span><span>::after</span></span><span> {</span></div></div><div><div><div>130</div></div><div><span><span>  </span></span><span>rotate: </span><span><span>180</span><span>deg</span></span><span>;</span></div></div><div><div><div>131</div></div><div><span>}</span></div></div><div><div><div>132</div></div><div><span>#switch_window</span><span> {</span></div></div><div><div><div>133</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span>repeat</span><span>(</span><span>var</span><span>(</span><span>--engine_num</span><span><span>), </span><span>auto</span><span>);</span></span></div></div><div><div><div>134</div></div><div><span><span>  </span></span><span>border: </span><span><span>1</span><span>px</span></span><span><span> </span><span>solid</span><span> </span></span><span>rgba</span><span>(</span><span>255</span><span>,</span><span>255</span><span>,</span><span>255</span><span>,</span><span>.2</span><span>);</span></div></div><div><div><div>135</div></div><div><span><span>  </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>136</div></div><div><span><span>  </span></span><span>padding: </span><span><span>4</span><span>px</span></span><span>;</span></div></div><div><div><div>137</div></div><div><span><span>  </span></span><span>gap: </span><span><span>4</span><span>px</span></span><span>;</span></div></div><div><div><div>138</div></div><div><span><span>  </span></span><span>opacity: </span><span>0</span><span>;</span></div></div><div><div><div>139</div></div><div><span><span>  </span></span><span>visibility: </span><span>hidden</span><span>;</span></div></div><div><div><div>140</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>141</div></div><div><span><span>  </span></span><span>z-index: </span><span>9999</span><span>;</span></div></div><div><div><div>142</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>8</span><span>px</span></span><span>;</span></div></div><div><div><div>143</div></div><div><span><span>  </span></span><span>pointer-events: </span><span>none</span><span>;</span></div></div><div><div><div>144</div></div><div><span><span>  </span></span><span>overflow-y: </span><span>auto</span><span>;</span></div></div><div><div><div>145</div></div><div><span><span>  </span></span><span>max-height: </span><span>0</span><span>;</span></div></div><div><div><div>146</div></div><div><span><span>  </span></span><span>transition: </span><span><span>.3</span><span>s</span></span><span>;</span></div></div><div><div><div>147</div></div><div><span><span>  </span></span><span>box-sizing: </span><span>border-box</span><span>;</span></div></div><div><div><div>148</div></div><div><span>}</span></div></div><div><div><div>149</div></div><div><span>#switch_window</span><span>.active</span><span> {</span></div></div><div><div><div>150</div></div><div><span><span>  </span></span><span>max-height: </span><span>var</span><span>(</span><span>--max_height</span><span>);</span></div></div><div><div><div>151</div></div><div><span><span>  </span></span><span>visibility: </span><span>visible</span><span>;</span></div></div><div><div><div>152</div></div><div><span><span>  </span></span><span>opacity: </span><span>1</span><span>;</span></div></div><div><div><div>153</div></div><div><span><span>  </span></span><span>pointer-events: </span><span>auto</span><span>;</span></div></div><div><div><div>154</div></div><div><span><span>  </span></span><span>transition: </span><span><span>.3</span><span>s</span></span><span>;</span></div></div><div><div><div>155</div></div><div><span>}</span></div></div><div><div><div>156</div></div><div><span>.switch_engine</span><span> {</span></div></div><div><div><div>157</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>158</div></div><div><span><span>  </span></span><span>height: </span><span>auto</span><span>;</span></div></div><div><div><div>159</div></div><div><span><span>  </span></span><span>transition: </span><span><span>.2</span><span>s</span></span><span>;</span></div></div><div><div><div>160</div></div><div><span><span>  </span></span><span>padding: </span><span><span>5</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span>;</span></div></div><div><div><div>161</div></div><div><span>}</span></div></div><div><div><div>162</div></div><div><span>.switch_engine.active</span><span> {</span></div></div><div><div><div>163</div></div><div><span><span>  </span></span><span>background: </span><span>rgba</span><span>(</span><span>22</span><span>,</span><span>93</span><span>,</span><span>255</span><span>,</span><span>.3</span><span>);</span></div></div><div><div><div>164</div></div><div><span><span>  </span></span><span>color: </span><span>#</span><span>fff</span><span>;</span></div></div><div><div><div>165</div></div><div><span><span>  </span></span><span>font-weight: </span><span>500</span><span>;</span></div></div><div><div><div>166</div></div><div><span>}</span></div></div><div><div><div>167</div></div><div><span>/* ============================ */</span></div></div><div><div><div>168</div></div><div><span>/* 主页搜索框及其他布局样式     */</span></div></div><div><div><div>169</div></div><div><span>/* ============================ */</span></div></div><div><div><div>170</div></div><div><span>#content</span><span> {</span></div></div><div><div><div>171</div></div><div><span><span>  </span></span><span>position: </span><span>fixed</span><span>;</span></div></div><div><div><div>172</div></div><div><span><span>  </span></span><span>top: </span><span><span>20</span><span>vh</span></span><span>;</span></div></div><div><div><div>173</div></div><div><span><span>  </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>174</div></div><div><span>}</span></div></div><div><div><div>175</div></div><div><span>#content</span><span> </span><span>.search_part</span><span> </span><span>.search_bar</span><span> {</span></div></div><div><div><div>176</div></div><div><span><span>  </span></span><span>box-shadow: </span><span>0</span><span> </span><span>0</span><span> </span><span><span>5</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>70</span><span>,</span><span>70</span><span>,</span><span>40</span><span>,</span><span>0.255</span><span>);</span></div></div><div><div><div>177</div></div><div><span><span>  </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>5</span><span>px</span></span><span>);</span></div></div><div><div><div>178</div></div><div><span><span>  </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>,</span><span>255</span><span>,</span><span>255</span><span>,</span><span>.100</span><span>);</span></div></div><div><div><div>179</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>15</span><span>px</span></span><span>;</span></div></div><div><div><div>180</div></div><div><span><span>  </span></span><span>display: </span><span>table</span><span>;</span></div></div><div><div><div>181</div></div><div><span><span>  </span></span><span>width: </span><span><span>85</span><span>%</span></span><span>;</span></div></div><div><div><div>182</div></div><div><span><span>  </span></span><span>height: </span><span><span>30</span><span>px</span></span><span>;</span></div></div><div><div><div>183</div></div><div><span><span>  </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>184</div></div><div><span><span>  </span></span><span>margin: </span><span><span>20</span><span>px</span></span><span><span> </span><span>auto</span><span>;</span></span></div></div><div><div><div>185</div></div><div><span><span>  </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>186</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>30</span><span>px</span></span><span>;</span></div></div><div><div><div>187</div></div><div><span><span>  </span></span><span>border: </span><span><span>1</span><span>px</span></span><span><span> </span><span>solid</span><span> </span><span>transparent</span><span>;</span></span></div></div><div><div><div>188</div></div><div><span><span>  </span></span><span>outline: </span><span>none</span><span>;</span></div></div><div><div><div>189</div></div><div><span><span>  </span></span><span>font-weight: </span><span>560</span><span>;</span></div></div><div><div><div>190</div></div><div><span><span>  </span></span><span>transition-duration: </span><span><span>0.2</span><span>s</span></span><span>;</span></div></div><div><div><div>191</div></div><div><span><span>  </span></span><span>animation: search-bar </span><span><span>1</span><span>s</span></span><span>;</span></div></div><div><div><div>192</div></div><div><span><span>  </span></span><span>box-sizing: </span><span>border-box</span><span>;</span></div></div><div><div><div>193</div></div><div><span>}</span></div></div><div><div><div>194</div></div><div><span>#content</span><span> </span><span>.search_part</span><span> </span><span>.search_bar</span><span> </span><span>span</span><span> {</span></div></div><div><div><div>195</div></div><div><span><span>  </span></span><span>padding: </span><span>0</span><span>;</span></div></div><div><div><div>196</div></div><div><span>}</span></div></div><div><div><div>197</div></div><div><span>#content</span><span> </span><span>.search_part</span><span> </span><span>.opSug_wpr</span><span>,</span></div></div><div><div><div>198</div></div><div><span>#content</span><span> </span><span>.search_part</span><span> </span><span>.bdSug_wpr</span><span> {</span></div></div><div><div><div>199</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>15</span><span>px</span></span><span> </span><span><span>15</span><span>px</span></span><span> </span><span><span>15</span><span>px</span></span><span> </span><span><span>15</span><span>px</span></span><span>;</span></div></div><div><div><div>200</div></div><div><span><span>  </span></span><span>border: </span><span>0</span><span><span> </span><span>none</span><span> </span></span><span>#</span><span>FFFFFF</span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>201</div></div><div><span><span>  </span></span><span>border-top: </span><span><span>10</span><span>px</span></span><span><span> </span><span>solid</span><span> </span><span>transparent</span><span> </span></span><span>!important</span><span>;</span></div></div><div><div><div>202</div></div><div><span><span>  </span></span><span>background: </span><span>rgba</span><span>(</span><span>255</span><span>,</span><span>255</span><span>,</span><span>255</span><span>,</span><span>0.2</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>203</div></div><div><span><span>  </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>5</span><span>px</span></span><span>);</span></div></div><div><div><div>204</div></div><div><span><span>  </span></span><span>width: </span><span><span>85</span><span>%</span></span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>205</div></div><div><span><span>  </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>206</div></div><div><span><span>  </span></span><span>margin: </span><span>0</span><span><span> </span><span>auto</span><span> </span></span><span>!important</span><span>;</span></div></div><div><div><div>207</div></div><div><span><span>  </span></span><span>left: </span><span>0</span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>208</div></div><div><span><span>  </span></span><span>right: </span><span>0</span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>209</div></div><div><span><span>  </span></span><span>transform: </span><span>none</span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>210</div></div><div><span><span>  </span></span><span>box-sizing: </span><span>border-box</span><span>;</span></div></div><div><div><div>211</div></div><div><span><span>  </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>212</div></div><div><span>}</span></div></div><div><div><div>213</div></div><div><span>@keyframes</span><span><span> </span><span>search-bar</span><span> {</span></span></div></div><div><div><div>214</div></div><div><span><span>  </span></span><span>0% { max-width: </span><span><span>100</span><span>px</span></span><span>; }</span></div></div><div><div><div>215</div></div><div><span><span>  </span></span><span>100% { max-width: </span><span><span>400</span><span>px</span></span><span>; }</span></div></div><div><div><div>216</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/nix-develop-%E5%85%A8%E9%9D%A2%E6%80%BB%E7%BB%93/</id>
      <title type="text">Nix Develop 总结</title>
      <published>2026-05-21T00:00:00.000Z</published>
      <updated>2026-05-21T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/nix-develop-%E5%85%A8%E9%9D%A2%E6%80%BB%E7%BB%93/"/>
      <summary type="text"> Nix Develop：nix 实用主义的胜利</summary>
      <content type="html"><![CDATA[<p><strong>Nix Develop 总结</strong></p>
<section><h3>1. 什么是 <code>nix develop</code>？<a href="#1-什么是-nix-develop"><span>#</span></a></h3><ul>
<li><code>nix develop</code> 是 Nix（尤其是 Flakes）提供的<strong>项目级临时开发环境</strong>命令。</li>
<li>核心基于 <code>pkgs.mkShell</code>（<code>stdenv.mkDerivation</code> 的包装器）。</li>
<li>它<strong>不构建可执行文件</strong>，而是动态构造一个干净的 Bash（或指定 Shell）环境，退出后环境自动消失。</li>
<li>配合 <code>flake.nix</code> 使用，实现<strong>声明式、可重现</strong>的开发环境。</li>
</ul><p><strong>一句话本质</strong>：Nix 为你的项目动态“组装”一个传统开发环境，让语言包管理器（npm/pnpm/pip/cargo 等）能愉快工作，同时保持 Nix 的纯净性和可重现性。</p></section>
<section><h3>2. 核心工作原理<a href="#2-核心工作原理"><span>#</span></a></h3><ol>
<li>
<p><strong>声明依赖</strong>（<code>buildInputs</code> / <code>nativeBuildInputs</code>）：</p>
<ul>
<li>Nix 会把指定的包从 <code>/nix/store</code> 拉出来（包括工具和系统库）。</li>
</ul>
</li>
<li>
<p><strong>自动注入环境变量</strong>（最关键）：</p>
<ul>
<li><code>PATH</code>：添加二进制工具。</li>
<li><code>PKG_CONFIG_PATH</code>、<code>CPATH</code>、<code>LIBRARY_PATH</code>、<code>LD_LIBRARY_PATH</code> 等：让编译器找到头文件和库。</li>
<li>各语言特定变量。</li>
</ul>
</li>
<li>
<p><strong>Setup Hooks</strong>：</p>
<ul>
<li>Nixpkgs 中的包自带钩子脚本，进入 Shell 时自动运行，完成环境配置。</li>
</ul>
</li>
<li>
<p><strong>shellHook</strong>（可选）：</p>
<ul>
<li>用户自定义脚本，进入环境时自动执行（如激活 venv、提示安装依赖）。</li>
</ul>
</li>
</ol><p><strong>结果</strong>：传统工具“以为”自己在普通 Linux 的 FHS 环境中，从而能直接使用。</p></section>
<section><h3>3. 与全局安装的对比<a href="#3-与全局安装的对比"><span>#</span></a></h3>

<table><thead><tr><th>维度</th><th><code>nix develop</code> (推荐开发)</th><th>全局安装 (<code>systemPackages</code>)</th></tr></thead><tbody><tr><td>范围</td><td>项目级、临时</td><td>系统级、永久</td></tr><tr><td>隔离性</td><td>极强</td><td>无</td></tr><tr><td>可重现性</td><td>极高（flake.nix）</td><td>较低</td></tr><tr><td>版本共存</td><td>容易（不同项目不同版本）</td><td>困难</td></tr><tr><td>系统库提供</td><td>自动（pkg-config、openssl 等）</td><td>需要手动补充</td></tr><tr><td>污染</td><td>几乎无</td><td>会污染全局</td></tr><tr><td>适用场景</td><td>项目开发</td><td>通用 CLI 工具</td></tr></tbody></table><p><strong>最佳实践</strong>：全局装少量通用工具 + 项目用 <code>nix develop</code>。</p></section>
<section><h3>4. 对语言包管理器的支持<a href="#4-对语言包管理器的支持"><span>#</span></a></h3><p><strong>能直接使用</strong>（项目本地依赖）：</p><ul>
<li><strong>Node.js</strong>：<code>npm install</code>、<code>pnpm install</code>、<code>yarn</code> → <code>./node_modules</code> 持久保存。</li>
<li><strong>Python</strong>：<code>pip install</code>（推荐在 venv 中）→ 虚拟环境持久保存。</li>
<li><strong>Rust</strong>：<code>cargo build</code>、<code>cargo install</code>（本地）。</li>
<li><strong>Go</strong>：<code>go mod tidy</code> 等，几乎零配置。</li>
<li><strong>PHP</strong> (composer)、<strong>Ruby</strong> (bundler) 等也基本可用。</li>
</ul><p><strong>全局安装（如 <code>-g</code>）</strong>：仍需配置用户目录 prefix，否则会失败（只读 store）。</p><p><strong>下次进入是否需要重新下载？</strong></p><ul>
<li><strong>不需要</strong>。依赖安装在项目目录（<code>node_modules</code>、<code>venv</code>、pnpm store 等），持久有效。</li>
<li>仅在删除目录、更新 lock 文件、切换工具版本时才需重新安装。</li>
</ul></section>
<section><h3>5. 如何解决系统库 / FHS 问题<a href="#5-如何解决系统库--fhs-问题"><span>#</span></a></h3><ul>
<li>传统问题：<code>openssl not found</code>、<code>zlib.h missing</code> 等。</li>
<li>Nix 方案：在 <code>buildInputs</code> 加入 <code>pkg-config</code>、<code>openssl</code>、<code>openssl.dev</code>、<code>zlib</code>、<code>libiconv</code> 等，自动通过环境变量解决。</li>
<li><strong>硬编码 FHS 二进制</strong>：
<ul>
<li>不算特别多，主要出现在预编译闭源工具、旧软件、部分 wheel。</li>
<li>解决方案：<code>nix-ld</code>（推荐）、<code>patchelf</code>、<code>buildFHSUserEnv</code>、<code>envfs</code>。</li>
</ul>
</li>
</ul></section>
<section><h3>6. 基础 flake.nix 示例<a href="#6-基础-flakenix-示例"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>description</span><span> = </span><span>"开发环境"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>inputs</span><span>.</span><span>nixpkgs</span><span>.</span><span>url</span><span> = </span><span>"github:NixOS/nixpkgs/nixos-unstable"</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>outputs</span><span><span> = { </span><span>self</span><span>, </span><span>nixpkgs</span><span> }:</span></span></div></div><div><div><div>7</div></div><div><span>    </span><span>let</span></div></div><div><div><div>8</div></div><div><span>      </span><span>system</span><span> = </span><span>"x86_64-linux"</span><span>;  </span><span># 改成你的系统</span></div></div><div><div><div>9</div></div><div><span>      </span><span>pkgs</span><span><span> = </span><span>nixpkgs</span><span>.</span><span>legacyPackages</span><span>.</span></span><span>${</span><span>system</span><span>}</span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>in</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>      </span><span>devShells</span><span>.</span><span>${</span><span>system</span><span>}</span><span>.</span><span>default</span><span><span> = </span><span>pkgs</span><span>.</span><span>mkShell</span><span> {</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>buildInputs</span><span> = </span><span>with</span><span><span> </span><span>pkgs</span><span>; [</span></span></div></div><div><div><div>14</div></div><div><span><span>          </span></span><span>nodejs_22</span></div></div><div><div><div>15</div></div><div><span><span>          </span></span><span>pnpm</span></div></div><div><div><div>16</div></div><div><span><span>          </span></span><span>python312</span></div></div><div><div><div>17</div></div><div><span><span>          </span></span><span>cargo</span></div></div><div><div><div>18</div></div><div><span><span>          </span></span><span>rustc</span></div></div><div><div><div>19</div></div><div><span><span>          </span></span><span>pkg-config</span></div></div><div><div><div>20</div></div><div><span><span>          </span></span><span>openssl</span></div></div><div><div><div>21</div></div><div><span><span>          </span></span><span>openssl</span><span>.</span><span>dev</span></div></div><div><div><div>22</div></div><div><span><span>          </span></span><span>zlib</span></div></div><div><div><div>23</div></div><div><span>          </span><span># ... 按需添加</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>];</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>shellHook</span><span> = </span><span>''</span></div></div><div><div><div>27</div></div><div><span><span>          </span></span><span>echo "🚀 环境已加载"</span></div></div><div><div><div>28</div></div><div><span><span>          </span></span><span># 可添加自动激活 venv 等</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>''</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>      </span></span><span>};</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>使用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nix</span><span> </span><span>develop</span><span>          </span><span># 进入</span></div></div><div><div><div>2</div></div><div><span># 或 nix develop .#default</span></div></div><div><div><div>3</div></div><div><span>exit</span><span>                 </span><span># 退出</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h3>7. 进阶增强<a href="#7-进阶增强"><span>#</span></a></h3><ul>
<li><strong>direnv</strong>：进入目录自动 <code>nix develop</code>（最丝滑）。</li>
<li><strong>AI/ML 项目</strong>：特别适合（CUDA 版本精确匹配、复杂 Python 依赖）。</li>
<li><strong>混合使用</strong>：全局装常用工具 + 项目 <code>nix develop</code> 微调。</li>
<li><strong>生产部署</strong>：仍推荐用 <code>buildNpmPackage</code>、<code>buildRustPackage</code> 等纯 Nix 打包。</li>
</ul></section>
<section><h3>8. 优点总结<a href="#8-优点总结"><span>#</span></a></h3><ul>
<li><strong>可重现性</strong>：别人拉代码 <code>nix develop</code> 即可。</li>
<li><strong>干净隔离</strong>：不污染系统，多版本共存。</li>
<li><strong>解决痛点</strong>：自动处理系统库，让原生包管理器好用。</li>
<li><strong>灵活</strong>：开发时混合使用，部署时纯 Nix。</li>
<li><strong>生态趋势</strong>：越来越多仓库自带 <code>flake.nix</code>，兼容性持续改善。</li>
</ul></section>
<section><h3>9. 注意事项 / 局限<a href="#9-注意事项--局限"><span>#</span></a></h3><ul>
<li>第一次进入可能稍慢（构建环境）。</li>
<li>极少数顽固二进制仍需 nix-ld 或 FHS 环境。</li>
<li>学习曲线：需要适应 flake 写法。</li>
<li>全局 <code>-g</code> 安装依然不友好（需配置 prefix）。</li>
</ul><p><strong>核心理念</strong>：<br />
Nix 不禁止用 <code>pip</code>/<code>npm</code>/<code>cargo</code>，而是<strong>提供更好的底层环境</strong>，让混合使用时体验更好。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/dae%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97/</id>
      <title type="text">dae配置</title>
      <published>2026-05-20T00:00:00.000Z</published>
      <updated>2026-05-20T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/dae%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97/"/>
      <summary type="text">Linux平台性能最强的代理软件——dae。</summary>
      <content type="html"><![CDATA[<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 完整配置参考 https://github.com/daeuniverse/dae/blob/main/example.dae</span></div></div><div><div><div>2</div></div><div><span>global {</span></div></div><div><div><div>3</div></div><div><span># 修改日志级别为 debug，方便调试</span></div></div><div><div><div>4</div></div><div><span>log_level: debug</span></div></div><div><div><div>5</div></div><div><span># lan 口绑定 eth0</span></div></div><div><div><div>6</div></div><div><span>#lan_interface: eth0</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>wan_interface: auto</span></div></div><div><div><div>9</div></div><div><span># 用强制 SNI 嗅探进行分流</span></div></div><div><div><div>10</div></div><div><span>dial_mode: domain</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># DNS 配置</span></div></div><div><div><div>14</div></div><div><span>dns {</span></div></div><div><div><div>15</div></div><div><span># ================== 基础设置 ==================</span></div></div><div><div><div>16</div></div><div><span># 优先使用 IPv4（如果你本地 IPv6 很稳定，也可以改回去测试）</span></div></div><div><div><div>17</div></div><div><span>ipversion_prefer: 4</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 如果你要给局域网设备使用，可改成你的内网地址，如 '192.168.1.2:53'</span></div></div><div><div><div>20</div></div><div><span>bind: '0.0.0.0:53'</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># ================== 上游 DNS ==================</span></div></div><div><div><div>23</div></div><div><span>upstream {</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span># ---------- 国内上游（主用 + 备用） ----------</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span># 阿里 DNS</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>alidns_udp: 'udp://223.5.5.5:53'</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>alidns_tcp: 'tcp://223.5.5.5:53'</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>alidns_dot: 'tls://223.5.5.5:853'</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>alidns_doh: 'https://223.5.5.5:443'</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>    </span></span><span># 腾讯 DNSPod</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>dnspod_udp: 'udp://119.29.29.29:53'</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>dnspod_tcp: 'tcp://119.29.29.29:53'</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>dnspod_dot: 'tls://119.29.29.29:853'</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>dnspod_doh: 'https://119.29.29.29:443'</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span><span>    </span></span><span># ---------- 海外上游（加密为主） ----------</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>cf_doh: 'https://cloudflare-dns.com/dns-query'</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>cf_dot: 'tls://one.one.one.one:853'</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>google_doh: 'https://dns.google/dns-query'</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>google_dot: 'tls://dns.google:853'</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>quad9_doh: 'https://dns.quad9.net/dns-query'</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>quad9_dot: 'tls://dns.quad9.net:853'</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>    </span></span><span># （可选）内网 DNS（如启用 AdGuard Home / 路由器 DNS）</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span># adguard: 'udp://10.0.0.1:53'</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span># ================== 路由策略 ==================</span></div></div><div><div><div>52</div></div><div><span>routing {</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span># ---------- 请求路由 ----------</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>request {</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span># 内网域名（按需启用）</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span># qname(suffix:local, suffix:lan, suffix:home.arpa) -&gt; dnspod_tcp</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span><span>        </span></span><span># PTR 反向解析：优先国内 TCP</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>qtype(PTR) -&gt; alidns_tcp</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span><span>        </span></span><span># 国内域名优先阿里 DoH，失败/不可用时交给后面的 fallback</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>qname(geosite:cn) -&gt; alidns_doh</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span><span>        </span></span><span># 其他域名优先走 Cloudflare DoH</span></div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>fallback: cf_doh</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span><span>    </span></span><span># ---------- 响应路由 ----------</span></div></div><div><div><div>69</div></div><div><span><span>    </span></span><span>response {</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span># ===== 国外域名：疑似污染检测 =====</span></div></div><div><div><div>71</div></div><div><span><span>        </span></span><span># 非国内域名返回私网地址，认为可疑，尝试切换到其他海外上游</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>!qname(geosite:cn) &amp;&amp; ip(geoip:private) &amp;&amp; upstream(cf_doh, cf_dot) -&gt; google_doh</span></div></div><div><div><div>73</div></div><div><span><span>        </span></span><span>!qname(geosite:cn) &amp;&amp; ip(geoip:private) &amp;&amp; upstream(google_doh, google_dot) -&gt; quad9_doh</span></div></div><div><div><div>74</div></div><div>
</div></div><div><div><div>75</div></div><div><span><span>        </span></span><span># 海外域名：来自可信海外上游的结果直接接受</span></div></div><div><div><div>76</div></div><div><span><span>        </span></span><span>!qname(geosite:cn) &amp;&amp; upstream(cf_doh, cf_dot, google_doh, google_dot, quad9_doh, quad9_dot) -&gt; accept</span></div></div><div><div><div>77</div></div><div>
</div></div><div><div><div>78</div></div><div><span><span>        </span></span><span># ===== 国内域名：优先国内上游，必要时切换备用 =====</span></div></div><div><div><div>79</div></div><div><span><span>        </span></span><span># 国内域名若返回私网地址，尝试切换到腾讯 DNSPod</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>qname(geosite:cn) &amp;&amp; ip(geoip:private) &amp;&amp; upstream(alidns_doh, alidns_dot, alidns_tcp, alidns_udp) -&gt; dnspod_doh</span></div></div><div><div><div>81</div></div><div>
</div></div><div><div><div>82</div></div><div><span><span>        </span></span><span># 国内域名：来自国内上游的结果接受</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>qname(geosite:cn) &amp;&amp; upstream(</span></div></div><div><div><div>84</div></div><div><span><span>            </span></span><span>alidns_doh, alidns_dot, alidns_tcp, alidns_udp,</span></div></div><div><div><div>85</div></div><div><span><span>            </span></span><span>dnspod_doh, dnspod_dot, dnspod_tcp, dnspod_udp</span></div></div><div><div><div>86</div></div><div><span><span>        </span></span><span>) -&gt; accept</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span><span>        </span></span><span># 兜底：其余响应放行，避免无谓阻断</span></div></div><div><div><div>89</div></div><div><span><span>        </span></span><span>fallback: accept</span></div></div><div><div><div>90</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>91</div></div><div><span>}</span></div></div><div><div><div>92</div></div><div><span>}</span></div></div><div><div><div>93</div></div><div>
</div></div><div><div><div>94</div></div><div><span># 如果使用订阅地址，必须是符合 SIP008 格式或者 base64/urlencode 编码或者 txt 格式的节点列表，详细参考: https://blog.hellowood.dev/posts/dae-%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6%E7%9A%84%E9%85%8D%E7%BD%AE/</span></div></div><div><div><div>95</div></div><div>
</div></div><div><div><div>96</div></div><div><span># subscription 的节点解析过滤后作为 node，tag 是</span></div></div><div><div><div>97</div></div><div><span>subscription {</span></div></div><div><div><div>98</div></div><div><span>#sub_airport_1: 'https://订阅地址'</span></div></div><div><div><div>99</div></div><div><span>}</span></div></div><div><div><div>100</div></div><div>
</div></div><div><div><div>101</div></div><div><span># 自己搭建的节点，直接配置到 node 方便调试</span></div></div><div><div><div>102</div></div><div><span>node {</span></div></div><div><div><div>103</div></div><div><span># HTTPS/VMess/VLESS/Shadowsocks/Trojan/Tuic/Juicity/Hysteria2 等格式</span></div></div><div><div><div>104</div></div><div><span>}</span></div></div><div><div><div>105</div></div><div>
</div></div><div><div><div>106</div></div><div><span># 节点分组</span></div></div><div><div><div>107</div></div><div><span>group {</span></div></div><div><div><div>108</div></div><div><span># 分组一，名称是 proxy，用于 routing 选择</span></div></div><div><div><div>109</div></div><div><span># 没有过滤条件，使用所有节点</span></div></div><div><div><div>110</div></div><div><span>proxy {</span></div></div><div><div><div>111</div></div><div><span># 节点选择策略使用 最小移动平均延迟节点</span></div></div><div><div><div>112</div></div><div><span>policy: min_moving_avg</span></div></div><div><div><div>113</div></div><div><span>}</span></div></div><div><div><div>114</div></div><div>
</div></div><div><div><div>115</div></div><div><span># AI 分组，用于 claude 等对地区有限制的服务商</span></div></div><div><div><div>116</div></div><div><span>ai {</span></div></div><div><div><div>117</div></div><div><span># 从 subscription 的 sub_airport_1 中过滤名称包含新加坡的作为这个分组的可用节点</span></div></div><div><div><div>118</div></div><div><span>filter: subtag(sub_airport_1) &amp;&amp; name(keyword: '新加坡')</span></div></div><div><div><div>119</div></div><div><span># 节点选择策略使用 最小移动平均延迟节点</span></div></div><div><div><div>120</div></div><div><span>policy: min_moving_avg</span></div></div><div><div><div>121</div></div><div><span>}</span></div></div><div><div><div>122</div></div><div><span>}</span></div></div><div><div><div>123</div></div><div>
</div></div><div><div><div>124</div></div><div><span># 分流规则</span></div></div><div><div><div>125</div></div><div><span>routing {</span></div></div><div><div><div>126</div></div><div><span># 1. SSH 进程直连</span></div></div><div><div><div>127</div></div><div><span>pname(dropbear) -&gt; must_direct  # 只让 SSH 直连</span></div></div><div><div><div>128</div></div><div>
</div></div><div><div><div>129</div></div><div><span># 2. 禁用 HTTP/3 (QUIC) - 节省资源</span></div></div><div><div><div>130</div></div><div><span>l4proto(udp) &amp;&amp; dport(443) -&gt; block</span></div></div><div><div><div>131</div></div><div>
</div></div><div><div><div>132</div></div><div><span># 3. 多播、广播地址直连</span></div></div><div><div><div>133</div></div><div><span>dip(224.0.0.0/3, 'ff00::/8') -&gt; direct</span></div></div><div><div><div>134</div></div><div>
</div></div><div><div><div>135</div></div><div><span># 4. 内网地址直连</span></div></div><div><div><div>136</div></div><div><span>dip(geoip:private) -&gt; direct</span></div></div><div><div><div>137</div></div><div>
</div></div><div><div><div>138</div></div><div><span># 5. 中国 IP 直连</span></div></div><div><div><div>139</div></div><div><span>dip(geoip:cn) -&gt; direct</span></div></div><div><div><div>140</div></div><div>
</div></div><div><div><div>141</div></div><div><span># 6. 中国域名直连</span></div></div><div><div><div>142</div></div><div><span>domain(geosite:cn) -&gt; direct</span></div></div><div><div><div>143</div></div><div><span>domain(lanzoux.com) -&gt; direct</span></div></div><div><div><div>144</div></div><div><span>domain(acgrip.com) -&gt; direct</span></div></div><div><div><div>145</div></div><div><span>domain(chaoxing.com) -&gt; direct</span></div></div><div><div><div>146</div></div><div>
</div></div><div><div><div>147</div></div><div><span># 7. 广告域名拦截</span></div></div><div><div><div>148</div></div><div><span>domain(geosite:category-ads) -&gt; block</span></div></div><div><div><div>149</div></div><div>
</div></div><div><div><div>150</div></div><div><span># 8. 特定软件直连（按需取消注释）</span></div></div><div><div><div>151</div></div><div><span># pname(tsukimi) -&gt; direct</span></div></div><div><div><div>152</div></div><div>
</div></div><div><div><div>153</div></div><div><span># 9. 默认走代理</span></div></div><div><div><div>154</div></div><div><span>fallback: proxy</span></div></div><div><div><div>155</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E8%AE%A9%E4%BA%BA%E6%B2%89%E6%B5%B8%E4%BA%8E%E6%9F%90%E7%A7%8D%E6%83%85%E5%A2%83%E4%BA%A7%E7%94%9F%E5%AE%A1%E7%BE%8E%E6%84%89%E6%82%A6%E7%9A%84%E7%95%AA%E6%9C%80%E4%B8%BA%E9%9A%BE%E5%BE%97/</id>
      <title type="text">让人沉浸于某种情境，产生审美愉悦的番最为难得</title>
      <published>2026-05-16T00:00:00.000Z</published>
      <updated>2026-05-16T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E8%AE%A9%E4%BA%BA%E6%B2%89%E6%B5%B8%E4%BA%8E%E6%9F%90%E7%A7%8D%E6%83%85%E5%A2%83%E4%BA%A7%E7%94%9F%E5%AE%A1%E7%BE%8E%E6%84%89%E6%82%A6%E7%9A%84%E7%95%AA%E6%9C%80%E4%B8%BA%E9%9A%BE%E5%BE%97/"/>
      <summary type="text">有感而发。</summary>
      <content type="html"><![CDATA[<p>每当我完全沉浸于某部番通过画面台词演出音乐等所营造的某种情境时，那是我看番最为快乐的时光——外部世界无处不在的聒噪声隐去，纯粹被审美愉悦所支配的神性时刻，醺醺然看罢，不知今夕何夕</p>
<p>就像钥匙遇上了对的锁扣，一切都无比契合，完全合乎喜好，没遇到一点滞碍</p>
<p>印象中给我这种感觉的番有：秒速五厘米，你的名字（言叶之庭差点意思），千与千寻，龙猫，千年女优，伤物语，企鹅公路，冰菓，小圆，三月的狮子，四叠半……</p>
<p>此情可待成追忆，只是当时已惘然，好想再多体验一下这种感觉</p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E6%88%90%E9%95%BF%E6%98%AF%E4%B8%80%E4%B8%AA%E4%B8%8D%E6%96%AD%E8%A2%AB%E4%B8%96%E7%95%8C%E5%BC%BA%E5%A5%B8%E7%9A%84%E8%BF%87%E7%A8%8B/</id>
      <title type="text">成长是一个不断被世界强奸的过程</title>
      <published>2026-05-02T00:00:00.000Z</published>
      <updated>2026-05-02T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E6%88%90%E9%95%BF%E6%98%AF%E4%B8%80%E4%B8%AA%E4%B8%8D%E6%96%AD%E8%A2%AB%E4%B8%96%E7%95%8C%E5%BC%BA%E5%A5%B8%E7%9A%84%E8%BF%87%E7%A8%8B/"/>
      <summary type="text">一篇有关自我觉醒的随笔。</summary>
      <content type="html"><![CDATA[<p>成长是一个不断被外部世界无意中显露的冰山一角不断冲击认知，伴随着旧有观念或崩解或重塑的过程。这一过程是痛苦的，但同时也是走向成熟的必经之路。</p>
<p>在这一过程中，你的道德水准开始变得越来越松弛，你的思想开始不再预设一个合理性边界，曾经无论如何都无法接受的事物，开始变得稀松平常，曾经被视作离经叛道的思想，逐渐被默许其存在的合理性，曾经无比稳固的共识，终将褪去天然正确的外衣，曾经神圣而洁净的中心，最终失落于边缘的肮脏与混沌之中。现实终究是不断变化的，不可能有一种万世不易的思想能够将大千世界的一切事物都纳入到其理论体系中，唯有变化是永恒的。</p>
<p>最终你的认知将在暧昧了分野的世界中中走向动态平衡。</p>
<p>你将醒悟外部世界永远是你无法完全认知的黑箱，你无法把握它的过去，它的现在，乃至它的未来，你目之所及的只是它庞大到不可想象的疆域中微不足道的一小块区域，它的一切都是超出你掌握的极限的。</p>
<p>于是你开始寻求着这飘忽不定的混沌之海中的一叶扁舟，在一番寻觅无果后，无意间将目光瞄准了自我，醒悟只有明了来处，才能知晓去处，醒悟自我才是真正能够横渡苦海的渡世宝筏。在从更加高屋建瓴的角度审视自我后，你开始以自我为起点，重新整合过去几十年里学到的一切，不断去芜存菁后，初步建立起了一个稳固的自我认知迭代的核心逻辑。</p>
<p>在这个核心逻辑中，自我是新世界的坐标系原点，是世界的真正中心，其它的一切皆为外物，都是自我之下的奴仆。自此失落的中心被找回，演化与迭代成为了这个体系的根本特性，一切的变化终将被这种自我核心逻辑无害化，被整合、转化做成体系扩充的养料，废料则被无情地丢弃，确保体系永远和谐统一。</p>
<p>当你据此逻辑逐渐将生活中遇到的事物重新纳入自我的认知格式的疆界后，他人的毁誉不再拥有撼动这个体系的力量，外部世界的混沌将再也无法污浊重整的秩序，你将真正拥有平视乃至俯视整个世界的能力，而不是屈居世界之下，被呼来喝去，不得自由。</p>
<p>天上地下，为我独尊！我是一，也是万，我是万物的起源，也是万物的终结，我是世界的中心，也是无尽远方无尽梦想的化身。我就是我。</p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/libmkoption-%E5%AE%8C%E6%95%B4%E6%80%BB%E7%BB%93/</id>
      <title type="text">lib.mkOption 总结</title>
      <published>2026-04-09T00:00:00.000Z</published>
      <updated>2026-04-09T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/libmkoption-%E5%AE%8C%E6%95%B4%E6%80%BB%E7%BB%93/"/>
      <summary type="text">lib.mkOption 总结，包括核心作用、基本用法、常用类型、实际例子、对比表格等。</summary>
      <content type="html"><![CDATA[<section><h1><code>lib.mkOption</code> 完整总结<a href="#libmkoption-完整总结"><span>#</span></a></h1><section><h2>一、核心作用<a href="#一核心作用"><span>#</span></a></h2><p><code>lib.mkOption</code> 是 <strong>Nix 模块系统中定义配置选项的基础函数</strong>，用于创建可配置、可组合、类型安全的配置接口。</p><p><strong>本质</strong>：将”定义可配置内容”与”设置具体值”分离，实现声明式配置。</p></section><section><h2>二、基本用法<a href="#二基本用法"><span>#</span></a></h2><section><h3>语法结构<a href="#语法结构"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>options</span><span>.</span></span><span>选项名</span><span> </span><span>=</span><span><span> </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.&lt;</span></span><span>类型</span><span>&gt;;      </span><span># 数据类型（推荐）</span></div></div><div><div><div>3</div></div><div><span>  </span><span>default</span><span> = &lt;</span><span>默认值</span><span>&gt;;           </span><span># 默认值（可选）</span></div></div><div><div><div>4</div></div><div><span>  </span><span>description</span><span> = </span><span>"说明文字"</span><span>;     </span><span># 文档描述（推荐）</span></div></div><div><div><div>5</div></div><div><span>  </span><span>example</span><span> = &lt;</span><span>示例</span><span>&gt;;             </span><span># 使用示例（可选）</span></div></div><div><div><div>6</div></div><div><span>  </span><span>apply</span><span> = &lt;</span><span>转换函数</span><span>&gt;;           </span><span># 值处理函数（可选）</span></div></div><div><div><div>7</div></div><div><span>}</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>常用类型<a href="#常用类型"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 基础类型</span></div></div><div><div><div>2</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>bool</span><span>          </span></span><span># 布尔值</span></div></div><div><div><div>3</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>int</span><span>           </span></span><span># 整数</span></div></div><div><div><div>4</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>str</span><span>           </span></span><span># 字符串</span></div></div><div><div><div>5</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>path</span><span>          </span></span><span># 路径</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 容器类型</span></div></div><div><div><div>8</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>listOf</span><span> &lt;</span></span><span>类型</span><span>&gt;         </span><span># 列表</span></div></div><div><div><div>9</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>attrsOf</span><span> &lt;</span></span><span>类型</span><span>&gt;        </span><span># 属性集</span></div></div><div><div><div>10</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>nullOr</span><span> &lt;</span></span><span>类型</span><span>&gt;         </span><span># 可空类型</span></div></div><div><div><div>11</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>enum</span><span> [</span></span><span>值1,</span><span> </span><span>值2</span><span>]       </span><span># 枚举</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 复合类型</span></div></div><div><div><div>14</div></div><div><span><span>lib</span><span>.</span><span>types</span><span>.</span><span>submodule</span><span> { ... }     </span></span><span># 嵌套子模块</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>实际例子<a href="#实际例子"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>{ </span><span>lib</span><span>, </span><span>config</span><span>, ... }:</span></span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span># 定义选项</span></div></div><div><div><div>4</div></div><div><span>  </span><span>options</span><span>.</span><span>myService</span><span> = {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>enable</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>6</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>bool</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span>      </span><span>default</span><span> = </span><span>false</span><span>;</span></div></div><div><div><div>8</div></div><div><span>      </span><span>description</span><span> = </span><span>"是否启用服务"</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>port</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>12</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>int</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span>      </span><span>default</span><span> = </span><span>8080</span><span>;</span></div></div><div><div><div>14</div></div><div><span>      </span><span>description</span><span> = </span><span>"服务端口"</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>  </span><span># 使用选项值</span></div></div><div><div><div>19</div></div><div><span>  </span><span>config</span><span><span> = </span><span>lib</span><span>.</span><span>mkIf</span><span> </span><span>config</span><span>.</span><span>myService</span><span>.</span><span>enable</span><span> {</span></span></div></div><div><div><div>20</div></div><div><span>    </span><span>systemd</span><span>.</span><span>services</span><span>.</span><span>myService</span><span> = {</span></div></div><div><div><div>21</div></div><div><span>      </span><span>serviceConfig</span><span>.</span><span>ExecStart</span><span> =</span></div></div><div><div><div>22</div></div><div><span>        </span><span>"</span><span>${</span><span><span>pkgs</span><span>.</span><span>myapp</span></span><span>}</span><span>/bin/myapp --port </span><span>${</span><span>toString</span><span> </span><span><span>config</span><span>.</span><span>myService</span><span>.</span><span>port</span></span><span>}</span><span>"</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>三、优势对比<a href="#三优势对比"><span>#</span></a></h2><section><h3>对比表格<a href="#对比表格"><span>#</span></a></h3>

<table><thead><tr><th>维度</th><th>硬编码</th><th>lib.mkOption</th></tr></thead><tbody><tr><td><strong>可修改性</strong></td><td>❌ 值写死，难以修改</td><td>✅ 可在任何模块中覆盖</td></tr><tr><td><strong>类型安全</strong></td><td>❌ 无类型检查</td><td>✅ 构建时类型验证</td></tr><tr><td><strong>可复用性</strong></td><td>❌ 重复代码多</td><td>✅ 一处定义，到处引用</td></tr><tr><td><strong>文档化</strong></td><td>❌ 需手动维护文档</td><td>✅ 自动生成文档</td></tr><tr><td><strong>模块化</strong></td><td>❌ 紧耦合</td><td>✅ 松耦合，易组合</td></tr><tr><td><strong>条件配置</strong></td><td>🟡 需要大量 if-else</td><td>✅ 使用 <code>lib.mkIf</code> 优雅处理</td></tr><tr><td><strong>动态选择</strong></td><td>❌ 困难</td><td>✅ 通过 <code>config.xxx</code> 轻松实现</td></tr></tbody></table></section><section><h3>代码对比<a href="#代码对比"><span>#</span></a></h3><section><h4>❌ 硬编码方式<a href="#-硬编码方式"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span># 需要在每个地方重复</span></div></div><div><div><div>3</div></div><div><span>  </span><span>programs</span><span>.</span><span>git</span><span>.</span><span>userEmail</span><span> = </span><span>"zno233@outlook.com"</span><span>;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>services</span><span>.</span><span>email</span><span>.</span><span>account</span><span> = </span><span>"zno233@outlook.com"</span><span>;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>home</span><span>.</span><span>file</span><span>.</span><span>".signature"</span><span>.</span><span>text</span><span> = </span><span>"zno233@outlook.com"</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>  </span><span># 无法跨文件修改</span></div></div><div><div><div>8</div></div><div><span>  </span><span># 无类型检查</span></div></div><div><div><div>9</div></div><div><span>  </span><span># 无自动文档</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>✅ mkOption 方式<a href="#-mkoption-方式"><span>#</span></a></h4><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 定义模块</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span>options</span><span>.</span><span>userEmail</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>str</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span>    </span><span>default</span><span> = </span><span>"zno233@outlook.com"</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>description</span><span> = </span><span>"用户邮箱地址"</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 使用模块</span></div></div><div><div><div>11</div></div><div><span>{</span></div></div><div><div><div>12</div></div><div><span>  </span><span>programs</span><span>.</span><span>git</span><span>.</span><span>userEmail</span><span><span> = </span><span>config</span><span>.</span><span>userEmail</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span>  </span><span>services</span><span>.</span><span>email</span><span>.</span><span>account</span><span><span> = </span><span>config</span><span>.</span><span>userEmail</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>  </span><span>home</span><span>.</span><span>file</span><span>.</span><span>".signature"</span><span>.</span><span>text</span><span><span> = </span><span>config</span><span>.</span><span>userEmail</span><span>;</span></span></div></div><div><div><div>15</div></div><div><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 可以在任何地方覆盖</span></div></div><div><div><div>18</div></div><div><span>{ </span><span>userEmail</span><span> = </span><span>"alice@example.com"</span><span>; }</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section><section><h2>四、核心优势详解<a href="#四核心优势详解"><span>#</span></a></h2><section><h3>1. <strong>声明式接口</strong><a href="#1-声明式接口"><span>#</span></a></h3><ul>
<li>定义”可以配置什么”而不是”值是什么”</li>
<li>提供清晰的配置契约</li>
</ul></section><section><h3>2. <strong>跨模块配置</strong><a href="#2-跨模块配置"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># module-a.nix 定义</span></div></div><div><div><div>2</div></div><div><span><span>options</span><span>.</span><span>feature</span><span>.</span><span>enable</span><span> </span></span><span>=</span><span><span> </span><span>lib</span><span>.</span><span>mkOption</span><span> { ... }</span></span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># module-b.nix 使用</span></div></div><div><div><div>5</div></div><div><span><span>config</span><span> </span></span><span>=</span><span><span> </span><span>lib</span><span>.</span><span>mkIf</span><span> </span><span>config</span><span>.</span><span>feature</span><span>.</span><span>enable</span><span> { ... }</span></span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3. <strong>动态选择能力</strong><a href="#3-动态选择能力"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>options</span><span>.</span><span>profile</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>enum</span><span> [ </span></span><span>"work"</span><span> </span><span>"personal"</span><span> ];</span></div></div><div><div><div>4</div></div><div><span>    </span><span>default</span><span> = </span><span>"personal"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>  </span><span>config</span><span>.</span><span>programs</span><span>.</span><span>git</span><span>.</span><span>userEmail</span><span> =</span></div></div><div><div><div>8</div></div><div><span>    </span><span>if</span><span><span> </span><span>config</span><span>.</span><span>profile</span><span> == </span></span><span>"work"</span></div></div><div><div><div>9</div></div><div><span>    </span><span>then</span><span> </span><span>"work@company.com"</span></div></div><div><div><div>10</div></div><div><span>    </span><span>else</span><span> </span><span>"personal@example.com"</span><span>;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>4. <strong>类型安全保障</strong><a href="#4-类型安全保障"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>options</span><span>.</span><span>port</span><span> </span></span><span>=</span><span><span> </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>int</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>default</span><span> = </span><span>8080</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># ❌ 错误会在构建时被发现</span></div></div><div><div><div>7</div></div><div><span><span>config</span><span>.</span><span>port</span><span> </span></span><span>=</span><span> </span><span>"8080"</span><span>;</span><span>  </span><span># 类型错误！</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>五、最佳实践<a href="#五最佳实践"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>{ </span><span>lib</span><span>, </span><span>config</span><span>, ... }:</span></span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span>options</span><span>.</span><span>myApp</span><span> = {</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 1. 总是指定类型</span></div></div><div><div><div>5</div></div><div><span>    </span><span>enable</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>6</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>bool</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span>      </span><span>default</span><span> = </span><span>false</span><span>;</span></div></div><div><div><div>8</div></div><div><span>      </span><span>description</span><span> = </span><span>"启用应用"</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span># 2. 提供合理的默认值</span></div></div><div><div><div>12</div></div><div><span>    </span><span>dataDir</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>13</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>path</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>      </span><span>default</span><span> = </span><span>"/var/lib/myapp"</span><span>;</span></div></div><div><div><div>15</div></div><div><span>      </span><span>description</span><span> = </span><span>"数据目录"</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span># 3. 添加清晰的描述</span></div></div><div><div><div>19</div></div><div><span>    </span><span>port</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>20</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>int</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span>      </span><span>default</span><span> = </span><span>3000</span><span>;</span></div></div><div><div><div>22</div></div><div><span>      </span><span>description</span><span> = </span><span>"HTTP 监听端口"</span><span>;</span></div></div><div><div><div>23</div></div><div><span>      </span><span>example</span><span> = </span><span>8080</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span># 4. 使用 apply 进行值验证</span></div></div><div><div><div>27</div></div><div><span>    </span><span>maxConnections</span><span><span> = </span><span>lib</span><span>.</span><span>mkOption</span><span> {</span></span></div></div><div><div><div>28</div></div><div><span>      </span><span>type</span><span><span> = </span><span>lib</span><span>.</span><span>types</span><span>.</span><span>int</span><span>;</span></span></div></div><div><div><div>29</div></div><div><span>      </span><span>default</span><span> = </span><span>100</span><span>;</span></div></div><div><div><div>30</div></div><div><span>      </span><span>apply</span><span><span> = </span><span>n</span><span>:</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> </span><span>n</span><span> &lt; </span></span><span>1</span><span> </span><span>then</span><span> </span><span>throw</span><span> </span><span>"连接数必须大于 0"</span><span> </span><span>else</span><span><span> </span><span>n</span><span>;</span></span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>33</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>六、关键理念<a href="#六关键理念"><span>#</span></a></h2><blockquote><p><strong><code>lib.mkOption</code> 的本质是提供一个可配置的抽象层</strong>，使配置既灵活又安全。它不是”无法动态选择”，而是让动态配置变得更优雅、更可维护。</p></blockquote><p><strong>一句话总结</strong>：<code>lib.mkOption</code> 将配置从”硬编码的值”变成”可定制的接口”，这是 NixOS 模块系统实现强大组合能力的基石。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E4%B8%80%E5%88%87%E9%83%BD%E5%9C%A8%E5%A4%B1%E9%87%8D/</id>
      <title type="text">一切都在失重</title>
      <published>2026-02-07T00:00:00.000Z</published>
      <updated>2026-02-07T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E4%B8%80%E5%88%87%E9%83%BD%E5%9C%A8%E5%A4%B1%E9%87%8D/"/>
      <summary type="text">局外人</summary>
      <content type="html"><![CDATA[<p>当人们在日复一日的热搜中狂欢时，他们在为什么而欢呼？</p>
<p>说实话我一直都不太理解这种行为，明明连自己的生活过得一地鸡毛，为什么却更多地将自己的精力投入到无尽的互联网造神运动与抽象文化的狂欢中？</p>
<p>为什么他们总是看上去那么的精力旺盛，从不缺乏行动力，不管是与人对线，还是传播梗文化，总是充满斗志且乐此不疲。</p>
<p>是寻求认同感吗？是在为空洞的心寻找填充物吗？是将现实中的不满发泄到虚拟空间中吗？</p>
<p>无论如何，在我这种虚无主义者看来，他们那似乎永不枯竭的能量简直另一个世界的造物，所有的不合理仿佛都在严格按照某种超出我认知之外的逻辑运转。有时候想想还挺恐怖的，如此悬殊的表现，我们真的是同一物种的生物吗？</p>
<p>为什么你们还在燃烧，而我却像是一团早已熄灭的灰烬，早就丧失了热情与行动力。既没有生的快意，也没有死的决心，只是活着，单纯的活着。现实世界既无法在我的心湖中掀起涟漪，也不能赋予我某种能让我为之奋斗一生的目标，只有在白日的间隙中，我才能在虚拟世界中攫取到某种活着的实感，在各种虚拟作品为我构建的梦境中我才能忆起那早就失落在记忆中的余温，但这种时刻却又并非是永恒的，当舞台合上帷幕，演员离场，真空便会再一次将我包裹。</p>
<p>一切都在失重，那是我无法承受的生命之轻。</p>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/tlp%E8%B8%A9%E5%9D%91%E5%8F%8A%E6%9C%80%E7%BB%88%E9%85%8D%E7%BD%AE/</id>
      <title type="text">tlp踩坑及最终配置</title>
      <published>2025-12-06T00:00:00.000Z</published>
      <updated>2025-12-06T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/tlp%E8%B8%A9%E5%9D%91%E5%8F%8A%E6%9C%80%E7%BB%88%E9%85%8D%E7%BD%AE/"/>
      <summary type="text">在笔记本上折腾 tlp 配置的踩坑经历。</summary>
      <content type="html"><![CDATA[<p><strong>TLP 手册里写得太含糊了，实际行为和字面意思完全不一样！</strong></p>
<section><h3>真实行为：<a href="#真实行为"><span>#</span></a></h3>

<table><thead><tr><th>参数</th><th>字面意思</th><th>实际行为（i915 核显）</th></tr></thead><tbody><tr><td>INTEL_GPU_MIN_FREQ_ON_AC</td><td>最小频率</td><td>几乎没用，i915 驱动基本忽略它，最低频率还是会掉到 200~300MHz</td></tr><tr><td>INTEL_GPU_MAX_FREQ_ON_AC</td><td>最大频率</td><td>关键！这个值 = 你强行给核显设置的“频率上限”。只要这个值被写进去，核显就永远不会超过这个频率，但更重要的是：<strong>只要这个值被设置了，i915 驱动就进入“固定频率模式”，哪怕你什么都不干，它也会尽量往这个频率靠，导致空闲频率也居高不下！</strong></td></tr></tbody></table><p>也就是说：</p><ul>
<li>你写了 INTEL_GPU_MAX_FREQ_ON_AC = 1450，就等价于：<strong>“核显，给我一直跑 1400MHz 左右，别降频了！”</strong></li>
<li>你写了 INTEL_GPU_MAX_FREQ_ON_AC = 900，就变成：<strong>“核显，给我一直跑 850~900MHz 左右，别降了！”</strong></li>
</ul><hr /><p>根据 Linux 社区（尤其是 Arch Linux 论坛和 GitHub 上的 i915 驱动相关讨论）的广泛报告和经验，你的总结是<strong>真实的</strong>。</p><hr /></section>
<section><h2>为什么 <code>INTEL_GPU_MAX_FREQ_ON_AC</code> 会导致高空闲频率？<a href="#为什么-intel_gpu_max_freq_on_ac-会导致高空闲频率"><span>#</span></a></h2><p>这个问题涉及到 <strong>Linux i915 驱动</strong>处理 GPU 频率调节（也称为<strong>RC6 状态</strong>、<strong>渲染空闲状态</strong>和<strong>频率控制</strong>）的方式：</p><ol>
<li>
<section><h3>⚙️ i915 驱动的频率控制<a href="#️-i915-驱动的频率控制"><span>#</span></a></h3><ul>
<li>
<p>i915 驱动通常使用一个内核组件——<strong><code>intel_pstate</code></strong> 或者早期的 <strong><code>intel_cpufreq</code></strong> ——来管理 CPU 和集成 GPU 的频率。</p>
</li>
<li>
<p>在默认（自适应）模式下，驱动会根据当前的工作负载和功耗限制，动态地在 <strong>最小频率 (Min)</strong> 和 <strong>最大频率 (Max)</strong> 之间进行调节。当系统空闲时，驱动会积极地将频率降到最低（例如 200MHz 或 300MHz），以进入低功耗状态（RC6）。</p>
</li>
</ul></section>
</li>
<li>
<section><h3>⚠️ 设定最大频率的副作用<a href="#️-设定最大频率的副作用"><span>#</span></a></h3><ul>
<li>
<p>当你通过 TLP 或直接通过 <code>/sys</code> 文件系统（通常是 <code>/sys/class/drm/card0/gt_max_freq_mhz</code>）写入一个最大频率值时，你实际上是在给驱动程序设置了一个<strong>硬性上限</strong>。</p>
</li>
<li>
<p>然而，在某些版本的内核和驱动中，一旦你手动设置了最大频率，驱动程序的<strong>内部调频机制</strong>可能会切换到一个<strong>更激进或更不灵活的模式</strong>（有时被称为 <strong>“固定性能状态”</strong> 或 <strong>“限制模式”</strong>）。</p>
</li>
<li>
<p>在这种模式下，驱动可能不再积极地寻找最低频率或进入深度 RC6 状态，而是更倾向于在<strong>接近最大设置值</strong>（例如 <span><span>Max−100MHzMax - 100MHz</span><span><span><span></span><span>M</span><span>a</span><span>x</span><span></span><span>−</span><span></span></span><span><span></span><span>100</span><span>M</span><span>H</span><span>z</span></span></span></span> 到 <span><span>MaxMax</span><span><span><span></span><span>M</span><span>a</span><span>x</span></span></span></span>）的范围内波动，即使当前负载为零。</p>
</li>
<li>
<p><strong>核心原因推测：</strong> 驱动可能将用户设定的最大频率视为一个“性能期望”，认为用户不希望 GPU 降到太低的频率，以确保随时都能快速响应，从而牺牲了空闲功耗。</p>
</li>
</ul></section>
</li>
<li>
<section><h3>📉 <code>INTEL_GPU_MIN_FREQ_ON_AC</code> 几乎无效<a href="#-intel_gpu_min_freq_on_ac-几乎无效"><span>#</span></a></h3><ul>
<li>至于 <strong><code>INTEL_GPU_MIN_FREQ_ON_AC</code></strong>，它通常会被驱动忽略，因为驱动的默认行为就是在空闲时尽可能地降频到芯片支持的最低频率。如果你想提升最低频率，通常需要使用 <code>i915.enable_guc</code> 等内核参数来启用更高级的电源管理功能，或者直接修改内核的<strong>最小时钟寄存器</strong>，而 TLP 的这个配置项往往只对少数非常老的核显有效，或在特定配置下才有效。</li>
</ul></section>
</li>
</ol><hr /></section>
<section><h2>💡 结论和最佳实践<a href="#-结论和最佳实践"><span>#</span></a></h2>

<table><thead><tr><th><strong>参数</strong></th><th><strong>字面意思</strong></th><th><strong>社区实测/源码行为</strong></th></tr></thead><tbody><tr><td><strong><code>INTEL_GPU_MAX_FREQ_ON_AC</code></strong></td><td>设置频率上限</td><td><strong>关键</strong>：强制设置上限，并可能导致 i915 驱动进入**“高空闲频率模式”**。</td></tr><tr><td><strong><code>INTEL_GPU_MIN_FREQ_ON_AC</code></strong></td><td>设置频率下限</td><td>通常被忽略，驱动仍会降到最低原生频率（200-300MHz）。</td></tr></tbody></table><p>最佳实践：</p><p>如果你想要最好的功耗控制和低空闲温度，通常的建议是不要设置 INTEL_GPU_MAX_FREQ_ON_AC（即让 TLP 保持其默认或注释状态），让 i915 驱动完全自主控制频率。只有在你需要限制高性能游戏时的发热或功耗时，才将其设置为一个低于默认睿频的值。</p><p>目前的配置：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>tlp</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>enable</span><span> = </span><span>true</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>settings</span><span> = {</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 核心CPU能耗性能策略：</span></div></div><div><div><div>5</div></div><div><span>    </span><span>CPU_ENERGY_PERF_POLICY_ON_AC</span><span> = </span><span>"balance_performance"</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>CPU_ENERGY_PERF_POLICY_ON_BAT</span><span> = </span><span>"power"</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span># CPU 睿频 (Turbo Boost)：</span></div></div><div><div><div>9</div></div><div><span>    </span><span>CPU_BOOST_ON_AC</span><span> = </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>CPU_BOOST_ON_BAT</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span># 硬件 P-States 动态睿频：</span></div></div><div><div><div>13</div></div><div><span>    </span><span>CPU_HWP_DYN_BOOST_ON_AC</span><span> = </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span>CPU_HWP_DYN_BOOST_ON_BAT</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span># 平台电源配置文件（固件级）：</span></div></div><div><div><div>17</div></div><div><span>    </span><span>PLATFORM_PROFILE_ON_AC</span><span> = </span><span>"performance"</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>PLATFORM_PROFILE_ON_BAT</span><span> = </span><span>"low-power"</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span># PCIE (PCI Express) 主动状态电源管理 (ASPM)：</span></div></div><div><div><div>21</div></div><div><span>    </span><span>PCIE_ASPM_ON_AC</span><span> = </span><span>"default"</span><span>;</span></div></div><div><div><div>22</div></div><div><span>    </span><span>PCIE_ASPM_ON_BAT</span><span> = </span><span>"powersave"</span><span>;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span># 新增：CPU频率缩放Governor</span></div></div><div><div><div>25</div></div><div><span>    </span><span>CPU_SCALING_GOVERNOR_ON_AC</span><span> = </span><span>"powersave"</span><span>;</span></div></div><div><div><div>26</div></div><div><span>    </span><span>CPU_SCALING_GOVERNOR_ON_BAT</span><span> = </span><span>"powersave"</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span># 新增：CPU最小/最大性能百分比</span></div></div><div><div><div>29</div></div><div><span>    </span><span>CPU_MIN_PERF_ON_AC</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>30</div></div><div><span>    </span><span>CPU_MAX_PERF_ON_AC</span><span> = </span><span>100</span><span>;</span></div></div><div><div><div>31</div></div><div><span>    </span><span>CPU_MIN_PERF_ON_BAT</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div><span>    </span><span>CPU_MAX_PERF_ON_BAT</span><span> = </span><span>80</span><span>; </span><span># 根据需求调整</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span># 掉电保护：电池模式下加快数据刷盘</span></div></div><div><div><div>35</div></div><div><span>    </span><span>MAX_LOST_WORK_SECS_ON_BAT</span><span> = </span><span>15</span><span>;</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>    </span><span># NVIDIA独显电源管理</span></div></div><div><div><div>38</div></div><div><span>    </span><span>RUNTIME_PM_ON_AC</span><span> = </span><span>"auto"</span><span>;</span></div></div><div><div><div>39</div></div><div><span>    </span><span>RUNTIME_PM_ON_BAT</span><span> = </span><span>"auto"</span><span>;</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>    </span><span># USB、声音、WiFi优化</span></div></div><div><div><div>42</div></div><div><span>    </span><span>USB_AUTOSUSPEND</span><span> = </span><span>1</span><span>;</span></div></div><div><div><div>43</div></div><div><span>    </span><span>SOUND_POWER_SAVE_ON_AC</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>44</div></div><div><span>    </span><span>SOUND_POWER_SAVE_ON_BAT</span><span> = </span><span>1</span><span>;</span></div></div><div><div><div>45</div></div><div><span>    </span><span>WIFI_POWERSAVE_ON_AC</span><span> = </span><span>0</span><span>;</span></div></div><div><div><div>46</div></div><div><span>    </span><span>WIFI_POWERSAVE_ON_BAT</span><span> = </span><span>1</span><span>;</span></div></div><div><div><div>47</div></div><div><span>    </span><span># DEVICES_TO_DISABLE_ON_STARTUP = "bluetooth"; # 可选，禁用启动时设备</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>49</div></div><div><span><span>  </span></span><span>}</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/mpv/mpv%E9%85%8D%E7%BD%AE/</id>
      <title type="text">我的mpv配置</title>
      <published>2025-11-01T00:00:00.000Z</published>
      <updated>2025-11-01T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/mpv/mpv%E9%85%8D%E7%BD%AE/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>以下是我的mpv配置，参考了mpv-lazy和mpv-config的配置，并添加了一些自己的习惯。</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>### 行首如果存在注释符号 "#" 则说明该项 “未启用”</span></div></div><div><div><div>2</div></div><div><span>### 文档: https://github.com/hooke007/MPV_lazy/blob/main/portable_config/mpv.conf</span></div></div><div><div><div>3</div></div><div><span>### 注意：当前预设下，选项 --volume --glsl-shaders 的关联属性已被全局追踪记录，移除缓存文件 saved-props.json 才能使其的更改生效</span></div></div><div><div><div>4</div></div><div><span>##################</span></div></div><div><div><div>5</div></div><div><span># 0. 基础与初始化 #</span></div></div><div><div><div>6</div></div><div><span>##################</span></div></div><div><div><div>7</div></div><div><span>input-conf = "~~/input_uosc.conf"</span></div></div><div><div><div>8</div></div><div><span>include = "~~/profiles.conf"</span></div></div><div><div><div>9</div></div><div><span>#include = "~~/script-opts.conf"</span></div></div><div><div><div>10</div></div><div><span>#use-filedir-conf = yes</span></div></div><div><div><div>11</div></div><div><span>#log-file = "~~desktop/mpv-lazy.log"</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>##################</span></div></div><div><div><div>14</div></div><div><span># 1. 视频输出与硬件 #</span></div></div><div><div><div>15</div></div><div><span>##################</span></div></div><div><div><div>16</div></div><div><span>vo = gpu-next</span></div></div><div><div><div>17</div></div><div><span>gpu-context = waylandvk</span></div></div><div><div><div>18</div></div><div><span>gpu-api = vulkan</span></div></div><div><div><div>19</div></div><div><span>vulkan-async-transfer = yes</span></div></div><div><div><div>20</div></div><div><span>vulkan-async-compute = yes</span></div></div><div><div><div>21</div></div><div><span>#d3d11-exclusive-fs = yes</span></div></div><div><div><div>22</div></div><div><span>#d3d11-flip = yes</span></div></div><div><div><div>23</div></div><div><span>hwdec = vulkan,nvdec,no</span></div></div><div><div><div>24</div></div><div><span>hwdec-codecs = h264,hevc,vp8,vp9,av1</span></div></div><div><div><div>25</div></div><div><span>#d3d11-adapter = "NVIDIA GeForce RTX 2070 Super"</span></div></div><div><div><div>26</div></div><div><span>#vulkan-device = "NVIDIA GeForce RTX 2070 Super"</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>##################</span></div></div><div><div><div>29</div></div><div><span># 2. 播放行为与窗口 #</span></div></div><div><div><div>30</div></div><div><span>##################</span></div></div><div><div><div>31</div></div><div><span>title = ${?pause==yes:⏸}${?mute==yes:🔇}${?ontop==yes:📌}${?demuxer-via-network==yes:${media-title}}${?demuxer-via-network==no:${filename}}</span></div></div><div><div><div>32</div></div><div><span>idle = yes</span></div></div><div><div><div>33</div></div><div><span>input-ime = no</span></div></div><div><div><div>34</div></div><div><span>#input-ipc-server = mpvpipe</span></div></div><div><div><div>35</div></div><div><span>input-builtin-bindings = no</span></div></div><div><div><div>36</div></div><div><span>#pause = yes</span></div></div><div><div><div>37</div></div><div><span>hr-seek-framedrop = no</span></div></div><div><div><div>38</div></div><div><span>save-position-on-quit = yes</span></div></div><div><div><div>39</div></div><div><span>watch-later-options = start,vid,aid,sid</span></div></div><div><div><div>40</div></div><div><span>#autocreate-playlist = same</span></div></div><div><div><div>41</div></div><div><span>directory-mode = ignore</span></div></div><div><div><div>42</div></div><div><span>#directory-filter-types = video,audio</span></div></div><div><div><div>43</div></div><div><span>#video-exts = avi,flv,m2ts,mkv,mov,mp4,ts,wmv</span></div></div><div><div><div>44</div></div><div><span>#image-exts = avif,bmp,jpeg,jpg,jxl,png,webp</span></div></div><div><div><div>45</div></div><div><span>#audio-exts = aiff,ape,flac,mp3,ogg,opus,wav</span></div></div><div><div><div>46</div></div><div><span>keep-open = yes</span></div></div><div><div><div>47</div></div><div><span>#ontop = yes</span></div></div><div><div><div>48</div></div><div><span>#title-bar = no</span></div></div><div><div><div>49</div></div><div><span>autofit-smaller = 50%x50%</span></div></div><div><div><div>50</div></div><div><span>#autofit-larger = 70%x70%</span></div></div><div><div><div>51</div></div><div><span>keepaspect-window = yes</span></div></div><div><div><div>52</div></div><div><span>#auto-window-resize = no</span></div></div><div><div><div>53</div></div><div><span>hidpi-window-scale = no</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>##################</span></div></div><div><div><div>56</div></div><div><span># 3. 缓存与性能 #</span></div></div><div><div><div>57</div></div><div><span>##################</span></div></div><div><div><div>58</div></div><div><span>demuxer-max-bytes = 512MiB</span></div></div><div><div><div>59</div></div><div><span>demuxer-max-back-bytes = 256MiB</span></div></div><div><div><div>60</div></div><div><span>vd-lavc-dr = yes</span></div></div><div><div><div>61</div></div><div><span>#icc-cache = no</span></div></div><div><div><div>62</div></div><div><span>icc-cache-dir = "~~/_cache/icc"</span></div></div><div><div><div>63</div></div><div><span>#gpu-shader-cache = no</span></div></div><div><div><div>64</div></div><div><span>gpu-shader-cache-dir = "~~/_cache/shader"</span></div></div><div><div><div>65</div></div><div><span>watch-later-dir = "~~/_cache/watch_later"</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>##################</span></div></div><div><div><div>68</div></div><div><span># 4. OSD 界面显示 #</span></div></div><div><div><div>69</div></div><div><span>##################</span></div></div><div><div><div>70</div></div><div><span>#osd-bar=no</span></div></div><div><div><div>71</div></div><div><span>border = no</span></div></div><div><div><div>72</div></div><div><span>osd-on-seek = msg</span></div></div><div><div><div>73</div></div><div><span>#osd-blur = 1</span></div></div><div><div><div>74</div></div><div><span>osd-bar-w = 100</span></div></div><div><div><div>75</div></div><div><span>osd-bar-h = 1</span></div></div><div><div><div>76</div></div><div><span>osd-bar-align-y = -1</span></div></div><div><div><div>77</div></div><div><span>osd-font = "Noto Sans Mono Medium"</span></div></div><div><div><div>78</div></div><div><span>osd-font-size = 24</span></div></div><div><div><div>79</div></div><div><span>#osd-color = "#672168"</span></div></div><div><div><div>80</div></div><div><span>#osd-outline-color = "#EEEEEE"</span></div></div><div><div><div>81</div></div><div><span>osd-outline-size = 0.8</span></div></div><div><div><div>82</div></div><div><span>osd-fractions = yes</span></div></div><div><div><div>83</div></div><div><span>osd-playing-msg = "${filename}"</span></div></div><div><div><div>84</div></div><div><span>osd-duration = 2000</span></div></div><div><div><div>85</div></div><div><span>osd-playing-msg-duration = 3000</span></div></div><div><div><div>86</div></div><div><span>osd-status-msg = ${playback-time/full} / ${duration/full} (${percent-pos}%)\nframe: ${estimated-frame-number} / ${estimated-frame-count}</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>##################</span></div></div><div><div><div>89</div></div><div><span># 5. 音频设置 #</span></div></div><div><div><div>90</div></div><div><span>##################</span></div></div><div><div><div>91</div></div><div><span>ao = pipewire</span></div></div><div><div><div>92</div></div><div><span>#audio-device = "wasapi/{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"</span></div></div><div><div><div>93</div></div><div><span>#audio-exclusive = yes</span></div></div><div><div><div>94</div></div><div><span>#audio-spdif = ac3,dts</span></div></div><div><div><div>95</div></div><div><span>volume = 80</span></div></div><div><div><div>96</div></div><div><span>volume-max = 130</span></div></div><div><div><div>97</div></div><div><span>audio-channels = stereo</span></div></div><div><div><div>98</div></div><div><span>alang = jpn,eng,chs,sc,zh-cn,chi,zh,zh-tw,cht,zho,ze</span></div></div><div><div><div>99</div></div><div><span>audio-file-auto = fuzzy</span></div></div><div><div><div>100</div></div><div>
</div></div><div><div><div>101</div></div><div><span>##################</span></div></div><div><div><div>102</div></div><div><span># 6. 视频画质与同步 #</span></div></div><div><div><div>103</div></div><div><span>##################</span></div></div><div><div><div>104</div></div><div><span>video-sync = display-resample</span></div></div><div><div><div>105</div></div><div><span>#video-sync-max-video-change = 5</span></div></div><div><div><div>106</div></div><div><span>interpolation = yes</span></div></div><div><div><div>107</div></div><div><span>tscale = oversample</span></div></div><div><div><div>108</div></div><div><span># ===== 色彩管理 =====</span></div></div><div><div><div>109</div></div><div><span>icc-profile-auto = no</span></div></div><div><div><div>110</div></div><div><span>target-colorspace-hint = yes</span></div></div><div><div><div>111</div></div><div><span>#target-prim = display-p3</span></div></div><div><div><div>112</div></div><div><span>#target-trc = gamma2.2</span></div></div><div><div><div>113</div></div><div><span># ===== 缩放算法 =====</span></div></div><div><div><div>114</div></div><div><span>cscale = spline36</span></div></div><div><div><div>115</div></div><div><span>scale = spline36</span></div></div><div><div><div>116</div></div><div><span>dscale = mitchell</span></div></div><div><div><div>117</div></div><div><span>scale-antiring = 0.5</span></div></div><div><div><div>118</div></div><div><span>sigmoid-upscaling = yes</span></div></div><div><div><div>119</div></div><div><span>correct-downscaling = no</span></div></div><div><div><div>120</div></div><div><span># ===== 后处理 =====</span></div></div><div><div><div>121</div></div><div><span>dither-depth = no</span></div></div><div><div><div>122</div></div><div><span>#deband = yes</span></div></div><div><div><div>123</div></div><div><span>deinterlace = auto</span></div></div><div><div><div>124</div></div><div><span># ===== HDR 相关 =====</span></div></div><div><div><div>125</div></div><div><span>tone-mapping = hable</span></div></div><div><div><div>126</div></div><div><span>#gamut-mapping-mode = clip</span></div></div><div><div><div>127</div></div><div><span>hdr-peak-percentile = 99.99</span></div></div><div><div><div>128</div></div><div>
</div></div><div><div><div>129</div></div><div><span>##################</span></div></div><div><div><div>130</div></div><div><span># 7. 脚本、滤镜与着色器 #</span></div></div><div><div><div>131</div></div><div><span>##################</span></div></div><div><div><div>132</div></div><div><span>vf-append = format=gamma=gamma2.2</span></div></div><div><div><div>133</div></div><div><span>#load-stats-overlay = no</span></div></div><div><div><div>134</div></div><div><span>osc = no</span></div></div><div><div><div>135</div></div><div><span>ytdl-raw-options-append = cookies-from-browser=chrome</span></div></div><div><div><div>136</div></div><div><span>ytdl-raw-options-append = sub-langs=-danmaku</span></div></div><div><div><div>137</div></div><div><span>#load-scripts = no</span></div></div><div><div><div>138</div></div><div><span>#glsl-shaders-append = "~~/shaders/AMD_FSR_EASU_rgb_RT.glsl"</span></div></div><div><div><div>139</div></div><div>
</div></div><div><div><div>140</div></div><div><span>##################</span></div></div><div><div><div>141</div></div><div><span># 8. 字幕设置 #</span></div></div><div><div><div>142</div></div><div><span>##################</span></div></div><div><div><div>143</div></div><div><span># ===== 基础设置 =====</span></div></div><div><div><div>144</div></div><div><span>sub-auto = fuzzy</span></div></div><div><div><div>145</div></div><div><span>sub-file-paths = sub;subtitles</span></div></div><div><div><div>146</div></div><div><span>sub-codepage = GB18030</span></div></div><div><div><div>147</div></div><div><span>slang = chs,sc,zh-cn,chi,zh,zh-tw,cht,zho,ze</span></div></div><div><div><div>148</div></div><div><span>subs-fallback = yes</span></div></div><div><div><div>149</div></div><div><span># ===== 字体与渲染 =====</span></div></div><div><div><div>150</div></div><div><span>sub-font = "Noto Sans CJK SC Regular"</span></div></div><div><div><div>151</div></div><div><span>sub-font-size = 45</span></div></div><div><div><div>152</div></div><div><span>#sub-scale-with-window = no</span></div></div><div><div><div>153</div></div><div><span>sub-scale-signs = yes</span></div></div><div><div><div>154</div></div><div><span>sub-outline-size = 2</span></div></div><div><div><div>155</div></div><div><span>sub-outline-color = "#5d93b7"</span></div></div><div><div><div>156</div></div><div><span>sub-blur = 0</span></div></div><div><div><div>157</div></div><div><span>sub-color = "#ffffffff"</span></div></div><div><div><div>158</div></div><div><span>#sub-back-color = "#FFBF00"</span></div></div><div><div><div>159</div></div><div><span>#sub-shadow-offset = 2</span></div></div><div><div><div>160</div></div><div><span>sub-use-margins = yes</span></div></div><div><div><div>161</div></div><div><span># ===== ASS 样式覆盖 =====</span></div></div><div><div><div>162</div></div><div><span>sub-ass-override = no</span></div></div><div><div><div>163</div></div><div><span>sub-ass-style-overrides = Fontname="Noto Sans CJK SC Regular",Alignment=2,Fontsize=45,LineSpacing=0.8,Outline=1.2,Shadow=1,PrimaryColor=&amp;H00FFFFFF&amp;,SecondaryColor=&amp;H000000FF&amp;,OutlineColor=&amp;H000D0E73&amp;,BackColor=&amp;H000D0E73&amp;</span></div></div><div><div><div>164</div></div><div><span># ===== 高级选项与图形字幕 =====</span></div></div><div><div><div>165</div></div><div><span>sub-ass-force-margins = yes</span></div></div><div><div><div>166</div></div><div><span>#sub-ass-video-aspect-override = 16:9</span></div></div><div><div><div>167</div></div><div><span>#stretch-image-subs-to-screen = yes</span></div></div><div><div><div>168</div></div><div><span>#image-subs-video-resolution = yes</span></div></div><div><div><div>169</div></div><div><span>#image-subs-hdr-peak = sdr</span></div></div><div><div><div>170</div></div><div><span># ===== 图形字幕部分 —— IDX SUB SUP =====</span></div></div><div><div><div>171</div></div><div><span>stretch-image-subs-to-screen = no</span></div></div><div><div><div>172</div></div><div><span>image-subs-video-resolution = no</span></div></div><div><div><div>173</div></div><div>
</div></div><div><div><div>174</div></div><div><span>##################</span></div></div><div><div><div>175</div></div><div><span># 9. 截图设置 #</span></div></div><div><div><div>176</div></div><div><span>##################</span></div></div><div><div><div>177</div></div><div><span>screenshot-template = '~/Pictures/mpv/%tY-%tm-%td_%tH-%tM-%tS'</span></div></div><div><div><div>178</div></div><div><span>screenshot-format = webp</span></div></div><div><div><div>179</div></div><div><span>screenshot-png-compression = 8</span></div></div><div><div><div>180</div></div><div><span>screenshot-png-filter = 5</span></div></div><div><div><div>181</div></div><div><span>screenshot-webp-lossless = yes</span></div></div><div><div><div>182</div></div><div><span>screenshot-webp-compression = 6</span></div></div><div><div><div>183</div></div><div><span>screenshot-high-bit-depth = yes</span></div></div><div><div><div>184</div></div><div><span>screenshot-jpeg-quality = 100</span></div></div><div><div><div>185</div></div><div><span>screenshot-jpeg-source-chroma = yes</span></div></div><div><div><div>186</div></div><div><span>screenshot-jxl-distance = 0 # 0 代表数学无损</span></div></div><div><div><div>187</div></div><div><span>screenshot-jxl-effort = 9 # 1-9，9最高</span></div></div><div><div><div>188</div></div><div><span>screenshot-tag-colorspace = yes</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://zno233.dpdns.org/posts/%E6%98%9F/</id>
      <title type="text">星</title>
      <published>2025-11-01T00:00:00.000Z</published>
      <updated>2025-11-01T00:00:00.000Z</updated>
      <author><name>一杯清风不加糖</name></author>
      <link rel="alternate" href="https://zno233.dpdns.org/posts/%E6%98%9F/"/>
      <summary type="text">无聊时的消遣。</summary>
      <content type="html"><![CDATA[<p>“远处，一个身形庞大的怪物正在用心地品味久违的美食，狰狞的脸上流露出颇为人性化的表情，似乎很是满意于这些富有弹性的新鲜血肉。</p>
<p>“那张糊满鲜血的巨口中不时传来骨头碎裂的咯噔声，浓郁到令人作呕的血腥味弥漫于整个战场。</p>
<p>“倒在地上的索伦亲眼目睹这一恐怖的画面。</p>
<p>“来不及哀悼死去的同袍，伤痕累累的索伦抓起一旁被击落的长剑，再度冲向了正在专心进食的怪物。</p>
<p>“这是怪异中的上位者，天生具有各种强大的异能，就算是大陆最强的剑圣都无法击破它厚实的外壳。</p>
<p>“相比于庞大狰狞的怪物，索伦显得那么渺小，以至于沉溺于屠杀的怪物压根就没注意到这只不起眼的小虫子。</p>
<p>“尽管力量相差悬殊，但索伦还是义无反顾地冲了上去。</p>
<p>“因为他明白，作为最后一位活着的剑士，此刻，他便是身后这片土地最后的防线！</p>
<p>“此刻，20万民众的性命都系于他那满是豁口的三尺剑锋之上！</p>
<p>“这是最后的机会了。</p>
<p>“索伦喃喃道，紧紧握住手中破败不堪的铁剑，血水混杂着汗水的黏腻感叫人十分不舒服。</p>
<p>“这是师傅临终前传给他的铁剑，尽管他称这是一把只有勇者才能使用的神剑，但直到现在都没有表现出什么特别的地方，在索伦看来，即便街头的流浪商人们买的所谓魔剑也比它卖相要好一万倍。</p>
<p>“但这已经是他最后的依仗了。</p>
<p>“几年前，他还是一个整日游手好闲的半吊子剑士，没有什么远大的抱负，此生最大的愿望就是继承他那位死鬼老爹的遗产。</p>
<p>“如果没有意外的话，他将浑浑噩噩地过完一生，然后在亲友们或真或假的眼泪中化为墓园里的一座墓碑，以及墓碑上的几行烫金小字。</p>
<p>“那天，他那位肥得流油的老爹将他叫到房中，说什么「家门不幸」，「逆子」之类的混账话，本来他是左耳进右耳出的，可最后老爹却说只有男子汉才配继承他的遗产，年轻气盛的他想着反正城里都已经玩腻了，不如出去闯闯，于是脑子一热投了军。</p>
<p>“本来以为，在军队里混个几年就能回家。</p>
<p>“可没成想，在军中干了几年，稀里糊涂的就成了王国里人人称颂的大英雄。</p>
<p>“命运还真是让人捉摸不透啊！</p>
<p>“这次奉命侦查敌国情报，结果掉入了早就设好的陷阱里，想来应该是之前得罪的那几个军中的贵族干的吧，真是够黑心的，居然跟互为死仇的怪异们串通，这一座城的民众应该就是贵族们的「诚意」吧。</p>
<p>“但即便是死，他也不想让他们那么得意，至少这个残杀了无数人的怪物必须死！</p>
<p>“就用那一招吧。</p>
<p>“同袍们的呼喊声，马匹的嘶鸣声，刀剑划破空气的破空声…恍惚中，无数的声音交织在耳畔，索伦的脸上浮现了一种奇异的神采。</p>
<p>“举起铁剑，原本满是划痕与豁口的剑刃此刻正散发着柔和的圣光，战场上无尽的死亡气息被这抹微光吸引，在剑尖逐渐凝聚出血色的巨大剑气。</p>
<p>“感受着生命之火熊熊燃烧时的剧烈痛苦，索伦吐出血水，咧嘴笑道：「就让这一切结束吧。」</p>
<p>“沛然难御的剑气瞬间贯穿了怪物，只见它的动作一顿，原本庞大的躯体上多了一个黑黝黝的巨洞，接着重重地砸在地上，扬起漫天尘埃。</p>
<p>“与此同时，随着生命之火的熄灭，索伦也陷入了昏迷……”</p>
<p>正当云心看得如痴如醉之时，一双手突然蒙住了他的眼睛，同步到来的一缕淡淡的幽香。</p>
<p>“猜猜我是谁。”身后传来了一个低沉的男声。</p>
<p>“陆璃，你能不能不要这么无聊，我正看到精彩处，就被你打断了。”</p>
<p>云心没好气地回答道。</p>
<p>“回答错误，迷失于幻境的云心被神秘声音所蛊惑，将在接下来的十分钟内坠入无边的黑暗之中，只有意志坚定才能破除迷雾，重见光明。”</p>
<p>身后的人故作诡异地低语道。</p>
<p>“别装了，你再这样，今天的作业我可不给你看了。”</p>
<p>云心淡定地说道。</p>
<p>“好吧，算你狠，你猜对了。”</p>
<p>不再是低沉的男声，而是柔和清澈的女声，听起来有些气急败坏。</p>
<p>说话间，原本蒙在云心眼睛上的手也被松开。</p>
<p>伴随着有些刺目的光线，一个空旷的教室映入眼帘，由于刚打扫完没多久，黑板和地板上还有些未干的水渍。</p>
<p>正值夕阳西沉，橘红色的阳光透过窗户斜斜洒在整洁干净的教室里，为本就静谧的教室增添了几分肃穆的氛围。</p>
<p>只见眼前一闪，原本还在身后的陆璃已经面对面坐在了云心前面的座位上，双手支颐，顾盼神飞，一张宜喜宜嗔的俏脸虽然还有些稚嫩，但已经可见几分动人的风致。</p>
<p>不过她此刻正气恼地看着他，道：</p>
<p>“没道理啊，明明我模仿的声音跟你的同桌一模一样，甚至为了避免手掌上的区别，我还特意戴了手套，为什么你还能分辨得出来啊？”</p>
<p>云心得意地说道：“直觉。”</p>
<p>总不能说，我对你身上的香味实在太过熟悉，你只要一靠近我就能察觉到吧。万一你听了之后恼羞成怒，那我不就遭了无妄之灾。</p>
<p>云心心想。</p>
<p>陆璃白了他一眼，也没有继续纠结于此，话锋一转，道：“下个月就要举行「启灵」了，你准备的怎么样。”</p>
<p>云心漫不经心地放下手中的书，答道：“还行吧，想来进A级的中学应该十拿九稳。”</p>
<p>陆璃也不惊讶，装作不在意地继续问道：“那你准备读哪一所呢，是一中还是二中？”</p>
<p>“我还没想好，不是还有一个月吗，急什么。”云心收拾好东西，准备走人了。</p>
<p>看着云心背影，陆璃恨的牙痒痒。</p>
<p>臭云心，明明知道我想要和你读一个学校，居然还在犹豫，下次再也不帮他带早餐了。</p>
<p>“还愣着干嘛，教室都已经打扫干净，看时间都快下午5点了，再不走你妈肯定要说你。”已经走到门口的云心，回头提醒道。</p>
<p>也对，该走了，回家的路上再好好问问他。</p>
<p>虽然还是有些不甘心，但陆璃还是拿起一旁的书包，小跑着追上了快要下楼的云心。</p>
<p>就在这时，一件东西引起了她的注意。</p>
<p>“你这是？”</p>
<p>“志愿表啊，你不是一直想知道我填的是什么吗，喏，你看吧。”</p>
<p>陆璃凑近一看，方框内分明和她一样填着“南郡一中”这几个字，这才意识到自己被耍了，恼羞道：“好呀，云心，皮痒痒了是吧，看我不掐死你！”</p>
<p>感受着腰间传来的酸痛感，云心连忙讨饶道：“别闹，我表还拿在手里呢，先等我把表给老师。”</p>
<p>“不要！”</p>
<p>“好痛啊，陆璃你是不是属螃蟹的，掐人这么痛！”</p>
<p>“站住！”</p>
<p>“傻子才停下来！”</p>
<p>空旷的走廊中，只剩下男孩与女孩的打闹声不断的回荡。</p>
<p>校园外，铺满落叶的人行道上。</p>
<p>两人并肩而行。</p>
<p>揉了揉腰间的软肉，云心不禁龇牙咧嘴，倒吸了几口凉气。</p>
<p>好痛，这丫头也不知道跟谁学的，一不高兴就掐人，明明几年前还会甜甜地喊他云心哥哥，一副乖巧的模样，不知道从什么时候开始变得越来越娇蛮了，对他也愈发肆无忌惮。</p>
<p>察觉到云心的视线，陆璃颇有些无辜地看了看四周，问道：“怎么了。”</p>
<p>“没什么。”</p>
<p>围墙内的几栋教学楼在夕阳的照射下，仿佛镶嵌着一层流动的金边，暮光与阴影纠缠在一起，反而显得愈发幽深，原本再熟悉不过的校园，此刻却显得有些陌生和遥远。</p>
<p>明明眼前是一片难得的美景，陆璃的心头却不知怎的生出来几缕愁思，幽幽地说道：“小学的时光过得还真是快啊，仿佛一眨眼就过去了。”</p>
<p>听闻此言，云心也颇为伤感。</p>
<p>“是啊，还记得刚上灵术课时，你还因为怎么都感知不到灵能急得掉眼泪，全班人都看到了呢，这些事就像是昨天刚发生的一样……”</p>
<p>陆璃的脸有些羞红，如果放在刚才她肯定不会善罢甘休，但现在她只是感觉恹恹的，提不起力气跟他计较。</p>
<p>就这样，沉默逐渐在两人之间蔓延，两人默不作声地向前走着，往昔时光在他们的心头静静地流淌。</p>
<p>突然，云心停下了脚步，陆璃有些奇怪地看过去，只听到他说：“没事的，以后我们还是在同一所学校，会遇见新同学和更多有意思的事，我会陪你一起的！”</p>
<p>陆璃怔了一下，随即用力地点了点头，“那，一言为定了！”</p>
<p>“一言为……。”云心正准备回答。</p>
<p>话音未落，陆璃便抓住云心的手，奋力向前跑去。</p>
<p>听着耳畔呼啸而过的风，陆璃只觉得所有的烦恼都好像甩在身后，看着云心的侧脸，心头只余一片欢喜。</p>
<p>要是时光再慢些就好了。</p>
<p>女孩心想，有些贪心不足。</p>
<p>不知想到什么，女孩的脸上像是抹了一层胭脂，红艳艳的一片。</p>
<p>而这番美景自然是被一旁的云心好好地饱览了一番。</p>
<p>明明安静下来，还是很迷人的嘛。</p>
<p>云心不无遗憾地想道。</p>
<p>＊＊＊</p>
<p>深秋。</p>
<p>月明星稀。</p>
<p>如水的月辉轻柔地将整个世界纳入怀抱，在这淡银色的薄雾之中，一切仿佛都在溶解。</p>
<p>几缕夜风吹过，薄雾朦胧依旧，寒意却愈发深重。</p>
<p>往日热闹非凡的街道此时显得颇为冷清，行人寥寥；连小巷里的流浪犬也此时也丧失了活力，无精打采地蜷缩在废弃的纸箱中，发出呜呜的低鸣。</p>
<p>树梢上，一只年幼的猫头鹰正有些好奇地看着房间里景象，白色的微光照在它整齐细密的羽毛上，眼神中反射着冷光，炯炯有神，看起来十分威武。</p>
<p>刚结束觅食的它有些疲倦，选择在就近的树枝上稍作休息，结果被房间里两个人类小孩的对话所吸引。</p>
<p>可能是因为平时多在山林之中活动，很少接触到居住在城市里的人类，它对人类世界的一切都充满好奇。</p>
<p>而且这也是它第一次见到这么幼小的人类，以前在宽阔的山林的时候，只能看到一些强壮凶狠的猎人，一旦遇上他们，死亡也就不远了。</p>
<p>但显然这些住在漂亮房子里的同类没有山林中的人那样的攻击性，作为猫头鹰一族新生代最为出色的猎手的它，自然不会放过这次能够观察可能敌人的机会。</p>
<p>于是，它一边用鸟喙慢条斯理地梳理羽毛，一边侧耳倾听房间里的动静。</p>
<p>“也就是说，接下来的五年，陆璃还要跟你一起上学，然后放学还要回家，对吧？”</p>
<p>一位看起来只有八九岁的小女孩坐在沙发上，气鼓鼓地说道。</p>
<p>这是一位特别漂亮的小女孩。</p>
<p>淡粉色的肌肤吹弹可破，墨玉一般的眼睛顾盼生辉，漆黑柔顺的短发在脑后扎成一束可爱的小辫子，让原本就十分精致的面容显得愈发娇俏可人，活脱脱一位从童话中走出来的小公主。</p>
<p>不过此时小公主似乎心情不大好，一改往日的和颜悦色，语气也开始不客气起来。</p>
<p>“哥哥，你明明就知道我最讨厌的人就是陆璃，为什么还要一而再再而三地跟她亲近，是不是哥哥你已经不再喜欢岫儿了！”</p>
<p>一见到这种场景，已经拥有丰富经验教训的哥哥哪里敢轻忽，赶紧表忠心道：</p>
<p>“怎么会呢，哥哥我最喜欢岫儿了，我只是把陆璃当朋友看待的，朋友哪有妹妹重要啊！”</p>
<p>“如果是这样的话，那哥哥为什么跟她在一起玩的时间比跟你亲妹妹在一起的时间更长。”妹妹的话一如既往的犀利。</p>
<p>“这……”哥哥显得有些迟疑。</p>
<p>眼见如此，妹妹的表情一下子就从“多云”转“小雨”了。</p>
<p>只见她那秀气的眉毛微微上挑，小嘴不高兴地紧抿着，那黑白分明的眸子开始还只是水雾蒙蒙，可没过多久便开始江河泛滥，泪如雨下了。</p>
<p>虽然明知道妹妹云岫最擅长伪装，从小到大没少让他吃亏，但那副可怜兮兮的样子还是让云心不由的心都揪成了一团。</p>
<p>“我……”，眼看着妹妹的泪水就要决堤而出，值此“危急存亡之秋”，云心心一横，豁出去了！</p>
<p>能不能蒙混过去就看接下来的应对了。</p>
<p>站起身来，背对着灯光，将面容隐藏在阴影之中，酝酿了一下感情，深沉的语气带着些许沧桑。</p>
<p>“咳咳……既然你已经发现了，那我也不再掩饰了。</p>
<p>“其实……这已经是我的第二世人生了。</p>
<p>“第一世中，世界被来自星空的神秘怪物侵入，危在旦夕……</p>
<p>“那时的我作为东神州最为年轻的少将，正是意气风发的年纪，见此情状便与怪物决一死战，但当我使出那一式禁术时，激烈的能量碰撞导致时空畸变……</p>
<p>“等我再次醒来，却发现已经回到了过去，不管是怪物还是少将，一切都如大梦一场……”</p>
<p>讲到这里，云心的语气悠悠，说不尽的白云苍狗，世事无常。</p>
<p>可能是这番话太过出乎意料了，云岫好不容易积蓄起来的情绪被一扫而空，连泪水划过脸颊都恍若未觉，一双妙目呆呆地望向有些陌生的哥哥，问道：“然后呢。”</p>
<p>眼看着小鱼儿已经上钩，云心心中暗自得意，自然不会放过这个机会。</p>
<p>云心转身看向窗外，仿佛透过那扇窗看到了前世的光景……</p>
<p>“然后，我便发现这一世的轨迹与前世截然不同，本来以为按照这种趋势进行下去，前世的毁灭一切的怪物将不会出现。”</p>
<p>说到这里，云心顿了一下，然后继续说道，“直到遇上陆璃，我才恍然发现命运再一次走上了既定的轨道。”</p>
<p>不知是不是云心的这番话泄露了天机，原本清朗的夜空突然划过了一道怒雷，电蛇狂舞，紫色的电光在刹那间照彻整片天地。</p>
<p>云心转过身来，迎着云岫茫然的眼神，背后被雷光照得紫莹莹的，一字一顿地说道：“前世正是因为陆璃的死亡，怪物才自天外而来，毁灭世间。</p>
<p>“而想要改变这一切，必须拯救陆璃！”</p>
<p>话音刚落，刚猛无畴的雷声淹没了一切声音，雷光照在云心的身上，看上去神秘莫测，莫名威严。</p>
<p>不知怎的，这样的哥哥让云岫十分害怕，好像一眨眼，哥哥就会离她而去。</p>
<p>巨大的恐惧瞬间压倒了云岫，“不要……我不要哥哥离开。”说罢，便不管不顾的抱住了云心，身子不住地颤抖。</p>
<p>云心如梦方醒，吃吃地说道：“我……这是……怎么了。”</p>
<p>不知怎的，云心失去了刚才的记忆，只记得自己为了转移妹妹的注意力，根据自己曾经看过的一本漫画杜撰了一个颇有想象力的故事，本来好好的，可当他讲到一半时，精神便有些恍惚，后面发生的事情也记不清了，回过神来只见妹妹抱着他哭个不停。</p>
<p>“哥哥，你刚才好吓人，好像……变成了另一个人，岫儿害怕……”埋在云心胸口的妹妹，哽咽地说道。</p>
<p>松开怀抱，妹妹的小脸上满是泪水，两眼也哭的通红，似是惊魂未定。</p>
<p>虽然不记得刚才发生了什么，但妹妹这幅怯弱的样子还是让云心心里一疼。</p>
<p>伸手拂去妹妹眼角的泪水，柔声安慰道：“别怕，不管发生什么事，我永远都是云岫的哥哥。”</p>
<p>“真的？”云岫定定地看着哥哥。</p>
<p>“真的。”云心语气笃定。</p>
<p>“拉钩。”</p>
<p>“嗯，拉钩。”</p>
<p>两只小小的手连在一起，象征着不灭的誓言。</p>
<p>一瞬间，云心感觉自己好像回到了好几年前，那时的云岫还是一个十分乖巧听话的好孩子，总是跟着云心的屁股后面用软糯的嗓音喊哥哥，从来曾忤逆过他。</p>
<p>云岫虽然可爱依旧，但不知从何时开始性情变得愈发古灵精怪，像这样在云心的面前展露出软弱的一面了，已经是好久之前的事了。</p>
<p>云心有些怅然。</p>
<p>之后，云心软语安慰了好半天，才让妹妹彻底放下心来。</p>
<p>折腾了这一出，云岫也有些累了，没过多久便回房间睡觉，走之前耳朵还是红红的，似乎还在害羞刚才的行为。</p>
<p>妹妹走后，客厅一下子就安静了下来。</p>
<p>云心陷入沉思。</p>
<p>其实，云心讲的故事也不全是编的，至少他确实有前世的记忆，不过不是这个世界，而是在一个名为“地球”的遥远世界发生的事。</p>
<p>前世的他只是一个没有父母的孤儿，受尽了他人的冷眼，短短的十五年人生便已饱尝人情冷暖，只有书本能给他带来一丝慰藉，让他不至于被负面情绪吞噬。</p>
<p>可能是上天的怜悯让他拥有了第二次生命，让他能从头开始新的人生，而前世的经历也让他格外珍惜家人与朋友。</p>
<p>不知不觉，已经在这个世界度过了十二年的时光了吗？</p>
<p>云心的心里五味杂陈。</p>
<p>突然，窗外传来了略显奇怪的声响，云心大思绪随之中断。</p>
<p>顺着声音望去，只见窗外的一根树枝此时正晃悠个不停，同时一个黑漆漆物体以迅雷不及掩耳之势飞向远方。</p>
<p>什么嘛，原来是猫头鹰吗？</p>
<p>嗯……为什么总感觉它似乎在逃离什么东西？</p>
<p>注视着猫头鹰可疑的动作，云心只觉得一股凉气从脚跟直冲脑门。</p>
<p>一个人待在客厅实在有些不太妙，时候也不早了，还是赶紧睡觉去吧。</p>
<p>匆匆切断电视的电源，再关掉电灯，云心便逃似地离开了客厅。</p>
<p>霎时间，房间再次陷入黑暗，只剩下时钟的滴答声响个不停。</p>
<p>＊＊＊</p>
<p>由于第二天是周末，正巧婉柔姐有事不在家，云心准备一觉直接睡到大中午，好好体验一下久违的慵懒生活的。</p>
<p>自从婉柔姐受云心父母之托搬到这里之后，云心就再也没有过这种享受了。</p>
<p>明明只是临时监护人，身为云心兄妹远房堂姐的云婉柔，却明显比云心的亲生父母还要上心，不仅在生活作息方面对云心严格要求，还十分关注兄妹俩在学校的学习状况。</p>
<p>在云心父母因为工作出差之后，各方面都堪称尽职尽责。</p>
<p>对这位大不了他们几岁的远房堂姐，兄妹俩可以说是又敬又爱。</p>
<p>不过，今天终于可以好好喘口气了，婉柔姐什么都好，就是做什么都太死板了。</p>
<p>正所谓，一张一弛，文武之道。做人嘛，就得学会偷懒，太过认真容易累。</p>
<p>想到这里，云心在床上美美的翻了个身，被褥的柔软触感让云心差点舒服得叫出声来。</p>
<p>虽说这样做是实在有些对不起婉柔姐，但这种无拘束的状态太让人着迷了。</p>
<p>果然还得是这种充满清晨阳光气息的被子最让人感到舒坦，云心的意识逐渐模糊。</p>
<p>但渐渐的，云心感觉有些不大对劲，怎么好像有什么东西在一旁注视着他一样，让他怎么都睡不安稳，由于这种感觉愈发强烈，云心睁开了双眼。</p>
<p>映入眼帘的是身穿休闲款式的粉色小裙子的云岫，此刻她正站在床前，拿着手机默不作声地朝着这边拍摄，脸上挂着仿佛奸计得逞的坏笑。</p>
<p>“什么嘛，原来是云岫啊，这么早来这干嘛？”可能是刚睡醒，人还有些迷糊，云心并没有反应过来妹妹在干什么，甚至还问出了一个愚蠢的问题。</p>
<p>听闻此言，云岫倒是收敛起了脸上的笑容，狠狠瞪了一眼哥哥，冷哼道：“也不知道谁说今天要带我去公园玩，搞得我高高兴兴地起床后，却发现他还在呼呼大睡，太阳都快晒屁股了都没什么反应呢！”</p>
<p>糟了！</p>
<p>云岫的一番话如冷雨一般浇在云心身上，让他忍不住打了一个激灵的同时睡意全无。</p>
<p>这下完了，居然把这事给忘了，感觉最近好像总是丢三落四的，前些天忘了给云岫带新出的漫画，惹得她用埋怨眼神看了他好久，几天不得安宁，这次可比上次严重多了，也不知…</p>
<p>仔细打量了一下云岫，嗯，看起来似乎心情还不是特别糟，也就是还有救，云心心思急转，脑子里不停思考着对策。</p>
<p>见哥哥一副不知发生了什么的呆呆的样子，云岫有些气恼，有意无意地说道：“既然哥哥忘了这回事，那岫儿我就只能将刚拍到的有趣的视频发给婉柔姐了，相信大公无私的她一定对这个视频非常感兴趣…”</p>
<p>绝不能让这段视频落到婉柔姐手上！</p>
<p>没等陆璃说完，云心便道：“什么条件，说吧……”</p>
<p>“原计划不变，然后以后每次新出的《灵影剑客》你都得给我买一份。”</p>
<p>“成交…”</p>
<p>虽然麻烦了一些，但还在可接受范围内，云心不断的安慰着自己。</p>
<p>得到想要的东西后，陆璃的心情倒是不错，见哥哥一副垂头丧气的模样，心里更是得意：“哥哥你先去洗漱吧，早餐我都买好了，等下就出发。”</p>
<p>还能怎么办呢，云心自然是不敢有异议，同时也在心里悲叹：真是流年不利啊，被抓到这个把柄，以后就别想好过了。</p>
<p>云心越想越觉得未来一片黑暗。</p>
<p>借着从窗户洒落进来的几缕晨光，云心好好观察镜中自己的模样。</p>
<p>嗯，五官虽然说不是特别好看，但恰到好处的分布还是让整个面部都显得十分和谐，不管怎么看都当得上一句帅哥，就是年纪不大，看上去稍显稚气。</p>
<p>说起来云家的基因还真是不错，不管是父母，兄妹俩，甚至血缘关系较远的云婉柔，都是一等一出色的美人。</p>
<p>看着镜中熟悉而又陌生的面孔，云心突然意识到一个经常被他忽略的事实：他已经来到这个世界十二年了。</p>
<p>十二年说长不长，说短也不短。</p>
<p>特别对于云心这个两世加起来都只有二十多岁的人来说，十二年并不是可以忽视的数字，而是人生的二分之一，是四千多个日日夜夜。</p>
<p>本以为过了这么久，前世的很多东西都会被他慢慢遗忘，然而并没有，直至今日他都没有完全释怀。</p>
<p>还真是阴魂不散啊！</p>
<p>苦笑着，云心看着镜中的自己，却仿佛看到了前世那个狼狈的少年。</p>
<p>“哥，好了没有，该走了，去晚了可是会错过最精彩的部分。”</p>
<p>门外传来了云岫的催促声，打断了他的思绪。</p>
<p>“来了，来了。”云心一边回应着，一边抚平领口的褶皱，“OK，搞定！”</p>
<p>走出洗手间，云岫已经换上了外出时的衣裙，看上去倒是比实际年龄成熟了不少。</p>
<p>“走吧，哥哥。”云岫蹦蹦跳跳的，看上去已经迫不及待了。</p>
<p>“嗯。”</p>
<p>推开门，一阵晨风扑面而来，并不感到刺骨，只觉得十分清爽，让人睡意全无。</p>
<p>远处，红彤彤的如同新剥的鸡子般的朝阳正从东方冉冉升起，伴随着万道霞光落下，城市彻底苏醒，街道上再次挤满了熙熙攘攘的人群。</p>
<p>“哥哥，你快看，前面有人在表演魔术哎。”</p>
<p>已经不知是第几次听到类似的呼喊声了，云心麻木了，真不知道云岫这么个小不点儿体内哪来的这么多用不完的精力，早知道就应该找个借口在刚经过的亭子歇一会儿的。</p>
<p>“快点过来啊，哥哥，你怎么跟个老头子一样慢悠悠的。”云岫见哥哥一动不动，不由地出声催促。</p>
<p>不敢多做停留，云心只能背着沉重的背包小跑着赶来。</p>
<p>池塘前的空地上，一群吃瓜群众将里面围得水泄不通，到处都是看热闹的人，掌声，谈话声，欢呼声不绝于耳。</p>
<p>“这是怎么了，怎么有这么多人？”云心疑惑道，过于嘈杂的环境让他有些难受。</p>
<p>云岫正想要开口，却发现周围突然像是按下暂停键一般所有的声音都消失了，于是止住了说话的欲望。</p>
<p>所以人都敛气屏声，目不转睛地看向同一个地方。</p>
<p>只见半空中突然出现了一个巨大的圆形物体，云岫还没反应过来，那个物体便瞬间炸开。</p>
<p>璀璨的火光刹那间占据了整片视野，绚烂而多彩的颜色彼此交融，编织成一幅幅梦幻般图案。</p>
<p>在这片光之海洋中，连秋阳变得黯然失色。</p>
<p>众人皆沉醉于这份难得的光景之中，没有发出任何杂音。</p>
<p>那位表演者摘下头顶的老式高帽，面带微笑，向所有在场的观众优雅地鞠了一躬，随后向后一跃，消失在飞舞的焰蝶之中。</p>
<p>伴随着最后一只焰蝶消散在空气中，这场盛大的烟火表演也就宣告结束。</p>
<p>灵术吗？</p>
<p>云心若有所思。</p>
<p>后知后觉的观众这才想起鼓掌这件事，一时间掌声雷动。</p>
<p>云岫的小脸蛋也因过于激动变得通红的，整个人高兴地快要跳起来：“哥哥，你看到了没，好漂亮的烟火啊！”</p>
<p>受到妹妹的感染，云心的嘴角也不禁浮出一丝笑容，似乎陪云岫逛公园也不全是苦差事啊。</p>
<p>似乎察觉到了哥哥有些</p>
<p>＊＊＊</p>
<p>天台之上。</p>
<p>云心独自一人在练习灵术。</p>
<p>伴随着一股略显奇怪的灵能波动，微弱的火光成功出现在云心的指尖，但它如风中残烛一般闪烁不定的状态还是让人不禁怀疑它是否就会熄灭。</p>
<p>果不其然，一阵微风吹来，火光便消失了。</p>
<p>又失败了吗？</p>
<p>云心有些沮丧。</p>
<p>这在这几天中，云心尝试了好多次这道基础灵术，可不论他怎么努力，结果都以失败告终，明明之前他还能十分轻松而完美地施放它，简直是信手拈来，现在却难如登天。</p>
<p>不知为何，每当云心将注意力集中上去的时候，原本有序排列的灵能阵列就会瞬间溃散，灵术也就随之失败。</p>
<p>要知道对于灵术师来说，稳定是重中之重，一个连自己施放的灵术都不能确保稳定的灵术师，肯定不是一名合格的灵术师，甚至不被认为是灵术师。</p>
<p>再过两周就是启灵仪式了，但他甚至连最为简单的火光术都无法成功施放，这简直是一场灾难。</p>
<p>再这样下去，别说一中了，甚至连能不能正常升学都难说。</p>
<p>一想到可能出现老师和同学们诧异的目光，以及陆璃脸上挥之不去的失望的阴霾，云心就感觉心如乱麻。</p>
<p>啊，到底是哪儿出问题了？</p>
<p>云心抓狂地挠了挠头，多日的尝试未果和高强度的精力消耗让他的眼角布满了细碎的血丝，整个人就像是好几天没睡觉一般疲倦。</p>
<p>“哎，原来云心你在这里啊，怪不得我在哪儿都找不到你。”</p>
<p>陆璃的声音不合时宜的在背后响起。</p>
<p>转过头来，只见陆璃身穿黑红色的条纹长裙，腿上套着厚厚的裤袜，微笑着朝着这边走来，姿态优雅，脚步轻盈，仿若翩翩起舞的蝴蝶。</p>
<p>“我就知道既然你不在教室或者图书馆，那一定就在这里。”</p>
<p>云心此时最不想见到的人就是她了，不过被找到也是没有办法的事，只能勉强挤出一丝笑容，问道：“你怎么来了？”</p>
<p>话一出口，连云心自己都吃了一惊，这还是我的声音吗，怎么这么沙哑？</p>
<p>陆璃终于察觉出不对劲了，这才几天没见云心怎么就变得这么憔悴。</p>
<p>于是不解地问道：“你这是怎么了，看起来跟好几天没睡觉一样。”</p>
<p>云心犹豫了，欲言又止，不知该不该告诉陆璃他突然无法正常操控灵能的事实。</p>
<p>见云心这幅扭扭捏捏的模样，陆璃莫名有些气愤，脱口而出：“明明我有事从来就不瞒着你，结果你还把我当外人，不肯告诉我实情！”</p>
<p>话一说出去，陆璃就后悔了，她知道虽然平时云心总是一副风轻云淡的样子，但其实他是一个十分敏感且小心眼的人，上次不过说了几句他长得跟个女孩子似的，结果之后的几天赌气不跟她说话，最后还是她认错才把这事让他消气。</p>
<p>听闻此言，云心倒是一怔，不过既然陆璃都这么说了还是告诉她吧。</p>
<p>“其实我也不知道发生了什么，一觉醒来，原本已经了如指掌的基础灵术全都不能正常施放出来…也没发生什么事啊，很突然就这样了…你也知道再过两周就是「启灵」了，如果到那时问题还没解决的话，那就糟了。”</p>
<p>说到这里云心有些不敢看陆璃的反应，毕竟跟她信誓旦旦地约好来，结果他先出问题了。</p>
<p>陆璃却好像心里的石头落地了一样，神色一松：“我还说是什么原因呢，原来是因为这啊，要知道我可是近几十年里最快学会全部基础灵术的天才，这种事问我就对了。”</p>
<p>云心狐疑地看着他的青梅竹马。</p>
<p>见云心一脸的不信任，陆璃气道：“都到这地步了，你还不相信我吗？”</p>
<p>“也不是了，要说你灵术上的天赋我肯定是不会怀疑的，但平时你的作业都是抄我的，你什么水平我还不知道吗，我还从没见过你教过人。”</p>
<p>陆璃脸一红，说道：“你先别急，这样吧，你下午先不要回家了，跟我去个地方，到时候你就知道了。”</p>
<p>“去哪儿啊？”</p>
<p>“秘密。”陆璃神秘一笑。</p>
<p>眼见从陆璃口中套不出什么话来，云心只得按捺下心中的好奇。</p>
<p>看惯了云心平日里仿佛一切都尽在掌握的自信神情，突然看到他这种明明很气但就是拿她无可奈何的样子，陆璃颇有扬眉吐气的感觉。</p>
<p>臭云心，谁叫你之前都把我当作笨蛋看待…不过这倒是一个好机会，我可得好好把握……</p>
<p>陆璃念头一转，各种漫画中看到的桥段在脑海中浮现……</p>
<p>邪恶，实在太邪恶了。</p>
<p>陆璃嘿嘿傻笑，阴暗的念头在陆璃的脑海中盘旋，看向云心的眼神都变了。</p>
<p>被陆璃看得有些不自在，云心不由问道：“怎么了？”</p>
<p>陆璃没有回答这个问题，莞尔一笑：“没什么，快走吧，上课铃都已经响了。”</p>
<p>说完便向楼梯走去，嘴里哼着不知名的小调，心情似乎不错。</p>
<p>云心摸不着头脑，虽然不知道为什么陆璃这么自信能解决他的问题，但将烦恼倾诉出来还是让他轻松了不少。</p>
<p>管他呢，万一陆璃真有办法。</p>
<p>一边想着，一边跟上陆璃的步伐，离开了天台。</p>
<p>放学后。</p>
<p>一处偏僻的小巷。</p>
<p>“这里就是你姑姑居住的地方吗？”</p>
<p>看着眼前破败的建筑，云心忍不住发出疑问。</p>
<p>不管是破破烂烂的大门，还是开裂的外墙，亦或是门内的一片漆黑，都散发出一股可疑的气息。</p>
<p>陆璃此时的神色也有些奇怪，明明刚才还自信满满的，现在却是犹犹豫豫的，一副不是很确定的样子。</p>
<p>“应该是这里没错啊，前天我来这里的时候还好好的啊…难道是我走错了路？”</p>
<p>“你是说，你也不知道？”</p>
<p>看着陆璃躲闪的眼神，云心扶了扶额头，有些无语。</p>
<p>合着你根本就不清楚路啊！</p>
<p>“不如我们进去看看吧，万一我姑姑就在里面呢还。”陆璃心虚地说道。</p>
<p>“还是算了吧，这里一看就好久没有人住了，谁知道里面有多脏，我可不想弄一身灰回去。”云心说。</p>
<p>“哦。”陆璃有些内疚，“都怪我没记住路，害你白跑一趟，你的问题我也没有解决。”</p>
<p>云心倒是已经习惯了陆璃的冒失，不在意地说道：“没事，没事，就当是出来走一圈，权当散散心了。”</p>
<p>正当两人准备离开之际，身后破破烂烂的建筑突然泛起了微光，伴随着水波一般的涟漪自空中荡开，真实的景象显现了出来。</p>
<p>这是一个颇具未来科技感的建筑，不论是由未知金属铸成的外壳，还是形状炫酷的大门，无不出乎云心的想象，有着超脱现实的魔幻色彩。</p>
<p>“这是？”两人被眼前的画面震惊得说不出话。</p>
<p>陆璃率先恢复了正常，只听见她惊喜地说道：“没错就是这里，我们没有走错路，这就是我姑姑家。”</p>
<p>话音刚落，那个疑似大门的装置自动开启，像是钢铁巨兽张开的大口。</p>
<p>“走吧，姑姑已经看到我们了。”陆璃轻快地说道。</p>
<p>云心点点头，跟随着陆璃的脚步走进了这个奇怪的房子。</p>]]></content>
    </entry>
</feed>
