跳至主要内容

魔力寶貝檔案結構分析

· 閱讀時間約 11 分鐘
Vincent Chi
Software Enineer, Backend

對我個人而言,魔力寶貝是一款意義深遠的 MMORPG。在楓之谷還未進入台灣之前,我有幸在當時國小同班同學的推薦下接觸到了這款遊戲。對於一名小學生而言,那是個相當令人著迷的中世紀奇幻冒險世界,在廣闊的地圖上冒險,甚至在初次進遊戲時就在靈堂迷路了數小時。

然而月費制的遊戲模式也注定了與小學生沒什麼關係,因此從家裡發現我拿著壓歲錢買了樂園之卵的典藏限定包(外加一頓竹筍炒肉絲的粗飽)之後,我就帶著遺憾地離開了那個世界。轉而投向楓之谷的懷抱

直到 2020 年初,當時我正在學習 Rust,而我一直堅定地相信唯有自己做出點東西才叫做學會某項技能;當時的我不自量力地根據散落在各個角落的資料,漸漸拼湊出魔力寶貝檔案結構的具體實作。即便當時以失敗告終,這篇文就再也沒能推出續集,但是這個想法一直在我心中縈繞不止。

今天,我認為是那個好日子。

macOS 環境設定

· 閱讀時間約 2 分鐘
Vincent Chi
Software Enineer, Backend

目前主力工作環境仍是 macOS,用這篇文章記錄一下從購入新機或重置後設定整個 macOS 的流程。

以下軟體與工作流程僅能代表我個人使用習慣,如果你有其它想法請隨意依照你的習慣進行更改。

以 Godot 匯入 RPG Maker MV 加密格式

· 閱讀時間約 6 分鐘
Vincent Chi
Software Enineer, Backend

最近在學習如何使用 Godot,並且想說嘗試著復刻一些曾經玩過的 RPG Maker 製作的遊戲作為練習。

註:在未獲得原始遊戲的版權所有者同意之前,請不要這麼做。

RPG Maker MV 的加密

在 RPG Maker MV 的遊戲發佈時,開發者可以選擇用內建功能加密遊戲素材,以避免遭第三方竊取。

很遺憾地,內建的加密功能其實保護力並不高,有一些現成的工具能夠快速將其解密。

以 devcontainer 設計開發環境

· 閱讀時間約 4 分鐘
Vincent Chi
Software Enineer, Backend

因應近期在開發 Side Project 時與前端工程師有協作上的需求,原本想要沿用 Laravel 環境設定 中提到的 Local 與 Develop 環境,不過喜新厭舊的我在觀望了一陣子的 devcontainer 之後,決定來嘗試一下。

註:devcontainer 在 VSCode 上的支援性較好,在 JetBrains IDEs 上會有一些奇奇怪怪的小問題(但是我個人仍然是偏好使用 Jetbrains IDE,Jetbrains 該給業配了吧

PHP 的過去、現在與未來

· 閱讀時間約 7 分鐘
Vincent Chi
Software Enineer, Backend

這原本是我打算作為 PHP 教學系列的序章,既然該教學已經胎死腹中,不如就移花接木一下把我當年的想法記錄下來。

這個標題中的「過去」、「現在」與「未來」,其實並沒有一個明確的時間點、甚至定義也會隨時間與環境而有所變化。

In Memory SQLite 的備份與還原

· 閱讀時間約 3 分鐘
Vincent Chi
Software Enineer, Backend

近期在研究一個相對有趣的問題:如何讓 In-Memory SQLite 能夠在程式結束時進行自動備份,並且在程式啟動時自動套用最新的備份。

如果想要備份 SQLite,有幾種方式:

  1. 使用 .dump 將指定表中資料匯出為 SQL
    • 優點:將資料轉存為 SQL,如果需要跨資料庫(例如 sqlite to mysql)的話相當方便
    • 缺點:檔案為 UTF-8 純文字檔案,所需容量較大且需要轉換 SQL 故執行時間會較長
  2. 使用 VACUUM INTO 指令,將 DB 檔案轉存為獨立的檔案
    • 優點:執行後會將資料碎片彙整,進一步降低所需容量;且生成的檔案可以直接被 sqlite 客戶端讀取
    • 缺點:寫入時在極端情況下(例如當機或停電),並不保證資料能夠被完整寫入
  3. 使用 Online Backup API
    • 優點:直接鏡像備份兩個 SQLite 連線;效率較 VACUUM 來得高
    • 缺點:沒有直接的指令,需使用 SQLite API 達成;因為是鏡像備份,所以包括源資料庫的資料碎片等亦會被保留

家用雙路由器內網設定

· 閱讀時間約 4 分鐘
Vincent Chi
Software Enineer, Backend

因為家中多了一台 Synology DS224+,趁著過年前把房間整理一下的機會,順帶重新設計家裡的網路。

需求

  • 在家使用的設備(無論走有線網路的電腦、WiFi 的手機與平板)皆為 IPv6
  • 能夠從網際網路直接連線到 NAS 及 HomeLab 上的某些服務
  • 能夠從網際網路提供一個 VPN 給外出時使用
  • 家用設備必須能夠以內網的方式連線到 NAS 與 HomeLab

PHP 容器化應用

· 閱讀時間約 8 分鐘
Vincent Chi
Software Enineer, Backend

容器化(Containerization),這是一個由 Docker 公司所發揚光大的一種技術,它能夠很好地封裝應用程式與所需函式庫,而且通常有著比 虛擬化(Virtualization) 更高的效能。

一般來說,編譯式語言都很容易被容器化,例如 C/C++ 或 Golang,這是因為只需要在容器中設定好相依函式庫(通常是指動態函式庫),其編譯出的執行檔就可以直接在容器中運行。

這對 PHP 這類直譯式語就不是個好消息,其運行環境往往受制於 Apache PHP Module 或 PHP-FPM,再加上現代 PHP 往往會整合 Composer 進行相依性套件管理,這使得其處境更加雪上加霜。

備註

Python 或 Nodejs 這類直譯式語言,往往也會藉助一些協定(例如 Python 依賴的 WSGIASGI)或工具(例如 PM2Forever)來佈署。