如果你不知道docker是什么,请参考 这个slides。
在 ubuntu 下安装 docker 请参考 官方教程 。注意,由于 docker 的核心技术是 Linux container,所以如果想在 osx 下安装 docker 请使用 vagrant。
如今随着网上交易规模不断扩大及API驱动的互联网的出现(如 https://strip.com ),互联网的安全性越来越受到重视。本文简单讲述如何将你的nginx配置成支持https的web server。当然,理论上一个合格的https server需要从CA那里获得正式的SSL certificate,但如何购买SSL certificate不在本文讨论之列。本文仅从技术上讨论如何在你的服务器上使能https。
继续 前文 。熬到了周末,正式开始了 hatch
项目的开发。首先是一个关键问题:如果每个文件的生成由一个单一的shell脚本完成,那么数据库打开/关闭的损耗会不会成为瓶颈?做了个简单的实验,发现每次打开都要花费0.2s,一个不小的数字。
➜ hatch git:(master) ✗ cat test.coffee
db = require('mongojs')('hatch')
col = db.collection('documents')
col.findOne {}, (err, doc) ->
db.close()
➜ hatch git:(master) ✗ time ./test.coffee
./test.coffee 0.20s user 0.03s system 99% cpu 0.226 total
在 前文 中,我尝试了 docpad 做为新的建站工具。docpad
有很多优点,但最大的缺点是效率。在我看来,一个好的静态网站生成工具最好能在秒级处理成千上万文档,这样才能真正满足个人博客外的中等规模网站的需求。要做到这一点,工具必须将full build和incremental build区别开来。这样,即使一个full build要花几十秒甚至几分钟,incremental build还能控制在秒级。当用户修改某个文件时,incremental build能够保证用户有良好的体验 —— 无需等待,改动立即可见。而这一点,则恰恰是 docpad
所欠缺的。本文讲述的 hatch
项目将尝试在保留 docpad
的诸多优点外,通过更智能的build过程将编译速度尽最大可能提高。
很久没有更新博客了。最近几个月写了三篇文章:
因为种种原因都烂尾,没有继续下去,所以也就没有发表出来。绵绵不断的工作压力和为人父的家庭责任让我心力交瘁,眼一睁一闭,一睁一闭的,一天天就过去了。
这两天闲逛hn时,无意中发现了 docpad
,又一个静态网站生成器。由于我目前使用的 wintersmith
是一个hack版,将其升级到2.x太麻烦,而且随着我文章的增多,分页,标签管理等都成为麻烦事。在尝试了 docpad
后,我发现这是个好东西,干脆心一横,就把整个博客的底层系统升级过去了。
又是一个闷热的周六,灰霾就像粘在天空一样,依旧笼罩着这个城市。带着小宝,我们三人游荡在蓝色港湾的儿童城中,为小家伙的未来打算着。老婆和丈母娘穿梭于一个又一个玩具店,而我,因为推着童车,不便走来走去,就带着小宝静静地欣赏楼下冰场里玩耍的孩子们。很快,我们的注意力就被冰场上两个正在进行对抗训练的小男孩吸引住了。小宝快乐地随着冰球转动脖子,双眼紧紧地捕捉着黑色的冰球,不时发出愉悦的『喝彩』;而我,默默地看着两位『男子汉』一次次跌倒,又一次次爬起,对抗虽然异常激烈,但任何一方都没有脏动作,这足以让真正的冰球赛场上的成年人汗颜。
If somebody says X language is better than Y language, usually there will be a fierce quarrel between two sides. If you're using certain language for a long time, you will be the evangelist of that language, and try to protect it unconsciously. Admitted or not, you have been trapped in a tunnel, that what you can see is constraint greatly. "The Shawshank Redemption" gives a good footnote on it:
[Red] These walls are funny. First you hate 'em, then you get used to 'em. Enough time passes, you get so you depend on them. That's institutionalized.
So before we're institutionalized too deep, let's learn something completely different - a language that not derived from C family, a language that leads you to a totally different mindset.
Erlang seems to be a good candidate.
看了berkeley网站上的文章Who Says C is Simple?,顿感汗流浃背。如果招聘官按照这个题目去面试,我也就将将五十分。不过话说回来,这里所列的case都太偏门,走的是圣火令的武功路数,真正做工程的这么写代码就是欠揍。
但是抱着学语言的态度,这里的题目如果你不懂都值得深究。我研究了下第四题 —— 这是让我比较困惑的一题。
// Functions and function pointers are implicitly converted to each other.
int (*pf)(void);
int f(void) {
pf = &f; // This looks ok
pf = ***f; // Dereference a function?
pf(); // Invoke a function pointer?
(****pf)(); // Looks strange but Ok
(***************f)(); // Also Ok
}