Docsify 搭建记录
需要一个小型的在线文档系统,Docsify 可以满足需求,记录一下搭建记录,主要 Docsify 官方的中文文档。 本地搭建 前提:本地需要安装 nodejs 并完成相应配置。 新建 DocBase/ 文件夹,在其中本地安装 docsify-cli 1npm i docsify-cli -g 由于 docsify-cli 不是全局安装的,存在找不到 hexo 命令的问题,对于 Windows 可以通过临时添加路径到 PATH 解决,在 DocBase 目录下执行 1$env:Path += ";$((Get-Item -Path .\node_modules\.bin -Force).FullName)" 初始化项目 1docsify init ./docs 初始化过程会自动新建 ./docs 子文件夹,并生成如下文件: index.html:项目入口 README.md:内容会被渲染成项目主页 .nojekyll:防止 Github 忽视下划线开头文件 使用下面的命令可以在本地预览 123cd ./docsdocsify serve# or do...
Cpp 基础笔记整理
一些零散的不同主题的 Cpp 基础笔记,单独拆开显得内容太少,干脆整理到一起。 类型别名 typedef typedef是用于为类型定义别名的关键字,在C和C++中都可以使用。 最简单的用法是对基本类型起别名,例如 1typedef int Length; 下面的是MSVC的stdint.h中的部分源码,对基本数据类型起了意义更明确的别名 12345678typedef signed char int8_t;typedef short int16_t;typedef int int32_t;typedef long long int64_t;typedef unsigned char uint8_t;typedef unsigned short uint16_t;typedef unsigned int uint32_t;typedef unsigned long long uint64_t; 数组类型和指针类型可以通过typedef起别名达到简化语法和提升可读性...
Linux 学习笔记:控制台,终端,tty
整理一下关于下面这些概念的学习: 终端(terminal) 控制台(console) 电传打字机 tty(teletype) 这些概念在早期是有明确的定义的,但是随着计算机的发展,它们的物理实体逐渐消失,各种概念主要靠计算机软件模拟,它们之间的区别变得模糊难以理解,因此学习整理一下,以Linux系统为主。 TODO shell 控制台与终端 早期的计算机是一套巨大的机器,就像工厂的大型机器一样,如此的庞然大物必然需要一个专门的操作台, 用于陈列各种仪表盘、指示灯、按钮、电线,专业操作人员通过这个操作台控制计算机的启动、运行、停止,结果也会实时反馈到操作台,这个操作台就叫“控制台”(console)。 控制台是附着在机器上的设备,可以实现对计算机的完全操控,但是主要是用来管理计算机的。 对于多用户操作系统(特别是UNIX),控制台并不方便给用户提供计算服务。 因此自然产生了终端(terminal)的硬件概念:每个用户通过终端设备与主机远程连接(还不是现代意义上的基于互联网的远程连接),管理员给每个用户分配一个账户,用户“登录”到系统获得计算机使用权。在这个阶段,计算机通常只...
Cpp 并行计算学习笔记
基本概念 首先学习几组基本概念: 同步(Synchronous)/异步(Asynchronous) 并发(Concurrency)/并行(Parallelism) 进程(Process)/线程(Thread) 同步 / 异步 同步是指任务按照顺序依次执行,每个任务在前一个任务完成后开始执行。在同步模式中,任务之间需要等待其他任务完成才能继续执行。 异步是指任务可以独立于其他任务进行执行,它们的执行过程不会产生堵塞。在异步模式中,任务可以在后台执行,执行结果可能需要等待一段时间才能获得,但这不会影响其他任务的执行。 举个例子: 手洗衣服的流程是同步的:先将衣物放入盆中,再加入洗衣粉,然后开始洗衣,等到洗衣完成,最后取出衣物晾干或烘干,每一步的开始都依赖于前一步的完成,在过程中也干不了其他事。 使用洗衣机洗衣服是异步的:将衣物放入洗衣机并启动,洗衣机开始运作,此时人不需要等待在洗衣机旁,可以干其它任何事,等到洗衣机完成后会发出通知,然后取出衣物晾晒即可,当然也可以选择等在一边,不干其他事。 并发 / 并行 并发指的是多个任务在同一时间段内被同时推进,可能是同时执行不同的...
GCC 源码编译安装(离线,普通用户)
gcc 的非 root 用户离线编译安装比其他的软件的源码安装都要复杂:因为它有依赖,在服务器上无法通过联网下载,要提前下载依赖的压缩包,而且gcc的编译时间很长。 安装过程主要参考CentOS7 离线升级安装gcc到6.3.0 和Linux 非root安装GCC9.1.0 下载依赖 在官网或者镜像网站下载 gcc-11.4.0.tar.gz,传到服务器上解压为~/tmp/gcc-11.4.0 进入~/tmp/gcc-11.4.0子目录,需要解决下载依赖的问题。在可以联网的情况下,直接执行自带的下载依赖的脚本 ./contrib/download_prerequisites。如果服务器无法联网,则需要手动下载处理 查看上述脚本,找到四个必要的依赖 gmp,mpfr,mpc,isl 以及对应的具体版本,例如 gcc-11.4.0 需要的四个依赖版本及其下载地址如下(不同版本的gcc对应的依赖版本也不一样) 123456gmp='gmp-6.1.0.tar.bz2'mpfr='mpfr-3.1.6.tar.bz2'mpc='mpc-...
Cpp 面向对象——成员函数中的 this
整理一下关于C++类的成员函数所拥有的特殊的this指针的知识,并且学习C++23中的新内容:显式推导this。 隐式this 基础 this指针是C++面向对象编程中的重要机制,在自定义类型的非静态成员函数中,都存在这一个自动传递的this指针指向当前对象自身,例如 12345678910111213#include <iostream>struct Test { int data = 0; void call() { std::cout << "call: " << data << "\n"; }};int main() { Test test{1}; test.call(); return 0;} 对于编译器来说,这里的定义和调用过程等效于下面的形式(因为this是关键词,在代码中使用this_来代表) 1234567891011121314#include <iostre...
Cpp 未定义行为/小坑/冷知识
未定义行为 概述 C/C++存在很多的未定义行为,如果程序中使用了未定义行为,那么得到的结果是不可知的,编译器给出任何反馈都是符合语法标准的,因为未定义行为导致的BUG是难以察觉的。 未定义行为可能会导致编译报错,也可能导致运行出错等,还可能无事发生,具体结果可能与平台/编译器有关,不过在大部分情况下不同编译器会得到类似的结果。 未定义行为的存在是有客观原因的,一方面语法标准无法穷尽所有的可能情况;另一方面有些可能非法的行为(例如下标越界)在编译期难以直接检测,如果在运行期进行检测(例如检查下标越界),又会牺牲很多的运行效率。 如果我们在不经意间使用了未定义行为,那么即使是相同的代码,在C++的编译器不同等级的优化措施下,也可能得到完全不同的结果,例如: Debug模式正常,Release模式异常 例如产生随机的结果,通常的原因是使用没有正确初始化的变量,在Debug模式下被编译器初始化为0,但是Release模式下直接使用了内存中的随机值; 其它未定义行为,在Release模式下经过编译器优化中,产生不合理的结果。 Debug模式异常,Release模式正常 代码中的未...
编程语言中的整数和浮点数
整理一下编程语言中的整数和浮点数的相关内容,针对的情景是科学计算。 整数 整数模型 编程语言中的整数类型不同于数学意义上的整数,而只是它的一个有限子集,因为计算机为了计算效率,会使用固定的字节数来存储一个整数数据,例如 \(n\) 个字节,这意味这只有 \(2^{8n}\) 个不同状态,只能表示 \(2^{8n}\) 个整数。 将 \(n\) 个字节所对应的 \(8n\) 比特的值依次记作 \(a_i \in \{0,1\}\),这里 \(i=0,\dots,8n-1\),那么通常有两类方案: 第一种方案是无符号整数,表示的值 \(V\) 为 \[ V = 2^0 a_0 + 2^1 a_1 + \dots + 2^{8n-2} a_{8n-2} + 2^{8n-1} a_{8n-1} \] 表示的范围为 \[ [0,2^{8n}-1] \] 第二种方案是有符号整数,表示的值 \(V\) 为 \[ V = 2^0 a_0 + 2^1 a_1 + \dots + 2^{8n-2} a_{8n-2} - 2^{8n-1} a_{8n-1} \] 表示的范围为 \[ [-2^{8n-1...
Zotero 7 配置笔记
磨刀不误砍柴工,文献管理软件这把刀确实是值得打磨的,选择Zotero而非其它文献管理工具,主要是看重了它的免费和可配置性,适合重度使用。 最新版 Zotero 7 在 Zotero 6 的基础上,进行了升级,包括非常多的优化,例如最基础的UI看着更漂亮了,等我把它的各种插件和配置都鼓捣好了,就更有动力(但愿吧)打开来看文献了。 网上关于Zotero有很多分享教程,但是绝大部分都是入门级的配置笔记,参考价值并不大,本文最主要的参考是Zotero非官方中文社区。 基础 本地安装 直接从官网下载 Zotero 7,然后傻瓜式安装即可,需要注意的是两个位置: 首先是软件安装位置,可以使用自定义安装方式,挑一个合适的位置即可,例如D:\ProgramMain\Zotero7; 然后是本地数据存储位置,默认是~/Zotero。 数据存储位置比较占地方,我想将其迁移到别的位置,例如E:\<user>\Documents\Zotero7,首先需要在设置中更改 1编辑 -> 设置 -> 高级 -> 数据存储位置 将其更改为自定义的目标路径,然后根据提示进行操作:将...
Cpp lambda 表达式笔记
在另一篇关于可调用对象的笔记中已经对lambda表达式的语法本质和应用情景进行了整理, 这篇笔记主要是整理lambda表达式的语法细节,假定读者对lambda表达式已经有了基本的概念。 虽然早在C++11中就提出了lambda表达式,但是相关的语法细节始终在不断地发展和完善(C++实在是太复杂了!), 本文以C++20已经支持的语法为主,对于最新的C++23增加的语法不作讨论,例如Deducing This等内容。 基础 基本捕获 首先介绍两种隐式捕获符: [=]:全部按值捕获 [&]:全部按引用捕获 它们会自动地捕获在lambda表达式中所有实际被使用的局部变量,无需我们逐个列出被使用变量对应的名称。 这里存在一个问题:如果当前处于一个普通成员函数中,如何处理特殊的this/*this所代表的当前对象?见下文中的讨论。 在默认捕获符的基础上,我们可以进行一些微调,例如: [=, &a, &b]:表示除了后面明确提到的这些变量按引用捕获,其它情况下默认按值捕获 [&, a, b]:表示除了后面明确提到的这些变量按值捕获,其它情况下默认按引...
