2010
06.04

Codeswarm
上面这张图就是安居客在Subversion源代码库里的代码大爆炸。

接下来的视频可以看到从2007年的一个工程师到现在三十来个工程师的爆炸过程,挺有趣的。

code_swarm

2010
02.27

苹果往事
我很喜欢《苹果往事》这本书,它以工程师的视角写记录了很多趣闻轶事。加上是APPLE ][将我带入计算机这个领域的,所以我对这家公司有着相当的感情。

书中有多很有趣的事,放到近三十年后的今天也还一样。例如,工程师周末、晚上常加班,还是主动的;不少有价值的东西是工程师利用业余时间制作的;用代码行数统计工程师的工作量时工程师会填上负数;开发经理和工程师互动常有困难;工程师有惰性时,好的老板能够逼工程师完成工程师自己认为不可能的任务;现实扭曲力场(Reality Distortion Field)对创造力的作用….

还有一点我看出来了,工程师普遍采用的时区是当地时区-8 :D

书中的故事都可以着folklore.org网站上读到。

2010
01.25

动态域名解析服务

有自己的VPS,很多服务都可以自己来做了,例如我自己安装一个VPN用来穿墙。今天用PowerDNS做了一个动态域名解析服务,替换过去老旧的方法。现在不仅可以自己用,还可以提供给其他有动态域名解析需求的同学。

更新域名的API很简单,一个HTTP请求即可。API地址是: http://dynamic.wacao.com/api/plain.php,参数为,

  • host – 主机名,FQDN为 ${host}.dynamic.wacao.com
  • time – unixtime形式的请求时间,时间误差在正负5分钟内有效
  • sign – 签名,格式为 sha1(${host}${time}${shared_key})
  • ip – 可选。如果未提供IP地址则采用客户端请求的来源地址

其中host和shared_key需要我来提供。这里提供一个的host和shared_key给大家测试。testing d035cdac09dd866ed8f4a244567c4daf。域名为testing.dynamic.wacao.com.

由于仅是一个HTTP请求,客户端很容易用各种语言实现。我自己用的是一个简单的shell脚本。

#!/bin/bash

function usage {
    echo "Usage: $0 {host} {shared_key}"
}

if test -z $1 || test -z $2
then
    usage
    exit 1
fi

HOST=$1
SHARED_KEY=$2
ENDPOINT="http://dynamic.wacao.com/api/plain.php"

TIME=`date +%s`
SIGN=`echo -n "${HOST}${TIME}${SHARED_KEY}" | sha1sum -t | awk '{print $1}'`
URL="${ENDPOINT}?host=${HOST}&time=${TIME}&sign=${SIGN}"
curl "$URL"

执行后立即能够解析,TTL为5秒。

$ update-dynamic-dns.sh testing d035cdac09dd866ed8f4a244567c4daf
ok. 58.33.69.77
$ host testing.dynamic.wacao.com.
testing.dynamic.wacao.com has address 58.33.69.77

我将这个脚本加到crontab里,每5分钟更新一次。

*/5 * * * * /usr/local/sbin/update-dynamic-dns.sh ${HOST} ${SHARED_KEY}

如果觉得testing.dynamic.wacao.com这样的域名不好看,而且你有自己的域名,可以想我一样,给自己的域名加一个CNAME。例如我把alcohol.swanpan.com做了一个CNAME指到alcohol.dynamic.wacao.com

;; ANSWER SECTION:
alcohol.swanpan.com.	86400	IN	CNAME	alcohol.dynamic.wacao.com.
alcohol.dynamic.wacao.com. 5	IN	A	58.33.69.77

这样我在各个地方都能用alcohol.swanpan.com这个域名访问家里的机器,方便用它穿墙

想试试的朋友告诉我你要的host,我给你发送shared_key。

2010
01.24

USB硬盘的固定设备名和自动休眠

AirPort Extreme可以外接USB硬盘提供文件服务,但是和它的路由功能一样,都不够满足我的需求。而作为穿墙路由器的华硕小机器有4个USB口,我还用它兼作文件服务器使用,提供Samba和NFS。

但是Gentoo在这里遇到两个小问题。

第一个问题,USB硬盘是可以热拔插,这样由于载入顺序的问题,每个硬盘设备名称可能会变化。例如这个机器自带一个读卡器,在没有外挂USB硬盘时启动后候设备名为/dev/sdb。之后插入USB硬盘,USB硬盘的设备名为/dev/sdc。但是如果挂着USB硬盘启动,这两个设备的设备名就正好反过来了。我希望是固定的设备名。

第二个问题,USB硬盘长时间不访问的时候不会自动停下来,这样既不省电也不利延长硬盘的寿命。我希望在不用的时候它可以休眠。

设备名的问题可以用udev的rules解决。我加了一个udev配置文件/etc/udev/rules.d/99-external-storages.rules。

KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0158", ATTRS{serial}=="20071114173400000", SYMLINK+="cardreader%n"
KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="0c31", ATTRS{serial}=="20090717090A", SYMLINK+="storage/neso%n"

这样给内置的读卡器添加了一个设备名的符号链接/dev/cardreader;给我的NESO 1T硬盘添加了设备名符号链接/dev/storage/neso。用固定名称访问设备的问题就解决了。

第二个问题稍微复杂些,一直没找到方便的方法。laptop-mode-tools也没能满足我的要求。一番搜索后找到sdparm可以用来控制USB硬盘,还有一段perl脚本用来调度sdparm。这样就可以满足我的需求了。脚本的原始出外我给忘了,这里我稍微修改了一点,增加对设备名符号链接的支持。

#!/usr/bin/perl -w
use File::Basename;
use Cwd 'abs_path';

$statfile = "/proc/diskstats";
die "$0: Cannot read $statfile\n" unless -r $statfile;

$| = 1;
($disk, $interval) = (@ARGV);

if (-l $disk) {
    $original_disk = $disk;
    while (-l $disk) {
        $disk = readlink $disk;
    }
    $disk = dirname($original_disk) . "/" . $disk;
    $disk = abs_path($disk);
}

$disk =~ s,/dev/,,;
print "$0: disk: $disk, interval: $interval\n";

$halted_data = $last_seen = '';
while (1) {
  open(STATUS, $statfile);
  ($_) = grep(/^\s+\d+\s+\d+\s+$disk\s/o, <STATUS>);
  close STATUS;

  if ($last_seen eq $_ && $halted_data ne $_) {
    print "Spinning down: $disk\n";
    system "sync";
    system "sdparm", "--command=stop", "/dev/$disk";
    $halted_data = $_;
  }
  $last_seen = $_;
  sleep $interval;
}

最后在启动脚本里加上

ebegin "    - Spindown USB HD"
nohup /usr/local/sbin/spindown-usbhd /dev/storage/neso 1200 >> /var/log/spindown-usbhd.log 2>&1 &
eend $?

好了,20分钟这块硬盘没有读写之后自动休眠。

2010
01.22

HOW-TO: ESXi and SSH

每次ESXi要在服务器上开启SSH服务,总是忘记具体操作方法,都要去google才行,这里记录一下。

1. Go to the ESXi console and press alt+F1
2. Type: unsupported
3. Enter the root password(No prompt, typing is blindly)
4. At the prompt type “vi /etc/inetd.conf”
5. Look for the line that starts with “#ssh” (you can search with pressing “/”)
6. Remove the “#” (press the “x” if the cursor is on the character)
7. Save “/etc/inetd.conf” by typing “:wq!”
8. Restart the management service “/sbin/services.sh restart”

用下面的方法可以避免重新启动机器

8. Restart the management service “/sbin/services.sh restart”
10 – Kill inetd : kill `ps | grep inetd | cut -f2 -d” “‘
11 – Start inetd: inetd

参考:VMWare KB: Tech Support Mode for Emergency Support

2010
01.21

安居客招聘架构师

先开门见山,安居客招聘架构师,包括软件架构师和系统架构师。工作地点是上海浦东陆家嘴。有意者请与我联系,@erning 或 erning at anjuke dot com。

随着公司的发展,安居客也开始组建专门的架构师团队了。这个职位没还有特定的需求描述,简单说需要具备互联网应用的多方面经验。还有至少要会写代码,会翻墙。

安居客目前需要从架构方面解决的问题有很多,比如从代码的框架、开发流程开始,使得我们越来越多的工程师能够方便的并行开发;项目能够更方便的部署到测试环境、staging环境和生产环境;更有效的监控网站的各个模块;提高性能;消除减少单点故障……

我们需要已经具备实际经验的资深人士加盟,当然也欢迎认为自己能行的年轻人。

很多人可能还不了解或不知道安居客(http://www.anjuke.com/),我稍微介绍一下。

安居客也是一个start-up公司(有VC、有上市计划,这些都可以google到)。从2007年开始,经过三年的努力,在网络找房的平台上做到了一定的成绩。从各项数据上看,都做到了每年10倍的增长。

业务上安居客有明确的商业模式,很早就盈利了(不是靠流量买广告)。从刚开始的2007年就有收入,到2009年全年实现的销售收入比年初的计划翻了一倍多。具体数额公司没说能够公开,就不好透露。

还是主要说说技术部门的情况。在2007年网站刚上线的时候还部署在虚拟机里的,2个开发工程师。2008年初有三台服务器,不到20万的日访问量,5个开发工程师。现在近百台服务器部署在多个IDC,约1000万的日访问量,差不多20个开发工程师。

网站目前架构简单说是PHP+MySQL运行在Linux上,加上用Java实现的一些后端服务模块。一样也用到了很多开源项目,例如搜索用的是Lucene,消息系统用的是RabbitMQ,前端是Nginx。图片存储用到了MogileFS(现在每天上传的照片超过40万张)。还有Squid, Memcached等等。

大致情况就是这样了。再有在安居客这样快速发展的start-up公司,以我的经验可以体验到和大公司不同的乐趣。因为你可以也需要接触到开发和运营一个网站的各个方面;有个平台可以将自己的想法付诸实现;还能享受到将一个网站从小做到大的快乐。

再次邀请有兴趣的朋友加盟。还请朋友们多帮我推荐。另外安居客除了架构师还需要很多PHP开发工程师、Java开发工程师、测试工程师和系统管理员。

2010
01.21

mppc for kernel 2.6.31

之前我搞了一台华硕的小机器做穿墙路由器,操作系统用的是Gentoo Linux

SSH的socks5钻墙是好了,但我现在还想要开VPN到墙外,还有VPN到公司里,这样在家里用起来就更方便了。

有些PPTP的VPN需要mppe,mppc。而我用的Gentoo不像Ubuntu,原装的内核不带mppe-mppc模块,得自己打补丁。可是这补丁只到2.6.13,之后的没有了。之前每次内核升级都遇到同样麻烦:|

不过最终还是google到了devil-linux项目里现成的2.6.31补丁

    cd /usr/src/patches
    wget http://ftp.devil-linux.org/pub/devel/sources/1.4/linux-2.6.31-mppe-mppc-1.3.patch.bz2
    bunzip2 linux-2.6.31-mppe-mppc-1.3.patch.bz2
    cd /usr/src/linux
    patch -p1 < /usr/src/patches/linux-2.6.31-mppe-mppc-1.3.patch
    make menuconfig
    

选上CONFIG_PPP_MPPE_MPPC=m

    Device Drivers  --->
    [*] Network device support  --->
    <M>   PPP (point-to-point protocol) support
    <M>     Microsoft PPP compression/encryption (MPPC/MPPE)

然后重新编译安装内核。这样就有了ppp_mppe_mppc模块。

最后emerge ppp的时候需要带上USE=”mppe-pmmc”参数。我是把”net-dialup/ppp mppe-mppc”添加到”/etc/portage/package.use”文件里。

2010
01.10


这个由技术部和运营部联合的节目我觉得是最好的

2010
01.05

My Linux Gateway

My Linux Gateway

使用透明网关,将web流量通过squid走,cache之后可以提高家里机器访问web的速度。

通过squid配置,将被墙的站点设置成通过SSH隧道走。但squid本身不能forward给socks5代理,因此中间加了个privoxy中转。被墙的站点也可以在squid缓存,节省流量。

如果所有的web访问都通过SSH隧道,访问国内的站点慢了。不仅会反向被墙还浪费海外主机的流量。

没有海外主机的时候,SSH隧道可以用TOR替代。

https不可以做透明代理,这时候需要将浏览器的proxy设置到网关的squid。

图上没标出,网关上还安装有bind,提供域名解析服务,用来对付DNS解析被篡改的问题。

现在这个硬件用的是Asus EeeBox b202,安静省电。

2009
12.02

好租

好租(http://haozu.com)为什么google都不收入呢?难道这个域名原来有过前科?