Pensieve: 2307

2023-07-30 10:07

所听所读

这个月读过的书都比较平庸. 一本是风情日本, 大概是一群游记小杂感的合集, 没主线没主题, 随便翻翻尚可. 后一本是陈楸帆的人生算法, 实在是不推荐. 故事本身没大问题, 但是叙事手法让我想起之前高中时读过的那些范文们, 大而空, 没有文字的美感, 也没有带来阅读的愉悦感. 整个阅读的体验大致就是这是啥和这又是啥.

Apple Music里面加了藤田惠美的HEADPHONE CONCERT 2022, 冷たい雨真好听.

原神

这个月主要是在刷探索度, 完成了璃月/渊下宫/层岩巨渊的探索度. 冒险等级快到56了. 另外, 七圣召唤里所有角色和NPC都完成了认真胜负. 预计在4.0开始前能完全补完须弥的探索度, 以及邀约任务的全剧情. 3.8没抽卡(小保底又垫了几张, 得了一个瑶瑶).

这次想重点说下七圣召唤的卡组. 用的是草神加雷神加八重神子. 这个阵容雷神和神子都可以后台挂雷, 草神速切后站场输出. 这个阵容要说差也就是差在了对单能力稍差, 而且没有扩散的能力. 因为草神的技能设计就是为了对群和后台穿透, 如果是对单(比如30血的无相雷), 这个优势就没法发挥. 就是用这个阵容, 我刷通了所有角色的认真胜负对战. 唯一有点障碍的是NPC阿扎莱的认真胜负, 这个阵容试了几次都没过, 后面是换成债务处理人/神子/砂糖的阵容才过了.

用openssl来cat

最近工作中完成了一个小hack, 自己觉得很开心, 记录一下. 一个容器镜像里面只有两个二进制文件, 一个是自己build出来的go二进制, 另外一个是openssl. 我想在这个容器运行时把它的/etc/hosts文件打印出来. 但是这个容器里什么命令都没有. 后来翻了好久openssl的help, 用下面这个办法解决了:

docker exec -t 34d14a31ebce openssl enc -base64 -in /etc/hosts

Citizenship笔试

准备入澳洲籍, 直接原因是惊涛骇浪和潜在的台海战争风险. 上个月交了材料, 这个月收到邮件说是要面试, 里面大段说了要带上哪些材料, 对于笔试只是简单提了下. 我的理解也就是这是当面去检查材料原件的. 于是约了时间, 请了年假, 去到移民局办公室才知道这是笔试考场. 首先跟工作人员确认了考试不过还有补考机会, 然后就放心大胆上考场了. 20道单选, 题目都很简单, 我觉得甚至从没在澳大利亚生活过的人都能够通过这个测试. 而我也顺利地通过了测试.

enum

Canva的python代码库里有很多时候为了类型检查而使用了enum模块, 我对此有一些不同的看法.

首先, 对于Python代码而言, 我不认为类型检查能够在多大程度上帮助我们自己. 很多时候类型检查只是减少了assertion的使用, 但是对于可读性而言, assertion和type annotation孰高孰劣本身就是见仁见智的. 而且, 对于大多数业务代码而言, 真正的检查应该远比类型检查要严格. 而将输入值的检查切为类型检查和assertion/validation两部分, 是有待商榷的. 我觉得, 与其将开发资源投入道类型检查上, 不如投入到单元测试上, 这样更能保证代码的质量和可读性. 而为了类型检查而使用enum更是不必要. 业务代码应该这个时候老老实实地检查输入的值, 而不是满足于一个enum.

我们这次因为enum而导致的一个小故障的原因是类似下面的代码:

class CapacityProvider(enum.Enum):
    COMPUTE_CORE = "compute-core"
    HIGH_FREQUENCY_CPU = "high-frequency-cpu"
    ...
    # Only available in the ml-canva ECS cluster
    ML_HIGH_MEMORY = "high-memory"
    ML_COMPUTE_CORE = "compute-core"

这儿没有检查enum的唯一性, 想当然地认为后面在比较CapacityProvider的实例时比较的是COMPUTE_COREML_COMPUTE_CORE, 而实际上enum比较的是对应的值. 如果坚持使用enum, 合理的做法是在设计上避免重复值, 而且使用@enum.verify(enum.UNIQUE)这个装饰器来避免后续代码变更时引入重复的值:

@enum.verify(enum.UNIQUE)
class CapacityProvider(enum.Enum):
    COMPUTE_CORE = "compute-core"
    HIGH_FREQUENCY_CPU = "high-frequency-cpu"
    ...
    # Only available in the ml-canva ECS cluster
    ML_HIGH_MEMORY = "high-memory"
    ML_COMPUTE_CORE = "compute-core"

此时, Python会抛出ValueError. 当然, 我觉得更合理的值是将这个CapacityProvider类处理成一个字典:

VALID_CAPACITY_PROVIDERS = {
    "COMPUTE_CORE": "compute-core",
    "HIGH_FREQUENCY_CPU": "high-frequency-cpu",
    "ML_COMPUTE_CORE": "compute-core",
    "ML_HIGH_MEMORY": "high-memory",
}

这样维护成本也低, 而且也不容易出现前面讨论的错误.