2024-12-24 08:00:00
在 BentoML lead 了几个重要的 feature,包括 1.3 和 1.4 两个大版本,以及 Codespaces 和 Comfy-Pack。
11 月参与 PyCon China 2024,见了许多网友,参加了代码厨房的活动,很开心。做了关于 Pydantic 的演讲。
11 月参与了 NebulaGraph 深圳的线下活动,做了关于 BentoML 的分享。
5 月份有荣幸与 Paul Romer 见面交流,并造就了 2024 年我最受关注的一篇文章。但于我来说会总结为机缘巧合,不必赋与我其他的光环。事实上从那以后我试图联系过 Romer 先生都没有得到回应。
开源了 FxZhihu 被很多人使用,感受到贡献了一些价值。
写作博客文章 15 篇。
由于 uv 的横空出世,PDM 无疑受到了一些冲击,发展明显变缓。
但我不是那么狭隘,人不能沉湎在过去的辉煌中举步不前。好用的工具得用,我自己平时也会用用 uv。PDM 也在 2.19 中加入了对 uv 的支持。
开源了 Tetos,一个 TTS 的统一 SDK 库。
其他的一些娱乐项目比如:
2024 依然目睹了 GenAI 和 LLM 的火爆,我个人也体验了 Cursor 最后又回到了 VSCode。
今年继续去了挺多地方。
1 月份汕尾
2 月珠海——中山
春节马六甲——吉隆坡
清明节广西梧州
4 月份上海
五一普者黑——弥勒
6 月份泉州
8 月份太原
国庆日本九州
11 月潮汕
PyCon China 上海 Again
12 月香港
最喜欢的书是《隳三都》,在历史非虚构里属于非常优秀的了。另外还有刘震云的《我叫刘跃进》,高级的黑色幽默。 电影没有最喜欢的,相对好的是《走走停停》《从 21 世纪安全撤离》和《死侍与金刚狼》。
只是 10 月份以后就没有看书和电影了,提不起兴趣来。
明年会怎么样,我也不知道。2025 是个平方数,希望是个好年。
$$ 2025 = 45^2 = 3^4 \times 5^2 $$
本文题图由 Ideogram 生成,其余图片,除 PyCon China 合影,均为本人拍摄。
2024-12-18 08:00:00
最近社区里有人提了一个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
的方法,此方法中持有 foo
的引用。而 foo.bar = foo.bar
,相当于把这个结果缓存在了 foo.bar
属性上。之后的 foo.bar
只是从属性上取值,这样 foo
和该方法互相持有对方的引用,出现了循环引用。
现实中我们不太可能会写出 foo.bar = foo.bar
这样的代码,但是在 monkeypatch 场景下,可能很容易被坑到,比如:
import requests
resp = requests.get("https://example.com", stream=True)
resp._fp = CallbackFileWrapper(resp, callback)
...
上述代码 patch 了 requests
库的 Response
对象,让它在被读取完成中调用我们指定的 callback
函数。这里 CallbackFileWrapper
会持有 resp
的引用。
如何避免?
在上述例子中,我们可以使用 weakref 来避免循环引用:
import weakref
class CallbackFileWrapper:
def __init__(self, resp, callback):
self.resp_ref = weakref.ref(resp)
self.callback = callback
def read(self, size):
resp = self.resp_ref()
if resp is None:
return b""
read_bytes = resp.read(size)
if not read_bytes:
self.callback(resp)
2024-11-07 08:00:00
我女儿第一天上幼儿园回来,我就拿着群里他们班级的合照,挨个问她每个小朋友都叫什么名字。一方面是想看看她集体融入得怎么样,另一方面是自己想留个底,争取每个小朋友的脸和名字都能对上。 她当然不能每个都叫出名字来,但配合群里其他家长聊天的信息,三天后我就基本能全叫出名字了。有回我正在问,丈母娘见了在旁说,「知道这个有什么用,你又不是老师。」面对这种言论,我只能一笑了之。
我觉得,总会有用的。在我看来,至少有下面几个用处:
但丈母娘这个看法就见识短浅了,她才是接送孩子的主力。我已经不知多少次听她说路上碰见个幼儿园同学,做了什么举动,却不知道是谁。
今天去幼儿园参加家长开放日的活动,其实就是小朋友在上课活动时家长在旁观看。户外休息时,很多小朋友围到我身边来,因为他们发现我能叫对他们每一个人的名字,甚至还知道小名。于是就疯狂地来考我,乐意跟我聊天。 我突然觉得,两年前做过的功课没有白做,今天派上了用场,不是什么大用,能温暖我一阵子,也足够了。
所以,你看过的每一本书,玩过的游戏,走过的路,都不会浪费。只是你还没找到用处罢了,又或者它们已经内化在你的个人气质中了。
功不唐捐。
2024-10-20 08:00:00
import Tweet from '@components/Tweet';
我一直在思考要在博客写些什么,我能写什么。刚好看到了 @laike9m 的这篇推文:
<Tweet client:only="react" id="1847557409457524950" />
有很多观点我是不敢在网上表达的,只能和女朋友说说。有的是因为太个人化,有的是违反了普遍的认知,以及第三种情况:解释清楚要花太多时间,而我的时间本就不多。于是每次都是想想,很快便打消了这个念头了。
确实,很多时候阻挠我表达的,是四个字「大可不必」。我要表达的观点会有人认同吗?或至少,会引发一些思考吗?如果两者的答案都是否,那就「大可不必」发表了。或者即使,观点或许有一些价值,那么我要怎么表达呢?是不是得安排逻辑结构、旁征博引、收集数据案例,这些值不值得?「大可不必」,这四个字又在我脑子里冒了出来。
于是,很多想法可能就这样,只停留在了熄灯后的卧谈,甚至,更普遍的情况是,只停留在了脑海里,永远没有见天日的机会。
我们不知不觉中,给自己的表达设定了一个阈值,超过了这个值的,才会出现在对外分享的表达中。而要克服这个阈值,很需要一些能量。我死去的半导体课上学过的知识又突然袭击了我,价带电子需要一定能量,才能跃迁到导带。
所以我有时非常羡慕一些生活博主(特别是居住在国外的),坐了什么公共交通上班,吃了什么饭,日落时没云彩,下雨忘了带伞,都可以成为他们笔下津津乐道的话题。我心想要是按他们这个阈值来,那我每天不得发 24 条动态。
但有时候我又会想,大可不必。
感谢今天战胜了我的阈值的我的表达欲。
2024-07-24 08:00:00
上周末《从 21 世纪安全撤离》(后简称《21》)在深圳点映,一直很期待导演李阳的作品,距离《李献计历险记》已过去十多年了,那时房祖名还在呢。于是一出来就买了票和老婆一起去看了。看完后我和朋友聊的感想是:
我最大感想是,感谢所有资方,感谢电影工业,感谢演职人员,信任李阳,帮他完成这个作品。
没错,李阳在所有中国导演中都是一个异类,只有他能拍出这种味道的东西。怪诞、热血、信息量爆炸、莫名其妙。可以预见,这将会是一种评论两极分化的片子,密集的视效和神奇的转折之下,是破碎的剧情和二维的人物。我个人是很喜欢的,我记得在临近结尾的时候,吴晓亮演的角色在家里打《街霸》,我疯狂地扯我老婆,说这是《我爱我家》里贾家的布景啊哈哈哈,但她没什么反应。有时 GET 到了一个彩蛋,我会在内心想:这就是给我准备的啊,我懂你的梗,我厉害吧。我突然有些明白了,喜欢这部电影的会是什么人群,诚然导演是拍他自己喜欢的事物,他是个老二次元了,没有刻意要迎合谁,但这个受众人群的画像的轮廓,却渐渐在我脑中浮现了出来。我甚至于认为:
李阳这部作品等了这么久,难说不是因为这群人成为了社会中流,时机才成熟了。
这群人大概是:从小看日本动画长大、玩街机、爱摇滚、听唐朝乐队,现在喜欢二次元,喜欢上破站,喜欢宫骑英高,喜欢新民谣,喜欢万能青年旅店。
如果你全中了,可以在评论区扣个 666。问题是,这些就代表了全部的人吗?那些不喜欢这些的,看不懂《21》的,也是和我们同龄的人。我个人的话,符合 70% 吧,有些事,不喜欢就是不喜欢。我们曾认为我们是非主流,然而这已俨然成为主流,在中推、在知乎、在即刻、在小红书,到处都是同类。以至于那些对这些本不感冒的人,也硬要变成一分子,仿佛你不喜欢这些,就会被排斥在外,比之大城市的排外,有过之而不及。我不希望在这里表达对这部电影的喜欢,会排斥到了其他人。我写过《我们生活在差异里》,最后一句是:
周围的人大都是相似的,但除此之外存在着更多其他的人,我需要认清这种差异,并包容它。
所以最后,我推荐你去看这部电影,但如果你看了之后觉得不好,甚至垃圾,也欢迎你回复对这部电影的看法。
This message is used to verify that this feed (feedId:41342818704332806) belongs to me (userId:41749083576628224). Join me in enjoying RSS on the next generation information browser https://follow.is.
2024-05-30 08:00:00
:::note[版权声明] 本文谢绝一切转载,只能以链接形式分享。 :::
如同这个 Drama 的标题所写的,在我 34 岁生日这几天发生了一件非常 Drama 的事情。到现在我依然感觉有些不真实,但事情就是,我「接见」了诺贝尔奖得主。
5 月 28 日这天我收到了一封邮件。我向来习惯及时阅读新的邮件,至少是邮件的标题,所以我的邮箱从不积压未读邮件。我每天早上都会收到很多 GitHub 的通知邮件,但这一封没有 [GitHub] 的前缀, 我留了意,但也没有立刻打开阅读。可能是这个「只读标题未读内容」的行为触发了 Gmail 的机制,它把它扔进了垃圾箱。等我有空想要去读的时候发现邮件已经不见了,所幸我扫了眼垃圾箱,找到了这封邮件。
首先开头有我的称呼,然后他说自己是一位小有名气的经济学者,有维基页面。看到这我当然立即去看了一眼维基,果然有。履历中最为耀眼的,当然是 2018 年的诺贝尔经济学奖共同获奖者之一。他表明了自己的 Python 爱好者身份,联系到我是因为他刚好现在在香港,并在整个航班的时间里都在看 Python 打包的知识,认为我做的 PDM 是一个非常好的项目,想要约我见面,并表示周四(两天后)可以到深圳来。
信息量有点大,你问我有没有怀疑这是假的,我比任何人都怀疑这是假的,但开头的称呼和了解我做的项目这两点还是打消了我一半的顾虑(邮件里提到 PDM 的,至今没有一封是 spam)。另外提前仅仅两天的约见,要不是我习惯清空未读列表,否则很容易错过。至于一位功成名就的,大我 35 岁的大人物,为什么想见我这个无名氏,我相信一件事:
当佬巨到一定程度,他是向下兼容的。
我读了几遍,发现没有任何拒绝的理由,但保险起见,我还是和 yihong 一起,核实了来信地址的真实性。并且他的照片在网上到处都是,是很容易验证的。
于是我覆信表达了愿意见面,并询问对方的行程和意向的见面时间地点。关于他想来和我谈论什么我还没有想明白,但我不愿意想得太功利。如果只是谈生意和上价值,那我会有些失望。我愿意认为他只是一个年近七十的 Life Long Learner,想要和我交流一下我擅长的领域,毕竟这是他唯一能从我这里获得的了。
没想到他为了打消我的顾虑,还回信说:
Our situation may be more symmetrical than you think. I have been learning Python since 2018. I am certainly not a developer. My Python is probably worse than your English!
这也太 nice 了,什么叫向下兼容。对方这么说,翻译我是不可能翻译的,感激涕零都来不及。随后就是确定时间地点。
见面之前,他发了很长的一封信介绍他的相关背景,以及计划要谈的话题。即使地位悬殊,年龄悬殊,他依然恪守了基本礼仪,让未来的见面能顺畅进行。我不想因为他是大佬就拼命溜须,但这种谦恭的态度真的让我学到了很多。此时我已经完全不怀疑这事有假了。他不远万里从香港辗转来深圳,我这是真正的「接见」了,荣幸之至,诚惶诚恐。
我们约在了下午两点见面,作为资深 I 人,我从来不会在约定时迟到,但也绝不会提前很久到,每次都会卡得非常恰当。我算好时间出门,没想到他说行程提前了,所以可以提前到达。这表明他需要在茶馆等我一段时间,不过我没有错过约定时间,也不会特别歉疚。但这样有另外一个后果:该茶馆是预付费的,我没办法付账了。我真的是必被抢单的体质,但我想外国人不会太在意这些。
刚一见上我们就开始了对谈,可以说在整个一个多小时时间里我们连茶都没喝一口。我作为听者比较多,毕竟说也不擅长,有点像是我在采访他了。
他目前在做的有两个项目,其一是帮助 Python 初学者搭建 Python 环境的一个 GUI 应用。另一个是帮助用户生成和管理加密密钥,并进行数字签名的一个应用程序。两者都是面向初学者的简化操作和理解负担的效率工具。从这可以看出,从现在到未来一段时间内,Python 初学者仍然是一个庞大的群体,而 PEP 582 对于简化用户环境配置是一个非常好的提案。只是在 Python 论坛中讨论提案的人,还是以有经验的开发者居多,包括 PDM 的 issue tracker 中,多半也是一些有着奇奇怪怪使用场景的「高端」用户,而不是经验不足的初学者。同时我自己写的文档也不能很好的满足初学者的习惯。PEP 582 的拒绝是一件非常遗憾的事,但如果有更多初学者的声音,我相信有希望可以重启该提案的评估。
另外他还谈到了数据安全和数字签名,希望做一个面向小白的更易用的密钥管理和签名工具(gpg 太过 geek 了)。这方面我也不是很懂,主要以听为主。同时他也认为 Jupyter Notebook 在未来应该替代 PDF 成为研究论文的推荐媒介,在 Mathematica 和 Jupyter Notebook 之间推崇后者。
他非常喜欢开源,愿意为开源提供经济支持,期间还提到了 Python-Type-Challenges 这个非常适合初学者的学习项目,还以为是我的作品,我立刻做了澄清,怎能抢了 @laike9m 的功劳。
再写就变成新闻稿了,文末会附上音频转写,我想 AI 应该会比我总结得更好。让我感到敬佩的是他对很多技术细节的了解,比如他喜欢 PDM 用的 python-standalone-build 胜于 pyenv,而这是 PDM 最近才引入的一个特性。又比如他了解去年 ChatGPT 的重大事故,是 asyncio 和 redis 引起的,还想让我去 Boston College 解答 asyncio 的问题。所以啊,无论是什么牛人,都用不好 Python 的 async。
最后我邀请他到 PyCon China 来做一次演讲,我认为 Python 新手教学的话题,会是一个很有价值的输入。
见了厉害的大牛并不表示我也是厉害的大牛,但这是我第一次靠自己的工作和成就,而不是雇主的背书和推介而获得外界的认可,而且可以回应家人「你都在搞什么」这个问题,这才是真正值得我高兴的事。如果要感谢,那就感谢 Guido 吧。