Kafka 入门教程

Kafka 现在在我们公司使用的很广泛, 如用作 AdServer 的日志收集和 Counter 服务的消息系统等.

本文会先介绍下 Kafka 的一些基本概念, 然后介绍如何搭建 Kafka 集群和如何使用, 最后会简要介绍下 Kafka 文件存储的实现原理.

阅读全文

给 maupassant 主题添加文章版权信息和推荐阅读功能

在网上看过别人的博客主题后, 发现我现在用的 maupassant 主题缺少了两个实用的功能: 在文章末尾添加版权信息和相关文章推荐阅读.

既然缺少功能, 那就参照别人的代码添加上对应的功能呗, 这就是我为什么选择自己搭建独立博客的原因: 可以随心所欲地进行定制化.

阅读全文

用 go 实现简易版的请求限流和流量统计

最近项目需要用到限流和统计流量的功能, 便用 go 基于计数器的原理简单地实现了这两个功能.

阅读全文

利用 Surfingkeys 快速分享博客到开发者头条或掘金

为了能给博客增加访问量 (虽然访问量依然很低 [捂脸]), 我经常会把写好的博客分享到开发者头条和掘金.

之前是装了开发者头条和掘金的 Chrome 插件, 每次都分别需要点一下插件进行分享. 但单单是为了分享文章就要装两个插件也是很不值得了, 而且这两个插件平时也基本都用不上, 我也是一般都是在分享完博客之后就把它们关闭了. 这里强烈安利一款 Chrome 插件 Steward, 号称是 Chrome 上的 Alfred , 通过它可以很方便地开启或者关闭某个特定插件.

后来发现通过插件进行分享时只是简单地打开了一个网页, 同时添加上了你博客的网址和标题. 就是类似下面这样一个网址:

https://toutiao.io/contribute?url=your_blog_url_encoded&title=your_blog_title_encoded

打开网页谁不会呀, 只要能获取到页面的 url 和 title . 这时想起我常用的 Chrome 插件 Surfingkeys 提供了映射特定的按键到某个 javascript 函数的功能, 通过 javascript 来获取页面的 url 和 tile 就再容易不过了! 当我们实现这个 javascript 函数之后 就能按几个键打开开发者头条和掘金的分享页面了, 说干就干, Let’s start to hack it out!

阅读全文

给 Vim 插件添加上异步调用的功能

一些 Vim 插件可能因为计算密集或者是访问网络资源导致命令调用特别慢, 进而导致 Vim 的操作界面被 hang 住, 时不时地 hang 一下还是很影响流畅度和编码心情的 ):

还好在 neovim/vim8 中添加了对异步调用的支持, 我们可以利用 job 机制让耗时的操作在后台执行, 然后通过 callback 机制把处理结束后的结果输出. 加上异步操作后, 各种操作都如丝般润滑, 再也不用担心卡顿了 (:

下面我就以插件 vim-youdao-translater 为例来介绍如何给插件添加上异步调用的功能.

阅读全文

实现类 Postman 功能的 VIM 插件

在实现 Web Server API 的时候, 经常需要发送指定的 http 请求来验证对应的返回是否符合预期. 我们可以通过 Postman 来实现这个功能, 但这就需要在编辑器和 Postman 这两个软件之间来回的切换, 当修改代码的频次比较高时来回的界面切换还是比较影响效率的.

作为资深 Vim 党, 就在想能不能直接在 Vim 里面就实现类似 Postman 的功能: 发送请求, 然后在一个新的 Vim 窗口里显示返回结果.

还真找到了一个实现了这个功能的插件 vim-rest-console, 通过这个插件, 我们可以在一个 Vim 窗口里编辑 http 请求, 按 <Ctrl-j> 之后就可以在另外一个 split 的窗口中显示 http 请求的返回结果. 效果如下图所示:

这个插件是通过 curl 发送 http 请求, 然后把命令的输出放在了一个 split 的 Vim window 里面.

阅读全文

Vim 文件快速跳转插件

日常使用 VIM 的时候经常有跳转到特定目录下某个文件的需求:

  • 使用 vimwiki 记笔记时会默认把所有笔记保存在目录 ~/vimwiki 下, 当我们想查看某个笔记时就打开那个目录下的某个文件;
  • 我平时会写一些 shell 工具, 保存在 ~/bin 目录下, 就会有在这个目录下创建或者打开文件的需求;
  • 如果你用 ultisnip 之类的插件的话, 就需要经常编辑不同类型文件对应的 snippets 文件;

根据我个人的使用经验, 在特定目录下打开某个文件 的需求还是很多的, 于是便写了插件 FileJumper 来实现这个需求.

这个插件提供了下面这些功能:

  • 通过一行配置能快速定义和某个目录绑定的 command;
  • 通过执行 command filename 能快速打开对应目录下的某个文件, 能通过 tab 键补全文件名;
  • 能通过指定不同的 vim 命令以不同的模式打开文件, 如 command filename vnew 等;

下面就会介绍如何安装, 配置已经使用这个插件.

阅读全文

关于栈内存分布的一道有趣的面试题

偶然间看到了下面一道面试题:

对于下面的代码, 实现函数 hijack

#include <stdio.h>

void hijack() {
// ...
}

int main(int argc, char *argv[]) {
int x = 100;
printf("x = %d\n", x);
hijack();
printf("x = %d\n", x);
return 0;
}

使得输出结果为:

x = 100
x = 150

阅读全文

如何部署多节点 Tendermint 集群

这几天在忙着搭建多节点的 TenderMint 节点, 中间遇到了一些坑, 会通过这篇博客记录下整个过程. 欢迎感兴趣的同学多多交流!

阅读全文

Bash 里的文件描述符

在 Shell 编程里经常会用到重定向操作, 它本质上是对文件描述符进行操作, 本文会对 Shell 脚本里的文件描述符做一个详细的介绍.

阅读全文