2021年12月29日 星期三

Raspberry Pi samba v1.0 設定

markdown 最近買了一台米家攝影機,一開始都是把錄好的影片從 SD 卡直接 copy 出來,後來覺得 SD 卡一直插拔實在太麻煩,想說之前有一台樹梅派閒置一直沒在用,就拿來當 NAS 讓攝影機直接將影片傳到樹梅派上吧。 米家攝影機是透過 SMABA 將影片上傳到 NAS,所以樹梅派只要安裝好 SAMBA 理論上就可以讓米家攝影機連上並上傳影片,但是問題是米家是用 SAMBA V1,這是非常不安全的舊版協議(小米還在用 SAMBA V1 會不會太落伍阿=.=),樹梅派 SAMBA 安裝好預設是不開啟的 V1 protocol,所以米家看到了樹梅派的機器但是連不上。 上網查怎麼 enable SAMBA V1,加了很多指令到 `/etc/samba/smb.conf` 裡面,像 `client min protocol=NT1`、`ntlm auth=yes` 等等,試了好一會才發現只要加一行 `min protocol=NT1` 就可以了,玩 linux 系統就是這樣,遇到疑難雜症免不了要花很多時間去解。 不過設定成功後,現在米家攝影機自動把影片傳到樹梅派上,之後就可以直接抓下來看了,方便許多。 ![](https://blogger.googleusercontent.com/img/a/AVvXsEiGM8wSFLzUD6wbQxI9zZZe4D4TwQfwvs6Bxxs-AC1ewWiEH8l93AVXQ1Led8G1de883qEnUzat6GxN5geUyJu2L6uXfifE1WEdETi1gv6vA4Aizp-ws8yPdeedpgq3xoZCtt9LBq2FXte2DdrghZRhLrVXvpxZXg1UW-pDEjFlESq0OpK5_XrAtLIZPw =400x*)

2021年11月30日 星期二

DIY 70邁pro 換電池

markdown 最近每次車子發動時 70邁pro 都會叫時間重置,上網查了一下應該是因為內置電池沒電了,於是上網買了個電池準備來更換一下。 網路上有很多 70邁pro 換電池的教學,找到一個影片就準備照著做了。步驟還蠻簡單的,只要將貼紙撕掉轉開兩個螺絲就可以將殼拔出看到電池了,如下圖。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_WtTqfhixdXCV2qj8cKptIqVfxSCKEeQA7a5Lv_x3D-Tla4Ii3WptETK7_iQpS_3t_KRJ21N4nkLQWATy1Ud0xUeaRaLoMrpwqL0ef7PE1ixKu74igFpuKy7gzTZdIVVvMS-E2hJYJjQl/s0/70mai.png =700x*) 換下來的電池,型號是 HMC1450。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3AQLb9FYpsZjq1SpY6HKfVacBgZKRLYhrDM-0lD_-seJNMh-hzPFYOjE9v22_T8ZEifTPM1fNotDn_Hmo_vrbiPn1Qc1o2znHhyitsOJcz38J-SCvEMM5O9y9mIBkJY2jR8k03_fPRDrm/s0/batt.png) 在裝上新電池後,因為電池的 3pin 接頭卡榫不太好壓入,我用一個金屬翹棒去壓結果不小心讓電池短路小跳火了一下,還好電池沒壞掉。之後測試了一下已經不會再叫時間重置了。 其實 70邁pro 才買了大概兩年,沒想到這麼快電池就沒電了,不過當初也才花一千多,可以預期這種超低價產品裡面的電池也不會用多好的,還好它的設計可以讓人自行更換,換完電池就滿血復活。

2021年11月29日 星期一

Github 改用 personal access token

markdown 最近某個很久沒用的 git 倉庫要 push 時跳出警告說 account/password 的方式已無法使用,需用 personal access token,就上網研究了一下要如何使用 personal access token。 personal access token 要在 github 先申請好,會得到一組字串,然後要將本地端 git 倉庫更新為使用 github personal access token,最簡單的方法應該是用[這裡](https://exerror.com/remote-support-for-password-authentication-was-removed-on-august-13-2021-please-use-a-personal-access-token-instead/)提到的使用 command 的方式。
git remote set-url origin https://<token>@github.com/<username>/<repo>
我跑了這個 command 後就可以 push 了。 然後[這裡](https://iter01.com/611911.html)有說到如果是用 ssh 的方式的話不會受影響,我有其他倉庫並沒有跳出警告叫我使用 personal access token,應該是因為已經使用了 ssh。 --- * [[Solved] remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead](https://exerror.com/remote-support-for-password-authentication-was-removed-on-august-13-2021-please-use-a-personal-access-token-instead/) * [使用personal access token進行Github認證](https://iter01.com/611911.html)

2021年9月26日 星期日

[Android] Android studio emulator 踩坑

markdown 老樣子,android 踩坑日常。 在 android studio 中下載了 android 10 的模擬器,將模擬器開起來時出現了 error,原本出現的 error 是 Android Emulator closed because of an internal error,如下圖 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgch0e8QV6PJuyNFlUlvP2PR_BmKBayzYjot301i039aufPZQTvDZOVVfd-4UQnOKRHlrECkXjyhwwIZ6jeDQHp7k3OUG7IDxzMsY2DmzwNfvV-ccmNcWdJnOlaQN-0TZyRvGFFSoFkRmsQ/s0/emulator_error.png) 在 [SO](https://stackoverflow.com/questions/67316340/android-emulator-closed-because-of-an-internal-error-gpu-found) 找到一篇解,在 C:\users\[user name]\.android 中新增一個檔案 advancedFeatures.ini,然後問題就變成開模擬器時跳出一個小 window 進度條然後卡住,基本上跟[這篇](https://stackoverflow.com/questions/66250313/android-emulator-not-responding-frozen)的問題一樣。 照著那篇的解去看 intel HAXM 有沒有安裝,是有安裝但是 android studio 有提示現在安裝的不是最新版,我更新到最新版,版本為 7.6.5。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1IJlfRrn_k3w2zpmcRsGs2RhQig991ctFQnahl0JGUvufPID9gGuB6HTymtWgi_fVQ8OzQqAoFtqRuZFoC2v8MQipy92p7AcyfSrEIQknPxN6SVru9M2A0vyg1RE3mHFU3_C5Sc40BSsp/s0/haxm.png) 更新到最新版後,`C:\Users\[user_name]\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager` 目錄裡的 intelhaxm-android 檔案不見了,但是模擬器可以開起來了,所以 intel HAXM 跟模擬器也有匹配性問題,版本不對也會造成模擬器卡住開不起來。 最後,我的模擬器原本是開得起來的,不知道為什麼突然開不起來了,猜可能是因為 android studio 更新造成的。 --- * [Android Emulator not responding - frozen](https://stackoverflow.com/questions/66250313/android-emulator-not-responding-frozen) * [Android Emulator closed because of an internal error: GPU Found](https://stackoverflow.com/questions/67316340/android-emulator-closed-because-of-an-internal-error-gpu-found)

2021年9月4日 星期六

[RF] Return loss and S11

markdown RF 訊號傳輸中,會因為阻抗不匹配或是不連續導致 RF 訊號能量被反彈回來,原始 RF 功率減掉被反彈回去的 RF 功率就是 return loss。 雖然 return loss 聽起來會讓人以為它的定義像是被反彈回去的功率,這比較容易讓人誤解,但是正確的定義確實是
正常傳輸的功率 - 反彈回去的功率
數學上的表示則是
RL(dB) = 10log(Pi/Pr)
Pi 為正常 RF 功率,Pr 為被反彈回去的功率,所以一般來說我們希望 return loss 越大越好。 S11 跟 return loss 其實是指一樣的東西,不過它跟 return loss 差了一個負號,S11 = -(return loss)。所以當我們說 S11 的時候,我們希望 S11 越小越好。 --- * [return loss 回波损耗越大越好还是越小越好?](https://www.zhihu.com/question/24240508) * [什么是插入损耗和回波损耗?](https://fiber.ofweek.com/2020-06/ART-210001-11000-30444667.html) * [Understanding VSWR and Return Loss](https://www.youtube.com/watch?v=BijMGKbT0Wk) * [反射率 S11 實測-同軸電纜/終端電阻 在Smith Chart長甚麼樣子](https://www.strongpilab.com/s11-measurement-cable-terminator/)

2021年8月28日 星期六

[RF] 阻抗匹配 50 歐姆

markdown 在做 RF 的時候,常常會聽到一些討論,例如阻抗是不是 50 歐姆,有沒有阻抗匹配,一直以來其實都不知道這是甚麼意思,在聽別人解釋時也一知半解,於是決定好好惡補一下。 這個 50 歐姆的物理意義,跟平常我們用三用電表量出的歐姆是不一樣的,而且用三用電表也量不出來。其實它叫做特性阻抗,或是瞬時阻抗,是表示非常小的單位時間內,電子在傳輸線中行進的距離所遇到的阻力,這個阻抗值的大小是跟傳輸線的材質和截面積有關,與傳輸線長度無關。 RF 訊號在傳輸時,若是某一段路徑的特性阻抗跟前一段不一樣,那就會有部分的 RF 訊號被反彈回去,持續向前傳輸的能量就減弱了,所謂阻抗匹配,就是指 RF 訊號傳輸路徑都是固定的特性阻抗值,例如最常見的 50 歐姆,這時 RF 訊號在傳輸過程中能夠保存最多的能量傳輸到目的地。 而為什麼是 50 歐姆,其實是人為選定的結果,科學家們經由一傳串的實驗發現,在 29.6578 歐姆時,同軸纜線能傳輸的功率可以達到最大,但是對線體的損耗也大,在 76.3779 歐姆時,對線體的損耗最小,但能傳輸的功率也小,於是在傳輸功率與線體損耗的平衡考量下取折衷就是 50 歐姆了。 --- * [Characteristic Impedance](https://www.oldfriend.url.tw/SI_PI/ansys_ch_cha_impedance.html) * [終於有人講明白了什麼是特性阻抗什麼是阻抗匹配~~~](https://kknews.cc/zh-tw/news/eylegbq.html) * [射频工程师必知必会——为什么是“50欧姆”?](https://mp.weixin.qq.com/s?__biz=MzIwODc4NzE1OA==&mid=2247487097&idx=1&sn=ea625bb2c49b408c9fff4e2cba5c3b07&chksm=977c8dc0a00b04d634da19e8c1e453352e8f2f02df2a45a58489cb78849c883d0b63c11478ef&scene=21#wechat_redirect)

2021年6月13日 星期日

Visual Studio 2015 Community Update 3 坑爹的問題

markdown 最近遇到的一個坑爹的問題,就是發現 visual studio 的測試總管中,沒有顯示我的測試方法,像下圖一樣,甚麼都沒有。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM6HqBURmjHAGNiQe4dDY6vddyD5w6VNcok_ABzt4v6T-f_3aTuw87y7H77r_Yzlz8VJFxCz_YTxxfOFsG8cJltfU8luGP7hoYfK1rYe223Qvn7ptm4F1pL9wBZ2sMYouYzTrYzZm-dQMV/s0/Image+1.png) 我試著執行測試,是可以執行的,只是也沒有顯示任何測試結果。一開始我先在 google 盲目搜尋,找了一些解法。 例如[安裝 MSTest.TestAdapter](https://stackoverflow.com/questions/42861930/unit-tests-not-discovered-in-visual-studio-2017/44338786#44338786),沒用,這個解法是要解決 VS「找不到」測試方法的問題,但我發現我的 VS 的 log 顯示它有找到我的測試方法,但就是沒顯示出來。 還有說刪除 [%LocalAppData%\Microsoft\VisualStudio\12.0\ComponentModelCache](https://stackoverflow.com/questions/25304425/visual-studio-2013-doesnt-discover-unit-tests) 路徑就好的,也是沒用。 然後我發現 VS 會顯示一個錯誤,看起來跟測試有關。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh83iDDWq6iOnSbo0fxjXGDw57W4tyA_T_zqBE77CDH2dgFPJ2LT0XdNin9epqtMgKn0B3P0syM5bpqljLwwRHIZkkYKEX_q6eEk2wnjJV26DpWEYO3R06K9A4RZXbjsKNVUfSa_PuLCk96/s0/Image+2.png) 就以這個組件名稱當關鍵字搜尋,然後就找到 [microsoft forums](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/04be3174-4811-4f35-930a-d1766e4d8b3a/my-uni-tests-disappeared-after-updating-visual-studio?forum=vsunittest) 的一篇討論,這裡有人也遇到一樣的問題,而且他的 VS 版本跟我一模一樣,我也是 14.0.25424.00 Update 3。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigLrnPUU_v73tzQshNRlILyVmQ7l3rmgk7gkxSg-fA4HmMCyif_QV6P6dhyI9pj6WBU4fpvuRuEkHL6ei1DPOtDEeL5MJMp57JbMASJ1ArOmlNyb4ZK1dse3bs7dzre8uMm4WZpg27O89i/s0/Image+3.png) 這個人他說了,他發現這個問題只有在非英文版的 VS 才會出現,他裝的是德文版,而且只要把 `C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\de` 目錄改名,問題就解了。 我裝的是中文版 VS,在我的電腦中,路徑是`C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\zh-Hant`。 這個資料夾裡面放了很多 Microsoft.VisualStudio.TestWindow 開頭的 dll,而且從資料夾的名稱和路徑看起來,這裡面應該是用來支援不同語言包的測試相關的組件。我試著把資料夾改名,的確測試總管就找到我的測試方法了,不過 UI 變成英文的。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9f-txiYRQPhWLQjNjFtYV_2Xe9Q0bpmBZi26HvoqjwGf9_kh6NrrQKSmYzbW5mJou-PHwkndvfUDFRLB_9Q7gtItbuHhXuTUMWyg_oCLPvoyu2BkSpnkjilZziIFWQE4XHtl2-eFKrOnZ/s0/Image+4.png) 到這裡整個情況就很清楚了,原本我的測試總管沒有顯示測試方法,是因為 VS 預設安裝的測試總管用來顯示中文介面的語言包組件有問題,把資料夾改名了之後,他用回英文的語言包組件,就可以正常顯示了。 本來這樣也是可以用了,但這個討論串裡有個好心人把各種語言的正確語言包組件附上了,為了怕這樣的好東西之後連結失效不能用了,我也放到我的 blog 中。 [下載連結](https://drive.google.com/file/d/1K7bB1KsxyVc8n3IhpcX_kVoD0rTNE0Er/view?usp=sharing) 出問題的就是 Microsoft.VisualStudio.TestWindow.Core.resources.dll,我將上面語言包 CHT 內的 dll 覆蓋掉 VS 預設安裝的,測試總管就可以正常顯示,而且是中文介面。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbC296QUef0CRZ76NfaLzauehd4KGUXz-1OIkgZDVYgCWOtcjpDf9euOwnJkZCcSkl79fuMV58cJkpqFVM_RG9QrJqVBfzvvTmRNttnH9OsYQ6i0AogBpquKtJTRIkXldzIOZX9MOYwHj0/s0/Image+5.png) 至於該討論串中微軟的人後來提供的解法,也就是移除 KB3165756 (visual-studio-2015-update3),我就沒試了,因為從這個 KB 名稱來看,移除就是把整個 update 3 移除了,可能會移掉一些有用的東西。 --- * [My uni tests disappeared after updating Visual Studio](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/04be3174-4811-4f35-930a-d1766e4d8b3a/my-uni-tests-disappeared-after-updating-visual-studio?forum=vsunittest)

2021年6月12日 星期六

[Android] Dialog 背景 DIM 效果

markdown FAB 有個常見的效果時,顯示 FAB 菜單的時候,background 會變暗,想研究一下這個效果要怎麼達成,第一個想到的是,這個效果跟 Android 顯示 Dialog 的時候很像,就想看一下 Dialog 是怎麼做到這件事的,看能不能將 Dialog 的作法借用過來。 經過一些 study 後,發現 activity 其實會對應到一個 window(window 的意義是甚麼以後有機會再說吧),系統會將 window 關連到的 View 繪製在螢幕上,而 Dialog 會在其內部建立一個新的 window,這個 window 位置會疊在 activity 的 window 之上(造成 Dialog 的懸浮效果),Dialog window 的 background 是透明的,並且將這個 window 的 dimAmount 設置為 0.6 來達成背景變暗的效果。 這個方法是蠻方便的,不過不適合用在 FAB 菜單顯示,總覺得不需要再建一個 window,而且還要處理 window 間的事件傳遞,也比較麻煩吧。 --- * [關於給Dialog設置setCanceledOnTouchOutside(true)後如何監聽Dialog消失](https://blog.csdn.net/qq_16247851/article/details/72794409)

2021年5月29日 星期六

[Android] SharedPreferences string set 的坑

markdown 之前曾經遇過一個問題就是用 SharedPreferences 儲存 string set,我已經呼叫完 commit,但是 app 關掉重開之後,卻發現 string set 卻沒有寫入到,當時一直沒搞清楚是甚麼問題,最近偶然看到原來用 string set 有這樣一個坑,值得在這裡紀錄一下。 當時一直在想是 putStringSet 出了甚麼問題,但問題是出在 getStringSet return 的 string set,不能直接將資料加到這個 string set 傳給 putStringSet,因為 putStringSet 會比較傳進來的 string set 與 getStringSet return 的是不是同一個 object,如果是則不做任何動作。 這可能是為了效能考量,但其實挺違反直覺的,不注意真的很容易踩坑。 --- * [Misbehavior when trying to store a string set using SharedPreferences](https://stackoverflow.com/questions/14034803/misbehavior-when-trying-to-store-a-string-set-using-sharedpreferences/14034804#14034804) * [Android: String set preference is not persistent](https://stackoverflow.com/questions/16820252/android-string-set-preference-is-not-persistent) * [What's the difference between commit() and apply() in SharedPreferences](https://stackoverflow.com/questions/5960678/whats-the-difference-between-commit-and-apply-in-sharedpreferences)

2021年5月23日 星期日

windows git bash 遇到 cp950 顯示亂碼問題

markdown 最近在 windows git bash 遇到執行程式時中文顯示亂碼的問題,但是在 windows cmd.exe 卻可以正常顯示,例如下圖用 ping 指令,當用 Ctrl-C 結束執行時,windows git bash 顯示亂碼。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4BBDug-9QU5ilYgv9mQOxVUZhjQFlcE1aXXc_Rix-vaBx308E58Bkza47ds_1dDrn9R4HfOqqCyBwq9JGFAz3tbkXUaEXoTAgxGdfcvv1bYu1gviwjs-dbDX0oyn4kDnU4G3HkfKHk-EB/s0/Image+5.png) 為什麼會這樣,可以先來做一個實驗,將下面的程式用 cp950 的編碼儲存為 a.cpp 檔案。
#include <cstdio>

int main()
{
    printf("中文");
    return 0;
}
然後我們用 cl.exe 編譯這個程式,如果檔案編碼的確是用 cp950 儲存,編譯器不會有警告,反之則會有警告。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfppplz29Cxky6GlJfubmV7rbjNS90zgj3anew2QE6-NysjEYjFd3tblvrPK7K6frlHLrpxy4V4jqfups68AH4N3wfSokhnJQyu1OwdzHqKmtLX4kCnVh4ylp5_yNbudnpzyFzLepE0NVa/s0/cl.png) 然後在 windows cmd.exe 跟 windows git bash 中執行編譯好的執行檔,會發現跟上面的 ping 指令一樣,windows cmd.exe 正常,windows git bash 亂碼。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSpe-AT_rfBU1yRxw-xxGGSyD1WKSMBarWo4zZ_OGy7ldwwil0fyVSHQHRcGhVdX5uL9hFOwGYstt5pH2cnbasposH_NnN2t7621zpy2lKeLS0XGRTsHdznN8kZT9J3J3c8KQIpO1UlM4X/s0/Image+7.png) 究其原因,是因為 windows git bash 預設是使用 utf-8 編碼,當它遇到 cp950 編碼的中文,不知道怎麼顯示,於是就變亂碼,而 cmd.exe 預設就是 cp950,所以可以正確顯示。 windows 一些老舊的內建程式還在使用 cp950 輸出文字,例如上面的 ping 指令,如果每次要用到這些指令就要切到 cmd.exe,實在太麻煩了,不過還好 windows git bash 內建的一個工具 winpty 可以很好的解決這個問題。 [官網](https://github.com/rprichard/winpty)上對 winpty 的描述如下。
winpty is a Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs. The package consists of a library (libwinpty) and a tool for Cygwin and MSYS for running Windows console programs in a Cygwin/MSYS pty.
可以看到,其實 winpty 的本職工作是在 windows 上做一個類似 linux 虛擬終端的,只是剛好它有將 cp950 轉為 utf-8 輸出的功能而已。關於虛擬終端是甚麼,超過這裡討論的範圍,想了解的可以看[網上這篇](https://zhuanlan.zhihu.com/p/61369678)有詳細的講解,不想了解的也沒關係,只要知道它能幫我們解決windows git bash 遇到 cp950 的亂碼問題就好。 使用方法只要將指令放在 winpty 後面就可以,如下圖所示,可以看到用 winpty 之後 ping 指令就可以正常顯示中文了。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrYreGQWBEPNV205YaaPCWnq9WQHzaeyH_jP5IrQ_GoaS5524_6-mHBNV0FePtLXEFGb2FVYvGMt-A_f6zOfe5gz2Iyvk5ywJR90SVkmxMAFX0uiAelU6xX8QVFjI3FpRWU3CF3k_sqnHG/s0/Image+4.png) --- * [winpty github](https://github.com/rprichard/winpty) * [Cygwin系列(十一):折騰終端2](https://zhuanlan.zhihu.com/p/102393122) * [Linux Cygwin知识库(一):一文搞清控制台、终端、shell概念](https://zhuanlan.zhihu.com/p/61369678)

2021年5月15日 星期六

Firefox 的開發者工具

markdown 最近有個爬網站的需求,就花了點時間研究一下有甚麼工具能幫助來 trace 網頁,發現 firefox 內建的開發者工具就是一個很好用的 tool,現在最常用到開發者工具兩個主要功能,來稍微介紹一下 一個是查看 html 的 DOM 結構,這裡查看的 DOM 結構不是單純看網頁原始碼可以看出來的,因為現在的網頁很多都是後來再用 javascript 處理過資料再呈現出來,開發者工具的 [Page Inspector](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector) 可以讓你查看經過 javascript 處理過後實際呈現在使用者眼前的 DOM Tree 還有各種 DOM 節點內的屬性。 第二個是用開發者工具的 [JavaScript Debugger](https://developer.mozilla.org/en-US/docs/Tools/Debugger) 來 trace 網頁中的 javascript。裡面有一些好用的功能例如將 minify 過的 javascript 重新排版,或是設定 breakpoint,也可以單步執行。 這兩個功能對 trace 網頁內容幫助很大,但是現在的網頁有很多其他厲害的方法去防止你爬它們網站,例如每次自動生成變數跟函數名不同的 javascript 檔案,讓你就算可以 trace,或是要寫程式去爬時也要花非常非常大的時間與精力,這個可能就只能靠經驗與熟練度來克服了。

2021年4月18日 星期日

DIY 修鞋

markdown 最近球鞋開口笑了,只是中間一部分開口而已,鞋頭鞋跟都還沒脫落。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbbW8yl-LOtyhJIXN0UMTjct52X-C9nseIkGRp-XUmq_oO5bOaHiyBBjvltdjJZjmR9PFtFxCc6k_1I0OWALVZiAmlVVdZP7_Xuj__pATBO4xgW6xiaxEunS0f61QXrorNVZhqmtZa8g2o/s0/IMG_20210417_110312.jpg =700x*) 因為其實很少打球,所以這雙鞋使用頻率不高,可能是單純時間久了就脫膠了,外表跟鞋底其實還蠻新的,想說這樣就報廢很可惜,就想著要自己來修復它。 上網看了一隻影片就買了砂紙跟南寶樹酯105準備開幹,先把鞋墊拆下來,準備磨掉殘膠後再黏起來。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7KA_5Q7g7H84I4p_ffJqwfI4KMhw0KBUscGxjwQD-SZObRTcpobqUfNUa3ZaKTIzQ6ZB1n1lRBYfH4FR7vfpijLoiMK_Wu2sirr4hZb0xFj28iLt_b9LX59yIoAZDt1QtMdUkp5fU8KK7/s0/IMG_20210417_110949.jpg =700x*) 不要看殘膠好像一點點而已,實際清起來才發現,砂紙根本沒甚麼屁用,殘膠就像黏力比一般口香糖強 100 倍的鼻屎(顏色很像),磨到手斷了可能還沒清完,後來又去五金行買了鋼絲刷跟矬刀,死命的刷,去掉半條命了才把鞋子底部的殘膠清了大半。 後來脫落的黑色鞋底殘膠就隨便弄一下,沒清乾淨也沒力清了,就把鞋子黏合了。黏起來後用鎚子打緊,感覺還黏的蠻緊的,接著就之後去打球試用看看了。 這次 DIY 修鞋的心得就是,家裡沒有電動工具例如砂輪機的,就不要自己修了,不要看網路上教學用砂紙就可以清,會清到你懷疑人生,不然就是給外面專業的修,該給人賺的還是要給人賺 ˊ_>ˋ。

2021年4月2日 星期五

電風扇上油保養

markdown 最近變熱了,晚上睡覺都會開電風扇,昨天發現電風扇不會轉了,而且會發出刺耳的摩擦聲,應該是油又乾掉了,記得上一次上油大概是兩年前,也撐夠久了,今天就再來上油吧。 要上油就要先把電風扇拆成這個樣子。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZidqRoG1YEHLH0F5vq4liLTdoKFnfkd7bBLnb2IsLgd_WePUDlv8CnWP1ZGMt63tqjMH4ps7eS6wB4c1gmCYwAjXyau54AUmzpkQI_UZNlo-CeHnaelTAw-IZo9hxJsmDhYkxXZ9waiJR/s0/IMG_20210403_101242.jpg =700x*) 接著把油點到軸心部位,我是用黃油混針車油點進去,因為之前有試過只加針車油,但是太稀了大概一兩個月就沒效,但黃油又是膏狀不好作業,就把兩個混起來用了。 點完用手試著轉動,感覺有變順一點,把風扇裝回去,插上電源一試,又順暢的轉動了!這台便宜的小電扇大概有十年以上的歷史了,但稍微上油保養一下,又可以再戰,感覺 CP 值真的很高。

2021年3月31日 星期三

[C#] Unit test mock libray - NSubstitute

markdown C# unit test 的 mock library,之前有聽過 [moq](https://github.com/moq/moq4),似乎是最多人推薦的 C# mock library,不過其實一直沒有用過,最近想要在 unit test裡加 mock 功能,就找了一下資料,發現現在有個新的 mock library [NSubstitute](https://nsubstitute.github.io/) 比 moq 還推薦的樣子,就來研究一下。 實際用了之後,發現真的很好用,基本上官網的範例就寫的蠻清楚了,一些常用的功能,設定 method return 值,檢查 method 是否被呼叫,被呼叫的順序,都可以很方便做到,接下來寫 unit test 應該都會用 NSubstitute 來輔助了。

[C#] FolderBrowserDialog 的替代品 Windows API CodePack CommonOpenFileDialog

markdown 跳出一個視窗讓 User 選擇某個資料夾,是一個非常常用的功能,.Net framework 裡也有內建了一個元件 `FolderBrowserDialog` 來提供這個功能,界面就像下面這個樣子。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpxwn2ka-XlXYOVl6F0DEMzfEtGESasY4DnieIetTd4RfkwqyTWUbImri-kCTci4XZiqzsXog-mRtKUfxXCDShTqYJwxV2dgFivVG2PWfpnkI1IYSI9QXryW6YnxhlVohgK8QhQSl-xkcu/) 不過可惜的是,這個內建的元件實在相當的難用,它有幾個問題 * 第一個是不能指定任意路徑作為根目錄,只有幾個她預設好的路徑可以給你用,例如桌面或是我的電腦。 * 第二個是沒有提供輸入框讓使用者可以先複製好路徑直接跳過去。 這兩個原因,讓使用者常常需要在樹狀結構的目錄點選好幾次才能選到想要的目錄,非常麻煩,可用性基本為零,更慘的是,.Net framework 一直沒有提供替代的元件,內建的就只有這一個,直到 .Net Core 才將這個元件做了改進。 不過如果不是自己私人的專案,是公司的案子,是沒有那麼容易讓你換平台的,很多公司可能還在用 .Net framework 3.5 呢,怎麼可能為了一個視窗讓你換到 .Net Core 呢? 好在微軟自己出了一個 3rd library:Windows API CodePack,裡面有很多好用的 GUI 元件,其中有一個 `CommonOpenFileDialog`就解決了這個問題,它的界面像下面這個樣子。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQXAECitT8fiw-8jmVPdzxb8yQlYnod9_LCdhlfxLGk7i3Og3GoVIOweeFrJRwf3bY5sDEBK220cVmQacCBWJQCyfoZ15-eRJ321HQ9qEIj6BhqfESaiIQn729lukbabrDiZg-5OAyvIkU/s0/dialog2.png) 程式碼也相當簡單。
using System;
using Microsoft.WindowsAPICodePack.Dialogs;

namespace ConsoleApplication1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var dialog = new CommonOpenFileDialog()
            {
                IsFolderPicker = true,
                InitialDirectory = @"F:",
            };

            dialog.ShowDialog();
        }
    }
}
不過不知道為什麼似乎微軟已經把這個 3rd library 拿掉了,也沒有在維護了,所以已經找不到它的官網,不過還是有人把它上傳到 [github](https://github.com/contre/Windows-API-Code-Pack-1.1),也有幫它做更新維護,甚至讓它支援到 .Net 5.0 了,想要使用的人還是可以在網上找到地方下載的。 --- * [How to use OpenFileDialog to select a folder?](https://stackoverflow.com/questions/11624298/how-to-use-openfiledialog-to-select-a-folder) * [Breaking changes for migration from .NET Framework to .NET Core](https://docs.microsoft.com/en-us/dotnet/core/compatibility/fx-core#modernization-of-the-folderbrowserdialog)

2021年3月6日 星期六

[Python] 修改 builtin function 行為

markdown 遇到一個需求是,需要修改 python print function 的行為,讓每一次 print 呼叫之後都立即 flush。查到 python 有一個 [partial function](https://docs.python.org/3/library/functools.html) 可以修改 print 的行為。
from functools import partial
print = partial(print, flush=True)

import my_module
原本以為只要將程式放到 import 之前,就可以影響到之後 import 的 module,但是發現沒有作用,這是因為 partial 的作用域只有在執行 partial 的該 module 內,無法影響到其它 module。後來發現 python 有個 builtin module,所有內建的函式都在裡面,我們在呼叫內建的函式時,最後都是參考到 builtin module,就想是不是可以直接替換掉 builtin module 內的 print 函式,一試果然就成功了。
import builtins
from functools import partial
builtins.print = partial(print, flush=True)

import my_module
替換掉 builtin 內的 print 後,之後所有呼叫的 print,不管是在哪個 module,都會參考到新函式,真是很方便。 --- * [Everything in Python is mutable](https://faster-cpython.readthedocs.io/mutable.html)

2021年2月6日 星期六

[Git] git pack loose object out of memory

markdown 最近有個專案在用 git-gui 時一直跳出來說 loose object 太多要我壓縮,但每次按下 OK 讓它壓縮後,都跳出 out of memory 的訊息壓縮失敗。於是每次用 git-gui 時這個訊息就會跳出來一次實在有點煩,再加上有時會遇到怪怪的問題不知道跟 loose object 很多有沒有關係,於是就花了一點時間查一下看怎麼解決壓縮 loose object 時 out of memory 的問題。 其實 git 有 command `git gc --auto` 可以壓 loose object,不過預設是 loose object 超過 7000 時才會動作,git-gui 顯示提示訊息時我的專案卻只有 4 千多 loose object,看來是 git-gui 有自己的設定,我實際跑了 `git gc --auto` 也確實沒有作用。 如果不管 loose object 個數就是要壓的話,使用 `git gc` 就好了,不過我用了以後一樣會 fail,顯示 mmap invalid argument,雖然錯誤訊息沒有明確指出是 out of memory,但開工作管理員觀察,在壓縮時確實把記憶體吃滿了,因此應該還是因為記憶體不足。 在網上查了一下,發現在做壓縮時,git 預設會照你的 CPU 核心數開啟同等數量的 threads 來工作,我的電腦是 4 核心,git 的 log 也確實顯示它開了 4 個 threads。 在 [stackoverflow](https://stackoverflow.com/questions/3095737/is-there-a-way-to-limit-the-amount-of-memory-that-git-gc-uses) 看到有個解法是改 git config 來降低記憶體使用率。我沒有像連結裡講的連 windowMemory 跟 packSizeLimit 都改掉,只有改 thread,因為我覺得主要就是因為開 4 個 thread 才吃那麼多記憶體,改了後果然壓縮就成功了。 其實這個案子是接手來的,前人把很多不是程式碼的大檔案都通通塞進了 code server 裡,猜測是因為這樣才造成壓縮時記憶體吃這麼多,不過只開一個 thread,雖然時間比較久,但還是可以壓縮成功。 --- * [Is there a way to limit the amount of memory that “git gc” uses?](https://stackoverflow.com/questions/3095737/is-there-a-way-to-limit-the-amount-of-memory-that-git-gc-uses)

2021年1月23日 星期六

WMI 失效 問題

markdown 最近遇到一個奇怪的案例,在某台電腦上當程式使用 WMI 功能時總是跳出 exception 顯示無效類別,查了一段時間後才發現,可能是因為 WMI 初始化失敗了,所以 WMI 功能無法使用。 去查電腦上的 WMI 屬性頁面,就如同下方連結的圖片一樣,會顯示無效類別的字樣。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdUv9O25b9QpZsLHUB2TNBBpM2jRTV4-GxoTLwwp0nKMxnHfw9THqYwfS-dBsP4MQBTpY-THU62JhaoVtbTL9rcj7IrAmNIGXuKog4yY9GRU2deD-_d66uvPlD8Jcgippn7i0kEK9n7iDz/s0/4645b456gy1fezcz62mwxj20db0hkjuf.jpg) 不知道為什麼電腦會有這個問題,不過這個問題不好查,也比較少見一點,就記下來備查。 --- * [c# 'Invalid class' in a simple WMI query](https://stackoverflow.com/questions/6918265/c-sharp-invalid-class-in-a-simple-wmi-query) * [WMI 初始化失败导致的WIN10处理器和内存不可用](https://www.weibo.com/ttarticle/p/show?id=2309404100596641757142)