刘毅同学

About Python, MySQL & Life

Octopress迁移到新主机

| Comments

  • 新机器上首先是把ssh key加入到github的setting,然后配置好基本的git信息(email, name),此处步骤略过。可以参考:https://help.github.com/articles/set-up-git/
  • git clone -b source git@github.com:username/username.github.com.git octopress
    • 操作完这一步后就相当于把当前octopress的source文档拉到了本地了。
    • 这一步操作前一定要确保在其他机器上的markdown文件以及其他配置文件的修改都已经push到source分支了,否则这一步会导致博客文章丢失!!!
  • 进入到octopress, 然后git clone git@github.com:username/username.github.com.git _deploy
    • 这一步是在_deploy建立好指向master分支的git仓库,方便之后发布文章时使用
  • 安装octopress相关的ruby依赖等
    • 建议修改rubygems的安装源到国内的taobao源,详细操作步骤:http://ruby.taobao.org/,默认的rubygems.org源已经被墙,速度很慢。

完成上面几步后,就可以尝试调用rake generate生成一次网站,然后rake deploy看下是否成功~

在不同主机上使用Octopress上发布文章

每次发布新的文章或者修改现有文章时,需要把source分支的修改(即octopress目录所指向的git仓库分支)commit并且push到github上,之后在另外的主机上首先进入到octopress目录,在编辑文章前首先git pull下拉取修改。这样的编辑才能连贯,不然会发生文章丢失的情况。

Reference:

-EOF-

由互联网中的Python应用想到的网站架构的优化

| Comments

  • 国内1
    • 知乎
    • 豆瓣
    • 果壳网
  • 国外,只列出我认识的比较出名的,还有好多2=。=
    • Quora 国外的知乎?
    • Dropbox 国外的金山快盘?
    • Disqus 国外的多说?
    • Pinterest 国外的花瓣?
    • Youtube 国外的优酷?
    • Slideshare 国外的百度文库?
    • reddit 国外的猫扑?
    • Yelp 国外的大众点评

更多的信息可以参考Python官网的Python Success Stories

Quora

下面是QuorWhy did Quora choose Python for its development?a创始人在Quora上对Why did Quora choose Python for its development?的回答3

We decided that Python was fast enough for most of what we need to do (since we push our performance-critical code to backend servers written in C++ whenever possible). As far as typechecking, we ended up writing very thorough unit tests which are worth writing anyway, and achieve most of the same goals.

可以看到对于Python的性能短板,Quora在performance-critical的地方尽可能换用了C++。对于Python没有静态类型,Quora用尽可能的单元测试来确保质量。之所以选择Python其实很大的原因是Founder对Python比较擅长。 进一步google了下,他们的框架用的Pylon。

知乎的技术架构

知乎CTO在去年年底有过分享,目前在InfoQ上能找到整理稿。链接:http://www.infoq.com/cn/news/2014/12/zhihu-architecture-evolution

简而言之用的tornado,自己开发了日志系统Kids,消息传递系统Sink,还有页面渲染ZhihuNode。

网站架构及性能的思考

本周听了一次FB周海平在阿里内部的一次分享。无论是阿里、Facebook还是豆瓣,我发现了在网站架构上这几家有很多共同点的:

  • MySQL作为存储后端
  • MySQL上一定有memcache、tair这样的KV系统做缓存
  • 都各自开发了适合自己的消息分发系统,Notify, Thrift, Beanstalkd
  • 后端应该都具有实时日志数据分析: HBase、云梯2、Kids
  • 不同程度上用异步化来提高性能,并会一直以此来作为性能提升的方法。
  • 消息链路上的优化:一个网页的渲染上是树状结构的获取数据,因此可以在通过优化这棵树来达到优化整个过程的目的

其他

网站选型不单纯是比较语言优劣,还和社区的发展趋势活跃(谁都不想用过一门可能几年就无人问津的语言)、团队内普遍的好恶和掌控能力(C、C++最好,但是大家都不会)、整个行业的形势(团队内都用Lisp,但是招不到人)等等多种因素有关系。 选择哪门语言确实重要,这决定了未来几年或者更远的时间内技术的发展路线,更重要的当规模扩大后需要在性能优化上要付出的代价。(这里面可以拿Facebook优化PHP作为反例,若是当初扎克用的是java或者c++,也许也不会因此如此兴师动众的重写了PHP生态系统里面的大部分东西。)

Git Workflow

| Comments

Git近几年有逐渐取代svn的趋势,一部分原因是github的风靡,google code也关门大吉,令人唏嘘1。很多公司开始逐渐从svn代码仓库迁移到企业私有版的github—gitlab。知道怎么玩git是大势所趋。

Git小白推荐读物:atlassian出版的Git Tutorials,这家公司拥有mac上最佳git客户端SourceTree以及Bitbucket。

本文是对Comparing Workflows这篇文章和自己的使用心得所做的总结。

以下三种工作流只是典型的代表,不是规范,而是参考,可以结合自己的使用特点灵活选择和修改。

  • Centralized Workflow
  • Feature Branch Workflow
  • Gitflow

Bash Tips

| Comments

Bash 遇到错误就退出

http://stackoverflow.com/a/4382179

set -e

If you put set -e in a script, the script will terminate as soon as any command inside it fails (i.e. as soon as any command returns a nonzero status). This doesn’t let you write your own message, but often the failing command’s own messages are enough.

The advantage of this approach is that it’s automatic: you don’t run the risk of forgetting to deal with an error case.

Commands whose status is tested by a conditional (such as if, && or ||) do not terminate the script (otherwise the conditional would be pointless). An idiom for the occasional command whose failure doesn’t matter is command-that-may-fail || true. You can also turn set -e off for a part of the script with set +e.

Bash使用数组

快速入门

(Bash For Loop Array: Iterate Through Array Values)[http://www.cyberciti.biz/faq/bash-for-loop-array/]

  • 用括号指定,空格指定就好
  • 遍历: for i in "${var[@]}"

深入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash
# array-ops.sh: More fun with arrays.


array=( zero one two three four five )
# Element 0   1   2    3     4    5

echo ${array[0]}       #  zero
echo ${array:0}        #  zero
                       #  Parameter expansion of first element,
                       #+ starting at position # 0 (1st character).
echo ${array:1}        #  ero
                       #  Parameter expansion of first element,
                       #+ starting at position # 1 (2nd character).

echo "--------------"

echo ${#array[0]}      #  4
                       #  Length of first element of array.
echo ${#array}         #  4
                       #  Length of first element of array.
                       #  (Alternate notation)

echo ${#array[1]}      #  3
                       #  Length of second element of array.
                       #  Arrays in Bash have zero-based indexing.

echo ${#array[*]}      #  6
                       #  Number of elements in array.
echo ${#array[@]}      #  6
                       #  Number of elements in array.

echo "--------------"

array2=( [0]="first element" [1]="second element" [3]="fourth element" )
#            ^     ^       ^     ^      ^       ^     ^      ^       ^
# Quoting permits embedding whitespace within individual array elements.

echo ${array2[0]}      # first element
echo ${array2[1]}      # second element
echo ${array2[2]}      #
                       # Skipped in initialization, and therefore null.
echo ${array2[3]}      # fourth element
echo ${#array2[0]}     # 13    (length of first element)
echo ${#array2[*]}     # 3     (number of elements in array)

exit

(Arrays)[http://www.tldp.org/LDP/abs/html/arrays.html]

拖延的反思

| Comments

昨天在多看阅读中看到的一篇关于拖延症的文章—《“被绑架”了的拖延症患者 — 爱上拖延症的八个理由》。原始出处已无法考据,感谢原作者的分享。在网上找到了一个引用链接

之前也正好看到了李松蔚在微信公众账号里面发表的拖延症系列文章中的《框架中的拖延者(3):和解,无关明日》,二者有想通之处:拖延是内心不和谐的表征,造成拖延一定有更深层次的原因。如果发生拖延了不深究原因只一味的自责,那么拖延只会恶化,身心不会得到解脱,真正的“病因”因此会一直纠缠着自己。

在《被绑架》一文中,笔者就内省自己拖延的原因,勇敢的做出了改变。

笔者自述自己拖延中大部分时间是用来玩游戏、听音乐、看电影、读文章、读书。相比于『有意义的工作』,笔者把这作为自己内省和成长的一部分。

这一点上我部分赞同,不想工作必然有其他可理解的原因,不仅仅是『找回属于自己的时间』。我觉得拖延不做工作,尤其是周末。有可能是自己的身体在通过『懒惰小人』告诉自己需要休息放松。人不是机器,一般情况下很难长期保持高强度的工作。

在“行为和内心一致”这一节中,笔者在工作中发现越来越讨厌工作,逃避工作。

这一阶段的拖延虽然还有漫无目的的无聊,但更多的是一些有意识地利用拖延下来的时间学习哲学、心理学或者英语和写作等相关技能 事后从这个角度看,事情甚至完全反过来,就像是为了获得收入和安全感拖延了我的学习时间而去做无趣的工作。

笔者确实发现了自己不喜欢自己的工作。(事后也用自己的行动的结果说明了自己在其他领域有更好的发展。)但是通常而言无论是什么事,总有你不愿意做的部分和喜欢做的部分。认清自己内心到底喜欢做什么并能持之以恒,这是需要智慧的。若是缺乏智慧,则误把因为“懒”做事挑肥拣瘦当做这不是我喜欢做的工作。今天从银行辞职该做摄影师,坚持不了多久又觉得摄影不是真正喜欢的事情,又改写小说…
用智慧做出判断,用勇气做出改变相比治疗拖延症是更重要的。 关于如何甄选自己喜欢的职业,建议读一读《拆掉思维里的墙》这本书。

积跬步至千里

| Comments

焦虑的我今天冥冥中发现了BYVoid的github,进而去他的博客兜了一圈,感触良多。先介绍下背景。

BYVoid这个人是去年校招时听闻的。那时刚参加完阿里的校招,还没有出结果,焦急的等待中持续关注着北邮人论坛的有关阿里校招的消息。那个时候不知阿里内部哪位好事者漏出了一张阿里校招时给出A+ offer的面试后台系统记录截图。(A+就是去年阿里校招的阿里星计划,60W年薪+股票期权),这个八卦中的主角就是郭家宝,网名BYVoid。一个九零后的清华本科生,本科的假期在MSRA,Google,Hulu,Facebook有过实习经历,初高中参加信息学竞赛,后来保送到清华。还出过一本书《Node.js开发指南》
关于他个人的更多介绍,可以看下他的博客介绍:链接以及他的报告《我的一些经历》

我最感兴趣的是一个牛人是如何成长的他的博客文章的质量是如何提高的。进到博客一看发现这位新秀从2007年就开始写博客了(2010年才上大学)。于是我就从最后面的文章开始翻起来,有种在读别人的日记的赶脚…(兴致勃勃的去看一个本科毕业生在初三时写的文章,没有这种赶脚才怪呢)BYVoid
这几年确实没少写。每个月有十几篇二十几篇的数量。

花了一个晚上的时间把所有的文章题目过了一遍。感触挺多: 技术牛人其实也是普通人,只是做事更加深入、认真,专注一些和坚持久一些『罢了』。

履历

BYVoid初中一次偶然的机会,他的老师发现了他在信息学上的天分(拿出一张卷子让他做,结果竟然很多都做对了,后来才知道这是去年的信息学竞赛试题)。也许就是这样的契机让郭同学的人生轨迹变得和同龄人与众不同。之后郭家宝同学通过竞赛保送到省实验中学,之后的高中几年就一直在做信息学竞赛。从他的博客上来看,BYVoid不仅是有天分,本身也很喜欢信息学竞赛,解数学题。他不仅做了老师要求的内容,还在课下自己主动刷题训练(高中的文章很多都是UASCO解题报告)。高中联赛名次不错,最后联赛超常发挥拿到了国家比赛的金牌,靠这块金牌顺利的保送到了清华大学,这时的他才高中二年级。接下去的一年和很多人不同的是,他不再有高考压力,于是在看新白娘子传奇的过程中,发现了自己对汉语字体的兴趣,逐渐开始了汉字研究。到了大学,还保持着这份兴趣。建立了至今广为使用的Opencc开源项目。
良好的编程功底加上清华大学计算机系拥有的资源,BYVoid在MSRA, Hulu, Google, Facebook都做过实习。今年毕业的他应该是去了瑞士Google(从他的LinkedIn了解到的)

感悟

  • 不怀目的的写作是最真实的成长记录,这篇文章就是很好的一个例子。
  • 任何人都是从基础逐渐开始成长。写作的能力也一样,长文写作也是一点点培养建立的,BYVoid自己也做了几年博客文章的一个总结(link)。技能的提高都是通过不断的坚持练习达到的。对于写作来说只有不断的写,开始时也许文字会短小、不连贯,包含很多主观的随感以及转载。但是不断的坚持,慢慢的开始有了深度和广度。在BYVoid的博客中我看到了每一个阶段都是真实的表现了自己同期的水平和状态,一个初中生不会一开始就会写出有研究深度的文章和报告而是会写出介绍环境搭建、介绍Vim用法等入门心得。没有刻意地训练只是日积月累的写作,量变终会得到质变。写就Bitcoin Internals这样的Slides。
  • 兴趣自我驱动更有可能成为领域达人。退一步讲成为不了达人,自己也可以自得其乐。这也是『过程比结果重要』的一种诠释吧。兴趣使然 —> 深入研究 —> 升华提高。
  • 持久钻研的个性是能力持续提高的秘诀。拥有兴趣而没有持之以恒的坚持也很难成为一位达人(当然也可以将持久作为兴趣定义的属性)。这些文章 Hash函数比较破解Firefox密码管理器加密的信息CmYkRgb123 Online Grading System ,还有OpenCC 不仅能看出他的兴趣也能感受到一份钻研的热情。

拥有足够浓厚的兴趣和一个非功利的健康心态很容易成为某一领域的达人。但是如果没有这些,只要你:持之以恒、不浮躁、耐心、钻研、自我驱动也一样可以达成。

『我不追求输赢,我只是认真』

『钻研』是BYVoid给我印象最深的一点。作为一种个性,不仅是在技术能力上体现,会在生活的很多方面能感受得到。高中信息学竞赛时,他把NOIP2000到2007年所有题都做了一遍link 并整理出来这个就不是所有人都能做到的。还有他特别爱玩仙剑奇侠传游戏,这个很多人都爱玩,但是很少有人像他这样详细相关的情节、剧情都详细写成评测文章,仙剑四仙剑五系列。或者看一部电影做一个影评山楂树之恋。还体现在文字的研究上,从他的第一篇文章,之后有了OpenCC——文章link,在简繁字体的研究一直持续着。

因为没有看到合适的介绍node.js的书籍,也恰逢认识了图灵图书的编辑,于是促成了一本Node.js开发指南的诞生。这让我想到『机会总是留给有准备的人』。

所以成就一个牛人主要是一个人身上的某种品质——如BYVoid的钻研,而不仅仅是兴趣。

一些博客链接

明日迷的一天

| Comments

上一篇博客还是在1月份,转眼已经大半年过去了。大概曾经有兴趣关注本人的也都没什么兴致了吧,呵呵。
不禁有些感慨。
对一个人的真正了解,无论是了解他人还是认识自己,从行动上看的最真实的。我以为自己爱写字、爱表现。可是从博客的更新频度和质量上来看,这些只是内心的美好想法,说的不好听就是“幻觉”。能真正认识自己很难。而且与这相比,更难的是认识了之后接受这样的自己。

前几天在微信中读到的印象很深的是李松蔚先生在微信公众账号里面的一篇文章《框架中的拖延者(4):希望与不满》,文章中描述了生活中的一类人“明日迷”,我是非常典型的这类人。

…每一位明日迷的心里都积压了深深的不满。我们对自己失望。我们懊恼,愤怒,责怪自己又浪费了时间,碌碌无为,离明日的解脱还是遥遥无期。 每一个“今天”,我们都用这种想法折磨自己,再用行动上的放纵补偿自己。

这篇文章中的每一个字都几乎命中了我的每一日生活,我对现在的自己不满意,我觉得我可以做的更好,做的更努力,现在的我达不到我内心中那个满意的标准。“现在,我不满意自己”。

令我没有想到的是这样的“上进的”想法,我一直引以为豪,以为是我不断进步的想法竟然是给我造成痛苦的罪魁祸首。

“现在,我不满意自己。”这个念头潜移默化地,为我们带来了多少痛苦?
让我们不快乐,让我们觉得现在这些时间毫无价值。
让我们耽于幻想,沉迷于将来有朝一日成功后的如释重负。
让我们忍不住泄气,自怨自艾,精神萎靡,缺乏动力。
“啊,还是先睡一觉,先吃点零食,先刷刷淘宝,养精蓄锐再开始奋斗吧……”
甚至于,即使有兴趣的事,快乐的事,如果当成“正事”来做,也会慢慢感觉到痛苦,感觉到肩上的担子一天比一天沉。原理很简单:做正事,我们就希望“进步”。
而希望进步,就等于说现在,我们还不满意自己。

呵呵,还是个不断恶性循环的怪圈。

  1. 在“你丫连自己满意的标准还没有达到,赶紧进步”的想法中过的不快乐 —>
  2. 转念便有了“别看你们现在这么神气,哥以后一定会成为技术新秀,藐杀所有不努力的人。”的幻想 —>
  3. 可是…“哎呀,我还有好多书买了都没有看,连最经典最基础的都没看完,更别提读经典的代码了,事情好多啊,累觉不爱啊” —>
  4. 压力之后,潜意识就会… “刚起床,先刷个朋友圈缓解下吧”,“在看看今天有什么新闻”,“今天周末了,看个电影放松下,前一段时间太累了,需要多休息的”,一个上午就这样消磨掉了。—>
  5. 于是想到了“你丫连自己满意的标准还没有达到,赶紧进步!”,再次回到了开始的不快乐。

产生的结果是在不快乐郁闷中,用看电影、刷微博、看朋友圈过了一上午。而且

甚至于,即使有兴趣的事,快乐的事,如果当成“正事”来做,也会慢慢感觉到痛苦,感觉到肩上的担子一天比一天沉。原理很简单:做正事,我们就希望“进步”。

文章的最后正写出了我们的内心写照:

一旦把目光放到未来的进步,对此刻的不满就难以避免。“勤奋小人”和“懒惰小人”会立刻开战。而我们已经知道了,一旦被这场希望与不满的战争席卷,我们的内心便会天昏地暗,永无宁日。做事的乐趣破坏殆尽,我们背着沉重的包袱,举步维艰。

万万没想到,优秀青年具有的上进的想法是事实上自己不是很上进的心理根源。

我在BIT的这几年

| Comments

Changelog

Version Time Description
0.3 2014-3-1 毕业设计的总结
0.21 2014-1-5 最后一学年的小结
0.2 2014-1-4 研究生第二年
0.1 2014-1-3 研究生第一年

我在BIT的这几年

2年半的研究生即将结束,聊以此文做一下这几年的回顾吧。

2011年我考入了BIT,之后机缘之下来到了现在的实验室,正式成为了现在的导师的第一任弟子。实话说如果当时选择导师的时候能了解到更多的信息,可能就不会是这个选择了。幸运的是误打误撞的还碰到了不错的导师,与其说是导师,现在感觉倒更像是朋友和师兄,他给予了充分的自由和平等,我很感激。不过自己的散漫之气也因此耽误了不少事情,实感愧疚。这个之后会有提到。

Linux Kernel概览

| Comments

总结下读过的有关Kernel的书籍,主要是<Understanding the Linux Kernel>>、<Linux Kernel Development><Linux Device Drivers>

终极目标

完整的回答以下问题:

  • 从开机上电到进入命令提示行,Linux完整的启动过程
  • Linux终端下敲入ls的完整过程。(从接收键盘设备中断到显示到结果显示到屏幕)
  • Linux终端下输入cat foo.txt的完整过程。(同上,其中包含了读写磁盘的操作)
  • to be continued…