-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsearch.json
More file actions
1 lines (1 loc) · 260 KB
/
Copy pathsearch.json
File metadata and controls
1 lines (1 loc) · 260 KB
1
[{"title":"Conan 简要用法(包含 IDE)","url":"/2025/04/Conan-Easy-2-use/","content":"写在最前\n\n简介\nConan 是一个流行的跨平台 C++ 包管理器。它可以帮助我们在不同的操作系统和环境中管理和共享C++包,让我们更轻松、更高效地开发 C++ 应用。\n\n本文主要介绍了 Conan 2.x 版本的简要用法以及如何在项目中使用 Conan 导入第三方库。\n安装\nPIP 包管理下载【非常建议👍】\n关于 Conan 包管理器,这里非常值得用 Python PIP 的方式安装。你仅需执行以下命令即可:\npip3 install conan\n注意:在 Windows 系统下,若要使用 pip 指令安装 Conan,请先安装 Python3!\n\n \n \n Linux 下需要注意\n\n \n \n 对于不同的 Linux 发行版,对应的安装命令如下:\nDebian/Ubuntu 系\nwget https://github.com/conan-io/conan/releases/download/2.15.0/conan-2.15.0-amd64.deb # 这里的 2.15.0 可以替换为其它最新的版本号sudo dpkg -i conan*.deb\n注意:Debian/Ubuntu 系下需要通过安装包下载的方式进行安装!\nFedora/Redhat 系\nsudo dnf install python3-pip -y\n注意:Redhat 7及以下版本可能使用的是 YUM 包管理器,因此需要将 dnf 替换成 yum 才可用。\nArch/Majaro 系\nyay -S conan\n注意:请确保你的 Arch/Majaro 系已经安装了 yay 包管理工具!\nopenSUSE 系\nzypper install python3-pippython3-pip install conan\n\n \n \n\n \n \n 安装事项(引用自官方文档)\n\n \n \n 请仔细阅读:\n\n请确保您的 pip 安装与 Python (>= 3.6) 版本相匹配。\n在 Linux 上,您可能需要 sudo 权限才能全局安装 Conan。\n我们强烈建议使用 virtualenvs(virtualenvwrapper 非常好用)来处理与 Python 有关的一切(请查看 https://virtualenvwrapper.readthedocs.io/en/stable/ 或 Windows 上的 https://pypi.org/project/virtualenvwrapper-win )。对于 Python 3,也可以使用内置模块(请查看 https://docs.python.org/3/library/venv.html )。如果不使用 virtualenv,conan 依赖项可能会与先前存在的依赖项发生冲突,尤其是当您将 Python 用于其他用途时。\n在 macOS 上,尤其是可能有系统完整性保护的最新版本,pip 可能会失败。请尝试使用 virtualenvs,或使用 pip install --user conan 将其安装到 Python 用户的安装目录中。\n有些 Linux 发行版(如 Linux Mint)要求在安装后重启(shell 重启,如果不够,则注销/系统),因此 Conan 会在路径中找到。\n\n\n \n \n安装包下载\n如果没有安装 Python,请直接通过 github.com 下载对应操作系统的安装包即可。\n验证方法\n如果要检查是否已经安装了 Conan,请直接执行如下命令即可:\nconan --helpconan --version\n使用方法\n必要配置\n修改必要目录\n以 Windows 系统为例,Windows 系统在默认情况下会将所有缓存下载及配置文件存放入 C:\\Users\\{你的用户名}\\.conan2。为了尽量减少 C 盘存储空间的压力,建议直接添加必要的环境变量以达到修改配置缓存目录的目的。具体操作如下:\n\n\n在电脑上新建自定义目录(这里以 D:/conan 目录为例)\n\n\n在自己的电脑上按下 Windows+X 快捷键,按下 Y 以选择系统。在系统信息一栏中找到高级系统设置。\n在弹出的窗口中按照如下图指示添加两个用户变量 CONAN_HOME 和 CONAN_USER_HOME 即可:\n\n\n\n保存之后,打开自己的命令行,执行如下命令,以查看是否成功修改了自定义路径。\nconan config home\n\n\n当输出为你的自定义目录即可完成修改。\n\n\n生成自己的配置文件\n在命令行下,执行如下命令,Conan 会自动生成一份配置文件。\nconan profile detect\n若已经生成了配置文件,执行如下命令即可显示当前主机的配置文件。\nconan profile show\n;主机配置文件Host profile:[settings]arch=x86_64 ;系统架构build_type=Release ;构建类型:Debug/Releasecompiler=msvc ;编译器: msvc/gcccompiler.cppstd=17 ;C++ 标准compiler.runtime=dynamic ;编译器运行时库compiler.runtime_type=Release ;编译器运行时类型compiler.version=194 ;编译器版本os=Windows ;操作系统;构建机配置文件Build profile:....\n关于配置文件的位置,一般情况下,通过命令行即可查看配置文件所在的路径:\nconan profile list # 获取所有的配置文件名\nconan profile path default # default:配置文件名\n示例:使用 Conan 导入第三方库\n在自己的 C++ 项目里,如果需要使用 Conan 包管理器来实现导入第三方库,需要做以下几个步骤:\n创建新的 C++ 项目\n举个例子:新建一个项目(名为 MyJson),并在项目里导入 Json 第三方库,其对应的 CMakeLists.txt 文件如下:\ncmake_minimum_required(VERSION 3.30) project(MyJson) find_package(nlohmann_json REQUIRED) # 在项目中导入所需的第三方包 set(CMAKE_CXX_STANDARD 17) add_executable(MyJson main.cpp) target_link_libraries(MyJson nlohmann_json::nlohmann_json)\n在 main.cpp 文件下,编辑以下内容:\n#include <nlohmann/json.hpp> #include <iostream> int main() { auto my_json = R"( \t { \t "host": "127.0.0.1", \t "port": 8000\t }\t)"; auto parse = nlohmann::json::parse(my_json); std::cout << "Your host: " << parse["host"].get<std::string>() << std::endl; std::cout << "Your port: " << parse["port"].get<int>() << std::endl; return 0; }\n编写 Conanfile 文件\n为了添加所需要的第三方库,你需要在项目源目录下新建 conanfile.txt 文件。\n[requires]nlohmann_json/3.11.3[generators]CMakeDepsCMakeToolchain[layout]cmake_layout\n下载与安装第三方库\n接下来,在自己的项目源目录下打开命令行,下载并安装需要的包。\nconan install . --build=missing [--output-folder=build]\n这里的 --build=missing 用于检查 Conan 是否安装第三方库,(若没有,则自动下载安装)\n这里的 --output-folder (可选参数)为输出的路径,这里默认为 build 目录。\n编译项目\n在命令行下执行如下:\ncd build# Windows 下执行:cmake .. -DCMAKE_TOOLCHAIN_FILE="./generators/conan_toolchain.cmake"# Linux 下执行:cmake .. -DCMAKE_TOOLCHAIN_FILE="./Release/generators/conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release# 其它 OS 可能未测试\n当能正常看到以下提示时,表示构建已完成。\n....-- Conan: Target declared 'nlohmann_json::nlohmann_json'-- Configuring done (5.6s)-- Generating done (0.0s)-- Build files have been written to: D:/MyJson/build\n假如出现以下报错(找不到第三方库)的情况:\nCMake Error at CMakeLists.txt:4 (find_package): By not providing "Findnlohmann_json.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "nlohmann_json", but CMake did not find one. nlohmann_jsonConfig.cmake nlohmann_json-config.cmake Add the installation prefix of "nlohmann_json" to CMAKE_PREFIX_PATH or set "nlohmann_json" provides a separate development package or SDK, be sure it has been installed.-- Configuring incomplete, errors occurred!\n建议直接将原有的 build 目录删除,并再次在项目源目录下执行以下命令以再次生成 build 目录即可。\ncd ..# rm -rf build # Linux / Mac 下执行# rm build -R # Windows 下执行conan install . --build=missing\n运行程序\n完成上述构建之后,在 build 目录下执行以下命令以编译程序即可。\ncmake --build . --config Release\n在 Windows 系统下,如果你使用的是 MSVC 编译器,直接执行如下:\n./Release/MyJson.exe\n在 Linux 系统下,执行:\n./MyJson\n若能正常显示如下输出结果即可。\nYour host: 127.0.0.1Your port: 8000\nIDE 工具下使用 Conan\n以目前作者的了解,对于不同的 IDE,有不同的安装与编译方式,这里讲以下几种:\nVisual Studio\n1. 安装插件\n在菜单栏中选择 扩展 → 管理扩展,并在搜索栏中搜索 Conan,按照如下图安装即可。\n\n当弹出以下窗口时,点击 【Modify】进行安装,在此安装期间,请关闭 IDE!\n\n当安装已经完成后,再次打开 IDE 即可。\n2. 添加第三方库\n按如下图所示,在菜单栏中打开 Conan 软件包管理窗口。\n\n再按照如下图所示,点击 【设置】图标,选择使用系统 Conan 即可。\n\n完成设置后,打开自己的项目,在 Conan 软件包管理窗口下,搜索要安装入项目的软件包并添加项目即可。\n\n3. 使用\n关于使用,每次添加或删除,你需要在自己的项目中,\n\n先执行菜单栏中的生成 → 清理解决方案。\n再执行菜单栏中的生成 → 生成解决方案。\n最后尝试调试你的项目即可。\n\n注意:Visual Studio 下只支持使用 MSBuild 类型的项目,不支持使用 CMake 类型的项目。\n(此处别问为什么?是插件告诉我的 (/_ \\) )\nJetbrain CLion\n1. 安装插件\n若要在 CLion 下使用 Conan,请直接下载并安装插件 Conan。具体点击 文件 → 设置 → 插件\n安装插件后,请直接重启 IDE。\n2. 添加所需的第三方库\n按照如下图所示的操作进行:\n\n需要注意:这里的项目必须要包含 conan_provider.cmake 文件(自动生成的文件),否则 CLion 将无法正常编译!\n具体方式,即点击如下图的刷新按钮,文件会自动生成。如果没有反应,请反复重试或直接重启 IDE。\n\n\n关于安装,请直接在搜索栏中搜索要安装的第三方库,并点击 【Use in Project】 即可。\n\n\n \n \n 补充内容\n\n \n \n 关于 conan_provider.cmake 文件,你可以通过从其它项目源目录下复制到自己的项目,也可以通过 🔗此链接 以尝试下载并复制到自己的项目,然后尝试编译运行。\n\n \n \n3. 使用\n安装完对应的第三方库, 你还需要在自己的项目里(即:CMakeLists.txt 文件)导入第三方库才能使用,具体见上文中的[示例:创建新的 C++ 项目](#创建新的 C++ 项目) 。\nQt Creator\n1. 激活插件\n在左边的插件,搜索 Conan 并激活,如下图所示:\n\n2. 配置\n点击你的项目,在如下图操作中添加构建步骤,选择 conan install 选项。\n\n需要注意的是:Qt Creator 对于每一个项目,你都需要在项目源目录下单独新建一个 conanfile.txt 或 conanfile.py 文件才能正确编译。否则会提示找不到文件!\n参考链接\nConan 官方文档说明如下:\n\nInstall — conan 2.15.0 documentation\nBuild a simple CMake project using Conan — conan 2.15.0 documentation\n\n有关于 IDE 配置 Conan 的官方文档如下:\n\nConan Extension for Visual Studio - Visual Studio Marketplace\nConan plugin | CLion Documentation\nConan Package Manager | Qt Creator Documentation\n\n其它参考:\n\nHow to install Conan package manager on openSUSE Tumbleweed the most correct way? - StackOverflow\n\n","categories":["技术教程"],"tags":["C_and_Cpp","Conan","Python","📦包管理工具"]},{"title":"[超详细] CLion 安装与配置","url":"/2025/01/Jetbrain-CLion-Installation-and-configuration/","content":"简介\n为了照顾好刚入门 C/C++ 语言的新手小白,此文将详细介绍如何在自己的电脑上搭建自己的编程环境。\n下载安装 IDE\n\n \n \n IDE 简介\n\n \n \n 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。\n\n \n \n不同的 IDE 有不同的配置工具,这里就以 Jetbrain 系列中的 CLion 作为参考:\nJetbrain CLion\n大多数大学本科生,在上 C 语言程序设计时,都会下载一个软件:Dev-C++,其内置了 GCC、G++ 编译器,其体量小、速度快的特点,获得了许多大学老师默认的首选(当然有些学校可能不是用这个软件,而是使用 Visual C++ 6.0)。\n但是,对于 Dev-C++ 来说,它的界面过于古旧,没有更加智能的自动补全功能,也没有较为好用的调试功能,这里就推荐一个更好用的 IDE 工具 ( ̄▽ ̄)" —— CLion。\n这是出自 Jetbrain 系列里的 IDE 工具集,内置了所需的编译器、调试器以及构建工具等。\n关于安装方法,Jetbrain 官方提供了两种安装方法:\n一、利用 Toolbox App 安装【推荐】\n\nJetBrains Toolbox App:轻松管理您的工具\n\n这是 Jetbrain 系列内置的工具安装器,它可以安装所有 Jetbrain 系列的软件。你只需要利用 Toolbox,找到 Clion 并一键下载即可。\n当然,若你之前已经安装过,你可以直接点击更新即可。\n\n安装位置修改方法(先看这点)\n这里需要注意的一点:默认情况下,Jetbrain Toolbox App 下安装工具的路径位于 C 盘的用户数据目录下。为了解决 Windows 下 C 盘的占用空间问题,这里操作如下:\n首先,打开 Toolbox App 主页面,点击右上角的 小齿轮图标,选择 ”设置“,如下图:\n\n找到如下图中标注的部分,将其更改文件夹即可。\n\n需要注意的点:就像上图标注的提示那样,请先做好上述的设置,以便过度占用磁盘空间。\n二、直接下载安装包\n\nCLion:JetBrains 出品的 C 和 C++ 跨平台 IDE\n\n这是许多人都会做的步骤,这里不再赘述。注意记得修改安装路径!\n\n关于破解 CLion,请直接点击下方的链接,以直接下载破解脚本即可。对应说明文档已内置!\n下载链接:传送门\n\n测试运行 C/C++ 语言程序\n根据不同的 IDE 工具,有不同的操作步骤。为了方便新手小白快速测试能否成功执行 C/C++ 语言程序。请根据自己的需求一步步进行测试即可。这里同样以 CLion 为例:\n首先打开 CLion,或者直接在终端下执行 clion64。\n进入后按照如下图指示,进行操作:\n\n\n按照上述操作创建项目后,会弹出如下窗口,这里建议选择默认捆绑安装的 MinGW 编译器。按照如下图指示配置即可。\n\n等待加载完成后,直接执行绿色小三角 图标,当终端窗口下出现 Hello world! 时,即可完成运行。\n\n常见问题\n1. IDE 如何切换到简体中文\n根据如下图进行操作:\n\n2. Windows 下运行程序时遇到中文出现乱码\n问题描述\n给定一个示例代码,如下:\n#include <stdio.h> int main(void) { printf("你好,世界!\\n"); return 0; }\n运行结果如下:\n浣犲ソ锛屼笘鐣岋紒\n解决方法\n如下图所示,先点击进入设置(快捷键:Ctrl + Alt + S)。\n\n按照如下图指示操作:\n\n完成设置后,还需对 main.c 文件进行编码转换操作:\n\n3. IDE 出现卡顿或显示异常现象\n通常情况下,Jetbrain 系列下的所有 IDE 软件都是基于 Java 语言所编写。为了确保能使 IDE 能够流畅运行,可以通过修改内存大小以实现。\n具体操作如下图:\n\n需要注意的一点:调整内存时,请根据自己的电脑运行内存配置以适当增加内存。(单位换算:1GB = 1024MB)\n设置完成后,重启 IDE 即可生效。\n","categories":["技术教程"],"tags":["C_and_Cpp","Windows","Jetbrain","CLion"]},{"title":"C 语言基础笔记:重要知识点","url":"/2025/01/C-language-basic-misc/","content":"简介\n本文章适用于正在入门 C 语言的小白。如有问题,请在评论区下补充。O(∩_∩)O~\n进制相关\n进制转换对照表\n\n\n\n十进制\n二进制\n八进制\n十六进制\n\n\n\n\n0\n0000\n0\n0\n\n\n1\n0001\n1\n1\n\n\n2\n0010\n2\n2\n\n\n3\n0011\n3\n3\n\n\n4\n0100\n4\n4\n\n\n5\n0101\n5\n5\n\n\n6\n0110\n6\n6\n\n\n7\n0111\n7\n7\n\n\n8\n1000\n10\n8\n\n\n9\n1001\n11\n9\n\n\n10\n1010\n12\nA\n\n\n11\n1011\n13\nB\n\n\n12\n1100\n14\nC\n\n\n13\n1101\n15\nD\n\n\n14\n1110\n16\nE\n\n\n15\n1111\n17\nF\n\n\n\n幂的二进制和十进制表示\n\n\n\n数学表达\n二进制\n十进制\n\n\n\n\n\n1\n1\n\n\n\n10\n2\n\n\n\n100\n4\n\n\n\n1000\n8\n\n\n\n10000\n16\n\n\n\n100000\n32\n\n\n\n1000000\n64\n\n\n\n10000000\n128\n\n\n\n100000000\n256\n\n\n\n1000000000\n512\n\n\n\n10000000000\n1024\n\n\n\nC 语言基本\n重要关键字\n下表为 C 语言内置的所有关键字,在定义变量或常量时都不可直接引用!\n\n\n\n类型\n关键字\n解释\n\n\n\n\n基本数据类型\nvoid\n空类型\n\n\n\nchar\n字符型\n\n\n\nint\n整型\n\n\n\nfloat\n单精度浮点型\n\n\n\ndouble\n双精度浮点型\n\n\n类型修饰关键字\nshort\n短整型\n\n\n\nlong\n长整型\n\n\n\nsigned\n有符号\n\n\n\nunsigned\n无符号\n\n\n存储类别关键字\nauto\n自动变量\n\n\n\nstatic\n静态变量\n\n\n\nregister\n寄存器变量\n\n\n\nextren\n外部变量\n\n\n\nconst\n常量\n\n\n\nvolatile\n变量\n\n\n复杂类型关键字\nstruct\n结构体\n\n\n\nunion\n联合(共用体)\n\n\n\nenum\n枚举\n\n\n\ntypedef\n给类型取别名\n\n\n\nsizeof\n求类型或变量大小\n\n\n跳转语句\nreturn\n函数返回\n\n\n\ncontinue\n循环继续\n\n\n\nbreak\n跳出循环或switch\n\n\n\ngoto\n无条件跳转\n\n\n分支语句\nif\n条件语句\n\n\n\nelse\n否定分支(与if连用)\n\n\n\nswitch\n开关语句(多重分支)\n\n\n\ncase\n分支标记\n\n\n\ndefault\n开关语句中的其他\n\n\n循环\nfor\nfor循环\n\n\n\ndo\ndo…while循环\n\n\n\nwhile\nwhile循环\n\n\n新增其他\n_Bool\n布尔类型\n\n\n\n占位符(格式控制符)\n在使用 printf(FORMAT, ...) 函数时,里面的 FORMAT 格式有特殊的占位符,其对应如下:\n\n\n\n格式控制符\n作用\n\n\n\n\n%d\n输出有符号的十进制整数(包括 char 类型)\n\n\n%u\n输出无符号的十进制整数(包括 char 类型)\n\n\n%f\n输出float类型的浮点数(输入时小数形式和指数形式都可以识别)\n\n\n%lf\n输出double类型的浮点数(输入时小数形式和指数形式都可以识别)\n\n\n%c\n输出单个字符\n\n\n%s\n输出字符串\n\n\n%p\n以整数形式输出指针\n\n\n%x 或 %X\n以十六进制的方式输出\n\n\n%o\n用来输出无符号的八进制整数\n\n\n%e\n以指数形式输出浮点数(输入时小数形式和指数形式都可以识别)\n\n\n%g\n自适应输出小数或者指数形式(输入时小数形式和指数形式都可以识别)\n\n\n\nASCII码表\n在学习到字符或字符串时,需要记忆数字(48~57)、大写字母(65~90)、小写字母(97~122)。\n\n转义字符\n\n\n\n转义字符\n意义\nASCII码值(十进制)\n\n\n\n\n\\a\n响铃(BEL)\n\n\n\n\\b\n退格(BS) ,将当前位置移到前一列\n\n\n\n\\f\n换页(FF),将当前位置移到下页开头\n\n\n\n\\n\n换行(LF) ,将当前位置移到下一行开头\n\n\n\n\\r\n回车(CR) ,将当前位置移到本行开头\n\n\n\n\\t\n水平制表(HT) (跳到下一个TAB位置)\n\n\n\n\\v\n垂直制表(VT)\n\n\n\n\\\\\n代表一个反斜线字符\n\n\n\n\\'\n代表一个单引号字符\n\n\n\n\\\"\n代表一个双引号字符\n\n\n\n\\?\n代表一个问号\n\n\n\n\\0\n空字符(NUL)\n\n\n\n\\ddd\n1到3位八进制数所代表的任意字符\n三位八进制\n\n\n\\xhh\n十六进制所代表的任意字符\n十六进制\n\n\n\n基本数据类型\n\n运算符优先级和结合性\n\n文件操作模式\n\n\n\n模式\n含义\n说明\n\n\n\n\nr\n只读\n文件必须存在,否则打开失败\n\n\nw\n只写\n若文件存在,则清除原文件内容后写入;否则,新建文件后写入\n\n\na\n追加只写\n若文件存在,则位置指针移到文件末尾,在文件尾部追加写人,故该方式不删除原文件数据;若文件不存在,则打开失败\n\n\nr+\n读写\n文件必须存在。在只读 r 的基础上加 + 表示增加可写的功能。下同\n\n\nw+\n读写\n新建一个文件,先向该文件中写人数据,然后可从该文件中读取数据\n\n\na+\n读写\n在 a 模式的基础上,增加可读功能\n\n\nrb\n二进制读\n功能同模式 r,区别:b 表示以二进制模式打开。下同\n\n\nwb\n二进制写\n功能同模式 w。二进制模式\n\n\nab\n二进制追加\n功能同模式 a。二进制模式\n\n\nrb+\n二进制读写\n功能同模式 r+。二进制模式\n\n\nwb+\n二进制读写\n功能同模式 w+。二进制模式\n\n\nab+\n二进制读写\n功能同模式 a+。二进制模式\n\n\n\n\n提示\n看到这里,需要提示一点:不管你学到哪里,建议在学习对应的知识点时,好好再熟悉熟悉对应的表。\n","categories":["学习笔记"],"tags":["C_and_Cpp","学习笔记"]},{"title":"Debian 13(Trixie)全面体验:新特性、安装与升级指南","url":"/2025/08/%E7%B3%BB%E7%BB%9F%E4%BD%93%E9%AA%8C%EF%BC%9ADebian-13%E2%80%94%E5%BD%93%E4%B8%8B%E6%9C%80%E6%96%B0%E7%9A%84%E9%80%9A%E7%94%A8%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/","content":"\n这次体验的 Linux 发行版系统主要以本周末最新发布的 Debian 13 展开。\n通过本文的内容,你可以快速从系统的最新特性、安装步骤、简单的桌面体验等方面展开。希望这篇文章能有所帮助!\n\n\n最新特性\nDebian 13(代号 Trixie)带来了许多显著的新特性和改进,涵盖了架构支持、安全功能、桌面环境、软件更新等多个方面。\n主要更新内容\n\n\n官方支持 riscv64[1] 架构:首次官方支持 riscv64 架构,用户可在 64 位 RISC-V[2] 硬件上运行 Debian 13 并享受其所有功能。\n\n\n增强安全防护:在 amd64 和 arm64 架构上增加安全特性,抵御 ROP[3] 和 COP/JOP[4] 攻击,硬件支持时自动启用。\n\n\n支持 HTTP 启动:Debian 安装程序和 Live 镜像在支持的 UEFI 和 U-Boot 固件上可使用 HTTP Boot 启动。\n\n\n改进手册页翻译:manpages-10n 项目贡献了许多改进和新的手册页翻译,如罗马尼亚语和波兰语翻译得到显著增强。\n\n\n增加拼写检查支持:基于 Qt WebEngine 的浏览器支持使用 hunspe11 数据进行拼写检查。\n\n\n64 位 time_t ABI 过渡:除 i386 外,所有架构使用 64 位 time_t ABI,部分 32 位架构库的 ABI 有变化。\n\n\n推进可复现构建:Debian 贡献者在确保软件包构建结果可复现方面取得显著进展,可使用相关工具查看状态。\n\n\n升级 curl 功能:curl CLI 和 libcurl 支持 HTTP/3,curl 软件包还提供了 wcurl 下载工具。\n\n\n支持 BDIC[5] 二进制字典:首次提供 .bdic 二进制字典,基于 Qt WebEngine 的浏览器可利用其进行拼写检查。\n\n\n更新大量软件包:新增超 14116 个软件包,总数超 69830 个;多数软件包更新,超 44326 个;超 8844 个软件包因各种原因被删除 。包含多种桌面环境和生产力应用升级,以及众多常见软件包版本更新。\n\n\n包更新对比\n下表为各个桌面环境的版本对比:\n\n\n\n桌面环境\nDebian 13\nDebian 12\n\n\n\n\nGNOME\n48\n43\n\n\nKDE (Plasma)\n6.3.6\n5.27.5\n\n\nXfce\n4.20\n4.18\n\n\nLXDE\n13\n11\n\n\nLXQt\n33\n31\n\n\nMate\n1.26.2\n1.26.0\n\n\n\n下表为 Debian 12 与 Debian 13 的部分流行软件包对比:\n\n\n\n软件包\n在 12 (bookworm) 中的版本\n在 13 (trixie) 中的版本\n\n\n\n\nApache\n2.4.62\n2.4.64\n\n\nBash\n5.2.15\n5.2.37\n\n\nBIND DNS 服务器\n9.18\n9.20\n\n\nCryptsetup\n2.6\n2.7\n\n\ncurl/libcurl\n7.88.1\n8.14.1\n\n\nEmacs\n28.2\n30.1\n\n\nExim (default email server)\n4.96\n4.98\n\n\nGCC, the GNU Compiler Collection (default compiler)\n12.2\n14.2\n\n\nGIMP\n2.10.34\n3.0.4\n\n\nGnuPG\n2.2.40\n2.4.7\n\n\nInkscape\n1.2.2\n1.4\n\n\nGNU C 运行库\n2.36\n2.41\n\n\nLinux kernel\n6.1 系列\n6.12 series\n\n\nLLVM/Clang 工具链\n13.0.1 和 14.0(默认)和 15.0.6\n19 (default), 17 and 18 available\n\n\nMariaDB\n10.11\n11.8\n\n\nNginx\n1.22\n1.26\n\n\nOpenJDK\n17\n21\n\n\nOpenLDAP\n2.5.13\n2.6.10\n\n\nOpenSSH\n9.2p1\n10.0p1\n\n\nOpenSSL\n3.0\n3.5\n\n\nPerl\n5.36\n5.40\n\n\nPHP\n8.2\n8.4\n\n\nPostfix\n3.7\n3.10\n\n\nPostgreSQL\n15\n17\n\n\nPython 3\n3.11\n3.13\n\n\nRustc\n1.63\n1.85\n\n\nSamba\n4.17\n4.22\n\n\nSystemd\n252\n257\n\n\nVim\n9.0\n9.1\n\n\n\n升级到 Debian 13\n此文针对于早期版本的 Debian,若 Debian 版本早于 13 之前,可以直接通过修改软件源的方法并执行检查更新的方式以实现升级。具体步骤如下:\n第一步:备份重要数据\n在进行任何系统升级之前,务必备份重要数据,以防升级过程中出现问题。\n第二步:更改软件源\nsudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list\n第三步:更新软件源并升级\nsudo apt updatesudo apt full-upgrade\n第四步:更新阶段\n在出现如下图时,请按 Q 键。\n\n出现如下提示弹窗时,选择 [Yes] 以重新启动服务。\n\n更新过程中,可能会出现配置文件是否更新的情况(比如 sshd_config 文件),这里请选择第二项保持原有配置文件即可。\n\n第五步:清理工作\nsudo apt autoremove -ysudo apt autoclean\n第六步:检查版本\n通过执行以下命令即可查看:\ncat /etc/os-release\n出现如下提示信息,表示更新完成。\nPRETTY_NAME="Debian GNU/Linux 13 (trixie)"NAME="Debian GNU/Linux"VERSION_ID="13"VERSION="13 (trixie)"VERSION_CODENAME=trixieDEBIAN_VERSION_FULL=13.0ID=debianHOME_URL="https://www.debian.org/"SUPPORT_URL="https://www.debian.org/support"BUG_REPORT_URL="https://bugs.debian.org/"\n下载安装\n下载\n你可以直接通过官方网站下载到最新的 Debian 13。如下图:\n\n需要注意:如果需要将系统安装到物理机上,建议直接下载离线安装镜像(如上图中黄色框内的下载链接)或者 Live 现场版安装镜像(如 Gnome、KDE、Xfce 版本的 Live 镜像),以避免出现找不到无线网卡而引发的网络问题。\n安装\n观前提示:这里本文以 VMWare 虚拟机为例,简要以图文的方式展开。\n\n \n \n 提示\n\n \n \n 你可以通过本站的下列链接进行获取 VMware 17 版本:\n 百度网盘下载\n 夸克网盘下载\n新建 VMware 部分,请点击参阅文章【新建虚拟机】一节。\n 从 0 开始学 Linux:安装 Ubuntu 24.04 LTS 系统 - 新建虚拟机\n\n \n \n第一步:启动虚拟机\nBIOS 下启动:选择第一项\n\nUEFI 下启动:选择第一项\n\n第二步:选择语言区域。\n\n\n\n第三步:创建主机、用户\n\n\n\n\n \n \n 提示\n\n \n \n 关于设置 Root 密码步骤,可以直接不设置密码(即空密码)并跳过下一步。\n如果作为主力机或普通的台式机而言,Root 不是必需选项。\n\n \n \n\n\n第四步:磁盘分区\n\n\n \n \n 注意\n\n \n \n 关于虚拟机,你可以直接按照向导完整地将整个磁盘格式化并安装此系统。\n而对于双系统而言,强烈建议选择 【手动】 选项自行分区。\n针对分区方案,你可以按照如下表格进行参考:\n注:针对于双系统,挂载点 /boot/efi 普遍不用分区,通过观察分区表的大小(通常启动分区小于 512 MB),可直接找到此分区,只需直接将此分区手动挂载为 /boot/efi 分区便可。\n分区方案 1:同一分区\n\n\n\n挂载点\n大小\n文件系统\n说明\n\n\n\n\n/boot/efi\n512 MB\nFAT32\nUEFI 启动分区\n\n\nswap\n2 ~ 4 GB\nswap\n交换分区\n\n\n/\n剩余空间\next4\n根分区\n\n\n\n分区方案 2:将 /home 单独分区(其中的 / 和 /home 的大小需自行分配)\n\n\n\n挂载点\n大小\n文件系统\n说明\n\n\n\n\n/boot/efi\n512 MB\nFAT32\nUEFI 启动分区\n\n\nswap\n2 ~ 4 GB\nswap\n交换分区\n\n\n/\n24 ~ 64 GB\next4\n根分区\n\n\n/home\n剩余空间\next4\n用户数据\n\n\n\n\n \n \n完成分区后,需手动确认。如下图:\n\n\n第五步:配置软件包\n在此步中,选择【否】以忽略此步。\n\n\n \n \n 提示\n\n \n \n 如果使用的安装镜像为离线安装镜像,则会出现如下图提示。\n针对于离线安装的需求(即不能上网的情况),可直接选择【否】,安装程序会自动选择物理介质(而非使用在线远程网络镜像站点下载)。这么做可加快安装速度而非依赖自身的网络速度所影响。\n\n本文将以在线配置网络镜像站点的方式安装系统。\n\n \n \n这里按照自己的地理区域,选择最快的网络站点下载即可。\n\n此步骤中,可以选择任一镜像源,本文就以清华镜像站点作为软件源。\n\n此步什么都不填写,跳过即可。\n\n\n此步骤中可以选择安装自己喜欢的桌面环境以及 SSH、Web 等服务。这里根据自己的需求进行选择即可。\n\n此步骤选择【是】以安装 Grub 启动引导器。\n\n此步骤选择第二项以选择安装 Grub 引导。\n注:双系统下,可能为 /dev/nvme...,请选择此项并将其安装即可。\n\n等待安装完成,弹出如下图,重启即可完成。\n\n重启后,便会进入桌面,下图为 GNOME 桌面环境。\n\n\n参考内容与注释\n\n\nDebian 13 的新变化 — release-notes 文档\n\n\nDebian – Debian “trixie” 发行信息\n\n\nRISC-V - 维基百科,自由的百科全书\n\n\n面向回报的编程 - 维基百科 — Return-oriented programming - Wikipedia\n\n\nBDIC File Extension - What is it? How to open a BDIC file?\n\n\n\n\n\nriscv64 架构的硬件目前主要以嵌入式、物联网、边缘计算等场景为主,依托开源特性和灵活性在低成本、低功耗设备中快速普及。 ↩︎\n\nRISC-V(英语发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),简易解释为与开源软件运动相对应的一种“开源硬件”。[维基百科] ↩︎\n\n面向返回的编程 (ROP) 是一种计算机安全漏洞利用技术,允许攻击者在存在安全防御的情况下执行代码。原理:攻击者利用程序中现有的代码片段(gadgets),这些片段通常以返回指令(ret)结束。通过操纵程序的控制流,攻击者将这些 gadgets 链接在一起,构造出恶意的指令序列,从而实现任意代码执行。[维基百科] ↩︎\n\nCOP 是利用涉及函数调用的现有代码序列构建恶意指令序列;JOP 则是利用跳转指令(如条件跳转或无条件跳转)来改变程序执行流程。它们与 ROP 类似,都是通过控制程序的控制流来达到恶意目的。 ↩︎\n\nBDIC(Binary Dictionary)二进制字典是一种专门用于提高浏览器拼写检查效率的文件格式,由谷歌开发,主要应用于基于 Chromium 开源项目的浏览器。 ↩︎\n\n\n\n","categories":["系统体验"],"tags":["系统体验","Linux","Debian","GNOME","KDE","桌面环境"]},{"title":"从 0 开始学 Linux - 安装 Ubuntu 24.04 LTS 系统","url":"/2024/04/%E4%BB%8E-0-%E5%BC%80%E5%A7%8B%E5%AD%A6-Linux-%E5%AE%89%E8%A3%85-Ubuntu-24-04-LTS-%E7%B3%BB%E7%BB%9F/","content":"\n \n \n 前言\n\n \n \n 本篇文章适合刚接触 Linux 的零基础小白,本教程将以零基础小白的视角来简要介绍如何快速安装 Ubuntu 系统。\n\n\n \n \n环境安装\n根据不同的方式来安装相对应的环境,作为 0 基础的 Linux 入门新手,你可以根据 ⭐ 级别来参考并选择相对应的安装方式。\n虚拟机环境 (⭐⭐⭐⭐⭐)\n特点\n\n安全:虚拟机与真实的物理机完全隔离;\n便利:只需要一个安装镜像(通常以 *.iso 格式的文件)即可安装;\n即用即停:使用虚拟机时可直接暂停或恢复虚拟机。可以减少开启虚拟机的等待时间\n\n安装方式\n请根据如下表所给的虚拟机软件中选择其中一个进行下载安装。\n\n\n\n软件\n可用的平台\n\n\n\n\n VMWare Workstation\nWindows、Linux\n\n\n Oracle VM VirtualBox\nWindows、Mac、Linux\n\n\n VMWare Fusion\nMac\n\n\n Parallels Desktop\nMac\n\n\n QEMU\nWindows、Mac、Linux\n\n\n Hyper-V\nWindows\n\n\n\nWindows 用户建议选择 VMware Workstation;\n\n \n \n 提示\n\n \n \n 你可以通过本站的下列链接进行获取 VMware 17 版本:\n 百度网盘下载\n 夸克网盘下载\n\n \n \nLinux 用户建议选择 Oracle VM VirtualBox;\nMac 用户建议选择 Parallels Desktop。\nWindows Subsystem Linux(WSL)(⭐⭐⭐⭐)\n特点\n\n运行于 Windows 系统上。\n安装非常简单,仅需安装发行版即可实现即开即用\n仅运行于终端中,不会占用过大的存储空间\n\n安装方式\n你可以直接点击此处下载 WSL,打开网页后将会自动跳转到 Microsoft Store 中,只需点击下载安装即可\n关于相关的 WSL 教程,请直接点击下方按钮以跳转至此文章。\n WSL:一个适用于 Windows 的 Linux 子系统\n实机安装(双系统安装)(⭐⭐⭐)\n特点\n\n完全安装在真机环境上,体验原汁原味的系统\n上手难度较大,不利于新手操作\n安装前需要提前为新安装的 Linux 系统进行分区,配置较为麻烦,同时需要依靠 U 盘进行安装\n\n安装方式\n\n\n若选择此方式,作者建议使用如下工具将镜像文件安装到 U 盘中:\n\nVentoy :一个多系统启动 U 盘的解决方案。可利用此工具来快速启动多个已有的 ISO 镜像文件\n\nRufus:一款轻松创建 USB 启动盘的工具\n\nbalenaEtcher:一款更为简单的烧录软件\n\n\n使用方式均为一样,仅需使用对应工具将需要存放的 ISO 镜像文件烧录即可。\n\n\n适用于安卓设备的软件 —— Termux(⭐⭐)\n\n \n 注意:本篇中此方法不会具体展开介绍!\n\n \n特点\n\n支持在 Android 手机上运行虚拟 Linux 系统\n相对适合没有电脑的情况下使用\n仅需安装 Termux 即可得到虚拟的 Linux 环境\n\n安装方式\n\n\nRelease v0.118.0 · termux/termux-app (github.com)\n由于大多数手机为 ARM 架构,因此建议选择 ARM 版本\n\n\n安装 Linux 系统\n下载镜像\n在写这篇文章之前,若你已经下载并安装完环境后,接下来只需要在对应的 Linux 发行版中下载镜像即可。(通常为 *.iso 格式的镜像文件)\n\n这里将使用全球较为流行的 Ubuntu 24.04 LTS 镜像来安装 Linux。\n\n \n \n 下载提示\n\n \n \n 若下载速度缓慢,这里已提供如下镜像站,可以加快下载速度:\n\n清华源下载\n南阳理工学院镜像站\n北京交通大学镜像站\n西安交通大学镜像站\n\n请直接点击上方链接或者复制下载链接,即可开始下载镜像\n\n \n \n新建虚拟机\n这里以 VMware Workstation 17 为例,\n首先,在主页上点击【创建虚拟机】;接下来,就按照下面的图一步一步创建即可(*_*)(这非常简单)\n\n\n\n\n\n\n\n\n完成上述创建后,直接按照如下图提示,开启虚拟机即可\n\n安装 Ubuntu 系统\n一般情况下,在安装 Ubuntu 系统时,将会启动 Grub 引导,此时选择第一项【Try or Install Ubuntu】,等待启动 Ubuntu。\n\n等待完成后,后面仅需按照图中的提示做好初次配置即可开始安装 Ubuntu 系统。虚拟机下仅需设置好用户和密码即可。其余操作仅需点【下一步】即可\n\n若安装完成后,选择重启时将会出现如下图,此时仅需按下回车键即可完成\n\n\n※ 补充内容:安装 VMware Tools 工具\n现如今,在 Ubuntu 及其它 Debian 系发行版下,可直接打开终端,并安装 open-vm-tools 工具包即可,具体命令如下:\nsudo apt install open-vm-tools -y\n完成安装后,将系统注销重新登录之后即可生效\n\n检查 Ubuntu 版本\n按照如下图的操作,查看 Ubuntu 版本号即可\n\n🎉 至此,安装 Linux 系统已经完成!😉\n\n \n \n 跳转提示\n\n \n \n 🎉 你已完成了整个 Linux 的安装,若你对 Linux 系统不是非常熟悉,建议阅读以下文章:\n 从 0 开始学 Linux:熟悉 GNOME 桌面\n 从 0 开始学 Linux:Bash Shell 快速入门\n\n \n \n","categories":["技术教程"],"tags":["Linux","GNOME","桌面环境","Ubuntu"]},{"title":"[Ver 1.0] 更新:CatIsNotFound 正式在 Github Page 上发布","url":"/2024/04/Ver-1-0-%E6%9B%B4%E6%96%B0%EF%BC%9ACatIsNotFound-%E6%AD%A3%E5%BC%8F%E5%9C%A8-Github-Page-%E9%A1%B5%E9%9D%A2%E4%B8%8A%E5%85%AC%E5%85%B1%E5%BC%80%E6%94%BE/","content":"写在最前\n这是本博客网站中第一个大版本,以后每次博客网站有更新时,都会向软件一样发布更新日志😀,以此来看看近年来更新博客的内容。之后会不断更新内容(*_*)\nWhat’s New\n\n\n使用 Hexo 7.1.1 与 RendeFine 2.6.1 框架搭建的个人博客,支持暗黑主题和亮色主题\n\n\n\n\n新增【分类】、【说说】、【壁纸库】等页面,可以快速找到需要查看的博客内容\n\n其中的【壁纸库】均是由博主抽空精心挑选的壁纸,可适用于电脑壁纸\n其中的【说说】会在此留下所有关于作者的一些话\n\n\n\n支持在线播放音乐,目前已存放 11 首纯音乐,但需要手动才能开启\n\n\n\n修复了一些已知的问题,但没完全修复(づ ̄ 3 ̄)づ\n\n\n目前暂未完成的目标:\n\n[x] 评论:基于 Waline 可以支持为不同的文章进行评论\n[ ] 文章:文章数量过少,显得博客没有什么内容(尽量在这个月内超过 15 篇博客)\n[ ] 其它:还有其它杂项的功能或组件需要加入到博客中\n\n\n\n写在最后\n目前只更新了这些内容,部分原来 Hexo 和 RendeFine 的功能在此博客没有完善,后续还会继续努力更新~(●’◡’●)~\n\n另外关于我是如何配置博客的,请看【搭建个人博客(二)】\n\n","categories":["更新日志"],"tags":["更新日志"]},{"title":"Linux Shell 基础命令速查表(非完整版)","url":"/2024/04/Linux-Shell-%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8/","content":"\n \n \n 观前须知\n\n \n \n 此文章将以表格的形式呈现,若需要更为直观的 Linux 命令,请直接查看 Linux 教程 | 菜鸟教程 (runoob.com)\n表格注释: 💡 = 提示,❗ = 注意(需要安装的软件包)\n\n \n \n终端与用户\n\n\n\n名称\n用法 / 选项(简略)\n注释\n\n\n\n\n用户名\nwhoami\n显示当前登录的用户\n\n\n正在登录的用户\n1. who2. w\n1. 查看当前正在登录的用户2. 详细查看当前登录的用户\n\n\n上次登录\nlast\n查看上次当前用户的详细信息\n\n\n主机名\n1. hostname2. hostname -s\n1. 显示完整的主机名2. 显示简单的主机名\n\n\n关于主机\n1. hostnamectl2. hostnamectl set-hostname <hostname>\n1. 显示当前主机信息2. 设置主机名❗:普通用户下需提权\n\n\n提升权限(管理员权限)\nsudo <command>\n以管理员身份执行命令❗:在该用户为管理员的前提下才可用\n\n\n切换其它用户\n1. su <用户名>2. su3. sudo su4. sudo su -\n1. 切换指定用户2. 切换至 root 用户3. 当不知道 root 用户密码的情况下,使用管理员权限切换至 root 用户4. 使用管理员权限切换至 root 用户并切换 Shell 环境💡:若需查看当前使用的 Shell 环境,执行:echo $SHELL\n\n\n输出内容\n1. echo Hello world2. echo "Hello world"3. echo -n "Hello world"4. echo -e "Hello\\nworld"\n1. 直接输出 Hello world2. 与上一条一致,但看起来更直观3. 输出不换行4. 输出时解释反转义符(如:\\n 表示换行)\n\n\n命令变量\n1. alias2. alias n='command'3. unalias n\n1. 显示所有已被定义的变量2. 定义一个新变量 n,以代替某个指令3. 删除新变量 n\n\n\n指令搜索\nwhich <command>\n搜索指定指令所在的路径\n\n\n指令搜索\nwhereis <keyword>\n搜索二进制文件、帮助文件等\n\n\n帮助手册\n1. man <command>2. man -k <keyword>3. man -K <keyword>\n1. 查看关于<command>的帮助2. 搜索帮助3. 全局搜索帮助\n\n\n指令历史记录\n1. history2. history n3. history -c4. history -d n\n1. 查看最近的历史记录2. 显示最近 n 条记录3. 清除所有记录4. 删除第 n 条记录\n\n\n快速执行命令\n1. !!2. !n3. !keyword\n1. 执行上一条指令2. 执行第 n 条指令3. 执行上一条包含 keyword 的指令💡:使用Ctrl+R 可直接进行指令回溯\n\n\n更改用户密码\n1. passwd <user_name>2. passwd\n1. 修改指定用户密码2. 修改当前用户密码\n\n\n启动桌面环境\nstartx\n启动 X.org 桌面环境(GNOME 桌面环境)\n\n\n清屏\nclear\n快捷键:Ctrl+L\n\n\n注销用户\nlogout\n快捷键:Ctrl+D\n\n\n注销或退出终端\nexit\n❗:在装有桌面环境的主机下执行,只会关闭终端窗口;使用远程连接时,则会直接断开连接\n\n\n\n目录与文件管理\n\n\n\n名称\n用法 / 选项(简略)\n注释\n\n\n\n\n查看当前路径\npwd\n查看当前的工作路径\n\n\n切换工作路径\n1. cd <DIR>2. cd3. cd -\n1. 指定一个目录2. 切换至主目录(家目录)3. 回到之前访问过的目录\n\n\n查看路径下的内容\n1. ls 2. ls <DIR1> [DIR2] ...3. ls -l / ll4. ls -h5. ls -a6. ls -R7. ls -d8. ls -Z9. ls -1\n1. 查看当前路径下的内容2. 查看指定单个或多个路径下的内容3. 以详细列表形式显示文件内容4. 显示能看得懂的文件大小5. 显示所有内容(包含隐藏目录或文件)6. 完整显示目录下的所有文件(递归查看)7. 将目录像其它文件一样列出,而不是列出它们的内容8. 显示对应的 SELinux 标签9. 显示一行一个文件或目录\n\n\n新建目录\n1. mkdir <dir1> [dir2]...2. -p\n1. 新建单个或多个空目录2. 递归新建单个或多个空目录\n\n\n删除空目录\n1. rmdir <dir1> [dir2]...2. -p\n1. 删除指定的空目录2. 删除父目录及内部的所有空目录\n\n\n新建文件\ntouch <file1> [file2]...\n新建一个或多个空白的文件\n\n\n复制文件目录\n1. cp <file1> <file2/dir>2. -r3. -p4. -v5. -a\n1. 将文件复制到目标路径2. 递归复制(复制目录)3. 复制时再复制权限4. 显示复制过程5. 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。\n\n\n删除文件目录\n1. rm <file1> [file2]...2. -r / -R3. -f4. -rf \n1. 删除单个或多个目录或文件,可能需确认2. 递归删除**(包括目录)3. 强制性删除,跳过确认4. 强制性递归删除该目录或文件(❗ 谨慎操作)**\n\n\n移动 / 重命名文件目录\n1. mv file1 /doc2. mv a.file b.txt\n1. 将当前目录下的 file1 文件移动到 /doc 目录下2. 将当前目录下的 a.file 文件重命名为 b.txt\n\n\n文件类型\nfile <file1> [file2]...\n查看单个或多个文件类型\n\n\n文件属性\nstat <file1> [file2]\n查看单个或多个文件的详细属性\n\n\n链接(快捷方式)\n1. ln <file> <link>2. ln -s <file> <link>\n1. 创建一个硬链接❗:删除源文件后仍可用,但不能在目录上创建)2. 创建一个软链接❗:删除源文件后不可用\n\n\n以树目录显示内容\ntree <dir>\n❗:其它 Linux 发行版需下载安装 tree 软件包即可\n\n\n\n文件操作编辑\n\n\n\n名称\n用法 / 选项(简略)\n注释\n\n\n\n\n显示/编辑文件内容\n1. cat <file1> [file2]...2. cat -n <file>2. cat > <file>3. cat >> <file>\n1. 显示完整的文件内容2. 带行号显示文件里的内容3. 以行编辑模式下编辑文件并将其覆盖写入到文件中4. 以行编辑模式下编辑文件并将其追加写入到文件中\n\n\n显示头部文件内容\n1. head <file1> [file2]...2. head -n x <file1> [file2]... \n1. 默认查看前 10 行2. 查看前 x 行\n\n\n显示尾部文件内容\n1. tail <file1> [file2]...2. tail -n x <file1> [file2]...3. tail -f <file1> [file2]...\n1. 默认查看尾 10 行2. 查看尾 x 行3. 监视文件的内容(常用于查看日志)\n\n\n翻页信息\n1. <command> | more2. <command> | less3. more <file>4. less <file>\n1. more 仅支持向下翻页,不支持向上翻页2. less 都支持向上向下翻页\n\n\n统计字数、行数、单词数\n1. wc <file1> [file2]...2. -l3. -m4. -w\n1. 统计所有2. 统计行数3. 统计字数4. 统计词数\n\n\n比较两个文件的不同\ndiff <file1> <file2>\n比较 file1 与 file2 的不同\n\n\n行筛选工具\n1. <command> | grep <String>2. grep <keyword> <file1> [file2] \n1. 通过此方法可直接筛选所包含的行并输出2. 在单个或多个文件中查找行内包含的关键字并输出\n\n\n将输出结果写入文件\n1. <command> > <file>2. <command> >> <file>\n1. 将命令的执行结果覆盖写入至文件中2. 将命令的执行结果追加写入至文件中\n\n\n以行编辑模式下编辑文件\n1. tee <file>2. tee -a <file>\n1. 将写入的内容覆盖保存到文件中2. 将写入的内容追加保存到文件中💡:使用行编辑模式下可直接在行内编辑并回车,编辑完成后,按 Ctrl+C 结束编辑并保存\n\n\nvim 文本编辑器 / nano 文本编辑器\n1. vi [file] / vim [file]2. nano [file]\n1. 使用 vi / vim 文本编辑器打开或新建文件其中,vim 编辑器为 vi 的加强版❗:部分 Linux 发行版默认未安装 vim 软件包2. 使用 nano 文本编辑器打开或新建文件\n\n\ntar 压缩包\n1. tar -xvf <file.tar> [-C <dir>]2. tar -xzvf <file.tar.gz/file.tgz> [-C <dir>]3. tar -cvf <file.tar> <压缩目标>4. tar -czvf <file.tar.gz>/<file.tgz>\n1. 解压 tar 包 · -C:指定解压目录 · -x:解压压缩包 · -v:显示压缩或解压进度 · -f:指定存档文件2. 解压 tar.gz / tgz 包 · -z:使用 gzip 格式3. 压缩目录或文件为 tar 包 · -c:创建压缩包4. 压缩目录或文件为 tar.gz / tgz 包\n\n\nzip 压缩包\n1. zip <file.zip> -r <dir/file> [-P <压缩密码> -<0-9>] 2. unzip <file.zip> [-d <dir> ]\n1. 压缩目录或文件为 zip 包 · -r:递归打包(常用于打包目录下的所有文件) · -P:设置压缩密码 · -<0-9>: 表示压缩质量级别,默认值为 6。级别越高,压缩质量越好;级别越低,压缩速度越快2. 解压 zip 包到当前目录 · -d:指定解压目录\n\n\n\n系统与硬件管理\n\n\n\n名称\n用法 / 选项(简略)\n注释\n\n\n\n\n主机信息\nhostnamectl\n查看当前主机的所有信息\n\n\n显示系统信息\n1. uname2. uname -a3. uname -m4. uname -n5. neofetch6. screenfetch\n1. 使用的内核2. 显示所有系统信息3. 使用的物理架构4. 主机名称5. 查看主机信息(需安装 neofetch 软件包)6. 查看主机信息(需安装 screenfetch 软件包)\n\n\n日期时间格式 / 时区\n1. date2. date +<format>3. timedatectl\n1. 显示现在的日期时间2. 自定义显示日期时间格式(如:%F,%T)3. 查看当前的日期时间、时区等详细信息\n\n\n系统管理\n1. systemctl2. systemctl [is-active / is-enabled] <SERVICE>3. systemctl [start / stop / enable / disable / restart / reload / status] <SERVICE>\n1. 用于查看系统下的所有设备、挂载、服务、接口等信息2. 分别查看服务是否运行?是否开机自启?3. 分别管理服务的启动、关闭、允许开机自启、禁用开机自启、重启、重新加载配置、查看状态服务\n\n\n显示启动状态\nuptime\n简要显示电脑的启动状态、登录用户数等\n\n\n任务管理器\n1. top2. htop\n1. 管理所有正在运行的进程2. 需要额外安装 htop 软件包\n\n\n查看指定目录所占空间\n1. du2. du -sh <文件/目录>\n1. 在当前目录下递归查看所有文件及目录的大小2. 在指定目录或文件下查看大小\n\n\n查看磁盘分区情况\ndf -h\n查看所有磁盘分区的大小、占用情况、挂载点等\n\n\n磁盘分区\nfdiskpartedcfdisk\n磁盘分区工具\n\n\n查看磁盘信息\nlsblk\n显示所有块设备的大小及挂载点\n\n\n查看 CPU 信息\nlscpu\n显示 CPU 的详细信息\n\n\n查看电池\nlspower\n显示电池电量及当前使用电池状态\n\n\n内存使用情况\nfree -h\n查看当前的内存使用情况\n\n\n关机\npoweroff / shutdown now\n关闭电源\n\n\n重启\nreboot\n按下 Ctrl+Alt+Delete 也可重启\n\n\n电源管理\nhalt [-p / -f / --reboot]\n1. halt:挂起电源2. -p:关机3. --reboot:重启4. -f:强制性操作**(❗ 谨慎操作)**\n\n\n运行选项\ninit <X>\n其中的 <X> 表示运行级别,具体如下:- 0 :关机- 1:进入紧急模式- 2:多用户模式- 3:带网络的多用户模式- 4:未定义 没什么用- 5:图形界面- 6:重启\n\n\n\n网络与传输\n\n\n\n名称\n用法 / 选项(简略)\n注释\n\n\n\n\n网络配置\n1. nmcli2. nmtui\n1. 命令行下查看所有网络配置2. 图形化界面管理网络配置❗:需要安装 network-manager 软件包\n\n\n测试网络连通\n1. ping <IP / Hostname>2. ping -c 4 <IP / Hostname>\n1. 测试指定 IP 地址或域名是否连通2. 发送 4 个数据包以测试连通性\n\n\n测试远程网络\n1. curl ifconfig.io2. curl ifconfig.io/all3. curl ifconfig.io/all.json -o all.json\n1. 从 ifconfig.io 网站上获取 IP 地址2. 从 ifconfig.io 网站中获取所有信息3. 从 ifconfig.io 网站中下载并保存 JSON 格式的信息\n\n\n显示网络状态\n1. netstat -an2. netstat -at3. netstat -au4. netstat -apu5. netstat -i6. netstat -r7. netstat -ap | grep [SERVICE]8. netstat -anlp | grep [PORT_NUMBER]\n1. 查看当前系统网络状态的所有连接信息2. 查看所有 TCP 端口信息3. 查看 UDP 连接信息4. 查看 UDP 连接端口号使用信息5. 查看网卡状态信息6. 查看网络路由表状态信息7. 搜索某个服务所对应的连接信息8. 查看运行在指定端口的进程❗:若无法执行,需安装 net-tools 软件包\n\n\nIP 路由表\nroute / ip route\n查看 IP 路由表❗:需安装 net-tools 、iproute2 软件包\n\n\n查看物理网卡 IP 地址\nip addr\n此命令可直接简写为 ip a❗:需安装 iproute2 软件包\n\n\n查看物理网卡配置\n1. ifconfig2. ifconfig <网卡名>\n1. 显示所有网卡配置2. 显示指定网卡配置❗:需安装 net-tools 软件包\n\n\n文件下载工具\nwget <file_url>\n从某个 url 中下载文件到当前工作路径\n\n\nSSH 连接\nssh username@<hostname / ip地址> [-p <22 / 指定端口号>]\n使用 SSH 方式连接远程主机,22 为 SSH 默认端口\n\n\nSSH 密钥\n1. ssh-keygen2. ssh-keygen -t [dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\n1. 生成一个新的密钥2. 指定生成某个类型的密钥(常用 RSA 密钥)\n\n\n传输文件工具\n1. scp [<用户名>@<主机名/IP地址>:]<需传输的文件目录> <用户名>@<主机名/IP地址>:<目标目录>2. scp user@hostA:~/a.txt user@hostB:~/doc3. scp test.txt user@hostA:/doc\n1. 将其中一台主机中的文件或目录传输到另一台主机的目录中2. 将主机hostA下的主目录里的 a.txt 文件传输到主机 hostB 下的 ~/doc 目录中3. 将自己主机下的当前目录里的 test.txt 文件传输到主机 hostA 下的/doc 目录中\n\n\n\n","categories":["技术教程"],"tags":["Linux"]},{"title":"搭建个人博客(二):如何详细配置 Hexo + 使用 Redefine 主题美化博客","url":"/2024/04/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E5%A6%82%E4%BD%95%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE-Hexo-%E4%BD%BF%E7%94%A8-Rendefine-%E4%B8%BB%E9%A2%98%E7%BE%8E%E5%8C%96%E5%8D%9A%E5%AE%A2/","content":"概述\n在这上一篇【搭建个人博客(一):如何在 Github Page 上搭建我的个人博客】文章中,我们已经完成了搭建。在这篇文章中,将会详细地讲述搭建后关于 Hexo 的配置以及如何自定义自己的 Redefine 主题。\n\nHexo 配置\n基础配置\n打开项目目录下的 _config.yml 文件,请找到如下内容并修改如下:\n# Sitetitle: \t\t\t\t\t\t# 必填,输入网站标题subtitle: \t\t\t\t\t# 此处可不填,子标题description: \t\t\t\t# 此处可不填,网站简介keywords: \t\t\t\t\t# 此处可不填,关键词author: \t\t\t\t\t# 必填,作者名称language: zh-CN\t\t\t\t# 必填,使用的语言,这里应填为 `zh-CN` timezone: 'Asia/Shanghai'\t# 必填,时区,在国内建议选择上海时间# URL## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'url: https://<你的 Github 用户名>.github.io \t# 必填,Github Page 的地址permalink: :year/:month/:day/:title/permalink_defaults:pretty_urls: trailing_index: true # Set to false to remove trailing 'index.html' from permalinks trailing_html: true # Set to false to remove trailing '.html' from permalinks\n如何更换默认主题\n在完成 Hexo 搭建时,如果需要更换默认主题,仅需在项目根目录下的 _config.yml 文件中找到并修改如下:\ntheme: redefine\t# 请在此处修改主题名称,比如:redefine\n当然,你可以在 https://hexo.io/themes/ 上选择其它主题,这篇就以使用 Redefine 主题为例。\nDeploy 设置\n关于这个,它可以方便我们一次性将写好的博客及配置好的主题打包上传到 Github,以自动同步 Github Page 中,具体需在 _config.yml 文件下找到并修改如下:\n# Deployment## Docs: https://hexo.io/docs/one-command-deploymentdeploy: type: git # 必填,Github 仓库地址 repo: https://github.com/<Github 用户名>/<Github 用户名>.github.io.git branch: 'main'\t# 决定上传到哪个节点下,这里默认选择 'main' token: \t\t\t# 可不填\n测试\n完成这些配置后,需做好如下命令:\nhexo clearhexo ghexo d\n若执行时出现以下信息时,需要手动输入用户名及邮箱\nUsername for 'https://github.com': CatIsNotFound # 输入 Github 用户名Password for 'https://CatIsNotFound@github.com': # 从 Github 中粘贴自己生成的 Token\n\n \n \n 如何获取 Token?\n\n \n \n \n\n要想获取 Token,首先进入此链接 New Personal Access Token (Classic) (github.com)\n\n\n根据如下图所示操作:\n\n\n\n完成后点击最下方的绿色按钮【Generate token】,这将会生成一个随机的 token,如下图:\n\n上图中的绿色框为所需要的 Token。\n\n\n \n 需要注意:\n\t每次仅会显示一次完整的 Token,下一次刷新页面后将会完全隐藏,建议生成后做好备份!\n \n\n \n \n若已经完成了上传,只需要在 github 上刷新即可查看到上传的内容是否类似如下:\n\nRedefine 美化主题配置\n一、安装和测试主题:\n安装主题\nnpm install hexo-theme-redefine@latest\n启用主题\n点击此处查看如何更换主题,这里不再赘述\n主题配置文件\n在项目根目录下,新建一个 _config.redefine.yml 文件,并复制如下内容:\n# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# THEME REDEFINE CONFIGURATION FILE V2# BY EVANNOTFOUND# GITHUB: https://github.com/EvanNotFound/hexo-theme-redefine# DOCUMENTATION: https://redefine-docs.ohevan.com# DEMO: https://redefine.ohevan.com# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# BASIC INFORMATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/basic/infoinfo: # Site title title: Theme Redefine # Author name author: The Redefine Team # Site URL url: https://redefine.ohevan.com# BASIC INFORMATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# IMAGE CONFIGURATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/basic/defaultsdefaults: # Favicon favicon: /images/2024/redefine-favicon.svg # Site logo logo: # Site avatar avatar: /images/2024/redefine-avatar.svg# IMAGE CONFIGURATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# COLORS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/basic/colorscolors: #Primary color primary: "#A31F34" # Secondary color (TBD) secondary: # Default theme mode initial value (will be overwritten by prefer-color-scheme) default_mode: light # light, dark# COLORS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# SITE CUSTOMIZATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/basic/globalglobal: # Custom fonts fonts: # Chinese fonts chinese: enable: false # Whether to enable custom chinese fonts family: # Font family url: # Font URL to CSS file # English fonts english: enable: false # Whether to enable custom english fonts family: # Font family url: # Font URL to CSS file # Content max width content_max_width: 1000px # Sidebar width sidebar_width: 210px # Effects on mouse hover hover: shadow: true # shadow effect scale: false # scale effect # Scroll progress scroll_progress: bar: false # progress bar percentage: true # percentage # Website counter website_counter: url: https://cn.vercount.one/js # counter API URL (no need to change) enable: true # enable website counter or not site_pv: true # site page view site_uv: true # site unique visitor post_pv: true # post page view # Whether to enable single page experience (using swup). See https://swup.js.org/. similar to pjax single_page: true # Whether to enable Preloader. preloader: true # Whether to enable open graph open_graph: true # Google Analytics google_analytics: enable: false # Whether to enable Google Analytics id: # Google Analytics Measurement ID# SITE CUSTOMIZATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end # FONTAWESOME >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/basic/fontawesomefontawesome: # Pro v6.2.1 # Thin version thin: false # Light version light: false # Duotone version duotone: false # Sharp Solid version sharp_solid: false# FONTAWESOME <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# HOME BANNER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/home/home_bannerhome_banner: # Whether to enable home banner enable: true # style of home banner style: fixed # static or fixed # Home banner image image: light: /images/2024/wallhaven-wqery6-light.webp # light mode dark: /images/2024/wallhaven-wqery6-dark.webp # dark mode # Home banner title title: Theme Redefine # Home banner subtitle subtitle: text: [] # subtitle text, array hitokoto: # 一言配置 enable: false # Whether to enable hitokoto api: https://v1.hitokoto.cn # API URL, can add types, see https://developer.hitokoto.cn/sentence/#%E5%8F%A5%E5%AD%90%E7%B1%BB%E5%9E%8B-%E5%8F%82%E6%95%B0 typing_speed: 100 # Typing speed (ms) backing_speed: 80 # Backing speed (ms) starting_delay: 500 # Start delay (ms) backing_delay: 1500 # Backing delay (ms) loop: true # Whether to loop smart_backspace: true # Whether to smart backspace # Color of home banner text text_color: light: "#fff" # light mode dark: "#d1d1b6" # dark mode # Specific style of the text text_style: # Title font size title_size: 2.8rem # Subtitle font size subtitle_size: 1.5rem # Line height between title and subtitle line_height: 1.2 # Home banner custom font custom_font: # Whether to enable custom font enable: false # Font family family: # URL to font CSS file url: # Home banner social links social_links: # Whether to enable enable: false # Social links style style: default # default, reverse, center # Social links links: github: # your GitHub URL instagram: # your Instagram URL zhihu: # your ZhiHu URL twitter: # your twitter URL email: # your email # ...... # you can add more # Social links with QRcode drawers qrs: weixin: # your Wechat QRcode image URL # ...... # you can add more# HOME BANNER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# NAVIGATION BAR >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/home/navbarnavbar: # Auto hide navbar auto_hide: false # Navbar background color color: left: "#f78736" #left side right: "#367df7" #right side transparency: 35 #percent (10-99) # Navbar width (usually no need to modify) width: home: 1200px #home page pages: 1000px #other pages # Navbar links links: Home: path: / icon: fa-regular fa-house # can be empty # Archives: # path: /archives # icon: fa-regular fa-archive # can be empty # Status: # path: https://status.ohevan.com/ # icon: fa-regular fa-chart-bar # About: # icon: fa-regular fa-user # submenus: # Me: /about # Github: https://github.com/EvanNotFound/hexo-theme-redefine # Blog: https://ohevan.com # Friends: /friends # Links: # icon: fa-regular fa-link # submenus: # Link1: /link1 # Link2: /link2 # Link3: /link3 # ...... # you can add more # Navbar search (local search). Requires hexo-generator-searchdb (npm i hexo-generator-searchdb). See https://github.com/theme-next/hexo-generator-searchdb search: # Whether to enable enable: false # Preload search data when the page loads preload: true# NAVIGATION BAR <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# HOME PAGE ARTICLE SETTINGS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/home/homehome: # Sidebar settings sidebar: enable: true # Whether to enable sidebar position: left # Sidebar position. left, right first_item: menu # First item in sidebar. menu, info announcement: # Announcement text show_on_mobile: true # Whether to show sidebar navigation on mobile sheet menu links: # Archives: # path: /archives # icon: fa-regular fa-archive # can be empty # Tags: # path: /tags # icon: fa-regular fa-tags # can be empty # Categories: # path: /categories # icon: fa-regular fa-folder # can be empty # ...... # you can add more # Article date format article_date_format: auto # auto, relative, YYYY-MM-DD, YYYY-MM-DD HH:mm:ss etc. # Article categories visibility categories: enable: true # Whether to enable limit: 3 # Max number of categories to display # Article tags visibility tags: enable: true # Whether to enable limit: 3 # Max number of tags to display# HOME PAGE ARTICLE SETTINGS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# ARTICLE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/posts/articlesarticles: # Set the styles of the article style: font_size: 16px # Font size line_height: 1.5 # Line height image_border_radius: 14px # image border radius image_alignment: center # image alignment. left, center image_caption: false # Whether to display image caption link_icon: true # Whether to display link icon title_alignment: left # Title alignment. left, center headings_top_spacing: # Top spacing for headings from h1-h6 h1: 5rem h2: 4rem h3: 2.8rem h4: 2.5rem h5: 2.2rem h6: 2rem # Word count. Requires hexo-wordcount (npm install hexo-wordcount). See https://github.com/willin/hexo-wordcount word_count: enable: true # Whether to enable count: true # Whether to display word count min2read: true # Whether to display reading time # Author label author_label: enable: true # Whether to enable auto: false # Whether to automatically add author label, e.g. Lv1, Lv2, Lv3... list: [] # Code block settings code_block: copy: true # Whether to enable code block copy button style: mac # mac | simple font: # Custom font enable: false # Whether to enable family: # Font family url: # Font URL to CSS file # Table of contents settings toc: enable: true # Whether to enable TOC max_depth: 3 # TOC depth number: false # Whether to add number to TOC automatically expand: true # Whether to expand TOC init_open: true # Open toc by default # Whether to enable copyright notice copyright: enable: true # Whether to enable default: cc_by_nc_sa # Default license, can be cc_by_nc_sa, cc_by_nd, cc_by_nc, cc_by_sa, cc_by, all_rights_reserved, public_domain # Whether to enable lazyload for images lazyload: true # Article recommendation. Requires nodejieba (npm install nodejieba). Transplanted from hexo-theme-volantis. recommendation: # Whether to enable article recommendation enable: false # Article recommendation title title: 推荐阅读 # Max number of articles to display limit: 3 # Max number of articles to display mobile mobile_limit: 2 # Placeholder image placeholder: /images/2024/wallhaven-wqery6-light.webp # Skip directory skip_dirs: []# ARTICLE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# COMMENT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/posts/commentcomment: # Whether to enable comment enable: true # Comment system system: waline # waline, gitalk, twikoo, giscus # System configuration config: # Waline comment system. See https://waline.js.org/ waline: serverUrl: https://example.example.com # Waline server URL. e.g. https://example.example.com lang: zh-CN # Waline language. e.g. zh-CN, en-US. See https://waline.js.org/guide/client/i18n.html emoji: [] # Waline emojis, see https://waline.js.org/guide/features/emoji.html recaptchaV3Key: wasd # Google reCAPTCHA v3 key. See https://waline.js.org/reference/client/props.html#recaptchav3key turnstileKey: # Turnstile key. See https://waline.js.org/reference/client/props.html#turnstilekey # Gitalk comment system. See https://github.com/gitalk/gitalk gitalk: clientID: # GitHub Application Client ID clientSecret: # GitHub Application Client Secret repo: # GitHub repository owner: # GitHub repository owner proxy: # GitHub repository proxy # Twikoo comment system. See https://twikoo.js.org/ twikoo: version: 1.6.10 # Twikoo version, do not modify if you dont know what it is server_url: # Twikoo server URL. e.g. https://example.example.com region: # Twikoo region. can be empty # Giscus comment system. See https://giscus.app/ giscus: repo: # Github repository name e.g. EvanNotFound/hexo-theme-redefine repo_id: # Github repository id category: # Github discussion category category_id: # Github discussion category id mapping: pathname # Which value to use as the unique identifier for the page. e.g. pathname, url, title, og:title. DO NOT USE og:title WITH PJAX ENABLED since pjax will not update og:title when the page changes strict: 0 # Whether to enable strict mode. e.g. 0, 1 reactions_enabled: 1 # Whether to enable reactions. e.g. 0, 1 emit_metadata: 0 # Whether to emit metadata. e.g. 0, 1 lang: en # Giscus language. e.g. en, zh-CN, zh-TW input_position: bottom # Place the comment box above/below the comments. e.g. top, bottom loading: lazy # Load the comments lazily# COMMENT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# FOOTER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/footerfooter: # Show website running time runtime: true # show website running time or not # Icon in footer, write fontawesome icon code here icon: '<i class="fa-solid fa-heart fa-beat" style="--fa-animation-duration: 0.5s; color: #f54545"></i>' # The start time of the website, format: YYYY/MM/DD HH:mm:ss start: 2022/8/17 11:45:14 # Site statistics statistics: true # show site statistics or not (total articles, total words) # Footer message customize: # ICP record number. See https://beian.miit.gov.cn/ icp: enable: false # Whether to enable number: # ICP record number url: # ICP record url# FOOTER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# INJECT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/injectinject: # Whether to enable inject enable: false # Inject custom head html code head: - - # Inject custom footer html code footer: - -# INJECT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# PLUGINS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/pluginsplugins: # RSS feed. Requires hexo-generator-feed (npm i hexo-generator-feed). See https://github.com/hexojs/hexo-generator-feed feed: enable: false # Whether to enable # Aplayer. See https://github.com/DIYgod/APlayer aplayer: enable: false # Whether to enable type: fixed # fixed, mini audios: - name: # audio name artist: # audio artist url: # audio url cover: # audio cover url lrc: # audio cover lrc# - name: # audio name# artist: # audio artist# url: # audio url# cover: # audio cover url# lrc: # audio cover lrc # .... you can add more audios here # Mermaid JS. Requires hexo-filter-mermaid-diagrams (npm i hexo-filter-mermaid-diagrams). See https://mermaid.js.org/ mermaid: enable: false # enable mermaid or not version: "9.3.0" # default v9.3.0# PLUGINS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# PAGE TEMPLATES >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/page_templatespage_templates: # Friend Links page column number friends_column: 2 # Tags page style tags_style: blur # blur, cloud# PAGE TEMPLATES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# CDN >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/cdncdn: # Whether to enable CDN enable: false # CDN Provider provider: staticfile # staticfile, bootcdn, cdnjs, jsdelivr, unpkg, custom # Custom CDN URL # format example: https://cdn.custom.com/hexo-theme-redefine/${version}/source/${path} # The ${path} must be in the source folder of the theme custom_url: # CDN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end# DEVELOPER MODE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/developerdeveloper: # Whether to enable developer mode (only for developers who want to modify the theme source code, not for ordinary users) enable: false# DEVELOPER MODE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end\n测试主题\n完成如上配置后,首先请保证你的文件目录存放位置是否正确,具体如下:\n\n仅需在终端下执行如下命令,即可看到切换好的主题:\nhexo s\n二、配置主题\n以下配置均在 _config.redefine.yml 文件中完成,具体可参见官方配置教程,这里就仅仅介绍部分比较需要配置的部分了\n\nPS:这里不是作者偷懒,是因为配置项太多了,实在有点没有啥精力讲完。\n\n基本信息\n首先,你需要为自己的网站设置好标题、作者名以及其它的必要信息,具体可以看我的配置:\ninfo: # 站点名称 title: CatIsNotFound # 作者名称 author: CatIsNotFound # 此处指向自己的 Github Page 链接 url: https://catisnotfound.github.io/ defaults: # Favicon favicon: /images/2024/redefine-favicon.svg # 默认的图标,暂时不改 # Site logo logo: \t\t\t# 目前作者暂时没有设计博客图标,可以先空着 # Site avatar avatar: <建议直接从 GitHub 上获取自己的头像链接> colors: # 这里可以选择网站的主色调,建议使用取色器来选择 primary: "#A31F34" # 此处可不选,因为作用不大 secondary: # 这里的默认主题可以选择亮色或暗色 default_mode: light # light, dark\n首页 Banner\n通过如下图一个个比较\n\nhome_banner: # 选择是否显示首页 Banner enable: true # 样式选择默认 style: fixed # static or fixed # 首页 Banner 图片,这里选择了在线的 URL image: light: https://files.codelife.cc/wallhaven/full/g7/wallhaven-g75r7d.jpg?x-oss-process=image/resize,limit_0,m_fill,w_2560,h_1440/quality,Q_92/format,webp # 亮色模式下显示第一张图片 dark: https://files.codelife.cc/wallpaper/wallspic/167264.jpg?x-oss-process=image/resize,limit_0,m_fill,w_2560,h_1440/quality,Q_92/format,webp # 暗色模式下显示另一种图片 # 网站标题 title: <你的网站标题> # 子标题 subtitle: # 这里可以选择轮换文本内容 text: [ '随心所欲地享受每一天\\( ̄︶ ̄*\\))', '随时随地,浏览记录O(∩_∩)O', '如果喜欢,建议给个支持( •̀ ω •́ )✧', '喜欢的话,留个言好嘛(o゚v゚)ノ', '你有建议?反馈作者(●^◡^●)', '欢迎来到我的博客(。・∀・)ノ゙', '文字正在不断轮换(* ̄3 ̄)╭', '正在努力更新博客(ง •_•)ง', '正在不断努力改善博客中ε=( o`ω′)ノ' ] # 通过列表的形式,按顺序轮换文字 # 这里也可使用附加的插件,但个人觉得不大好用 hitokoto: # 一言配置 enable: false # Whether to enable hitokoto api: https://v1.hitokoto.cn # API URL, can add types, see https://developer.hitokoto.cn/sentence/#%E5%8F%A5%E5%AD%90%E7%B1%BB%E5%9E%8B-%E5%8F%82%E6%95%B0 typing_speed: 150 # Typing speed (ms) backing_speed: 30 # Backing speed (ms) starting_delay: 1000 # Start delay (ms) backing_delay: 3000 # Backing delay (ms) loop: true # Whether to loop smart_backspace: true # Whether to smart backspace # 设置亮/暗色模式下文本的颜色 text_color: light: "#101010" # light mode dark: "#d1d1b6" # dark mode # 后面可以保持默认 text_style: # Title font size title_size: 2.8rem # Subtitle font size subtitle_size: 1.5rem # Line height between title and subtitle line_height: 1.2 # 设置自定义字体 custom_font: # Whether to enable custom font enable: false # Font family family: # URL to font CSS file url: # 这里可以设置自己的个人社交链接 social_links: # 是否显示自己的个人链接 enable: true # 选择展示的样式 style: default # default, reverse, center # 具体的社交链接 links: github: https://github.com/CatIsNotFound # your GitHub URL bilibili: https://space.bilibili.com/1896645285?spm_id_from=333.1007.0.0 # My Bilibili zhihu: https://www.zhihu.com/people/catisnotfound # your ZhiHu URL twitter: # your twitter URL email: liaoxinkai0408@outlook.com # your email instagram: # your Instagram URL # ...... # you can add more # 还可以通过二维码的形式来显示,这里最好用在线 URL 会好一点 qrs: weixin: # your Wechat QRcode image URL # ...... # you can add more\n导航栏\n\nnavbar: # 是否自动隐藏导航栏 auto_hide: false # 导航栏的背景颜色 color: left: "#f78736" #left side right: "#367df7" #right side transparency: 35 #percent (10-99) # 导航栏的宽度 width: home: 1200px #home page pages: 1000px #other pages # 设置导航栏的链接 links: Home: path: / icon: fa-regular fa-house # can be empty Archives: path: /archives icon: fa-regular fa-archive # can be empty Categories: path: /categories icon: fa-regular fa-list ShuoShuo: icon: fa-solid fa-comment-dots path: /shuoshuo Links: icon: fa-regular fa-link submenus: Github: https://github.com/CatIsNotFound Zhihu: https://www.zhihu.com/people/catisnotfound Bilibili: https://space.bilibili.com/1896645285 Github: icon: fa-brands fa-github path: https://github.com/CatIsNotFound/CatIsNotFound.github.io # 搜索功能 search: # 是否显示搜索按钮 enable: true # 页面加载时是否先加载搜索数据 preload: true\n侧边栏\n\nhome: # 侧边栏 sidebar: enable: true # 是否显示侧边栏 position: left # 显示位置,只能为 left 或 right first_item: menu # 优先显示菜单还是作者信息. menu, info announcement: # Announcement text show_on_mobile: true links: Archives: path: /archives icon: fa-regular fa-archive # 图标可以为空 Gallery: path: /masonry icon: fa-solid fa-image Tags: path: /tags icon: fa-regular fa-tags Categories: path: /categories icon: fa-regular fa-folder\n\n \n \n 需要注意\n\n \n \n \t这里的 /masonry 、/tags、/categories、/shuoshuo 均需要自己创建,若需创建,仅需在终端中执行如下:\nhexo new page masonryhexo new page tagshexo new page categorieshexo new page shuoshuo\n关于相对应的模块,请根据自己的需求,查看下一节:设定模块。\n\n \n \n三、设定模块\n1. Tags 标签、Categories 分类\n创建标签、分类页面\nhexo new page tagshexo new page categories\n更改样式\n在 _config.redefine.yml 文件中的 page_templates 配置项里面更改 tags_style。\npage_templates: # Tags page style tags_style: blur # blur, cloud\n2. 相册 / 瀑布流\n创建相册页面\nhexo new page masonryhexo new page galleryhexo new page photos\n以上三个名称均可被匹配成同一页面\n如何编辑相册页面\n在你的 Hexo 项目的 source 文件夹里增加 _data 文件夹(如果已有则跳过)\n在 _data 文件夹下新增 masonry.yml 文件。\n在 masonry.yml 文件里面按照如下格式配置相册信息:\n- image: 图片 URL title: 图片标题 description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod - image: https://picsum.photos/id/12/2500/1800 title: Lorem ipsum description: Lorem ipsum dolor sit amet\n3. 说说\n创建说说页面\nhexo new page shuoshuo\n如何编辑说说\n在你的 Hexo 项目的 source 文件夹里增加 _data 文件夹(如果已有则跳过)\n在 _data 文件夹下新增 essays.yml 文件。\n在 essays.yml 文件里面按照如下格式配置相册信息:\n- content: 各位如果有什么建议,欢迎各位通过知乎、B站、Github 私聊作者😊 date: 2024-04-24 00:20:00- content: | 这里是【说说】,在这里都是关于我的所有感悟和留言(*^_^*) 如果你是第一个来看我博客的访客,可以在此处留言哦 目前暂时没有过多的内容,后期会尽可能多更新点博客(ง •_•)ง date: 2024-04-24 00:20:00\n4. 评论\n关于这一块,个人通过官方文档研究了各种各样的方法,最终找到了最佳的方法(*_*),具体参考方法如下:\n\n\n通过 Deta 部署 评论系统,只需要注册 Deta 账号并下载安装即可完成。\n \n \n 需要注意的是:\n其中的 serverUrl 是在 https://deta.space/ 首页上打开 Waline 应用,点击后会打开部署后的网站地址。将其填入 serverUrl 配置中,即可完成全部配置\n\n \n\n\n在 _config.redefine.yml 文件下找到如下内容并修改你获得到的 serverUrl\n comment: config: waline: serverUrl: https://example.example.com #你拿到的 serverUrl\n\n\n这是以上的所有内容,后期还会继续在本文中补充 (*_*)~\n","categories":["博客搭建"],"tags":["博客搭建","Hexo"]},{"title":"如何在命令行下使用 Git?","url":"/2024/04/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E4%BD%BF%E7%94%A8-Git%EF%BC%9F/","content":"Git,作为一款强大的分布式版本控制系统,为代码协作与版本追踪提供了坚实的基础。针对不熟悉命令行操作的菜鸟,本文将简要介绍如何在命令行下利用 Git 进行简单操作。\n下载 Git\n首先,需要先下载 Git,对于不同的操作系统,安装方式各有不同,具体如下:\n\n\nLinux: 根据不同的发行版,在终端中输入对应的安装命令即可\nDebian(Ubuntu)Arch LinuxFedora(Redhat)CentOS(7.9及以下)sudo apt install git -ysudo pacman -Sy git sudo dnf install git -ysudo yum install git -y\n\n\nWindows / MacOS: https://git-scm.com/downloads\n\n\n要检查 Git 安装是否完成,只需执行命令:\ngit --version\n简单使用 Git\n关于此处,你可以直接通过如下图进行速查:\n\n以下是较为常用的 Git 命令:\n首先最为简单的事,就是从 Github 等其它代码托管平台上克隆项目\n克隆源代码项目:\ngit clone [远程仓库地址]\n安装完成后,首先第一件事:就是需要先配置用户和邮箱。\n配置用户:\ngit config --global user.name [你的名字]\n配置邮箱:\ngit config --global user.email [你的邮箱]\n要初始化一个自己的 Git 项目,执行如下:\ngit init [你的项目名]\n当然,你也可以选择在当前目录下初始化你的 Git,只需执行:git init\n将文件添加到分支中:\ngit add *git add .git add [指定的文件或目录]\n\n这里的 * , . 都代表当前目录下所有需要添加或修改的文件\n\n将文件从分支中删除:\ngit rm -r [指定目录] # 删除目录及其所有子文件git rm [指定文件或目录] # 删除文件git rm -r * # 删除所有\n查看所有已添加到分支里的文件\ngit ls-files\n为分支里的文件进行提交(commit:提交时需要用到的标记):\ngit commit -m '[内容]'git commit -am '[内容]' # 添加并提交git commit --amend -m '[内容]' # 反复修改并提交 \n查看当前的分支状态:\ngit status\n关于分支(branch):\ngit show-branch # 查看当前分支历史git show-branch -a # 查看当前分支的所有历史git branch # 查看当前存在的分支git branch -a # 查看所有存在的分支git branch -M main # 新建一个 main 分支git branch -m main main_copy # 将 main 分支改名为 main_copy\n添加远程仓库(Github、Gitlab、Gitee……):\ngit remote add origin [远程仓库地址]\n上传/推流到远程仓库:\ngit push origin master # 将本地分支推流到远程分支\n从远程仓库中获取/合并到本地分支:\ngit pull origin master # 获取远程分支master并merge到本地分支git merge origin/master # 从远程分支中合并到本地分支\n更多进阶的命令,可以查看 Git 常用命令大全,内容更加详细(*_*)。\n","categories":["技术教程"],"tags":["Git"]},{"title":"[Ver 1.2] CatIsNotFound 更新日志","url":"/2024/06/Ver-1-2-CatIsNotFound-%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97/","content":"\n \n \n 写在最前\n\n \n \n 经过了一个多月的博客运营,是时候再发布一次更新日志了。这是以下关于个人博客站点的更新内容。\n\n \n \n页面新增\n\n新增【状态】页面,展示针对当前所有博客的数据统计(包含如下:每日发布文章数量、每月发布文章数量、统计前 8 个文章数量最多的标签、文章类型分布图)。请直接点击下方按钮以直接跳转页面。\n\n 前往【状态】页面\n\n\n新增【壁纸库】页面,展示了本博客站点首页封面曾经使用过的壁纸。壁纸可以直接下载到本地并作为电脑壁纸💻🧐\n\n 前往【壁纸库】页面\n\n杂项\n\n博主已对站点的评论系统进行了较大的优化,可以对当前的评论内容新增表情、动态表情等内容,增加用户体验。\n\n\n\n\n首页封面部分已作出改变:\n\n\n亮色/暗色主题壁纸已全部更换\n\n\n轮播文字已被替换\n\n\n右下角链接处已进行修改\n\n\n\n\n\nRedefine 主题已升级至 v2.6.2,具体更新内容,详见 Release 更新日志。 前往 Release 页面\n\n\n更新计划\n关于本博客站点,现对于下个月的博客内容进行如下变化。有可能会在下个月实现,也可能不会实现。\n\n\n[ ] 更新发布文章:20 篇。鉴于在4月份制定的在五月底发布至少 15 篇文章的计划未完成,所以还需继续发布更多新的文章;\n\n\n[ ] 新增更多分类:目前计划新增【软件安利】、【博客日常】、【学习笔记】等分类,后续可能还会计划新增其它分类;\n\n\n[ ] 多平台发展:上个月尝试在【简书】上运营账号,但可遇而不可求~ o(* ̄▽ ̄*)o,现在正在考虑寻找其它适合的平台;\n\n\n\n \n \n 写在最后\n\n \n \n 最后的最后,如果对于此博客内容有更多更好的建议或需要提出的问题,欢迎随时在任意文章处下方的评论区进行留言。博主将可能会采用邮箱的形式进行一一回复。具体根据您评论时所提供的邮箱来决定。(*_*)\n最后,希望这个博客站点越来越好!🎉🎉🎉\n\n \n \n","categories":["更新日志"],"tags":["更新日志"]},{"title":"搭建个人博客(一):如何在 Github Page 上搭建我的个人博客","url":"/2024/04/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%A6%82%E4%BD%95%E5%9C%A8-Github-Page-%E4%B8%8A%E6%90%AD%E5%BB%BA%E6%88%91%E7%9A%84%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/","content":"概述\n如上标题,现在可以拥有属于自己的个人博客了 ~(^▽^)~ ,\n关于个人博客,可以利用 Github Page 来搭建自己的个人博客。\n\n怎么做?\n1. 注册 Github\n既然提到了 Github Page ,首先就得注册自己的 Github 账号。\n\n如果 Github 界面打不开,建议使用 Watt Toolkit😃,(不仅可以加速 Steam、橙子、育碧,同时也能加速 Github)\n注册一个 Github 账号只需要邮箱,并且进行邮箱验证就能快速完成!ヾ(•ω•`)o\n\n2. 创建自己的仓库\n注册之后,接下来就要创建自己的仓库,\n首先点击【New】,如下图:\n\n其次,创建仓库时,仓库名一定要以[你的用户名].github.io 为名, 默认下都会将其设为 Github Page,之后就能完成创建。具体看下图:\n\n创建完成之后,点击进入你的仓库项目,依次点击【Settings】→ 【Pages】→【Deploy from a branch】,并选择【Github Action】(作此步是方便为了后期可以更换框架来改善自己的博客网页)\n\n3. 选择框架\n当你做完上述步骤后,你可以直接访问自己的网页,如下图:\n\n接下来就是选择网页框架。这里就以 Hexo 为例,这里就只需要用到 git 和 node.js 两个依赖软件了,关于详细地安装步骤,请直接参照官方文档即可\n完成后的搭建,大概是长这样的:\n\n当然,这还不够,你还可以给它更换一个更好看的主题,这里作者就用了 Redefine 主题,大概就是长这样的(*_*):\n\n\n \n \n 跳转提示\n\n \n \n 关于怎么配置这个主题,\n请跳转到:【搭建个人博客(二):如何详细配置 Hexo 使用 Rendefine 主题美化博客】\n\n \n \n最后简单的做个配置,最终呈现了这样的效果:\n\n4. 上传到 Github\n接下来,将本地上制作好的内容上传到 Github 仓库中。关于怎么上传部署 Github Pages,请点击查看关于 Hexo 上传部署到 Github Pages 的教程\n首次执行,需要下列的所有命令:\ngit clone [你的Github仓库地址]cp -r [你的博客名称]/* [Github仓库名称] # 注意两个路径之间留下至少一个空格cd [Github仓库名称]git config --global user.name "[你的Github昵称]"git config --global user.email "[你注册 Github 时所用的邮箱]"git remote add origin [你的Github仓库地址]git add *git commit -m "这里随便写点什么" # 此行指令可不写git push -u origin main\n等待上传完成即可(*_*)\n\n写在后面\n下一篇将继续详细【配置 Hexo,以及如何使用 Redefine 主题美化博客】\n本篇文章中部分没有提到的内容,下一篇也将会详细介绍(*_*)\n","categories":["博客搭建"],"tags":["博客搭建","Hexo","Git","Github"]},{"title":"WSL:一个适用于 Windows 的 Linux 子系统","url":"/2024/06/WSL%EF%BC%9A%E4%B8%80%E4%B8%AA%E9%80%82%E7%94%A8%E4%BA%8E-Windows-%E7%9A%84-Linux-%E5%AD%90%E7%B3%BB%E7%BB%9F/","content":"\n \n \n WSL 简介\n\n \n \n 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。\n\n\n \n \nWSL 适合谁?\n\nLinux 新手、Linux 初学者\n需要大量命令行操作\n需要 Linux 开发、Linux 运维等……\n\nWSL 的优势\n在 Windows 系统下,WSL 是以容器的形式存在,你可以使用它能完成以下几件:\n\n安装/运行各种发行版 Linux:不管你是 Debian 系、Arch 系、Redhat 系,你可以通过 Microsoft Store 上下载你需要的 Linux 发行版。\n管理多个 WSL:这就意味着,你可以不单单只安装一个 Linux 发行版,还可以安装多个。\n独立存储:你可以将文件独立存储于 Linux 文件系统中。\n在 Windows 上调用 Linux 应用程序:在最新的 WSL 2 中,你可以直接在开始菜单中独立运行已安装的 Linux 应用程序。\n\n安装 WSL\n\n \n \n 注意\n\n \n \n WSL 2 支持 Windows 11、Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)\n请在下载安装前,通过 + R 打开【运行】窗口,并执行 winver 查看操作系统内部版本号。\n\n\n \n \n你需要安装 Windows Subsystem for Linux (WSL) 和对应的 Linux 发行版。这里就以安装 WSL 和 Ubuntu 24.04 LTS 为例。首先,请直接点击下方按钮以直接安装如下软件。\n WSL 下载安装\n Ubuntu 24.04 LTS 下载安装\n当你完成如上安装之后,接下来,请直接按下 + X 组合键,进入 Powershell,并输入以下命令,这将会安装 WSL 自选组件。\nwsl.exe --install --no-distribution\n安装完成后,请直接重启自己的电脑。\n之后,你就可以直接在开始菜单中找到并启动 Ubuntu 24.04 LTS ,等待几分钟的安装。\n安装完成之后,你将会在终端上看到类似如下的提示,请按照提示设置一个新的用户和新的密码即可完成。\nPlease create a default UNIX user account. The username does not need to match your Windows username.For more information visit: https://aka.ms/wslusersEnter new UNIX username: 输入你的用户名New password: 设置密码,此处输入的密码是隐藏的Retype new password: 再次设置密码,同上passwd: password updated successfullyInstallation successful!\n\n \n \n 注意\n\n \n \n 当你完成如上安装操作后,如果你忘记了自己设置的密码,可以通过以下方法:\n打开 Powershell,并以 root 用户身份运行,命令如下:\nwsl -u root\n\n若需要指定一个发行版,请直接执行:wsl -d <发行版名称> -u root\n\n然后再在终端中输入以下命令,即可重置密码。\npasswd <用户名>\n其中的 <用户名> 即为你设置的用户名。\n\n \n \nWSL 使用方法与技巧\n命令行操作\nWSL 支持在 Powershell 下进行管理。以下仅介绍几条较有用且常用的 WSL 命令:\n(1)如何安装 Linux 发行版\nwsl --install -d <发行版名称>\n其中,<发行版名称> 即为你要安装的 Linux 发行版名称,例如,若要安装 Ubuntu 24.04 LTS,则执行如下命令:\nwsl --install -d Ubuntu-24.04\n(2)查看所有当前可用的 Linux 发行版\nwsl --list --online\n或者,使用 wsl -l -o 代替。\n(3)列出所有 Linux 发行版的运行状态\nwsl --list --verbose\n或者,使用 wsl -l -v 代替。\n(4)启动默认的 Linux 发行版\nwsl\n若需要指定一个发行版,则执行如下命令:\nwsl -d <发行版名称>\n(5)停止默认的 Linux 发行版\nwsl --shutdown\n若需要指定一个发行版,则执行如下命令:\nwsl --terminate <发行版名称>\n(6)设置默认的 Linux 发行版\nwsl --set-default <发行版名称>\n图形化操作\n如果你觉得以上命令行操作有些许繁琐,那么你可以安装一个图形化管理 WSL 的工具。本文将仅推荐在 Microsoft Store 上下载的两款管理 WSL 的工具。\nWSL Tray Monitor - WSL 系统托盘监控工具\n WSL Tray Monitor 下载安装\n你可以通过此软件来控制任一 WSL 发行版的启动、停止等操作。\n在通知区域图标下,你可以鼠标单击打开管理界面,鼠标双击打开会启动默认的 WSL 发行版并打开终端。\n\nWSL Toolbox - 图形化管理 WSL 的工具箱\n WSL Toolbox 下载安装\nWSL Toolbox 是一个图形化管理 WSL 的工具箱,你可以在里面针对单个容器进行管理,包括安装、启动、停止、重启等操作。甚至可以导入和导出容器。\n但是,对比之前的软件,这个软件并没有系统托盘管理,且容易出现闪退的情况。\n\n文件管理\n你可以在 Windows 资源管理器中访问 Linux,如下图:\n\n使用 Visual Studio Code 开发\n如果你使用 Visual Studio Code 作为你的开发环境,那么你可以直接在 WSL 中打开你的项目,并进行开发。\n你仅需要安装 Visual Studio Code 并安装适用于 WSL 的插件。\n\n写在最后\n最后,希望本文能帮助你更好地了解 WSL,并在日常使用中提高效率。\n\n \n \n 参考链接\n\n \n \n \nhttps://learn.microsoft.com/zh-cn/windows/wsl/install\nhttps://learn.microsoft.com/zh-cn/windows/wsl/setup/environment\nhttps://learn.microsoft.com/zh-cn/windows/wsl/basic-commands\n\n\n \n \n","categories":["技术教程"],"tags":["Windows","Linux","Debian","新手向","WSL"]},{"title":"[Ver 1.3] CatIsNotFound 更新日志","url":"/2024/06/Ver-1-3-CatIsNotFound-%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97/","content":"\n \n \n 写在最前\n\n \n \n 仅此两三周的时间,博客站点又迎来了一次更新。以下是关于本博客站点的更新内容。\n\n\n \n \n新增内容\n博客 Logo\n在本次更新中,本人新增了一个博客站点 Logo;这是基于一张《夏日友人帐》中的猫咪老师的形象而绘制的。\n\n如果此 Logo 存在任何侵权,请直接在评论区下方或者联系本人进行删除。\n页面更新\n很显然,这次的博客站点更新了一些页面,下面将简要介绍:\n首页\n\n\n首页页面下不仅仅只是更新了背景图和轮播文字(打字机效果),还简要地将侧边导航栏、个人信息栏、文章列表做了对调,使得更倾向于先看文章标题及摘要。\n\n\n同时,头部导航栏以及侧边导航栏已作出修改;使得更容易翻阅每篇文章;\n\n\n\n文章页面\n\n\n文章页面底部新增 [自动推荐] 栏目(基于 Nodejieba 算法),你可以在文章页面下方选择推荐的文章;\n\n\n文章页面底部新增 [表情反应] 界面,你可以在对应文章的下方选择你的表情反应;\n\n\n\n\n \n \n 关于评论\n\n \n \n 你可以在此站点上发表评论,但由于 Waline 评论系统的限制,你将无法正常收到任何邮件通知。因此,若遇到问题或有任何建议,请直接通过电子邮件、知乎、B站私信等方式联系本人。\n\n \n \n未来计划\n与之前的更新日志一样,本站点的未来计划也很简单:\n\n\n继续完善博客站点的功能,包括文章分类、标签、搜索功能等;\n\n\n继续创作博客文章,目前暂未达到 20 篇博客文章了。(即使有一部分是水出来的,bushi😅)\n\n\n\n \n \n 更新日志链接\n\n \n \n 关于 Redefine 主题的更新内容,请直接访问以下链接:\n🔗 https://github.com/EvanNotFound/hexo-theme-redefine/releases\n\n \n ","categories":["更新日志"],"tags":["更新日志","Waline"]},{"title":"关于我的博客","url":"/2024/06/about_me/","content":"简介\n这是一个由个人独自用 Hexo 框架所搭建的个人博客网站。该网站托管于 Github 中(Github Pages)。文章正在不断更新中,内容也在尽可能地丰富。\n我是谁?\n我已是专科毕业且成功升入本科的大学生,现在正在努力学习各种技术。\n为什么要有自己的博客?\n简而言之,本人纯粹是为了写点各种想写的文章。什么样的类型都有,有软件安利、技术教程、博客搭建以及学习笔记等等。这么做的目的,一方面是为了养成随时写博客的习惯,其次是为了可以通过博客,可以看到自己的点点滴滴💧💧。\n博客何时更新?\n博客的更新频率最快能做到每周更新两三次(可能每隔两三天会做一次更新),最慢有可能是一两周会更新数次。具体更新频率可能会根据个人的情况而定。\n目前正在更新文章的平台主要是:知乎、B 站(目前在 B 站上不知道应该更新什么内容)\n回到原题,博客本人会不定时地在两个平台以及我的博客网站进行更新**(并不是所有的文章都会同步更新~ o(* ̄▽ ̄*)o)**\n博客有什么类型的内容吗?\n见上上一个【为什么要有自己的博客】这一问题中提到,主要会有各种类型的内容,目前本作者没有什么大的方向。\n当然,你也可以在这个博客网站、B站、知乎等我所在的任何平台上私信留言想要的内容O(∩_∩)O\n如何找到我?\n你可以通过以下几个平台来私信我:\n 知乎主页\n B 站主页\n GitHub\n或者你可以通过其它私人途径来联系我:\n","tags":["关于博客"]},{"title":"搭建个人博客(四):如何实现评论系统","url":"/2024/06/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E5%9B%9B%EF%BC%89%EF%BC%9A%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/","content":"\n \n \n 前言\n\n \n \n 评论系统是博客中不可或缺的一部分,它能够让读者与作者互动,提高博客的互动性。目前针对 Hexo 博客,Waline 评论系统是目前比较流行的评论系统。\n\n\n \n \n\n \n \n 观前注意\n\n \n \n 在开始部署之前,假如之前还未部署过 Hexo 博客,请直接跳转到 搭建个人博客(一):如何在 Github Page 上搭建我的个人博客 进行部署。\n其次,本文主要针对于 Redifine 主题的评论系统部署,其他主题的评论系统部署方式可能有所不同,具体请参考对应主题的说明文档。\n\n \n \nDeta 部署评论系统\n本文根据 Deta 部署 Waline 评论系统,其他部署方式请参考 Waline 官方文档。\n\n \n \n 警告\n\n \n \n 使用 [Deta 部署评论系统] 方法即将不再可用,具体如下正文内容:\n\nDear Deta Community,\nWe’ve made the difficult decision to move on from Space.\nSpace will keep running for 45 days until October 17, 2024. We will then start removing all apps (hosted or installed), > horizons, websites and data.\nYou can continue to login until sunset. We’ve built tools to export your data (and code for developers).\nMore information on our website.\n\n为了避免因 Deta 于 2024 年 10 月 17 日服务关停,建议选择 Vercel 或其它方式部署评论系统!\n关于 Vercel 部署 Waline 以及完整迁移评论数据,请看此文章:\n 搭建个人博客(五):完整迁移评论数据至 Vercel(含 Vercel 部署)\n\n \n \n1. 注册 Deta 账号\n 注册 Deta 账号\n在部署之前,你需要先注册 Deta 账号。\n2. 安装 Waline 插件\n Install Waline to Deta\n请先点击上方按钮,然后再如下页面中,选择 Install on Space 按钮,等待一段时间后就能完成安装。\n\n之后,你将能直接在你的 Space 中看到 Waline 评论系统。\n 访问你的 Deta Space\n在自己的 Deta Space 中,鼠标移动到 Waline,点击这里左上角的设置按钮图标,点击 Open App 选项,查看能否成功访问到 App 页面。\n\n3. 配置 Waline 到你的博客\n请先在自己的 Deta Space 中,点击 Waline 左上角的设置按钮图标,然后点击 Open Settings 选项。\n在如下图的 Domains 选项卡中,复制蓝色字中的域名。\n\n之后,请在你的博客仓库的根目录下,找到 _config.redefine.yml 文件,找到如下内容,并修改其对应的 serverUrl 选项即可。\n\n \n \n 警告\n\n \n \n 不同的主题,配置的方式有所不同。如果你使用的是其他主题,请自行参考对应主题的说明文档。\n\n \n \n# COMMENT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/posts/commentcomment: config: # Waline comment system. See https://waline.js.org/ waline: serverUrl: https://************** # 在 * 处粘贴你的 Deta 域名 lang: zh-CN # Waline language. e.g. zh-CN, en-US. See https://waline.js.org/guide/client/i18n.html\n4. 测试你的评论\n请在你的本地上运行 npx hexo server 命令,然后访问你的博客。在任意一篇文章页面下方,进行评论吧!\n 访问我的个人网站\n查看/管理评论\n关于此内容,若你已经完成部署且成功发出评论后,你可以按照以下方式查看或管理评论。当然你还可以设置邮箱提醒功能,当有访客评论你的文章时,你将会收到邮件提醒。\n在 Waline 中管理/查看评论\n首先进入你的博客,在任意一篇文章页面下方,点击 登录 按钮,在弹出的登录页面里,请使用 Github 账号以快捷登录。\n\n\n登录成功后,你可以直接点击左上角的【管理】→ 【评论】,以查看所有评论。\n\n你还可以点击左上角的【管理】→ 【用户】,以管理用户。\n\n在 Deta 中查看评论\n首先进入你的 Deta Space,点击 Waline 应用,然后点击 View App Data 按钮,在此页面中,你可以看到所有评论的详细信息。\n\n其中,该页面中,有以下两个表 Comment 和 Users 表,分别存储了评论信息和用户信息。\n以下是每个表内对应列的含义:\n\nComment 表:\n\nkey: 评论的唯一标识符\ncomment: 评论内容\ninsertAt: 评论时间\nip: 评论者 IP 地址\nlikes: 点赞数(默认为空)\nmail: 评论者邮箱\nnick: 评论者昵称\nobjectId: 评论所属文章的唯一标识符\nstatus: 评论状态(默认 approved 表示正常)\nua: 评论者浏览器信息\nurl: 当前评论文章页面的 URL\nuser_id: 评论者的唯一标识符\n…\n\n\nUsers 表:\n\nkey: 用户的唯一标识符\navatar: 用户头像 URL\ndisplay_name: 用户昵称\nemail: 用户邮箱\nlabel: 用户标签(默认为空)\nobjectId: 用户唯一标识符\npassword: 用户密码(已被加密)\nqq: 第三方授权 QQ 号(用户若已绑定 QQ)\ntype: 用户类型(默认 guest 表示普通用户)\nurl: 用户主页 URL\ngithub: 第三方授权 GitHub 账号(用户若已绑定 GitHub)\n\n\n\n附加功能\n邮件提醒\nWaline 评论系统支持邮件提醒功能,当其它访客访问你的博客时,并且在某篇文章的评论区留言时,会收到邮件提醒。\n为了实现这个功能,你需要在 Deta Space 中,找到 Waline 应用,然后点击 Open Settings 按钮,在 Configuraion 选项卡中,找到如下变量并输入对应的值即可。\n\n邮件通知需要配置以下环境变量:(以下变量均为必填)\n\nSMTP_SERVICE: SMTP 邮件发送服务提供商。\n\n\n \n \n 提示\n\n \n \n 你可以点击下方的按钮,在这里找到 SMTP 邮件发送服务提供商的列表,并查看所有支持的运营商。\n 点击此处查看 SMTP 邮件发送服务提供商列表\n\n \n \n\nSMTP_HOST: SMTP 服务器地址(必填)\nSMTP_PORT: SMTP 服务器端口(必填)\nSMTP_USER: SMTP 邮件发送服务的用户名,一般为登录邮箱。\nSMTP_PASS: SMTP 邮件发送服务的密码,一般为邮箱登录密码,部分邮箱(例如 163、qq)需要使用授权码。\nSITE_NAME: 网站名称,用于在消息中显示。\nSITE_URL: 网站地址,用于在消息中显示。\nAUTHOR_EMAIL: 博主邮箱,用来接收新评论通知。如果是博主发布的评论则不进行提醒通知。\n\n配置完以上配置后,使用鼠标滚轮滚到最底,并点击 Save Change 按钮,若左上角提示 Presets saved 则表示配置成功。\n接下来,只需要回到你的博客网站,使用任意其它用户的身份在评论区留言,其它访客访问你的博客时,你将会收到邮件提醒。\nEmoji 表情\n你可以像如下图所示的那样,在你的博客中加入 Emoji 表情。\n\n如果你需要进行添加 Emoji 表情,请直接在 _config.redefine.yml 文件中,找到 emoji 选项,并添加对应的 URL 即可。\n# COMMENT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start# Docs: https://redefine-docs.ohevan.com/posts/commentcomment: config: # Waline comment system. See https://waline.js.org/ waline: emoji: [ 'https://unpkg.com/@waline/emojis@1.2.0/bmoji', 'https://unpkg.com/@waline/emojis@1.2.0/weibo', 'https://unpkg.com/@waline/emojis@1.2.0/qq', 'https://unpkg.com/@waline/emojis@1.2.0/soul-emoji', 'https://unpkg.com/@waline/emojis@1.2.0/tw-emoji' ] # 请以数组的方式添加 Emoji 表情的 URL\n关于 Emoji 表情的更多信息,请参考 Waline 官方文档。\n参考链接\n🔗 https://redefine-docs.ohevan.com/posts/comment\n🔗 https://waline.js.org/guide/get-started/\n🔗 https://waline.js.org/guide/deploy/deta.html\n🔗 https://waline.js.org/guide/features/emoji.html\n🔗 https://waline.js.org/guide/features/notification.html\n","categories":["博客搭建"],"tags":["博客搭建","Waline"]},{"title":"从 0 开始学 Linux:Bash Shell 快速入门","url":"/2024/06/%E4%BB%8E-0-%E5%BC%80%E5%A7%8B%E5%AD%A6-Linux-Bash-Shell-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/","content":"写在最前\n本教程将介绍一些基本的 Bash 命令行操作,包括目录操作、文件操作、文件处理等。\n文中出现的命令块中的 [Content] 表示可选内容,即可以省略。<Content> 表示必填内容,不可省略。\n命令块示例:\nsudo apt install <软件包> [-y]\n其中的 <软件包> 表示必填,[-y] 表示可选。\n\n \n \n 准备之前\n\n \n \n 在阅读本文教程之前,如果还未安装 Linux 环境,请先在下方按钮中选择任一方式以进行安装:\n 从 0 开始学 Linux - 安装 Ubuntu 24.04 LTS 系统\n WSL:一个适用于 Windows 的 Linux 子系统\n\n \n \nBash 命令行\nBash 是一种交互式命令行解释器,它提供命令行界面,让用户可以执行命令、查看文件、创建目录、删除文件等操作。\n命令组成\nBash 命令由命令名和参数组成。\n命令名:命令的名称,如 ls、cd、mkdir、rm 等。\n参数:命令的附加信息,通常以 -o 或者 --option 形式出现。参数可以混合使用。\n命令组成示例:\nls -l -h -als -lah\n输入命令\n\n\n直接在命令行中输入完整的命令,并按下 Enter 键。\n\n\n在命令行中输入命令的前缀或输入文件路径时,按下 Tab 键,Bash 会自动补全命令。\n\n\n使用历史命令:\n\n输入 history 命令,可以查看历史命令。\n在命令行中输入 !<命令编号>,可以执行历史命令。\n\n\n\n命令回溯:\n\n使用方向键 ↑ 和 ↓ 可以回溯历史命令。\n使用快捷键 Ctrl + R,可以快速执行之前的命令。\n\n\n\n编辑命令:\n\n使用 Ctrl + A 定位到命令行首。\n使用 Ctrl + E 定位到命令行尾。\n使用 Ctrl + K 删除光标到命令行尾的内容。\n使用 Ctrl + U 删除光标到命令行首的内容。\n\n\n\n退出命令行\n退出命令行有两种方式:\n\n\n直接按下 Ctrl + D 键。\n\n\n输入 exit 命令。\n\n\n常用命令\n以下是一些常用的命令,包括目录操作、文件操作、文件处理等。\n若需要了解更多命令,请直接查询 Linux Shell 基础命令速查表(非完整版)。\n Linux Shell 基础命令速查表\n管理软件包\n你可以利用命令行实现安装、卸载、更新软件包等操作。\n不同的 Linux 发行版,所对应的包管理器有所不同。 请根据自己所用的发行版系统对号入座。\nDebian / UbuntuFedora / Red HatArch / ManjaroopenSUSE\n安装软件包:\n\nsudo apt install <软件包名> [-y]\n其中的 -y 参数可选,表示跳过确认并直接安装。\n\n更新软件包:\n\nsudo apt updatesudo apt upgrade [-y]\n\n卸载软件包:\n\nsudo apt remove <软件包名> [-y]sudo apt autoremove [-y]\n或者,直接执行 sudo apt purge <软件包名> [-y] 即可。\n\n搜索软件包:\n\napt search <软件包名> [--full-name-only | --names-only]\n--full-name-only: 参数可选,仅显示完整的软件包名称;\n--names-only: 参数可选,仅显示软件包名称。\n 注意:\n若你的 Red Hat 版本低于 8.0(不包括 8.0),请将 dnf 替换为 yum。\n如果你不确定当前是否可以使用 dnf,请直接执行 which dnf 即可。\n \n\n安装软件包:\n\nsudo dnf install <软件包名> [-y]\n其中的 -y 参数可选,表示跳过确认并直接安装。\n\n更新软件包:\n\nsudo dnf upgrade [-y]\n\n卸载软件包:\n\nsudo dnf remove <软件包名> [-y]\n或者,直接执行 sudo dnf erase <软件包名> [-y] 即可。\n\n搜索软件包:\n\ndnf search <软件包名>\n安装软件包:\n\nsudo pacman -S <软件包名> [--noconfirm]\n--noconfirm: 参数可选,表示跳过确认并直接安装。\n\n更新软件包:\n\nsudo pacman -Syu\n\n卸载软件包:\n\nsudo pacman -R <软件包名> [--noconfirm]\n或者,直接执行 sudo pacman -Rs <软件包名> [--noconfirm] 即可。\n\n搜索软件包:\n\npacman -Ss <软件包名>\n安装软件包:\n\nsudo zypper install <软件包名> [-y]\n其中的 -y 参数可选,表示跳过确认并直接安装。\n\n更新软件包:\n\nsudo zypper refreshsudo zypper update [-y]\n\n卸载软件包:\n\nsudo zypper remove <软件包名> [-y]\n或者,直接执行 sudo zypper rm <软件包名> [-y] 即可。\n\n搜索软件包:\n\nzypper search <软件包名>\n文件管理\n你可以利用命令行实现文件管理操作,如创建、删除、移动、复制文件或目录。\n目录操作\n\n切换工作目录:\n\ncd <目录路径>\n特别的目录路径有:\n\n~ 表示当前用户的主目录。\n- 表示回到上一次所在的目录。\n. 表示当前目录。\n.. 表示上级目录。\n\n\n创建目录:\n\nmkdir [-p] <目录路径>\n其中的 -p 参数可选,表示创建父目录。\n\n删除目录:\n\nrm -r <目录路径>\n其中的 -r 参数可选,表示递归删除目录及其内容。\n\n复制目录:\n\ncp -r <源目录路径> <目标目录路径>\n或者,直接执行 cp -r <源目录路径>/* <目标目录路径> 即可。\n\n移动目录:\n\nmv <源目录路径> <目标目录路径>\nmv 命令既可以实现文件或目录的移动,同时也可以重命名。\n比如:mv file1.txt file2.txt 可以将 file1.txt 重命名为 file2.txt。\n\n查看目录内容:\n\nls [目录路径] [参数]\n直接输入 ls 将显示当前目录的内容。\n其中,ls 常用的参数有:\n\n-a: 显示所有文件,包括隐藏文件。\n-l: 显示详细信息,包括文件权限、所有者、大小、修改时间等。\n-h: 以人类可读的方式显示文件大小。\n-R: 递归显示目录下的所有文件。\n\n文件操作\n\n创建文件:\n\ntouch <文件路径>\n\n删除文件:\n\nrm <文件路径>\n\n复制文件:\n\ncp <源文件路径> <目标文件路径>\n\n移动文件:\n\nmv <源文件路径> <目标文件路径>\n\n查看文件内容:\n\ncat <文件路径>\n\n查看文件属性:\n\nfile <文件路径>ls -l <文件路径>\n\n查看文件大小:\n\ndu -sh <文件路径>\n文件处理\n你可以通过命令行实现文件处理操作。\n写入文件\n写入文件有多种方式,以下介绍几种常用方法:\n方法一:使用 echo 可以将内容写入文件。\necho <内容> > <文件路径>echo <内容> >> <文件路径>\n\n\n> 表示写入文件,若文件内容存在,则覆盖原有内容;\n\n\n>> 表示追加内容到文件末尾。\n\n\n方法二:使用 tee 命令可以将内容写入文件,并同时输出到屏幕。\ntee [-a] <文件路径>\n执行此命令后,你可以输入内容并按下回车,内容将同时写入文件和屏幕。若要结束输入,请按下快捷键: Ctrl + D 或 Ctrl + C。\n其中的 -a 参数可选,表示追加内容到文件末尾。\n方法三:使用 cat 命令将内容写入文件。\ncat > <文件路径>cat >> <文件路径>\n执行此命令后,你可以输入内容并按下回车,内容将写入文件。若要结束输入,请按下快捷键: Ctrl + D 或 Ctrl + C。\n读取文件\n方法一:使用 cat 命令读取文件内容。\ncat <文件路径>\n方法二:使用 less 命令分页显示文件内容。\nless <文件路径>\n方法三:使用 head 命令显示文件开头内容。\nhead [-n <行数>] <文件路径>\n方法四:使用 tail 命令显示文件末尾内容。\ntail [-n <行数>] <文件路径>\n方法五:使用 grep 命令搜索文件内容。\ngrep <搜索内容> <文件路径>\n或者你可以利用 cat、 grep 以及管道符 | 组合命令以搭配使用。\ncat <文件路径> | grep <搜索内容>\n搜索文件\n方法一:使用 find 命令搜索文件。\nfind <目录路径> [选项]\n其中,find 命令常用的参数有:\n\n-name: 指定文件名。\n-type: 指定文件类型。\n\nf: 显示普通文件。\nd: 显示目录。\nl: 显示符号链接。\n\n\n-iname: 指定文件名,不区分大小写。\n-size: 指定文件大小。\n\n+n: 大于 n 字节的文件。\n-n: 小于 n 字节的文件。\nn: 等于 n 字节的文件。\n\n\n-mtime: 指定文件最后修改时间。\n\n+n: 距离现在 n 天以内的文件。\n-n: 距离现在 n 天以前的文件。\nn: 距离现在 n 天的文件。\n\n\n-exec: 执行命令。\n\nfind <目录路径> -name <文件名> -exec <命令> {} \\;\n其中的 {} 表示搜索结果中的每一个文件名。\n方法二:使用 locate 命令搜索文件。\nlocate <文件名>\n\n \n 注意:\n部分发行版可能没有安装 locate 命令,请直接使用对应的包管理器以安装 mlocate。\n具体安装方法,请见:管理软件包 一节\n\n \n写在最后\n以上仅介绍了一些基本的 Bash 命令行操作,若需要了解更多命令,请直接查询 Linux Shell 基础命令速查表(非完整版)。\n Linux Shell 基础命令速查表\n若在学习过程中遇到问题,欢迎在评论区留言。\n\n \n \n 跳转提示\n\n \n \n 若你需要学习 Bash 脚本,请点击下方按钮:\n 从 0 开始学 Linux - Bash Shell 脚本入门\n\n \n ","categories":["技术教程"],"tags":["Linux","新手向","脚本"]},{"title":"从 0 开始学 Linux:Bash Shell 脚本入门","url":"/2024/06/%E4%BB%8E-0-%E5%BC%80%E5%A7%8B%E5%AD%A6-Linux-Bash-Shell-%E8%84%9A%E6%9C%AC%E5%85%A5%E9%97%A8/","content":"Bash 是一个支持脚本的命令行解释器,你可以利用脚本来自动化执行一些重复性的任务。\n本文将在已有的基础上,学习 Bash Shell 脚本的基本语法和使用方法。若你对 Bash Shell 还不熟悉,请先阅读以下文章:\n 从 0 开始学 Linux:Bash Shell 快速入门\n脚本文件\n脚本文件以 .sh 结尾,并包含一系列命令。\n若要运行脚本,需为脚本文件添加可执行权限并执行,也可以通过 bash 命令以执行。\nchmod +x <脚本文件路径>./<脚本文件路径>\nbash <脚本文件路径>\n定义解释器\n脚本文件第一行必须指定脚本的解释器,即 /bin/bash。\n#!/bin/bash\n当然,你也可以指定其它的 Shell 解释器,如 /bin/sh、/bin/zsh等。甚至,你还可以使用 Python 解释器以执行 Python 脚本。\n#!/bin/python\n注释\n注释以 # 开头,表示后面的内容为注释。\n# 这是一行注释\n变量\n变量是存储数据的容器,可以用来保存字符串、数字、列表等数据。\n定义变量\n变量名只能包含字母、数字和下划线,且不能以数字开头。\n你可以利用 ` … ` 来包裹命令,或者用 $(command) 定义变量。其中的 command 为执行的命令,将输出结果赋值给变量。\n# 定义变量name="John"age=30pwd=`pwd` # 获取当前目录路径file_list=$(ls) # 获取当前目录下的文件列表list="1 4 7 10" # 列表,用空格分隔# 输出变量echo name=$nameecho age=$ageecho pwd=$pwdecho file_list=$file_list# 循环输出列表echo "List:"for num in $list; do echo $numdone\n利用用户输入赋值\n你可以利用 read 命令从用户输入中获取值并赋值给变量。\n# 利用 read 命令获取用户输入并赋值给变量read -p "Please enter your name: " nameecho "Your name is $name."\n-p 参数表示提示用户输入,name 为用户所赋值的变量。\n特殊变量\n在 Bash 中,有一些特殊的变量,可以用来获取系统信息等,大致如下:\n\n$0: 当前脚本的文件名。\n$n: 传递给脚本或函数的参数。其中,n 需要代替为对应的参数序号。\n$#: 传递给脚本或函数的参数个数。\n$*: 传递给脚本或函数的所有参数。\n$@: 传递给脚本或函数的所有参数,每个参数以空格分隔。\n$?: 上个命令的退出状态。0 表示命令成功,否则表示失败。\n$$: 当前 Shell 进程的进程 ID。\n$!: 当前 Shell 最后运行的后台进程的进程 ID。\n$HOME: 当前用户的主目录。\n$PWD: 当前工作目录。\n$OLDPWD: 上一个工作目录。\n$UID: 当前用户的 UID。\n$EUID: 当前用户的有效 UID。\n$USER: 当前用户的用户名。\n$GROUPS: 当前用户的组列表。\n$PATH: 查找命令的路径。\n\n运算变量\n变量还可以用来执行简单的运算。\n你可以利用 expr 命令进行基本的运算,也可以利用 $((...)) 或 $[...] 进行更复杂的运算。\n# 定义变量num1=10num2=5# 运算result1=$((num1 + num2))result2=$[num1 - num2]result3=`expr $num1 \\* $num2`# 输出结果echo "num1 + num2 = $result1"echo "num1 - num2 = $result2"echo "num1 * num2 = $result3"\n\n \n 注意:\n使用 * 运算符时,需要使用反转义符 \\ 来转义。即 \\* 而不是 *。\n\n \n条件语句\n条件语句可以根据条件执行不同的代码块。\n语句结构\n# if 语句if [ <条件> ]; then <代码块>fi# if-else 语句if [ <条件> ]; then <代码块>else <代码块>fi# if-elif-else 语句if [ <条件1> ]; then <代码块1>elif [ <条件2> ]; then <代码块2>else <代码块3>fi\n运算符\n条件语句中可以使用以下运算符:\n\n-eq:等于 equals。\n-ne:不等于 not equal。\n-gt:大于 greater than。\n-lt:小于 less than。\n-ge:大于等于 greater than or equal。\n-le:小于等于 less than or equal。\n\n这里假设 x 和 y 分别等于 10 和 20,则:\n\n\n\n示例\n结果\n\n\n\n\n[ $x -eq $y ]\nfalse\n\n\n[ $x -ne $y ]\ntrue\n\n\n[ $x -gt $y ]\nfalse\n\n\n[ $x -lt $y ]\ntrue\n\n\n[ $x -ge $y ]\nfalse\n\n\n[ $x -le $y ]\ntrue\n\n\n\n\n \n 注意:\n这里的 -eq 等运算符前后都需要有空格。且 -eq 等运算符只能用于数字比较,不能用于字符串比较。\n\n \n字符串比较\n条件语句也可以比较字符串。通常,字符串比较使用 == 、 !=、=~ 等运算符。\n\n\n字符串相等关系可以使用 == 运算符,表示任意字符串相等关系。\n\n\n字符串包含关系可以使用 =~ 或者 *string* 运算符,表示任意字符串包含关系。\n\n\n字符串不匹配关系可以使用 != 运算符,表示任意字符串不匹配关系。\n\n\n字符串不包含关系可以使用 != 运算符和 * 运算符,表示任意字符串不包含关系。\n\n\n# 定义变量str1="helloworld"str2="owo"str3="world"# 字符串比较if [ $str1 == $str3 ]; then echo "str1 is equal to str2"fi# 字符串包含if [[ $str1 =~ $str2 ]]; then echo "str2 is included in str1"fiif [[ $str1 == *$str3* ]]; then echo "str3 is included in str1"fi# 字符串不匹配if [[ $str1 != $str2 ]]; then echo "str1 is not equal to str2"fi# 字符串不包含if [[ $str2 != *$str3* ]]; then echo "str2 is not included in str1"fi\n逻辑运算符\n条件语句还可以使用逻辑运算符 && 和 || 来组合多个条件。\n\n&&: 逻辑与 and。\n||: 逻辑或 or。\n\n示例:判断 var1 和 var2 是否都在 vars 列表中, var2 或 var3 两者之中是否有一元素在 vars 列表中。\n# 定义变量var1="apple"var2="banana"var3="orange"vars="[apple banana cherry]"if [[ $var1 =~ $vars ]] && [[ $var2 == *$vars* ]]; then echo "var1 and var2 are in vars"fiif [[ $var2 =~ $vars ]] || [[ $var3 =~ $vars ]]; then echo "var2 or var3 are in vars"fi\n示例\n示例 1:判断 ~/apt/history.log 文件是否存在,若不存在,则复制 /var/log/apt/history.log 文件到 ~/apt/history.log 中。\n注意:你还需要判断 ~/apt 目录是否存在。\n# 判断 ~/apt 目录是否存在if [ ! -d ~/apt ]; then mkdir ~/aptfi# 判断 ~/apt/history.log 文件是否存在if [ ! -f ~/apt/history.log ]; then cp /var/log/apt/history.log ~/apt/history.logfi\n示例 2:判断当前用户是否为 root,若不是,则提示用户输入密码。\n#!/bin/bash# 判断当前用户是否为 root# 方法一:利用 $UID 变量,若等于 0,则当前用户为 rootif [ $UID -ne 0 ]; then echo "Please use root account to run this script."else echo "You are root."fi# 方法二:利用 $EUID 变量,若等于 0,则当前用户为 rootif [ $EUID -ne 0 ]; then echo "Please use root account to run this script."else echo "You are root."fi# 方法三:利用 $USER 变量,若等于 root,则当前用户为 rootif [ $USER != "root" ]; then echo "Please use root account to run this script."else echo "You are root."fi\n循环语句\n循环语句可以重复执行代码块。\n语句结构\n在使用 for 循环时,变量的取值可以是列表、范围或命令的输出结果。\n其中的 <命令> 可以用反引号 ` … ` 包裹,也可以用 $() 包裹。\n# for 循环for <变量> in <值1> <值2>...; do <代码块>donefor <变量> in {<值1>..<值2>}; do <代码块>donefor <变量> in [`<命令>` || $(<命令>)]; do <代码块>done# while 循环while [ <条件> ]; do <代码块>done# until 循环until [ <条件> ]; do <代码块>done\n循环控制\n循环语句还可以控制循环的次数。\n\nbreak: 跳出循环。\ncontinue: 跳过当前循环,继续下一次循环。\n\n示例\n示例 1:打印 1 到 10 的偶数。当遇到 6 时,跳出循环。\n# for 循环for i in {1..10}; do if [ $((i%2)) -eq 0 ]; then echo $i fi if [ $i -eq 6 ]; then break fidone\n若你对 Java 熟悉,你可能还会发现 for 循环的语法类似于 Java 中的 for 循环。\n# for 循环for ((i=1; i<10; i+=2)); do echo $i if [ $i -eq 6 ]; then break fidone\n示例 2:打印 1 到 10 的所有偶数,当遇到 6 时,跳过当前循环,继续下一次循环。\n# while 循环count=0while [ $count -lt 10 ]; do count=$((count+2)) if [ $count -eq 6 ]; then continue fi echo $countdone\n示例 3:打印 1 到 10 的所有偶数,当遇到 4 时,跳过当前循环;当遇到 6 时,跳出循环。\n# until 循环count=0until [ $count -eq 10 ]; do count=$((count+1)) if [ $count -eq 4 ]; then continue fi if [ $count -eq 6 ]; then break fi echo $countdone\n选择语句\n选择语句可以根据用户的选择执行不同的代码块。\n语句结构\nselect 语句可以让用户从列表、范围、命令输出结果中选择一个值,并赋值给变量。\n# select 语句select <变量> in [<值1> <值2>... || {<值1>..<值2>}]; do <代码块>doneselect <变量> in [`command` || $(command)]; do <代码块>done\ncase 语句也可以根据变量的值执行不同的代码块。使用 case 语句时需要注意以下几点:\n\ncase 语句必须与 esac 配对使用。\ncase 语句中的 in 必须与 ) 配对使用。\ncase 语句中的 ;; 必须与 ) 配对使用。\ncase 语句中的 *) 表示其他情况。\n\ncase <变量> in <值1>) <代码块1> ;; <值2>) <代码块2> ;; *) <代码块3> ;;esac\n\n \n 注意:\n选择语句只能在交互式 Shell 中使用,如 bash 或 zsh。\n注意每条命令的结尾必须以 ;; 结尾,表示选择结束。\n\n \n示例\n示例 1:提示用户输入数字,并根据输入执行不同的操作。\n\n输入 start 时启动服务器;\n输入 stop 时停止服务器;\n输入 restart 时重启服务器;\n输入 exit 时退出脚本。\n输入其他内容时显示错误信息。\n\n# select 语句echo "Please select an option:"# select 语句echo "Please select an option:"select option in start stop restart exit; do case $option in start) echo "Starting the server..." ;; stop) echo "Stopping the server..." ;; restart) echo "Restarting the server..." ;; exit) echo "Exit..." break ;; *) echo "Invalid option" ;; esacdone\n\n \n 注意:\n当执行 select 语句时,脚本会持续循环,直到用户输入 exit 选项才能退出循环。\n若用户需要直接退出程序,按下 Ctrl+C 即可。\n\n \n示例 2:提示用户输入数字,并根据输入执行不同的操作。\n\n输入 1 时,打印 You entered 1。\n输入 2 时,打印 You entered 2。\n输入 3 时,打印 You entered 3。\n输入其他值时,打印 Invalid input。\n\n# case 语句echo "Please enter a number:"read numcase $num in 1) echo "You entered 1" ;; 2) echo "You entered 2" ;; 3) echo "You entered 3" ;; *) echo "Invalid input" ;;esac\n函数\n函数可以将一系列命令封装成一个整体,可以重复使用。\n语法结构\n# 定义函数function <函数名 1>() { <代码块> return <返回值> # 可选语句,但必须在函数体最后一行}# 或者可以省略 function 关键字<函数名 2>() { <代码块> <函数名 1> [<参数>] # 可以调用其他函数 return <返回值> }# 调用函数<函数名>\n\n \n 注意: 关于函数定义,你需要注意以下几点:\n\n\n函数定义时,函数名只能包含字母、数字和下划线,且不能以数字开头。\n\n\n函数调用时,函数名后面可以加上参数,参数之间用空格分隔。\n\n\n函数定义时,函数体必须用花括号 {} 包裹。\n\n\n函数定义时,函数体内的变量作用域为局部变量,函数执行结束后,局部变量会被销毁。\n\n\n函数可以返回值,使用 return 语句。但必须将 return 语句置于函数体最后一行。否则,函数将立即结束。\n\n\n函数可以调用其他函数。\n\n\n\n \n示例\n示例 1:定义一个函数 hello(),要求用户输入姓名,并打印 Hello, <姓名>!。\n# 定义函数function hello() { echo "Hello, $1!"}# 调用函数read -p "Please enter your name: " namehello $name\n示例 2:定义一个函数 times() 和一个函数 sum(),要求用户输入一个数字,并打印 The sum is <结果>。\n参考输入输出:\n\n3 --> The sum is 6\n5 --> The sum is 120\n10 --> The sum is 3628800\n\n# 定义函数times() { echo $(( $1 * $2 )) # 即 $total * $i,计算阶乘}sum() { total=1 for (( i=1; i<=$1; i++ )); do total=`times $total $i` # 调用 times 函数,计算阶乘 done echo "The sum is $total"}# 调用函数read -p "Please enter a number: " numsum $num\n示例 3:定义一个函数 install_packages(),要求用户输入软件包名,并安装指定的软件包。定义一个函数 package_manager(),用于搜寻系统中可用的软件包管理工具,并安装指定的软件包。\n注意:针对 Arch Linux 使用的 pacman 的命令有所不同,需要进行单独修改。\n# 定义函数function install_packages() { # 假如没有输入软件包名 if [ ! $2 ]; then echo "Error: Please enter a package name." return 1 fi # 假如使用的是 pacman if [ $1 == pacman ];then sudo pacman -S $2 --noconfirm else sudo $1 install $2 -y fi}function package_manager() { for manager in apt dnf pacman yum zypper; do which $manager &> /dev/null # 假如对应的包管理工具存在,则安装软件包 if [ $? -eq 0 ]; then echo "Using $manager to install $1" install_packages $manager $1 return 0 fi done echo "No package manager found" return 1} # 调用函数read -p "Please enter a package name: " packagepackage_manager $package","categories":["技术教程"],"tags":["Linux","新手向","脚本"]},{"title":"Python 快速入门(学习笔记)","url":"/2024/05/Python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/","content":"\n \n \n 观前须知\n\n \n \n 本篇为作者几年前写的 Python 快速入门学习笔记,适合初学者学习。\n\n \n \nI. 「安装篇」\n一、下载安装 Python\n\n\n官网下载\n\n\nWindows:\n Python 官网下载\n Microsoft Store 下载【推荐】\n\n\nMac OS:\n Python 官网下载\n\n\nLinux:现如今发行版基本内置,无需下载安装\n\n\n\n\n二、下载 IDE(集成开发环境)\n\n\nJetbrain Pycharm (👍 非常值得建议初学者使用)\n JetBrains 官网下载\n\n\nVisual Studio Code\n Visual Studio Code 下载\n\n\nSublime Text\n Sublime Text 下载\n\n\nII.「基础篇」\n一、使用 Python\n1. 交互式 Python(IDLE)\n\n\n如何查看版本\n$ python --versionPython 3.10.6\n\n\n如何进入 Python\n$ pythonPython 3.10.6 (main, Aug 2 2022, 00:00:00) [GCC 12.1.1 20220507 (Red Hat 12.1.1-1)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> \n\n\n如何退出交互式 Python\n方法一:在交互式 Python 里输入 quit() 回车执行\n方法二:直接按下 Ctrl + D 退出(Windows 下需先按下 Ctrl + Z 再按下回车即可)\n\n\n2. 如何编写 Python 脚本\n\n\n新建 helloWorld.py 脚本文件\n\n\n编写脚本\n# Hello world! # 这是行注释'''这里是多行注释这里是多行注释这里是多行注释------------重要的话说三遍'''# 这是主程序的入口if __name__ == '__main__': print('Hello world!') # 输出打印 name = 'Amy' print(f'Hello, {name}!')\n\n\n执行脚本\npython helloWorld.py \n\n\n二、变量\n\n\n无需声明(定义),直接赋值;变量可直接覆盖\n>>> x=5>>> print(x)5>>> x=8>>> print(x)8\n\n\n可同时赋值给多个变量\n>>> x1 = x2 = x3 = 0>>> print(x1, x2, x3)0 0 0>>> y1, y2, y3 = 1, 2, 3>>> print(y1, y2, y3)1 2 3\n\n\n变量命名规则\n\n\n\n\n\n正确命名\n错误命名\n\n\n\n\nx\nx-ray\n\n\nY\nfor\n\n\nVariABle\n3dm\n\n\np1l2\n!r3\n\n\n_abc\n$w8\n\n\nuser_name\napp name\n\n\n\n根据如上表格,可以确定:\n\n\n变量名不能直接以数字为头\n\n\n变量名开头可以以 _ 为头,但不能使用其它特殊符号。\n\n\n关键字不可直接作为变量名\n\n\n变量名可包含 _ 特殊字符,但不可包含空格、-、$、!等特殊字符。\n\n\n\n\n赋值并代入\n示例 1:定义变量并输出\n>>> x=3>>> y=8*2>>> x+y19>>> \n\nPython 支持的算术运算符:+ - * / ** // %\n\n示例 2:结合代入计算\n>>> a=10>>> a+=5 # a=a+5>>> a15>>> a-=5 # a=a-5>>> a10>>> a*=5 # a=a*5>>> a50>>> a/=5 # a=a/5>>> a10.0>>> a=10>>> a**=2 # a=a**2>>> a100>>> a%=40 # a=a%40>>> a20\n\n\n三、数据类型\n\n数据类型示例表\n\n\n\n\n数据类型\n内容\n示例\n\n\n\n\nint\n整型\n3\n\n\nfloat\n小数\n3.14\n\n\ncomplex\n复数\n3+5j\n\n\nbool\n布尔(真假)\n True,False \n\n\nstr\n字符串\n‘aaa’,“bbb”\n\n\nbyte\nASCII 字符串\nb’abc’\n\n\nlist\n列表\n [1,2,3] \n\n\ntuple\n元组\n (4,5,6) \n\n\ndict\n字典(关联数组)\n{‘one’ : 1, ‘two’ : 2}\n\n\nset\n集合\n{‘apple’,‘banana’}\n\n\nrange\n范围\nrange(10)\n\n\nclass\n类\nMath\n\n\n\n\n\n如何确定数据类型 type(<value>)\n示例:\n>>> type(30)<class 'int'>>>> type('abc')<class 'str'>>>> s = 'apple'>>> type(s)<class 'str'>>>> \n\n\n强制转换数据类型(仅部分)\n\n\n\n\n\n函数\n作用\n\n\n\n\nint(x [,base ])\n将x转换为一个整数\n\n\nlong(x [,base ])\n将x转换为一个长整数\n\n\nfloat(x)\n将x转换到一个浮点数\n\n\nstr(x)\n将对象 x 转换为字符串\n\n\nchr(x)\n将一个整数转换为一个字符\n\n\nunichr(x)\n将一个整数转换为Unicode字符\n\n\nord(x)\n将一个字符转换为它的整数值\n\n\nhex(x)\n将一个整数转换为一个十六进制字符串\n\n\noct(x)\n将一个整数转换为一个八进制字符串\n\n\n\n四、条件与循环\n1. 条件语句\n\n流程图\n\ngraph LR\n开始 --> B{判断条件}\nB -- True --> 执行语句1\nB -- False --> 执行语句2\n执行语句1 --> 结束\n执行语句2 --> 结束\n\n\n简要格式\nif <表达式1>: .... # 当条件满足时[elif <表达式2>: .... # 当条件满足时....][else: .... # 当条件不满足时]\n\n注意:条件语句后加 : ,其次注意缩进\n\n\n\n示例:使用条件语句\n>>> a = 5>>> if a > 3: 'a > 3' # 判断 a 是否大于 3... elif a < 3: 'a < 3'... else: 'a = 3'... 'a > 3'>>> if a == 3: # 判断 a 是否等于 3... 'a ≠ 3'... else:... 'a = 3'... 'a ≠ 3' \n\n注意:判断条件是否相等用 == 表示,= 表示变量赋值\n\n\n\n2. 运算符\n\n算术运算符\n\n\n\n\n运算符\n名称\n示例\n\n\n\n\n+\n加\n5 + 5 = 10\n\n\n-\n减\n10 - 5 = 5\n\n\n*\n乘\n2 * 5 = 10\n\n\n/\n除(小数)\n10 / 5 = 2\n\n\n//\n整除(整数)\n20 // 3 = 6\n\n\n**\n幂\n2 ** 3 = 8\n\n\n%\n余\n10 % 3 = 1\n\n\n\n\n比较运算符\n\n\n\n\n运算符\n含义\n\n\n\n\na == b\na 与 b 相等(值)\n\n\na != b\na 与 b 不相等(值)\n\n\na > b\na 大于 b\n\n\na < b\na 小于 b\n\n\na >= b\na 大于等于 b\n\n\na <= b\na 小于等于 b\n\n\na is b\na 与 b 相等(对象)\n\n\na is not b\na 与 b 不相等(对象)\n\n\na in b\n元素 a 包含在列表 b 中\n\n\na not in b\n元素 a 不包含在列表 b 中\n\n\n\n\n逻辑运算符\n\n\n\n\n运算符\n含义\n\n\n\n\na and b\n若 a 与 b 都满足,就为 True\n\n\na or b\n若 a 与 b 中的任一方满足,就为 True\n\n\nnot a\n若 a 不满足,就为 True\n\n\n\n\n\n运算符优先级\n算术运算符 > 比较运算符 > 逻辑运算符\n** > * / // % > + - > < <= == != > >= > not > and > or\n\n\n示例:针对逻辑运算符判断\n>>> a = 18>>> if a >= 10 and a <= 20:... '10 <= a <= 20'... else:... 'a < 10 or a > 20'... '10 <= a <= 20'\n\n💡 提示:该示例代码中第 2 行里的条件可以简化成 10 <= a <= 20\n\n\n\n3. 循环语句\n\n流程图\n\ngraph LR\n A[开始] --> B{是否满足条件};\n B -->|满足| C[执行内部循环语句];\n C --> D[完成一次循环];\n D --> B;\n B --->|不满足| E[结束];\n\n\nfor 循环\n\n\n已知循环次数及部分元素\n\n\n示例 1:通过 元素 i 在 range 中循环\n>>> for i in range(5): # 循环 5 次并保存到 i 中... print(i) # 输出 i 里的内容... 01234>>> for i in range(1, 5): # 指定范围... print(i) # 输出 i 里的内容... 1234\n\n提示:range 函数表示范围,\n例:range(5)表示 0 ~ 4 之间 (不包含 5) 的数\n range(1, 10) 表示从 1 到 9 (不包含10) 之间的数\n range(1, 10, 2) 表示从 1 到 9 之间的数,步长为 2\n\n\n\n示例 2:在循环中指定列表\n>>> for i in [1,3,5,7]:... print(i)... 1357\n\n提示:for 循环还可以对指定列表中的元素依次进行访问。\n\n\n\n\n\nwhile 函数\n\n\n在不知道循环次数及元素的情况下适用\n\n\n示例 1:使用 while 循环\n>>> n = 0 # 设置变量 n 初始值>>> while n < 5: # 当 n 小于 5 时,才循环... print(n) ... n += 1 # 每循环一次,增加 i 的值... 01234\n\n注意:使用 while 循环时,一定要增加变量 n 的值,否则会出现死循环!\n\n\n没用的知识:写一个最简单的死循环\nwhile True: # 设为 True 将一直循环 # <具体执行的代码> print('loop')\n\n\n\n\n\n跳出循环与跳过循环\n\n\ncontinue【跳过循环】\n\n当循环时执行此语句,将结束当前此次循环,并进入下一轮循环\n\n\n\nbreak【跳出循环】\n\n当循环时执行此语句,整个循环都将结束\n\n\n\n流程图\n\n\n\n\ngraph LR\n A[开始] --> B[进入循环];\n B --> C[执行语句];\n C --> D[若执行 Continue];\n D -->|进入下一轮循环| B;\n C --> E;\n E[若执行 break]--> F[结束];\n\n\n示例:在 while 循环中跳出循环\n>>> i = 0>>> while i < 10: # 当 i 为 10 时,结束循环... i += 1... if i % 3 == 0: # 当 i 为 3 的倍数时跳过此轮循环... continue... elif i % 8 == 0: # 当 i 为 8 的倍数时结束循环... break... else:... print(i)... 12457\n\n\n五、集合\n1. 列表(Array)\n\n\n创建列表\n>>> a=[3,1,2,5,4,7,6]>>> b=['apple','banana','cat']>>> c=[]\n\nTIPS:如何快速创建列表\n例 1:快速创建一个有5个元素均为 0 的列表\n>>> x=[0]*5>>> x[0, 0, 0, 0, 0]\n例 2:依靠 for 循环创建\n>>> x=[i for i in range(20)]>>> x[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\n例 3:按照指定条件并通过循环来创建列表\n>>> num_array=[i for i in range(10) if i % 2 == 0]>>> num_array[0, 2, 4, 6, 8]\n例 4:通过 if…else…语句并通过 for 循环来创建列表\n>>> data=[n if n % 2 != 0 else 0 for n in range(1,21)]>>> data[1, 0, 3, 0, 5, 0, 7, 0, 9, 0, 11, 0, 13, 0, 15, 0, 17, 0, 19, 0]\n\n\n\n使用示例\n\n\n在已有的列表中增加一个新元素\n# 在 a 列表里新增一个元素(5)>>> a = [1,2,3,4] >>> a.append(5)>>> a[1, 2, 3, 4, 5]\n\n\n在已有的列表中仅删除第一次出现的元素\n# 在 a 列表里删除一个元素(3)>>> a = [2,3,4,6,8,10] >>> a.remove(3)>>> a[2, 4, 6, 8, 10]\n\n\n在已有的列表中修改(覆盖)一个新元素\n# 在 a 列表中将'm'修改为'o'>>> a = ['p','y','t','h','m','n']>>> a[-2] = 'o'>>> a['p', 'y', 't', 'h', 'o', 'n']\n\n\n查看数组里的单个数据\n>>> a[1]1>>> a[6]6>>> a[-1] # 等同于查看 a[6]6>>> a[-6] # 等同于查看 a[1]1\n\n\n查看数组里的所有数据\n>>> a[3, 1, 2, 5, 4, 7, 6]\n\n\n查看数组里的部分数据\n>>> a[1:5] # 查看a[1]~a[4][1, 2, 5, 4]>>> a[:5] # 查看a[0]~a[4][3, 1, 2, 5, 4]>>> a[1:] # 查看a[1]~a[6][1, 2, 5, 4, 7, 6]>>> a[-5:-1] [2, 5, 4, 7]>>> a[-3:][4, 7, 6]>>> a[:-5][3, 1]\n\n\n查看列表的总个数及列表内出现 3 的次数\n>>> a = [3, 8, 6, 3]>>> len(a)4>>> a.count(3)2\n\n\n排列所有元素\n>>> num = [3, 2, 1, 5, 8.3, 0.5, 2.17, 3.14]>>> num.sort()>>> num[0.5, 1, 2, 2.17, 3, 3.14, 5, 8.3]>>> w = ['Apple', 'pineapple', 'Banana', 'orange', 'Strawberry']>>> sorted(w)>>> w['Apple', 'Banana', 'Strawberry', 'orange', 'pineapple']\n\n提示:列表内的数值从小到大排序;字符串按照 ASCII 码值排序\n注意:列表内必须为相同的数据类型才可进行排列!\n\n\n\n\n\n列表内置函数\n\n\n\n\n\n函数\n用法\n作用\n\n\n\n\nappend\nlist.append(<value>)\n在尾部添加一个新元素\n\n\ninsert\nlist.insert(<index>,<value>)\n在第index位置中插入一个新元素\n\n\nremove\nlist.remove(<value>)\n删除第一次出现的元素\n\n\ndel\ndel(list[<index>])\n删除第 index 个元素\n\n\npop\nlist.pop(<index>)\n同 del 函数\n\n\nsorted\nsorted(list)\n所有元素按从小至大顺序重新排列\n\n\nsorted\nsorted(list, reverse = True)\n所有元素按从大至小顺序重新排列\n\n\nsort\nlist.sort()\n正向排列所有元素\n\n\nreverse\nlist.reverse()\n反向排列所有元素\n\n\nlen\nlen(list)\n查看列表内元素的总个数\n\n\ncount\nlist.count(n)\n查看元素n在列表内出现的次数\n\n\nclear\nlist.clear()\n清空列表内的所有元素\n\n\n\n2. 元组(Tuple)\n\n元组与列表看起来相似,但两者之前存在微妙的差别。\n\n\n\n包括元素时,使用的符号不同\n数组用[、]包括元素;元组用(、)包括元素\n示例1:定义列表 a 和元组 b,并使用 type 函数查看当前变量所使用的类型\n>>> a=[1,2,3]>>> b=(1,2,3)>>> type(a)<class 'list'>>>> type(b)<class 'tuple'>\n\n\n列表里的元素可以修改,而元组里的元素不可修改\n示例2:接【示例1】并进行修改数组中的数据\n>>> a[2]=4>>> b[2]=3Traceback (most recent call last): File "<stin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> a[1, 2, 4]>>> b(1, 2, 3)\n\n\n3. 字典(Dictionary)\n\n\n字典是一个无序、可变和有索引的集合。在 Python 中,字典用{}编写,拥有键和值。\n\n\n创建字典\n示例 1:创建一个人的个人信息\nperson_Zhang = {'name':'张三', 'age':24, 'sex':'男'}\n示例 2:嵌套创建\nperson = { {'name':'张三','age':24,'sex':'男'}, {'name':'李四','age':23,'sex':'男'}, {'name':'王五','age':25,'sex':'男'},}\n\n\n查看字典\n示例 1:查看字典里的所有内容\n>>> person_Zhang{'name': '张三', 'age': 24, 'sex': '男'}\n示例 2:查看字典里某个键的值\n>>> person['name']'张三'>>> person['age']24>>> person['sex']'男'\n\n\n字典的相关用法\n\n\n\n\n\n方法\n描述\n\n\n\n\nclear()\n删除字典中的所有元素\n\n\ncopy()\n返回字典的副本\n\n\nfromkeys()\n返回拥有指定键和值的字典\n\n\nget()\n返回指定键的值\n\n\nitems()\n返回包含每个键值对的元组的列表\n\n\nkeys()\n返回包含字典键的列表\n\n\npop()\n删除拥有指定键的元素\n\n\npopitem()\n删除最后插入的键值对\n\n\nsetdefault()\n返回指定键的值。如果该键不存在,则插入具有指定值的键。\n\n\nupdate()\n使用指定的键值对字典进行更新\n\n\nvalues()\n返回字典中所有值的列表\n\n\n\n六、字符串(String)\n1. 提取字符串\n示例:定义 s 变量,并在 s 中提取字符串\n>>> s="Hello world!">>> s[2]'l'>>> s[6:]'world!'>>> s[:8]'Hello wo'>>> s[-6:]'world!'>>> s[:-7]'Hello'>>> s[6:11]'world'\n2. 连接字符串\n\n\n一般情况下,字符串与字符串之间用+连接\n\n\n对不同数据类型的数据不能直接用 + 连接\n>>> print("Number: " + 20)Traceback (most recent call last):File "<stdin>", line 1, in <module>TypeError: can only concatenate str (not "int") to str\n\n\n方法一:将数值部分强制转换成字符串类型\n>>> print('my number: ' + str(20))my number: 20\n\n\n方法二:两方之间添加 ,以连接\n>>> print("你的年龄:",18)你的年龄: 18\n\n\n方法三:在字符串中用 % 进行插入\n>>> print('Your age: %i' % 18) Your age: 18\n\n\n方法四:格式化字符串\n>>> age=18>>> print('Your age: {age}') Your age: 18\n\n\n\n\n3. 分割字符串\n\n\nsplit 函数\n\n\n例 1:分割包含空格的字符串\n>>> s='I am a boy.'>>> s.split(' ')['I', 'am', 'a', 'boy.']\n\n\n例 2:分割两次包含空格的字符串\n>>> s='Welcome to New York!'>>> s.split(' ',2)['Welcome', 'to', 'New York!']\n\n\n\n\n七、函数与类\n1. 函数\n\n\n创建与执行自定义函数\n\n\n创建一个无参的函数\n# 函数的创建>>> def print_Hello(): # def 函数名():... return 'Hello world!' # return <返回值>... # 函数的执行>>> print_Hello()'Hello world!'\n\n\n创建一个有参(包含一个或多个)的函数\n# 设计一个从 1 加到 n 的函数>>> def getsum(n):... sum = 0 # 用于计算累加的总和... for i in range(1,n+1):# 设置从 1 到 n 的循环... sum += i # 累加... return sum # 返回累加结果... >>> getsum(10) # 将 10 这个数传递到函数中55>>> n = 20>>> getsum(n) # 将 n 值传递到函数中210\n# 设计一个 a 与 b 相加的函数>>> def add(a,b):... return a+b... >>> add(3,6)9\n\n\n\n\n思考 1:若执行下列代码,会得到什么输出结果?\nn = 10def add_n(n): n += 10 return nprint(n)print(add_n(n))print(n)\na = [0]def cal(a): a[0] += 10 return aprint(a)print(cal(a))print(a)\n\n\n思考 2:若执行下列代码,会得到什么输出结果?\ndef print_it(): print("hello") print_it()print_it()\ndef count(num): num += 1 if num < 10: print(count(num)) return numnum = 1print(count(num))\n\n\n全局变量\n\n\n问题 1:若执行下列代码,会输出什么结果?\nx = 5def add(): a = 10 print(x) print(a)add()print(x)print(a)\n\n\n输出结果:a 变量未定义\n发生异常: NameErrorname 'a' is not defined\n\n\n局部变量与全局变量的区别\n\n\n局部变量:只能在函数内部进行访问\n\n\n全局变量:既能在函数内部,还能在函数外部访问,定义时前面应添加global作为前缀\n\n\n\n\n解决办法:将 a 变量设置为全局变量\nx = 5def add(): global a # 设置 a 为全局变量 a = 10 print(x) print(a)add()print(x)print(a)\n\n\n问题 2:若执行下列命令,会输出什么结果?\nn = 30def update(): n += 10 returnupdate()print(n)\n\n\n输出结果:由于函数中的变量 n 被程序认为是局部变量,并且在函数中没有定义变量 n\n发生异常: UnboundLocalErrorlocal variable 'n' referenced before assignment\n\n\n解决方法:在函数内部定义局部变量 n\nn = 30def update(): global n n += 10 returnupdate()print(n)\n\n\n\n\n2. 类\n\n\npython 是一种面向对象的语言\n\n\n面向对象:将数据和操作集中起来一起处理\n\n\n类与实例的关系\n\n\n结构:\nclass className: def def_1(args): ..... def def_2(args): ..... ....\n\n\n例 1:定义 Users 类并创建实例。实现简单的登录与注销\nclass Users: def __init__(self,name,password): self.name=name self.password=password def login(self,password): if self.password=='000000': print("登录成功!") return True else: print("密码错误!") return False def logout(self): print("已退出登录")# 主程序入口if __name__ == '__main__': a = Users('张三', '000000') # 创建对象 b = Users('李四', '123456') # 创建对象 if a.login(a.password): # 判断 a 用户的密码是否正确 a.logout() if b.login(b.password): b.logout()\n\n值得注意的两点:\n\n在类里定义方法时,必须在参数中使用self关键字。(self一般作为第一种参数)\n__init__构造函数:在创建对象时必须调用的方法\n\n\n\n\n3. 类的继承\n\n\n继承:在现有的类的基础上创建一个新的类\n\n\n结构:\nclass className(oldClassName): def def_1(args): ..... def def_2(args): ..... ....\n\n\n例:创建一个 Guest 类,继承 Users 类\nclass Guest(Users): def __init__(self): super().__init__('guest', '000000') # 将 Users 类中的所有方法继承if __name__ == '__main__': c = Guest() if c.login(c.password): c.logout()\n\n\n八、模块与软件包\n1. 模块 (Module)\n\n\n模块是包含函数或类的代码的单一文件,通过使用import <module_name>以实现导入\n\n\n例:新建两个文件,一个文件用于对函数进行定义,另一个文件用于调用前一文件中的函数\n\n\nfunc.py\ndef add_2(a,b): return a+bdef rangeCount(a,b): sum = 0 for i in range(a,b): sum += 1 return sumdef loopA_to_B(a,b): sum = 0 for i in range(a,b): sum += i return sum\n\n\nmyapp.py\nimport funcprint(func.add_2(3,4))print(func.loopA_to_B(10,20))print(func.rangeCount(20,30))\n\n\n执行 myapp.py 文件,得到如下结果:\n714510\n\n\n\n\n2. 软件包(Package)\n\n\n软件包由多个模块组成的,可以将具有类似功能的多个模块集中到一起作为一个单独软件包进行运行\n\n\n例:导入一个 Array 模块与 NumPy 软件包\ndata = [4, 5, 2, 3, 6]import arraydata = array.array('i', [4, 5, 2, 3, 6]) # 创建整数型数组import numpydata = numpy.ndarray([4, 5, 2, 3, 6]) # 创建 NumPy 数组\n\n\n创建自定义软件包\n\n\n新建一个包,并在包内新建 Python 文件作为一个个小模块,在模块内编写一个或多个函数\n\n\n例:新建一个 package1,在里面新建三个模块(mod1, mod2, printMod),并在 Test.py 文件中调用包内的模块\n\n\n构建目录结构\n\n\npackage1(包|文件夹)\n\n\n__init__.py\n\n\nmod1.py\n\n\nmod2.py\n\n\nprintMod.py\n\n\n\n\ntest.py\n\n\n\n注:使用 Pycharm 创建包时,将默认新建 __init__.py ,此文件是 Python 中 package 的标识。在过去的版本(如 python2.x 版本)中,软件包内必须包含 __init__.py 文件,否则将无法标识!\n\n\n\nmod1.py\n# Module 1def plus_a_b(a,b): return a + bdef minus_a_b(a,b): return a - bdef times_a_b(a,b): return a * bdef divide_a_b(a,b): return a / b\n\n\nmod2.py\n# Module 2def getRect(n): return n ** 2def getCircle(r): return 3.14 * r * rdef factor(n): if n == 1: return 1 else: return n * factor(n-1)\n\n\n\n\nprintMod.py\n# Print Moduledef print_hello(): print("Hello world!")def read_me(): print("READ ME")\n\n\ntest.py\n# test.py# 导入方法 1:from package1 import mod1,mod2 # 导入方法 2:import package1.printModif __name__ == '__main__': # 调用 1: x = mod1.plus_a_b(3, 4) y = mod1.minus_a_b(8, 5) a = mod2.factor(y) # 调用 2: p = package1.printMod.print_hello() # 输出结果 print(x,y,a)\n\n\n输出结果\nHello world!7 3 6\n\n\n3. 获取软件包(PIP)\npip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。\n目前如果在 python.org 下载最新版本的安装包,则是已经自带了该工具。\n\n注意:Linux 下若需要使用 pip ,需先安装python-pip或python3-pip软件包才能使用\n\n在终端中简要操作:\n\n\n\n操作\n命令\n\n\n\n\n安装\npip install <package_name>\n\n\n卸载\npip uninstall <package_name>\n\n\n下载\npip download <package_name>\n\n\n搜索\npip search <package_name>\n\n\n\n\n提示:使用浏览器搜索可用的软件包\nPyPi 官网: https://pypi.org/\n\n当使用 pip 安装软件包时,若出现网络问题而导致下载失败,则须临时使用特定的镜像源以加快下载速度。\npip install -i <镜像源地址> <软件包名>\n\n国内较为常用的镜像源:\n清华大学:https://pypi.tuna.tsinghua.edu.cn/simple\n阿里云:http://mirrors.aliyun.com/pypi/simple/\n中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/\n华中理工大学:http://pypi.hustunique.com/\n山东理工大学:http://pypi.sdutlinux.org/\n豆瓣:http://pypi.douban.com/simple/\n\n","categories":["学习笔记"],"tags":["Python","学习笔记","新手向"]},{"title":"搭建个人博客(三):用 Android 手机更新 Hexo 博客","url":"/2024/05/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E4%B8%89%EF%BC%89%EF%BC%9A%E7%94%A8%E6%89%8B%E6%9C%BA%E6%9B%B4%E6%96%B0Hexo%E5%8D%9A%E5%AE%A2/","content":"前言\n现如今,Hexo 博客已经成为一个非常流行的博客框架,但是 Hexo 博客的更新通常需要通过命令行操作,对于不擅长命令行操作的小白来说,更新博客就显得十分麻烦。本文将介绍仅适用于 Android 的软件,帮助你在手机上轻松地更新 Hexo 博客。\n备份博客存档\n首先,在利用手机之前,首先就是在自己的电脑上备份自己的博客。\n(PS: 如果不是在电脑上写 Hexo 博客,请当博主没说~ o(* ̄▽ ̄*)o)\n在此,请直接在 Github 上新建一个公共仓库(Public Repository),将自己的博客上传到 Github 中。\n假设:你已在 Github 上新建了一个名为 blogBackup 的公共仓库,那么你应当在命令行下,执行如下命令:\ngit initgit add .git commit -m "20210412" # 此处建议填写上传时间,如:20210412"git remote add origin https://github.com/yourname/blogBackup.gitgit push -u origin master\n注意:请将第4行中的 Git 仓库地址替换自己实际的 Github 仓库地址。\n当你完成以上这些命令后,请回到你新建好的 Github 公共仓库以确认上传成功。\nWeBlog\n\n \n \n 软件简介\n\n \n \n WeBlog 是一个运行在安卓的静态博客编写器,他提供从编写,构建到预览预览博客的能力,同时包含GIT,终端,自定义 Shell 脚本等功能。 新建文章,标签管理,现代化的UI,可以提供更好博客编写的体验。\n\n\n \n \n下载安装\n注意:WeBlog 目前仅支持 Android 系统\n请直接点击下面链接,选择 Arm64 架构的安装包下载并安装。\n 点击这里下载软件\n导入博客\n打开 WeBlog 后,请务必安装 Hexo 框架及外部存储权限申请。\n在主页上点击 拉取项目,输入你的 Github 上的仓库地址。\n\n \n \n 注意\n\n \n \n 这里并非填你的 Github Pages 仓库地址,而是填写你的备份博客的仓库地址 (类似于:https://github.com/yourname/blogBackup.git,否则无法识别到 Hexo 博客项目。\n\n \n \n接着,在选择文件夹时,请一定要新建一个空的文件夹,否则无法拉取 Github 仓库项目。\n\n最后,请耐心等待加载,一般需要几分钟才能完成克隆。\n写博客\n1. 定位你的博客文章目录\n在写博客之前,若需要找到你之前所写的文章,请直接打开你的项目源目录,依次点击 source → _posts 文件夹,在此目录下,你将看到你之前所写的所有博客文章。\n2. 新建博客文章\n点击右下角的 + 号,按照提示填写文章基本信息即可完成创建。\n或者直接在终端下执行如下命令:\nhexo new "文章标题"\n\n3. 尽情写作吧!\n好用的脚本文件\n为了方便编辑或更新博客,请根据自己的需求,在项目源目录的 .scripts 文件夹下添加 Shell 脚本,以便减少不必要的操作。\n\nupdate-to-github-pages.sh:用于将本地博客更新到 Github Pages 仓库。\n\n注意:这将会一次性将博客的所有文件上传到 Github Pages 仓库,并覆盖掉原有的文件。\n#!/bin/bashhexo cleanhexo generatehexo deploy\n\nbackup-your-blog.sh:用于将博客存档上传到 Github 仓库中。\n\n#!/bin/bashgit add .# 这将会自动生成当前日期作为备份的备注。如:20210412git commit -m "$(date +%Y%m%d)" git push -u origin master\n\nsetup-your-git.sh:用于配置 Git 全局参数。(建议导入博客后,执行一次)\n\n#!/bin/bashgit config --global user.name "yourname"git config --global user.email "youremail@gmail.com"git config --global --add safe.directory $PWD\n这里需要修改 yourname 和 youremail@gmail.com 为你的实际用户名和邮箱。\n当你不确定是否配置成功时,可以尝试在终端下单独执行如下命令查看参数是否生效。\ngit config --global user.namegit config --global user.emailgit config --global safe.directory\n\n常见问题\n💡 常见问题一💡 常见问题二💡 常见问题三Q:为什么拉取项目后,打开自建的文件夹仍是空的?\nA:请检查你的远程 Github 仓库是否为私人仓库,若为私人仓库(Private),请将该仓库转换为公共仓库(Public)。\n\nQ:当我拉取完项目后,为什么提示找不到 Hexo 框架?\n即使用【实时预览】时,直接出现 The LivePreview is ended. 提示。\nA:在解决此问题前,请先查看你的项目源目录下是否有 node_modules 目录。一般情况下,当你备份博客存档时,node_modules 目录往往不会被上传到 Github 仓库。\n请直接从底部界面向上滑动,打开终端,并执行 npm install 命令,等待安装依赖即可。Q:执行 npm install 命令时报错?\nA:在确认此问题前,请按照如下方式排查:\n方法一:检查你的项目源目录是否有 package.json 文件。\n若你的项目源目录下没有 package.json 文件,则需要执行 npm init 命令,并按照提示输入相关信息。\n方法二:将 node_modules 目录复制到你的项目目录中。\n为了方便操作,这里作者建议:直接在你的项目源目录下新建一个 install.sh 文件并编辑,\n这里假设你的 Github 仓库名为 blogBackup,注意替换自己的 Github 仓库地址。\n#!/bin/bash# install.sh# 一次性执行脚本# 可直接克隆博客存档到本地项目中# 用于解决无法安装 Hexo 依赖问题BLOG_DIR=$PWDcd ~if [ ! -d ~/blogBackup ];then echo "→ 正在克隆……" git clone https://github.com/yourname/blogBackup.git # 此处需替换为你的 Github 仓库地址 cd blogBackupelse echo "→ 正在合并……" cd blogBackup git pullfiif [ $? -ne 0 ];then echo "❌ 无法拉取仓库!" exit 255fiif [ ! -d node_modules ];then echo "→ 正在安装依赖...." npm installfiif [ $? -ne 0 ];then echo "❌ 下载/安装依赖失败!" exit 255ficp -r node_modules $BLOG_DIR# 注意:# 其中的第10行的git仓库地址替换为实际的仓库地址。# 若需要调试于终端之上,请执行:# bash ./.scripts/install.sh\n\n完成脚本执行后,执行 npm list 查看是否包含 hexo 依赖即可。\n\n以上是本篇文章的全部内容,若在使用过程中遇到问题,请在评论区留言。\n","categories":["博客搭建"],"tags":["博客搭建","Hexo","Git","Github","软件安利","Android"]},{"title":"从 0 开始学 Linux:熟悉 GNOME 桌面","url":"/2024/05/%E4%BB%8E-0-%E5%BC%80%E5%A7%8B%E5%AD%A6-Linux-%E7%86%9F%E6%82%89-GNOME-%E6%A1%8C%E9%9D%A2/","content":"\n \n \n 前言\n\n \n \n 在阅读此篇文章前,若你当前还未安装完 Linux 系统,请先阅读并执行此教程。\n 从 0 开始学 Linux:安装 Ubuntu 24.04 LTS 系统\n本教程主要针对于从未接触过 GNOME 的小白并将以最为简单的方式(通过图文形式)来快速熟悉 GNOME 桌面。\n\n\n \n \n桌面布局\n请根据如下图的标识一一对应。\n\n\n\n \n \n 注意\n\n \n \n Ubuntu 下的默认桌面布局与其它发行版下的 GNOME 桌面布局有所差异。\n这里以 Fedora Workstation 40 为例。此桌面为原生 GNOME 桌面布局,即缺少了左侧的 Dock 栏、桌面图标、托盘图标,以及窗口默认的最小化、最大化(这些均需靠【优化】软件或 gnome-shell 插件来实现)\n\n\n \n \n桌面小技巧\n以下是关于 GNOME 相关操作的小技巧,不包含所有。\n有用的键盘快捷键\n\n以下罗列了在 GNOME 桌面下部分有用的默认快捷键。后续部分还会继续补充。\n\n 类\n\n:打开【概览】界面\n + A:打开【所有程序】界面\n + S:打开右上角处的【快捷菜单】\n + D:快速显示桌面,再按一次复原\n + L:锁定屏幕\n + Tab:切换应用\n + `:切换窗口(配合上一个快捷键操作)\n + ←:将窗口移动到左半屏,再按一次将恢复原位\n + →:将窗口移动到右半屏,再按一次将恢复原位\n + ↑:将窗口最大化,再按一次将取消最大化\n\nAlt 类:\n\nAlt + Tab:切换应用\nAlt + `:切换窗口(配合上一个快捷键操作)\nAlt + Esc:切换应用(比前两个快捷键更好用👍)\nAlt + F2:打开【运行】命令,快速运行一个命令\n\nCtrl 类:\n\nCtrl + Alt + T:快速打开终端\n\nDock 栏(快捷栏)\n利用快捷键启动应用\nUbuntu 桌面默认自带的任务栏,可直接利用 + 数字键以打开快捷栏中的所对应的应用程序。\n每个应用图标左上角的以 ①②③ 表示对应的序号。\n例如:打开 Firefox 浏览器,只需按下快捷键 + 1 即可\n若你不确定某个应用位于快捷栏中的某个位置,只需按下快捷键 + Q 即可。如下图:\n\n固定应用到 Dock 栏(快捷栏)\n1. 通过右键菜单\n你可以点击 Dock 栏(快捷栏)最下方的 Ubuntu 图标,或按下快捷键 + A 打开所有应用程序,选择一个应用,鼠标右键,选择【固定到快捷栏】。同理,在 Dock 栏(快捷栏)中取消固定应用也是如此\n\n2. 通过鼠标拖拽\n你可以从【所有程序】界面中,鼠标左键拖拽某个应用到 Dock 栏(快捷栏)中,也能固定到 Dock 栏(快捷栏);\n反之,从 Dock 栏(快捷栏)中的应用拖拽回【所有程序】中,就能解除固定。\n\n\n\n在桌面下,若需要对已打开的应用程序固定到 Dock 栏(快捷栏),只需拖拽到 Dock 栏(快捷栏)中;\n反之,若需要取消固定快捷栏中的应用,只需拖拽到 Ubuntu 图标(或者九个点的图标)即可取消固定。(原生 GNOME 环境下也是如此)\n\n\n窗口(Window)\n左右分屏\n与 Windows 的操作逻辑类似,将鼠标快速拖拽窗口到最左侧,是窗口变为左半屏,然后再选择应用将窗口变为右半屏。\n\n\n \n 提示:\n在此处操作中,可以使用快捷键 + ← 或 + → 来使窗口快速移动到左半屏或右半屏\n\n \n上下分屏\n与 Windows 的操作逻辑类似,这里不过多阐述,直接看动图就完事了 o(* ̄▽ ̄*)o\n\n工作区(Workspace)\n工作区与 Windows 虚拟桌面类似,支持在不同的工作区中摆放窗口。下图为比较有用的操作:\n创建、删除、切换工作区\n不多描述,直接看图\n\n\n\n\n\n\n下列为比较好用的快捷键(即上图中所提及到的操作):\n\n\n + Fn + ↑:上一个工作区\n\n\n + Fn + ↓:下一个工作区\n\n\n + Fn + ←:第一个工作区\n\n\n + Fn + →:最后一个工作区\n\n\n + Shift + Fn + ←:将窗口移动到上一个工作区\n\n\n + Shift + Fn + →:将窗口移动到下一个工作区\n\n\n\n\n \n \n 写在最后\n\n \n \n 以上是关于所有在 GNOME 桌面上比较有用的技巧。当然,如果还有比较实用的技巧,请在评论区补充 (*_*)\n\n \n \n","categories":["技术教程"],"tags":["Linux","GNOME","桌面环境","Ubuntu","新手向"]},{"title":"软件安利:安利几款在 Microsoft Store 上的软件","url":"/2024/05/%E8%BD%AF%E4%BB%B6%E5%AE%89%E5%88%A9-%E6%8E%A8%E8%8D%90%E5%87%A0%E6%AC%BE%E5%9C%A8-Microsoft-Store-%E4%B8%8A%E7%9A%84%E8%BD%AF%E4%BB%B6/","content":"概述\n本篇将推荐从 Microsoft Store 上的软件,请根据自己的需要,按照如下分类进行选择。\n如果你有更好的推荐,请在评论区补充。O(∩_∩)O\n\n一、桌面美化类\nTranslucentTB(任务栏)👍👍👍\n\n\n 点击这里下载软件\n一款轻量级的软件,几乎属于必装软件。可对任务栏透明、亚克力等视觉效果👍👍👍\nAuto Dark Mode(自动调整暗色模式)👍👍👍\n\n 点击这里下载软件\n一款非常值得使用的软件,通过指定的时间切换对应的亮色/暗色模式。👍👍👍\nLively Wallpaper(动态壁纸)\n\n 点击这里下载软件\n免费的开源应用程序,用于将 GIF、视频和网页设置桌面壁纸。但自带提供的资源不够多\n巨应动态壁纸\n\n 点击这里下载软件\n由巨应君出品的动态壁纸软件,简单易用,所以壁纸资源均为用户上传,比前者资源更加丰富。\nWinDynamicDesktop (自动切换壁纸)👍👍\n\n 点击这里下载软件\n一款根据时间来自动切换壁纸的软件,与 MacOS 中的动态壁纸功能类似。默认提供 MacOS 壁纸,也可直接从网络上下载并导入壁纸。\nSucrose Wallpaper Engine(动态壁纸引擎)\n\n 点击这里下载软件\nSucrose Wallpaper Engine是一款多功能的壁纸引擎,提供广泛的交互式主题,可为您的桌面带来活力。您可以根据个人喜好选择轻盈或暗黑主题。您可以简单或详细地创建自己的壁纸,并支持多屏幕和各种屏幕分辨率,以实现无缝体验。\nbackiee - 壁纸工作室10\n\n 点击这里下载软件\n探索超高分辨率壁纸,4K 到 8K 图像应有尽有。若不在意频繁出现的广告,这款静态壁纸软件值得入手!\n桌面组件\n\n 点击这里下载软件\n一款功能强大,符合人体工程学的桌面组件系统。\n二、实用工具类\nSnipaste 截图+贴图👍👍👍\n\n 点击这里下载软件\n一款比自带 Windows 截图功能还要强大的截图软件。\nEarTrumpet (音量合成器)👍👍👍\n\n 点击这里下载软件\n一款功能非常强大的音量控制软件,可完全替代自带的旧版功能。\nQuickLook (快速预览)👍👍👍\n\n 点击这里下载软件\n通过按下空格键实现快速预览文件内容,与 Mac OS 类似的功能。\n取色器\n\n 点击这里下载软件\n一款体积小的实用工具,可通过鼠标选取屏幕中像素的颜色。\nOP Auto Clicker - Auto Tap (鼠标自动连点器)\n\n 点击这里下载软件\n一款非常简单的鼠标自动连点器,通过按下 F6 键以开始/结束连点。\nWatt Toolkit (原 Steam++)\n\n 点击这里下载软件\n一款加速软件,支持 Steam、Github、Origin、Uplay、Spotify 等。目前除了部分库存游戏需要付费才能加速以外其它均免费。\nAnLink 安联\n\n 点击这里下载软件\n一款支持使用 Android 手机连接到电脑的软件,免费无广告且非常实用,可安全便捷的在电脑上操作手机,支持使用 Wifi、USB连接。\nRecord Screen(免费录制屏幕)\n\n 点击这里下载软件\n一个简单好用的录制软件,选择单个窗口或整个屏幕以进行录制,支持输出麦克风与电脑声音,并且录制后可以制作简单的剪辑。\n三、文本编辑类\nSiYuan(思源笔记)\n\n 点击这里下载软件\n一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。\nNotepads App(记事本)\n\n 点击这里下载软件\n一款极具现代感,轻便简介的文本编辑器,适合替代自带记事本的软件。\n桌面记事本👍👍👍\n\n 点击这里下载软件\n一款简洁且方便的桌面记事本,推荐将此软件固定到任务栏中以实现随时编辑。支持自动保存文本、语音识别、语音朗读、文本翻译、云文件上传下载同步等功能。支持预览 TXT、RTF、Markdown 等格式的文本。\nTypedown (Markdown 编辑器)👍👍\n\n 点击这里下载软件\n使用 Windows 11 UI 而设计的轻量级 Markdown 编辑器。实现所见即所得。支持 LaTex 公式编辑、Mermaid 流程图、多种编程语言代码高亮等。适合撰写技术文档、学术论文、博客文章。\n","categories":["软件安利"],"tags":["Windows","新手向","软件安利"]},{"title":"系统体验:虚拟机安装 Android x86 系统","url":"/2024/06/%E7%B3%BB%E7%BB%9F%E4%BD%93%E9%AA%8C-%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%89%E8%A3%85-Android-x86-%E7%B3%BB%E7%BB%9F/","content":"前言\n本文主要介绍了 Android x86 系统的安装、使用、体验等。如果你对 Android x86 系统感兴趣,可以参考下面的内容。(*_*)\n\n \n \n Android x86 项目简介\n\n \n \n \n这是一个将 Android 开源项目移植到 x86 平台的项目,以前称为“支持 android x86 的补丁托管”。 最初的计划是托管来自开源社区的 android x86 支持的不同补丁。在我们创建项目几个月后,我们发现我们可以做的不仅仅是托管补丁。因此,我们决定创建代码库 在不同的 x86 平台上提供支持,并设置 Git 服务器来托管它。\n\n \n \n在阅读此文前,如果你是需要在自己的电脑上体验原生版本的 Android 系统,那么 Android x86 系统是一个备选方案。\n但是如果你需要获得更好的性能,那么你可以来试试体验 Bliss OS(基于 Android x86 系统的改良版)。\n关于 Bliss OS,你可以访问官方网站:https://blissos.org/\n下载 Android x86 系统\n你可以通过以下途径来下载 Android x86 系统,具体取决于你的网络环境:\n官方途径:\n 官方下载\n其它的官方途径:\n SourceForge 下载\n FossHub 下载\n如果以上两种下载链接都无法下载,请直接以下按钮以进行下载:\n\n \n 注意:\n此版本仅提供 Android 9.0 r2 镜像(到 2024 年 6 月 15 日为止为最新版本镜像),其它版本还需自行在外网上寻找。\n下载链接已奉献上:\n\n Android x86 9.0 r2 镜像\n\n \n安装 Android x86 系统\n下载完 Android x86 系统镜像后,你可以使用 Rufus 等工具将其刻录到 U 盘中,然后使用 U 盘启动进入安装程序。本文不在此基础上展开。\n这里本文仅以 VMware 虚拟机的形式安装 Android x86 系统,具体步骤如下:\n第一步:创建虚拟机\n这里不过多阐述,这里直接按照提示设置个 2GB 内存,32GB 硬盘的虚拟机就可以了。(当然可以更改其它配置)\n需要注意的是,在设置客户机操作系统时,选择 linux → 其他 Linux 5.x 内核 64 位\n\n第二步:安装系统到本地硬盘\n启动虚拟机后,出现如下图所示,请选择【Installlation - Install Android-×86 to hard disk】。\n\n在如下图的提示中,通过方向键 ↑、↓,选择 Create/Modify partitions,即创建一个分区。\n\n在此步选择 No,进入 cfdisk 工具。\n\n在如下图操作中,请使用方向键 ↑、↓、←、→ 以及 Enter 键,按照如下顺序依次设置:\n注意:这是针对虚拟机的分区设置\n\n选择 New,创建一个新分区;\n选择 Primary,设置为主分区,空间大小可使用默认;(注意:1 GB = 1024 MB)\n选择 Bootable,设置为启动分区,此时 Flags 一列会显示 Boot 字样;\n选择 Write,确认分区设置;\n选择 Quit,退出 cfdisk 工具。\n\n如下图为分区设置完成后的样子。\n\n在分区设置完成后,请直接选择【sda1】分区以进行格式化分区。\n\n在如下两张图中,首先先选择 ext4 文件系统,然后再选择 Yes,确认格式化。\n\n\n等待格式化完成后即可。\n弹出如下图所示的提示时,选择 Yes;\n\n在如下图的问题中,继续选择 Yes,此步将会在 /system 分区中安装 Grub 引导程序。\n\n等待安装完成后,选择 【Reboot】 重启虚拟机。\n\n第三步:配置启动项\n当系统初次进入 Grub 程序时,请先选择第二项以进入 Debug 模式。\n\n等待进入 Debug 模式后,请多次按下 Enter 键,这将会换行出现 :/android # 的提示符。请输入如下命令以编辑菜单项。\nvi /mnt/grub/menu.lst\n\n在编辑器中,找到如下图所示的标注,并在此处添加 nomodeset 参数。\n最后,请依次按下 Esc,并输入 :wq 最后再按下 Enter 键即可。\n\n退出编辑器后,请直接按下键盘快捷键 Ctrl + Alt + Delete 键,以直接重启。\n需要注意的是:在 VMware 虚拟机中,你需要按下 Ctrl + Alt + Insert 键才能避免在 Windows 中弹出安全选项。\n第四步:完成初次配置\n当系统重启后,在 grub 启动菜单上选择第一项以启动 Android x86 系统。\n\n等待启动,就会出现如下图:\n\n然后,根据如下图进行初次配置:\n\n\n \n \n 注意\n\n \n \n 配置 Wifi 界面时,请先跳过此步。否则 Google 将会自动检查更新。(在国内的网络环境下,这一步非常容易耗时)\n\n\n \n \n\n \n \n 如何连接网络?\n\n \n \n 在 Android x86 系统中,默认情况下是没有网络连接的,你需要手动转到【设置】→ 【WLAN】,并连接即可。\n\n如上图所示,若你使用的是 VMware 虚拟机,仅需连接虚拟 WIFI 即可上网。\n\n \n \n桌面展示\n在 Android x86 系统中,提供了两种主屏幕页面展示,一个是适用于平板电脑或手机的 🏠 QuickStep,另一个则是适合电脑 PC 的任务栏。\n\n\n键盘快捷键\n在 Android x86 系统中,有一些常用的快捷键,如下:\n\n\n Win:⚪ 回到桌面\n\n\n Win + Backspace :◀ 返回到上一页\n\n\n⬜ 切换应用:\n\n\nAlt + Tab:切换应用窗口\n\n\nAlt + Shift + Tab:反向切换引用\n\n\n💡**Tips:**先按下 Alt + Tab 快捷键选择一个应用窗口,松开 Tab 键并保持 Alt 键不放,最后再按住 Backspace 键,即可关闭当前应用窗口。\n\n\n\n\nCtrl + Alt + Delete:弹出电源选项,其中还包含【屏幕截图】功能\n\n\n在虚拟机中,你需要按下 Ctrl + Alt + Insert 键,以避免在 Windows 中弹出安全选项。\n体验感受\nAndroid x86 系统的体验与原生版本的 Android 系统差别不大,但由于系统是运行在虚拟机中,所以性能上有所损失。\n对于喜欢折腾的人来说,Android x86 系统是一个不错的选择。\n","categories":["系统体验"],"tags":["系统体验","新手向","Android"]},{"title":"系统体验:Pop_OS! 全新 Cosmic 桌面环境测试体验","url":"/2024/08/%E7%B3%BB%E7%BB%9F%E4%BD%93%E9%AA%8C-Pop-OS-24-04-%E5%85%A8%E6%96%B0-Cosmic-%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83%E4%BD%93%E9%AA%8C/","content":"前言\n很久没有写关于系统体验的文章了,这次体验的 Linux 发行版是 Pop_OS! 24.04,其主要默认的桌面环境为 Cosmic。\nCosmic 是 System76 团队开发的全新的桌面环境,其目的是构建一个自定义的操作界面。以下为引用:\n\n\nWe aim to liberate the computer with a new desktop environment powerful enough to build custom OS experiences — for users, developers, and makers of any device with a screen.\n我们的目标是通过一个足够强大的新桌面环境来解放计算机,为任何带屏幕的设备的用户、开发人员和制造商构建自定义操作系统体验。\n\n安装\nStep 1: 下载镜像\n现如今,Cosmic 桌面环境正处于测试阶段(使用过程中会有 Bug)。我们可以通过官网下载其安装镜像,下载链接在正下方:\n\nSystem76 - Linux Laptops, Desktops, and Servers\n\n点击上文提到的链接,进入官网,下拉找到 Try COSMIC Epoch 1 (alpha 1) on the Pop!_OS 24.04 LTS alpha. 一行,根据自己的 CPU 或显卡配置,按需下载 ISO 镜像即可。\n注意:国内下载速度缓慢,建议使用第三方下载工具下载镜像。\nStep 2: 刻录系统\n提示:如果你尝试使用虚拟机安装(如:VMware、Virtualbox、Qemu 等),请忽略此步并创建虚拟机即可。\n需要注意的是,若使用虚拟机过程中无法正常进入桌面,请尝试开启 3D 图形加速,或提高其运行内存 (建议: ≥ 4GB)。\n这里推荐以下软件:\n\n\nVentoy :一个多系统启动 U 盘的解决方案。可利用此工具来快速启动多个已有的 ISO 镜像文件\n\n\nRufus:一款轻松创建 USB 启动盘的工具\n\n\nbalenaEtcher:一款更为简单的烧录软件\n\n\n下载安装后,仅需插入 U 盘,然后选择需要烧录的 ISO 镜像,等待几分钟即可。这里不过多赘述。\n体验\n经过两三个小时的使用体验,可以发现 Cosmic 桌面有以下个人认为比较不错的亮点:\n桌面与登录界面\n整体外观样式与前一桌面环境(GNOME)有所不同,如下图:\n\n\n平铺窗口\n首先,最为实用的功能,就是 Cosmic 自带的平铺窗口管理。\n1. 开启平铺窗口\n只需要在顶部栏的右方点击窗口按钮,并开启平铺窗口即可。当然你还可以直接设置新工作区默认使用的窗口模式。如下图操作:\n\n2. 窗口快速开启或关闭\n你可以在下方 Dock 栏处使用鼠标中键疯狂点击 [Cosmic 终端],也可以按下快捷键 Super + Q 快速关闭所有窗口。\n\n3. 窗口拖拽\n在窗口移动方面,你可以直接使用鼠标拖拽窗口与窗口之间的大小,同时还可以拖拽窗口到其它位置。\n\n不仅如此,多个窗口可以组成 [堆叠窗口],只需要将鼠标点击任意窗口并拖拽至其它窗口上,便能堆叠窗口(也就是多标签页窗口)。\n\nLauncher 启动器\nCosmic 桌面环境提供了一种叫做 [Cosmic Launcher] 的功能,可以快速启动常用文件、搜索文件、计算器、网页搜索等功能。默认设置下,直接按下 Super + / 键(即 Windows + / 键)以呼出搜索栏。如下图:\n\n使用方法:\n\n\n直接在搜索栏上输入应用程序名称\n\n\n在搜索栏输入:~ 或者 /,可直接按文件路径打开所需文件。\n\n\n在搜索栏输入:run <command> / t:<command> 可直接打开终端并执行命令\n\n\n在搜索栏输入::<command> 可直接在后台执行命令\n\n\n网页搜索\n\nbing <keyword> 可直接使用 bing 搜索\nddk <keyword> 可直接使用 DuckDuckGo 搜索\ngoogle <keyword> 可直接使用 Google 搜索\n\n\n\n在搜索栏输入算式,会自动计算\n\n\n更多功能,请直接在搜索栏中输入 ? 查看所有可用选项。\n\n\n实用快捷键\n关于窗口与工作区管理,你还可以使用以下比较实用的快捷键,这对于日常使用来说非常有用。\n注意:以下的 Super 键为 Windows 键。\n\n\n管理窗口/工作区\n\n\nSuper + 任意方向键:选择窗口(激活窗口焦点)\n\n\nSuper + Alt + 任意方向键:切换工作区\n\n\nSuper + Tab 或 Alt + Tab:切换窗口\n\n\nSuper + Q:关闭当前窗口\n\n\nSuper + M:最大化当前窗口\n\n\n\n\n移动窗口\n\n\nSuper + Shift + 任意方向键:移动窗口\n\n\nSuper + Ctrl + Alt + 任意方向键:将窗口移动到其它工作区\n\n\n\n\n其它快捷键\n\n\nSuper + Esc:锁屏\n\n\nCtrl + Alt + Delete:注销会话\n\n\nSuper + F:打开文件管理器\n\n\nSuper + B:打开默认浏览器\n\n\nSuper + T:打开终端\n\n\nSuper + A:打开应用程序菜单\n\n\n\n\n不足之处 & 已发现的 Bugs\n正如前文所提到,Cosmic 桌面环境目前处于测试阶段,很容易能从中发现 Bug 以及不足之处。总结起来有以下几点:\n\n\n设置页面不完善:缺少 [账户]、[蓝牙]、[网络]、[声音]、[区域与语言] 等基本页面;\n\n\n工作区存在 Bug:\n\n当拥有两个以上的工作区且打开不同的窗口时,点击 [工作区] 菜单,会出现缩略图闪烁等问题;\n多个窗口同时在同一工作区内时,窗口只横向排列,导致部分窗口无法直接拖拽至其它工作区。\n\n\n\n\n\n\n关于 Launcher 启动器:\n\n首先在使用网页搜索时,不支持国内的搜索引擎(如:baidu, sogou)。在搜索栏下只能使用 bing 搜索。\n搜索文件时,部分未知文件不能直接打开。\n输入 ? 查看帮助时,显示仍为英文。\n\n\n\n输入法无法使用:尝试使用过 ibus、fcitx5 等输入法引擎,不能直接安装并使用。不知怎么解决?\n\n\n软件商店无法使用:在安装完 Cosmic 桌面环境后,打开的软件商店是完全空白的,无法显示任何内容。\n\n\n\n\n自带软件语言显示错误:系统已设置为 zh_CN.UTF-8 语言布局(简体中文),但显示如:Cosmic Text Editor、Cosmic Files等软件时显示繁体中文。如下截图:\n\n\n最后,希望开发团队能尽力出正式版。(*_*)\n","categories":["系统体验"],"tags":["系统体验","Linux","桌面环境","Pop_OS!","Cosmic"]},{"title":"[Solved] 赵神牛的游戏(解题历程)","url":"/2024/09/Solved-%E8%B5%B5%E7%A5%9E%E7%89%9B%E7%9A%84%E6%B8%B8%E6%88%8F/","content":" 点击这里查看题目来源\n开始之前\n这是我有史以来第一次做过最烦的题目(虽然这是入门级别的难度)。如果你已做过此题目并看到此篇题解,请跳过此篇,这是作者解题时的心路历程。\n解题历程\n第一次\n审题 & 敲码\n在还未完全读完整个题目的情况下,单看题目中所给的输入样本和输出样本。认为这道题目的输出只需要判断赵神牛能否打败 Boss 即可(是则输出为 1,不能则输出 -1)。\n如第一个输入样例与第二个输入样例:\n\n样例输入 #1\n100 3 500020 100090 1110 10000\n样例输出 #1\n1\n样例输入 #2\n50 4 1060 10070 100080 100090 0\n样例输出 #2\n-1\n\n随后,我就根据题目定义两个数组 spend_a, spend_b,分别存放了赵神牛的法力消耗与使用技能时的伤害值。于是就有了如下代码:\n#include <stdio.h>int main() { // k: 法力值,m: 技能数,n: boss_HP int k, m, n; scanf(\"%d %d %d\", &k, &m, &n); // a: 耗费法力,b: 造成伤害 int a, b; // 定义主角可用的技能 int spend_magic[255]; // 定义主角可用的技能 int can_use_skill = 0; // boss 受到的伤害 int get_hurt[255]; // 循环输入 m 个技能 for (int i = 0; i < m; i++) { scanf(\"%d %d\", &a, &b); // 假如有足够的法力值以使用此技能 if (k > a) { spend_magic[i] = a; get_hurt[i] = b; can_use_skill++; } } // 假如主角没有足够的法力值使用任何技能 if (can_use_skill <= 0) { printf(\"-1\"); return -1; } // 与 Boss 决斗 for (int i = 0; i < can_use_skill; i++) { while (k > 0 || n > 0) { k -= spend_magic[i]; n -= get_hurt[i]; } if (n <= 0) { printf(\"1\"); return 1; } } printf(\"-1\"); return -1;}\n正当我信誓旦旦的写出了代码之后,提交到 OJ 评判,最终得到了大量的**RE【Runtime Error】报错,甚至还有一两个TLE【Time Limit Exceeded】**报错。\n错误分析\n之一:返回值不应当是任何数,只能为 0\n翻看代码,发现 main() 函数中的返回值(return X)中的 X 都被我定义成 -1 或 1,导致出现 RE;\n后来才知道,C 语言中的 main() 函数的返回值应当以 0 的方式正常退出即可。\n之二:运行时间过长导致超出时间限制\n解决此问题,最先应当解决的就是含有 for 与 while 循环的部分了;其次,\n就是删除多余的循环。\n第一次 Again\n修改 & 敲码\n经过了重重修改并反复提交之后,敲出了如下代码:\n#include <stdio.h>int main() { // k: 法力值,m: 技能数,n: boss_HP int k, m, n; scanf(\"%d %d %d\", &k, &m, &n); // a: 耗费法力,b: 造成伤害 int a, b; int spend_a[30000], spend_b[30000]; // 循环输入 m 个技能 for (int i = 0; i < m; i++) { scanf(\"%d %d\", &a, &b); spend_a[i] = a; spend_b[i] = b; } for (int i = 0; i < m; i++) { // 假如有足够的法力值以使用此技能 if (k > spend_a[i]) { // 与 Boss 决斗 if (k / spend_a[i] * spend_b[i] >= n) { printf(\"1\"); return 0; } } } printf(\"-1\"); return 0;}\n没错,这次的代码优化了许多。提交之后,虽然没有出现任何的RE和TLE报错,但出现了大量的 WA 报错。😂😂😂\n很难想到,这究竟在哪里出了问题。\n第二次\n在解题路上摸爬滚打,终于找到原因\n基于第一次的代码,反复修改,并没有找到原因。在经历了长达4个小时的头脑风暴后,我还是毅然决然地选择~~放弃(bushi)~~请教拥有ACM竞赛经验的同学。他大致看了我所写的代码,指出了许多的小问题。\n在经历了多番的教导与纠错之下,我成功地推翻了之前的所有代码,重新审题并整理了一遍思路,反反复复地修改和优化代码。于是,就得到了相对最接近答案的代码:\n#include <stdio.h>int main(){ // k: 法力值,m: 技能数,n: boss_HP, // can_defeat: 可以打boss的技能数量, // answer: 可以打boss的技能编号 int k, m, n, can_defeat = 0; int answer[30000]; scanf(\"%d %d %d\", &k, &m, &n); // a: 耗费法力,b: 造成伤害 int a, b; for (int i = 0; i < m; i++) { scanf(\"%d %d\", &a, &b); if (a == 0 && b > 0) // 这里是为了解决除数为 0 的情况 { answer[can_defeat] = i + 1; can_defeat++; } else if (b * (k / a) >= n) { answer[can_defeat] = i + 1; can_defeat++; } } for (int i = 0; i < can_defeat; i++) { if (i < can_defeat - 1) { printf(\"%d,\", answer[i]); } else { printf(\"%d\\n\", answer[i]); } } if (can_defeat == 0) { printf(\"-1\"); } return 0;}\n其中上述代码作出的修改点有:\n\n\n删除了 spend_a 和 spend_b 这两个数组,因为不需要记录技能的消耗和伤害值,只需要判断是否可以打 boss 即可。\n\n\n在 for 循环中,判断是否可以打 boss 的条件由 k / spend_a[i] * spend_b[i] >= n 改为 b * (k / a) >= n,因为 k / spend_a[i] * spend_b[i] 可能会因为除数太小而溢出。\n\n\n在 for 循环中,判断是否可以打 boss 的条件由 k > spend_a[i] 改为 a == 0 && b > 0,因为当 a == 0 && b > 0 时,说明是 k 无法消耗,但 b 可以造成伤害,此时可以打 boss。\n\n\n经历了漫长的解题抗争之后,才发现的小问题\n正当以为终于可以解开这道题~~(解开了,又没完全解开)~~的时候,结果仍然是WA。我经历了无数次毫无意义的修改和调试,还是没能发现问题所在。\n最后,同学仔细查看了我所写的代码之后,才发现了问题所在:没有仔细审题!!!\n是的,这问题我从头到尾都没有注意过,就是输出多个技能序列时分隔的问题。我的代码中是用 , 隔开,而题目中的输出要求是用空格隔开。\n终于终于,我最后一次提交了正确的代码,终于全部通过了😭😭😭~~~~\n","categories":["刷题TODO"],"tags":["C_and_Cpp","解题历程","💡解题"]},{"title":"[Unsolved] 9月11日","url":"/2024/09/Unsolved-9%E6%9C%8811%E6%97%A5/","content":"一、【Mc生存】插火把\n 点击这里查看题目来源\n 查看题解\n题目描述\n话说有一天 linyorson 在“我的世界”开了一个 的方阵,现在他有 个火把和 个萤石,分别放在 和 的位置,没有光并且没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?\nP.S. 火把的照亮范围是:\n|暗|暗| 光 |暗|暗||暗|光| 光 |光|暗||光|光|火把|光|光||暗|光| 光 |光|暗||暗|暗| 光 |暗|暗|\n萤石:\n|光|光| 光 |光|光||光|光| 光 |光|光||光|光|萤石|光|光||光|光| 光 |光|光||光|光| 光 |光|光|\n输入格式\n输入共 行。\n第一行为 。\n第 到第 行分别是火把的位置 。\n第 到第 行分别是萤石的位置 。\n注:可能没有萤石,但一定有火把。\n输出格式\n有几个点会生出怪物。\n样例 #1\n样例输入 #1\n5 1 03 3\n样例输出 #1\n12\n提示\n数据保证,,,,。\n\n二、赵神牛的游戏\n 点击这里查看题目来源\n 访问查看题解 💡\n题目描述\n在 DNF 中,赵神牛有一个缔造者,他一共有 点法力值,一共有 个技能,每个技能耗费的法力值为 ,可以造成的伤害为 ,而 boss 的体力值为 ,请你求出它放哪个技能,才可以打死 boss。\n当然,赵神牛技术很菜,他一局只放一个技能,不过每个技能都可以放无数次。\n输入格式\n第一行有三个整数,分别表示 。\n后面 行,每行两个整数,第 行的整数表示耗费的法力值 和造成的伤害 。\n输出格式\n输出仅一行,即可以杀死 boss 的技能序号,如果有多个,按从小到大的顺序输出,中间用一个空格隔开;如果没有技能能杀死 boss,输出 -1。\n样例 #1\n样例输入 #1\n100 3 500020 100090 1110 10000\n样例输出 #1\n1\n样例 #2\n样例输入 #2\n50 4 1060 10070 100080 100090 0\n样例输出 #2\n-1\n提示\n数据规模与约定\n对于全部的测试点,满足:\n\n,\n。\n\n","categories":["刷题TODO"],"tags":["C_and_Cpp","刷题"]},{"title":"搭建个人博客(五):完整迁移评论数据至 Vercel(含 Vercel 部署)","url":"/2024/09/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E4%BA%94%EF%BC%89%EF%BC%9A%E5%AE%8C%E6%95%B4%E8%BF%81%E7%A7%BB%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE%E8%87%B3-Vercel/","content":"\n \n \n 阅前需知\n\n \n \n 本文主要针对于使用了 Deta 部署 Waline 评论系统 或者已使用其它平台部署 Waline 评论系统的使用者而写的文章。\n\n如果需要将之前部署的评论系统里的数据(包括评论、用户、点击数等)完整迁移至 Vercel 所部署的 Waline 评论系统中,需要做以下操作。\n\n \n \nStep 1: 导出数据\n为了很好的保存之前部署的评论系统中的数据,需要先将所有的评论及其它数据保存到本地。具体方法如下:\n1、打开你的个人博客网页,点击任意文章,在评论区下方点击自己的头像。\n\n2、根据如下图所示,依次点击并选择导出。导出后,会得到一个 waline.json 文件(之后导入操作需要用上)。\n\nStep 2: LeanCloud 操作(使用 Vercel 部署时必用)\n\n \n \n 提示\n\n \n \n 如果先前已经使用 LeanCloud 部署过评论系统,可以跳过此步。\n\n \n \n1、在 LeanCloud 官网注册一个账号,并创建一个应用。\n\n2、备份 LeanCloud 中的环境变量\n\n\n \n \n 需要注意\n\n \n \n 上图中标注的三个 AppID, AppKey, MasterKey 中的 ID 或密钥复制下来并保存成环境变量文件(以 waline.env 命名为例)。具体格式如下,文件中的 <...> 需要替换对应的内容。\nLEAN_ID=<AppID> LEAN_KEY=<AppKey>LEAN_MASTER_KEY=<MasterKey>\n之后在部署 Vercel 时,可以一次性导入环境变量。\n\n \n \nStep 3: Vercel 部署 Waline 评论系统\n1、在 Vercel 上 Deploy Waline 评论系统。\n\n\n需要注意的是,第一次打开 Vercel 需要登录,此处建议使用 Github 快捷登录即可。\n\n2、根据如下图指示,输入完名字并点击 [Create] 按钮后,等待 1~2 分钟。\n\n当出现烟花庆祝🎉时,表示 Deploy 已经完成,点击黑色按钮 [Go to Dashboard] 即可。\n3、根据如下图指示,将写好的环境变量文件 waline.env 文件导入。\n\n\n4、根据下图指示,以执行 Redeploy 操作。\n\n\n5、等待 1~2 分钟即可完成 Vercel 部署。此时,你可以直接测试自己的评论系统了。\n\n\n \n \n 注意\n\n \n \n 国内网络环境下可能无法直接访问到 Vercel 部署的评论系统。若有需要,建议使用代理以访问。\n\n \n \nStep 4: 测试评论系统\n要想在自己的博客网站上测试自己部署的 Waline 评论系统,需要做以下几步:\n1、在自己的博客项目根目录下找到主题配置文件,这里就以 Redefine 主题为例,打开 _config.redefine.yml 文件,找到如下内容,并修改:\n............comment: # Whether to enable comment enable: true # Comment system system: waline # waline, gitalk, twikoo, giscus # System configuration config: # Waline comment system. See https://waline.js.org/ waline: serverUrl: <在此处粘贴> lang: zh-CN............\n2、之后在终端下执行:npx hexo s\n3、打开自己的博客网站(本地下执行预览,只需访问 http://localhost:4000 即可),选择任意文章,在文章页的最下方评论区中测试。\nStep 5: 迁移数据\n\n \n 注意:在进行导入操作前,请务必先评论和选择反应!\n否则导入时会出现弹窗报错,大致内容为:\n500: Class or object doesn't exists. [404 GET https://kdxvn5cw.api.lncldglobal.com/1.1/classes/Comment]\n\n\n \n1、在如上图中选择 [登录] 按钮;\n **需要注意:请先不要登录之前使用的账号,登录其它任意账号!**具体问题,如下对比图:\n\n2、点击 [管理] -> [导入导出],点击 [导入] 按钮。弹出窗口后,点击 [确认] 以覆盖评论数据。\n\n3、等待 1~2 分钟,当弹出窗口并显示 导入完成 时,表示数据迁移完成。\n4、最后刷新博客页面,以查看博客里的评论数据是否原样迁移。\n","categories":["博客搭建"],"tags":["博客搭建","Waline"]},{"title":"[答疑解惑] 关于 Github 的问题解决方法","url":"/2024/09/%E7%96%91%E9%9A%BE%E8%A7%A3%E7%AD%94-%E5%85%B3%E4%BA%8E-Github-%E7%9A%84%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/","content":"前言\n\nGithub 是一个很常用的代码托管平台,我们可以利用此平台下载或克隆到优质的代码仓库,但是在某些情况下,我们可能会遇到一些问题,下面是由本人列举的一些问题与解决方法,希望这能有所帮助😉。\n1、Github 访问不了\n大多数国内的用户在访问 Github 时总会遇到加载速度缓慢,甚至无法访问站点的情况。关于此类问题,有以下几个方法解决:\n1.1 利用 Watt Toolkit 加速访问 👍\n众所周知,Watt Toolkit (Steam++ 前身) 是一个非常适合新手的软件,你仅需在【网络加速】页面上勾选上 Github 选项,点击 [立即加速] 即可。这也是本人最为推荐的方法。\n Watt Toolkit 下载\n\n1.2 使用代理加速访问\n如果有经济条件,使用代理服务器是非常不错的选择。现如今,本人最推荐的是以下两款主流的代理软件:\nV2rayNG:一个基于 v2ray 的免费开源软件,支持 Windows、Android、iOS 等平台。\n V2rayNG 下载\nClash 小猫咪:一个开源的代理软件,支持 Windows、Android、iOS 等平台。\n Clash 下载\n如果需要追求网络稳定、快速,那么购买靠谱的节点或机场是不错的选择。反之,如果没有经济条件,选择免费节点也是不错的选择,但不能保证网络一直稳定、快速。\n关于免费节点的获取,本文就不分享免费节点站点了,请自行使用必应或 Google 搜索。\n注意:寻找免费节点时,请尽量不要使用百度搜索!\n2、无法从 Github 项目中克隆或推送项目\n此类问题非常常见,当你在终端下执行 git clone <URL> 或者 git push -u origin main 时,可能会出现不同程度的报错:\n2.1 443 端口无法连接\nfatal: unable to access 'https://github.com/XXX/XXX.git/': Failed to connect to github.com port 443 after 21066 ms: Could not connect to server\n此类问题下最好是通过使用代理,在使用此方法前,首先请确保你已安装如上提到的软件,如:Clash、V2rayNG 等。\n不同的软件,对应使用的端口也不相同,具体如下:\n1、Clash 小猫咪\n通过其默认端口 7890 以直接配置如下:\ngit config --global http.proxy 127.0.0.1:7890git config --global https.proxy 127.0.0.1:7890\n2、V2rayNG\n关于此软件,需要打开软件主界面,在如下图所指示的地址就是配置代理的选项,\n\n\n \n 注意:\nV2rayN 的 UI 版本不同,如果使用的是旧版本的 V2rayN,则为如下图所指示:\n\n\n \n这里就按照 Http 所提供的端口 10809 进行配置即可:\ngit config --global http.proxy 127.0.0.1:10809git config --global https.proxy 127.0.0.1:10809\n2.2 Git 中的 Github 邮箱与密码\n假如你需要在 Github 中克隆一个私有的项目仓库或推送项目仓库时,往往会出现如下情况:\nUsername for 'https://github.com':Password for 'https://username@github.com':\n此类情况下,你需要输入对应的用户名和对应的 Token 才能继续操作。关于 Token 的获取,请看下文。\n\n\n首先点击此链接 New Personal Access Token (Classic) (github.com)\n\n\n根据如下图所示操作:\n\n\n\n完成后点击最下方的绿色按钮【Generate token】,这将会生成一个随机的 token,如下图:\n\n上图中的绿色框为所需要的 Token。\n\n \n 需要注意:\n\t每次仅会显示一次完整的 Token,下一次刷新页面后将会完全隐藏,建议生成后做好备份!\n\n \n\n\n后记\n本篇内容仅是本人在 Github 上的常见问题,如果遇到其它问题或者有更好的解决方案,欢迎在评论区下留言!\n","categories":["答疑解惑"],"tags":["Git","Github","新手向","答疑解惑"]},{"title":"[Solved] 【MC生存】插火把","url":"/2024/09/Solved-%E3%80%90MC%E7%94%9F%E5%AD%98%E3%80%91%E6%8F%92%E7%81%AB%E6%8A%8A/","content":"解题思路\n大致思路:你需要知道地图大小、火把个数、萤石个数,并初始化地图,然后根据用户输入的火把(或萤石)坐标,并根据对应的照亮范围点亮,剩余未点亮的部分(暗区)将出现怪物。\n因此有了大致的流程图:\n\n💡 关于点亮范围的实现方法:\n\n火把:可以通过遍历 for 循环来分别实现横向 / 纵向点亮火把所在方位,剩余附近部分则单独点亮;\n萤石:通过两层嵌套 for 循环将萤石附近区域点亮。\n\n代码参考\n#include <stdio.h>int main(){ int n, m, k; int mX, mY, kX, kY; int zombie = 0; // 初始设置:地图大小、火把数、萤石数 scanf(\"%d %d %d\", &n, &m, &k); // 创建地图 int map[105][105]; // 开始前所有格都是暗格 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { map[i][j] = 0; // 0 = 暗 } } for (int i = 0; i < m; i++) { scanf(\"%d %d\", &mX, &mY); // 点亮火把范围 for (int x = mX - 3; x < mX + 2; x++) { map[x][mY-1] = 1; } for (int y = mY - 3; y < mY + 2; y++) { map[mX-1][y] = 1; } // 点亮火把附近 map[mX - 1 - 1][mY - 1 - 1] = 1; map[mX - 1 - 1][mY - 1 + 1] = 1; map[mX - 1 + 1][mY - 1 - 1] = 1; map[mX - 1 + 1][mY - 1 + 1] = 1; } for (int i = 0; i < k; i++) { scanf(\"%d %d\", &kX, &kY); // 点亮萤石范围 for (int x = kX - 3; x < kX + 2; x++) { for (int y = kY - 3; y < kY + 2; y++) { map[x][y] = 1; } } } // 生成怪物数 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // printf(\"%d,\", map[i][j]); if (map[i][j] == 0) { zombie++; } } // printf(\"\\n\"); } printf(\"%d\", zombie); return 0;}\n\n提示:代码部分仅作为参考,可直接在原有基础上再度优化或简化。\n\n","categories":["刷题TODO"],"tags":["C_and_Cpp","💡解题"]},{"title":"[Switch 分享] 如何实现 Youtube 观看自由","url":"/2024/11/Switch-%E5%88%86%E4%BA%AB-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0-Youtube-%E8%A7%82%E7%9C%8B%E8%87%AA%E7%94%B1/","content":"写在前面\n本文主要介绍如何下载并配置网络工具以及如何在 Switch 上流程看油管。如果觉得此篇有用,不如支持此篇文章(*_*)\n\n准备\n事先说明:请务必拥有好的网络节点(最起码能够在电脑上访问谷歌)。\n首先,需要在网上下载以下几款软件:\n\nDNSJumper:一个用于检测 DNS 速度的工具【点击下载】\nNetch:一个用于上网加速的工具【点击跳转至下载链接】\nWinPcap:用于辅助 Netch 软件(建议必下)【点击下载】\n\n其次,你只需要做以下事情即可:\n\n[ ] 下载并解压 DNSJumper、Netch(如果已经下载);\n[ ] 安装 WinPcap,(如果需要使用 Netch 来实现境外访问);\n\n检测 DNS\n根据自己的网络环境,打开 DNSJumper,根据如下图的操作,选择【⚡ 最快 DNS】;\n\n打开之后,点击如下图指示的按钮直接测试 DNS,最后筛选几个毫秒数最小的 DNS 即可。\n\n注意:这一步在配置 Switch 网络设置时需要用到!\nNetch 相关配置\n阅前提醒:此步骤需要使用已有的网络节点才能实现网络加速!\n此部分教程适用于需要加速访问油管(▶ Youtube)\n添加服务器\n1. 通过订阅添加\n1️⃣ 首先,打开 Netch,根据如图所示点开【订阅】菜单。\n\n2️⃣ 按照如下图,填入信息,最后点击【修改】或者【添加】即可。\n\n3️⃣ 完成后,记得再次点击【订阅】菜单,并更新即可。\n2. 手动添加服务器\n以 V2ray 为例:\n1️⃣ 选择一个真延迟较低的服务器,(如果没有显示真延迟,先按下 Ctrl + A 再按下 Ctrl + R 以测试所有服务器 )\n2️⃣ 选中服务器后,按下 Ctrl + C 复制;\n3️⃣ 打开 Netch,按照如下图所示,直接粘贴即可。\n\n简要配置\n按照如下图所示的说明进行配置即可。\n\n启动之后,你会得到如下信息:\nListen on \\Device\\NPF_{B86808EE-659B-48E6-864D-DF596E5027B2} (Qualcomm Atheros QCA61x4A Wireless Network Adapter) [74:4c:a1:a4:29:d7]: 192.168.82.5Use MTU 1400Publish for 10.6.0.2Please set the network of your device which is going to be proxied with the following parameters: ┌───────────────────────────┐ │ IP Address 10.6.0.1 │ │ Mask 255.255.255.0 │ │ Gateway 10.6.0.2 │ │───────────────────────────│ │ MTU <=1400 │ └───────────────────────────┘Proxy 10.6.0.1/32 to 127.0.0.1:2801\n其中的 IP 地址 IP Address 、子网掩码 Mask、网关 Gateway 在之后配置 Switch 网络时会用到。\n配置 Switch 网络设置\n打开自己的 Switch 设置 → 互联网 → 互联网设置\n选择任一 WIFI,然后选择【更改设置】,根据如下图设置 IP 地址以及 DNS 即可。\n\n如果实在找不到合适的 DNS 地址,可以尝试下如下图 : )\n\n最后,不要忘记点击保存设置。\n写在最后\n虽然这是已有的文章,但是还是希望通过此文章来帮助到正在阅读此文的你。(*_*)\n","categories":["软件安利"],"tags":["Windows","Switch","Youtube","任天堂","油管"]},{"title":"解题/刷题:新增分类","url":"/2024/09/%E8%A7%A3%E9%A2%98-%E5%88%B7%E9%A2%98%EF%BC%9A%E6%96%B0%E5%A2%9E%E5%88%86%E7%B1%BB/","content":"这是什么新分类?\n这是最新的分类——解题/刷题,主要用于记录刷题过程中遇到的问题与解题思路。目前使用的编程语言主要为 C 语言。题目会从网络途径获取。\n注意:不是每个题目都会以博客的形式发布!\n为什么要新增一个分类?\n一方面,是为了能够快速找到适合自己的题目(适合自己的难度);另一方面,为了能够记录刷题过程中遇到的问题与解题思路,方便自己以后查阅。\n题目从何而来?\n主要有以下几个途径:\n\n\n洛谷: 一个目前正在刷题的网站;\n\n\nPTA在线平台: 一个非常适合入门编程语言的刷题网站,非常适合从此刻入门;\n\n\nCodeforces: 适合用于备战 ACM 国际大学生程序设计竞赛的刷题网站;\n\n\n目前暂时会更新以上平台的题目。\n","categories":["刷题TODO"],"tags":["💡解题","刷题"]},{"title":"2024 年终总结","url":"/2024/12/2024-Summary/","content":"来自平台的年度总结\n这是自 2024 年 4 月以来至至今的年终总结,首先,先来分享下平台所提供给我的年度报告:\nGithub 年度总结\n关于 Github,我使用了 GitHub Wrapped 网站,这个网站是通过输入自己的 Github 用户名,得到了自动生成的年终报告,\n链接以提供如下:\n GitHub Wrapped\n通过使用 Github Wrapped,得到了以下内容:\n\n知乎\n这是关于我的知乎年度报告:\n\n自我总结\n自 2024 年 4 月起,本人注册了 Github、知乎、Bilibili等多个平台的账号,想要尝试自己从未尝试过的方式来记录自己。我从自己所搭建的博客到自己能够独立完成一个较为简单的编程项目,这半年多的时间里,折腾了许多我从未尝试过的东西,也走了不少弯路。\n虽然我没有像现如今的大佬那样技术精湛,也没有做出什么特别吸引人的项目,但这些努力,让我对技术有了更深入的理解,也让我对生活有了更深入的理解。因此,在将来的一年里,我将尽自己的最大努力来完成自己设立的一个个小目标,也为将来找一份实习做好一定的准备。\n未来一年的计划\n学习计划\n我主要学习的是 C_and_Cpp 编程语言,首先在目前已学的基础上,学习更多的知识来拓宽自己的知识框架。比如:\n\n数据结构\n算法(已为自己明年 4 月的蓝桥杯做好了准备)\nQT\nSTD模板\nOpenCV\n…\n\n我希望在 2025 年里,能够找到适合我学习和借鉴的项目,提升下自己阅读代码的能力,同时也尝试通过书籍的方式来提升自己对编程语言的理解。\n关于个人博客的更新\n自 2024 年 4 月至至今(包括这篇博文),已经总共写了 33 篇文章。虽然文章内容的质量没有那么高,没有像大佬们那样写一些很酷的技术文章。但是,将来在提升自己技术的同时,也会继续利用写博客的方式来记录自己所学的内容。包括遇到的问题与解决的方法。当然也会尽量多写几篇更多自己折腾过的一些小东西。\n动态内容还会像之前那样不间断随机更新,壁纸也会不定时的更新。当然也不会忘记的使用习惯,也要逐渐改变。\n最后\n我希望自己能够继续努力,继续学习,继续进步。也希望能够多认识、多浏览更多精彩地、更有质量的内容。同时也会多多去学习、多分享。\n最后,新的一年能继续努力,继续成长!( ̄▽ ̄)"\n","categories":["年终总结"],"tags":["记录日常","年终总结"]},{"title":"[折腾日记] Oh-my-zsh 哦~我那好用的终端","url":"/2024/11/%E6%8A%98%E8%85%BE%E6%97%A5%E8%AE%B0-Oh-my-zsh-%E5%93%A6-%E6%88%91%E9%82%A3%E5%A5%BD%E7%94%A8%E7%9A%84%E7%BB%88%E7%AB%AF/","content":"写在最前\n写这篇文章的初衷主要是为了记录曾经在 Linux 上折腾过的各种过程,并将其写成类似于学习教程的形式以此来帮助跟作者本人一样在折腾 Linux 的人。\n如果你也正在折腾 Linux,那么请简要阅读这篇文章,希望这能有所帮助。 ( ̄︶ ̄*)\n折腾环境\n这里本人使用的是基于 WSL 2 下的 Debian 发行版系统,\n如果你已安装 WSL,可直接执行如下:\nwsl.exe --install -d debian\n当然,如果需要其它可安装的发行版系统,可直接执行:\nwsl.exe -l -o\n如果未安装 WSL?不如看看这篇?\n WSL:一个适用于 Windows 的 Linux 子系统\n折腾全过程\n很显然,默认环境下的 WSL 除了勉强能用的 Tab 命令/目录补全、Ctrl + R 历史记录回溯之外,貌似啥也没有了(ˉ▽ˉ;)…\ndebian@DESKTOP-EPQI5KJ:~$ _\n是的,就是这样。一个平平无奇的交互界面。\n但为了能更好地改造交互,不仅要改变外观,还要增加其可用程度。以下是本人折腾时的简要过程。\n1. 安装必需软件包\n很显然,要想改变这一切,需要先改变当前的 Shell 环境。欲查看当前的环境,只需执行:echo $SHELL。这里作者默认使用 Bash 环境,其输出为:/bin/bash。\n不过在此之前,首先就是需要使用 APT 包管理器来安装所需要的软件包。\n\n注:这里的 APT 不是想象的那个 APT,而是那个具有超级牛力的 APT [doge]。\n\n执行命令如下:\nsudo apt install git zsh curl vim neofetch -y # 这里的 neofetch 可不装,这里纯粹是为了装 X 用的\n\n💡 关于下载速度慢的解决方法:\n使用 APT 时出现下载慢?很可能是因为💿镜像源,要想改善其下载速度,直接修改镜像源即可。\n这里作者使用清华源镜像以加速,当然还可以用其它的开源镜像站。\n你只需要执行如下命令,即可一次性完成替换镜像源:\ncat > /etc/apt/sources.list << EOFdeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmwaredeb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware# deb-src https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmwareEOF\n步骤 2:更新软件源\nsudo apt update\n步骤 3:下载到一半时取消?直接带上 --fix-missing 选项就可以继续未完成的下载了O(∩_∩)O。\nsudo apt install git zsh curl vim neofetch -y --fix-missing\n\n2. 切换 Shell 环境\n当你完成了下载以及安装之后,执行如下命令,可直接将 Bash 更改为 Zsh 环境\nsudo chsh -s /bin/zsh\n执行后,只需重新登录此用户,你会看到如下提示界面:\nThis is the Z Shell configuration function for new users,zsh-newuser-install.You are seeing this message because you have no zsh startup files(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory~). This function can help you with a few settings that shouldmake your use of the shell easier.You can:(q) Quit and do nothing. The function will be run again next time.(0) Exit, creating the file ~/.zshrc containing just a comment. That will prevent this function being run again.(1) Continue to the main menu.(2) Populate your ~/.zshrc with the configuration recommended by the system administrator and exit (you will need to edit the file by hand, if so desired).--- Type one of the keys in parentheses ---\n没错,到这里已经是完成了一部分!此步骤下,可以直接按下 0,不做任何配置即可。之后,你会看到全新的命令行显示。如下:\nDESKTOP-EPQI5KJ% _\n3. 安装与配置 Oh-my-zsh\n虽然,已经成功了一部分,但还是缺少了灵魂。为了能让自己的 zsh 变得更极具美观,安装 oh-my-zsh 或许是一个非常不错的一种方式。\n安装 Oh-my-zsh\n这里为了方便国内用户下载 Oh-my-zsh,这里就直接采用清华源下载的方法来执行如下操作:\n\n详情说明见:ohmyzsh.git | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror\n\ncd ~/git clone https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.gitcd ohmyzsh/toolsREMOTE=https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git sh install.sh\n等待一系列操作后,你将会看到安装成功的画面:\nLooking for an existing zsh config...Found /home/test/.zshrc. Backing up to /home/test/.zshrc.pre-oh-my-zshUsing the Oh My Zsh template file and adding it to /home/test/.zshrc. __ __ ____ / /_ ____ ___ __ __ ____ _____/ /_ / __ \\/ __ \\ / __ `__ \\/ / / / /_ / / ___/ __ \\/ /_/ / / / / / / / / / / /_/ / / /_(__ ) / / /\\____/_/ /_/ /_/ /_/ /_/\\__, / /___/____/_/ /_/ /____/ ....is now installed!Before you scream Oh My Zsh! look over the `.zshrc` file to select plugins, themes, and options.• Follow us on X: https://x.com/ohmyzsh• Join our Discord community: https://discord.gg/ohmyzsh• Get stickers, t-shirts, coffee mugs and more: https://shop.planetargon.com/collections/oh-my-zsh➜ tools _\n配置我的 zsh\n是的,当你看到如上的画面时,Oh-my-zsh 的安装就已经完成了!不过,这要怎么配置我的 zsh 呢?\n直接利用 vim 打开 ~/.zshrc 文件,在这里你可以添加插件以及修改正在使用的主题。\n提示:以下所提到的主题、插件等配置都需要在 ~/.zshrc 配置文件中修改。\n(1) 改变主题\n在 ZSH_THEME 变量中修改对应主题\nZSH_THEME="robbyrussell" # 默认主题ZSH_THEME="random" \t\t # 不确定或有多个常用外观的情况下,random 是个不错的选项\n关于所有可用的主题,执行:ls -1 $ZSH/themes | cut -d '.' -f1 | less 可直接查看。\n\n关于主题预览,可直接访问:https://github.com/ohmyzsh/ohmyzsh/wiki/Themes\n\n当你遇到不太确定的主题或者遇到喜欢多个主题时,在 ZSH_THEME 变量中设置为 random 是个很不错的主意(* ̄3 ̄)╭(如果你真心找不到什么特别好看的主题)\n当你设置成随机主题时,再次重新登录时,你会看到类似这样的画面:\n[oh-my-zsh] Random theme 'juanghurtado' loadedtest@DESKTOP-EPQI5KJ:/home/debian> _\n除了上面的提示,你还可以直接通过 echo $RANDOM_THEME 来查看随机到的主题名称。\n如果你遇到了几个比较满意的主题,可以直接将其记录到 ZSH_THEME_RANDOM_CANDIDATES 变量中,这样以后每次登录都只会在此变量中随机选择主题。\n例如:作者就对 juanghurtado, essembeh, tjkirch, apple 等主题感兴趣,那么可以将这几个主题都填入到该变量中。内容如下:\nZSH_THEME_RANDOM_CANDIDATES=( "juanghurtado" "essembeh" "tjkirch" "apple" ) # 注意空格分隔\n注意:此变量大约在文件的第 18 行左右,只需将最前面的 # 去掉即可。\n(2) 通用插件\n为了能够让终端变得更加好用,首先来推荐几个内置的 ZSH 插件。\n\n\naliases:基于 alias 命令,可快速搜索短命令(简写命令);其命令为 als。点此查看所有用法。\n\n\n简要用法 1:als -g git 查看 git 组下的所有短命令;\n\n\n👍 简要用法 2:als <keys> 搜索包含 <keys> 的命令以及短命令;\n\n\n简要用法 3:als --groups 查看所有组;\n\n\nTips:这对于经常使用 git 命令的人群而言非常有用!\n\n\n\n\ngit:默认启用的插件,提供更多的短命令以及更有用的函数;\n\n可直接搭配 aliases 查看所有关于 git 的短命令\n\n\n\nsudo:启用后,只需按下两次 Esc 就能在行前自动添加/删除 sudo 前缀;\n\n\nz:显示 / 快速进入最常访问的目录\n\n默认下,执行 z 命令,会显示前几个访问频率最高的目录;\n在命令行下依次键入 z 、Space 后,连续按下 Tab 键,可以进入经常访问过的目录。\n\n\n\nzsh-navigation-tools:命令历史记录回溯改良版,按下 Ctrl + R 键可快速搜索之前使用过的命令\n\n\n\nTIPS:关于所有自带插件,请详见:Plugins · ohmyzsh/ohmyzsh Wiki\n\n这里就推荐几个 Github 上非常好用的几款 ZSH 插件,以提升使用效率。\n\nzsh-autosuggestions:自动建议工具,根据命令历史记录来自动完成命令;\nzsh-completions:自动补全命令工具,可通过 Tab 键以快速补全各种常用命令。\nzsh-syntax-highlighting:语法检查高亮工具,可检查当前输入的命令以标记不同的颜色;\n\n\n以上推荐的额外插件,均可通过 github 上下载。对应链接如下:\n\nhttps://github.com/zsh-users/zsh-autosuggestions\nhttps://github.com/zsh-users/zsh-completions\nhttps://github.com/zsh-users/zsh-syntax-highlighting\n\n\n\n国内若不能直接访问 Github,那么,请尝试使用 gitee,对应链接如下:\n\nhttps://gitee.com/sasukeZhou/zsh-autosuggestions\nhttps://gitee.com/yuhldr/zsh-completions\nhttps://gitee.com/minhanghuang/zsh-syntax-highlighting\n\n\n(3) 添加插件\n欲添加插件,可以在 ~/.zshrc 文件中的 plugins 变量来进行添加,具体如下例:\nplugins=( aliases git sudo z zsh-navigation-tools zsh-autosuggestions zsh-completions zsh-syntax-highlighting)\n对于第三方插件(自行下载的插件)\n要想添加插件,有以下几种方法:\n👍 Git 安装\n以安装 zsh-autosuggestions 为例:\n可直接通过命令以实现安装:\ngit clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions\n手动安装\n还是以安装 zsh-autosuggestions 为例,\n在浏览器中点击下载对应的压缩包 (*.zip)。\n解压压缩包,将解压后的文件复制到 $ZSH_CUSTOM/plugins/ 目录下。具体命令如下:\nunzip zsh-autosuggestions-0.7.1.zipcp -r zsh-autosuggestions-0.7.1 $ZSH_CUSTOM/plugins/zsh-autosuggestions\n注意:这里的 zsh-autosuggestions-0.7.1 为解压后的文件夹名称,请根据实际情况进行修改;\n注意:若当前发行版系统找不到 unzip 命令,请自行通过 apt 安装 unzip 软件包。具体命令为:sudo apt install unzip -y。\n写在最后\n关于下一篇内容,个人考虑在 Neovim 上入手,如果有较强的折腾能力,可以尝试将 neovim 改造成一个命令行下的 IDE(*_*)。\n还是那句话:感兴趣?建议点个收藏或关注?( ̄▽ ̄)"(多少有点不好意思)\n","categories":["折腾日记"],"tags":["Linux","Git","Github","新手向","WSL","oh-my-zsh"]},{"title":"[答疑解惑] C++ 中的 gets() 函数替代方案","url":"/2024/12/%E7%AD%94%E7%96%91%E8%A7%A3%E6%83%91-%E5%85%B3%E4%BA%8E-gets-%E5%87%BD%E6%95%B0%E4%B8%8D%E8%83%BD%E5%9C%A8C-11%E5%8F%8A%E4%BB%A5%E5%90%8E%E4%BD%BF%E7%94%A8%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","content":"简述\n在学习 C++ 的时候,发现 gets() 函数不能直接在 C++ 环境下使用。\n下述代码中,本人编写了较为简单的程序,用于输出用户输入行内的两段内容。\n#include <iostream>#include <cstring>using namespace std;int main() { char c_name[127]; string s_name; cout << "Please input your name:"; gets(c_name); // 当 c_name 长度小于 2 时,要求重新输入 while (strlen(c_name) < 2) { cout << "Error: Please input again!\\nYour name:"; gets(c_name); } // 输出结果 cout << "Your name: " << c_name << endl; return 0;}\n很显然,运行后出现了以下报错内容:\nerror: ‘gets’ was not declared in this scope; did you mean ‘getw’?\n分析原因 & 解决方案\nC++ 11 及以后版本中,gets() 函数已被废弃,因为其存在安全漏洞,即 gets() 函数在输入字符串时,不会检查字符串的长度,可能会导致缓冲区溢出。\n因此,在 C++ 中,针对 char 类型的字符串,一般使用 fgets() 函数来代替;\nfgets() 函数可以正确地检查字符串的长度,避免缓冲区溢出。\n函数使用\nfgets() 函数\n其函数定义于 <cstdio> 头文件中,其函数原型如下:\nchar* fgets( char* str, int count, std::FILE* stream );\n其中的参数含义如下:\n\nstr:用于存储读取的字符串。\ncount:读取的字符串的最大长度,包括字符串结束符。\nstream:文件流对象。可以是 stdin、stdout、stderr、FILE* 类型的指针等。\n\n使用示例\n根据如上的分析与解决方案,由 【简述】 中所述的代码示例可改写成如下:\n#include <iostream>#include <cstring>#include <cstdio>using namespace std;int main() { char c_name[127]; string s_name; cout << "Please input your name:"; fgets(c_name, 127, stdin); while (strlen(c_name) < 2) { cout << "Error: Please input again!\\nYour name:"; fgets(c_name, 127, stdin); } cout << "Your name in char: " << c_name; return 0;}\n参考资料\n\nstd::fgets - cppreference.com - C++参考手册\ngets, gets_s - cppreference.com - C++参考手册\n为什么gets函数不能用了? - ACM与蓝桥杯竞赛指南 - C语言网\n\n","categories":["答疑解惑"],"tags":["C_and_Cpp","新手向","答疑解惑"]},{"title":"[Codeforces ROUND 991 Div.3] 1205","url":"/2024/12/CF-R991-D3/","content":" 官方题单\nA. Line Breaks\n\ntime limit per test: 1 second\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文Kostya has a text consisting of words made up of Latin alphabet letters. He also has two strips on which he must write the text. The first strip can hold characters, while the second can hold as many as needed.\nKostya must choose a number and write the first words from on the first strip, while all the remaining words are written on the second strip. To save space, the words are written without gaps, but each word must be entirely on one strip.\nSince space on the second strip is very valuable, Kostya asks you to choose the maximum possible number such that all words fit on the first strip of length .科斯佳(Kostya)有一段文本 ,它由 个由拉丁字母组成的单词构成。他还有两张纸条,必须把这段文本写在这两张纸条上。第一张纸条能容纳 个字符,而第二张纸条则能容纳任意数量的字符。\n科斯佳必须选择一个数字 ,并将文本 中的前 个单词写在第一张纸条上,而其余所有单词则写在第二张纸条上。为了节省空间,单词之间不留空格书写,但每个单词必须完整地写在一张纸条上。\n由于第二张纸条上的空间非常宝贵,科斯佳请你选择最大可能的数字 ,使得所有单词 都能写在长度为 的第一张纸条上。\n样例\n原文译文INPUT\nThe first line contains an integer — the number of test cases.\nThe first line of each test case contains two integers and ; — the number of words in the list and the maximum number of characters that can be on the first strip.\nThe next lines contain one word of lowercase Latin letters, where the length of does not exceed .\nOUTPUT\nFor each test case, output the maximum number of words such that the first words have a total length of no more than .输入\n第一行包含一个整数 : 测试用例数。\n每个测试用例的第一行包含两个整数 和 ; : 列表中的字数和第一条上的最大字符数。\n接下来的 行包含一个由小写拉丁字母组成的单词 ,其中 的长度不超过 。\n输出\n对于每个测试用例,输出最大字数 ,使得前 个字的总长度不超过 。\n示例\n53 1abc2 9alphabeta4 12helloworldandcodeforces3 2abcd3 2abcaba\n12210\nB. Transfusion\n\ntime limit per test: 2 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文You are given an array of length . In one operation, you can pick an index from to inclusive, and do one of the following actions:\n\nDecrease by , then increase by .\nDecrease by , then increase by .\n\nAfter each operation, all the values must be non-negative. Can you make all the elements equal after any number of operations?给定一个长度为 的数组 。在一次操作中,你可以从包含两端的索引范围为 到 中选取一个索引 ,并执行以下操作之一:\n\n将 减 1,然后将 加 1。\n将 减 1,然后将 加 1。\n\n在每次操作之后,所有的值都必须是非负的。经过任意次数的操作后,你能否使所有元素都相等呢?\n样例\n原文译文INPUT\nFirst line of input consists of one integer — the number of test cases.\nFirst line of each test case consists of one integer .\nSecond line of each test case consists of integers .\nIt is guaranteed that the sum of of all test cases doesn’t exceed .\nOUTPUT\nFor each test case, print \"YES\" without quotation marks if it is possible to make all the elements equal after any number of operations; otherwise, print \"NO\" without quotation marks.\nYou can print answers in any register: \"yes\", \"YeS\", \"nO\" — will also be considered correct.输入\n第一行输入包括一个整数 - 测试用例数。\n每个测试用例的第一行由一个整数 组成。\n每个测试用例的第二行由 个整数 组成。\n保证所有测试用例的 之和不超过 。\n输出\n对于每个测试用例,如果经过任意次数的运算后可以使所有元素相等,则打印 “YES”,不加引号;否则,打印 “NO”,不加引号。\n您可以在任何寄存器中打印答案: “yes”、“YeS”、“nO” - 也会被认为是正确的。\n示例\n833 2 131 1 341 2 5 441 6 6 156 2 1 4 241 4 2 153 1 2 1 332 4 2\nYESNOYESNOYESNONONO\nC. Uninteresting Number\n\ntime limit per test: 2 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文You are given a number with a length of no more than .\nYou can perform the following operation any number of times: choose one of its digits, square it, and replace the original digit with the result. The result must be a digit (that is, if you choose the digit , then the value of must be less than ).\nIs it possible to obtain a number that is divisible by through these operations?给定一个长度不超过 的数字 。\n你可以任意多次执行以下操作:选择它的其中一位数字,将其平方,然后用所得结果替换原来的数字。结果必须是一位数字(也就是说,如果你选择数字 ,那么 的值必须小于 10)。\n通过这些操作,是否有可能得到一个能被 9 整除的数字呢?\n样例\n原文译文INPUT\nThe first line contains an integer — the number of test cases.\nThe only line of each test case contains the number , without leading zeros. The length of the number does not exceed .\nIt is guaranteed that the sum of the lengths of the numbers across all test cases does not exceed .\nOUTPUT\nFor each test case, output \"YES\" if it is possible to obtain a number divisible by using the described operations, and \"NO\" otherwise.\nYou can output each letter in any case (lowercase or uppercase). For example, the strings \"yEs\", \"yes\", \"Yes\", and \"YES\" will be accepted as a positive answer.输入\n第一行包含一个整数 –测试用例数。\n每个测试用例的唯一一行包含数字 ,不含前面的零。数字长度不超过 。\n保证所有测试用例的数字长度之和不超过 。\n输出\n对于每个测试用例,如果可以通过所述操作得到一个能被 整除的数,则输出“yes”,否则输出`“no”。\n您可以以任何大小写(小写或大写)输出每个字母。例如,字符串 “yEs”、“yes”、“Yes” 和 “YES”将被视为肯定答案。\n示例\n9123322333333333333999754727789127731234567890233352254522632\nNOYESYESNONOYESNOYESYES\nD. Digital string maximization\n\ntime limit per test: 2 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文You are given a string , consisting of digits from to . In one operation, you can pick any digit in this string, except for or the leftmost digit, decrease it by , and then swap it with the digit left to the picked.\nFor example, in one operation from the string , you can get or .\nFind the lexicographically maximum string you can obtain after any number of operations.给定一个字符串 ,它由 0 到 9 的数字组成。在一次操作中,你可以选取这个字符串中除了 0 或者最左边的数字之外的任意一个数字,将其减 1,然后将它与所选数字左边的那个数字进行交换。\n例如,对字符串 进行一次操作后,你可以得到 或者 。\n求出经过任意次数的操作后,你所能得到的按字典序最大的字符串。\n样例\n原文译文INPUT\nThe first line of the input consists of an integer — the number of test cases.\nEach test case consists of a single line consisting of a digital string , where denotes the length of . The string does not contain leading zeroes.\nIt is guaranteed that the sum of of all test cases doesn’t exceed .\nOUTPUT\nFor each test case, print the answer on a separate line.输入\n输入的第一行是一个整数 - 测试用例的数量。\n每个测试用例由一行数字字符串 组成,其中 表示 的长度。字符串不包含前导零。\n保证所有测试用例的 之和不超过 。\n输出\n对于每个测试用例,每一行输出一个单独的答案。\n示例\n6191709115555147698765432105891917899\n816710333115543198765432107875567711\n示例解释\n原文译文In the first example, the following sequence of operations is suitable: 19 → 81.\nIn the second example, the following sequence of operations is suitable: 1709 → 1780 → 6180 → 6710.\nIn the fourth example, the following sequence of operations is suitable: 51476 → 53176 → 53616 → 53651 → 55351 → 55431.在第一个例子中,以下操作顺序是合适的: 19 → 81.\n在第二个例子中,以下运算顺序是合适的: 1709 → 1780 → 6180 → 6710.\n在第四个例子中,适合采用以下运算顺序: 51476 → 53176 → 53616 → 53651 → 55351 → 55431.\nE. Three Strings\n\ntime limit per test: 2.5 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文You are given three strings: , , and , consisting of lowercase Latin letters. The string was obtained in the following way:\n\nAt each step, either string or string was randomly chosen, and the first character of the chosen string was removed from it and appended to the end of string , until one of the strings ran out. After that, the remaining characters of the non-empty string were added to the end of .\nThen, a certain number of characters in string were randomly changed.\n\nFor example, from the strings a=abra and b=cada, without character replacements, the strings caabdraa, abracada, acadabra could be obtained.\nFind the minimum number of characters that could have been changed in string .给定三个字符串:、 和 ,它们均由小写拉丁字母组成。字符串 是通过以下方式得到的:\n\n在每一步中,随机选择字符串 或者字符串 ,将所选字符串的第一个字符从该字符串中移除,并添加到字符串 的末尾,直到其中一个字符串中的字符被取完为止。之后,将非空字符串中剩余的字符添加到 的末尾。\n然后,字符串 中的若干字符被随机更改了。\n\n例如,对于字符串 abra 和 cada,在不进行字符替换的情况下,可能会得到诸如 caabdraa 、abracada、acadabra 这样的字符串。\n求出字符串 中可能被更改的最少字符数量。\n样例\n原文译文INPUT\nThe first line of the input contains a single integer — the number of test cases.\nThe first line of each test case contains one string of lowercase Latin letters — the first string, where denotes the length of string .\nThe second line of each test case contains one string of lowercase Latin letters — the second string, where denotes the length of string .\nThe third line of each test case contains one string of lowercase Latin letters — the third string.\nIt is guaranteed that the sum of across all test cases does not exceed . Also, the sum of across all test cases does not exceed .\nOUTPUT\nFor each test case, output a single integer — the minimum number of characters that could have been changed in string .输入\n输入的第一行包含一个整数 - 测试用例数。\n每个测试用例的第一行包含一个小写拉丁字母字符串 - 第一个字符串,其中 表示字符串 的长度。\n每个测试用例的第二行包含一个小写拉丁字母字符串 - 第二字符串,其中 表示字符串 的长度。\n每个测试用例的第三行包含一个小写拉丁字母字符串 - 第三字符串。\n保证所有测试用例中 的总和不超过 。同时,所有测试用例中的 之和不超过 。\n输出\n对于每个测试用例,输出一个整数: 字符串 中可能被更改的最少字符数。\n示例\n7abcbabcdacbdabbaaabbxxxyyyxyxyxyabcddecfcodeshorsecodeforceseggannieegaegaeg\n1020323\nF. Maximum modulo equality\n\ntime limit per test: 5 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文You are given an array of length and queries , .\nFor each query, find the maximum possible , such that all elements are equal modulo . In other words, , where — is the remainder of division by . In particular, when can be infinite, print .给定一个长度为 的数组以及 个查询,每个查询包含 和 两个参数。\n对于每个查询,找出最大可能的 ,使得所有元素 、、、对取模的结果都相等。换句话说,,其中 表示 除以 的余数。特别地,当 可以为无穷大时,输出 。\n样例\n原文译文INPUT\nThe first line contains a single integer — the number of test cases.\nThe first line of each test case contains two integers , — the length of the array and the number of queries.\nThe second line of each test case contains integers — the elements of the array.\nIn the following lines of each test case, two integers , are provided — the range of the query.\nIt is guaranteed that the sum of across all test cases does not exceed , and the sum of does not exceed .\nOUTPUT\nFor each query, output the maximum value described in the statement.输入\n第一行包含一个整数 —— 测试用例数。\n每个测试用例的第一行包含两个整数 , —— 数组长度和查询次数。\n每个测试用例的第二行包含 整数 —— 数组的元素。\n在每个测试用例的下面 行中,提供了两个整数 、 ——查询范围()。\n保证所有测试用例中的 之和不超过 ,而 之和不超过 。\n输出\n对于每个查询,输出语句中描述的最大值 。\n示例\n35 55 14 2 6 34 51 42 43 51 11 171 13 21 7 82 31 2\n3 1 4 1 0 0 1 6 \n示例解释\n原文译文In the first query of the first sample, . It can be shown that for greater , the required condition will not be fulfilled.\nIn the third query of the first sample, . It can be shown that for greater , the required condition will not be fulfilled.在第一个示例的第一个查询中, 。可以证明,对于更大的 ,将满足所需的条件。\n在第一个示例的第三个查询中, 。可以证明,对于更大的 ,将满足所需的条件。\nG. Tree Destruction\n\ntime limit per test: 2 seconds\nmemory limit per test: 256 megabytes\n\n 题解\n题目\n原文译文Given a tree∗ with vertices. You can choose two vertices and once and remove all vertices on the path from to , including the vertices themselves. If you choose , only one vertex will be removed.\nYour task is to find the maximum number of connected components† that can be formed after removing the path from the tree.\n\n∗ A tree is a connected graph without cycles.\n† A connected component is a set of vertices such that there is a path along the edges from any vertex to any other vertex in the set (and it is not possible to reach vertices not belonging to this set)给定一棵有 个顶点的树∗。你可以一次性选择两个顶点 和 ,并移除从到路径上的所有顶点(包括这两个顶点本身)。如果选择 ,则只会移除一个顶点。\n你的任务是找出从这棵树中移除该路径后,所能形成的连通分量†的最大数量。\n\n∗ 树是一种无环的连通图。\n† 连通分量是一组顶点的集合,在这个集合中,从任意一个顶点沿着边都能到达集合内的任意其他顶点(并且无法到达不属于这个集合的顶点)。\n样例\n原文译文INPUT\nThe first line of the input contains one integer — the number of test cases.\nThe first line of each test case contains one integer — the size of the tree.\nThe next n−1 lines contain two integers u and — the vertices connected by an edge. It is guaranteed that the edges form a tree.\nIt is guaranteed that the sum of across all test cases does not exceed .\nOUTPUT\nFor each test case, output one integer — the maximum number of connected components that can be achieved using the described operation.输入\n输入的第一行包含一个整数 : 测试用例的数量。\n每个测试用例的第一行包含一个整数 : 树的大小。\n接下来的 行包含两个整数 和 (: 由一条边连接的顶点。保证边构成一棵树。\n保证所有测试用例的 之和不超过 。\n输出\n对于每个测试用例,输出一个整数: 使用所述操作可实现的最大连接部件数。\n示例\n621 251 22 33 43 541 22 33 452 13 14 15 462 13 14 15 36 362 13 24 25 36 4\n132343\n","categories":["刷题TODO"],"tags":["C_and_Cpp","刷题","Codeforces"]},{"title":"[答疑解惑] 关于如何在 C++ 中获取一行输入字符串的方法","url":"/2024/12/%E7%AD%94%E7%96%91%E8%A7%A3%E6%83%91-%E5%85%B3%E4%BA%8E%E5%A6%82%E4%BD%95%E5%9C%A8-C-%E4%B8%AD%E8%8E%B7%E5%8F%96%E4%B8%80%E8%A1%8C%E8%BE%93%E5%85%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%96%B9%E6%B3%95/","content":"简述\n在 C++ 中,std:cin 是标准输入流,主要用于等待并获取用户输入的内容,但获取用户输入一行的字符串内容,就不能直接用 cin 来获取。\n示例代码:输出用户输入的字符串\n假如用户输入了一行内容中包含空格或者制表符 Tab 等空白字符的字符串,空白字符及后面的所有部分会被忽略,导致只能输出空白字符前的字符串。\n#include <iostream>using namespace std;int main() { char line[64]; cin >> line; cout << line << endl; return 0;}// 输入样例:// Hello world!// 输出样例:// Hello\n解决方法\n1、利用 string 中的 getline() 方法\n可以将需要获取的变量类型从 char 改为 string 类型,并使用 getline() 方法以获取行内的内容。\n使用方法:getline()\n\n\n其函数定义于 <string> 头文件中,其函数原型如下:(只提其中一种使用方法)\nistream& getline( istream& is, string& str );\n\n\n其中的参数含义如下:\n\nis:输入流对象。可以是 cin、fstream、istream 类型的指针等。\nstr:用于存储读取的字符串。\n\n\n\n因此,根据此方法,可以这么写:\n#include <iostream>#include <string>using namespace std;int main() { string line; getline(cin, line); cout << line << endl; return 0;}// 输入样例:// Hello world!// 输出样例:// Hello world!\n附加:getline() 与 gets()\n2、利用 cin.getline() 方式\ncin.getline(char_type* __s, streamsize __n)\n对应的参数如下:\n\n__s:选定一个字符串对象;\n__n:限制的字符个数,其区间范围为 [0, n);\n\n针对 C 语言风格,如果要将用户输入的内容赋值给 char 类型的字符串数组,可以这么写:\n#include <iostream>using namespace std;int main() { char line[64]; cin.getline(line, sizeof(line)); cout << line << endl; return 0;}// 输入样例:// Hello world!// 输出样例:// Hello world!\n参考链接\n\nc++ - std::cin input with spaces? - Stack Overflow\nGetline in C++ – cin getline() Function Example\n\n","categories":["答疑解惑"],"tags":["C_and_Cpp","新手向","答疑解惑"]},{"title":"[软件安利] Windows 软件推荐,使电脑更容易使用","url":"/2024/08/%E8%BD%AF%E4%BB%B6%E5%AE%89%E5%88%A9-%E6%8E%A8%E8%8D%90%E5%87%A0%E6%AC%BE%E5%80%BC%E5%BE%97%E7%94%A8%E7%9A%84%E7%94%B5%E8%84%91%E8%BD%AF%E4%BB%B6/","content":"写在最前\n\n💡 提示:\n本文章所提到的软件均为博主曾经使用过的软件,部分软件可能为收费版本,请自行通过官方渠道购买。\n\n\n现如今,大多数拥有电脑的人都正在使用 Windows 系统。下面,博主将推荐以下几款个人认为值得安利的电脑软件。\n如果以下提到的软件你都曾经使用过或者不感兴趣,那么请去阅读上期的软件安利。\n 软件安利:安利几款在 Microsoft Store 上的软件 \n1、Everything (文件搜索工具)\n\n这是一款非常强大的文件搜索工具,它不仅可以快速搜索具体的文件,还能搜索文件中的关键字。它支持多种文件格式,包括图片、音频、视频、压缩包等。\n下载地址:https://www.voidtools.com/\n2、Bandizip (压缩工具)\n\nBandizip 是一款非常好用的压缩工具,它支持多种压缩格式,包括 ZIP、RAR、7z、BZIP2、TAR 等压缩格式。对比 Windows 自带的压缩工具,Bandizip 的功能更加强大,而且界面简洁。\n下载地址:https://www.bandisoft.com/bandizip/\n3、Free Download Manager (下载管理器)\n\n如果你曾经使用过迅雷、IDM 等下载管理器,那么建议去试试 Free Download Manager。它是一款开源免费的下载管理器,功能强大,界面简洁。\n下载地址:https://www.freedownloadmanager.org/\n4、Motrix (下载加速器)\n\n同样地,如果你对 Free Download Manager 存在不满,那么可以试试 Motrix。它是一款开源免费的下载加速器,功能强大,界面简洁。同时还支持安装浏览器扩展,安装之后,仅需点击对应的下载链接并使用 Motrix 下载,就可以自动识别并下载。\n下载地址:https://motrix.app/download\n5、图吧工具箱(硬件检测工具合集)\n\n图吧工具箱,是开源、免费、绿色、纯净的硬件检测工具合集,专为所有计算机硬件极客、DIY爱好者、各路大神及小白制作。集成大量常见硬件检测、评分工具,一键下载、方便使用。\n下载地址:https://www.tbtool.cn/\n6、uTools(新一代效率工具平台)\n\n一款非常强大的效率工具软件,它不仅支持搜索本机中的应用、使用不同的搜索引擎搜索关键词,还支持通过下载各种所需插件,实现各种功能。\n下载地址:https://u.tools/download/\n7、ToDesk(远程控制软件)\n\nToDesk 是一款远程控制软件,它可以让你通过网络远程控制你的电脑,可以实现各种控制功能,包括键盘鼠标、屏幕、音频、摄像头、文件传输等。\n下载地址:https://www.todesk.com/download/\n8、bitDock (极简工具栏)\n\nbitDock 是一款极简工具栏,它不仅可以通过鼠标拖拽的方式自定义添加你最常用的应用程序或文件夹,还拥有天气预报、搜索、截图、取色、日历时钟、天气等超过20款桌面插件,更容易美化自己的桌面。\n下载地址:https://bitdock.com/download/\n9、StartIsBack (经典开始菜单与任务栏)\n\nStartIsBack 是一款专为win8、win10、win11 用户设计的实用优化工具。startisback主要用来优化用户电脑开始菜单,使用户能快速找到自己最熟悉的按钮,并可以在各种电脑模式下自由切换,大大提高 Windows 用户事务处理效率。\n下载地址:https://startisback.com/\n10、Geek Uninstaller (软件卸载工具)\n\ngeek 即“极客”的意思,这是一款无比强大的卸载软件,它界面简单不复杂,体积小巧,无需安装,点开即可使用。geek就和它的名字一样,卸载任何软件都干脆利落,不管你是大佬还是流氓,统统一键卸载搞定,并且卸载完还会自动删除相应的注册表文件,不会拖泥带水。\n下载地址:https://geekuninstaller.com/download\n11、CleanMyPC (系统清理工具)\n\nCleanMyPC, 字面理解就是 “清理我的PC”,这是一款系统清理工具,界面简单,功能小巧,可以清理系统垃圾、卸载应用程序、修改启动项、清理浏览器隐私等。遇到删除不了的文件或文件夹,可以使用碎纸机来强制删除。\n下载地址:https://macpaw.com/zh/download/cleanmypc\n12、微软电脑管家(系统优化工具)\n\n微软电脑管家,是微软推出的一款系统优化工具,它可以帮助用户优化电脑配置,包括硬件、系统、驱动、网络、安全、应用等方面。它可以帮助用户解决硬件兼容性问题、优化系统配置、提升系统性能、保护系统安全、管理应用、优化电脑使用体验等。\n下载地址:https://pcmanager.microsoft.com/zh-cn\n","categories":["软件安利"],"tags":["Windows","新手向","软件安利"]},{"title":"[记事篇] 关于本人使用 Switch 之前与之后的那些事","url":"/2024/10/Switch-notes/","content":"写在最前\n2024 年了,任天堂曾发布的 Switch 已有 7 年之久(从 2017 年 1 月 至 2024 年),本人于上个月的 15 号从某鱼上购买了 Switch Lite。是的,这是一台属于自己的掌上游戏机。而且,这是任天堂早已停产的限定外观主机(宝可梦剑盾)。见下图:\n\n\n是的,这正是我第一次在某鱼平台上淘到的游戏掌机。\n不过,后来打算想直接卖了。(具体原因见后文)\n关于我第一次游玩 Switch 的经历和感受\n这得从几个月说起了:大概是今年的 5-6 月份左右,我姐在某宝上购买了一台 Switch OLED 主机。当时,这是本人第一次看到且曾体验过主机游戏的一次经历。那时,我姐为了想玩上动森(动物森友会),而特意买了这台全新的主机。\n(PS: 可惜不是动森主题外观的主机🤭(bushi))\n在此期间,这台 Switch OLED 主机购买并下载了如下游戏:\n\n动物森友会\n塞尔达传说:王国之泪\n舞力全开2023\n马里奥派对:超级巨星\n塞尔达传说:织梦岛\nNintendo Sports\n胡闹厨房 2\n………………\n\n从上面提到的这些游戏中,我觉得最能让我喜欢的游戏是【塞尔达传说:织梦岛】。这对于从未接触且没玩过塞尔达系列的我来说,这款游戏是非常好入门且容易上手的游戏。里面的每一关的谜题以及机关(包括收集心之容器与神秘贝壳)都是我个人觉得非常好玩的部分。通关这个游戏之后,就会有较大的成就感~~(虽然中间曾在网上查过各种攻略(bushi))~~。\n其次,这款【动物森友会】则是我姐最梦寐以求的一款游戏了。不仅可以各种装扮自己的家和整个岛屿,而且还能跟各种 NPC 互动。虽然开始玩的那一段时间里,本人曾欠了好几万的房租用来偿还贷款😂😂😂。后面就不再多说了,毕竟玩过这游戏的人,都觉得这游戏灰常地不戳👍👍。\n当然,不仅如此,其它的任天堂第一方大作,也是值得仔细去游玩和探索的(*_*)。\n关于开学之后买了 Switch 的那些事\n随后,临近 9 月,赶上开学的那一个月里,我曾再也没有碰过这台 Switch OLED,前往一所充满陌生感的大学。在这个月里,很长一段时间感觉到自己无所事事,甚至觉得很无聊。在我百般无聊之际,我又一次想起了当初在家玩 Switch 时的经历。于是,我就有了买 Switch 的想法。\n我的第一想法是在某宝上去搜 switch,大部分的 switch 对我来说,价格都是较为昂贵的😂。就连 switch lite 这款全新的掌机都要上千来块。\n在此之后,我就前往了充满二手气息且价格低廉的平台——某鱼🐟。在那里,虽然大多数看到的机型都不是全新的机型,但其便宜的价格成功地吸引了我。于是,在我大海捞针般地搜索自个儿能负担得起的那堆结果中,选择了 Switch Lite。是的,就是那款掌上主机。虽然它的屏幕尺寸比之前体验过的 OLED 主机要小了几倍,但它能成为我每次上课摸鱼🐟必备的把玩工具(bushi)🤭 打发时间的娱乐🎮工具,再配合上我的外接蓝牙手柄,整个游戏体验瞬间就变得丝滑了起来🤭。而且,我也不再仅仅局限于玩💻端游或📱手游来打发空余时间。\n我为何又打算卖出 Switch ?\n关于这一点,本人主要是看上了今年早已发售的 Switch Lite 新外观——海拉鲁限定主机(见下图),于是就有了想把主机卖掉的想法了(而且是急于想从某鱼上卖掉 Switch 的那种想法)。\n\n对于我看上它的原因,主要还是集中于几点:\n首先,它的外观呈金色,机身背面的图案为海拉鲁的图案;\n其次,买今年刚发售的新主机可以兑换一年的 Switch 会员😂😂😂😂;\n其三,这款限定主机对喜欢塞尔达系列的本人而言,是一种收藏品~~(此处别喷,这纯碎是我的个人爱好)~~。\n\n这对我来说,这款海拉鲁外观的新主机 Switch Lite 是我梦寐以求的一个主机。于是,正好快赶上双十一之际,买下了这款主机(按现在来看,机子还没送到)。\n写在最后\n虽然但是,Switch 是我目前为止,最适合用来打发时间的游戏机。但将来本人是否还会继续像现在那样常玩 Switch 里的游戏,在我的心中,还是一个未知数。\n\n关于后事内容,未完待续…(可能会继续更,也可能不会再更)\n","categories":["记录日常"],"tags":["Switch","任天堂","Nintendo","游戏机"]}]