以前没结婚自己怎么过都能凑合,现在结婚了不得不考虑以后的生活。目前国内的情况一天比一天糟,而且它只会变得更糟。我对这个国家的未来不报任何希望,所以决定移民。
现求推荐海外,尤其是比较容易移民的国家(比如澳大利亚、新西兰、美国、加拿大)的工作,Linux 底层开发相关的即可,最好是内核开发。公司只要提供 relocation 。我给开源项目贡献的补丁见下。
Linux kernel:
http://goo.gl/AfPJw
http://goo.gl/NhVg3
dracut:
http://goo.gl/Nj4OI
http://goo.gl/U2sMw
iproute2:
http://goo.gl/W4TX4
kexec-tools:
http://goo.gl/6CzvP
http://goo.gl/zgTwV
util-linux:
http://goo.gl/dsOlm
还有一些零碎的补丁就不献丑了。
稍微正式的简历可以看我的 linkedin,正式的简历可以发邮件给你。我的邮箱是:xiyou.wangcong@gmail.com。
国内的猎头就别浪费时间了。
(本文讲的是 korg 内核中的 openvswitch,而非 openvswitch.org 上提供的openvswitch模块。)
之前讲过 VXLAN,但是一直没有动手实践。其实配置 VXLAN 要比配置 GRE tunnel 简单很多,你所需要做的只要两步:
1. 添加 VXLAN 设备(需要比较新的 iproute2 和内核支持):
# ./ip/ip li add vxlan0 type vxlan id 42 group 239.1.1.1 local 10.16.43.214 mtu 1500 dev eth0
其中,10.16.43.214 是配置在 eth0 (或其它连接两台主机的设备)上的本地IP地址。
2. 把 vxlan0 添加到 openvswitch 的 bridge 中去:
# ovs-vsctl add-port ovsbr0 vxlan0
最终的结果如下所示:
# ./ip/ip -d li show vxlan0
7: vxlan0: mtu 1500 qdisc noqueue
state UNKNOWN mode DEFAULT
link/ether d2:93:a2:08:10:1e brd ff:ff:ff:ff:ff:ff
vxlan id 42 group 239.1.1.1 local 10.16.43.214 dev eth0 port 32768
61000 ageing 300
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr AC:16:2D:05:14:3A
inet addr:10.16.43.214 Bcast:10.16.47.255 Mask:255.255.248.0
inet6 addr: 2620:52:0:102f:ae16:2dff:fe05:143a/64 Scope:Global
inet6 addr: fe80::ae16:2dff:fe05:143a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:386702 errors:0 dropped:0 overruns:0 frame:0
TX packets:1505515 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:42804806 (40.8 MiB) TX bytes:1202562852 (1.1 GiB)
Interrupt:20 Memory:fbc00000-fbc20000
# ifconfig vxlan0
vxlan0 Link encap:Ethernet HWaddr D2:93:A2:08:10:1E
inet6 addr: fe80::d093:a2ff:fe08:101e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:346746 errors:0 dropped:0 overruns:0 frame:0
TX packets:752833 errors:36 dropped:0 overruns:0 carrier:36
collisions:0 txqueuelen:0
RX bytes:18081642 (17.2 MiB) TX bytes:1139323399 (1.0 GiB)
# ovs-vsctl show
2dce25d0-ac18-4626-905d-c4995464785d
Bridge "ovsbr0"
Port "vnet0"
Interface "vnet0"
Port "vxlan0"
Interface "vxlan0"
Port "vnet1"
Interface "vnet1"
Port "ovsbr0"
Interface "ovsbr0"
type: internal
ovs_version: "1.7.0"
另外一台机器上基本上完全相同,结果如下:
# ./ip/ip -d li show vxlan0
8: vxlan0: mtu 1450 qdisc noqueue
state UNKNOWN mode DEFAULT
link/ether 92:8b:0f:8b:31:f1 brd ff:ff:ff:ff:ff:ff
vxlan id 42 group 239.1.1.1 local 10.16.43.215 dev eth0 port 32768
61000 ageing 300
# ifconfig vxlan0
vxlan0 Link encap:Ethernet HWaddr 92:8B:0F:8B:31:F1
inet6 addr: fe80::908b:fff:fe8b:31f1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:752833 errors:0 dropped:0 overruns:0 frame:0
TX packets:346770 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1128783737 (1.0 GiB) TX bytes:22940562 (21.8 MiB)
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr E8:39:35:30:1D:1E
inet addr:10.16.43.215 Bcast:10.16.47.255 Mask:255.255.248.0
inet6 addr: 2620:52:0:102f:ea39:35ff:fe30:1d1e/64 Scope:Global
inet6 addr: fe80::ea39:35ff:fe30:1d1e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1535775 errors:0 dropped:0 overruns:0 frame:0
TX packets:346951 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1210625058 (1.1 GiB) TX bytes:41681835 (39.7 MiB)
Interrupt:17
# ovs-vsctl show
71f0f455-ccc8-4781-88b2-4b663dd48c5f
Bridge "ovsbr0"
Port "vnet1"
Interface "vnet1"
Port "ovsbr0"
Interface "ovsbr0"
type: internal
Port "vnet0"
Interface "vnet0"
Port "vxlan0"
Interface "vxlan0"
ovs_version: "1.7.0"
配置好了之后,你可以尝试用 tcpdump 在 eth0 上捕捉一下包试试,你会发现 L2 是直接封装到 UDP 包中的:
05:39:05.107906 IP 10.16.43.215.52908 > 10.16.43.214.otv: UDP, length
106
0x0000: ac16 2d05 143a e839 3530 1d1e 0800 4500
0x0010: 0086 abd0 0000 4011 62ca 0a10 2bd7 0a10
0x0020: 2bd6 ceac 2118 0072 0000 0800 0000 0000
0x0030: 2a00 5254 00f7 e2e7 5254 0090 5117 0800
0x0040: 4500 0054 0000 4000 4001 f152 c0a8 6402
0x0050: c0a8 6403 0800 073c 3e05 0009 ca8f 0f51
0x0060: 0000 0000 1102 0900 0000 0000 1011 1213
0x0070: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
0x0080: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
0x0090: 3435 3637
1. 排在第一位的毫无疑问是《黑客帝国》三部曲。关键词:矩阵。



2. 《盗梦空间 Inception》。关键词:虚拟化。

3. 《云图 Cloud Atlas》。关键词:并行。

4. 《恐怖游轮 Triangle》。关键词:递归。

5. 《源代码 Source Code》。关键词:重入。

6. 《二维世界 Flatland》。关键词:二维。

我把它们汇总成了一个豆列,欢迎补充。
众所周知,C语言数组下标是从0开始,其它很多语言皆如此。而 FORTRAN 则是数组下标从1开始的典范。所以就有数组下标是从1开始好还是从0开始好之争。连《C专家编程》中都如此调侃:
数组的下标应该是从0还是从1开始?我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝。—— Stan Kelly-Bootle
仔细思考一下这个问题很有意思,建议你不妨自己思考一下再继续往下看。
其实这个问题早在 1982 年就已经由计算机科学领域的大师 Edsger Dijkstra 研究过并得出了一个结论。他手写了一篇名为《Why numbering should start at zero》的论文,关键部分截图和大体翻译如下:


表示一个自然数子序列,比如 2, 3, …, 12,不用中间那三个点,有四种方式可供我们选择:
a) 2<= i < 13
b) 1 < i <= 12
c) 2<= i <= 12
d) 1 < i < 13
有什么道理选其中一种而不选别的吗?是的,的确有。观察到 a) 和 b) 的优势是两边的边界值之差正好是子序列的长度。作为一个推论,下面的观察也成立:在它们两个当中,两个子序列是邻接的就意味着一个的上界等于另外一个的下界。这些观察并没有让我们从a) 和 b) 之中做出选择,所以我们从头开始。
一定存在一个最小的自然数。排除掉下界——就像 b) 和 d) 那样——就会迫使一个从最小的自然数开始的子序列的下界进入非自然数领域。这很难看,所以对于下界我们更喜欢<=,就像 a) 和 c) 那样。现在,考虑一下从最小的自然数开始的子序列:包含上界就会迫后者不那么像自然数(译者注:作者的意思是自然数是一个有下界没有上界的集合),当序列缩小成空序列时。这很难看,所以对于上界我们更喜欢<,就像 a) 和 d) 那样。我们得出结论, a) 是我们最喜欢的。

当处理长度为 N 的序列时,我们期望通过下标来区分它的元素。下一个令人烦恼的问题就是,我们该给它的第一个元素赋予什么样下标值?坚持 a) 的方式,当下标从1开始时,下标范围为 1<= i < N+1;当下标从0开始时则是更好看的 0<= i < N。所以,让我们的序数从0开始:一个元素的序数(下标)等于序列中在它前面的元素个数。这个故事的寓意是我们最好尊重0最为一个最自然的数——过了这么多个世纪!
———
顺便说一句,Python 选择了 a),所以 range(0,3) 返回的是序列是 0,1,2。

遇到过一个又一个不靠谱的姑娘,也因为种种原因错过了一个又一个没有缘分的姑娘,终于在合适的时间遇到一个合适而且靠谱的好姑娘!
和这个姑娘是在云南大理认识的,当时她正好一路搭车从山东来到了云南,而我正好从北京搬去大理常住……我们从那时一直交往到现在,一起去过全国很多地方,走了一圈最后发现还是最喜欢大理,而且很快还要回大理。
我这个人喜欢四处乱走,最近两年基本上每六个月就要搬一次家。你们搬家最多就是从城西搬到城东,而我搬家基本上是从中国的华北搬到西南…… 我不喜欢住在大城市,我认为城市从来没有让人们的生活变得更美好,只会让人更加迷失自我。而且,我从来没有买房子的打算,在一个地方住上几年不动对于我来说简直难以忍受。所以,和我这样的人在一起是需要很大的勇气的,要是换了别的姑娘早就被吓跑了,就算姑娘不跑也被姑娘的妈妈给拉跑了……
其实,真正让我感动的不是刚认识就觉得彼此很合适,也不是姑娘她不要钱不要车不要房子,而是,她能为了我一点一点去改变,为了在一起不会轻易就放弃。认识我之前她什么饭都不会做,现在已经鸡鸭鱼肉样样都行了,任性的脾气也改了不少。这比什么都重要。
我的姑娘就是这个样,就像我们结婚证上的那样,美丽又大方!