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
2026/01/16  Lenovo ThinkPad X13(放在公司開會使用)

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



2026/05/02 更新

年初時參與了新案子,一開始每個星期都要跟客戶開 3 次會,想來想去,還是準備一台筆電比較方便,於是便購買了一台 ThinkPad X13。

另外,為了開啟客戶分享檔案,也順便買了 Office 2024。

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