跳到主要内容

杯子

· 阅读需 1 分钟

三立方新人活动买超大杯饮料“送”玻璃杯,实际上在正常超大杯的价格上加了几块,而且限制了品类,只能点成本比较低的几款。明知道是营销手段,而且我大概率不会喜欢喝那几款饮品,但还是没忍住点了一个超大杯。嗯就是为了那个没用的杯子・_・

wx_camera_1781158073513.jpg

超大杯真的好大一杯,这个杯子看上去能装1升……我都要记不起什么时候饮料开始变成只有中杯大杯超大杯的,他们家还在维护超大杯的语义倒是难能可贵了。

wx_camera_1781163806160.jpg

哈哈,我喜欢这个杯子,欣喜地把饮品倒到新杯子喝。不过是真的难喝……

下次点拿铁的时候可以自带杯子了!能减5元呢。只能这样安慰自己了〜

假进度条

· 阅读需 2 分钟

看到Wiwi这篇假進度條,真是深有同感!作为一个前端工程师,我甚至亲身参与到过“假进度条”的实现...骨架屏、服务端渲染[1]其实都算一种假进度条,让人看上去已经加载好了,但实际上根本不可操作。点名微软的网站,全是那种按钮能看到但实际上点不了,每次我都以为网站坏掉了!这比老老实实地显示加载中更让人恼火。

还有优剪的等待时间、高德打车的司机到达时间,永远都是不准的,但总是给你一个看起来还可以接受的假时间。最让我不能接受的是拼多多的提现红包,系统送你49元红包,凑够50块就可以提现哦,等你凑够49.9的时候,再收集十个钻石就可以提现了噢,收集9个钻石之后,再收集10个元宝就可以提现了噢〜通过欺诈手段降低用户的成本预期,再用沉默成本来胁迫你:现在放弃的话之前的努力就白费了噢〜再邀请3个用户立刻提现呢〜吃💩去吧,你的优惠券留给愿意被愚弄的用户吧。

[1] 一种加快网页加载的技术,在服务器提前把页面内容渲染好,在客户端更快呈现。但客户端“解冻”完成之前界面可能无法交互。

火灾

· 阅读需 1 分钟

6月6日晚上,我从厨房洗完碗到客厅,突然闻到一股难闻的烧焦味。没有多想,我打开门查探情况,外面浓烟充斥,我赶紧关门,但还是渗了不少进来,客厅一股“硫”味。我才意识到真的发生火灾了。我有些慌张,心里开始想我会不会死掉,一边找房东问物业电话打探情况。卧室的味道比较淡,窗外也看不到烟火,想来是另一侧的火灾。我缩在卧室飘窗,守着窄小的窗口呼吸外面的空气。窗外有10厘米左右的地沿,我想要是烧进来了最后还可以站到那里多坚持几分钟,又想起短视频里刷到的,站在那里最后摔下去的画面。

物业说火已经灭了。着火的是25楼另一侧的卧室,我们住27楼。客厅仍有刺鼻的味道,惊魂未定的我们在卧室里打游戏刷剧:不然还能怎样呢。

微波炉

· 阅读需 1 分钟

今天中午公司来了一个奇怪的人。没有人认识他,他是来借用微波炉热饭的。办公室的人大部分出去吃饭了,我们剩下的几个人都惊呆了,一时忘了回应,他又问了一遍。

虽然觉得很怪诞,但也没人说得出拒绝的话。盘问之下了解到他是对面新公司的人,办公室还没来得及装微波炉,他自己带了饭没地方热。

竟然还可以这样?如果是我大概会把饭留到回家吧!虽然我肯定不会在不明确公司环境的情况带饭...

不过需要帮助的时候,为什么不尝试一下呢?通常陌生人都比想象的要更友好一些。虽然但是,下次如果有另一个人来借微波炉,我大概率会拒绝他吧👉👈

开遍英国每一条路

· 阅读需 2 分钟

screenshot.jpeg

《极限竞速:地平线4》买了几年,断断续续加起来70h+了,是我目前玩得最久的游戏。我对游戏的热情并不高,很难想象游戏社区那些一个游戏动辄数百小时的玩家怎么做到的...

大多数时候我都只是开着我最爱的保时捷四处转悠,不参加比赛也不完成任务,今天突然发现只剩最后几条公路没有去过了,于是打开并不宏大的世界地图,四处搜寻没有走过的道路。地图的大部分地方我都有印象,但闲逛的时候还是经常有新的体验,打破一些个人记录啦,发现新的车房宝物啦,碰到遗漏的广告牌啦(我一般不会刻意去找)。大路熟悉,小路陌生,风景优美的地图,在同一个地方用同样的姿势漂移翻车。在引擎的轰鸣声中或冲刺或慢摇,开过高山,城市,和大海,这个游戏总让我感到一些生活的艺术性。

今天开遍了游戏地图的每一条公路,成就弹出来的时候有种恍如隔世的感觉,地平线5已经入库了,地平线6也上架了,我还在地平线4流连忘返,还有多少地方我没去过呢。

我是在Steam平台游玩的,地平线5多了手柄扳机震动,体验更好,地图也更大了,还有中文配音,只是最好的永远是初见。

做了个图片压缩小工具

· 阅读需 2 分钟

写博客时不可避免要上传图片,我现在的图片都上传到部署在家里小主机的minio服务。自己当家才知道财米油盐贵呀,每一MB空间都会增加备份负担和流量压力,动辄数MB的图片也很考验服务器带宽。但其实我并不关注图片的局部细节,只是想有个花花绿绿的图而已。

由于我的图大多都是手机拍的,我希望直接在手机上完成压缩。找了现存的图片压缩app,要么臃肿肥大参数繁杂,要么有广告、订阅,我只是想把相册的图变小一点,仅此而已。

github找了一圈没有特别对眼缘的,但我找到了Curzibn/Luban,一个模仿微信的智能压缩库,很符合我的要求,不用自己调参数,不过它是纯工具库,没有app,于是我自己撸了一个鲁班压图

luban_imager.webp

功能单一,打开图片,压缩,保存,仅此而已。

另外推荐一下Flutter,开发安卓app很丝滑,不像ReactNative那样各种奇怪的小问题,而且包体积很膨胀。这个app也有十几MB了,怀念以前几百KB的小app〜

绣球

· 阅读需 2 分钟

某天晚上心情不好,去公园散步。回来的时候路边看到一个巨大的“花球”,很圆,由一朵朵小花组成。我忍不住拍了拍,很紧凑,有弹性。

后来和朋友说起,她说可能是绣球。可绣球哪有那么大的?那朵花球一个人怀抱都抱不住。但其它方面确实很接近。她发了个视频给我,是一株脸盆大的绣球花。尽管我看到的还要更大,但我接受了她的说法。

S60516-15501218_com.ss.android.ugc.aweme.png

今天送猫去绝育,心里好奇,故地重游,再寻巨型绣球花。印象里的路段都走遍了,却没有找到绣球花的踪影。公园里很多人跳交际舞,音乐声嘈杂着交流声,和夜晚的静谧完全不一样。我感到一阵恍惚,难道其实是在梦中遇到的?

我再次搜索路边任何球状的植物。然后我看到了这个。

P20260516-144616.jpg

我无法确定这到底是否是昔日之物,但除此之外再无球形植物。花了好一会我终于接受:我把人工修剪的灌木当成花了。

给用了9年的剃须刀换电池

· 阅读需 2 分钟

大学时买的飞利浦PQ190剃须刀,已经9年了,电池垂垂老矣,充满电用一两次就刮不动了。想重新买一个,又感觉它好好的扔了挺可惜。我为什么不能自己换个电池呢?

想到就做,先拆开看看电池什么样。结构比我想象中简单,一块电路板,一个马达,一块7号充电电池。麻烦的是电池是焊在电路板上的,需要用到烙铁。我有点犹豫,会不会太麻烦了?不过早就想玩焊接了,趁着兴奋劲激情下单了电烙铁和新电池。

第一步是把旧电池拆下来,先用电烙铁融掉引脚上的锡(图是换好之后才拍的):

P20260513-153724(1).jpg

锡真的很好融诶,但是把它弄下来好难!刚关掉烙铁电源,它又“干”掉了,只能靠烙铁一点一点蹭下来,我为什么不买吸锡器@_@

废了九牛二虎之力,终于清理掉了老锡。又碰到新问题:新电池的电极片比旧电池宽一点!电路板上的卡槽插不进去...事已至此断无放弃的理由,用小刀慢慢把口子磨大,总算塞进去。

最后一步是重新焊接电极片,防止松动。但此刻我的烙铁针头已经因为使用不当有点损坏了,针头的一部分融不掉锡,用根部一点才成功融化锡丝。

锡丝要很靠近电极片才行!因为锡凝固得很快,前几次锡都在锡丝上直接凝固成球了=_= 好在经过几次失败,最终还是成功焊住了电极片。虽然焊成一坨很丑陋啦(俗称鸡屎焊)

搞定收工!装上盖子,拧上螺丝,再战十年!

P20260513-153823.webp

谨以此文纪念第一次用电烙铁。

冰室花园

· 阅读需 1 分钟

终于把博客从肥大的java后端迁移到了Docusaurus静态生成,内存占用从几百M降到不到10M,很是欣喜。

大学毕业后的几年博客网站几乎被我遗忘了,只是坚定地维持着运行。年初换了台服务器,配置很低,博客网站被我迁移到了家里的服务器节约宝贵的内存空间。

今年公司开始提供充足的AI报销额度。AI带来的生产力提升让我热情高涨,开始折腾集群,整理我的家庭服务器,做app,部署各种服务。博客迁移,这个在todo里躺了几年的待办终于被提上日程。

迁移过程出奇的顺利,AI帮我导出数据、创建新项目、生成logo,创建服务部署清单,不到半小时便替换掉了原来的Halo服务。此刻正在看假面骑士创骑,有个角色叫作冰室幻德,于是我给新的博客网站取名为:

冰室花园

记一次误操作删除800G数据的经历

· 阅读需 4 分钟

前因后果

2021年2月5日,我正在尝试运行一份示例代码。该脚本类似这样:

# 这里有检查$REC_ROOT,但本脚本内并未处理,所以只会输出缺少环境变量$REC_ROOT,但继续执行
./config.sh
if [ ! -d $WAV_ROOT ]; then
echo "Cannot find wav directory $WAV_ROOT"
exit 1
fi

data="$REC_ROOT/data"

# 其他代码

if [ $stage -le 0 ]; then
echo ""
echo "Stage 0: Preparing data"
rm -rf $data/*
local/chime1_prepare_data.sh || exit 1
fi

由于脚本来自知名开源项目,我并没有仔细审查。另外由于对相关代码并不熟悉,我也没有正确配置相关环境变量,所以脚本中的WAV_ROOTREC_ROOT理所当然是未定义的。

我就这么冒失地执行了脚本,而它在打印两句警告后并没有停止执行,所以我认为环境变量并不是必须的,于是放任它继续执行。由于该脚本执行的是耗时任务,我将控制台隐藏到后台,去完成其他任务。

过了十几分钟,我收到一个应用程序的崩溃报告,因为相关文件不存在。我疑惑地检查,发现数百GB的数据已经不翼而飞。此时我才想起那个正在执行的脚本,切换过去后发现它还没有停止执行,正在疯狂删除我的文件。我赶忙杀掉了脚本,但包括由于没有root权限而删除失败的,原本800GB+的数据只剩5.6G。

让我们来看看发生了什么。

首先,脚本调用config.sh,检测到REC_ROOT环境变量不存在并打印警告。

然后脚本继续执行,if [ ! -d $WAV_ROOT ]; then这里是在检测WAV_ROOT是否是一个目录,如果不是,就退出脚本。按理说我并没有配置任何环境变量,此处应该退出。但bash脚本神奇地,当WAV_ROOT为空或者不存在时,这个检测会认为这是一个目录,从而通过检测。即:

unset NOT_EXIST
if [ -d $NOT_EXIST ]; then
echo "this is a directory"
fi

上面的脚本是会输出的。

或许是因为参数为空时bash默认检测当前目录,以至于目录检测总是通过。

再然后,由于REC_ROOT未定义,$data=/data,然后相当于:

rm -rf /data/*

非常不巧和不幸的是,我将一块1TB的数据盘挂载在了/data上,于是迎来了降维打击。该数据盘中有800G+的数据,文件量大于10万,因此非常耐删,过了十几分钟还给我剩了几个G。而大量读写操作将数据恢复的难度推到了地狱级。

抢救措施

在杀掉脚本之后,我尝试卸载数据盘,但卸载失败,提示正忙。情急之下我忘记了可以通过正在运行的进程恢复它们打开的文件,而是想到先关机避免更多的读写。关机前发现VSCodium还在运行并且有未关闭的文件,于是抢救出几个正在编辑的代码文件。而这成了本次事故中我唯一抢救成功的文件。

之后,通过U盘刻录的系统修改原系统的配置,取消掉自动挂载数据盘,然后系统启动后以只读方式挂载数据盘尝试恢复数据。

正如前面所说,大量的读写操作让我失去了恢复的机会,尝试了不少恢复工具,但都没法扫描出目录结构,唯一可能有效的方法是通过特殊的文件头结构进行特征扫描,但这只能恢复一些特殊格式的文件,而对我最重要的都是纯文本数据,至于一些视频文件,由于尺寸太大数据分散在不同的块,也是基本没戏的。

还好,云端备份让我不至于一无所有,但还是痛失最近一个月的活动数据和大量不可描述之物。

总结

数据无价,谨慎操作。备份得当,也别太浪。