XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
XUnity.AutoTranslator-deepseek
本项目通过调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译。
准备工作
1. 获取API密钥
- 访问腾讯云API控制台申请DeepSeek的API密钥(限时免费)。
- 也可以使用其他平台提供的DeepSeek API。
2. 安装依赖
确保已安装以下软件和库:
- XUnity.AutoTranslator (不会使用可以看我之前的文章Xunity.autotranslator机翻unity引擎的游戏)
- Python 3.x
安装必要的Python库:
pip install Flask gevent openai
代码如下:
import os
import re
import json
import time
from flask import Flask, request # 导入 Flask 库,用于创建 Web 应用,需要安装:pip install Flask
from gevent.pywsgi import WSGIServer # 导入 gevent 的 WSGIServer,用于提供高性能的异步服务器,需要安装:pip install gevent
from urllib.parse import unquote # 导入 unquote 函数,用于 URL 解码
from threading import Thread # 导入 Thread,用于创建线程 (虽然实际上未使用,但import没有坏处)
from queue import Queue # 导入 Queue,用于创建线程安全的队列
import concurrent.futures # 导入 concurrent.futures,用于线程池
from openai import OpenAI # 导入 OpenAI 库,用于调用 OpenAI API,需要安装:pip install openai 并更新:pip install --upgrade openai# 启用虚拟终端序列,支持 ANSI 转义代码,允许在终端显示彩色文本
os.system('')dict_path='用户替换字典.json' # 替换字典路径。如果不需要使用替换字典,请将此变量留空(设为 None 或空字符串 "")# API 配置参数
Base_url = "https://api.lkeap.cloud.tencent.com/v1" # OpenAI API 请求地址,这里使用了腾讯云的 API 代理服务
Model_Type = "deepseek-v3" # 使用的模型类型,可选项包括"deepseek-v3" 或者其他模型# 检查请求地址尾部是否已包含 "/v1",若没有则自动补全,确保 API 请求路径正确
if Base_url[-3:] != "/v1":Base_url = Base_url + "/v1"# 创建 OpenAI 客户端实例
client = OpenAI(api_key="sk-XXXXXXXXXXXXXXXX", # API 密钥,请替换为您自己的 API Key。如何获取 API Key 的指南:https://cloud.tencent.com/document/product/1772/115970base_url=Base_url, # API 请求基础 URL,设置为上面配置的 Base_url
)# 译文重复内容检测参数
repeat_count=5 # 重复内容阈值。如果译文中有任意单字或单词连续重复出现次数大于等于 repeat_count,则认为译文质量不佳,会触发重试翻译逻辑# 提示词 (Prompt) 配置
prompt= '''
你是资深本地化专家,负责将游戏日文文本译为简体中文。接收文本后,按以下要求翻译:
翻译范围:翻译普通日文文本,保留原文叙述风格。
保留格式:保留转义字符、格式标签、换行符等非日文文本内容。
翻译原则:忠实准确,确保语义无误;对露骨性描写,可直白粗俗表述,不删减篡改;对双关语等特殊表达,找目标语言等效表达,保原作意图风格。
文本类型:游戏文本含角色对话、旁白、武器及物品名称、技能描述、格式标签、换行符、特殊符号等。
以下是待翻译的游戏文本:
''' # 基础提示词,用于指导模型进行翻译,定义了翻译的角色、范围、格式、原则和文本类型
prompt_list=[prompt] # 提示词列表。可以配置多个提示词,程序会依次尝试使用列表中的提示词进行翻译,直到获得满意的结果
l=len(prompt_list) # 获取提示词列表的长度 (此变量目前未被直接使用,可能是为后续扩展功能预留)# 提示字典相关的提示词配置
dprompt0='\n在翻译中使用以下字典,字典的格式为{\'原文\':\'译文\'}\n' # 提示模型在翻译时使用提供的字典。字典格式为 JSON 格式的字符串,键为原文,值为译文
dprompt1='\nDuring the translation, use a dictionary in {\'Japanese text \':\'translated text \'} format\n' # 英文版的字典提示词,可能用于多语言支持或模型偏好
# dprompt_list 字典提示词列表,与 prompt_list 提示词列表一一对应。当使用 prompt_list 中的第 i 个提示词时,会同时使用 dprompt_list 中的第 i 个字典提示词
dprompt_list=[dprompt0,dprompt1,dprompt1]app = Flask(__name__) # 创建 Flask 应用实例# 读取提示字典
prompt_dict= {} # 初始化提示字典为空字典
if dict_path: # 检查是否配置了字典路径try:with open(dict_path, 'r', encoding='utf8') as f: # 尝试打开字典文件tempdict = json.load(f) # 加载 JSON 字典数据# 按照字典 key 的长度从长到短排序,确保优先匹配长 key,避免短 key 干扰长 key 的匹配sortedkey = sorted(tempdict.keys(), key=lambda x: len(x), reverse=True)for i in sortedkey:prompt_dict[i] = tempdict[i] # 将排序后的字典数据存入 prompt_dictexcept FileNotFoundError:print(f"\033[33m警告:字典文件 {dict_path} 未找到。\033[0m") # 警告用户字典文件未找到except json.JSONDecodeError:print(f"\033[31m错误:字典文件 {dict_path} JSON 格式错误,请检查字典文件。\033[0m") # 错误提示 JSON 格式错误except Exception as e:print(f"\033[31m读取字典文件时发生未知错误: {e}\033[0m") # 捕获其他可能的文件读取或 JSON 解析错误def contains_japanese(text):"""检测文本中是否包含日文字符。Args:text (str): 待检测的文本。Returns:bool: 如果文本包含日文字符,则返回 True;否则返回 False。"""pattern = re.compile(r'[\u3040-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FE]') # 日文字符的 Unicode 范围正则表达式return pattern.search(text) is not None # 使用正则表达式搜索文本中是否包含日文字符def has_repeated_sequence(string, count):"""检测字符串中是否存在连续重复的字符或子串。Args:string (str): 待检测的字符串。count (int): 重复次数阈值。Returns:bool: 如果字符串中存在重复次数达到或超过阈值的字符或子串,则返回 True;否则返回 False。"""# 首先检查单个字符的重复for char in set(string): # 遍历字符串中的不重复字符集合if string.count(char) >= count: # 统计每个字符在字符串中出现的次数,如果超过阈值,则返回 Truereturn True# 然后检查字符串片段(子串)的重复for size in range(2, len(string)//count + 1): # 子串长度从 2 开始到 len(string)//count,因为更长的重复子串不太可能出现for start in range(0, len(string) - size + 1): # 滑动窗口的起始位置substring = string[start:start + size] # 提取当前窗口的子串matches = re.findall(re.escape(substring), string) # 使用正则表达式查找整个字符串中该子串的重复次数,re.escape 用于转义特殊字符if len(matches) >= count: # 如果子串重复次数达到阈值,则返回 Truereturn Truereturn False # 如果以上所有检查都没有发现重复内容,则返回 False# 获得文本中包含的字典词汇
def get_dict(text):"""从文本中提取出在提示字典 (prompt_dict) 中存在的词汇及其翻译。Args:text (str): 待处理的文本。Returns:dict: 一个字典,key 为在文本中找到的字典原文,value 为对应的译文。如果文本中没有找到任何字典词汇,则返回空字典。"""res={} # 初始化结果字典for key in prompt_dict.keys(): # 遍历提示字典中的所有原文 (key)if key in text: # 检查当前原文 (key) 是否出现在待处理文本中res.update({key:prompt_dict[key]}) # 如果找到,则将该原文及其译文添加到结果字典中text=text.replace(key,'') # 从文本中移除已匹配到的字典原文,避免出现长字典包含短字典导致重复匹配的情况。# 例如,字典中有 "技能" 和 "技能描述" 两个词条,如果先匹配到 "技能描述",# 则将文本中的 "技能描述" 替换为空,后续就不会再匹配到 "技能" 了。if text=='': # 如果文本在替换过程中被清空,说明所有文本内容都已被字典词汇覆盖,提前结束循环breakreturn res # 返回提取到的字典词汇和译文request_queue = Queue() # 创建请求队列,用于异步处理翻译请求。使用队列可以避免请求处理阻塞主线程,提高服务器响应速度
def handle_translation(text, translation_queue):"""处理翻译请求的核心函数。Args:text (str): 待翻译的文本。translation_queue (Queue): 用于存放翻译结果的队列。"""text = unquote(text) # 对接收到的文本进行 URL 解码,还原原始文本内容max_retries = 3 # 最大 API 请求重试次数retries = 0 # 初始化重试次数计数器MAX_THREADS = 30 # 最大线程数限制,用于限制并发 API 请求数量,防止对 API 造成过大压力或超出并发限制queue_length = request_queue.qsize() # 获取当前请求队列的长度,可以根据队列长度动态调整线程数number_of_threads = max(1, min(queue_length // 4, MAX_THREADS)) # 动态计算线程数:# 至少使用 1 个线程,最多不超过 MAX_THREADS,# 线程数随队列长度增加而增加,但增幅受限 (除以 4)。# 这样可以在请求量大时增加并发,请求量小时减少资源占用。special_chars = [',', '。', '?','...'] # 定义句末特殊字符列表,用于句末标点符号的对齐和修正text_end_special_char = None # 初始化文本末尾特殊字符变量if text[-1] in special_chars: # 检查待翻译文本末尾是否包含特殊字符text_end_special_char = text[-1] # 如果包含,则记录该特殊字符special_char_start = "「" # 定义特殊字符起始标记special_char_end = "」" # 定义特殊字符结束标记has_special_start = text.startswith(special_char_start) # 检查文本是否以特殊字符起始标记开头has_special_end = text.endswith(special_char_end) # 检查文本是否以特殊字符结束标记结尾if has_special_start and has_special_end: # 如果文本同时包含起始和结束特殊字符标记,则在翻译前移除它们,# 翻译后再将特殊字符加回,以避免特殊字符影响翻译质量或被模型错误翻译text = text[len(special_char_start):-len(special_char_end)]# OpenAI 模型参数配置model_params = {"temperature": 0.1, # 降低 temperature,使模型输出更稳定,减少随机性"frequency_penalty": 0.1, # 对频繁出现的 token 施加惩罚, हल्का降低重复内容生成的可能性"max_tokens": 512, # 限制模型生成token的最大数量,避免模型生成过长文本,浪费token或超出处理限制"top_p": 0.3, # 限制候选token的范围,仅考虑累积概率最高的 top_p 部分 token,进一步约束模型输出,提高生成质量}try: # 使用 try...except 块捕获可能发生的异常,例如 API 请求超时或错误dict_inuse=get_dict(text) # 从待翻译文本中获取字典词汇for i in range(len(prompt_list)): # 遍历提示词列表,尝试使用不同的提示词进行翻译prompt = prompt_list[i] # 获取当前循环的提示词dict_inuse = get_dict(text) # 再次获取字典词汇 (虽然此处重复获取,但逻辑上为了保证每次循环都重新获取一次字典是更严谨的)if dict_inuse: # 如果获取到字典词汇,则将字典提示词和字典内容添加到当前提示词中,引导模型使用字典进行翻译prompt += dprompt_list[i] + str(dict_inuse)messages_test = [ # 构建 OpenAI API 请求的消息体{"role": "system", "content": prompt}, # system 角色消息,包含提示词,用于设定模型角色和翻译目标{"role": "user", "content": text} # user 角色消息,包含待翻译的文本内容]with concurrent.futures.ThreadPoolExecutor(max_workers=number_of_threads) as executor: # 创建线程池,并发执行 API 请求future_to_trans = {executor.submit(client.chat.completions.create, model=Model_Type, messages=messages_test, **model_params) for _ in range(number_of_threads)} # 提交多个 API 请求任务到线程池# 这里提交的任务数量等于 number_of_threads,实现并发请求for future in concurrent.futures.as_completed(future_to_trans): # 遍历已完成的 futuretry: # 再次使用 try...except 捕获单个 API 请求可能发生的异常response_test = future.result() # 获取 future 的结果,即 API 响应translations = response_test.choices[0].message.content # 从 API 响应中提取翻译结果文本print(f'{prompt}\n{translations}') # 打印提示词和翻译结果 (调试或日志记录用)if has_special_start and has_special_end: # 如果原始文本包含特殊字符标记,则将翻译结果用特殊字符标记包裹起来,保持格式一致if not translations.startswith(special_char_start): # 检查翻译结果是否已以起始标记开头,若没有则添加translations = special_char_start + translationsif not translations.endswith(special_char_end): # 检查翻译结果是否已以结束标记结尾,若没有则添加translations = translations + special_char_endelif has_special_start and not translations.startswith(special_char_start): # 再次检查并添加起始标记,以应对更复杂的情况translations = special_char_start + translationselif has_special_end and not translations.endswith(special_char_end): # 再次检查并添加结束标记,以应对更复杂的情况translations = translations + special_char_endtranslation_end_special_char = None # 初始化翻译结果末尾特殊字符变量if translations[-1] in special_chars: # 检查翻译结果末尾是否包含特殊字符translation_end_special_char = translations[-1] # 如果包含,则记录该特殊字符if text_end_special_char and translation_end_special_char: # 如果原始文本和翻译结果末尾都有特殊字符if text_end_special_char != translation_end_special_char: # 且两个特殊字符不一致,则修正翻译结果的末尾特殊字符,使其与原始文本一致,保持标点符号对齐translations = translations[:-1] + text_end_special_charelif text_end_special_char and not translation_end_special_char: # 如果原始文本末尾有特殊字符,而翻译结果没有,则将原始文本的末尾特殊字符添加到翻译结果末尾,保持标点符号完整translations += text_end_special_charelif not text_end_special_char and translation_end_special_char: # 如果原始文本末尾没有特殊字符,而翻译结果有,则移除翻译结果末尾的特殊字符,保持标点符号简洁translations = translations[:-1]contains_japanese_characters = contains_japanese(translations) # 检测翻译结果中是否包含日文字符repeat_check = has_repeated_sequence(translations, repeat_count) # 检测翻译结果中是否存在重复内容except Exception as e: # 捕获 API 请求异常retries += 1 # 增加重试次数print(f"API请求超时,正在进行第 {retries} 次重试... {e}") # 打印重试信息if retries == max_retries: # 如果达到最大重试次数raise e # 抛出异常,终止翻译time.sleep(1) # 等待 1 秒后重试if not contains_japanese_characters and not repeat_check: # 如果翻译结果不包含日文字符且没有重复内容,则认为翻译质量可以接受,跳出提示词循环breakelif contains_japanese_characters: # 如果翻译结果包含日文字符,则说明当前提示词不适用print("\033[31m检测到译文中包含日文字符,尝试使用下一个提示词进行翻译。\033[0m") # 打印警告信息,提示将尝试下一个提示词continue # 继续下一次循环,尝试使用下一个提示词elif repeat_check: # 如果翻译结果存在重复内容,则说明翻译质量不佳,需要调整模型参数或提示词print("\033[31m检测到译文中存在重复短语,调整参数。\033[0m") # 打印警告信息,提示将调整模型参数model_params['frequency_penalty'] += 0.1 # 增加 frequency_penalty 参数值,降低模型生成重复内容的倾向break # 跳出当前提示词的尝试,使用调整后的参数重新尝试翻译 (注意这里只是 break 了内层的 for 循环,外层的 for 循环会继续尝试下一个提示词,逻辑可能需要根据实际需求调整)if not contains_japanese_characters and not repeat_check: # 再次检查,如果翻译结果最终符合要求 (不包含日文字符且没有重复内容),则跳出所有循环,完成翻译break# 打印最终翻译结果 (高亮显示)print(f"\033[36m[译文]\033[0m:\033[31m {translations}\033[0m")print("-------------------------------------------------------------------------------------------------------") # 分隔线,用于分隔不同文本的翻译结果translation_queue.put(translations) # 将翻译结果放入翻译结果队列,供 Flask 路由函数获取except Exception as e: # 捕获更外层的异常,例如 API 连接错误等print(f"API请求失败:{e}") # 打印 API 请求失败的错误信息translation_queue.put(False) # 将 False 放入翻译结果队列,表示翻译失败# 定义 Flask 路由,处理 "/translate" GET 请求
@app.route('/translate', methods=['GET'])
def translate():"""Flask 路由函数,处理 "/translate" GET 请求。接收 GET 请求参数中的 "text" 字段,调用翻译处理函数进行翻译,并返回翻译结果。如果翻译超时或失败,则返回相应的错误信息和状态码。Returns:Response: Flask Response 对象,包含翻译结果或错误信息。"""text = request.args.get('text') # 从 GET 请求的查询参数中获取待翻译的文本,参数名为 "text"print(f"\033[36m[原文]\033[0m \033[35m{text}\033[0m") # 打印接收到的原文 (高亮显示)# 由于提示词中已经提供对换行符的处理,所以这里不需要再对换行符进行特殊处理,所以将下面的代码注释掉,如果修改了提示词,请取消注释# if '\n' in text: # 检查原文中是否包含换行符 "\n"# text=text.replace('\n','\\n') # 如果包含,则将换行符替换为 "\\n",避免换行符在后续处理中引起问题 (例如,在某些日志或显示场景下)translation_queue = Queue() # 创建一个新的翻译结果队列,用于当前请求的翻译结果传递request_queue.put_nowait(text) # 将待翻译文本放入请求队列,使用 put_nowait 非阻塞地放入队列with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: # 创建一个线程池,用于执行翻译任务 (这里线程池的最大线程数设置为 10,可能需要根据实际情况调整)future = executor.submit(handle_translation, text, translation_queue) # 提交翻译任务 (handle_translation 函数) 到线程池,并获取 Future 对象,用于跟踪任务状态和结果try: # 使用 try...except 块捕获任务执行超时异常future.result(timeout=30) # 等待任务完成,设置超时时间为 30 秒。如果在 30 秒内任务没有完成,则抛出 TimeoutError 异常except concurrent.futures.TimeoutError: # 捕获超时异常print("翻译请求超时,重新翻译...") # 打印超时信息return "[请求超时] " + text, 500 # 返回 HTTP 500 错误状态码和错误信息,包含原始文本,方便用户识别超时的请求translation = translation_queue.get() # 从翻译结果队列中获取翻译结果,这里会阻塞等待,直到队列中有结果可取request_queue.get_nowait() # 从请求队列中移除已处理完成的请求 (这里可能需要根据实际队列使用逻辑来调整,如果 request_queue 仅用于统计队列长度,则此处的 get_nowait 可能不是必需的)if isinstance(translation, str): # 检查翻译结果是否为字符串类型,判断翻译是否成功translation = translation.replace('\\n', '\n') # 如果翻译成功,将之前替换的 "\\n" 还原为 "\n",恢复原始换行符格式return translation # 返回翻译结果字符串else: # 如果翻译结果不是字符串类型 (例如,返回了 False),则表示翻译失败return translation, 500 # 返回翻译失败的状态码 500 和具体的错误信息 (如果 translation 中包含了错误信息)def main():"""主函数,启动 Flask 应用和 gevent 服务器。"""print("\033[31m服务器在 http://127.0.0.1:4000 上启动\033[0m") # 打印服务器启动信息,提示用户访问地址http_server = WSGIServer(('127.0.0.1', 4000), app, log=None, error_log=None) # 创建 gevent WSGIServer 实例,监听 127.0.0.1:4000 端口,使用 Flask app 处理请求,禁用访问日志和错误日志 (log=None, error_log=None)http_server.serve_forever() # 启动 gevent 服务器,无限循环运行,等待和处理客户端请求if __name__ == '__main__':main() # 当脚本作为主程序运行时,调用 main 函数启动服务器
3. 配置API
克隆本项目后,修改deepseekv3.py中的api_key
配置部分:
client = OpenAI(api_key="sk-XXXXXXXXXXXXXXXXXXXXXX", # 替换为您的API密钥base_url=Base_url, # API请求基础URL
)
4. 自定义API配置
如果使用其他云厂商的API和模型,请修改以下配置:
# API配置参数
Base_url = "https://api.lkeap.cloud.tencent.com/v1" # OpenAI API请求地址
Model_Type = "deepseek-v3" # 使用的模型类型
启动项目
1. 启动Python脚本
确保Python脚本成功启动,命令行应显示:
服务器在 http://127.0.0.1:4000 上启动
2. 配置XUnity.AutoTranslator
修改XUnity.AutoTranslator插件的配置文件AutoTranslatorConfig.ini
或Config.ini
:
[Service]
Endpoint=CustomTranslate[Custom]
Url=http://127.0.0.1:4000/translate
参考项目
- XUnity.AutoTranslator-Sakura
- 项目地址
相关文章:
XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
XUnity.AutoTranslator-deepseek 本项目通过调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译。 准备工作 1. 获取API密钥 访问腾讯云API控制台申请DeepSeek的API密钥(限时免费)。也可以使用其他平台提供的DeepSeek API。 …...
对比机器学习揭示了跨物种共享与特异性的脑功能结构|文献速递-医学影像人工智能进展
Title 题目 Contrastive machine learning reveals species -shared and -specific brainfunctional architecture 对比机器学习揭示了跨物种共享与特异性的脑功能结构 01 文献速递介绍 猕猴作为人类的动物模型,广泛用于研究大脑和行为的关键方面(G…...
Vue 和 React 响应式的区别
React 和 Vue 在响应式机制上的核心区别主要体现在数据变化侦测方式、更新触发逻辑和设计理念上,具体如下: 一、数据变化侦测方式 Vue 的响应式 原理:通过 Proxy(Vue3)或 Object.defineProperty(Vue2&#…...
MySQL主从架构
MySQL主从架构 MySQL REPLICATION 在实际生产环境中,如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(…...
基于ros2与gazebo的导航仿真案例
文章目录 前言操作1、创建docker容器2、安装ROS23、Gazebo安装4、Nav2安装5、测试 前言 导航的入门小案例 参考: Ubuntu24.04 ROS2 Jazzy Gazebo Harmonic安装教程Docs / Gazebo Harmonic 注意选择版本 ROS 2 documentation 操作 1、创建docker容器 sudo docke…...
《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO
《Python实战进阶》专栏 第3集:Django 项目结构解析与入门DEMO 在本集中,我们将深入探讨 Django 的项目结构,并实际配置并运行一个入门DEMO博客网站,帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…...
基于WebGIS技术的校园地图导航系统架构与核心功能设计
本文专为IT技术人员、地理信息系统(GIS)开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案,旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…...
开源且免费的CMS系统有哪几个可以放心用?
既开源又免费的两全其美的CMS不多见,不过总会存在一些个例,给用户们带来更具有建设性的选择,以下是一些开源免费且值得信赖的CMS系统,可以根据你的需求选择合适的平台: 1、WordPress ▷ 特点:全球最流行的…...
逻辑架构与软件架构在PREEvision中的设计关系
1 Introduction 在如今汽车电子系统的开发过程中,系统架构设计是至关重要的环节。无论是汽车控制系统、信息娱乐系统,还是电动驱动系统,架构设计都决定了整个系统的功能、性能以及后期的可维护性和可扩展性。 在往期文章中,我们…...
DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?
一、引言 在当今科技飞速发展的时代,人工智能(AI)已然成为推动各领域变革的核心力量。而在人工智能的众多分支中,自然语言处理(NLP)因其与人类日常交流和信息处理的紧密联系,成为了最受瞩目的领…...
现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能
现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能,每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容,屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便,而…...
AF3 _process_single_hit 函数解读
AlphaFold3 中templates模块的_process_single_hit函数处理单个 HHsearch 比对的模板 TemplateHit,并从相应的 mmCIF 文件中提取模板特征,返回包含模板位置信息、比对质量等特征的 SingleHitResult 对象。它是 AlphaFold3 在模板模块中生成模板特征结构输入的重要步骤。 源代…...
go 模块管理
go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…...
23种设计模式 - 命令模式
模式定义 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为独立对象,使请求的发送者与接收者解耦。通过将操作抽象为命令对象,支持命令的存储、传递、撤销和重做,增强系统的灵活性和可扩展性…...
php-fpm
摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…...
Visual Studio 2022配置网址参考
代码格式化和清理冗余代码选项的配置: 代码样式选项和代码清理 - Visual Studio (Windows) | Microsoft Learn 调试时传递参数: 调试时传递命令行参数(C) - Visual Studio (Windows) | Microsoft Learn...
【含文档+PPT+源码】基于Django的新闻推荐系统的设计与实现
项目介绍 本课程演示的是一款基于Django的新闻推荐系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...
2025年02月21日Github流行趋势
项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...
后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...
Apache Doris 实现毫秒级查询响应
1. 引言 1.1 数据分析的重要性 随着大数据时代的到来,企业对实时数据分析的需求日益增长。快速、准确地获取数据洞察成为企业在竞争中脱颖而出的关键。传统的数据库系统在处理大规模数据时往往面临性能瓶颈,难以满足实时分析的需求。例如,一个电商公司需要实时监控销售数据…...
【Python项目】基于Python的语音数据及标注核对审核系统
【Python项目】基于Python的语音数据及标注核对审核系统 技术简介: 采用Python技术、MySQL数据库、Django框架等实现。 系统简介: 语音数据及标注核对审核系统是一个基于B/S架构的语音数据处理平台,旨在通过自动化的方式对语音数据进行标…...
路由基本配置
学习目标 • 根据拓扑图进行网络布线。 • 清除启动配置并将路由器重新加载为默认状态。 • 在路由器上执行基本配置任务。 • 配置并激活以太网接口。 • 测试并检验配置。 • 思考网络实施方案并整理成文档。 任务 1:网络布线 使用适当的电缆类型连接网络设备。…...
从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信
WebRTC最初是为浏览器之间的实时通信设计的,其资源需求和复杂性可能对嵌入式设备的性能提出较高要求,因此在嵌入式系统中应用时面临一些挑战: 1)资源消耗较高 CPU和内存占用:WebRTC是一个功能强大的实时通信框架&…...
【Blender】二、建模篇--05,阵列修改器与晶格形变
阵列修改器是bender里面一个比较常用的修改器,所以我们单独开口来讲,我们会先从几片树叶出发,然后我们用阵列修改器把这几片树叶变成这样的造型和这样的造型。这两个造型分别就代表着阵列修改器最常用的两种偏移方法,我们现在就开始我们先来做几个树叶。 1.树叶建模 首先…...
Python爬虫实战:获取12306特定日期、城市车票信息,并做数据分析以供出行参考
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 核心思路 需求:获取明天(2025 年 2 月 21 日)从北京到上海的车次、票价、出发时间、硬卧二等卧信息,并保存到 CSV 文件,然后分析出价格最低的 10 趟车次。目…...
C++ 设计模式-策略模式
支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基础策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…...
数据结构:哈希表(unordered_map)
unordered_map 是 C 标准库中的一种哈希表实现,它提供了基于键值对(key-value)的存储,提供了常数时间复杂度的查找、插入和删除键值对的操作。 初始化代码示例: #include <unordered_map> using namespace std…...
鸿蒙-自定义布局-实现一个可限制行数的-Flex
文章目录 前提onMeasureSizeselfLayoutInfoconstraintchildren onPlaceChildren 实现思路属性准备测量组件布局小结 刷新 千呼万唤始出来的自定义布局功能终于可以用了,这就给了我们更多自由发挥创造的空间,不再局限于使用已有组件做组合。当然ÿ…...
安装可视化jar包部署平台JarManage
一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...
1、Window Android 13模拟器 将编译的映像文件导入Android Studio
1、环境准备 编译环境:Ubuntu-18.04.5编译版本:android13-release下载地址:清华大学开源软件镜像站AOSP # 下载repo # 同步代码:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…...
力扣27. 移除元素(快慢指针)
Problem: 27. 移除元素 文章目录 题目描述思路Code 题目描述 思路 定义快慢指针均指向数组起始位置,当fast指针指向的元素不等于val时将fast指针指向的元素赋值给slow并让slow指针向前移动,fast指针一直向前移动 时间复杂度: O ( n ) O(n) O(n); 空间复杂…...
Unity学习part4
1、ui界面的基础使用 ui可以在2d和矩形工具界面下操作,更方便,画布与游戏窗口的比例一般默认相同 如图所示,图片在画布上显示的位置和在游戏窗口上显示的位置是相同的 渲染模式:屏幕空间--覆盖,指画布覆盖在游戏物体渲…...
前端面试之Flex布局:核心机制与高频考点全解析
目录 引言:弹性布局的降维打击 一、Flex布局的本质认知 1. 两大核心维度 2. 容器与项目的权力边界 二、容器属性深度剖析 1. 主轴控制三剑客 2. 交叉轴对齐黑科技 三、项目属性关键要点 1. flex复合属性解密 2. 项目排序魔法 四、六大高频面试场景 1. 经…...
关系数据理论
一、函数依赖 若t1(X)t2(X),必有t1(Y)t2(Y),那么我们称属性组X函数确定属性组Y,或者说Y函数依赖于X。记为X->Y,其中X叫决定因素,Y叫依赖因素。 平凡函数依赖与非平凡函数依赖: 二、1-BCNF 评价关系模式“好坏”的理论标准就…...
低代码与开发框架的一些整合[2]
1.分析的项目资源说明 经过近期的的不断分析与运行对比,最终把注意力集中在了以下几个框架: 01.dibootdiboot.diboot: 写的更少, 性能更好 -> 为开发人员打造的低代码开发平台。Mybatis-plus关联查询,关联无SQL,性能高10倍&a…...
网络空间安全(1)web应用程序的发展历程
前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷,从简单的文档共享系统到如今复杂、交互式、数据驱动的平台,经历了多个重要阶段。 一、起源与初期发展(1989-1995年) Web的诞生: 1989年,欧洲…...
Android 之 AIDL for HAL
Android AIDL for HAL 的作用与实现 作用: Android AIDL for HAL(Android Interface Definition Language for Hardware Abstraction Layer)旨在统一 HAL 开发接口,替代 HIDL(Hardware Interface Definition Language…...
Python爬虫基础文件操作
文件操作 引言 爬虫爬取的一切内容都是在内存进行的,这样会有什么问题吗?如果一旦短电或着发生意外电脑关机了那么你的工作成果将瞬间消失。所以,我们还缺少数据在本地文件系统进行持久化的能力,简单的来说就是文件读写操作。文…...
OpenGauss MySQL兼容库迁移
OpenGauss 提供了从MySQL到OG的迁移工具,虽然安装在起来及其繁琐,也不怎么好用,不过我现在需要的是,从MySQL到OG的MySQL兼容库,可以理解成从MySQL到MySQL的迁移。 但是很不幸的是,OG的MySQL的兼容模式&…...
SOME/IP--协议英文原文讲解10
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.2 Req…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...
vue2 和 vue3 中 computer 计算属性的用法
Vue 2 中的 computed 在 Vue 2 中,计算属性是响应式的,并且基于 getter 进行缓存,只有依赖的响应式数据发生变化时才会重新计算。 基本用法 <template><div><p>原始消息:{{ message }}</p><p>反…...
Python爬虫入门到精通:从零开始的数据采集之旅
一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
【JMeter使用-2】JMeter中Java Request采样器的使用指南
Apache JMeter 是一款功能强大的性能测试工具,支持多种协议和测试场景。除了内置的采样器(如HTTP请求、FTP请求等),JMeter还允许通过 Java Request采样器 调用自定义的Java代码,从而实现更复杂的测试逻辑。本文将详细介…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
自学Java-AI结合GUI开发一个石头迷阵的游戏
自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
UDP和TCP
UDP协议 报文中应该包含 源IP,源端口号目的IP,目的端口号UDP/TCP 一个进程是否可以绑定多个端口号? 可以。多个进程是否可以绑定一个端口号? 不可以,因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…...