上一篇更新完作業系統與套件,接下來就是更新 OJ 啦!

評測環境

之前的評測環境還停留在 Python 3.5,現在常用的 f-string 等語法都不支援,讓學生寫起來礙手礙腳。我心想既然要更新 Python,何不乾脆整個大翻新呢?

經過一番囫圇吞棗與不斷的 try & error,得出一個 GCC 12 編譯出來的可執行檔的 seccomp 白名單,把 base image 換成 Debian Testing,裝上 GCC 12、OpenJDK 17、Python 3.11、Golang 1.19,把 C++ 語法標準升到 C++ 20,評測環境終於能支援一堆很潮很炫泡的語法!(譬如 C++ 20 spaceship operator <=>

網頁後端

我們學校 OJ 有串 OAuth 登入,但青島大學 OJ 並沒有內建串接 OAuth 功能,當了一小時的考古學家總算發現上一位維護的學長有開一個 GitHub 組織,裡面有串 OAuth 的 commit 可以 pick,不過原本的 commit 有預設密碼的弱點,所以除了修補掉改成隨機亂數以外,還得把所有 OAuth 使用者都重設一次密碼,這部份沒有 Web 界面可以批次操作,要進到 Django Console 操作。

雲端備份

上一位學長有用 Google Drive FUSE 掛載做雲端備份,但每天備份四次,備份檔從最一開始的 100 MB 到現在 900 MB,還不會刪除最舊的備份檔,OJ 備份帳號就吃掉 1 TB,難怪學校不讓新生申請 Google Workspace 帳號

為了解決備份檔累積過快問題,crontab 分成兩個排程,一個是每天零點備份到 A 資料夾,另一個是把星期一的備份挪去 B 資料夾,並刪除 A 資料夾裡超過七天的備份檔。

解決了累積問題,還有備份檔過大的問題。花了點時間分析 OJ 的儲存資料,發現從 2018 到現在 2023 的 contest 一直留存,但實際上都是實習課開的練習或考試,過了該學期就沒有用了,也鮮少人會回去複習,所以決定把 2022 八月前的 contest 與 submission 全部刪除,備份檔大小從 900 MB 減少到 150 MB,順便把壓縮方式改成 zstd 讓壓縮/解壓縮效率更高。