2007年12月5日星期三

Windows脚本技术

Windows与Unix/Linux所不同的根本所在是设计目的,前者为非专业人士设计,图形界面(GUI)是根本;而后者则关注功能实现,命令行(Console)才是根本。所以在Unix/Linux上脚本编写是件很容易的事,但到了Windows上则成难事。其难有三:一则Windows中大部分软件都是基于GUI的,你很难用命令行将其“串联”起来;二则Windows中脚本多要涉及COM等概念,对于Windows的结构体系要有很多的了解方能“游刃有余”;三则MSDN中虽然有相关的脚本介绍,但比较分散,没有系统性,样例程序又很少,这给学习与使用带来很多问题。

我近日要解决一个问题,能自动将某个Zip包中的多个PDF文件解压后分解成页,筛选掉重复的页然后再合并成一个PDF。原以为在两日内就能完成的脚本程序,竟用了一周的时间。现在将其间的思考与经验进行总结:

1.在Windows中有四类脚本。

(1)命令行,就是Windows自带的一些命令,如for等,这些命令可以构成最简单的批处理,特别是For命令,使用得当会起到事半功倍的效果。比如要将某个文件夹中所有的.htm文件后缀名修改成.html,用rename *.htm *.html是不行的,可以用 for %i in (*.htm) do rename %i %il 来实现。如果要将for命令写入BAT文件,则应该为 for %%i in (*.htm) do rename %%i %%il 。

(2)WSH脚本,这是Windows中最常用的一类脚本,也是Windows平台内置的最强大的脚本系统。WSH,即Windows Script Host,其基于COM技术框架,可调用Windows平台内嵌的几个强大的COM对象,最常见的是“WScript.Shell”,“Scripting.FileSystemObject”,“ADODB.Connection”“ADODB.Command”,熟悉COM编程、ASP的人应该对此不陌生。其优点在于可以用VBS或JS等比较高级的语言来编程而不仅仅是命令行的累积。其缺点是调试很困难。
由于其与COM的内在联系紧密,所以有时人们会在BAT文件中临时创建一个VBS文件,然后调用该VBS文件以实现BAT所无法实现的功能,其基本结构如下:

@echo. >>sample.vbs ::创建一个sample.vbs文件,并写入一个空行
@echo WScript.Echo "Hello,WSH World">>sample.vbs ::这里将vbs中的代码写入文件中
.......
@echo. >>sample.vbs ::再写入个空行
@cscript //I //nologo sample.vbs ::调用该vbs脚本
@del sample.vbs ::删除该脚本

(3)基于动态语言环境,如Python,Ruby等。这样的动态语言一般都有与平台交互的对象库,通过动态语言来编写程序,易于调试与OOP化,复用性高,健壮性强,移植性好。但其要学习一门动态语言有些难度,而且对于一些临时性的简单工作也显得“大材小用”。如果要编写一些最常用且要不断修改的程序,基于动态语言是首选。

(4)一些特殊的自动化程序,如AutoIt,AHK(Auto Hot Key)等。这些软件其实就是一个解释器,可以将你编写的脚本进行解释运行。由于它们是完全面向Windows编写的,对于Windows的GUI支持的很好,而且有很强大的辅助编写脚本功能(如将鼠标动作录制成脚本等)这样就极大方便了GUI的自动化。所以如果面对许多GUI操作时,这类脚本当是最好选择。当然由于这些脚本语言具有一些特定性,在编写时仍需要熟悉其函数库;而且这些脚本是与Windows紧密相连的,其无法像动态语言脚本那样可以简单地移植到其它平台上。

2007年10月8日星期一

PDFTK的样例

PDFTK是一款PDF的命令行工具,其可以完成许多PDF合并、分割工作。
下面是我从网络上摘得的PDFTK的样例,翻译列表如下:

Merge Two or More PDFs into a New Document
将两个或多个PDF文件合并到一个文件中
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf

or (Using Handles):
或者采用句柄
pdftk A=1.pdf B=2.pdf cat A B output 12.pdf

or (Using Wildcards):
或者通配符
pdftk *.pdf cat output combined.pdf

Split Select Pages from Multiple PDFs into a New Document
在所选PDF文件中选择页面合并到新的文件中
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

Encrypt a PDF using 128-Bit Strength (the Default) and Withhold All Permissions (the Default)
用128位密码(默认值)加密PDF并封锁所有权限(默认值)
pdftk mydoc.pdf output mydoc.128.pdf owner_pw foopass

Same as Above, Except a Password is Required to Open the PDF
与上面相同,但不需要PDF文件打开密码
pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz

Same as Above, Except Printing is Allowed (after the PDF is Open)
与上面相同,但不允许打印(在PDF打开后)
pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz allow printing

Decrypt a PDF
解密PDF
pdftk secured.pdf input_pw foopass output unsecured.pdf

Join Two Files, One of Which is Encrypted (the Output is Not Encrypted)
合并两个文件,其中一个是加密的(输出文件不是加密的)
pdftk A=secured.pdf mydoc.pdf input_pw A=foopass cat output combined.pdf

Uncompress PDF Page Streams for Editing the PDF Code in a Text Editor
解压PDF页面流以便于在文本编辑器中编辑PDF代码
pdftk mydoc.pdf output mydoc.clear.pdf uncompress

Repair a PDF's Corrupted XREF Table and Stream Lengths (If Possible)
修理PDF损坏的XREF表格和流长度(如果可能的话)
pdftk broken.pdf output fixed.pdf

Burst a Single PDF Document into Single Pages and Report its Data to doc_data.txt
将单个PDF文件各页拆开,并将数据汇报到文本文件中
pdftk mydoc.pdf burst

Report on PDF Document Metadata, Bookmarks and Page Labels
将PDF文件的元数据、书签和页码标号输出到文本文件
pdftk mydoc.pdf dump_data output report.txt

2007年9月9日星期日

用Wink制作帮助教程

今天在善用佳软上看到一个小型的屏幕捕捉软件Wink,才2M大小,下载安装后试用一下的确不错。主要是其免费且生成Flash格式文件,很适合我这样的“懒于文笔”描述的人来使用。

2007年9月4日星期二

Latex-Suite 4步安装(根据官方稿翻译)

1.下载并解压缩文件
到 http://vim-latex.sourceforge.net/ 下载压缩包,并解压到你的~/vimfiles目录(Windows)或者~/.vim目录(*nix)中。如果你已经很久没有升级了,最好应先移除~/vimfiles/ftplugin/latex-suite目录再安装
注意:如果你已经安装一些Latex文件拓展,则应阅读 高级安装 以避免覆盖某些你既有文件。
2.在.vimrc配置中增加特定内容

" REQUIRED. This makes vim invoke Latex-Suite when you open a tex file.
filetype plugin on

" IMPORTANT: win32 users will need to have 'shellslash' set so that latex
" can be called correctly.
set shellslash

" IMPORTANT: grep will sometimes skip displaying the file name if you
" search in a singe file. This will confuse Latex-Suite. Set your grep
" program to alway generate a file-name.
set grepprg=grep\ -nH\ $*

" OPTIONAL: This enables automatic indentation as you type.
filetype indent on

3.安装帮助文件
要安装帮助到Vim中,应启动Vim并:
helptags ~/.vim/doc (*nix)或 helptags ../vimfiles/doc(windows)
4.完成!
安装完成,现在Latex-Suite可以自动启动,你可
:help latex-suite.txt 来阅读在线帮助

2007年9月2日星期日

用Python来分析《新东方背单词》的录入格式

我想使用《新东方背单词》来背一些自己浏览文章时遇到的生词。该软件提供了一个建立自己图书并从文本格式文件批量录入的功能,但在帮助中没有提供详细的格式说明。于是我用Python编写了一个简单程序来生成测试文本,找到其中规则。代码如下:


# Recite words
sl = []
sll = []
for i in range(26):
sl.append( chr( ord('a') + i ) )
for i in sl:
for j in sl:
sll.append( i + j )
f = open('recite.txt','w+')
f.write('w \n')
for i in sl :
if i <> 'w' :
f.write( '<' + i + '>' + i + '\n' )
f.close()
f = open('recite1.txt','w+')
f.write('ww \n')
for i in sll:
f.write('<' + i + '>' + i + '\n' )
f.close()



生成的文件录入《新东方背单词》后显示对应的格式,从而得到格式定义符如下:

w--单词
c--中文解释
e--英文解释
d--短语
p--音标
f--词频
k--考点
h--助记法
s--同义词
a--反义词
o--其它
ee--例句

《Seven Habits of Effective Text Editing 2.0》阅读笔记

1.这不是Vim操作入门,其没有介绍Vim的基本知识,而是集中于编辑器的使用方法,这些方法也可在其它编辑器中使用。
2.要充分认识到编辑器的作用,既不能漠视编辑器的功能而用“蛮力”来完成工作,但也不要面面俱到地学习编辑器所有功能。对于Vim和Emacs这样的骨灰级编辑器来说,完全学习是"Mission Impossible"。
3.建立一个良好的习惯很重要,但更重要地发现问题,并能用智慧地方式进行解决的勇气与耐心。我们往往会有很多好的提高效率的想法,但在工作或学习的压力下,常不能坚守,而白白失去提升的机会。所以本文中非常强调发现的过程,即发现问题与发现解决方案。
4.方案不要一步完美,这样的方案往往不存在(或在我们头顶的三万公尺上)。要有踏出第一步的勇气,先建立一个力所能及但又有所提高的方案,这样即能增强信心,又为进一步完善提供基础。在不断地完善中学习编辑器,用好编辑器。
5.查找与修正是编辑中最常用的功能。用好编辑器的试金石是检查自己是否能自如地利用编辑器功能来快速查找定位与修正。而正则表达式的知识是非常关键的。在Windows下成长的一代似乎没有Unix/Linux人们与生俱来的模式观念,而模式在正则表达式中是最基本的。要努力锻炼这样的思维,虽然起步比较吃力,但终身收益。
6.编辑器好似兵器,而运用编辑器的方法则是每个人的内功。如果内功不强,即是神兵利器在手也发挥不了作用;而如果内功强劲,那么简单的编辑器也能发挥大作用。努力改变自己的思维,发现、创新、提升、再发现是每日必修的内功。

2007年8月28日星期二

GNU Make学习(1)

1.Make是一个“古董级”的工具,其像橡树年轮,记录了近三十年计算机科学进步的痕迹。或许在学习Make中你会如考古般发现新奇的过往智慧,但更多的时候你将迷失于旧与新的迷雾之中,这也正是Make对于Windows平台下成长的一代程序员来说难懂的原因。但在每个IDE的F5或F9的背后,都能找到Make的身影。要进阶编程功力,当从了解Make开始。

2.Make是一个工具,它完成两个任务:一是建立一个多个文件的关系图,其用来描述文件间的依赖关系;二是检测文件的新旧,并按照关系图来进行命令执行以完成局部或整体的更新工作。所以在Make中存在两类语言,一为建立关系图,一为进行文本处理。

3.在学习Make前,应了解本机上的Make环境。在Windows系统中,由于安装BCB、VC2005等都会自带Make工具。而本文所用的Make是GNUMake 3.8,在Cygwin和DevCPP中都有。不同的Make对应不同的语法,故在BCB中由bpr文件导出的Make文件不能在GNUMake下编译。我就是犯了一次这样的错误。

4.Make中最简单的方式就是通过显性说明来建立关系图。对于小项目这还是很不错的方案,但对于大项目则不行。原因有三:一是重复声明过多,代码冗余,不利于维护;二是声明过细,移植性差;但最重要的是往往文件关系复杂到无法通过人脑来进行关系声明,这就必须用一种计算机辅助方式来进行关系推衍,这在Make中称为“Rule(规则)“。

5.Makefile难于阅读与调试的原因在于其自上而下的书写格式与”(关系图)自底而顶“的执行顺序往往是不一致的,也是人难于掌握的。所以Makefile采用Target(目标)与Rule(规则)这两种机制来分割问题。要注意的是这两种机制是双刃剑,其使用不当往往会造成Makefile的更晦涩难懂。

6.Phony Target用于结构化Makefile,将问题分割,并可优化用户界面。而其中的Empty Target则用来控制命令执行范围,避免非更新区域的反复执行。而对于大项目,制定一个Help Phony是常用技巧。但Phony Target也会破坏一些自然逻辑结构,从而给阅读带来一些障碍。要适当应用Phony Target,不要采用特殊技巧,在欺骗Make工具的同时也会欺骗阅读者,可能包含未来的你。

7.Rule则屏蔽了关系图的细节,让计算机来自动铺砌关键帧间的空隙。所以良好的Rule即能提高阅读性,又能提高执行效率。

8.Make诞生于Unix,其带有很强的*nix家族的色彩。比如其支持的通配符(WildCards)与Bourne Shell相同,包括~,*,?,[...]和[^...]。其有着古旧的键缩进惯例。

9.在Makefile中要注意变量展开、宏展开和函数展开的顺序。要充分理解Automatic Variables(自动变量)的作用;要用VPATH来指定被搜索文件的目录;要善于利用正则表达式来处理文本变量问题,特别是在gcc -M问题上。要小心地分割项目,善于利用eval函数来达到特定要求。

10.注意递归变量的声明与使用,这些变量与C中指针相似。

11.变量用$()来取值,摈弃过时的${}方式。

12.注意Command的Comment(前面有)与Makefile的Comment间的差异

13.正是有了简洁而强有力的函数支持,GnuMake具有很强的文本处理能力;而定义良好的自定义函数或宏,可提高Makefile的通用性和移植性。

14.inline函数是最常见的形式。

15.命令修改符 @-消音;- 消噪音(埋头工作) + 无论如何都要工作(即便是--just print模式)