作者: 锦明

  • 香港同事不敢来大陆总部

    公司今年在香港新设了研发点,招了几位新员工。大部分是大陆过去在香港工作的,有一位是香港土著。

    按照事先定好的制度,所有香港同事都要先到大陆总部这边试用三个月,主要是为了团队磨合。其他员工都没问题,就那位香港土著不愿意,给的理由是家里有老母要照顾。我们表示理解,最后协商下来他只要来一个月就行了。

    所有外地来总部试用的员工,公司都会在园区内安排住宿,条件不错,一般是单人间,而且走几步就上班了,很方便。

    大部分新人来之前听HR介绍后都很乐意地接受了,就这位香港土著问了很多问题,比如有没有网络?有没有热水?可不可以洗热水澡?就感觉很焦虑,很不放心。

    后来了解到,他一开始真的觉得大陆现在生活水平还很差,估计他不想待三个月也是这个原因。

    这是他自己说的。当时他已经来大陆总部快满一个月了。我们找他例行访谈,他说得最多的就是想不到这边生活条件这么好,完全超出他想象!办公环境一流,住宿也很棒,宽敞又舒适,比他在香港住得舒服多了!

    他说唯一感到不方便的是他没有大陆手机号,很多事情干不了,例如点外卖什么的。不过他和别的同事一起凑单点过几次外卖,很方便很好吃!

    他很震惊,我们同样很震惊!我们震惊的是他一个香港大学本科生,居然也信息闭塞到这种程度,至今还以为大陆人民生活在水深火热中。由此可见香港那边的土著对于祖国大陆有多么深的误解,信息多么的片面。香港都回归快三十年了,居然还这样子。

    由此我想到那些欧美国家的老百姓,他们对现今中国的了解是不是要更糟糕?所以有时候和他们沟通时感受到的莫名其妙的优越感也就可以解释了。

    不过话说回来,这位香港土著还是挺好沟通的,工作认真,待人接物也挺热情,是个好相处的同事。下次让他再来大陆总部应该不会害怕了吧😂

  • 吃野喂云南菜馆

    大宝赚了兼职第一笔桶金300大洋,请客吃饭。她找了家叫“野喂”的云南菜馆,味道不错!

    点的鸳鸯锅,其中黄色那边是见手青汤,一种没煮熟时会有毒的菇,据说中毒后会看见小人跳舞😱

    锅底上来后服务员摆了一个沙漏,说十五分钟后才能吃。时间到了大宝不放心,又把沙漏倒过来,说再等十五分钟…

    这见手青的汤确实鲜美啊!喝了两碗后,不知是心理作用还是咋的,头晕晕的😵‍💫 大宝说,她查资料说中毒要几个小时才会出现症状。好吧,看来是我多虑了😂

  • 封狼居胥

    这两天在看《趣说汉朝》这本书,写得不错,有趣不啰嗦。

    当写到霍去病时,原本熟悉的名字居然有那么多事情我是不知道的,低贱出身,英勇善战,在大漠草原奔袭千里追杀匈奴,然后又在二十三岁英年早逝。

    这些我之前都不知道,只知道霍去病这个名字有点奇特,甚至有点搞笑。去病,却这么年轻就得病死了。

    但那句:

    封狼居胥山,禅于姑衍,登临瀚海

    着实震惊到我了。那种恢宏的气势,给人一种天降天神、叱咤于人间的英雄气魄,非常震撼。

    此后封狼居胥就成了中国武将最崇高的目标。据考证,此山就是现在蒙古国内的肯特山。

  • 阿啾上小学已三周

    转眼开学已经三周多了,马上要中秋加秋假加十一长假共十三天的超长假期。

    想着刚开学大家都很兴奋,全家陪着。

    开学校门口

    这三周从一开始的手忙脚乱到现在慢慢开始有了节奏,我们家也算是经历过了。

    班主任周老师和语文老师瞿老师也保持了沟通。阿啾有些长进,但还是很皮。最好笑的是上周居然把学校的厕所门给拆了😅

    看家长微信群,这段时间手忙脚乱的不止我们,好多家长问东问西,还不如我们呢。

    但也有表现不错的,小啾还需要好好学习认真听话!

    教室座位
  • 群晖自建个人域名邮件服务

    如何用 MailPlus 搭建自己域名的邮件服务呢?这几天花了点时间走通了,把方法分享给大家。

    前提条件:

    1. 一个自己的域名。我在阿里云上买了一个。
    2. 一个公网 IP 地址。我同样在阿里云上 99 元买了一个 2 核 2GB 内存 3M 带宽的 ECS。

    大概步骤如下,后面有进一步解释:

    1. NAS 上在 MailPlus Server 里配置自己的域名。
    2. 在域名上配置解析。
    3. 云服务器上配置流量中转服务。
    4. NAS 上配置流量中转客户端。
    5. 在阿里云邮件推送服务平台上配置发件账号。
    6. 在 MailPlus Server 那里配置邮件投递的中继设置。

    先声明下,整个配置过程涉及细节较多,我尽可能把重要的环节记录下来,难免疏漏,大家按步骤多试试,不清楚的可以在评论区讨论,也可以问问 AI(我就是这么搞通的),总会成功。

    本文针对的是没有公网 IP 地址的情况,比如笔者家里装的是移动宽带,就没有公网 IP(移动宽带是一个巨大的 NAT 网络)。如果你有公网 IP 地址,那恭喜你,配置非常简单,就只需要做前两步即可(不过你家里的路由器上可能需要配置一些端口映射)。

    特别需要注意的是,没有公网 IP 地址的时候,不能从 NAS 上直接往外发邮件,会极大概率被对方邮件服务器识别为垃圾邮件,丢垃圾桶甚至直接删除。

    第 1 步:配置 MailPlus Server

    假设你的域名是 example.com。如下图将自己的域名填进去。用户那里添加你允许的账户,例如你给自己分配了一个叫 admin@example.com 的邮箱:

    MailPlus Server 域名设置
    MailPlus Server 添加用户

    第 2 步:配置域名解析

    添加下面这些解析:

    1. 一条 A 类型,mail.example.com,指向你的公网 IP 地址,我这边配置成指向购买的 ECS 公网 IP 地址。
    2. 一条 MX 类型,主机记录:@,记录值:mail.example.com。
    3. 三条 TXT 类型:主机记录:@,记录值:v=spf1 include:[地址] -all,如果你有公网 IP 地址,则”[地址]”就填 IP 地址,否则填 spf1.dm.aliyun.com;主机记录:default._domainkey,记录值:v=DKIM1; k=rsa; p=[DKIM 公共密钥];主机记录:_dmarc,记录值:v=DMARC1; p=quarantine; rua=mailto:[你的一个邮箱]。

    DKIM 公共密钥在 MailPlus Server 里,在域名配置那里点击”高级设置”就能看到,如下图把它拷贝下来,填到主机记录里:

    MailPlus Server DKIM 高级设置

    第 3 步:ECS 上配置中转服务

    我们用 frp。下载 frp 后,在 ECS 上运行服务端 frps,配置如下:

    # frps.toml
    bindPort = 7000
    auth.method = "token"
    auth.token = "你的强密码"

    然后用下面的命令运行:

    nohup ./frps -c frps.toml > frps.log 2>&1 &

    nohup 是为了让 frps 能以后台进程的方式一直运行。

    阿里云安全组配置如下:

    1. TCP 7000 → 来源 NAS 公网出口 IP/32(不要对 0.0.0.0/0 开放)
    2. TCP 25, 993, 995, 443 → 来源 0.0.0.0/0

    第 4 步:NAS 上配置流量中转客户端

    使用 frpc,配置如下:

    # frpc.toml
    serverAddr = "47.96.67.98"
    serverPort = 7000
    auth.method = "token"
    auth.token = "你的强密码"
    [[proxies]]
    name = "smtp-25"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 25
    remotePort = 25
    [[proxies]]
    name = "imaps-993"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 993
    remotePort = 993
    [[proxies]]
    name = "pop3s-995"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 995
    remotePort = 995
    [[proxies]]
    name = "webmail-443"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 443
    remotePort = 443

    最好用 Docker 运行 frpc,我偷懒直接命令行脚本运行了,然后通过计划任务让 NAS 每次启动时自动运行这个脚本。

    第 5 步:配置阿里云邮件推送服务

    前面说了,如果你没有公网 IP 地址,不能直接从你的 NAS 上往外发邮件,很容易被对方邮件服务器识别为垃圾邮件。怎么办呢?刚好阿里云有一个邮件推送服务,每个账号每天有 2000 封邮件的额度可以发,一般用用足够了,地址:dm.console.aliyun.com。

    发信域名那里按照提示将自己的域名添加并验证通过。然后在发信地址那里新建发信地址。注意发信类型选择”触发邮件”。然后设置好 SMTP 密码:

    阿里云邮件推送发信地址配置

    第 6 步:配置邮件投递的中继服务

    最后一步,回到 MailPlus Server,配置邮件投递的中继服务:

    MailPlus Server 中继设置

    注意,阿里云邮件推送服务的端口是 80,这个不要搞错!

    好了,顺利的话到这里你就可以登录 MailPlus 客户端网页用 admin@example.com 收发邮件了:

    MailPlus 网页客户端撰写邮件

    给其他用户分配域名邮箱

    如果就自己用的话,到这里就搞定了。但是如果你想给 NAS 其他用户也分配自己域名的邮箱,例如 test@example.com,该怎么办呢?

    如果只在 MailPlus Server 上配置是不够的,因为阿里云邮件推送服务会严格校验发件人地址是否在已知的发件人列表中(还记得第 5 步里我们只配了 admin@example.com 吗?),如果不在,则直接拒绝,用 test@example.com 发出去的邮件就会卡在本地发送队列里,对方收不到。

    解决办法分两步:

    第一步,在阿里云邮件推送管理网页上再配一个发件地址:

    阿里云邮件推送新增发信地址

    第二步,在 MailPlus Server 上添加一个中继例外规则:

    MailPlus Server 中继例外规则

    这样当用 test@example.com 发邮件时,该条中继例外规则就会被命中,MailPlus Server 就会用专用的阿里云邮件推送服务账号来发送。

    每分配一个新的自己域名的邮箱,都需要按照上述两步配置一下。

    好了,在 MailPlus Server 上配置自己域名的邮箱服务就介绍到这里,你配置成功了吗?

  • 在Synology Chat里添加一个聊天机器人

    想在Synology Chat里添加一个自定义聊天机器人,该怎么弄呢?今天这篇文章以一个简单 echo 应答机器人为例,教大家怎么弄。

    第一步,在Chat里新建一个机器人。

    右上角点击“整合”,然后“机器人”,再点击“创建”,创建一个新机器人:

    注意把“在聊天机器人列表中隐藏”给勾掉,不然就不能和这个机器人聊天了。

    Synology Chat是用webhook的方式来实现机器人通信的,上图中“传出URL”就是当有人在Chat里给机器人发消息时,Chat就会把信息通过调用“传出URL”发出去。“传入URL”则是给机器人给用户回复消息用的,也就是说我们在机器人的实现代码里通过调用这个URL实现给用户返回数据的效果。“令牌”则用于验证合法性,调用时必须带上。

    第二步,准备一个Python脚本,这是聊天机器人的主程序,把令牌和“传入URL”填进去:

    import json
    import os
    import threading
    from datetime import datetime
    import requests
    from flask import Flask, request
    
    application = Flask(__name__)
    
    # ====== 配置区 ======
    OUTGOING_TOKEN = "机器人令牌"
    INCOMING_URL = "传入URL"
    # ===================
    
    def push(text: str, user_id: str):
        payload = {"text": text, "user_ids": [int(user_id)]}  # 关键:user_ids 是整数数组
        resp = requests.post(
            INCOMING_URL,
            data={"payload": json.dumps(payload, ensure_ascii=False)},
            verify=False,
            timeout=10,
        )
    
    @application.route("/webhook", methods=["POST"])
    def webhook():
        token = request.form.get("token", "")
        username = request.form.get("username", "")
        text = request.form.get("text", "")
        user_id = request.form.get("user_id", "")  # 新增:取发送者 ID
        if token != OUTGOING_TOKEN:
            return "forbidden", 403
        threading.Thread(
            target=push,
            args=(f"收到 {username} 的消息:{text}", user_id),
            daemon=True,
        ).start()
        return "", 200

    需要特别注意的是:因为我们要在NAS本机上部署聊天机器人服务器,所以要把“传入URL”的前面的地址改为localhost,而不用管聊天机器人配置里的地址(那个地址是Chat根据你打开Chat的网址自动帮你填的,不用管它)。例如我就把这个URL改为http://localhost:5000/webapi开头。

    将这段Python代码保存为main.py,放到NAS的磁盘上,例如我放在了web/webhooks/ChatBot里:

    第三步,搭建一个服务端作为聊天机器人的服务器。

    首先配置Python(如果没装的话,要先在套件中心里装一下):

    确保安装了Flask、requests模块,因为这两个模块在我们的机器人脚本里用到了。如果你还用了其他模块,也都要安装,否则Python脚本无法执行。

    然后在Web Station里新增一个网页服务,选择刚才配置好的Python服务:

    点击“下一步”后,配置好名字,选中我们在磁盘上放好的main.py:

    最后建一个网络门户:

    按下图进行配置,选中我们刚才创建的Python服务,“门户类型”选择“基于端口”,端口号填入8085(你可以自己选择一个端口号,但要和Chat里机器人配置那边保持一致)。

    点击“应用”,我们的聊天机器人服务器就运行起来了。

    做了这些后,终于可以开聊了。

    在“机器人”那里先把我们的机器人加进来:

    发个“你好”试试:

    好了,添加自定义聊天机器人大功告成!

    最后讲讲添加自定义机器人有啥用。我想了几个玩法:

    1. 用来给NAS发各种命令,进行远程控制,例如把喜爱的油管视频链接发给机器人,然后在Python代码里通过yt-dlp进行下载。
    2. 搭建自己的AI问答。我试过连接Kimi,可以成功进行聊天。你也可以连接其他模型,做个智能知识库助理也挺好。
    3. 连接家里的各种智能设备。因为我的NAS放家里,所以我可以在Python脚本里对家里局域网内的各种设备进行控制。

    可能有人会问,这些需求也可以有其他方式实现,为什么选择通过Synology Chat机器人来做呢?那就得提下这个方案的优势了:

    1. 基础设施好,群晖已经构建了完整套件。有Synology Chat Server套件,有各个平台的Chat客户端软件,这些都是现成的,拿来用即可,很稳定。当然现在国区下载这些稍微麻烦些,我后面会讲。
    2. 通过群晖QuickConnect服务连接,任何地方都可以使用,无需自己掏钱购买云服务器或者中转服务,手机app上连消息推送都有。
    3. 数据、代码都在NAS上,安全、稳定。

    最后说下国内如何下载安装Synology Chat。Chat Server在套件中心里已经找不到了,要自行去群晖官网下载:

    https://www.synology.com/en-global/support/download。iOS端的Chat App也在国区下架了,要去美区下载。

  • 记孩子肺炎住院

    上周孩子因为肺炎住院了。

    其实两天前门诊看过,当时已经发烧、咳嗽两天。验了血,医生说是普通感冒,配了点止咳药就让回家了。

    在家观察了两天高烧依旧,咳嗽似有加重,仍不见好,于是带去医院复查。这次医生让拍了胸片,显示左肺下部有炎症,安排当天住院。

    这是小啾第一次在浙大儿院滨江院区住院。

    床位在3号楼21层。毕竟三甲医院,硬件条件还可以,干净整洁。一个病房三张床。

    自住院到出院,一共五天四夜。第一个晚上孩子他妈陪床,第二个晚上我陪床,后两个晚上孩子他奶奶陪床。头天晚上还有发烧,第三个晚上体温逐渐恢复正常。就是一直咳嗽,咳嗽不止。不过好在精神状态一直不错,说说笑笑的,依旧很皮,不咳嗽的话跟个没病人似的。

    之前在萧山三院住院,只要体温正常就可以申请晚上回家。但浙大儿院这边不允许,住院期间必须待在医院里,等体温48小时维持正常后可以申请出院。

    住院第二天更详细的检查结果出来了,小啾感染的是偏肺病毒。这病毒之前听都没听说过,查了下,说是2001年才发现的一种病毒,小孩儿老人是易感人群。

    孩子生病住院搞得全家都身心疲惫,但是和其他住院的小孩比起来,小啾的状况就不算什么了。同病房里有个三岁多的小孩连续高烧39.5℃以上,退不下来,都抽搐了。爸妈没来,只有爷爷奶奶陪着。晚上高烧难受的时候,哭叫不止,为此隔壁床一个10个月大孩子的妈妈和她起了争执。

    那个10个月大的宝宝是个女宝宝,眼睛大大的,非常可爱,但也是高烧不退。吊瓶的针手上打不进去,只能打脚上。一只脚打过了,就换一只脚;两只脚都打过了就打头上。看着挺可怜的。好不容易睡着了,被那个三岁高烧的小孩哭声又给吵醒了。她妈很心疼,忍不住说了几句,让那位奶奶把哭闹的小孩抱到走廊上去。

    那位奶奶也很为难,说孩子比较重,她身体也不太好,实在抱不动。又说,到医院这种地方的都是有难处的,谁没事爱来这里呢?

    说得也是这个道理,小啾没病的话我们也不来这里啊。只能说相互体谅。

    儿院那边最麻烦的我感觉是那个电梯。虽然有六部,但是楼层高、人多,每次上下一次运气不好得半小时。不过好在外卖可达,可以让外卖小哥直接送到各层的电梯口,倒也省了不少事。

    相比其他三甲医院,浙大儿院那边我感觉是停车最友好的。地面可以停车,还有地下三层可以停车。反正住院这几天每天我都能停到。

    就记这么多。小啾现在还有些咳嗽。希望他快点好起来,也希望各位宝宝都能健健康康的。宝宝生病,最受罪的就是家长了。

  • 围棋是一场与自己的较量

    这是韩国围棋国手曹薰铉刻在棋盘上的一句话。这个棋盘是他老师留给他的,后来他又留给了他的徒弟李昌镐——另一位韩国围棋国手。

    对于爱好围棋的人来说,这两人的名字恐怕都不陌生。这对师徒在韩国乃至世界围棋史上都称得上传奇。师傅曹薰铉共获得过九个世界冠军,是韩国现代围棋第一代掌门人。徒弟李昌镐更是一口气拿了十七个世界冠军,至今仍高居史上第一,成了名副其实的韩国围棋第二代掌门人。

    韩国电影《最终对决》讲的就是这对师徒之间的故事。

    李昌镐受他祖父启蒙开始下围棋,学棋半年就打败了周围所有人。初生牛犊的他向当时已经是国手的曹薰铉挑战。曹薰铉不但没有敷衍,反而在交流中独具慧眼发现这小孩超高的围棋天赋,于是收为入室弟子。

    随着李昌镐逐渐长大,他的棋风和师傅逐渐有了区别。曹薰铉以犀利的攻击著称,而李昌镐则擅长严密的防守和精准的计算,能稳妥地胜半目棋则绝不冒险搏杀。

    这种棋风上的差异逐渐演变成师徒之间激烈的争吵,谁也不服谁,唯有通过棋盘上的胜负作为“终极对决”。这是整部电影的最高潮。

    最终师傅落败了。

    败给了自己亲手培养出来的徒弟,而且是一种自己并不认可的下棋风格,曹薰铉迎来了职业生涯中前所未有的艰难时刻。电影中深刻展现了曹薰铉的失落、气馁。不过,当他翻开他师傅留给他的棋盘,看到了上面那行自己之前亲手刻的字:

    围棋是一场和自己的较量。

    他才明白,围棋没有答案,探索答案的过程就是围棋,而这个探索允许有不同的方向、风格。他败给了自己,败给了自己对围棋认识的片面。

    最终曹薰铉走出来了,重新投入了围棋比赛。又在一次师徒大战中赢了一次。

    这段过程是挺深刻的。抛开围棋不谈,做师傅的都希望能教出好徒弟,但是真的当徒弟有一天打败了自己,又该如何面对这样一个事实呢?总有些心理、情感上的坎要迈过去。

    青出于蓝而胜于蓝,这句话通常用来夸赞师傅教出了好徒弟。但我们也要看到,能教出好徒弟并且坦然接受徒弟超过自己的师傅,其内心的强大伟岸也同样令人敬佩。

    围棋不只是一种“石头游戏”。它包罗万象,内涵深刻。围棋大师们同样不只是下棋高手,他们也有着丰富的内心、深刻的人生理解。

    建议所有对围棋感兴趣的朋友都看下这个电影,我感觉还是挺不错的。

  • 三清山一日游

    今天天气非常好,和家人一起爬完了三清山,从金沙索道上,外双溪索道下,有几点感受和大家分享。

    金沙索道人挺多,我们七点四十分到取号口,已经是两千零八十几号,当时叫号到一千五。排了一个多小时轮到我们。如果可以,还是要再早一点来取号。

    金沙索道下来后一开始是一段微微上升的路,大家普遍觉得很轻松,然后就是在巨蟒出山那边连续爬台阶,很累,同行的两个六十多的老人感觉有些吃力。

    天气非常好,风景也很美。

    上面的照片都是手机直出。

    到了玉皇顶之后,就开始走下坡路。上坡已经很累,没想到下坡也很累,关键是脚很痛。

    走了很久的下坡台阶,终于到了外双溪索道。台阶的长度我自己估计至少是之前金沙索道那个上坡台阶的两倍长。这一路看到不少人是从这个坡爬上来的,看得出来确实很累,累到怀疑人生的那种。但是外双溪索道这一带景色比金沙那边要更好。

    外双溪索道不用排队,到了就能坐。从九点多开始爬,一直到下午两点多,全程爬爬歇歇,总共五个小时。几个老人感觉累,但都坚持下来了,晚饭也吃得很香。

    之前做攻略,听说港首上金沙下是最省力的。我们今天的这个路线应该要累一些,但还能坚持下来。