开源风险运营自动化框架riskops:从事件驱动到SOAR实践

news2026/4/29 9:49:41
1. 项目概述风险运营的自动化利器最近在梳理团队的风险管理流程发现一个很头疼的问题风险事件的识别、评估、响应和复盘大部分工作还停留在人工处理Excel表格和邮件沟通的阶段。一个中等规模的安全事件从告警到闭环可能要拉上七八个人开三四次会流转十几个文档效率低不说还容易出错和遗漏。就在我琢磨着怎么用脚本把这些流程串起来的时候偶然在GitHub上发现了tcz001/riskops这个项目。光看名字riskops就能猜到它和风险运营Risk Operations有关。简单来说这是一个旨在将风险运营流程自动化、平台化的开源工具集或框架。它的核心价值在于试图把那些散落在各个系统比如安全设备、监控平台、工单系统里的风险信息通过一个统一的“操作中心”进行汇聚、分析和处置。想象一下你不再需要每天登录五六个后台去查看告警也不用手动把数据复制粘贴到报告模板里。riskops想做的是那个“中间层”它通过预定义的规则和流程自动抓取风险信号自动进行初步分类和定级然后自动或半自动地触发后续的响应动作比如创建工单、发送通知、调用处置接口最后还能把整个处置过程记录下来形成可追溯、可审计的闭环。这个项目特别适合那些已经有一定安全或风控基础但流程自动化程度不高的团队。无论是安全运维工程师、风控策略分析师还是负责内部流程优化的同学都能从中找到可以借鉴的思路和现成的“轮子”。它不是一个开箱即用、功能大而全的商业产品而更像一个乐高积木套装提供了基础的连接器、处理器和触发器你需要根据自己的业务场景去搭建属于你自己的风险自动化流水线。接下来我就结合自己的理解把这个项目的设计思路、核心模块以及如何上手实践的要点给大家拆解一遍。2. 核心设计理念与架构拆解2.1 为什么是“Ops”而不仅仅是“Risk”首先得理解项目名中的“Ops”。在IT领域“Ops”通常指代运维Operations强调的是一系列可重复、可自动化、可度量的操作流程。riskops没有叫riskmanager或riskplatform这本身就暗示了它的侧重点不是做一个全面的风险管理理论平台而是聚焦于风险“运营”过程中的实操环节。它的设计初衷是解决“知道有风险后具体该怎么办”的问题尤其是如何高效、规范、不出错地去执行“怎么办”。基于这个理念它的架构通常是事件驱动Event-Driven的。整个系统围绕“风险事件”这个核心对象运转。一个外部信号比如一条高危漏洞告警、一笔可疑交易、一次异常登录被捕获后会被包装成一个标准化的事件对象进入处理流水线。这个流水线一般包含几个关键阶段事件输入Ingestion - 事件丰富与评估Enrichment Assessment - 决策与路由Decision Routing - 行动执行Action - 闭环与反馈Closure Feedback。riskops的代码结构通常会映射这个流水线。你可能会看到sources/目录里面放着从不同数据源如Elasticsearch日志、云监控API、自定义Webhook拉取事件的适配器会有rules/或policies/目录里面是用YAML或Python定义的评估规则用于判断事件的严重等级、所属类型会有actions/目录定义了事件确认后可以执行的操作比如调用Slack API发消息、在Jira创建问题、或执行一个封禁IP的脚本最后还会有core/或engine/目录这是驱动整个流水线运转的“发动机”负责调度和状态管理。注意开源项目的具体实现可能千差万别但理解这个“事件驱动流水线”的通用模型是看懂任何类似运维自动化、安全编排与自动化响应SOAR类项目的基础。riskops可以看作一个轻量级、可高度定制的SOAR雏形。2.2 关键组件与数据流设计要上手riskops或者借鉴其思想自建系统必须理清几个关键组件是如何协同工作的。我以典型的应用场景为例描绘一下数据是如何流动的。1. 事件采集器Event Collectors / Sources这是系统的“眼睛”和“耳朵”。它的职责是从纷繁复杂的外部系统中把原始的风险信号“拿进来”。设计上每个数据源最好都有一个独立的采集模块。例如安全设备类从防火墙、WAF、IDS/IPS的syslog或API获取攻击日志。云平台类通过AWS CloudTrail、Azure Monitor或云安全中心的API获取配置变更、异常行为事件。应用监控类从Prometheus、Grafana、Sentry等获取业务指标异常或错误突增告警。通用接口类提供一个标准的Webhook端点允许任何系统通过HTTP POST发送JSON格式的事件。在riskops的实现中这些采集器可能以插件Plugin或集成Integration的形式存在。一个好的设计是采集器只负责获取和初步格式化数据将原始数据转换为内部统一的事件模型通常是一个包含id,timestamp,source,raw_data,severity等字段的Python字典或Pydantic模型并不做复杂的逻辑判断。2. 规则引擎Rules Engine这是系统的“大脑”负责判断事件的轻重缓急。规则通常以“条件-动作”的形式存在。例如rule_id: “high_severity_vuln” description: “对高危及以上漏洞自动创建紧急工单” condition: - field: “event_type” operator: “equals” value: “vulnerability_scan” - field: “severity” operator: “in” value: [“CRITICAL”, “HIGH”] actions: - “create_jira_issue” - “notify_security_team”规则引擎会遍历所有加载的规则对每个流入的事件进行匹配。匹配成功的规则其关联的“动作”就会被加入待执行队列。这里的一个设计关键是规则的执行顺序和冲突处理。有些项目会采用优先级Priority设定或者更复杂的RETE算法来提高效率。3. 动作执行器Action Executors这是系统的“手”和“脚”负责把决策落到实处。每个动作对应一个具体的操作函数。常见的动作包括通知类发送邮件、钉钉/飞书/Slack消息、短信。工单类在Jira、ServiceNow、腾讯云工单等系统创建、更新或关闭工单。拦截类调用防火墙API添加黑名单规则、在WAF上封禁URL、在云安全组禁用某个端口。数据类将事件信息写入数据库如Elasticsearch用于检索、数据仓库如ClickHouse用于分析或对象存储如S3用于归档。动作执行器的设计要特别注意错误处理和重试机制。网络调用可能失败API可能限流目标系统可能临时不可用。一个健壮的动作执行器需要有超时控制、指数退避重试、以及失败后的降级方案比如先记录到本地日志稍后由人工补处理。4. 工作流引擎Workflow Engine / Orchestrator对于简单的“事件-规则-动作”直线流程可能不需要复杂的工作流。但现实中的风险处置往往是一连串的步骤可能有条件分支、并行任务、人工审批环节。这时就需要一个更强大的工作流引擎来编排复杂的处置剧本Playbook。riskops项目可能实现了一个轻量级的工作流引擎使用YAML或DSL来定义剧本。例如playbook: “respond_to_brute_force” steps: - name: “确认攻击源” action: “enrich_ip” parameters: {ip: “{{ event.source_ip }}”} - name: “判断是否内部IP” condition: “{{ enriched_ip.is_internal }}” if_true: - action: “notify_infra_team” if_false: - name: “封禁IP” action: “block_ip_firewall” parallel: - action: “block_ip_waf” - name: “创建调查工单” action: “create_jira_issue”这个引擎负责解析剧本按顺序或并行执行步骤管理步骤间的数据传递如上一步的输出作为下一步的输入并处理人工审批节点的暂停与恢复。5. 数据存储与状态管理系统需要持久化事件数据、执行状态、规则定义和审计日志。简单的实现可能直接用SQLite或PostgreSQL。事件和状态存储用于支持事件去重Deduplication、状态跟踪如“待处理”、“处理中”、“已解决”、“误报”和历史查询。审计日志则至关重要它记录了“谁在什么时候对哪个事件执行了什么操作”满足合规与复盘的需求。理解了这些组件再看riskops的代码目录你就会发现它不过是用代码将这些逻辑模块组合起来。你的配置和自定义代码就是为这套机器注入灵魂告诉它看什么Sources、怎么想Rules、做什么Actions、以及复杂情况下按什么步骤做Workflows。3. 从零开始搭建与核心配置实战假设我们现在要基于riskops的思想或者直接使用其开源代码为自己团队搭建一个最小可用的风险运营自动化中心。这个过程会涉及到环境准备、核心配置、规则编写和动作调试。3.1 基础环境与依赖部署首先你需要一个可以运行Python应用的环境。riskops项目大概率是一个Python项目因为它非常适合快速开发集成和自动化脚本。环境准备建议使用Python 3.8或以上版本。使用虚拟环境venv或conda来隔离依赖是一个好习惯。# 创建并激活虚拟环境 python -m venv riskops-env source riskops-env/bin/activate # Linux/macOS # riskops-env\Scripts\activate # Windows获取代码与安装依赖克隆项目仓库并安装依赖。git clone https://github.com/tcz001/riskops.git cd riskops pip install -r requirements.txt如果项目没有提供requirements.txt你需要查看setup.py或pyproject.toml文件或者手动安装常见的依赖如requests(HTTP请求)、pydantic(数据验证)、sqlalchemy(数据库ORM)、celery(异步任务队列如果用到)等。配置数据库根据项目文档初始化数据库。可能是运行一个alembic upgrade head命令如果使用Alembic做数据库迁移或者执行一个初始化的SQL脚本。确保数据库服务如PostgreSQL已启动并连接信息正确。配置文件找到项目的配置文件通常是config.yaml,settings.py或.env文件。这是核心所在你需要配置数据库连接字符串。各个集成的认证信息比如Jira的URL、用户名/API TokenSlack的Webhook URL或Bot Token云平台的Access Key/Secret。切记这些敏感信息不要硬编码在代码里要使用环境变量或配置文件并且确保配置文件不被提交到版本库。核心参数如事件保留天数、任务重试次数、监听端口等。3.2 编写你的第一个风险处理规则规则是系统的灵魂。我们从一个最简单的场景开始监控服务器登录日志对短时间内多次失败的SSH登录尝试即暴力破解进行告警。假设事件采集器已经能从你的中央日志系统比如ELK里把SSH登录失败的事件抓取过来并格式化成如下结构的事件{ “event_id”: “123”, “timestamp”: “2023-10-27T14:30:00Z”, “source”: “ssh_auth_log”, “source_ip”: “192.168.1.100”, “user”: “root”, “status”: “FAILED” }现在我们要写一条规则如果同一个源IP在5分钟内对任何用户发起超过10次SSH登录失败尝试则触发高风险告警并执行封禁IP和通知安全员的动作。在riskops的规则体系中这条规则可能需要拆解成两部分第一部分事件聚合与计数通常在规则引擎或一个独立的聚合器里这不是一条简单的静态规则它需要基于时间窗口进行计数。因此规则引擎需要支持“滑动窗口聚合”功能。规则定义可能类似rule_id: “ssh_bruteforce_detection” type: “aggregation” # 标明这是一个聚合规则 description: “检测SSH暴力破解” group_by: “source_ip” # 按源IP分组 time_window: “5 minutes” # 时间窗口为5分钟 condition: - field: “source” operator: “equals” value: “ssh_auth_log” - field: “status” operator: “equals” value: “FAILED” threshold: count: 10 # 窗口内事件数超过10 operator: “” actions: - “trigger_bruteforce_alert” # 触发一个聚合后的事件这条规则的作用是每5分钟检查一次将每个IP的失败登录事件计数如果超过10次就生成一个新的、更高级别的聚合事件比如{“alert_type”: “ssh_bruteforce”, “source_ip”: “192.168.1.100”, “failure_count”: 15, “time_window”: “5m”}。第二部分对聚合事件采取行动上一步生成的聚合事件会再次进入规则引擎。我们需要另一条规则来响应它rule_id: “respond_to_ssh_bruteforce” description: “响应SSH暴力破解告警” condition: - field: “alert_type” operator: “equals” value: “ssh_bruteforce” - field: “failure_count” operator: “” value: 10 actions: - “block_ip_on_firewall” - “post_to_slack_security_channel”这样逻辑就清晰了原始事件流经过聚合规则产生高阶告警事件告警事件再触发处置规则执行具体动作。实操心得规则编写最忌“想当然”。一定要先在测试环境用真实的历史日志或模拟数据反复验证规则的触发条件是否准确。阈值设得太低会产生大量误报导致“告警疲劳”设得太高又会漏报真实攻击。建议从稍保守的阈值开始根据运行情况逐步调整。同时记得为规则添加“启用/禁用”开关和“静默期”设置方便在维护时段或已知误报场景下临时关闭。3.3 配置与调试动作执行器动作执行器是与外部系统交互的桥梁也是最容易出问题的地方。我们以“向Slack安全频道发送消息”这个动作为例看看如何配置和调试。获取Slack权限首先需要在Slack上创建一个应用App并获取一个“Bot User OAuth Token”或者配置一个“Incoming Webhook”。Webhook方式更简单但功能受限Bot Token方式更灵活可以发送更丰富的消息块Blocks。在riskops中配置Slack集成在配置文件中添加Slack部分。# config.yaml actions: slack: webhook_url: ${SLACK_WEBHOOK_URL} # 推荐从环境变量读取 # 或者使用Bot Token bot_token: ${SLACK_BOT_TOKEN} default_channel: “#security-alerts” # 默认通知频道编写动作函数在actions/目录下找到或创建一个slack_notify.py文件。import requests import logging from .base_action import BaseAction class SlackNotifyAction(BaseAction): name “post_to_slack_security_channel” def __init__(self, config): self.webhook_url config[‘webhook_url’] self.logger logging.getLogger(__name__) def execute(self, event, context): “”“发送消息到Slack”“” message self._format_message(event) payload {“text”: message} # 可以构造更复杂的blocks结构 # payload {“blocks”: [...]} try: response requests.post( self.webhook_url, jsonpayload, timeout10 ) response.raise_for_status() # 如果状态码不是200抛出异常 self.logger.info(f“Slack通知发送成功事件ID: {event[‘event_id’]}”) return {“success”: True, “message_id”: response.json().get(‘ts’)} except requests.exceptions.RequestException as e: self.logger.error(f“Slack通知发送失败: {e}, 事件: {event[‘event_id’]}”) # 这里应该触发重试机制或降级处理如写入错误日志文件 return {“success”: False, “error”: str(e)} def _format_message(self, event): “”“格式化告警消息”“” return f“ *安全告警* \n类型: {event.get(‘alert_type’)}\n源IP: {event.get(‘source_ip’)}\n时间: {event.get(‘timestamp’)}\n详情: {event.get(‘description’, ‘N/A’)}”注册动作需要在一个中心注册点比如actions/__init__.py注册这个动作类让规则引擎能发现并调用它。测试动作在正式运行前务必编写单元测试或进行集成测试。可以模拟一个事件数据直接调用execute方法看是否能成功收到Slack消息。测试时要关注网络连通性运行riskops的服务器是否能访问api.slack.com。权限正确性Token或Webhook URL是否有权限向目标频道发消息。消息格式消息内容是否清晰、包含所有关键信息What, When, Where。错误处理故意提供一个错误的Webhook URL看错误是否被正确捕获和记录是否会引发整个系统崩溃。对于“封禁IP”这类更关键的动作测试要加倍小心。务必先在测试环境或针对测试IP进行操作。封禁动作的脚本或API调用一定要有“回滚”或“解除封禁”的配套机制以防误操作。4. 高级特性与生产级考量当一个基本的riskops系统跑起来后你会很快发现一些在简单Demo中遇不到但在生产环境中至关重要的问题。解决这些问题才能让系统从“玩具”变成“工具”。4.1 事件去重与关联分析原始的风险事件往往是海量且重复的。同一个攻击源可能在一秒钟内扫描上千个端口产生上千条日志。如果每条日志都触发一次告警和处置流程系统会被瞬间压垮运维人员也会被垃圾信息淹没。1. 去重Deduplication去重的核心是定义一个“事件指纹”。对于SSH暴力破解指纹可能是源IP 目标用户名 5分钟时间块。对于Web攻击指纹可能是源IP 攻击载荷的MD5值 1小时时间块。系统需要在内存或缓存如Redis中维护一个指纹集合和计数。当新事件到来时计算其指纹如果已存在且未超时则只增加计数器不创建新事件实例只有当指纹不存在或超时后再次出现才创建新事件。2. 关联Correlation更高级的系统需要做关联分析。例如横向移动检测同一个内部IP在短时间内先后出现了“Windows系统日志429事件登录失败”、“Windows系统日志4624事件登录成功”、“PowerShell执行可疑命令”等多个事件。单独看每个事件可能都是低危但关联起来就勾勒出一次成功的横向移动攻击链。多源验证一个外部IP在WAF日志里被标记为扫描器同时在业务日志里出现了大量404错误。两个来源的信息相互印证提高了该IP是恶意扫描的确信度。实现关联分析通常需要更复杂的规则引擎支持跨事件、跨时间窗口的查询和一个能够存储和快速检索历史事件的数据存储如Elasticsearch。riskops项目如果定位是轻量级可能只提供基础的去重关联分析需要你自己在规则逻辑或外部分析平台中实现。4.2 流程编排与人工审批不是所有风险都能全自动处置。涉及核心资产、影响业务连续性或处置动作风险较高的场景需要引入人工审批。这就需要工作流引擎支持“人工任务”节点。一个典型的带审批的剧本可能是自动检测到疑似数据泄露事件规则触发。自动执行第一步动作收集相关日志丰富事件信息如确定涉及的数据类型、数量。触发人工审批节点将事件详情、初步分析报告发送给安全负责人审批。系统状态暂停等待审批。审批人通过Web界面、邮件或聊天机器人收到通知查看详情后选择“批准”或“拒绝”。如果批准工作流继续执行后续动作如重置相关用户密码、下发扫描任务。如果拒绝或超时未处理工作流转入“人工处理”队列或执行替代动作如仅记录、提升事件等级等。在riskops中实现这个功能意味着需要一个Web UI或API用于展示待审批任务和接收审批结果。工作流引擎能够暂停剧本实例并等待外部信号审批结果来恢复执行。状态持久化确保服务器重启后暂停的剧本状态不丢失。4.3 监控、审计与持续优化系统自身也需要被监控。你需要知道健康度各个采集器是否在正常运行最近一次成功拉取数据是什么时候性能事件处理延迟是多少规则匹配的耗时有没有变长队列深度是否正常有效性触发了多少告警其中多少被确认为真实攻击True Positive多少是误报False Positive处置动作的成功率是多少建议为riskops系统本身添加监控指标可以使用Prometheus客户端库并暴露一个/metrics端点。关键指标包括riskops_events_ingested_total摄入事件总数。riskops_rules_triggered_total规则触发总数。riskops_actions_executed_total{action“xxx”, status“success|failure”}各动作执行成功/失败计数。riskops_processing_duration_seconds事件处理耗时直方图。审计日志则要记录每一个关键操作谁哪个系统/用户、在什么时候、对哪个事件、执行了什么操作创建、更新、审批、执行动作、结果如何。这些日志要写入不可篡改的存储如带索引的日志系统或数据库并定期备份以满足安全合规要求。基于监控和审计数据你就可以持续优化系统调优规则分析误报原因调整规则条件或阈值。优化动作对于失败率高的动作检查网络、权限或代码逻辑。扩容与性能优化如果处理延迟变大考虑将耗时的操作如调用外部API进行IP情报查询异步化或者对系统进行水平扩容。5. 常见踩坑点与排查指南在实际部署和运行riskops这类自动化系统时我踩过不少坑。这里总结几个最常见的问题和排查思路希望能帮你少走弯路。5.1 事件风暴与性能瓶颈问题现象系统刚上线突然处理速度变慢队列堆积甚至进程崩溃。查看日志发现同一时间涌入了数万条相似事件。根因分析规则设计缺陷某条规则过于宽泛匹配了大量无关事件。或者去重逻辑没生效导致每个原始事件都触发了后续昂贵的处理流程。采集器配置错误例如配置了从日志文件尾部持续读取但重启后错误地从文件头部开始重新读取所有历史数据。外部系统异常某个监控系统自身故障一次性吐出了积压的告警。排查与解决立即止损快速定位到问题规则或采集器在管理界面或通过配置将其立即禁用。分析日志查看崩溃前的日志找到事件激增的源头是哪个source。检查该源头的事件格式是否发生变化导致去重指纹计算失效。添加流控在采集器或入口处添加速率限制Rate Limiting。例如限制每个数据源每秒最多发送1000个事件超出的排队或丢弃并记录告警。优化处理对于高频率事件考虑在规则引擎前加一层“预处理聚合层”将高频原始事件聚合成低频的统计事件后再送入核心引擎处理。5.2 动作执行失败与状态不一致问题现象规则触发了但动作执行失败。查看动作日志显示“网络超时”或“API返回403权限错误”。更棘手的是部分动作成功了部分失败了导致系统状态比如“已封禁IP”与实际环境不一致。根因分析网络或依赖服务不可用这是最常见的原因。认证信息过期或权限不足API Token过期或Bot权限被修改。动作逻辑缺陷没有处理好边界情况如目标IP已经是黑名单成员再次调用添加接口导致冲突报错。缺乏事务和补偿机制一个剧本包含多个动作第一个成功第二个失败系统没有回滚第一个动作。排查与解决完善日志确保每个动作的执行开始、结束、请求参数、响应结果包括错误信息都被详细记录。这是排查的基石。实现重试与退避为动作执行器添加重试逻辑。对于网络错误采用指数退避策略如1秒后重试失败则2秒4秒...。对于权限错误则不应重试应立即告警。设计等幂动作确保动作可以安全地重复执行。例如“封禁IP”动作在执行前先检查该IP是否已在黑名单中如果在则直接返回成功而不是报错。建立人工复核队列对于失败的动作不要简单地丢弃。将其放入一个“失败动作队列”并提供界面让运维人员查看、手动重试或忽略。同时要发送紧急告警通知有人工干预需求。定期同步状态对于“封禁IP”这类动作可以定期如每天从防火墙拉取一次黑名单列表与系统中记录的执行状态进行比对发现不一致则告警并尝试修复。5.3 规则维护与知识管理问题现象系统运行半年后规则库变得臃肿不堪。没人记得某条冷门规则是谁、在什么背景下添加的。修改一条规则时战战兢兢生怕引发意想不到的连锁反应。根因分析缺乏规则的生命周期管理和知识沉淀流程。排查与解决版本控制将规则文件YAML纳入Git版本控制。任何规则的增删改都必须通过Pull Request流程并附带清晰的修改说明和测试用例。规则文档化为每条规则强制添加author、created_date、last_modified、business_reason业务原因、false_positive_examples已知误报场景等元数据字段。测试与沙箱建立规则测试沙箱环境。修改或新增的规则必须先用过去一段时间的历史事件流进行回放测试评估其触发频率和效果确认无误后再上线。定期评审与下线每季度或每半年组织一次规则评审会。对于长期未触发、误报率高、或业务场景已不存在的规则进行下线或归档处理。影响面分析在规则引擎中可以建立简单的规则依赖关系图比如规则A的输出事件可能触发规则B。在修改前能快速看到会影响哪些下游规则。最后我想强调的是riskops或任何自动化系统其核心价值不在于替代人而是放大人的能力。它把工程师从重复、繁琐、低价值的告警筛选和手工操作中解放出来让他们能更专注于高价值的威胁分析、策略优化和攻防对抗。在建设过程中一定要保持“人机协同”的思路在关键节点保留人工介入的入口并不断根据实战反馈来迭代系统和规则。这套系统永远不会“完工”它会随着业务和威胁态势的变化一直演进下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2565190.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…