HickWall 详解
优质博文:IT-BLOG-CN
一、监控分类
【1】Tracing
调用链:
【2】Logging
日志:
【3】Metrics
指标:在应用发布之后,会长时间存在的度量维度。某个接口的请求量、响应时间。
Metrics
数据模型
二、Metirc 接入
【1】pom.xml
中添加metric-client
依赖
<dependency><groupId>com.ctrip.flight.intl.common</groupId><artifactId>metric-client</artifactId><version>4.0.5</version>
</dependency>
【2】执行命令mvn -DskipTests=true compile
【3】编辑MetricClientExampleApplication.java
@SpringBootApplicationpublic class MetricClientExampleApplication {SpringApplication.run(MetricClientExampleApplication.class, args);
}@Bean
public CommandLineRunner commandLineRunner() {return args -> {TimeUnit time = TimeUnit.SECONDS;while (true) {Metric metric = Metric.create("hickwall_metric_client_example", "100016249", "SYS");ThreadLocalRandom random = ThreadLocalRandom.current();metric.withTag("caller", "Dante").withTag("bu", "SYS").recordOne("run_query", random.nextLong(100, 60000));metric.recordSize("run_times", random.nextLong(0, 100));metric.addGauge("run_changes", () -> random.nextLong(0, 100));time.sleep(120);}};
}
【4】Tomcat
应用
hickwall.prefix=数据库名.+自定义名字(用于区分不同开发组组、不同项目)推荐做法:数据库名.小组名.项目名eg: hickwall.prefix=FLT.backendservice.offline.screenpopup
三、埋点
【1】普通记录: 下面用一个例子来演示recordOne
和recordSize
的用法。假如有一个航班查询接口,它根据传入的参数,返回匹配的所有航班。接口定义如下:
public List<Flight> searchFlights(String dep, String arr, String date);
现在,我们关心这个接口的表现,具体为如下指标:
■ 这个接口每秒调用了多少次。
■ 这个接口每次调用花了多少时间。
■ 这个接口每次调用返回了多少条结果。
做法如下:
public List<Flight> searchFlights(String dep, String arr, String date){// 记录请求开始的时间long startTime = System.currentTimeMillis();// 实际的搜索航班List<Flight> flights = doSearchFlights(dep, arr, date);// 当前时间减去开始时间,计算得到搜索航班实际执行的时间long timeUsed = System.currentTimeMillis() - startTime;// 埋点记录这个方法被调用了一次,以及这次调用使用的时间Metrics.recordOne("flight.search", timeUsed);// 埋点记录这次调用返回的航班的条数。Metrics.recordSize("flight.search", flights.size());return flights;
}
recordOne
和recordSize
的区别:
■ recordOne
记录的值是qps
。场景:引擎每秒成功多少次。
■ recordSize
记录的值是平均值。场景:引擎每次返回的结果数量。
【2】下面演示addGauge
的用法:假如系统内部有一个缓存,缓存的key
的数量随着时间而改变。我们关心缓存的表现,指标如下:缓存的key
随着时间是如何变化的。针对这种需求,recordOne
和recordSize
可能就不够用了,这时需要用addGauge
。如下:
@Service
public class Test {Map cache = new HashMap();@PostConstructpublic void init() {Metrics.addGauge("cache", () -> cache.size());}
}
addGauge
方法要求传入一个Supplier
,这个Supplier
应该返回一个整数值。Metrics
会每分钟调用一次Supplier
,并把它返回的整数值发送给hickwall
。
如果在
3.2
中自己new
了一个Metric
,上面例子中的Metrics
要替换成new
出来的metric
对象。
四、使用 Tag
相同的指标名,可以记录不同的tag
。在hickwall
展示的时候,可以根据tag
来分别展示指标。
提示:自定义的
Tag
名称 如果DB
无法查询得到,目前是需要找Hickwall Support
手动添加。
tag
的使用如下:
Metrics.withTag("clientAppId", "100000").recordOne("metricName");
五、超高频调用
如果调用的频率非常高(1000+qps),recordOne
和recordSize
的性能可能会不够用。这种情况下,需要使用forRecordOne
和forRecordSize
来提高性能。
沿用4.1中的例子,代码要修改如下(注意第1/2行和第15/17行):
private MetricOne COUNT_METRIC = Metrics.forRecordOne("flight.search");
private MetricSize SIZE_METRIC = Metrics.forRecordSize("flight.search");public List<Flight> searchFlights(String dep, String arr, String date){// 记录请求开始的时间long startTime = System.currentTimeMillis();// 实际的搜索航班List<Flight> flights = doSearchFlights(dep, arr, date);// 当前时间减去开始时间,计算得到搜索航班实际执行的时间long timeUsed = System.currentTimeMillis() - startTime;// 埋点记录这个方法被调用了一次,以及这次调用使用的时间COUNT_METRIC.recordOne(timeUsed);// 埋点记录这次调用返回的航班的条数。SIZE_METRIC.recordSize(flights.size());return flights;
}
六、指标命名方式
前面第四节中,埋点使用的指标名并不是最终在hickwall
中存储的指标名。
hickwall
中存储的指标名规则如下:metricName=appPrefix.metricName.{count,time,size,value}
例如,假设appPrefix
为intlengine.common
记录方式 | 最终名称 |
---|---|
recordOne(“query”) | intlengine.common.query.count |
recordOne(“query”, time) | intlengine.common.query.count |
intlengine.common.query.time | |
recordSize(“queryResult”) | intlengine.common.queryResult.size |
addGauge(“resource”, ()-> resources.size()) | intlengine.common.resources.value |
七、检查写入情况
打开指标查询,选择数据源和搜索指标名称,我看主要看两部分"查询"和"生成看板到Grafana"。下图为查询相关信息
数据源名的层次结构
生成看板到Grafana:
【1】数据源和指标查询语句必填
【2】dashboard
选择必填
:
■ 添加到已有的dashboard
: 将当前的指标添加到已经存在的hickwall grafana dashboard
中。
■ 新建dashbaord
: 新建一个dashboard
,并将当前的指标添加到新建的这个dashbord
中。需要指定新的dashboard
名称,并且重名的dashboard
会新建失败。
【3】panel
配置必填
■ 新建panel
: 需要指定新的panel
的名称
■ 已有的panel
: 为已有的panel
添加当前的指标语句
【4】别名legendFormat
: 即这条线的名称,支持这种tag
匹配格式非必填
【5】预览: 可以查看当前指标生成的线以及panel
的json
配置。
效果图
八、尝试一下 PromQL
在Grafana
上创建一个看板,然后点击Add Query
,在这个看起来有点唬人的页面里把Queries to
改成APM-SYS
,然后在那个大大的输入框里写下生命、宇宙与一切的答案:
不管多复杂的promQL
表达式,返回值只有三种
1.瞬时向量,同一时间点的数据点
2.范围向量,同一个指标的一段时间范围内的数据点
3.数值,字面量,没有标签、时间戳
PromQL
的运算逻辑是这样的:浏览器会按照选取的时间范围和显示器的大小选取合适的间隔,例如显示的曲线是3min
一个数据点。后端会根据这个时间间隔分别计算每个时间段上的值,并赋予该时间段的起始时间戳。最后所有的段连接起来就是一条曲线。
九、看板
当我们使用PromQL
查出了需要的数据,就可以继续调整看板的其它配置。常用的有:
■ Legend
:图例。如果我们只希望显示数据中的caller
这个tag
的值,就可以在Legend
中填写 ‘’
■ Min step
:步长。如果希望图中每小时只显示一个点,就在这里填写1h
■ Visualization
:点击左侧第二个图标进入,这里可以修改的配置项很多,比如:
● Visualization
:可以从默认的 Graph 改成多种其它图表,每种图表的使用方式各异,请自行探索 / 查阅文档
● Axes -> Left Y -> Unit
:改变默认的数值单位
● Legend -> Values -> Total / Avg / Min / Max ...
■ General
:左侧第三个图标,在这里可以给Panel
取一个温暖的名字
■ Alert
:左侧第四个图标,进入我们接下来要做的:配置告警
配置告警之前,记得点击右上角的Save Dashboard
保存一下。
十、告警
点击Create Alert
来创建一个新的告警规则。安心,在我们保存整个Dashboard
之前,它都不会生效。
如果你看到很多大红的警示文字,不用担心,这只是审美问题。
首先,选择BU
、产品线、AppID
:
然后给告警命名,Evaluate every 表示每隔多久执行一次这条告警规则,For 则表示在持续多久满足(我们马上就会填的)告警条件之后才真正发出告警。
接下来随便填一个阈值:
当使用avg()
这个函数去算A
这个查询语句取5m
(也就是 5 分钟)内的数据的均值,要是它的结果IS ABOVE(大于) 1
,就满足告警条件了,告警级别P3
,而且不管现在几点都生效(Alert Time = All)。
对于一个已经保存过的
Dashboard
,填好以后我们就可以点右上角的Test Rule
来试试它能不能正常运行。
最后,万一告警触发了,该通知谁呢?
这里看到,我们可以选: 各种方式的任意组合
■ AppID
的管理员
■ 用户
■ 邮件组
■ Oncall
组
如果这样仍不能满足需求,还可以配置 自定义告警通知,来根据不同的告警级别进行配置,并选择Send to
(通知方式):
■ 邮件
■ 短信
■ TTS
语音
■ TripPal
相关文章:
HickWall 详解
优质博文:IT-BLOG-CN 一、监控分类 【1】Tracing调用链: 【2】Logging日志: 【3】Metrics指标:在应用发布之后,会长时间存在的度量维度。某个接口的请求量、响应时间。 Metrics数据模型 二、Metirc 接入 【1】pom…...
开源的跨平台SQL 编辑器Beekeeper Studio
一款开源的跨平台 SQL 编辑器,提供 SQL 语法高亮、自动补全、数据表内容筛选与过滤、连接 Web 数据库、存储历史查询记录等功能。该编辑器支持 SQLite、MySQL、MariaDB、Postgres 等主流数据库,并兼容 Windows、macOS、Linux 等桌面操作系统。 项目地址…...
Linux应用层学习——Day4(进程处理)
system #include<stdio.h> #include<stdlib.h>int main(int argc, char const *argv[]) {//使用标准库函数创建子进程//int system (const char *__command);//const char *__command:使用linux命令直接创建一个子进程//return:成功返回0 失败返回失败编号int sys…...
起别名typedef
#include<stdio.h> //typedef int myType1; //typedef char myType2; typedef struct { int a; int b; }po; int main() { /*myType1 a5; myType2 bo; printf("%d\n",a); printf("%c\n",b);*/ po p;//不需要加struct关键…...
【Linux内核】ashmem pin/unpin
前言 在 Linux 内核的 ASHMEM(Android Shared Memory)实现中,pin 和 unpin 操作主要用于管理共享内存的生命周期和可用性。这些操作有助于确保在内存使用期间,特定的共享内存区域不会被回收或释放。 Pin 操作 定义 Pin 操作用…...
【docker】docker网络六种网络模式
Docker 网络模式总结 网络模式描述使用场景bridge默认的网络模式,容器之间通过虚拟网桥通信,容器与宿主机隔离。单机部署、本地开发、小型项目host容器与宿主机共享网络堆栈,容器直接使用宿主机的 IP 地址。高性能网络应用、日志处理、大量与…...
永磁同步电机谐波抑制算法(11)——基于矢量比例积分调节器(vector PI controller,VPI controller)的谐波抑制策略
1.前言 相比于传统的谐振调节器,矢量比例积分调节器(vector PI controller,VPI controller)多一个可调零点,能够实现电机模型的零极点对消。因此VPI调节器也被广泛应用于交流控制/谐波抑制中。 2.参考文献 [1] A. G…...
排序算法中稳定性的意义和作用
多关键字排序:当需要对数据进行多个关键字排序时,稳定性变得非常重要。例如,先按次要关键字排序,再按主要关键字排序。如果排序算法是稳定的,那么在按主要关键字排序后,次要关键字的顺序将被保留。保持关联…...
网站怎么防御https攻击
HTTPS攻击,它不仅威胁到网站的数据安全,还可能影响用户隐私和业务稳定运行。 HTTPS攻击主要分为以下几种类型: 1.SSL劫持:攻击者通过中间人攻击手段,篡改HTTPS流量,从而实现对数据的窃取或伪造。 2.中间人攻…...
gitignore 不起作用
.gitignore不起作用 文件已提交至远程仓库,已经被Git跟踪。清除缓存.gitignore位置可能不是与 .git隐藏文件夹同级目录。将文件移至同级目录缓存未清除 清除缓存 清楚git缓存步骤 进入项目路径 清除本地当前的Git缓存 git rm -r --cached . 应用.gitignore等本地…...
Hive学习基本概念
基本概念 hive是什么? Facebook 开源,用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…...
在 Ubuntu 使用 fonts-noto-cjk 设置 Matplotlib 支持中文的完整教程
在 Ubuntu 使用 fonts-noto-cjk 设置 Matplotlib 支持中文的完整教程 1. 为什么需要配置中文字体?2. 安装 fonts-noto-cjk安装命令:检查字体安装是否成功 3. 配置 Matplotlib 支持中文3.1 手动加载字体3.2 设置全局字体(可选)修改…...
《C++ Primer Plus》学习笔记|第10章 对象和类 (24-12-2更新)
文章目录 10.3 类的构造函数和析构函数10.3.2 使用构造函数显式地调用构造函数隐式地调用构造函数使用对象指针 10.3.3默认构造函数10.3.4 析构函数析构函数示例 10.4 this指针三个const的作用 10.5 对象数组10.6 类作用域10.9 复习题1.什么是类?2.类如何实现抽象、…...
SpringMVC接收数据
一、访问路径设置: RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系;SpringMVC接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求 1.精准路径匹配: 在RequestMapping注解指定URL地址…...
Python数组拆分(array_split())
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Git 使用总结
下载 git bash:http://git-scm.com/download/win 第一次使用 git 时,配置用户信息: git config --global user.email "your.emailexample.com" 从github仓库中下载项目到本地,修改后重新上传: git clone 项…...
NaviveUI框架的使用 ——安装与引入(图标安装与引入)
文章目录 概述安装直接引入引入图标样式库 概述 🍉Naive UI 是一个轻量、现代化且易于使用的 Vue 3 UI 组件库,它提供了一组简洁、易用且功能强大的组件,旨在为开发者提供更高效的开发体验,特别是对于构建现代化的 web 应用程序。…...
YOLOv11 NCNN安卓部署
YOLOv11 NCNN安卓部署 之前自己在验证更换relu激活函数重新训练部署模型的时候,在使用ncnn代码推理验证效果很好,但是部署到安卓上cpu模式会出现大量的错误检测框,现已更换会官方默认的权重 前言 YOLOv11 NCNN安卓部署 目前的帧率可以稳定…...
多线程安全单例模式的传统解决方案与现代方法
在多线程环境中实现安全的单例模式时,传统的双重检查锁(Double-Checked Locking)方案和新型的std::once_flag与std::call_once机制是两种常见的实现方法。它们在实现机制、安全性和性能上有所不同。 1. 传统的双重检查锁方案 双重检查锁&am…...
golang debug调试
1. 本地调试 1:Add Configurations 添加配置文件(Run kind :Directory) 2:进入run运行窗口 3:debug断点调试模式 1. Resume Program (继续运行) 图标: ▶️ 或 ► 快捷键: F9(Windows/Linux&a…...
安装 RabbitMQ 服务
安装 RabbitMQ 服务 一. RabbitMQ 需要依赖 Erlang/OTP 环境 (1) 先去 RabbitMQ 官网,查看 RabbitMQ 需要的 Erlang 支持:https://www.rabbitmq.com/ 进入官网,在 Docs -> Install and Upgrade -> Erlang Version Requirements (2) …...
pandas 大数据获取某列所有唯一值
目录 方法1: 方法2: 方法3 处理大数据: 方法1: data.groupby().groups.keys() import pandas as pd# 假设我们有以下的数据 data = {RTDR_name: [A, B, A, C, B, A],value: [1, 2, 3, 4, 5, 6] }# 创建 DataFrame temp_data = pd.DataFrame(data)# 获取 RTDR_name 列的…...
【AI系统】LLVM 架构设计和原理
LLVM 架构设计和原理 在上一篇文章中,我们详细探讨了 GCC 的编译过程和原理。然而,由于 GCC 存在代码耦合度高、难以进行独立操作以及庞大的代码量等缺点。正是由于对这些问题的意识,人们开始期待新一代编译器的出现。在本节,我们…...
Node.js 中的文件系统(fs)模块详解与代码示例
Node.js 中的文件系统(fs)模块详解与代码示例 Node.js 的 fs 模块提供了与文件系统交互的能力,包括文件的读写、目录的管理等。以下是 fs 模块中一些常用方法的详细解释和代码示例: 1. 异步读取文件内容 作用:异步读…...
TinyXML2的一些用法
TinyXML2 原始字符串字面量 TinyXML21. XML文档操作1.1 LoadFile(const char* filename)1.2SaveFile(const char* filename)1.3RootElement()1.4Parse(const char* xml) 2.元素操作2.1 FirstChildElement(const char* name nullptr)2.2 NextSiblingElement(const char* name …...
【Vue3】从零开始创建一个VUE项目
【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接: 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】&…...
springboot370高校宣讲会管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 高校宣讲会管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,…...
navicat连接mysql 8.0以上版本2059错误
安装了最新版本8.0.4的mysql之后,使用navicat链接提示以下错误。原因是因为mysql8.0 之前的版本中加密规则是 mysql_native_password,而 mysql8.0 之后的版本加密规则是caching_sha2_password 处理方案 解决方案1:下载安装最新版本navicat…...
SQL优化与性能——C++与SQL性能优化
在开发高效的数据库应用程序时,性能优化至关重要,尤其是当系统规模逐渐扩大或并发请求增加时。数据库操作往往是应用程序性能的瓶颈所在,因此,在 C 应用程序中合理优化数据库操作,管理数据库连接池、使用批量插入与更新…...
AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。
大家好,我是微学AI,今天给大家介绍一下AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。本文利用专家模…...
vscode远程连接ssh
一. 使用vscode里的ssh查件连不上远程的解决方法 删除Windows上的known_host文件,该文件会在连接之后自动生成,用于验证远程服务器的身份。 konwn_host和id_rsa,id_rsa.pub的关系 (1)konwn_host用于客户端验证远程服务…...
学习ASP.NET Core的身份认证(基于Session的身份认证2)
基于Session的身份认证通过后,后续访问控制器的函数时该如何控制访问权限?虽然可以按上篇文章方式在需要做控制的函数开头检查Session的用户标识,可以写个全局通用检查类供所需函数调用,但还是有更简便的方法,本文学习…...
深度学习基本单元结构与输入输出维度解析
深度学习基本单元结构与输入输出维度解析 在深度学习领域,模型的设计和结构是理解其性能和应用的关键。本文将介绍深度学习中的基本单元结构,包括卷积神经网络(CNN)、反卷积(转置卷积)、循环神经网络&…...
playwright 学习复仇记-1 开端
前言 说到 web 自动化,大家最熟悉的就是 selenium 了,selenium 之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe, 但这3个都需要掌握 JavaScript 语言,所以只是少部分人在用。 2020年微软开源一个 UI 自动化测试工具 Pl…...
从零开始使用GOT-OCR2.0——多模态OCR项目:微调数据集构建 + 训练(解决训练报错,成功实验微调训练)
在上一篇文章记录了GOT-OCR项目的环境配置和基于官方模型参数的基础使用。环境安装的博文快速链接: 从零开始使用GOT-OCR2.0——多模态通用型OCR(非常具有潜力的开源OCR项目):项目环境安装配置 测试使用-CSDN博客 本章在环境配置…...
Rust学习笔记_10——守卫
Rust学习笔记_07——枚举和范围 Rust学习笔记_08——String Rust学习笔记_09——模式匹配 守卫 文章目录 守卫1. 介绍2. 基本用法3. 示例4. 复杂用法5. if let5.1 基本用法5.2 示例5.3 守卫与if let的区别与联系 1. 介绍 在Rust中,守卫(guardÿ…...
UE5 打包报错 Unknown structure 的解决方法
在虚幻引擎5.5 打包报错如下: UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…...
如何打开链接中的网址
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了包管理相关的内容,本章回中将介绍如何使用url_launcher包.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍url_launcher包主要用来打开Url中的内容,Url可以是电话号码,网址,邮箱等内容。如…...
React 前端框架4
六、React 中的事件处理 (一)绑定事件的方式 在 React 中,事件绑定和传统的 HTML 中的事件绑定有一些不同,它采用了驼峰命名法来命名事件名称,并且事件绑定的属性值是一个函数。例如,在 HTML 中绑定点击事…...
Neo4j启动时指定JDK版本
项目使用jdk1.8,同时需要安装neo4j5.15版本,使用jdk17. 1.mac或者liunx,找到neo4j目录bin的下neo4j文件 设置JAVA_HOME: 2.windows,找到bin下面的neo4j.bat文件 set "JAVA_HOME{JDK文件目录}" 重启后生效。...
【k8s深入理解之 Scheme 补充-2】理解 register.go 暴露的 AddToScheme 函数
AddToScheme 函数 AddToScheme 就是为了对外暴露,方便别人调用,将当前Group组的信息注册到其 Scheme 中,以便了解该 Group 组的数据结构,用于后续处理 项目版本用途使用场景k8s.io/apiV1注册资源某一外部版本数据结构࿰…...
TextBlob:简单高效的自然语言处理工具
TextBlob:简单高效的自然语言处理工具 TextBlob 是一个基于 NLTK 和 Pattern 的自然语言处理库,以简单易用著称。它提供了直观的 API,支持文本分析、情感分析、拼写纠正等常见任务,非常适合快速原型开发和学习。 为什么选择 Text…...
QT:将QTableWidget内容写入txt文件中
文章详请:最近在做手在眼上的标定,首先要采集机械臂数据和图像数据,我使用tablewidget进行机械臂数据的显示,最后的计算需要将机械臂位姿数据存储在txt文件中。 引用:Qt如何保存tableWidget数据?_qt table…...
每日十题八股-2024年12月2日
1.你知道有哪个框架用到NIO了吗? 2.有一个学生类,想按照分数排序,再按学号排序,应该怎么做? 3.Native方法解释一下 4.数组与集合区别,用过哪些? 5.说说Java中的集合? 6.Java中的线程…...
R语言森林生态系统结构、功能与稳定性分析与可视化实践高级应用
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...
RDMA驱动学习(三)- cq的创建
用户通过ibv_create_cq接口创建完成队列,函数原型和常见用法如下,本节以该用法为例看下cq的创建过程。 struct ibv_cq *ibv_create_cq(struct ibv_context *context, int cqe,void *cq_context,struct ibv_comp_channel *channel,int comp_vector); cq …...
Python-使用类和实例-Sun-Mon
9.2.1 Car类 class Car():"""概述车辆信息"""def __init__(self,make,model,year):"""初始化参数"""self.makemakeself.modelmodelself.yearyear //__init__方法会把依据Car类创建的实例传入的实参的值ÿ…...
【MIT-OS6.S081笔记0.5】xv6 gdb调试环境搭建
补充一下xv6 gdb调试环境的搭建,我这里装的是最新的15.2的gdb的版本。我下载的是下面的第二个xz后缀的文件: 配置最详细的步骤可以参考下面的文章: [MIT 6.S081] Lab 0: 实验配置, 调试及测试 这里记录一下踩过的一些报错: 文…...
vmware虚拟机移植
最近发现虚拟机的系统非常适合移植,接下来看一下具体的过程 复制vmdk 第一个重要的文件是保存vmdk,如果磁盘使用的是多个文件则最好进行合并一下(用着用着会发现vmdk文件特别大,这是正常的,不要想着能压缩了…...
最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出ÿ…...