2009年3月18日星期三

Python Looping小技巧

Python下面的循环有很多看起来花哨其实很实用的技巧。首当其冲的就是enumerate(),花哨到用语言很难讲清楚...小例子如下:

for i, v in enumerate(['tic', 'tac', 'toe']):
print i, v

0 tic
1 tac
2 toe

在编程的时候大家经常要用到的情况,就是控制循环的index同时是用来访问某一个数组的。比如用Matlab实现:

arr = {'tic', 'tac', 'toe'};

for i = 1:length(arr)
fprintf('%d %s', i, arr{i});
end

相比之下,大家就知道我为什么说enumerate()实在是很fancy的一个东西。

但enumerate()和我们一直理解的循环有一个很重要的区别,那就是循环的进行不是靠i的值控制的,而是靠enumerate来控制的。咱们写循环的时候一个常见的错误就是循环套循环的时候经常用一样的变量“i”来控制,这样就会出很诡异很诡异的问题,debug都不容易找到。但是在Python下面:

for i, season in enumerate(['Spring', 'Summer', 'Fall', 'Winter']):
print i, season
for i, day in enumerate(['Wed', 'Thu', 'Fri', 'Sat']):
print i, day

0 Spring
0 Wed
1 Thu
2 Fri
3 Sat
1 Summer
0 Wed
1 Thu
2 Fri
3 Sat
2 Fall
0 Wed
1 Thu
2 Fri
3 Sat
3 Winter
0 Wed
1 Thu
2 Fri
3 Sat

虽然我在两层循环用了一样的i,但Python根本不鸟这个,只管用enumerate()生成(index, arr[index])对,生成完之后循环结束。如果我用matlab这样写:

S = {'Spring', 'Summer', 'Fall', 'Winter'};
D = {'Wed', 'Thu', 'Fri', 'Sat'};

for i = 1:length(S)
disp(S{i});
for i = 1:length(D)
disp(D{i});
end
end

大家都知道什么后果了吧...

Enumerate还有一个非常Fancy的例子:

fp = open("file", "r")
for i, line in enumerate(fp):
print "line number: " + lineno + ": " + line.rstrip()

可以一行一行把一个文件读出来,而且很省内存,只要你的内存能装下那一行就行了。在需要把一个超大文本文件里的数据读出来处理的时候,这个例子非常有用。

最后再帖一个enumerate之外控制循环的例子,也是相当fancy的:

questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
print 'What is your ' + q + '?', 'It is ' + a + '.'

What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.

2009年2月8日星期日

从AD到OFFER:我的ASU之路

话说今天早上6 点钟睁眼,看到Gmail 依然是除了Scipy 的digest之外空空如也,当时
心里哇凉哇凉啊……然后想好了一大堆感伤的话准备去实验室给ASU 一直在帮我要钱的
老师打电话。到了实验室打开电脑心想还是看看邮箱吧,然后就看到了TA二字……

当时很困,所以没有太多的激动,只是看完了多少米,免学费否,有医保这些东西,然
后又去学院的网上查了一下开销,心想这个按照土话讲就是全奖了,呵呵,送了一口气。
觉得这么多天的辛苦和等待总算不至于美国落到个颗粒无收的地步,所以就准备从了得
了……

今年的局势要比我想象的艰难得多。本来我觉得我的条件无懈可击,或者说在我的角度
上来说已经做到最好了。我GPA 89.1/100,专业第一,T102,G480+800 +4 ,还辛辛
苦苦的发了两篇不错的国际会议,一篇一作ICMLC ,关于二进制PSO 的,一篇二作ICTAI
,关于改进SVM训练方法。

之所以说很辛苦是因为我身处在一个没有这方面导师的地方,从选自己喜欢的而且有东
西做的方向,到出idea到发表论文然后出国开会,全是我们几个学生自己完成,所以我
们每篇文章都是100%甚至更多的工作量。唯一也是最大的硬伤,就是我的出身,因为我
来自南京邮电大学。附加效应就是我的推荐人都是完全没有名气但对我很nice的老师。
但这个是我无法选择的,只因为我在几年前高考报志愿时的一次失误。

ASU 的AD放的非常早,大约在过年寒假的时候就出来了。当时还不知局势的紧迫性,所
以很高兴之余就耐心的等他们在financial 方面的决定。中间我等啊等啊,等来了无数
的Rej 和AD(而且表明不给钱),但我就一直不觉得有问题,因为还有ASU ……结果不
知不觉中pending 越来越少,OFFER 依然没有一个。

当我很有自信的几个学校相继给我Rej ,拿来保底的学校给我AD之后,已经到了3 月中
旬,这是我才开始觉得不对了……

想到我好歹有了AD,套磁不会被BS了吧,就去套了一个ASU 的教授,热情洋溢地说我有
多么热爱ML、PR和DM,结果他果然很快的回信,说去看一下我的Application ,然后asa
p回复我。

又过了一个星期,ASU 也没动静,教授也没动静……这时在水源上看到一个兄台很快收
到了ASU 的不给钱信,然后第二天就去套磁,然后第三天就拿到OFFER ,我一阵郁闷…
…心想我还不如拿不到钱就得了……结果不幸洛阳地邪啊……

我一天早上很麻木的打开信箱,看到了让人心碎的不给钱几个大字……我一个郁闷……
现在时间这么紧迫了……

这种东西要给早点给啊……

然后我就赶快给那个教授哭啊,我说我们在第三世界国家的第三世界学校,小孩子们那
个苦啊……跑程序没有服务器、写文章没有导师、发文章开会都要自费啊……就这样我
们这些热情于学术的小朋友依然自发组成了一个实验室,在厕所边上作胸透的小屋里靠
捡破烂组成了一个实验室,在研究中度过了最快乐的时光……(以上都是事实,也是我
的原话……)

教授马上给我回信,说我觉得你的条件很不错,我把你的材料递到系里面了,大家一起
hope for the best吧。

我就在这新的希望中度过了又一个星期……

这时NUS 的一个导师给我写信,说你现在定下来没有?定下来要来这里我就送你去MSRA
实习,我其实也一直非常想去,心想这就算摧了呀,可是ASU 又异常安静……

只好赶快给ASU 打了一个电话……电话里导师说我们不是觉得你的出身不好,我们只看
学生是否优秀,我们也收了很多一般出身的学生,比如四川大学的(我严重无语了……
)。
我们只是不知道你的GPA 第一名能代表什么……而且你的论文不算多的,有比你论文还
多的本科生,所以你应该work harder ……我说不会吧,论文要认真做的话一年才能有
一篇呢,我已经很努力了……他说所以我们担心是你的导师不够好,而不好的导师怎么
能培养出好学生呢……(我继续无语……说了半天还是出身问题……)我说我们不是没
有好导师,我们没有导师……所有东西全部是我们自己做的。他这时愣了一下,说原来
是这样,你们自主research 是很重要的……

然后我就说了一下NUS 的条件,他说NUS 给的条件也非常好,他当时也在NUS 和MSRA工
作过,都很不错……

所以即使我们给你offer 你也要选择一下云云……然后他就给我最后期限,他说如果下
周二还没有动静的话你就去NUS 吧,good luck ……

我马上给NUS 写信,说我现在面临人生目前最大的决定,请等到下周二我再告诉你……
结果他很nice的回说我其实没有逼你……我心想唉……早知道我还可以多等几天……话
说SC真的是很nice的一个人。

……

然后就到了今天早晨,如愿拿到了offer.但可惜心里紧张,话筒又出了问题,结果我说
的话对方也没怎么听清楚,其实我就是想表示一下感谢……对方就说你看,拿到钱了吧,
不过你不需要为我干活,我一直帮你要钱就是气不过你怀疑我们歧视南邮……我无语…
…这也管用啊……

就这些了大概:- )

让Ubuntu满天飞Tux:-)

如果是7.10并安装好了稳定版的compiz,首先安装编译所需的包:

sudo apt-get install compiz-bcop compiz-dev build-essential
libxcomposite-dev libpng12-dev libsm-dev libxrandr-dev libxdamage-dev
libxinerama-dev libstartup-notification0-dev libgconf2-dev libgl1-mesa-dev
libglu1-mesa-dev libmetacity-dev librsvg2-dev libdbus-1-dev
libdbus-glib-1-dev libgnome-desktop-dev libgnome-window-settings-dev gitweb
curl autoconf automake automake1.9 libtool intltool libxslt1-dev xsltproc
emerald x11proto-scrnsaver-dev libxss-dev

然后下载各种plugin:

wget -O /tmp/3d.tar.gz
'http://gitweb.opencompositing.org/?p=fusion/plugins/3da=snapshot;h=db3c51d6
c5c0df268fc1ec29a4264ef3d21dbbb3'
wget -O /tmp/atlantis2.tar.gz
'http://gitweb.compiz-fusion.org/?p=users/smspillaz/atlantis2-0.6a=snapshot;
h=d50d17bcdef5a025699e6b1bc0d604a98d1b74b2;sf=tgz'
wget -O /tmp/snow.tar.gz
'http://gitweb.opencompositing.org/?p=fusion/plugins/snowa=snapshot;h=01d0ff
6ec71dae4699bc990e0114569c8ad4e083'
wget -O /tmp/stars.tar.gz 'http://oreaus.googlepages.com/stars.tar.gz
wget -O /tmp/atlantis.tar.gz
'http://gitweb.opencompositing.org/?p=fusion/plugins/atlantisa=snapshot;h=a4
7d7151444faccd66ea5cb884673cdebe5d7dff'
wget -O /tmp/screensaver.tar.gz
'http://gitweb.opencompositing.org/?p=users/pafy/screensavera=snapshot;h=656
5001eb389fb0d18cfead6030054cc8edc6c5f'
wget -O /tmp/anaglyph.tar.gz 'http://oreaus.googlepages.com/anaglyph.tar.gz
wget -O /tmp/wallpaper.tar.gz
'http://gitweb.compiz-fusion.org/?p=fusion/plugins/wallpapera=snapshot;h=c2d
19686e46ae171b6a0c04da9de1adbd74ae8be'
wget -O /tmp/tile.tar.gz
'http://gitweb.opencompositing.org/?p=fusion/plugins/tilea=snapshot;h=550c91
fa188efd39c9cea43f894b45716b5cc6d5'
wget -O /tmp/freewins.tar.gz 'http://oreaus.googlepages.com/freewins.tar.gz
wget -O /tmp/photowheel-0.6.tar.gz
'http://gitweb.opencompositing.org/?p=users/b0le/photowheela=snapshot;h=41d8
090b55b629f72bef55d785beaf468f31662f'

这里面是没有我用的Autumn的。虽然说Snow用起来也差不多,但我总觉得autumn的企鹅
飞地更加飘逸。去ubuntu的forum上有一个帖子上有autumn的下载,安装只需跑一个脚本
。以上的plugin都直接make就可以,都很酷,尤其是screensaver,不过与之后的话题没
太大关系。

帖子位置:
http://forum.ubuntu.org.cn/viewtopic.php?t=89199

装好之后,在Advanced Desktop Effect Settings里面就可以看到Autumn的选项,图标
是一个树叶的话就基本没有问题了。默认的情况下飞的是树叶,但具体飞什么图是由tex
ture决定的,但是在GUI的情况下,一次只能增加一张图,所以像我这种使用一大堆TUX
图片作为texture的人,每重装一次就很郁闷。所以有一个更爽的方法:

首先把当前的profile输出到一个文件里,在里面可以找到[autumn]这一项,as_leaf_te
xtures =这个后面加上所有的图片地址,并使用;隔开。下面这个脚本可以自动将一个文
件夹内所有的图片地址都输出成需要的格式(替换相应的图片文件夹地址):

#!/usr/bin/python

from os import listdir

image_list = listdir('/home/yuanlei/Pictures/Compiz_Related/Crystal_Tux')

str = ''

for file in image_list:
str = str + '/home/yuanlei/Pictures/Compiz_Related/Crystal_Tux/' + file
+ ';'

print str

然后,再把改过的profile文件import进去...