Archives

东北之行游记

简单写写东北之行的游记,希望对以后去的人有用。

我们是先坐晚上火车到的第一站沈阳,卧铺大约180¥,第二天早上七点半左右就到了。说实话沈阳其实没多少可逛的地方,要说沈阳的故宫吧,北京的故宫我都去了不下3次了,再去那个也没啥意思;大帅府值得一去;中街无非是沈阳的“王府井”。所以我们最后决定上午去逛大帅府,中午去中街那边吃饭。

出了火车站门口就有公交车到中街,打听一下就知道了,或者干脆花2块钱买张地图。我们到的早,加上当天沈阳超级冷,尽管在火车上早有准备但还是觉得冷。下了公交就去附近找吃早点的地方,吃点儿热乎的东西暖暖身子。吃完饭就直奔大帅府,门票50¥,而且没学生票。所谓大帅府其实就是张氏父子官邸:张作霖和他那出名的儿子张学良,在里面看看也挺好的,至少能勾起你对当年历史的回忆。反正我不喜欢张学良这厮,当年手里握着绝对优势的兵力却硬是不抵抗,否则现在恐怕连“抗日战争”一说都没有!更别提后来的西安事变了,怪不得“一小撮”那么喜欢他……他老爹张作霖尽管是一文盲军阀,但起码也算是条汉子,没想到却生了这么个熊儿子……

逛完这个就去中街吃饭去了,吃的是老边家饺子,感觉一般,没吃出什么特色来。吃完饭就赶紧出去买衣服什么的,虽然来之前我们准备了不少衣服,但从来没见过这么冷,准备不足。于是打的去五爱市场,其实就是沈阳的“动物园”,在那里补充了一下身上的装备。那里的东西很便宜,不过需要自己砍价,看你的嘴皮子功夫了。因为离开的火车是晚上的,所以时间还比较充足,于是又跑到了北陵公园去逛,据说那里是皇太极的陵墓。公园也要门票,记得好像是10块钱左右,里面很大,这么冷的天在里面逛是需要勇气的,逛完都冻得不行了。晚上跑到刑警学院那边吃饭,喝了不少啤酒,很舒服,吃完就赶紧打的去火车站了,第二天要到齐齐哈尔。

从沈阳到齐齐哈尔的卧铺185¥,也是晚上走第二天一早到,所以这样就可以省下住宿的费用了。去齐齐哈尔无非就是看丹顶鹤,扎龙自然保护区就在这里。来之前同事叮嘱我两件事:一是当地民风彪悍,二是那里的烤肉很好吃,一定要尝尝。结果两样我都见识了。

先说第一个,刚出火车站,因为我没吃东西,所以想找个地方吃早饭,可朝周围望了半天愣是没看到合适的,最后无奈之下只好去对面的“李先生”吃面去。吃饭时看到这么一件事,让我深刻体会到了当地彪悍的民风。我们在那吃饭,对面坐着貌似是一家人,至少有女儿和母亲。旁边的服务员不知道怎么就瞪着那个女的,那个女的不爽了,你瞪我也瞪你,没想到服务员更不爽了,开口说:你看什么看!女的立马不愿意了,和他骂了起来,那服务员突然骂了句:x你妈!这时对面坐的她妈立刻发飙了,准备举起旁边的椅子去砸那个服务员,可是那里的椅子都是那种和桌子连一起的啊,结果整个桌子差点儿被她掀翻。要不是旁边的值班经理前来拉架和道歉,估计后果不堪设想……我在那看得一愣一愣的。

吃完饭就去扎龙,可是车不好坐,手机上网搜了搜,有好几种说法,其实最靠谱的是,先打的去“大福源”身后,起步价就到了,在那里找到306公交车到扎龙,往返票价20¥。扎龙自然保护区门票记得是40¥,每天有固定的时间放鹤,我们赶的是11点那场。里面很大,而且积雪很厚,有的地方可以没过膝盖,放眼望去是一片白茫茫的雪原,很好看,强烈建议提前一个小时来到这先顺便逛逛。到了放鹤时间就去放鹤的地方看鹤,丹顶鹤就是电视上看到的那样,没什么独特的,不过它们起飞,落地的姿势确实很好看,所以来这里摄影的人很多,周围全是“大炮”,单反,拿着卡片机都不好意思和人家打招呼!

回市里时可以选择在火车站附近下,公交会路过那,然后可以打的去吃烧烤,我们去的是宏昌烧烤。这里的烧烤其实是铁板烧,把菜和肉放铁板上自己烤着吃,大冷的天吃这玩意儿非常爽!我还要了瓶白酒,喝到肚子里那叫一个舒服啊。价格不贵,两个人吃了90多,而且牛筋我们没吃完。吃完饭就坐车去哈尔滨,硬座就可以,50¥一张,两个小时就到了。

到了哈尔滨已经是六点了,先找住的地方,来之前计划好了住哈工大附近,正好火车站门口有公交直接到,记得4,5站的样子。在哈工大门口找了半天最后还是住在了哈工大招待所,我住的是3人间的一个床,38¥一晚,有公共浴室可以洗澡。招待所的那个老师傅非常和蔼,什么忙他都会帮,印象很深刻,所以我感觉哈尔滨人都挺热情的。

第二天一早起来就去索菲亚大教堂和中央大街,从住的那向前走不远就可以坐公交到那边,下车的地方基本上是在它们俩中间,向左是中央大街,向右是索菲亚教堂。索菲亚教堂很明显是俄罗斯风格,挺有气派的,而且在那参观的俄罗斯人特别多。从那一直向前走是中央大街,中央大街很长,一直通到松花江江边。一路上可以看到不少俄罗斯风格的建筑这个步行街是商业街,店铺特别多,有一家你不要错过,里面卖冰激凌,一定要在这么冷的天去尝一下冰激凌!路过邮局时我们还去给北京的同事们朋友们寄明信片。逛完了已经过了中午吃饭的时间,感觉很饿了,于是去了斯大林公园旁边的一家“朝鲜风味”,那家店很小,而且便宜,两个人才吃了40多。他们家的“土豆辣白菜”超级好吃,一定要尝!

吃完可以四处瞎逛一下,因为去看冰雪大世界还比较早,天黑了再去看才有意思!那里有公交车直接到。到那天就已经黑了,看到里面各种颜色的冰雕很兴奋,毕竟是头一次见。门票比较贵,今年是200¥,学生票90¥。因为我们去时是冰雪大世界今年正式开放的前一天,人还不是很多。里面有几个小滑梯,也有一个号称世界上最长的冰滑梯,也是免费,不过这个人多需要排队,玩了一下确实很有意思;里面还有冰上自行车什么的,也都是免费,随便玩;也有节目表演,因为还没正式开放所以还没人。回去的公交不好等,那趟公交晚上在那一站根本就不停,所以得先坐别的公交到城里然后再倒,这一点感觉不爽。

第二天基本上就没什么逛的了,最后决定还是去看看冰雪大世界对面的雪博会,就是在太阳岛的那个,门票也不便宜,150¥,学生票75¥,其实里面也就是雪雕,感觉一般,没有冰雕好看,所以比起冰雪大世界的门票来这个钱花得不值。下午就收拾一下准备坐火车去长春了。去长春也就3个小时,硬座41¥。

在长春下了车就直接去坐轻轨,可以到东北师大,因为那边住的多,也便宜,我住的那间40¥一晚。长春其实没啥逛的,主要是冲着长影世纪城去的。轻轨直接到那,终点站,门票198¥,学生票99¥。结果证明去看这个是非常明智的,里面有很多好玩的东西,比如那个4D电影,其实就是比3D多了个现实气氛,比如电影里应该“有风”向你脸上吹来时你会感觉到确实有风,不过是从座位上冒出来的。在里面可以观看电影的某些制作过程,比如电影里空中抓直升机的特效是如何拍的,风声雨声雷声是如何模拟的,演员如何配音的,讲解员还会邀请现场观众去尝试。里面最好玩的一个应该是“太空探险”(注:全价里包含这个,但学生票里不包含),里面有个球形屏幕,然后观众坐在“宇宙飞船”上,随着屏幕上的画面和情节你坐的“飞船”也会随之震动和晃动,实实在在地体验一把《星际迷航》里的场景!geek 千万不要错过啊!我觉得要是3D的就更爽了!在里面一圈玩下来基本上一个白天就没了,感觉这个票价还是挺值的。出来就差不多天黑了,抓紧吃了个饭就去机场赶飞机。因为下雪的缘故,出租车去机场都贵,平时也就不到60¥,结果我们使劲讲才讲到75¥。

到了机场发现飞机果然晚点,还好只晚了一个小时。两个小时后就到北京了。这次旅行顺利结束。总共花费1900¥左右,包含机票,机场大巴,各种打的,寄明信片,给朋友买的哈尔滨红肠等等。

P.S. 因为没穿毛裤和棉裤,我从到齐齐哈尔时开始穿4条秋裤,Orz。。。

P.P.S. 照片这里:

沈阳:http://www.douban.com/photos/album/22211420/

齐齐哈尔:http://www.douban.com/photos/album/22211904/

哈尔滨:http://www.douban.com/photos/album/22213398/http://www.douban.com/photos/album/22214913/

长春:http://www.douban.com/photos/album/22215499/

两个革命性的新玩意儿

前些天看到过这么一个据说是 google 出的新玩意儿:

http://www.mtime.com/group/15023/discussion/757177/

感到很震惊,以前在科幻电影中看到的东西都有人要作成产品了,不管想象力还是技术都非常牛逼,如果真是 google 做的我一点儿也不会感到吃惊。图像识别技术都要发展到这种程度了,看来我不是一般地落伍了……

没想到今天看到一个更让人震惊的玩意儿:

http://v.youku.com/v_show/id_XMTQxNzY2MDUy.html

不光震惊,而且羞愧,身为一个搞IT的,我居然都想不通这个玩意儿的原理是什么…… 掩面而去……

唉,真是没有做不到,只有想不到啊!要是哪一天这两个东西都能成为市场上的产品,那会给我们的生活带来多么大的变化啊!

—————————yy的分割线—————————

最近因为《阿凡达》3D电影特别火,我也yy一下。现在视频聊天我们有,3D电影也有,但是把两者结合起来的东西却没有,不久的将来我们会不会实现很多科幻小说中提到的全息影像通讯呢?貌似国外确实有公司在做这玩意儿…… 这绝对也是一个革命性的东西。

获取C语言数据类型大小

一个简单的脚本,可以在命令行下获取C语言中数据类型的大小。在邮件列表的讨论中看到的这个主意,我用 Perl 重写了一下。

代码很简单,见下。分享一下,希望对你有用。
[perl]

!/usr/bin/perl -w

use strict;
use File::Temp qw/tempfile tempdir/;

die “Wrong usage.n” unless @ARGV == 1;
my $type=$ARGV[0];
my $dir = tempdir(CLEANUP => 1);
my ($obj, $src) = tempfile(“$dir/XXXXX”, SUFFIX => ‘.c’, UNLINK => 0);
open my $fd, “>$src” or die “can’t create file: $!”;
$src =~ s/.c$//g;
my $exe_file = $src;

print $fd <<eof;

include

include

include

include

include

include

include

include

include

include

include

include

include

int
main (void)
{
$type x;
printf (“%d\n”, sizeof x);
exit (0);
}
EOF
my $result = qx(gcc -o $exe_file $exe_file.c && $exe_file);
print $result;
[/perl]

Christmas gifts from Portugal!

Today I was surprised that I received a box of gifts from Ricardo and Ana for Christmas! Hooray!

I really really love all of them, they are nice and sweet! :) Thank you so much!! Merry Christmas!

Okay, below are they.

The box which contains everything:

Porto wine!! We already tried one bottle! So sweet! I like it…

A Christmas card:

And a little “sheep” made by Ana with hands… so cute!

And also there is a cap for which I don’t take a picture. I think I can wear it now since it’s cold in Beijing these days. ;)

Hmmm, I can still clearly remember which Christmas gifts I got from Ana last year. It is already one year past since I left Portugal! Time goes sooooo fast! I miss all the friends that I met in Portugal! Good old days!

Next year, we plan to go to Portugal to attend a friend’s wedding which is scheduled in July. I wish I could meet all the friends at that time. Go back to Europe, go back to Portugal, go back to Coimbra!

东北行计划

元旦计划去东北,主要是去哈尔滨。这将是头一次去东北,目前去过祖国最北的地方仍然是北京……

时间:
1月1号晚上北京出发,1月6号晚上回京。

具体计划:
1.1晚,卧铺-沈阳
1.2沈阳中街,故宫,大帅府
1.2晚,卧铺-齐齐哈尔
1.3齐齐哈尔观鹤(扎龙自然保护区,俗称鹤乡)
1.3下午/傍晚,火车-哈尔滨
1.3/4/5宿哈尔滨
4/5行程:索菲亚教堂,中央大街,松花江,太阳岛,兆麟公园,冰雪大世界
1.6早,硬座-长春,长春行程待定
1.6晚,飞机-首都机场

预计费用:
行,900¥;住,150¥;其它费用包括吃,景点门票,打的等等。总共预计,2000¥。

在哈尔滨住宿还未定,初步计划住哈工大附近。

希望去过上面几个地方的朋友不吝赐教攻略。同时征同行,虽然你可能并不在北京出发,虽然可能路线不完全一样。

P.S. 漠河离哈尔滨不是一般远啊,从 google map 上目测了一下,感觉和哈尔滨到大连差不多远,东北真辽阔啊!

symlink,chroot 和 mount

前两天在处理一个关于 selinux 的 bug 时遇到一个比较有意思的问题,顺着仔细往下想了想,发现更多相关的话题,遂整理成一篇文章记录一下。实际上我想到的这几个问题和 selinux 基本上毫无关系,先从简单的谈起,然后顺着我的思路一步步往下走。

最初的问题是,如果我在一个目录中建立了一个符号链接,那么我 chroot 进去之后会得到什么?这个问题比较简单,如果符号链接的目标文件路径在 chroot jail 里也存在,那么你就会得到 chroot jail 里面的那个文件;否则就无法访问到目标文件。这一点有个比较有趣的应用就是,你可以建立一个符号链接,让它在 chroot jail 里面和外面都有效,当你在 jail 外面时你就用外面那个,当你在 jail 里面时里面那个就会“立刻生效”。

接下来的一个问题是,要是我建立的是一个硬链接呢?这个也不难,硬链接会直接访问到目标文件,不存在目标文件存在不存在的问题。那么,如果一个 chroot jail 中有那么一个硬链接,那么你就可以逃出 jail 了?答案是否定的,因为硬链接是不允许建立在目录之上的!至少在 Linux 上如此。在 Linux 上,除了目录“.”“..”你是看不到其它任何硬链接的目录的,为什么?因为如果允许了对目录的硬链接,那么文件系统树状结构层次就会被打破,会出现环。你会说,软链接也不是一样出现环吗?是啊,可是我们对它可以选择 follow 还是不 follow,比如 find(1),默认的情况就是不去 follow 软链接。

呃,在继续向前走之前,这里还有另一个关于 chroot 的问题,那就是 chroot(2) 并不会自己去 chdir(2),也不会关闭任何在此之前打开的文件,无论其是在 jail 里还是 jail外!瞧瞧,Unix 的设计哲学运用得多么好,绝对不多做一件不属于自己的事!但这会带来问题,如果你忘记自己去 chdir(2) 的话你完全可以在 jail 之外通过“..”跳出 jail。这是意料之中的行为,Al Viro解释到:

“If you are within chroot jail and capable of chroot(), you can chdir to its root, then chroot() to subdirectory and you’ve got cwd outside of your new root. After that you can chdir all way out to original root. Again, this is standard behaviour. Changing it will not yield any security improvements, so kindly give that a rest.”
好了,继续向前走。硬链接有个天生的缺陷,就是无法跨文件系统,估计你也能隐约感觉到。想想如果我要 chroot 的是一个U盘目录,比如:/mnt/USB,那么我就无法在里面使用硬链接来链接到外面的文件了。为了解决这个问题,我们可以使用 Linux 上的 bind mount,也就是说把一个文件通过“挂载”的方式给“绑定”到一个地方,从而到达和硬链接一样的效果!但这个可以跨任何文件系统!我们完全可以chroot jail 里使用 bind mount 进来的文件。但是,它是有缺点的,相对于硬链接来说。一,它不会像硬链接那样“永久”存在,一重启就没有了,当然了,你可以修改 fstab,但这并不总是一个好办法;二,bind mount 需要 root 权限,即使两个文件的所有者都不是 root (内核邮件列表中有人提交过 unprivileged bind mounts 的补丁,不知道最后情况如何,至少我在 Fedora 上还是需要 root 权限的)。

从上面可以看出 mount 是个很有意思的东西,如果你觉得 bind mount 比较神奇,别慌,下面还有更神奇的呢。

mount 还提供一个 move 功能,可以帮助你把一个已经 mount 上来的东东移动到另一个地方去,免得你先 umount 再 mount。

还有呢,从 2.6. 15 之后mount 还提供了一个非常强大的功能,shared subtrees。这个稍微有些复杂,它的目的是这样的,比如我想在我的用户目录下克隆一个根目录的结构,通常我该怎么做呢?恩,cp -R,或者 rsync 一下。这么做有个明显的缺点:复制了东西,占用了更多硬盘空间。所以我们用 bind mount 比较合适,但是仅仅这么做还不完美:首先,我的用户目录本身也是在根目录下的,本身也会被 bind mount 进去;其次,如果后来我又在 /mnt 下挂载了新的东西呢?那在我的克隆目录中就看不到了。基于此,mount引入了个新玩意儿叫 shared subtrees,于是你可以这么做:

mount —bind /home/wangcong /home/wangcong
mount —make-unbindable /home/wangcong
mount —bind /mnt /mnt
mount —make-shared /mnt
如此一来,你就可以在 bind mount 上来的所有 /mnt 中看到新挂载的内容了。非常牛叉。

生活是最好的导演

我经常语重心长地给别人说,其实生活啊,才是最好的导演。这不,又发生了一件神奇的事情。
事情是这样的:

今天下班回家刚做完吃完饭,突然接到一个陌生电话,对方自报姓名,说是王简,问我是不是王聪。我一听,哦,原来是公司一起踢球的那哥们啊。解释一下,虽然经常和这哥们一起踢球,但因为不是同一个部门,所以不知道彼此号码;如果想知道也很简单,去公司内网查;所以上面的合情合理。

我问他什么事啊,他说代码遇到问题了,怎么怎么编译不过去,问我如何解决。我大体说了说思路,然后看他电话也说不清楚就问他现在是不是在公司,我过去看看,他说好。一路上我就在琢磨为啥这哥们遇到问题找我啊。

到了公司往那哥们的位置上一看,没人!!问旁边的同事,他们说他今天有事还提前下班回家了!我当时就震惊了,明明刚才说在公司的,而且还遇到代码问题了,怎么突然就没人了!

我冷静了一下,回到我的座位上拿出手机回拨那个号码,问问这哥们到底什么情况。一听电话我就傻了,是另一个人,我还在想他是谁时他倒是听出我来了,竟然是我一个高中同学?!我当时蒙了……

我问他到底是什么情况怎么这么离谱?他解释说他们公司有个叫王聪的,他旁边的一个同事有问题问那个王聪,然后看到他手机里有这个名字就拨了。巧合的是,这个打电话的人也叫王简(是不是同一个字不知道,反正读音一样),正好和我那个踢球的同事重名。更巧的是,我那个同事是东北人,口音很重,而我这个同学在大连工作,所以很可能他那个同事也是东北人,口音还差不多,至少我是没听出啥差别来。更更巧的是,我有那个高中同学的手机号啊,按理说能看到是不是他的手机打来的,可偏偏是他那个号欠费,用的另一个号码……

更更更巧的是,还好我今天晚上和美国那边开会,否则就白来一趟了……

瞧,生活导演了一部多么好的小电影啊!

一个典型的 off-by-one bug

今天美国人民过节,所以我今天上班基本上没啥事做。闲得发慌时无意中看到有人在邮件列表中报告 hexdump 有一个 bug,重现方法很简单,你只要通过 -s 把 skip 设置成该文件的大小就可以了,你可以用你手头上的 hexdump 试试,你会发现你可以看到全部文件的内容。这一下子激起了我的兴趣。

我一开始的想法是,hexdump 是个老命令了,虽然不能说像 ls 那些命令经过“千锤百炼”吧,但说“基本上不可能有bug”还是可以的。于是我抱着这个心态去翻源代码,虽然我在此之前从来没看过 hexdump 的源代码,但我还是信心满怀地找到了下面这么一句:skip -= sbuf.st_size; ,恩,看来是知道这种情况了,只是把它“折回”处理了,所以我回答说可能是一个 feature 而不是 bug。

但那个人后来的回复一下子惊醒了我,把 skip 再多加上一就是另一种结果了,什么都没有。所以这确实是一个 bug!当时我绕着源代码转了半天也没头绪,而且被里面那么多的全局变量和 static 变量给绕晕了,思考方向走错了。后来等我回到家做完晚饭一想,我靠,多一个或少一就没有 bug,这不就是 off-by-one 的症状嘛!肯定是哪里少算或者多算了一个临界值!抱着这个想法去找就简单了,很快就可以定位到问题所在,于是补丁自然而然地出来了

以前我们学C语言时不经常被提醒一定要注意 off-by-one 嘛,可能都没遇到过多么好的例子,现在这个就是现实中活生生的,非常典型的一个例子。作为反面教材放这里了。

现在再来回头看,问题其实很简单了,但当时分析这个 bug 时怎么就没想到这个原因值得深思:首先是心态不对,要面对现实,哪怕现实再残酷再不符合你的逻辑也要勇于否定自己,不要尝试找理由去否定现实,而是要接受现实去分析原因;其次,没有对“现象”进行深入思考,没有掌握到“现象”中表现出来的隐含规律,而这才是解决这个问题的关键!所以啊,不管在哪里多思考都是有好处的!

我很早以前就有这么个想法啊:作为程序员做 debug 工作,其实在很大程度上和侦探做破案工作是一样的。都要根据“凶案现场”(bug 症状)留下的蛛丝马迹顺藤摸瓜地去找“杀人凶手”(bug 所在);同样都是靠严密的逻辑去推理,唯一不同的是,侦探的逻辑和线索是事情发展的过程和顺序,而程序员的逻辑和线索是源代码;侦探在破案毫无头绪时会想更多的办法去搜集证据和证词等等,而程序员在毫无头绪时可以通过调试器等获取更多 debug 信息,总之都是获取更多的信息量,因为信息更多意味着分析出来的东西会更多。

这让我想起多年前上高中时上课都偷看的《福尔摩斯探案集》来了,里面福尔摩斯老师的那几句话真是饱含哲理,牛逼轰轰,金光闪闪啊:

当你把决不可能的因素排除后,不管剩下的是什么——-不管多么难以置信——那就是真相。

没有掌握全部证据以前,先作出假设,这是决大的错误,那样会使判断产生偏差。

猜想是很不好的习惯,它有害于作逻辑推理。

内牛满面地把这几句话收藏起来作为 debug 时的座右铭…… T_T

kbuild 更换维护者

Sam Ravnborg 作为 Linux 内核 kbuild 子系统的维护者已经很长时间。因为提交过相关补丁的原因,和他有过电子邮件来往。如果我没记错的话,他应该是意大利人,这位老大英语不是一般差,他的英语我每次读都比较费劲。无论如何,他对内核社区的贡献是有目共睹的,感谢多年来他的努力,现在 kbuild 系统已经很完善了。

昨天晚上的一封电子邮件中,Sam 突然宣布放弃继续维护 kbuild,因为家庭和工作的原因,时间不够用了。他维护 kbuild 也都是在业余时间来做,确实比较辛苦。 kbuild 作为内核中比较特殊的一部分,它几乎纯粹是用户层的东西,但和最后生成的内核二进制文件又息息相关,总体上感觉有点儿“鸡肋”,而且一般人是不会乱碰那些很多人看不懂的 Makefile 的。而且编译不光涉及简单的直接编译,还涉及到各个平台之间的交叉编译,涉及二进制文件格式等等,维护这些东西确实很麻烦。不管谁接手这个活儿都不容易。

目前谁将继续维护 kbuild 还未确定,主要还是要看 lkml 社区的认可程度,毕竟开源社区就是靠声望运作的。在私下的讨论中,Debian 开发者 Aníbal Monsalve Salazar 表示对此感兴趣,希望能接手,但不知为何并没有抄送到 lkml。最后如何我们只能拭目以待了。

BTW:正是靠这么多业余爱好者的努力,Linux 才成长如此迅速。感谢那些默默无闻,常年奋战在自由软件开发第一线的 geek 们!他们是互联网上最可爱的人!geek 万岁!8-) 姑娘们,给你们十个理由去嫁给 geek 男!恩哼~!