使用 space-vim-dark 一键配置、美化vim编辑器

一直以来我都使用一些成熟的配置文件来帮助我配置、美化 vim 编辑器,然而我原来使用 的 spf13-vim.sh 已经很久不更新了,它的插件列表中有些插件已经不能正常下载了。所以 我想寻找它的替代品,最后发现 space-vim-dark 还不错。 space-vim-dark 基本介绍 经过我的寻找,找到了一个比较好用且美观的配置文件 space-vim-dark。这个 space-vim-dark 可能是国人编写的 vim 配置文件,它能很好使得 vim 适应暗色模式。 先 贴出仓库地址:https://github.com/liuchengxu/space-vim-dark 这是它的效果图,整体 看还是不错的。 用它配置、美化 vim 编辑器 设置 space-vim-dark 非常简单,你只需要在你的 vim 插件管理器中添加下面的设置。 Plug 'liuchengxu/space-vim-dark' 整体使用下来,我觉得该有的插件还是有的,并且用起来顺手不少。 加入额外配置 在~/.spacevim 中可以加入你自己的一些配置。

2021年11月22日

求解三维装箱问题的混合模拟退火算法的实现 MATLAB

由于要数学建模中需要解决一个三维装箱的问题,我经过搜寻选定了张德富教授等在计算机 学报上发表的《求解三维装箱问题的混合模拟退火算法》这篇论文作为解决问题的理论基 础。 该论文的摘要如下: 提出了一个高效求解三维装箱问题(Three Dimensional Container Loading Problem 3D-CLP)的混合模拟 退火 算法 .三维装箱问题要求装载给定箱子集合的一个子 集到容器 中 , 使得被装载 的箱子总体 积最大 .文中介绍 的 混合 模拟退火算法基于三个重要算 法 :(1)复合块生成算法 , 与传统算法 不同的是文中提出的复合块 不只包含单 一 种类 的箱子 , 而是可以在一定的限制条件下包含 任意种类的箱子 .(2)基础启发式算法 , 该 算法 基于块装 载 , 可以 按 照指定装载序列生成放置方案.(3)模拟退火算法,以复合块 生成和基础启发式算法为基础, 将装载序列作为可行 放置 方案的编码 , 在编码空间中 采用模拟退火算法进行搜 索以寻找问题的近似最 优解 .文 中采用 1 50 0 个弱异构 和 强异构的装箱问题数据对算法进行测试 .实验结 果表明 , 混合模拟退火算法的填充率超 过了目前已知的 优秀算法 . DOI号: 10.3724/SP.J.1016.2009.02147 ...

2021年9月30日

TransRepair: Automatic Testing and Improvement of Machine Translation(机器翻译的自动化测试和改进)

最近,我阅读了一篇名为 TransRepair: Automatic Testing and Improvement of Machine Translation 的研究论文。该论文介绍了一种名为 TransRepair 的方法,用于 在软件测试领域下自动测试机器翻译模型。下面,我将从几个方面对论文的内容进行总结, 并讨论其中的关键点。 TransRepair 简介 TransRepair 是一种用于自动检测和修复机器翻译软件一致性问题的方法。它提供了黑盒和 灰盒两种方法来解决机器翻译软件的一致性问题。TransRepair 的主要步骤包括生成测试用 例、创建测试准则和自动修复过程。该方法提供了清晰、严谨和详细的测试用例生成算法, 并采用了四种句子差异的量化方法进行比较。此外,TransRepair 还运用了结构一致性原理 作为断言,并提供了全面的实验设计和多样化的结果。 关键问题的理解 一致性问题是指机器翻译软件在处理一组具有相似语义和结构但某些特定词语上略有不 同的句子时,在对应翻译句集合中的某一句或几句中的某个或几个部分出现的语义、结 构不一致的现象。 TransRepair 生成测试用例的方法是对输入的原句进行词语替换,形成突变句组。为了 实现这一操作,TransRepair 使用了词向量模型来计算词语之间的关联性。在选择候选 词后,还会将其带入句子中进行成分分析,以确定句子的语义和语法是否发生较大变 化。 在验证测试用例输出句子对的一致性时,TransRepair 首先使用 Widiff 进行字符串成 分的差异性比较分析。为了增强相似度量化的可靠性,TransRepair 还构造了原句和翻 译句中涉及的差异成分的部分删除集合,并计算集合中每个元素之间的相似度,选择最 大相似值。论文中使用了四种不同的方法来量化相似度,其中部分方法与之前提到的 SIT 方法有相似之处。 论文中的实验设计具有独特的特点。它首先提出问题并对解决方法进行探讨,然后围绕 这四个问题设计实验并提供适当形式的实验数据。实验从多个角度论证了该方法的有效 性,包括准确度、有效性、修复能力以及与人工方式的对比等。实验数据的呈现直观易 懂。 TransRepair 在处理阈值上与 SIT 方法不同。它通过机器小步遍历运算来获得统计上 最优的阈值,并采用人工辅助和统计学分析的方式进行一致性判别,其阈值设定逻辑更 具说服力。而 SIT 方法的阈值设定大多依靠经验,说服力和可操作性较低。 在 TransRepair 中,自动修复可以分为黑盒和灰盒两种方式。黑盒对应于 Google Translate,由于该软件未开源,对于输入输出的相关参数了解有限,因此只能对输入 和输出本身进行操作。灰盒对应于 Transformer,它的源码和训练集可获取,因此可以 对其输出结果的可能性进行把握,并在训练集和模型结构上进行修复操作。 TransRepair 的优势在于对一致性问题的自动检测和修复。该方法具有高准确度、可行 性和可复现性,这与其准确的实施方法以及对现有方法缺陷的考虑和补充密切相关。然 而,该方法的效率较低,有效性仅限于一致性问题。 总体而言,论文 TransRepair 介绍了 TransRepair 方法作为一种有效的自动测试和改 进机器翻译软件的方法,特别解决了一致性问题。论文详细解释了该方法,并提供了实验证 据和比较分析。 ...

2021年9月30日

Structure-Invariant Testing for Machine Translation (SIT) 论文阅读总结

我之前阅读了 Structure-Invariant Testing for Machine Translation 这篇论文,它提 出了一种关于机器翻译软件系统鲁棒性问题的检测方法。下面我将从几个方面详细介绍我对 其中内容的理解。 主要内容 SIT 是关于机器翻译软件系统鲁棒性问题的检测方法。这种方法利用了一个蜕变测试中的蜕 变关系,即"结构不变性"。通过选择原始句子、生成相似句子、从翻译软件获取结果、进行 成分解析并量化句子差异、根据设定的阈值筛选并发现问题,SIT 可以高效地检测出机器翻 译软件系统的鲁棒性问题。根据实验结果,SIT 在 19 秒内可以处理 2k+句子,并且对于 Google/Bing Translate 的准确度达到了 70%。然而,仍有提升的空间,可能是由于阈值选 择的原因。 对几个关键问题的理解 为什么机器翻译软件存在鲁棒性问题? 机器翻译软件系统的核心模块通常采用深度学 习方法或技术。深度学习模型中每层的维度较高,导致训练模型在向量空间中对不同标 签区域的界定可能模糊不清。当输入值接近边界时,稍微做出微小改变可能导致模型输 出剧烈变化。 什么是结构不变性? 结构不变性是指经过对某种语言的句子进行一些特定且微小的词 单位修改后,其语义和语法上的结构在转换为对应翻译后通常保持不变。结构不变性是 研究机器翻译软件系统相关问题的经验和统计学意义上的一个切入点。 为什么要引入结构不变性? 引入结构不变性是为了进行蜕变测试,以探索机器翻译软 件系统的鲁棒性问题。引入结构不变性的目的有两个:一是由于自然语言关系和变化复 杂多样,难以得到一种通用的测试定理作为基准进行测试,因此通过控制变量,得到类 似于经验或统计意义上正确的起点,展开测试研究;二是自然语言相关测试的测试用例 难以人工构建,引入结构不变性可以方便地利用现有少量样本生成大量测试用例。 如何利用结构不变性生成语义与语法相似的语句? 在 SIT 中,使用了 BERT 模型来生 成语义与语法相似的语句。SIT 依赖于 BERT 的大型语料训练以及遮罩和双向反馈学习 等技术,以抑制词语替换后整个句子的语义改变或不符合语法和使用习惯等问题。SIT 通过在 BERT 之后增加一个轻量级的分类器来辅助生成预备替换词语的候选列表。 如何量化句子的差异以判断机器翻译软件系统是否存在鲁棒性问题? SIT 使用了三种 方法来量化句子差异:字符串差异分析、成分解析树分析和依存解析树分析。SIT 直接 对翻译软件的输出结果进行以上三种分析,并对它们的效果进行比较。然而,这三种句 子差异分析方法都有一定的局限性,可以在进一步的工作中探索综合使用这三种方法进 行判定的方式。 SIT 具有哪些优势?有哪些不足? 在论文中,作者讨论了 SIT 的优势和不足。总的来 说,SIT 的优势在于其能够检测多种类型错误(未翻译、过度翻译、错误调整、逻辑不 清)。然而,我认为其测试用例的生成方式、错误量化和检测方法相对粗糙,导致实验 下准确性并不高。修复和阈值设定需要人工参与,这也是其另一个不足之处。 SIT 可以有哪些应用? SIT 主要应用于对运用了 AI 模型的机器翻译软件系统进行鲁 棒性测试。通过 SIT 的自动检测和人工修复训练样本,机器翻译软件的鲁棒性可以得 到提升。 总结 SIT 是一种检测机器翻译软件系统鲁棒性问题的方法。通过选择原始句子、生成相似句子、 获取翻译结果、进行成分解析和量化句子差异,SIT 可以高效地检测机器翻译软件系统的鲁 棒性问题。实验结果显示,SIT 可以在 19 秒内处理 2k+句子,并且对于 Google/Bing Translate 的准确度达到了 70%。然而,仍有改进的空间,可能是由于阈值选择的原 因。SIT 利用 BERT 模型生成语义和语法相似的语句,并使用三种方法来量化句子差异。总 体而言,SIT 的优势在于能够检测多种类型的错误,但其测试用例生成方式和检测方法仍有 改进空间。SIT 主要应用于对应用 AI 模型的机器翻译软件系统进行鲁棒性测试,并通过自 动检测和人工修复训练样本来提升鲁棒性。 ...

2021年9月30日

掌握C++右值引用的十大要点:如何正确处理纯右值和将亡值

最近由于工作需要,我阅读了很多关于 C++右值方面的材料。在 C++中,右值是一个非常重 要的概念,它对于理解 C++的内部机制和实现高效代码至关重要。本文将总结了 10 个关于 右值的实践经验。 C++右值有两种:纯右值、将亡值。右值引用可以延长将亡值的生命周期,使得将亡值 能够被正常使用,而不会被错误地释放。 右值引用的一个作用是延长右值的生命周期。右值引用可以延长将亡值的生命周期,使 得将亡值能够被正常使用,而不会被错误地释放。 临时对象作为右值处理。这种对象往往会在一些表达式中自动创建,然后被立即使用。 使用右值引用来绑定临时对象,可以让程序更高效地处理这些对象,避免了不必要的内 存拷贝操作。 移动构造函数尽可绑定右值非常量。这是因为右值非常量可以被修改,而右值常量则不 能。移动构造函数会破坏源对象,所以只有右值非常量才能被移动构造函数绑定。 对于一个右值对象,允许调用成员函数。这与左值对象类似。但需要注意的是,对于一 个将亡值,如果其生命周期结束,那么调用其成员函数可能会导致程序出现未定义行 为。 右值可以被修改(这也说明了其可以被破坏)。因此,在使用右值时需要谨慎处理,以 避免因为修改了右值而导致程序出现问题。 右值不能当作左值使用,左值可以当作右值使用。这是因为左值具有实际地址,并且与 右值有同样地表现。 常量左值引用可以绑定到右值。这种引用可以避免将右值对象修改的风险,同时还可以 延长右值的生命周期,使其能够被正常使用。 返回右值引用的函数在几乎所有情况下是糟糕的。因为返回右值引用往往会导致右值的 生命周期延长,从而使其可能被错误地使用。对于返回右值的函数,建议使用值返回的 方式。 在大部分情况下 return 中使用是 std::move 并不会将事情变得更好,相反该操作会 阻止编译器进行返回值优化。

2021年9月30日

探究计算机中断处理:了解Intel x86处理器下的外部中断、异常和陷入

处理器中断处理是计算机体系架构中必须掌握的知识之一。在 Intel 的 x86 处理器下,中 断可以分为外部中断、异常和陷入。外部中断来自硬件,是随机发生的,而异常则是处理器 内部执行指令过程中检测到错误条件的结果。陷入则是由程序产生的,通常是由 INT n、INTO 等指令触发的。 在 x86 处理器中,中断处理程序负责处理中断,异常处理程序负责处理异常,而系统调用 服务程序则负责处理陷入。这些处理程序可以位于内存空间的任何位置,并且可以有不同的 特权级。 Intel 处理器使用中断门、陷阱门和任务门来定义处理程序的入口地址。其中,中断门和陷 阱门是进入异常处理程序的门户。选择符和偏移量合起来定义了一个处理程序的入口地址。 中断门进入处理程序时 IF 标志被清掉,而陷阱门进入处理程序时 IF 标志保持不变。 Intel 处理器为每个中断和异常定义了一个中断向量号,并通过中断描述符表(IDT)建立 中断向量号和门之间的对应关系。IDT 可以驻留在线性地址空间的任何位置。Intel 处理器 专门提供了一个 IDTR 寄存器来记录 IDT 的基地址和界限信息。 Intel 处理器定义了 256 个中断向量号,其中 0~31 被处理器保留。 处理器中的异常可以 分为故障类异常和终止类异常。故障类异常可以被更正,而终止类异常则是无法被处理器自 行解决的严重错误。为了保证安全性,通过中断门或陷阱门只能向同级或更高特权级的代码 段转移控制。通常情况下,处理程序定义在内核代码段中(0 特权级代码段)。 在中断发 生时,处理器会自动在栈顶压入一些参数,其中 EFLAGS 是中断或异常发生前的系统状 态,SS:ESP 是中断或者异常发生前用户堆栈的栈顶,CS:EIP 是中断或者异常的返回地址。 64 位模式中,处理程序必须在 64 位代码段中,因而中断和陷阱门描述符被扩充到了 16 字节,其中偏移量被扩充到了 64 位;IDT 找那个仅有新格式的门描述符;堆栈宽度变成了 64 位,而且当中断发生时,会无条件地压入栈指针(SS:RSP)当需要切换堆栈时 SS 被强 制设置为 NULL;新增了中断堆栈表(IST)机制,允许特定的中断或者异常指定专门的堆 栈。

2021年9月30日

Intel x86处理器内存保护 概要知识点

一旦处理器内存保护机制被启动,处理器就会对每一次内存访问进行保护性检查,以确保所 有的访问都满足保护策略。保护检查和地址转换是并行进行的。 保护检查包含段级检查和页级检查。检查顺序是先段后页,检查依据是段描述符,页目录和 页表,检查的基础是特权级。 特权级是 Intel 为实现保护而定义的特权编号。 段一级的检查包括段界限检查,段类型检查,特权级检查,长指针检查等。段一级检查的原 则是: 低特权级的代码不能访问高特权级的数据 高特权级的代码可以访问低特权级的数据 代码只能使用与其特权级相同的堆栈,当特权级切换时,堆栈也要随之切换。 只能向具有相同特权级的非相容代码段转移控制(长 JMP 和长 CALL) 可以向同等或者较高特权级的相容代码段转移控制,但不能向低特权级的相容代码段转 移控制(长 JMP 和长 CALL)。 即使调用门、中断门、陷阱门,也不能从高特权级向低特权级转移控制。 不允许使用长 RET 向高特权级转移控制。 页一级的检查包括特权级检查和读写检查。相关标志是页目录/页表项中的 U/S 和 R/W 位。U/S 位 0 的页是超级页,为 1 是代表用户页。一般情况下,超级页中的代码可以访问 所有页(不管 R/W 标志),用户页中的代码只能访问用户页。当 CR0.WP 被设置为 1 时, 超级页中的代码也不能写只读用户页。 NXB 为 1 的页只能用作数据页,试图执行数据页的指令会引起处理器异常。

2021年9月30日

intel 64 体系常见内存管理方式

内存管理是操作系统中非常重要的一个部分。随着计算机技术的不断发展,内存管理的方式 也在不断演变。本文将介绍 intel 64 体系几种常见的内存管理方式。 平板式内存管理是一种比较简单的内存管理方式。它采用页式管理,屏蔽掉段式管理。具体 来说,它将逻辑地址直接映射为线性地址,定义一个代码段和一个数据段,两个段的大小都 是 4GB。这种方式的好处是简单易懂,但是它的缺点是不能进行多进程的内存隔离。 为了解决多进程内存隔离的问题,可以采用保护平板式内存管理的方式。具体来说,它定义 了内核代码段、内核数据段、用户代码段和用户数据段,每个段的基地址都是 0,大小为 4GB。进程执行内核代码时使用内核段,执行用户代码时使用用户段。这种方式的好处是可 以进行多进程的内存隔离,但是它的缺点是需要进行地址转化,影响效率。多段式内存管理 是一种完全采用段式管理的方式,屏蔽掉页式管理。它可以进行多进程的内存隔离,但是需 要进行地址转化,也会影响效率。 基于物理地址拓展的页式内存管理是一种支持更大物理地址空间的方式。它引入了物理地址 拓展(PAE)机制以支持 36 位物理地址。该管理模式中,物理地址空间被扩充到了 64GB, 但线性地址空间仍然为 4GB。页目录和页表项被扩充到了 64 位,因而一个页目录或者页表 中的项数变成了 512,一个页目录仅能描述 1GB 线性地址空间。所以引入了一个只有四个 表项的页目录指针表(PDP)。CR3 指向 PDP。地址转换机制被修改。当页目录项中的 PS 位被设置为 1 时,它描述的页变成了 2MB 页。 在 64 位模式中,段通常被关闭,不再做段界限检查。CS,DS,ES,SS 的基地址处理器统 统看作 0。但 FS 和 GS 可以不是 0,将逻辑地址转换为先行地址的时候要加上 FS 或者 GS 的基地址。FS 和 GS 的基地址位 64 位地址,兼容模式中只使用它的低 32 位,记录在 MSR 中。在 64 位模式中,对于内存的管理完全依靠分页机制。 Intel64 体系结构扩展了 PAE 机制,使之能够支持 64 位线性地址和 52 位物理地址。拓 展包括: ...

2021年9月30日

段页式内存管理概要

段页式内存管理中,段的线性地址被分割成大小相等的线性页(4KB,4MB 或者 2MB 等)。 物理内存空间同样也被分成相同大小的物理页。操作系统维护一个页表,用于管理线性页到 物理页的映射。页表在 IA-32 体系结构中分为两级,即页目录和页表 页目录是一个数组,其元素叫做页目录项(PDE),每个页目录项描述一个页表。页目录的 大小为一页(4KB),一个页目录中有 1024 个页目录项。页目录项的大小为 4 字节。页表 大小为一页(4KB)。页表项的大小为 4 字节,所以一个页表最多可以描述 1024 个线性 页。 物理页是预先划分好的,其开始位置一定在 4KB(2^12)的边界上。所以低 12 位全部是 零。然后低 12 位就可以储存而外的信息。 P 是存在位。R/W 是读写标志位。U/S 是用户标志位,0 表示超级用户。A 是存取标志 位。D 是脏标志位。 在页目录项中 PAT 标志换成了 PS 标志,表示物理页尺寸。 CR3 寄存器专门存放当前使用的页目录的物理地址,因此 CR3 又叫做页目录基地址寄存 器。只要进程在活动,它的页目录就应该一直驻留在内存。 页目录项也可以直接指向物理页,加快地址转换速度,通常将操作系统内核所占用的页设置 为 4MB 页。该页目录项的 PS 地址为 1 事,它所描述的是一个 4MB 的页而不再是一个页 表。 页式管理机制是操作系统内核启动的,启动方法是将 CR0 中的 PG 标志设置为 1。 启动分页机制后,每个线性地址都需要经过页目录和页表的转换。IA-32 体系结构加入了一 个高速缓存 TIB,其中储存最近使用的页目录和页表项。TIB 的经常的刷新工作由操作系统 内核负责。当页目录和页表项改变时,内核必须使得 TIB 相应的项失效。当 CR3 改变 时,TIB 中的所有内容(Global 页除外)会自动失效。INVLPG 指令可以将 TLB 中的指定 项设置为无效。 ...

2021年9月30日

段内存管理概要

IA-32 体系中提供了段页式内存管理机制,先分段再分页。提供页式是为了支持虚拟内存。 段:处理器的可寻址的线性内存空间被划分成了若干个大小不同的段。一个段是线性地址 空间中的一个连续的区间。段中可保存代码、数据、堆栈或者其他数据结构。段的属性信 息由与之对应的段描述符描述。段描述符是一个数据结构。Intel 用段描述符表来管理。 段描述符表最大可达 64KB。 当 G 为 0 时,段以字节为单位,最大的段长为 1MB。当 G 为 1 时,段以页(4kb) 为单位。最大的段长为 4GB。 DPL 是段的特权级,其值在 0~3 之间。 S 是系统标志,用于区分段的类别。0 表示系统段,1 表示用户段。 Type 是段的类型: 对于系统段。类型域由 4 位组成,可表示 16 个系统段类型之一。 对于用户段。 第三位为 0 表示数据段,此时第二位表示地址的拓展方向(0 表示大扩展方 向),第一位表示段是否可写。 第三位为 1 表示代码段,此时第二位是相容标志(0 表示非相容)。第一位是可 读位。 第 0 位是存取位。0 表示段尚未存取过。 D/B 标志表示有效地址和操作数长度。 L 标志仅出现在 IA-32e 模式的代码段中。1 表示 64 位模式 堆栈段通常是向下扩展的、可读写的数据段。 段描述符表: 全局描述符表(GDT)。在系统进入保护模式前必须为其定义一个 GDT。IA-32 体系结 构专门定义了一个 GDTR 寄存器来存放当前的 GDT 的信息。 局部描述符表(LDT)是系统段,其中可以存放局部描述符,如进程自己的代码段,数 据段等。IA-32 体系专门提供了一个 LDTR 寄存器,用于保存当前使用的 LDT 信息。 可以用段描述符在段描述符表中的索引来标识它,标识称作段选择符。段选择符是 16 位标 识符。第二位是指示器(TI)表示索引所对的描述符表(0 表示 GDT)。第 3-15 位示索 引,标定位置。第 0、1 位是请求特权级 RPL。一个段选择符加上一个偏移量可以唯一地标 识一个逻辑地址。逻辑地址是程序使用的地址,不是线性地址,也不是物理地址。 ...

2021年9月30日