Gopher: a present for Redis

Salvatore Sanfilippo

Gopher:給 Redis 的一份禮物

十年前,Redis 在 Hacker News 上發表,我將那一天視為這個專案的虛擬生日,原因很簡單,比起專案第一行程式碼真正誕生的日期,向大眾公開發表的日子更為重要(可以想成動物的受孕與實際出生之別)。我想藉 Redis 滿十週年這個機會,釋出我這幾天稍微把玩的東西,原本是想留到愚人節當作玩笑來發表的,但那個日子還很遠,我現在就想跟大家聊聊這個專案……所以,Redis 生日快樂!這是送給你的禮物:一個 Gopher 協定的實作。

[……此時 Redis 試著忍住淚水,但情緒太過激動,地上散落著許多位元(我是說 0 和 1)……]

「你到底在說什麼鬼?!」應該是你直覺會冒出的疑問。在 2019 年聽到 Gopher 確實有點奇怪。不過它並非*只是*一個玩笑,雖然很大程度上就是個玩笑。畢竟整個實作扣掉用來把頁面轉成 Redis 鍵值的外部工具,也才不過 100 行程式碼而已。但……重點是,Gopher 真的還有一個活躍的社群,雖然非常小,卻在近幾年、近幾個月裡持續成長。有些人覺得,網際網路已經不再是從前的樣子。有太多的控制、企業的追蹤、留言、按讚、轉推,多到內容不再是王道。人們寫出新東西,紅個 5 小時就消失了。已經沒有任何討論能在不演變成某種筆戰的情況下存活超過幾分鐘,除非所有參與者都對每一個可能的感受、令人不安的字眼與信念進行自我審查,審到讓討論本身變得相當無用。最後,為了載入一個只有 1k 文字的不起眼頁面,卻得載入 50 個 javascript 檔案,看著畫面閃爍,只因為客戶端渲染很酷,諸如此類。

另一方面,Gopher 是一個純文字協定,非常適合用來傳遞純文字文件,重點完全在於你寫了什麼。但若只談這點,那就只是戀物癖了,對我而言,Gopher 的殺手鐧在於它很不酷。不酷到據我所知,它將永遠是一個另類現實,讓某些人可以決定與主流分離,去體驗一種不同的做事方式,更像早年 BBS 或網際網路最初那幾年的感覺。那是一個大多數人不會想去的地方,只為了用 80 欄定寬字型閱讀充滿宅味的東西。

在 Gopher 裡你要做的,就是打造你自己的 Gopher hole,也就是你在 Gopher 宇宙中的空間,基本上就像你在網際網路上的網站一樣。能做到這件事的工具本來就不少,但 Redis 在幾個方面相當不錯:你可以透過變更 Redis 鍵值來即時改變網站內容,這很方便。你可以利用複寫(replication)來複製整個站台,甚至只要儲存你的 RDB 檔案,就能擁有整個 Gopher hole 的完整副本,用於備份或基於歷史保存目的進行封存。

這個 Redis Gopher 的概念是在 FreakNet 的合作下誕生的,FreakNet 是位於卡塔尼亞(Catania)一個具有歷史意義的駭客實驗室。https://it.wikipedia.org/wiki/FreakNet。這群人做了很多有趣的事,包括在帕拉佐洛阿克雷德(Palazzolo Acreide)的一個復古電腦硬體博物館計畫:https://museo.freaknet.org/en/

運作原理?

其實很簡單,我劫持了 inline protocol,確切來說是兩種本來就不合法的 inline 請求:一種是空請求,另一種是任何以「/」開頭的請求(沒有任何 Redis 指令是以這種斜線開頭的)。一般的 RESP2/RESP3 請求則完全不會經過 Gopher 協定實作的路徑,仍會照常處理。如果你連線到已啟用 Gopher 的 Redis,並傳送像「/foo」這樣的字串,如果存在一個名為「/foo」的鍵,就會透過 Gopher 協定來提供服務。整個實作只有 100 行程式碼。一開始我曾考慮使用資料結構並進行語意轉換以對應到 Gopher 型別,但那樣只是徒增複雜又毫無用處。

相反地,我的做法是為在 Redis 上使用 Gopher 提供一個創作工具,你可以在這裡找到它:

https://github.com/antirez/gopher2redis

想看看在 Redis 執行個體上運行的 Gopher hole 範例,只要前往 gopher://gopher.antirez.com,對了,那也會是我在未來幾天內建好自己的 Gopher hole 後的位址。附註:我建議使用 Lynx 這款純文字的網頁/Gopher 瀏覽器來存取 Gopher。

Gopher 支援預設是停用的,要啟用它,請使用 Redis 的 unstable 分支,並使用「gopher-enabled」選項,將其設為 yes。不過請務必同時為 Redis 設定密碼保護:Gopher 協定仍會提供內容,但同時一般的 Redis 指令將無法存取。這樣一來(假設你在這個執行個體中沒有除了 Gopher 鍵值以外的其他資料需要暴露),你就可以將這個執行個體公開,作為一台真正的 Gopher 伺服器。

好了,祝你玩 Gopher 玩得愉快!我希望這個 Gopher 計畫能持續下去,我真心相信我們當中有一些人需要在現代網際網路的混亂之外打造一個社群。不,這不代表可以完全沒有互動。例如,我並不打算停止寫部落格或使用網際網路。但某些更緩慢、更高品質的交流,需要一個得以蓬勃發展的地方。

原文由 Salvatore Sanfilippo 發布

本文章由 muse-spark-1.2-contributor 進行翻譯