Latest

代码 Refactoring

重构不必谈之色变。 它也不是洪水猛兽,而是开发过程中持续进行的优化过程。让我们开始学习这个主题,重新认识它的价值。 🌟整洁代码 重构的主要目的是消除技术债务。它将混乱变成整洁的代码和简单的设计。 * 对于其他程序员来说,整洁的代码是显而易见的。 我并不是在谈论超级复杂的算法。糟糕的变量命名、臃肿的类和方法、魔法数字 - 等等,所有这些都会让代码变得混乱和难以理解。 * 整洁的代码不包含重复。 每次你需要对重复的代码进行更改时,你都必须记住对每个实例进行相同的更改。这会增加认知负担并减慢进度。 * 整洁的代码包含最少数量的类和其他活动部件。 代码越少,脑子里需要记住的东西就越少。代码越少,维护工作就越少。代码越少,错误就越少。代码就是责任,保持代码简短。 * 整洁的代码通过所有测试。 如果只有 95% 的测试通过,你就知道代码不整洁。如果测试覆盖率为 0%,你就知道你完蛋了。 * 整洁的代码维护成本低! 🗑️技术债(What) 每个人都尽最大努力从头开始编写出色的代码。可能没有程序员会故意编写不干净的代码,从而损害项目。但是干净的代码在什么时

By brian

CSV 格式说明和应用

问题 我们常常将多个字符串item使用逗号拼接成一个字符串,用来表示数组,使用时再用逗号切割成为数组。比如安卓机型列表: ALN-AL10,ALN-AL10,BRA-AL00,ALN-AL00/ALN-AL80 直到有一天,苹果设备也要用到这个机型列表,而它的每个机型都带着逗号,那我们使用逗号切割就得到了错误的数据。 iPhone15: iPhone15,4 iPhone15Plus: iPhone15,5 iPhone15Pro: iPhone16,1 iPhone15Pro_Max: iPhone16,2 为了解决这个问题,首先想到了换一个分隔符,比如 | ,再比如用一些不可见字符 : 0x01。 但我们不能保证这些字符串 item 一定不包含这些特殊字符,也许还有更好的方法。 既然是逗号分隔,首先想到的就是 CSV格式,毕竟 CSV 的全称就是Comma-Separated Values逗号分隔值。它是如何解决这个问题的? CSV格式 CSV 的RFC说明文档:https://datatracker.ietf.

By brian
开启了http2,但是http2_max_field_size 还在用默认值吗?

开启了http2,但是http2_max_field_size 还在用默认值吗?

排查1个异常接口,学到一个降本和接口提速的新思路。另外找到1个charles的"bug" 现象 测试同学反馈在iOS13设备上请求接口报错,将请求复制为 curl 命令。分别导入 apifox 和 在终端执行: * 在 apifox 请求正常 ✅ * 在终端请求失败 ❌ curl: (56) Failure when receiving data from the peer 测试同学又反馈另一个手机支持请求接口返回正常。 定位 有了正常和错误的请求curl,那直接对比二者差异就很简单了。对比发现,在终端执行失败的请求中多了一个较大的Cookie: app_token。按历史经验基本能确定是因为 Cookie 这个 header 条目太大,超过服务器的限制。 找云平台确定相关配置: ELB http1: header头限制 128KB,body 限制一个10G http2:

By brian

Minikube 操作开启 ipvs

1. 编辑 kube-proxy 配置 编辑 kube-proxy 配置以启用 ipvs 模式。您可以使用以下命令编辑配置: kubectl edit configmap kube-proxy -n kube-system 在配置中,找到 mode 字段并将其设置为 ipvs。例如: apiVersion: v1 kind: ConfigMap metadata: name: kube-proxy namespace: kube-system data: mode: "ipvs" 保存并关闭配置。 2. 重新启动 kube-proxy 重新启动 kube-proxy 以应用新配置: kubectl rollout restart daemonset kube-proxy -n kube-system

By brian

在 Minikube 中直接上手学习 K8S Service

K8S 为什么需要 Service? 1. Pod 的 IP 不是固定的; 2. 一组 Pod 实例之间有负载均衡的需求; 上机操作 以下使用 minikube 作实例: # 安装 brew install minikube # 启动 minikube start # 创建 ~/.kube/config 请注意先备份 minikube update-context # 进入宿主机 minikube ssh 集群启动后,创建 Deployment 和 Service apiVersion: v1 kind: Service metadata: namespace: default name: nginx-svc spec: type: NodePort selector:

By brian
Docker 入门

Docker 入门

1 docker 是什么,解决什么问题? * docker 将要程序和环境一起打包成一个镜像,可保证环境一致性。 * docker 容器启动速度非常快,快速部署和扩容。 * 每个镜像有独立的版本,可以用于快速回滚。 还有依赖管理、资源隔离、可移植性等特点。 2 镜像 2.1 基础镜像是什么? docker 是由多层(layers)组成的,每一层代表镜像的一次变化,这些层叠加在一起,形成一个完整的文件系统。基础镜像是构建容器镜像的起点。可以在其上安装和配置应用及依赖项,就是叠加层。 基础镜像有: alpine (https://hub.docker.com/_/alpine) busybox(https://hub.docker.com/_/busybox) 2.2 Dockerfile 有了基础镜像还不够,还需要安装必要的依赖。我们公司选择的基础镜像是 alpine

By brian
Git hook 开发和实践,提升自动化效率

Git hook 开发和实践,提升自动化效率

我们使用 git 进行版本控制,期间会触发很多事件,这些利用好这些事件做好自动化,能帮我提升效率。git hook 就是一个这样的工具,在特定的事件中执行特定的钩子。 ╰─➤ ls .git/hooks applypatch-msg.sample post-update.sample pre-merge-commit.sample pre-receive.sample update.sample commit-msg.sample pre-applypatch.sample pre-push.sample prepare-commit-msg.sample fsmonitor-watchman.sample pre-commit.sample pre-rebase.sample push-to-checkout.sample 设置钩子路径 git 仓库的钩子存放路径由 core.hooksPath 控制,默认是在项目的 .git/hooks。它不能使用版本控制

By brian

MacOS 安装了最新版 Docker,命令行找不到了?

它藏在 /Applications/Docker.app 中,可以使用 find 命令查看: $cd /Applications/Docker.app $find . -name "docker" ./Contents/Resources/bin/docker 将 bin 目录拼接到 PATH 环境变量即可,一般可以追加到 ~/.bashrc ~/.zshrc 中。 export PATH=/Applications/Docker.app/Contents/Resources/bin:$PATH source ~/.zshrc 使环境变量生效,执行 docker 检查版本 $ source ~/.zshrc $ docker --version Docker

By brian
飞书集成平台 x Grafana:打造监控告警系统全攻略

飞书集成平台 x Grafana:打造监控告警系统全攻略

Grafana告警内容设置 告警内容分为:告警标题、告警说明、告警详情。告警标题和告警说明用来描述告警的规则。告警详情,描述告警的规则和具体的值。 告警详情 Description 设置 1. 打印所有的标签 {{ $labels }} alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1 2. 自定义格式化打印所有的标签 {{ range $k, $v := $labels -}} {{ $k }}={{ $v }} {{ end }} alertname=High CPU usage grafana_folder=CPU alerts instance=server1 3. 打印单个标签 The host {{ index $labels

By brian
Makefile 看这一篇就够

Makefile 看这一篇就够

makefile 是一个文本文件,以下是一个子命令,包含: * 名称:支持英文、数字、连字符"-"和下划线 " _" * 注释:使用 "#" 表示注释,不支持 /*...*/。推荐写在名称的上一行 * 命令:任何可在 shell 执行的命令行语句。必须是\t 开头,否则报错 make: Nothing to be done for 'build'. * .PHONY:可选,命令声明了 .PHONY,执行时将不会输出具体命令到终端。在一些 CI 工具中可以起到过滤敏感信息的作用。 .PHONY: build # 编译构建 build:

By brian
Git 修改提交邮箱和用户名信息

Git 修改提交邮箱和用户名信息

公司项目和个人项目不能耦合特别是发布到公开项目的“提交人”信息最好不要和公司一致; 但,难免忘记配置,需要重新刷; 推荐的方式是,放弃全局配置,每个项目独立配置 user.name user.email 步骤 1. 克隆bare项目 纯仓库 git clone --bare <https://github.com/user/repo.git> cd repo.git 2. 编写脚本 注意替换 OLD_EMAIL CORRECT_NAME CORRECT_EMAIL #!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="old@

By brian

Git rebase合并多个提交

本文介绍了通过 Git 命令操作,文末有 Goland IDEA 的简便操作。 查看日志,找到需要合并的多个分支的上一个起点,比如 18a14636 $git log --oneline d1503601 feat(link_video):埋点统计 ad94a443 feat(bottom_ecmp_policy):策略名称唯一验证修复 043fa7de feat(bottom_ecmp_policy):策略名称唯一验证修复 32fae648 feat(bottom_ecmp_policy):策略名称唯一验证 80cee6b4 feat(bottom_ecmp_policy):按ecpm正序排序 f955a20e feat(bottom_ecmp_policy):新增策略类型'

By brian
一个服务端故障应急响应处理案例|演绎

Posts

一个服务端故障应急响应处理案例|演绎

Chapter 1 发现告警 2023年3月11日,上午11点,这是一个周末,大壮正在刷七猫免费小说,一条告警赫然出现在飞书监控告警群里。大壮点开看一下,虽然平常也会有一些 5xx 出现,但是10%这么高占比的有点离谱。大壮顺手就在飞书群@了值班人员阿新。但是阿新一直未读,过了一分钟,新的告警又来了,5xx占比来到了15%。 Chapter 2 接警启动 大壮意识到问题比较严重,立即将最新的告警消息创建了话题,@了Teamleader 阿茂。同时根据《业务线负责人和值班文档》多维表格文档,确定了业务线 owner 小美为【快恢负责人】,在话题中@了他。值班人员阿新同时也是项目的专职【通讯员】之一,也在话题群里@了阿新。接着发起了和小美、阿茂、阿新4人的视频会议。 视频会议: 小美、阿茂上线,阿新依然不在线。大壮反馈了问题;Teamleader

By brian

Posts

文档自动化|apifox分享

大家都知道接口文档的收益很高,但是编写接口文档可能被认为是耗时且繁琐的任务,而且开发人员可能更愿意专注于实际的编码工作。 文档有时候也有它的主要问题,一般是不准确,并且往往是因为过时了。如果不能一直保持百分百正确的文档是不能被信任的。 文档界诞生了一个活文档的概念,并且有以下四个原则: * 可靠:无论何时,文档都是准确的,并且与所交付的软件保持同步。 * 省力:最大限度的减少文档的工作量,即使软件发生了变更、删减或者添加,也仅需少量的额外工作。 * 协作:活文档可以促进所有参与者之间的对话和知识共享。 * 有见地:活文档会将人们的注意力引导到工作的各方面,从而提供反馈机会并鼓励深入思考。 今天我想和大家探讨前两点:可靠和省力。 接口文档自动化 protobuffer + protoc 插件 + openapi ,我认为是这一个“银弹”。 我们可以使用 proto 原型文件 + 插件 protoc-gen-gin-http 生成接入层的接口路由代码。还可以使用 proto 原型文件 + 插件 protoc-gen-openapi 生成 openapi 文件。 P

By brian

Go

Go 多版本管理

新项目多采用 Go 的新版本,但老版本同样需要支持。版本管理略麻烦,查下来有4种方案,有的已不再维护了。 * brew switch * goenv * gvm * 自己编写简单的 Shell 脚本 前两个都不在维护;gvm 需要下载Go源码编译,时间略长。 看来自己编写 Shell 脚本可能是目前最好的方案;要做到 2 件事。 1. go 要指向正确的版本; 2. 正确的 GOROOT 环境变量; 第一种写法,修改软链,使用 gsed 变更 .zshrc 配置文件。(gsed 是 gnu 版本的 sed 与link 参数保持一致,brew install gsed 即可)。 gov18.

By brian

Git 开发流程 git-flow

Git-Flow是什么 Git 诸多命令就像一个个零件,代码管理是够用的。但是工程化代码管理尤其是团队协作的工程化,就需要这些零件整合起来,形成一套工作流。Git Flow 就是这么一套工具。 http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html 安装 brew install git-flow-avh 初始化项目 git flow init # 然后一路回车 Which branch should be used for bringing forth production releases? - main Branch name for production releases: [main] Branch name for "

By brian
一种好用的接口请求和响应格式规范,基于Google Json Style

一种好用的接口请求和响应格式规范,基于Google Json Style

简述 1. 基于较为流行的谷歌 json 风格 google json style 1. 英文 https://google.github.io/styleguide/jsoncstyleguide.xml 2. 中文 https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md 2. 所有字段驼峰命名,接口使用:get post 1. get 获取数据 2. post 更新数据 3. post:请求 body 数据使用 application/json, 不使用 FormData; 4. 响应成功,

By brian

web后端开发chrome浏览器设置

切换 host 之后,清除 dsn 缓存 访问链接 chrome://net-internals/#sockets 点击 Flush socket pools 一次,其他都不用点击了。 搜索引擎设置 访问搜索引擎设置页面 chrome://settings/search 管理搜索引擎和网站搜索-网站搜索-添加 1. cmd/ctrl + L 定位到浏览器链接输入框, 2. 输入 dict 按下 Tab 3. 输入想要翻译的单词 4. 按下 Enter 看似四步,简单上手后一气呵成! 多搜索引擎管理 不同的搜索内容,应该使用不同的搜索引擎,就像你不能在 baidu 搜索技术关键词一样。 你可以设置,google搜索,输入 goo 按下

By brian
PHP 项目的用户密码设计

PHP 项目的用户密码设计

简单聊一聊用户系统的密码存储设计。 历史变迁 首先,最开始大家用的都是明文存储用户的密码,想着,反正存储在服务端,也只有服务端看得到, 但这些年这么多脱裤事件,终于意识到不能再使用明文了, 于是,大家改用 md5 等哈希算法,为用户密码“加密”,但数据库泄漏后,仍然可以使用 字典攻击 破解。字典攻击 是用一个字典文件,储存了单词、短语、常用密码和他们 hash 后结果。将密码与 hash 结果对比,就能破解。 为了解决这个问题,研发工程师又在密码的hash的过程中加 salt, salt是一串随机值,与 hash 后的密码一起保存在数据库。  这恐怕只能使用暴力破解了,但现在GPU的发展,使得暴力破解成为可能,如果被脱裤,则更容易破解。 同时期的 GPU 的计算单元比CPU多, L1/L2/L3缓存和控制器较少, 所以GPU非常适合做并行且无需内存参与的计算任务。 解决方案

By brian
显示 vscode 的 tab 和空格

显示 vscode 的 tab 和空格

文字中的空白到底是tab和空格? 开发测试过程中,我们可能需要构造各种tab分割的文本数据,然而默认配置下,输入tab,就被转化成了4个空格,为了避免这些坑,我们来尝试做些处理。 显示空白 设置中搜索renderWhitespace,设置为all 这个时候,就能看出空白到底是tab还是空格,如图: 这一步操作不仅能显示tab和空格,而且区分了 tab 和 空格 * 拷贝文本,保留tab * 输入文本,替换tab为4个空格

By brian
沪ICP备2022013452号-1