--- date: "2024-07-01 09:30:00" --- # 來自未來的復古網路協定:Gemini Protocol > [!TLDR] > 本文描述的 Gemini 協定是一個開發於 2019 年的網路協定,而不是最近 Google 釋出的大型語言模型(LLM),以及其服務。 > > 本文介紹 Gemini 協定以及其應用,並附上本站開發 Gemini 協定鏡像站的過程與細節 ![image](https://hackmd.io/_uploads/Byv1DgeDA.png) ## 什麼是 Gemini 協定 請容我直接引用[官方網站](https://geminiprotocol.net/)的介紹的翻譯(by Claude 3.5 Sonet) > Gemini 是一項嶄新的網際網路技術,支援互相連結的電子文件圖書館。這個概念並非全新,但也絕非過時。它是永恆的,值得我們以一流的理念來對待,而非視為殘存的邊緣案例。Gemini 並非為了創新或顛覆而生,而是為那些認為網路已經被過度顛覆的人們提供一個喘息之地。我們無意改變世界或摧毀其他科技。我們的目標是建立一個輕量級的線上空間,在這裡文件就只是文件,以維護每位讀者的隱私、注意力和頻寬。 技術上來說,你可以把他想像成一個簡化版的 HTML,甚至是傳輸純文字的協定的感覺,你能夠以更低的頻寬上網,因為網頁不會有 JavaScript 和 CSS,幾乎只有內容本身。 在頻寬越來越高的現在反而打造這種極簡的協定,也算是某種叛客精神了吧。 ## 要怎麼使用 Gemini 協定來上網? 首先當然是安裝好用的客戶端軟體,這裡我推薦 [Lagrange](https://github.com/skyjake/lagrange),手機雙平台,桌面跨平台,都能正常使用。以下的操作範例就會使用 Lagrange 來示範。 如果想嘗試純文字介面的 Gemini 客戶端,我推薦 [ncgopher](https://github.com/jansc/ncgopher) 和 [Amfora](https://github.com/makew0rld/amfora)。不過大部分的 TUI Client 在 Hype 一過,都進入了維護模式,不然 MVP 最少功能實作完就沒有然後了 XD。如有需要,大家可以到 [awesome-gemini](https://github.com/kr1sp1n/awesome-gemini) 看看有沒有新的客戶端可以用。 ### 第一次連線 請在網址輸入 `gemini://txt.yukai.dev`,成功連線後應該會看到下面的畫面,會有很多方塊字是正常的,因為還沒安裝中文字體。 ![image](https://hackmd.io/_uploads/H1KgvggvC.png) ### 安裝 NotoSans 中文字體 請在網址列上輸入 `gemini://skyjake.fi/fonts/cjk/`,並點選下方的 **Noto Sans CJK - 19MB** 下載字體。 ![image](https://hackmd.io/_uploads/Hyw-vxgwA.png) 下載完成後,會跳出字體安裝畫面。請繼續選擇 **Install "noto-sans-cjk"。 ![image](https://hackmd.io/_uploads/rJGfDglPR.png) 安裝完成後重新整理頁面,本站 Gemini 鏡像站的中文字體,就能正常顯示啦! ![image](https://hackmd.io/_uploads/rkYGwexPR.png) ## 建立 Gemini 與簡易 HTML 的 Daily Oops 鏡像站 [Daily Oops 主站](https://github.com/Yukaii/daily-oops)的架設方式就是 Next.js SSG + HackMD Host Markdown + HackMD API 產生靜態的 React.js 網頁。 [^hackmd-nextjs] 以此為基礎,為了讓本站支援 Gemini 協定,我總共做了兩次嘗試。 ### 第一次嘗試:用 [agate](https://github.com/mbrubeck/agate) 架設在 fly.io 詳細的實作細節可以查看:commit `10bd36` 時的 [Repo](https://github.com/Yukaii/daily-oops-gemini/tree/10bd36a99c3a6f0f17ea01fcddab0dc274f84237)。步驟大致如下: 1. 從 HackMD 拉下 Markdown 列表 2. 用 [gemgen][gemgen] 轉換 Markdown 成 gemtext(Gemini 協定用的純文字格式) 3. 編寫 fly.io 能用的 Dockerfile * 用 AWS CLI 同步 gemtext 的資料夾到 s3 (`aws s3 sync`) * 用 [s3fuse][s3-fuse] 掛載 S3 成 container 內的目錄 * 用 agate 架設該含有 gemtext 的目錄 用這個方法,我就可以在有新文章的時候跑一次同步,就可以更新線上的文章,也不用重新部署伺服器。 不過這個方法也有幾個缺點: 1. fly.io 屬於 PaaS,一般來說比較貴 2. AWS 在本機跑,有時會忘記 其實最影響我決定的還是免費仔的部分。後者 S3 同步部分要搬到 CI 上也不是不可,但相依於要錢的 fly.io (每個月含 IP 約 4 USD),然後只為了架一個精簡協議的網站,想想就不怎麼划算 XD ### 第二次嘗試:同時產生 Gemini 網站與精簡版 HTML 在得知開源軟體倉庫服務 SourceHut 也提供了免費架站 SourceHut Pages 後,我就決定把 Gemini 站移到那裡。 整體的流程還是和之前差不多: 1. 從 HackMD 拉下 Markdown 列表,並用 [gemgen][gemgen] 將 Markdown 文章轉換成 gemtext (之前的第一二步驟) 2. 附加部分的詮釋資料(metadata)到 Markdown 裡,然後用 Hugo 生成簡易版 HTML 的網站 3. 推送到 SourceHut Pages 上 改用 SourceHut 倒是多了些好處: * 免費,還可以同時 Host HTML 和 Gemtext * 不用自己維護 Dockerfile 檔。雖然 Docker 能自訂的地方比較多,但推上 fly 還要等 build,不若 SourceHut 精簡快速(tar & upload) 不過後來我還是為了支持 SourceHut 購買了每月兩美金的贊助方案就是了。贊助和買服務的感覺還是不太一樣 XD 平平都是掏錢,還有個心情的差異嘛。 至此,只要再綁上 Netlify postbuild hook,我就能 Trigger 一次 rebuild,亦次部署主站,以及雙協定 Gemini/HTML 支援的精簡版鏡像站啦(還沒實作) [^hackmd-nextjs]: 可參考本站文章 [把 HackMD 當做部落格後臺](https://yukai.dev/blog/2021/05/16/hackmd-as-cms-blog-feat-next-js) ## 所以你到底為了什麼要做 Gemini 協定的分站 因為潮啊 (1s) 常常會看到許多大神的個人網站是極簡風格,用簡單的 HTML 加上等寬字體設定,有時甚至連 CSS 也沒有。極簡風格的部落格一直在我的願望清單裡,但我又想要保有好看的版本,對,就是「我全都要」。 這次實作的鏡像站解法,同時保有最少的維護成本,也有最大的掌控性,如果未來有更好的做法會再更新的!