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

python之Bible快速检索器

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

python之Bible快速检索器
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 python 开发

为初学者节省宝贵的学习时间,避免困惑!


前言:

  最近在看shengjing的时候突发奇想,能不能开发一款可以快速查询shengjing的软件,通过输入书名章:节这样的方式来快速查询,于是就开发了这款能够可以快速查询的软件。

TechX 教程效果:

在这里插入图片描述

源工程:https://gitcode.com/CTLittleNewbie/BibleQ/overview

软件下载:https://gitcode.com/CTLittleNewbie/BibleQ/releases


文章目录

  • 一、准备
    • 1、文件准备
    • 2、工程准备
  • 二、加载本地cvs.xml
  • 三、输入解析
  • 四、获取经文
  • 五、软件打包
  • 七、代码全文


一、准备


在做这个软件的时候,首先考虑到要采用什么方式来获取shengjing,当时想了3种获取方式:API、爬虫和本地化文件

首先考虑使用API,就去网上找到了一个相关API,但是发现这个API不支持中文,找到的其他的API很多都不能用,而且不稳定,所以就放弃了这种方式。

后面考虑使用爬虫来爬取,找到一个shengjing的网站,但是只是个国外的网站,可能比较慢,国内可能访问不了,也就放弃了。

然后考虑使用本地化文件,看是否能下载shengjing的Json或者XML文件,于是我在github上查找,找到了xml格式的shengjing。

1、文件准备


xml格式的shengjing可以自行去下载,地址 https://github.com/gratis-bible/bible。

里面包含了各种语言的版本,我这里使用中文版,下载解压后找到zh/cvs.xml文件

在这里插入图片描述

2、工程准备


新建一个python工程,目录与下面保持一致,将cvs.xml放在static文件夹中

在这里插入图片描述



二、加载本地cvs.xml


在加载cvs.xml之前还需要对cvs.xml做一些修改,打开cvs.xml,找到节点,将里面的属性全部删除掉

在这里插入图片描述
删除完成之后与下面保持一致。

在这里插入图片描述

要查询首先需要加载本地xml到内存中

	# 构建cvs.xml的路径bible_xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static", "cvs.xml")tree = ET.parse(file_path)bible_root = tree.getroot()


三、输入解析


在设计这款软件的时候,考虑了有5中搜索方式:

  • 书名(如:创世记 获取整本书内容)
  • 书名章 (如:创世记1 获取书的第一章内容)
  • 书名章-章 (如:创世记1-4 获取书的第一章到第4章内容)
  • 书名章:节 (如:创世记1:1 获取书的第一章第一节内容)
  • 书名章:节-节 (如:创世记1:1-10 获取书的第一章第一节到第十节内容)

同时还设计了不同的语言的输入,目前可以通过中文、英文、繁体 进行输入搜索。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里通过正则表达式来对输入进行匹配,从而从输入种提取到书名、章数和节数,允许通过中文、英文、繁体进行检索。

	# 匹配书名1:1-10的格式pattern_range_with_verse = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d+):(\d+)-(\d+)"# 匹配书名1-4的格式pattern_range = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d+)-(\d+)"# 匹配书名加章节格式的正则表达式pattern = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d*):?(\d*)"


四、获取经文


通过解析搜索关键字,我们能够获取到书名ID,章和节,通过这三个参数可以生成不同的xpath,用来从xml中查询数据。

  • 情况一:输入关键字包含书、章和节,并且节包含"-"
xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse"
  • 情况2:输入关键字包含书、章和节,并且节不包含"-"
xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse[@osisID='{osis_id}.{chapter}.{verse}']"
  • 情况3:输入关键字包含书和章,并且章包含"-"
xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{ch_num}']/verse"
  • 情况4:输入关键字包含书和章,并且章不包含"-"
xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse"
  • 情况5:输入关键字只包含书
xpath = f".//div[@osisID='{osis_id}']//verse"


五、软件打包


–onefile 打包成单个文件

–noconsole 无控制台

-i favicon.ico 给软件添加图标,要求是.ico格式的文件

–add-data “static;static” 将static文件夹和软件打包在一起

打包命令:

pyinstaller --onefile --noconsole -i favicon.ico --add-data "static;static" BibleQ.py


七、代码全文


import os
import tkinter as tk
from tkinter import messagebox, ttk
import xml.etree.ElementTree as ET
import re
from ttkbootstrap import Style
from tkinter import PhotoImage# 中文到osisID的映射
chinese_to_osisid_mapping = {"创世记": "Gen","出埃及记": "Exod","利未记": "Lev","民数记": "Num","申命记": "Deut","约书亚记": "Josh","士师记": "Judg","路得记": "Ruth","撒母耳记上": "1Sam","撒母耳记下": "2Sam","列王记上": "1Kgs","列王记下": "2Kgs","历代志上": "1Chr","历代志下": "2Chr","以斯拉记": "Ezra","尼希米记": "Neh","以斯帖记": "Esth","约伯记": "Job","诗篇": "Ps","箴言": "Prov","传道书": "Eccl","雅歌": "Song","以赛亚书": "Isa","耶利米书": "Jer","耶利米哀歌": "Lam","以西结书": "Ezek","但以理书": "Dan","何西阿书": "Hos","约珥书": "Joel","阿摩司书": "Amos","俄巴底亚书": "Obad","约拿书": "Jonah","弥迦书": "Mic","那鸿书": "Nah","哈巴谷书": "Hab","西番雅书": "Zeph","哈该书": "Hag","撒迦利亚书": "Zech","玛拉基书": "Mal","马太福音": "Matt","马可福音": "Mark","路加福音": "Luke","约翰福音": "John","使徒行传": "Acts","罗马书": "Rom","哥林多前书": "1Cor","哥林多后书": "2Cor","加拉太书": "Gal","以弗所书": "Eph","腓立比书": "Phil","歌罗西书": "Col","帖撒罗尼迦前书": "1Thess","帖撒罗尼迦后书": "2Thess","提摩太前书": "1Tim","提摩太后书": "2Tim","提多书": "Titus","腓利门书": "Phlm","希伯来书": "Heb","雅各书": "Jas","彼得前书": "1Pet","彼得后书": "2Pet","约翰一书": "1John","约翰二书": "2John","约翰三书": "3John","犹大书": "Jude","启示录": "Rev"
}# 英文到osisID的映射
english_to_osisid_mapping = {"Genesis": "Gen","Exodus": "Exod","Leviticus": "Lev","Numbers": "Num","Deuteronomy": "Deut","Joshua": "Josh","Judges": "Judg","Ruth": "Ruth","1 Samuel": "1Sam","2 Samuel": "2Sam","1 Kings": "1Kgs","2 Kings": "2Kgs","1 Chronicles": "1Chr","2 Chronicles": "2Chr","Ezra": "Ezra","Nehemiah": "Neh","Esther": "Esth","Job": "Job","Psalms": "Ps","Proverbs": "Prov","Ecclesiastes": "Eccl","Song of Solomon": "Song","Isaiah": "Isa","Jeremiah": "Jer","Lamentations": "Lam","Ezekiel": "Ezek","Daniel": "Dan","Hosea": "Hos","Joel": "Joel","Amos": "Amos","Obadiah": "Obad","Jonah": "Jonah","Micah": "Mic","Nahum": "Nah","Habakkuk": "Hab","Zephaniah": "Zeph","Haggai": "Hag","Zechariah": "Zech","Malachi": "Mal","Matthew": "Matt","Mark": "Mark","Luke": "Luke","John": "John","Acts": "Acts","Romans": "Rom","1 Corinthians": "1Cor","2 Corinthians": "2Cor","Galatians": "Gal","Ephesians": "Eph","Philippians": "Phil","Colossians": "Col","1 Thessalonians": "1Thess","2 Thessalonians": "2Thess","1 Timothy": "1Tim","2 Timothy": "2Tim","Titus": "Titus","Philemon": "Phlm","Hebrews": "Heb","James": "Jas","1 Peter": "1Pet","2 Peter": "2Pet","1 John": "1John","2 John": "2John","3 John": "3John","Jude": "Jude","Revelation": "Rev"
}# 繁体中文到osisID的映射
traditional_to_osisid_mapping = {"創世記": "Gen","出埃及記": "Exod","利未記": "Lev","民數記": "Num","申命記": "Deut","約書亞記": "Josh","士師記": "Judg","路得記": "Ruth","撒母耳記上": "1Sam","撒母耳記下": "2Sam","列王記上": "1Kgs","列王記下": "2Kgs","歷代志上": "1Chr","歷代志下": "2Chr","以斯拉記": "Ezra","尼希米記": "Neh","以斯帖記": "Esth","約伯記": "Job","詩篇": "Ps","箴言": "Prov","傳道書": "Eccl","雅歌": "Song","以賽亞書": "Isa","耶利米書": "Jer","耶利米哀歌": "Lam","以西結書": "Ezek","但以理書": "Dan","何西阿書": "Hos","約珥書": "Joel","阿摩司書": "Amos","俄巴底亞書": "Obad","約拿書": "Jonah","彌迦書": "Mic","那鴻書": "Nah","哈巴谷書": "Hab","西番雅書": "Zeph","哈該書": "Hag","撒迦利亚書": "Zech","瑪拉基書": "Mal","馬太福音": "Matt","馬可福音": "Mark","路加福音": "Luke","約翰福音": "John","使徒行傳": "Acts","羅馬書": "Rom","哥林多前書": "1Cor","哥林多後書": "2Cor","加拉太書": "Gal","以弗所書": "Eph","腓立比書": "Phil","歌羅西書": "Col","帖撒羅尼迦前書": "1Thess","帖撒羅尼迦後書": "2Thess","提摩太前書": "1Tim","提摩太後書": "2Tim","提多書": "Titus","腓利門書": "Phlm","希伯來書": "Heb","雅各書": "Jas","彼得前書": "1Pet","彼得後書": "2Pet","約翰一書": "1John","約翰二書": "2John","約翰三書": "3John","猶大書": "Jude","啟示錄": "Rev"
}# 统一合并的映射表,用于解析输入时的查找
combined_mapping = {}
combined_mapping.update(chinese_to_osisid_mapping)
combined_mapping.update(english_to_osisid_mapping)
combined_mapping.update(traditional_to_osisid_mapping)# 全局变量,用于存储加载的圣经XML数据
bible_root = None
# 默认设置
default_theme = 'superhero'
default_font_family = '宋体'
default_font_size = 16
current_theme = default_theme
current_font_family = default_font_family
current_font_size = default_font_size
# 全局变量,用于存储Style对象
style = None# 加载圣经XML文件的函数
def load_bible_xml(file_path):global bible_roottry:tree = ET.parse(file_path)bible_root = tree.getroot()if bible_root:print("圣经加载成功。")return Trueelse:print("圣经加载失败。")return Falseexcept Exception as e:print("圣经加载出错。")return False# 修改 parse_input 函数,添加支持书名1-4和书名1:1-10的格式
def parse_input(input_text):# 匹配书名1:1-10的格式pattern_range_with_verse = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d+):(\d+)-(\d+)"# 匹配书名1-4的格式pattern_range = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d+)-(\d+)"# 匹配书名加章节格式的正则表达式pattern = r"([\u4e00-\u9fa5A-Za-z]+)\s*(\d*):?(\d*)"# 尝试匹配书名1:1-10的格式match_range_with_verse = re.match(pattern_range_with_verse, input_text.strip())if match_range_with_verse:book = match_range_with_verse.group(1)  # 提取书名chapter = match_range_with_verse.group(2)  # 提取章节号verse_start = match_range_with_verse.group(3)  # 提取起始节号verse_end = match_range_with_verse.group(4)  # 提取结束节号osis_id = combined_mapping.get(book, None)if osis_id:return osis_id, chapter, verse_start + "-" + verse_end# 尝试匹配书名1-4的格式match_range = re.match(pattern_range, input_text.strip())if match_range:book = match_range.group(1)  # 提取书名chapter_start = match_range.group(2)  # 提取起始章节号chapter_end = match_range.group(3)  # 提取结束章节号osis_id = combined_mapping.get(book, None)if osis_id:print(osis_id)print(chapter_start)print(chapter_end)return osis_id, chapter_start + "-" + chapter_end, None# 尝试匹配书名格式match = re.match(pattern, input_text.strip())print(match)if match:book = match.group(1).lower().capitalize()  # 提取书名chapter = match.group(2)  # 提取章节号verse = match.group(3)  # 提取节号osis_id = combined_mapping.get(book, None)if osis_id:return osis_id, chapter, verse# 如果都没有匹配成功,返回Nonereturn None, None, Nonedef get_bible_text(osis_id, chapter, verse):global bible_rootif not bible_root:return "圣经数据尚未加载。"verses_text = []previous_chapter = None# 处理章节和经文的范围查询if chapter and verse:if '-' in verse:verse_start, verse_end = map(int, verse.split('-'))# 获取指定范围内的经文xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse"result = bible_root.findall(xpath)for verse_element in result:verse_num = int(verse_element.get('osisID').split('.')[-1])if verse_start <= verse_num <= verse_end:current_chapter = chapterif previous_chapter and previous_chapter != current_chapter:verses_text.append("\n")  # 添加空行verses_text.append(f"[{current_chapter},{verse_num}] {verse_element.text.strip()}")previous_chapter = current_chapterelse:# 获取单个经文xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse[@osisID='{osis_id}.{chapter}.{verse}']"verse_element = bible_root.find(xpath)if verse_element is not None:verses_text.append(f"[{chapter},{verse}] {verse_element.text.strip()}")elif chapter:# 获取整个章节的经文if '-' in chapter:chapter_start, chapter_end = map(int, chapter.split('-'))# 获取指定范围内的章节for ch_num in range(chapter_start, chapter_end + 1):xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{ch_num}']/verse"result = bible_root.findall(xpath)for verse_element in result:verse_num = int(verse_element.get('osisID').split('.')[-1])current_chapter = str(ch_num)if previous_chapter and previous_chapter != current_chapter:verses_text.append("\n")  # 添加空行verses_text.append(f"[{current_chapter},{verse_num}] {verse_element.text.strip()}")previous_chapter = current_chapterelse:# 获取单个章节的经文xpath = f".//div[@osisID='{osis_id}']/chapter[@osisID='{osis_id}.{chapter}']/verse"result = bible_root.findall(xpath)for verse_element in result:verse_num = int(verse_element.get('osisID').split('.')[-1])verses_text.append(f"[{chapter},{verse_num}] {verse_element.text.strip()}")else:# 获取整本书的经文xpath = f".//div[@osisID='{osis_id}']//verse"result = bible_root.findall(xpath)for verse_element in result:book, ch_num, verse_num = verse_element.get('osisID').split('.')current_chapter = ch_numif previous_chapter and previous_chapter != current_chapter:verses_text.append("\n")  # 添加空行verses_text.append(f"[{ch_num},{verse_num}] {verse_element.text.strip()}")previous_chapter = current_chapterif verses_text:return '\n'.join(verses_text)else:return "未找到对应经文。"# Function to show search result in the GUI
def show_search_result(search_input):global root_frameglobal current_font_sizeglobal current_font_familyclear_frame(root_frame)search_label = ttk.Label(root_frame, text="Search Results", font=(current_font_family, 18, "bold"))search_label.grid(row=0, column=0, columnspan=2, pady=10, sticky="ew")search_label.configure(anchor="center")# Create search box to show search input and allow new searchsearch_frame = ttk.Frame(root_frame, padding=10)search_frame.grid(row=1, column=0, sticky="ew")search_entry = ttk.Entry(search_frame, font=(current_font_family, 12))search_entry.insert(0, search_input)search_entry.grid(row=0, column=0, sticky="ew")search_frame.columnconfigure(0, weight=1)# Bind Enter key to perform searchsearch_entry.bind('<Return>', lambda event: on_search_from_result(search_entry.get().strip()))# Show search result text areatext_scroll = tk.Scrollbar(root_frame)text_scroll.grid(row=2, column=1, sticky="ns")result_text = tk.Text(root_frame, wrap=tk.WORD, yscrollcommand=text_scroll.set, font=(current_font_family, current_font_size))result_text.grid(row=2, column=0, sticky="nsew", padx=10, pady=10)text_scroll.config(command=result_text.yview)osis_id, chapter, verse = parse_input(search_input)if osis_id:bible_text = get_bible_text(osis_id, chapter, verse)result_text.insert(tk.END, bible_text)else:result_text.insert(tk.END, "输入格式错误或未找到对应经文。")# Button to go back to search pagestyle.configure('Large.TButton', font=(current_font_family, 12))back_button = ttk.Button(root_frame, text="Return", command=open_search_page, style='Large.TButton', bootstyle="primary-outline")back_button.grid(row=3, column=0, pady=10)# Configure grid row and column weights to make search box and results resizeableroot_frame.grid_rowconfigure(2, weight=1)root_frame.grid_columnconfigure(0, weight=1)# Function to clear frame content
def clear_frame(frame):for widget in frame.winfo_children():widget.destroy()# Function to handle search action from result page
def on_search_from_result(search_input):show_search_result(search_input.strip())# Function to open search page
def open_search_page():clear_frame(root_frame)main_window()# Function to handle search from search page
def on_search():search_input = entry.get().strip()if search_input:show_search_result(search_input)else:messagebox.showwarning("警告", "请输入要搜索的经文。")# Function to create and configure the main window
def create_main_window():global root_frameroot_window = tk.Tk()root_window.title("BibleQ")root_window.geometry("800x600")global stylestyle = Style(theme=current_theme)root_frame = ttk.Frame(root_window, padding="20")root_frame.pack(fill=tk.BOTH, expand=True)main_window()root_window.mainloop()# 主界面,包含搜索框和设置按钮
def main_window():global current_font_familytitle_label = ttk.Label(root_frame, text="Hallelujah,Bible", font=(current_font_family, 26, "bold"))title_label.grid(row=0, column=0, columnspan=2, pady=20, sticky="ew")title_label.configure(anchor="center")global entryentry = ttk.Entry(root_frame, font=(current_font_family, 14))entry.grid(row=1, column=0, padx=20, pady=10, sticky="ew")entry.focus()entry.bind('<Return>', lambda event=None: on_search())# 加载图片(注意:PhotoImage支持的格式主要是PNG和GIF)image = PhotoImage(file=os.path.join(os.path.dirname(os.path.abspath(__file__)), "static", "spring.png"))# 调整图片大小image = image.subsample(3, 3)  # 缩小图片# 创建一个Label,将图片放置在上面image_label = ttk.Label(root_frame, image=image)image_label.image = image  # 保持对图片的引用image_label.grid(row=2, column=0, columnspan=2, pady=20, sticky="ew")image_label.configure(anchor="center")spring_label = ttk.Label(root_frame, text="哥林多前书 爱 13:4-6", font=(current_font_family, 16, "bold"))spring_label.grid(row=3, column=0, columnspan=2, pady=20, sticky="ew")spring_label.configure(anchor="center")spring_content = ttk.Label(root_frame, text="       是恒久忍耐,又有恩慈;爱是不嫉妒;\n\n""爱是不自夸,不张狂,不做害羞的事,不求自己的益处,\n\n""不轻易发怒,不计算人的恶,不喜欢不义,只喜欢真理。",font=(current_font_family, 16))spring_content.grid(row=4, column=0, columnspan=2, sticky="ew")spring_content.configure(anchor="center")# Configure grid row and column weights to make search box and results resizeableroot_frame.grid_rowconfigure(5, weight=1)root_frame.grid_columnconfigure(0, weight=1)if __name__ == "__main__":# 获取当前文件的目录current_dir = os.path.dirname(os.path.abspath(__file__))# 构建cvs.xml的路径bible_xml_path = os.path.join(current_dir, "static", "cvs.xml")if load_bible_xml(bible_xml_path):create_main_window()else:print("Failed to load Bible XML.")


TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

相关文章:

python之Bible快速检索器

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! python之Bible快速检索器 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快…...

微服务-网关

网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发、身份校验 在SpringCloud中网关的实现包括两种&#xff1a; 快速入门 引入依赖 路由属性 网关路由对应的Java类型是RouteDefinition&#xff0c;其中常见的属性有&#xff1a; id&#xff1a;路由唯一标示ur…...

OpenAI项目爆改GLM——以基于llama_index的pdf阅读助手

最近在做大模型agent构建&#xff0c;看了许多不错的开源项目&#xff0c;但是clone下来就是一整个不能用&#xff0c;因为github上开源的项目基本都是基于openai做的。而如果想要转成国内大模型backbone&#xff0c;需要修改的地方挺多的。 现在以一个简单的pdf reader agent…...

如何在Java中处理ParseException异常?

如何在Java中处理ParseException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;ParseException异常是开发者在处理…...

Java中如何解决BadPaddingException异常?

Java中如何解决BadPaddingException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;BadPaddingException异常是一个…...

数电大作业-四输入表决器

&#xff08;PCB和multisim仿真画的有很大问题&#xff0c;没有VCC输入和GND&#xff0c;没学过直接裸画的&#xff0c;之后会好好看视频学习&#xff09; 应用背景&#xff1a; 四个评委&#xff0c;三个及以上评委同时按下通过按钮时&#xff0c;选手才能通过。否则不通过。…...

ONLYOFFICE 桌面编辑器 8.1重磅来袭:全新功能提升您的办公效率

文章目录 前言ONLYOFFICE 桌面编辑器8.1一、PDF编辑&#xff1a;告别“头痛”时刻二、幻灯片版式&#xff1a;秒变“设计大师”三、无缝切换&#xff1a;办公界的“快速通道”四、语言支持&#xff1a;全球通吃的“翻译官”五、 隐藏“连接到云”板块&#xff1a;摆脱“云”的束…...

网络协议安全:TCP/IP协议栈的安全问题和解决方案

「作者简介」:北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖Web安全、系统安全等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道TCP/IP每…...

VERYCLOUD睿鸿股份亮相亚马逊云科技中国峰会2024

5月30日&#xff0c;为期两天的亚马逊云科技中国峰会在上海世博中心圆满落幕。 多位大咖现场分享&#xff0c;生成式AI时代的数据战略&#xff0c;企业级AI应用&#xff0c;最新技术、产品重磅发布&#xff0c;创新行业解决方案 …… 作为亚马逊云科技的生态合作伙伴&#x…...

2-15 基于matlab的蚁群,模拟退火,遗传,神经网络,禁忌搜索等智能优化算法对TSP问题

基于matlab的蚁群&#xff0c;模拟退火&#xff0c;遗传&#xff0c;神经网络&#xff0c;禁忌搜索等智能优化算法对TSP问题。五种优化算法对多个城市路径进行规划&#xff0c;通过优化速度、距离可比较五种方法的优劣。程序已调通&#xff0c;可直接运行。 2-15 蚁群优化算法 …...

kylinos 国产操作系统离线安装firefox 麒麟操作系统安装新版本firefox

1. 火狐地址&#xff1a; 下载 Firefox 浏览器&#xff0c;这里有简体中文及其他 90 多种语言版本供您选择 2. 选择&#xff1a; 3. 下载完之后&#xff0c;上传到离线机器 4. 解压缩&#xff1a; tar -xvjf firefox-127.0.1.tar.bz2 5. 去点击解压后的文件夹&#xff0c;找…...

Python 类对象

Python 类对象 经典迭代器 可迭代对象的定义&#xff1a; 使用内置的iter可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法&#xff0c;那么对象就是可迭代的。序列都可以迭代。实现了__getitem__方法&#xff0c;而且接受从0开始的索引&#xff0c;这种对象也…...

pytest unittest temp path单元测试创建临时文件

参考了这个&#xff1a;Test Files Creating a Temporal Directory in Python Unittests | Simple IT &#x1f918; Rocks 并使用pathlib做了优化&#xff1a; import tempfile import unittest from pathlib import Pathclass TestExample(unittest.TestCase):def test_exa…...

在线样机生成器,制作精美的电脑手机壁纸图片展示

在线样机生成器&#xff0c;可以制作精美的电脑手机壁纸图片展示。在线样机生成器支持不同的模型如浏览器、手机、笔记本电脑、手表等结合使用&#xff0c;帮助用户快速生成样机展示图片。下面小编就来和大家分享一款免费的在线样机生成器-壁纸样机生成器。 壁纸样机生成器是一…...

FreeRTOS实时操作系统

1.认识实施操作系统 1.1 裸机和实时操作系统 裸机&#xff1a; 早期嵌入式开发没有嵌入式操作系统的概念&#xff0c;直接操作裸机&#xff0c;在裸机上写程序&#xff0c;比如用51单片机基本就没有操作系统的概念。 通常把程序设计为前后台系统&#xff0c;主要分为两部分&a…...

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构&#xff08;Client-Server Architecture&#xff09;是一种分布式计算模型&#xff0c;其中客户端和服务器之间通过网络进行通信。在这种架构中&#xff0c;客户端负责向服务器发送请求&#xff0c;并接收服务器返回的响应。服务器则负责处理客户端的…...

代码随想录算法训练营第六十五天|KM99. 岛屿数量——深搜、KM99. 岛屿数量——广搜、KM100. 岛屿的最大面积

代码随想录算法训练营第六十五天 KM99. 岛屿数量——深搜 题目链接&#xff1a;KM99. 岛屿数量 使用递归深度搜索&#xff0c;将每次遇到的岛屿上下左右记录为已经到过&#xff0c;如果遇到没到过的说明它上下左右不是之间遍历过的岛屿&#xff0c;结果计数1。最后统计计数即…...

Lua 面向对象编程

Lua 面向对象编程 Lua 是一种轻量级的编程语言,通常用于嵌入应用程序中,提供灵活的扩展和定制功能。尽管 Lua 本身是一种过程式语言,但它提供了强大的元机制,允许开发者实现面向对象的编程范式。本文将探讨 Lua 中的面向对象编程(OOP)概念、实现方式以及最佳实践。 面向…...

AI赋能前端:你的Chrome 控制台需要AI(爱)

像会永生那样去学习,像明天就要死亡那样去生活。——圣雄甘地 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 AI(Gemini)ChromeDevTool🪜魔法接码平台因为,行文字数所限,有些概念可能会一带而过亦或者提供对应的学习…...

代码随想录-Day38

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …...

CSS阴影优化气泡框样式

<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…...

强化安全新篇章:韶关石油化工可燃气体报警器年检解析

韶关&#xff0c;这座位于广东省北部的城市&#xff0c;近年来在石油化工行业取得了显著的发展。 随着一批批大型石化企业的进驻和投产&#xff0c;韶关不仅成为了区域性的石化产业基地&#xff0c;也为地方经济带来了强劲的增长动力。 然而&#xff0c;随着石化产业的快速发…...

Centos7 Docker部署PgSQL

拉取镜像 docker pull postgres:14.7运行容器 docker run --restartalways --nethost --shm-size"2g" --name pgsql -v /home/postgresql/data/pgdata:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime -e POSTGRES_PASSWORDtest2023 -d postgres:14…...

LeetCode:经典题之21、24 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …...

【C++11】initializer_list详解!

一、什么是initializer_list? nitializer_list 是一种C11新的类型特性&#xff0c;它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器&#xff0c;通常用于构造函数和函数参数中&#xff0c;以允许传递一个初始化元素列表。 initializer_list也是一种模板类…...

如何在Java中处理UnsupportedOperationException异常?

如何在Java中处理UnsupportedOperationException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;我们经常会遇到各…...

WPS没保存关闭了怎么恢复数据?4个方法(更新版)

想象一下&#xff0c;你正在用WPS奋笔疾书&#xff0c;灵感如泉水般涌出&#xff0c;突然间&#xff0c;电脑却跟你开了个玩笑——啪地一下&#xff0c;文档未保存就关闭了&#xff01;是不是感觉像是被泼了一盆冷水&#xff0c;所有的热情瞬间熄灭&#xff1f;别急&#xff0c…...

elementplus el-table(行列互换)转置

Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…...

Gradle 核心之 Task

一、前言 只有 Task 才可以在 Gradle 的执行阶段去执行&#xff08;其实质是执行的 Task 中的一系列 Action&#xff09;&#xff0c;所以 Task 的重要性不言而喻。 二、Task 2.1 Task 定义与配置 Task 的定义方式有如下两种&#xff1a; Task 的配置方式也有如下两种&#xf…...

【React 】折叠面板,点击展开时再请求数据

需求背景&#xff1a;使用折叠面板的形式展示数据&#xff0c;面板内部数据需要在打开时请求接口获取。 遇到问题&#xff1a;最开始使用Antd 的折叠面板组件&#xff0c;它对于数据直接渲染是没问题的&#xff0c;但是不好满足打开面板时再动态加载数据的需求&#xff0c;于是…...