DevOps:CI、CD、CB、CT、CD
目录
一、软件开发流程演化快速回顾
(一)瀑布模型
(二)原型模型
(三)螺旋模型
(四)增量模型
(五)敏捷开发
(六)DevOps
二、走近DevOps(Development 开发,Operations 运维)
(一)开发全流程周期
(二) DevOps与传统开发方式区别
(三)DevOps 具体落地
(四)DevOps流程简述
三、CI(Continuous Integration,持续集成)
四、CD(Continuous Delivery,持续交付)
五、持续构建(Continuous Build,CB)
六、持续测试(Continuous Testing,CT)
七、持续部署(Continuous Deployment,CD)
一、软件开发流程演化快速回顾
在软件开发流程的演化过程中,我们可以观察到一系列方法的逐步发展和改进。其基本时间线总结如下:
软件开发流程的演化过程、各个阶段的特点和分析可以整合成下表直观来看:
时间线 | 软件开发流程 | 特点与分析 |
---|---|---|
20世纪70年代中期 | 瀑布模型 | - 最早的软件开发方法之一,将开发过程划分为线性阶段。 - 缺乏灵活性,难以应对需求变化。 |
20世纪70年代晚期 | 原型模型 | - 引入快速原型开发的概念,旨在更早地发现和解决问题。 - 提高了与用户交互和验证需求的效率。 |
1988年 | 螺旋模型 | - 将软件开发过程视为一个不断循环的过程,注重风险管理和迭代开发。 - 提高了开发过程的灵活性和适应性。 |
90年代初期 | 增量模型 | - 将开发过程划分为多个增量,每个增量都包括完整的开发周期。 - 逐步完成系统开发,增强了灵活性和用户满意度。 |
1990年代末期至2000年初期 | 敏捷开发 | - 强调快速响应变化、灵活性和客户满意度。 - 通过迭代、自组织和持续改进,提高了软件交付的效率和质量。 |
2009年左右 | DevOps | - 结合了开发和运维的文化和实践,通过持续开发、持续测试、持续集成等实践加快了软件交付速度,提高了软件质量。 - 强调开发团队和运维团队之间的协作和整合。 |
(一)瀑布模型
瀑布模型是一种顺序执行的软件开发方法,最早由温斯顿·罗伊斯在1970年提出。它将软件开发过程划分为一系列线性阶段,包括制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动。这些阶段按照固定的次序依次执行,前一个阶段的输出作为下一个阶段的输入,如同瀑布流水逐级下落,因此得名。
瀑布模型严格强调文档化,每个阶段都有相应的文档输出,例如需求文档、设计文档、测试文档等。其优点在于结构清晰、易于管理和控制,有利于项目进度的把控。然而,瀑布模型的缺点也显而易见,包括缺乏灵活性、难以适应需求变化和市场变化、开发周期较长、只有在开发后期才能看到软件“模样”等。另外,严格的阶段顺序和文档化也可能导致开发人员感觉过多地花费在编写文档上,而不是真正的软件开发工作上。
总的来说,瀑布模型强调了阶段的顺序性和文档化,适用于一些对需求变化要求不高、对项目进度和成本控制要求较高的项目。但在需求变化频繁、市场变化快速的情况下,瀑布模型可能显得束缚和不适应。
(二)原型模型
原型模型是一种软件开发方法,其基本思想是在开发真实系统之前,先构造一个原型,然后逐步完成整个系统的开发工作。在需求分析阶段很难得到完全、一致、准确、合理的需求说明,因此快速原型模型利用原型辅助软件开发,通过快速实现一个原型来加强用户与开发者之间的通信与反馈。通过反复评价和改进原型,减少误解,弥补漏洞,适应变化,最终提高软件质量。
原型模型的优点在于它允许快速建立原型系统,并通过与用户交互和反馈来验证和修正需求,从而减少后续阶段的返工。同时,通过建立原型系统,开发人员可以提前学习到许多关于系统的信息,从而减少后续阶段的错误。此外,原型模型加强了用户与开发者之间的通信与反馈,有助于提高软件质量。
然而,原型模型也存在一些缺点。快速建立的系统结构加上连续的修改可能会导致产品质量低下,特别是对于大型系统的开发可能不适用。此外,选择原型时可能会限制开发人员的创新,因为所选用的原型不一定符合主流的发展。最后,原型模型是不带反馈环的,软件产品的开发基本上是按线性顺序进行的。
(三)螺旋模型
螺旋模型是由巴利·玻姆(Barry Boehm)于1988年提出的软件开发方法。
螺旋模型的优点在于它结合了瀑布模型和快速原型方法的优点,强调了风险管理和迭代开发。通过周期性的迭代,团队可以逐步构建系统,并在每个周期中进行风险分析和评审,提前发现和解决问题。这种灵活性和适应性使得螺旋模型尤其适用于大型复杂系统的开发,尤其是当项目需求不明确或变化频繁时。另外,螺旋模型的风险分析机制允许团队在无法排除重大风险时有机会停止开发,以减小潜在损失。
然而,螺旋模型的缺点包括可能较长的开发周期和对较高技术和管理水平的要求。此外,对风险分析的准确性和有效性要求较高,难以在一些简单或小规模的项目中合理应用。
(四)增量模型
增量模型是一种软件开发方法,将产品分解为多个组件,并在日程时间的推进中交错线性序列,每个序列生成一个可发布的“增量”。每个增量都通过需求、设计、编码和测试阶段,然后逐步并入已有的软件体系结构中。增量模型强调每个增量都发布一个可操作的产品,客户对每个增量的使用和评估都指导下一个增量的开发。该模型灵活管理技术风险,每次迭代后执行回归测试,容易识别和修复故障,客户可以根据每个增量的功能变化进行反馈。
增量模型的优点在于它灵活地管理技术风险,允许灵活的人员分配和计划管理。每次迭代后执行回归测试,有助于快速识别和修复故障。客户可以根据每个增量的功能变化进行反馈,从而提高产品的灵活性和用户满意度。
然而,增量模型也存在一些缺点。由于构件逐步并入现有系统中,需要开放式的软件体系结构,并且可能会退化为边做边改模型,导致软件过程失去整体性。如果增量包之间存在相交情况且未很好处理,则需要做全盘系统分析。此外,增量产生的成本可能超过组织的成本,且随着产品增加功能可能会出现与系统体系结构相关的问题。
(五)敏捷开发
敏捷开发是一种软件开发方法,其基本思想是通过小规模的迭代开发和持续交付来满足不断变化的需求。敏捷开发强调团队合作、快速反应和灵活性,以更好地应对不确定性和变化。其核心原则包括个体和交互、工作的软件、客户合作、响应变化等。
敏捷开发的优点在于它强调灵活应对变化,通过小规模的迭代开发和持续交付,能够快速响应客户需求,提高产品的竞争力和客户满意度。同时,敏捷开发也促进了团队合作和沟通,增强了团队的凝聚力和工作效率。
然而,敏捷开发也存在一些挑战。它要求团队具备高度的技术和管理水平,需要团队成员之间密切的合作和沟通,如果团队协作不够密切,可能会影响项目的进展和质量。此外,敏捷开发也需要客户的积极参与和支持,如果客户参与度不高或者需求不明确,可能会导致项目进展缓慢或者质量下降。
(六)DevOps
DevOps是一种软件开发和运维的文化和方法论,其基本思想是通过促进开发团队和运维团队之间的协作和沟通,实现软件开发、测试、部署和运维的自动化和持续化。它强调了团队之间的合作和文化变革,以及使用工具和技术来实现持续交付和持续集成。
DevOps的优点在于它通过促进团队合作和自动化流程,加速了软件交付速度,提高了软件质量和稳定性,并降低了软件发布的风险。同时,它还增强了团队之间的协作和凝聚力,有助于提高团队的工作效率和生产力。
然而,DevOps也面临一些挑战。首先,实施DevOps需要进行文化变革和团队协作,这可能会遇到组织结构和文化的阻力。其次,引入DevOps可能需要投入一定的人力资源和资金成本,特别是在初始阶段可能会增加一些开发和运维成本。最后,DevOps的实施还涉及使用各种工具和技术来实现自动化和持续化,这可能会增加技术复杂性和学习成本。
二、走近DevOps(Development 开发,Operations 运维)
(一)开发全流程周期
在软件开发领域,开发全流程周期是指将一个软件产品从概念到最终交付的完整过程。这个过程通常包括需求分析、设计、开发、构建、测试、部署与发布以及运维与维护等阶段。
下面是一个以表格方式分析和讲解软件开发全流程周期,包括各阶段的主要活动、产物和相关工具/技术的示例:
阶段 | 主要活动 | 产物 | 示例工具/技术 |
---|---|---|---|
需求分析阶段 | 收集和分析用户需求 | 需求规格文档 | 会议记录、用户故事板、调查问卷、原型工具(如Axure、Mockplus) |
设计阶段 | 设计软件系统的架构、模块、界面等 | 系统架构设计文档、界面设计稿、数据库设计文档 | UML、流程图、数据库建模工具(如MySQL Workbench) |
开发阶段 | 编写代码,实现软件的功能和特性 | 源代码、可执行程序 | 编程语言(如Java、Python、JavaScript)、集成开发环境(IDE) |
构建阶段 | 编译、打包、部署代码到测试环境或其他目标环境 | 可执行程序、部署包 | 构建工具(如Maven、Gradle)、持续集成工具(如Jenkins) |
测试阶段 | 测试和调试软件,发现并修复错误和缺陷 | 测试报告、缺陷报告 | 自动化测试工具(如Selenium、JUnit)、缺陷管理工具(如JIRA) |
部署与发布阶段 | 将软件部署到目标环境,并向用户发布 | 部署包、发布说明文档 | 容器化技术(如Docker、Kubernetes)、部署工具(如Ansible) |
运维与维护阶段 | 持续监控和维护软件,及时处理用户反馈和问题 | 日志记录、用户反馈报告 | 监控工具(如Prometheus、Grafana)、日志管理工具(如ELK Stack) |
(二) DevOps与传统开发方式区别
通过上面的整体回顾和全观开发全流程周期,应该可以看到:传统的开发方式往往是线性的,各个阶段之间存在明显的边界,开发与运维之间存在隔阂,导致沟通效率低下。
相比之下,DevOps使开发与运维的流程形成了一个闭环。它打破了传统开发中的隔阂,通过自动化和持续集成的方式,使得开发团队和运维团队更加紧密地协作,从而提高了协作效率和软件交付速度。
(三)DevOps 具体落地
要使DevOps理念真正落地,确实需要团队文化、流程和工具的全面支持和配合。
-
团队文化: 成员需要理解并认可DevOps的核心理念,包括持续改进、自动化、协作和共享责任等。团队应该鼓励开放的沟通和合作,以及对失败的接纳和学习。
-
流程: 确定适合团队和项目的DevOps流程。这可能包括持续集成、持续交付、持续部署、持续监控等。流程应该是自动化的、可重复的,并且能够快速响应变化和需求。
-
工具: 选择合适的工具来支持DevOps流程。这些工具可能包括版本控制系统(如Git)、持续集成工具(如Jenkins)、配置管理工具(如Ansible)、容器化平台(如Docker、Kubernetes)以及监控和日志管理工具等。
通过团队文化的培育、流程的设计和工具的选择,团队可以更好地实现DevOps理念,提高软件交付的效率和质量,从而实现持续创新和业务价值的快速实现。
(四)DevOps流程简述
-
持续集成(Continuous Integration,CI): 持续集成是一种软件开发实践,通过频繁地将代码集成到共享存储库中,并自动进行构建和测试,以确保团队能够快速发现和解决集成问题。
-
持续交付(Continuous Delivery,CD): 持续交付是一种软件交付实践,通过自动化和持续的流程,使团队能够随时交付高质量的软件到生产环境,但仍需要人工审查和确认。
-
持续构建(Continuous Build,CB): 持续构建是持续集成的一部分,指的是持续地自动构建软件,并生成可执行的程序或部署包,以便进行进一步的测试和部署。
-
持续测试(Continuous Testing,CT): 持续测试是一种软件测试实践,通过自动化测试和持续集成的方式,持续地对软件进行测试,以确保软件质量和稳定性。
-
持续部署(Continuous Deployment,CD): 持续部署是一种软件部署实践,通过自动化流程将经过测试的软件自动部署到生产环境,以实现快速且可靠的软件发布
三、CI(Continuous Integration,持续集成)
持续集成确实是软件开发周期中的一种实践,其主要目的是确保团队能够频繁地将代码合并到主干分支,并自动进行构建和测试。通过集成代码仓库、构建工具和测试工具,团队可以在代码发生变化时自动触发构建和测试流程,以及执行后续的自定义动作。这种频繁地将所有开发者的工作合并到主干上的做法,有助于尽早地发现和解决集成问题,从而提高软件质量和团队的开发效率。
简化的含义为:持续集成意味着将开发人员的代码更频繁地集成到共享代码仓库中,以确保团队的代码始终处于一个可集成的状态,进而促进更快速地软件交付和更高质量的软件产品。
持续集成的流程通常分为三个步骤:
- 开发人员提交代码到源代码仓库(Source Repository)。
- CI服务器(持续集成服务器)通过触发机制(如git hook)执行编译、测试以及输出结果等相关功能。
- CI服务器向开发人员反馈执行结果的报告。
持续集成的核心目标是确保新增的代码能够与原有代码正确地集成。与后续的持续交付和持续部署相比,其最主要的差别在于目标的不同。
持续集成的优势包括:
- 易于定位错误:频繁的代码集成将复杂的代码逻辑切割成小块,有助于更容易地定位和解决问题。
- 易于控制开发流程:细致的工作提交使得工作进度更容易判断,有助于管理者规划开发流程。
- 易于CodeReview:代码切分为小块有助于进行代码审查。
- 易于减少不必要的工作:自动化的构建和测试过程可以节约大量时间,使开发人员能够将更多时间投入到有价值的工作中。
四、CD(Continuous Delivery,持续交付)
持续交付是在持续集成的基础上进行了扩展,主要是在持续集成环节完成了软件构建和测试工作后,形成了新的版本,接下来将进行交付。与持续集成不同的是,持续交付的交付对象不是代码,而是可交付的产物,通常是部署到类生产环境(如灰度环境或预发环境)进行测试。
简化的含义是通过一种能够使得软件在较短的循环中可靠地发布的软件工程方法。与持续集成相比,持续交付的侧重点在于实现软件的可交付性,而不仅仅是代码的集成和测试。持续交付通常涉及一些额外的流程,例如部署到类生产环境进行测试、进行灰度测试等,以确保软件能够可靠地发布到生产环境中。
持续交付相比持续集成添加了Test -> Staging -> Production的流程,以确保新增的代码在生产环境中是可用的。
- Test环节不仅包含基本的单元测试,还需要进行更为复杂的功能测试和集成测试等,以确保代码的功能和集成性能。
- Staging阶段指的是类生产环境,模拟真实的网络拓扑、数据库数据和硬件设备等资源,测试代码在生产环境中的表现。
- 每个阶段的执行结果都会向开发人员提供反馈,每个错误都可能导致版本的回滚。一旦测试完成并确认无误,相关人员将手动将其部署到生产环境中。
通过这样的流程,可以确保新增的代码在经过全面的测试和验证后才会部署到生产环境中,从而降低了潜在的生产环境风险,提高了软件的稳定性和可靠性。
五、持续构建(Continuous Build,CB)
持续构建(Continuous Build,CB)是DevOps流程中的一个重要环节,它通常是持续集成和持续交付流程的一部分。持续构建的主要目的是自动化地构建软件项目,并生成可执行的软件包或部署文件。
持续构建的基本思想是将代码提交到源代码仓库后,立即触发构建过程。这包括编译源代码、执行单元测试、生成部署文件等。持续构建的频繁执行有助于尽早地发现代码中的错误和问题,并及时反馈给开发团队。
持续构建的核心优势包括:
- 自动化:持续构建过程完全自动化,无需人工干预,提高了构建的效率和可靠性。
- 及时反馈:持续构建能够在代码提交后立即触发,及时反馈构建结果和错误信息,有助于开发人员及时修复问题。
- 提高软件质量:通过频繁地构建和测试,持续构建有助于提高软件的质量和稳定性,减少潜在的问题和缺陷。
- 加快交付速度:持续构建能够快速生成可部署的软件包或部署文件,加快了软件交付的速度,有利于快速响应用户需求。
通过自动化地构建和测试软件,有助于提高软件开发的效率、质量和交付速度。
六、持续测试(Continuous Testing,CT)
持续测试(Continuous Testing,CT)是DevOps流程中的一个关键环节,它旨在通过持续地进行自动化测试来确保软件质量和稳定性。
持续测试与传统的软件测试方式不同,它不仅限于在开发完成后执行一次测试,而是在整个软件开发周期中持续进行测试。具体来说,持续测试通常包括以下几个方面:
-
自动化测试:持续测试依赖于自动化测试工具和脚本,通过编写自动化测试用例和脚本来模拟用户操作、执行功能和性能测试等,以确保软件的功能和性能符合预期。
-
并行测试:持续测试需要在短时间内完成大量测试,因此通常会采用并行测试的方式,同时运行多个测试用例,提高测试效率。
-
持续反馈:持续测试会及时将测试结果反馈给开发团队,包括测试通过的用例、失败的用例以及错误信息等,以便开发人员及时修复问题。
-
自动化部署测试环境:持续测试还可以借助自动化部署工具,在需要时自动部署测试环境,并在其中执行测试,从而确保测试环境的一致性和可重复性。
七、持续部署(Continuous Deployment,CD)
持续部署(Continuous Deployment,CD)是DevOps流程中的一环,它建立在持续交付的基础之上,旨在将软件的部署过程自动化,以便将新的软件功能频繁地交付到生产环境中。
持续部署的主要特点包括:
-
自动化部署:持续部署通过自动化工具和流程,将新的软件功能自动部署到生产环境中,消除了手动部署过程中的人为错误和延迟。
-
频繁交付:持续部署强调频繁地交付新的软件功能到生产环境中,从而加速了软件开发和交付的速度,提高了团队的反应能力和灵活性。
-
实时监控:持续部署过程中通常会包括实时监控和反馈机制,以确保部署的软件功能在生产环境中稳定运行,及时发现并解决潜在的问题。
-
版本控制:持续部署依赖于版本控制系统和自动化工具,确保部署的软件版本与代码仓库中的代码保持一致,减少了版本管理和部署的复杂性。
持续集成(Continuous Integration,CI)与持续交付(Continuous Delivery,CD)之间的区别在于其对生产环境的自动化程度。
持续集成是指开发人员将代码提交到代码仓库后,自动触发构建、测试等过程,但并不自动将代码部署到生产环境。持续集成的主要目的是确保团队成员的代码能够及时集成,并通过自动化的测试流程进行验证,从而尽早地发现和解决潜在的集成问题。
持续交付则更进一步,除了包含持续集成的流程外,还将代码自动部署到类生产环境(例如预发布环境或灰度环境),以便进行进一步的测试和验证。持续交付的目标是确保团队能够随时准备好将代码部署到生产环境,但仍然需要人工的干预来决定何时进行实际的生产部署。
因此,持续交付相比持续集成,更加强调自动化部署和测试的全流程,以确保新的功能能够及时交付到类生产环境,但仍然保留了人工决策的环节,以便进行最终的生产部署。
一些其他的阅读和参考:
软件开发流程进化史:从瀑布、敏捷到DevOps_的开发_阶段_测试
一文读懂软件开发流程的演变过程 - 知乎
软件测试笔记-软件开发流程的演变_软件开发 流程演变历史-CSDN博客
传统模式 - 软件开发生命周期与过程模型(瀑布模型,原型模型和螺旋模型等) | Java 全栈知识体系
开发模型的理解:瀑布模型/增量式/迭代/敏捷开发——笔记-腾讯云开发者社区-腾讯云
敏捷开发入门教程 - 阮一峰的网络日志
敏捷开发流程的8个步骤是什么
敏捷开发 - 敏捷软件开发理论及流程 | Java 全栈知识体系
敏捷开发的简介及迭代排期的最佳实践_云效(Apsara Devops)-阿里云帮助中心
敏捷与 DevOps - 软件开发实践之间的区别 - AWS
DevOps(过程、方法与系统的统称)_百度百科
DevOps工具链-CSDN博客
认识devops那点事(思维导图,流程大图,工具链)_devops流程图-CSDN博客
https://blog.51cto.com/u_13544/6969630
相关文章:
DevOps:CI、CD、CB、CT、CD
目录 一、软件开发流程演化快速回顾 (一)瀑布模型 (二)原型模型 (三)螺旋模型 (四)增量模型 (五)敏捷开发 (六)DevOps 二、走…...
[leetcode经典算法题]删除有序数组中的重复项(双指针)
删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素…...
【国产MCU】-CH32V307-触摸按键检测(TKEY)
触摸按键检测(TKEY) 文章目录 触摸按键检测(TKEY)1、TKEY介绍2、TKEY使用实例触摸检测控制(TKEY)单元,借助ADC 模块的电压转换功能,通过将电容量转换为电压量进行采样,实现触摸按键检测功能。检测通道复用ADC 的16 个外部通道,通过ADC 模块的单次转换模式实现触摸按键…...
Hive的小文件问题
目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一:insert overwrite (推荐) 3.2.2 方式二:concatenate 3.2.3 方式三ÿ…...
攻防世界——re2-cpp-is-awesome
64位 我先用虚拟机跑了一下这个程序,结果输出一串字符串flag ——没用 IDA打开后 F5也没有什么可看的 那我们就F12查看字符串找可疑信息 这里一下就看见了 __int64 __fastcall main(int a1, char **a2, char **a3) {char *v3; // rbx__int64 v4; // rax__int64 v…...
问山海——天涯海角——桃花渊boss攻击顺序
文章目录 桃花渊代码代码解读代码执行结果攻击顺序示意图 桃花渊 规划击杀各个boss顺序。 副本持续时间为30分钟,每个地方的boss被打死后,需要一定时间才能重新刷新。 只考虑其中两种boss,龟将和龟龙。各有四个。 其中我从一个boss地点到…...
springboot181基于springboot的乐享田园系统
简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...
Dubbo集成Zookeeper embbed模式
为了简化应用支持服务方便的分合,使用Zookeeper embbed模式。集成Zookeeper比较容易,使用starter或自己写代码都可以。但是由于集成了Dubbo,每次启动时都会发现zookeeper没有启动就开始报错退出,但是确是已经集成了。 于是只能翻…...
156基于Matlab的光纤陀螺随机噪声和信号
基于Matlab的光纤陀螺随机噪声和信号,利用固定步长和可调步长的LMS自适应滤波、最小二乘法、滑动均值三种方法进行降噪处理,最后用阿兰方差评价降噪效果。程序已调通,可直接运行。 156 信号处理 自适应滤波 降噪效果评估 (xiaohongshu.com)...
秋招上岸大厂,分享一下经验
文章目录 秋招过程学习过程项目经验简历经验面试经验offer选择总结 秋招过程 今天是除夕,秋招已经正式结束了,等春节过完就到了春招的时间点了。 运气比较好,能在秋招的末尾进入一家大厂,拿到20k的sp offer。 从九月份十月份就开…...
使用 C++23 从零实现 RISC-V 模拟器
👉🏻 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」:https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc 使用 C23 从零实现 RISC-V 模拟器 使用 C23 从零实现的 RISC-V 模拟器,最终的模拟器可以运行 x…...
Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
powershell 雅地关闭UDP监听器
在PowerShell中优雅地关闭UDP监听器意味着你需要一种机制来安全地停止正在运行的UdpClient实例。由于UdpClient类本身没有提供直接的停止或关闭方法,你需要通过其他方式来实现这一点。通常,这涉及到在监听循环中添加一个检查点,以便在接收到停…...
Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御
Google Cloud 的 2024 年威胁范围报告预测了云安全的主要风险,并提出了加强防御的策略。 该报告由 Google 安全专家撰写,为寻求预测和应对不断变化的网络安全威胁的云客户提供了宝贵的资源。 该报告强调,凭证滥用、加密货币挖矿、勒索软件和…...
【算法题】102. 二叉树的层序遍历
题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2:…...
【龙年大礼】| 2023中国开源年度报告!
【中国开源年度报告】由开源社从 2015 年发起,是国内首个结合多个开源社区、高校、媒体、风投、企业与个人,以纯志愿、非营利的理念和开源社区协作的模式,携手共创完成的开源研究报告。后来由于一些因素暂停,在 2018 年重启了这个…...
本地搭建three.js官方文档
因为three.js官网文档是国外的网站,所以你没有魔法的情况下打开会很慢,这时我们需要在本地搭建一个官方文档便于我们学习查看。 第一步:首先我们先访问GitHub地址 GitHub - mrdoob/three.js: JavaScript 3D Library. 下载不下来的小伙伴们私…...
【seata自动化治愈数据库问题解决方案】
wu-database-lazy-seata-cure-plus-starter 描述 针对saas 数据库隔离情况下,每次版本迭代都需要重新修改对应的数据库,对于升级与运维存在一定的难度,那么这个数据库治愈框架来了,使用场景如下 1.数据库不存在自动创建数据库 …...
Node.js之npm单独与批量升级依赖包的方式
Node.js之npm单独与批量升级依赖包的方式 文章目录 Node.js之npm单独与批量升级依赖包的方式npm查看与升级依赖包1. 单独安装或升级最新版本2. 查看依赖但不升级1. npm outdated2. npm update 3. 批量升级新版本4. npm-check-updates1. 全局安装2. ncu查看可升级的版本3. 升级依…...
66.加一
66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入ÿ…...
UI自动化之Poco常用断言方式
实际上用到的几种写断言的方式: 1.验证UI界面(断言图片是否存在,UI页面不稳定情况下,图片识别效率不高) assert_exists assert_not_exists 2.验证数值(断言传入的两个值(数字或者string)是否相等ÿ…...
c语言_实现类class的功能 实例
c语言_实现类class的功能 实例 1.需求与背景2.实例1.类的头文件 class_A.h2.类的实现 class_A.c3.引用4.编译与运行 3.总结 1.需求与背景 使用C , python语言久了, 发现 类 class写代码逻辑更方便, 简洁. 封装的API更加易用; 内核代码中, 也经常看到类似类的封装. 自己尝试实现…...
[2024]常用的pip指令
[2024]常用的pip指令 HI,这里是肆十二,好久不见,大家! 新年好! pip是Python的包管理工具,它可以用来安装、升级、卸载Python包。以下是一些常用的pip指令: 安装包: bash复制代码…...
【Java EE初阶十二】网络编程TCP/IP协议(二)
1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类: 1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号 2、Socket…...
Idea Git Review插件
idea git plugin 添加了一些常用的小插件 可以右键打开git bash窗口 可以右键选中文字点击baidu fanyi 可以通过搜索git用户名 指定开始时间查询某个版本自己提交的所有代码文件 可以通过点击蓝色行数,跳转到指定的改动代码块 资源地址: git-pl…...
python的turtle可以定义多个海龟对象
import turtle as t t.color(purple) t.right(10) t.fd(100) t1 t.Turtle() #t1.color(red) t1.left(10) t1.fd(100) t2 t.Turtle() #t2.color(green) t2.left(20) t2.fd(100) t3 t.Turtle() #t3.color(blue) t3.left(30) t3.fd(100) python的turtle可以定义多个海龟对象…...
LocalAI 部署(主要针对 mac m2 启动)
LocalAI 部署 介绍 LocalAI 是免费的开源 OpenAI 替代方案。 LocalAI 充当 REST API 的直接替代品,与本地推理的 OpenAI API 规范兼容。 它无需 GPU,还有多种用途集成,允许您使用消费级硬件在本地或本地运行 LLM、生成图像、音频等等&#…...
Swift Combine 管道 从入门到精通三
Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据,操作符对该数据做出响应并有可能更改它,订阅者请求并接收这些数据。 这…...
【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(二)-函数列表
目录 表3-1:定点滤波器功能 表3-2:定点快速傅里叶变换(FFT)函数 表3-3:定点数学函数 表3-4:定点三角函数 表3-5:定点向量函数 表3-6:定点矩阵函数 表3-7:浮点滤波…...
蓝桥杯(Web大学组)2022国赛真题:水果消消乐
思路: 记录点击次数,点击次数为1时,记录点击下标(用于隐藏or消除)、点击种类,点击次数为2时,判断该下标所对应种类与第一次是否相同 相同:两个都visibility:hidden (占…...
LeetCode--代码详解 155.最小栈
155.最小栈 题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…...
第6讲后端鉴权拦截器实现
后端鉴权拦截器实现 package com.java1234.interceptor;import com.java1234.util.JwtUtils; import com.java1234.util.StringUtil; import io.jsonwebtoken.Claims; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerI…...
uniapp从入门到进阶
一、了解uniapp 跨平台开发:Uniapp可以同时开发多个平台的应用,只需编写一套代码即可。开发者可以通过编写Vue组件来构建界面,通过编写JavaScript代码来实现业务逻辑。 页面和组件:Uniapp的页面和组件都是基于Vue组件的ÿ…...
CDN缓存404、403状态码
可以参考一下:浏览器缓存和 CDN 在前端的落地 事故记录: 前端发版时存在新旧两个容器,在资源替换的间隙,用户请求到的肯定是新容器的html文件,但是根据新容器的html向新静态资源发起请求,此时旧容器还没有…...
【Python网络编程之DHCP服务器】
🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之DHCP服务器 代码见资源,效果图如下一、实验要求二、协议原理2.1 D…...
【MySQL】:深入理解并掌握DML和DCL
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…...
CSP-动态规划-最长公共子序列(LCS)
一、动态规划 动态规划(Dynamic Programming,简称DP)主要用于求解可以被分解为相似子问题的复杂问题,特别是在优化问题上表现出色,如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…...
安装nodejs2011并配置npm仓库
1. 安装nodejs 选择2011版本下载 在安装目录(个人情况)下 D:\Program Files\nodejs2011创建2个文件夹: node_global (依赖库) node_cache (缓存) 然后在当前目录下cmd进入dos窗口,执行: npm c…...
排序C++代码(已更:快速排序,归并排序)
一、快速排序 #include<iostream> using namespace std;//设定三个数组,判断排序算法代码的正确性 int a[100]{3,4,2,6,9,7,1,0,1,2,3,3,5,6,7,8,3,4,5}; int b[100]{1,5,3,4}; int c[100]{7,8,9,1,2,3};void quickSort(int* num,int l,int r){if(l>r) re…...
CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN
正文共:1333 字 21 图,预估阅读时间:2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境(TensorFlow识别GPU难道就这么难吗?还是我的GPU有问题?),但是失败了。考虑到Windows…...
Java设计模式——策略
前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 使用场景 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否…...
线性代数的本质 1 向量
向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…...
基于JAVA的贫困地区人口信息管理系统 开源项目
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…...
【后端高频面试题--Mybatis篇】
🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 后端高频面试题--Mybatis篇 什么是Mybatis?Mybatis的优缺点?Mybatis的特点…...
【笔记】Helm-5 Chart模板指南-12 .helmignore文件
.helmignore文件 .helmignore文件用来指定您不想包含在您的helm chart中的文件。 如果该文件存在,helm package命令会在打包应用时忽略所有在.helmignore文件中匹配的文件。 有助于避免不需要的或敏感文件及目录添加到您的helm chart中。 .helmignore文件支持Uni…...
【MySQL】表的增删改查(基础)
MySQL表的增删改查(基础) 1. CRUD2. 新增(Create)2.1 单行数据全列插入2.2 多行数据 指定列插入 3. 查询(Retrieve)3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.4 别名3.5 去重:DISTINCT…...
Android矩阵Matrix动画缩放Bitmap移动手指触点到ImageView中心位置,Kotlin
Android矩阵Matrix动画缩放Bitmap移动手指触点到ImageView中心位置,Kotlin 借鉴 Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)-CSDN博客 在此基础上实现手指在屏幕上点击后&…...
C语言:表达式求值
引言:在笔试中,有一类的题目,题目给出代码,要求分析得出输出结果。这类题目更加考察我们对于运算顺序和运算类型转换的理解。文章介绍了隐式类型转换和操作符注意点,希望增加读者对于表达式求值的理解。 1.隐式类型转…...
GO 的 Web 开发系列(五)—— 使用 Swagger 生成一份好看的接口文档
经过前面的文章,已经完成了 Web 系统基础功能的搭建,也实现了 API 接口、HTML 模板渲染等功能。接下来要做的就是使用 Swagger 工具,为这些 Api 接口生成一份好看的接口文档。 一、写注释 注释是 Swagger 的灵魂,Swagger 是通过…...
【极数系列】Flink集成KafkaSink 实时输出数据(11)
文章目录 01 引言02 连接器依赖2.1 kafka连接器依赖2.2 base基础依赖 03 使用方法04 序列化器05 指标监控06 项目源码实战6.1 包结构6.2 pom.xml依赖6.3 配置文件6.4 创建sink作业 01 引言 KafkaSink 可将数据流写入一个或多个 Kafka topic 实战源码地址,一键下载可用…...