particle128's Blog

May your choices reflect your hopes, not your fears.

《精英都是时间控》- 笔记

整体而言比较简单,很多原则之前都知道,可以比较快速地看完。但开卷有益,也有一些收获。

序章

时间管理术

  1. 早起(更专注,效率是其他时候的2倍) - 第一章、第二章
  2. 保证休息(午休+晚上8h) - 第三、四章
  3. 有意识压缩工作时间、提高效率 - 第五章
  4. 腾出的时间进行自我投资,而不是被动型娱乐(视频、娱乐节目之类的不需要参与、没法自我提高的娱乐)- 第六章

第一章

人在紧急的时候,大脑会分泌"去甲肾上腺素",促使人注意力高度集中,提升学习能力,激发潜能。所以,做事情设置一个截止时间,很有效果。

作者有个"后有约定"方法,比较有意思。比如他承诺9月底交稿,就提前买好10月初出发去美国的机票。这可以让原本比较空洞的对自己的约定,变得很具体,因为不做完就浪费了机票和酒店之类的提前订好的东西。(值得借鉴)

第二章

早起想进入最佳的精神状态,需要切换 ...

《自控力》- 笔记

这本书不错,好多章节都有共鸣。

第一章

前额皮质(眼睛和额头后面的神经区)主要负责自控,让人选择做"更难的事情"(看视频和早睡之间,选择早睡)。

冥想可以提高大脑的自控力,可以提升集中注意力、管理压力的能力。研究表明,11个小时的训练,或者持续8周的训练,可以观察到大脑结构的改变,比如前额皮质灰质增多。开始时,每天练习5分钟,习惯后每天增加到10~15分钟。

第二章

下面的做法,可以提高自控力,让自己在诱惑面前保持较高心率变异度,更活跃的前额皮质。

  1. 放慢呼吸到1分钟5~12次。在诱惑来临前进行5分钟放慢呼吸,可以迅速起作用。
  2. 充足的睡眠。睡眠短缺对大脑的影响和轻度醉酒是一样的。
  3. 5分钟以上的绿色锻炼。
  4. 5~10分钟的放松训练。平躺着,只关注呼吸。有点像躺着的冥想。

第三章

早晨意志力最强,随着时间的推移,逐渐减弱。所以,把最想做的事情,最需要意志力的事情,放到早上。

意志力就像肌肉一样有极限。可以理解成一天中的总量是固定的 ...

用js给windbg写扩展

前言

windbg是windows下结合命令行和简单图形界面的调试工具,号称最强大的windows下debugging工具。

使用windbg的好处是,体量小,免安装,能体验到类似gdb这种用命令来控制debugging的快感(geek style),而且功能比visual studio多一些,支持自定义的第三方扩展命令。不过我在使用了半年左右后,感觉缺点也是比较明显的。一个是打第一个断点的时候经常卡住很长时间(几分钟),因为要加载pdb里面的符号等信息;一个是输错命令,往往需要解析很长时间才出错返回,没办法中止;最后一点是,这东西用的人少,除了MSDN的官方文档,SO或者技术博客上很难找到资料,所以遇到问题只能自己摸索着解决。

最近使用过程中,对于总要自己添加源码路径颇感厌烦,于是研究了一下如何写windbg的扩展,从而自动化这一过程。

写windbg的插件/扩展,有多种方式,

  1. C++就有3种框架可以选择。DbgEng,EngExtCpp,WdbgExts。我尝试过WdbgExts,开发环境的构建相对繁琐,容易出错。
  2. javascript是新增的一种方式,目前支持的功能还不及上面C++的版本,但是对于我的需求足够了。好处是,容易上手和一边开发一边调试。

本文讲解基于js的windbg扩展。注意,该功能过新,windbg的正式版都还没这个功能 ...

Effective Modern C++回顾总结笔记

插播一段最近看书的心得:
对于第一遍看完,感觉书里面信息量挺大,不能完全吸收或者吸收起来有点困难的,要在适当的时机看第二遍以及第三遍。
第一遍不要记笔记,因为以当时的理解程度,记笔记需要重新梳理一遍,而且要记得东西很多,所以非常花时间,直接重复看也容易造成疲劳和厌倦,影响吸收效率。
隔一段时间后,第二遍看。这时候,每一节看之前,先不打开书,回忆这一节介绍的东西,主要回答what和why。然后,想不出来的,带着疑虑去看书。这一遍,对于回忆不起来的,或者感觉很精辟的,可以记一下简单的笔记。
当然,对于熟悉的领域,看一遍的时候,也可以按照看第二遍的方法。

Chapter 1 Deducing Types

Item 1: Understand template type deduction.

三种情况:T, T&&, T& / T*。注意const和volatile能不能带进推倒的类型。
array/fun 会转换成 pointer ...

跳表Skiplist

简介

Skiplist是一种可以替代平衡二叉树的数据结构,比一般平衡二叉树性能好(和优化的平衡二叉树性能相当),广泛用于各种key-value store(leveldb)或搜索引擎中(lucence, bing...),特点:

  • 插入、删除、查找的平均时间复杂度是O(logn),跟平衡二叉树一样
  • 插入、删除、查找的最坏时间复杂度是O(n),概率很低
  • 平均空间复杂度是O(n),跟平衡二叉树一样
  • 最坏空间复杂度是O(nlogn),概率很低
  • 比平衡二叉树(B树, 红黑树)实现简单

原理和实现

为什么skiplist的高度/层数很大概率是logn,查找复杂度是O(logn)
Lecture Notes on Skip Lists

插入、删除、查找实现
跳表SkipList

实例(4分支的随机函数,即新插入的节点有1/4的概率有2层,1 ...

Index compression

This article is a note of Chapter 4 in《这就是搜索引擎》.

Basic ideas

The meanings of index compression are:

  • Reduce SSD and memory occupation of index, which can save machines.
  • Provide opportunities for increasing index size, which usually can bring relevance gain.

The basic principle is "Trade time for space". All ...

Azure上基于windows server 2012搭建L2TP/IPSec VPN

终于把vpn搭好了,中间走了很多弯路,记录一下搭建的所有步骤。

步骤

用Onenote记的笔记,因为图比较多,就不转到markdown上来了,附上共享出来的onenote的地址。

  1. Azure环境部署
  2. Windows server配置
  3. windows10客户端配置
  4. mac客户端配置
  5. android客户端配置

注意

不用专门设置防火墙,包括windows server和客户端的。

参考

  • 英文版教程(我没有采用里面的方法生成证书,而是用的共享密码机制pre shared key)

How to Deploy SSTP and L2TP VPN in Windows Azure (Windows Server 2012)

  • 中文版教程(里面没有设置NAT,缺了这一步会导致连上VPN但没法正常访问页面,给分配了和server同样的ip)

Windows server 2012 搭建VPN图文教程(一)
Windows server 2012 搭建VPN图文教程 ...

设计模式-可复用面向对象软件的基础

原则

  • 针对接口编程,而不是针对实现编程

Example: DLAlgo类有个成员是LexicologicalSort对象,里面好多方法都使用了这个对象,这个对象也被一个GetSort()方法返回到外面。考虑对它进行修改(用LengthSort),和扩充(多支持一种Sort方法),会遇到什么问题?如果这个类的成员是Sort对象(抽象接口的对象)呢?

  • 优先使用对象组合,而不是类继承

原因:
1. 优先继承的话,会让继承树膨胀,可维护性变差。特别是有两种以上附加属性的时候,比如CompressAndAsciiStream.
2. 继承会破坏封装,增加耦合,复用的时候可能发现基类的某些东西和它不适用,故只能修改基类和它的其他派生类。比如Person本来有GetAge()方法,它最初的两个派生类(Student和Teacher)没有任何问题。这个时候,我突然想用Alien继承自Person了,因为除了GetAge之外,Person的成员Alien都需要。但是因为GetAge()不适用,需要同时修改Person,student和teacher,把Person的GetAge()挪到Student和Teacher里面。这就导致很多代码的修改。如果用组合,Alien包含一个Person成员,它只要不把Person的GetAge()暴露出来就可以了 ...

C++11专题:智能指针

背景

C++从C语言那里引入了指针类型,即所谓内建指针(built-in pointer)。传统的动态内存分配和释放(new & delete)也都是基于指针的,容易出如下问题:

  1. 忘记delete,内存/资源泄露
  2. 两次delete同一个指针,未定义
  3. delete之后的指针继续使用,未定义

而且,这些问题,很难调试,比如你delete了一个指针之后,堆上的同一块区域后来又被分配出去,那么你下次delete可能没有运行时错误,但是堆上的空闲链表却被你破坏了,之后的程序可能出现非常诡异的问题。

意义

智能指针,如果使用得当,可以防止以上三个问题,因为delete操作交给析构函数来进行(问题1、2),并且析构之后的智能指针被自动置null(问题3)。另外,通过不同类型的智能指针,可以实现普通指针不能实现的额外好处,比如共享资源(shared_ptr)、专用资源(unique_ptr)等。

这里说的使用得当是指,按照惯例来使用智能指针:

  1. 不要用同一个内建指针初始化或reset多个智能指针
  2. 不要delete ...

C++11专题:constexpr类型

代码是最好的文档,所以,本系列主要在代码中讲解。

背景

C++中的const变量,包括编译时常量(compile-time constants)和运行时常量(runtime constants)。其中,编译时常量又叫常量表达式(constant expression),只有初始化式也是常量表达式的const变量才是常量表达式。例如:

const int a = 1 + sizeof(char);
const int b = a + 2;

const变量不一定是常量表达式,所以,const变量不一定能用在一些需要常量表达式的地方,比如:

int fun() {return 0;}
const int n = fun(); // 非常量表达式,后面的(1)~(4)均编译出错
int arr[n]; // (1 ...