《Paxos Made Simple》中文版

深入浅出 PAXOS

原文:Paxos Made Simple
作者:Leslie Lamport
发表日期:2001 年 11 月 01 日
译者:ou@https://ouonline.net/

摘要

Paxos 算法,如果用简明的语言来描述,其实很简单。

目录

  • 1 引言
  • 2 共识算法
    • 2.1 问题描述
    • 2.2 选定一个值
    • 2.3 获得被选定的值
    • 2.4 推进
    • 2.5 实现
  • 3 实现一个状态机
  • 参考文献

1 引言

Paxos 是一个用来实现具有容错特性的分布式系统的算法。很多人认为 …

阅读全文…

emacs GUI 使用 fcitx

前段时间用 emacs GUI 的时候发现不能输入中文,搜了下发现有挺多人遇到问题,参考资料 [1] 里面有解释说是 emacs 的一个遗留问题,只要把 LC_CTYPE 设置成 zh_CN.UTF-8 就行。但是我试了下发现没效果,继续搜索之后发现还有个可能是字体的问题(见参考资料[2,3]),装完字体就好了。这里把需要的配置都总结下备忘,因为字体的问题一点都没有报错,完全不知道从何查起。

这里的环境是 fcitx 4.2.9.7,emacs 26.3。

编辑 ~/.xprofile(或 ~/.bashrc),加入以下内容:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

编辑 ~/.xprofile(或 ~/.bashrc),设置 LC_CTYPE

export LC_CTYPE=zh_CN.UTF-8

可能有关的一个配置(不确定)是,在 ~/.Xdefaults 加上

Emacs.useXIM:on

阅读全文…

使用 overlayfs+chroot 搭建临时环境

最近在写一个小工具,依赖的库比较多,但是这些依赖都不常用,不想为了开发而装在常用的机器上。想用以前用 chroot 搞的一个开发环境,可惜更新源验证总出问题,搜索了几个方案后还是没解决。我只是想搞个隔离的测试环境,不需要限制资源,docker 又庞大配置又麻烦(其实根本原因是我讨厌 golang),又不想重新配置一份环境,于是搜了下 docker 相关的底层技术,最后发现 overlayfs+chroot 就能完美解决我的需求,在这里记录一下,内核版本是 5.6。

overlayfs 介绍

顾名思义,overlayfs 就是把多个目录组合在一起形成一个新的文件系统,在 2014 年被合并进 kernel v3.18。先来看下使用时的命令行参数:

mount -t overlay overlay -o lowerdir=<lowerdir1>:<lowerdir2>:<...>,upperdir=<upperdir>,workdir=<workdir> <mountpoint>

大概介绍下这里的三个参数:

  • lowerdir:只读目录,多个目录用 ":" 分隔。
  • upperdir:可读可写目录。如果 upperdirlowerdir 中有同名的文件,会优先展示 upperdir 中的文件(换言之就是 lowerdir 中的文件被屏蔽了)。

阅读全文…

博客迁移到 vps

几周前在 linode 上买了个最低配的 vps(不要问我为什么买,我也不知道,反正就是买了),流量翻墙也用不完,于是想着把博客迁过来,还能省点钱。

nginx 和 php

这里

另外还需要在 /etc/nginx/sites-enabled/default 中的 server{} 部分加上

index index.html index.php;

安装数据库

自从 MySQL 被 Oracle 收购后,开源界为了避免版权问题,fork 了一个分支 MariaDB:

apt-get install mariadb-server

为了能让 php 访问数据库,还需要安装对应的插件:

apt-get install php-mysql

备份原博客

从 cpanel 打开文件管理器,将 public_html …

阅读全文…

nginx 支持 php

记录一下 nginx 和 php 的配置过程。运行环境是 Debian 10 stable。

安装:

apt-get install nginx php-fpm

然后编辑 nginx 的配置文件 /etc/nginx/sites-available/default,去掉以下几行的注释:

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
}

这个配置是告诉 nginx,如果请求中有 .php 结尾的文件,就把它交给 php-fpm 来处理。

改完保存后重启 nginx 和 php-fpm:

/etc/init.d/nginx restart
/etc/init.d/php7.3-fpm 

阅读全文…

从 vim 转到 emacs

没错,这次真的转到 emacs 了,而且估计再也回不去了……

几年前有尝试过转到 emacs 的 经历,但是当时用的并不熟练,所以大概坚持了几周就放弃了。最近换了工作,组里要求统一使用 emacs,说是为了结对编程方便,统一操作,还提供了统一的配置文件。刚开始的时候我当然是拒绝的,心想作为一个已经用了 vim 将近 10 年而且还打算继续用一辈子的铁杆粉怎么可能这么容易动摇,顶多工作时间用 emacs,其余时间还是拥抱心爱的 vim。

但是大部分时间还是在工作,为了干活时不那么痛苦,于是一点点地把 vim 的习惯尽量迁移到 emacs 上。第一时间就是打开 .vimrc,对照 elisp 的 手册 一点点地搬过来。首先上手的是 evil。稍稍配置后基本就和默认的 vim 差不多了。这倒是让我很意外,于是把 vim 删了,在工作之外也开始有意识地用 emacs,渐渐地居然也习惯了没有 vim 的日子。主要矛盾解决后剩下的事情就好办多了,我的配置很久都没有什么大改动,也没有动力尝试什么新插件之类,几个常用的 vim 插件都有对应的 emacs 版本。另外比较惊喜的是,这些插件的扩展都做得不错(可以给插件写插件),调整起来相当方便,相对于对应功能的 vim 插件来说,感觉设计和代码质量上都要好很多,尽管有些功能觉得还是没有 vim …

阅读全文…

博客的几个改动

周末两天把博客捣腾了一下。从表面来看,只是换了个代码高亮的配色,但改动远不止看到的内容。

首先是 wordpress 版本从之前的 3.4.x 升级到了当前的最新版 4.5.x。一直拖着没升级的原因是,之前对 wp 的代码有些改动(看 这里),每次升级都需要重新 diff 改回来。反正像这样的个人小站也没啥入侵价值,所以一直没有怎么关注安全补丁啥的,能用就用着。而今天下定决心要升级是因为准备把文章内容全都改成 markdown,这样能用上一些较新的支持 markdown 的插件。支持 markdown 的静态 blog 也有很多,但是有一点不喜欢的是,评论都是用的第三方,像多说和 disqus 之类,万一这些网站挂了评论就没了。

文章 markdown 化。这也是会有这篇博客的直接原因。这两天趁着周末把全站的 90+ 篇文章都转成 markdown 了,把里面的 html 和 wordpress 特有的标记都去掉了。还有个不起眼但是很费时的改动,就是把全站文章的格式都按照 中文文案排版指北 调整了一遍。不过有些单词大小写和使用还是不够规范。

新增了些插件。为了去掉这些标记,新增了几个插件。下面是在用的插件列表:


阅读全文…

Linux 异步 IO 之 eventfd

经过 3 个月的休(tou)息(lan),是时候写点东西了……

eventfd

较新版本的 Linux 内核(2.6.22 之后)提供了一个新的系统调用 eventfd() 来实现事件通知(参考资料 [1]):

#include <sys/eventfd.h>

int eventfd(unsigned int initval, int flags);

函数返回一个可用于 read()/write()/epoll()/close() 的 fd,fd 包含一个由内核维护的 8 字节的无符号整数,初始值由第一个参数 initval 制定。write() 的 buffer 大小都限定为 8 字节,如果 buffer 大小不等于 8 字节则会返回错误,如果提供给 read() 的大小小于 8 …

阅读全文…

Linux 异步 IO 之 Native AIO

Linux Native AIO

来看看 Linux 提供的 AIO 系统调用(自行封装的头文件 native_aio.h):

#ifndef __NATIVE_AIO_H__
#define __NATIVE_AIO_H__

#define _GNU_SOURCE

#include <unistd.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <linux/aio_abi.h>

static inline int io_setup(unsigned nr_events, aio_context_t* ctx_idp)
{
    return syscall(__NR_io_setup, nr_events, ctx_idp);
}

static inline int io_destroy(aio_context_t 

阅读全文…

Linux 异步 IO 之 POSIX AIO

先来看一个简单的读写文件程序,程序读取源文件,然后把内容打印到屏幕上:

#include <unistd.h>
#include <fcntl.h>

#define BUFSIZE 4096

int main(void)
{
    int fd, nbytes;
    char buf[BUFSIZE];

    fd = open(__FILE__, O_RDONLY);
    while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
        write(1, buf, nbytes);

    close(fd);
    return 0;
}

在这个例子中的 read()/write() 都是同步阻塞 IO,即如果没有数据可读或写入未完成时当前线程会一直等待,直到读写操作完成或出错才会返回。

同步 …

阅读全文…