NeoHOJ:2019 始春
始春這個梗來自 TeaMeow,認真說起來共通之處是興起時間點接近的專案。聽說他們改叫做 TeaCat 了,隨便啦。
事情是這樣的,大約 2016 年中我母校的評測系統:HSNU Online Judge (HOJ) 死掉了,因為上面曾經有多優質的題目和測資,很想把它重新上線,於是就開始踏上了修復 HOJ 的道路。
大家今天過得還好嗎?有沒有空?要不要一起來寫 judge?
(科普一下,judge system 的意思是使用者會將一段程式碼提交到伺服器上,伺服器藉由自動化的流程來驗證使用者的程式是否能正確運作、滿足所有預先設計好的條件限制。)
總之就許下這個心願,準備埋頭苦幹。因為是一人專案,同時肩負著開 spec 和把 spec 轉變成程式碼的雙重工作,又沒有明確的死線壓力,所以開發期程多所延宕。寫出、設計出一個能動的 judge,本身不是一件技術門檻要求很高的工作,GitHub 上隨處都可以找到開源的 judge 專案,就我所知還有些是電資界的朋友的作品,幾乎是「 {
社團 ,
學校 ,
當助教 ,
自己(?)}
要用就刻一個」這麼喝水般自然的事情。每個人的需求不一樣,clone 下來還要改太累了。
這個專案異常快速地就定名了:Neo 是新,取其 “of the modern form” 的意思。如果目標只是在復站,直接使用前人的成果未嘗不可。但既然重寫一個的成本不太高,我的目標就放在要寫成一個夠現代、夠通用 (generic) 的 judge。其一是題目設計者要能夠指定評測情境,其二是使用者提交的程式碼是極度不可控的內容,要充分考慮各種極端狀況,同時還要足夠靈活到可以應付教學、練習、比賽等不同場合的配置需求,便需要仔細規劃。
很多細節最初沒有想到比較好的做法,但一邊在寫作業、工作及寫各種 side project 的時候不時會有些靈感,還是慢慢兜出一些雛型或架構。於是就在這樣的開發週期下默默過了兩年呢。
後端:目前的後端是用 Python & C++ 寫成,十足地是一場系統程式實務,查了很多 man page 和 Python docs,用上一些系統程式課所學才終於完成。沙盒的部分是開源的 nsjail 依需要改裝而成,使用了 Linux 的 namespaces、control groups、seccomp-bpf 等堅固的技術。雖然目前只計劃在 Linux 系統上部署,但因為大部分的程式碼都是可移植的,只要是依照 spec 交換資訊寫成的沙盒程式都可以為其所用。
前端:從後端的角度來看,網頁和伺服器上的業務邏輯應該都算前端吧!總之就是 PHP 混戰。因為某些協助,我得以接續 HOJ 的原始前端進行開發,除了拉介面的皮之外就是和後端進行良好整合,並且更新 gcc (mingw?)、PHP、後端框架的版本。這部分因為授權未明,不便透露。
工程師如我比較不喜歡、不善於寫文件,所以先大致報告到這裡,如果以後還有時間,會再撰文報告技術細節或是開發進度等等。
這是這個專案的 GitHub: https://github.com/NeoHOJ,歡迎技術交流與貢獻程式碼。謹以這篇文章做為這個專案的 initial commit (on docs),剛跨完年的我先跟大家說聲晚安。