首页 文章 精选 留言 我的

精选列表

搜索[最大转化投放],共10007篇文章
优秀的个人博客,低调大师

公司最大的内卷,偷偷做单元测试

一位读者在看过我的《理解这八大优势,才算精通单元测试》后,问我:知道单元测试有好处,但实在没空写。看完文章后又想重新落实一下,有没有啥写好单元测试的技巧? 这位读者绝对不是第一个和我抱怨单元测试的人。这很好理解,中国互联网公司太多太卷,想要抢夺市场就要推出不同功能,而这些压力一部分落在了程序员身上,拼命赶需求。单元测试这种费力不讨好的事情,自然而然就没有人做。 就我多年的经验来看,写单元测试其实不会拖延项目,反而能够加快功能研发进度。单元测试的好处我就不在这里赘述了,只有真正尝试过的人才能理解。 马克·吐温曾说:“取得成功的秘诀就是开始”。本篇文章想和大家分享一下写好单元测试的技巧,希望可以给大家带来新方向。 一、单元测试的注意事项 单元测试是为了让我们快速查找并隔离损坏的代码片段。正因如此,这些函数和类在测试时不应该依赖于mock(模拟)和stub(存根)以外的其他元素。在测试中,如果试图覆盖的逻辑过于复杂,就难以确保覆盖的可靠性,也难以准确找出失败的原因。 因此,我们要注意单元测试包括以下几点。 01 简洁性 短函数更容易阅读和理解。我们每次只测试一个逻辑点,因此测试代码应该控制在几行之内。但如果是高级逻辑可能具有多个依赖项,这就需要大量样板代码来初始化模拟和存根。此外,单元测试同样适用DRY原则(Don’t repeat yourself,一次且仅一次),我们在写单元测试时要避免到处复制粘贴混乱的代码,最好使用组合而不是继承。爱因斯坦曾说:“当你在生活中感到困顿时,也许是你把事情复杂化了。”所以,当我们对单元测试产生困惑时,也许是因为我们在单元测试中使用复杂的逻辑。注意一点:单元测试的目的在于测试代码,不要让单元测试本身也成为测试的一部分。 02 明确性 单元测试要使用详尽的长名称。这样的名称不仅能清楚表达信息,还能起到索引作用、快速定位相应测试。就算需求发生变化,我们只需要针对相应的测试进行更改,不必查看所有内容并检查受影响的内容。 好的单元测试一般只有一个断言,因此命名起来也很容易。例如,在处理金额计算时,It('should return 0 for an empty cart')要比It('works for 0')或者It('empty cart')好得多。对于使用函数名称作为测试名称的框架也是如此,shouldReturnZeroForAnEmptyCart就是一个很不错的的命名。 正如丁玲所言:“人生就像爬坡,要一步一步来。”单元测试也是如此,不要一次性测试整个方法,要一步一步来。我们只针对单个需求写单元测试,代码就会变得易于阅读和维护。 03 可维护性 测试框架需要提供各种断言方法。它们提供不同的方法来检查结果,并且当断言失败时,它们还会显示更具体的错误消息,从而提供更多上下文来查看错误所在。 例如, expect(result === expected).toBeTruthy(); 将会失败 expect(received).toBeTruthy() Received: false 尽管 expect(result).toBe(expected); 将提供更多有关具体失败原因的信息: expect(received).toBe(expected) // Object.is equality Expected: "John Doe" Received: "JohnDoe" 框架还为不同的测试方式提供了各种断言。例如,在使用Jest进行测试时,toBe使用Object.is测试是否完全相等,而toEqual和toStrictEqual则深入比较对象,确保他们的类型和结构一致。 为了判断浮点数是否相等,我们需要采用一种特殊的匹配器,这种匹配器能够忽略由于浮点数在内存中的表示方式导致的微小舍入误差。在Jest中,匹配器是toBeCloseTo。虽然toEqual有时也能适用,但即使是看似简单的测试,如expect(0.1+0.2).toEqual(0.3)也可能无法通过。 二、单元测试的AAA原则 遵循AAA原则(Arrange、Act、Assert,安排、执行、断言),可以娴熟提升单元测试代码的清晰度、可靠性和可维护性。 第一步,安排阶段(Arrange)。我们需要完成变量赋值、对象实例化对象以及测试运行所需的其余前置设置,并且定义预期结果。这样做的好处在于:一方面,我们需要在执行测试逻辑前就有明确预期;另一方面,这更方便在输入数据后立即查看预期输出,有助于避免代码混淆。 第二步,执行阶段(Act)。我们将执行测试函数并存储其结果。结果存储其实是准备工作的自然延伸,有助于我们对结果进行回顾总结。 第三步,断言阶段(Assert)。我们在这个阶段可以判断假设的正确性了。这正是单元测试的核心所在,因为这一环节实际上是对某些具体内容的测试。其目的在于是检查实际得到的结果否与预期结果相匹配。 我们要确保代码可靠性,避免错误输入、缺少参数、空数据、调用函数中的异常等情况的出现。代码覆盖率工具可以帮助我们查漏补缺,找到未测试的代码分支。我们要始终明确我们单元测试的目标,过于追求100%测试覆盖率反而会让单元测试代码越来越繁杂。这与《吕氏春秋》中的论点不谋而合:“不知轻重,‌则重者为轻,‌轻者为重矣。‌若此,‌则每动无不败”。 三、单元测试的优化和维护 为了提高单元测试效率,我们需要模拟所有可能影响速度的外部依赖项,例如API调用、数据库或文件系统访问。我们在写单元测试时,应尽量避免线程休眠、等待和超时。如果必须设置超时,就应该将其缩短至几毫秒。在处理多线程或异步竞争条件时,精确控制出发条件比简单的等待要有效得多。 单元测试应当确保不会改变作用域外的任何内容。如果测试仅在按照特定顺序执行时才能成功,这可能表明测试用例或测试代码存在问题。每个测试用例应独立运作。由于现代测试框架默认并行执行测试,因此我们不应依赖全局变量或之前测试的遗留效应。这也是全局变量常被视为不良编程习惯的原因之一,这会隐藏真正的依赖关系,导致代码耦合度升高,并在处理多线程问题时需要格外留意。 当测试需要复杂的重复配置时,应利用框架提供的设置和清理功能。这些功能保障了在每个测试用例或整个测试套件开始前后,相关代码能够得到执行。这样,无论是单独运行测试还是作为测试套件的一部分,都能确保测试结果的确定性,执行顺序不会对测试结果造成影响。 四、单元测试贵在坚持 《荀子·大略》:“夫尽小者大,积微成著,德至者色泽洽,行尽而声问远。”单元测试的作用只有经过长期积累才会变得显著。其实,写单元测试更多的是对自己的代码负责。有测试用例的代码,别人更容易看懂,以后别人接手你的代码时,也可能放心做改动。 根据上述方法开始行动,单元测试也不是什么难事,毕竟“世上无难事,只怕有心人”。我发现关于单元测试有很多读者感兴趣,还有人曾问我单元测试到底该由测试进行还是开发进行。如果大家感兴趣,我也可以写一篇文章和大家简单分享一下。 *参考文章:Andriy Obrizan,How to Write Good Unit Tests: 14 Tips

优秀的个人博客,低调大师

Facebook:俄罗斯仍是虚假信息的最大来源

据外媒报道,社交网络Facebook在于当地时间周三公布的一份报告中表示,自2017年以来,俄罗斯一直是该公司虚假信息的主要来源。在此期间,该公司在50多个国家发现了造谣活动并关闭了150个虚假账号网络。除了俄罗斯,假新闻的主要来源还有伊朗、缅甸、美国和乌克兰。 而美国、乌克兰、英国、利比亚和苏丹一直是最频繁的目标。 Facebook在报告中写道:“影响行动并不新鲜,但在过去几年里,它们突然进入了全球公众的意识。这些运动试图破坏对公民机构的信任并通过利用同样的数字工具来腐败公共辩论。这些数字工具已使在线公共广场多样化,并让从Me Too到Black Lives Matter运动的批评性讨论获得了授权。” 该报告指出,2016年美国总统大选是虚假信息的“分水岭”,但当时使用的技术“在现在更难实现、成本更高、成功的可能性更小”。然而,制造虚假信息的人现在找到了更微妙的方法,像拉拢合法的Facebook用户。

优秀的个人博客,低调大师

如何让消息队列达到最大吞吐量?

你在使用消息队列的时候关注过吞吐量吗? 思考过吞吐量的影响因素吗? 考虑过怎么提高吗? 总结过最佳实践吗? 本文带你一起探讨下消息队列消费端高吞吐的 Go 框架实现。Let’s go! 关于吞吐量的一些思考 写入消息队列吞吐量取决于以下两个方面 网络带宽 消息队列(比如Kafka)写入速度 最佳吞吐量是让其中之一打满,而一般情况下内网带宽都会非常高,不太可能被打满,所以自然就是讲消息队列的写入速度打满,这就就有两个点需要平衡 批量写入的消息量大小或者字节数多少 延迟多久写入 go-zero 的 PeriodicalExecutor 和 ChunkExecutor 就是为了这种情况设计的 从消息队列里消费消息的吞吐量取决于以下两个方面 消息队列的读取速度,一般情况下消息队列本身的读取速度相比于处理消息的速度都是足够快的 处理速度,这个依赖于业务 这里有个核心问题是不能不考虑业务处理速度,而读取过多的消息到内存里,否则可能会引起两个问题: 内存占用过高,甚至出现OOM,pod 也是有 memory limit 的 停止 pod 时堆积的消息来不及处理而导致消息丢失 解决方案和实现 借用一下 Rob Pike 的一张图,这个跟队列消费异曲同工。左边4个 gopher 从队列里取,右边4个 gopher 接过去处理。比较理想的结果是左边和右边速率基本一致,没有谁浪费,没有谁等待,中间交换处也没有堆积。 我们来看看 go-zero 是怎么实现的: Producer 端 for { select { case <-q.quit: logx.Info("Quitting producer") return default: if v, ok := q.produceOne(producer); ok { q.channel <- v } } } 没有退出事件就会通过 produceOne 去读取一个消息,成功后写入 channel。利用 chan 就可以很好的解决读取和消费的衔接问题。 Consumer 端 for { select { case message, ok := <-q.channel: if ok { q.consumeOne(consumer, message) } else { logx.Info("Task channel was closed, quitting consumer...") return } case event := <-eventChan: consumer.OnEvent(event) } } 这里如果拿到消息就去处理,当 ok 为 false 的时候表示 channel 已被关闭,可以退出整个处理循环了。同时我们还在 redis queue 上支持了 pause/resume,我们原来在社交场景里大量使用这样的队列,可以通知 consumer 暂停和继续。 启动 queue,有了这些我们就可以通过控制 producer/consumer 的数量来达到吞吐量的调优了 func (q *Queue) Start() { q.startProducers(q.producerCount) q.startConsumers(q.consumerCount) q.producerRoutineGroup.Wait() close(q.channel) q.consumerRoutineGroup.Wait() } 这里需要注意的是,先要停掉 producer,再去等 consumer 处理完。 到这里核心控制代码基本就讲完了,其实看起来还是挺简单的,也可以到 https://github.com/tal-tech/go-zero/tree/master/core/queue 去看完整实现。 如何使用 基本的使用流程: 创建 producer 或 consumer 启动 queue 生产消息 / 消费消息 对应到 queue 中,大致如下: 创建 queue // 生产者创建工厂 producer := newMockedProducer() // 消费者创建工厂 consumer := newMockedConsumer() // 将生产者以及消费者的创建工厂函数传递给 NewQueue() q := queue.NewQueue(func() (Producer, error) { return producer, nil }, func() (Consumer, error) { return consumer, nil }) 我们看看 NewQueue 需要什么参数: producer 工厂方法 consumer 工厂方法 将 producer & consumer 的工厂函数传递 queue ,由它去负责创建。框架提供了 Producer 和 Consumer 的接口以及工厂方法定义,然后整个流程的控制 queue 实现会自动完成。 生产 message 我们通过自定义一个 mockedProducer 来模拟: type mockedProducer struct { total int32 count int32 // 使用waitgroup来模拟任务的完成 wait sync.WaitGroup } // 实现 Producer interface 的方法:Produce() func (p *mockedProducer) Produce() (string, bool) { if atomic.AddInt32(&p.count, 1) <= p.total { p.wait.Done() return "item", true } time.Sleep(time.Second) return "", false } queue 中的生产者编写都必须实现: Produce():由开发者编写生产消息的逻辑 AddListener():添加事件 listener 消费 message 我们通过自定义一个 mockedConsumer 来模拟: type mockedConsumer struct { count int32 } func (c *mockedConsumer) Consume(string) error { atomic.AddInt32(&c.count, 1) return nil } 启动 queue 启动,然后验证我们上述的生产者和消费者之间的数据是否传输成功: func main() { // 创建 queue q := NewQueue(func() (Producer, error) { return newMockedProducer(), nil }, func() (Consumer, error) { return newMockedConsumer(), nil }) // 启动panic了也可以确保stop被执行以清理资源 defer q.Stop() // 启动 q.Start() } 以上就是 queue 最简易的实现示例。我们通过这个 core/queue 框架实现了基于 redis 和 kafka 等的消息队列服务,在不同业务场景中经过了充分的实践检验。你也可以根据自己的业务实际情况,实现自己的消息队列服务。 整体设计 整体流程如上图: 全体的通信都由 channel 进行 Producer 和 Consumer 的数量可以设定以匹配不同业务需求 Produce 和 Consume 具体实现由开发者定义,queue 负责整体流程 总结 本篇文章讲解了如何通过 channel 来平衡从队列中读取和处理消息的速度,以及如何实现一个通用的消息队列处理框架,并通过 mock 示例简单展示了如何基于 core/queue 实现一个消息队列处理服务。你可以通过类似的方式实现一个基于 rocketmq 等的消息队列处理服务。 关于 go-zero 更多的设计和实现文章,可以关注『微服务实践』公众号。 项目地址 https://github.com/tal-tech/go-zero 欢迎使用 go-zero 并 star 支持我们! 微信交流群 关注『微服务实践』公众号并点击 进群 获取社区群二维码。

优秀的个人博客,低调大师

什么才是“5G+医疗”的最大障碍?

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 多年来,GSMA一直是全球最重要的移动电话和移动运营商的行业性协会。 该协会拥有一个被称为GSMA Intelligence的移动智库。这个智库统计了全球的移动设备连接数量,包括许可的物联网(IoT)设备。 让人印象深刻的一个数字是:到2020年2月上旬,全球已注册的移动连接超过95亿,并且以5.5%的年增长率稳步增长。 这些仅仅是4G时代的数字。 2020年1月,GSMA发布了一份5G网络时代设备的新报告。该报告表示,中国将是引领下一代移动革命的国家。 近50%的中国消费者表示,一旦5G服务可用,他们会立即购买5G手机,而美国的这一数字为30%,欧洲为15-20%。GSMA的调查显示,对于手机客户而言,5G完全与速度和覆盖范围有关,53%的人表示希望5G带来更快的网络,而37%的人希望获得更好的覆盖范围。 相比之下,只有27%的人希望获得新的酷炫服务,不到23%的人认为5G是将新工具连接到移动网络。 5G,不仅是速度 这些数字与业内专家所说的5G的意义并不一致。 根据AT&T业务部门医疗保健解决方案总经理Rod Cruz的说法,5G网络的确比4G网络快100倍,下载能力也将大大提高。 但是在2020年国际消费电子展(CES 2020)上,Cruz还表示,对速度的追求只是5G“故事”的一部分:“ 5G具有非常低的延迟,并且具备了巨大的设备连接性。两者都将推动重大变革和创新。” 传统的WiFi网络允许每个AP(访问接入点)进行250台设备的连接,而4G网络的连接数密度只有大约2000-10000 台设备 / 平方公里。有了5G,这个数字会上升到数百万。 换句话说:5G网络上的设备连接数量将变得无限。 Cruz认为,5G有趣的地方在于,它让复杂的边缘计算场景变得更加可行:“今天,大量的工作负载被放在一个中央云上。而边缘计算背后的思想是将工作负载转移到离客户更近的地方。“ Cruz引用Gartner的研究指出,到2025年,多达75%的企业数据将在边缘处理,而不是在云端处理。 5G在医疗领域的应用前景又如何呢? 当然,许多有趣的应用都与速度和容量有关,人们第一个会想到的是在成像领域,例如超声成像和放射学领域。 惠普的人口健康投资主管Frances Ayalasomayajula说,一般的医疗机构每年都会创建TB级的医学成像数据量,因此使用5G来进行与成像相关的处理听起来很简单。 Ayalasomayajula特别提到了WHO的东非地区社区卫生(REACH)倡议,其中包括几个数字卫生规划:“他们有机会进入5G时代,放射学是应用5G技术的一个巨大机会。” 成像也是AT&T与芝加哥拉什大学医学中心合作的内容。 雷锋网(公众号:雷锋网)了解到,2019年1月,拉什大学医学中心成为美国第一家配备5G的医院。目前正在建立的一个应用案例是在整个机构里,让文件“动起来”:医生可以在几秒钟内开展远程咨询或下载大型实验室文件,并提供对这些文件的移动访问能力。 Rush高级副总裁兼首席信息官ShafiqRab博士曾表示:“我们坚信5G是一项改变游戏规则的技术,完全实施后将有助于我们更好地支持医院运营,提供最高质量的患者和医院员工体验。” Rod Cruz说到,在这个领域,5G可以发挥真正的作用:“实时评估成像信息和应用人工智能是需要5G的。这是一个很好的案例,我们很快就会发布。” 从远程指导到基于AR / VR的认知行为疗法 除了传输大型成像文件之外,医疗培训和远程机器人手术也可以让5G有所作为。 例如,一个高度专业化的外科医生可以远程指导不那么专业化的同事。 训练场景越复杂,需要的数据点越多,训练系统需要处理的信息量就越大。除了巨大的数据量,这里需要的是5G网络的物联网能力。特别是远程机器人手术场景,也将受益于极低的延迟。 5G网络还将允许空间计算应用于远程培训场景——空间计算与AI、物联网、5G等技术几乎是同一时期兴起,空间计算是5G的一个重要应用。 AT&T与全球领先的机器人脑外科手术设备提供商Brainlab合作,为移动设备开发基于CT的3D重建工具。这样的工具可能首先是发挥培训、教育的作用,但是成熟之后,它们就会被用来赋能实际的应用程序。 最后,认知行为疗法(CBT)对于医疗保健5G应用来说可能不是那么明显。 CBT是一种广泛的心理治疗方法,至少在某些治疗领域,它更多地是受益于AR和VR,例如,在恐惧症患者中,基于CBT的脱敏治疗,以及在临终治疗中,基于CBT的转移注意力治疗。 想象一下,在美丽的环境中冥想散步,或者坐在海滩上欣赏日落。这类应用的目的是,在一定程度上,通过将思维从身体移开,让人们更容易承受一种致命疾病的最后阶段。 在技术方面,正是高连接性和非常低的延迟使得基于CBT的临终分心治疗尽可能的令人信服和有效。 我们期望太多了吗? 尽管上述许多场景听起来很有希望,但有一个问题是,对于医疗保健领域的“杀手级应用”来说,是否真的需要5G? 美国AT&T的Shiraz Hasan说:“医疗保健客户的许多需求今天就能得到满足。”他在CES 2020讨论会上指出,数字医疗生态系统不仅关乎网络可用性、速度和容量,还关乎合适的设备和健全的商业模式。 换句话说,对于许多医疗相关的物联网场景、远程手术指导或基于AR/ VR的CBT应用而言,缺乏合适的商业模式很可能是比缺乏5G覆盖更大的障碍。 从这个角度来看,围绕5G在医疗保健领域的宣传容易成为一个“误导性”的例子:夸大技术的影响,而低估了社会、经济和医疗因素。 5G的另一个障碍可能是资金。 百思买的Sarah Jones担心,5G会在无意中造成更多的医疗差距,因为它不会在同一时间以同样的质量提供给所有人。 这是有先例的。 随着越来越多的医疗相关流程数字化,买不起Wifi的人比买得起Wifi的人更难获得某些类型的医疗服务。如果出现只能在5G网络上运行、而不能在更便宜的4G等网络上运行的应用程序,这种差距可能会扩大。 除此之外,5G+健康医疗信息化面临泛终端的安全挑战,任何一个医疗设备都可能受到攻击,端和端的传输安全、端和数据中心的传输安全问题尤为突出。 考虑到5G在中国以外的推广才刚刚开始,有关扩大医疗服务差距的讨论可能被认为有些为时过早。 事实上,许多业内人士预计,在大多数国家,5G的推出可能会比4G的推出时间长得多,这与监管、技术、社会质疑等一系列因素有关,比如人们对更强大、更普遍的移动网络可能带来的医疗后果知之甚少。 雷锋网了解到,此前,华为总裁任正非在接受媒体采访时,也表达了需要谨慎对待5G的观点。 他说,“5G实际上被夸大了它的作用,也被更多人夸大了华为公司的成就,实际上现在人类社会对5G还没有这么迫切的需要,不要把5G想象成海浪一样,浪潮来了,财富来了,赶快捞,捞不到就错过了。5G的发展一定是缓慢的。” 下一代移动网络必然出现,但我们有理由相信,5G不会在一夜之间占领医疗保健市场。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-05-04本文作者:李雨晨本文来自:“雷锋网”,了解相关信息可以关注“雷锋网”

优秀的个人博客,低调大师

物联网助力工厂制造效益最大化

随着物联网、大数据和移动应用等新一轮信息技术的发展,全球化工业革命开始提上日程,工业转型开始进入实质阶段。物联网硬件方案商朗锐智科(www.lrist.com)认为,在中国,智能制造、中国制造2025等战略的相继出台,表明国家开始积极行动起来,把握新一轮工发展机遇实现工业化转型。 据媒体报道,工厂的运行能力比过去大得多。通常,工厂会全天候运作,由于停机成本高达每分钟2万美元,工厂的流程不能有任何中断。制造商须应对许多挑战。他们若想满足不断变化的消费者的需求,就需在制造过程中拥有更多灵活性。 制造商面临持续压力,要用有限资本支出跟上增加的需求。而大多数情况下,他们要依靠现有资源和资产。制造商需改进对数据的访问权限,好在要投资何处上做出更好决策。他们希望能接触到领先的专家,但面临资源有限和劳动力老化问题。 物联网利用连网技术连接工厂内的更多机器,对制造商来说是更大的难题。各种设备正在嵌入智能传感器并获得通讯功能。这些不仅是测量温度、压力、湿度和其他参数的传感器,而几乎可以包括任何东西。例如,镜头可成为传感器,可用来透过红外线成像追踪行动、质量或温度。这一切都导致更加智能的制造环境。 除了工厂控制器和其他工厂资产,连通性还在进一步发展。这些连网设备正在被用来更好地理解工厂的所有复杂过程。更智慧的机器可更容易控制,从而提高效率。很多人称之为全厂优化(plant-wide optimization)。 物联网能将连通性与实时分析和云端服务结合起来,从而提高制造产量,延长正常运行时间,实现更灵活的制造,并透过整合孤岛式系统和专有网络降低成本。然而,最新重点已成为保护这些新架构免受网络攻击。 对相信物联网能为工厂带来众多效益的人来说,希望实现的一些重要目标包括降低总体拥有成本、提高运营响应能力,缩短上市时间并保护重要的制造系统。物联网有助于实现这一切目标。 物联网能让制造商大幅改善企业的核心流程,企业非常渴望能获取和分析大量快速数据的技术。物联网创建的这种连通性让企业可更少关注成本,更多关注于成长。物联网助力工厂在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。通过人与智能机器的合作,部分取代专家脑力劳动。智能制造系统不只是人工智能,在突出人核心地位的同时,使智能机器和人能真正地结合在一起,其本质是人机一体化。 智能工厂作为工业智能化发展的重要实践模式,已经引发行业的广泛关注。尽可能倡导和利用物联网的领导者正在蓬勃发展,并体验到新成长机会带来的好处。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册