推荐 VimWiki April 13, 2010

作为技术人员,对于知识的管理、沉淀尤其的重要。 我说过我们生活在知识爆炸的年代 ,浮躁的我们往往迷失在浩如烟海的知识中。 Yibie Blog 上的文章 《我什么使用 OneNote》 很有共鸣,在这里分享下我的经验和看法。

需求

知识管理的一条途径就是做笔记。笔记类的软件有很多,这些工具在深度使用以后粘性很大,以后想再转其他同类型的工具,往往成本很大。细想之下,我是个挑剔的人,所以我对此类软件有下面的要求:

Why VimWiki

http://files.gracecode.com/2010_04_12/1271087021.png

其实对于使用 Vim 的朋友来说,用 Vim 写 Wiki 并不是件新鲜的事情。如标题所说,VimWiki 可能本身并不是非常的强大,但配合各种工具后,你甚至完全可以考虑扩展它的功能。

对比上面的需求,之所以选择 VimWiki 是因为

「在云端」

有关 VimWiki 的安装和配置, 善用佳软已经有很详实的文档 ,这里就不再复述了。这里我说说配合 Dropbox 、rsync 等同步软件打造「云间」的个人记录工具。

http://files.gracecode.com/2010_03_20/1269096655.png

一图胜千言,上面的简图主要说明了我如何同步 VimWiki 。篇幅的关系,有关此技巧的更多信息, 参见这里

@TODO

处于 VimWiki 的高可定制性,个人对于二次开发 VimWiki 有很浓厚的兴趣。我想近期能够为它做的事情

最后,其实说到底像 VimWiki 这类的知识管理工具,还是要自己深度去利用。为了避免陷入软件的争论战,先写到这里。

-- EOF --

控制 22 分钟的会议时间(翻译整理)April 1, 2010

「会议拉锯战」是每个人都头痛的。如何高效的进行会议,相信每个人都希望了解。那么或许 这篇文章 可能给大家有所启发。

-- Split --

没有人因任何的因素喜欢开会。其实很多情况下,大部分的人都认为一些的会议都是在浪费时间。

那么,如何剔除会议中那些浪费时间的方面,留下精华部分?

让我们尝试下将会议时间压缩到 22 分钟,Nicole 首先提出了这个想法,我个人认为这是目前所能看到的最容易做到而且有效的办法。

这里是他提及的一些方面:

http://files.gracecode.com/2010_03_31/1270028282.png

请原谅我可能没有完全清楚得阐述他的核心观点,因为这些内容我是从他的想法中部分摘记而来。其中每条详细的观点如下:

制定 22 分钟时间的会议

谁规定所有的会议时间需要花半个小时甚至一个小时?这有何数据依据?当然没有。

其实,这点时间留给人们去阐述、辩论自己的观点显然不足够。因此反过来讲,也不可能所有的会议在 22 分钟之内搞定。

但你可以尝试尽可能将会议时间控制得越来越短,而不是越来越长。

有个共同的议程

有个明确目标的议程将会使会议锦上添花、有的放矢。

可以考虑在白板上写出议程的内容,同时加粗相应的关键点,由此不断提醒大家我们这个会议需要达到什么样的目标。

提前 3 天发送邀请和相关必读内容

虽然这可能是会议组织者的负担,但这能为组员降低尽可能小的成本。

千万不要让会议变成「大家尽可能得先了解文档中的内容,然后必须提交相应的作业」等这种情况。

准时开始

会议准时开始的这种情况发生的几率有多少?该死,实际情况是几乎没有。

你可能会说,部分的情况可能是由于 Outlook 等程序可能没有设置足够的提醒时间的问题。当然纯粹依靠软件是不靠谱的,甚至我建议你可以使用便签等「土办法」。

同时 22 分钟的时间对于个人而言,也可以当作是做个缓冲休息时间。

站着开会

舒适的椅子会让人「变懒」,而同时站着开会能提醒大家目标是不是需要说明或者补充(参见 「混乱的站立会议」 )。

同时,你需要保持你的观点,如有必要请保持沉默,将它留到会议外去单独处理。

不要带笔记本,但记得带纸笔

如果你承诺会议会在 22 中之内搞定,那么就没有必要带其他无关的物品。

我甚至认为带上这些东西你将重复你中学时的覆辙 -- 看起来你在开会,而其实你的心已经飞往他处。

纸和笔会让你的头脑清醒,也有利于分工:一个人讨论问题,另外一个人记录。

同时禁止带手机

理由同上

注意!记录所有的话题相关的反馈

如果是个会议,那必定有个人会担当组织者的角色,记录所有应该注意的点。

同时,反馈中可能会有支线等情况发生,你应该避免这些话题不会离会议本身的议题太远。

尽可能快的发送会议记录

22 分钟并不长,但你应该尽可能快的发送相关的会议记录,组织并计划下个会议。

好了,我想你有更多补充这个话题的观点,那么也请你不吝的提出。如果你愿意,你完全可以和其他人分享这个话题。

-- EOF --

What is 'this'? - Part.2March 25, 2010

好了,我们 继续上次留下的问题

var x = 10;
var foo = {
    x: 20,
    bar: function () {
        var x = 30;
        return this.x;
    }
};

console.log(
    foo.bar(),             // 1.
    (foo.bar)(),           // 2.
    (foo.bar = foo.bar)(), // 3.
    (foo.bar, foo.bar)()   // 4.
);

我们考虑语句 3. 和上面的两个语句有什么不同

(foo.bar = foo.bar)(), // 3.

相比语句 2.,语句 3. 中的 Grouping Operator 中有赋值(「=」)语句。那么,我们首先得明白赋值语句干了啥,继续 参考对应的 ECMA 文档

11.13.1 Simple Assignment (= )

The production 
    AssignmentExpression : LeftHandSideExpression = AssignmentExpression 

is evaluated as follows:

1. Evaluate LeftHandSideExpression.
2. Evaluate AssignmentExpression.
3.Call GetValue(Result(2)).
4.Call PutValue(Result(1), Result(3)).
5.Return Result(3).

其中,最重要的步骤就是 PutValue,我们 继续刨根问底

8.7.2 PutValue(V, W)

1. If Type(V) is not Reference, throw a 
   ReferenceError exception.
2. Call GetBase(V).
3. If Result(2) is null, go to step 6.
4. Call the [[Put]] method of Result(2), passing GetPropertyName(V) 
   for the property name and W for the value.
5. Return.
6. Call the [[Put]] method for the global object, passing 
   GetPropertyName(V) for the property name and W for the value.
7. Return.

所以,我们根据上面的定义可以得知,语句返回的是 foo.bar 的函数值。因此,赋值操作符返回的是「值(Value)」而不是「引用(Reference)」。

因为函数体需要 this 值获取 x 属性的值,那么接下来我们考虑改函数时调用时的上下文作用域以及背后的具体流程。 尤其注意第七条规则

...
6. If Type(Result(1)) is Reference, Result(6) is GetBase( Result(1)). 
    Otherwise, Result(6) is null.
7. If Result(6) is an activation object, Result(7) is null. Otherwise,
    Result(7) is the same as Result(6).
8. Call the [[Call]] method on Result(3), providing Result(7) as 
    the this value and providing the list Result(2) as the 
    argument values.
…

那么在这种情况下,GetBase 操作实际上返回的是 null,因此此条语句函数执行的作用域为 global ,在浏览器中也就是 window 。

(foo.bar = foo.bar)()

那么,上面的语句中我们可以得知

  1. Grouping Operator 中的赋值语句返回的是 foot.bar 的函数值(「Value」)
  2. 该函数执行的上下文作用域为 window

那么,在该函数中执行获取 this.x 也就是获取 window.x 的值。因此,这条语句返回的就是 10 。如果还不理解,考虑下面的代码段

var x = 10;
(function() {
    return this.x; // 这里会返回什么?
})();

如果理解了上面的语句的前因后果,那么题目中的语句 4. 就能举一反三给推导出来。首先我们来了解逗号运算符(「,」)的定义,我们就可以得之语句

(foo.bar, foo.bar)

返回的也是 foo.bar 的值「Value」而非引用「Reference」,那么接下来的事情其实就是和语句 3. 一样的了。因此,语句 4. 返回的液是 window.x 的值,也就是 10 。

总结下,那么上面的输出总的来说是

20 20 10 10

-- Split --

似乎目前为止,我们已经完全回答出了当初设定的问题。但恐怕会留下疑虑,就是传值「Value」和引用「Reference」之间到低有何不同、函数的作用域以及 this 的指向是否已经真正了解?

是的,这个题目已经完了,而我们的问题似乎还是没有怎麽搞清楚。OK,下次我们来详细讨论下这个问题…

-- To be continued --

Yahoo 统计