自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 资源 (3)
  • 收藏
  • 关注

原创 TLS握手证书链的校验

看一遍忘一遍,还是自己写一遍,看看这次能记多久。在TLS握手过程中,通过证书校验认证服务端的身份和交换加密秘钥,握手完成之后后续就可以进行加密数据传输。在浏览器地址栏上点击锁的图标,能打开查看证书的详细信息。首先可以看到证书包含了多个层级,最下层的是我们直接访问的网站的服务证书,最上层是根证书。每个证书都属于一个机构组织。除了根证书是由根CA自己签发给自己的,其他证书都是由上一级组织用上一级的证书签发出来的,所以形成了层级结构。点开细节可以看到证书的更多信息,主要看证书包含什么信息?

2024-02-24 16:36:37 1224

原创 ubuntu21.10搭建ebpf环境,BCC和bpftrace

1. 安装虚拟机虽说centos是生产环境中的标准系统,但是从个人学习角度还是推荐ubuntu,各种软件安装包都能方便地找到,操作界面时也很漂亮。之前一直在centos7.6上折腾,自己升级内核版本,自己安装各种高版本依赖,有一段时间被折磨得放弃了很久。这次决定直接从最新版的ubuntu21.10开始学习,centos8可能也会好很多,只是我没有尝试过。1.1. 下载镜像选择下载最新的桌面版就好,下载地址 https://cn.ubuntu.com/download/desktop,写这篇总结的时候版

2022-05-02 12:31:27 5590 2

原创 centos7安装bcc和简单测试

系统环境uname -r5.10.2-1.el7.elrepo.x86_64cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)升级内核版本 https://www.cnblogs.com/xzkzzz/p/9627658.html按照官方的安装流程安装https://github.com/iovisor/bcc/blob/master/INSTALL.md#centos—source安装依赖更新安装会花一些时间sudo

2022-04-14 23:14:53 2477

原创 golang 使用下标复制切片的踩坑记录

最近排查了一个问题,最后发现是由于对golang的切片实现不熟悉导致踩了坑。切片的底层结构由数组指针,切片容量cap,切片当前长度len组成。一、切片的三种初始化方式的区别字面值会根据传入的字面值初始化底层数组并创建切片例子arr := []int{1, 2, 3}下标初始化会创建一个指向原数组的切片结构体,不会拷贝原数组或者原切片中的数据,所以修改新切片的数据也会修改原切片。例子arr := [3]int{1, 2, 3}slice := arr[0:1]make关键

2022-03-05 00:09:58 592

原创 APUE学习笔记(十七)高级进程间通信

17.1 Unix域套接字UNIX 域套接字用于在同一台计算机上运行的进程之间的通信。UNIX 域套接字就像是套接字和管道的混合。一对相互连接的UNIX域套接字可以起到全双工管道的作用。和网络套接字相比:在同一计算机上使用,效率更高;仅复制数据,不进行协议处理;域套接字提供流和数据报两种接口,数据报服务是可靠的;借助UNIX域套接字轮询XSI消息队列创建消息队列,监听消息#include "apue.h"#include <netdb.h>#include <sys

2021-06-19 22:11:41 233

原创 APUE学习笔记(十六)网络IPC

16.1 套接字描述符套接字是通信端点的抽象,用套接字描述符访问套接字。套接字描述符本质上是一个文件描述符,但是不是所有接受文件描述符的函数都接受套接字描述符。为创建一个套接字,调用socket函数。套接字通信是双向的,可以采用shutdown函数来禁止一个套接字的I/O。套接字类型描述SOCK_DGRAM固定长度、无连接、不可靠的报文传递SOCK_RAWIP协议的数据报接口SOCK_SEQPACKET固定长度、有序、可靠、面向连接的报文传递SOCK_ST

2021-06-19 22:10:49 196

原创 APUE学习笔记(十五)进程间通信

管道和FIFO仍能有效引用于大量应用程序,但是在新程序中要避免使用消息队列和信号量,而应当考虑使用全双工管道和记录锁。15.1 管道管道的局限性:半双工只能在具有公共祖先的两个进程之间使用管道是通过调用pipe函数创建的当读一个写端已被关闭的管道时,在所有数据都被读取后read返回0,表示文件结束。如果写一个读端已被关闭的管道,则产生信号SIGPIPE。例子1使用管道传递数据#include "apue.h"int main(void) { int n; int

2021-06-19 22:09:47 176

原创 APUE学习笔记(十二)线程控制

12. 1 线程属性如果在创建线程时就知道不需要了解线程的终止状态,就可以使用pthread_attr_setdetachstatepthread_attr_init对线程属性进行初始化,pthread_attr_destroy执行清理工作。对于进程来说虚地址空间的大小是固定的,但对于线程来说,同样大小的虚地址空间必须被所有的线程栈共享。如果线程栈的虚地址空间都用完了,用pthread_attr_setstack函数来改变新建线程的栈位置。如果希望改变默认的栈大小但又不想自己处理线程栈的分配问题,

2021-06-19 22:06:43 152

原创 APUE学习笔记(十三/十四)守护进程和高级IO

13. 守护进程要创建一个守护进程需要遵循一个固定的步骤,可以参考下面的例子。例子#include <fcntl.h>#include "apue.h"#include <sys/resource.h>#include <syslog.h>void daemonize(const char *cmd) { int i, fd0, fd1, fd2; pid_t pid; struct rlimit rl; struct

2021-06-19 17:30:14 121

原创 APUE学习笔记(十一)线程

11. 1 线程概念进程可以有多个控制线程,每个线程处理各自独立的任务。一个进程的所有信息对该进程的所有线程都是共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。1. 多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享,而多个线程共享相同的存储地址空间和文件描述符。2. 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码。3. 有些问题可以分解使用多线程从而提高整个程序的吞吐量。4. 交互的程序可以通过使用多线程来改善响应时间。11.2 线

2021-06-19 01:07:33 144

原创 APUE学习笔记(十)信号

10.1 信号概念mac和linux都支持31种信号。不存在编号为0的信号。产生信号的方式:当用户按某些终端键时引发终端产生的信号硬件异常产生信号:除数为0、无效的内存引用等用户可用kill命令将信号发送给其他进程进程调用kill函数可将任意信号发送给另一个进程或进程组当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号处理信号的方式:忽略此信号。SIGKILL和SIGSTOP这两种信号不能被忽略,它们向内核和超级用户提供了使进程终止的可靠方法。捕捉信号。不能捕捉SIGK

2021-06-18 02:39:48 329

原创 APUE学习笔记(九)进程关系

9.1 终端登录这里终端是本地的或者是远程的。登录unix系统都经由内核中的终端设备驱动程序。BSD系统的过程:init读取文件/etc/ttys,对每一个允许登录的终端设备调用一次fork,它所生成的子进程则exec getty程序。getty打开终端设备,exec login程序。至此,登录用户的登录shell开始运行。9.2 网络登录网络登录时 在终端和计算机之间的连接不再是点到点的。在网络登录情况下,login仅仅是一种可用的网络服务。为使同一个软件既能处理终端登录又能处理网络登录,系统使

2021-06-17 01:52:37 171

原创 APUE学习笔记(八)进程控制

8.1 进程标识每个进程都有一个非负整型表示的唯一进程ID。进程ID是可重用的。ID为0的进程通常是调度进程,常常被称为交换进程(swapper)。 该进程是内核的一部分,它并不执行任何磁盘上的程序。ID为1通常是init进程,在自举过程结束时由内核调用。#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char* argv[]) { printf(

2021-06-17 01:46:51 385

原创 APUE学习笔记(七)进程环境

7.1 main函数c程序总是从main函数开始执行。在调用main前先调用一个特殊的启动例程,从内核取得命令行参数和环境变量值。7.2 进程终止正常终止(1) 从main返回;(2) 调用exit;(3) 调用_exit或_Exit;(4) 最后一个线程从其启动例程返回(5) 从最后一个线程调用pthread_exit_exit和_Exit立即进入内核, exit则先执行一些清理处理,对于所有打开流调用fclose函数,然后返回内核。返回值退出函数都带一个整型参数,称为终止状态。

2021-06-17 00:58:54 128

原创 APUE学习笔记(五)标准IO库

5.1 流和FILE所有I/O函数都是围绕文件描述符的。 当打开一个文件时返回一个文件描述符,该文件描述符就用于后续的I/O操作。标准I/O库的操作是围绕流(stream) 进行的。标准I/O文件流可用于单字节或多字节(“宽” )字符集。 流的定向决定了所读、写的字符是单字节还是多字节的。fwide函数可用于对未定向的流设置定向。当打开一个流时标准I/O函数fopen返回一个指向FILE对象的指针。5.2 缓冲标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。标准I/O

2021-06-17 00:43:32 151

原创 APUE学习笔记(四)文件和目录

4.1 statstat/lstat函数返回文件的信息结构体stat。st_mode中包含了文件的格式信息。例子判断文件或目录类型#include "apue.h"int main(int argc, char *argv[]) { int i; struct stat s; char *ptr; for (i = 1; i < argc; i++) { if (lstat(argv[i], &s) == -1)

2021-06-17 00:18:06 141

原创 APUE学习笔记(三)文件IO

3.1 文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。例子: 0表示stdin, 1表示stdout, 2表示stderr.文件描述符的变化范围是0~OPEN_MAX-1,早期允许每个进程打开19个文件。对很多系统来说,文件描述符范围是无限的。3.2 open和openat调用open或openat函数可以打开或创建一个文件。 int open(const char *path, int oflag, ...); int openat(int fd, c

2021-06-17 00:16:26 107

原创 Golang的time Format

golang里的时间戳转字符串的通常用法timeStr := time.Now().Format("2006-01-02 15:04:05")注意这个格式模板2006-01-02 15:04:05是有特殊含义的,不是随便写一个类似格式的时间就可以的。具体可以参考下面的博客 参考博客...

2021-06-16 23:15:34 1116

原创 APUE学习笔记(二)unix标准和实现

2.1 标准化ISO C C程序设计语言标准POSIX 指的是可移植操作系统接口(Portable Operating System Interface)。该标准的目的是提升应用程序在各种UNIX系统环境之间的可移植性。Single UNIX Specification(SUS,单一UNIX规范)是POSIX.1标准的一个超集。 它定义了一些附加接口,扩展了POSIX.1规范提供的功能。POSIX.1相当于Single UNIX Specification中的基本规范部分。2.2 实现对标准的实

2021-06-16 01:57:28 185

原创 APUE学习笔记(一)unix基础知识

1.1 Unix体系内核的接口被称为系统调用。公用函数库构建在系统调用接口之上。shell和公共函数都能直接进行系统调用,应用程序可以直接进行系统调用,也可以使用shell和公共函数库里的函数,从而间接进行系统调用。1.2 登录shell是一个命令行解释器,它读取用户输入然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。1.3 文件和目录除了斜线(/)和空格之外,都可以用于文件名;由斜线分隔的多个文件名构成路径名。#include

2021-06-16 01:51:14 332

原创 APUE学习笔记 准备

1. 前言最后花了一些时间学习了下《unix环境高级编程》。这本书其实买了半年了一直都没有时间打开。平时上班的时候都纠结于一些边角料的工作和细枝末节的技术问题,感觉自己的提升太少了,所以觉得还是要找时间好好补一补基础知识。虽然买了书,但是实际上大部分时间都是在看电子版的pdf。纸本书太厚没办法随身带,而且由于和室友合住,晚上熄灯了之后根本没法看书。所以还是电子版的比较方便。2. 开始2.1 准备工作IDE: clion 2020.3 mac编译工具: cmake源代码下载:http://ww

2021-06-16 01:31:34 148

原创 联想笔记本Ideapad300S-14ISK安装固态硬盘和win10

1. 拆机把背面的螺丝钉拧开,拿个卡找个缝插进去转一圈就打开了。2. 内存先把电源排线拔掉,排线旁边有表示“+”和“-”。内存条外面盖着一个金属壳,把四周的小固定扣压下去就能打开,内存条型号DDR3L。买了个DDR4才发现插不进去。3. 固态硬盘把机械盘的三个螺丝拧开,把硬盘向前推动就能拿出来。把硬盘盒侧边的螺丝打开就能把硬盘与硬盘盒分开。固态硬盘接口sata3,厚度7mm。4. 装系统新装上的固态硬盘是空的,我们要制作一个U盘系统盘,从U盘安装系统。4.1 系统镜像下载https:/

2021-06-15 01:02:28 9934

原创 c语言学习简要笔记

大学的时候学习过c语言,不过一直都没怎么用过,到现在基本已经都还给老师了。所以想着找个时间补补课,所以在网上找了一个c语言课程,跟着老师一起学习了下。ps: 上班之后才觉得花钱买课一点都不是负担,只是没有时间和精力去学习。1. 搭建环境这里使用的是window10环境。安装msys2包管理工具,官网下载exe安装就好。安装visul sudio, 选择社区版本就好了安装clion,使用的是2020.3安装mingw。打开msys2,使用命令安装依赖pacman -Syupac

2021-04-24 20:17:34 877 6

原创 kafka-go源码简单笔记

1.问题最近在项目中用到了kafka,客户端使用的是开源的kafka-go,版本v0.4.8。前端时间kafka集群缩容之后,发现客户端写数据总是返回连接超时错误。一般而言,客户端都是会动态更新元数据的,但是为什么总是失败呢?只好把源代码梳理了下。2.调用过程中间调用过程还是有点复杂的,估计我也讲不清楚就不尝试了。感兴趣的朋友可以结合源码和下面的导图自己看下。3.问题分析3.1为什么写数据总是返回错误对于我遇到的问题,主要关注两个地方。一个是发送数据时的Writer.WriteMessages

2021-04-15 02:13:51 1114 1

原创 curl请求添加cookie

一个例子,使用curl 命令发送请求,一些需要登录鉴权的网站使用cookie的,可以添加cookie到请求中。#添加自己的cookieck=""#设置分页大小ps=10# 多次请求for i in $(seq 1 2)dourl="$uri?&page_idx=$i&page_size=$ps"echo "url: $url"#发送请求,--cookie设置cookie,-H 设置header# 返回的内容有压缩的,使用gunzip进行压缩#结果保存到res.txt中

2021-03-06 20:21:50 4942

原创 localdns和httpdns的区别

localdns发送udp请求到53端口,httpdns发送http请求到dns服务器localdns存在问题,httpdns进行了规避域名缓存问题,可能导致负载均衡失效域名转发问题,无法获得真实客户端ip,可能导致跨运营商访问出口NAT问题,无法获得真实客户端ip域名更新问题,无法获取最新结果解析延迟,遍历多层dns服务器,时间较长参考链接 https://zhuanlan.zhihu.com/p/102839806...

2021-02-24 01:26:12 1113

原创 新建systemd自启动服务

0. golang程序package mainimport ( log "github.com/sirupsen/logrus" "time")func main() { for { log.Infof("hello, %v", time.Now()) time.Sleep(5*time.Second) }}编译安装go build -o myAppsudo install myApp /usr/local/myApp1. 编写unit service服务分为系

2021-02-23 01:23:58 485

原创 linux 性能分析命令

常用的几个系统性能分析的命令,以后遇到实际问题的时候再结合例子记录下。uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top 1. uptime展示当前时间,机器运行时间,用户数,1分钟,5分钟,15分钟CPU平均负载2. dmesg | tail查看最近10条的系统信息,可以用于系统设备故障诊断

2021-02-21 21:54:25 440

原创 proto文件转为golang结构体

proto文件转为golang结构体的方法总结1. 安装protoc插件go get github.com/golang/protobuf/protoc-gen-go安装完成之后,会在GOPATH/bin下的bin目录里看到下载的protoc-gen-go。可以在这个目录下执行命令,在其他目录下直接执行protoc命令可能会找不到命令,可以添加下路径。2. 添加路径#拷贝二进制文件cp protoc-gen-go /usr/local/bin/#添加环境变量vim ~/.bash_prof

2021-02-15 17:43:54 2610

原创 JDK8u271 各平台安装包

链接: https://pan.baidu.com/s/1h9yFRE3Lgdb_oArdp28jPQ 密码: g6rp

2021-02-15 16:30:20 1052

原创 从文本中匹配出ip并填加双引号

转载自https://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html在每行的头添加字符,比如"HEAD",命令如下:sed 's/^/HEAD&/g' test.file在每行的行尾添加字符,比如“TAIL”,命令如下:sed 's/$/&TAIL/g' test.file1."^“代表行首,”$"代表行尾2.’s/$/&TAIL/g’ 中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就

2020-12-04 22:49:27 355

原创 macOS BigSur下无法在根目录创建/data解决方法

sudo vim /etc/synthetic.conf添加data /xxx/data建立/data到/xxx/data的链接(data和/xxx/data之间是tab)重启后生效

2020-11-18 00:54:02 12923 12

原创 protobuf对象 转为Json串写入elastic search遇到的问题总结

背景从kafka中消费数据后拿到的是protobuf序列化后的字节数组,转化为Java中的proto对象后,需要将这些protocol对象继续处理成Json串写入elasticsearch。各种问题Json工具选择刚开始尝试使用fastJson等工具来执行序列化,结果发现对于protobuf这种特殊对象,这些序列化工具都会报错,比如fastJson会提示UnsupportedOperationException: This field is not of enum type。最后在网上查找资料,发现

2020-07-08 00:22:25 1876

原创 beego项目中sso系统与权限系统的接入

最近在项目中需要在后端项目中接入sso系统和权限系统。之前在学习Java时其实也学习过,过了一个寒假就什么都不记得了。SSO接入现在sso系统已经很强大,前端完成主要功能,而后端实现对应的接口api/login和api/logout即可实现前后端的接入。这里只记录基本的逻辑顺序前端打开页面时,前端框架自动调用sso系统,执行登录操作sso登录成功后,前端会调用后端的login接口,传入从前端获得的service和ticketlogin函数会以service和ticket,再次向sso系统接口执行

2020-07-06 00:34:52 692

原创 IPv4和IPv6的格式和判断—Java和Go中的相关的方法(源码待加)

IPv4格式32位,4个字节的数字表示。点分格式展示为0-255.0-255.0-255.0-255因此,IPv4格式还比较好判断。IPv4 java正则表达式判断"^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"^表示行开始,$表示行结束,?表示0或者1个(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d) //0-25525[0-5] 如果是25开头的三位数,

2020-07-05 00:40:12 1673

原创 记一次低级错误导致的频繁Full Gc

最近在Flink平台上发布了一个简单的任务,在测试环境测试时没有发现什么问题,但是线上数据增加后发生了两次Full Gc频率过高,查看了相关的监控器,发现容器内存使用超过70%,我以为是应用发布时选择参数不合理,于是重新配置了taskmanager内存和并行度。今天测试时,又发生了相同的问题,Full Gc频率更是高达每分钟7次。这次注意到Flink平台上的流图监控界面,之前对这个平台不熟悉没能好好利用这些监控工具。从流图监控上看到写入TSDB的task几乎完全停止,数据完全缓存,更奇怪的是CPU飙升,几

2020-06-30 09:36:59 606

原创 win10 网卡驱动正常搜索不到WiFi信号 解决方法

昨天晚上家里停电,早上起来发现电脑没有WiFi了。检查了一上午才搞好。1 检查是否是路由器问题路由器信号正常,因为手机能连接使用2 检查是否是网卡驱动问题打开电脑-管理-设备管理器,查看网卡驱动是否显示异常打开cmd,输入ping 127.0.0.1,看是否正常返回数据一上来以为驱动问题,想装个驱动精灵,结果遇到奇怪的runtime error,根本无法运行,浪费了很多时间。结果看...

2020-04-28 14:09:25 9262

原创 视频剪辑中 多视频对齐小经验

我想把同一首歌的不同版本进行混剪,需要将不同视频素材导入之后进行时间轴对齐,一开始我用歌曲的开头部分进行对齐,将每个素材的开始时间对最左边,但是尝试了之后发现效果不太好。原因在于这首歌的开头是较为长的旋律,很难精准对齐。摸索了好久,发现歌曲中间位置有一个位置的音频波形很有特点。这个部分前面是较低音的抒情,后面突然爆发为摇滚,所以波形会有一个陡峭的上升。在其他视频的音频中我也找到了类似的波形,以这...

2020-03-24 10:06:46 1382

原创 每日一题 按摩师选择预约时间

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动这道题与著名的小偷问题其实是相同的,小偷要偷到最多价值的东西,但是不能偷相邻的地方,选择最优序列。方法采用动态规划,一些边界条件注意判断。 public ...

2020-03-24 09:40:30 364

原创 levelDB 入门操作实例

本文采用Java语言版本的levelDB,在springboot项目下或者maven项目中进行测试。0,快捷键复习根据类名查找类 ctrl+shift+n或者在面板右上角点击搜索图标查看接口的实现 ctrl+alt+左键1,引入依赖 <dependency> <groupId>org.iq80.leveldb</groupId&...

2020-03-21 14:19:53 1284

大规模分布式存储系统思维导图笔记

本人在看《大规模分布式存储系统》这本书的过程中,记录的思维导图笔记,方便学习和复习这本书的重点内容,适合于分布式存储的入门同学。书中实战的部分因为是基于阿里的ocean base,比较具体,处于入门学习的目的,笔记中没有记录。

2020-03-19

LevelDB手册(LevelDB Handbook).pdf

leveldb是一个写性能十分优秀的存储引擎,是典型的LSM树(Log Structured-Merge Tree)实现。LSM树的核心思想就是放弃部分读的性能,换取最大的写入能力。

2020-03-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除