Category Archives: 開發筆記

[小工具] 用 python 幫忙算疫苗追加劑時間

指揮中心宣布縮短第三劑的間隔時間,從原來的五個月縮到 12 週,也就是 84 天。

於是乎就開始出現一個問題,那我第二劑打完加上 84 天是幾月幾日? 我自己也是在那邊算了一下,想說要打電話去預約至少要知道哪時候可以開始打。

計算間隔多少天日期是多少,這種交給電腦算最適合不過,工程師魂就燃燒,直接用 python 做出解法,如果你知道怎麼 run python,那底下的程式碼貼過去執行,下完參數就知道間隔 84 天是幾月幾日了。

from datetime import timedelta, datetime
import argparse

def count_end_day(start_day: datetime, period: int):
    days = timedelta(days=period)
    end_day = start_day + days
    return end_day

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-d', '--date', type=str, help="起始時間,格式 yyyymmdd")
    parser.add_argument('-p', '--period', type=str, help="間隔時間長度,天為單位,整數")
    args = parser.parse_args()

    start_day = datetime.strptime(args.date, "%Y%m%d")
    period = int(args.period)
    end_day = count_end_day(start_day, period)
    print(f"{datetime.strftime(start_day, '%Y-%m-%d')} 加上 {period} 天 : {datetime.strftime(end_day, '%Y-%m-%d')}")

if __name__ == "__main__":
    main()

上面的程式碼整個複製起來以後,貼到某一個檔案去,然後存為 xxx.py 這樣的格式,例如你把它放到 C:\Temp 底下,然後取名為 countdays.py ,接著開一個命令列視窗,直接到 C:\Temp 底下,打上

python countdays.py -d 20211120 -p 84

這樣你就可以看到類似底下的輸出:

直接就跟你講答案了,不用在那邊翻日曆翻半天。

原本是有打包為 .exe 的打算,後來做完以後執行一下發現小紅傘直接判定為有毒的執行檔,就打消這個念頭。

如果知道怎麼 run python ,有計算日期需要的人可以直接拿去用,可以省下很多算日曆的時間。

Nextcloud login flow 搭配 nginx reverse proxy 的問題與解法

Photo by Neda Astani on Unsplash

使用 Nextcloud 已經有幾年的時間了,這一套真的是穩定好用的 Dropbox 替代品,如果有能力自行維護 Linux 系統的人很建議跑一套起來當做自己的雲端硬碟使用。搭配 Joplin 的話就可以無痛變身為 Evernote 替代品,完全走到哪同步到哪。

最近遇到的一個問題,困擾了我一兩天的時間,想說也許有人也會遇到類似的問題,因此把解法寫出來留個紀錄,順便給那些一樣遇到此問題的人一個節省時間的幫助。

Continue reading

[iOS] Thread SIGABRT 的雷

這兩天想說把 iOS 的 App 拿起來用新版本的 XCode 跑一次,更新過的 XCode 不知道有沒有改進一些 UI 操作上的小問題,所以就把 Project 開起來。

開起來之後歷經一番奮鬥,原本的舊 Project 當然是問題多多啦,先是 cocoapods 那邊更新就花上不少時間,接著再解掉一些 Swift 5 特有的問題與 Warning,最終讓我 Build 出一個可以跑在模擬器上的版本。

很開心的按下 Run 的三角形,等著 App 在模擬器上跑出來,終於,見到大大的模擬器上順利的把 App Run 起來,操作了一下,阿咧,直接就當掉了。

畫面上是停在 SIGABRT ,看看前後,好像也沒啥問題,一開始真的是找不到方向。

後來找了幾篇文章,有提到說可以把 Console 打開來看一下,有一些 Exception 會把錯誤訊息輸出到 Console 上,果不其然,直接就發現問題是出在 Google Admob SDK 上,新版本的必須要多一個設定,不然 App 開起來沒多久就會自己掛掉,沒辦法再 Run。

官方的說明在此:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#update_your_infoplist

實在是原本的那個 SIGABRT 過於籠統,看不出來問題在哪。找好久,結果依照人家官方文件指示,乖乖的把 info.plist 裡面該放上的欄位數值設定上去之後,賓果!就可以順利跑起來沒有問題了。

關鍵是這個:

<key>GADIsAdManagerApp</key>
<true/>

在 info.plist 加上這個 property 就可以讓 Google Admob SDK 順利運作。

過程有點慘烈,所以留篇文章記錄一下,如果有遇到類似狀況的朋友,請直接參考上面的那個連結,看看你的 info.plist 是不是少了那個欄位,加上去之後就可以了。

這故事告訴我們,沒事還是要把 XCode 開起來更新 Project 的相關版本,太久沒動要踩的地雷就會變多。