←返回上一頁

itouOJ

我的Online Judge

專案介紹

itouOJ 是一套可以自行架設的 Online Judge,將程式實作、程式識讀、CTF 練習、比賽與課程放在共用的帳號系統下。使用者可以練題、寫程式、查閱提交與題解,出題者則能整理題庫、安排課程和舉辦比賽。

網站採用 Next.js 16、React 19 與 TypeScript,以 SQLite/Prisma 儲存題庫、帳號和提交資料;程式碼的編譯與執行則交給自建的 Linux 沙箱。可以直接到 線上網站使用,也能依照 GitHub 文件部署自己的站台。

練習與解題

  • 程式實作:支援 C、C++、Python、JavaScript 與喵++,提供 Markdown/數學式題敘、範例測資、子題配分、提交紀錄及排行榜。
  • 線上編輯器:使用 CodeMirror 6,可在題目頁編寫程式、測試範例並提交。桌機能拖曳調整題目與程式欄寬;手機則有獨立的編輯介面與鍵盤符號列。
  • 帳號草稿同步:每一題、每一種語言都有自己的草稿,網站與 Android App 可以同步;離線時先保存在裝置上,遇到不同版本時會讓使用者選擇保留哪一份。
  • 互動式 Terminal:桌機可逐行輸入、即時查看輸出,支援 C、C++、Python 與 JavaScript,也能送出 EOF 或停止執行。
  • 程式識讀:以選擇題練習閱讀程式,提供即時對答案、詳解、題組進度與複習紀錄,和一般程式提交分開處理。
  • CTF 練習:提供題目分類、附件、Flag 提交、解題紀錄與計分板;部分 Web 題還有可直接操作的小型練習網站。

比賽、課程與管理

比賽支援 ICPC/IOI 計分、封榜與揭榜、參賽代碼、語言限制及 PDF 題本。課程則能把題目整理成學習進度,方便持續練習與追蹤解題情況。

網站也有討論、題解、公告、站內訊息與個人檔案。管理後台可以審核題目提案,並管理題目、CTF、比賽、課程和使用者,讓出題、辦活動和日常維護都能在站內處理。

自建評測與沙箱

正式提交會先進入判題佇列,由 worker 領取,再交給 sandbox-runner 執行。沙箱使用 Linux namespace、cgroup v2 與 seccomp 隔離執行環境、限制資源及系統呼叫;互動式 Terminal 則由獨立的互動服務維持輸入輸出連線。

喵++ 透過 C++ 核心的 WebAssembly 版本整合進 Node 沙箱,沿用既有的執行流程。現在已停止接受新的 Java 提交,過去的提交紀錄仍可查閱。

評測也支援由其他主機上的 worker 透過租約領取工作,搭配心跳、逾期回收與冪等結果寫入,處理 worker 中斷或重試的情況。

行動裝置與離線比賽

Android App 使用 Capacitor 載入網站,提供手機編輯器、分頁操作與原生通知,並與網站共用帳號和草稿。

另外有獨立的 Windows 收件程式,讓選手在斷網比賽中撰寫程式、保存草稿與提交,恢復連線後再補傳。Android App 與 Windows 收件程式可從 GitHub Releases取得。

遇到的困難

判題系統需要處理的,不只有答案對不對。使用者提交的程式可能卡住、耗盡記憶體,或嘗試存取不該接觸的資源;編譯、正式判題、範例測試與互動式執行,也各有不同的資源需求和生命週期。

因此除了沙箱隔離,還要處理工作排程、逾時、重試與結果寫入,讓服務中斷時能繼續處理提交。加入識讀和 CTF 後,也得把不同題型的紀錄、分數與排行榜口徑分清楚。這些看不太到的部分,是讓整套系統能持續使用的重要工作。