自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 收藏
  • 关注

原创 【网络】HTTPS协议

HTTPS协议Scratch HTTPs

2019-12-30 12:13:00 2795

原创 使用xgo在单测中进行Mock

xgo是一个使用纯go实现的单元测试框架,集成了Mock, Trace, Trap等功能。

2024-04-05 17:15:55 300

原创 xgo: golang基于-toolexec实现猴子补丁

使用go -toolexec指令, 实现动态函数拦截

2024-04-05 15:49:57 1324

原创 mysql date/datetime/timestamp and timezone

关于mysql的时间和时区

2023-04-06 10:56:52 518 1

原创 etcd http API

etcd v3 HTTP API示例

2022-09-29 10:36:31 1148

原创 qemu: aarch64 + ubuntu image

qemu + aarch64 + ubuntu

2022-07-10 17:38:44 1049

原创 go: play with so source code. Go源代码编译和调试

vscode编译go编译的主要入口是(windows则是):有两个环境变量值得注意:必须在目录运行。日志:运行编译完成的;误区1: 直接调试 src/cmd/go虽然src/cmd/go能够编译成,但是如果直接使用系统的工具编译:必须使用才能编译出当前目录的。......

2022-06-26 12:55:14 240

原创 go test, go bench & go examples

链接https://pkg.go.dev/testinggo test运行TestXXX函数,go源码中的例子:https://github.com/golang/go/blob/go1.17/src/strings/strings_test.go包名:xxx_testgo test -run namego test -run name和go test -bench name的name参数是一个正则表达式,除非使用^...$,否则它们将执行部分匹配。例子:go test -run ''

2022-06-25 22:10:53 411

原创 MySQL事务并发简述

介绍我们将会实验不同并发场景下,MySQL事务的表现,并结合MVCC进行分析。总结:数据有两个状态: txn_seq和commited标记。读数据只能读到当前事务提交的数据或者txn_seq小于当前seq且已经提交的数据。而写数据,因为存在锁,所以遵循的原则是last commit wins.为什么是last commit wins?因为last commit意味着最后获得锁,这意味着该所有此前获得锁的事务已经提交。此外,数据的txn_seq是提交时的全局txn,而不是事务开启时的txn。我们

2022-01-27 18:44:54 1522

原创 关于bash quote的认识

问题的背景:参数注入在shell中,我们希望将参数传递给子命令,如下面的例子:假设我们有一个http服务,它接受一个cmd参数,并将其传递给bash -c执行:// curl 'localhost:8080/demo?cmd=echo hello'handler(req,res){ const cmd = req.query.cmd; const process = child_process.exec(`bash -c "${cmd}"`); // ... }显然

2022-01-02 21:43:06 1285

原创 x86 hello world(qemu bootloader)

boot loader的基础x86芯片总是从16位实模式启动,bios依次查找https://stackoverflow.com/questions/32508919/how-to-produce-a-minimal-bios-hello-world-boot-sector-with-gcc-that-works-from-a初始情况下,int 0x10中断向控制台输出寄存器al指向中的字符,lodsb指令可以将字符从si指向加载到al中,并移动一个字节。lodsb -> al=*si++

2021-12-25 09:10:51 652

原创 nc: netcat网络工具

功能端口监听端口扫描nc -z -v site.comssh ProxyCommand基本选项-p source_port 源端口当使用-l时,-p和命令行端口参数具有相同的作用。如果同时给定,-p具有更高的优先级-n 禁用DNS查找,即将参数当作IP地址-e /bin/bash 连接成功之后执行bash-x host:port 代理主机-X 4|5|connect proxy的协议,4表示SOCKS4,5表示SOCKS5,connect表示http隧道-u 使用U

2021-12-20 23:03:00 771

原创 文件同步(mutagen.io + rsync)

模型: 公司 <=> 虚拟机(VPN) <=> Home在这种模型中,白天在公司,使用公司的Mac;晚上回家,使用家中的笔记本。为了同步两边的代码,使用下面的安全模型:# 注意:使用rsync同步时,每个目录都要以/结尾# 公司 <=> 虚拟机 rsync同步到 ~/company-backedecho "syncing company to VM"rsync -r ~/company-backed/ user@devhost_rsync:/ho

2021-12-20 21:35:50 545 1

转载 转载:TUN/TAP Demystified

https://floating.io/2016/05/tuntap-demystified/

2021-12-15 22:03:17 89

原创 bash 变量替换与with-xxx脚本

变量替换变量替换发生在参数之前。对比下面两条命令:$ bash -c 'A=10;bash -c "echo $A"'10$ bash -c "A=10;bash -c 'echo $A'" # 输出空$ bash -c "A=10;bash -c \"echo $A\"" # 输出空$ bash -c "A=10;bash -c \"echo \$A\"" # 会对""内的参数进行替换10with-xxx通常,我们使用with-xxx来临时性改变环境变量,以便在特定环境下执行命

2021-12-11 15:40:22 386

原创 7层负载均衡和4层负载均衡

Layer 77层负载均衡,即作为负载均衡器,可以解析请求的应用层数据(包括使用TLS证书)。一句话总结:根据请求数据做决策。根据应用层的数据决定要建立连接的下游:GET /picture Picture Server1 \ Picture Server2 \

2021-12-09 22:26:14 723

原创 API Gateway

传统Web应用传统的web应用将业务逻辑和身份认证、证书安全等逻辑混合在一起。关注点分离特点1: 证书安全,身份认证,权限校验分离身份认证、鉴权、SSL证书终止、DDoS保护特点2:服务拆分将业务逻辑拆分为多个微服务、多个微服务使用同一个API Gateway。例如:静态文件分发,缓存,组装特点3:负载均衡负载均衡,A/B测试,灰度上线API Gateway例子...

2021-12-09 22:02:08 109

原创 homebrew的基本结构和扩展使用

开发手册https://docs.brew.sh/Formula-Cookbook#homebrew-terminologyhomebrew cheat sheet概念摘要:brew config 列出当前homebrew的配置brew ls 查看已经symkink的包brew edit git 编辑git的安装规则homebrew所有的包(称为Keg)安装到Cellar目录中,Cellar目录如:/home/cat/homebrew/Cellar.配置展示:$ brew c

2021-11-28 14:20:53 681

原创 raft协议

链接youtube:Designing for Understandability: The Raft Consensus Algorithm共识问题在一堆机器中,达成关于某个值的共识。在2PC中,只需要达成true/false的值,所以2PC可以认为是简化的共识问题。Raft的几个问题Raft是为了简化Paxos而诞生的,Paxos过于抽象,并且对于实际问题过于简陋。Raft要解决的基本问题包括:选主选择一个机器作为Leader检测Crash,在Crash之后选择新的Leader

2021-11-13 16:09:16 445

原创 买卖股票的时机

简介买卖股票系列的问题,注意思考点是固定某一天卖出,可以得到子问题。121. 买卖股票的最佳时机 (Easy)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这

2021-11-13 01:10:44 215

原创 go: int和int32

int和int32的大小都是4字节码?根据go的文档,int是至少32位,但是在64位机器上就是64位的。int is a signed integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for, say, int32.这一点需要注意。unsafe.Sizeof(int(0)) // 64位机器:8; 32位机器:4...

2021-11-07 22:37:39 1764

原创 线段树-Segment Tree

问题:给定一系列区间I,一个点q,找出所有包含q的区间问题来源:http://www.cs.nthu.edu.tw/~wkhon/ds/ds10/tutorial/tutorial6.pdf线段树https://en.wikipedia.org/wiki/Segment_tree假设有n个区间,所有的区间的端点(包括左端点和右端点)至多有2n个。将这些端点排序,构成基本区间(elementary interval):(-∞,p1), [p1,p1],(p1,p2),[p2,p2],(p2,p3),

2021-11-07 22:37:12 137

原创 堆排序和优先级队列

堆堆是一种建立在数组之上的数据结构,A[i]的左右子结点是A[2*i+1], A[2*i+2],且满足A[i]是这3个数中最小的(或最大的那个)。heapify过程描述了如何将某个结点从i处“下沉”到合适的位置:# 最大堆heapify(A,i,heapSize): # 也可以叫做 sink(A,i,heapSize), java优先级队列的命名就是sink L, R = 2*i+1, 2*i+2 largest = i if L < heapSize &&a

2021-11-07 22:34:55 79

原创 并查集算法

不相交集合makeSet(v)返回一个单个元素的集合makeSet(x): x.p = x x.rank = 0union(x,y): link(findSet(x),findSet(y))# link优先选择rank较小的粘贴到rank较大的根上,避免树变深link(x,y): if x.rank > y.rank: y.p = x # 注意:x.rank没有增加 else: x.p = y if

2021-11-07 22:34:39 121

原创 bosun 除法使用注意事项

问题需要计算两个服务集群的QPS/虚拟机数量,以便得出单机QPS。查询的tag如下:# 查出新服务和旧服务的qps$qps_old=q("sum:rate{counter}.frameworkA.old_service.throughput{service_interface=Enter,to_cluster=$cluster}", "$start", "")$qps_new=q("sum:rate{counter}:frameworkB.new_service.throughput{cluste

2021-11-04 16:57:53 1241

原创 kafka事务

文章权威来源: https://cwiki.apache.org/confluence/display/KAFKA/KIP-98±+Exactly+Once+Delivery+and+Transactional+Messaging概述生产者幂等配置:enable.idempotence。幂等机制:每个producer每次启动时,都会获得一个ProducerID和序列号。broker要求新收到的消息序列号小于等于已确认的消息,这些消息被忽略序列号恰好等于已确认的消息+1,这个消息会被记录为最新

2021-10-23 23:14:20 567

原创 macos 命令行连接wifi

文章https://sharmank.medium.com/how-to-connect-to-wifi-using-mac-os-command-line-3a76c2e6669c命令# 列出所有的wifi,第一列是SSID/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s# 连接WiFinetworksetup -setairportnetwork en0

2021-10-20 08:14:52 1458

原创 kafka安装和使用

基本介绍事件流:由DB,传感器,移动设备等产生事件,然后由事件系统进行存储以便后续进行检索,并将事件实时的发送给其他系统。因此,事件流保证了数据变化处理的及时性,准确性。事件流的应用:交易系统,如金融,股票实时交易监控车辆IoT设备订单Kafka实现了以下功能:发布和订阅,这意味着你可以将Kafka看做一个数据平台,在其上发布数据,或者订阅其他方的数据存储事件处理事件Kafka的基本架构:Kafka是一个分布式系统,由一系列服务器和客户端通过TCP协议通信,服务器:多个.

2021-10-19 22:10:02 97

原创 go select的正确用法

select关于select的一个错误使用方法,请看下面的两份代码:代码:函数returnAfter3s是一个执行时长为3s的函数,主函数中设置了1s的超时。期望执行发生超时,也就是正常来说,1s后应当打印case after 1s。两段代码的不同之处在于,左边的代码syncChan是同步写入的,没有另起goroutine写入;右边的asyncChan开启了一个新的goroutine写入。执行结果:左边的是returnAfter3s这个函数先执行(3s时间),然后才是case after

2021-10-19 17:15:34 142

原创 文件使用量: du+sort

# -d maxdepth# -h human readabledu -d 4 -h > du.txt# -h human readable size, 特指SI后缀,如1K,1M# -r reverse 逆序# -k 1 取第一个域作为keysort -hrk 1 du.txt > du.sorted.txt

2021-10-17 23:41:54 70

原创 metrics查询原理

存储结构基本数据结构:type DataPoint struct{ Timestamp int64 Value float64}type DataPointSet []DataPointtype Tag struct { Key string Value string}type TagSet []Tagtype InputRecord struct{ MetricName string Tags TagSet Dp D

2021-10-09 20:59:52 572

原创 服务性能指标和压测指引

基本原理压测的主要目的是对目标服务的特定指标进行压力测试,衡量服务的服务能力,根据压测的结果,对服务的承受能力进行预估。服务能力相关的指标:吞吐量(QPS)响应时间其他指标:内存为了得到上述指标,需要对目标服务进行大量的请求得到统计数据。不同指标的测试方法略有不同吞吐量 = 可服务的最大请求数量/时间响应时间 = 请求返回时间 - 请求到达时间内存 = 在特定吞吐量下的内存申请的最大值注:可服务是指系统还可以继续处理新的请求,一般而言就是CPU的使用率达到某个阈值就认

2021-10-09 20:27:28 555

原创 go context

WithTimeoutpackage ctxtestimport ( "context" "testing" "time")// go test -run TestCtx -v deprecated_loader/ctxtest/*.gofunc TestCtx(t *testing.T) { ctx := context.Background() // WithTimeout will start a timer, after which ctx's Done is closed

2021-10-09 18:05:50 58

原创 git rebase

介绍git rebase最主要的功能:通过移动某些commit,将当前分支的起始节点重置为目标分支,并且最终实验准备2个分支首先,初始化一个仓库:mkdir git-rebasecd git-rebasegit init# 添加一个空文件touch a.txtgit add a.txt# 初始提交git commit -m "init"# 创建feat分支git checkout -b feat我们将会在这个仓库上建立两个分支:master和feat;仓库中我们建立一个a.t

2021-09-27 22:28:16 240

原创 go coverage 覆盖率工具

文章https://go.dev/blog/cover测试覆盖度定义:Test coverage(测试覆盖度)用于衡量一个包中的代码被测试用例覆盖的程度。如果运行所有的测试用例能够触发包中80%的代码运行,我们就认为测试覆盖度为80%。通常情况下,要计算测试覆盖率,需要对执行文件进行二进制拦截,比如gcov工具:通过在每个逻辑分支之后添加一个断点,来标记这个分支是否被执行到。这种基于二进制拦截的方法移植性不够好,需要针对不同CPU架构来实现。go test -cover通过对源代码进行重写,在分

2021-09-22 23:19:36 3087

原创 redis高可用:主从复制(replication)

文章https://redis.io/topics/replicationredis高可用由3部分组成: 主从复制,redis cluster,redis哨兵。基本思想redis主从结构中,从节点连接到主节点,并成为主节点完全一样的副本。当连接断开时,从节点自动重连。主从连接时,主节点将所有的操作完整地发送到从节点上当主从因为超时或网络原因断开连接时,从节点重连到主节点上,并执行部分同步当无法进行部分同步时,执行全量同步,主节点需要生成RDB备份,发送给从节点异步ACK:主从之间使用异步

2021-09-20 17:53:15 222

原创 字符串编码(utf8)

文章Things about Unicode everyone needs to knowgolang: Strings, bytes, runes and characters in Go编码发展的历史早期自由定义的编码集ASCII码的起源:1.英文字符可用127以内的数字映射,需要7位;2.最初的计算机都是8位的在ASCII码中,0~32范围的字符称为控制字符,是不可打印的。接着,不同的制造商就对128~255编码进行自定义。IBM-PC定义了OEM字符集,提供对某些欧洲语言的字符进行表

2021-09-20 00:35:04 2431

原创 go slice结构

文章slice介绍append的机制slice tricksgo dataslicearray的语法: [4]int{1,2,3,4}, [...]int{1,2,3}。在go中array是值类型,这就意味着一个类型为array的变量名并不是一个指针,当传递值是,array总是被复制。slice的语法: []int{1,2,3,4}, make([]int), make([]int,10)当make只有两个参数时,cap和len相同。slice本质上是array的一个片段的描述,它包含3部

2021-09-13 22:15:05 76

原创 java泛型

泛型泛型,即带有类型参数的类型。关于C#,Java, C++的泛型比较,C#的实现者有一个专门的采访。这个文章中提到,C#的泛型是为每一种具体的类型生成一个类,在运行时生成,所以基于反射可以获取具体的类型代码;而Java的泛型,为了兼容以前的VM。Java泛型的缺点在于,编译器手动加上了强制转换,所以执行效率并没有提升,只是起到语法糖的作用。关于Java的泛型实现,可以参考JSR-14(google中搜索Adding Generics to Java),参考https://cr.openjdk.ja

2021-09-01 10:26:59 2092

原创 跳表(skiplist)及redis实现

解决的问题基本结构跳表是一个基于概率构造的数据结构。跳表由层构成,第i层的元素在第i+1层出现的概率是一个固定值:p(通常是1/2或1/4).跳表的最底层是一个排序的链表。[4] 30 NIL[3] 30 50 NIL[2] 30 50 70 NIL[1]

2021-08-30 23:04:25 132

空空如也

空空如也

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

TA关注的人

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