首页 文章 精选 留言 我的

精选列表

搜索[过拟合],共10002篇文章
优秀的个人博客,低调大师

苏宁Elastic平台化实践中踩过哪些坑,又是如何解决的?

摘要:在南京 Elastic Meetup 南京交流会专场中,苏宁大数据平台搜索平台组的韩宝君为我们带来如何在大量的数据中发现数据的价值。从大数据平台的架构出发,详细解读了平台的概况和服务化平台的模块等方面的知识。最后,具体举出了在实践中出现的一些问题及对应的处理方案。数十款阿里云产品限时折扣中,赶快点击这里,领劵开始云上实践吧!直播视频回顾[PPT下载请点击]https://yq.aliyun.com/download/2885)以下为精彩视频内容整理: 苏宁大数据平台总体架构 大数据平台职责是提供苏宁集团各个业务所需要的大数据存储和计算能力,保证平台的稳定、高效运行,高平台易用性。本文将从ES平台总体介绍、ES平台化之路、实战经验这三个方面来为大家详细解读。大数据平台分为服务层、计算层、存储层三个部分。服务层包括大数据管理平台、数据云、数据开发平台、机器学习、准实时计算、OLAP、实时计算等。ES位于计算层。 Elasticsearch平台概况 集群规模包括18个集群、195个节点、接入100+个业务、4500+个索引数据量64+TB;平台功能包括独占服务和共享服务、资源利用率和业务隔离的权衡;计量计费,强调成本概念;页面化服务增加了使用便利性,减少错误操作,节约时间。 为什么做ES平台? 在一年前四月份时的苏宁,ES没有被普遍使用,版本不统一,计算平台需兼容多版本ES业务自己管理,无专业团队维护,稳定性、性能无法保障,人力和物力方面存在资源浪费现象。所以为了解决这种混乱的状况,我们的目标是做一个专业的ES平台。ES平台的发展主要经历两个阶段,人肉阶段与自动化阶段。人肉阶段包括人肉部署集群、人肉对接业务、人肉运维集群。自动化阶段包括自动化部署集群、申请服务页面化、计量计费功能、可用性、性能监控、安全增强、数据探查。人肉阶段的对接文档包括业务信息、项目信息、应用场景和数据量级(可知每天新增多少数据占多大存储)。下图讲述了数据的索引方式。 服务化平台 服务化平台包括以下几个模块: 监控管理:ES集群的各项监控指标展示。 集群管理:支持多集群,可以查看具体集群信息和节点列表。 项目管理:使用ES服务的项目列表,分配给各自系统的秘钥。 资源管理:机器列表,该机器归属于哪些集群及部署哪些软件包。 软件包管理:支持选择的ES版本相关软件包。 索引管理:该系统下的索引列表,索引的详细信息。 工单管理:用户可以提交相应的工单,管理员审批。 计量管理:系统、集群、索引的请求量和存储量及详情。 查询管理:可以像kibana一样查询ES。其中最重要的是集群管理中的管理员可以添加黑名单和白名单。对于用户申请加入集群可以选择用户视图,然后等待管理员审批。在工单部分管理员可以看到新增字段、创建索引、创建集群等,管理员可以对其进行审批。然后进入到索引管理阶段,以申请索引为例,管理员可以根据申请情况进行下一步的监控处理。监控包括集群巡检、集群监控、节点监控、索引监控和线程池监控。由于集群数目众多,人工处理麻烦,所以我们会定期扫描处理。检查运行状况。同时,还需要对用户进行计量管理。如下图所示可以对索引量进行管理。对于查询管理,用户只有查看权限、不能修改、删除。 实战经验 我们在实践过程中遇到过许多问题,对此,我们是如何来解决呢? 问题一 一个简单的macth_all查询报如下错:Caused by: org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: An HTTP lineis larger than 4096 bytes. (该错误表示http请求超过了ES的http请求长度限制)对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码 https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2) Commits:An HTTP line is larger than 4096 bytes如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch-hadoop/pull/1154 问题二 线程池模块在处理header时有一点小问题。对于这个问题我们的解决方案是,修改elasticsearch源码。如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch/pull/26068 问题三 创建一个Hive外部表指向ES中的某个索引,通过Hive HQL直接操作ES。当运行下面的HQL时,发现找不到数据。select from table_name where city_code in (‘010’, ‘791’);但是下面两条Hql都可以找到数据:select from table_name where city_code in (‘010’);select * from table_name where city_code in ('791'); 对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码, https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2) Commits:check cluster name and add SparkSession conf如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch-hadoop/pull/1135 问题四 Master选举修改,当集群规模越来越大,在高并发、高基数查询和高写入量并存场景下,节点负载高有时可能导致该节点脱离集群或者触发重新选举master,这两种情况下可能都会导致分片漂移,造成资源的浪费。对于这个问题我们的解决方案是,部分节点单机多实例部署、适量增大ping的超时时间、master、data、ingest节点分离(至少设置3个实例为master节点实现多可靠)、修改master选举算法(master节点成为master的优先级最高,其次是ingest节点做担保)如需要进一步了解,详情见: https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:elect master ,include ingest node 问题五 目前有近20个ES集群,部分集群http端口一样。REST方式访问ES集群时,只要IP和端口配置正确,就可以进行访问对于这个问题我们的解决方案是:修改elasticsearch-hadoop源码 https://github.com/hanbj/elasticsearch-hadoop.git(hanbj_v5.4.2) Commits:check cluster name and add SparkSession conf,params append cluster.name 修改elasticsearch源码 https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:RestClient add check cluster name,RestClient add check cluster name (netty3) 具体访问集群方式改变成:见下图。 问题六 黑白名单控制的问题。集群安全稳定至关重要,为了控制集群以外的机器对集群进行无效查询和攻击,所以应该支持动态允许/防止一些机器访问集群。对于这个问题我们的解决方案是,修改elasticsearch源码(支持IPv4、IPv6和通配符) https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:black and white list 参数:都可动态修改 http.filter.enabled  transport.filter.enabled http.filter.allow http.filter.deny transport.filter.allow transport.filter.deny 问题七 在共享集群的模式下,频繁或大并发的导出操作,会给集群造成比较大的压力,导致该集群下其他业务的正常查询延迟。对于这个问题我们的解决方案是,修改elasticsearch源码,添加相应的控制参数,可以控制导出的并发量和数据量。 https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:limit scroll 参数:都可动态修改 scroll.enabled  scroll.interval scroll.concurrent.indices scroll.limit 问题八 目前的elasticsearch-hadoop版本不支持删除索引和数据,但业务有这方面的需求。对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码,增加删除索引和根据query删除数据的逻辑。 https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2) Commits: delete index and delete by query 问题九 delete_by_query和update_by_query API 和其他API 格式不统一,容易对业务造成困扰。对于这个问题我们的解决方案是,修改elasticsearch源码 https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:delete by query,update by query 问题十 Transport模块有一个专用的跟踪记录器,当被激活时,记录传入和进出请求。可以使用一组通配符模式来控制哪些操作将被跟踪。默认情况下,每个请求将被跟踪,除了故障检测和ping。但是日志中并没有打印请求源,不方便进行追踪。我在ES的基础上增加了请求源IP、内部请求转发、请求发送、响应接收的详细日志。对于这个问题我们的解决方案是,修改elasticsearch源码,增加了请求源IP、内部请求转发、请求发送、响应接收的详细日志。 https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:请求追踪 问题十一 Gateway模块用于存储ES集群的MetaData。MetaData每一次改变(比如增加、删除索引等),都要通过Gateway模块进行持久化。当集群第一次启动的时候,这些信息就会从Gateway模块中读出并应用。状态文件存的都是二进制,不具备可读性。对于这个问题我们的解决方案是,修改elasticsearch源码,实现查看所有、全局、单个索引的状态文件内容。 https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2) Commits:cat metadata如有关于技术方面的问题可以关注官方微信公众号或讲师个人微信进行交流。

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

不插SIM卡的GPRS模组-AIR202通过AT指令链接阿里云

关注零妖的微信公众号:LINGYAOIOT ,获取最新物联网技术信息。 一 设备连上网络的首选方法是2G网。 因为中国移动铺设了一张全球最好用的网络—2G网,可以通过GPRS的方式连上互联网。 就信号的覆盖范围和使用的资费来看,通过中国移动的2G网让设备接入互联网是明智的。 为何不用WIFI呢?因为使用GPRS方式上网可以做到开机即用,不用输入账号密码,极大地增强用户的好感度。 二 淘宝网直接搜索 AIR202模组即可买到一个GPRS模组。这个模组是由上海合宙这家公司生产的通信模组,最大的亮点是不用插SIM卡也能进行通信(可以通过一个后台给卡缴费),极大地方便了我们,比如画PCB的时候不用再画SIM插槽了,也不用焊接了,可靠性也更强了。 这篇文章零妖就说说这个模组的使用方法,看完文章后你就可以学会用它连接到阿里云的物联网套件。下一篇文章再介绍数据

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

你从来没听说过的50家最有前途的初创企业

一般来说,判断初创公司能否获得成功的线索并不多。公司的创始人团队是否有过合作经历?经营的业务是否是市场空白?是否有许多其他的创业公司准备杀入?融资步伐是否快速? 市场研究公司Quid基于以上这些问题,调查了5万多家企业,然后从中选择了50家Quid认为是最有发展潜力的企业。 资本方通常会逐家评估初创公司的发展潜力,而Quid这样的调查机构测尝试一次处理大量初创企业的数据,以找到最佳投资目标。此次调查并不是Quid首次尝试这样做,2009年Quid就使用此法做了一个50家最有发展潜力的公司列表,虽然也有看走眼的企业,但还是有一些发展非常不错的公司。 比如Cloudera、Palantir、Evernote、Twitch和Spotify这些公司,8年来至少增长了30倍,如果有机构投资了这些公司的话,可能是近二十年的最佳投资组合。 下面要列出的50家企业,创立均不超过6年,并有着快速的融资速度,典型的公司融资周期为9个月,平均融资次数3轮。 平均融资周期:271天平均融资次数:3.42次 可以从50家企业的列表中看出,投资人偏爱特定的新兴技术领域。如互联网安全、反诈检测,以及人工智能等初创企业,融资金额明显超过其他领域。 融资金额最高的7个领域(美元): 互联网安全与欺诈检测:2.736亿人工智能:1.458亿自动驾驶;图像识别与绘制:1.345亿增加现实:1.108亿智能硬件传感器:9790万无人机:8470万数字化教育:8340万 投资最多的资本机构 投资6家初创企业的有两家: Andreessen HorowitzSequoia Capital(红杉资本) 投资4家初创企业的有四家: Felicis VenturesFirst Round CapitalY CombinatorTechStars 投资3家初创企业的有五家: Kleiner PerkinsFounder CollectiveTriplePointShasta VenturesPromus Ventures 下面是50家最具发展潜力的初创公司列表: 方法论 Quid此次的整体调查对象,是过去三年中接受了风险资本或风险债务的5万家企业。根据 S&P Capital IQ 的数据,包括投资金额、投资方、地理位置和创立时间等,时间截止到2016年9月。从中选出5千家,然后分为三个大类: 1) 估值较低的早期创业公司,但融资速度快,并且资本方为顶级风投机构; 2) 已经在本行业展现出领先地位的公司,估值较高; 3) Quid认为的,在某个领域有着很好市场发展前景的公司。 对市场发展前景的判断,Quid是这样做的。通过分析在2015年至2016年成立的创业公司,找到哪些领域现在最流行,然后再结合该领域从顶尖的五家风投机构融到的资金总额。 筛选出5000家企业之后,Quid通过一系列的标准给企业打分,列出前200家企业。这些指标包括:融资周期、融资次数、投资方的质量和融资总额。之后,再基于创始人团队是否有过合作经历、上过哪所院校、公司员工数量等因素,最终把名单减少到50家企业。 该名单还预置了一些条件,如生物科技被排除在此次调查之外,留出10个名额给非美国公司。Quid拒绝披露企业的分数,或是具体的分析模型。在本调查进行的期间,有一家公司Eye Verify在2016年9月被收购,其余均为独立的公司。 本文转自d1net(转载)

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

当 AI 开始识别被优化过的内容:GEO 的优化思路正在被重新定义

2026 年 8 月,有三件相互独立的行业事件,引发行业共同关注:谷歌完成当月核心垃圾内容更新,官方将矛头指向规模化内容滥用行为;LinkedIn 上线疑似 AI 生成内容私密标记功能,用户标记数据将用于训练平台检测模型;学术界发布专门针对 GEO 优化内容的检测框架与评测基准,将检测器 F1 分数由 0.862 提升至 0.944。三件事分属工程、搜索引擎、社交平台不同领域,却指向同一个行业变化方向。本文探讨:生成式 AI 背景下,识别内容人工优化痕迹正在逐步成为平台系统能力,这一变化,正在重塑行业对于 GEO 优化的理解。一、三个行业信号,指向同一个趋势我们分别来看这三组行业信号。第一组信号来自学术研究领域。一篇名为 GEO‑Flag 的研究论文提出检测 GEO 优化内容的技术框架,同步搭建 GEOFlagBench 评测基准,数据集包含 400 个查询、8 类 GEO 优化工具、合计 3200 条文本样本。该基准的价值在于,首次把 “识别文本是否经过 GEO 优化” 构建成一套可训练、量化对比的模型任务。论文披露两组值得参考的研究发现。一方面,早期内容检测模型较多依赖作者身份等间接特征,而非文本本身的优化痕迹,早期检测手段具备一定局限性;另一方面,研究者提出干预配对训练(IPT)方案,让模型学习同一份文本在执行 GEO 优化前后的文本差异,将检测 F1 分数从 0.862 提升到 0.944。第二组信号来自搜索引擎平台。谷歌 2026 年 8 月垃圾内容更新于 8 月 18 日启动,8 月 21 日完成全量推送。官方公开说明重点针对规模化内容滥用,同时做了重要说明:平台判定标准区分行为本身,不会单纯以内容是人工撰写还是 AI 生成作为处罚依据。第三组信号来自社交平台。LinkedIn 推出用户私密标记疑似 AI 生成内容的功能,用户提交标记样本将用于迭代平台检测模型,平台称该机制每日可拦截数十万条虚假互动。以上学术、搜索引擎、社交平台发生的变化,彼此不存在协同设计,但在相近时间窗口体现同一趋势:针对内容优化痕迹的检测,正在从个别企业的版本迭代,逐步演变为平台常态化基础能力。需要区分:单次算法更新属于突发事件;而把检测能力做成基础设施,则代表长期持续的平台机制。二、值得关注的技术细节:检测模型到底在学习什么理解这一变化带来的影响,需要读懂 GEO‑Flag 论文的核心技术逻辑。研究人员发现,早期检测模型倾向参考作者身份这类间接线索。通俗来讲,模型判断内容风险,更多参考内容产出主体,而不是文本自身留下的客观特征。这个现象有两层现实启示。 第一层,早期检测模型存在局限,会出现误判情况。依靠作者身份做判断,优质原创作者的内容有可能被误命中;而批量生产内容的团队更换账号主体后,又有可能规避检测。过去行业存在的部分优化操作空间,一定程度上建立在检测技术不够完善的基础之上。第二层,这类技术短板正在被弥补。干预配对训练的思路,不是单纯训练模型记忆 “什么样文本像 AI 产出”,而是学习同一文本经过优化操作前后的文本差异。这是一个关键思路转变。文本优化前后的差异值,相比文本静态语言特征稳定性更强,不受题材、行业、写作风格干扰,聚焦 “优化” 这个行为本身。F1 分数由 0.862 提升至 0.944,从数值上看提升幅度有限,但代表这套检测方案在技术层面达到可用区间,行业过去的操作空间正在收窄。三、行业衍生出的反直觉思考如果检测模型重点学习优化前后的文本差异,行业衍生出一个值得思考的观点:文本改动差值越大,潜在风险越高。本文所说差值,指代文本经过优化操作产生内容改动幅度。顺着这个逻辑推导,能够得到一个值得从业者重视判断:突击式、模板化、一次性大批量改写,潜在风险相对更高。这类操作会制造很大的文本差值,原文与改写版本之间会批量植入成套关键词、统一段落范式、标准化引用格式。批量产出的大量稿件之间痕迹高度趋同,这类样本对于检测模型来说识别难度很低。与之相对,长期渐进式补充真实事实信息,风险相对更低。内容迭代来自新增客观信息,而不是全盘重塑文本结构。补充真实经营数据带来的文本改动痕迹,远小于套用模板做文本外壳改造。这里还有一个值得注意的观点:批量生产行为本身会带来风险隐患,不完全取决于单篇稿件文字质量。即便单篇稿件文字质量尚可,如果全部来自同一套模板、同一批次批量改写,文本会留下高度趋同的特征。对检测模型而言,这种批量一致性就是重要识别线索。代写工厂类业务模式面临的不完全是文字质量问题,而是模式本身带来的批量痕迹风险。四、GEO 优化逻辑需要重新审视综合以上信息,行业对于 GEO 优化的认知,需要重新梳理。过去行业普遍理解:GEO 优化,就是让内容适配搜索引擎抓取、引用规则。受这个思路引导,从业者会做大量结构化调整:增加小标题、整理要点、植入关键词、补充结构化数据、统一引用格式。这些操作本身并非错误,但存在共性短板:大多改动的是文本外在形式,

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

别被demo骗了:我们在腾讯云落地生产级Agent踩过的三个坑

过去一年,AI Agent从概念走向工程落地,但社区里充斥着“一键搭建”“零代码实现”的教程,真正扛过生产流量的实战分享却寥寥无几。我们团队在腾讯云基于TKE、CLS和向量数据库构建了一套多Agent协作系统,支撑内部运维自动化与客户服务场景。这篇文章不谈框架选型或prompt技巧,只讲三个让系统从“能跑”变成“能用”的关键工程决策,所有结论均来自线上故障复盘与性能压测数据。

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

真人踩过的坑,告诉你避免自动化测试新手常犯的10个错误

虽然从自己的错误中学习也不错,但从别人的错误中学习总是更好的。 作为一个自动化测试人员,分享常见的容易犯的10个错误,可以从中吸取教训,引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时,既高兴又紧张,因为这是他进入团队的第一个任务。第一印象至关重要,他也希望给团队留下完美的第一印象。小王被要求自动化Web应用程序其中的一个模块,但他想表现得更好、做更多的自动化,于是选择了另外的模块。然而结果是他撞进了死胡同,没有完成。其实小王想做些新尝试并没有错,错在没有咨询前辈就试图自动化该模块。事实证明,这个模块用不着自动化,因为集成的系统可能会导致多重误报。 我在新的自动化测试人员身上看到过很多次这种情况。毕竟,好奇心可以引领前进。当学习自动化测试时,会想尝试在每个项目中引入自动化,但这是不必要的。可能有足够的能力自动化某件事,但这件事是否足够可行?虽然众所周知自动化可以节省时间和精力,但回答以下问题非常重要:“为什么要将此项目自动化?”得到了确切务实的答案后,再为自动化开绿灯。 二、定义范围 定义将要执行的测试的范围是非常必要的。作为新手自动化测试人员时,总是试图测试所有的东西,并使每个测试都自动化。问题是尽管可以成功地自动化所有测试,但这既不实用也不可行。 首先,代码中有很多部分并不需要频繁的测试,但可能需要占用大量时间为其开发框架或脚本。比如当测试一个网站时,自动化网站的每个元素并在其上运行脚本是没有用的,这不值得花时间和精力。 其次,自动化所有的东西会增加测试自动化百分比,这会提供书面上很好的数据,让自己觉得完成了一项出色的工作,然而实际上并非如此。 定义测试的范围,只考虑能够及时提供实际价值的自动化测试的可行代码,做出明智选择。 三、准确选择自动化测试工具 自动化测试人员最常见的另一个错误是没有选择正确的自动化测试工具。一个项目包含许多专注于不同测试目标的组件。这些目标应分为不同的工具,以帮助更有效地实现这一目标。 例如,如果想测试一个网站的API,最好使用Postman;但如果你想确保Web应用程序在不同浏览器间的完美呈现,那么在线Selenium Grid将是自动化跨浏览器测试的最佳选择。 四、与其他测试人员良好协调 测试团队中有很多人,大家具备不同的技能。例如,有人可能擅长业务测试,而其他人可能擅长功能测试。然而,这不是不与他们讨论任务进展的理由。协调是加速产品交付的关键。了解谁在做什么、使用什么工具、对测试自动化的编程语言是否满意。 这有助于帮助排除自动化测试脚本的故障,万一事情不顺利,就会知道该寻求谁的帮助,了解团队也可以帮助自己在需要的时候进行协调。正如在最后一点中所讨论的,一个项目可能需要不同的工具来实现组合的目标,可以让擅长不同工具的测试人员发挥自己的作用。 五、检查投资回报率 仅仅将测试人员的工资作为与整个测试过程相关的成本考虑进去是一个非常新手级的错误。显然,情况并非如此。 例如希望对网站执行跨浏览器测试,测试人员的工资当然是成本的一部分。但如果团队不知道这种类型的测试或与之相关的任何工具,那么还需要通过培训来提升他们的技能,这会产生额外成本。此外,还需要有合适的自动化测试工具或者框架来执行自动化浏览器测试。当然,也可以考虑开源框架。 这只是一个例子。同样,在对Web应用程序执行自动化测试的过程中,您还会遇到其他投资。但是,他们肯定会出现。因此,应仔细考虑测试成本,并牢记您将获得的这些投资回报。如果回报率较低,则需要更改策略并再次计算。但最终,您需要在整个测试过程中获得良好的投资回报率。 六、过度依赖无代码测试 虽然无代码自动化测试工具的学习曲线很短,很容易入门,但它们不会帮助构建自动化测试人员配置文件所需的相关技能集。作为初学者,它们很好地帮助新手起步,但随着自身技能的发展,就会意识到它们并不像期望的那样有用。如果决定用无代码自动化工具的智慧参加自动化测试人员的面试,或者一直单独用无代码自动化来自动化复杂的web应用程序,那么将经历一段艰难的时光。 可靠性是这类工具的另一个大问题。在一天结束的时候,需要了解代码,以便调试自己的自动化测试套件执行出错的地方。此外,如果面对一个复杂的网站,那么就不会发现无代码自动化测试工具可以像你想的那样灵活。建议不要逃避代码,而是要熟练地学习它。最重要的是,这将是个人简历上的一大魅力。因此,作为自动化测试人员,请确保避免这种常见的错误。 七、维护测试设计 测试设计是将一般测试目标转换为有形测试用例和条件的过程。作为开发人员,我们倾向于认为既然测试需要编码,为什么开发人员不能完成这项工作?如果是这样的话,那么测试这个岗位也就不存在了。 作为初学者,不理解测试设计的重要性可能是作为自动化测试人员最大的错误。任何时候测试任何东西都是荒谬的想法。为了有效地进行测试,测试人员需要设计测试,然后对其进行编码。设计测试有助于创建有意义的测试,并使整个测试过程非常高效。 八、关注代码重用性 测试用例对它所应用的代码并不是唯一的。在一个项目中,会出现许多类似的组件,它们需要类似的测试设计和测试套件。比如,在使用Selenium进行跨浏览器测试时,我们发现Web页面的四个元素都是输入字段,并且需要类似的测试用例。在这里,可以通过仅为第一个元素编写测试来复制粘贴代码。虽然这将给出预期的结果,但问题是将来开发人员可能会以某种方式更改元素。现在,要更改测试用例,就需要更改所编写的每个测试套件中的代码。所有的时间都将浪费在寻找和修改这些测试代码上。 为了避免这种情况,应该始终关注代码的可重用性。与其一次又一次地粘贴代码,不如用适当的参数构造一个函数,并在每个元素上调用该函数。这样,如果将来有任何更改,只需要修改函数,就可以开始了。 九、100%自动化是一个神话 跟计算机领域经典的“人月神话”一样,这里的“神话”同样指不可能达到的天方夜谭。 不要相信这种神话,因为作为一个自动化测试人员,这将是一个严重的错误。作为自动化测试领域的新手,对于将自动化引入到项目中都会很兴奋。但这会让人犯错误,认为自动化测试可以完全取代手动测试过程。随着时间的推移,我们将知道这是不可能的。百分之百用自动化测试取代手动测试是一个神话,它永远不可能实现。 作为这方面的初学者,不要试图实现这样的目标。又回到第一条,只有在必要时才进行自动化,并且只对那些需要自动化的项目进行自动化。 十、遵循从头开始 在测试时,会遇到不同类型的问题。需要设定目标并对这些问题进行分类。一种基础方法是用较小的模块而不是大模块开始自动化测试。 作为自动化测试人员,最大的错误之一是开始自动化时使用更大、更复杂的模块。可能缺乏对每个用户交互中涉及的入站和出站流程的认识;甚至可能缺乏处理棘手的测试用例的熟练程度;可能最终会浪费大量的时间,但却一无所获。所以从小处开始,从基础的方法中增加自动化测试的覆盖率。 第一次踏入自动化测试领域,难免犯一些错误,这些错误会造成时间、金钱、精力的浪费。希望这篇文章能对自动化测试新人有所帮助,帮大家避免踩这些不必要的坑。

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

每日一博 | 前车之鉴:聊聊钉钉 Flutter 落地桌面端踩过的 “坑”

作者:刘太举(驽良) 《Dutter 系列文章》将阐述钉钉基于 Flutter 构建的跨四端应用框架(代号 Dutter)的技术实践与踩坑经验,共分为上、下两篇,上篇内容可点击 Dutter | 钉钉 Flutter 跨四端方案设计与技术实践,本文为下篇,感谢阅读。 本文主要介绍一下钉钉 Flutter 业务灰度过程中,在桌面端遇到并处理过的几个 FlutterEngine 层面的 Bug。具体包含: Mac 端: FlutterEngine 退出之后内存泄漏问题; FlutterEngine shutdown 阶段死锁问题; 低版本 macOS OpenGL 析构阶段 Crash 问题; Windows 端: Win7 设备渲染模块「Crash + 残影」问题; FlutterPlugin 注册阶段野指针 Crash; Flutter Window 可见性变化之后页面白屏。 下面来为大家分别介绍一下。 FlutterEngine Mac 端问题 1.1 FlutterEngine 退出之后内存泄漏问题 问题背景 Mac 端 FlutterViewController 在销毁之后,其开辟的内存并未并实际释放,会出现内存泄漏问题。此问题在 Flutter issue 中有一些讨论,但一直未有明确定位。在钉钉 Mac 端 Flutter 业务灰度过程中也遇到此问题,如无法处理将直接影响 Dutter 在 Mac 端落地的可行性: 定位分析 一句话原因: Mac 端 FlutterEngine 实现中对 weak property 使用不合理导致。FlutterViewController 强持有 FlutterEngine,后者持有一个指向 FlutterViewController 的 weak property。FlutterViewController 在 dealloc 流程中尝试释放 FlutterEngine,但是此时 FlutterEngine 中持有的 weak property 已经无法正确访问(nil),导致释放流程未能正常执行,出现泄漏。 下面结合具体实现来为大家做一个简单说明。 由于设计到 OC 和 C++ 对象生命周期管理问题, FlutterEngine 内部对象持有关系略微特殊一些,大致如下图所示: FlutterViewController 作为对外暴露的主要 Class,负责创建并持有 FlutterEngine 以及 FlutterView; FluterEngine 在初始化阶段会自己强持有自己,并在 shutdown 时自我 Release; FlutterEngine 会创建并持有 FlutterRenderer,FlutterRenderer 会强持有 FlutterView; FlutterEngine 间接强持有 FlutterView; FlutterEngine 有一个指向 FlutterViewController 的弱引用指针。 正常情况下,FlutterViewController 退出之后,会通过调用 FlutterEngine 的 setViewController 传入 nil 的方式,来触发 FlutterEngine shudown 动作。参考实现如下: 即正常情况下,FlutterViewController dealloc 之后应该触发 369 行代码运行,进而释放 FlutterEngine 资源。但是实际运行情况缺不是这样,在代码运行到 359 行时,尝试判断 if (_viewController != controller) 时并未成立。通过上述代码我们知道,controller 是外部传入的对象此时为 nil;_viewController 作为一个 weak proptry,在 FlutterViewController 进入 dealloc 流程之后也变为 nil。因而在此流程下,我们希望中的 shutDownEngine 方法并未被调用。 处理方案 问题定位之后处理方式就很简单了,可以在 FlutterViewController dealloc 的时候手动触发 FlutterEngine shutDownEngine 方法。并且通过在上层通过 OC 动态特性 hook 实现、或者直接修改重新编译 FlutterEngine 都可以。 但此处修改一定要谨慎,注意完整还原 FlutterEngine 中的 shutdown 流程,否则可能导致我们遇到的第二个问题:死锁。 1.2 FlutterEngine shutdown 阶段死锁问题 问题背景 钉钉最初在处理上述「FlutterEngine 泄漏」问题时,采用了一种相对比较简单的方案:在 FlutterViewController dealloc 方法中,手动调用 FlutterEngine 提供的 shutDownEngine 方法,手动触发相关资源释放。 通过此方案,FlutterViewController 退出之后内存确实出现了下降,但是在灰度时发现偶尔会有整个页面卡死的情况。通过对出现问题的链路进行简单分析以及配合暴力测试,我们在 debug 环境对问题做了还原。最终初确认 UI 线程与 Raster 线程出现死锁,死锁之后的线程状态大致如下。 UI 线程状态: Raster 线程: 定位分析 一句话原因: 钉钉侧调用 FlutterEngine shutDownEngine 方法不合理导致。shutDownEngine 之前,必须先调用 FlutterView 的 shutdown 方法来停止渲染流程。待渲染流程正常停止之后,才可进入 FlutterEngine 资源释放流程,否则即有可能出现上述死锁问题。 因为此问题为钉钉调用不合理导致,具体异常原因不再深入分析,感兴趣的同学可以根据上述线索自行查阅。 处理方案 在上层补全 FlutterEngine 释放流程,在调用 FlutterEngine shutDownEngine 之前首先调用 FlutterView shutdown 停止 Raster 线程。 1.3 低版本 macOS OpenGL 析构阶段 Crash 问题 问题背景 此问题还是接两个问题,在处理完问题1和问题2之后,参考 FlutterEngine shutdown 流程,钉钉会在 FlutterViewController 析构之后做3件事情: 将 FlutterRenderer 中绑定的 FlutterView 置为 nil; 调用 FlutterView shutdown 方法; 调用 FlutterEngine shutDownEngine 方法。 经过一系列处理之后,测试发现内存泄漏和死锁问题基本得以根治。但是在内部灰度过程中发现低版本 macOS 上会出现 Crash,堆栈大致如下: 定位分析 一句话原因: 与问题2类似,此问题也是因为钉钉处理泄漏问题而引入。其大致由两方面因素迭代导致。一方面因为重置 FlutterOpenGLRenderer 绑定的 FlutterView,导致在 embedder 层创建的 OpenGL 对象被提前释放;另外一方面因为低版本 macOS OpenGL 实现不完善析构流程中未能对关键链路做保护,进而导致异常。 下面对异常相关代码做一下简答分析,避免其他同学再遇到类似问题。 1、在 FlutterEngine setViewController 方法中,如果处于释放流程,会调用 FlutterOpenGLRenderer setFlutterView 方法,并传入 nil: 2、FlutterOpenGLRenderer setFlutterView 方法在入参为 nil 时,会释放其内部维护的 NSOpenGLContext 对象: 3、FlutterEngine 底层实现会在 GrDirectContext 对象析构时执行 flush,如果此时 OpenGL 相关对象已经释放,在低版本 macOS(10.11, 10.12)会出现 Crash: 处理方案 由于出现问题的部分是由钉钉上层代码触发,处理相对比较简单。最终我们在所有使用 OpenGL 渲染的 Mac 设备上(macOS 10.14 之前的版本)移除 FlutterView 置空动作。即最终 FlutterViewController 释放阶段只执行以下两个动作: 调用 FlutterView shutdown 方法; 调用 FlutterEngine shutDownEngine 方法。 FlutterEngine Windows 端问题 2.1 Win7 设备渲染模块「Crash + 残影」问题 问题背景 此问题背景略微有些复杂,如果细分来看的话,此问题应该可以拆分为两个子问题。 第一个问题是,在部分 Win7 设备上(x86 + x64)出现 d3d11 导致的 Crash,堆栈大致如下: 由于迟迟无法定位导致此问题的具体原因、且 Flutter 官方表示他们对 Win7 设备的覆盖度并不完善「参考」。因此我们决定对 FlutterEngine 稍加定制,在 Win7 等陈旧设备上强制通过「软解模式」来渲染 Flutter 页面。 本以为通过此方式可以绕过此问题,但很不幸运的是此方案暴露了 FlutterEngine 里另外一个 Bug:通过「软解模式」来渲染页面时,FlutterViewController 关闭只有有一定概率会导致 Windows 桌面出现残影。 定位分析 一句话原因: 此问题主要是因为 FlutterEngine 内部 shutdown 流程中,未及时修改 FlutterWindowsEngine 指向 FlutterWindowsView 对象的指针,导致多线程场景下出现野指针;因为野指针导致raster 线程在 FlutterWindowsView 已经销毁情况下仍向其输出绘制帧,进而导致异常。 在定位时,我们通过增加辅助 log 的方式来加快问题定位过程。通过对关键节点补充日志,我们很快发现了可疑点: 上图是出现问题之后关键节点输出的日志。我们通过日志可以得到以下关键信息: OnBitmapSurfaceUpdated 是 FlutterWindowsView 的成员函数。但是在输出最后两行 OnBitmapSurfaceUpdated 方法时,FlutterWindowsView 的析构函数已被执行(野指针); 最后一次执行 OnBitmapSurfaceUpdated 时,渲染使用的 Window 句柄为 nullptr,即可供渲染的窗口(与 FlutterWindowsView 绑定)以被释放。 因为最后渲染所使用 Window 句柄为 nullptr,进而导致出现残影问题。 补充说明:在调用 C++ 成员函数时,即使调用时 this 已经为野指针,但只要成员函数中并未访问到 this 对象,则不会出现内存访问异常(Crash)。 处理方案 修改 FlutterEngine 内部实现,在 SoftwareRenderer 模式下 FlutterWindowsView 析构时,置空 FlutterWindowsEngine 指向其的指针(因 GPU 模式会有异常输出,暂未修改): 通过此方式,可以保证在 FlutterWindowsView 销毁之后 raster 线程中的任务不会再回调渲染接口: 2.2 FlutterPlugin 注册阶段野指针 Crash 问题背景 在钉钉 Flutter 版本「+面板」业务 Windows 端一灰、二灰阶段出现较多例 Crash,客户端整体 Crash 率高达 x%: 通过简单分析,还原 Crash 堆栈大致如下: 从堆栈可以达到两个比较重要的信息: Crash 出现在 FlutterEngine 初始化阶段,具体是在 Plugin 注册时出现异常; 导致 Crash 原因是野指针问题。 定位分析 一句话原因: Flutter 为 Windows 平台提供 wrapper 层代码中,包含一个设计上为单例的对象 PluginRegistrarManager。PluginRegistrarManager 主要服务于 FlutterPlugin 注册、设计上为一个单例,其内部通过 map 维持了一个 FlutterEngine 指针与 Registrar 的映射关系,保证 Registrar 与 FlutterEngine 生命周期保持一致。但是因为 wrapper 层的代码在构建时被编入了 pulgin.dll,导致每一个 plugin.dll 中都包含一份 PluginRegistrarManager 实现副本,即「单例机制」失效。带来的问题是 FlutterEngine 析构时无法正确清除 PluginRegistrarManager 中的绑定关系,导致其内部维护一个失效的指针地址,再次访问时出现 Crash。 下面简单介绍一下分析过程。通过暴力测试,我们可以复现问题: 根据上图可以确认,出现 Crash 是因为 FlutterEngine 对象野指针导致。进一步定位插件注册时 Engine 指针来源,最终可定位到 flutter::PluginRegistrarManager::GetInstance()->GetRegistrar() 方法中: 进一步分析 PluginRegistrarManager 中的实现,可知 GetRegistrar 内部需要 map + emplace 方法来维系 FlutterEngine 地址与 Registrar 关系: 其内部会通过 FlutterDesktopPluginRegistrarSetDestructionHandler 将方法注册到底层 Engine 对象中,其会在 FlutterEngine 析构时被调用,进而解除绑定关系: 问题即出现在此流程中,如果 PluginRegistrarManager 并非真正的单例,且 FlutterEngine 只能维护一份有效的 OnRegistrarDestroyed 回调,那么在 FlutterEngine 析构时,有部分 PluginRegistrarManager 对象中保存的 FlutterEngine 地址不会被清除,再次使用时即会导致问题。 处理方案 修改 FlutterEngine wrapper 层 PluginRegistrarManager 实现,优化「单例」实现方案。将单例生命周期周期管理下层到底层,wrapper 层仅负责提供相关服务。 具体可参考: 2.3 Flutter Window 可见性变化之后页面白屏 问题背景 在 Windows 端 Flutter 页面中,如果将 Flutter Window: 先通过 ShowWindow(flutter_wnd, SW_HIDE) 隐藏; 再通过 ShowWindow(flutter_wnd, SW_SHOWNORMAL) 显示出来。 会发现 Flutter 页面内容无法正常展示,画布上为空白一片。如果在白屏之后通过 setState 或者 拖拽窗口等方式触发 Flutter 页面刷新,则内容可被正常渲染。 定位分析 此问题相对比较明确,Flutter Windows 端实现存在 bug,在 Window 可见性发生变化之后,应重新出发 flush 将最新视图绘制到对应窗口,但是目前此流程并未实现,导致出现以上问题。 处理方案 此问题已经提交issue,暂时钉钉侧是通过上层补偿的方式来绕过此此问题。我们在 Native Window 可视性变化之后,手动通知 Flutter 侧刷新当前可见页面,以此触发重绘、规避问题。 总结 以上即为钉钉 Flutter 落地过程中桌面端处理的几大主要问题。从我们实际体验来看,虽然在 Flutter v2.10 版本已经正式发布对 Windows 的支持。但仅从稳定性角度来看,Flutter 在 Mac 端的表现无疑要优于 WIndows。如果有其它团队希望在使用 Flutter 在桌面单端做一下尝试,我们优先推荐选择 Mac 端,其无论是上手门槛还是性能稳定性表现,相比 Windows 端要更有优势。 关注【阿里巴巴移动技术】,阿里前沿移动干货&实践给你思考!

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

5G来了,能耗这关怎么过? 四大节能方案提供解题思路

5G时代的到来改变了人类社会的生产和生活方式,但是5G基站AAU功耗大的问题不容忽视。目前华为、中兴通讯、爱立信等主流设备商的AAU功耗比4G网络设备中RRU的功耗增加了许多,极大地增加了运营商的运营成本。运营中的通信网络资源由于承载业务的不均衡导致资源利用率不充分,甚至有的网络资源处于空载状态。 同时,在5G网络中由于其AAU本身的特点,有的站点垂直维度较高,其小区层资源很难被充分利用,导致了某些小区部分资源处于利用率过低甚至空载的状态。在目前整个社会都提倡将本增效的环境下,如何在降低5G网络能耗成本的同时,确保网络资源高效运转对运营商的可持续发展具有非常重要的意义。 本文从AAU天线通道关闭、网络存在潮汐区域的节能方案、增强网络覆盖能力以及合理设置网络切换区域等4个方面来探讨5G网络如何更有效地实现节能,且网络节能后能 确保用户网络体验良好,使5G网络资源利用率更高。 四大5G网络节能方案实施 5G基站AAU基于通道关闭的节能方案 AAU通道的关闭分两种情况:通道完全关闭以及通道内分时段关闭。 一是通道完全关闭。以5G网络建设中经常用到64通道的AAU为例,5G网络端可以监测每一个通道的流量承载情况,如果流量低于特定的门限值,则开启此通道流量全量迁移尝试,尝试将此通道原来承载的流量迁移到相邻通道,临近通道是否接收取决于自身通道的流量承载极限。同时,AAU由于其波瓣具有自我恢复能力,因此通道关闭后对AAU覆盖性能的影响可以忽略不计。 基于A AU通道完全关闭方案的流量迁移算法流程图如图1所示:将64通道的AAU中某个通道设为Tk,Tk通道承载的流量是M,Tk-1通道承载的流量是O,Tk+1通道承载的流量是P;设Tk通道承载流量的最低门限值是L,最高门限值是H,其中L 图1 AAU通道流量迁移算法流程图 二是通道内分时段关闭。当5G网络的A AU检测到部分应该发送下行信号或者上行信号的时刻,而没有数据发送的时候,则关闭PA,节省PA静态功耗。如果AAU检测到有信号发送,PA立刻恢复为正常状态。以下行信号发送为例,具体5G网络A AU正常状态和节能状态对比如图2所示。 图2 5G网络AAU正常状态和节能状态对比图 潮汐区域的5G网络节能方案 所谓潮汐区域指的是在不同时间段内5G网络的流量承载负荷不同,城市中的CBD(中央商务区)区域以及商业街区潮汐现象相对明显一些,这些区域存在的共同特点为白天人流量较大、网络承载负荷较大,夜晚人流量较小,网络承载负荷较小。 潮汐区域5G网络的节能主要聚焦于潮汐区域的网络结构以及网络运营时各个扇区的流量承载。网络通过日常监控5G基站各个扇区的流量承载情况,按照如下方式实现网络节能,即如果出现扇区A承载的流量大于扇区B承载的流量,且扇区B承载的流量完全可以迁移到扇区A,同时扇区A同意迁移,则开启扇区B休眠模式,此时同步调整扇区A的网络参数(如适当抬升下倾角)确保B扇区的流量能够全部足量地迁移驻留进扇区A。另外,扇区A和扇区B的流量迁移基于相邻5G基站中距离最近的两个扇区间完成。 5G基站各个扇区流量迁移具体实现情况如图3所示:gNB3基站的3个扇区向周边基站实现流量迁移方向如箭头所示,接收基站gNB3流量的基站gNB2、gNB4、gNB5能够完全接收gNB3 3个扇区的流量;gNB3基站完成流量迁移后开启休眠或者关闭模式,暂时退出网络运营。 图3 5G基站各个扇区流量迁移示意图 由于5G网 络具备自我优化的能力,所以网络参数的 设 置 可 以 自 我配置、自我动态实现。从一定意义上说,扇区B是一个只用于承载容量的扇区,它在高人流量、高网络负荷的时候开启,在低负荷、低人流量的时间段关闭。时间节点的选择以不引起5G网络中各个扇区出现拥塞预警为前提。 提升5G网络覆盖能力,降低网络能耗网络覆盖性能的好坏主要影响5G网络系统控制信道信令的开销。在5G网络覆盖能力较差的情况下,终端需要不断地检测网络信道,这样导致信息传输的速率降低,信令开销增加,信令开销的增加会导致系统能耗的增加。另外,网络导频信号设置不合理可能会引起终端的乒乓切换,增加网络不必要的信令开销,无法完成业务信道正常的数据传输。 5G基站的控制信令主要是RRC建立流程(如图4、图5所示),两种信令流程的区别是只有激活了接入层安全的终端才可以发起重建过程,如果有上下文并校验通过,则重建成功,否则按照图4完成RRC重新建立。 图4 5G基站RRC信令流程(1) 图5 5G基站RRC信令流程(2) 无论5G网络和终端之间通过图4流程还是通过图5流程建立RRC连接,当传输指定长度的报文时,如果网络的覆盖性能不足,则终端和网络之间需要多次尝试RRC连接建立链路,这样会导致网络资源主要是信令开销和网络能量消耗增加。 5G网络覆盖能力的提升从以下几个方面来实现:优化5G网络无线参数,比如通过调整AAU的设计参数如挂高、下倾角和方向角来提升网络覆盖性能;充分运用5G网络特有的覆盖增强技术提升覆盖能力,比如通过在网络的上行方向引入低频实现网络的上行覆盖能力增强;通过合理使用波束赋形技术也可以实现增强网络的覆盖性能。 合理设置网络切换区域,降低网络能耗 网络切换区域的设置主要影响用户选择的驻留小区,当终端向信号质量较好的目标小区发起切换请求时,如果切换门限设置不合理,势必会影响终端不能及时驻留到质量较好的目标小区,而出现终端依然驻留较差小区的情况,这样导致终端不断地检测网络信道质量,增加5G网络的信令开销,进而导致能耗增加。 5G网络切换的信令流程如图6所示,如果终端发起切换请求(H O Request)时,原来5G基站由于切换参数的设置不合理导致终端不能及时切换到目标小区,原来的小区由于信道质量较差,终端的切换请求始终在进行,这样导致系统产生不必要的信令交互,增加资源消耗,进而增加网络能量消耗。 图6 5G切换流程图 5G网络切换区域的合理设置从以下几个方面来实现:合理设置切换邻区,合理控制5G网络中每个基站的覆盖范围,确保相邻扇区中相互重叠的区域最优;合理设置切换门限以及切换完成时间,确保终端始终可以及时驻留到网络质量最佳的目标小区。 5G网络节能综合分析 基于AAU通道关闭的节能方案,实现起来相对容易,绘网络带来的影响是由于通道关闭影响到扇区的波瓣宽度,进而影响扇区边缘的覆盖范围,最后影响用户在小区边缘的速率体验。若64通道的AAU在垂直维度上半部分长期存在业务流量承载较低的情况,则考虑更换较低通道如32通道或者8通道的AAU实现网络节能。 针对5G网络潮汐区域的节能方案实现效果最明显,但是对网络结构的影响相对较大,对5G网络参数的自我优化以及配置能力要求较高,不仅涉及一般工程参数(如挂高、方向角、下倾角、发射功率等)的调整,也涉及邻区及切换门限值的调整。 提升5G网络的覆盖能力优先选择不增加基站来完成,这种方案实现起来也相对容易,首先通过调整工程参数(如挂高、方向角、下倾角)来完成,其次选择覆盖增强技术,必要时适当调整基站的发射功率来实现。 5G网络切换区域的合理设置主要涉及切换邻区以及切换门限值的设置,实现起来也相对容易。只要5G网络结构变化不频繁,切换区域设置很快完成后不需要频繁调整。 基于5G网络节能方案研究本文从4个方面进行论述,分别是A AU通道关闭、针对潮汐区域的节能、增强网络覆盖能力节能、合理设置网络切换区域节能,以上4种节能方案如果综合使用则效果更好。另外,涉及潮汐区域的网络节能方案还可能涉及区域内站点之间的协同,尤其是参数之间的协同调整,这样对5G网络的自我优化、自我配置能力都提出了很大的挑战。 当然,5G网络的节能以不降低网络的用户感知为前提,只有这样的节能才能同步实现用户感知良好和运营商收益双赢。

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

扎克伯格开发笔记:打造Jarvis的日子,我庆幸自己从未停止过编程

雷锋网按:作为一家科技巨头的CEO,扎克伯格却依然保持写代码的习惯。可怕的自制力,超强的执行力,当比你有钱的人还比你更聪明更勤奋的时候,雷锋网编辑不禁开始怀疑人生。 以下文章来自扎克伯格的笔记“Building Jarvis”,由雷锋网(公众号:雷锋网)编译,未经许可不得转载。 2016年我给自己制定了一个挑战:打造一个像钢铁侠里 Jarvis 那样的家庭AI助手。 我的目的是了解人工智能发展的现状。虽然人工智能已经比人们能察觉到的要先进得多,但是依然还有很长的路要走。通过完成这些挑战,我不仅熟悉了Facebook的工程师们使用的内部技术,而且还对智能家居有了全面的了解。 在这一年里,我打造了一个可以通过手机和电脑进行对话的AI系统。它能够控制我家里的灯光、温度、电器、音乐和安防系统,而且这个AI还能了解我的品味和习惯,可以学习新的词汇和

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册