2021年8月27日quick-debug 项目详见:详见: https://github.com/chinaran/quick-debug 要解决什么问题 随着 k8s 的越来越流行,大多数项目都部署在 k8s 中,开发环境也是。 但调试稍微麻烦,至少需要替换 docker 镜像(此时还需要提 git 提交,CICD 构建镜像,自动或手动部署,时间较长)。 可见即所得的调试(类似前端本地调试或本地有开发环境)对开发者更友好,也会节约很多时间。 应用场景 本地无法搭建……
阅读全文
2021年8月1日httpbin 是什么 A simple HTTP Request & Response Service (written in Python + Flask). 一个简单的 HTTP 请求和回复测试服务。 详见: https://httpbin.org/ httpbin 用途 http 开发调试 httpbin 提供了 GET/PUT/POST/PATCH/DELETET 常见方法,可以把请求头、参数等返回,类似 Echo 服务。方便调试 http 请求。 http 库测试 使用开源或者自己项目封装的 http 请求库,可以把 httpbin 作为服务端,测试各种场景。 除了在线的 https://httpbin.org/,也可以本……
阅读全文
2021年6月24日概览 在调试 golang 程序时,加断点查看变量值固然是一种方法,但更多的时候只是简单的加个 log 看一下。 可以 fmt.Printf("%+v", xxx), 如果想查看 json 还要转换,很麻烦。 于是,我封装了一个简便的 debuglog 库,用于 debug 变量。 详见 https://github.com/chinaran/debuglog debuglog.Val(): 打印变量 debuglog.SpewVal(): 使用 spew 库打印变量(可以详细看到结构体每个字段的定义和值) debuglog.ToJson(): 转成 json 字符串打印 debuglog.ToJsonPretty(): 有缩进和换行的 json 字符串 调试好程序解决 bug……
阅读全文
2021年6月19日概览 在 golang 程序中进行 http 请求时,一般的步骤是: 组合 url 和 param 参数 get 和 put 需要准备请求体数据 进行 http 请求(设置超时) 错误判断和状态码判断 http 返回内容解析 如果后端程序每个 http 请求都如上面这样处理,将产生很多相似的代码, 并且在复制代码的时候,容易出错(需要修改的地方忘记修改),浪费 debug 的时间。 于是,我封装了一个简便的 httputil 库,……
阅读全文
2021年2月17日使用 Hugo 重新搭建了自己的博客 会先把原 CSDN博客 迁移过来 然后更新自己的一些感想和技术文章 欢迎关注……
阅读全文
2018年12月10日灵感来源于 这篇文章 1.标准化 commit message 规范且有意义的提交记录,有助于追踪代码修改和查看历史记录 现在支持以下九种类型(参考 Angular 规范的 commit message) feat: 新功能(feature) fix: 修补bug docs: 文档(documentation) style: 格式(不影响代码运行的变动) refactor: 重构(……
阅读全文
2018年6月20日概览 当调试程序,打印出变量的值时,有可能输出的是八进制 utf-8 编码(尤其是 protobuf 变量) 例如:\346\200\241\346\200\241\346\200 这样的字符串如果作为字面量,go 可以自动转化, 但如果是从文件或 string 中读取,就不行了。 可以使用正则表达式简单处理下 代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18……
阅读全文
2017年12月22日概览 Go 中没有 C 语言 inet_aton 和 inet_ntoa 类似的转换 IP 函数, 所以需要手动封装两个函数 (转换的方法有多种,我选择了简洁的) 实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package main import ( "fmt" "math/big" "net" ) func InetNtoA(ip int64) string { return fmt.Sprintf("%d.%d.%d.%d", byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip)) } func InetAtoN(ip string) int64 { ret := big.NewInt(0) ret.SetBytes(net.ParseIP(ip).To4()) return ret.Int64() } func main() { ip := "192.168.78.123" ipInt := InetAtoN(ip) fmt.Printf("convert string ip [%s] to int: %d\n", ip, ipInt) fmt.Printf("convert int ip [%d] to string: %s\n", ipInt, InetNtoA(ipInt)) } 注:InetAtoN 最……
阅读全文
2017年12月7日概览 通常使用 SQL 语句求百分比时,需求扫描表两次,一次是总数一次是满足条件的个数 其实可以使用 INTERVAL 函数优化,只扫描表一次(在表很大时,几乎可以少花费一半的时间) 示例 假设有一个分数表 TScore,包含班级,学号,平均分这3个字段(class, no, score) 现在想求每个班级的及格率(>=60人数/总人数*……
阅读全文
2017年12月5日概览 当对一个复杂的子查询结果进行分组(group by)聚合计算时, 有时需要进行多次聚合,如果不能复用自查寻的结果,查询效率会很低下 在有些情况下,可以使用 IF 函数进行不同条件的聚合 示例 假设子查询的结果有班级,学号,平均分这3个字段(class, no, score) 现在想求每个班级的总人数和及格人数 复用前 1 2 3……
阅读全文