浅谈A/B测试 ,看这一篇就足够了

2023-11-13

随着流量红利的逐渐消失,越来越多的公司开始重视数据驱动、试验驱动的精细化运营思想,并积极进行实践。有些公司在考虑采购第三方试验平台,有些公司考虑自建试验平台。
我们和这样的公司都有深入的接触,发现很多公司对试验平台应该是什么样的,有什么样的坑,以及怎么避免才坑没有完整清晰的认识。
为此,我们发起这个 Chat 活动。在这次活动中,将会用最简单易懂的语言说清楚,关于 A/B 测试 “ 从入门到放弃 ” 你所需要了解的一切,希望可以提高大家对于 A/B 测试的认识水平,更好服务各个企业的精细化运营。具体内容主要有以下四个部分:

什么是 A/B 测试
怎么做 A/B 测试
A/B 测试中容易遇到哪些坑,如何避免
科学高效易用的 A/B 测试平台是什么样的

什么是 A/B 测试

在自然界长久以来就存在 A/B 测试的活动,事实上,物种的演化本质上就是一种 A/B 测试的过程:

生物在繁衍过程中,会发生基因突变,从而导致后代的性状发生各种不同的变化,严酷的自然选择会把适应环境变化的性状和其对应的基因保留下来。

保留下来的基因,又会发生基因突变,如此往复循环,经过数十亿年的 A/B 测试,自然界才进化出现在这样丰富多才的生物世界。
在人类社会的活动中有意识的引入 A/B 测试,是从疾病治疗的研究开始的。
举个例子:
15 世纪末,人类开启了大航海的伟大时代。然而航海中容易出现坏血病,发病以后,病人症状会从牙龈出血发展到全身溃烂而死,非常严重。现在我们都知道,得坏血病是因为水手们长期漂流在海上,没有新鲜蔬菜水果,缺乏维生素 C 导致的,但当时不知道,只好胡乱实验,有喝稀硫酸的,有喝海水的,但基本都没用,有时碰巧好了,但闹不清究竟是喝什么好的。几百年过去,一直找不到真正合适的药。
到了 1747 年,英国军舰上有一位医生姆斯 · 林德,灵机一动,想出一个 “ A/B 测试 ” 的方法,把 12 位生病的海员分成 6 组,每组两人,分别用不同的验方,比如第一组吃橘子、柠檬,第二组喝稀硫酸,第三组喝海水 …… 结果六天之后奇迹发生了,第一组吃橘子、柠檬的好了,其他组都没好,反复试都是这个结果,于是真正对症的药找到了,就是吃水果。
虽然因为当时科学还不够发达,背后的病因(缺乏维生素 C)并不知道,但确切有效的疗法和药有了,这就够了。这就是 “ A/B 测试 ” 的神力。

林德发明的科学方法几经周折,直到林德去世后才最终被承认,坏血病从此在英国海军中被消灭,英国也因此成为强大的 “ 日不落帝国 ”,人们彻底信服了林德的 “ A/B 测试 ”。
后来,临床医学上的 A/B 测试又经过了很多的实践和迭代,美国耶鲁大学的汤姆教授在 1938 年正式把 A/B 测试系统化,理论化,学科化,成为现代 A/B 测试的开端。
现在 A/B 测试已经成为医学制药行业的标准操作流程,在美国,没有经过 A/B 测试的新药是不能上市的。

在互联网研发实践中的 A/B 测试是指:为了验证一个新的产品交互设计、产品功能或者策略、算法的效果,在同一时间段,给多组用户(一般叫做对照组和实验组,用户分组方法统计上随机,使这多组用户从统计角度是无差别的)分别展示优化前(对照组)/ 优化后(实验组,可以有多组)的产品交互设计、产品功能或者策略、算法,并通过数据分析,判断优化前后的产品交互设计、产品功能或者策略、算法在一个或者多个评估指标上是否符合预期的一种实验方法。
在这里插入图片描述

从传统医学 A/B 测试中汲取经验的互联网 A/B 测试,已经经历了 20 年左右的发展,有了一套成熟的实验操作步骤。下面借助上面的流程图介绍一下一般的 A/B 测试操作步骤:首先,A/B 测试是服务于特定业务目标的,这些业务目标必须有明确的指标可以进行衡量。互联网产品通常关注的是转化率指标(具体可以是点击转化、下载转化、注册转化、下单转化等)。
确定目标及衡量指标以后,我们需要通过各种手段了解该目标的影响因素,这些手段包括不限于:漏斗分析、热图分析、深入的用户访谈、和竟对的数据对比、设计方案对比、头脑风暴等。除此之外,我们还可以充分利用前人对消费者心理的研究成果,比如霍布森选择效应和罗森塔尔效应。

还有 Wider Funnel 提出的LIFT模型,可以帮助我们发现页面中存在转化障碍的瓶颈,以及从价值主张,清晰度,相关性、注意力分散、紧迫性、焦虑感六个维度来体系化地对障碍进行梳理和攻克。通过这个步骤可以提出一些对目标改进有帮助的解决方案,这时候我们就是在建立假设:使用我们提出的新的解决方案,可以优化目标指标值。

有了试验的假设,下一步就是开始进行试验测试方案的设计。根据我们要优化的页面的历史数据,可以得到希望做试验的页面的原始版本指标值,每日UV数,再根据我们对试验结果的初步预测,也就是各个试验版本相对原始版本的能提升的比例,可以得到实验大致需要分配多少流量,试验的周期多长,才能达到一个合理的统计功效,以较大的概率完成试验效果的收敛。

在这个过程中,可能还需要考虑试验面向的群体是否要做一些特殊的限定,比如,有些业务需要针对新用户进行试验,这时候就需要在试验设置中进行限定,同时对前述判断统计功效的基础数据做一些修正,得到新的试验方案设计。

试验方案设计好了以后,最好让实验按照设计跑起来,到了设计的时间点再去观察实验数据,而不是提前观察。如果需要在实验中间不断观察实验数据做出是否终止实验的决定,则需要根据观察频率对试验效果数据进行一些调整,以使试验数据修正到符合预期的实验置信度。准确理解这个事情需要有比较深入的数学理论基础,如果有必要可以另开主题分享,这里不做深入分析。

到了试验方案设定的结束时间以后,试验停止,并计算试验的效果数据,这里面一般会统计设定置信度下(一般是 95 %)的置信区间,实验的显著性指标 p-value,统计功效等,通过这些指标来判定试验的效果是否符合预期。

A/B 测试容易遇到哪些坑

下面我们总结一下 A/B 测试容易遇到的一些坑。

辛普森悖论
辛普森悖论(Simpson’s Paradox)是英国统计学家 E.H.辛普森(E.H.Simpson)于 1951 年提出的悖论,即在某个条件下的两组数据,分别讨论时都会满足某种性质,可是一旦合并考虑,却可能导致相反的结论。

举一个辛普森悖论的简单小例子:一个大学有商学院和法学院两个学院。这两个学院的女生都抱怨 “ 男生录取率比女生录取率高 ”,有性别歧视。但是学校做总录取率统计,发现总体来说女生录取率却远远高于男生录取率!

商学院男生录取率 75 % 高于女生录取率49%,法学院男生录取率 10 % 也高于女生录取率 5 %,但是总计来说男生录取率只有 21 %,只有女生录取率 42 % 的一半。
在这里插入图片描述

为什么两个学院都是男生录取率高于女生录取率,但是加起来男生录取率却不如女生录取率呢?主要是因为这两个学院男女比例很不一样,具体的统计学原理我们后面会详细分析。
这个诡异(反直觉)的现象在现实生活中经常被忽略,毕竟只是一个统计学现象,一般情况下都不会影响我们的行动。但是对于使用科学的 AB 测试进行试验的企业决策者来说,如果不了解辛普森悖论,就可能会错误的设计试验,盲目的解读试验结论,对决策产生不利影响。

我们用一个真实的医学 AB 测试案例来说明这个问题。

这是一个肾结石手术疗法的 A/B 测试结果:
在这里插入图片描述
看上去无论是对于大型结石还是小型结石,A 疗法都比 B 疗法的疗效好。但是总计而言,似乎 B 疗法比 A 疗法要好。

这个 AB 测试的结论是有巨大问题的,无论是从细分结果看,还是从总计结果看,都无法真正判断哪个疗法好。

那么,问题出在哪里呢?这个 AB 测试的两个实验组的病历选取有问题,都不具有足够的代表性。参与试验的医生人为的制造了两个试验组本身不相似,因为医生似乎觉得病情较重的患者更适合A疗法,病情较轻的患者更适合 B 疗法,所以下意识的在随机分配患者的时候,让 A 组里面大结石病历要多,而 B 组里面小结石病历要多。

更重要的问题是,很有可能影响患者康复率的最重要因素并不是疗法的选择,而是病情的轻重!换句话说,A 疗法之所以看上去不如 B 疗法,主要是因为 A 组病人里重病患者多,并不是因为 A 组病人采用 A 疗法。

所以,这一组不成功的 AB 测试,问题出在试验流量分割的不科学,主要是因为流量分割忽略了一个重要的 “ 隐藏因素 ”,也就是病情轻重。正确的试验实施方案里,两组试验患者里,重病患者的比例应该保持一致。
因为很多人容易忽略辛普森悖论,以至于有人可以专门利用这个方法来投机取巧。举个例子,比赛 100 场球赛以总胜率评价好坏。取巧的人专找高手挑战 20 场而胜 1 场,另外 80 场找平手挑战而胜 40 场,结果胜率 41 %;认真的人则专挑高手挑战 80 场而胜 8 场,而剩下 20 场平手打个全胜,结果胜率为 28 %,比 41 % 小很多。但仔细观察挑战对象,后者明显更有实力。

从这几个辛普森悖论的例子出发,联想到我们互联网产品运营的实践里,一个非常常见的误判例子是这样的:拿 1% 用户跑了一个试验,发现试验版本购买率比对照版本高,就说试验版本更好,我们要发布试验版本。

其实,可能只是我们的试验组里圈中了一些爱购买的用户而已。最后发布试验版本,反而可能降低用户体验,甚至可能造成用户留存和营收数额的下降。
那么,如何才能在 AB 测试的设计,实施,以及分析的时候,规避辛普森悖论造成的各种大坑呢?

最重要的一点是,要得到科学可信的 AB 测试试验结果,就必须合理的进行正确的流量分割,保证试验组和对照组里的用户特征是一致的,并且都具有代表性,可以代表总体用户特征。

在这里,特别要提出一下这个问题的一个特殊属性:在流量试验越大时,辛普森悖论发生的条件越有可能触发。这是一个和大数定理以及中心极限定理等 “ 常规 ” 实践经验完全不同的统计学现象。换句话说,大流量试验比小流量试验可以消除很多噪音和不确定性,但是反而可能受到辛普森悖论的影响。

举个例子说明:如果只是拿 100 人做试验,50 人一组随机分配,很可能是 28 男 22 女对 22 男 28 女,每个性别只是相差 6 个人而已。如果是拿 10000 人做试验,5000 人一组随机分配,很可能是 2590 男 2410 女,对 2410 男 2590女,每个性别就差了 180 人,而这 180 人造成的误差影响就可能很大。

除了流量分配的科学性,我们还要注意 AB 测试的试验设计与实施。
在试验设计上,如果我们觉得某两个变量对试验结果都有影响,那我们就应该把这两个变量放在同一层进行互斥试验,不要让一个变量的试验动态影响另一个变量的检验。如果我们觉得一个试验可能会对新老客户产生完全不同的影响,那么就应该对新客户和老客户分别展开定向试验,观察结论。

在试验实施上,对试验结果我们要积极的进行多维度的细分分析,除了总体对比,也看一看对细分受众群体的试验结果,不要以偏盖全,也不要以全盖偏。

一个试验版本提升了总体活跃度,但是可能降低了年轻用户的活跃度,那么这个试验版本是不是更好呢?一个试验版本提升总营收 0.1 %,似乎不起眼,但是可能上海地区的年轻女性 iPhone 用户的购买率提升了 20 %,这个试验经验就很有价值了。

分层试验,交叉试验,定向试验是我们规避辛普森悖论的有力工具。

规避辛普森悖论,还要注意流量动态调整变化的时候新旧试验参与者的数据问题,试验组和对照组用户数量的差异问题,以及其他各种问题。
时至今日,这个问题依然是科学研究的一个活跃话题。

不考虑试验结果的统计有效性
直接使用简单的采样统计量(例如,转化率的平均值)作为试验的结论。我们要关注试验的显著性水平(p-value),统计功效,置信度和置信区间,这几个统计量可以判断试验结果的有效性。第四节会对这几个统计量进行介绍。

频繁调整流量
有些试验者比较着急,每天都去观察数据,发生数据有一些波动,或者由于自己想法发生变化,就会去调整流量,并且调整流量的方向不唯一(从小到大和从大到小混合在一起)。
这样会带来一个问题:一个用户可能短时间进入不同版本。
这会导致我们无法确定这个用户的行为是由哪个版本带来的效果,这就是最终试验的数据不准确,没有参考价值。
有些第三方试验平台会提供人工智能分流的功能,也就是根据实时的数据效果来调整流量,目的是达到流量利用效率的最大化。
有些用户不理解这种智能分流可能带来的后果,盲目使用,结果导致试验的数据完全是不可用的。
当然,如果我们能够确定一个用户只会到达试验页面一次,那么这种频繁调整流量或者使用人工智能分流的做法是 OK 的,因为这种只来一次的用户是无法进入多个试验版本的。

盲目分层
A/B 测试平台一般会提供分层试验的功能。分层实验的好处是,可以让不同层的实验都能拿全部流量来做试验。所以,有试验者做试验的时候,不假思索就进行分层试验,但是往往忽略了这一点:做分层的 2 个试验,是需要需要保证 2 个试验所改动的变量相互独立,相互不影响,这样 2 个试验的数据结果才都是可信的,否则有可能给出错误的数据,作出错误的决策。
科学高效易用的 A/B 测试平台是什么样的
那么下面介绍一下,科学高效易用的 A/B 测试平台应该具备什么特征。这些特征是结合我们对 A/B 测试的理论上的深入理解,以及服务了几千个客户的基础上提出的。

科学性
因为 A/B 测试是一种科学试验,因此科学性是最重要、最基础的部分,一旦失去了科学性,这个平台就没有了存在的价值。科学性有很多方面,下面主要从分流和数据统计2部分展开介绍。

分流的科学性
前面介绍 A/B 测试容易遇到坑,提到辛普森悖论,也提到了如何从分流上避免辛普森悖论:保证试验组和对照组里的用户特征是一致的,并且都具有代表性,可以代表总体用户特征。
那么如何做到这一点呢?
实践中一般通过收集用户设备、系统、浏览器设置、网络信息来获得用户的一些基本特征:操作系统名称及版本、浏览器名称及版本、语言设置、国家地区设置、通过 IP 得到的地理位置信息等,通过把这些信息加入到分流的函数中,可以实现不同流量组的用户特征的一致性。这些数据通常是可以拿到而且不妨碍用户的隐私的。
另外还可以让用户补充更多的信息,把这些信息上传到 A/B 测试平台上,以便更好识别用户的属性,更好对用户进行科学的流量分割。

数据统计的科学性

显著性水平 (p-value)
显著性水平 p 是指在原假设为真的条件下,样本数据拒绝原假设这样一个事件发生的概率。例如,我们根据某次假设检验的样本数据计算得出显著性水平 p = 0.04;这个值意味着如果原假设为真,我们通过抽样得到这样一个样本数据的可能性只有 4 %。
那么,0.04 这个概率或者说显著性水平到底是大还是小,够还是不够用来拒绝原假设呢?这就需要把 p 值和事先设定的显著性标准 α 来比较确定。假设检验的决策规则:
显著性水平 p 是指在原假设为真的条件下,样本数据拒绝原假设这样一个事件发生的概率。例如,我们根据某次假设检验的样本数据计算得出显著性水平 p = 0.04;这个值意味着如果原假设为真,我们通过抽样得到这样一个样本数据的可能性只有 4 %。
那么,0.04 这个概率或者说显著性水平到底是大还是小,够还是不够用来拒绝原假设呢?这就需要把 p 值和事先设定的显著性标准 α 来比较确定。假设检验的决策规则:

				 1. 若 p ≤ α,那么拒绝原假设;
				 2.若 p > α,那么不能拒绝原假设。

在这里插入图片描述

统计功效
在假设检验中,统计功效是指当备择假设为真时正确地拒绝原假设的概率。换言之,统计功效就是当备择假设为真的时候将其接受的概率。
影响统计功效的因素有以下3点:
显著性标准 注意我们前面提到的假设检验的决策规则:
• 若 p ≤ α,那么拒绝原假设;
• 若 p > α,那么不能拒绝原假设。
如果一个试验算出来的p值固定的情况下,α 越大,越容易拒绝原假设而接受备择假设。因此,备择假设为真时,α 越大,拒绝原假设的概率就越大,统计功效越大。也就是统计功效和 α 正相关。
测试版本相对对照版本的效应值
一般来说,效应值是量化现象强度的一个数量值。在我们这里,现象强度指的是测试版本在目标指标上相对对照版本提升了多少,因此这个提升比例就是效应值。
样本数量
样本数量越大,试验内在的采样误差便越小,统计功效便越大。反之亦然。

置信区间
置信区间(Confidence interval)就是用来对一个概率样本的总体参数的进行区间估计的样本均值范围。置信区间展现了这个均值范围包含总体参数的概率,这个概率称为置信水平。
置信水平代表了估计的可靠度,一般来说,我们使用 95 % 的置信水平来进行区间估计。简单地讲,置信区间就是我们想要找到的这么一个均值区间范围,此区间有 95 % 的可能性包含真实的总体均值

易用性
让试验者专注于提出创新的改进方案,而不用在如何接入试验平台、如何做数据分析、如何和研发工程师交互、争取研发工程师支持上花太多时间,可以提高试验者的创新效率,也是试验平台的重要职责。
下面介绍可以通过哪些方面提高试验平台的易用性。

简单易用的 SDK
提供简单易用的 SDK 给客户,可以减少客户接入平台所要花费的时间。因为进行试验的场景有可能在 iOS、Android、H5、小程序等不同平台上,所以需要有不同平台的 SDK。对每个平台的接入需要做到符合该平台的开发者习惯。
例如,Android 的开发者喜欢 Gradle 引入SDK,那么我们就提供 Gradle 引入的方式。同时,接入 SDK 所必须调用的接口尽量少,减少接入成本。对于高阶的开发者,提供功能丰富的可选接口,以满足不同的需求。

所见即所得的可视化编辑器
很多试验者需要进行页面设计上的改版,而这些改版往往不是推倒重来式改版,而是在原先的版本上做的一些优化,并且频率比较高。如果总是去让开发人员做这种简单的优化,人力成本、沟通成本都会很高。
因此,试验平台提供一个所见即所得的可视化编辑器,让试验者可以方便地按照自己的意图进行改版优化工作,是非常有必要的。当然,进行这样的编辑器开发对试验平台的开发团队来说,会遇到很多技术挑战。编辑后的页面可能发生闪烁、图片的适配问题等,需要有一定的技术实力才能很好解决这些问题。

其他
试验控制平台做到简单易用,除了在产品设计上下功夫,还需要注意做好试验引导功能,帮助试验者流畅创建试验、接入试验、运行试验,以及做好后续的数据分析和决策工作。
另外,提供一个准确易读的试验平台操作手册也是必要的。试验运行前的调试功能是一个必备的基础功能,可以避免上线以后再发现问题的尴尬。另外,受众定向、白名单功能、账户管理等功能也是比较常用的A/B测试平台功能,需要在平台设计中考虑进去。

欢迎各位大佬小白加群群里面有很多资料你想要的我都有:656721740

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈A/B测试 ,看这一篇就足够了 的相关文章

  • Redis系列2-单节点安装

    一 下载压缩包 链接 https pan baidu com s 1IvXq xxZI3YckPHxXFwH9w 提取码 hghj 二 打开master主节点 先拍快照 1 配置阿里云yum源 下载配置文件 wget O etc yum r
  • 【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

    目录 一 类和对象的历史由来 二 面向过程和面向对象的初步认识 三 类 1 引子 2 类的定义 3 类的访问限定符及封装 访问限定符 访问限定符解释说明 struct 与 class 的区别 1 默认访问级别 2 继承权限 默认的继承方式
  • wildfly 配置 pinpoint

    wildfly版本10 pinpoint版本1 8 4 set JAVA OPTS JAVA OPTS Djboss modules system pkgs org jboss logmanager com navercorp pinpoi
  • debian和archlinux下使用fcitx5-rime中州韵输入法之双拼及美化

    1 安装fcitx5和fcitx5 rime 中州韵输入法 apt install fcitx5 fcitx5 rime 2 启用fcitx5 debian用im config im config archlinux用 nano xprof
  • 使用反射技术实现的导入Excel文件到数据库的公共方法

    还是干脆 利索直接上代码最实惠 1 定义接口类IImportService public interface IImportService
  • R语言—随机抽样

    文章目录 专题 随机抽样 简单随机抽样 sample函数 srswor函数 srswr函数 分层抽样 专题 随机抽样 简单随机抽样 从总体中抽取样本的方法很多 最常用的方法是简单随机抽样 简单随机抽样 从容量为N的总体中 任意抽取n个单位作
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • pyqt5按钮点击时传递参数(通过lambda表达式)

    pyqt5中按钮点击事件的响应 常见的是下面的方式 self btn clicked connet self click method 现在想在按钮click的时候能够传递参数 可以借助lambda表达式 self btn clicked
  • 数字IC手撕代码---百题斩

    前言 本篇导览目录 用来索引笔者写的其他手撕代码文章 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手
  • 线性代数的本质(六)——线性空间

    文章目录 线性空间 线性空间 子空间 坐标与同构 线性变换与矩阵 基变换与坐标变换 线性空间 线性空间 Grant 普适的代价是抽象 仔细分析就会发现 关于向量空间的一切概念及有关定理都不依赖于向量的具体表现形式 有序数组 也不依赖于向量加
  • 17、SysTick—系统定时器

    17 SysTick 系统定时器 文章目录 17 SysTick 系统定时器 1 SysTick简介 2 SysTick寄存器介绍 3 SysTick 定时实验 3 1 硬件设计 3 2 软件设计 本章参考资料 Cortex M3 内核编程
  • 【硬件电子】基础知识点学习记录

    眼图 USB信号质量判断通过下面哪个参数来判断 A 眼图 B 电压 C 信噪比 D 失真度 解析 眼图测试主要是用来检测高速串行传输的信号质量 本题选A 眼图 是由于示波器的余辉作用 将扫描所得的每一个码元波形重叠在一起 从而形成眼图 眼图
  • numa节点间CPU利用率不均衡 - wakeup affinity

    最近遇到服务器numa节点间cpu利用率不均衡 清除sched domain的flags中的AFFINE WAKEUPS标志位是一个优化方法 但是如果直接将AFFINE WAKEUPS关闭 将无法充分利用L2 L3 cache缓存命中带来的
  • JMeter软件的安装(超详细教程)

    JMeter软件的安装 超详细教程 1 jdk的安装 1 1jdk的环境变量配置 2 JMeter的安装 1 1JMeter的环境变量配置 3 JMeter的运行 第一个问题 为什么下载JMeter要先下载jdk 因为JMeter是Apac
  • 数据库还原-bak文件

    数据库还原 我知道有俩种方式 一种方式是直接在数据库上操作 一种是在数据库里用代码还原 第一种方法 1 数据库上右击 选择还原文件和文件组 2 选择目标数据库 选择bak文件 确定即可还原数据库 一般情况下这样就可以还原数据库了 但有时会报
  • nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的

    源码安装nginx报错 找不到gcc 但是实际上gcc是存在的 如下 configure checking for OS Linux 3 10 0 957 el7 x86 64 x86 64 checking for C compiler
  • GJB1188A校验C语言算法

    GJB1188A校验和算法 先将2个字节数据拼接为一个字 16字节 然后循环右移 之后模2算法合成 按位异或 就是 运算符 最后再反向移位 循环右移 消息队列中第一个字不移位 第二个右移1位 第三个右移2位 按位异或 相同为0 不同为1 消
  • rk3399 Android9.0 ota升级失败

    rk3399 Android9 0 ota升级失败 问题 在rk3399 Android9 0 项目中需要 ota 功能 user版本编译完ota升级包后 在同版本整包升级时遇到如下问题 抓到的logcat内容如下 1044 2343 D
  • 数据安全风险分析及应对策略研究

    报告从理论与实践层面对当前企业面临的内外部数据安全风险进行分析与研究 完成了以下几方面的探索 一是梳理了当前数据安全面临的突出问题 二是提出了数据安全体系建设的行动思路和关键举措 三是提出了数据安全建设发展建议 关注公众号 互联互通社区 回
  • angular自动化测试--protractor

    前戏 面向模型编程 测试驱动开发 先保障交互逻辑 再调整细节 by 雪狼 为什么要自动化测试 1 提高产出质量 2 减少重构时的痛 反正我最近重构多了 痛苦经历多了 3 便于新人接手 angular自动化测试主要分 端到端测试和单元测试 很

随机推荐

  • 专访戴文渊:第四范式(现在)是一家怎样的公司?

    李根 发自 凹非寺 量子位 报道 公众号 QbitAI 第四范式创始人及CEO戴文渊 第四范式是一家备受关注的公司 仅创始团队成员来看 哪一个不是计算机 机器学习领域响当当的名字 戴文渊是ACM2005全球冠军 百度机器学习系统带队打造者
  • RecyclerView中item布局的"match_parent"属性失效--LayoutInflate的深入了解

    用recyclerview 给item布局使用了match parent属性 运行后不起作用 查了下 是在onCreateViewHolder中加载布局时候出了问题 一开始用的View Inflate方法 查看源码后 发现View infl
  • Java学生个人信息录入

    编写 Java 程序显示学生的个人信息 定义类Student 该类中应该有三个私有属性 姓名 name 年龄 age 性别 sex 输入 第一行为一个数 表示录入学生个数 第二行依次为学生姓名 年龄 性别 最后一行输入一个学生的姓名 输出
  • 【selenium】python+selenium+unittest,关于每次执行完一个测试用例都关闭浏览器等时间较长的问题之解决方案...

    我一直在思考第一个博客应该写什么 然后我就解决了开通博客后解决的第一个问题 择题不如撞题 如果大多数人和我一样 接触python selenium unittest是从selenium IDE开始的话 你也一定会遇到这样的问题 我们写了5个
  • 论文阅读_大模型_ToolLLM

    英文名称 ToolLLM Facilitating Large Language Models to Master 16000 Real world APIs 中文名称 TOOLLLM 帮助大语言模型掌握16000多个真实世界的API 文章
  • telnet出现Connection closed by foreign host

    2018 10 26 执行命令 telnet smtp exmail qq com 465 出现信息 root pengman Desktop telnet 10 223 30 128 7027 Tring 10 223 30 128 70
  • 50 道 Java 基础编程练习题

    https gold xitu io post 58a4276f61ff4b006c899609
  • CMake 入门实战(精)

    http www hahack com codes cmake 从实例入手 讲解 CMake 的常见用法 Contents 什么是 CMake 入门案例 单个源文件 多个源文件 自定义编译选项 安装和测试 支持 gdb 添加环境检查 添加版
  • Java/JDK 21正式发布!15个特性一览

    订阅专栏 JDK 21已经于2023年9月19日正式发布 本文总结了JDK 21发布的新特性 发布版本说明 根据发布的规划 这次发布的 JDK 21 将是一个长期支持版 LTS 版 LTS 版每 2 年发布一个 上一次长期支持版是 21 年
  • s24服务器维护时长,服务器维护:艾锑人告诉您Mbps和mb/s换算知识

    影响我们一生百倍差距的四大效应 观察者效应 你的世界是什么样是由你的观察决定的 这个效应是在 潜能突破 研习营课堂上发现的 我们有个练习叫三生万物 每个人都会成为一次观察者角色 当大家在成为其他角色时 他们总是发现不了自己的问题 无论我们怎
  • 7.opencv——边缘检测( 拉普拉斯(Laplacian),Sobel,Canny边缘检测)

    边缘检测 边缘检测 拉普拉斯 Laplacian 边缘检测 Sobel边缘检测 Canny边缘检测 拉普拉斯 Laplacian Sobel Canny对比 边缘检测 qquad 各类图像中 由于不同物体对电磁波的反射特性不同 在物体与背景
  • Windows中使用GCC介绍

    Windows中使用GCC介绍 GCC介绍 GCC是由许多组件组成的 GCC原名为GNU C语言编译器 GNU C Compiler 只能处理C语言 但其很快扩展 变得可处理C 后来又扩展为能够支持更多编程语言 如Fortran Pasca
  • display:inline-block元素之间空隙的产生原因和解决办法

    display inline block是一种布局方法 它相比于与浮动 定位最大的不同就是其没有父元素的匿名包裹特性 这使得display inline block属性的使用非常自由 可与文字 图片混排 可内嵌block属性元素 可以置身于
  • h2事务与mysql_mysql、h2插入性能对比

    2013 01 05 更新 导致循环调用save插入慢的问题是我循环调用了service方法 而不是在service内部循环 而事物是在service级别 所以相当于每次插入都提交事物 所以慢了 同样是插入 差别咋就这大呢 操作系统 wub
  • 【WPF动画】实现从鼠标点击中心开始的波纹扩散特效

    效果图 实现原理 Storyboard组合动画实现 核心代码 1 获取点击区域 确定扩散圆形辐射范围等属性 var ellipse new Ellipse Width 10 Height 10 Fill Brushes LightBlue
  • ASP.NET的优点

    ASP NET 是一个统一的 Web 开发平台 它提供开发人员创建企业级 Web 应用程序所需的服务 尽管 ASP NET 的语法基本上与 ASP 兼容 但是它还提供了一个新的编程模型和基础结构以提高应用程序的安全性 缩放性和稳定性 通过逐
  • Qt信号与槽原理

    Qt信号与槽原理 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s 1iqagt4SEC8PUYx6t3ku39
  • vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动

    最终做出来的效果是这样的 最近做项目时 遇到这样的需求 1 toolTip上的数据根据后台动态渲染 2 鼠标移入地图涟漪点时显示tootTip 点击toolTip上的文字 携带动态数据id进行路由跳转 3 鼠标移入地图涟漪点 与涟漪点相关的
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 文章目录 1 Linux系统的使用经验 2 Linux各目录的作用 3 服务器注意事项 1 Linux系统的使用经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 包括硬件 Linux
  • 浅谈A/B测试 ,看这一篇就足够了

    随着流量红利的逐渐消失 越来越多的公司开始重视数据驱动 试验驱动的精细化运营思想 并积极进行实践 有些公司在考虑采购第三方试验平台 有些公司考虑自建试验平台 我们和这样的公司都有深入的接触 发现很多公司对试验平台应该是什么样的 有什么样的坑