July 11th, 2010 by 张磊
平时上网用ssh代理,但合上屏幕时就会断掉。用了Macbook之后,随时随地都有shell可以用,于是写了一段脚本来检测ssh tunnel是否还存活。如果没有就启动一个新的连接。
脚本内容:
curl -s -I http://www.google.com/ –socks5 localhost:7070 > /dev/null
[ $? -gt 0 ] && ssh -fN username@hostname -D 7070
脚本很简单,就是使用curl通代理访问一下google(这里也可以是任意别的网站)。如果访问失败了,就重开一个ssh进程监听7070端口。
要使用重连的机制,需要先建立远程服务器对本机的信任关系,这样才可以免输密码。如果觉得搭建信任关系过程太繁琐,可以使用ssh-copy-id这个小工具。
上述两行脚本可以加入到~/.profile(有的也叫.bash_profile)中,这样每次打开屏幕都会做检查,每次开机登录后也会自动连接。如果愿意,也可以加在Crontab中,每隔几分钟跑一下。
这样设置之后,平时基本上不用关心代理了,它会安静地在后台一直跑着。
UPDATE: 我就知道是我老土了。 @murj 推荐autossh,就是类似原理,大家可以关注一下。
July 11th, 2010 by 张磊
今天不小心伸腿时把Macbook电源线踢掉了,电源线和本本是通过磁性吸附在一起,因此本本毫发无损。我第一次体会到这种小设计的大用处,于是觉得是时候写篇文章,谈谈自己使用Macbook半月多来的感受。
4月去香港时通过子宁认识了一个在那边读书的姑娘,等到学生机开卖,就拜托她买了一台最低配的Macbook Pro。图片就不贴了,官网到处都是。随本本还赠送一个iPod Touch,后者已经成为我坐地铁、开会时的游戏机了。
总体来说,对Macbook的感觉是“也就那样”。如果你是个乐于尝鲜的人,那它值得拥有;不然还是别买了,会后悔的。到手的Macbook有太多优点,比如文章开头的电源线设计,比如支持多点触摸的触控板…最令我欣喜的是电池续航能力很棒。但也有太多细节,需要花时间去习惯。
中文输入
默认的中文输入法很差。请教传教士tinyfool之后,装了SunPinyin和FIT。目前在坚持用着FIT。但输入的流畅程度比Windows上的搜狗、谷歌拼音相差甚远。相信这种状况,短期内难以改变。
浏览器
默认的Safari用不习惯──总按错快捷键。后来装了Firefox,搭上熟悉的插件们,这才找回上网的感觉。有朋友总结说,现在操作系统的使用体验,很大程度上取决于浏览器的使用体验,深以为然。
系统相关
MacPorts是个好工具,虽然比不上apt-get那么犀利,但用它装点儿小软件不在话下。
缺少一个SecureCRT的替代品,后来直接用ssh+信任关系,也算好用。搭好了信任关系,想翻墙时、想上服务器时,都省得输密码。
窗口切换挺不习惯。一个应用程序的多个窗口没法用Command + Tab切,只能用Command + `来切换。其实如果窗口开得不多的话,没必要这样子。
键盘
键盘上没有Home/End/PgUp/PgDown/Insert/Delete这6个键,标着”delete”的键其实是”backspace”。当然,消失的按键都可以通过快捷键做到。比如 Home = Ctrl + A; End = Ctrl + E。多用快捷键可以提高效率,但把原来一个按键改成两个的组合,恐怕只会降低效率。
iPhoto
在使用iPhoto以前,我都是自己把照片从相机里复制出来归档。但这个软件改变了我的习惯,它自动同步,并且可以把照片发到Flickr,而且会把相机里的照片按照时间段记录为一个事件,很棒。为什么当初我用Picasa时,就没喜欢上它呢?
XCode
拿到Macbook和Touch之后,尝试写App。好歹也得写个”hello world”出来吧。XCode的代码提示、自动完成很棒,如果用vim来写我真不知道该如何记住那么多又臭又长的类名方法名。当然,我觉得有语义的类名和方法名还是很好的,用Ruby久了应该也会养成这习惯。
今天刚看完《iPhone 3开发基础教程》,这本书有很多推友推荐过。用来入门,值得一看。
买了Macbook,手头的T61还是没法被替代,而且T61确实也不错。世界杯期间一边用T61看球一边用Macbook上网,很有趣。
–
写完文章想起在杭州读大学时,一个用着Macbook的MM找我们宿舍一哥们去修电脑,众人口水不已,YY许久。现在自己买了一台,好像也没啥。当年去修电脑的兄弟,也没有然后。
June 29th, 2010 by 张磊
假如你在Linode入手了一个VPS,迅速地部署了Ubuntu,然后使用一大堆apt-get把LAMP服务都搭好了(这整个过程也就10分钟吧,可以更短)。此时可以算是“It works”,但还颇有一些地方需要调整。本文就在这种场景下,写一下此时可以做的最小优化,作用范围不仅限于Linode、Ubuntu,其他系统也可以参考。希望对一些朋友有帮助。
Linux
日志切分
如果没有日志切分,日志可能很快会把硬盘塞满,最后不得不手动清理。做日志切分推荐用logrotate,易于配置,一旦配置完成就会默默无闻地工作。
调整swapiness
swappiness用来控制使用系统swap的概率,ubuntu内核默认是60。建议修改为0,使系统尽可能使用物理内存而非swap。实际上,在上次Linode升级套餐后,我已经关掉了swap,系统运行得依然稳定。具体修改方法可以百度一下。
UPDATE: 经 @7id 提醒,swappiness参数更多的是降低磁盘io操作,对于内存不是特别小的情况,差别不大。详细请看下方留言。
Apache
启用压缩
启用压缩,可以减少传输的内容。对WebServer来说这几乎是必须的,但默认的Apache安装并未开启压缩。对于比较慢的连接,启用压缩会有更多好处。
调整MaxRequestsPerChild
MaxRequestsPerChild用于设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果这个参数为0,Apache进程占用的内存会只增不减。一些使用Apache的VPS经常遇到iorate很高,可以尝试调整一下这个参数(ref)。
Mysql
关掉InnoDB
如果服务器用来放blog或是论坛,多数时候MyISAM就足够用了。此时可以把InnoDB关掉。my.cnf中的注释说:”You might want to disable InnoDB to shrink the mysqld process by circa 100MB.”。实测在VPS关掉Innodb时虽然没节约了100MB,但50M还是有的,内存珍贵,能省则省吧。
只需在my.cnf加入一行 skip-innodb 就可以把InnoDB的功能关掉。
PHP
开启输出缓冲
在使用mod_php时,如果不开Output Buffering,每一个输出都会使Apache向客户端发送数据,导致效率很低。使用fastcgi时,由于WebServer本身有buffer,影响并不大。但默认的apt-get安装,使用的就是mod _php,因此建议在php.ini里把Output Buffering打开。
–
以上只是一些最初级的调整,叫做“优化”都显得有点夸大。但在初期遇到问题时,调整这些地方往往可以很快见效。
除此之外,强烈建议用nginx换掉Apache。
June 17th, 2010 by 张磊
昨天Linode官方blog发表了一篇文章:Linode Turns 7, BIG RAM Increase 。大意是,为了庆祝Linode 7岁生日,他们将所有Linode服务器的内存都增加了42%。
此番增长以后,原来最低配的Linode 360现在变成 Linode 512,而价格依然保持在$19.9。相比之下,在SliceHost买同样内存的VPS需要$38,选择MediaTemple新推出的ve也需要$30。
我原来用着Linode 720,一直为内存不够而发愁,现在直接升级到了1024M内存,已经根本不用swap了。

当然,内存升级之后,机器是需要重启一下才能看到效果的
。
June 17th, 2010 by 张磊
在Twitter上看到盛大举办的校园牛人大赛,其中有“云计算脚本比赛”。看了下题目,开始悔恨大学里没好好学编译原理。但又手痒,就想用Racc试试。做题过程居然很顺利,从学习Racc到做完前三道题花了两三个小时,于是写一点有关Racc的示例,算是学习笔记。
以“云计算脚本比赛”第一题为例,要求执行如下脚本后,得到“Hello, 老赵”。
SET name = "老赵"
RETURN "Hello, " + name
简单来说,用Racc写成解释器,可以把上面的脚本,转化为Ruby代码并执行。
安装Racc:
gem install racc
创建一个level_1.y文件,定义一个JeffParser类。
class JeffParser
token T_SET T_RETURN T_STRING T_VAR
rule
lines:
| lines T_SET T_VAR '=' T_STRING {@local_vars[val[2]] = val[4] }
| lines T_RETURN exp {result = val[2]}
exp: exp '+' exp {result = val[0] + val[2] }
| T_STRING
| T_VAR {result = @local_vars[val[0]]}
end
先定义几个token。因为语法比较简单,只有 SET/RETURN/变量名/字符串四种。
在rule部分,格式是 token: token token … {action} 。中括号中的action 部分就是Ruby代码了,调试时可以把一些需要的变量打出来。val变量是由左边token的值构成的数组,0表示第一个token的值,依此类推。
之后是词法分析的部分。做的事儿是用正则表达式,把上面定义的4种token识别出来,并放到 @tokens 数组中。
---- header
require 'strscan'
---- inner
def parse(str)
@local_vars = {};
@tokens = []
s = StringScanner.new(str)
until s.eos?
case
when s.scan(/SET/)
@tokens << [:T_SET, s[0]]
when s.scan(/RETURN/)
@tokens << [:T_RETURN, s[0]]
when s.scan(/".+"/)
@tokens << [:T_STRING, eval(s[0])]
when s.scan(/[a-z0-9]+/)
@tokens << [:T_VAR, s[0]]
when s.skip(/[ \t\r\n]/)
else
@tokens << [s.getch, nil]
end
end
do_parse()
end
def next_token
@tokens.shift
end
保存后运行 `racc level_1.y ` 将生成一个名为level_1.tab.rb的文件,这就是我们想要的解释器了。
简单测试(假设脚本存放在level_1.file文件中):
ruby -r level_1.tab.rb -e \
'print JeffParser.new.parse(open("level_1.file").read())'
输出:
Hello, 老赵
当然,题目还只做了一半。题目要求:需要用http访问并得到结果。可以在前面挂一个Webrick来做到,就和Racc没关系了。
后面几道题,也可以如法泡制。
–广告时间–
赵姐夫(@jeffz_cn)说这次的题目是他经手的,后悔没把blog的链接放上去,于是我帮他打个广告,欢迎大家猛点此处。
May 16th, 2010 by 张磊
最近开始看新《三国》,每日不落。我小学三年级时读完了家里的《三国演义》,还因为这个,考试时拿了一次作文满分。
新《三国》给人感觉饱满而真实,每个形象都有血有肉,而不像老《三国演义》那样,书上怎么写,人就怎么演。电视上正播到官渡之战,觉得近几日最有乐趣的,莫过于袁绍和几个幕僚的戏。
袁绍,胡子花白,性格却像个小朋友。曹操倾巢而出攻徐州,袁绍却因为小儿生病,在榻旁哭啼不已,错过抄底许昌的大好时机。正面战场和曹操交锋时,他延误战机,被曹操杀得大败亏输,居然还仰天长叹“天意助贼不助我”。此外,袁绍帐下田丰和许攸的争斗也很精彩,结果二人一个自刎,一个投曹。
刘备,锋芒内敛,自有一番阴险。这个形象和《三国演义》中的老好人刘皇叔大相径庭,多了几分真实感。另外,刘备麾下的糜芳居然是个可爱的大胖子。
曹操,有胆识、有谋略、有野心,新《三国》的剧情就是围绕他展开的。剧中的他,放到现在,也算是个很棒的CEO了。
历史总是胜利者来写,很多时候都写成了蒙骗后人的故事。于是我很怀疑,历史是否真如我们看到的这样。吕布是否真的有勇无谋?曹操是否真的奸诈无比?袁绍是否真的优柔寡断?但我相信在那时的乱世,能留下姓名的人,不论成败,都堪称英雄。
April 26th, 2010 by 张磊
4月中旬去香港玩了一次,感觉很棒。写篇文章给想去玩的朋友们一些建议。
前置条件
对多数人来说,必须有港澳通行证且在有效签注期内才能去香港。港澳通行证必需亲自到户口所在地申请,如果是在外地工作,可能需要为这破玩意请年假。
怎么去?
最土的办法是跟团。如果不太想被导游牵着鼻子走,很多网站都提供了香港自由行套餐。所谓自由行就是他们帮你搞定机票酒店,你自己去了玩。
我在途牛选了一个北京三晚四日的自由行套餐,两个人的费用是6k出头。途牛的套餐写的都是“早上去,早上回”,和客服沟通下来发现,多数时候是“早上去,晚上回”。所以大家尽可放心。
如果买到了港龙的机票,在飞机上可以有红酒和哈根达斯,很赞。
住哪里?
选择自由行套餐时需要选择酒店,我当时选了红磡的都会海逸酒店。但我更推荐住在尖沙咀/铜锣湾附近,这两处都有很不错的酒店。
嗯,看到上面的尖沙咀/铜锣湾是否有些迷惑呢?很多游记令人迷惑的也在于此:用了大量的地名,却没法给人直观印象。找一下百度地图和香港地铁,对照这些地名,应该能知道住在哪里最靠谱了。也可以大致看一下出去玩的路线(坦白说,香港那么小,怎么玩都行)。
带什么?
带着大箱子,可能会忍不住买很多东西回来;
带着双币信用卡,大部分时候都用不着现金;
港币现金,1K足矣。人民币可以多带点,必要时可以拿来换港币。我带了3K港币,后来怕花不完,购物时都拿现金支付不刷卡了。遍地都有“两替店”,换港币比国内银行更优惠。
去哪玩?
迪士尼没去。我大概是这么玩的:
第一天,在尖沙咀的天星码头坐天星小轮到中环,然后坐公交车去了山顶公园。山顶凌霄阁的夜景很美,只可惜人太多。返程时坐了缆车下山。
第二天,从地铁金钟站,坐公交车到了海洋公园,玩了一大圈。然后到尖沙咀逛街、购物。
第三天,坐地铁到东荟城名店仓,一大堆大牌的折扣店,便宜得难以置信。疯狂扫货后转回尖沙咀,在星光大道漫步。
第四天,又在尖沙咀游荡……
如何往返机场?
很多酒店都有接送的大巴。机场也有活力巴士,可以在抵港时就预订好返程的大巴,它会准时来接。活力巴士的价格是单程70人民币/人,有点儿小贵。
其他
- 周围人讲的都是粤语,要做好听不懂的准备,地铁是有普通话报站的;
- 下飞机可以买好八达通,坐地铁、坐缆车都能用上;
- 地铁挺贵,打车更贵,相比起来天星小轮很便宜;
- 购物时,商户都会主动刷银联通道,而不刷Visa,这样挺好的;
- 手机,可能需要打10086开通一下某业务,才能在香港使用。
ttp://www.trip01.com/Flight/visa/images/gatxz.jpg
April 22nd, 2010 by 张磊
写完上一篇文章后,有很多朋友问我,香港一卡通能做什么,如何申请。于是写篇文章以作答疑。有关香港一卡通的很多信息都能在招行香港分行主页找到。
前世今生
招行香港一卡通的前身是招行两地一卡通。两地一卡通兼有香港账户和内地账户,而且两个账户之间转入转出极为方便。可能是受制于政策,从08年12月初开始,两地一卡通停止申请。
08年11月下旬,我在杭州拿到护照,给招行打电话想申请两地一卡通,悲剧地被拒。
之后,招行开始对两地一卡通客户进行改造,取消了原来一卡兼有香港账户和内地账户的设置,改为一张香港分行发行的香港一卡通+一张深圳分行发行的内地一卡通,俗称“一卡换两卡”。
一卡换两卡期间,招行没有受理新用户申请香港一卡通——即使在香港柜台也无法申请。直到2010年4月12日,香港一卡通开始受理香港柜台的申请。据说,会在将来开放内地柜台的申请。
功能简介

香港一卡通是一张香港的借记卡,卡片正面有银联标记,背面有银通+EPS标记(见上图)。在香港,可以在支持银通的ATM取款,在支持EPS的POS机上刷卡;在内地,可以在支持银联的ATM取款、走银联通道刷卡。它只有港币账户和美金账户(需要有香港身份证才开通人民币账户),所以在内地刷卡时,会自动把港币/美金转换为人民币。
香港一卡通可以用来在海外收款,比如从Paypal提现。比起用国内银行收海外的款要容易得多。收到款项之后,再兑换为内地的人民币,每年5万美金以内没有任何费用。如果你卡里钱太多,也可以花10块钱申请一个支票薄,把支票开给亲戚朋友,让他们帮忙从银行收款。
此外,还可以用香港一卡通投资港股。拿到卡片后可以申请开通投资账户,申请过程完全在网上进行,一个工作日内即可审核完成。交易佣金最低100港币,算是比较便宜了。
*需要注意,使用Paypal提现时,Paypal会收取超过2.5%货币转换的费用。但这不是显式收取而是体现在汇率上的,请大家一定注意。
如何申请
目前,只能到香港柜台申请,需要带的证件为:护照或港澳通行证+身份证+地址证明。地址证明可以是信用卡账单、水电煤气缴费单——只要能证明你能收到寄望这个地址的邮件即可。推荐用信用卡账单。
申请时需要一起申请网上银行,以后的业务都需要在网上操作。使用内地的移动证书即可完成关联。切记使用电子对账单,这样每月只需要5港币账户管理费,使用纸质账单的话会多花5块。
开放内地申请后,使用的证件应该差不多。
其他卡片
建设银行的陆港通龙卡,功能上和以前的两地一卡通类似,比香港一卡通强大,只是资费稍高。陆港通龙卡在国内很多地方都能申请,具体接受申请的网点,大家自己打建行电话或者百度一下吧。
贴一张图,香港招行不管是专业版系统还是自己家的网站,都像是90年代的。

April 21st, 2010 by 张磊
自去年开始工作,还从未出过远门。于是趁着手中项目告一段落,和子宁去香港游玩一遭。运气极佳,了却了几桩心愿,回来后特别开心。
获得招行香港一卡通

招商银行香港一卡通一直都没开放申请,结果就在我出发前一周,在香港柜台开放申请。我是在香港的酒店里才看到此消息,立马赶到中环的招行申请。
招行的效率非常高:19日提交申请,20日卡片从香港寄出;21日下午,我在北京拿到了这张香港一卡通。
用这张卡可以在境外收款,和国内招行账户转入转出也很便利。此外支持银联:如果在国内刷卡,会自动把港币/美金转换成人民币。拿到卡片后,我使用内地招行的移动证书就可以开通网银,并且申请开通了港股投资账户。
买到中意香水

两年前子宁送给我一支Burberry的香水小样,用完后很怀念那味道,却遍寻未果。这次在香港的海港城瞎逛时,无意中看到一款很像。一试之下,果然是这个味!立马下手买了一个套装,获赠6份小样。一共不到800块。从商场回酒店的路上,我都摸着Burberry的盒子嘿嘿直笑,高兴呐。
回来一看,同款香水在淘宝上只卖98块。好吧,如果知道自己要什么,还是在淘宝买吧。
土人大开眼界
从北京去香港,和我当年从山区去杭州的感觉差不多,颇受冲击。细节难以尽述。大牌林立的商场,璀璨的山顶夜景,讲着粤语的正妹,依然不时在我脑海浮现。如果没有通行证的限制,真想多去几次。
之后我会写一些土人去香港玩的建议(现已成文,请看此处)。值得一提,这次去玩,是从途牛预订了自由行套餐,登机、入住都非常顺利。
April 14th, 2010 by 张磊
崇拜一个漂亮的姑娘,5年后才见到真人。周日在奇遇花园对坐畅聊,美女以书赠我,附赠手书卡片作为书签。却是那本有关唐骏的《我的成功可以复制》。
对这本书早有耳闻,但一直被我被当作说教型的成功学教材而不屑一顾。开卷后才发现并非如此,于是花两天的工作闲暇一口气读完。本书大体上以时间为轴,讲述了唐骏从一普通小朋友成长为职业经理人的历程。前半部分内容尤其朴实;后半部分也许主角已经位高权重,让人觉得某些情境下有点语焉不详。
书中事例很多信息量很大,不同的人读到的东西也不同,让我觉得触动的有这么些:
- 儿时受苦,休学为家里劳动、盖房子,学着变通地解决问题;
- 为了顺利留学,先是争取到北广的名额,后到教育部每天“骚扰”领导,终于成功;
- “国际走穴”计划受阻,给议员写信解决中国明星的签证问题;
- 不惜代价,让地铁报站时第一个报微软中国技术支持中心;
- 和妻子、孩子分居多年;
- 在盛大时,为了避免开会时和陈天桥意见相左,发短信给陈大年暗示他表达意见。
我觉得书中唐骏的经历,可以算是“只为成功找方法,不为失败找借口”的最佳实践。读李开复的书,会觉得颇有知识分子的清高;读唐骏的书,感觉他是草根起家,遇到困难就想各种办法来解决。有时用些tricky的办法,但也无可厚非。你可以说他圆滑世故,但不能否认,这个人确实已经深刻影响了并还在继续影响着中国职业经理人这个行业;而这个人把从儿时搬砖盖房到如今红极一时的经历和体会,记录在了这薄薄的书里。
我觉得这本书很值得一读,未必复制得了他的成功,但书中流露的为做一件事想尽办法、永不放弃的劲头,相信对各位很有鼓励的作用。当然,书中所言也未必尽信,读书时大家别忘了带着怀疑。
文章开头的那位美女,曾说下次见面要送我开复的《世界因你不同》,在犹豫该不该读呢?我为什么觉得开复老师这么不真实呢?