pretty code

2021年1月1日 星期五

2021 第一篇文章

昨天下午突然來了一堆臨時需求,再加上天氣寒冷,回家就懶得再把我的筆電拿出來,故原本要發的一些感想也就這樣無疾而終。

今天是 2021 年的第一天,又買了幾本書,希望今年能夠有個好的開始。

這幾天一直在想如何寫個 GUI App 跑在 Kobo Clara HD 上,以解決 KoboCloud 書本數量一多在 Google 雲端硬碟同步失敗的痛點,很想用比較簡單的方式來解決,但暫時還沒有有想法,希望在我的 Kindle Paperwhite 3 掛掉前,我能順利的找到解決方式。

另外,最近一直在觀察最大同性交友網站(Github)上面討論的一個專案,該專案是想要解決某個不能說的秘密!但對於已經搞定的我來說,看著他們想用正規的方式來突破遇到困難,卻又不能給他們任何提示,感覺就像看到兩個月前的我一樣,那種不得其門而入的感覺就是阿雜。

接下來,我想說一個故事。在《獵人10》中,小傑跟奇犽被信長捉住,後來還是多虧小傑想到仙派告訴他們有關贗品的技巧中找到逃跑的方法,而這個方法就是「從旁掉包」。

還有上星期時,實測了一下在只簡單準備 2 樣菜,炒吻仔魚和炒空心菜,從料理、用餐以及洗碗跟清潔善後總共花費的時間,結果居然要 110 分鐘?真是不統計不知道,如果家裡是另外一半負責廚房的,真的是要對他或她好一點。

目前光讀墨就還有 127 本書未讀,撇開只是當工具書用的,應該也還有百來本要看吧?幸好現在繁體中文書對我越來越沒有什麼吸引力,我一定要在今年把它通通結束。

2020年12月29日 星期二

《讓訂閱制更長久的超級會員經濟》

雖然買了好幾百本中文書,但都是看過就算了,頂多憑記憶需要時再翻閱。即使是小說,我覺得偶爾還是會有些名言可供參考。雖然我們可以透過劃線來加深印象,但劃到最後,可能會變成一堆重點。

以程式語言的函數參數來說,一般建議是 3 ~ 7 個,故我決定以後每看完一本書,就要記錄我覺得有用的重點 3 ~ 7 個,這樣也可以從中學習到東西。

本書重點

1. 業務性質轉移成訂閱制時,高層的支持是最重要的。

2. 利用各種不同指標來衡量訂閱制績效。

3. 我們要的是永久的收益,不要追求短期營收成長。

4. 現有會員與未來會員?

5. 現有顧客、前顧客、潛在客戶以及離去的潛在客戶,要一起譜成協奏曲。

2020年12月17日 星期四

使用 wxWidgets 開發剪貼簿相關工具解決閱讀技術文件痛點

最近一直在閱讀技術文件,這份文件需要搭配某個實體服務,參照它服務裡面各個連結的相關資訊,才能有助於理解此份技術文件。由於它的資料都是 JSON 格式,參照某個項目時,可能需要再開啟相關的其他連結,故只能很克難的不斷複製,並在 Chrome 裡面新增視窗後貼上。

看了幾天後就覺得很阿雜,複製貼上還是小事,之後可能會不斷的開啟這些開啟過的連結,如果每次都是使用人工方式操作,勢必很沒效率。還好這樣的需求我很久以前就有類似的經驗,解決的方式也很簡單,就是去監控 Windows 剪貼簿的變化,只要剪貼簿的資料是我剛才複製的連結,就自動傳遞給 Chrome,Chrome 預設行為就是新開視窗,我就可以從 3 個操作步驟減少成 1 個操作步驟,減輕了不少人力。除此之外,我還可以把這些開啟的各個連結儲存下來,隨時有需要都可以再開啟,甚至不要用複製方式,直接用滑鼠點擊到該行連結,直接去觸發 Chrome 做事。

以前的程式是使用 BCB 6.0 個人版開發,目前手邊並沒有安裝該套軟體。於是便打算使用幾年以前曾經玩過的 wxWidgets 來開發此工具。雖然程式沒有超過 300 行,但還是找了一下資料,解決了一些問題。

1. 開啟 Adobe PDF Reader 遇到的剪貼簿問題。
2. 如何加上 wxDev-Cpp 沒有內建的 Windows Event。
3. 使用 wxWidgets 的 File IO。
4. 使用 wxWidgets 的 INI class。
5. 如何得知 wxTextCtl 點擊時的行數。

其中搞了我最久的就是問題 1,只要在 Adobe PDF Reader 裡面複製文字,就會讓我的程式觸發一個 Error 視窗,而這個視窗是因為程式嘗試要 GetData 而導致失敗。不論我用什麼關鍵字去 Google 查詢,找不到資料就是找不到,可見使用 wxWidgets 的人算是小眾。後來還是去看原始碼,發現它是使用 wxLogSysError 這個函數去彈出視窗,接著便是去找 wxLog 相關的說明文件,終於讓我發現可以使用 wxLog::EnableLogging(false) 來停止這個程式行為。

我終於可以從技術文件中鬆一口氣,雖然我私心認為這個規格不太會成為共通標準,但目前也只能且戰且走。

2020年12月11日 星期五

Redfish 概述

Redfish 是一套標準被設計用來提供簡單且安全的伺服器管理方式。它結合了目前常見的 Web 技術,例如 RESTful API、JSON format 等,目的是讓 IT 可以利用熟悉的工具來達到管理伺服器的目的。

DMTF 是 Redfish 的負責組織,網站上除了有相關技術文件可參考外,其在 Github 上也有提供一些工具,可以在初期學習時邊對照 Spec 邊幫助理解相關的規範說明,底下就簡單介紹我覺得還不錯的兩個工具。

Redfish-Mockup-Server

這是個模擬 Redfish Service 的工具,只要有 mockup 好的假資料,便可以使用瀏覽器來看相關的 Schema 組成。我最早是在 10/8 下載此工具,一開始的 README 根本沒提到哪裡有 mockup 資料可以參考,還好過沒幾天,就在 DMTF 網站上發現對應的資料,其代碼是 DSP2043,最新的檔案裡面包含不只一種的 Redfish Service mockup data,可以隨意選擇一種來使用。

py .\redfishMockupServer.py -H 127.0.0.1 -p 8001 -S -D .\DSP2043_2019.1\public-rackmount1

寫這篇文章時,再度上此工具網站查詢,其 README 已經在 11/11 的 commit 增加了 mockup data 的說明,也提到 DSP2043 的關鍵字,故之後的人就不用像我一樣,還要自己摸索如何使用此工具。

Redfish-Mockup-Creator

目前的 Server 廠商,例如 Intel、Dell、HP 等,其伺服器都有支援 Redfish,如果不是這一兩年內購買的機器,只要廠商有提供 BMC 韌體更新,就可以透過更新韌體的方式來支援 Redfish。像我手邊是一台 5 年前購買的 Dell 機器,更新韌體之後,就有提供 Redfish 界面的管理方式,只要設定好帳號密碼,使用 Python 控制開關機都沒有問題。

這個工具就是用來產生現有 Redfish Service mockup data 用,假設你有想要管理的目標,但可能因為網段等限制不方便存取測試,在開發初期便可以使用這套工具產生一份假資料,配合 Redfish-Mockup-Server,就可以方便理解目標的 Redfish Schema。

此工具也可以把 HTTP Header 儲存起來,甚至是回應時間,故可以更真實的模擬目標。如果想要抓到更完整的資料,記得把目標機器開機,不然有些資料會因為處於關機狀態而不是很完全。

另外,像 Dell 的 Schema 中有包含一些 Windows 不能使用在資料夾的特殊字元,例如冒號等,故在 Windows 下執行 Creator 工具就無法產生這部份的資料,建議還是在 Linux 下執行。

python redfishMockupCreate.py -u root -p xxx -r 192.168.1.100 -S -D my-mockup

2020年12月9日 星期三

87.0.4280.88 更新後,下載 ZIP 檔失敗

Chrome 在 2020/12/2 更新版本到 87.0.4280.88,從 87 版開始,如果在 HTTPS 連線中下載一個 HTTP 連結的 ZIP 檔案,這時會發現什麼事都沒有發生,既沒有下載檔案,也沒有錯誤訊息。原因是 Chrome 在其計劃中,要逐步的擋掉這些不安全的連線行為,相關時程如下表。

也許是計劃有變化,最後並沒有像這張表一樣,從 86 版開始就擋掉 ZIP 檔案。

如果有遇到這個奇怪的現象,可以檢查看看,是不是發生這個問題。

2020年12月4日 星期五

2020 年終讀墨購書金額統計

雖然現在才 12 月初,但除非有特殊狀況,不然這個月應該不會再買書了,使用自己的工具統計一下整年購書金額。

整體來說,今年金額又比去年增加,去年金額還包括了一筆 $13,500 的 mooInk Pro 10 吋機器,故今年多購買了 $14,000 左右的書籍。

尤其上半年時,把一些漫畫收齊,還買了一堆浩基哥的書,接著又趁著類似商管書籍折扣的時候,買了一些有興趣的書。因此上半年的購書金額已經超過 $32,000。

至於下半年時,雖然有週年慶等活動,但我都沒有興趣,再加上讀墨桌面版軟體改版,故 10 月的購書金額才會驟降,一直到 11 月有了更新版後,才又開始恢復買書。

雖然又比較有興趣買書了,但頻率我想應該會再降低,畢竟一些新書對我都沒啥吸引力。有時候還是老朋友比較對味,下半年我覺得最好看的書應該就是李查德的《過去式》,其它像是《零規則》、《軌道》、《借殼上市》等書籍,都沒有什麼驚豔的感覺。

另外,今年還購買了一些以前購買紙本書後因為收納空間不足丟掉的書,雖然像《饑餓遊戲》之類的可能也沒有時間再看,但還是希望買回來當作紀念。其中《火星任務》因為貪便宜已在中亞買過,但我在下半年還是狠下心的的趁著週年慶再把它買回。目前想再購回的大概只剩藤井樹和傑克李奇系列吧?前面一個是因為缺錢,另外一個則是因為沒電子書。

撇開讀墨不算,其他平台印象中加起來應該沒有超過 20 本書,大部份都是技術書籍,其中 Google 圖書就買了約 $3,500。雖然 Google 圖書技術類書籍都是 PDF 居多,但因為便宜還是買了一些。

總之,今年大概就是這樣吧,希望明年會有更多讓我驚豔的書吸引我購買。

2020/12/24 更新

後來為了測試緣故,還是又買了幾本書,到年底還有幾天,應該不會再增加了吧?

2020年11月27日 星期五

UefiMain Entry 的應用

忘記在哪裡看過,只要有 UDK Base,其實一個簡單的 Hello World 小程式也可以成為一個簡單的 Shell,我曾經試過 main Entry 的 Hello World,但只會出現 Disk Error 的錯誤訊息。

昨天看了 LAB-Z 的文章,裡面有提到一個日本人寫的書,我才恍然大悟為什麼之前無法成功,差別在我們需要使用 UefiMain Entry,而不是 StdLib 的 main Entry。

雖然曾稍微看過 Shell.c 的 code,也知道它是使用 UefiMain Entry,但我一直以為寫 Shell 有點像是寫 Windows Service 或者像在寫一支 Driver,有對應的介面需實作,這樣 OS 才能跟你寫的程式溝通,搞了半天,原來一切都是我想太多!

只要下面簡單幾行,並把編譯完的檔案改名成 BootX64.efi,放在隨身碟 EFI\Boot 下,開機時就會執行你的小程式。

#include <Library/UefiBootServicesTableLib.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
    // Clear the screen
    EFI_STATUS Status;
    Status = gST->ConOut->ClearScreen(gST->ConOut);
    if (EFI_ERROR(Status)) {
        return (Status);
    }

    // turn off the watchdog timer
    gBS->SetWatchdogTimer (0, 0, 0, NULL);

    gST->ConOut->OutputString(gST->ConOut, L"Enter UefiMain \r\n");

    while (1) {

    }

    return EFI_SUCCESS;
}