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

同步 …

阅读全文…

c++11 之变长参数模板

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 …

阅读全文…

Lua C++ bindings (2)

这是关于 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() 正好符合要求的析构函数形式,这样

阅读全文…

PostgreSQL 笔记

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 

阅读全文…