pretty code

2021年12月30日 星期四

Dropbox on Kobo

Kobo 在高階的機種上都有提供 Dropbox 服務,可以隨意選擇想要閱讀的書才下載,整體操作還蠻順暢的,可惜的是,免費版只有 2 GB 可以用,如果有很多書要放的話,一下子空間就滿了。

如果想要付費取得更多容量,一起跳就是 2 TB,不像 Google Drive 有 200 GB 的選項可以選擇,同樣 2 TB 的價錢,Dropbox 也是比 Google Drive 貴了幾百塊。

這禮拜在上傳了一堆 PDF 檔案後,我也開始遇到空間不足的問題了,本想直接付費搞定,但本著黑手的精神,還是想看看有沒有 DIY 的解決方法?

如果要使用我有付費訂閱的 Google Drive,目前只想到幾種解決方式:

01. 完成我之前想做的 GUI App,但之前的調查想要從無到有似乎有些困難?

02. 寫一個 Sync 的 App 或是找尋現成的 solution,不論哪種方式,都不會很困難,缺點就是一股腦同步,空間馬上會不夠用(KoboCloud 砍掉後下次還是會下載,故不算是現成的解決方案)。

03. 想辦法寫一個 KOReader 的 plugin,比照現有的 cloud storage,借用 KOReader 本身的 API 來達到 GUI 的目的。

看起來第三點比較符合我的需求,沒有意外,我應該會朝此方向努力吧?

如果不是想要使用 Google Drive,花錢升級 Dropbox 應該是比較快,為了做這個所花的時間代價,都不只差額 2000 多塊(目前我 GDrive 200 GB 每年只要 NT $900)。

如果我真的想不開把這個功能做好,就把這個差額再捐出去做好事吧,看這樣會不會比較有動力去完成它XD

2022/01/05 更新

跨年夜晚上睡不著覺時在想,GUI App 真的是我的需求嗎?最後才發現我比較需要的是 Wi-Fi 傳檔功能!感謝所有開發 Kobo 第三方軟體的前輩們,減少了我很多嘗試錯誤的時間。我終於可以隨時隨地的上傳檔案到 Kobo Elipsa 上了。

2021年12月29日 星期三

最有才的解 DRM 方式

今天 Google 跳出來了一篇文章《Quick and dirty way to rip an eBook from Android》,裡面只是簡單寫個 shell script 再加上 adb command 就把電子書再轉成掃瞄圖檔的電子書。

原理就是利用抓圖及觸發觸控翻頁,就可以輕鬆的抓完整本書囉。

備註:據我實驗的結果,圖片品質、執行時間及校稿時間都是此方法的致命傷,玩玩可以,但不實用,直接買 Kobo 及 Google 的書就好了。另外,某些國外資訊類的電子書都是無 DRM 的,購買後都可以直接下載,想在哪看就在哪看。

2021/12/30 更新

經實測確實還蠻好用的,不過要注意左右邊座標要設偏一點,否則流式 EPUB 的書有可能剛好點到註解,整個頁面就跳轉到亂掉了XD

另外,抓圖的那台機器,如果速度太慢,要調整一下 delay 值,我也遇到點了後已經 delay 4 秒,但翻頁還是翻不過去,是哪台機器就不說了XD

雖然用手機應該不會有這些問題,但手機螢幕如果不是 4 比 3,抓圖比例也怪,故也是兩難呀!

2021/12/31 更新

我的天呀,居然還有點一頁會跳兩頁的書,難怪沒有人想用這個方法!也許用 PC 閱讀軟體才是最好的方式,程式好寫又簡單不需要另外一台機器,不過,據我先期驗證的結果,某些書商版式的書,點開時不知道是在做解密還是幹嘛,光 delay 可能都不只要 4 秒,故這個方法,後續還要校稿,自動化的意義就不大了。

結論:這還是一個很有才的方式,但因為書商閱讀軟體寫的不好,還是需要後續校稿,故這個方式不實用。

2021/12/31 下午 更新

雖然覺得不實用,但還是想知道使用 PC 實作起來會如何?下午花了約快 2 個小時使用 Golang 實作它,大部份的時間都花在找套件。

原本以為 Node.js 會比較容易,但在編譯時還是遇到一些問題,Golang 一開始也是遇到問題,在換了作者建議的 C Compiler 後,便順利的編譯成功。

看來要在 Windows 下實作,呼叫 Win32 API 還是比較快,記得以前用 C 只需要不到 40 行即可。

目前覺得用 PC 才是唯一的最佳解,雖然也是不好用就是。另外我也找到了偶爾會 delay 的原因了,有些書商會定時在背景同步,如果同步的流程做得不好,確實有可能會造成翻頁 delay,不論是在 PC 或 Android 皆有可能。

花費了那麼多功夫測試,還不如把時間拿來多看幾本書,如果可以有一台完美的開放式閱讀器,就什麼問題都解決了。

H 家測試記錄

前幾天為了研究 H 家的檔案格式,特別開啟了一台 GCP Engine 來做測試,雖然簡單規格的價錢不是很多,但 Wireshark 在解析 TLS 封包時還是會一直卡住,如果使用類似 mitmproxy 的軟體則可以正常抓取封包,看來下次還是要用好一點的規格。

大概用了約 3 個小時,合計約 NT $20,感覺還可以。 

使用之前可以先用計算機估計價錢。

暫時還是無法像 R 家一樣,神來一筆的找到入口點,就先這樣吧,反正一切隨緣XD

2021年12月27日 星期一

《64》真是本神奇的書

之前因為某些書商 App 開啟這本書很慢,再加上目錄並沒有分章節,故一直以為是只有一個章節檔案的緣故所導致。

今天直接在 HyRead Gaze Pocket 閱讀器開啟購買的這本書也遇到開啟很慢的問題,還好我之前為了比較 App 也有在其他家購買這本書,解壓縮一看,居然不是我想像的只有一個檔案,那閱讀軟體怎麼知道要如何跳下一頁呢?看來,還是得看 EPUB Spec 如何規範吧!合理的解釋是看 content.opf,而不是目錄的檔案。

總之,要測試電子書閱讀器有沒有問題可以使用這一本書,也許會有意想不到的驚喜?

2021年12月25日 星期六

慶祝耶誕節

今年的耶誕節剛好是星期六,所以無法直接放假一天,公司也很貼心的給我們一天補休,雖然是要等過後才能申請就是XD

原本很想買台四萬塊左右的電競筆電,沒有意外應該是買 Dell G15?但考慮了老半天,覺得只是為了玩暗黑破壞神 2 重製版才購買筆電實在是有點浪費,再加上我原本用了七年的筆電還是頭好壯壯,買了之後就會有兩台筆電,感覺收納不太方便,於是一直在猶豫中…

前幾天逛 PTT 八卦板時,看到蘋果基金會有個個案,看了都覺得心酸,於是趁著耶誕節的這一天,將原本要買筆電的一半預算,挪去做為個人的小小心意當做送給自己的耶誕禮物,也算是杜絕我原本蠢蠢欲動想要購買筆電的念頭XD

總歸一句話,就是錢賺太少了,才沒辦法想做什麼就做什麼?人生總是充滿著種種無奈!

算了,還是看看 Youtube 的電玩影片解解纔就好,雖然也是越看越無聊就是…

從前年知道 IU 開始,就覺得 IU 唱歌很好聽,剛好有一首也算是應景的歌,希望大家一切都好。

2021年12月23日 星期四

ARP 廣播封包苦主

下午想要修一個 bug 時,板子一直無法取得 IP,抓了封包一看,又是一堆 ARP 廣播封包在網路流竄。

比較特別的是,不像兩年前一樣,是某台設備網路設定有誤才導致狂發廣播封包。稍微看了一下,只看到很多台電腦像是很正常的在問某些電腦的 MAC,單只看一台的網路流量不會很多,偏偏看起來是一整個子網路的每台電腦都有狂問 ARP 的現象,於是又把我的板子打掛了。

一時之間,福至心靈,突然覺得會不會跟最近疑似 IT 透過群組原則自動安裝的 ivanti 管理軟體有關?在 Google 大神的幫助之下,果然有人也有這個問題,看起來是跟尋找設備的 agent 有關,因為 agent 要 ping 電腦,故才會一直發 ARP 封包,而我猜那些電腦應該是沒有上網的,故也沒有回應?

該 agent 使用 XDD 協定來尋找設備,簡單來說 agent 會監聽 ARP 廣播封包,當它發現有新的設備出現在網路上時,便把該 IP 記錄起來,並在各個 agent 間協調,只有一台 agent 會負責 ping 新設備。

聽起來是很棒啦?但該軟體一定是那邊沒做好,才會導致這個情況,光所謂的協調我覺得要考慮的點就很多了。



從 C:\ProgramData\LANDesk\Log\SelfElectController.log 中,確實也可以看到相關跡象。


2021/12/24 更新

今天除了找到 Go package 來發送 ARP 封包,也找到 Win32 API 來發送 ARP 封包,要做測試就更方便了。

更換 LED 崁燈注意事項

崁燈最好是選擇 10W 4000K 的型號,顏色比較不會太亮,最好還有內附快速接頭,只要剝好線將線插進去就可以搞定。

L 是控制線,也就由是開關所控制的線(火線先進到開關,開關再拉線到天花板)。
N 是中性線。

至於線的顏色我有看過兩種(天花板及燈具),沒有絕對,最好還是用電表量:

L 有顏色,N 白色。
L 棕色,N 藍色。

另外有些電線如果是紅黑,則是紅為火線,黑色為中性線。

以一坪多的浴室來說,如果是有乾濕分離的,會拉兩盞燈,一個在淋浴區,一個在盥洗區,故如果是有快速接頭的燈具,我們可以很方便的這樣接。


2021年12月22日 星期三

x86 assembly in Linux - part 7

"Programming from the Ground Up" 第三章有一節 "Addressing Modes" (P.41),會描述各種定址方式的寫法,久沒寫組語,想要重頭溫習一定要來看這一節。

另外,就是 stack (第四章) 的傳遞,久沒碰真的會忘記,當然 x64 函數參數還會用到暫存器 (以 Windows 來說是前 4 個參數),剩下的才用 stack。

總之,記錄一下避免下次還要重頭回想。

2021年12月16日 星期四

常用 Wireshark filter 寫法

(ip.addr == xxxx or ip.addr == yyyy) and eth.dst == ff:ff:ff:ff:ff:ff and frame.number < 405505

上述 filter 表示我要篩選 IP 等於 xxxx 或 yyyy 並且 mac address 的目的地是廣播位址並加上封包編號小於 405505(Wireshark 抓封包時的編號) 的封包。

!ip.addr == zzzz

則是表示不要 IP 等於 zzz 的封包。

2021年12月14日 星期二

UEFI Network 相關 code 位置

最近在研究一個 Bug,實在很難找到實作的地方,今天中午正準備吃飯時,先找到了 error code 的定義,後來憑著 error code 也順利的找到了 TCP Recev 的位置,記錄一下,避免以後忘記。

我要找的值其實就是 104
#define EFI_CONNECTION_FIN      EFIERR (104)
#define EFI_CONNECTION_RESET    EFIERR (105)
#define EFI_CONNECTION_REFUSED  EFIERR (106)

StdLib\LibC\Uefi\select.c - select function
StdLib\LibC\Uefi\SysCalls.c - poll function -> StdLib\BsdSocketLib\poll.c - BslSocketPoll function

DEBUG Status
Status 都用 %r 印出較多,如果 index 有定義在 mStatusString 這個 Array,便會印出定義好的字串;如果沒有,其值就是一個 16 進位值。

Stdlib\EfiSocketLib\Socket.c
EslSocketRxStart 這支函數,在檢查 pPort->pSocket->RxError 如果發現有 error,其值可能是來自下面其中之一:

MdeModulePkg\Universal\Network\Tcp4Dxe\Tcp4Main.c - Tcp4Receive
MdeModulePkg\Universal\Network\Tcp4Dxe\SockInterface.c - SockRcv

順序是先 Tcp4Receive,裡面會再呼叫 SockRcv。

我先用 build -p MdeModulePkg\MdeModulePkg.dsc -a X64 -t VS2015x86,build 出我自己的 Tcp4Dxe.efi,過程中會出錯,那是因為我是整個 Module 全 build,故跑到最後可能因為設定問題會失敗,但不影響我要的檔案產出。

後來查了一下,也可以只 build Tcp4Dex.efi。
build -p MdeModulePkg\MdeModulePkg.dsc -m MdeModulePkg\Universal\Network\Tcp4Dxe\Tcp4Dxe.inf -a X64 -t VS2015x86

接著使用 drivers 找到系統內建的 Tcp4 Driver,查到第一個欄位 DRV 的值,接著使用 unload XX 去卸載它。

最後則是用 load Tcp4Dxe.efi 的方式載入我 build 出來的檔案。

這樣我就可以看到相關訊息,至少我找到了 EFI_CONNECTION_FIN  這個錯誤發生的地方了XD

2021年12月2日 星期四

電子閱讀器盤點篇

趁著最近比較有空的時候,把手上沒在用的閱讀器清一清,既然自己沒在用了,便以還可以的價錢出售,感覺心裡舒服多了,不會製造一堆電子垃圾,機器就是要被使用才能發揮價值。

雖然手上還有 5 台機器,但都是目前的我需要的,5 台缺一不可XD

用來用去,還是覺得 Kindle Paperwhite 3 最好用,速度也最快,依照目前使用頻率以及心中喜愛程度排序如下:

Kindle Paperwhite 3
Kobo Elipsa 
HyRead Gaze Pocket
Hisense A5

至於 Kindle Oasis 2 則是等到 PW3 電池掛掉後,要來取代 PW3 用的。

2021年11月17日 星期三

糟糕的電子書格式範例

先說明我不懂 CSS,但我總覺得一次用兩個以上的類似屬性不知有啥意義?

原本我為了解決從 R 家或 K 家購買的電子書無法在 Kindle Paperwrhite 3 指定字型的問題,每當我的小程式在轉檔時,一律會強制移除 font-family 的屬性,這幾乎可以解決六成以上的問題。

後來又發現有些書除了用 font-family 外,同時也會用 font 屬性且字型名稱會使用單引號或雙引號包住,故我也把處理這種 CSS 的步驟加到我的轉檔程式中。

近日又發現有些書會使用上面的 font CSS,但是其字型名稱卻不使用任何單引號或雙引號包住?有沒有搞錯,一個 CSS 各自表態,真是服了這些工程師!

趁著今天放假的下午,邊吹頭髮邊把這段處理步驟加上,目前我只知道大部份遇到的 case 都只使用 sans-serif 或是 serif 這兩種字型而已。

暫時就先這樣處理吧,反正遇到例外再加到字型陣列變數即可。

2021年11月14日 星期日

Kobo Elipsa 三大小幫手

最近下班後有些東西不得不繼續在家學習,雖然相關書籍已經都購買好了,但還是欠缺一台好用的 PDF 電子書閱讀器!不是說 Elipsa 不好,但 10 吋看 PDF 還是稍嫌小了點。

剛好讀墨最近推出新的 mooInk Pro 13 第二代,感覺還是需要一台 13 吋的閱讀器來看 PDF,而這台是較新機種,理論上應該是比我手上的 mooInk Pro 10 一代還要來得快才是。

本想咬一咬牙買了下去,但一來我現在沒在讀墨買書,二來他 PDF 不能點選翻頁,尤其是最後一點我一直無法接受,想來想去還是放棄自己敗家的渴望。

之前就已經知道 Kobo 有第三方寫好的閱讀軟體,可以幫 PDF 裁邊,乾脆趁現在來試用看看,搞不好可以解決我的燃眉之急也說不定?

網路上比較有名的是 KOReader 和 Plato,而我本來就有裝 NickelMenu,故只要簡單的把這兩個軟體解壓縮放在某個資料夾,加上啟動方式在 NickelMenu 選單,我就能看我需求隨時使用這兩套軟體來閱讀 PDF 書籍。

根據試用的結果,兩者都能暫時達到我的需求,不論是 Google Play Book 的掃瞄類圖檔 PDF,或是我在其他國外書商購買的純 PDF 資訊書籍,兩者都能正常裁邊閱讀。

因此我認為 Kobo Elipsa 的使用者,應該都要安裝這三套軟體,如此一來可以更加容易的閱讀 PDF 檔案。

附上同一個檔案使用手上兩台 10 吋的電子書閱讀器的閱讀效果。左邊是 Kobo Elipsa,右邊是 Readmoo mooInk Pro,我們可以看到有裁邊後,字體果然變大許多,再加上不論是 KOReader 或是 Plato 都有調整對比度的功能,稍微調整一下就能獲得不錯的閱讀體驗。

2021年11月1日 星期一

Linux 下開啟檔案數量限制的相關指令及設定檔

在 Linux 下,萬物幾乎皆是檔案,為了建立一個網路連線,我們就會開啟一個 file descriptor。

一個 process 可以開啟的檔案數量是有限的,預設值是 1024,我們可以使用 ulimit -n 來確定。我們可以透過修改 /etc/security/limits.conf 來放寬限制,以 Ubuntu 來說,我們可以針對一般使用者來放寬限制到 10240,注意如果是要針對 root,則第一個欄位必須明確指定 root 才行。

* soft nofile 10240
* hard nofile 10240

我們也可以使用 cat /proc/PID/limits 來看某行程目前的限制設定。

另外,我們可以使用 cat /proc/sys/fs/file-max 來看 Linux kernel 允許開啟的最大數量,而使用 cat /proc/sys/fs/file-nr 可以從第一個欄位看到目前開啟的數量。

如果我們想調整這個數字,則是修改 /etc/sysctl.conf,指定 fs.file-max = XXXX。

2021年10月30日 星期六

車子燈泡規格

後方向燈 1156 PY21W 12V 黃光,斜角(腳)。

為什麼有黃光跟白光的差異?端看你燈殼的顏色,透明的就用黃光,有顏色的就用白光,透明的用白光白天可能會看不清楚。

正角,斜角指的是燈泡側邊的突點,左右對稱的(兩點 180 度)就是正角,一邊是斜的就是斜角。

單芯,雙芯指的是燈泡底座正下方的接點是一個或是兩個,一個就是單芯。


今天就是只看網路上的文章而買錯了,車子即使是同個型號,可能因為出廠年份或是某些因素導致與自己車子的燈泡不相符,故要自行更換時最好還是先拆掉舊的確定規格比較保險。

話說我也不願意自己更換,但常去的修車廠今天沒開,為了安全我又不想開一大段路去其他修車廠搞定,再加上過兩天急著用車,只好自己動手做了。

2021年10月25日 星期一

蝴蝶效應

前一陣子買了暗黑破壞神 2 重製版,可惜的是在買之前完全忘了電腦規格這一回事,導致我的筆電無法順利執行遊戲。

今天因為有事請假,等到下午有空時,想說乾脆來玩玩很久以前買的暗黑破壞神 1 好了,不料在我的外接硬碟中早就找不到當初備份的光碟 ISO 檔了,可能是我幾年前覺得不會玩之後就把他們都砍光了,想當然爾我也沒有我的光碟了XD

既然找不到我要的東西,乾脆來翻翻我的外接硬碟,看看到底裡面有什麼東西好了?

我幾乎不太備份資料,有些東西失去就失去了,這樣人生比較不會有遺憾?我比較會備份的是自己寫過的程式,但也都是些不太可能再看過的程式,不知道除了程式之外,我還能找到什麼?

以下沒有按照時間發生順序,完全看那個東西先被我發現XD

首先找到的是我第一份程式工作時,無意間發現的活動,該活動是認領某院區院童的願望計畫,記得當初為了採購方便,選的都是球鞋的願望,加便利商店運費應該是八九千左右吧。


接著是事務所工作時,無聊寫的東西,現在看著都覺得有點不好意思XD


下面是我工作後第一台購買的腳踏車,記得第二份程式工作放假時常常一個人騎著它在河濱公園亂逛。



這個是我目前筆電的購買發票,也是我沒有 IBM 可以買後所選擇的第一台非 IBM 筆電,不得不說以前的筆電都很耐用,在我程式生涯中一共也才買過兩台筆電,兩台加起來居然撐了十七年!


果然除了程式外,在我的唯一一顆外接硬碟中找不到任何可供回憶的資料,我想我也跟項少龍一樣,人在邯鄲的回憶也隨著時間的過去而埋葬在時光的洪流之中XD

2021年10月13日 星期三

Ubuntu LTS 版本

最近在研究 release 專案時,突然想到一件事,如果是走傳統的方式,亦即不透過 VM or Docker 的方式,那在選擇 Ubuntu 時,我們應該要如何考慮版本?一般來說,Ubuntu 每半年會出一個版本,分別是 4 月 和 10 月,假設我們是年底要 release,最新的版本應該會是 21.10。

那為什麼在中文版網站上只有 20.04 LTS 版本可以選擇?究竟 LTS 是什麼意思?以前都不會特別注意這些小地方,後來才發現 LTS 是長期支援的意思,也就是 LTS 版本是官方有承諾會在一定的時間內都還會更新的版本,故沒有其他需求的話,官方也是建議使用 LTS 版本。

以下是出自官方某篇文章的圖。


2021年9月20日 星期一

OneLineEPUB

最近的專案在 coding 告一段落後,每次測試連測試程式一共會開啟四個 cmd 視窗,一下子就把我的螢幕佔滿,雖然我個人沒有用雙螢幕,但因為我必須盯著四個視窗確認一些東西,故用雙螢幕也不能解決我的問題。

也因為我必須盯著四個視窗,故也不能把視窗縮小做別的事,之前為了避免類似這種測試無聊的情況,有寫一支程式把單一電子書檔案(.xhtml)的內容抽取出來,只保留純文字,我就可以開啟一個小視窗邊看一下書邊注意測試畫面。

但現在遇到一次開四個視窗的測試情形,每次都要把電子書小視窗拉來拉去好調整到一行的大小,才不會擋到我的測試視窗,久而久之,也是有點阿雜,故決定把之前的程式再做一些改進,一次就是顯示 20 個字的內容,配合另外一個批次檔,我就可以擁有一個一次只顯示一行文的電子書閱讀器,這樣測試時就不會無聊了。

2021年9月10日 星期五

Named Capture Group in Golang

一直以為在 Regex 的匹配中,可以將 ( ) 裡面的匹配字串取出來是 Javascript 或是 Python 獨有的功能,導致我之前在取 Redfish 的 @odata.type 時,只能用 strings package 去解決我的問題。

今天才了解這是正規表示法的一部份,想當然爾 Golang 當然是有支援的,其用法如下:

re := regexp.MustCompile(`v([0-9]{1,})_([0-9]{1,})_([0-9]{1,})`)
matches := re.FindStringSubmatch("#EventService.v1_7_1.EventService")
fmt.Println(matches)

[v1_7_1, 1, 7, 1]

我們也可以為這些 Group 取名,例如 (?P<MAJOR>[0-9]{1,}),這樣 MAJOR 便會是這個 Group 的名稱,因為在 Golang 還要多一道手續自己作 mapping,故我覺得在這邊取變數的意義就不大了。

2021年9月8日 星期三

使用 NFC 手機讀取悠遊卡內碼及電子發票驗證碼

最近信用卡被盜刷,除了訂閱制的付款資訊需一一更新外,信用卡的悠遊卡也要再到電子發票網站重新歸戶。

雖然去便利商店讀取一下悠遊卡很快,但還是想看看有沒有更方便的方式?果然早就有人找到解決之道了。

我們總共需要兩樣資訊,分別安裝兩個 App 即可:

01. 悠遊卡內碼 - 安裝完 NFC Reader 並掃瞄卡後,ID(dec) 這個欄位就是內碼。
02. 電子發票驗證碼 - 安裝完 Easy Wallet 悠遊付,在其他功能有一個讀取電子發票驗證碼功能。

2024/03/23 更新

最近用上述的 NFC Reader 讀取悠遊卡內碼時會失敗,只能看到 ID(hex) 那欄,其他會被訊息視窗擋住,記得用小算盤換算。

2021年9月2日 星期四

凍結的 Windows 10 console 視窗

最近的案子在測試時大概會自動開啟 4 個視窗,偶爾會有某個 console 視窗的程式突然停止運作,一直到按下 Enter 鍵後才會看到程式繼續執行並吐出結果。

因為機率非常的小,故我也不以為意,直到前幾天同事在測試我的新 API 時,他無意間提到他也會遇到跟我一樣的問題,最後他發現是 console 視窗進入了選取模式而導致。

真是個有趣的發現,今天中午試著用關鍵字 "Windows 10 console freeze" 來搜尋,果然看到以前就有人發問過這個問題了。簡單來說,這是 Windows 10 console 視窗的功能,它很貼心(?)的在你選取視窗時,認為你可能要做一些編輯動作,為了怕你不好選取文字,便停住了正在運行中的程式。

詳情可以看這裡

2021年8月27日 星期五

Can't find a default Python

今天在更新 Python 到 3.9.6 時,原本同事由後端 Node.js 呼叫 py 執行的功能變得無法使用,在 Server  log 可以看到 Can't find a default Python 的錯誤訊息,但我在本機直接執行 py 是可以進到互動式界面的。

上網查了一下,有人說跟系統檔案關連設定有關,有人說跟登錄檔有關,我的系統檔案關連設定看起來跟網路上一樣,但網路上的登錄檔是在 Local Machine 路徑下,我的則是在 CURRENT_USER 下,印象中安裝預設選項似乎只針對目前使用者而已?

懶得繼續追查下去,先把目前登錄檔匯出成檔案,變更檔案裡面 Key 路徑到 Local Machine,接著再匯入修改過的登錄檔,這個問題好像就順利解決了?

暫時就先這樣吧,手上還有 Bug 待解決,不想花太多時間在上面XD

2021年8月26日 星期四

Golang os/exec command

最近為了抓取資料分析,需要定時執行一個 linux command 並儲存結果,由於最近都在使用 Golang,當然優先考慮使用 Golang 開發。

在 os/exec 有一個 Cmd struct,我們可以使用 exec.Command(...) 來得到這個 Cmd 指標,接著可以使用 Cmd.Output( ) 得到執行結果。

看似很單純的程式,但只有第一次執行成功,接著都會失敗,錯誤訊息為"exec: Stdout already set"。

看了一下 source code,原來是程式會檢查 c.Stdout 是不是有設定過,換句話說,這個 struct 只能使用一次,不能重覆使用,解決方式也很簡單,不要使用 for loop 外面的變數,每次在 loop 裡面重新 new 一個即可。

另外,由於 linux command 的結果已經帶有換行字元,我們在顯示執行結果時就不需要再加換行字元了。

可惡,害我要明天才能看到結果,今天沒有心情做事了XD

2021年8月25日 星期三

PostgreSQL 使用的一些心得

最近為了避免 License 問題,終於開始使用這個授權最寬鬆的關聯式資料庫,有些技巧跟我以前使用的 MariaDB 都不一樣,記錄一下避免以後忘記。

01. 命令列工具登入方式

psql -U postgres -h localhost -d database_name

02. 安全性設定檔

pg_hba.comf

03. SQL count(*) 過慢

貌似因為 Lock 機制,PG 需要從頭搜尋一遍以得到精準的數字,如果只是想要知道大概,可以使用下面指令得到近似值。

SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname='table_name';

04. Linux 下得知目前資料庫硬碟使用空間

sudo du -sh /sda3/postgresql/

05. 使用指令得到某 table 使用空間

SELECT pg_total_relation_size('table_name');

06. 使用指令得到某 database 使用空間

此數字會比實際硬碟空間還少,因為實際空間還包括 PG 系統本身,以我的測試資料庫來看,大概還要乘上 2 倍。

SELECT pg_database_size('database_name');

07. 一些建立 table SQL 語法

CREATE TABLE users (
    user_id TEXT NOT NULL PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    pwd TEXT NOT NULL,
    privilege TEXT NOT NULL,
    email TEXT NOT NULL UNIQUE
);

CREATE TABLE devices (
    device_id TEXT NOT NULL PRIMARY KEY,
    ip TEXT NOT NULL,
    port INTEGER NOT NULL,
    data JSON NOT NULL
);

CREATE UNIQUE INDEX idx_devices_ip_port
ON devices(ip, port);

CREATE TABLE groups (
    user_id TEXT NOT NULL,
    group_id TEXT NOT NULL PRIMARY KEY,
    group_name TEXT NOT NULL,

    CONSTRAINT fk_users
      FOREIGN KEY(user_id)
  REFERENCES users(user_id)
  ON DELETE CASCADE
);

2021年8月20日 星期五

Add new mount point on Linux for growth size of database

最近為了測試一些 DB 的效能,一直新增資料到資料庫中,導致我一開始切的分割區到後來不敷使用,本來想用 VM 的相關工具把分割區動態變大,但一時不知如何使用,最後還是走回傳統的掛載分割區分式來解決問題。

我試過 MongoDB 和 PostgreSQL,兩者都可以改變預設資料庫位置(/var/lib)到新的分割區。

我使用的是 Ubuntu 20.04,步驟如下:

01. 使用 VM 工具增加原本分配給 VM 的大小。
02. 進 Linux 使用 fdisk 新增分割區,並用 GUI 的工具設定開機自動掛載。
03. 停止資料庫服務(sudo service xxx stop)。
04. 更改各資料庫設定檔,將位置移到新分割區,設定檔是位在 /etc 下面。
05. 參考設定檔原本資料夾名稱,並在新分割區建立一模一樣的資料夾。
06. 先將掛載點權限設成 755。
07. 將檔案權限及群組相關的都改成跟原本一模一樣,像 PostgreSQL 的 main 資料夾必須是 700。
08. 啟動資料庫服務。
09. 去 /var/log 看各資料庫的 Log,理論上應該會看到顯示已開機的字樣。
10. 將系統重新啟動,確認重開機後仍然可以正常運作。

理論上這樣就可以順利使用新的分割區了。

2021年8月2日 星期一

煮湯時視線千萬不要離開鍋子

我個人對吃沒什麼講究!老婆也在約幾個禮拜前不再輪流分組 WFH,既然不用煮飯,故我每天中午都是準備一樣的午餐 - 6 ~ 7 顆手工水餃 + 豌豆苗蛋花湯。

今天也是一如往常的準備午餐,不料在加完蛋花後把一些東西放回冰箱時,我的一鍋湯就以迅雷不及掩耳的速度溢出到整個瓦斯爐檯面,虧我還想說今天狀況還不錯,沒有前幾天打完疫苗後的肩頸僵硬,呆會收拾廚房時應該很輕鬆才對!

無奈只好快速兩三口的把午餐搞定,然後就是無止境的擦拭,今天不是我的天呀!

雖然瓦斯爐檯面有橡膠,但是一鍋子的湯汁還是難免會滲透進去,研究了一下,拆掉兩顆螺絲後,便可以整個拆除做清潔。



這兩顆螺絲不只對應左邊的爐火,只要把右邊爐火的兩顆螺絲依樣畫葫蘆的拆掉,下面長方形的不鏽鋼檯面也可以整個移動拆除,但被這樣一搞後今天真的太累,我就只有清理左邊爐火而已。

其他東西裝回去也很簡單,所有的圈圈提醒處都朝上即可。

Lenovo ThinkPad KU-1255 外接鍵盤滑鼠中間鍵滾動失效

自從 6 月多配合電動升降桌買了這個鍵盤後,其中間鍵滾動視窗功能完全跟我熟悉的不太一樣,重點是時好時壞,原本以為是選項的緣故,在勾選了 ThinkPad 首選滾動後,中間鍵功能恢復成以前習慣的方式,不料過了一陣子後,還是會不定時失效。


據我之前在 Windows 10 使用 SK8835 的經驗,要想讓此類鍵盤的中間鍵正常,一定要安裝正確的驅動程式才行,由於我是時好時壞,故我先假設驅動程式應該是沒問題的,但其實是我忘了 6 月初我是怎麼安裝驅動程式的?我也懶得去確認目前驅動程式的版本。

既然不想走驅動程式這條路,問題還是要想辦法解決,已經知道這個跟驅動程式有關,可見一定是驅動程式的某支負責中間鍵滾動視窗的程式發生問題,我只要在發生問題的時候,想辦法再執行一次該支程式即可,理論上這樣就能解決我的問題。

找了一下資料夾目錄,應該是跟這支程式有關:

C:\Program Files (x86)\Lenovo\ThinkPad Compact Keyboard with TrackPoint driver\HScrollFun.exe

重新執行之後,中間鍵滾動功能馬上就順利恢復,目前暫時可以解決我的問題,等到之後這個問題發生頻率太過頻繁,我就會去找是否有更新版的驅動程式可以安裝,目前只確認我沒有另外安裝驅動程式,都是使用 Windows Update 抓到的驅動程式。

2021年8月1日 星期日

FF3 2D 像素重置版

下午在 Google 首頁中看到此新聞馬上就下單了,我買的是 Android 版,感覺沒有之前移植版來得好操作,但 2D 畫面才是我國一的回憶呀,即使現在不太可能再重玩一次,但還是很不爭氣的入手了。

如果每個人的時間都是無限可以使用,我們的生活又將變成什麼樣子?

2021年7月30日 星期五

殘念的螢幕 VESA 組合架

雖然我的 28 吋螢幕已經夠高了,再加上還放在桌上型螢幕架上,理論上螢幕高度應該是可以的,但自從 6/2 我的電動升降桌到貨後 WFH 到現在,多少還是覺得差了一點,故開始考慮要買個螢幕伸縮支架。

可惜的是我的螢幕沒有 VESA 接口,好不容易看到有另外裝在螢幕上的 VESA 組合架,買來之後我才想到,我的 HDMI 接口是垂直的接上螢幕,裝了這個 VESA 組合架後,我就沒辦法再使用 HDMI 線了,於是我又多了一個 3C 垃圾XD

第一劑 AZ 疫苗注射體驗

2021/07/30 AM 10:52

終於輪到我打疫苗了,我選擇的接種站是慈濟新店靜思堂,從報到到施打都非常有效率,總共只花了約 25 分鐘就打完疫苗(不含 15 分鐘觀察期),打完的時間為 AM 10:52,另外,還發給我們 4 顆藥,我記得跟我幾個月前來看肩膀拉傷給的止痛藥很像,應該也是普拿疼的一種。

很巧的是我這個星期一才陪我母親接種第一濟莫德納疫苗,由於屬於 65 歲以上的長者補打,故我只能選擇新店天主教耕莘醫院,由於耕莘的空間稍微狹小(日間照護中心),故報到到施打都需要辛苦的工作人員安排分流,相比之下新店靜思堂的空間真的舒服多了,如果還沒打的新店人,真的建議可以去新店靜思堂施打疫苗,當然兩邊的醫護及工作人員都很親切,這次的疫情可以順利渡過,真的是辛苦這些站在第一線的所有人員了。

希望還沒打到的國民可以快快打到疫苗,當然也希望我這個老人不要有不舒服的副作用XD

2021/07/30 PM 02:21

不知道是不是心理作用,感覺上半身肩頸肌肉很僵硬,跟我前一陣子肩膀受傷,做事一整天晚上就全身僵硬的感覺很像,還好午餐已吃完,廚房清潔工作也告一段落,連開水都燒好了,就好好的休息 3 天囉。

2021/07/31 PM 01:00

昨天晚上覺得很累,但是都睡不著,有一點點發冷,但都是小狀況。今早起來只是覺得疲倦,昨天僵硬情形已經不見,但是左手臂注射處有點疼痛,大概像是有人一直捏你的肉的感覺。

中午煮午餐時,明顯覺得比平常累,廚房清潔時也是一樣。

2021/07/31 PM 03:45

感覺身體有一點熱,但量額溫也只有 36.7 度,疲勞感一直存在,決定來睡個覺。

2021/07/31 PM 05:49

睡覺也睡不太好,只有睡著一會,目前剛洗完澡,額溫一樣只有 36.7 度,但疲勞感似乎沒那麼明顯。

2021/08/01 AM 08:17

昨天一直到睡覺前,體溫都在 36.7 度 ~ 36.9 度之間排迴,就是身體覺得有一點熱而已,半夜起來上廁所後就不太好睡,但是沒有不舒服感,可能就是老了睡眠品質差吧,早上起床後就沒有昨天的疲倦感。

2021/08/01 PM 02:58

下午一點多開始,不知道為什麼肩頸又開始僵硬,打完疫苗明明都超過 48 小時了,但比起之前肩膀受傷的僵硬感,我覺得都是小意思。

2021年7月28日 星期三

PW3 永遠都是我的心頭好


01. Kindle Paperwhite 3 (最愛)
02. Kindle Oasis 2 (吃灰)
03. Onyx Boox Note Lite (掛掉)
04. Onyx Boox Nova Pro (賣掉)
05. Readmoo mooInk Pro (吃灰)
06. Kobo Clara HD (吃灰)
07. Hisense A5 (上網用)
08. Onyx Boox Nova 3 Color (賣掉)
09. HyRead Pocket (上網用)
10. Kobo Elipsa (看 PDF 專用)

Kobo Elipsa 到貨後,我手中的閱讀器已來到了 7 台,應該是目前最高數量的一次,如果扣掉已經掛掉的 Boox Note Lite、賣掉的 Nova Pro 和 Nova 3 Color,我總共曾買過 10 台閱讀器!

即使手邊有那麼多閱讀器,我的最愛還是 Kindle Paperwhite 3,不論是手感,看書的體驗都不是我手中其他的閱讀器可以相比。

隨著肩傷的逐漸好轉,我又開始拿起我的 PW3 閱讀了,看著一排的閱讀器,我真是對不起地球的北極熊呀XD

2021年7月23日 星期五

Kobo 的《精通 Go 程式設計》一書


這本書我大概已經買了 4 次,中英文紙本書各 1 本,英文流式 EPUB 電子書 1 本,最後一次則是 Google 的 PDF 掃瞄圖片中文電子書。

今天無意在 Kobo 上亂逛,同樣的一本書,Kobo 賣的居然是固定版面的 EPUB 電子書,這個格式的好處是會有目錄,價錢只貴了幾10元,太晚看到了,扼腕。

2021年7月18日 星期日

Kindle 轉檔閱讀的相關疑難雜症

將購買的繁體中文書轉檔到 PW3 閱讀後,不知不覺也過了快三年,陸續有遇到一些問題,今天剛好在 PTT 有人發問相關問題,本想在 PTT 好好留言回答,但 PTT 跟 FB 一樣,都不容易撰寫文章,只好將相關心得留在部落格中,有緣人自然會看見XD

01. 直排中文轉檔後,只能顯示橫排。

這個問題只要用 kindlegen 工具轉檔即可,此工具轉出來的是較新的 MOBI 檔,可以再透過 email 傳送到 Amazon 雲端,只要 Kindle 內有放置字型也可以指定字型閱讀,前提是 CSS 的 font-family 或是 font 沒有指定 Kindle 內有的字型,另外,這種方式無法在休眠畫面中顯示封面。

02. Kobo 繁體中文書在 Kindle 上呈現亂碼。

此問題是 Kobo 的書幾乎在每個 XHTML 檔案開頭都缺少了 <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE html> 此段敘述,手動在每個 XHTML 檔案加上即可。

03. 語系為繁體中文的書,Kindle 內切換字型看到的都是簡體中文字型名稱。

此問題是在某次自動更新後才出現,不知為何 Kindle 會將非 Amazon 購買的書都當成簡體中文書,故只顯示簡體中文字型以供替換,雖然簡體中文字型也可以顯示繁體中文字,但標點符號都會無法置中。像我特別喜歡 Kindle 的圓體字型,我就會從 Kindle App 拿出我要的圓體字型再放入 Kindle 中使用,選擇字型時看起來就像這樣。


04. 自行選擇的字型無法起作用。

此問題是因為該書在 CSS 中有指定字型,像是使用 font-family 或是 font,大部份都是使用 font-family 指定,少數書會使用 font 來指定,像下面這本書僅拿掉 font-family 就沒有用。



將 CSS 裡面所有 font 最後面的指定字型敘述拿掉後,又可以使用喜歡的字型來閱讀了,這裡我指定的還是同一個字型,此時圓體字型的效果就可以順利呈現。


2022/04/28 更新

今天又遇到不能顯示圓體字型的書,後來才發現是該書指定了一個以上的語系,偏偏第一個又是英文,故即使你前一本看的是繁體中文書也選擇了圓體字型,但因為切換到一本非繁體中文的書,故之前記住的字型當然會失效,改成英文語系的預設為主,懶得改原始 EPUB 也沒關係,再把字型指定回來即可。

05. kindlegen 轉檔常見錯誤解決方式。

COVID-19 下,每個人都應該看的一本書 - 《這裡沒有英雄:急診室醫師的COVID-19一線戰記【電子書加值版】》

這本書之前預購時就買了,原本以為只有讀墨獨有,後來發現樂天也有,現在的我當然是選擇在樂天購買XD

這本書是由一位急診室醫生胖鳥所撰寫,看完這本書後,我們似乎也跟隨著醫生的視角,感受到這個可惡的病毒對人類帶來的影響,也了解到目前台灣醫護人員的辛苦,如果沒有這些醫護人員的努力,台灣也不能這麼快的恢復到目前的狀況。

平凡如我的凡人,總覺得病毒這個敵人離我很遙遠,尤其對我們這種不愛出門的人來說。但身處一線的醫生們卻是在維護團隊與拯救生命的天秤中,一次又一次的決定該以孰者為重,這種內心煎熬的交戰真的不是我們所能想像的!

幸好,目前暫時可以稍喘一口氣,希望這個可惡的疫情可以隨著疫苗的普及而早日淡化消失。

題外話:醫生的多才多藝果然不是我們平凡人能夠想像的,前有侯文詠醫生的妙語珠璣,後有胖鳥醫生的感性戰記,也多虧了他們,才讓我們能夠更了解醫生們的內心世界XD

2021年7月16日 星期五

膠水語言

印象中 Perl 是最早有膠水之稱的程式語言,意思是它很容易與其他程式語言結合。但我覺得任何一種 script 語言其實都可以當作膠水語言。

最近為了結合我自己的 Node.js 程式與别人寫好的 Python 程式,我選擇以 Windows Batch 來當中介,由於我需要將 Python 程式中得到的字串傳遞出來,原本考慮使用 os.putenv or os.environ 這兩種方式來傳遞環境變數,但在我的 Windows Batch 中卻無法接到此變數,本來在不同 script 中傳遞變數便有些東西須考量,不論是 Windows Batch 或是 Linux bash script 皆是如此。最終我決定使用檔案來傳遞就好,反正只要使用下面這招,就可以重導向去環境變數。

os.system("echo {0} > name.txt".format(outname))

SET /p BOOK=<name.txt

下面就是我的最終結果,終於有了好用的工具可以嘿嘿了XD


2021/08/03 更新

晚上打完下班卡後,馬上快速的替 CSS filter 加上去除 font 指定字型的功能,經實測還可以,希望可以一勞永逸的解決 Kindle 指定中文字型的問題。

2021年7月14日 星期三

依 109 年內政部人口統計資料概算 65 歲以下人口 AZ 施打可能情形

昨天疫苗登記預約系統突然開放給 18 歲以上的人登記施打意願,由於目前疫苗數量不足,故不是每個人都有機會打到,好奇之下,去內政部戶政司下載了「縣市人口按性別及五齡組」的統計資料來看,目前最新資料(109年)如下:

A  65 歲以上 - 3,787,315
B  64 歲 ~ 30 歲 - 12,563,603

記得新聞說加上未來幾天進來的 AZ,全國應該有 300 多萬劑,算 300 萬好了,假設 6 成的人有意願要打疫苗,只選 AZ 或兩者皆可的約佔了 55%,稍微換算一下,大概是 B 類前 909 萬人都可以打到 AZ,以該統計資料來看,約莫是打到 40 歲左右。


當然內政部的資料並非最新資料,未考慮到死亡,人口移出入等,但也可以稍微知道自己落在那個級距,雖然我目前還是只有勾選莫德納就是了XD

2021/07/16 更新

中午查了一下最新不良反應事件,結果如下:


2021/07/18 更新

想要了解全面打 AZ 後不良通報的後續更新,可惜的是到星期日晚上為止,網站皆未更新,目前只有到 7/15 的資料。

2021/07/19 更新

下午 CDC 公佈第三輪登記中第一批施打年齡的國民為 1973 年以前出生的,約莫有 170 萬人,扣除原本 50 歲以上的以及第九類人員,如果未來幾個星期不再有 AZ 進來,我認為還是在 40 歲以上左右比較有可能打到疫苗。

下午過後,終於更新相關數據了,可能是因為假日,故將三天資料一起公佈,奇怪的是,這次反而變莫德納通報事件較誇張,明明這三天以打 AZ 為大宗。


不過不良通報與 1100718 COVID-19疫苗接種統計資料.pdf 的統計日期不一致,一個是寫 7/16 ~ 7/18,另一個則是 7/17 ~ 7/18,但施打總數都是 223,505 人,可能是第二份資料有誤吧?另外一個奇怪的點是因為假日緣故,故這三天施打人數反而沒有 7/14 一天多?

後來在手機查了一下,還好前天有下載 07/16 的統計資料,223,505 確定是這兩天 7/17 ~ 7/18 的施打人數,但不良事件則是 7/16 ~ 7/18,感覺不好分析了。另外,7/16 當天的施打人數則是 AZ 201,312,莫德納則是 78,694,合計當天為 280,006。

2021/07/20 更新


2021/07/23 更新

最近幾天,莫德納的數據都不好,再加上 AZ 的不良反應通報居然有過了 64 天的,也就是說不良反應通報並非單指新增施打人數的不良反應,裡面還有包括之前施打的人,看來這個表格只能單看累計比較有參考意義。

2021/07/31 更新

家裡 5 個人只有 1 個人打疫苗,為了保護家人,7/19 早上 10 點多時,還是多勾選了 AZ,也在昨天順利接種第一劑完畢,除了昨晚睡不著外,目前只有一點點小疲倦。

這一輪開放到 38 歲為止,接下來的一輪,可能就不夠百萬人施打了?

2021年7月8日 星期四

NickelMenu 初體驗

NickelMenu 是一個由高手開發的 Kobo 小工具,它可以增加自定義的選單在 Kobo 的閱讀器上,另外本身還內建一些功能,我們可以藉由它來執行支援的任務,比如說啟動程式、重新掃瞄書籍、重開機以及關機等等。

對於想在 Kobo 閱讀器上開發程式的人,我強烈建議要裝,只要照著範例啟動 daemon,便可以 Telnet 進去閱讀器,對於 debug 自己寫的程式非常方便,另外,我還建議使用 Golang 來開發,如果只是用到原生的 package,一般來說編譯不會有什麼問題,如果有用到第三方的 package,只要不是 binding 系統的 library 或其他 C 語言,我想應該也沒有什麼大問題。

下面是我的編譯設定:

@echo off

SET PATH=%PATH%;C:\Go\bin
SET GOPATH=%CD%
SET GOOS=linux
SET GOARCH=arm
SET GOARM=7

至於 NickelMenu 設定,我是使用這兩個範例來方便我 Telnet 進去閱讀器,一個會顯示目前 IP,另一個則是開啟 Telnet daemon。


menu_item :main    :IP Address     :cmd_output         :500:/sbin/ifconfig | /usr/bin/awk '/inet addr/{print substr($2,6)}'
menu_item :main    :Telnet         :cmd_spawn          :quiet:/bin/mount -t devpts | /bin/grep -q /dev/pts || { /bin/mkdir -p /dev/pts && /bin/mount -t devpts devpts /dev/pts; }
  chain_success                    :cmd_spawn          :quiet:/usr/bin/pkill -f "^/usr/bin/tcpsvd -E 0.0.0.0 1023" || true && exec /usr/bin/tcpsvd -E 0.0.0.0 1023 /usr/sbin/telnetd -i -l /bin/login
  chain_success                    :dbg_toast          :Started Telnet server on port 1023.

據我在 Elipsa 實測的結果,除了開啟藍牙時,終端機視窗操作變得緩慢外,其他時候的操作我都覺得可以接受,不過因為 Kobo 很喜歡自己偷偷關掉 Wi-Fi,故必須在開發者模式中設定強制讓 Wi-Fi 總是開啟,不然可能會 Telnet 一半就無故斷線,NickelMenu 也很貼心的在文件中增加了呼叫方式。


下面則是我目前最後的版本,橘線以上的都是文件裡的範例,沒有什麼好說的,但我比照它 toggle 的方式,寫了一個方便我啟動 KoboPageTurner 的項目。


NickelMenu 有類似 chain 的執行方式,故可以用它來實現程式語言中的 if else 語法,一樣顏色的行數表示執行先後有關聯性。

01. 表示要 kill KoboPageTurner 的 Web Server。
02. 假設成功,表示我們之前有啟動過 Web Server,故我們會跳過下面 3 行敘述不執行。
03. 第 1 行執行失敗,表示未啟動過,故啟動 Web Server。
04. 第 3 行執行失敗,跳出對話框提醒。
05. 結束連鎖執行 chain。
06. 第 2 行成功,跳到這裡,顯示砍掉程式成功。

你瞧,NickelMenu 是不是一個很聰明的程式,我在 UEFI  Shell 下也有簡單寫一個類似架構的小工具,可以幫忙同事做一些測試,只要在清單中列出並排序要執行的 script,就可以依序去做測試,概念上完全相同 NickelMenu,只是沒處理那麼多細節,要繼續執行或是中斷執行都由每一個 script 自行去決定,這樣的好處是架構不需搞那麼複雜。

2021年7月6日 星期二

KoboPageTurner v0.4.0 改版記錄

Kobo Elipsa 已經內建體驗版的藍牙功能,經實測與我的 Logitech R500 翻頁器搭配良好,也有其他網友測試過其他廠牌的翻頁器,看來也有幾款可以使用,故我認為 Elipsa 支援更多的藍牙翻頁器只是早晚的事。

既然 Elipsa 已經內建藍牙,理論上可以不用出動我的 KoboPageTurner 專案。但既然是自己生的孩子,總是想知道用在 Kobo 其他機器上的相容性好不好?於是便有了此篇文章的誕生XD

最早以為只是 event 號碼不同,據我使用 cat /proc/bus/input/devices 檢查的結果,Elipsa 的 Event Handler 應該是 event2。


在設定檔中修改了 eventFile 的設定後,原本以為可以從此一帆風順?沒想到會變成選取的效果,除了翻頁無效外,螢幕需要手動多點幾下後才可以恢復正常功能,這很明顯的就是我拿之前在 Clara HD 存取的封包傳給 Elipsa 的觸控螢幕後,一定是那邊的格式不符預期,Elipsa 才無法正常工作。

解決的方式也很簡單,再抓一次 Elipsa 的封包資料即可,但第一次用 Linux 內建指令抓的資料太多又斷在不正常的地方,二來因為年代久遠,一時無法理解觸控封包的正確格式,只好先回頭再看一次之前 Clara HD 的封包再來解析 Elipsa 的封包。


Clara HD 之前的封包感覺簡單多了,不像 Elipsa 光 X, Y 的小封包層就有 6 個,嘗試用我理解的方式去送,沒想到結果依舊?

後來排列組合多次還是不能如我所願,最後只好再寫一支程式來幫忙記錄及印出封包,雖然小程式沒有如我預期的正常結束,但還是幫助我看出端倪,原來是 code 0x39 的 ID 要送出一個 value 為 0xFFFFFFFF 的封包,這個就是我之前無法成功的關鍵!


有了完整的 raw data 就好辦了,雖然有 6 個小封包,但我覺得應該不用那麼多?應該只要按下及放開的封包再加上結尾的 0x14A 即可?試著簡化過後,下面就是我最後送出的封包格式。


為了因應此次改版,config file 也增加了 rawData 欄位,舊版的就會自動套用 ClaraHD。

下面則是實際翻頁的結果:


自己生的孩子果然還是最帥XD

2021/07/07 更新

昨天睡覺前,又修改了一下我的 debug 小工具,改用 Go channel 來完美結束程式,真的越來越喜歡 Go 語言了,只可惜目前還不太能用 Go 寫出跑在機器上的 GUI App,可能是我還太菜吧XD

2021/07/12 更新

0x39 那個 ID event 應該跟最後一個 0x14A 是一組的比較合理?不過這種東西可能會隨著觸控螢幕不同而有所不同,沒必要糾結在這個地方,反正遇到新機器就是重抓一次封包即可,只要有一次的封包,所有細節都能一目了然。

當然可以再做一些加強,把 gEvent 的 hard code 變成一個檔案,這樣當遇到新機器就不需要重新編譯,只要新增 gEvent 檔案即可。

這個專案的缺點就是 Wi-Fi,會導致機器較耗電,但這也是 SW 最方便處理的方式,如果改成有線的 patch,一般人實在是不容易 DIY。

另外,我發現我新做的 debug 工具,如果沒有按下觸控,程式會停在 Read 的地方,無法像我想的讓 Timer 去觸發結束程式,我想 Go 底層可能是用同步的方式,故在沒有資料可以讀的情況下會卡在 Read 那一行,知道有這個情況即可,反正是多按一下就可以解決的事,暫時先這樣處理即可。

2021年6月30日 星期三

Kobo Elipsa 入手初體驗

我是第一批預購的讀者,結帳時間差不多在 PM 7:00 左右,昨天快傍晚時終於等到我期待已久的機器,開門一看到此包裹,立馬上網打下班卡好盡情的體驗此機器。



整體包裝果然有精品的感覺,每樣東西都有獨立的包裝盒,其中手寫筆附贈的電池、筆芯以及拆換筆芯的工具則是隱藏在筆盒內盒泡棉盒的背面,如果有沒看說明書的讀者,別忘了還有這三樣小東西XD

拿在手上果然是有點重,尤其我前一台 10 吋機器是 mooInk Pro,就算跟我前前一台不到半年就掛掉的 Onyx Boox Note Lite 比,感覺 Elipsa 確實是有比較重,但我當初就只想要定點使用,我想應該可以接受,另外,Elipsa 有自動感應螢幕翻轉的功能,故可以隨時換手閱讀,早上稍微用右手拿著看一下書,會感覺到右邊手拿處背面有溫溫的感覺。為了有螢幕閱讀燈,重量真的是必要之惡,有了螢幕閱讀燈,在光線不足時也比較容易閱讀。

昨天拿到時本想來安裝自己開發的 KoboPageTurner,雖然一些網友分享手邊翻頁器無法使用,但還是不死心的試看看體驗功能裡的藍牙連線,沒想到一試之下,居然可以成功翻頁!就連自己的 PDF 書籍也可以順利翻頁。


可能是體驗版的緣故,雖然昨天睡覺前已充飽電,但今早起來,電量已不到 30 %,難怪這個功能會放在體驗版中,想要使用的網友,不用時記得要關閉藍牙,目前藍牙功能在通知列是沒有任何圖示提醒的。

稍微試用了一下筆,感覺還可以,不過我本來就很少用筆記功能,故不太介意功能完整度,由於我螢幕的塑膠膜仍未撕下,手寫感覺是有點滑,但速度我覺得沒問題。

我另外一個重視的點是 PDF,這也是我當初購買的原因之一,試讀了 Google 圖書購買的資訊書籍,配合我用 Acrobat Pro 加上的目錄功能,Elipsa 也可以正常處理,最主要是它可以點選翻頁,我個人是比較喜歡點選翻頁的方式,但據網友分享,搭配手寫似乎會有誤翻頁的情況,如果有網友遇到同一問題,也許可以考慮只設定滑動翻頁。


另外,我試用的 PDF 約 6.38 MB 大小,總共有 416 頁,感覺是比 Kobo 內建書籍翻頁還來得慢,平均翻頁速度約 1.84 秒,以我購買的《萬能店員:我的便利、你的過勞,超商的社會代價》一書來對比,平均翻頁速度則約 1.03 秒。

整體來說,此台機器有達到我當初購買的目標,沒有意外的話,在家應該都只會使用它,雖然我的最愛還是 Kindle Paperwhite 3,但在肩膀受傷的情況下,為了正常看書,還是只能用翻頁器來閱讀,這也是為什麼這台封閉式系統的機器有內建藍牙是多麼棒的優點了。

2021/07/05 更新

看來這台機器的硬傷是閱讀 PDF 及固定版面書籍,據我用碼錶實測的結果,平均都至少要 2 秒左右,單純以這個速度來看,mooInk Pro 10 吋似乎也沒多慢?

2021/07/06 更新

昨天晚上終於把 Elipsa 的觸控封包搞懂,讓我的 KoboPageTurner 專案也可以用在 Elipsa 上。當初想得還是太簡單了,覺得觸控面板應該都大同小異,同樣的 raw data 應該可以共用?目前只知道 ClaraHD 和 H2O 可以共用,就不知道另外一台 8 吋的 Forma 是否可以延用目前已搞定的兩種封包格式?

2021/11/17 更新

強力推薦安裝第三方軟體,我安裝了 KOReader 和 Plato 兩套軟體,PDF 閱讀體驗果然提升不只一個檔次。

2021年6月29日 星期二

Kindle App 登入小技巧

我想應該有人跟我一樣,當初在註冊不同亞馬遜帳號時並沒有考慮太多(或者說不知道不同國家帳號是分開的),直接都用相同帳號註冊,像我就是延用美亞的 email 帳號註冊中亞,一開始甚至還使用相同密碼,後來因為不容易在 Kindle App 中登入想要去的亞馬遜網站,便聽從網路建議,將不同亞馬遜帳號設定不同登入密碼,終於可以順利登入我要去的亞馬遜網站。

即使是更改密碼,有時候仍然不能順利登入,像我就常常遇到不管怎樣都會登入美亞的問題。

有一陣子發現可以使用系統語系的方式來選擇要登入的亞馬遜網站,比如說英文語系就是美亞,中文語系就是中亞。

但這一招在我的 HyRead Pocket 並無法順利成功,不論我如何切換語系,App 就是會嘗試要幫我登入到美亞,後來實在沒辦法,進到中亞帳號設定中瀏覽了一下,發現居然有修改登入帳號(email)的選項,馬上換了另外一個 email 登入帳號,說也奇怪,我終於可以順利的登入到中亞了。

希望有跟我一樣問題的人,可以試著使用不同的登入帳號,也許就不再有登入問題了。

我想對亞馬遜來說,資料庫應該有另一個 ID 欄位,故在註冊後仍然可以隨意的更改 email 帳號而不會有任何問題。

2021年6月27日 星期日

改造 Google 圖書購買的 PDF 資訊書籍

雖然如標題所述,這類技術書籍每頁都是一張圖片,但也沒有其他地方有賣 EPUB 的中文電子書,對於我們這些不想看原文書的又不想買紙本書的人來說,也只能鼻子摸摸的接受它。

不能複製程式碼事小,每次要找資料只能手動的跳到目錄頁,用久了也著實有點心煩。

像讀墨、樂天或是凌網,偶爾也會有些資訊書籍的書,除了凌網外,大部份販售的都是固定版面的 EPUB 書檔,雖然每頁也是圖片,但至少有目錄可以跳轉,但我都是在電腦上看這類書較多,故我還是會習慣把每頁圖片抽取出來做成 PDF 檔。

因此我手上就會有一堆這種 PDF 資訊書籍,每次都要克難的手動翻找,才能順利找到我要的章節。

昨天我終於狠下心來訂閱 Acrobat Pro 版,每個月要 NT $483,且一定要訂閱一年。PC Home 還有販售 2020 的桌機盒裝版,但要價約 2 萬元,找了一下,網路有所謂下載版可以購買,只要 US $450 左右,價錢有一定的差距,但貌似只能在美國使用?

期間也有考慮試用其他 PDF 編輯軟體,但為了避免相容性問題,後來還是訂閱 Acrobat Pro 版。

千辛萬苦的做完幾本書的書籤(目錄)後,終於有在看技術書籍的感覺了,但此時我也累了,可能要學習 Acrobat Pro 裡面 Javascript 的用法,寫程式來自動執行,不然真的是很瑣碎的苦工呀!

對了,雖然 Acrobat 有 OCR 的功能,但對我要加目錄這件事本身沒有幫助,即使我把整本都轉成文字書,我還是得手動在原本目錄上加入超連結跳轉,除非我的認知有誤,不然 OCR 這個功能對我沒有幫助,單純只是加上目錄,也許可以考慮購買別套軟體即可。

2021年6月25日 星期五

A pointer variable in the loop statement of Golang

雖然這幾個月幾乎都用 Golang 做事,但我學 Golang 已經是好幾年前的事,即使買了也看了好幾本書,但因為中間都沒有用它來做什麼專案,故很多坑洞都要等到真的碰到才知道發生什麼事了?

當然這裡的坑洞指的不是 Golang 本身的缺限,而是因為不常用所衍生出來的問題XD

今天下午就讓我碰到一個問題,我也是直到剛才把程式簡化才明白發生了什麼事?

簡單來說,如果我有一個 slice 裡面存放的是指標變數,在使用 for loop 語法時,在 for loop 裡面的那個指標變數,假設我們稱它為 p 好了,索引值假設是 0,也就是第 0 個元素。

此時雖然 p 和 slice[0] 指的都是同一個實體的位址,但 p 只是另外一個指標變數,並不等於 slice[0] 的那個變數,故假設我們把 p 指向另外一個實體的位址,原本 slice[0] 指的還是原本的地方。


整體概念其實有點像 C,也就是要變成指標的指標,才能將原本 slice[0] 指到另外一個位址,當然 Golang 裡面沒有這種東西,故我們要直接使用 slice[0] 變數,而不要使用 p 變數 。

模擬程式如下:


package main

import (
    "fmt"
)

type Device struct {
    ID string
}

type Arg struct {
    Devices []*Device
}

func main() {
    arg := Arg {
        Devices : []*Device{
            &Device {
                ID : "1",
            },
            &Device {
                ID : "2",
            },
        },
    }

    d3 := &Device {
        ID : "3",
    }

    for i, d := range arg.Devices {
        fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
        //d = d3
        arg.Devices[i] = d3
        fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
    }

    for i, d := range arg.Devices {
        fmt.Println(i, d.ID)
    }
} 

2021年6月24日 星期四

我的 3C 小收藏

剛才在電子書閱讀器討論區看到有人在分享手上有的 3C 收藏!讓我也想將我的收藏拿出來盤點一下。


佔我收藏最大宗的就是電子書閱讀器了,其次可能是看書架,接著應該是計時器,最後才是一台筆電。我個人到目前為止是連一台平板都未買過!

下個星期 Kobo Elipsa 到貨後,個人就會有 7 台閱讀器,如果要選一台賣掉,我應該會選 mooInk Pro 10 吋,畢竟我現在無法憑個人能力破解它,而它本身的軟體說真的不太好用,不論是內建書城還是 PDF 相關操作。

用來用去我的最愛還是 Kindle Paperwhite 3,其次是 Hisense A5,Kobo Clara HD,HyRead Pocket  暫時只能排第四,雖然 Pocket 不像 Hisense A5 有資安風險,但跑起來確實沒有 A5 快,著實被扣了不少分數。

至於電腦方面,從大學母親買給我的第一台 K6-233 後,升級過一次賽陽 CPU,之後便換購買筆電,分別是第一代 EeePC、IBM R51 與目前的 Toshiba R30-A,最後兩台筆電使用時間加起來都超過 15 年了XD

退伍當年還瘋了一陣子 Palm PDA,計有 Acer s10、Treo 600、快譯通手機,還有好多忘記型號的機子,應該有超過 6 台,可惜自從 Treo 600 掛了後,手邊一台都沒剩了,之前離開事務所的時候,就送出了一半以上的機器給事務所的同事。

回首來時路,真是人不輕狂枉少年呀,當初把這些錢存起來該有多好?雖然存到現在也是買不起房子。

這就是人生呀,我們能做的也就是把握當下。

2021/06/25 更新

稍微 Google 了一下 Palm 型號,也留下個記錄,但有些我就真的想不起來了。

Acer s10、Treo 600、快譯通 X-Pro 168、Treo 270、HandEra 330、Zire 71。

Hide/Show Desktop Icons on Windows 10 by C code

雖然我們在桌面按下滑鼠右鍵,就可以在檢視功能的子選單中選擇是否要顯示桌面圖示,但需使用滑鼠又要兩個操作步驟感覺就很不好用。

昨天晚上終於狠下心來把它完成,雖然我之前已經 Google 過了,但肩膀受傷後人就變得很懶,除了工作以外的程式都很懶得動工,這個星期老婆進公司上班故不用張羅三餐,我連自己的午餐都隨便吃,可能是偷懶的緣故,感覺這星期肩膀狀況還不錯,所以昨天才會想來做這件事。

好久沒寫 Windows 相關的程式了,很多 HWND 等的參數都變得很陌生。

一開始在沒 Google 前,直覺就是可能跟 registry 有關,也找到相關的 registry。

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"HideIcons"=dword:00000001

原本以為只要修改這個值後,再想辦法用廣播方式送出 WM_SETTINGCHANGE 訊息,應該就可以生效,但據我實驗的結果,桌面程式知道我動了 registry,但並不會生效,我猜它應該只是讀 registry 得知目前的值,才決定是否要在 "顯示桌面圖示" 前打勾。

好吧,只好走 Google 來的方式,來解決這個問題。


要特別注意的一點,上面有說應該要看 OS 版本來決定對誰發送訊息,但我在寫 Code 前有先用 Spy 這類的軟體來找尋視窗,發現在 Windows 10 跟連結的說法不太一樣。

順序應該是如下:

01. 找到 Progman 這個 Window。
02. 找到 class 為 "SHELLDLL_DefView" 的視窗。
03. 送出 WM_COMMAND 訊息。


int toggleIconByShell() {
    int res = 0;

    HWND progman;
    HWND defView;

    // Find SHELLDLL_DefView class
    progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
    printf("Program is 0x%p\n", progman);

    defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
    printf("SHELLDLL_DefView is 0x%p\n", defView);


    // Send message to defView
    int lParam = 0;
    int wParam = 0x7402;

    LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);

    if (lResult != ERROR_SUCCESS) {
        printErrorCode(lResult);
        res = lResult;
    }

    printf("OK\n");
    return res;
}

2021/06/24 更新

又把文章仔細看了一遍,SHELLDLL_DefView 在某些情況下,會從原本的 Progman 跑到 WorkerW 下面,故需要針對不同情況去找 Handle,將尋找 Handle 獨立出來變成函數,增加可讀性。


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void printErrorCode(LSTATUS lResult)
{
    printf("ErrorCode = %d(0x%08X) \n", (int)lResult, (int)lResult);
}

BOOL EnumCallback(HWND hwnd, LPARAM lParam)
{
    char name[256];
    memset(name, 0x00, sizeof(name));

    GetClassNameA(hwnd, name, sizeof(name));

    if (strcmp(name, "WorkerW") == 0) {
        HWND *address = (HWND*)lParam;

        HWND defView = FindWindowExA(hwnd, NULL, "SHELLDLL_DefView", "");

        if (defView != NULL) {
            *address = defView;
            return FALSE;
        }
    }
    return TRUE;
}

HWND getDefViewHandle()
{
    HWND progman;
    HWND defView;

    // Find SHELLDLL_DefView class
    progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
    printf("Program is 0x%p\n", progman);

    defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
    printf("SHELLDLL_DefView is 0x%p\n", defView);

    if (defView == NULL) {
        HWND *address = &defView;
        // defView is moved to "WorkerW"
        EnumWindows(EnumCallback, (LPARAM)address);
        printf("After searching WorkerW, SHELLDLL_DefView is 0x%p\n", *address);
        defView = *address;

        // SHELLDLL_DefView is not the child of WorkerW.
        if (defView == NULL) {
            HWND desktop = GetShellWindow();
            defView = FindWindowExA(desktop, NULL, "SHELLDLL_DefView", "");
            printf("After searching desktop, SHELLDLL_DefView is 0x%p\n", defView);
        }
    }

    return defView;
}

int toggleIconByShell()
{
    int res = 0;

    HWND defView = getDefViewHandle();

    if (defView == NULL) {
        printf("SHELLDLL_DefView not found \n");
        return -1;
    }

    // Send message to defView
    int lParam = 0;
    int wParam = 0x7402;

    LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);

    if (lResult != ERROR_SUCCESS) {
        printErrorCode(lResult);
        res = lResult;
    }

    printf("OK\n");
    return res;
}

int main(void) {
    toggleIconByShell();

    system("pause");
    return 0;
}

2021/06/25 更新

在已經知道訣竅的情況下,抓取訊息就變得很簡單,但當初怎樣找到標的物和要送的訊息,我想這才是最困難的部份吧。

2021年6月15日 星期二

Kindle, HyRead, Readmoo on Hisense A5

早上很早就起來了,因為肩傷的關係好久沒用 A5 了,乾脆來比較一下這三家書商的 App 看同一本書的效果好了?除了 Kindle 沒有這本書以外,其他兩家都是在該書城買的,由於都算是正版的書,正好可以來做一些比較,這邊我只比較自訂字型,文字對齊以及翻頁速度。

我選擇的書是《64》。

自訂字型

Kindle App - X 
HyRead App - X
Readmoo App - X

文字對齊

Kindle App - △
HyRead App - O
Readmoo App - X

翻頁速度

Kindle App - O
HyRead App - X
Readmoo App - O


Kindle App 沒有文字對齊的功能,但它有一個設計是在尾巴會多留一列,如果有多餘的標點符號(最多一個)便會塞在這一列中讓整個畫面看起來有對齊的效果(橫式書籍則是多一欄)。

Readmoo App 的翻頁速度會跟硬體處理速度有關,CPU 越好的機器,翻頁速度則是越快;另外這一本書的設計只有一個章節,故 Readmoo App 可以避開換章節時解密速度過慢的問題,甚至會有錯覺這本書的翻頁速度比 Kindle App 還快?

HyRead App 的翻頁速度平常應該跟 Readmoo App 差不多,但這本書不知道是不是沒有分章節的緣故,故 HyRead App 遇到這本書的速度就比平均值更差。

綜合來看,至少以我所在意的點來看,第一名還是不意外的被 Kindle App 拿下,台灣廠商真的是要多加油了。

2021年6月9日 星期三

肩傷果然會反反覆覆的發作

今天是受傷第 59 天,前天則是第 57 天。

前天為了避免佔用公司 VPN 資源一整天開發程式及做測試,所以決定那天進公司上班,由於整間辦公室內外加起來只有兩個人,再加上我要改的東西我老早就想做了,故當天開發效率特別的好,扣除上網休息時間,我至少就寫了超過 6.5 小時的程式,雖然我也是設定了 30 分鐘的計時器,但你知道的,當人一進入心流狀態,時間根本處於暫停狀態,偶爾超過一個小時都沒有起來,我想也是很合理的XD

在辦公室還不覺得什麼,回到家吃完晚飯果然全身酸痛,尤其肩頸真是特別的不舒服!

看來除了時常提醒自己要放慢速度及時常起身外,目前暫時沒有什麼好辦法解決肩頸狀態,我總不能對自己唸回復咒文吧XD

雖然肩傷到現在都還沒有好,但我好像已經漸漸習慣了,反正就是等吧,時間會幫忙解決一切問題。

那天進公司除了開發程式外,還為了將我之前借給同學的電力線網路設備拿回家,這樣家裡筆電的無線網路才不會一直斷線,在本機斷線還沒關係,如果是在連 VPN 的狀態下斷線,聽我同事說,會因為憑證未被釋放而導致一個小時內無法重新連線!這樣不但自己工作不方便,還要麻煩 IT 人員,我總不能為了這個又去買一台新筆電吧?最近花錢真的如流水XD

回想了一下,在上星期三書桌送來前,在飯桌上工作似乎網路都很正常?差別在我是拉一條實體網路線工作,也許是因為我的筆電已經使用了快八年,無線網卡在抗議要退休了!

前天拿電力線網路設備回來後,一直到剛剛,目前網路運作一切正常。

親愛的筆電再多陪我幾年吧,雖然是八年前的電腦,寫起 Code 來還是嚇嚇叫呀XD

目前新桌面的樣子。


可惜房間插座跨了不同的電源迴路,但這個速度還是很好用呀!


目前時間下午一點多了,再休息一下下,就要來開工了,感謝我的公司,WFH 環境 Ready!

Replace string in Windows batch

剛剛想要將我的測試程式一條龍自動化,故我需要一個方法把 Windows batch 裡面的某個路徑動態改變成我要的路徑,就只差這一步以後我新增 API 都可以很方便的測試了!

Google 了一下,原來也算是很簡單的一件事,連回公司電腦測試也都沒有問題,看來我這個專案以後開發會更輕鬆了。

set mystring=abc def
set newstring=%mystring:abc=def%
echo %newstring%

執行結果:
def def

2021年6月7日 星期一

R 家 To K 家 待辦事項

自從 5/18 脫離 R 家後,目前都只在 Kobo、HyRead 和 Google 買書,其中為了配合即將到來的 Kobo Elipsa,沒有意外應該都會在 Kobo 買書,本想也給 HyRead 一些機會,沒想到我的小口袋用  R500 翻頁器看他家自己的電子書沒幾分鐘就會失敗無法翻頁,但同時將 R500 拿去手機使用卻是一切正常;另外,HyRead 的設計看起來跟 Kindle 一樣,出版社有指定字型且閱讀器裡面有該字型便會忽略使用者自行設定的字型,這個設定坦白說很蠢,大大影響了我購買書籍的意願,還有就是閱讀設定的左右對齊不會自動記住,每次進來都要再設定一次,這也讓我很不能接受!但 HyRead 也不是一無是處,至少我目前就發現了 2 個優點:

01. 紅利點數用完不夠扣可以合併別的扣款方式結帳,這點讀墨一直都不想做。
02. 雖然機器是大陸代工,但我目前抓的的封包都是 Google 相關的。

故小口袋暫時會被我定位在上網專用機,我當初購買的用途也是為了上網。

將之前為了 R 家寫的函數 export 出來並加入到 FixKoboXML 這個專案,我現在也可以將書轉到 PW3 閱讀了,雖然為了我的肩膀,我應該會越來越少用 PW3 這台機器。

目前步驟如下:

01. 從 Kobo 網站下載檔案連結。
02. 使用 XXX 軟體下載檔案。
03. 使用 XXX 軟體 XXX 檔案。
04. 使用 FixKoboXML 加上 XML 檔頭。
05. Remove font-family CSS。
06. 使用 kindlegen 轉成 MOBI 檔案。
07. 上傳 Google Drive。
08. 寄信到 Amazon。


除了 1 ~ 3,4 ~ 8 都已完成一條龍自動化,跟之前 R 家比起來,步驟稍多了一些,當然可以使用 Kobo Desktop App 來做一些簡化,但最近還是希望讓肩膀多多休息,之後再視心情來補強吧XD

2021/06/09 更新

昨天在討論區看到有網友分享小口袋有更新系統,其中就有修復有關藍牙的問題,可惜的是,我的藍牙還是有狀況,後續再看是否有更新吧?

2021/06/11 更新

在討論區又翻了一下文章,似乎沒有人反映新版本藍牙問題,應該說原本舊版本就沒有人反映問題,難道這次買的人比我想像的還少?

想了一下,決定先試試移除再新增我的 R500 翻頁器,目前測試的結果一切恢復正常,也連續看了 15 分鐘的書,看來此次更新(R06N-V1.0.0-2021060711)是有用的。

2021/07/15 更新

昨天晚上終於一口氣把 obok 加入到我的 FixKoboXML 專案中,我現在需要的步驟終於跟之前的 R 家一樣了,真是可喜可賀呀!

今天中午趁著吃飽飯的空檔,也加上了批次下載的功能,現在跳來 K 家對我來說已經不會比 R 家麻煩了XD

會寫程式真的很舒服,要怎樣整合都能隨心所欲,總計使用 Windows Batch、Node.js、改了一下 Python,另外,配合obok all 參數的運用,還寫了一個 script 把書名轉到清單給我的 BatchEPUB.js  批次上傳用。


2021/08/03 更新

晚上打完下班卡後,馬上快速的替 CSS filter 加上去除 font 指定字型的功能,經實測還可以,希望可以一勞永逸的解決 Kindle 指定中文字型的問題。

雖然我這個更動,R 家模組也能受益,但應該不太有機會試了XD