Lutece 重构周报(2021 年)

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

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

12 月

12-25

这周干了啥

江苏省赛结束了,USACO 也打挂了,WF 2020 翻译完了,初期通知也发了……

下周要干啥

写完初期报告之后回家……

12-18

这周干了啥

出题 DDL 基本赶完了,最后还是造了三个题零一道题除了标程,差点就要造第五道。这周又基本摸了,打会儿 USACO。

下周要干啥

应该能写点东西了吧……

12-11

这周干了啥

研究了一会儿 Octave,感觉有些神仙问题,比如 disp 一个整数前面会带一个空格,但是字符串不会,莫名其妙只能说。也大概确定了测评支持的语言吧,C/C++,Java/Kotlin,Python,Go,Rust,Octave。

然后大部分时间都在赶出题 ddl,一个人手造四个题,我真的哭死。可能还要造第五个,但是我不会。

下周要干啥

希望验题没事.jpg

12-04

这周干了啥

写编译部分的时候发现 MongoDB 的 ObjectId 里面有时间戳,而且是 32 位的,上网一查还没有要改进的意愿。俺寻思 ObjectId 也算个主键,告诉我 2106 年前肯定没问题,2106 年后有概率主键相同,即使数据不会保存 100 多年,这么说也挺反直觉的。两亿年后的事情我不会管,但是一百年之后的事情还是有能力管的。

所以估计最后主数据库就 PostgreSQL 了,对象存储用 MinIO,消息队列 RocketMQ。基本就算完成技术选型了吧……但是又有一些问题,比如测试任务组依赖应该怎么存,测试点重排使得 quick fail 怎么实现等等。

下周要干啥

心情简单.jpg

11 月

11-27

这周干了啥

总体来说,在抄 lyrio-dev/judge,但又没完全抄,抄得七零八落的。

既不喜欢 TypeScript 这种脚本语言,也恨 Go 没有面向对象……写得贼难受……

下周要干啥

接着写,已经不知道啥时候能进调试了……

11-20

这周干了啥

论如何每周都不重复地说这周摸了。但是又感觉摸着摸着写 60% 了。

下周要干啥

淦,怎么说都得进 judge core 的调试了吧。

我好想有流量回放定期压测的测试环境哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

11-14

这周干了啥

莫名在改很多细节,周末去 CCPC 志愿者了,没写。

下周要干啥

淦,怎么说都得进 judge core 的调试了吧。

11-06

这周干了啥

选好导师,企业和课题了。第一个五天计划完成了属于是。

下周要干啥

怎么说下周都得干点活了吧淦。

10 月

10-30

这周干了啥

选了导师,剩下基本又啥也没干,好咸。

osu! 1000pp 了。

下周要干啥

下周把编译部分写了。

10-23

这周干了啥

去绵阳了,这次 CSP 挺搞的只能说,不过绵阳还不错。主要是 U 盘中毒就很离谱。

毕设也开始选题了……

下周要干啥

赶紧选毕设导师。

10-16

这周干了啥

CSP 技术组开始干活了,今年好忙还要去绵阳准备考场……

交互题 grader 的 container 有些权限问题,不对劲了起来,发现自己又不会 Linux 操作系统了。

下周要干啥

下周 CSP。

10-09

这周干了啥

上周感冒了,这周加上国庆假期感觉啥也没干……

研究了一下多线程题的测评,感觉还是按 CPU 分配的好,需要限制一定数量的 PID。

下周要干啥

下周再努力吧。

10-03

这周干了啥

把所有题目测评的 pattern 写完了。然后进组了。

下周要干啥

下周再努力吧。

9 月

09-26

这周干了啥

最后的最后,一顿折腾,还是去哈工大直博了。但是全校的推免资格都没有,不知道怎么回事。

不知道怎么就进入了开局就糊一堆乱七八糟的东西的节奏。很多东西都想试试,比如分布式存数据,就像直接 MongoDB 做 shard,但是问题就在于没那么多机器,效率也不一定高。还可以提前预载数据到内存里,大文件 I/O 时间或许就可以减少,但是不管怎么说这个时间都是要消耗的。

最恶心的是多题型和 Go 有但完全没有的 OOP……

下周要干啥

下周再努力吧。

9 月

09-17

这周干了啥

哈工大(可能)找到导师了,找得十分自闭,南大浙大又把我挂了,把人挂了一次的学校一定会有第二次,加上不想去存储于是没报华科。中科院网络中心直接放弃了,看老师也不怎么发论文,很难受。华东师大还没有消息,毕竟 9.24 才报名结束。西交不报任何希望,毕竟鸽了夏令营。

judge core 感觉越写越离谱,写半个月没用一个 context 感觉哪儿有点不对……

下周要干啥

下周再努力吧。

09-12

这周干了啥

工大预推免过了,实习报告过了,不用答辩,去体测了,然后成绩没登上,不知道咋回事。

在写 judge core 了,很离谱。

下周要干啥

下周再努力吧。

09-04

这周干了啥

把实习报告等一堆杂七杂八的事情整完了。去清水河看了一眼老服务器,发现比我想象中的要惨,没法用了。

看猴番能看上头,我病了。

总之这周也没有太大进展,主要还是在写核心。

下周要干啥

下周再努力吧。

哈哈,完全笑不出来。

8 月

08-28

这周干了啥

这周也啥也没干,实习报告快写完了,哈工大面试也结束了。然后回学校了。

下周要干啥

下周再努力吧。

08-21

这周干了啥

这周把 core 相关的问题 close 了一下,包括时间限制,文件创建和权限限制问题。多线程多进程什么的并没有搞。大概原型已经完成了。

下周要干啥

写实习报告。哈工大面试。

08-14

这周干了啥

沙盒用 libcontainer 跑起来了,传统题和交互题的最小原型都跑起来了。顺便还整明白了 testlib 的交互测评里 tout 是干啥用的,是往 output 里输出用的……然后可以再将输出的东西扔到 checker 里去评分。

不过用 libcontainer 抽象的 process 和实际在程序内部测的时间有 8ms 左右的误差,倒也是可以接受。process 内部是用 wait4 等待进程运行结束的,用 rusage 获得进程消耗时间。

感觉跟操作系统复习课一样……

现在就差限制时间了,libcontainer 不会向 cpuacct 里写东西限制 CPU 时间。打算用 Tick 搞一下就完事。发现 Rlimit 的 CPU 也可以,但是限制太粗了,只能实现秒级的限制……

突然想起腾讯面试的时候,面试官问我怎么限制在沙盒里创建文件的数量,我答的用 Cgroups V2 的 blkio 限制,现在发现是错的……需要用 Rlimit 的 NOFILE 限制打开的文件描述符个数……而且这个只能限制打开的文件描述符数量,不能限制创建文件数量……

但是这个东西一般限制都很小(比如 1024)……不知道为啥在 LOJ 上会直接导致 System Error……

下周要干啥

细化一些实现吧……需要搞一下文件创建限制,Rlimit 修改限制,还得测一下多线程(进程?协程?),还可以搞搞通信题,其实实现上就是跑两次交互。GPU 题也想搞搞,但是好像 libcontainer 没有 GPU 相关的限制(或者是在 devices 里挂设备上去,我不懂)。

08-07

这周干了啥

这周干的最有意义的事情是把架构设计定稿了。

然后在想很多没用的东西……最后发现是真的没用。比如被 go-judge 绕进去,去看它三平台沙箱的实现,发现貌似目前没有三平台的需求,除非非得上 MSVC,倒也没必要看,而且实现方式不太喜欢。然后就是想一些有的没的的架构,比如容灾,多机房,可伸缩分布式什么玩意的,毕竟你电只有一台机器……属实浪费了一周。

架构大概分下面几块:

  • lutece-frontend:前端
  • lutece-backend:后端前台业务,实现业务功能(比赛,训练,题库,博客,站内信,Honor,etc.)
  • lutece-problem-platform:测评中台服务,处理所有测评请求和与题目相关的数据,可以理解成测评机的主节点
  • lutece-judge-core:单个实体测评机,继承测评机父类
  • lutece-vjudge-core:单个虚拟测评机,为了支持 Vjudge 业务设计的虚拟测评节点,继承测评机父类
  • lutece-oss:文件中台服务,管理所有文件

一条测评请求按下面路径处理:

  1. backend 收到请求,RPC 调用中台
  2. 中台把测评信息扔到中台搭的消息队列里
  3. 测评端订阅消息,收到测评消息后测评
  4. 把测评结果发布在 backend 准备的消息队列里,backend 订阅对应测评结果消息

两个中台都是高频使用的,并且业务也比较重,测评中台由于测评机和服务器的配置应该不同,因此做了这样的分离的主从设计。

Premature optimization is the root of all evil.

你软的实习报告要求出来了,崩溃了直接。

下周要干啥

下周争取把沙盒跑起来。

7 月

07-31

这周干了啥

终于把科四考完了 55555555

这周 HDU 多校,然后把 HDU 上唯一没 AC 的题搞定了。

总之这周没什么干劲,下周再努力吧(躺)。

下周要干啥

下周真的要开始写了。

07-25

这周干了啥

离职了,从北京回家。

下周要干啥

该写测评端了。大概要分几个中台去设计,还有一些细节没确定。

设想是测评中台主从架构,数据中台提供对象存储的能力存储测评数据,题面(包括引用内容),测评记录和博客等,必要时可以引入数据分析能力。

一种激进的解决方案是前台业务不设任何数据库和数据存储服务,全部调用中台能力通过 RPC 进行数据交换。前台业务只关注业务逻辑整合,比如比赛,题目,训练等业务逻辑。

下周还有省赛和多校……还得考科四……

07-17

这周干了啥

这周水逆,三个夏令营全被拒了,需求的 bug 修得乱七八糟,每天基本都晚上九点以后从公司走,团建吃完饭甚至还回去修了一个 bug。

好消息是获得了半个暑假,能把科四考了,还能写写 Lutece Next。

已经能和绝望和睦相处了……

下周要干啥

离职,交接,差不多该准备先把测评端设计掉了。

07-11

这周干了啥

(其实是 7.12 写的)

两个需求全进测试了,这周打算提离职。

中介疯狂上门看房,真的快被烦死了。

南大的笔试去了,计组和操统啥也不会,而且题也全是计组操统,目测是要完蛋,但是还是没发最终通知,只能等了……

Kitex 开源了,剩下的无事发生。感觉要做的实验很多……

还是没有太规整的时间看人月神话。

下周要干啥

测试收尾,上线,整理交接罢。

没想到半年过的还挺快的……

07-04

这周干了啥

(其实是 7.5 写的)

疯狂写需求……赶需求的时候像极了假期赶作业的我……PM 还来了一手倒排期,虽然最后排期并没有什么用。

柱爷有一个用分析 AC 提交用 ML 给题目打算法 tag 的 point,蛮有 argue 点的。

HDOJ 倒了,又回来了。

南大要周二必须参加模拟测试,否则就不能参加正式的线上测试,佛了,正好这两天两个需求全联调,真的烦,只能 WFH 两天。

下周要干啥

南大的笔试据说考 408+数学+英语名词翻译,彻底佛了,还是关心联调吧……

6 月

06-26

这周干了啥

西交夏令营没去,在上班,先给老师磕一个。

第一个需求前端全跑了,又排不上期了,第二个需求周一技术评审,技术分享也完事了,离职的事情也和 mentor 说了,计算所填导师差点没填上,感谢群友提醒……未来什么样确实也是未知数……

看了一下 GraphQL,但是感觉全都是洞,很难写安全,太难了。

Lutece 不知道怎么升级编译器版本,找不到柱爷,数学几何专题在准备了,《人月神话》在看了,但是也没有太多时间看,也就看了几章,总之这周过得很乱,心情也很乱,乱七八糟的事。

下周要干啥

下周南大浙大计算所全开奖,还是大周,离职倒计时一个月。

总之接下来一个月不太会碰 Lutece。

06-19

这周干了啥

更新完了 honor,这周又来一个大活,顺便技术分享。形策课作业还得写。

西交入营了,但是有点不想去……

前端需要有几个功能后端同步支持……但是排期大概是在八月,最近先规划一下吧……

发现一个 Go Web 框架 Iris,感觉比 chi 的中间件完善效率还高,打算 Lutece Next 用 Iris 做框架了……

大概的框架使用:

  • Web Framework:Iris(Hertz 开源了也可以考虑之后切 Hertz,但是还是要看实际收益)
  • RPC Framework:KiteX(希望它能在我离职前开源)
  • Database:PostgreSQL,MongoDB,Redis
  • Message Queue:Kafka or RocketMQ

下周要干啥

梳理需求,愣是看 prd 没看懂要干啥。活多又杂,有点乱套……

06-13

这周干了啥

这周更新了集训队的 honor,之前一顿好找,确定了是静态页面,偶然在 frontend 项目里搜了一下就找到了 honor 在哪儿,于是就更新了一下。

下周要干啥

下周技术分享,还要搞多校。

06-06

这天在校赛,甚至还是大周……

和南大 LANDS 组的老师聊了,让我报名夏令营好好准备……

5 月

05-29

这周干了啥

在写需求和技术分享……

夏令营投了挺多学校,根据学校要不要选最后方向成了。去 NJU 就去搞高性能网络,去 XJTU 就去搞 HPC,去 ICT 就去搞高性能网络或者 HPC,去 ZJU 就去搞图形学,不过大概率 ZJU 不要我,我也没啥图形学基础,总之跟摇骰子一样,摇,就嗯摇。

小需求没 QA 一直在等测,大需求数据没准备好也在挂起中。

技术分享……草我不会计组和计网了,面试咋办啊。

下周要干啥

需求,技术分享,校赛决赛

05-22

这周干了啥

这周部署了 WTFGame 到自己的华为云上,能跑起来了。整理了一下搭建过程。

这周初赛查重要整理了,但是感觉进度很慢,因为狗队在上海。

定容俩需求,真就闲的没事的时候总能给我整个大的……

图床新建文件夹了。

下周要干啥

不出意外要写需求,而且是起个新页从零开始的那种。真的那个需求看都看不懂……

05-15

这周干了啥

这周初赛运维,具体决赛之后小作文会说。

这周定容了两个需求……还被预定了一个技术分享……

下周要干啥

没事的时候把 XCPC Team Registration 的文档挪到 Github Wiki 上。

05-08

这天在上班,第二天去吃了顿饭……

4 月

04-29

这周干了啥

因为被拉去 ByteCamp 了,所以这周估计也没时间写了……趁有空赶紧补上。

系统终于上线了,还是找到了一些 bug 的。整理一下:

  1. JoinTeamRequest 中前端传入 string,但后端按 int64 进行解析导致失败。上线前队内测试发现,已经解决。
  2. 查询某队队员出现空记录,是错误使用了 make([]int64, x),这样会申请一段长为 x 的内存,继续 append 不会使用已经申请的内存,直接放入即可。上线前队内测试发现,已经解决。
  3. 前端修改学院信息传回 school 字段为空,是前端使用列表 get 学院 ID 时名称弄错了。上线前队内测试发现,已经解决。
  4. 注册和找回密码时发送邮件并没有先判断用户是否注册过,导致部分邮件发送非预期失败。后新增了判断逻辑。上线前队内测试发现,已经解决。
  5. 后端部分字段未转义导致 XSS 风险。后端已加转义。上线后发现,已经解决。

还有可两个改进点:

  • math/rand 改为 crypto/rand:但是谁也猜不到种子是啥时候,也用于非常重要的随机生成,所以没改。
  • 展示 Token 使用等宽字体:推行复制粘贴,也没让前端改……

这周柱爷组织启动 Lutece Next 了,有幸进到 Dev 组了,我直接下跪。第一个活是定位现在的 Judger 返回结果非预期过慢的问题……

别催,在做了

做的需求被 QA 折磨,最后还是今天过了验收(应该是),应该没啥事了。

下一个需求被终止了,需要重新定容……

下周要干啥

跟着 Lutece Next 走吧……

04-24

这周又忘了写周报,因为这天在搬家来着,一直没空写……第二天还要上班……

04-17

这周干了啥

上周学校开了会,定了校赛的大概时间,初赛 5.5。前端 Vingying 负责,今天联调+捉虫。

花了 90 买了半年邮件服务,又在阿里云上开了按量计费的服务器,但是对于工资来说这也不算啥了。

还是有一些点要注意的,比如 JSON 标准里对数字的支持是 double 型,make([], x) 会直接申请长度为 x 的数组什么的。

下周要干啥

下周必须要写需求了……估计没有啥进展……

04-11

这周忘了写周报了……草

04-04

这周干了啥

xcpc-team-reg 大概写完了,还处在一个差不多能用的状态。

用它编的初期报告很顺利。

写的用户服务完全是个笑话。

下周要干啥

抓前端,顺便调试一下。

3 月

03-27

这周干了啥

初赛初步定期为 5.1,tmd 原来排期整整排多了一个月,有没有什么几天速成前端的东西。

直接倒排期,发现 4.13 就得把前后端开发完,我完了。

想买本《人月神话》学习一下了……

这周没有特别大的进展,买了一年的华为云鲲鹏服务器,2 vCPU 4G 1M 一年 200 块还挺便宜的,但是 CPU 是 ARM 的(虽然没啥关系)。

不过 Debian 的版本比较低,Redis 在上面跑有数据损坏的 Bug,参考这里,然后去提工单和华为云对线被嗯嗯,顺便 Go 的版本也很低,需要手动卸载原版本然后升级。

新需求还是没定容,接着摸鱼。

现在 xcpc-team-reg 的初始化部分倒是调通了,获取学院信息的一个简单接口也调通了。然后就是写登录鉴权,太难了根本不会十分难受。想着拿这个项目搭一个脚手架,但是进展还是很慢。

找到了扔猫的那个游戏,没想到开源了,青回。

但是搭服看起来挺麻烦的……文档真的不全……

顺便被队友拉去 ByteCamp,在五一,Guest WiFi 又合体了。

还和组织对接人在 Lark 上尬聊

下周要干啥

解决一下登录鉴权的问题。如果有空写个博客记录一下。

下周是清明,希望能有些进展吧……

03-21

这周干了啥

人类史上最大最恶最绝望事件来了,学院要求写初期报告了。我就寻思我写的代码和文档都 L2 保密的,实习报告里面要求写实习内容,这咋写。

这周主要起了一个新项目 xcpc-team-reg,是一个 XCPC 组队服务,还在开发中。打算先用这个验一下 Lutece 的用户服务和队伍服务。

想用服务器测一下,但是没有服务器,哭了。

然后把这个放在实习报告里当成公司项目

下周新需求定容,下下周开始开发,跪了。

下周要干啥

完善 xcpc-team-reg 功能。

03-13

这周干了啥

这周写需求写吐了,横跨五个 repo,两个方法从同一个接口拿数据用了两种完全不一样的方式,两种结构,同一个修改改两次,人都崩溃了。

顺便找了找有没有学校能给我个读研的机会……然后发现太卷了基本没有……

然后得知小羊也在写 OJ 当毕设,说设计容量 500,我已经虚了……

这周没怎么写 model,主要还是大概设计了一下。但是感觉关系表太多了……

使用用户组来进行一定的权限控制,但是不想设计成 SYZOJ NG 一样的强权限控制。大概只是想让特定的用户组看到特定的比赛和训练这样,只有具有管理权限才能 CRUD 题目,训练和比赛。

这里建立训练和比赛的权限管理是否需要细分,还需要从需求出发。

在干活的时候深刻地体会到这两句话的意思,摘录一下。

do smth instead of nothing and stay organized

WRITE STUFF DOWN

所以,上来最好先莽他一发,说不定就把需求写通了。

下周要干啥

下周小周,应该可以结束 model 设计……

03-06

这周干了啥

这周没写用户管理,但是写了数据库 model。

  • Users:用户
  • Teams:队伍
  • Groups:用户组,做权限分离
  • Trainings:训练,与比赛分离,不排名,不计 rating
    • 可以设计一下更好的 UI
  • Contests:比赛,优先级比训练高,排名,计 rating
  • Submissions:提交记录
  • Blogs:博客,静态页面,并且把原来的 Announcement 合进来
  • Clarifications:训练与比赛内的 Clarification

站内信想了想算了,毕竟怎么样都能 QQ,或者从个人资料 get 到其他交流方式。这种容易洪泛的功能不太知道怎么设计才好。

还有 Honors 也是静态页面,做个接口能访问和修改就行了。

顺便复习了数据库怎么设计多对多关系……

还认识到了为什么虚拟机不能用作开发机……

MBP 真好啊,我也想整一个。

下周要干啥

这周接了两个需求,第一个需求还好,第二个需求要写死了……

下周准备接着写 model……

2 月

02-27

这周干了啥

这 Lutece 是一分钟也用不下去了,为了避免摸鱼,只能强迫自己写周报了。

上班要写日报,Lutece 再日报写不过来

今天把 Lutece 的本地仓库搭起来辣!

功能都实现完了再推 Github 上。

然后就没有辣!

(扔西瓜)

还是大概爬爬格子写个大体目标吧……

  • 主语言:Go(实现后将全部转 Rust,视情况还可能得重构)
  • 目标:高性能,Just High Performance
    • 期望实现标准:在比赛场景下,可以容纳至少 10000 人同时访问,90% 的访问时延小于 1 秒,无失败访问。
    • 说人话就是解决 C10K 问题。但是这里有点复杂,是要在双服务器下解决,两服务器在同一局域网下,第二个服务器(测评端)提供 DDL 保证的服务。
    • 合理是挺合理,但是不知道现有资源能不能实现,感觉有点悬。
  • 模块:
    • 题目:至少 CRUD 都有,总感觉从 CDOJ 开始就没有删除功能,不知道怎么回事就很怪。可能是因为涉及提交记录删除吧,但是感觉这个也不是瓶颈。
      • 测评类型:传统,交互,提交答案。打算先直接用 Simple Sandbox 了。
    • 比赛:先只有 XCPC,之后需要再加。
      • 看看有没有赞助再决定有没有其他赛制,比如 IOI 赛制。
    • 训练:把暑假前集训和课程需要的比赛都划分为训练,并设计更多功能满足需求。
    • 用户:希望和学校的学生认证关联起来,至少整个邮箱验证能改密码……
    • 博客:集训队内用,希望以后能有人更新。
    • 站内信:提供比赛时问答功能,希望能做成独立组件。
  • 其他相关需求
    • 安全性:是很重要,希望能在高性能的基础上解决。
    • 部署难度和迁移难度:原 Lutece 迁移到新版可能要花一定时间,原 Lutece 的数据是 GraphQL,不懂为啥要用这个。
    • 美观性:其实很多时候感觉,并不是一个设计变丑了用户说不好看,而是一个原有设计改变了,用户不习惯才说不好看。但是我不负责前端,不关我事。
    • 运维难度:有没有人应聘一下运维啊?
    • 题目维护:众所周知 Lutece 有两个问题,一个是题库问题,另一个是题目问题(没别的了啊喂)……之前的空题目需要删除,一些题目需要整理顺序,还有的要视情况加数据,加 checker 什么的,总之这个和建题库一样烦。

下周要干啥

下周先从用户管理开始写。框架是 chi,还没想用 RPC,如果有需要的话转微服务可能会用 Kite。测评端数据库是 MongoDB(题面啥的都放到测评端解耦,并且文档类型数据也不适合放在 RDB 里),Web 端的数据库 PostgreSQL。