2025-02-24 08:00:00
我是在 2023 年 9 月 28 号去到的阿塞拜疆,而刚刚在一周多前的 9 月 19 日,阿塞拜疆刚刚针对被亲亚美尼亚势力实际控制的纳卡地区展开了所谓的“反恐行动”,控制了纳戈尔诺-卡拉巴赫(简称纳卡)地区。我在阿塞拜疆的旅程也被笼罩在阿塞拜疆与亚美尼亚的领土争端气氛中展开。 纳卡问题 如果你看到纳卡地区的地图,你便知道为什么阿塞拜疆一定要拿下这片土地: 纳卡地区就是一块国中国飞地,虽主权也并不归属亚美尼亚,但是其土地上生活的大部分人都是亚美尼亚人。但倘若你再完整看一看阿塞拜疆的地图,可能又会有另一个疑问,这个纳希切万又是哪里来的,为什么也横插进了亚美尼亚的国土里? 纳希切万恰好就是纳卡地区的反面,虽然身处亚美尼亚腹地但生活的大部分却是阿塞拜疆人,名义上也是连亚美尼亚都承认的阿塞拜疆正统领土。这么一看,亚美尼亚反向申索对纳卡地区的控制似乎又显得没有那么强词夺理了。 纳卡问题历史上发生过大大小小多次战争,总体来说,俄罗斯支持的是亚美尼亚,土耳其支持的是阿塞拜疆,两边都在打着代理人战争,长期以来,阿塞拜疆实际上是被亚美尼亚压着打,属于下风,毕竟整个高加索地区无论从历史还是现实来说都还是俄罗斯人控制的地盘。然而之所以在 2023 年一举被阿塞拜疆拿下纳卡地区,一方面是由于俄罗斯自己都在乌克兰战场自顾不暇,另一方面也是因为此时的亚美尼亚帕希尼扬政府也在寻求渐渐脱离俄罗斯的控制,转向美国甚至寻求加入欧盟,导致俄罗斯对亚美尼亚的态度也发生了逆转。 事实上,以今天发生的现实来说,亚美尼亚这个国家的整体利益已经不能再一直为了另一个国家土地上的亚美尼亚裔人而一直被绑架,为了自身利益不得不放弃了对这块土地的实际控制和支援,然而纳卡飞地上的居民并不这么想,依然坚定认为自己就不属于阿塞拜疆,至少也应该维持自治地位,从而爆发了冲突,但是又孤立无援,进而被阿塞拜疆完全掌控。 艺术品中的领土痕迹 前面讲到了阿塞拜疆复杂的领土问题,所以自然阿塞拜疆人在这件事情上也非常敏感。在阿利耶夫文化中心,最让我印象深刻的是一系列用阿塞拜疆的传统工艺——毛毯和纺织——来表达阿塞拜疆完整国土的作品。 露天的战争博物馆 前面讲到在大部分历史时间里,阿塞拜疆一直是被亚美尼亚压着打,所以长期以来积累了无数的窝火,直到最近几年才胜仗频出,特别是一周多前彻底解决了纳卡问题,所以自然要向民众大肆宣扬战果。但我从来没有见过一个国家会对战争的宣扬像阿塞拜疆这么露骨,直接在市区腾出一大片空地,把真实的战场摆进市区,而且摆的还是亚美尼亚的军营,所有装备素材全部都是从亚美尼亚那里得到的战利品,从床铺,宣传海报到实实在在的坦克军车和飞机,直接 1:1 还原,甚至还建了大量战壕和铁丝网带。从博物馆角度来说,这是我去过的最真实的博物馆。从人性角度来说,看着那些小孩笑嘻嘻地在坦克上爬来爬去,心里很不是滋味。 战利品的意思是,这里每一个军事装备背后至少有一条人命的丧生。 从照片的背景也能看出,这是一个接近市中心的地方,背后是静静地里海。我很难用复仇来形容这种公开的展示,因为大部分前来的阿塞拜疆人都是微笑的,甚至都没有很严肃对待,可能这是我永远无法理解的情感。 流油的巴库 阿塞拜疆首都巴库地区是世界上最早开采石油的地方,巴库油田有一个特点是分布分散,这导致这个国家到处都字面意义地在流着石油,也到处可以看到一些小到像是农具的石油钻井,还有一些地方存在着所谓的永恒之火。 自由的巴库 作为一个伊斯兰国家,巴库的自由程度是我在其他国家所没见过的,甚至是以世俗化著称的土耳其我觉得与之相比都有所逊色。不仅饮食上无所禁忌,甚至在博物馆里,到处都陈列着前卫露骨的艺术作品,在部分街区,有一种来到了巴黎的感觉。而在另一些角落,还能看到一些前苏联审美,更是让这里显得文化更为多元和包容。 离开阿塞拜疆 事实上,之所以把阿塞拜疆作为高加索三国的第一站,也是因为阿塞拜疆的特殊政治。因为阿塞拜疆对亚美尼亚有着极为强烈的仇恨,导致如果是先去了亚美尼亚,会极难入境阿塞拜疆,而亚美尼亚对阿塞拜疆的旅游经历倒不特别关心。但是这两国之间本身并不开放通行,所以为了去亚美尼亚,还得先到格鲁吉亚中转。 即便你生性不关心政治,但是在高加索,政治才是这里最大的景观。
2025-02-01 08:00:00
2024 年,是我大规模重构投资组合的一年,主要还是由于在新加坡的身份转变后,具备了投资新加坡房产的资格,从而让投资结构从简单的股债配比转向了更多元复杂并且加入了房贷这一杠杆的组合。 我的投资组合计算 我在思考投资组合的时候并非像部分人一样,只是把资产的一部分活钱作为投资资产然后仅计算这部分资产的涨跌。这种方式虽然计算上更加简单,但是实际上会出现股票账户翻倍,个人总资产却没啥波动的情况。所以我会把所有资产甚至是公司期权和公积金都算入投资组合中。 我不会记录每笔交易,因为不只是投资,生活中处处存在着交易,记账不完整等于没有记账。但是我会大约每个季度花一个小时左右的时间,基于那个时间点的最终资产份额以及价格,构建一个 Snapshot ,这样我可以建立起一个「资产状态」的时间序列: 基于这些表之间的 Diff,我能够清楚知道任意两个时间段间,我做了哪些有实质性大变化的操作,一些小操作比如个股的小规模买入卖出则会反应在最终资金的盈亏上但是剔除交易本身的细节。 2024 的重大操作 更换券商 由于众所周知的原因和对未来不确定风险的防御,我在 2 月从富途彻底转到了 IBKR , 转仓方式是现在富途先全部卖出所有股票然后买入 JEPI , 然后通过 JEPI 这一更稳定的 SPY 载体, 转仓到 IBKR。 原本的预期是这样做,可以在 SPY 不暴涨的情况下,最小化中间时间的收益损失。且不用付高额的银行电汇手续费。不过转仓时,SPY 有了一些下跌,所以马后炮看,远不如当时直接换成现金,再在 IBKR 买入。不过好在最终损失也不大。 大规模买入美债后再卖出 2024 年中的时候,10 年期美债利率已经来到了 4.9% , 在上半年我一直在构建我的债券阶梯,具体方法是定投买入从 1 年期到 15 年期的美债,每个期限的美债份额固定。这样做就几个好处: 我每半年都会有一大笔美债利息到账,可以继续拿来投资。 如果我都采取持有到期的策略,我在未来 15 年每年都会有一笔美债到期,我可以根据当时的利率以及市场,决定是否继续买入新的 15 年美债,抑或是直接投资到股票市场。 如果人生出现了变化,需要用到大笔资金,由于我是在利率非常高的时候买入的美债,且平均期限才 7.5 年,我亏本卖出债券的概率非常低,可以直接把这部分美债作为活钱来用。 最后的事实也证明了这个策略非常明智,我最终走到了第三步方案,在 8 月因为要准备购房资金清仓了刚建完的美债阶梯。巧合与惊喜的是,在 2024 年 9 月的时候,美债利率还不降反升了,而我的美债都是在 9 月之前卖出的,所以还躲过了一波下跌。最终以盈利几千美元结束了这笔因为生活改变引发的混乱操作。 精简持仓,专注两大指数 过去我虽然相信指数是穷人的最强武器,但是依然忍不住发挥自己的主观能动性在这个信念之上做一些微操。比如买入 JEPI。 JEPI 是在 SPY 基础上执行 Covered Call 策略的类指数基金。它的好处是,在指数震荡或者下跌或者微涨的时候依然能盈利,暴涨的时候会损失超过正常范围的涨幅。所以它可以被理解是一个更为稳健的 SPY 指数。但是 2024 年是美股疯涨的一年,所以这个策略就不生效了。
2024-12-10 08:00:00
重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。 前言 过去一段时间,在大量的线上服务 case study 过程中,逐步深入了解了如今的业务 Go 进程是如何在一系列繁杂的基础设施之上运行的。有些表现在意料之中,也有一些出乎意料的发现。 我很喜欢一个叫做「 机械同理心/Mechanical Sympathy 」的概念,大体的意思是你必须深刻了解你的程序/机械装置是在一种怎么样的环境下运行的,设身处地地在这个运行环境下去思考,才能帮助你写出更好的程序,或是解答一些奇怪现象的原因。 本文希望达到的目的,也是构建这份「机械同理心」。 程序能使用多少计算资源? 对于很多人来说,这个问题似乎非常简单,大多的计算平台都会要求你建立服务的时候就指定好「需要的计算资源」,但这与你的「能使用的计算资源」是两件事情。实际上这个问题的复杂性远远超出大部分人现象,甚至都不是一个常量,也无法使用公式简单计算。抽象地讲,这取决于天时地利人和。 「天时」指的是内核 Cgroups 以及容器调度平台的基本原理和参数设置。这是硬指标,大部分时候也是常量。 「地利」指的是部署的实际物理机的繁忙程度。 「人和」指的是写程序的人得在能够有更多计算资源可用的时候真的让自己程序用上这些计算资源。 接下来我们逐步分节来详细探究这个问题。 被封装的 CPU 谎言 在 Oncall 中常见的一个误解是,研发人员在容器平台上申请了 4 核 CPU 的容器,然后自然而然认为自己的程序最多只能使用 4 个 CPU,于是按照这个计算能力去估算需要的容器数量,以及对自己程序套上这个假设进行参数调优。 上线后,进到容器用 top 一看,各项指标确实是按照 4 核的标准在进行。甚至用 cat /proc/cpuinfo 一看,不多不少刚好看到有 4 个 CPU。。。 但实际上,这一切都只是容器平台为你封装出来的一个美好的假象。之所以要把这个假象做的这么逼真,只是为了让你摆脱编程时的心智负担,顺便再让那些传统的 Linux 观测工具在容器环境中也能正常运行。 但是假象终究不是真相,如果有一天你遇到一些疑难问题或是想要去编写极致性能的代码,你会发现这些封装出来的抽象把你的理解带的有多偏。 我到底能同时使用多少个 CPU ? 在 K8s 的环境里,CPU 是一个时间单位而非数量。正常情况下,一个拥有 64 核心的机器,你最多能同时使用的理论 CPU 个数是 64 ,即便你创建容器的时候申请的是 4 核。
2024-10-18 08:00:00
TMB - Tour du Mont Blanc 很多年前就听说勃朗峰周边有一条多日徒步线路,从霞慕尼出发,环绕勃朗峰徒步一整圈最后回到霞慕尼。但是由于很难请到这么长时间的假期,所以一直没能如愿。甚至四年前的时候还去到过霞慕尼,但是那时候只是把它作为一个景点,简单去了下南针峰从山顶观看勃朗峰。那时甚至都霞慕尼这个地方大头来头,也没来得及在当地住一晚细细品味它的户外氛围。 今年十月,终于得愿完成了这条此生必去的徒步线路。出于安全和方便的考虑,我在网上订了一个包含了住宿餐食和山地向导的国人徒步团,基本把除了走路之外的麻烦事都帮我解决了,每天就是到点徒步,到站睡觉。唯一的遗憾是,这次走的是所谓的精华路线而非完整路线,大概只覆盖了完整线路的一半左右。希望未来有一天可以以个人的形式重新完整走一次这条线路。 行前准备 身体准备 在 2024 年前半年的时间里,颈椎病让我的身体状态特别糟糕,别说徒步,感觉长时间的伏案工作都已经很成问题。所以我上半年的大部分业余时间都花在了锻炼身体和用各种手段治疗颈椎病上。这也让我的身体素质得以迅速提升,刚好在九月已经恢复到几年前的水平。 由于长期居住在新加坡,所以很难找到一些较大强度的多日运动能够来测试我的身体状态,这次,我也是拿 TMB 来为我半年的身体训练做一次压力测试。说实话,在去之前,我是做好了不行就撤退的准备。所幸的是,我不仅没有撤退,甚至走的还算是在队伍的前列,这可能是整趟旅程最让我高兴的事情。 装备准备 十月 TMB 的气温大概在 5 度到 20 度左右,我最后真正用到的装备有: 防护层 1 件 Patagonia Boulder Fork Rain Jacket 1 条 Outdoor Research Ferrosi Convertible Pants 1 条 KAILAS 徒步裤 中间层 1 件 Patagonia Down Sweater 1 件 Patagonia R1 贴身层 1 件 Decathlon 美丽奴羊毛 T 恤 1 件 Smartwool 美利奴羊毛衣 1 条 Icebreaker 美利奴羊毛裤 2 双 Smartwool Full Cushion 美利奴羊毛袜 4 条 Smartwool 美利奴羊毛内裤 徒步装备 Hanchor MARL X 轻量化背包 Salomon X Ultra 4 Mid GTX 徒步鞋 Black Diamond Distance Carbon Z 登山杖 其中,Patagonia 的 Boulder Fork Rain Jacket 配合 Hanchor MARL X 防雨背包,绝对是提升我整段徒步旅程体验最大的装备。在风雨雪交加的情况下,我没有一次用到雨衣和背包防雨罩。在降水量最大的一天,也只是导致了我中间层羽绒个别地方略微湿润,背包里非常潮湿,但是都没有明显进水的迹象。考虑到我非常讨厌行动受限的感觉,这两款装备的互相配合基本能让我在中等程度降雨量的情况下,都维持自由行走的状态。
2024-04-07 08:00:00
特摩索斯(Termessos)位于土耳其南部城市安塔利亚的北面大约 30 公里,是一座起源神秘,消亡也神秘的深山古城。它第一次被历史提到是在公元前 333 年亚历山大大帝包围这座城市时,但即便是征服了希腊世界的亚历山大大帝也并未能成功征服特摩索斯。 特摩索斯建于海拔 1000 多米的山口位置,由于特殊的地理位置,加上完善的水利设施,所以即便被包围也只需要一小只军队便可守卫,这帮助这座城市在那个群雄逐鹿的希腊化时期和罗马帝国时期得以一直以独立城邦的状态存活下来。一直到公元 5 世纪的一场地震摧毁了这座城市的蓄水库,导致居民不得已陆续搬迁,最终荒废并被人们所遗忘。一直到 19 世纪,欧洲的探险家才重新发现了这座城市,但即便到今天,特摩索斯一直是一个非常冷门的旅行目的地。 我知道特摩索斯,是机缘巧合在 YouTube 搜索安塔利亚的视频时,偶然间看到了一个特摩索斯徒步视频,即便画质极其粗糙,依然还是被这座山顶古城给震撼到了。更因此将安塔利亚作为了土耳其旅行的其中一站。 到达安塔利亚,我们在 Airbnb 上约了一个本地向导 Onder 带我们开车到达北部的居呂克山-特摩索斯国家公园,从国家公园徒步前往特摩索斯所在的山顶。Onder 的本职工作是老师,但十分热爱特摩索斯甚至他的硕士论文写的课题便是特摩索斯,所以业余时间也通过做特摩索斯的向导赚点外快。 虽然特摩索斯的城市部分主要集中在半山腰和山顶,但是山底相当于这座城市的郊区,和现代城市的郊区一样,往往是平民的生活聚居地。 首先看到的是城市的宗教区域,哈德良庙,但如今只剩下了一扇门孤零零地在山脚下伫立,既神圣又凄凉: 在哈德良庙的另一边,是居民的墓地区。特摩索斯的墓十分有特色,都是以露天石棺的形式“展览”在地表之上。石棺的雕刻也别有一番讲究。 普通平民的石棺是以两个太阳加中间方块的形式,太阳是特摩索斯的标志,这里也被称之为太阳城: 而士兵的石棺会在太阳上增加武器的标识,寓意太阳的捍卫者: 无论是平民还是士兵的石棺都略显单调和同质,特别是人死后,棺材还会被摆在地表被长久展示,这导致石棺本身变成了一个人生命价值的化身。如果没有钱请不起好的雕刻工匠,就靠战斗获得荣誉来装点自己的石棺。如果有钱,就极尽工匠精湛的工艺让自己的石棺变成华丽的艺术品: 又或者是更为有权势的领袖,可以直接在岩壁开凿更为壮阔的仰望式墓藏: 考虑到两千年后,我们还依然在为他们的石棺赞叹,当初他们的「虚荣」如今也被岁月洗涤成了「实荣」。 沿着山路,陆陆续续会走过众多城墙和古罗马式引水渠,以及如今已不知为何物的废墟: 在半山腰,还能看到一个保存地非常好的体育馆遗址: 以及曾经的祭坛: 接着便来到了特摩索斯城市最最核心的基础设施 —— 蓄水库: 由于地震已经毁坏了蓄水库很大一部分,所以今天的蓄水库为了维持稳定,能够看到有很多人工固定的痕迹,但是能够两千年前在一个山顶开凿一个如此巨大的地下空间还是非常令人震撼的。 大约花了一小时的路程,便可抵达特摩索斯的山顶,在一个转身间,看到了我在土耳其见过的最震撼的一幕: 特摩索斯在人类历史上,只是一个非常短暂,也没有名气,更没有对任何历史节点产生重要影响的小城市。特摩索斯的统治者也并非历史上赫赫有名的王侯将相,甚至这座城市更像是纯粹的自治军事城邦而非君主制的王国。但是如此小的城市居然会为了其居民建立如此恢弘的一个剧场。更何况这里不靠近雅典也不靠近罗马,地处希腊世界的边陲。 站在特摩索斯的山顶上,我眼望着希腊文明的「边际产物」,如同看到了一个外星文明一般陌生。从山脚下看到的自我价值实现和山顶上对自然与人类文明极致的审美表达。特摩索斯的居民在群雄逐鹿中维持了独立,依靠工程学知识建立起了少见的防卫居住一体的水利设施,甚至还在这种山城里建立起了不输其他同等规模但地处丰饶平地的希腊城邦的剧院。 我在之后的土耳其境内的希腊化古城邦旅途中,也遇到了更多比特摩索斯大得多,恢弘得多的城邦,但是特摩索斯一直是最特别的那个,也是我记忆最深的一个。以特摩索斯作为我在古希腊-罗马世界的游历起点,很难想到比这更好的开始了。
2024-03-31 08:00:00
重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。 Go 语言是一门为实现 CSP 并发模型而设计的语言,这也是它区别于其他语言最大的特色。而为了实现这一点,Go 在语法上就内置了 chan 的数据结构来作为不同协程间通信的载体。 Go 的 channel 提供 input 和 output 两种操作语法。input 一个已经 full 的 channel ,或是 output 一个 empty 的 channel 都会引发整个协程的阻塞。这个协程阻塞性能代价很低,也是协程让渡执行权的主要方法。 ch := make(chan int, 1024) // input ch <- 1 // output <-ch 然而 channel 的实现恰好和进程内消息队列的大部分需求是吻合的,所以这个结构时常被用来作为生产者消费者模型的实现,甚至还作为 channel 的主流应用场景而推广。 但事实上,如果真的把该数据结构用来作为系统内核心链路的生产消费者模型底层实现,一不留神就会遇到雪崩级别的问题,且这些问题都不是简单的代码修改便能解决的。 Input 失败导致阻塞 当 channel 满的时候,<- 操作会导致整个 goroutine 阻塞。显然这并不总是编程者希望的,所以 Go 提供了 select case 的方法来判断 <- 是否成功: select { case ch <- 1: default: // input failed } 但问题是,当 channel input 失败时,编程者还能怎么做?除非队列的消息是可以被丢弃的,否则我们可能只再去创建一个类似 queue 的结构,将这部分消息缓存下来。但是这个 queue 的结构可能又要和这个 ch 本身的队列顺序处理好并发关系。