git、gdb、vim…

git

git checkout --track origin/sql4_delete_feature
如果出错,需要先抓取git fetch origin
git push

gdb

file ./a.out
run

1
2
3
gdb ./kilo
(gdb) set args t.txt
(gdb) run

怎么让gdb调试程序 比如输出在另外一个窗口?

  1. 在一个新的终端tty查看终端名字
  2. gdb终端中(gdb) set inferior-tty /dev/pts/3

LINUX

tcpdump

1
2
3
4
tcpdump tcp port 5000 and host 210.27.48.1 
tcpdump port 5000 || port 3000


lsof -i:端口

kill -9 pid

查看进程下线程高占用:
top -Hp pid

网络

/resolv.conf

cmake .

cmake … 参数为路径,到哪里执行cmake

project_source_dir : cmake执行所在目录

CMAKE_CURRENT_SOURCE_DIR ; 同样,为cmake执行路径

cmake自定义宏, 使得一些代码是否进入。调试开关

vim

:%!xxd

  • :% 表示对整个文件进行操作。
  • ! 表示执行外部命令。
  • xxd 是一个十六进制编辑工具,它可以将文件的内容转换为十六进制格式并显示出来。

https://github.com/WilsonQ1n/VIM_C_IDE

vundle插件管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
set nocompatible
filetype off

" 设置Vundle管理vim插件 set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 安装的vim插件写在下面

Plugin 'VundleVim/Vundle.vim' " let Vundle manage Vundle, required
Plugin 'scrooloose/nerdtree'

" 安装的vim插件写在上面
call vundle#end() " required
filetype plugin on " required

配置

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
set nocompatible
filetype on

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()


" 这里根据自己需要的插件来设置,以下是我的配置 "
"
" YouCompleteMe:语句补全插件
set runtimepath+=~/.vim/bundle/YouCompleteMe
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口"
let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM基于标签引擎
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释与字符串中的内容也用于补全
let g:syntastic_ignore_files=[".*\.py$"]
let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全
let g:ycm_complete_in_comments = 1
let g:ycm_confirm_extra_conf = 0 " 关闭加载.ycm_extra_conf.py提示
let g:ycm_key_list_select_completion = ['<c-n>', '<Down>'] " 映射按键,没有这个会拦截掉tab, 导致其他插件的tab不能用.
let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
let g:ycm_complete_in_comments = 1 " 在注释输入中也能补全
let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释和字符串中的文字也会被收入补全
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" " 回车即选中当前项
nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
"



" github 仓库中的插件 "
Plugin 'VundleVim/Vundle.vim'


Plugin 'vim-airline/vim-airline'
"vim-airline配置:优化vim界面"
"let g:airline#extensions#tabline#enabled = 1
" airline设置
" 显示颜色
set t_Co=256
set laststatus=2
" 使用powerline打过补丁的字体
let g:airline_powerline_fonts = 1
" 开启tabline
let g:airline#extensions#tabline#enabled = 1
" tabline中当前buffer两端的分隔字符
let g:airline#extensions#tabline#left_sep = ' '
" tabline中未激活buffer两端的分隔字符
let g:airline#extensions#tabline#left_alt_sep = ' '
" tabline中buffer显示编号
let g:airline#extensions#tabline#buffer_nr_show = 1
" 映射切换buffer的键位
nnoremap [b :bp<CR>
nnoremap ]b :bn<CR>
" 映射<leader>num到num buffer
map <leader>1 :b 1<CR>
map <leader>2 :b 2<CR>
map <leader>3 :b 3<CR>
map <leader>4 :b 4<CR>
map <leader>5 :b 5<CR>
map <leader>6 :b 6<CR>
map <leader>7 :b 7<CR>
map <leader>8 :b 8<CR>
map <leader>9 :b 9<CR>



" vim-scripts 中的插件 "
Plugin 'taglist.vim'
"ctags 配置:F3快捷键显示程序中的各种tags,包括变量和函数等。
map <F3> :TlistToggle<CR>
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_WinWidt=25

Plugin 'The-NERD-tree'
"NERDTree 配置:F2快捷键显示当前目录树
map <F2> :NERDTreeToggle<CR>
let NERDTreeWinSize=25

Plugin 'indentLine.vim'
Plugin 'delimitMate.vim'

" 非 github 仓库的插件"
" Plugin 'git://git.wincent.com/command-t.git'
" 本地仓库的插件 "

call vundle#end()

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1, "##########################################################################")
call append(line("."), "# File Name: ".expand("%"))
call append(line(".")+1, "# Author: amoscykl")
call append(line(".")+2, "# mail: amoscykl980629@163.com")
call append(line(".")+3, "# Created Time: ".strftime("%c"))
call append(line(".")+4, "#########################################################################")
call append(line(".")+5, "#!/bin/zsh")
call append(line(".")+6, "PATH=/home/edison/bin:/home/edison/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/work/tools/gcc-3.4.5-glibc-2.3.6/bin")
call append(line(".")+7, "export PATH")
call append(line(".")+8, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " > File Name: ".expand("%"))
call append(line(".")+1, " > Author: amoscykl")
call append(line(".")+2, " > Mail: amoscykl@163.com ")
call append(line(".")+3, " > Created Time: ".strftime("%c"))
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
if &filetype == 'cpp'
call append(line(".")+6, "#include<iostream>")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
endif
if &filetype == 'c'
call append(line(".")+6, "#include<stdio.h>")
call append(line(".")+7, "")
endif
" if &filetype == 'java'
" call append(line(".")+6,"public class ".expand("%"))
" call append(line(".")+7,"")
" endif
"新建文件后,自动定位到文件末尾
autocmd BufNewFile * normal G
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全
set completeopt=preview,menu
"允许插件
filetype plugin on
"共享剪贴板
set clipboard=unnamed
"从不备份
set nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
set ruler " 打开状态栏标尺
set cursorline " 突出显示当前行
set magic " 设置魔术
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent
set foldlevel=3
set foldenable " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile * setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

" Vundle
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'

" - Vim 插件
Plugin 'molokai'
Plugin 'altercation/vim-colors-solarized'
Plugin 'ciaranm/inkpot'
Plugin 'zenorocha/dracula-theme', {'rtp': 'vim/'}
Plugin 'bling/vim-airline'
Plugin 'Yggdroot/indentLine'
Plugin 'jiangmiao/auto-pairs'

Plugin 'wting/rust.vim'
Plugin 'hynek/vim-python-pep8-indent'
Plugin 'hallison/vim-markdown'
Bundle 'cespare/vim-toml'
Bundle 'pangloss/vim-javascript'
Plugin 'kchmck/vim-coffee-script'

Plugin 'scrooloose/nerdtree'
Plugin 'majutsushi/tagbar'
Plugin 'SirVer/ultisnips'
Plugin 'honza/vim-snippets'
Plugin 'scrooloose/syntastic'
Plugin 'Valloric/YouCompleteMe'

call vundle#end()
filetype plugin indent on


" 通用

set autochdir
set number
syntax on
set cursorline
set list
set listchars=tab:>-,trail:-
set wrapscan
set hlsearch
set incsearch
set ignorecase
set history=1024
set nobackup
set noswapfile
set autoread
set whichwrap =b,s,<,>,[,],h,l
set nowrap
set completeopt-=preview


" 缩进
set smartindent
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
set smarttab



" 插件
let mapleader = ","

set laststatus=2
map <Leader>f :NERDTreeToggle<CR>
map <Leader>s :w<CR>

let g:UltiSnipsExpandTrigger="<c-\\>"
" - Tagbar
let g:tagbar_ctags_bin = '/usr/local/Cellar/ctags/5.8_1/bin/ctags'
nmap <Leader>t :TagbarToggle<CR>
let g:tagbar_type_rust = {
\ 'ctagstype' : 'rust',
\ 'kinds' : [
\'T:types,type definitions',
\'f:functions,function definitions',
\'g:enum,enumeration names',
\'s:structure names',
\'m:modules,module names',
\'c:consts,static constants',
\'t:traits,traits',
\'i:impls,trait implementations',
\]
\}

office

image.png
image.png
PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
kms.luody.info
image.png

chrome

F6:移动光标到地址栏。

OB

https://publish.obsidian.md/help-zh/插件/白板

知识图谱

我们平时会接收各种各样的信息,这些信息经常零零散散记录在纸上,或 Word 文件中,或我们的脑海中。但这些信息不能称为知识。只有将信息连接起来,建立起关系,才能称作知识

不管有意还是无意,我们的大脑一直在做着连接的工作。这就是为什么你在做一件事情的时候经常会联想到和这件事有关的其它事情。比如你去买小白菜的时候,可能忽然想到家里的盐没有了。为什么会这样呢?因为你的大脑能发现它们之间的联系。这个联系可能是一口锅,也可能是它们摆放的位置。但我们的大脑不是什么时候都管用,有时大脑会忽略掉一些联系,而且当信息过多时,大脑在建立它们的关系时会不那么在行,甚至混乱。毕竟不是所有人都是福尔摩斯或爱因斯坦。

用 Obsidian 构建知识图谱

我们用 Obsidian 记笔记,这单个的笔记就是信息。当笔记多了之后,我们建立起这些笔记的关系就形成了知识。在 Obsidian 中,建立笔记之间的关系有两种方法。

  • 一是引用法。在一篇笔记中用双中括号引用另一篇笔记,如在A笔记中用[[B]]引用B笔记,就建立了A和B之间的关系。
  • 二是标签法。如果多个笔记都包含某个标签,意味着它们之间存在共同点,这也是一种关系。如A笔记中包含##美食标签,B笔记中也包含##美食标签,说明A笔记和B笔记有交集。

白板

md

#md https://markdown.com.cn/basic-syntax/

latex

openssl

WSL

没网解决

1
2
3
4
wsl --shutdown
# disconnect VPN
wsl
# connect VPN again

网络模式

https://learn.microsoft.com/en-us/windows/wsl/networking
https://learn.microsoft.com/zh-cn/windows/wsl/networking

NAT

  1. Accessing Linux networking apps from Windows (localhost)
    If you are building a networking app (for example an app running on a NodeJS or SQL server) in your Linux distribution, you can access it from a Windows app (like your Edge or Chrome internet browser) using localhost (just like you normally would).

docker

设置WSL为宿主机

https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers

通过应用制作镜像部署到容器上

  1. 应用中编写Dockerfile
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
# 使用官方的 Node.js 镜像作为基础镜像

FROM node:20


# 设置工作目录 绝对应用目录

WORKDIR /home/dong/JSCODE/MiaoCoin



# 复制 package.json 和 package-lock.json

COPY package*.json ./



# 安装应用依赖

RUN npm install



# 复制应用代码

COPY . .



# 启动应用

CMD ["node", "./src/app.js"]

构建镜像,运行容器

方法一:

⭐最佳实践:由于nat模式,windows可以localhost访问wsl,由于默认桥接模式,可以将应用端口映射到宿主机端口进行访问。

  1. 构建镜像

    docker build -t my-blockchain-node .

  • 镜像名字
  • . 表示使用当前目录下的Dockerfile
  1. 运行容器,映射宿主机端口 # 主机端口:容器端口
    docker run -p 8000:8000 -p 30303:30303 my-blockchain-node

  2. 创建多容器(进程): 根据同一个镜像

1
2
3
4
5
6
7
8
9
# 启动第一个节点
docker run -d --name node1 -p 4001:4000 -p 3001:3000 my-blockchain-node

# 启动第二个节点(映射到不同的端口)
docker run -d --name node2 -p 4002:4000 -p 3002:3000 my-blockchain-node

# 启动第三个节点(映射到不同的端口)
docker run -d --name node3 -p 4003:4000 -p 3003:3000 my-blockchain-node

方法二:

通过 docker-compose构建运行
image.png

  1. 创建docker-compose.yml
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
version: '3.8'
services:
  node1:
    build: .
    ports:
      - "3000:3000"  # 主机端口:容器端口
      - "4000:4000"  # 主机端口:容器端口
    environment:
      - HTTP_PORT=3000
      - P2P_PORT=4000
    networks:
      - my-network
  node2:
    build: .
    ports:
      - "3001:3000"  # 主机端口:容器端口
      - "4001:4000"  # 主机端口:容器端口
    environment:
      - HTTP_PORT=3000
      - P2P_PORT=4000
    networks:
      - my-network
  node3:
    build: .
    ports:
      - "3002:3000"  # 主机端口:容器端口
      - "4002:4000"  # 主机端口:容器端口
    environment:
      - HTTP_PORT=3000
      - P2P_PORT=4000
    networks:
      - my-network
networks:
  my-network:
    driver: bridge
  1. 运行所有服务
    docker-compose up -d --build: 修改dockerfile后自动构建运行

docker-compose build:构建镜像

docker-compose up -d :并运行容器
生成的几个镜像名字 :my-app_node1:latest

网络模式

[WSL上docker限制]https://docs.docker.com/desktop/networking/#there-is-no-docker0-bridge-on-the-host

docker network ls

bridge模式:服务间可以通过。node1:3000这种方式通信
[缺少docker0网卡情况]https://blog.51cto.com/u_16213327/11185674

host模式:完全独立。

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
version: '3.8'



services:

  node1:

    build: . //从当前目录下dockerfile构建

    network_mode: host

    environment:

      - HTTP_PORT=3000

      - P2P_PORT=4000



  node2:

    build: .

    network_mode: host

    environment:

      - HTTP_PORT=3001

      - P2P_PORT=4001



  node3:

    build: .

    network_mode: host

    environment:

      - HTTP_PORT=3002

      - P2P_PORT=4002

docker监控

docker-compose ps
image.png

进入每个容器并检查服务是否在运行,端口是否监听:
vscode attach shell

1
2
3
4
docker exec -it 服务名 /bin/sh 
netstat -tuln | grep 3000 # 检查 HTTP 端口
netstat -tuln | grep 4000 # 检查 P2P 端口

docker network inspect bridge

注意

  1. wsl宿主机看不到docker0网卡:
    https://stackoverflow.com/questions/77164358/docker0-interface-missing-on-wsl2
    问题:宿主机没有docker0网卡,各容器ping通,且能ping到这网卡地址