《网络程序设计》署名博客
完成一篇署名博客,博客内容至少包括课程学习心得总结、通过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,梁昱森)
《昼颜》里的日本女人:相遇要万种风情,分手要残忍绝情
迷影咖啡
作者:迷之菌子神奇菇迷影咖啡:一本正经做烘焙,胡说八道聊电影漫天萤火虫消散之时良宵就将过去,人们也说含苞待放的花蕾总会开了又谢,因紧紧相拥而面红耳赤的躯体,便是我们经历过这热爱的证明。夫妻关系介绍《昼颜》是2014年电视剧《昼颜:工作日下午三点的恋人们》的续集,故事发在电视剧情节结束的三年后,讲述了已经恢复独身的纱和偶然与曾经的出轨对象北野重逢后再次陷入感情漩涡的故事。《昼颜》制作灵感源自利佳子在
迎接2019
唯有杜康1994
告别2018这一年是机遇与挑战,痛苦与喜悦,失去与收获的一年一月:收获了第一份爱情,开始真正想去了解一个人三月:对工作有了更深入的认识,靠自己的力量完成晋升五月:搬家,住进了自己理想的公寓,一间属于自己的屋子。满地的书六月:外调广州,升经理,有了自己的第一个团队。七月:怀着自我否定,第一次完成了部门任务八月:第一个员工流失,痛哭不已明白无不散之筵席九月:员工陆续离开,经济是一切的根本。十月:陪员工
亲子日记之祝姑姥姥生日快乐(282)
冰心雨露_d504
2021年7月18日,周日,晴周日上班的不上班,上学的不上学,全家都属于休息状态,洗衣做饭是上午的主要任务,中午休息一会儿,下午比较晚了出去给梦怡买了二年级上册的口算题卡,然后去参加姑姑的生日聚餐,本来姑姑应该是周一生日,因为周一都要上班,就提前到周日过了,说是过生日其实就是想借此机会一家人聚聚,毕竟平常都忙,没有时间聚在一起,梦怡还给姑姥姥做了生日贺卡,虽然长相一般,重在心意。生日快乐
100天30本书读书计划(2018-06-11)DAY 62
一个姜姜
【书名】当我谈跑步时,我谈些什么【作者】村上春树【读书页数】51--128/187【读书时间】2018年6月11日【精彩句子】01肌肉难长,易消。赘肉易长,难消。P5502肌肉也同有血有肉的动物一般无二,它也愿意过更舒服的日子,不继续给它负荷,它便会心安理得地将记忆出去。想再度输入的话,必须得从头开始,将同样的模式重复一遍。P7703不管怎样,反正得坚持跑步。每天跑步对我来说好比生命线,不能说忙就
教育微创新的意蕴
知北老师
我是1992年参加工作的,一毕业就被分配到一所全县最偏僻落后的农村学校——付窝中学,12年后被调往一所已经连续十年全县倒数第一,也是很偏僻落后的农村学校——北宋镇第三中学。三年后到了北宋镇第一中学工作,这所学校教学质量也是连续几年落后了。2014年我到了北京市育英学校,这所学校是京城名校。2016年7月,我被育英学校派往原密云区第七中学工作,这是一所城乡接合部薄弱学校。学校现名为北京市育英学校密云
我喝醉了,但是与你无关
Z先生的日记本
2019年04月10号晚上我和一个朋友喝酒了,彻彻底底的喝醉了,喝到短片,事后我问L,我说我喝醉了之后,都发生了什么,L没有告诉我详情,但是跟我说了大致,他说我跟他一直聊天,说自己小的时候的事,说自己爸妈的事,说自己现在过得很苦可能,确实是喝醉了酒,才会毫无防备的跟其他人说这些吧。L还说感觉我过得很苦,很心疼。醉了酒之后还哭了,想想还真是丢人一年前,在宿舍也有一瓶红酒,那是舍友出去拉赞助时候,友商
2022年河南省高等职业教育技能大赛云计算赛项竞赛赛卷(样卷)
忘川_ydy
云计算 云计算 openstack kubernetes docker python k8s ansible
#需要资源(软件包及镜像)或有问题的,可私博主!!!#需要资源(软件包及镜像)或有问题的,可私博主!!!#需要资源(软件包及镜像)或有问题的,可私博主!!!第一部分:私有云任务1私有云服务搭建(10分)使用提供的用户名密码,登录竞赛用的云计算平台,按要求自行使用镜像创建两台云主机,创建完云主机后确保网络正常通信,然后按要求配置服务器。根据提供安装脚本框架,补充脚本完成OpenStack平台的安装搭
【OpenModelica】4命令行大全
Wumbuk
python 开发语言 modelica
命令行大全文章目录命令行大全一、SummaryofCommandsfortheInteractiveSessionHandler二、Runningthecompilerfromcommandline一、SummaryofCommandsfortheInteractiveSessionHandler以下是交互式会话处理器中当前可用命令的完整列表。•simulate(modelname):翻译一个名为
unblock with ‘mysqladmin flush-hosts‘ 解决方法
祈祷平安,加油
数据库常见问题 oracle 数据库
MySqlHostisblockedbecauseofmanyconnectionerrors;unblockwith'mysqladminflush-hosts'解决方法环境:linux,mysql5.5.21错误:Hostisblockedbecauseofmanyconnectionerrors;unblockwith'mysqladminflush-hosts'原因:同一个ip在短时间内产
美团自动配送车2024春季招聘 | 社招专场
美团技术团队
关于美团自动配送团队美团自动配送以自研L4级自动驾驶软硬件技术为核心,与美团即时零售业务结合,形成满足公开道路、校园、社区、工业园区等室外全场景下的自动配送整体解决方案。美团自动配送团队成立于2016年,团队成员来自于Waymo、Cruise、Pony.ai、泛亚等自动驾驶行业头部公司,自动驾驶技术团队博士占比高达30%,依靠视觉、激光等传感器,实时感知预测周围环境,通过高精地图定位和智能决策规划
那些年我们一起传抄的歌词
木子李000
那些年我们一起传抄的歌词文/李银波图片发自App“吹着自在的口哨,开着自编的玩笑,一千次重复的潇洒,把寂寞当做调料……”偶尔整理旧时书籍,发现了那本泛黄的歌词本,《十六岁的花季》,是啊,曾经脍炙人口,传唱已久的那首歌曲,让我回忆起了当年一起传抄歌词的那些岁月。一首首熟悉的歌曲,一个个用心写下的字,一张张明星的贴画跃然纸上,那么熟悉。那么亲切,却又那么遥远。时光带走了我们的青春年少,岁月沧桑了我们的
自律计划:从早睡早起开始
犀首公孫衍
今天天气十分不错,阳光明媚。下午趁着阳光充足,想去田野里走一走。两个多月了,几乎都是在家待着,大门不出二门不迈。上大学以来,可几乎不怎么去到田间地头看一看。3月正是油菜花开放的季节,满地的金黄色,草木也开始生出了绿色的芽儿。眼前的景儿,让人眼明心亮。一年之计在于春,春天是最美好的季节。这样一个特殊的春天,让我暂时脱离了学校,也算有了一些新的收获吧。开始有了一些好的改变,开始坚持每天读书,保持较好的
你之所以胖,可能是因为小时候发生这件事!还不赶快甩锅
周围_5d19
通常,我们认为,“肥胖”主要是由于饮食不节制、不经常运动等等因素引起的。但最近,我国学者开展的一项针对6到18岁儿童青少年、随访长达十年的代谢综合征研究结果,在权威国际期刊发表。研究发现,儿童的肥胖和超重与睡眠密切相关,儿童、青少年时期睡眠不好,成人后也更容易患心血管疾病。那么,为什么儿童青少年睡眠不足会导致肥胖呢?今天就带大家一探究竟。儿童青少年肥胖的现状如何?近日,一项刊载在医学权威期刊《柳叶
淘宝天猫38节活动时间和玩法,2024年焕新周满减优惠多少
小小编007
在2024年,淘宝天猫平台即将迎来一年一度的38节活动,这是广大消费者们翘首以待的购物狂欢节。在这篇文章中,我们将为您详细解读淘宝天猫38节活动的时间安排和玩法,以及2024年焕新周的满减优惠力度。一、淘宝天猫38节活动时间2024年淘宝天猫38节活动将于2月28日正式启动,持续至3月8日,为期10天。活动期间,消费者们可以尽情享受各种优惠折扣、满减活动以及限时秒杀,尽情释放购物热情。2024淘宝
感恩日志
圆施
张新丽2019年8月16日感恩日志:1.感恩天地滋养万物;感恩国家恩惠护佑;感恩父母养育深恩。2.感恩尊重为平台源头付出的所有人事物。3.感恩红斌、孙萍清晨7点开车来接我和小姨去安宁渠采摘。4.感恩小姨和小姨夫亲自采摘还带我们去瓜地品尝,第一次这么吃好甜啊,忘掉了炎热消了暑,拍下了瞬间,分享着快乐,带给大家。4.感恩整理收拾好小姨给大家利用午休蒸苞米。5.感恩去接爸妈参加沙龙。6.感恩祝福两位伙伴
llama.cpp 编译安装@Ubuntu
skywalk8163
项目实践 人工智能 llama ubuntu linux 人工智能
在Kylin和Ubuntu编译llama.cpp,具体参考:llama模型c语言推理@FreeBSD-CSDN博客现在代码并编译:gitclonehttps://github.com/ggerganov/llama.cppcdllama.cppmkdirbuildcdbuildcmake..cmake--build.--configRelease#可选安装makeinstall#或可选添加路径ex
python 推导式(派生、衍生)
sanduo112
人工智能 python windows 开发语言
python推导式一、推导式(派生、衍生)1.Python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。2.列表(list)推导式3.字典(dict)推导式4.集合(set)推导式5.元组(tuple)推导式二、代码概述一、推导式(派生、衍生)1.Python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。Python支持各种数
所有的突然想起,都是一直放在心里
清浅白芷
一天,看到朋友圈发了一张木林的图片,熟悉而又陌生,心里怔住了一下,突然想起他以及往事。想起那年我们在旅途认识,而后又因旅途分开的故事。点点滴滴,在脑海里盘旋,在回忆里辗转。还记得相遇的那天,因为他的幽默风趣,把全场疲惫不堪的人逗笑了,他笑起来的样子不是很好看,但感觉很舒服。后来我们通过在网上联系,加深了对彼此的了解,便互生情愫,然后恋爱。只是后来,经过一年多的相处,我们就分开了。虽然时间很短,但仿
黔东南——苗年(一)
非常道yw
苗年是雷山县苗族同胞最隆重的民族传统节日,也是苗族人一年中庆祝丰收和最重要的祭祀性的日子,更是雷山苗族一年里劳作的结束和欢乐的开始。如同汉族的春节。节日期间,各村寨都要举行跳芦笙、篮球赛、斗牛、赛马、斗鸟、铜鼓舞、篝火晚会等民间传统娱乐活动。苗年也是最集中地展示苗族服饰、银饰、手工艺美术等有形文化的节日,时间大都在农历十月。苗族认为,一年只有热、冷两个季节,热季和冷季交替的农历十月,既是热季的结束
一年又一年
微凉意思
睡到半天嗓子突然干痒,忍不住想要咳嗽又怕惊扰了熟睡的宝宝,强撑着困意爬起来倒,猛一回头看到墙上的日历,赫然写着2021年,顿时一个激灵睡意全无。都说2020年是极不平凡的一年,在疫情的阴影笼罩下我们胆战心惊,我记得年初疫情肆虐的时候,恰逢产假的我闲赋在家,每天看着群里各种消息,本就产后的我更加胡思乱想,有时候看着襁褓中的宝宝,我甚至在想我把他带到这病毒肆虐的世界,若没有能力护他周全可如何是好。看着
C++学习笔记(lambda函数)
__TAT__
C&C++ c++ 学习 笔记
C++learningnote1、lambda函数的语法2、lambda函数的几种用法1、lambda函数的语法lambda函数的一般语法如下:[capture_clause](parameters)->return_type{function_body}capture_clause:需要捕获的变量,但要求该变量必须在这个作用域中。通常的捕获方式有以下几种:[]:不捕获任何变量[&]:按引用捕获变
keras.optimizers优化器中文文档
地上悬河
python 开发语言 后端
优化器optimizers优化器是编译Keras模型必要的两个参数之一model=Sequential()model.add(Dense(64,init='uniform',input_dim=10))model.add(Activation('tanh'))model.add(Activation('softmax'))sgd=SGD(lr=0.01,decay=1e-6,momentum=0.
用XMLHttpRequest发送和接收JSON数据
潭池先生
json XMLHttpRequest 前端
百度的AI回答了一个案例:varxhr=newXMLHttpRequest();varurl="your_endpoint_url";//替换为你的API端点vardata=JSON.stringify({key1:"value1",key2:"value2"});xhr.open("POST",url,true);xhr.setRequestHeader("Content-Type","appl
ChatGPT一路狂飙?
何鲸洛
2月2日。根据投行瑞银集团在周三发布的一份研究报告。爆红聊天机器人ChatGPT的月活跃用户在今年1月份预计达到了1亿,这距离它推出只有2个月时间,成为史上增长最快的消费者应用。①ChatGPT一路火花带闪电?▽2014年。OpenAI创始人SamAltman早年曾执掌著名的硅谷孵化器YCombinator。2015年。Altman联合马斯克、彼得·泰尔、AWS、印度Infosys和YC等作为出资
chrome扩展,“manifest_version“: 3, chrome 扩展图标点击事件
徐同保
chrome 前端
在Chrome扩展中,从ManifestV3开始,后台脚本(backgroundscripts)被服务工作线程(serviceworkers)所取代。这改变了扩展图标点击事件(通常称为浏览器操作或者页面操作)的处理方式。在ManifestV3中,您需要使用chrome.action.onClicked监听器来处理扩展图标的点击事件。下面是一个如何设置扩展图标点击事件处理器的示例:在manifest
喝酒给500红包,大家讨论一下微信报单好还是传真报单好?
践侠客
2018年6月2日,L1组编号8号,日精进第65天,(文/胡鼎峰)昨天又和客户一起吃饭喝酒了,尽管最后的结果是蛮好的,但是因为喝酒我昨天又断更了,这对于习惯了每天写作日更的我来说,体验非常地差。早上三点就早早醒过来,想要爬起来写文章,但是头脑因为酒精的作用依然是昏昏沉沉,于是在半梦半醒之间熬到了天亮。对于我来说,日更是现在最重要的事情,虽然我也不知道我日更到底是为了什么,但是就是隐隐地觉得自己必须
直返APP所属的公司是何时成立的?它的发展历程和业务范围
好项目高省
直返APP为我们带来了返利购物的便利,那么这款APP所属的公司是如何成立的呢?它的背后又有怎样的发展历程和业务范围呢?让我们一起探寻。【高省】APP(高佣金领导者)是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,运行三年,稳定可靠。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。高省是公认的返利最高的软件。古楼导师高省邀请码5558
请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能?
AaronWang94
shiro java java 安全 开发语言
请简单介绍一下Shiro框架是什么?Shiro框架是一个强大且灵活的开源安全框架,为Java应用程序提供了全面的安全解决方案。它主要用于身份验证、授权、加密和会话管理等功能,可以轻松地集成到任何JavaWeb应用程序中,并提供了易于理解和使用的API,使开发人员能够快速实现安全特性。Shiro的核心组件包括Subject、SecurityManager和Realms。Subject代表了当前与应用
中国最美的100个地方,待“软禁”结束后,满血复活去一次旅行!
是北河二1995
【阅读原文,请点击:原文,硬核100个】离成为一个倾国倾城、走路带风的女子还有365天!大家好,我是小草们的北河二~一转眼,2020年已过1/4,突如其来的病毒,搅得人心惶惶。原本的3月里,景区爆满、街道拥堵、小吃铺做无缺席。然而,地球妈妈不会一直宠着我们,给了我们好几个警告。如今,连CCTV-1播出的《人与自然》,我都可以看上好一会儿......高山、流水、湖泊、森林、大海.....它们也在这初
【转载】SSD测试第一神器——FIO
running_sheep
转自:[http://www.ssdfans.com]对于SSD性能测试来说,最好的工具莫过于FIO了。FIO是Jens开发的一个开源测试工具,功能非常强大,本文就只介绍其中一些基本功能。线程,队列深度,Offset,同步异步,DirectIO,BIO使用FIO之前,首先要有一些SSD性能测试的基础知识。线程指的是同时有多少个读或写任务在并行执行,一般来说,CPU里面的一个核心同一时间只能运行一个
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