跳至主要内容

以 PHP FFI 使用 libcurl 構建 URL Parser

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

眾所周知,在 PHP 中 parse_url() 這個函式遲遲未支援 UTF-8,這導致一些英文、數字以外的 Host, Path, Query 及 Fragment 都會解析錯誤。

(psysh) >> parse_url('https://中文.台灣/你好嗎?我=很好&大家都很好#你呢?')
=> [
"scheme" => "https",
"host" => b"中æ__.å_°ç_£",
"path" => b"/ä½ å¥½å__",
"query" => b"æ__=å¾_好&大家é_½å¾_好",
"fragment" => b"ä½ å_¢ï¼_",
]

這個問題直到 PHP 8.1 仍未見改善,這也是促使我寫下本文的動機。

Redis 字串研究

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

Redis 在處理字串資料時,另外實現了一個名為 SDS (Simple Dynamic String)的資料結構。

在 Sabaki 上使用 GNU Go 及 Katago

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

作為休閒活動,我偶爾會在 OGS 上跟人下棋。不過前陣子因為家裡網路不太穩定,所以索性就自己弄了一套單機的下棋環境。

儘管這幾年因為 AlphaGo 的關係,圍棋這項歷久不衰的競技又再一次被推向話題討論的浪尖,然而實際上它的 Open Source 資源是相對稀缺的。

註:圍棋其實有不少付費軟體,但實際用起來很多都效果不佳,有些 AI 對奕的實力甚至比數十年前的 GNU Go 還差。

為 Laravel 整合 Google reCAPTCHA Enterprise

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

Google reCAPTCHA 是一個人類行為驗證機制,用於阻止爬蟲或類似的機器行為。

  • v1 (2007):基於驗證碼
  • v2 (2014):I'm not a robot 勾選框
  • v3 (2018):對當前用戶進行評分
  • Enterprise (2020):與 v3 類似,但加入更多功能(如密碼洩露檢測)

就目前為止,除了 Google 官方的 SDK 之外,幾乎找不到針對 reCAPTCHA enterprise 實作的 PHP 套件(大多都是 reCAPTCHA v2 及 v3)。

Versioned JSON Schema

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

隨著 MySQL 5.7 加入對 JSON 格式的原生支援,開始有許多開發團隊把 RDBMS 當 NoSQL 使用。本篇文章對於效能議題暫且擱置,顯而易見地,越自由的格式往往會帶來更沉重的維護成本。

舉例來說,目前資料庫中可能存在以下型式的資料

{
"age": 16,
"avatar": "avatars/avatar.png"
}

然而可能因為系統改版,需要更精準地計算用戶年齡,所以將 age 欄位改為 birth

{
"birth": "2002-01-01",
"avatar": "avatars/avatar.png"
}

在 Raspberry Pi 上構建 Portaler Zone

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

Portaler Zone 是一款為 Albion Online 打造的社群工具,其目的是共享社群間的地圖資訊。

註:事實上我也不知道這到底是啥,這次單純是因為有個人委託我去幫他建構這個開源專案。因為前前後後遇到的坑有點多,所以這邊做個筆記。說明上主要以自己理解為主,可能會有不正確的地方,還請各位玩家多多包涵。

FF14 中文化、UI 優化與第三方登入

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

注意:本文章所述之內容可能違反 FFXIV 官方使用條款而導致帳號被封鎖,請在確認自己瞭解風險的前提下再操作。

國際服中文化

對於 FFXIV 這類劇本量龐大的 MMORPG,如果看不懂故事內容的話相當可惜。雖然有盛大遊戲代理的中國服可選擇,但是連線問題一直是海外玩家揮之不去的夢魘。

目前大部份的國際服中文化都是依賴中國服的資源--中國服雖然爛線,但對於翻譯的品質仍是相當頂尖的: