阅读视图

发现新文章,点击刷新页面。
🔲 ☆

小山辩论

现在是2026年3月28日早上11:54,我坐在小山高中图书馆。如果讲英语,这里其实叫做El Cerrito High School,不过El Cerrito本来也不是英文,而是西班牙语“小山”的意思,指的是附近的一座小山,Albany Hill(奥尔巴尼山)。有趣的是,“小山”小镇以那座山得名,不过那座小山并不在“小山”小镇的管辖范围内:就像堪萨斯城不在堪萨斯州的管辖范围内一样1

小山及附近地区

小山高中正是上次说到的,我去年第一次做辩论裁判的地方。这次来,显然主办方已经把我当熟练工使用了,第一轮就来了两个背靠背比赛:Round 1,分为flight 1和flight 2,学生只需要参加其中一个flight,不过我需要在同一间教室里连续裁判两场。

第一轮的主题是Global development(全球发展),flight 1的题目是:This House, as a developing country, would actively discourage the formation of primate cities. (发展中国家应该限制大中心城市的形成,例如首尔曼谷雅加达)。

正方一辩:提出“我们应当按照net benefit来决定胜负”。论点一:避免农村地区衰落;论点二:大城市过度拥挤,形成贫民窟;论点三:环境影响,例如热谷效应,例如雅加达的内涝以及城市下沉2

反方一辩:“我们同意net benefit定胜负”。先反驳:乡村地区没机会没工作没资源交通不便,人搬去大城市,即使只有一个人脱贫,也好过困在乡村零个人脱贫。再立论:集中关注一座大城市好过分散发展十个一般城市;经济会发展,世界80% GDP是城市产生;政府的合法性以及周边影响力。

正方二辩先反驳:乡村地区不是每个人都贫穷没机会,城市过度竞争造成贫民窟问题;发展本地工业,而不是集中所有资源在大城市;大城市之外“没资源”不实,关键是合理规划利用资源;污染是真实的健康威胁。另外,对手说了农村地区交通不便,这反而证明了我们的观点:交通建设很重要,这样可以带动全国经济的发展。

反方二辩:首先反驳正方的例子不相关,之后以首尔举例:一座中心城市把全国从发展中国家提升到发达国家,大工业(例如三星LG)好过一堆没听过的本土小工业;贫困问题和大城市不紧密相关,并且有贫困人口的大城市(例如雅加达)好过没有大城市而人口照样贫困的国家例如尼日利亚3;城市洪水什么的也不会把经济成果降为零。

之后反方一辩和正方一辩分别总结。

第一轮Flight 2的题目是This House, as a developing democracy, would adopt South Africa’s model of capital cities. (我们这个发展中的民主国家应该学习南非的三首都模式)

正方一辩:首先简单介绍了南非的三首都设置,声明我们应当按照“对民主的好处”来决胜。论点一:多元化投资和发展;论点二:照顾每个族裔每个人而不是白人至上;论点三:天然预防政变。

反方一辩:我们应当按net benefit来决胜。一个首都加上若干经济中心更好,例如美国;多首都造成国家碎片化,彼此难以沟通,行政效率低下;三首都模式可能反倒让政变更容易4

正方二辩:我们的题目讲的是“发展中的民主国家”,美国不是;典型的国家是非洲国家,历史上都深受殖民和白人至上主义的祸害,种族隔离也是普遍问题,但是想象南非如果只有一个首都,那么一定是白人为主的开普敦,而黑人主体和南亚人主体的地区就不会被重视;又如约翰内斯堡,虽然不是三个首都之一,但是有一个政府大楼,也造就了他们的成功;至于沟通和效率,现在有互联网啊。

反方二辩:要说讲民主,我们讲的是三权分立,而未必是三个首都;我们还是应该按net benefit比,如果按“为民主好”来比,那么“死三百万人为了民主好”莫非是好的选项吗5?约翰内斯堡是经济成功,又不是首都;三首都零和游戏;这个方案反而造成了种族隔离,其实和你们嘴上说反对的种族主义是一回事。另外为什么会有政变?那是因为对现状不满,我们应当提高net benefit才能避免政变,否则三首都模式反而让政变更容易。

之后反方一辩和正方一辩分别总结。双方各自用了一次POO(指出对方使用新证据),不过都被合规地应对过去(指出自己或队友在哪一轮用过)。

现在是下午1:37分,我在第三轮的教室里等待辩手的到来。

  1. 严格说来这个例子并不完美,因为有堪萨斯州也有个堪萨斯城,和密苏里州的堪萨斯城连为一体。 

  2. 最近我也从公共广播上听到雅加达因为地下水超采造成地面下陷的情况,说明正方的资料收集很到位。 

  3. 但这个例子举的不好,尼日利亚确有大中心城市拉各斯。另外这个辩手说“对方关于菲律宾的例子”明显把雅加达搬家到菲律宾去了,正方压根没说过马尼拉。 

  4. 这个其实很牵强,反方一辩可能没有想好怎么应对,只用了他的最后十几秒短暂应对。 

  5. 这是尝试来道德绑架裁判咯? 

🔲 ☆

辩裁无须七年期

现在时间是2026年1月10日下午2:14,我坐在某高中的食堂。今天这座高中举办一场辩论邀请赛,食堂被临时开辟为裁判等候区,我在等候下一张ballot(选票)出现在我的邮箱里。之前的几个小时里,我的孩子比赛了两轮,我也做了两轮裁判。我简单写写我在美国学校做辩论裁判的经历,我希望更多的华人家长来做辩论裁判,这对我们的孩子在辩论这个圈子的未来,在我看来,会有帮助。

一年前差不多的时候,同样的高中也举办了同样的辩论邀请赛,我的孩子也参加了。不过,当时的我完全不想来做辩论赛的裁判:首先我自己就不擅长辩论,包括母语,何况英语?其次,我也不懂孩子们这些辩论赛的规矩和门道。这边的辩论赛形式还挺多样,不一一列举了,不过对于初中的辩论初学者来说,他们就专做一种叫做“Parli”的辩论形式。这种形式是模仿英国的议会辩论,“Parli”这个词也是英国议会(British Parliament)这个词的简写。每个参赛队伍由两人组成,按学校组织。每一轮辩论会提前宣布辩题,每个辩题相当于一个“政府提案”,例如“美国应当加强在北极的军事存在”,正方的职责是说服裁判:议会应当通过这个提案;而反方的职责是让裁判相信“政府提案应当被否决”。正反双方有二十分钟准备时间,比赛开始后依次发言:正方一辩7分钟立论,反方一辩8分钟反驳和立论,正反方二辩各自8分钟发言扩展,之后反方一辩4分钟总结,最后正方一辩5分钟总结。结束后大家散伙,裁判在系统内提交“ballot”——相当于议员投票,不过这个议会只有一个议员。

差不多那个时间,我家的家庭议会也有了一个提案,“Leonson应当去做Parli比赛的裁判”,在辩论回合中,正方使用了关键性的证据:我家小孩有一次参加辩论,裁判居然是对方一名辩手的家长1,辩论的结果,虽然我们娃觉得自己表现更好,但是裁判仍然判对手获胜,给的理由据说也不让人信服。反方在辩论中也重复了“不擅长”“不懂”这些论点,但是重复的论调在辩论中不是什么好的战术,无法说服议会。最终,正方获胜。

三月份,根据家庭议会决定,我第一次去东湾一所高中做了一整天的裁判。下半年,第二次;之后,又有第三次。今天这是第四次了。早上刚到裁判休息区安顿下来,椅子还没有坐热,系统就提示我的ballot来了——我需要马上点一个按钮“我收到了ballot”,然后到相应的教室去。在那间教室安顿下来后我发现,我之前裁决的都是novice轮(新手村),这一轮是varsity(高手组),不能不说我还有点紧张,就像去年三月第一次裁决新手村比赛一样紧张。不过,这一轮过去,紧接着下一轮varsity我又裁决一轮,我发现,原来做varsity裁判也不难,成为一个辩论赛裁判,不需要三日试玉七年辨材这么漫长,边做边学也可以从连滚带爬做到游刃有余。后来我去问了组织方:我本来是来做novice裁判的,怎么让我去做varsity了?组织方说:今天新手裁判有点多,他们还在新手村,高手那边缺裁判,你当然就要去了。

下面简单记录一下早上第一轮比赛的过程,有心做裁判的家长可以看看。

辩论题目是The United States federal government should significantly increase its anti-piracy efforts in Djibouti. 翻译成中文:美国联邦政府应当显著加强在吉布提的反海盗努力。

正方一辩提出花1.5个亿做这件事,原因是虽然海盗活动曾经下降90%但近两年又有回潮,论点包括经济影响(海盗影响运输成本),人道主义影响(海盗威胁人身安全),以及战略稳定。

反方一辩驳斥:靠军事压力不解决根本问题,如果不解决索马里的贫困问题,海盗会源源不断出现,因为他们没有出路。1.5亿也不是很多钱。我们提出花更多的钱来解决根本。论点包括现行方法已经很有效,机会成本,以及冲突恶化的风险(激怒胡塞武装2)。

正方二辩:你们要花更多钱解决贫困问题,你们看看美国在阿富汗花了那么多钱扶贫,塔利班就放下武器了吗?问题解决了吗?

反方二辩:阿富汗是军事入侵的结果,美国不是去扶贫的,索马里不一样,我们不是入侵索马里,是帮助。看看中国的一带一路,这才是从根本消除贫困和海盗的土壤3

之后双方的总结,按照规则,都必须只能引用之前提到过的观点和证据,不能有新的观点和证据,否则是犯规的。所以就不记录了。

最后想说的是,如果读者读完之后有兴趣,欢迎提问,可以通过评论区或者其他你知道的方式联系我。我之后会逐渐收集对我有过帮助的资料更新到这里,特别去年三月在东湾我第一次裁判时,主办方提供的裁判训练资料就很有帮助。这个辩论赛是对新手辩手和新手裁判双料友好的,每年三月会举行,如果想来试试,我非常推荐。

第一次做裁判的地方

  1. 这个其实是明显的conflict of interests(利益冲突),是严格禁止的,可惜孩子当时不知道。 

  2. 这儿还有个小插曲,正方(利用POI规则)说我们说吉布提和索马里海盗你提胡塞干啥呢;反方说“胡塞就在吉布提家门口,就五十英里开外,字面意义的家门口”。 

  3. 这是我第一次在美国的中学辩论里听到有辩手说中国的好话,并且没有辩手说中国的坏话的。 

🔲 ☆

索友

很久很久以前1,一天,我在一本《经济学人》上读到一则小文,标题不太确定了,要么是“台湾与索马里兰”,要么是“索马里兰与台湾”2。当时我对索马里兰这个名字只有点模糊印象3,就决定读一下。文章是这样开头的:”One is a small, surprisingly successful and relatively democratic country bullied by a larger, dictatorial neighbour which considers it to be part of its own territory.”

当时我冷笑着,内心:我当然知道你说的是谁了。翻译过来基本是:“一个小国,但是惊人的成功,相对来说民主。它总被一个大的,独裁的邻居欺负,这个邻居认为这个小国是他们的领土的一部分。”这不明摆着说台湾嘛,看来大英帝国的《经济学人》又来辱华了。我继续往下读:“The other is Taiwan.”

我:“什么?你第一句话说的不是台湾吗?”那一瞬间我对《经济学人》由衷地佩服:还是老牌帝国主义的媒体会玩,一点儿辱华的把柄都没有,读者脑子里想的是什么,与他们留下的文字无关。并且《经济学人》这样的描写还挺合理的:那个“larger, dictatorial“并且”considers it to be part of its own territory“的邻居,其实就是首都位于摩加迪沙4的索马里联邦政府。以联邦政府的观点来看,索马里兰原本属于索马里,1991年自行宣布独立,这一行为是非法而无效的,所以”索马里兰是索马里领土不可分割的一部分“。

不过索马里兰当然有他们自己的正当理由:在殖民时期,如今索马里兰的土地是大英帝国殖民的,而如今索马里的其他地区的土地是意大利殖民的。前者叫“英属索马里兰”,后者叫“意属索马里兰”。前者在1960年6月27日就宣布独立建国了,只不过过了几天,出于当时“一个索马里兰”的美好愿望,于7月1日和后独立的原“意属索马里兰”合并,成立了“索马里共和国”。但是,合并后原来的英属索马里兰地区,以及当地的主体氏族5伊萨克族被边缘化,后来有一个名叫西亚德·巴雷的将领又政变上台,实行独裁统治,更是让原英属索马里兰人民后悔不迭。后来当地人发动起义,西亚德·巴雷出兵镇压,在1987年到1989年间甚至无差别轰炸城市和平民,造成这一地区的中心城市哈尔格萨90%被摧毁6,成千上万人死亡7。所以按照索马里兰的说法,当1991年他们和其他各路索马里反对派一起推翻西亚德·巴雷独裁统治之后,宣布独立,合情合理。

但是,索马里兰的说法并没有获得国际社会的普遍认可,即便他们“surprisingly successful and relatively democratic”,一直到2020年,同样不被国际社会普遍承认的台湾,和索马里兰建立了外交关系。《经济学人》那篇文章就是报导这一新闻的。文章最后这样说:“斯威士兰原本是台湾在非洲的最后一个朋友,从那时候起台湾有两个朋友了。”索马里兰呢?只有台湾一个朋友。

五年过去,事情有了转变,索马里兰获得了第二个朋友:以色列。这也是第一个承认索马里兰的联合国正式成员国。据说,哈尔格萨全城欢庆。按说索马里兰该举国欢庆了吧?

这事还真不好说。因为索马里兰虽然五年间朋友翻了一番,可是国土面积却变少了。索马里兰主张的领土范围,是和当年英属索马里兰的领土范围重合的。不过这片土地上不仅仅生活着之前受欺负的伊萨克族,也生活着其他氏族,例如东部的Dhulbahante(杜尔巴汉特)族。杜尔巴汉特族主张在自治的前提下保留在索马里联邦,于是和哈尔格萨的索马里兰政府龃龉不断,在这过程中,杜尔巴汉特族的精英人士不断遭到暗杀。2022年末,在索马里兰东部小城Las Anod,又有一位精英人士在走出清真寺时被身份至今不明的枪手枪杀。当地人民怒了,认定这次刺杀是索马里兰干的,上街抗议了。索马里兰军队开枪镇压,随即于2023年1月撤走并包围了城市,当地氏族于二月成立了政权,名为SSC-Khatumo8,并建立了武装反抗。从2月开始的6个月中,索马里兰军队对小城进行了无差别炮击,包括医院在内,造成平民死伤和流离失所,还断了小城的水源,不过4月的降雨让断水战术失效了。8月底,Khatumo方面出人意料地突袭了城外索马里兰军队的据点(可以比作太平军击破江北大营江南大营了)。索马里兰军队被驱退100公里(当然索马里兰方面表述为“进行了战略转移”),索马里兰的版图也缩水了大约四分之一。虽然索马里兰总统坚持“三区是索马里兰领土不可分割的一部分”,但就像索马里兰从索马里事实独立一样,Khatumo地方也从索马里兰事实独立了。

最后,作为一个《经济学人》粉,还是要看看偶像对这事怎么看。果然偶像开篇又不一般:“When the Israeli flag is sighted on the streets of the Muslim world, it is often being set alight or trampled underfoot. ”中译:当以色列国旗在穆斯林世界的街道上出现时,一般是被点上火烧的,或者是放地上踩的。“Yet in recent days the Star of David has been plastered on buildings and brandished by jubilant crowds in Hargeisa, the capital of Somaliland.”中译:这几天大卫星旗在哈尔格萨的建筑上飘扬着,欢乐的人们挥舞着。虽说文中没提两年前索马里兰丢失土地那回事,不过五年后这篇的索马里兰地图中间多了一道虚线。所以索马里兰这五年是处境更好了还是更不好了,我看不清,你说呢?

北方双城分庭抗礼,南方隔岸观火

参考资料

  1. 英文维基百科:索马里兰
  2. 英文维基百科:针对伊萨克人的种族灭绝
  3. 英文维基百科:Las Anod冲突
  4. 经济学人:索马里兰2024年独立日深度报导
  1. 大概是2020年10月。 

  2. 纸版《经济学人》的标题和现在找到的网页版标题是不一样的,现在找不到当时的纸版书了。 

  3. 小时候读过一本按各大洲讲国际时事的书,里面有一篇专讲索马里。现在这本书也找不到了。 

  4. 郑和下西洋的时候,叫做木骨都束,显而易见是一回事。 

  5. 都是父系氏族,以血缘传承。 

  6. 哈尔格萨当时被形容为非洲的德累斯顿。 

  7. 根据估计,在1987年到1989年间,有五万到十万伊萨克人平民遇难。统计范围是整个伊萨克人生活的区域,不仅仅是哈尔格萨一地。 

  8. SSC表示Sool, Sanaag和Cayn三个区,Khatumo的意思是“最终决定”,可以说是三区革命了。 

🔲 ☆

冒个泡

自从年初发了一篇博客,不知不觉,已经要年尾了博客还荒废着,不得不冒泡报平安了。怒水一篇,不上十大,经验值不要,版主勿删。

博客荒废的原因也很简单直接,生成式AI,不必解释你我都懂。博主也曾严肃地花了五分钟时间考虑要不要转型改成AI辅助写作:自己写大纲,然后交给ChatGPT来填充文章细节,只要让ChatGPT把博主的博文提前读一遍就足够了,反正博主这个小站文字不多消耗token也不会多。

不过,博主自己就不喜欢读AI生成的文字,估计乐意读这个博客的朋友(小众中的小众)也多多少少想法类似。要让博主从哼哧哼哧写自娱自乐的玩意,转变成写提示词让AI帮忙生产些自己都不想去读的东西,无异于让博主自抡耳光。况且博主早早加了个”Written by human not by AI”声明(页面底部就可以看到),有这么浓眉大眼的图标在那儿摆着,博主怎么能随便叛变革命呢?况且,“Not By AI”现在做大了:对于任何想添加这个声明的网站,要么一次性交99美金,要么提交证据让他们人工审核一番,然后,下载一个图标。博主当年是直接下载就行了,当时一时冲动给自己立的“不用AI写blog”的flag,居然在N年后帮忙省了99,怎么也得接着自己写,才对得起自己嘛。

notai 其实Not By AI并不是想钱想疯了,只要博主真的是人工创作,审核过就好了。博主觉得并没有多少人会为了省几天的人工审核时间来交这99美金

不过,这年头博客当然也不可能完全没有AI的帮助。就拿咱们这小站来说吧,之前博主已经找AI写了些代码,加了些新功能,比如在博文里加上地图,并且有个专门的页面,可以在地图上点选标出来的地方,就可以进入相应的页面。如下图所示:

maplink 这个页面有个地图,再点地图上的小蓝标会显示地点,并且带有链接。点击链接就会进入对应的文字,例如《埠出厦门行》这篇。

当时功能做好后博主受此刺激,又输出了几篇,都带着地图,心情很欢乐。但是博主每次都得自己做一堆操作:

  1. 一边写,一边想:加哪些地点好呢?
  2. 文字写完了,保存文件。
  3. 打开一个小工具(Claude或者ChatGPT帮忙写的,简单的HTML),在地图上找到想加入的点,点一下,就copy好了这个点的经纬度。
  4. 打开这个博客文件夹下面的一个YML文件,把刚才copy下来的东西粘贴进去,再加一个id,并且加一些说明性质的文字。
  5. 切换到第二步的文件,把第四步里加入的id,放到文件前面的“front matter”里边去。
  6. 如果在第一步里想到了多个地点,那么重复第三到第五步。
  7. 最后,在第二步的文件中,决定在那里显示地图,将一小段代码插入到相应的位置。

博主的热情,在经历了上一篇之后,自然而然地消散了。

最近博主和老板聊天(博主工作不常换,组也不常换,但是老板经常换,上次博客里提到的老板,已经是前前前前前前前老板了,在博主的前组),聊到AI Native,老板说,不要假设AI不能做什么,要破除迷信,破除固定思维,博主说懂了,就像Think Costco First,我们是Think AI First。于是一天晚上,博主打开Cursor,问了Cursor下面一段话:

myprompt 这一长段提示词无非是提需求,让Cursor帮忙出个方案。

Cursor想了想,提了三个方案:

  1. 方案一:写个Python script,和AI集成。
  2. 方案二:写个Cursor或者VS Code的提示词模板。
  3. 方案三:写个VS Code Task并且和AI集成。

三个方案Cursor都哐哐哐把框架代码写出来了。Cursor还给了个推荐,选方案一,只需要做下面这些事就可以了:

option Cursor的最佳方案,需要很多命令行交互,并且需要使用API和LLM提供商例如OpenAI集成。

博主说,我都已经把Cursor当编辑器了,还要这么多花头干什么,做方案二吧。

几个来回Cursor就把这事儿完美做成了。博主新打开了一个聊天窗口,让Cursor给《一个老兵》这一篇文字找三个兴趣点并且加上地图标注,瞬间完成。读者诸君,如果你坚持读到这里还没关闭页面的话,请向二月徒手加了十二个地点的本博博主致敬,或者嘲讽,一秒钟。

所以,杂货累活交给AI来干(除了地图标注,还有图片上传,添加内链之类),写东西这种简单的小活,还是坚持古法,自己做一做,不麻烦AI了。

最后强行加个地图,用了之前步骤三里的简单HTML工具。

本文部分构思是今天散步到这里时生成的。之前博主也有关于这里的构思,但是并没有写,惭愧惭愧!

🔲 ☆

地趣续

坐在陪审团召集室里翻阅自己以前写的博客,看到十七年半以前这篇《地趣》,决定搞个大新闻,把当时的自己批判一番了:当时怎么那么狂妄地出题目考读者,好像自己会做似的,真是有趣。

欧盟最西的边界线,在什么地方?

如今我查维基百科的相关条目,所谓的欧盟“最西”需要各种限定条件的:如果在地理意义的“欧洲”范围内找,“最西”点在亚速尔群岛的某个小岛,属于葡萄牙;如果在欧洲大陆找,那么是葡萄牙的罗卡角。但是,当时的我说到“边界线”,那么想必我指的是陆路边界了,那么真相只有一个:当时的我心里想的是法属圭亚那和苏里南的边界。但是如今的我反倒疑惑了,就去查,查下来的结果是:法属圭亚那确实法理上是属于欧盟的,而阿鲁巴、法属波利尼西亚这样的属于“海外领地”而不属于欧盟。所以我当时的答案应当是合理的。不过如今又有一个特例需要检查了:北极有个汉斯岛,加拿大和丹麦争执了很多年,最终在2022年决定将这个岛一分为二,所以这个岛上也有一条陆地边界线了。这个岛的经度还确实比法属圭亚那更靠西,是不是时过境迁答案也要更新了呢?我仔细检查了一下,还问了GenAI,结论是不算:汉斯岛一半属于加拿大,另一半属于丹麦治下的格陵兰,而格陵兰早就退出欧盟了。

欧盟最西端在哪里

为什么安哥拉本土和卡宾达之间被两个刚果包围,却不属于任何一个刚果?

这句话有语病,如果我不是我自己,那我完全不知道我在说什么。现在我可以帮我自己解释一下了,我的意思是,为什么“卡宾达”这个地方被刚果共和国和刚果民主共和国包围,并且和安哥拉并不接壤,却不属于那两个刚果之一,而是属于安哥拉。

我很确定我当时的理解是一知半解的,或者说是皮毛的。这许多年过去,我越来越不敢说我答的上来这个问题了。不过我可以分享我所知道的:在当时我提到的那本我小时候的地图册里,卡宾达被标注成一个独立的国家,不过后来在我任何一本接触到的世界地图里,卡宾达都只是安哥拉的一个省。原因可能是1975年卡宾达短暂独立过,但是几个月之后就被安哥拉出兵吞并了。而安哥拉出兵也有依据:欧洲殖民时期,那一带有法属刚果(后来成为刚果共和国)、比属刚果(后来成为刚果民主共和国)和葡属刚果(就是卡宾达),安哥拉则是葡萄牙殖民地。原本葡萄牙殖民者将葡属刚果与安哥拉区分对待,但后来又合并起来对待了,所以独立后的安哥拉对卡宾达主张了主权并且成功,当然卡宾达当地总有不同意见,并且也有人使用武力表达不同意见,安哥拉也使用武力对应不同意见就是了。

卡宾达位置

为什么克罗地亚的领土贪婪地向东南延伸,一条狭长的海岸线冷酷地堵住波黑,使其没有一个出海口?

当时的我对细节的注意并不够,其实波黑是有出海口的,叫做尼姆。波斯尼亚和黑塞哥维那在这里有二十公里的海岸线,这二十公里海岸线两边的延长线都属于克罗地亚。著名的杜布罗夫尼克1位于尼姆的东边,是克罗地亚的飞地:所以波黑出海不方便(港口条件不太好),克罗地亚杜布罗夫尼克的陆路交通也不方便,两国只好协商,克罗地亚提供更好的港口,波黑保证陆路畅通。另外,虽然我是我自己,但是我完全不知道我当时的答案是什么,而我现在查到波黑和克罗地亚如此这般的边界划分,在1699年就协定了:当时拉古萨共和国(首都在杜布罗夫尼克)把尼姆割让给了奥斯曼土耳其。

尼姆和杜布罗夫尼克

1945年的波兰边界和1939年的相比,相对于发生了整体的平移,波兰的领土在战前战后有何得失,领土面积是增多了,还是减少了?

这道题出的还行,答案是减少了。我之所以知道,是在曾经满大街报刊亭的时代,从一本买来的《世界军事》杂志上读到一篇《欧洲的重组》了解到的:1939年德国和苏联瓜分了波兰,苏联占据了波兰东部的大片领土。后来苏德又打起来,德国战败。战争结束后波兰复国,苏联没打算把他们1939年占领的波兰领土还回去,而是将德国东部的大片领土交给波兰作为补偿。所以,1939年的波兰城市利沃夫1945年成了苏联乌克兰加盟共和国城市(是的,就是俄乌战争期间大体安全,偶尔被轰炸的利沃夫),1939年的但泽自由市成了1945年的波兰格但斯克,1939年的东普鲁士哥尼斯堡变成了1945年的苏联俄罗斯加盟共和国(现俄罗斯联邦)城市加里宁格勒。

波兰的平移

感谢读者耐心地读了这么久,是时候送上个文末彩蛋了:如果读者以后遇到任何加拿大地理方面的问题,那么答案必然是下面三者之一:(A)因为离美国近。(B)因为冷。(C)因为加拿大地盾。如果不能决定,那么答案一定是加拿大地盾(安大略为什么这么平?加拿大地盾。魁北克为什么这么多湖?加拿大地盾。为什么加拿大中间没怎么住人?加拿大地盾)。这是我不时去看Reddit的geography subreddit学到的。不用谢。

  1. 写《地趣》之前一周我也写了一下杜布罗夫尼克,所以当时提这个出海口的问题也算是recency bias了。 

🔲 ☆

2024年夏·上海

我第一次来上海,是上大学之后的第一个十一假期。记得那次来到了苏州河与黄浦江的交汇处,公交车已经不能再前行,我和几个朋友走过一座桥,挤进汹涌的人潮中,经过外滩、南京东路、人民广场和部分南京西路(路上常常有人挥起充气锤子什么的互相暴揍一顿,有时候把手无寸塑的我们也顺便暴揍一顿),最后在石门一路地铁站附近的一家茶馆通宵打牌度过。大学毕业后到上海工作,没几天我就故地重游,但已经不记得四年前是不是走过了大名鼎鼎的外白渡桥。但是后来,另一个可能性被永久地抹去了。这一回,我和家人也来到了外白渡桥,也沿着外滩、南京东路、人民广场和部分南京西路这样的顺序走。

足迹图

这一路有一些变化:置地广场人去楼空了,对面原本有一家优衣库,如今优衣库没有了,有了各种各样的动漫店,我看不懂,不过很多年轻人来,热闹非凡;以前的上海美术馆,我总是拖着没有去参观,“人民广场这么方便的地方,想去随时就去了”以及“等下次双年展的时候去吧”,谁知后来就没有美术馆了。这次第一次踏进这里,已经变成了历史博物馆。这一路也有不变,例如和平饭店(不过与我对和平饭店的印象有点差距——因为我的印象有点怪异),国营店的沈大成青团,“十里南京路一个新世界”的新世界城商场,以及这次我们住的,已经有点显旧的一家酒店。

shanghai_anime 二次元入口?

我们没有走到曾经的石门一路站,走回我们住的酒店就结束了。这家酒店对我来说不算陌生了,在上海工作的时候,有一次和一部分同事,跟着我们的“主任”(其实他的正式title是team lead,但是名片上是主任,年龄比我稍大几岁)来过这家酒店,参加一个技术会议。会议的内容已经不太记得了(记得有Chris Richardson来讲CloudFoundry,当时属于VMWare,如今CloudFoundry独立了,VMWare被收购,员工大都被裁了;还有一个来自法国的程序员,还开设了微博叫做“快乐的法国极客”,做了一个讲座,不记得内容了,但是很快他也就不用微博了,或者他从来也没有用过),印象里中午的饭和下午的点心很好吃:毕竟当时没见过世面。我们还碰到另外一个同事:记得他当时刚毕业入职没多久,还不知道可以用公司经费过来,是自己请假自己掏钱来参加的。不过,如今问起他,他已经不记得这个会,也不记得后来有没有让主任给他报销,我也不能问主任了,因为主任已经去世了。

后来我有一次来上海办签证,我们一家就在这家酒店住了,因为离梅龙镇广场的美国签证中心不远。记得那次(2016年12月)有一天晚上在回酒店的路上,在人民广场地铁站九号口,一个男生和一个女生问我骑车到静安寺怎么走,我告诉他们南京西路大概不能骑自行车,需要走那条叫凤阳路的小路往西,他们道谢走了,我心中称奇,路上这么多的人,他们怎么知道我,一个已经离开上海,只是恰好在这里常常骑过车的人,是个适合问路的人呢?我不知道他们那次有没有顺利骑到,后来他们人生路上又去到了哪里。年轻,总是有无限可能。

如果这两个年轻人是从虹口骑过来,那么如果有可能骑过一条叫江西中路的小路。之前我从虹口骑过来的时候,总是过乍浦路桥,总是骑江西中路,道路狭窄,电线密布。如今,这条路两边的房子还是差不多原来的样子,不过有了些新的宣传告示,看起来这边终于“拆到了”。当然,这一片区有许多“优秀历史建筑”的标志牌,我没有注意“优秀历史建筑”会不会对拆迁免疫,不过我知道不是所有房主都乐意自己的房子作为古迹受到保护的

shanghai_move 我拍到的时候,“酝酿期”和第二奖期都已经过去了。

最后来说说我对和平饭店的怪异印象吧。赵薇有一部电影《夜·上海》,是我还在上海时全然被上海主题吸引从头看到尾的。电影的情节诡异,不值得花时间。男主角(一个日本人)晚上从位于陆家嘴金茂大厦的酒店走路溜达出来,在身无分文,没有手机(当时可能还没有IPhone),没有交通卡的情况下,很快在浦西徐汇区汾阳路一带出现,他是怎么渡过黄浦江的呢?后来他和赵薇相遇,在和平饭店背街的巷道里在这座优秀历史建筑的墙上乱涂乱画,也没有惹来任何麻烦,我对影片中优秀历史建筑的遭遇深表痛心。

shanghai_473 然而2024年终究还是有人在优秀历史建筑上乱涂乱画了,艺术还真是源于生活啊。

按居住时长来算,上海是我的第三故乡。路过时间很短,也没有特地重游什么故地,但青春记忆随处可见。下次再会。

🔲 ☆

埠出厦门行

感谢小三通,让我在厦门旅行期间得以开一个分支剧情:金门。这里不属于常人会想起来去的旅行目的地,只有历史书呆子如我才会对这里产生浓厚的兴趣,以及强烈的到此一游的冲动,于是我独自来了个金门半日游。

足迹图

我从厦门的小三通专用码头:五通码头坐船,所以我把这篇叫做“埠出厦门行”,毕竟,厦门金门两个岛,也确实符合“山岛耸峙”的描述1。我需要现场查验手续,现场买票,预留一点时间过中国边检出境(盖“厦门高崎”章),行船大约35分钟,到金门水头码头入境。每天来往的客船不多,好在也坐不满。时间有限,我只走了走大金门岛的西半部,以及小金门岛(又名烈屿)。

古宁头战地

1949年10月24日,中国人民解放军的三个团,九千人,乘坐两白艘民用机帆船,乘夜渡海进攻大金门岛。我曾经读过一本奇书2写到这里的时候差不多这样说:“叶飞一路摧枯拉朽,也有些轻敌。”也读过《蒋经国自述》在战事后写下“金门登陆之共军已大部肃清……”以及蒋经国奉命慰劳将士,沿途所见死伤枕藉的描写。所以,我的主要目的地就是古宁头。

kinmen_guningtou 这是莒光楼的“古宁头战役”展板。莒光楼的展览主要是纪念胡琏将军。

胡琏的十二兵团在解放军攻金之前移防金门,而解放军第十兵团误以为十二兵团仍在海上徘徊,所以在已经夺取厦门的情况下,决定“攻金宜早不宜迟”,发动了金门登陆战。激战三日,因为准备不充分,船只登陆后无法回返,登岛部队寡不敌众,最终全军覆没。而对我而言,国共双方军队的骨肉同胞因各为其主而拼死厮杀,最为让人痛心。在金门,我们可以看到一位当年战死沙场的国军军官的事迹。

kinmen_liguangqian_1 从文字介绍可以了解到,李光前是曾在鄂西、湘西抗战的民族英雄。

李光前在古宁头战役中身先士卒对解放军发起冲锋,中弹阵亡。与众不同的是,金门岛民将李光前尊为“金门保护神”,在他战死的地方建起了李光前将军庙,焚香祭拜,甚至自行追晋李光前军衔到中将,就像关圣帝君一样3

kinmen_liguangqian_2 李光前将军庙。

从李光前将军庙再向西北走一些,就是古宁头的核心区域了。当年解放军登岛部队在寡不敌众的情况下,退至此地,将临时指挥所设置在北山古洋楼,被重重包围。如今的北山古洋楼上,原样保留了当年密密麻麻的弹孔。

kinmen_beishan 北山古洋楼的一面墙壁。

kinmen_guningtou_museum 当地有古宁头战史馆,不巧的是我来访时正在维修,不对外开放。维修工程八月底会完工。

烈屿

小金门岛(烈屿)位于大金门岛西侧,比起大金门岛,更靠近厦门,也是国军的国防最前沿。之前大小金门长期只能靠轮渡通行,2022年,连接两岛的金门大桥建成通车,从此烈屿的交通方便很多,而我也得以借此机会踏上烈屿一游。

kinmen_bridge 太平洋另一端的金门大桥。

烈屿东南角有九宫码头,原本是大小金门的交通命脉,大桥开通后,九宫码头就没用了。不过码头附近有属于国家公园保护范围的九宫坑道,是国军当年开凿停泊战舰之用。

kinmen_jiugong 九宫坑道

烈屿在古宁头战役时没有受到影响,不过在1958年八二三炮战期间处于前沿位置。

kinmen_823 没有被击垮,就是胜利。

烈屿也有一个战史馆,叫做湖井头战史馆。与金门岛的古宁头战史馆、八二三战史馆不同的是,这里并不是为某个重大战役而专设(当然也有提及),而更多侧重守卫烈屿的阿兵哥的经历。

kinmen_hujingtou 在湖井头战史馆,我们可以从这些话筒里听到几位阿兵哥讲述他们的故事。

烈屿还有一个文化馆,是原来的乡公所改造而成,这里的陈列侧重于民间生活,例如明清时期的家什。当然由于1949年以来长期在战争阴影下生活,这一段时间的陈列也充分反映了压力下的紧张情形。

kinmen_lieyu_museum 其实和对岸的文革器物也相距不远。

烈屿文化馆的一张图挺有意思,题图是“共军飞机识别图”,但其实仔细看一下会发现有点不太对劲。

kinmen_gcd_jets 同一张图上其实暴露了它的本来面目4

郑氏

金门当然不只有当代史,明清鼎革之际,郑氏集团也以厦门、金门作为基地。所以我也去探访了延平郡王祠,可惜也在维修不开放。我原本还打算去看看鲁王朱以海的墓地:这是1959年国军在构筑工事的过程中偶然发现的5,但是因为自己的时间关系没能去。这次唯一看到的郑氏遗迹,是烈屿的国姓井。

kinmen_guoxingjing 国姓井。

花絮

无奖竞猜:为什么厦门的小三通专用码头叫做五通码头?和三通的关系是什么?答案过段时间在文中揭晓。

  1. 曹操《步出夏门行·观沧海》:水何澹澹,山岛竦峙。 

  2. 以后有机会讲讲这本奇书,叫做《中华人民共和国演义》,作者张涛之。 

  3. 李光前阵亡时是中校,当时追晋为上校,后来民间自行追晋为少将,后又追晋为中将。关羽在三国时为壮缪侯,北宋为武安王,清光绪时为忠义神武灵佑仁勇威显护国保民精诚绥靖翊赞宣德关圣帝君。 

  4. 本来是“共匪飞机识别图”,“八一”徽章下面告诉了我们真相。我猜测是小三通之后,金门方面为了照顾大陆游客而打的补丁。让我想起我小时候看过的,大陆这边出版的《蒋经国自述》,里面的“共匪”“匪军”字样都改成了“共党”“共军”字样。 

  5. 根据维基百科,当时为了研究鲁王墓,国军的军事工程被推迟,使得国军的一门威力巨大的240榴弹炮“处于每单日挨打的窘境”。 

🔲 ☆

2024年夏·西安

不算路过,这是我第三次来西安。每次我都从银川来。以前每次来,我都是坐汽车,早上出发,晚上在固原睡一晚,第二天翻越六盘山和一些塬,晚上到西安。这一次我坐高铁,山和塬都是穿隧道分分钟通过,四个小时就到了。

足迹图

陕西历史博物馆

上次来西安的时候我也来过陕西历史博物馆,馆藏丰富,并且馆舍新潮现代,游客也不多,但自己收获并不多,因为太年轻太幼稚。这次来西安我也参观了陕西历史博物馆,馆藏更加丰富,看到的不多却已经收获很多,但馆舍已显老旧,游客人山人海。

我暂且只讲一件这次在这里学到的东西。

xian_kaitongyuanbao 这些金币念什么?

我以前一直是念开元通宝的,这也是通行的念法。但是这次志愿者老师和我们讲:其实应该念开通元宝。理由也很充分:这种钱币并不是在唐玄宗开元年间才发行,而是唐高祖李渊建国的时候就发行了,为了庆祝立国,称开通元宝更有道理。志愿者老师还带我们看了同样展出的同时代日本钱币,念法也是顺时针,可以作为旁证。

xian_hetongkaizhen 日本钱币和同开珎,珎读音珍(但也有争论)。

之后我又去查了一些资料,两种说法的支持者都有(仅列举一则开元通宝说和一则开通元宝说),我个人认为“开通元宝”的读法更让人信服,这里有另一个旁证:唐代宗时代(唐朝开国约150年后)发行了大历元宝,是最早的年号钱,按顺时针读,称“元宝”,所以大历元宝应当是按照本朝的铸币传统。而到了后世某个朝代,发行年号钱的人将前朝货币错读为“开元通宝”(也确实通顺),从而开始了按照上下右左的“某某通宝”铸币方式,而开通元宝也从此被读为开元通宝了。

另外,日常流通的开通元宝是铜钱,这些金币是唐玄宗请大臣们吃饭的时候,撒在地上,让大臣们争抢着去捡的。据说这也是西安洒金桥地名的由来。

在这里看过各种各样的珍宝,我深刻地感受到,煌煌盛唐是四海八荒文明交融的成果。暂不展开。

xian_manaobei 兽首玛瑙杯,分明是来自地中海的丰饶角。

上面的这些宝贝都出土于何家村。1970年,两口大瓦缸从这里重见天日,里面装满了各种奇珍异宝,想必是富人躲避战乱时埋下,但富人再也没有回来。富人的身份也至今没有定论,不过他在洒金桥的时候想必身手敏捷。

大唐不夜城

上次来的时候,是一个晴天的早上。这里除了大雁塔和大慈恩寺,就是农田和民舍,我们能做的就是在大慈恩寺给一个小的照相摊交点钱,和大雁塔,寺院,以及一个“西安大雁塔留念”的牌子拍几张合影,再去其他地方。晚上我们住到市区钟楼那边的宾馆。住在这边是不可能的,因为太偏僻了。

这次来,这里是夜生活的世界了。我们在一家汉服体验馆交了好多钱,选衣服,化妆,一个摄影师领着我们,带着一个板凳和一小车的道具,在一小块广场上找了个立锥之地,拍了数百张照片。之后选片,选片师推荐加钱全精修,我们又交了钱。

我们当然也知道这都是套路了,不能免俗。来之前我们也有心理准备,查了一些攻略,听了亲朋好友的一些经验和建议,打算到现场多比比看。事实上,我们打了个网约车到那边,刚刚下车,就有一个阿姨黏上来,一通热心营销,我们就从了。最后看整体体验和最终效果,也还满意。

xian_hanfu 所有自愿或不自愿被套路的人都在这片区域拍照,为汉服拍摄行业爆金币。截图自高德地图。

xian_square 我们也是其中之一。

在这个范围之外,情况就正常多了,大雁塔及周边广场晚上灯火通明,商铺林立,游人如织,音乐喷泉准时开始后一片升平气象,是一个正常商业景区的体验(例如南京夫子庙)。

晚上我们还是住到市区钟楼那边的宾馆,因为住在这边的话,太热闹了。

临潼

在临潼一整天。早上先去看《复活的军团》表演,个人认为编剧超出我的预期,挺不错,值得推荐给每一个计划去兵马俑参观的人。

根据云梦睡虎地秦简中的家书木犊创作,将黑夫、惊这两名普通秦军士兵的生活和命运告诉当代人:他们家兄弟三人,长兄名叫衷,二兄名叫惊,三弟名叫黑夫。惊的新婚日,秦王的动员令来了,为了出动六十万大军灭楚(这里的历史背景我小时候在《上下五千年》读到过,后来发现直接来源于史记,我在下面直接贴图了),每家三丁出二,二丁出一,不可不从。三兄弟争执,长兄(身有残疾)落败,两位弟弟参战……最终黑夫和惊的形象被做成陶俑,和其他兵马俑一起埋在地下。我们这些观众就从一个场景走到下一个场景,来追随他们的故事。

xian_wangjian 历史背景。

xian_heifu 黑夫。

当然剧中也有一些窃以为不合理(但是可以理解)的设定:两兄弟入伍后操演,秦王政来现场观摩(他需要亲自观兵吗?史书无载),指着旗手喊道:“你叫什么?”“黑夫!”“你家还有人当兵吗?”“我兄弟惊!”之后秦王政号召全军为了天下苍生、永久和平去灭了楚国、统一天下,如果这是真心话也不会始皇帝死而地分了。

看完演出去兵马俑博物馆,同样人山人海。我们购买了语音讲解,需要先领设备,再和讲解员会合,形成一个旅游团,一起调试好设备,记下了讲解员电话,然后开始步行一小段,检票经过第一道大门,继续步行一长段,又检票经过另一道大门,再步行一小段:唔,见到一号坑的展厅了,这不就是我上一次来的时候直接进来的地方嘛!进门后,寸步难行。我们的路线是一号坑、三号坑、二号坑(我上次来的时候二号坑还没有开馆),其间和讲解员失联多次,最后以失联告终。

xian_bingyong 就用一张陕历博的兵甬配图吧。二号坑有一些单兵甬,但是周围全是人。

晚上去华清池看长恨歌。那些点亮骊山的灯光里,有一盏或者几盏应该是来自兵谏亭(我去的时候已经是这个名字了,我爸更早前去的时候,叫做捉蒋亭),但我不能确定。演出结束后坐地铁回钟楼,在这个随便挖个坑就可以出土文物的地方可以坐到地铁,幸甚。

花絮

无奖竞猜:西安有一家石卒从心某某管理有限公司,你知道这家公司是做什么的吗?为什么叫这个名字?答案过段时间在文中揭晓。

🔲 ⭐

租车自驾经验谈(3)

这个题目,我2011年写过一次,2012年又写过一次。时隔十多年我又来唠叨这个话题了,不过准确的标题实应为:“一个外宾的租车体验”。

这次的租车行程是:第一天下午上海浦东机场取车,第二天上午杭州萧山机场还车。租车公司是一嗨,行前通过微信的“出行服务”订的。

租车行程

多年以前我曾经在某个租车公司的浦东机场门店租过车(已经忘记是哪家公司了),当时那家店设在机场区域某个小露天停车场,没有地铁也没有接驳车,需要提前联系门店让工作人员开车过来接。如今我可以坐机场的免费摆渡车,到浦东机场的P4停车场(长期停车场),坐电梯上五楼。

我找了门店的工作人员小哥帮我办手续。由于没有国内手机号,并且我的美国手机号一时开不了热点,这个步骤花了很多时间:小哥需要冻结4000元预授权,Visa信用卡刷不出来;于是小哥让我用支付宝,我连了门店的Wi-Fi,换了若干种登录方式终于登上支付宝,冻结时又需要短信验证,我又要换验证方式,好在终究是弄好了。小哥告诉我:其实如今有很多种方式可以免除预授权冻结(毕竟2024年了),不过前提是,有中国手机号。

预授权弄好小哥就帮我把车开过来,告诉我“在手机上小程序里点一下就可以了”,因为这部车不需要钥匙,完全通过小程序控制。我点了一下,小程序说:“请输入(刚刚给您发送的)验证码”,我和小哥:“呃……”

于是小哥帮我换了一部有实体钥匙的车,解决了这个问题。

与此同时,中国本土的达人门纷纷通过手机上随便点点的方式,把一部又一部车呼呼开走,他们和门店小哥为数不多的几句对白包括:“要看啥证件伐?”(不用)“可以走了是伐?”(对的)。于是在我办租车手续的这半个小时时间里,我是门店里唯一驻足的客人。

我趁着有Wi-Fi,设置好了导航,出了租车点,上了高速,通过收费站,拿了卡:我突然想到另一个问题:我怎么出收费站呢?索性,去下一个服务区找个自动取款机取点现金吧!于是我来到航头服务区,没有找到自动取款机。“没关系!”我想,这个服务区大概比较小比较偏,“我去我熟悉的枫泾服务区,一定有取款机,并且取了钱正好过收费站!”于是在枫泾服务区我停下车,为了保险起见问了在那边工作的人“有没有ATM”,对方:“什么是ATM?”总之,这里也没有。

好消息是,从枫泾出省界,从上海境内进入浙江境内,不需要通过收费站了。我的美国手机号也反应了过来,可以漫游上网了。于是到了杭州出高速的时候,我使用微信支付成功通过了收费站,没有麻烦收费站工作人员给我开热点。这一路导航都在絮叨:前方超速拍照,前方区间测速拍照,前方ETC拍照,前方压线拍照,前方使用手机拍照。高速公路真是适合出片的好地方呢。

萧山机场还车倒是没有花什么时间:开车找到还车的地方,停好车,门店的小哥帮我取消昨天的车辆押金预授权,再帮我刷一个违章预授权,就好了。同时还有两个客人还车,他们都不需要预授权,直接手机上点个按钮,“可以走了是伐?”“对的。”

🔲 ☆

2024中国之旅

古人云,所谓旅行,就是从自己活腻的地方,到别人活腻的地方去。而今年夏天,我们从自己如今活腻的地方,到自己曾经活腻的地方去了。

时隔五年,我们又一次回到故国,一个月的旅程转瞬间就过去,意犹未尽也只能相揖别。我们的大致行程是:

  • 浦东机场入境后住了一晚上就去银川。
  • 银川小住几日后去西安看看历史。
  • 从西安去杭州和东阳走亲访友,分支剧情厦门,以及个人分支剧情金门
  • 最后去上海匆匆一瞥,浦东机场离境回美国。

大致行程

这次有朋友告诉我,很喜欢读我写的各种文章,让我深感荣幸和感谢。所以我觉得有必要写一写这次的中国之行。当然,这次去过的地方(除了金门)我都不是第一次去,我们也没有像特种兵一样行程满满跑这跑那,去过的地方也是个人喜好决定,所以我写的更多是个人记录,不必作为攻略使用。

去年夏天的游记类似,我会分段撰文,并相应地在本文逐渐提供内链。

小插曲:这个系列的前两篇发出来后,过了好久我才发现文中的图片都看不到,于是我把所有图片都换到了Imgur(让ChatGPT写了个脚本,不过费了一会功夫才写成),可以看了,不过后来又发现Imgur在中国是被墙的,这我就没办法了。把图片从Imgur迁移到了Cloudflare R2,图片在中国也可以正常显示了。

🔲 ☆

I voted on Super Tuesday

Today I casted my first ballot ever, in my first eligible election, on a closely watched Super Tuesday.

5 and half years ago, on Nov 6th, 2018, I was attending QCon in San Francisco. On one of the keynote session, the speaker (I don’t remember who, either Wes or Randy) started with this: “If you haven’t voted yet don’t waste time here GO VOTE!” The whole audience cheered, but at that time I was not eligible to vote.

In theory, I could had casted my ballot back in China. The reality is, although I saw some local level elections happening, and multiple candidates competing for a position, I never saw a ballet myself. Neither in the city I attended school, nor in the city I worked, also not in the city my hukou was. It’s been a long wait for me to have the same rights to vote as those who were born here.

To cast this ballot, I did my independent study to decide what I vote for, filled it, sealed it, signed it, all before today. This morning after other duties, I went to my city’s voting center at 8:25am, and within a few minutes I was done: it was so unceremonious, rather, it was like dropping off a letter at the post office, only with more steps to take, a few more photos and selfies myself decided to take, a few more sentences exchanged with voting center workers, a special sticker to claim and further decorate my laptop, and “you are all set” when the ballot was in the box.

The voting center is spacious, and by glancing there are nearly 10 workers. From my start to end, I only saw 3 other voters, all seem to be Chinese: it may be pessimistic to say turnout is low by my data points, and lots of people do mail in their ballots. But as a first time voter, I want to remind those who can vote, GO VOTE in every election, not everyone has the privilege to do so.

🔲 ☆

Read if you have Charles Schwab account

If you have Charles Schwab account I suggest you take action now to protect your asset from being hacked. I’ll talk about how and briefly talk about why:

How

  1. Before you start, think of an English word that is hard for others to guess but easy for you to remember, between 8 and 16 characters.
  2. Give Schwab a call, you can search online to find their official 800 number.
  3. In their voice menu, say you want to talk to a representative.
  4. Once someone answers your call, tell them you want to set up a “verbal password”.
  5. Answer their verification questions and get it setup.

If at step 4 you are asked to provide “verbal password” and you never set it up before, you should feel alerted and you may want to visit a Charles Schwab branch to get it resolved.

Why

If you don’t do so, there is a chance that some imposters can call Schwab ahead of you to set that up. Once it’s set up, when you call Schwab and talk to a representative in future, you will have to tell them your “verbal password” which you do not know! So the best way to protect your assets is to call now ahead of the imposters. (It’s not the most ideal way in my opinion, but it is the best I am aware of now.)

I will not talk publicly about details about how imposters use this to steal your money for obvious reasons. I can only say some of my colleagues got money either stolen or nearly stolen, so this is serious and urgent. And for my readers, I suggest spread the word cautiously because imposters are watching too.

Disclaimer: The views and opinions expressed in this blog post are those of the author and do not necessarily reflect the official policy or position of any organization, company, or individual. The information provided is based on the author’s personal experience and understanding, and it is recommended to independently verify any information before taking any action. The author is not responsible for any direct, indirect, incidental, consequential, or any other damages arising out of or in connection with the use of this blog or its contents.

🔲 ☆

Working with ChatGPT on my blog

No I am not asking ChatGPT to write blog posts for me, I will never do that. I have added “Written by Human not by AI” logo to my blog, which means “Use this badge if your article, including blog posts, essays, research, emails, and other text-based content, contains less than 10% of AI output.”

I asked ChatGPT’s help to add that logo though, to figure out where to insert some HTML tag with a particular image asset. This is an example of how I am working with ChatGPT to make improvements to my blog(thus it’s titled “working” not “worked”). And in this blog post, I will describe how this working relationship look like, the benefits, and the catches.

It helps me add new features to my blog

Here “it” means “Working with ChatGPT”, it doesn’t mean “ChatGPT”.

My blog is based on Jekyll, a blogging Framework, with a CSS Library called Minimal Mistakes, hosted on Github Pages. In 2020 I wrote about the history and all the updates ended up this setting. Since then, I have not made any major changes: it’s not because I don’t have ideas. I’ll touch the reasons later.

In the wake of ChatGPT’s success I decided to ask ChatGPT to help me with such feature requests. My idea is: since I have blog posts either written in Chinese or in English, I want to display miscellaneous buttons and labels on the post page according to language. E.g. at the end of this page you will see “Tags” and “Updated” labels, “Previous” and “Next” buttons, etc. For a post written in Chinese I would like to display “标签”, “更新时间”, “上一页”, “下一页” instead. So I asked:

Can I set locale at individual page level rather than site level? I tried to use zh_CN for one of the post but its HTML still has there

ChatGPT said:

To set the locale for an individual page, you can add a lang attribute to the HTML tag in the page’s layout file.

And they provided example code, explained the code, and kept going:

Additionally, you can set the Open Graph og:locale meta tag for an individual page by adding it to the page’s front matter.

Of course they gave example code and explanations.

But the code does not magically work: for the first idea, I didn’t know where to change individual post’s HTML(it’s managed my Minimal Mistakes somewhere); for the second idea, I quickly tried: and it didn’t work. So this is rather the starting of a conversation, and aligns with people’s experience with ChatGPT: you can’t expect it works magically, but you need to iterate on prompting.

As you can see, the feature is now implemented, not because of ChatGPT ultimately gave me answer, but rather I leveraged ChatGPT’s help to figure out the ultimate solution. So here brings my next point.

It serves as a pair programmer

Here “It” means ChatGPT.

From the starting conversation, I kept using ChatGPT as a peer programmer and kept finding the proper next steps.

Based on my current blog setting, my framework already handled certain jobs for me, this helps me to keep my maintenance effort minimal. The downside though, is sometimes I do not know where certain implementation is happening. To figure that out, I would have to do online search, read documents(if any), and deploy the sites to try, with no guarantee to work: that’s the reason I did not update my blog for a while. Back to the initial conversation, although the immediate answer doesn’t work, it gave me some hints: since ChatGPT mentioned “page’s layout file”, I probably need to figure out where the layout file is defined.

So firstly I asked ChatGPT directly about it, but made sure I asked it with as much information as I could:

You asked me to add a lang attribute to the HTML tag in the page’s layout file, I cannot find such layout file. I am using a plugin called jekyll-archives, and what I usually do it to just set some metadata like this: … Is there a way to tell this layout to use a different locale?

Then I got this answer:

If you’re using a layout file that’s provided by a plugin or theme, you may need to check the documentation for that plugin or theme to see if it supports customizing the lang attribute for individual pages.

So, ChatGPT didn’t know the answer, but “check the documentation” part was indeed the next step I would like to try. So I went ahead checking the documents of Minimal Mistakes because I believe it has some code somewhere that controls my page layout. And this time, I found some critical information that for some reason I did not realize in the past:

When installing the theme as a Ruby Gem its layouts, includes, stylesheets, and other assets are all bundled in the gem. Meaning they’re not easily visible in your project. Each of these files can be modified, but you’ll need to copy the default version into your project first. For example, if you wanted to modify the default single layout, you’d start by copying it to _layouts/single.html.

Then I took a look at the source code of _layouts/single.html and this line of code caught my eyes here:

<h2 class="page__related-title">{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h2>

There is site.data.ui-text[site.locale]! Apparently this piece of code suggests, in theory, I can pass in either language as key, to the site.data.ui-text dictionary, and get text accordingly! So where is that site.data.ui-text defined? This time I did not have to ask ChatGPT but just found it on Minimal Mistake’s Github repository here. It already has translations of different UI components.

At this point my action items became much more clear:

  1. I need to copy over the layouts files to my local repository, and make changes such that instead of using site.locale, use page’s locale.
  2. Figure out a way to know each blog post’s language.

At the end of the post I will summarize how it was done. But before that I have another point to make.

It misleads you if you do not ask in a proper way

I decided to followup on first action item myself and consult ChatGPT for the second. Since I have some existing Python script to do certain blog posts manipulations, I asked ChatGPT:

I need a piece of Python code to check if a file is English or Chinese, basically: given a file path, check the content of file, if the content is mostly Chinese, return ‘zh’, otherwise return ‘en’, can you write it for me?

Of course ChatGPT is ready to help and quickly wrote some code:

import langid

def detect_language(file_path):
    with open(file_path, 'r') as f:
        text = f.read()
        lang, _ = langid.classify(text)
        if lang == 'zh':
            return 'zh'
        else:
            return 'en'

So far so good! And I did not know langid library before, I learned something new, yay! But when I tried to embed the code into my script it didn’t work, so I asked a followup:

It seems not working: for every file in my folder, it has same score even though the content is different: is it only reading the first line of file? How to force langid read the full file and classify?

Here is ChatGPT’s answer:

By default, langid reads only the first 1000 bytes of a file to classify its language. If you want to read the full file, you can use the classify method with the full=True parameter

I tried to follow the suggestion by calling langid.classify(content, full=True), and I immediately got exception: TypeError: classify() got an unexpected keyword argument 'full'. The fact is, classify function doesn’t have a full parameter and ChatGPT just made it up: likely because ChatGPT was thinking following my prompt that “is it only reading the first line of file? How to force langid read the full file and classify?”. langid’s source code shows full parameter indeed does not exist.

The real issue, later I figured out, is my own mistake. I embedded ChatGPT’s code into my script and my code became:

with open(filePathStr) as f:
    post = frontmatter.load(f)
    text = f.read()
    lang, score = langid.classify(text)
    print(f"Detected file {filePath.name} lang is {lang}, score is {score}")

When post = frontmatter.load(f) was called, it read the entire file content and left the file pointer at the end of the file, thus the real fix is to add f.seek(0)(to move the file pointer back to the beginning) before text = f.read(). But I did not thought about it, and had a hypothesis, gave the hypothesis to ChatGPT, and ended up with a made-up API. So if I just copy-paste my buggy code and the unexpected results I saw, I should be able to get a correct answer in first try. That’s why proper prompting matters a lot.

Summary: ChatGPT is helpful for side projects

After all, it is pleasant experience to work with ChatGPT on side projects like a personal blog. For bloggers who have some code to write and maintain, ChatGPT helps you understand those code(so that you can make a stale blog active again) and helps you write new code to improve it.

For people who happen to have following situation like mine and want the answer. I am also sharing my solution:

Situation: I have a Jekyll based blog, hosted on GitHub Pages, uses Minimal Mistakes, have blog posts in different languages, want to show labels and buttons based on blog posts’ languages.

Solution:

  1. From Minimal Mistake’s GEM installation path(gem info minimal-mistakes-jekyll to get the installed path), copy several files, including: _layouts/single.html, _includes/comments.html, _includes/post_pagination.html,_includes/footer.html, etc, over to the corresponding folders(_layouts, _includes) into your local blog folder.
  2. In those files, replace site.data.ui-text[site.locale] by site.data.ui-text[page.lang].
  3. For each blog post, add a front matter to indicate its language like lang:en, lang:zh etc. I can share my Python script to go through each post to backfill later.
🔲 ☆

乌兰故事

贺兰山西中蒙边境,有个乌兰呼海——我一直在努力回想我是从哪里看到的这样一个句式:“二三字地名”加“一二字方位”加“二三地名”加“一二字方位”,接逗号,接“有个三字地名”。也许《西游记》原著开头是“东胜神洲傲来国境内,有个花果山”但是翻了书不是,也许是“国境以南太阳以西,有个村上树”但这缺少了地名。虽然我已不能在手头的地图上找到“乌兰呼海”甚至我也不能在网上搜到这个地名,但我依稀记得这个地方离“银根”不远,因为皮定钧去过银根。当然,大漠中的“不远”不代表走几步路就能到。

1970年代末从银川到银根,我爸需要开大约三天的车。那是一个卡车车队,车上有茅台酒,中华烟。还有样东西我不能说,只能给些隐晦的提示:相传葡萄牙人来到澳门问当地人“这里是什么地方”,当地人误以为他们在问妈阁庙,就说“妈阁”,于是葡萄牙人把这个地方命名为Macau——这样东西,和妈阁的谐音也有关。

虽然我不能确证有个地方叫乌兰呼海,我能确定的是呼鲁斯太。据我爸说,那里其实就是我爸笔下乌兰镇之所在。我曾经随他寻访过他奉献过青春的地方,乘汽车走没有沥青柏油水泥的山路,止步于呼鲁斯太东边不远处。当然也可以乘火车,有一列绿皮车至今仍然可以到达此处。我爸我妈曾经坐着这列火车去呼鲁斯太——据说我也在场,但我只能凭想象,在脑中完成那幅他俩的画面。

我终于记起那个句式的来历:“大运河畔淮安县境内,有个平桥镇”,原来我只是读平桥豆腐故事记下来了这个句式。“香干和花生米一起吃,有火腿味道!”我读书不及才子,却不妨效仿才子开开脑洞。

评论区有图片。

❌