Vax Bean Counter

92 阅读7分钟

自从COVID-19全球大流行病开始以来,已经过去一年多了。我一直在做我的工作--呆在家里,与社会隔离,等等。当然,由于我已经远程工作了四年,几乎可以说是没有任何变化。对我来说,唯一的变化是我更多地洗手,并在外出时戴上口罩。

我注意到,这场大流行导致了一种数据的冲击。去年,我看着这些数据,心想,我也许可以以某种方式利用这些数据,并将其与Twilio结合起来,创造某种基于短信的服务。我在想,在这个意义上,是否有一些我可以 "尽我所能 "的方法。

我觉得没有。我不想纠结于那些糟糕的数字。我不想加强已经压倒性的恐惧和害怕的感觉。

然而,现在有了一个新的数据来源。这些数据是令人振奋和鼓舞的。

疫苗接种。

因此,考虑到这一点,我已经创建了一个项目,我称之为 "Vax Bean Counter"。当不列颠哥伦比亚省的疫苗接种信息被更新时,它会发送短信。这些更新通常发生在工作日的下午,我的短信试图显示进展情况,并提供一小部分希望,即这一漫长的国际噩梦可能已经进入尾声。

试试吧

如果你想试试,而且你的手机号码有不列颠哥伦比亚省的区号(如250、604或778),那么你可以发短信 "开始"(不含引号)到**##-###-####。** (由于要退休,号码被编辑了)

你最终会开始收到一条看起来像这样的信息。

Mar 26

Total Given: 637,856 (+27,185)
Last Update Delta: -852

Doses:
1st: 550,623 (+27,164)
2nd: 87,233 (+21)

Total Supplied: 810,220 (+17,600)

三角洲?就像,市?

短信中的一行字有点不直观。我想做更多的描述,但短信有相当严格的字符限制。总之,"最后更新三角洲 "的目的是显示当前信息的新接种疫苗数量与前一份报告的新接种疫苗数量之间的差异。它试图显示疫苗接种率是在加速还是在放缓。

博文的技术部分

鉴于这是一个技术博客,总结一下我建立的东西和它的运行方式可能是一个好主意。

分解

VaxBeanCounter是一个自定义的PHP8.0命令行项目,它使用了PHP联盟的依赖注入容器、Symfony控制台组件、Twilio SDK、Doctrine数据库抽象层和其他一些包。

它由多个 "命令 "组成,这些命令被捆绑在一个循环运行的Bash shell脚本中。

每隔半小时,它就会联系一次。它检查更新的疫苗接种数据。如果发现新信息,它将其与最近的 "旧 "信息进行比较,并检查差异。如果发现差异,它将其记录为新的更新,并安排向所有注册收件人发送一条短信。

在半小时之间,Bash shell脚本中的循环监测SMS API,以寻找新的传入文本信息。如果它检测到任何新的信息,它就会做出相应的反应(注册、取消注册、发送帮助信息、发送调试信息、忽略等等)。它每60秒检查一次这些新信息。

数据库和网络的考虑

这些定时("每半小时"、"每60秒")可能看起来很奇怪,但背后有一个目的。实际上,有两个。

首先,我没有使用MySQL或其他RDBMS,而是使用了一个超级简单的数据库:Sqlite3。因为我使用的是Doctrine DBAL,我确信当时机成熟时我可以切换到MySQL或类似的东西,但现在sqlite工作得很好。有一个缺点是,据我所知,并行写入不会使它成为一个快乐的营地,所以最好在任何时候只有一个脚本访问数据库。这就是为什么数据的获取、通知的发送和短信的监控都是在那个非常具体的循环中按那些特定的时间安排来处理的。

其次,我并没有完全以推荐的方式使用Twilio。整个项目是在Raspberry Pi上运行的,在防火墙后面。Twilio被设计为使用Webhooks来处理通信,但我不想打开防火墙,冒着将实验性PHP代码暴露在更广泛的互联网上的风险。所以它就坐在我的地下室里,每60秒检查一次新的消息,以便进行处理。由于没有使用 webhooks,所以速度较慢,但比较安全。

PHP 8.0

脚本的另一个怪癖是,我想把它写成最新版本的PHP 8,但我的Raspberry Pi的操作系统太过时了,它只能访问PHP 7.0,而这个版本在大流行开始之前已经死了一年了。

我不得不从源代码中编译PHP。

要弄清所有的标志是有点令人沮丧的,而且我最后得到的结果对 INI 文件的位置等还是有点不灵活的。考虑到所有的事情,我非常高兴我能够让它工作。这比尝试就地升级操作系统要安全得多,因为过去至少有一个Raspberry Pi的SD卡被毁了。

根据我的命令历史,我最后得到的标志列表是。

./configure --with-readline --enable-bcmath --enable-simplexml \
    --enable-pdo --enable-session --enable-xml --enable-xmlreader \
    --enable-xmlwriter --with-libxml --with-openssl --enable-mbstring \
    --with-curl

要创建一个 "强大的 "安装,还有很多改进的余地,但对于这个实验来说,它一直工作得很好。

电话号码

另一个有趣的花絮是,Twilio更喜欢国际兼容的E.164电话号码(+15555555),而不是传统的北美号码(1-555-555-5555)。

为了解决这个问题,我写了一个PhoneNumber类,它接受几种不同的北美电话号码格式,并将它们规范化为国际规格。我确信现有的库可以处理这个问题,但想出正则表达式和测试案例来确认它的工作是很有趣的。

项目的未来

我一直在努力避免为这个项目制定未来的计划。我想说 "当大流行病结束时我就会关闭它",但有迹象表明,Covid可能会像流感一样成为季节性的、不可避免的。而这真的很糟糕。感觉就像我们,作为一个全球社会,未能抵御完全可以避免的事情。

所有那些关于疫情爆发的好莱坞电影都成了现实,就连 "无视科学家 "的部分也是如此。而主要原因似乎是否认科学、领导层真空和彻头彻尾的自私的混合。还有一个事实是,它需要这么长的时间来孵化,而且在这个时间范围内具有很强的传染性,人们不了解他们所处的危险,或正在造成的危险。

这对对抗气候变化不是一个好兆头,因为气候变化的时间范围更广;同样地,人们似乎无法把握其严重性。

但现在,疫苗接种正在推出。它们将保护我们免受主要病毒以及一些变种的影响。

这是个好消息。

一个小的更新

现在,最初的疫苗接种浪潮已经结束,我们进入了 "助推器 "领域,而Omicron变体已经把一切都送入了地狱,我已经退出了这项服务。一个可耻的结局,我曾经希望有一个庆祝的结局。

有一天,我们会醒来,我们会走出去,一开始甚至没有意识到我们会在这个的另一边。我们会回顾过去,我们会感谢在这段时间发生的一些事情。比如针对困扰我们几千年的事物的新型疫苗(字面意思)。而且,我希望,对我们社会中需要改进的东西有一个清晰的概念--再加上真正完成它的严峻决心。