Pensieve: 2104

2021-04-30 21:31

这个月就读了两本, 一本是比较水的育儿书, 可以不提. 另一本算是科普界有点名气的盲眼钟表匠, 主要讲的是进化论. 这本我读得很慢, 到现在都还没读完. 这一方面是因为书的节奏有点不适合我, 对其他人, 这本书可能是深入浅出婉婉道来, 对于我而言, 更像是老牛反刍, 没告诉我任何我不知道的事情; 另一方面也恐怕是我现在读书心不如十年前那样定得下来了, 这个毛病, 要通过多读书来磨. 图书馆有福利, 你借出的书籍只有其他人没有预约, 你可以无限续借. 所以我现在手旁还有一堆书等着看.

PS5

幸运入手了一台PS5.

澳洲PS5缺货已经半年了, PS5去年年底刚发售的时候我在EBGames预订了一台, 还交了50块的定金. 只是这个预订上写明了2021发货, 但是根据这几个月的观察, 我觉得接着等下去也许要到2022年才能拿到手了, 于是就开始动脑筋想办法. 一开始程序员毛病发作想自己定时去抓, 而且家里还有一台24小时开机的树莓派正好可以跑这个任务, 但是后来想想要对于每个零售商去写网页解析逻辑并测试, 还要求近实时地发送通知, 觉得这个任务不是那么简单, 后来看了看, 发现Twitter上有两个账号提供到货自动通知服务, 就订阅了.

对于没有参与过的同学, 第一点需要了解的是PS5的到货不是连续的而是离散的. 一批PS5发到澳洲后各大零售商都会拿到一些货, 自己再各自上架出售, 卖完后就得等下一批(往往是数周甚至一两个月后). 这一行为对于想买的人而言是一件好事, 在于一旦一个零售商有售, 这意味着接下来几个零售商都会上架. 于是, 绝大部分时段都是闲时, 大家可以该干嘛干嘛, 但是当确认有货的那一两天就需要时时注意手机了.

我入手的时候, 前面在JBHifi/Gamesmen/TheGoodGuys已经卖过一轮, 甚至当时Gamesmen我都可以可以去买, 但是当时这一家没有我想要的数字版, 而且搭配出售了我不太想要的充电配件, 于是就放弃了. 后面得到推送Sony官网上有售, 于是赶快下单数字版, 顺利买到了. 后面其他零食商出售的时候还有各种秒空和砍单, 于是庆幸自己还算顺利. 机器到手后, 我又收到了EBGames的通知, 说可以去拿机器了, 于是通知EB我们改主意了, 希望这台能够给其他人带来快乐.

机器上手了这一周, 主要在玩Horizon Zero Dawn, 接近塞尔达了, 但是还没好到那个程度. 这两天又下手买了GT Sports, 对于一个几年前的游戏来说, 效果还算满意. 现在盘算着什么时候psplus送的游戏让我想买的时候, 我再去买psplus预订了. 另外, 为了省钱, 我创建了一个美区的账号, 因为美区的psplus订阅更便宜.

vapor

我一直念念不忘Django的ORM, 第一次看到定义一个model的时候就觉得很魔法很不可思议, 后面才知道里面用了大量的元类编程. 我一直也想着有个机会能够让我写一个库, 用到这样的技术, 这样至少我会觉得很好玩. 最近几年, 我在工作的时候越来越觉得应该将Cloudformation模板和部署的逻辑放到一起, 用Python来管理, 这样能够提供一个简单一致的办法来部署一个Stack. 于是, 我设想了类似这样的API:

#!/usr/bin/env python3
from vapor import Stack
from vapor.services import S3
from vapor.fn import Ref


class S3Bucket(S3.Bucket):
    BucketName = Ref("BucketName")
    PublicAccessBlockConfiguration = {
        "BlockPublicAcls": True,
        "BlockPublicPolicy": True,
        "IgnorePublicAcls": True,
        "RestrictPublicBuckets": True,
    }


class MyStack(Stack):
    Description = "Simple Cloudformation stack with an s3 bucket."
    Resources = [S3Bucket]
    Parameters = {
        "BucketName": {
            "Type": "String",
            "MaxLength": 63,
            "Description": "The bucket name",
        }
    }
    Tags = {}
    DeploymentOptions = {
        "parameters": {},
    }


if __name__ == "__main__":
    stack = S3CfrStack()
    stack.deploy()

理想状况下, 我们可以直接运行这个Python文件来部署这个Stack. 具体设想是在vapor.services里面提供一个module的finder, 动态创建对应的资源. 上面代码里面的S3Bucket类可以直接映射到一个Cloudformation里的资源, 其资源类型(resource type)可以从S3.Bucket计算得到AWS::S3::Bucket. S3Bucket这个类里面的定义会被记录下来, 后面用来创建cfn资源. 下面的MyStack自然可以映射到一个Stack, 大部分keyword会直接映射到Cloudformation模版里的Section.

通过上面这样一种DSL来定义Cloudformation模板, 好处在于可以在企业中轻松地实现管理层级上的分离. 比如管理员可以定义一些可供程序使用的基类, 程序同学只需要继承这些基类就能创建一个符合公司安全策略的S3 bucket等. 而且相对于yml或json, python毕竟有更大的自由度.

于是, 就只是需要我一点一点把代码写出来了… 如这个名字所言, 现在这一切都还只是vapor.