我的提醒機器人異常了
一、背景
之前,我們工作通訊軟體有個定時任務的功能,可以新增各種定時通知功能。
比如拉了一個問題群,相關人員說三天後修復,我就馬上建立一個固定時刻的任務:在三天後的早上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-code。