QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)
QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)
📚 前言概述
QMK(Quantum Mechanical Keyboard)作为目前开源键盘固件领域的"扛把子",凭借其强大的功能和活跃的社区支持,已经成为众多DIY键盘爱好者的首选开发框架。无论是入门级玩家还是资深大佬,都能在QMK的海洋里找到适合自己的开发方式。
本文将为大家带来最新版本的QMK开发全解析,从零开始讲解QMK的文件结构、命名规范和开发流程,助力键盘DIY爱好者快速掌握这一强大工具。不仅如此,我们还会深入QMK的核心架构设计,解析数据驱动配置等进阶内容,帮助你从入门者迅速成长为QMK开发高手!
核心亮点:
- 最新QMK架构详解与文件结构剖析
- 标准命名规范与开发流程指南
- 键盘配置文件详细说明
- 进阶开发技巧与性能优化方案
让我们一起开启这段QMK开发之旅吧!
🔧 QMK开发规范
QMK Lint工具使用指南
QMK提供了一个强大的代码检查工具——qmk lint
,它能够自动检测你的键盘配置是否符合规范。强烈建议在开发过程中经常使用它来确保你的代码质量。
通过检查的示例:
$ qmk lint -kb rominronin/katana60/rev2
Ψ Lint check passed! # 检查通过,表示配置符合规范
未通过检查的示例:
$ qmk lint -kb clueboard/66/rev3
☒ Missing keyboards/clueboard/66/rev3/readme.md # 缺少readme.md文件
☒ Lint check failed! # 检查失败,需要修复问题
💡 小贴士:养成随时使用
qmk lint
检查代码的习惯,能帮你提前发现并解决潜在问题,避免后期调试的痛苦。
键盘项目命名规范
QMK对键盘名称有严格的命名规范,这有助于保持代码库的整洁和一致性:
- 所有键盘名称必须全部小写
- 只能包含字母、数字和下划线(
_
) - 名称不能以下划线开头
- 使用正斜杠(
/
)作为子文件夹分隔符
特别注意:test
、keyboard
和all
是QMK的保留关键词,不能用作键盘或子文件夹的名称。
符合规范的命名示例:
412_64 # 合法:数字和下划线组合
chimera_ortho # 合法:字母和下划线组合
clueboard/66/rev3 # 合法:使用斜杠分隔子文件夹
planck # 合法:纯字母
v60_type_r # 合法:字母、数字和下划线组合
子文件夹组织结构
QMK使用子文件夹来组织代码并在同一键盘的不同版本之间共享代码。子文件夹最多可以嵌套4层深度:
qmk_firmware/keyboards/top_folder/sub_1/sub_2/sub_3/sub_4
如果一个子文件夹包含rules.mk
文件,它就会被视为可编译键盘,将在QMK Configurator中显示,并通过make all
进行测试。对于组织多个键盘的顶层文件夹,不应该包含rules.mk
文件。
组织结构示例 - Clueboard系列键盘:
qmk_firmware
└── keyboards└── clueboard ← 组织文件夹,没有rules.mk文件├── 60 ← 可编译键盘,有rules.mk文件└── 66 ← 也是可编译的,指定rev3为默认版本├── rev1 ← 可编译:make clueboard/66/rev1├── rev2 ← 可编译:make clueboard/66/rev2└── rev3 ← 可编译:make clueboard/66/rev3或make clueboard/66
🔍 进阶提示:良好的文件夹结构不仅有助于代码管理,还能简化版本控制和团队协作。对于有多个版本或变体的键盘,使用子文件夹结构能大大提高代码复用率。
📁 键盘文件夹必要文件
开发QMK键盘需要创建一系列必要文件,下面详细介绍这些文件及其作用:
readme.md
每个键盘项目都必须包含一个readme.md
文件,用于提供键盘的基本信息:
- 键盘的功能和特点介绍
- 制造商/设计者信息
- 购买或获取途径
- 相关资源链接(如官网、社区等)
# 键盘名称一款功能强大的机械键盘。* 键盘维护者: [维护者名称](https://github.com/维护者)
* 硬件支持: 详细描述硬件信息
* 硬件设计源文件: [链接](源文件链接)## 固件构建请按照[构建环境设置](链接)进行操作,然后执行:```make 键盘名称:默认配置```更多信息参考[QMK文档](链接)
info.json
info.json
是QMK键盘配置的核心文件,被QMK API和Configurator使用,包含键盘布局、键位和元数据等信息:
{"keyboard_name": "示例键盘", // 键盘名称"maintainer": "维护者", // 维护者GitHub用户名"manufacturer": "制造商", // 制造商名称"url": "https://example.com", // 键盘官网或项目页面"usb": {"vid": "0xFEED", // USB厂商ID"pid": "0x0000", // USB产品ID"device_version": "1.0.0" // 设备版本号},"layouts": {"LAYOUT": { // 键盘布局定义"layout": [{"x": 0, "y": 0, "matrix": [0, 0]},{"x": 1, "y": 0, "matrix": [0, 1]},// 更多按键定义...]}}
}
💡 拓展知识:QMK正在逐步向数据驱动配置迁移,将更多配置信息放入
info.json
中,使配置更加结构化。这种方式不仅便于图形化工具使用,还简化了固件编译流程。
config.h
config.h
文件用于设置键盘的基本参数和默认值:
#pragma once // 防止头文件重复包含/* USB设备描述符参数 */
#define VENDOR_ID 0xFEED // USB供应商ID
#define PRODUCT_ID 0x0000 // USB产品ID
#define DEVICE_VER 0x0001 // 设备版本号
#define MANUFACTURER "制造商名称" // 制造商名称
#define PRODUCT "键盘名称" // 产品名称/* 键盘矩阵尺寸 */
#define MATRIX_ROWS 5 // 矩阵行数
#define MATRIX_COLS 14 // 矩阵列数/* 矩阵引脚定义 */
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4 } // 行引脚
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2 } // 列引脚
#define DIODE_DIRECTION COL2ROW // 二极管方向(COL2ROW或ROW2COL)
QMK按特定顺序读取config.h
文件:
keyboards/top_folder/config.h
keyboards/top_folder/sub_1/config.h
keyboards/top_folder/sub_1/sub_2/config.h
keyboards/top_folder/sub_1/sub_2/sub_3/config.h
keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/config.h
.build/objs_<keyboard>/src/info_config.h
(数据驱动配置)users/a_user_folder/config.h
keyboards/top_folder/keymaps/a_keymap/config.h
- 各级
post_config.h
文件
post_config.h
文件可用于处理基于前面配置的高级设置,例如:
#ifndef IOS_DEVICE_ENABLE// 普通设备的USB最大功耗设置#define USB_MAX_POWER_CONSUMPTION 400
#else// iOS设备特殊功耗限制(低于100mA)#define USB_MAX_POWER_CONSUMPTION 100
#endif// RGB灯光配置根据设备类型调整
#ifdef RGBLIGHT_ENABLE#ifndef IOS_DEVICE_ENABLE// 普通设备的RGB亮度设置#define RGBLIGHT_LIMIT_VAL 200#define RGBLIGHT_VAL_STEP 17#else// iOS设备的低功耗RGB设置#define RGBLIGHT_LIMIT_VAL 35#define RGBLIGHT_VAL_STEP 4#endif
#endif
rules.mk
rules.mk
文件标志着一个文件夹是可编译的键盘目标,用于配置构建环境和功能选项:
# MCU名称和子架构
MCU = atmega32u4 # 微控制器型号
BOOTLOADER = atmel-dfu # 引导加载程序类型# 构建选项
BOOTMAGIC_ENABLE = yes # 启用引导魔术键
MOUSEKEY_ENABLE = yes # 鼠标键
EXTRAKEY_ENABLE = yes # 媒体控制和系统控制键
CONSOLE_ENABLE = no # 控制台用于调试
COMMAND_ENABLE = no # 命令用于调试和配置
NKRO_ENABLE = yes # USB N-Key Rollover支持
BACKLIGHT_ENABLE = yes # 启用背光
RGBLIGHT_ENABLE = yes # 启用RGB灯光
AUDIO_ENABLE = no # 音频输出
rules.mk
文件的读取顺序如下:
keyboards/top_folder/rules.mk
keyboards/top_folder/sub_1/rules.mk
- 依此类推…
keyboards/top_folder/keymaps/a_keymap/rules.mk
users/a_user_folder/rules.mk
- 各级
post_rules.mk
文件 common_features.mk
post_rules.mk
文件可以根据用户配置选择性启用功能:
# 根据用户选择的RGB灯光类型配置相应参数
ifeq ($(strip $(RGBLED_OPTION_TYPE)),backlight)RGBLIGHT_ENABLE = yesOPT_DEFS += -DRGBLIGHT_LED_COUNT=30 # 背光模式使用30个LED
endif
ifeq ($(strip $(RGBLED_OPTION_TYPE)),underglow)RGBLIGHT_ENABLE = yesOPT_DEFS += -DRGBLIGHT_LED_COUNT=6 # 底光模式使用6个LED
endif
⚙️ 技术深入:
rules.mk
文件的逐级加载机制使QMK能够实现"继承式"配置,子文件夹可以覆盖父文件夹的设置,而自定义键映射可以覆盖默认设置,这提供了极大的灵活性。
<keyboard_name>.c
这个文件包含键盘的自定义代码,主要用于初始化和控制键盘硬件。如果键盘结构简单(只有键矩阵,没有LED、扬声器等辅助硬件),此文件可以为空。
常见函数定义:
#include "kb.h" // 包含键盘头文件// 键盘初始化函数
void matrix_init_kb(void) {// 初始化LED引脚setPinOutput(B0); // Caps Lock LEDsetPinOutput(B1); // Scroll Lock LEDsetPinOutput(B2); // Num Lock LED// 调用用户初始化函数matrix_init_user();
}// 键盘矩阵扫描函数,定期执行
void matrix_scan_kb(void) {// 添加自定义扫描代码matrix_scan_user(); // 调用用户扫描函数
}// 按键处理函数
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {// 如果用户处理函数返回false,则终止处理if (!process_record_user(keycode, record)) {return false;}// 添加自定义按键处理逻辑return true; // 继续处理
}// LED状态更新函数
bool led_update_kb(led_t led_state) {if (!led_update_user(led_state)) {return false;}// 更新物理LED状态writePin(B0, led_state.caps_lock); // Caps Lock LEDwritePin(B1, led_state.scroll_lock); // Scroll Lock LEDwritePin(B2, led_state.num_lock); // Num Lock LEDreturn true;
}
<keyboard_name>.h
此文件定义键盘的矩阵布局,将键码数组转换为表示键盘物理开关矩阵的结构:
#pragma once#include "quantum.h"// 布局宏定义,将键映射中的键码对应到物理矩阵位置
// 此例中展示了一个60%键盘的ANSI布局
#define LAYOUT_60_ansi( \K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \K40, K41, K42, K46, K4A, K4B, K4C, K4D \
) { \{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D }, \{ K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \
}// 支持所有可能按键位置的完整布局
#define LAYOUT_all( \K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \K40, K41, K42, K43, K44, K46, K48, K49, K4A, K4B, K4C, K4D \
) { \{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \{ K40, K41, K42, K43, K44, KC_NO, K46, KC_NO, K48, K49, K4A, K4B, K4C, K4D } \
}
当键盘支持多种布局时,应该定义相应的布局宏。例如,一个支持ANSI和ISO布局的60%键盘可以定义:
布局名称 | 键映射名称 | 描述 |
---|---|---|
LAYOUT_all | default | 支持所有可能按键位置的布局 |
LAYOUT_60_ansi | default_ansi | ANSI标准布局 |
LAYOUT_60_iso | default_iso | ISO标准布局 |
🛠️ 实用建议:应该始终提供全部布局的定义,而不仅仅是
LAYOUT_all
,这样第三方工具能更好地支持你的键盘。给布局取有意义的名称(如LAYOUT_60_ansi
而非简单的LAYOUT_ansi
)可以提高代码可读性。
📊 其他重要文件
图像和硬件文件
为了保持QMK代码库的轻量级,通常不接受将二进制格式的图片或文件直接添加到仓库中。建议将这些文件托管在其他平台(如Imgur)上,然后在readme.md
中提供链接。
对于与键盘硬件相关的文件(PCB设计、外壳文件等),可以贡献到qmk.fm仓库,这些文件会在QMK官网上提供下载:
- 可下载文件存储在
/<keyboard>/
目录 - 网页内容生成自
/_pages/<keyboard>/
目录
💼 键盘默认设置推荐
QMK提供了大量功能,为避免新用户感到困惑,建议在默认固件中只启用必要的功能:
魔术键码和命令
Magic Keycodes和Command功能允许用户以特殊方式控制键盘。对于这些高级功能,建议:
- 默认禁用或限制Bootmagic功能,避免新用户意外触发(如不小心按住Alt和空格导致这些键功能互换)
- 如果启用,将
BOOTMAGIC_KEY_SALT
设置为不常用的按键组合 - 即使禁用Command功能,也应为
IS_COMMAND
提供合理的默认值,方便用户日后启用
自定义键盘编程
为键盘开发自定义功能时,应考虑:
- 确保自定义函数也调用相应的
_user()
版本,给用户留下自定义空间 - 尊重用户函数的返回值,只有在用户返回
true
时才继续执行 - 提供清晰的文档说明如何扩展这些功能
// 良好实践的自定义函数示例
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {// 先调用用户函数,如果它返回false则终止处理if (!process_record_user(keycode, record)) {return false;}// 键盘特定的处理逻辑...return true; // 允许继续处理
}
非生产/手动连线项目
QMK欢迎所有使用其框架的项目,包括原型和手工连线的键盘。这类项目应放在/keyboards/handwired/
文件夹中,如果将来变成生产项目,再移至主/keyboards/
目录。
警告作为错误
QMK项目中所有编译警告都被视为错误。即使是看似微小的警告也可能积累并导致更严重的问题,因此应当重视并修复所有警告。
版权声明
代码文件应包含适当的版权声明:
-
如果是你创建的新文件:
Copyright 2025 你的名字 <your@email.com>
-
如果你修改了他人的代码:
Copyright 2020 原作者 <original_author@example.com> Copyright 2025 你的名字 <your@email.com>
-
持续改进的文件可以使用年份范围:
Copyright 2019-2025 你的名字 <your@email.com>
🚀 进阶开发技巧
数据驱动配置
QMK正在向数据驱动配置模式转变,将配置信息集中到info.json
文件中:
{"keyboard_name": "高级键盘","usb": {"vid": "0xC1ED","pid": "0x23B0"},"matrix_pins": {"cols": ["A0", "A1", "A2", "A3", "A4"],"rows": ["B0", "B1", "B2", "B3"]},"diode_direction": "COL2ROW","features": {"bootmagic": true,"rgblight": true,"extrakey": true}
}
数据驱动配置的优势:
- 更结构化的配置方式
- 便于图形化工具读取和编辑
- 减少配置文件间的冗余
- 统一配置标准
优化固件大小
当固件接近芯片容量限制时,可以采取以下措施:
-
禁用不必要功能:
CONSOLE_ENABLE = no # 禁用调试控制台 COMMAND_ENABLE = no # 禁用命令功能 MOUSEKEY_ENABLE = no # 禁用鼠标键功能 EXTRAKEY_ENABLE = no # 禁用多媒体键
-
代码优化:
- 使用查找表代替复杂计算
- 减少全局变量的使用
- 合并类似的函数
-
启用链接时优化:
LTO_ENABLE = yes # 启用链接时优化
-
使用更高效的算法:
- 优化矩阵扫描算法
- 简化灯光效果算法
调试技巧
开发过程中可利用QMK提供的调试工具:
// 启用调试输出
debug_enable = true;// 输出调试信息
dprintf("按键状态: %d\n", record->event.pressed);// 调试矩阵状态
debug_matrix = true;// 调试键码
debug_keyboard = true;
⚠️ 注意:发布键盘固件前记得关闭调试功能,否则会影响键盘性能。
📝 info.json深度解析
info.json
文件是QMK新架构的核心,下面是一些关键配置项的详细说明:
{"keyboard_name": "超级键盘", // 键盘名称"maintainer": "你的GitHub用户名", // 维护者信息"manufacturer": "你的工作室", // 制造商名称"url": "https://yoursite.com", // 项目网址"bootloader": "atmel-dfu", // 引导加载程序类型"processor": "atmega32u4", // 处理器型号"usb": { // USB配置"vid": "0xFEED","pid": "0x0000","device_version": "1.0.0"},"matrix_pins": { // 矩阵引脚配置"cols": ["A0", "A1", "A2", "A3", "A4"],"rows": ["B0", "B1", "B2", "B3", "B4"]},"diode_direction": "COL2ROW", // 二极管方向"features": { // 功能启用配置"bootmagic": true,"mousekey": true,"extrakey": true,"rgblight": true},"rgblight": { // RGB灯带配置"led_count": 16,"animations": {"breathing": true,"rainbow_mood": true,"rainbow_swirl": true}},"layouts": { // 键盘布局定义"LAYOUT_65_ansi": {"layout": [{"x": 0, "y": 0, "matrix": [0, 0]},{"x": 1, "y": 0, "matrix": [0, 1]},// 更多按键定义...]}}
}
🏁 总结
QMK固件框架为键盘爱好者提供了一个强大而灵活的开发环境。通过遵循本文介绍的最新架构和规范,你可以更高效地开发和维护QMK键盘项目:
- 使用
qmk lint
工具确保代码符合规范 - 遵循命名规范和文件夹组织结构
- 创建必要的配置文件(
readme.md
、info.json
、config.h
、rules.mk
等) - 合理设计键盘布局和默认功能
- 利用数据驱动配置简化开发流程
- 应用性能优化技巧提升用户体验
随着QMK不断发展,数据驱动配置将成为主流,建议开发者逐步熟悉并采用这种方式。无论你是创建自己的第一个键盘项目,还是为现有项目贡献代码,都应该经常关注QMK文档和社区动态,掌握最新的开发实践。
希望本文能帮助你更好地理解QMK开发流程,创建出色的键盘固件!如有问题,欢迎在评论区交流讨论。
🔗 相关资源:
- QMK官方文档
- QMK GitHub仓库
- QMK Discord社区
相关文章:
QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)
QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版) 📚 前言概述 QMK(Quantum Mechanical Keyboard)作为目前开源键盘固件领域的"扛把子",凭借其强大的功能和活跃的社区支持,已经…...
c++——二叉树进阶
1. 内容安排说明 二叉树在前面C数据结构阶段已经讲过,本节取名二叉树进阶是因为: 1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性 3. 二叉树中部…...
PyTorch API 3 - mps、xpu、backends、导出
文章目录 torch.mpsMPS 性能分析器MPS 事件 torch.xpu随机数生成器流与事件内存管理 torch.mtia流与事件 torch.mtia.memory元设备元张量操作惯用法 torch.backendstorch.backends.cputorch.backends.cudatorch.backends.cudnntorch.backends.cusparselttorch.backends.mhatorc…...
QTableWidget实现多级表头、表头冻结效果
最终效果: 实现思路:如果只用一个表格的话写起来比较麻烦,可以考虑使用两个QTableWidget组合,把复杂的表头一个用QTableWidget显示,其他内容用另一个QTableWidget。 #include "mainwindow.h" #include &qu…...
比 Mac 便笺更好用更好看的便利贴
在苹果电脑上,有自带的便签软件,但问题这个官方应用已经年久失修,界面跟最新的系统完全不搭。像同步、清单等功能也没有。 最近找到了一款更好看好用的桌面便利贴 - Desktop Note。这款应用在超过26个的效率榜排在前10。以下几个点是我认为做…...
【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“
invalid literal for int() with base 10: ‘“”’" 从提供的 JSON 数据中,我可以看到导致 "invalid literal for int() with base 10: \"\"" 错误的具体情况: 错误分析 在 deal_resp 部分中发现了错误信息: &…...
超详细Kokoro-82M本地部署教程
经测试,Kokoro-82M的语音合成速度相比于其他tts非常的快,本文给出Windows版详细本地部署教程。 这里提供原始仓库进行参考:https://github.com/hexgrad/kokoro 一、依赖安装 1.新建conda环境 conda create --n kokoro python3.12 conda a…...
Day28 -js开发01 -JS三个实例:文件上传 登录验证 购物商城 ---逻辑漏洞复现 及 判断js的payload思路
本篇利用3个实例 来引出前端验证的逻辑漏洞 一、文件上传 实例:利用JS实现 【1】代码实现 js:文件后缀筛选 php:文件保存 00x1 先利用js文件上传 就利用之前php原生写的upload.html的模板,再加上script的后缀过滤。 <!…...
宝塔服务安装使用的保姆级教程
宝塔介绍: 宝塔面板(BT Panel) 是一款 国产的服务器运维管理面板,主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面(Web端)和命令行工具(bt 命令&a…...
(四)YOLO_World-SAM-GraspNet的mujoco抓取仿真(操作记录)
一、创建虚拟环境 这里直接克隆之前项目的环境 (二)Graspnet在mujoco的仿真复现(操作记录)_graspnet仿真-CSDN博客 conda create -n graspnet --clone mujoco_graspnet conda activate graspnet 二、安装额外的环境包 pip in…...
Git Github Tutorial
Git & Github Tutorial 教程地址:Git & GitHub Tutorial | Visualized Git Course for Beginner & Professional Developers in 2024 git自动跟踪每个代码更改,允许多个人无缝处理同一个项目,让成员浏览项目历史纪录 1.检查gi…...
提高工作效率的新选择[特殊字符]——Element Plus UI库
在现代前端开发中,UI库的重要性不言而喻。它们不仅加速开发过程,还提高了应用的可维护性,形成了一致的用户体验。今天我们就来介绍一款由Element团队打造的Vue.js 3 UI库——Element Plus。 一、Element Plus:Vue.js 3的全新UI库…...
深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制
TCP(Transmission Control Protocol)是一个面向连接、可靠传输的协议,支撑着绝大多数互联网通信。在实现可靠性的背后,TCP 引入了多个关键机制:重传机制、滑动窗口、流量控制 和 拥塞控制。这些机制共同协作࿰…...
从0开始学习大模型--Day05--理解prompt工程
提示词工程原理 N-gram:通过统计,计算N个词共同出现的概率,从而预测下一个词是什么。 深度学习模型:有多层神经网络组成,可以自动从数据中学习特征,让模型通过不断地自我学习不断成长,直到模型…...
全栈开发实战:FastAPI + React + MongoDB 构建现代Web应用
在Web开发领域,技术栈的选型直接影响着开发效率和系统性能。FARM(FastAPI, React, MongoDB)技术栈凭借其高性能、灵活架构和简洁语法,逐渐成为全栈开发的热门选择。本文将通过实际项目案例,详解如何从零搭建一个完整的…...
深入解析进程地址空间:从虚拟到物理的奇妙之旅
深入解析进程地址空间:从虚拟到物理的奇妙之旅 前言 各位小伙伴,还记得我们之前探讨的 fork 函数吗?当它返回两次时,父子进程中同名变量却拥有不同值的现象,曾让我们惊叹于进程独立性与写时拷贝的精妙设计。但你是否…...
Python教程(四)——数据结构
目录 1. 列表1.1 用列表实现堆栈1.2 用列表实现队列1.3 列表推导式1.4 嵌套的列表推导式 2. del语句3. 元组和序列4. 集合5. 字典6. 循环的技巧7. 深入条件控制8. 序列和其他类型的比较参考 1. 列表 方法含义list.append(x)在列表末尾添加一项,类似于a[len(a):] […...
Spring Cloud: Nacos
Nacos Nacos是阿里巴巴开源的一个服务发现,配置管理和服务管理平台。只要用于分布式系统中的微服务注册,发现和配置管理,nacos是一个注册中心的组件 官方仓库:https://nacos.io/ Nacos的下载 Releases alibaba/nacos 在官网中…...
基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码
一、引言 随着无人机技术的不断发展,其在城市环境中的应用越来越广泛,如物流配送、航拍测绘、交通监控等。然而,城市场景具有复杂的建筑布局、密集的障碍物以及多变的飞行环境,给无人机的路径规划带来了巨大的挑战。传统的路径规…...
Block Styler——字符串控件
字符串控件的应用 参考官方帮助案例:(这个方式感觉更好,第二种方式也可以)E:\NX1980\UGOPEN\SampleNXOpenApplications\C\BlockStyler\ColoredBlock 普通格式: 读取: //方法一 string0->GetProperti…...
【比赛真题解析】篮球迷
本次给大家分享一道比赛的题目:篮球迷。 洛谷链接:U561543 篮球迷 题目如下: 【题目描述】 众所周知,jimmy是个篮球迷。众所周知,Jimmy非常爱看NBA。 众所周知,Jimmy对NBA冠军球队的获奖年份和队名了如指掌。 所以,Jimmy要告诉你n个冠军球队的名字和获奖年份,并要求你…...
WPF之集合绑定深入
文章目录 引言ObservableCollection<T>基础什么是ObservableCollectionObservableCollection的工作原理基本用法示例ObservableCollection与MVVM模式ObservableCollection的局限性 INotifyCollectionChanged接口深入接口定义与作用NotifyCollectionChangedEventArgs详解自…...
第五天 车载系统安全(入侵检测、OTA安全) 数据加密(TLS/SSL、国密算法)
前言 随着汽车智能化程度不断提升,车载系统安全已成为行业关注焦点。本文将从零开始,带大家系统学习车载系统安全的核心技术,重点解析入侵检测、OTA安全、数据加密三大领域。即使没有安全背景,也能通过本文建立起完整的汽车网络安…...
采用SqlSugarClient创建数据库实例引发的异步调用问题
基于SqlSugar编写的多个WebApi接口,项目初始化时采用单例模式注册SqlSugarClient实例对象,前端页面采用layui布局,并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误: Execute…...
unity通过transform找子物体只能找子级
unity通过transform找子物体只能找子级,孙级以及更低级别都找不到,只能找到自己的下一级 如果要获取孙级以下的物体,最快的方法还是直接public挂载...
Dockers部署oscarfonts/geoserver镜像的Geoserver
Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话,最后发现要选择合适的Geoserver镜像才是关键,所以所以所以…🐷 推荐oscarfonts/geoserver的镜像! 一开始用kartoza/geoserver镜像一直提示内存不足,不过还好…...
AtCoder AT_abc405_d ABC405D - Escape Route
前言 BFS 算法在 AtCoder 比赛中还是会考的,因为不常练习导致没想到,不仅错误 TLE 了很多,还影响了心态,3 发罚时后才 AC。 思路 首先,我们把所有位置和出口的距离算出来(用 BFS),…...
Redis-x64-3.0.500
E:\Workspace_zwf\Redis-x64-3.0.500 redis.windows.conf...
CUDA编程——性能优化基本技巧
本文主要介绍下面三种技巧: 使用 __restrict__ 让编译器放心地优化指针访存想办法让同一个 Warp 中的线程的访存 Pattern 尽可能连续,以利用 Memory coalescing使用 Shared memory 0. 弄清Kernael函数是Compute-bound 还是 Memory-bound 先摆出一个知…...
图像卷积初识
目录 一、卷积的概念 1、常见卷积核示例 二、使用 OpenCV 实现卷积操作 1、代码说明 2、运行说明 一、卷积的概念 在图像处理中,卷积是一种通过滑动窗口(卷积核)对图像进行局部计算的操作。卷积核是一个小的矩阵,它在图像上…...
K8S服务的请求访问转发原理
开启 K8s 服务异常排障过程前,须对 K8s 服务的访问路径有一个全面的了解,下面我们先介绍目前常用的 K8s 服务访问方式(不同云原生平台实现方式可能基于部署方案、性能优化等情况会存在一些差异,但是如要运维 K8s 服务,…...
VSCode-插件:codegeex:ai coding assistant / 清华智普 AI 插件
一、官网 https://codegeex.cn/ 二、vscode 安装插件 点击安装即可,无需复杂操作,国内软件,无需科学上网,非常友好 三、智能注释 输入 // 或者 空格---后边自动出现注释信息,,按下 Tab 键,进…...
Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
一、Secret核心类型解析 类型使用场景自动管理机制典型字段Opaque (默认)自定义敏感数据需手动创建data字段存储键值对kubernetes.io/dockerconfigjson私有镜像仓库认证kubelet自动更新.dockerconfigjsonkubernetes.io/tlsTLS证书管理Cert-Manager可自动化tls.crt/tls.keykube…...
【验证码】⭐️集成图形验证码实现安全校验
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时5分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&am…...
iOS瀑布流布局的实现(swift)
在iOS开发中,瀑布流布局(Waterfall Flow)是一种常见的多列不等高布局方式,适用于图片、商品展示等场景。以下是基于UICollectionView实现瀑布流布局的核心步骤和优化方法: 一、实现原理 瀑布流的核心在于动态计算每个…...
TGRS | FSVLM: 用于遥感农田分割的视觉语言模型
论文介绍 题目:FSVLM: A Vision-Language Model for Remote Sensing Farmland Segmentation 期刊:IEEE Transactions on Geoscience and Remote Sensing 论文:https://ieeexplore.ieee.org/document/10851315 年份:2025 单位…...
#Redis黑马点评#(四)优惠券秒杀
目录 一 生成全局id 二 添加优惠券 三 实现秒杀下单 方案一(会出现超卖问题) 方案二(解决了超卖但是错误率较高) 方案三(解决了错误率较高和超卖但是会出现一人抢多张问题) 方案四(解决一人抢多张问题“非分布式…...
https,http1,http2,http3的一些知识
温故知新,突然有人问我项目中🤔有使用http3么,一下不知从何说起,就有了这篇文章的出现。 https加密传输,ssltls https 验证身份 提供加密,混合加密 : 对称加密 非对称加密 原理:…...
《设计数据密集型应用》——阅读小记
设计数据密集型应用 这本书非常推荐看英语版,如果考过了CET-6就可以很轻松的阅读这本书。 当前计算机软件已经不是单体的时代了,分布式系统,微服务现在是服务端开发的主流,如果没有读过这本书,则强力建议读这本书。 …...
SpringCloud之Gateway基础认识-服务网关
0、Gateway基本知识 Gateway 是在 Spring 生态系统之上构建的 API 网关服务,基于 Spring ,Spring Boot 和 Project Reactor 等技术。 Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,以及提供一些强大的过滤器功能,例如…...
MySQL 从入门到精通(三):日志管理详解 —— 从排错到恢复的核心利器
在 MySQL 数据库的日常运维中,日志是定位问题、优化性能、数据恢复的核心工具。无论是排查服务器启动异常,还是分析慢查询瓶颈,亦或是通过二进制日志恢复误删数据,日志都扮演着 “数据库黑匣子” 的角色。本文将深入解析 MySQL 的…...
单脉冲前视成像多目标分辨算法——论文阅读
单脉冲前视成像多目标分辨算法 1. 论文的研究目标及实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法及公式解析2.1 核心思路2.2 关键公式与模型2.2.1 单脉冲雷达信号模型2.2.2 匹配滤波输出模型2.2.3 多目标联合观测模型2.2.4 对数似然函数与优化2.2.5 MDL准则目…...
SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像
需求:将Spring Boot项目使用容器化进行部署 前提 默认其他环境,如mysql,redis等已经通过docker部署完毕, 这里只讨论,如何制作springboot项目的镜像 要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像 一、手动…...
【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路
摘要:本文详细阐述了政府项目中将 MySQL 5.7 数据库迁移至 KingbaseES 的全过程,涵盖迁移前的环境评估、数据梳理和工具准备,迁移实战中的数据源与目标库连接配置、迁移任务详细设定、执行迁移与过程监控,以及迁移后的质量验证、系…...
C++GO语言微服务和服务发现②
01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令:micro new --type srv test66 框架默认自带服务发现:mdns。 使用consul服务发现: 1. 初始consul服务发现&…...
手机银行怎么打印流水账单(已解决)
一、中国银行 登录中国银行手机银行APP。 在首页点击“更多”,向左滑动找到并点击“助手”。 在助手页面选择“交易流水打印”。 点击“立即申请”,选择需要打印的账户和时间段。 输入接收流水账单的电子邮箱地址。 提交申请后,在“申请…...
单片机-STM32部分:10-2、逻辑分析仪
飞书文档https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安装包如下:根据自己的系统选择,目前这个工具只有window版本哦 安装方法比较简单,都按默认下一步即可,注意不要安装到中文路径哦。 其余部分参考飞书文档…...
Scala与Go的异同教程
当瑞士军刀遇到电锯:Scala vs Go的相爱相杀之旅 各位准备秃头的程序猿们(放心,用Go和Scala不会加重你的发际线问题),今天我们来聊聊编程界的"冰与火之歌"——Scala和Go的异同。准备好瓜子饮料,我…...
【算法-哈希表】常见算法题的哈希表套路拆解
算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表 在刷题的过程中,我们会频繁遇到一些“高频套路”——而哈希表正是其中最常用也最高效的工具之一。它能帮助我们在 O(1) 的时间复杂度内完成查找、插入与…...
前端取经路——现代API探索:沙僧的通灵法术
大家好,我是老十三,一名前端开发工程师。在现代Web开发中,各种强大的API就像沙僧的通灵法术,让我们的应用具备了超乎想象的能力。本文将带你探索从离线应用到实时通信,从多线程处理到3D渲染的九大现代Web API,让你的应用获得"通灵"般的超能力。 在前端取经的第…...