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

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

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

阅读全文…

发表于 2016年10月15日

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

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

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

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


阅读全文…

发表于 2016年8月7日

Linux 异步 IO 之 eventfd

归档: api | 标签:

经过 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 …

阅读全文…

发表于 2015年10月31日

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 

阅读全文…

发表于 2015年6月30日

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

#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,即如果没有数据可读或写入未完成时当前线程会一直等待,直到读写操作完成或出错才会返回。

同步 …

阅读全文…

发表于 2015年5月31日

C++ 中可以对函数重载,即同样的函数名字(其实在编译期还是会被生成不同的名字)可以有不同的参数列表,例如 STL 中 string 的构造函数:

string();
string (const string& str);
string (const string& str, size_t pos, size_t len = npos);
string (const char* s);
string (const char* s, size_t n);
...

看上去和 C 中的变长参数有点类似:

void func(int nil, ...);

有点不同的是,C …

阅读全文…

发表于 2015年4月5日

这是关于 lua-cpp 的第二篇博客,上一篇在 这里。这里主要是根据 git 的提交日志回忆一下实现过程,有点意识流,想到哪说那了。btw,代码在 这里

设置和获取变量

首先是一般的变量的获取。返回数值比较好办,字符串也可以返回 std::string,但是像 table 和函数这样的类型就不好直接返回了。一个直接的想法就是在外面封装一层,记下 lua_State 和对应的位置。刚开始就是直接记的栈内的 index,但是当某个对象析构之后在这个对象之后创建的对象的 index 都要改变,因此这个方法行不通。后来翻 API 的时候发现可以用 luaL_ref() 和 luaL_unref(),问题就解决了。

一个不算太重要但是也比较基础的问题是这些类型的生存期问题,其实也就是 lua_State 的作用域问题。Lua 本来就要求使用者自己保证,但是这个保证有函数调用来强制(Lua 的函数都需要提供 lua_State),如果封装成 C++ 后每个函数都要求传入 LuaState 就太不专业了,于是想到在每个类里加一个 std::shared_ptr,然后判断引用计数来决定是否析构;后来在查手册的时候发现 shared_ptr 居然还支持自定义析构函数,而 lua_close() 正好符合要求的析构函数形式,这样

阅读全文…

发表于 2015年3月8日

PostgreSQL 是一个采用 BSD 许可证分发的跨平台的对象关系模型数据库,最早可以追溯到 1982 年在伯克利开始的 Ingres 计划。PostgreSQL 出现的时间比 MySQL 要早,之前也听过 PostgreSQL 的大名,不过看到相关的讨论比较少。由于这里的实验需求远未达到两者的极限,所以也没什么评测,网上的评价就不搬运过来了,有兴趣的可以搜一下。这里的实验环境是 Debian 6,PostgreSQL 版本是 9.1。

初始化

不同于 MySQL 在安装的时候会被要求输入 root 的密码,安装 PostgreSQL 的时候什么提示都没有,装完之后也不知道该干嘛……在网上搜了一把,照着参考资料 [1] 操作了一遍,基本算是入门了。

由于没有 root 用户,默认有 root 权限的用户名是 postgres,也有同名的数据库。网上有很多介绍初始化的方法都是新建一个 postgres 的用户,然后切换到该用户登录后再修改密码。但是觉得为了初始化新建一个用户有点小题大作了,于是上网搜了下,发现可以通过修改配置文件达到目的。

首先修改 /etc/postgresql/9.1/main/pg_hba.conf,把其中的

local all postgres 

阅读全文…

发表于 2015年2月7日

Lua C++ bindings (1)

归档: lua | 标签:

好几个项目都用了 Lua 作为配置文件语言,但是一直都用官方提供的 C API,写起来十分繁琐。本来大部分的配置文件都是 key-value 式的配置,简单地封装一下就足够了,但是本着完美主义的倾向一直都觉得要么就别封装,要么就写一个功能完善的,而函数调用和自定义类导出这部分一直没想明白怎么弄,因此迟迟没动手。至于为什么不直接使用 LuaBind 这样强大的东东,一方面是不喜欢 LuaBind 依赖 Boost 太臃肿,另一方面也是趁着这个机会学习一下。

从去年 10 月左右就开始磕磕碰碰地写,三两下就把变量部分搞定了,不过之后就停滞了。直到去年年底的时候看了下 C++11 提供的变长参数模板有了些头绪,于是写成了现在这样,总的来说已经基本可用,心里的成就感满满的,于是写点东西记录一下,也算是打个广告。关于这个库准备写两篇博客,第一篇从使用者的角度介绍一下使用方法,第二篇从开发者的角度写写演变过程及设计原则。这里介绍的是第一个提交的版本,后续有变化的话不再同步更新博客了,只会更新相关的文档。

哦,忘了打广告,代码放在 github 上,猛点 这里。需要 C++11 的支持,使用 g++ 编译时加上选项 -std=c++11。

变量设置

先来看一个“Hello, world!”式的程序:

#include <iostream>
using namespace std;

#include "luacpp.hpp"
using namespace 

阅读全文…

发表于 2015年1月17日

第五章习题解答,跳过了大部分题目。

E-5.1: 流程图略。

                                             ---
                                            /   \       +---+
                                 +--------> | > | <---- | n |
                                 |          \   /       +---+
                                 |           ---
                                 |
        +---------+         +---------+
   +--->| product |         | counter |<--------------------+
   |    +---------+         +---------+                     |
   |        |                 |     |                       |
   |        

阅读全文…

发表于 2014年12月31日