儲存 C++ 的類別資料:Boost Serialization(part 2)

前一篇 part 1 大致上把 Boost serialization 的基本使用整理了一下。接下來這篇,就繼續整理一下其他的東西吧~


將 serialize() 改成 private

首先,在之前提到的例子裡面,如果是選擇在類別中定義成員函式 serialize() 的時候, 是直接把它定義成 public 的。

但是考慮到這個函式的特殊性,或許他並不適合做為一個外部可以直接呼叫的 public 函式。

所以這邊比較好的做法,應該是將它改為 private、並透過設定 friend class、來讓它可以被 Boost serialization 提供的 archive 呼叫,理論上會比較安全。

閱讀更多»

儲存 C++ 的類別資料:Boost Serialization(part 1)

「Serialization」(序列化、維基百科)在程式語言裡面,基本上是一種用來把資料結構或是物件的狀態,轉換成可儲存、可交換的格式的一種方法。
透過這樣的功能,可以把物件的狀態儲存下、之後再還原回來。

XML、JSON 這類的格式,實際上都可以算是序列化資料格式的一種。

而在 C++ 的標準函式庫中,並沒有提供相關的功能,所以這邊 Heresy 是找 Boost C++ Libraries 的 Boost.Serialization 來用了。

他的官方文件是:https://www.boost.org/libs/serialization/doc/index.html

閱讀更多»

PHP 奇怪的 session_start 失敗問題:UTF-8 BOM

最近在弄新的系統的時候,同事在 Windows 上寫的 PHP 程式在要搬到 PHP Apache Docker 的時候,出現了一個奇怪的問題;那就是它會出現下面的錯誤:

Warning: session_start(): Cannot start session when headers already sent in 
XXX.php on line X

這個錯誤還算滿明確的,基本上就是在呼叫 session_start() 這個 PHP 的函式之前,就先粗出了其他的內容所造成的。

但是仔細檢查過檔案後,卻發現其實根本沒有輸出任何東西啊?

閱讀更多»

NVIDIA Variable Rate Shading

「Variable Rate Shading」(VRS)這項技術(官網),是 NVIDIA 在推出 Turing GPU 架構時(2018 的事了),針對 VR 的需求推出的一項新功能。

這項技術的基本概念,主要就是透過局部性地降低 rasterization 階段的解析度,來減少 Pixel Shader(Fragment Shader)的計算量,藉此達到加速的目的。

下面就是他的基本流程:

閱讀更多»

Qt 安裝腳本更新

之前有寫了一篇《在 Windows 命令提示字元安裝 Qt SDK》,大概紀錄了一下,在沒有圖形介面的環境下,使用腳本來安裝 Qt SDK 的方法。

腳本在當時是沒問題的,但是沒想到前幾天要用的時候,卻發現又無法使用了…

網路上找了一下資料,發現似乎是在過沒幾天、Qt 把安裝程式更新到 3.1.x 後,又改了一些東西造成的。(拜託顧一下相容性啊…)

找到的資料是 StackOverflow 上的《Bypassing “User Data Collection" screen》這個回應。根據他的說法,這次改版主要是加入了「User Data Collection」的畫面,另外在選擇元件的部分也多了分類的選擇。

也因此,腳本要針對這兩個變化,做出修改:

閱讀更多»

在 Windows 命令提示字元安裝 Qt SDK

這篇算是《GitLab CI + Windows Docker 的一些紀錄》的延伸。由於 Heresy 這邊的開發專案有用到 Qt SDK(官網),所以在建置用的 Docker 容器裡面,也需要安裝 Qt 的 SDK。

但是由於 Qt 現在的線上安裝程式也都是以圖形介面為主,並在圖形介面中選擇要安裝那些套件;所以要怎麼在沒有圖形介面的 Docker 內安裝,就需要稍微研究一下了。

在找了一些資料後,可以知道 Qt 的安裝程式框架(Qt Installer Framework、QTIFW、官方文件)是有支援使用腳本(script)來做控制的!(官方文件

而在網路上,也可以找到使用這樣的機制,來自動安裝  Qt 的腳本範例。Heresy 這邊是參考《How can I install Qt 5.2.1 from the command line in Cygwin?》的例子。

閱讀更多»

Boost ASIO WebSocket Server 網站憑證設定

Heresy 這邊很早之前,就有開始使用 WebSocket++ 來開發自己的 WebSocket Server;而後來其實也有改用 Boost.Beast 來做同樣的工作。而這兩套函式庫的底層,其實都是 Boost::asio(官網),所以其實在某些地方還滿接近的。

而之前用起來都還算很正常,不管是老老的 IE 還是 Chrome 都可以使用,在有申請 SSL 憑證的情況下,就算建立加密的 WSS 也是可以正確使用的。

但是,前陣子當想使用 node.js(官網)來進行 WebSocket 的連線的時候,卻發現會出現「unable to verify the first certificate」的錯誤。

閱讀更多»

enum class 的 bitwise operation

這篇算是之前《使用 enum class 取代傳統的 enum》的後續。

當時介紹的 enum class 基本上是 C++11 引入、強化列舉型別的型別強度的設計;透過這樣的設計,可以避免一些程式設計上可能會碰到的問題。

但是,當 Heresy 後來實際要使用的時候,才發現 enum class 在某些方面上,似乎還有一些地方沒辦法和 enum 一樣地使用。

其中一個比較大的困擾,就是 enum class 沒有預設提供 bitwise operation,所以沒辦法直接把 enum class 當成 bitmask 來用。

閱讀更多»

C++11 的錯誤碼標準 part 3:補充與實作

針對 C++11 提供的 <system_error> 這個函式庫,Heresy 之前已經在 part 1 寫了 error_code 的基本使用,也在 part 2 寫了 error_condition 的東西。而在 part 2 的時候也有提到,由於 Heresy 在寫 part 1 的時候,其實對於 std::error_codestd::error_condtion 的關係有點誤解,導致有一些東西沒講到,所以這邊就先回到 std::error_code 的部分,做一些補充。

首先,之前在實作 error_code 的時候,總共實作了:

  • enum class ErrorCode
  • class ErrorCategory
    • message()
    • name()
  • make_error_code()
  • is_error_code_enum<Heresy::ErrorCode>

閱讀更多»