以下是 2025-04-22 21:03:43 写的
我相信许多 OIer 或者教练都曾有过搭一个自己的 OJ 的念头。但苦于 OI 并不包含有关服务器运维的任何内容,网络上有关的教程写的也比较简单,所以要么是外包,要么是鸽掉了。
然而,本 OJ,即WyOJ,山东省潍坊第一中学在线测评系统,就是一个非常好的例子。WyOJ 是一个基于 UOJ 的测评系统,利用了机房残留的四台机器搭建而成,总共耗费不到 100 元。如果不需要外网访问,可以做到完全免费搭建。同时,其性能也不错,根据 一篇测评,完全可以胜任一般的校内或校级评测。
UOJ 官方要求使用 64 位机器,但实际上只需要做一些简单修改就可以支持 32 位机器。WyOJ 使用的四台机器中,一台是 i3-3240 @ 3.40GHz,另外三台都是 Pentium G2030 @ 3.00GHz。
(没写完)
以下,2026/06/10 21:54 更新
WyOJ 简介
我发现这篇文章咕了整整一年两个月,好像是时候完善一下它了,也是时候全面地阐述一下 WyOJ 的繁杂架构。毕竟我已经准高三了,之后维护 WyOJ 的时间只会越来越少。
我非常期待有学弟能来接手这个烂摊子,其实它并不是很烂,只是由于工程学上以及时间及预算上的原因,做了很多实践上的取舍。有这样能力的人一定是存在的,只是现在尚未出现,或者时机尚未成熟。具体地,我会把要求单独写一节。
WyOJ 架构简介
今天的 WyOJ 早已经超过了我在 2025 年 4 月份的预想。那时候,WyOJ 只是一个运行在两台 32 位机器以及一台 64 位的 i3-3240 4GB 内存上的简单平台,甚至我为了适配 32 位系统,还把 Docker 镜像给拆开直接重新编译了。用了一些神秘方法之后,我们迎来了 WyOJ Round 1。这是 WyOJ 第一次承办正式比赛,虽然说比赛在 WyOJ 上只有 9 人有分(其他人都在洛谷上提交了)。但不得不说,我们当时还是特别兴奋的,我们还留下了一张珍贵的照片。

一年以后,面对高三,RyP 上校将会回想起已经忘记名字的人拍下 __vector__、KSCD_、Pigsyy 和他四人照片的那个遥远的下午。
在这次比赛之前,OJ 上只有一些测试性的提交,比如什么平衡树,比如什么省集的题目。今天,OJ 已经 13243 发了,但我依旧会像一年前一样,有事没事就在浏览器的地址栏,输入 oj 两个字符,等待浏览器自动补全成 oj.ryp.org.cn,然后干脆地按下回车,点开提交记录,像个孩子玩弄新奇的玩具一样,看看 OJ 有没有新的提交。
在 2025 年 5 月 18 日,我从家里拿来了一个 8 口千兆交换机,给 OJ 换上了千兆网络。在那天的前几天,我在观察 dmesg 时突然发现,G2030 是 64 位的!
于是,我就为它们刷上了 64 位的 Arch Linux,并顺理成章地用上了 Docker 来部署。那其实是我第一次正式使用 Docker,我学到了很多。其实,那也是我第一次亲手去插网线,去用交换机。在那之前,我从来没有用过网线,因为我的笔记本也没有网口。在那之后不知道多久,我才学会了用网线钳自己做网线,都是很久很久之前的事情了吗?

在 2025-06-19 日左右,我搭建了一个图床,是基于 lsky 的,就运行在 mei 上头。ryp.org.cn 上的 nginx 会识别来源 IP,如果是机房的 IP,就重定向到 mei 在校园网里的局域网 IP。搞笑的是,为了可以用 HTTPS,我还不得不让同学们自己安装我的自签名证书,不然会无法访问这个图床。
不过几天,忘了由于什么原因了,这个图床被放弃了。几个月以前,我把 lsky 的数据库删除了。
关于之后的那个暑假,我已经记不很清楚。只记得那次期末考试,我考得很烂。但那似乎没有那么重要吧。总之,在 8 月 18 日的晚上 11 点,我宣布,我们添加了一个 UBSan 功能!这个功能是仿照 CF 的,原理是,我把 stderr 输出到了原来的 .out 里头,这样在前端你就可以看见本来会输出到 stderr 的 UBSan 信息了。
我隐约记得,这个 UBSan 耗费了我不小的精力。可是大家似乎不是特别习惯这个东西,过了刚发布的那几天,就几乎没有人使用了。
十天后,8 月 28 日,我发布了 WyOJ Musume,也就是 WyOJ 的群机器人。这是一个基于 Napcat 的手写的群聊天机器人,具体实现很简单,在 git.ryp.org.cn 上头有,于是就不详细解读了。
我还记得,那个下午的五点左右,我爹回了家,我还在屋内查阅 Napcat 的文档并不断调试。吃完饭后,我继续调试,然后在那篇公告发出来之前(这是当然的),我把它完成了。
记得当时,我宣布没有提交的号全部被我删掉了的时候,还在群里掀起了一场骂战。
随后,我的高二开始了。
在 11 月 17 日,我添加了一个非常有趣的勋章功能,这个功能我到现在还十分满意,因为它真的很有趣。我记得,当时我告诉 @cybrex,我要给他安排一个勋章管理员的职责,但到现在还没有实现。
翻群公告让我回想起很多事情。
当时,我还没有写用户组系统,但我们需要实现三轮省集的题目只能给一中内部的用户看,所以我上线了一个功能,就是 ! 开头的题目只有 “WyOJ 内部用户” 还是 “WyOJ 信任用户” 能看。后来,似乎是 9 月份,我加上了给 WyOJ 的第一个大补丁,就是用户组系统。
用户组系统是用用户系统实现的,也就是说 group_XXX 就是一个用户组。组的意义是,在某个组里的用户有对属于这个组的题的一些特殊权限。比如说本来是隐藏的题,如果是组用户,你就能看到。如果是组管理员,你就能操控。
这个东西的实现比较丑陋,在数据库里加了好几列,也没建索引,但是性能早就够了。
12 月 1 号,我写了一个脚本,把洛谷博客上的博客全部搬过来了。依稀记得那是一个周末。四天后的一个中午,我翘了,在机房写了一个定制主页的功能,那是一个昏昏沉沉的中午头,我记得 @__vector__ 就在旁边。
对了,11 月底是我们的期中考试。
我印象非常深刻,因为在那之前,我就已经知道在 12 月初要举办一场全市的大型比赛,也就是公益班的选拔比赛。于是,我一直期待着在考试后能抽出时间准备这场重大意义的比赛。一方面,这完全不是一次校内的测试;另一方面,这场比赛会有数百人参加。
在昏昏沉沉的高中生活中,我一直期待着期中考试快点结束,这样我就能腾出一点精力来投入到我喜欢的事情中去。
我的青春就这样在期待中逐步逝去。转眼间,2025 年都将要结束。
今天,2026 年已经过去了一半,可我的潜意识依旧认为今年是 2024。那是一个美好的年份,那一年我有期盼地活着,每一天都充满意义,充满欢声笑语。那是永远不会重复的一年,在我生命剩下的八九十或一百余年内,一定会有更有激情的某一年,但那三百六十六天不会再有了。
和忘记了名字的人说的一样,时间不是线性的。人们擅长理解线性,所以就把它当作线性的了。如果回忆是线性的,那将有多少个小时是充满着无趣的时光。幸好,时间不那么无聊,于是乎,我们的回忆也更加精彩,我们才会对过去如此地痴迷。我们一遍遍说,那样就好了,不那样就好了。既然时间并非线性,为什么造物主却不让我们把它重新折叠一下呢?
从另一个角度看,也许我们已经折叠过它了。那一年我所经历的痛苦,我已经记不太清。回想起 2024 这个数字,我脑中仅剩的就是一片欢声笑语。这种折叠一定是有益的,它让我们坚信过去是美好的,这样我们就有勇气面对未来,在未来写下过去的影子。
不管做什么,不管怎么做,时间总会往前走,或者说往右走,或者说往后走。我的右手边是明天,左手边是遥远的过去。明天我看不见,过去我也已看不确切。我的眼睛长在身前,所以我只看见前天。但这数十个个小时好像也太过遥远,可也总没有身后的黑暗虚无缥缈。
那句话怎么说的来着,你所说的曙光究竟是什么意思。
总之,在一个很不开心的夜晚,我目睹了那个 5 跳成了 6。我看着那一瞬的一片片庆祝声,不太知道自己究竟应该发些什么。我感受不到丝毫的喜悦。难道有人真的能感受到喜悦吗?
2026 年的 2 月,是幸福的 28 天。和前年此时相比,这个月少了一天。和后年此时相比,这个月也少了一天。我在这似乎并不完整的 2 月里和家人完成了一次很幸福的旅行。
如果要为这次旅行找一个最合适的音乐,我只能想起 Radiohead 的 No Surprises。
那是一种昏沉的感觉。
我坐上飞机,下来,在摆渡车,用手稳稳把住把手,让摆渡车把我送向我该去的地方。我坐上地铁,看杭州的景色,几年后,也许我也会站在相同的位置上带着不同的感受。地铁有一段是地上的,其实景色并不是很美。一片片荒芜的黄绿色与水泥最原始的灰色在我眼前,那是一幅很不协调的画面。我就站在那里发愣地看着。
我记得我们住在一个舒适的旅馆,记得在浙大的校园淋着轻轻的雨。我站在一个长长的坡的尽头,往下看遥远的校门,也许我面向的是南方,这是我记忆中的方向感告诉我的。视野的尽头是浙大的校门,视野的两侧是杂乱的树,在我的记忆或者是想象中,它们是金黄色的。
我会纵身跳下,让伟大的重力场牵着我狠狠摔在地上一直向前滚去,遥遥无期,淋着看不见颜色的雨,伴随着剧痛将我送向坡的底端。我不想停下,就让重力一直为我做功吧,我会在地上完成这永恒的舞蹈,我要头破血流。
然后我们来到了上海。
上海带给我的是一种极度的不协调感。就像在卫星云图上看到极度倾斜的建筑,你不能相信它属于这个世界,你有一种极度的恐惧感。
东方明珠倾倒在卫星云图上,几乎以 90 度的角度。那是一种恐怖的视角。就如同举头看向天空,天空中有一个比现在大百倍的月亮,每一丝纹理都轻松可见,清晰到你的大脑坚信这种清晰只能在近距离观察时感受到,于是你感到极度的恐惧。
上海的纸醉金迷,我只感到我不属于这座城市,起码我不属于南京路。
回程的火车,晚上我们坐上地铁,沿着熟悉的线路找到火车站,在高铁站站在充电区等待数个小时,随后坐上高铁,打开电脑上的 Cisco Packet Tracer。我是孤身一人吗?我们换下高铁,拖着疲惫的行李在清晰的凌晨两点转上绿皮火车。闻着一股鱼腥味,我们打开耳机在 No Surprises 的前奏中抱着行李睡去。行李很大,我们的身体有了些许的暖意。
这什么都改变不了。
好了,言归正传。
在过年后的几天,@cybrex 为 OJ 加上了他一直想要的推歌系统。
之后,我为 WyOJ 做了一个宏大的构想。其实这个构想在寒假前很久就早已出现,准确地说是 1 月 2 日。我完成了一个 AI 数据生成系统。这个构想的完整请见 WyOJ 的下一步。
然后我完成了 Luogu Remote Judge。这不是一个小工作,但也说不上难。
OJ 还有很多很多没有完成的工作:WyOJ 的下一步,在今年我大概是没有机会去实现了。Luogu Remote Judge 也没有修,因为没有续费 HK 的云服务器。OJ 的 UI 依旧没有修,博客系统只做了一点改进,并没有实质上的改变。这几个都是非常大块头的问题。
可我已经高三了,我的青春要结束了。
我将这句话如是说给一个朋友,回复是:是开始了。
是啊,我的青春要开始了。
2026/6/11 00:42
