Browsed by
Category: 学习

学海无涯

巴菲特致股东的信(2022年)

巴菲特致股东的信(2022年)

(请访问伯克希尔官方网站获取英文信原稿。)

致伯克希尔哈撒韦公司股东:

我的长期合作伙伴查理·芒格和我的工作就是管理大量个人的储蓄,我们非常感激他们长期以来的信任,这种信任关系通常会贯穿他们成年后的大部分时间。我在写这封信时首先想到的就是这些热心的储户。

一种普遍观点认为:人们应在年轻时存钱,以此维持退休后的生活水准;逝世后的遗产通常会留给家人、朋友或者慈善事业。

我们的经历有所不同。伯克希尔的个人股东们往往属于“一次储蓄、永远储蓄”,这些人生活得很好,最终会把大部分资金捐给慈善机构。这些资金被重新分配,用于改善大量与原捐助者毫无关系的人们的生活。这些结果有时非常惊人。

查理和我很高兴看到伯克希尔产生的大量资金用于支持公共需求,与此同时股东们也很少选择将资金用于炫富或者打造自家王朝。

谁不喜欢为这样的股东们工作呢?

我们的工作

查理和我将各位的储蓄分配到两种相关的所有权中。首先,我们投资我们拥有100%股权的企业。伯克希尔对这些子公司进行资本配置,并挑选出负责日常运营决策的CEO们。管理大型企业时,信任和规则都必不可少,伯克希尔对前者的强调很不寻常——有些人认为是极端不寻常。商业错误在所难免,尽管令人失望但我们也能理解,但是对个人的不端行为零容忍。

在第二类所有权中,我们购买公开市场上的股票,被动持有企业的一部分股权。我们持有这些股权,但是在企业管理上没有发言权。

我们持有这两种所有权的目标是一样的,对有长期良好的经济品质、又有值得信赖的经理人的企业进行有意义的投资。请特别注意,我们依据业务长期表现的预期来持有公开市场上的股票,并没有将它们视为精明买卖的工具。这点非常关键:查理和我不是挑选股票,我们是挑选企业。

这些年来我犯了很多错误。我们目前广泛挑选的企业包含少数真正具有非凡经济效益的企业、一些有不错经济品质的企业、以及一大群游走在边缘的企业。在此期间,还有一些我投资的企业已经倒闭了,它们的产品不受大众的欢迎。资本主义有两面性:一方面制造了越来越多的输家,另一方面也带来了大量改善的商品和服务。熊彼得[1]称这种现象为“创造性破坏”。

公开市场交易股票有一个优势,偶尔很容易以一个极好的价格买入一些优秀企业的部分股权。重要的是要明白,股票交易的价格往往非常愚蠢,即可能过高、也可能过低。“有效”市场仅存在于教科书中,现实中的股票和债券交易令人困惑,通常只有在反思回顾中才能理解这些行为。

控股企业完全不同。这些企业的价格往往高得离谱,但几乎从来没有被低估过。除非形势所迫,控股企业的所有者们根本不考虑以恐慌性价格出售企业。

************

迄今为止,我的成绩单中规中矩:管理伯克希尔的58年间,我的资本配置决策大部分都很平庸。另外,某些情况下,一些错误的决策靠大量的运气得以挽救。(还记得我们在美国航空和所罗门濒临灾难中逃生吗?我肯定记得。)

令人满意的业绩来自于十几个真正好的决策——大约每五年才有一个好决策——以及一个有时被遗忘的优势。这个优势有利于伯克希尔这样的长期投资者,让我们来揭示其中的秘密。

秘制酱料

1994年8月——是的,1994年——伯克希尔在7年间买入了4亿股可口可乐的股票,这也是我们现在的持股数。总成本为13亿美元——这对当时的伯克希尔而言是巨大的投入。

1994年我们从可口可乐获得的现金分红是7500万美元,2022年的股息增长到7.04亿美元。股息每年都在增长,就像生日一样确定无疑。查理和我唯一要做的事就是兑现可口可乐的季度股息支票,我们预计这些支票极有可能还会继续增长。

美国运通的情况大致相同。伯克希尔基本上在1995年完成对运通的买入,成本也恰巧是13亿美元。这项投资获得的年度股息从4100万美元增长到3.02亿美元,这些支票未来同样极有可能继续增长。

这些股息收入令人满意,远远谈不上惊人,但却推动了股价上涨。到年底,我们在可口可乐的投资价值250亿美元,而对运通的投资价值220亿美元。目前它们各自占伯克希尔净资产的5%,与很久以前的权重相当。

假设我在1990年代犯了一个类似规模的投资错误,比如30年期高等级债券,2022年仅仅持平保持了13亿美元的价值。这笔令人失望的投资现在将在伯克希尔净资产中只占微不足道的0.3%,每年只为我们带来8000万美元左右的股息收入。

给投资者的教训是:野草凋零,而鲜花会绽放。长期而言,只需要几个赢家就能创造奇迹。而且,是的,早点开始投资、并且活到90多岁也有很大帮助。

去年概要

伯克希尔2022年的业绩不错。公司运营收益——按照GAAP准则计算,不包括持股的投资损益——创下308亿美元的记录。查理和我聚焦于这个操作性数字,并敦促各位也这么做。如果没有我们的调整,GAAP数据每个交易日都会剧烈波动,请注意2022年的变动,这并不罕见:

如果从季节或者年度视角检视,GAAP收益毫无疑问具有误导性。可以肯定地是,数十年来资本利得对伯克希尔非常重要,并且我们预计未来数十年资本利得将显著增加,但是它们的季节波动——经常盲目地上媒体新闻头条——完全误导了投资者。

伯克希尔去年的第二个积极进展是收购了由乔·布兰登(Joe Brandon)领导的财产意外保险公司阿勒盖尼公司(Alleghany Corporation)。我过去曾与乔共事,他很了解伯克希尔和保险业。阿勒盖尼对我们而言有特殊的价值,伯克希尔无与伦比的财务实力可以确保保险子公司遵循有价值、持久的投资策略,而几乎所有的竞争对手都无法遵循同样的策略。

在阿勒盖尼的辅助下,2022年我们的保险浮存金从1470亿美元增长到1640亿美元。遵循严格的承保纪律,这些浮存金长期而言都是零成本。自1967年收购第一家财产意外险公司以来,通过收购、运营和创新,伯克希尔的浮存金增长了8000多倍。虽然无法在财报中确认,但浮存金已经是伯克希尔的卓越资产。A-2页记录了我们每年更新的浮存金,新股东可以阅读该页来理解浮存金的价值。

************

2022年伯克希尔、苹果和美国运通都回购了股票,这使我们每股内在价值获得了非常小的增长,这两家公司都是我们重要的投资对象。伯克希尔回购了1.2%的流通股,这直接增加了各位在这家独特的多元企业中的利益。苹果和运通的回购增加了伯克希尔的持股比例,我们不需要为此支付任何费用。

计算并不复杂:股份数量减少,各位在我们各家企业中的权益就会上升。如果回购价格匹配价值,那么任何一点点的回购都有帮助。同样可以肯定的是,如果回购支付了过高的价格,持续持有股票的股东就会蒙受损失,而收益会流向抛售股票的股东、以及态度友好、费用昂贵、推荐了这些愚蠢交易的投资银行家。

需要强调的是,匹配价值的回购带来的收益在各方面都有利于所有股东。如果各位愿意,请想象一家本地汽车经销商,该经销商有三位完全知情的股东,其中之一管理着这家公司。再进一步想象一下,其中一位想退出的股东希望将自己的股份权益卖给公司,给出的价格令其他两位股东都觉得很有吸引力。交易完成后,是否伤害了任何一位股东?经理在某种程度上是否比持续退出的股东们更受青睐?公众受伤害了吗?

如果有人告诉各位,回购总是损害股东或者国家的利益,或者总是对CEO们特别有利,对方要么是一位经济文盲,要么就是一位能言善辩的煽动家(这两种角色并不互斥)。

K-33 至 K-66 页列印了伯克希尔2022年运营情况的几乎无穷无尽的细节。查理和我、以及一些伯克希尔的股东们都喜欢研究这部分的许多事实和数据,然而这些并不是必读的页面。伯克希尔有许多百万富翁以及,是的,亿万富翁,他们从来没有研究过我们的财务数据。他们只需要知道查理和我——以及我们的家人和亲密的朋友们——继续在伯克希尔有非常重大的投资,并且他们相信我们会像对待自己的钱一样对待他们的钱。

这也正是我们做出的承诺。

************

最后,一个重要的警告:即使是我们所看好的运营收益数字,也很容易被经理们有意地操纵。CEO、公司董事以及他们的顾问经常认为这类篡改是老练的表现,记者和分析师对此也欣然接收。打破“预期”被认为是管理的胜利。

这种行为真让人恶心。篡改数据并不需要天赋,仅仅需要欺骗的强烈欲望。“大胆而富有想象力的会计”——某位CEO曾如此向我解释他的欺骗——已经成为资本主义的耻辱之一。

58年——以及一些数据

1965年伯克希尔还只是一匹只会一招鲜的小马,拥有一家历史悠久——但注定失败——新英格兰纺织企业。该企业正处于死亡螺旋中,伯克希尔需要立刻重新开始。回首往事,我很晚才认识到问题的严重性。

然后好运接踵而至:1967年我们获得了国民赔偿公司,将资源转向保险业和其他非纺织类业务。

我们通向2023年的旅程就这样开始了,这是一条坎坷的道路,融合了股东们持续的储蓄(也就是他们的留存收益)、复利的力量、我们避免犯重大错误、以及——最重要的——美国顺风。没有伯克希尔,美国也能发展得很好,反之则不然。

伯克希尔目前拥有无以伦比的庞大多元化业务。我们先来看看每天在纳斯达克、纽交所及相关市场交易的5000家上市企业。其中包括标普500指数的成分企业,这些企业都是知名大型美国精英企业。

这500家企业2021年的总收入为1.8万亿美元,我还没有2022年的最终结果,因此使用2021年的数据。其中只有128家(包括伯克希尔)收益超过30亿美元,事实上有23家赔钱了。

截止2022年底,伯克希尔是以下八家巨头的最大股东:美国运通、美国银行、雪佛龙、可口可乐、惠普、穆迪、西方石油以及派拉蒙全球。

除了这八家企业,伯克希尔还100%控股BNSF、以及持有BH能源 80%的股权,每家公司的收益都超过上文提及的30亿美元(BNSF 59亿美元,而BHE是43亿美元)。如果它们是上市公司,完全可以取代标普500中的两家成分公司。总体而言,我们十家控股、非控股巨头使伯克希尔相比其他美国企业更广泛地与国家的经济未来保持一致。(这个计算没有考虑养老基金和投资公司等“信托”业务。)此外,伯克希尔的保险业务由多家独立管理的子公司构成,其价值与BNSF或者BHE相当。

伯克希尔未来将继续持有大量现金、美国国债、以及各种各样的业务。我们还将避免导致在不方便的时候——包括金融恐慌和前所未有的保险损失——出现不舒服的现金需求的行为。我们的CEO们将永远都是首席风险官——将这项工作委派出去是不负责任的。此外,我们未来的CEO们将用自己的钱购买伯克希尔的股票,这在其净资产中占有相当大的比重。并且,是的,我们股东将继续留存收益来实现储蓄和繁荣。

伯克希尔永无止境。

关于联邦税收的一些令人惊讶的事实

在截止2021年的十年里,美国财政部的税收大约为32.3万亿美元,而支出为43.9万亿美元。

尽管经济学家、政治家、以及许多大众对这种巨大失衡的后果有自己的看法,查理和我对此一无所知,并且坚信短期的经济、市场预测比无用更无用。我们的工作是管理伯克希尔的运营和财务,长期而言我们的方式将取得可以接收的成果,同时也将在金融恐慌或者全球严重衰退时保持公司无与伦比的持久能力。伯克希尔也为通胀失控提供了一定程度的保护,但这一点还远远不够完美。巨额且根深蒂固的财政赤字有其后果。

这32万亿美元的收入是由财政部通过个人所得税(48%)、社会保障和相关收入(34.5%)、企业所得税(8.5%)和种类繁多的较轻税种获得。伯克希尔在这十年间贡献了320亿美元的企业所得税,几乎正好是财政部收入总额1%的十分之一。

这意味着——请做好准备——如果美国有1000家类似伯克希尔的纳税企业,那么其他企业或者1.31亿家庭无需向联邦政府缴纳任何税款。一分钱都不需要。

************

数百万、数十亿、数万亿——我们都知道这些词,但几乎无法理解其中涉及的金额。我们用物理纬度来表述这些数字:

  • 如果你把100万美元兑换成新印的100美元纸钞,这叠钞票可以一直叠到你的胸口;
  • 用10亿美元做同样的操作——这越来越令人兴奋了!——可以叠到3/4英里高的天空;
  • 最后,想象一下叠320亿美元(这也就是伯克希尔从2012年至2022年缴纳的联邦所得税总额),高度可以超过21英里,大约三倍于商用飞机通常的巡航高度。

当涉及联邦税收时,伯克希尔的股东们可以明确地说:“我在办公室已经缴纳过了”。

************

我们希望并期待伯克希尔未来十年缴纳更多的税款,我们对国家的亏欠不止于此:伯克希尔取得的任何成功都离不开美国的活力做出的巨大贡献——伯克希尔永远都需要这种贡献。我们依赖美国顺风,虽然有时它会停滞,但它的推动力总会回来。

我从事投资已经80年了——超过我国1/3的历史,尽管我们的公民有自我批评和自我怀疑的倾向(甚至可以说是热情),我坚信长期做空美国毫无意义。这封信的读者未来的体验同样也会如此。

没有什么比拥有一位伟大的合作伙伴更重要

查理和我的思考方式相当一致,但是他只要一句话就能总结我用一页纸解释的东西,而且他的版本往往具有更清晰的推理,也更巧妙地——有人可能会直截了当地补充说——直言不讳。

以下是他的一些想法,有些是来自最近的播客:

  • 世界上到处都是愚蠢的赌徒,他们不会做得像耐心的投资者那样好。
  • 如果看不清世界的本质,就像通过扭曲的镜头来判断事物。
  • 我只想知道我将死在哪里,这样我就永远不会去那里。还有一个相关的想法:尽早写下你想要的讣告——然后采取相应的行动。
  • 如果你不关心自己是否理性,你就不会为此努力,然后你将保持非理性,结果就会很糟糕。
  • 可以学会耐心。注意力时间长并且能够长期专注于一件事,这是一项巨大的优势。
  • 你可以向逝者学习。了解那些你倾佩或者厌恶的逝者。
  • 如果你能游到一个适合航海的船上,就不要乘坐正在下沉的船逃跑。
  • 一家伟大的公司在你离开后能维持运转,而平庸的公司做不到这点。
  • 沃伦和我不关注市场的泡沫,我们寻找好的长期投资,然后顽固地长期持有。
  • 本·格雷厄姆说过:“股市每一天都是投票机,长期而言它是一台称重机。”如果你不断创造更有价值的东西,那么总有一些聪明人注意到这点,然后开始买入。
  • 投资不可能有百分百的把握,因此使用杠杆非常危险。任何一串美妙的数字乘以0总是等于0。不要指望能富两次。
  • 然而,你不需要为了变富有而拥有很多东西。
  • 如果想成为伟大的投资者,就必须不断地学习。世界变了,你也要跟着改变。
  • 沃伦和我过去几十年都讨厌铁路股,但世界变了,美国最终拥有四条对美国经济至关重要的大型铁路。我们迟迟没有意识到这个变化,但迟到总比不到好。
  • 最后,我要加上查理的两个短句,这一直是他几十年来的决策因素:“沃伦,再想想。你很聪明,我是对的。”

就这样。每次和查理通话,都让我有所收获。而且当他让我想想时,也让我大笑。

************

我要在查理的清单上加上一条我自己的规则:找一个非常聪明的高级伙伴——最好年纪比你大一些——然后仔细听他说了什么。

奥马哈的家庭聚会

查理和我真是毫无羞耻。去年,在我们三年来的第一次股东大会上,我们一如既往地用商业喧嚣迎接大家。

开门铃一响,我们就径直奔向各位的钱包。在非常短的时间内,喜诗小摊就卖给各位11吨营养花生糖和巧克力。我们在P.T. 巴纳姆[2]式演讲中向各位保证喜诗糖果能延年益寿,毕竟,除此之外还有什么能解释查理和我活到了99岁和92岁?

我知道各位迫不及待地想知道去年喧嚣的具体细节。

周五从中午开门一直到下午5点,我们的糖果柜台总共完成了2690笔销售。周六从早上7点到下午4:30,喜诗又记录了3931笔交易。而在这9.5小时的时间里,有6.5小时由于电影和问答环节而限制了商业客流。

算算吧:喜诗在其黄金营业时间内每分钟有10笔销售(两天内的销售额高达400,309美元),这是在一个地点的销售,销售的产品也是101年以来没有实质性改变。亨利·福特T型车时代对喜诗管用的模式现在依然有效。

************

查理、我和整个伯克希尔公司都期待各位于5月5日、6日莅临奥马哈,我们会度过欢乐的时光,相信各位也会如此。

2023年2月25日                                               沃伦·E·巴菲特
董事会主席


[1] 约瑟夫·熊彼特(Joseph Alois Schumpeter):政治经济学家,“创新理论”鼻祖,与同时期的凯恩斯为一时瑜亮。

[2] P.T. Barnum:P.T. 巴纳姆,有史以来最著名、也是最有争议的表演者之一。他早年名声不好,后来通过诋毁、攻击对手来创造关注度,从而提高自己的声誉。

东京八平米

东京八平米

最近闹书荒,一般这种时候我会去网上找点时下比较热门的网络小说或者网文看看。然而听一档语音节目时,播主推荐了一本小书,来自“吉井忍”的《东京八平米》。

作者是一位在中国各地(包括成都、北京等)生活过多年、离异后返回东京生活的日本女士,用中文写作,业余时间去咖喱店打打临时工。吉井忍女士的生活比较飘忽不定、动荡不安,不能说苦难,但确实也有些苦闷,比如书标题就是她在东京居住多年、面积仅八平米的小房间。

这让我想起了刚到深圳时的生活。吉井忍女士是独居,而我是和人合租,自己的房间往往只能摆下一张沙发床和一个小书桌而已,所幸有共用的卫生间、洗衣机、厨房等生活必要设施。合租的生活也是动荡不安,过一段时期有人退租而我又找不到人合租时,就被迫退掉房子重新找租房。频繁地搬家总是常态,好在当时还是独身一人,东西也不多,找个小拖车就搬了,即便如此,我的心情也是苦闷不已。与作者相反,我不太喜欢变来变去,还是希望稳定、可预期的生活状态。

所以当我拿到书的时候,我猜测作者大概会描述生活中的一些琐事,然后恰到好处地装X一下,表现自己的云淡风轻,这在有关日本的游记、作品中比较常见,比如国内女作家蒋方舟的旅日笔记等。另外我在雪球曾经遇到过一位定居日本多年的女投资者,描述日本时基本也是浅草、银座、会员制专卖店、庭院樱花下的下午茶等……而吉井忍女士与这些都不一样。

我猜对了一半,《东京八平米》确实写的都是一些作者生活中的琐事、遇到的各种小人物等。不过作者并没有刻意表现出云淡风轻,只是娓娓道来这些事和这些人。如果论文笔,吉井忍女士多半不如蒋方舟女士,不过小书写得很平和,字里行间能体会到作者的无奈和认真生活的态度。

其中一位荞麦面店老板娘的故事让我有些感触。这位年迈的老板娘居然是位中国移民,年轻时仗义,借钱帮助另一位来自中国的小姑娘同事,结果被这位小姑娘骗了,只能默默还债;嫁的老公似乎又烂赌 ;生活有很多苦处,自己只靠开一个荞麦面店支撑,做出来的天妇罗其实很难吃(搞不好还有卫生问题)…… 总之就是有些略感离谱。大家来这家店似乎不在乎这些难吃的食品,在乎的是“店里日常的对话带来的欣慰,就像是一束阳光,鼓励你往前再多走几步”。老板娘自己也像一束阳光,鼓励了很多来这吃饭的人。在我看来作者确实也是比较倒霉,显然也被老板娘鼓励到,有时候生活过于沉重,哭诉出来能让自己有勇气、有毅力继续前行。

书中最后描写了她还在北京时最后一段时光,偷偷回去前夫家看她养的猫、看着窗外树上的鸟巢和垃圾袋,“这么简单的两处风景依旧还在,但以后我就看不到了”。作者没有明说,但我揣测彼时彼刻她内心有巨大的伤痛和悲哀。

八平米房间惊人的小,而作者在东京繁华之地依然能默默前行,依赖于东京齐全的配套设施,如钱汤(类似于澡堂)、洗衣房等。而我所居住的深圳也越来越繁华,只是过于追求表面的光鲜亮丽,小市民生存却越来越艰难,真希望深圳小市民们的苦处也能有一些抚慰的空间,再小都不是问题。

2022 读书列表

2022 读书列表

今年最大的读书成就是翻译了巴菲特写的信(从 1977 年直到 2021 年),以后继续翻译每年的信、同时重读一次以前的信。在投资方面看过一些书,也做过一些实验,感觉巴菲特这套是康庄大道,其他的方法多少都有一些玄幻。

以下是年度读书列表,基本都是一些杂书:

鲁迅文集(未看完,2023年接着看)
苏东坡传(未看完,2023年接着看)
大叔:我们终于可以聊聊走过的路
全职爸爸
失落的卫星:深入中亚大陆的旅程
午夜降临前抵达
人间杭州:我与一座城市的记忆
爱生活如爱啤酒
北野武的小酒馆
雪中悍刀行
美国众神
安德的游戏(三部曲:安德的游戏、死者代言人、安德的影子)
英语思维 — 解密英语语法的原理

巴菲特致股东的信(1977-2021,完成翻译)
周期
好投资与坏投资
解读中国经济 (未看完,2023年接着看)
沸腾新十年:移动互联网丛林中的勇敢穿越者
基业长青

parseInt

parseInt

云通信系统的用户偶尔向我们反馈,分机的状态显示总是离线状态。我们从后台检查状态是正确的,检查其他用户的分机状态也都很正常,但是这位用户查询的结果确实总是离线状态。这事颇有些蹊跷,引起了我很大的兴趣去研究发生了什么。

检查之后的结果也很简单。后台返回的状态数据是字符串形式,而前端 javascript 脚本是按照整数进行判断,自然无法正常显示状态。但是为什么有些又能正确显示呢?

进一步检查后发现这与 MySQL 数据库的版本有关。我们的云系统有很多服务器,都是采用 Debian 的系统,同时也是采用 Debian 默认自带的数据库。旧 Debian 系统中的 MySQL 数据库版本比较陈旧,返回查询结果时都是采用字符串格式,哪怕字段是整数类型,返回的结果也是转换成字符串。而新的 Debian 系统已经将默认的数据库替换成 MariaDB,返回结果时严格遵循字段的类型,不会进行这类转换。

用户的虚拟通信系统部署在不同的 Debian 节点上,返回查询结果时就存在上述转换方面的差异。

解决方式自然也不复杂。可以从服务器端解决,也可以从前端解决。服务器端升级 Debian 系统就会同时将数据库升级到 MariaDB,自然就能返回整数类型的结果。当然也可以从 PHP (包括 pdo层)解决,由 PHP 对查询结果强制进行转换,将字符串又转换成整数即可。但是出于稳定性方面的考虑,我们一般不太愿意直接升级服务器系统(包括 PHP 等中间层),各节点的升级总是按年制定计划,不太可能为了这样一个小问题兴师动众地升级系统。

因此最后的解决方案就是对前端 JavaScript 脚本做一点修改。JS 提供了 parseInt 函数进行转换(如果是浮点数就是 parseFloat),无论服务器返回的是字符串还是整数,经转换后都可以按照整数进行判断。

此事反映出(1)我们对web、数据库等方面的技术技能比较欠缺,缺乏足够理解;(2)测试范围不够广泛,没有涵盖所有的用户类型;(3)系统配置不够一致,存在新旧并存的现象。我个人觉得后续工作要着力解决第(3)点的情况,尽量做到(包括开发、测试、线上)只有一个版本、只有一种系统。

Windows 10 启动慢

Windows 10 启动慢

小孩用一台 ThinkPad 笔记本上网课,最近发现启动很慢,启动阶段往往耗时将近 3 分钟。这台笔记本是我以前开发工作的笔记本,已经升级了 SSD 硬盘、加装了 16G 内存,似乎不应该这么慢。

孩子反映以前也很快,只是最近才变慢,因此怀疑是某次 windows 升级后(当然也不排除小孩误操作)改动了设置。在网络上搜索了一下,检查启动配置后发现被设置为“正常启动”,修改为“有选择地启动”后,启动时间缩短到十几秒。

修改方式很简单,如下:(1)按键 Win+R 后,输入 msconfig,启动管理界面。(2)设置为“有选择的启动”。

配置“有选择的启动”
有选择的启动
奇怪的 SIP 呼叫流程

奇怪的 SIP 呼叫流程

最近几天帮助泰国的朋友检查一个呼叫业务流程,其中涉及很多细节和业务流程,不过让我觉得特别意外的是他使用的 VoIP 运营商的 SIP 呼叫流程。首次遇到这样的流程,请先参考下图的概要描述:

奇怪的 SIP 呼叫流程
奇怪的 SIP 呼叫流程

这个流程的奇怪之处在于:(1)VoIP 运营商发起呼叫时,INVITE 消息的媒体地址居然是“0.0.0.0”,这很明确告诉被叫:主叫只发送媒体流、甚至根本不处理媒体流;(2)被叫应答后,VoIP 运营商再次发起 reINVITE 流程,此时才真正指示出自己的真实媒体地址(当然也包括最终的媒体编码)。

通常的 SIP 呼叫流程在发起呼叫时就明确指示自己的真实媒体信息,因此在被叫应答后,没有必要再发起 reINVITE 流程。然而这家运营商为什么要放弃传统做法、采用这么奇怪的流程呢?

这家运营商是美国的一家运营商,而且规模很大,其设备供应商也是一家世界级的大软件公司(非常、非常大),因此这个流程肯定不是随意修改的结果,必定有其特殊的目的。仔细揣摩后,我认为它可能是为了节省媒体资源才这么做。

被叫方一般会振铃几秒、十几秒、甚至几十秒后,才可能应答。另外,呼叫量特别大时,统计上只有10%左右的呼叫最终才会应答。这家运营商采用这个流程,只需要在被叫真正应答之后才开始分配媒体资源,考虑到这是一家规模很大的运营商,这种流程确实可以节省很多的媒体资源。

VoIP 网络往往是主叫播放回铃音,因此这是个非常聪明、折中的呼叫流程,确实只有在被叫侧应答之后才处理真实媒体流。然而现实网络组网是非常复杂的,这个聪明到有些投机取巧的方法有固有的缺陷,请参考下图:

183 带媒体信息
被叫放音,183 消息携带 SDP。

被叫侧如果对接了传统的 PSTN 网络,例如 VoIP 网关,很有可能直接返回 183 消息并携带被叫的媒体信息。传统的 PSTN 网络往往是被叫侧播放回铃音,并且也有一些被叫侧放音的业务(例如“彩铃”),此时这家 VoIP 运营商就有问题了。

由于它告诉给被叫的地址是“0.0.0.0”,因此被叫振铃音(或者业务音)就无法传达到主叫侧。VoIP 运营商可以向被叫发送 UPDATE 消息来传递自己的真实媒体信息,但被叫未必会支持 UPDATE 消息,这个是扩展消息,不是所有的 SIP 设备都必须支持。而且 PSTN 网络往往会要求对 18x 消息用 PRACK 流程确认,因此即便支持 UPDATE 消息,这个特殊流程实际也急剧放大了被叫侧振铃阶段流程的复杂度。

这也就是我们的泰国朋友遇到的问题。

解决方式是在 VoIP 运营商与 PSTN 网络之间架设 miniSIPServer:

(1)miniSIPServer 与 VoIP 之间建立完全应答的呼叫通道;

(2)miniSIPServer 与 PSTN 之间维持正常的呼叫流程;

(3)miniSIPServer 判断被叫侧是否自己放回铃音(或者业务音),如果(a)被叫没有放音,则 miniSIPServer 主动给 VoIP 运营商放回铃音(或者呼叫等待音),而如果(b)被叫有放音,miniSIPServer 则直接建立两边的通道,让主叫直接听被叫的放音。

巴菲特致股东的信(2021,中英文版)

巴菲特致股东的信(2021,中英文版)

巴菲特最新的致股东的信,虽然是2022年写的信,但是内容是总结伯克希尔2021年的年度表现,在伯克希尔官网上也是标记为2021,因此本文的标题也跟随标记为2021年的信(以往是按发表时的年份来标记)。

同时,将巴菲特的信从1977-2021年归纳、汇编到一个文档中,有一些排版上的调整,方便阅读、检索、和学习。

单独翻译了2021年度的信,这两年的信越来越短了,大概很多重复的内容都移到年报中去了。另外一个原因可能是老人家年岁也大了,写信确实也耗时耗力。

最后说明:(1)欢迎转载;(2)转载时请标明来源;(3)未经许可,不得用于任何商业应用。

  • 2021年的信,英文原版;[下载]
  • 1977 – 2021年的信,英文汇编;[下载]
  • 2021年的信,中文版。[下载]
  • 如果您发现翻译问题,请 email 至:Z2lsc29ueWlAbXNuLmNvbQ== 非常感谢!
Debian (bookworm) + php8.1

Debian (bookworm) + php8.1

更新了一下软件库,发现 php 版本升级到 php8.1。不过糟糕的是,升级程序直接卸载了以前的 php7 版本,然后又没有安装 apache2 新的 php8.1 模块,导致 apache2 没有解析和运行 php 文件。

解决方式也简单,重使能模块即可。注意,该命令要用 sudo 权限运行。

sudo a2enmod php8.1

以前升级 Debian 似乎没有遇到这个问题,默认应该就安装新的模块版本,或者保留原有的版本。不知道是不是这个环境的 Debian 是 sid 版本的原因?

2021年读书列表

2021年读书列表

全年看书不多,尤其是最近业余时间都花在研究投资方面,其他杂书都是囫囵吞枣:

巴菲特之道
巴菲特的信(1977-2000)
段永平投资问答录
费雪论成长股获利

查理·芒格传
朱自清散文选
傅雷家书
冯唐:有本事
人类群星闪耀时
蔡澜旅行食记
银河帝国 – 基地七部曲
银河帝国 – 机器人五部曲

现代操作系统原理与实现

openEuler 的苦难体验

openEuler 的苦难体验

下午忙完工作、又临近周末,想着抽点时间体验一下 openEuler 系统,毕竟这是华为隆重推出、并且捐赠的系统,据说会成为国内各大系统的上游版本,有点类似 Debian 的意思。简单查了点资料,openEuler 大概是走 CentOS 或者 RHEL 的路子,着重在企业级系统的开发和部署上,听上去似乎很合我的胃口,我在 Debian 上也主要是开发企业用的软件(比如 miniSIPServer 软件 ^_^)。

从网上下载了 ISO 安装包,名字比较古怪,openEuler-20.03-LTS-SP2。从字面意思大概是 20.03 版本的第二个迭代版本,这个版本是长期支持版本。又顺手查了一下对应的生命周期,“长期”是指5年。这个5年是从20年03月开始算起,不是从SP2 发布开始算起。之所以觉得名字古怪,从网站的内容看,还以为需要下载三个版本,如下图。似乎应该先安装 20.03 LTS,然后安装 SP1,然后安装 SP2,但是看了一下安装包大小,没可能一个补丁那么大啊,这是学习 Windows 的命名方式? 事实证明,直接下载、安装 SP2 就可以了。

openEuler 下载页面
openEuler 下载页面

下载 iso 包中断了几次,显然是我的 300M 光纤宽带不够给力。转到阿里云的镜像站点下载,同样在中断几次之后,终于下载成功。

手头上没有实机,因此只能麻烦 openEuler 在 VirtualBox 中先凑合一下了。

第一次安装……失败。安装界面的按钮居然是在左上角!我一直按照以往的经验在右下角找“下一步”按钮,以为是 VirtualBox 的原因导致无法显示按钮。愤怒地升级 VirtualBox 后,重新安装,终于无意中找到了左上角的按钮……对不起,VirtualBox,错怪你了。

第二次安装……失败。安装倒是顺利完成,进入黑暗的命令行界面,然后……网络不通!难道要自己从命令行配置网卡、路由?我只是 Linux 用户,不是专家,书到用时方恨少。一定是哪出错了,以前安装别的发布版本(我的意思是 Debian 或者 Ubuntu),从来没出现这么奇怪的要求。上网查了安装指导文档(请点击此处),果然是自己没注意安装界面中开启网络。

第三次安装……失败。同样顺利地完成安装,进入无比黑暗的命令行界面,然后……网络还是不通!重新看文档,怪自己太粗心。原来安装时开启网络,只是在安装时有效,不等于安装后自动开启网络(真的,这个说起来有点挠头),需要在安装时,进入网络属性配置里,选定“自动以优先级连接”,然而这个项在界面里是英文 Connect automatically with priority(中英文混杂,很有港味、很 fashion!):

openEuler 网络配置
openEuler 网络配置项

第四次安装……失败。精心配置好网络,选中必要的选项,顺利进入依然黑暗的命令行界面,然后按照文档的指导(请点击此处)安装 XFCE,太棒了!重启后看到了久违的图形界面,然后登录……然后登录……然后登录……(很不幸,每次输入用户密码后,闪一下,又回到输密码的界面)

第五次安装……失败一半。淡定地配置好网络,进入暗黑无界的命令行界面,然后按照文档的指导(请点击此处)安装 DDE 界面。不愧是国产精品,非常顺利,这次可以登录,也可以使用各种软件了!只是有个小小的遗憾,系统没有自动调整界面大小,因此整个图形界面小小的。这个我懂,安装 VirtualBox 增强功能就可以了。将 VirtualBox 增强功能的虚拟光盘手工 mount 到目录后(Debian 以及后续尝试的 CentOS 都可以自动mount),运行编译,很快就……失败了!查了一下log,是调用 access_ok 函数时出错,从网络上检索的信息看,大概是 openEuler 合并了 5.x 内核的代码,但是自身内核版本号还是 4.x,企业级 Linux 玩得这么骚气吗? CentOS/RHEL 也这样? 要搞定这个问题,需要改源码……我只是想安装 openEuler 体验一下……

但是 DDE 确实值得一提!速度非常快,如果不是上述界面过小的原因,那就是 DDE 这两年进步确实很大。以前曾经体验过 Deepin 的版本,当时感觉界面还比较混乱、速度也不太让人满意,这次大有改观。唯一奇怪的是,我觉得“高效模式”比“时尚模式”更好看,这大概是我自己杀马特审美的错。

五次安装之后,窗外的天空已经黑得像个命令行界面,我沉痛地决定放弃了,下一个 LTS 版本出来后再体验吧。

2021-11-27 更新:

考虑到 openEuler 的令人迷惑的行为,是否是目前 RHEL/CentOS 系列的常态?下载了 CentOS stream 8(也是个令人迷惑的版本)安装,对比 openEuler 确实大部分都相同,当然也有小部分不一样:

(1)安装按钮都在左上角。看来这是新一代安装工具的标配了。

(2)网络配置默认都没有打开,都需要手工打开,而且要修改配置中的项才能在安装后自动启动网络。但 CentOS 的完成度明显更高,至少界面语言是统一的,没出现混杂的情况。

(3)CentOS 的软件设置更丰富,实际上丰富很多。安装完成后,可以直接进入图形界面。

CentOS 软件选择
CentOS 软件选择

(4)安装完成后都无法安装 VirtualBox 增强功能。CentOS 的 log 显示的是另一个与“map_vm_area”函数相关的错误。简单检索后得出相同的结论:也是 merge 了 5.x 内核的内容,但是内部版本号还是停留在 4.x。 企业级 Linux 玩得这么骚气,有点令人意外,这和掩耳盗铃有什么区别?

2021-11-27 再次更新:

由于 openEuler 和 CentOS Stream 都遇到了无法正常编译 VitualBox 增强工具的情况,都需要修改增强工具的源码才能编译成功,因此思考 VirtualBox 自己是不是会解决这个问题? 查了一下 changelog,在 VirtualBox 6.1.20 版本的发布日志中明确提到:

Linux Guest Additions: Fixed kernel module build for RHEL 8.4 beta and CentOS Stream

看起来的确是解决了问题,因此重新下载最新的 VirtualBox V6.1.30,果然成功了! 如下图示:

CentOS Stream 完全展开
CentOS Stream 完全展开

解决完CentOS Stream的问题后,猜测 openEuler 是否也可以一起解决了? 于是第六次安装 openEuler,然后……失败了。看来 VirtualBox 并没有解决 access_ok 函数的问题,估计 openEuler 相关人员也没有提交类似的问题给 VirtualBox ……