oiTerminal

oiTerminal

简介

能够通过命令行 打oj比赛

开发进度

  • codeforces 已经完全支持 分析题目,上传,获取评测结果
  • 其它oj准备开工

对任意oj都支持本地的代码测试了

相关项目

cf-tool

idne

cfTerminal

spider

开发过程中的一些想法

首先 cfTerminal 是基于idne开发的

而本仓库也是收到 spider 启发而开发的

idne -> cfTerminal

robobrower 把我们需要的浏览器模拟完成了,感谢!这也是这个仓库运行起来的体验比oiTerminal稳定,实际是因为网络环境不太好的时候,oiTerminal会报网络错误

idne 上次阅读有些久了,没太多印象了。

  1. 大概有重排列一下它的代码,修复了time使用的问题,修复了不能提交比赛时代码的问题。

  2. idne 有一个缺点是,用户每次都要多输入很多信息,以及每次都需要运行“环境命令”,通过从用户使用的角度反向思考,改动了接受的参数,并且通过复制脚本省去环境命令

  3. 如果使用过idne,你可以发现,结果文件都放在项目根目录了,既没有.gitignore,也感觉有点乱。解决的方法是 全丢到dist文件夹里,并且让config.json不进版本,所以创造了模板_config.json

  4. 解决了一下 新出的题目名,原来都是单字母,现在出现了 D1,D2这种题目名

  5. 原来是靠拼接字符串生成的测试shell脚本XD,然后我改成了 接受参数的通用shell脚本

  6. 简化了依赖,虽然不必要,用argparse代替click,毕竟原来就稍微用了一下

  7. 把上面 复制测试和提交文件,改为了 用软链接。

  8. 设计了language.json 简单键值对,可以 控制来做多语言

然后这样可用度很高了,我就没啥动力继续改下去了。

spider -> oiTerminal

本身spider那个项目就是一个支持很多oj的项目

感觉我主要做的是删代码XD,然后移动代码。

  1. 首先还是说毕竟本身不是用于打比赛的,我把题目分析样例数据和测试的部分移动了过来

  2. 我想尽力 支持跨平台用py代替sh,但实际代码中还有调用linux命令的,例如cat,例如diff,XD,不过我转念一想,现在不是都有ubuntu on windows了吗,还有啥支持原生windows的必要,2333 现在是py不是sh了

  3. 做一些用户使用的工具,目前新做的中最有用的就是lang.py可以查看本地支持的语言,和远程的语言键值对(用于配置)

  4. 因为这边是基于一个Base设计的,我在第一轮修改的时候,也没有大改,主要增加我需要的功能为主

  5. 这里没有用特殊的浏览器,这里就靠纯获取+bs4来提取页面。

  6. 这里说是有cookie优化,实际只有提交部分有,并没有做本地cookie存储,未来可能会支持?

  7. 加个thread 分析题目,就几道题 也快不了多少

  8. 后来我想的还是再增加几个我想打的平台,所以要先大改一下结构。

  9. 我遇到的一个问题,有些操作可能大多平台都有,但是从性质上来说的访问层级不是很适合在公共层级。比如判断提交结果,我的想法是,要么放在最接近用户交互的层次上,要么放在具体实现里,总之不要放在用户和具体实现的中间共用交互中。还没有写更多oj支持,还不知道这样的想法是更好还是更遭

  10. 第二是属性归类,和方法外置,比如结果是对是错,不要放在contest层,应该直接丢在result 的model里,而判断丢在外层,写入丢在具体实现

  11. 上面几个问题是,层级划分 和 重复代码的处理如果出现冲突应该怎么办。我的另一个支援的办法是,更多model,增加type hint,增加与层级无关的util,比如像原本提供的网络访问,我还提供了 oj名字 类名,支持的类,lang的接近静态获取的类

  12. 做一些常量提取,还没完成,还有一些残留

  13. 尝试增加自动化测试,首先是以前没有相关经验,还不知道多少合适,已经调通过一次,但是遵循 建议先 测试样例,后代码的写法,写得我反而更难受了,测过了一波后,决定先放弃,还是先纯编码的方式。最后再补上测试

  14. 受到cf-tool的启发,考虑动态获取结果,因为cf的api不会获取进度,所以要么分析网页(idne之前用过类似的),要么就通过websocket却获取,暂时未实现

  15. 受到cf-tool的启发,决定之后采用更舒适的配置方式? 去增加一个config.py, 尚未实现,也就有考虑是否有必要加入sqlite,还是继续json

  16. 在json设计读取中 采用 类和json之间转换,减少字符串操作。

  17. 感觉cf-tool的自动更新,没必要

  18. atcoder的题目名称和url真的毒瘤XD TODO

  19. 还要再增加 problem.py支持

  20. 其中有一点体验是,你其实是要把各种不同的oj,接入进来再开放给用户调用你的接口,所以在公用部分,我的设计喜欢尽量松(Base部分),因为如果把实现具体化到各个OJ里,那么最多也就重复代码多,不太会因为未来OJ的特殊改动原来其它OJ的代码,如果放在更表层(也不是Base),大概是Core的部分,那么这里可以大不了加一点if处理一下特殊情况。总之觉得在Base处丢过多东西总是不太妥当,毕竟我无法预知未来的OJ的格式