普通视图

发现新文章,点击刷新页面。
昨天以前浮云游子意

辩裁无须七年期

2026年1月10日 08:00

现在时间是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. 这是我第一次在美国的中学辩论里听到有辩手说中国的好话,并且没有辩手说中国的坏话的。 

索友

2026年1月4日 08:00

很久很久以前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的意思是“最终决定”,可以说是三区革命了。 

冒个泡

2025年11月8日 08:00

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

博客荒废的原因也很简单直接,生成式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工具。

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

2024年夏·上海

2024年11月7日 08:00

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

足迹图

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

shanghai_anime 二次元入口?

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

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

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

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

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

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

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

埠出厦门行

2024年7月28日 08:00

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

足迹图

我从厦门的小三通专用码头:五通码头坐船,所以我把这篇叫做“埠出厦门行”,毕竟,厦门金门两个岛,也确实符合“山岛耸峙”的描述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年夏·西安

2024年7月27日 08:00

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

足迹图

陕西历史博物馆

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

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

xian_kaitongyuanbao 这些金币念什么?

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

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

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

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

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

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

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

大唐不夜城

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

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

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

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

xian_square 我们也是其中之一。

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

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

临潼

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

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

xian_wangjian 历史背景。

xian_heifu 黑夫。

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

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

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

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

花絮

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

2024中国之旅

2024年7月16日 08:00

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

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

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

大致行程

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

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

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

I voted on Super Tuesday

2024年3月5日 08:00

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

2023年8月18日 08:00

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

2023年4月30日 08:00

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.

乌兰故事

2023年2月25日 08:00

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

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

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

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

评论区有图片。

❌
❌