好时代,来临力,NOI Linux 2.0 食用指南

dengyaotriangle

2021-08-03 15:10:38

Personal

众所周知,从下一场比赛开始,我们就要开始使用新的 NOI Linux 了,那么它与现今的 NOI Linux 有着什么区别和更新呢?我们该如何高效地利用它呢?接下来让小编带着大家看一看吧! ## 重大区别 以下是可能导致你在老版 NOI Linux 系统下形成的习惯在新版下翻车的改动。 - 移除了 GUIDE - 从 32bit 变为了 64bit 系统,需要注意指针现在占 8 字节而不是 4 字节 - 更新了编译器版本 - 默认情况下右键没了【新建文件】的选项 - 桌面目录改为中文,可能会导致一些程序无法运行 ## 主要改动 - 系统基于了 Ubuntu 20.04 (64bit) - g++ 升级到了 9.3.0 - 添加了很多编辑器,例如 Sublime,VSCode,Code::Blocks ## 安装 和旧版无区别,主要就是官网上说了安装时要断网,可以通过在虚拟机软件安装时把虚拟网卡断开的方式,具体因软件而异,我 用的是 Parallels Desktop,需要点击【安装前设定】设置。 以及,考虑到不太可能安装后联网安装更新,我这里依据的是**全程断网的 NOI Linux 2.0**,~~**由于没有真正拿这个系统比赛过,所以本文仅供参考,若实际情况有所出入,我不负责任,若实际比赛情况有出入也请联系我更新文章**。~~ **Edit:现在已使用了该系统进行了CSP和NOIp,是否联网更新因考场而异,NOI时如何实施尚不清楚。若可以联网更新,强烈推荐使用VSCode并安装C/C++插件进行编程** ## 中文目录 这个系统如果选择中文安装,桌面这个目录会是中文的。 然后这带来了很多问题,一是你在终端里敲很麻烦,二是有些程序可能用不了。 **请不要在桌面上建立文件编程**,以避免不必要的麻烦,据我测试,已知 Code::Blocks和 Gedit 的编译是会出问题的。 ## 右键菜单新建文件 如果需要的话,可以终端里输入 ``` xdg-user-dirs-update --set TEMPLATES ~/Templates/ touch ~/Templates/newfile ``` 即可。 然后重启文件管理器(可以终端输入 `killall nautilus`)然后你就会发现右键菜单里【新建文件】回来了。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2aifwnt7.png) 其实不一定要叫 `newfile` 啥都行,我这里起了个 `new document`。 ## 壁纸 默认壁纸是一张极丑无比的纯黑壁纸?没关系,可以进入【设置——背景】更换。 ![](https://cdn.luogu.com.cn/upload/image_hosting/o1w9qgdv.png) 有趣味壁纸,比如这个: ![](https://cdn.luogu.com.cn/upload/image_hosting/33o8x0wg.png) ## 编辑器 说一句题外话,我很喜欢 GUIDE,很不理解为啥会删掉它,可能它在很多地方令人难受,但是它可以对于每个文件单独设置编译选项,且不需要额外配置,对于我这种对于一个代码经常更换编译选项的选手真的是很好用。 一般上来讲,我认为考场上不应花费超过 5 分钟来配置编辑环境。尤其是像 NOI 这种比赛,开考前不可以动键盘,不可以登录系统,所以任何配置这些东西的时间都会占用你的有效比赛时间,我这里推荐使用一个可以较快速配置完成,且不明显拖累编码效率的即可。所以我这里不介绍需要大量配置的使用方式。 还有我觉得这些编辑器默认字体都挺好看的,如果觉得不好看的可以自行查找一下修改字体的方式。 另外,下列编辑器中有一些打开大文件的时候会卡死,**请做好测试,避免在未保存代码时打开过大的样例,以免数据丢失**。 若真正卡死了,这个版本的 ubuntu 会在足够长的时间后弹出未响应提示,大多数情况应该不用手动 `killall` 了,当然如果你没有听劝,里面还有未保存的代码,那只能多等个几分钟,看看能不能恢复,然后赶紧保存 ~~,再不行就彻底寄了~~。 ### VSCode 很不幸的是,CCF 提供的 VSCode C/C++ 插件是一个在线安装版本,真实竞赛中完全没法用,所以...听说你想要超好用的 VSCode?没门的啦! ![](https://cdn.luogu.com.cn/upload/image_hosting/qf2g0yst.png) 虽然这么说,但没有 Intellisense 和 Debug 的 VSCode 也是可以用的,虽然编译需要手动去命令行里敲,调试也要命令行 gdb,但论语法高亮和自动缩进和括号补全这方面还是可以的。 当然你也可以手写JSON实现一个编译运行指令,具体我就不细说了,还蛮复杂的,网上搜一下即可。 设置里也可以捣鼓一堆东西,比较有用的有自动保存【Auto Save】。 值得一题的是它内置的查找功能挺好用的,在查变量重名的时候很有效。右边三个开关分别代表是否区分大小写,是否强制搜索单词(两边都有空白字符),以及是否启用正则。 ![](https://cdn.luogu.com.cn/upload/image_hosting/lpdy8qp2.png) 基本上常规使用方法就是像这样,用自带的终端编译运行所有文件的样子。 ![](https://cdn.luogu.com.cn/upload/image_hosting/6luo14tt.png) #### 优点 - 有着简单的语法高亮,编辑体验好 - 有自带的文件管理器,可以方便的新建文件 - 几乎不需要设置 - 自带终端 #### 缺点 - 不自带编译功能,若实现需要手写JSON - 不自带调试功能 ### Sublime Text 感觉和 VSCode 体验差不多?不过自带一手单文件编译指令。但我没咋用过,所以不多评价。 但感觉真的和 VSCode 差不多啦,要自定义编译也必须手写JSON。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2kvee137.png) #### 优点 - 有着简单的语法高亮,编辑体验好 - 几乎不需要设置 #### 缺点 - 修改编译选项需要手写JSON - 不自带调试功能 ### Geany Geany 基本上开箱即用,但有一些我认为很好用的插件可以开。 【工具-插件管理器】里面可以打开插件 一些好用的有: - 【Auto-close】括号补全 - 【Auto-mark】符号高亮 F9 编译 ,F5 运行,运行会弹出一个终端,注意没有编译+运行,需要连按两个。 在 【生成-设置生成命令】里面可以设编译选项。 不过有个比较毒瘤的事情就是这玩意 Warning 和 Error 的显示一样,注意看一看。 ![](https://cdn.luogu.com.cn/upload/image_hosting/42epv411.png) 然后那个下面那个写着编译器的那一栏的上下箭头是可以点的,点到最下面有个自带终端。也可以把下面那一栏拉长全部显示出来。 #### 优点 - 有着简单的语法高亮,编辑体验好 - 几乎不需要设置 - 自带终端 #### 缺点 - 不自带调试功能 ### Code::Blocks 因为这玩意貌似是自带调试的所以重点研究了一下 首先如果打开单文件只有默认编译选项,无法调试,所以不可避免的需要新建一个项目文件。 先选择 【File-New-Project-Console Application】建立一个新项目,然后title选择题目的名称,然后 Folder 选择你这个比赛规定的存放该题的文件夹的父目录,其它的一路默认下去。 ![](https://cdn.luogu.com.cn/upload/image_hosting/jzhfqo9i.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/6agkdxhg.png) 然后你就有了一个项目。首先你会发现它给你创建了个 main.cpp,因为 OI 比赛中一般需要一个固定的名字才能正确收上去,所以需要改名字。首先先把这个文件关掉。然后在左边右键这个文件,选择【Rename File...】,改成该题目的名称。 ![](https://cdn.luogu.com.cn/upload/image_hosting/86uen84b.png) 然后,基本的配置就搞好了。 接下来就是如何设置编译选项,这次在左边右键这个项目的图标,然后点【Properties...】。 ![](https://cdn.luogu.com.cn/upload/image_hosting/rafulqb5.png) 然后点进【Build Targets】,这个页面里的 【Build options...】点开即可,可以分别为【Debug】和【Release】设置编译选项,而这两个东西可以理解为两个模式,比赛时可以用【Debug】作为开了类似 `-g` 的选项用于查错的那个,而【Release】开题面所示的编译选项,反应真实效果。(当然也可以根据需求用左边的 【Add】加入更多模式。) ![](https://cdn.luogu.com.cn/upload/image_hosting/8vhckp20.png) 当然那些给出的选项并不一定需要用它,可以用下一栏的【Other Compiler Options】直接写也是可以的。 ![](https://cdn.luogu.com.cn/upload/image_hosting/ilgnjes5.png) 那么现在已经配置好了,你可以在顶上的选项框里切换编译模式,然后可以按那个黄齿轮绿箭头分别代表编译,运行,编译运行。 ![](https://cdn.luogu.com.cn/upload/image_hosting/qpq2n0sc.png) 然后右边的那个红箭头可以开始调试,调试时可以点调试框右边这个电脑上有个虫子的图标中的【Watches】打开变量查看。注意调试时必须开 `-g` 编译哦(【Debug】模式编译) ![](https://cdn.luogu.com.cn/upload/image_hosting/gle14j6c.png) 总之具体使用方式还是蛮复杂的,毕竟这是一个庞大的IDE,大家可以自行摸索。 当然,你也可以只拿它调试,就新建一个工程然后就不改其它设置,有需要的时候把代码复制进来调,这也是可以的。总之这似乎是唯一一个可以拿来调试的。 #### 优点 - **自带调试功能** - 有着简单的语法高亮,编辑体验还行 #### 缺点 - 自动缩进可能有点怪(?) - 配置麻烦,必须配置一个项目才可以。比较笨重。 ### 其它 Vim 和 gedit(现在就叫文本编辑器)还有 Emacs 还在,喜欢用的继续用就好了,应该没有太多改变。 Lazarus 为啥还在... ### 总结 各个编辑器各有所长,大家的兴趣也不一样,建议自己拿它打个模拟赛试一试,**自己摸索出一个适合自己的方式**。各个编辑器的功能其实远比我介绍的要多,这里只说了比较常用的,如果有啥自己比较看重的功能也可以自行搜索。 CCF 提供了 VSCode 却不提供可以正常使用的 VSCode C/C++ 插件无疑是十分令人沮丧的,因为这意味着所有好使的编辑器没有一个可以方便地支持调试和静态代码分析。还是希望能加上一个能用的 C/C++ 插件啊啊啊啊。 **对于啥都不懂(指那堆编译选项)的推荐 Geany,开箱即用,非常方便。** 当然我还是觉得可以学一学这些编译器的基本知识的东西的,虽然对做题没啥帮助但是对以后玩 C++ 有帮助,以及能看懂乱七八糟的奇怪 CE 都是啥了。 ## 编译器 编译器升级到了 g++ 9.3.0 可以整啥花活呢? ### 强大的 sanitizer 编译选项加入 `-fsanitize=address,undefined` 可以体验绝佳的查 RE,查 UB 的体验。 当然如果编译器和链接器分开需要在链接器里加上 `-lasan -lubsan` 才可以用(指 Code::Blocks) 可以实现:数组越界直接 RE,有符号整数溢出直接 RE,返回值不为 `void` 的函数不 `return` 就返回直接 RE...总之就是可以查 RE 和 UB,**且能告诉你错在了第几行** 。相信我,会上瘾的。 ![](https://cdn.luogu.com.cn/upload/image_hosting/e4sdrvna.png) ### 优化 编译器优化更聪明了,虽然可能感知不强 ### C++14/17 ~~应该以后正式比赛能用上?~~ Edit:已确认:以后会用C++14 ## Arbiter arbiter 好像更新了?让我看看有啥区别。 内存限制最大值从 512MB 变到了 2048MB。不过这个好像似乎已经内部被修改过了(参见之前 NOI 里面都有 1GB 的空间限制)? 好像还改了改图标。 所以似乎并没有区别。 ## 终端命令 基本没变,常用的能用的都用。不能用的也不能用,除了... ### ssh 喜闻乐见.jpg 其实 `ssh` 命令并没有被删,只不过 ssh 服务不开放,也就是你还可以 ssh 其它系统,但这个系统不能被 ssh 到了。 试着给虚拟机和实体机开一个网络测试了一下,不太行。 ![](https://cdn.luogu.com.cn/upload/image_hosting/meywegls.png)