1、就像google test那类,使用案例如下,TEST本身是一个宏。

具体实现方法见博文:传送门

每个TEST宏会建立一个新的对象,并且在构造函数中把新对象注册进全局对象。

2、取自redis,使用代码如下:

其实run_with_period其实就是替代if(xxx)的宏,但我们很多时候都习惯使用condition作为宏定义,使用方法:if(condition(xxx))

和例子相比就在多了一个if,第一次见到有点新奇,又觉得是个[……]

Read more

苏菲的世界

书中书,很有意思的构思,算作我欧洲历史的启蒙书籍吧,读后感传送门

雾都孤儿

最开始是在《About Love》的电影里,Time的爸爸说喜欢狄更斯,留了第一个印象;

再其次是在图书馆又偶然看到,便借过来了。

不了解成为名篇的原因,觉得亮点…只有作者的反讽?对盗贼这个行业,对济贫院,还有对某种社会现象。

…但私以为这个真的构不成足够成为名篇的理由。

中国历史常识:

急功近利的社会稀缺两样东西,一是常识认识,二是历史反思,笔记传送门

人类的群星闪耀时

第一次看到这本书是在b站上的一个读书节目,蜗牛的热读里又恰好有这本[……]

Read more

哲学书的话,读过叔本华的作为意志和表象的世界,但那本对当时的我太晦涩了,没读完,对哲学产生过一点感觉,但就一点。

这一次读苏菲的世界感触倒挺多的,书里没有宣扬哪一种主张,而是把哲学发展过程向你徐徐展开。看到最初说世界万物可以由“空气,火,土”组成,从现在的角度来看真的是很蠢很蠢的观点,但在当时没有化学没有有物理学科的年代里,倒还真是一个挺大胆的想法,前半部分的哲学观念对我没有太多冲击,但是那种批判的精神和大胆的思考真的是很值得学习的。

随着书本的深入,书本作为小说的剧情引人入胜,但作为哲学史书,读完了我还是不能区分苏格拉底和莫克里特斯的差异,只是匆匆的过了一遍,还是不太会读书,胡乱[……]

Read more

其实本文也是深入理解Linux内核的读书笔记后续

调度基础

很多书中将进程分为CPU密集型和I/O密集型,另外还有一种分法:

  • 交互式进程
    这些进程与用户进行交互,因此会花很多时间等待鼠标键盘的输入,当接受输入之后,必须很快得到相应,否则系统会显得很迟钝。
  • 批处理进程
    不必与用户交互,常运行于后台。
  • 实时进程
    典型的是视频音频应用程序、机器人控制程序等,这些进程有很强的调度需要,不应该被低优先级的进程阻塞,应该有很短的响应时间。

Linux中调度算法可以明确所有实时程序的身份,但没法区分交互式程序和批处理程序。Linux实现了基于进程过去行为的启发式算法以确[……]

Read more

曾经有个问题一直在困惑我,分布式程序如何在宿舍调试和测试。扩容缩容是否正确,灾害发生时容灾能不能自动启动。当然对现阶段的我来说最重要的还是功能本身的验证。

这两天百步梯那群怪人又在群里讨论后台开发的一些问题,因为大牛多讨论就很吸引人很有意思,忽然就有好多点子想写一些好玩的程序,可怎么用一台机器模拟千百台机器来开发和测试分布式程序呢?

我会用zookeeper,但不愿意用java阵营的利器,想先用python造轮子实现一些分布式的服务管理和同步原语做第一个有意思的程序,可是写了怎么测试呢?
然后我刚刚才忽然想到,用docker啊!
(为什么以前从没想到过…浪费那么多好时光)[……]

Read more

出于兴趣看了一下guetzli的论文,但我本科期间做图像压缩的工作不多,所以对于一些专业的细节如有错误,还请留言斧正。

一、介绍

Guetzli是一个新jpeg编码器,使用了Butteraugli作为感知距离标准( perceptual distance metric)

主要工作:在不影响视觉感知质量的情况下,缩小图像的大小。

图1. 左为原图,中间是Guetzli,右边是libjpeg的结果

Libjpeg等编码器通常会出现一些变形[……]

Read more

常用的同步原语,到多核处理器时代锁已经是必不可少的同步方式之一了。无论设计多优秀的多线程数据结构,都避不开有竞争的临界区,此时高效的锁显得至关重要。锁的颗粒度是框架/程序设计者所关注的,当然越细越好(也不尽然),同时不同的锁往往也会体现出完全不同的效率,Linux有posix的pthread_mutex_t,Windows有CreateMutex创造的HANDLE,boost有mutex而且C++11也定义了std::mutex,这些锁在获取不到锁时都会进入睡眠状态(try_lock方法例外)并将CPU让出来给其他的进程使用。但是在很多情况下,多个进程竞争的临界区的代码可能非常的短,例如:锁[……]

Read more

想读一些代码,但不知道从哪里开始,那就随便选一个吧。

前言

为什么要写这个系列。

1、就是想变厉害一点:

学习更多数据结构和算法学习被广泛应用的软件/库的源码的实现原理学习别人的编码习惯和技巧

那开源项目那么多,从哪一个开始读呢,Nginx?Linux?还是什么,于是就谷歌,找到这个网页:
https://www.zhihu.com/question/20201738
介绍了很多开源项目,于是乎决定写这个系列,先把系列的开头放在这篇文章,如果坚持读代码并且写日志分析了三个开源项目,就把给这个系列做一个新的页面。

2、博客总要写一点有用的东西

一直想写博客,可是不知道[……]

Read more

Untiy5.x的MonoBehavior类。

所有用于添加到游戏对象上的脚本都必须继承自MonoBehavior,所以下面来学习一下这个类。

继承自MonoBehavior的脚本从唤醒到销毁有着完整的生命周期。下面介绍生命周期的各个阶段:

  • Awake(),脚本唤醒函数。当游戏对象被创建的时候,游戏对象绑定的脚本会在该帧内执行Awake()函数,无论脚本是否处于激活(enable)状态。
  • Start(),该函数在脚本激活时执行,位于Awake()函数之后。该函数同样也是执行在游戏对象被创建的帧里。不同的是,如果脚本处于不激活状态(enable=false),Star[……]

Read more

本来是不想做笔记,因为知识量一定很大,涉及到硬件软件和抽象概念,并且不乏复杂的细节,但是书中有一个细节卡住我一整天,忽想明白,开心想记录一下,因此决定写此篇读书笔记。

想必书中也有很多值得书写的抽象概念和算法,确实应该做笔记。

关于内核我不想知道的大而全,不想知道关于硬件的太多细节,我更加关注整个流畅的逻辑,对于可以忽略的细节,能省则省。

第二章内存寻址

在intel 8086的架构中,地址分为逻辑地址,线性地址和物理地址。逻辑地址经过分段变成线性地址,线性地址经过分页变为物理地址。Linux为了兼容各个平台,没有将分段纳入标准的一部分,将所有的逻辑地址(基本上)直接作为线性地[……]

Read more