FAQ(常见问题)¶
您是否有此处未列出但您认为应该列出的疑问或问题?
考虑 添加问题 到常见问题解答。
如何让学生继续参加考试或再次参加考试?¶
可通过三种不同的方式让学生重新尝试或继续考试:
-
继续处理相同的考试副本: 需要做两件事: (1) 通过转到“学生”选项卡确保评估处于“开放”状态。如果考试“已关闭”,请单击“剩余”列中的铅笔图标以重新打开它。 (2) 确保学生有权参加考试。如果他们使用 PrairieTest 会话并有新的预留,则这是自动的,否则他们将需要 学生特定的访问覆盖。
-
开始新的随机版本的考试: 需要做两件事: (1) 通过在“学生”选项卡上选择学生现有的考试副本并从表格上方的“操作”菜单中选择“删除”来删除学生的现有考试副本。 (2) 确保学生有权参加考试。如果他们使用 PrairieTest,则需要注册新的预订,或者在 PrairieTest 环境之外,他们将需要 学生特定的访问覆盖。
-
制作自定义重试考试,并选择不同的问题: 如果许多学生要参加第二次机会考试,通常会使用此方法。您可以将原始考试复制到 ZJUI-Learn 中的新评估(使用评估“设置”选项卡上的“复制”按钮),并根据需要调整问题选择和访问控制。
我如何让学生在考试结束后查看他们的考试?¶
通过现代访问控制,配置完成后 可见性以进行评估或相关 PrairieTest 考试。
使用旧版访问控制,您可以添加 访问规则,如下所示:
{
"allowAccess": [
{
"startDate": "2015-01-19T00:00:01",
"active": false
}
]
}
参加考试的学生将可以在 startDate 之后直到课程实例结束时公开访问他们的考试,而未参加考试的学生将无法查看考试。学生将无法回答进一步学分的问题(由于 "active": false),但他们将能够以与最初进行考试时完全相同的状态看到整个考试。由于学生可以公开参加考试,因此应该假设所有问题都将发布到 Chegg 和 Course Hero 等网站上。为了让学生以额外的安全性查看他们的考试,请考虑仅允许在受控条件下进行有限的考试后访问(尽管这需要学生亲自访问并且不能在线工作)。
请注意,通过 "active": false 授予访问权限时,学生仍然可以访问和修改与评估问题相关的任何 工作区 中的文件。但是,他们将无法提交任何更改的工作区文件进行评分。
如何在学期内管理题库的开发?¶
编写和维护大量问题是一项艰巨的工作。有许多策略可以管理这个过程。伊利诺伊州 TAM 2XX 课程(力学入门序列)采用的方法是:
- 家庭作业问题总是在每个学期重复使用。假设这些问题的解决方案将由学生发布在互联网上,因此它们仅供练习。学生的家庭作业确实会获得学分,但它假设任何付出努力的学生都会获得 100% 的分数。
- 池中的一些问题被标记 为“秘密”。这些问题仅在考试时使用。考试包括一些家庭作业问题,以及有关该主题的秘密问题。秘密问题会在多个学期重复使用。仅在考试中心或类似环境中的高度安全条件下进行考试。
- 每个学期都会写少量的密题,一些较旧的密题会被移到作业中。这使得秘密池保持相当新鲜,并随着时间的推移增加作业池。它还确保作业和考试问题在主题和难度上真正具有可比性。
- 对于家庭作业,使用
maxPoints选项,这样学生无需完成所有家庭作业问题即可获得 100% 的家庭作业。这使得家庭作业变得相当长,部分是为了学分,部分是作为学生可以练习的一组额外问题。 - 在截止日期之前可以获得 100% 的学分,之后一周可以获得 80% 的学分,学期剩余时间可以获得 0% 的学分(但学生仍然可以练习问题)。
作为上述策略的一个例外,在 COVID-19 学期期间,所有考试均在不如面对面 CBTF 安全的条件下远程进行。因此,这些考试中使用的所有秘密问题都被视为立即“烧毁”并移至作业池。
学生在考试结束后是否可以复习考试?¶
由于涉及到权衡,不同的教师对于考后学生获得问题的机会有不同的看法。例如,考后复习可以让学生确保他们的作业得到正确的评分,并从他们的具体错误中吸取教训。另一方面,公开发布问题通常意味着每学期都需要编写和验证新的考试,这会占用其他课程活动的资源,并可能导致教师使用更少、风险更高的考试,并避免使用第二次机会考试等策略。
课程在实践中采取的三种策略是:
- 考试结束后,学生无法查看考试内容。这允许考试试题在学期之间重复使用,但不受学生欢迎,并妨碍他们对试题及其表现进行详细的考后分析。
- 完成考后开放获取。这很受学生欢迎并且易于实施,但需要教师付出很大的努力每学期编写和测试新的考试问题。
- 在受控条件下,考后的访问受到限制。例如,伊利诺伊州的 TAM 2XX 课程(力学入门序列)允许学生在与助教进行考试复习期间在安全的 基于计算机的测试设施 (CBTF) 内复习考试。这在学生中颇受欢迎(Chang et al., 2020),并且仍然允许重复使用考试问题。这种方法的一种修改形式是让助教在办公时间在助教的计算机上与学生一起复习考试。这是在基于 CBTF 的复习系统之前 TAM 2XX 课程使用的方法。
请注意,如果考试是在线进行的,例如在 COVID-19 学期期间,那么我们应该假设问题是公开的,因此没有理由不在考试后进行开放获取。
我如何查看学生对家庭作业问题所有变体的答案?¶
ZJUI-Learn 界面仅向学生显示问题的最新 variant(特定随机实例),以及对该特定变体的任何提交。
教师可以通过转到学生评估实例视图上的“日志”表(转到评估,然后“学生”选项卡,然后学生的“详细信息”,向下滚动到“日志”)来查看学生的所有过去变体。在日志表中,有一个名为“学生问题”的列,显示学生对该问题的看法的编号列表,例如 S-1#1、S-1#2、S-1#3 等。这些是向学生提供的该问题的第一、第二、第三种变体。单击这些编号的链接将显示特定的变体,以及学生对它们的答案。
学生答案的原始历史记录也可以在日志表的“数据”列中、从“下载”选项卡上的“XXX_all_submissions.csv”文件以及通过 ZJUI-Learn API 进行访问。
学期结束后如何让学生获得作业或考试?¶
您需要让学生访问已完成学期的课程实例本身以及该课程实例中的具体评估。
例如,假设 2017 年秋季已完成学期,现在是 2018 年春季。我们有一名学生 (student@example.com) 需要在 2018 年 2 月参加 2017 年秋季的期末考试。我们将延长 2017 年秋季课程实例和期末考试的访问权限以包括 2018 年 2 月,但仅限于 student@example.com。
首先,对于课程实例,为学生创建一个扩展:
- 转到课程实例的 发布 页面(管理 → 发布)
- 单击 添加扩展 创建新扩展
- 输入学生的 UID 并将新的结束日期设置为 2018 年 2 月 28 日。
- 保存扩展名
这将允许学生在原定结束日期之后访问课程实例。
其次,使用评估 访问 页面为具有 2018 年 2 月访问窗口的 student@example.com 添加 学生特定的访问覆盖。
如果您将旧版访问控制与 allowAccess 一起使用,请编辑评估的 infoAssessment.json 以添加 student@example.com 的部分:
{
"allowAccess": [
{
"credit": 100,
"startDate": "2017-12-14T00:00:01",
"endDate": "2017-12-22T22:10:59"
},
{
"uids": ["student@example.com"],
"credit": 100,
"startDate": "2018-02-01T00:00:01",
"endDate": "2018-02-28T23:59:59"
}
]
}
有关更多详细信息,请参阅旧版访问控制。
为什么用户的角色为 None?¶
角色为 None 的用户曾添加过该课程,后来自行删除。
任何在课程中做过任何事情的人的所有数据
- 即使他们放弃课程 - 将被保留,但有此指示。
他们的信息也包含在评估汇总中
统计数据。
如果未超过结束日期,为什么考试会关闭?¶
作为内置安全措施,评估将在 6 小时后自动关闭
学生不活动的情况。评估结束后,学生将
无法提供新的提交内容。这与结束日期是否
达到访问控制中指定的值。如果考试是带回家考试,
那么可以通过在 infoAssessment.json 中指定来禁用该功能:
{
"autoClose": false
}
请参阅自动关闭考试评估 了解更多详情。
我们如何为考试中心举行的考试提供备忘单?¶
要向学生提供备忘单,请将备忘单放在以下任一位置:
clientFilesCourse文件夹- 如果备忘单将在其他考试中使用,那就太好了。
- 位于
infoCourse.json文件所在的位置。
clientFilesAssessment文件夹- 如果备忘单仅适用于该特定评估,则很有用。
- 位于可以找到
infoAssessment.json文件的位置。
接下来,在考试的 infoAssessment.json 中,添加 text 条目
下列:
对于 clientFilesCourse 中的备忘单,请使用:
{
"text": "The following formula sheets are available to you on this exam:<ul><li><a href=\"{{ client_files_course }}/formulas.pdf\">PDF version</a></li>"
}
否则,对于 clientFilesAssessment 中的备忘单,请使用:
{
"text": "The following formula sheets are available to you on this exam:<ul><li><a href=\"{{ client_files_assessment }}/formulas.pdf\">PDF version</a></li>"
}
要了解有关文件存储位置的更多信息,请参阅clientFiles 和 serverFiles。
如何从 server.py 中引用 clientFilesQuestion 中的材料?¶
server.py 中的函数以问题路径作为当前工作目录进行调用,因此您可以使用相对路径访问 clientFilesQuestion 中的文件。例如,如果 clientFilesQuestion 中有一个名为 data.csv 的文件,则可以使用以下命令从 server.py 访问它:
def generate(data):
with open("clientFilesQuestion/data.csv") as f:
# do something with the file
详情请参见关于从server.py问题代码访问文件的文档。
为什么我的 QID 无效?¶
QID 代表给予包含以下内容的文件夹的 Question Identifier
问题信息——例如info.json、question.html 和 server.py
(optional)——在questions/中。如果拼写错误,QID 可能无效
或者根本不存在于目录中。同步时,这些问题就会被识别出来
并显示为错误。
Error: invalid QID: "question_name"
要解决此问题,请首先检查 questions/ 内的文件夹名称
然后,检查 infoAssessments.json 中列出的问题名称。任何一个
重命名文件夹或将评估中列出的名称更改为相同的名称。
更多详情请参见目录结构。
为什么我的 JSON 文件中有语法错误?¶
在同步过程中,所有 .json 文件都会得到验证。如果有任何语法问题
出现,则将触发错误消息。
最常见的错误是上一个条目后缺少逗号
在 infoAssessment.json 文件中。结果,会发现一个意想不到的令牌。
Error: Error in JSON file format: file.json (line 55, column 17)
SyntaxError: Unexpected token '{' at 55:17
{"id": "question_name", "points": [2, 1]},
例如,此错误将在以下情况下触发:
{
"zones": [
{
"title": "Easy questions",
"questions": [
{"id": "anEasyQ", "points": [10, 5, 3, 1, 0.5, 0.25]},
{"id": "aSlightlyHarderQ", "points": [10, 9, 7, 5]}
]
},
{
"title": "Hard questions",
"questions": [
{"id": "hardQV1", "points": 10} // <----- No comma, but another question
{"id": "question_name", "points": [2, 1]},
{
"numberChoose": 1,
"points": 5,
"alternatives": [
{"id": "FirstAltQ", "points": 10},
{"id": "SecondAltQ"}
]
}
]
}
],
}
更多详情请参见题目规格。
为什么在多个问题中使用 UUID?¶
在编写 ZJUI-Learn 问题时,复制现有问题是很常见的
提出问题并为新目的稍加修改。很多时候我们会忘记更新
uuid 位于与 v3 问题关联的 info.json 文件中。
因此,当我们尝试同步时,我们最终会收到重复错误
网站的问题库。
Error message: Error: UUID 7a323f4c-cafd-40b2-8576-7db18e3f439b is used in
multiple questions: question_name_uuid_original, question_name_uuid_duplicate
通过https://www.uuidgenerator.net/生成新的UUID并替换它
在新问题的 info.json 中将解决此问题。也就是说,必须要小心
采取以避免更改新问题的现有问题的 UUID
源自。修改学生正在使用的现有问题的 UUID
将创建问题的新变体。
有关更多详细信息,请参阅JSON 文件中的 UUID。
我必须采取哪些步骤才能访问外部评分器中的参数对象?¶
默认情况下,外部评分器将收到 data 对象内所有值的 JSON 转储,称为
data.json。该文件位于:
/grader/data/data.json
要访问 JSON 数据,请读入测试框架内的文件。
有关默认外部评分器文件系统的更多详细信息,请参阅外部评分问题中的评分过程部分。
为什么我无法使用 docker 启动 ZJUI-Learn?¶
预览 ZJUI-Learn 本地副本中的内容时,网络版本 由 Docker 容器提供支持。会议结束时,关闭 Web 浏览器或启动 Docker 容器的终端 不会阻止 ZJUI-Learn 运行。因此,在重新启动时 Docker版本的ZJUI-Learn,现有端口可能已被占用。 例如,我们会有:
docker: Error response from daemon: driver failed programming external connectivity on endpoint pedantic_mayer (cf92f23baa5c5fffc37c8d83990b2a3597143a2d4d518c9e62e3231d7521ceef): Bind for 0.0.0.0:3000 failed: port is already allocated.
为了解决这个问题,有多种不同的方法。特别是,我们有:
- 重启docker
- 单击任务栏中的鲸鱼图标,然后选择“重新启动”。
- 重新启动计算机。
- 使用 Ctrl+C 在终端中停止该进程,然后, 关闭终端应用程序。
为什么 < 和 > 等特殊字符会破坏我的问题显示?¶
HTML 规范不允许在页面上插入特殊字符(即 <、>、&),并且在问题中使用这些字符(例如内联代码)可能会中断渲染。要解决此问题,请转义字符(<、>、&,更多使用此转义工具),或者使用 source-file-name 属性将外部文件中的代码片段加载到 pl-code 中。有关更多信息,请参阅pl-code 元素文档。此外,您可以使用 <markdown> 标签,它将正确转义任何特殊字符。
为什么我无法使用 Docker Toolbox 连接到 ZJUI-Learn?¶
不再支持 Docker 工具箱。 Docker社区版需要本地运行ZJUI-Learn。
如何制作一个可以在许多问题中重复使用的块?¶
如果您想在许多问题中重复使用一段文本,并且可能需要替换一些参数,则可以使用 <pl-template> 元素。此元素允许您在一个位置定义模板,然后在许多问题中使用它。
Danger
接受和/或评分此元素中使用的学生输入的元素将无法与 <pl-template> 一起正常工作。模板应该只包含其他装饰元素。
当学生看到评分结果时,如何隐藏正确答案?¶
问题可以在info.json中指定showCorrectAnswer: false属性来完全隐藏正确答案框。有关此选项的更多信息,请参阅问题 info.json 文件的文档。
为了进行更精细的控制,PL 中的某些元素有自己的选项,用于指定是否隐藏各个正确答案(例如,pl-checkbox 具有 hide-answer-panel 属性)。并非所有元素类型都提供此属性(例如,pl-multiple-choice 目前不提供)。但是,要隐藏任何类型元素的正确答案,您可以在 question.html 文件中用 pl-hide-in-panel 包围特定的分级 pl 元素。
例如:
<pl-hide-in-panel answer="true">
<pl-multiple-choice ...></pl-multiple-choice>
</pl-hide-in-panel>
有关此粒度技术的更多信息,请参阅 pl-hide-in-panel 的文档。
我忘了设置 "credit":100,现在我的学生都是 0%。我该如何解决这个问题?¶
ZJUI-Learn 旧访问规则默认为零学分,因此放弃学分意味着学生将累积积分,但他们的百分比分数将保持在 0%。要更正此问题,您应该将 "credit":100 添加到 相应的访问规则。下次学生回答问题时,他们的百分比分数将被重新计算为正确的值(就好像他们一直拥有满分一样)。
要确定学生分数而不要求他们回答其他问题,您可以:
- 从“下载”选项卡下载
<Assessment-Name>_instances.csv文件。 - 编辑
"Score (%)"列以反映新的百分比分数。这通常是“点数/最大点数* 100”。 - 将
"Score (%)"列重命名为"score_perc",并删除除"uid"、"instance"和"score_perc"之外的所有列。 - 从“学生”选项卡上的“上传”菜单中选择“上传总分”来上传新分数。
通过 CSV 下载/上传更改总分只能在评估结束且学生不再进行作业后进行,以避免学生回答更多问题时覆盖分数的风险。
我更新了我的问题,但学生仍然看到旧版本。如何让学生看到新版本?¶
问题文件中的某些更改对于已经开始处理变体的学生不会生效。这些包括但不限于:正确答案值的更改、添加或删除评分元素、元素类型的更改(例如,用整数输入替换字符串输入)、评分元素的 answers-name 选项的更改、元素设置的一些其他更改(例如多项选择答案)、可评分文件的文件名更改或对 generate 函数的更新server.py。
强烈建议您避免对学生已经开始解决问题的问题进行类似上述的更改。但是,如果需要进行此类更改,并且您希望学生在此类更改后重置其变体,则可以通过以下两种方式之一进行操作:
- 要重置特定评估问题的所有变体,请转至评估页面,单击相关问题上的“操作”,然后单击“重置问题变体”。这将使迄今为止已创建且尚未完成的_每个_变体失效,学生下次加载问题时将获得一个新的变体。
- 要重置单个学生(或一小部分学生)的变体,请转到评估页面,选择“学生”选项卡,单击单个学生(或小组,对于小组评估)的评估,然后在问题列表中单击相关问题上的“操作”,然后单击“重置问题变体”。这将使仅针对特定学生或群体的变体无效。
这些选项都不会影响学生在之前任何变体中可能已经获得的分数。但是,学生可能已开始但尚未提交的任何开放变体作业都将丢失。
对于学生可能受到此类变化负面影响的考试和其他总结性评估,我们鼓励您考虑给予学生此类问题的学分。
当我打开某些 CSV 下载时,某些数据位于错误的列中¶
在 Excel 中加载某些评估下载文件(例如 *_all_submissions.csv)时,您可能会注意到数据出现在错误的列中或换行不正确。发生这种情况的原因通常是 Excel 的最大单元格大小为 32,767 个字符,并且并不总是正确解析复杂的 CSV 数据,特别是当字段包含 JSON 或特殊字符时。虽然 Params 列是最有可能的罪魁祸首,但其他列(例如真实答案、提交的答案或反馈)也可能受到影响。要处理这些文件,您可以使用 Python 中的 Pandas 来清理或重组数据,以便在 Excel 中更轻松地进行处理。例如:
import pandas as pd
df = pd.read_csv("PREFIX_all_submissions.csv")
# Strip the JSON Params data and save to a new CSV
df2 = df.drop(columns=["Params"])
df2.to_csv("PREFIX_all_submissions_no_params.csv", index=False)
# Write all the data (including Params) to an Excel file,
# while trimming the values in Params that are above the Excel limit
df.to_excel("PREFIX_all_submissions.xlsx", index=False)
我有应该包含在工作区和测试中的文件。如何存储这些文件以避免重复?¶
在这些情况下,您可以将文件存储在问题的 tests 目录中,并通过将它们添加到 _workspace_files 列表来从工作区引用它们。例如,假设我们想要将 xyz.c 和 xyz.h 包含在工作区主文件夹中以及自动评分器的 /grade/tests 中。为此,请将这些文件保存到 [QUESTION DIRECTORY]/tests,并在 server.py 中包含以下行:
def generate(data):
data["params"]["_workspace_files"] = [
{"name": "xyz.h", "questionFile": "tests/xyz.h"},
{"name": "xyz.c", "questionFile": "tests/xyz.c"},
]
通过 CSV 上传成绩时,上传过程无法匹配某些组名称。为什么?¶
手动评分文档 列出了使用 CSV 文件进行手动评分的流程,其中包括下载 CSV 文件、在本地更改文件中的分数/反馈(通过 Excel 或其他工具),然后上传更改后的文件。但是,当小组评估包括由带有前导零的数值或可解释为日期的字符串组成的组名称时,Excel 可能会更改组名称以匹配这些值的自身表示形式(例如,通过删除前导零)。这会导致上传过程无法识别组名称。
有几种可能的方法可以解决这些情况:
- 您可以将其导入到空白的新工作簿中,而不是直接在 Excel 上打开 CSV 文件,同时确保组名称列使用“文本”数据类型。更多详细信息可以在Microsoft 支持页面 中找到。
- 如果出现此问题的群组数量较少,您可以手动编辑 CSV 文件,将群组名称更新为正确的名称。请注意,您需要确保 Excel 将您输入的名称解释为字符串。确保这一点的一种方法是在 Excel 上设置时在组名称前面添加撇号,例如
'0123。
- 或者,您可以完全删除
group_name列。虽然该列用于将行与特定提交匹配,但如果未找到该列,则可以使用其他列(例如submission_id)来标识该行。
避免此问题的一种方法是取消学生指定自己的组名称的能力。这可以通过评估配置中的设置 "studentGroupChooseName": false 来完成。设置此选项后,所有学生创建的组均以默认模式 groupXXX 命名,其中 XXX 是整数。这种模式通常不会导致电子表格应用程序出现问题。
我的问题中有一个自定义元素或输入。学生在离开页面时总会看到警告,即使他们没有进行任何更改。我该如何解决这个问题?¶
发生这种情况是因为 ZJUI-Learn 跟踪问题表单中包含的所有输入元素的更改,并在学生尝试离开页面时显示警告(如果其中任何元素发生更改)。此跟踪基于首次加载问题时这些输入元素的值。如果您有由 JavaScript 代码延迟初始化的自定义元素或输入(例如,使用异步脚本或超时),ZJUI-Learn 可能无法正确捕获其初始值,从而在检查更改时导致误报。
有两种方法可以解决这个问题:
- 如果您不希望 ZJUI-Learn 跟踪特定输入元素的更改,则可以将
data-skip-unload-check="true"属性添加到这些元素。这会将它们排除在变更跟踪机制之外。请注意,在这些情况下,学生不会收到有关这些元素未保存的更改的警告。
- 如果您希望 ZJUI-Learn 将初始值捕获推迟到自定义代码运行之后,则可以将
data-deferred-initial-value="true"属性添加到特定输入元素。这将告诉 ZJUI-Learn 等待,直到代码首次设置这些输入的值属性,然后再捕获其初始值。为了使此功能发挥作用,您的代码必须确保在加载问题后的合理时间内设置输入值属性,并且它们始终在学生开始与问题交互之前更新一次。
请注意,此功能期望受影响的输入元素(未跟踪或延迟)在问题表单中具有唯一的名称,最好是 hidden 类型。将此功能与同一问题中可能有多个实例的自定义元素一起使用时应特别小心,以确保每个实例使用不会与元素的其他副本重叠的唯一输入名称。