- 博客(57)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注
原创 Vscode自动补全利器Continue
摘要 Continue 是一款开源 AI 编程助手,支持 VSCode 和 JetBrains,最大特点是允许用户自定义自动补全模型。相比 GitHub Copilot 仅支持官方模型且收费高昂,Continue 可自由接入 OpenAI、Anthropic 等第三方 API 或本地模型,特别适合已有多个 Coding Plan 的用户。它提供自动补全、对话和代码编辑三大核心功能,通过简单的 YAML 配置文件即可实现模型切换,其中自动补全需使用专门的 Coder 模型(如 Qwen2.5-Coder)。C
2026-06-24 12:40:10
1116
原创 解决中文 Windows 下 AI 编程工具中文乱码问题
中文Windows下AI编程工具中文乱码问题解决方案 问题背景: 中文版Windows默认使用GBK编码,而现代AI编程工具(如Claude Code、Codex CLI等)普遍采用UTF-8编码,导致终端读取文件时中文内容出现乱码,严重影响AI理解代码和生成质量。 问题根源: Windows PowerShell默认使用GBK(936)编码,与AI工具使用的UTF-8编码冲突,使得中文文本被错误解码。 最佳解决方案: 进入Windows设置→时间和语言→语言和区域 点击"管理语言设置" 在"区域"窗口中选
2026-06-10 17:09:20
900
2
原创 让 AI 精准获取在线 Icon 图标
本文介绍了如何通过iconify-mcp-server工具解决AI前端开发中的图标选择难题。文章首先分析了当前AI开发中图标使用的三大痛点:默认使用Emoji、手动指定效率低、无法在线检索。然后重点介绍了Iconify平台,这是一个包含20多万个开源矢量图标的聚合平台,支持多种前端框架和设计工具。 文章详细讲解了iconify-mcp-server的安装配置方法,包括在Claude Code、Cursor和Windsurf等工具中的具体设置步骤。该工具提供四个核心功能:获取图标集列表、查看指定图标集详情、关
2026-05-19 11:36:54
519
原创 Linux工控机屏幕亮度控制方法— 从踩坑到DDC协议
Linux工控机屏幕亮度控制方案总结 本文介绍了在Linux工控机上实现屏幕亮度控制的多种方案及其效果: 传统方案失败:sysfs节点、xbacklight和xrandr等方法对VGA外接显示器无效或无法真正节能 成功方案:采用DDC/CI协议直接控制显示器物理背光 通过ddcutil工具实现亮度调节 需要加载i2c-dev内核模块 支持读取和设置亮度(0x10 VCP特性码) 节能效果:实测最低亮度比最高亮度降低约60%功耗 实现方式: 命令行控制特定显示器亮度 支持批量控制多台显示器 提供C语言直接操作
2026-05-07 17:37:19
667
原创 Windows 平台 C++ 开发实战
本文总结了Windows平台C++开发的核心实战经验,主要包括:1) DLL与静态库的制作与调试技巧,包括Windows/Linux下的编译方法;2) Windows服务编程模型(ServiceMain + CtrlHandler)的实现;3) 内存泄漏检测技术,涵盖堆内存和系统资源泄漏;4) Bloom过滤器的实现原理与应用。这些内容源自作者10年的开发经验总结,涵盖了Windows平台C++开发中最常见的技术难点和解决方案,具有很高的实用参考价值。
2026-05-07 01:43:48
269
原创 BeeGFS 安装部署完全指南:从架构设计到性能调优
高聚合带宽:通过并行 I/O 实现极高吞吐量弹性扩展:可在线增加 Storage 和 Metadata 服务器,容量和性能线性增长** POSIX 兼容**:提供标准的文件系统接口,无需修改应用程序无元数据服务器瓶颈:元数据分散到多个 Metadata 服务器BeeGFS 的核心理念是"分离与并行"——将管理服务、元数据服务和存储服务分离开来,每种服务都可以独立扩展。架构清晰:Management/Metadata/Storage/Client 四种服务各司其职,独立扩展安装简便。
2026-05-06 00:49:04
500
原创 Ceph 分布式存储完全指南:从架构原理到实战部署
RBD(RADOS Block Device)是基于 RADOS 实现的块设备驱动,为虚拟机提供块级别的存储服务。RBD 将块设备镜像条带化为多个对象存储在 RADOS 中。RBD Mirror 是实现远程备份和容灾的机制,主要针对不同集群之间的镜像备份。Ceph OSD Pool 的 Replication:同一个集群内的高可用机制RBD Mirror:不同集群间的异地容灾纠删码(Erasure Coding)是一种数据保护方法,将数据分割成片段,进行扩展和编码,并存储在不同的位置。
2026-05-06 00:48:50
255
原创 ThunderStor集群部署实战:从零构建分布式存储系统
│ 客户端访问层 ││ NFS客户端 / CIFS(Samba)客户端 ││ 高可用层 ││ CTDB + VIP(虚拟IP) ││ 协议导出层 ││ 分布式卷层 ││ 存储池层 ││ ZFS Pool(RAIDZ1条带化) ││ 物理存储层 ││ SSD/HDD 磁盘阵列 ││ 数据库层 ││ Cassandra(集群元数据管理) ││ 管理层 │组件作用说明ZFS存储池管理提供RAIDZ、压缩、去重、快照等高级功能GlusterFS分布式文件系统。
2026-05-06 00:48:35
272
原创 GlusterFS 架构与源码解析:从Translator树到卷类型详解
无元数据服务器:不像 HDFS 或 CephFS 依赖专用的元数据节点,GlusterFS 采用无中心架构,所有节点完全对等弹性哈希算法:使用 Davies-Meyer 算法进行数据定位,避免了元数据服务器的性能瓶颈Translator 机制:通过模块化的 Translator(翻译器)堆叠实现功能扩展,类似于 Linux 内核的模块机制全局命名空间:将所有存储资源聚合为一个统一的命名空间线性扩展:性能和容量可以随节点增加而线性增长│ Client 端 ││ RPC│ Server 端 │。
2026-05-06 00:48:20
211
原创 CTDB 集群高可用方案:从架构原理到实战部署
CTDB(Cluster Trivial Database)是一个轻量级的集群服务器实现,其核心定位是提供一个简单高效的 HA(High Availability)集群解决方案。TDB 数据库集群化:提供 TDB(Trivial Database)数据库的集群版本,在节点故障时自动重建和恢复数据库服务和节点监控:监视集群中的节点和运行在每个节点上的服务(NFS、Samba 等)公共 IP 管理:管理用于向客户端提供服务的公共 IP 地址池,实现故障转移。
2026-05-06 00:48:04
242
原创 AI 工具与 AIGC 实战指南:从本地大模型到智能开发全链路
DeepSeek 是近年来最受关注的国产大语言模型之一,尤其是其 DeepSeek-R1 系列在推理能力上表现亮眼,引发了全民热议。对于开发者而言,DeepSeek 的开源策略意味着我们可以将其部署到本地环境,实现数据的完全自主可控。目前 DeepSeek 提供了多种参数规模的模型(如 1.5B、7B、8B、14B、32B、70B 等),开发者可以根据自身硬件条件选择合适的版本。模型参数量推荐显存适用场景1.5B / 7B4-8 GB个人学习、轻量对话8B / 14B8-16 GB。
2026-05-05 00:23:08
1064
原创 GCC编译与库制作指南
静态库(Static Library)在 Linux 下以.a为后缀,Windows 下以.lib为后缀。静态库本质上是一组目标文件(.o)的打包集合。程序在编译链接时将静态库的代码复制到可执行文件中。优点:程序运行时不依赖库文件。缺点:空间浪费,每个程序都包含一份库的拷贝;库更新时需要重新编译所有依赖程序。动态库(Shared Library)在 Linux 下以.so为后缀,Windows 下以.dll为后缀。动态库在程序运行时才加载,多个程序可以共享一份动态库拷贝,节省内存空间。优点。
2026-05-05 00:19:36
351
原创 ODB与SQLite数据库开发指南:从ORM映射到CRUD实战
SQLite是一个轻量级的嵌入式关系型数据库,不需要独立的服务器进程,整个数据库存储在单个跨平台的磁盘文件中。它被广泛应用于移动应用、桌面软件、嵌入式系统、浏览器等场景。特性说明零配置无需安装和配置,直接使用单文件存储整个数据库存储在一个文件中跨平台支持Windows、Linux、macOS等事务支持支持ACID事务轻量级核心库约500KB嵌入式无需独立服务进程,直接嵌入应用ODB是一个开源的、跨平台的、跨数据库的C++ORM(对象关系映射)框架。
2026-05-05 00:18:25
220
原创 MySQL 基础与 C 语言开发实战
函数功能初始化连接句柄连接到 MySQL 服务器执行 SQL 语句获取完整结果集逐行获取结果获取结果行数获取字段数释放结果集内存关闭连接获取错误信息运维层:安装、配置、用户权限管理、性能监控SQL 层:CRUD、聚合查询、联表查询、子查询、事务控制编程层:C API 调用、连接池管理、ORM 框架掌握这三个层次,就能在实际项目中游刃有余地使用 MySQL。特别是在 C/C++ 开发中,理解 MySQL C API 的正确使用方式和注意事项,能够避免很多难以排查的线上问题。
2026-05-05 00:17:52
211
原创 Windows 包管理工具指南
在 Linux 下我们有aptyumpacman等成熟的包管理器,一行命令即可完成软件的安装、更新和卸载。Windows 平台长期以来缺乏官方的包管理方案,开发者不得不手动下载安装包或依赖第三方工具。近年来这一局面已大幅改善,目前 Windows 上主流的包管理工具有winget(微软官方)、Scoop和Chocolatey三款。本文将逐一介绍它们的特点、适用场景和基本用法,帮助你选择最适合自己的工具。winget。
2026-05-05 00:17:27
305
原创 Visual Studio跨平台开发指南
PDB(Program Database)文件是 Visual Studio 生成的调试符号文件,包含了源代码与二进制代码之间的映射关系。有了 PDB 文件,才能在调试器中看到变量名、函数名和源代码行号。跨平台开发:利用 VS 的 Linux 项目模板,可以在 Windows 上编写和调试 Linux 程序DLL 开发:理解机制和伴随的 LIB 符号表文件环境变量:使用等变量配置路径,确保项目可移植内存检测:善用crtdbg.h工具,在开发阶段就发现内存泄漏服务编程。
2026-05-04 14:28:41
404
原创 Git与SVN版本控制实战
SVN(Subversion)是一款集中式版本控制系统。Subversion:SVN 服务器端:SVN 客户端(Windows 图形界面)SVN 客户端使用缓存机制,第一次连接某个服务器时需要清空之前的缓存。Git适合分布式团队、开源项目、需要频繁分支管理的场景SVN适合集中管理、权限控制严格的企业项目Gitclonecommitpushpull基本操作、stash暂存修改、裸仓库搭建、SSH 密钥配置SVN:本地库和网络库搭建、导入检出、分支标签管理、冲突解决流程冲突解决:Git 的。
2026-05-04 14:28:04
226
原创 GDB调试完全指南
GDB 是 C/C++ 开发者必须掌握的调试工具。编译时加-g– 这是使用 GDB 的前提设置断点– 在关键位置暂停程序单步跟踪– 用nextstep逐步执行查看变量– 用printdisplay观察数据变化回溯调用栈– 用backtrace定位问题多线程调试– 用控制线程段错误调试是最常见的 GDB 应用场景,记住 “run + backtrace” 这个黄金组合,可以快速定位绝大多数崩溃问题。
2026-05-04 14:27:47
590
原创 程序的链接、装载与库:从源码到可执行文件的底层奥秘
编译四步骤:预编译(cpp)处理宏和头文件,编译(cc1)生成汇编代码,汇编(as)生成目标文件,链接(ld)合并目标文件生成可执行文件。ELF 文件格式:理解 ELF 的段结构(.text、.data、.bss、.rodata、.symtab 等)是二进制分析的基础。动态库版本管理:soname/realname/linker-name 三级命名,结合 ldconfig 管理符号链接。符号版本与兼容性:GLIBC 通过符号版本实现多版本共存,保证向后兼容但不保证向前兼容。动态库搜索与调试。
2026-05-04 14:27:11
507
原创 Vue.js 快速入门指南
<button @click="register()">注册</button>methods: {console.log('注册按钮被点击了');
2026-05-04 14:26:50
342
原创 流媒体与视频监控技术基础:从视频采集到播放的全链路解析
RTSP(Real Time Streaming Protocol,实时流传输协议)是视频监控领域最核心的流媒体协议之一。它是一个应用层协议,用于控制实时数据的传输,通常与 RTP/RTCP 配合使用。支持实时流传输,延迟低支持流控制(播放、暂停、快进等)兼容性好,大多数 IPC 和 NVR 都支持可以被 FFmpeg、VLC 等工具直接调用FFmpeg 是一套开源的音视频处理工具集,支持几乎所有的音视频格式和协议。在视频监控领域,FFmpeg 是开发者不可或缺的工具。
2026-05-03 00:09:03
557
原创 ARM汇编指令集详解
常见的处理器架构包括:51/52、ARM、x86、PPC(Power PC)、MIPS 等。ARM 采用的是RISC(精简指令集)架构。RISC 与 CISC 的区别特性RISC(精简指令集)CISC(复杂指令集)指令长度所有指令长度一致指令长度不一致指令数量少,只保留常用指令多,包含复杂指令执行周期大多数指令一个周期指令执行周期不等代表x86架构基础:了解了 ARM 处理器的 RISC 架构特点、工作模式、流水线机制。
2026-05-03 00:07:52
546
原创 Linux文件系统与IO编程
文件类型与inode:理解"一切皆文件"的设计哲学,inode是文件的唯一标识基本IO操作:掌握open/read/write/close/lseek的系统调用和使用细节文件描述符管理:理解fd的分配规则,熟练使用dup/dup2进行重定向内存映射mmap:高效的文件访问方式,适合处理大文件文件控制fcntl:灵活管理文件属性,实现非阻塞IO和文件锁文件属性stat:获取文件元数据,判断文件类型和权限空洞文件:lseek可以超过文件大小,产生用\0填充的空洞。
2026-05-03 00:04:30
432
原创 Linux系统管理命令大全
Linux系统管理涉及的知识面非常广泛,从基础的文件操作到高级的LVM管理、网络配置和安全加固。文件系统:理解ext4/xfs/btrfs等文件系统特性,掌握LVM逻辑卷管理包管理:熟练使用不同发行版的包管理命令(apt/dnf/pacman/zypper/apk)权限安全:文件权限管理、SSH密钥认证、UFW防火墙配置系统运维:计划任务、进程管理、网络配置、服务管理编辑器:Vim高效操作与宏录制。
2026-05-03 00:03:14
724
原创 Linux 内核学习笔记:从零搭建内核开发与调试环境
Linux 内核是操作系统的核心组件,负责管理硬件资源、进程调度、内存管理、文件系统和设备驱动等功能。学习内核开发的第一步,是搭建一个安全、可重复的实验环境,而 QEMU 模拟器就是最理想的选择。为什么要学习内核?深入理解操作系统的运行原理排查系统底层的性能问题和故障开发内核模块或设备驱动进行安全研究和系统优化[图片占位符:Linux 内核架构层次图]-accel tcgQEMU 模拟器:提供了安全、可重复的内核调试环境,无需真实硬件。内核编译:从到。
2026-05-03 00:01:49
670
原创 Linux网络编程从入门到精通
协议基础:深入理解了 TCP 的三次握手/四次挥手、可靠传输机制,以及 UDP 的轻量高效特性。Socket API:掌握了从socket()到close()的完整编程接口,包括地址结构、字节序转换等基础知识。TCP/UDP 编程:给出了完整的服务端/客户端示例代码,可以直接作为项目开发的模板。I/O 复用:对比了 select/poll/epoll 三种机制,epoll 配合边沿触发是高并发场景的最优选择。五种 I/O 模型:理解了阻塞、非阻塞、I/O 复用、信号驱动、异步 I/O 的本质区别。
2026-05-02 23:57:41
394
原创 Linux进程与线程编程详解
IPC方式特点适用场景管道(pipe)半双工,亲缘进程间父子进程通信命名管道(FIFO)可用于任意进程无亲缘关系的进程通信消息队列有格式,可按类型接收需要消息分类的场景共享内存速度最快大量数据传输信号量计数器,同步互斥资源访问控制信号异步通知事件通知、异常处理共享内存是进程间通信最高效的方法,但需要信号量配合实现同步控制。进程基础:掌握了fork()execwait系列函数的用法,理解了进程的创建、替换和回收机制。进程间通信。
2026-05-02 23:52:57
370
原创 C++ STL标准模板库详解
vector是一种动态数组,能自动管理内存,支持随机访问。在尾部插入和删除元素的时间复杂度为 O(1),在中间或头部操作为 O(n)。deque(Double-Ended Queue)与vector类似,支持随机访问,但额外支持在头部高效插入和删除。list是由节点组成的双向链表,不支持随机访问(没有operator[]),但在任意位置插入和删除元素的时间复杂度都是 O(1)。set是有序的唯一元素集合,底层实现为红黑树。元素既充当数据又充当关键字,最大的特点是元素唯一且自动排序。map。
2026-05-02 23:47:06
525
原创 C++面向对象编程完全指南
C++ 面向对象编程是一个庞大而精密的体系。从基本的类定义到高级的模板元编程,从简单的对象构造到复杂的虚函数机制,每一个知识点都在实际工程中扮演着重要角色。深入理解构造函数体系(默认、拷贝、移动、赋值),避免浅拷贝陷阱善用explicitoverridefinal等关键字增强代码安全性理解虚函数表和动态绑定机制,正确实现多态优先使用智能指针管理资源,注意循环引用问题合理使用模板实现泛型编程,同时关注特化技术frasight/C++笔记.cpp, hhjt/otherNotes.cpp。
2026-05-02 19:29:51
457
原创 Poco 与 libevent 网络编程
对比维度Pocolibevent定位全功能后端框架轻量级事件驱动库学习成本中等较低功能覆盖数据库、Redis、HTTP、串口等专注网络 I/O 和定时器性能模型SocketReactor(Reactor 模式)事件驱动(epoll/kqueue)适用场景后端服务全栈开发高性能网络 I/O 场景在实际项目中,可以根据需求选择:如果需要完整的后端框架(含数据库、HTTP 等),选择 Poco;如果只需要高性能的网络 I/O 处理,libevent 是更轻量的选择。
2026-05-02 19:28:30
633
原创 C语言核心知识点详解
对于32位系统,默认采用4字节对齐;64位系统采用8字节对齐。内存对齐是一种空间换时间的策略,便于CPU高效访问数据。char ch;// 1 字节short s;// 2 字节int i;// 4 字节// sizeof = 8,成员按大小排列,浪费较少char ch;// 1 字节 + 3 字节填充int a;// 4 字节short s;// 2 字节 + 2 字节填充// sizeof = 12,排列不佳导致更多填充[图片占位符:两种结构体内存布局对比图]声明。
2026-05-01 16:49:00
397
原创 Golang 基础与实战笔记:从语法到微服务的全面指南
Go 语言(又称 Golang)是 Google 于 2009 年推出的一种静态强类型、编译型语言。在不损失应用程序性能的情况下降低代码的复杂性。Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C 或 C++ 代码的速度,而且更加安全、支持并行进程。Web 服务器和存储集群等巨型中央服务器的系统编程高性能分布式系统开发游戏服务端开发(天然支持海量并行)云原生和容器化技术(Docker、Kubernetes 均用 Go 编写)
2026-04-30 12:44:47
548
6
原创 AI 编程工具结合 Figma MCP 实现前端设计高保真还原
AI编程与Figma MCP实现前端高保真还原 本文探讨了AI编程工具与Figma MCP结合实现前端设计高保真还原的方案。当前AI编程在后端开发中已成熟应用,但前端设计还原仍存在三大痛点:截图识别精度不足、口头描述效率低下、设计开发工具割裂。Figma MCP Server通过提供结构化设计数据(节点属性、布局信息、样式数据等),而非依赖图像识别,解决了这些问题。文章详细介绍了VS Code+Claude Code配置方案,包括添加MCP服务器、OAuth认证等步骤,并展示了从Figma设计到代码实现的工
2026-04-30 12:43:34
2116
原创 Java 快速入门笔记:从基础语法到 Spring Boot 实战
Java 作为一门成熟的企业级编程语言,拥有极其丰富的生态和完善的工具链。JDK/JRE 区别、Maven 项目管理、IDE 配置8 种基本数据类型、4 种访问修饰符、引用类型与值类型的区别String 不可变性、字符串常量池、StringBuilderArrayList(动态数组)、HashMap(哈希表)、Set(集合)、迭代器BIO(阻塞)、NIO(非阻塞多路复用)、AIO(异步非阻塞)三种创建线程方式、synchronized 同步机制。
2026-04-29 00:08:27
494
1
原创 海量小文件拷贝到U盘的最优方案 - Robocopy 多线程拷贝实战
摘要: 使用 Robocopy 多线程拷贝可将海量小文件(如 node_modules)到 U 盘的耗时从 2 小时缩短至十几分钟。关键参数 /MT:32 启用 32 线程并发,充分压榨 U 盘 I/O 性能。相比传统单线程拷贝、压缩解压或 U 盘内安装等方案,Robocopy 通过并发文件操作显著提升效率。典型命令:robocopy 源目录 目标目录 /MT:32 /E。注意线程数不宜过高(16-32 为宜),并谨慎使用会删除目标文件的 /MIR 参数。
2026-04-29 00:06:38
1008
原创 Python 基础语法笔记:从入门到进阶的系统学习
基本函数定义# 基本函数定义 def greet(name) : print(f"Hello, {name }!") # 默认参数 def printinfo(name , age = 35) : print(f"Name: {age } ") # 可变参数 def func(argv , * args) : print(argv) for var in args : print(var) func("first" , 1 , 2 , 3 , 4) # 输出: first 1 2 3 4!")
2026-04-28 11:01:05
330
原创 Qt开发实战笔记:从基础到商业项目开发全景指南
Qt 本质上是一套封装完善的 C++ 类库。它通过面向对象的方式,将窗口、按钮、标签、布局、网络、数据库、多媒体等功能封装为一个个类,开发者通过实例化对象、调用成员方法来构建应用程序。要在自定义类中使用信号槽,必须在类定义开头添加Q_OBJECT宏。自定义信号使用关键字声明,并通过emitQ_OBJECT // 必须的宏,启用信号槽、动态属性等元对象系统功能public:signals:// 声明自定义信号,信号不需要实现(由 moc 自动生成)// 定义槽函数,响应信号// 使用示例。
2026-04-28 10:57:56
296
原创 Soliditt基础语法
摘要 本文系统介绍了以太坊智能合约开发全流程,重点讲解Solidity语言核心知识。主要内容包括: 以太坊基础概念:区分交易与调用操作,介绍EVM工作原理 Solidity语法详解: 合约基本结构 数据类型(布尔、整型、地址、字节数组等) 复杂类型(数组、映射、结构体)的使用 关键特性: 数据存储位置(storage/memory/calldata) 合约继承机制 事件与异常处理 实战示例:通过完整代币合约展示Solidity开发模式 文章特别强调智能合约与传统编程的区别,如gas费用考量、状态可变性等区块
2026-04-27 16:43:35
349
原创 Ansible 自动化运维实战
本文介绍了Ansible自动化运维工具的核心使用方法和实战技巧。主要内容包括:Ansible的安装配置、SSH公钥推送、Inventory主机清单管理、常用模块使用(如copy、file、yum、service等)、Ad-hoc命令执行以及Playbook编写规范。重点讲解了Playbook的YAML语法结构、变量定义、任务编排和handlers机制,并提供了完整的Playbook示例。通过学习本文,读者可以掌握Ansible的基本运维自动化能力,实现批量系统配置、程序部署和命令执行等常见运维任务。
2026-04-27 16:41:14
517
原创 Linux 各发行版软件源一键切换方案
摘要 LinuxMirrors.cn 提供了一键切换 Linux 软件源的解决方案,支持 26+ 种主流发行版。通过简单的命令行交互即可快速更换国内镜像源,解决官方源访问慢的问题。该项目具有以下特点: 支持 Debian、Ubuntu、CentOS 等主流发行版及各版本 提供阿里云、中科大等优质镜像源选择 自动备份原配置文件,支持还原 针对不同网络环境提供专属命令 支持高级参数定制,如指定源地址、单独更换 EPEL 源等 使用 root 权限执行 bash <(curl -sSL https://li
2026-04-25 00:18:54
1107
Winows下Makefile问题
2023-01-07
windows远程桌面连接virtualbox vrde时报错
2017-06-17
编译Glusterfs源码包时出现错误
2017-04-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅