Long Time No Update

Chinglish title makes me relaxed. To make it short, I have a paper accepted by ANCS 2015, which proposes an application layer parser for SDN (named COPY), OK, not just for SDN. The major...

More

6692049190

These days we want to build a powerful “router” with some access control abilities, where an intuitive way is to use the combination of WifiDog and AuthPuppy on OpenWRT. However, building a LMAP structure...

familistic

pedanalysis

Our paper about the extensive parser on multiple L7 protocol for SDN has been rejected on INFOCOM 2015, HK. Sad news, isn’t it? Although it got 4, 3, 3 points from the reviewer, which...

8039137200

Use SublimeClang in SublimeText 3

SublimeClang is the greatest thing in ST3, at least in every C++ programmer’s mind: it is the only plugin in ST that supports C++ intelligent completion/jumping. However, the author of SublimeClang has moved to...

More

nonillionth

原来一直对“反射”这个概念不清楚,听别人提起过很多次,也有vczh这样的大牛号称在C++里实现了反射,我也不知道具体指的是什么。今天在SOLID里遇到一个具体问题,跟HJK讨论了一下,发现原来这就是反射机制。 简单的说,反射就是让对象获取关于自身的信息(如对象类型),而不需要在编写代码的时候提前知道这些信息。比如说,我们有一个对象a,其类型是A。一般来说,我要对a进行操作,需要先声明一个A& a_pointer,然后再来做事情。但是假设我们这时候不知道A这个类型,或者这个类型的头文件并未被引用,就无法对a进行操作了。如果我们可以获得a的类型信息,比如TYPEOF(a)& a_pointer, 那么我们就无需知道a的具体类型,或者引用A类型的头文件了。 C++并不直接支持反射特性,但是上述的场景在OO语言中会经常出现。考虑一个常见的场景。假设有如下的两个派生类,都由Base类派生而来 / a_class.h class A : public Base { public: A() {} virtual ~A() {} virtual void Produce(Base** x) {*x = new A;} }; / b_class.h class B :...

More

9093392210

从北京回来终于可以歇口气。结果我这口气还是先改了一早上SOLID框架,然后看了2篇paper后才歇出来。简单记录一下这次去MSRA参加“微软学者”奖学金面试的情况。 老板一开始把申请情况转发给我的时候,我还对这个奖学金一无所知,搜了搜发现是个牛逼的奖啊,不少现在的牛人都曾经得过这个奖(戳这里)。而且这个10000美刀的奖金也确实够微软的范。大喘气特别适合这种奖学金:“你这个奖学金有多少啊?”,“一万”,“哦···”,“美刀”,“嗷嗷哦嗷嗷嗷嗷嗷嗷嗷”。就是这种效果。 申请过程就不提了,吐槽一下XJTU真的是找不出其他人了,别的学校都各种校内评选才选出两个,我们这连报名的人都没凑齐。算一算自从微软学者奖学金降到每年只评选10个之后,XJTU还没人能进入final round,这是有多惨。 8月底收到了final round的邮件,说有27个finalist,需要准备presentation和Q&A,可是正好赶上Maipu测试和SOLID重构,快忙不过来了。不过MSRA的UR(University Relation)的同事很有意思,第一封邮件显然是群发的,但是都选了暗送,这样大家都不知道对方的背景。第二封邮件发了个reminder,结果搞成明送了,直接激起了我人肉狂魔的兴趣。于是用邮件名大概人肉了几个。人生立刻跌入了低谷。比如这位,这位,和这位。具体就不展开说了,总之就是在低谷里徘徊了一阵。 该去还是要去,大概准备了一下presentation,想了几个可能会被问到的问题,穿上wedding wear,高铁,走吧。 第一天过去帮老板跑了跑各种私人手续,晚上遇到了室友。本来我大概研究了一下估计是要和棒子一起住了,结果看了看是来自Singapore的,见到一问,哦,福建人。我天朝子民果然牛逼。聊了聊,做CV方向的,CV方向是真火,真的。 第二天参加面试,MW小朋友来接我们,中间才知道这是师妹,果然我们XJTU还是有人才的。吃了早饭,拍了几张照。话说很多人说MSRA的伙食很好,但是估计是因为我不是吃货,所以就感觉不错吧。食堂大概是这个样子。 往外面看的话,是这个样子。 接下来是分组,悲愤的被分到了下午倒数第几个,这就意味着一天好等。等待的人没啥事就聊呗,发挥social能力,展现西交风采。希望别被别人认为我是个喷货就行。难得见到一堆博士聚在一个屋子,大家从deadline开始谈起,谈到做实验,招学生,毕业,然后纷纷倒在发多少钱这个问题上。嗯,天下PhD是一家。 老板帮忙联系了XYQ老师,找过来聊了聊。Xiong老师提到之前申申请的时候毙掉了一个清华的学生,INFOCOM和ICNP长文各一篇。因为觉得他做的太理论了。我突然觉得代码没白写,或者说还是老板大腿粗。聊了几个idea,发现MSRA还是非常注重industry transferring的。记几个关键字,netmap,TCP estat等等吧。回头有空再仔细看看。另外Xiong老师还提到了之前面试一个学生,英文不太好,交流到一半只好换中文,这个埋下了深深的伏笔······· 中午回来吃晚饭,跟ZPF@NUS和一个韩国友人聊得很开心。韩国友人的口语让我信心倍增。 差不多就到我了,进去一通狂讲,反正Xiong老师说底下没有领域内专家,结果还是有点紧张,比平常讲的还是快了点。提问环节真是无与伦比,上来问project detail和privacy issue这个都想到了,回答的也没问题。后面问你这个代码都是你写的吗,你这个东西能跑40Gbps真的假的。这个就有点没话找话了。直到有一位女老师问,请问你在简历里写的Doujin是什么意思,然后又有一位男老师问,请问你以后是想做Research还是想做Industry····我觉得这个世界已经彻底跑偏了。总之都回答的不错吧。唯一的瑕疵是理论上是全英文的,结果我还是说了一点中文: We have built the system into two platforms, x八六 and Tilera·······我真的觉得x八六比x eight six要顺口好多!我第二天才反应过来··· 出来之后就轻松咯,继续闲聊。等饭。中间联系到了vczh大大和斯瑞大大,带着我参观了一圈development...

More

734-215-8929

Muduo网络库包含了一个轻量级的日志库,可达到超过100MB/s的本地文件写入速度。这个基本上已经达到SATA磁盘线速,满足实际应用中的需求。最近在SOLID系统的开发中,想借用Muduo的日志库来进行元数据(metadata)的输出,但是发现Muduo日志库并不支持同时向多文件进行写入:输出函数是全局的,所以输出行为(包括位置)是共享的;在异步日志类中也是共享了一个mutex。这些都导致Muduo日志库原生不支持多文件的输出。而在SOLID系统中,每种协议或者应用的输出格式是不一样的,放在一个文件显得杂乱而且数据库端也不好处理。 我首先尝试了修改Muduo本身:将输出函数变成Muduo::Logger类的成员而非全局,这样每次在使用LOG宏的时候就可以指定输出函数。然后将异步类中的mutex也搞成私有。后来发现核心问题在域LOG_INFO/LOG_ERROR这些宏实际上是生成了一个匿名的临时对象,这些对象的生命周期就在这条语句之后结束。通过析构函数的调用顺便可以进行文件flush等操作。这就要求修改后每次LOG_INFO时都要对输出函数进行重新赋值,这个开销还是有点大。同时在异步日志类中对mutex的依赖相当多,需要大量修改,还是决定重新造个轮子吧。 正好与Muduo网络库搭配的书到了,仔细研读了一下日志库的代码和相应章节,总结了Muduo可以做到磁盘线速写入的主要原因。 1. double-buffer结构,其实就是ping-pong结构。即前端(接收新日志)将日志写入BufferA中,后端(将日志输出到文件)不断的将BufferB中的日志写入文件,同时前端对BufferA做个判断,超过阈值大小就swap两个buffer,这样的好处是锁粒度相当小,前端只在swap的时候加锁,后端每次把BufferB转移到另一个临时变量后也可以释放锁。两个临界区的操作都是常数时间。这是Muduo高效的最主要原因。 2. 小细节。如时间格式化函数首先比较struct tm.tv_sec,相等的话就只修改tv_usec部分就好了,减少了很多格式化工作。时间部分的长度也是固定的,可以预先格式化等等。 按照以上设计概要,我简单实现了一个提供异步写入的日志类。这个类的对象生命周期可认为是永久,通过类型内部的线程进行持续的写入。简单结构如下。 class Log { private: FILE* file_; vstring name_; uint64_t now_size_; thread* thread_; void FormatTime(char t_time[]); void RollFile(); public: Log(vstring name) : name_(name), now_size_(0), now_buf_(), running_(false)...

More