pretty code

2023年7月25日 星期二

常用 GCP VM 價錢

有時候為了測個東西,直接開個 VM 是比較省事的作法,底下是我常用的 Windows VM 價錢,一個小時不到 NT $15,確實方便。

2023年7月24日 星期一

Sweet Home

現在住的地方是爸媽以前住的房子,前幾年結婚父母搬到新家時其實還有很多東西沒整理帶走,因為是住了快 20 年的房子再加上老人家捨不得丟東西,故整個家除了書房以外,其實很多地方我都不喜歡,奈何人窮買不起自己的房子,只好開始努力讓家變得更好XD

首先花了 6,000 請清潔公司把一堆不要的東西搬走,雖然一車的價錢有點小貴,但不用自己分類無價,這次丟的東西連半車都裝不滿,著實有點小虧,但整體來說還是值得,至於還有很多東西坦白說我也不太敢丟就是了XD

然後是買了一袋的 75L 新北市環保垃圾袋,一些棉被甚至是拆下來的窗簾直接往垃圾袋丟即可,整理起來輕鬆寫易,理論上棉被枕頭不需要垃圾袋直接交給垃圾車的清潔隊員即可,但懶得自己丟又不想造成社區清潔人員的困擾,還是自己裝袋比較方便。

再來是把漏水的主臥浴室面盆換掉,因為只有拿來洗手故一直懶得處理它,新的面盆下面有浴櫃跟腳,感覺安全多了,可惜的是之前忘記先量好尺寸,故裝了一個過大的面盆(60 cm),下次要記得先決定尺寸而不是依照水電人員建議,還有 ToTo 的面盆跟水龍頭是分開的產品,如果都要使用 ToTo 還是要記得跟水電人員說,整體來說,單以牌價報價來看水電人員只收一點安裝費還是很划算,不過以我另一間使用 ToTo 全套的經驗,ToTo 其實也沒有傳說中的好用,不管是面盆還是馬桶,表面還是很容易髒也不太好清潔,但我除了建商附的之外也沒用過其他牌子就是。

接著是把故障很久的三角窗隆美窗簾組換掉,還好之前買了一組美達寶的震動電鑽(SB 18)跟無刷衝擊起子(SSD 18LT 200BL),拆卸起來確實方便,拆完之後,也換上了從 IKEA 買的窗簾稈組,以後早上不再會被太陽曬醒了,另外,窗簾布大部份應該都要訂作才能符合想要的尺寸,這次偷懶直接使用直轉橫的窗廉,感覺也沒有太大問題,但是要用夾式的頭就是了(IKEA 有賣,比傳統勾子好用多了),浪費了原本直式窗簾布的洞。

最後則是幫老婆組了一個櫃子,方便放她新買的尬車安全帽,有了美達寶的工具組起來一點問題都沒有,但還是不小心錯了兩個地方,這兩個地方我覺得都可以透過改進說明書好讓消費者不會出錯,價值 3,000 的小床頭櫃真正設計有問題的地方只有抽屜的螺絲,尺寸剛好根本無法牢牢固定,害我只好再衝去特力屋購買螺絲跟螺帽。再給我組裝一次的話,我一定會反覆比對說明書並且思考一下這樣組到底有沒有問題,也可以避免再出錯在說明書不清楚的地方。

12 號的零件,洞是在外側。

右邊紅處的地方是朝著抽屜打開的方向。

2023年7月20日 星期四

vcpkg + cmake + x64-windows-static

vcpkg + cmake 的方式在 build VC 專案時,預設是動態連結,而 vcpkg 的機制也很貼心的會將相關 DLL 複製一份到你的輸出資料夾中。

但如果我們想要靜態編譯又該如何做呢?

以下是使用 PCL example 裡面的 qt_visualizer 為例說明:

注意:不是每個函式庫都能靜態編譯,像 qt5-webengine 就不支援

01. 先安裝 x64-windows-static 相關函式庫,C 槽至少要有 300 GB 空間比較保險。

vcpkg install pcl[core, qt, vtk]:x64-windows-static

中間有遇到某些函式庫會安裝失敗,但去 buildtrees 下的 log 又看不出所以然,我的解決方式是單獨編譯就會成功,但如果是有相關性的不能這樣單獨編譯,否則可能會失敗,但這可能又跟電腦環境有關,故只能 by case 解決。

02. 在 CMakeLists.txt 加上相關指令。

project(pcl_visualizer)
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) 

上面這個是讓 VS 專案使用靜態編譯,雖然 CMake 有另一個 MSVC_RUNTIME_LIBRARY 可以設定 property,但據我測試的結果無法成功。

add_executable(${PROJECT_NAME} ${project_SOURCES})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES} ${QTX}::Widgets)
target_link_libraries(XYZ C:/src/vcpkg/installed/x64-windows-static/lib/pcl_io_ply.lib) 

如果有遇到 pcl visualizer parse 相關的 link 錯誤,可以加上上面指令,根據這篇文章說法,可能跟編譯 pcl 順序有關?

03. 產生 VS 專案檔。

cmake . -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static

04. 編譯程式

msbuild pcl_visualizer.sln /p:Configuration=Release

我有試過將 A 台電腦(Windows 10 Pro)編譯出來的執行檔 pcl_visualizer.exe 拿到另一台電腦執行(Windows 10 Pro),確實是靜態編譯無誤。

但如果是用 GCP 新開一台 VM(Windows Server 2022 + Desktop Experiences),則會有找不到 opengl32sw.dll 的問題,但程式是可以執行起來無誤,只是相關 UI 元件無法渲染,故只有一個灰底的執行畫面以及 CMD 畫面。

QWindowsEGLStaticContext::create: Failed to load and resolve libEGL functions
Failed to load opengl32sw.dll (The specified module could not be found.)
Failed to load and resolve WGL/OpenGL functions 

如果我將 Windows 10 的 opengl32sw.dll 複製到 VM 中,則是會產生 init GLEW 失敗的相關訊息(GLEW could not be initialized: Missing GL version),我個人猜測跟顯卡驅動程式有關?又或許是 Windows Server 無法使用之類的?

另外拿一台新電腦重灌 Windows 10 並更新顯卡驅動程式後,這次就可以順利執行成功。

以上就是相關的注意事項,如果本身就是使用 C/C++ 的開發者,我想有關編譯的問題應該也難不倒這些高手XD 

2023年7月19日 星期三

筆電購買全紀錄

2005/03/xx  IBM R51
2014/04/09  Toshiba Portege R30-A
2023/07/14  Dell inspiron 16 plus 7630

前兩台筆電都用了 9 年以上,我果真是勤儉持家呀XD



2023年7月18日 星期二

vcpkg + CMake 快速入門指南

呆過公司的開發環境一向以 Windows 居多,遇到 C/C++ 的專案確實沒有那麼方便,雖然我們可以針對相依函式庫一個一個各別編譯,但要看的文件及耗費的心力還真不少,故在 Windows 下我強烈推薦使用 vcpkg,它可以幫忙解決很多相依性問題,底下就是一些快速入門的訣竅,記錄一下,避免忘記。

建議

C 槽空間至少要有 1 TB,我之前編譯完 llvm + halide,Windows 11 的 C 槽就用了 500 多 GB。

另一個 Windows 10 系統,編譯 pcl(vcpkg install pcl[core,qt,vtk]:x64-windows-static)就花了 200 GB 並且因為 C 槽空間不足,最後還差 10 來個函式庫還未編譯完畢(已用空間包含先前編譯過的 x64-windows 版本了)。 

vcpkg 相關

安裝函式庫的指令,xxx 表示函式庫名稱,yyy、zzz 則是表示相關的函式庫,後面分別是指定編譯版本以及是否要靜態編譯。

vcpkg install xxx[yyy, zzz]:x64-windows (x64-windows-static)

vcpkg 安裝完會有提醒事項,如果是使用 CMake 來規劃專案,就需要把 find_package 相關的提示記起來,一般來說函式庫定義名稱會等於安裝時的 xxx,只是改成大寫。


vcpkg integrate install 則是讓 vcpkg 跟 Visual Studio 做連結,使用 cmake 時只要簡單指定 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake 就可以找到相關函式庫的路徑。

如果函式庫有相關,最好是要一起編譯,不然先後順序不對可能就要重新編譯,以我最近遇到的 hailde 及 llvm 來說,如果沒有先編譯 halide,llvm 就有可能要重新編譯,以我最新的筆電 i7-13700H 來說,光 llvm 就要編譯 13 個小時以上。

如果之前安裝完函式庫未記住 CMake targets,可以去 C:\src\vcpkg\installed\x64-windows\share\xxx 資料夾,檢查是否有相關的 .cmake 檔案可以參考,一般來說檔名可能會是這種形式 <PackageName>Config.cmake,詳情可以參考這裡

cmake 相關

cmake 是透過 CMakeLists.txt 來建構專案,如果函式庫是用 vcpkg 安裝的方式,則我們的 CMakeLists.txt 可以很簡單來寫。

以此專案為例,原本作者應該是沒有使用 vcpkg,故 CMakeListx.txt 寫的就比較囉嗦。

在有 vcpkg 下,我們應該只需要 find_package 及 include_directories 即可(碰到的專案還不夠多,待驗證?),剛好這個專案有例外,故我們需要另外指定 VTK include 路徑。

cmake_minimum_required(VERSION 3.19)

project(3DReconstruct)

find_package(OpenCV CONFIG REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(PCL CONFIG REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})

# fix pcl include <pcl/visualization/cloud_viewer.h> issue
# this error is due to the unadaptable including format between PCL and vcpkg.
# so we must use absolute path, this solution depends on your installation version of VTK.
# see https://github.com/microsoft/vcpkg/issues/24439
include_directories(C:/src/vcpkg/installed/x64-windows/include/vtk-9.0)

# build executable
add_executable(Phase_Shift main.cpp CalPhase.h CameraCalib.h)
add_library(Camera_Calib_LIB CameraCalib.cpp CameraCalib.h)
add_library(CalPhase_LIB CalPhase.cpp CalPhase.h)
add_library(ProPoint_LIB Propointcloud.cpp Propointcloud.h)

target_link_libraries(Phase_Shift ${OpenCV_LIBS} ${PCL_LIBRARIES})
target_link_libraries(Phase_Shift Camera_Calib_LIB)
target_link_libraries(Phase_Shift CalPhase_LIB)
target_link_libraries(Phase_Shift ProPoint_LIB)

Lenovo KU-1255 Fn 設定

很多鍵盤在 F1 ~ F12 都預設了一些快速鍵功能,可以快速的調整音量或叫出小算盤等等。

最近換了新筆電,我原本用的小紅點鍵盤 Lenovo KU-1255 的快速鍵變成不需要另外按下 Fn 鍵即可使用,這會造成我寫程式的不方便。

查了一下,原來是使用 Fn + ESC 來調整是否要使用 Fn 鍵來啟用快速鍵功能,記錄一下。

2023年7月10日 星期一

OpenCV C++ 初探

為了確認到底是 Python code 還有優化空間還是單純的 Python 和 C++ 版本差異?

今天將手邊一個 OpenCV 測試程式從 Python 版改成 C++ 版,由於是第一次嘗試使用 C++ OpenCV,記錄一下撞牆的心得XD


01. Mat 運算如果值不如預期,看是否要將 data type 從 float 改成 double。

02. cv::SVD::compute(A, w, u, vt, cv::SVD::FULL_UV),如果答案與 Python 版本不一樣,試著指定 flag。

03. Mat.reshape(cn, newdimension) 的意思如下:
cn 表示 channel,0 就表示不變。
newdimension 表示新的 row。

(1, 9) -> (3, 3) 
Mat.reshape(0, 3) or Mat.reshape(1, 3)

04. Mat 計算很容易觸發 exception,故程式會不正常結束,可以考慮加上 try catch 捕捉錯誤。

try {

} catch ( cv::Exception &e) {
      const char *msg = e.what( );
      std::cout << "exception caught: " << msg << std::endl;
}

2023年7月5日 星期三

我的 github 星星

show your github stars


我 github 上的星星主要來自 3 個 Kobo 相關專案:KoboPageTurner、kobofileserver、kobo-libra2-uhid-module。

KoboPageTurner 主要是讓早期的閱讀器可以使用 Wi-Fi 來翻頁,至於較新的閱讀器從 Elipsa 開始都已經內建藍牙了,故這個專案目前最主要的功用應該是讓第三方軟體如 KOReader 或是 Plato 使用它來翻頁(Kobo 系統與藍牙綁的很死,故目前第三方軟體啟動時藍牙會被 killed),但是一些非旗艦機種,例如 Libra2、Clare 2E,Kobo 把一些東西都關掉了,這會導致一些藍牙翻頁器無法使用,這時就必須配合我的 kobo-libra2-uhid-module 來解除封印。

kobofileserver 則是類似 Android 上的 Wi-Fi 傳檔,透過它可以輕易的把書送到閱讀器上,這個也是我目前最滿意的專案,我一個月至少會用一次把我的信用卡帳單傳到 Elipsa 上好方便我勾稽對帳;另外就是把我之前在讀墨買的書傳到 Kobo 閱讀器上閱讀,尤其現在中亞關了,我在上面好幾百本的中文書都沒辦法再透過 PW3 閱讀了(2024/06/30 以前都還可以下載,但機器總有一天會壞)。

kobo-libra2-uhid-module 則是要來解決 Kobo 非旗艦機種不能使用藍牙翻頁器的問題,因為閱讀器 kernel 把一些支援關掉了,透過這個動態載入模組的方式,讓 Libra2 或是 Clare 2E 也可以使用翻頁器,像我的 Logitech R500 就要透過這個專案才能順利使用。

難怪之前樂天的人會透過 gmail 找我面試,雖然我看到這封信已經是好幾個月後的事了XD

2023年7月2日 星期日

Linux shell script 對換行字元真的很敏感

終於還是讓我新買的 Kobo Clare 2E 可以爽爽的用 Logitehch R500 翻頁器了!

原本以為是不是 github 某網友參考我 Kobo Libra 2 build 出來的 uhid.ko 有問題,今天居然福至心靈發現,原來是我的 run.sh 不是拿我之前為 Libra 2 寫好的檔案,而是直接使用文字編輯器複製貼上指令的緣故,由於我的工作環境是 Windows 作業系統,故換行字元會比 Linux 多了一個 \r。

shell script 遇到這個 Windows 獨有的換行字元會不開心,導致 insmod 的指令沒有執行,在手動砍掉句尾 \r 後,Logitech R500 也順利的在 Kobo Clare 2E 上使用。

不只如此,我的 KoboPageTurner Wi-Fi 翻頁器以及 kobofileserver 專案也是可以順利的執行,這下就只差開發 Kobo EInkBro 了?

天籟之聲 - 郭靜

應該是去年聖誕節前幾天吧?

YouTube 突然跳出郭靜在去年的線上音樂會影片,一聽之下才發現郭靜好聽的歌還真不是普通的多!

自從很多年前出社會後就很少聽歌了,近 10 年的休閒活動也都是以閱讀為主,大概只有這幾年比較會聽歌,故對郭靜的印象還是停留在《下一個天亮》、《在樹上唱歌》以及《心牆》這幾首歌,連我這個很少看電視的人都知道這三首歌,可見當年的郭靜確實很紅!

查了一下才發現我們居然就讀同一所高中,再加上我個人喜歡帶有一點悲傷感的歌,正所謂人不親土親(我絕不會說是妹子可愛XD),故藉此機會更新了一下 KKBOX 的收藏歌單。

其實郭靜不只情歌好聽,一些輕快的歌聽了也是讓人心情愉快,這對最近的我真的很重要,我都快被數學搞到懷疑人生了!

不過我發現我喜歡的都是冷門歌曲,包括《夢在遠方》、《在曾有你的地方》、《回憶的閣樓》、《逆行的減法》。

還記得今年過年前老婆補上班日那天,我一個人在家大掃除時就連續聽了一整天《逆行的減法》,這首歌不算悲傷也不算輕快,但似乎還挺帶勁,讓人大掃除一整天也不會累,唯一的吐槽點就是封面照片也太像鮪魚了吧,害我聽到這首歌都先想到鮪魚XD

天真的我還以為這些歌夠冷門了,沒想到隨著把 YouTube 搜尋郭靜的影片看了一輪,才發現還有更冷門的歌,比如像是《隕落》、《月亮會記得》、《慶幸遇見你》、《像我這樣》、《不想有遺憾》、《手心》、《相思弦》、《拜你所傷》、《我想要有人為我傷心》、《簡單》、《明白》等,除了一些歌是郭靜在福茂的專輯外,大部份的歌都是這兩三年唱的 OST,還好只有少數幾首 KKBOX 沒有收錄,害我只能在 YouTube Music 上聆聽。

雖然這裡列出來的歌是我比較喜歡的,但其他演唱會一定會唱的歌其實也沒差這些冷門歌多少,硬要我找出一首最喜歡的歌,可能還比解數學難?


雖然說幾乎每首歌都好聽,但這半年大部份只聽郭靜的歌的我還是發現了一些小差異,早期的歌歌聲中還帶有一點稚氣,比較像小孩子?明顯跟後期的聲音有點不同,後期的歌聲要形容的話似乎聽起來比較有感情?咬字比較清楚,感覺聲音比較紮實?但這一兩年替 OST 唱的歌似乎又多了一些假音,印象之前搜尋郭靜時,似乎有看到聲音有稍出狀況的新聞,不知道是否是這個緣故?

其實郭靜不只歌聲好聽,有些照片看起來還蠻可愛的,挑了一張吃飽發呆的萌圖當手機桌面,數學看到煩時就會看個幾眼,感覺心情都好多了!


前一陣子回父母家吃飯時,《綜藝玩很大》剛好都重播郭靜固定班底的集數,於是老婆大人就陪我回頭去追星了,不得不說,郭靜當個綜藝人也蠻不錯的,尤其前面某集郭靜在猜頭上的牌子是什麼的時候,一些表情真的是很好笑,晚上吹頭髮 YouTube 沒有好看的影片時,我就會再看一遍XD

不知道為什麼又失眠了,剛好今天是郭靜《喵喵咪呀演唱會》加場開賣的日子,難得老婆大人點頭同意讓我參加演唱會,剛好趁此機會解鎖人生第一場聽演唱會成就,希望早上能搶到我喜歡的位置。

2023/08/18 更新

上全球最大男性交友網站發完 issue 後,把官方粉絲團提供的 DIY 票卡夾做好留個紀念,雖然老人怕麻煩都用電子票券就是了XD


2023/08/19 更新

今天終於參加了可愛的郭靜演唱會,也解鎖了人生中第一次演唱會,我喜歡這樣的演唱會服裝,不用奇裝異服換來換去,可惜的是頭髮不是老人喜歡的黑色XD

雖然早知道喜歡的歌都不會是演唱會的曲目,但一首都沒有還是有點小失望!還好在最後那段聽到一首我會喜歡的歌,感謝粉絲團的 PO 文,原來那首歌是彭佳惠的《大齡女子》,我覺得郭靜唱的比原唱好聽XD (杰老弟呀,該給人家一個交代吧?不過人生就是這樣,我愛的人不愛我…)

新買的望遠鏡果然很適合演唱會用,無奈我前面的先生不是扭來扭去就是一直拿著手機錄影,我右邊右邊的先生看起來是陪著女朋友來,整場腳一直動來動去,還好哥什麼都不擅長,最擅長的就是進入心流,算是沒受到什麼太大影響,幸好有多買了兩個座位隔出防火牆,不然一定會被影響,腳都伸到我多買的座位前方了XD

感性的時間完了,再來是我有興趣的成本會計部分:

一場演唱會算 2,000 人 參加,平均一人門票算 2,000 好了,總共收入是 4,000,000。

樂隊老師總共有 5 人,合唱老師有 2 人,再加上一隻我總覺得是怪獸手錶的玩偶工作人員,還有場地,燈光,佈置,化妝等其他族繁不及備載的工作人員,場地的工作人員我想是包含在場地租金中,全部成本給你算收入一半好了。

為了準備一場演唱會,之前要先彩排,這個星期還要練唱,還要保持最佳狀態,坦白說,我如果是歌手,不是為了歌迷,我還不是很願意花時間開這樣的演唱會!

果然還是要大巨蛋這樣的場地才能賺多一點錢,因為單位成本會遞減,當人數越多後邊際效益應該會越高,當然以上只是局外人的我的想像?

以後沒有買到第一排應該不會想參加了,太多外部因素無法控制,我還是做個浪跡天涯的工程師吧XD

2023/08/22 更新

原來場地租金比我想像中的貴一點(我從收入反推,以為最多五六十萬而已),至少 TICC 是以小時計算,不過我認為價錢應該都可以再協商,這只是公告牌價。難怪不是每個人都能開演唱會,也算是長知識了。


另外還有一種方式是由別的主辦方主導,歌手只是領取固定報酬,不需要管這些細節,賣不賣得好都不影響歌手收入,這也是一種方式。

有些國外樂團的演唱會似乎都沒有特別注重舞台佈置等效果,這樣成本會更低,收入會更多。這種也是我覺得比較好的方式,就算只有 2,000 人的場地,舞台效果等也只有最前面的特區會看到,如果主辦方也沒有適時的將現場投射到大螢幕(這次的主辦單位就做不好,這個場地好像也沒有網路說的那樣好?),其實特區以外的觀眾也感受不到,不如省下那些錢,純粹以歌聲及歌手本身魅力來一決勝負。

我想真正的歌迷才不會介意舞台效果,歌手就算只穿白上衣牛仔褲,我們也是看得很開心。

不過這又回到商業的本質了,來看演唱會的會是誰?那些人想看的是什麼?以賺錢來說,還是要以這些人為主就是了。

感覺結論就是像我這樣的老人不適合演唱會呀XD

最後來算一下為了這個演唱會花了多少錢吧?

座位 2600 x 4
望遠鏡 4680
台大停車 20
週邊商品 2230
DIY 票卡 15
停車 扣掉消費折抵後好像是 80 ?
晚餐 1419

其他
演唱會前幫老婆買了雙鞋子 2746
怕冷買了件外套 1290
逛無印買收納盒及清潔工具還有老婆褲子 2225
剛好看到的熱水瓶 5990
礦泉水 50 (沒帶皮包,老婆出的)
散場後的星巴客 2XX

其他不是必要支出,姑且不論,看一次演唱會真是勞民傷財呀?老婆下次還是不要點頭答應也不要跟好了!接下來的幾星期我要去賣血了…

2023/12/05 更新

前天下午準時上去寬宏搶票,可能是眼睛小的緣故,沒注意到預設是電腦選號,最後只能屈居 2F 中間區第 6 排,只能說怎麼會有這麼爛的設計,如果是手速比不過人我就認了,被系統這樣一搞真的是怒氣滿滿,光一開始加入會員要身分證字號我就覺得莫名奇妙了!希望下次演唱會不要再透過這個爛系統,到現在想到還是很生氣。