搭建自动化 Web 页面性能检测系统 —— 设计篇

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。

本文作者:琉易 liuxianyu.cn

页面性能对于用户体验、用户留存有着重要影响,当页面加载时间过长时,往往会伴随着一部分用户的流失,也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素,也是一个网站口碑的重要评判标准。

一、名称解释

前端监控一般分为合成监控和真实用户监控。

1.1、合成监控

合成监控就是模拟用户的使用场景,访问一个页面,通过一些工具和规则去检测页面,提取一些性能指标,生成一份检测报告,注重检测。

合成监控的优缺点:

优点 缺点
实现简单,社区方案成熟 配置复杂,不能完全还原用户真实场景
能采集到更丰富的数据 登录等场景需要单独处理
不影响真实用户的页面访问性能 单次检测数据不够准确

1.2、真实用户监控

file

真实用户监控是指用户在页面上访问,访问时会产生各类性能数据,在用户访问停止的时候,将这些性能数据传输到服务端,进行数据整理分析的过程,注重监控。

真实用户监控的优缺点:

优点 缺点
完全还原用户真实场景 对用户的访问性能有一定影响
登录等场景无需单独解决 无法采集完整的资源加载瀑布图
数据样本足够大且真实,数据价值高 无法可视化展示页面加载过程

1.3、定义合适的性能指标

  1. 首次内容渲染时长(First Contentful Paint, FCP)
    页面最新出现的内容渲染时长
  2. 首次展现平均值(Speed Index, SI)
    页面内容可见填充的速度
  3. 最大内容绘制时间(Largest Contentful Paint, LCP)
    页面核心内容呈现时间,不采用 loading 状态的数据
  4. 可交互时间(Time to Interactive, TTI)
    用户是否会体验到卡顿
  5. 总阻塞时间(Total Blocking Time, TBT)
    主线程被阻塞的时间,无法作出输入响应
  6. 累计布局样式偏移(Cumulative Layout Shift, CLS)

file

二、为什么做

基于需要对公司的 Web 产品进行性能优化,在做性能优化的同时,优化的衡量标准也不可或缺。在页面开发时观察页面的性能并不够准确,因为不同的开发设备性能表现不同,所伴随的变量也较多,不能够准确的反映性能优化效果,也无法观察产品的性能变化趋势。为什么自研呢,自研有以下好处:

(1)借助第三方的性能检测服务往往不能保证检测数据的安全性。

(2)第三方的性能检测服务一般无法与公司内部系统打通流程,一般无法自动化检测公司内部产品。

(3)可以做一些自定义开发,比如根据产品特点调整不同的性能指标权重,从而更准确的计算分数。

那么在检测收集到了这么多的指标数据后,页面性能到底如何呢,如果你的老板问你公司的产品页面性能如何,你该如何回复呢?假设列举一大堆时间指标、偏移量等数据,老板看到这些数值的时候可能就是一头雾水,根本理解不了产品的页面性能到底如何。那么自研可以针对产品类型,给出一个统一的标准,这样就方便去对比各个产品的性能表现了。

三、怎么做

3.1、基础依赖

下面是检测系统的整体架构:

file

这里设计的性能检测系统主要包含前端页面和服务端,其中:

前端页面展示性能检测入口、检测结果、性能趋势、性能排行榜等。

服务端基于 Nestjs + Lighthouse + Puppeteer 实现,通过 Typeorm 操作 MySQL 数据库,记录和查询性能检测数据。

另外辅助一些插件进行定时监测、结果通知等操作,实现自动化检测,相比页面开发时通过开发者工具中的 Lighthouse 检测有以下好处:

(1)不用开发者主动触发;

(2)不会阻塞开发过程,无需等待;

Lighthouse 用于检测 Web 网页的性能,主要基于 4 个主要步骤实现,分别是交互驱动、性能数据收集、审计整理以及记录。具体为:

(1)用户在性能检测入口输入待检测的页面地址,点击开始检测,页面通过接口调用性能检测服务

(2)Lighthouse 遍历当前页面的收集器方法并合成一个总的收集器方法以便于采集数据

(3)对上述采集到的性能数据进行计算和评分

Lighthouse 主要提供六个收集器,通过以下六个收集器即可采集到和实际访问接近的性能数据,每个收集器的功能不一,如下:

(1)收集 DOM 元素相关数据、DOM 节点最大深度、滚动条等

(2)收集页面内的所有图片资源,并记录下每个图片元素的宽高和定位等属性

(3)收集相关指标,如:FCP、LCP、CLS 等

(4)收集 JS 事件监听数量、JS 堆栈等

(5)收集页面的所有请求,包括状态码、请求头、响应头、请求方式等

(6)收集 window.performance 下的性能数据,用于计算加载时间

Puppeteer 是 Chrome 团队提供的一个无界面 Chrome 工具,俗称无头浏览器,通过提供的 API 可以控制 Node 端的 Chrome 工具进行指定的操作。在这里设计的性能检测系统中,由于 Lighthouse 进行检测时打开的类似于无痕窗口,没有登录信息,所以 Puppeteer 主要帮助我们实现模拟登录。

当检测页面需要登录时,分析出页面属于哪个 devops 实例,然后通过 Puppeteer 跳转到对应的登录页面,然后输入用户名、密码、验证码,待登录完成后跳转至正确的页面,再进行页面性能检测。如果登录后还在登录页,表示登录失败,则获取错误提示并抛出。

以下是检测系统的一个流程图:

file

3.2、关键代码

// 开始检测
async run(urlDto: UrlDto): Promise<object> {
    const start = new Date().getTime();
    try {
        const { url, loginUrl } = urlDto;
        const needLogin = url.includes('devops') || loginUrl;
        console.log(`本次检测${needLogin ? '' : '不'}需要登录`, url);

        const runResult = needLogin
            ? await this.withLogin(urlDto)
            : await this.withOutLogin(url);

        // 保存检测结果文件,便于预览
        const urlStr = url.replace(/http(s?):\/\//g, '').replace(/\//g, '');
        fs.writeFileSync(`./static/${urlStr}-report.html`, runResult?.report);

        // 性能数据
        const performance = runResult?.lhr?.categories?.performance || {};
        const data = {
            ...performance,
            auditRefs: performance?.auditRefs?.filter((item) => item.weight),
        };
        // console.log(data);
        console.log(`本次耗时:${((new Date().getTime() - start) / 1000).toFixed(2)}s`);

        return {
            code: 200,
            data,
            message: `耗时:${((new Date().getTime() - start) / 1000).toFixed(2)}s`,
        };
    } catch (error) {
        return {
            code: 401,
            message: error,
        };
    }
}

3.3、检测规则

系统除了支持手动输入网页地址检测,也支持自动检测。为了便于统计每个子产品的真实表现,每天凌晨自动检测 10 次,去掉最高分,去掉最低分,从其余分数中选择中位数作为每天的检测评分。

性能检测时的数据采集可能因为网页服务的不稳定性,导致有偏大或偏小的数据,所以提供某个时间段某个指标的直方图来分析数据的基本特征。也会提供某个产品的整体分数趋势,便于统计某个时间段内该产品的性能变化,也可以提现性能优化前后的效果。

file

四、写在后面

这篇文章简单介绍了下该性能检测系统的初步设计、一些页面性能的概念以及采用的技术点,后续请关注《搭建自动化 Web 页面性能检测系统 —— 实践篇》。


最后

欢迎关注【袋鼠云数栈UED团队】~
袋鼠云数栈UED团队持续为广大开发者分享技术成果,相继参与开源了欢迎star

  • 大数据分布式任务调度系统——Taier
  • 轻量级的 Web IDE UI 框架——Molecule
  • 针对大数据领域的 SQL Parser 项目——dt-sql-parser
  • 袋鼠云数栈前端团队代码评审工程实践文档——code-review-practices
  • 一个速度更快、配置更灵活、使用更简单的模块打包器——ko
本文转载于网络 如有侵权请联系删除

相关文章

  • xss-labs详解(上)1-10

    1.Level12.Level22.1.htmlspecialchars3.Level33.0.1.JavaScript伪协议4.Level45.Level56.Level67.Level78.Level88.0.1.strtolower9.Level910.Level10Level1源码<!DOCTYPEhtml><!--STATUSOK--><html> <head> <metahttp-equiv="content-type"content="text/html;charset=utf-8"> <script> window.alert=function() { confirm("完成的不错!"); window.location.href="level2.php?keyword=test"; } </script> <title>欢迎来到level1</title> </head>

  • Android Studio 4.1 中的本地内存分析

    本文是AndroidStudio4.1中Profiler有哪些新增特性的第二部分。之前的文章侧重于介绍AndroidStudio中SystemTrace的新增功能。我们从大家的反馈了解到使用C++调试本地内存非常困难,尤其在开发游戏的时候。在AndroidStudio4.1中,MemoryProfiler(内存分析器)可以记录本地内存分配的调用栈。本地内存记录基于Perfetto后端实现,它是Android的新一代性能工具和问题追溯解决方案。在调试内存问题的时候,通常的做法是搞清楚什么在占用内存,什么在释放内存。本文接下来会带着大家一起使用NativeMemoryProfiler来发现内存泄漏,并且使用GPU模拟压力测试(GpuEmulationStressTest)作为示例工程。准备工作首先,我们从github.com/google/gpu-…克隆或者下载源码。当我们发现可疑的内存泄漏时,最好的做法是从更高的层次开始并且观察系统内存的图形。您只需要在AndroidStudio中点击profile按钮,然后打开内存分析器,里面会显示更加详细的内存追踪信息。内存分析器的顶层视图,从显示中

  • Flink CEP学习线路指导1:Flink CEP入门

    问题导读 1.FlinkCEP是什么? 2.FlinkCEP可以做哪些事情? 3.FlinkCEP和流式处理有什么区别? 4.FlinkCEP实现方式有哪些? FlinkCEP在Flink里面还是比较难以理解的。有的老铁甚至以为和Flink流式处理是差不多的。其实FlinkCEP跟流式处理确实有相似的地方。但是FlinkCEP处理的是流式数据,但是却并不是流式处理(datastream)。后面给大家详细讲解。 FlinkCEP有的大家甚至不知道CEP是什么?CEP在Flink未产生以前,已经有CEP,并不是有了Flink才有CEP,我们这里重点是讲FlinkCEP。CEP本身的含义是复杂事件处理。那么它为什么可以处理复杂事件,这就跟它的原理有关系了。所以我们需要了解NFA,NFA是什么?它的含义是非确定有限自动状态机。我们明确它的概念是什么就可以了。后面同样也会给大家补充。 由于官网只讲了CEP的基础部分,因此我们需要给大家补充原理部分,基础(组成)部分,以及编程方面的内容。 也就是我们按照下面线路来学习: 1.首先认识FlinkCEP 2.FlinkCEP原理机制 3.F

  • 蓝桥杯JAVA Fibonacci数列

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/luo4105/article/details/46383343比较基础的一道题,可用循环或者递归,以下是我以前用的三种方式写的1.循环//数组复制<prename="code"class="java">publicstaticintFibonacciByCycle1(intindexNum){ int[]Fibonacci=newint[indexNum]; if(indexNum<=2){ return1; } else{ Fibonacci[0]=1; Fibonacci[1]=1; for(inti=2;i<indexNum;i++){ Fibonacci[i]=(Fibonacci[i-1]+Fibonacci[i-2])%10007; } returnFibonacci[indexNum-1]; }

  • Wpbullet:针对WordPress的静态代码分析工具

    今天给大家介绍的是一款名叫Wpbullet的工具,广大安全研究人员可以使用这款工具来对WordPress、插件、主题以及其他PHP项目进行静态代码分析。工具安装大家可以直接从Wpbullet的GitHub代码库中将项目克隆至本地,然后安装工具的依赖组件,并运行工具脚本:$gitclonehttps://github.com/webarx-security/wpbulletwpbullet $cdwpbullet $pipinstall-rrequirements.txt $pythonwpbullet.py复制工具使用下面给出的是所有可用的操作选项:—path(必需项)系统路径或下载URL地址使用样例:—path=”/path/to/plugin” —path=”https://wordpress.org/plugins/example-plugin“ —path=”https://downloads.wordpress.org/plugin/example-plugin.1.5.zip“复制—enabled(可选项)检测给定的模块使用样例:—enabled=”SQLInjection

  • 特斯拉指控小鹏汽车工程师,离职前盗取Autopilot30万份机密文件

    大数据文摘编辑部出品又有自动驾驶泄密的商业指控,又是小鹏汽车。今日凌晨,据最早爆出这一消息的海外媒体Verge称,特斯拉已经在本周三对一名华裔前雇员发起诉讼,指控他为国内电动车品牌小鹏汽车窃取了机密资料。同时曝光的另一个诉讼中,还对自驾车创业公司Zoox提起了两起诉讼,指控其涉嫌盗用公司的商业机密。这名华裔员工的名为曹光志,本硕皆毕业于浙江大学,此前供职于苹果公司负责iPhone摄像头的研发,后来负责特斯拉的车载摄像头。同时,他也是特斯拉Autopilot团队的一员,是40名拥有自动驾驶源代码访问权的员工之一。在该员工的领英页面上,目前的职位显示为“小鹏汽车的感知负责人”,并且正在积极招工。特斯拉在起诉中表示,这名员工从去年开始就将”特斯拉自动驾驶仪相关源代码的完整副本“上传到他的iCloud账户。特斯拉称他上传了超过30万个与Autopilot相关的文件和目录。事件经过 从多家媒体报道中和起诉书中,我们大概可以还原事情的经过。去年1月3日曹光志突然申请辞职,之后便去了小鹏汽车。在去年年底接受了小鹏汽车的工作后,特斯拉表示该员工从他的工作电脑上删除了12万个文件并断开了他的个人iCl

  • 斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

    来源:Github转载自:新智元,未经允许不得二次转载作为全球计算机四大名校之一,斯坦福大学的CS230《深度学习》课程一直受到全球计算机学子和从业人员的热烈欢迎。 CS230授课人为全球著名计算机科学家吴恩达和他的助教KianKatanforoosh。 日前,MIT的AfshineAmidi和斯坦福大学的ShervineAmidi在博客上整理了一份CS230课程知识点的归纳总结,在Reddit上引发热议。评论网友纷纷表示喜大普奔,对于没有条件上课或者没赶上授课时间的人来说,看看这份总结贴也能获益颇丰。这份总结提要基本遵循CS230的授课思路和流程,分三大方面由浅入深地介绍了深度学习的基本概念、网络模型、研究和实验操作方法等。三部分内容分别为:卷积神经网络、递归神经网络、提示与技巧。 本文主要介绍这份总结的第一部分,即CNN部分的内容,后两部分RNN、窍门与技巧部分,读者可自行参看Github上放出的资源:卷积神经网络(CNN)https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-convolutional-neural-n

  • 是什么影响了数据库索引选型?

    上一篇文章我们介绍了索引背后的数据结构,这篇文章我们来介绍影响索引数据结构选型的因素——存储器存取。主存存取原理主存的构成主存储器(简称主存或内存)包括存取体、各种逻辑部件及控制电路等。存储体由许多存储单元组成,每个存储单元又包含若干个存储元件,每个存储元件能寄存一位二进制代码“0”或“1”。这样,一个存储单元可以存储一串二进制代码,这串二进制代码称为存储字,这串二进制代码的位数称为存储字长,可以是8位、16位或者32位等。主存与CPU的联系画外音:MAR(MemoryAddressRegister)是存储器地址寄存器,用来存放欲访问的存储单元的地址,其位数对应存储单元的个数(若MAR为10位,则有210=1024个存储单元,记为1k)。MDR(MemoryDataRegister)是存储器数据寄存器,用于存放从存储体某单元取出的代码或准备往某存储单元存入的代码,其位数与存储字长相等。现代计算机一般将MAR和MDR集成在CPU芯片中。主存的存取过程 如果把存储体看做是一栋大楼,那么每个存储单元可以看成这栋大楼里的每个房间,每个存储元可以看做房间里的一张床位,床位有人相当于“1”,无人相

  • 罗永浩·干货日志 第1篇|想创业,可你真的合适吗?

    订阅了罗永浩在得到上的干货日志,今天是第一期。主要讲的是你是否适合创业?听(看)完以后,心情久久不能平静。不适合创业的六条理由(怕麻烦、没长性、抗压能力差、犹豫不决、不想受委屈、想平衡家庭工作的人),我占到两条。适合创业的两条理由,我也具备。人生就是一个无法兼顾的妥协。渴望有更多的时间陪老婆孩子,渴望赚大钱。现实情况却无法让我可以长性忍受低薪去创业,也无法做到不陪伴家人去全心投入创业。感谢老罗的干货日志,我会每期都认真去听。我在简书上分享他的文章内容,不确定是否有版权问题,建议大家想听的可以去得到上购买。以下为原文:欢迎来到我的干货日记,你好,我是罗永浩!离开讲台这么多年以后,我这次重新回来讲课,我们姑且叫它讲课吧,感觉非常高兴。虽然网络授课的形式使得我们不能面对面,有点遗憾,但是因为技术进步,我们几万人同时上课也成为了可能,这个想想还是挺让人兴奋的。而且随着课程进行,随着我们的文字、问答、互动一点一点搞起来,以及适合这个平台的某些手段和方法玩儿熟了之后,相信我们能在这个新的形式下,稍加适应调整后,能够实现在教室里上课一样的效果,甚至借助某些技术手段,还有可能实现更好的效果。如果有必要

  • HDU 1250 Hat's Fibonacci

    Hat'sFibonacciTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others) TotalSubmission(s):11104    AcceptedSubmission(s):3732 ProblemDescriptionAFibonaccisequenceiscalculatedbyaddingtheprevioustwomembersthesequence,withthefirsttwomembersbeingboth1. F(1)=1,F(2)=1,F(3)=1,F(4)=1,F(n>4)=F(n-1)+F(n-2)+F(n-3)+F(n-4) Yourtaskistotakeanumberasinput,andprintthatFibonaccinumber.InputEachlinewillcontainanintegers.Processtoendoffile.OutputForeachcase,outputtheresultinaline.Sampl

  • Java学到什么程序可以去面试以及面试范围

    Java学到什么程度可以去找工作及面试流程1简历简历里面需要包含的内容应该是个人信息、比如:学历,工作年限、邮箱、姓名、目前状态(是否离职),专业技能(分条说明、或者自己的博客、相关公众号等),项目经验。简历不需要太长,如果是2年左右,3页即可,最少3个项目。里面应该重点写你使用过的一些框架,自己做的一些项目,以及自己的收获,简练第一。一般面试官不会有很多的耐心,看你的项目详细描述,所以尽量简洁明了即可。2简历投递投递的方式有几种,大家也都知道。一般在一些招聘网站投递即可,比如智联、BOSS直聘、拉勾、51等等。另外就是朋友、熟人、企业内推,比较靠谱,还有就是猎头,通过猎头也可很快找到对口的企业。3面试面试一般都是电话面试(尽量远离避免)、视频面试、现场面试、招聘会等。如果聊得high,一般程序猿职业,不拘于形式。面试流程都差不太多,先是和人事聊聊,价值观,人生观,消费观,有对象吗?住哪啊?加班怎么看?公司第一印象如何?为什么离职?职业规划?基本就这些,然后进入第一轮面试,技术面试(一般第一个技术面试官是公司的中级或者高级工程师),首先自我介绍,重点介绍一下自己的一些工作经历,以及自己

  • 熟悉Android Studio界面,开始装逼卖萌

    通过前两期的学习,我们可以正确搭建好AndroidStudio的开发环境,也创建了HelloWorld工程并成功运行,那么本期就带你一起来了解这款强大的IDE开发工具吧。一、AndroidStudio主页面板重新打开AndroidStudio会进入如下主页面,与第一次打开有略微差别。从上图可以看到,一共有四大区域,接下来分别简单介绍: 区域1为最近新建或打开的AndroidStudio工程列表,便于快速进入对应项目。首次使用时该区域为空,列表内容也可以进行删除操作。区域2为AndroidStudio的版本信息,表示AndroidStudio的该版本为2.3.3,是目前最新稳定版。区域3为项目操作区域,主要有四大操作: 1)StartanewAndroidStudioproject:新建一个AndroidStudio项目。2)OpenanexistingAndroidStudioproject:打开一个已存在的AndroidStudio项目。3)CheckoutprojectfromVersionControl:从版本控制系统中检出一个项目。4)Importproject(Eclipse

  • 腾讯云消息队列CKafka创建数据同步任务ckafkaCNAPI2017

    1.接口描述接口请求域名:ckafka.api.qcloud.com本接口(AddConnector)用于创建数据同步任务。 2.输入参数以下请求参数列表仅列出了接口请求参数,其它参数见公共请求参数页面。 参数名称 必选 类型 描述 zoneId 否 String 可用区ID。 description 是 String connector描述。 connectorClass 是 String 执行该任务的class名称,不同种类的同步connector有不同的名称,当前消息队列Ckafka不同实例之间的同步为com.tencent.ckafka.replicator.K2KSourceConnector。当前仅支持com.tencent.ckafka.replicator.K2KSourceConnector。 config 是 JSONString 具体实例参见下节配置说明。 name 否 String connector名称。 3.配置说明3.1基础配置 配置项 必选 类型 配置说明 src.broker 否 String 源Kafkabr

  • Linux Rocky9 安装 mysql8

    安装MySQL8.0 使用yum包管理器安装MySQL yuminstall-ymysql-server复制 开启启动 安装完成后,运行以下命令来启动MySQL服务并使它在启动时自动启动: systemctlenablemysqld--now复制 要检查MySQL服务器是否正在运行,请输入: systemctlstatusmysqld复制 添加密码及安全设置 运行mysql_secure_installation脚本,该脚本执行一些与安全性相关的操作并设置MySQL根密码: mysql_secure_installation复制 步骤如下: 要求你配置VALIDATEPASSWORDcomponent(验证密码组件):输入y,回车进入该配置 选择密码验证策略等级,我这里选择0(low),回车 输入新密码两次 确认是否继续使用提供的密码?输入y,回车 移除匿名用户?输入y,回车 不允许root远程登陆?我这里需要远程登陆,所以输入n,回车 移除test数据库?输入y,回车 重新载入权限表?输入y,回车 配置远程登陆 如果需要设置root账户远程登陆,上一步骤中,不允许r

  • 图扑案例合集丨用赛博朋克语言诠释数字孪生

    前言 霓虹之下的机械义肢,孤独黑客的代码觉醒,隐匿于雨夜的反叛灵魂…这些具有独一无二锐利感的画面,让“赛博朋克”这个起源自80年代的文化命题已经从小众文化火出圈,渗透至主流社会跃升为审美时尚。 图扑软件也同样在践行这种赛博朋克美学。并通过自主研发的HTforWeb产品,数字孪生智能工厂、智慧城市、智慧航空、智慧电力、智慧园区、智慧楼宇等,将工业互联网的赛博语言娓娓道来。   智慧城市 赛博朋克风格的颜色一般以粉色、青色、蓝色以及绿色为主,并通过高饱和冷暖色的强烈对比,给人强烈的审美感受。图扑软件在智慧城市3D可视化场景中加入赛博朋克的元素,将朋克色彩融入可视化大屏,虚拟现实等未来科技的视觉元素,带来不一样的视觉冲击感。 赛博朋克炫酷霓虹城市 设计师充分利用图扑软件的辅助优势,并以“HIGHTOPO”为设计对象,设计生成3D赛博朋克城市夜景。Demo选用暗黑、紫红、荧光蓝等颜色碰撞,描绘出极具未来感的个人理想城市。 案例会重点突出基础设施信息化、运营管理精细化、功能服务便利等方面。在触屏设备上可进行单指旋转、双指缩放、三指平移操作查看,无需为跨平台的不同模式而担忧。 &nbs

  • 缺陷的背后(三)---mysql之sql_mode为空的陷阱

    导语mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式。sql_mode会影响mysql支持的sql语法,并且会执行数据验证检查,那不同的mysql_mode是如何影响支持的sql语法和数据类型检验的呢?本文将给大家系统总结分析说明这个问题,以及在sql_mode为空的时候,测试需要注意的测试点。复制   目录 一、经典的“测试缺陷” 二、ServerSQLModes介绍 2.1sql_mode概念 2.2七种常见的sql_mode ONLY_FULL_GROUP_BY ANSI_QUOTES PIPES_AS_CONCAT NO_AUTO_CREATE_USER NO_ZERO_DATE NO_ZERO_IN_DATE STRICT_TRANS_TABLES 2.3三个重要且常用的sql_mode模式 ANSI STRICT_TRANS_TABLES TRADITIONA 三、测试策略 3.1小结:宽松,严格模式下常见sql实例影响和结果对比 3.2宽松模式下测试应该注意哪些地方?复制

  • 1-编程的基本条件和起步

    本篇博客对应视频讲解 前言   从零开始学编程系列,正式开启,本系列文章及视频会充分讨论学习编程相关的内容,但不会涉及任何具体的技术细节。希望大家都通本系列教程,能够对编程有一个更直观的认知,然后根据自身的条件去决定是否要开始编程之旅!   相信很多人听过一万小时定律,意思是想要在某个方面达到专家级别的水平,坚持不懈的进行针对性训练是必要条件。   从零开始学编程系列,是通过大量观察及结合我个人的学习经验,把最实用的内容分享给大家,目的就是为了大大缩短达到某一高度的时间。而本篇文章主要讲解一下学习编程的基本条件以及从何起步。 基本条件   智力正常:大脑功能没有障碍。  无沟通障碍:能够正常与他人沟通。正常表达和理解。   学习编程并没有什么必要的前置条件。任何正常人都可以去学习。  风险是学了之后可能慢慢变的不那么正常! 优势条件 虽然说学习编程并没有必要的前置条件,但有一些能力是可以让你学起来更加快速的。最常听到的问题是,学习编程需要数学和英语很好么?答案是不需要。但是如果你数学和英语能力强,那么是一个很大的优势。它在一定程序上决定了你的学习理解速度,以及达到的高度。所以根据个人目

  • 关于知识图谱的知识体系架构 | 更新

      ----写这篇文章的目的在于构建属于自己的知识体系,当看到新的业务需求,能大体做出其架构流程和快速的解决办法。 知识图谱除了自身的领域知识,也和NLP有交叉性,同时和统计学习、神经网络有关联。技能核心如下: 图谱的领域分支如下,以及对应的任务和工具: 图上不全,下面是XMIND的文件原件地址,欢迎fork和提出错误之处。 链接:https://pan.baidu.com/s/1iDZ5MJIT_azova1Z07c3-g提取码:06f5 参考文件: 《工业级知识图谱 方法与实践》 张伟 陈华钧 张亦驰 著 《知识图谱方法、实践与应用》王昊奋 编著  

  • Asp.Net MVC 身份验证-Forms

    Asp.NetMVC身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面。那么如果实现登录? Form登录 应用程序确认用户状态 HTTP协议是无状态的。所以上一次请求和下一次请求并不能相互关联起来,就是说这些请求并不能确定是哪个用户和用户的状态。但是对于登录来说,我们就需要准确的知道用户的状态及是哪个用户。 通常有两种情况来记录用户状态。 一种在服务端通过Session来标识。 一种通过Cookie在客户端标识用户。(用户每次请求应用程序时都会携带该Cookie。) Form登录实现 Forms身份验证将身份验证标记保留在Cookie或页的URL中。Forms身份验证通过FormsAuthenticationModule类参与到ASP.NET页面的生命周期中。可以通过FormsAuthentication类访问Forms身份验证信息和功能。 步骤一 在Web.Config配置文件中指定验证的方式为Form,并设置跳转的登录地址和Cookie的名称,及

  • (转)Too many open files

    【摘要】Toomanyopenfiles有四种可能:一单个进程打开文件句柄数过多,二操作系统打开的文件句柄数过多,三systemd对该进程进行了限制,四inotify达到上限. 一单个进程打开文件句柄数过多 ulimit中的nofile表示单进程可以打开的最大文件句柄数,可以通过ulimit-a查看,子进程默认继承父进程的限制(注意,是继承,不是共享,子进程和父进程打开的文件句柄数是单独算的)。 网上还有一种解读是nofile表示单用户可以打开的文件句柄数,因为他们在limit.conf中看到类似于“openstacksoftnofile65536”,便认为是openstack用户最多可以打开的文件句柄数。该解读是错误的,“openstacksoftnofile65536”表示的含义是当你执行"su-openstack"切换到openstack用户后,你创建的所有进程最大可以打开的文件句柄数是65536。 要查看一个进程可以打开的文件句柄数,可以通过“cat/proc//limits”查看。 要修改ulimit中的nofile,可以通过修改/etc/security/limits.co

  • luoguP2709 小B的询问 [莫队]

    题目描述 小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。 输入输出格式 输入格式: 第一行,三个整数N、M、K。 第二行,N个整数,表示小B的序列。 接下来的M行,每行两个整数L、R。 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案。 输入输出样例 输入样例#1: 643 132113 14 26 35 56复制 输出样例#1: 6 9 5 2复制 说明 对于全部的数据,1<=N、M、K<=50000   考虑使用莫队算法 由于k较小,考虑用一个数组cnt[],cnt[i]表示i这个数字在询问的区间[l,r]中出现的次数 接下来是区间的转移了! 对于新增加的元素x,ans=ans-(cnt[x]-1)*(cnt[x]-1)+cnt[x]*cnt[x] 去掉元素x同理。

相关推荐

推荐阅读