【技术】我的提醒机器人异常了
作者:
| 更新日期:我赶紧去看看,果然有一个BUG在正常运行七周后,在第八周异常了。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
一、背景
之前,我们工作通讯软件有个定时任务的功能,可以添加各种定时通知功能。
比如拉了一个问题群,相关人员说三天后修复,我就马上创建一个固定时刻的任务:在三天后的早上10点发出一个固定的消息,比如内容是“问题是否修复?”。
另外,还可以在每天的上下午中间时刻,比如上午的11:00和下午的16:00,发出一个要喝水的通知。
然而,好久不长,内部被强制切换了通讯软件。
在无数人反馈的过程中,这个通讯软件支持了聊天机器人的功能,但是只提供了API接口,具体逻辑需要自己实现。
于是我就使用 bash 脚本实现了这样一个日常提醒的聊天机器人。
二、生活上的提醒
根据自身的需求,我实现了很多功能。
第一个功能是福利提醒。
我们公司有两个福利,都是在每月的固定时间发放。
其中一个福利有数量限制,所以需要去抢这个福利。
另一个每次发放前如果有旧的没用掉,就不发了,所以需要提前消费完这个福利。
作为程序员,虽然我有自己的 todolist 管理,但是还是会由于各种原因忘记这些福利。
当想起来的时候,福利发放时间已经过了,有错过一个亿的感觉。
内部的聊天工具是实时通讯软件,在实时通讯软件上进行通知,就可以做到强提醒的作用了。
所以这个提醒机器人要支持的第一个功能就是福利提醒。
上线后效果还可以。
年前曾有个小插曲:放假前三天,我对大家说要过年了,就把聊天机器人暂时关闭了。
结果第二天有人说起可以抢福利的时候,我第一想法是提醒机器人怎么没有提醒呢?
然后瞬间想到在昨天被关闭了。
那种感觉,都是自己造的孽啊,一个亿就这样错过了。
第二个功能是喝水提醒、吃饭提醒、上厕所提醒。
对于程序员,最需要注意的就是喝水和上厕所了。
很多人早上来之后坐到电脑前面一个上午就过去了,吃午饭时才发现一个上午没去厕所,膀胱都要炸了。
而对于吃饭时间,则完全没规律。最终去吃饭的时候已经很晚了,那时候食堂只剩下饭渣了。
最后就是喝水,早上来杯子倒满一杯水,到晚上要走了,发现只喝了早上那一口。
所以我计划加这样三个生活上的通知,提醒大家注意喝水和上厕所,按时吃饭。
三、工作上的提醒
第三个功能是工作上的晨会提醒,这个也算是最重要的功能。
以前,每天都有晨会,这个不容易忘记。
后来,发现晨会太过频繁,每天说的都是重复的事情,改成了隔一天一次晨会,于是便经常发生忘记晨会这件事情。
此时,提醒机器人就很有必要了。
我三下五除二就增加了这个提醒功能,上线后效果不错(如果是你怎么实现呢?)。
但是,这周一的时候,有人感觉该写晨会了但是没提醒,问我是不是提醒机器人异常了。
我赶紧去看看,果然有一个BUG,在正常运行七周后,在第八周异常了。
为什么是第八周异常呢?
这个要回顾晨会提醒的基本功能:在工作日隔一天进行提醒。
假设我们周一进行提醒,后面提醒时间依次是周三、周五、下周二、下周四、下下周一……
很容易发现,这个提醒是两周一个循环,所以可以理解为是分单双周的。
单周一三五提醒,双周二四提醒。
那这里的关键就在于怎么获得当前日期是第几周了。
有人说这个可以根据日期计算出当天是当年的第几天,然后计算出第几周。
这个是可以,但是没必要自己去计算,因为shell里面data命令自带第几周的功能。
上图可以看到,date 有很多参数都可以获得第几周这个数据。
但是有个问题是,获取的第几周格式是 01..53
。
这里面有个前缀0。在计算机里面,有前缀0的数字按八进制识别处理。
所以01到07都正确处理了(按八进制识别),08和09不能正确处理(非法数字),10到53依旧可以正确处理(按十进制识别)。
四、删除前导0
既然知道了提醒机器人异常的原因了,那我们就需要解决这个问题:去除前导0。
关于怎么删除前导0的方法有很多,google 一下一大把。
有人建议使用sed或者perl的正则删除。
有人建议使用awk的print语法删除。
也有人建议使用bash的变量语法[base#] n
的形式强制指定十进制来转化。
最后我发现,data自带删除前导0的功能。
可以看到 date 在文档的最后面,提供了五个可选的功能。
-(连字符)不扩展字段
_(下划线)填充空格
0(零)使用零填充
^尽可能使用大写
#尽可能使用相反的情况
那我们在获取第几周的时候加上-(连字符)就可以去掉前导零0了。
果然还是man 文档大法好呀。
五、最后
这篇文章没有啥技术含量,但是想表达一个思想:很多东西没必要自己去实现,可以找找是否已经有其他人实现了,就是酱紫。
-EOF-
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。