Rookie diary
除了编程和逆向之外的常用工具的使用,记载一些其他常用的工具的使用过程防止自己继续花时间找解决办法
1. GitHub:
github已经创建仓库后,将本地文件上传:
- 在本地文件夹中右键
Git Bash Here
- 输入
git init
在本地建立.git文件夹- 输入
git remote add origin git@github.com:Kvancy/GameHall.git
设置远程仓库,origin后面地址从仓库SSH块复制- 输入
git add .
- 输入
git commit -m "版本号"
- 输入
git checkout -b main
将上传分支设置为main(也可以是其他,自定义)- 输入
git push -u origin main
上传文件到main分支删除分支
- 远端分支
git push origin --delete [branch_name]
- 本地分支
git branch [branch_name] -d
查看分支
- 查看本地分支
git branch
- 查看远程分支
git branch -r
- 查看本地和远程分支
git branch -a
更换远程仓库地址
git remote -v
#查看远端地址git remote
#查看远端仓库名git remote set-url origin https://gitee.com/xx/xx.git
(新地址)git push报错,显示仓库中有一部分代码,要先pull
- 方法一:
git pull origin [main]
分支名重新
add
和commit
相应文件
git push origin [main]
分支名
- 方法二:
- 强推:
git push -f origin [main]
分支名
2. VScode的环境配置:
launch.json文件配置(调试的配置,必须先编译得到exe)
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{
"configurations": [
{
"name": "C/C++: g++.exe 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": true,//设置成true才能调试
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
},
],
"version": "2.0.0"
}tasks.json文件配置(编译作用),这里默认g++,不需要动,在终端-配置任务中修改
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{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "C:\\MinGW\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
setting.json
1 | { |
c_cpp_properties
1 | { |
3. 虚拟机配置:
bcdedit /set hypervisorlaunchtype off
4. 服务器博客搭建
1. 登录宝塔面板
远程连接云服务器的控制台
访问宝塔面板的安全入口,可通过控制台 su root bt default 查询网址,
目前设置成了 47.97.68.254:1111/Kvancy
用户名是Kvancy
2. 本地下载hexo博客系统
curl --silent --location https://rpm.nodesource.com/setup_14.x|sudo bash
yum -y install nodejs
npm install hexo-cli -g
hexo init blog
cd blog/
npm install
hexo server
- 默认4000端口没用的话,使用
hexo server -p5000
指定端口,如果想直接通过ip访问博客,可以通过hexo server -p80
设置端口。也可以通过/blog/node_modules/hexo-server/index.js
修改port值从而修改默认端口号- 有时候开启多个端口设置hexio会访问失败,通过
netstat -nultp
查看所有端口号,kill -9 id
id为进程id,杀死进程即可,kill - num 代表的意思如下
num 1 2 3 9 15 18 19 20 含义 进程重新被加载 删除进程在内存中的数据 删除鼠标在内存中的数据 强行结束单个进程 正常关闭进程 运行暂停的进程 暂停某个进程 把进程打入后台
3. 本地Hexo一键部署到远程服务器
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装宝塔面板
yum install git
安装git
adduser git
配置git用户
chmod 740 /etc/sudoers
赋予用户权限 ``vi /etc/sudoers进入权限管理文件
root ALL=(ALL) ALL
git ALL=(ALL) ALL
在这条上面加上这行
chmod 400 /etc/sudoers
修改sudoers文件权限
sudo passwd git
设置git 用户的密码,这里设置了 ‘root’
su - git
给用户添加ssh密钥,git
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorzied_keys
chmod 700 ~/.ssh vim ~/.ssh/authorized_keys
将ssh密钥粘贴进去,用于远程登录服务器
ssh -v git@你的 ip 地址
输入密码 即可成功登录云服务器
su root
创建一个git仓库,新建一个 post-receive 文件,用来存储本地的提交
cd /home/git
git init --bare blog.git
#在/home/git下创建新仓库blog.git
chown git:git -R blog.git
#给予git用户权限
cd blog.git/hooks vim post-receive
配置钩子文件,使得每次本地上传时,远程自动同步下载
#!/bin/bash
`git --work-tree=/home/hexo --git-dir=/home/git/blog.git checkout -f` 写入钩子代码
chmod +x /home/git/blog.git/hooks/post-receive
授予钩子可执行权限以上是服务器配置 ------
deploy: #配置本地hexo的_config.yml文件 type: git repo: root@你的ip地址:/home/git/blog.git #仓库地址 branch: master #分支
1
2
3
4
5
6
14. ```js
#上传到远程服务器端git仓库,远程通过钩子自动下载同步 #这些也是部署之后每次上传时执行的命令
hexo clean
hexo g -d #编译并部署,
hexo s #本地用来测效果
4. 针对Kratos-Rebirth主题的配置
根目录下_config.yml
先理清两个概念,根目录下的deploy配置repo是对应仓库地址用http或者ssh地址都行,但是http协议下的
hexo -d
容易报错,可能延迟太高了,建议使用ssh地址举例如下:git@github.com:Kvancy/Kvancy.github.io.git
根目录下url的配置是远程部署的网站地址,不是仓库地址,所以可以这样填url: https://kvancy.github.io/
还有一个叫做文章永久链接格式,permalink的配置,默认配置如下:
:year/:month/:day/:title/
意思是,在每次
hexo -g
生成html时,默认文章目录结构是按照年月日文章名排布的,因为这个我一直以为是我commit版本加了’/‘导致的错误,弄了半天没弄明白,搞得我放弃云服务器转到github上来,现在明白了,但是想想还是就到github上吧
index_generator:
属性配置,这个的per-page属性是指主页面下最多几个文章,也就是说几个文章之后需要进入下一个page,这个主题调成4个我个人感觉最好的
index: post_type: false
这个设置成false可以让主页上的文章预览时有自定义的图片主题文件夹下_config.yml配置
先说第一个,也是搞了我很久的一个问题,关于网站havicon标志的配置。我一直在根目录下对havicon进行部署,一度以为我的路径或者图片有问题,因为其中没有havicon的有关配置,我就像其他主题一样自己加上去,甚至去查过可以直接在服务器根目录下放着havicon.ico文件,浏览器会自己查找,试过了发现在
hexo -g
的时候根目录结构会改变,行不通,后来翻阅作者的配置说明得知,在主题文件夹下site_logo处配置site_logo: /images/favicon.ico #网站的favicon
snow下雪动画设置成true,enable_dark设置成false,亮色主题。
去除主页上栏图片改用一整个图片做背景是在customStyles下吧images的banner属性地址设置成空,在src/scss/kr-color/default.css文件有有关对应默认设置的图片地址,把resource文件下该图片名改一下即可,独留background属性,地址为/images/bg.jpg,这个相对路径判断:”hexo -g”生成public文件后,进入public文件,这个是浏览器的根目录,在根目录下的images文件夹即对应了这个相对路径,下面的avatar也是如此寻址设图
siteLeaveEvent: true
这个设置成true可以有监控离开和进入网页的动作,从而做出动效引入了鼠标跟踪特效,源js代码链接 并对该特效进行修改,
characters = ["0", "1"];
把音符改成了二进制;引入步骤是,copy并自定义修改js代码后,把文件名改成Suzhi.js(博主名),再copy一份到Suzhi.min.js,前者放在src/js目录下,后者放到source/js代码下;在layout/_partial找到after-footer.ejs文件,进去对照id = snow的写法复制一个对应id= Suzhi的(前端不是很懂,就是copy就完了!),参考如下:
1
2
3
4
5
6 <% if(theme.mouse_trace_js){ %>
<div>
<canvas id="Suzhi"></canvas>
<%- js_theme_cdn('js/Suzhi.min.js', {async: true}) %>
</div>
<% } %>然后在theme主题下的config_yml文件加一个
mouse_trace_js: true #鼠标跟踪动画
就行引入boom.js,text.js,更改了鼠标点击特效,前者是爆炸烟花波纹,后者是文字特效
5. 关于Typora
1. YAML Front Matter的使用
每次上传md文件到博客时,都需要给文章起个标题,并且配置文章属性,如下是属性配置格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14 title: c++笔记
date: 2023/9/18
categories: 笔记
tags:
- 笔记
sticky: 100
pic:
comments: false
toc: true
expire: true
only:
- home
- category
- tag
pic : 可以指定这篇文章是否使用自定义的缩略图名称(在文章资源文件夹内),而不是使用随机化的图标
sticky : (number)重要的文章,把它们置顶吧!数字越大优先级越高哦~
comments : (true/false)是否为单篇文章指定开启或关闭评论区
toc: (true/false)该文章是否需要生成目录
only: 指定文章显示的位置,有以下关键词:
home: 在首页显示
- category: 在分类页显示
- tag: 在标签页显示
留空或是不配置此项,则文章在所有该出现的位置都会显示。
层级之间相互平等,没有覆盖关系。
特别地,如果配置了此项,但是使用的并不是以上的关键词(例如只留了一个- none
,那么文章就被隐藏起来了)
2. 控制文章预览字数
- 在你想要预览结束的地方添加markdown源代码
``
3. 图片的插入与上传
在偏好设置的图像位置设置,插入图片时—-上传图片;勾选对本地位置的图片应用上述规则;上传服务—-PicGo(app), 路径找到Picgo的exe程序路径;在smms上注册一个账号,获得账号API token,作为接下来的密钥;下载PicGo(app)之后,在图床设置里将密钥填入SM.MS图床,SM.MS-登录用户;
在插件设置那里搜索smms-user,下载之后点击插件右下角的设置,点击配置plugin,配置uploader,把密钥填入后重启;在Typora偏好设置里有验证图片上传的选项
现在的话就可以在每次插入图片时实现自动上传到SMMS图床,并直接更改md文件中图片地址为远程图片地址,如果有大量没处理的本地图片,可以通过格式–图像–上传所有本地图片操作实现自动上传图片并更改图片路径
6. python学习积累:
pyenv - python环境转换,参考链接: https://github.com/pyenv-win/pyenv-win
Run
pyenv install <version>
to install the supported versionRun
pyenv global <version>
to set a Python version as the global versionCheck which Python version you are using and its path
1
2> pyenv version
<version> (set by \path\to\.pyenv\pyenv-win\.python-version)
commands List all available pyenv commands
local Set or show the local application-specific Python version
global Set or show the global Python version
shell Set or show the shell-specific Python version
install Install 1 or more versions of Python
uninstall Uninstall 1 or more versions of Python
update Update the cached version DB
rehash Rehash pyenv shims (run this after switching Python versions)
vname Show the current Python version
version Show the current Python version and its origin
version-name Show the current Python version
versions List all Python versions available to pyenv
exec Runs an executable by first preparing PATH so that the selected Python
which Display the full path to an executable
whence List all Python versions that contain the given executable
1 | #list转变字符串 |
7. <<深入理解计算机系统>>
存储器
程序的局部性有两种不同的形式-时间局部性和空间局部性
一般而言,良好局部性的程序比局部性差的程序运行的更快
理解: 在一个具有良好局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置
原因: 在硬件层,局部性原理允许计算机设计者通过引入称为高速缓存存储器的小而快速的存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度
例如下面代码,func1会比func2更快
1 | int func1(int a[M[N]]) |
其实就是遍历二维数组的时候从行遍历变成了列遍历,从而破坏了函数的空间局限性
存储器层次架构:
速度 | 存储器 |
---|---|
高速 | 寄存器 |
L1高速缓存(SRAM) | |
L2高速缓存(SRAM) | |
L3高速缓存(SRAM) | |
主存 | |
本地磁盘 | |
低速 | 远程二级存储(分布式文件系统,web服务器) |
链接
源程序main.c到可执行文件的几个步骤
- 生成Ascii码的中间文件main.i
- 翻译成汇编语言文件main.s
- 运行汇编器,生成一个可重定位目标文件main.o
- 最后运行链接器程序生成可执行文件main.exe
gcc编译生成各种文件的几种指令 gcc --help
可查询
gcc -E test.c -o test.i
gcc -S test.c -o test.i
gcc -c test.c -o test.o
gcc test.o -o test
linux下从应用程序中加载和链接动态链接共享库
1 |
|
共享库的一个主要目的就是允许多个进程共享内存中相同的库代码,但是又不希望各个进程消耗过多的内存和时间加载完整的共享库
所以现代系统通过生成PIC(位置无关代码)代码来解决这个问题,无限多个进程可以共享一个共享模块的代码段的单一副本
gcc使用-fpic选项指示GNU编译系统生成PIC代码,编译共享库时总是使用该选项
未防止程序对整个共享库内导出函数进行重定位,引入了PLT表和GOT表两个概念
PLT表和GOT表是动态链接过程中的重要部分,它们可以实现程序在运行时按需加载外部库函数,提高程序的效率和安全性。我来给你讲讲它们的作用和原理。
PLT表(Procedure Linkage Table)是程序链接表,它包含了调用外部库函数的跳转指令,每个指令都会跳转到GOT表中的一个地址。PLT表的第一个条目是一个特殊的入口,它会调用动态链接器(ld)来解析函数的真实地址,并将其写入GOT表中。这个过程称为运行时重定位或惰性绑定,它可以避免在程序启动时就进行所有的重定位,从而减少启动时间和内存占用。
GOT表(Global Offset Table)是全局偏移表,它是一个存储外部库函数地址的数据段,每个条目对应一个PLT表中的条目。GOT表的前三个条目是特殊的,它们分别存储了动态段(.dynamic)的地址、链接映射对象(link_map)的地址和运行时解析函数(_dl_runtime_resolve)的地址。这些信息是动态链接器进行重定位所需要的。当程序第一次调用一个外部库函数时,GOT表中对应的条目会被重定位为真实的函数地址,并被缓存起来。当程序再次调用同一个函数时,就可以直接从GOT表中读取地址并跳转过去,无需再次进行重定位。
Docker
获取容器 IP:
如果你需要使用容器的 IP 地址连接,可以使用 docker inspect
命令获取容器的 IP 地址:
1 | docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql |
Mysql
启动mysql,必须指定MYSQL_ROOT_PASSWORD1
属性
1 | docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql |
phpmyadmin
phpmyadmin连接mysql进行管理,指定PMA_HOST
来指定mysql容器ip, -e PMA_USER=root -e PMA_PASSWORD=root
为mysql账号密码
1 | docker run --name phpmyadmin -d -p 8080:80 -e PMA_HOST=172.17.0.3 -e PMA_PORT=3306 -e PMA_USER=root -e PMA_PASSWORD=root phpmyadmin |
部署可执行jar包
https://www.jb51.net/article/255143.htm
一、准备工作
1、创建存放docker配置文件、jar包的文件夹
在宿主机上,创建文件夹:/home/admin/app,用于存放bash文件和jar包。然后在该文件夹下,创建bash文件和容器配置文件
2、创建bash文件
1 | vi run.sh |
/usr/data是docker容器内的路径
我们不必真的到容器内创建这个路径
后面会将此路径挂载到当前文件夹:/home/admin/app
3、创建容器配置文件
1 | vi Dockerfile |
8081是我们这个jar包的对外端口
二、构建镜像
仍然在/home/admin/app下,构建镜像。注意最后一个“.”,表示 Dockerfile 文件在当前目录下。
1 | docker build -t myapp:1.0.0 . |
三、创建容器并运行
1 | docker run -d -it --name=myapp -p 8081:8081 -v /home/admin/app:/usr/data myapp:1.0.0 |
docker引擎重启后自动运行(也可以理解为操作系统重启后自动运行,如果docker是开机自动运行的话)
1 | docker run --restart=always -d -it --name=myapp -p 8082:8081 -v /home/admin/app:/usr/data myapp:1.0.0 |
-v,将容器内的/usr/data挂载到宿主机的/home/admin/app。以后jar包有更新,丢到宿主机的/home/admin/app,然后重启容器即可。
-d: 后台运行容器,并返回容器ID;
-d, –detach=false Run container in background and print container ID
-i: 以交互模式运行容器,通常与 -t 同时使用;
-i, –interactive=false Keep STDIN open even if not attached
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-t, –tty=false Allocate a pseudo-TTY
四、删除多余或失败的容器、镜像
以上步骤,可能存在波折,不小心就创建了许多并不称心如意的容器和镜像,占用了心水名称和端口,必先删之而后快。
1、观察已经有哪些容器
1 | docker ps -a |
加上 -a 参数,可以列出没有在运行的容器。
2、删除指定容器
docker rm $name 或者 容器ID
3、观察已经有哪些镜像
1 | docker images |
4、删除指定镜像
1 | docker rmi -f $name 或者 镜像ID |
要删除镜像,首先要删除它派生的容器。
Mysql
连接mysql数据库注意事项:
修改root用户远程连接权限:
1 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; |
查看是否修改成功
1 | use mysql; |
刷新权限
1 | flush privileges; |
更新用户密码:
使用 ALTER USER
语句来更新用户密码。例如,如果你想要更新用户名为 user
的密码
1 | ALTER USER 'user'@'%' IDENTIFIED BY 'newpassword'; |
创建新用户:
使用 CREATE USER
语句创建新用户。例如,创建一个用户名为 user
的新用户:
1 | CREATE USER 'user'@'%' IDENTIFIED BY 'yourpassword'; |
Navicat连接
在docker的mysql创建用户,设置连接权限后,Navicat设置主机127.0.0.1/localhost(mysql容器的ip虽然本地ping不通,但是可以连上)
java文件打包jar
编译Java源文件: 打开终端或命令提示符,然后使用
javac
命令编译你的Java源文件。例如,如果你的主类是Main.java
,你可以使用以下命令:1
javac Main.java
检查编译结果: 编译后,你应该在相同的目录下看到
Main.class
文件(以及可能的任何内部类文件,例如Main$1.class
等)。创建JAR文件: 使用
jar
命令来创建JAR文件。如果你的主类是Main
,并且你想创建一个名为MyApplication.jar
的JAR文件,你可以使用以下命令:(注意Main后有个空格,指将所有以Main为前缀的class都选上)1
jar cvfe MyApplication.jar Main *.class
这里的
c
表示创建新的JAR文件,v
表示在创建过程中显示详细输出,f
指定JAR文件的名称,e
表示指定应用程序的入口点(主类),后面跟着主类的名称和.class
文件的通配符。确保JAR文件的可执行性: 如果你的JAR文件中包含的是应用程序的主类,你可能还需要在JAR文件的清单(MANIFEST.MF)中指定主类。这可以通过以下命令完成:
1
2echo "Main-Class: Main" > manifest.txt
jar cvfm MyApplication.jar manifest.txt *.class这里
m
表示指定清单文件,manifest.txt
是包含Main-Class
属性的文件。运行JAR文件: 一旦JAR文件创建完成,你可以通过以下命令来运行它:
1
java -jar MyApplication.jar
清理: 如果你不需要
.class
文件了,可以删除它们以节省空间:1
rm *.class