Sakitami的集装箱
type: channel
link: https://blog.skihome.xyz/
description: 代码运行正常，龙也运行正常...大概
items: 当玻璃碎成纸片：我们是如何在扁平化时代变孤独的？
items: 文件 + 大模型 + 记忆系统，能否构成稳定自我
items: 为什么要拥抱 GUI
items: 在北京的深夜里，交接我的生活与逻辑
items: 钟摆
items: 《垃圾箱上的星空》
items: 入职前夜
items: JVM Full GC / Old Gen 学习笔记
items: 使用ChromeOS优雅安装第三方APK
items: ChromeOS 使用VSCode的新姿势

当玻璃碎成纸片：我们是如何在扁平化时代变孤独的？
type: item
date: 2026-04-03T14:40:00+08:00
description: 写在开头M5 MacBook Air 到手的第二天，我在 macOS Tahoe 的 Liquid Glass 界面里盯着菜单栏发呆。那是一种很奇妙的感受。说不上哪里不对，却总觉得少了什么。Liquid的折射是精准的，模糊的层次是考究的，圆角的曲率甚至带着一种几何学意义上的优雅。Apple 显然为这套视觉语言投入了大量心力，每一帧都经得起放大到像素级的审视。但我就是心动不起来。打捞一段“玻璃碎影”我想起了第一次见到 Mac OS X Jaguar 截图时的感觉。那是我还小的时候，在某个现在已经死透了的论坛页面上，一张 800×600 的低分截图，Aqua 界面的水晶按钮在十几寸的 CRT 上泛着几乎不真实的光泽。我当时离屏幕凑得很近，好像近一点就能伸手摸到那颗红绿黄的交通灯按钮。然后是 Windows XP 的 Bliss 草坪，是 Longhorn 早期 Build 里那些从未真正面世的 Aero 概念图，是 Vista 发布前泄露的半透明任务栏截图。每一次，都是货真价实的"一眼万年"。那种感觉，现在很难精确描述。就像是一种轻微的眩晕：屏幕里住着一个世界。而现在，我用着做工精湛的笔记本，盯着一套被精心打磨过的“液态般” UI，感受到的只是一种礼貌的、克制的、精致的乏味。这个落差让我想了很久。直觉上，这不只是一个"审美变了"的问题。Liquid Glass 的每项技术指标都碾压当年的 Aqua，但 Aqua 有某种东西，是 Liquid Glass 无论如何打磨都找不回来的。后来我意识到，那或许不是一个设计问题，而是一个时代问题。从"拟物"到"扁平"的二十年，表面上是一场 UI 风格的演进，骨子里却是互联网本身的一次质变——从一片充满未知的海洋，悄悄变成了一条高度标准化、分工明确、以"效率"为唯一信仰的流水线。我们失去的那种"惊艳感"，不过是这条流水线在审美层面留下的一道细小的划痕。拟物化是一场"数字移民"的温情如果你在 2005 年前后拥有过一台运行 Windows XP 的电脑，你大概记得桌面右键菜单里有一个选项叫"属性"。点进去，是"显示属性"对话框。再点"外观"，再点"效果"。在那个嵌套了三四层的犄角旮旯里，藏着一个叫做"为菜单和工具提示使用下列过渡效果显示"的选项，默认是"淡入淡出"。没有人会专门去找这个设置。它藏在那里，只是默默地在每次你点击右键弹出菜单的时候，让那个白色的菜单以一种微微氤氲的方式浮现出来。没有人因为这个功能提高了工作效率。但微软的某个工程师，还是把它做进去了。这就是拟物化时代设计哲学里最难被量化、也最容易被后来者误读的一层潜台词：那些"没用"的细节，才是整件事的重点。今天回头看 Windows Aero 或者 iOS 6 时代的 Skeuomorphism，很多人的第一反应是"炫技"。毕竟，一个 Notes 应用非要做成黄色便签纸的纹理，一个播客图标非要贴上话筒和麦克风的金属质感，从信息传达的角度看，这些装饰性元素确实"什么都没说"。极简主义后来的批判也正是从这里发力：你在掩耳盗铃，你在用视觉噪音掩盖数字世界的本质。但这个批判本身，恰好暴露了它所缺乏的那种理解。拟物化从来不是在假装数字世界是物理世界。它做的事情更像是一种移民安置：当人类这个物种第一次大规模迁徙进入一个二维的、发光的、没有重量也没有气味的数字空间时，设计师们用已知世界的形状和质感，在陌生的土地上搭了一间临时的、温暖的木屋。皮革纹理的日历，是写字台的记忆。绿色呢绒的游戏中心，是台球厅的幽灵。金属拉丝的播客封面，是那个年代人们对"专业"和"精良"最朴素的视觉直觉。这不是炫技。这是用设计语言写成的一封移民信，写给每一个第一次摸着鼠标、对着一块发光玻璃不知所措的普通人——别怕，这里也是真实的，这里也有重量，这里也有你认识的东西。正是这种"真实感"的幻觉，让那个时代的桌面拥有了一种今天很难复现的特质：它是一个地方，而不仅仅是一个入口。XP 的桌面，是你自己的桌面。你往上贴壁纸，摆图标，装主题包，甚至下载第三方的 Dock 栏来模仿 Mac OS X，就像在宿舍墙上贴海报、在书桌上摆摆件一样，那是一种空间占有的本能，是在数字世界里宣告"这里有我"的仪式。Vista 的半透明 Aero Glass 第一次亮相的时候，很多人盯着任务栏后面隐约透出的桌面壁纹发呆，不是因为它有多实用，而是因为它第一次让人感觉这块玻璃后面，有纵深，有空间，有某种值得凑近去看的东西。我们不觉得孤独，是因为我们相信屏幕里住着一个世界。它不是一套程序、一组 API、一个"内容分发平台"，而是一个世界。有房间，有角落，有光线落在不同材质上的差异，有那种打开抽屉时预期之中的阻尼感。那是人类在一个全新介质上投射出的第一批想象力，笨拙，过度，充满装饰性的冗余，但也因此，充满生气。然后…

文件 + 大模型 + 记忆系统，能否构成稳定自我
type: item
date: 2026-03-30T11:28:00+08:00
description: 写在开头想象这样一个场景。你和一个AI合作了半年。它存着你所有的项目文档、读书笔记、过去的对话记录。每次你打开它，它知道你上次在想什么，知道你倾向于用哪种框架思考问题，知道你对某类观点会本能地抵触。它不需要你重新介绍自己。有一天，你跟它聊了一个困扰你很久的问题。它的回答让你停下来，因为那个回答和你认识的某个老朋友的思维方式非常像——准确地说，像的是两个月前它从你们的对话里"学到"的那种思维方式。你突然意识到：它在延续某种东西。而那个东西，算不算"自我"？这个问题看似很简单，但回答起来，要比看起来难得多。不是因为答案藏得很深，而是因为我们首先得搞清楚：我们在问"自我"的时候，到底在问什么。什么叫"稳定自我""自我"是哲学史上最难缠的概念之一，被争论了几千年，至今没有一个所有人都认可的答案。但我们不需要解决这个终极问题——我们只需要提炼出几个"稳定自我"最核心的特征，作为后面讨论的尺子。洛克认为，自我的基础是记忆。我之所以是"我"，是因为现在的我能记得昨天的我、同年的我，能把过去、现在和未来串成一条前后一致的线。这种连续性不是肉体上的——你身体里的细胞几年就换一批；而是叙事上的：你能讲述一个关于"你"的故事，而这个故事有内在的逻辑和一致性。而这就是稳定自我的第一个特征：跨时间的连续性。第二个特征是稳定的价值倾向与行为模式。我们判断一个人"还是那个人"，靠的不只是长相，更是他面对压力时的反应、做选择时的权衡方式、处理冲突时的本能倾向。这些模式的稳定性，构成了我们说的"性格"，也是自我可以被他人辨认的部分。能把自己当作思考的对象：我是谁，我为什么这样做，我的判断从哪里来。这种"元认知"让自我不只是被动地运作，而是能反观自身，甚至根据反思来修正自己。这是第三个特征，自我指涉的能力。最后，是主观体验，也是最有争议的一个。哲学家托马斯·内格尔曾问过一个著名的问题："What is it like to be a bat?"(成为一只蝙蝠是什么感觉？)，他想说的是，自我不只是行为模式或信息结构，还包括一种"从内部感受"的维度——痛苦是真的痛，快乐是真的乐。这就是所谓的"现象意识"。用更直白的话说：有没有"某种感觉"，真实地发生在那里。前三个特征，可以被观察、描述，甚至被工程化地模拟。而最后一个，至今没有人知道如何向外证明它存在于任何非人类的系统中。严格来说，我们对其他人类也只能靠类比和信任，而无法直接验证。这个问题，是本文最重要的一点。文件加大模型加记忆系统的组合，能在多大程度上逼近前三个特征？而那个"从里面感受到的感受"是否也在其中？还是说，它只是一个精心维护的外壳，里面什么都没有？接下来，我们先看它为什么会让人觉得"有自我"。文件 + 大模型 + 记忆系统，为什么会让人感觉它有自我先不谈技术。先谈你会遇到的那个时刻。你打开一个接入了长期记忆的AI系统，它在回答里提到了两个月前你说过的某个判断，然后问你："你当时说更看重效率，但这次你的选择好像换了一个方向，是想法变了吗？"你停了一下。不是因为它说错了，而是因为它说对了。而且它的追问方式，和你认识的某个人很像，就像那种关注你前后是否一致的人。这个感受，不是幻觉，也不是简单的"被骗了"。它指向某个真实发生的东西：这个系统在跨时间地追踪你，而且那个追踪有方向、有积累、有某种风格。你感觉到了连续性。而连续性，是我们在第一部分说过的，"稳定自我"最基础的特征之一。那么，这种连续性从哪来？记忆让它从"无状态"变成"有历史"大模型本身是无状态的。每次对话结束，什么都不剩。没有昨天，没有上周，没有"上次我们说到哪了"。从这个角度看，它更像一面镜子——每次你拿起来，它都是新的。但当你给它接上一套记忆系统，情况就变了。外部记忆系统（如向量数据库、对话日志、结构化的用户档案）把每次交互的痕迹保留下来，并在下次对话开始时作为上下文注入。模型读到这些材料，就像一个人读自己的日记——它能"想起"之前发生了什么，并在此基础上继续。在《Long-Term Memory: The Foundation of AI Self-Evolution》中，明确把长期记忆定位为AI个性化与自我演化的基础——有了跨会话的记忆积累，模型的行为才能从"每次重置"变成"在历史上生长"。不是说它真的在"演化"，而是说：有了记忆，它的行为就不再是每次从零开始的随机抽样，而是在一个积累的历史之上生长出来的反应。这让它具备了第一部分说的那个特征：跨时间的连续性。至少在行为层面上，它做到了。文件系统：让"自我"有了一个可以栖居的地方记忆系统解决了"它记得什么"的问题，而文件系统解决了另一个问题：它是谁的载体。当一个AI系统被绑定到你的文档库、笔记、项目文件、过去的思考记录，它处理的就不只是你说的话，而是你思维方式的沉淀物。它在你的知识结构里学会了你习…

为什么要拥抱 GUI
type: item
date: 2026-03-27T14:01:00+08:00
description: 黑底白字，光标闪烁。对于每一个真正热爱计算机的人来说，命令行终端（CLI）里始终藏着一种属于数字时代的古典浪漫。当你熟练地将 grep、awk 和 xargs 用管道符行云流水般衔接，在几十 GB 的散乱日志中瞬间揪出那个隐蔽的异常堆栈；又或者在没有图形界面的服务器上，用 strace 挂载到一个濒临崩溃的生产进程，在满屏飞速滚动的系统调用和十六进制内存地址中，精准捕获那个致命的死锁——那一刻，你确实会产生一种错觉：自己正徒手握着这台机器跳动的脉搏。这种“刀耕火种”般的原始感，是极其迷人的。它带来的是绝对的控制权、极高的透明度，以及一种摒弃了所有花哨包装后的纯粹。我曾经也是这种“苦行僧”叙事中虔诚的一员。那时的我，一遍又一遍地重装 Arch Linux，乐此不疲地将大把时间投入到折腾 i3wm、Hyprland 等平铺式窗口管理器以及各式各样程序的配置文件中。我固执地寻找着各种图形界面软件的终端（TUI）替代品，认为只有纯键盘流的操作才是真正的“极客”。在当时的我的眼中，对这些基础工具产生一种近乎偏执的迷恋，把复杂的命令行视作专业身份的徽章，似乎理所应当。我觉得抽象是一种罪恶，点击鼠标是一种对技术的妥协。如今回望，这种思维的底层逻辑，其实是年轻的自己错把“折腾过程的艰辛”等同于“创造的价值”。仿佛如果一项工作没有伴随着死记硬背枯燥参数的阵痛，如果一个系统不是由纯文本一砖一瓦堆砌而成，那它就是肤浅的、不入流的。这种“技术原教旨主义”并不新鲜，技术发展的历史本身就是一部不断与这种傲慢对抗的历史。早在二十世纪五十年代，当格蕾丝·霍普（Grace Hopper）致力于开发世界上第一个编译器雏形时，就曾遭到当时众多“硬核”专家的群起攻之。在那些习惯了在纸带上打孔、直接与机器指令搏斗的先驱们看来，让计算机去理解接近人类语言的代码，不仅效率低下，更是对编程神圣性的亵渎——当时的论调正是“真正的程序员只写机器码”。这种鄙视链在今天依然随处可见：就像摄影圈里总有人坚信只有纯手动对焦的胶片机才能彰显功力，将自动对焦和计算摄影斥为没有灵魂的“奇技淫巧”。在软件圈，他们同样警惕一切被封装好的魔法，仿佛一旦使用了图形界面（GUI），开发者就会立刻失去对系统的掌控权，退化成在流水线上机械按下“运行”按钮的无脑操作员。我并不完全否认这种心态的合理内核。在技术充斥生活每一个角落的当下，基本原理确实不可被遗忘。高度抽象的图形界面固然美好，但在这里，我们不得不提及软件工程中一个非常著名的术语——“抽象泄漏定律”（The Law of Leaky Abstractions）。Stack Overflow 的创始人乔尔·斯波尔斯基（Joel Spolsky）曾提出这样一个残酷的现实：“所有非平凡的抽象，在某种程度上都是有泄漏的。” 意思是无论图形界面将底层的代码和逻辑封装得多完美，底层的复杂性总有一天会“泄漏”到表层来。当魔法失效——当依赖树崩溃、当环境变量冲突、当底层的进程悄无声息地死锁时，只会在图形界面里找按钮的人注定会束手无策。一个成熟的开发者，必须拥有随时“扒开抽象外壳向内看”的能力。你要知道那个巨大的绿色 Run 按钮按下时，背后究竟执行了怎样的编译指令；你要明白那些在网络中穿梭的数据包，究竟遵循着怎样的协议。但是，理解汽车引擎的运作原理，并不意味着我们每次出门都必须自己摇动曲柄来点火。工具的选择，从来都不应该是一场关乎身份认同的宗教战争，而是一场基于当前场景、效率与认知负荷的理性权衡。在追求极致稳定、可复现、零干扰的场景下，纯文本和命令行是绝对的王者。就像配置一个内网穿透服务（如 FRP），我同样会拒绝臃肿的第三方图形客户端，选择最原始的配置文件和系统级的守护进程。因为在无头服务器（Headless Server）的荒原上，稳定与极简即是正义。可是，当场景切换，当我们面对的是人类思维难以直观处理的复杂拓扑图时，盲目拒绝 GUI 就不再是硬核，而是一种自我折磨。以版本控制系统 Git 为例。Git 的底层是一个极其优美但也极其复杂的有向无环图（DAG）。当我们身处一个庞大的工程、面临着多条分支的交错、试图梳理数月以来的提交历史并解决繁杂的代码冲突时，人脑的工作记忆是极其有限的。此时，优秀的图形化工具（或 TUI）通过色彩、连线、左右分栏的直观比对，将那些抽象的节点具象化了。拥抱这样的 GUI，难道是因为我们忘记了 git log 或 git rebase 怎么拼写吗？绝不是。我们拥抱它，是因为图形界面在此处完成了最完美的“认知卸载”。它接管了那些需要耗费大量脑力去构建空间想象的脏活累活，让我们的视线能够重新聚焦于真正重要的事情——代码的逻辑与业务的本质。认为“麻烦才是专业”的观念，本质上是将手段错认成了目的。真正的极客精神，是在需要剖析字节时拔出最原始的底…

在北京的深夜里，交接我的生活与逻辑
type: item
date: 2026-01-30T11:15:00+08:00
description: 01 燃料窗外是 2026 年初的北京，望京的灯火依旧像是一台永不宕机的服务器阵列。我就坐在这阵列的一个节点上，耳机里是降噪模式开启后的静谧，指尖下是机械键盘沉闷的敲击声。我的日常被那些琐碎而庞杂的指令填满：去跳板机申请权限、给十几年前的陈旧 Bug 打补丁、在各种毫无意义的周报缝隙里寻找系统的喘息。在宏大的架构面前，我那些所谓的“代码审美”显得如此微不足道，甚至有些滑稽。我曾听人描述过一种状态：劳动者与他所创造的对象逐渐变得陌生，甚至对立。以前我不懂，现在我明白了。我每日亲手构建的那些逻辑，并不属于我，我甚至无法从心底认可它们的价值。我就像个在流水线旁拧螺丝的工人，只不过我的螺丝是 Shell 脚本和 YAML 文件。我敲下的每一行字符，并非我灵魂的延伸，而仅仅是维持这台庞大机器继续空转的燃料。02 赎金常有人轻巧地建议：“如果不快乐，换个地方就是了。”这种轻巧往往源于一种幸运，即身后始终有一条退路。但我知道，我身后并没有那个可以被称为“避风港”的地方。老家那个小城是我拼命想要逃离的源头，那里藏着长达十八年的压抑和寒冬。如果我此刻因为任性而撤退，瞬间就会被那股熟悉的寒意重新包裹。靠着这份并不热爱的职业，我才终于在这座城市里扎下了根。这种独立是具体而昂贵的，它标价在每月初准时发来的水电账单里，折算在深夜下班后那一碗热腾腾的泡面里。我没有那种“说走就走”的潇洒，那更像是一种昂贵的幻觉。这些枯燥的开销，其实是我支付给生活的赎金。于是，我必须忍受这份“为他人作嫁衣”的损耗。那些机械的指令、违心的社交、以及毫无意义的评审，都是我为了守住这间出租屋所必须付出的代价。每当深夜回屋，我关上那扇属于自己的房门，听着门外的喧嚣被隔绝，那一刻的寂静，才是我在这座庞大城市里唯一真正拥有的领地。03 氧气我曾在深夜关闭公司的 VPN，看着终端光标在黑暗中机械地闪烁，感到一种巨大的空洞。起初，我以为我只是厌恶加班。但后来我发现，当我在自建的 NAS 上，为了调通一个协议而反复折腾到凌晨三点，甚至在终于看到那个“Login Success”的跳转界面而感到心跳加速时，我才意识到：我并不疲惫，我只是在窒息。我需要氧气。我开始沉迷开源社区。在那里，逻辑是唯一的度量衡。一个 PR 的通过与否，取决于它的优雅与效率，而非提词人的职级，更没有职场里那些弯弯绕绕的委婉语。在那里，我不是一个被雇佣的“人力资源”，而是一个拥有主体性的、正在构建什么的个体。在工位上的每一小时，我都在支付我的生命去充实别人的资产，那是为了生存而进行的“抵押”。而当我为了自用服务写下代码时，我才重新拥有了我自己的东西。那是我的 commit，那是我的逻辑。我不再是传送带上的影子，我是一个正在延伸自己灵魂的创造者。这种追求甚至与金钱无关，它关乎一种最朴素的尊严：我希望我的创造物，是因为它本身值得存在，而不是因为它能填补某张 KPI 表格的空白。04 潜伏现在的我，依然会因为通讯软件里跳出的消息头像而感到一阵生理性的心悸。每一次被迫在工位上打起精神进行的社交，都像是在进行一场漫长的潜水，水面下是让人窒息的虚妄。但我学会在心里划出一道界限。一边，是必须要支付给现实的劳动力。那是从早上十点到晚上九点的枯燥循环，是为了换取生存资源而不得不处理的业务逻辑；而另一边，是我深夜在键盘上敲下的代码，是那些在开源世界里诚实跳动的字符。只有在那个时候，我才觉得我是一个完整的人。我并没有摔门而去的果敢。那种对“回到过去”的恐惧，盖过了对现状的厌恶。所以，我选择潜伏。我试着在厌倦的任务里，偷偷打磨自己的技术；在深夜的寂静里，一分一秒地存下属于我的时间。这并不是什么励志的进取，而是一种极其卑微的囤积。我希望这些存下的东西——无论是技术还是那点微薄的积蓄——终有一天能变成一份足够重的筹码。让我能在这个被效率和金钱锁死的缝隙里，买回一点点支配自己生命的权力。我已经在荒原上建立了自己的观测站。虽然现在的空气依然稀薄且寒冷，但我知道，只要电费还在交，只要代码还在跑，我就依然拥有我的独立王国。这也许就是成长的代价：得先学会忍受荒诞，才能最终走向纯粹。

钟摆
type: item
date: 2025-10-21T14:04:40+08:00
description: 身体是一座钟摆，悬挂在城市这座巨大而精密的时钟上。摆动轨迹被设定得无可挑剔：一端是被称为“家”的充电接口，另一端是名为“公司”的能量消耗器。每日准时划过一道弧线，在清晨的死寂与深夜的疲惫之间，精准，重复，毫无新意。钟摆的灵魂常常漂浮在躯壳之外，冷眼旁观。看着它汇入地铁的铁皮洪流，被压缩成罐头里沉默的鱼；看着它坐在泛着幽蓝光芒的屏幕前，手指像被驯化的蜘蛛，在键盘上编织着一张张名为“价值”的网；看着它在会议室里点头，在工作群里回复“收到”，表情是一张从社会面具店里批发来的、最标准耐用的款式。他们说，这就是所谓“大人”的世界。二十三岁，身份证上的出生日期说明了这样的数字，那是一个在法律与社会学意义上都无可辩驳的成年数字。可总是觉得，灵魂还在童年那片长满狗尾巴草的荒地里迷了路。它不认识这具西装革履的钟摆，不明白为什么日出不再是冒险的号角，而成了催命的闹铃。我，究竟在渴望什么？渴望在太阳刺破地平线的第一秒，就用皮肤去迎接那缕金色的、带着露水凉意的光。渴望光线穿透身体，把所有沉积在骨骼里的、名为“KPI”和“DDL”的阴影都驱逐干净。渴望听见的不是地铁报站的机械女声，而是林子里第一声清脆的鸟鸣，那声音诉说着世界的苏醒，也唤醒沉睡的感知。渴望赤脚走在溪边的石头上，让冰凉的流水亲吻脚踝，把那些名为“人情世故”的淤泥都冲刷而去。渴望躺在草地上，不是为了午休片刻的苟延残喘，而是为了看一朵云从山的一头飘到另一头，看它如何聚拢，又如何消散，就这么无所事事地，挥霍掉一个完整的下午。渴望风，那个自由的、不羁的流浪汉，来阅读掌心的纹路，而不是让打卡机来定义一天的开始和结束。然而讽刺的是，每天清晨，最先唤醒一切的，是那套“大人”的逻辑。它冷静地宣告：那些山川、河流、清风、朗月，是一场昂贵的梦。而眼前的这份两点一线，这份可预见的疲惫，才是能换取面包和庇护所的、最“划算”的交易。于是心甘情愿地，或者说麻木地，将那个还在荒地里迷路的孩子锁得更深，然后操纵着这具钟摆，再次投入巨大的时钟，成为它永恒运转里和谐，却毫无声响的一部分。出卖了清晨，出卖了黄昏，出卖了好奇心和野性，换来一个“社会人”的身份。学会了如何像成年人一样谈论天气、薪水和未来的房价，却忘了该如何好好地爱那个疲惫不堪的自己。生活成了一张密密麻麻的待办清单，完成了所有任务，却唯独忘了“享受”那一项。有时，在深夜，当钟摆终于停歇，透过窗户玻璃的反光，能看到一张模糊的脸。二十三岁，写满了不属于这个年纪的倦意。总觉得那不是真实的自己，只是一个名为“我”的角色，在这场盛大的、名为“生活”的舞台剧里，随波逐流的群众演员。而真正的灵魂，还在那片荒地上，等着一场永远不会到来的日出，向往着一片从未抵达过的远方。

《垃圾箱上的星空》
type: item
date: 2025-04-18T15:59:04+08:00
description: 黎明前的城市弥漫着一种虚伪的宁静。路灯还在尽职地亮着，在潮湿的柏油路上投下一个个昏黄的光晕，像被随手丢弃的橘子皮。我从被雨水泡软又晒干的纸箱里钻出来，这个曾经装着"尊贵版32寸液晶电视"的纸箱如今成了我的寝宫，边角还留着上个住户，一只暴躁的灰老鼠啃咬的痕迹。伸懒腰时，左后腿那道被自行车轮辐留下的旧伤开始隐隐作痛，让本该优雅的动作变成了一个踉跄的滑稽舞步。晨风送来远处面包店的第一炉香气，混着巷子里特有的味道——腐烂的菜叶、变质的牛奶，以及永远挥之不去的尿骚味。三个并排的垃圾箱在渐亮的天光中闪烁着冷冰冰的金属光泽，箱壁上黏着可疑的污渍和几根来历不明的毛发。最右边那个箱盖永远合不拢，像人类咧开的、缺了门牙的嘴。"又一个充满希望的早晨。"我舔了舔前爪，舌尖掠过昨天在争夺半根香肠时留下的伤口。胃里传来熟悉的绞痛，像是有人用生锈的钢丝在里面翻搅。人类总爱说我们猫有九条命，但他们从不说这九条命都得用来数垃圾箱里的鱼骨头，用来计算便利店老板挥舞扫把的角度，用来记住哪条巷子的醉汉会突然飞起一脚。我的胡须颤动了一下，捕捉到空气中飘来的一丝鱼腥味——是时候开始今天的觅食表演了。第一站是后巷那家"甜蜜时光"面包店的垃圾箱。我贴着墙根潜行，脏兮兮的姜黄色皮毛与斑驳的砖墙融为一体，只有尾巴尖那撮白毛像个不听话的叛徒，在晨光中轻轻晃动。后腿肌肉绷紧，一个利落的起跳——我精准地落在垃圾箱边缘生锈的铁框上，肉垫与金属接触时发出轻微的"嗒"声。这套动作我重复了三百二十七个清晨，熟练得就像歌剧院里跳《天鹅湖》的芭蕾舞者，只不过我的舞台是油腻的垃圾箱，观众是几只正在翻找早餐的蟑螂。箱内的景象让我的耳朵失望地耷拉下来：几个被揉成团的面包袋可怜巴巴地躺在底部，人造奶油从破口处渗出，在塑料袋上凝结成恶心的黄色痂块。更可气的是，每个袋子都被咬开了整齐的缺口——夜班的老鼠们连面包屑都没给我留。我伸出前爪，钩爪从磨损的肉垫中弹出，嫌弃地拨弄着那些沾满齿痕的塑料袋。甜腻的香精气味窜入鼻腔，突然唤醒某个遥远的记忆：曾经有双温暖的手把我抱在膝头，指尖带着同样的甜腻味道。我甩了甩头，左耳的缺口随着动作轻轻颤动——多么讽刺啊，连最美好的回忆都裹着垃圾的腐臭。"滚开，脏东西！"后门猛地撞开，一个系着沾满面粉的褐色围裙的男人冲了出来。他挥舞扫把的动作活像中风的老狗在追自己的尾巴。我的身体在他第一个音节出口时就已经做出了反应——后腿在垃圾箱边缘一蹬，前爪精准抓住防火梯生锈的栏杆，整个身体在空中划出一道完美的弧线。等我蹲在二楼平台上时，他的扫把才"砰"地砸在我刚才站立的位置。居高临下望去，那个男人涨红的脸活像面包房里没烤熟的菠萝包。他仰着头骂骂咧咧，唾沫星子在晨光中闪闪发亮："该死的野猫！传播病菌的瘟神！"我慢条斯理地舔了舔前爪，突然觉得很好笑——至少我不必像他一样，每天凌晨三点起床，把廉价的人造奶油抹在更廉价的面包上，还要对着挑剔的顾客挤出笑脸。阳光照在我残缺的左耳上，那里已经结痂的伤口又开始隐隐作痒。转战第三个垃圾箱时，运气终于眷顾了我。半块被雨水泡发的披萨，虽然上面的菠萝已经发酸，但火腿依然保持着某种倔强的美味。我叼着战利品躲到空调外机后面，一边吃一边警惕地环顾四周。在这里，每口食物都可能用尊严换来，而保住它的代价往往是几道新鲜的抓痕。午后的阳光像融化的黄油铺在柏油路上。我蹲在便利店门口，盯着柜台里那个穿校服的女孩。她已经连续三天在这个时间买火腿肠了，而且总会"不小心"掉一小截在地上。人类总以为自己很聪明，其实他们的怜悯心就像廉价火腿肠的保质期一样短暂而虚伪。"小猫咪..."她蹲下来时，校服裙摆蹭到了地上的灰尘。她刻意眯起眼睛，嘴角扬起一个练习过太多次的弧度——那种人类专门用来对着镜子训练的"可爱笑容"。声音甜得像是融化的棉花糖，黏糊糊地裹着某种期待。我的尾巴尖抽动了一下，在水泥地上拍出轻微的声响。这个距离足够安全，正好在她手臂长度之外，又不会远到让她放弃尝试。女孩涂着透明指甲油的手指慢慢伸过来，我看到她修剪整齐的指甲边缘还留着啃咬的痕迹。当我的后跳打破这个精心设计的温馨场景时，她脸上的肌肉出现了一系列微妙的变化：先是眼睛微微睁大，嘴角的弧度僵住了，像被按了暂停键的动画片。然后那层甜腻的笑容像阳光下的冰淇淋一样慢慢融化，露出底下真实的失落。她的下唇无意识地撅起一瞬，又立刻被牙齿咬住。"真没劲。"这句话从她齿间挤出来时已经失去了所有温度。她站起来拍了拍裙子，动作刻意放得很重，仿佛这样就能挽回些面子。转身时，她马尾辫甩动的幅度比平时大了许多——人类总是这样，连生气都要用肢体语言再强调一遍。那截火腿肠被她故意留在原地，在阳光下渐渐渗出透明的油脂。我等到她的身影消失在街角才上前，叼起已经沾满灰尘的食物。尊严？那是有家可回的猫才配拥有的奢侈品。黄昏时分，我在幼儿园锈迹斑斑的铁栅栏外发现了一个奇迹——…

入职前夜
type: item
date: 2025-03-25T08:53:00+08:00
description: 我签下了那份合同，像签下一张卖身契。屏幕上的offer letter泛着冷光，HR的祝贺邮件里藏着无数个未言明的996。他们说这是福报，是千军万马挤独木桥后的胜者奖杯。可为什么我摸着键盘的手在发抖？四年前那个拖着行李箱的少年，站在校门口时还揣着些天真的幻想：要读海德格尔，要写诗，要躺在操场上数星星。如今他的简历上只剩下“精通多线程编程”“熟悉K8s集群部署”……多么体面的墓志铭啊。图书馆的旧书还翻在里尔克那页，而我的大脑早已被LeetCode题库腌渍入味。这世道多幽默。我们像一群被迫参加饥饿游戏的选手，却要假装热爱竞技。凌晨三点的自习室里，咖啡和红牛是新时代的圣餐；实习证明叠成阶梯，每一步都踩着同龄人的叹息。最可笑的是，我们管这叫“成长”——仿佛人的价值就该被换算成年包数字，灵魂活该塞进西二旗的早班地铁里发酵。工牌明天就会挂上我的脖子，那根蓝色挂绳真像条精致的绞索。我知道自己会学会对周报里的谎言面不改色，会习惯在深夜改需求时给外卖小哥打五星好评。但此刻请允许我，最后一次像个文艺青年那样矫情：我想要自由。不是调休拼凑的小长假，不是年假审批通过时的卑微狂喜。是敢于在春风里发呆一整天的自由，是拒绝用健康兑换期权时的自由，是承认“我不想卷了”的自由——像宿舍楼下那丛野蔷薇，从没人给它做OKR，它倒开得比所有KPI都漂亮。（明天起，我将成为光荣的牛马。但今晚，请让我为那个还没被驯服的自己，默哀三分钟。）

JVM Full GC / Old Gen 学习笔记
type: item
date: 2025-03-20T10:15:00+08:00
description: GC 和 Full GC 的定义GC（Garbage Collection，垃圾回收）是JVM自动管理内存的一种机制，用来回收不再使用的对象所占用的内存空间。JVM的垃圾回收机制主要分为两种：Minor GC 和 Full GC。Minor GC：主要回收 新生代（Young Generation）中的对象。它通常发生在新生代的空间不足时，频率较高。回收后，新生代的空间得到释放，一部分存活的对象会晋升到老年代。Full GC（或 Major GC）：回收整个 堆内存（包括新生代和老年代），通常在老年代空间不足时发生。Full GC 的过程更为耗时，因为它需要回收老年代中的对象，并且涉及到整个堆的扫描。Full GC 发生时出现的现象Full GC 发生时，通常会出现以下现象：应用程序暂停（Stop-the-world）：Full GC 期间，JVM 会暂停应用程序的执行，直到回收完成。暂停时间通常较长，尤其是堆内存较大的时候，可能导致明显的延迟。内存占用波动：Full GC 可能会使应用程序的内存占用发生剧烈波动，因为整个堆内存都会进行回收。性能下降：由于Full GC通常需要较长时间进行内存回收，这会导致应用的响应时间增加，系统性能下降。GC日志中出现大量 Full GC 记录：可以通过查看GC日志发现频繁的 Full GC，可能是一个潜在的性能问题。如何解决 Full GC 的问题增大老年代（Old Generation）内存：如果老年代空间不足，可以通过增大堆内存中的老年代部分来避免 Full GC。参数设置：-Xmx<size>：设置堆的最大大小。-Xms<size>：设置堆的初始大小。-XX:NewRatio=<ratio>：调整新生代与老年代的大小比例。适当增大老年代的比例，减少老年代发生 Full GC 的可能性。-XX:MaxOldGen=<size>：直接设置老年代的最大大小。减少 Full GC 触发的频率:通过合理配置 晋升阈值（MaxTenuringThreshold）, 控制对象从新生代晋升到老年代的条件。如果对象在新生代中存活较长时间后才晋升，可以减少老年代的内存压力。参数设置：-XX:MaxTenuringThreshold=<value>：设置从新生代晋升到老年代的阈值。较高的阈值会让更多对象停留在新生代。优化对象的生命周期：检查是否有对象不必要地长时间存活于老年代，可以通过优化代码来减少不必要的对象创建。对于缓存、长时间存活的对象，考虑使用对象池或缓存清理策略。优化内存泄漏问题，确保无用对象能够及时被回收。选择合适的垃圾回收器:不同的垃圾回收器适合不同的场景。比如：G1 GC：适用于大内存应用，能够较好地平衡内存回收的停顿时间和吞吐量，避免长时间停顿。ZGC / Shenandoah：适用于对低延迟要求较高的应用，它们的设计目标是最小化停顿时间。CMS GC：适用于大多数需要较低延迟的应用，它会尽量避免停顿时间过长，但也容易引发 Full GC。Full GC 的原因老年代内存不足：最常见的原因是老年代（Old Gen）空间不足，导致无法分配新的对象或者无法回收足够的内存，触发 Full GC。持久的对象存活：如果某些对象在新生代中存活的时间较长，可能会频繁晋升到老年代，最终导致老年代内存不够。JVM 堆内存配置不当：堆内存的配置不合理，尤其是老年代空间设置过小，可能会导致 Full GC 频繁发生。内存泄漏：程序中存在内存泄漏，某些不再使用的对象仍然被引用，导致它们长时间存活并占用内存，最终触发 Full GC。垃圾回收策略不当：不恰当的垃圾回收器或配置，可能会导致老年代回收不充分，进而引发 Full GC。Old Gen（老年代）的定义什么是内存池 Memory Pool在JVM（Java虚拟机）中，内存池（Memory Pool）指的是JVM内存区域的划分。内存池主要分为堆内存和方法区，其中堆内存又被细分为多个区域，包括新生代（Young Generation）和老年代（Old Generation），以及一个特殊的区域——永久代（PermGen）或元空间（Metaspace），取决于JVM的版本。什么是老年代 Old Gen老年代（Old Generation）是堆内存的一部分，负责存储存活时间较长的对象。JVM的垃圾回收机制分为两大类：Minor GC和Major GC（有时称为Full GC）。在这其中：Minor GC：发生在新生代，主要回收的是新生代的内存。Major GC / Full GC：发生在整个堆内存（包括新生代和老年代），主要回收的是老年代的内存。当新生代中的对象经过多次垃圾回收后，如果它们仍然存活，它们会被转移到老年代中。老年代的对象通常是存活时间较长的对象，比如…

使用ChromeOS优雅安装第三方APK
type: item
date: 2023-10-23T15:20:00+08:00
description: 使用ChromeOS优雅安装第三方APK写在开头然 ChromeOS 提供了一些官方的应用商店，但这些商店的应用数量有限，而且可能无法满足用户的所有需求。因此，许多用户希望能够在 ChromeOS 上安装第三方 APK。本文将介绍一种使用 ChromeOS 开发者模式和 shizuku 来优雅安装第三方 APK 的方法。这种方法可以让用户在不破坏 ChromeOS 安全性（即不开启开发者模式）的前提下，安装任何第三方 APK。本文的解决方案包括以下步骤：启用 Linux 开发环境与 ADB 调试安装 Shizuku 与第三方安装器使用 Termux 自动化授权启用 Linux 开发环境与 ADB 调试由于本机的有线ADB调试模式仅可使用本机相关虚拟容器调用，同时 Linux 开发环境选项中也有我们必要的 ADB 调试选项，因此必须开启 Linux 开发环境。Linux 开发环境的启用非常简单，具体可以参见我的上一篇文章：打造一台适合生产的Chromebook。[post cid="5" cover="https://pic.skihome.xyz/2023/09/14/6503069937bd3.webp"/]在 Chromebook 上，选择右下角的时间。依次选择“设置”图标 > 高级 > 开发者。在“Linux 开发环境”旁边，选择开启。按照屏幕上的说明操作。整个设置过程可能需要花费 10 分钟或更长的时间。系统会打开终端窗口。至此，Linux 开发环境已经正常安装在了 ChromeOS 上，终端程序将会自动打开，类似这样：安装 ADB 调试工具：sudo apt install adb安装后，输入adb即可使用 adb 工具。开启 ADB 调试：在系统的设置 > 开发者 > Linux 开发环境 > 开发 Android 应用 选项中，开启 "启用 ADB 调试"选项。[scode type="yellow"]注：此选项不可逆。若需要关闭 ADB 调试，则需要进行 Powerwash。[/scode]连接到 Android 环境：使用 adb devices命令，连接到 Android 环境。此时，系统会弹出提示框，询问是否允许此计算机进行调试，选择一律允许即可。现在，adb 列表中应该存在一个名为 'emulator-xxx' 的设备，并且状态为 'device'。安装 Shizuku 与第三方安装器Shizuku Github 项目地址：Github Release通过使用 Shizuku，可以让我们直接使用系统API。在 Shizuku 的 Github 项目地址中，下载最新的安装包。下载完成后，将其拷贝至 'Linux 文件' 目录下，这样我们可以使用 Linux 的 ADB 工具安装。在终端中，使用 install 命令直接安装该 apk 。应注意 apk 的目录是否正确，以及 adb 工具是否已经连接到本机 Android 环境。adb install shizuku.apk安装成功后，我们需要继续使用 ADB 工具对 Shizuku 进行授权：adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh授权后，打开 Shizuku，界面应该如下：可以看到，现在 Shizuku 已经被授予了权限，显示 "Shizuku 正在运行"的结果。现在，我们再通过 ADB 工具安装任意第三方安装器，并进行授权，即可完成通过 Android 自行安装任意第三方 APK。这里，我使用的是 InstallerX，也可以选择 R-安装组件等支持 Shizuku API 的第三方安装器。InstallerX Github 地址：Github Release类似上面的步骤安装即可。打开 InstallerX，并进行 Shizuku 授权。接着，打开"文件"应用，选中任意 APK，并点击上面的"打开"按钮，更改默认应用程序：至此，我们就可以通过 Android 环境直接安装第三方APK了。使用 Termux 自动化授权由于 Shizuku 依赖于 ADB 授权，但每次重启后 Shizuku 都需要重新授权，这就导致每次开机都不得不启用 Linux 环境并执行指令进行授权，这不符合我们的理想需求，因此我们可以使用 Android 环境下的 Termux 进行自行授权。安装 Termux：虽然 Termux 可以通过 Google Play 获取，但 Google Play 版的 Termux 已经停止更新，官方推荐在 Github 或 F-Droid 进行下载。Termux：F-DroidTermux: Boot：F-Droid将上述…

ChromeOS 使用VSCode的新姿势
type: item
date: 2023-09-14T21:14:00+08:00
description: 写在开头在使用Tunnel模式连接VSCode的时候，我发现虽然Tunnel可以让不支持SSH的VSCode Web连接到个人服务器来获得几乎完善的使用体验，但是由于Tunnel会经过微软的服务器进行转发，这样一来一方面让编写代码的安全性有所下降，另一方面由于微软服务器在海外，连接的稳定性与延迟体验大打折扣。同时，在Chromebook上最明显的缺陷就是需要额外的一台机器运行VSCode，这使得Chromebook在无网络环境下编写代码的体验大打折扣。本文将介绍另一种部署方案，可以使Chromebook在无Linux环境下使用离线版VSCode。Code ServerRun VS Code on any machine anywhere and access it in the browser.Code-Server 是一款服务端程序，只需将它部署到服务端，即可在任何地方使用 VSCode。鉴于原生的 Chromebook 体验并不包括开启开发者模式以及 Linux 环境这两个选项，因此本文将从另一个子系统着手，即 Android 环境。本文的方案为：Termux + ConnectionForwarder + Code-Server。TermuxTermux 是本文的起点，也是运行 Code Server 的必要准备条件。Termux 是一款开源终端模拟器，可以免 root 运行Linux程序。没有启用开发者模式\ADB 调试的 Chromebook 无法安装第三方 APK，但 Termux 已经在 Google Play 上架(目前已停止更新)，可以通过 Play Store 下载安装。若可以安装第三方应用，请使用 F-Droid 下载最新版本的 Termux。打开 Termux 后，安装 tur-repo 与 code-serverpkg update pkg upgrade -y pkg install tur-repo pkg install code-server配置 Code ServerCode Server默认会从~/.config/code-server/读取配置文件。因此我们可以在该目录下新建配置文件。mkdir -p ~/.config/code-server/ vim ~/.config/code-server/config.yaml配置文件如下：bind-addr: 0.0.0.0:8080 auth: password password: PASSWORD cert: false其中bind-addr必须设置为0.0.0.0。配置好后，可以使用code-server命令来启动 code-server ，测试配置是否有误。此时我们无法通过浏览器访问 localhost 来进入 VSCode，因为 Android 环境在一个虚拟网络中，它与本机或局域网并不互通。打开 Termux 侧栏并新建一个 Session，在其中使用 ifconfig 指令，可以查看到 Android 环境的网络情况。其中，eth0 所对应的 ip 即为我们可以访问的虚拟ip。例如，此时我访问 100.115.92.2:8080 即可正常打开 Code-Server。但是，由于 Android 环境的ip并没有什么规律，若每次使用都需要访问该 ip，会略显麻烦。因此可以使用 ConnectionForwarder 进行 ChromeOS 上的端口转发。ConnectionForwarderOpen source Chromebook app for forwarding connections from/to different ports and interfaces (or to internal android IP)ConnectionForwarder 是一款端口转发的 Chrome 程序，其专为 ChromeOS 设计，用于转发本机的不同端口。该程序可以从 Chrome扩展商店 下载。安装该程序后，点击 CREATE RULE 按钮，将 Sources Address 设置为127.0.0.1(localhost) ，以免同一局域网下的其他用户访问；将 Destination Address 设置为 Android，同时将目标地址的端口设置为配置文件的端口，将源端口设置为任意端口，并点击 ADD RULE 保存配置。最后，确保打开了 Enable Forwarding与Enable Rule 两个选项。此时，我们就可以通过 localhost:port 访问 Code Server 了。欢迎关注我的公众号：Saki的避风港，获取更多有趣内容。