107. CUDA&cnDNN
Pytorch各个版本
103. tmux
tmux 操作
进入tmux翻屏模式
- 先按
Ctrl+q,松开,然后再按[ - 实现上下翻页: 进入翻屏模式后,
PgUp,PgDn实现上下翻页 - 退出:
q
ps:
ctrl + b + [,很多人会以为是同时按三个键,但是这样是不行的。
简单介绍下tmux的其他功能
常用快捷键
Tmux快捷指令
关于快捷指令,首先要认识到的是:tmux的所有指令,都包含同一个前缀,默认为Ctrl+q,输入完前缀过后,控制台激活,命令按键才能生效。前面tmux会话相关的操作中,我们共用到了两个快捷键Ctrl+q + d、Ctrl+q + s,但这仅仅是冰山一角,欲窥tmux庞大的快捷键体系,请看下表。
Note: prefix:
Ctrl+q
系统指令
| 前缀 | 指令 | 描述 |
|---|---|---|
Ctrl+q |
? |
显示快捷键帮助文档 |
Ctrl+q |
d |
断开当前会话 |
Ctrl+q |
D |
选择要断开的会话 |
Ctrl+q |
Ctrl+z |
挂起当前会话 |
Ctrl+q |
r |
强制重载当前会话 |
Ctrl+q |
s |
显示会话列表用于选择并切换 |
Ctrl+q |
: |
进入命令行模式,此时可直接输入ls等命令 |
Ctrl+q |
[ |
进入复制模式,按q退出 |
Ctrl+q |
] |
粘贴复制模式中复制的文本 |
Ctrl+q |
~ |
列出提示信息缓存 |
Ctrl+q |
$ |
重名名当前会话 |
窗口(window)指令
| 前缀 | 指令 | 描述 |
|---|---|---|
Ctrl+q |
c |
新建窗口 |
Ctrl+q |
& |
关闭当前窗口(关闭前需输入y or n确认) |
Ctrl+q |
0~9 |
切换到指定窗口 |
Ctrl+q |
p |
切换到上一窗口 |
Ctrl+q |
n |
切换到下一窗口 |
Ctrl+q |
w |
打开窗口列表,用于且切换窗口 |
Ctrl+q |
, |
重命名当前窗口 |
Ctrl+q |
. |
修改当前窗口编号(适用于窗口重新排序) |
Ctrl+q |
f |
快速定位到窗口(输入关键字匹配窗口名称) |
表三:面板(pane)指令
| 前缀 | 指令 | 描述 |
|---|---|---|
Ctrl+q |
" |
当前面板上下一分为二,下侧新建面板 |
Ctrl+q |
% |
当前面板左右一分为二,右侧新建面板 |
Ctrl+q |
x |
关闭当前面板(关闭前需输入y or n确认) |
Ctrl+q |
z |
最大化当前面板,再重复一次按键后恢复正常(v1.8版本新增) |
Ctrl+q |
! |
将当前面板移动到新的窗口打开(原窗口中存在两个及以上面板有效) |
Ctrl+q |
; |
切换到最后一次使用的面板 |
Ctrl+q |
q |
显示面板编号,在编号消失前输入对应的数字可切换到相应的面板 |
Ctrl+q |
{ |
向前置换当前面板 |
Ctrl+q |
} |
向后置换当前面板 |
Ctrl+q |
Ctrl+o |
顺时针旋转当前窗口中的所有面板 |
Ctrl+q |
方向键 |
移动光标切换面板 |
Ctrl+q |
o |
选择下一面板 |
Ctrl+q |
空格键 |
在自带的面板布局中循环切换 |
Ctrl+q |
Alt+方向键 |
以5个单元格为单位调整当前面板边缘 |
Ctrl+q |
Ctrl+方向键 |
以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖) |
Ctrl+q |
t |
显示时钟 |
tmux的丝滑分屏功能正是得益于以上系统、窗口、面板的快捷指令,只要你愿意,你就可以解除任意的快捷指令,然后绑上你喜欢的指令,当然这就涉及到它的可配置性了。
补充
| 快捷键 | 功能 |
|---|---|
Ctrl+q % |
竖直拆分屏幕(两个 Shell 分别位于左右) |
Ctrl+q " |
水平拆分屏幕(两个 Shell 分别位于上下) |
Ctrl+q O |
切换到另一个 Shell |
Ctrl+q ? |
查看帮助 |
Ctrl+q d |
断开 tmux 并让其在后台运行(可以使用 tmux attach 重新进入) |
Ctrl+q <arrow key> |
光标切换到其他窗格 <arrow key> 是指向要切换到的窗格的方向键比如切换到下方窗格,就按方向键↓ |
Ctrl+q ; |
光标切换到上一个窗格 |
Ctrl+q o |
光标切换到下一个窗格 |
Ctrl+q { |
当前窗格与上一个窗格交换位置 |
Ctrl+q } |
当前窗格与下一个窗格交换位置 |
Ctrl+q Ctrl+o |
所有窗格向前移动一个位置,第一个窗格变成最后一个窗格 |
Ctrl+q Alt+o |
所有窗格向后移动一个位置,最后一个窗格变成第一个窗格 |
Ctrl+q x |
关闭当前窗格 |
Ctrl+q ! |
将当前窗格拆分为一个独立窗口 |
Ctrl+q z |
当前窗格全屏显示,再使用一次会变回原来大小 |
Ctrl+q Ctrl+<arrow key> |
按箭头方向调整窗格大小 |
Ctrl+q q |
显示窗格编号 |
| prefix | Ctrl+q | 激活控制台;此时以下按键生效 |
|---|---|---|
| 系统操作 | ? |
列出所有快捷键;按q返回 |
d |
脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 | |
D |
选择要脱离的会话;在同时开启了多个会话时使用 | |
Ctrl+z |
挂起当前会话 | |
r |
强制重绘未脱离的会话 | |
s |
选择并切换会话;在同时开启了多个会话时使用 | |
: |
进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 | |
[ |
进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 | |
~ |
列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 | |
| 窗口操作 | c |
创建新窗口 |
& |
关闭当前窗口 | |
数字键 |
切换至指定窗口 | |
p |
切换至上一窗口 | |
n |
切换至下一窗口 | |
l |
在前后两个窗口间互相切换 | |
w |
通过窗口列表切换窗口 | |
, |
重命名当前窗口;这样便于识别 | |
. |
修改当前窗口编号;相当于窗口重新排序 | |
f |
在所有窗口中查找指定文本 | |
| 面板操作 | ” |
将当前面板平分为上下两块 |
% |
将当前面板平分为左右两块 | |
x |
关闭当前面板 | |
! |
将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 | |
Ctrl+方向键 |
以1个单元格为单位移动边缘以调整当前面板大小 | |
Alt+方向键 |
以5个单元格为单位移动边缘以调整当前面板大小 | |
Space |
在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled | |
q |
显示面板编号 | |
o |
在当前窗口中选择下一面板 | |
方向键 |
移动光标以选择面板 | |
{ |
向前置换当前面板 | |
} |
向后置换当前面板 | |
Alt+o |
逆时针旋转当前窗口的面板 | |
Ctrl+o |
顺时针旋转当前窗口的面板 |
创建tmux
1 | tmux new -s <session-name> |
列出已有的tmux列表
命令
1
2
3$ tmux ls
## or
$ tmux list-sessionCtrl+q s:列出所有会话。
进入已创建的tmux
使用会话编号
1
2
3$ tmux attach -t <session-number>
## or
$ tmux a -t <session-number>使用会话名称
1
2
3$ tmux attach -t <session-name>
## or
$ tmux a -t <session-name>
切换会话
1 | ## 使用会话编号 |
重命名会话
$ tmux rename-session命令用于重命名会话。1
tmux rename-session -t <session-number> <new-name>
上面命令将
<session-number>号会话重命名。Ctrl+q $
临时退出tmux
Ctrl+q d$ tmux detach
杀死tmux
tmux外:
$ tmux kill-session -t <session-name>tmux内:
Ctrl-d<Prefix(ctrl+q)> + :kill-session
删除所有tmux
1 | tmux kill-server |
或
1 | tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill |
vi-mode
| vi | emacs | 功能 |
|---|---|---|
| ^ | M-m | 反缩进 |
| Escape | C-g | 清除选定内容 |
| Enter | M-w | 复制选定内容 |
| j | Down | 光标下移 |
| h | Left | 光标左移 |
| l | Right | 光标右移 |
| L | 光标移到尾行 | |
| M | M-r | 光标移到中间行 |
| H | M-R | 光标移到首行 |
| k | Up | 光标上移 |
| d | C-u | 删除整行 |
| D | C-k | 删除到行末 |
| $ | C-e | 移到行尾 |
| : | g | 前往指定行 |
| C-d | M-Down | 向下滚动半屏 |
| C-u | M-Up | 向上滚动半屏 |
| C-f | Page down | 下一页 |
| w | M-f | 下一个词 |
| p | C-y | 粘贴 |
| C-b | Page up | 上一页 |
| b | M-b | 上一个词 |
| q | Escape | 退出 |
| C-Down or J | C-Down | 向下翻 |
| C-Up or K | C-Up | 向下翻 |
| n | n | 继续搜索 |
| ? | C-r | 向前搜索 |
| / | C-s | 向后搜索 |
| 0 | C-a | 移到行首 |
| Space | C-Space | 开始选中 |
| C-t | 字符调序 |
tmux 本地安装
下载
下载 libevent
1
curl -JLO https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
下载 ncurses
1
curl -JLO https://invisible-island.net/datafiles/release/ncurses.tar.gz
下载 tmux 最新版本
1
curl -JLO https://github.com/tmux/tmux/releases/latest/download/tmux-3.6a.tar.gz
编译
libevent
1
2
3
4
5
6tar zxvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable
mkdir -p $HOME/.local/libevent
./configure --prefix=$HOME/.local/libevent --enable-shared
make -j $(nproc)
make -j $(nproc) installncurses
1
2
3
4
5
6tar zxvf ncurses.tar.gz
cd ncurses-*
mkdir -p $HOME/.local/ncurses/lib/pkgconfig
./configure --prefix=$HOME/.local/ncurses --with-shared --with-termlib --enable-pc-files --with-pkg-config-libdir=$HOME/.local/ncurses/lib/pkgconfig
make -j $(nproc)
make -j $(nproc) installtmux
1
2
3
4
5
6
7tar zxvf tmux-3.6a.tar.gz
cd tmux-3.6a
mkdir -p $HOME/.local/tmux
# PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig ./configure --prefix=$HOME/.local/tmux
PKG_CONFIG_PATH=$HOME/.local/libevent/lib/pkgconfig:$HOME/.local/ncurses/lib/pkgconfig ./configure --prefix=$HOME/.local/tmux
make -j $(nproc)
make -j $(nproc) installThe newly built tmux can be found in
~/.local/tmux/bin/tmux.When tmux is installed locally on Linux, the runtime linker may need to be told where to find the libraries using the LD_LIBRARY_PATH environment variable, for example:
1
LD_LIBRARY_PATH="$HOME/.local/lib" $HOME/.local/bin/tmux -V
And to view the manual page, MANPATH must be set:
1
MANPATH="$HOME/.local/share/man" man tmux
Most users will want to configure these in a shell profile, for example in .profile for ksh or .bash_profile for bash:
1
2
3export PATH="$HOME/.local/tmux/bin:$PATH"
export LD_LIBRARY_PATH="$HOME/.local/libevent/lib:$LD_LIBRARY_PATH"
export MANPATH="$HOME/.local/tmux/share/man:$MANPATH"
QAs
configure: error: “libevent not found”
1
2
3
4PKG_CONFIG_PATH="$HOME/.local/libevent/lib/pkgconfig:$HOME/.local/ncurses/lib/pkgconfig" \
CPPFLAGS="-I$HOME/.local/libevent/include -I$HOME/.local/ncurses/include" \
LDFLAGS="-L$HOME/.local/libevent/lib -L$HOME/.local/ncurses/lib" \
./configure --prefix=$HOME/.local/tmuxconfigure: error: “yacc not found”
(RECOMMEND) 方法1: 安装 bison
1
sudo apt install bison
(convenience) 方法2: 最暴力但有效的方式(跳过 yacc 检查)
1
2YACC="cat" \
./configure --prefix=$HOME/.local/tmuxtmux 的 configure 脚本允许跳过 yacc, 只需要告诉它假装存在.
cat 是一个安全的占位符, tmux 源码不会真的用到 yacc 生成内容 (tmux 并不使用 yacc, 只是 autoconf 习惯性检查).方法3: 本地编译 byacc (未尝试)
configure: error: “curses not found”
在 include 下创建软链接
1
2cd ~/.local/ncurses/include
ln -s ncurses/* .tmux: error while loading shared libraries: libevent_core-2.1.so.7: cannot open shared object file: No such file or directory
使用你本地的 libevent
1
export LD_LIBRARY_PATH="$HOME/.local/libevent/lib:$LD_LIBRARY_PATH"
-zsh: /root/.local/lib/libtinfo.so.6: no version information available (required by -zsh)
其实不是 zsh 崩溃, 而是 版本信息不匹配的警告.
它说明 zsh 需要的 libtinfo 库里缺少符号版本信息(version information), 通常是因为你在~/.local/lib下手动安装或者拷贝了 libtinfo.so.6, 而系统自带的 libtinfo 版本和它不一致.(RECOMMEND) 方法1: 删除或重命名本地 libtinfo.so.6
如果系统已经有正确版本:
1
mv ~/.local/lib/libtinfo.so.6 ~/.local/lib/libtinfo.so.6.bak
方法2: 调整 LD_LIBRARY_PATH,让系统库优先
1
export LD_LIBRARY_PATH="/usr/lib:/usr/lib64:$LD_LIBRARY_PATH:$HOME/.local/lib"
refs
102. Pytorch环境配置
Pytorch各个版本
101. Win10 Git配置
更改Git的样式
- 更改主题透明度和光标
![]()
- 更改字体
![]()
- 更改中文
![]()
- 更改主题透明度和光标
美化
基本配置
在用户根目录下新建一个名为 .minttyrc 的文件,写入以下内容,然后重启 git bash,就能看到美化后的样子了。
1
2
3$ cd ~
$ touch .minttyrc
$ vi .minttyrc复制以下代码到
.minttyrc:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33FontHeight=11
Font=Consolas
Transparency=low
FontSmoothing=full
Locale=zh_CN
Charset=GBK
Columns=88
Rows=26
OpaqueWhenFocused=no
Scrollbar=none
Language=zh_CN
ForegroundColour=131,148,150
BackgroundColour=0,43,54
CursorColour=220,130,71
BoldBlack=128,128,128
Red=255,64,40
BoldRed=255,128,64
Green=64,200,64
BoldGreen=64,255,64
Yellow=190,190,0
BoldYellow=255,255,64
Blue=0,128,255
BoldBlue=128,160,255
Magenta=211,54,130
BoldMagenta=255,128,255
Cyan=64,190,190
BoldCyan=128,255,255
White=200,200,200
BoldWhite=255,255,255
CursorType=block
CursorBlinks=no更新
git-prompt.d仅仅是换了一个主题还不够,还需要更改终端提示符,更改 git 安装目录下 etc 目录里面的一个文件即可,这个文件也可以通过绝对路径访问到。
进入
1
$ cd /etc/profile.d/git-prompt.sh
复制代码到
git-prompt.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40if test -f /etc/profile.d/git-sdk.sh
then
TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
TITLEPREFIX=$MSYSTEM
fi
if test -f ~/.config/git/git-prompt.sh
then
. ~/.config/git/git-prompt.sh
else
PS1='\[\033]0;Bash In $PWD\007\]' # 窗口标题
PS1="$PS1"'\n' # 换行
PS1="$PS1"'\[\033[32m\]' # 绿色
PS1="$PS1"'\u ' # 用户名
PS1="$PS1"'\[\033[0m\]' # 灰色
PS1="$PS1"'at ' # 自定义内容
PS1="$PS1"'\[\033[35m\]' # 粉红色
PS1="$PS1"'\t ' # 时间
PS1="$PS1"'\[\033[33m\]' # 黄色
PS1="$PS1"'\W ' # 当前目录
if test -z "$WINELOADERNOEXEC"
then
GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
if test -f "$COMPLETION_PATH/git-prompt.sh"
then
. "$COMPLETION_PATH/git-completion.bash"
. "$COMPLETION_PATH/git-prompt.sh"
PS1="$PS1"'\[\033[36m\]' # change color to cyan
PS1="$PS1"'`__git_ps1`' # bash function
fi
fi
PS1="$PS1"'\[\033[0m\]' # 灰色
PS1="$PS1"'$ ' # 命令提示符
fi
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
100. Clion中使用头文件和源文件坑
Clion 中使用头文件定义类,源文件实现
include什么
导入头文件(
.h)和源文件(.cpp)
Note: 只导入 源文件(.cpp) 也可以
CMakeLists.txt
- 手动添加
1 | cmake_minimum_required(VERSION 3.15) |
- 自动添加
1 | # 遍历项目根目录下所有的 .cpp 文件 |
代码
ElemType.h
1 | #ifndef HCPP_ELEMTYPE_H |
ElemType.cpp
1 | #include "ElemType.h" |
main.cpp
1 | #include <iostream> |
运算符重载:详见 运算符重载
99. C++运算符重载
重载运算符规则
重载意义
函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作;
运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能;C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。
比如,我们定义两个string类对象a,b后我们之所以可以使用+运算,是因为string类重载了+运算符。
语法
1
2
3
4<返回类型说明符> operator <运算符符号>(<参数表>)
{
<函数体>
}哪些运算符可以被重载,哪些运算符不能被重载
可以被重载的运算符:
算术运算符:
+ , - , * , / , % , ++ , --
位操作运算符:& , | , ~ , ^ , << , >>
逻辑运算符:! , && , ||
比较运算符:< , > , >= , <= , == , !=
赋值运算符:= , += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>=
其他运算符:[] , () , -> , ,(逗号运算符) , new , delete , new[] , delete[] , ->*不允许的运算符重载:
. , .* , :: , ?: ,siezof
重载运算符函数在类内部
Notes:
运算符重载函数是类的成员函数时>- 注意
要是内部的,必须得是
<=1个参数,不需要加friend(友元函数) - 语法(在类内声明,在类外实现时的代码)
1
2
3
4
5<返回类型说明符> <类名>::operator <运算符符号>(<参数表>)
{
<函数体>
}
- 注意
运算符重载函数不是类的成员函数时(或者说当运算符函数是非成员函数时)- 函数在类中声明的时候需要在前面加上
friend(友元函数),不管参数是不是类的对象 - 函数的参数与该运算符作用的运算对象数量一样多
- 函数在类中声明的时候需要在前面加上
为什么用
const和&:const:- 我们不希望在这个函数中对用来进行赋值的“原版”做任何修改。函数加上const后缀的作用是表明函数本身不会修改类成员变量。
- 加上const,对于const的和非const的实参,函数就能接受;如果不加,就只能接受非const的实参。
&(引用):这样可以避免在函数调用时对实参的一次拷贝,提高了效率。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54/**
* Author: Dgimo
* Date: 2020/3/30
* TODO: 类运算符重载
* Describe:
*/
#include <iostream>
using namespace std;
typedef struct {
int first;
int second;
} TestStuct;
/*
* 类运算符重载
*/
class TestClass {
private:
int first;
int second;
public:
TestClass(int, int);
TestClass();
void show(string);
TestClass operator+(const TestClass &);
TestClass operator+(const TestStuct &);
friend TestClass operator+(const TestClass &, const TestClass &); // 如果不是内部的,得加friend 声明不是内部的,如果不是两个会怎样?见下面!!!
friend TestClass operator+(const TestStuct &, const TestStuct &); // 只要在类内部定义的运算符重载,就需要加上friend
TestStuct ts1, ts2;
ts1.first = 1, ts1.second = 2;
ts2.first = 10, ts2.second = 20;
tc1.show("tc1");
tc2.show("tc2");
add_tc = tc1 + tc2; // TestClass + TestClass
add_tc.show("add_tc");
add_tc1 = add_tc + ts1; // TestClass + TestStruct
add_tc1.show("add_tc1");
add_ts = ts1 + ts2; // TestStrcut + TestStrcut
add_ts.show("add_ts");
return 0;
}
重载运算符在函数外部
暂时未发现
Bug代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46/**
* Author: Dgimo
* Date: 2020/3/31
* TODO: 结构体运算符重载
* Describe:
*/
#include <iostream>
using namespace std;
/*
* 结构体运算符重载
*/
typedef struct {
int first;
int second;
} TestStuct;
TestStuct operator+(TestStuct ts1, TestStuct ts2)
{
TestStuct res;
res.first = ts1.first + ts2.first;
res.second = ts1.second + ts2.second;
return res;
}
bool show(TestStuct ts)
{
cout << "first: " << ts.first << ", second: " << ts.second << endl;
}
int main()
{
TestStuct ts1;
ts1.first = 1;
ts1.second = 2;
TestStuct ts2;
ts2.first = 2;
ts2.second = 3;
TestStuct res_t = ts1 + ts2;
show(res_t);
return 0;
}
<< 和 >> 只能定义友元函数
原因
定义为成员函数,那么就隐含this指针了对吧,你要知道重载其实也是一种函数,那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元,那么就可以把cin,cout作为一个参数传进你重载的操作符函数里面去了
语法:
在类中:
1
2
3
4
5
6friend ostream &operator <<(ostream &out, const ElemType &e);
2. 在外面:
```cpp
ostream &oprator <<(ostream &out, const ElemType &e);
代码
头文件(
.h)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef ELEMTYPE_H
#define ELEMTYPE_H
#include <iostream>
using namespace std;
class ElemType
{
public:
int data;
ElemType();
ElemType(int);
friend ostream &operator <<(ostream &out, const ElemType &e); // Success
protected:
private:
};
#endif // ELEMTYPE_H源文件(
.cpp)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "ElemType.h"
ElemType::ElemType()
{
//ctor
this->data = 0;
}
ElemType::ElemType(int data)
{
this->data = data;
}
ostream& operator <<(ostream &out, const ElemType &e)
{
out << e.data;
return out;
}
98. JetBrains家族之Clion配置、汉化及快捷键
JetBrains 家族其他软件的手法相似,按需使用即可,此路不通,找度娘
配置
下载 setting_3.zip, setting_4.zip, setting_5.zip, setting_6.zip, setting_7.zip, setting_8.zip
数字越大,版本越新
打开
Clion选择:
File-Import setting选择这个
setting文件即可(一般全部导入,看个人)
取消开始界面打开默认项目配置
- 打开:
File-Settings-Appearance & Behavior-System Settings - 取消勾选
Reopen last project on startup
- 打开:
更改模板注释:
打开:
File-Settings-Editor-File and Code Templates-Includes下面有一个面板,在面板输入
1
2
3
4
5
6
7
8
9
10#if ($HEADER_COMMENTS)
/**
* author ${USER_NAME}
* date ${DATE}
* description
#if ($ORGANIZATION_NAME && $ORGANIZATION_NAME != "")
* copyright (c) $YEAR ${ORGANIZATION_NAME}#if (!$ORGANIZATION_NAME.endsWith(".")).#end All rights reserved.
#end
*/
#end
Clion 多个
main函数存在在
CMakeLists.txt中加入1
2
3
4
5
6
7# 遍历项目根目录下所有的 .cpp 文件
file (GLOB files *.cpp)
foreach (file ${files})
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" exe ${file})
add_executable (${exe} ${file})
message (\ \ \ \ --\ src/${exe}.cpp\ will\ be\ compiled\ to\ bin/${exe})
endforeach ()为了方便可以自己定义快捷键:(个人用的是:
Alt-Shift+R)File-Settings-Keymap- 搜索
Reload cmake project即可
参考:
1
2
3
4
5
6
7
8
9
10
11
12cmake_minimum_required(VERSION 3.15)
project(DataStruct)
set(CMAKE_CXX_STANDARD 11)
# 遍历项目根目录下所有的 .cpp 文件
file (GLOB files *.cpp)
foreach (file ${files})
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" exe ${file})
add_executable (${exe} ${file})
message (\ \ \ \ --\ src/${exe}.cpp\ will\ be\ compiled\ to\ bin/${exe})
endforeach ()
CMakeLists自动加载- 打开
Files-settings-Build, Execution, Deployment-CMake - 选择
Automatically reload CMake project on editing
- 打开
侧边栏无焦点自动隐藏
- 选择侧边栏的
扳手 - 选择
View Mode-Dock Unpinned
- 选择侧边栏的
汉化步骤
- 下载 resources-cn.jar
- 将
resources-cn.jar复制到安装目录下lib文件夹下 - 结束
快捷键
快捷键 含义 备注 Ctrl + Shift + U 大小写切换 Ctrl + Shift + Space 补全单词 new后直接键入构造器、构造器内提供构造信息 Ctrl + Alt + L 格式化代码 Ctrl + Shift + Backspace 回到最后编辑的地方 Ctrl + N 查找类 Ctrl + F12 快速查看类成员 Ctrl + P 提示参数信息 Ctrl + Alt + B 查看接口、抽象类的实现类 Ctrl + F7 找到某个类、变量、函数等在文中被使用到的的地方 连续点击Shift 全局搜索 Shift + F6 重新命名变量 连续按两次Esc 搜索框就会消失 Alt + insert 添加自动代码生成信息 新建新的文件 Ctrl + j 插入完整的代码块 默认只有 for,iter,itit,也可以自己在Setting—>Live Templates里添加自定义的代码块Ctrl + Alt + -/+ 展开折叠当前函数、类 Ctrl + Shift + -/+ 展开折叠所有函数、类 Ctrl + Alt + T 就可以选择给这些代码包裹上 if,for等(surround with)自动换行
idea设置自动换行其实很简单,只需要进行一步操作就可以了。
看下图:我们只需要在相应的位置加上文件的类型就可以了,比如我们写的类都是.java文件,那么我们只需要加上 *.java就可以实现自动换行了。
JetBrains学生认证:自行百度JetBrainssync配置同步:Files-Sync ……Clion输出乱码- 在设置里将编码都设置为UTF8,并点击OK保存设置;
![]()
- 按住
Ctrl+Shift+Alt+/选中Registry...,然后取消掉run.processes.with.pty后面的√
- 在设置里将编码都设置为UTF8,并点击OK保存设置;
97. 双系统安装之后必做的事
双系统时间不一致
首先我们把硬件时间(BIOS时间)将默认的UTC改为CST,然后重启,使得两个系统的时间保持一致
- 上述代码中的1改为0即可将硬件时间修改为默认的UTC时间:
sudo timedatectl set-local-rtc 1 - 重启系统使改动生效:
sudo reboot
- 上述代码中的1改为0即可将硬件时间修改为默认的UTC时间:
接着我们更新一下系统时间
- 这里的操作是安装ntpdate工具:
sudo apt-get install ntpdate - 使用ntpdate工具从time.windows.com上面同步时间:
sudo ntpdate time.windows.com
- 这里的操作是安装ntpdate工具:
最后我们将时间更新到硬件上,以保证重启后改动不会被还原
这里的代码意思是使用hwclock命令将本地时间localtime从sysclock同步到hwclock:
sudo hwclock --localtime --systohc
Ubuntu 科学上网
注意:必须要安装 Python2、Python3,才可以使用
deb安装:sudo dpkg -i <deb文件>
Windows Defender关闭
cmd运行regedit- 定位到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService - 在右侧找到
DWORD(32位)值,名为Start - 修改数值数据为4(十六进制)
- 重启文件资源管理器,或注销再登录/重启系统
注意:
- 如果你安装第三方杀软或安全软件,Windows Defender会自动被关闭。
- start的默认值为
3
Ubuntu 安装字体
Ubuntu 安装zsh
Ubuntu不能访问Windows下的磁盘
- 控制面板—系统和安全—电源选项—选择电源按钮的功能
- 首先点击上部分的
更改当前不可用的设置 - 然后去掉
启用快速启动(推荐)前面的勾即可 - 这个时候再选择Windows关机后,就是完全关机了
不能读取exfat格式的u盘问题
- Ubuntu默认不支持exfat格式的U盘,只需要运行如下的命令:
sudo apt-get install exfat-utils - 安装完成后重启即可
不能挂载移动硬盘问题
- 在终端输入如下命令,查看分区挂载情况:
sudo fdisk -l - 输入下面的命令:
sudo ntfsfix /dev/sdb1注意:/dev/sdb1 为移动硬盘的设备名,找到硬盘size对应的设备名
Ubuntu 查找文件
- 命令:
locate <文件名> - 网址:在ubuntu中搜索文件或文件夹的方法
Ubuntu 更新慢
步骤:
- 选择
软件和更新 - 打开
软件和更新窗口 - 我们点击
Ubuntu软件选项卡下的其他站点 - 这里有好多国外的源及我们国内的源,我也试了不少,我目前使用的是aliyun的源,感觉速度还不错,其他国内的速度也都不可以,大家也可以试试。不要怕麻烦,就是要折腾
- 我们选择
mirrors.aliyun.com,然后点击 选择服务器 - 同样需要我们密码认证
- 修改成功
- 等待系统更新完毕,源更新成功后,会自动关闭窗口。此时,我们安装软件或更新软件(系统)就是用的我们选择的源啦。
- 选择
95. Python __init__.py 使用
Python工程的组织结构
包、模块、类、函数、变量
- 最顶级的组织结构:包(文件夹)
- 第二个层级:模块(文件)
- 第三个层级:类
- 第四个层级:函数、变量(不属于组织结构,是类本身的特性)
其中:
- 包:整个文件夹
- 模块:一个
py文件
Python包与模块的名字
区分不同包的同名模块:包名.模块名
形成的模块的路径叫做命名空间
一个包下面可以有子包,模块可以和包平级
普通文件夹想要变成包必须要有init.py文件__init__.py 本身也是一个模块,可以不写内容只是标注包
特殊地,__init__.py 模块的名字就是包名
__init__.py用途
__init__.py 该文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。
import导入模块
对于重复的定义需要从其他模块里引用。
利用import 模块名导入
1 | # PackageTest1.Test1 |
import导入的总是模块,需要用模块名.变量名的方法引用
可以用as简化书写
1 | # PackageTest1.Test1 |
同级目录可以直接导入模块
优点是可以一眼看出属于哪个模块
from import 导入变量
1 | # PackageTest1.Test2 |
可以使用
from 包 import 模块导入模块
导入时使用模块.变量
导入大量变量时用*:
1 | # PackageTest1.Test1 |
控制 *
1 | # PackageTest1.Test1 |
注意
- 使用
*导入时,导入的是在所在包中__init__.py存在的变量 - 文件目录:
initTest
PackageTest1
__init__.pyTest1.pyTest2.pyTest.py其中:
PackageTest1.__init__.py1
2
3
4
5import pandas as pd
import numpy as np
print("You have imported mypackage")
# __all__ = ['pd', 'np'] # 这里不需要 __all__ 控制PackageTest1.Test1.py1
2
3
4
5
6
7from __init__ import * # 可以使用所在包中的 __init__ 导入大量的包
class Test1():
def __init__(self):
a = np.array([i for i in range(10)])
print(a)Test.py1
2
3
4from PackageTest1 import * # 因为 PackageTest1.__init__ 中只有 pd, np 这两个变量,因此使用 * 只导入进来了 pd, np
from PackageTest1.Test1 import Test1 # 因为在 PackageTest1.__init__ 中没有 Test1 这个模块,更没有 Test1 这个类,因此想要使用必须自行导入
Test1()
在 PackageTest1.__init__ 中导入 Test1 模块、类
- 导入
Test1模块
在PackageTest1.__init__.py中添加import PackageTest1.Test1就可以在Test.py中使用Test1.Test1()创建Test1类了。 - 导入
Test1类- 在
PackageTest1.__init__.py中添加from PackageTest1.Test1 import Test1就可以在Test.py中使用Test1()创建Test1类了。 - 在
PackageTest1.__init__.py中添加import PackageTest1.Test1是错误的,会报错:ModuleNotFoundError: No module named 'PackageTest1.Test1.Test1'; 'PackageTest1.Test1' is not a package
- 在
__init__.py 用法
- 当包被导入时,
__init__.py会首先被自动执行,类似于构造函数 __init__.py的应用场景1
2
3
4
5
6
7
8
9
10
11# PackageTest1.__init__.py
__all__ = ['a','b'] #初始化*
import sys #批量导入库
import datetime
import io
#Test.py
import Test1
print(Test1.sys.path)此时引用因为不是用的
*, 所以必须使用包.类.成员函数进行调用。
多层目录各层互相调用
pacgage1
__init__.pytest1.pytest2.py
test3.py
test3 调用 package1,而 test1 调用 test2,此时,在 package1.__init__.py 中添加路径,如下:
1 | import sys |
包与模块的几个常见错误
- 包和模块是不会被重复导入的,只会执行一次(入口文件的概念)
- 避免循环导入,不要形成闭环
- 导入模块的时候会执行模块里所有的代码
- 如果使用
if __name__ == '__main__'则不会执行该代码块中的代码



