『我的奋斗』

每天浸染互联网的人总会听说过一些关于罗永浩的只言片语:创办老罗英语培训学校,创办牛博网,西门子冰箱维权,与方舟子的骂战……在媒体和网友的眼中,老罗一直是个彪悍、幽默、特立独行的形象,『我的奋斗』汇编老罗演讲稿、自述和语录,记录老罗“成功”之前的故事……老罗是个有故事的人,不论故事是否真的发生过,从他口中说出来,就是他的故事。有知名公众人物曾评价他是“一个价值观完全正确的人”,是否价值观完全正确,评判标准在于个人。以下就是老罗输出的几点价值观:

1. 关于阅读
老罗自小闲书读得多,这让他跟身边学习成绩好的优秀孩子交往起来让自己更有自信。因为这份自信,小学三年级时,他在课堂上多次指出老师的错误,让老师觉得很不爽,后来她派她的高中儿子来打他,⊙﹏⊙b,这一段我觉得都能上糗百了。阅读很重要,老罗说他辍学在家读的三年闲书收获比在学校里大得多。即使是成功学的书,虽然没有思想没有内容没有营养,但作为精神鸦片的作用可以在奋斗过程中坚持不下去时拿来随手翻翻提提神。

2. 关于教育
学校教育一直倡导“知识改变命运”,老罗也相信“知识改变命运”,然而与老罗价值观冲突的是,现行教育体制实际产出的是“学历改变命运”。教育体制外的老罗,体制内的学生,都在读鲁迅,不同的是老罗读『鲁迅全集』,学生读鲁迅的某一篇文章的节选,读完之后还要回答类似“节选中第二自然段为什么鲁迅要讲那么一句话?”之类的问题,这些可能连鲁迅自己都不知道的答案,偏偏教委知道,是否知道答案还关系到升学……这样的场景,我想是所有从小在课堂上学过鲁迅、学过冰心、学过朱自清的人都会有的体会吧。

3. 关于中医
老罗是坚定的中医反对者。他认为中医既然一时半会儿否定不了,那么更应该从有趣的科普文章入手,即使无法马上改变世界,至少留下火种,留下希望,并引用普朗克一段话“一个新的科学真理取得胜利并不是通过让它的反对者们信服并看到真理的光明,而是通过这些反对者们最终死去,而新的一代一开始就熟悉它并不断地成长起来的”。会思考的人即使吃着中药长大也会有意识到中医是伪科学的一天。

4. 关于逆境
面对逆境,老罗教人“不要伤心,不要难过、不要沮丧、甚至不要控诉、不要愤怒、不要抗议,只管埋头默默擦亮你的武器,准备下一次的战斗”,什么叫埋头默默擦亮武器?有一个东汉光武帝刘秀的故事,当时刘秀打了败仗,夜里巡房时士兵们有哭哭啼啼的,有写家书写情书的,有醉酒的……只有一个将军拿着一块布在不停地擦着自己的武器和盔甲,脸上表情不悲伤不沮丧不愤怒不亢奋……后来,这个将军成为东汉的开国名将,他叫吴汉,“云台二十八将”中排第二。

5. 关于独立思考
独立思考的标准是什么? 就是“怀疑一切过去没经自己思考判断就接受了的想法”。在大家都批判这个社会笑贫不笑娼时,独立思考的人会反问"为什么妓女就该被笑?妓女比穷人差在哪里?"。

--EOF--

git reflog

今天git提交代码的时候,因为提交了一个错误的文件,于是蛋疼地用刚学到的git reset --hard命令来取消提交。按我的理解,git reset只是移除仓库中的commit记录,使所有相关文件回到暂存区,也就是git add之后的状态。结果就悲剧了。

还好有个git-reflog命令,可以详细记录仓库中各个分支的状态变更情况,比如checkout、merge、reset、cherry-pick,以及最重要的commit操作。从git-reflog命令输出的列表中可以看见每次操作的commit-id,如:

1
2
3
4
5
MacBook-Pro:pf fengchj$ git reflog
ac86a08 HEAD@{0}: reset: moving to ac86a080cc0859662e727de625fc414a211ba6c2
92f3986 HEAD@{1}: commit: update configuration. 
ac86a08 HEAD@{2}: commit: misc: 解决接口中文乱码问题。
1ccb4a3 HEAD@{3}: commit: misc: 修改获取列表接口配置(兼容状态推送)。

从上面可以看出,因为执行了git reset --hard ac86a080cc0859662e727de625fc414a211ba6c2导致当前分支回到了“ac86a08 HEAD@{2}: commit: misc: 解决接口中文乱码问题”提交后的状态,也就是说丢失了“92f3986 HEAD@{1}: commit: update configuration. ”这次提交的所有信息(git log中看不到)。

git有多种机制保障只要知道丢失的commit-id,就可以还原因误操作丢失的commit记录。

例如,执行git reset --hard 92f3986可以将分支强制回复到92f3986提交后的状态。也可以用『git cherry-pick』一文提到的git-cherry-pick命令来还原:git cherry-pick 92f3986。此外,还可以用merge命令来还原:git merge 92f3986。

所以只要有了git-reflog命令,就不用怕因误操作而丢失commit记录。另外,如果不进行额外配置,git-reflog默认保存30天的操作记录。

References:
[1] reflog, your safety net. http://gitready.com/intermediate/2009/02/09/reflog-your-safety-net.html .
[2] git-reflog(1) Manual Page. https://www.kernel.org/pub/software/scm/git/docs/git-reflog.html .

--EOF--

NO BOM

本来以为记事本编辑的纯文本文件应该是所见即所得,偏偏Windows会自作多情在非ANSI编码的文本文件中偷偷加入BOM(Byte-Order-Mark),其实这是历史原因,起因是UNICODE。

UNICODE字符编码提出是为了解决计算机能够显示全世界所有文字和字符(主要是中日韩),它用两个字节的长度共16位能表示216=65536个字符,这样必然会出现字节序(两个字节的顺序先后)问题。little endian和big endian有各自的应用领域,目前Wintel架构的PC都是little endian,而PowerPC、Motorola、SPARC架构的CPU采用big endian方式存储数据,另外TCP/IP协议也是以big endian方式传输数据的(见『big endian和little endian』)。

记事本保存文件有4种编码方式可以选择:
1. ANSI
2. Unicode
3. Unicode big endian
4. UTF-8

其中ANSI对应着本地(locale)编码方式(GBK、 Big5, etc.),Unicode和Unicode big endian分别对应UNICODE编码时的little endian和big endian。至于UTF-8,它实际上是一种对UNICODE编码进行编码的方式。后三种方式都会被记事本强制加入BOM字符(UNICODE编码中的0xFEFF),这样打开文本文件时它就会利用BOM字符来得到正确的字节序。0xFEFF本身是个0宽度的空字符(ZERO WIDTH NO-BREAK SPACE),一般编辑器中是看不到的,想要一窥究竟,可以找个*nix系统,用自带的xxd命令(man page)来以16进制方式查看文件内容。

作为试验,我在Windows下在记事本中输入“test”并分别以上述4种编码方式保存文件。在*nix bash下以xxd命令查看文件内容如下:

1
2
3
//以ANSI编码存储
$ xxd ansi.txt 
0000000: 7465 7374                                test
1
2
3
//以UNICODE little endian编码存储
$ xxd unicode.txt 
0000000: fffe 7400 6500 7300 7400                 ..t.e.s.t.
1
2
3
//以UNICODE big endian编码存储
$ xxd unicode-be.txt 
0000000: feff 0074 0065 0073 0074                 ...t.e.s.t
1
2
3
//以UTF-8编码存储
$ xxd utf-8.txt 
0000000: efbb bf74 6573 74                        ...test

可以简单分析得出,0xFEFF以little endian方式编码为0xFFFE,以big endian方式编码为0xFEFF,符合人类直觉。但是以UTF-8方式编码却变成了0xEF 0xBB 0xBF,实际上,这三个字节就是0xFEFF经UTF-8编码(编码规则)以后的样子。

Windows系统下带来的BOM挺恼人的,一些对解析格式有要求的类库因BOM闹bug时都不知道从哪里下手调试,比如PHP、JSON、XML、Markdown等解析。如果想去除BOM字符,一个比较简单的方法是打开Vim,在命令模式下输入":set nobomb",:wq保存即可。

如果一个去除了BOM字符的UNICODE编码文件,拿回到Windows下用记事本打开,会不会因为没有BOM而被当成ANSI编码文件打开呢?理论上是这样的,只不过记事本没这么傻,它会调用IsTextUnicode()函数来获得当前文本的编码方式,这个函数的实现依赖与统计分析,所以只能得出一个”比较正确“的结果(见『Some files come up strange in Notepad』)。

References:
[1] 「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个?http://www.zhihu.com/question/20167122/answer/14199022.
[2] BOM BOM BOM. 来自WordPress.
[3] Linux查看文件编码格式及文件编码转换. http://blogread.cn/it/article/900?f=wb.

--EOF--