- 博客(673)
- 资源 (51)
- 收藏
- 关注
原创 链路追踪jaeger
尤其微服务中,我们知道各个微服务部署在不同的服务器上,并且每一个微服务可能是不同的人开发的,如果我们不做链路追踪,微服务之间相互调用,假如有的微服务出问题了,整个系统都会受影响,目前比较流行的Tracing开源方案Jaeger进行实践,使用jaeger-client-go这个库作为client。这里的链路指的是客户端向服务发起一个请求,该请求所经过的路线,也可以说是该请求经过的流量。指我们通过一些手段将链路进行监控, 对于系统调试和维护链路追踪是非常重要的,这就一个请求的完整链路。
2023-08-21 10:04:32
110
原创 Linux系统编程-终端、进程组、会话
在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。操作系统设计的进程组的概念,是为了简化对多个进程的管理。
2023-08-12 23:14:24
170
原创 linux信号介绍
信号介绍信号的概念信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。信号在我们的生活中随处可见,例如:古代战争中摔杯为号;现代战争中的信号弹;体育比赛中使用的信号枪…信号的特点简单不能携带大量信息满足某个特点条件才会产生2 信号的机制进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。
2023-07-27 22:00:08
373
原创 libevent介绍
是在当前没有套接字的情况下对链接监听器进行初始化, 看最后2个参数实际上就是bind使用的关键参数, backlog是listen函数的关键参数(略有不同的是, 如果backlog是-1, 那么监听器会自动选择一个合适的值, 如果填0, 那么监听器会认为listen函数已经被调用过了), ptr是回调函数的参数, cb是有新连接之后的回调函数, 但是注意这个回调函数触发的时候, 链接器已经处理好新连接了, 并将与新连接通信的描述符交给回调函数。
2023-07-27 21:57:14
192
原创 TCP状态转换图
由于TCP有可能存在丢包重传, 丢包重传若发给了已经断 开连接之后相同的socket-pair(该连接是新建的, 与原来的socket-pair完 全相同, 双方使用的是相同的IP和端口), 这样会对之后的连接造成困扰, 严重可能引起程序异常.若是先关闭的客户端, 再关闭的服务端, 此时启动服务端就不会报这个错误.如果一方close, 另一方没有close, 则认为是半关闭状态, 处于半关闭状态的 时候, 可以接收数据, 但是不能发送数据. 相当于把文件描述符的写缓冲区 操作关闭了.
2023-07-27 21:53:25
652
原创 linux网络基础
同样需要设置属性表明要链接到哪里.属性:1.href=”http://www.itcast.cn”,前往地址,必填,注意要写http://2.title=”前往传智” 鼠标移动到链接上时显示的文字3.target=”_self”或者”_blank”,_self是默认值,在自身页面打开,_blank是新开页面前往连接地址示例:来传智。
2023-07-27 21:48:50
249
原创 linux 网络
网络基础协议的概念什么是协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则
2023-07-27 16:54:51
661
原创 C++ 提高编程
函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体确定,用一个虚拟的类型来代表。容器:各种数据结构:vector、list、deque、set、map等,用来存放数据。非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。因此,C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化模板。质变算法:是指运算过程中会更改区间内的元素的内容,例如拷贝、替换、删除等等。常用的数据结构:数组、列表、树、栈、队列、集合、映射表等。
2023-07-26 18:00:36
162
原创 C++ 核心编程
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造函数和析构,编译器会提供。纯虚析构语法:类内部:virtual ~类名() = 0;当 B 继承了 A 的数据,C 同样继承了 A 的数据,当 D 使用数据时,就会产生二义性。案例:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号。如果子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏掉父类中所有同名成员函数。代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
2023-07-26 17:44:18
158
原创 linux 系统编程
所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为cfo. cfo通常是一个非负整数, 用于表明文件开始处到文件当前位置的字节数. 读写操作通常开始于 cfo, 并且使 cfo 增大, 增量为读写的字节数. 文件被打开时, cfo 会被初始化为 0, 除非使用了 O_APPEND.需要说明的是,当一个进程终止时, 内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close, 在终止时内核也会自动关闭它打开的所有文件。
2023-07-25 22:04:49
513
原创 linux五 进程控制
当一个进程退出之后,进程能够回收自己的用户区的资源,但是不能回收内核空间的PCB资源,必须由它的父进程调用wait或者waitpid函数完成对子进程的回收,避免造成系统资源的浪费。为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。若子进程死了,父进程还活着, 但是父进程没有调用wait或waitpid函数完成对子进程的回收,则该子进程就成了僵尸进程。分别为初始态,就绪态,运行态,挂起态与终止态。
2023-07-25 21:57:21
172
原创 numpy广播机制
广播(Broadcast)是如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。结果为当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。结果为下面代码结果为。
2023-06-25 14:08:20
267
原创 Numpy数组
使用 empty, zeros, ones, identity,eye 创建矩阵。ndarray.ndim: 数组维数。Numpy 中数组的基本属性。Numpy 生成数组函数。
2023-06-25 13:53:34
138
原创 golang中Unmarshal的问题
当使用 interface{} 接收整数,再次 Marshal 需要注意精度丢失的问题。float64最大的安全整数是52位尾数全为1且指数部分为最小 0x001F FFFF FFFF FFFFfloat64可以存储的最大整数是52位尾数全位1且指数部分为最大 0x07FEF FFFF FFFF FFFF十进制有效数字在16位(max = 9007199254740991),超过就很可能精度丢失明确使用int接收,不使用interface{}
2023-05-31 08:56:58
951
原创 go的binary包及其应用
计算机字节序和网络字节序字节序 就是多字节数据类型 (int, float 等)在内存中的存储顺序。可分为大端序,低地址端存放高位字节;小端序与之相反,低地址端存放低位字节。在计算机内部,小端序被广泛应用于现代性 CPU 内部存储数据;而在其他场景譬如网络传输和文件存储使用大端序。使用小端序时不移动字节就能改变 number 占内存的大小而不需内存地址起始位。比如我想把四字节的 int32 类型的整型转变为八字节的 int64 整型,只需在小端序末端加零即可。
2023-05-26 16:35:07
247
原创 -L -Wl,-rpath-link -Wl,-rpath的不同点
Wl,-rpath= 为程序添加一个运行时库文件搜索路径。例如:指定链接的位置。程序运行时会先去下搜索所需库文件。
2023-04-25 08:57:38
1006
原创 go 的 fsnotify库
fsnotify 本质上就是对系统能力的一个浅层封装,主要封装了操作系统提供的两个机制:1,inotify 机制 2,epoll 机制。
2023-03-20 13:56:43
299
原创 chatGPT模型简介
其次,与GPT3等大模型相比,ChatGPT回答更全面,可以多角度全方位进行回答和阐述,相较以往的大模型,知识被“挖掘”得更充分。其中,最主要的问题是隐私和安全。现在的ChatGPT没有实时更新和事实判断能力,而这如果结合WebGPT的自动搜索能力,让ChatGPT学会自己去海量知识库中探索和学习,预测可能会是GPT-4的一项能力。比如最近同为火热的Stable Diffusion模型,利用ChatGPT生成较佳的Prompt,对于AIGC内容和日趋火热的艺术创作,提供强大的文字形态的动力。
2023-01-30 18:32:58
24514
3
原创 RSI基本概念
RSI为80是 股票超买的临界点,RSI为20是股票超卖的临界点,RSI 取值为50设定为“中心线”,该线表明股票的买入力量等于卖出力量。股票买入力量过大,买入力量在未来可能会减小,所以股票未来价格可能会下跌,此时卖出股票,未来下跌后再买入股票,从而赚取价差。在股票市场上,买方和卖方力量的消长会影响股票的架构,如果股票的买入力量大于卖出力量,则股票的价格会上涨,反之则会下跌。●RSI取值越小,可以推出说明DOWN的取值超过UP取值的程度越大,股票的卖出热度大于买入热度的程度越大。
2023-01-17 20:24:15
296
原创 libevent库
1 事件驱动, 高性能, 轻量级, 专注于网络2 源代码精炼, 易读3 跨平台4 支持多种I/O多路复用技术, 如epoll select poll等5 支持I/O和信号等事件。
2022-11-20 22:13:46
436
原创 linux进程回收
当一个进程退出之后,进程能够回收自己的用户区的资源,但是不能回收内核空间的PCB资源,必须由它的父进程调用wait或者waitpid函数完成对子进程的回收,避免造成系统资源的浪费。为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。若子进程死了,父进程还活着, 但是父进程没有调用wait或waitpid函数完成对子进程的回收,则该子进程就成了僵尸进程。通过杀死其父进程的方法可以消除僵尸进程。
2022-11-13 17:34:39
638
原创 C++11 新特性
编译器会根据 a = 10 自动推导出auto是int类型,后面的 b 变量自然也为 int 类型,所以把 11 赋值给它也是正确的, 但是如果我们将b 赋值为 12.3就是错误的,因为 12.3 是double 类型,这和 int 是冲突的。这样就避免了新的空间的分配,大大降低了构造的成本。随着C++语法的发展, 人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。
2022-11-08 15:17:15
723
原创 第十章 STL
迭代器类的具体实现:为了隐藏每个容器中迭代器的具体实现,也为了统一用户对于每个容器中迭代器的访问方式,用户可以把迭代器当成一个指针对容器中的元素进行访问。STL提供的许多容器中都实现了一个迭代器用于对容器中对象的访问,虽然每个容器中的迭代器的实现方式不一样,但是对于用户来说操作方法是一致的,也就说通过迭代器统一了对所有容器的访问方式。而我们知道,迭代器的内部是通过指针访问容器中的元素的,而插入后,若vector扩容,则原有的数据被释放,指向原有数据的迭代器就成了野指针,所以迭代器失效了。
2022-11-07 22:34:40
488
原创 第九章 泛型编程
这样我们就定义了一个简单的类模板,其中的T代表任意的类型,可以出现在类模板中的任意地方,与函数模板不同的是,使用类模板构造对象时必须显示的指定数据类型,编译器无法自动推导,例如testt;class Operator< T* ,T*> //指定类型参数,必须为2个参数,和正常类模板参数个数一致。class Operator //完全特化的类模板,当两个参数都是void*,调用这个。
2022-11-07 22:33:39
337
原创 第八章 强制类型转换
例如,程序员执意要把一个 int* 指针、函数指针或其他类型的指针转换成 string* 类型的指针也是可以的,至于以后用转换后的指针调用 string 类的成员函数引发错误,程序员也只能自行承担查找错误的烦琐工作:(C++ 标准不允许将函数指针转换成对象指针,但有些编译器,如 Visual Studio 2010,则支持这种转换)至于“向上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的。
2022-11-07 22:32:12
370
原创 第七章 异常
如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 …C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。
2022-11-07 22:31:34
116
原创 第六章 C++对C的拓展2
通过查看example.o 和 main.o中的符号表我们发现g++编译器和gcc编译器在对同一函数编译时生成的符号表不一样,所以导致使用g++编译时会找不到add函数的声明(因为在编译的链接阶段,编译器首先会在main.o中查找_Z3addii,如果没有找到会去example.o中查找,但是在example.o中函数add被生成的符号时add,所以编译器就报错了)“这条代码的时候,会用C语言的规则进行编译,这样生成的符号也叫做"add",因为在example.o中存在"add"函数,所以编译能够通过。
2022-11-07 22:21:30
279
原创 第五章 多态
1、如果基类的某个行为,在所有的派生类中的表现都是一样的,说明在所有的派生类中都没有必要对基类中的行为进行重新实现,那么基类中的该行为/方法/函数可以设计成普通的成员函数,那么所有的派生类对象在调用的时候都是调用基类中的函数 2、可是如果将基类中的该函数设计成虚函数,那么所有的派生类对象在调用的时候都是调用基类中的函数(因为在所有的派生类中都没有重写该函数)。所以如果一个基类包含了虚函数,那么其派生类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。
2022-11-07 22:20:44
218
原创 第四章 继承
类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A–>B–>D 这条路径,另一份来自 A–>C–>D 这条路径。这段代码实现了上图所示的菱形继承,第 25 行代码试图直接访问成员变量 m_a,结果发生了错误,因为类 B 和类 C 中都有成员变量 m_a(从 A 类继承而来),编译器不知道选用哪一个,所以产生了歧义。ce)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。
2022-11-07 22:19:50
327
原创 第三章 类和对象
用一个构造好的对象使用=可以构造一个新的对象,而且新的对象中的成员变量的值和构造好的对象中的成员变量的值是相等的(实现对象的拷贝)。2、C++编译器会将成员函数的第一个形参设计为this指针,this指针指向了调用成员函数的首地址(指向了成员函数作用的对象),在成员函数执行的过程中,正是通过“this指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。两个对象中的指针变量不会指向同一块内存空间,然后再将右值对象指针所指向的空间中的内容拷贝到新的对象指针所指向的堆空间中。
2022-11-07 22:17:03
573
原创 第二章 C++对C的拓展
3、因为内联函数在最终生成的代码中是没有定义的,所以内联函数的作用域可以理解为只在定义的文件内。1、在c++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。一个好的编译器将会内联小的、简单的函数。2、内联函数在最终生成的代码中是没有定义的,C++编译器直接将函数体插入在函数调用的地方,内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)4、内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数。
2022-11-07 22:15:46
225
原创 第一章 C++概述
第一是硬件,针对特定硬件编程的程序是不可移植的。但是有些c语言的头文件被转换为c++的头文件,这些文件被重新命名,丢掉了扩展名.h(使之成为c++风格头文件),并在文件名称前面加上前缀c(表明来自c语言)。学好C语言,可以为我们将来进一步地学习C++语言打好基础,而C++语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言。C++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++语言最重要的成果之一,在许多重要的企业、部门甚至是军方都有应用。
2022-11-07 22:13:09
217
原创 C++的std::shared_mutex读写锁
读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex类(在这之前,可以使用boost的shared_mutex类或系统相关api)。shared_mutex 通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。独占:仅有一个线程能占有互斥(如配合lock_guard、unique_lock)。共享:多个线程能共享同一互斥的所有权(如配合shared_lock);
2022-11-06 22:29:35
411
原创 c++11 lock_guard 锁
c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)std::lock_guard只有构造函数和析构函数。简单的来说:当调用构造函数时,会自动调用传入的对象的lock()函数,而当调用析构函数时,自动调用unlock()函数。
2022-11-06 22:21:49
1039
couchdb-2.3.0.msi
2018-12-16
protobuf-all-3.6.1.zip
2018-12-06
采用windows IME 机制编写拼音输入法C语言源码
2018-10-19
mac下redis desktop manager 0.9.3.29.zip
2020-01-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人