自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

安得情怀似旧时

和气春风贤者坐,静山流水玉人怀

  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 写博客的原则和方法

文章目录原则篇1、不写安装教程类博客2、用自己的语言来表达3、站在他人的肩膀上方法篇1、平时注重记录2、平时注重总结3、平时注重思考原则篇1、不写安装教程类博客比如Mysql安装教程,Redis集群搭建,Golang在Linux上安装配置教程等等,这类教程网上非常多,也有一定的作用。但是,却不是我写博客的范围。因为,我觉得这种工具类的软件,其官方会有对应的教程,我不用去写这类教程。另外,纯操作类型的教程仅仅指明如何操作而已,既没有说明底层原理,也没有说明这样操作的目的,反正就是跟着操作就对了。参与者

2021-09-05 19:47:22 698

原创 写博客的五个好处

文章目录绪论减轻记忆负担减少检索时间知识积累显性化有利于传播和复用总结经验绪论写博客,其实是一件费力费时的事情,现实中没有多少人能长期坚持下来。我自己也是断断续续地写,也没有写坚持下来。在实践的过程中,我本身却是收益良多。我养成了记录的习惯,记录确实提高我的工作效率。其根本原因:程序员本身就是一个知识工作者,每天的工作就是使用知识、创造知识。人的大脑,处理能力是有限的,记忆力更是不靠谱,因此做好知识管理可以分担大脑的负担。为什么有的人总是遗忘,总是粗心?光凭脑子,是记不住的,必然容易犯错。我认为,写

2021-08-29 13:02:56 3216

原创 使用dlv调试golang程序

1、编译选项go build -gcflags=all="-N -l" ## 必须这样编译,才能用gdb打印出变量,第二个是小写的L,不是大写的i需要加编译选项,类似gcc中的 -g选项,加入调试信息。关于如何安装dlv,请自行百度或者谷歌。2、使用dlv调试dlv的功能介绍Usage: dlv [command]Available Commands: attach ......

2018-12-09 12:37:35 18789

原创 goroutine原理分析

文章目录进程和线程进程-——拥有资源的人线程——真正干活的人多线程和多协程多线程——多个人干多件事案例插曲多协程——一个人干多件事本质goroutine的原理GM模型GPM模型关于goroutine底层的线程的数量测试程序一测试程序二测试程序三结论进程和线程在讲解goroutine之前,先来熟悉一下进程和线程的概念,因为只有通过概念之前对比,才能更加理解这些概念。进程-——拥有资源的人计算...

2018-11-10 09:40:02 2004

原创 Mysql事务的实现

文章目录四种隔离级别的实现行锁MVCC实现四种隔离级别的实现结论:对于RR和RC级别隔离,InnoDB使用MVCC+行锁实现。对于Serializable,使用表锁实现。具体实现:在可重复读(RR)的隔离级别下,事务启动时得到一个事务ID,整个事务存在期间只能看到小于等于这个事务ID的版本数据。(MVCC实现)在读提交(RC)的隔离级别下,每个SQL执行时,得到一个事务ID,这个SQL只能看到小于等于这个事务ID的版本数据。(MVCC实现)在串行化(Serializable)的

2021-11-28 16:12:37 715

原创 B树和B+树的区别

文章目录B树B+树比较疑问每个子节点内部的数据一定是有序的吗?进入叶节点后,查询的复杂度是怎么样的?B树定义class BTreeNode { int *keys; // 存储关键字的数组 int t; // 最小度 (定义一个结点包含关键字的个数 t-1 <= num <= 2t -1) BTreeNode **C; // 存储孩子结点指针的数组 int n; // 记录当前结点包含的关键字的个数 bool leaf; // 叶子结点的一个标记,如果是叶子结点则为t

2021-11-25 08:15:19 426

原创 Docker解决部署难题

文章目录部署存在的问题docker如何解决docker VS 虚拟机参考部署存在的问题1、环境依赖一个程序的运行,需要依赖文件系统、网络、动态库、各种运行时(例如Java虚拟机)等等。最简单的例子,一个Java程序要运行,机器上必须装有Java虚拟机。程序要写日志,对应的目录必须是可写的。因此,程序的部署依赖于环境的配置,配置环境需要消耗不小的工作量。2、环境冲突一台机器上,一般要部署多个服务程序。首先,它们的环境依赖可能存在冲突,比如A服务和B服务只能有一个监听80端口,它们依赖的运行时版本

2021-11-21 12:44:24 1335

原创 Linux系统平均负载的含义

定义平均负载,表示当前正在运行的线程加上等待运行的线程的数量。## 8.70表示过去1分钟的平均负载,7.33表示过去5分钟的平均负载,6.29表示过去15分钟的平均负载top - 10:01:07 up 83 days, 23 min, 1 user, load average: 8.70, 7.33, 6.29 分析对于一个良好的系统,平均负载应该小于CPU核心数,这意味着所有的任务都可以被及时处理,而不需要等待,反之说明任务过多,无法及时响应,长期处于这样的状态,机器存在性能问题。

2021-11-21 10:19:41 1303

原创 如何在docker中产生core文件

docker参数 security_opt: - seccomp:unconfined privileged: true ### 主要是这一项 cap_add: - SYS_PTRACE - SYS_ADMIN ulimits: core: -1 # may also use -1 to indicates unlimited启动脚本## 配置core文件名的格式、保存位置 ## 正常情况下,不能修改

2021-11-18 23:16:50 3068

原创 Golang易错知识点

文章目录string和'\0'sliceWaitGroup使用range产生的临时变量goroutine泄露闭包闭包与range带来的问题对象滥用的后果string和’\0’Golang的string内部就是字节数组,末尾没有’\0’,对于Golang来说,’\0’也是一个普通的字节。其他语言在传输字符串的时候有可能在末尾加’\0’,那么Golang解析的时候会在末尾多了’\0’字符。就会出现很尴尬的事情。比如C语言传输了’CHINA\0’,Golang解析后,再用’CHINA’比较,就不会相等了,但

2021-11-17 23:34:25 1130

原创 Mysql索引设计和使用

文章目录1 概述2 设计原则3 设计误区4 索引方法5 索引类型6 参考资料1 概述索引就是对某些字段提前排序,生成特定的数据结构(例如B+树或者哈希),然后加快查询。2 设计原则要在过滤字段上创建索引。即where后出现的字段上创建索引。要在取值范围广的字段创建索引。比如用性别字段创建索引,那意义就不大。尽量使用短字段做索引。首先是节省空间,其次是IO较少,比较更快。主键尽量使用自增、整型字段。因为普通索引会保存主键,太长的主键会占用空间。创建联合索引时,利用最左字段查询。创建联合索引后

2021-11-13 11:03:05 824

原创 Mysql四种隔离级别

文章目录查看隔离级别四种隔离级别read uncommitted ( RU,读未提交 )read committed (RC,读已提交 )repeatable read (RR,可重复读)serializable 可串行化隔离解决的问题dirty read 脏读non-repeatable read 不可重复读phantom 幻读对应的解决方法查看隔离级别首先隔离级别是Mysql的一个参数配置,是可以修改的。SQL为:SHOW VARIABLES LIKE 'transaction_isol

2021-11-11 21:37:22 2464 2

原创 C语言实现选择排序

文章目录算法描述C语言代码实现算法特点时间复杂度算法描述第一步,找到数组中最小的数据,把它和第一个数据交换位置第二步,在剩余数据中,找到最小的数据,把它和第二个数据交换位置如此不断地重复,直到所有的数据排好顺序因为这种算法,总是在剩余数据中选择最小的数据,所以叫做选择排序。C语言代码实现#include <stdio.h>void SelectSort(int data[], int len) { for (int i = 0; i < len; i++) {

2021-10-13 23:11:52 288

原创 Golang中如何处理tcp粘包

文章目录为什么要处理粘包处理粘包的方法总结为什么要处理粘包由于tcp协议是数据流传输,一次读数据不一定能得到一个完整的业务数据包,所以需要进行粘包处理,保证要处理的数据是一个或者多个完成的业务数据包。处理粘包的方法假设:包的格式为 四字节包头 + 包体, 包头指明包体的长度大端传输数据处理过程:先读取四字节包头,解析出包头的长度bodyLen再读取bodyLen长度的包体,这次读取的数据就是一个完整的业务包bodyData把bodyData返回到业务层处理处理代码如下:c

2021-09-05 18:05:37 1294

原创 slice在Golang中的实现和应用

文章目录底层实现创建slice的三种方法1、使用make创建slice2、使用数组创建slice3、直接定义向slice插入数据直接使用在索引位置插入使用append插入数据总结底层实现struct Slice{ byte* array; // actual data uintgo len; // number of elements uintgo cap; // allocated number of elements};我们知道slice是用来管理一个内存地址连续的内存空间

2021-09-05 12:36:27 472

原创 Golang和C++简单对比

文章目录编译内存管理标准库性能并发编程语法复杂度开发和调试难度总结编译都可以静态编译,直接编译成二进制文件。目前,许多语言(比如Java,C#)都是基于运行时,能静态编译语言的不多,Go算一个。同时,都可以跨平台。内存管理在C++中,需要自己使用new和delete管理内存,尽管C++已经有了智能指针,但是有一些坑,不是那么好用。Go虽是静态语言,但是自己管理内存,减轻了程序员的心智负担。这一点,非常重要。因为C++程序的崩溃,大多数时候都是内存问题,比如内存泄漏,非常难以解决。标准库一门语言

2021-08-29 14:08:11 6316 3

原创 git使用

目录原理分支本地仓库撤销撤销add撤销commit撤销push关于HEAD删除对比修改message其他常用操作原理对于一个使用5年svn的人来说,突然使用git,确实不太习惯,而且他们的设计方式上有很大的不同。他们最大的不同有2点:svn没有分支svn没有本地仓库分支在svn中,没有分支,都是保存一个一个文件,这些文件是平行存放的。而在git中,你进入一个仓库,要切换到你需要的分支中。那么这些文件的存储也比svn要复杂,据我观察,大概是只存储不同分支代码的不同部分。git branc

2021-08-29 11:25:18 214

原创 一个简单的socket编程demo

记录这个demo,相当于是保留一份代码片段,以后可以随时拿来用,验证新的想法。人的大脑是很靠谱的,经常记错东西,需要保留一个索引,放在这里。服务端#include &amp;amp;lt;sys/socket.h&amp;amp;gt;#include &amp;amp;lt;netinet/in.h&amp;amp;gt;#include &amp;amp;lt;arpa/inet.h&amp;amp;gt;#include &a

2018-12-16 16:44:03 1254

原创 mysql使用笔记

常用界面工具有时候为了方面,可以使用界面工具查看修改mysql,推荐两个工具:Navicat 需要破解HeidiSQL 开源免费shell操作远程登录mysql -u username -p123456 -h 192.168.97.200 -P 3300 -D dbname ## 注意 -p后面无空格,紧跟密码 查看数据库和表show databases...

2018-12-16 16:24:10 344

原创 pragma pack和内存对齐

内存对齐内存对齐和CPU有关系,可以认为内存对齐的大小就是CPU一次读取内存的大小,例如32CPU一次读取4字节,那么内存的对齐方式就4字节,64位就是8字节。本质上是保证CPU使用尽量少的次数将某一个变量取出来。pragma pack(n)的作用上面说了,编译默认对齐方式是4字节(32位系统)或者8字节(64)位系统,但是通过pragma pack可以自己定义内存的对齐方式。#pragm...

2018-12-16 15:47:53 429

原创 定时任务管理工具crontab

文章目录croncrontab定时执行命令定时执行脚本注意定时的语法格式1:每1分钟执行一次myCommand2:每小时的第3和第15分钟执行3:在上午8点到11点的第3和第15分钟执行4:每隔两天的上午8点到11点的第3和第15分钟执行5:每周一上午8点到11点的第3和第15分钟执行6:每晚的21:30重启smb7:每月1、10、22日的4 : 45重启smb8:每周六、周日的1 : 10重启s...

2018-12-16 13:47:56 926

原创 实现golang中memset函数

C语言中的memset在C/C++中,有一个memset函数,常常用来清空一段内存。#include &lt;string.h&gt;// 将s的前n个字节用c填充void *memset(void *s, int c, size_t n);// 用法举例int arr[100];// 将数组内存全部置为0memset(&amp;arr, 0, sizeof(arr));由于...

2018-12-16 12:11:11 4695

原创 shell脚本使用总结

文章目录指定解释器定义或者赋值变量使用变量特殊变量0、 单引号和双引号1、拼接2、获取字符串长度3、截取切片4、查找子串5、字符串替换逻辑判断字符串比较数字比较文件判断包含文件数组定义修改使用获取长度函数循环forwhileuntil后续指定解释器#!/bin/bash## 这行代码必须加入文件头定义或者赋值变量因为shell是一个脚本语言,只有赋值了,才能成为一个变量,不像其他静态...

2018-12-09 15:42:05 414

原创 gdb调试golang程序

gdb是linux系统自带的调试器,功能十分强大,对于C/C++程序员不会陌生,那么使用gdb如何调试golang程序呢?1、配置gdbgolang这门语言是2009年才出来,gdb并没有原生支持调试golang,这里需要配置gdb,使它支持golang,关于这里面的原理,我还不是很清楚,应该是gdb本身支持扩展,可以以提供插件的形式扩展支持其他语言,具体怎么样,我也不是很清楚,待后续研究。...

2018-12-09 11:26:28 2299

原创 内存查看工具之free

基本使用free是一个内存查看工具,使用起来非常简单:free -m ## 单位是M 也可以是-g -k[KentZhang@ALVPCFLKF-192-168-29-61 707]$ free -m total used free shared buffers cachedMem: 32186 ...

2018-12-03 23:32:11 1432

原创 系统监控之top

文章目录简介打印输出含义说明统计区第一行:TasksCpuMemSwap字段头任务区其他操作技巧只监控某个进程显示单个Cpu的统计信息改变排序方式显示完整的命令简介top可以用来实时显示linux系统的运行情况。打印输出top命令输出三个部分:统计区 主要由统计任务、CPU、内存、交换区的信息字段头 任务的字段头,标明字段的含义任务区 每一行打印一个任务信息## 统...

2018-12-02 23:49:23 414

原创 系统调用追踪之strace

strace 是一个常用的linux命令,应该是 trace system calls的简写形式,用来追踪一个程序的系统调用。1、启动并跟踪程序strace ./test.exe ## 结果打印在屏幕strace -o out.txt ./test.exe ## 结果输出在文件strace -f -o out.txt ./test.exe ## -f...

2018-11-29 00:19:37 758

原创 linux下常用时间函数

在linux下编程,有一些常用的时间函数,下面做一个总结梳理。1、timeSYNOPSIS #include &lt;time.h&gt; time_t time(time_t *t);DESCRIPTION time() returns the time since the Epoch (00:00:00 UTC, January 1, 197...

2018-11-28 00:32:45 335

原创 文本编辑工具之sed

sed是一个流文本编辑工具,全称是 stream editor,以下仅列举我常用的几个功能。批量替换比如某个函数名改了,那么其他文件中调用的函数全部都要修改,如果用手动修改,那是费时费力,此时需要借助sed.## 配合find 查找出所有 *.h文件,将文件中的g_pErrorLog改为LogError## 注意sed 后面的 -i 一定要加上,否则不会就修改文件find ./ -nam...

2018-11-23 23:15:26 175

原创 文本处理工具之awk

awk是一个文本处理工具,也是一中脚本语言。我常使用的就是下面的两个功能。基本格式:awk -F [str] ‘BEGIN{comand1}{commad2}END{command3}’ filename-F 后面的跟的是分割符号,可以是一个字符,也可以是字符串.中间的命令必须用单引号括起来BEGIN表示开始循环开始前执行的命令,执行一次END表示循环结束后执行的命令...

2018-11-23 23:09:40 375

原创 STL中map的使用详解

map的本质map本质上一个平衡二叉树(更准确地说是红黑树),那么每个节点存放一个数据,默认是key和value打包成一个数据pair,以pair的形式存放在节点的,由此来看,pair里面可以放任何数据,前提是pair必须可以比较大小,当然也可以自定义比较函数,而map的第三个参数就是指定自定义key的比较函数的。map的定义//map的定义//第一 第二 是key和value的类型//...

2018-11-14 18:34:04 984

原创 tcpdump简明实用教程

文章目录网络包的五元组包输入包过滤1、IP过滤2、端口过滤3、IP和端口组合过滤与或非4、协议过滤包输出1、保存包到文件2、指定包的数量3、显示IP和端口号4、显示时间戳5、以ASCII码打印6、以ASCII和二进制同时打印谈谈如何记忆参数的使用网络包的五元组在网络中,一个五元组确定一种网络包,五元组包括:协议,tcp或者udp等等源IP目的IP源端口目的端口那么tcpdump...

2018-11-10 12:03:53 1044

原创 IP地址转换总结

一、IP地址结构体相关定义本文只讨论IPv4的情况,IPv6的相关转换,在项目中我也使用过,基本类似。struct sockaddr_in {    sa_family_t    sin_family; /* address family: AF_INET */    in_port_t      sin_port;   /* port in network byte order

2017-03-08 22:33:56 558

原创 gdb调试命令总结

之前已经写过一篇博客《Linux下使用gdb调试C/C++程序》,是一些简单的用法,今天的这一篇可以算是进阶篇。一、关于多线程的使用命令 1、thread 查看当前线程的ID,这ID是GDB对线程的编号,从1开始的。以下所说的线程ID,都是这种ID。 2、info thread 查看当前可以被调试的线程,ID前面有*号的表示GDB当前所在的线程。 3、thread thread_number GDB切换到线程

2016-06-09 18:56:33 781

原创 find、grep、wc使用方法简单总结

简单总结一下,几个常用的linux命令。 一、find       用来查找特定文件,在linux下一切皆是文件,因此十分有用。       基本格式:find  path  expression  [-exec  command  {} \;]       会默认遍历到子目录。1、find  /home/work/   -name  "*.cpp"          ...

2016-06-09 09:54:43 10423

原创 select 和 epoll 的区别总结

在Linux中,select 和epoll函数,都是为了监控大量的描述符,是一种I/O多路复用技术。下面总结它们的区别:select 与 epoll区别1、打开的最大描述符数量限制   select 文件描述符使用的是linux ext3,因此打开数量受限制,一般默认为1024   epoll自己实现了一个虚拟文件系统,因此打开的描述符数就和机器内存有关,这个数值会很大2、

2016-01-19 21:15:21 969

原创 谈谈TCP三次握手

TCP协议是一个面向连接的,可靠的传输协议,两台计算机进行网络通信之前,需要进行TCP连接,其中连接发起方发包2次,连接接收方发包1次,这就是著名的TCP三次握手。一、TCP首部      上层的数据传到TCP层,会用TCP首部封装数据,TCP首部至少20字节,有关TCP首部的字段组成及其含义,网络上很多说明,本文不详述,请参见有关TCP首部的文章 http://blog.chinau

2016-01-09 17:27:34 867

原创 Tinyxml解析过程源码分析

tinyxml是一个优秀的,易用的,开源的xml解析库,xml解析的最关键之处,就是如何将xml文件内容解析成内存中的可用、易用的程序数据---DOM(Document Object Model)树。DOM其实就是多叉树,每个节点只需知道自己的第一个子节点(first child)和下一个兄弟节点(next sibling),即可实现元素数据的解析。     有关tinyxml内部的结构设

2016-01-09 09:02:26 2287

原创 Linux下程序开机自启动

在windows下是一个应用程序开机自启动,只需要把它加入开机启动项即可,那么在Linux下如何设置呢?下面介绍两种方法可以使Linux下的应用程序开机自启动。第一种方法:在启动脚本/etc/rc.local添加启动命令。下面编译生成一个小程序:StartMain/*******************************************************

2015-12-12 21:23:51 1627

原创 Linux下POSIX正则表达式API使用

一、概述在Linux环境中,经常使用正则表达式,如grep、sed、find等等,目前正则表达式有2中不同的标准,分别是Perl标准和POSIX标准,这2种风格,大体相同,稍有差别。在 C/C++的标准库均不支持表达式,不过在C++11标准中,貌似引入了boost的正则库,在Linux环境中也自带了一组API支持正则,即POSIX标准的C接口。常用的一组API如下:int regcom

2015-12-12 11:01:33 1032

c++封装libev

libev是一个高性能事件循环库,内部封装epoll, 采用c++封装libev,可以快速开发服务端。

2016-01-06

空空如也

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

TA关注的人

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