《网络程序设计》署名博客
完成一篇署名博客,博客内容至少包括课程学习心得总结、通过commit/pr等说明自己的功劳和苦劳、提供自己的版本库URL并附上安装运行方法和Demo过程截图、其他重要事项等。
目录
课程学习心得总结
commitpr
109 报告展示页面接受
165 提升预测准确度拒绝
216 将A3集成到A2中接受
245 将用户修正的数值更新到数据库中未处理
辅助诊断系统
课程学习心得总结
一、图像处理算法
预处理
在获取到上传的血常规化验单图片后,项目中对其进行了预处理,作用主要是为了减小噪声,为后边的识别算法服务,在这里主要用到了以下两个方法:
a)高斯平滑
img_gb = cv2.GaussianBlur(img_gray, (gb_param, gb_param), 0)
b)腐蚀、膨胀
closed = cv2.morphologyEx (img_gb, cv2.MORPH _CLOSE, kernel)
opened = cv2.morphologyEx (closed, cv2.MORPH _OPEN, kernel)
线段检测
为了对图片各个数值所在的区域进行定位,这里需要检测出图片中比较明显的标识,3条黑线,然后利用这三条线对整张图片进行标定。主要用到了以下3个步骤:
a)Canny边缘检测
edges = cv2.Canny(opened, canny_param_lower , canny_param_upper)
b)轮廓提取
contours, hierarchy = cv2.findContours (edges, cv2.RETR _TREE, cv2.CHAIN _APPROX_SIMPLE)
c)求最小外接矩形
def getbox (i) :
rect = cv2.minAreaRect(contours[i])
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)
return box
OCR
这里主要利用OCR对血常规报告中的字符进行识别,得到具体的数值,用于后续的预测。其中步骤主要是根据上边求得的三条线段对图片进行透射变换,根据标定好的像素位置,利用pytesseract进行字符识别。
a)透射变换
points = np.array([[line_upper[0 ][0 ], line_upper[0][1]], [line_ upper[1 ][0 ], line_upper[1 ][1 ]],
[line_lower[0][0], line_lower[0][1]], [line_lower[1][0], line_lower[1][1]]],np.float32)
standard = np.array([[0,0], [1000, 0], [0, 760], [1000, 760]],np.float32)
PerspectiveMatrix = cv2.getPerspectiveTransform(points,standard)
self.PerspectiveImg = cv2.warpPerspective(self.img, PerspectiveMatrix, (1000, 760))
b)截图
def autocut (self, num, param=default) :
if self.PerspectiveImg is None :
self.PerspectivImg = self.filter(param)
if self.PerspectiveImg is None :
return -1
img_age = self.PerspectiveImg[15 : 70 , 585 : 690 ]
cv2.imwrite(self.output_path + 'age.jpg' , img_age)
img_gender = self.PerspectiveImg[15 : 58 , 365 : 420 ]
cv2.imwrite(self.output_path + 'gender.jpg' , img_gender)
img_time = self.PerspectiveImg[722 : 760 , 430 : 630 ]
cv2.imwrite(self.output_path + 'time.jpg' , img_time)
startpoint = [199 , 132 ]
vertical_lenth = 37
lateral_lenth = 80
def getobjname (i, x, y) :
region_roi = self.PerspectiveImg[y : y+vertical_lenth, x : x+170 ]
filename = self.output_path + 'p' + str(i) + '.jpg'
cv2.imwrite(filename, region_roi)
def getobjdata (i, x, y) :
region_roi = self.PerspectiveImg[y : y+vertical_lenth, x : x+lateral_lenth]
filename = self.output_path + 'data' + str(i) + '.jpg'
cv2.imwrite(filename, region_roi)
if num <= 13 and num > 0 :
for i in range(num):
getobjname(int(i), 25 , startpoint[1 ])
getobjdata(int(i), startpoint[0 ], startpoint[1 ])
startpoint[1 ] = startpoint[1 ] + 40
elif num > 13 :
for i in range(13 ):
getobjname(int(i), 25 , startpoint[1 ])
getobjdata(int(i), startpoint[0 ], startpoint[1 ])
startpoint[1 ] = startpoint[1 ] + 40
startpoint = [700 , 135 ]
for i in range(num-13 ):
getobjname(int(i+13 ), 535 , startpoint[1 ])
getobjdata(int(i+13 ), startpoint[0 ], startpoint[1 ])
startpoint[1 ] = startpoint[1 ] + 40
return 0
c)pytesseract
for i in range(num ):
item = read ('temp_pics/p' + str(i) + '.jpg' )
item_num = classifier.getItemNum(item )
image = read ('temp_pics/data' + str(i) + '.jpg' )
image = imgproc.digitsimg(image)
digtitstr = image_to_string(image)
digtitstr = digtitstr.replace (" " , '' )
digtitstr = digtitstr.replace ("-" , '' )
digtitstr = digtitstr.strip("." )
data['bloodtest' ][item_num]['value' ] = digtitstr
json_data = json.dumps(data,ensure_ascii=False,indent=4 )
二、机器学习算法
本门课程主要聚焦点是机器学习,尤其是深度学习,所以从中我主要初步了解了数据预处理、卷积神经网络、以及TensorFlow的初步使用。
1. 数据预处理
为了提高机器学习的准确程度,避免由于数据本身的数值不统一等对学习结果造成影响,需要对样本集进行一定的预处理。在本门课程中,我用到的预处理方法主要是去均值与归一化。
a)去均值
去均值的具体做法是在每个样本上减去数据的统计平均值,去均值的意义主要在于扩大分类的效果。查看TensorFlow的MNIST源码时可以看到,程序中对每个像素点的像素值都减去了128,这就是去均值操作。
b)归一化
数据尺度归一化的原因是:数据中每个维度表示的意义不同,所以有可能导致该维度的变化范围不同,因此有必要将他们都归一化到一个固定的范围,一般情况下是归一化到[0 1]或者[-1 1]。同样在TensorFlow的MNIST源码中可以看到,去均值后,会将每点的像素值除以128,进行了归一化操作。 下边是我在本门课程中写的去均值与归一化代码,a是训练集,b是需要预测的一组样本。返回结果是去均值与归一化之后的样本b。
def normalized(a ,b):
for i in range(22 ):
tmp = np.mean(a [:, i])
a [:, i] = a [:, i] - tmp
b[:, i] = b[:, i] - tmp
if np.min (a [:, i]) != np.max (a [:, i]):
b[:, i] = 2 * (b[:, i] - np.min (a [:, i])) / (np.max (a [:, i]) - np.min (a [:, i])) - 1
else :
b[:, i] = 0
return b
2.卷积神经网络 a)神经网络
人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。 常常会看到前馈神经网络(feedforward neural network)以及BP(back propagation)神经网络,个人的理解是这是同一种神经网络,都是普通的神经网络模型。前馈就是信号向前传递的意思。BP网络的前馈表现为输入信号从输入层(输入层不参加计算)开始,每一层的神经元计算出该层各神经元的输出并向下一层传递直到输出层计算出网络的输出结果,前馈只是用于计算出网络的输出,不对网络的参数进行调整。误差反向传播用于训练时网络权值和阈值的调整。网络前向传播计算出来的结果与实际的结果存在误差,在离线训练时,这时网络采用批量训练方法计算出整个样本数据的总误差,然后从输出层开始向前推,一般采用梯度下降法逐层求出每一层神经元的阈值和权值的调增量,循环迭代到网络参数符合要求停止。
b)卷积神经网络概述
使用浅层的神经网络处理高维的数据或大尺寸的图片时,由于层与层之间是全连接的,就会导致网络中需要训练的参数个数很大,以致于无法训练。为了避免这个问题,一方面可以靠一些先验的经验对图片或者高维数据的特征进行选取后,再输入神经网络中,这样子可能会忽视掉一些特征,而且也比较依赖于设计者的经验。另一方面,可以对神经网络进行一些修改,使之在保持训练准确度的前提下,依然尽可能地保持高维数据的所有特征,这就是卷积神经网络。 卷积神经网络的主要是普通神经网络的变式,在层的功能和形式上做了一些变化,使之能够处理大尺寸的图片,而且不需要人为的提取特征。在卷积神经网络中,与普通神经网络的主要区别是增加了卷积层与池化层,一个典型的卷积神经网络模型如下图所示:
c)卷积层
传统神经网络中,一个神经元会对整幅图都有权重,而这里是一个神经元只对一个窗口有权重,然后窗口会遍历整幅图,但是权重是共享的。这个一组固定权重和不同窗口内数据做内积的过程就是卷积,这样子就各个神经元分别关注了不同维度的信息。 卷积层带来的好处参数个数有所下降,提升训练的可执行性。
d)池化层
池化层主要作用是减少过拟合。过拟合在实际操作中很容易发生,主要是在训练中准确率很高,但在测试中准确率确很一般的情况,可能是因为样本较少,参数数量较大所致。所以这里设置一个池化层,主要是对前一层的数据进行最大值采样或平均值采样,然后降维,减少参数数量。
e)LeNet-5
LeNet-5是一个典型的卷积神经网络模型,它是由Yann Lecun在Gradient-based learning applied to document recognition. Proceedings of the IEEE, november 1998中提出的,可以称为卷积神经网络的鼻祖。模型结构如图所示:
从图中可以看到,LeNet-5是由卷积层1,下采样(池化)层2,卷积层3,下采样(池化)层4,卷积层5,全连接层6,输出层构成的。为了印证前边对卷积神经网络的理解,下边进行各层参数的推导: 卷积层1的神经元个数是6,卷积窗口大小为5*5,滑动步长为1,不采用补零,所以当输入1张32*32的图片后,经过卷积层1,得到6张28*28的feature maps。 下采样层2的窗口大小为2*2,滑动步长为2,卷积层1的输出经过下采样层后,变为6张14*14的feature maps。 卷积层3的神经元个数是16,卷积窗口大小为5*5,滑动步长为1,不采用补零,所以当输入6张14*14的feature maps后,经过卷积层3,得到16张10*10的feature maps。 下采样层4的窗口大小为2*2,滑动步长为2,卷积层,3的输出经过下采样层后,变为16张5*5的feature maps。 卷积层5的神经元个数是120,卷积窗口大小为5*5,滑动步长为1,不采用补零,所以当输入16张5*5的feature maps后,经过卷积层5,得到120张1*1的feature maps。也就是120*1的向量 全连接层6的神经元个数为84,接受卷积层5的120*1的输入后,输出为84*1。 输出层的神经元个数为10,接受全连接层6的84*1的输入后,输出为10*1,即为一个one-hot矩阵,矩阵中的每个值代表了输入图片为对应数字的概率。
f)神经网络调参
调参在神经网络的训练中占了很大的比重,有各种各样的小tricks。在本门课程中,为了提高年龄、性别的预测准确度,本人初步尝试了一些基本的调参。主要包括数据预处理、网络结构、激活函数、损失函数、优化方法等。取得一定的准确度提升,但是还任重而道远。
3. 深度学习平台
为了实现上述的机器学习算法,需要选择一个深度学习的平台。在这里我选择的是TensorFlow。对于我们学习来说,TensorFlow的主要优点是文档齐全,更容易找到相关的demo和出现bug的解决方法。 在本课程中,学习了TensorFlow的基本使用,基本的使用流程如下:
a) 读取数据为ndarray类型
data = np.loadtxt(open("./data.csv" ,"rb" ),delimiter="," ,skiprows=0 )
tmp = normalized(data[:,2 :])
tmp_label_sex = one_hot(data[:,0 :1 ],data.shape[0 ])
train_label_sex = tmp_label_sex[:1858 , :]
test_label_sex = tmp_label_sex[1858 :, :]
train_data = tmp[:1858 ,:]
test_data = tmp[1858 :,:]
b) 定义模型(各层结构,损失,优化方法)
x = tf.placeholder("float" , [None , n_input])
y = tf.placeholder("float" , [None , n_classes])
keep_prob = tf.placeholder("float" )
def multilayer_perceptron (x, weights, biases) :
layer_1 = tf.add(tf.matmul(x, weights['h1' ]), biases['b1' ])
layer_1 = tf.nn.relu(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights['h2' ]), biases['b2' ])
layer_2 = tf.nn.relu(layer_2)
out_layer = tf.matmul(layer_2, weights['out' ]) + biases['out' ]
return out_layer
weights = {
'h1' : tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2' : tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out' : tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
'b1' : tf.Variable(tf.random_normal([n_hidden_1])),
'b2' : tf.Variable(tf.random_normal([n_hidden_2])),
'out' : tf.Variable(tf.random_normal([n_classes]))
}
pred = multilayer_perceptron(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
c) 训练
with tf.Session() as sess:
sess.run (init)
for epoch in range(2000 ):
_, c = sess.run ([optimizer, cost], feed_dict={x: train_data, y: train_label_sex})
d) 保存模型
saver = tf.train .Saver ()
save_path = saver.save (sess, "./model_sex/sex.ckpt" , write_meta_graph=None)
e) 恢复模型
saver.restore (sess1, "./model_sex/sex.ckpt" )
f) 预测
p = sess1.run(pred, feed_dict={x: data_predict})
三、Web相关
这门课程名为《网络程序设计》,目标是完成一个Web系统,所以在这之中,除了项目的关注点机器学习,我还学到了一部分Web相关的知识。
Vue.js
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件[1] 。 Vue.js 自身不是一个全能框架——它只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。另一方面,在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动复杂的单页应用。 在本项目中,利用Vue.js对数据进行绑定,以表格的左半边为例
data : {
report_items_left : new Array() ,
report_items_right: new Array() ,
},
for (var i = 0
if(i<13 ){
report.report _items_left.push ({
count: i+1 ,
name: json_data.bloodtest [i]["name" ],
alias: json_data.bloodtest [i].alias ,
value: json_data.bloodtest [i].value ,
range: json_data.bloodtest [i].range ,
unit: json_data.bloodtest [i].unit
})
}
}
<table id = "table_left " class ="table table-inverse table-hover table-bordered" >
<thead >
<tr >
<th > th >
<th > 检测项目th >
<th > 结果th >
<th > 参考范围th >
<th > 单位th >
tr >
thead >
<tbody >
<tr v-for ="item in report_items_left" >
<td > {{ item.count }} td >
<td > {{ item.name }} td >
<td >
<input type ="text" v-model ="item.value" class ="form-control" placeholder ="检测值" />
td >
<td > {{ item.range }} td >
<td > {{ item.unit }} td >
tr >
tbody >
table >
然后当用户在界面修改后,因为已经绑定,只需要直接调用data,即可获取到相关值
data [i] = Number (this .report_items_left [i ].value ) ;
Flask
Flask是Python下的一个轻量级Web框架,主要用于处理前端的http请求。
首先在运行时启动服务器:
app = Flask(__name__, static_url_path="" )
app.config.from_object('config ')
app.run(host=app.config['SERVER_HOST '], port =app.config['SERVER_PORT '])
然后在前端利用Ajax就可以访问到后端的对应函数
url = 'report/' + url.split('/' )[2 ];
$.ajax({
url: url,
success: function (data) {
在后端接受前端的http访问请求
@app.route('/report/')
def get_report (fid) :
try :
file = db.files.find_one(bson.objectid.ObjectId(fid))
MongoDB
在本课程中,用到的数据库是MongoDB,主要用于将矫正后的图片与OCR识别结果存入数据库中
首先是打开服务器的时候连接数据库
db = MongoClient(app.config['DB_HOST' ], app.config['DB_PORT' ]).test
在上传图片后,将校正后的图片以及识别到的各项数值存入数据库中
c = dict(report_data=report_data, content=bson.binary .Binary (content.getvalue ()), filename=secure_filename(f.name ),
mime=mime)
db.files .save (c)
也可利用fid,进行结果查询
try :
file = db.files.find_one(bson.objectid.ObjectId(fid))
if file is None:
raise bson.errors.InvalidId()
print 'type before transform:\n' , type (file ['report_data' ])
report_data = bson.json_util.dumps(file ['report_data' ])
commit/pr
1. #109 报告展示页面(接受)
原本的表格是并没有分成两边,直接22行数据下来,老师在群里边说希望修改为图片的格式,便于比对,于是我将表格分成了左右两边,分别显示左右两边的数据
id= "table_left" class ="table table-inverse table-hover table-bordered" >
id= "table_right" class ="table table-inverse table-hover table-bordered" >
//先清空表格内容
$("#table_left tr:not(:first)" ).empty ()
$("#table_right tr:not(:first)" ).empty ()
for (var i = 0
if(i<13 ){
report.report _items_left.push ({
count: i+1 ,
name: json_data.bloodtest [i]["name" ],
alias: json_data.bloodtest [i].alias ,
value: json_data.bloodtest [i].value ,
range: json_data.bloodtest [i].range ,
unit: json_data.bloodtest [i].unit
})
}
else {
report.report _items_right.push ({
count: i+1 ,
name: json_data.bloodtest [i]["name" ],
alias: json_data.bloodtest [i].alias ,
value: json_data.bloodtest [i].value ,
range: json_data.bloodtest [i].range ,
unit: json_data.bloodtest [i].unit
})
}
2. #165 提升预测准确度(拒绝)
数据预处理—去均值、归一化
这里对样本数据进行了预处理,提高了预测的准确度。
预处理部分的代码如下:
def normalized(a ):
for i in range(n_input):
a [:, i] = a [:, i] - np.mean(a [:, i])
if np.min (a [:, i]) != np.max (a [:, i]):
a [:, i] = 2 * (a [:, i] - np.min (a [:, i])) / (np.max (a [:, i]) - np.min (a [:, i])) - 1
else :
a [:, i] = 0
return a
简化读取数据方式
本项目数据量较低,不需要队列,batch之类的操作,可以直接直接以ndarray格式读取样本的数据。
原本的代码为:
def write_to_tensor (name, csv_name) :
if os.path.exists(name):
return
csv_file = csv.reader(open(cwd + '/' + csv_name, 'rb' ))
writer = tf.python_io.TFRecordWriter(name)
for line in csv_file:
if not line:
break
if len(line) is not 29 :
continue
index = [int(line[1 ])]
data = map(float, line)[3 :29 ]
example = tf.train.Example(features=tf.train.Features(feature={
"label" : tf.train.Feature(int64_list=tf.train.Int64List(value=index)),
'content' : tf.train.Feature(float_list=tf.train.FloatList(value=data))
}))
print data, index
writer.write(example.SerializeToString())
writer.close()
def read_and_decode (filename) :
filename_queue = tf.train.string_input_producer([filename])
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(serialized_example,
features={
'label' : tf.FixedLenFeature([], tf.int64),
'content' : tf.FixedLenFeature([26 ], tf.float32),
})
data = tf.cast(features['content' ], tf.float32)
label = tf.cast(features['label' ], tf.int32)
return data, label
write_to_tensor('train_sex.tfrecords' , 'train.csv' )
write_to_tensor('predict_sex.tfrecords' , 'predict.csv' )
train_img, train_label = read_and_decode("train_sex.tfrecords" )
test_img, test_label = read_and_decode("predict_sex.tfrecords" )
经过简化后,读取数据部分的代码为:
data = np.loadtxt(open("./data.csv" ,"rb" ),delimiter="," ,skiprows=0 )
tmp = normalized(data[:,2 :])
tmp_label_sex = one_hot(data[:,0 :1 ],data.shape[0 ])
train_label_sex = tmp_label_sex[:1858 , :]
test_label_sex = tmp_label_sex[1858 :, :]
train_data = tmp[:1858 ,:]
test_data = tmp[1858 :,:]
但由于准确率未达到70%,以及使用了数据集版本与线上的稍有不同,本次pull request请求被拒绝。
3. #216 将A3集成到A2中(接受)
3.1 根据图片中的项,选取了测试数据集中的对应项,按照图片的顺序,重新进行了模型的训练
3.2 前后端传值
"button" v-on:click="test()" class="btn btn-primary btn-lg btn-block" >predict
test: function(event ) {
data = [];
for (var i=0 ;i<13 ;i++)
data[i] = Number(this .report_items_left[i].value );
for (var i=0 ;i<9 ;i++)
data[13 +i] = Number(this .report_items_right[i].value );
var data = {
data: JSON.stringify(({
"value" :data
}))
};
$.ajax({
url: "/predict" ,
type: 'POST' ,
data: data,
success: function(data) {
var obj = JSON.parse(data)
if (obj.sex == 1 )
var sexsex = "男" ;
else
var sexsex = "女"
alert("性别:" + sexsex + "\n年龄:" + obj.age);
}
})
}
@app.route("/predict" , methods=['POST' ])
def predict():
print ("predict now!" )
data = json.loads(request.form.get ('data' ))
ss = data['value' ]
arr = numpy.array(ss)
arr = numpy.reshape(arr, [1 , 22 ])
sex, age = tf_predict.predict(arr)
result = {
"sex" :sex,
"age" :int (age)
}
return json.dumps(result)
3.3 预测
def normalized (a,b) :
for i in range(22 ):
tmp = np.mean(a[:, i])
a[:, i] = a[:, i] - tmp
b[:, i] = b[:, i] - tmp
if np.min(a[:, i]) != np.max(a[:, i]):
b[:, i] = 2 * (b[:, i] - np.min(a[:, i])) / (np.max(a[:, i]) - np.min(a[:, i])) - 1
else :
b[:, i] = 0
return b
def predict (data_predict) :
tf.reset_default_graph()
data_nor = np.loadtxt(open("./data.csv" , "rb" ), delimiter="," , skiprows=0 )
data_predict = normalized(data_nor[:, 2 :], data_predict)
'''
参数
'''
learning_rate = 0.005
display_step = 100
n_input = 22
n_hidden_1_age = 32
n_hidden_2_age = 16
n_classes_age = 1
n_hidden_1_sex = 16
n_hidden_2_sex = 8
n_classes_sex = 2
data = np.loadtxt(open("./data.csv" , "rb" ), delimiter="," , skiprows=0 )
'''
建立年龄模型
'''
x_age = tf.placeholder("float" , [None , n_input])
y_age = tf.placeholder("float" , [None , n_classes_age])
def multilayer_perceptron_age (x_age, weights_age, biases_age) :
layer_1 = tf.add(tf.matmul(x_age, weights_age['h1' ]), biases_age['b1' ])
layer_1 = tf.nn.relu(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights_age['h2' ]), biases_age['b2' ])
layer_2 = tf.nn.relu(layer_2)
out_layer = tf.matmul(layer_2, weights_age['out' ]) + biases_age['out' ]
return out_layer
weights_age = {
'h1' : tf.Variable(tf.random_normal([n_input, n_hidden_1_age])),
'h2' : tf.Variable(tf.random_normal([n_hidden_1_age, n_hidden_2_age])),
'out' : tf.Variable(tf.random_normal([n_hidden_2_age, n_classes_age]))
}
biases_age = {
'b1' : tf.Variable(tf.random_normal([n_hidden_1_age])),
'b2' : tf.Variable(tf.random_normal([n_hidden_2_age])),
'out' : tf.Variable(tf.random_normal([n_classes_age]))
}
pred_age = multilayer_perceptron_age(x_age, weights_age, biases_age)
'''
建立性别模型
'''
x_sex = tf.placeholder("float" , [None , n_input])
y_sex = tf.placeholder("float" , [None , n_classes_sex])
def multilayer_perceptron_sex (x_sex, weights_sex, biases_sex) :
layer_1 = tf.add(tf.matmul(x_sex, weights_sex['h1' ]), biases_sex['b1' ])
layer_1 = tf.nn.relu(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights_sex['h2' ]), biases_sex['b2' ])
layer_2 = tf.nn.relu(layer_2)
out_layer = tf.matmul(layer_2, weights_sex['out' ]) + biases_sex['out' ]
return out_layer
weights_sex = {
'h1' : tf.Variable(tf.random_normal([n_input, n_hidden_1_sex])),
'h2' : tf.Variable(tf.random_normal([n_hidden_1_sex, n_hidden_2_sex])),
'out' : tf.Variable(tf.random_normal([n_hidden_2_sex, n_classes_sex]))
}
biases_sex = {
'b1' : tf.Variable(tf.random_normal([n_hidden_1_sex])),
'b2' : tf.Variable(tf.random_normal([n_hidden_2_sex])),
'out' : tf.Variable(tf.random_normal([n_classes_sex]))
}
pred_sex = multilayer_perceptron_sex(x_sex, weights_sex, biases_sex)
'''
共同的初始化
'''
saver = tf.train.Saver()
init = tf.global_variables_initializer()
with tf.Session() as sess:
saver.restore(sess, "./model.ckpt" )
print ("load model success!" )
p_sex = sess.run(pred_sex, feed_dict={x_sex: data_predict})
p_age = sess.run(pred_age, feed_dict={x_age: data_predict})
if p_sex[0 ][0 ] > p_sex[0 ][1 ]:
sex_result = 1
else :
sex_result = 0
age_result = p_age[0 ][0 ] * 50 +50
return sex_result,age_result
4. #245 将用户修正的数值更新到数据库中(未处理)
在预测中,将该份报告在数据库中的id一并传回后端,用于更新时查询
url = $("#filtered-report" ).attr("src" );
if (url == null ) {
alert("请上传报告" );
return ;
}
url = 'predict/' + url.split('/' )[2 ];
$.ajax({
url: "/predict" ,
url: url,
@app.route('/predict/', methods=['POST'])
def predict (fid) :
用户在前端对识别到的数值更正后,进行预测,把数值的更正更新到此前生成的数据库记录中
def update_report (fid,ss) :
with open('bloodtestdata.json' ) as json_file:
data = json.load(json_file)
for i in range(22 ):
data['bloodtest' ][i]['value' ] = ss[i]
json_data = json.dumps(data, ensure_ascii=False , indent=4 )
db.files.update_one({
'_id' : bson.objectid.ObjectId(fid)}, {
'$set' : {
'report_data' : json_data
}
}, upsert=False )
file = db.files.find_one(bson.objectid.ObjectId(fid))
report_data = bson.json_util.dumps(file['report_data' ])
print report_data
辅助诊断系统
版本库URL
https://coding.net/u/lys19920914/p/np2016/git
安装运行方法
运行环境
sudo apt-get install python-numpy
sudo apt-get install python-opencv
sudo apt-get install tesseract-ocr
sudo pip install pytesseract
sudo apt-get install python-tk
sudo pip install pillow
sudo pip install Flask
sudo apt-get install mongodb
sudo service mongodb started
sudo pip install pymongo
运行
cd BloodTestReportOCR
python view.py
Demo过程截图
首先定位到BloodTestReportOCR中,输入python view.py 然后打开浏览器,输入localhost:8080 上传图片后得到矫正后的图片如图 点击“生成报告”,得到OCR的结果如图所示 点击“predict”,得到预测结果
你可能感兴趣的:(2016年,网络程序设计,ustc se,SA16225161,梁昱森)
guava loadingCache代码示例
IM 胡鹏飞
Java 工具类介绍
publicclassTest2{publicstaticvoidmain(String[]args)throwsException{LoadingCachecache=CacheBuilder.newBuilder()//设置并发级别为8,并发级别是指可以同时写缓存的线程数.concurrencyLevel(8)//设置缓存容器的初始容量为10.initialCapacity(10)//设置缓存
为什么会出现“与此站点的连接不安全”警告?
当浏览器弹出“与此站点的连接不安全”的红色警告时,不仅会让访客感到不安,还可能直接导致用户流失、品牌信誉受损,甚至引发数据泄露风险。作为网站运营者,如何快速解决这一问题?一、为什么会出现“与此站点的连接不安全”警告?浏览器提示“不安全连接”,本质上是检测到当前网站与用户之间的数据传输未经过加密保护。以下是触发警告的常见原因:1.未安装SSL证书SSL(SecureSocketsLayer)证书是网
JSON 与 AJAX
Auscy
json ajax 前端
一、JSON(JavaScriptObjectNotation)1.数据类型与语法细节支持的数据类型:基本类型:字符串(需用双引号)、数字、布尔值(true/false)、null。复杂类型:数组([])、对象({})。严格语法规范:键名必须用双引号包裹(如"name":"张三")。数组元素用逗号分隔,最后一个元素后不能有多余逗号。数字不能以0开头(如012会被解析为12),不支持八进制/十六进制
C++ 11 Lambda表达式和min_element()与max_element()的使用_c++ lamda函数 min_element((1)
2401_84976182
程序员 c语言 c++ 学习
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上CC++开发知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新如果你需要这些资料,可以戳这里获取#include#include#includeusingnamespacestd;boolcmp(int
k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper
云游
docker helm helm-push
ChartMuseum是Kubernetes生态中用于存储、管理和发布HelmCharts的开源系统,主要用于扩展Helm包管理器的功能核心功能集中存储:提供中央化仓库存储Charts,支持版本管理和权限控制。跨集群部署:支持多集群环境下共享Charts,简化部署流程。离线部署:适配无网络环境,可将Charts存储在本地或局域网内。HTTP接口:通过HTTP协议提供服务,用户
深入剖析OpenJDK 18 GA源码:Java平台最新发展
想法臃肿
本文还有配套的精品资源,点击获取简介:OpenJDK18GA作为Java开发的关键里程碑,提供了诸多新特性和改进。本文章深入探讨了OpenJDK18GA源码,揭示其内部机制,帮助开发者更好地理解和利用这个版本。文章还涵盖了PatternMatching、SealedClasses、Records、JEP395、JEP406和JEP407等特性,以及HotSpot虚拟机、编译器、垃圾收集器、内存模型
Android 开源组件和第三方库汇总
gyyzzr
Android Android 开源框架
转载1、github排名https://github.com/trending,github搜索:https://github.com/search2、https://github.com/wasabeef/awesome-android-ui目录UIUI卫星菜单节选器下拉刷新模糊效果HUD与Toast进度条UI其它动画网络相关响应式编程地图数据库图像浏览及处理视频音频处理测试及调试动态更新热更新
docker-compose方式搭建lnmp环境——筑梦之路
筑梦之路
linux系统运维 国产化 docker android adb
docker-compose.yml文件#生成docker-compose.ymlcat>docker-compose.ymlnginx/conf.d/default.conf">www/index.phpecho"开始启动服务..."docker-composeup-d#获取本机ipip_addr=$(hostname-I|awk'{print$1}')echo"部署完成!"echo"访问测试页
Java大厂面试实录:谢飞机的电商场景技术问答(Spring Cloud、MyBatis、Redis、Kafka、AI等)
Java大厂面试实录:谢飞机的电商场景技术问答(SpringCloud、MyBatis、Redis、Kafka、AI等)本文模拟知名互联网大厂Java后端岗位面试流程,以电商业务为主线,由严肃面试官与“水货”程序员谢飞机展开有趣的对话,涵盖SpringCloud、MyBatis、Redis、Kafka、SpringSecurity、AI等热门技术栈,并附详细解析,助力求职者备战大厂面试。故事设定谢
Python之七彩花朵代码实现
PlutoZuo
Python python 开发语言
Python之七彩花朵代码实现文章目录Python之七彩花朵代码实现下面是一个简单的使用Python的七彩花朵。这个示例只是一个简单的版本,没有很多高级功能,但它可以作为一个起点,你可以在此基础上添加更多功能。importturtleastuimportrandomasraimportmathtu.setup(1.0,1.0)t=tu.Pen()t.ht()colors=['red','skybl
算法学习笔记:15.二分查找 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
呆呆企鹅仔
算法学习 算法 学习 笔记 考研 二分查找
在计算机科学的查找算法中,二分查找以其高效性占据着重要地位。它利用数据的有序性,通过不断缩小查找范围,将原本需要线性时间的查找过程优化为对数时间,成为处理大规模有序数据查找问题的首选算法。二分查找的基本概念二分查找(BinarySearch),又称折半查找,是一种在有序数据集合中查找特定元素的高效算法。其核心原理是:通过不断将查找范围减半,快速定位目标元素。与线性查找逐个遍历元素不同,二分查找依赖
Python 脚本最佳实践2025版
前文可以直接把这篇文章喂给AI,可以放到AI角色设定里,也可以直接作为提示词.这样,你只管提需求,写脚本就让AI来.概述追求简洁和清晰:脚本应简单明了。使用函数(functions)、常量(constants)和适当的导入(import)实践来有逻辑地组织你的Python脚本。使用枚举(enumerations)和数据类(dataclasses)等数据结构高效管理脚本状态。通过命令行参数增强交互性
(Python基础篇)了解和使用分支结构
EternityArt
基础篇 python
目录一、引言二、Python分支结构的类型与语法(一)if语句(单分支)(二)if-else语句(双分支)(三)if-elif-else语句(多分支)三、分支结构的应用场景(一)提示用户输入用户名,然后再提示输入密码,如果用户名是“admin”并且密码是“88888”则提示正确,否则,如果用户名不是admin还提示用户用户名不存在,(二)提示用户输入用户名,然后再提示输入密码,如果用户名是“adm
深入解析 TCP 连接状态与进程挂起、恢复与关闭
誰能久伴不乏
tcp/ip 网络 服务器
文章目录深入解析TCP连接状态与进程挂起、恢复与关闭一、TCP连接的各种状态1.**`LISTEN`**(监听)2.**`SYN_SENT`**(SYN已发送)3.**`SYN_RECEIVED`**(SYN已接收)4.**`ESTABLISHED`**(已建立)5.**`FIN_WAIT_1`**(关闭等待1)6.**`FIN_WAIT_2`**(关闭等待2)7.**`CLOSE_WAIT`**
基于架构的软件设计(Architecture-Based Software Design,ABSD)是一种以架构为核心的软件开发方法
ABSD方法与生命周期基于架构的软件设计(Architecture-BasedSoftwareDesign,ABSD)是一种以架构为核心的软件开发方法,强调在开发的各个阶段都要以架构为中心,确保系统的整体结构和质量属性得到有效管理。ABSD方法是一个自顶向下、递归细化的过程,软件系统的架构通过该方法得到细化,直到能产生软件构件和类。ABSD方法的三个基础功能的分解:使用基于模块的内聚和耦合技术,将
【前端】jQuery数组合并去重方法总结
在jQuery中合并多个数组并去重,推荐使用原生JavaScript的Set对象(高效简单)或$.unique()(仅适用于DOM元素,不适用于普通数组)。以下是完整解决方案:方法1:使用ES6Set(推荐)//定义多个数组constarr1=[1,2,3];constarr2=[2,3,4];constarr3=[3,4,5];//合并数组并用Set去重constmergedArray=[...
如何解决 NPM proxy, 当我们在终端nodejs应用程序时出现代理相关报错
Thisisaproblemrelatedtonetworkconnectivity.npmERR!networkInmostcasesyouarebehindaproxyorhavebadnetworksettings.在使用npminstall下载包的时候总是报以下错误:在控制台或VisualStudioCode终端中运行以下命令:npmconfigrmproxynpmconfigrmhttp
Redis Sentinel(哨兵) 和 Redis Cluster(集群)
G丶AEOM
八股 普通学习区 Redis redis 数据库 缓存
哨兵机制和集群有什么区别Redis集群主要有两种,一种是RedisSentinel哨兵集群,一种是RedisCluster。主从集群,包括一个Master和多个Slave节点,Master负责数据的读写,Slave负责数据的读取,Master上收到的数据变更会同步到Slave节点上实现数据同步,但不提供容错和恢复,在Master宕机时不会选出新的Master,导致后续客户端所有写请求直接失败。所以
CentOS7环境卸载MySQL5.7
Hadoop_Liang
mysql 数据库 mysql
备份重要数据切记,卸载之前先备份mysql重要的数据。备份一个数据库例如:备份名为mydatabase的数据库到backup.sql的文件中mysqldump-uroot-ppassword123mydatabase>backup.sql备份所有数据库mysqldump-uroot-ppassword123--all-databases>all_databases_backup.sql注意:-p后
Vue3+Vite+TS+Axios整合详细教程
老马聊技术
Vue Vite TS vue.js
1.Vite简介Vite是新一代的前端构建工具,在尤雨溪开发Vue3.0的时候诞生。类似于Webpack+Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。生产中利用Rollup作为打包工具,号称下一代的前端构建工具。vite是一种新型的前端构建工具,能够显著的提升前端开发者的体验。它主要有俩部分组成:一个
npm proxy setting
kjndppl
[Node.js JavaScript npm https proxy password
清理npmconfigdeletehttp-proxynpmconfigdeletehttps-proxy具体设置步骤如下:1.执行npmconfig后,将看到下一行提示信息npmconfigls-ltoshowalldefaults.2.执行npmconfigls-l后,在一大长串的settign中找出userconfig项(大概位于倒数第4项)[b]userconfig[/b]="C:\\Us
npm 切换 node 版本 和npm的源
爱敲代码的小冰
npm 前端 node.js
在开发过程中,不同项目可能需要不同版本的Node.js,同时于由XX原因,我们需要切换npm的源。这时如果需要切换node版本或者npm的源,我们可以使用以下方法。使用nvm切换Node版本1、安装npminstallnvm-g2、使用#列出所有可用版本nvmlist-remote#安装指定版本nvminstall16.15.1#使用指定版本nvmuse16.15.1#查看当前使用的版本nvmcu
Python中类静态方法:@classmethod/@staticmethod详解和实战示例
在Python中,类方法(@classmethod)和静态方法(@staticmethod)是类作用域下的两种特殊方法。它们使用装饰器定义,并且与实例方法(deffunc(self))的行为有所不同。1.三种方法的对比概览方法类型是否访问实例(self)是否访问类(cls)典型用途实例方法✅是❌否访问对象属性类方法@classmethod❌否✅是创建类的替代构造器,访问类变量等静态方法@stati
日历插件-FullCalendar的详细使用
老马聊技术
JavaScript 前端 javascript
一、介绍FullCalendar是一个功能强大、高度可定制的JavaScript日历组件,用于在网页中显示和管理日历事件。它支持多种视图(月、周、日等),可以轻松集成各种框架,并提供丰富的事件处理功能。二、实操案例具体代码如下:FullCalendar日期选择body{font-family:Arial,sans-serif;margin:20px;}#calendar{max-width:900
入门html这篇文章就够了
ξ流ぁ星ぷ132
html 前端
HTML笔记文章目录HTML笔记html介绍什么是htmlhtml的作用HTML标签介绍常用标签标签and标签and标签u标签del删除线br标签用于换行pre标签,预处理标签span标签div标签sub标签andsup标签hr标签h1,h2...h6标签:HTML5中的语义标签:特殊字符img标签a标签第一种用法:超链接第二种用法:锚点video标签表格标签:form标签input标签selec
android判断深色模式的方法
东东旭huster
android java 开发语言
android10以后的版本才完全支持深色模式,测试下面两种方法判断系统是否深色模式都是有效的。publicstaticbooleanisDarkMode1(){if(Build.VERSION.SDK_INT
Spring Cloud Gateway 的执行链路详解
愤怒的代码
SpringCloud spring cloud
SpringCloudGateway的执行链路详解核心目标明确SpringCloudGateway的请求处理全过程(从接收到请求→到转发→到返回响应),方便你在合适的生命周期节点插入你的逻辑。核心执行链路图(执行顺序)┌──────────────┐│客户端请求│└────┬─────────┘↓┌────┴─────────────┐│NettyHttpServer│←→ReactorNetty
RocketMQ 核心特性实战详解
愤怒的代码
RocketMQ实战 rocketmq
RocketMQ核心特性实战详解本文基于RocketMQ4.x+rocketmq-spring-boot-starter2.3.1,从零搭建,逐步讲解RocketMQ11大核心特性,每一段代码都能直接跑。0.项目环境准备依赖引入在pom.xml文件添加:org.apache.rocketmqrocketmq-spring-boot-starter2.3.1配置文件application.ymlse
“Datawhale AI夏令营”基于带货视频评论的用户洞察挑战赛
fzyz123
Datawhale AI夏令营 人工智能 Datawhale 大模型技术 NLP 深度学习 AI夏令营
前言:本次是DatawhaleAI夏令营2025年第一期的内容,赛事是:基于带货视频评论的用户洞察挑战赛(科大讯飞AI大赛)一、赛事背景在直播电商爆发式增长浪潮中,短视频平台积累的海量带货视频及用户评论数据蕴含巨大商业价值。这些数据不仅是消费者体验的直接反馈,更是驱动品牌决策的关键资产。用户洞察的核心在于视频内容与评论数据的联合挖掘:通过智能识别推广商品分析评论中的情感表达与观点聚合精准捕捉消费者
从《哪吒 2》看个人IP的破局之道|创客匠人
《哪吒2》以破竹之势登顶中国影史票房榜,不到9天票房突破62亿,观众自发为其“冲百亿”的热情,揭示了一个朴素却深刻的商业逻辑:IP的真正生命力,不在于短暂曝光,而在于用户愿意用行动投票的长期信任。这种逻辑,同样适用于2025年个人IP的增长突围。流量失效的真相:用户体验断层终结增长如今的IP运营者常陷入一个误区:疯狂追逐流量,却留不住用户。短视频投流成本翻倍,内容越做越多粉丝却不涨,好不容易成交的
SAX解析xml文件
小猪猪08
xml
1.创建SAXParserFactory实例
2.通过SAXParserFactory对象获取SAXParser实例
3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类
4.SAXParser实例的parse来获取文件
public static void main(String[] args) {
//
为什么mysql里的ibdata1文件不断的增长?
brotherlamp
linux linux运维 linux资料 linux视频 linux运维自学
我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。
当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。
一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是:
ibdata1存了什么?
当你启用了 i
Quartz-quartz.properties配置
eksliang
quartz
其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。
下面是这些默认值的解释
#-----集群的配置
org.quartz.scheduler.instanceName =
informatica session的使用
18289753290
workflow session log Informatica
如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20
session下面的source 里面有个tracing 
Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误
酷的飞上天空
scrapy
Scrapy版本0.14.4
出现问题现象:
ERROR: Error downloading <GET http://xxxxx CRC check failed
解决方法
1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'
明确表示不支持任何形式的压缩格式,避免程序的解压
java Swing小集锦
永夜-极光
java swing
1.关闭窗体弹出确认对话框
1.1 this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
1.2
this.addWindowListener (
new WindowAdapter () {
public void windo
强制删除.svn文件夹
随便小屋
java
在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除
GET和POST有什么区别?及为什么网上的多数答案都是错的。
aijuans
get post
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历
前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。
这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G
谈谈新浪微博背后的那些算法
aoyouzi
谈谈新浪微博背后的那些算法
本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。
微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针
Connection reset 连接被重置的解决方法
百合不是茶
java 字符流 连接被重置
流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置
被重置的代码如下;
客户端代码;
package 通信软件服务器;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.O
web.xml配置详解之filter
bijian1013
java web.xml filter
一.定义
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.my.app.EncodingFilter</filter-class>
<init-param>
<param-name>encoding<
Heritrix
Bill_chen
多线程 xml 算法 制造 配置管理
作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。
Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资
【Zookeeper】FAQ
bit1129
zookeeper
1.脱离IDE,运行简单的Java客户端程序
#ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient
1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码
2. 如果Zookeeper集群跨越多个机房,那么Leader/
The user specified as a definer ('aaa'@'localhost') does not exist
白糖_
localhost
今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist
最后找原因发现删除操作做了触发器,而触发器里面有这样一句
/*!50017 DEFINER = ''aaa@'localhost' */
原来最初
javascript中showModelDialog刷新父页面
bozch
JavaScript 刷新父页面 showModalDialog
在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:
window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self
在子页面使用w
编程之美-买书折扣
bylijinnan
编程之美
import java.util.Arrays;
public class BookDiscount {
/**编程之美 买书折扣
书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。
下面用动态规划实现。
哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷
关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要
chenbowen00
struts WEB安全
因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。
下面记录下本次解决的过程以便后续
1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议,
而使用ftp协议默认会产生一个匿名用
[电力与暖气]煤炭燃烧与电力加温
comsci
在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....
不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?
&nbs
oracle O7_DICTIONARY_ACCESSIBILITY参数
daizj
oracle
O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL
比较全面的MySQL优化参考
dengkane
mysql
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。
1、硬件层相关优化
1.1、CPU相关
在服务器的BIOS设置中,可
C语言homework2,有一个逆序打印数字的小算法
dcj3sjt126com
c
#h1#
0、完成课堂例子
1、将一个四位数逆序打印
1234 ==> 4321
实现方法一:
# include <stdio.h>
int main(void)
{
int i = 1234;
int one = i%10;
int two = i / 10 % 10;
int three = i / 100 % 10;
apacheBench对网站进行压力测试
dcj3sjt126com
apachebench
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。
通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。
2种办法让HashMap线程安全
flyfoxs
java jdk jni
多线程之--2种办法让HashMap线程安全
多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.
Spring Security(04)——认证简介
234390216
Spring Security 认证 过程
认证简介
目录
1.1 认证过程
1.2 Web应用的认证过程
1.2.1 ExceptionTranslationFilter
1.2.2 在request之间共享SecurityContext
1
Java 位运算
Javahuhui
java 位运算
// 左移( << ) 低位补0
// 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0:
// 0000 0000 0000 0000 0000 0000 0001 1000
System.out.println(6 << 2);// 运行结果是24
// 右移( >> ) 高位补"
mysql免安装版配置
ldzyz007
mysql
1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。
2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。
3、my-large.ini是为专用于一个SQL数据
MFC和ado数据库使用时遇到的问题
你不认识的休道人
sql C++ mfc
===================================================================
第一个
===================================================================
try{
CString sql;
sql.Format("select * from p
表单重复提交Double Submits
rensanning
double
可能发生的场景:
*多次点击提交按钮
*刷新页面
*点击浏览器回退按钮
*直接访问收藏夹中的地址
*重复发送HTTP请求(Ajax)
(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:
http://getbootstrap.co
Java String 十大常见问题
tomcat_oracle
java 正则表达式
1.字符串比较,使用“==”还是equals()? "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。 equals()判断两个字符串的值是否相等。 除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。 如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。
SpringMVC 登陆拦截器实现登陆控制
xp9802
springMVC
思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。
实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23