發表文章

LiteDb簡單key-value pair存法

LiteDb 是C#上簡單的NoSql資料庫,不過想用一個collection來存不同型別的key-value pair就略顯麻煩。 好在LiteDb本身有提供schema-less的用法,詳細可參閱 Collections - LiteDB :: A .NET embedded NoSQL database 。 再略微調整一下,就可以撰寫一個通用的key-value pair存法。 Base class如下 public class KeyValueRepository { public KeyValueRepository ( ILiteCollection < BsonDocument > collection ) { _collection = collection ; } private ILiteCollection < BsonDocument > _collection ; protected void SetValue ( string key , object ? value ) { _collection . Upsert ( new BsonDocument { [ "_id" ] = key , [ "Value" ] = BsonMapper . Global . Serialize ( value ) } ) ; } protected T ? GetValue < T > ( string key ) { return BsonMapper . Global . Deserialize < T > ( _collection . FindById ( key ) ? [ "Value" ] ) ; } } 繼承後,要宣告不同的type就比較方便了。 public class MyRepository : KeyValueRepository { public MyRepository...

解決WSL在Windows檔案系統下速度緩慢的問題

圖片
背景 微軟在 比較 WSL 1 和 WSL 2 | Microsoft Docs 這篇文章有提到,WSL 2在存取windows檔案系統時速度會變慢。雖然 cd / ls 這類指令無法察覺,但一旦使用到git,大量的檔案存取立刻讓效能有感變慢。有些用戶甚至還沒開始使用git指令,只是進入git repository,就足以讓接下來的每個指令延遲一秒以上。 分析原因 使用git會變慢的理由應該不用多談了,那為何單單只是進入git repository,速度就會有感下滑呢?這是因為很多的shell theme(bash/zsh),為了美觀和實用,都有附加「進入git repository時,提示目前branch」的功能。 而這也導致了在git repository底下時,無論輸入任何指令,shell皆會在每個指令間使用git指令,間接拖垮執行速度。 解決方法 思路 其中一個方案是回去用WSL 1,這也是微軟的推薦方法。 第二種方案則是改為使用windows的git,本篇主要會介紹這個方法。 首先要知道,任何windows的工具皆可在WSL中直接呼叫(前提是工具有在環境變數當中)。以git為例,若在Windows安裝過git,只要在WSL中輸入 git.exe ,即可使用Windows的git。 $ which git.exe /mnt/c/Program Files/Git/cmd/git.exe 因此只要利用這個特性,在WSL進入Windows檔案系統時,將原先的linux git替換為windows git,就不會再感到延遲了。 oh-my-zsh的解決方案 這裡提供oh-my-zsh的解決方案。 對原始碼有興趣的可以看看oh-my-zsh針對git所做的擴展, 連結 。 oh-my-zsh主要使用 __git_prompt_git 此function來執行git操作。因此我們只要遮蔽此function,將git更改為windows版本,即可解決進入git repository時速度緩慢的問題。 當然,指令上的git也必須進行簡單替換,最後結果如下。 function __git_prompt_git ( ) { GIT_OPTIONAL_LOCKS = 0 command git.exe " $@ ...

Functional Programming中處理Exception的方法

前言 以前剛從Java轉換到其他語言時有個困擾,就是Checked Exception(受檢例外)不見了。這會導致呼叫function的時候,難以判斷程式到底會不會丟出Exception。 其實關於Checked Exception的討論在網路上已經很多了,我google了兩篇覺得寫得還不錯的,覺得應該 存在的正方 [1],覺得 不應該存在的反方 [2],講起來其實都有些道理。 我自己比較偏向Checked Exception必須存在,但更準確來說是「我自己的checked exception應該要存在」。在設計自己的function時,若出現需要raise exception的情況,必定是我覺得這個東西要知會上層中斷流程,並做出一定的處理。而這應該存在於function的interface當中,不該讓同事看了文件或看了原始碼才發現要處理例外。 至於其他library的程式碼,我是覺得隨意。一方面大多數library並不會隨便丟出錯誤。另一方面就算他丟出錯誤,很大部分也是無法處理的錯誤,就讓他直接丟到頂端被top level的try catch給接住也無妨。 嘗試: 回歸錯誤碼檢查 既然想讓exception在function的介面上展現,最簡單的一個方法就是用class給包裝起來。(下面用dart程式碼呈現) class Result { Result ( this . result ) ; Result . error ( this . error ) ; int result ; Exception error ; } 先宣告一個class,裡面有正常的回傳值,也有異常的回傳值。 若程式正常執行則使用預設的constructor,出現錯誤則用error的constructor。如下 Result func ( ) { return Result ( 0 ) ; // return Result(Exception("Error!!!")); } void main ( ) { Result v = func ( ) ; if ( v . error != null ) { // 處理錯誤 return ; } } 在程...