总目标:实现动漫人脸识别、建立动漫人脸数据库
本文定位在有一定python、linux基础和我这样的学生阅读
遇到问题❓/错误❌,请查看文末或文章间隙
1、标注图片中动漫人物的脸部
环境:
服务器:腾讯云(新用户优惠,阿里云之前使用了)
操作系统:CetenOS 6.5 (环境配置复杂度: Window > Centos > Ubuntu 因个人原因使用centos较多)
python版本:3.5(自带2.6.6)
window端(客户端)工具:Xshell、Xftp
1.1、依赖下载:
① 动漫人脸分类器下载:
https://github.com/nagadomi/lbpcascade_animeface/
② i2v库的安装:
Github:https://github.com/rezoo/illustration2vec/
1.2、Test环境:
准备下linux服务器主机(centos)属性、环境:
查看linux系统CPU和内存命令
python -V
安装anaconda(推荐安装中等较新版本,尽量避免未知错误)/ 安装pip(可能后续会出问题)
CentOS 7安装Anaconda3
import cv2
可能会遇到anaconda崩了,涉及python多重版本conda软链接指向出了问题等:
修改软链接
修改.bashrc
重新安装anaconda
或者使用了清华源或其他源的旧版本,或官方版的最新,尝试anaconda版本回退一点点
1.3、参数查询、环境调试结束,开始测试功能:
文件目录:
动漫人脸检测并截取:
(尝试进行从一张图片中识别并截取人脸进行保存的操作)
#coding=utf-8
import cv2
import sys
import os.path
cascade = cv2.CascadeClassifier('/root/comic/lbpcascade_animeface.xml') # 引入xml
image = cv2.imread('/root/comic/test.jpg', cv2.IMREAD_COLOR) # 读入一幅彩色图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 色彩空间转换
gray = cv2.equalizeHist(gray) # 图像直方图均衡化
faces = cascade.detectMultiScale(gray,
# detector options
scaleFactor=1.1,
minNeighbors=5,
minSize=(24, 24))
i = 0
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
face = image[y: y + h, x:x + w, :]
face = cv2.resize(face, (96, 96))
save_filename = '%s_%d.png' % (os.path.basename('/root/comic/faces/').split('.')[0], i)
cv2.imwrite("/root/comic/faces/" + save_filename, face)
i = i + 1
#cv2.imshow("AnimeFaceDetect", image)
cv2.waitKey(0)
cv2.imwrite("/root/comic/out.png", image)
2、截取并保存视频一帧帧截取到的动漫人脸(目标):
2.1、文件目录:
2.2、导入视频一帧帧截取动漫人脸:
#coding=utf-8
import cv2
import os
face_id = 1
count = 0
cap = cv2.VideoCapture('/root/comic/1.mp4')
face_detector = cv2.CascadeClassifier('/root/comic/lbpcascade_animeface.xml')
while True:
# 从摄像头读取图片
sucess, img = cap.read()
# 转为灰度图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))
count += 1
font = cv2.FONT_HERSHEY_TRIPLEX
cv2.putText(img, 'num:%d' % (count), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
# 保存图像
cv2.imwrite("/root/comic/characters/User." + str(face_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x + w])
#cv2.imshow('image', img)
# 保持画面的持续。
k = cv2.waitKey(1)
if k == 27: # 通过esc键退出摄像
break
# 关闭摄像头
cap.release()
cv2.destroyAllWindows()
2.2、分类图片:
将不同人物分类到属于他命名的文件夹下:
#开发中
3、训练图片:
开始制定、训练出模型(代码太长影响观感,完整代码github):
#coding=utf-8
from skimage import io, transform
import glob
import os
import tensorflow as tf
import numpy as np
import time
import matplotlib.pyplot as plt
# 训练验证数据集目录
path = '/root/comic_reg/data/train-validation-set/'#最后少了个斜杠 读入失败
# 模型保存地址,最后接的是模型名字
model_path = '/root/comic_reg/model/model.ckpt'
# 将所有的图片resize成100*100
# 读取图片
# 打乱顺序
# 将所有数据分为训练集和验证集
ratio = 0.7
s = np.int(num_example*ratio)
x_train = data[:s]
y_train = label[:s]
x_val = data[s:]
y_val = label[s:]
# -----------------构建网络----------------------
# 占位符
x = tf.placeholder(tf.float32, shape=[None, w, h, c], name='x')
y_ = tf.placeholder(tf.int32, shape=[None, ], name='y_')
# 第一个卷积层(100——>50)
# 第二个卷积层(50->25)
# 第三个卷积层(25->12)
# 第四个卷积层(12->6)
# 全连接层
# ---------------------------网络结束---------------------------
# (小处理)将logits乘以1赋值给logits_eval,定义name,方便在后续调用模型时通过tensor名字调用输出tensor
# 定义一个函数,按批次取数据
# 训练和测试数据,可将n_epoch设置更大一些
n_epoch = 50
batch_size = 32
saver = tf.train.Saver()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# 自定义保存数据列表
trainlosslist = []
trainacclist = []
validationlosslist = []
validationacclist = []
for epoch in range(n_epoch):
start_time = time.time()
# training
train_loss, train_acc, n_batch = 0, 0, 0
for x_train_a, y_train_a in minibatches(x_train, y_train, batch_size, shuffle=True):
_, err, ac = sess.run([train_op,loss,acc], feed_dict={x: x_train_a, y_: y_train_a})
train_loss += err; train_acc += ac; n_batch += 1
print(" train loss: %f" % (train_loss / n_batch))
print(" train acc: %f" % (train_acc / n_batch))
# 添加到列表
trainlosslist.append(train_loss / n_batch)
trainacclist.append(train_acc / n_batch)
# validation
val_loss, val_acc, n_batch = 0, 0, 0
for x_val_a, y_val_a in minibatches(x_val, y_val, batch_size, shuffle=False):
err, ac = sess.run([loss, acc], feed_dict={x: x_val_a, y_: y_val_a})
val_loss += err; val_acc += ac; n_batch += 1
print(" validation loss: %f" % (val_loss / n_batch))
print(" validation acc: %f" % (val_acc / n_batch))
# 添加到列表
validationlosslist.append(val_loss / n_batch)
validationacclist.append(val_acc / n_batch)
saver.save(sess,model_path)
sess.close()
# 绘图
x = np.arange(1, n_epoch, 1)
plt.plot(x, np.array(trainacclist)[x-1], label="train-acc")
plt.plot(x, np.array(validationacclist)[x-1], label="validation-acc")
plt.plot(x, np.array(trainlosslist)[x-1], label="train-loss")
plt.plot(x, np.array(validationlosslist)[x-1], label="validation-loss")
# 设置坐标轴名称
plt.xlabel('epoch')
# 画两条基准线
plt.plot(x, x/x, label="one")
plt.plot(x, x-x, label="zero")
# 参数:loc设置显示的位置,0是自适应;ncol设置显示的列数
plt.legend(loc=0, ncol=1)
#plt.show()
plt.savefig("/root/comic_reg/out.png")
4、识别图片:
from skimage import io,transform
import tensorflow as tf
import numpy as np
import glob
path = '/root/comic_reg/data/test-set/*.png'
image_dict = {0: '一花',1:'二乃',2:'三玖',3:'四叶',4:'五月'}
count_true=[]
w=100
h=100
c=3
def read_one_image(path):
img = io.imread(path)
img = transform.resize(img,(w,h))
return np.asarray(img)
with tf.Session() as sess:
data = []
# 目录列表
paths = glob.glob(path)
#print(paths)
for img in paths:
data.append(read_one_image(img))
saver = tf.train.import_meta_graph('/root/comic_reg/model/model.ckpt.meta')
saver.restore(sess,tf.train.latest_checkpoint('/root/comic_reg/model/'))
graph = tf.get_default_graph()
x = graph.get_tensor_by_name("x:0")
feed_dict = {x:data}
logits = graph.get_tensor_by_name("logits_eval:0")
classification_result = sess.run(logits,feed_dict)
#打印出预测矩阵
print("\n预测矩阵:\n", classification_result)
#打印出预测矩阵每一行最大值的索引
print("\n简略结果:\n", tf.argmax(classification_result,1).eval(), '\n')
print("具体情况: ")
#根据索引通过字典对应人物的分类
output = []
output = tf.argmax(classification_result,1).eval()
count = 0
for i in range(len(output)):
# output[i]是测试结果编码,paths[i])[-7]是原定图片编号(路飞1)
flag = False
if str(output[i]+1) == paths[i][-7]:
flag = True
if flag == True:
count_true.append(paths[i][-7:])
count += 1
print("第 " + str(i+1) + " 张 (" + paths[i][-7:] + ") 人物预测: " + image_dict[output[i]] + " " + str(flag))
print("\n准确率: {:.2f}%".format(count / len(output) * 100 ))
print(count_true)
结果:
因为只有第一个人物图片准备充足所以其他人物识别率会偏低
之前使用:
服务器:腾讯云
操作系统:Ubuntu Server 18.04.1 LTS 64位
类型:公共镜像(池)
内存:2 GB
CPU:1 核
硬盘:50 G
公网带宽:1 Mbps
步骤1.1中可能遇到的问题:
1.下载速度太慢:
法一:
liunx 下载 Github_Releases 下载提速:
Linux系统下hosts文件的位置是 /etc/hosts ,以root用户登录Linux,使用vi编辑/etc/hosts文件,将附加的内容添加在其后面即可:
修改hosts(liunx):
52.216.186.155 github-production-release-asset-2e65be.s3.amazonaws.com
wget https://github.com/rezoo/illustration2vec/releases/download/v2.0.0/illust2vec_tag_ver200.caffemodel
以此类推...
法二:
修改hosts(window):
当我们需要本地调试网站或者屏蔽某个网站的时候可以手动将这个网站添加到系统hosts文件中,因为hosts文件的优先级高于DNS,所以可以达到你想要在浏览器里呈现的结果,当然这只在本地有用!
一、Windows中hosts文件一般在C:\Windows\System32\drivers\etc目录下,格式是
127.0.0.1 localhost
::1 localhost
52.216.186.155 github-production-release-asset-2e65be.s3.amazonaws.com
可以用记事本修改,前面是IP地址,后面是域名。127.0.0.1这个是本地环回地址。
比如127.0.0.1 www.baidu.com就是把www.baidu.com这个域名指向127.0.0.1的地址。
##法三:
Github镜像网站:http://github-mirror.bugkiller.org/
xftp传上去云端
当然这也需要很久 不多折合下来很大可能快50-100倍。如果像我一样有一台window云服务,那就让它来做这件事。下载,上传,都在云上进行。
详细请看
https://www.cmsky.com/linux-hosts/
步骤2.2中可能遇到的问题:
【Linux】 解决报错:
ImportError: libSM.so.6: cannot open shared object file: No such file or directory
原因:
libSM、libSM等不存在
解决办法:
yum install xxx
详:https://www.cnblogs.com/richerdyoung/p/8458910.html
步骤2.3中可能遇到的问题:
查看linux系统CPU和内存命令
https://jingyan.baidu.com/article/fdbd4277b16d1cb89e3f48e4.html
Python MemoryError
https://blog.csdn.net/xiaopihaierletian/article/details/57416110
在用Python处理大数据时,本来16G的内存,内存还没使用四分之一就开始报MemoryError的错误,后来才知道32bit的Python使用内存超过2G之后,就报这个错误,还没有其他的提示消息。果断换64bit的Python。
https://blog.csdn.net/weixin_33928137/article/details/93646975
https://blog.csdn.net/xovee/article/details/101077022
linux 使用文件增加虚拟内存 swap
https://msd.misuland.com/pd/3070888491219949990
https://www.cnblogs.com/ling-yu-amen/p/10819879.html
import cv2 找不到 face
AttributeError: module 'cv2.face' has no attribute 'createEigenFaceRecognizer' 解决办法
原因:
一.版本问题,目前使用版本cv2.face中createEigenFaceRecognizer更名或移除
解决:请查看对应版本的说明文档,使用对应版本或属性名。
二.未安装
opencv_contrib,所以
model = cv2.face.createEigenFaceRecognizer() 行找不到face
解决:
1.使用pip、源码安装方法
pip install opencv-python opencv-contrib-python
或
https://blog.csdn.net/wyx100/article/details/78498609
2.conda :
conda install opencv-python opencv-contrib-python
问:博主你的代码有问题,你的项目文件夹怎么建的?
答:项目还在开发中,这是俺滴毕设所以还未完善,只有个大概,望体谅谢谢大家
工具:xftp、xshell:https://www.netsarang.com/zh/free-for-home-school/
参考文献:
https://blog.csdn.net/abcd740181246/article/details/89878613
https://blog.csdn.net/zyxhangiian123456789/article/details/87911999
https://blog.csdn.net/qq_29007291/article/details/81103603
https://blog.csdn.net/mozf881/article/details/84929443
Read More ~
基于opencv的人脸识别签到系统
学校小学期项目:人脸识别签到系统
一、需求和计划:
随着高科技的蓬勃发展,人体特征分析技术已经作为身份快速识别及视频监控等领域的最新增值点与应用点,在身份识别、智能安防、智能监控、出入管理、证卡认证等方面发挥巨大作用。面部检测识别技术,是利用计算机图像分析、模型理论、人工智能及模式识别技术的非接触性高端模式识别技术,其可完成从复杂的图像场景中检测、检出特征人像信息,并进行匹配识别的智能分析过程。
软件的发展给我们的经济带来了很大的推动作用,现在越来越多的软件技术运用于各行各业,市场经济作为经济发展的一部分,推行新的技术对其有很大的帮助作用,而人类面部识别智能化的应用,为工作及生产带来很大便利,提高了效益。比如日常工作中的面部考勤签到,vip客户面部识别,来访人员面部识别等,这些系统的应用为行业及单位带来了很大的收益,因此随着技术的进步,跟上时代的步伐显得尤为重要。
二、项目设计:
1、 人员脸部信息采集
在学校集中进行学生和教师的人脸信息采集(现阶段),证件、部门、职务等信息登记(以后)。
2、 人员基础信息管理
在系统中基础信息管理需要管理工作人员的基本资料:包括面部信息、证件号、部门(暂未)等,可以以不同参数为索引百行排列、查询,并可以生成工作人员信息报表。
3、 IP摄像机终端管理(目标)
在系统中,可以对前端IP摄像机进行远程管理,比如修改IP地址,修改设备编号及开启采集与识别功能。
4、 系统扩展接口(目标)
系统提供与企事业单位内其他业务系统的开发接口,实现面部识别考勤系统与其他业务系统的结合使用,方便生产场所的业务管理,提高工作效率。
5、 查询统计报表
系统可以对工作人员的考勤信息进行查询统计,并生成相应工作报表,为单位进一步提供有针对性的工作考勤管理提供信息决策支持。
7、系统设置
实现系统的使用用户及权限信息管理,实现系统参数设定管理。
使用的库 :
1.opencv(人脸识别):
(内置)算法,摄像头,引用xml。
2.tkinter(图形界面):
图形化界面,(简单按钮事件)链接各py文件,业务逻辑。
(内置)算法,摄像头,引用xml
Tkinter:
图形化界面,(简单按钮事件)链接各py文件,业务逻辑
界面:
三、项目实现过程:
人脸检测:
使用OpenCV的人脸检测器进行人脸的初步检测,使haarcascade_frontalface_default.xml训练进行人脸的二分类判定,完成人脸检测。换调用摄像头:“cv2.VideoCapture(1)”,使用Python+OpenCV进行视频中的人脸检测,人脸关键点定位:关键点定位的目标是在确知人脸位置的基础上,精确定位面部的关键点,如下图示意:
图像采集:
采集1000张图片,转换为灰度图并报错,以自己设定好的规律命名图片文件,易于之后的读取后训练。
获得面部关键点的目的是进行人脸的对齐和标准化。标准化的人脸输入可以获得更高的人脸识别精度。
图像特征采集:
人脸特征提取是根据上述标准化的人脸区域图块,提取出数字化的特征。即完成从RGB信息到数值特征的变换。此环节需要尽量使得同一个人物的不同人脸所提取到的特征尽可能相似,而不同人物的人脸所提取的特征尽可能相异。
模型的训练:
人脸识别的模型的训练采用LBPH算法:
cv2.face.LBPHFaceRecognizer_create()
OpenCV人脸识别LBPH算法源码分析
注册成功:
签到成功:
四、项目总结和体会:
要搞一个人脸识别程序,首先我们需要先用提前裁剪好的标注好的人脸照片训练一个识别器。比如说,我们的识别器需要识别两个人,一个人的id是1,而另一个的id是2,于是在数据集里面,1号人的所有照片会有id 1号,2号人同理。然后我们就会使用这些数据集照片去训练识别器,再从一个视频中识别出1号人。
我们把要做的事分成三部分:
1.创建数据集
2.训练
3.识别
生成数据集,写一个数据集生成脚本。Python环境,Pycharm等IDE。
在目录中放好haarcascade_frontalface_default.xml 。OpenCV自带的。
我在github上进行了下载接下来使用cv2获取摄像头数据以及XML文件:我们的数据集需要先从摄像头采集一些人脸例子照片,当然,只能是同一个人的。然后程序会给这些例子照片添加id,并将照片保存在一个文件夹中,这个文件夹我们就将它命名为data,在py脚本的同目录下创建一个data的文件夹。
为了不会将不同的人脸照片弄混,我们需要定一个命名规则,用于给照片命名。例如,命名规则为User.[ID].[SampleNumber].jpg。如果是2号人的第十张照片,我们可以将它命名为User.2.10.jpg。为什么要定义这样的格式呢?因为这样,在加载照片训练的时候,我们就可以只通过照片的文件名,就能简单地判断是几号用户的人脸照片。而后取出时进行分割,拿到对应id的图片,计算特征值。通过shell输入,来获取人的id,并且初始化计算器变量来存储人们的例子数。
有一个值得注意的地方,gray[y : y + h, x : x + w]。此处我们是把一张灰度图片看成一个二维数组(或二维矢量),然后使用python中[]截取OpenCV检测出来的人脸区域。为了照片识别度,质量好一点,我们需要提高一下两次拍摄之间的延迟。代码会在两个拍摄间延迟100毫秒,100毫秒足够让我们去移动我们人脸的角度了(时间不够长就再加)。在拍摄1000张后停止。
最后释放资源:cap.release() cv2.destroyAllWindows() 识别和录取到训练其实都是差不多的业务逻辑。我们的1000张图片如果质量更好,或者说直接10000张。可能效果会好很多。
在算法抉择方面我们选用了1996年的LBPH算法,还有其他更多算法
如:
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer = cv2.face.FisherFaceRecognizer_create()
不同算法详细介绍:
人脸识别算法之特征脸方法(Eigenface、FisherFace、LBPH)
LBPH算法:
原理:通过已知条件,利用特定关系逐步递推,最终得到结果。
1.提取特征值并转换
2.生成数据集,训练,生成yml文件
3.计算(欧式)距离,输出相似度
整体代码流程:
完整代码:
Github: littlebuzi / FaceRecognition
Read More ~
制作“漫画网站”爬虫
v1.0
目的
1.目标网站:https://www.这里是网址.cc/
2.目标结果:获取全部漫画图片文件,并分好文件夹
实现过程
基本逻辑
代码实现
import requests
from bs4 import BeautifulSoup
import re
import os
#1-1030
for num1 in range(1,1031):
circle = requests.get('https://这里是网址/book/'+str(num1))
# 将获取的图片地址依次放入count中
count = []
# 将获取的网页内容放入BeautifulSoup
soup = BeautifulSoup(circle.text, 'lxml')
# 根据谷歌SelectGadGet这个插件,获取html标签,比如获取:#gallery-list
for item_book in soup.select('.d_bg_t'):
for book_name in item_book.find_all('a'):
if(book_name.string!='韩国'and book_name.string!='男性'):
book_name_clean=book_name.string
print(num1, book_name_clean)
os.makedirs('D://manhua//整站漫画爬取//' + str(num1) +'.'+ book_name_clean )
#menu_path_num = []
for item in soup.select('.d_menu>ul>li'):
# 用bs4中的find_all获取 #gallery-list 中是否存在 img这个标签
for a in item.find_all('a'):
#print('a', a)
# m 是 img标签中存在的属性
menu_path = 'https://www.manhwa.cc/' + a.get('href')
#count.append(menu_path)
#menu_path_num.append(re.findall(r"\d+\.?\d*", menu_path))
menu_path_num=re.findall(r"\d+\.?\d*", menu_path)
#当前一部书爬取循环,从上面得到每一章地址后,遍历这么多“章”次
#for num in menu_path_num:
print('book_url:',menu_path)
circle = requests.get(menu_path)
# 将获取的图片地址依次放入count中
count = []
# 将获取的网页内容放入BeautifulSoup
soup = BeautifulSoup(circle.text, 'lxml')
# 根据谷歌SelectGadGet这个插件,获取html标签,比如获取:#gallery-list
for title in soup.select('div.fl.r_tab_l'):
for title in title.find_all('span'):
print('title:', title.text)
title=title.text
for item in soup.select('.r_img'):
# 用bs4中的find_all获取 #gallery-list 中是否存在 img这个标签
for img in item.find_all('img'):
print('img_url:', img)
# m 是 img标签中存在的属性
img_path = img.get('data-original')
count.append(img_path)
# 用enumerate依次取出count中的图片地址 放入v中
os.makedirs('D://manhua//整站漫画爬取//' + book_name_clean + '//' + str(title) + '//')
for i, v in enumerate(count):
# 将获取的v值再次放入request中进行与网站相应
image = requests.get(v)
# 存取图片过程中,出现不能存储 int 类型,故而,我们对他进行类型转换 str()。w:读写方式打开,b:二进制进行读写。图片一般用到的都是二进制。
with open('D://manhua//整站漫画爬取//' + book_name_clean + '//'+ str(title) + '//' +str(i) + '.jpg', 'wb') as file:
#with open('C://Users//50159//Desktop//manhua//test//' + str(num1) + '_' + str(i) + '.jpg', 'wb') as file:
# content:图片转换成二进制,进行保存。
file.write(image.content)
print(i)
到这基本工作已完成,进入测试阶段,出现以下
测试问题
1.第250本左右,书名字开始出现异常,爬取书名有其他文字并出现混乱,因为之前是通过最前面几本书的情况,通过抛弃字样,来筛选出书名,而后1030本里标签发生变动,所以之后通过只取第一个出现的标签代替现在的筛选。
2.文件夹命名及生成文件夹出错,由于整理时出现混乱,代码写重复了。而后修改。
3.中途停止,可能是网站识别到了这是爬虫,而后添加伪浏览器头部head,还是会停,基本是connect超时。
针对上面问题,修改成了2.0版本:
import requests
from bs4 import BeautifulSoup
import re
import os
#1-1030
for num1 in range(2,1031):
#716字符问题无法生成文件夹
import urllib.request # url包
def openUrl(circle):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Host': 'jandan.net'
}
req = urllib.request.Request(circle, headers=headers)
response = urllib.request.urlopen(req) # 请求
html = response.read() # 获取
html = html.decode("utf-8") # 解码
print(html) # 打印
if __name__ == "__main__":
circle = requests.get('https://这里是网址/book/' + str(num1))
# 将获取的图片地址依次放入count中
count = []
# 将获取的网页内容放入BeautifulSoup
soup = BeautifulSoup(circle.text, 'lxml')
# 根据谷歌SelectGadGet这个插件,获取html标签,比如获取:#gallery-list
for item_book in soup.select('.d_bg_t'):
for book_name in item_book.select('a')[0]:
book_name_clean = book_name.string
print(num1, book_name_clean)
#os.makedirs('D://manhua//整站漫画爬取//' + str(num1) +'.'+ book_name_clean )
for item_book in soup.select('.d_bg_t'):
for book_name in item_book.find_all('a'):
if(book_name.string!='韩国'and book_name.string!='男性'):
book_name_clean=book_name.string
print(num1, book_name_clean)
#menu_path_num = []
for item in soup.select('.d_menu>ul>li'):
# 用bs4中的find_all获取 #gallery-list 中是否存在 img这个标签
for a in item.find_all('a'):
#print('a', a)
# m 是 img标签中存在的属性
menu_path = 'https://www.manhwa.cc/' + a.get('href')
#count.append(menu_path)
#menu_path_num.append(re.findall(r"\d+\.?\d*", menu_path))
menu_path_num=re.findall(r"\d+\.?\d*", menu_path)
#当前一部书爬取循环,从上面得到每一章地址后,遍历这么多“章”次
#for num in menu_path_num:
print('book_url:',menu_path)
circle = requests.get(menu_path)
# 将获取的图片地址依次放入count中
count = []
# 将获取的网页内容放入BeautifulSoup
soup = BeautifulSoup(circle.text, 'lxml')
for title in soup.select('div.fl.r_tab_l'):
for title in title.find_all('span'):
print('title:', title.text)
title=title.text
for item in soup.select('.r_img'):
# 用bs4中的find_all获取 #gallery-list 中是否存在 img这个标签
for img in item.find_all('img'):
print('img_url:', img)
# m 是 img标签中存在的属性
img_path = img.get('data-original')
count.append(img_path)
# 用enumerate依次取出count中的图片地址 放入v中
os.makedirs('D://manhua//整站漫画爬取//' + book_name_clean + '//' + str(title) + '//')
for i, v in enumerate(count):
# 将获取的v值再次放入request中进行与网站相应
image = requests.get(v)
# 存取图片过程中,出现不能存储 int 类型,故而,我们对他进行类型转换 str()。w:读写方式打开,b:二进制进行读写。图片一般用到的都是二进制。
with open('D://manhua//整站漫画爬取//' + book_name_clean + '//'+ str(title) + '//' +str(i) + '.jpg', 'wb') as file:
#with open('C://Users//50159//Desktop//manhua//test//' + str(num1) + '_' + str(i) + '.jpg', 'wb') as file:
# content:图片转换成二进制,进行保存。
file.write(image.content)
print(i)
爬取过程:
基本可行,最高纪录 ,爬取四本后停止。
真的太多了,一本大小平均150M左右。
总结:
爬取正本漫画 ✅
整站漫画半自动化爬取(停止需手动启动一次)✅
全自动下载网站漫画 (会被网站截停)❌
v2.0
2.0优化版
特点
ui界面添加✅
网站截停后 播放音乐提醒 接近半自动重启 ✅
各个细节爬取优化,优化接近自身无报错 ✅
cmd输出界面优化✅
计时器检测添加中(待)
全自动重启(待)
逻辑
代码
启动代码:
import os
os.system(r"python D:\manhua\这里是网址\manhua4.py")
os.system(r"F:\CloudMusic\是萝莉控真是太好了.mp3")
爬取代码:
import requests
from bs4 import BeautifulSoup
import re
import os
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QInputDialog, QGridLayout, QLabel, QPushButton, QFrame, QProgressBar
first=1
class InputDialog(QWidget):
def __init__(self):
super(InputDialog,self).__init__()
self.initUi()
def initUi(self):
self.setWindowTitle("漫画爬取")
self.setGeometry(50,50,1200,600)
label1=QLabel("第一本:")
label2=QLabel("最后一本:")
self.nameLable = QLabel("1")#1
self.first=int(self.nameLable.text())
self.nameLable.setText(str(self.first))
self.nameLable.setFrameStyle(QFrame.Panel|QFrame.Sunken)
self.styleLable = QLabel("1")#1030
self.last=self.styleLable.text()
self.styleLable.setText(str(self.last))
self.styleLable.setFrameStyle(QFrame.Panel|QFrame.Sunken)
# 设置进度条(弃用)
nameButton=QPushButton("更改")
nameButton.clicked.connect(self.selectName)
styleButton=QPushButton("更改")
styleButton.clicked.connect(self.selectStyle)
okButton = QPushButton("OK")
okButton.clicked.connect(self.selectOk)
mainLayout=QGridLayout()
mainLayout.addWidget(label1,0,0)
mainLayout.addWidget(self.nameLable,0,1)
mainLayout.addWidget(nameButton,0,2)
mainLayout.addWidget(label2,1,0)
mainLayout.addWidget(self.styleLable,1,1)
mainLayout.addWidget(styleButton,1,2)
mainLayout.addWidget(okButton,2,1)
self.setLayout(mainLayout)
#爬取代码
def ManHua(self):
for num1 in range(first,1030):
import urllib.request # url包
def openUrl(circle):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Host': 'jandan.net'
}
req = urllib.request.Request(circle, headers=headers)
response = urllib.request.urlopen(req) # 请求
html = response.read() # 获取
html = html.decode("utf-8") # 解码
print(html) # 打印
if __name__ == "__main__":
circle = requests.get('https://这里是网址/book/' + str(num1))
count = []
soup = BeautifulSoup(circle.text, 'lxml')
for item_book in soup.select('.d_bg_t'):
for book_name in item_book.select('a')[0]:
book_name_clean = book_name.string
print('')
print("正在下载:",num1, book_name_clean)
aa=0
#print(aa,num1)
if num1>aa:
aa=num1
#print(aa)
for i in range(int(num1*(100/1030))+1):
print('\r'+'总进度:' + '▇' * (i // 2) + str(i) + '%', end='')
print('')
for item in soup.select('.d_menu>ul>li'):
for a in item.find_all('a'):
menu_path = 'https://这里是网址/' + a.get('href')
# count.append(menu_path)
# menu_path_num.append(re.findall(r"\d+\.?\d*", menu_path))
menu_path_num = re.findall(r"\d+\.?\d*", menu_path)
# 当前一部书爬取循环,从上面得到每一章地址后,遍历这么多“章”次
# for num in menu_path_num:
#print('book_url:', menu_path)
circle = requests.get(menu_path)
count = []
soup = BeautifulSoup(circle.text, 'lxml')
#print(menu_path)
print('.', end='')
for title in soup.select('div.fl.r_tab_l'):
for title in title.find_all('span'):
#print('title:', title.text)
title = title.text
for item in soup.select('.r_img'):
for img in item.find_all('img'):
#print('img_url:', img)
img_path = img.get('data-original')
count.append(img_path)
#自动识别'文件夹+文件'重复后跳过下载如何continue
if(os.path.exists('D:/manhua/manhuatest/' + book_name_clean + '/' + str(title) + '/')):
continue
else:
os.makedirs('D:/manhua/manhuatest/' + book_name_clean + '/' + str(title) + '/')
for i, v in enumerate(count):
image = requests.get(v)
if (os.path.exists('D:/manhua/manhuatest/' + book_name_clean + '/' + str(title) + '/' + str(i) + '.jpg')):
continue
else:
with open('D:/manhua/manhuatest/' + book_name_clean + '/' + str(title) + '/' + str(i) + '.jpg', 'wb') as file:
file.write(image.content)
#print(i)
continue
continue
def selectName(self):
name,ok = QInputDialog.getText(self,"第一本","第一本序号:",
QLineEdit.Normal,self.nameLable.text())
if ok and (len(name)!=0):
self.nameLable.setText(name)
def selectStyle(self):
style, ok = QInputDialog.getText(self, "最后一本", "最后一本序号:",
QLineEdit.Normal, self.nameLable.text())
if ok and (len(style)!=0):
self.styleLable.setText(style)
def selectOk(self):
self.ManHua()
if __name__=="__main__":
import sys
app=QApplication(sys.argv)
myshow=InputDialog()
myshow.show()
sys.exit(app.exec_())
过程
总结
整站漫画全自动化爬取✅
不能自动重启❌
基本百分之95的功能实现,项目可宣布成功完成!✅
Read More ~
Tensorflow
Tensorflow是什么?
Google的开源软件库:
采取数据流,用于数值计算。
支持多种平台 —— GPU、CPU、移动设备。(方便的无缝切换,不用更改大部分的代码)
最初用于深度学习,变得越来越通用。(tensorflow并不只是适用于深度学习,大部分还是深度学习,只要是能抽象为数据流图的问题,都能使用它来解决)
数据流图:
节点 —— 处理数据
对数据进行计算,每个框框(方形,圆形)都表示一个节点。
线 —— 节点输入输出的关系
节点与节点之间的数据依赖。(如偏最上面的三个绿色节点,Cross Entropy 依赖 Softmax 和Cross Labels 的输出,通过计算得出新的值,如果前两个节点没有计算完,后面的节点是无法计算的。)
线上运输张量(tensor)
线上运输的数据,所有的n维构成了数据的集合,0维数据 ——> 数字,1维数据 ——> 向量,二维
——> 矩阵,大于等于3维的数据 ——> 高位矩阵。
让tensor(张量)在数据流图中flow(流动)——>tensorflow
节点被分配到各种计算设备上运行
特性:
高度的灵活性
可以表示为数据流图的都可使用,主要同于神经网络,卷积等都使用了封装。也可写自己的封装,就像panda函数那样。
真正的可移植性
可在很多设备上执行,如 CPU、GPU、移动设备。你在电脑里训练了一个model,可部署在服务器上,手机上,Docker上。
多语言支持
python、c++、java、R、javascript
产品和科研结合
自动求微分
性能最优化
TF1.0 — 架构:
TF2.0 — 架构:
TF2.0 — 简化的模型开发流程:
使用 tf.data 加载数据
使用 tf.keras 构建模型,也可以使用 premade estimator 来验证模型
使用 tensorflow hub 进行迁移学习
使用 eager mode 进行运行和调试
使用分发策略来进行分布式训练
导出到 SavedModel
使用 Tensorflow Serve、Tensorflow Lite、Tensorflow.js 部署模型
Read More ~
Python二三事
一、pip源(地址):
(1)阿里云 : http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣 : http://pypi.douban.com/simple/
(3)清华大学 : https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 : http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学 : http://pypi.hustunique.com/
1.普通使用:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
pip_install_-i_源的地址_包/库名
'_'符号代表空格
2.清华源使用介绍:
pypi 镜像使用帮助
pypi 镜像每 5 分钟同步一次。
临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
注意,simple 不能少, 是 https 而不是 http
设为默认
升级 pip 到最新的版本 (>=10.0.0) 后进行配置:
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
3.关于一键修改源、Linux
二、anaconda/conda 切换为国内源
windows下
在清华源和中科大源之间自行选择
添加清华源
命令行中直接使用以下命令
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
设置搜索时显示通道地址
conda config --set show_channel_urls yes
注意如果需要pytorch, 还需要添加pytorch的镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
添加中科大源
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config --set show_channel_urls yes
Linux下
将以上配置文件写在~/.condarc中
vim ~/.condarc
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true
Read More ~
安卓入门-目录结构【Android Studio】
GitHub
你所使用的很多开源程序都是在Github上
从较高的层面来说,GitHub是一个基于网站和云的服务,可以帮助开发人员存储和管理他们的代码,以及跟踪和控制对代码的更改。要准确理解GitHub是什么,您需要了解两个相关原则:
版本控制
Git
在本文中,我们将首先解释这两个原则。然后,我们将深入研究GitHub,以及如何使用GitHub与WordPress一起工作。
版本控制
版本控制可帮助开发人员跟踪和管理软件项目代码的更改。随着软件项目的发展,版本控制变得至关重要。以WordPress为例……
在这一点上,WordPress是一个非常大的项目。如果核心开发人员想要在WordPress代码库的某个特定部分上工作,那么让他们直接编辑“官方”源代码是不安全或有效的。
相反,版本控制允许开发人员安全地完成分支和合并。
通过分支,开发人员复制部分源代码(称为存储库)。然后,开发人员可以安全地更改代码的这一部分,而不会影响项目的其余部分。
然后,一旦开发人员使他或她的部分代码正常工作,他或她就可以将该代码合并回主要源代码以使其正式化。
然后跟踪所有这些更改,并在需要时可以还原。
Git
Git是Linus Torvalds于2005年创建的一个特定的开源版本控制系统。
具体来说,Git是一个分布式版本控制系统,这意味着每个开发人员的计算机上都可以使用整个代码库和历史记录,这样可以轻松进行分支和合并。
根据Stack Overflow开发人员调查,超过87%的开发人员使用Git。
GitHub
GitHub是一家营利性公司,提供基于云的Git存储库托管服务。从本质上讲,它使个人和团队更容易使用Git进行版本控制和协作。
GitHub的界面足够用户友好,所以即使是新手编程也可以利用Git。如果没有GitHub,使用Git通常需要更多娴熟技术并使用命令行。
GitHub是如此用户友好,有些人甚至使用GitHub来管理其他类型的项目 - 比如写书。
此外,任何人都可以免费注册和托管公共代码存储库,这使得GitHub特别受开源项目的欢迎。
作为一家公司,GitHub通过销售托管私有代码存储库以及其他以业务为中心的计划来赚钱,这些计划使组织更容易管理团队成员和安全性。
探索GitHub接口
为了让您基本了解GitHub接口的外观,这里是GitHub存储库中托管的WordPress源代码:
从这里,您可以查看正在处理的各个分支,以及有人进行提交时(这有点像“保存”文件)。根据存储库的设置方式,您也可以创建自己的分支并在那里进行自己的提交。
一旦进行了一些更改,您就可以通过发出拉取请求将该代码提交回分支。拉取请求基本上是要求分支机构的负责人包含您的代码。它还可以帮助那个人准确地看到你在代码中改变了什么。
如果你想更长久地在你自己的帐户上编辑部分或全部WordPress源代码,你也可以通过单击Fork按钮来叉它(叉子在概念上类似于分支,但是fork更永久):
使用Git和GitHub与WordPress
许多WordPress主题和插件开发人员在GitHub上托管他们项目的源代码。例如,您可以查看Elementor页面构建器代码,Zerif Lite主题源代码等等。
但也有WordPress插件可以帮助您更直接地使用Git和WordPress。
例如,VersionPress旨在将Git的强大功能引入常规的WordPress操作,例如更新帖子或安装插件。VersionPress为您的WordPress文件和数据库添加版本控制。
WP Pusher是另一个基于Git的插件,可让您直接从GitHub将主题和插件部署到WordPress网站。
开始使用GitHub
要开始使用GitHub:
注册一个免费的GitHub帐户
按照GitHub Hello World指南了解您可能想要采取的最受欢迎的操作。
官网地址:https://github.com/
如何加快github下载速度
https://blog.csdn.net/mist99/article/details/80602090
52.216.186.155 github-production-release-asset-2e65be.s3.amazonaws.com
service network restart
Read More ~
疑难杂症
xp的web之旅
环境:
用家里的xp系统,是之前用类似“番茄花园”的整合版安装的。
在尝试各种wamp的版本屡屡碰壁后,试着用其他整合环境:
1.phpstudy
初次采用时,搭建z-blog感觉良好,界面也比较熟悉。
而后的chanzhi与lzcms都同一个错误,you don’t have permisson to aseen it ! ;可能是lzcms的静态没开,但之后开了也没反应,并不能确认是否开成功。
之后发现可能是之恩能够开在linux上!也可能第一次访问后,就默认了一个ip一个网站,再访问其他需要在配置文件里修改加上,但这个可能比较小,因为这违反了www的访问习惯,
在这个目录下,就算是不同系统,如果把他们看成其中一个的分系统,那样也说得清。
2.phpwamp
就是因为phpstudy遇到了这个情况,所以采用phpwamp,感觉这个比他跟老式,不过更加适合我的xp。
用着用着感觉也是和phpstudy差不多,类似于绑定访问的第一个,这次我不用lzcms,我用chanzhicms。也尝试着去改这改那,发现还是不行。
最后,找到了wamp2.2/2.4(之前的假wamp浪费了很多时间),php版本和apache版本也刚好到chanzhi要求。
所以用上了这个wamp,xp真的不容易,各种软件要兼容,在现在这个环境下。
计划:用wamp学tp,最初的想法就是这样,为了混乱原有的环境,想在另一台电脑,xp上弄,结果也不省心。最后可以了
写能执行cmd命令的bat文件
每次运行jar文件时,我总是需要先打开cmd窗口,再切换到我jar文件保存的盘符,再执行java -jar test.jar,虽然操作不是很复杂,但是如果直接写一个bat文件,每次使用直接双击,这种傻瓜式的方式,估计更容易被大家所喜欢并能够方便使用。
方式也很简单,比如:
新建一个txt文本,输入如下:
然后保存为bat文件即可,如果以后路径或者名称有变更的话,直接编辑修改,不用每次再去cmd中输入指令了。
双击即可运行test1.jar的代码啦!
又或者例如:
更新hexo,同步缓存
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_15158911/article/details/54613948
云计算 docker
参考:
https://blog.csdn.net/qq_22211217/article/details/80414227
https://blog.csdn.net/hehailiang_dream/article/details/79983229
https://blog.csdn.net/yr12dong/article/details/80720690
关于网络工程师
考纲:
【中国计算机技术职业资格网(软考)】
2019年官网考纲:http://www.ruankao.org.cn/platform/details?code=02_24
学习资源:
【哔哩哔哩 (゜-゜)つロ 干杯~-bilibili】
1.2019网络工程师【软考】
2.网络工程师考试-视频教程-希赛
下载途径:
1.https://www.jijidown.com/
2.b站手机版
3.https://github.com/Henryhaohao/Bilibili_video_download
简易桌面 v1.0 总结
项目1:简易桌面1.0
针对于mom使用eclipse为平台制作的第一代,简易桌面软件,目的在于用户的简易操作。
问题:经验总结:
第一:明确目的,时刻纠正方向,走走停停。
第二:确定方向,用图画的方式将界面描绘好,利于以后的代码翻译编写。
第三:在实际编程的过程中,会出现一些小改动,处于临时的灵感,就会对草稿图进行修改,想象计划与实际真的有很大的出入。真的不去实际做一做,可能你永远也不知道。
第四:停留知识水平,框架的基础构建,只是皮毛,经过网上的百度学习,在错误值积累经验,蹒跚学步,跌跌撞撞。做出来还是可以看的,但是技术要求方面不高。达不到要求。
第五:有必要进行一次完整的学习,零碎伴有一些错误的学习经历,危害甚大。一次不完整的学习经历的确可以对往后造成很大的危害。
第六:遇到问题方面;是灵感想法创意的来源。认识到错误,提高自己。做好笔记。
第七,固步自封,井底之蛙,最为致命;以上讨论的比较大概,会做更详细的分析(问题)。
今天导出后 在xp上准备运行 先前研究过得知 需要运行环境jre才能运行可运行jar,在win10(有jre1.8的环境中运行可以)上ok,在xp上时,显示jar直接为一个zip,考虑问题,可能是环境jre安装错误,后面才意识到要安在c盘,还要注册表注册?主要是下载来的jre1.8u151是类似安装包安装在c盘上后的文件夹效果,应该下个安装包。再来试试。正在放到xp上的感觉,xp真的很久很久。以后考虑换成win7,再来,可能会轻松点
简易桌面 v1.0 问题
简易桌面v1.0
问题1:(状态:已解决)
解决:用new Enter()的方法,比没有想象中的跳转画面,但是衍生出new后,布局排版乱了,按钮飞到最上面,经过移植斗地主的布局代码,经过调试修改,成功解决,ojbk)
问题:以new Enter();的形式切换应用节目缺点,画面会跳一下,影响观感,使用体验。
将DDX展开为全屏,原游戏窗口大小不变,流式布局下添加按钮btn,setbounds,背景Lable。
问题二:(未解决)
卡片式切换组件?
文字+纯色背景→图片→组件→程序
new Enter()后,前个class会自动隐藏掉
问题三:(simplewindow系统设计)
主界面-音乐播放器
音乐播放器考虑new后会重复播放,而且主界面在new后还在,所以计划把播放器仅仅镶在第一个主界面即可,有难度……应该ok
斗地主界面
推箱子界面
魔兽
相片浏览界面
主菜单
进度50%
音乐界面修改作为主菜单
看相册界面作为主界面与游戏按钮并列的按钮
这两个项目进展可以,遇到的问题很多也解决了很多,github上的代码不错,要达到预期效果还需要经过不断调整,学习。
进度85%
简易桌面 v1.0 错误汇总
问题1:【五子棋退出按钮后序出现多余画面】
注意点1:
【五子棋退出按钮后序出现多余画面】
这是五子棋小游戏的游戏画面
其他地方大致都调试好,运行都ok。
出问题的是红色圈的按钮;“返回桌面”
if(event.getSource()==exitbtn){
dispose();
//存在执行后,会继续弹出按钮和面板,再按一次吃咸的“确认”按钮,才能正常关闭
}
详细如下:
当按按钮“返回桌面”时,应该是执行“dispose()”,一个很直接的关闭窗口命令。
然而出现了这一幕,可能是关乎于:
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setDefaultCloseOperation(JFrame.EXIT_ON_DISPOSE); //(这句dispose)
不知道正确性,就是当关闭窗口时是否停止整个线程?的意思?
这种情况是出现在用Star()启动时会出现,(frame之间切换的冲突?),单独运行这个五子棋Gobang(),关闭便不会出现这种情况。
注意点2:
【第?个ImagesVewier,尝试通过识别图片分辨率,长和宽来确定他的setbounds和size】
通过识别图片的长和宽,如(图片)width+height>=1800(拟定大小,尽可能小),考虑图片比较小就将其定位于接近框架中间(框架为全屏),并且将其(照片)设为一个800*800(较小)的大小。若width+height<1800,考虑比较大的图片,将其设置为最大窗口大小,后续考虑,图片的长宽比例,进行图片size的调整。
if(width+height>=1800){
iconimage.setbounds(200,200,800,800)
}
if(width+height<1800){
iconimage.setbounds(350,350,800,800)//拉扯
}
注意点3:按钮监听的两种模式
按钮监听的两种模式:第一种可以监听事件里可以直接使用dispose();而第二种需要如:jFrame.dispose();this.dispose();????还未100%肯定,待研究
class entend ActionListener {
//按钮布局,JButton;
如果是在class里初始化声明了如:
JButton DDZButton,BOXButton,WZQButton;
后面接的直接可以是:
DDZButton = new JButton("斗地主",new ImageIcon("images/dizhu.gif"));
BOXButton = new JButton(new ImageIcon("image/bt.jpg"));
WZQButton = new JButton("五子棋",new ImageIcon("images/5son.png"));
DDZButton.setBounds(63,34,180,130);
BOXButton.setBounds(64,180,180,133);
WZQButton.setBounds(63,331,188,140);
this.add(WZQButton);
this.add(BOXButton);
this.add(DDZButton);
//装监听
backButton.addActionListener(this);
DDZButton.addActionListener(this);
BOXButton.addActionListener(this);
public ActionListener{
if(ae.getSource()==DDZButton)
{
new Main();
}
if(ae.getSource()==BOXButton)
{
new LoginFrame();
}
if(ae.getSource()==WZQButton)
{
new Gobang();
}
}
}
而如果没有事先声明初始化的话
这样:
JButton DDZButton = new JButton("斗地主",new ImageIcon("images/dizhu.gif"));
JButton BOXButton = new JButton(new ImageIcon("image/bt.jpg"));
JButton WZQButton = new JButton("五子棋",new ImageIcon("images/5son.png"));
DDZButton.xxxxx{
xxxxxxx
}
//监听都好像不用
注意点4:imagesviwer拥有的功能
github上的这个imagesviwer拥有的功能与其他类型的图片浏览器相比。其具有多了按钮有图标,其他很相似。但意外发现“->”这个符号。提示错误,是因为这个符号是jdk1.8的新特性。我得eclipse jdk开发环境最高是到1.7,所以。。然后为了解决这个问题,首先装上一个jdk1.8(这里补充jdk是开发环境,jre是运行环境,即导出成可运行jar后,需要先安装对应版本的jre。),关联eclipse后,依然是不行,(具体:依然提醒和之前一样的错误,没有变化)。然后上了eclipse的官网,Oracle上下了个网络安装包,安装了个应该是ee版本的eclipse,最高jdk版本达到1.9(最新),安装打开后,启动画面是什么otion(氧气的英文)。结果导入包后,运行结果:界面出来了,但是按按钮没反应。(图片并未出来,后面有说明)eclipse里提示错误:
{
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at github.ViewerAction.actionPerformed(ViewerAction.java:39)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at github.ViewerAction.actionPerformed(ViewerAction.java:39)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
}
但是以前曾经在通过改变里面的图片绝对路径后,显示图片后,按按钮好像第一次不行,之后再试就可以正常运行了。
注意点5:进入斗地主反应(响应)慢
问题一:进入“斗地主小游戏”的时候,反应速度接近7至8秒。其他的小游戏还行。
Read More ~
Python & Minecraft
1.用python学习minecraft
原理:用python2.7.6接入mc游戏接口,利用python语句调试mc游戏。
异常:控制台(开服器cmd)有时会出现python调试后(已经开始执行运行一个py时),无反应,游戏也是。按下回车后即可(类似于刷新),才有反应(恢复正常)
最为基础的是这个“将pythonGUI和mc游戏连接起来”具体是python链接进mc提供的接口: 创建一个py格式文件,在myadventure目录下例:buildHouse.py
1.导入需要的模块:【类似于Java的Import】import mcpi.minecraft as minecraftimport mcpi.block as block(还有时间方面的import time)
2.连接Minecraft游戏:【注意大小写,英文冒号以及python语言格式】mc=minecraft.Minecraft.create()
一.
1.在这个网站下载“入门包”:https://www.wiley.com/WileyCDA/Section/id-823690.html
2.python2.7.6下载:https://www.python.org/download/releases/2.7.6/
二.
1.打开 开服器cmd,开服localhost,使用mc1.6.4客户端连上localhost
…
Read More ~
关于博客主题
typecho博客主题修改
以下为修改主题,自定义的一些配置:
原主题地址:
Postbird-typecho-two-sidebar-block作者: postbird 版本: 0.0.1Postbird typecho 两栏博客简约主题
了解详情:
https://gitee.com/postbird/typecho-blog-theme-two-siderbar
仿docs主题(改进):
1.导航栏颜色,背景。
2.菜单折叠颜色。
3.模板响应式。
随缘找回来,因为以选择其他主题,有空换一下截个图(然而也没人看,主要是记录修改的规律嗯)
自定义脚本:(百度统计)
<script>
(function(){
var canonicalURL, curProtocol;
//Get the <link> tag
var x=document.getElementsByTagName("link");
//Find the last canonical URL
if(x.length > 0){
for (i=0;i<x.length;i++){
if(x[i].rel.toLowerCase() == 'canonical' && x[i].href){
canonicalURL=x[i].href;
}
}
}
//Get protocol
if (!canonicalURL){
curProtocol = window.location.protocol.split(':')[0];
}
else{
curProtocol = canonicalURL.split(':')[0];
}
//Get current URL if the canonical URL does not exist
if (!canonicalURL) canonicalURL = window.location.href;
//Assign script content. Replace current URL with the canonical URL
!function(){var e=/([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi,r=canonicalURL,t=document.referrer;if(!e.test(r)){var n=(String(curProtocol).toLowerCase() === 'https')?"https://sp0.baidu.com/9_Q4simg2RQJ8t7jm9iCKT-xh_/s.gif":"//api.share.baidu.com/s.gif";t?(n+="?r="+encodeURIComponent(document.referrer),r&&(n+="&l="+r)):r&&(n+="?l="+r);var i=new Image;i.src=n}}(window);})();
</script>
自定义 stylesheet 样式:
.widget {
margin-bottom: 0!important;
}
.list-group-item-info {
color: #fff;
}
#secondary .list-group-item.list-group-item-info {
background-color: #343a40!important;
}
Gridea博客主题修改
顶部导航栏会在纵向滚动条下拉时自动隐藏(淡出),在上拉时在弹出
(给出最大阅读空间,保留上拉出现导航栏,保证功能)
找到Gridea的工作目录:
进入并打开:Gridea\themes\lemon\templates\includes\header.ejs
开头添加:
<style>
.header-navigation {
position:fixed;
top:0;
width:100%;
height:60px;
line-height:60px;
background-color:#333;
text-align:center;
box-shadow:0 14px 28px rgba(0,0,0,0.25),0 10px 10px rgba(0,0,0,0.22);
z-index:9999;
}
/* Slide transitions */
.slideUp {
/* -webkit-transform:translateY(-100px);
transform:translateY(-100px);
*/
-webkit-transform:translateY(-100px);
-ms-transform:translateY(-100px);
-o-transform:translateY(-100px);
transform:translateY(-100px);
/*transition:transform .5s ease-out;
*/
-webkit-transition:transform .5s ease-out;
-o-transition:transform .5s ease-out;
transition:transform .5s ease-out;
}
.slideDown {
/*-webkit-transform:translateY(0);
transform:translateY(0);
*/
-webkit-transform:translateY(0);
-ms-transform:translateY(0);
-o-transform:translateY(0);
transform:translateY(0);
/*transition:transform .5s ease-out;
*/
-webkit-transition:transform .5s ease-out;
-o-transition:transform .5s ease-out;
transition:transform .5s ease-out;
}
</style>
保存,刷新Gridea,查看效果
Read More ~
数据库&PHP-问题合集
#关于数据库-mysql账号密码login
数据库——mysql
忘记密码处理:
主要分成两种情况:
第一大种:(集成环境安装的,倾向php,mysql小型数据库)
账号:root
密码:
免密;
root;
168168;
123456
等
第二大种:(倾向mysql安装版或压缩版,半集成)
账号:root
密码:
(一段字符英文加数字)默认给你设置好,第一次初始化需要手动修改(特色)
如:
ABC123xyz
Wx<<1Cfdd8&f
新的理解:
在阿里云上安装phpstudy后,第一次进入数据库密码不对,默认数据库密码应为root,所以phpstudy没用他自己的数据库,mysql也启动失败,最后手动启动“服务”里的mysql,查看原有mysql密码,可以了。
#php查询sql 中文乱码“ ?”
查询中文时出现乱码”????1“
编码检查都是utf-8
之后按照这个,修改了mysql 的 my.ini 三个位置 ok
https://blog.csdn.net/u014762625/article/details/80667115
由上图可见database和server的字符集使用了latin1编码方式,不支持中文,即存储中文时会出现乱码。以下修改方法:
Linux 系统
(1)关闭mysql服务
service mysql stop
(2)修改 /etc/mysql/my.cnf (默认的安装路径)
vim /etc/mysql/my.cnf
打开my.cnf后,在文件内的[mysqld]下增加如下两行设置:
character_set_server=utf8
init_connect='SET NAMES utf8'
保存退出
(3) 重新启动mysql服务
service mysql restart
完成修改,使用查询命令show variables like 'character%'; 查看编码变为utf8的。
windows系统
打开mysql安装目录,有一个my-default.ini文件,复制一份修改名称my.ini
打开my.ini,加入下面的内容:
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
保存,重启mysql服务,完成修改。
————————————————
版权声明:本文为CSDN博主「宋宋Jimi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014762625/article/details/80667115
以下与标题无关:
(记一次记录ip,get ip php语句 安在菜单栏的加载里(数据库查询) 插进数据库 再后台读取)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 501596098@qq.com
文章标题:php数据库的增删改查及php与javascript之间的交互
本文作者:Buzi
发布时间:2019-07-30, 13:54:07
最后更新:2019-09-18, 15:09:30
原始链接:http://littlebuzi.github.io/2019/07/30/php/mysql_php/
版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。
Read More ~
php数据库的增删改查&php与javascript之间的交互
这篇文章主要为大家详细介绍了php数据库的增删改查,以及php与javascript之间的交互,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,原地址:https://www.jb51.net/article/122598.htm
使用语言操作数据库是重中之重,如果一门语言你不懂得如何操作数据库,那么你还是没有学会这门语言。
PHP操作数据库的方法并不难
同时php的值还可以与JavaScript脚本之间进行控制
一般是php的值传递到javascript中,一般不会反过来操作
一、基本目标
首先,在mysql中有一张用户信息表user,里面的字段分别是id,username与password,打开网页dbselect.php,首先就用php查出整张user表:
然后,插入数据的一栏,输入数据,就可把数据插入到mysql中的user表当中
在修改数据的一栏中,第一个下拉菜单是通过javascript来创建的,根据表中的数据多少,而给予多少的下拉选项。
第二个下拉菜单让用户选择要修改的列
第三个输入框就是让用户输入要修改的值
至于为什么没有做删除数据,那是因为一来删除数据的操作与修改数据类似,二是因为在自增表中一般不删除数据的,仅仅是设置键值让这条数据隐藏
二、基本思想
程序入口是dbselect.php,操作数据库的过程分别是两个新页面,一个dbinsert.php,一个是dbupdate.php,这两个页面操作完数据库,马上通过javascript返回。
三、制作过程
(1)dbselect.php
也是本实现过程中,最复杂的一个页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>dbselect</title>
</head>
<body>
user表:
<table border="1">
<tr>
<td>id</td>
<td>username</td>
<td>password</td>
</tr>
<?php
//php连接数据库的指定动作,其中第一个root是数据库的用户名,第二个root是数据库的密码
//如果连接失败,马上通过die语句打断后面的所有程序,只输出“连接失败”
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败!");
}
//要操作test数据库
mysql_select_db("test",$con);
//total变量是用来记录user记录条数的
$total;
//要在test数据库中操作select count(*) as total from user语句并且把结果放到result变量里
$result=mysql_query("select count(*) as total from user");
//result变量是个数据,$total=$row["total"];把查询结果中的total列的值赋予给php中的total变量
//$row=mysql_fetch_array($result)能够把当前行的值赋予给row数组,并把游标下移一行,游标并不需要初始化,自动完成
while($row=mysql_fetch_array($result)){
$total=$row["total"];
}
//输出整个表的过程与上面的过程类此
$result=mysql_query("select * from user");
while($row=mysql_fetch_array($result)){
echo "<tr>";
echo "<td>${row["id"]}</td>";
echo "<td>${row["username"]}</td>";
echo "<td>${row["password"]}</td>";
echo "</tr>";
}
//查询完毕,记得人走带门
mysql_close($con);
?>
</table>
<br />
<!--以下是两个表单,不再赘述了-->
插入数据:
<form action="dbinsert.php" method="get">
username:<input type="text" name="username" />
password:<input type="text" name="password" />
<input type="submit" value="go!" />
</form>
修改数据:
<form action="dbupdate.php" method="get">
<select id="userid" name="userid"></select>
<script>
//这是php与javascript交互部分,把上面求出来的php的$total变量,赋予给javascript的var total
var total=<?php echo $total; ?>;
var i=1;
for(i=1;i<total+1;i++){
//javascript增加节点过程
var selectnode=document.createElement("option");
selectnode.value=i;
selectnode.innerHTML=i;
document.getElementById("userid").appendChild(selectnode);
}
</script>
<select name="rowname">
<option value="username">username</option>
<option value="password">password</option>
</select>
<input type="text" name="rowtext" />
<input type="submit" value="go!" />
</form>
</body>
</html>
javascript控制html节点的详细,可以参照我之前写的《【JavaScript】网页节点的增删改查》一文(点击打开链接)
(2)dbinsert.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>dbinsert.php</title>
</head>
<body>
<?php
//首先从dbselect.php的表单中接受操作的数据
//dbselect.php故意用到get方法,只是想说明php中对get与post的处理同样可以通过$_REQUEST["变量名"]来实现
$username=$_REQUEST["username"];
$password=$_REQUEST["password"];
//操作数据库的指定动作同dbselect.php。
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败!");
}
mysql_select_db("test",$con);
//控制数据库比dbselect.php更加简单,因为不用对数据库的查询结果进行处理
//只是要注意,这里连接字符串是用到.的,而不是jsp的+,asp的&,请注意!
mysql_query("insert into user(username,password) values ('".$username."','".$password."');");
mysql_close($con);
?>
<script>
alert("添加成功");
window.location.href="dbselect.php" rel="external nofollow" rel="external nofollow" ;
</script>
</body>
</html>
(3)dbupdate.php
与dbinsert.php逻辑是一模一样的,只是mysql_query那个的查询语句,从insert into语句变成了update语句而已
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<?php
$userid=$_REQUEST["userid"];
$rowname=$_REQUEST["rowname"];
$rowtext=$_REQUEST["rowtext"];
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败!");
}
mysql_select_db("test",$con);
mysql_query("update user set ".$rowname."='".$rowtext."' where id=".$userid.";");
mysql_close($con);
?>
<script>
alert("修改成功");
window.location.href="dbselect.php" rel="external nofollow" rel="external nofollow" ;
</script>
</body>
</html>
以上,就是整个制作过程。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 501596098@qq.com
文章标题:php数据库的增删改查及php与javascript之间的交互
本文作者:Buzi
发布时间:2019-07-30, 13:54:07
最后更新:2019-09-18, 15:09:30
原始链接:http://littlebuzi.github.io/2019/07/30/php/mysql_php/
版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。
Read More ~
企业建站-问题合集
#部署-巅云自助建站系统3.0学习试用
1.刚用的时候,phpwamp运行,结果乱码。改用wamp也是。改utf-8源码标签,不行。最后尝试改index为utf-8记事本保存可以。但剩下的文件手动改不可能。就用了个批量改文件软件把所有格式的文件都改成utf-8,改动中,提示“.db”,修改不成功。最后改完,运行。还是乱码,记事本打开,还是utf-8编码。。。最后把说明看一遍,有个地方:阿帕奇和php版本有要求(好像阿帕奇没说),php版本说要5.3-5.6,不信邪换了下,真的行了。。。
所以,需看清php版本!!!
#dicuz不支持php7以及以上 on wamp
wamp部署discuzx时:
wamp版本:
discuzx:
(正好遇上discuzx关闭,貌似)
放进www下后发现,报错:
原因dicuz不支持php7以及以上(我的运行时是php7.2非5.6)
所以屏蔽掉这里
/install/index.php
即可!
访问空白
https://gitee.com/3dming/DiscuzL/attach_files
这个可行!
Read More ~
二次元资讯网站
二次元资讯网站
练手(cms_wordpress方向研究) + 兴趣(二次元)
基于/环境
1.wordpress(php)
2.mysql
3.wampserver
图片
首页1
首页2
目录分类
登录注册
文章
排行版
手机版
Read More ~
帝国时代Ⅱ—2018年世界高手排名前10
NO1.Theviper 🏆
挪威人 28岁 属于战队:神队 2011-2018年至今还是保持着世界第一的位置,帝国时代历史上第一个最久的世界第一玩家,世界大赛无论团战或者单挑获过无数次冠军。打局风格:全能型,经济和军事平衡接近完美,比赛非常认真投入,娱乐局就喜欢非主流玩法较多,评分:9.9分 RANK积分2700+
NO2.Liereyy
又名 天才少年 奥地利人 17岁 未来世界第一,所属战队:AM 2017年初RANK积分2300+,后面有一次和DAUT打过一次比赛用MM左右摇摆躲开DAUT船的攻击,吸引了所有玩家的眼球,进步神速,具有非常恐怖的手速,后面再次和VIP交手几次单挑赛比分接近都遗憾输了,也许是太年轻了,需要时间来磨练心态和经验,但是除了VIP世界上没人打得过他,打局风格:经济完美,微操完美,评分9.8分 RANK积分2680+
NO3.TheMax
芬兰人 24岁 世界第一团战王 所属战队:芬兰队 2017年MAX带进芬兰队杀入国家杯决赛,MAX是我的偶像,因为他常常做了没人做的到事情,常常在超级逆风局里面可以1V3甚至1V4 CARRY全场,分明分基本第一,中后期具有爆发力的一个玩家,因为他的队友并不是很厉害,如果队友可以拖到中后期MAX就可以带领他们走向胜利。打局风格:围家,经济完美,后期18线操作,评分9.7 RANK积分2550+
NO4.YO
又名 猜火车 中国人 26岁 所属战队:中国SY,2011年出道,单挑和多人基本都非常细致,,具有灵气的一位选手,不慌不忙,近年来比赛都非常出众,2016年带领SY在王者之师世界大赛上击败神队获得冠军,今年的封心比赛获得冠军,打局风格:全能型选手,沉稳,问题不大,后期发力,评分9.7分 RANK积分2600+
NO5.LYX
又名 冲动 中国人 30岁 所属战队:中国SY,2009年就非常厉害了,2012年在VIP巅峰时期冲动连日VIP几局,成为了很多玩家的偶像,搞事情特别强,偷猪,围资源,阴塔能力非常犀利,经验丰富,意识流玩家,2016年带领中国SY在王者之师大赛击败神队获得冠军,多人局作用非常大,最愿意牺牲的一个玩家,现在无论单挑和多人局都是非常具有观赏性的玩家,打局风格:全能型,能打能坑能奶,直播经典语录:我艹这个傻逼,评分9.6分 RANK积分2500+
NO6.VIVI
又名肥龙 当年情 中国人25岁 所属战队:中国疯狂 08年出道,09年在征服地带非常出名,因为喜欢骂人,然后所有人骂我傻逼,我就非常出名了,2012年积分打到2200+然后退役,打LOL。2016年复出,16年带领CR队在王者之师拿了第四,17年带领疯狂队拿了国家杯第三,近期在微软大赛上做了很多人认为做不到的事情,0比2落后的情况上连反天才少年3局,好了不吹逼了,打局风格: 前期非常凶,后期也不差,兄弟,不要慌,等我升曾瑞。评分9.6分 RANK 积分2600+
NO7.NICOV
阿根廷人 25岁 所属战队:AM队 NICOV2016积分打到世界第一,吸了无数粉丝,阿拉伯单挑非常凶,那时候肥龙老师跟车老师都深深对他有恐惧感,多次被打哭,当时好多人认为他是VIP的接班人,但毕竟是阿拉伯地图出众,他的经济调配非常极限,城堡一波带走了对手,但是比赛的时候的心态容易崩,,今年封心举办的单挑赛就可以看得出来,在积分遥遥领先的情况下被车老师赶超,但是多人局也非常出色,在今年的非洲王朝带领AM队拿了亚军,打局风格:经济极限 前期很凶 后期也不错,评分9.5分 积分2550+
NO8.MBL
挪威人 24岁 所属战队 AM队 MBL这个玩家一直非常活跃在国际积分平台,AM队创始人,MBL很多人认为他比较菜,但是他的后期超级猛,喜欢偷经济,防守拖到帝王时代发力,因为他后期能种100块农田,打不死你耗死你,真正的经济流玩家,最近的阿拉伯大师赛获得击败火车获得冠军,还有国际现场公寓杯在VIP3比1领先的情况下连反VIP3局击败VIP,有时候非常猛有时候非常懵逼的玩家之一,也具有灵气的打法,让对手不知道他在干嘛,打局风格:种田为主,搭爆自己,防守为主,评分9.5分 积分2600+
NO9.DAUT
塞黑人 32岁 所属战队:神队 DAUT拿过无数次世界冠军,前世界第一, DAUT在没有VIP出现之前基本都是世界第一,但是现在也非常凶猛,经济军事和意识都还是保持在高水准,单挑没人敢说包赢他,经验丰富,意识老辣,经济非常出众,今年在非洲王朝的大赛上带领神队击败AM获得冠军,打局风格:进攻后发展,经济发展非常快,比较出名的一句话,DAUT castle 评分9.4分 RANK积分 2500+
NO10.RIUT
巴西人 25岁 所属战队:巴西队 RIUT是早期非常出名的选手,曾经的世界第二,打局非常沉稳又非常猛,在很早年前就拿过N次冠军,但是最近比较少玩,只在比赛的时候出现,水平依然高水准,早期在神队玩,现在在巴西队,RIUT之前是老外最喜欢的玩家,因为进攻犀利,微操细致,非常沉稳,对线基本不会蹦 ,得了很多人的认可,打局风格:细致 快而不乱 进攻非常凶猛,打手级别,评分9.4分 RANK积分2500+
转载自斗鱼鱼吧:https://yuba.douyu.com/p/425315671538341464
主播:肥龙最帅最牛B
Read More ~
GitHub
你所使用的很多开源程序都是在Github上
从较高的层面来说,GitHub是一个基于网站和云的服务,可以帮助开发人员存储和管理他们的代码,以及跟踪和控制对代码的更改。要准确理解GitHub是什么,您需要了解两个相关原则:
版本控制
Git
在本文中,我们将首先解释这两个原则。然后,我们将深入研究GitHub,以及如何使用GitHub与WordPress一起工作。
版本控制
版本控制可帮助开发人员跟踪和管理软件项目代码的更改。随着软件项目的发展,版本控制变得至关重要。以WordPress为例......
在这一点上,WordPress是一个非常大的项目。如果核心开发人员想要在WordPress代码库的某个特定部分上工作,那么让他们直接编辑“官方”源代码是不安全或有效的。
相反,版本控制允许开发人员安全地完成分支和合并。
通过分支,开发人员复制部分源代码(称为存储库)。然后,开发人员可以安全地更改代码的这一部分,而不会影响项目的其余部分。
然后,一旦开发人员使他或她的部分代码正常工作,他或她就可以将该代码合并回主要源代码以使其正式化。
然后跟踪所有这些更改,并在需要时可以还原。
Git
Git是Linus Torvalds于2005年创建的一个特定的开源版本控制系统。
具体来说,Git是一个分布式版本控制系统,这意味着每个开发人员的计算机上都可以使用整个代码库和历史记录,这样可以轻松进行分支和合并。
根据Stack Overflow开发人员调查,超过87%的开发人员使用Git。
GitHub
GitHub是一家营利性公司,提供基于云的Git存储库托管服务。从本质上讲,它使个人和团队更容易使用Git进行版本控制和协作。
GitHub的界面足够用户友好,所以即使是新手编程也可以利用Git。如果没有GitHub,使用Git通常需要更多娴熟技术并使用命令行。
GitHub是如此用户友好,有些人甚至使用GitHub来管理其他类型的项目 - 比如写书。
此外,任何人都可以免费注册和托管公共代码存储库,这使得GitHub特别受开源项目的欢迎。
作为一家公司,GitHub通过销售托管私有代码存储库以及其他以业务为中心的计划来赚钱,这些计划使组织更容易管理团队成员和安全性。
探索GitHub接口
为了让您基本了解GitHub接口的外观,这里是GitHub存储库中托管的WordPress源代码:
从这里,您可以查看正在处理的各个分支,以及有人进行提交时(这有点像“保存”文件)。根据存储库的设置方式,您也可以创建自己的分支并在那里进行自己的提交。
一旦进行了一些更改,您就可以通过发出拉取请求将该代码提交回分支。拉取请求基本上是要求分支机构的负责人包含您的代码。它还可以帮助那个人准确地看到你在代码中改变了什么。
如果你想更长久地在你自己的帐户上编辑部分或全部WordPress源代码,你也可以通过单击Fork按钮来叉它(叉子在概念上类似于分支,但是fork更永久):
使用Git和GitHub与WordPress
许多WordPress主题和插件开发人员在GitHub上托管他们项目的源代码。例如,您可以查看Elementor页面构建器代码,Zerif Lite主题源代码等等。
但也有WordPress插件可以帮助您更直接地使用Git和WordPress。
例如,VersionPress旨在将Git的强大功能引入常规的WordPress操作,例如更新帖子或安装插件。VersionPress为您的WordPress文件和数据库添加版本控制。
WP Pusher是另一个基于Git的插件,可让您直接从GitHub将主题和插件部署到WordPress网站。
开始使用GitHub
要开始使用GitHub:
注册一个免费的GitHub帐户
按照GitHub Hello World指南了解您可能想要采取的最受欢迎的操作。
官网地址:https://github.com/
Read More ~
阿尔法狗的工作原理及核心技术
阿尔法围棋(AlphaGo)是第一个击败人类职业围棋选手、第一个战胜围棋世界冠军的人工智能程序,由谷歌(Google)旗下DeepMind公司戴密斯·哈萨比斯领衔的团队开发。
那么阿尔法狗的工作原理是什么?相关技术又有哪些呢?下面让我们一起来看看。
工作原理
阿尔法围棋(AlphaGo)为了应对围棋的复杂性,结合了监督学习和强化学习的优势。它通过训练形成一个策略网络(policynetwork),将棋盘上的局势作为输入信息,并对所有可行的落子位置生成一个概率分布。然后,训练出一个价值网络(valuenetwork)对自我对弈进行预测,以-1(对手的绝对胜利)到1(AlphaGo的绝对胜利)的标准,预测所有可行落子位置的结果。这两个网络自身都十分强大,而阿尔法围棋将这两种网络整合进基于概率的蒙特卡罗树搜索(MCTS)中,实现了它真正的优势。新版的阿尔法围棋产生大量自我对弈棋局,为下一代版本提供了训练数据,此过程循环往复。
在获取棋局信息后,阿尔法围棋会根据策略网络(policynetwork)探索哪个位置同时具备高潜在价值和高可能性,进而决定最佳落子位置。在分配的搜索时间结束时,模拟过程中被系统最频繁考察的位置将成为阿尔法围棋的最终选择。在经过先期的全盘探索和过程中对最佳落子的不断揣摩后,阿尔法围棋的搜索算法就能在其计算能力之上加入近似人类的直觉判断
围棋棋盘是19x19路,所以一共是361个交叉点,每个交叉点有三种状态,可以用1表示黑子,-1表示白字,0表示无子,考虑到每个位置还可能有落子的时间、这个位置的气等其他信息,我们可以用一个361*n维的向量来表示一个棋盘的状态。我们把一个棋盘状态向量记为s。
当状态s下,我们暂时不考虑无法落子的地方,可供下一步落子的空间也是361个。我们把下一步的落子的行动也用361维的向量来表示,记为a。
这样,设计一个围棋人工智能的程序,就转换成为了,任意给定一个s状态,寻找最好的应对策略a,让你的程序按照这个策略走,最后获得棋盘上最大的地盘。
三大核心技术
AlphaGo结合了3大块技术:先进的搜索算法、机器学习算法(即强化学习),以及深度神经网络。这三者的关系大致可以理解为:
1、蒙特卡洛树搜索(MCTS)是大框架
实质上可以看成一种增强学习
蒙特卡罗树搜索(MCTS)会逐渐的建立一颗不对称的树。可以分为四步并反复迭代:
(1)选择
从根节点,也就是要做决策的局面R出发向下选择一个最急迫需要被拓展的节点T;局面R是第一个被检查的节点,被检查的节点如果存在一个没有被评价过的招式m,那么被检查的节点在执行m后得到的新局面就是我们所需要展开的T;如果被检查的局面所有可行的招式已经都被评价过了,那么利用ucb公式得到一个拥有最大ucb值的可行招式,并且对这个招式产生的新局面再次进行检查;如果被检查的局面是一个游戏已经结束的游戏局面,那么直接执行步骤4;通过反复的进行检查,最终得到一个在树的最底层的最后一次被检查的局面c和它的一个没有被评价过的招式m,执行步骤2。
(2)拓展
对于此时存在于内存中的局面c,添加一个它的子节点。这个子节点由局面c执行招式m而得到,也就是T。
(3)模拟
从局面T出发,双方开始随机的落子。最终得到一个结果(win/lost),以此更新T节点的胜利率。
(4)反向传播
在T模拟结束之后,它的父节点c以及其所有的祖先节点依次更新胜利率。一个节点的胜利率为这个节点所有的子节点的平均胜利率。并从T开始,一直反向传播到根节点R,因此路径上所有的节点的胜利率都会被更新。
之后,重新从第一步开始,不断地进行迭代。使得添加的局面越来越多,则对于R所有的子节点的胜利率也越来越准。最后,选择胜利率最高的招式。
实际应用中,mcts还可以伴随非常多的改进。我描述的这个算法是mcts这个算法族中最出名的uct算法,现在大部分著名的ai都在这个基础上有了大量的改进了。 2、强化学习(RL)是学习方法,用来提升AI的实力。
2、强化学习 (RL) 是学习方法,用来提升AI的实力
强化学习是从动物学习、参数扰动自适应控制等理论发展而来,其基本原理是:
如果Agent的某个行为策略导致环境正的奖赏(强化信号),那么Agent以后产生这个行为策略的趋势便会加强。Agent的目标是在每个离散状态发现最优策略以使期望的折扣奖赏和最大。
强化学习把学习看作试探评价过程,Agent选择一个动作用于环境,环境接受该动作后状态发生变化,同时产生一个强化信号(奖或惩)反馈给Agent,Agent根据强化信号和环境当前状态再选择下一个动作,选择的原则是使受到正强化(奖)的概率增大。选择的动作不仅影响立即强化值,而且影响环境下一时刻的状态及最终的强化值。
强化学习不同于连接主义学习中的监督学习,主要表现在教师信号上,强化学习中由环境提供的强化信号是Agent对所产生动作的好坏作一种评价(通常为标量信号),而不是告诉Agent如何去产生正确的动作。由于外部环境提供了很少的信息,Agent必须靠自身的经历进行学习。通过这种方式,Agent在行动一一评价的环境中获得知识,改进行动方案以适应环境。
强化学习系统学习的目标是动态地调整参数,以达到强化信号最大。若已知r/A梯度信息,则可直接可以使用监督学习算法。因为强化信号r与Agent产生的动作A没有明确的函数形式描述,所以梯度信息r/A无法得到。因此,在强化学习系统中,需要某种随机单元,使用这种随机单元,Agent在可能动作空间中进行搜索并发现正确的动作。
3、深度神经网络(DNN)是工具,用来拟合局面评估函数和策略函数
深度神经网络,也被称为深度学习,是人工智能领域的重要分支,根据麦卡锡(人工智能之父)的定义,人工智能是创造像人一样的智能机械的科学工程。
通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些,不断调整,直到能够预测出目标值)。因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数或目标函数(lossfuncTIonorobjecTIvefuncTIon),用于衡量预测值和目标值的差异的方程。lossfuncTIon的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。
所用的方法是梯度下降(Gradientdescent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learningrate)来控制的。
总结
这三大技术都不是AlphaGo或者DeepMind团队首创的技术。但是强大的团队将这些结合在一起,配合Google公司强大的计算资源,成就了历史性的飞跃。
Read More ~
emoji表情大全😁
表情
😀😁😂😃😄😅😆😉😊😋😎😍😘😗😙😚☺😇😐😑😶😏😣😥😮😯😪😫😴😌😛😜😝😒😓😔😕😲😷😖😞😟😤😢😭😦😧😨😬😰😱😳😵😡😠
人物
👦👧👨👩👴👵👶👱👮👲👳👷👸💂🎅👰👼💆💇🙍🙎🙅🙆💁🙋🙇🙌🙏👤👥🚶🏃👯💃👫👬👭💏💑👪
手势
💪👈👉☝👆👇✌✋👌👍👎✊👊👋👏👐✍
日常
👣👀👂👃👅👄💋👓👔👕👖👗👘👙👚👛👜👝🎒💼👞👟👠👡👢👑👒🎩🎓💄💅💍🌂
手机
📱📲📶📳📴☎📞📟📠
公共
♻🏧🚮🚰♿🚹🚺🚻🚼🚾⚠🚸⛔🚫🚳🚭🚯🚱🚷🔞💈
动物
🙈🙉🙊🐵🐒🐶🐕🐩🐺🐱😺😸😹😻😼😽🙀😿😾🐈🐯🐅🐆🐴🐎🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🐘🐭🐁🐀🐹🐰🐇🐻🐨🐼🐾🐔🐓🐣🐤🐥🐦🐧🐸🐊🐢🐍🐲🐉🐳🐋🐬🐟🐠🐡🐙🐚🐌🐛🐜🐝🐞🦋
植物
💐🌸💮🌹🌺🌻🌼🌷🌱🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃
自然
🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜☀🌝🌞⭐🌟🌠☁⛅☔⚡❄🔥💧🌊
饮食
🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍅🍆🌽🍄🌰🍞🍖🍗🍔🍟🍕🍳🍲🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🍡🍦🍧🍨🍩🍪🎂🍰🍫🍬🍭🍮🍯🍼☕🍵🍶🍷🍸🍹🍺🍻🍴
文体
🎪🎭🎨🎰🚣🛀🎫🏆⚽⚾🏀🏈🏉🎾🎱🎳⛳🎣🎽🎿🏂🏄🏇🏊🚴🚵🎯🎮🎲🎷🎸🎺🎻🎬
恐怖
😈👿👹👺💀☠👻👽👾💣
旅游
🌋🗻🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪⛲🌁🌃🌆🌇🌉🌌🎠🎡🎢🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚤🚢✈💺🚁🚟🚠🚡🚀🎑🗿🛂🛃🛄🛅
物品
💌💎🔪💈🚪🚽🚿🛁⌛⏳⌚⏰🎈🎉🎊🎎🎏🎐🎀🎁📯📻📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡💡🔦🏮📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💰💴💵💶💷💸💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑🔨🔫🔧🔩🔗💉💊🚬🔮🚩🎌💦💨
标志
♠♥♦♣🀄🎴🔇🔈🔉🔊📢📣💤💢💬💭♨🌀🔔🔕✡✝🔯📛🔰🔱⭕✅☑✔✖❌❎➕➖➗➰➿〽✳✴❇‼⁉❓❔❕❗©®™🎦🔅🔆💯🔠🔡🔢🔣🔤🅰🆎🅱🆑🆒🆓ℹ🆔Ⓜ🆕🆖🅾🆗🅿🆘🆙🆚🈁🈂🈷🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳㊗㊙🈺🈵▪▫◻◼◽◾⬛⬜🔶🔷🔸🔹🔺🔻💠🔲🔳⚪⚫🔴🔵
生肖
🐁🐂🐅🐇🐉🐍🐎🐐🐒🐓🐕🐖
星座
♈♉♊♋♌♍♎♏♐♑♒♓⛎
钟表
🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦⌛⏳⌚⏰⏱⏲🕰
心形
💘❤💓💔💕💖💗💙💚💛💜💝💞💟❣
花草
💐🌸💮🌹🌺🌻🌼🌷🌱🌿🍀
树叶
🌿🍀🍁🍂🍃
月亮
🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝
水果
🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓
钱币
💴💵💶💷💰💸💳
交通
🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚣🚤🚢✈💺🚁🚟🚠🚡🚀
建筑
🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪🌆🌇🌉
办公
📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑
箭头
⬆↗➡↘⬇↙⬅↖↕↔↩↪⤴⤵🔃🔄🔙🔚🔛🔜🔝
Read More ~