C++的语法总是会隐藏在一些边角上的语法,让你觉得还能这么干。最近在了解boost::bind的时候发现了这个语法,之前都不了解这个语法的。拿出来介绍一下,也算记录一下。这个语法在boost::bind还有Inside C++ Object Model中都有用到。 代码和表达均来自与ref[1]。

成员函数指针

废话不多说,上代码:

class Foo {
public:
    int f(string str) {
        cout<<"Foo::f()"<<endl;
        return 1;
    }
};

int main() {
    int (Foo::*fptr)(string) = &Foo::f;
    Foo obj;
    (obj.*fptr)("str");
    Foo *p = &obj;
    (p->*fptr)("str");
}

如上代码所示, int (Foo::*fptr)(string)定义了一个Foo类中的一个成员函数指针,其指向了Foo::f函数。相比起普通函数存放的是函数所指向的地址,其存放的是这个函数在类中相对的offset,这样只要是有相同的内存offset的均能互相转换。 所以要调用它,必须绑定在对应的class object的地址上,才能调用该函数。

more>>

Caddy介绍

Caddy是一个使用Golang开发的http服务器,其主打的特点就是快速支持https和HTTP2。本站的博客也是使用它搭建的,详细搭建过程可以参考这里。最近在其更新的0.10.7中,支持了Froward Proxy,Chrome浏览器也内建了对HTTP2 proxy的支持。

Caddy的Proxy支持一下功能:

  • HTTP2 Proxy
  • Probe resistance,当验证错误时,不会返回HTTP 407 错误。当有Probe进行探测时,其不会就直接暴露出自己是一个Proxy(实验阶段,比较有意思)
  • Basic Auth
  • IP hiding
  • Servers PAC file

more>>

介绍

sofa-pbrpc是百度开源的一个C++ RPC库,使用Google Protobuf作为序列化协议,Asio网络库开发的一个C++ RPC库,现在有很多公司也都在使用。用他来学习boost::asio,C++11的一些新语法是个不错的选择。 计划会通过一系列的文章来研究这个库,并且学习他的一些用法,以及C++语法的笔记。

一个典型的服务器端程序如下所示:

int main() {
    SOFA_PBRPC_SET_LOG_LEVEL(NOTICE);

    sofa::pbrpc::RpcServerOptions options;
    options.work_thread_num = 8;
    sofa::pbrpc::RpcServer rpc_server(options);

    if(!rpc_server.Start("0.0.0.0:12321")) {
        SLOG(ERROR, "start server failed");
        return EXIT_FAILURE;
    }

    sofa::pbrpc::test::EchoServer *echo_service = new EchoServerImpl();
    if (!rpc_server.RegisterService(echo_service)) {
        SLOG(ERROR, "register service failed!");
        return EXIT_FAILURE;
    }

    rpc_server.Run();

    rpc_server.Stop();

    return EXIT_SUCCESS;
}

RpcServerOptions类里面主要是启动server的一些参数,位于rpc_server.h文件中,主要定义的是Server的启动参数,如工作线程数量、io_service 池大小、keep_alive时间等。

more>>

介绍

Hugo是一个强大的静态博客生成器,由spf13使用Golang开发。在性能和生成文章的速度上都不错。目前的版本是0.20.6,依然没有迈出1.0的大版本号。一直在用Hugo进行博客的写作。(半年多没有更新博客了,逃

Caddy同样也是一个由Golang开发的HTTP server,其最大的亮点就是内建了HTTPS和HTTP2的支持,同时自动能够向Let’s Encrypt申请证书。同时,支持Middleware的功能,使用Golang撰写的Middleware能够支持各种各样的功能,同时任何人都可以撰写自己的Middleware,个性化这个HTTP Server。

more>>

今年运气贼好,居然通过摩根的电话面试,邀请我到上海去面试。来回路费加上一晚上住宿费全包, 果断去啊。顺便还绕道到苏州看看晓良和学长, 去微软苏州信仰充值一波。

面试前一天9点的飞机,11点到上海虹桥。然后直接买票到苏州,苏州微软充值了一波信仰。 晚上9点从苏州回来,10点半到住的地方。

面试没有强制要求穿正装,但是还是推荐穿正装。我们面试的有10个人, 有2个没有穿正装,其他都是正装出席。第一次穿正装,非常不适应。 还以为公司内部上班大家都穿正装,结果到了之后发现并没有多少人穿正装。都和普通上班一样。 尽量找个住得近的地方,不要迟到。我们今天面试的时候有两个人就迟到了,不太好。

面试总共有3个环节,上来首先HR和部门的人会介绍面试安排,岗位区别。 仔细看了看JD,EE的开发有一部分侧重在基础架构,他们都是Java开发。 特别强调了如果想去C++就不要去EE。 同时强调所有的面试都是E文,不能和面试官说中文。

完了之后就开始做题,3道比较简单的算法题。这里一定要把题目阅读仔细, 我自己读题的时候不认真,最后一题附加题忽略了一个细节,导致最后一题崩盘。

完了之后就是3轮技术面试,摩根的技术面试非常有意思,3个面试官会商量好 各自问的领域。绝对不会问重复。每轮大概40分钟。

more>>

恩,截止到今天,算是把工作给签下来了。之前找了一段时间的运维开发,但是自己还是想去做开发,所以就滚去链家写PHP去了。

纠结了好几天什么都不想干,还是没有心仪的offer,要是有心仪的我就屁颠屁颠的去了。

感觉目前有倒闭的风险,也有说要上市的公司(又没有股份说个蛋,但还行了。先凑合过吧。

PHP是最好的语言,还是入了这个行。

选择还真是无比痛苦啊。。老老实实搬砖吧。感觉今年的失误在没有刷题上,下班回来就想睡觉,什么都不想干。以后要多刷题才是王道。

切记自己不要做死。

more>>

Yubikey 4 介绍

Yubikey是国外一家公司出的用来做OTP的一个硬件设备,同时它也是一个GPG 的smart card。买它的原因是因为公司需要我们使用Github的人都最好有一个GPG Key对我们的Commit做个签名,而证书的管理是个难题,证书拷过来拷过去的也就没有什么安全性可言了。这东西在Tuna那边已经被安利了好久了,于是就买了。结果发现玩的根本停不下来,太有意思了。OTP功能到哪里都适用,最近都把我的ssh登陆换成了使用Yubikey来认证,感觉比我那个证书登陆不知道高到那里去了。

Yubikey 4功能

Yubikey 4主要有两个功能,一个功能是OTP和两步验证,另外一个功能是GPG smart card。

more>>

Centos7.2下建立饥荒服务器

坑爹的Klei,2年前把新建服务器的方式换了,然后饥荒wiki上不更新。找了很久才找到教程,主要参考: Klei论坛Linux配置教程(配置文件有问题)
知名博主ttionya(配置文件主要参考)
Klei论坛关于配置文件解释

思路上来说,主要需要先安装Steam,然后通过Steam安装DST(Don’t Starve Together)。然后进行相关配置文件,然后run就好了。要新建一个服务器需要开启2个DST实例,每个实例大概需要500-600M内存,再加上其他mod啊什么乱七八糟的,建议在2G内存服务器上开服。1G内存的服务器基本开不起来。CPU倒不是太大问题,基本上单核也就能吃得消。 忘了说了,请不要在root账户下开服,不安全。除了第一步,其他请在另外非管理员账户下做。

more>>

man是大家经常用的命令,但是学习bash的时候有很多书。今天发现man bash是一个不错的资源,摘抄一些供大家学习。

  • 脚本加载顺序

When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The –noprofile option may be used when the shell is started to inhibit this behavior. When a login shell exits, bash reads and executes commands from the files ~/.bash_logout and /etc/bash.bash_logout, if the files exists. When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the –norc option. The –rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

bash作为一个交互式的登陆程序启动时,首先会读取/etc/profile里的内容,然后依次找~/.bash_profile, ~/.bash_login, and ~/.profile。退出时,也是执行/.bash_logout ,/etc/bash.bash_logout。当以不登陆的shell启动时,就执行~/.bashrc

more>>