序言
9102年都已經過去好幾天了,現在才來產出年終總結。
個人項目
cuckoo——定時提醒工具
在18年的總結中,我提到自己開發了一個名為cuckoo的工具,用來代替macOS的提醒事項、日曆,以及由crontab調用的shell腳本。這個目標在19年得以實現,cuckoo已經完全取代了它們。
cuckoo實現了以下功能:
- 創建一次性和週期性的提醒。
cuckoo甚至可以在正確的二月最後一天彈出提醒——不管是平年還是閏年; - 利用
alerter,cuckoo可以在提醒彈出後推遲它(5分鐘、10分鐘),或推遲到指定的時刻; - 利用Server醬,
cuckoo可以把提醒以微信消息推給手機; - 利用
ControlPlane,實現按場景提醒——比如10點鐘若在公司就提醒自己開晨會,若在家則絕不彈出。
我還提供了給Emacs用的minor mode和Alfred Workflow,以提高易用性:
- 在Emacs的org-mode中啓用這個minor mode後,只需要按下
C-c r便可為光標所在的條目創建提醒; - 一個條目切換至
DONE或CANCELLED狀態時,也會自動更改cuckoo中任務的狀態(感興趣的讀者可以移步之前的文章); - Alfred Workflow便於創建一次性提醒——比如提醒自己在25分鐘後打開支付寶的螞蟻莊園看看有沒有雞賊。
wa——Alfred Workflow腳本
在18年入手MBP後不久,我便入手了Alfred,併購買了Powerpack。平均每天使用Alfred 110次,大多是Snippets(auto expansion真香)、Clipboard(臨時存儲文字和圖片的絕佳位置)、Workflow。常用的Workflow都是我自己開發的:
unit用於快速輸入不同時間長度的秒數的,例如輸入6天的秒數6 * 24 * 60 * 60 * 1000;upload用於上傳圖片到GitHub,把GitHub當圖牀用(感興趣的讀者可以移步這篇文章);gt用於獲取指定日期的UNIX時間戳、int用於獲取一些預設的時間戳(例如“昨天0點”);yl用於精確設定macOS的音量;bqb用於鬥圖(感興趣的讀者可以移步這裏)。
這些腳本都收集在名為wa的私有倉庫中。由於需求比較穩定,這個倉庫的迭代不多。
jjcc——將LISP語言編譯為x64彙編
不害臊地説,jjcc是一個用Common Lisp寫就的編譯器,運行在SLIME中,如果投餵它某種LISP方言代碼,就可以編譯出跑在macOS上的x64彙編代碼。這是我的第一款生成彙編指令的編譯器,為此還惡補了不少彙編語言知識,尤其是x64的calling convention。這款編譯器的開發過程寫成了文章發表在博客和知乎上,感興趣的讀者可以移步這個專欄。
在完成了蹩腳的自定義函數特性後,我讀了《An Incremental Approach to Compiler Construction》這篇論文,它循序漸進地開發一個Scheme語言到x86彙編的編譯器,並且階段劃分得更好,後來我也按照論文的思路重新實現了一遍。
savemoney——未完待續的RescueTime代替品
19年10月份時RescueTime Premium到期,由於太雞肋了便不再續費。我仍然有time-tracking的需求,於是打算自己動手寫一個代替品。皇天不負有心人,我找到了active-win這個庫,它可以獲取當前有焦點的窗口的元信息。基於這個庫我寫了兩個腳本:
savemoney.js,每隔一秒調用active-win獲取當前激活窗口的元信息,然後寫入到Redis中;accounting.js,不停地從Redis中取出數據,運算後寫入到MySQL中。
目前僅僅是將數據記錄在了MySQL中,沒有做報表和統計。這兩個腳本通過Launchd在每次登錄後自動運行。
寫作
19年在GitHub博客一共發表了28篇博文,數量差強人意,質量亟待提高。在讀了利用金字塔原理寫出好文章後,我逐漸改進自己的寫作方法,以期寫得更有條理。
除了GitHub博客和SegmentFault,我還在知乎上發表了一些文章,大多是關於jjcc編譯器的。剛才我説文章的質量亟待提高,如果你看過jjcc編譯器系列的文章的話,一定會很同意我的觀點。
博客和SegmentFault的受眾很小,於是我又開通了微信訂閲號,希望可以在技術圈子裏更多的展示自己——有沒有值得展示的內容另説。在訂閲號上發表文章多了一種無形的壓力,畢竟這些內容更容易被同學、同事、同行看到(前提是人家樂意看)。萬一寫的很糟糕,可就糗大了。目前訂閲號關注者寥寥,有興趣的可以微信搜索“小打小鬧寫點bug”關注。
學習、進修
19年讀完的書不多:
- 《MongoDB in Action》,沒什麼太大的收穫;
- 《High Performance MySQL》,看過後確實有些幫助,切實根據書中的指導調優過生產環境的MySQL;
- 《Algorithms》,光看沒練手;
- 《Linux Shell Scripting Cookbook》,看着看着幡然醒悟這東西只要用到的時候查閲就足夠了,遂棄之。
還有許多在讀經典書籍,如《Clean Architecture》、《重構》。剛開始我會在上下班搭地鐵時讀這些書,後來將看書時間固定在了每天下午一點至一點半。這些在讀的書像一條隊列,我每天會讀隊頭的書,然後放到隊尾。這樣一來,每天都在涉獵不同領域的內容。
在18年9月,我閉門造車地整理了一份Web後端軟件工程師的技能樹,再據此來尋找要讀的書。例如,上述的《MongoDB in Action》是依據“後端知識/文檔數據庫/MongoDB”找的,《Linux Shell Scripting Cookbook》是依據“後端知識/命令行操作”找的。技能樹整理得好不好暫且按下不表,但漸漸地我忘記了看書的初衷,成了“為看而看”。看似每天中午都在學習,實際上由於目的性不強,收穫不大。由於每天讀不同類型的書,同一個主題的學習過程也變得支離破碎。這個學習方法已經到了迫切需要優化的地步。
macOS更新換代——AppleScript來襲、Chrome上位
19年10月升級到macOS Catalina,然後問題便接踵而至。首當其衝的是alerter和terminal-notifier沒法用了,無法在右上角彈出提醒。一番折騰後不見起色,只好先用AppleScript代替,讓cuckoo可以彈出提醒。AppleScript的display notification功能遠不及alerter那麼豐富,聊勝於無吧。
Firefox也開始鬧彆扭。只要打開Firefox稍微用兩下,就會有一個名為FirefoxWebCP Extension的進程瘋狂地使用CPU,Firefox內的各標籤頁也紛紛失靈轉圈,幾天下來都是如此。沒辦法,只好起用Chrome。稍微磨合後發現Chrome其實挺不錯,各方面都今非昔比。以前之所以一直堅守在Firefox的陣營,主要是因為:
- Firefox的Pocket插件更好用——早年間不需要打開Pocket的網站即可查看自己的列表,不過自從Firefox集成Pocket後,這個優勢已經蕩然無存;
- Firefox的Vimperator更好用——這也一樣,Vimperator逝者已逝,繼承者Vim vixen和Chrome的Vimium大同小異;
- Firefox的地址欄搜索瀏覽歷史更好用,這一點迄今未被Chrome超越——Chrome的地址欄要麼搜不到,要麼必須輸入更多關鍵詞,然後還是搜不到。
希望Mozilla在2020年可以修復這個問題,讓我重回Firefox的懷抱。
CL虐我千萬遍,我待CL如初見
2019年的Common Lisp依然讓人哀其不幸怒其不爭,我也依然痴迷於這門古怪的語言。但痴迷不能當飯吃,要將CL投入到實際應用實在太難。且不説Quicklisp上庫的數量遠不及PyPI和NPM,質量也令人抓狂。這不,都9102年了,訪問一個返回JSON數據的HTTP接口,還得先用drakma發出請求(也許不支持HTTP/2),再用flexi-streams將字節數組轉換為UTF-8編碼的字符串,再用cl-json解析一番。拿到一個列表對象後,再用car、cdr、assoc一頓操作猛如虎,才能拿到需要的數據。
2020年,MAKE CL GREAT AGAIN!
記賬
在年中的時候,萌生了換記賬軟件的想法,因為挖財用起來越來越不爽了,而且整天記流水賬也沒什麼收穫。一番摸索後,我決定嘗試一下複式記賬法,並選擇了GNU Cash——早年間用過一次,但沒看入門手冊就開始用,根本玩不轉。這一次倒是讀了手冊,但GNU Cash的UI和操作方式還是無法讓我心動;之後知道了beancount,卻無法在我的系統中順利運行;最終我選擇了ledger,它是一個命令行程序,不負責記錄,只負責讀取手打顯誠意的交易明細,然後產出報表。Emacs有一個ledger-mode插件,兩者配合用來記賬超痛快。
結尾
在2020年我希望至少能完成:
- 發佈
cuckoo; - 發佈
wa; - 開發一個
alerter的代替品; - 寫更多的博文,讓微信訂閲號的粉絲漲到130;
- 給CL寫一些庫解決一些常見的需求
最後
閲讀原文