Lang's Blog

Keep writing, Keep loving

直入正题,一元线性回归就是一次函数,即 $y=kx+b$

在线性函数中,$x$就是自变量,即模型需要输入的数据,$y$就是因变量,即我们需要预测的值

我们如何拟合一条符合数据变化趋势的曲线呢?这就要涉及误差值了,因为拟合出来的曲线能否代表数据特征,我们需要一个评判标准

曲线绝对无法完全拟合到每一个数据点上,但是我们能在这种拟合中寻找最优的那条曲线,评判依据就是误差值,什么是这里的误差值呢?

公式推导

在这里我们将误差设为$e$,$e=y-kx-b$鉴于误差存在正负的波动所以我们以$|e|$来代表误差的大小,要求最小的误差,即求$|e|$的最小值

在整个训练数据集中就求:$\sum_{n=i}^{n}|e|$的最小值,将公式进行推导,如下:
$$
{min}(\sum_{n=i}^n|e|)\Rightarrow{min}(\sum_{n=i}^n e^2)\Rightarrow{min}(\sum_{n=i}^n ({y_{i}-kx_i-b})^2)
$$
令S为:
$$
S =\sum_{n=i}^n ({y_{i}-kx_i-b})^2
$$
为求S的极值,需要对k,b求偏导,并使其等于0,最后求出k,b的值用于代码的编写:
$$
\begin{cases}
\frac{\partial S}{\partial k} = 2 \times \sum_{i=1}^n (y_i-kx_i-b)(-x_i)
\\\
\frac{\partial S}{\partial b} = 2 \times \sum_{i=1}^n (y_i-kx_i-b)(-1)
\end{cases}
$$

$$
\Rightarrow
\begin{cases}
b = \frac{\sum_{i=1}^n (y_i-kx_i)}{n} = \frac{\sum_{i=1}^n y_i-k \sum_{i=1}^{n} x_i}{n}
\\\
k = \frac{n\times\sum_{i=1}^n x_iy_i-\sum_{i=1}^n y_i\times\sum_{i=1}^n x_i}{n\times\sum_{i=1}^n x^2 - (\sum_{i=1}^n x_i)^2}
\end{cases}
$$

以下是代码部分,采用python语言编写:

生成测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform(-10,10,size=100)
y = .4 * x + 3 + np.random.uniform(-1,1,size=100)

f = open('dataset/simulation_data_1d.txt','w')
for i in range(0,100):
line = str(x[i]) + ',' + str(y[i])
f.write(line)
f.write('\n')

plt.plot(x,y,'b.')
plt.show()

编写算法部分

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
import matplotlib.pyplot as plt
import random

data = open('dataset/simulation_data_1d.txt', 'r').read()
# print(data.split('\n'))

# 数据读取
x = []
y = []
for item in data.split('\n'):
if item != '':
item = item.split(',')
x.append(float(item[0]))
y.append(float(item[1]))


# 数据集构建
def seperateData(x, y, test_scale):
# 将x,y进行矩阵组合
data = []
for _x in x:
i = x.index(_x)
data.append([])
if type(_x) == 'list':
for feature in range(len(_x)):
data[i].append(feature)
data[i].append(y[i])
else:
data[i].append(_x)
data[i].append(y[i])

# 切割数据集
train = []
test = []
random.seed(3)
for i in range(len(data)):
count = random.random()
if count > test_scale:
train.append(data[i])
elif count < test_scale:
test.append(data[i])
return train, test


train, test = seperateData(x, y, 0.2)

# 处理成能够用于模型训练的数据结构
X_train = []
Y_train = []
X_test = []
Y_test = []
for item in train:
X_train.append(item[:-1])
Y_train.append(item[-1])
for item in test:
X_test.append(item[:-1])
Y_test.append(item[-1])

Xsum = 0.0
Ysum = 0.0
XY = 0.0
X2sum = 0.0
n = len(Y_train)
# 推导的算法结果部分的实现
for i in range(n):
Xsum += X_train[i][0]
Ysum += Y_train[i]
XY += X_train[i][0] * Y_train[i]
X2sum += X_train[i][0] ** 2
k = (n * XY - Xsum * Ysum) / (n * X2sum - Xsum ** 2)
b = (Ysum - k * Xsum) / n
print("拟合的曲线:y =",k,"* x +",b)

plt.plot(X_train, Y_train, 'b.')
plt.plot(X_test, Y_test, 'r*')
plt.xlabel("Trian_Area")
plt.ylabel("Trian_Price")

# 绘制拟合的曲线
Y = []
for item in X_test:
Y.append(k * item[0] + b)
plt.plot(X_test, Y, 'g-')

plt.show()

总结:我jio的还口以,如有错误欢迎指正

咳咳,今天写个记录,记录自用护眼色

十六进制颜色如下:

#CCE8CF

问题描述

使用windows上的tensorboard时,明明正确生成了graph,但是在logdir参数中赋上绝对路径后进入web板中没有任何数据显示

解决方案

1.打开命令行,cd到生成graph的目录 ==OR== 到目录下shift+右键菜单“在此处打开Powershell窗口”

2.命令框中直接输入
tensorboard --logdir="./"

简单暴力!

问题描述

嗯,校园网欠费了,但是宿舍这里无法登陆,显示欠费,实验室的电脑使用的网关是可以登陆正常上网的!不显示欠费!内网远程实验室桌面,没问题,是不是有点麻烦?既然能远程,那说明可以通过代理实现网络数据的转发!网络共享,自己动手丰衣足食!

问题抽象

同一局域网内,有一台电脑可以上网,想要通过这台电脑,使得其他电脑或者移动设备可以上网

适用环境

可以上网的电脑:Windows7及以上系统,或者能够部署HTTP代理服务器的皆可

其他电脑或移动设备:安装有支持全局HTTP网络代理功能的软件,系统自带支持全局亦可

我的实际环境

可以上网的电脑:Windows 10 1703 专业版

其他电脑或移动设备:Android & Windows 10 1703 专业版 & iPhone

支持全局HTTP的软件:

Android : 系统自带的WLAN中的HTTP代理 或 Adguard(或使用手机版SSR、v2ray等可以实现全局代理流量、支持转发sock或http的app)

iPhone : 系统自带的WLAN中的HTTP代理 或 支持HTTP全局代理即可(小飞机)

Windows : SStap | Adguard

代理服务器部署:CCproxy

实现步骤

① 完成相关软件的安装

② 配置CCproxy

img

img

img

img

③ 配置需要网络的电脑或移动设备的HTTP代理

服务器地址就是可上网电脑CCproxy中绑定的内网地址

端口是CCproxy中配置HTTP的端口号

用户密码若有则是CCproxy新建的用户名与密码

若无置空即可

④ 可以上网了

结语

当然以上通过CCproxy的HTTP代理实现的网络共享,同样也可在可上网的电脑上安装node.js搭建SSR服务器,通过SStap可实现SSR的连接,但某些情况下由于有UDP的转发,性能可能不太稳定

为了实现流量的特征提取

我使用scapy实现抓包数据的读取

1
2
3
4
from scapy.all import rdpcap

a = rdpcap('target.pcap')
print(a[3])

但是print的数据却很不人性化如下:

1
b'\x00\x0c)\n\xf1\r\x00PV\xc0\x00\x08\x08\x00E\x00\x00\xa2Z\t@\x00@\x06\xb8z\xc0\xa8S\x01\xc0\xa8S\x80,]#\x8cH_\xc5\xa4L\xed0=P\x18\x01\x00\xff\x8b\x00\x00POST /getname HTTP/1.1\r\nHOST: 192.168.83.128:9100\r\ncontent-type: application/json\r\ncontent-length: 17\r\n\r\n{"name":"kslaaa"}'

这哪是人看的

所以需要加上一个参数

mysummary,如下

1
2
3
4
from scapy.all import rdpcap

a = rdpcap('target.pcap')
print(a[3].mysummary)

print出来如下,咳咳,稍微有点人性化,至少可以处理了

1
<bound method Ether.mysummary of <Ether  dst=00:0c:29:0a:f1:0d src=00:50:56:c0:00:08 type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=162 id=23049 flags=DF frag=0 ttl=64 proto=tcp chksum=0xb87a src=192.168.83.1 dst=192.168.83.128 |<TCP  sport=11357 dport=9100 seq=1214236068 ack=1290612797 dataofs=5 reserved=0 flags=PA window=256 chksum=0xff8b urgptr=0 |<Raw  load='POST /getname HTTP/1.1\r\nHOST: 192.168.83.128:9100\r\ncontent-type: application/json\r\ncontent-length: 17\r\n\r\n{"name":"kslaaa"}' |>>>>>

初次尝试编写的支持向量机实例
鸢尾花二属性支持向量分类也比较适合我这种新手
网上有人多写过,但是我尝试这写时才发现有一堆问题
不知是版本问题还是模块方法被废弃了
几经波折整理出能正常运行的python代码
环境为python3.7


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
# -*- coding:utf-8 -*-

import numpy as np
from sklearn import svm
from sklearn.model_selection import train_test_split
import matplotlib as mpl
from matplotlib import colors
import matplotlib.pyplot as plt


def iris_type(s):
it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
return it[s]


def show_accuracy(a, b, tip):
acc = a.ravel() == b.ravel()
print(tip + '正确率:', np.mean(acc))


path = 'iris.data'
data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

# 将Iris分为训练集与测试集
# split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))
x, y = np.split(data, (4,), axis=1)
# x取样本X的所有行和前两列,进行特征向量训练
x = x[:, :2]
# train_test_split(train_data,train_target,test_size=数字, random_state=0)
# train_data:所要划分的样本特征集
# train_target:所要划分的样本结果
# test_size:样本占比,如果是整数的话就是样本的数量
# random_state:是随机数的种子
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.6, test_size=0.4, random_state=1)

# 训练svm分类器
# kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。
# kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续
# gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。
# ecision_function_shape='ovr'时,为one v rest
# 即一个类别与其他类别进行划分,
# decision_function_shape='ovo'时,为one v one
# 即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())

# 计算svc分类器的准确率
print(clf.score(x_train, y_train)) # 精度
y_hat = clf.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print(clf.score(x_test, y_test))
y_hat = clf.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')

# print('decision_function:\n', clf.decision_function(x_train))
# print('\npredict:\n', clf.predict(x_train))

x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围
x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围
x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] # 生成网格采样点
grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点
grid_hat = clf.predict(grid_test) # 预测分类值
grid_hat = grid_hat.reshape(x1.shape)

# 指定默认字体
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 绘制
cm_light = colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = colors.ListedColormap(['g', 'r', 'b'])
plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)
plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), edgecolors='k', s=50, cmap=cm_dark) # 样本
plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10) # 圈中测试集样本
plt.xlabel(u'花萼长度', fontsize=13)
plt.ylabel(u'花萼宽度', fontsize=13)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.title(u'鸢尾花SVM二特征分类', fontsize=15)
plt.show()

方便没有数据的小伙伴,以下数据直接复制到iris.data中即可

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
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica

额,这个问题之前也遇到几次,后来莫名其妙变好了

我就没深究


最近写代码又出现了这种情况

就是敲了个快捷键,就变成

img

后来发现是IDE的快捷键和输入法快捷键冲突了


解决方法:

按一下 shift+空格键 就好啦~

前提:

1、虚拟机中已成功安装Oracle数据库

2、配置了监听器

3、下载安装PLSQL

好了,直接进入正题

第一步:安装instantclient

安装甲骨文提供的instantclient作为本地电脑的配置客户端

这里也提供一个官网的传送门下载页面 ,可以根据需要下载

该客户端解压即可用

第二步:配置instantclient

我提供的资源则直接修改配置即可,从官网down下来的客户端是没有network文件夹的

需要在文件夹中新建一个network文件夹以及子文件夹admin(也可以不建)

从安装了oracle数据库的服务端目录product\11.2.0\client_1\network\admin中拷贝一份tnsnames.ora文件

tnsnames.ora文件放入network文件夹中

以下是我的tnsnames.ora配置仅供参考:

1
2
3
4
5
6
7
8
9
10
11
12
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0.4/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)

以文本格式打开tnsnames.ora,前面两行注释不用管,

PROTOCOL是远程监听器的协议类型,

HOST是远程服务器地址,PORT自然是端口

SERVICE_NAME则是你远程数据库的实例名称,默认安装的话是ORCL

如果是安装在虚拟机中的数据库,连接时记得关闭虚拟机防火墙

到这里instantclient就配置完了

第三步:配置PLSQL

打开PLSQL,关闭登录界面直接进入软件界面

Configure > Preferences > 连接

找到右侧面板中的Oracle主目录名和OCI

Oracle主目录名中填入instantclient的解压地址

OCI库则是填入instantclient的解压地址/oci.dll,也就是定位到OCI类库

类似于我这样:

20181025114415144

确认并重启PLSQL

此时的登录界面就可以检测到在tnsnames.ora中配置的数据库实例了

输入对应的用户名密码即可登录数据库,收工!

最近开始学习python,使用Pycharm编辑器进行学习过程中却发现:

打开一个新的py文件,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模式,并且选中的文字无法通过键盘输入直接替换或删除,只能一个一个删除再写。。。

img

于是闲着无聊时,去翻了翻前辈们的博文,终于发现,是那个第一次安装Pycharm时推荐我安装的仿Vim插件搞的鬼~~

所以如果遇到以上情况只要跑去工具栏中,把Tools下的Vim Emulator勾选状态去掉即可,我的天,这算是给自己挖的坑吗。。。

上一节已经应该熟悉了终端的基本操作,这一节将执行更多的命令。

1 添加用户组与用户

接着上一节,首先完成用户组和用户的添加,以root账号登陆系统,打开终端,输入以下命令

1
2
3
4
groupadd oinstall
groupadd dba
useradd -g oinstall -g dba -m oracle
passwd oracle #该命令会让你两次确认密码

然后创建相关目录,并给用户赋予访问修改权限

1
2
3
4
mkdir  -p  /data/app/oracle/product/11.2.0.1
mkdir -p /home/{OracleData,OracleArch/ArchiveLog,OracleBack/{rmanbak,expdpbak,ArchiveLogBak}}
chown -R oracle:oinstall /data/app/ /home/Oracle*
chmod -R 775 /data/app/ /home/Oracle*

接下来就是这一节的主要部分了,首先要知道的是,当通过vi命令打开文件后,按 i 可以进入编辑状态

当编辑完要退出时,先按键盘左上方Esc键,然后输入冒号,再输入wq完成编辑保存退出

例如:

1
2
vi test.txt   #进入编辑模式
:wq 回车 保存编辑的文件

2 配置Oracle相关参数

2.1 设置用户安全参数

打开root终端输入以下命令

vim /etc/security/limits.conf

在文件末尾添加

1
2
3
4
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 4096
oracle hard nofile 65536

2.2 将用户安全参数添加到会话执行中

root终端输入以下命令

vim /etc/pam.d/login

在文件末尾添加

1
2
session required /lib64/security/pam_limits.so
session required pam_limits.so

2.3 配置用户参数初始化逻辑

root终端输入以下命令

vim /etc/profile

在文件末尾的done后添加如下

1
2
3
4
5
6
7
8
if [ $USER = "oracle" ];then
if [ $SHELL = "/bin/ksh" ];then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

保存退出后执行以下命令,完成加载配置

source /etc/profile

2.4 配置oracle用户的环境变量

在终端使用su oracle命令可以实现终端用户的转换

oracle终端输入以下命令

vim ~/.bash_profile

在文件末尾添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#alias sqlplus='rlwrap sqlplus'  
#alias rman='rlwrap rman'
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_BASE=/data/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.1
export EDITOR=/usr/bin/vim
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:/usr/bin:$PATH
export PATH=$PATH:/usr/bin/:/bin:/usr/bin/X11:/usr/local/bin
export PATH=$PATH:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/usr/local/lib:$ORACLE_HOME/oracm/lib:$ORACLE_HOME/lib
export LIBPATH=$LIBPATH:$ORA_CRS_HOME/lib:$ORACLE_HOME/lib
export CLASSPATH=$CLASSPATH:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/jlib:$ORACLE_HOME/network/jlib:$ORACLE_HOME/JRE

保存退出后执行source ~/.bash_profile命令,完成加载配置

2.5 修改系统标识

由于oracle默认是不可以安装到centos系统上的,所以需要修改centos的系统标识

可修改成redhat-7

root终端输入

vi /etc/redhat-release

修改原系统标识并保存退出

2.6 完成Oracle依赖包的下载

首先确保centos连接上了网络(默认连接配置即可,及虚拟机使用NAT模式,centos连接使用DHCP自动获取,windows网络适配器打开了网络共享,并且共享网络指向VM8网络适配器),你问我网络在哪儿看?下图所示,拿走不谢,记住是鼠标右击那个网络图标,至于如何知道连没连上网,终端输入ping www.baidu.com,能获取到信息就是连上了,不管连上没连上记得按 ctrl+c 退出ping的状态,不然会一直执行的

img

root终端输入以下命令

1
yum -y install binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel pdksh numactl-devel glibc-headers

img

到这里依赖包就全下载完成了,可以考虑更改成网络连接状态了

3 网络桥接的实现

3.1 创建桥接

先要保证网络适配器中有桥接网络的存在,虚拟机工具栏中点开编辑选项,选中下拉菜单中的虚拟网络编辑器(推荐先关闭虚拟机在进行操作,开着虚拟机操作时网络桥接是无法选中自动选项的)

img

如果你的虚拟网络适配器有桥接模式,可以直接跳过虚拟机的相关设置

img

赋予管理员权限之后就可以执行添加网络的操作了,添加一个网络,并在VMnet信息那一块选中桥接模式,桥到的复选框选择自动(关闭了虚拟机进行设置,默认是自动),然后点击确认即可

然后就在虚拟机设置中修改网络适配器的连接方式为桥接模式即可

3.2 centos网络配置

3.2.1 了解windows上的IPv4、DNS

windows下启动控制台,输入ipconfig/all 查看网络信息,以下是我的以太网适配器的IPv4信息
img

所以我的虚拟机网络设置要和windows处于同一个网段,也就是说必须是192.168.1.*,至于网关我推荐一致就行,以下是我的网络连接的设置,仅供参考

192.168.1.120 255.255.255.0 192.168.1.1 DNS:192.168.1.1
img

设置完成后使用centos中的终端和windows终端都ping一下看看是否都能连接

img

img

到这里网络设置,呸,到这里网络设置刚刚开始

设置完以上的连接信息后,/etc/sysconfig/network-scripts目录下的ifcfg-eth0文件中的ONBOOT属性默认就是yes了,不需要再去修改了

3.2.2 关闭防火墙

root终端中输入以下命令

1
2
service  iptables  stop  
chkconfig iptables off
3.2.3 关闭selinux

这里我也不清楚为啥要关闭,不过大家都关了,我也就关了,中国式扎堆嘛

root终端输入以下命令

vim /etc/selinux/config

按 i 键进入编辑状态,将SELINUX属性设为disabled

3.2.4 设置centos的host文件

root终端输入以下命令

vim /etc/hosts

在host文件中插入一行,用于DNS解析主机地址,前面的地址是centos的IPv4地址,后面的centos是之前安装系统时设定的主机名,这样设置可以使oracle的监听器启动的更快

192.168.1.120 centos

img

3.2.5 添加主机连接参数

root终端输入以下命令

vim /etc/sysctl.conf

在文件末尾添加

1
2
3
4
5
6
7
8
9
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

img

保存退出后,使用命令sysctl -p完成加载配置,到这里网络配置就算结束了

4.解压安装包,运行安装程序

4.1 解压安装包

注销当前root账户,切换到oracle账户进行登录

通过拖拽,将windows中下载的linux版的两个oracle数据库压缩包传输到/home/oracle/soft目录下(soft当然是自己建的文件夹啊),使用unzip命令进行解压

打开oracle终端输入以下命令

1
2
3
cd /home/oracle/soft
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip

执行完成后soft文件夹中会有一个database文件夹,推荐解压完重启虚拟机

重启完成后先输入xhost +,如果出现提示access control disabled, clients can connect from any host,则切换到

oracle终端进行操作

4.2 运行安装程序

为防止中文乱码,使用英文模式执行安装程序,oracle终端输入以下命令

1
2
3
cd database
export LANG=en_us
./runInstaller

如果之前的分区按照我的推荐来的话,不会因为内存问题卡在这里,就会显示Please wait

然后就是常规的安装数据库了,指定数据库安装路径时如下图即可

img

接着就是一路根据需要选择,一路next了,遇到第18步时勾上Ignore All即可,因为我们安装的包版本是新的,而第18步只认版本不认包,所以忽略就行

img

当然了安装到最后时需要在终端执行两行命令,就是遇到下图的弹窗时:

img

而执行的命令就是弹窗中显示的那两行

打开终端切换到root终端,输入以下命令

1
2
/data/app/oraInventory/orainstRoot.sh
/data/app/oracle/product/11.2.0.1/root.sh

到这里安装就完成了

接下来配置监听器,终端输入以下命令

1
2
export LANG=en_us
netca

img

img

img

img

img

img

然后点击next,最后点击finish退出配置监听器界面,完成配置

测试监听器:

打开监听器:lsnrctl start (默认启动监器LISTENER,如果启动非LISTENER则使用lsnrctl start XXXX命令,XXXX是监听器名字)

查看1521接口侦测情况:netstat -ant|grep 1521

连接:sql /nolog

连接权限:connect / as sysdba

立即关闭服务:shutdown immediate

启动服务:startup

退出SQL:exit

关闭监听器:lsnrctl stop

功能测试无误,这一次记录到此完结,至于在windows上使用PLSQL连接到虚拟机中的该Oracle的指导记录,如果有空闲的话会考虑写一篇文章的。

此记录+教学的文章中用到的很多命令都是我在网上学习借鉴的,再次感谢前辈大神们的文章,此文中也包含了许多我个人的理解,如果有错,多多包涵。

只要跟着我的步骤一步一步来,是肯定可以搭建成功的,最容易出问题的是忽视了root终端与oracle终端的切换,细节决定成败!祝你们好运!

0%