VMware虚拟机Nat模式无法联网解决方式
背景:使用mumu模拟器时禁用了hyper-v,之后虚拟机出现连不上网的情况
初步调查发现VMwareWorkStationServer服务消失
解决过程:
- 重置网络:编辑→虚拟网络编辑器→还原默认设置(无效)
- VMware修复:右键VMwareWorkStation选择更改→修复(无效)
- VMware重装:卸载VMware后重装(无效)
- 重装虚拟机:彻底删除Ubuntu虚拟机后重新安装并初始化
建立新的虚拟机后网络问题解决。
Linux服务端开发工作流和环境搭建
工作流:
开发环境:neovim
版本控制:git
测试工具:待选
环境搭建:
数据库:mySQL和postgreSQL
同时使用两种数据库
使用mySQL存储结构化数据和频繁查询的数据
使用postgreSQL存储非结构化数据和频繁更新的数据
mySQL开发环境配置
sudo apt-get update
sudo apt-get install mysql-server #安装服务端
sudo apt-get install mysql-client #安装客户端
sudo apt-get install libmysqlcppconn-dev #安装开发套件
调用时包含下列头文件
#include <iostream>
#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/statement.h>
#include <cppconn/resultset.h>
编译时遇到链接库问题:
按照下列指令编译时
g++ -o test test.cpp -I/usr/include/mysql-cppconn-8 -L/usr/lib/x86_64-linux-gnu -lmysqlcppconn8
g++输出报错信息说明没有找到指定的链接库
解决方法:
使用下列参数进行编译
sudo g++ -I/usr/include/cppconn -o test test.cpp -L usr/Lib -lmysqlcppconn
postgreSQL开发环境配置
sudo apt-get update
sudo apt-get install postgresql
创建用户和数据库
CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE mydatabase;
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
调用时包含下列头文件
#include <iostream>
#include <pqxx/pqxx>
编译选项
g++ -o program program.cpp -lpqxx -lpq
网络库:libevent
环境配置
sudo apt-get update
sudo apt-get install libevent-dev
编译选项
g++ -o my_program my_program.cpp -levent
定时器示例
#include <stdio.h>
#include <stdlib.h>
#include <event2/event.h>
// 定义回调函数
static void timer_cb(evutil_socket_t fd, short event, void *arg)
{
printf("Hello, world!\n");
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 重新添加定时器
event_add((struct event *)arg, &tv);
}
int main(int argc, char *argv[])
{
struct event_base *base;
struct event *timer_event;
struct timeval tv;
// 初始化 libevent
base = event_base_new();
if (!base) {
perror("event_base_new()");
return -1;
}
// 创建定时器事件
tv.tv_sec = 1;
tv.tv_usec = 0;
timer_event = event_new(base, -1, EV_PERSIST, timer_cb, event_self_cbarg());
if (!timer_event) {
perror("event_new()");
return -1;
}
// 添加定时器事件
event_add(timer_event, &tv);
// 进入事件循环
event_base_dispatch(base);
// 释放资源
event_free(timer_event);
event_base_free(base);
return 0;
}
vim速查表
光标移动
注:一般模式下,任意一个动作都可以重复。
h # 光标左移,同
j # 光标下移,同
k # 光标上移,同
l # 光标右移,同
Ctrl+e # 向上滚动一行
Ctrl+y # 向下滚动一行
Ctrl+u # 向上滚动半屏 –> Move up 1/2 a screen
Ctrl+d # 向下滚动半屏 –> Move down 1/2 a screen
Ctrl+f # 向下滚动一屏 –> Move forward one full screen
Ctrl+b # 向上滚动一屏 –> Move back one full screen
0 # 跳到行首,数字 0,效用等同于
^ # 跳到从行首开始第一个非空白字符
$ # 跳到行尾,效用等同于
gg # 跳到第一行,效用等同于 Ctrl+
G # 跳到最后一行,效用等同于 Ctrl+
nG # 跳到第 n 行,比如 10G 是移动到第十行
:n # 跳到第 n 行,比如 :10
10% # 移动到文件 10% 处
15| # 移动到当前行的 15 列
w # 跳到下一个单词开头(word:标点或空格分隔的单词)
W # 跳到下一个单词开头(Word:空格分隔的单词)
e # 跳到下一个单词尾部(word:标点或空格分隔的单词)
E # 跳到下一个单词尾部(Word:空格分隔的单词)
b # 跳到上一个单词开头(word:标点或空格分隔的单词)
B # 跳到上一个单词开头(Word:空格分隔的单词)
ge # 跳到前一个单词结尾
) # 向前移动一个句子(句号分隔)
( # 向后移动一个句子(句号分隔)
} # 向前移动一个段落(空行分隔)
{ # 向后移动一个段落(空行分隔)
n
# 移动到下一行首个非空字符(同回车键)
# 移动到上一行首个非空字符
H # 移动到屏幕上部
M # 移动到屏幕中部
L # 移动到屏幕下部
<S+Left> # 按住 Shift 按左键,向左移动一个单词
<S+Right> # 按住 Shift 按右键,向右移动一个单词
<S+Up> # 按住 Shift 按上键,向上翻页
<S+Down> # 按住 Shift 按下键,向下翻页
gm # 移动到行中
gj # 光标向下移动一个屏幕行(忽略自动换行)
gk # 光标向上移动一个屏幕行(忽略自动换行)
zz # 调整光标所在行到屏幕中央
zt # 调整光标所在行到屏幕上部
zb # 调整光标所在行到屏幕下部
插入模式
i # 在光标处进入插入模式
I # 在行首进入插入模式
a # 在光标后进入插入模式
A # 在行尾进入插入模式
o # 在下一行插入新行并进入插入模式
O # 在上一行插入新行并进入插入模式
gi # 进入到上一次插入模式的位置
Ctrl+[ # 退出插入模式(等价于 Esc 键)
插入模式的命令
注:由 i, I, a, A, o, O 等命令进入插入模式。
<S+Left> # 按住 Shift 按左键,向左移动一个单词
<S+Right> # 按住 Shift 按右键,向右移动一个单词
<S+Up> # 按住 Shift 按上键,向上翻页
<S+Down> # 按住 Shift 按下键,向下翻页
Ctrl+d # 减少缩进
Ctrl+f # 减少缩进
Ctrl+t # 增加缩进
Ctrl+h # 删除前一个字符,相当于回格键 Backspace
Ctrl+o # 临时退出插入模式,执行单条命令又返回插入模式
Ctrl+u # 当前行删除到行首所有字符
Ctrl+w # 删除光标前的一个单词
Ctrl+\ Ctrl+O # 临时退出插入模式(光标保持),执行单条命令又返回插入模式
Ctrl+R 0 # 插入寄存器(内部 0 号剪贴板)内容,Ctrl+R 后可跟寄存器名
Ctrl+R “ # 插入匿名寄存器内容,相当于插入模式下 p 粘贴
Ctrl+R = # 插入表达式计算结果,等号后面跟表达式
Ctrl+R : # 插入上一次命令行命令
Ctrl+R / # 插入上一次搜索的关键字
Ctrl+v {char} # 插入非数字的字面量
Ctrl+v {code} # 插入用三位数字表示的 ASCII/Unicode 字符编码,如 Ctrl+v 065
Ctrl+v 065 # 插入 10 进制 ASCII 字符(两数字) 065 即 A 字符
Ctrl+v x41 # 插入 16 进制 ASCII 字符(三数字) x41 即 A 字符
Ctrl+v o101 # 插入 8 进制 ASCII 字符(三数字) o101 即 A 字符
Ctrl+v u1234 # 插入 16 进制 Unicode 字符(四数字)
Ctrl+v U12345678 # 插入 16 进制 Unicode 字符(八数字)
Ctrl+K {ch1} {ch2} # 插入 digraph(见 :h digraph),快速输入日文或符号等
自动补全
在插入模式下,最常用的补全
Ctrl+n # 插入模式下文字自动补全
Ctrl+P # 插入模式下文字自动补全
Ctrl+e # 有补全列表时,终止这次补全,继续输入
智能补全
Ctrl+X # 进入补全模式
Ctrl+X Ctrl+L # 整行补全
Ctrl+X Ctrl+N # 插入模式下,根据当前文件里关键字补全
Ctrl+X Ctrl+K # 根据字典补全
Ctrl+X Ctrl+T # 根据同义词字典补全
Ctrl+X Ctrl+F # 插入模式下补全文件名
Ctrl+X Ctrl+I # 根据头文件内关键字补全
Ctrl+X Ctrl+] # 根据标签补全
Ctrl+X Ctrl+D # 补全宏定义
Ctrl+X Ctrl+V # 补全 Vim 命令
Ctrl+X Ctrl+U # 用户自定义补全方式
Ctrl+X Ctrl+S # 拼写建议,例如:一个英文单词
Ctrl+X Ctrl+O # 插入下 Omnifunc 补全
文本编辑
r # 替换当前字符
R # 进入替换模式,直至 Esc 离开
s # 替换字符(删除光标处字符,并进入插入模式,前可接数量)
S # 替换行(删除当前行,并进入插入模式,前可接数量)
cc # 改写当前行(删除当前行并进入插入模式),同 S
cw # 改写光标开始处的当前单词
ciw # 改写光标所处的单词
caw # 改写光标所处的单词,并且包括前后空格(如果有的话)
c0 # 改写到行首
c^ # 改写到行首(第一个非零字符)
c$ # 改写到行末
C # 改写到行尾(同 c$)
ci” # 改写双引号中的内容
ci’ # 改写单引号中的内容
cib # 改写小括号中的内容
cab # 改写小括号中的内容(包含小括号本身)
ci) # 改写小括号中的内容
ci] # 改写中括号中内容
ciB # 改写大括号中内容
caB # 改写大括号中的内容(包含大括号本身)
ci} # 改写大括号中内容
cit # 改写 XML tag 中的内容
cis # 改写当前句子
c2w # 改写下两个单词
ct( # 改写到小括号前
x # 删除当前字符,前面可以接数字,3x 代表删除三个字符
X # 向前删除字符
dd # 删除(剪切)当前行,并把删除的行存到剪贴板里 –> Delete (cut) a line
d0 # 删除(剪切)到行首
d^ # 删除(剪切)到行首(第一个非零字符)
d$ # 删除(剪切)到行末
D # 删除(剪切)到行末(同 d$)
dw # 删除(剪切)当前单词
diw # 删除(剪切)光标所处的单词
daw # 删除(剪切)光标所处的单词,并包含前后空格(如果有的话)
di” # 删除双引号中的内容
di’ # 删除单引号中的内容
dib # 删除小括号中的内容
di) # 删除小括号中的内容
dab # 删除小括号内的内容(包含小括号本身)
di] # 删除中括号中内容
diB # 删除大括号中内容
di} # 删除大括号中内容
daB # 删除大括号内的内容(包含大括号本身)
dit # 删除 XML 中 tag 中的内容
dis # 删除当前句子
d2w # 删除下两个单词
dt( # 删除到小括号前
dgg # 删除到文件头部
dG # 删除到文件尾部
d} # 删除下一段
d{ # 删除上一段
10d # 删除当前行开始的 10 行
:10d # 删除第 10 行
:1,10d # 删除 1-10 行
J # 链接多行为一行
. # 重复上一次操作
~ # 替换大小写
g~iw # 替换当前单词的大小写
gUiw # 将单词转成大写
guiw # 将当前单词转成小写
guu # 全行转为小写
gUU # 全行转为大写
<< # 减少缩进
# 增加缩进
== # 自动缩进
Ctrl+A # 增加数字
Ctrl+X # 减少数字
Linux基本命令速查表
一、文件相关操作
1、创建和查看文件夹
1)ls
命令,查看文件夹下的内容,语法:ls [-参数] [路径]
参数列表:
- a:显示所有文件和目录
- l:显示文件和目录的详细信息
- d:只显示目录
- R:递归显示所有子目录和文件
示例:ls -l /root/
2)cd
命令,用于切换 当前工作目录,语法:cd [路径名]
特殊路径:~表示登录用户的home,.
表示当前路径,..
表示上级路径
3)mkdir
创建文件夹 ,语法:mkdir -p [路径,多个路径用空格分开]
参数-p
的作用,是如果路径不存在则进行创建。没有此参数时,创建重复路径会报错。
2、修改文件夹
1)mv
命令可以移动文件夹,语法:mv [-参数] 源文件或文件夹,多个源空格分开 目标文件或文件夹
。
参数说明:
- i:文件重名时,是否询问
- b:文件重名时覆盖,并且对被覆盖的文件进行备份
2)cp
命令,复制文件,语法和mv
相似。
3)rm
命令,删除文件,语法:rm [-参数] [删除的路径,多个路径空格分开]
参数:
- r:递归删除
- f:只读的文档也删除
3、查找文件
find
命令,可以查找某个路径下的文件,语法:find [查找的路径] [查找匹配表达式]
。
查找匹配表达式,用来匹配特定的文件,例如名称为XX的文件等等。
该命令会遍历路径下所有子文件进行查找。
4、文件压缩
常用tar
和gaip
命令。
5、文件差异
使用diff
命令
6、grep
查找字符,可以在某个文件,或者上一步输出的内容中进行查找。
语法:grep [-参数] 正则表达式 [文件]
。
其中,正则表达式部分,可以是一个字符串,也可以是正则表达式,用于文本查找。
参数部分,常用参数如下:
- i:忽略匹配的大小写
- n:显示匹配行号
- c:计算符合的列数
一个典型的应用场景,就是在进程信息中进行查找,例如:
# 列出所有进程
ps -aux
# 但是我们想要查看python相关进程,或者nodejs相关进程,就需要对输出进行文本过滤
ps -aux | grep node
####二、网络管理
1、ip信息
ipconfig
,用于显示网络信息,还能配置某个网卡的信息 。
1)运行ipconfig
查看当前设备的网卡信息
2)网卡操作:ipconfig 网卡名 [操作名] [操作参数]
2、ping
命令,用于测试链接
3、netstat
用于显示网络状态,语法:netstat [-参数]
一些重要的参数:
- a:显示所有的socket连接
- p:使用socket的程序信息
- t:使用tcp的连接状态
- u:使用udp的连接状态
三、进程管理
1、ps
显示所有进程:ps [参数]
由于参数较多,其常使用的固定搭配ps -aux
用于列出所有的进程,参数列表:
- A,e:显示所有进程
- a:显示一个终端的所有进程
- u:显示进程的归属用户,以及内存使用情况
- x:显示没有终端进行控制的进程
- l:显示详细信息
2、kill
命令终止进程,语法:kill 进程号
3、nohup
退出终端后仍然运行命令,语法:nohup 命令 [-参数] &
。