pretty code
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;
}
訂閱:
文章 (Atom)






