文章目录

  • 前言
  • 1 基于模型的软件开发概述
  • 2模型驱动架构
    • 2.1 模型驱动的软件体系结构
    • 2.2 模型驱动的软件开发步骤
  • 3 建模语言
    • 3.1UML
    • 3.2 SysML
    • 3.3 AADL
  • 4 软件建模工具
    • 4.1 Rhapsody
    • 4.2 SCADE
    • 4.3 Matlab
      • 4.3.1 Matlab Coder
      • 4.3.2 Simulink Coder
    • 4.4 其他工具
      • 4.4.1 Enterprise Architect
      • 4.4.2 MagicDraw
      • 4.4.3 RT-CASE
      • 4.4.4 STUDIO
      • 4.4.5 Capella
    • 4.5 工具比较
  • 5 基于模型的软件工程的实施方法
    • 5.1 软件建模工具选择方案
    • 5.2 非图形界面的嵌入式软件开发的建模方案
    • 5.3 图形化界面的嵌入式软件开发的建模方案
      • 5.3.1 基于SCADE工具的软件开发
      • 5.3.2 基于Rhapsody+Simulink+QT/VC的多软件协同开发
  • 6 总结

前言

本文详细介绍了基于模型的软件开发方法的概念、模型驱动的体系结构和开发步骤、建模语言、建模工具,对各种建模工具进行了比较、分析;本文从软件算法复杂度和架构复杂度两个维度来选择建模工具,最后针对非图形界面的嵌入式软件和图形化界面的嵌入式软件,分别给出软件建模方案。

1 基于模型的软件开发概述

基于模型的软件开发(MBSD:Mode Based Software Development)、模型驱动的软件开发(MDSD: Mode Driven Software Development)、基于模型的软件工程(MBSE: Model Based Software Engineering)、模型驱动的软件工程(MDSE: Model Driven Software Engineering)是软件工程发展的一个重要方向,是一种以建模和模型转换为主要途径的软件开发方法。
模型是实际系统或过程的代表或描述,它是实际系统一部分属性的抽象或模仿,而不是全部属性的复制,模型的实质是在一组简化的假设条件下,描述一个实体活动的最本质的属性。模型用于描述项目相关人员对复杂系统的理解和认知,是项目相关人员之间交流的基础,是系统开发的依据。
基于模型的软件开发方法是指建立一个完整的软件系统模型,依据模型验证软件系统的需求及设计方案,产生和调试软件程序代码的方法。模型的可视化意味着可视化软件开发。
模型驱动工程的优势在于,使用更接近于人的理解和认识的模型,尤其是可视化模型,有利于设计人员将注意力集中在和业务逻辑相关的信息上,而不用过早地考虑与平台相关的实现细节。在MBSD中模型不再是一种设计辅助工具,而是实际开发过程中的产品,并随着开发过程的迭代不断改变。模型与代码地位同样重要,模型与代码可同步化。
基于模型的软件开发流程将发生重大转变,如图1所示,省去了编码和单元测试,在代码之前及完成绝大部分的设计验证。

2模型驱动架构

模型驱动架构(MDA:Mode Driven Architecture)是模型驱动软件工程(MBSE: Model Based Software Engineering)的一个具体和部分的实现途径。
模型驱动架构(MDA)是由对象管理组织(OMG)提出的一种新的软件体系结构开发的框架。模型驱动架构不仅把建模语言用作是一种设计语言,还用作是一种编程语言,并让模型在软件开发中扮演一种极其重要的角色,一切都是模型就是模型驱动架构的基本思想。然后通过架构性的分离来使软件的可重用性、可维护性、互操作性、可编制性以及轻便性实现,并将软件的开发效率提高。

2.1 模型驱动的软件体系结构

在模型驱动架构中,模型成了软件开发的主干及核心,不再只是一种辅助沟通的工具和描绘系统,而且从不同的视角可以用不同的模型对一个系统进行描述。因此,MDA 中将这些模型分为了以下三个结构。
1)CIM(Computation Independent Model计算无关模型)
通常所讲的“业务模型”就是指计算机无关模型,这个层次的模型就只是对控制过程、步骤进行详细的表述,在如何用软件来实现控制过程、步骤方面毫无涉及。
2)PIM(Platform Independent Model平台无关模型)
这一层次的模型将如何用软件来实现控制过程、步骤方面进行了详细的表述,并将一些与基础功能毫无关系的技术细节进行了去除,所以用于构造平台无关模型的语言不仅要抽象性较高,与具体的细节能够互相脱离,必须还要能对系统的动态行为与静态结构进行精准的建模。
UML是与具体实现平台无关的建模语言,它利用图形符号标示系统中的对象和关系,在MDA中能精确、全面表达目标系统的静态结构和动态行为。
3)PSM(Platform Specific Model平台相关模型)
这一层次的模型是与代码一级最贴近的,能够将特定技术对软件系统功能具体的实现进行详细的描述,所以,用于构造平台相关模型的语言不仅必须要有一定的扩展性,还必须要具备足够的精确性,这样才能使与各种实现技术紧密挂钩的要求得到有效的满足。

2.2 模型驱动的软件开发步骤

1)分析、确定软件的业务需求,建立计算无关模型(CIM);
2)利用模型驱动软件开发的专用建模工具将业务模型(即PIM )的图形画出来,并注意不管使用的目标平台是什么,画出来的UML 模型都是相同的,因为这个UML 模型是核心的业务组件和服务的代表,与任何具体实现它的开发技术都毫无关系;
3)建立平台相关模型(PSM)画出来,并注意在这个阶段的模型图中,不仅指定与某种技术相关,而且还有某些特定技术的元素包含在内;
4)最后利用模型驱动的软件开发工具进行应用程序代码的生成工作,并对UML无法进行建模的细节开展填补工作,手动编写代码。
目前,可通过软件工具完成PIM到PSM之间,以及模型和代码之间的自动转换。

3 建模语言

3.1UML

统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML使用面向对象设计的建模工具,但独立于任何具体程序设计语言。UML可以从不同角度描述人们所观察到的软件视图,也可以描述在不同开发阶段中的软件的形态。UML可以建立需求模型、逻辑模型、设计模型和实现模型等。
UML采用一组图形符号来描述软件模型,这些图形符号具有简单、直观和规范的特点,开发人员学习和掌握起来比较简单。
UML为软件系统建立可视化模型。UML符号具有良好的语义,不会引起歧义;基于UML的可视化模型,使系统结构直观、易于理解;使用UML进行软件系统的模型不但有利于系统开发人员和系统用户的交流,还有利于系统维护。有了正确的模型就可以实现正确的系统设计,保证用户的要求得到满足,系统能在需求改变时站得住脚。对于一个软件系统,模型就是开发人员为系统设计的一组视图。这组视图不仅描述了用户需要的功能,还描述了怎样去实现这些功能。
UML为软件系统建立构件。UML不是面向对象的编程语言,但它的模型可以直接对应到各种各样的编程语言。例如,它可以使用代码生成器工具将UML模型转换为多种程序设计语言代码,如可生成C++,JAVA, Visual basic等语言的代码。
UML为软件系统建立文档。UML可以为系统的体系结构及其所有细节建立文档。不同的UML模型图可以作为项目不同阶段的软件开发文档。

3.2 SysML

对象管理组织OMG 决定在对UML2.0 的子集进行重用和扩展的基础上,提出一种新的系统建模语言——SysML(Systems Modeling Language),作为系统工程的标准建模语言。和UML用来统一软件工程中使用的建模语言一样,SysML的目的是统一系统工程中使用的建模语言。它可以支持系统工程应用的多领域系统包含硬件、软件、信息等系统的需求分析、系统设计、功能描述、系统验证等。

3.3 AADL

AADL(Architecture Analysis & Design Language,架构分析和设计语言)主要用于对嵌入式实时系统的体系结构进行分析何设计,是一个支持MBE(Model Based Engineering )的建模基础架构。

4 软件建模工具

模型驱动的软件开发方法为软件的开发和设计提供了新的思路,通过围绕模型进行软件的开发,实现了问题的统一描述,通过开发工具的使用,可以实现模型的自动转换,代码以及文档的同步生成,大大提高了软件的开发效率;下面给出了几种较为成熟的模型驱动的开发工具和平台。

4.1 Rhapsody

IBM Rational Rhapsody是遵循UML/SysML的模型驱动的软件开发平台。Rational Rhapsody为系统工程师及软件开发者提供了可视化开发环境,以支持嵌入式和实时系统软件的设计开发。
通过Rhapsody的模型驱动体系结构可以快速地将与平台无关的应用模型部署到实时嵌入式操作系统。Rhapsody适应迭代设计与开发,软件开发可以在宿主机环境持续的执行和验证,继而生成嵌入式应用,下载到目标机进行测试。Rational Rhapsody 产品家族提供了多个版本来帮助系统工程师及嵌入式软件开发人员分析、设计、开发、测试和交付嵌入式及实时系统与软件。
对于系统工程师,Rational Rhapsody Architect for Systems Engineers基本版带来了采用SysML/UML的需求分析管理功能。Rational Rhapsody Designer for Systems Engineers基本版还包括了设计验证模拟功能。
对于软件开发人员,Rational Rhapsody Architect for Software版提供了逆向工程和支持 C、C++、Java 和 C# 的代码框架生成功能。Rational Rhapsody Developer版还额外提供了可视化开发环境,可以支持目标嵌入式实时操作系统(RTOS)的 C、C++、Java 和 Ada 行为代码生成。

4.2 SCADE

SCADE是法国爱斯特尔技术有限公司的主要产品系列。SCADE是高安全性应用开发环境(Safety Critical Application Development Environment)的简称,用于开发达到航空业 DO-178B 标准的嵌入式软件。产品涵盖了高安全性嵌入式系统开发的各个内容和阶段。其主要产品有:
1)SCADE Suite:业内领先的面向高安全性的集成软件开发环境,通过采用scade语言和统一的形式化语义,可实现基于模型的设计、仿真、验证、认证级代码生成以及与其他开发工具和平台的交互。SCADE Suite代码生成器可以自动生成C代码和 Ada代码。SCADE Suite采用图形建模实现系统概要设计和详细设计后就能直接生成高安全性嵌入式代码,并且由于 SCADE 的代码生成工具 KCG经过认证,满足航空业 DO-178B 的 A 级标准,能够确保自动生成代码与模型设计完全一致,不会引入任何错误,可以省略所生成代码的单元测试 ,保证软件需求和代码执行的高度同步,具有开发周期短,安全性高,交互界面友好等优点。
2)SCADE Display:是一套灵活的面向高安全性图形显示和HMIs的设计与开发环境。是新一代图形软件开发平台,基于该平台可完成原型生成、设计仿真、验证和认证级代码生成等工作,可与 SCADE Suite 的联合仿真。SCADE Display能够帮助工程师进行嵌入式图形,显示和人机界面的开发和认证代码生成,用于高安全要求的显示系统,如驾驶舱,抬头显示,头盔,飞行管理系统,交通和防撞系统,以及车载导航系统和数字地图,符合最严格的质量标准和目标。
3)SCADE LifeCycle:主要功能包括需求和可追溯性管理工具、符合DO-178B标准的认证计划模板以及自动化文档生成器。
4)SCADE System:基于SysML和Eclipse 标准,通过使用SCADE System来联接 SCADE Suite、SCADE Display和SCADE LifeCycle,系统工程师和软件工程师可以在同一构架下工作,从而避免重复劳动以及系统结构和软件行为定义之间的偏差。

4.3 Matlab

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理等领域。
Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计、建模和仿真环境,借助 Simulink能够将模型组合成一个系统级仿真,即使模型不是在 Simulink 中构建;能与Ansiy(有限元分析软件)、Saber、Rhapsody等多种软件进行协同仿真,具有多学科协同设计、仿真的优势。
基于模型的软件设计中,代码生成主要用到MATLAB Coder和Simulink Coder、Embedded Coder这三个工具。
MATLAB Coder用于从MATLAB的m函数生成 ANSI C/C++ 代码,同时也是使用Simulink Coder的一个前置条件。Simulink Coder是从Simulink模型来生成ANSI C/C++代码。Embedded Coder 则允许更进一步的针对MATLAB Coder或者Simulink Coder 生成的代码进行优化和定制,从而生成可以应用到嵌入式产品中去的产品级代码。

4.3.1 Matlab Coder

MATLAB Coder可从 MATLAB代码生成 C 和 C++ 代码,适用于从桌面系统到嵌入式硬件等多种硬件平台。支持大多数MATLAB 代码和各种工具箱。您可以将生成的代码作为源代码、静态库或动态库集成到您的项目。生成的代码可读且可移植。您可以合并现有的 C 代码和库,以保证算法关键部分的高效能或高可信代码的重用。您还可以将生成的代码打包为 MEX 函数,用于在 MATLAB 环境中执行验证或加速。
Embedded Coder增强了 MATLAB Coder 在生产方面的用途,支持代码自定义、目标特定的优化、代码可追溯性以及软件在环 (SIL) 和处理器在环 (PIL) 验证。
MATLAB Coder 利用范围广泛的 MATLAB 语言特性来生成代码,设计工程师使用这些语言特性来开发作为大型系统组件的算法。这包括来自 MATLAB 以及配套工具箱 的超过 1900 个运算符和函数。

4.3.2 Simulink Coder

Simulink Coder(以前称为 Real-Time Workshop)可从 Simulink模型、Stateflow图和 MATLAB函数生成并执行 C 和 C++ 代码。生成的源代码可用于实时和非实时应用,包括仿真加速、快速原型建立和硬件在环测试。
1)集成现有代码:可以使用 C Caller 模块或Legacy Code Tool合并手写的现有 C/C++ 代码,以便与生成的代码进行仿真和集成。
2)实时仿真与测试:使用硬件在环仿真和快速原型设计,在各种实时机器(包括使用 Simulink Real-Time的Speedgoat 目标计算机硬件)上测试嵌入式系统设计及建立原型。
3)部署到嵌入式目标:使用 I/O 模块库配置和访问外围设备及通信接口,在支持的嵌入式目标上运行模型中的代码。Simulink Coder支持众多厂家的硬件接口,包括TI的C2000 系统芯片。
4)调试参数和记录数据:使用 Simulink Coder,当代码在外部设备执行的同时,可以通过 XCP、TCP/IP 和串行 (RS-232) 通信从模型层传输信号,可以通过使用控制板模块中的示波器、仪表板和实时流数据图等查看数据和调试参数,以访问和优化您在Simulink中的设计。

4.4 其他工具

4.4.1 Enterprise Architect

Enterprise Architect 是Sparx Systems 公司的旗舰产品,它覆盖了系统开发的整个周期,除了开发类模型之外,还包括事务进程分析,使用案例需求,动态模型,组件和布局,系统管理,非功能需求,用户界面设计,测试和维护等。EA为用户提供一个高性能、直观的工作界面,联合UML 2.0最新规范,为桌面电脑工作人员、开发和应用团队打造先进的软件建模方案。EA 支持文档生成及部分代码生成。

4.4.2 MagicDraw

MagicDraw UML是一款UML建模和面向对象系统设计分析工具。
1)仿真分析功能:支持模型调试和执行动画环境;支持用户交互界面建模和执行;内嵌求解器,支持与专业数学分析工具集成(Matlab/Simulink、Mathmatics、Maple、FMU 等)。
2)设计优化功能:提供SysML 参数模型和多学科分析模型接口,支持需求验证、权衡对比分析、设计空间探索、自动设计优化等功能。
3)自动代码生成功能:支持C/C++、Java、C# 语言的部分代码生成,能够从系统行为模型自动生成可执行代码,支持代码的仿真及目标环境执行功能。
4)自动文档生成功能

4.4.3 RT-CASE

RTCASE实时系统结构分析/设计工具是专业性软件工程工具,完全支持实时系统软件的分析和设计,支持UML建模和代码框架生成。

4.4.4 STUDIO

STUDIO是欧洲Ellidiss公司开发的可视化建模工具,使用自上而下的建模方法以缩小模型与代码之间的差距,可以从AADL代码生成Ada代码和C++代码。

4.4.5 Capella

Capella是目前在欧洲航空航天界广泛应用的一种开源MBSE工具,其目的在于提供一种针对高安全性要求的复杂系统进行开发建模的图形化环境。

4.5 工具比较

国内常用的几个商用MBSE软件功能对比如表1所示。

从上面几个常用的MBSE工具来看,针对嵌入软件设计,且只有SCADE Display支持图形界面软件的开发。

5 基于模型的软件工程的实施方法

5.1 软件建模工具选择方案

复杂软件可从两个维度定义:1)算法复杂度;2)架构复杂度;软件建模方法、建模工具选择可以从这两个维度确定。
1)算法复杂度低、架构复杂度低:手工编写软件;
2)算法复杂度高、架构复杂度低:采用Simulink建模,便于算法设计仿真,如伺服驱动器软件;
3)算法复杂度低、架构复杂度高:采用UML建模,如火控软件、车控软件、综控软件;
4)算法复杂度高、架构复杂度高:采用UML与Simulink联合建模,如飞控计算机软件;
UML是一种通用的建模语言,缺少对嵌入式领域的强力支持,因此采用专门的仿真软件可以弥补UML动态行为建模方面的不足。Simulink就是一款功能强大的仿真工具,支持在交互式、图形化环境中对动态系统进行仿真和分析。更重要的是,针对嵌入式的领域特点,Simulink提供了许多具有特殊功能的工具包,以方便软件开发人员使用。

5.2 非图形界面的嵌入式软件开发的建模方案

Rhapsody 是开发反应式系统方面市场领先的环境,而 Simulink 是作基于模型的设计,开发动态控制和信号处理系统方面的组件。随着技术的发展,现在Rhapsody/ Simulink这两个工具均相互支持协同仿真,这两个工具的集成使开发者能够通过易于应用的建模环境来开发健壮的高质量的系统。
因此对于复杂系统,采用Rhapsody、Simulink这两个工具协同建模、设计、仿真、代码生成,使用Rhapsody完成软件的架构设计,使用Simulink完成软件中的算法设计,最后进行协同仿真、模型验证。

5.3 图形化界面的嵌入式软件开发的建模方案

5.3.1 基于SCADE工具的软件开发

使用SCADE一套软件(含SCADE Suite和SCADE Display)即可完成图形化软件的开发,代码生成率高,可靠性好。

5.3.2 基于Rhapsody+Simulink+QT/VC的多软件协同开发

采用Rhapsody+Simulink+QT/VC三种类型软件工具协同使用,完成图形化界面的软件建模和开发。此方法中,软件设计采用MVC设计模型。MVC全名是Model View Controller,是模型(model)、视图(view)、控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,采用UML/Simulink建模,使用Rhapsody/Simulink工具生成代码。View(视图)是应用程序中处理数据显示的部分,采用QT、VC等专业软件设计界面,这些工具支持很多的控件,并且有很多第三方控件库支持,采用拖、拽方式设计界面,能自动生成绝大多数代码。Controller(控制器)是应用程序中处理用户交互的部分;一般程序员手动编写代码。

6 总结

随着时代的进步,基于模型的软件开发模式成为软件系统创新的新路径,为软件开发率的提高,软件的可移植性增强以及文档编制的便利性等方面都进行了创新。
目前基于模型的软件开发方法还是严重依赖的工具的一种开发方式,商用MBSE设计工具各有优缺点,单个MBES工具不能完全独立完成一个复杂软件的开发,而多个MBES工具协同建模、开发、代码生成,必然存在接口、代码风格不统一等多种问题,仍需要程序花费大量时间进行手工编码;而且有些工具不能完全确保生成的代码的完全正确性,还需要进行软件测试以及手工更改部分代码。虽然存在一些不足,但基于模型的软件开发模式在嵌入式软件设计、复杂软件的部分功能设计、软件原型设计中应用广泛。

参考文献
[1]赵晓峰. 模型驱动的软件开发模式研究[J]. 信息技术与信息化. 2015(7)
[2]郭鹏,李亚辉等. 面向嵌入式软件开发的UML到Simulink模型转化方法[J]. 计算机科学, 2016(2):192–198
[3]傅亮. 基于 SCADE 模型驱动的软件集成设计[J]. 航空电子技术. 2013(09):26–30
[4]王西超等. 基于Rhapsody的飞控系统虚拟样机设计环境[J]. 振动、测试与诊断. 2013(2)
[5]周彰毅等. 基于SCADE的航空发动机FADEC软件开发[J]. 测控技术. 2018(1)
[6]UML百度百科

基于模型的软件开发方法综述相关推荐

  1. 敏捷软件开发方法综述

    敏捷软件开发方法 敏捷,顾名思义,就是轻巧.机敏.迅捷.灵活.活力.高效....,敏捷过程很容易适应变化并迅速做出自我调整,在保证质量的前提下,做到文档.度量适度.敏捷开发是一种以人为核心.迭代.循序 ...

  2. 初探强化学习(7)基于模型的强化学习的应用综述

    本文是直接翻译一篇文章的,我先把原文地址放在这里. 原文名字为:Survey of Model-Based Reinforcement Learning: Applications on Roboti ...

  3. 聚类算法总结 划分法,层次聚类,基于网格,基于密度,谱聚类,基于模型,模糊聚类

    划分法: K-means:随机选择k个类的初始中心,对每一个样本都求解到k个中心点的距离,将它归类到距离最短的中心所在的类别.通过计算与类别内样本平均距离最小的点作为新的中心点.直到类别的聚类中心点不 ...

  4. 基于深度优先搜索回溯法的人狼羊菜过河模型

    基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...

  5. 【论文速递】基于改进层次分析法与熵权法的目标选择模型

    [论文原文]:基于改进层次分析法与熵权法的目标选择模型 作者信息: 张指辉,张毅,李健宁 获取地址:https://kns.cnki.net/kcms2/article/abstract?v=3uoq ...

  6. 整体化方法打造基于模型的企业(MBE)| 达索系统百世慧®

    概要 航空航天与国防(A&D)行业的企业领袖正面临着一个关键的业务实施挑战,13随着巿场机遇增多和各项需求不断严苛化,为响应操作速度加快和更妥善地利用现有资源,业内已确立了三大要素: 项目复杂 ...

  7. 几种软件开发方法对比

    综述 软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过程. 本文对净室方法.结构化方法.面向对象方法.原型法.逆向工程等方法进行梳理,并对各种开发方法特点.优点进行对比. 净室 ...

  8. 多模态情感识别数据集和模型(下载地址+最新综述2021.8)

    引用论文:Zhao, Sicheng, et al. "Emotion Recognition from Multiple Modalities: Fundamentals and Meth ...

  9. 插件体系结构软件开发方法研究

    插件体系结构软件开发方法研究 计算机软件与理论专业 研究生 一觉亮天 随着计算机技术的发展,软件体系结构和开发方法也在发生着重大变化.为了高效率地进行软件开发,并且开发出高质量的产品,人们一直在寻求更 ...

  10. 基于熵权法优劣解距离法_基于优劣解距离法的火电机组单辅机运行状态评估

    龙源期刊网 http://www.qikan.com.cn 基于优劣解距离法的火电机组单辅机运行状 态评估 作者:王瑾石 来源:<中国化工贸易 · 上旬刊> 2019 年第 01 期 摘要 ...

最新文章

  1. mysql双数据源动态切换_Spring boot+Mybatis多数据源动态切换
  2. SOPC第二课 新手易犯错误和小灯闪烁SOPC代码以及固化讲解
  3. Linux下fork()函数
  4. php怎么弄自动填充,ThinkPHP 自动填充(自动完成)详解及实例
  5. Java整合Spring发送邮件
  6. mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置
  7. 可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来
  8. 8_python基础—高级变量类型(字符串、列表、元组、字典、集合)
  9. THUSC2016 游记
  10. 全网首发:sqlite-jdbc在UOS上弹窗提示的解决办法
  11. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.
  12. CentOS7.9 EDA软件,Cadence、Synopsys、Mentor、Ansys、Keysight、Matlab、Vivado和Quartus等工具虚拟机平台
  13. Wake On Lan(WOL)失败的原因
  14. html页面中的快捷键设置
  15. 12306 验证码识别源码
  16. 【First-order Methods】 5 Smoothness and Strong Convexity
  17. 锐龙R3 4300U怎么样 相当于什么水平
  18. js进行数学运算,加法,减法,乘法,除法
  19. 坐等破亿!华为鸿蒙系统用户升级量已突破1800万,你要升级吗?
  20. 基于PHP的招聘网站

热门文章

  1. 51单片机(十六)—— 定时器0和定时器1寄存器介绍及功能描述
  2. Android仿射密码破译app
  3. 读书笔记《推荐系统实战》| 好的推荐系统
  4. (六)DDR协议功能之ODT模式与ZQ校准
  5. uniapp(APP)打开高德导航
  6. 效率篇-定时任务管理系统,替代crontab
  7. 【小5聊】sql server基础之查询经纬度范围,10公里范围的经纬度标注点
  8. CTF隐写术知识点总结
  9. 学习Pandas(Kaggle)
  10. gerrit 将代码从一个分支合并到另外一个分支 Cherry Pick的使用