按此教程操作,完成构建自己的评测系统用于后续阶段的测验提交,并熟悉评测系统的使用。下列步骤完成了 3 项工作:
- 准备 Git 环境
- 获取 exam-grading 源码
- 测验评分
Git 的安装可参考:1.5 起步 - 安装 Git 或 InfiniTensor 训练营导学阶段指导书
学员需要通过 exam-grading模板 创建自己的评分系统仓库:
NOTICE 推荐创建为private仓库
之后将创建的exam-grading仓库拉取到本地
git clone <repo-addr> ./exam-grading
cd exam-grading
该部分将通过给评分系统添加exams目录以演示测验评分系统的使用方法。
首先需要在Github上创建一个测试仓库(只需包含一个README即可),权限设置为 public
,否则之后测试拉取会因为没有权限而报错找不到仓库。创建好测试仓库之后可通过两种方式添加将该测试仓库添加至评分系统:直接目录和子模块
NOTICE 推荐使用子模块方式添加测试目录
通过直接目录的方式添加测试目录,需要学员将将目标测试目录克隆到 exam-grading 目录外(也就是 exam-grading 的同级目录):
git clone <target-test-repo> ./exams
cd exams
# 确保为最新
git pull
# 然后将目录复制进exam-grading
子模块方式则只需将对应测试目录以子模块的方式加入评分系统即可:
git submodule add <target-test-repo> ./exams
# 确保为最新
git submodule update --remote
NOTICE
exams
目录名写死,否则检测不到不会运行对应评分。
添加测试目录后,学员即可提交更改到远程仓库,评测系统将会自动运行,运行结果可以在仓库actions界面查看:
NOTICE 此处提交的内容为新增的
exams
目录,若使用子模块方式还会有一个.gitsubmodule
文件
目标运行结果:
同样按照以上步骤的前两步准备环境和创建仓库并克隆到本地,之后在 exam-grading
项目根目录中添加测试目录:
直接目录:
# 将learning-cxx克隆到exam-grading目录外(也就是exam-grading的同级目录)
git clone <target-test-repo> ./learning-cxx
cd learning-cxx
# 确保为最新
git pull
# 然后将目录复制进exam-grading
# 将rustlings克隆到exam-grading目录外(也就是exam-grading的同级目录)
git clone <target-test-repo> ./rustlings
cd rustlings
# 确保为最新
git pull
# 然后将目录复制进exam-grading
NOTICE 目标测试目录中存在 .git 目录可能会导致问题,删除后再试
子模块:
# learning-cxx
git submodule add <target-test-repo> ./learning-cxx
# rustlings
git submodule add <target-test-repo> ./rustlings
# 确保为最新
git submodule update --remote
NOTICE
learning-cxx
和rustlings
目录名写死,否则检测不到,不会执行对应评分。
专业阶段方向一的 TinyInfiniTensor
和方向三的 leaning-lm-rs
讲通过 exam-grading
进行评分。使用方式同样按照以上步骤的前两步准备环境和创建仓库并克隆到本地,之后在 exam-grading
项目根目录中添加测试目录:
NOTICE 可选通过"获取
exam-grading
模板仓库的更新"来对已有的exam-grading
同步远程模板仓库的更新。
直接目录:
# 将 TinyInfiniTensor 克隆到 exam-grading 目录外(也就是 exam-grading 的同级目录)
git clone <target-test-repo> ./TinyInfiniTensor
cd TinyInfiniTensor
# 确保为最新
git pull
# 然后将目录复制进 exam-grading
# 将 learning-lm-rs 克隆到 exam-grading 目录外(也就是 exam-grading 的同级目录)
git clone <target-test-repo> ./learning-lm-rs
cd learning-lm-rs
# 确保为最新
git pull
# 然后将目录复制进 exam-grading
NOTICE 目标测试目录中存在 .git 目录可能会导致问题,删除后再试
子模块:
# TinyInfiniTensor
git submodule add <target-test-repo> ./TinyInfiniTensor
# learning-lm-rs
git submodule add <target-test-repo> ./learning-lm-rs
# 确保为最新
git submodule update --remote
NOTICE
TinyInfiniTensor
和learning-lm-rs
目录名写死,否则检测不到,不会执行对应评分。
可在子模块内直接做题,之后先提交子模块仓库,再提交 exam-grading
的即可。也可选择在其它位置完成题目后,通过直接目录形式复制进 exam-grading
提交评分,或通过子模块方法添加目录后提交评分。
Git子模块的使用可参考 7.11 Git 工具 - 子模块
运行过程中产生的问题请查阅Q&A,或在微信群聊中咨询助教老师
# 删除子模块
git submodule deinit <target-submodule-name>
# 删除目录
git rm -r <target-submodule-name>
# 删除子模块相关文件(注:在exam-grading目录下)
rm -rf .git/modules/<target-submodule-name>
# 例子
git submodule deinit ./exams
git rm -r./exams
rm -rf .git/modules/exams
NOTICE 必要时需加上
--force
或-f
强制删除
由于人手一个评分系统,所以要同步原模板仓库的更新到自己这里步骤会稍显麻烦,当然最简单的方式就是重新根据最新的 exam-grading
建一个。不过接下来还是会提供 git 的操作方法:
-
首先需要在自己的
exam-grading
本地建立远端主机连接# 使用 SSH keys 连接 git remote add template <target-template-ssh> # 使用 access token 连接 git remote set-url origin <target-tempalte-url-with-access-token>
-
将
template
上的main
分支合并到本地端的main
分支# 获取远端修改 git fetch template # 切换本地 exam-grading 到 main 分支 git checkout main # 将 template 的 main 分支合并到本地 main 分支 git merge template/main --allow-unrelated-histories
NOTICE
--allow-unrelated-histories
参数因为 git 从2.9.0
开始不允许合并没有共同祖先的分支,不带此参数会报错:fatal: refusing to merge unrelated histories
-
解决合并产生的冲突,基本无脑选 incoming 即可
<<<<<<< HEAD ... ... # 本地 repo 的内容,不保留 ... ======= ... ... # template 合并的新内容,保留 ... >>>>>>> template/master
NOTICE 冲突解决不自信可以咨询一下助教老师,或图省事选择重新创建克隆
-
learning-cxx
第20题for (auto i = 0u; i < sizeof(d0) / sizeof(*d0); ++ i)
-
learning-cxx
第15题补充参考资料:不完整类型
-
本地测试通过,但云端却没过,不知道为什么?
这种情况请查看 actions 具体运行步骤中的输出查看报错
-
关于张量
-
在 Linux 上
xmake
构建learning-cxx
项目报错:undefined reference to 'pthread_create'
遇到以上问题一般是因为
libc
版本过旧,更新即可 参考链接 -
关于强转右值
所谓强转为右值,只是为了重载决议的时候能调用到移动的构造或者赋值,但是调用到之后干了啥事是全看实现的
-
关于
learning-cxx
第 23 题和第 24 题这题和上一题反复强调
sizeof(vec)
有 2 个目的:第一个是让学员意识到容器虽然把可变长的存储区域移动到了堆上,但它们的栈上占用并不小。单纯移动一个七八个容器组成的结构体就是不可忽略的开销了;第二是意识到vec<bool>
和vec<T>
如此不同 -
...