行者无疆 始于足下 - 行走,思考,在路上

Goodbye and Thanks to is-programmer.com

在这里折腾了五年,前些天给自己折腾出了新的写作工具,因此要说在见了。这个blog会继续维护,但是不会再发布新文章了,我目前也没有计划将这些文章转移过去,因此,这里权当存档吧……

新的blog地址是: http://xiaohanyu.me。See you.


书写是为了更好的思考。

– 刘未鹏

刚上大学的时候,我给高中同桌发短信咨询QQ该怎么用,他回了一条“计算机的教育要从娃娃抓起”……那时候我刚刚学会如何从控制面板里面卸载软件,刚刚学会收发 Email ,写 blog 对我来说是一件相当时髦的事情啊。

最开始用的是线上服务,什么 Dreamhost/DNS/WordPress 对于当时的我来说是难以逾越的技术难题。大概有一年多的时间,我在百度空间,和讯博客,博客园, Windows Live Spaces 等各种 blog 平台上写( 转载 )文章,玩( 自嗨 )得不亦乐乎。后来咱不是会写点小程序了嘛,就希望能找个支持代码高亮,并且广告要少些的博客平台。无意间找到了 is-programmer ,试用了下,很不错,就在那里安了家,迄已五年。

行者无疆 始于足下,这个 blog 基本上忠实地记录了我个人学习计算机的历程( 基本上是瞎折腾 )。最开始是学习( 折腾 ) Linux/LaTeX ,后来忙于学业 (OpenGL/Assembly),再后来开始实习(终于学会了SSH/SCP/Shell Script,掩面),疲于奔命,总算天幸顺利毕业,进入百度,后来偷得浮生,后来一夜之间……五年时间,不长不短,对于 天才选手 ,五年可以从无到有,站到世界之颠。对于我辈俗人,五年时间,也许刚刚够敲开计算机世界的大门吧。 五年来如果说有什么成就,就是始终没有离开 Open Source。这种坚持终于让我在去年收获了 200+ 个 github star,也让我进了 OpenStack 的贡献者名单。想想自己写的代码能够跑在别人的机器上, make the world a better place,还是很开心的。是谁说过,<我是一只 IT 小小鸟>。

认真的写作有如雕刻。

工作以后, blog 更新的频率大幅下降, 每篇 blog 的长度却大幅提高,随之而来的就是每篇 blog 写作时间的水涨船高。一方面美其名曰“工作忙( 其实是懒 )”,另一方面,自己偶尔回翻下自己以前的文章,个中观点语句,常感羞愧难当。因此每次写作,总是有些诚惶诚恐,咬文嚼字,条分缕析,大耗体力,唯恐贻笑大方。

写作有如登山,一日风睛,柳暗花明,辛苦求索的背后,是对自己生活的反思和锤炼。我常常在认真的写作中发现自己的思想盲点,正如行者登山,辛苦自不必说,孤独也是常态,只是这辛苦孤独之外,常常会伴随着山重水复般的壮丽风景。

大概在一年前,我开始着手寻找新的 blog 平台, is-programmer 对新手程序员而言是相当好的 blog 的平台,但是已经越来越无法满足我的需求,因此我将我的注意力转到了所谓的 static blog/site generator 上。这个折腾的过程一波三折,高潮不断,快感连连,折腾的结果就是你现在看到的新的 行者无疆 始于足下 。其中的技术细节繁复冗长,我会再写一篇文章加以详述。

行走 思考 在路上

New blog, new start. “身体与心灵,总要有一个在路上”,自勉。

2013, 青春绝版

年岁大了,人也变得愈发慵懒,前一分钟还梦见那些“偷得浮生半年闲”的美好午后时光,回过头来,2014已经过去了六分之一,而我还欠着自己一篇2013的年终总结。写文章,总得要有个名字吧。2012是“静水深流”,那2013就叫“波涛汹涌”吧。可是我仔细回想了下2013,想了两个月,终于发现,这一年,没有波涛,更谈不上汹涌。唯一攒下的,似乎就是自己肚腩上那因久坐长宅而堆起来的摇摇欲坠的一圈肥肉。这仿佛是岁月老人在提醒自己,生命的年轮又多了一圈,而你却多了一圈肥肉……

没有“波涛”,自然也无法“汹涌”,倒是年初无心写下的一篇博文, 让我平静的生活泛起了一大圈涟漪。一夜之间,我成了中国互联网的名人。我的博文先后被转载到网易科技和水木论坛并成为当日的十大第一,微博上有小一万的转发量,至于博客上,光这一篇文章的访问量就占了所有博客文章的五分之一。博文的转载方式和标题也是五花八门,什么“离职名录,屌丝逆袭”,什么“百度前‘小资’员工的控诉牛文”,什么“前员工追忆百度乱象:上下异心狼性压制人性”,更有甚者,说这是什么360的水军写文专门黑百度的。而我也收到了各种邮件,有百度学长发来压惊的,有出版人夸赞文笔不错询向约稿的,有单独约谈要交朋友的,有猎头询向跳槽的,有手握百度offer但是看了我的文章后犹豫不决过来征询意见的,还有一位仁兄口口声声要“拜我为师”,让我肝颤不已。无意之间,我经历了一场不大不小的互联网舆论风暴,而我就躲在风暴中心的某个角落里,静静地观察着整个事件的演绎发展,除了偶尔在博客上现身回复下评论外,不做过多的辩解和争论。虽是如此,这篇文章的受众之广还是远超我的预料,以致于三月份我去参加lisp-cn meetup时,朋友见面介绍都说“这位就是某某文章的作者”……

风暴总会过去,记忆难免淡忘。回过头来,当我数次想起,打开博客,以一个读者的身份去审视这篇文章时,我在想,这篇文章是不是真得如人所评,带有很强烈的个人情绪和主观色彩?反过来,如果我没有被百度fire,而是在百度得到了晋升,我还会写下这样大段的“真知灼见”吗?坦白的讲,应该不会。不过这些都不重要了,倒是那个躁动长夜中随手写下的一句箴言让我反反复复,久久凝视,无法忘怀:

“即使缤纷落尽,繁华消亡,青春绝版,也不要被生活磨平了棱角。”

2013,青春绝版。

这一年,我25周岁,自16岁离家求学,已逾九载。生活依旧是不紧不慢地过,青春无悔在一点一滴地磨,岁月不在它整圈整轮地长,思绪万千要半丝半缕地理。

这一年疏于写作,惰于阅读,唯一值得一提的进步就是Open Source。这一年我开始广泛地参与open source项目。Emacs方面,我花了近3个月的时间,阅读了不下50个emacs package的文档,总结了自己多年来的经验,发布了 oh-my-emacs 。毫不夸张地说,oh-my-emacs 目前是世界上最好的 dotemacs 项目。今年我会进一步,做一个精致的 oh-my-emacs 网站,并提供集中化的可下载的 “一键式安装包”。在开发 oh-my-emacs 的同时,我给很多 Emacs package 贡献了patch,包括 el-getsmartparensevil,swank-jsemacs-eclim 等。除此之外,我花了半天的时间照猫画虎写了 ac-geiser, 解决了Emacs中scheme编程的 auto-complete 问题。另外还有一个尚处于原型状态下的基于 org-mode 的静态站点生成器 org-site。 OpenStack方面,贡献了几个微不足道的patch,因此蹭得 OpenStack HK Summit的门票一张(但是没有去成),建立了openstack git.oschina 镜像, 和朋友一道在车库咖啡组织了一次 OpenStack Beijing Hackathon, 大家玩得开心,聊得尽兴。Python方面,给 testtools 贡献了2个patch,了解了下 flask

这一年我开始更认真地审视时间的价值。确切地讲,是因为我发现我的时间开始值点钱了。青春年少的时候,可以整日整月疯疯颠颠山山水水地跑,待到养家糊口的年岁,才发现,同样的时间,你可以用来读书充电,可以用来工作赚钱,也可以用来娱乐享受。所以在九月份的时候,我再度选择了裸辞,重新回到了“偷得浮生半年闲”的状态。上半年我在公司靠着一个人的推动,建立了一套完整的基于jenkins的自动化测试/构建/发布的体系,奈何公司糟糕的开源策略,以及一些不是那么聪明的人,让我到后来有浪费时间之感。从百度到易云,从一个中国互联网的顶尖平台,到一个千万创业大军中的普通公司,两年的经历思考,让我初步想明白了互联网创业是怎么一回事。创业公司该招怎样的人?哪里可以省钱哪里不要吝啬?市场优先还是技术优先?为什么要拥抱开源?品牌推广一定要靠广告吗?年底的时候,经朋友介绍,正式开始了一段远程soho生活,和几个老外合作几周下来,发现自己的英文还算不错,交流工作毫无障碍,很是出乎意料。同时我也接触了一些清华的创业团队,人生百态,创业艰辛,不一而足。行文至此,我又想起来我刚到北京时一心一意要在百度干三年的那个“最初的梦想”,提提神,醒醒脑,刚上大学的时候,我还想当一名“精通数理化,英语呱呱叫”的学霸来着。每天早晚照镜刷牙的时候,看着自己那张布满青春美丽痘坑的脸庞,我就想送自己两个字:“呵呵”。不忘初心,方得始终,我等凡夫俗子,万事反复,骑驴看本,只是切莫在旅途中,忘记出发时那最初的梦想,正所谓念念不忘,必有回响。

这一年大概读了40+的书,遗忘的多,记住的少,用来吹牛推荐的,屈指可数也。人文方面,被柴静的《看见》 感动的一塌糊涂,有段时间简直是爱上这个姑娘了,又把柴静主持的央视的《看见》 从头到尾翻看了一遍。“不要因为走得太远而忘记为什么出发”,学会看见,学会感触,学会不要遗忘。政史方面,被《邓小平时代》 震撼的一塌糊涂,配合着又读了《论中国》、《蒋介石与现代中国》、《蒋经国传》, 深感自己见识浅薄,慎言多思才是生活之道也。技术方面,被《The Linux Programming Interface》 震撼+感动地一塌糊涂,特别花500大洋买了人生第一本进口原版。《HTTP The Definitive Guide》也是一本极好的书,每一个Web开发的技术人员,无论是前端还是后端,都应该常备常翻。茶余饭后,会挤点时间看看《舌尖上的中国》、《我的抗战》、《地球脉动》, 算是弥补下一日之计晨光日照下慵懒颓废而被浪费掉的被窝时光。偶尔也会有心烦气燥的时候,有如女人月事,每个季度来那么一两次。我不会打游戏,北京空气又不做美,只好窝在家中没日没夜的美剧动漫度日。

这一年,生活上依旧是一穷二白,月光如洗。月入钱财,免去房租口粮读书之用,特别提款百元,报备领导,用于捐助我所喜欢的软件,自名为“每月一捐”。去年一年大概坚持了七八个月,捐助了Emacs/Vim/KDE/Wikipedia/Smartparens等我所喜欢并正在使用中的open source软件。除此之外,给妞升级了电子装备,还了家中7000大洋,买了linode一年vps,参加好友婚礼两次,耗金数千。得了一次胃病,与医院纠缠小半年,耗金两千。捐助雅安地震100大洋,捐助北大元培学生100大洋。小算下来,来京两年半,各种捐助,盖有5000大洋左右,很是痛快,吃嘛嘛香。

这一年,我开始更加深刻地领悟到了宿命这两个字的含义。一梦如是,多年以来,我第一次和父母爆发了一大一小两次冲突。一个人无法选择自己的出身,也很难改变他人的认知,怜其不幸怒其不争的同时,也不要忘记“这个世界上没有任何人能对你的痛苦感同身受”。作为中国改革开放大环境下千万入城大军中的一员,我知道这是我必须承担的代价。

差不多了。凡夫俗子的文章,总是难免罗嗦又琐碎。最后再琐碎一点,去年总结的时候我写到“五笔输入法的学习也初见成色,再咬牙坚持半年应该可以作为日常输入法使用”,我做到了,这篇文章就是用五笔敲的。速度几于拼音持平,再过半年应该会有更大的提升。

孔曰逝者如斯,不舍昼夜。我云青春绝版,初心未泯。与君共勉!

Announcing oh-my-emacs v0.3

Today I'm happy to announce oh-my-emacs v0.3.

It has been three months since I first released oh-my-emacs from my homebrew messy dotemacs project to public. To my suprise, oh-my-emacs has attracted many interests from all over the world.

The v0.3 version of oh-my-emacs contains various improvements, check its CHANGELOG for a condensed feature list.

Several features worth mentioning (v0.1->v0.3):

  • code refactoring:
    • Oh-my-emacs splits all its modules into two levels: core and modules. Files in core are required by default, while files in modules are optional. You can load necessary module when you really need it.
  • ome-org module:
    • Upgrade org-mode to latest 8.x branch. This brings us a more powerful export engine.
  • ome-cc module:
    • Oh-my-emacs support auto-complete for C/C++ macros! Combined with pkg-config, oh-my-emacs cc module can be used as a perfect C/C++ working environment with perfect semantic completion for functions and macros for any installed libs recognizable by pkg-config.
  • ome-java module:
    • Oh-my-emacs provide semantic completion for Java projects via emacs-eclim. Though not perfect(and a little heavy), this is a workable solution now.
  • ome-lisp module:
    • The original ubiquitous ome-lisp module has been split to four modules:
      • ome-emacs-lisp module
      • ome-common-lisp module
      • ome-clojure module
      • ome-scheme module
  • documentation:
    • Add a table to specify the system requirments and el-get packages. Thus you can install necessary system tools to make oh-my-emacs modules work as expected.
  • compatibility:
    • Improve compatibility for Mac OS X.
  • completion:
    • Add semantic completion for scheme (via ac-geiser)
    • Add completion table to show you the currrent semantic completion support for various programming languages.
  • miscs:
    • Basic support for JavaScript, Ruby, OCaml.
    • Move some unstale packages to ome-experimental module, load as you need.

Five months of spare time work, 200 git commits, 120 github stars and 35 github issues, all of the above work forms a less than 50MB tarball, which contains 50 el-get packages, 1000 lines of emacs-lisp code, 4000 lines of documentation, hundreds of reference web links, just download and extract this tarball, you'll get a tuned Emacs OS, and it works almost everywhere.

It's time for new year, and I hope you enjoy this gift. Any feedback will be appreciated. Thanks!

 

Announcing ac-geiser v0.1

由于某位 仁兄 的抬爱,oh-my-emacs 发布之后,在 reddit 上出人意料地受到了很多人的 关注。而我也在一夜之间收获了20多个github star,以及人生的第一个 pull request。突 如其来的关注让我有些欣喜,也让我看到了两个月工作的价值。技术上来讲,oh-my-emacs 根本算不上“高端大气上档次”的项目,无非就是读文档读文档写文档外加el-get package的 整合测试。不过话说回来,这两个月以来真心是写了不少文档啊,要是按照一个el-get package一篇blog来算,平均下来两天就可以有一篇Emacs Tips这种文章了。连我都有些佩 服自己的耐心了。

我想,oh-my-emacs 之所以受到了一些的关注,归根到底,还是 oh-my-emacs 确实解决了 一些现实中的问题吧。上篇博文 中我曾经提到,基于 auto-complete 的语义补全是 oh-my-emacs 最看重的目标之一。

也正是基于这个宏伟的目标,我又花了一个晚上的时间,折腾出 ac-geiser,"an Emacs auto-complete backend for geiser"。

去年学习 SICP 的时候就一直希望能有个类似于 SLIME 般强大方便的工作环境1,几番折 腾之后未能如愿,乖乖用Vim作了一百多道SICP的习题。而我的Scheme经验也就止于这些习 题了,因此ac-geiser 可能目前还不适合工程性的应用2。不过对于单个Scheme文件的程序, 我觉得应该还是值得一试的。还是老样子,放张图吧:

ac-geiser

Enjoy it.

--

Footnotes:

1 如果你不知道SLIME如何强大,可以参考 这里 以及 这里

2 话又说回来,Scheme现在似乎也没有多少工程性的应用吧?各个Scheme实现中也没有遵 循 统一的Module/Package的标准。Scheme本来又是极小核心的语言,因此这使得Scheme非常 适合作为教学语言。但似乎除了教学,Scheme一直都没有走出校园过。以上纯属个人认知, 欢迎指正批评。

Announcing oh-my-emacs v0.1

去年偷闲的时候,挖了好多大坑(这里这里这里),怎奈挖坑容易填坑难……客观原因自然是“认真的写作有如雕刻”云云,主观上嘛,“懒”大概是逃不脱的一个字吧。

Wait,是谁说过,“懒惰是程序员的美德”来着。秉承这种美德,耗了将近两个月的业余时间,尝试了不下50个el-get package,并且认真读了不下10个package的manual,遂成 oh-my-emacs.

一切缘起于两个月前的某一天,我忽然心血来潮,想要整理下那一坨"just works"的.emacd.d。我几乎尝试了所有github上比较流行的.emacs.d,但是没有一个满足我的需求。“因为所以,科学道理”, Reinventing the wheelNot invented here 大概是每个程序员必修的一课吧。索性不管那么多了,代码写的不好,又不输房子不输地,坑 挖的不好,大不了留着自己用就是。

Oh-my-emacs着重解决的问题是(引用自oh-my-emacs的README):

  • Better default settings with various eye candy, powerline, scrollbar, color-theme, fonts, etc.
  • Adopt el-get as the default package manager for Emacs, instead of the default builtin package.el, say goodbay to ./configure; make; make install and explicitly mananully management of load-path. el-get also provides automatic documentation management, customizable user's recipe support, etc.
  • Self-adapted, only install necessary packages when it satisfy the prerequisities. You need to install clang for auto-complete-clang, for example.
  • Modular, only load necessary packages as you need.
  • Literate, each package have comprehensive documentation or even a tiny tutorial with it, together with necessary web links. Say goodbye to old, out-dated emacs lisp code from Google.
  • Work as expected, completion every where when possible, semantic code completion through auto-complete with various ac backend, helm for minibuffer completion, etc.
  • Full-blown, oh-my-emacs is not another starter kit, it is hacker kit.

这其中,补全、文档、自适应性,是我特别看重的三点。补全自不必说,作为上古大牛也 许是不需要补全的,但是对于我这样21st Century成长起来、尝试过Visual Studio强大补全甜头的程序员来讲,补全是最为迫切的需求。而Emacs/Vim作为General Purpose Editor, 其最大的使用不便就是没有代码的语义补全(semantic completion)。Emacs有一个内置的 Semantic, 来源于Emacs社区鼎鼎大名,目标远大的CEDET, 但是Semantic的使用和配置 都很复杂(参考emacser.com的文章),而且很慢,有时会让Emacs卡住。究其原因,我认为 Semantic 的思路是不对的。用性能本就不怎么好的Elisp去实现复杂如C++这类语言的 Parser,其本身就是浩大的工作量。正确的思路是,对于不同的语言,依赖于不同的 backend,然后用Elisp写相应补全的interface。所以我认为, auto-complete 的思路是正确的。oh-my-emacs利用已有的各种auto-complete的backend(如 ac-slime, auto-complete-clang 等)基本上实现了对C/C++,Python,ELisp/Common Lisp/Clojure的语义补全。

第二点是文档,Emacs的世界从来不会缺乏选择, el-get-list-packages ,2500个 package,其中有很多package要么是已经过时,要么是年久失修,要么是语焉不详,看上去 一片繁华的Emacs世界,实则荆棘密布。如果你没有一点Elisp的功底,想开箱即用,那几乎是不可能的。单拿Python来说,Emacs和Python社区就有两套不同的 python.el ,这给很多Python和Emacs的初学者造成了困惑。Google: Python Emacs,其首页的几套解决方案,采用的是不同的 python.el ……你说对于一个好容易学会翻墙,开始习惯用Google搜索技术文档的计算机初学者而言,看完这些文章,不晕菜才怪呢。稍微复杂一些的配置,比如 TeXLive,在比如Common Lisp的各种实现和SLIME,想要得到一个比较舒适的环境,不但要配置好Emacs,还要配置好系统环境,这又是一大难题。oh-my-emacs借助org-mode Babel, 采用Literate的方式1, 将文档和代码写在一起,在文档中尽量给出每个模块所需要的系 统环境;对于有多个选择的情况,文档中尽量给出为什么选用package A而不是package B的理由和权衡过程。有一部分文档甚至可以当作Tutorial来看。Literate方式最大的好处是保 持文档和代码的同步,这样,oh-my-emacs即可以用作是“开箱即用”的.emacs.d,也可以当作是手把手的Emacs配置教程 (统计下来,oh-my-emacs中文档和代码的LOC 比例约为3:1左 右)。另外,操作系统的环境千差万别2, 因此oh-my-emacs基本上在每个相关模块的文档里面都指明了使用这个模块所需的系统环境,这也可以看做是我为了填去年的坑所做的一点努力吧。

第三点是自适应性。这又是一个很宽泛的话题。什么叫自适应性?是支持多个操作系统吗? 不是的,至少我没有打算让oh-my-emacs很好的支持Windows,一方面是因为Windows没有一个好的类似于apt-get这种类型的package manager3,oh-my-emacs依赖的很多底层软件如ssh,gcc/clang,TeXLive等在Windows上配置起来都很麻烦,远不如 apt-get/yum/pacman/homebrew这种一条命令来的方便。我这里讲的自适应性,主要包括:

  • 采用el-get, 自动化管理load-path,以及info文档等,say goodbay to git submodule
  • 如果系统环境不满足某个package的要求,就不要安装这个package,免得装完了不能用。 比如 auto-complete-clang 依赖于 clang, 如果系统中没有安装clang,那么oh-my-emacs在启动的时候就不会安装 auto-complete-clang。反之,如果你意识到这个问题并安装了clang,那么可要重启Emacs, auto-complete-clang就应该可用了。
  • 尽量借助工具和代码获取相关配置,而不是在代码中写死。比如,oh-my-emacs大量使用Elisp中的 executable-find ,这需要依赖于操作系统的package manager设置好相关的 $PATH , 这样带来的好处就是oh-my-emacs能够无缝的适应很多环境。
    • 比如 AUCTeX需要PDF阅读器作为LaTeX文档的Viewer, oh-my-emacs采取的策略是优先采用 Okular, 其次是 Evince, 如果操作系统上即没有装Okular也没有装Evince, 那么oh-my-emacs会fallback到 xdg-open, 这样可以用可移植的代码获得最大限度的灵活性和自适应性[4]。
    • 再比如 SLIME 支持多种Common Lisp Implementation, oh-my-emacs采取的策略是同时支持 SBCL/Clozure CL/CLisp ,也就是说,只要你安装了SBCL/Clozure CL/CLisp其中的一个,oh-my-emacs的Common Lisp设置就应该是可以工作的。
    • 针对auto-complete-clang, oh-my-emacs可以利用 pkg-config 检测并设置正确的 ac-clang-flags , 可以对系统中可用的任意C/C++ lib提供语义补全。比如,你可 以用 M-x ome-pkg-config-enable-clang-flag "QtGui" RET 来获得QtGui库的补全 支持,效果可以参考这里

Oh-my-emacs目前已经包含了对C/C++/Python/Common Lisp/Clojure的支持,基本上都提供了较好的语义补全。其他方面,设置了更友好的字体,powerline,color-theme。启用了 一些比较好的内置mode,诸如recentf/savespace/uniquify。对\LaTeX编辑提供了完整的支持,默认采用XeTeX。

Oh-my-emacs的名字来源于 oh-my-zsh, 用意嘛,自然是希望能将oh-my-emacs打造成oh-my-zsh那样。大话止于此,看行动。

最后放张图,更多美照在 这里 。Enjoy emacs, and, your life.

oh-my-emacs

--

Footnotes:

4 这个PDF阅读器的例子主要是在Linux下面测试的,我手头没有Mac的环境,so, patches are always welcome.

1 Literate programming 的 概念来源于祖师爷 Donald Knuth。没记错的话,大名鼎鼎的 \TeX 早期也是用literate的 方式写成的。 Org-babel提供了所谓的"active code in Org-mode",还有专门的Paper论 述Org-babel的workflow。 oh-my-emacs这方面的灵感主要来自于 emacs24-starter-kit

2 也许正是如此,puppet/chef这类工具才会大行其道吧。

3 chocolatey 也许是个不错的选择,但是我没有用过。

 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee