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">



(待续)