Blog
Frost's Blog Frost Ming's personal blog
Latest posts 我不是一个喜欢走出舒适区的人。 相反,每当即将有变化发生,我总是会感到不安,即便这个变化是朝着好的方向。比如长假前夕、长途旅游前夕,这意味着我要从日复一日同样的生活节奏中脱离出来,去适应另一种节奏。同样的,一旦适应了另一种节奏,我又不情愿从里面跳脱出来。我的人生好像一个巨大的 楞次定律 。我觉得滚筒中的小白鼠也挺幸福的,不用想别的,一件事干熟了,也不费什么力。什么拥抱变化,开拓进取,36 岁了,只想躺平。 但总有一些变化,你无法避免。比如换工作,说来奇怪,我这样一个安分人,已经是第五份工作了。每次换工作,似乎都有充分的理由,但也总会怀念过去的工作,而且适应新工作的过程,也会造成一些不安。…
Jul 8, 2026 引子 bub 最开始是 PsiACE 做的一个小型 Python Agent 项目,用来实践自己的 Agent 想法。2026 年 1 月的最后十天里,OpenClaw 经过两次改名风波迎来了暴发,所有人都在讨论,都在使用。而我[^1]不满足于当个纯粹的使用者,我想要拆解开看看它是怎么做的,虽然基于 LLM 的了解我能勾勒出大致的轮廓,但真要了解它,还得深入代码中去。那时已经到了二月,OpenClaw 的代码库已经非常庞大了,每天合入的 PR 不计其数,全身上下充满了 vibe 的气氛(双关)。于是了解到了 Nanobot 这个项目,号称是 OpenClaw 的极简实现,这非常适合拿来学习[^2]。于是我很快就跑起了一个实例,放到 TG 群里使用。 很快我们发现 Nanobot 并不适合群聊中的场景,于是我们决定根据现有的理解,和针对群聊的场景,来改造一下…
Apr 7, 2026 import Tweet from "@components/Tweet.astro"; import LinkCard from "@components/LinkCard.astro"; 稍微地介绍一下背景知识,标题中的龙虾指的是这段时间大火的 OpenClaw 项目,它最早的名字叫 ClawdBot。它一是个能与你在聊天软件中交流,从而帮你完成各种任务的通用型 AI 智能体。 最火的那段时间我并没有用它,一周过去了,我在想如何复刻它,我研究了另一个最小化复现的项目 Nanobot ,我觉得我脑中大概有了蓝图。刚好朋友 PsiACE 之前曾做过一个 小型的 Agent 项目 Bub ,我觉得非常适合把我的想法在它的基础上落地,也与 PsiACE 一拍即合,着手把这个 Agent 变成一个龙虾。 短短几天过去,Bub 已经达到了一个非常不错的状态。在这个过程中,我自己对 Agent 和…
Feb 12, 2026 吉辰先生的 这本书 是我从读书博主 ruc 猫那里知道的,后者强力推荐并选作了 2025 年度最佳。 这本书主要是关于《马关条约》签订的始末,这种历史重现的方式与 2024 年的《康熙的红票》很像,但远没有后者易读。文中到处夹杂行内史料引用和整段的原文文言引用,读起来是有些吃力的。但在非史料部分,比如书中的末章和后记,作者都展现了他深厚的文字功力,用一种小刀剌肉的方式复述这段沉重的历史,还是令我非常震撼。 我本能是很抗拒这段屈辱的历史,但转眼又是一个农历马年(此书的初版即完成于 2014 年,农历甲午年),我认为还是很有必要去了解它。现在中日的关系大家心里都清楚,实际上《马关条约》对中国的影响如此深远,直到今天都还不能摆脱它的阴影,台湾问题的肇始,就是《马关条约》的签订。…
Feb 8, 2026
标题什么意思? 2025 年过去了,我也看了很多别人的年终总结,看的时候就感觉阵阵焦虑,究其原因,是因为在看大佬长篇大段的成就展示时自惭形秽了。也有几篇 我喜欢的 ,恰好是没怎么写成就的。往年的我也不能免俗,写了不少完成了某某某事情,去了某某地方。今年不如改改,为了避免焦虑,更多聚焦在 How 与 Why,而不是 What 上,标题的谐音梗就是来源于此。 有什么成就? 不写 What 是不是因为没什么成就可写了?被发现了。今年下半年由于老婆驻场上海工作,我基本上挑起了带娃的责任,好处是和女儿培养了很好的关系,坏处是有时候会感觉找不到说话的人。电影和综艺也断崖式下降,在年中的时候我看短视频看得很凶,经常看到凌晨一点才睡,后来主动减少了使用时间,严格控制早睡,现在发现不看也没什么大不了的,反而能空出时间来做其他事情,比如运动。 为啥开始运动了?…
Jan 7, 2026 我们总说 Pythonic,我自己也会说某段代码不够 Pythonic,但什么是 Pythonic 呢?不讲清楚,我会被人说老登。为了避免如此,我决定再写写。 要说一段代码是 Pythonic 还是 Rustic、Go-istic、Java-ish 最直观的方法就是把它们放一起来对比,这个场景就是代码移植。其实,代码在特定语言里怎么写,是由语言特性决定的,但肯定有些部分,什么语言都能这么用,那么这些移植代码最终会变成什么样子,就更多是由写代码的人(也不一定是人)决定的了。下面我就从其他语言找些例子,看看如果把它们用 Python 重写,应该是什么样的。 opendal.Operator 不多介绍这个库了,不影响本文的主旨,咱直接从它的 官方文档 里截取一段最原汁原味的 Rust 代码: // Pick a builder and configure it. let mut builder…
Dec 30, 2025 我曾经做过一个梦,很奇怪的是,这个梦过了近二十年我还依稀有印象。那是在 2006 年春节后的一天午睡,我梦见我睁开眼发现日历已经是 2006 年 8 月了。我一下惊醒,感叹时间怎么过得这样快,崭新的 2006 年已经要过去了。 直到 2006 年的暑假真的到来了,那时我即将进入高三,却没有什么学业负担,每天都在巷子口等陈何,一起去网吧打魔兽 2v2。陈何是我同学兼同桌,他名字是四个字,我们只称他前两个字,他家住在离我家 100 米处的地方。这情景我现在还时常想起时常怀念,感叹那时我怎么可以这么无忧无虑。他数学很好,我们时常在一起讨论数学,以及攀比。男生之间的攀比往往是互对喷对方菜,不管是打游戏,还是考数学。我们单挑过魔兽,仅有那么几次,是我比较菜,但也只有那么 一点儿 ,只能说伯仲之间吧。但说到数学,在整个高中来说,是他比较菜。很感激他,让我能像打游戏一样,学数学。…
Dec 22, 2025 题目是一部 2006 年的日本电影。主人公松子从小缺乏家人的爱,长期被忽视,因此形成了极度渴望被关注、被需要的性格。进入社会后,她为了获得爱而不断付出、不断迎合,结果却屡次被男人、家庭、工作、社会抛弃。为了别人而活的她,始终无法为自己活。 最近父母回老家参加表弟的婚礼,给我带回了一个松子的故事。我表弟小我两岁,从小就很纨绔和刁蛮,甚至从来不跟长辈说话,即便是在春节期间,用给 100 块的方式交易,也无济于事。成年以后似乎结识了一些朋友,倒是不再沉默寡言,但却变得满嘴社会嗑,生殖器不离口。做过一些工作,但大部分时间都在啃老。他向他妈我大姨要钱那是理直气壮,甚至不给就甩脸色看。就这样,他能每年换新 iPhone,这是我这个大城市牛马都难以达成的。…
Dec 2, 2025 标题 Typo 致敬某粗鄙的大佬。 0x00 第二次来上海参加 PyCon China,也是我的第七个 PyCon,这次更多是 PyCon for friends。 最激动的是要第一次见到 yihong,当我得知他和我差不多时间到浦东,我就决定等他,哪怕他说下飞机要先拉屎。 结果这小子没同步消息,理解错误,屎没拉也不说一声,把我晾在那,好在等待市域铁发车让我堵到了他。他上来就给了一个拥抱,还把他刚看完的《多情剑客无情剑》送了我,然而是(下),(上)(中)都没有,离谱。 0x01 路上商量下午的节目,yihong 先是提议去看电影。我基于以下 3 点提出了反对: 一群大老爷们去看电影太怪了。 临近国庆档,没有好电影。 看电影聊不了天,太浪费了。 我说难道不是去咖啡馆集体 Coding 吗?我记得和程序员聚会都是这流程,就像过年回老家的固定节目是和同学连坐打 Dota 一样。 yihong…
Sep 22, 2025 这不是一篇正经的游记,事无巨细地记录行程、餐饮、住宿并非我所擅长,很容易写成流水账。我不希望文章变成那样,所以只是写下我想与大家分享的东西,记录下河南在我心中的印象。 五一假期我和老婆去了河南,尽管预料到人会很多,但在国家实行统一长假的框架内,还是只能如此。就算我是数字游民,但老婆不是啊,所幸女儿没有和我们一同前往,事后回想这次如果带上了她,想必会艰难加倍。 4/29 我看过一本书叫 《中国八大古都》 ,可能大家只对七大古都熟悉,而这本书里提到的第八大古都,就是河南郑州,因为这里发掘了商早期的都城遗址,有郑州商城遗址。这里的道路很宽很平,太阳很大但并不觉热。我们去了两处适合网红拍照的景点瑞光路和油化厂创意园,差强人意。 晚上去吃了葛记焖饼 ,两个南方人只能吃一份,被服务员反复确认,我感觉受到了鄙视。 4/30 今天安排了重头戏,就是去郑州的「只有河南」戏剧幻城。这是一个有着 21…
May 11, 2025 起笔的原因是群里的一段聊天: 不禁感叹 Singleton(单例模式)作为一个经典的设计模式,是如何被滥用的,特别是在 Python 这门语言中。它竟然成了一个八股式的面试题,就像「茴字有几种写法」一样,一直被问个没完。但我敢说,绝大多数人回答的时候,都是照本宣科,他们参考的网上的答案,也很少有能讲正确的。 先说结论 在 Python 中,你不需要 Singleton。 如果需要,就用模块级别的变量。 至于原因,让我们来看看几种流行的 Singleton 实现方式: 1. 装饰器 def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls]…
Mar 5, 2025 工作与技术 在 BentoML lead 了几个重要的 feature,包括 1.3 和 1.4 两个大版本,以及 Codespaces 和 Comfy-Pack。 11 月参与 PyCon China 2024,见了许多网友,参加了代码厨房的活动,很开心。做了关于 Pydantic 的演讲。 slides 视频 11 月参与了 NebulaGraph 深圳的线下活动,做了关于 BentoML 的分享。 5 月份有荣幸 与 Paul Romer 见面交流 ,并造就了 2024 年我最受关注的一篇文章。但于我来说会总结为 机缘巧合 ,不必赋与我其他的光环。事实上从那以后我试图联系过 Romer 先生都没有得到回应。 开源了 FxZhihu 被很多人使用,感受到贡献了一些价值。 写作博客文章 15 篇。 由于 uv 的横空出世,PDM 无疑受到了一些冲击,发展明显变缓。…
Dec 24, 2024 最近社区里有人提了一个PR ^1 ,解决了一个潜在的内存泄漏问题。我认为这个问题在很多场景都容易忽略,所以分享在这里。 上代码 import gc class Foo: def bar(self): print("bar") foo = Foo() print("Before", gc.get_count()) foo.bar = foo.bar print("setattr", gc.get_count()) del foo print("After", gc.get_count()) 运行发现 foo 对象无法被正常回收,造成了内存泄漏。这是因为看似不起眼的一行 foo.bar = foo.bar ,实际上创建了一个循环引用。 点解? 因为, foo.bar 这个表达式,实际上执行了 Foo.bar.__get__(foo, Foo) ,返回了一个绑定了 foo 的方法,此方法中持有…
Dec 18, 2024 我女儿第一天上幼儿园回来,我就拿着群里他们班级的合照,挨个问她每个小朋友都叫什么名字。一方面是想看看她集体融入得怎么样,另一方面是自己想留个底,争取每个小朋友的脸和名字都能对上。 她当然不能每个都叫出名字来,但配合群里其他家长聊天的信息,三天后我就基本能全叫出名字了。有回我正在问,丈母娘见了在旁说,「知道这个有什么用,你又不是老师。」面对这种言论,我只能一笑了之。 我觉得,总会有用的。在我看来,至少有下面几个用处: 首先,安全。以后万一有突发事件,我能对号到人。做个假设,有一天我女儿和她同学出游走丢了,我能凭借这些信息,更好地找人,不至于「纵使相逢还不识」。 其次,我能更好地了解她的生活。她跟我讲八卦时,我能知道说的是谁,做一个优秀的倾听者。 Last but not least,这是对人的一种尊重。若是上学放学路上碰到同学打招呼,我能很好地回应。…
Nov 7, 2024 import Tweet from "@components/Tweet.astro"; 我一直在思考要在博客写些什么,我能写什么。刚好看到了 @laike9m 的这篇推文: <Tweet id="1847557409457524950" /> 有很多观点我是不敢在网上表达的,只能和女朋友说说。有的是因为太个人化,有的是违反了普遍的认知,以及第三种情况:解释清楚要花太多时间,而我的时间本就不多。于是每次都是想想,很快便打消了这个念头了。 确实,很多时候阻挠我表达的,是四个字「大可不必」。我要表达的观点会有人认同吗?或至少,会引发一些思考吗?如果两者的答案都是否,那就「大可不必」发表了。或者即使,观点或许有一些价值,那么我要怎么表达呢?是不是得安排逻辑结构、旁征博引、收集数据案例,这些值不值得?「大可不必」,这四个字又在我脑子里冒了出来。…
Oct 20, 2024 上周末 《从 21 世纪安全撤离》 (后简称《21》)在深圳点映,一直很期待导演李阳的作品,距离《李献计历险记》已过去十多年了,那时房祖名还在呢。于是一出来就买了票和老婆一起去看了。看完后我和朋友聊的感想是: 我最大感想是,感谢所有资方,感谢电影工业,感谢演职人员,信任李阳,帮他完成这个作品。 没错,李阳在所有中国导演中都是一个异类,只有他能拍出这种味道的东西。怪诞、热血、信息量爆炸、莫名其妙。可以预见,这将会是一种评论两极分化的片子,密集的视效和神奇的转折之下,是破碎的剧情和二维的人物。我个人是很喜欢的,我记得在临近结尾的时候,吴晓亮演的角色在家里打《街霸》,我疯狂地扯我老婆,说这是《我爱我家》里贾家的布景啊哈哈哈,但她没什么反应。有时 GET…
Jul 24, 2024
:::note[版权声明] 本文谢绝一切转载,只能以链接形式分享。 ::: 如同这个 Drama 的标题所写的,在我 34 岁生日这几天发生了一件非常 Drama 的事情。到现在我依然感觉有些不真实,但事情就是,我「接见」了诺贝尔奖得主。 收到邀请 5 月 28 日这天我收到了一封邮件。我向来习惯及时阅读新的邮件,至少是邮件的标题,所以我的邮箱从不积压未读邮件。我每天早上都会收到很多 GitHub 的通知邮件,但这一封没有 [GitHub] 的前缀, 我留了意,但也没有立刻打开阅读。可能是这个「只读标题未读内容」的行为触发了 Gmail 的机制, 它把它扔进了垃圾箱 。等我有空想要去读的时候发现邮件已经不见了,所幸我扫了眼垃圾箱,找到了这封邮件。 首先开头有我的称呼,然后他说自己是一位小有名气的经济学者,有维基页面。看到这我当然立即去看了一眼维基, 果然有 。履历中最为耀眼的,当然是…
May 30, 2024 最近我写了一个 TTS(Text to Speach) 库 Tetos ,为的就是统一各种云 TTS 服务的调用接口,让用户可以用同一套代码,只需要变动参数就可以在不同的 TTS 间切换。 https://github.com/frostming/tetos 在实现过程中,我翻阅了很多云 TTS 服务的接口文档,发现它们接口的设计大相径庭,有的是 RESTful,有的是伪 RESTful,有的文档里甚至只让你用 SDK,没有 HTTP 接口说明。 本来嘛,我做的工作就是让用户可以不用做这些工作,但本篇文章还是想主要吐槽一下火山引擎的接口,和它的 SDK 设计。所以这篇可能不能叫《友好的 Python》了,可以当吐槽大会来看。 提出问题 假设你是一名公有云厂商 Python SDK…
May 9, 2024 对不起余华老师,小小碰一下瓷 上周我去了上海,见了我研究生时代关系最好的同学,我们已经快九年没见了,他头发理得很短,略显发福,就称呼他为亮子吧。亮子还在一家芯片设计公司上班,从毕业后到现在一直没换过,已逾十年。这对于我来说有些不可思议,疫情以来,「降本增笑」对于我们来说已经是一个谈资,而他却一直在做着同样的事情,同样的工作,同样的生活,难能可贵。 亮子过着高度重复机械的工作生活,每天要到十点以后才下班,周末也得去。他说:「有时就连洗个澡,都会影响我的睡眠时间,往往回家倒头就睡。」我向来痛恨此事,他却说:「这和那种无效加班不同,是真的安排了超出负荷的任务,多到做不完。」问及为何不换工作,他说被公司上市的饼钓着,员工签了协议,已经预缴了一部分资金。…
Apr 19, 2024 Lock 策略
Apr 1, 2024 Lock strategy
Apr 1, 2024 Lockfile
Mar 11, 2024 Lock file
Mar 11, 2024 辨析是一种学习技巧,我经常使用这种方式。找出一个概念中的两个类似的事物,然后比较它们的不同之处。人们设置类似事物并不是多余的,通过辨析可以找到它们背后的逻辑。 我上小学五年级的时候家里买了一本书,叫 《汉语联想词典》 , 这本书甚至连豆瓣词条都没有。它大概是一本通俗版的《说文解字》,里面按部首索引汉字,通过汉字的字源字形讲述它们的本义引申义。这让只接触过《新华字典》的我产生了浓厚的兴趣。阅读过程中,汉字的六种造字法从一些模糊的印象变得清晰起来。 我对里面的同源近义字尤其感兴趣,它虽名为「词典」,我却把它当成了书来阅读,学会了一堆近义辨析: 「木」分两半,左为「爿」,右为「片」 窗在天为「窗」,在壁为「牖」 双扇为「門」,单扇为「户」 长尾曰「鸟」,短尾曰「隹」…
Jan 18, 2024 好几年没写年终总结,因为其实自己这一年,或者说每一年,达成的成就都不多,令人兴奋的更少,所以我可能没办法写出什么取得了长足的进步,憧憬来年更好的文字。 但另一方面,读我的这篇总结应该不会产生什么焦虑的情绪。 工作与技术 2023 年年初我也体验了一把「广进计划」 ^1 ,拿了补偿,也体会到了在一个和利益相关的团队中,各方如何产生分歧,最终导致决裂的整个过程。我也属于在漩涡中心,亲身经历了一次政治斗争。 这段故事我从没在公共平台说过,现在释然了,也不想再提,有些小丑终究是小丑。 休息了三个月之后我加了现在的公司 BentoML ,有了我真正意义上的开源的工作,也非常有幸能和多位大佬共事,学到了很多东西。七月份的时候,也去了一次北京和大家线下见面,气氛非常好。 和别人介绍自己的工作时,别人先是羡慕我是远程工作,然后又揶揄我是深圳的负责人,权当说笑。沾公司的光,我去 DataFun 做了一次分享…
Jan 2, 2024 错误处理是编程语言中很重要的组成部分。一般来说,发生错误时,要立即中止程序正常逻辑的执行,转而执行错误处理逻辑,这个过程称为错误处理。 我用过的编程语言中,比较熟悉的两种错误处理方式,一种是异常抛出,一种是错误返回。它们各有优缺点,也有各自胜任的场景。 先来看看它们各自是怎么处理错误的。 以 Python 为例,抛出异常的方式是: def foo(): # do something raise Exception("something wrong") 处理异常的方式是: try: foo() except Exception as e: # handle exception 以 Go 为例,返回错误的方式是: func foo() (int, error) { // do something return 0, errors.New("something wrong") }…
Nov 13, 2023 一 最近《乐夏》开播,我没看,但我偶尔能刷到一些片段。不知有没别的人和我有同样的发现,大部分摇滚主唱和民谣歌手的咬字 都有一些共同的特点,就是以北京腔为底的夸张化的卷舌,特别是在 zhi,chi,shi 这三个音上有很特殊的听感,就像是在故意大舌头。 可以听彭磊、老狼甚至大张伟的演唱感受下我说的是什么。这种咬字方法和港台流行乐有非常大的区别。这是不是所谓的「京圈」。 有种感觉,就是「京圈」把持了这几类音乐的话语权,并隐然有排外的倾向。所以我希望有更多「九连真人」这类乐队的出现。 二 我回老家参加高中同学的婚礼,久违地进行了线下五连坐。震惊于 DOTA 的环境相比一年前的急转直下。一年前还能欢声笑语,现如今 只能跪求一胜。现在不是有没有开图,而是一局里有几人开图。现在这年头还在打 DOTA 的老人,要么是有吊打开图的实力,要么是和他们一起开图。…
Aug 15, 2023 确实有挺久没有更新这个网站了,而且今年到现在为止只 写 水了一篇博客。于是开始思考,是什么会趋使自己想要写一篇文章来分享呢?找到这个动机,或许能了解为啥自己不咋更新。 同时也更新一下以证明这网站没死。 考虑文章的内容和取材,其一是技术文。这需要良好的输入,通透的理解,以及对知识的整理归纳,才能形成一篇有头有尾深入浅出的文章。我也不能说没有学新东西,只是实在懒得组织思考文章架构了。 平时有些心得体会,在 Twitter(X) 上锐评一下,140 字也足够了。有人说刚入门时分享欲是最旺盛的,现在要发个什么东西都会在无形中自我审查,会不会过于浅、过于钻。 比如我会非常喜欢一些细节的东西,可能别人读来难免有一种「回字有几种写法」的既视感,但我得承认,我还真好奇回字有几种写法。 我非常佩服长青的技术博客,比如 卡瓦邦噶 ,能学非常多的东西。…
Jul 28, 2023
今年以来,Python 打包社区依然很活跃,有对 PEP 582 的最新修改,也出现了一些新的提案, 本文将略作总结。 群众的呼声——统一的包管理器 在去年 9-10 月份的时候,PyPA 曾做了一次问卷调查,目的是了解用户对于 Python 打包现状的看法,以及对于未来的期望 ^1 。在收集上来的问卷中,有以下用户的回复: 回应 1: Unify the multiple tools. It’s good to have new ideas and new implementations, but it has to converge after a while. If my package has a compiled part, I’m stuck with setuptools, but all other tools are pushed forward while not…
Feb 9, 2023 前言 很久没更新了,写这篇文章是因为受了 高天直播 Code Review 的启发,深刻感觉到 Python 的灵活和强大,导致了实现同样的功能不同的人会写出完全不一样的代码。Python 语法糖有很多,如何把握「甜度」?过犹不及,我就本人的口味来细说一下。 <!-- more --> 免责声明 ,本文有关代码好坏的论断纯属个人喜好,总结的规律均为信口开河,若要争论个高下大可不必。 写个配置类 小 F 是个后端程序员,他接到一个需求,写一个配置类作为项目配置的模型。很常见的需求嘛,先不管 Pydantic 之类的现成方案,就假设要造轮子好了。要怎么写呢?小 F 略加思索,写出来了: @dataclasses.dataclass class Settings: db_user: str db_password: str db_host: str = 'localhost' db_port:…
Jul 21, 2022 The English Version PDM 在最近发布了 2.0.0 版本,新特性已基本完成。本文将介绍这次更新的内容。详细改动日志在 这里 可以看到。 虚拟环境成为项目的默认配置 PDM 在建立之初,是标榜自己是一个支持 PEP 582 包结构的包管理器。但无奈,经过两年的观望,PEP 582 仍旧停留在 Draft 状态,并且迟迟没有进展。 它虽然在一开始令人眼前一亮并吸引了大批初始用户,但这也成为 PDM 被主流接纳的一个阻碍 ,限制了它的推广。同时,虚拟环境在各种 IDE 和工具中有更好的支持。 现在我希望 PDM 并不仅是一个个人兴趣的项目,并且是一个支持 Python 打包最新规范的正经的包管理器,所以在 2.0 中,我们将虚拟环境成为项目的默认配置。 在 pdm init 中,如果你没有选择一个已有虚拟环境中的解释器,PDM…
Jul 3, 2022 中文版本 PDM has released 2.0.0 recently, it is mostly complete feature-wise. This post lists and illustrates the important new features, and more details can be seen in the changelog . Virtualenv becomes the default When PDM was first created, it was advertised as a package manager supporting the PEP 582 package structure. However, after two years of waiting, the PEP 582 is still in Draft status and…
Jul 3, 2022 在上周的周记中我记了一句: pdm 提了几个 issue,都和 debian 系统的 python 有关,i hate it 本文是对这句话的一个扩展。作为一个 Python 打包工具的开发者,非常痛恨 Debian 系统,所以我在回复 laixintao 时说道: Python 打包系统的混乱,Debian 系统是要居大功的。其实不止 Debian 是如此,下面开始吐槽,非常不严谨,吐槽完我就跑。 <!-- more --> Python 中的 Install Scheme Install Scheme 的概念,中文大概是翻译成「安装蓝图」?意思就是提供了一个路径的集合,告诉 Python 包的安装器(如 pip ),什么文件应该放到哪个路径下。 本文只打算讨论 purelib 和 platlib ,也就是 Python 库应该放到哪里。Install Scheme…
Mar 27, 2022 我是一个 Logseq 的新手玩家,在使用 Logseq 的时候,有一个最大的痛点, 就是 Logseq 不能随时随地记日记(Journal),本地化存储是 Logseq 的优点,但也造成一些不便。比如我躺上床上,在淋浴中,在运动中想到一个点子, 难道我要记到脑子里,等第二天再记到电脑上,还是我立刻打开电脑记下来呢,这两种方式对中年人都不友好。我把这个问题称作 Logseq 的最后一米问题。 <!-- more --> 好吧不装了,我不是伊洪,但如果你读过他的 巧妙利用 iOS 的快捷指令配合 GitHub Actions 实现自动化 这篇文章的话,应该对这个套路有所了解了。整体思路就是利用快捷指令,把要记的日志发送给 GitHub 触发一个 GitHub Action workflow,在这个 workflow 里去更新 journal 文件。当然,这样的话你本地的 Logseq…
Mar 20, 2022 本文介绍了在 Python 库中 vendor 第三方库的正确方法。我知道这篇文章的受众非常狭窄,大部分 Python 开发者都不会也不需要用到这个技术, 但是本着分享的精神还是把它总结一二,作为软件的作者更是应该尊重所有其他库的作者的劳动。 <!-- more --> WHAT - vendor 是什么? Vendor,直译供应商,在软件中(比如 C, Go 等语言中),是一种把第三方库的代码直接内嵌到软件中的方式。 它不同于通过依赖文件指定的方式,第三方库的代码是直接包含在软件中的,有可能原样保留也有可能经过修改,所以需要注意各种 License 的限制, 特别是如果上游库采用了 GPL 系列的协议,使用 vendor 的软件也是要受到传染的。 WHY - Python 中什么时候要用到 vendor? 正如我开头说的,适用范围非常狭窄,有三种场景:…
Mar 12, 2022 这是我在今年 11 月 PyCon China Shenzhen Meetup 上做的线下演讲。由于之前我在线上的会议上介绍了 Python 打包的历史进程,所以这次我打算 厚颜无耻地 单纯 给 PDM 打广告,原本就是打算现场 demo,没怎么准备。结果到了会场之后发现播放设备和讲者是分离的,我临时在会场录制了一个 demo。 线上和线下演讲体验相差很大,线下虽然不会和录制的演讲一样语气机械化,但也会造成一直嘴瓢,很多下意识的连接词。 仓促准备,错误在所难免,姑且一看,对于了解 PDM 还是很有帮助的。 视频: https://www.bilibili.com/video/BV1A3411x7Yv?t=10604.1 Slides: https://slides.fming.dev/pdm/
Dec 21, 2021 Python 里的 argparse 大家都不陌生,是用来解析命令行参数的标准库,它的用法大致是这样: import argparse parser = argparse.ArgumentParser(description='Greet to some body') parser.add_argument( '-n', '--name', default='John Doe', help='name of the person to greet') args = parser.parse_args() print(f'Hello, {args.name}!') 这非常地平凡,如果用 click 的话,可以更快地写出来相同的功能: import click @click.command() @click.option("-n", "--name", default="John Doe",…
Nov 23, 2021 我在今年的 PyCon China 2021 上在线做了一个演讲,题目是「Python 打包 101」。Python 打包是个每个 Python 开发都可能用到并且需要了解的知识。演讲试图从 Python 打包的历史进程开始,阐述 pip install 背后发生的过程,同时介绍当前 Python 打包的最佳实践。 同是我是分会场的主持,为了能减轻负担我选择了录视频,这也是我第一次录视频,有几个体会: 自己回放时感觉有点拿腔拿调,和平常说话不一样; 我是事先准备了讲稿,讲下来发现会比现场讲快不少。这段演讲如果我现场讲应该要 30 分钟; 中间如果出现错误,做一个停顿再重新开始,后期剪辑很方便,所以不会出现要求高导致录了好几遍的情况,那样的话对讲者本人是个折磨。 视频:…
Oct 20, 2021 本文是 Subclassing in Python Redux 的中文版。在阅读的过程中,我发现与我的「友好的 Python」不谋而合,故向作者请求翻译此文。版权归原作者 Hynek Schlawack 所有。除非特别说明,本文所有的「我」均指原作者 Hynek。 <!-- more --> 继承与组合之间的冲突就和面向对象编程一样古老。一些最新的语言,如 Go 和 Rust ,证明了你不需要继承也能编写代码。但是具体在 Python 语言中,有什么实用的继承的方法呢? 任何长期关注我的人都知道,我是坚定地站在组合而非继承的阵营。然而 Python 设计如此,有时如果不用继承,你就无法写出惯常的代码 。我写这篇文章的目的就是思考这个问题,这个「有时」是何时,并解开我对这个问题的直觉[^1]。 [^1]: 首先明确我不打算谈论标准库的 API。诚然, SimpleHTTPServer…
Jul 30, 2021 前言 上一篇 说到写代码要对开发者、接手者友好,需要让程序扩展起来比较容易,实现「高内聚」。同样地,对用户来说,程序使用起来是否友好也是决定了他用不用你的软件的一大要素。本文我们就先说一说其中的一种使用情形:作为上游库对下游提供接口(API)。 <!-- more --> 场景 小 F 新加入了某大厂的一个基础组件部门,要负责维护一个组件的 Python SDK。这个组件本身是 Java 写的,小 F 看了一眼文档的 Quick Start,眉头逐渐紧锁: from awesome_sdk.client import AwesomeClient from awesome_sdk.core.auth.basic import AwesomeBasicAuth from awesome_sdk.core.connection.tcp import AwesomeTCPConnection #…
Jul 23, 2021 时隔两个月没有更新博客,这次准备来个专题「友好的 Python」。虽然我脑海中想好了几个主题,但具体写什么还不知道,这个系列能写几篇也不知道。构思一篇博客真的是太难了,至少对我这种懒人来说。 <!-- more --> 前言 Python 是一门相当灵活动态的语言,这就导致实现一件事情可用的方法往往不止一个,于是就有很多人质疑 Python 之禅中的这一句话: There should be one-- and preferably only one --obvious way to do it. <cite>—Tim Peters</cite> 大家质疑的理由没错,这句 Python 之禅也没错——如果你能找到这样一种 preferable,obvious 的方法,那它就是 Pythonic 的。Pythonic 这个形容词虽然虚无缥渺,但我觉得这个定义是比较符合的。…
Jul 7, 2021 随便水一篇「雕虫小技」,想到哪算哪。读本文前假设已读过 这篇文章 在 Python 中如何编写一个自定义的字典类?大家可能被告诉要使用 collections.abc 中的类作为基类而不是 dict 。 dict 也不是任何时候都不能做基类——当你没有重载任何内建方法时可以直接继承 dict 。 但实际场景千变万化,我们不能被几条规则限制了我们的思考,我们是基于什么来选择基类的呢? 我们需要什么样的鸭子 Python 的类型系统和多态基于鸭子类型,只要这个对象有 我需要的 所有特性我就能使用它,不管它类型为何。那么针对自定义字典,都是鸭子,我们需要什么样的鸭子呢? collections.UserDict : 机器鸭,拥有所有鸭子的技能。 collections.abc.Mapping ^1 : 一个神奇的鸭子外壳,得按要求穿到身上,任你是什么东西都立即拥有了鸭子的技能,和长相。 dict…
May 19, 2021 2024.1.2 更新 : 本文中的评论系统已经迁移到了 Artalk 我最近把评论系统切换到了 Cusdis ,这是一个非常年轻的项目,我是看着 GitHub Repo 从建立到现在近 900 个 star 的。产品体验不错,在开源协作的过程中也有很多收获,觉得有必要推荐一下,并且介绍下自己用的 workflow 所以有了这篇水文。 我为什么选择 Cusdis 评论系统有以下几种选择: 公司产品,最有名的比如 Disqus,好处是使用人数多方便互动,不用自己管理 Infra,缺点是不由你说了算,比如 强行给你加广告付费才能去除 (驱动我换评论系统的最大原因),以及被墙及跑路的风险。 白嫖后端产品,常见被白嫖的有 GitHub( utterances ),LeanCloud( Valine ),优点是省心,缺点是不好导出迁移。 自造轮子产品,比如 我曾经就做过一个…
Apr 28, 2021 最近每天早上醒来的第一件事就是看邮件,做开源这么久,好像突然变忙起来了,之前从来没有过的分身乏术的感觉也涌现了出来。 有段时间不写博客,就会浑身难受,实在没写的就更新下近况。<cite>― laixintao</cite> 那就水篇文章来谈谈我最近做开源的体会吧。 一个性能非常拉垮的 Markdown 解析器 我在 2018 年的时候造了一个 Markdown 的轮子用来解析、渲染 markdown 文档,名字叫 Marko 。其实我不爱造轮子,如果有能用的修修补补也就用了,但有个需求,我实在是没找到合适的可用的。我希望能方便地给 markdown 解析器增加自定义的元素和解析逻辑,但现有的流行的库都有不同程度的不足: Python-Markdown , 文档极其简陋,我不知道有谁成功地给它写了扩展。 mistune , 大佬 lepture…
Mar 30, 2021 From the perspective of performance and correctness
Mar 26, 2021 (放一首歌纪念潇洒哥) 「我的技能是 LRU」这并不是一句玩笑话,我们的大脑记忆本就是基于这种模型运作的。 <!-- more --> LRU( Least Recently Used )顾名思义,只有最近经常使用的才会留下,其他更久远的只能消失了。我离开学校七八年,至今仍非常喜欢看一些数学题解,甚至拿起手边的纸笔演算一番,实在没什么可做,比如写码的间隙,我也会在纸上写写字。我这么努力的做一些完全没必要的事,是因为我很怕,怕这些技能生疏了,就捡不起来了。 其实人际关系也是一样的。一个有趣的事实:我 2017 年注册的推有 342 个 fo,我 2015 年注册的 GitHub 有 348 个 fo,而我 2010 年注册的微博,只有 303 个…
Feb 3, 2021 When you develop a Python project, you need to install the project's dependencies. For a long time, tutorials and articles have told you to use a virtual environment to isolate the project's dependencies. This way you don't contaminate the working set of other projects, or the global interpreter, to avoid possible version conflicts. We usually have to do these things: $ python3 -m venv venv # make…
Jan 22, 2021 大家圣诞快乐, 雕虫小技 栏目又和大家见面了,谁让咱不会那些个屠龙之技,只好捉几个虫子玩玩了。 写这篇文章是因为过去的两年关于 pip 和 Python 包管理有几个重要的 PEP 发布,然而网上(中文世界)的打包发布教程很少有针对此的更新。 再加上我成为 PyPA 的成员已经尸位素餐快一年了,还是应该来做点贡献。 <!-- more --> setup.py 真难写 似乎从有 Python 打包以来就有了 setuptools 这个库,你能搜到的教程,涉及打包发布的,都会让你编写那个可怕的 setup.py 。 不知道谁能完全掌握那个东西的写法,我到现在都还不太会。说几个常用的配置: 指定依赖和可选依赖 setup( install_requires=["flask", "flask-migrate", "sqlalchemy"], extras_require={"mysql":…
Dec 25, 2020 吃完晚饭略感燥热,把外套脱了。打开朋友圈,我知道北京下了第一场雪。饭店熙熙攘攘,我却思绪澎湃。 我和北京断了关系,已经六年了。 时间回到我八岁那年,那时记忆已模糊,只是后来听大人饭后时常提起,那时我第一次从电视上认识了一所大学,并把她当成了我的目标。 她就是北京大学,那是 1998 年,北大的百年校庆,一位伟人做了讲话。 后来的事就是,我并没有什么主角光环,没有成为励志的主角。我去了中科大,一所离开了北京就再也没有回去的学校。 你知道那种感觉,就是你暗恋的初恋,没有开始就已结束。我混过了在合肥的四年,所幸绩点还行,科大保研名额也充裕,当时众多科研院所,我选择了微电子所。 虽然微电子并不是我感兴趣的专业,但这也是我能面过的,唯一一个北京的院所了。现在回想起来,科大对我有恩,我却像一个不孝之子,匆匆地离开了,头也没回。 没能和兄弟们好好告别,毕业礼也没能参加,这个遗憾,可能会伴随终身。…
Dec 12, 2020 在做独立博客的时候,特别是对于程序员来说,代码高亮是很重要的一个组件。我也接触过几款不同的代码高亮引擎。衡量一个高亮引擎的好坏有很多不同的方面:分词、性能、稳定性、主题丰富性。本文将专注分词的表现,对几款流行的高亮引擎以及 IDE 做一个横向对比。 <!-- more --> 什么是分词 要把一段代码高亮输出,主要工作流程大概如下: 分词的过程就类似于画画的线稿,线稿越精细,上色的自由度就越高,最终得到的输出就有可能越丰富好看。作为一个面向颜值的工程师,对颜值可以说非常看重了。不管着色主题好看与否,分词的精细程度才是关键之处。分词分好了,怎么上色无非是主题作者的事情。 对比的对象 测试例子代码是 Python,因为我也主要关注 Python 代码的分词表现,主题统一用 Monokai 并做了微调以求尽量统一。根据分词进行在前端或者后端,本次参加对比的选手有: 前端分词:…
Dec 8, 2020
← Prev ✦ Random Next → Visit ↗ Feed Kagi ↗