Telegram Channel
记录和分享有趣的信息。

Record and share interesting information.

contact: [email protected]
https://github.com/shopspring/decimal?tab=readme-ov-file#faq

搜索 decimal 的库时看到这段 README 很有意思,介绍了为什么在金融应用中不能用有理数(Rational)来替代 decimal。

都知道浮点数只能表示近似值,一般不用于金融领域。而 Golang 中没有内建的 decimal 类型,有些人就提议说可以使用有理数 big.Rat 来代替。但是此文中举了一个通俗易懂的例子来反对这一观点,假设有三个等于 1/3 的有理数 a、b、c,使用 .FloatString(3) 将其转化为 float64 后的值为 0.333,可以看到它们相加后的总额中的 0.001 就消失了。

说到底就是有理数本身虽然没有精度损失,但是将其转换为 float 时会导致精度损失,毕竟你不可能直接给用户显示一个有理数。所以在金融应用中,最好不要使用有理数,而是直接使用整数。而 decimal 存储的实际上就是整数和小数点位置的偏移量。
[ On | No ] syntactic support for error handling - The Go Programming Language

持续了数年之久的 Go Error Handling 之争,算是官方盖棺定论了,结论就是:摆烂。

自从放弃 Go2 方案后,兼容性就成了第一要务,非必要不修改语法。而 Error Handling 虽然长期以来都是社区最不满意的设计,但是关于具体的改进方案始终无法形成压倒性的共识,所以,官方决定,就这样吧,不改了。所有的历史讨论都到此为止,提案也逐步关闭。

并且对一些广受诟病的设计,做出了一些很牵强的解释:

* 语法啰嗦?反正你们有 AI 补全了
* 看起来碍眼?反正现代 IDE 都可以折叠。
* 没有 stack traces?打日志的时候多加一点参数嘛。

写 Go 的朋友喜欢怎么处理 error?我还在用古早的 github.com/pkg/errors 😂
「Here's how CockroachDB keeps your database from collapsing under load」

其实是一篇关于 Golang Goroutine Scheduler 的文章。众所周知,Go 的 Goroutines 并没有优先级,对于类似于数据库这样的应用,如何在高并发的情况下保证重要任务的执行就会面临挑战。这篇文章就是介绍了 CockroachDB 的做法,通过在原生的 Go Scheduler 外增加一层名为 Admission Control 的调度层,来实现了 Goroutines 的优先级调度。

核心思想就是不要再将大量的 Goroutines 直接交给 Go Scheduler 去排队。而是先在应用层的 Admission Control 内的优先级队列里排队,只将当前系统能够负载的高优先级任务交给 Go Scheduler 去执行,这样就可以保证在高负载下系统仍然能保证重要任务的可用性。

具体的优先级实现有很多很巧妙的设计。比如优先级系统区分为 Token Based 和 Slot Based。对于 CPU 型任务,采用令牌桶算法,根据可用资源的情况来生成令牌,并且分发给任务使用,如果有任务超额使用了令牌,则扣减总的令牌数。而对于 I/O 型任务,因为 I/O 操作会阻塞 Goroutine,所以采用了 Slot Based 的方式,根据当前系统的 I/O 负载情况来动态调整 slot 的数量。而且动态调整的时间间隔也是动态变化的,尽量减少 CPU 消耗。

还观察到,即使使用这个优先级系统提交任务,偶尔也还是会导致 Go Scheduler 过载。而优化方法是将调度下一个任务的逻辑放到 task 的执行逻辑中,这样就只有在 task 被 Go Scheduler 实际交给 P & M 运行时,才会进行调度下一个任务的逻辑,从而确保了 task 不会在 Go Scheduler 堆积。

Refs:

* Source Code: cockroach Admit
* Go scheduler: Ms, Ps & Gs
前阵子爆火的(过气网红) Manus AI 带火了 machine-use agent 的概念。然而众所周知,如果让 LLM 直接操作本地机器,会产生巨大的安全风险,所以各种沙盒技术也应运而生。正好趁着 https://github.com/trycua/cua 开源的机会,学习一下实现的原理。

首先,LLM 需要具备 vision 和 function calling 的能力。

接下来做的事情就很传统了,启动一个虚拟机,这个虚拟机内会启动一个 websocket server,这个 server 可以还可以通过 pyautogui 对虚拟机执行截图、鼠标和键盘操作。客户端通过 websocket 和 server 进行交互,获取截图并下达指令。

整个操作的循环是这样的:启动虚拟机,固定屏幕尺寸,截图,然后画上网格辅助线,交给 vision llm 识别,交代下一步需求,然后 llm 返回在 (x,y) 执行某个鼠标或键盘操作,然后通过 ws 传输进虚拟机内的 server 执行,并返回执行后的截图,继续循环。

将对虚拟机的所有操作,抽象为一系列的如 left_click(x, y) 这样的接口,然后让 LLM 根据截图和指令,以 function calling 的方式调用这些接口。这样就实现了一个 machine-use agent。

这个虚拟机其实不仅仅可以跑在本地,而是可以运行在任何网络可以连通的供应商上,只要让客户端能够通过 ws 与其通信就行了。
读完《程序员修炼之道:通向务实的最高境界》,书如其名,这是一本面向务实的程序员的经验之书,介绍了务实的哲学、方法、工具和团队协作等方面的内容。读这本书时常让我想起《The Art of Readable Code》,如果你真心热爱编程,并且希望编写可维护的代码,那么非常推荐阅读此书。 #book

* 📖摘抄
读完 Nadav Eyal 所著的《逆流年代》(Revolt)。此书写于特朗普第一个任期之时,从作者参与一个私人富豪酒会讲起,述说着那些从全球化中获利颇丰的富豪们,如何对以特朗普为代表的逆全球化威胁视而不见,以为这只是暂时的倒退。作者通过对全球化弊端和右翼运动的剖析,深刻地指出世界格局正在发生深层次的变化,全球化时代正面临着前所未有的挑战。

首先,“全球化”并非一个充满美好和进步的乌托邦。全球化的本质是资本的全球套利,其基础是不平等——正因为不平等才存在套利,而套利会进一步加剧不平等。全球化通过将代价转移给公众视线外的外国,带回大量利润,催生了新的一批富裕阶级。但是,加剧的不平等会积蓄社会矛盾,这种矛盾的表现形式就是反全球化的右翼运动。

然而,虽然右翼运动大多发源于经济不平等,其支持者也大多相对贫穷,但右翼的精神核心既不真正关心经济,也不着眼于内政。右翼运动真正的内核是“身份认同”,而全球化正是其身份认同的最大敌人,因此右翼运动必然会全面攻击全球化的国际关系。并且,左翼人士往往以为改善经济状况可以缓解右翼运动,这是一个误解。右翼思潮是一种富有攻击性的“思想病毒”,它和宗教的极端原教旨主义相似,是一种寻求身份认同的群体运动。他们常常对经济等现实问题视而不见,反而热衷于寻找“隐藏的敌人”并加以攻击。

全球化本身所蕴含的失衡已达到临界点,而其所面临的反全球化运动也正在蓬勃壮大。我们这一代人是能够顺利地将这套体制修修补补、勉力维持下去,还是不得不面临世界秩序的崩塌与重构,我们只能拭目以待。 #book

* 📖摘抄
读完 Chris Miller 的《芯片战争》(Chip War)。看到这个书名时我第一个想到的就是 Eric M. Jackson 的《The Paypal Wars》,本来以为也会是一本围绕芯片的商战故事,结果没想到真的就是字面意义的“战争”,以地缘政治和军事对抗的角度,描述以美国为核心的芯片产业历史。

半导体产业的起源就是冷战时期美国意识到在传统军备上,美国和欧洲已经远远落后于苏联,于是马歇尔和佩里提出抵消战略(Offset Strategy),通过部署精确打击为主的高技术武器,来抵消苏联在传统武器数量上的优势,而高技术武器的技术基础,就是半导体。半导体作为人类工业的明珠,需要庞大的供应链来支撑。苏联虽然凭借强大的间谍网络,几乎获取了美国全部的半导体秘密和零部件,然而即使能够在政治为主的体制下实现技术复制,但却无法实现有利可图的大批量生产,这也标志着在大规模产业链的现代工业模式下,传统的“复制策略”已经失效。

五角大楼的军工订单催生了美国的半导体产业,但是仙童的罗伯特·诺伊斯(Robert Noyce)很有前瞻性地意识到,未来半导体真正的需求一定是民用计算机,而不是军方。所以他不同于那些安于享受高利润军队订单的公司,而是大刀阔斧的降价,让产品能够适用于民用市场,最终开启了蓬勃的民用半导体时代。因为不满足于仙童股东拒绝为员工发放股份的做法,诺伊斯和戈登·摩尔(Gordon Moore)最终离开仙童,成立了英特尔。

还有一段小插曲是,作为二战后扶持日本振兴的国家战略,美国积极扶持日本的半导体产业发展,在日本政府财政扩张的无限支持下,日本半导体迅速崛起,一度占据了全球 90% 的份额。索尼公司创始人盛田昭夫(Akio Morita)在 1989 年出版了《日本可以说“不”》,书中提到日本可以凭借半导体优势制衡美国,甚至可以通过为苏联提供技术支持来打破冷战的军事平衡,这也代表着日本的野心膨胀到了极致。可是随着日本经济崩溃,半导体产业也随之崩溃,大部分市场份额韩国抢走。

接下来的故事就是李国鼎倾尽台湾的政治和经济力量支持张忠谋成立台积电,在美国半导体行业耕耘多年的张忠谋决定发展一套独特的代工产业,台积电声称绝不自研芯片,以表明自己绝不会成为芯片设计公司的潜在竞争对手,专注于芯片代工生产,以低廉的劳动力价格和精湛的技艺,吸引了众多美国半导体公司的合作,并最终成为世界上最大的半导体生产公司,垄断最先进制程的生产工艺。

文章的最后篇幅介绍了华为,称华为的崛起路线和早年的三星很像,“以更低廉的价格,向全世界提供更优质的产品”,华为凭借其庞大的研发投入支撑起了产品的不断迭代,并且在很多领域取得了世界先进的水平。但是,随着美国以国家安全为由开始对中国的半导体产业展开全面遏制,就如同当初苏联失败的“复制策略”一样,中国想要实现完全独立自主的半导体产业链是不现实的,即使中国在十年后能够达到台积电目前最先进的水平,但是以台积电为代表的全球产业链本身也在不断更新迭代,耗资一万亿美元打造的国产半导体在市场上将完全没有市场竞争力,仅仅依靠行政手段的采购无法支撑起这么庞大的成本。如果中国真的要和美国全面对抗,那么中国只能寄希望于打造一个去美国化的全球产业链,但是在美国软件和设计的全面封锁下,其他国家很难无视美国的制裁去协助中国。 #book

* 📖摘抄
读完 Camila Russo 的《点对万物》(The Infinite Machine)。以传记的形式,记录了 Vitalik 和 Ethereum 诞生与成长。此书的内容很通俗,不会包含技术细节,也不会包含金融 DEFI,而是只关注与 Ethereum 的成立背景与早期所面临的一系列挑战。

首先最主要的挑战就是,通过 ICO 售卖 Token 这一行为,很可能构成非法销售证券而引起美国证券交易委员会(SEC)的调查。以太坊初创团队花了很多时间和心思,通过将 Token 描述为用户用以支付去中心化应用的使用费(GAS),而不是作为看好核心团队工作的投资工具,让 ICO 被定义为消费而不是投资,从而避免了被 SEC 认定为证券的风险。这一举措也掀起了后来的 ICO 热潮,大量炒作项目通过 ICO 获取了巨额资金,然后跑路或消亡。

另一个挑战就是,因为以太坊提供了图灵完备的智能合约,在带来极大开发便利性的同时,也留下了无穷的安全隐患。2016 年发生的 the DAO Hack 事件分裂了以太坊社区的共识。以 Vitalik 为首的人通过硬分叉挽救了被盗的资金,而许多人认为这重蹈了 too big to fail 的覆辙,破坏了以太坊的去中心化精神,这些坚持 code is law 的人选择继续使用原链,形成了以太坊经典(Ethereum Classic)和以太坊(Ethereum)的彻底分裂。

虽然加密世界继续茁壮成长,但是除去洗钱、赌博、投机等无门槛金融衍生品外,仍然非常缺乏现实的应用场景和需求。Vitalik 也多次表达对 ETH 价格的担忧,认为加密货币创造的实际价值配不上其估值。区块链的未来究竟在哪,仍然是一个未知数。 #book

* 📒摘抄
Telegram Channel