Friday, October 24, 2008

[SVN]设置ignore属性

1 设置本地,全局ignore属性
如果想在本地所有工作目录下屏蔽*.o, *.pyc这些临时文件, 可以修改"/etc/subversion/config" (针对所有用户)或是"~/.subversion/config"(仅针对当前用户):
添加, 或是去掉如下行的注释
[miscellany]
global-ignores = *.o *.pyc
这样不管在哪个工作目录, *.o 以及*.pyc都不会被列出来了.

2 设置server端,局部(每个目录可以不同)的ignore设置
进入你希望设置的工作目录,
svn propset svn:ignore "*.o" .
然后commit提交之后, 这个目录的svn:ignore属性便被设置成了*.o .

如果要同时设置多个ignore pattern, 比如 *.pyc *.pyd *.output的, 需要在不同pattern之间用回车隔开, 空格是不成的.所以可以用"\"符号输入多行
svn propset svn:ignore "*.pyc\
*.pyd \
*.o" .
或者写在文件里, 然后从文件导入:
svn propset svn:ignore -F .cvsignore .
或者调用外部editor:
svn propedit svn:ignore .

如果希望属性被递归的设置:
svn propset -R svn:ignore "*.o *.pyc" .

注意这个改动是server端可见的.也就是说别人的改动也会影响到你.

Tuesday, October 21, 2008

[Python]初探PyQt (1)

因为需要做demo的缘故,要搞一个GUI来显示一些东东。纯粹编程语言的话我肯定是首选Python。但Python的GUI编程我很不熟。很久很久以前用过tkinter来做,感觉不好,widget资源太少。最近用了很多基于Qt平台的东西,包括qterm,以及Python最强大的IDE eric。感觉Qt平台很漂亮资源也很丰富。所以就搞基于Qt的了。Qt是跨操作系统的一个图形界面平台,是挪威Trolltech 公司的产品。但是它提供免费的开源版本可以使用。著名的KDE桌面环境就是基于Qt开发的。Qt是使用C++的,可现在也有很多基于其它语言的binding(应该翻译成绑定么?),比如基于Python的PyQt和基于Ruby的RubyQt。PyQt就是我打算使用的。它允许我们在Python环境里调用Qt平台的API。

在Ubuntu上安装PyQt很简单,只要 apt-get install python-qt4就可以了。
在Mac上安装要稍微复杂一些,首先安装Qt4.你可以直接从源码安装,也可以port安装
port install qt4-mac
然后编译安装sip,最后才能编译安装PyQt

然后就可以上手了, 这里有一个很不错的PyQt的tutorial: http://zetcode.com/tutorials/pyqt4/。 同时你可以看到QtGui的所有widget: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qtgui.html



QWidget(parent) 初始化控件时候可以指定该控件的parent.这样在parent被delete的时候,该控件也一同被delete
setGeometry(x,y,width, height). (x,y)是控件左上角坐标 -- (0,0)是左上角, width和height是控件的宽和高.
resize(width, height) 设定控件的大小
setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Raised) 设定frame周围边框样式
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('cleanlooks')) Typically they include "windows", "motif", "cde", "plastique" and "cleanlooks". Depending on the platform, "windowsxp", "windowsvista" and "macintosh" may be available.

(待续)

Sunday, October 19, 2008

[Linux]挂载ntfs分区

第一步,查看各个分区的UUID
sudo blkid
得到类似如下的输出:
/dev/sda1: UUID="B03459B334597CF2" LABEL="System" TYPE="ntfs"
/dev/sda2: UUID="CAEC3646EC362D57" LABEL="Data" TYPE="ntfs"
/dev/sda3: TYPE="swap" UUID="29e3c192-9a88-4304-be63-7ce425c5f0bc"
/dev/sda4: UUID="91c8e884-0927-4e5b-847e-383a5a7b4060" TYPE="ext3"
/dev/sdb1: LABEL="-----------" UUID="40DD-FB39" TYPE="vfat"
第二步,修改/etc/fstab:
# /dev/sda1
UUID=B03459B334597CF2 /mnt/winc ntfs uid=1000,gid=0,umask=000,nls=utf8 0 0
# /dev/sda2
UUID=CAEC3646EC362D57 /mnt/wind ntfs uid=1000,gid=0,umask=000,nls=utf8 0 0
这里设定可以在每次开机的时候将win下的c盘(/dev/sda1)挂载在我的/mnt/winc. 以后uid为我自己(1000是我的uid),gid为root. 其他参数还包括:
  • umask: 设定默认的文件以及目录的权限掩码. 4: read, 2: write, 1: execute. 000就代表给所有人(user, group, other)所有权限. 033的话就是给user rwx权限,group和other只有r权限.
  • dmask, fmask: 分别设定针对目录以及文件的权限掩码.
  • nls (native language support): 加入本地编码(比如我这里是utf8),这样就不会乱码.
事实上在linux下umask(或者dmask+fmask)的设定就是ntfs分区里所有文件目录的默认权限了.你用chmod去修改也不奏效.

Ref:
http://wiki.archlinux.org/index.php/Fstab_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

Thursday, October 16, 2008

[Linux]几个常用的Linux命令/工具的用法举例

这里是我平时常用到的几个linux命令以及比较trick的一些参数,附带简单的使用例子
文件操作

  • ls
    参数:
    • -h: 以人易读的格式显示文件大小 (比如 1K, 234M, 2G这样)
    • -R: recursively显示子目录下的文件
    • -t: 按修改日期排序(最近修改的靠前)

  • tar
    实例:
    • 例1:把foo这个目录打包并使用gzip压缩,并自动剔出.pyc文件以及version control的文件
      $tar -zcf foo.tar.gz --exclude '*.pyc' --exclude-vcs foo
    • 例2:把foo这个目录打包,但是用lzma压缩(lzma有比gzip的压缩比高,解压快的特点.但是压缩的时候慢)
      $tar -cf foo.tar.lzma --lzma foo
    • 例3:解压foo.tar.gz
      $tar -zxf foo.tar.gz
    • 例4:解压foo.tar.bz2
      $tar -jxf foo.tar.bz2
    • 例5:查看foo.tar.gz包内容
      $tar -tf foo.tar.gz

  • rm
    实例
    • 例1:删除一个叫--foo的文件
      $rm -- --foo
    参数
    • --: 删除以"-"开头的文件

  • find
    实例
    • 例1:找出$HOME 底下(recursively)所有以apc999开头的,owner为apc999的,permission为755的,创建时间为1天以前的文件
      $find ~ -name "apc999*" -user apc999 -perm 755 -mtime 1
    • 摆脱烦人的"permission denied"警告
      $find ~ -name "apc999*" -print 2> /dev/null 
进程操作

  • ps
    实例
    • 例1:显示当前终端的所有进程:
      $ps
      PID TTY          TIME CMD
      12713 pts/24   00:00:00 tcsh
      12840 pts/24   00:00:00 ps
      
    • 例2: 显示所有当前用户进程(包括使用了其他终端的) x, 显示进程的用户名 u,并用树型表示其父子关系 -H
      $ps ux -H
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      apc999   12713  0.0  0.0  59732  1684 pts/24   Ss   15:11   0:00 -tcsh
      apc999   12839  0.0  0.0  74864  2080 pts/24   R+   15:20   0:00   ps ux -H
      apc999   12637  0.0  0.0  59732  1684 pts/10   Ss   15:07   0:00 -tcsh
      apc999   12760  0.1  0.0  24412  2052 pts/10   S+   15:13   0:00   top
      apc999   12821  0.0  0.0  66196  1144 ?        Ss   15:16   0:00 SCREEN top
      apc999   12822  0.1  0.0  24416  2048 pts/27   Ss+  15:16   0:00   top
      
    参数
    • u 显示进程的用户名
    • x 显示当前用户的所有进程(包括当前用户的其他终端)
    • -A (-e)显示所有进程(包括其他用户)
    • -U Username指定特定用户

  • screen 是一个窗口管理工具帮助你保持一个session在主机上的运行而不受外界因素影响.比如你ssh到一台主机上运行一个程序foo,当你ssh中断的时候, 这个程序foo的运行也将中断.为了让foo的运行不受ssh的影响,screen可以助你一臂之力.这里link是我写的比较详细的介绍
下载

  • wget其实是强大的下载/抓站工具,默认支持断点续传
    实例
    • 例1:将http://www.example.com/packages/foo.bar 下回来
      wget -r -c http://www.example.com/packages/foo.bar
    • 例2:将http://www.example.com/packages/ 下后缀为zip的文件(不包括子目录中的)全部下回来
      wget -r -np -nd -A.zip http://www.example.com/packages/
      把example.html中所有链接的zip文件下载回来, 只往下找一层
      wget -r -l1 -np -nd -A.zip http://www.example.com/example.html
    • 例3:下载urls.txt 中所有url:
      wget -i urls.txt
    参数
    • -r: 递归下载。如果是http的url,下载http文件当中超链接所引用的url;如果是ftp,下载目录(如同cp 或者scp 的-r参数)
    • -c: 指定断点续传。wget默认选项,只有该文件之前被其它ftp工具所下的时候才有用。
    • -np/-nd: 不在远端遍历父目录/不在本地建立目录结构
    • -l: 递归级数(配合-r使用)
    • -i --input-file: 下载在FILE文件中出现的URLs
    • -t: 重试次数
    • -A, --accept=LIST: 分号分隔的被接受扩展名的列表
    • -R, --reject=LIST: 分号分隔的不被接受的扩展名的列表

  • curl:一个利用URL语法在命令行下工作的文件下载或上传的工具
    实例
    • 例1:将http://www.example.com/packages/foo.bar 下回来,另存为a.bar
      curl -o a.bar http://www.example.com/packages/foo.bar
    • 例2:批量下载
      curl http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html \
        -o "archive#1_vol#2_part#3.html"
      
标准输入输出上的文本处理

  • grep
    实例
    • 例1: 查找当前目录下所有文件(recursively)是否包含某一个正则表达式reg_exp,忽略大小写
      $grep -rin reg_exp *
    • 例2: 查找当前目录下所有以foo为extension的文件
      $grep -r --include "*.foo" reg_exp *
    • 例3: 显示匹配行以及上下两行的内容
      $grep -2 reg_exp *
    参数
    • -?: 显示匹配行的上下?行
    • -r: recursive 递归查找
    • -i: ignore case 不敏感大小写
    • --include: filename pattern 根据给定文件名pattern过滤
    • -n: line number 显示行号

  • awk: 在输入的文件或字符串中, 基于给定的规则提取文本.基本用法 awk 'pattern {action}'
    实例
    • 例1:将文件A.txt当中每行用,分割为若干个字段,输出第3个字段
      $awk -F "," '{print $3}' A.txt
    • 例2:检查哪个用户没有设立password
      $awk -F: '$2=="" {printf("%s no password!\n",$1)}' /etc/passwd
    • 例3:统计当前目录下所有.dat文件一共多大(对输入的某一列求和)
      $ls -l *.dat | awk '{ SUM += $5} END { print SUM/1024/1024 }' 
    参数
    • -F: 分割符
    • $1: 得到的第一个字段
    • $NF: 最后一个字段

  • cut: 和awk有一些类似,但用法比awk简单
    实例
    • 例1:将文件/etc/passwd当中每行用:分割为若干个字段,输出第1和第7个字段
      cut -d : -f 1,7 /etc/passwd
    参数
    • -b list: list指定第几第几个byte位置
    • -c list: list指定第几第几个字符位置
    • -f list: list指定第几第几个field位置

  • head/tail: head用来 显示一个文件开头部分, tail 显示一个文件结尾部分
    实例
    • 显示foo.txt的前100行
      head -n 100 foo.txt
    • 显示foo.txt的最后100个byte
      tail -c 100 foo.txt
    参数
    • -n: 行数
    • -c: 字节数
    • -f: 不结束, 不停刷新显示

  • tee: 很有用的小命令--把标准输出的内容复制到制定文件当中
    实例:
    • ls并把显示内容复制到ls_result 这个文件中。
      ls * | tee -a ls_result

  • uniq: 报告或者忽略输入中重复的行
    实例
    • 查看输入中有多少不同内容的行,以及每一行出现的次数
      cat foo | sort | uniq -c

  • diff: 比较两个文件或者目录下的不同
    用来比较两个目录(以及子目录)下文件的不同
    $ diff -r /path1/foo /path2/foo

  • hexdump: 报告或者忽略输入中重复的行
    实例
    • 把二进制文件foo按照16进制字符输出
      $ hexdump  foo 
      0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
      0000010 12 00 00 00 d8 08 00 00 85 00 20 00 00 00 00 00
      0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
      ...
用户相关的操作

  • adduser: 添加用户
    增加用户foo
    $ sudo adduser foo
    把用户foo添加到admin当中(可以sudo)
    $ sudo adduser foo admin

  • groups:查看某个用户所属的组
其他操作

  • time: 给命令计时. 注意有时候shell自带的time功能较弱,要用/usr/bin/time
    实例
    • 给命令cmd计时
      /usr/bin/time -f "%E" cmd arg1 arg2 

Tuesday, October 07, 2008

gedit的style以及语法增亮

(1) 用gedit 在Ubuntu上编辑Latex
现在很喜欢用gedit在Linux下面编辑Latex文档。它有一个非常好用的latex插件。Windows下面最常用的CTex/WinEdt套装里的基本功能这里也基本都有。说一下步骤:
  1. 虽然这个plugin不是默认的,但是只要下载下来然后把plugins/目录下的内容拷贝到 ~/.gnome2/gedit/plugins底下就可以了。
  2. Ubuntu默认的latex package没有装全,可以apt-get install texlive-full把所有的都拖下来。大概需要1G左右的硬盘空间
  3. 安装rubber: apt-get install rubber。 rubber是linux底下一个非常好用的latex编译工具。用来编译latex文档(足够次数以保证ref显示正确)
(2) 让gedit漂亮的显示code。
你已经可以用gedit来修改和编译latex文档了。但是gedit默认的color scheme对于latex的语法增亮支持的不好。事实上gedit 2.19以后的自定义color scheme功能使得用户可以把gedit的GUI和语法增亮设置到漂亮的发指的地步。当然也可以KUSO到发指。比如我就去下了一个Turbo Pascal/C界面的style回来,用起来及其怀旧。不过还是dark color的scheme好看以及省眼睛。自带的Oblivion就很好。 不过这个默认的scheme也对Latex的色彩增量支持不好。我又舍不得gedit的latex plugin。就决定自己动手丰衣足食,打造一个漂亮且对Latex,Python等code友好的color scheme。

相关知识:gedit的color scheme允许使用用户自定义的xml文件(当然它自己也带了4个风格,Tango,Oblivion等)。其色彩增亮依据的语法定义,借用了gtksourceview的一套东西。

第一步: 建立自己的风格定义文件。这里命名为APCDarkMate.xml。基本抄了DarkMate这个color scheme,增加了我自己的python和latex语法增亮:

<name="python:keyword" style="def:keyword">
<name="python:comment" style="def:comment">
<name="python:module-handler" style="def:keyword">
<name="python:builtin-constant" style="def:constant">
<name="python:builtin-object" style="def:type">
<name="python:builtin-function" style="def:function">
<name="python:boolean" style="def:constant">
<name="python:multiline-string" style="python:comment">
<name="python:special-variable" style="def:constant">
<name="latex:keyword" foreground="yellow">
<name="latex:common-commands" style="latex:keyword">
<name="latex:command" style="latex:keyword">
<name="latex:display-math" foreground="green">
<name="latex:include" style="latex:keyword">



(待续)

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)。做好准备:编译需要很长时间,你可以睡觉前开始。

Friday, August 29, 2008

[Python]IPython: Python与Shell的混血王子

无聊的时候试用了IPython便爱不释手了。IPython是一个增强版的Python解释器。你完全可以把它就当作python的解释器来用--没有问题。但它的好处是内置了很多类似linux shell的特性。我觉得对我来说很实用的包括以下这些:
  • 比如可以在IPython里使用ls, pwd, mkdir这些命令而不用先import os 再来os.system("ls")
  • 对于那些没有内置的linux命令及工具,可以用!cmd 或者!!cmd 来调用。就如同在vi里调用外部命令一样
  • 可以用?modulename来查看一个module的用法和结构,相当于help(modulename)的简写了吧
  • 支持使用tab键来补全命令
  • 可以使用用%run filename args来load并执行一个外部py文件。就如同在shell里执行python filename args
  • 可以debug python脚本
以上这些是把IPython作为python解释器(默认的profile)的用法。实际上还可以更夸装一点: ipython -p pysh 来启动IPyhton。 这样默认相当于进入了一个Shell 从而不用!或者!!来调用命令。同时你还具有Python的那些模块和数据结构可以使用。比如你可以使用如下的程序来做找出当前目录下所有的.py文件并生成同名的文件夹(没有扩展名.py):
files=!ls
for f in files:
    if f.endswith('.py'):
        mkdir ${f[:-3]}

Monday, August 11, 2008

bibtex的crossref,以及winedt的自定义按钮

(1)问题: bib文件当中使用了 cross-refs 。比如所有的sigcomm2008的引用就被cross-ref到一个sigcomm2008的entry当中,这样就不用每个都分别输入address, year, booktitle了。但是带来一个小问题,如果实用超过1个这样的cross-ref,比如sigcomm2008和sigmetrics2008,那么第二个就会被单独编译成一个ref,比如[1] sigmetrics 2008, xxxxxx。

解决:bibtex 有一个选项-min-crossrefs 默认值为2。所以编译的时候可以加入选项把这个值调大,比如1000

(2)问题:winedt当中调用bibtex的时候如何打开上面所说的选项。

解决:
Options -> Execution Modes, Accessories 栏里, 选择Bibtex,然后command line里面的Switches里加上这个option : -min-crossrefs=1000。 实际上这里就是设定latex编译时的各个参数。另外可以改成Batch方式,这样就不是直接调用这些命令,而是使用 CTeX\WinEdt\Bin\TeX 这里的对应的批处理文件。从而可以进行更复杂的处理

(3)问题:winedt是一个很好的tex编辑器,可是生成了pdf文件以后(比如使用的是pdftex),默认的浏览方式是调用adobe acrobat, 灰常消耗资源. 想要换成调用foxit reader来打开生成的.pdf文件。

解决:
Options -> Menu Setup, 在main menu里面选择Items -> Accessories,双击。打开了Accessories菜单的定制面板。在&PDF 条目下添加&Foxit Reader。对应的Macro处填上,b\Exec\FoxitReader.edt'); 如右图所示。我还抓下了foxit reader自己的icon然后添加过来的。(考察WinEdt-Large.btn 和WinEdt.btn)
然后在 CTeX\WinEdt\Exec目录下创建 FoxitReader.edt。 我的这个文件很简单,就是:
Run('"Foxit Reader" %P\%N.pdf ','%P',0,0,'%N.pdf - FoxitReader',1,1);
End;
保存后,就可以从菜单中选择用foxit reader来打开了。这里我的foxit Reader已经添加到PATH当中了。如果不想添加,可以使用foxit reader的全路径。如果嫌麻烦还想创建工具栏按钮来打开。可以在工具栏上右键, 选择enter toolbar setup。然后拖拽按钮到工具栏上。就可以从工具栏上快速的启动foxit了

总结: WinEdt有着强大的自定义工具以及一套强大的宏。不过菜单和界面实在做的让人有点匪夷所思。常常不知道需要的功能在哪里。 比如Options菜单里,同时有setting,preference,setup 和configuration。实在能把人给绕晕了。

一霸阿,居然发现这里还有个很久以前的blog

呵呵,以后技术类的东西往这里贴了,
生活里的东西写在MSN Space里面 。

MSN Space对Firefox的支持太差了,
算是我放弃(partly)它的一个主要原因吧。

Saturday, September 04, 2004