- 博客(189)
- 收藏
- 关注
原创 go: play with so source code. Go源代码编译和调试
vscode编译go编译的主要入口是(windows则是):有两个环境变量值得注意:必须在目录运行。日志:运行编译完成的;误区1: 直接调试 src/cmd/go虽然src/cmd/go能够编译成,但是如果直接使用系统的工具编译:必须使用才能编译出当前目录的。......
2022-06-26 12:55:14 273
原创 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 471
原创 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 1681
原创 关于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 1542
原创 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 725
原创 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 910
原创 文件同步(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 638 1
原创 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 414
原创 7层负载均衡和4层负载均衡
Layer 77层负载均衡,即作为负载均衡器,可以解析请求的应用层数据(包括使用TLS证书)。一句话总结:根据请求数据做决策。根据应用层的数据决定要建立连接的下游:GET /picture Picture Server1 \ Picture Server2 \
2021-12-09 22:26:14 763
原创 API Gateway
传统Web应用传统的web应用将业务逻辑和身份认证、证书安全等逻辑混合在一起。关注点分离特点1: 证书安全,身份认证,权限校验分离身份认证、鉴权、SSL证书终止、DDoS保护特点2:服务拆分将业务逻辑拆分为多个微服务、多个微服务使用同一个API Gateway。例如:静态文件分发,缓存,组装特点3:负载均衡负载均衡,A/B测试,灰度上线API Gateway例子...
2021-12-09 22:02:08 137
原创 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 745
原创 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 472
原创 买卖股票的时机
简介买卖股票系列的问题,注意思考点是固定某一天卖出,可以得到子问题。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 236
原创 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 1807
原创 线段树-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 172
原创 堆排序和优先级队列
堆堆是一种建立在数组之上的数据结构,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 100
原创 并查集算法
不相交集合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 155
原创 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 1388
原创 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 607
原创 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 1796
原创 kafka安装和使用
基本介绍事件流:由DB,传感器,移动设备等产生事件,然后由事件系统进行存储以便后续进行检索,并将事件实时的发送给其他系统。因此,事件流保证了数据变化处理的及时性,准确性。事件流的应用:交易系统,如金融,股票实时交易监控车辆IoT设备订单Kafka实现了以下功能:发布和订阅,这意味着你可以将Kafka看做一个数据平台,在其上发布数据,或者订阅其他方的数据存储事件处理事件Kafka的基本架构:Kafka是一个分布式系统,由一系列服务器和客户端通过TCP协议通信,服务器:多个.
2021-10-19 22:10:02 116
原创 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 170
原创 文件使用量: 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 92
原创 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 720
原创 服务性能指标和压测指引
基本原理压测的主要目的是对目标服务的特定指标进行压力测试,衡量服务的服务能力,根据压测的结果,对服务的承受能力进行预估。服务能力相关的指标:吞吐量(QPS)响应时间其他指标:内存为了得到上述指标,需要对目标服务进行大量的请求得到统计数据。不同指标的测试方法略有不同吞吐量 = 可服务的最大请求数量/时间响应时间 = 请求返回时间 - 请求到达时间内存 = 在特定吞吐量下的内存申请的最大值注:可服务是指系统还可以继续处理新的请求,一般而言就是CPU的使用率达到某个阈值就认
2021-10-09 20:27:28 646
原创 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 81
原创 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 270
原创 go coverage 覆盖率工具
文章https://go.dev/blog/cover测试覆盖度定义:Test coverage(测试覆盖度)用于衡量一个包中的代码被测试用例覆盖的程度。如果运行所有的测试用例能够触发包中80%的代码运行,我们就认为测试覆盖度为80%。通常情况下,要计算测试覆盖率,需要对执行文件进行二进制拦截,比如gcov工具:通过在每个逻辑分支之后添加一个断点,来标记这个分支是否被执行到。这种基于二进制拦截的方法移植性不够好,需要针对不同CPU架构来实现。go test -cover通过对源代码进行重写,在分
2021-09-22 23:19:36 3429
原创 redis高可用:主从复制(replication)
文章https://redis.io/topics/replicationredis高可用由3部分组成: 主从复制,redis cluster,redis哨兵。基本思想redis主从结构中,从节点连接到主节点,并成为主节点完全一样的副本。当连接断开时,从节点自动重连。主从连接时,主节点将所有的操作完整地发送到从节点上当主从因为超时或网络原因断开连接时,从节点重连到主节点上,并执行部分同步当无法进行部分同步时,执行全量同步,主节点需要生成RDB备份,发送给从节点异步ACK:主从之间使用异步
2021-09-20 17:53:15 262
原创 字符串编码(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 2665
原创 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 97
原创 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 2274
原创 跳表(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 144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人