Sunday, September 28, 2008

[Python] 一些小tips

(1) 用isinstance判断变量类型
>>>A = [1,2,3,4]
>>>isinstance(A, list)


(2) sort, reverse 以及 sorted, reversed
A=[3,1,2]
assert(A.sort() == sorted(A))
assert(A.reverse() == reversed(A))


(3) 一个简单的命令行progress bar:
def progress_bar(current, total, width=20):
i = int (current*width/total)
sys.stdout.write("\r|" + '*'*i + ' '*(width-i)+"|")


(4) PyYaml最简单的用法
  • 把一个变量A dump到一个文件f中
    A = {1:'a', 2:'b'}
    yaml.dump(A, f)

  • 从外部yaml文件文件load出数据到A
    A=yaml.load(filehandler)
    


(5) 读取命令行的输入:
  • input(prompt)
  • raw_input(prompt)
  • import getpass
    getpass.getpass(prompt)

(6) 使用re正则表达式
import re
>>>m = re.match(r"(\d+)\s*(M|K)(bit|Byte)", "1024Mbit")
>>>print m.group(1), m.group(2)+m.group(3)
1024 Mbit

还可以使用(?P)来acess匹配到的字符串
m = re.match(r"(?P\d+)\s*(M|K)(bit|Byte)", "1024Mbit")
>>>print m.group("num"), m.group(2)+m.group(3)
1024 Mbit

为了提高使用正则表达式的效率, 可以先编译正则表达式, 然后每次用编译出来的正则字符串去匹配
>>>p = re.compile(r"(\d+)\s*(M|K)(bit|Byte)")
>>>g = p.match("1024Mbit")
>>>print g.group(1), g.group(2)+g.group(3)
1024 Mbit


(7)显示异常的类型和错误信息
try:
    do what you want
    except:
        print sys.exc_info()[0], sys.exc_info()[1]
sys.exc_info()[0]: 异常的类型
sys.exc_info()[1]: 异常的信息

(8) Python 2.5以后支持with 语句. 用在file object上,就不用close这个文件了
with open("max_load_vs_k.dat","w") as f:
    do some file operation with f


(9)Python Search Path
>>>sys.path
['', '/Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload', '/Library/Python/2.6/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC', '/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode']

[VI]vim笔记

常用键
. 重复上一个命令
ctrl G 显示当前文件名等信息
去除^M %s/^M//g
^M = ctrl v+ ctrl M

移动
w,b 向右/左移动一个单词
ctrl f,ctrl b 向下/向上翻页
% 移动至匹配的括号
fc,Fc 向右/左移动至下一个字符c
tc,Tc 向右/左移动至一下个字符c

删除
dm 删除至移动指令m所到达的地方
di{, di} 删除当前配对的{}间所有内容
di(, di) 删除当前配对的()间所有内容


缩进
>> Indent line by shiftwidth spaces
<< De-indent line by shiftwidth spaces
5>> Indent 5 lines
5== Re-indent 5 lines
>% Increase indent of a braced or bracketed block (place cursor on brace first)
=% Reindent a braced or bracketed block (cursor on brace)
<% Decrease indent of a braced or bracketed block (cursor on brace)
]p Paste text, aligning indentation with surroundings
=i{ Re-indent the 'inner block', i.e. the contents of the block
=a{ Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block
>i{ Increase inner block indent
<i{ Decrease inner block indent
Block Visual
ctrl+v 进入 Block Visual 模式;
用方向键控制在几行作业;
I 进入插入模式, 键入插入内容;
esc返回,这样插入的内容被应用于选中的每一行
d 删除选中的区域

如果发现无法实现上述功能,很可能是没有装完全的vim
在ubuntu或者debian下,可以

$ sudo apt-get install vim-full

编辑模式下使用上下左右键
:set nocp
或者在${HOME}/.vimrc中加入
set nocp

加密码
vim -x filename
更换密码:
vim +X filename

常用${HOME}/.vimrc的设置
  • set expandtab: 把tab置换为space
  • set ts=4: 设置tabstop为4
  • set tw=0: 设置textwidth。 一行长度超过textwidth的时候会添加line break。为0的话disable这个功能
  • set showmode: 显示当前vi工作在什么模式下
  • set nocompatible: 抛弃和vi兼容性.通常如果在插入等模式下用方向键出来ABCD之类的字母,就这样设置
  • .vimrc中, 如果要注释一行,使用双引号"


打开多个文件和在其中移动
使用tab (http://vim.wikia.com/wiki/Using_tab_pages)
  • :tabe filename 在新tab中打开另一个文件
  • :tabs 查看所有tabs
  • :tabc 关闭当前tab
  • :tabc {i} 关闭第i个tab
  • gt 上一个tab
  • gT 下一个tab

切割屏幕
:split
:split filename
:vsplit
:vsplit filename
在窗格间切换
ctrl-W 上/下


VIM Quick Reference
VIM tips and tricks

Friday, September 12, 2008

[Python]用Pylab给Paper画图

之前写paper 画图一般都用Matlab画图。因为Matlab的plot可以生成eps格式的图片。但是最近都是用Python的pylab包来画图。原因是一般用在paper里的eps文件插在paper里通常都显得字比较小,需要调整线宽和字体大小。手动在matlab的figure编辑界面里自然可以修改,但每次都要做同样的工作非常令人厌烦。或者可以在matlab画图的源文件里加上比如 plot(...., "linewidth", 2)之类的语句, 但是当画图的语句一多起来,这样也很麻烦。所以我觉得用pylab来画图更加方便。pylab的绘图语句和matlab有高度的兼容性。另外python强大的文件处理和字符串处理能力正是matlab的软肋。

使用pylab画图的时候, 可以事先用 rcParams 来改变默认的线宽、图例的字体大小、x,y轴的label和tick的字体大小。

rcParams['lines.linewidth']=2
rcParams['legend.fontsize']=16
rcParams['axes.labelsize']=14
rcParams['xtick.labelsize']=14
rcParams['ytick.labelsize']=14

后面就用普通的plot函数(用法和matlab一样)来画图。再有就是可以用savefig来直接存成eps文件。

Friday, September 05, 2008

[Python]用Python开发Firefox扩展:1 准备工作

- 准备好你的Firefox
既然是为Firefox做extension,自然少不了用Firefox来调试啊之类的。这样也免不了把它弄崩溃。呵呵 我还在试验helloworld的时候就把Firefox弄得无法启动了。其实Firefox非常体贴的提供了多profile启动的功能。用
firefox   -ProfileManager
来启动,这样可以添加、删除firefox的profile。平时我们用的都是default的profile。我们就可以添加一个dev的profile。这样启动的时候firefox会提供选择使用哪个profile。所有对firefox做出的更改,比如字体啊,插件啊,扩展啊,都是限定在你使用的profile内。所以一旦调试的时候出了问题,我们只需要删除相应的profile就好了而不会影响平时的上网和使用。

Firefox的Profile 文件依据操作系统不同而处于不同的路径下,具体可以参见这里

- 编译PyXPCOM
有关编译PyXPCOM请参见这里. 简单说来,你需要从源码编译mozilla套件(而不仅仅是 Firefox)。编译的时候需要在makefile里加入相对应的选项 (ac_add_options --enable-extensions=python/xpcom,default)。做好准备:编译需要很长时间,你可以睡觉前开始。