所以說寫程式就是不能懶惰…

前幾天寫了一個 bot ,他沒什麼大問題,但有個缺點就是會 OP 。其實 OP 是人為疏失,因為我沒把它寫得嚴謹一些。

以下說明為甚麼會 OP :

假設我們取得一個列表,叫做美女列表,以下面為例,有五個美女,分別是 A, B, C, D, E:

A -> 0
B -> 1
C -> 2
D -> 3
E -> 4

然後 0, 1, 2, 3, 4 是她們香閨的門牌。我們如果要每個小時取出一個美女,可以用這種方法取出:

index = web.getGirl(now_time)

當我們把「now_time」傳入 getGirl() 這個方法,可以取得一個數字叫做 index ,而 getGirl() 這個方法的作用就是回傳 24 小時制的「時」來當作列表的索引。舉例說明:

把半夜十二點這個時間放到 getGirl() 裡面,他會回傳 0 。
把清晨五點這個時間放到 getGirl() 裡面,他會回傳 5 。
把中午十二點這個時間放到 getGirl() 裡面,他會回傳 12 。
把下午五點這個時間放到 getGirl() 裡面,他會回傳 17 。

參考上面的列表,
在 0 點的時候,會取出 A 。
在 1 點的時候,會取出 B 。
在 2 點的時候,會取出 C 。
在 3 點的時候,會取出 D 。

接下來切入問題核心:假設半夜 3 點時,列表長這樣:

A -> 0
B -> 1
C -> 2
D -> 3
E -> 4

但是三點十五的時候列表更新了,變成這樣:變成這樣:

Z -> 0
A -> 1
B -> 2
C -> 3
D -> 4
E -> 5

前面多了一個 Z 插隊。由於我們索引規則沒變,所以在 4 點的時候,照原本的規定,應該是取出 E ,但由於列表變動過了,所以依照 4 這個索引取出的會是 D ,於是產生 OP 的情形。當然實際情況沒這麼單純,加上當時程式寫得有點隨便而且沒有判斷是否有重複發表的情況…

當然這樣下去不是辦法,所以我新增了一個資料表來紀錄發過的圖片,結構如下:


這個資料表可以紀錄縮圖、相簿網址、相簿主人帳號以及是否被機器人送出過。

程式判斷 op 部份的流程大致如下:

  • 從正妹牆的 RSS 取得列表
  • 解析 RSS 取出有用的元素並依序塞入資料庫內,每塞入一行之前均進行檢查該本相簿是否已經存在於資料庫中。如果有就略過,沒有就新增進資料庫,並將該筆資料標示為「未用」。
  • 整點的時候,從資料表隨便挑選一筆標示為「未用」的資料秀出來,在這把該筆資料標示為「用後不理」。

目前可能會有極少數 OP 的情況,因為以前發過的相簿網址來不及存入資料庫中,沒得判斷,但過個兩天這個情況應該可以被完全解決。

Posted in Programming

Leave a Reply

Your email address will not be published.