Linux——在鸟哥那没学到的知识

目录

Linux——在鸟哥那没学到的知识

vim按键说明

一般命令模式

编辑模式(插入、替换)

命令行模式(保存退出)

vim额外功能

others

gdb

gdb调试方法

常用命令

查看类

中断类

消除类

控制类

git

基础

常用命令

实际操作

合并时的冲突处理

打补丁

本地有改变可以这样

强制覆盖自己本地的修改

后悔了的操作

撤销commit

撤销多个库上的commit

merge代码到master

fork分支rebase主分支

others

Markdown语法手册

软件安装

实用小命令

查看代码量

kill进程

后台运行

编译QA记录

llvm相关

SIMD SVE编译

汇编和代码对应

编译IR文件


Linux——在鸟哥那没学到的知识

  • vim按键说明

    • 一般命令模式

      • 光标移动
        • 0 or Home
          • 这一行的最前面
        • $ or End
          • 这一行的最后面
        • G
          • 文件最后一行
        • 1G or gg
          • 文件第一行
        • 30j
          • 向下移动30行
        • n<Enter>
          • 向下移动n行
      • 翻页
        • ctrl + f
          • 下翻页
        • ctrl + b
          • 上翻页
      • 查找
        • /word
          • 向下找
        • ?word
          • 向上找
        • n
        • N
        • 全词匹配
          • /\<int\>
      • 替换
        • :n1,n2s/word1/word2/g
        • :1,$s/word1/word2/g
        • :1,$s/word1/word2/gc
          • 替换之前确认
        • 实例
          • :%s/-S/-c/gc
          • :%s/\.s/\.o/gc
      • 删除
        • x X
          • x:删除后面的一个
            • 从这个开始往后删
          • X:删除前面的一个
        • dd
          • 删除(剪切)光标在的那一整行
        • ndd
          • 光标在的那行也在内
      • 复制
        • yy
          • 复制光标在的那一整行
        • nyy
          • 光标在的那行也在内
      • 粘贴
        • p P
          • p:在光标的下一行粘贴
          • P:在光标的上一行粘贴
            • 就是把原来的行往后挤
      • 撤销
        • u
      • 重复
        • ctrl + r
        • .
    • 编辑模式(插入、替换)

      • i I
        • 进入插入模式
        • i:目前光标所在处插入
        • I:在目前所在行的第一个非空格字符处开始插入
      • a A
        • 进入插入模式
        • a:目前光标所在的下一个字符处插入
        • A:目前光标所在行的最后一个字符开始插入
      • o O
        • 进入插入模式
          • 增加一行
        • o:目前光标所在的下一行插入一行
        • O:目前光标所在的上一行插入一行
      • r R
        • 进入替换模式
        • r:只替换光标所在的那一个字符一次
        • R:一直替换光标所在的文字,直到按下ESC
    • 命令行模式(保存退出)

      • :w
        • 数据写入硬盘
      • :q
        • 退出vi
      • :q!
        • 强制退出不保存
      • :wq
        • 保存并退出
      • :wq!
      • :w [filename]
        • 另存到一个新文件
          • 原来的还在
      • :r [filename]
        • 读入文件在光标所在行的后面
      • :! command
        • 暂时退出vim,先运行命令
        • :! ls /home
      • :n1,n2 w [filename]
        • n1到n2保存到filename
      • vim 环境修改
        • :set nu :设置行号
        • :set nonu :取消行号
    • vim额外功能

      • 可视块区
        • v
          • 字符选择
        • V
          • 行选择
        • ctrl + v
          • 矩形选择
        • d
          • 删除反白
        • y
          • 复制反白
        • p
          • 粘贴
      • 多文件编辑
        • 可以使用vim同时直接打开多个文件
        • :n
          • 编辑下一个文件
        • :N
          • 编辑上一个文件
        • :files
          • 列出目前这个vim开启的所有文件
      • 多窗口
        • :sp [filename]
          • 加filename则是多个文件,不加就是本文件
        • ctrl + w +上下箭头
          • 切换窗口
        • :q
          • 退出所在窗口
        • :close
      • 关键词补全
        • ctrl + x -> ctrl + n
          • 文件的内容作为关键字
        • ctrl + x -> ctrl + f
          • 当前目录的文件名作为关键字
        • ctrl + x -> ctrl + o
          • vim内置的关键词
        • 注:文件要使用正确的扩展名
    • others

      • 查找
        • 查找字符串个数
          • :%s/string//gn
        • 查找时区分大小写
          • 不忽略大小写
            • :set noic
          • 忽略大小写
            • :set ic (ignore case)
  • gdb

    • gdb调试方法

      • 启动程序并调试
        • gdb [program]
          • gdb --args [program]
      • 调试core文件
        • gdb [program] [core]
          • 实际上调试的是core
      • 调试已在运行的程序
        • gdb [program] [PID]
          • 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
      • 注:
        • 编译时,我们必须要把调试信息加到可执行文件中
          • 如gcc使用-g,gdb的功能才可以完整使用,不然,有些没法用。
          • 如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址
        • 编译使用-O0编译之后调试,不然可能会有移位。
    • 常用命令

      • 查看类
        • 查看源码(list)
          • list
            • 从第一行开始例出原码
          • list 5,10
            • 显示第5行到第10行的代码
          • list func
            • 显示func()函数周围的代码,显示范围和list参数有关
          • list test.c:5,10
            • 显示源文件test.c第5行到第10行的代码
        • 打印变量的值(print)
          • print i
            • 只打印一次
            • 显示此刻变量i的值
          • 可以打印值及地址
        • 设置观察点(watch)
          • 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序
          • watch <expr>
            • 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
            • watch i
              • 被设置观察点的变量发生修改时,打印显示
              • 设置完毕之后就会自动显示
            • i watch
              • 显示观察点
                • 就是显示观察点的信息,和上面的显示的不一样
          • info watchpoints
            • 列出当前所设置了的所有观察点。
          • rwatch <expr>
            • 当表达式(变量)expr被读时,停住程序。
          • awatch <expr>
            • 当表达式(变量)的值被读或被写时,停住程序。
        • 自动打印变量的值(dispaly)
          • display i
            • 自动打印i的值
            • 或者说叫追踪查看具体变量的值
          • undispaly
            • 取消追踪查看变量
            • 取消所有,取消一个不行(或者说,我还不会~~)
        • bt
          • 查看函数堆栈
          • f number
            • 查看具体的
        • 查看内存地址
          • examine 缩写x
            • x <d/f/u>  <addr>
        • info local
          • 查看所有局部变量
        • thread apply all bt
          • 查看所有线程堆栈
      • 中断类
        • 设置断点(break)
          • break 14
            • 在当前文件第14行设置断点
          • break test.c:14
            • 在test.c文件中第14行设置断点
          • break func
            • 在函数func()处设置断点
          • info break
            • 查看断点信息
            • info breakpoints
              • 查看当前设置的所有断点
          • break 7 if n==6
            • 条件断点
          • delete breakpoint num
            • 删除第num个断点
          • enable breakpoints
            • 启用断点
              • 指的是断点这个功能
          • disable breakpoints
            • 禁用断点
          • 注:
            • 程序运行到断点时,程序中断执行,进入调试状态
            • 断点所在行还没有执行
      • 消除类
        • 清除停止点
          • 停止点包括:断点,观察点,捕捉点
          • clear
            • 清除所有停止点
          • clear <function>
            • 清除所有设置在函数上的停止点。
          • clear <filename:function>
            • 清除所有设置在函数上的停止点。
      • 控制类
        • 运行程序(run)
          • run
        • 执行下一个语句的代码(next)
          • next
            • 继续执行下一条语句,只执行一条
        • 执行多句代码(continue)
          • continue
            • 让程序继续执行,直到下个断点或者结束
        • next
          • 全力执行下一个“模块”,如果有调用函数,那就再停在调用函数执行完返回的那一点,没有调用函数,那就一步一步执行;
        • start
          • 单步执行:运行程序,停在第一执行语句
            • 就是停在第一个执行的语句的前面,比如:main函数后面的那个”{“
            • 不会进行函数的跳转;
        • step
          • 单步执行,进入子函数内部
          • 先start,才可以step;
        • finish
          • 结束当前函数的运行,返回函数的调用点
        • set var
          • 修改变量的值
        • until
          • 结束当前循环
        • run argv[1] argv[2]
          • 调试时命令行参数
        • 转到指定线程
          • thread <thread_number>
        • 转到指定帧
          • frame <frame_number>
        • 设置捕捉点(catch)
          • 设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。
          • 详见文档
        • help
          • help + 命令
      • gdb不阻塞进程运行
        • 一般业务进程都会有心跳机制,我们使用gdb调试的时候一般需要先关闭心跳功能,避免长时间断住进程而导致复位。
        • gdb -batch -ex "command" -p pid
      • 注:
        • 以上,无特殊说明,则除了dispaly之外,其他所有命令都可以用首字母代替
        • 直接回车表示,重复上一次命令
        • 【tal】的补全,上下键历史命令都是Ok的
  • git

    • 基础

      • 历史
        • CVS & SVN
          • 集中式的版本控制工具;
          • CVS
            • 不支持原子化提交,网络传输效率低;
          • SVN
            • 就是CSV的改进版,支持原子化提交;
          • 确点
            • 提交排队,不能同时修改;
            • 缺乏代码门禁,看护机制;
            • 数据安全性差,所有的数据都在一个地方放着;
        • git
          • 分布式版本控制工具
          • git不适合的领域
            • 不适合word等二进制文档的版本控制,因为git无锁定解锁模式,不能进行排他式的修改;
        • 集中式和分布式的区别
          • 对待数据的方式
            • 集中式
              • 记录差异(每个版本只记录差异的部分)
            • 分布式
              • 记录快照(每个版本记录文件完整的信息)
          • 脆弱的中央库和强壮的分布库
            • 集中式的几乎所有的动作都需要与服务器进行通信
            • git的提交是在本地完成的;
      • git的安装和配置
        • 系统配置(对所有用户都适用)
          • 存放目录:%Git%/etc/gitconfig
          • 读写命令
            • git config --system
        • 用户配置(只适用于该用户)
          • 存放目录:~/.gitconfig
          • 读写命令
            • git config --global
            • 个人身份的配置
              • git config --global user.name
                • 设置提交时附带的名字
              • git config --global user.email
                • 设置提交时附带的email
            • 文本换行符的配置
              • windows和mac,linux的文件换行符不一样
                • windows
                  • 回车+换行两个字符结束一行;
                • mac,linux
                  • 只使用一个换行结束一行;
              • windows
                • windows和linux都有
                  • git config --global core.autocrlf true
                • 全是windows
                  • git config --global core.autocrlf false
              • linux
                • git config --global core.autocrlf input
                  • 如果提交是回车+换行(CRLF),会自动转为只有换行(LF);
            • 文本编码配置
              • 建议都设置为UTF-8
              • 中文编码支持
                • git config --global gui.encoding utf-8
                • git config --global i18n.commitencoding utf-8
                • git config --global i18n.logoutputencoding utf-8
              • 显示路径的中文
                • git config --global core.quotepath false
            • 于服务器的认证配置
              • http/https协议认证
                • http
                  • 设置口令缓存

git config --global credential.helper store

                • https
                  • 添加 HTTPS 证书信任

git config http.sslverify false

              • ssh协议认证
                • 使用公钥认证, 无需输入密码,加密传输,操作便利又保证安全性;
              • 注:
                • SSH安全性更高;
        • 仓库配置(只对当前项目有效)
          • 存放目录:.git/config
          • 读写命令
            • git config --local
            • 当然,也可以直接打开进行读写
        • 注:
          • 每一个级别的配置都会覆盖上层的相同配置,例如.git/config 里的配置会覆盖%Git%/etc/gitconfig 中的同名变量;(也就是优先级最高的仓库配置,过来是用户配置)
      • 四个区域和文件状态
        • 四个区域
          • 工作区
            • 你在电脑里能看到的目录,平时存放项目代码的地方
          • 暂存区
            • .git/index保存工作区文件的状态,实际上就是暂存区的状态;
          • 本地代码库
            • 就是.git目录,仅在项目根目录下有.git目录;
          • 远程代码库
        • 文件状态
          • 已修改
          • 已暂存
          • 已提交
    • 常用命令

      • 工程准备
        • git init
          • 在本地目录下新建git项目仓库
          • git init 项目名称
        • git clone
          • git lfs clone
            • 如果所在项目git服务器已经支持git-lfs,对二进制文件进行了区别管理,那必须使用git lfs clone, 否则克隆操作无法下载到工程中的二进制文件,工程内容会不完整 ;
      • 查看工作区
        • git diff
          • 查看工作区修改内容(新增的不会,并且是工作区和暂存区的区别;)
          • 查看指定两个文件的差异
          • 查看任意两个分支或者两个节点的差异
          • git diff --name-stauts
            • 只看文件列表,不看细节;
        • git status
          • 查看工作区对和暂存区文件状态
            • 暂存未提交
            • 修改(包括删除)未暂存
            • 新增未暂存
      • 文件修改后的提交推送
        • git add
          • 工作区新增文件到暂存区
          • git add .
            • 将工作区所有的新增文件添加到暂存区;
        • git rm
          • 删除暂存区文件(工作区也会没有)
        • git mv
          • 移动文件到暂存区,或者重命名暂存区内的文件
        • git commit
          • 提交暂存区的文件到本地代码库
          • git commit file_name -m "xxxx"
          • git commit -am "xxxx"
          • git commit -s
            • 进入编辑界面
        • git push
          • 推送到远端仓库
          • git push origin branch_name
          • git push origin branch_name::new_branch_name
          • windows的git bug: windows的分支名对大小写不敏感;
      • 查看日志
        • git log
          • git log --name--status
            • 查看log的详细文件状态;
          • git log --pretty=oneline
            • 输出能好看点,实际没啥用;
          • git log -p
            • 这个文件的最后p次提交日志
        • git reflog
          • 显示最近的修改;
      • 分支管理
        • git branch
          • git branch
            • 本地工程所有的分支名称
          • git branch -r
            • 远端服务器上的分支
          • git branch -a
            • 所有的分支
        • git branch / git checkout -b
          • 新建分支
          • git branch new_branch_name
            • 新建分支但是不会切换到新分支
          • git checkout -b new_branch_name
            • 新建分支并且切换到新分支
        • git branch -d
          • 删除本地分支
          • git branch -D
            • 强制删除本地分支
            • 如果该分支还有未合并的,或者你就在要删除的分支;
          • git branch -d -r branch_name
            • 删除远端分支,注意删除之后还要推送
        • git checkout
          • git checkout -f
            • 强制切换
            • 如果当前分支工作区还有未提交的文件,与目的分支内容冲突
        • git pull
          • 获取远端分支,并且和本地分支合并
          • git pull origin remote_branch
        • git fetch
          • 获取远端分支,不和本地分支和合并,后面需要自行合并;
        • git merge / git rebase
          • 合并目标分支内容到当前分支
          • git merge
            • 用于从指定的分支或者节点合并到当前分支
            • git会将指定的分支与当前分支进行比较,找出二者最近的一个共同节点base,之后将指定分支在base之后分离的节点合并到当前分支上。分支合并,实际上是分支间差异提交节点的合并。
            • git merge branch_name
          • git rebase
            • git rebase origin/master
              • rebase master的代码到当前分支
          • merge和rebase的区别
            • 实现方式
              • Merge会创建一个新的提交
              • Rebase会修改提交历史
            • 使用
              • Merge通常用于合并两个相对独立的分支,例如在开发新功能时,从主分支上创建一个新的分支进行开发,开发完成后再将新分支合并回主分支。
              • Rebase通常用于将本地分支的代码与主分支保持同步,或者将多个本地分支的代码合并到一起。
            • Merge会保留分支的提交顺序,而Rebase会将本地分支的提交按照时间顺序依次应用到主分支的最新提交之后。
      • 撤销操作
        • git reset
          • git reset --hard commit_id
        • git checkout
          • 回退本地所有修改而未提交的文件内容
          • git checkout file_name
            • 回退该文件的修改
          • git checkout commit_id
            • 将工作区回退到某个节点(本地的回退之前的提交还是在的,这个是和reset的区别);
      • others
        • git remove
          • 显示远端服务器名
          • git remote -v
            • 查看远程库的地址列表
        • git grep
          • git grep "工作区文件内容搜索"
          • 搜索.git目录里所有文件里的内容;
        • git tag <tag-name>
          • 给当前提交打一个tag,也可以查看当前标签
    • 实际操作

      • 合并时的冲突处理
        • 冲突发生的原因
          • 合并的两个分支对同一个文件的相同行都进行了修改,不知道已哪一个为主;
        • 处理
          • 按照git的提示一步一步处理;
      • 打补丁
        • git apply bugfix.patch
          • 打补丁,记得打完重新编译
      • 本地有改变可以这样
        • git stash push 将修改给push到一个临时空间中
        • git stash pop 将修改从临时空间pop下来
      • 强制覆盖自己本地的修改
        • git fetch --all
          • 从远程仓库获取最新的代码,但不会合并到本地分支上。
        • git reset --hard origin/<branch_name>
          • 将本地分支重置为远程分支的最新代码,强制覆盖本地代码。
      • 后悔了的操作
        • 撤销commit
          • git commit --amend
            • 只是修改提交的信息
              • 提交之后,紧接着运行这个命令
            • 覆盖上次提交的所有
              • 使用`git add`命令将忘记的文件添加到暂存区中
              • 使用`git commit --amend -m "xxx"`命令来修改上一次提交
          • 如果你已经推送了上一次提交,那么你需要使用`git push --force`命令来强制推送修改后的提交;
        • 撤销多个库上的commit
          • 前提是这个分支不是被保护的
          •  git rebase -i 你想留下的commit
          • 编辑界面,删除不想要的commit
          • git push -f
        • 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改;
          • git checkout --<file>
            • 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
        • 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步
          • git reset HEAD <file>
          • git checkout --<file>
      • merge代码到master
        • pull master的最新代码
          • git co master; git pull --rebase
          • git fetch origin master
            • 只更新远程,不更新本地
        • rebase master代码到你的分支
          • git rebase master
          • git rebase origin master
        • 如果rebase有冲突
          • 冲突之后仅保留新分支的内容
            • git stash
            • rebase
            • git stash pop
          • 冲突之后的内容保留不确定
            • git st
              • 查看冲突的文件
            • 一个文件一个文件解决冲突
            • git add
            • git rebase --continue
            • git push -f
        • push你的分支
          • git push -f
        • 在库上提MR
      • master merge到自己的分支
        • git merge 别的分支名
    • fork分支rebase主分支
      • 查看当前远程仓库
        • git remote -v
          • 应该可以看到信息:
          • origin  https://github.com/yourname/repo.git (fetch)
            origin  https://github.com/yourname/repo.git (push)
            upstream https://github.com/original-owner/repo.git (fetch)
            upstream https://github.com/original-owner/repo.git (push)
        • 如果没有 upstream,添加它:
          • git remote add upstream https://github.com/original-owner/repo.git
             
          • (注意,这里需要添加的是主代码的地址)
        • 获取主代码仓代码
          • git fetch upstream
        • 正常走rebase和merge的操作
    • others

      • git支持撤销提交,支持任意多次;
      • git命令,会在当前目录和上一级目录递归寻找.git目录;
      • 统计代码行
        • git log --author="zwx1144326" --since=2022-01-01 --until=2023-11-30 --pretty=tformat: --numstat | grep -v 'devlog' | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "增加的行数:%s 删除的行数:%s  总行数: %s\n",add,subs,loc }'
  • Markdown语法手册

    • 斜体粗体
      • *斜体*或_斜体_
      • **粗体**
      • ***加粗斜体***
      • ~~删除线~~
    • 分级标题
      • 第一种写法
        • 这是一个一级标题 ============================
        • 这是一个二级标题 --------------------------------------------------
      • 第二种写法:
        • # 一级标题
        • ## 二级标题
        • ## 二级标题
        • #### 四级标题
        • ##### 五级标题
        • ###### 六级标题
    • 超链接
      • 行内式
        • 语法说明:
          • []里写链接文字
          • ()里写链接地址
          • ()中的”“中可以为链接指定title属性,title属性可加可不加
            • title属性的效果是鼠标悬停在链接上会出现指定的 title文字
          • [链接文字](链接地址 “链接标题”)
            • 链接地址与链接标题前有一个空格
        • 代码:
          • 欢迎来到[梵居闹市](http://blog.leanote.com/freewalk)
          • 欢迎来到[梵居闹市](http://blog.leanote.com/freewalk "梵居闹市")
        • 显示效果:
          • 欢迎来到梵居闹市
          • 欢迎来到梵居闹市
      • 参考式
        • 语法说明:
          • [链接文字][链接标记]
          • [链接标记]:链接地址 “链接标题”
        • 代码:
          • Topic1

        • 显示效果:
          • Topic1

    • 列表
      • 无序列表
        • 使用 *,+,- 表示无序列表
        • 代码:
          • - 无序列表项 一
      • 有序列表
        • 有序列表则使用数字接着一个英文句点。
      • 定义型列表
        • 语法说明:
          • 定义型列表由名词和解释组成
          • 一行写上定义,紧跟一行写上解释
          • 解释的写法:紧跟一个缩进(Tab)
        • 代码:
          • Topic1

  • 软件安装

    • python
      • 源码获取
        • https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
      • 解压安装
        • tar -xvf Python-3.10.6.tar.xz && cd Python-3.10.6/
        • ./configure --prefix=安装目录
        • make install
      • toml安装
        • pip install toml
        • 如果失败
          • 获取源码:GitHub - uiri/toml: Python lib for TOML
          • unzip toml-master.zip cd toml python setup.py install
  • BIOS
    • SMT的关闭
      • Topic1

      • Topic1

      • Topic1

  • 实用小命令

    • 查看代码量

      • git log --author="zwx1144326" --since=2024-08-01 --until=2024-08-31 --pretty=tformat: --numstat | grep -v 'devlog' | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "增加的行数:%s 删除的行数:%s 总行数: %s\n",add,subs,loc }'
    • kill进程

      • ps -ef |grep "qemu-linx"  |awk '{print $2}'|xargs kill -9
    • 后台运行

      • nohup (no hang up)
      • tmux
        • tmux new -s your_session_name
        • python your.py
        • Ctrl + B then D
          • 会话分离,脚本继续在后台运行
        • 查看存在的会话
          • tmux list-sessions
        • 关闭会话
          • tmux kill-session -t your_session
    • SCP
      • scp mcf zwx1144326@10.145.46.50:/remote/lms04/zwx1144326/BlockISA/PM_Cases/mcf/src
  • 编译QA记录

    • llvm相关

      • Q
        • /usr/local/include/gnu/stubs.h:7:11: fatal error: 'gnu/stubs-32.h' file not found
        • A
          • 服务器环境差东西,要不上网查安装,要不换服务器,51没问题。
      • llvm指定arm
        • --target=aarch64-linux-gnu
    • SIMD SVE编译

      • LLVM
        • 关闭
          • -fno-slp-vectorize -fno-vectorize -march=armv8-a+nosimd
        • 打开
          • 默认就是打开
      • GCC
        • 关闭
          • -fno-tree-vectorize -fno-tree-slp-vectorize -march=armv8-a+nosimd
        • 打开
          • -f-tree-vectorize -f-tree-slp-vectorize -march=armv8-a+sve
      • 打开SVE
        • -march=armv8-a+sve
    • 锁核
      • strict_rundir_verify = 0
    • 汇编和代码对应

      • -fverbose-asm -g
    • 编译IR文件

      • -S -emit-llvm
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值