当前位置: 首页 > news >正文

HTML5系列(11)-- Web 无障碍开发指南

前端技术探索系列:HTML5 Web 无障碍开发指南 ♿

致读者:构建人人可用的网络 👋

前端开发者们,

今天我们将深入探讨 Web 无障碍开发,学习如何创建一个真正包容、人人可用的网站。让我们一起为更多用户提供更好的网络体验。

ARIA 角色与属性 🎯

基础 ARIA 实现

<!-- 导航菜单示例 -->
<nav role="navigation" aria-label="主导航"><ul role="menubar"><li role="none"><a role="menuitem" href="/" aria-current="page">首页</a></li><li role="none"><button role="menuitem"aria-haspopup="true"aria-expanded="false"aria-controls="submenu-1">产品</button><ul id="submenu-1" role="menu" aria-hidden="true"><li role="none"><a role="menuitem" href="/products/new">最新产品</a></li></ul></li></ul>
</nav>

动态内容管理

class AccessibleComponent {constructor(element) {this.element = element;this.setupKeyboardNavigation();}// 设置键盘导航setupKeyboardNavigation() {this.element.addEventListener('keydown', (e) => {switch(e.key) {case 'Enter':case ' ':this.activate(e);break;case 'ArrowDown':this.navigateNext(e);break;case 'ArrowUp':this.navigatePrevious(e);break;case 'Escape':this.close(e);break;}});}// 更新 ARIA 状态updateARIAState(element, state, value) {element.setAttribute(`aria-${state}`, value);// 通知屏幕阅读器this.announceChange(`${state} 已更改为 ${value}`);}// 向屏幕阅读器通知变化announceChange(message) {const announcement = document.createElement('div');announcement.setAttribute('aria-live', 'polite');announcement.setAttribute('class', 'sr-only');announcement.textContent = message;document.body.appendChild(announcement);setTimeout(() => announcement.remove(), 1000);}
}

语义化增强 📝

表单无障碍实现

<form role="form" aria-label="注册表单"><div class="form-group"><label for="username" id="username-label">用户名<span class="required" aria-hidden="true">*</span></label><input type="text"id="username"name="username"requiredaria-required="true"aria-labelledby="username-label"aria-describedby="username-help"aria-invalid="false"><div id="username-help" class="help-text">请输入3-20个字符的用户名</div></div><div class="form-group"><label for="password">密码</label><div class="password-input"><input type="password"id="password"name="password"aria-label="密码"aria-describedby="password-requirements"><button type="button"aria-label="显示密码"aria-pressed="false"onclick="togglePassword()">👁️</button></div><div id="password-requirements" class="help-text">密码必须包含字母和数字,长度至少8位</div></div>
</form>

表单验证与反馈

class AccessibleForm {constructor(formElement) {this.form = formElement;this.setupValidation();}setupValidation() {this.form.addEventListener('submit', this.handleSubmit.bind(this));this.form.addEventListener('input', this.handleInput.bind(this));}handleInput(e) {const field = e.target;const isValid = field.checkValidity();field.setAttribute('aria-invalid', !isValid);if (!isValid) {this.showError(field);} else {this.clearError(field);}}showError(field) {const errorId = `${field.id}-error`;let errorElement = document.getElementById(errorId);if (!errorElement) {errorElement = document.createElement('div');errorElement.id = errorId;errorElement.className = 'error-message';errorElement.setAttribute('role', 'alert');field.parentNode.appendChild(errorElement);}errorElement.textContent = field.validationMessage;field.setAttribute('aria-describedby', `${field.getAttribute('aria-describedby') || ''} ${errorId}`.trim());}clearError(field) {const errorId = `${field.id}-error`;const errorElement = document.getElementById(errorId);if (errorElement) {errorElement.remove();const describedBy = field.getAttribute('aria-describedby').replace(errorId, '').trim();if (describedBy) {field.setAttribute('aria-describedby', describedBy);} else {field.removeAttribute('aria-describedby');}}}
}

辅助技术支持 🔍

颜色对比度检查

class ColorContrastChecker {constructor() {this.minimumRatio = 4.5; // WCAG AA 标准}// 计算相对亮度calculateLuminance(r, g, b) {const [rs, gs, bs] = [r, g, b].map(c => {c = c / 255;return c <= 0.03928? c / 12.92: Math.pow((c + 0.055) / 1.055, 2.4);});return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;}// 计算对比度calculateContrastRatio(color1, color2) {const l1 = this.calculateLuminance(...this.parseColor(color1));const l2 = this.calculateLuminance(...this.parseColor(color2));const lighter = Math.max(l1, l2);const darker = Math.min(l1, l2);return (lighter + 0.05) / (darker + 0.05);}// 解析颜色值parseColor(color) {const hex = color.replace('#', '');return [parseInt(hex.substr(0, 2), 16),parseInt(hex.substr(2, 2), 16),parseInt(hex.substr(4, 2), 16)];}// 检查对比度是否符合标准isContrastValid(color1, color2) {const ratio = this.calculateContrastRatio(color1, color2);return {ratio,passes: ratio >= this.minimumRatio,level: ratio >= 7 ? 'AAA' : ratio >= 4.5 ? 'AA' : 'Fail'};}
}

字体可读性增强

/* 基础可读性样式 */
:root {--min-font-size: 16px;--line-height-ratio: 1.5;--paragraph-spacing: 1.5rem;
}body {font-family: system-ui, -apple-system, sans-serif;font-size: var(--min-font-size);line-height: var(--line-height-ratio);text-rendering: optimizeLegibility;
}/* 响应式字体大小 */
@media screen and (min-width: 320px) {body {font-size: calc(var(--min-font-size) + 0.5vw);}
}/* 提高可读性的文本间距 */
p {margin-bottom: var(--paragraph-spacing);max-width: 70ch; /* 最佳阅读宽度 */
}/* 链接可访问性 */
a {text-decoration: underline;text-underline-offset: 0.2em;color: #0066cc;
}a:hover, a:focus {text-decoration-thickness: 0.125em;outline: 2px solid currentColor;outline-offset: 2px;
}/* 焦点样式 */
:focus {outline: 3px solid #4A90E2;outline-offset: 2px;
}/* 隐藏元素但保持可访问性 */
.sr-only {position: absolute;width: 1px;height: 1px;padding: 0;margin: -1px;overflow: hidden;clip: rect(0, 0, 0, 0);border: 0;
}

实践项目:无障碍审计工具 🛠️

审计工具实现

class AccessibilityAuditor {constructor() {this.issues = [];}// 运行完整审计async audit() {this.issues = [];// 检查图片替代文本this.checkImages();// 检查表单标签this.checkForms();// 检查标题层级this.checkHeadings();// 检查颜色对比度await this.checkColorContrast();// 检查键盘可访问性this.checkKeyboardAccess();return this.generateReport();}// 检查图片替代文本checkImages() {const images = document.querySelectorAll('img');images.forEach(img => {if (!img.hasAttribute('alt')) {this.addIssue('error', 'missing-alt', '图片缺少替代文本', img);}});}// 检查表单标签checkForms() {const inputs = document.querySelectorAll('input, select, textarea');inputs.forEach(input => {if (!input.id || !document.querySelector(`label[for="${input.id}"]`)) {this.addIssue('error', 'missing-label','表单控件缺少关联标签', input);}});}// 检查标题层级checkHeadings() {const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');let lastLevel = 0;headings.forEach(heading => {const currentLevel = parseInt(heading.tagName[1]);if (currentLevel - lastLevel > 1) {this.addIssue('warning', 'heading-skip','标题层级跳过', heading);}lastLevel = currentLevel;});}// 检查颜色对比度async checkColorContrast() {const contrastChecker = new ColorContrastChecker();const elements = document.querySelectorAll('*');elements.forEach(element => {const style = window.getComputedStyle(element);const backgroundColor = style.backgroundColor;const color = style.color;const contrast = contrastChecker.isContrastValid(backgroundColor, color);if (!contrast.passes) {this.addIssue('warning', 'low-contrast','颜色对比度不足', element);}});}// 检查键盘可访问性checkKeyboardAccess() {const interactive = document.querySelectorAll('a, button, input, select, textarea');interactive.forEach(element => {if (window.getComputedStyle(element).display === 'none' ||element.offsetParent === null) {return;}const tabIndex = element.tabIndex;if (tabIndex < 0) {this.addIssue('warning', 'keyboard-trap','元素不可通过键盘访问', element);}});}// 添加问题addIssue(severity, code, message, element) {this.issues.push({severity,code,message,element: element.outerHTML,location: this.getElementPath(element)});}// 获取元素路径getElementPath(element) {let path = [];while (element.parentElement) {let selector = element.tagName.toLowerCase();if (element.id) {selector += `#${element.id}`;}path.unshift(selector);element = element.parentElement;}return path.join(' > ');}// 生成报告generateReport() {return {timestamp: new Date().toISOString(),totalIssues: this.issues.length,issues: this.issues,summary: this.generateSummary()};}// 生成摘要generateSummary() {const counts = {error: 0,warning: 0};this.issues.forEach(issue => {counts[issue.severity]++;});return {errors: counts.error,warnings: counts.warning,score: this.calculateScore(counts)};}// 计算无障碍得分calculateScore(counts) {const total = counts.error + counts.warning;if (total === 0) return 100;const score = 100 - (counts.error * 5 + counts.warning * 2);return Math.max(0, Math.min(100, score));}
}

使用示例

// 初始化审计工具
const auditor = new AccessibilityAuditor();// 运行审计
async function runAudit() {const results = await auditor.audit();displayResults(results);
}// 显示结果
function displayResults(results) {const container = document.getElementById('audit-results');container.innerHTML = `<div class="audit-summary"><h2>无障碍审计结果</h2><p>得分: ${results.summary.score}</p><p>错误: ${results.summary.errors}</p><p>警告: ${results.summary.warnings}</p></div><div class="audit-issues">${results.issues.map(issue => `<div class="issue ${issue.severity}"><h3>${issue.message}</h3><code>${issue.location}</code><pre><code>${issue.element}</code></pre></div>`).join('')}</div>`;
}// 运行审计
runAudit();

最佳实践建议 💡

  1. 开发原则

    • 渐进增强
    • 键盘优先
    • 语义化优先
    • 清晰的反馈
  2. 测试策略

    • 使用多种屏幕阅读器
    • 键盘导航测试
    • 自动化测试
    • 用户测试
  3. 文档规范

    • 清晰的 ARIA 标签
    • 完整的替代文本
    • 有意义的链接文本
    • 合适的标题层级

写在最后 🌟

Web 无障碍不仅是一种技术要求,更是一种社会责任。通过实施这些最佳实践,我们可以创建一个更加包容的网络环境。

进一步学习资源 📚

  • WCAG 2.1 指南
  • WAI-ARIA 实践指南
  • A11Y Project
  • WebAIM 资源

如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

HTML5系列(11)-- Web 无障碍开发指南

前端技术探索系列&#xff1a;HTML5 Web 无障碍开发指南 ♿ 致读者&#xff1a;构建人人可用的网络 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 Web 无障碍开发&#xff0c;学习如何创建一个真正包容、人人可用的网站。让我们一起为更多用户提供更好的网络…...

信号和槽思维脑图+相关练习

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…...

Scala编程基础:模式匹配、解构赋值与正则表达式

在Scala编程语言中&#xff0c;模式匹配、解构赋值和正则表达式是三个非常强大的特性&#xff0c;它们可以让我们以更简洁、更直观的方式处理数据。本文将通过三个示例&#xff0c;详细解释这些特性的使用方法和背后的原理。 1. 模式匹配与case class 模式匹配是Scala中处理数…...

【大数据技术基础】 课程 第1章 大数据技术概述 大数据基础编程、实验和案例教程(第2版)

第1章 大数据技术概述 1.1 大数据时代 这本书的标题是《大数据时代》&#xff0c;副标题为“生活、工作与思维的大变革”。这本书由维克托迈尔-舍恩伯格&#xff08;Viktor Mayer-Schnberger&#xff09;和肯尼斯库克耶&#xff08;Kenneth Cukier&#xff09;合著&#xff0c…...

【基础分析】——宏参数连接

示例1&#xff1a; #include<stdio.h>#define STR1(s) #s#define FUN1(a,b) (int)(a##e##b)int main(int argv, char* agrc[]) {printf(STR1(king...));printf("\n");printf("%d\n", FUN1(2, 3));return 0; } 结果&#xff1a; &#xff08;注&…...

算法3--二分查找

二分查找 原理经典例题[704. 二分查找](https://leetcode.cn/problems/binary-search/)[34. 在排序数组中查找元素的第一个和最后一个位置](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/)[35. 搜索插入位置](https://leetcode.cn/p…...

【信息系统项目管理师】第7章:项目立项管理 考点梳理

文章目录 7.1 项目建议与立项申请7.2 项目可行性研究7.2.1 可行性研究的内容7.2.2 初步可行性研究7.2.3 详细可行性研究&#xff08;重点&#xff09; 7.3 项目评估与决策 【学习建议】本章大概考选择题2分左右&#xff0c;有可能考案例题。论文早年考过。本章知识点比较集中&a…...

帝可得-策略管理

策略管理 需求说明 策略管理主要涉及到二个功能模块&#xff0c;业务流程如下&#xff1a; 新增策略: 允许管理员定义新的策略&#xff0c;包括策略的具体内容和参数&#xff08;如折扣率&#xff09;策略分配: 将策略分配给一个或多个售货机。 #mermaid-svg-PSQOJMLJqVGn3W…...

opencv-android编译遇到的相关问题处理

1、opencv-android sdk下载 下载地址&#xff1a;https://opencv.org/releases/ 下载安卓SDK即可 2、解压下载好的SDK 3、导入opencv的SDK到安卓项目中 导入步骤在/OpenCV-android-sdk/sdk/build.gradle文件的注释中写的非常详细&#xff0c;大家可安装官方给出的步骤导入。…...

汽车IVI中控开发入门及进阶(三十六):QML调用蓝牙sdk的架构

Qt/QML本身在做GUI界面工程时,除了各种界面上的按钮、图片、工具条等元素之外,最方便的就是可以通过C++实现界面各种复杂逻辑,而实现上不可避免就需要一些外部库的支持,不管是静态库.a还是动态库.so,比如蓝牙模块。 而QML/C++启动一个蓝牙协议栈SDK作为一个进程,然后启动…...

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合&#xff0c;随着外部客户程序和各子系统的演化&#xff0c;这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口&#xff1f;如何将外部客户程序的演化和内部子系统…...

前缀和篇——繁星斗斗数字交织中,觅得效率明月辉光(1)

前言 在这片无边无际的数字海洋中&#xff0c;如何从中提取出有价值的讯息&#xff0c;成为了计算机科学中的一项重要课题。前缀和算法&#xff0c;作为一种巧妙的技术&#xff0c;恰如其名——通过计算序列中各个元素的前缀和&#xff0c;能够为我们提供一种高效的查询方式&a…...

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...

Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币

Secured Finance 是新一代 DeFi 2.0 协议&#xff0c;其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划&#xff0c;以助力 Filecoin 构建更强大的去中心化金融生态体系&#xff0c;并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…...

2024前端框架年度总结报告(二):新生qwik+solid和次新生svelte+Astro对比 -各自盯着前端的哪些个痛点 - 前端的区域发展差异

引言 2024年&#xff0c;前端开发依然是技术领域的热点之一。随着 Web 应用的日益复杂&#xff0c;前端框架的更新换代也加速了。尽管 React、Vue 和 Angular 老牌框架年度总结 等“老牌”框架仍然占据着主流市场&#xff0c;但一些新兴的框架在不断挑战这些“巨头”的地位&am…...

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…...

每日速记10道java面试题13-MySQL篇

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户&#xff0c; 目前我在网上搜集了一些资料&#xff0c;也做了一些尝试。 就我个人总结的经验来讲&#xff0c;分享大家以下几种办法&#xff1a; 1.书签同步插件 点击如下&#x1f517;&#xff1a; Chrome书签同步https://bm.famend.cn/ …...

江南大学《2024年807自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《江南大学807自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

在VSCode中搭建Python开发环境

在VSCode中搭建Python开发环境 1、安装 首先确保电脑已经安装好Python和VSCode。 2、安装VSCode的Python插件 3、选择python解释器 ctrlshiftP打开VSCode的命令行&#xff0c;输入python: select Interpreter选择合适的python版本。 4、运行代码 在windows下你可以直接使用…...

mac 安装python3和配置环境变量

mac 安装python3和配置环境变量 前言怎样选择python3的版本python3的安装1、去官网下载安装包2、下载完成后直接解压,检查安装是否成功 前言 在学习python的第一步就是安装它和配置他的环境变量&#xff0c;那么选择哪个版本的python你可曾知道&#xff0c;下面就讲解怎样选择…...

微信小程序版小米商城的搭建流程详解!

很多初学微信小程序语法的同学&#xff0c;可能不知道如何布局和搭建一个项目&#xff0c;下面我将讲解初学者如何搭建项目和注意事项。 一、 app.json的配置 {"pages": ["pages/index/index","pages/classification/classification","pag…...

Redis等Spring Cache 框架 实现基于注解的缓存功能

Spring Cache 框架 实现基于注解的缓存功能 底层 基于代理技术 一旦进入方法就进入代理对象 如果redis里有就直接返回 不会走方法 如果缓存没有数据 则通过反射走方法。 概念 缓存 相当于之前的事务处理 同步更改 只是提供了一层抽象 底层可以切换不同的缓存实现 EHCach…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

【Linux】基础IO_文件系统IO_“一切皆文件”_缓冲区

目录 1. 理解"⽂件" 1-1 狭义理解 1-2 ⼴义理解 1-3 ⽂件操作的归类认知 1-4 系统⻆度 访问文件&#xff0c;需要先打开文件&#xff01;那么是由谁打开文件&#xff1f;&#xff1f;&#xff1f; 操作系统要不要把被打开的文件管理起来&#xff1f; 2. 回顾…...

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…...

Mnesia(三)

在表中保存复杂数据 Mnesia是被设计用来保存Erlang数据结构的。可以把任意类型的Erlang数据结构保存到Mnesia表中。 -export([init_mnesia_schema/0, start/0]). -export([add_plans/0, get_plan/1]). -include_lib("stdlib/include/qlc.hrl"). -record(shop, {ite…...

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…...

【WPF中ControlTemplate 与 DataTemplate之间的区别?】

前言 WPF中ControlTemplate 与 DataTemplate之间的区别&#xff1f; 1. 定义&#xff1a; ControlTemplate 是用于定义 WPF 控件的外观和结构的模板。它允许您重新定义控件的视觉表现&#xff0c;而不改变控件的行为。 DataTemplate 是用于定义如何呈现数据对象的模板。它通…...

FFmpeg源码中,计算CRC校验的实现

一、CRC简介 CRC(Cyclic Redundancy Check)&#xff0c;即循环冗余校验&#xff0c;是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法&#xff0c;主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理&#xff0c;实现错误侦…...

js面试题

面试题&#xff1a;说一下call、apply、bind区别 共同点&#xff1a;功能一致 可以改变this指向 语法&#xff1a;函数.call() 函数.apply() 函数.bind() 区别&#xff1a;1.call、apply可以立即执行。bind不会立即执行&#xff0c;因为bind返回的是一个函数需要加入&#xff…...

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…...

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…...

【计算机网络】实验10:开放最短路径优先OSPF

实验10 开放最短路径优先OSPF 一、实验目的 本实验的主要目的是验证OSPF&#xff08;开放最短路径优先&#xff09;协议的作用&#xff0c;深入理解其在动态路由中的重要性。通过实验&#xff0c;我们将观察OSPF如何在网络中高效地传播路由信息&#xff0c;从而实现不同网络之…...

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习&#xff0c;感谢大家的支持&#xff01;欢迎大家踊跃评论&#xff0c;感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…...

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…...

【模板】排序(py)/ 【深基9.例4】求第 k 小的数

题目描述 将读入的 NN 个数从小到大排序后输出。 输入格式 第一行为一个正整数 NN。 第二行包含 NN 个空格隔开的正整数 aiai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 NN 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 输…...

Linux获取文件属性

目录 stat函数 获取文件属性 获取文件权限 实现“head -n 文件名”命令的功能 编程实现“ls -l 文件名”功能 stat/fstat/lstat的区别&#xff1f; stat函数 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性 参数&#xff1a; path&…...

一文说清:Git创建仓库的方法

0 引言 本文介绍如何创建一个 Git 本地仓库&#xff0c;以及与远程仓库的关联。 1 初始化仓库&#xff08;git init&#xff09; 1.1 概述 Git 使用 git init 命令来初始化一个 Git 仓库&#xff0c;Git 的很多命令都需要在 Git 的仓库中运行&#xff0c;所以 git init 是使…...

ASP.NET Core 负载/压力测试

文章目录 一、第三方工具二、使用发布版本进行负载测试和压力测试 负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。 尽管负载测试和压力测试的某些测试相似&#xff0c;但它们的目标不同。 负载测试&#xff1a;测试应用是否可以在特定情况下处理指定的用户负…...

红日靶场vulnstack (五)

前言 好久没打靶机了&#xff0c;今天有空搞了个玩一下&#xff0c;红日5比前面的都简单。 靶机环境 win7&#xff1a;192.168.80.150(外)、192.168.138.136(内) winserver28&#xff08;DC&#xff09;&#xff1a;192.168.138.138 环境搭建就不说了&#xff0c;和之前写…...

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…...

【人工智能】用Python和Scikit-learn构建集成学习模型:提升分类性能

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 集成学习(Ensemble Learning)是通过组合多个弱学习器提升模型性能的机器学习方法,广泛应用于分类、回归及其他复杂任务中。随机森林(Random Forest)和梯度提升(Gradient Boosting)是集成学习的两种…...

MSBUILD : error MSB1009: 项目文件不存在。

环境&#xff1a;win10 vscode1.95.3 clang15.0.4 问题&#xff1a;最近用vscodecmakeclang在windows上编译c项目&#xff0c;用mingw32不报错&#xff0c;用clang报错,错误如下&#xff0c; MSBUILD : error MSB1009: 项目文件不存在。 原因&#xff1a;与其他生成器(如Mak…...

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…...

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…...

工业—使用Flink处理Kafka中的数据_ProduceRecord1

1 、 使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据&#xff0c;统计在已经检验的产品中&#xff0c;各设备每 5 分钟 生产产品总数&#xff0c;将结果存入Redis 中&#xff0c; key 值为 “totalproduce” &#xff0c; value 值为 “ 设备 id &#xff0c;最近五分钟生…...

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…...

响应式编程一、Reactor核心

目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1&#xff09;几个实际的问题2&#xff09;Reactive-Stream是什么&#xff1f;3&#xff09;核心接口4&#xff09;处理器 Processor5&#xff09;总结 二、Reactor核心1、Reactor1&…...