Kitty CLI工具集:基于场景与剧本的终端自动化实践

news2026/5/10 6:58:16
1. 项目概述一个面向开发者的现代化终端工具集如果你和我一样每天的工作都离不开终端那你一定对“效率”这个词有切肤之痛。从SSH连接到服务器到管理本地多个项目环境再到执行复杂的命令行操作一个趁手的终端工具就是程序员的“瑞士军刀”。今天要聊的这个项目Andezion/Kitty就是一把试图重新定义“趁手”的军刀。它不是我们熟知的kitty终端模拟器而是一个由社区开发者Andezion维护的、基于Go语言编写的命令行工具集合CLI Toolkit。它的核心目标很明确将开发者日常高频、琐碎、重复的终端操作封装成简单、一致、可组合的命令从而大幅提升命令行环境下的工作效率和体验。我第一次接触它是因为被一个简单的需求困住了我需要频繁地在不同主机的多个目录间跳转并执行相似的命令序列。手动输入ssh、cd、执行命令、再退出这套流程一天重复几十次不仅枯燥还容易出错。当时就在想有没有一种方法能把这一连串动作“打包”成一个简单的指令Kitty的出现正好击中了这个痛点。它通过“场景”Scenes和“剧本”Playbooks的概念把复杂的操作流程剧本化、自动化。你可以把它理解为一个为命令行环境设计的“自动化工作流引擎”或“高阶别名系统”但它的能力远不止于此。这个项目适合所有需要在命令行下讨生活的开发者、运维工程师和系统管理员。无论你是要管理云服务器集群、部署微服务还是进行本地开发调试Kitty提供的那套抽象和工具链都能让你从重复劳动中解放出来把精力集中在更有价值的事情上。接下来我们就深入拆解一下这个工具集是如何构思的以及如何把它用到你的日常工作流中。2. 核心设计哲学与架构解析2.1 为什么是“场景”与“剧本”Kitty最核心的设计思想来源于对复杂运维和开发工作流的抽象。传统的Shell脚本或Alias虽然能解决一部分问题但在处理多主机、多步骤、有条件判断的复杂场景时往往显得力不从心脚本会变得冗长且难以维护。Kitty引入了两个关键概念场景Scene 一个场景定义了一个具体的操作环境或目标。例如“部署后端服务到生产环境”、“从所有测试服务器拉取日志”、“初始化本地开发环境”。一个场景包含了执行任务所需的所有上下文信息比如目标主机列表、工作目录、环境变量等。你可以把它看作一个预设好的“舞台”。剧本Playbook 剧本则定义了在某个“场景”下要执行的一系列“动作”Actions。这些动作可以是执行Shell命令、上传/下载文件、条件判断、循环遍历等。剧本使用YAML格式编写结构清晰可读性强类似于Ansible的Playbook但更轻量、更专注于个人或小团队的终端操作自动化。这种设计的优势在于关注点分离和可复用性。我将“在哪里做”场景和“做什么”剧本分开。同一个部署剧本我可以轻松地应用到“预发布”和“生产”两个不同的场景只需切换场景配置而无需修改剧本逻辑。这极大地提升了配置的复用度和维护性。2.2 架构概览轻量级与可扩展性Kitty采用典型的Go语言CLI工具架构追求的是单二进制文件的部署便利性和执行效率。其核心架构可以分为三层核心引擎层 这是Kitty的大脑负责解析场景配置scene.yaml和剧本文件*.playbook.yaml。它内置了一个小型的解释器能够按顺序执行剧本中定义的动作并处理动作之间的依赖和流程控制如条件、循环。引擎还管理着连接池对于需要连接远程主机的场景它会高效地复用SSH连接避免频繁握手带来的开销。动作插件层 这是Kitty的四肢。所有具体的操作如shell、copy、sync、prompt等都以“动作”的形式实现。Kitty本身提供了一系列内置动作覆盖了大部分常用操作。更强大的是其插件系统允许用户用Go语言编写自定义动作。这意味着如果内置动作无法满足你的特殊需求比如与内部API交互、解析特定格式的报表你可以自行扩展无缝集成到Kitty的工作流中。这种设计保证了工具的生命力和适应性。配置与状态管理层Kitty使用YAML作为配置语言这是当前基础设施即代码IaC领域的事实标准学习成本低可读性好。场景配置和剧本文件通常存放在项目目录或用户全局配置目录下。Kitty还维护一个轻量级的本地状态用于记录上次执行的结果、缓存某些信息以便在后续执行中实现增量操作或状态判断。注意Kitty并非要取代Ansible、Terraform等专业的配置管理工具。它的定位是个人或小团队的本地终端操作增强工具侧重于交互式、半自动化的场景以及那些尚未复杂到需要引入全套IaC工具链的日常任务。它填补了简单Shell脚本和重型运维工具之间的空白。3. 从零开始安装与基础配置3.1 多种安装方式选择Kitty作为Go语言项目提供了多种便捷的安装方式。最推荐的是通过包管理器其次是下载预编译的二进制文件。1. 使用Go Install适合Go开发者如果你本地已经安装了Go开发环境≥1.16这是最直接的方式go install github.com/Andezion/kittylatest安装后二进制文件通常位于$GOPATH/bin或$GOBIN目录下请确保该目录已在你的PATH环境变量中。2. 下载预编译二进制文件最通用访问项目的GitHub Releases页面根据你的操作系统和架构如linux-amd64,darwin-arm64下载对应的压缩包。解压后将可执行文件kitty或kitty.exe移动到系统路径下例如/usr/local/binLinux/macOS或添加到PATHWindows。# 以Linux x86_64为例 wget https://github.com/Andezion/kitty/releases/latest/download/kitty_linux_amd64.tar.gz tar -xzf kitty_linux_amd64.tar.gz sudo mv kitty /usr/local/bin/ kitty --version # 验证安装3. 使用包管理器对于macOS用户如果安装了Homebrew可以通过Tap安装brew tap Andezion/tap brew install kitty其他平台的包管理器支持需要查看项目文档是否提供了相应的安装源。3.2 初始化你的第一个工作区安装完成后我们首先进行初始化创建一个Kitty的工作区。工作区是一个目录用于存放你的场景配置、剧本文件以及Kitty的全局配置。# 创建一个目录作为你的Kitty工作区 mkdir -p ~/my-kitty-workspace cd ~/my-kitty-workspace # 初始化Kitty配置 kitty init执行kitty init命令后会在当前目录下生成一个.kitty的隐藏文件夹里面包含默认的配置文件config.yaml。同时它也会建议你创建scenes和playbooks两个子目录来分别管理场景和剧本这是一种值得遵循的最佳实践。关键配置文件解读 生成的config.yaml是Kitty的全局配置文件内容通常如下# .kitty/config.yaml # Kitty全局配置 # 默认的场景文件目录 scenes_dir: ./scenes # 默认的剧本文件目录 playbooks_dir: ./playbooks # 日志级别: debug, info, warn, error log_level: info # SSH连接默认选项 ssh: user: # 默认SSH用户可在场景中覆盖 port: 22 # 私钥路径默认为 ~/.ssh/id_rsa identity_file: ~/.ssh/id_rsa # SSH连接超时时间秒 timeout: 30你可以根据你的习惯修改这些默认值。例如如果你的服务器默认使用不同的SSH端口或密钥可以在这里统一设置避免在每个场景中重复配置。4. 核心功能深度实操场景与剧本4.1 定义你的第一个场景管理Web服务器场景文件定义了“舞台”。让我们创建一个用于管理一组Web服务器的场景。在~/my-kitty-workspace/scenes/目录下创建文件web-servers.yaml# scenes/web-servers.yaml name: production-web # 场景名称 description: 生产环境Web服务器集群 # 定义主机清单 hosts: - name: web-01 address: 192.168.1.101 ssh_user: deploy # 覆盖全局配置的用户名 labels: [primary, nginx] - name: web-02 address: web02.example.com # 支持域名 ssh_user: deploy labels: [secondary, nginx] - name: web-03 address: 192.168.1.103 ssh_user: deploy labels: [secondary, apache] # 场景级别的默认变量 vars: app_directory: /var/www/myapp log_directory: /var/log/myapp # 连接后默认执行的工作目录可选 # work_dir: {{ .app_directory }}在这个场景中我们定义了三个主机并为它们打上了labels标签。标签是一个非常有用的功能它允许你在剧本中通过标签来选择性地对一部分主机执行操作而不是全部。例如你可以只对标签为primary的主机执行关键配置变更。4.2 编写第一个剧本检查服务器状态剧本文件定义了“剧情”。我们来编写一个简单的剧本来检查这些Web服务器的基本状态。在~/my-kitty-workspace/playbooks/目录下创建文件check-status.playbook.yaml# playbooks/check-status.playbook.yaml name: 检查服务器状态 description: 检查目标服务器的系统负载、磁盘空间和关键服务状态。 # 剧本可以接受输入参数 params: - name: check_service description: 需要检查的服务名 default: nginx required: false # 定义动作序列 actions: - name: 显示检查开始信息 action: echo args: message: 开始对场景 {{ .SCENE.name }} 中的主机进行状态检查... - name: 获取系统负载 action: shell args: cmd: uptime # 此动作将在所有主机上并行执行 parallel: true - name: 检查磁盘使用情况 action: shell args: cmd: df -h / # 检查根分区 parallel: true - name: 检查指定服务状态 action: shell args: cmd: systemctl is-active {{ .params.check_service }} || echo 服务未安装或未运行 # 使用标签过滤器只对带有‘nginx’或‘apache’标签的主机执行 hosts_filter: labels contains nginx or labels contains apache parallel: true - name: 汇总报告 action: echo args: message: 状态检查完成。请查看上方各主机的输出。这个剧本展示了几个关键特性参数化通过params定义了一个可选参数check_service默认值为nginx。这使得剧本更加灵活。动作类型使用了echo本地打印信息和shell在远程主机执行命令两种动作。并行执行对于shell动作设置了parallel: trueKitty会并发地在所有目标主机上执行该命令这对于批量操作来说效率提升巨大。主机过滤器在“检查指定服务状态”动作中使用了hosts_filter通过Go模板语法来筛选主机。这里只对标签包含nginx或apache的主机执行web-01和web-02会执行而web-03如果标签不匹配则会跳过此步骤。4.3 执行你的自动化工作流现在将场景和剧本结合起来执行。回到工作区根目录~/my-kitty-workspace运行以下命令# 基本执行使用 production-web 场景运行 check-status 剧本 kitty run -s production-web -p check-status # 执行并传递参数检查 apache 服务 kitty run -s production-web -p check-status --params check_serviceapache # 更精细的控制只对标签为 primary 的主机运行剧本 kitty run -s production-web -p check-status --hosts-filter labels contains primary执行时Kitty会首先加载production-web场景获取主机列表和变量。然后加载check-status剧本按顺序执行其中的每一个动作。对于需要远程执行的动作它会建立SSH连接或复用连接池中的连接执行命令并将输出实时地、按主机分块显示在终端上结果清晰易读。实操心得输出与日志默认情况下Kitty会将每个主机上每个动作的输出直接打印到终端并用明显的分隔符和主机名进行区分这对于实时监控非常友好。如果你需要将输出保存到文件进行后续分析可以使用--output或--log-file参数。对于复杂的剧本建议在开发调试阶段将日志级别设置为debug可以看到Kitty内部详细的决策和执行过程。5. 高级特性与实战应用5.1 变量与模板引擎让配置动态化Kitty内置了强大的模板引擎基于Gotext/template允许你在场景和剧本中使用动态变量这是实现配置复用的关键。变量可以来自多个地方优先级从高到低动作运行时参数在shell动作的cmd中通过{{ .params.xxx }}引用。主机变量在场景的主机定义中设置。场景变量在场景的vars部分定义。全局变量在.kitty/config.yaml中定义。内置变量如{{ .SCENE.name }}当前场景名、{{ .HOST.name }}当前主机名。实战案例动态部署不同版本的应用假设你有一个部署剧本需要将指定版本的应用包部署到服务器。首先在场景中定义应用目录和备份目录# scene: deploy-scene.yaml vars: app_install_dir: /opt/myapp app_backup_dir: /opt/myapp_backups然后在部署剧本中使用参数化版本号并利用变量构建动态路径# playbook: deploy.playbook.yaml params: - name: app_version required: true actions: - name: 备份当前版本 action: shell args: cmd: | # 使用场景变量和参数 BACKUP_PATH{{ .vars.app_backup_dir }}/myapp-$(date %Y%m%d%H%M%S).tar.gz tar -czf $BACKUP_PATH -C {{ .vars.app_install_dir }} . echo 备份已创建: $BACKUP_PATH - name: 下载指定版本应用包 action: shell args: cmd: | wget -O /tmp/myapp-{{ .params.app_version }}.tar.gz \ https://repo.example.com/myapp/{{ .params.app_version }}/myapp.tar.gz - name: 解压并部署 action: shell args: cmd: | tar -xzf /tmp/myapp-{{ .params.app_version }}.tar.gz -C {{ .vars.app_install_dir }} --strip-components1 chown -R appuser:appgroup {{ .vars.app_install_dir }}执行时只需指定版本号kitty run -s deploy-scene -p deploy --params app_versionv1.2.3。剧本会自动将变量替换为具体的路径和版本实现了一次编写多处部署。5.2 条件判断与循环实现复杂逻辑Kitty的剧本支持条件判断if和循环range使得编写复杂的运维逻辑成为可能。条件判断示例根据操作系统类型执行不同命令actions: - name: 检测并安装依赖 action: shell args: cmd: | # 通过判断文件存在性来识别系统 if [ -f /etc/redhat-release ]; then sudo yum install -y python3 git elif [ -f /etc/debian_version ]; then sudo apt-get update sudo apt-get install -y python3 git else echo Unsupported OS 2 exit 1 fi虽然这个逻辑写在了单个shell命令里但Kitty的动作本身也支持if条件。更优雅的方式是利用Kitty的facts收集动作如果实现的话先收集系统信息存为变量然后在后续动作的when条件中使用。目前版本若未内置facts动作上述Shell脚本方式是最直接的。循环示例遍历列表执行操作假设你在场景变量中定义了一个需要创建的目录列表# scene vars vars: directories_to_create: - /data/logs - /data/cache - /opt/app/config在剧本中你可以使用range循环来创建它们actions: - name: 创建应用目录结构 action: shell # 注意这里需要在动作级别实现循环通常意味着需要编写一个能处理列表参数的shell脚本。 # 更理想的方式是Kitty支持原生的‘loop’属性类似Ansible。 # 如果原生不支持一种变通方法是使用‘template’动作生成一个临时脚本然后执行。 args: cmd: | {{- range $dir : .vars.directories_to_create }} sudo mkdir -p {{ $dir }} sudo chown appuser:appgroup {{ $dir }} {{- end }}重要提示 当前Andezion/Kitty项目的具体语法和支持的动作属性需要查阅其最新官方文档。条件判断和循环的实现方式可能通过动作的when条件、专用的loop属性或者依靠Shell脚本本身的逻辑来完成。上述示例展示了这种需求的思想具体语法请以项目文档为准。5.3 文件传输与同步告别SCP和RSYNC命令除了执行命令文件管理也是日常运维的重头戏。Kitty内置了copy和sync动作比手动使用scp或rsync命令更直观并能集成到自动化流程中。copy动作精确复制文件- name: 上传配置文件 action: copy args: src: ./local/config/app.conf.j2 # 本地路径可以是文件或目录 dest: {{ .vars.app_install_dir }}/config/app.conf # 远程目标路径 # 可选使用模板引擎渲染后再上传如果src是模板文件 template: true # 可选只在目标文件不存在时复制 # mode: createcopy动作适合传输单个或少量明确指定的文件。sync动作目录同步- name: 同步静态资源目录 action: sync args: src: ./local/static/ # 本地目录 dest: {{ .vars.app_install_dir }}/static/ # 远程目录 # 同步选项删除远程端多余文件排除某些文件 delete: true exclude: - *.tmp - .git/sync动作类似于rsync -avz --delete它会确保远程目录的内容与本地目录完全一致是部署前端资源或同步代码的利器。delete和exclude参数让你能精细控制同步行为。6. 插件系统扩展你的Kitty能力边界当内置动作无法满足你的需求时Kitty的插件系统就派上了用场。你可以用Go语言编写自定义动作。开发一个自定义动作的简要步骤创建插件项目 创建一个新的Go模块例如my-kitty-action。实现Action接口 导入Kitty的SDK包实现Action接口该接口通常包含Name(),Description(),Execute()等方法。定义参数结构 定义一个结构体来接收剧本中传入的args。编译为插件 将代码编译为一个共享库.so文件或可执行文件具体格式取决于Kitty插件加载的约定。注册并使用 将插件放入Kitty的插件目录或在配置文件中指定插件路径。之后你就可以在剧本中使用action: your-custom-action-name了。实战设想一个“发送通知到钉钉/飞书”的动作假设我们编写一个名为webhook的插件。剧本中可以这样使用- name: 通知部署开始 action: webhook args: url: https://your-webhook-url message: 场景【{{ .SCENE.name }}】的部署任务已开始。 level: info - name: 部署后通知结果 action: webhook args: url: https://your-webhook-url message: | 部署任务完成。 场景{{ .SCENE.name }} 状态{{ .ACTION_RESULT.status }} {{- if .ACTION_RESULT.error }} 错误信息{{ .ACTION_RESULT.error }} {{- end }} level: {{ if .ACTION_RESULT.error }}error{{ else }}success{{ end }} # 此动作仅在之前的‘deploy’动作执行后才运行 # depends_on: [deploy]这样你的自动化流程就能与外部协作系统打通实现真正的闭环。7. 工程化实践项目管理与团队协作当个人使用转向小团队协同时如何管理好Kitty的配置和剧本就变得重要了。1. 目录结构标准化建议采用清晰的目录结构并将其纳入版本控制如Gitmy-infra-kitty/ ├── .kitty/ │ └── config.yaml # 团队共享的全局配置可忽略敏感信息 ├── scenes/ # 场景定义 │ ├── production/ │ │ ├── web.yaml │ │ └── database.yaml │ └── staging/ │ └── web.yaml ├── playbooks/ # 剧本定义 │ ├── deployment/ │ │ ├── app-deploy.playbook.yaml │ │ └── rollback.playbook.yaml │ └── maintenance/ │ ├── check-status.playbook.yaml │ └── log-rotate.playbook.yaml ├── inventories/ # 动态主机清单可选可从CMDB API获取 │ └── fetch-from-cmdb.sh └── README.md # 项目说明文档2. 敏感信息管理绝对不要将密码、密钥等敏感信息硬编码在YAML文件中。Kitty通常支持从环境变量或外部密码管理工具中读取敏感数据。环境变量在剧本中使用{{ env SECRET_KEY }}来引用环境变量。外部命令使用shell动作调用如vault、aws secrets manager的命令来获取密钥。场景变量文件将敏感变量放在单独的、被.gitignore忽略的文件中通过Kitty的包含功能引入。3. 剧本的模块化与复用复杂的剧本可以拆分成多个子剧本通过include或call动作如果支持进行引用。或者可以编写功能单一的小剧本通过顺序执行多个剧本来完成复杂任务。8. 常见问题排查与性能调优在实际使用中你可能会遇到一些问题。以下是一些常见情况的排查思路问题1SSH连接超时或失败检查点确认场景中配置的address、ssh_user、port是否正确。检查点确认用于认证的SSH私钥identity_file是否有权限访问目标主机。检查点检查网络连通性以及目标主机的SSH服务是否正常运行防火墙规则是否放行。技巧在全局配置或场景配置中适当增加ssh.timeout值。对于网络不稳定的环境可以尝试配置SSH连接复用ControlMaster和ControlPath但这通常需要在系统SSH客户端配置中设置Kitty可能依赖系统SSH客户端。问题2剧本执行到某一步骤失败排查步骤使用--log-level debug参数重新运行查看详细的执行日志定位是哪个动作、在哪台主机上出了问题。排查步骤单独复制失败动作中的cmd命令手动到目标主机上执行验证命令本身是否正确。技巧在关键的、可能失败的动作如rm -rf之前添加一个prompt动作进行人工确认或者添加一个shell动作先做备份。问题3并行执行导致输出混乱或资源耗尽现象当对大量主机如上百台执行并行任务时终端输出可能快速滚动难以查看或者并发连接数过多导致本地或目标主机资源紧张。解决方案使用--parallel-limit参数限制最大并发主机数。例如kitty run ... --parallel-limit 10表示最多同时与10台主机交互。解决方案对于输出很长的命令可以考虑将输出重定向到文件或者使用--output参数将整个执行输出保存到文件后再分析。问题4剧本执行速度慢优化点确保parallel: true被正确用于可以并行的独立任务上。优化点检查网络延迟。对于跨国或跨地域的主机文件传输copy,sync可能是瓶颈考虑先在离目标机近的跳板机上中转。优化点审查剧本逻辑避免不必要的串行等待。例如如果动作B不依赖动作A的结果它们就可以设置为并行。性能调优建议连接池Kitty的SSH连接池是默认开启的确保不要在每个动作后都关闭连接。在剧本中连续对同一批主机执行多个动作会受益于此。批量操作尽可能将多个相关的Shell命令合并到一个shell动作中用或;连接减少SSH会话的建立次数。结果缓存对于执行成本高、结果变化不频繁的命令如uname -r获取内核版本可以考虑将结果存入变量供后续动作使用避免重复执行。9. 与其他工具的对比与集成Kitty在终端自动化生态中占据了一个独特的位置。理解它与其他工具的区别和联系有助于你做出正确的技术选型。vs. 传统Shell脚本优势结构化YAML、内置并发、主机分组与过滤、更好的错误处理、可读性更强、易于复用和分享。劣势对于极其简单的一次性任务编写Shell脚本可能更快。vs. Ansible优势更轻量、启动更快、配置更简单、与个人工作流结合更紧密、更适合交互式和临时性的自动化任务。Kitty的“场景”概念对多环境切换非常直观。劣势在功能完备性、社区模块丰富度、大规模基础设施管理、复杂的流程控制如错误处理块方面不如Ansible成熟。Ansible有完整的角色Roles和集合Collections生态。vs. Fabric/Invoke优势Kitty的YAML配置对于不熟悉Python的运维人员更友好声明式的剧本有时比编写Python脚本更直观。内置的并发模型可能更简单易用。劣势Fabric/Invoke基于Python具有极高的灵活性可以无缝利用整个Python生态库进行任意复杂的逻辑编排这是Kitty的插件系统目前难以比拟的。集成策略Kitty可以很好地与其他工具协同工作作为胶水层用Kitty编排一个工作流其中某些动作是调用Ansible Playbook、执行Terraform命令或运行一个Python脚本。互补使用用Ansible管理服务器的基础配置和状态Idempotency用Kitty处理日常的、需要频繁手动触发的运维操作和部署。与CI/CD集成在Jenkins、GitLab CI或GitHub Actions的Pipeline中将Kitty作为一个命令行工具调用用于部署或运维后置步骤。我个人在经历了一段时间的使用后发现Kitty最适合的场景是“个人或小团队的标准化操作手册”。它将那些你需要在笔记本上记录、或者记在脑子里的“魔法命令”变成了可版本控制、可分享、可重复执行的资产。它可能不会解决你所有的问题但它能让你在命令行下的生活变得更有条理也更轻松一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…