刀劍神域記憶重組 公告變更記錄產生器

之前有說過了,Heresy 為了自己在玩的手機遊戲《刀劍神域-記憶重組》另外弄了一個部落格來做紀錄(網址)。

而實際上,之前由於覺得遊戲內的公告由於不是照著更新時間排序、要找到哪個公告是新的實在很麻煩,所以就火大,自己試著想辦法去做公告的變更紀錄了。

搞了老半天,弄出了一個使用了兩個 Git repository 的奇怪架構系統,算是勉強做到堪用的程度了~

目前的成品是:https://kheresy.github.io/SAOMD-AA/changelog.html
而實際在運作的專案則是 https://gitlab.com/kheresy/saomd-announcement

閱讀更多»

更多元的函式回傳型別:optional 與 outcome

一般當在設計函式介面的時候,都會直接把結果回傳出來;比如說:

int compute(const int input)
{
  return 100 / input;
}

這樣的設計非常直覺,但是像以上面的例子來說,如果 input 是 0 的時候,這個函式就會產生例外狀況(exception)了。

而如果我們想要用 exception 以外的形式,來處理這類的錯誤的話,通常就需要修改函式的介面,讓他可以回傳執行的狀況。

閱讀更多»

儲存 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 的函式之前,就先粗出了其他的內容所造成的。

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

閱讀更多»

Visual Studio + Qt SDK 的 Dockerfile

這篇是延續《Windows 的 Qt SDK Dockerfile [202002]》,來記錄一下到底要怎樣建置出一個可以拿來建置 Visual Studio + Qt VS Tools 專案的 Docker 容器。

Visual Studio 的 Docker 處理方法,基本上是延續之前《Visual C++ 2017 的 Docker 建置環境》、只做版本的更新。

以要安裝 Visual Studio 2019 Build Tools 的話,主要就是要在: Dockerfile 中加入:

閱讀更多»

Windows 的 Qt SDK Dockerfile [202002]

Heresy 從去年年初開始玩 Gitlab CI/CD 一段時間後,就開始試著把建置環境移動到 Docker(官網)上。在 Linux 上的問題不算大,但是在 Windows 上卻常常碰到一些問題(參考一參考二);前一陣子,甚至因為微軟自己的安全性更新,搞到整個不能用(參考)…

雖然說零零星星有些問題,但是大致上都還是可以使用的;在可以正常運作的情況下,感覺也算是相當地方便~

不過,對 Heresy 來說,這部分還有一個很大的問題,就是 Qt SDK(官網)。

閱讀更多»

NVIDIA Variable Rate Shading

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

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

下面就是他的基本流程:

閱讀更多»

C++20 concepts:定義的方式(part 2)

在前一篇《template 型別的需求描述:C++20 concepts(part 1)》,基本上算是簡單介紹了一下 Heresy 知道的 C++20 concepts 的使用概念。

而怎麼制定自己需求的 concept 呢?這邊來稍微整理一下。

首先,C++20 有提供 <concepts> 這個函式庫(參考),提供一些常見的概念,可以來直接使用。而實際上,裡面有很多是使用 C++11 的 <type_traits>(參考)的功能來做的;如果要自行定義 concept 的話,<concepts> 和 <type_traits> 應該都是有幫助的。

Concept 的語法基本上如下:

template<template_parameter_list>
concept concept_name = constraint_expression;

閱讀更多»