pretty code

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 那一行,知道有這個情況即可,反正是多按一下就可以解決的事,暫時先這樣處理即可。