pretty code

2023年8月31日 星期四

The GUI framework of Go - Wails

太久沒有吸收新知了,Go 除了增加 generics 外,還有一個除了 Fyne 以外的 GUI framework 可以選擇,那就是 Wails!

Wails 是一個以 Go 為後端以及使用 vue 為前端的 GUI framework,除了 Android 不支援外,它支援三大平台,分別是 Windows、Linux 還有 macOS。

在 Windows 上,它需要 WebView2 runtime 來作渲染,故本質上很像個跑在瀏覽器上的 App,如果將其跑在未安裝 WebView2 runtime 的環境,執行時也會貼心的跳出提醒視窗並安裝。

以官方 Hello World 的例子來說,編譯出來的執行檔只有 8.38 MB,執行的速度還算不錯,只有啟動及關閉時會覺得稍有延遲。

這個專案其實已經發展了四年多(2019/4/25 - v.11.2),只是最近才在 PTT 軟體版推文中看到,如果不是太複雜的 App,也許以後可以考慮使用,當然為了方便的話,我用 wxWidgets 還是最快的,也可以跨平台跑在 Linux 上。

2023年8月28日 星期一

I code so I am

折戟沉沙鐵未銷,正所謂爛船也有破釘三斤XD

今年過年後開始,工作型態正式變成研究 CV 課題!

感謝公司及大小老闆們沒有一下就要我們生出東西,取而代之的是讓我們從頭開始學習。

坦白說數學不是我的強項,尤其對我這麼一個 AT 叛客來說,我以前查帳時還是按計算機比較多,根本沒有用到數學,轉換跑道後雖然寫了很多年的程式,也去過兩家上市公司以及錄取國家考試資訊處理職系,不論是工作或生活其實也沒用到什麼數學?

如果說現在沒有工作,我當然是有信心在半年內把需要的數學底子練起來,奈何年紀漸長,雙親年紀漸大,要用錢的地方很多,已經無法像以前一樣想辭職就辭職。

也因為如此,一直覺得進度緩慢,尤其前半年很少寫到程式,更覺得自己好像失去了什麼?

還好有郭靜妹子天籟之聲的陪伴,才讓這個無趣的生活有點笑容…

今早在準備開會報告資料時,無意間讓我發現學習專案作者的 Matlab code 與我移植的 Python code 用的公式居然不同?

數學小白的我居然可以在幾秒之內想到可能的問題,原來是作者有留一手或是無心之失,兩者的投影相位圖是使用不同數學函數!

Python code 和網頁說明是使用 cos 函數,但 Data 給的卻是用 sin 函數,難怪會有所謂的錯位情況?一開始還以為是翻拍的圖導致?

除了手畫 0 ~ 2 pi 的圖來驗證作者思路外,也簡單讀取 0 pi 的圖來畫出波型圖,終於可以證明我的想法無誤!

僅以最後的大衛朗基羅絕對相位正規化灰階圖來為這幾個月的學習留下最好的回憶!


希望有一天也能像尼飛彼多一樣,說出那樣霸氣的一句話:我好像有點強XD

2023年8月26日 星期六

測試一下 Kobo Expense

最近 Chrome Store 似乎又更改政策了,不過似乎跟我的專案沒啥關係?

趁此機會再一次確認 Kobo 網頁是否又亂改版了XD


今年雖然到目前為止的購書金額跟去年差不多,但 7 月的購買金額中,其實有很多本工作相關原文書,故繁體中文書其實並沒有買很多,可見,我真的是被數學搞到人生都走味了?

還好我的 Code 看起來一切正常,這也是寫網頁爬蟲最辛苦的地方,網頁如果改版,就必須要跟著修改,這一點讀墨就做得比較好,購買記錄是以 API 形式回傳,比較不會跟 HTML or CSS 內容有關!

今天是 2023/08/26,我放上 github 的 code 有針對之前改版修改,但我在 Chrome Store 的版本並未更新,反正沒人用我也懶得更新,github 的東西起碼還有五六十顆星星,Chrome Store 的幾個專案明明也有超過 50 個人安裝,但卻連一顆星都沒有,真是沒勁XD

一入江湖無盡期

開了 19 年的車了,每次開車多少還是會犯一些錯,有些會記得下次改進,有些則是過後就忘了,以後還是做個記錄,好時時提醒自己:

01. 狹窄會車處還是要按喇叭!

一直很討厭我家的地下室,當初一定是地主為了停車位的個數以致建商才如此設計,我們整個地下室不論哪一層樓都只有單線道,沒有車的時候倒也相安無事,遇到要會車時一整個阿雜,如果又剛好是上坡的車還要禮讓下坡的車,現在開的車又是類休旅車,實在不太好倒車,雖然有燈號提醒,但據我觀察摩托車似乎根本感應不到,此時按個喇叭比較實在,今天連我一共三台車卡在上樓轉彎處平面,還好另外兩台都還在平面輪不到我這台先上坡的讓,如果我之前先按聲喇叭,應該能適時提醒另外兩台車吧?

02. 遇到騎得慢的摩托車要讓就要讓到底,不能不耐煩。

今天遇到一台騎得很慢的摩托車,只有一線道我又不想跨越雙黃線,跟在他後面跟了快 5 分鐘,好不容易捱到下到平面路線,那台車還是依然顧我,完全不管後面的車,一個人騎在兩線道的接近中線處,慢得我都懷疑他是故意的?後來我實在受不了,以很貼近中間分隔島的方式從他旁邊呼嘯而過。

其實這樣很沒必要,前面都讓那麼久了,不差另外一個 5 分鐘,假設我在通過他時,他一時沒騎好,A 到他倒楣的還是我,何必逞一時之快呢?

03. 台 64 下板橋時,外線車道是不能左轉的,今天遇到一台硬要左轉的車,我前面的車又要閃他,導致我這台車被這兩台車卡在下高架處,後面如果煞不住車,我又是第一個會被波及的。

錯的事就是錯,不該讓他左轉成功,但也沒必要跟他硬卡,不過會這樣無恥左轉的人,我懷疑按喇叭有個屁用,這件事我到現在還沒有好的解決方式,只能先記錄起來,真要說的話,只有我前面那台車按喇叭或是不要讓他才有解決之道?

唉,真的很不喜歡開車,還是早一點讓機器人統治世界好了,至少數位的世界最有規矩XD

2023年8月23日 星期三

vcpkg path too long issue

好不容易完成每日計劃表,正準備開始我的 Kobo EInk-Bro 專案時,就遇到第一個問題。

雖然我需要 cross compiler,但我可以先在 Windows 下測試 ChatGPT 幫我寫好的 Qt 小程式,把大工作切成小工作是一件好習慣。

我在 C:\src\vcpkg 預設目錄下編譯 qt5-webengine 時,會出現以下錯誤:

CMake Warning at ports/qt5-webengine/portfile.cmake:5 (message):
  The qt5-webengine source was will be extracted to
  C:/src/vcpkg/buildtrees/qt5-webengine , which has more then 35 characters
  in length.

就像字面上意義說的,路徑名稱過長,印象中新 Windows 早就沒 255 這個限制了?

時間寶貴,我還在找殺死大衛朗基羅的兇手,懶得看它的 cmake 檔案在抱怨什麼,另外開一個 C:\vcpkg 路徑,重 build 所有函式庫。

由於編譯需要一點時間,等待結束後再來更新是否有解決?

2023/08/24 更新

總共花了 22 個小時編譯,辛苦都是值得的。另外,在回捲查看相關訊息時,似乎看到 qt5-webengine 對硬體有些要求,記錄一下!

Installing 37/37 qt5-webengine:x64-windows...
Building qt5-webengine:x64-windows...
-- qt5-webengine requires a lot of free disk space (>100GB), ram (>8 GB) and time (>2h per configuration) to be successfully build.
-- As such qt5-webengine is currently experimental.
-- If qt5-webengine fails post build validation please try manually reducing VCPKG_MAX_CONCURRENCY and open up an issue if it still cannot build.
-- If it fails due to post validation the successfully installed files can be found in C:/vcpkg/packages/qt5-webengine_x64-windows
-- and just need to be copied into C:/vcpkg/installed/x64-windows
-- Downloading https://sourceforge.net/projects/gnuwin32/files/gperf/3.0.1/gperf-3.0.1-bin.zip/download -> gperf-3.0.1-bin.zip...
-- Downloading https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi -> python-2.7.18.amd64.msi...
-- Found external ninja('1.10.2').
-- Downloading https://download.qt.io/archive/qt/5.15/5.15.10/submodules/qtwebengine-everywhere-opensource-src-5.15.10.tar.xz;https://mirrors.ocf.berkeley.edu/qt/archive/qt/5.15/5.15.10/submodules/qtwebengine-everywhere-opensource-src-5.15.10.tar.xz -> qtwebengine-everywhere-opensource-src-5.15.10.tar.xz...
-- Extracting source C:/vcpkg/downloads/qtwebengine-everywhere-opensource-src-5.15.10.tar.xz

目前雖然可以成功編譯出執行檔,但會抱怨找不到 QtWebEngineProcess.exe,稍微找了一下,位在下列這個路徑 C:\vcpkg\installed\x64-windows\tools\qt5,雖然過了這一關,執行時又會觸發 Exception,看起來跟找不到 locales 語言設定檔有關,快速 Google 一下,Qt5 使用 QtWebEngineProcess.exe 做為 WebView 的橋樑,故佈署時有些眉角要注意,我猜可能跟處理 request 或是跟 UI 渲染有關,一時半刻還沒時間處理,目前先這樣。


關關難過關關過,我對 C++ 函式庫早就免疫了,一次就能成功我才會嚇到XD

QtWebEngineProcess.exe 需要 qtwebengine_locales 這個資料夾並放在程式根目錄的 translations 資料夾裡,另外還需要一個 resources 的資料夾,可能是 vcpkg 沒有幫忙 handle 這塊,故不像 DLL 一樣會複製一份到我的編譯資料夾內,這也簡單,直接在 vcpkg 搜尋並複製到正確的位置即可。

事情還沒結束,好不容易可以執行起來,並沒如我預期的去瀏覽網頁並顯示在 QWebEngineView 元件上,看了一下 console,又有一個錯誤如下:

QOpenGLShader::compile(Fragment): ERROR: 4:1: 'textureSampler' : syntax error syntax error

*** Problematic Fragment shader source code ***
#version 110
#ifdef GL_KHR_blend_equation_advanced
#extension GL_ARB_fragment_coord_conventions : enable
#extension GL_KHR_blend_equation_advanced : enable
#endif
#define lowp
#define mediump
#define highp
#line 1
varying highp vec2 uv;uniform sampler2DRect textureSampler;uniform bool swizzle;uniform highp float opacity;void main() {   highp vec4 tmpFragColor = texture2DRect(textureSampler,uv);   tmpFragColor.a *= opacity;   gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;}
***

這次倒真的是 Qt5 的鍋了,居然會跟 Intel 顯示卡有關,詳此網頁

這個問題已經在去年 09/14 修正,修正的版本是 5.15.11。

查了一下 vcpkg 維護的版本,居然是 5.15.10,有沒有這麼背呀?


再來我需要想想下一步要如何做了?

2023/08/25 更新

昨天下班前查了一下,vcpkg support list 中有 Qt6 版本可以安裝,名稱為 qtwebengine,只要針對這項安裝,其他相依 vcpkg  會幫你搞定,這也是我一直推薦在 Windows 下用 vcpkg 來管理 C++ 函式庫的原因,不用從一堆 README 中找到相關的編譯設定(雖然很多時候還是會有問題,但就只能 by 問題看 log 來解)。

早上滿心期待的要看到安裝成功的畫面,沒想到連一半都沒安裝完畢便又遇到 qtbase 安裝問題,從 log 中看到有此錯誤:

ERROR: C++11 <random> is required and is missing or failed to compile.

稍微 Google 一下,有人說是 Visual Studio 16 2019 generator is not supported.

我的媽呀,那篇文章是 2020 年的,現在都民國哪一年了,居然還有這個問題?

我決定跳去 Linux 作業環境了,不然猴年馬月我才能完成第一步,deadline 剩沒幾天了。

順帶一提,Qt 似乎開始被很多人不爽了,因為下載又需要帳號了,我個人也沒那麼喜歡 Qt,要不是 Kobo 底層使用到它,我也不需要用它來開發程式,偏偏 Kobo EInk-Bro 又需要 GUI,不然我早就爽爽用 Golang 來寫了,老天爺有必要這麼搞我嗎?明明我昨天才買了一包愛心餅乾呀XD 

又要思考下一步了…

2023/09/01 更新

Linux 下安裝也不是很順利,故之前試了一下就沒試了。

雖然原本的目標已經過期,但這種事急不得,有開始並且持續有進度,對白天要上班晚上還有一堆事要忙的我來說,我覺得已經很棒了XD

今天將之前 build 好的程式拿回家裡電腦嘗試,由於筆電是有 NVDIA 顯卡,故確實可以正常執行無誤,只是啟動速度有夠慢。另外,UI 似乎沒有拉好,WebView UI 元件並沒有如我預期的顯示畫面,這部份還要再確認一下。

每日計劃表出爐

暫時先這樣安排好了,試行幾個月後再行調整。


2023/08/25 更新

人生中第一次有正式做計劃是在民國 98 年準備國考的時候,那時會規劃每天該讀哪些科目,還會提醒自己要看美女主播XD

雖然不做公務員很久了,但還蠻懷念那一段唸書的日子,我為我工作的感覺真棒!

計劃確實重要,但也不是一定要照表操課?

所謂的計劃只是先幫你想好一個大框架,讓你知道在什麼時間裡應該要做什麼事,但人生就是會有一連串的變化,不是你想做什麼就能做什麼!

此時,計劃的優點開始浮現,我們可以在這框架下,視情況調整項目,就算真的這一整個星期都沒有時間照表操課?(假設你真的遇到這種情況,表示目前你的生活出了問題,這時應該要先解決那個問題而不是煩惱沒有照計劃進行!)

沒關係,星期日晚上睡一覺起來,我們又會有全新的一週了,耶!

P.S 此心法只適用在有自制力的人?

2023年8月21日 星期一

是誰殺了我的大衛朗基羅

右邊是原作者的點雲,明顯跟我不在同一個檔次XD

原本以為是自己少搬了作者的 Code,上星期五放假時還特地做了 memo 寄信給自己,想說早上提早來辦公室便可以輕鬆搞定XD

沒想到今天一整天除了下午開會報告進度花了兩個小時外,其餘時間都在跟我的大衛朗基羅奮戰,可惜直到下班前都還是一無所獲。

還是學阿甘去跑步好了,看看能不能從中悟道?

奈何身為一個資本主義下的小小工程師,一日不工作無法養活自己,只好爬爬樓梯再回去做柯南吧!

邪惡組織的黑衣壞人,快出來別躲了,我已經看到你了?

你為什麼要殺了我的大衛朗基羅呀XD


2023/08/22 更新

起床後做伏地挺身時想到一些關於大衛朗基羅的解法,條列一下:

01. 作者給的公式是否正確,如何推導?我的想像應該是要把投影機逆投影變成相機,產生四步法的相位圖,配合格雷碼的輸出,產生像是右相機的圖片,但這裡有兩個難點,一是我不知道作者產生相位的公式到底跟它原投影的是否一致?二是格雷碼並沒有覆蓋到整張圖片,我很難推斷出右相機的格雷碼圖形應該要位在相機解析度的哪個區塊?

02. 再比對一次作者給的 Matlab 和 Python code 是否有一致,也許是自己哪裡疏忽少搬了?

03. 老老實實的回去看作者相對相位和絕對相位關於補償的算法,搞不好答案就在這裡?

早上坐公車時一直在思考問題出在哪裡,都沒時間看看窗外妹子XD

雙目相機是否有要求左右相機要一樣?即使相機不一樣,只要得到各自校正好的內參,理論上應該是沒影響才對?至少以我目前幼幼園小班的程度,我是這樣認為的。

註記:一般我們還是會保持左右相機參數儘量一致,對電腦視覺來說,環境光影響成像品質甚巨,為了讓雙目相機拍攝到的景像一致,使用同樣的相機我們比較好讓他們同步工作,這是我目前的理解。

故問題一我根本不用管格雷碼會投射到左相機圖片的哪個區塊,一樣站在投影機的角度思考即可,記得確認一下小氣的作者是否有放原始的 pattern?

2023/08/23 更新

問題應該還是出在數學,因為投影機的 pattern 在不同 y 下都相同,感覺好像抓到什麼?校正後的相機和投影機一定存在某種關係,只是我還不知道罷了。

江湖一點訣,說破不值錢。需要的數學還是從針孔相機模型那來的,詳此處

終於,我也有個帥帥的大衛朗基羅了,雖然我的相位值還是會有缺口,但我覺得應該是作者只給影片翻拍的圖,而不是原始相機的圖片,可能是 distorted image or something,故才有此結果?


2023/08/28 更新

今早突然神來一筆,發現錯位情況來自相位產生公式不同所導致,詳此篇