互联网技术净土?原生鸿蒙开启全新技术征程

鸿蒙生态与开发者的崭新机会

HarmonyOS NEXT承载着华为对未来操作系统的深刻理解,如今已发展为坚实的数字底座。它不仅在技术层面取得了全面突破,还在中国操作系统市场中站稳了脚跟。

当前,HarmonyOS NEXT的代码行数已超过1.1亿,开发者数量大幅增长,已有超过15000款鸿蒙原生应用和元服务上线,生态设备数量突破10亿,政企办公领域的应用也在加速推进。

如今,鸿蒙生态正以飞快的速度壮大,版本迭代迅速,鸿蒙原生应用几乎达到"一天一个版本"的更新频率,不断为用户带来新鲜体验。其中,原生智能、原生安全和原生互联是原生鸿蒙的核心亮点。

2024年被称为AI应用元年,但当前市场上的大多数AI产品,往往仅在应用层面简单集成了大模型,AI的体验仍然局限于具体的应用场景。而原生鸿蒙打破了这种局限,它的原生智能 通过创新性地将AI与操作系统深度融合,赋予了系统级的AI能力。

与那些应用级AI不同,原生鸿蒙从操作系统层面让应用天生具备智能性,这使得其在智能体验上实现了前所未有的突破。

聚焦开发者的发展之旅:原生鸿蒙应用市场全生命周期服务

原生鸿蒙应用市场不仅仅是一个应用分发平台,更为开发者提供了从开发、测试、上架到运营的全生命周期支持。开发者往往在应用开发的不同阶段面临挑战,包括代码质量检测、测试优化、资源分发以及应用的后续运营管理,而原生鸿蒙应用市场通过提供一系列服务,帮助开发者提升效率、加速创新,实现业务的可持续发展。

在移动应用开发中,Swiper组件常用于实现翻页效果,广泛应用于桌面、图库、问答等场景。然而,在实际开发过程中,Swiper组件在页面切换时基于按需加载原则,通常只有在即将显示下一个页面时,才会对该页面进行加载和布局绘制。

尽管按需加载能有效减少初始加载时间和内存占用,但对于复杂页面场景,这一加载过程可能持续较长时间,导致页面切换时出现卡顿,从而对滑动体验产生负面影响,甚至成为影响整个应用性能的瓶颈。

1.1移动开发中的性能挑战

在当前的移动开发中,特别是面对大数据量的长列表界面展示时,性能问题尤其突出。具体表现为:

  • 内存消耗:一次性加载大量数据会导致内存占用过高,特别是在用户设备内存有限的情况下。
  • 加载时间过长:加载大量数据项可能延迟应用的启动时间或页面加载时间,影响用户体验。
  • 滑动卡顿:数据项过多时,渲染时间过长,导致界面滑动时出现明显的卡顿,用户体验明显下降。

这些问题是移动端开发者在处理大数据量场景时必须面对的挑战,尤其是在应用的复杂滑动容器(如Swiper组件)中,需要更加精细化的资源管理和性能优化策略。

1.2原生鸿蒙应用市场的优化服务

针对上述问题,原生鸿蒙应用市场不仅提供了全生命周期的开发者服务,还通过一系列技术工具帮助开发者优化应用性能。比如,按需加载在复杂滑动场景中的应用,为开发者提供了更灵活的资源加载管理方式,极大减少了应用的内存占用和加载延迟。

在Swiper组件中,采用了LazyForEach懒加载机制来优化数据渲染性能,避免一次性加载所有数据项,从而降低内存消耗。

LazyForEach根据可视区域的需求按需迭代数据,只有当用户实际滑动到需要展示的页面时,才会加载对应的子组件,同时将不再需要的组件及时销毁以释放内存。这种按需创建和销毁的方式,确保了应用在长时间使用中内存占用的稳定性。

一般来说传统的开发对策为一次性加载方案(ForEach):一次性加载全量数据并循环渲染。

缺点有:

1.因为要一次性加载所有的列表数据,创建所有组件节点并完成组件树的构建,在数据量大时会非常耗时,从而导致页面加载渲染时间过长

2.屏幕可视区外的组件虽然不会显示在屏幕上,但是仍然会占用内存。在系统处于高负载的情况下,更容易出现性能问题,极限情况下甚至会导致应用异常退出。

3.实际业务中数据条数非常多,该方案存在很严重的性能问题。

为了解决这个性能问题,HarmonyOS NEXT提供了性能更好的解决方案:

1.3按需加载方案(LazyForEach)

LazyForEach:实现延迟加载数据并按需渲染。原理如下:

  1. 根据屏幕可视区能够容纳显示的组件数量按需加载数据。
  2. 根据加载的数据量创建组件,挂载在组件树上,屏幕可以展示多少列表项组件,就按需创建多少个ListItem组件节点挂载在List组件树根节点上。
  3. 当组件滑出可视区域外时,框架会进行组件销毁以降低内存占用;当组件滑入可视区域时,需要从头完成数据加载、组件创建、挂载组件树这一过程,直至渲染到屏幕上。

为了更加直观地展示Swiper在使用普通ForEach与LazyForEach时的性能差异,进行了本地模拟测试。测试结果表明,使用**LazyForEach**加载Swiper子组件在复杂场景下显著降低了内存消耗,并提高了滑动的流畅度,特别是在处理长列表或大量数据时效果尤为显著。

以下是一个典型的**Swiper子组件**代码示例,展示了如何通过LazyForEach实现按需加载。

@Component
struct SwiperItem {//题干private questionStr: string = '';//题目相关的图片资源private image: string | PixelMap = '';//答案选项private answerStr: string[] = [];//当前题号private myIndex: number = 0;//构造数据aboutToAppear(): void {// 初始化题干、图片链接、答案选项// ... }build() {Column() {// 题干Text(this.questionStr).fontSize(26).width('100%')// 题目相关图片Image(this.image).width('100%').objectFit(ImageFit.Contain).margin({ top: 12, bottom: 12 })// 答案ForEach(this.answerStr, (item: string, index: number) => {Text(item).width('100%').fontSize(26)})}// ...}
}

Swiper主页面核心代码如下

- 使用ForEach对页面进行加载

aboutToAppear(): void {for (let i = 0; i < 1000; i++) {this.list.push(i);this.data.addData(i, i);}
}build() {Column() {Swiper(this.swiperController) {ForEach(this.list, (item: number, index: number) => {SwiperItem({ myIndex: index }).width('100%').height("100%")}, (item: string) => item)}// ...}.width('100%').margin({ top: 5 })
}

使用LazyForEach对页面进行加载

aboutToAppear(): void {for (let i = 0; i < 1000; i++) {this.data.addData(i, i);}
}build() {Column() {Swiper(this.swiperController) {LazyForEach(this.data, (item: string, index: number) => {SwiperItem({ myIndex: index }).width('100%').height("100%")}, (item: string) => item)}// ...}.width('100%').margin({ top: 5 })
}

表1 总题量为1000时ForEach与LazyForEach的性能对比

加载方式完全显示所用时间丢帧率独占内存
ForEach951ms8.5%200MB
LazyForEach280.6ms0.0%25.18MB

由实验数据可知,当Swiper的子组件数量比较大时,采用懒加载可以带来较好的帧率提升,并且有效减低内存占用。

其实LazyForEach是从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。

如果开发者的应用场景属于加载较为耗时的场景时,尤其是下列场景,推荐使用。

  •  Swiper的子组件具有复杂的动画;
  •  Swiper的子组件加载时需要执行网络请求等耗时操作;
  •  Swiper的子组件包含大量需要渲染的图像或资源。

LazyForEach实现了按需加载,针对列表数据量大、列表组件复杂的场景,减少了页面首次启动时一次性加载数据的时间消耗,减少了内存峰值。可以显著提升页面的能效比和用户体验。

深度解析:自动化检测如何帮助开发者提效

在应用开发过程中,开发者常常面临着一个关键问题——如何确保应用在上线前经过充分的测试。应用的功能、界面和性能必须满足用户的期望,而这个过程通常需要进行反复验证。传统的手动测试流程不仅耗时耗力,还可能因为人工错误导致疏漏,尤其是在兼容性、性能和安全性方面,稍有不慎就可能影响用户体验。

此外,随着应用功能的复杂性和设备的多样性增加,测试覆盖范围变得广泛且复杂。不同的设备环境、操作系统版本等因素都可能导致应用行为的差异,这进一步增加了开发者的压力。因此,在开发过程中找到有效的测试方法,以减少手动测试的工作量、提升测试准确性,成为开发者提升效率的一个关键挑战。

服务特点:Hypium自动化检测前移,提升效率

在现代应用开发中,确保代码的正确性和稳定性是开发者面临的主要挑战之一。为了帮助开发者高效测试应用功能并及时发现潜在问题,原生鸿蒙应用市场提供了功能强大的自动化测试框架——Hypium,其中包含HJUnitHJSUnit两个子框架,分别支持单元测试和UI测试。这些工具不仅让开发者可以在开发早期快速编写测试用例,还能提高测试覆盖率,减少后期调试和修复成本,极大提升开发效率和代码质量。

“Hypium”是“Hyper Automation + ium”的组合词,“Hyper Automation”表示超级自动化, “ium”意指稳定、可靠的测试框架能力底座。从取名含义可以看出,我们想要为开发者打造一个以超级自动化测试为理想目标、且稳定可靠的测试框架。

自动化测试框架Hypium以插件形式集成到DevEco Studio中。开发者创建工程后,DevEco Studio会自动生成测试目录、测试类和测试用例模板等,如图所示:

开发者无需从零开始,让测试更加简单、高效。

2.1自动化测试用例的设计:高效捕捉问题

开发者可以通过Hypium测试框架,直接测试项目中的指定类、方法或UI交互功能,确保在开发过程中及时发现问题,避免将问题带入后续开发阶段。通过这种测试用例的提前介入,开发者可以在应用上线前确保其稳定性和流畅度。

此外,UI测试框架也考虑了多语言和语法兼容,支持Java/JS/eTS三种语言。有的开发者小伙伴之前可能使用过UI测试框架提供的Java接口,最近新增的JS/eTS接口定义和语法与Java接口是一致的,开发者们可以无缝切换到JS/eTS语言来使用。

以下将通过具体的HJUnitHJSUnit测试用例,展示如何利用自动化测试工具,快速验证代码功能,并提高开发工作效率。

2.1.1. HJUnit测试用例:系统功能测试

在下面的示例中,checkScreenShape是一个用于验证设备屏幕形状的测试用例,使用了HarmonyOS NEXT中的元能力子系统提供的AbilityDelegator测试工具。通过获取应用的Context,开发者能够访问设备的相关属性(如设备类型和屏幕形状),并对设备的屏幕形状进行断言判断。这种测试用例非常适用于需要验证设备硬件属性或系统功能的场景。

public class ExampleOhosTest {  @Test  public void checkScreenShape() {  // 获取 IAbilityDelegator 实例  final IAbilityDelegator delegator = AbilityDelegatorRegistry.getAbilityDelegator();  // 从IabilityDelegator实例中获取应用content内容  final Context appContext = delegator.getAppContext();  DeviceCapability devCap = appContext.getResourceManager().getDeviceCapability();  assertNotNull("Null deviceCapability", devCap);  if (devCap.deviceType == DeviceCapability.DEVICE_TYPE_WEARABLE) {  // 断言  assertTrue("Unexpected display shape", devCap.isRound);  } else {  assertFalse("Unexpected display shape", devCap.isRound);  }  }  
}

在这个用例中,AbilityDelegator工具可以自动获取设备的能力(DeviceCapability),并通过断言设备是否为圆形屏幕来验证应用在不同设备上的行为是否符合预期。这个测试用例展示了如何使用系统级工具来进行硬件属性的验证,确保应用能够在各种设备上正常运行,特别是可穿戴设备等特殊设备。

2.2.2. HJSUnit测试用例:UI交互测试

相比于单元测试框架,HJSUnit专注于界面交互的自动化测试。以下示例展示了如何通过编写自动化测试用例,验证弹出对话框的行为。prompt.showDialog 是鸿蒙系统中用于弹出对话框的API,测试用例通过回调函数验证弹出对话框是否按预期执行。

it('testPromptDialog', 0, function() {console.info('testPromptDialog START');prompt.showDialog({title: 'dialog showDialog test',message: 'message of dialog',buttons: [{text: 'OK'}],success: function(ret) {expect(true).assertTrue();  // 确认对话框成功弹出},cancel: function() {expect(true).assertFalse();  // 如果被取消,测试失败},complete: function() {console.log('[prompt.showDialog] complete');}});
});

在这个用例中,测试了弹出对话框的成功与否。通过监听success和cancel回调函数,测试代码可以在对话框操作结束时断言弹出框是否符合预期行为。自动化界面测试的优势在于,能够在不依赖人工操作的情况下,确保复杂的用户交互场景正常工作。

2.2.3性能优化与自动化测试框架的结合

原生鸿蒙应用市场的自动化检测服务结合了强大的测试框架,如Hypium,帮助开发者在开发早期进行更广泛的测试,从而避免后期出现的性能问题。Hypium自动化检测可以针对应用的兼容性、性能和安全性进行提前检测,确保在应用上线之前,潜在问题已经被大部分解决。

提升效率的关键优势
  1. 提前发现问题,减少后续修复成本:Hypium自动生成测试模板,开发者可以立即在项目初期编写测试用例,并在每次代码变更后自动执行测试。这种方式不仅能及早发现问题,减少后期反复调试和修复的成本,还能让开发者在开发过程中更快迭代功能。
  2. 支持全路径验证:HJSUnit和HJUnit框架不仅能进行应用逻辑的单元测试,还能自动化地测试UI交互。这种全路径验证能够覆盖应用中的各个层面,包括内部逻辑和外部用户体验,确保代码改动不会引入新的问题。
  3. 减少重复劳动,专注核心创新:通过自动化测试,开发者不再需要每次进行版本迭代时都手动测试每个功能,极大减少了重复劳动。这样开发者可以将更多的精力投入到功能优化和创新上,而不是耗费在繁琐的测试流程上。

以一款跨设备应用开发为例,开发团队需要同时支持手机、平板和可穿戴设备。在使用Hypium框架进行自动化检测之前,团队每次需要手动测试不同设备的兼容性,尤其是在处理不同设备的UI布局时,错误率较高。通过引入Hypium自动化测试后,团队能够编写一次测试用例,并在不同设备上自动运行,大幅减少了开发和调试的时间。最终,应用的发布周期大幅缩短,同时显著提升了应用的质量和稳定性。

开发者的成长与未来:原生鸿蒙应用市场的支持与潜力

原生鸿蒙应用市场作为鸿蒙生态的重要组成部分,致力于为开发者提供全面的支持,贯穿应用开发、测试、发布、运营和持续优化的整个生命周期。从最初的概念验证到成功的市场运营,原生鸿蒙应用市场通过一系列先进的服务和工具助力开发者。

3.1. 全生命周期服务:贯穿应用的每一个阶段

原生鸿蒙应用市场为开发者提供了从开发到运营的全流程支持,确保开发者在各个阶段都能获得所需的技术和资源:

  • 开发阶段:通过集成开发环境(如DevEco Studio)和自动化测试框架(如Hypium),开发者能够快速编写代码、验证功能并提升开发效率。自动化检测服务能够帮助开发者提前发现潜在问题,减少后期修复的成本。
  • 测试阶段:华为应用市场提供了灵活的测试服务,开发者可以在不同的用户群体中测试应用性能和稳定性,收集反馈并进行迭代优化。应用加密、按需加载等技术进一步提升了应用的安全性和性能表现。
  • 上线发布:通过智能推荐和精准分发机制,开发者的应用能够在原生鸿蒙应用市场中获得更多的曝光和下载机会,尤其是高质量应用可以通过专题推荐的形式被推送给更多用户。
  • 运营和优化:在应用上线后,原生鸿蒙应用市场提供了数据分析工具和用户反馈渠道,帮助开发者实时监控应用的使用情况,持续优化用户体验。通过生态中的运营资源,开发者还可以获得定期的推广和合作机会。

3.2. 生态合作与社群支持:探索鸿蒙生态的无限创新机会

鸿蒙生态的快速发展不仅为开发者提供了技术平台,也为他们创造了广阔的创新合作空间。华为积极推动开发者与生态内的合作伙伴共同创新,打造面向万物互联的未来场景。

  • 生态合作:原生鸿蒙操作系统的跨设备特性使得开发者能够构建真正的全场景应用,覆盖智能手机、平板、可穿戴设备、IoT设备等多种终端。开发者可以通过与硬件、软件合作伙伴的深度合作,打造更加丰富的应用场景,实现应用功能的多端联动。比如,一款健康管理应用可以同时在智能手表上记录数据,并同步显示在手机上,提供一致的跨设备体验。
  • 开发者社群:华为还通过一系列社群活动和技术分享(如开发者大赛、技术论坛等)为开发者提供资源和支持。开发者不仅可以在社群中学习新的技术趋势,还能通过与其他开发者的互动碰撞出更多创新的想法,推动应用的不断升级和优化。华为开发者联盟(HUAWEI Developer Alliance)还提供了丰富的开发者资源,包括文档、培训、技术支持等,帮助开发者快速掌握鸿蒙生态的开发技能。

通过生态合作和社群支持,开发者不仅能不断提升自身的技术能力,还能在广阔的鸿蒙生态中找到更多的创新机会,推动应用和业务的长远发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从书本到代码:人工智能如何改变教育游戏规则?

内容概要 随着时代的发展&#xff0c;人工智能在教育领域展现出前所未有的潜力&#xff0c;成为推动教育改革的重要力量。它不仅仅是一种技术工具&#xff0c;更是一种变革的催化剂&#xff0c;促使传统教育模式必须进行自我反思和更新。通过利用智能算法&#xff0c;教育者可…

Kubernetes-编排工具篇-01-Kustomize与Helm对比

Kustomize与Helm对比 0、前言 K8s 是一个开源容器编排平台&#xff0c;可自动执行容器化应用程序的部署、扩展和管理。近年来&#xff0c;K8s 已成为采用云原生架构和容器化技术的组织的标准。 但是由于K8s的复杂性&#xff0c;所以很多公司以及开源组织都在开发相关的工具来…

【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用

创建个性化的GPTs应用是一个涉及技术、设计和用户体验的过程。以下是详细步骤&#xff1a; ###1.确定应用目标和用户群体 在开始之前&#xff0c;你需要明确你的应用的目标和目标用户。这将帮助你在设计、开发和个性化方面做出相应的决策。例如&#xff0c;如果你的应用是为了…

141/142题环形链表

本题返回环入口的位置。使用快慢指针&#xff0c;快指针每次移动两个&#xff0c;慢指针每次移动一个。设前一段距离是a,进入环内到slow和fast相遇的地点距离是b&#xff0c;环内剩下的距离是c&#xff0c;如图所示。 环的长度是bc 慢指针移动距离是ab 快指针移动距离是abk(bc…

快速入门Zookeeper

Zookeeper ZooKeeper作为一个强大的开源分布式协调服务&#xff0c;扮演着分布式系统中至关重要的角色。它提供了一个中心化的服务&#xff0c;用于维护配置信息、命名、提供分布式同步以及提供组服务等。通过其高性能和可靠的特性&#xff0c;ZooKeeper能够确保在复杂的分布式…

SpringBoot环境下的共享汽车管理策略

3系统分析 3.1可行性分析 通过对本共享汽车管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本共享汽车管理系统采用SSM框架&#xff0c;JAVA作为开发语…

确定图像的熵和各向异性 Halcon entropy_gray 解析

1、图像的熵 1.1 介绍 图像熵&#xff08;image entropy&#xff09;是图像“繁忙”程度的估计值&#xff0c;它表示为图像灰度级集合的比特平均数&#xff0c;单位比特/像素&#xff0c;也描述了图像信源的平均信息量。熵指的是体系的混乱程度&#xff0c;对于图像而言&#…

什么是多因素身份验证(MFA)的安全性?

多因素身份验证(MFA)简介 什么是MFA 多因素身份验证(MFA)是一种安全过程&#xff0c;要求用户在授予对系统、应用程序或账户的访问权限之前提供两种或多种形式的验证。仅使用单个因素&#xff08;通常是用户名和密码&#xff09;保护资源会使它们容易受到泄露&#xff0c;添加…

特色3D打印机stm32迷你8轴双核心主板

我自己设计的3D打印机主板 1. 这是一块迷你的8轴主板, 主板尺寸为100mm*75mm, 使用一个8cm静音风扇散热足够了2. 这是一个带有保护的板子, 驱动上的gpio具有过压保护功能, 能够直接抗住24V的冲击, 意味着一个驱动炸了, 板子不烧, 并且其他的驱动也没事, 主板支持自动关机3. 8…

【LeetCode:3242. 设计相邻元素求和服务 + 模拟 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

GIF图片格式详解(二)

gif历史请参考上一篇《GIF图片格式详解&#xff08;一&#xff09;》&#xff0c;或直接访问博客地址&#xff1a;https://blog.whatsroot.xyz/2023/12/16/all-about-gif/ 文件格式概述 GIF格式采用调色板模式&#xff0c;即有一个颜色表&#xff0c;每种颜色可以使用RGB24格…

TypeScript 基础语法及使用

文章目录 1、概述2、快速使用3、常用类型4、基础类型5、联合类型6、函数类型7、对象类型 & 接口interface 1、概述 TypeScript&#xff08;简称 TS&#xff09;是JavaScript的超集&#xff08;继承了JS全部语法&#xff09;是微软开发的开源编程语言&#xff0c;可以在任何…

深入了解决策树:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

基于Java Web的传智播客crm企业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

如何学习C++游戏开发

学习C游戏开发是一个涉及多个领域的复杂过程&#xff0c;包括编程、游戏设计、图形学等。 1. **学习C基础**&#xff1a; - 掌握C的基本语法和面向对象编程。 - 学习C标准库&#xff0c;特别是STL&#xff08;标准模板库&#xff09;。 2. **理解游戏开发概念**&#xf…

RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 RabbitMQ 初识 1.1 RabbitMQ 安装 2.0 数据隔离 2.1 用户管理 2.2 virtual host 虚拟主机 3.0 SpringAMQP 3.1 RabbitMQ 配置 3.2 发送消息 3.3 接收消息 3.4 Wor…

基础归一化方法 数学理论及其matlab代码

归一化是一种简化计算的方式&#xff0c;即将有量纲的表达式&#xff0c;经过变换&#xff0c;化为无量纲的表达式&#xff0c;成为标量。在多种计算中都经常用到这种方法。以下是常见的基础归一化方法&#xff1a;Min-Max 归一化&#xff0c;Z-Score 归一化、小数定标归一化、…

漫漫数学之旅038

文章目录 经典格言数学习题古今评注名人小传 - 古斯塔夫福楼拜 经典格言 诗歌是一门像几何一样严格的科学。——古斯塔夫福楼拜&#xff08;Gustave Flaubert&#xff09; 古斯塔夫福楼拜将诗歌比作几何学&#xff0c;强调了诗歌创作的严谨性。他认为诗歌不仅仅是情感的流露&a…

前端md5加密

npm下载 npm install --save ts-md5页面引入 import { Md5 } from ts-md5使用 const md5PwdMd5.hashStr("123456")md5Pwd&#xff08;加密后的数据&#xff09; .toUpperCase()方法转大写

植物神经紊乱不用怕,这些维生素来帮你!

在现代快节奏的生活中&#xff0c;植物神经紊乱已成为一种常见的健康问题。你是否经常感到焦虑、失眠、疲劳&#xff0c;甚至消化不良&#xff1f;这些可能都是植物神经紊乱的表现。幸运的是&#xff0c;通过适当补充维生素&#xff0c;我们可以有效缓解症状&#xff0c;恢复身…