2026-10-16 17:22:50
写博客之后,我每年都会发年终总结,今年我多次想象我的 2026 年终总结会有多刺激,但现在我已经无法等到年末再回顾今年了。在睡前或者早上半梦半醒的时候,我多次回想起一些事件的细节,总觉得在催我把这些事快快写下来,不然,我的脑子要炸了。
事情应该从年初说起,也就是,你懂的。领导突然私聊说去会议室,没有转岗机会,拿上大礼包体面走人。实际上一点也不突然,风声早就传遍,只是刀真的砍到身上的时候,还是有点恍惚,用了半个小时消化这件事。同组的朋友也很多都一起被优化,整个部门砍了 50% 的人,不过既然是正常 N+1、年假转工资,就算了,多说也是费口舌。虽然前司这做法也是挺恶心人的,年前裁员,带薪春节假期没了,年终奖没了,刚好我还打算 26 年结婚,婚假也没了,还刚好是这么一个需要花一大笔钱的时候。
不过干了四年多,还是能躺几个月——当时是这么想的,并没有意识到事情的严重性。
既然几乎整个组都没了,我们不说 Last Day,整个 Last Week 都还算愉快,最后两天吃饭唱 K,最后十一点多回公司,看着两派几乎空着的座位,内心又有点波动。不敢多想了,抱起一箱杂物,直接企业滴滴回家了。离职那天是 1 月 15 日。
然后,因为预计后面结婚很多事情要忙,就没打算立即找工作,虽然好像也尝试过更新简历,浅浅投了一下,已经是没水花,当时就觉得“只是没认真”。被毕业之后闲着就搞开源和个人项目,当时觉得有开源项目,有自己的产品,找工作应该不会太难,所以就有限搞个人项目了。其实我立即在那段找工作会不会更好呢?现在看来很难判断对错,毕竟现在妙意灵溪也不算一事无成,而且,找到工作也不代表安逸,这很重要,后面会说。
年前回了一趟老家,看看老奶奶,又几天过去了。看到小县城的人们每天就在江边草地露营,不懂到底是真的有钱,还是松弛感拉满。然后就接上过年了,也是毫无年味的一年,翻 Obsidian 里的笔记看起来还挺凄凉的,那是独自在麦当劳吃虾堡的除夕夜。
过完年紧接着,就继续忙结婚的事情,那时候还更新了一点碎片,为现在的回忆提供了一个坐标。第一步是过大礼,领证前送好几大篮子礼品到老婆家,还好选择直接在香港买,不然那么多东西从广州带到香港是真的高难度。第二步是接新娘领证,感谢三位初中认识到现在的老哥,让我在闯关环节不孤单,不然自己一个 I 人真的无法应对那种情况。接着第三第四步是分别在江门和广州摆酒,每个地方都有流程,处处要出片。
回想起来都觉得这辈子都没有那几天那么累过。最近几年一直间歇性失眠。在失业之后更是严重得让我认真思考是否要用药物缓解这些情况。
成因主要是焦虑,但是我又是那种越想越焦虑的人,夜深了 Emo 起来就是万无止境的焦灼,冷汗都冒出来了。入睡的问题只是其一,更坏的是半夜醒了整个人就止不住地在脑子里回放面试问答、项目细节、技术细节,一旦醒了,就很难再睡过去。半夜醒的困顿感在那段时间我几乎完全没有感受过,醒了,就真的醒了。
没办法只能搞点非处方药解决一下问题,苯海拉明真的特有用,吃完半小时就能关机,顺便抑制鼻炎。不过有时候有效得过分,一个早上都会昏昏沉沉。
办完人生大事之后已经过去四个月,我开始认真找工作,但是事情并没有什么变化。回复依然很少,他们甚至都不需要多花几秒来点不合适,直接就是当我不存在。环境真的太差了,在失业前也在在 V2EX 看到很多失业帖子,已经对这种水深火热的形势有心理准备,但真的深陷其中时,才能感受到环境对人真切的打压。过去十年经验在 AI 前不值一提,在这个基础上 AI 发展还在加速。
程序员这个行业真的完得彻底。你都无法想象一个岗位背后有多少人在抢,据说一个岗位放出来一天就能收到数十份简历,如果你的简历写得不够突出,甚至不会被看一眼。即使过了海筛,进了面试,竞争者也不一定少得到哪里去。甚至过了面试还没完,通过的也并不止你一个,横向一对比,要价低的能拿到 offer 的概率更高。这个情况从数月前就开始,如果一直有人自愿降薪,那么一个普通人刚出来,尝试找平薪的工作,必然会滑铁卢。
到后面,面试的越多,发挥得越烂,有时候对方让我介绍项目我甚至都有一种懒得说的感觉。然后发展到有面试我都会焦虑睡不好,后面基本上面试我都选下午面,早上实在昏沉。最后,终于在两个月之后,小幅降薪入职了一家 995 公司。
入职第一天,给我的压力感至今仍然很清晰。
这是一个做护肤品的公司,主要客户是医美机构,也会做做线上零售。看着入职文件,基本工资五千,剩下算奖金,还有绩效部分,每个月评绩效,公司制度写明这一部分甚至有强制分布,这是第一层压力(虽然后面了解到这部分是销售才会做强制分布,技术部门正常是那满)。
接着来到工位,坐了一会儿,就通知开早会。运气真的背,那天周一,前一天周日刚好有个线上事故,导致那次早会气氛异常压抑,我到现在都还记得我那天对那个办公室的印象,昏暗,挤满了人,我的神经拉得紧紧的。倒是桌上的牛奶、饼干,各种零食水果有点格格不入(后来一问,答曰加班福利)。
开完会出来,也是没多久,开始听到他们说今天要发版,小程序,要改七八个页面,美术那边还没给设计稿……我就有点不好了。中午大家去吃饭,越聊越绝望。前一周组里主力哥们为了加速 +2 的需求还熬了个几乎通宵,且多日没有休息。快餐店的灯在吊扇的旋转下,整张桌面看起来一眨一眨的,更是加重了我的晕眩感。
到了下午,品牌组给了 Figma 设计稿,正式开始改 UI,结果第一天晚上就是九点半过后才走,晚上也没吃饭,就八点半领了公司的一个“补充包”,里面有个711 饭团,我也是脑子抽了没加热直接吃了……
说实话当时九点没人愿意走的时候我就有点绝望了,我认为他们并不想走,并觉得他们每晚都这么卷,毕竟这就是初印象。我顶不住了,九点多下班的时候我觉得我的神经已经火化了,决定第二天提离职。
运气真的背。十点多从地铁站出来,倾盆大雨,地上积水都 1cm 了。我也不管了,发了疯一样直接脱鞋往家冲。一边走一边大喊,是的,就跟那只土拨鼠一样,那一刻仿佛世上已经无在意的人。
到家已经接近十一点,手机传来那心跳骤停的钉钉提示音,同事发了个 Demo。
经历这种冲击,失眠人是不可能睡着的。吞了一粒苯海拉明迎来昏睡的第二天。
一早上我就打算找 +1 提离职,没想到他先拍拍我肩膀打趣说怕昨天那个情况怕吓走我。我顿时语塞,只发出一个拉得超长的“呃”。最后还是等他回工位坐下了我再做心理建设再过去提。结果是一顿挽留,具体说的什么记不清了,然后我还是去干活了。
一天结束,大概六点多,拉了个会大家一起聊天。其实我是能感受到,那里人都是挺好的,平级、+1 都挺好的。再往上我就懒得骂了。不过既然知道,其实大家也是会八点下班的,那其实还好,我接受了,留下来了。
之后的几天,走的也都挺早的,甚至七点就能下班了。到第一周结束,+1 再来找我聊,问我习惯了没,我说最近这个下班时间,我肯定习惯啦;然后对方说,这边节奏快,以后还是有可能加到十点的,我思考了一下,以我当时的睡眠质量,要是经常加到十点,那是得完蛋的,所以我回答,还是走吧。
接着神奇的事情又来了。+1 说去跟 +2 说一声,我心一想,我这个等级还要跟 +2 说吗……然后 +1 就回来跟我说去一下 +2 办公室。
这周参加过一次有 +2 的会议,也从同事们的交流中对他有一点粗略的了解,一个大人物,在华为和腾讯都呆过,本来是管人力资源那边的,顺便把 IT 部门管了。这设定,就有够离谱的。开会说话一套一套,来回说,来回说;搞奋斗加班文化,也是他一手带起。就这么一个人我以为他找我说啥呢,跟我说他最近在看毛选,接着说我们公司的人才都有自己的特点,你早上起不来,我们可以给你申请弹性上班。这具体怎么联系起来的,我是忘了。
当时有想过为什么会留我,应该是后端如果完全 Vibe 的话还是有些细节无法调整,而且那周做了两个不错的 canvas 动画吧。话都这么说了,留就留吧。虽然直到现在我都没有申请过这个所谓弹性上班。
之后的日子,我每晚都在 B 站搜索韩国人如何如何不睡觉来麻痹自己。会不会其实我确实不用睡那么多,只要不焦虑,其实睡七个半小时也是够的。同时再搞点头部按摩舒缓一下焦虑,其实形成了这样的睡前 Routine,确实有点效果。
就这样过去了一个月,没什么大事发生,加班最晚的一次,其实 “也就” 加到 11 点。另外时不时在周末在群里被 at 一下,也都习惯了。现在这个时代打份工,就是做牛做马,但最大的问题是啥?是这个公司的管理层是真的 SB。要做点什么功能呢,就说这周前做好。做好之后看一眼,没有然后,或许拿出去给客户吹了一下,没人买账,回来就说我们做的不好。
这是我们技术部门的问题吗?因为我们所有人根本对医美机构以及它们的客户不了解,需求都是 YY 的?但是 +2 甚至老板到底在干嘛?做出来的产品他们看了也提不出意见,与其说这些是我们瞎做的,不如说是 +2 拍拍他那秃头脑门想出来的,完事就不行倒过来说:不是领导要什么,你们就做什么。
在我进来之后已经送走了两位比我后来的同事,这破公司真的留不住人,且现在看来他们真的做了明知的选择。
比起接下来发生的事,上面的那都不是事。当时干了两个多月活,只领了一次工资。发薪日没发工资,一起下班的时候问了一下老员工,他说以前从来没有出现过这种事,真是好日子还在后头,这就被我遇上了。发薪日的第二天,开了个会议,说股权纠纷,有些账户被冻结了,几个小目标在里面动不了,公司不是没钱,等纠纷解决了一定给大家发。在拖欠工资的第一个月大家的加班热情还没有浇灭,很多同事都还是八九点走,包括我。
但是拖欠第二个月,就有暴躁老哥不忍了。隔壁部门搞 3D 打印的老哥,有实力的,直接钉钉群里 at 老板,直呼起名,并在他办公室门口等着。HRBP 愁眉苦脸地跑来问老哥的 +1:你咋不撤回呀。他 +1 的回应也是逗,两手一摊说他不回撤回。确实,他这人也是个乐子人。
好不容易撤回了,老板也没来,暴躁老哥就大闹 +2 办公室,我和产品哥在茶水间冲咖啡,虽然听不清,但声音确实是老大了。那天,整个办公室除了人力那一块,都弥漫着愉悦的空气。即使暴躁的不是我,我的肾上腺素也跟着飙起来了,有一种刺激的非日常感。
从那天开始,我们就开始 6 点下班了。完全无心工作,这个状态,即使没有失业,感觉上跟打零工也没什么区别了。只有 7 月 15 发过一次工资,8、9、10 月,只有国庆前,发了五千块打发我们。只能说从来没见过领导层这么烂的公司了。这个破公司为了逼员工自己离职,整了个离职就发欠款的设定,就导致了现在我们组基本处于一种跟公司互相白嫖的情况,它不发工资,我们不干活,就这么耗着。
你猜就业环境好的话这公司还能活吗?每个人都有自己的压力,组里大多数人都有孩子,甚至二孩,我没有,但是我有接近山顶的房贷。赌的是走的时候还能正常结算工资。
所以,找到工作,也不能松懈,指不定哪天又丢工作了。一个人就要从三十多,紧绷到六十五才能退休,能不能活到那时候,都确实要打一个大大的问号。比以往任何一年都激荡的 2026 年暂时就到这,未完待续。看现在这个形势,我不会又得过一个没有工作的春节吧?
2026-08-10 20:56:03

<style>
.parent {
font-size: 42px;
line-height: 1.5;
background: lightgray;
}
.child {
display: inline-block;
font-size: 12px;
line-height: 1.5em;
background: coral;
}
</style>
<div class="parent">
<div class="child">123456789</div>
</div>
看上述代码的页面渲染,是否会跟你想象的不太一样?为什么我的 .child 明明没有 padding 和 margin,它的周围却有莫名其妙的空白?
如果初看代码,你也觉得整个 .parent 类的高度应该跟 .child 一样,.child 上下的空间是不应该存在的话,那就推荐你认真了解一下 CSS 的 IFC(Inline Formatting Context,行内格式化上下文)和 strut 了。
我们先来看灰色的那一块高度到底怎么来的:
.parent:
font-size: 42pxline-height: 1.5.child:
font-size: 12pxline-height: 1.5em所以差距就在于 63 和 18 的差值,但问题是,.parent 里根本没有直接文字节点,里面只有 .child 的文字,为什么还是会按照 .parent 的高度撑起来呢?
因为 .parent 是一个块级容器(<div>),并且它内部包含行内级元素(.child 设置了 display: inline-block),所以 .parent 建立了一个 IFC。
此时如果 .parent 有文字内容,浏览器会在 .parent 的内部,.child 的前面,悄悄塞入一个 strut。.parent 的 font-size 是 42px,line-height 是 1.5,所以它的高度是 63px。
现在 .parent 里面有两个元素参与排版:
.child 盒子。因为两者默认的 vertical-align 都是 baseline(基线对齐),所以浏览器会进行如下操作:
.child 的基线(对于 inline-block,基线是其内部最后一行文本的基线,这里就是 "123456789" 的基线)。然后就会出现你看到的样子,明明 .child 那么小,却会被撑开。这在整个 .parent 里面只有单个元素的场景下看起来有点反直觉,但是试想一下,如果整句话存在多种行内元素的混排,有一个统一的行高是一个再正常不过的设计。
虽然,如果里面存在行内元素高于父元素的行高,还是会被撑起来……
<style>
.parent {
font-size: 30px;
line-height: 1.5;
background: lightgray;
}
.child {
display: inline-block;
font-size: 12px;
line-height: 1.5em;
background: coral;
}
.child2 {
display: inline-block;
font-size: 50px;
line-height: 1.5em;
background: coral;
}
</style>
<div class="parent">
这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。
<div class="child">123456789</div>
这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。
<div class="child2">123456789</div>
这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。这是一段很长的内容。
</div>
知道 strut 会造成意外的支撑,那么怎么解决呢?一个比较 hack 的方法是把 .parent 的行高直接压制掉:
<style>
.parent {
font-size: 0;
line-height: 0;
background: lightgray;
}
.child {
display: inline-block;
font-size: 12px;
line-height: 1.5em;
background: coral;
}
</style>
<div class="parent">
<div class="child">123456789</div>
</div>
但要说更靠谱的方法,我觉得还是得从消除 IFC 入手。
因为 IFC 的缘故,Div 里的行高会依照当前 Div 自己的 font-size 和 line-height 产生 strut。那么 IFC 本身是怎么产生的呢?
一句话概括就是:当一个块级容器内部直接包含行内级元素时,这个块级容器内部就会产生 IFC。
如果同时存在块级和行内容器呢?浏览器为了不让文字和块级元素打架,会偷偷创建一个 “匿名块盒” 把文字包裹起来。此时,包含文字的那个“匿名块盒”内部会产生一个 IFC,但最外层的 <div> 整体并不是一个纯粹的 IFC 环境。
我们明白了有 IFC 才会有 strut,那么想要消除这个 strut 只要把格式化上下文改掉就好了。
处理 IFC,CSS 还有 BFC、FFC 和 GFC。
在 CSS 的视觉格式化模型中,除了我们最常听到的 BFC (Block Formatting Context) 和 IFC (Inline Formatting Context) 之外,还有 FFC 和 GFC。
总共加起来,CSS 中主要有以下四种格式化上下文:
BFC(Block Formatting Context,块级格式化上下文)这个大家应该最熟。只要 float 不为 none、position 是 absolute 或 fixed、display 用了 inline-block / table-cell / flex / grid / flow-root(现代最常用),或者 overflow 不为 visible,就能触发。它的特点是内部元素垂直排列、外边距不会和外部重叠、能包住浮动元素,也不会被浮动元素盖住。清除浮动、防 margin 塌陷、自适应两栏布局,都是它的活。
<style>
.parent {
font-size: 42px;
line-height: 1.5;
background: lightgray;
}
.child {
display: block;
font-size: 12px;
line-height: 1.5em;
background: coral;
}
</style>
<div class="parent">
<div class="child">123456789</div>
</div>
把 .child 改成 block,里面的文字就根据它自己产生 IFC,问题解决。
FFC(Flex Formatting Context,弹性格式化上下文),display 设成 flex 或 inline-flex 就有。容器里的子元素会变成 flex item,不再按块级、内联那套规则排版,主轴和交叉轴上的空间分配、对齐都比较自由。适合导航栏、卡片居中、均分剩余空间这类一维布局。
GFC(Grid Formatting Context,网格格式化上下文),display 设成 grid 或 inline-grid 就有。容器会被切成行和列,形成网格单元,子元素想放哪就放哪,跨行跨列也随意。整个页面的主体结构、仪表盘这类二维布局,基本就得靠它。
<style>
.parent {
display: grid;
font-size: 42px;
line-height: 1.5;
background: lightgray;
}
.child {
display: inline-block;
font-size: 12px;
line-height: 1.5em;
background: coral;
}
</style>
<div class="parent">
<div class="child">123456789</div>
</div>
把 .parent 设置成 flex 或者 grid 之后,子元素也不成 IFC 了,问题解决。
strut 因为父元素开了 IFC 才存在,它本质上是一个看不见的"文本行",高度完全由父元素自己的 font-size 和 line-height 决定。只要父元素里有行内级内容,把那一行支撑起来,哪怕你里面只放了一个小小的文字,行高也会比你预期高出一截。
所以再遇到这种"莫名的留白"问题,可以首先怀疑是 IFC 的问题,对应修复方法是:
font-size: 0; line-height: 0 压制 strutdisplay: block,它会自己内部重新建 IFC,不再使用父元素的 IFCflex / grid,子元素变成 flex item / grid item,绕开 IFC2026-05-30 16:05:33
御温泉早在大学的时候就想去,但是那时候一来钱包不支持,二来当时也还没有接送车。现在呢,失业了有时间,去一次御温泉的钱还是有的,故意选了工作日,又便宜几百块,订了长盛庄,价格 1746。
而且现在有接送车,到了珠海站就能免费送到御温泉。不过还需要一个小时,也是舟车劳顿。

上次去珠海站还是疫情刚开放去澳门考托福,回想起来也是很感慨,但是此事当时也没有单独成文,只在2022 年终总结略有记载,其实当时也拍了不少照片,有点遗憾。
到站了想吃点东西,发现隔壁虽然似乎有一个独立于车站的商场,但实际上很多店铺的价格都是按车站的物价收费,考虑到晚上就要吃大餐了,干脆就在喜士多整个饭团撑过这一小段时间好了。

从广州到珠海站再到御温泉,经过一顿操作,到达时已经下午三点多,中午没吃饱立即在入住的时候薅了两个小蛋糕。因为周一人少,还给升级了房型,单床变双床,好评。这个时候我还有些担心人这么少,庙会没气氛咋办哦,不过很快事实就会证明这是无谓的担心。


初见这个复式房型,十分惊喜。整体感觉是日式的,很舒服的木构造,但是设计一点都不日式。一层一个榻榻米加一大片地板,只有两张懒人沙发,这样的设计,让两个人入住,实在有点寂寞了。要是四个人在这打桌游,看电影,枕头大战(误),那得多青春。这里真的好符合二次元对合宿的憧憬。


美中不足的是,这电视也真的太小了。投屏看个 B 站都觉得不够爽,从懒人沙发到这台电视的距离,感觉就像看个比较大的平板而已。

然后复式的二层是左右两个梯子直达床铺。这是升房型的结果,本来便宜的房型只有一个床位。床铺就是简单的一个软垫加一张被子,睡起来有点硬,但问题也不大。

房间就是这么个情况,稍微葛优躺在懒人沙发上刷了一下 B 站就去踩单车了。订房送了个单车票,不踩白不踩,但是去到踩完了,感觉还真像白踩,也没多少地方能踩。结果就是踩了个可能十来分钟吧,就回到原位了。
(废话文学,且此处忘记拍照。)
路过可以见到阿驴和阿牛,不过为什么要把牛和驴放在温泉景区,也是成谜。


单车之后,就是温泉部分了。

我们刚好住长盛庄 2 层,能直通长盛庄的温泉,十分方便。到了长盛庄的温泉区,基本没有人。走到主温泉区也还有一段路,那边人也不算多,不过一个小池两三个人,大池人与人之间的距离也很舒适,人少体验还是不错的。
另外温泉里面除了茶水,也有一些小甜品和雪糕,体验还是非常不错的。

接着就是激动人心的庙会,开场没多久就进去了,人就已经不少,也是挺奇怪的,在温泉明明看不到人呢,都是从哪里冒出来的呀,难道有人开车来专门吃自助餐?不过!有人气总是好的!
不得不说,庙会真的非常非常大。周一人不少有的厅还是稍空,真是不能想象寒暑假这里挤满人是个什么情况。


上图这么大的区域至少有 5 个,虽然有的摊位品类会有点重复,不过也是完全尝不完的程度。

庙会可以无限进出这个设定真的太棒了。吃一半吃撑了,回宿舍休息了一下,下去继续吃,吃到 10 点庙会结束。
但是即使如此,吃这个庙会,真的有一种前所未有的亏本感。以前吃自助餐觉得亏是单纯的觉得量没上去,而这个庙会东西真的太多了,五六条街数十个摊位,根本是想做到每一款想吃的都尝一遍都做不到……不过我的胃也确实是不争气的小就是了。而且菌菌又到吃自助的时候病了,真是小可怜菌。
到最后,把兑换券的燕窝和雪糕吃掉,然后喝杯草茶,玩玩游戏,时间就差不多了。


小可怜菌咳嗽了自己调个茶缓解一下:


然后庙会的游戏嘛,没有必要为了攒兑换券功利地去玩,因为最后都是会输光的哈哈,快乐过便好了。
庙会兑换区的饰品可以看出其成分极其复杂……
好几代的偶像大师 ↓

认全了就是老二次元的老角色 ↓

哎呀,尤其是这一桌,可可爱爱,看得心都化了~ 娜娜奇 Mua(づ ̄3 ̄)づ╭❤~

庙会出来,看到这个小庭院是怪好看的,好多小妹妹在拍照。可惜啊,年纪大了,放弃出片了。

不论整个景区、房间的风格,包括庙会这个设计,整体风格都是日式的,但是近来中日关系恶化导致的一种谜之混合风格,这也算是这趟旅行的一个槽点。

最后去换仙女棒,也是毫无准备,无法出片,随便拍拍。

再回宿舍已经快十一点了吧。这一路下来真的非常忙,要是还年轻的话,或许还能通个宵吧,温泉好像是 24 小时的,但是老了,不服老真的不行,而且我睡眠还分崩离析,再不躺下,我又要心跳漏一拍了。
就是这样,御温泉的一天,明明好像还有很多事没做,但是一天就这么结束了。
第二天不算早地起来去了一趟温泉,受到一种觉得泡一次也太亏了的心理驱使……
泡完就去吃早餐,其实挺好吃的,品类也不少。但是因为睡不好+一大早温泉消耗,吃两口碳水就晕了,一边吃一边想睡觉😂

吃完了再回宿舍睡了一小时,真的可以走了。

走了走了,再见御温泉,旅程结束啦。
这趟旅程整体体验还是很满意的,但是总是有种中登的疲态……
欲买桂花同载酒,终不似,少年游。
终于轮到我说这句话了。
临走前看到御温泉候车区的书架上还有这种书,刺伤了本失业者的神经🤣。

多年没见的珠海渔女,小学的时候老爸在珠海工作好像去过一次,应该是故地重游了。可惜因为天色原因不够好看。

这个色调让我想起多年前公司旅游那个雨天厦门……那段傻事仍然尘封在 Obsidian 里还没发出来,想起来就有点哀伤……
大概就写这么多吧……看标题可知这已经是 4 月 19 日的旅行,拖到 5 月 30 日发,中间不能说摸鱼,只能说混合着纠结与忙个不停……不过终于发出来了,恭喜自己。
然后,在这个满是 AI 的互联网上,又多了一篇手写流水账。
2026-04-10 16:19:37
昨天终于心一横开了苹果开发者,一大早开了,想着我要一天搞定上架提交!然而,钱是付了,等到晚上九点多,才成功开通。好嘛,那第二天再努力吧,带着兴奋入睡,第二天一早起来开干。
事实是我把这想得太简单,出了舒适区,就真的想踏入泥沼一样寸步难行。搞了大半天才终于把不用上架的版本签好,晚上之前也把 pkg 打出来了。不容易啊!
下面讲讲一些值得注意的点吧。如果你也打算入坑 Tauri 开发,而且打算构建 macOS 应用或者 iOS 应用,记得收藏,以后会用到的。
你先得搞清楚,CSR、CER、P12 这些概念分别是啥,不然肯定被 N 个证书搞得晕头转向。
在数字证书和公钥基础设施(PKI)领域,这三个缩写分别代表了证书申请、证书本身以及证书存储的不同阶段和格式。 简单来说,它们的关系可以看作是一个从申请到签发再到打包的过程。
本质:申请表
当你需要一个正式的 SSL/TLS 证书时,你首先要在服务器上生成一对密钥(私钥和公钥)。CSR 就是由你的公钥和一些身份信息(如域名、公司名称、国家等)组成的请求文件。
本质:正式证件
CA 收到你的 CSR 并核实身份后,会用他们的私钥对你的信息进行签名,生成一个证书文件,通常后缀是 .cer 或 .crt。
本质:全家桶安装包
.p12 是一种二进制格式的容器,它可以把私钥、公钥(CER)以及中间证书链全部打包在一个文件里,并且通常由密码保护。
在解决了证书本质上区别之后,你还要搞清楚苹果自己的 N 种证书。Developer ID Application 用于不上架的分发,上架还要用到 Distribution 和 Mac Installer Distribution 两个证书。
机子里证书有两个,一个 Apple Development,一个 Developer ID Application,不小心把证书导错了一次,排查又卡住。
其次 Tauri 一定程度上有点黑盒,加上对苹果应用开发不熟悉,从 Tauri 那不算太完整的文档里逐步实现签名。而且关键是这些信息还散落在 macOS Application Bundle、macOS Code Signing、App Store 三个页面。
为了理清这三个页面的内容,又得把一堆苹果开发流程中的重要概念搞清楚。
它是一组 key-value 对(权利字典),告诉操作系统“这个 App 允许使用哪些特殊能力”。例如:访问 iCloud、HomeKit、推送通知、相机、App Sandbox 等。这些权利会嵌入到 App 的二进制代码签名里。
iOS / macOS 上架时必须正确声明;Xcode 会自动生成 .entitlements 文件,签名时合并进去。
Notarization 翻译过来就是做公证。你把已签名的 macOS App 上传给苹果,它会扫描恶意代码、检查签名问题。
扫描通过后,苹果给你的 App 发一个“公证票据”(ticket),你可以把它“钉”(staple)到 App 上。macOS Gatekeeper(门卫)看到有公证票据,就会放心让用户运行,而不会弹出应用损坏的错误。
使用 Developer ID 证书在 App Store 外分发的 macOS App 必须公证。
一个由苹果服务器签名的 .mobileprovision / .provisionprofile 文件,里面包含:
上架必须,非上架不需要。
在搞清楚上面的概念之后就大概能明白了,Tauri 的构建配置必须分两种。
之前的一个卡点是,签名成功了也公证了,结果反而打不开,签名之前还能用 xattr -cr,现在用了都不行。
{
// ...
"macOS": {
"entitlements": "./entitlements.plist",
"signingIdentity": "Developer ID Application: XXX"
}
// ...
}
问了一轮 AI 以为是不知道什么原因导致的 entitlements 没写进去。但是后来又发现即使通过 codesign --force --deep --options runtime 手动把 entitlements 写进去了,依然打不开。
最后才恍然大悟,Tauri 文档上写的分开 tauri.appstore.conf 文件的必要性……
实际上打包非上架包的时候应该把 entitlements 删掉,这样反倒是打出来的包可以正常运行。于是!Mind Elixir v1.7.0 终于不用绕过安全策略,支持直接运行啦!
然后发布 App Store 的版本我们外加一个配置文件 tauri.appstore.conf.json:
{
"bundle": {
"macOS": {
"entitlements": "./entitlements.plist",
"signingIdentity": "Apple Distribution: Dexter Chow (9J69XMW5FC)",
"files": {
"embedded.provisionprofile": "./provisioning/MindElixirMac.provisionprofile"
}
}
}
}
构建时运行:
pnpm tauri build --config src-tauri/tauri.appstore.conf.json --target universal-apple-darwin
App Store 版本不需要公正,跑公正只会提示你需要用 Developer ID Application 证书。因此我们需要把环境变量里公正用到的值清空,这样 Tauri 就不会自动公正了。
pnpm tauri build 之后拿到了 .app,接着还要用 pkgbuild 打包成 pkg。
这两步就用到了上面提到的两个证书:
最后使用 Transporter 上传 pkg 包(开了虚拟网卡 Transporter 传不了),注意打包兼容 Intel 芯片的 universal 包,如果不想兼容 Intel 芯片,系统要限定在 12.0 以上。
我真的不敢想象没 AI 我看这些文档要看到何年何月。但是做好了,又觉得其实没那么难。所以确实,一件事做到过和没做到过就是完全不一样。没做到过你会怀疑每一个细节有问题,脑子炸炸的,做到了你就知道大致什么是没问题的。后续再处理问题就简单多了。
2026-03-12 18:43:14
失业之后多次想写点东西,也确实写了,不过都是零散地写在 Obsidian 里面,时间过了,又暂时不想整理发到博客。于是今天还是直接在博客写吧,最近的非日常生活。
2026-02-17
初二被 CC 邀请去他家烧烤,一扫除夕初一的无聊。工具食材都到位了,结果生火生了好久都生饿了。

山姆的羊扒真香嘻嘻!

从天亮吃到天黑,要是我找不到工作,要不要落魄前端在线烧烤呢(

最后摸摸 CC 的猫,乖乖的好猫~
2026-02-28
迫于准备结婚,过完年 2 月底,把送礼的任务完成,又解决一件事。结婚真花钱呀。

2026-03-11
快要领证了,在领导强烈建议下去修脸,换一个更好懂的词,那就是美容。第一次修脸,感觉还不错。
这是直接在大众点评搜的一家店,在石围塘地铁站附近,就地理位置来说比较偏僻,但是因为也住得偏僻,所以一拍即合了。
店的评分很高,可能因为位置比较偏,价格跟同类相比也算实惠,一百多的套餐,服务还挺多的,躺了一个多小时顺便当休息了。按摩挺舒服的最后一步都快睡着了🥱。洁面和剃须的步骤有点小痛不过第二天没什么问题,摸着是挺滑的。
2026-03-12
之前看到工行有羊毛,换一千外汇送积分和微信立减金,于是换了些港币,今天去取。
发现了一个问题,储蓄卡过期了不能在柜台取钱。我倒是知道卡过期了,但是提示只写着过期后 ATM 不能取钱,没想到柜台也不能取。
这一刻,我终于记起来了,ATM 的全称是自动柜员机,柜员机不行,所以柜员也不行(狗头)。
那怎么办呢,就换卡呗,然后被告知工本费 20 元。绝了,宇宙行是我见过第一家办储蓄卡还收工本费的银行。贵行开成宇宙行的资金,就是从这里薅来的吧?
换卡取钱,完事之后我突然想起来,噢,我旧卡还能拿回来吗?被告知不行,已经被剪了,而且不能拿回来。我知道这个需求也是比较怪,但那好歹也是大学交学费的卡,跟了我十几年,它就这样被砍头了,尸骨都不能交由我处理它后事,有点伤感。
2026-03-10 13:42:32
最近新鲜出炉的一个 Obsidian 插件 mindelixir-mindmap:https://github.com/SSShooter/obsidian-mindmap
主要有两个功能:
mindelixir-mindmap 可以根据标题和列表的层级关系把 markdown 文件转换为思维导图。

Mind Elixir Plaintext 是一种类似 markdown 嵌套列表的格式,不过加上了连线、总结和样式的语法。

你可以通过简单的缩进、ID 引用和类似于 JSON 的尾部声明,快速在文本里构建复杂的思维导图结构。同时,这种结构 AI 生成起来也非常方便。
- 产品研发流程
- 调研阶段 [^research]
- 用户访谈 {"color": "#3298db"}
- 竞品分析 {"color": "#3298db"}
- }:2 调研总结
- 开发阶段 [^dev]
- 架构设计 {"color": "#2ecc71"}
- 前后端联调 {"color": "#f39c12"}
- } 开发总结
- > [^research] >-进入-> [^dev]
上面的示例展示了几个关键语法:
- 开头定义节点,缩进 2 空格表示层级关系[^id] 为节点分配 ID,用于跨节点引用> [^research] >-进入-> [^dev] 定义从 research 到 dev 的单向连线完整语法可参考:https://app.mind-elixir.com/zh/blog/mind-elixir-plaintext-format

Mind Elixir Plaintext 同样也可以作为代码块嵌入到现有的文章中,顺便看看移动端的显示效果:

普通 markdown 只能通过编辑文本更新思维导图,针对 Mind Elixir Plaintext 文本,现在正在开发编辑思维导图反向更新文本的功能。
打开社区插件官网安装:https://community.obsidian.md/plugins/mindelixir-mindmap
或者打开 Obsidian 设置,选择社区插件:

搜索 Mind Elixir:

下面还有以前正式上架前的两种备选的非官方安装方式。
BRAT 是一个已上架的 Obsidian 插件,本意是可以让你更方便地测试你的插件。但是实际上你完全可以用这个插件来安装生产级的插件。
在社区插件列表搜索 BRAT 安装:

安装后在 BRAT 配置里点击 Add beta plugin 按钮,填入 https://github.com/SSShooter/obsidian-mindmap,就能自动安装思维导图插件:

不想使用 BRAT 也可以进入插件 Release 页面下载以下 3 个文件:
main.jsstyle.cssmanifest.json然后在 Obsidian 的设置中,打开插件目录,建一个文件夹把这三个文件放进去,然后刷新一下插件列表即可。
目前 mindelixir-mindmap 仍在持续迭代优化中,如果你在使用中遇到任何问题,或是对新功能有什么好想法,非常欢迎到 GitHub 提交 Issue 和 PR 🤗