HarmonyOS第21天:解锁分布式技术,开启跨设备协同新体验
一、HarmonyOS 分布式技术:开启万物互联新时代
在物联网蓬勃发展的今天,设备之间的互联互通不再是遥不可及的梦想,而是真切融入日常生活的现实。从智能家居设备的联动控制,到智能办公场景中的高效协作,再到智能出行中的无缝体验,我们越来越依赖设备之间的协同工作。HarmonyOS 的分布式技术,正是这股万物互联浪潮中的关键力量,它打破了设备之间的界限,为用户带来了前所未有的跨设备协同体验 ,让多设备联动从设想变为常态。接下来,让我们深入探索 HarmonyOS 分布式技术的奥秘,了解它是如何实现这一跨时代的设备交互变革。
二、分布式任务调度:应用流转的魔法
(一)调度原理
分布式任务调度是 HarmonyOS 分布式技术的关键一环,它基于分布式软总线、分布式数据管理、分布式 Profile 和分布式安全认证等技术特性 ,构建起统一的分布式服务管理机制。其中,分布式软总线扮演着至关重要的角色,它为设备间提供了统一的分布式通信能力管理,实现了不区分链路的设备发现、连接、组网和传输 ,就像一条无形的纽带,将不同设备紧密相连。通过分布式软总线,设备之间可以自动发现并建立连接,形成一个有机的整体。
在这个基础上,分布式任务调度平台能够对搭载 HarmonyOS 的多设备构筑的 “超级虚拟终端” 提供统一的组件管理能力 。它将应用的基本组件 Ability 进行跨设备的启动、关闭、连接及断开连接以及迁移等操作 。比如,当我们在手机上启动一个支持分布式调度的应用时,该应用的 Ability 组件可以根据我们的需求,在其他设备(如平板、智慧屏)上进行启动或迁移,而这一切对用户来说是几乎透明的,仿佛这些设备就是一个整体。这背后,是分布式任务调度平台对硬件差异的屏蔽,以及对应用组件的精细管理,它使得应用能够在不同设备间灵活调度,实现真正的跨设备协同。
(二)应用场景
分布式任务调度的应用场景十分广泛,给我们的生活和工作带来极大便利。以文档跨设备编辑为例,你在办公室的电脑上撰写一份文档,突然需要外出,此时只需点击迁移按钮,文档编辑任务就能无缝迁移到你的手机上,你可以在路上继续编辑;到达目的地后,又能将文档迁移到附近的平板上,借助平板更大的屏幕和更便捷的操作继续完善,整个过程中,文档的编辑状态、光标位置等信息都能完整保留,就像在同一台设备上操作一样。
再比如视频接续播放场景,你在客厅的智慧屏上观看电影,中途想要去卧室休息,只需一个简单的操作,电影就能从智慧屏迁移到卧室的平板上继续播放,播放进度、播放设置等都无需重新调整,让你享受不间断的观影体验 。这种跨设备的任务迁移,打破了设备的限制,让用户能够在不同场景下自由切换设备,提升了使用的便捷性和流畅性。
(三)开发要点
对于开发者而言,要实现分布式任务调度,需要掌握一些关键要点。首先,在 Intent 中设置支持分布式的标记是必不可少的,例如使用 Intent.FLAG_ABILITYSLICE_MULTI_DEVICE 表示该应用支持分布式调度 ,若不设置这个标记,应用将无法获得分布式能力。其次,权限申请也至关重要,开发者需要在 config.json 中添加分布式数据传输的权限申请 ,如 {"name": "ohos.permission.servicebus.ACCESS_SERVICE"} ,以此获取跨设备连接的能力 。在调用 PA(Particle Ability,即 Service 和 Data 模板的 Ability)时,必须在 Intent 中指定 PA 对应的 bundleName 和 abilityName ;当需要跨设备启动、关闭或连接 PA 时,还需在 Intent 中指定对端设备的 deviceId 。对于 FA(Feature Ability,即 Page 模板的 Ability)的迁移,要实现相同 bundleName 和 abilityName 的 FA 跨设备迁移,同样需要指定迁移设备的 deviceId 。只有严格按照这些要点进行开发,才能确保分布式任务调度功能的正常实现,为用户带来优质的跨设备应用体验。
三、分布式数据管理:数据无缝同步的奥秘
(一)存储机制
在传统操作系统中,实现跨端数据的共享和访问往往依赖云端,这不仅面临着搭建成本高、服务不够便捷的问题,还存在用户数据和隐私保护不足的风险 。而 HarmonyOS 的分布式数据管理带来了全新的解决方案,它的设计理念是让数据不再与单一物理设备绑定,跨设备的数据处理如同本地数据处理一样方便快捷 。
HarmonyOS 在近端将多台终端形成一台 “超级虚拟终端”,实现数据全部在本地完成存储 。从物理层面看,各个设备仍保留其本地数据,但从开发者的视角,HarmonyOS 提供的是一个基于 “超级虚拟终端” 的分布式数据,将多个设备的数据集中在一个逻辑上的 “超级虚拟终端” 本地 。比如在家庭照片分享场景中,以往家庭成员分享照片需借助社交软件,操作繁琐且耗时;使用 HarmonyOS 分布式数据管理后,通过家庭照片共享功能,全家人能直接在自己手机上浏览、收藏和保存所有人拍摄的照片 ,还能利用标签分类图片功能,一次查找到分布在不同终端上的照片 ,极大提升了数据处理的便捷性。
(二)安全保障
数据安全和隐私保护是用户最为关注的问题,HarmonyOS 在这方面采取了多重保障措施。首先,在设备可信认证方面,充分考虑单用户多设备、多用户多设备的场景,提供了两种设备认证方式 。同账号设备自动连接,借助分布式软总线技术,设备能自动完成认证和连接 ,当其中一个设备开机进入网络,其他同账号设备在系统层面自动完成认证 ;对于账号无关的设备连接,则提供扫码方式完成设备认证和连接 ,只需调用系统接口生成二维码并扫码,即可完成认证连接 ,之后通过权限申请,设备间可实现应用沙箱内的数据及应用文件互访 ,且设备认证、秘钥管理、会话密钥协商,数据隔离和访问控制等都在系统层面完成,既降低开发门槛,又保障了安全性和用户隐私 。
在数据隔离与访问控制方面,各应用的数据实现沙箱化隔离,每个应用通过分布式文件系统和分布式数据库只能访问到自己沙箱内的文件和数据 。同时,提供垂直化数据安全的访问保护控制,不同安全风险等级的文件和数据会带上不同的等级标签 ,打开文件时通过等级标签来控制当前设备状态下是否允许访问 ,确保数据只能在安全的环境下被访问 。
HarmonyOS 还依据相关法律法规(如 GDPR、HIPPA、NIST 等)的数据分类分级保护标准以及业界最佳实践,将数据分类成 S0/S1/S2/S3/S4 共 5 个保护等级 。每个保护等级的数据从生成开始,在其存储、使用、传输的整个生命周期都需要根据对应的安全策略提供不同强度的安全防护 ,每个数据在生成时都会打上相应标签,这个标签伴随数据一生,指导 “超级虚拟终端” 的各个节点对其提供一致强度的安全防护 ,并且 “超级虚拟终端” 的访问控制系统支持依据标签进行访问控制策略,保证数据只能在可以提供足够安全防护的节点之间存储、传输和使用 ,有效防止数据泄露和非法访问 。
(三)开发实践
在开发过程中,以单版本分布式数据库为例,开发者首先要在 config.json 中添加权限,如 "reqPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC"}] ,这是使用分布式数据服务的基础 。应用启动时,需弹出授权提示框,请求用户授权 。
接着根据配置构造分布式数据库管理类实例 。先根据应用上下文创建 KvManagerConfig 对象 ,再创建分布式数据库管理器实例 ,代码示例如下:
Context context = getApplicationContext(); KvManagerConfig config = new KvManagerConfig(context); KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config); |
获取或创建单版本分布式数据库时,要声明需要创建的单版本分布式数据库 ID 描述 。创建时,默认开启组网设备间自动同步功能 ,若应用对性能比较敏感,可设置关闭自动同步功能 setAutoSync (false),并主动调用 sync 接口同步 ,示例代码如下:
try { Options options = new Options(); options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION); String storeId = “testApp”; SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId); } catch (KvStoreException e) { HiLog.warn(LABEL_LOG, “getKvStore:” + e.getKvStoreErrorCode()); } |
订阅分布式数据变化时,客户端需要实现 KvStoreObserver 接口 ,并构造并注册 KvStoreObserver 实例 ,例如:
class KvStoreObserverClient implements KvStoreObserver { @Override public void onChange(ChangeNotification notification) { List<Entry> insertEntries = notification.getInsertEntries(); List<Entry> updateEntries = notification.getUpdateEntries(); List<Entry> deleteEntries = notification.getDeleteEntries(); } } KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient(); singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient); |
将数据写入单版本分布式数据库,需构造需要写入的 Key 和 Value ,然后使用 put 方法写入 ,如:
try { String key = “todayWeather”; String value = “Sunny”; singleKvStore.putString(key, value); } catch (KvStoreException e) { HiLog.warn(LABEL_LOG, “putString:” + e.getKvStoreErrorCode()); } |
查询数据时,构造需要查询的 Key ,从单版本分布式数据库快照中获取数据并捕获异常 ,示例如下:
try { String key = “todayWeather”; String value = singleKvStore.getString(key); } catch (KvStoreException e) { HiLog.warn(LABEL_LOG, “getString:” + e.getKvStoreErrorCode()); } |
同步数据到其他设备,要先获取已连接的设备列表 ,然后选择同步方式进行数据同步 ,比如采用 PUSH_ONLY 同步方式:
List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER); List<String> deviceIdList = new ArrayList<>(); for (DeviceInfo deviceInfo : deviceInfoList) { deviceIdList.add(deviceInfo.getId()); } singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY); |
掌握这些开发步骤和代码示例,开发者就能更好地利用 HarmonyOS 的分布式数据管理功能,开发出数据安全、同步便捷的应用 。
四、分布式 UI:打造一致的跨设备体验
(一)特性优势
HarmonyOS 的分布式 UI 框架为开发者提供了强大的工具,以实现跨设备的一致体验。它具有多方面的显著特性 。
在跨平台一致性方面,开发者可以使用同一套代码库和 API,在手机、平板、智能手表、车机等不同设备上实现一致的 UI 体验 。这种统一开发环境减少了为不同设备单独开发 UI 的工作量,同时保证了用户体验的连贯性 。框架还支持根据设备的屏幕尺寸、分辨率和形状自动调整界面布局,确保应用在各种设备上都能提供最佳的用户界面显示 ,无论是大屏的智慧屏,还是小尺寸的智能手表,应用都能自适应展示,给用户带来舒适的视觉感受 。
在渲染性能上,HarmonyOS 采用先进的渲染技术,确保应用界面能够快速、流畅地呈现给用户 。通过优化渲染过程和组件布局,减少了界面卡顿和延迟 。框架采用多线程设计,将 UI 线程、渲染线程等分开处理,进一步提高了应用的整体运行效率 ,让用户操作更加流畅顺滑 。
从开发方式来说,分布式 UI 框架支持声明式开发范式,开发者可以专注于描述界面的状态和变化,而无需过多关注具体的实现细节 。这种开发方式降低了开发难度,提高了开发效率 。通过数据绑定机制,开发者可以方便地实现界面与数据的同步更新,提升了应用的响应性和用户体验 ,当数据发生变化时,界面能实时更新,无需手动刷新 。
它还提供了一套丰富的组件库,包括常见的 UI 组件、布局组件和业务组件等 。这些组件经过优化和测试,确保了稳定性和性能 。开发者还可以根据需要自定义组件,满足特定场景下的需求 。组件化开发方式使得代码更加模块化,易于维护和复用 ,开发者可以将常用的功能封装成组件,在不同的应用或项目中重复使用 ,提高开发效率和代码质量 。
分布式协同能力也是其一大亮点,该框架支持多设备之间的协同工作,通过分布式技术实现设备间的无缝连接和数据共享 。这使得开发者可以创建跨设备的应用场景,提供更加沉浸式的用户体验 。比如在智能家居控制应用中,用户可以在手机上操作灯光开关,同时在平板上查看灯光状态,设备间的数据实时同步,操作流畅自然 。框架引入了分布式消息传递系统,允许设备之间以高效的方式共享信息,实现各种协同工作,如文件传输、实时通话等,增强了用户在不同设备间切换的连贯性和便捷性 。
(二)开发步骤
以 uni - app 开发为例,利用 HarmonyOS 的分布式 UI 框架实现跨设备一致的用户体验,主要涉及以下步骤 。
首先要熟悉 HarmonyOS 提供的分布式 UI 框架,了解其核心概念,包括 Ability(应用的基础单元,可以跨设备免安装调度和运行)、用户程序框架(负责包管理、Ability 管理和分布式管理)和 UI 编程框架(应用的用户界面) ,熟悉框架的特性和使用方法,为后续开发打下基础 。
要使用 uni - app 的跨平台能力 。uni - app 是一个使用 Vue.js 开发所有前端应用的框架,可以编译到 iOS、Android、H5 以及各种小程序等多个平台 ,对于 HarmonyOS,uni - app 也提供了支持,允许开发者使用统一的代码库来开发 HarmonyOS 应用 ,充分利用其跨平台特性,减少开发工作量 。
在 uni - app 项目中,通过 HarmonyOS SDK 或者 uni - app 的扩展 API 来接入分布式 UI 相关的组件和 API 。这些组件和 API 提供了跨设备界面布局、数据同步、任务调度等功能,使得开发者能够方便地实现跨设备的 UI 展示和交互 ,比如接入分布式的按钮组件、文本框组件等,实现跨设备的交互操作 。
为了确保跨设备一致的用户体验,需要设计响应式的 UI 界面 。这包括使用百分比、Flex 布局等 CSS 特性来适应不同屏幕尺寸和分辨率 ,使界面元素能够根据设备屏幕大小自动调整位置和大小 。编写可复用的 Vue 组件来减少代码的冗余 ,将常用的界面元素封装成组件,方便在不同页面和设备上使用 。
HarmonyOS 的分布式数据管理能力使得数据可以在不同设备间共享和同步 。在 uni - app 中,可以通过调用分布式数据 API 来实现数据的跨设备访问和更新,从而保持用户在多个设备上的数据一致性 ,例如在一个笔记应用中,用户在手机上创建的笔记,通过分布式数据管理,能实时同步到平板上,方便用户在不同设备上查看和编辑 。
在开发过程中,需要针对不同的设备组合进行充分的测试,以确保应用的跨设备协同运行和用户体验的一致性 。HarmonyOS 提供了丰富的测试工具和调试手段,帮助开发者及时发现和解决问题 ,通过在手机、平板、智能手表等多种设备上进行测试,检查界面显示、交互操作、数据同步等功能是否正常,确保应用在各种设备上都能稳定运行,为用户提供良好的体验 。
五、实战项目:开发多设备协同应用
(一)项目需求分析
以多机位拍摄应用为例,这是一个在影视制作、直播等领域有广泛需求的应用场景 。在影视拍摄中,导演常常需要从多个角度捕捉画面,以丰富影片的视觉效果;直播行业中,多机位拍摄能让观众从不同视角观看直播内容,增强观看体验 。对于这样的应用,其功能需求主要包括:多设备实时拍摄画面的同步采集,确保各机位的画面在时间上保持一致,避免出现画面延迟不同步的情况 ;拍摄参数的统一设置,如分辨率、帧率、曝光等,使不同机位拍摄的画面风格和质量保持一致 ;拍摄任务的灵活调度,导演可以根据拍摄需求,随时切换不同机位的拍摄状态,如开始、暂停、停止等 ;拍摄数据的高效管理,包括画面数据的存储、传输和后期编辑,方便后续对素材的处理和使用 。
从技术实现角度来看,需要借助 HarmonyOS 的分布式任务调度技术,实现拍摄任务在不同设备(手机、平板、专业摄像机等搭载 HarmonyOS 的设备)间的灵活分配和协同 ;利用分布式数据管理技术,保障拍摄画面数据在多设备间的实时同步和安全存储 ;运用分布式 UI 技术,为导演提供一个统一、便捷的操作界面,使其能在不同设备上对拍摄过程进行监控和控制 。
(二)技术选型与架构设计
在技术选型上,前端开发可以采用基于 ArkTS 语言的开发框架,ArkTS 语言具有简洁、高效、类型安全等特点,能够很好地与 HarmonyOS 的分布式 UI 框架结合,实现流畅的用户界面交互 。后端服务可以选择使用 Java 语言开发,借助 Java 丰富的生态系统和强大的性能,处理拍摄任务调度、数据存储与管理等业务逻辑 。数据库方面,选用 HarmonyOS 提供的分布式数据库,如单版本分布式数据库,满足数据在多设备间的同步和管理需求 。
架构设计上,采用分层架构。表现层负责提供用户界面,包括设备连接管理、拍摄参数设置、拍摄画面实时预览等功能 。通过分布式 UI 框架,实现界面在不同设备上的自适应展示,用户可以在手机、平板等设备上方便地操作应用 。业务逻辑层处理拍摄任务的调度、设备状态的管理等核心业务 。利用分布式任务调度技术,根据用户操作和设备状态,合理分配拍摄任务到不同设备 。数据访问层负责与分布式数据库进行交互,实现拍摄画面数据的存储、读取和同步 。通过分布式数据管理技术,确保数据在多设备间的一致性和安全性 。例如,当一个机位拍摄的画面数据发生变化时,能及时同步到其他设备,保证各设备上的数据实时更新 。
(三)代码实现与效果展示
在代码实现中,以跨设备启动应用为例,使用原子化服务实现免安装启动 。首先创建原子化服务项目,在 config.json 中配置相关信息,如:
{ "module": { "name": "multi_camera_app", "type": "entry", "abilities": [ { "name": "com.example.multicamera.MainAbility", "icon": "$media:icon", "description": "$string:main_ability_description", "label": "$string:app_name", "type": "page", "launchType": "standard", "visible": true, "metadata": { "launch_mode": "standard" }, "skills": [ { "entities": ["entity.system.home"], "actions": ["action.system.home"] } ] } ] } } |
在 MainAbility 中,通过 Intent 实现跨设备启动其他设备上的应用实例 ,代码如下:
Intent intent = new Intent(); Operation operation = new Intent.OperationBuilder() .withDeviceId("target_device_id") .withBundleName("com.example.multicamera") .withAbilityName("com.example.multicamera.MainAbility") .build(); intent.setOperation(operation); startAbility(intent); |
对于数据同步,以分布式数据库为例,在应用启动时获取分布式数据库实例:
Context context = getApplicationContext(); KvManagerConfig config = new KvManagerConfig(context); KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config); Options options = new Options(); options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION); String storeId = “camera_data_store”; SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId); |
当某个机位拍摄的画面数据发生变化时,将数据写入数据库并同步到其他设备:
try { String key = “camera_1_frame_001”; String value = “frame_data_base64_string”; singleKvStore.putString(key, value); List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER); List<String> deviceIdList = new ArrayList<>(); for (DeviceInfo deviceInfo : deviceInfoList) { deviceIdList.add(deviceInfo.getId()); } singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY); } catch (KvStoreException e) { HiLog.warn(LABEL_LOG, “putString or sync:” + e.getKvStoreErrorCode()); } |
最终的多设备协同效果展示中,在多个设备上同时运行多机位拍摄应用,各设备的拍摄画面实时同步显示在统一的监控界面上 。导演可以在任意设备上操作,实现拍摄参数的调整、机位的切换等功能 。比如在一场直播活动中,使用手机、平板和专业摄像机作为机位,手机上可以方便地查看各个机位的实时画面,平板上用于设置拍摄参数和切换机位,专业摄像机负责高质量的画面采集,通过 HarmonyOS 的分布式技术,这些设备协同工作,为观众呈现出精彩的直播内容 ,大大提升了拍摄和直播的效率与体验 。
六、总结与展望
通过对 HarmonyOS 分布式技术的深入学习,我们领略到了其强大的跨设备协同能力,从分布式任务调度实现应用的自由流转,到分布式数据管理保障数据的安全同步,再到分布式 UI 打造一致的跨设备体验 ,这些技术共同构建起了 HarmonyOS 万物互联的基础 。
展望未来,随着物联网的持续发展,HarmonyOS 分布式技术有望在更多领域发挥重要作用 。在智能家居领域,它将实现更多设备的深度协同,用户可以通过一个设备轻松控制家中所有智能设备,打造真正智能化、便捷化的家居环境 ;在智能办公场景中,不同办公设备之间的协作将更加高效,文件、任务能在设备间无缝切换,提升办公效率 ;在智能教育领域,HarmonyOS 分布式技术可能会让学生和教师在不同设备上实现更流畅的互动和学习体验,丰富教学方式和资源 。
对于开发者来说,HarmonyOS 分布式技术为我们提供了广阔的创新空间 。希望大家能够继续深入探索和实践,充分利用这些技术,开发出更多创意十足、功能强大的多设备协同应用 ,为用户带来更加智能、便捷的体验 ,共同推动 HarmonyOS 生态的繁荣发展 。
相关文章:
HarmonyOS第21天:解锁分布式技术,开启跨设备协同新体验
一、HarmonyOS 分布式技术:开启万物互联新时代 在物联网蓬勃发展的今天,设备之间的互联互通不再是遥不可及的梦想,而是真切融入日常生活的现实。从智能家居设备的联动控制,到智能办公场景中的高效协作,再到智能出行中的…...
BUUCTF Pwn [ZJCTF 2019]EasyHeap unlink+freehook做法
checksec exeinfo : IDA64打开: delete_heap函数已经将指针清零 无UAF edit_heap允许自己输入读取字节 存在堆溢出 同时 存储的指针位于bss段 那接下来就想到unlink方法: 图示: 后续修改0x6020E0的位置为freehook 再修改一次 让其…...
【解决方案】RAGFlow部分问题清单及解决方案备忘1
一、长时间显示:Task is queued 多半是因为模型确实在队列中排队的原因,要么是内存一直在被占用中,要么是CPU或GPU一直在被占用中,可以首先检查硬件利用率: 如果是内存导致的队列缓慢,可以将.env文件中的M…...
Linux笔记---文件系统硬件部分
1. 文件系统 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。 1.1 基本组成 索引节点(inode)ÿ…...
低成本抗衡DeepSeek-R1!QwQ-32B本地部署教程:消费级硬件可部署
QwQ-32B是阿里通义千问团队在3月6日发布的开源大模型,这款仅有320亿参数的模型,在数学、代码、通用能力等核心场景里,几乎跟满血版DeepSeek-R1(6710亿参数)不相上下。可以说实现了开源领域的降维打击。 参数规模与性能…...
二叉树中堆的实现
1 堆的声明和定义 typedef int HPDateType; typedef struct Heap {HPDateType* arr;int size;int capcity; }HP; 与顺序表相似,我们需要一个数组,有效空间大小,有效元素个数 2 堆的初始化 void HPInit(HP*php) {assert(php);php->arr …...
概率论的基本知识
逆概率还不懂,改天再想想。 联合概率 联合概率(Joint Probability) 是概率论中的一个重要概念,用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。...
LVDS(Low Voltage Differential Signaling)电平详解
一、LVDS的定义与核心特性 LVDS(低压差分信号)是一种 低功耗、高速、抗干扰 的差分信号传输技术,通过一对互补的电压信号(正负端差值)传递数据。其核心特性包括: 电气特性 电压摆幅:差分电压约…...
2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
蓝桥杯原题: 题目描述: “在五子棋的对弈中,友谊的小船说翻就翻? ” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着 “ 友谊第一,比赛第二…...
OpenRewrite配方之import语句的顺序——org.openrewrite.java.OrderImports
org.openrewrite.java.OrderImports 是 OpenRewrite 工具库中的一个重要规则(Recipe),专为 Java 项目设计,用于自动化调整 import 语句的顺序,使其符合预定义的代码规范。从而提高代码的一致性和可读性。 核心功能 排序规则: 静态导入优先:默认将静态导入(import stati…...
数字电子技术基础(二十八)——TTL门电路的静态功耗和动态功耗
1 静态功耗 门电路的工作需要直流电压源的支持,无论在模拟电路还是在数字电路中,只有在外加直流电源的作用下,半导体二极管具有单向导电性,晶体管的放大能力以及开关特性才能体现出来芯片的电源端正负级。芯片的电源端正负极如果…...
RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
RISCV汇编学习系列: RISC-V汇编学习(一)—— 基础认识 RISC-V汇编学习(二)—— 汇编语法 RISC-V汇编学习(三)—— RV指令集 RISC-V汇编学习(四)—— RISCV QEMU平台搭建…...
链表的定义、节点结构、基本操作(C++)
1. 链表的基本概念 链表是一种动态数据结构,它的元素(节点)在内存中不一定是连续存储的。每个节点通过指针连接到下一个节点,形成一个链式结构。链表分为单向链表、双向链表和循环链表等,这里主要介绍单向链表。 2. …...
deepseek使用记录21——脑图记录
我们有比前人更先进的工具,为何不利用起来呢? 工作的时候,问问自己,这个问题是理论问题?还是实践问题?如何在系统中劈开一条可实践路径?系统中的缝,系统中的力量(人先进…...
[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...
【时时三省】(C语言基础)输入输出的概念
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 有关数据输入输出的概念 从前面的程序中可以看到:几乎每一个C程序都包含输入输出。因为要进行运算,就必须给出数据,而运算的结果当然需要输出,…...
基于ragflow中deepdoc对pdf文档的rag系统
基于ragflow中deepdoc对pdf文档的rag系统 一、安装 conda环境安装到指定的路径 conda create 包名/环境的名字 rag就是包的名字,ragflow就是环境名; 怎样激活环境?–我是在百度飞桨上面跑的 conda activate /home/aistudio/rag/ragflow …...
基于WebRTC技术的EasyRTC嵌入式音视频SDK:多平台兼容与性能优化
在当今数字化、智能化的时代背景下,实时音视频通信技术已成为众多领域不可或缺的关键技术。基于WebRTC技术的EasyRTC嵌入式音视频SDK,凭借其在ARM、Linux、Windows、安卓、iOS等多平台上的兼容性,为开发者提供了强大的工具,推动了…...
Linux驱动开发实战(四):设备树点RGB灯
Linux驱动开发实战(四):设备树点RGB灯 文章目录 Linux驱动开发实战(四):设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…...
大模型架构记录5-向量数据库
一 倒排索引、KNN、PQ 1.1 基础版本 query -> requery 对问题做处理,处理上下文 对query 做 refined query 1.2 向量数据库 二 搜索逻辑 2.1 knn 2.2 近似KNN 先和N个空间的均值比较再和空间内部的所有点比较,计算最近值。 优化一: …...
【 Fail2ban 使用教程】
Fail2ban 使用教程 1. 安装 Fail2ban2. 配置 Fail2ban2.1 创建 jail.local 文件2.2 基本配置参数说明2.3 配置具体服务的监控规则2.3.1 SSH 服务2.3.2 Apache 服务 3. 启动和管理 Fail2ban3.1 启动 Fail2ban 服务3.2 设置 Fail2ban 开机自启3.3 检查 Fail2ban 服务状态3.4 重新…...
Django系列教程(8)——函数视图及通用类视图
目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…...
【C#学习笔记04】C语言格式化输出
引言 printf()函数不仅可以将数据输出到控制台,还可以通过格式化字符串灵活地控制输出的格式。printf()函数的使用规则,包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符。 1. printf()函数概述 printf…...
九点标定和十二点标定的区别
九点标定和十二点标定是机器视觉中常用的两种手眼标定方法,用于建立图像坐标系与机械坐标系之间的映射关系。它们的核心区别在于标定点的数量、变换模型和适用场景。以下是详细对比: 1. 九点标定 特点 标定点数量:9 个点,通常排…...
qt+opengl 播放yuv视频
一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…...
【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图
在人类探索与塑造世界的征途中,有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制,更是对地球空间信息的精准捕捉与智慧应用。今天,让我们一起走进测绘的世界,解码“测绘”与“基础测绘”的内涵…...
基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
一、引言 当前,工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网,当大模型开始设计蛋白质结构,这个驱动大国重器研发的核心领域,却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...
NetAssist 5.0.14网络助手基础使用及自动应答使用方案
以下是NetAssist v5.0.14自动应答功能的详细使用步骤: 一、基础准备: 工具下载网址页面:https://www.cmsoft.cn/resource/102.html 下载安装好后,根据需要可以创建多个server,双击程序图标运行即可,下面…...
MySQL中有哪几种锁?
大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】面试题。希望对大家有帮助; MySQL中有哪几种锁? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中,锁是用来控制并发访问的机制,确…...
vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy
首先用 express 搭建后端服务器,注意使用中间件解析json格式的请求体,才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …...
【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search
大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…...
CSS中固定定位
1.如何设置为固定定位? 给元素设置position: fixed 即可实现固定定位. 可以使用left, right, top ,bottom 四个属性调整位置 2.固定定位的参考点在哪里? 参考他的视口 视口-->对于PC浏览器来说,视口就是我们看网页的那扇"窗户". 3.固定定位元素的特点 1.脱离文档…...
Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南
高效实现:强调代码的性能优化。Android ViewPager2:明确技术栈。顶部导航:核心功能点。动态配置与性能优化指南:突出动态配置的灵活性和性能优化的重点。 在 Android 开发中,使用 ViewPager2 实现高效的顶部导航&…...
MFCday01、模式对话框
对话框类和应用程序类。 MFC中 Combo Box List Box List Control三种列表控件,日期控件Date Time Picker...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
图片来自于官方README.md 一、什么是OpenAI Agents SDK? OpenAI Agents SDK是一个轻量级但功能强大的框架,专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本,该SDK提供了极少但高效的抽象概念,使开发…...
单例模式的五种实现方式
1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
统一 Elastic 向量数据库与 LLM 功能,实现智能查询
作者:来自 Elastic Sunile Manjee 利用 LLM 功能进行查询解析,并使用 Elasticsearch 搜索模板,将复杂的用户请求转换为结构化的、基于模式的搜索,从而实现高精度查询结果。 想象一下,你在搜索“距离 Belongil Beach 25…...
(Lauterbach调试器学习笔记)一、首次连接TriCore开发板调试
Lauterbach调试器学习笔记 文章目录 Lauterbach调试器学习笔记前言一、Lauterbach调试器介绍二、调试步骤三、常用代码四、不常用代码,但是很有意思总结 前言 第一篇简单记录一下Lauterbach调试器的使用过程,主要是想写第二篇python api。 一、Lauterba…...
HTML星球大冒险之路线图
第一章:欢迎来到 HTML 星球! 1.1 宇宙的基石:HTML 是什么? 🌍 比喻:HTML 是网页世界的「乐高积木」,用标签搭建一切可见内容🎯 目标:理解 HTML 的作用,掌握…...
网络安全与七层架构
网络安全与七层架构 随着互联网技术的迅猛发展,网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全,更是企业及国家安全的重要组成部分。而七层架构(OSI模型)为网络通信提供了理论支撑,能够有效地帮助我们理…...
2025-03-13 学习记录--C/C++-PTA 练习2-17 生成3的乘方表
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习2-17 生成3的乘方表 输入一个非负整数n,生成一张3的乘方表,输出3^0~$$3^n$$的值…...
改进YOLOv8系列,AAAI 2025,多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享
**论文:https://arxiv.org/pdf/2404.07846 **代码地址: https://github.com/nagejacob/TBSN/blob/main/network/tbsn.py 改进YOLOv8系列:多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀…...
我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
再再再次感谢Ttcofee提的问题 本次更新内容: 鼠标图案(切换),版本号获取,输入框复制剪切板 提前申明:如果运行不了,请到主页查看RedpandaDevc下载,若还是不行就卸了重装。 版本号&…...
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析 一、框架演变:从Vue2到Vue3的跨越 1.1 革命性升级 Vue3的发布标志着前端框架进入新纪元,其核心改进体现在三个方面: 性能飞跃:包体积减少41%,初始…...
评委打分5个评委 去掉一个最高分和一个最低分 取平均分
一键替换max用min 按shiftF6 public static int getMin(int[]scores){int min scores[0];for (int i 0; i < scores.length; i) {if(scores[i]> min){min scores[i];}}return min;} 这里有和c/c不一样的知识点 c/c调用函数类似于java的方法,但是c/c的函数调用需要声明…...
javabean类(测试类之外的类)
altinsert快捷键生成构造方法和get、set方法 或者插件ptg(连接外网搜索插件并且下载)...
C++ 邻接矩阵(代码)
C邻接矩阵代码,见下: #include<iostream>using namespace std;#define inf -1 class Graph{ private:int vertices;int **edges;public:Graph(int vertices);~Graph();void addEdge(int u, int v, int w);void printGraph(); };Graph::Graph(int …...
Cookie与Session详解
Cookie简介 Cookie 是浏览器提供的持久化存储数据的一种机制。是指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)。以下是关于 Cookie 的详细介绍: Cookie工作原理 当你访问一个网站时,该网…...