arm交叉编译器的区别
为什么要用交叉编译器?
交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。
交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。
建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,但就以学习为目的来说读者有必要学习自己制作一个交叉编译工具链(目前来看,对于初学者没有太大必要自己交叉编译一个工具链)。
在树莓派arm上运行golang和c程序
深入了解CPU和芯片
芯片(Chip) 是物理形态。它是指那一小块黑色的、有引脚的半导体封装体。CPU(Central Processing Unit) 是功能定义。它是指计算机中负责解释指令和处理数据的核心逻辑单元。
关系: 芯片是 CPU 的物理载体,但芯片不等于 CPU。
- 以前,CPU 就是一块独立的芯片。那栋 “ 房子 “ 里只住了 “ 总经办 “ 这一个部门。所以那时候指着芯片说 “ 这是 CPU” 是完全准确的。
- 现在情况变了。为了便携和高性能(比如你的手机或 Apple M 系列电脑),工程师把 CPU(总经办)、GPU(绘图部)、NPU(AI 部)、Memory(档案室)全部塞进了同一块芯片里。
- 现在的芯片(SoC) = CPU + GPU + 内存控制器 + 其他。
transmission编译安装和golang_rpc的调用
golang_runtime函数调用信息
函数的调用信息是程序中比较重要运行期信息, 在很多场合都会用到(比如调试或日志)。
Go 语言 runtime 包的 runtime.Caller / runtime.Callers / runtime.FuncForPC 等几个函数提供了获取函数调用者信息的方法.
这几个函数的文档链接:
runtime.Caller的用法(常用)
函数的签名如下:
1 | func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool) |
runtime.Caller 返回当前 goroutine 的栈上的函数调用信息. 主要有当前的pc 值和调用的文件和行号等信息. 若无法获得信息, 返回的 ok 值为 false.
golang闭包的坑
1. 循环内goroutine使用闭包
1 | func main() { |
改进:
1 | func main() { |
不会rebase就等于没学过Git
什么是rebase
Rebase对于很多人来说是一个很抽象的概念,也因此它的学习门槛就在于如何了解这个抽象的概念。对于rebase 比较恰当的比喻应该是「移花接木」,简单来讲把你的分支接到别的分支上,稍后我们用几个图来示范merge与rebase 的差异。
了解rebase之前,我们必须了解什么是base。对Git的使用者而言,在分支中进行开发活动是稀松平常的事情,也因此在合并管理分支时,也就需要了解分支是在哪个时间点哪个提交点分出来的旁支,而长出旁支来的提交点,对于旁支来说就是base commit,也就是base。所以简单来说,rebase其实就是改变分支的base的功能。
下图是在merge的情况会产生的版本演进的示意图,可以看到在新的分支中所做的变更,在合并之后,一并成为一个新的提交(commit 6)。而commit 1就是New Branch的base。

使用esayrsa生成ssl证书
下载release版本
https://github.com/OpenVPN/easy-rsa/releases
配置公钥基础设施变量
1 | cp vars.example vars |
修改内容示例
1 | set_var EASYRSA_REQ_COUNTRY "CN" |
