普通视图

发现新文章,点击刷新页面。
昨天以前obaby@mars

荒漠化

作者 obaby
2026年1月7日 11:00

昨晚下班之后,依然跑步回家。今天的天气有些差,路上笼罩着一层雾气,路灯在迷雾中也变得有些朦胧。气温还是徘徊在零度多一点,一阵凉风吹来还是能感受到深深的寒意。

跑步的时候,难免也会想一些乱七八糟的事情,不禁就想到了最近关于 cursor 的各种行为问题。自从某天 cursor 的背景插件更新之后,编辑器在打开文件之后就开始频繁卡顿。正常情况下 cursor 插件都开了自动更新,也就是这次更新,让 cursor 直接到了崩溃的边缘。

让 cursor 解决 ide 卡顿的问题,给推荐一个更加轻量化的插件 backgroud-cover,但是安装的时候是 3.0 版本,提示使用了什么后台服务,balalbalabal。刚开始使用一切顺利,然鹅,这几天更新几次后就又出现了卡顿的问题。

只好回滚到了 3.0 版本,相对来说就稳定可靠多了。所以哦,并不是每次更新带来的都是优化,也可能是退化。

退化的可能不仅仅是这些东西,ai 虽然也在不断的迭代,整体来说能力越来越强,但是针对特殊问题的解决能力却鲜有进步。集成百度 asr 语音识别之后,出现一个诡异的 bug,那就是在 安卓手机上正常,但是在 ios 系统上出错了。让 cursor 解决问题,给出的方案就是方法论的那一堆,包括定位错误,调整配置等等。当然,cursor 也不是一无是处,对于权限的处理还是有价值的:

"NSMicrophoneUsageDescription" : "To use the AI voice assistant's speech recognition feature",
"NSSpeechRecognitionUsageDescription" : "To use the AI voice assistant's speech recognition feature",

然而,对于具体的错误处理:

{
    "code": 2225220,
    "message": "Error Domain=33 Code=2225220 \"asr authentication failed[info:-3004] [(-3004)] \" UserInfo={NSLocalizedDescription=asr authentication failed[info:-3004] [(-3004)] , NSHelpAnchor=7697EC65-0C8F-4640-8993-699C90797ACC},https://ask.dcloud.net.cn/article/282"
}

cursor 给出的建议:

说的的确是问题,但是实际上并不是问题的根本。哪怕去百度的后台看也是一切正常的,

包括 ios 的包名也设置了,网上搜索,能看到的唯一的一篇相关的文章是官方论坛的:https://ask.dcloud.net.cn/question/182917

里面提到了注入权限,直接修改源文件,重新打包,申请资源包等等。然而,在我这里问题的关键在于开通按量付费里面的短语音识别、实时语音识别。

虽然提示的是asr authentication failed,然而,在通过 cursor 一通折腾没有任何的效果之后。我就开始怀疑这个明显不是认证问题,因为目前能做的都做了,并且安卓可以,ios 不行,大概率还是百度平台的设置问题。而至于给出的错误码,这个充其量是个参考,之前对接百度原生的 asr 和 tts 的时候就出现过错误码毫无任何价值的情况。并且,更神奇的是,同样是语音识别,ios 走的是不同的接口,这也挺神奇的。而调用的接口,就是 uni 官方给出的:

var options = {
    engine: 'baidu'
};
text.value = '';
console.log('开始语音识别:');
plus.speech.startRecognize(options, function(s){
    console.log(s);
    text.value += s;
}, function(e){
    console.log('语音识别失败:'+JSON.stringify(e));
} );

https://uniapp.dcloud.net.cn/tutorial/app-speech.html#%E9%85%8D%E7%BD%AE%E7%99%BE%E5%BA%A6%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB

对于这种问题,目前网上相关的资料少的可怜。可能也有人遇到过,可能解决了再也没人发文章了。

自从有了各种开发助理之后,现在网上的新的技术文章已经肉眼可见的少了。解决问题的文章也少了,不知道是大家都不在遇到问题了,还是真的让 ai 全部给解决了。

现在看到一篇文章,在不确定是真人写的情况下,第一认知,应该判定这个东西是 ai 生成的。现在要判断 ai 生成的内容,成本也越来越高了。

昨天下午博客有段时间卡死了,登录服务器发现 php进程跑满了。看了下实时流量的 ua 竟然有个 gptbot。日志文件分析之后,发现各种 bot 真的不少:

而 umami 统计的流量,也属实有些离谱了:

这种 ai 对于这种真人输出的内容的依赖性从来不低,毕竟 ai 生成的内容反复投喂给 ai,最后 ai 就会变成智障,这个和近亲繁殖有着异曲同工之效。太多的人依赖于 ai,ai 解决问题之后,也很少有人会在写这些问题的解决过程。只要 ai 还需要人类生成的内容进行 feed,那么哪怕是再拙劣的文字也有重大的价值,直到那天 ai 能自己进化,那时候就不需要人类的。

互联网的荒漠化进程依然会继续,珍惜那些愿意打字的博主们吧,他们才是这个时代的宝藏,让 ai 不会快速沦落为智障。

RPG!

作者 obaby
2026年1月5日 14:43

踌躇良久,始终没有下定决心是不是要写这么一篇东西。元旦之前就看到大家写的各种年终总结,图文并茂,各种奇技淫巧,甚至好多人已经连 ai 都用上了。

有的人又写的面面俱到,每当看到这种类型的总结的时候,总是让我自惭形秽。当然,前段时间,看到似水流年发布的 wp 插件时年鉴,感觉这总结的东西总算是有了。于是也安装了一下,点击这里查看。但是鉴于 wp 主题以及插件的各种问题,在阅读量的处理以及其他的一些细节性的东西的处理上稍微少了那么点意思。

当然,不是不信赖咱们博友的水平,只是我这自定义的内容实在太多了,专门来做适配意义其实并不大。于是,这件事情又搁置了。

恍恍惚惚,一眨眼,元旦假期已经过完了,上午的时候忽然想到了 wp 自带的api,那何部直接通过 api 来统计各种数据,于是一番折腾之后,就拿到去年的统计数据了。也曾想过直接让 cursor 连数据库,但是数据库在家里的 mac mini 上,从外面往里连就有点麻烦了。

  WordPress 博客 2025 年度数据分析报告
============================================================

📝 文章统计
  • 总文章数: 137 篇
  • 文章总评论数: 0 条
  • 总字数: 208,655 字

  📅 按月发布统计:
    2025-01: 10 篇, 9,008 字
    2025-02: 18 篇, 27,449 字
    2025-03: 19 篇, 26,400 字
    2025-04: 16 篇, 22,751 字
    2025-05: 15 篇, 17,964 字
    2025-06: 9 篇, 11,638 字
    2025-07: 1 篇, 1,233 字
    2025-08: 12 篇, 24,933 字
    2025-09: 11 篇, 18,637 字
    2025-10: 5 篇, 8,875 字
    2025-11: 13 篇, 21,495 字
    2025-12: 8 篇, 18,272 字

💬 评论统计
  • 总评论数: 7451 条
  • 评论用户数: 264 人

🏆 评论用户排行榜 (Top 20)
  排名     用户名                  评论数        邮箱
  ------------------------------------------------------------
  1      obaby                3607       (无邮箱)
  2      爱看                   208        (无邮箱)
  3      似水流年                 160        (无邮箱)
  4      小彦                   149        (无邮箱)
  5      花非花                  128        (无邮箱)
  6      dujun                112        (无邮箱)
  7      acevs                110        (无邮箱)
  8      Vind                 109        (无邮箱)
  9      满心                   100        (无邮箱)
  10     大致                   99         (无邮箱)
  11     皇家元林                 97         (无邮箱)
  12     刘郎                   94         (无邮箱)
  13     网友小宋                 92         (无邮箱)
  14     紫慕                   85         (无邮箱)
  15     全局变量                 76         (无邮箱)
  16     XIGE                 69         (无邮箱)
  17     粽叶加米                 69         (无邮箱)
  18     LiuShen              67         (无邮箱)
  19     文案姐笔记                65         (无邮箱)
  20     ymz316               57         (无邮箱)

排名
用户名
评论数
博客地址
1 爱看 208 爱看
2 似水流年 160 似水流年https://my1981.cn/
3 小彦 149 小彦https://note-star.cn/
4 花非花 128 花非花https://www.941741.xyz/
5 dujun 112 dujunhttps://dujun.io/
6 acevs 110 acevshttps://acevs.com/
7 Vind 109 Vindhttps://vindlog.com/
8 满心 100 满心https://zhoutian.com/
9 大致 99 大致https://pewae.com/
10 皇家元林 97 皇家元林https://hjyl.org/
11 刘郎 94 刘郎https://vjo.cc/
12 网友小宋 92 网友小宋https://xyzbz.cn/
13 紫慕 85 紫慕https://90zm.net/
14 全局变量 76 全局变量https://ilogs.cn/
15 XIGE 69 XIGEhttps://www.shitoucuo.com
16 粽叶加米 69 粽叶加米https://www.wordpace.com/
17 LiuShen 67 LiuShenhttps://www.liushen.fun/
18 文案姐笔记 65 文案姐笔记https://www.5186a.com/
19 ymz316 57 ymz316https://hollowman.cn/
20 keyle 55 keylehttps://vrast.cn/
20 Jeffer.Z 55 Jeffer.Zhttps://www.jeffer.xyz/

代码地址:https://gitee.com/obaby/baby-wp-data-analysis-tool

去年的访问统计:

博客数据也就是这个样子了,不知什么原因,各大搜索引擎并没有多少来量,所以,有就有没有就没有吧。毕竟这个东西不是生活的全部,兴趣爱好玩成了这个样子,好坏其实都没那么关键。而至于生活工作什么的,越来也没追求了,降薪、降职,早就成了常态,不在其位不谋其政,有段时间一度以为可能要离开了,自己也没想到还能再坚持这么长的时间。

古人说的好,好死不如赖活着,至于底线这个东西,现在所剩也不多了。以前的时候总是说,再怎么样就走了,现在即使这样了都没走。也觉得自己挺没羞没臊的。只是目前还有份工作,还能每个月拿到点工资,似乎也将就的过去,得过且过。

人生这个东西,对我来说从来没什么一帆风顺,这两年变相的再走下坡路了。不过,到现在的职级,应该也算是到底了。现在依然没了任何的管理职能,其实也蛮好的,做好自己的东西就完了,剩下的也不是自己该去考虑的。公司让再研发中推广各种 ai 的使用场景和频次,当然,目的也很简单,只是,当被这种毫无技术难度的琐事困住的时候,不应该每天只去处理这些垃圾。也该去做点别的事情,至于工作的事情,每天做好份内的事情就足够了,毕竟这不是你的事业,他们也没想让你把这个东西当成自己的事业来干。

元旦前还有另外一件事情也搁置了,那就是 google playstore 的上架,节前折腾了一段时间。最后因为忙于开发新版本,这件事情也就再也没了跟进。不是不做了,只是时间也的确有限,捉襟见肘。每天晚上去开发一些新的功能以及测试修复 bug,就花掉了很多的时间。当然,家里的效率要比在公司高很多,毕竟两块 4k 分辨率的显示器能解决频繁切换窗口的问题。公司项目,也仅仅限于在那块 13 英寸的 mbp 上进行开发,速度慢就慢吧。

严格意义上来说,自己不算是一个合格的产品经理。一不会用各种产品经历的工具,二不会 ui 设计,所以一直到现在闺蜜圈都没有一个好看的 ui。总觉得也是做出点改变的时候了,元旦前开始重新设计和调整整个 app 的色调,ui 以及各种图标。到目前为止个人感觉稍微好看了那么一丢丢,也加入了一些新的功能,包括自定义背景等等。

元旦假期哪里都没去,偶尔带着宝子附近的公园转转,剩下有时间就改 ui 设计图标,写代码。早上也没有太多的事情,睡到自然醒,有时候能到九点多。好长时间没睡到自然醒了。晚上就是运动,节前又请了一天假,为了达成运动目标,31 号跳了一万个绳,剩下几天也是坚持每天达成一万步,因为出去走的少,就只能靠跳绳补上了。

当然,还要抽时间跟华为的应用市场 battle,已经来回三个回合了,都以自己战败为终,这几番折腾下来已经快一个月时间了。

之前为了能在华为应用市场上线 AI 助理的功能,重新申请了应用安全评估,做了手机号验证等功能。现在被驳回给出的答复是,AI 功能,需要进行实名认证,现在任意账号注册就可以使用。然而,我在审核说明已经写了,ai 助理需要验证手机号,虽然能看到但是不能用,需要先验证手机号。

但是,我的解释是徒劳的,他们就认准了这一点,所以下一版发布的时候,华为市场的应用只能强制先验证手机号了。在这种 boss 战中,自己没有任何的优势,甚至连招架的能力都没有,只能听之任之。

而至于 ai,目前还有另外一个想法,基于当前数据使用机器学习来计算预测经期,只是现在还差的有点远,还得继续优化:

虽然做的工作很多,却并不知道最后的结局如何。一切都是未知数,坚持的理由,说来也简单:一件事情一旦开始做了,总是想着能做好。虽然跟其他的所谓的头部的应用比有差距,目标总是有的,做最简单最易用的。之前也想着添加个开屏广告什么的,然而,这个东西加上了的确影响体验,更何况现在没几个用户,加了这个广告挣个几块钱的广告费,不够恶心人的,只能说恶心效果大于实际意义。

现在开发的进度也的确像一场游戏,有的时候真的是能让人破防。这几天在调试 ios 的 iap,uni 官方的文档就那么几行代码,如果说基于那几行代码来实现功能,必然是会失败的。然而,网上关于 uni iap 的问斩又异常的少,偶尔搜到那么一两篇也没什么大用,所以,可能是很多人都在这地方卡住过,但是却从来没有人来说过这些问题。

如果说,25 年最成功的也就只剩下减肥了,从年初到年底一共减掉了 30 斤。减肥的动力来源说出来也的确可笑,一个是为了健康,另外一个主要的原因是为了拍写真。拍写真可能不需要真的能够很瘦,毕竟,都是可以通过修图来实现的。甚至,现在都不需要去拍了,直接找个图片换脸,或者直接 ai 生成效果反而可能会更好。

年初的时候,为了让自己看起来瘦一点,甚至还用过束腰,当然这个东西只是一时捆着有用,放开了之后还是原来的样子。现在,不再需要用这个东西,也能把自己塞到影楼的裙子里了。

去年的时候拍的,当然这个肚肚是 p 过的(p 小了点)。现在甚至能隐约看到锁骨了。

今年,目标不再是 30 了,只需要能再减 20 就可以了。

又何苦在意太多,人生不过是一场 rpg,总是要不断的打怪升级,更何况现在支线任务的 boss 依然出现了,减肥和继续开发推广闺蜜圈。

至于主线任务,现在完全看不清楚,只能走一步看一步,毕竟从来也没办法一条道走到黑。随机而变,伺机而动才是常态。

真正的冬天

作者 obaby
2025年12月29日 13:48

已经很多年没见过那种漫山遍野,银装素裹的景象了。现在的冬天,似乎也没有小时候的冬天那么寒冷,偶然那么一两场的降雪,翌日太阳升起的时候,也就是积雪消融之时。

上周一请假一天去拍写真,剩下的年假依然还有两天,这两天假期转眼间也就要过期了。而对象的假期就更多了,足足还有六七天,于是周四请假之后,她就得到了一个超长的假期,加上元旦,足足有十来天。今年乱七八糟的事情实在太多,也没怎么带宝子出去玩。现在一个人有了超长的假期,既然自己也还有两天,于是周五也请假了。

周四下午下班回家路上,开始合计这几天时间干嘛,在家躺着总是少了些乐趣。一入冬宝子就嚷嚷着想去滑雪,既然如此何不直接奔向东北?哈尔滨零下三四十度的寒冷,自己大概率适应不了,退而求其次,想长春应该是可以的。从小姨家接上宝子回家,路上商量着去哪里,一路到家还没一个结论。

这个时候,能玩的地方要么去南方,要么去东北。只是去南方路上就得废掉一天的时间,还是去东北更合适。打定主意去长春之后,对象开始买往返的机票,自己去一嗨租车。想着东北的路况总是有些难行,最后选了雪地胎的探岳,只是价格比普通轮胎的车辆贵了60块钱,最终,单天的租期算上保险各种乱七八糟的费用,加起来960。对象说,这个价格打车三天都够了。如果这么一算,还真可能比打车贵,毕竟这只是租车的价格,还有邮费,高速费等各种费用没算进去。

一切准备妥当,给宝子请假。这突然的决定,宝子虽然有些猝不及防,却是异常的开心雀跃。只是课本和同步练习册都没带,这个时间想回学校去拿已经不可能了。只能等问问作业,让同学的爸妈帮忙拍照的,到时候打印出来先做着。

早上七点多的飞机,四点半爬起来从家里开车往机场走。流亭机场搬到胶东之后,距离远了太多。路上至少得留出一个小时的时间。往北飞可能也是因为气温低吧,空气异常的清澈,海拔八千米的高空竟然能看到地面的皑皑白雪,仿佛到了冰雪王国。落地之后跟随取车指引,去门店取车。简单验车,确认油量之后就可以开走了。启动之后发现车机支持carplay 和carlife,折腾半天,发现不管是carplay还是carlife根本都连不上,折腾十几分钟无果之后,问门店的小哥,小哥说,在底下车库连不上。

开车从地下车库出来,路面是厚厚的积雪和冰层。从底下车库出来之后,折腾半天还是连不上,此时才想起来,这链接carplay和手机信号有毛关系,这小哥纯粹是瞎扯。又折腾半天终于连上了,然而,比较诡异的是播放音乐有声音,但是导航没声音,不管是高德还是苹果自带的导航都没声音。就这样无声状态下总算是把车开到了万达,这是这车开起来也异常辛苦,油门踏板行程有七八厘米,刹车踏板行程只有一两厘米,油门踏板异常轻盈,刹车踏板不用力根本踩不动。不知道是途昂的调教就是如此,还是只是这辆车是这么个调教。尽管是雪地胎,在路上起步的时候依然能感觉到车轮打滑,这算是新的驾驶技能get了,与平时的开车体验完全不同。

去酒店办理好入住,下午行程是冰雪新天地,门票还是挺贵的,两个成人530,一米四以下的儿童免费,宝子不到一米四正好也就省了一张门票的费用。导航到停车场,确没几辆车,只有停在路边的一辆车在卖手套帽子等各种用品,停好车大哥主动搭话,问买票没,多少钱。说了价格之后,大哥表示两张成人票450,剩下的钱买点吃的不好吗。一番交流,大哥说,咋滴,东北人都这么爱骗人啊?没事,你加我微信,我把二维码发给你,你们先进,进不去给我打电话就行,问题的话就说是旅行社的票。

转了票钱,又要了两个滑雪用的塑料板。大哥说,开车继续往上走,这里离入口还有段距离。上车又开了一段距离,才到真正的入口。找停车位的时候,路边一个大哥指挥,往这里停。最后发现车头还在外面,大哥去后面把自己车开走了,穿着安保支付的另外一个大哥继续指挥倒车。愣是给让出来一个车位,当时内心多少是有些蒙的,对象问,『这咋还给让了个车位,不会单独要钱吧?』

『不至于的』我答到,停好车锁车。继续有人人买票没,答从下面那买了之后,那人说,价格差不多,都这样。

沿着台阶上去,路边是两排雪人,这才是冬天正确 打开方式吧。

只是,这些雪人都有些不大美观了。

超级巨大的雪人,真的好可爱啊。之前从来没见过这么大的雪人。这个小表情也蛮有意思的。

单是入口,就已然让很多小朋友在这里驻足不前。扫码检票进入之后,依然完全置身于冰天雪地之中。一侧是巨大的雪墙,上面是雪漂流的的滑道,然而,一米四以下的儿童不让玩,自己也就放弃了这一项。

另外一侧就是各种巨型冰雕,白天看,除了巨大,似乎也没有太多的其他的感受。

雪屋还在开凿,很多地方还在修建,似乎并没有完全准备好。

不过,等到了晚上之后,就是另外一番景象了,到处色彩斑斓,让冰冷的雕塑,也变得似乎有温度了。

可能还是因为是工作日的原因吧,游客并不是非常多,所以多数项目也不需要长时间排队,整体的游玩体验还是蛮不错的。只是票价稍微高了点,按照我的理解,一百到一百五左右性价比就非常高了,毕竟内部还有很多其他的消费项目,本来想玩卡丁车漂移的,但是260五分钟,却是贵了些。

离开的时候,换了对象的手机连carplay,这次竟然导航有声音了。这尼码就贼离谱,为啥自己的手机不行,可能是ios26的兼容性问题,或者说大众的车机问题。我怀疑大概率是大众的车机问题,毕竟自己的手机连粉皮没问题。而且即使如此,每次能不能连上carplay完全靠运气,实在连不上就只能用手机导航。

虽然,看起来有三天时间,但是,实际上能玩的时间只有两天多一点,毕竟这里的天黑的太早了,四点多就天黑了,而每天早上起床就八九点,吃点东西,剩下的游玩时间依然不多。

晚上睡觉的时候,对象说我臭了,我也闻着有点臭,但是又不知道是哪里来的臭味。玩了一天,的确是太累了,也就很昏沉沉的睡过去了。

第二天安排的是滑雪,净月潭的确是个不错的选择,门票加三小时滑雪票68块钱,正常单滑雪的价格三个小时也得七十左右。并且可以开车进去,四十块钱的门票钱就可以开车进去了。

再往前走,路过丛林深处,从树冠上透下来光束,让这林间美景有了另外的一番光景。

公园里,漫山遍野白雪,压在松枝上,的确冬天的景象。在老家,少能见到这种景象。湖面上有四驱车拉着雪圈转圈,这个我的确不喜欢,宝子自己去转的,50块钱。

雪地摩托的价格跟卡丁车的价格差不多,最终也是放弃了这项活动。来到滑雪场的时候,人依然不少了,传送带排了个长长的队伍,不过好在行进速度还是不错的。 

这滑雪场的雪,真的是雪,与青岛的滑雪场比起来,云壤之别,青岛的滑雪场需要造雪机不断喷洒,而这里,完全不需要人工造雪,并且学上没有任何的冰。虽然是初级雪道,坡度和长度,比青岛的也要更加的陡峭和绵长。

录像的时候戴着手套无法解锁,但是不戴手套太冷了。就录了一段视频,宝子跑的太快了,没跟上,前面还有各种障碍,的确不容易。

虽然是三个小时的时长,实际上就滑了一个半小时。对象说从上面滑下来的时候飞出去了,后面一趟三个人一起往下话,不断指挥下,总算是有惊无险的滑了下来。最后几趟就只剩下自己和宝子了,滑雪场的人到了下午也越来越多了,坡道上满是教练和学员。也是时候去往下一个地点了,看了下运动记录2.5km。

房子后面的挖掘机还在构建学滑道,似乎所有的景点都还在不断施工,可能等元旦就会有无数的南方小土豆涌入吧。

入口的女神广场,直到走进了才发现女士省趴着的,怪不得远处看怎么看都看不到女神的影子。

结束之后,直奔下一个地点,这有山。据说里面真的建了个山城的模样,这长春的交通,各种拥堵,于是导航规划了各种小路,有的地方刚刚能通过。从底下停车场上来,并没看到山的样子,一层层往上走,才初见雏形。

麒麟臂的招财喵,就问你,招不招财吧?

听到传来琴声,仔细聆听,正是那个开窗的屋子。

整个商场逛下来,卖各种小玩意儿的店居多。当然,还有一个全是财神的财神店。

祝愿看到文章的宝子们,马年都能发大财哦,都能暴富,财富自由!

登顶之后,整个山城的轮廓就全部展现出来了,也有不少人在拍照打卡。

晚上回到酒店,给包子找人要周末的作业,弄到一个pdf文档中准备明天找个打印的地方打印出来,在飞机上赶赶作业。

宝子在床上本来蹦去,结果躺了会儿跑了说,有一股臭味。自己又跑到穿上去躺了会儿,果然一阵阵臭味袭来,感觉像体重压在床垫上,从床垫里挤压出来的味道。

打给前台,不一会儿一个姐妹上来,问了下具体的情况。她把床往外脱了以下,问了下说:『没问到味道啊,不过进到屋里的时候,的确闻到一股怪味』。

说完,继续往外推床,开始翻看床垫。在她推床和翻床垫的时候,我甚至脑补了一场在床垫里发现女尸的戏码。不过好在最后也没发生,但是,找不到臭味来源这件事情我忍不了。于是我躺在床单上,来回弹了几次,隐约又能闻到味道了。让她趴在床单上闻,她说:『是有味道』

后来一想干嘛隔着床单问,直接把床垫上面的褥子和床单全部掀起来,这下瞬间臭味弥漫开来,充满了整个房间,现在再让她去闻。都不用趴下去了。

因为这床垫诡异的臭味,自己还背了一晚上黑锅,自己也一度以为是因为第一天没洗澡自己臭了,但是今天刚洗完还有臭味就完全匪夷所思了。这下总算是找到了罪魁祸首。重新给换了个房间之后,终于算是再也闻不到那股诡异的臭味了。

早上醒来,已经又到了八点多,坐公交车去永兴市场转了一圈,其实也不知道买什么就是溜达溜达随便看看,摆摊的大姨说:『你看着外地的游客,光走道,也不问问啊。买不买不要紧,倒是问问啊……』

还有卖帽子的,各种厚衣服的,从边上走过的时候,听他们在询价,狐狸毛的帽子350,兔毛的150,这么看来,这防寒的装备还是蛮贵的。现在自己就穿了条加绒的光腿神器,上身是毛衣加厚羽绒服,并没有戴帽子,也没围围巾,不过宝子是全副武装的,包裹的很严实。

进店里,吃一份十块钱的羊杂粉丝汤和牛肉烧卖,早餐就算是解决掉了,最后买了两个冻梨,一个冻柿子。

回到酒店,把整理好的东西找个打印店打印出来,打印的时候看着那岁数都快赶上自己的打印机,不禁对打印效果产生了深深地怀疑。一块钱一页,十张作业正好十块钱,多要了两证空白a4纸,又多花了五毛。

收拾停当也该退房了,办理退房手续,准备出发,去每天都能经过的那个公园转转。车子被快递小哥的车子堵的严严实实的,只能等他们走了之后才能下马路牙子。在长春这个地方,感觉很多停车为都是在马路牙子上随便找的,导致现在开车看哪里都是停车位。

公园里,依然是各种雪雕冰塑,冰滑梯还是孩子们的最爱。

走到公园里面,原来的湖面,现在已经成了一个游乐场。门票两大一下88,还是蛮合适的,买票带宝子进去继续疯玩。

不过在宝子玩那个充气的球子的时候,为了推她,一步小心直接摔倒了冰面上,右胳膊肘直接着地,带着是右侧身体的剧烈疼痛,好在穿的比较多,应该无大碍。边上的大姐看到了喊到:『哎吆吆吆吆,这一下摔得,还能起来不?』

我尝试起了以下,那黑色的冰面异常的光滑,差点又摔下去。不过好在最终有惊无险站起来了。

这玩了三天啥事没有,结果这临走了来了这么结实的一下。

往停车场走的时候,看到了广场前面的糖葫芦树,竟然是真的,扫码自取。

驱车到机场的时候,已经快四点半了,还车一切手续办理好,时间刚刚好。

飞机平稳之后,让宝子开始赶作业。此时才发现,打印的东西质量太差了,很多都没法看。只有一页数学还算勉强能做,做一点是一点吧。

给宝子拍了一张写作业的照片,旁边的姐妹也给宝子排了一张写作业的照片。这,在飞机上赶作业的小朋友的确不多吧。

不过虽然折腾了不少,但是实际做了就一页内容,晚上回家重新打印作业,用ps把上面的内容扣掉,然后打印出来再做,对比下效果就会发现,一块钱一页打印的内容,黑色区域连算式都看不清楚(左侧是我重新打印的),怎么做?

白扔了十块钱,好在宝子最终十一点作业终于做完了。

当然,这不是宝子的问题,这心血来潮的决定,多少有些出乎意料。人生何须如此多的规划,有些时候放肆一下又何尝不可。

永夜

作者 obaby
2025年12月23日 12:14

早上醒来,窗户投进来微弱的亮光,虽然没有拉窗帘,但是透入屋里的光线依然少的可怜。从床头上把手机拿下来,看了下时间六点三十分,自己醒来竟然比闹钟还早了十分钟。漫漫长夜在这一瞬间更加的具象化了。

窗户上挂着点点雨滴,想站在窗台想东面望去。路口的红绿灯的绿色灯光穿透过来,屏幕上跳动着绿色的数字。烟雨蒙蒙,确丝毫不影响那灯光的亮度。在凛冽的寒冬中,竟然下雨了。连续几天的降温,感觉多少有些感冒症状,晚上睡觉之前想找几包三九感冒灵,翻遍了药箱却没找到任何的影踪。倒是翻出来不少已经过期的药物,百灵银翘片、感冒胶囊之类的。

前几天翻了下自己的年假使用情况,发现还有几天。转眼已经年底,这几天假期如果不用,过几天也就过期了。而这几天假期也是在不知道干什么,既然马上就要元旦了,而过后用不了多久也就新年了。想着再去拍套新年风格的写真,有人问有没有旗袍风格的写真,之前的确石没什么拍过。其实不但是这种,很多风格都没有尝试过,也包括秀禾服。之前很少尝试这种风格,主要的原因在于体型真的不好,虽然靠修图能修掉大部分的问题,然而,全部都靠修图,这不是我想要的。

减肥事业到了现在又已经在一个数值上卡了很久了,如果要有什么新的变化,也只能从16年开始了。昨天拍照的时候,化妆师小姐姐说感觉又瘦了点,实际上体重却没有任何的变化,也可能石长期的运动,已经转化为肌肉了。

看到很多人已经开始写年终总结,各种app也开始陆续推送年终总结。每年年底的这个东西,也的确增加了仪式感,看着自己这一年在这些app上花费的时间。这些时间也让自己的生活变得不在那么枯燥,只是,这一年过的似乎太快了,仿佛25年刚开始就已经结束。看着没什么变化的生活, 做着没什么变化的事情,日复一日,年复一年。跟墙上的挂钟一样,一圈圈的转着,毫无波澜,偶尔没电了,会停留那么一会儿,等换上新的电池,又开始昼夜不歇的奔波。

太多的时候,并不清楚自己写的这些所谓的文章有什么意义,最该感谢的还是各位宝子的捧场。让这些冰冷的文字,在那么瞬间有了人气,有了温度。写作,更多的时候是害怕自己失去了阅读的能力和表达的能力。经常看到有人发评论说我无处不在,这其实也算是一种习惯,阅读别人的生活,感受他人的情绪,这种能力对于很多人来说都是不具备的。在短视频泛滥的今天,其实我也刷,但是也仅限于刷,要说沉迷,算不上。更多的时候我还是喜欢阅读,读一些别人的文章,生活,体验,技术,乱七八糟的什么都看,当然,更重要的是,我看过了,但凡能评论的我都会评论。

其实相比与博客,我更希望的是能把闺蜜圈产品做好,自然,产品的改进也离不开宝子们的支持,以及提出的修改建议和bug 。翻看开发的历史,从24年初开始到现在竟然已经快两年时间了,期间虽然也陆续开发和加了一些功能,但是多数时候都是沉寂状态。连抄作业都没抄好,前段时间再去看竞品的时候,才发现很多功能依然不是自己最开始抄的时候的样子。

以前之所以长时间沉寂一个主要的原因在于之前的时候,代码都是自己一点点写的,要想做快速开发,体力真的跟不上。直到今年开始使用cursor之后,状况稍微得到了改观,一些重复的代码可以不用自己编写了,甚至一些新的功能代码也不用自己亲力亲为了,鸿蒙next的适配多数都是cursor的功劳,实现和修复了多数的vue2向vue3迁移的问题。 

哪怕今年以前,甚至这两个月之前,国内的个人开发者都是狗都不如的角色。从自己开始做第一款app,findu的时候上架国内的应用市场就面临各种限制,那时候小米还允许个人开发者,ov 是禁止个人开发者的。时过境迁,现在情况又变了,闺蜜圈最开始上加的应用时长:苹果、华为、QQ手机助手、百度手机助手。

就在这两个月自己忙着上架鸿蒙原生市场的时候,vivo也主动联系了,协助上架了vivo的手机时长。oppo开放了个人开发者的权限,在oppo上也顺利上架了,虽然是个阉割版,没法使用ai助理功能。google的还需要继续测试,这几天依然没有抽出时间,三星的卡在杀软测试的google 误报上。

小米,依然不待见个人开发者。时过境迁,似乎,这也似乎也没那么黑暗了,甚至能隐约看到一丝丝的亮光了。只是,很多的推送权限尚无法申请,只能等待下一步的放宽。

人生,有时候也挺无聊的,不过偶尔看短视频也能发现一些好玩的东西。比如,这款莱觅的丝袜。

别的不知道,只是这价格,真的好感人。只能留下贫困的泪水。

既然未来不可知,何不肆情於倾宫,纵欲於永夜。

西西弗斯的巨石

作者 obaby
2025年12月17日 13:02

西西弗斯,推着那块圆溜溜的巨石想山顶移动,然而,在不久之后,这块巨石就会重新滚下来。西西弗斯不得不再一次网上推动这块巨石,就这么永不停歇周而复始。

有时候觉得西西弗斯挺蠢的,这巨石如果滚了就让它滚了吧,何苦一遍遍的去重复这样的动作。然而,再想想,自己似乎也和西西弗斯没什么区别,明知道喝多的事情可能没有结果,但是却还是不断的坚持,这种坚持与其实说想要个结果,不如说是不认命的一种抗争的态度。

想要做点东西,也的确是困难。关于独立开发者,之前已经写过很多了,举步维艰,到处都是坑。每次版本更新,提交之后都是各种忐忑不安,最主要的问题在于审核的时候不知道这个审核员是不是与之前一样。很多时候,基础功能没有太大的变化,但是稍微修复个 bug 等来的就是被驳回的命运。

这两条,其实这次更新并无变化,新增的页面与当前两项驳回的理由也毫无关系。然而,这种审核机制在于不同的人可能会处于不同的原因和审核力度去考量,最终就是这种结果,这次成功了,下次可能就失败了。

除了苹果,国内的也差不多。

驳回的理由看着简单,但是要解决这些问题却异常的困难,这西西弗斯的大石头,有时候真的是无懈可击。除了应用市场的各种规章制度,还得满足有关部门的各种要求。有的要求看起来很简单,但是面临的是一次次的不通过。

这东西,比西西弗斯的大石头还要恶心,最终的结局就是一次次的掉下来。当然除了这些失败的,也有偶尔那么一两条消息能让人稍微振奋一点。前几天收到 oppo 的邮件:

尝试重新注册了一下,发现个人开发者依然不能发布 app,尝试与支持团队联系之后,得知可以提前走预发布通道。并且拉群进行了协助处理:

在经过这十来天的相关资料的准备,提交审核之后,昨天晚上看了下 app 已经能在 oppo 的应用市场搜到了:

注册魅族应用商店,想着发布 app 的时候,提示已经存在了,可以认领。这都省了自己发布的流程了:

然而啊,这大石头,依然还有好几个在谷底震荡,google play,三星,等等,推着这巨大的石头去爬别人的山头的确不易。

本来想让 ai 生成个类似西西弗斯推石头的图片,结果给了几张都不理想:

第一次这明显是摆拍的效果。

第二次,嗯,有点意思了。

当然还有一张:

这个好啊,往悬崖边上推,挺好的,推下去,一了百了。

月亮还是那个月亮

作者 obaby
2025年12月15日 10:48

周五晚上的一场雪打乱了原来的计划,原本是想周六回去给老太太过生日的。周末的好处就是孩子们也可以跟着一起去,这样更热闹一些。然而,周五晚上看到姐姐在群里说,老家下雪了,还挺大的。

我拉开窗帘,看出去,外面的路灯散发着黄色的光,照在路面上,没有任何下雪的迹象。后来在群里看到他们发的满天飘雪的视频,鹅毛大雪纷纷扬扬的落下来,地面上已经白茫茫一片。

打开 e 高速看了下路况,所有的收费站目前都还开放。给姐姐们打了个电话询问下具体的情况。

三姐在纠结到底要不要通知下饭店,把预定给取消掉。我的意思是是等早上看看吧,回不去的概率不大。如果到了早上真的高速都封闭了,在说回不去的事情也不迟。

大姐道,哪怕明天路上没法走,坐火车也得去。既然这么说了,那也不好再说什么。

跟三姐又沟通了最后的决定,那就是不管怎样,如果不能都到,那就来多少人去多少人吧。

一聊醒来,天已经亮了。地上薄薄的一层雪,看了下路况还算不错,最起码市区没任何问题。最近的高速路口依然开放,穿好衣服去买点早餐吃完就出发。高速上虽然有积雪,但是好在应该是撒过盐了,并没有结冰。中控屏显示的车外温度稳稳的定格在 0 度。随着离青岛越来越远,温度也逐渐开始下降了,出了市区温度到了-1,路况就更加恶劣了。远远的看到一辆黑色轿车横在中间两个车道,没有开双闪。

缓慢减速从最外侧车道超过去之后,让对象替事故车司机打个报警电话,通知下情况。然而,听着手机等待的提示音,响了断,断了响,在打了四五次之后也没接通,不得不放弃。或许过会儿自己就能自己报警了吧。

偶尔需要变道的时候,压到地面车道线中间的黑色区域的时候,车子竟然侧滑了一下。这时候宝子来了一句:“不会咱们也撞了吧”

“闭嘴,少胡说八道”我赶紧让她不再说话,小朋友说话有时候就是这么口无遮拦。这种路况下开车异常的耗费精力,左手紧紧的握着方向盘,生怕出任何状况。

在转到济潍高速之后,路况就变得更加恶劣了,桥上能看到明显的积冰,在车辆的碾压下沿着行车轨迹,形成几条长长的沟壑。只能在降低车速从中间谨慎通过。

终于在两个半小时后到了老家,停好车,发现门口异常的冷清,只有那只小傻狗屁颠屁颠的迎了过来,走到门口才发现大门紧闭。打了个电话问了下发现已经都去酒店了。调头往酒店赶,20 分钟的路程,村里的道路比比省道的路况更差,能明显感觉到车身在不断的侧滑。

到酒店停好车,此时才发现车牌上已经是厚厚的一层冰了。到包间发现所有人都到了,差不多每年都是这些人来给老太太过生日。没有太多的变化,只是这一年一年哪怕是老太太的兄弟姐妹沟通的话题也少了很多。有时候坐在一起也竟然找不到同样的话题,找不到该说些什么。她在自己的世界里沉寂的越来越深,这些年的事情也开始变得真真假假虚虚实实。

只是每天还会喝半杯白酒,对于这种场合自然会喝的更多一些。尽管高血压,也不知道该怎么制止她这种行为,当然,相比高血压更让人绝望的是老年痴呆的症状也越来越明显了。话题总是离不开那几个,她年轻时候的事情,以及眼下的事情。中间那么多年似乎已经没有任何的印象了,就那么凭空消失了。

很多人在她眼前刚出现过,转眼就忘了。坐了会儿,我过去给她倒酒,听到二姐说,她刚才又在问瑶瑶来没来。这不眼下刚看着,现在又开始到处找。

喝到高兴处,老太太难免也会唱一段。她现在最喜欢的就是京剧,家里的电视不管什么时候都在戏曲频道。现在每个人都有手机,也没人想着去看电视或者调台,就这么一直演,从早到晚,从不停歇。偶尔,跟她坐一起,她还会给讲下当前唱段的故事情节。

中午饭局结束,来吃饭的亲戚就直接走了,并没有在跟着回家。到家,宝子自然还是跟她的小姐姐一起疯。怕晚上路上结冰,下午也不敢走太晚,临近四点了跟宝子说要走了,宝子不高兴。我就给出了个主意,让她自己在这里跟小姐姐住一晚,自己和对象会县城去给租客办下退租。达成简单的协议之后就得赶紧走了。

到了县城已经是天色渐暗,路上又开始结冰了,车子在路上滑来滑去。而能回到家的前提是得先去找三姨拿家里的钥匙,早上出门上了高速才发现没带家里的钥匙。所以最后的希望就都落在了给三姨的备用钥匙上。路上买了点零食吃了点,晚上回到家,对象看电视。我拿出电脑来看下所谓的证书失效的问题,折腾了半天 eo 始终无法获取证书,尝试使用腾讯云的证书申请,依然报错,最后给了句不支持这个后缀。

期间也试了阿里的,也是一样的错误。猜测应该是某个免费证书颁发机构屏蔽了 by 后缀,acme.sh 也是一样的。默认的ca 机构是 zerossl,尝试换了 lets encrypt 解决了这个问题。

一夜相安无事,早上等物业上班,去问下租户有没有交物业费,物业拉的单子从 25 年开始就没交过。而租户不想再租的原因是,楼下的一个大妈天天在自己的主卧阳台上撒尿,现在她住的那个房间一股尿骚味,下去找也没用,反而还天天找租户,嫌走路声音大太吵。对于这种邻居也确实没什么办法。

第二天把备用钥匙给送回去,买点吃的。再回去接宝子。到家之后发现他们还在玩仓鼠,她们把仓鼠放到了纸袋子里,让仓鼠在里面疯狂的挠。不一会儿出去玩雪了,让我给它拿着两个纸袋子。我坐在沙发上拿着纸袋子刷手机,老太太又问了一句:“你四叔说县城那边要拆迁,说给很多钱,你们那里拆不?”

“那里拆迁?那边现在就都是拆迁过的,哪还有拆迁的地方?”我答道。

如果说城西拆迁,那应该是五六年前的记忆了,那时候县城西面还是村子,现在那些村子早已经不复存在。她的记忆线也开始混乱了,分不清这件事情发生在什么时候,记不清这最近几年到底发生了什么。对于其他的人的记忆变得都异常的模糊。有时候也会出现一些凭空的臆想,或者错乱的记忆。前段时间说,那天在西村看到前面已经死了的淑红了,说让她去社区医院查体。

淑红是我的幼儿园老师,前几年因为癌症去世了。这现在又这么可能会见到淑红?又过了几天老太太又说,在镇上遇到淑红了,说让她去查体。

当二姐说,你前几天说的还是西村,现在又成了镇上,肯定是你看错了。

“我哪里说是西村了?我什么时候说了,我没说!”老太太立即开始抗辩。

这种固执的性格这么多年倒是似乎没什么变化,现在尽管记忆不清楚了,但是这种固执的性格似乎也没太大的变化。只是,这样一来,大家就都很难和她交流沟通了,有时候想跟她说点事情,说完之后马上就忘了。太多事情,不管大事小事,都没有躲过被遗忘的命运。最终,在她的世界里存在还是几十年前的事情。自己的世界越来越封闭,于外界的沟通越来越少,就这么循环下去。

这一年一年过得太快,这似乎还什么都没做,一年又过去了。人还是那些人,不过距离感觉变得更加的疏远了。呆在一起的时间越来越少,沟通的时间越来越少。

孩子们无忧无虑的在一起疯玩,并不会因为老人的状态而受什么影响。毕竟,这些也不在他们的考虑范围之内,衰老对他们来说太遥远。

孩子们在一起玩的时候总是没有玩够,晚上睡觉的时候,宝子开始哭。问为什么她也不吱声,最后才知道原来是跟她小姐姐一起睡觉的时候,她小姐姐听鬼故事。问她听的什么鬼故事又说不出来,那种类别的也说不出来,哼哼唧唧哦掉了半天眼泪。

终于最后开始给我复述她听到的鬼故事:

在一个十字路口,一个女老师骑着电动车过路口的时候被车撞了。

头发卡到了车轮里,人被拖行了很远,半张脸都磨没了。

司机开车跑了。

后面连续几天,都有人在那个十字路口看到这个女老师的鬼魂。

这种鬼故事,其实想想挺可笑的,但是毕竟孩子,宝子之前并没接触过这种东西。所以害怕到时也情有可原,我只好发动各种说辞,从庄子《逍遥游》《西游记》一直扯到犯罪现场调查,法医取证。绕了无数个圈子才把这个恐惧给她去除掉。

以前住在那个老房子里,晚上在昏暗的灯光下,也听老人讲各种鬼故事。那时候自己也真的害怕,晚上一个人走夜路的时候,难免也会一边哭一边往家跑。

只是,现在老房子已经不在了,故乡也不再完全是记忆中的样子。

一键资源地址替换工具 — UniApp发布小程序体积精简

作者 obaby
2025年12月14日 09:22

闺蜜圈 小程序版本一直落后很多,之所以没更新主要的问题在于 uni 打包小程序之后体积太大了,体积大一个原因是组件压缩到了 vendor.js 中,一个文件就到了 1.1m(主包限制大小2048kb)。

 

图片文件也有1m 左右,再加上其他的一些组件,主包的体积到了 4 m 左右。

虽然已经启用了分包,但是没啥效果,包括代码压缩组,所以最后发版的小程序靠的是压缩图片文件。

让 cursor 尝试写了个优化代码出了各种错误,最后决定采用将图片资源直接网络加载的方式来缩减体积,这样1m 的图片资源就不需要打包在本地资源中了。

本地资源文件都是通过 127 的地址来加载的,将资源移动到服务器之后,修改小程序资源地址之后:

此时加载的图片可以看到是从 cdn 加载了,

并且资源包大小已经基本可以忽略不计了

要实现上看的效果也简单,将static 目录上传到服务器,执行修改工具,修改资源路径删除本地资源。对于 tabbar 的图片不能通过网络加载,需要添加到排除列表,hbuilder 发行小程序后执行修改工具。此时基本就 ok 了,2.06mb,缺的那一点稍微弄一下也就解决了。

工具代码:

/**
 * 将打包后产物里的 /static/** 路径替换为 CDN 前缀。
 * 目前是替换为 https://cdn.guimiquan.cn/ 前缀。
 * 使用方法:
 *   1) 先发行构建微信小程序,生成 unpackage/dist/build/mp-weixin 或 unpackage/dist/dev/mp-weixin
 *   2) 执行:node cdn-rewrite.js [--mode=dist|dev] [--remove-static]
 *   3) 在 dist 内搜索或用开发者工具 Network 确认已变成 CDN 域名
 * 
 * 参数说明:
 *   --mode=dist   : 处理生产构建目录 (默认)
 *   --mode=dev    : 处理开发构建目录
 *   --remove-static : 删除本地 static 目录(排除配置的目录和文件)
 * By: obaby
 * Date: 2025-12-12
 * Version: 1.0.0
 * https://oba.by
 * https://h4ck.org.cn
 * ------------------------------------------------------------
 */
const fs = require('fs');
const path = require('path');

// CDN 根路径,末尾带 /
const CDN = 'https://cdn.guimiquan.cn/';

// 路径配置
const DIST_ROOT = path.resolve(__dirname, 'unpackage/dist/build/mp-weixin');
const DEV_ROOT = path.resolve(__dirname, 'unpackage/dist/dev/mp-weixin');

// 处理的文件类型
const ALLOWED_EXTS = new Set(['.js', '.json', '.wxss', '.css', '.wxml', '.html']);
// 跳过的文件(app.json 里的 tabBar iconPath 不允许 http/https)
const SKIP_FILES = new Set(['app.json']);

// 排除删除的目录(相对于 static 目录)
const EXCLUDE_DIRS = [
  'tabbar_icons',  // tab栏图标必须使用本地文件
  // 可以在这里添加更多需要排除的目录
];

// 排除删除的文件(相对于 static 目录,支持 glob 模式或完整路径)
const EXCLUDE_FILES = [
  // 可以在这里添加需要排除的文件,例如:
  // 'tabbar_icons/**/*',
  // 'custom-icon.png',
  'icons/record_love_add.png',
  'icons/calendar_icon_project_start.png',
  'icons/calendar_icon_project_end.png',
  'icons/calendar_icon_project_start_invalid.png',
  'apk_emotion_2.png',
  'apk_emotion_1.png',
  'apk_emotion_38.png',
  'apk_emotion_9.png',
  'apk_emotion_28.png',
];

// 解析命令行参数
function parseArgs() {
  const args = {
    mode: 'dist',  // 默认使用 dist
    removeStatic: false
  };

  process.argv.slice(2).forEach(arg => {
    if (arg.startsWith('--mode=')) {
      const mode = arg.split('=')[1];
      if (mode === 'dist' || mode === 'dev') {
        args.mode = mode;
      } else {
        console.warn(`警告: 未知的模式 "${mode}", 使用默认模式 "dist"`);
      }
    } else if (arg === '--remove-static') {
      args.removeStatic = true;
    }
  });

  return args;
}

// 获取目标根目录
function getTargetRoot(mode) {
  return mode === 'dev' ? DEV_ROOT : DIST_ROOT;
}

function replaceInFile(file, targetRoot) {
  const source = fs.readFileSync(file, 'utf8');
  let output = source;

  // 处理 JS/JSON 中的字符串形式 "static/xxx" 或 "/static/xxx"
  output = output.replace(/(["'])\/?static\//g, `$1${CDN}static/`);

  // 处理样式中的 url(static/xxx) 或 url('/static/xxx')
  output = output.replace(/url\(\s*(['"]?)\/?static\//g, `url($1${CDN}static/`);

  if (output !== source) {
    fs.writeFileSync(file, output, 'utf8');
    console.log('rewrote', path.relative(targetRoot, file));
  }
}

function walk(dir, targetRoot) {
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
    const full = path.join(dir, entry.name);
    if (entry.isDirectory()) {
      walk(full, targetRoot);
    } else if (ALLOWED_EXTS.has(path.extname(entry.name)) && !SKIP_FILES.has(entry.name)) {
      replaceInFile(full, targetRoot);
    }
  }
}

// 检查路径是否应该被排除
function shouldExclude(filePath, staticRoot) {
  const relativePath = path.relative(staticRoot, filePath);
  const normalizedPath = relativePath.replace(/\\/g, '/'); // 统一使用 / 分隔符

  // 检查是否在排除目录中
  for (const excludeDir of EXCLUDE_DIRS) {
    if (normalizedPath.startsWith(excludeDir + '/') || normalizedPath === excludeDir) {
      return true;
    }
  }

  // 检查是否匹配排除文件模式
  for (const excludeFile of EXCLUDE_FILES) {
    // 简单的 glob 匹配(支持 * 和 **)
    const pattern = excludeFile.replace(/\*\*/g, '.*').replace(/\*/g, '[^/]*');
    const regex = new RegExp('^' + pattern + '$');
    if (regex.test(normalizedPath)) {
      return true;
    }
    // 精确匹配
    if (normalizedPath === excludeFile) {
      return true;
    }
  }

  return false;
}

// 删除本地 static 目录(排除指定目录和文件)
function removeLocalStatic(targetRoot) {
  const staticDir = path.join(targetRoot, 'static');

  if (!fs.existsSync(staticDir)) {
    console.log('static 目录不存在:', staticDir);
    return;
  }

  let deletedCount = 0;
  let skippedCount = 0;

  function removeRecursive(dir) {
    const entries = fs.readdirSync(dir, { withFileTypes: true });

    for (const entry of entries) {
      const fullPath = path.join(dir, entry.name);

      if (shouldExclude(fullPath, staticDir)) {
        skippedCount++;
        console.log('跳过(排除):', path.relative(staticDir, fullPath));
        continue;
      }

      if (entry.isDirectory()) {
        removeRecursive(fullPath);
        // 目录为空时才删除
        try {
          fs.rmdirSync(fullPath);
          deletedCount++;
        } catch (err) {
          // 目录不为空,忽略错误
        }
      } else {
        fs.unlinkSync(fullPath);
        deletedCount++;
      }
    }
  }

  removeRecursive(staticDir);

  // 如果 static 目录为空,尝试删除它
  try {
    const remaining = fs.readdirSync(staticDir);
    if (remaining.length === 0) {
      fs.rmdirSync(staticDir);
      console.log('已删除空的 static 目录');
    } else {
      console.log(`static 目录保留,包含 ${remaining.length} 个排除项`);
    }
  } catch (err) {
    // static 目录已被删除或无法访问
  }

  console.log(`删除完成: 已删除 ${deletedCount} 项, 跳过 ${skippedCount} 项`);
}

// 主函数
function main() {
  const args = parseArgs();
  const targetRoot = getTargetRoot(args.mode);

  console.log(`模式: ${args.mode}`);
  console.log(`目标目录: ${targetRoot}`);

  if (!fs.existsSync(targetRoot)) {
    console.error('目标目录不存在:', targetRoot);
    process.exit(1);
  }

  walk(targetRoot, targetRoot);
  console.log('路径替换完成');

  if (args.removeStatic) {
    console.log('\n开始删除本地 static 目录...');
    removeLocalStatic(targetRoot);
  } else {
    console.log('\n提示: 使用 --remove-static 参数可删除本地 static 目录');
  }

  console.log('\n完成');
}

main();

使用方法,放到项目根目录下,打包之后执行:

node cdn-rewrite.js [--mode=dist|dev] [--remove-static]

 

道阻且长

作者 obaby
2025年12月10日 13:44

都道:“一步错,步步错”。虽然有时候是无心之失,却也在不经意间制造了太多的问题。就像撒了个谎,后面需要无数的谎言来解释当初这个谎言。最开始开发 app 的时候,对于所谓的前段并没那么清晰深入的理解,毕竟之前做 ios 和安卓的开发还是基于 oc 和 java 来搞。

之前虽然也看过不少 uni 的项目,但是真正开始的时候。当时还是选择了 vue2 的框架,虽然那时候3 也依然有些规模。鉴于当时找到的很多组件都是 vue2 的不支持 3,所以开始的时候就入了这个坑,直接基于 2 的各种组件搭起来了现在的这个闺蜜圈的项目。

当然,后续再开发过程中也发现了很多问题,虽然是 vue2 的各种组件,然而很多满足不了自己的需求,在不断的开发过程中也在不断的修改这些组件,甚至很多组件到现在已经改的完全不是原来的样子了。重写了大量的代码,也修复了很多组件的问题。所谓的生态,国内的生态环境并不是看到的那么好。各种插件市场非常活跃,插件也非常多。但是实际上出了问题大概率得不到作者的解答,只能自己去读代码,理解逻辑之后重写有问题的部分。

再后来,鸿蒙 next 横空出世,uni 也承诺会支持鸿蒙系统。当然后来也确实是支持了,不过仅支持 vue3 的项目的鸿蒙系统编译。于是这原来的 vue2 的项目就面临着一次大版本的升级和兼容处理。在开发了一年之后,如果重新搭架子从 vue3 重写,成本固然是太高了,不在可接受的范围之内。最终的方案是直接将 vue2 的项目迁移到 vue3。

在去年uni 开放鸿蒙的体验版本兼容编译之后,就尝试将项目迁移到 vue3,不过那时候仅限于能编译运行。可以登录到首页,而其他的页面全部都没处理。在这次鸿蒙的技术支持介入之后,也是下定决心将项目迁移到 vue3 进一步迁移到原生鸿蒙。到原生鸿蒙才是最终目的。

不过在迁移过程中也发现一些问题:

1.导航栏 button 无效:

HarmonyOS 基于uniapp的方式开发HarmonyOS应用时候,通过app-plus:titleNView 配置页面右上角按钮未生效(API12+)
【问题描述】:HarmonyOs基于uniapp的方式开发HarmonyOS应用的时候,通过app-plus:titleNview配置页面右上角按钮不生效

【问题现象】:使用app-plus:titleNview配置导航栏右上角button不显示

【版本信息】:hbuilder 版本4.8.5、DevEco Studio 6.0.1 Release

【复现代码】:{

  "path": "pages/besties",

  "style": {

    "navigationBarTitleText": "XXX",

    "navigationBarBackgroundColor": "#ff4f87",

    "app-plus": {

      "bounce": "none",

      "titleNView": {

        "buttons": [{

          "fontSize": "18px",

          "text": "+",          // 直接写加号字符

          "color": "#FFFFFF"

        }]

      }

    }

  }

}

官方给的解决方案:

在基于 UniApp 开发 HarmonyOS 应用时,app-plus:titleNView配置未生效的核心原因是:app-plus是 UniApp 针对 Android/iOS 端设计的原生导航栏配置,HarmonyOS 平台的导航栏实现逻辑与 Android/iOS 不同,因此该配置暂未适配 HarmonyOS 平台。

解决方案:使用「自定义导航栏」替代(推荐,跨平台兼容)
由于 HarmonyOS 不支持 UniApp 的titleNView配置,建议通过隐藏原生导航栏 + 自定义导航栏组件的方式实现右上角按钮,同时兼容跨平台场景。

步骤 1:隐藏原生导航栏
在pages.json中,给目标页面的style添加navigationStyle: "custom",隐藏原生导航栏:

json

{
  "path": "pages/besties",
  "style": {
    "navigationBarTitleText": "XXX",
    "navigationBarBackgroundColor": "#ff4f87",
    "navigationStyle": "custom", // 隐藏原生导航栏
    "app-plus": {
      "bounce": "none"
    }
  }
}
步骤 2:自定义导航栏组件(实现右上角按钮)
在页面中手动编写导航栏布局,包含标题和右上角按钮,示例代码(Vue3 语法):

vue

<template>
  <!-- 自定义导航栏 -->
  <view class="custom-nav-bar" :style="{backgroundColor: '#ff4f87'}">
    <!-- 标题 -->
    <view class="nav-title">XXX</view>
    <!-- 右上角按钮 -->
    <view class="nav-right-btn" @click="handleRightBtnClick">
      <text :style="{fontSize: '18px', color: '#FFFFFF'}">+</text>
    </view>
  </view>

  <!-- 页面内容 -->
  <view class="page-content">
    <!-- 你的页面内容 -->
  </view>
</template>

<script setup>
// 右上角按钮点击事件
const handleRightBtnClick = () => {
  console.log("右上角按钮被点击");
  // 这里写按钮的业务逻辑
};
</script>

<style scoped>
/* 自定义导航栏样式(适配HarmonyOS状态栏高度) */
.custom-nav-bar {
  width: 100%;
  height: var(--status-bar-height) + 44px; /* 状态栏高度 + 导航栏高度 */
  padding-top: var(--status-bar-height); /* 适配状态栏 */
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 16px;
  box-sizing: border-box;
}

.nav-title {
  color: #FFFFFF;
  font-size: 18px;
  font-weight: bold;
}

.nav-right-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
}

/* 页面内容区,避免被导航栏遮挡 */
.page-content {
  padding-top: calc(var(--status-bar-height) + 44px);
}
</style>
补充说明(针对 UniApp X 项目)
如果你的项目是UniApp X(专门适配 HarmonyOS 的 UniApp 模式),可以直接使用 HarmonyOS 原生的Navigation组件配置右上角按钮(需在uts页面中实现):

ts

// pages/besties/besties.uts
@Entry
@Component
struct BestiesPage {
  build() {
    Navigation() {
      // 页面内容
      Column() {
        Text("页面内容")
      }
    }
    .title("XXX") // 导航栏标题
    .titleMode(NavigationTitleMode.Free)
    .backgroundColor("#ff4f87")
    // 配置右上角按钮
    .toolBar({
      items: [
        {
          value: "+",
          textColor: "#FFFFFF",
          fontSize: 18,
          action: () => {
            console.log("右上角按钮被点击");
            // 业务逻辑
          }
        }
      ]
    })
  }
}
关键注意事项
app-plus配置的局限性:app-plus是 UniApp 对 Android/iOS 端的扩展配置,HarmonyOS 平台的导航栏、原生组件等逻辑与 Android/iOS 不同,因此大部分app-plus配置在 HarmonyOS 上不生效。
状态栏高度适配:自定义导航栏时,需通过var(--status-bar-height)获取 HarmonyOS 设备的状态栏高度,避免导航栏被状态栏遮挡。
UniApp X 的适配:若使用 UniApp X 开发 HarmonyOS 应用,建议直接使用 HarmonyOS 原生组件(如Navigation),兼容性和体验更好。
通过自定义导航栏或 UniApp X 的原生Navigation组件,即可实现 HarmonyOS 应用中页面右上角按钮的需求,同时保证跨平台兼容性或原生体验。

官方答复地址:https://developer.huawei.com/consumer/cn/forum/topic/0203200053870018576?fid=0109140870620153026&pid=0314200135195141595

当然,这个问题解决最终也是通过自绘导航栏解决的,不过目前还有个问题,就是与 uni 自带的原生导航栏样式稍微有些区别,主要问题在导航栏高度计算,以及导航栏字体渲染问题。这个如果要想彻底解决可能就得全部重写几个页面的导航栏了。这个不影响使用,稍微往后放一点。

另外一个问题,那就是 ai 助理迁移问题,迁移到鸿蒙系统之后,由于部分属性不支持,导致页面直接白屏了。目前虽然就解决了大多数的问题,单机 markdown 渲染问题,以及聊天窗口自动滚动到最新消息依然有问题,在没有全屏的时候是没问题的,消息列表全屏之后,滚动总是少一块。

而至于上篇文章提到的,google play 测试的问题,目前也有好多宝子参与进来了。也反馈了很多问题,当然,很多东西自己觉得习以为常,但是很多人第一次使用的时候却并没有看到相应的效果,或者对于操作步骤有疑惑。

记录:
1.增加异常状态种类,支持多选
2.优化日历样式
3.增加用户徽章
4.针对不同设备处理流式数据
5.优化生日选择的日期选择器
6.优化爱爱记录操作方式
7.优化日历操作方式,更简单明了 删除记录 结束记录逻辑调整
todo

todo:
个人信息–手机号,随便在那里输点东西再去修改昵称, 修改昵称那个输入框变成修改手机号的输入框了。✓
修改完手机号点一下邮箱–取消,在点击昵称 ,输入框变成修改邮箱输入框了✓
我的–高级设置–安全设置 点击密码没反应,改不了密码 ✓
青少年模式不能记录新的了,但是已经记录的💊在日历上还是显示的。
数据分析页面:
年没上限
月只有60天。而且英文界面出错提示是中文。
体重和体温也没有边界值,甚至可以输入负数。 ✓
please拼错账 pleace ✓
中文用户名长度判断问题,中文允许两个字符 ✓

目前已经更新发布了一版新的,并且 ios 和安卓终于版本号同步了。之前由于种种问题,ios 的版本号稍微落后了一点。

当然,正式的测试还得找个时间一起处理。多人长测的确是个问题,需要投入那么点精力。

然而,由于 google 原来的 appid 用不了了,只能换个新的 id,然而新的 id 就会出现 pushid 和 unicloud 不一致的问题,最终只能在 google 包开了 1.0 的 push 临时解决了这个问题。最终没有再搞个分支,不同的分支维护真的太麻烦了。

本来想着一套代码搞定,现在就已经拆分成了鸿蒙的 vue3 和通用版本的 vue2。修复一点问题,现在就得维护两套代码。这个也是属实是无奈之举了。

之前上架华为应用市场的版本是没有 ai 助理的,也就是一个屏蔽了 ai 助理的版本。对于这种不完美事情,总是觉得有些欠缺。继续咨询了一下相关的问题,https://developer.huawei.com/consumer/cn/forum/topic/0203200246757472747?fid=0109140870620153026 给出的答案倒是和之前的区别不大,意思是可以上,但是有些限制。

除了生成的内容要有明显的标识:https://developer.huawei.com/consumer/cn/doc/app/50111-10

另外一个就是使用这种功能需要进行实名认证:

目前看来对于这种认证最简单的侵入性最小的还是手机号认证。为了进行手机号认证,也看了几种方案,一种是基于 uni 自带的证号认证功能,

https://doc.dcloud.net.cn/uniCloud/uni-rpia/mobile-verify/intro.html

相关费用报价其实略贵一些:

真题来说两毛多钱一次,这价格属实是贵了点。随便认证个几百人,这几十块钱就没了。虽然不多,但是毕竟作为一个不挣钱的项目该省的还是要省的。那么,除此之外,那就是直接短信验证码了,uni的短信验证码费用为 0.0355,这个价格比上面的便宜了很多。

然而,这个资源包太大了,有效期一年:

看了下阿里的,虽然大家贵点,但是相对来说资源包可以买的小一些,用完再买,也不会存在浪费的问题:

至于切换,那等短信需求量大了再说吧,毕竟现在只有上架华为应用市场的需要实名,并且不知道这种实名认证是不是满足需求。如果满足不了,那就得再换别的方式了。

既然,已经到了这里,也不在乎多折腾一个应用商店了,登录三星的开发者后台,不得不说,三星还是简单,除了提示改密码,别的什么都没问题。添加应用,补充资料。上传 app 提交审核,然而,晚上收到一封邮件,说审核被拒了,而至于为什么被拒,简单粗暴给了个 apk 扫描没通过的链接。

按照文档的提示,给 google 发送扫描误报请求。结果添加到 google 邮件里的附件又被扫描了,禁止下载。这尼玛真是陷入死循环了,

只好压缩之后重新给 google 发送文件,这尼玛是属于套娃了吧。真是服了。

zhongling@MacBookPro Pycharm_projects % cd dayima-vue3
zhongling@MacBookPro dayima-vue3 % echo "=== 2025年12月提交次数 ===" && git log --since="2025-12-01" --until="2025-12-31" --oneline | wc -l
=== 2025年12月提交次数 ===
      49
zhongling@MacBookPro dayima-vue3 % cd ..
zhongling@MacBookPro Pycharm_projects % cd dayima_backend
zhongling@MacBookPro dayima_backend % echo "=== 2025年12月提交次数 ===" && git log --since="2025-12-01" --until="2025-12-31" --oneline | wc -l
=== 2025年12月提交次数 ===
      50
zhongling@MacBookPro dayima_backend % cd ../dayima_uniapp
zhongling@MacBookPro dayima_uniapp % echo "=== 2025年12月提交次数 ===" && git log --since="2025-12-01" --until="2025-12-31" --oneline | wc -l
=== 2025年12月提交次数 ===
      89

 

最近为了处理这些问题,最近这段时间确实比较忙,白天公司的事情,晚上自己的事情,差不多每天都到十一点多,偶尔一天十一点上床了,对象问了一句:“今天咋这么早?!”

再次感谢最近参与测试,提出 bug 的宝子们。

大致小新笔记坊云无心天天向上vind似水流年夏末~、乖、lgin、jason、jungle

杜郎
以及其他最新入群的宝子,后面几个我对不上号,或者有遗漏的也补充下哈可以给我留一下地址哦,测试结束后给每人发红包,嘻嘻。

尽管道阻且长,

但是行则将至,不是吗?

蜀道难 — 有偿招募 Google Play 测试用户

作者 obaby
2025年12月3日 13:35

懒惰,有时候带来的负面效果,后期想要修复的时候,要付出的代驾比当时处理要复杂的多。更恐怖的是,哪怕付出了这么多的代码,依然无法达到最开始的效果。

当 google playstore 开发者给我发邮件提示账号快过期的时候,并没有太留意,后来就给忘了。当然,gmail 的邮箱已经收到了数次提醒,但是由于那段时间不怎么翻墙,导致并没有看到这些邮件,等看到邮件的时候账号已经被用了。

看到这个停用的原因,真的是让人崩溃,这 tmd,当时但凡翻墙了,也就是点几下鼠标的事情。现在好了,重新注册账号依然面临一系列的问题。appid 被占用,旧应用无法下架,无法转让。现在连上线发布都需要面临另外一个问题,那就是需要开启封闭测试,只有封闭测试通过之后才能有发布正式版的权限。

google play开发者给出的答案是:

针对新创建的个人账号的测试要求简介
测试是应用开发流程中不可或缺的一环。通过持续对应用运行测试,您可以在公开发布应用之前验证其正确性、功能行为和易用性。这能让您及时解决发现的技术问题或用户体验问题,最大限度地降低这些问题对用户的影响,从而确保您在 Google Play 中发布的是应用的最佳版本。如果开发者在发布应用之前经常使用 Play 管理中心的测试工具进行测试,他们的应用将能够带给用户更优质的使用体验,从而在 Google Play 上赢得更高的评分,取得更大的成就。

为了帮助所有开发者确保提供高品质的应用,我们提出了新的测试要求。如果开发者使用的是 2023 年 11 月 13 日之后创建的个人账号,则其应用需要先经过测试,然后才能在 Google Play 上发布和分发。若应用未经过测试,系统会停用 Play 管理中心内的部分功能,例如正式版(测试和发布 > 正式版)和预注册(测试和发布 > 测试 > 预注册),直到开发者满足相关要求为止。

测试要求概览
如果您使用的是新创建的个人开发者账号,则必须对您的应用运行封闭式测试,且至少有 12 名测试人员在过去至少 14 天内选择持续参与测试。满足上述条件后,您便可以在 Play 管理中心的信息中心申请正式版发布权限,以便最终在 Google Play 上分发您的应用。申请时,您需要回答一些问题,帮助我们了解您的应用、测试流程及正式版发布准备情况。

下文详细介绍了不同类型的测试轨道和相关要求,以及关于申请正式版发布权限的更多详情。

了解不同的测试轨道和相关要求
Play 管理中心提供不同类型的测试轨道,以便您逐步扩大测试范围并改进应用,力求达到适合面向数十亿 Google Play 用户发布的水平。

内部测试:在完成应用设置之前,您可以自行将 build 快速分发给少量可信测试员。这有助于您排查问题并收集早期反馈。通常,build 被添加到 Play 管理中心几秒钟后,就会向测试人员开放。虽然内部测试并非强制性要求,但我们建议您从这里开始。
封闭式测试:利用封闭式测试,您可以与由您控管的众多用户分享应用。这样一来,您可以在发布前修复问题,并确保应用符合 Google Play 政策的要求。您必须先运行封闭式测试,然后才能申请发布正式版应用。当您申请正式版发布权限时,必须至少有 12 名测试人员选择参与您的封闭式测试。他们必须在过去 14 天内选择持续参与。完成应用设置后,您即可启动封闭式测试。
开放式测试:让您可在 Google Play 中发布测试版应用。进行开放式测试时,任何人都可以加入您的测试计划并向您提交非公开反馈。请先确保您的应用和商品详情已经准备好在 Google Play 上架,然后再选择该选项。如果您拥有正式版发布权限,则可以使用开放式测试。
正式版:让您可通过 Google Play 面向数十亿用户发布应用。您需要先运行符合我们条件的封闭式测试,然后才能申请将应用发布为正式版。在申请时,您还需要回答一些与封闭式测试相关的问题。当您申请正式版发布权限时,必须至少有 12 名测试人员选择参与您的封闭式测试。他们必须在过去 14 天内选择持续参与。

如果开发者使用的是 2023 年 11 月 13 日之后创建的个人账号,则其应用需要先经过测试,然后才能在 Google Play 上发布和分发。若应用未经过测试,系统会停用 Play 管理中心内的部分功能

测试要求概览

如果您使用的是新创建的个人开发者账号,则必须对您的应用运行封闭式测试,且至少有 12 名测试人员在过去至少 14 天内选择持续参与测试。

重要提示:向测试人员强调,他们需要选择持续参与至少为期 14 天的封闭式测试。

说实话就是现在google 的做法是越来越看不懂了,关键是很多操作也不知道后续该如何操作。这就很蛋疼了,这种事情当然更好的办法是去咸鱼之类的找个专门做测试的。

测试资格需要加入这个 google 群组(需要加入群组之后才能参与测试):guimiquan@googlegroups.com

https://groups.google.com/g/guimiquan

我也没咋用过这个东西,不清楚怎么去处理这个破玩意儿。有时候感觉老外设计的东西,的确是不怎么符合自己的使用习惯。

ap测试地址:

https://play.google.com/apps/testing/gma.dayi.app

app商店地址:

https://play.google.com/store/apps/details?id=gma.dayi.app

网上依然能找到这种测评服务了,价格大约 200+。

现在的问题在于重新注册开发者账号话费了 30 美元,现在不上架恶心,上架也恶心。既然如此那还是折腾一下吧,不过鉴于自己手上没那么多的设备,想请各位宝子帮帮忙测试一下,想参与的加一下 google 的群组。需要 12 名测试人员,根据提供的测试账号数量,在测试完成后给于相应的报酬,如果有时间,或者闲着没事的希望可以板帮我哦。

目前我自己还在修改一些问题,希望大家除了加下 google group,顺便加下群哦,QQ群:777692924obaby@mars

需要大家开始帮忙测试了会统一通知一下的。

都说蜀道难,现在发版比蜀道还难,蜀道难都是看得到的难,而这发版,完全是不知道的陷阱。

最后说下测试报酬哈,鉴于价格大约都是 200+,12 个账号,按照每个账号 20 元红包来计算(提供几个测试账号,会获得相应账号数量的红包)。如果不想要红包的,可以寄写真照片(3 张),如果喜欢的话。

如果种种原因,到时最后测试没通过,红包依然会发放,不过金额就变成 10 元了哈。毕竟不想让大家白费精力,这个钱属实不多。聊表心意,主要是这个应用也没啥盈利能力,全靠用爱发电,小女子先行写过啦。

完美主义

作者 obaby
2025年12月1日 10:53

小时候跟姐姐学的用扑克牌算命,洗牌就那么一张一张的抽出来排上去,从 1 开始一直排到 13,不同的花色对应着好或者不好,每个数字代表不用的意义,事业啊、婚姻啊、学历啊等等。有时候,为了抽到一排红心,自己会将扑克牌在洗牌之后重新排号,按照一个特定的顺序,抽几张扔几张。最后总是能拿到一排红心。

慢慢长大之后发现,不要说一排红心,哪怕能拿到一颗红心已经实属不易。为了这颗所谓的红心,要付出的实在是太多太多。

反常的气温,忽然又升高到了十七度。给人一种暖春的感觉,周五的时候,对象说给宝子约了周六的牙医。宝子的这个牙,已经成了一种非常严重的问题。由于之前一直吃手,后来用这种手段干预,戴手套,贴嘴等等,虽然不吃了,但是舌头还是不自觉的就往前顶,现在牙齿已经有些变形了,甚至连骨头都开始过度生长。

去妇幼、齐鲁去问诊,给的建议都是等牙齿换完再处理,但是现在似乎依然等不到那个时候了,再不干预,以后要该起来就更难了。原本想着,简单的咨询一下,但是在经过一系列的检查之后,觉得还算靠谱,给的医疗建议也在接受范围之内。决定不再折腾了直接在这里处理,费用六千五。为这些所谓的坏习惯的付出依然不止这些。

有时候懒惰真的会付出代驾,小的时候想下狠心纠正这种坏习惯,但是宝子的姥姥各种觉得残忍,阻挠。最后的结果就是,虽然当时是痛快了。后患却没那么容易消除。虽然现在自己依然不是一个完美主义者,但是,这种过失,现在想起来却也时常后悔。

周末,有时候感觉时间是真的少,各种乱七八糟的事情就占据掉了大半。剩下一点点的时间,来处理下那些乱七八糟微不足道的事情。之前 google play store 的账号,因为长时间没登录被停用了,导致原有的闺蜜圈 app 也被下架。在重新注册开发者账号,想要重新发布应用的时候,提示 appid 被占用了,给 google 发邮件申请转移,给的答案是账号可以解除封禁,可以登录,但是转移却是一直失败的,根本没有转移权限。

既然如此,那暂时也就不再尝试使用原来的 appid 了,毕竟,这个流程一直持续下去,也不知道会到猴年马月能结束,就酱紫吧。完美主义,自己坚持有个 p 用,还得条件允许才能完美。

除了 google play,其实还有一个平台是自己之前也想上的,那就是鸿蒙,uniapp 刚支持打包鸿蒙 应用的时候,自己就尝试过向鸿蒙的迁移。然而,由于项目框架较老,需要做的工作不止一点点,需要先将 vue2 升级到 vue3,然后在将 vue3 版本打包成鸿蒙的 app。

升级这一步就不是很顺利,作为一个初学前端(vue 框架)的菜鸟,最开始项目建立的时候,代码结构设计的并不是非常好,并且硬编码了很多 vue 2 only的一些代码。升级到 vue3 之后,勉强编译通过,运行到了鸿蒙系统上。

再后来,这件事情也确实没什么动力,就不了了之了。然而,就在上周又接到了一个广东深圳的电话,接起来之后说是鸿蒙开发者中心的。问有没有app 升级或者开发计划,说看到在应用商店上架的闺蜜圈 app了,并且说帮忙给建立技术支持服务群,协助将项目从 vue2 到鸿蒙系统 app 的发版。 

在接到这一通电话之后,总觉得不做点什么真的对不起鸿蒙生态的付出。(这个电话打了很多次了,一直没接)之前,自己的那种完美主义追求,想要在国内的各大应用市场上架。然而在多年以后,所有的手机应用市场都关上了针对个人开发者的大门,除了华为。国内的个人开发者,真的连狗都不如。

在自己开发第一款 app 的时候,国内应用商店华为、小米、锤子、魅族还是针对个人开发者开放的,只是现在小米把个人开发者推出了门外,魅族也关闭了那扇大门,锤子死了。只剩下华为还算是对个人开发者开放,更何况现在,人家都找上门了,自己又有什么理由不做出点努力呢?

而至于完美主义,现在依然不可能了,如果要做,也只能部分完美。让那些自己有能力去完美的地方,能稍微完美一点吧。

为了能升级到 vue3 和支持最新版的鸿蒙开发工具,将 hbuilder 升级到了最新版,切换到原来 vue3 的分支,不得不说,最新版的 hbuilder 在鸿蒙的支持上友好了很多。

配置好一系列工具和插件之后,甚至应不需要在使用鸿蒙开发者工具打包就可以直接运行到模拟器了,虽然提示只支持 arm 架构的模拟器,但是运行是完全没有问题的。

当然,现在升级最大的优势在于,通过 cursor 可以帮忙解决大部分的 vue代码升级问题。

的确减少了自己的大部分工作量,只需要关注那些 ai 解决不了的问题就 ok 了。两天陆陆续续的修复,最终还是在鸿蒙系统上运行起来了,也修复了大部分的错误,当然,这个升级之后的功能,还需要进一步的细致测试。

实际运行效果:

有的事情,开始固然是艰难了一些,甚至,很长时间都看不到方向,然而,做了也就那样,没什么做不了。也没什么做不到。

网上总是说 hbuiler 这不好,那不好,性能太差,不如原生。有哪有啊完美无瑕的工具或者框架,如果通过这个工具或者框架实现了自己的目的,那么这个框架或者工具就是足够优秀的,哪怕不完美。国外的东西不见得就是好的,国内的东西也不见得就是不好。很多程序员为了争论 emacs 和 vi 到底哪个更好,能口诛笔伐。甚至连 vi 党和 vim 党都能同室操戈,我作为一个实用主义党是在不明白这种争论的意义和价值。

当然,其实这些年我说 hbuiler 好不是一次了,我也是目光短浅,没用过 flutter 之类的其他的跨平台语言。仅仅局限于自己的鼠目寸光,与我而言,这解决了我的问题,就足够了。通过自学,两个月的时间,能让我通过这门语言或者工具来做一款产品,这就够了。

只是,现在我站在了自己写的屎山代码上,有太多的东西需要优化,有太多的结构需要调整。

或许,是时候放弃完美了,对于用户来说,你的代码是不是屎并没那么重要,只要给用户呈现的不是💩就完了。

绽放

作者 obaby
2025年11月25日 14:36

晚上下班之后,沿着那条跑过无数次的公路奔跑

路边的树上依然没了绿意

一阵北风吹来

树上的黄叶控制不住的在空中飞舞

身不由己的在空中划出一条不规则的曲线

落在地面上

一阵更猛烈的风吹来

地上的树叶又被裹挟着飞到了空中

耳机里伴随着风声传来的是张韶涵的《阿刁》

想大口呼吸

却不禁让狂风灌满了整个胸腔

虽然已经解开了薄羽绒服的扣子

微微出汗的身体依然想要抛弃这沉重的枷锁

只是啊

或许这被嫌弃的枷锁

是多少孩子的爱而不得

或许

我们生不逢时

或许

我们一路荆棘

但是

孩子啊,我们还是要努力的绽放

❌
❌