阅读视图

自序:在废墟之上,学习重生

在动笔写下这些文字的此刻,窗外的天光正一寸一寸地漫过书桌,将一切都染上一层柔和的、近乎不真实的金色。我花了很长时间,才重新找到一种能够安然静坐、审视光线的能力。于我而言,这并非理所当然,而是一场旷日持久的战争之后,一片狼藉的战场上,悄然开出的第一朵无名小花。

这篇序言,以及未来可能延续的文字,并非为了博取同情,亦非意图展示伤疤。它更像是一场迟到的、对自我前半生的清算与和解。我必须诚实地面对那个曾经蜷缩在黑暗中的自己,那个在迷雾中冲撞、伤害了他人也刺伤了自身的灵魂,那个在三十多岁时才恍然初醒、踉跄学步的“孩童”。

因为我知道,只有当我敢于直视废墟的全貌,承认每一块砖瓦的破碎都与我有关,我才有可能在这片废墟之上,真正地、一砖一瓦地,为自己重建一个可以栖身的家园。

肉身的囚笼:与精神风暴的共存

我的战争,始于我的身体内部,那是一场无声却最为惨烈的围城。最初,它以“抑郁”的面目出现。那并非文艺作品中描绘的、带着一丝忧郁美感的“蓝色时期”,而是一种更为粗暴、更具剥夺感的现实。它像一块巨大而潮湿的铅块,被强行植入了我的胸腔。我的世界失去了色彩,食物失去了味道,他人的笑语变成了刺耳的噪音,连阳光都带着一种灼人的恶意。时间在我身上失去了线性的意义,它要么凝固成一块沉重的、散发着霉味的铅块,压得我无法动弹;要么化作一团混沌的、没有出口的浓雾,让我在日复一日的重复中迷失方向。

我像一个溺水者,在日常生活的浅滩上无声地挣扎。起床,需要耗尽前一夜积攒的所有力气;与人交谈,需要调动全部心神去模仿一种名为“正常”的表情;完成一件最简单的工作,仿佛攀登一座险峻的雪山。最可怕的是那种彻底的、与世界隔绝的孤离感。我身处人群,却感觉自己被一层看不见的厚玻璃罩住,外界的一切都与我无关,我成了一个在自己生命中缺席的旁观者。

紧随其后的是“焦虑”,它像抑郁那位焦躁不安的孪生兄弟。如果说抑郁是静态的酷刑,焦虑则是动态的凌迟。我的心脏总是在毫无缘由地狂跳,仿佛胸口窝藏着一只惊慌失措的困鸟。我的思绪如同一匹脱缰的野马,在未来的荒原上疯狂奔命,预演着无数种灾难性的可能。每一个未接的电话,每一条措辞模糊的信息,甚至路人一个无心的眼神,都能在我心中掀起一场海啸。我无法安坐,无法专注,身体的每一个细胞都处于一级战备状态,时刻准备着应对一个永远不会到来的“危险”。

然而,地狱还有更深的一层。当“躁狂”来临时,它以一种极具欺骗性的面目登场。起初,它伪装成“灵感”与“激情”。长久被抑郁压制的能量仿佛在一瞬间被引爆,我变得精力无穷,思如泉涌。我可以同时进行好几个宏大的计划,我觉得自己无所不能,世界都在我的脚下。那种被放大了一千倍的“全能感”是如此诱人,以至于我一度以为自己“痊愈”了,甚至“升华”了。

但那只是魔鬼的馈赠,每一份礼物都在暗中标好了价格。在那种虚假的亢奋之下,我的判断力早已荡然无存。我说着不着边际的大话,做着冲动无比的决定,挥霍着并不存在的资源。我的言语变得尖锐而刻薄,轻易地刺伤身边的人,因为在那时的我看来,他们的“正常”与“谨慎”是如此的愚钝和碍事。当这股借来的能量耗尽,我便会从云端笔直地坠落,摔入比以往任何时候都更深、更黑暗的抑郁深渊。这种从天堂到地狱的自由落体,其间的绝望与自我憎恶,足以摧毁一个人最后的求生欲。

若干年后,迫不得已之下,我开始了漫长的服药之旅。药物,是我在这场战争中唯一的、却又极其不可靠的盟友。人们总以为,吃药就像治疗感冒一样,药到病除。但精神类药物的真相是,你是在用一种“已知”的痛苦,去交换另一种“未知”的痛苦。

我至今仍清晰地记得第一次服药后的感受。世界仿佛被蒙上了一层油腻的薄膜,我的大脑变得迟钝,思考如同在泥沼中跋涉。那种被称为“情感钝化”的副作用,抽走了我的悲伤,也一并带走了我的快乐。我不再哭泣,但我也无法发自内心地微笑。我变成了一个情绪上的“无性人”,一个行走的躯壳。随之而来的,是无法抑制的记忆力的衰退,是身体不受控制的颤抖,是肠胃的剧烈蠕动,是体重的急剧增加……

这个过程,是一场与药物副作用的“拉锯战”。在最糟糕的时候,我感觉自己不是在“治疗”疾病,而是在“伺候”药物。我需要对抗疾病本身的痛苦,还要对抗药物带来的痛苦。这是一场双线作战,腹背受敌。但我别无选择。因为我知道,如果不依靠这根看似腐朽的拐杖,我连站立的可能都没有。我学会在药物带来的“稳定”与“副作用”之间寻找一个脆弱的平衡点,学会在一片混沌中,为自己争取片刻的清醒与安宁。这段经历让我深刻地理解到,人的意志力是有限的,而肉体的痛苦,是摧毁意志最直接、最有效的方式。我的灵魂,就这样被囚禁在肉身的囚笼里,日复一日,与体内的风暴共存。

破碎的镜子:一个迟到的“儿童”

如果说精神的困境是最终爆发的症状,那么它的病根,则深植于我人格的土壤之中。在很长一段时间里,我是一个“人格不健全”的人,这个词听起来很学术,但翻译成生活的语言就是:我像一面破碎的镜子,只能映照出扭曲、分裂的影像,既看不清别人,也看不清自己。

我的成长,伴随着一种深刻的、未被满足的“匮乏感”。这种匮乏并非物质上的,而是情感与价值层面的。因为内心空洞,我便疯狂地向外抓取,试图用他人的关注、认可和情感来填补自身的黑洞。在人际关系中,我是一个贪婪的索取者。我渴望被爱,却不懂得如何去爱;我需要朋友,却常常把他们当作满足我情感需求的工具。我的情绪极不稳定,时而表现得极度依赖,像个婴儿般渴求对方无时无刻的陪伴与回应;时而又会因为一点小事而感到被冒犯、被抛弃,从而爆发出不成比例的愤怒与怨恨。

我用一种近乎偏执的方式去“对别人好”,但这并非出于真正的利他,而是一种隐性的、期待回报的投资。我付出的每一分善意,都在暗中期待着对方能以我渴望的方式回馈。一旦对方的回应不及预期,我内心的价值体系就会瞬间崩塌,随之而来的是巨大的失望和“你辜负了我”的道德审判。我的言语,常常被这种不自知的、扭曲的内在逻辑所驱动,变得尖锐、刻薄,充满指责。我无意识地将自己的痛苦与不安,投射到最亲近的人身上,用那些我自己都无法理解的“刺”,将他们扎得遍体鳞鳞。

回想起来,那些年里,我伤害了很多人。那些曾经真诚待我、试图走进我世界的朋友,最终都因为无法承受我那座阴晴不定的情感孤岛而选择离岸。也许他们心里想的是:“和你在一起太累了,我感觉自己像在走钢丝,永远不知道哪一步会踩空。”曾经的我无法理解,为什么我如此“用力”地维系关系,最终却总是被抛弃。

与此同时,一个不健全的人格,也让我自己成为了一个极易受伤的靶子。我没有建立起稳固的“自我边界”,分不清哪些是我的责任,哪些是他人的情绪。我轻易地将别人的评价内化为对自我的定义,一句无心的批评,足以让我否定自己存在的全部价值。我像一块海绵,贪婪地吸收着外界的一切信息,却无法分辨哪些是滋养的清泉,哪些是腐蚀的毒液。我在关系中反复上演着“讨好”与“被辜负”的戏码,因为我的潜意识里,根本不相信自己是值得被无条件善待的。

当一段又一段的关系以破裂告终,当身边的人渐渐远去,我最终选择了最懦弱也最直接的方式——切断联系。我更换了电话号码,注销了常用的社交平台账号,从他们的世界里彻底蒸发。这既是出于羞耻,也是出于恐惧。我害怕面对那个在他们眼中不堪的自己,更害怕再一次重复那令人绝望的循环。我把自己封闭起来,以为这样就不会再伤害别人,也不会再被伤害。

这种自我放逐持续了很久,直到我三十多岁,在经历了人生的数个重大挫折和精神的全面崩溃之后,我才在一个偶然的契机下,被迫开始了真正的“自我成长”。这个过程,无异于将一个成年人的心智,回炉重造成一个孩童。

我开始学习那些本该在童年时期就习得的最基本的情感技能。我学习辨认自己的情绪:哦,原来现在这种胸口发闷、喉咙哽咽的感觉,叫做“悲伤”;原来那种坐立不安、手心冒汗的状态,叫做“恐惧”。我学习为自己的情绪负责,而不是下意识地归咎于他人。我学习设立边界,温和而坚定地对不合理的要求说“不”,并且在说完之后,努力克服那种排山倒海而来的“内疚感”。我学习如何“倾听”,而不是永远急于表达自己。我学习如何“共情”,去尝试理解他人的处境与感受,而不是永远沉浸在自己的世界里。

这个过程是笨拙的、羞耻的,充满了反复与倒退。有时候,我会因为成功地表达了一次自己的真实想法而欣喜若狂,感觉自己像是完成了一项伟大的成就;但更多时候,我还是会掉回旧有的模式,在事后陷入深深的自责。我感觉自己不像一个三十多岁的成年人,而是一个心智年龄只有几岁的孩子,正在用一种缓慢到近乎可笑的速度,重新认识这个世界,重新学习如何与人相处。

现在的我,依然在这条路上步履蹒跚。我不再急于建立亲密关系,而是先学着与自己和平共处。我像一个园丁,小心翼翼地清理着内心那片长满杂草的荒地,拔除毒草,松土施肥,然后试探性地种下一些微小的、名为“自我接纳”与“爱”的种子。我知道,这片土地曾经破碎不堪,但我也相信,只要给予足够的耐心与照料,它终有一天,能够长出属于自己的风景。

无舵之舟:在求学与工作中搁浅

我那不健全的人格,如同一艘没有舵的船,让我在求学和工作的茫茫大海中,一次又一次地偏离航向,搁浅在无人问津的沙洲上。外界看到的,或许是我的“不顺”与“坎坷”,但只有我自己知道,那些所谓的“坏运气”,不过是我内在混乱的外在投射。

从求学时代开始,我就活在一种巨大的撕裂感中。一方面,我有着强烈的、甚至有些病态的“好胜心”。我渴望通过优异的成绩来证明自己的价值,来获取老师和同学的认可,以此填补内心的空虚。这种渴望,让我一度成为学习上的“苦行僧”,我可以为了一个高分而牺牲掉所有的娱乐和休息。但另一方面,我内心深处又潜藏着一种同样强烈的“无价值感”。我从不相信自己真正“配得起”那些好成绩,每一次成功,都被我归因为“运气”或是“侥幸”。

这种矛盾,让我无法享受任何成就带来的喜悦。考了第一名,我会立刻开始担忧下一次是否还能保持;获得了一点赞扬,我会惶恐地觉得这是“骗”来的,害怕自己很快就会“原形毕露”。我成了“冒名顶替综合症”的重度患者。这种持续的、高强度的精神内耗,让我的求学之路充满了焦虑与疲惫。我无法与同学建立起健康的合作关系,因为我下意识地将他们视为竞争对手;我也无法坦然地面对失败,一次小小的失误,都可能被我解读为“我就是个废物”的终极证据。我的心情,就像一张被绷得过紧的鼓皮,任何一点轻微的敲击,都能让它发出刺耳的、濒临破裂的哀鸣。

这种内在的混乱,在我踏入职场后,被放大到了极致。工作,是一个需要高度社会化与协作的场域,而这恰恰是我最薄弱的环节。我无法完善地处理很多事情,根源不在于我的能力,而在于我的人格。

面对上级的任务,我不敢提问,不敢确认,因为害怕暴露自己的“无知”,结果往往因为理解偏差而把事情搞砸。当工作出现问题时,我的第一反应不是解决问题,而是推卸责任或是陷入情绪崩溃,因为我无法承受“犯错”所带来的羞耻感。在团队合作中,我既无法信任他人,也无法让他人信任。我总是在揣测别人的动机,觉得同事的每一次讨论都可能是在排挤我,每一次微笑背后都可能藏着算计。我把自己变成了一只竖起全身尖刺的刺猬,既渴望靠近,又随时准备攻击。

我记得有一次,因为工作中出现的问题,我遭到了上司的公开批评。那次批评的言辞其实并不算激烈,但在我听来,却无异于一场公开处刑。我没有去思考这些问题的客观原因和解决方案,而是立刻陷入了“他就是针对我”、“所有人都觉得我是个笑话”的偏执想象中。接下来的几天,我无法正常工作,整个人都沉浸在一种屈辱和愤怒的情绪里,看谁都觉得不顺眼,最终导致了和一位同事的激烈争吵。

这样的事情,在我的职业生涯中反复上演。我换过几份工作,每一次的离开,都带着一种“逃离”的姿态。我总以为是环境的问题,是别人的问题,换一个地方,一切就会好起来。但事实是,无论我走到哪里,我都带着我那艘“无舵之舟”。问题不在于海洋,而在于船本身。

我的心情,因此长期处于一种糟糕透顶的状态。每天去上班,都像奔赴刑场。工作不再是实现自我价值的途径,而是一种不得不承受的、漫长的折磨。我羡慕那些能够游刃有余地处理人际关系、能够坦然面对压力与挑战的同事,他们的那种“松弛感”,对我来说遥远得如同另一个星球的物种。我越是努力,就越是把事情搞砸;越是搞砸,就越是憎恨自己。这种恶性循环,最终将我推向了精神崩溃的边缘,也成为了压垮我的最后一根稻草。直到很久以后我才明白,一个无法与自己和谐相处的人,也必然无法与这个世界和谐相处。工作中的种种坎坷,不过是我内心战场的外化与延伸罢了。

无爱之源:被洗脑的“正常”与自我拯救

当我开始痛苦地追溯,试图为我人格的扭曲、人生的坎坷寻找一个源头时,所有的线索,最终都指向了那个我出生、成长的地方——我的家庭。我花了很长时间才明白:我并不是在“家”中长大的,我只是“在一个叫家的地方”长大。那是一个没有爱,也没有温暖的地方。

“没有爱”,不仅仅指衣食住行上的匮乏,它还有一种更隐蔽、更具腐蚀性的存在,是一种弥漫在空气中的、长久的“情感忽视”。在我的记忆中,家,从来不是一个可以让我放松、可以让我卸下防备的港湾。它是一个充满了紧张、评判和条件交换的场所。

我很少得到父母的拥抱和肯定。我所获得的任何一点“关爱”,都必须通过优异的成绩、听话顺从的表现来换取。爱,在我的家中,是一种需要被“挣得”的稀缺资源,而不是一种与生俱来的权利。我的感受和情绪,是被彻底无视的。当我哭泣时,得到的不是安慰,而是“不许哭”的呵斥;当我表达恐惧时,得到的不是理解,而是“胆小鬼”的嘲讽;当我尝试分享快乐时,得到的往往是“别骄傲”的告诫。我的存在,似乎只是为了满足父母的某种期望,成为他们向外炫耀的资本,而不是作为一个独立的、有血有肉的个体被看见、被接纳。

家庭的氛围,总是充满了压抑和疏离。父母之间的关系,也并非基于爱与支持,而是一种责任与义务的捆绑。他们从未有温情的交流,更多的是沉默,或是因为琐事而爆发的争吵。在这样的环境中长大,我从未习得何为“爱”,何为“亲密”,何为健康的“情感表达”。我像一株生长在阴冷角落的植物,因为长期得不到阳光的照耀,只能长得孱弱、扭曲,拼命地朝着任何一点微弱的光源伸出枝丫,哪怕那光源是虚假的、有害的。

然而,最可怕的,并非是这种“无爱”的现实本身,而是我曾经对此毫无察觉。我被洗脑了。这种洗脑,来自两个方面:一是家长,二是学校的教育。

我的父母,会用一种不容置疑的口吻告诉我:“我们做的一切都是为了你好。”“天下无不是的父母。”他们将自己的情感忽视与控制,包装成一种“深沉的、不善言辞的爱”。他们会告诉我,他们的童年比我苦得多,我应该感到“知足”与“感恩”。这种话语体系,让我陷入了深深的认知失调。我的身体和直觉告诉我,我感到的是冰冷和压抑;但我的头脑却被灌输,我应该感到的是温暖和幸福。当直觉与被灌输的“真理”发生冲突时,一个孩子,会毫不犹豫地选择怀疑自己。于是,我得出了结论:感到痛苦,是我错了,是我“不懂事”,是我“不知感恩”。

学校的教育,则为这种洗脑提供了更强大的理论支持。那些关于“孝道”、“感恩”的宏大叙事,无一不在强调父母的绝对权威与无私奉献。所有的家庭,在教科书和老师的口中,都被描绘成一幅幅温馨和睦的图画。这让我产生了一种错觉,我以为我的家庭就是“正常”的,甚至是“幸福”的,因为至少,它符合了“父母为你好”这个核心设定。我以为所有的家庭都是这个样子的,所有的孩子都是在类似的“敲打”与“管教”中长大的。

于是,我开始自我怀疑,自我欺骗。我告诉自己:父母用恶毒的语言骂我,甚至暴力殴打我,是因为爱我,是“爱之深,责之切”;他们不关心我的感受,是因为他们那代人不懂得表达;他们控制我的人生,是怕我走弯路。我强迫自己去相信,那个冷冰冰的、充满压抑的家,就是“爱”的模样。我甚至会美化那些痛苦的记忆,为他们的行为寻找各种合理的解释。

这种被长期洗脑的后果是灾难性的。它导致了我各方面的人格缺陷。因为从未被无条件地接纳,所以我没有建立起稳定的“自我价值感”;因为情绪总被压抑,所以我丧失了与自己情绪连接的能力;因为总被要求“听话”,所以我没有发展出独立的思考和判断能力;因为从未见过健康的亲密关系范本,所以我在自己的人际关系中,只会笨拙地复制那种“控制”与“被控制”的模式。

这种自我欺骗,让我失去了辨别真相的能力。当我看到别人的家庭里,父母会和孩子像朋友一样聊天,会拥抱他们,会鼓励他们去追求自己的梦想时,我内心的第一反应不是羡慕,而是困惑,甚至觉得“那样的家庭不正常”。我已经被洗脑到,把有毒的关系,当成了唯一的范本。

直到我成年后,经历了无数次的痛苦与失败,通过了解心理学的信息,通过与极少数能够坦诚交流的朋友对话,我才像一个从漫长的昏迷中苏醒的病人,慢慢地、惊恐地意识到,我所成长的那个“家”,并非爱的正常形态,而是一个情感的荒漠。

这个发现的过程,是极其痛苦的。它意味着我要推翻自己前半生赖以生存的认知基石。起初是愤怒,对父母的愤怒,对命运不公的愤怒。然后是巨大的悲伤,为那个从未被善待过的、小小的自己而悲伤。但最终,当情绪的潮水退去,留下的是一种清醒的、近乎残酷的平静。我明白,去追究、去怨恨,已经没有意义。我的父母,也是他们自己原生家庭的受害者,他们无法给出他们自己都未曾拥有过的东西。

指望他们来“拯救”我,是不可能的。唯一的出路,只剩下“自我拯救”。我必须成为自己的“理想父母”,去重新养育那个内心深处遍体鳞伤的小孩。我要学着给自己无条件的肯定,学着安抚自己的恐惧,学着倾听自己的心声,学着为自己的生活建立秩序和边界。这是一条孤独而漫长的路,没有人可以替代我走。我必须独自一人,回到那个无爱的源头,直面那片废墟,然后,亲手为自己点亮一盏灯。

回望与忏悔:为了更好地前行

当我将前半生的这四个切面——精神的囚笼、破碎的人格、无舵的人生、无爱的家庭——逐一铺陈开来,我看到的,是一幅充满了因果链条的、令人窒息的图景。它们环环相扣,互为因果,共同织就了我过去那张灰暗的人生之网。

家庭的无爱,是我人格缺陷的“因”;不健全的人格,是我在求学、工作与人际关系中屡屡受挫的“因”;而这所有的挫败与长期的精神压抑,最终催生了抑郁、焦虑和躁狂的“果”。这是一个看似完美的逻辑闭环,一个让我可以心安理得地将所有过错都归咎于“命运”与“原生家庭”的闭环。

但如果我的反思仅仅停留于此,那么我所有的痛苦,都将变得毫无价值。因为这样的反思,本质上仍是一种“受害者”的叙事。它能带来一时的解脱,却无法给予我前行的力量。

所以,在回顾了这一切之后,我认为,我必须要做一件更重要、也更艰难的事——那就是“忏悔”。

这里的“忏悔”,并非宗教意义上的祈求宽恕。它是一种更为深刻的、面向自我的“诚实”与“担当”。它意味着,我必须清晰地认识到,无论我的伤口从何而来,那些由我亲手造成的伤害,责任都在于我。

我需要忏悔。为了那些曾被我用尖刻言语刺伤的朋友。他们曾向我伸出温暖的手,我却因为内心的恐慌与扭曲,用冰冷的尖刺回报。我的自私、多疑和情绪化的索取,消耗了他们的善意与耐心。我不能再用“因为我受过伤,所以我才会伤人”来为自己辩解。伤口,不能成为伤害他人的许可证。我亏欠他们一个真诚的、迟到的道歉,即使这个道歉,他们可能永远也听不到。

我需要忏悔。为了那些被我搞砸的工作和辜负的信任。我曾将自己的不安全感和恐惧,投射到职场环境中,制造了不必要的紧张和冲突。我曾因为无法管理好自己的情绪,而影响了团队的协作和工作的进展。我不能再用“我有人格缺陷”来作为自己不负责任的借口。承认自己的局限,并为因此造成的后果承担责任,这是一个成年人最基本的体面。

我需要忏悔。更是为了我自己。为了那个在过去三十多年里,被我无情地苛责、否定、憎恨和虐待的“内在小孩”。我曾是他最严酷的狱卒。在他需要安慰时,我对他冷嘲热讽;在他感到恐惧时,我骂他懦弱无能;在他渴望被爱时,我告诉他“你不配”。我用外界(尤其是父母)对待我的方式,内化成了我对待自己的方式,甚至变本加厉。我对自己犯下的罪,远比任何人对我犯下的更深重。我必须向这个被我囚禁已久的自己,致以最深的歉意。

这种忏悔,不是为了自我惩罚,也不是为了沉溺于愧疚。恰恰相反,它是为了“解放”。只有当我真正地、不带任何借口地承认了自己的“过错”,我才能从那个“我是无辜受害者”的沉重枷锁中解脱出来。因为“受害者”的身份,在给予我道德庇护的同时,也剥夺了我作为“主导者”的力量。只要我还是一个“受害者”,我就永远需要等待一个“加害者”的道歉,或者一个“拯救者”的出现。而忏悔,则是我将人生的主导权,重新夺回到自己手中的一个庄严仪式。

它意味着,我对自己说:是的,我的起点很糟糕,我的牌很烂。是的,我因此犯了很多错,走了很多弯路,伤害了很多人,也伤害了自己。我看见了,我承认了,我为此感到悔恨。现在,这一切都过去了。从今天起,我要为我未来的每一个选择负责。

回望前半生,就像凝视一片废墟。但忏悔,如同在这片废墟上举行的、一场肃穆的悼念仪式。悼念那个逝去的、充满错误的“我”,悼念那些逝去的关系与时光。仪式结束,我才能真正地放下过去,转身前行。

路还很长,那个三十多岁的“孩子”,才刚刚学会站立。他会跌倒,会迷路,会哭泣。但我知道,这一次,他不会再孤单。因为,我已经找到了那个可以永远陪伴他、引领他、爱着他的,真正的自己。

  •  

微信时光机#重庆游

📍 𝑪𝒉𝒐𝒏𝒈𝒒𝒊𝒏𝒈.
📸山里有座城,灯火与星辰🌉
ps:于今年六月份去重庆看⚽(国足世预赛)打卡,因为当时不清楚强实名的重要性在闲鱼找二手票贩买的票,并且报以侥幸心理,以至于到了重庆龙兴足球场外面没能进去,白白损失将近300RMB,不过重庆这座赛博山城还是很美的~

  •  

CNB云原生开发环境届的瑞士军刀,详解qifei项目

如要阅读全文,点击标题跳转。在 CNB 中,构建以及开发都是基于云原生环境构筑的,因此镜像成为这些操作的底层环境支撑,默认情况下,官方会以 cnbcool/default-dev-env:latest 作为拉起环境的基础镜像,但这个镜像只做了通用的基础封装,我们可以自己封装一些镜像,来作为开发与构建的基础环境。打造一个趁手的基础镜像,这是我从接触CNB一开始就在做的事情,经过长时间的打磨与优化,我做出了一个近乎完美的云开发环境,它容纳了大量的效率实践,能涵盖你开发过程中的各种场景,下边我会逐一介绍,带你领略优雅的运维魅力。

  •  

Qwen3-Coder:通义千问出品的最具代理能力的代码模型

Qwen3-Coder是什么

Qwen3-Coder(Qwen3-Coder在线体验地址博客原文Qwen/Qwen3-Coder-480B-A35B-Instruct · Hugging Face) 是通义千问出品的最具代理能力的代码模型。Qwen3-Coder 拥有多个尺寸,通义千问给大家提供当前最强大的版本,Qwen3-Coder-480B-A35B-Instruct。这是一个总参数量 480B,激活 35B 的 MoE 模型,原生支持 256K token 的上下文并可通过 YaRN 扩展到 1M token,拥有卓越的代码和 Agent 能力。Qwen3-Coder-480B-A35B-Instruct 在 Agentic Coding、Agentic Browser-Use 和 Agentic Tool-Use 上取得了开源模型的 SOTA 效果,可以与 Cluade Sonnet4 媲美。

Qwen3-Coder
Qwen3-Coder

与此同时,通义千问还推出并开源了一款用于代理式编程的命令行工具:Qwen Code(qwen-code Github 源码地址)。Qwen Code 基于 Gemini Code 进行二次开发,但我们进行了 prompt 和工具调用协议适配,使得 Qwen Code 可以最大程度激发 Qwen3-Coder 在 Agentic Coding 任务上的表现。另外,Qwen3-Coder 可以和社区优秀的编程工具结合,如 Claude Code、Cline 等,作为一款基础模型,我们期待在数字世界的任何角落都可以使用它,Agentic Coding in the World!

Qwen3-Coder

Pre-Training

通义千问在预训练阶段上仍然在努力,这次 Qwen3-Coder 我们从不同角度进行 Scaling,以提升模型的代码能力:

  • 数据扩展:总计 7.5T(代码占比 70%),在保持通用与数学能力的同时,具备卓越的编程能力;
  • 上下文扩展:原生支持 256K 上下文,借助 YaRN 可拓展至 1M,专为仓库级和动态数据(如 Pull Request)优化,助力 Agentic Coding;
  • 合成数据扩展:利用 Qwen2.5-Coder 对低质数据进行清洗与重写,显著提升整体数据质量;

Post-Training

Scaling Code RL: Hard to Solve, Easy to Verify

Scaling Code RL: Hard to Solve, Easy to Verify
Scaling Code RL: Hard to Solve, Easy to Verify

与当前社区普遍聚焦于竞赛类代码生成不同,我们认为所有的代码任务天然适合执行驱动的大规模强化学习。因此我们选择在更丰富的真实代码任务上扩展 Code RL 训练。通过自动扩展测试样例,我们构造了大量高质量的训练实例,成功释放了强化学习的潜力:不仅显著提升了代码执行成功率,还对其他任务带来增益。这将鼓励我们继续寻找 Hard to Solve, Easy to Verify 的任务,作为强化学习的土壤。

Scaling Long-Horizon RL

Scaling Long-Horizon RL
Scaling Long-Horizon RL

在真实世界的 Software Engneering Task,比如 SWE-Bench,模型需要在环境中不断交互,自主规划、选择工具调用、接受反馈不断做出新决策,这是一个典型的 Long-Horizon RL 任务。我们在 Qwen3-Coder 的后训练阶段执行了 Agent RL,鼓励模型通过多轮交互的方式利用工具解决问题。Agent RL 的主要挑战在于 Environment Scaling,我们实现了可验证环境的扩展系统,借助阿里云的基础设施,实现同时运行 20k 独立环境。这一套基础设施可以提供大规模的强化学习反馈和评测,最终我们在 SWE-bench Verified 上实现了开源模型 SOTA 的效果。

Code with Qwen3-Coder

Qwen Code

Qwen Code 是一个 CLI 工具,修改自 Gemini CLI,针对 Qwen3‑Coder系列的模型增强了解析器和工具支持。

确保已安装 Node.js 20 及以上版本,可以通过以下命令安装:

curl -qL https://www.npmjs.com/install.sh | sh

然后通过 npm 管理器安装 Qwen Code:

npm i -g @qwen-code/qwen-code

另一种方式是从源码安装:

git clone https://github.com/QwenLM/qwen-code.git
cd qwen-code && npm install && npm install -g

Qwen Code 支持 OpenAI SDK 调用 LLM,你可以导出以下环境变量,或者简单地将其放在 .envfile 中。

export OPENAI_API_KEY="your_api_key_here"
export OPENAI_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
export OPENAI_MODEL="qwen3-coder-plus"

现在,你可以通过简单地输入 qwen 来享受 Qwen-Code 和 Qwen 带来的编程体验。

Claude Code

除了 Qwen Code 之外,现在还可以将 Qwen3‑Coder 与 Claude Code 搭配使用。只需在阿里云百炼平台申请 API Key,并安装 Claude Code,即可开始畅享编码体验。

npm install -g @anthropic-ai/claude-code

我们提供了两种接入方式,帮助你无缝地用 Qwen3‑Coder 进行编码。

使用dashscope提供的代理  API

只需要将Anthropic的base url替换成dashscope上提供的endpoint即可。

export ANTHROPIC_BASE_URL=https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy
export ANTHROPIC_AUTH_TOKEN=your-dashscope-apikey

可选方案 2:使用 claude-code-config 自定义路由

Optional 2: 使用 claude-code-config 自定义路由

claude-code-router 是一个第三方的路由工具,用于为 Claude Code 灵活地切换不同的后端 API。dashScope平台提供了一个简单的扩展包 claude-code-config,可为 claude-code-router 生成包含 dashScope 支持的默认配置。

npm install -g @musistudio/claude-code-router
npm install -g @dashscope-js/claude-code-config

生成配置文件和插件目录:

ccr-dashscope

该命令会自动生成 ccr 所需的配置文件和插件目录。你也可以手动调整 ~/.claude-code-router/config.json 和 ~/.claude-code-router/plugins/ 中的配置。

最后,通过 ccr 开始使用 Claude Code:

ccr code

至此,你即可通过 ccr 使用 Claude Code 畅享 Qwen3‑Coder 的强大编码能力。祝开发顺利!

Cline

配置 Qwen3-Coder-480B-A35B-instruct 以使用 cline ‒ 进入 cline 的配置设置 ‒ 选择“OpenAI Compatible”模式 ‒ 在 OpenAI Compatible API tokens处,输入从 Dashscope 获取的密钥 ‒ 勾选“使用自定义基础 URL”,并输入:https://dashscope.aliyuncs.com/compatible-mode/v1 ‒ 输入模型名称:qwen3-coder-plus

  •  

新车牌到手记

没有正式车牌的时候,那叫一个不方便。不管是进公司车库还是小区地库,车牌识别系统压根不认临牌,每次都得跑去物业开证明,再跟门口保安好说歹说让他手动抬杆,来来回回折腾,简直磨人。周末回了趟老家,上高速更麻烦,武汉这边好多收费站都是无人值守的,只能一个劲儿按喇叭喊工作人员过来,手动输入信息,光是想想都觉得费劲。所以这几天我眼睛都快黏在牌照进度上了,好在盼星星盼月亮,车牌总算到了。

说起来,16 号一大早我就催着 4S 店去车管所确认进度,前后花了 4 个工作日,虽说这速度已经算可以了,但等待的日子还是觉得格外漫长,一天跟过一个星期似的。我记得之前买油车的时候,4S 店的人去车管所办手续,我远程配合着选号就行,也不用啥授权,他们带着我身份证就能搞定。现在选号倒是方便多了,要是想在网上选,直接上 12123APP 就行,有两种选号方式:一种是从五组号码里每组挑一个,最后再从这五个里定一个;另一种是自定义号牌,给 50 次机会,但试来试去,大概率想要的都被人占了。​

4S 店的人还给了个建议,说选号的时候带一个字母,剩下的全是数字比较好。就拿我这车牌来说,除去前面的 “鄂 AG”,后面还有五位,他们建议选纯数字的。我本来还担心纯数字的少,结果在号码库里一翻,发现还真不少。我先把带 “4” 的筛掉,再挑那些对自己有特殊含义又好记的,最后选出 4 个,跟老婆商量了半天,才定下来一个。因为我这是混动车,车牌开头只能选 鄂 AG 或者 鄂 AF。我闺女是 5 月 8 日出生的,所以后面 3 个数字就想着得好记,还得有点意义。这不,一眼就瞅见 鄂 AG58272,立马就锁定了,对我来说,这号码真是越看越顺,挺好记的。​

原本打算让 4S 店的人去车管所的选号机上再试一轮选号,可那边的人说,一旦在机子上开始选号,之前网上选的号就会自动作废。思来想去,还是放弃了机选 —— 万一现场没选到合适的,连现在这个号也没了,那可就太得不偿失了。

昨天下班一回家,我就赶紧把车牌装上了。安装过程倒是挺顺利,就是最后那 8 个防盗帽,费了老鼻子劲才按进去。我最后实在没辙,拿螺丝刀一顿猛砸,才算搞定。虽说地库里挺凉快,但折腾完还是一身汗。

不过说实话,黑色的车挂个绿牌子,看着有点怪怪的,总觉得不太协调,可能是以前看惯了蓝牌子的缘故吧。今天早上我把临牌撕了,顺便拍了张照,看着效果还不错。黑色的车是真不耐脏,这几天还下了两场小雨,车上一层浮灰。我这人向来不爱洗车,只在乎车里干净整洁,看样子只能等下大雨的时候,让雨水帮忙冲一下啦。

再说说充电桩的事儿。上周末充电桩就拿到了,我之前预约了个人来帮忙安装,可他总说忙,而且收费也不便宜。我车位到电表有 40 米远,充电桩上又不带线,我得自己买 40 米 3×6 平方的线,还得买漏电宝、辅材之类的一堆东西,再加上工人的安装费,这零零总总加起来,第一个人报价 2000,我感觉有点贵。后来我又找了个人,他报价 1600,还送一个带锁的铁箱子 —— 我这充电桩是低配的,没锁,谁都能过来充,有个带锁的箱子正好。我觉得这价格挺合适,就定了找他。可他也一直说忙,到现在也没说啥时候过来,就说有空了就来,这都过去四天了。我琢磨着,这周末要是他还不来安装,我就得重新找人了。

  •  

微信时光机#杭州行

📍 𝑯𝒂𝒏𝒈𝒁𝒉𝒐𝒖
"杭城小巷,江南如梦🍃"
"人生不过三万天,自由一天是一天."

ps:于2024.12.28-1.2去海康威视实习期离开杭州前拍摄.

  •  

随笔#给博客除除草

又是大半年没管博客了哈哈哈哈哈,回来除除草~

接下来几天陆续补几条之前的生活随笔~

后台评论审核惨不忍睹,清了一堆人机广告...

回访了一下“左邻右舍”

发现大部分博友的博客都还“健在”👍👍👍

几个博友的博客已经访问不了了,于是就给你们“隐藏”起来了,如有恢复,还麻烦留言告知一下😁

  •  

264、大暑

昨夜的雨点还遗留在玻璃上,阳光透过雨点散射,光晕怪好看的。

今日大暑,溽暑如蒸。

宜“辰起申憩,亥子养阴”,食“三瓜三豆”(西瓜、黄瓜、佛手瓜;绿豆、黑豆、豌豆)泻火解毒,饮乌梅山楂汤生津敛汗。

衣选真丝散热,常按“内关”“涌泉”清心潜阳。晨练宜在卯辰之交(6-8点)习“吹”字诀固肾水,暮时荷间泛舟迎爽。

此时“腐草为萤,土润溽暑”,养生当循“伏藏阴”之道——如老松含雪般内敛精神,伏其根则暑不侵。炎威炽盛处,一息深沉即自凉
  •  

漫长的七月

✇落园
作者Liyun

湾区夏天日照很长。诡异的是,冬天的日照很短,而从很短到很长的变化并不是线性增加的,而是像一个s曲线似的,就那么几天似的,日照就突然间变长了。

夏天漫长的日照让人舒服得不知如何去珍惜。仿佛每天都应该是这样似的。

日照的漫长也人感到七月变得格外漫长。很多事情在等待,等待到最后就会变得越来越无力。是啊,时间为什么这么漫长,又为什么让人越来越麻木。

等待应该是值得的吧,大概是的吧。

  •  

无妄之灾

事故发生前,早上开车去公司,路上开的比较快,临近公司一个左传路口时,绿灯通行时撞到了一个骑电瓶车的,两个年轻人,他们当时速度肯定不慢,接近路口时,因为我这个路口是事故多发地,就减速至30+通行,不料 左边车辆🚗突然刹停,因视野遮挡来不及反应,车辆AEB也没触发,电瓶车估计看第一辆车停了就想冲过去,飞驰而来 膨💥…… 我车头瞬间冒烟💨(冷凝器破了..

红箭头电瓶车行驶方向,绿箭头车辆行驶方向,白箭头电瓶车被撞击方向

事故发生时,根据后来行车记录仪显示,接触时速度降低到37左右,接触之前由于视线盲区没观察到此二人瞬间出现,车速甚至还上升了一两码到39!两人见我左侧车辆刹停,欲快速通过路口,不料我方冲出,随即事故发生。

事故发生后,开双闪 下车查看两人伤势,一人皮开肉绽需要缝线,另一人情况相对严重,倒地不起,应该是是骨折了。随即报120,然后122通知交警来现场处理,立三脚架。因为事故发生路段离公司很近,公司一些同事跑来观望出主意,此期间报了保险。120来后,我方因等待交警来处理暂时走不开,对方两人貌似不肯先去医院,给我展示了转账记录,意为需我垫付,后来同事纷纷表示不需要,其中一个护士亦是如此。我上去交涉让他们先去医院就诊不要耽误时间,后续保险该赔偿的都会赔偿到位,我这边要等交警来处理之后才行,后面两人才同意离开现场前往医院(后发现两人轻伤的那位一直在等我这边过去垫付医药费不肯就诊,哎..

交警抵达现场后,询问事故地点,原因,及行车记录仪等相关证据,记录仪里有行车数据。确认后,给我测了酒驾毒驾,查各种证件是否有效齐全等,后面还勘测了地形。期间几个同事商议了就是否垫付医药费及如何垫付医药费这个问题讨论了一会,最后决定结果是个人尽量不参与,全权交由交警和保险处理。保险抵达现场后,勘测了现场,同样调了记录仪查看视频,我询问到时代位追偿事宜,告诉让我不要主动揽责,不然后续可能很麻烦等。

交警拖车到后,交警就离开现场去医院了,具体去做什么不知道。然后拖车师傅直接把电瓶车拖走,让我开着我那个车子跟着走(先前交警问了我这个车子还能不能开,我一开始说应该能,后面看了下损伤部位说了估计不能开,结果最后还是要开起走..),4s店维修的也开了个车子过来,因为我之前给他们说了去他们店修。

车辆发生事故,报了保险后,一大堆电话打过来让我去他们店修车的,这种售卖信息真的让人无语,本身就出了事故忙的很,电话一个接着一个…

期间还有家4s直接开车到现场,一直劝我去他们家修,各种维修期间补贴…

后来把车子开到拖车点后,就和4s店回去了,期间问了拖车的,处理流程为:医院拿到伤残报告,和伤者/家属去交警队事故认定判责,然后就可以开具保险公司垫付证明了(后面对方已经垫付了)。

暗箱操作?

前面说到,两人送往医院后,他们没有立即就诊,因为没人垫付医药费(说实话,如果此次事故是我的责任,我甚至愿意让人替我去把医药费交了)。后面我给交警说对方没有就诊,还在等我这边处理完过去,交警也是含糊其辞,该怎么处理就怎么处理。

后面聊天才知道骑车两人,一个是学生,另一个是上班的(没买社保,医保),骑车的是学生,学生挺讲道理的,也知道自己闯红灯了,想见面一起聊下,我同事他们当时就没同意,意思我们这边需要交警责任认定之后,开具垫付证明,保险公司才能给那边垫付,但现在问题是责任认定不出来,无法开具证明,还要扣车检查,表示我们只能先去给他们争取把证明开出来,对方后面同意了。

后来出了一个事情,对方因为没有保险,就想和我商量让我占主责,说他那边朋友可以这样操作,让我这边报保险多出点,他给我补二年保险上涨的费用.. 说实话我个人倒是无所谓这么做,但是保险公司都到现场来勘验鉴定过了,他们也不傻,到时候如果出问题了肯定要找到我,真不敢赌。

对方还是表示学生没啥钱,然后坐他车那个兄弟估计要住院开刀花费2-3w,他自己只缝了几十针两三千块钱搞定了,那个兄弟公司没得保险,走工伤公司不认,他们后面还要去告公司…

哎,老哥,真不是我不近人情,只是现在这个社会这种事情大家都不敢再去赌了,太多案例了..

最后说句心里话,从道德层面上来讲我也愿意出占主责,但是这个操作背后带来的风险太大了!如果他们那边家属后面还要去做伤残鉴定呢,到时候又要涉及到保险公司,但我这边相当于骗保了,这不把自己套进去了么,这样操作后最后被坑就只能是吃哑巴亏!我爸也让我按正常流程走就行了,也没说不赔怎么的,就该怎么样就怎么样。公司两个同事之前都吃过类似的亏,我这都还好没垫付,他们是垫付了保险公司和伤者拖着一直没办法解决,几万块都是借的,那是真的恼火!

现在能做的就算等待事故鉴定出来,按正常流程走,本身也不是自己责任,明哲保身,该怎么处理就怎么处理,真不是不讲人情,是这里面的风险太多确实承担不起.. 谁都不愿意发生这样的事!人也受伤了,车也受伤了,大家时间也浪费了,希望他们以后千万不要再闯红灯了!而作为开车的一方,视野不好的情况下一定要多观察再通行!

双方都吃一堑长一智吧。

  • 悄悄说一句,其实我感觉我也挺无辜的┭┮﹏┭┮,大早上班没上成不说,就正常开车,车子还撞烂被扣车维修还要差不多一个月才能完成,而且下年保险费用肯定不会便宜了,哎。但换个角度,好在那两兄弟没出什么大问题,不然我估计会承担更多不必要的心理负担…

对了,差点忘了一个场景,那就是现场的吃瓜群众!

  • 就什么人都有!我记得甚至有个来问我(不知道我是车主)是不是这新能源车开的太快了,现在这些车子乱跑怎么怎么样的.. 真乃事不关己高高挂起也,当然我也没点破。也有一些明事理的来问,事情发生的来龙去脉,表示现在闯红灯现象屡禁不止。还有一些中立吃瓜的,围观看热闹。总之基本什么人都有,这就造成的了人云亦云的环境,谣言也是从此而生,纵观互联网各大事件,何不如此?作为一个未知全貌的旁观者,要做的只需不予置评,而不是人云亦云,毫无主见,如此。

最新进展

0723今天是星期三,

交警约定一起去做责任认定的时间,对方仍然想尝试让我担主责或同责。对方部分家属还表示想等住院的伤者康复后再处理…… 主要是我的车子还被扣留着,无法维修,这期间我也无法使用车辆。电话打到交警处理处询问,对方最长可拖延至10日,之后,才能直接去处理,期间,只能沟通协商… 听到这我确实很无语,我也是受害者之一,尤其是车辆被扣还不能拉去维修,车子本身维修就要话半个月时间,这样一拖得一个多月了,第二年保险又要涨,谁又来赔偿我的损失呢?…

唯一值得庆幸的是那个轻伤的电瓶车车主,学生,人也比较好说话,见我不松口实在没办法也表示只能认了,人教人不会,事教人一次就会,都懂这些。

0724今天是星期四

昨天那边貌似想通了决定先去定责,因为需要交警出具保险垫付证明,约定今日下午去。再见时学生杵了根拐棍,其身旁有个年轻人应该是他朋友。另一位是住院伤者的父亲,略带面容憔悴。一起填写提交资料后,看了道路监控,看到他们闯红灯被撞,估计心里也是五味杂陈,出门外也感慨不该闯红灯。他们两家人的关系是一个村的,都认识,虽然他们表面上没有责怪学生闯红灯,但内心肯定有隔阂了,不然学生也不会来央求我同责让对方去起诉工伤了,哎!

到后面警方表示出具垫付证明需要伤者出具医院开具的伤情报告,但其中一个没做这个报告(是那个学生没弄,因为轻伤,不太愿意花钱,连出车祸都没跟父母说,就怕父母担心跑来看他)。后面交警约定先让他们去做当前的伤情报告,明天再来处理。

让人无语的是在交警队处理资料,还要到外面去复印。。

那位老父亲,也是让人感慨万分。可能知道是他们那方的责任,从始至终也没主动说我什么,做笔录的时候也是一脸惆怅,不知如何下手… 我不忍心问了下他孩子在医院的情况,一言难尽,哎。那哥们说看面相也是个老实本分人..

对方越是如此,就越心里过意不去,真不敢想要是我主责会是个什么样子,这种想法估计只有被坑过一次才能彻底消散。

也看了各位博友发表的意见和建议,不禁感慨!当今世道,可悲!可叹呐.. 与此同时,我也可怜我那小车车,何故受此无妄之灾啊?!..

  •  

家庭数据中心系列 WordPress多活架构(简版)在个人博客中的落地方案

家庭数据中心系列 WordPress多活架构(简版)在个人博客中的落地方案 无敌的个人博客 tangwudi

1 背景介绍 最初之所以会萌生要搞一套 WordPress 多活方案的想法,最根本的导火索其实很简单:那次家里毫无征兆地被电信断网整整 3 天(详见文章:家庭数据中心系列 从这次家里被断网谈当下个人博客建站的可选方式)。因为当时我博客的WordPress只有家庭数据中心这一个节点,结果直接导致博客直接歇菜,无法访问了。虽然当时紧急把数据迁移到了腾讯云的轻量服务器上,也在大约 2 个小时后恢复了访问,但那段时间的郁闷至今仍然印象深刻。也就是在那一刻,我暗下决心:必须要搞一套真正意义上的 WordPress 双活架构(当时只想到双活),让家里的博客哪怕出问题,也能第一时间无缝切换到备用节点,不再出现这种“好好的博客说没就没”的尴尬局面。 只不过,那个时候我搭建和运维博客还不到一年,很多知识还处于碎片化探索阶段,体系远远不够完整,结果折腾到最后,也只好先退而求其次,先搞了一个半吊子的灾备方案,以 […]

<p>The post 家庭数据中心系列 WordPress多活架构(简版)在个人博客中的落地方案 first appeared on 无敌的个人博客.</p>

  •  

vuepress-vdoing主题配置自建不蒜子统计

如要阅读全文,点击标题跳转。近几日,不蒜子官方出现过一波三天宕机的情况,使得自建不蒜子这一早该实施的事项,让我不得不开始折腾起来了。

  •  

Puock 一款Typecho主题

AI摘要:Puock是一款移植自WordPress的Typecho主题,支持Typecho 1.2.1版本,需PHP7.4+、GD扩展及MySQL/SQLite数据库。完整功能需配合links和Puock插件使用。

介绍

移植开源项目 Licoy/wordpress-theme-puock 而来.

实现了大部分的功能

待完成的功能

第三方登录

预览

Puock 一款Typecho主题

github

使用环境

  • Typecho 版本 1.2.1 暂不支持 1.3.0
  • php7.4以上
  • 支持mysql & sqlite
  • 开启 php 拓展gd

完整功能需使用插件 links & Puock

  •  

西安·十几年后的初识

在武汉的四年时光里,我经历了许多成长,也学会了独立。从那个懵懂的孩子,渐渐变成了小伙子。而西安,这座我生活了十余年的家,却始终未曾被我真正探寻。趁着这个难得的暑假,我决定重新走进这座历史悠久的古城,细细品味她的风华与故事,重新认识那个藏在记忆深处的西安。
  •  

说说:#1752827806

又是一年夏日,祝我生日快乐!今年没有买蛋糕,等着晚上吃面条吧!夏天了想去海边游泳(虽然并不会游泳),也想着海边烤串和搭帐篷,比如像摇曳露营里在湖边搭帐篷静心享受自然。

  •  

如何自搭建STUN服务器?使用Docker快速搭建STUN服务器方法

这篇文章介绍了如何利用 Docker 和 Docker Compose 部署 coturn STUN 服务器,以及实现基本的 NAT 穿透功能。通过在小米服务器上搭建一个轻量级 STUN 服务器,并配置端口映射和 DNS 解析,文章展示了如何实现服务对外部访问的穿透。文章还详细分享了配置过程中的关键步骤,如禁用身份验证和加密功能,避免复杂性并简化测试过程。此外,文章还讨论了防火墙设置以允许 UDP 3478 端口的通信,并提供了解析 A 记录和验证服务的方法。最后,文章提供了一个 STUN 服务器的示例列表,方便读者参考和验证。通过这些内容,文章希望为读者提供一套简洁而强大的工具,用于实现基本的 NAT 穿透和 STUN 服务部署。

  •  

EdgeOne使用体验分享

说实话,作为一个喜欢折腾网站的技术宅,看到腾讯云推出EdgeOne的时候还挺兴奋的。这个服务把网站防护和加速打包在一起,最打动我的是它承诺永久免费——毕竟现在靠谱的免费服务真的不多了。

目前我用的是多吉云的免费CDN,其实已经挺够用的了。但你们懂的,看到新东西就手痒想试试。本来想正经去申请试用,但看到要抢码或者做推广任务,我这个懒癌晚期患者就直接在闲鱼花10块钱买了个激活码。

买完之后反而纠结了:该用在哪呢?我的博客已经优化得飞起,加了EdgeOne估计也感觉不出差别。最后决定给我的锐谷论坛用上,效果确实不错:

最明显的是页面打开变快了,特别是图片多的帖子;
后台看到拦截了不少恶意扫描和攻击;
全国各地访问速度都挺稳定;

不得不承认,EdgeOne这种免费又实用的服务,对我们这些小站长来说简直是福音。

听说买付费版,到期之后就变成免费版了,有兴趣可以试试。


  •  

AI 编码方法论:从探索到精进的系统化实践

该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/posts/tech/ai-coding-methodology-systematic-practice
IMPORTANT

此文章由 AI 总结和润色内部分享,由笔者校对,请注意甄别。

方法论演进路径

阶段一:提示工程(Prompt Engineering)

作为 AI 辅助开发的最基础形态,提示工程采用离散式交互模式。开发者通过连续对话逐步细化需求,AI 基于即时反馈进行代码迭代。该模式在需求边界模糊、探索性强的场景中具有天然优势,但存在显著的效率瓶颈。

特征分析

  • 交互模式:线性对话驱动,缺乏系统性规划
  • 迭代成本:高频率人工介入,需求理解偏差导致的重构成本显著
  • 时间复杂度:O(n²) 级别,随需求复杂度指数增长
  • 质量曲线:收敛速度慢,最终效果依赖开发者经验判断

实践案例研究

案例 1:高性能图片预览库开发

项目背景:构建基于 WebGL 的高性能图片预览解决方案

开发过程回溯:

afilmory 项目 中,初期采用纯对话式开发模式。经过数周的探索性开发,通过 20+ 轮次的需求澄清和架构重构,最终采用 Gemini-2.5-pro-preview-0605 进行系统性重写,产出 最终方案

案例 2:Landing Page 重构

需求描述:"重新构建 folo.is landing page 的 UI,使其现代化,AI 风格。样式参考 Vercel、Linear 的 landing page 设计"

交互过程可视化:

通过 12 轮精细化微调,涵盖:

  • 视觉层次优化(图片错位修正)
  • 色彩系统统一(移除紫色渐变,采用主题色方案)
  • 交互元素规范化(圆角、阴影、动效)
  • 信息架构重组(Accordion 组件移除,内容整合至详情页)

阶段二:探索式工程(Exploratory Engineering)

该模式构建了需求澄清的系统性框架,将 AI 从代码实现者转变为架构顾问。通过结构化的需求勘探,显著降低后期重构成本。

案例实践:Feature Flags 系统

探索式对话过程:

流程优化

  1. 需求解构:将模糊需求分解为可验证的技术命题
  2. 架构预研:基于约束条件评估技术方案可行性
  3. 风险识别:提前暴露实现路径中的潜在阻塞点
  4. 决策固化:形成可执行的技术规格说明书

💡 关键提示:在探索式对话确定最终方案后,务必让 AI 将完整的架构决策、技术选型、接口设计等核心要素输出到结构化文档(如 ARCHITECTURE_DECISION_RECORD.md)。这能防止后续实现过程中因上下文窗口限制或记忆衰减导致的方向偏离,确保实现过程与既定方案保持严格一致。

阶段三:上下文工程(Context Engineering)

实现从"AI 能做什么"到"AI 应该怎么做"的认知跃迁。通过构建完整的项目上下文,将隐性知识显性化,确保 AI 行为与项目规范高度一致。

上下文构建框架

1. PRD Specification Template

# Product Requirements Document (PRD)

## Objective
- [Clearly defined, measurable feature goals]

## Technical Constraints
- [Non-negotiable technical decisions]
- [Architectural principles that must be followed]

## Quality Standards
- [Performance benchmarks]
- [Maintainability requirements]
- [Test coverage criteria]

## Integration Requirements
- [External dependencies inventory]
- [Interface specifications]

## Deliverables Definition
- [Code organization patterns]
- [Documentation requirements]

2. Context Engineering Automation

https://github.com/coleam00/context-engineering-intro

PRD Generation Workflow: 1752764432740

Implementation Execution: 1752764438107

Core Commands:

  • /generate-prps: Generate technical implementation plan from PRD specifications
  • /execute-prp: Execute development tasks according to predefined plan

项目认知增强体系

知识图谱构建

AI 的认知受限于上下文窗口,无法完整理解项目所有细节。通过构建可维护的知识图谱,实现项目智慧的持续积累。

1. 项目索引初始化

Claude Code:

# 初始化项目认知
/init

生成基础项目记忆,包括:

  • 技术栈识别
  • 目录结构解析
  • 构建流程梳理
  • 基础约束提取

2. 规范化知识注入

案例:UIKit 颜色系统规范

Prompt:

你应该使用 tailwindcss-uikit-color 文档是 https://github.com/Innei/apple-uikit-colors, 使用这个颜色系统去编写组件,这个规则写到 claude.md

AI 理解的规范化表达:

### UI/UX Guidelines
- Use Apple UIKit color system via tailwind-uikit-colors package
- Prefer semantic color names: `text-primary`, `fill-secondary`, `material-thin`, etc.
- Follow system colors: `red`, `blue`, `green`, `mint`, `teal`, `cyan`, `indigo`, `purple`, `pink`, `brown`, `gray`
- Use material design principles with opacity-based fills and proper contrast

3. 约束规则持续集成

i18n 规范示例

Prompt:

你在编写 i18n key 时,应该使用扁平 key,不能使用冲突的 key 如 exif.custom.rendered.custom 和 exif.custom.rendered,你应该遵循语言的规则;最后把这个规则写到 claude.md 中。

通过交互式反馈,将隐式约束转化为显式规则:

#### i18n Writing Guidelines

1. Follow [i18next formatting guidelines](https://www.i18next.com/translation-function/formatting)
2. **Use flat keys only** - Use `.` notation for separation, no nested objects
3. For plural-sensitive languages, use `_one` and `_other` suffixes
4. **Avoid conflicting flat keys** - During build, flat dot-separated keys (e.g., 'exif.custom.rendered.custom') are automatically converted to nested objects, which can cause conflicts. 

Example:
```json
{
  "personalize.title": "Personalization",
  "personalize.prompt.label": "Personal Prompt",
  "shortcuts.add": "Add Shortcut",
  "shortcuts.validation.required": "Name and prompt are required"
}
```

Claude Code 增强实践

SuperClaude 集成

SuperClaude 提供了一系列增强命令:

  • /document: 自动化文档生成
  • /review: 代码质量审查
  • /refactor: 重构建议

全局记忆配置

~/.claude/CLAUDE.md 中配置全局行为准则:


### Code Structure & Modularity
- **Never create a file longer than 500 lines of code.** If a file approaches this limit, refactor by splitting it into modules or helper files.

### Documentation & Explainability
- **Comment non-obvious code** and ensure everything is understandable to a mid-level developer.
- When writing complex logic, **add an inline `# Reason:` comment** explaining the why, not just the what.

### 🧠 AI Behavior Rules
- **Never assume missing context. Ask questions if uncertain.**
- **Never hallucinate libraries or functions** – only use known, verified packages.
- **Always confirm file paths and module names** exist before referencing them in code or tests.
- **Security** You are prohibited from accessing the contents of any .env files within the project.

方法论总结

AI 编码已从简单的代码生成演进为系统化的工程实践。关键认知转变:

  1. 从工具到伙伴:AI 从执行者转变为协作伙伴
  2. 从随机到确定:通过上下文工程消除不确定性
  3. 从短期到长期:构建可持续演进的项目知识体系
  4. 从个体到系统:形成可复制、可扩展的 AI 协作框架

最终,AI 工程的核心在于将人类的专业判断与 AI 的执行能力有机结合,在保持技术前瞻性的同时,确保交付物的工程质量和长期可维护性。

看完了?说点什么呢

  •  

雀魂 MajsoulMax / Akagi / MajsoulCopilot 使用教程

import { GithubCard } from 'astro-pure/advanced' import { Aside } from 'astro-pure/user'

  1. 本文及出现的我的相关项目仅供学习参考之用,请勿用于商业用途,请使用者于下载 24 小时内删除相关内容。
  2. 不建议使用 AI 代打(但你可以适当使用 AI 辅助学习如何打牌可以最大化牌效、如何防守等),这于你的技术水平无益,AI 上去的分也没有意义,而且使用自动代打极其容易被封号。
  3. 如果本文或相关项目对你有帮助,欢迎 Star。

MajsoulMax

雀魂 Max 可用于本地解锁全角色、皮肤、装扮等。

原始 Python 仓库:

基于 Rust 重构的仓库:

在前者基础上,外加 TinyProxy 做鉴权并封装为了 Docker 镜像:

MajsoulMax 初始化的时候会自动下载更新 liqi 这一依赖,请保证你的网络环境可以正常访问 GitHub。

同时,建议关闭 MajsoulMax 的 helper 功能。

解锁原理

首先我们要明白,MITM(Man-in-the-Middle) 中间人攻击的本质是在雀魂游戏进程和服务器之间插入一个代理。当游戏客户端发送请求到服务器,或服务器返回响应给客户端时,这些网络流量都会经过我们启动的代理程序。

也即,原来是:

game -> server

现在变成了:

game -> proxy -> server

代理程序会识别出特定的游戏数据包(Protobuf 格式),并根据预设的规则在本地对其进行实时修改,将“未拥有”的角色或装扮数据修改为“已拥有”。修改后的数据包再被发送到游戏客户端,从而在视觉上欺骗客户端,让我们看到已经解锁了全角色和装扮。这个过程只发生在你的电脑或手机上,服务器端的数据完全没有改变。

由于他只是一个代理,所以部署在本地或者服务器 VPS 上都可以,而如果部署在 VPS 上,便可以实现全平台使用,且数据共享。

各个版本的差异:

  • Python:基于 mitmproxy 实现,兼容性最好,但需要手动安装管理依赖,可以比较方便的实现上下游代理链,兼容本地 AI 使用。
  • Rust / Docker:基于 hudsucker 实现,兼容性较差,优点是已经完全编译为二进制文件,快速启动无需安装依赖。

注意,Rust / Docker 所基于的 omjadas/hudsucker 项目有一个很令人困惑的地方,即其虽然身为会进行 MITM 的节点,但是对外提供的是 HTTP 的代理节点而非 HTTPS 的代理节点。这导致你必须在填写代理软件的时候,填写 HTTP 代理,并且同时信任其自签名的证书,而且在对流量进行代理链式配置的时候(如搭配本地 AI 软件),也会存在一些问题。

这点具体表现在:

  1. 游戏初始化的时候不能过双层代理链(解锁 + AI),只能插入一层代理

  2. 通过 Surge 测速的时候,日志会显示

    WARN hudsucker::proxy::internal: Unknown protocol, read '[48, 45, 41, 44]' from upgraded connection
    

    不过这并不影响使用。

我尝试了一些办法,但始终无法解决这个问题,只能做简易 Patch,详情见后。

启动代理

请首先阅读各项目的 README 文档,了解启动方法。

Python

git clone https://github.com/Avenshy/MajsoulMax.git
cd MajsoulMax
pip install -r requirements.txt
mitmdump -p 23410 -s addons.py

Rust

无需下载源码,直接在 Releases 根据你的平台下载二进制文件,解压出来后运行 majsoul_max_rs 即可。

Docker

目前只支持 Linux 平台。

  1. 拉取并启动服务

    创建并进入目录:

    mkdir majsoul && cd majsoul
    

    然后创建 docker-compose.yml

    services:
        majsoul-proxy:
            image: arthals/majsoul-max-rs:latest
            restart: unless-stopped
            ports:
                # 将容器的 23411 端口映射到宿主机的 8888 端口
                - '8888:23411'
            volumes:
                - ./app:/app
            environment:
                - username=username
                - password=password
                # Github 代理下载
                - download_url=https://ghproxy.net/https://github.com/Xerxes-2/MajsoulMax-rs/releases/download/0.6.7/majsoul_max_rs-0.6.7-x86_64-unknown-linux-gnu.tar.gz
                # 原始下载
                # - download_url=https://github.com/Xerxes-2/MajsoulMax-rs/releases/download/0.6.7/majsoul_max_rs-0.6.7-x86_64-unknown-linux-gnu.tar.gz
                # 可选:代理下载
                # - http_proxy=${HTTP_PROXY:-http://172.17.0.1:7890}
                # - https_proxy=${HTTPS_PROXY:-http://172.17.0.1:7890}
    

    启动容器:

    docker compose up -d
    

    默认会:

    • 映射宿主机 8888 端口到容器 23411 端口。
    • 使用账号 username/password 进行 Basic Auth 认证。
    • 通过 download_url 环境变量自动下载 GNU 版本的可执行文件。

    如需修改端口或账号密码,请直接编辑 docker-compose.yml 对应字段即可。

  2. 验证运行

    curl -k -x http://username:password@127.0.0.1:8888 https://baidu.com --head
    

    返回 HTTP/1.1 200 OK 即代表代理工作正常。

    然后你需要放行你服务器的 8888(或同自定义)端口,使之可以在外网访问。

信任证书

  • 对于原始 Python 仓库,需要信任 ~/.mitmproxy/ 下的 mitmproxy-ca-cert.pem 证书。这个证书是本地自动生成的,非常安全。
  • 对于 Rust 版本或者 Docker 封装版本,需要信任 hudsucker.cer 证书。这个证书是在源码中写死的,如果你担心安全性,想要更换证书,你需要下载源码替换后重新编译。

以下以 hudsucker.cer 证书为例,讲解步骤:

macOS

  1. 将证书拖入到 钥匙串访问-系统-证书

    macOS1

  2. 右键-显示简介-信任,调整为始终信任,然后关闭,输入密码确认。

    macOS2

iOS / iPadOS

  1. 将下载好的 hudsucker.cer 隔空投送到 iPhone/iPad 上,进入 设置-已下载描述文件,点击安装

  2. 前往 通用-关于本机-证书信任设置,打开 Hudsucker Industries 的选项

    iOS

Windows / Android

点击下载下来的 hudsucker.cer 证书文件,跟随指引安装证书即可。

代理配置

原始项目需要使用 Proxifier 来进行流量代理,然而我们有更好的选择,那就是直接利用 Surge / Clash 来进行规则分流代理。

注意,如果是本地客户端,请开启 TUN / 增强模式以确保正确代理进程流量。

以下配置在 macOS Steam 客户端和 iOS / iPadOS 港服客户端测试通过,注意替换相关字段(IP、端口、协议、账号密码)为你的实际值。

Python

提供的是本地 HTTPS 节点,无需账号密码。

Clash 配置示例:

proxies:
    - name: Majsoul
      port: 23410
      server: 127.0.0.1
      tls: true
      type: http
proxy-groups:
    - name: 🀄 雀魂麻将
      proxies:
          - Majsoul
          - DIRECT
      type: select
rules:
    - PROCESS-NAME,雀魂麻將,🀄 雀魂麻将
    - PROCESS-NAME,jantama_mahjongsoul.exe,🀄 雀魂麻将
    - PROCESS-NAME,Jantama_MahjongSoul.exe,🀄 雀魂麻将

Surge 配置示例:

[Proxy]
Majsoul = https, 127.0.0.1, 23410

[Proxy Group]
🀄 雀魂麻将 = select, Majsoul, DIRECT

[Rule]
PROCESS-NAME,雀魂麻將,🀄 雀魂麻将

Rust

提供的是本地 HTTP 节点,无需账号密码。

Clash 配置示例:

proxies:
    - name: Majsoul
      port: 23410
      server: 127.0.0.1
      tls: false
      type: http
proxy-groups:
    - name: 🀄 雀魂麻将
      proxies:
          - Majsoul
          - DIRECT
      type: select
rules:
    - PROCESS-NAME,雀魂麻將,🀄 雀魂麻将
    - PROCESS-NAME,jantama_mahjongsoul.exe,🀄 雀魂麻将
    - PROCESS-NAME,Jantama_MahjongSoul.exe,🀄 雀魂麻将

Surge 配置示例:

[Proxy]
Majsoul = http, 127.0.0.1, 23410

[Proxy Group]
🀄 雀魂麻将 = select, Majsoul, DIRECT

[Rule]
PROCESS-NAME,雀魂麻將,🀄 雀魂麻将

Docker

提供的是远程 HTTP 节点,需要账号密码、IP 端口等配置,此时服务器作为中间代理,而客户端设备只需要信任证书后配置节点和分流规则即可。

Docker 的配置和 Rust 非常类似,只是多了一个鉴权部分。

Clash:

proxies:
    - name: Majsoul
      port: your_service_port
      server: your_server_ip
      tls: false
      type: http
      username: username
      password: password

Surge:

[Proxy]
Majsoul = http, your_server_ip, 8888, username, password

如果你是桌面端,请参考之前的 Rust 版本配置,只需替换 proxies 字段即可,无需对规则做操作;

如果你是移动端设备,即 iOS(无法使用 PROCESS-NAME 规则,会被忽略)或者是安卓但不确定 PROCESS-NAME 是否正确,那你需要将规则改为域名关键字或者 IP 分流,如下:

Clash:

rules:
    - DOMAIN-KEYWORD,majsoul,🀄 雀魂麻将
    - DOMAIN-KEYWORD,maj-soul,🀄 雀魂麻将
    - DOMAIN-KEYWORD,catmjstudio,🀄 雀魂麻将
    - DOMAIN-KEYWORD,catmajsoul,🀄 雀魂麻将
    - IP-CIDR,146.66.155.0/24,🀄 雀魂麻将
    - IP-CIDR,185.25.182.18/32,🀄 雀魂麻将
    - IP-CIDR,203.107.63.200/32,🀄 雀魂麻将

Surge:

[Rule]
DOMAIN-KEYWORD,majsoul,🀄 雀魂麻将
DOMAIN-KEYWORD,maj-soul,🀄 雀魂麻将
DOMAIN-KEYWORD,catmjstudio,🀄 雀魂麻将
DOMAIN-KEYWORD,catmajsoul,🀄 雀魂麻将
IP-CIDR,146.66.155.0/24,🀄 雀魂麻将
IP-CIDR,185.25.182.18/32,🀄 雀魂麻将
IP-CIDR,203.107.63.200/32,🀄 雀魂麻将

Akagi

Akagi 可以提供 AI 雀魂分析,帮你分析下一步应当打什么牌,并且具有一个十分现代化的 TUI(Terminal UI),对于 Windows 客户端,还可以下载编译好的版本完成自动代打,不过我没尝试过。

akagi

AI 原理

和解锁类似,AI 的工作流程也是通过 MITM 来截获对局信息,从而还原出牌局状况,然后送入 AI 来进行分析。所以你需要类似的完成信任证书、配置软件分流的操作。

Akagi 使用的证书和 MajsoulMax 的 Python 版本一致,位于 ~/.mitmproxy

对于 Windows 用户,可以直接下载编译好的 exe 可执行文件;对于 macOS 用户,则必须手动执行 py 脚本。

启动 AI

git clone https://github.com/shinkuan/Akagi.git
cd Akagi
pip install -r requirements.txt
# 然后按照原仓库的 README 走
# 先按照 For Developer 走,配置好 libriichi 的依赖
# 然后同前文(macOS)或者 README(Windows) 一样,安装证书。
python run_akagi.py

原始仓库提供了一个基础的 Mortal 版本,不过你可以在 这个 issue 下载到更新的权重。

需要注意的是,如果你替换了权重,那你也需要相应的修改 mjai_bot/mortal 下的 model.pybot.py,注意 issue 直接下载下来的 model.py 直接拖进去是不行的,这两个文件都需要稍微的改一改导入语句。

MajsoulCopilot

类似 Akagi 的项目,也是可以本地提供 AI 辅助,不同的是其同时支持 Windows / macOS 的自动打牌功能,而 Akagi 虽然也支持,但只支持 Windows 平台。

我的 Fork 版本(修了一些 macOS 上的证书信任检测问题,支持兼容雀魂 Max 解锁,但 PR 尚未合并,推荐使用):

自动打牌原理

自动打牌基本就是通过在浏览器里定位控件元素,并模拟鼠标操作,来完成自动打牌、自动开启对局等功能。

然而,其不仅存在一些限制(浏览器分辨率、尺寸等),而且浏览器的渲染界面(至少在 macOS 上)精度不如客户端,体验也有所残缺,且自动打牌很容易被封号,所以不建议使用。

启动 Copilot

参见原文 README 即可。

与 Akagi 不同的是,对于 MahjongCopilot,只需要将模型文件拖入即可,无需再额外修改代码。

值得注意的一点是,MahjongCopilot 与前文的项目有所不同的一点是,其做了一层隔离,所需要信任的证书位于 ./mitm_config 下而非默认的 ~/.mitmproxy,这一点在联合使用的时候可能需要注意,但代码应当会自动完成信任过程。

联合使用

Akagi + MajsoulMax

由于二者都需要进行 MITM,所以你需要配置代理链让流量串行经过两个节点,并且需要同时信任二者的证书。

注意,联用二者的时候,千万不要同时使用 PROCESS-NAME 和 DOMAIN-KEYWORD / IP-CIDR 规则,否则容易导致回环代理,出现 Bug。

这里有基于 MajsoulMax-rs 和基于 MajsoulMax 的两种配置,配置相近,不同点在于:

  1. MajsoulMax-rs(Rust)启动的是 HTTP 代理(基于 hudsucker),且链式代理时,初始化的时候会遇到问题
  2. MajsoulMax(Python)启动的是 HTTPS 代理(基于 mitmproxy),可以完美进行链式代理。

虽然听起来后者更好,但还是建议按照前者走,原因无他,方便快捷(无需切换 Python 环境等)。

Rust 版本代理链条如下:

game -> majsoul_max_rs(23410, http) -> akagi(7880, https) -> server

Python 版本代理链条如下:

game -> MajsoulMax(23410, https) -> akagi(7880, https) -> server

建议的配置如下:

Clash:

proxies:
    - name: Majsoul
      port: your_service_port
      server: your_server_ip
      tls: false
      type: http
      username: username
      password: password
    - name: MajsoulLocal
      port: 23410
      server: 127.0.0.1
      tls: false
      type: http
    - name: Akagi
      port: 7880
      server: 127.0.0.1
      tls: true
      type: http
proxy-groups:
    - name: 🀄 雀魂麻将
      proxies:
          - Majsoul
          - MajsoulLocal
          - DIRECT
          - 🔰 节点选择
      type: select
rules:
    - PROCESS-NAME,雀魂麻將,🀄 雀魂麻将
    - PROCESS-NAME,majsoul_max_rs,Akagi

Surge:

[Proxy]
Majsoul = http, your_server_ip, your_service_port, username, password
MajsoulLocal = http, 127.0.0.1, 23410
Akagi = http, 127.0.0.1, 7880

[Proxy Group]
🀄 雀魂麻将 = select, Majsoul, MajsoulLocal, DIRECT, 🔰 节点选择

[Rule]
PROCESS-NAME,雀魂麻將,🀄 雀魂麻将
PROCESS-NAME,majsoul_max_rs,Akagi

这么配置的好处在于,你可以在不想用 AI 的时候分流到服务器上的 Majsoul 节点进行简单的解锁,而在需要 AI 的时候,先通过服务器节点或者直连进行初始化,然后再换到本地的 MajsoulLocal 节点即可。

如果你实在嫌麻烦,你还可以让 LLM 给你写一个基于 Clash / Surge HTTP API 的自动化脚本,来完成这个过程。

MahjongCopilot + MajsoulMax

参见 我的 Fork 的 README 即可。

settings.json 中设置 "majsoulmax_proxy": "http://127.0.0.1:23410"

随后,请以如下方式启动 MajsoulMax:

mitmdump -p 23410 --mode upstream:http://127.0.0.1:10999 -s addons.py --ssl-insecure

请注意,如果你修改了 MajsoulMax 或者 MahjongCopilot 的代理端口,请相应修改对应端口,并且确保 MajsoulMax 和 MahjongCopilot 的自签名证书均正确安装(这两者是不同的,前者默认使用 ~/.mitmproxy/ 下的证书,而后者使用 ./mitm_config/ 下的证书)。

最终代理链为:

game -> MajsoulMax(23410, https) -> MahjongCopilot(10999, https) -> server

分流类似前文,在此不再赘述。

💾

  •  

写在博客发表文章1000篇的节点

如要阅读全文,点击标题跳转。博客在文章数量达到 600 篇的时候,我曾写过写在博客发表文章600篇的节点,而今眼看将要突破千篇,那么 写在博客发表文章1000篇的节点 也就呼之欲出了。博客始建于 2018 年 2 月,至今运行 7 年有余,文章发布数量千篇,累计发布文字近 150万字。我们熟悉的《红楼梦》,全书约 100 万字。按以往手写草稿单页 300 字来计算,大约有 5000 页,是一个非常可观的数据。写完几句感慨,照例,分享一些最近的个人体悟。

  •  

拍荷花

这不最近刚刚买了个长焦镜头嘛,一直没空拍片,周末没事就决定去公园拍拍荷花。正好被我赶巧了,原来给小朋友捞鱼的地方,长满了荷花,有普通的大荷花,也有睡莲,都很好看。

因为天气很热,又是10点多才到,光线很强,很多照片感觉都过饱了,只好拼命的减高光,大家伙就凑合看吧。

自己拍的片,虽然可能不太好,发出来也不一张都舍不得删,索性就都发出了了。

以下是睡莲。

我最喜欢的是粉色的睡莲,感觉相机拍不出它的美丽。

而公园里面就能看到远处起落的飞机,于是开始找在荷花田里尝试拍飞机,但是拍了很多都不太好,以下两张还不错,但是对焦不太对,欢迎点评。

朋友们可以根据这两张图,猜猜这是哪个公园。

台风天,很热,但是天很蓝,在公园里面随便拍一张也好看。

因为来的晚,照片有过曝,拍荷花还是早上趁早来,如果有点露水在荷叶上,相比会更好。另外长焦就是好,之前有50mm焦距,完全不能拍到单独一朵的荷花,这次荷花离岸边很近,再加上200mm的长焦,拍花蕊也完全不是问题。

下午再次带着小朋友来公园玩耍,睡莲已经开始睡了,上午过来拍照真是个不错的决定。

本文图片拼接使用了运维咖啡吧作者37丫37开发的免费在线拼图工具,免费无广告,也比较好用,推荐一下。

看完评论一下吧

  •  

使用Cloudflare免费服务搭建临时邮箱,无需暴露自己的真实邮箱地址,保护个人隐私

什么是临时邮箱

临时邮箱, 是指能接收邮件的临时邮箱,也称为一次性邮箱,24小时邮箱,10分钟邮箱,可丢弃邮箱,是完全匿名和安全的。

是不是有些网站/博客/论坛必须注册才能查看内容?但是你以后都不太可能回到这个网站/博客/论坛,使用你的真实邮箱注册的话以后就有可能经常收到垃圾邮件,广告邮件。

同时注册的网站是否安全?注册信息有没有可能被泄露?这时候我们建议您使用临时邮件。 临时邮箱也能接收邮件,与个人电子邮件不同的是,临时邮箱完全免费且匿名。 使用临时邮箱可以避免泄露您的信息,收到过多的广告邮件和垃圾邮件,还可以避免被跟踪。

Cloudflare 临时邮箱
Cloudflare 临时邮箱

cloudflare_temp_email

Cloudflare 临时邮箱(预览地址:Cloudflare 临时邮件) - 免费搭建临时邮件服务

📧 邮件处理

  • 使用 rust wasm 解析邮件,解析速度快,几乎所有邮件都能解析,node 的解析模块解析邮件失败的邮件,rust wasm 也能解析成功
  • 支持发送邮件,支持 DKIM 验证
  • 支持 SMTPResend 等多种发送方式
  • 增加查看 附件 功能,支持附件图片显示
  • 支持 S3 附件存储和删除功能
  • 垃圾邮件检测和黑白名单配置
  • 邮件转发功能,支持全局转发地址

👥 用户管理

  • 使用 凭证 重新登录之前的邮箱
  • 添加完整的用户注册登录功能,可绑定邮箱地址,绑定后可自动获取邮箱JWT凭证切换不同邮箱
  • 支持 OAuth2 第三方登录(Github、Authentik 等)
  • 支持 Passkey 无密码登录
  • 用户角色管理,支持多角色域名和前缀配置
  • 用户收件箱查看,支持地址和关键词过滤

🔧 管理功能

  • 完整的 admin 控制台
  • admin 后台创建无前缀邮箱
  • admin 用户管理页面,增加用户地址查看功能
  • 定时清理功能,支持多种清理策略
  • 获取自定义名字的邮箱,admin 可配置黑名单
  • 增加访问密码,可作为私人站点

🌐 多语言与界面

  • 前后台均支持多语言
  • 现代化 UI 设计,支持响应式布局
  • 支持 Google Ads 集成
  • 使用 shadow DOM 防止样式污染
  • 支持 URL JWT 参数自动登录

🤖 集成与扩展

  • 完整的 Telegram Bot 支持,以及 Telegram 推送,Telegram Bot 小程序
  • 添加 SMTP proxy server,支持 SMTP 发送邮件,IMAP 查看邮件
  • Webhook 支持,消息推送集成
  • 支持 CF Turnstile 人机验证
  • 限流配置,防止滥用

cloudflare_temp_email
cloudflare_temp_email

MoeMail

MoeMail(预览地址:MoeMail - 萌萌哒临时邮箱服务 1.4K Star) 一个基于 NextJS + Cloudflare 技术栈构建的可爱临时邮箱服务🎉

  • 🔒 隐私保护:保护您的真实邮箱地址,远离垃圾邮件和不必要的订阅
  • 实时收件:自动轮询,即时接收邮件通知
  • ⏱️ 灵活有效期:支持 1 小时、24 小时、3 天或永久有效
  • 🎨 主题切换:支持亮色和暗色模式
  • 📱 响应式设计:完美适配桌面和移动设备
  • 🔄 自动清理:自动清理过期的邮箱和邮件
  • 📱 PWA 支持:支持 PWA 安装
  • 💸 免费自部署:基于 Cloudflare 构建, 可实现免费自部署,无需任何费用
  • 🎉 可爱的 UI:简洁可爱萌萌哒 UI 界面
  • 📤 发件功能:支持使用临时邮箱发送邮件,基于 Resend 服务
  • 🔔 Webhook 通知:支持通过 webhook 接收新邮件通知
  • 🛡️ 权限系统:支持基于角色的权限控制系统
  • 🔑 OpenAPI:支持通过 API Key 访问 OpenAPI

MoeMail
MoeMail

Cloud Mail

Cloud Mail预览地址 1.2K Star)使用Vue3开发的响应式简约邮箱服务,支持邮件发送附件收发,可以部署到Cloudflare云平台实现免费白嫖🎉。只需要一个域名,就可以创建多个不同的邮箱,类似各大邮箱平台 QQ邮箱,谷歌邮箱等,本项目使用Cloud flare部署,Rsend推送邮件,无需服务器费用,搭建属于自己的邮箱服务

  • 💰免费白嫖:无需服务器,部署到Cloudflare Workers 免费使用,不要钱
  • 💻响应式设计:响应式布局自动适配PC和大部分手机端浏览器
  • 📧邮件发送:集成resend发送邮件,支持群发,内嵌图片和附件发送,发送状态查看
  • 🛡️管理员功能:可以对用户,邮件进行管理,RABC权限控制对功能及使用资源限制
  • 🔀多号模式:开启后一个用户可以添加多个邮箱,默认一用户一邮箱,类似各大邮箱平台
  • 📦附件收发:支持收发附件,使用R2对象存储保存和下载文件
  • 🔔邮件推送:接收邮件后可以转发到TG机器人或其他服务商邮箱
  • 📈数据可视化:使用echarts对系统数据详情,用户邮件增长可视化显示
  • ⭐星标邮件:标记重要邮件,以便快速查阅
  • 🎨个性化设置:可以自定义网站标题,登录背景,透明度
  • ⚙️功能设置:可以对注册,邮件发送,添加等功能关闭和开启,设为私人站点
  • 🤖人机验证:集成Turnstile人机验证,防止人机批量注册

Cloud Mail
Cloud Mail

mail2telegram

mail2telegram 使用Telegram机器人获取您的临时电子邮件,这是一个基于 Cloudflare Email Routing Worker的 Telegram Bot,能够将邮件转换成telegram消息。你可以将任意前缀的收件人的邮件转发到Bot,然后一个无限地址的临时邮箱Bot就诞生了。

mail2telegram
mail2telegram

𝐕𝐌𝐀𝐈𝐋.𝐃𝐄𝐕

𝐕𝐌𝐀𝐈𝐋.𝐃𝐄𝐕:只需一个域名部署临时邮箱,支持多域名后缀,密码找回。

  • 🎯 隐私友好,无需注册,开箱即用
  • ✈️ 支持邮件收发
  • ✨ 支持保存密码,找回邮箱
  • 😄 支持多域名后缀
  • 🚀 快速部署,无需服务器

Smail

Smail(预览地址:Smail - 临时邮箱生成器 | 一次性邮箱 | 24小时邮箱免费生成) 一个基于 React Router v7 和 Cloudflare Workers 构建的现代化临时邮箱服务。

  • 🚀 快速生成: 一键生成临时邮箱地址
  • 📧 实时接收: 即时接收和查看邮件
  • 🔒 隐私保护: 邮箱到期后自动删除数据
  • 📱 响应式设计: 完美适配桌面和移动设备
  • ⚡️ 无服务器架构: 基于 Cloudflare Workers,全球加速
  • 🗄️ 现代化技术栈: React Router v7、TypeScript、TailwindCSS
  • 📊 数据存储: 使用 Cloudflare D1 数据库和 R2 对象存储

ZMAIL

ZMAIL-24小时临时邮箱( 预览地址:ZMAIL-24小时匿名邮箱 | 创建临时邮箱地址,接收邮件,无需注册,保护您的隐私安全 142 Star) 安全、简单、即用即走的临时邮箱服务

  • ✨ 即时创建:无需注册,立即获得一个临时邮箱地址
  • 🔒 隐私保护:保护您的真实邮箱,避免垃圾邮件和信息泄露
  • ⚡ 高速接收:实时接收邮件,无需刷新页面
  • 🌐 全球可用:基于Cloudflare构建,全球边缘网络加速
  • 🔄 自动刷新:自动检查新邮件,确保不错过任何重要信息
  • 📱 响应式设计:完美适配各种设备,从手机到桌面

Auth Inbox

Auth Inbox 是一个自建的开源多邮箱验证码的接码平台,基于 Cloudflare 的免费服务。它可以自动处理收到的邮件,提取验证码或链接,并将其存储在数据库中。管理员可以通过一个用户友好的网页界面轻松查看提取的信息。AuthInbox 还支持通过 Bark 进行实时通知,使其成为一个全面且省心的邮件认证管理解决方案。

不想在主邮箱中收到广告和垃圾邮件?想要多个备用邮箱用于注册服务和网站?试试这个吧!

  • 邮件处理:自动捕获和存储收到的邮件。
  • 验证码提取:利用 AI 从邮件中提取验证码、链接和组织名称。
  • 安全前端:提供受 Basic Access Authentication 保护的网页界面,用于查看提取的验证码。
  • 实时通知:当提取到新的验证码时,可选通过 Bark 发送通知。
  • 数据库集成:将原始和处理过的邮件数据存储在 D1Database 中。

常见问题

如何使用临时邮箱?

非常简单,当你打开这个页面的时候,我们已经为你生成一个激活的邮箱,这个邮箱从这一刻起开始源源不断地接收邮件,并且从此开始这个邮箱专属于你,你可以使用这个邮箱接收邮件。

在顶部的下拉菜单中,我们提供了各种各样的域名作为邮箱后缀,包括com,net,org等域名后缀,你可以选择你喜欢的,只需要点击相应的域名即可。

此外,当你关闭当前网页,24小时之内重新打开网页,你会看到那个最初为你生成的域名,这是为了可以帮助你短期找回一些需要的邮件,超过这个时间则无法找回,毕竟绝大部分人并不长期需要这个邮箱,我们始终关注您的隐私和安全,除了短时间必要的cookie,其他所有记录我们都不会保存。

我们的服务器时时刻刻都在接收邮件,通常当其他邮箱发送邮件之后2-3秒,我们就能将邮件展示在当前网页上,你无需做任何事情就可以迅速看到你的邮箱收到的邮件,这个过程只需要几秒,你不需要任何操作,这远比使用你的个人邮箱要简单。

觉得临时邮箱前缀是一个无序的文本?想自己定义邮箱前缀?完全没问题!点击"自定义"按钮,你可以自定义一个邮箱比如nihao@自己的域名,这看起来更专业更真实。

临时邮箱的特点

  1. 匿名性和安全性:你不需要提供任何信息,也不需要注册就可以使用,你无需担心泄露任何行踪和隐私。
  2. 随时销毁,当你使用完临时邮箱之后,点击"新邮箱"按钮,就会立即生成一个新的临时邮箱,旧的临时邮箱被销毁。
  3. 避免被追踪,你的个人邮箱是可以被追踪的,如果你大量使用你的个人邮箱,那么在网上就会留下很多的使用痕迹,这可能导致你的信息泄露。

可以在哪些场景使用临时邮箱?

  1. 当你不得不注册一些不可信的网站的时候,你应该使用临时邮箱,这可以避免让你收到大量的广告邮件和垃圾邮件。
  2. 保护隐私,有时候你可能需要参与一些一次性的在线调查或者加入临时群组讨论,使用临时邮箱可以帮助保护您的个人身份信息。
  3. 测试产品,开发人员可以使用临时邮箱替代真实邮箱来进行产品测试,这样既能测试邮箱功能,又不会打扰到真实用户。
  4. 作为你的分身,当你使用一些网站比如交友,AI等,你可能需要一个分身,没有人知道这个分身背后的真实身份,那么使用临时邮箱是合适的。

使用临时邮箱有哪些风险?

临时邮箱有优势,那么必然有它的缺点。

  1. 可靠性问题,临时邮箱只适合短期的、不重要的任务,如果你是长期的或者重要的事务,我们不建议使用临时邮箱,比如长期通讯或者传输重要文件。
  2. 你可能会浪费一些时间,因为有些网站可能拒绝临时邮箱的注册。
  •  

七月杂记:半月闲趣

七月已过半矣,回首往昔,皆为寻常。虽无惊世骇俗之举,亦有欣然自得之趣。今日闲坐无事,聊且记之。

[...]

  •  

提车啦,提车啦!

折腾了九天,新车总算到手了!说起来从试驾到订车再到提车,满打满算也就半个月,这效率确实没话说。不过我前期可是做足了功课,品牌和车型早就心里有数,到店试驾就是看看实际感觉,没啥毛病当场就订了 —— 主要也是天太热,天天 39 度往上,出门一趟跟蒸桑拿似的,真怕中暑,实在耗不起。​

但提车这中间,真是让一个销售给气着了。从看车到试驾再到订车,一直跟这个销售打交道,他那专业劲儿真不敢恭维。典型的慢性子不说,问车的参数啥的他都含糊其辞,好多问题还得跑去问别人。微信发消息,半小时一小时才回是常事,打微信电话也不接,搞得像我们求着他买车似的,别提多窝火了。​

本来定好周一上午提车,结果说园区充电桩出问题,车到不了。原来说上午到的车,硬生生拖到下午两点才到店。我特意请假过去,结果说还得等下午。咱提车讲究个时辰,就得上午提,再加上他那爱答不理的态度,气头上我们直接说要退车。后来店长过来安抚了半天,可定金也退不了,没办法只能各种沟通,最后还是妥协了 —— 毕竟主要是为了车。​

最后改到周二提车,上午把手续弄完先把车开走,下午又回店里折腾别的,整整忙了一天。这提车真是不容易,尤其在这种大热天里,太折腾人了!

交车仪式也是在外面,真是暴晒,好在也就几分钟的事儿。

中间还有去车管所办理临牌、办理保险、旧车子售卖、贴膜、车机激活、实名认证等等,感觉确实繁琐,还好是全款,要是分期感觉还有些事儿要折腾。

最后送了个"精洗"服务,不得不说还真是"精洗"啊,外观随便搞一下,里面随便洗一下,简单擦两下完事儿,敷衍程度令人发指,果然免费的东西无好货。由于车子在外面折腾一天,电也不太多了,油也没有,所以洗完车就去加油了,就加了三百,平时也确实用不上油。

{cat_photos}




{/cat_photos}

车子确实好开,动力杠杆的,五百多匹马力不是盖的,车子开起来厚重感很强,给人一种很踏实的感觉,CDC电磁悬架,不得不说真是舒服,新车子很多地方还需要磨合,需要慢慢适应。

当然事儿还没完,还需要3到5个工作日办理正式车牌,还有充电桩的安装等等,这些全部搞完,才算完事儿。

  •  

WeFootStep

WeFootStep

WeFootStep 是一款专为 Typecho 博客设计的插件,能将您的微信运动步数以小部件的形式优雅地展示在博客侧边栏或任何您希望的位置。

功能特点

  • 自动同步: 通过微信小程序获取您的每日步数数据
  • 优雅展示: 在博客侧边栏或任意位置显示您的步数数据
  • 简单配置: 仅需填写小程序的 AppID 和 AppSecret
  • 安全可靠: 使用微信官方 API,数据加密传输
  • 高度定制: 支持自定义样式和展示位置

开源地址

https://github.com/BXCQ/WeFootStep

  •  

如何检测你的网络NAT类型?NAT类型检测、NAT网络检测工具

这篇文章介绍了您开发的在线NAT类型检测工具,为您提供了一种便捷的网络测试方式。该工具支持多种NAT类型检测(如全锥型、对称锥型等),操作简单,无需手动配置,只需点击开始检测,即可快速获得精准结果。检测结果直观展示,方便用户调整网络设置,提升P2P应用的连接效率,是您优越的解决方案,特别适合频繁更换网络环境的用户。

  •  

家庭数据中心系列 用 rsync 优雅解决跨国 VPS 文件同步的顽疾

家庭数据中心系列 用 rsync 优雅解决跨国 VPS 文件同步的顽疾 无敌的个人博客 tangwudi

1 前言 由于我的博客采用的是特殊的wordpress双活架构(家庭数据中心中的macmini为主写副读节点,芝加哥Racknerd的VPS为主读节点),所以一旦macmini节点有内容变更(所有博客内容的修改和新文章的发布都在上面完成),就需要通过脚本将macmini节点上mariadb数据库中的wordpress库导出为wordpress.sql文件,并使用scp命令通过与芝加哥节点的ssh连接将该文件传送到芝加哥节点的指定目录中(本来之前用的syncthing基于tailscale IP来同步,但是出境的tailscale基本被废了,所有换成了scp),后续由芝加哥节点上的inotify应用在检测到文件变化之后,自动执行本地脚本完成wordpress库在本地的导入,从而实现两个节点wordpress数据库内容的完全同步。 这个流程之前一直运行得很好,也从没让我我操心过。不过,前几天我 […]

<p>The post 家庭数据中心系列 用 rsync 优雅解决跨国 VPS 文件同步的顽疾 first appeared on 无敌的个人博客.</p>

  •  

从claude cli的体验聊聊最大的敌人是我们自己的成见

如要阅读全文,点击标题跳转。由于先入为主的一些体验,我一直习惯于使用像 Cursor 或者 VSCode 里的插件(如 Cline)、阿里的通义灵码,以及腾讯的 CodeBuddy 这类界面化的 AI 编码交互方式。相比之下,对于 Claude cli、Gemini cli 这类基于终端、命令行的交互方式,我一直提不起兴趣。直到最近,我体验了几次 Claude cli 的编码功能,这才让我对以往的成见有了一些改变。过去我之所以更习惯插件式的交互方式,是因为它们的操作更为直观。无论是选择代码段、文件,还是插入图片,都非常直接简单。因此,我一直认为这种交互方式就是最优雅的 AI 编码方式。正因为这种先入为主的心态,我始终对 Cli 这类交互方式有些抵触。我一直不太能理解,在编辑器里写代码,却要用终端来进行 AI 编码,这到底是一种怎样的交互逻辑?总觉得这种方式很割裂,与 AI 的交互以及 AI 的编码过程变成了一种黑盒,很不直观。这也是我迟迟没有尝试这种编码方式的原因。
  •  

Google Play 应用上架二三事

首次上架应用到google play还是2015年的时候,那个时候上架应用限制比较少,注册个账号信用卡付个款就行了。自己之前有个账号,但是闲置许久,加上自己的一些骚操作账号被Google给永久禁用了,并且还给我发了个邮件告知不要再尝试注册新的账号了。最近自己的新应用想要上架,于是又重新注册了个个人账号。同时公司的产品也要上架Google play,前前后后经过了小半年的折腾才终于搞定,将应用上架,这里就来说道说道。

账号注册

早期的时候,无论是个人账号还是公司账号注册都不需要实名验证的,因此只需要填一下联系信息使用信用卡付款25美元就可以直接注册成功了。但是从2023年开始,无论是已有账号还是新注册的账号都需要进行验证。对于个人账号,只需要填写一份付款资料,并且验证身份,身份证,护照信息都可以,这个信息需要与付款资料中所填写的需要一样,并不要求付款信用卡的账单地址和姓名与这个相同。

对于公司账号的注册,则是和苹果一样要求提供邓白氏码(D-U-N-S Number),输入邓白氏码之后会自动获取到公司的名称地址信息生成付款资料。和个人账号一样,付款的信用卡也没啥要求。在验证的时候,则是需要提供公司的政府签发的文件,比如国内的营业执照,具体可以查看Google play 官方文档。公司的验证也还需要验证一位开发发者的信息,这里的要求跟个人差不多,身份证,护照等都可以,而且不需要提供在这家公司任职的任何证明文件,公司注册地和个人不在同一个国家也没关系(这一点,苹果的开发者注册是要求提供个人在公司任职的证明文件或者名片之类的东西的)。

如果所有的这些证明文件都能够顺利的提供,并且邮箱验证和电话验证都没问题,那么账号注册是很容易的。最后有一点需要补充,付款的信用卡是不能使用银联卡的,需要visa或者mastercard。总体来说,比苹果开发者账号要容易,就上面说的我的个人账号被封之后,使用家人的信息又重新顺利注册了一个新账号。而公司的账号,在获取法务同时完成公司DUNS Number的申请之后,也都顺利的完成注册了。但这些完成之后,也还是只是完成了万里长征的第一步。

个人应用上架

以前个人应用在google play上架是很容易的,而在2023年11月,google 出了一个新政策,对于在23年11月13日之后注册的新账号,发布应用时必须满足特定的测试要求才能正式发布。具体要求是,正式发布之前,需要在google play上进行封闭测试,需要至少12名测试人员测试至少14天持续参与测试。这个对于个人开发者来说,还是不太容易达成的,这至少12名测试人员,是需要开发者将他们的Google 邮箱输入到google play开发后台,他们接受并且根据开发者提供的链接进入下载安装的。至于连续14天的持续参与测试,这个不太清楚Google 是如何统计的,封闭时间肯定是要保证14天以上,但是如何保证每天都至少有12人参与这个不确定是否强制要求。

我的应用在开发完成之后,通过在小众软件和Linux.do社区征集到了一定的热心网友参与了测试,从而顺利完成了封闭测试,对于工具类的软件这是个不错的方式。对于这一点,虽然加大了个人上架应用的难度,但是我想也是可以提高上架应用质量,毕竟对于个人开发开发者来说,测试相比于公司开发的应用来说会更加薄弱。

公司应用上架

公司开发者应用的上架,没有上面对于个人开发者的限制,但是我们在上架的时候遇到了更多的问题。因为我们所在的是金融行业,在上架的时候会更加的敏感,因此也更需要小心一点。

我们在第一次上架的时候,填完了所有的信息,上传了应用,提交审核之后,谷歌以我们需要登录为由审核不通过。提交了登录需要的信息之后,等了超过十天,结果直接账号被禁用了,原因是高风险,发邮件和申述都没用,并且不告知具体的原因。搞得我们很受伤,不知道该怎么办。商量之后决定让公司注册新的实体再重新注册开发者账号。

另一方面,想到公司以前的应用可能还有老的开发者账号,或许可以用,找回了老账号的邮箱,使用新的公司主体信息进行了验证,之后顺利的提交了应用。这一次为了稳妥起见,我们先提交了封闭测试和开发测试,都通过了之后才提交的正式发布,所有信息都填写准确,google 也很快的通过了审核。

一些经验

虽然说上架Google play越来越严格,但是相比与国内来说还是容易很多的,国内上架对于个人开发者极度的不友好,并且备案,软著,哪个都不是好搞的。

上架Google play我认为第一条原则就是诚实,填写资料要真实,不仅仅是开发者信息如此,同时应用使用到的权限,收集的用户资料,等等都要如实填写,不可挂羊头卖狗肉。也要避免给审核人员看到的只有某一个功能,实际应用内有很多的功能会在审核后对用户开放。如果应用需要登录,最后要提供账号密码给google 的审核人员,对于非账号登录的,如加密货币钱包应用可以提供助记词或者操作指导的视频等。

另外,上架的应用应用做到尽量少的用户信息收集和权限获取。比如获取用户位置,如果不是主要功能,尽量不要获取。对于一些权限,如读写相册,相机权限等,在新版本系统中有提供不使用这些权限,直接通过系统的API实现的方式,也最好不要请求这些权限。对于DeviceId现在已经不允许收集了,对于Phone_State, 广告Id等,也应该尽量做到不要收集。

谷歌现在每年都要求应用升级Target 版本,这一点开发者也是需要去乖乖的做的,否者新应用无法上架,老应用无法更新。除此之外,对于Android的新特性开发者也应用去积极适配,对于一些特性,google play console也会提醒开发者去适配,比如下图所示。

对于上架的应用,即使没有发布新版本,也有可能被抽查去审核,这时候如果遇到了问题,谷歌也会发信息来让你整改,因此需要关注后台和邮箱,遇到问题要在最终截止日之前修掉对应问题,否者真的会被下架。我就遇到了这个问题,我所提供的登录凭据,审核人员自己输入错误,把我填写的o输入成了0,导致他无法登录,就给我发了整改通知。不过我在修复之后,错误提醒过了仍然没有消失,对于这一点,如果你已经确保改过了就不用再担心了。以下是错误提醒,过了这么多天仍然还在显示。

老账号的价值很高,审核也会比新账号更容易过,因此如果你有一个老账号,请保管好。

对于权限和隐私方面的检查,可以使用Google做的一款工具Checks,它可以帮助检查app中使用到的权限,请求的网络,同时还能够审查隐私政策文件,在发布前借助这个工具检查可以很大程度减少应用审核被拒的风险。

最后

从事Android开发10余年,大多数时间也都是做的海外应用,也是经历过了很多次google play被拒,审核的政策一直在变,之前能通过不代表现在也能通过审核,因此需要不断的学习google play的政策文件。

最后的最后,宣传一下我开发的Memos客户端应用fymemos,欢迎到google play下载。也欢迎留言交流应用上架的故事。

值得反复学习的google 文档:

  1. Play Academy
  2. Play 开发者政策中心
  3. Play Console Help Center

看完评论一下吧

  •  

2025年6月阅读书摘

✇Dennis
作者Domon

6月阅读记录

  • 《黄永玉:人只要笑,就没有输》Done
  • 《在中国大地上》20%

6月阅读书摘

《黄永玉:人只要笑,就没有输》

我就揍他

  • 人只要笑,就没有输。黄永玉的存在证明了一项不会磨灭的人性真理——人生苦,但人大于苦。

我是在跑万米

  • 《紫苑草》讲了一种底层现实:纵然努力对抗命运,却依然负担着人生的无奈和沉重。
  • 他的心里并不是没有波澜,只是人老了,伤心是一种秘密。他和年轻时一样,听老歌会哭,读诗会哭,想起朋友时也哭,看到新闻莫名伤心了,不敢让女儿知道,躲在被窝里偷偷哭。他只能把这些说不出口的感情画到画里,写到书里。
  • 他连人生最后的细节都想到了,到时候送去火葬场,送过去就行了,不用想着领骨灰回来,“不好分,怪累的”,他打算跟孤魂野鬼一起过,大家一起热闹。他对于死只有一个要求:“到时候胳肢我一下,看看我笑不笑,”这是他的生死标准,“笑了,我就还活着。”活了一辈子,黄永玉只是黄永玉。这是他在《世说新语》里最喜欢的一句话:“我与我周旋久,宁作我。”再有两个月,这个人就要99岁了,人生再来个一百年,结局或许还是同一样——天地不仁,白云苍狗,但管他呢,我与我周旋了一辈子,黄永玉永远是黄永玉。

  •  

夏日南京游AI乐章

该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/195

这篇文章记录一下最近一个月发生的事。

再游南京

距离上次去南京差不多一年了。由于上次去只待了两天一晚就离开了,所以很多地方都没去,这次差不多待了 5 天了,就比较有充足的时间去一些有意思的地点。

和上次一样,也是住在朋友 Magren 家里。可惜朋友马上要离开南京去往另一座城市了,以后更加分隔千里,所以也是在这最后的时刻再相聚一回,顺便看看以前没见过的风景。

第一站,参观了下南京小米总部:

虽然那天是周末,但是公司还有同事在加班,然后就被朋友 LD 叫住加了半个小时的班。我有罪,都是因为我提议想去小米看看。

第二站,去了 MaxtuneLee 的学校,南邮。真巧的时候,Magren 因为工作将要离开南京,而 MaxtuneLee 因为毕业也即将离开南京。一下子再没有认识的人在南京了。

第三站,在中华门附近集市 - 老门东。

第四站,去了水游城。没拍到什么好的。主要是太社恐了。不过我这两位朋友还是很社牛的。邀请到了一位兽装小姐姐拍了一张。

第五站,去了南京最豪华的厕所。德基广场。

在厕所大厅聆听钢琴的弹奏。

去哈苏感受了一下裁神爷 - 哈苏 X2D 100C。惊人的解析力,1 亿像素。给大帅哥照了一张。

第六站:错觉博物馆

第七站: 红山森林动物园

图片太多就这里不发了。汇总都在这里了。

https://afilmory.innei.in/?tags=%E7%BA%A2%E5%B1%B1%E6%A3%AE%E6%9E%97%E5%8A%A8%E7%89%A9%E5%9B%AD%2C%E5%8D%97%E4%BA%AC

Folo AI

最近半个月都在全力开发 Folo 的初版 AI。目前的样子大概是这样的:

https://x.com/__oQuery/status/1943340600520306937

https://x.com/__oQuery/status/1940439201612525959

用的是 Vercel 的 AI SDK,总体用下来是比较方便的,但是性能上只能说一坨。流式的时候所有的都在 render 就很卡。最离谱的时候只有几帧,卡的没啥用。后面要专门治理这个性能问题了。大概的方向是两个:Markdown parser 的提速和减少 message 的 render。

目前来看整体的 UI/UX 还行,接下来就是性能了。

娱乐:影视与游戏

影视

自从上次买了坚果 N3 之后,因为不支持杜比视界退货了。后来又买了一台 Vidda C3S,5k 的价位支持杜比视界。

投一百多寸送快递还是挺爽的。

最近七月番好看的还挺多的,我大概会最下面的这些:

  • 租借女友第四季
  • 与游戏中心的少女异文化交流的故事
  • 渡君的XX即将崩坏
  • 肥宅勇者
  • 碧蓝之海 第二季
  • 青春笨蛋少年不做圣诞服女郎的梦

游戏

不算太晚购入了 死亡搁浅 2 冥滩之上,到现在大概送了四十个小时快递了,每天沉迷送快递修路,不亦乐乎。

欢迎来加我 PSN 好友:@innei_j,一起修路。

太美了。

目前的地图:

:::gallery

:::

看完了?说点什么呢

  •  

如何彻底禁用 Chrome 自动更新

最近随着谷歌将 chrome 浏览器的版本终于提升到 138 。谷歌很快就会彻底抛弃 Manifest V2 扩展程序(至于怎么继续用V2 扩展可以看去年的这篇文章:《Chrome 如何继续使用 Manifest V2 扩展)》
很多人都有了需要禁止 chrome 浏览器更新,将 Chrome 版本号停留在 138 的需求,所以总结一下目前四种禁止 chrome 浏览器更新的方式。

方法一:通过禁用服务 + 任务计划禁止 Chrome 浏览器更新(推荐)

  1. 停止并禁用 Chrome 更新服务
    • Win + R 输入 services.msc 打开服务管理器。
    • 找到以下服务并逐个右键→属性停止启动类型设为「禁用」
      • GoogleUpdater InternalService
      • GoogleUpdater Service
    • 点击「应用」保存。
  2. 禁用 Chrome 更新任务计划程序
    • Win + R 输入 taskschd.msc 打开任务计划程序。
    • 展开路径:任务计划程序库 → GoogleSystem → GoogleUpdater
    • 右键禁用所有与 GoogleUpdate 相关的任务(如 GoogleUpdateTaskMachineCoreGoogleUpdateTaskMachineUA)。

方法二:通过组策略编辑器(仅限 Windows 专业版/企业版系统)

  1. Win + R 输入 gpedit.msc 打开组策略编辑器。
  2. 导航路径:计算机配置 → 管理模板 → Google → Google Chrome
  3. 双击 「配置自动更新策略」 → 选择 「已启用」 → 下方选项设为 「2 – 禁用自动更新」 → 应用设置。

方法三:通过屏蔽 Chrome 检查更新域名(比较推荐)

  1. 导航到C:\Windows\System32\drivers\etc\hosts
  2. 用记事本打开,添加一行0.0.0.0 update.googleapis.com,保存。
  3. win+r ,输入cmd打开命令行,输入ipconfig /flushdns,回车,刷新 dns。

方法四:通过注册表(可以一试)

  1. Win + R 输入 regedit 打开注册表编辑器。
  2. 导航到路径:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
    (若不存在,右键手动创建对应项)。
  3. 新建以下 DWORD (32 位) 值并设置数据:
    • 值名称 AutoUpdateCheckPeriodMinutes → 值数据 0
    • 值名称 UpdateDefault → 值数据 0(完全禁用)或 2(仅手动更新)。
    • 值名称 Update{8A69D345-D564-463C-AFF1-A69D9E530F96} → 值数据 0(完全禁用)或 2(仅手动更新)。
    • 解释一下为什么这个里三个值,因为我查了一圈,这三个值都有人说亲测可用,也都有人说亲测不可用的,所以我都写出来了,都试试吧。

方法五:直接换便携版 Chrome 通过“神奇工具”直接锁死Chrome的更新。

  1. 其实就是基于 chrom++ ,不过为了大家方便我就不教怎么手动提取Chrome核心文件并转换为便携版了。直接提供奶酪大佬做好的版本:下载地址
  2. 绿色免安装,下载解压后,点击 “开始.bat” 就会创建一个启动快捷方式。
  3. 如何从安装版迁移到便携版
    • 登录你的 Google 帐号,书签、拓展就会自动同步了。
    • 转移书签,将旧版配置文件夹下的 “\Data\Default\Bookmarks” 覆盖到新版同名文件。
    • 如果书签图标是空白的,将旧版配置文件夹下的 “\Data\Default\Favicons” 覆盖到新版同名文件。
    • 转移旧版配置的历史记录,将旧版配置文件夹下的 “\Data\Default\History” 覆盖到新版同名文件。
    • 转移旧版配置的搜索引擎,将旧版配置文件夹下的 “\Data\Default\Web Data” 覆盖到新版同名文件。
    • 转移旧版配置的用户偏好,将旧版配置文件夹下的 “\Data\Default\Preferences” 覆盖到新版同名文件。
    • 扩展还是建议重新下,大部分扩展都可以导出配置并导入的,手动迁移扩展也不是不行,就是复杂度不是三两句能说清楚的。
  4. 具体怎么用,可以详见作者的文章:RunningCheese Chrome 使用手册
  5. 虽然谷歌没法去更新你的便携版 Chrome ,但是极少数情况下你会发现系统里不知道什么时候,被静默安装一个原版的最新版的 Chrome……
  6. 便携版谷歌会自带一个小问题:打印网页时预览失败,导致无法使用Ctrl+P打印网页为pdf,解决办法详见这篇文章《解决绿色便携版 Chrome 打印预览失败问题》。这个问题核心是win10、win11系统文件权限的问题。Chrome的安装程序会利用管理员权限自动帮你设置好权限,但绿色便携版就需要自己去设置一下了。

The post 如何彻底禁用 Chrome 自动更新 appeared first on 秋风于渭水.

  •