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

* 📒摘抄
读完 Eugene Rogan 写的《征服与革命中的阿拉伯人》(The Arabs: A History),此书从阿拉伯伊斯兰运动的兴起讲起,详细介绍了如今的阿拉伯国家的诞生历史。可以说整个阿拉伯的历史,就是一部不断被外来势力干涉和角逐的动态历史。奥斯曼帝国统一了整个阿拉伯的核心区,但是这个帝国比起阿拉伯,离欧洲的中心更近,阿拉伯地区只是奥斯曼下辖的遥远边区,时不时派遣军队来镇压一下壮大的地方势力。

第一次世界大战以后,奥斯曼帝国解体,广大的北非、阿拉伯地区沦为英法瓜分的殖民地,英法两国根据自己的利益,将这块广袤的土地切分为数个小国家,作为奖赏给在战争中支持他们的阿拉伯王子们。虽然这些国家名义上独立了,但是实际上仍然处于英法的控制之下。英法势力的中间,留下了一块作为缓冲的无主之地,也就是在日后留下无数动荡与冲突的巴勒斯坦地区。这种帝国主义式的干预,戳穿了威尔逊所谓的“民族自决”的谎言,粉碎了全世界处于压迫之中的人们对于西方世界的信任。

二战后,英国和法国国力遭受重创,逐步退出中东。中东作为地缘政治新前线,美国和苏联两大超级大国开始争夺这个地区的控制权。冷战时期,阿拉伯国家分裂为亲美和亲苏两大阵营。随着苏联解体,曾经投靠苏联的国家失去了庇荫,美国开始以反恐等名义,对这些国家展开围追堵截,包括阿富汗、伊拉克、叙利亚、伊朗等国。

不只是外部干涉,阿拉伯世界内部的信仰与制度冲突也日益严重。逊尼派与什叶派的冲突,世俗主义与宗教极端主义的冲突,民族主义与宗教主义的冲突,都是在外部势力的干预下愈演愈烈。曾经的极端原教旨主义瓦哈卜和伊本·沙特创建的沙特阿拉伯,因为石油贸易突然从一个贫穷的部落跃升为全世界最富裕的国家,沙特政府凭借雄厚的财力开始向全球输出原教旨主义,同样因石油而富裕起来的各个阿拉伯王子们也开始积极介入地方争端,培养自己的军阀势力。从此中东再无内战,有的只是无穷无尽的代言人战争,前有阿富汗圣战,后有叙利亚内战。约旦作为一个没有发现石油的阿拉伯国家,其政府就保持了理性,并且时常对原教旨主义的扩张和代理人军阀发表批评。

当我们作为看客,批判阿富汗人的困境时,不能肤浅地称之为“阿富汗人自己的选择”,在这个利益和武器全球化流通的时代,人民早就没有了选择的权力。 #book

* 📒摘抄
读完 Hanne Strager 的《达尔文传》(A Modest Genius),此书改名为“物种起源传”可能更贴切,详细介绍了达尔文构思和最终编写物种起源的前世今生。又了解到了很多有趣的历史小插曲。

达尔文出生于一个教士家庭,但是在游历太平洋的旅途中,因为阅读马尔萨斯的《人口论》和 Charles Lyell 的地质渐变学说,让他对物种的地质分布和渐变产生了兴趣和灵感,最终形成了“物竞天择”的理论。

但是达尔文并没有着急发表他的研究,而是将其束之高阁十年之久。直到出于历史的巧合,在婆罗洲进行调查工作的 Alfred Russel Wallace(华莱士)写信给达尔文,向他请教自己最近构思的“物竞天择”理论,他竟然取了个达尔文一模一样的名字“Nature Selection”。受到华莱士震撼的达尔文才开始紧急筹备发表自己的研究成果,最终在 1859 年出版了他称之为“论文摘要”的 500 页巨著。所以坊间流传的达尔文剽窃华莱士成果完全是无稽之谈,达尔文的研究比华莱士早二十年,而且达尔文和华莱士也互相尊重。话说回来,科学史上多人同时发现实际上也非常常见。

不过达尔文的研究只是针对“现象”而分析得来的相关关系,当时的人们完全不理解其内在的原因和规律。达尔文也因此受到了很多“聪明人”的猛烈攻击,这些人构思了各种千奇百怪的空想实验来试图论证达尔文理论的错误。

要等到 1900 年,人们重新发现 1865 年孟德尔发表的关于豌豆杂交试验的论文。以及 1950 年发现 DNA 后,人类才能最终理解达尔文理论的内在原理和规律。 #book

* 📒摘抄
在公园陪我儿子玩的时候翻完了结城浩的这本《图解密码学技术》,很通俗易读的实用手册,虽然都很浅显,但是对基本概念有比较全面的介绍。每一个程序员都应该读一读,至少要对密码学有基础的了解,不要等犯下不可挽回的错误后才后悔。 #book

和分布式算法一样,对密码学要时刻保持敬畏,要小心翼翼地遵守最佳实践,采用成熟的 SDK,绝对不要自己造轮子。

* 📒摘抄
https://blog.laisky.com/p/ddia/ 总算有空把这本“后端圣经” DDIA 完整地读完了,并且整理了摘抄。 #book
听完一位加拿大资深税务顾问 Carol Dai 的公开讲座,主题是关于海外资产申报的,记了一些笔记。

移民前拥有的资产不纳税,移民后产生的增值收益要纳税。所以对于新移民而言,最重要就是确认对资产进行计价的时机。在日后卖出时,纳税额是通过卖出价减去成本价来计算应税额的。

简单的代持和让亲属转手,再通过赠予的形式“洗钱”实际上并不可靠,因为 CRA 会要求你证明赠与人的资金来源,这样很容易发现这些资金的实控人实际上仍然是你。他人赠予你的资金最好是由他人长期持有的资金,实在要转手,也要确保两笔钱之前不能产生直接联系。比如你在将海外资产转给中间人后,中间人应该将另一笔自己长期持有的资金赠予你,而不要直接将你的钱直接转回给你。

新移民刚登陆的 3-5 年内一般不会被查税,因为资金情况都比较复杂。但是长期居住后如果仍然存在异常的报税和消费情况,就容易被查。税务局会使用大数据分析你所居住的社区的平均收入水平来找出可疑人员。查税时会使用具有相似文化背景的调查员,擅长利用各种社交工具(比如企查查)。查税也需要成本,所以 CRA 也会评估查税可能带来的收益,找大鱼下手。

每个人可以有一套自住房(principal residence),不需要交税。这是一个双刃剑,优点是卖出时收益不交税,缺点是如果亏本了也不能抵税,对于有多套物业的人,要权衡清楚。

家庭申报资产时,可以提交夫妻双方的收入归属占比,一般来说越均衡纳税越低,比例提交后不能修改。

注:仅供参考,非税务建议,请咨询专业人士。
Telegram Channel