深入浅出 Apache DolpinScheduler 补数功能

news2025/1/10 12:07:07

点击蓝字,关注我们🔼

fe446243229e437c6a5725465cbb5f65.png

引言

大家好,我叫侯世涛,是个人开发者,也是 Apache DolphinScheduler 社区的贡献者,目前在社区参与开发已经有两年时间,欢迎大家跟我交流。本次分享将深入探讨 DolphinScheduler 的自动化补数功能,将详细介绍如何使用补数功能,摆脱手动执行脚本修复数据的繁琐过程,实现数据处理的全自动化。

|侯世涛

编辑整理 曾辉

讲师介绍

c6b94f379910413a13f6ee5b4b623913.jpeg

侯世涛

DolphinScheduler 贡献者

我今天分享的内容分为4个部分

  • Apache DolphinScheduler概览

  • Apache DolphinScheduler架构

  • Apache DolphinScheduler补数介绍

  • Apache DolphinScheduler源码讲解

  • 遇到的问题和参与开源

01

 Apache DolphinScheduler概览

Apache DolphinScheduler是一个可扩展的开源分布式工作流平台。开源意味着它能够被许多公司用于二次开发,这尤其适用于那些不希望使用商业版本,但又不想自行编写某些功能的公司,它们可以利用开源项目提供的功能。

8fbbb53154b3dc6cca921f1f35ef71af.png

Apache DolphinScheduler采用了DAG(有向无环图)工作流,它通过可视化图形来展示任务之间的上下游依赖关系,这样的依赖关系可以轻松调整。

此外,Apache DolphinScheduler能有效处理复杂的ETL依赖问题,这在许多行业,如金融和工业等,都非常实用。因为在这些行业中,数据或任务经常会有复杂的上下游依赖关系。

例如,一个sale节点可能需要依赖上游的sale节点,或者依赖于MySQL、Postgresql、Flink等节点。这种复杂的依赖关系在实际使用过程中可能会引发各种问题,比如系统卡死等,这是我们在实际生产中常常遇到的问题。

最后,Apache DolphinScheduler还提供了监控和告警模块。在任务调度过程中,我们需要知道每个任务的当前状态。如果任务失败了,我们需要得到告警,并及时进行人工处理。另外,如果任务失败,我们可能会尝试重试,但是通常情况下,如果任务失败了,即使重试3次,也可能仍然无法成功,这时就需要人工介入,所以告警功能在这里非常重要。

部署模式

给大家介绍下 Apache DolphinScheduler 四种部署模式。

b5f8767904af07ba2c375aa3bf62902f.png

首先,有单机模式,也被称为Standalone模式。这种模式主要用于测试环境,但在生产环境中并不适用。虽然它的运行环境简单,但由于所有组件都在一个机器上运行,因此其性能和扩展性有限。

其次,伪集群模式,也是一种比较基础的部署方式。在此模式下,所有服务,包括master、worker、API server以及alert server等,都部署在同一台机器上。这种模式相比单机模式,能够更好的模拟分布式环境,但仍不适合在生产环境中使用。我个人并不推荐在生产环境中使用这种模式,因为它并没有真正的高可用和负载均衡。

在生产环境中,集群模式和K8S模式是最常用的部署方式。集群模式,或者说 cluster 模式,可以有多个 master 和多个 worker,这样可以实现负载均衡和容错。例如,可以有两个 master 或者更多的 worker。这种部署方式可以满足大规模,高并发的工作负载。

K8S 模式,也就是 Kubernetes 模式,是当前最先进的部署方式。现在的技术趋势更多的是虚拟化和容器化,因此,K8S 模式在许多生产环境中得到了广泛应用。它具有良好的管理能力,可以轻松地打包和打镜像,然后直接上传到 K8S 进行部署。它实现了整个容器的运行调度以及资源隔离。这些都是由 K8S 自动管理的,大大降低了运维难度和成本。

如果比较集群模式和K8S模式,K8S模式无疑更为高效和易于管理。例如,如果我们有100台机器,使用集群模式,我们需要在每台机器上手动部署服务,这就需要大量的人工操作和时间。但在K8S模式下,这些部署工作都可以自动完成,大大提高了效率。

功能特性

Apache DolphinScheduler 具有许多显著特性,可以大致分为以下六个方面:

简单易用:Apache DolphinScheduler 主要面向非开发人员,更多地关注业务层面,如 SQL 编写等。因此,它的可视化界面非常友好,用户可以通过简单的拖放操作完成工作流的创建和调整。

模块化操作:模块化操作有助于定制和维护,包括我们之前提到的 master、worker、alert 以及 API 等组件。

丰富的组件支持:DolphinScheduler 支持许多常用组件,如 Shell、MapReduce、Spark、Flink、SQL、DataX、Jupiter 等,满足了各种业务场景的需求。

灵活的工作流操作:DolphinScheduler 支持暂停、定时、恢复和停止等工作流操作。

相比于 Airflow 和 Oozie 等其他工作流工具,DolphinScheduler 的暂停操作功能更加强大。

高可靠性:DolphinScheduler 采用去中心化设计,具有原生的高可用性和任务队列支持,能够提供过载容错能力。

这些特点确保了 DolphinScheduler 能够提供高度稳健的运行环境。

高扩展性:DolphinScheduler 可以轻松实现动态扩展。例如,当资源不足时,可以从 10 台机器扩展到 20 台机器,系统会自动识别并处理这些新加入的机器。

此外,它还支持多租户和在线资源管理,能够稳定地运行每天 10 万个数据任务

02

 Apache DolphinScheduler架构

在理解架构设计时,首先需要了解架构的元数据情况。


8b31ca9b595d8cc2509810612df91100.png

Apache DolphinScheduler架构中有多个层级关系:

租户与用户:在一个租户下,可以有多个用户,形成租户与用户的一对多关系。

用户与项目:在一个用户下,可以存在多个项目,因此也是一对多关系。

项目与工作流:每个项目下可以定义多个工作流,但是每个工作流只能属于一个项目。

比如,工作流a只能属于项目a,而工作流b可能就被定义在项目b中,而不属于项目a。项目和工作流之间存在一种隔离关系。

租户与工作流:租户可以被多个工作流定义使用,每个工作流必须且只能选择一个租户。在实际运行中,运行工作流的形式是以租户的身份进行,而不是用户。

工作流与定时:每个工作流可以定义一个或者多个定时。这意味着同一个工作流可以在不同的时间点被触发执行,比如凌晨1点和早上9点,以满足不同的业务需求。

工作流定义与任务定义:一个工作流定义可以对应多个任务定义。也就是说,每次运行工作流,都可能产生一个任务定义。因此,一个工作流可以同时产生多个任务定义。

工作流定义与工作流实例:每个工作流定义可以产生一个工作流实例。在DolphinScheduler的web页面的左边菜单,有工作流定义和任务定义按钮,以及工作流实例菜单按钮。

工作流实例与任务实例:每个工作流实例可以对应一个或者多个任务实例。这也是一种一对多的关系。

关键组件

Apache DolphinScheduler的整体架构包括多个关键组件,这些组件通过协同工作来提供强大的调度功能。

UI(用户界面):这是系统的前端页面,为用户提供了一系列可视化操作界面。

API(应用程序接口):这一层是API服务器,主要负责处理前端UI层的请求。该服务统一提供RESTful API向外部提供请求服务,包括工作流的创建、定义、查询、修改、发布、下线、手动启动、停止、暂停、恢复,以及从指定节点开始执行等等。对Apache DolphinScheduler进行二次开发时,我们通常会在这一层进行代码编写,实现产品对接。

MasterServer:MasterServer主要负责DAG任务的切分、任务提交监控,并同时监听其他MasterServer和WorkerServer的健康状态。启动时,MasterServer向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。

WorkerServer:WorkerServer主要负责任务的执行和提供日志服务。类似于MasterServer,WorkerServer在启动时也会向Zookeeper注册临时节点,并维持心跳。

Registry(注册中心):系统中的MasterServer和WorkerServer节点通过注册中心进行集群管理和容错。此外,系统还基于注册中心进行事件监听和分布式锁。

Alert(告警模块):Alert模块提供告警相关功能,仅支持单机服务。此模块支持自定义告警插件,负责收集告警信息,并将这些信息存储到数据库中。

Database(数据库):数据库存储了一些元数据信息,包括工作流定义信息、任务定义信息和工作流实例信息等。

Zookeeper:Zookeeper在整个架构中起到了非常关键的作用,它监听了一些心跳容错,以及一些注册等信息。

03

 补数介绍

首先,让我们理解一下什么是补数。

补数,简单来说,就是当我们的数据处理失败后,需要重新处理那些失败的数据。在过去,我们需要手动执行这个操作,但是现在,通过我们的操作界面,可以直接找到失败的任务,选择补数功能,设定对应的时间即可。

补数的主要策略是生成对应的工作流,包括串行补数和并行补数。

串行补数

3e888ec9a0a641903eb992ce6f97dd39.jpeg

指定时间范围内

从开始日期至结束日期依次执行补数,依次生成多条流程实例;点击运行工作流,选择串行补数模式:例如从7月 9号到7月10号依次执行,依次在流程实例页面生成两条流程实例。

在web页面上,这个日期是可以选的,会弹出来一个日历的形式,选这个日期就 OK 了。另外一种就是一种手输的方式,就是 enter data,可以手动把日期格式、日期的时间输进去。最多只能输 100 个,超过就不行了。

并行补数

27c8c942a8780218cfbd2bc85d086ffb.jpeg

指定时间范围内,同时进行多天的补数,同时生成多条流程实例。

手动输入日期:手动输入以逗号分割日期格式为 yyyy-MM-dd HH:mm:ss 的日期。点击运行工作流,选择并行补数模式:例如同时执行7月9号到7月10号的工作流定义,同时在流程实例页面生成两条流程实例(执行策略为串行时流程实例按照策略执行)

并行度

指在并行补数的模式下,最多并行执行的实例数。例如同时执行7月6号到7月10号的工作流定义,并行度为2

1aaa0d977dcaa41730200e9f032495c6.jpeg

换句话就是说页面每次运行,我最多运行多少个工作流实例,这叫并行度。我们在页面上是可输入的,可控制的。

45b9c9258afcbaf0c8c5c9b7b9bb21cd.jpeg

比如并行都是2,但是我每次就是说运行的时候是两条产生的,直到这所有的任务运行完成。但最后我有 11 条,每两条能产生 6 批,最后一批是一个。

日期选择

a7eb35a95aa7df7ba9f91e01adabe15c.jpeg

日期选择刚才说的 select date,它是可弹窗进行日历的选择, enter date 是以横杠分隔的日期格式进行输入,然后进行执行。

c7da425939652d317a831baccdc7277a.jpeg

补数与定时配置的关系

1127bbc2b43058b028cf5bd1eee847ca.jpeg

未配置定时或已配置定时并定时状态下线

根据所选的时间范围结合定时默认配置(每天0点)进行补数,比如该工作流调度日期为7月7号到7月10号。

8de5b33752249eeac36cf536e33606c7.jpeg

已配置定时并定时状态上线

根据所选的时间范围结合定时配置进行补数,比如该工作流调度日期为7月7号到7月10号,配置了定时(每日凌晨5点运行)

4d6168eb62beba0a5d7f5c9272882465.jpeg

04

 源码解读

补数执行流程

串行流程

start-process-instance->createCommand->RUN_MODE_SERIAL->insertCommand->MasterSchedulerBootstrap:findCommands->WorkflowExecuteRunnable:handleEvents->processComplementData->needComplementProcess->finish

并行流程

start-process-instance->createCommand->RUN_MODE_PARALLEL->insertCommand->MasterSchedulerBootstrap:findCommands->WorkflowExecuteRunnable:handleEvents->processComplementData->needComplementProcess->finish

DolphinScheduler-ExecutorController

请求参数

Select Date

373457eb4e99162dba77f18e6fc85739.png

Enter Date

7432065f96502f9c2e88bc765c18fd6a.png

串行补数

RUN_MODE_SERIAL

178ec7e335b224ba3f2ef482e35d9791.png

并行补数

RUN_MODE_PARALLEL

65e16006bbc9a0546c923d70595718f0.png

44c4474a0b7b5f88d19d884aa7117a09.png

DolphinScheduler-MasterSchedulerBootstrap

MasterSchedulerBootstrap:findCommands监听ds_t_command获取表中的命令,构造ProcessInstance

1bbbcbb9063b3abba39c1ccd166a33d0.png

58fedbb44b2751835748fc01b0d5571e.png

fcfe52e393bda74bee356174570ac1e0.png

DolphinScheduler-WorkflowExecuteRunnable

WorkflowExecuteRunnable:initTaskQueue-初始化补数对应的时间参数

5257f10e35adbc83a9b8cb3db1feca33.png

WorkflowExecuteRunnable:processComplementData-通过需要补数的时间构造command

0ceb35be704077d887fa236b03477610.png

WorkflowExecuteRunnable:createComplementDataCommand-创建下一次需要执行的comand,insert command

d9f6a9304286d062005c40003f882b6e.png

 05  

遇到的问题及参与开源

接下来将分享一下我是如何参与开源项目的,以及我所遇到的一些问题和开源带来的好处。

我在使用Apache DolphinScheduler时遇到的两个主要问题。

第一个问题是在资源管理方面,举例来说,假设我有10个任务,这些任务都依赖于同一个jar包。如果这个jar包被我更改了,那我就需要下线任务,然后重新上线,并重新关联这个任务。我觉得这个操作过于复杂,尤其是对于实时任务,这样的切换操作就更加困难了。这是一个当前的问题,我相信很多公司可能也会遇到这个问题。

第二个问题是任务阻塞。我们的任务数量达到了几百个,任务之间的依赖非常多,这就导致了任务容易出现阻塞,有时候页面上的任务无法取消,我们只能清空数据库来解决这个问题。

现在,我想讨论一下参与开源的好处

可以提升开发者的技术水平。因为在公司,我们写的代码和开源代码的质量差距很大。当我提交一个PR(Pull Request)到开源项目时,很多高手会进行代码审查,并给出建议。这对于我们自身的技术提升是非常有帮助的。

其次,参与开源项目可以提高我们的代码质量。如果我们只在公司内部写代码,可能没有严格的代码审查和管理,但是在开源项目中,你所接触到的代码都是有一定规范的。

第三,通过参与开源项目,我们能够获取到一些项目经验。在开源项目中,很多功能都是来自全球各地的开发者的思想和想法,我们可以学习他们的思考方式,并且可以在项目平台上提出我们的问题,与大家进行交流。

第四,参与开源可以帮助我们建立更广阔的人脉关系。在工作中,我们的人脉可能比较单一,主要是公司内部的同事。但在开源社区中,我们能够认识到更多专注于技术的人,这对于我们的成长是非常有帮助的。

最后,关于如何参与开源,方式其实有很多种。对于我们程序员来说,通过提交代码应该是最快的方式。

当然,非代码贡献也很重要,我们可以在社区中审查代码、回答问题、互动交流,或者在博客上发布自己的文章等,感兴趣的可以联系社区运营同学 18819063834。

参与贡献

随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

57862ffcb6336fca615157cb32669574.png

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

40aa068d3d631a2dbebc2eb5326985d6.png

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689

非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22

如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html

来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

ebd9f4c133dd58e319dd4e11ddf64be2.jpeg

添加社区小助手微信(Leonard-ds) 

添加小助手微信时请说明想参与贡献。

来吧,开源社区非常期待您的参与。

< 🐬🐬 >

更多精彩推荐

☞Apache DolphinScheduler 3.0.6 发布,或将是最后一个 3.0.X 版本

☞优秀用户案例有奖征集 | 活动火热开启,快来投稿!

☞用一杯星巴克的钱,训练自己私有化的ChatGPT

☞运维实战:Apache DolphinScheduler 生产环境升级

☞去年办了这么多场Meetup都没有你,2023年赶紧安排起来!

☞企业级应用如何用 Apache DolphinScheduler 有针对性地进行告警插件开发?

☞CommunityOverCode Asia 2023 强势来袭!15 大专题议题征集 6 月 6 日截止

我知道你在看87500bfd344bb7a2627f176525ca31c7.png

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

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

相关文章

Linux教程——Linux桌面环境(桌面系统)大比拼【附带优缺点】

早期的 Linux 系统都是不带界面的&#xff0c;只能通过命令来管理&#xff0c;比如运行程序、编辑文档、删除文件等。所以&#xff0c;要想熟练使用 Linux&#xff0c;就必须记忆很多命令。 后来随着 Windows 的普及&#xff0c;计算机界面变得越来越漂亮&#xff0c;点点鼠标…

【Difussion Model】扩散模型的理解和编程实现

目录 理论框架text-to-imgaedecodergeneration modelclip的原理 FID指标&#xff1a;评估图像生成的好坏数学原理traininginference 图像生成模型的本质最大似然估计 正式推导sample 带来随机性从一次到位到N次到位 理论 框架 不断的进行去噪&#xff0c;并且在这个过程中&am…

云原生Docker镜像管理

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 #容器 与 虚拟机 的区别&#xff1f; 容器虚拟机所有容器共享宿主机内核每个虚拟机都有独立的操…

android framework面试经验分享

hi&#xff0c;粉丝朋友们&#xff01; 大家好&#xff01;近来有很多学员粉丝都经常问framework面试的一些经验。 更多framework干货知识手把手教学 Log.i("千里马qq群"&#xff0c;“422901085”);简历书写建议 1、写上自己突出重点的framework一些模块&#xf…

【微信小程序开发】第 6 节 - 小程序的宿主环境

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、宿主环境简介 3、小程序的宿主环境 4、小程序宿主环境包含的内容 4.1、通信模型 4.1.1 通信的主体 4.1.2 小程…

【服务器】远程ERP财务软件

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企业对远程仓库、异地办事处的管理需求&#xff1b;全面满足企业财务业务一体化管理需求。企业一般将其…

​蚂蚁集团自动化混沌工程 ChaosMeta 正式开源

ChaosMeta 介绍 ChaosMeta 是一款面向云原生、自动化演练而设计的混沌工程平台。它是蚂蚁集团内部混沌工程平台 XMonkey 的对外开源版本&#xff0c;凝聚了蚂蚁集团在公司级大规模红蓝攻防演练实践中多年积累的方法论、技术能力以及产品能力。 经过公司内部多年复杂故障演练场…

黄仁勋台北演讲分享 不论是为了追逐食物而跑,或不被他人当作食物而跑,都要尽量保持奔跑,别缓步前进。

不论是为了追逐食物而跑&#xff0c;或不被他人当作食物而跑&#xff0c;都要尽量保持奔跑&#xff0c;别缓步前进。 2023年5 月 27 日&#xff0c;美国英伟达&#xff08;Nvidia&#xff09;公司创始人黄仁勋先生受邀到位于中国台北的台湾大学参加2023年的毕业典礼&#xff0…

天津的每个早点摊儿,都是与清心寡欲对抗的战场

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 封面 / 姝琦midjourney 产品统筹 / bobo 录音间 / 声湃轩北京站 作为一个天津人创建的美&#xff08;健&#xff09;食&#xff08;康&#xff09;播客&#xff0c…

CSS 颜色设置透明度的新姿势

在 CSS 中&#xff0c;我们有很多种方式为元素设置透明度&#xff0c;常见的是给元素设置透明度和给颜色设置透明度&#xff0c;不同的方式将会带来不一样的效果。那么今天&#xff0c;我们就一起来聊聊 CSS 中的不透明度。感兴趣的同学&#xff0c;请继续往下阅读。 设计中的透…

尺度悖论:数据分析必须警惕的坑

I. 尺度悖论的概述 尺度悖论是指在某些系统或现象中&#xff0c;尺度的大小或范围会对其性质、行为或理解产生矛盾或困难的现象。尺度悖论常出现在自然科学、社会科学和哲学等领域中&#xff0c;引发了一系列有关尺度和尺度变化对系统行为的影响的研究。 II. 举3个简单的例子…

Qt编写视频监控系统78-视频推流到流媒体服务器

一、前言 视频推流作为独立的模块&#xff0c;目前并没有集成到视频监控系统中&#xff0c;目前是可以搭配监控系统一起使用&#xff0c;一般是将添加好的摄像头通道视频流地址打开后&#xff0c;读取视频流重新推到流媒体服务器&#xff0c;然后第三方可以从流媒体服务器拉取…

接口幂等性——防止并发重复插入数据

接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景&#xff1a; 有时我们在填写某些form表单时&#xff0c;保存按钮不小心快速点了两次&#xff0c;表中竟然产生了两条重复的数据&#xff0c;只是id不一样。…

chatgpt赋能python:Python如何变为列表

Python如何变为列表 Python是一种高级编程语言&#xff0c;用于快速、轻松地编写软件。它的语法简洁、易于学习&#xff0c;可以用于各种领域&#xff0c;包括Web开发、机器学习和数据科学等。其中&#xff0c;列表是Python的一种基本数据类型&#xff0c;它用于存储一系列相关…

聚观早报 | 皮克斯十年来首次大规模裁员;OpenAI网站访问量大增

今日要闻&#xff1a;皮克斯十年来首次大规模裁员&#xff1b;OpenAI网站访问量大增&#xff1b;华为版ChatGPT将于7月初发布&#xff1b;苹果Siri或将迎来重大调整&#xff1b;罗斯柴尔德减持英伟达 皮克斯十年来首次大规模裁员 迪士尼公司旗下皮克斯动画工作室已裁员 75 人&…

西门子PLC与IO模块之间无线PROFINET通信

在实际系统中&#xff0c;一个车间内PLC与多个IO信号点需要建立通讯&#xff0c;从而提高工作效率&#xff0c;通常距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大且不美观&#xff0c;这种情况下比较适合采用无线通信方式。本方…

百城巡展 | 人大金仓5月联合伙伴释放数字活力奏响发展强音

5月下旬&#xff0c;人大金仓“百城巡展”走过贵阳、苏州、南宁&#xff0c;吸引线上线下逾4400人参与&#xff0c;得到用户和伙伴的高度认可&#xff1b;并携手东软集团股份有限公司、云上比格&#xff08;贵州&#xff09;大数据有限公司、数字广西集团有限公司、用友网络科技…

推荐 5 个好玩儿的小项目

近期&#xff0c;每日的开源项目热榜都是 ChatGPT 相关、AI 相关的。说实话&#xff0c;老逛看的也头疼&#xff0c;本期推荐几个不一样的&#xff0c;好玩的小项目。 本期推荐开源项目目录&#xff1a; 1. 在你的 Windows 养小猫 2. 把你的图片生成 ASCII 3. 中国制霸生成器 4…

初始JavaScript

JavaScript 的作用 表单动态验证&#xff08;密码强度检测&#xff09;&#xff08;js产生的最初的目的&#xff09;网页特效服务端开发&#xff08;Node.js)桌面程序&#xff08;Electron&#xff09;App (Cordova)控制硬件-物联网&#xff08;Ruff)游戏开发&#xff08;coco…

chatgpt赋能python:Python如何将字符串首字母大写

Python 如何将字符串首字母大写 在编程中&#xff0c;字符串操作是不可避免的&#xff0c;而往往需要将字符串的首字母大写&#xff0c;例如在处理用户名、标题等信息时&#xff0c;这样做可以提高可读性和美观性。Python作为一种高效、易学易用的编程语言&#xff0c;有很多内…