QMK键盘固件自定义指南 - 打造你的专属键盘体验
QMK键盘固件自定义指南 - 打造你的专属键盘体验
🚀 前言
在机械键盘的世界里,QMK固件让你的键盘不再只是简单的输入设备,而是可以按照你的意愿定制的强大工具。本文将深入浅出地介绍如何自定义QMK键盘的行为,从基础概念到高级应用,带你玩转QMK!
📚 QMK的分层架构
QMK采用分层架构设计,从上到下依次为:
- 核心层(_quantum):提供基础功能
- 社区模块层(_<module>):提供扩展功能
- 社区模块 -> 键盘/修订版(_<module>_kb)
- 社区模块 -> 键盘映射(_<module>_user)
- 键盘/修订版层(_kb):特定键盘的功能
- 键盘映射层(_user):用户自定义配置
💡 小贴士:在键盘/修订版级别定义函数时,必须在适当位置调用
_user()
,否则键盘映射级别的函数将永远不会被执行。
🔑 自定义键码
定义新键码
创建自定义键码的第一步是枚举它们。QMK提供了SAFE_RANGE
宏来确保你的自定义键码获得唯一的编号。
enum my_keycodes {FOO = SAFE_RANGE,BAR
};
通过这段代码,你可以在键盘映射中使用FOO
和BAR
两个自定义键码。
编程键码行为
要控制键码的行为,你需要使用process_record_kb()
和process_record_user()
函数。这些函数在按键处理过程中被调用:
bool process_record_user(uint16_t keycode, keyrecord_t *record) {switch (keycode) {case FOO:if (record->event.pressed) {// 按下时执行的代码} else {// 释放时执行的代码}return false; // 跳过此键的后续处理case KC_ENTER:// 按下回车键时播放音效if (record->event.pressed) {PLAY_SONG(tone_qwerty);}return true; // 让QMK继续处理回车键的按下/释放事件default:return true; // 正常处理所有其他键码}
}
record
参数包含按键事件的详细信息:
keyrecord_t record {keyevent_t event {keypos_t key {uint8_t coluint8_t row}bool presseduint16_t time}
}
⚙️ 键盘初始化流程
键盘初始化过程分为三个主要阶段:
- 键盘预初始化:
keyboard_pre_init_*
- 在大多数功能初始化前执行,适合进行早期硬件设置 - 矩阵初始化:
matrix_init_*
- 在固件启动过程中期执行 - 键盘后初始化:
keyboard_post_init_*
- 在固件启动过程结束时执行,适合放置"自定义"代码
⚠️ 注意:对于大多数用户,
keyboard_post_init_user
是你想要实现的函数。例如,这是设置RGB底光的理想位置。
键盘预初始化示例
void keyboard_pre_init_user(void) {// 调用键盘预初始化代码// 设置LED引脚为输出模式gpio_set_pin_output(B0);gpio_set_pin_output(B1);gpio_set_pin_output(B2);gpio_set_pin_output(B3);gpio_set_pin_output(B4);
}
键盘后初始化示例
void keyboard_post_init_user(void) {// 调用后初始化代码rgblight_enable_noeeprom(); // 启用RGB灯光但不保存设置rgblight_sethsv_noeeprom(180, 255, 255); // 设置青色但不保存rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 设置快速呼吸模式但不保存
}
🔄 矩阵扫描与内务管理
矩阵扫描
矩阵扫描函数在每次按键矩阵扫描时被调用,频率非常高。需要谨慎编写这部分代码以避免影响键盘性能。
void matrix_scan_user(void) {// 这里的代码将以MCU能处理的最高频率运行,请谨慎添加代码
}
键盘内务管理
内务管理函数在所有QMK处理结束后、开始下一次迭代前调用:
void housekeeping_task_user(void) {// 此时所有按键处理、层状态更新、USB报告发送、LED更新等已完成
}
下面是一个使用housekeeping_task_user
实现RGB灯光超时关闭的示例:
#define RGBLIGHT_SLEEP // 在keymap.c中启用rgblight_suspend()和rgblight_wakeup()
#define RGBLIGHT_TIMEOUT 900000 // RGB超时时间,900K毫秒即15分钟static uint32_t key_timer; // 最后键盘活动的计时器
static void refresh_rgb(void); // 刷新活动计时器和RGB
static void check_rgb_timeout(void); // 检查RGB是否超时
bool is_rgb_timeout = false; // 存储RGB是否已超时void refresh_rgb(void) {key_timer = timer_read32(); // 存储最后刷新时间if (is_rgb_timeout){is_rgb_timeout = false;rgblight_wakeup();}
}void check_rgb_timeout(void) {if (!is_rgb_timeout && timer_elapsed32(key_timer) > RGBLIGHT_TIMEOUT) {rgblight_suspend();is_rgb_timeout = true;}
}/* 在QMK内置的后处理函数中调用上述函数 */
void housekeeping_task_user(void) {
#ifdef RGBLIGHT_TIMEOUTcheck_rgb_timeout();
#endif
}/* 每次按键后检查是否有活动 */
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef RGBLIGHT_TIMEOUTif (record->event.pressed)refresh_rgb();
#endif
}/* 每次旋钮更新后检查是否有活动 */
void post_encoder_update_user(uint8_t index, bool clockwise) {
#ifdef RGBLIGHT_TIMEOUTrefresh_rgb();
#endif
}
💤 键盘休眠与唤醒
如果你的键盘支持,可以通过以下函数控制键盘休眠状态:
void suspend_power_down_user(void) {// 键盘休眠时运行的代码,会被多次调用
}void suspend_wakeup_init_user(void) {// 键盘唤醒时运行的代码
}
🔌 键盘关机与重启
当固件重置时(软重置或跳转到引导加载程序),会调用shutdown_*
函数:
bool shutdown_kb(bool jump_to_bootloader) {if (!shutdown_user(jump_to_bootloader)) {return false;}if (jump_to_bootloader) {// 准备跳转到引导加载程序,设置红色rgb_matrix_set_color_all(RGB_RED);} else {// 软重置,关闭LEDrgb_matrix_set_color_all(RGB_OFF);}// 强制刷新缓冲区rgb_matrix_update_pwm_buffers();return true;
}
⏱️ 延迟执行
QMK提供了延迟执行功能,可以在指定时间后执行回调。要启用此功能,在rules.mk
中添加:
DEFERRED_EXEC_ENABLE = yes
延迟执行回调函数示例:
uint32_t my_callback(uint32_t trigger_time, void *cb_arg) {/* 执行一些操作 */bool repeat = my_deferred_functionality();return repeat ? 500 : 0; // 如果需要重复,返回500毫秒延迟,否则返回0
}
注册延迟执行:
deferred_token my_token = defer_exec(1500, my_callback, NULL);
📊 Keymap概述
键盘映射和图层
QMK中的键盘映射保存在const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]
数组中,最多可以定义32个图层(0-31),较高的图层具有优先权。
Keymap: 32 Layers Layer: action code matrix
----------------- ---------------------
stack of layers array_of_action_code[row][column]____________ precedence _______________________/ / | high / ESC / F1 / F2 / F3 ....31 /___________// | /-----/-----/-----/-----30 /___________// | / TAB / Q / W / E ....29 /___________/ | /-----/-----/-----/-----: _:_:_:_:_:__ | : /LCtrl/ A / S / D ....: / : : : : : / | : / : : : :2 /___________// | 2 `--------------------------1 /___________// | 1 `--------------------------0 /___________/ V low 0 `--------------------------
键盘映射层状态由两个32位参数决定:
default_layer_state
- 表示基本键盘映射层(0-31)layer_state
- 在其位中保存每个图层的开/关状态
图层优先级和透明度
较高层在图层堆栈中具有更高优先级。固件从最高活动层向下工作以查找键码。一旦找到非透明键码,就停止搜索。
如果在高层使用透明键码(KC_TRNS
、_______
或KC_TRANSPARENT
),则会使用下层对应位置的键码。
Keymap.c文件解析
一个典型的keymap.c
文件包含两个主要部分:
- 定义(包括自定义键码、图层名称等)
- 图层/键盘映射数据结构
定义部分示例:
#include QMK_KEYBOARD_H// 有用的定义
#define GRAVE_MODS (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))// 每个图层都有一个名称以提高可读性
enum layer_names {_BL, // 基础层_FL, // 功能层_CL, // 控制层
};
图层定义示例(基础层):
[_BL] = LAYOUT(F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP,KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_INT1, KC_RSFT, KC_UP,KC_LCTL, KC_LGUI, KC_LALT, KC_INT5, KC_SPC,KC_SPC, KC_INT4, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT
),
功能层示例:
[_FL] = LAYOUT(KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP,_______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SCRL, KC_PAUS, _______, _______, _______, _______,_______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______,_______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP,_______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END
),
🔍 拓展知识
1. 社区模块
社区模块是QMK的扩展功能,允许第三方实现代码供他人导入。要添加社区模块到你的构建中,在keymap.json
中添加:
{"modules": ["qmk/hello_world"]
}
2. EEPROM持久配置
QMK可以使用EEPROM存储长期保持的配置,如默认图层、RGB灯效设置等。这使得设置可以在断电后保持。
3. Bootloader驱动安装
在Windows上刷写键盘固件时,有时需要为bootloader安装特殊驱动程序。推荐使用Zadig工具安装正确的驱动。
4. QMK键码类型
QMK支持多种类型的键码:
- 基本键码:如
KC_A
、KC_ENTER
等 - 修饰键:如
KC_LSHIFT
、KC_RALT
等 - 图层切换:如
MO()
、TG()
、TO()
等 - 一键多用(Mod-Tap):如
LCTL_T(KC_ESC)
等 - 宏键:用户自定义的复杂功能
📝 总结
QMK提供了极其强大且灵活的键盘自定义能力,从简单的键位重映射到复杂的宏和功能。通过本文介绍的技术,你可以:
- 创建自定义键码并定义其行为
- 设置多层键盘映射实现不同功能
- 利用键盘初始化生命周期自定义键盘启动行为
- 使用矩阵扫描和内务管理函数添加特殊功能
- 实现节能休眠和唤醒功能
- 利用延迟执行实现定时任务
无论你是想要一个简单的QWERTY布局还是构建一个复杂的编程工作站,QMK都能满足你的需求。开始你的键盘自定义之旅吧!
🔗 相关资源
- QMK官方文档
- QMK键码列表
- QMK Keymap常见问题
- QMK社区
如果你对如何改进本文有任何建议,欢迎提交Issue!我们正在积极努力改进这些文档。
相关文章:
QMK键盘固件自定义指南 - 打造你的专属键盘体验
QMK键盘固件自定义指南 - 打造你的专属键盘体验 🚀 前言 在机械键盘的世界里,QMK固件让你的键盘不再只是简单的输入设备,而是可以按照你的意愿定制的强大工具。本文将深入浅出地介绍如何自定义QMK键盘的行为,从基础概念到高级应…...
Linux-openeuler更换yum镜像源
将 openEuler 系统镜像源更换为华为镜像 以openEuler 24.03 LTS SP1 为例。操作前建议备份原配置文件,并确保系统已联网。 一、确认系统版本与架构 查看系统版本: [rooteulerzy yum.repos.d]# cat /etc/os-releaseNAME"openEuler"VERSION&qu…...
手势、鼠标滑动实现界面切换
手势: #include <QApplication> #include "mainwindow.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec(); }#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainW…...
什么是变量提升?(形象的比喻)
当然!可以用几个生活中的比喻来形象地解释变量提升: 1. 书架的占位符 想象你有一个书架,但还没放书。 • 变量提升(var): 你先在书架上贴了一个标签(比如写“我的书”)&…...
趣味编程:答案之书
概述:该篇博客主要介绍的是曾经一度风靡全网的答案之书小程序。 目录 1. 效果展示 2. 源码展示 3. 代码逻辑详解 3.1 头文件与全局变量 3.2 main函数 3.3 主循环 3. 4 绘制界面 4. 运行问题 5.小结 1. 效果展示 该小程序是动态的效果, 因此实…...
用kompose将docker-compose文件转换为K8S资源清单
一、什么是kompose Kompose 是什么?它是一个转换工具,可将 Compose (即 Docker Compose)所组装的所有内容转换成容器编排器(Kubernetes 或 OpenShift)可识别的形式。 更多信息请参考 Kompose 官网 Kompos…...
Linux中的防火墙
概述 防火墙通过一系列规则来过滤网络数据包,决定哪些数据包可以进入或离开系统,哪些数据包将被阻止,以此来保护系统免受未经授权的访问、恶意攻击和潜在的安全威胁。 常见的防火墙软件 iptables:是 Linux 系统中常用的防火墙工…...
AI开发跃迁指南(第三章:第四维度1——Milvus、weaviate、redis等向量数据库介绍及对比选型)
1.向量数据库简介 向量数据库(Vector Database)是专门为存储和查询高维向量数据而设计的数据库,主要用于处理由机器学习模型生成的嵌入向量(Embeddings)。它在人工智能(AI)、自然语言处理&…...
深度学习笔记41_调用Gensim库训练Word2Vec模型
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.8 2.编译器:Pycharm 3.深度学习环境: torch1.12.1cu113torchvision…...
Windows Server 2025 安装AMD显卡驱动
运行显卡驱动安装程序,会提示出问题。但是此时资源已经解压 来到驱动路径 C:\AMD\AMD-Software-Installer\Packages\Drivers\Display\WT6A_INF 打开配置文件,把这两行替换掉 %ATI% ATI.Mfg, NTamd64.10.0...16299, NTamd64.10.0, NTamd64.6.0, NTamd64.…...
debian安装docker
debian安装docker <在Debian上安装Docker的步骤》 在Debian上安装Docker通常涉及几个步骤,以确保你能够顺利运行Docker容器。下面是一份详细的指南,帮助你在Debian系统上安装Docker。 1. 更新你的包列表 首先,更新你的包列表以确保所有…...
uniapp上架苹果APP Store踩雷和部分流程注意事项(非完整流程)
本文是uniapp打包成ios上架到苹果商店一系列踩雷和部分流程介绍 1.打包需要俩个证书 需要xx..mobileprovision和xx.p12证书并且ios打包一天最多5次,超出需要2元/1次付费打包,证书需要使用苹果电脑生成,以下为证书生成教程iOS证书(.p12)和描述…...
【吃透 Elasticsearch 的核心原理】学习步骤
要真正,需深入以下关键机制(结合最新技术演进): 一、倒排索引机制 核心三要素 Term Index:FST 结构加速前缀匹配(如 ap* 查询)Term Dictionary:存储所有 token 及统计信息ÿ…...
springboot使用mybatisPlus进行数据库增删改查
springboot使用mybatisPlus进行数据库增删改查 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个…...
移动端前端开发中常用的css
在开发移动端项目的时候,很多样式都是相同的,比如说图标大小,头像大小,页面底部保存(添加按钮),项目主体颜色等等,对于这些在项目中常用到的,通常都会写在公共样式中(pub…...
C/C++内存分布
内存分布示意图: 内存分布各区域详解: 内核空间: 放置操作系统相关的代码和数据。(用户不能直接进行操作 ------ 可以通过调用系统提供的 api 函数) 栈区: 又叫堆栈,非静态局部变量/函数参数/…...
Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.
版本: 原因 在 Dart Sass 3.0.0 中, @import 规则将被弃用,推荐使用 @use 和 @forward 规则来替代。 1.@use替代@import @use 规则允许你引入其他 Sass 文件中的变量、混合器和函数,并且可以避免命名冲突。 示例: style.scss @use variables;body {color: variables.$pr…...
【计算机网络】用户从输入网址到网页显示,期间发生了什么?
1.URL解析 浏览器分解URL:https://www.example.com/page 协议:https域名:www.example.com路径:/page 2.DNS查询: 浏览器向DNS服务器发送查询请求,将域名解析为对应的IP地址。 3.CDN检查(如果有)&#…...
使用adb设置wifi相关
其他的可以参考以下指令 Android 使用adb操作WiFi连接扫描等相关指令_adb wifi-CSDN博客 但是如果你的wifi账号出现中文的时候: 例如:ssid "wolf的网络" 这种类型的时候,直接使用adb指令是有问题的,基本都会出现乱码…...
MySQL数据库创建、删除、修改
一:建库建表 我们以学校体系进行建表。将数据库命名为school。 以下代码中的大写均可小写不影响。如CREATE DATABASE与create database相同 四个关键的实体分别是学院、老师、学生和课程,其中,学生跟学院是从属关系,这个关系从…...
【Android】动画原理解析
一,基础动画 基础动画,有四种,分别是平移(Translate)、缩放(Scale)、Rorate(旋转)、Alpha(透明度),对应Android中以下四种。 1,Animation基类 1,基本概念 1,插值器 插值器的作用,是控制动画过程的参数,可以理解为 时间(t)与动画进程(d)的函数,动画仅…...
C++从入门到实战(十四)初识STL与STL简介
C从入门到实战(十四)初识STL与STL简介 前言一、什么是 STL?二、STL 的版本三、STL六大组件(目前了解即可,后面会逐步讲解)1. 容器(Containers)—— 装数据的“盒子”2. 算法…...
力扣-142.环形链表II
题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 不允许修改 链表。 class Solution { public:ListNode *detectCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast) {…...
ERC-20与ERC-721:区块链代币标准的双星解析
一、代币标准的诞生背景 在以太坊生态中,代币标准是构建去中心化应用(DApps)的基石。ERC-20与ERC-721分别代表同质化与非同质化代币的两大核心标准,前者支撑着90%以上的加密资产流通,后者则开启了数字资产唯一性的新时…...
图像管理与人脸识别工具深度解析
这篇Python应用程序代码实现了一个功能丰富的图像管理和人脸识别工具,它集成了多种实用功能,包括人脸检测与裁剪、屏幕截图以及生成PDF等核心功能。我将深入分析这个应用程序的架构、功能和实现方式,帮助读者理解其设计思路和关键技术点。 C…...
【图片合并PDF】一次性将多个文件夹里的图片批量按文件夹为单位合并PDF,多个文件夹图片合并PDF,基于WPF的实现方案
设计行业:设计师需要将项目设计稿按文件夹整理并合并为PDF交付客户 摄影行业:摄影师按主题分类的照片需要合并为PDF存档或分享 企业文档管理:市场调研部门需要将分散在不同文件夹的调研图片合并为PDF报告 教育领域:教师需要将学生的作业图片按班…...
Matlab 数控车床进给系统的建模与仿真
1、内容简介 Matlab217-数控车床进给系统的建模与仿真 可以交流、咨询、答疑 2、内容说明 略 摘 要:为提高数控车床的加工精度,对数控 车床进给系统中影响加工精度的主要因素进行了仿真分析研 动系统的数学模型,利用MATLAB软件中的动态仿真工具 究:依据机械动力学原理建立了…...
HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面
文章目录 为什么需要模拟 Windows 环境?一、修改 User-Agent 模拟 Windows 浏览器方法 1:通过 Chrome 开发者工具修改 UA方法 2:使用浏览器插件 二、模拟 Windows 的字体和滚动条样式1. 模拟 Windows 字体2. 强制显示滚动条(模拟 …...
微信小程序执行C语言库的详细方案
以下是微信小程序中执行C语言库的详细技术方案,分为环境准备、开发流程、优化技巧三个部分: 一、环境准备阶段 1. 工具链安装 # 安装Emscripten核心工具链 git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest .…...
如何用分布式防御抵扣大规模DDoS攻击?
DDoS攻击是当前最严峻的网络安全威胁之一,其通过海量请求耗尽目标资源,导致服务瘫痪。面对攻击规模的指数级增长,传统的单点防御已难以应对。本文将结合最新技术趋势,探讨分布式防御体系在抵御大规模DDoS攻击中的核心策略与实践。…...
【MySQL】存储引擎 - MyISAM详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
如何在Jmeter中调用C程序?
在JMeter中调用C语言程序可以通过以下几种方式实现: 方法一:使用OS Process Sampler JMeter的“OS Process Sampler”可以用来调用外部程序,包括C语言编写的可执行文件。 步骤: 准备C语言程序: 编写C语言代码并编译…...
PyTorch 版本、torchvision 版本和 Python 版本的对应关系
PyTorch 版本、torchvision 版本和 Python 版本的对应关系 在深度学习领域,PyTorch 及其配套库 torchvision 的使用极为广泛。但不同版本的 PyTorch、torchvision 与 Python 之间存在严格的对应关系,若版本搭配不当,会导致代码运行出错…...
构建高可维护、易测试的异步任务系统:基于 Celery + Redis + Eventlet 的模块化架构实践
引言:为什么我们需要一个结构清晰的异步任务系统? 在现代软件开发中,异步任务已经成为提升响应性能、解耦业务逻辑、支持高并发的重要手段。尤其对于测试工程师而言,异步任务往往意味着: 任务执行不可控状态追踪困难…...
《智能网联汽车 自动驾驶功能场地试验方法及要求》 GB/T 41798-2022——解读
目录 1. 适用范围与核心目标 2. 试验核心要求 2.1 试验场地与环境 2.2 试验设备与数据采集 2.3 试验车辆要求 3. 试验过程与通过条件 4. 关键试验场景与方法 4.1 交通信号识别及响应 4.2 基础设施与障碍物识别 4.3 行人及非机动车场景 4.4 紧急避险与风险策略 5. 特…...
删除链表倒数第N个节点
Leetcode(19): 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 分析: 首要目标就是找到第N个节点的前一个节点,因为只有通过这个节点(cur)才可进行对…...
创建型模式:抽象工厂(Abstract Factory)模式
一、概念与核心思想 抽象工厂(Abstract Factory)模式是创建型设计模式的重要成员,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式将对象的创建逻辑封装在抽象工厂及其具体实现类中,客户端通过抽象工厂接口获取所需的对象族,实现对象创…...
预训练模型实战手册:用BERT/GPT-2微调实现10倍效率提升,Hugging Face生态下的迁移学习全链路实践
更多AI大模型应用开发学习内容,尽在聚客AI学院。 一. 预训练模型(PTM)核心概念 1.1 什么是预训练模型? 预训练模型(Pre-trained Model, PTM)是在大规模通用数据上预先训练的模型,通过自监督学…...
基于Flink的用户画像 OLAP 实时数仓统计分析
1.基于Flink的用户画像 OLAP 实时数仓统计分析 数据源是来自业务系统的T日数据,利用kakfa进行同步 拼接多个事实表形成大宽表,优化多流Join方式,抽取主键和外键形成主外键前置层,抽取外键和其余内容形成融合层,将4次事…...
php java go python面向对象的设计原则和常用设计模式
一、面向对象设计原则(OOP Design Principles) 是写出高内聚、低耦合、可维护系统的基础,重点是 SOLID 五大原则 其他补充原则。 📌 SOLID 五大设计原则: 原则名称全称核心思想示例关键词S 单一职责原则Single Respo…...
第十三节:图像形态学操作-腐蚀与膨胀
引言 图像形态学是数字图像处理领域中的一个重要分支,它主要研究图像中物体的形状和结构。作为形态学操作的基础,腐蚀(Erosion)和膨胀(Dilation)是两种最核心的操作,广泛应用于图像预处理、特征提取、目标检测等多个领域。OpenCV作为最流行的…...
数据结构 - 9( 位图 布隆过滤器 并查集 LRUCache 6000 字详解 )
一:位图 位图是一种高效的数据结构,它通过比特来表示某个值的存在与否,通常以连续的二进制位数组存储。每个比特位对应一个特定的状态,这种表示方式在内存效率和操作速度上具有显著优势,尤其适用于海量数据、整数以及…...
在Hugging Face网站像Github一样克隆repository到本地的具体步骤
首先我们找到自己想要的仓库,在搜索栏进行搜索 之后我们可以看到这里有三个点,鼠标点击,选择Clone repository 最后按照上面的步骤进行复制粘贴到电脑上执行就行,我们可以看到有两种选择HTTPS和SSH,如果HTTPS不行就选择…...
如何使用Java从PDF文件中提取图像(教程)
Java本身不直接支持PDF文件操作,因此需要使用外部Java PDF库。本教程将向您展示如何通过5个简单步骤,使用JPedal Java PDF库从PDF文件中提取图像。 使用Java从PDF中提取图像 • 将JPedal库添加到您的类路径或模块路径(下载试用版jar文件&…...
通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架
1. 简介 随着日常工作、个人生活和金融操作对智能手机的依赖性不断增强,对弹性安全身份验证系统的需求也日益增长。尽管 PIN 码、密码和静态生物识别等传统身份验证方法仍可为系统提供一定的安全级别,但事实证明,它们容易受到多种威胁,包括敏感数据泄露、网络钓鱼、盗窃和…...
day010
文章目录 1. 在Ubuntu中使用visudo2. 别名 alias2.1 查看已配置的别名2.2 配置grep别名2.3 配置rm别名2.4 临时使用配置别名的命令 3. 系统校验检查3.1 md5校验3.2 aide 高级入侵检测环境3.2.1 安装aide3.2.2 修改aide配置文件3.2.3 根据配置文件生成初始的指纹信息库3.2.4 使用…...
Coco AI 开源应用程序 - 搜索、连接、协作、您的个人 AI 搜索和助手,都在一个空间中。
一、软件介绍 文末提供程序和源码下载 Coco AI 是一个统一的搜索平台,可将您的所有企业应用程序和数据(Google Workspace、Dropbox、Confluent Wiki、GitHub 等)连接到一个功能强大的搜索界面中。此存储库包含为桌面和移动设备构建的 Coco 应…...
MySQL 8.0 OCP(1Z0-908)英文题库(11-20)
目录 第11题题目分析正确答案 第12题题目分析正确答案 第13题题目分析正确答案 第14题题目分析正确答案 第15题题目分析正确答案 第16题题目分析正确答案 第17题题目分析正确答案: 第18题题目分析正确答案 第19题题目分析正确答案 第20题题目分析正确答案 第11题 W…...
国标GB28181软件EasyGBS雪亮工程打造智能高效的视频监控新体系
一、背景 雪亮工程是构建公共安全视频监控联网应用的系统工程,旨在通过整合各类视频监控资源,实现城乡视频监控一体化,提升社会治安防控能力。随着城市化进程的加快和社会治理需求的不断提高,雪亮工程的建设规模不断扩大…...
视频添加字幕脚本分享
脚本简介 这是一个给视频添加字幕的脚本,可以方便的在指定的位置给视频添加不同大小、字体、颜色的文本字幕,添加方式可以直接修改脚本中的文本信息,或者可以提前编辑好.srt字幕文件。脚本执行环境:windowsmingwffmpeg。本方法仅…...