Lutece 重构周报(2022 年)

为了避免自己摸鱼,每周写周报。

为了查阅方便,时间从近到远排。

8 月

08-20

这周干了啥

报到了,从精神内耗转变成精神外耗了。选培养方案选了一堆网安的选修,这下网安入门了。

下周要干啥

因为要上课了,之后可能不会怎么更新。如果有重要的事情再更吧。

08-13

这周干了啥

啥都没干,包括复刻 Polygon,修 cdoj-vjudge 的 bug,看番也没看出啥里哏楞,可能是在精神内耗罢。

下周要干啥

下周报到了。

08-06

这周干了啥

这周在搞杭电多校,先是把一个题拆成两部分发现两部分都原了,换掉,然后是比赛前一周和其他比赛撞题,换掉,然后又是删 trivial 题,换掉,这么折腾了之后居然题目数没变。

以上肇事者都是我,斯米马赛。

下下周开学,杭电多校打完准备退网了。

下周要干啥

准备开学。

7 月

07-30

这周干了啥

又被喷了。倒是意料之中,但是喷的点确实是意料之外,L 可能确实应该喷,但是 DE 又没被喷,十分意外。感觉真的心很累了,今年之后可能很长一段时间不会碰出题了。

出题人都希望有一个好做题人的,至少也得有点客观中肯的意见吧,那你说 L 的质量低,它低在哪里嘛,不说,最后还是问别人+自己悟出来的。现在真的越出越迷茫了,首先迎合不了自己,因为确实能力不够,也做不到迎合选手,因为我真搞不懂现在选手喜欢什么了。大家都成熟一点,对自己很失望也对所有人都很失望,不如安静点去开 Polygon 的坑。感觉自己一大把时间都被浪费了,很不值得。这种不值得可能是在于,这些人并不是我想象的那么好,从品行,语言交流等等方面上,或者说好的人不是我想象的那么多,之前我可能觉得是 80%,现在我可能觉得也就是 50%。

听说有队员被开盒了,吓人。不至于,真不至于。

最后大家去打日麻了。

摘录罗翔语录以警示自己:

很多人往往是向往崇高,却自由地选择卑劣。还有些人根本不知道如何选择,他们会自由地把选择权让渡,让别人帮自己选择。


CDOJ-Vjudge 方面,修了 exit code 2 的问题,但是剩下两个问题有点不好修,启动内存的问题可能还要加点逻辑,显示行间公式这个问题有点复杂,还需要给题面加层 parser 才可以。

下周要干啥

还真就不知道下周要干啥了,可能搞 HDU 多校吧,但是没什么动力了。

07-23

这周干了啥

拔智齿去了,脸肿了一周,搞了牛客多校,感觉好像应该没啥了。

下周要干啥

下周牛客多校了,杭电多校的东西还没搞完,但是杭电多校麻烦多了,想死……

07-16

这周干了啥

7.12 上线了,但是有些问题:

  • 1092:container 内存设太低容易导致容器起不来
  • 26:escape 掉 testlib exit code 2 的情况
  • 2405:题面行间公式显示有问题,要把 $$ 放到一行里。

但是人在老家,下周再努力吧。

下周要干啥

但是下周要赶多校了。

07-09

这周干了啥

笔记本送修理店修好了,花了 200 块钱,说是 CPU 供电挂了。于是总计 600 从室友那里获得了一个小新 V1000。只不过屏幕和键盘都不好使,当台式用了。

白箱看完了。这种番看什么都是软件工程了。

这周并没有上线,倒是把数据都打包传走了。

下周要干啥

下周一定上线。再不上线要撞多校了。

07-02

这周干了啥

回家,然后摸了一周。修了一小会儿电脑,但是配件周日才能到齐,还不确定屏幕是不是有问题。

这周主要在看白箱,很好看。

下周要干啥

下周上线。

6 月

06-25

这周干了啥

稍微白盒了一下,修了一些 bug,感觉应该是可以上线了。但是测了一下测评机波动,感觉轻量服务器抢占确实有点严重,波动还有点严重。

Lutece 交接完了,openday 也结束了。毕业的相关事情也都办完了。

下周要干啥

下周滚回家,准备上线了。

接着就不会在成都更周报了。

再见成都。

06-18

这周干了啥

server 和 worker 绝赞联调中。终于在今天凌晨合上了。

记录一个问题,在沙盒外面编译了 checker,也复制到了指定位置,但是运行的时候报找不到 checker 的错,是因为 Alpine 自带的 musl 是极简版的,链接库不全,就导致外面编译能用的库进到沙盒就用不了了。确认是不是这个问题用 ldd 看一下就知道了。解决办法是换成 ubuntu 的沙盒,但是 ubuntu 的沙盒里只有一个 null 设备,安装 Java 会失败,需要把 /proc/dev mount 过来,哈哈。

其他一堆细节问题调得挺崩溃的,代码丑得要死。

下周要干啥

下周接着测,准备交接 Lutece,华为 openday 也挪下周了,然后准备滚蛋。

06-11

这周干了啥

改了 worker,把几乎所有论文提到的 feature 都下了。

顺便买了个域名,site 后缀的域名真便宜,折下来一年 18 块钱。

这周拍了毕业照,剩下的时间都在开心地推数学与几何专题的大大大大大式子。原来我写几何的,现在变成推大式子的了,悲。

这周还把在 coding.net 上的图床下了,因为一不小心给删了。之后把账号注销了。

下周要干啥

接着改代码。应该就剩改 server 和联调了,改 server 应该比较快,但是联调就不知道调成啥样了。

下周还有华为 openday。

06-04

这周干了啥

看了一眼代码,为了搞毕设感觉 worker 的挺多地方过度设计了,要改一堆代码。有点崩溃。

下周要干啥

接着改代码。

5 月

05-28

这周干了啥

这周答辩成绩出来了,彻底毕业了,剩下的活就是签字打印装订什么的,就比较简单,该准备收拾收拾滚蛋了。

这周和信息中心沟通,把 Lutece 用域名访问点击提交记录没法跳转到提交详情的 bug 修了。

下周要干啥

把 cdoj-vjudge 最后一点提交功能写了。

05-21

这周干了啥

答辩了,答辩老师完全没有听怎么做的,只是对论文的结构和语言提了很多意见,而且跟答辩老师电波对不上,很多事情做了也就是哄答辩老师开心罢了。

2022 年 5 月 19 号,答辩那天,可以说是我学术生涯中最黑暗的一天了吧,虽然我实习的时候也经常说某天是我职业生涯中最黑暗的一天,意思差不多。

软件工程的形式化和可表征应该是受欢迎的,是我们的研究方向,但是形式化不是形式主义,可表征不是对着论文抠字眼。当一门学科变成了形式主义利用的工具,那将是危险的。

但是我们也要反对纯粹的功利主义,只贪图局部的效益,而不考虑全局的效益,我们就会被一个局部最优困住了。方法论应该被提炼总结为世界观,才能更好的指导实践。

GoF,他们就四个画 UML 图的,他们懂个 P 的软件工程。

下周要干啥

剩下的事情就改论文了吧。改完论文感觉时间也不多了。希望能在六月份上线 CDOJ-Vjudge。

感觉人生中宝贵的一段时间就这么因为被无意义的工作占用而失去了。

05-14

这周干了啥

论文导师审核结束了,虽然没怎么改但是还是比较慌。决赛题可算是糊完了,说着不整了但是还是整了挺多题的数据。

下周要干啥

下周论文答辩。

05-07

这周干了啥

终于把论文写完了,校赛初赛也结束了,但是于我来说并没有达到预期。不过目前最紧要的还是决赛题一道都没造的问题。

下周要干啥

校赛决赛,改论文。

4 月

04-30

这周干了啥

在激情写论文,但一周只写了 9k 多,离 2w 的目标相距甚远。

顺便修了一些 Lutece 的 issue,比如修了无法显示头像的问题,迁移了 CDOJ 的备份数据,修了 232 的 WiFi 等等。

下周要干啥

下周就校赛初赛了,还得写论文。

04-24

这周干了啥

在写中台,今天去打了 4C,一看 L3 前两个题全会,L3-2 校赛原题我自己还出给 NOIP 过。但是被 L2 爆杀,每道题都在激情 debug,写完了之后 L3 没时间写了,直接甲级战犯耻辱下班。

然后还把手机充电器和充电线落清水河了。

毕设 5.5 要交论文初稿,真的很想死。

下周要干啥

先把充电器拿回来。

然后该写论文了。

04-16

这周干了啥

主要在搞初赛题和各种题。

一周之内被连着 DDoS 两次,真无语了。

下周要干啥

这周也没什么干劲,下周再努力吧。

04-09

这周干了啥

主要在搞中期和一些杂事,毕竟写中期确实没啥心情写代码……中期检查过了,校赛开始报名,初赛题还差一些,决赛题基本没开始搞。

整理了一下 Lutece 题面里公式下标写成 \_ 这玩意的显示问题,应该是原来因为 markdown 先自己渲染,然后再渲染公式导致的问题,现在没这个问题了,又产生后遗症了。

把所有 checker 用 testlib 格式重写了一遍,发现了很多恶心的问题,有些题没有传正确答案,验不了重写后的 checker 的正确性,有些 checker 写的也真是太恶心了……

下周省选,下下周 4C……

京吹还有剧场版还有利兹与青鸟看完了,十分感慨。看完了感觉蛮难受的,被真实感暴击。但是啥时候第三季啊。

Lutece 的 SRE 准备转位了。

下周要干啥

主要写一下中台,其实也不算中台了,大概只是一个 HTTP 包的前台……

04-02

这周干了啥

写中期报告,感觉自己毕不了业了。

在看京吹,也很好看。但是太真实了以至于想起小时候学电子琴和长笛的痛,很痛苦。

小时候也没学明白电子琴和长笛,但是练琴很痛苦。现在也是啥也不会,也很痛苦。

看完了实力主义至上教室,感觉典型立靶子打吧,反正很多这种爽番爽文都是立靶子打,但是这个设定为什么不写个大逃杀更爽……

典型例子:无能的奈奈

下周要干啥

希望能把简化版的中台搞定,然后用 CDOJ 的原数据进测试。

但是得先把杂七杂八的事情解决了……

3 月

03-27

所有重要的单元测试(编译和运行)都过了。第一个可迭代版可以发了。

距离 2021.2.27 正好过了一年零一个月,不过这已经是第四版了,所以可以认为实际编码其实也就一个月……

按照进入迭代的时间,可以认为这个项目始于 2022 年 3 月 27 日。

03-26

这周干了啥

中期检查要开始了。

3.24 晚上把编译 C++ 的部分调通了,单元测结束。3.25 大概把运行的逻辑写完了,没进单元测,但是应该问题不会很大(奶)。

真的准备试试,让 vjudge 代理前台感觉很有意思,但是 vjudge 方面会不会同意就不清楚了。

孤独摇滚真的很好看,女主性格可以说十分真实了。

(是谁在监视我的生活)

11 话封面图那个新宝岛真没蚌住

下周要干啥

希望下周能把运行的单测搞完。

因为要糊中期报告了(死)。

03-20

今天思考了一下项目方向。打算先实现一个较为简化的 cdoj-vjudge,把老 CDOJ 接到 vjudge 上的题目的测评问题处理掉。这个想法已经存在很久了,就是由 vjudge 等整合型平台包办前台业务,OJ 开发者只关注中后台业务处理。而且原 CDOJ 从教练的角度来说也不太希望公开,但是都已经公开十年了我觉得也没必要再收回去了。所以希望实验一下这样做的效果和收益。

这样的好处是,逻辑会变得超级简单。因为不会再添加题目,或者说有添加题目的需求可以全后台操作,而不与前台相关,所以很多鉴权和前端 CDN 等等杂事都可以不考虑了,用户管理也只局限于 vjudge 账号,攻击面较小,而且运维更简单了,毕竟前台也是有开发经验的开发者而不是用户,定位问题会更轻松一些。

execution-worker 也更简单了,毕竟原 CDOJ 没有很复杂的题型,而且不需要考虑数据的迁移问题,毕竟是 archive 的。继续迭代也好有个基准。

希望能继续迭代讲道理,因为 Lutece 就这么死的……

03-19

这周干了啥

时常怀疑是不是自己在做正确的事。和开发群群友说起写 judger 这事,感觉在技术方向和前景发展他们比我还悲观,然后我更悲观了,草。

目前确实是在写代码,甚至是核心代码,但是架构层面看着碗里想着锅里,总想写通用一些,但是又觉得现阶段没机器跑,不需要考虑这些,从开发层面和运维层面就开始左右互搏,导致写起来挺精神分裂的。这样是错误的,不要这样开发。

又听说 JS 的某个模块被供应链下毒,现在开始恐惧引用的包了。开源明明是减少开发者造轮子,并且合力优化某模块的方式,现在人与人最基本的信任都没了,还开个锤子源。很多时候,我觉得我们时常造出了一个自己都不能完全理解,或者说不能被人的理性控制的东西。比如网络,或者说开源,甚至计算机本身。我认为这是十分危险的,如果不谨慎使用和研究,极有可能反噬我们。

糖哥说想合写 Lutece,他毕设是一个神经网络,可能跟我的题目相关,但是数据跑起来效果不太好。写,都可以写。

这周说华为可能会赞助校赛。省选方案也出来了,亲手把 Pascal 删掉了,蛮感慨的。再见,Pascal。

孤独摇滚真好看。

下周要干啥

开始感到时间压迫的恐惧。要死了。

03-12

这周干了啥

校赛初赛题我负责的部分搞完了。

下周要干啥

感觉再不写来不及了。

03-05

这周干了啥

这周在被 xcpc-team-reg 折磨。

加了点后端功能,认证学生身份和支持队伍所属组织,今天刚和前端合上,蛮多东西要 debug 的。尤其是 CORS 太折磨了,还有 Cookies 跨域,可能应该用 NGINX 搞的,完全整不明白为啥不行。

上来测试就注册挂了,注册我改都没改,都不知道为啥会挂。然后还没复现,怪。

然后前端开发机不在我的开发机上,全手动 deploy 了。

我推荐所有人都去看一下 SLOW LOOP。

下周要干啥

close 一下 xcpc-team-reg 的 issue,但毕竟五月份才用。

初赛题还在出,吐了。

绑椅子上是不可能的,这辈子不可能的。

2 月

02-27

庆祝立项一周年。

虽然这一年也没干什么,今年再努力吧。

02-26

这周干了啥

装了一遍 Ubuntu Server,唯二出的问题就是不要连鼠标,选源的时候用 http 的,比如阿里云的源。用清华的 https 源莫名证书不对,很奇怪。

明白了一个道理,Stage 是在中台层面的抽象,发给测评机的请求只需要发 Phase 就可以了。然后就和 go-judge 差不多了……

更新了一下 xcpc-team-reg 的依赖,莫名发现了一个 nb 的 fsnotify,这样就可以监控程序新建文件什么的行为了。

又去打 USACO,怎么全特么是 DP 啊,佛了都,不想再打了。

开始读买的非文学性翻译理论与实践了。应该不会读得那么快。

校赛还有一个月。

下周要干啥

下周要把自己绑在椅子上写 worker。

02-19

这周干了啥

总之回学校了。

这周突然发现我忘考虑交互题了,统称 Stdin/Stdout 带管道的。Stage-Phase 那样的设计可能有点东西还要进一步细化。Run Stage 完事之后应该直接进 Judge Stage,但是如何分割运行过程是个问题。而且这么设计不方便合并数据组数很多的情况。

中台设计应该是这样的:先发一个 Compile 的 Stage 过去,再依次发 Run 和 Judge 的 Stage。那么这样就要保证 Run 和 Judge 的 Stage 要发给同样有 Compile 结果的机器,说实话我不知道这样会不会降低可用性。

这周大概感受了一下 Lyrio 的可用性,感觉比字节的基建可用性低多了,看到一些后端设计用 QUIC 我不太清楚怎么回事,感觉要一定设施支持,也可能是 TS 加成,总之可用性不高,后端的设计不太想参考了。

最近也是在想中型的 web 架构应该怎么设计,很难。

下周要干啥

这周也没什么干劲,下周再努力吧.jpg

02-12

这周干了啥

估期乐观了,实际上还有一堆事情没有解决。

这周在搞消息队列和 MinIO 数据同步那些事情,走了挺多弯路感觉。但是大概写法应该是可以确定了。

大概就是发送一整个请求,请求用 Stage 数组来描述,Stage 用 Phase 数组描述。一个 execution 请求只能在一台物理机上运行。之前考虑的是可以在多台物理机上运行,这样就涉及中间产物的移动问题,但对于在一台机器编译产物去另一台机器运行,或者另一个集群运行,感觉没什么好方法。

这个项目的意义应该在于可以应对所有单机黑盒测试问题了,通过自己编写工作流的方式。但是对于黑盒的集群测试,是没有办法的,需要换个方法,比如测评端提供 docker compose 和 k8s 的能力。

下周要干啥

希望下周能发版。

02-05

这周干了啥

先给大家拜个晚年,祝大家晚年幸福。

USACO 又打挂了,原因令人暖心。

决定把消息队列从 RocketMQ 换成 RabbitMQ,因为 RocketMQ 部署太麻烦了,有很多东西预设是有一台 nb 服务器的,比如上来就要 8G 内存。而且 RocketMQ 没有 docker 部署方案,所以溜了。

然后发现 RabbitMQ 的架构要重学,哈哈。重学链接,真不想看英文了。

RabbitMQ 用 docker 部署需要调个时区,用 -e TZ=CST 不好使,所以要把本机的时间配置挂过去。大概运行命令就像这样:

1
docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro rabbitmq:alpine

然后其实应该很多配置都应该从中台拉下来的,比如 MQ 的地址,用户名密码,队列名称啥的,但是先在文件配置吧,等中台好了再说。

说实话真有点后悔,应该去复刻 Polygon 的,全是业务层的代码,写架构层代码太痛苦了。

下周要干啥

目测下周进度快能发一个 execution-worker 的可迭代版本。

1 月

01-29

这周干了啥

这周摸了,在打工会战,顺便还装了四台电脑,明天还要打 USACO,哈哈。

下周要干啥

这周要干的

01-22

这周干了啥

judge core 应该改个名,叫 execution worker 了。

在想搭流水线的事情,但是感觉很难。

首先大概写一下对于一些概念的定义。

系统管理的东西分为两部分:题目(Problems)和任务(Tasks)。题目描述了需要解决的问题。题目又分为题面(Statements)和附件(Attachments)两部分。题面是对一个现实要解决问题的具体文字描述,附件是帮助理解题面所用的各种附加文件。题目应该是具体且无二义性的。任务是评价用户是否解决了这个问题的唯一标准,一个任务对应一个题目。任务包括方法(Methods)和数据(Data),方法描述如何评价用户的提交,形式是工作流,工作流用阶段(Stages)描述,阶段用步骤(Phases)细化,并且只由步骤组成。阶段和步骤都有输入(Input)和输出(Output),阶段本身并不对应什么,而每个步骤都对应一个进程的运行。对于一个进程的描述和限制与 libcontainer 中的描述同。数据包括测试用例(Test cases)和辅助工具(Utilities)。以文件形式参与黑盒测试的所有文件都称之为测试用例,而辅助工具是测试中必要的,替代裁判手动操作或其他功能的工具,在测试时发挥作用。

比较正常的一个 Task 会经历的三个阶段是:编译(Compile),运行(Run),评分(Grade),一般后两个阶段被统称为测评(Judge),我们把它们分开,评分阶段也叫检查(Check),是因为 OI 和 XCPC 赛制的区别,XCPC 没有部分分。

对应到 worker 上的动作,其实只有准备(Prepare)和执行(Execute)两个。每次处理一个 Phase。

下面就是一些细节了。对于每个步骤的输入输出,它一定是一个文件,但是比如编译步骤,产生的输出是需要缓存到下一个阶段结束的,运行阶段的输出也需要缓存到评分阶段结束,所以可以设置一个 Expire time 去管理每个阶段的产物缓存时间,又比如交互器 grader,如果源文件不变,这个二进制实际上不会改变(会不会有奇妙技巧能让选手通过某种手段把二进制就莫名改了……),因此它的缓存期和其他文件也不一样,这样就可以避免重复编译同一份代码带来的时间消耗了。

然后 Test cases 全部分发到各个测评机上,实际上是可以接受的,但这样就涉及数据同步问题,比如主节点接到了数据更新,如何高可用地更新从节点数据,实际上是 Raft 解决的东西了。不想让测评机承担太多检查数据,作为某个其他功能从节点等等这样的任务……

然后把所有缓存都扔内存里,这也涉及到缓存大小等等的问题,一种方法是 Run 前 Preload 进去。

每台测评机在执行一个步骤之前都要先准备好这个步骤所需的东西,有一个方案是在这个阶段同步数据,先给主端发送目前的 Test cases 的 hash,然后主端 response 需要更新的数据。

还有一些其他的东西,比如 Prefork Container,没有对比性能提升的数据,也不知道 dry run 下的情况。应该做一下 AB 测的。

还有其他的管理细节,比如如何在主端注册一个 worker,发心跳包什么的。

在这里,资源管理应该按照 CPU 核心和内存大小粗粒度描述后再用 CPU 时间,栈大小等细粒度描述。

下周要干啥

看看 RocketMQ 的 Go Client 怎么用,感觉官方版不太行。

不想让这个东西只能面向竞赛。但是也没找到啥其他卖点。可能可以放在 fuzzing 或者 CI/CD 上?

01-15

这周干了啥

初期检查完事了,老师觉得还行。

然后发现 Github Page 好像被墙了……刚整理完就被墙了有点惨……

然后重写了一下 judge core,发现如果要写得比较 general 的话需要一套流水线来描述 judge 的过程,感觉好难写……

MinIO 确实有点过度设计了,但是它可能香。

春妈井了,哈哈。

LOJ 上留的坑翻译得差不多了,但是有几个题 checker 和 grader 没有,这几个月想摆了。

下周要干啥

研究一下怎么搭这个流水线。

01-08

这周干了啥

回家了,初期报告写完了但是 PPT 没做。

把博客重新用 Github Action 搞了一下,换了公式渲染,因为原来 Icarus 依赖的 Hexo 版本有一个 XSS 的 CVE,所以直接换主题到了 NeXT,顺便修了一下评论,但是原来的评论全都无了……

还发现原来博客里引的许多链接都失效了,有些是把自己的博客下掉了,还有 HDOJ 倒了等其他问题……

还发现原来的博客有些地方写得过于啥b

然后发现 judge core 架构又要重写了,已经重写三次了……现在连个 0.0.1 可迭代版都无,有点崩溃。

下周要干啥

初期答辩希望能过