阻塞TCP流 - phxrpc代码阅读(3)

写在前面

phxrpc的流(streamstreambuf)与网络访问其实是耦合在一起的,所以本文可以结合着第一篇笔记一起来看。虽然我非常想吐槽这种强耦合性的设计,但是我决定还是好好理解phxrpc的设计之后。。。攒一波大的:)

BlockTcpStreamBuf

class BlockTcpStreamBuf继承自BaseTcpStreamBuf。其中重写了precvpsend两个函数,并且持有了一个文件描述符(file descriptor):socket_

precvpsend直接调用了<sys/socket.h>中的recv(2)send(2),并没有其它操作。

网络相关的操作,则由class BlockTcpStream来负责。BlockTcpStreamBuf只负责IO部分。

if (BaseTcpUtils::SetNonBlock(sockfd, false …
more ...

定时器以及其它 - phxrpc阅读笔记(2)

写在前面

phxrpc使用了协程(ucontext)和IO复用技术(epoll)来实现网络通信。定时器在其中起到了非常重要的作用。下面我们就来分析一下phxrpc的timer.[h|cpp]中的代码。

system_clock vs steady_clock

system_clocksteadly_clock都是来自<chrono>库,都是用来获取当前时间的。

system_clock用来从系统时钟获取时钟时间(wall clock time),而steadly_clock获取的是时钟tick,而且保证随着时间的推移,时钟tick数不会变小。

然而实际上,在某些系统下,这两个时钟的实现是一致的。详细信息可以参考这里

注:在clang++ 4.2.1, g++ 5.4 下实验,这两个时钟是不同的。所以个人认为在这里最好不要做任何无意义的假设。

几毫秒的安睡

void …
more ...

自定义你的stream buffer - phxrpc阅读笔记(1)

写在前面

phxrpc是微信团队开源的一个轻量级RPC框架。

我对RPC这些东西了解不多,看到phxrpc的代码相对简单,而且还在初步开发阶段(在本文写作时,版本号是0.8)。所以想读一读,提高一下姿势水平。

就是这样。

自定义stream buffer

network/socket_stream_base.[h|cpp]中的class BaseTcpStreamBuf继承了std::streambuf,自定义了一个流缓冲区,用于接收/发送TCP数据包。

这个用法比较新颖(或者是我见识少),网上的资料也不多。这里翻译一篇介绍文章,学习一下新姿势。

A beginner's guide to writing a custom stream buffer

流(streams)是STL中提供的一个重要的抽象概念。著名的“Hello world”程序,便是使用了std …

more ...

Code Golf - Heapify

void heapify(vector<int>& vec) {
    int n = vec.size();
    for (int a = 0, b = 1; b - 1 < n; a = b, b <<= 1) {
        nth_element(vec.begin() + a, vec.begin() + b, vec.end());
    }
}

You can implement a "heapify" by only four lines of code. And the time complexity is O(n).

Fancy …

more ...


Workflowy full notes

Recently, I'm becoming a crazy fan of workflowy because its ability to build a personal wiki concisely.

However, there's only one thing bothers me that workflowy hide all the notes as the screenshot below, and it annoys me a lot.

Alt text

Luckily we can always find a way to get around …

more ...

用C++实现一个通用的sort函数

问题

用C++实现一个尽可能通用的sort函数

分析

一个通用的sort函数应该包含以下要点:

  • 确实可以排序(LOL)
  • 可以应对C-style array和C++-style container的排序需求
  • 可以应用于任意random access container
  • 可以使用用户自定义的排序函数 / 仿函数 / lambda函数

实现

为了与std中的通用函数做区别,这里的命名规则,包括类型与函数,都在前面加了"my"以示区别。可能与标准的命名法有出入,所以仅做示例用。

思路

拷贝代码是愚蠢的行为。

或者说,

对于同一钟实现,尽量使用同一份代码。

感谢C++ Templates,对于不同类型与需求的函数,我们可以将生成多份代码的劳动放心的交给编译器。并且,Templates的代码生成是在编译期完成的,即不会造成额外的代码膨胀(如果你姿势正确的话),也一般不会造成额外的运行时开销。

函数原型

我们模仿std::sort来进行开发。

template< class It, class Compare >
void sort …
more ...

Beauty-of-Programming 2015 Qualification Round Tutorial

A. 2月29日 (Feb. 29th)

Description

Given a starting date and an ending date. Count how many Feb. 29th are between the given dates.

Solution

The easiest way, of course, the brute force, which is quite simple with Python using the datetime lib.

However, it's not an effective way for the …

more ...

GCJ Qualification Round 2015 题解

前言

这篇日志用中文写是因为想省点时间打游戏。。。(请鄙视我吧。。。

A. Standing Ovation

题意

这是一个骗掌声的故事。

当演出结束后,观众们要站起来鼓掌。但是有些观众比较羞涩,只有在k个人站起来鼓掌后才会故障。

你的目标是在观众中安插一些卧底领掌,让所有观众都站起来鼓掌。(臭不要脸)

求最少的卧底数。

数据规模

抛开数据规模谈解题,都是TM耍流氓。 —— Wizmann

100组数据。

小数据集,观众羞涩值的范围:0 ≤ Smax ≤ 6.

大数据集,观众羞涩值的范围:0 ≤ Smax ≤ 1000.

解题

本题比较简单。有两种方法,一是暴力枚举,因为大数据集中,观众羞涩值最大只为1000,即最大安插卧底数不超过1000。(当然,二分也可以,不过对于1000的数据集,真心没啥必要。)

二是O(N)的一个遍历,在观众羞涩的不想鼓掌时,安插相应数量的卧底。

本题推荐方法一。因为个人感觉,在编程竞赛中 …

more ...

ZeroMQ启示录

ØMQ是一个消息系统

ZeroMQ是一个消息系统,也被称为“消息中间件”。它被广泛的用于经济、游戏、嵌入式等领域。

什么是消息系统

打个比方,消息系统就像我们使用的IM软件一样。首先,一方决定将消息发往何处(一对一或一对多)。然后将信息打包,点击发送按钮。之后,IM系统会帮你料理剩余的事务。

但是,它们也有很大的不同点。IM系统对于消息系统似乎太低效了一点。另外,消息系统是没有用户界面(GUI)的。在错误发生时,消息的另一端也不会有人来智能的介入处理。

所以,我们可以这样下定义。消息系统是具有高效性和容错性的消息传递解决方案。

ZeroMQ的起源和发展

ZeroMQ最先的设想是实现一个炒鸡快的用于证券交易的消息系统,所以在设计初期的关注点就是在极致的优化上。

第一年的工作重点,在于发明性能测试的方法,和设计高效架构。

之后,大约在第二年,工作重点转移到实现一个通用的消息系统,以应用于分布式系统,使其可以利用不同的编程语言,使用不同方式,来传递各种模式的信息。

启示1:独立应用 vs. 程序库 …

more ...