快速入门
问答题制卡目前支持2种类型的文本制卡:问题答案不同行、问题答案同行。
问题答案不同行
这是一种非常常见的材料类型,即问题和答案前后按顺序出现,并且不在同一行内。
这种类型材料如果问题和答案开头部分都有明显的标记符号的话,可以很容易地通过正则表达式
来自动匹配 问题和答案起始位置并提取出问题文本和答案文本。
下面以一些典型的文本材料来举例说明。
类型一:列表型
文本材料示例:
1、Do not teach fish to swim.
不要班门弄斧。
2、Experience is the best teacher.
实践出真知。
3、Faith can move mountains.
精诚所至,金石为开。
4、Haste makes waste.
欲速则不达。
5、He would climb the ladder must begin at the bottom.
千里之行始于足下。
6、It is never too late to mend.
亡羊补牢,犹未为晚。
制卡参数填写示例:
制卡效果展示:
类型二:问答型
文本材料示例:
问:什么是地球上最高的山峰?
答:珠穆朗玛峰。
问:谁是著名的相对论物理学家,提出了相对论理论?
答:阿尔伯特·爱因斯坦。
问:金星的英文名是什么?
答:Venus。
问:梵高是哪个国家的著名画家?
答:荷兰。
问:人体最大的器官是什么?
答:皮肤。
制卡参数填写示例:
制卡效果展示:
类型三:Markdown标题型
上面是用的纯文本txt格式的例子,本软件也支持使用Markdown格式文本制卡,并支持保留Markdown中设置的语法样式。
Markdown 是一种轻量级的标记语言,可用于在纯文本文档中添加格式化元素,比如设置标题、加粗、斜体、插入图片、表格、公式等,使用户可以专注于文字内容,同时也能做出美观大方的排版。Markdown是一种非常流行的格式,已经被众多笔记平台支持,如Obsidian、思源笔记、Logseq等等。
在Markdown中,使用#
开头的符号作为标题的标记,如# 一级标题
。因此,可以使用标题内容作为问题部分,标题下的子内容作为答案部分制卡。
除了使用标题语法制卡外,本软件也支持使用其他Markdown语法制卡,如有序列表(1.)、无序列表(*,-,+)、引用(>)等,甚至用户也可以自己定义匹配模式。
文本材料示例:
## 什么是三次握手 (three-way handshake)?
![three-way handshake](https://minio.kevin2li.top/image-bed/wiki/20240729090500.png)
- 第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
- 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;
- 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
## TCP建立连接可以两次握手吗?为什么?
不可以。有两个原因:
首先,可能会出现**已失效的连接请求报文段又传到了服务器端**。
> client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。
其次,两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号。
还有就是两次握手会给SYN flood攻击提供机会。
扩展阅读: 什么是SYN攻击?https://zhuanlan.zhihu.com/p/360479307
制卡参数填写示例:
制卡效果展示:
类型四:自定义正则匹配
上面列举了一些典型的文本材料类型,但是仍然有很多的文本不属于这些类型,为了尽量兼容更多的文本类型,本软件支持用户自己编写正则表达式来匹配文本。
只要你的文本材料的问题开头部分有明显的特征,并且可以用正则表达式表示,都可以支持制卡。
如果你对正则表达式还不了解,可以看下这个教程:正则表达式30分钟入门教程
文本材料示例:
题目1:什么是地球上最高的山峰?
回答:珠穆朗玛峰。
题目2:谁是著名的相对论物理学家,提出了相对论理论?
回答:阿尔伯特·爱因斯坦。
题目3:金星的英文名是什么?
回答:Venus。
题目4:梵高是哪个国家的著名画家?
回答:荷兰。
题目5:人体最大的器官是什么?
回答:皮肤。
使用自定义正则匹配制卡的关键在于寻找问题(和答案)开头是否有明显的模式特征,并用正则表达式表达出来。
在这个材料中,我们发现:
- 所有题目开头都有明显的特征,即都是以
题目
字符后面加一个阿拉伯数字来标记问题开始,那么我们的问题匹配模式就可以用正则表达式题目\d+
来表示(\d
表示0-9的数字,+
表示数量为1个以上)。 - 所有答案开头都有明显的特征,即都是以
回答
字符作为答案开始的标记,那么我们的答案匹配模式就可以填写回答
。
制卡参数填写示例:
制卡效果展示:
问题答案同行
这种类型的材料问题和答案位于同一行,通常为比较简单短小的材料,可以通过指定分隔符来区分问题和答案部分。
下面同样以一些例子进行说明。
类型一:普通分隔符
如果你的材料问题和答案之间有明确固定的分隔符,可以使用这种方法。
文本材料示例:
1. 金星的英文名是Venus。 答案:正确
2. 梵高是荷兰的著名画家。 答案:正确
3. 人体最大的器官是心脏。 答案:错误
在这个材料中,问题和答案可以用答案:
这个符号来分隔开。软件也内置了一些常用的分隔符号,如逗号、分号、制表符等等,也支持用户自定义分隔符。
下面是针对这个材料的制卡参数填写示例:
制卡效果展示:
类型二:正则分隔符
如果你的材料问题和答案之间没有明确固定的分隔符,但是可以用正则表达式来匹配出分隔模式,可以考虑使用这种方法。
文本材料示例:
draw away 拉开;引开;离开
draw aside 拉到一边
draw back 收回(已付关税等)
draw into 使卷入
draw lots 抽签,抽签决定
在这个材料中,希望将英文部分作为问题,中文部分作为答案 ,但是中间没有明显的固定的分隔符用来区分,因此无法使用上一种类型的方法。但是可以使用正则表达式来匹配中文字符作为分隔线。
本软件内置了很多常用的正则分隔符,包括中文字符集、大小写英文字母等,用户可以直接选用,如果没有符合条件的,也支持用户自行编写正则表达式。
下面是针对这个材料的制卡参数填写示例:
制卡效果展示: