自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mike's Tech Blog

mikezhang.cc

  • 博客(33)
  • 收藏
  • 关注

原创 Quic协议与DNS

Quic全称为Quick UDP Internet Connections, 通过字面意思的话我们也可以看出本身Quic协议是基于UDP实现的一种面向互联网的连接协议,至于是否是一种快速(Quick)的数据交换协议,还需要看一下具体的实现与常规协议的比较。Quic简介Google于2014年前后开发完成了Quic协议的初期版本该版本后来被称为“gQuic协议”,开发的目的是鉴于传统的HTTPS(TCP+TLS)在具体实现上通信开销较大的问题,为了降低页面的载入延迟、提升传输效率。2016..

2021-01-12 16:30:04 2919

原创 图解Python List数据结构

Python中的列表作为一个基本数据结构,大部分程序中都会使用其作为存储数据容器,可能很多人都和我一样觉得Python中的列表无非就是一个动态数组,就像C++中的vector或者Go中的slice一样。但事实真的是这样的吗?1. List实现我们来思考一个简单的问题,Python中的list是允许我们存储不同类型的数据的,既然类型不同,那内存占用空间肯定就不同,那不同大小的数据对象又是如何存入“标准”数组中呢?比如下面的代码中,我们分别在数组中存储了一个字符串,一个整形,以及一个dict对象,假如是

2020-08-13 22:25:20 5665 1

原创 图解RingBuffer数据结构

本篇介绍一种简单高效的数据缓存结构:RingBuffer, 这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。1. 实现原理RingBufferr实现比较简单,基本上只需要一个数组结构,外加两个用于存储位置信息的变量即可。其中的数组采用固定大小容量,便于重用内存,不会出现动态内存不断分配和销毁的情况,这对于一些GC类编程语言来说,大...

2020-07-27 22:13:11 7268 1

原创 大话贪心算法与霍夫曼树

1.什么是贪心算法假设你去菜市场买菜,去了以后才发现菜市场只供应下面的四种食品了,但是却告诉你说现在清仓,所有商品一律1块钱一斤处理。如果你的购物篮只能携带10斤左右的商品的情况下,怎么选择才能保证买到的商品最划算呢? 食物名称 每斤/单价(原价) 剩余 牛肉 20元 4斤 蔬菜 3元 10斤 ...

2020-07-11 16:42:21 478

原创 图解七大排序算法

“排序是计算机的核心内容。事实上,从很多方面看,如果没有排序,计算机就不会变成现实。”《算法之美:指导工作与生活的算法》排序算法,或许是我们日常最常见也是使用频率最多的算法。比如你在电商网站买东西,推荐商品往往基于相似度或者基于销售量等维度排序。我们每日接收的邮件是程序中按照时间进行排序好的,我们点外卖时候推送的列表是按照评分和地理位置进行排序的。搜索引擎检索内容也是按照一定的相似度算法进行排序好才呈现给你的,所以搜索引擎实际上就是一个排序引擎。本篇文章通过图例的方式逐一讲...

2020-07-06 10:46:41 3612 1

原创 谈Go语言中并发Map的使用

最近开发Go语言总是遇到哈希表的使用,在高并发下如何保证读写的安全性尤为重要,假如不了解的情况下,使用原生map的话,性能倒是很高,但在多个goroutine操作下就会遇到并发读写的错误出现。为了并发安全,修改读写访问,每次都写都加入读写锁,又会导致性能的大幅度下降,安全和性能实在是难以同时兼得。这里我们梳理下Go当前访问Map的几种方式,并给出实际的测试实例和性能表现。1. 标准库map结构...

2019-09-02 10:51:39 1828 1

原创 Prometheus AlertManager代码阅读笔记

AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。系统的整体设计图如下面所示,并且支持HA高可用部署。AlertManager接收告警Prometheus或者告警发送系统可以通过API的方式发送给Alertmanager,收到告警后将告警分别存储在AlertProvider中(当前实现是存储在内存中,可以通过接口的方式自行实现其...

2018-06-11 16:59:02 3282 1

原创 使用golang编写Prometheus Exporter

Exporter是基于Prometheus实施的监控系统中重要的组成部分,承担数据指标的采集工作,官方的exporter列表中已经包含了常见的绝大多数的系统指标监控,比如用于机器性能监控的node_exporter, 用于网络设备监控的snmp_exporter等等。这些已有的exporter对于监控来说,仅仅需要很少的配置工作就能提供完善的数据指标采集。有时我们需要自己去写一些与业务逻辑...

2018-04-19 10:32:39 25865 1

原创 图解最长公共子序列LCS问题

很多人在上学的时候都有过对毕业论文进行查重的经历,一般可以通过CNKI,知网等平台提交自己的论文,平台将论文与其他论文进行匹配查重,最终得到一个相似度。不知大家对于查重问题有没有思考过,他背后是如何实现的呢?难道就是找到相似的字符串匹配就可以吗?本篇文章就带大家了解一种可以解决这个问题的经典算法。本文主要主要包含以下三方面: 什么是LCS 如何实现LCS计算 LCS的使用场景 1. 什么是LCS最长公共子序列,英文名称为Longest Commo...

2020-07-05 21:48:31 1375

原创 红黑树的设计与实践

本文主要介绍以下五个方面,通过本文可以大致掌握红黑树的基础知识,并且有助于你在现实场景中根据需要选择合适的数据结构。什么是红黑树?红黑树与哈希表的区别如何构造红黑树?红黑树在DNS数据存储中的应用其他使用场景1. 定义红黑树本身也是一个二叉树结构,对于普通二叉树结构,其本身的树形结构依赖于插入数据的顺序,比如我们插入一个数组(1,2,3,4,5,6)到二叉树中, 普通二叉树的结构如下面所示:这种情况下,二叉树和链表等价,执行效率也相同,我们使用二叉树的目的就是获得O

2020-07-03 10:38:05 444

原创 三种字符串查找算法的Go实现

字符串查找就是给定一段文字,查找所有包含特定单词的方式,当我们使用网站浏览信息的时候,用Ctr+F搜索网页, 或在linux上使用grep查询日志文件中的特殊字符串都是属于这类模式。所以算是一种比较常见的算法,本文将总结一些字符串查找算法常见的实现方式,以及如何用Go语言实现该算法。主要的算法分为三种:暴力遍历算法KMP算法BM算法1. 暴力遍历算法暴力遍历算法,简单来说就是通过一...

2019-12-02 09:41:00 1269

原创 关于一个子集判断函数的性能分析

最近遇到一个需求,需要做基于日志标签的实时分发,基本原理是一条日志传递到程序后,系统采集该日志的标签属性,跟后台的预定义的多个规则标签集合进行匹配,如果Ok则将规则与该日志绑定,等待后期的处理。比如一条业务日志具有标签: dns, usa, 192.168.0.1, 规则库的当前规则示例:规则1 : dns规则2: dns, usa规则3: dns, usa, 192.168.0.2...

2019-11-20 13:08:13 289

翻译 使用textfile收集监控指标

node_exporter本身除了收集系统指标以外,还可以通过textfile模块来采集用户自己生成的指标,这对于系统监控提供了更多的使用空间和场景. 比如我们通过shell脚本采集的数据结果就可以通过该途径传递出去,用于绘图或告警等. 默认情况下node_exporter将启用textfile组建,但是需要设置一个采集的路径,所有的生成的监控指标将放在该目录下,并以.prom文件名结尾. 同...

2018-08-08 14:29:27 4710

原创 Prometheus AlertManager代码阅读笔记 Notify组件

Notify组件定义了路由处理过程中的receiver pipeline(本文不包含Silence和Inhibit部分), 包含等待间隔的WaitState,去重处理DedupStage,重试处理RetryStage和SetNotifyStage,实现上类似于中间件的方式,一层层的顺序处理。创建pipeline的函数定义如下:// createStage creates a pipeline...

2018-06-12 11:29:46 2579

原创 Protobuf3入门指南

Protobuf是google开发的一种跨语言和平台的序列化数据结构的方式,类似于XML但是更小更快而且更简单,只需要定义一次结构体,通过生成的源代码可以在不同的数据流和不同的语言平台上去读写数据结构。最新的protobuf3支持更多的语言使用,比如go 、 object-c等等。另外proto2与proto3并非完全兼容,官方仍旧提供proto2的支持。Google内部有超过40000多个数...

2018-04-22 11:56:16 4895

翻译 软件开发的十二因素

本篇文章主要介绍现在流行的应用开发中会涉及到的主要的12个因素,其中每一部分内容又会涉及很多扩展的内容,比如选择合适的工具和方法来满足构建需求。十二因素也为开发应用程序提供了一定的构建方法指导。1. 基准代码开发中我们使用的git等版本管理工具,保留一份用于追钟代码修改的代码基准,基准代码于应用之间是一一对应,多个基准代码不能称为一个应用。如果多个应用共享一个基准代码的时候,考虑用共享独立...

2018-04-22 11:52:47 2379

原创 ElasticSearch笔记-基本操作与集群处理

为了学习和了解elasticsearch,我们可以使用docker来下载一个官方的elasticsearch和kibana镜像(可选)。镜像实例启动后,可以通kibana的console模块来执行或者使用curl命令发送需要的数据,为方便期间,我们使用kibana的console来展示命令执行。系统信息打印在Kibana console中执行下面的命令打印当前的系统信息 GET /...

2018-04-19 11:18:29 865

原创 blackbox_exporter源码阅读

blackbox_exporter是Prometheus监控系统中用于在agent机器上采集http,DNS,ICMP相关信息,通过prometheus传递的参数和target,映射到对应的agent的web接口上进行处理。比如下面的采集配置来自于prometheus的配置文件 scrape_configs: - job_name: 'blackbox' metrics_path:...

2018-04-19 10:59:37 2944 3

翻译 bolt:一个纯Go实现的KV数据库

简介bolt是一个纯go语言实现的键值数据库,支持完全的ACID实务操作,尽管不像SQLite那样有完善的查询语言,但是接口简单易用。bolt本身通过使用一个内存映射的磁盘文件来管理数据,逻辑清晰,接口简单易用。下面代码就是bolt提供的简单的操作接口示例。 db, err := bolt.Open("example.db", 0600, nil) if err != nil { lo

2017-11-24 22:52:26 8265

原创 bufio模块实例及代码分析

bufio模块是golang标准库中的模块之一,主要是实现了一个读写的缓存,用于对数据的读取或者写入操作。该模块在多个涉及io的标准库中被使用,比如http模块中使用buffio来完成网络数据的读写,压缩文件的zip模块利用bufio来操作文件数据的读写等。本篇文章主要是通过两个例子简单的介绍bufio的一些功能和实现方式,供大家参考。复制文件复制一个文件内容到另一个文件中,我们如果直接使用iout

2017-01-16 15:00:40 815

原创 Golang日志库glog源码阅读笔记

glog包是google推出的一个golang的日志库,提供丰富的接口函数,提供不同级别的日志写入和日志文件的轮转,可将日志打印到终端或者写入到指定的路径文件中。本篇blog主要是包含了如何使用glog以及源代码中的一些片段笔记。如何使用glog创建项目目录,使用mkdir创建以下的目录结构/LearningGo$ tree -L 1.├── bin├── pkg└── src3 dire

2016-12-28 15:25:48 3498

原创 使用Golang的Context管理上下文

golang 1.7版本中context库被很多标准库的模块所使用,比如net/http和os的一些模块中,利用这些原生模块,我们就不需要自己再写上下文的管理器了,直接调用函数接口即可实现,利用context我们可以实现一些比如请求的声明周期内的变量管理,执行一些操作的超时等等。保存上下文对象这里我们通过一个简单的例子来看一下如何使用context的特性来实现上下文的对象保存,这里我们写了一个简单的

2016-12-21 12:00:57 20312 2

原创 使用Go语言完成文件夹的MD5计算

案例需求:我们的监测系统会定期的检查配置文件的变动,这些配置文件放置在一个独立的文件夹下面,我们可以通过对于整个的文件夹内所有文件进行md5的计算来完成监测,本文就通过Go语言实现了一个命令行工具,完成上述的需求。1. 单一文件的md5计算我们首先将需求任务进行分解,既然需要计算文件夹下的所有文件md5值,我们必须先考虑如何实现单一文件的md5值计算。下面就是一个简单的md5求值程序,这里我们通过参

2016-12-20 14:14:23 3879

原创 如何在go程序中捕获退出信号

在linux环境中除了程序本身运行结束退出外,还有很多其他的退出方式,比如我们在shell里面直接执行命令kill或者kill -9.仅仅是多了一个-9参数就属于不同的退出方式了,因为他们将会给程序发送不同的信号量.当我们执行kill的时候,默认发送SIGTERM信号到程序中,当程序接收到这个信号的时候,可能会出现以下集中方式:退出程序执行一些清理操作后退出忽略掉,继续执行这三种方式都是程序

2016-11-29 13:58:18 10815 1

原创 Go语言的包管理

接触go语言之前写了一些nodejs的App,所以对于npm的包管理方式还是觉得挺方便的,但转移到go语言平台后,由于官方并未推出自己的包管理工具,所以只能借助于第三方的一些工具完成,本篇主要介绍一些目前使用的go的包依赖管理工具,用来协助程序的开发.gpmgpm工具使用来完成go依赖库下载的工具,非常的简单,只需要创建自己的一个Godeps文件,并把依赖的包写到文件中,这样我们就可以直接通过命令行

2016-11-21 09:17:01 1619

原创 Node-Event模块简介

Node-Event模块简介Node的大量核心的API都是构建在Event模块上面的,比如stream模块,该模块内置的data事件可在数据到来时触发,一旦stream流对象为可读状态则发送readable事件,当数据读写完毕后发送end事件等。发送事件其实并非stream本身实现,而是借助于Event对象来实现事件的发送和监听回调绑定。本节内容基于现有的Node v5.7版本,介绍了Node的事件

2016-03-01 21:35:44 449

原创 ES2015系列(三) 正则表达式

本节内容我们继续探讨关于ES2015的一些新的内容,在js中我们经常用一些正则表达式去匹配验证一些表单信息,比如email,url,password格式等等。在ES6版本中,引入了一些新的正则表达式的用法,通过这些方法,允许我们实现一些更灵活的的正则验证

2016-02-27 15:20:28 1665

原创 ES2015系列:理解class与prototype继承

本节内容作为ES2015系列的一部分,主要是讨论一下ES6中的关键词class的使用方法,和原有prototype继承之间的关系,并对于一些JavaScript继承的相关内容作了一些简单的分析和总结,欢迎大家一起探讨学习。prototype继承对于JavaScript ES5版本中的继承关系,在JavaScript高级编程指南书中作了详细的介绍,这里我们通过一个实例来探讨一下ES5版本中继承关系是如

2016-02-14 21:38:02 543

原创 ES2016系列: Array.prototype.includes

本篇文章主要是介绍ES2016(ES7)的其中一个数组特性includes,通过实例来对比一下该函数与indexOf的区别以及如何使用es5来实现该特性。函数介绍Array.prototype.includes是在ES2016版本中被引入的一个数组函数,该函数允许我们查询一个对象是否被包含在数组中,可能我们经常使用的传统的方式是indexOf来查询,indexOf通过返回值是否等于-1来获得查询对象

2016-02-14 11:48:28 579

翻译 Express 开发与部署最佳实践

本篇文章翻译自expressjs官方网站,源地址如下:express最佳实践 ,分别从dev角度和ops角度讨论了如何提升express应用的运行性能以及部署的最佳方式。欢迎访问个人blog查看本文内容。针对开发者需要注意的问题对于一个express应用我们,一般有以下的几种方法来提升应用的运行效率以及响应率。使用gzip压缩代码中不要使用同步函数使用中间件处理静态文件合理的日志处理方法正

2016-01-30 13:13:51 949

原创 FTP批量下载

首先关闭交互模式:ftp> promInteractive mode off.这样每次下载完一个不用确认既可以下载下一个文件ftp> promftp> mget *    或  mput *

2015-01-21 11:22:33 632

原创 Ubuntu搭建web环境安装sendmail无法实现(已解决)

安装sendmail是若出现大量的insserv: Starting php5-fpm depends on grub-common and therefore on system facility `$all' which can not be true!insserv: Starting php5-fpm depends on grub-common and therefore

2015-01-07 15:14:20 626

原创 关于无线wifi系统搭建的设计与实施-1

项目需求:搭建一套部门访客使用的WIFI系统,短信验证码登陆,系统OA人员可追踪用户使用时间和时段,并能够获得单个用户访问网站的部分非敏感信息,如URL信息。首先作为一个完整的项目,已实施完成。开通博客后,想将之前的工作内容做一次总结。寄希望有相关项目需求的朋友可有所交流,共同提升。该系统使用场景用于:● 提供无线Internet接入的WISP● 旅馆、餐厅、咖啡店或酒吧…的经营者

2015-01-06 20:41:23 1149

空空如也

空空如也

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

TA关注的人

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