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)

2020年12月22日 星期二

[Android] Google 取消與西聯匯款的合作

markdown Google 廣告收入要取消跟西聯匯款的合作了,到今年底為止還可以用西聯匯款領取,明年就不行了,所以最近就來做第一次跟最後一次的西聯匯款領取廣告收入。 實際試著領取,基本上步驟跟網路上講的大同小異,只要有 Google 匯款記錄的 MTCN 碼,在京城銀行的網銀點一點,匯款就直接即時入到你的帳戶了,超級方便。 西聯匯款不能用後,現存能用的方法就是用電匯,但是電匯手續好像比較麻煩,而且還要付給銀行比較多的手續費,這個就之後等匯款累積到一定量要領取時再來研究了。 --- * [Google廣告收入的銀行電匯費用比較](https://max-everyday.com/2020/08/google-adsense-payment-bank-fee/) * [Google Adsense 停止西聯匯款(Western Union)付款服務!改支票或電匯](https://www.vedfolnir.com/google-adsense-%E5%81%9C%E6%AD%A2%E8%A5%BF%E8%81%AF%E5%8C%AF%E6%AC%BE%EF%BC%88western-union%EF%BC%89%E4%BB%98%E6%AC%BE%E6%9C%8D%E5%8B%99%EF%BC%81%E6%94%B9%E6%94%AF%E7%A5%A8%E6%88%96%E9%9B%BB%E5%8C%AF-41163.html) * [Google Admob透過HSBC Direct電匯方式請款](https://noter.tw/2256/google-admob%E9%80%8F%E9%81%8Ehsbc-direct%E9%9B%BB%E5%8C%AF%E6%96%B9%E5%BC%8F%E8%AB%8B%E6%AC%BE/) * [Google Adesnse請款以電匯方式取款心得](https://kk665403.pixnet.net/blog/post/405026836-googleadsense-wiretransfer) * [Google停止西聯匯款支付款項一定要知道的事](https://newguest88.pixnet.net/blog/post/350915383-google-adsense%E6%94%B6%E6%AC%BE%E6%96%B9%E5%BC%8F%E6%87%B6%E4%BA%BA%E5%8C%85-%E8%A8%AD%E5%AE%9A%E6%95%99%E5%AD%B8%E6%94%BB%E7%95%A5-%E6%94%B9) * [Google Adsense廣告費 「電匯收款」設定流程及電匯手續費說明(Youtube及Blog皆適用)](https://goodideamin.com.tw/blog/post/googleadsensewiretransfer)