Sakitami的集装箱 - Sakitami
type: channel
link: http://blog.skihome.xyz/author/1/
description: Sakitami
items: 钟摆
items: 《垃圾箱上的星空》
items: 入职前夜
items: JVM Full GC / Old Gen 学习笔记
items: 使用ChromeOS优雅安装第三方APK
items: ChromeOS 使用VSCode的新姿势
items: 打造一台适合生产的Chromebook
items: 别了Debian！Arch YES！| ChromeOS下的Archlinux
items: IDE Anywhere | VSCode Tunnel 模式
items: 恢复被Windows更新破坏的Arch引导

钟摆
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[collapse status="true" title="AD: SRCloud星轨加速计划"]SRCloud星轨加速计划 寰宇无界12CNY/240GB 全球访问流量 88折优惠后最低仅需7.92CNY/月[/collapse]写在开头然 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…

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的避风港，获取更多有趣内容。

打造一台适合生产的Chromebook
type: item
date: 2023-09-14T21:10:00+08:00
description: [collapse status="true" title="AD: SRCloud星轨加速计划"]SRCloud星轨加速计划 寰宇无界12CNY/240GB 全球访问流量 88折优惠后最低仅需7.92CNY/月[/collapse]写在开头作为一名计算机专业的学生，和其他学生稍有不同的可能就是有些时候需要背着电脑去上课了。但是，每次都要背着那个3公斤重的游戏本上课下课，我们这些"体弱多病"的学生可能真的吃不消。因此，在去年末，我氪了一台洋垃圾，Chromebook Yoga C630。不到2000块钱，却有着i7的八代低压U，4K触摸屏，16G内存以及128G的固态emmc。在配置上，对于写文档、撸代码的需求应该算是足够了。但是，由于Chromebook预装的ChromeOS，本地化体验以及生产力方面都有些不足，本文将会介绍提升ChromeOS系统体验的一些方法，帮助你拥有一台在中国大陆体验更舒适的适合生产的Chromebook。开启开发者模式Chromebook的开发者模式可以帮助我们获取ChromeOS的root用户访问权限，可以对ChromeOS本身进行修改。其次，开发者模式会将软件包安装程序置入，这样就可以直接安装在Google Play以外的apk了。需要注意的是，开启开发者模式后，每次开机会出现一个长达30秒的警告画面。需要按下Ctrl+D跳过。注意，开启开发者模式会进行一次Powerwash，请提前备份好数据，以免数据丢失。具体开启步骤如下：将Chromebook关机。按下 Esc 键与 Refresh 键，按住后再按下开机键。在亮屏后，会提示警告信息，此时可以松开 Esc 与 Refresh 键，然后按下Ctrl+D组合键。下一步系统会提示你是否继续，按下Enter键继续。系统会进行 Powerwash，然后重新开机。此时Chromebook就开启了开发者模式。此时，ChromeOS会进入首次设置页面，在第一页找到"启用调试模式"按钮并单击。系统会提示设置root密码，需要设置一个稍微复杂的密码，以免被破解。根据流程激活Chromebook。使用MrChromebox缩短警告页面MrChromebox脚本可以帮助我们在受支持的Chromebook上安装完整的UEFI，使之可以安装Windows等其他操作系统，不过这部分不再本文讨论范围内。但是，这部分需要禁用固件写保护。在部分设备上，禁用固件写保护可能需要特定的线，甚至拆机扣下电池。若觉得过于麻烦，可以跳过此部分。缩短警告页面流程如下：激活Chromebook后，确保连接的网络可以正常访问全球互联网，然后，按下 Ctrl+Alt+T组合键，打开Crosh。输入shell并回车。现在，你的窗口应该是这样：随后，输入如下指令，执行MrChromebox脚本：cd; curl -LO mrchromebox.tech/firmware-util.sh && sudo bash firmware-util.sh脚本菜单应该和下面一样：输入选项3 Set Boot Options，然后根据需要设置短的警告时间即可。安装ChromebrewChromebrew是ChromeOS下的一款包管理程序，类似于macOS下的Homebrew。安装步骤如下：按下Ctrl+Alt+T组合键，打开Crosh。输入shell并回车，进入shell。输入如下一键命令，回车即可安装Chromebrew。curl -Ls git.io/vddgY | bashChromebrew提供的包可能远远没有其他Linux包管理器那么多，但是也算是满足了我们日常的使用。使用Aria2下载在Windows上，我们可以用IDM进行下载与管理，但在ChromeOS上没有相关软件，那么我们就只能用Chrome来进行下载了吗？当然不。Aria2支持 HTTP/HTTPS, FTP, SFTP, BitTorrent 和 Metalink 等多种协议，是一款功能强大、内存占用低的下载器。安装Aria2的步骤很简单，先使用Ctrl+Alt+T进入Crosh，然后输入shell进入shell。随后，使用crew 安装 aria2即可。crew install aria2随后，我们需要编辑一个aria2的配置文件，以便启用rpc。首先，我们新建一个aria2的配置目录，然后创建aria2.conf文件：mkdir -p ~/.config/aria2c vim ~/.config/aria2c/aria2.conf在文件中粘贴以下配置：# 设置加密的密钥 rpc-secret=123456 # RPC 开关 enable-rpc=true # RPC 跨域(WEB 界面需要跨域) rpc-allow-origin-all…

别了Debian！Arch YES！| ChromeOS下的Archlinux
type: item
date: 2023-08-02T20:58:00+08:00
description: 写在开头Crostini是Chrome OS的一个子项目，它以容器化、安全的方式将Linux shell和应用程序引入ChromeOS。这种使用容器化的方式来载入Linux环境，在一定程度保证了安全性问题，同时，相比于传统的VM来讲不会有许多效能问题。而在最新的Chrome OS中，默认安装的Linux版本为Debian 11(Bullseye)。该版本发布时间为2021年8月14日，已经是两年前的版本。最新的Debian 12 已经于2023年6月10日推出。本文将讲述如何在Chrome OS下安装以滚动更新为更新机制的Archlinux，从而取代默认的Debian 11。启用多容器支持在Chrome OS中，系统会默认安装Debian 11作为唯一的Linux环境，同时用户没有更改的方式，系统也没有提供多容器支持。但是，Chrome OS已经隐式地添加了该功能。只需启用flags即可。访问 chrome://flags 页面，定位到 #crostini-multi-container，并选择启用。选择启用后，需要重启一遍Chromebook进行激活。重新启动后，点击设置 > 高级 > 开发者 > Linux开发环境，此时应多出一个选项，即“管理额外容器”。在该设置项中，默认会有一个penguin容器，这就是Debian 11容器了。安装Archlinux创建容器在“管理额外容器”设置中，点击“创建” > 高级，这将打开一个个自定义容器镜像的界面。在该界面中，我们需要自定义一个容器名称，同时粘贴镜像服务器地址与映像别名。如果网络环境良好，可以使用官方镜像源：https://us.lxd.images.canonical.com/ archlinux/current如果网络环境较差，可以使用国内镜像源，但推荐使用官方地址。https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ archlinux/current将容器名称、服务器地址以及映像别名填写好后，应该如下图所示：填写完成后，点击“创建”，此时应该会弹出一个终端窗口。稍作等候，应该就可以在终端看到新的容器”Archlinux“了。但别急，此时的Archlinux由于还没有安装与ChromeOS集成的访客工具，目前还处于无法使用终端打开的状态。我们是需要使用crosh打开。用户配置使用快捷键Ctrl+Alt+T，打开crosh。在crosh界面中，输入vsh termina，打开termina的管理工具。此时，我们可以输入lxc list来查看我们当前有多少容器。可以看到，我们刚才创建的新容器已经显示在了列表中。同时是Running状态。在这里，本文使用Archlinux2这个容器进行演示。接下来，使用lxc exec Archlinux2 -- bash来进入新创建的容器。注意，"Archlinux2"为你创建的容器名称，它会显示在Name列中。进入容器后，使用该指令查找默认的用户名：grep 1000:1000 /etc/passwd|cut -d':' -f1默认的用户名应为登录系统的邮箱地址。如果需要的话，我们可以对该用户名进行修改：pkill -9 -u old-username groupmod -n new-username old-username usermod -d /home/new-username -l newusername -m -c new-username old-username上述指令请将old-username替换为默认用户名，new-username替换为需要修改的新用户名。上述指令执行应为这样：随后我们需要为该用户设置一个密码。使用passwd username指令。注意username应替换为用户名，同时密码输入时终端没有提示。接下来，我们需要编辑sudo的配置文件，以便可以使用sudo：visudo在该文件中，找到%wheel ALL=(ALL) ALL一行，将前面的注释取消，同时为了能够在终端中使用，我们还需取消%wheel ALL=(ALL:ALL) NOPASSWD: ALL前面的注释。将用户添加至wheel用户组：usermod -aG wheel username此时，我们对于用户的配置就结束了，已经可以使用新用户来登录Arch了。输入exit退出Arch，但不要关crosh页面。安装访客软件包使用lxc console Archlinux2打开Archlinux，并使用新用户进行登录。首先需要做的是验证容器中的网络。若容器没有网络连接，则无法进行后续工作：ip -4 a show dev eth0若执行该指令后终端有输出，则代表容器有网络连接。编辑/etc/pacman.d…

IDE Anywhere | VSCode Tunnel 模式
type: item
date: 2023-08-01T20:49:00+08:00
description: 写在开头上回书说到，打造一台适合生产的Chromebook是多么地重要。这回我们再聊一聊基于浏览器的撸代码工具。对于性能孱弱的Chromebook来说，直接运行比较大型的IDE(PyCharm以上)会导致整个机器卡顿，编辑不流畅，甚至在IDE中写一些中文都需要安装linux下的中文输入法，双重减速机器运行。那么有没有一种方式，可以直接在浏览器中运行IDE来进行代码的编辑及调试呢？答案是肯定的。VSCode OnlineVSCode，全称Visual Studio Code，想必会写代码的各位对它都不会感到陌生。没错，除了全平台支持，它甚至还支持Web端。相较于本地运行的VS Code来说，VSCode Online的最大优势就在于不用在本地安装。Chromebook的可选存储从32G到256G，对于这种存储空间比较小的设备，VSCode Online独具优势。不过，Online的特性也成为了VSCode Online的一大致命缺点：无法离线使用。如果设备离线，那不得不使用本地的VSCode，因为Online版本甚至都无法打开。没错，VSCode Online就是这样的一款优点和缺点都十分突出的Web App。它无法将全部功能作为PWA离线运行，但是如果可以正常联网，它的表现和正常VSCode别无二致。贴近原生应用的体验在一天的使用后，我发现VSCode Online的使用体验于原生VSCode几乎一致。同样的代码高亮、代码缩略图、资源管理器等等，甚至顶端的菜单都得到了很好的还原。当然这不仅要靠微软的贡献，也需要Chrome的支持，方便PWA程序可以在窗口标题栏获得更好的扩展性。在底栏部分，设置于登录按钮还是在那个地方，状态栏功能完整，没有任何缺失。扩展部分可以说是VSCode Online在正常运行的情况下最大的缺点了。由于Online版的VSCode全部的功能可以说都是在VSCode服务器端实现，因此很多需要在本地计算的扩展都不支持Web版VSCode。只有一些声明支持的扩展才可以安装。例如，我想要测试运行代码的时候，就会想到Code Runner这个扩展。这个扩展可以自动帮我们执行一系列指令，用于在本地环境中编译运行代码。很显然，VSCode Online不支持运行测试，因此这类的扩展几乎都无法安装。并且，部分扩展只有有限的功能。例如Python扩展：在VSCode Online中，Python扩展仅可用作高亮显示的功能。VSCode Tunnel - 解决缺憾在上面的介绍中，我们知道了VSCode Online的诸多优点以及缺点。那么对于这些问题，有没有一种方式可以解决呢？答案也是肯定的。在VSCode 1.74版本，微软添加了一项功能：Tunnel模式。远程隧道允许您从任何地方的任何设备使用 VS Code 安全地访问您的计算机。也就是说，我们可以通过远程链接的方式链接到自己可以计算的搭载了VSCode的设备上进行运行测试，以及使用完整功能的VSCode。当然，这种方式也有一个不可忽略的前提：有一台可供使用的搭载了VSCode的设备。这个设备需要保持互联网链接，同时拥有足够的性能可供调试。若Github所提供的Codespace则可以无视这个前提，因为Github会提供可供调试的设备。但是必须要将代码上传至Github仓库。

恢复被Windows更新破坏的Arch引导
type: item
date: 2022-12-05T03:33:00+08:00
description: 前言由于Windows10/11每年都会有一次大版本更新，而这种更新一般都会莫名其妙地破坏掉Linux的引导。在这里记录一下我修复Linux引导的过程。Ventoy我想先说一下Ventoy。多亏了它，我的U盘不至于一遍一遍地格式化烧写成引导盘。Ventoy是新一代多系统启动U盘解决方案。简单来说，Ventoy是一个制作可启动U盘的开源工具。有了Ventoy你就无需反复地格式化U盘，你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件直接拷贝到U盘里面就可以启动了，无需其他操作。 ——Ventoy.net只需要在官网下载Windows安装包，解压就可以使用了。但注意初次将Ventoy安装到U盘上时，是需要格式化U盘的，记得将U盘中的数据备份一下。安装好后，就可以在U盘的“Ventoy”目录里放一个Archlinux的iso了。在日后无法启动Arch的时候，就可以用它来启动到Arch安装环境了。修复Grub引导进入Chroot环境这一步主要就是使用Arch安装环境种的arch-chroot来进入原来的系统。首先，我们需要先挂载原来的分区到正确的位置。首先，查看一下分区情况。lsblk确定好需要挂载的分区，然后挂载到相应位置。在这里，由于我使用的是Btrfs文件系统，因此挂载的部分我也想记录一下，以免后期遇到同样的情况却忘记了怎么挂载。mount /dev/nvme0n1p1 /mnt -o subvol=@ # 挂载根目录到/mnt mount /dev/nvme0n1p3 /mnt/boot/efi # 挂载EFI分区到/mnt/boot/efi mount /dev/nvme0n1p1 /mnt/home -o subvol=@home #挂载home目录到/mnt/home(可选)正常挂载好后，即可进入系统。我们默认使用root用户进行操作。arch-chroot /mnt重写引导接下来就是使用grub重写一遍引导。grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ArchLinux然后再更新一下grub.cfg文件。grub-mkconfig -o /boot/grub/grub.cfg至此，如果没有什么问题的话，修复引导部分就结束了。退出chroot环境：exit # 退出chroot umount -R /mnt # 卸载分区 reboot # 重启