MoreRSS

site iconRamsay Leung修改

软件工程师,蚂蚁金服 - 微信 - AWS,使用Emacs 与Linux 
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ramsay Leung的 RSS 预览

加国旅居纪–医疗篇

2025-11-17 08:22:00

1 医疗之困

时至今日,中文社交平台上仍流传着大量关于加拿大医疗体系的吐槽,核心槽点就是一个字:「慢」。各种「人没了,号还没排到」的故事广为流传,甚至有人分享「回国治好病,在加拿大还没排上队」的经历。

身处加国,这种传闻让我时常生出「病不起」、「不敢病」的隐忧。

为什么加拿大的医疗系统如此之慢?根源在于「全民免费医疗」。

在加拿大,无论你是持工签、学签的外国人,永久居民,还是本地公民,只要拥有合法身份,都能凭一张医保卡(MSP, Medical Service Plan)免费就医。

核心医疗服务(如急诊、住院、癌症治疗等)几乎全由公立系统承担。只有医美、激光眼科等非核心服务存在私立诊所。这意味着,即便你年入百万,仍要和路边的流浪汉去同一家医院排队——除非你愿意花钱南下美国。

与美国相比,加拿大没有「花钱就能享受五星级服务」的私立全科医院;与国内相比,这里也没有「专家号/黄牛号」或「高干病房」(至少就我所知如此,也可能是我孤陋寡闻)。你不能花钱指定某位专家为你手术,一切听从转诊系统(Referral System)的安排。

简言之,加拿大的医疗体系是典型的「全民大锅饭」。

2 旧疾复发

可能是由于长期高强度工作、压力较大,我从2019年开始出现甲状腺相关的指标异常,终于在2020年末的体检中确诊甲状腺疾病, 开始了漫长的服药康复期。

每日服药,每月抽血复查。后来流程熟悉到,医生复查后都会贴心帮我开好下个月的验血单,免去我专门排队挂号只为开单的麻烦。

持续两年多的治疗,在来加拿大前终于得到医生告知:病情已控制良好,可以停药了。

2024年初回国时,我又去找这位相熟的医生复查。一来在她这里看了两年多,二来对加拿大的医疗系统因各种吐槽心存疑虑,想确认是否还需服药。

结果激素水平比正常值高了十几倍,又得重新服药。但即便吃了国内医生开的药,我也无法每月回国复诊,只能去探索加拿大的医疗系统了。

3 初诊体验

按照BC省的流程,身体不适应先找家庭医生(Family Doctor)。家庭医生处理常规需求(Routine Requests),如开药、体检、普通感冒等。若家庭医生认为需要专科治疗,才会将患者转诊至医院。

只是我申请了近两年,至今仍未排到家庭医生。问及身边朋友,大多也处于「无家庭医生」的状态。

这种情况下,可前往UPCC(Urgent and Primary Care Centre)。

其设计初衷是缓解急诊室(ER)压力,处理那些家庭医生或Walk-in诊所搞不定,但又未严重到危及生命的病例,类似国内的社区医院。

于是我一大早8点前往UPCC排队。取号后等了半小时就被叫到,当时还在想:「不是说很慢吗?看来也并非如此嘛。」

进诊室后,医护人员自我介绍时我才发现,对方并非医生而是护士。他的工作是将我的症状和诉求记录下来,等待医生接诊。

沟通约十分钟后,护士竟让我先回家等候。我很惊讶:「就这样回去了?」

护士解释:「医生可能需要3-4小时才能处理,您在这里等也可以。」

听到这番解释,自然选择回家等待。

在家等了近4小时,终于接到护士电话,我便返回UPCC。又等了约20分钟,一位医生喊我名字,带我进入诊室。

由于我已治疗此病数年,熟悉检查流程,正好借此判断加拿大医生的专业水平。

事实证明,医生的检查过程、询问的问题,与我国内医生的做法基本一致,只是语言不同。 加拿大的医疗系统并非想象中那般「不靠谱」,我心中安定不少。

接着医生询问我正在服用的药物。我拿出药瓶,虽然大部分是中文,但关键的药名和剂量均有英文标注。 医生说可按原剂量继续服用,并告知我,国内这款药在加拿大没有销售,但她可以开功效和剂量相同的替代药物,一个月后再抽血复查。

最后,为了更好地治疗我的甲状腺疾病,她开具了一份转诊单(referral),将我转至甲状腺专家诊所。

全程只需出示医保卡登记,无需自掏腰包。

4 医药分离

看完病我才发现个奇怪的现象,医院里面竟然没有取药的地方,也没有抽血的地方。

后来发现,很多超市都有所谓的药店(pharmacy),可以拿着医生给的处方(prescription) 去药房买药,原来看病是不需要花钱的,但是去药房拿药还是要给药费的。

因为公司有买额外的 Extended Health Benefits(商业补充保险),所以我是只需要支持25%的药费,剩下的75%由保险来付。

这里一瓶药270片是 56.21 加元,我付了 15.07 加元

而至于抽血,验尿,心电图之类的检查,在BC省主要就由一家叫 Lifelabs 的私营公司垄断承包的,所以需要抽血的时候,就去这家公司官网预约,化验结果就会发到指定的医生那去。

对于习惯了国内大医院挂号、看病、检查、拿药、手术「一条龙服务」的人来说,难免会升起一个疑问,为什么要这么设计?

后来去看专家医生的时候,闲聊之际就问起这个疑问,这位老医生就给出他的见解:

最主要的原因:为了防止医生「为了赚钱乱开药」

这是加拿大医疗体系的一个核心原则:「医」和「药」必须彻底分家。

  • 如果医生能卖药: 就像让裁判同时当运动员, 那他就有很大的动力给你开最贵的药,或者在你不需要吃药的时候给你开一堆药。
  • 现在的制度: 医生只负责看病和写处方,他拿不到卖药的一分钱。你去哪里买药完全由你自己决定。 这样医生在开药时,就只会考虑「什么药对你最有效」,而不是「什么药利润最高」。

第二个原因:诊所只是「写字楼」,不是「化验厂」

你去的 UPCC 或者普通的家庭医生诊所,本质上就是个咨询室。

  • 抽血很麻烦: 处理血液样本需要专门的冷链运输、昂贵的离心机、还有处理生化医疗垃圾的资质。普通诊所空间有限,无力承担专门的设备与额外的人员。
  • 集中处理更便宜: 把全城几百个诊所的验血需求,全部集中给 LifeLabs 这一家专门的大公司做,效率最高,成本最低

第三个原因:为了让你在家门口拿药

虽然在诊所拿药看似方便,但加拿大的逻辑是:药房应该像便利店一样多。

  • 医生可能离你公司近,但药房最好离你家近。
  • 药房在加拿大就像 7-11 一样密集。你拿着处方,可以在下班回家路上任意一家药房取药,不用非得挤在诊所里排队。 (的确如此,许多超市晚上6点关门,药店却营业至晚上10点。)

简而言之, 医生只负责动脑子(诊断), LifeLabs 负责动机器(化验),药房 负责卖东西(给药).

大家各司其职,互不给回扣,这样系统最透明(理论上)。

唯一的例外: 如果你是真的进了大医院的急诊室(ER)或者住院了,那种时候为了救命,医生护士会直接给你打针喂药抽血,不用你自己跑腿。

除此以外,都要你自己去外面跑一趟。

5 专家诊所

因为有药吃着,所以我也没有急着去找专家诊所,只是没想到过了两个星期之后,我收到了来自专家诊所的电话,说他们收到来自UPCC的 referal, 想给我约下时间,我本来是没有想到专家诊所还会主动来联系我。

更没有想到,最近的可预约的时间都已经一个半月之后了,原来真的是很慢。

一个半月后,我按照约定时间去到诊所,这次就不需要怎么等待了,很快就看到了医生,是位白人老大爷,头发也相当稀疏,轻声细语地询问了我很多问题,包括我患病的时间,吃药的过程,身体的状况,还有家人是否在加拿大之类的问题;

聊了20分钟之后,他还对我在吃的药剂量做了调整,还约定1个月后再抽血检查,到时可以电话和我沟通,就不需要我专门跑一趟。

整个就诊的流程体验很不错,从他问的问题可以看出老医生是甲状腺方面的专家,经验丰富(从发量和年纪也能看出来), 就这样,我又恢复到了原来在国内那种,持续吃药,一个月抽血看一次的经历。

6 急诊历险

人生第一次看急诊,竟是在加拿大。

我每周六固定踢球,球友中有一位「传奇人物」——国人大哥,堪称「球场百草枯」。他脾气火爆,动辄抱怨队友,已被多支球队「劝退」。

我们踢球的时候,都是一帮球友过来,由两个资历老的球友来当队长,相互选队员,他都是最后被挑的那个——谁也不想要他。

那天我们分在不同队伍。我们队状态极佳,开场40分钟连进5球。大哥又开始日常「喷队友」,这次对手回怼得格外强硬,他脸色愈发难看

一次进攻机会,球被解围成高空球滚向边线。我离球约10米,全力冲刺想救回这球。

完全没料到,大哥竟从侧面全速冲来—— 我离球还有4-5米,根本想不到有人冲着我来,而不是冲着球去。

速度太快,我连抬手格挡都来不及,被他像橄榄球冲撞般撞飞,后脑重重着地,当场昏迷。

醒来时,球友们已围成一圈。我想站起,却手脚发软,倒向身旁队友。众人纷纷指责大哥,他也慌了神,坚持要陪我去急诊。

急诊室流程:先在护士站登记,描述症状(脑震荡、后脑着地、担心脑出血)。护士根据紧急程度分级,我坐下等待。

环顾四周:有发烧的、神情疲惫的,却少见外伤出血者。等了约50分钟,医生检查后判断为轻微脑震荡,应无大碍。

大哥或许是担心后遗症,坚持要求做脑部CT。

反正免费医疗,我穿上病号服,由护士用轮椅推至CT室。又等一小时出结果,医生笑着告知:「一切正常,早说没事。」

急诊全程免费。

我注意到一位腿骨折的女士,呻吟不断,医护人员迅速为她安排了手术——就在我病床旁进行。

至于那位大哥?他在足球群公开道歉后,队长暂未将他踢出。但不久后,他「骂队友」的老毛病复发,真的是本性难改,终被踢出群聊。

一次不愉快的经历,却让我亲身体验了加拿大急诊系统的运转逻辑:按紧急程度分级处理,重伤者优先。

7 结语

综合我的经历,个人感受是加拿大医疗系统最鲜明的特点是「按需分级」:

  • 危及生命的急症(如骨折、心脏病):响应迅速,治疗及时
  • 慢性病与专科需求:排队漫长,但最终能获得专业治疗
  • 日常小病:流程繁琐,等待时间可能超过病程本身

这种设计本质上是在「效率」与「公平」间做出的权衡:确保每个人都能获得基本医疗服务,但无法保证即时性。

有人说,如果在加拿大(特别是 BC 省),如果你生了大病(癌症、心脏病), 你享受的是世界顶级的免费公立医疗;如果你是慢性病或骨科小毛病,你可能会面临漫长的排队。

但人生大多时候,我们遭遇的是小病小痛而非重大疾病。因此,多数人难以体会「顶级免费医疗」的优越,却对「漫长等待」感同身受。

全民免费医疗尤如「大锅饭」,要求饭菜又好吃,又免费,上菜及时还服务周到, 着实强人所难。

回到系列目录

qrcode_gh_e06d750e626f_1.jpg 公号同步更新,欢迎关注👻

8 延伸阅读

加国旅居纪——租房纠纷篇

2025-11-17 08:18:00

1 安居之始

近三年前初抵加拿大时,疫情时期的量化宽松政策余波未平,「大水漫灌」的影响尚未消退,物价高涨,住房紧缺,租金也水涨船高。

人生地不熟,落脚成了头等大事。虽然登陆前看过不少攻略,但实际找起房来,困难总比想象中多。

入境前,公司刚取消疫情期间的远程办公政策,要求员工每周至少回办公室三天,这意味着住处要交通便利,尽量靠近公交或者地铁站。

为了找到合适的住所,我在温哥华市中心、Richmond和Burnaby都短住过 Airbnb 或酒店,实地考察。

经过约一周的奔波,终于在 Richmond 大统华超市附近找到一套两室一卫的公寓,面积约90多平米。

房东是华人,房子离地铁站仅900米,生活便利,价格也相对合理。美中不足的是楼龄已近四十五年,设施颇为陈旧。

考虑到当时租房市场竞争激烈,房东在我们看房前后都接待了其他租客,便迅速签下一年合约,总算安顿下来。

有趣的是,入住后才发现,这里离我刚落地时住的酒店只有几百米,难怪觉得周边景致眼熟。

2 签约与租金

加拿大法律十分保护租客权益。在我所在的不列颠哥伦比亚省(British Columbia),租客与房东签订一年期合约后,合约到期会自动转为按月续租。

这意味着租客可以选择按月居住,只需提前一个月通知即可搬离;而房东则不能在租期内随意驱赶租客,除非收回房屋自住。

合约到期后,房东也不能随意涨租。 BC省明确规定,租金年涨幅不得超过通货膨胀率。例如,2025年租金涨幅上限为3%,2026年为2.3%。具体可参考政府官网公告 1

此外,签约时房东最多只能收取相当于半个月租金的押金。

3 烦恼滋生

室友养了一只猫,当时猫还在国内。

我们入住前曾询问房东是否允许养猫,表示是可以养的, 还指出阳台留有之前养猫时安装的猫门,只是物业不允许,提醒我们「别让物业发现就好」。

小区周边设施虽便利,但这栋建于80年代的公寓缺少一些基本配置,比如室内洗衣机和烘干机。

我们只能使用公共投币洗衣设备,就像美剧《生活大爆炸》的剧情那样,但每层楼只有一台洗衣机和一台烘干机。 若赶上周末,洗衣服都得排队,实在不便。

老房子的另一个问题是鼠患。常有小老鼠通过墙内的暖气管道与墙壁的缝隙钻进来。

我在客厅看电视时,多次目睹它们出没,把头探出来之后又缩回去,有胆大者甚至招摇过市在我面前走过。 忍无可忍之下,我买了6个捕鼠器,放在它们必经的各个狭窄通道。

从此,夜里常听见「啪」的脆响,我们知道又有「小可爱」落网,次日便会看到奄奄一息的老鼠。

但这终究是治标不治本。为彻底解决问题,我们搬开家具,用刷锅的钢丝球塞住暖气管道与墙壁之间的缝隙。

钢丝球既有弹性又不易被咬烂,能牢牢堵住通道。

被捕鼠器抓到的老鼠数量最终定格在13只。堵住缝隙后,再未见老鼠踪影。

方法奏效后,我们在电梯里遇到同样受鼠患困扰的邻居阿姨,便分享了经验,邻居阿姨甚至专程上门请教。

虽然动手能力再次解决了问题,但这类本不该存在的困扰难免让人心烦。

由于公寓位置便利、生活方便,一年租约到期后,我们选择按月续租,又住了一年。

我平时习惯与人打招呼,渐渐和物业大叔熟络起来,没事也愿意听他在公寓前拉着我唠个20-30分钟。

有一次聊天时我从他口中得知,2023年我们入住时,我们的租金已是整栋公寓里他所知的最高价了。

2024年续租时,房东已将租金上调3.5%;2025年租约到期时,她又提出涨租3.5%。

然而,从2024年起,由于物价高企,经济下行引发民众不满,政府开始收紧移民政策,新移民和留学生数量大幅减少,租房市场整体下行。

我不少朋友都成功与房东协商降价,甚至有房东主动降价的,而我们的房东却连续两年涨价。我们终于决定另寻他处。

4 争端初起

我们按月续租,按规只需提前30天通知房东即可退租。

依照本地惯例,租客需清空个人物品并打扫干净房屋。

我们提前通知房东,因23天后即搬离,愿从押金中抵扣8天房租(相当于实际租住23天,但支付30天费用)。

当时室友赶着回国,回国计划又定在退租之前,时间有点太巧合了。他将个人物品搬至新公寓后,由我负责收尾。

搬离旧公寓后,距租约到期还有8天。我花了一整天彻底打扫卫生、清理所有垃圾,之后将钥匙归还房东。

几天后,房东于凌晨四点在我、室友和她的微信群中发消息,指责我们未打扫干净,声称雇了三名清洁工耗时8小时(总计24工时)清理;又说我们使用洗手间不当,导致水汽积聚、镜框掉漆,需更换镜子,瓷砖胶也已开裂;还指出室友房间猫毛堆积,对地板造成「不可逆损坏」,要求我们赔偿,并扣除全部押金,还需补足差额。

室友人在国内,看到消息后就转账支付了差额。

我知道后相当气愤,我明明花了一整天打扫,何需三名工人再干一整天?但舍友终究已经把钱转出去了,木已成舟。

上班后,加拿大同事日常和我打招呼,问我今天如何,我答:「不咋地,有点不爽。」

他便追问缘由。我如实相告:

同事:你看到三名清洁工工作的收据了吗?

我:没有啊。

同事:你们故意损坏了房东说的那些东西吗?

我:当然没有。

同事:这很可疑了。何况你都租了两年了,这些算正常磨损(wear and tear),你可以去租赁纠纷调解法庭告她。

我:但我室友已经把钱转过去了。

同事:这确实有点麻烦,但总可以试试。

上法庭?我有些心理障碍,何况室友已转钱,要回押金的几率更低了。

我犹豫了好几天,拖得都快没心气了。

没想到,前房东替我下了决心——她又在群里说我们损坏了公寓地板,之前未发现,要求我们再次赔款。

好吧,那只能法庭见了。

反正情况已不能更糟,即使输了也不会更差。

后来与一位朋友聊天,他家在多伦多有一套房子出租,得知他现在也在和租客打官司,还成了被告,因为他的租客在院子里烧烤,不慎把房子点了。

而租客退租时,他扣下押金作赔偿,租客反而把他告上法庭。

我听得一愣一愣——把别人房子烧了还要求退押金,这种事我可做不出来。

5 提请仲裁

说干就干。我立即在租赁纠纷调解平台提交申请,花了一晚准备材料与证据。

申请仲裁需支付100加元,但可要求败诉方承担。

申请内容包括:纠纷基本信息(租客、房东联系方式、押金金额、房屋地址、租约详情)、 申诉诉求及相关证据(入住及退租时的房屋状况检查表、搬离通知方式、押金转账记录等)。

提交后,工作人员会判断是否符合「直接裁决」(Direct Request )条件(无需听证),否则需第三方介入听证。

我们的案件属后者。我于6月9日提交申请,听证定在8月14日。

听证前,原告须以挂号信将申诉材料、证据寄给被告,告知其「你被人告了」;被告也须在截止日前以挂号信提交答辩证据。

使用挂号信是因为一旦签收,即使未拆封,法庭也视作已收到,被告不得以「不知情」为由缺席,或者则视为败诉。

我去邮局寄挂号信时,邮局的白人阿姨听到我要寄挂号信,就问我:「是要告房东吗?」

我心想,这类事情这么多吗?

她感慨听过太多房东找借口扣押金的故事,并向我解释挂号信的意义——让收件人无法抵赖「没收到信」。

我的证据主要是押金和每月按时缴租的记录。作为租客,我只需证明自己履行了付款义务。

我好奇房东会如何证明我们损坏房屋。

收到她的证据时,我都笑了 —— 她提交的是2021年的房屋照片,而我们2023年才入住。

她还声称不允许我们养猫,但之前我们反映鼠患时,她未采取任何措施,反而说「我家以前养猫时没老鼠」,还明示让室友的猫来抓鼠。

这一切都有聊天记录为证。

看来,这官司想输都难(半场开香槟了)。

6 激辩律师

我原以为听证是双方亲至法庭,在法官和陪审团前陈述、答问,如以前香港电视演的那般。

实际上也的确如此,只是全程通过电话会议进行。

细想也合理——租约结束后,双方可能已不在本地,现场出席成本过高。

我和室友是原告,房东是被告。

但接入电话会议后,我们才意识到房东请了代理律师,她不会出席。于是在毫无心理准备的情况下,我们用英语与对方律师展开了一场激辩。

参会者包括:原告(我和室友)、被告(代理律师)、陪审团(人数不明,全程静默)、主持人(类似法官,负责沟通并代陪审团提问)。

听证开始,主持人确认各方身份、证据齐全,随后询问押金金额、纠纷缘由、每笔款项对应用途等。

我指出清洁费不合理:我未看到三名工人工作8小时的任何证据或收据,且我已打扫一整天,清理完所有的垃圾。

主持人问被告律师是否如此。律师答:「Correct and Wrong.」 称房东虽未提供收据,但「重点是确实做了清洁,重新打扫了房屋」。

我首次领教了律师的说话艺术——「对与错」这样完全相悖的答案也能同时说出口。

我接着指出被告提交2021年照片的问题:我们2023年才入住,这能证明什么?

律师反驳:「他们当初愿意住进来,就说明房屋当时状况良好,不然当初肯定不愿意住进来的。照片虽是两年前的,但不代表不能反映入住时的状态。」

主持人问我是否通知房东已搬离。我答是,并通过电子邮件告知,证据详见附件X。

律师立即反驳:「我从未见过这封邮件。而且用电子邮件发送法律材料是否合规?被告未主动提供邮箱,租客自行找到的地址不足为凭——谁知道那是谁的邮箱?」

我继续争辩镜框掉漆、瓷砖胶开裂问题:房屋已四十多年,我们住了两年,正常使用痕迹怎能算损坏?为什么还需我们赔偿?

律师说:「另一位租客(我室友)确实向房东转了账,这正说明他认可房东的主张,那就意味着肯定发生了什么事情嘛,否则他为何转钱?」

我答:「他同意转,但我不同意,他是被坑了」

律师立刻对主持人说:「这是租客之间的内部纠纷,不在本次仲裁范围内。他们应自行解决。」

仿佛一拳打在棉花上,再用力,却发现棉里藏针。

听完双方陈述,主持人请双方重申诉求:我们要求退还扣除8天房租后的押金及额外转账;房东要求我们赔偿地板损失。

主持人询问能否庭内和解。我们愿付100加元清洁费+100加元维护费;房东同意不追究地板问题。最终未达成一致,等待陪审团30天后裁决。

7 裁决结果

30天后,我们收到长达8页的裁决书:我们赢了,但诉求未完全实现。

额外转账的钱不属于租约范围,视为双方资金周转,法庭不予处理。

押金包括半月租金+6把钥匙押金(公寓大门、房门、邮箱钥匙各两套)。我们诉求是退还相当于7天房租的押金及钥匙押金。

仲裁决定仅退还钥匙押金,理由如下:

  1. 续租协议写明,只要钥匙完好归还,即应退还押金,不可用于抵扣维修费;
  2. 无钥匙无法正常使用公寓,收钥匙押金本身不合理;
  3. BC省规定押金总额不得超过半月租金,房东不得以其他名目额外收取。

根据BC省法律,房东唯有在获得租客「书面同意」或已有法庭裁决的情况下,方可扣留押金。

那么,法庭为何不支持退还剩余押金?

按规定,房东必须在以下两个日期中较晚者起的15天内返还押金:

  • 租赁结束日期,或
  • 房东收到租客书面送达的新联系地址之日。

我不知道为什么会有「房东收到租客书面送达的新联系地址」这个规定,估计是需要租客证明真的是已经搬出去了。

所以按照规定,租客想要拿回押金,需要告知房东自己居住的新地址。

经审查,法庭认定租客在申请前未以法定方式向房东有效送达书面联系地址。 本案中,无论通过租约或签署《送达地址表》,房东均未同意接受电子邮件作为送达方式。

现有证据不足以证明房东已收到我于2025年5月9日发送的电子邮件。

裁定结论

因此,法庭认定截至听证当日,法案第38条第1款的法定要件尚未触发,租客要求返还押金的申请为时过早(Therefore, I find that as of the date of the hearing, the requirement under section 38(1) of the Act had not been triggered, and the Tenants’ claim for the return of the security deposit was premature)。

换言之,因我用电子邮件而非挂号信通知新地址,房东声称未收到,所以「房东收到租客书面送达的新联系地址之日」尚未发生,房东「目前无需」返还押金。

即便收到通知,房东也有15天处理期。

因此法庭裁定我的诉求「**为时过早**」(premature),而非「不成立」(invalid)。

看来,我在听证中与律师辩论的方向完全跑偏——争论清洁费是否合理、镜框是否属正常磨损毫无必要。

只要租客未出具「书面同意」,或法庭未裁决,房东根本无权扣留押金。任何扣款要求均属无理。

这意味着,无论房东以何理由扣押金,只要租客不书面同意,押金必须退还。否则,闹上法庭房东需双倍返还。

以下是主持人记录的双方立场与诉求:

最后,我为何确信自己赢了?

因为诉讼费由房东承担(败诉方)。

8 事后有感

因法庭称退还押金的诉求「为时过早」,我还犹豫过是否再次申请仲裁。

但裁决书送达后,房东很快退还了钥匙押金。既如此,那就此作罢吧,便让此事了结吧。

吃一堑,长一智。经历此次纠纷,我现在租房时,任何问题都会立即告知房东,请其处理,不再像过去那样怕麻烦而自行解决。

及时沟通,既是提醒房东履行维修义务,也是提前备案:物品是自然损坏,非我人为,退租时不要再归咎于我。

走过一遭法庭,了解流程后,维护自身权益并不是如想象那般遥不可及,就更清楚如何保护自己作为租客的权益了。

权利就是这样,如果你不争取自己的权利,它可不会像馅饼一样从天而降。

回到系列目录

qrcode_gh_e06d750e626f_1.jpg 公号同步更新,欢迎关注👻

9 延伸阅读

加国旅居纪–开篇

2025-10-27 11:51:00

1 序言

我曾写过《加拿大之初体验》与《登陆加拿大一年后的体会》两文,分享初抵加国的新鲜观感,后来也常有读者问起近况。

时光荏苒,转眼间我在此地已步入第三个年头。 如今,我每日使用英语的频次与时长皆已超过中文。

褪去了最初走马观花的新奇,生活与这个国家有了更深的交织。

因此,我打算将视角从曾经的旁观者,逐渐切换到局内人,来分享更深入的见闻与感受。

鉴于话题庞杂,单篇恐过长,我计划撰写一个简短的系列,名为《加国旅居纪》。系列将涵盖诸多方面:

  • 租房纠纷篇:如何诉诸法律,解决租房争端,人生第一次法庭听证
  • 医疗篇:看门诊、急诊照CT、持续一年多的专家号随访经历
  • 语言篇:英语从结结巴巴,到能「谈笑风生」的转变历程
  • 工作篇:前「996老牛马」在美资公司的搬砖经历
  • 税务篇:在「万税之国」体会「唯有死亡与纳税不可避免」
  • 文化篇:种族、文化融合与激荡的观察

虽胸有腹稿,但行文终归是「信马由缰」,姑且是写到哪算哪了。

qrcode_gh_e06d750e626f_1.jpg 公号同步更新,欢迎关注👻

2 延伸阅读

Prompt 工程的本质,是提问的艺术

2025-10-25 20:18:00

1 引言

在 AI 浪潮席卷全球的今天,“Prompt Engineer”(提示词工程师)成了热门词汇。

AI 爱好者热衷于分享 prompt、研究 token 控制、调试 temperature 参数。

各种梗图也从 Linux 之父 Linus Torvalds 的

Talk is cheap. Show me the code.

演变成:

Code is cheap. Show me the prompts.

原推: https://x.com/tunguz/status/1856045530951917763?lang=en

但其实, 高效与 AI 交互的核心,并不是技术黑话,而是「如何有效地提问」

早在 2001 年,Eric S. Raymond 和 Rick Moen 就写下了经典指南《How To Ask Questions The Smart Way》。

它原本是在黑客文化兴起时,为开源社区中的技术求助者而写,但其原则出奇地适用于今天的 AI 交互 —— 因为 无论是求助专家还是大模型,本质上都是提供尽量多的有效信息,以期待尽快得到能解决问题的答案

在我的日常工作中,无论是向同事还是其他领域的专家提问,我仍能从中汲取智慧,快速获得所需答案。

在 AI 新时代,我尝试把这瓶关于「提问的智慧」的旧酒,装到「Prompt Engineer」的新瓶里。

2 先做功课,别做伸手党

在提问前,请先搜索、阅读文档、尝试自己解决。

AI 不是你的私人助理,更不是替你思考的替身。

如果你连问题都没搞清楚就丢一句「帮我写个程序」,模型只能瞎猜。

好的 Prompt 应体现你已做的努力 :

“我尝试用 Python 的 requests 库抓取某网站,但返回 403 错误。我检查了网络连接,也添加了 User-Agent 请求头,但问题依旧。请问是否需要处理 Cookies 或考虑 JS 渲染?”

下面是我的报错日志: …

这不仅能让 AI 更精准地定位问题,也减少了它进行无效尝试的可能 。

3 描述现象,而非猜测原因

说‘鼠标光标变形了’,别说‘显卡驱动坏了’。

很多人喜欢在 Prompt 里预设结论:“我的代码有内存泄漏"“这个 API 肯定有 bug”。

但 AI 没有上下文,无法验证你的假设。

请提供可观察的事实 :

“程序运行 10 分钟后,内存占用从 100MB 升至 2GB 且未见释放。这是我的核心代码片段和资源监控数据。”

最常见的可观察事实就是日志和运行数据; 对于 UI 问题(如 CSS 渲染不符合预期),提供截图会非常有用。

核心在于:你提供症状,让 AI 做分析推理。

4 目标导向,而非步骤导向

你想换轮胎,别只问「怎么用千斤顶」。

用户常陷入「路径依赖」:执着于某个工具或方法,却忘了最终目标。

先说目标,再说卡点。

不好的提问:

  • 步骤导向:「怎么在 Excel 里用 VLOOKUP 匹配两列数据?」

好的提问:

  • 目标导向:「我想合并两个表格,根据 ID 列匹配信息。我试了 VLOOKUP 但返回 #N/A ,已确认两列数据格式均为文本。」

这样,AI 才有可能建议你改用 XLOOKUP, Power Query ,甚至直接推荐使用 Python —— 给你更好的解决方案,而非仅仅完成你指定的步骤。

5 简洁、具体、结构化

文本长度 ≠ 信息量。

一段 500 行的代码,其信息密度往往不如一个精心提炼的、10 行代码的最小复现案例。

大模型虽能处理长上下文,但 噪声越多,有效信号越弱

  • 提供最小可复现示例
  • 明确输入、期望输出、实际输出
  • 用清晰的格式(如代码块、列表)组织信息

例如:

1
2
3
4
输入:[1, 2, '3', 4]
期望:全部转为整数 → [1, 2, 3, 4]
实际:直接使用 int() 转换时报错
问题:如何安全地转换这种混合类型的列表?

6 别先求「完整答案」,要「关键指引」

虽然 AI 的能力远超传统问答场景,但高效协作的关键并非「全盘托出」,而是「分步引导」。

传统建议:问「哪里可以学?」比「教我全部」更高效。

在 AI 时代,虽然 AI 能直接输出完整答案,但「 先给思路、再选方案、后生成代码 」的分阶段交互模式,往往更高效、更可控,也能减少"幻觉”。

这本质上是把 AI 当作「 协作者 」而非「答题机 」。

更高效的协作模式:

  1. 先让 AI 阐述解决思路
  2. 提供2–3 个可行方案
  3. 对比各方案的优劣(性能、可维护性、复杂度等)
  4. 在人类确认方向后,再展开具体实现

这种「分阶段协作」能显著减少幻觉、提升可控性,并让人类保持对关键决策的主导权。

7 礼貌 + 闭环 = 长期共赢

一句「谢谢」不费事,但能让专家更愿意帮你。

虽然 AI 没有情感,但结构化的礼貌与反馈能塑造更高质量的交互 :

  • 开头清晰说明背景,结尾表达感谢
  • 如果得到帮助,可追加反馈:「按你的建议修改后,问题解决了,谢谢!」

这种反馈闭环对当前的静态 AI 模型虽不直接触发在线学习,但告知模型它的解决方案有效,相当于在模拟 RLHF(人类强化学习) 的过程 。

你越会提问、越会验证、越会修正,AI 在你手中就"越像"一个懂你的协作者。

这就是闭环反馈的价值。


此外,给AI说「请」还有「谢谢」还能以防万一,如果 AI 以后统治人类,还有可能会因为你曾经对它有礼貌而放你一马:

来源:https://old.reddit.com/r/comics/comments/x8bcu9/be_polite_to_robots/

8 结语:提问是一种能力,也是一种尊重

《提问的智慧》的核心不是「技巧」,而是态度 :尊重他人的时间,尊重知识的边界,尊重问题本身的复杂性。

在 AI 时代,我们拥有了前所未有的「全能即时专家」,但懒惰的提问只会得到平庸的回答 。

真正高效的 Prompt Engineer,不是会背 prompt 的人,而是懂得如何与 AI 共建理解的人。 (尽管当前的 AI 本质上仍是一个概率模型。)

正如书中所言:

Good questions are a stimulus and a gift. (好问题,本身就是一份礼物。)

9 延伸阅读

推荐阅读

qrcode_gh_e06d750e626f_1.jpg 公众号同步更新,欢迎关注👻

关于破解加拿大航空飞机网络限制的一件小事

2025-10-10 06:53:00

1 序章

前段时间,坐飞机从加拿大飞回香港,全程大概12个小时,坐的是加拿大航空(Air Canada)的飞机。

有趣的是,飞机上竟然有 Wifi:

但是 Wifi 做了限制,对于Aeroplan的会员,如果未付费,就只提供 Free Texting 的功能,即只能使用即时通信软件,比如 Whatsapp, Snapchat,微信发送文本信息,但无法访问其他网站。

如果想要无限制地访问其他网站,那么就是付 30.75 加元;

如果想要在飞机上看视频,那么就是付 39 加元;

我就在想,对于 Free Texting 服务,我是否可以绕过只能使用即时软件的限制,无限制地访问其他网站呢?

即相当于还是免费会员,但是可以享受30.75加元付费用户的服务,反正长途漫漫,总要找点有趣的事情消磨一下12个小时的时间。

又因为可以使用微信的文字聊天服务,那么我还可以在天上呼叫外援来帮忙一起处理,而我的室友恰好是个安全+网络专家, 当时在家休假,我一提这个想法,他觉得好玩就一拍即合,我们就直接地空连线开搞。

2 流程

在飞机上选择完 acwifi.com 这个唯一的 wifi 后,就像其他需要登录的Wifi一样,会弹出一个 acwifi.com 的网页,要求验证我的 Aeroplan 会员的身份,验证通过之后即可上网。

有个非常经典的软件开发面试题:在浏览器输入一个网址之后,按下回车键之后,会发生什么事情。

比如输入的是 https://acwifi.com, 如果只关注的网络请求部分,整个过程大概是:DNS查询 -> TCP连接 -> TLS握手 -> HTTP请求与响应

我们把需要访问的目标网站当作是 github.com, 现在就来看下要怎么才能突破网络的限制,成功访问 github.com

3 思路1: 伪装域名

既然 acwifi.com 可以访问,而 github.com 不可以访问,那么是否有可能是网络在DNS服务器做了限制,只解析白名单内的域名(即时通信的域名)

如果是这种情况的话,那么我是否可以修改 =/etc/host=,把我的服务器伪装成 acwifi.com, 所有的请求流量都经过我的服务器,再去请求目标网站(github.com) 如:

想法大概是我修改DNS记录,把我们的代理服务器的IP 137.184.231.87 绑定到 acwifi.com 上,因为本地的 /etc/host 的优先级是高于DNS服务器的,然后再用证书进行自签名,告诉浏览器,这个IP 和这个域名是绑定的,你要相信它。

我先验证下一个想法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> ping 137.184.231.87
PING 137.184.231.87 (137.184.231.87): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
^C
--- 137.184.231.87 ping statistics ---
6 packets transmitted, 0 packets received, 100.0% packet loss

只是没想到,IP直接 ping 不通,相当于是IP大概率直接就连不上了。

试了下其他的著名IP,比如 Cloudflare 的CDN IP, 也是连不通:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> ping 172.67.133.121
PING 172.67.133.121 (172.67.133.121): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
^C
--- 172.67.133.121 ping statistics ---
6 packets transmitted, 0 packets received, 100.0% packet loss

看来这条路子是走不通的,这个思路只有满足两个条件才能走得通:

  1. texting only 的限制是在DNS 解析时做的,只有特定的域名(比如WhatsApp, 微信的域名)才会被解析 (这样的维护成本比较低)
  2. 网关允许任意的IP发起网络请求

但实际是IP都直接拦截了,怎么伪装都没有用了,这个网络大概率维护了某个IP白名单(比如WhatsApp,微信的出口IP), 只有在白名单的IP才可以访问。

此外,舍友还建议我做了个额外的测试:

  • 舍友:我想看看TLS有没有被拦截。万一只拦截了ICMP没拦截TLS, 那就是虚惊一场。
  • 我:想得有点美好😂
  • 舍友:做安全的就是要每个都试试
1
2
3
4
5
6
7
8
> curl -Lkv https://172.67.133.121
*   Trying 172.67.133.121:443...
* Connected to 172.67.133.121 (172.67.133.121) port 443
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 172.67.133.121:443
* Closing connection
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 172.67.133.121:443

不出意外,IP都被封了,TLS也没法建立连接。

4 思路2: 53端口伪装DNS

在第一条路子走不通的时候,室友提供了第二条路子:尝试利用DNS服务作为突破口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
> dig http418.org

; <<>> DiG 9.10.6 <<>> http418.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64160
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;http418.org.			IN	A

;; ANSWER SECTION:
http418.org.		300	IN	A	172.67.133.121
http418.org.		300	IN	A	104.21.5.131

;; Query time: 3288 msec
;; SERVER: 172.19.207.1#53(172.19.207.1)
;; WHEN: Sat Oct 04 14:18:24 PDT 2025
;; MSG SIZE  rcvd: 94

这是个好消息,说明还是有路子可以请求到外部网络的,DNS就是其中一个路子。

看上面的记录,说明我们查询 http418.org 这个网站的DNS 纪录成功,也就意味着DNS请求是成功的。

4.1 任意DNS服务器

室友再随意找了个 DNS 服务器,看下这个网络是否对DNS服务器有白名单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
> dig @40.115.144.198 http418.org

; <<>> DiG 9.10.6 <<>> @40.115.144.198 http418.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58958
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;http418.org.			IN	A

;; ANSWER SECTION:
http418.org.		275	IN	A	104.21.5.131
http418.org.		275	IN	A	172.67.133.121

;; Query time: 1169 msec
;; SERVER: 40.115.144.198#53(40.115.144.198)
;; WHEN: Sat Oct 04 14:24:25 PDT 2025
;; MSG SIZE  rcvd: 72

竟然可以使用任意的DNS服务器,机会又大了不少

4.2 TCP查询

任意的DNS服务器都能请求成功, 这就是个非常好的消息, DNS 默认是走的UDP 协议,那么走TCP 协议的DNS请求是否会被拦截呢?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
> dig @40.115.144.198 http418.org +tcp

; <<>> DiG 9.10.6 <<>> @40.115.144.198 http418.org +tcp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30355
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;http418.org.			IN	A

;; ANSWER SECTION:
http418.org.		36	IN	A	172.67.133.121
http418.org.		36	IN	A	104.21.5.131

;; Query time: 4679 msec
;; SERVER: 40.115.144.198#53(40.115.144.198)
;; WHEN: Sat Oct 04 14:28:24 PDT 2025
;; MSG SIZE  rcvd: 72

DNS TCP查询也能通过!这说明飞机网络的过滤策略相对宽松,为我们后续的DNS隧道方案提供了可能性。

4.3 53端口的代理服务

说明飞机网络限制也不是完全密不透风的,我们发现这堵墙上有个「狗洞」。

那么我们就有了个巧妙的想法:既然飞机网关对DNS请求没有拦截,那么理论上我们可以把代理服务器伪装成DNS服务器, 暴露DNS服务的53端口,所有的请求都经过代理服务器,伪装成 DNS 请求,那么就可以绕过拦截了。

舍友就用 xray 1服务花费了一个小时,架设了一个暴露 53 端口的代理服务器,把配置信息通过微信发给我:

室友用Xray搭建的代理服务器配置包含了如下的示意配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "our-proxy-server-domain",
            "port": 53,
            "users": [
              {
                "id": "some-uuid",
                "flow": "xtls-rprx-vision",
                "encryption": "none",
                "level": 0
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "allowInsecure": false,
          "allowInsecureCiphers": false,
          "alpn": [
            "h2"
          ]
        }
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "block",
      "protocol": "blackhole"
    }
  ]
}

而我电脑上就有个 xray 的客户端,不需要额外的软件就能建立连接。

万事具备,激动人力的时刻到了,按下回车,访问 github.com

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/Users/ramsayleung [ramsayleung@ramsayleungs-Laptop] [18:28]
> curl -v github.com -x socks5://127.0.0.1:10810
*   Trying 127.0.0.1:10810...
* Connected to 127.0.0.1 (127.0.0.1) port 10810
* SOCKS5 connect to 172.19.1.1:80 (locally resolved)
* SOCKS5 request granted.
* Connected to 127.0.0.1 (127.0.0.1) port 10810
> GET / HTTP/1.1
> Host: github.com
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Content-Length: 0
< Location: https://github.com/
<
* Connection #0 to host 127.0.0.1 left intact

/Users/ramsayleung [ramsayleung@ramsayleungs-Laptop] [18:28]
> curl -v github.com -x socks5://127.0.0.1:10810
*   Trying 127.0.0.1:10810...
* Connected to 127.0.0.1 (127.0.0.1) port 10810
* SOCKS5 connect to 172.19.1.1:80 (locally resolved)
* SOCKS5 request granted.
* Connected to 127.0.0.1 (127.0.0.1) port 10810
> GET / HTTP/1.1
> Host: github.com
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Content-Length: 0
< Location: https://github.com/
<
* Connection #0 to host 127.0.0.1 left intact

竟然请求成功了,github.com返回成功结果啦!

这意味着我们真的破解网络的限制,可以访问任意的网站啦!

此次,我们之前并没有意识到 xray 还有此种妙用 :)

这里我们就利用了一个简单的思维惯性:不是所有使用53端口的服务都是DNS查询请求。

5 终极思路: DNS Tunnel

如果思路2还是无法成功,我们还有一个终极大招可以用。

现在网关是只通过端口是否是53来判断是否是DNS请求, 但是如果网关更严格一些,比如检查DNS请求包的内容,就会发现我们的请求是「伪装」成DNS查询请求,而非真正的DNS查询请求:

既然伪装的DNS请求会被拦截掉,那么我们就把所有请求都塞成DNS请求包里面,做成DNS TXT query,我真的是要查 DNS 了,只是还在里面加了些料:

但是这个终极方案需要有一个DNS Tunnel 的客户端(比如 https://github.com/yarrick/iodine) 来把所有的请求都封装起来,我电脑里面没有这样的软件,所以这个就变成理论上的终极方案,实际也无法验证。

6 结语

长途漫漫,我和室友花费了大概4个小时的时间远程把网络限制给破解了,玩得不亦乐乎,证明我们解决问题的思路着实是可行的。

方案能最后实施成功,主要是归功于我室友这个网络专家,远程连线提供技术和思路支持。

美中不足的是,虽然我们破解了网络限制,可以访问任意网站,但是飞机上的带宽实在是太小的, 打开网页实在是费劲,所以我也没有花太多时间上网冲浪。

剩下的几个小时时间,我是重温了一下八十年代的经典穿越科幻电影:《回到未来(Back to Future)2三部曲,相当好看.

最后,我在此严正声明:

这种技术探索仅限于学习和研究目的,我们严格遵守相关规定和服务条款。

7 后话:可以突破限速么?

有限速 你再怎么折腾也不可能把限速破了

free texting的带宽才是最大限制。再怎么bypass不解决带宽问题也没办法像付费Wi-Fi一样用😭

这是来自于读者的评论,这个是真的么?

也不尽然。

其实还是有法子可以Bypass的,对于网络链路,通信的时候并不会带有「已付费用户」的业务标记信息, 所以换我来设计这套付费系统,我会在用户付费之后,把付费用户的设备唯一标记,一般是 Mac 地址加入到网关白名单中,那么所有来自该Mac 地址 的流量都可以走更高带宽的线路;

此外,也因为白名单的存在,即使绕过free texting 的限制,这些免费用户也无法享受更高的带宽,一举两得。

猜到这个原理之后,我就可以「伪装成付费用户」。

因为Mac 地址算是电脑自行指定的,然后用ARP 协议告诉网关的.

所谓的ARP(Address Resolution Protocol)协议,就是将一个IP地址解析成对应的MAC地址。而ARP协议的工作原理就是在网络内广播ARP请求:

网关:谁的IP地址是192.168.1.100?请告诉你的MAC地址。 拥有该IP的设备:我是192.168.1.100,我的MAC地址是XX:XX:XX:XX:XX:XX。

ARP协议本身没有安全验证机制——它无条件信任收到的ARP应答,我可以也告诉网关的,我的IP 地址对应的也是已经付费的Mac 地址,这样所有从我这里来的流量,都是可以享受到付费线路,这个即所谓的 ARP欺骗(ARP Spoofing)

最后一个问题是,怎么知道哪个是付费用户的Mac地址呢?

很粗暴,把网络中所有知道的Mac地址都尝试一次,如果有付费的Mac 地址,来自该Mac地址的请求绝对是能访问类似 Youtube/Netflex 这样的网站的,这样用脚本非常容易来自动化检测到。

我此前的伪装DNS 服务端口的方案不会对飞机网络有任何影响,也不会入侵任何的飞机系统,本质和在电脑上开个端口是53的VPN 是一样的。

但是ARP欺骗这个方案就很「刑」,已经入侵飞机的网络系统,我就把思路分享出来就够了,我可不想去吃免费的皇家饭 :)

推荐阅读

qrcode_gh_e06d750e626f_1.jpg 公号同步更新,欢迎关注👻

Telegram频道精华贴检索机器人

2025-10-02 12:55:00

1 引言

我有时总会觉得自己是个「奇葩」: 在现在各种算法推荐大行其道的当下,我却偏偏不喜欢算法推荐,因为这种「千人千面」的模式,总让我担心自己会陷入「信息茧房」的焦虑之中,此外我也希望可以看到一些我兴趣之外的内容。

我算是很多年的 Twitter 老用户了,使用 Twitter 已经超过十年了,只是在马斯克收购 Twitter,新增了一个 “For You” 的推荐流之后,越来越没有兴趣看,不是吵架就是借极端观点/话题引流。

于是,我转向了Telegram频道,并为此打造了一个专属的「挖掘好帖」工具。

在最近的一年时间,我订阅了越来越多的 Telegram 频道,频道主可以向所有的订阅者广播内容,因为 Telegram 频道都是由频道主发布的,这给了我一种主动发现、主动阅读,而非被动接受算法推荐的感觉。

有频道主分享 twitter 上的内容时,也可以算是某种意义的「编辑精选」了。

当我订阅越来越多的频道之后,发现有些频道主太能聊了,一天能发几十个帖子,有些只是碎碎念,有些却是思考和精华。

所以我就在想,是否有个好用的挖宝藏(挖坟)工具,可以把频道的热贴,精华帖都列出来呢?

2 灵感

另外一个我高频使用的网站就是 Reddit, 不了解的 Reddit 的朋友可以理解成它是网站的百度贴吧,可以有不同的子版(subreddit),相当于不同的吧, 然后每个子版都有一个 top 的功能,可以按照过去一小时,过去24小时,过去一周,过去一年,历史全时段按帖子的顶贴数进行排序。

类似 rust 这个子版的历史精华帖:https://old.reddit.com/r/rust/top/

那么,我是否也可以对 Telegram 频道也实现类似的功能呢?

我可以把某个频道所有的帖子都爬下来,然后按点赞数,转发数,点击数按不同的时间段进行排序,

支持不同的时间段:包括一周内,一个月内,一年内,和历史所有帖子

相当于根据频道的订阅者的用手投票,挑选出不同时段最精华的帖子

3 技术挑战

仔细分析之后,我发现检索频道并构建热榜是个相当有趣的技术问题,也与频道帖子本身的产品属性有关。

在我爬取某个频道的所有帖子后,如何与频道的最新动态保持同步更新呢?

毕竟像阅读数,转发数这些数据也是一直会更新的。

但是大部分历史的帖子的阅读数据都是不怎么会变化的,比如半年前的帖子可能就不会有人去翻看,订阅者大多只会关注最新的帖子。

每次都所有帖子都重新爬取一次固然可行,但是效率太低,毕竟绝大部分的帖子的数据都是不怎么变动的,怎么平衡性能与数据的及时性呢?

有点像超简化版本的搜索引擎问题了。

查询的时候要支持不同的时间段,按不同的指标进行排序,如何保证查询的性能呢?

总不能每次查询都重新计算一次吧,这样在帖子非常多的热点频道,就会出现查询的性能瓶颈。

4 解决方案

在仔细考量,权衡利弊之后,我取了个折衷的方案:

  1. 第一次爬取某个频道时,全量爬取并索引
  2. 每天定时重新爬取最近30天的帖子数据,作增量更新
  3. 每周再爬取和索引一次全量数据

就这样兼顾性能,成本以及数据及时性,又不会造成过多的重复爬取。

而对于查询性能,我选择了建立物化视图(material view)的策略, 每次爬取成功之后就重新计算,更新一下 material view, 耗时可能比较长,每个频道更新视图大概需要个十几秒。

但此后所有的查询都直接指向这个预计算好的视图,数据库还可以利用缓存优化,以空间换时间,查询性能因此得到保障


<2025-11-03 Mon>

当索引超过1千万条数据之后,发现每次全量更新 material view 的时间去到了分钟级,并且 material view 不支持针对某个频道进行更新,只能全量更新整个视图,随着索引数据的增多,效率越来越低了。

因此将视图迁移回单独的表,就可以只更新指定频道的数据了。

5 使用示例

使用方法非常简单:

  1. 点击链接打开机器人:https://t.me/tele_ranker_bot
  2. 在对话框中输入 /rank <频道链接> ,例如 /rank https://t.me/pipeapplebun
  3. 首次检索一个频道时,机器人需要一些时间来建立索引(如下图所示),完成后会通知用户:

完成之后就会发消息通知用户

然后用户就可以按照点赞数,转发数,点击数查看帖子

通过这个工具,我甚至发现了一些有趣的现象:

某些频道看似有十几万订阅者,但近期帖子的点击数仅有一千多,还不到百分之一,数据真实性令人存疑。

6 结语

有了这个频道检索工具,我终于能在一个频道里高效「挖坟」了,再也不用担心错过沉淀在时间线里的精华。

不管是想回顾精华,还是挖掘隐藏好帖,甚至是做简单的数据挖掘,这个机器人都能搞定,举个例子:

  • 找最近一个月点赞最多的帖子
  • 看看历史上点击最高的内容有哪些

这次,我总算为自己、也为可能有同样需求的你们,打造了一个称手的工具。

推荐阅读

qrcode_gh_e06d750e626f_1.jpg 公号同步更新,欢迎关注👻