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

IOS 国际化词条 Python3 脚本

一、词条处理脚本---使用教程

(1)环境篇

1: 该脚本基于python3 环境,请确保你的mac 安装了python3
2: 包依赖,请在python3环境下安装 xlrd;

pip3 install xlrd

(2)使用篇

1: 桌面创建一个文件夹, 例如 wordEntry,将该脚本文件与下载的最新的 ’词条.xlsx‘ excel文件 放置于该新文件夹下
2:执行 脚本

python3 wordEntry.py

注意:请确保每次只有一个 excell 文件与脚本同处一个目录下

自动帮忙修改xcode工程中的国际化文件
要求:
<1>需要在中、英文、繁体等国际化文件中加上分隔符,脚本将以分隔符做区分,分隔符之后的词条都将会被从excel中读取的新词条覆盖
<2>分隔符,目前定义为 <script/beginCoverage>

eg:
修改前:
//Demo 第一期20190703---------------------------Demo-------
"hello" = "欢迎您";
**
添加分隔符后:
//Demo 第一期20190703---------------------------Demo-------
//<script/beginCoverage>
"hello" = "欢迎您";
**

<3> "hello" = "欢迎您"; 及以后的内容都将被覆盖

<4> 脚本的执行方式有所改变

python3 wordEntry.py project_path(xcode项目的根目录)
eg:
python3 wordEntry.py ~/Desktop/Demo

<5> 当然你也可以不添加项目路径,仍然使用python3 wordEntry.py去执行, 但需要修改脚本开头的 project_path = '/Users/admin/Desktop/wallet' 成自己对应项目的路径,(注意:脚本优先读取您传入的项目路径)

比如修改为-> project_path = '/Users/***/Desktop/Demo'

词条脚本报错:
xlrd.biffh.XLRDError: Excel xlsx file; not supported
需要执一下一下命令:
pip3 install xlrd==1.2.0

解析:https://blog.csdn.net/weixin_45579026/article/details/112601560

二、IOS 国际化词条 Python3 脚本

import sys
import os
import xlrd#----------------------------参数配置----------------------
#项目地址
project_path = '/Users/***/Desktop/Demo_ios/Demo'
#excel中sheetname的数组
excel_sheetNames = [
'Demo',
]# 在国际化文件中写的分隔符,需要保持一致
separator_chars = [
'<script/Demo/beginCoverage>',
]#说明: sheetname的个数与分隔符的个数需要保持一致,并且顺序一一对应
#----------------------------参数配置 end----------------------#打印
def print_debug(*argus):# print('***')print('-->', *argus)# 字符串中是否包含中文文字
def is_Chinese(world):isCh = Falsefor ch in world:if '\u4e00' <= ch <= '\u9fff':isCh = Truebreakreturn isCh#查找excel,返回路径
def findExcel(path=None):print_debug('开始查找Excel文件...')if path == None:path = "."# 1:以 ‘.’ 开头的是隐藏文件,剔除,否则读取会报错,2:必须是excelexcelList = [x for x in os.listdir('.') if x[0] != '.' and os.path.splitext(x)[1] == '.xlsx']if excelList != None:#从找到的excel数组中,返回第一个print_debug('找到Excel文件,name=', excelList[0])return excelList[0]# 读取excel内容--按照excel sheet_name
def readExcelDataBySheetName(filePath, sheetName=None):print_debug('开始读取excel= "%s",sheetName="%s"'%(filePath, sheetName))if filePath == None or sheetName == None:print_debug('参数异常!')returnwb = xlrd.open_workbook(filePath)sheet1 = wb.sheet_by_name(sheetName)col1_code = sheet1.col_values(3) # // 语言Key, 要注意第几列col2_cn = sheet1.col_values(4) # // 语言Value, 要注意第几列col3_ct = sheet1.col_values(5) # // 语言Value, 要注意第几列
#    col4_en = sheet1.col_values(6) # // 新语言Value, 要注意第几列shouldJumpFirstRow = is_Chinese(col1_code[0]) # // 第一行 标题去掉shouldJumpFirstRow = Trueif shouldJumpFirstRow:print_debug('warning: 第一行数据不合法,删除...', col1_code[0])col1_code.pop(0) # // 第一行 标题去掉col2_cn.pop(0) # // 第一行 标题去掉col3_ct.pop(0) # // 第一行 标题去掉
#        col4_en.pop(0) # // 第一行 标题去掉# 返回元组 (code, 简体中文, 繁体中文, 英文)col2_cn = transferIfNeedForValues(col2_cn) # // 语言Value, 要注意第几列col3_ct = transferIfNeedForValues(col3_ct) # // 语言Value, 要注意第几列
#    col4_en = transferIfNeedForValues(col4_en) # // 新语言Value, 要注意第几列print_debug('数据分析完成! sheetName=', sheetName)return (col1_code, col2_cn, col3_ct) # // 新语言注意
# 读取excel内容--按照excel sheet_index
def readExcelDataBySheetIndex(filePath, sheetIndex=None):print_debug('开始读取excel= "%s",sheetIndex="%s"'%(filePath, sheetIndex))if filePath == None or sheetIndex == None:print_debug('参数异常!')returnwb = xlrd.open_workbook(filePath)sheet1 = wb.sheet_by_index(sheetIndex)col1_code = sheet1.col_values(3) # // 语言key, 要注意第几列col2_cn = sheet1.col_values(4) # // 语言Value, 要注意第几列col3_ct = sheet1.col_values(5) # // 语言Value, 要注意第几列
#    col4_en = sheet1.col_values(6) // 新语言要注意shouldJumpFirstRow = is_Chinese(col1_code[0])shouldJumpFirstRow = Trueif shouldJumpFirstRow:print_debug('warning: 第一行数据不合法,删除...', col1_code[0])col1_code.pop(0)col2_cn.pop(0)col3_ct.pop(0)col4_en.pop(0)# 返回元组 (code, 简体中文, 繁体中文, 英文)col2_cn = transferIfNeedForValues(col2_cn)col3_ct = transferIfNeedForValues(col3_ct)
#    col4_en = transferIfNeedForValues(col4_en)  // 新语言要注意print_debug('数据分析完成! sheetIndex=', sheetIndex)return (col1_code, col2_cn, col3_ct) # // 新语言要注意#将内容写入指定的文件路径
def writeDataToFile(keys, values, destination_path):print_debug('开始准备写入数据...')if keys == None or values == None or len(keys) != len(values) or destination_path == None:return# if os.path.exists(destination_path) == False:#   os.mkdir(destination_path)print_debug('写入路径为:' + destination_path)resultMap = {}for x in range(0, len(keys)):if len(keys[x]) == 0 or len(values[x]) == 0:# 有key为空或者value为空串儿,跳过不计continueresultMap[keys[x]] = values[x]file_write(destination_path, resultMap)print_debug('数据写入完成!')#文件写入
def file_write(full_path, dic_data):if full_path == None:print_debug('error: 写入路径为空!')returnif os.path.exists(full_path):print_debug('删除旧的strings文件')os.remove(full_path)for key, value in dic_data.items():if len(key) == 0 or len(value) == 0:# 空字符串不写入,跳过continuetry:# value = transferIfNeed(value)content = '"{key}" = "{value}";'.format(key=key, value=value)open(full_path, 'a', encoding='utf-8').write('\n' + content)except Exception as e:print_debug('error: 写入出错!!!!!')print_debug(e)# 转义---单一字符串转义--如果包含了双引号 ' " '
def transferIfNeed(value):if r'"' in value:# 把字符串拆分了,一个一个的去比较allChars = [x for x in value]# print_debug('allChars.count = ', len(allChars))results = []for x in range(len(allChars)):sub = value[x]# 如果 " 存在,并且引号前一个字符它不是 \ , 则将 " 修改成 \"if sub == r'"':if x == 0:sub = r'\"'elif value[x - 1] != '\\':sub = r'\"'results.append(sub)tmp = ''# 把处理后的字符串,拼接起来for x in results:tmp += xif len(tmp) != len(value):print_debug('发现value 中包含未转义的引号: \n', value)value = tmpprint_debug('开始转义...结果:\n', value)return value# 转义- 对数组
def transferIfNeedForValues(values):results = []print_debug('对数组进行转义判断')if type(values) == list:for x in values:x = transferIfNeed(x)results.append(x)print_debug("数组转义完成")return results# 查找 Xcode 工程的项目文件地址
def findProjectPath():global project_pathif len(sys.argv) > 1:print_debug("开始查找国际化文件")return sys.argv[1]elif len(project_path) > 0:return project_path# 在xcode项目中查找指定类型的国际化文件的地址(通过国际化文件的子目录路径)
def findLocalizable(project_path, subpath):if project_path == None:print_debug('请提供xcode项目根路径')returnall_files = []all_files.append(project_path)result = Nonewhile len(all_files) > 0:path = all_files.pop(0)if os.path.isdir(path):for x in os.listdir(path):all_files.append(os.path.join(path, x))elif subpath in path and 'Localizable.strings' in path:result = pathprint_debug('找到国际化文件: ', result)return result# 覆盖更新国际化文件的内容
def coverDataPlus(lprojPath, splitOldDatas, newDataDic, curSepareCharIdx):if lprojPath == None or len(splitOldDatas) == 0 or len(newDataDic) == 0 or curSepareCharIdx == None or curSepareCharIdx + 1 >= len(splitOldDatas):print_debug("参数错误!")returnreplaceIdx = (curSepareCharIdx + 1)*2if replaceIdx <= 0:replaceIdx = 0newData = []for (key, value) in newDataDic.items():line = '"{key}" = "{value}";\n'.format(key= key, value= value)newData.append(line)if replaceIdx < len(splitOldDatas):splitOldDatas.pop(replaceIdx)splitOldDatas.insert(replaceIdx, newData)all_lines = []for lines in splitOldDatas:for line in lines:all_lines.append(line)try:file = open(lprojPath, 'w', encoding='utf-8')for line in all_lines:file.write(line)file.closeprint_debug('国际化文件修改完毕!')except Exception as e:print_debug('覆盖文件出现异常\n')print_debug(e)#将旧的xcode国际化文件内容读取,按照提供的分隔符,拆分成数组,分隔符单独占一个位置
def split_lproj(lprojPath,seperaChars=[]):if len(seperaChars) == 0:print_debug("参数错误!")returntry:file = open(lprojPath, 'r', encoding='utf-8')lines = file.readlines()file.close()oldData = []tmp = []line_pre = ''for line in lines:isMatch = Falsefor seperaChar in seperaChars:#空串的分隔符,咱直接跳过if len(seperaChar) == 0:continue#line 中匹配到分隔符if seperaChar in line:#分隔符单独做一个list保存seperaList = [line]if line_pre.startswith("//"):tmp.remove(line_pre)#保留分隔符及分隔符上面的注释语句seperaList = [line_pre, line]#匹配到分隔符后,将分隔符之前的数据及分隔符保存到数组if len(tmp) != 0:oldData.append(tmp)oldData.append(seperaList)tmp = []isMatch = Truebreakif isMatch:continuetmp.append(line)#这里记录一行为 '上一行'line_pre = lineoldData.append(tmp)print_debug('国际化文件分割完毕!')return oldData            except Exception as e:print_debug('国际化文件分割出现异常\n')print_debug(e)# 修改xcode工程国际化文件
def updateXcodeProj(dicts, lprojSubPaths, allSeperaChars, curSeperaCharIdx):if len(dicts) == 0 or len(lprojSubPaths) == 0 or len(allSeperaChars) == 0:print_debug("参数错误")returnif len(dicts) != len(lprojSubPaths) or curSeperaCharIdx >= len(allSeperaChars):print_debug("参数错误")returnproject_path = findProjectPath()print_debug('开始修改Xcode国际化文件, project_path: ', project_path)for x in range(len(dicts)):lproj_file_path = findLocalizable(project_path, lprojSubPaths[x])oldDatas = split_lproj(lproj_file_path, allSeperaChars)coverDataPlus(lproj_file_path, oldDatas, dicts[x], curSeperaCharIdx)# 将编码数组与中文简体 中文繁体 英文,转换成对应的字典数组
def transferColDataToList(col_code, col_cn, col_ct):if col_code == None or col_cn == None or col_ct == None:print_debug("参数错误")returnif len(col_code) == 0 or len(col_cn) == 0 or len(col_ct) == 0:print_debug("参数错误")returnif len(col_code) != len(col_cn) != len(col_ct):print_debug("参数错误")returncolmap_cn = {}colmap_ct = {}
#    colmap_en = {} // 新语言要注意for x in range(len(col_code)):colmap_cn[col_code[x]] = col_cn[x]colmap_ct[col_code[x]] = col_ct[x]
#        colmap_en[col_code[x]] = col_en[x] // 新语言要注意# 编号 中文简体 中文繁体 英文 // 新语言要注意return [colmap_cn, colmap_ct]def dealWithExcelData(excelFilePath, excelSheetNames=[], separetaChars=[]):if excelFilePath == None or len(excelSheetNames) != len(separetaChars) or len(separetaChars) == 0:print_debug('参数错误!!!')returnfor x in range(len(excelSheetNames)):sheetName = excelSheetNames[x]#3: 读取excel中的指定sheet的数据(col1_code,col1_cn,col1_ct) = readExcelDataBySheetName(excelFilePath, sheetName=sheetName)# 4:写入数据abspath_path = os.path.split(excelFilePath)[0]writeDataToFile(col1_code, col1_cn, os.path.join(abspath_path, sheetName+'_en.strings'))   # // 不同语言要注意writeDataToFile(col1_code, col1_ct, os.path.join(abspath_path, sheetName+'_zh-Hans.strings'))   # // 不同语言要注意
#        writeDataToFile(col1_code, col1_en, os.path.join(  // 新语言要注意
#            abspath_path, sheetName+'word_en.strings'))# 5: 将excel sheet1 和sheet2的数据读取处理 // 新语言要注意colmapList_sheet = transferColDataToList(col1_code, col1_cn, col1_ct)# 6: 修改xcode中的国际化文件  // 不同语言要注意  // 新语言要注意updateXcodeProj(dicts=colmapList_sheet, lprojSubPaths=['Supporting Files/en.lproj','Supporting Files/zh-Hans.lproj'], allSeperaChars=separetaChars, curSeperaCharIdx=x)def main():print_debug("脚本开始执行...")#1: 文件路径=当前脚本文件的路径abspath_path = os.path.abspath('.')#2: 查找到excel的文件路径excelFilePath = findExcel(abspath_path)#3: 读取excel中的指定sheet的数据global excel_sheetNamesglobal separator_charsdealWithExcelData(excelFilePath, excel_sheetNames, separator_chars)print_debug('执行完毕, done!')# 开始
main()


喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

IOS 国际化词条 Python3 脚本

一、词条处理脚本---使用教程 (1)环境篇 1: 该脚本基于python3 环境&#xff0c;请确保你的mac 安装了python3 2: 包依赖&#xff0c;请在python3环境下安装 xlrd; pip3 install xlrd(2)使用篇 1: 桌面创建一个文件夹, 例如 wordEntry,将该脚本文件与下载的最新的 ’词条.xlsx‘…...

uniapp 支付宝小程序自定义 navbar 无效解决方案

如图&#xff1a; uniapp编译到支付宝小程序隐藏默认的导航栏失效了 解决方案&#xff1a; 在 pages.json 文件中找到 globalStyle 中加入以下代码&#xff1a; "mp-alipay": {"transparentTitle": "always","titlePenetrate":…...

uni-app - 微信小程序中,使用 navigateTo 传递非常大的数字传参精度丢失的问题

文章目录 🍉原因分析:JavaScript 数值精度限制🍉常用解决方法🍉代码示例🍉官方推荐与最佳实践🍉微信小程序环境注意事项🍉原因分析:JavaScript 数值精度限制 微信小程序(uni-app)中,参数是通过 URL 查询字符串传递的,其本质上仍由 JavaScript 进行处理。Jav…...

通信施工安全员B证适合哪些人考

通信施工安全员B证适合人群分析 一、适用岗位范围 通信工程施工人员 从事基站建设、光缆布放、管道施工等现场作业的技术工人 5G网络建设、室内分布系统安装等新型基础设施建设人员 项目管理岗位 通信工程项目经理、技术负责人 施工队长、班组长等现场管理人员 专职安全…...

vue3使用<el-date-picker分别设置开始时间和结束时间时,设置开始时间晚于当前时间,开始时间早于结束时间,结束时间晚于开始时间

vue3使用<el-date-picker分别设置开始时间和结束时间时&#xff0c;设置开始时间晚于当前时间&#xff0c;开始时间早于结束时间&#xff0c;结束时间晚于开始时间 为避免出现填写结束事件后再次修改开始时间&#xff0c;导致开始时间晚于结束时间&#xff0c;添加 change“…...

移远通信LG69T赋能零跑B10:高精度定位护航,共赴汽车智联未来

当前&#xff0c;汽车行业正以前所未有的速度迈向智能化时代&#xff0c;组合辅助驾驶技术已然成为车厂突出重围的关键所在。高精度定位技术作为实现车辆精准感知与高效协同的基石&#xff0c;其重要性日益凸显。 作为全球领先的物联网及车联网整体解决方案供应商&#xff0c;移…...

HTML应用指南:利用POST请求获取全国达美乐门店位置信息

达美乐比萨作为全球知名的披萨连锁品牌&#xff0c;自1960年创立以来&#xff0c;始终致力于为消费者提供高品质、快速配送的披萨体验。在中国市场&#xff0c;达美乐凭借其“30分钟必达”的承诺和经典美式风味&#xff0c;逐渐赢得了广大消费者的青睐。品牌通过不断拓展门店网…...

进程优先级以及切换调度

目录 进程优先级 基本概念 实操理解 优先级操作 竞争&#xff0c;独立&#xff0c;并行&#xff0c;并发 进程切换 寄存器 讲切换 linux进程调度算法 进程优先级 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优…...

揭开应用程序的神秘面纱:深入了解 AWS X-Ray

1.AWS X-Ray 概述&#xff1a; AWS X-Ray 是一项服务&#xff0c;它收集应用程序所处理请求的数据&#xff0c;并提供一些工具供您查看、筛选和深入了解这些数据&#xff0c;从而发现问题和优化机会。您不仅可以查看请求和响应的详细信息&#xff0c;还可以查看应用程序对下游…...

元宇宙2.0:当区块链成为数字世界的宪法

引言&#xff1a;当虚拟世界成为“新大陆” 清晨&#xff0c;你戴上VR设备进入一个由数字建筑构成的城市&#xff0c;这里的地皮属于全球玩家&#xff0c;街边的艺术品标着NFT认证码&#xff0c;咖啡馆里的人们用加密货币支付咖啡&#xff0c;而社区规则由持有代币的居民投票决…...

JVM调优实战(JVM Tuning Pactice)

JVM调优实战 JVM调优 JVM调优是指对Java虚拟机进行性能优化的实际应用。 JVM调优实战主要是通过优化JVM的内存管理、垃圾回收、线程管理、类加载、编译器等方面来提高Java应用程序的性能和稳定性。 JVM调优步骤 JVM调优实战通常需要经过以下步骤&#xff1a; 1.监控GC的状…...

网络原理 - 11(HTTP/HTTPS - 2 - 请求)

目录 HTTP 请求&#xff08;Request&#xff09; 认识 URL URL 基本格式 关于 URL encode 认识方法&#xff08;method&#xff09; 1. GET 方法 2. POST 方法 认识请求“报头”&#xff08;header&#xff09; Host Content-Length Content-Type User-Agent&…...

百度CarLife实现手机车机无缝互联

百度CarLife是百度推出的智能车联网解决方案&#xff0c;通过手机与车机互联技术&#xff0c;为用户提供安全便捷的车载互联网服务体验。 CarLife 实现手机与车机屏幕的无缝互联&#xff0c;让应用内容同步至车载系统&#xff0c;减少驾驶过程中操作手机的频率&#xff0c;提升…...

初识Redis · 缓存

目录 前言&#xff1a; 引入缓存 缓存更新策略 定期生成 实时生成 缓存注意事项 缓存预热 缓存穿透 缓存雪崩 缓存击穿 前言&#xff1a; 我们在Redis的学习中&#xff0c;逐渐了解到了Redis的用途是可以用来当作内存数据库&#xff0c;缓存&#xff0c;消息队列等&…...

Redis性能优化终极指南:从原理到实战的深度调优策略

一、内存优化&#xff1a;构建高效存储体系 1.1 三级过期键管理机制 Redis通过组合策略实现精准的内存回收&#xff1a; 定时删除&#xff08;主动淘汰&#xff09; 创建定时器在键到期时立即删除 优点&#xff1a;及时释放内存 缺点&#xff1a;高CPU消耗&#xff08;每个…...

哈希表笔记(一 )

设计思路 核心功能和 API 设计 (Core Functionality & API Design): 基本操作: 必须提供核心的 put(key, value)&#xff08;添加或更新键值对&#xff09;、get(key)&#xff08;根据键获取值&#xff09;、remove(key)&#xff08;根据键删除键值对&#xff09;、contain…...

c网络库libevent的http常用函数的使用(附带源码)

Libevent HTTP 核心函数详解与实战 核心概念HTTP 服务器端常用函数1. 初始化与绑定2. 设置请求处理回调3. 在回调函数中处理请求4. 发送响应5. 启动与停止6. 清理资源 HTTP 客户端常用函数1. 初始化2. 创建连接3. 创建并发送请求4. 在回调函数中处理响应5. 启动事件循环与清理 …...

java练习3

随机生成20个数字&#xff08;随机种子&#xff09; 分别使用冒泡排序、二叉树排序、插入排序进行排序 并输出最终结果以及三种排序使用的时间 package a01_第一次练习.a03_排序;import java.time.Duration; import java.time.LocalDateTime; import java.util.TreeSet;publi…...

当 AI 成为 “数字新物种”:人类职业的重构与进化

一、AI 的 “替代清单”&#xff1a;从流水线到办公室的全面侵袭 在深圳某智能工厂&#xff0c;机械臂正以 0.01 毫米的精度完成手机组装&#xff0c;100 台机器人 24 小时运转&#xff0c;替代了 3000 名工人。这种场景正在全球制造业蔓延 —— 麦肯锡预测&#xff0c;到 203…...

HarmonyOS ArkUI交互事件与手势处理全解析:从基础到高级实践

文章目录 一、交互事件1.1 通用事件1.1.1 事件分发1.1.1.1 触摸测试1. 触摸测试基本流程2. 触摸测试控制3. 自定义事件拦截4. 禁用控制5. 触摸热区设置6. 安全组件 1.1.1.2 事件响应链收集 1.1.2 触屏事件1.1.3 键鼠事件1.1.3.1 鼠标事件1.1.3.2 按键事件 1.1.4 焦点事件1.1.5 …...

【计算机网络】面试常考——GET 和 POST 的区别

GET 和 POST 的区别 GET 和 POST 是 HTTP 协议中最常用的两种请求方法&#xff0c;它们的主要区别体现在 用途、数据传输方式、安全性、缓存机制 等方面。以下是详细对比&#xff1a; 1. 用途 GET POST 主要用于 获取数据&#xff08;如查询、搜索&#xff09;。 主要用于 提…...

AI编程工具“幻觉”风险与飞算JavaAl的破局之道

近年来&#xff0c;AI编程辅助工具迅速崛起&#xff0c;极大地提升了开发者的工作效率。然而&#xff0c;这些工具普遍存在一个被称为“幻觉”(hallucination)的风险——AI可能会生成看似合理但实际错误、不安全或低效的代码。这种现象在复杂业务逻辑和特定领域开发中尤为明显&…...

【Python零基础入门系列】第1篇:Python 是什么?怎么装环境?推荐哪些 IDE?

各位网友们,欢迎来到我的 Python 学习专栏! 前两天看到新闻英伟达为 CUDA 添加原生 Python 支持,意味着开发者可直接用 Python 操作 GPU,加速 AI 和高性能计算,降低门槛,让 Python 的应用范围更广、能力更强。 一直想写一系列文章教知友们从零开始学会 Python 编程,目…...

VPN访问SAP组服务器报登陆负载均衡错误88:无法连接到消息服务器(RC=9)

用户反馈用SAPGUI接入SAP时报错&#xff1a;登陆负载均衡错误88&#xff1a;无法连接到消息服务器(RC9) 经了解是通过VPN访问&#xff0c;但VPN没有放行ICMP访问&#xff0c;导致不能PING通&#xff0c;不能确认是网络问题还是什么问题。 解决方案&#xff1a; 1、VPN由原&am…...

Linux查看程序端口占用情况

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; 核心问题&#xff1a; Tomcat 8080端口启动失败&#xff0c;提示端口被占用&#xff0c;但常规检查未发现Tomcat进程占用该端口。 关键排查步骤&#xff1a; 初步检查 使用 ps -aux | gre…...

[C]基础14.字符函数和字符串函数

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、字符分类、转换函数2、strlen的使用和模拟实现2.1 strlen的使用2.2 strlen的模拟实现 3、strcpy的使用和模拟实现3.1 strcpy的使用3.2 strcpy的模拟实现 4、strcat…...

三种机器学习类型

本文讲介绍三种机器学习类型&#xff1a;①监督学习&#xff0c;②无监督学习&#xff0c;③强化学习。我们主要了解监督学习和无监督学习即可。 下图介绍这三种机器学习类型的区别&#xff1a; 1 用来预测未来的监督学习 从有标签的训练数据中学习一个模型&#xff0c;用来…...

UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别

在 Unreal Engine 的蓝图里&#xff0c;SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三个节点虽然都能改变物体位置&#xff0c;但作用对象和坐标空间&#xff08;Coordinate Space&#xff09;不同&#xff1a; 1. SetActorLocation 作用对象&#xff1a;整个…...

Glide 如何加载远程 Base64 图片

最近有个需求&#xff0c;后端给出的图片地址并不是正常的 URL&#xff0c;而且需要一个接口去请求&#xff0c;但是返回的是 base64 数据流。这里不关心为啥要这么多&#xff0c;原因有很多&#xff0c;可能是系统的问题&#xff0c;也可能是能力问题。当然作为我们 Android 程…...

JVM对象存储格式

引言 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;对象的内存布局是一个重要的底层概念&#xff0c;它直接影响对象在内存中的存储方式和占用空间。了解对象存储格式不仅有助于优化程序性能&#xff0c;还能帮助我们更好地理解JVM的工作原理。本文将详细探讨对象存…...

3D Gaussian Splatting部分原理介绍和CUDA代码解读

本系列旨在帮助无CUDA代码经验的读者、以及3DGS的初学者理解代码逻辑。 3D GS论文原文链接&#xff1a;https://arxiv.org/abs/2308.04079 论文笔记链接&#xff1a;【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering 【论文笔记】A Survey on 3D Ga…...

日本IT行业|salesforce开发语言占据的地位

在日本的IT行业中&#xff0c;Salesforce 开发语言处于一个较为专业但稳步增长的细分领域&#xff0c;并不是主流开发语言&#xff08;如 Java、Python、PHP&#xff09;&#xff0c;但其在某些行业和场景中地位越来越重要。 本篇以下是详细分析&#xff1a; Salesforce开发语言…...

1.1 点云数据获取方式——引言

图1-1-1点云建筑场景图 点云数据是指能够描述外部场景、对象表面的三维空间位置&#xff0c;并具有相关属性的点集&#xff0c;其每个离散点通常包括三维空间位置&#xff08;x,y,z&#xff09;以及强度、颜色等属性信息。大量分布的离散点集能够清晰而直接地描绘场景、对象的3…...

接入层架构演变

1、单体架构 请求过程 浏览器的请求通过 DNS Server 解析到指定的 IP 地址&#xff0c;浏览器通过 IP 地址访问 Web Server 缺点 当到达 Web Server 的性能瓶颈时&#xff08;瓶颈受到CPU&#xff0c;内存&#xff0c;io&#xff0c;带宽影响&#xff09;&#xff0c;无法进…...

python:sklearn 主成分分析(PCA)

参考书&#xff1a;《统计学习方法》第2版 第16章 主成分分析&#xff08;PCA&#xff09;示例 编写 test_pca_1.py 如下 # -*- coding: utf-8 -*- """ 主成分分析&#xff08;PCA&#xff09; """ import matplotlib.pyplot as plt from skl…...

力扣-数据结构-二叉树

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#x…...

嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案

一、背景 在数字化浪潮席卷全球的今天&#xff0c;实时音视频通信技术已经成为众多领域不可或缺的重要组成部分。从智能家居到智能安防&#xff0c;从在线教育到远程医疗&#xff0c;人们对于高效、便捷、稳定且低延迟的音视频通信解决方案的需求日益迫切。而EasyRTC作为一款卓…...

AI 的未来是开源?DeepSeek 正在书写新篇章!

AI 的未来是开源&#xff1f;DeepSeek 正在书写新篇章&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;越来越多的企业和研究机构开始关注 AI 的开放性和透明度。开源不仅能够促进技术创新&#xff0c;还能加速知识的传播和应用。在这个背景下…...

抢先体验全新极小大模型Qwen3:0.6B

全民都在期待DeepSeek-R2的发布,但是一不小心被阿里截胡了,2025 年 4 月 29 日,阿里巴巴发布并开源了通义千问 Qwen3 系列大模型。据 大模型镜像网站 上关于Qwen3的介绍: Qwen3 是 Qwen 系列中最新一代的大型语言模型,提供一整套密集模型和混合专家 (MoE) 模型。Qwen3 基…...

部署一个自己的Spring Ai 服务(deepseek/通义千问)

Spring Boot 无缝接入 DeepSeek 和通义千问请求日志记录及其ip黑白名单 SpringBoot版本 3.2.0 JDK 版本为17 redis 3.2.0 mybatis 3.0.3 依赖引入 关键依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-sp…...

第一讲 | 算法复杂度

算法复杂度 一、数据结构前言1、数据结构&#xff08;DS&#xff09;2、算法&#xff08;Algorithm&#xff09; 二、算法效率1、复杂度的概念 三、时间复杂度&#xff08;1&#xff09;、案例&#xff08;2&#xff09;、大O的渐进表示法&#xff08;3&#xff09;、时间复杂度…...

【运维】还原 Docker 启动命令的利器:runlike 与 docker-autocompose

&#x1f50d; 还原 Docker 启动命令的利器&#xff1a;runlike 与 docker-autocompose 实用教程 在日常使用 Docker 时&#xff0c;我们常常通过 docker run 启动容器&#xff0c;但有时候过了一段时间就忘记了当初使用的具体参数&#xff08;端口、挂载、环境变量等&#xf…...

IP属地是实时位置还是自己设置

刷微博、抖音时&#xff0c;评论区总能看到“IP属地”&#xff1f;这个突然冒出来的小标签&#xff0c;让不少网友摸不着头脑&#xff1a;‌IP属地是实时位置&#xff0c;还是可以自己设置&#xff1f;‌别急&#xff0c;今天咱们就来聊聊这个话题&#xff01; 1、什么是IP属地…...

Android WIFI体系

先说说WifiLock、MulticastLock 、IWificond WifiLock 允许应用强制保持 WiFi 活跃&#xff0c;即便设备处于休眠状态。如WIFI_MODE_FULL_HIGH_PERF&#xff1a;保持高性能 WiFi 活跃状态&#xff0c;适用于高带宽需求&#xff0c;如视频通话、流媒体。经测试有的场景能减少10…...

什么是静态住宅ip,跨境电商为什么要用静态住宅ip

在数字时代&#xff0c;IP地址不仅是设备联网的“ID”&#xff0c;更是跨境电商运营中的关键工具。尤其对于需要长期稳定、安全操作的场景&#xff0c;静态住宅IP逐渐成为行业首选。 一、什么是静态住宅IP&#xff1f; 静态住宅IP&#xff08;Static Residential IP&#xff0…...

常见位运算总结

目录 常见位运算总结 191:位1的个数 338&#xff1a;比特位计数 461:汉明距离 136&#xff1a;只出现一次的数字 260&#xff1a;只出现一次的数字III 常见位运算总结 191:位1的个数 链接&#xff1a;191. 位1的个数 - 力扣&#xff08;LeetCode&#xff09; class Sol…...

[密码学实战]SDF之对称运算类函数(四)

[密码学实战]SDF之对称运算类函数(四) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-1jptduZFNFiRZ2lS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...

【C++编程入门】:基本语法

上一篇提到了C关键字和缺省参数以及命名空间域&#xff0c;这篇继续分享C入门语法&#xff0c;把基本语法掌握扎实后面学习更才能更轻松一些。 目录 引用 引用的特性 常引用 内联函数 auto关键字 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&am…...

区块链最佳框架:Truffle vs Hardhat vs Brownie

区块链技术的快速发展使得智能合约开发成为主流&#xff0c;而选择合适的开发框架是提升效率的关键。目前&#xff0c;Truffle、Hardhat和Brownie是三大主流框架&#xff0c;它们各有特点&#xff0c;适用于不同的开发场景和开发者偏好。本文将从功能、生态系统、适用人群等角度…...

Apache Flink的架构设计与运行流程说明

在大数据领域&#xff0c;实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控&#xff0c;从物联网设备的实时告警到社交平台的热点追踪&#xff0c;企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…...