从指标到洞察力的普罗米修斯

简介

为什么需要普罗米修斯?

普罗米修斯官网的首页简单的对普罗米修斯做了定义:从指标到洞察力 ,普罗米修斯通过领先的开源监控解决方案为用户的指标和告警提供强大的支持。

可以看到普罗米修斯是领先的、开源的、也是一种监控解决方案、支持用户指标和告警等需求。使用普罗米修斯可以有效的解决在云原生时代下的指标埋点,服务异常监控等需求,比如:

  • 借助时序数据库来存储海量多维度指标数据 ,使用PromQL数据查询,聚合分析指标数据或者Grafana这样的图形化页面展示指标数据。
  • 传统监控的异常监控 需求,也就是监控那些我们知道某个地方可能会出现问题但是又不知道何时会出现问题(Know-Unknow)的地方。
  • 云原生时代服务快速的重启发布,自动弹性扩缩容,面对海量容器POD频繁变化,每次地址发生了变化修改配置肯定是不现实的,普罗米修斯通过及时感知的服务发现模型 来解决云原生时代大规模服务发现问题。

当然作为云原生优秀的监控系统,并不仅仅可以解决这里罗列的问题,普罗米修斯生态庞大,在云原生时代为可观测性的指标埋点提供了足够的铺垫。后续通过一些可观测性技术深度串联分析链路和日志数据通过故障预测,根因分析可以有效的解决我们不知道会出现问题的地方和不知道何时会出现问题的地方(Unknow-Unknow)。普罗米修斯不仅仅可以洞察主机层的指标信息,也可以深度通过系统指标埋点深度洞察系统内部的健康状态,那具体怎么做呢?可以继续往下看。

起源

普罗米修斯是由SoundCloud开发的开源监控告警系统,是Google BorgMon监控系统的开源版本。2016年,由Google发起的Linux基金会旗下的原生云基金会CNCF(Cloud Native Computing Foundation)将Prometheus纳入其第二大开源项目(第一大开源项目是kunernetes)。

2012年开源的普罗米修斯监控系统从开源到现在经过了数十年的打磨具备哪些特性呢?从官方文档参考到的内容如下所示:

可以看到普罗米修斯在多维度指标监控告警等方面拥有强大的支持,下面就进入正题,从普罗米修斯的架构到入门案例来看下如何使用普罗米修斯进行服务指标监控。

架构

下面就直接来看下Prometheus 的架构及其一些生态系统组件:

这个图完整的体现了普罗米修斯从发现服务,采集数据,到监控告警分析数据的整个过程:

image.png

初步了解了普罗米修斯的一些概念,想要优雅的使用普罗米修斯监控还需要我们了解一些常见术语,下面可以看下。

常见术语

下面列举一些我们常用的术语说明:

  • Meters(指标)

用外行的话来说,指标是数字测量。时间序列意味着随着时间的推移记录变化。用户想要测量的内容因应用程序而异。对于 Web 服务器,它可能是请求时间,对于数据库,它可能是活动连接数或活动查询数等。

  • Collector(收集器)

收集器是代表一组指标的导出器的一部分。如果它是直接检测的一部分,则它可能是单个指标;如果它是从另一个系统提取指标,则它可能是多个指标。

  • Endpoint(端点)

可以抓取的指标来源,通常对应于单个进程。

  • Exporter(导出器)

导出器是与您要从中获取指标的应用程序一起运行的二进制文件。导出器公开 普罗米修斯 指标,通常是将以非 普罗米修斯 格式公开的指标转换为 普罗米修斯 支持的格式。

  • PromQL(普罗米修斯查询语言)

PromQL是普罗米修斯查询语言。它允许进行广泛的操作,包括聚合、切片和切块、预测和连接。

  • Pushgateway(推送网关)

Pushgateway保留来自批处理作业的最新指标推送。这允许 普罗米修斯 在它们终止后抓取它们的指标(实时性较高可以先缓存在推送网关中后续由普罗米修斯拉取。

  • Sample(样本)

样本是时间序列中某个时间点的单个值。在 普罗米修斯 中,每个样本都包含一个 float64 值和一个毫秒精度的时间戳。

  • The Four Golden Signals(四大黄金信号)
    image20230115183536075.png

Google SRE中提到的概念,监控的四个黄金信号是延迟、流量、错误和饱和度。如果您只能衡量面向用户的系统的四个指标,请关注这四个指标。原文链接如下

https://sre.google/sre-book/monitoring-distributed-systems/

  • Black-Box Versus White-Box(黑盒与白盒)

  • Metric names and labels(指标名称和标签)
  • 指标名称: 指定了被测系统的一般特征(例如http_requests_total- 接收到的 HTTP 请求总数
  • 标签: 启用 Prometheus 的维度数据模型:相同指标名称的任何给定标签组合标识该指标的特定维度 实例(例如:所有使用处理程序方法POST的HTTP 请求/api/tracks)。查询语言允许基于这些维度进行过滤和聚合。更改任何标签值,包括添加或删除标签,都将创建一个新的时间序列。
  • METRIC TYPES(指标类型)
    image20230115184057358.png

Prometheus 客户端库提供四种核心指标类型,用来解决不同指标差异区分,帮助用户理解和区分这些不同监控指标之间的差异,Prometheus 定义了 4 种不同的指标类型:Counter(计数器)Gauge(仪表盘)Histogram(直方图)Summary(摘要)

这里常见术语列举的相对还是比较多的,不过慢慢消化,下面就开始通过一个简单的案例来入门普罗米修斯的使用来实现对普罗米修斯自身的一些指标的暴漏与抓取。

入门示例

普罗米修的安装

这里演示环境为Centos7系统

下载

登录服务器后,直接输入如下命令,从官方仓库下载压缩文件到本地,并解压。

[root@iZ8lgm9icspkthZ ~] wget https://github.com/prometheus/prometheus/releases/download/v2.41.0/prometheus-2.41.0.linux-amd64.tar.gz

[root@iZ8lgm9icspkthZ ~] tar -zxvf ./prometheus-2.41.0.linux-amd64.tar.gz 

配置

打开prometheus.yml配置文件,可以看到配置文件里面默认文件如下所示:

# my global config 全局配置(如果有内部单独设定,会覆盖这个参数)
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 默认15s 全局每次数据收集的间隔
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).  规则扫描时间间隔是15秒,

# Alertmanager configuration  告警插件定义。这里会设定alertmanager这个报警插件。
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.  告警规则。 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现。
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.  采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现
  - job_name: "prometheus"  #任务目标名,可以理解成分组,每个分组包含具体的target组员。

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

启动服务

指定配置文件,同时后台运行服务

./prometheus --config.file=prometheus.yml &

启动服务成功后可以看到如下info日志,普罗米修斯启动后监听了一个9090端口。

image20230115160933693.png

访问Dashboard

浏览器打开地址 http://当前服务器IP:9090 即可,可以看到如下可视化页面:

image20230115161304856.png

在菜单栏中找到服务发现地址如下:

image20230115161356691.png

指标查询

指标解析

指标查询这里提供两种方式,一种是直接在服务器上访问地址如下命令:

curl http://localhost:9090/metrics

查询后会得到普罗米修斯提供的指标类型,如下图:

image20230115162004831.png

可以看到这个图中存在一个指标名称为promhttp_metric_handler_requests_total的指标,#HELP中的内容为当前指标的描述,#TYPE中的内容是描述当前指标的类型,指标的详细格式为给定一个指标名称和一组标签,时间序列通常使用这种表示法来识别:

<metric name>{<label name>=<label value>, ...}

关于指标的命名:前缀通常是指标类型名称,后缀必须有一个单位,更详细的指标命名规范可以参考如下链接:

https://prometheus.io/docs/practices/naming/

PromQL查询

让监控的数据会说话。日常数据查询、可视化及告警配置这三大功能模块都是依赖PromQL实现的,PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化以及rule 告警中都会使用到它。

这里我们介绍一些简单的语法。首先来看下表达式语言数据类型。

在 Prometheus 的表达式语言中,表达式或子表达式可以计算为四种类型之一:

image20230115184520607.png

PromQL 查询结果主要有 3 种类型:

  • 瞬时数据 (Instant vector):
    • 包含一组时序,每个时序只有一个点,例如:http_requests_total http_requests_total{}
  • 区间数据 (Range vector):
    • 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]
  • 纯量数据 (Scalar):
    • 纯量只有一个数字,没有时序,例如:count(http_requests_total)

了解了基本语法之后可以重新打开dashboard输入以下命令来查询筛选标签中状态码为200的请求数据:

promhttp_metric_handler_requests_total{code="200"} 查询结果如下图所示:

第一个图为表格展示列表数据

image20230115163635316.png

第二个图以图表形式展示

image20230115163703836.png

总结

完善的监控系统能够引导技术人员快速定位问题并解决,让监控告警先于用户发现问题的最佳手段,Prometheus是基于指标的监控系统,是打造一站式通用监控架构的最佳方案之一,借助普罗米修斯监控系统可以尝试在开发之初就想好要需要为业务埋下哪些监控埋点,当然也有人提出指标驱动开发(MDD)的开发理念,通过实时指标来驱动快速、精确和细粒度的软件迭代, 帮助我们更早地 发现问题明确目标

当然普罗米修斯也不是万能的,使用时也需要注意很多的注意事项,比如:

  • 如果Pushgateway从许多不同的来源收集指标时宕机,用户将失去对所有这些来源的监控,可能会触发许多不必要的告警。
  • Alertmanager是独立于Prometheus的一个告警组件,需要单独安装部署,Prometheus可以将多个Alertmanager配置为一个集群,通过服务发现动态发现告警集群中节点的上下,如下图:
    image20230115165102377.png
  • 另外存储方面普罗米修斯并不是为了解决大容量存储问题,TB级以上数据建议保存到远端TSDB中,通常来说,InfluxDB在集群方面的表现更佳,但是InfluxDB的单机版本免费,而集群版本是收费的。
  • 作为时序数据库普罗米修斯不仅仅对系统时间的准确性要求很高,必须保证本机时间实时同步。另外还需要注意监控的高可用搭建,如果监控挂了一切系统将成为黑盒,即便系统处理问题也无法及时发现,这里可以通过Prometheus中有3种常见的HA架构来保证高可用,分别是简单HA、基本HA+远程存储、基本HA+远程存储+联邦集等方式 配置。

感兴趣可以订阅微信公众号 《中间件源码》 交流吧。

本文转载于网络 如有侵权请联系删除

相关文章

  • 输入输出代码演示

    需要用到的常用vim命令删除命令dd删除当前行 dj删除上一行 dk删除下一行复制拷贝和粘贴yy拷贝当前行 shift+p在当前行前粘贴复制退出命令:wq保存并退出 ZZ保存并退出 :q!强制退出并忽略所有更改 :e!放弃所有修改,并打开原来文件。复制intmain(){ intn; charstr[100]={0}; intarr[4]={0}; sprintf(str,"%d.%d.%d.%d",192,168,0,1); printf("str=%s\n",str); sscanf(str,"%d.%d.%d.%d",&arr[0],&arr[1],&arr[2],&arr[3]); for(inti=0;i<4;i++){ printf("%d\n",arr[i]); } FILE*fp=fopen("./output","a+"); fprintf(fp,"str=%s\n",str); f

  • centos7部署二进制mysql-5.6

    一.环境声明[mysql-Server]主机名=host-1系统=centos-7.3地址=1.1.1.1软件=mysql-5.6.393306使用二进制包部署会下载比较大,大约500M左右,而源码包就几十M。但使用二进制包不用编译,部署较快,相比于yum可以自定义目录,方便维护。二.程序部署1.安装依赖 yum-yinstallautoconflibaiobisonncurses-devel2.创建用户 groupaddmysql useradd-gmysql-s/sbin/nologinmysql3.清理centos7默认自带数据库 yum-yremovemariadbmariadb-server4.下载MySQL wgethttps://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz5.安装 tar-xfmysql-5.6.39-linux-glibc2.12-x86_64.tar.gzmvmysql-5.6.39-linux-glibc2.12-x86_64/usr

  • Leetcode No.45 跳跃游戏 II

    一、题目描述给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入:[2,3,1,1,4] 输出:2 解释:跳到最后一个位置的最小跳跃数是2。 从下标为0跳到下标为1的位置,跳1步,然后跳3步到达数组的最后一个位置。 说明:假设你总是可以到达数组的最后一个位置。二、解题思路我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。例如,对于数组[2,3,1,2,4,2,3],初始位置是下标0,从下标0出发,最远可到达下标2。下标0可到达的位置中,下标1的值是3,从下标1出发可以达到更远的位置,因此第一步到达下标1。从下标1出发,最远可到达下标4。下标1可到达的位置中,下标4的值是4,从下标4出发可以达到更远的位置,因此第二步到达下标4。在具体的实现中,我们维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加1。在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等

  • Android开发高级组件之自动完成文本框(AutoCompleteTextView)用法示例【附源码下载】

    本文实例讲述了Android开发高级组件之自动完成文本框(AutoCompleteTextView)用法。分享给大家供大家参考,具体如下:通常来说自动完成文本框(AutoCompleteTextView)从EditText派生而出,实际上他也是一个编辑框,但他比普通的编辑框多了一个功能:当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户从中选择,当用户选择了某个菜单项过后,AutoCompleteTextView就会按用户选择自动填写该文本框。自动完成文本框(AutoCompleteTextView),用于实现允许用户输入一定字符后,显示一个下拉菜单,供用户从中选择,当用户选择某个选项之后,按用户选择自动填写该文本框。语法格式:<AutoCompleteTextView 属性列表 </AutoCompleteTextView复制AutoCompleteTextView组件继承EditText,所以它支持EditText组件提供的属性,同时,该组件还有以下属性:属性功能android:completionHint下拉列表下面的说明性文字android:comple

  • 磁盘综合计算题-计算机组成与结构

    磁盘综合计算题,通常会考察你如下几个问题: ①共有多少个柱面? ②每道存储多少字节? ③盘组总存储容量是多少? ④数据传输速率是多少? ⑤若读取xxx数据,计算所需时间?1.求柱面:首先来看,第一个问题:共有多少个柱面?记住下面公式:柱面=有效存储区域*道密度 补充一点的是,柱面数=道数,有多少柱面就有多少道。有效存储区域是有效半径,也就是用(外直径-内直径)除以2。2.求每道存储多少字节:每道信息量=内层位密度*内层磁道周长 补充: 其实用内层和外层计算的结果是一致的,关键看题给什么,要给外层位密度,就是外层位密度*外层磁道周长。 还有一点,注意单位换算。 3.求盘组总存储容量:总容量=每道信息量*道数*面数 道数=柱面数;面数注意保护面和定位面是不会存储数据的,所以得减去这俩面。 4.数据传输速率:数据传输速率=每条磁道容量*磁盘转速 每条磁道容量其实就是每道信息量。一定注意题中给你的单位,要是每秒(/s)的话,通常题干给你磁盘转速单位是rpm(转/每分钟),这时你就得换算每秒多少转,用60/磁盘转速 5.求若读取xxx数据,计算所需时间:总时间=平均寻道时间+平均等待时间+磁头读

  • 问题难度对基于神经控制器学习的形态学发展影响的实验(cs AI)

    自然人在学习并适应从婴儿到成年时所面临的环境时,会经历其身体的形态发展过程。实际上,这是最重要的学习过程,即支持成人学习的过程。然而,在人工系统中,很少考虑形态学发展与学习之间的这种相互作用及其可能的优势。在这一方面,本文旨在提供一些见解,说明如何利用形态学发展来促进在面临任务或领域难以学习的强化系统中的学习。特别是,在这里,我们将集中讨论在学习复杂任务时形态学发展是否真的可以提供任何优势,以及随着任务变得越来越困难,它与学习的相关性是否会增加。为此,我们介绍了形态学发展在学习走路中应用的一些初步实验的结果,这三种情况分别是四足动物,六足动物和八足动物。这些结果似乎证实,随着任务学习难度的增加,将形态学发展应用于学习变得更加有利。原文标题:SomeExperimentsontheinfluenceofProblemHardnessinMorphologicalDevelopmentbasedLearningofNeuralControllers原文作者:M.Naya-Varela(1),A.Faina(2),R.J.Duro(3)((1)UniversidadedaCoruna,(2)

  • Chrome浏览器安装CRX格式的插件

    以安装Chrome浏览器的插件ScratchJS为例: (1)下载ScratchJS插件 ScratchJS插件下载地址: http://www.chromestore.cn/wp-content/themes/bigchrome/down.php?id=502 或者 http://www.cnplugins.com/down/downcheck.aspx?fn=1902/scratch-js-0.0.23.crx%20&aid=160737 下载的ScratchJS插件是CRX格式。 ScratchJS插件源代码地址:https://github.com/richgilbank/Scratch-JS (2)在Chrome浏览器新打开一个TAB,在地址栏输入:chrome://extensions/,打开扩展程序管理器,可以看到之前安装的其他扩展程序,如下图。 (3)拖放ScratchJS插件的CRX文件到界面里,松开鼠标,会弹出安装提示,点击确定安装即可。 由于ScratchJS插件是支持ES6(ES2015)的Chrome插件,现在的Chrome浏览器已经支持到ES20

  • Unity开发单例模式防止内存泄漏

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/CJB_King/article/details/102784813问题描述Unity游戏开发中,有时在结束程序或切换场景时会报Someobjectswerenotcleanedupwhenclosingthe scene的错误。意思是,在退出场景时,部分obj没有被清理,引发了内存泄露 解决防范publicclassMonoSingleton<T>:MonoBehaviourwhereT:MonoBehaviour { privatestaticT_instance; privatestaticbool_applicationIsQuit=false; protectedMonoSingleton(){} publicstaticTinstance{ get { if(_instance==null&&!_applicationIsQuit) { _instance=Create(); } return_i

  • 如何把.csv文件导入到mysql中以及如何使用mysql 脚本中的load data快速导入

     1,其中csv文件就相当于excel中的另一种保存形式,其中在插入的时候是和数据库中的表相对应的,这里面的colunm就相当于数据库中的一列,对应csv表中的一列。2,在我的数据库表中分别创建了两列A,B属性为varchar。3,在这里面中,表使用无事务的myISAM和支持事务innodb都可以,但是MyISAM速度较快。4,String sql = "load data infile 'E://test.csv' replace into table demo fields terminated by ',' enclosed by '\\'' lines terminated by '\\r\\n'  (`A`,`B`) ";这句话是MySql的脚本在java中的使用,这个插入速度特别快,JDBC自动解析该段代码进行数据的读出,并且插入到数据库。要注意在loaddata中转义字符的使用。如果要使用loaddata直接进行执行一下这句话,(不过要记得更改成自己的文件名 和表

  • 聊聊storm的ICommitterTridentSpout

    序本文主要研究一下storm的ICommitterTridentSpoutICommitterTridentSpoutstorm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.javapublicinterfaceICommitterTridentSpout<X>extendsITridentSpout<X>{ publicinterfaceEmitterextendsITridentSpout.Emitter{ voidcommit(TransactionAttemptattempt); } @Override publicEmittergetEmitter(StringtxStateId,Mapconf,TopologyContextcontext); }复制ICommitterTridentSpout继承了ITridentSpout,主要是对getEmitter方法进行覆盖,返回扩展的Emitter,它继承ITridentSpout.Emitte

  • 什么是json?_string转json

    大家好,又见面了,我是你们的朋友全栈君。 1.什么是JSONJSON概念很简单,JSON是一种轻量级的数据格式,他基于javascript语法的子集,即数组和对象表示。由于使用的是javascript语法,因此JSON定义可以包含在javascript文件中,对其的访问无需通过基于XML的语言来额外解析。不过在使用JSON之前,很重要的一点是理解javascript中数组及对象字面量的特殊语法。1.1数组字面量数组字面量,是用一对方括号括起一组用逗号隔开的javascript值,例如:varaNames=[“hello”,12,true,null];1.2对象字面量对象字面量,是通过两个花括号来定义的。在花括号内可以放置任意数量的“名称-值”对,定义格式字符串值”。除了最后一行外,每个“名称-值”对后必须有一个逗号(这与Perl中的联合数组的定义有些类似)。例如:varoCar={“color”:“red”,“doors”:4,“paidFor”:true};1.3混合字面量我们可以混用对象和数组字面量,来创建一个对象数组,或一个包含数组的对象。例如:{comments:[ { id:

  • WPF调用C++生成的dll文件(示例)

    注:笔者使用的VS版本为2019。1.打开VS2019,选择文件->新建->项目  2、选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 3、添加C++代码源文件->添加->新建项->C++文件(.cpp)    C++代码如下 #include<iostream> usingnamespacestd; intAdd(inta,intb) { returna+b; } 复制 4、添加模块定义文件源文件->添加->新建项->模块定义文件(.def)添加代码如下 LIBRARYProject1.dll EXPORTS Add 复制 项目目录结构如下    5、生成dll文件1)设置生成文件类型  2)选择C++项目右键->生成,生成成功之后在Debug文件夹中获得Project1.dll文件  6、WPF调用C++生成dll类库文件 1)把Project1.dll文件复制到WPF项目目录\bin\De

  • 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题

    SQLSERVER的联机丛书的解释:“当 SET QUOTED_IDENTIFIER为ON时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER为OFF时,标识符不可加引号,且必须遵守所有Transact-SQL标识符规则。”先说说什么是标识符,举个例子,如果创建了一个叫做USER的数据库表,则直接用SQL语句“SELECT*FROMUSER”做查询时会报错:“在关键字'USER'附近有语法错误。”,也就是USER被视作SQLSERVER的关键字处理了,而不是被认为是一个表或视图。但如果修改为“SELECT*FROM[USER]”就没问题了。此处的方括号就是标识符。标识符的作用就是告诉数据库引擎,此处是一个数据库对象(比如是一个表、视图、存储过程等),而不是一个关键字。在SQLSERVER中,方括号是标识符,但不仅仅是方括号可以做标识符。在特定的情况下,双引号也可以做标识符,也就是前面的sql语句可以修改为“SELECT*FROM"USER"”,而这个特定的情况也就是SETQUOTED_IDENTIFI

  • POJ2976 题解 0/1分数规划入门题 二分

    题目链接:http://poj.org/problem?id=2976 关于0/1分数规划参见这篇博客 实现代码如下: #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> usingnamespacestd; constintmaxn=1010; constdoubleeps=1e-4; intn,k; doublea[maxn],b[maxn],c[maxn]; inlineboolcmp(doublea,doubleb){returna>b;} boolcheck(doublex){ for(inti=0;i<n;i++)c[i]=a[i]-x*b[i]; sort(c,c+n,cmp); doubletmp=0; for(inti=0;i<n-k;i++)tmp+=c[i]; returntmp>=0; } voidsolve(){ doubleL=0,R=1,res; while(R-L>eps){ doubl

  • 《探索需求》——阅读笔记二

    第二篇 开始之路 切入点 减缓切入阶段的进展,去调查需求,仔细思考需求,就想禅宗所说的要尽可能地保持一个“初学者的念头”。对于初学者而言,所有的事物都是平等的、新奇的、不可能的。 自由问题 遵循下列步骤: 1.信任与和谐的气氛一旦建立之后,就应该向他们解释你需要问一些非常笼统而透彻的问题。解释清楚这类问题的重要性,并且确信在此时你们已经在这个过程的价值上达成了共识。 2.有些人会难以理解这些笼统的问题有什么用处。必要的时候需要缓步推进。先问一个问题,然后彻底的研究这个问题,再向他解释这里所包含的信息对你的重要性。 找到正确的相关人员 1.相信在需求开发团队中必须有负责的包含使用者的策略,这样远比“任其自然”好。 2.集体讨论一个潜在使用者列表。 3.通过把他们分类成有好的、不友好的以及可忽略的三类来简化列表。 4.使用参与者的三维坐标,为每个你不想忽略的用户群制作一个对策。 5.执行你的参与计划,用你的想象力和机智区获得你所需要的全部的参与。 为每个人准备会议工作 1.位每个参与者常见一种安全的文化。 2.保持每个会议尽可能地小,但也不要过于小。 3.把每个会议限制在单个类型

  • 基于Pyecharts V1.x.x的数据可视化(一)

    基于Pyechartsv1.x的数据可视化 1、Pyecharts简介        Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,Pyecharts诞生了。       Pyecharts最早只适用于工程领域的可视化开发,但是随着其对Jupyternotebook、Jupyterlab等交互式开发工具的支持不断加强,现在也开始被许多数据分析师应用到数据探索中。 1.1、Pyecharts各个版本与Python的对应关系 pyecharts分为v0.5.x和v1.x两个大版本,v0.5.x和v1.x间不兼容,v1.x是一个全新的版本。 Pyecharts各版本与python的对应关系见下表 版本V0.5.xV1.x.x python版本选择 Python2.7,3.4+ Python3.6+ &nb

  • 新鲜出炉的阿里云云效平台初步测评

    一、介绍「阿里云云效」是企业级一站式DevOps平台,支持公共云、专有云和混合云多种部署形态,通过人工智能、自动化技术的应用提升开发者的研发效能,持续交付有效价值。「阿里云云效」将于2020年4月23起开放面向企业和个人开发者的公测,,果断抢先体验一番~ 二、测评1、进入云效平台,选择新建项目 2、选择项目模板,我这边选择的是Devops研发 3、对相关交付流程配置相应开发分组 4、完成创建   体验阿里云云效平台的「代码管理」功能,阿里云云效提供代码托管、代码评审、代码扫描、质量检测等功能,保护企业代码资产,实现安全、稳定、高效的研发生产。1、点击代码按钮 2、新建代码库   3、配置Https克隆代码 4、上传测试文件 5、提交成功 三、点评我认为以后云效平台会有比较大的发展,现在DevOps的应用越来越广泛,云效平台基于DevOps可以有效促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。,云效平台打开网页就可以使用,过程流程,页面简洁,使用起来十分便捷。与之前很多公司都使用的传统瀑布式开发模型相比,采用敏捷或迭代式开发

  • webpack入门之简单例子跑起来

    webpack介绍   Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载。 webpack和Grunt以及Gulp相比有什么特性 Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的解决方案,不过Webpack的优点使得Webpack可以替代Gulp/Grunt类的工具。 Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编译、组合、压缩等任务的具体步骤。 webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器可识别的JavaScript文件。 二者进行比较,Webpack的处理速度更快更直接,能打包更多不同类型的文件。 开始使用webpack Node.js是必备的工具,NPM的版本最好是3.x版本以上,NPM3.x提供了更有效的包依赖

  • 设计模式是什么?

    1.设计模式是什么?   设计模式是软件设计中常见问题的典型解决方案,它们是能够根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题。   设计模式与方法或库的使用方式不同,你很难直接在自己的程序中套用某个设计模式。模式并不是一段特定的代码,而是解决特定问题的一般性概念。你可以根据模式来实现符合自己程序所实际需要的解决方案   人们常常会混淆模式和算法,因为两者在概念上都是已知特定问题的典型解决方案。但算法总是明确定义达成特定目标所需的一系列步骤;而模式则是对解决方案的更高层次描述。同一模式在两个不同程序中的实现代码可能会不一样。   算法像是菜谱:提供达成目标的明确步骤   模式更像是蓝图:你可以看到最终的结果和模式的功能,但需要自己确定实现步骤   2.模式包含哪些内容?   大部分模式都有正规的描述方式,以便在不同情况下使用。模式的描述通常会包括以下部分:   意图部分:简单描述问题和解决方案   动机部分:进一步解释问题并说明模式会如何提供解决方案   结构部分:展示模式的每个部分和它们之间的关系   在不同语言中的实现:提供流行编程语言的代码,让读

  • SPSS-回归

    1、一元回归     一元线性回归分析、多元线性回归分析 【一元线性回归分析】 已经某变量取值,如果想要用它得到另一个变量的预测值 自变量或预测变量、因变量或标准变量 1.目的:根据某自变量取值得到因变量的预测值 2.所需数据: 因变量(连续变量)+自变量(连续变量、二分变量) 3.假设条件: a.观测值独立 b.两个变量服从正态分布:总体中每一变量的取值都要服从正态分布,而且对某一变量的任意取值,另一变量的取值也应服从正态分布 c.方差齐性:因变量的总体方差与自变量的方差相同的 4.方程: Y=a+bX Y表示因变量的预测值(不是真实值),a表示的y轴的截距,b表示回归方程的斜率,X表示自变量的取值 5.假设检验: 在原假设为真(b=0)的情况下,如果检验的结果不可能(p值小于等于0.05),则拒绝原假设,即回归系数不等于0;如果检验的结果有可能(p值大于0.05),则接受原假设,即回归系数为0复制   练习: 这是一家超市连续3年的销售数据,包括月份,季度,广告费用,客流量,销售额5个变量,共36条记录,这里根据广告费用来预测销售额,当广告费

  • CentOS 8 上安装和配置 nginx

    1、检查yum上的nginx版本 yuminfonginx 复制 2、安装nginx yuminstallnginx 复制 安装过程有时会询问是否安装,输入y回车即可 3、将服务设置为每次开机启动 sudosystemctlenablenginx 复制 4、启动nginx服务 sudosystemctlstartnginx 复制 5、查看nginx服务状态 sudosystemctlstatusnginx 复制 6、检查防火墙状态 firewall-cmd--state 复制 7、设置防火墙,添加80、443端口 sudofirewall-cmd--permanent--zone=public--add-service=http sudofirewall-cmd--permanent--zone=public--add-service=https 复制 8、重新加载防火墙配置 sudofirewall-cmd--reload 复制 9、验证nginx 在浏览器中输入nginx的访问地址,如出现nginx欢迎页时配置成功。

相关推荐

推荐阅读