Linux踩坑日记-No such file or directory
前言 近日在添加一个镜像内依赖时,出现了令人非常困惑的现象: 明明依赖文件(an excutable binary)是存在的,但执行却无法找到文件;这篇文章就来记录一下这个问题的解决过程 需要了解的词 32-bit & 64-bit 一般指CPU能处理的最大位数,64位的软件不能在32位的机器上运行,而64位的系统一般这两种类型的都支持 解决过程 确认系统位数及依赖binary的位数 使用uname -a查看系统位数 可以看到x86_64,64位系统 再查看依赖binary的位数,使用file命令(file命令会输出一个二进制文件的详细信息) 可以看到也是x86-64,64位的excutable binary 到这里可以排除位数不兼容的问题,并且只要安装了ia32-libs依赖或是更细粒度的libc6-i386(GNU C Library: 32-bit shared libraries for AMD64),就可以在64位系统(Ubuntu)上运行32位软件了 确认是否缺少依赖 使用ldd <file-name>命令可以检查是否有任何not f ...
Golang-optimization「1」: 数组和切片
前言 本系列的第一个部分,本文就来谈谈日常开发中几乎是最常用的,且在 Golang 中又有一定特殊性的数组和切片中有哪些值得注意的优化点 数组和切片的具体实现 首先我们来谈一谈数组和切片的具体实现 Go 的切片(slice)是在数组(array)之上的抽象数据类型,数组类型定义了长度和元素类型,数组变量属于值类型(value type),因此当一个数组变量被赋值或者传递时,实际上会复制整个数组 由于数组固定长度,缺少灵活性,我们在大部分场景下会选择使用基于数组构建的功能更强大,使用更便利的切片类型 切片使用字面量初始化时和数组很像,但是不需要指定长度: 1languages := []string{"Go", "Python", "C"} 或者使用内置函数 make 进行初始化,make 的函数定义如下: 1func make([]T, len, cap) []T 第一个参数是 []T,T 即元素类型,第二个参数是长度 len,即初始化的切片拥有多少个元素,第三个参数是容量 cap,容量是可选参数,默认 ...
Golang-optimization「0」: 序章
前言 从实习到正式工作,我使用 Golang 作为主力编程语言也已经有两年多的时间了;绝大多数的服务和需求我都会选择使用 Golang 实现,只有对性能不敏感、需要大量文本处理 / 数据处理的场景下我才会选择我的老相好 Python Golang是一门简单的语言,最为大家所推崇的莫过于 Go 的并发,协程加信道,sync 加 select,我觉得很难再有那么一门语言,并发能够做得像 Go 一样简单;其开发者团队一直秉承着“大道至简”的设计理念,但那些存在于各个角落的“简单”特性也让实际使用者们又爱又恨 这两年是我吸收知识最快的一段时间,加上工作上的忙碌,以至于我攒下了许多“要写的文章”,偶尔发出来的文章也是零零散散的一些知识点。我还是希望自己能够希望能够将这些知识真正的体系化起来,不断地完善,而不是仅仅讲零散的知识点打上 tag 那么这个系列我们就来聊一聊我们在Golang日常开发中就可以直接用到的一些简单的性能优化 需要了解的词 L1, L2, L3缓存 L1, L2, L3缓存都是计算机中的高速缓存,是计算机中的快速存储器,它们保存着CPU经常使用的数据,具体区别如下图: ...
Git 进阶使用1
前言 Git 作为全球软件开发者的标配代码管理工具,是程序员离不开的日常伙伴,除了基本的几条命令外,git其实还有很多日常会用到的option,这里以我的个人经验做个总结 Git Merge vs Git rebase 我们要知道的第一件事是,git rebase 和git merge 做的事其实是一样的;它们都被设计来将一个分支的更改并入另一个分支,只不过方式有些不同 想象一下,你刚创建了一个专门的分支开发新功能,然后团队中另一个成员在 master 分支上添加了新的提交。这就会造成提交历史被 fork 一份,用 Git 来协作的开发者应该都很清楚 现在,如果 master 中新的提交和你的工作是相关的;为了将新的提交并入你的分支,你有两个选择:merge 或 rebase Merge 将 master 分支合并到 feature 分支最简单的办法就是用下面这些命令: 12git checkout featuregit merge master 或者,你也可以把它们压缩在一行里 1git merge master feature 最终创建出这样的 workflow: Reb ...
notion 初步使用指南
前言 近期开始使用 notion 管理我的日程、待办等事项,出发点是自己的时间管理能力实在有些欠缺,且平时什么都想干什么都想学什么都想记录。青睐于 notion 的 page 嵌套,模版以及双向 link 关联等功能,最后选择了它(而且它的官方文档很完善很好看!) Notion的中文直译,是「概念」的意思,准确给它下个定义的话,官方说这是一款将笔记、知识库和任务管理整合在一起的协作工具 「协作工具」并非「笔记软件」,Notion 不同于大部分的笔记软件,使用传统的「笔记本-笔记-标签」这一组合设定,它的主要构成是Page(页面)、Block(编辑器)、Database(数据库)。这篇文章总结一下 Notion 初步使用的体验和见解 需要了解的词 iCloud Apple家的文件云端同步系统,并可保证这些数据在所有设备上及时自动更新 Page 一般的笔记软件,就是笔记本+笔记这样1+1的组合。Notion的Page可以是 page 嵌套 page,实现1+n的组合 具体来说,就是Notion中的Page既可以直接写笔记,又可以套上一个子Page: 这些 Page 又可以通 ...
大一统符号还原
前言 从3月中旬到前几天,我的工作重心一直在符号还原服务的重构上;整个重构从提案、方案设计,到难点攻关、核心功能实现,最后到功能验证,性能优化以及搭建监控和压力测试。全程的体验可以说是历尽艰险,但也成就感满满 符号还原系统的开发告一段落,这里我就遵循空雨伞的思考方式来总结下整个重构工作 需要了解的词 symbol demangle 在swift, C++, Rust等语言中,为了唯一标识变量/类/方法等程序实体,编译器以函数、结构、类或其他数据类型的名称对附加信息进行编码,以便将更多语义信息从编译器传递到链接器(如不同包中的同名方法等) 符号还原 根据平台的不同,程序的运行时堆栈中可能充满了内存地址或混淆后的函数名;这样的堆栈是无法阅读的。而符号还原则是将它们转换为人类可读的类名/方法名、文件名和行号的过程。本文中的符号还原泛指iOS、Java Native等内存地址形的符号还原以及Android, javascript等混淆形的符号还原 Android 混淆堆栈 Caused by: java.lang.Exception: Exception at the en ...
浅谈流程 in 2022
前言 工作两年有余,一开始的技术狂热仔也被各种需求磨平了棱角;技术的追求永远存在,但工作中面临的无穷的不确定性,流程上的缺失,让一些技术上很简单的事情带来了成倍的额外成本,下面的小总结来源于一次关于流程的分享会 需要了解的词 SOP 标准操作程序(SOP)是由组织编制的一套循序渐进的说明,以帮助工人进行日常操作。标准作业程序的目标是实现效率、质量产出和业绩的一致性,同时减少沟通错误和不遵守行业法规 SOC SOC负责制定组织的事件响应计划,该计划定义了威胁或事件发生时的活动、角色、责任,以及衡量任何事件响应成功与否的指标。定期测试 CMMI 能力成熟度模型集成(CMMI)是一个帮助组织实现过程改进的模型。开发可降低服务、产品和软件开发风险的行为 流程 流程是什么? 应该要做什么✅ / 实际要做什么❌ 一套成功的标准流程本身就是一个很大的成果,甚至是产品,市面上很多 tob 的解决方案产品其实本质上卖的就是流程 互联网公司发生了什么变化 互联网的红利来源发生了变化,互联网周期也许也到了寒冬周期,不再有“跑马圈地”的时候了(具体原因相信大家心里都有数✊) 变化下流程 ...
Golang panic&recover 详解
前言 近期在编写并发 goroutine 以及超时控制时,出现了意料之外的没有 handle 住的 panic ,导致程序直接退出 具体场景大致如下: 1234567891011121314151617181920212223242526272829303132333435363738394041424344func main() { defer myRecover() ctx, canceller := context.WithTimeout(context.Background(), 1*time.Minute) defer canceller() startTime := time.Now() done := make(chan struct{}, 1) // do task go func() { defer close(done) panic("some panic") done <- struct{}{} }() select { cas ...
一次磁盘清理导致的docker启动失败
前言 近日想要在我的云服务器上安装graphviz时,发现我的根目录盘满了(直到现在也是快满的状态,服务商说根目录无法扩容🤔🤔🤔) 于是通过逐层执行du -h --max-depth=1,我着手删除了一些比较占磁盘空间的文件 并且顺手扩容了这台云主机的磁盘,reboot了一下, 然后我发现我的docker没有正常地自动启动,尝试手动启动也失败了 需要了解的词 systemctl 用于控制systemd服务,类比k8s中的kubectl 软链接(symbolic link) 一个文件在某一路径下的同步链接(不重复占用磁盘空间,且实时同步) Failed to get D-Bus connection 首先遇到的报错就是这个了 12# systemctl start dockerFailed to get D-Bus connection: Operation not permitted 不多废话直接Google,但按大家描述的场景都是在docker容器内使用systemctl时出现的这种情况 具体原因是systemd是需要特权(CAP_SYS_ADMIN)去 ...
记一次国密落地的经历
前言 在一般意义上的后台服务中,身份认证可以保证数据源没有问题,完整性校验可以保证数据没有经过窃听者的篡改,但我们还要防止窃听者知道数据的内容,这就还需要加解密来帮助我们守住最后一道围墙 而在私有云交付的环境中,我们无法用现有的公司平台加解密服务,并且按照国家、金融行业等要求,需要用国密算法实现的加解密方案 国密存在哪些问题 使用不便 最大问题是使用不便。这是由于国密不在IETF国际标准中,不同于ECDSA、ECDH、RSA等国际算法,系统中往往包含相关标准加解密方式,业务数据包通过HTTPS传输时完全不用考虑如何交换公钥,如何加解密数据。 因此现阶段使用国密必须在业务层手动进行数据加解密,相当于对数据进行一步额外的操作。 无最佳实践 确定业务层进行加解密后,应该使用哪一种国密实现、该如何进行加解密是另一个难点,且暂不存在一个最优解。国密的实现方案很多,包括TencentSM、GmSSL和KMS服务器,这也需要进一步的调研和测试来决定最终方案。 国密落地过程 国密落地分为调研、制定、实现与测试四个阶段。 调研阶段主要目的有两个: 找到性能高效、使用便捷并且有足够保障(维护活跃 ...