当前位置: 首页 > news >正文

python-产品篇-火车票分析助手

文章目录

  • 开发环境要求
  • 运行方法
    • PyCarm
    • VsCode
  • 代码
  • 效果

开发环境要求

本系统的软件开发及运行环境具体如下。
(1)操作系统:操作系统:Windows 7、Windows 8、Windows 10。
(2)Python版本:Python 3.7.0以上。
(3)开发工具:PyCharm。
(4)Python内置模块:sys、time、datetime、os、json、re。
(5)第三方模块:PyQt5、pyqt5-tools、requests、matplotlib。
注意:在使用第三方模块时,首先需要使用pip install命令安装该模块,例如,安装PyQt5模块,可以在Python命令窗口中执行以下命令:

pip install PyQt5

运行方法

PyCarm

(1)启动PyCharm开发工具,单击“open”按钮打开项目源码,如图1所示。
在这里插入图片描述

图1 打开项目源码
(2)项目源码打开完成后,打开show_window.py文件,在该文件中单击鼠标右键,在弹出快捷菜单中选择“Run show_window”如图2所示。
在这里插入图片描述

图2 选择“Run show_window”
(3)项目源码正常启动后将显示如图3所示的主窗体界面。

在这里插入图片描述

图3 主窗体界面

VsCode

在这里插入图片描述

代码

from window import Ui_MainWindow  # 导入主窗体ui类
# 导入PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys  # 导入系统模块
import time, datetime  # 导入时间模块
from chart import PlotCanvas    # 导入自定义画图类
from query_request import *     # 导入自定义网络查询模块# 显示消息提示框,参数title为提示框标题文字,message为提示信息
def messageDialog(title, message):msg_box = QMessageBox(QMessageBox.Warning, title, message)msg_box.exec_()# 出窗体初始化类
class Main(QMainWindow, Ui_MainWindow):def __init__(self):super(Main, self).__init__()self.setupUi(self)self.tabWidget.setCurrentIndex(0)   # 默认显示车票查询self.model = QStandardItemModel();  # 创建存储数据的模式# 根据空间自动改变列宽度并且不可修改列宽度self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# 设置表头不可见self.tableView.horizontalHeader().setVisible(False)# 纵向表头不可见self.tableView.verticalHeader().setVisible(False)# 设置表格内容文字大小font = QtGui.QFont()font.setPointSize(10)self.tableView.setFont(font)# 设置表格内容不可编辑self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)# 垂直滚动条始终开启self.tableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)# 查询按钮的单击事件def on_click(self):get_from = self.textEdit.toPlainText()  # 获取出发地get_to = self.textEdit_2.toPlainText()  # 获取到达地get_date = self.textEdit_3.toPlainText()  # 获取出发时间# 判断车站文件是否存在if is_stations('stations.text') == True:stations = eval(read('stations.text'))  # 读取所有车站并转换为dic类型# 判断所有参数是否为空,出发地、目的地、出发日期if get_from != "" and get_to != "" and get_date != "":# 判断输入的车站名称是否存在,以及时间格式是否正确if get_from in stations and get_to in stations and self.is_valid_date(get_date):# 计算时间差time_difference = self.time_difference(self.get_time(), get_date).days# 判断时间差为0时证明是查询当前的查票,# 以及29天以后的车票。12306官方要求只能查询30天以内的车票if time_difference >= 0 and time_difference <= 29:from_station = stations[get_from]  # 在所有车站文件中找到对应的参数,出发地to_station = stations[get_to]  # 目的地data = query(get_date, from_station, to_station)  # 发送查询请求,并获取返回的信息self.checkBox_default()if len(data) != 0:  # 判断返回的数据是否为空# 如果不是空的数据就将车票信息显示在表格中self.displayTable(len(data), 16, data)else:messageDialog('警告', '没有返回的网络数据!')else:messageDialog('警告', '超出查询日期的范围内,''不可查询昨天的车票信息,以及29天以后的车票信息!')else:messageDialog('警告', '输入的站名不存在,或日期格式不正确!')else:messageDialog('警告', '请填写车站名称!')else:messageDialog('警告', '未下载车站查询文件!')# 将所有车次分类复选框取消勾选def checkBox_default(self):self.checkBox_G.setChecked(False)self.checkBox_D.setChecked(False)self.checkBox_Z.setChecked(False)self.checkBox_T.setChecked(False)self.checkBox_K.setChecked(False)# 高铁复选框事件处理def change_G(self, state):# 选中将高铁信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取高铁信息g_vehicle()# 通过表格显示该车型数据self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_g_vehicle()self.displayTable(len(type_data), 16, type_data)# 动车复选框事件处理def change_D(self, state):# 选中将动车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取动车信息d_vehicle()# 通过表格显示该车型数据self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_d_vehicle()self.displayTable(len(type_data), 16, type_data)# 直达复选框事件处理def change_Z(self, state):# 选中将直达车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取直达车信息z_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_z_vehicle()self.displayTable(len(type_data), 16, type_data)# 特快复选框事件处理def change_T(self, state):# 选中将特快车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取特快车信息t_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_t_vehicle()self.displayTable(len(type_data), 16, type_data)# 快速复选框事件处理def change_K(self, state):# 选中将快车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取快速车信息k_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_k_vehicle()self.displayTable(len(type_data), 16, type_data)# 显示车次信息的表格# train参数为共有多少趟列车,该参数作为表格的行。# info参数为每趟列车的具体信息,例如有座、无座卧铺等。该参数作为表格的列def displayTable(self, train, info, data):self.model.clear()for row in range(train):for column in range(info):# 添加表格内容item = QStandardItem(data[row][column])# 向表格存储模式中添加表格具体信息self.model.setItem(row, column, item)# 设置表格存储数据的模式self.tableView.setModel(self.model)# 获取系统当前时间并转换请求数据所需要的格式def get_time(self):# 获得当前时间时间戳now = int(time.time())# 转换为其它日期格式,如:"%Y-%m-%d %H:%M:%S"timeStruct = time.localtime(now)strTime = time.strftime("%Y-%m-%d", timeStruct)return strTime# 计算购票时间差,因为只能提前购买29天的车票def time_difference(self, in_time, new_time):# 将字符串日期转换为struct_time时间对象in_time = time.strptime(in_time, "%Y-%m-%d")new_time = time.strptime(new_time, "%Y-%m-%d")# 将struct_time时间对象转换为datetime对象in_time = datetime.datetime(in_time[0], in_time[1], in_time[2])new_time = datetime.datetime(new_time[0], new_time[1], new_time[2])# 返回两个变量相差的值,就是相差天数return new_time - in_timedef is_valid_date(self, str):'''判断是否是一个有效的日期字符串'''try:time.strptime(str, "%Y-%m-%d")return Trueexcept:return False# 卧铺售票分析查询按钮的事件处理def query_ticketing_analysis_click(self):self.info_table = []         # 保存窗体表格中的车次信息today_car_list.clear()  # 清空今天列车信息,已处理是否有票three_car_list.clear()  # 清空三天列车信息,已处理是否有票five_car_list.clear()  # 清空五天列车信息,已处理是否有票today_list.clear()     # 清空今天列车信息,未处理是否有票three_list.clear()     # 清空三天列车信息,未处理是否有票five_list.clear()      # 清空五天列车信息,未处理是否有票get_from = self.textEdit_analysis_from.toPlainText() # 获取出发地get_to = self.textEdit_analysis_to.toPlainText() # 获取到达地stations = eval(read('stations.text'))  # 读取所有车站并转换为dic类型# 判断所有参数是否为空,出发地、目的地if get_from != "" and get_to != "" :# 判断输入的车站名称是否存在,以及时间格式是否正确if get_from in stations and get_to in stations :from_station = stations[get_from]  # 在所有车站文件中找到对应的参数,出发地to_station = stations[get_to]  # 目的地today = datetime.datetime.now()  # 获取今天日期three_set = datetime.timedelta(days=+2)  # 三天内偏移天数five_set = datetime.timedelta(days=+4)  # 五天内偏移天数three_day = (today + three_set).strftime('%Y-%m-%d') # 三天格式化后的日期five_day = (today + five_set).strftime('%Y-%m-%d')   # 五天格式化后的日期today = today.strftime('%Y-%m-%d')  # 今天格式化后的日期# 发送查询今天卧铺票信息的网络请求,并获取返回的信息query_ticketing_analysis(today, from_station, to_station,1)# 发送查询三天内卧铺票信息的网络请求,并获取返回的信息query_ticketing_analysis(three_day, from_station, to_station,3)# 发送查询五天内卧铺票信息的网络请求,并获取返回的信息query_ticketing_analysis(five_day, from_station, to_station,5)info_set=set()   # 创建筛选车次集合,将相同车次进行整合,查看共有几趟列车for i in today_car_list+three_car_list+five_car_list:# 因为在集合中必须是字符串才能进行整合,所以将车次信息转换为字符串类型,方便车次整合info_set.add(str(i[0:6]))for info in info_set:             # 遍历车次信息info = eval(info)              # 将车次信息再次转换成列表is_today_ture = False         # 判断今天是否存在某趟列车的标记for i in today_car_list:      # 遍历今天的车次信息,该车次信息是没有筛选的信息if info[0] in i:          # 判断整合后的车次,在今天的车次信息中是否存在is_today_ture= True   # 存在就进行标记info.append(i[6])      # 如果存在就将,车次信息中是否有卧铺的信息添加至整合后的车次信息中break                 # 跳出循环if is_today_ture==False:      # 如果今天没有某一趟列车就标记为'--'info.append('--')is_three_ture = False          # 判断三天是否存在某趟列车的标记for i in three_car_list:       # 遍历三天的车次信息,该车次信息是没有筛选的信息if info[0] in i:           # 判断整合后的车次,在三天的车次信息中是否存在is_three_ture = True    # 存在就进行标记info.append(i[6])       # 如果存在就将,车次信息中是否有卧铺的信息添加至整合后的车次信息中break                  # 跳出循环if is_three_ture==False:      # 如果三天没有某一趟列车就标记为'--'info.append('--')is_five_ture = False          # 判断五天是否存在某趟列车的标记for i in five_car_list:       # 遍历五天的车次信息,该车次信息是没有筛选的信息if info[0] in i:          # 判断整合后的车次,在五天的车次信息中是否存在is_five_ture = True    # 存在就进行标记info.append(i[6])      # 如果存在就将,车次信息中是否有卧铺的信息添加至整合后的车次信息中break                  # 跳出循环if is_five_ture==False:      # 如果五天没有某一趟列车就标记为'--'info.append('--')self.info_table.append(info)         # 将最后结果添加至窗体表格的列表中self.tableWidget.setRowCount(len(self.info_table))  # 设置表格行数self.tableWidget.setColumnCount(9)             # 设置表格列数# 设置表格内容文字大小font = QtGui.QFont()font.setPointSize(12)self.tableWidget.setFont(font)# 根据窗体大小拉伸表格self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)# 循环遍历最终的信息for row in range(len(self.info_table)):fraction = 0   # 分数,根据该分数判断列车的紧张程度for column in range(9):if column==6:   # 如果是某趟列车今天是无票if self.info_table[row][column]=='无'or self.info_table[row][column]=='--':fraction+=3      # 计3分if column==7:   # 如果是某趟列车三天内是无票if self.info_table[row][column]=='无'or self.info_table[row][column]=='--':fraction+=2      # 计2分if column == 8:  # 如果是某趟列车五天内是无票if self.info_table[row][column] == '无'or self.info_table[row][column]=='--':fraction += 1    # 计1分# 判断分数大于等于5分的车次为红色,说明该车次卧铺非常紧张if fraction>=5:# 定位是哪趟车次符合该条件,遍历该车次信息for i in range(len(self.info_table[row])):# 表格列中的信息item = QtWidgets.QTableWidgetItem(self.info_table[row][i])item.setBackground(QColor(255, 0, 0));  # 设置该车次背景颜色self.tableWidget.setItem(row, i, item)  # 设置表格显示的内容# 判断分数大于1与分数小于等于4的车次为橙色,说明该车次卧铺紧张if fraction>=1 and fraction<=4:for i in range(len(self.info_table[row])):item = QtWidgets.QTableWidgetItem(self.info_table[row][i])item.setBackground(QColor(255, 170, 0));self.tableWidget.setItem(row, i, item)  # 设置表格显示的内容# 判断分数等于0的车次为绿色,说明该车次卧铺不紧张if fraction ==0:for i in range(len(self.info_table[row])):item = QtWidgets.QTableWidgetItem(self.info_table[row][i])item.setBackground(QColor(85, 170, 0));self.tableWidget.setItem(row, i, item)  # 设置表格显示的内容self.show_broken_line()   # 显示折线图else:messageDialog('警告', '请填写车站名称!')# 显示卧铺车票数量折线图def show_broken_line(self):train_number_list=[]      # 保存车次tickets_number_list = []  # 保存今天,三天内,五天内所有车次的卧铺票数量# 遍历车次信息for train_number in self.info_table:number_list = []   # 临时保存车票数量if self.horizontalLayout.count() !=0:# 每次点循环删除管理器的组件while self.horizontalLayout.count():# 获取第一个组件item = self.horizontalLayout.takeAt(0)# 删除组件widget = item.widget()widget.deleteLater()is_today_ture = False  # 判断今天是否存在某趟列车的标记for today in today_list:# 判断今天的车次信息中是否有该车次if train_number[0] in today:is_today_ture = True  # 存在就进行标记number = self.statistical_quantity(today[6:9]) # 调用统计车票数量的方法number_list.append(number)                   # 将车票数量添加至临时列表中breakif is_today_ture == False:  # 如果今天没有某一趟列车,说明该车次无票为0number_list.append(0)is_three_ture = False  # 判断三天内是否存在某趟列车的标记for three_day in three_list:if train_number[0] in three_day:is_three_ture = True  # 存在就进行标记number = self.statistical_quantity(three_day[6:9])  # 调用统计车票数量的方法number_list.append(number)  # 将车票数量添加至临时列表中breakif is_three_ture == False:  # 如果三天内没有某一趟列车,说明该车次无票为0number_list.append(0)is_five_ture = False  # 判断五天是否存在某趟列车的标记for five_day in five_list:if train_number[0] in five_day:is_five_ture = True  # 存在就进行标记number = self.statistical_quantity(five_day[6:9])  # 调用统计车票数量的方法number_list.append(number)  # 将车票数量添加至临时列表中breakif is_five_ture == False:  # 如果五天内没有某一趟列车,说明该车次无票为0number_list.append(0)tickets_number_list.append(number_list)    # 添加车票数量列表train_number_list.append(train_number[0])  # 添加车次列表# 车次信息大时,添加滚动条扩大折线图高度if len(train_number_list)>=9:self.scrollAreaWidgetContents_2.setMinimumHeight(len(train_number_list) * 30)self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 951,(len(train_number_list)*30)))# 创建画布对象line = PlotCanvas()line.broken_line(tickets_number_list,train_number_list)  # 调用折线图方法self.horizontalLayout.addWidget(line)    # 将折线图添加至底部水平布局当中# 统计车票数量def statistical_quantity(self,msg):number = 0    # 车票初始值for i in msg:if i=='有':   # 如果是有增加20个车票number+=20if i=='无'or i=='': # 如果是无或者是空就增加0个车票number+=0if i.isdigit():     # 如果是数字,就直接增加对应的数字number+=int(i)return number          # 返回计算后的车票数量# 车票起售时间查询按钮的事件处理def query_time_click(self):station = self.lineEdit_station.text()  # 获取需要查询的起售车站stations_time = eval(read('time.text'))  # 读取所有车站与起售时间并转换为dic类型stations = eval(read('stations.text'))  # 读取所有车站并转换为dic类型if station in stations_time:  # 判断要搜索的站名是否存在name_lit, time_list = query_time(stations.get(station))  # 查询起售车站对应的站名与起售时间if self.gridLayout.count() !=0:# 每次点循环删除管理器的控件while self.gridLayout.count():# 获取第一个控件item = self.gridLayout.takeAt(0)# 删除控件widget = item.widget()widget.deleteLater()# 行数标记i = -1for n in range(len(name_lit)):# x 确定每行显示的个数 0,1,2,3 每行4个x = n % 4# 当x为0的时候设置换行 行数+1if x == 0:i += 1# 创建布局self.widget = QtWidgets.QWidget()# 给布局命名self.widget.setObjectName("widget" + str(n))# 设置布局样式self.widget.setStyleSheet('QWidget#' + "widget" + str(n) + "{border:2px solid rgb(175, 175, 175);background-color: rgb(255, 255, 255);}")# 创建个Qlabel控件用于显示图片 设置控件在QWidget中self.label = QtWidgets.QLabel(self.widget)self.label.setAlignment(QtCore.Qt.AlignCenter)# 设置大小self.label.setGeometry(QtCore.QRect(10, 10, 210, 65))font = QtGui.QFont()  # 创建字体对象font.setPointSize(11)  # 设置字体大小font.setBold(True)  # 开启粗体属性font.setWeight(75)  # 设置文字粗细self.label.setFont(font)  # 设置字体self.label.setText(name_lit[n]+'      '+time_list[n])   # 设置显示站名与起售时间# 把动态创建的widegt布局添加到gridLayout中 i,x分别代表:行数以及每行的个数self.gridLayout.addWidget(self.widget, i, x)# 设置高度为动态高度根据行数确定高度 每行300self.scrollAreaWidgetContents.setMinimumHeight((i+1) * 100)# 设置网格布局控件动态高度self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 950, ((i+1) * 100)))else:messageDialog('警告','起售车站中没有该车站名称!')def show_MainWindow():app = QApplication(sys.argv)  # 创建QApplication对象,作为GUI主程序入口main = Main()  # 创建主窗体对象main.textEdit_3.setText(main.get_time())  # 出发日显示当天日期main.pushButton.clicked.connect(main.on_click)  # 查询按钮指定单击事件的方法main.checkBox_G.stateChanged.connect(main.change_G)  # 高铁选中与取消事件main.checkBox_D.stateChanged.connect(main.change_D)  # 动车选中与取消事件main.checkBox_Z.stateChanged.connect(main.change_Z)  # 直达车选中与取消事件main.checkBox_T.stateChanged.connect(main.change_T)  # 特快车选中与取消事件main.checkBox_K.stateChanged.connect(main.change_K)  # 快车选中与取消事件main.pushButton_time_query.clicked.connect(main.query_time_click)  # 起售时间查询按钮指定单击事件的方法main.pushButton_analysis_query.clicked.connect(main.query_ticketing_analysis_click)  # 卧铺售票分析查询按钮指定单击事件的方法main.show()  # 显示主窗体sys.exit(app.exec_())  # 循环中等待退出程序if __name__ == '__main__':# 判断是否有车站与起售时间的文件,没有就下载if is_stations('stations.text') == False and is_stations('time.text')==False:get_station()  # 下载所有车站文件get_selling_time() # 下载起售时间文件# 判断两种文件存在时显示窗体if is_stations('stations.text') == True and is_stations('time.text')==True:show_MainWindow()  # 调用显示窗体的方法else:messageDialog('警告','车站文件或起售时间文件出现异常!')

效果

在这里插入图片描述

相关文章:

python-产品篇-火车票分析助手

文章目录 开发环境要求运行方法PyCarmVsCode 代码效果 开发环境要求 本系统的软件开发及运行环境具体如下。 &#xff08;1&#xff09;操作系统&#xff1a;操作系统&#xff1a;Windows 7、Windows 8、Windows 10。 &#xff08;2&#xff09;Python版本&#xff1a;Python …...

设计一个可以智能训练神经网络的流程

设计一个可以智能训练神经网络的流程,需要考虑以下几个关键步骤: 初始化参数:设定初始的batch size和learning rate,以及其他的神经网络参数。训练循环:开始训练过程,每次迭代更新网络的权重。监控loss:在每个训练周期(epoch)后,监控loss的变化情况。动态调整:根据l…...

自然语言处理(02/10):自然语言处理任务和应用程序

一、描述 在广阔的人工智能领域&#xff0c;自然语言处理 &#xff08;NLP&#xff09; 是一个迷人而充满活力的领域。NLP 弥合了计算机和人类语言之间的鸿沟&#xff0c;使机器能够理解、解释和生成类似人类的文本。这项变革性技术具有深远的影响&#xff0c;影响着我们日常生…...

Jmeter学习系列之三:测试计划详细介绍

目录 前言 步骤1:启动JMeter窗口 步骤2:添加/删除测试计划元素 步骤3:加载并保存测试计划元素。 步骤4:配置树元素 步骤5:保存JMeter测试计划 步骤6:运行JMeter测试计划...

mermaid使用指南+notion使用实例-持续更新中

最近一个月了吧&#xff0c;发现Notion插入图片的功能坏了&#xff0c;直接paste会404&#xff0c;本地上传也不行。电脑本地版和手机端都插不了图片&#xff0c;很头疼。解决方法也简单&#xff0c;用图床&#xff0c;放链接。 付费版我用的七牛&#xff0c;结合PicGo&#x…...

Pytroch 自写训练模板适合入门版 包含十五种经典的自己复现的一维模型 1D CNN

训练模板 在毕业之前&#xff0c;决定整理一下手头的代码&#xff0c;自己做1D-CNN这吗久&#xff0c;打算开源一下自己使用的1D-CNN的代码&#xff0c;包括用随机数生成一个模拟的数据集&#xff0c;到自己写的一个比较好的适合入门的基础训练模板&#xff0c;以及自己复现的…...

【30秒看懂大数据】变量

简单说 变量是指研究或观察中可能发生变化的事物、属性或特征&#xff0c;它们可以用来描述数据或现象的不同方面。 举例理解 一位热衷于烹饪的大厨老李&#xff0c;经常尝试不同的菜肴来满足不同顾客的口味。 1. 老李明白&#xff0c;每种食材都等同于一个重要的变量…...

Redis - 多集群数据源配置

目录 前言依赖yml配置redis多集群数据源配置类思考 redis工具类 前言 工作时有一个项目配置了多个redis数据源&#xff0c;使用时出现了指定了使用副数据源&#xff0c;数据却依然使用了主数据源的情况。经过排查&#xff0c;发现配置流程较为繁琐易错&#xff0c;此处做一个记…...

五大架构风格之四-虚拟机架构风格

虚拟机架构风格&#xff1a; 虚拟机架构风格是一种软件架构&#xff0c;它通过模拟完整的计算机系统&#xff08;包括硬件&#xff09;来运行程序。这种风格的核心是虚拟机监控器。如最出名的虚拟机VM&#xff0c;在使用虚拟机架构&#xff0c;一个或多个虚拟机可以在单一物理主…...

在 C# 中 checked 和 unchecked 关键字

在 C# 中&#xff0c;checked 和 unchecked 是用于控制整数运算溢出检查的关键字。它们允许我们明确指定在进行整数运算时是否要检查溢出&#xff0c;以及如何处理溢出情况。 默认情况下&#xff0c;C# 中的整数运算是未检查的&#xff0c;也就是说&#xff0c;当运算结果溢出…...

【算法分析与设计】跳跃游戏

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断…...

openssl3.2 - helpdoc - P12证书操作

文章目录 openssl3.2 - helpdoc - P12证书操作概述笔记/doc/html/man1/CA.pl.htmlCA.pl -newcaCA.pl -newreqCA.pl -signCA.pl -pkcs12 "My Test Certificate"/doc/html/man1/openssl-pkcs12.html备注END openssl3.2 - helpdoc - P12证书操作 概述 D:\3rd_prj\cryp…...

【产业实践】使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通

使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通 效果图 背景介绍 当谈到目标检测算法时,YOLO(You Only Look Once)系列算法是一个备受关注的领域。YOLO通过将目标检测任务转化为一个回归问题,实现了快速且准确的目标检测。以下是YOLO的基…...

【操作系统】HeapByteBuffer和DirectByteBuffer的区别

DirectByteBuffer和HeapByteBuffer是Java NIO中ByteBuffer的两种实现方式。 HeapByteBuffer是在Java堆上分配的字节缓冲区&#xff0c;它使用数组来存储数据。HeapByteBuffer的优点是它具有良好的兼容性和可移植性&#xff0c;且在大多数情况下性能表现良好。它适用于大部分的…...

C++并发编程 -2.线程间共享数据

本章就以在C中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时&#xff0c;将共享数据的优势发挥到最大。 一. 锁分类和使用 按照用途分为互斥、递归、读写、自旋、条件变量。本章节着重介绍前四种&#xff0c;条件变量后续章节单独介绍。 由于锁无法进行拷贝…...

Kubernetes-资源清单

一、k8s中的资源 什么是资源清单 我们跟kubernetes集群进行交互的时候&#xff0c;我们需要给K8S集群传输数据&#xff0c;传输信息&#xff0c;K8S才能按照我们的要求来运行&#xff0c;这个传输的文件&#xff0c;基本上都会通过资源清单进行传递。资源清单是我们跟集群进行…...

ABAP 笔记--内表结构不一致,无法更新数据库MODIFY和UPDATE

目录 ABAP 笔记内表结构不一致&#xff0c;无法更新数据库MODIFY和UPDATE ABAP 笔记 内表结构不一致&#xff0c;无法更新数据库 MODIFY和UPDATE 如果是使用MODIFY或者UPDATE...

机器学习-3降低损失(Reducing Loss)

机器学习-3降低损失(Reducing Loss) 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1.降低损失&#xff1a;迭代方法 迭代学习 下图展示了机器学习算法用于训…...

蓝桥杯备战(AcWing算法基础课)-高精度-减-高精度

目录 前言 1 题目描述 2 分析 2.1 第一步 2.2 第二步 3 代码 前言 详细的代码里面有自己的理解注释 1 题目描述 给定两个正整数&#xff08;不含前导 00&#xff09;&#xff0c;计算它们的差&#xff0c;计算结果可能为负数。 输入格式 共两行&#xff0c;每行包含一…...

AspNet web api 和mvc 过滤器差异

最近在维护老项目。定义个拦截器记录接口日志。但是发现不生效 最后发现因为继承的 ApiController不是Controller 只能用 System.Web.Http下的拦截器生效。所以现在总结归纳一下 Web Api: System.Web.Http.Filters.ActionFilterAttribute 继承该类 Mvc: System.Web.Mvc.Ac…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...