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。 …...

谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇
前言 ES 7.10 可能是现在比较常见的 ES 版本。但是对于一些相迭代比较慢的早期业务系统来说,ES 6.8 是一个名副其实的“钉子户”。 借着工作内升级调研的任务东风,我整理从 ES 6.8 到 ES 7.10 ELastic 重点列出的新增功能和优化内容。将分为 6 个篇幅给…...

[250222] Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡 | SQLPage v0.33 发布
目录 Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡SQLPage v0.33 发布:使用 SQL 构建自定义 UI 和 API! Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡 Kimi 开放平台推出全新模型 kimi-latest,旨在…...
深入理解设计模式之解释器模式
深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…...
深入理解设计模式之代理模式
深入理解设计模式之代理模式 在软件开发的复杂体系中,我们常常会遇到这样的情况:需要控制对某个对象的访问,或者在访问对象前后添加一些额外的处理逻辑,又或者希望在不改变原对象代码的基础上扩展其功能。代理模式(Pr…...

Golang | 每日一练 (3)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (3)题目参考答案map 实现原理hmapb…...

企业数据集成:实现高效调拨出库自动化
调拨出库对接调出单-v:旺店通企业奇门数据集成到用友BIP 在企业信息化管理中,数据的高效流转和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将旺店通企业奇门的数据无缝集成到用…...

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践
1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志,面向运筹调控、算法特征、分析报表、诊断监控等应用场景,进行了品牌数仓能力建设。随着业务发展,基于Lambda架构的数仓开发模式,缺陷日益突出:…...
Deepseek快速做PPT
背景: DeepSeek大纲生成 → Kimi结构化排版 → 数据审查,细节调整 DeepSeek 拥有深度思考能力,擅长逻辑构建与内容生成,它会根据我们的问题进行思考,其深度思考能力当前测试下来,不愧为国内No.1,而且还会把中间的思考过程展示出来,大多时候会给出很多我们意想不到的思…...

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 个人信息 作者:赵晗,浙江大学-西湖大学联合培养博士生 内容简介 近年来,在各个领域应用多模态大语言模型(MLLMs&…...

uniapp修改picker-view样式
解决问题: 1.选中文案样式,比如字体颜色 2.修改分割线颜色 3.多列时,修改两边间距让其平分 展示效果: 代码如下 <template><u-popup :show"showPicker" :safeAreaInsetBottom"false" close&quo…...

HDFS Java 客户端 API
一、基本调用 Configuration 配置对象类,用于加载或设置参数属性 FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。 1. maven依赖pom.xml文件 <dependency><groupId>org.apache.hadoop</groupId&g…...

【华三】STP的角色选举(一文讲透)
【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图(文字描述)****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...
【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解
【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解 在 C# 中,多态是面向对象编程的重要特性之一,它允许不同的对象对同一消息做出不同的响应。多态可以分为静态多态和动态多态,下面将详细介绍它们以及各自包含的知识点。 多态概述 多态性使得代码更加灵活、可扩展…...

宇树科技13家核心零部件供应商梳理!
2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…...

Java集合框架全解析:从LinkedHashMap到TreeMap与HashSet面试题实战
一、LinkedHashMap ①LinkedHashMap集合和HashMap集合的用法完全相同。 ②不过LinkedHashMap可以保证插入顺序。 ③LinkedHashMap集合因为可以保证插入顺序,因此效率比HashMap低一些。 ④LinkedHashMap是如何保证插入顺序的? 底层采用了双向链表来记…...

goland无法debug项目
1、其实个原因是因为正在使用的Delve调试器版本太旧,无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具,用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...
深入探索 DeepSeek 在数据分析与可视化中的应用
在数据驱动的时代,快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具,凭借其强大的数据处理和可视化能力,正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前,数据预处理…...

python面试题整理
Python 如何处理异常? Python中,使用try 和 except 关键字来捕获和处理异常 try 块中放置可能会引发异常的代码,然后在except块中处理这些异常。 能补充一下finally的作用吗? finally 块中的代码无论是否发生异常都会执行…...

大型装备故障诊断解决方案
大型装备故障诊断解决方案 方案背景 在全球航空工业迅猛发展的背景下,我国在军用和民用飞机自主研发制造领域取得了显著成就。尤其是在国家大力支持下,国内飞机制造企业攻克了诸多关键技术难题,实现了从设计研发到生产制造再到售后保障的完整…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
TMC2226超静音步进电机驱动控制模块
目前已经使用TMC2226量产超过20K,发现在静音方面做的还是很不错。 一、TMC2226管脚定义说明 二、原理图及下载地址 一、TMC2226管脚定义说明 引脚编号类型功能OB11电机线圈 B 输出 1BRB2线圈 B 的检测电阻连接端。将检测电阻靠近该引脚连接到地。使用内部检测电阻时,将此引…...