GDB 实现原理介绍

GDB 是调试程序的利器, 它可以在代码中设置断点, 在程序运行过程中修改变量值等. 你是不是也很好奇 GDB 是如何实现这些功能的? 本文会解答你的疑问, 并通过一些简单的代码来模拟其中的实现细节.

阅读全文

区块链框架 Tendermint 入门教程

Tendermint 是一个模块化的区块链应用框架, 能够实现拜占庭容错 (BFT), 它主要包括两部分:

  • Tendermint Core:
    • 实现了 p2p 网络; 在节点之间共享区块和交易;
    • 实现了拜占庭容错的共识算法, 确定了不更改改的交易顺序;
  • ABCI Interface, 具体的逻辑处理层, 可以基于不同的语言 (Golang, JS) 来实现; 在这一层实现交易的验证处理以及查询等操作.

这两部分会分别对应两个不同的进程, Core 和 ABCI 建立了三个连接:

  • 一个用于验证交易的连接, 交易验证通过后会被广播到 mempoll 里;
  • 一个用于区块的 proposal;
  • 最后一个连接用于查询应用的状态;

阅读全文

「Git」底层存储原理详解

本文尝试通过一个示例去详细介绍 git 的底层存储的实现原理.

阅读全文

「Golang」Slice 详解

slice 是 go 里面最常用到的数据结构了, 但稍有不慎, 就会踩到一些坑. 本文会对 slice 的原理及使用通过代码的方式做一个总结和梳理.

阅读全文

VIM 插件管理工具 vim-plug 简明教程

作为 VIM 的重度患者, 一款好用的插件管理工具显得尤为重要, 毕竟给 VIM 增加新功能, 或者是新增编程语言的支持都需要安装插件. 我个人目前安装了 133 款 VIM 插件.

我使用的 VIM 插件管理工具也从早起的 Vundle 到 NeoBundle, 再到现在使用的 vim-plug.

选择 vim-plug , 是因为它:

  • 简洁且快速, 没有外部依赖, 整个插件只有一个文件;
  • 该有的功能都有:
    • 按需加载插件(On-demand loading); 这样可以加快 VIM 启动时间
    • Post-update hooks; 可以在插件安装或者更新时执行一些操作, 如 make 等
  • 还提供了更高阶的功能, 使得安装或更新插件都更快速:
    • 并行化地安装或者更新插件;
    • 按照 shallow 的方式 clone 插件库, 下载更迅速

本文是 vim-plug 的一个简明教程, 会介绍它的安装使用, 以及我个人用到的一些 tips.

阅读全文

网络并发编程模型

网络并发编程模型一般包括三种:

  • 多进程;
  • 多线程;
  • IO 多路复用

本文会着重介绍 IO 多路复用这种编程模型, 包括对 select、poll、 epoll 的介绍.

阅读全文

给 Hexo 博客集成 gitalk 评论系统

之前博客用的是 Valine, 选择它的原因是可以匿名评论. Valine 的缺点是没有办法对新的评论发邮件提醒, 虽然官方文档说是可以的, 但一直没能按文档配置成功.

Gitalk 是一款基于 github issue 的评论系统, 它的缺点是没办法匿名评论, 但鉴于我的博客是技术博客, 大部分读者应该都是有 github 账号的, 这个缺点还是可以忍受的.

阅读全文

使用 Go 进行 Socket 编程

Socket 是对 TCP/UDP 封装后提供的一层接口, 我们可以利用 Socket 编写服务端和客户端, 然后让客户端和服务端建立 TCP 或 UDP 的连接.

阅读全文

进程间通信: 共享内存

Linux 中的进程通信主要包括以下几种方式:

  • 管道(pipe); 流管道 (s_pipe) 和有名管道 (FIFO)
  • 信号(signal)
  • 消息队列
  • 共享内存
  • 信号量
  • 套接字(socket)

本文主要介绍共享内存的使用方式, 其中也会用到信号.

阅读全文

使用 golang 实现 ping 命令

ping 是一个经常被用来检查主机间连通性的工具, 它基于 ICMP 协议实现, 基本原理很简单: 本机给远程机器发送 ICMP 报文, 远程主机接收到 ICMP 报文后便会回复一个类似的 ICMP 报文; 当本机接收到回复后变认为远程主机是可连接的, 否则便认为这个主机是不可达的.

为了了解 golang 的网络编程, 我用 go 实现了一个 ping 命令, 本文会介绍如何实现 ping 命令.

阅读全文