pretty code

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;
}

2020年11月22日 星期日

PW3 自行轉檔書籍無法指定字型

版本:5.13.2

以前自行轉檔的書,如果不能更換字型,我遇到的情況都是語系誤指定為非繁體中文的語系,因此無法指定繁體中文字型。

最近第二次重練嫁衣神功後,目前已遇到 3 本書在 PW3 都無法指定字型,閱讀體驗非常的糟糕。在前一篇我已經有約略提到解決方式,目前只知道不是每本有指定 font-family 的書都不能更換字型,但不行的書一定要把所有的 font-family 都全砍光,這樣才能指定字型。

有嘗試針對某本書去微調 font-family,但都無法成功,總共嘗試過幾種 case:

01. 字型名稱不要單雙引號混用。
02. 有好幾種字型的 font-family 敘述都砍掉,只留一種字型的敘述。

看來暫時解決方式只能在嫁衣心法中新增移除指定 CSS 的功能了。


2020/11/23 更新

稍微分類一下成功與失敗的類型。另外,這篇文章是我目前看到 CSS 字型解說最詳細的。

成功

01. 有一個字型以上的混合設定,無引號+單引號組合,不只一個 font-family。
02. 有一個字型以上的混合設定,全部都是雙引號,雙引號裡面又加了單引號(" 'serif'"),只有一個 font-family。
03. 有一個字型以上的混合設定,無引號+雙引號組合、全單引號、有的使用 @font-face 語法,src 是 local 與直接指定字型,不只一個 font-family。

失敗

01. 只有一個字型設定,全部都是單引號,字型名稱只有 2 種,'sans-serif' 或 'serif',不只一個 font-family,另外有用到 font 敘述。
02. 有一個字型以上的混合設定,雙引號+單引號組合,不只一個 font-family。


2020/12/04 更新

拿 Kobo Clara HD 來當對照組,使用 kepubify 轉檔,稍微看一下 kepubify 程式碼,沒看到有對字型做什麼事。

至於轉換出來的 KEPUB 檔,在 Clara HD 上可以順利使用圓體字型,雖然我沒有再測試原始的 EPUB 檔,但我猜原始書籍的 CSS 應該是沒有什麼大問題。

結論應該就是 kindlegen 的問題居多吧?


2020/12/07 更新

最近共轉了 30 多本的書,有些我已經看過的就沒在 PW3 上檢查了,截至目前為止有出現這個問題的書本數量已經來到 8 本,錯誤率實在是有點高,趁著今天午休,馬上加上 CSS Filter 功能,希望也能一併解決轉檔的書在 PW3 閱讀時偶爾會出現的錯誤問題,每次遇到這個問題,PW3 就會自己回到首頁,需要再一次點選才能閱讀,另外,進去後雖然有記住預設字體是圓體,但顯示的完全是另外一個字體,需再任意調整成別種字體再調整回來才會正常顯示圓體。


2020/12/08 更新

昨天加上 CSS Filter 後,大概轉了 10 來本書有,其中有一本書,不是用 font-family,而是用 font 敘述,於是這本書就成了漏網之魚。雖然可以額外再做處理,但除非知道所有的字型名稱,不然無法簡單的把字型排除,算了,就當做是不足勝有餘吧。


2020/12/10 更新

拿掉 font-family 後,確定對 PW3 偶爾會發生錯誤問題沒有幫助,昨天在看同一本書時,一樣會發生此錯誤,記錄一下。

2020年11月20日 星期五

讀取書名遇到的 Bug

最近在轉檔時,遇到某本書名使用程式無法解析,程式會判斷沒有書名資訊,但用文字編輯器卻看不出有什麼問題?

該檔案是一個 UTF-8 編碼的 XML 檔,但我自己是習慣使用 Re 來解決這類小問題,我的正規表示法如下:

let regex = /dc:title.*>(.*)<\/dc:/

不論是 Javascript 或是 Python,都可以在正規表示式中任意圈出自己想要的資料,之後拿來使用就很方便。

回到問題身上,一開始會以為是不是書名裡有特殊字元導致,尤其這本書的書名接近 60 個字,實在嚇人。但把檔案和程式簡化後繼續測試,卻發生了隨機事件,有時候可以成功,有時候仍然不行?

嘗試使用 grep 和 Python 程式,兩者都可以正常執行,難道是我用的 Node.js 版本太舊導致?寫程式的大概都聽過類似的笑話:我的程式看起來沒問題呀,一定是 Compiler 的 Bug!殊不知這個是最不可能的事,如我一般的普通人寫的程式,理論上撞到這種問題的機率是非常的低,所以這個念頭也只是一閃而過。

好吧,來看看 binary 值好了,只要不是 ASCII 編碼的檔案我都很懶得看,畢竟我也無法一眼看出該中文的編碼為何?為了驗證這個問題,勢必要找出相關編碼的值才行。

檔案的 binary 內容長這樣。

書名最後 4 個字的編碼長這樣。

相比之下,結尾多了一個 E2 80 A9 的字,拿掉它之後,我的程式就恢復正常了。後來回想,之前發生隨機事件時,其實 UltraEdit 已經有徵兆,有時候針對該段文字反白複製時,偶爾便會看到一個不存在的字元,只是當時沒有想太多。

雖然問題解決了,但回到問題的本身,這個字是不合法的 UTF-8 字元嗎?

我們先來看看它的 binary 值。

1110 0010 # 1000 0000 # 1010 1001

它屬於 3 個位元的字元,其個別位元的開頭也有符合規則。將剩下的黑字再轉回 Unicode 碼,其值為 \u2029,跟用 Python Code 的 Re 結果一致。

使用 Chrome 直接開啟 XML 檔,可以正常顯示出該字元,使用全字庫網頁查詢,該字是一個中日韓相容表意文字區編碼。

查到這裡我就真的沒輒了,要再細究下去,可能要往 Node.js 用的 Re Code 方向去追查了。

後記

快下班時,無聊使用 \u2029 關鍵字查詢,才發現原來 \u2029 或是 \u2028 等字元,在正規式中是當做 a single white space,故會造成正規引擎把這一字元視為換行,而 "." 正規字元不包含換行字元,雖然可以用 "s" flag 來 match 換行字元,但書名就會包含換行字元,解決方式也很簡單,稍微更改 Re 即可。

let regex = /<dc:title.*>(.*)(\s*)<\/dc:title/


2020/11/22 更新

\u2028 是行分隔符

\u2029 則是段分隔符

不過重點還是 "." 字元不包含換行字元以外的字元, 我一直以為是包含全部字元,也算是學到一課了。

另外,這本書還真的是問題多多,放進我的 PW3 沒辦法更改字型,我目前的 PW3 版本為 5.13.2,我一向都是用 kindlegen 轉檔,這樣直式的書才能維持直式。

針對這個問題,好幾個網站都說即使是使用新型的 MOBI 格式,目前也不支持更改字型了,一定要使用 AW3 格式。但我覺得應該不是?一來我只有偶爾幾本書不行,二來我也有用 calibre 轉成 AW3 格式,結果一樣是不能更改字型。還好後來有看到一篇文章,說是把 CSS 裡面指定的字型拿掉即可,也就是 font-family 這行敘述拿掉,說也奇怪,這本書就這樣恢復正常了,我也終於可以使用我最喜歡的圓體字型來閱讀。

我後來想想,這個只是建議字型,理論上應該不影響功能才對。我目前只能想到 2 個原因,1 個是因為指定的字型有問題導致 Kindle 有 Bug,另外 1 個就是這本書不知道哪裡違反了 EPUB Spec 的規範。

我現在只能確定,隨便找了一本可以換字型的書,其 CSS 檔案也是有指定字型,差別在這本書的字型名稱沒有使用雙引號包住,而有問題的書則是同一行中有使用單引號,也有使用雙引號。理論上單雙引號皆可,只有在字型名稱包含空白時,才會使用引號包住。

2020年11月19日 星期四

Node.js 字串取代

一般來說,有原生的 Javascript 函數我都會使用原生的函數,又因為我幾乎每天都用不同程式語言在工作,導致我很難記住一些通用函數的用法。故每次都要使用關鍵字 "javascript string function" 來找可以使用的函數。

一開始我使用的是 replace,後來才發現只能取代一次,沒關係我們有另外一個 replaceAll 可以用。

不過在我的 Node.js 版本中,似乎沒有支持這個函數?還好 replace 可以使用正規表示法,記得加上 g flag 即可。

s = s.replace(/\\/g, '/');

2020年11月17日 星期二

第二次重練嫁衣神功

之前原本已經不抱希望,沒想到在忙碌的工作時光中等待測試結果的空檔,突然找到破口,就這樣又開啟了第二次重練嫁衣神功的修行。

拿出之前的檔案,稍微改一下,執行結果看起來有符合預期。

為了慶祝這個意料之外的驚奇時光,決定購買《一個都不留:克莉絲蒂120誕辰紀念版1》一書,也為這一刻做個記錄。

人生就是這樣,你永遠無法預料。

2020年11月16日 星期一

XlsxWriter 是 python 一個很常用的模組,主要是用來產生 excel 檔案,RD 最常用的場景應該是把測試結果文字檔轉成檔案,好方便後續相關工作。

之前幫別人產生測試報告時,用的都不是 python 語言,最近又幫忙產生別的測試報告,剛好對方近來比較常用 python,於是我也趁機試了一下 XlsxWriter,把一些常用語法記錄在這裡,下次再用就不用在專案資料夾裡翻找。

import xlsxwriter

def main():
    output = 'example.xlsx'

    wb = xlsxwriter.Workbook(output)
    ws = wb.add_worksheet('Sheet1')

    # freeze window
    ws.freeze_panes(1, 1)

    number_format = wb.add_format({'num_format': '00.00'})
    number_format.set_font_color('red')
    number_format.set_align('center')

    title_format = wb.add_format()
    title_format.set_align('center')
    title_format.set_bold()

    # title
    row = 0
    for col in range(8):
        title = 'Title %d' % col
        ws.write(row, col, title, title_format)

    # write something
    for row in range(1, 8):
        for col in range(8):
            s = '%02d' % (row * 10 + col)
            ws.write(row, col, s, number_format)

    wb.close()

if __name__ == '__main__':
    main()

2020年11月11日 星期三

DD0403MA_3V3

10/28 在 Amazon.com 購買了這個型號的 DC Converter 共 6 顆,11/10 就收到貨了,速度還蠻快的。

攤提運費後,一顆約要 NT $160 元,不算便宜,但買得到比較重要。

詳細規格

DD0403MA_3V3
3.5V-6V to 3.3V DC DC Step Down Converter LDO Module

Description:

Low power consumption,Low ESR Cap.Compatible DD0403MA Series LDO Module,Very suitable for lithium battery-powered
Input voltage: DC 3.5-6V
Output voltage: DC 3.3V
Long time maximum output current 300mA
Short time maximum output current 400mA
Highly Accurate:±2%
Quiescent Current : 8uA
Short Circuit Current : 30mA
Over Current Protection : 500mA
Operating Temperature: -25℃ ~ +85℃
Size(Not including pin) : 11.6 x 7.8 x 2.5mm
Weight : 0.5g
   
Attention :

This is a DC-DC voltage converter module,Must be noted when using:
1 Input voltage can not be greater than the maximum input range
2 Output power can not be greater than the maximum load for a long time
3 Input power must be greater than the output power, because the power consumption of the module itself

原本是想配合 4 顆 AAA 鹼性電池,再做一個新的 ESP8266 翻頁器,買了才想到 AAA 電池出廠電壓有可能超過 1.5V,故 4 顆串聯可能會超過電壓工作範圍,如果是 3 顆串聯又達不到我想把電池用乾的需求,因為其最低工作電壓只到 3.5V。看來還是只能配合 18650 等電池使用。

這個大小比我之前買的升壓 Converter 都還要更小,也就是說更考驗焊接技術了。

2020年11月2日 星期一

VMware vSphere 7.0 安裝時相關問題解決方式

連續好幾天都在搞這個東東,搞到都要懷疑人生了。這個問題從一開始安裝時就遇到很多坎,解決一個又有一個,一個完又一個,容我慢慢道來。

01. 無法下載 ISO 或 ZIP (客製化用)

我的工作環境總共有 2 個不同網路可以使用,不管是哪一個網路按下載檔案,網站都是無聲無息!打開 Chrome 開發者工具觀察,發現問題是出在 Javascript 的某個變數找不到,實在不太可能為了它去 debug 該網站,只好假設網站有問題,等網站管理者發現修復。從早上試到下午都沒有改善,最後是用自己的手機網路解決,我也懶得回過頭確認使用工作環境網路是否就正常了。只是據我之前下載國外軟體經驗,有時候可能是因為防火牆等關係,多試不同網路環境即可解決。

02. Realtek 8168 網卡晶片不支援

以前的版本 (6.7) 有兩種解決方式把第三方 packages 包進去:一個是使用 VMware PowerShell CLI 重 build ISO 檔,另外一個是使用高手再包裝過的 PowerShell script  (ESXi-Customizer-PS) 來解決,我這裡是使用後者。一開始會先遇到安全性問題,這個問題比較簡單,使用管理員權限執行 "Set-ExecutionPolicy RemoteSigned" 指令重新設定原則即可。

接著會遇到沒有 VMware 相關模組問題,印象中是缺少 "Core" 和 "ImageBuilder" 這 2 個模組。一開始還傻傻的去下載 "VMware-PowerCLI-12.1.0-17009493" 整包檔案,下載下來發現也不會安裝,後來發現可以直接透過官方網站安裝庫來安裝,只要使用下列指令缺什麼就裝什麼就好 "Install-Module -Name VMware.VimAutomation.Core"。

好不容易用指令產生了 ISO 檔 ".\ESXi-Customizer-PS.ps1 -izip .\VMware-ESXi-7.0.0-16324942-depot.zip -v70 -pkgDir D:ESXi-Customizer-PS-2.8.1",過程中會看到類似 API 版本不相容的 warning,沒想太多就去機器執行安裝動作,最後還是無法使用 Realtek 網卡,據這個網友的說法是 6.7 以後的 API 有更改,除非有高手提供給 7.0 使用的 packages,不然這個問題會是無解。最後跟別人借了一張 INTEL I350 網卡才讓安裝程式可以順利執行。

03. 安裝完後無法開機

跟前面幾個問題比起來,安裝過程只能說是無以倫比的順利,我都想要開香檳慶祝了。

沒想到我果然還是太嫩了,做事那有可能順風順水?一裝完就遇到無法開機的問題,開機過程 BIOS 只會無聲無息的回到 BIOS 選單,連個訊息都沒有?官網有一篇文章提到這個問題,只是提到說可能是安裝程式過程中,沒有把 UEFI Variable BootXXXX 寫好,進去選單把開機裝置 "VMware ESXi" 加入即可。第一次安裝後,我連這個裝置都沒看到,雖然我用 Linux 開機碟下指令除錯,可以看到硬碟第 1 個分割區是這個名稱沒錯,但是在 BIOS 選單都無法看到,只能看到整顆硬碟名稱的開機裝置。一開始想說先用我另外一台小電腦來測試安裝步驟,這個機器更慘,安裝前置作業就會死當,故無法做參照組。

依稀覺得可能跟 Secure Boot 有關?排列組合 BIOS 選項試了安裝好幾次,每一次都無法開機,但在某些組合下可以看到 "VMware ESXi" 這個開機裝置,嘗試使用 Linux 安裝碟從本機開機的選項也無法順利開機。在各個嘗試的過程中還發現,只要把 USB 安裝碟裡面的 "boot.cfg" 裡面的 "kernelopt=cdromBoot runweasel" 參數改成 "kernelopt=" 就可以變成混合 USB 和硬碟開機,也可以讀取 datastore 裡面的 VM 檔案,只是這種開機方式,每次都要重新設定 VM,實在不是個好選項。

認命的把官方文件大概瀏覽了一遍,也是沒有頭緒,只能確定硬碟裡面的分割區是如文件所述的 7.0 的新配置方式。

再來是猜測會不會是 BIOS 有問題?不過我用我自己 build 的 UEFI Shell 倒是可以開機,主機板官網的最新 BIOS 也只到 2014 年,暫時先不懷疑它好了。

乾脆來嘗試安裝到隨身碟好了?只不過安裝完後該 USB 裝置還是無法開機!

最後還是來看一下主機版 BIOS 版本好了,版本是這塊板子的第一個出廠 BIOS,跟最新的版本相比,時間約莫差了一年多,但是中間卻有 15 個版本的 BIOS 更新,雖然 Release Note 看不到跟 UEFI 相關的更新,還是死馬當活馬醫的更新一下 BIOS。

想不到一更新完 BIOS 後,連重新安裝都不用,就可以直接用原本硬碟裡面裝好的 vSphere 開機,終於結束了這無止境的困境。

最後開啟 vSphere 的 SSH 功能,好方便遠端登入下指令,vSphere 是一個類 Linux 的 OS,故常用的指令可能沒有,或是指令的參數不一樣,下面幾張圖分別是用了 "-df -h","/usr/lib/vmware/misc/bin/fdisk -l","/usr/lib/vmware/uefi/bin/bootorder -l" 等指令的結果。




最後一個結果比較奇怪,貌似我不是使用 UEFI mode 開機?但我記得我的開機選項是 "VMware ESXi" 無誤!

2020/11/04 更新


使用自己的小工具檢查 UEFI BootOrder and BootXXXX Variable!這一次換成需要將 BIOS 選項改成 Other UEFI OS 才能進入我的 UEFI Shell,執行結果如下圖。

2020/11/12 更新

之前詢問同事是否可以轉移網卡給我,如果以後同事專案用不到就直接做資產轉移,也可以幫公司省錢,可惜該張網卡以後專案還是會用到。跟老闆討論後,老闆也很爽快的批准採購。

我選定的是 Intel 9301CT 桌上型網卡(EXPI9301CTBLKIntel 82574L),PChome 售價 NT $1,290,應該是支持 vSphere 7.0 裡最便宜的網卡吧?我是以晶片 Intel 82574L 關鍵字來確定該張網卡有在 vSphere 7.0 的支援清單中。不過抖抖的是,國外網路上有人說他不能用?幸好到貨時一切正常(網路上似乎還有更便宜同晶片的網卡,大概是六七百塊左右,應該是非原廠卡)。

記得要登入 vSphere console,重新指定網卡才行,系統在移除舊網卡,裝上新網卡後不會自動選取網卡,一開始沒想到要做這事,只是檢查 IPv4 設定,然後就一直看到 DHCP 失敗,害我內心也抖了一下!自己的東西不能用比較沒差,公司的資產不行又要重新採購,實在是浪費錢。

另外,不知是我太 low 還是怎樣?第一次看到網卡擋板後面會提示燈號顏色的代表意義,果然是貴上 4 ~ 5 倍網卡該有的樣子。不過,我後來想想,應該是我之前買的網卡太便宜的緣故吧?

2020年10月26日 星期一

UEFI ShellOpt 概述

最近看 Spec 看到有點乏味,突然想到之前一直想試沒試的 ShellOpt,於是便來嘗試看看。

ShellOpt 是一個特殊的 UEFI Env Variable,照 Spec 所說,設了這個環境變數後,像是 Shell 的等待使用者按鍵時間,要不要印出版本資訊等,都可以透過這個環境變數來控制,不用像我之前一樣,需要修改 Shell.c 的預設值,編譯出自己的 Shell 執行檔。

嘗試的過程中遇到了一些問題,雖然還未完全解決,還是記錄一下遇到的問題及解決方式。

01. -delay 秒數的傳遞

-delay 是控制使用者按鍵時間的參數,當 set 指令遇到 - 符號時,會誤判為 set 的使用參數,解決方式便是把它跳脫,正常是使用 ^ 符號來跳脫特殊字元,但這裡要用 set ShellOpt "^^-delay 8" 來設定才能成功。


02. Shell 解析 Argv 不成功,如何 Debug

因為 UDK 的 code 有問題,導致無法使用使用者的設定值。為了判斷問題的地方,需要印出一些訊息,我這裡是使用下面方式來除錯。

CHAR16 DebugString[128];

UnicodeSPrint(DebugString, sizeof(DebugString), L"%02d - (%s) \r\n", LoopVar, CurrentArg);

gST->ConOut->OutputString(gST->ConOut, DebugString);

測試的結果,問題是出在最後一個 gEfiShellParametersProtocol->Argv,不知為什麼會多出一個奇怪的字串,嘗試列印來看,是一個重覆的無意義字串?也許是我還沒看懂 Shell 該段 Code 的意義,仍需要繼續嘗試。

我目前暫時的解決方式是先忽略最後一個有問題的 Argv,且傳遞給 -delay 的秒數一定要有 2 位數,不足便在前面補 0,這樣便可以解決 ShellOpt 的解析問題。


最終解決方式

下午繼續奮戰這個問題,最後確定奇怪字串是因為 set command 來的,應該是過程中底層不知道那個環節出錯?目前看來只能自己寫程式來設定此變數。

一開始試著使用 ShellSetEnvironmentVariable 來設定 ShellOpt,問題還是依舊,直到使用 gRT->SetVariable 函數,ShellOpt 的值才能順利設定,不過,當下無法反映在 set command 的顯示結果,另外 GUID 需使用 gShellVariableGuid,而不是 gEfiGlobalVariableGuid。


2020/10/27 更新

今天本來想寫支程式,抓取使用者的 argv,檢查後再幫忙設定 ShellOpt 變數。由於個人習慣使用 main Entry,故所有的字串都是使用 ASCII,本想最後再使用 UnicodeSPrintAsciiFormat 函數來轉換,無意間才發現,UEFI 在這些類似的函數中,需要使用 "%a" 來表示 ASCII 字串,而不是傳統 C 語言的 "%s",這讓我不禁思考,使用 main Entry 撰寫 UEFI Application 到底是好還是不好呢?

相關 Format 選項可以參考 MdePkg\Library\BasePrintLib\PrintLibInternal.c - BasePrintLibSPrintMarker。

https://github.com/tylpk1216/ShellOpt

2020年10月15日 星期四

小程式也要講究效率

自從不用 C 寫 Parser 後,我已經習慣用 Re 來處理 Log,雖然明知道每次重覆在同一份 Log 中找尋不同資料是很愚蠢的事,應該只 parsing 一次後就把資料儲存起來!但自己寫的小程式自己用倒也還好,短短幾行 Code 看起來也比較舒服XD

後來另外一個主管看到這樣的小程式在做實驗時幫助判斷問題很方便,就延用了我的小程式做他自己想做的實驗,一直以來倒也相安無事。

直到有一天,因為他做了一些變化,導致 Log 容量膨脹許多,故開始想要節省時間,於是請我幫忙改進,我原本以為純粹是後續報表畫圖很花時間,即使我做了改進,但時間可能也節省不到 20%?不過不改不知道,單純測試 103 個單位,便少了 93% 的時間,改進後沒有再接到需求應該是有達到目標?因為不是我要用的,我也沒有繼續追問下去XD

最近都在搞 ESP8266,我發現這樣下去不行?還是來發篇文章灌個水,順便解答我心中的疑惑。

就以我原本的小程式來測試改進幅度!

改進前:13 分 33 秒。

改進後:03 分 11 秒。

計算之下,少了 76 % 的時間。

再繼續細分下去,一次的 parsing 動作可以節省 4.2 ms,只要執行次數夠多,花費時間還是很可觀的。

難怪古人說:勿以善小而不為,勿以惡小而為之。戒之戒之。

2020年10月3日 星期六

Kobo 翻頁器 DIY 最終回

將 ESP8266 (ESP-12S) 裝進 3 x AAA 電池盒中,只使用 2 x AAA 共 3V 當做輸入,原本預計要加一顆 DC-DC 0.8V ~ 3.3V to 3.3V Converter,但因賣家送錯,故直接使用 3V 的電壓驅動 ESP8266 (ESP-12S),希望可以撐到 2.7V 的最低工作電壓為止。

原則上還是要讓 ESP8266  (ESP-12S) 工作在 3.3V 才對!我這是沒辦法中的辦法,在沒有任何外加電路下,工作電壓應該也不穩定,如果還能拿到 DC Converter 再說吧。

工作影片


2020/10/05 更新

無意間在 YouTube 看到,有一種 LiFePO4 電池,其工作電壓為 3.2V,在到低電量前,都維持一個很穩定的電壓,如果可以買到 AAA 規格的電池,應該就可以省略 DC Converter,還可以用並聯增加電池容量,可惜的是,不容易買到 AAA 規格的電池,選擇還不多,目前市面上看到的都是大陸製的產品,且容量在 280 ~ 350 mAh。

另外,昨天實測的結果,使用兩顆新的乾電池看了一個多小時的書,翻頁都還正常。但我猜應該是沒辦法撐過 3 小時,因為乾電池的放電電壓下降的很快。

2020/10/07 更新

根據 Kobo 閱讀器自己的閱讀統計,累計閱讀了約 2 小時又 24 分鐘後,翻頁器已經無法工作,斷電再開也無法開機,兩顆全新的乾電池使用電表量測的結果,電壓都約在 1.24V 左右,離最低 2.7V 的工作電壓已有一段距離。不過,這兩顆電池只是無法再提供 ESP-12S 需要的工作電壓,拿去裝在手電筒上還是可以用的。

2020/10/08 更新

還有一種鎳鋅充電電池,其電壓為 1.6V,其放電電壓也很穩定,故也是一種替代方案,但跟 LiFePO4 一樣,沒有大廠的產品可購買。

另外,今天又跟另外一個賣家購入了 DC Converter,這個東西在市面上不太好找,希望這次賣家不要再標示錯誤了。

好奇統計了一下,截至目前為止,為了這個硬體翻頁器共花了 NT $8,592 元,都可以再買一台電子書閱讀器了!但是跟學習到的東西比起來,還是很划算。

烙鐵及排風扇等:約 3,300 元。
硬體開發板相關:約 1,200 元。
其他零件及收納:約 4,100 元。

2020/10/12 更新

新的賣家出貨速度很快,給個讚!這次學乖了,焊接前,先量測一下電壓,2.86V 左右的電壓轉完後約為 3.44V,比號稱的 3.3V 高出了些許,使用電表看不出是否真的恆定在 3.44V?但應該是有符合我的需求,等到原本用過的電池沒電後,再拿全新的電池記錄數據。

另外,這次的 Converter 比上次賣家送錯的還大了些,雖然只是公釐的差異,放進電池盒就得喬一下位置。還有這次的焊接技術又更差了,不小心傷到外盒好幾處,焊好的線我也覺得搖搖欲墜,哪一天線突然斷掉我也不意外XD

2020/10/15 更新

事情果然沒有那麼順利,反正我也習慣了XD

使用新的乾電池測試時,約 40 分後翻頁器便無法工作,比不使用 DC Converter 的 2 小時半還差?量測輸入電壓約 1.6V,輸出電壓約 2.5V,而我的 Convert 規格為 DC - DC 0.8 ~ 3.3V To 3.3V。

懷疑是下面幾個原因:

01. ESP-12S 使用了第一個賣家標示錯的 5V Converter 造成的內傷。
02. 被第一個賣家標示誤導,使用 4.3V 測試第二個賣家的真 3.3V Converter,導致 3.3V Converter 內傷。
03. 焊接技術差,沒有完全接好,電流過不去,造成異常耗電。
04. 要如原廠建議,供電電流 > 500 mA。
05. GPIO 當輸入時,還是要接個電阻限流?CHIP 內部電阻阻值不夠,導致 CHIP 內傷。

後續待我好好想想 ~

2020/10/16 更新

從官方討論區看到的討論,看起來 internal pull-up resistor 應該不是問題。


2020/10/19 更新

除了在按鍵上的焊點貼上絕緣膠帶外,並未做其他改進。由於家裡只剩鹼性電池,故改用鹼性電池測試,陸續分別使用了 4 次,資料如下:

21:40 ~ 23:40 (120)
10:40 ~ 11:20 (040)
11:30 ~ 12:20 (050)
17:40 ~ 18:35 (055)

總共看了 265 分鐘,第 5 次想要繼續使用,翻頁器便無法開機,拿去手電筒仍然可以使用。

好像在 Youtube 上曾看過,鹼性電池的使用時間約略是普通乾電池的 2 倍?如果是這樣我會認為,雖然電池應該也還有電,但因為 DC Converter 會隨著輸入電壓的下降,提供的電流也隨之下降,故這時候的工作電流已經無法讓 ESP8266 正常開機。假設我調整使用時間,也許可以得到更漂亮的數據。

另外,Kobo Clara HD 在搭配我的自製翻頁器時,1 個小時約掉 5% 電。

如果想要讓翻頁器更持久,也許還可以朝下面幾點改進:

01. 按鍵從 polling 改 interrupt。
02. 使用官方 SDK 寫程式,減少不必要的執行程式碼。

這篇文章描述了一些關於啟動時的注意事項,還提到如果因為電源的關係導致 ESP8266 進入了故障模式,則有可能因為溫度一直上升而讓 ESP8266 死掉。

2020/10/22 更新

昨天趁休假時,又試了一次鹼性電池,總共看了 3 次,分別是 01:30、01:00、0200,累積看到 270 分鐘後,翻頁器便無法作用,關掉電源再開也無法正常開機。一樣把電池拿去手電筒還是可以使用。

看來在接了 DC Converter 後,使用鹼性電池就是可以使用約 4 小時半,暫時就先這樣吧。

2020/10/30 更新

上個星期買了Energizer Max AAA battery,測試看看是否可以撐比較久?陸續使用了 5 ~ 6 次,每次至少 30 分鐘以上,最後共可看 5 小時又 20 分鐘,好像也沒有比原本的鹼性電池好多少?此電池一顆價錢為 NT $12.4。

2020年9月28日 星期一

ESP8266 OTA 使用備忘

有鑒於前幾天沒有加上 OTA 更新的遺憾,今天便決定把 OTA 更新機制加入,過程中遇到一些問題,記錄一下避免忘記。

1. 跟隨範例加入 OTA code,我這裡用的是 Arduino IDE OTA 方式。

2. 理論上 reset 後,Arduino IDE 就可以看到 OTA port,但我的版本沒有出現(1.8.13)。查了一下 ESP8266 issues 列表,有人建議可以直接下 command 測試,我後來是以這個方式順利上傳成功。

3. IDE -> 草稿碼 -> 匯出已編譯的二進位檔,會跟 Code 在同一層目錄。

4. 切到工具路徑,C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\tools

5. python espota.py -i 192.168.43.118 -p 8266 --auth=XXXX -f XXX.bin

透過上述方式便可以成功 OTA 更新。


2020/09/29 更新

回家測試的結果,按鍵整個反應變好慢,再加上我用的是 AP + Station 混合模式,Clara HD 看到的 Wi-Fi 訊號變得很微弱,可能是這樣的操作對 ESP8266 太操或是我的 Code 有 Bug,還需要想一想如何改比較好。

2020/09/30 更新

嗯,確認是 Bug 無誤!不過,在 loop 加入 OTA 機制後,整體流暢度約差了3% ~ 4% 左右,還算可接受範圍。

2020年9月26日 星期六

有時候放棄也是一種選擇

又是個不用補班日的週六,加上家裡的事終於告一段落,準備開開心心的來實作翻頁器成品。

早上先把 TX、RX、VCC、GND、GPIO0,焊到 ESP-12S 上,雖然焊的很醜,但也能順利燒錄程式,改了一下 Code 讓它連續翻頁好測試線路是否正常,實測半個小時,看起來沒有什麼問題。於是快中午時就殺去特力屋買齊我需要的東西,在等待 DC Converter  來的同時,準備下午先把能做的事做好。

好不容易自製焊台做好了,放置 ESP-12S 的洞挖了,兩個按鈕也鑽好洞放進電池盒內,這時悲劇發生了,原本配給向左翻頁的 GPIO14 在我喬線的時候,整個 PAD 被我扯掉,已經無法再把線焊上去,雖然還有其他 GPIO 可用,但我程式就需要改寫並重新燒錄,只好再比照早上把該焊的線焊一焊,不過這一次就沒有這麼順利了,沒有一根線可以順利焊上,偏偏屋漏又逢連夜雨,連 GPIO0 也被我扯掉,看看新買的 GOOT 烙鐵頭,似乎整個都氧化的很嚴重,連錫都無法順利吃上去。為了怕把我的 ESP-12S 整個報銷,果斷地放棄繼續下去。

到底是發生什麼事我也搞不清楚,究竟是我的大賣場錫條太差,還是我的使用方式不對才導致失敗?

想想軟體工程師還真是幸福,只要一台電腦就可以做事!不像硬體工程師,有準備不完的機斯。想不到我的 Kobo 翻頁器成品,竟然就這樣胎死腹中!

為了完成這個東西,目前為止花的錢大概又可以買一台五千元左右的翻頁器,這就是人生呀!

拍張照片為這個偽完成品留下記錄。


2020/10/02 更新

趁著連假前的晚上,用新買的一些機斯,一股作氣把所有要焊的線一起焊一焊,開開心心的翻了幾頁書之後,ESP8266 (ESP-12S) 就一直重開機,使用電表量測才發現我的工作電壓居然高達 5V?


重覆量測了好幾次結果還是一樣,為了怕是我焊接的問題,移除 ESP8266 (ESP-12S) 後重新量測,情況還是依舊!在確認了我露天拍賣購買物無誤後,發個訊息通知賣家這個情況。

等待的時間閒著也是閒著,拿出放大鏡仔細端詳,發現上面的型號是 HW-626,Google 了一下,確定是轉出 5V 的 DC Converter 沒錯!這告訴我們一件事,以後在焊接前要先確認好電壓才不會白做工,幸好 ESP8266 (ESP-12S) 用 3.3V 開機還算正常 ,但有沒有內傷我就不知道了?


如果賣家沒有給我正確的 Converter,我應該也懶得再找料重焊了,對於焊接苦手的我來說,可能也辦法再焊那麼順利了!我總不能缺什麼就買什麼工具吧?家裡的書櫃已經快放不下這些東西了。

2020/10/03 更新

既然 ESP8266 (ESP-12S) 最低工作電壓可到 2.7V,乾脆放棄使用 DC Converter,反正我也只是要驗證概念,順便測試在 5V 的摧殘下,我的 ESP8266 (ESP-12S) 是否還活著?終於我還是完成了這個產品,為這幾個月來的工作劃下句點。

2020年9月23日 星期三

買新不買舊的最好範例 ESP-12S

一直提不起勁去研究 3D 列印,尤其在得知列印時產生出來的微粒對身體不好後就更是興趣缺缺,雖然網路上有幫忙 3D 列印的店家,收費也不貴,但就是少了一股衝勁。

偶然看到網路上有人實做 Kindle 翻頁器,其設計原理跟我一模一樣,巧的是他也是使用 ESP8266 來實現,又可以將相關元件放入一個 3 x AAA 的電池盒中,於是便想依樣畫葫蘆的做出我的版本。

由於是 5 年前的文章,對方使用的是 ESP-03,目前網路上已經找不太到。故我就直接選了一個比較新的型號 ESP-12S。

雖然知道 Boot Mode 的差別,但我一直以為安信可公司的模組已經處理完畢,預設就是正常開機模式,後來才發現,如果我是購買舊一點的版本,例如 ESP-12F,很多腳位都要自己處理上拉或下拉,對高手來說這些不是問題,但對焊接低手的我來說,能少焊幾根線就是舒服。

原來買新不買舊的意義就在這裡!只要商家的產品真的是越出越好就好。


2020/09/24 更新

想不到也是一樣的 ESP8266 系列卻出現反例,NodeMCU 目前最新的是 V3,但網路上說雖然較新又較便宜,但因板子較大,故插在麵包板後已無空位容納其他排線,還好我之前買的是 V2。

2020年9月19日 星期六

Kobo 翻頁器 DIY 開發順序顛倒了

雖然這個專案已經告一段落,如果不做 3D 列印的話,其實也算是結束了!

但跟我當初預設的開發順序一點都不一樣?

為了回歸初心,還是花了一千塊錢,把當初想買的機斯備齊,也算是為這段時間留個記錄。

看似簡單的線路,如果沒有將 ESP8266 整個插進麵包板,完全沒有辦法工作,如果手邊有個三用電表,就能快速的排除問題。

其實任何學問都是相通的,雖然我還是個硬體菜鳥,但與程式解 Bug 的思路完全沒有兩樣,能夠細心思考問題並排除問題,這應該也算是工程師的浪漫一天吧。



另外,因為懶得一樣一樣購買,我使用的按鈕是直接從 Arduino 通用實驗零件包來的,價錢約略 100 出頭,內容如下:

2020年9月18日 星期五

Golang filepath.Walk 行為及注意事項

某些情況下我們需要去解析目錄下含子目錄共有多少檔案,一般來說是使用遞迴,不同程式語言有不同的名稱,可能叫 parseDir 或是 walkThrough 等。

Golang 在 path/filepath 這個 package 裡面就有提供類似的功能,其用法為 filepath.Walk,我們需要傳入 2 個參數:

1. 要解析的目錄名稱。

2. WalkFunc 型式的函數,定義如下。

type WalkFunc func(path string, info os.FileInfo, err error) error

比較特別的是,我們在裡面不需要再寫出類似遞迴呼叫的語法,Golang 本身會一直呼叫我們傳進去的 WalkFunc 直到結束。

另外,也可以傳入 UNC 路徑,這邊要注意一點,由於微軟檔案長度 255 字元的限制,如果我們傳入的路徑裡面有超出長度的檔案,此時會回傳 error,故後面就會停止 parsing,錯誤訊息如下。

CreateFile ERROR_FILE_NAME: The system cannot find the path specified.

因此,如果我們還是要繼續 parsing,可以選擇忽略這個錯誤而直接回傳 nil。

2020年9月8日 星期二

20200908 電子書統計資料

Amazon.com

第一本書:The Go Programming Language (US $25.59)

最貴的書:File System Forensic Analysis (US $35.49)

目前藏書:29 (23 英文 + 6 中文)


Amazon.cn

第一本書:湖畔 (東野圭吾 CN ¥7.91)) 

最貴的書:30天自制操作系统 (图灵程序设计丛书 10)  (CN ¥49.99)

目前藏書:43


Google Play 圖書

第一本書:病從排寒解: 22個自主排寒關鍵,教你從飲食入手,徹底預防新病、根除舊疾、溫養一生! (NT $189)

最貴的書:Kali Linux: Hacking Tools Introduction (NT $645)

目前藏書:43 (4 英文 + 39 中文)


Kobo

第一本書:太極米漿粥:來自桂林古本傷寒雜病論,靠白米就能重拾健康的本源療法 (NT $245)

最貴的書:職業駭客的告白 : 軟體反組譯、木馬病毒與入侵翻牆竊密 (NT $460)

目前藏書:45


Readmoo

第一本書:21世紀的21堂課 (NT $355)

最貴的書:MVP製造機 (NT $397)

目前藏書:498

2020年9月2日 星期三

使用 ls 檔名出現單引號

最近在做系統轉移,要將內部使用的系統從 Windows 轉到 Linux,在執行某個功能後,發現產生出來的檔案名稱會被單引號包住。

原本第一個念頭是不是程式需要修改?檢查了一下,發現跟程式沒有關係!後來才發現,是程式產生出來的檔名裡面有特殊符號的關係。

因此使用 ls 指令時,顯示的檔名就會被單引號包住。

真是不經一事,不長一智呀。

2020年8月27日 星期四

WeMos D1 ESP Wroom 02 開發板 ESP8266+18650 電池座 初次使用記錄

為了 Kobo 硬體翻頁器的設計,最後選擇了這一塊開發版,這個開發版的好處是包含了 18650 電池座,也有供電及燒錄模組,我只要自己焊幾根線,3D 列印設計外殼,剩下的就是純軟體的工作了,應該可以加快開發速度。另外,其電路設計會讓 CHIP RESET 時進入燒錄模式,故不需要按下 FLASH 按鈕,似乎開發板都有內建這個功能。原理似乎是利用 UART 傳輸時,會觸發 RESET 並讓 GPIO0 拉 Low 好讓 CHIP 進入燒錄模式。下面是取自 NodeMCU 的電路圖。

下面是板子示意圖,隨手畫畫,元件相對位置是對的,但可能水平位置不一定有對齊。


相關 IC 概略

AMS1117 - 電源轉換 IC,負責將 5V 轉成 ESP8266 需要的 3.3V。
CP2102 - USB 轉 UART 的 IC,SILABS 網站上有提供驅動程式。
TP5400 - 負責電池充電,也會將電池的 3.7V 轉成 5V 輸出。

前置作業準備

01. 下載 Arduino IDE。
02. Arduino IDE -> 檔案 -> 偏好設定 -> 額外開發板管理員網址,輸入 http://arduino.esp8266.com/stable/package_esp8266com_index.json。
03. Arduino IDE -> 工具 -> 開發板管理員 -> 搜尋 ESP8266 並下載套件。
04. 開發板選擇 LOLIN(WEMOS) D1 R2 & mini,似乎選別的也無妨,重點自己是用那根 GPIO 要搞清楚。


第一個 Hello Word (控制 LED)


#define LED_BUILTIN 16

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

編譯及上傳訊息


Executable segment sizes:
IROM   : 228640          - code in flash         (default or ICACHE_FLASH_ATTR) 
IRAM   : 26756   / 32768 - code in IRAM          (ICACHE_RAM_ATTR, ISRs...) 
DATA   : 1248  )         - initialized variables (global, static) in RAM/HEAP 
RODATA : 688   ) / 81920 - constants             (global, static) in RAM/HEAP 
BSS    : 24880 )         - zeroed variables      (global, static) in RAM/HEAP 
草稿碼使用了 257332 bytes (24%) 的程式儲存空間。上限為 1044464 bytes。
全域變數使用了 26816 bytes (32%) 的動態記憶體,剩餘 55104 bytes 給區域變數。上限為 81920 bytes 。
esptool.py v2.8
Serial port COM6
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 24:62:ab:00:00:00
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 2MB
Flash params set to 0x0230
Compressed 261488 bytes to 193147...
Wrote 261488 bytes (193147 compressed) at 0x00000000 in 4.4 seconds (effective 475.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

實際測試結果,這樣的一個小程式,耗電量約為 40 ~ 80 mA 左右。

2020/08/28 更新

早上趁著上班前,量測了一下腳位,確認板子上的 D1 ~ D8 是對應到那些 GPIO。

2020/08/29 更新

焊接技術真的很糟!看來自己是沒辦法把線焊到開發板上,程式已經大致 OK,雖然是用 polling 的方式,不是用中斷。非常克難的用一根線模擬按鍵的功能,意思到了就好。


2020年8月20日 星期四

ESP8266 翻頁器設計

ESP8266 概述

ESP8266 是物聯網時代興起時很熱門的一顆 Wi-Fi 晶片,除了可以當作外部裝置給 Arduino 使用,由於本身的計算能力還不錯,故也可以單獨使用。 

晶片開發廠商是上海樂鑫信息科技,而外面常見的模組則是由安信可科技(Ai-Thinker)整合販售的,有 ESP-01、ESP-03、ESP-12等等。不同的模組有不同的 GPIO 數量,可以視需求購買。

另外,還有連燒錄電路,供電電路都整合好的開發版,比如說 NodeMCU 之類的,插上 USB 就可以工作,不需要再買一條 USB 轉 TTL 的轉接線即可工作。另外,USB 轉 TTL 的轉接線預設是走 5V 輸出,而 ESP8266 是吃 3.3V,故還需要把轉接線接頭打開,自行將輸出焊接到 3.3V 腳位。

網路上還有看到,USB 因為電流可能不足,故燒錄時如果失敗,建議外接電源。

ESP8266 共有 17 根 GPIO,扣掉 GPIO6 ~ GPIO11 共 6 根讀取 flash 專用,再扣掉 GPIO1、GPIO3 共 2 根 UART 用,故最多能使用 9 根 GPIO。

下面是抄錄自官方 FAQ:「除了 XPD_DCDC,GPIO 可以配置上拉。關於 GPIO 的上電 IO 口預設狀態為:除了 SDIO 6根線 +GPIO4+GPIO5+GPIO16 上電 IO 默認無上拉,其他的 GPIO 口均有上拉。由於是內部配置上拉,所以如需下拉,需外部加下拉方式或者加一個三級管的反相電路。」

ESP8266 使用 3 根 GPIO 決定 Boot Mode 模式,分別是 GPIO15、GPIO0、GPIO2,其模式如下:

燒錄模式 - 0V, 0V, 3.3V
正常模式 - 0V, 3.3V, 3.3V

為了配合 Boot Mode,GPIO15 上電時會讓它保持 Low,故不建議把它設成 PULL_HIGH,故 9 根 GPIO中,建議使用 GPIO12 ~ GPIO14、GPIO16、GPIO4 ~ GPIO5、GPIO0、GPIO2 這 8 根,越前面的越推薦。另外,每根 GPIO 可提供的最大電流為 12 mA。

GPIO0 ~ GPIO15 都有內建的上拉電阻,GPIO16 則是下拉電阻。

ESP8266 大部份都是使用 26 MHz 晶振,故上電時,晶片預設鮑率為 74880,如果不是使用這個設定,上電訊息便會看到亂碼。

關於 ESP8266 的介紹,這篇文章是我看過寫得很棒的,可以參考。

翻頁器設計

01. GPIO - 3 個 Web API,1 個 LED 指示開機狀態,1 個 LED指示自動偵測 Server IP 狀態,1 個 LED 指示 API 狀態。
02. 電路 - 3.3V 
03. 外部燒錄接口

ESP-03 是 7 個 GPIO 接口,ESP-12 則是 9 個 GPIO。

供電電路

01. 鈕扣電池類,容量只有一兩百 mAh,最大容許放電電流也只有 3 mA,看來是不可行。
02. 4 號電池容量有 1250 mAh,放電電流未知?但我想應該是不行,設計目的不同。

穩壓電源簡介

工作目標

01. 先花幾百塊買現成開發版驗證程式功能。
02. 直接買現成模組 + 麵包板測試。
03. 使用 3 D 列印或其他方式製作外殼。

2020/08/24 更新

查了一下,似乎乾電池的供電電流是可以供 ESP8266 使用,也有賣集成 18500 mAh 電池座與 ESP8266 的開發版,就看那一樣最方便。

規格如下:
ESP-WROOM 02 - 20g
Panasonic 3.7V 3350 mAh - 46g

2020/08/25 更新

查了一下,NodeMCU 上面是使用 AMS1117 這顆 IC 來做電壓轉換,所有電路只需要額外 2 組電容,看起來還不錯。不過這種轉換 IC,效率可能不到 8 成,但簡單運用場景下還算不錯。

2020/08/26 更新

之前沒有想到,按鍵偵測應該要使用中斷,趕緊查了一下,幸好 ESP8266 除了 GPIO16,大部份的 GPIO 都可以觸發中斷。另外網路的操作在中斷裡應該會有問題?流程需要好好設計。

2020/08/29 更新

Arduino 也可以寫 ESP8266 程式真的很方便,polling 版的程式馬上就寫好了,實測模擬按鍵的靈敏度也還行,可惜的是自己焊接的功力真的太差,想把線焊到開發板上一直無法成功,看來這個專案只能到這了!幸好該有的概念都已驗證完畢。

影片連結

2020/08/31 更新

查了一下 3D 列印,一個門外漢要把外殼從無到有設計出來,看起來也不是一天兩天的事,目前看起來還堪用的 3D 列印機大概也要一萬多元,如果不是沒有地方可以放置,自己買一台應該是比較好的選擇。

2020年8月19日 星期三

mooInk Pro 傳檔 App 試用

上個星期在討論區發現 Readmoo 發佈了 mooInk Pro 傳檔 App,之前就一直很想在 dpt-rp1 的基礎上開發類似軟體,可惜我不是寫 Java 的,再加上 mooInk Pro 看 PDF 不能點擊翻頁,故後來就一直興趣缺缺。

既然現在已經有官方的 App,還是來玩一下,看看好不好用。

可惜的是,安裝後找不到我的 mooInk Pro!網路上看了一下,此機制是使用 Wi-Fi 傳檔,我猜還是走 Sony 原生那套,理論上應該是沒問題才對?為了怕 Readmoo 白目把 Sony 原生的改掉,我還特地再使用 dpt-rp1 測試,不論是上傳檔案還是執行一些簡單的 command,看起來一切正常,讓我白擔心了。

我猜 App 問題可能是出在自動掃描偵測 IP 身上?網路上有人說只要重置機器即可,雖然我是很懷疑?感覺還是軟體 Bug 居多。為了一個功能,還要重新下載書籍,想想還是不划算,就當做沒有這個 App 的存在好了。

另外,網路上也有 Java 版的實作,理論上可以加速開發,但我沒興趣就是了。mooInk Pro 現在對我來說有點像是雞肋,一個星期用不到幾次。

如果之後暗黑心法真的失效,我就要來改用另外一套暗黑心法了,或是乾脆不看繁體中文書了,阿雜。

2020/08/20 更新

昨天洗澡閃過一個想法,搞不好這是故意的!為了因應加密方式改變,強制使用者重置好讓一切回歸原點?哈,有沒有這麼邪惡?

2020/09/04 更新

更新最新版本 2.1.2 後,mooInk Pro 傳檔 App 認不到裝置的問題,在這版本也可以正常抓到裝置,不需要網友說的重置系統,看來是我想的 Bug 沒錯,故更新版本後也一併解決了此問題。

2021/03/09 更新

雖然我因為讀墨系統更新後就可以正常傳檔,但寧心舍試用時雖然已經是最新版本,依然是無法順利偵測到機器,故這招可能也不是每個人都適用吧。

今天不是寫 Code 天

Bug 相連到天邊,從下午 4 點開始,執行測試時,一個接一個的 Bug 不斷跳出,解 Bug 都解到要懷疑人生,我還是乖乖寫 C 好了,Javascript 真不是我的菜。

01. module name 被 local variable 覆蓋,找了快一個小時,大小寫看來看去看不出所以然。

02. 函數參數改變,測試程式有更新,但上個禮拜寫好的 Code 忘記更改,一直傳錯的參數進去。

03. TypeError: Path must be a string. Received Promise { <pending> },一個不是 promise 的官方模組所在行報出錯誤,在呼叫這個模組前面幾行的地方,呼叫了一個 Promise 的函數,但又沒 await,真是低級錯誤。

下班了,下班了!

Release KoboPageTurner v0.2.0

昨天拿到 Logitech R500,看了快半本的書,試用起來沒什麼問題,雖然 Clara HD 的 Wi-Fi 很不給力,但既然都寫了,也許別人也有這個需求,還是寫個中文文件為這一個月留個紀念。

安裝

下載路徑

01. 運行 "KoboServer/makeKoboRoot.sh" 以獲取 "KoboRoot.tgz",也可以使用發行版。

02. 將 KoboRoot.tgz 放入 Kobo 設備的 ".kobo" 文件夾。

03. 重啟設備。


反安裝

01. 修改 "/mnt/onboard/.koboserver/koboserver.cfg",設定 "uninsall=true"。

02. 開啟 Wi-Fi。

03. 除了  "/mnt/onboard/.koboserver/ " 資料夾外,其他都會被移除。


使用方式

我使用 Kobo Clara HD 測試了這個概念。

系統:4.23.15548

01. 將您的 Kobo 設備連接到 PC。

02. 在 "/mnt/onboard/.kobo/Kobo/Kobo eReader.conf" 中添加以下設置。

[DeveloperSettings]

EnableDebugServices = true

03. 到 "設定" -> "裝置資訊" -> "Developer options" 。

04. 勾選 "ForceWifiOn" 項目。

05. 將您的藍牙設備連接到手機。

06. 在 Kobo 設備上打開 Wi-Fi,Web 服務器將在端口 80 上運行。

07. 使用 Android(HTTPClient) 發送 HTTP 請求。

08. 修改設置。

Key Code:

21 - Left Arrow

22 - Right Arrow

24 - 音量 Up

25 - 音量 Down

您可以單擊 Key Code 的輸入區域,然後按下您想設定的按鍵,它將自動加入 Key Code。

09. 單擊 "LEFT PAGGE" 或 "RIGHT PAGE" 以測試通訊。

10. 關閉 Web 服務器後,取消 "ForceWifiOn" 項目。 然後關閉 Wi-Fi。


翻頁設定

2020年8月11日 星期二

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

上星期老闆請我幫忙評估網路磁碟機使用量的問題,趁著昨天有空趕快寫支小工具依副檔名來計算哪些種類的檔案佔了多數?

原本昨天是輸出至純文字檔再餵進 EXCEL 加工,反正一次性的工具先求有比較重要。

早上實驗完後有一些空檔時間,乾脆把工具改成直接輸出到 EXCEL,後續只要改格式就好。沒想到再 parsing 第二個較佔空間的資料夾時,發生了 out of memory 的問題。

解決之道便是加上啟動參數

node --max-old-space-size=4096 yourFile.js

另外底下是相關的測試數據,留待以後相關工作參考



2020/08/14 更新

上面時間,我有稍微優化過,有減少第二階段的時間。

2020/08/19 更新

上禮拜有看到一套現成的軟體,可惜商業使用要錢。今天剛好又看到了另外一套軟體 WinDirStat,其實就是做了我程式做的功能,試了一下,速度比我未優化的 Node.js 的 Code 還快,如果上禮拜我是用 Golang 來寫,應該跟它有一拼的實力才對,據我用工作管理員觀察的結果,WinDirStat 的工作數據如下:

最高 CPU 使用率 - 6%
最大執行緒數量 - 3
最高記憶體使用量 - 44M

我的 Node.js 未優化 Code 工作數據如下:

最高 CPU 使用率 - 40%
最大執行緒數量 - 11
最高記憶體使用量 - 500M(Third party Excel module)

有這樣的數據其實並不意外,第一我為了保留原始資料,用了好幾組 Array,等於我在後面整理資料時,又把這個數據跑了一遍,如果 N 很大,其實很嚇人。第二這裡是純粹使用遞迴瀏覽檔案資料夾,沒有用到 IO Bound 的優勢,完全是吃 CPU 資源。

另外,這套軟體還是 Open Source,只能給它一個讚。

2020年8月2日 星期日

符合使用者的預期

最近都在開發我的 KoboPageTurner 專案,雖然我很喜歡 Kobo 機器的可 hack 性,但還是有一點我無法接受,那就是 Kobo 機器會在一定的時間內,關掉使用者的 Wi-Fi。

雖然我是因為 KoboPageTurner 才對這個功能這麼感冒!但在使用者開啟 Wi-Fi 的情況下,只要不進入休眠,系統本來就不應該偷偷關閉使用者開啟的 Wi-Fi,即使這個功能會影響電力!

我覺得最好的方式還是讓使用者選擇是否要開啟這項功能!

為了確定其他家的閱讀器行為,我還特地使用了 PW3 來驗證,雖然因為 PW3 預設不回應 ping 封包,但至少在我點開狀態列時,Wi-Fi 訊號依舊是呈現滿格的情形。順帶一提,同樣的地點,我的 Clara HD 只有 1 ~ 2 格的訊號,而 PW3 至少已經是 5 年前的機器!Kobo 真的是要多加油。

我個人認為目前 Kobo 嬴過 Kindle 的只有 2 個地方:
01. 機器可以做一些 hacks。
02. 閱讀時有左右對齊的選項。

PW3 還是我目前覺得最接近完美的機子。

 ~ THE END ~

2020年7月17日 星期五

kepubify not an epub error

剛剛在測試轉檔時,kepubify 又出現了 "not an epub" error,記得上次出現錯誤是在幫母親轉佛經的時候,而這次轉檔的書,是從某家書商購買的,理論上應該是不會有缺少 "META-INT\container.xml" 這支檔案的情況。

實際檢查後,這支檔案確實存在,其內容有關書本描述檔的資訊也沒錯,故不禁讓我百思不解?

於是我嘗試把我原本暗黑程式的 zipBook 這支函數 export 出來,並用這支函數來處理壓縮 EPUB 檔,這次便可以順利轉檔成功。

雖然我並不了解 ZIP 檔的真實格式,但就直接用萬能的 UltraEdit 將其打開,兩相比較後,我終於發現為什麼了!

由於取得原始檔案後,為了方便整理,我都會習慣解壓縮到 XXX 資料夾,故 ZIP 的資訊其實是多了一層 XXX 路徑,所以用 7-zip 壓縮時,應該要進到 XXX 資料夾那層,並針對 "META-INF" 等項目壓縮才對。

改用這個方法後,kepubify 果然就可以正常工作!讓我不禁懷疑之前幫母親轉檔遇到的問題搞不好也是這個問題居多,而非我以為的找不到 "META-INF\container.xml" 檔案。

Kobo Clara HD 翻頁器 DIY

自從知道 KoboCloud 這個專案後,我就一直在想能不能套用這個概念,自己寫一個 Client/Server 架構的專案來實現翻頁器的功能?由於 porting 一個藍芽 driver 沒那麼簡單,可能還需要 OTG 等,故我這個專案的概念很簡單:

01. Run a Web-Server on Clara, accept two API, /left and /right。
02. Another Client, send two API to Clara.
03. Web-Server clicks screen to simulate to turn page when receiving two API.

看起來應該沒有什麼大問題,目前第一個問題是要選擇哪一種語言來寫 Web-Server?有了 KoboCloud 的信心後,我決定使用 Golang,因為 Golang 本身就內建 Cross-Compiler 的功能,不用像 C 一樣,要準備編譯環境。

底下是我陸續嘗試的過程,留下記錄以供日後參考。

Web-Server

目標:
01. 仿造 KoboCloud,寫一個 KoboServer 機制 - Done
02. 快速寫一個 Server,在 Clara 上驗證可行性,看是否能收到 API - Done
03. Google Linux Mouse Event 之用法 - Done
04. 研究 Linux udev 機制,確定 rule 之行為 - Done
05. 根據 04,寫出一個穩定的 Server,避免 udev rule 一直觸發,運行太多的 Server 實體,導致 Clara 當機 - Done

Client

目標:
01. 當 Server Ready 後,先使用 PC 打 API 即可 - Done
02. Write an Android App to send two API to Server - Done
03. Write another Android App to receive Bluetooth event, then send two API to Server - Done

2020/07/17 日記

由於工作環境都是 Windows,所有的 Script 換行字元都要改成 Linux 下的,否則 Shell 會不開心,另外不論是 Script 或是 Server 的執行檔,移到 Linux 下包裝成 KoboRoot.tgz 時,記得先給執行權限,不然不確定會不會有問題?故最好的方式是直接在 Linux 下 開發,反正我的 UltraEdit 26 也有 Linux 版的授權。

Golang Cross-Compile 方式 on Windows

SET PATH=%PATH%;C:\Go\bin
SET GOPATH=%CD%

SET GOOS=linux
SET GOARCH=arm
SET GOARM=7

2020/07/20 更新

原本以為觸發 Linux Mouse Event 是一件很簡單的事,沒想到 Event Structure 會跟 Kernel 版本有關,如果是用到不對的 Structure,不論我 Event 怎麼組,一定什麼事都不會發生!結果還是需要花點時間整理消化資料。

幸好之前就有想到一招,就是在組 KoboRoot.tgz 時,裡面預留一道指令,把相關程式搬到 Kobo 顯示的電腦磁碟機內,則不論我是要抽換 HTTPServer 程式,或是要測試一些指令都會很方便,之後也可以如法泡製 udev 的 Script ,目前先留一個測試 Script 方便我除錯就好。


2020/07/21 更新

Google 一個 ParseDir 的 Script 函數,想要看看 Kobo 系統裡面有什麼,結果印了 10 萬多行後,後面全部是亂碼,我猜是因為 Stack 爆掉了,因為 ParseDir 是使用遞迴,而印象中 Clara 記憶體只有 512 MB,晚點最好是只 Parse /etc or /usr/local 等等的資料夾,或者也可以直接下 cp 指令把整個 root 複製一份到 /mnt/onboard 上,我認為 udev 執行時應該是 root 的權限。

至少目前可以看出一些資訊了:(From dmesg command)

01. Linux version 4.1.15-00089-ga2737fc02713 (gallen@gallen-M51AC) 
02. gcc version 5.3.0 (GCC)
03. tps6518x 1-0068: PMIC TPS6518x for eInk display
04. mousedev: PS/2 mouse device common for all mice
05. Battery Table (Open Circuit Voltage)
PMU: ricoh61x_set_OCV_table : 00% voltage = 3590900 uV
PMU: ricoh61x_set_OCV_table : 10% voltage = 3687400 uV
PMU: ricoh61x_set_OCV_table : 20% voltage = 3742300 uV
PMU: ricoh61x_set_OCV_table : 30% voltage = 3774100 uV
PMU: ricoh61x_set_OCV_table : 40% voltage = 3788700 uV
PMU: ricoh61x_set_OCV_table : 50% voltage = 3814400 uV
PMU: ricoh61x_set_OCV_table : 60% voltage = 3874200 uV
PMU: ricoh61x_set_OCV_table : 70% voltage = 3927900 uV
PMU: ricoh61x_set_OCV_table : 80% voltage = 3982900 uV
PMU: ricoh61x_set_OCV_table : 90% voltage = 4057300 uV
PMU: ricoh61x_set_OCV_table : 100% voltage = 4141600 uV
06. PMU: ricoh61x_init_fgsoca : * Rbat = 233 mOhm   n_cap = 1385 mAH (1500 ?)
07. SD Card
mmc0: new ultra high speed DDR50 SDHC card at address aaaa
mmcblk0: mmc0:aaaa SS08G 7.40 GiB 
mmcblk0: p1 p2 p3
VFS: Mounted root (ext4 filesystem) on device 179:1.
08. PMU:_config_ricoh619_charger_params set SDP 500mA charging.
09. Event Information.
/dev/input/by-path/platform-1-0024-event
/dev/input/by-path/platform-ntx_event0-event
/dev/input/event0
/dev/input/event1
/dev/input/mice

晚上試著使用 cp 指令複製 /,一直無法成功,不知道是為什麼?
目的地要寫絕對路徑,不能用相對路徑。

ls -al / 結果
ls -al /usr/local 結果
cat /proc/bus/input/devices 結果

2020/07/22 更新

從 /proc/bus/input/devices 來看並搭配 Google 結果,/dev/input/event1 應該是 TouchPanel,所以我們應該從這下手,而不是找跟 Mouse Event 有關的。

先用手機來抓 Event Raw Data,我的手機是 /dev/input/event4(一個一個試出來的),使用 cat 記錄按下時的 data,結果如下圖。


struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};


下班再來試試 Kobo 的 Raw Data 是否有不一樣的地方。

回家依樣畫葫蘆抓取 Raw Data,不抓不知道,看起來 Clara HD 是 32 位元 OS?


針對翻頁這件事終於開始有點曙光了,現在只剩是否能用寫檔方式模擬點擊 Touch Panel 動作?

2020/07/25 更新

終於把概念實做出來了,早上就已經完成了向右翻頁,但一整天都搞不定向左翻頁,現在雖然搞定了,但還需要花時間整理資料。

影片連結

程式碼

Event

參考資料

2020/07/26 更新


2020/07/27 更新

執行 Web Server 後,記憶體增加了 380 KB,佔總記憶體 0.07 %,我想應該還算可以吧?


2020/07/28 更新

看了一堆 Kobo hacks 的相關資料,貌似在閱讀界面時,Wi-Fi 是被 Kobo 關起來的?可能是為了省電!也許我可以在 HTTPServer 裡跑一個 goruntime,只要偵測到 Wi-Fi 關閉,就再把它打開,就看對耗電量的影響如何。

晚上實測的結果,即使一直使用我的 KoboPageTurner 翻頁,約莫 2 分 10 秒後,Wi-Fi 便會自己關閉,有空再用 ping command 來確認更精確的時間。

2020/07/29 更新

這是從 Clara HD 說明書看到的,看起來是被系統自己關掉 Wi-Fi 沒錯,但是沒有活動是如何判斷?我猜可能是判斷是否有在做同步,或是有進 Kobo Store,亦或是有開瀏覽器,而不是真正的判斷是否有使用中的 TCP/IP 封包。


晚上實測的結果,在不動作的情況下,不論是在首頁還是 Kobo Store,也是約 2 分鐘多一點,Wi-Fi 便會自動關閉。另外,也試了不要休眠,關掉自動喚醒功能,還是無法解決問題,看來是像說明書說的是由系統自動關閉。

2020/07/31 更新

早上突然想到,也許 Kobo 檢查的是外網的封包,而 Web Server 是屬於內網的封包,故會被認為 inactive?雖然我個人是覺得不合理就是!最簡單的方式就是在 Web Server 內開一個 goruntime,定時一分鐘便去連 Kobo Store,應該就可以避免 Wi-Fi 被關閉,待驗證?測試的結果,沒用。

哈,知道方向就好搞,在我多方 Google 之下,終於發現一個設定可以避免 Wi-Fi 被關閉,但是網路上說沒有效?晚上測試的結果,果然不會再自動斷線了,但是 Wi-Fi 也無法再手動關閉,故這個方式也不是正解。

[DeveloperSettings]
ForceWifiOn=true

另外,從 cyttsp5_mt_process_touch (kernel/drivers/input/touchscreen/cyttsp5_mt_common.c) 這支 function,看起來有解釋如何計算 ABS_X 和 ABS_Y,但我心算似乎不符合我從 raw data 抓到的?

2020/08/01 更新

忙了幾天,唯一的收獲是知道 Clara HD 的原點是在右上角,且設值時 X, Y 要互換。

2020/08/02 更新

改了一版程式,Web Server 開啟時,會去設定 "ForceWifiOn=true",離開 Web Server 時再把設定設成 false,實測的結果並沒有幫助,我確定設定檔都有更改成功!唯一可能的解釋是當我們在程式中動態改變設定檔時,對 Kobo System 來說,那些值可能已經在它的 memory 裡,故它並不知道要強制開啟 Wi-Fi,如果有方法可以強制它重讀設定檔,也許這個解決方式就能生效?

我不確定插上 USB 生成磁碟機,接著退出磁碟機的那個時間點,Kobo 系統是否會重新載入設定檔,如果這個流程是確定的,也許有機會解決?

另外,我發現這個動態更改設定檔的方式,似乎有機會讓 Wi-Fi 在開開關關幾次後就無法使用,可能是 Kobo 比對 memory 和 file 後,因為未同步而導致錯亂?

2020/08/15 更新

忙了兩個禮拜,終於有時間再來搞一下這個專案,Google 了一下,寫了一個簡單的 Android App,終於實現完我當初所有想做的事。



下一個新目標:使用 ESP8266 實做硬體翻頁器。

1. 如何實做 3.3 V 供電電路?
2. 供電電路是否需要穩壓?
3. 外殼使用 3 D 列印?