<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>idv2</title>
	<atom:link href="http://tech.idv2.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tech.idv2.com</link>
	<description>关注Web开发技术，关注Internet。</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:54:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PostScript入门(2)-基础概念</title>
		<link>http://tech.idv2.com/2010/07/27/postscript-tutorial-2/</link>
		<comments>http://tech.idv2.com/2010/07/27/postscript-tutorial-2/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 12:53:49 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[编程开发]]></category>
		<category><![CDATA[postscript]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=811</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>上一章，我们简单介绍了PostScript语言，以及如何在Windows、Linux上
运行PostScript。PostScript是个页面描述语言，也是个编程语言。
本章将介绍PostScript的语言基础概念和图形基础概念，
为以后的几章做个铺垫。</p>
<!-- end Pukiwiki generated code--><span id="more-811"></span><!-- begin Pukiwiki generated code--><h2 id="content_2_0">语言基础概念</h2>
<p>从编程语言的角度来看，PostScript是十分简单的。PostScript是一种RPN，
即“逆波兰式”（Reverse Polish Notation），或称“后置记法”。
学过数据结构的人想必不陌生吧。简单来说就是<strong>操作数在前，操作符在后</strong>。
一般我们使用“中置记法”，比如 1 + 2，加号写在两个操作数1和2的中间；
但在PostScript中，要把加号放在最后，写成“1 2 add”。这是PostScript
的基础。</p>

<h3 id="content_2_1">栈</h3>
<p>后置记法最大的好处就是处理方便。学过编译原理的同学应该不会忘记
中置记法中的表达式歧义问题带来的痛苦吧（比如处理1+2*3，就必须用某种
方式告诉计算机是先计算1+2还是先计算2*3），但在后置记法中就不会有这个问题。
只需用一个栈，依次处理表达式中的符号，''遇到操作数就压栈，遇到操作符
就从栈顶弹出相应数量的操作数进行计算，并把计算结果压栈。''
例如，要计算(1+2)*(7-4)，用PostScript表示如下：</p>
<pre>1 2 add 7 4 sub mul ==</pre>
<p>末尾的“==”表示显示栈顶元素。这行代码可以直接在GhostScript的提示符下运行，
结果如下所示：</p>
<pre>GS&gt;1 2 add 7 4 sub mul ==
9</pre>
<p>下面来解释一下运行过程：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">处理的符号</td><td class="style_td">操作</td><td class="style_td">栈的内容(右边为栈顶)</td></tr><tr><td class="style_td">1</td><td class="style_td">压栈</td><td class="style_td">1</td></tr><tr><td class="style_td">2</td><td class="style_td">压栈</td><td class="style_td">1 2</td></tr><tr><td class="style_td">add</td><td class="style_td">栈顶两元素出栈，计算加法，计算结果压栈</td><td class="style_td">3</td></tr><tr><td class="style_td">7</td><td class="style_td">压栈</td><td class="style_td">3 7</td></tr><tr><td class="style_td">4</td><td class="style_td">压栈</td><td class="style_td">3 7 4</td></tr><tr><td class="style_td">sub</td><td class="style_td">栈顶两元素出战，计算减法，计算结果压栈</td><td class="style_td">3 3</td></tr><tr><td class="style_td">mul</td><td class="style_td">栈顶两元素出栈，计算乘法，计算结果压栈</td><td class="style_td">9</td></tr><tr><td class="style_td">==</td><td class="style_td">栈顶一元素出栈并显示</td><td class="style_td">&lt;空&gt;</td></tr></tbody></table></div>
<p>可见，这种方式完全不需要对表达式进行语法分析，所以PostScript解析器
可以做得相当简单。实际上，PostScript语言中的确有这样一个栈，
用于存放操作符和操作数并进行计算，称为“操作数栈”。</p>
<p>在GhostScript中，栈的大小会显示在操作数之后。例如，可以逐个地
输入上述表达式（PostScript语言中，空白和换行是没有意义的，
所以一条命令可以分成几行写，也可以写在同一行上，效果相同）：</p>
<pre>GS&gt;1
GS&lt;1&gt;2
GS&lt;2&gt;add
GS&lt;1&gt;7
GS&lt;2&gt;4
GS&lt;3&gt;sub
GS&lt;2&gt;</pre>
<p>“GS”后面的数字就是栈中的操作数个数。“pstack”命令可以查看栈的内容，
例如在上面 GS&lt;2&gt; 的状态下执行结果为：</p>
<pre>GS&lt;2&gt;pstack
3
3</pre>
<p>另外，这里的“操作数”和“操作符”的概念也可以理解为“参数”和“函数”，
计算后的结果可以认为是函数的“返回值”。</p>

<h3 id="content_2_2">数据类型</h3>
<p>PostScript中的数据类型有数字、字符串、数组和过程。</p>

<h4 id="content_2_3">数字</h4>
<p>PostScript支持整数和实数。整数部分为0的小数可以省略整数部分，如：</p>
<pre>.123          % 表示 0.123</pre>
<p>此外还有进制计数法和科学计数法。进制计数法写成“基数#值”，例如</p>
<pre>16#ff         % 表示16进制的0xff，即255
8#777         % 表示8进制的0777，即511
7#33          % 连7进制都可以使用
2#3           % 出错，因为2进制中没有3这个符号</pre>
<p>科学计数法写成“尾数E指数”，例如</p>
<pre>1E10          % 表示1e+10
1.234E-2      % 表示0.01234</pre>

<h4 id="content_2_4">字符串</h4>
<p>字符串用圆括号表示，例如</p>
<pre>(abcdefg)     % 表示字符串&quot;abcdefg&quot;
(a(b)c)       % 表示字符串&quot;a(b)c&quot;，圆括号内成对的圆括号失去特殊意义
(a\(bc)       % &quot;a(bc&quot;，单个圆括号需要转义
(a\nb)        % &quot;a&lt;换行&gt;b&quot;</pre>
<p>转义符的形式有：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">\t</td><td class="style_td">TAB符号</td></tr><tr><td class="style_td">\n</td><td class="style_td">换行(line feed)</td></tr><tr><td class="style_td">\r</td><td class="style_td">回车(carriage return)</td></tr><tr><td class="style_td">\f</td><td class="style_td">换页(form feed)</td></tr><tr><td class="style_td">\b</td><td class="style_td">退格</td></tr><tr><td class="style_td">\(</td><td class="style_td">左圆括号</td></tr><tr><td class="style_td">\)</td><td class="style_td">右圆括号</td></tr><tr><td class="style_td">\\</td><td class="style_td">反斜杠</td></tr><tr><td class="style_td">\ddd</td><td class="style_td">用八进制表示的字符</td></tr></tbody></table></div>
<p>注意转义符中没有十六进制表示（\xnn）。</p>
<p>此外，也可以直接在字符串中加入换行：</p>
<pre>GS&gt;(abcd
efg)
GS&lt;1&gt;pstack
(abcd\nefg)</pre>
<p>如果想在代码中让字符串换行，但并不想在字符串中加入换行，
可以在行尾使用 \ 符号：</p>
<pre>(This is a \
string \
that has no \
newlines)</pre>
<p>的值为</p>
<pre>(This is a string that has no newlines)</pre>
<p>字符串还可以用十六进制表示，只需将十六进制数写在尖括号中。例如：</p>
<pre>&lt;616263&gt;    % 表示&quot;abc&quot;
&lt;6d 6e 6f&gt;  % 表示&quot;mno&quot;，中间加入空格或换行不起作用</pre>

<h4 id="content_2_5">布尔值</h4>
<p>PostScript支持 true 和 false 两个布尔值。例如：</p>
<pre>GS&gt;true false
GS&lt;2&gt;pstack
false
true</pre>

<h4 id="content_2_6">数组</h4>
<p>数组是一系列操作数的排列，用方括号括起来。数组中的数据可以是任何类型，
甚至可以是另一个数组。</p>
<pre>[ 367 28.4 (abc) true ]    % 四个不同类型元素的数组
[ 1 2 add 7 4 sub ]        % 值为[3 3]。数组中甚至可以做运算，数组值为运算结果
[ 21 [ 53 74 ] [ 60 [ 53 48 ] 99 ] 18 ]    % 可以任意嵌套
[ ]                        % 空数组</pre>

<h4 id="content_2_7">过程</h4>
<p>过程是一系列操作符和操作数的排列，放在大括号中，用于自定义操作符。
例如：</p>
<pre>{ dup mul }                % 计算平方。dup表示复制栈顶元素，mul表示栈顶两元素相乘</pre>
<p>实际应用中需要使用def操作符将过程定义到名字(见下文)上，如：</p>
<pre>GS&gt;/square { dup mul } def   % 定义 square 为 { dup mul }
GS&gt;3 square ==               % 调用 square
9</pre>

<h4 id="content_2_8">字典</h4>
<p>字典是一系列成对的名字和值，相当于Perl语言中的哈希表，或者Java中的HashMap。</p>

<h3 id="content_2_9">名字</h3>
<p><strong>名字</strong>是任何不是数字的符号，相当于一般编程语言中的标识符。
名字可以由除了空格和特定保留字符（(、)、[、]、&lt;、&gt;、{、}、/和%）以外的
任意字符组成，例如abc、$def、ghi-jkl都是有效的名字。
名字甚至可以以数字开头，例如 1Z 是有效的名字，但这种习惯有时会遇到问题
（如 1E10 是个实数）。</p>
<p>通常，名字出现时会被当作操作符，PostScript会去“调用”该名字对应的过程。
那么怎样给名字定义“过程”呢？这就需要使用“字面意义的名字”（literal name）
和 def 操作符。在名字前面加上 / 符号，可以告诉PostScript，我们要定义这个名字了，
别把它当作操作符，当作操作数压进栈里就行了。def 操作符则从栈顶弹出两个元素，
并把第二个元素（字面意义的名字）定义为第一个元素（过程）。例如：</p>
<pre>/square { dup mul } def     % 定义 square 为 { dup mul }
3 square                    % 调用 square，相当于 3 dup mul</pre>
<p>这里还要说明一下，所谓“调用”并不是像C语言那样跳转到函数定义的位置去执行。
PostScript中的过程实质上是一系列的操作符和操作数，在“调用”
一个名字时，PostScript简单地用该名字对应的那个过程来替换该名字，
然后依次执行。例如上面的 3 square，PostScript在遇到 square时，
从以前的定义中找到 square 相当于 { dup mul }，于是将 square “展开”
成 dup mul，再依次执行，其效果跟直接写 3 dup mul 是相同的。</p>

<h3 id="content_2_10">注释</h3>
<p>PostScript中使用 % 符号表示注释，% 之后的内容会被忽略。</p>

<h2 id="content_2_11">图形基础概念</h2>
<p>作为页面描述语言，PostScript的主要功能就是绘图和显示文字，那么有几个
图形方面的基础概念是必须要了解的。</p>

<h3 id="content_2_12">用户空间</h3>
<p>用户空间是PostScript用于表达点和线的位置的坐标系。它的原点(0, 0)位于左下角，
x轴向右，y轴向上，相当于数学中的第一象限。</p>
<p>用户空间的默认单位是<strong>点</strong>（point）。一个point相当于1/72英寸，
这个值比真正打印机上的point（等于1/72.27英寸）稍稍短一些。</p>
<p>实际应用中，可以作以下定义，以便在PostScript程序中使用英寸、毫米等比较直观的单位。</p>
<pre>/mm { 2.834646 mul } def       % 毫米
/inch { 72 mul } def           % 英寸
1 inch 20 mm moveto            % 应用例</pre>

<h3 id="content_2_13">路径</h3>
<p>路径是页面上一系列直线和曲线的组合。它并不是可见的线条，只是假想的一条路径而已。
通过 stroke 和 fill 操作符可以描边或填充路径（用过Photoshop就能理解），使之可见。</p>

<h3 id="content_2_14">图形状态</h3>
<p>图形有许多状态（如当前颜色、当前路径、线的粗细、坐标系等）。
程序有时需要临时改变图形状态，此时应该将当前的图形状态保存到<strong>图形状态栈</strong>（graphics state stack）中，
画完之后再恢复状态。保存和恢复可以通过gsave和grestore操作符来实现。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>上一章，我们简单介绍了PostScript语言，以及如何在Windows、Linux上
运行PostScript。PostScript是个页面描述语言，也是个编程语言。
本章将介绍PostScript的语言基础概念和图形基础概念，
为以后的几章做个铺垫。</p>
<!-- end Pukiwiki generated code--><span id="more-811"></span><!-- begin Pukiwiki generated code--><h2 id="content_4_0">语言基础概念</h2>
<p>从编程语言的角度来看，PostScript是十分简单的。PostScript是一种RPN，
即“逆波兰式”（Reverse Polish Notation），或称“后置记法”。
学过数据结构的人想必不陌生吧。简单来说就是<strong>操作数在前，操作符在后</strong>。
一般我们使用“中置记法”，比如 1 + 2，加号写在两个操作数1和2的中间；
但在PostScript中，要把加号放在最后，写成“1 2 add”。这是PostScript
的基础。</p>

<h3 id="content_4_1">栈</h3>
<p>后置记法最大的好处就是处理方便。学过编译原理的同学应该不会忘记
中置记法中的表达式歧义问题带来的痛苦吧（比如处理1+2*3，就必须用某种
方式告诉计算机是先计算1+2还是先计算2*3），但在后置记法中就不会有这个问题。
只需用一个栈，依次处理表达式中的符号，''遇到操作数就压栈，遇到操作符
就从栈顶弹出相应数量的操作数进行计算，并把计算结果压栈。''
例如，要计算(1+2)*(7-4)，用PostScript表示如下：</p>
<pre>1 2 add 7 4 sub mul ==</pre>
<p>末尾的“==”表示显示栈顶元素。这行代码可以直接在GhostScript的提示符下运行，
结果如下所示：</p>
<pre>GS&gt;1 2 add 7 4 sub mul ==
9</pre>
<p>下面来解释一下运行过程：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">处理的符号</td><td class="style_td">操作</td><td class="style_td">栈的内容(右边为栈顶)</td></tr><tr><td class="style_td">1</td><td class="style_td">压栈</td><td class="style_td">1</td></tr><tr><td class="style_td">2</td><td class="style_td">压栈</td><td class="style_td">1 2</td></tr><tr><td class="style_td">add</td><td class="style_td">栈顶两元素出栈，计算加法，计算结果压栈</td><td class="style_td">3</td></tr><tr><td class="style_td">7</td><td class="style_td">压栈</td><td class="style_td">3 7</td></tr><tr><td class="style_td">4</td><td class="style_td">压栈</td><td class="style_td">3 7 4</td></tr><tr><td class="style_td">sub</td><td class="style_td">栈顶两元素出战，计算减法，计算结果压栈</td><td class="style_td">3 3</td></tr><tr><td class="style_td">mul</td><td class="style_td">栈顶两元素出栈，计算乘法，计算结果压栈</td><td class="style_td">9</td></tr><tr><td class="style_td">==</td><td class="style_td">栈顶一元素出栈并显示</td><td class="style_td">&lt;空&gt;</td></tr></tbody></table></div>
<p>可见，这种方式完全不需要对表达式进行语法分析，所以PostScript解析器
可以做得相当简单。实际上，PostScript语言中的确有这样一个栈，
用于存放操作符和操作数并进行计算，称为“操作数栈”。</p>
<p>在GhostScript中，栈的大小会显示在操作数之后。例如，可以逐个地
输入上述表达式（PostScript语言中，空白和换行是没有意义的，
所以一条命令可以分成几行写，也可以写在同一行上，效果相同）：</p>
<pre>GS&gt;1
GS&lt;1&gt;2
GS&lt;2&gt;add
GS&lt;1&gt;7
GS&lt;2&gt;4
GS&lt;3&gt;sub
GS&lt;2&gt;</pre>
<p>“GS”后面的数字就是栈中的操作数个数。“pstack”命令可以查看栈的内容，
例如在上面 GS&lt;2&gt; 的状态下执行结果为：</p>
<pre>GS&lt;2&gt;pstack
3
3</pre>
<p>另外，这里的“操作数”和“操作符”的概念也可以理解为“参数”和“函数”，
计算后的结果可以认为是函数的“返回值”。</p>

<h3 id="content_4_2">数据类型</h3>
<p>PostScript中的数据类型有数字、字符串、数组和过程。</p>

<h4 id="content_4_3">数字</h4>
<p>PostScript支持整数和实数。整数部分为0的小数可以省略整数部分，如：</p>
<pre>.123          % 表示 0.123</pre>
<p>此外还有进制计数法和科学计数法。进制计数法写成“基数#值”，例如</p>
<pre>16#ff         % 表示16进制的0xff，即255
8#777         % 表示8进制的0777，即511
7#33          % 连7进制都可以使用
2#3           % 出错，因为2进制中没有3这个符号</pre>
<p>科学计数法写成“尾数E指数”，例如</p>
<pre>1E10          % 表示1e+10
1.234E-2      % 表示0.01234</pre>

<h4 id="content_4_4">字符串</h4>
<p>字符串用圆括号表示，例如</p>
<pre>(abcdefg)     % 表示字符串&quot;abcdefg&quot;
(a(b)c)       % 表示字符串&quot;a(b)c&quot;，圆括号内成对的圆括号失去特殊意义
(a\(bc)       % &quot;a(bc&quot;，单个圆括号需要转义
(a\nb)        % &quot;a&lt;换行&gt;b&quot;</pre>
<p>转义符的形式有：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">\t</td><td class="style_td">TAB符号</td></tr><tr><td class="style_td">\n</td><td class="style_td">换行(line feed)</td></tr><tr><td class="style_td">\r</td><td class="style_td">回车(carriage return)</td></tr><tr><td class="style_td">\f</td><td class="style_td">换页(form feed)</td></tr><tr><td class="style_td">\b</td><td class="style_td">退格</td></tr><tr><td class="style_td">\(</td><td class="style_td">左圆括号</td></tr><tr><td class="style_td">\)</td><td class="style_td">右圆括号</td></tr><tr><td class="style_td">\\</td><td class="style_td">反斜杠</td></tr><tr><td class="style_td">\ddd</td><td class="style_td">用八进制表示的字符</td></tr></tbody></table></div>
<p>注意转义符中没有十六进制表示（\xnn）。</p>
<p>此外，也可以直接在字符串中加入换行：</p>
<pre>GS&gt;(abcd
efg)
GS&lt;1&gt;pstack
(abcd\nefg)</pre>
<p>如果想在代码中让字符串换行，但并不想在字符串中加入换行，
可以在行尾使用 \ 符号：</p>
<pre>(This is a \
string \
that has no \
newlines)</pre>
<p>的值为</p>
<pre>(This is a string that has no newlines)</pre>
<p>字符串还可以用十六进制表示，只需将十六进制数写在尖括号中。例如：</p>
<pre>&lt;616263&gt;    % 表示&quot;abc&quot;
&lt;6d 6e 6f&gt;  % 表示&quot;mno&quot;，中间加入空格或换行不起作用</pre>

<h4 id="content_4_5">布尔值</h4>
<p>PostScript支持 true 和 false 两个布尔值。例如：</p>
<pre>GS&gt;true false
GS&lt;2&gt;pstack
false
true</pre>

<h4 id="content_4_6">数组</h4>
<p>数组是一系列操作数的排列，用方括号括起来。数组中的数据可以是任何类型，
甚至可以是另一个数组。</p>
<pre>[ 367 28.4 (abc) true ]    % 四个不同类型元素的数组
[ 1 2 add 7 4 sub ]        % 值为[3 3]。数组中甚至可以做运算，数组值为运算结果
[ 21 [ 53 74 ] [ 60 [ 53 48 ] 99 ] 18 ]    % 可以任意嵌套
[ ]                        % 空数组</pre>

<h4 id="content_4_7">过程</h4>
<p>过程是一系列操作符和操作数的排列，放在大括号中，用于自定义操作符。
例如：</p>
<pre>{ dup mul }                % 计算平方。dup表示复制栈顶元素，mul表示栈顶两元素相乘</pre>
<p>实际应用中需要使用def操作符将过程定义到名字(见下文)上，如：</p>
<pre>GS&gt;/square { dup mul } def   % 定义 square 为 { dup mul }
GS&gt;3 square ==               % 调用 square
9</pre>

<h4 id="content_4_8">字典</h4>
<p>字典是一系列成对的名字和值，相当于Perl语言中的哈希表，或者Java中的HashMap。</p>

<h3 id="content_4_9">名字</h3>
<p><strong>名字</strong>是任何不是数字的符号，相当于一般编程语言中的标识符。
名字可以由除了空格和特定保留字符（(、)、[、]、&lt;、&gt;、{、}、/和%）以外的
任意字符组成，例如abc、$def、ghi-jkl都是有效的名字。
名字甚至可以以数字开头，例如 1Z 是有效的名字，但这种习惯有时会遇到问题
（如 1E10 是个实数）。</p>
<p>通常，名字出现时会被当作操作符，PostScript会去“调用”该名字对应的过程。
那么怎样给名字定义“过程”呢？这就需要使用“字面意义的名字”（literal name）
和 def 操作符。在名字前面加上 / 符号，可以告诉PostScript，我们要定义这个名字了，
别把它当作操作符，当作操作数压进栈里就行了。def 操作符则从栈顶弹出两个元素，
并把第二个元素（字面意义的名字）定义为第一个元素（过程）。例如：</p>
<pre>/square { dup mul } def     % 定义 square 为 { dup mul }
3 square                    % 调用 square，相当于 3 dup mul</pre>
<p>这里还要说明一下，所谓“调用”并不是像C语言那样跳转到函数定义的位置去执行。
PostScript中的过程实质上是一系列的操作符和操作数，在“调用”
一个名字时，PostScript简单地用该名字对应的那个过程来替换该名字，
然后依次执行。例如上面的 3 square，PostScript在遇到 square时，
从以前的定义中找到 square 相当于 { dup mul }，于是将 square “展开”
成 dup mul，再依次执行，其效果跟直接写 3 dup mul 是相同的。</p>

<h3 id="content_4_10">注释</h3>
<p>PostScript中使用 % 符号表示注释，% 之后的内容会被忽略。</p>

<h2 id="content_4_11">图形基础概念</h2>
<p>作为页面描述语言，PostScript的主要功能就是绘图和显示文字，那么有几个
图形方面的基础概念是必须要了解的。</p>

<h3 id="content_4_12">用户空间</h3>
<p>用户空间是PostScript用于表达点和线的位置的坐标系。它的原点(0, 0)位于左下角，
x轴向右，y轴向上，相当于数学中的第一象限。</p>
<p>用户空间的默认单位是<strong>点</strong>（point）。一个point相当于1/72英寸，
这个值比真正打印机上的point（等于1/72.27英寸）稍稍短一些。</p>
<p>实际应用中，可以作以下定义，以便在PostScript程序中使用英寸、毫米等比较直观的单位。</p>
<pre>/mm { 2.834646 mul } def       % 毫米
/inch { 72 mul } def           % 英寸
1 inch 20 mm moveto            % 应用例</pre>

<h3 id="content_4_13">路径</h3>
<p>路径是页面上一系列直线和曲线的组合。它并不是可见的线条，只是假想的一条路径而已。
通过 stroke 和 fill 操作符可以描边或填充路径（用过Photoshop就能理解），使之可见。</p>

<h3 id="content_4_14">图形状态</h3>
<p>图形有许多状态（如当前颜色、当前路径、线的粗细、坐标系等）。
程序有时需要临时改变图形状态，此时应该将当前的图形状态保存到<strong>图形状态栈</strong>（graphics state stack）中，
画完之后再恢复状态。保存和恢复可以通过gsave和grestore操作符来实现。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/07/27/postscript-tutorial-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PostScript入门(1)-基本知识</title>
		<link>http://tech.idv2.com/2010/07/25/postscript-tuturial-1/</link>
		<comments>http://tech.idv2.com/2010/07/25/postscript-tuturial-1/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 01:22:36 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[编程开发]]></category>
		<category><![CDATA[postscript]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=807</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>最近由于项目需要，一直在研究PostScript语言。由于这个语言通常用在打印机上，
一般用户接触不到，因此网上的资料也十分罕见。所以，我想把这段时间的心得
整理成一篇入门文章，与大家分享，希望能对想研究打印机的朋友们有所帮助。</p>
<p>这篇文章计划分成七个部分，分别是：</p>
<ol class="list1" style="padding-left:16px;margin-left:16px"><li>基本知识(本篇)</li>
<li><a href="http://tech.idv2.com/2010/07/27/postscript-tutorial-2/">基础概念</a></li>
<li>绘图(未完成)</li>
<li>使用颜色(未完成)</li>
<li>绘制位图(未完成)</li>
<li>文本与字体(未完成)</li></ol>
<!-- end Pukiwiki generated code--><span id="more-807"></span><!-- begin Pukiwiki generated code--><h2 id="content_6_0">什么是PostScript？</h2>
<p>简单地说，PostScript是一种页面描述语言(Page Description Language)。
它由Adobe公司于1985年开发，最初应用在Apple LaserWriter打印机上。
PostScript是设备无关的，也就是说，PostScript文件中不包含任何与设备
相关的信息（如打印机的分辨率），因此PostScript文件可以在任何支持
PostScript的打印机上使用，而无需做任何修改。</p>
<p>看到“页面描述语言”这个词，可能会联想到HTML等网页标记语言。没错，
PostScript的主要作用就是记载需要打印出的各种文字和图形，但它还是
一种简单的编程语言，支持分支、循环等控制结构，以及数组、字典等简单
的数据结构。</p>
<p>例如，下面是个最简单的PostScript文件(square.ps)，它在页面上画一个正方形：</p>
<pre>%!PS-Adobe-3.0
newpath
100 600 moveto
200 600 lineto
200 700 lineto
100 700 lineto
closepath
stroke
showpage</pre>

<h2 id="content_6_1">如何运行PostScript？</h2>
<p>查看PostScript文件需要使用PostScript解释器。最常见的解释器就是
<a href="http://www.ghostscript.com/">GhostScript</a>。Windows版只需下载
gs871w32.exe安装即可。Linux下一般都包含在发行版中，使用相应的
管理程序自动安装即可，例如Ubuntu下可以这样安装：</p>
<pre>$ sudo apt-get install ghostscript</pre>
<p>安装完成后即可从开始菜单中启动GhostScript（Linux下直接使用 gs 命令启动）。
启动后出现提示符：</p>
<pre>GS&gt;</pre>
<p>随后，可以直接在提示符下输入命令，也可以先把命令写成*.ps文件，
再用GhostScript运行。例如上一节给出的square.ps文件，在Windows下
可以直接将它拖到打开的GhostScript窗口中，即可看到生成的图形。</p>
<p>此外，GhostScripth还提供了PostScript格式与其他格式之间的转换命令，
例如ps2pdf、pdf2ps等。Linux下这些命令一般位于/usr/bin，Windows下则位于
安装目录的 lib 下（建议把安装目录下的bin和lib两个目录加到PATH环境变量中）。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>最近由于项目需要，一直在研究PostScript语言。由于这个语言通常用在打印机上，
一般用户接触不到，因此网上的资料也十分罕见。所以，我想把这段时间的心得
整理成一篇入门文章，与大家分享，希望能对想研究打印机的朋友们有所帮助。</p>
<p>这篇文章计划分成七个部分，分别是：</p>
<ol class="list1" style="padding-left:16px;margin-left:16px"><li>基本知识(本篇)</li>
<li><a href="http://tech.idv2.com/2010/07/27/postscript-tutorial-2/">基础概念</a></li>
<li>绘图(未完成)</li>
<li>使用颜色(未完成)</li>
<li>绘制位图(未完成)</li>
<li>文本与字体(未完成)</li></ol>
<!-- end Pukiwiki generated code--><span id="more-807"></span><!-- begin Pukiwiki generated code--><h2 id="content_8_0">什么是PostScript？</h2>
<p>简单地说，PostScript是一种页面描述语言(Page Description Language)。
它由Adobe公司于1985年开发，最初应用在Apple LaserWriter打印机上。
PostScript是设备无关的，也就是说，PostScript文件中不包含任何与设备
相关的信息（如打印机的分辨率），因此PostScript文件可以在任何支持
PostScript的打印机上使用，而无需做任何修改。</p>
<p>看到“页面描述语言”这个词，可能会联想到HTML等网页标记语言。没错，
PostScript的主要作用就是记载需要打印出的各种文字和图形，但它还是
一种简单的编程语言，支持分支、循环等控制结构，以及数组、字典等简单
的数据结构。</p>
<p>例如，下面是个最简单的PostScript文件(square.ps)，它在页面上画一个正方形：</p>
<pre>%!PS-Adobe-3.0
newpath
100 600 moveto
200 600 lineto
200 700 lineto
100 700 lineto
closepath
stroke
showpage</pre>

<h2 id="content_8_1">如何运行PostScript？</h2>
<p>查看PostScript文件需要使用PostScript解释器。最常见的解释器就是
<a href="http://www.ghostscript.com/">GhostScript</a>。Windows版只需下载
gs871w32.exe安装即可。Linux下一般都包含在发行版中，使用相应的
管理程序自动安装即可，例如Ubuntu下可以这样安装：</p>
<pre>$ sudo apt-get install ghostscript</pre>
<p>安装完成后即可从开始菜单中启动GhostScript（Linux下直接使用 gs 命令启动）。
启动后出现提示符：</p>
<pre>GS&gt;</pre>
<p>随后，可以直接在提示符下输入命令，也可以先把命令写成*.ps文件，
再用GhostScript运行。例如上一节给出的square.ps文件，在Windows下
可以直接将它拖到打开的GhostScript窗口中，即可看到生成的图形。</p>
<p>此外，GhostScripth还提供了PostScript格式与其他格式之间的转换命令，
例如ps2pdf、pdf2ps等。Linux下这些命令一般位于/usr/bin，Windows下则位于
安装目录的 lib 下（建议把安装目录下的bin和lib两个目录加到PATH环境变量中）。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/07/25/postscript-tuturial-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Server 10.04 + RoR安装memo</title>
		<link>http://tech.idv2.com/2010/07/24/ubuntu-server-ror-install-memo/</link>
		<comments>http://tech.idv2.com/2010/07/24/ubuntu-server-ror-install-memo/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 10:15:28 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=803</guid>
		<description><![CDATA[Ubuntu Server 10.04 + RoR安装memo<!-- begin Pukiwiki generated code--><p>首先下载Ubuntu Server 10.04的光盘镜像，不到700M。然后安装。
服务安装只选了LAMP Server。</p>
<p>安装后的第一件事就是配置sshd-server。Ubuntu Server默认没有装sshd-server，
所以需要手动安装。</p>
<pre>$ sudo apt-get install openssh-server</pre>
<p>修改IP地址为固定IP。</p>
<pre>$ sudo vi /etc/network/interfaces
...(上面省略)...
auto eth0
iface eth0 inet static
address 192.168.0.10
gateway 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255

$ sudo vi /etc/resolv.conf
nameserver 192.168.0.1

$ sudo /etc/init.d/networking  restart</pre>
<p>这样就可以用putty连接了。</p>
<p>接下来安装webmin，方便管理。去<a href="http://www.webmin.com/">webmin主页</a>下载deb包，1.510版本是13.83MB。</p>
<pre>$ sudo dpkg -i webmin_1.510-2_all.deb</pre>
<p>会提示缺包，执行以下命令：</p>
<pre>$ sudo apt-get -f install</pre>
<p>安装mod_python：</p>
<pre>$ sudo apt-get install libapache2-mod-python</pre>
<!-- end Pukiwiki generated code--><span id="more-803"></span><!-- begin Pukiwiki generated code--><p>安装ruby和RoR：</p>
<pre>$ sudo apt-get install ruby
$ sudo apt-get install rubygems
$ sudo apt-get install rails</pre>
<p>有人建议用 sudo gem install rails，但我在虚拟机上跑了一个小时一点动静也没有，只好回归apt-get了。</p>
<p>装好rails后试着建个小工程试试看：</p>
<pre>$ rails demo
$ cd demo
$ ruby script/server -b 0.0.0.0</pre>
<p>结果发现浏览器访问 <a href="http://192.168.0.10:3000">http://192.168.0.10:3000</a> 时，第一次访问能出现正常的RoR画面，第二次就会报
Internal Server Error，报告“private method `gsub!' called for #&lt;Class:0x7f2a674b0b98&gt; ”的错误。
查了一下，不用默认的WEBrick服务器而改成mongrel就能解决这个问题：</p>
<pre>$ sudo apt-get install mongrel</pre>
<p>安装mongrel之后，按照原来的方式启动RoR服务器即可。</p>
<pre>$ ruby script/server -b 0.0.0.0</pre>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[Ubuntu Server 10.04 + RoR安装memo<!-- begin Pukiwiki generated code--><p>首先下载Ubuntu Server 10.04的光盘镜像，不到700M。然后安装。
服务安装只选了LAMP Server。</p>
<p>安装后的第一件事就是配置sshd-server。Ubuntu Server默认没有装sshd-server，
所以需要手动安装。</p>
<pre>$ sudo apt-get install openssh-server</pre>
<p>修改IP地址为固定IP。</p>
<pre>$ sudo vi /etc/network/interfaces
...(上面省略)...
auto eth0
iface eth0 inet static
address 192.168.0.10
gateway 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255

$ sudo vi /etc/resolv.conf
nameserver 192.168.0.1

$ sudo /etc/init.d/networking  restart</pre>
<p>这样就可以用putty连接了。</p>
<p>接下来安装webmin，方便管理。去<a href="http://www.webmin.com/">webmin主页</a>下载deb包，1.510版本是13.83MB。</p>
<pre>$ sudo dpkg -i webmin_1.510-2_all.deb</pre>
<p>会提示缺包，执行以下命令：</p>
<pre>$ sudo apt-get -f install</pre>
<p>安装mod_python：</p>
<pre>$ sudo apt-get install libapache2-mod-python</pre>
<!-- end Pukiwiki generated code--><span id="more-803"></span><!-- begin Pukiwiki generated code--><p>安装ruby和RoR：</p>
<pre>$ sudo apt-get install ruby
$ sudo apt-get install rubygems
$ sudo apt-get install rails</pre>
<p>有人建议用 sudo gem install rails，但我在虚拟机上跑了一个小时一点动静也没有，只好回归apt-get了。</p>
<p>装好rails后试着建个小工程试试看：</p>
<pre>$ rails demo
$ cd demo
$ ruby script/server -b 0.0.0.0</pre>
<p>结果发现浏览器访问 <a href="http://192.168.0.10:3000">http://192.168.0.10:3000</a> 时，第一次访问能出现正常的RoR画面，第二次就会报
Internal Server Error，报告“private method `gsub!' called for #&lt;Class:0x7f2a674b0b98&gt; ”的错误。
查了一下，不用默认的WEBrick服务器而改成mongrel就能解决这个问题：</p>
<pre>$ sudo apt-get install mongrel</pre>
<p>安装mongrel之后，按照原来的方式启动RoR服务器即可。</p>
<pre>$ ruby script/server -b 0.0.0.0</pre>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/07/24/ubuntu-server-ror-install-memo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[AHK]Scratch Pad：简单的便笺脚本</title>
		<link>http://tech.idv2.com/2010/07/15/ahk-scratch-pad/</link>
		<comments>http://tech.idv2.com/2010/07/15/ahk-scratch-pad/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 02:55:56 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[ahk]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=797</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>以前我非常喜欢IpMsg这款著名的局域网IM软件。不过除了IM之外，我更喜欢用它作为快捷便笺使用——想记录电话号码，或是记录idea，或是给一小段文字排版时，可以随手用Ctrl-Alt-S调出，用完后直接关闭。但后来公司禁止了该软件。没办法，只好用AutoHotKey写一段脚本来实现这个功能了。</p>
<p>代码相当简单，就不再解释了。默认的呼叫和隐藏热键都是Ctrl-Alt-S。</p>
<pre>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; scratch pad
^!s::
IfWinActive, Scratch Pad
{
    Gui, Hide
}
Else
{
    If scrachPadCreated &lt;&gt; 1
    {
        Gui, +AlwaysOnTop -MinimizeBox -MaximizeBox
        Gui, Margin, 0, 0
        Gui, Font, s11, ＭＳ ゴシック
        Gui, Add, Edit, W400 H300
        scrachPadCreated := 1
    }
    Gui, Show, , Scratch Pad
}</pre>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>以前我非常喜欢IpMsg这款著名的局域网IM软件。不过除了IM之外，我更喜欢用它作为快捷便笺使用——想记录电话号码，或是记录idea，或是给一小段文字排版时，可以随手用Ctrl-Alt-S调出，用完后直接关闭。但后来公司禁止了该软件。没办法，只好用AutoHotKey写一段脚本来实现这个功能了。</p>
<p>代码相当简单，就不再解释了。默认的呼叫和隐藏热键都是Ctrl-Alt-S。</p>
<pre>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; scratch pad
^!s::
IfWinActive, Scratch Pad
{
    Gui, Hide
}
Else
{
    If scrachPadCreated &lt;&gt; 1
    {
        Gui, +AlwaysOnTop -MinimizeBox -MaximizeBox
        Gui, Margin, 0, 0
        Gui, Font, s11, ＭＳ ゴシック
        Gui, Add, Edit, W400 H300
        scrachPadCreated := 1
    }
    Gui, Show, , Scratch Pad
}</pre>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/07/15/ahk-scratch-pad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用CloneZilla制作紧急恢复分区</title>
		<link>http://tech.idv2.com/2010/07/09/clonezilla-eb/</link>
		<comments>http://tech.idv2.com/2010/07/09/clonezilla-eb/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 16:58:33 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[clonezilla]]></category>
		<category><![CDATA[ebd]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=761</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>关于一键恢复，网上有很多<a href="http://bbs.wuyou.com/forumdisplay.php?fid=34">讨论</a>，也有很多<a href="http://www.yjhy.net/xzdz.htm">成品</a>，
不过大多数都是基于Ghost实现的，而Ghost是个商业软件，喜欢用开源的人可能比较难于接受吧。
此外，这种一键恢复虽然很容易使用，但可定制性也比较差。所以我考虑使用<a href="http://clonezilla.org/">CloneZilla</a>
来制作一个紧急恢复分区，用来备份/还原系统。</p>
<p>为什么用CloneZilla呢？理由如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>它是开源软件。</li>
<li>备份形式灵活，可以选择备份分区或整个硬盘，可以选择备份到本地硬盘，也可以备份到网络。</li>
<li>自带的Linux系统可以用作系统维护。</li></ul>
<p>CloneZilla的使用方法就不多说了，自带的<a href="http://clonezilla.nchc.org.tw/">中文文档</a>中有极其详尽的截图说明。
另外，制作紧急恢复分区，只有CloneZilla是不够的，还得要<a href="https://gna.org">grub4dos</a>的帮助。</p>
<p>我的操作系统是Windows XP，硬盘分区默认都是NTFS。下面开始动手吧。</p>
<!-- end Pukiwiki generated code--><span id="more-761"></span><!-- begin Pukiwiki generated code--><h2 id="content_16_0">准备分区</h2>
<p>我的C盘容量是40G，常驻的文件大约有10～20G左右，长时间使用之后可能会增长到30G。
考虑到备份后的镜像能被压缩到50%左右，所以一次备份大约需要5～10G的硬盘。
所以我留出30G的空间用作备份。</p>
<p>首先整理磁盘碎片，然后用Partition Magic等工具在硬盘末尾划分出一个30G的空间。
最好是用主分区（原因是，Linux和grub对主分区的编号方式要比逻辑盘简单些），
然后将其格式化成FAT32，并分配一个驱动器符号（假设为J:）。
这就是以后的紧急恢复分区。</p>

<h2 id="content_16_1">安装CloneZilla</h2>
<p>在 J: 盘下建立以下几个目录：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>clonezilla：CloneZilla主目录</li>
<li>grub4dos：grub4dos主目录</li>
<li>iso：其他系统维护盘镜像的目录</li>
<li>images：C盘镜像备份的目录</li></ul>
<p>然后把CloneZilla Live光盘中的 live 目录下的内容完全复制到 J:\clonezilla 下。</p>

<h2 id="content_16_2">安装grub4dos</h2>
<p>grub4dos支持NTLDR启动，所以其实只需要两个文件：grldr和menu.lst。但为了以后作业方便，
我还是把整个grub4dos文件都放到了 J:\grub4dos 下。</p>
<p>然后设置NTLDR启动：复制 J:\grub4dos 下的 grldr 和 menu.lst 两个文件到 C: 盘根目录。
然后编辑 C:\boot.ini ，加入以下内容：</p>
<pre>C:\GRLDR=&quot;Start GRUB&quot;</pre>
<p>重新启动计算机，按F8出现Windows XP的启动菜单，然后选择“Start GRUB”，能出现GRUB的启动菜单就OK。</p>

<h2 id="content_16_3">设置grub4dos启动CloneZilla</h2>
<p>回到Windows下编辑menu.lst。默认的menu.lst中有许多没用的菜单项，我只保留了最初加载NTLDR和CMLDR的两项。
然后加入启动CloneZilla的菜单项：</p>
<pre>title Clonezilla live on harddrive
root (hd0,2)
kernel /clonezilla/vmlinuz1 boot=live union=aufs vga=788 ip=frommedia live-media-path=/clonezilla bootfrom=/dev/hda3 toram=filesystem.squashfs
initrd /clonezilla/initrd1.img
boot</pre>
<p>我的恢复分区(J:)是系统的第三个主分区，所以第二行盘符为(hd0,2)，第三行的bootfrom为/dev/hda3。
这两个参数根据具体情况调整即可。另外，kernel和initrd指令中用到的 /clonezilla 路径，
就是我们建立的 J:\clonezilla 路径。</p>
<p>设置好之后，重新启动，进入Grub选择“Clonezilla live on harddrive”菜单项，看看能否顺利启动clonezilla。</p>

<h2 id="content_16_4">安装Win98启动软盘</h2>
<p>这一步的目的是让电脑能启动到纯DOS模式下，以便执行一些维护命令，比如稍后要说的bootlace.com程序
就必须在纯DOS模式下执行。</p>
<p>首先上网找一张Windows 98启动软盘的镜像，放在iso目录下，假设路径为 /iso/win98.img。
然后在menu.lst中加入以下菜单项：</p>
<pre>title Win98 Floppy
find --set-root --ignore-floppies /iso/win98.img
map --mem /iso/win98.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)</pre>
<p>这里关键是map --mem这条命令，它将镜像文件完全加载到内存中，并把它映射到设备(fd0)上，
这样就相当于虚拟了一个软驱。</p>
<p>然后重新启动计算机，进入Grub选择“Win98 Floppy”即可进入纯DOS模式。</p>

<h2 id="content_16_5">安装grub4dos的引导扇区</h2>
<p>现在grub4dos是通过NTLDR引导的，万一NTLDR也挂掉了，这个紧急恢复分区就失效了。
为了防止这一点，需要把grub4dos安装到MBR中。</p>
<p>grub4dos提供了一个名为bootlace.com的程序可以写MBR。它的原理是，首先把原有的MBR（位于0扇区）备份到1扇区，
然后在0扇区写入自己的启动程序。根据硬盘启动区的规格定义，硬盘的0磁道中，除了0扇区是MBR之外，其他扇区都是保留，
所以备份到1扇区不会有任何影响。</p>
<p>由于bootlace.com必须在纯DOS下使用，而Win98启动盘提供的DOS没有命令行历史功能，
偏偏bootlace.com的选项又长又多，因此手动敲命令可不是个好办法。
应该建立一个名为INSTALL.BAT的文件，把bootlace.com的命令行写进去。</p>
<p>下面是INSTALL.BAT的例子。注意实际书写时不要换行，都写在同一行上。而且要注意命令行长度不要超过127个字符，这是DOS对命令行长度的限制。</p>
<pre>bootlace --boot-prevmbr-first --time-out=1 
         --hot-key=0x4300 --force-backup-mbr 
         --preferred-drive=0 --preferred-partition=2 0x80</pre>
<p>各个选项的具体说明可以参见README_GRUB4DOS.TXT，这里只简单说明一下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>--boot-prevmbr-first指明优先启动原来的MBR（进Windows），只有按下热键时才进入特定分区启动。</li>
<li>--time-out指定启动时的等待时间。</li>
<li>--hot-key指定进入特定分区启动的热键，0x4300为F9。</li>
<li>--force-backup-mbr让bootlace.com将旧MBR备份到1扇区。</li>
<li>--preferred-drive和--preferred-partition指定按下热键时，从第0磁盘的第2号扇区（第3个扇区）启动。这跟grub菜单中的(hd0, 2)是一样的意思。</li>
<li>最后的0x80表示要把bootlace.com装到第一块硬盘上。</li></ul>
<p>然后重启计算机，进入DOS环境后执行bootlace.com即可。再次启动时就会出现一行小字，等待1秒钟即可进入原有Windows，
而按下F9键就会启动位于(hd0,2)的grub引导程序。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>关于一键恢复，网上有很多<a href="http://bbs.wuyou.com/forumdisplay.php?fid=34">讨论</a>，也有很多<a href="http://www.yjhy.net/xzdz.htm">成品</a>，
不过大多数都是基于Ghost实现的，而Ghost是个商业软件，喜欢用开源的人可能比较难于接受吧。
此外，这种一键恢复虽然很容易使用，但可定制性也比较差。所以我考虑使用<a href="http://clonezilla.org/">CloneZilla</a>
来制作一个紧急恢复分区，用来备份/还原系统。</p>
<p>为什么用CloneZilla呢？理由如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>它是开源软件。</li>
<li>备份形式灵活，可以选择备份分区或整个硬盘，可以选择备份到本地硬盘，也可以备份到网络。</li>
<li>自带的Linux系统可以用作系统维护。</li></ul>
<p>CloneZilla的使用方法就不多说了，自带的<a href="http://clonezilla.nchc.org.tw/">中文文档</a>中有极其详尽的截图说明。
另外，制作紧急恢复分区，只有CloneZilla是不够的，还得要<a href="https://gna.org">grub4dos</a>的帮助。</p>
<p>我的操作系统是Windows XP，硬盘分区默认都是NTFS。下面开始动手吧。</p>
<!-- end Pukiwiki generated code--><span id="more-761"></span><!-- begin Pukiwiki generated code--><h2 id="content_18_0">准备分区</h2>
<p>我的C盘容量是40G，常驻的文件大约有10～20G左右，长时间使用之后可能会增长到30G。
考虑到备份后的镜像能被压缩到50%左右，所以一次备份大约需要5～10G的硬盘。
所以我留出30G的空间用作备份。</p>
<p>首先整理磁盘碎片，然后用Partition Magic等工具在硬盘末尾划分出一个30G的空间。
最好是用主分区（原因是，Linux和grub对主分区的编号方式要比逻辑盘简单些），
然后将其格式化成FAT32，并分配一个驱动器符号（假设为J:）。
这就是以后的紧急恢复分区。</p>

<h2 id="content_18_1">安装CloneZilla</h2>
<p>在 J: 盘下建立以下几个目录：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>clonezilla：CloneZilla主目录</li>
<li>grub4dos：grub4dos主目录</li>
<li>iso：其他系统维护盘镜像的目录</li>
<li>images：C盘镜像备份的目录</li></ul>
<p>然后把CloneZilla Live光盘中的 live 目录下的内容完全复制到 J:\clonezilla 下。</p>

<h2 id="content_18_2">安装grub4dos</h2>
<p>grub4dos支持NTLDR启动，所以其实只需要两个文件：grldr和menu.lst。但为了以后作业方便，
我还是把整个grub4dos文件都放到了 J:\grub4dos 下。</p>
<p>然后设置NTLDR启动：复制 J:\grub4dos 下的 grldr 和 menu.lst 两个文件到 C: 盘根目录。
然后编辑 C:\boot.ini ，加入以下内容：</p>
<pre>C:\GRLDR=&quot;Start GRUB&quot;</pre>
<p>重新启动计算机，按F8出现Windows XP的启动菜单，然后选择“Start GRUB”，能出现GRUB的启动菜单就OK。</p>

<h2 id="content_18_3">设置grub4dos启动CloneZilla</h2>
<p>回到Windows下编辑menu.lst。默认的menu.lst中有许多没用的菜单项，我只保留了最初加载NTLDR和CMLDR的两项。
然后加入启动CloneZilla的菜单项：</p>
<pre>title Clonezilla live on harddrive
root (hd0,2)
kernel /clonezilla/vmlinuz1 boot=live union=aufs vga=788 ip=frommedia live-media-path=/clonezilla bootfrom=/dev/hda3 toram=filesystem.squashfs
initrd /clonezilla/initrd1.img
boot</pre>
<p>我的恢复分区(J:)是系统的第三个主分区，所以第二行盘符为(hd0,2)，第三行的bootfrom为/dev/hda3。
这两个参数根据具体情况调整即可。另外，kernel和initrd指令中用到的 /clonezilla 路径，
就是我们建立的 J:\clonezilla 路径。</p>
<p>设置好之后，重新启动，进入Grub选择“Clonezilla live on harddrive”菜单项，看看能否顺利启动clonezilla。</p>

<h2 id="content_18_4">安装Win98启动软盘</h2>
<p>这一步的目的是让电脑能启动到纯DOS模式下，以便执行一些维护命令，比如稍后要说的bootlace.com程序
就必须在纯DOS模式下执行。</p>
<p>首先上网找一张Windows 98启动软盘的镜像，放在iso目录下，假设路径为 /iso/win98.img。
然后在menu.lst中加入以下菜单项：</p>
<pre>title Win98 Floppy
find --set-root --ignore-floppies /iso/win98.img
map --mem /iso/win98.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)</pre>
<p>这里关键是map --mem这条命令，它将镜像文件完全加载到内存中，并把它映射到设备(fd0)上，
这样就相当于虚拟了一个软驱。</p>
<p>然后重新启动计算机，进入Grub选择“Win98 Floppy”即可进入纯DOS模式。</p>

<h2 id="content_18_5">安装grub4dos的引导扇区</h2>
<p>现在grub4dos是通过NTLDR引导的，万一NTLDR也挂掉了，这个紧急恢复分区就失效了。
为了防止这一点，需要把grub4dos安装到MBR中。</p>
<p>grub4dos提供了一个名为bootlace.com的程序可以写MBR。它的原理是，首先把原有的MBR（位于0扇区）备份到1扇区，
然后在0扇区写入自己的启动程序。根据硬盘启动区的规格定义，硬盘的0磁道中，除了0扇区是MBR之外，其他扇区都是保留，
所以备份到1扇区不会有任何影响。</p>
<p>由于bootlace.com必须在纯DOS下使用，而Win98启动盘提供的DOS没有命令行历史功能，
偏偏bootlace.com的选项又长又多，因此手动敲命令可不是个好办法。
应该建立一个名为INSTALL.BAT的文件，把bootlace.com的命令行写进去。</p>
<p>下面是INSTALL.BAT的例子。注意实际书写时不要换行，都写在同一行上。而且要注意命令行长度不要超过127个字符，这是DOS对命令行长度的限制。</p>
<pre>bootlace --boot-prevmbr-first --time-out=1 
         --hot-key=0x4300 --force-backup-mbr 
         --preferred-drive=0 --preferred-partition=2 0x80</pre>
<p>各个选项的具体说明可以参见README_GRUB4DOS.TXT，这里只简单说明一下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>--boot-prevmbr-first指明优先启动原来的MBR（进Windows），只有按下热键时才进入特定分区启动。</li>
<li>--time-out指定启动时的等待时间。</li>
<li>--hot-key指定进入特定分区启动的热键，0x4300为F9。</li>
<li>--force-backup-mbr让bootlace.com将旧MBR备份到1扇区。</li>
<li>--preferred-drive和--preferred-partition指定按下热键时，从第0磁盘的第2号扇区（第3个扇区）启动。这跟grub菜单中的(hd0, 2)是一样的意思。</li>
<li>最后的0x80表示要把bootlace.com装到第一块硬盘上。</li></ul>
<p>然后重启计算机，进入DOS环境后执行bootlace.com即可。再次启动时就会出现一行小字，等待1秒钟即可进入原有Windows，
而按下F9键就会启动位于(hd0,2)的grub引导程序。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/07/09/clonezilla-eb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HP-UX下安装打印机小结</title>
		<link>http://tech.idv2.com/2010/06/24/install-printer-inhp-ux/</link>
		<comments>http://tech.idv2.com/2010/06/24/install-printer-inhp-ux/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 01:26:57 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[hpux]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=779</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>系统是HP-UX B.11.31，打印机是HP LaserJet 5100。安装步骤简单描述如下：</p>
<p><strong>1. 安装HP JetDirect Printer Installer for UNIX</strong></p>
<pre># /usr/sbin/swsintall –s /var/tmp/hp11e134.sd J4189-11001C</pre>
<p>验证安装是否成功：</p>
<pre># /usr/sbin/swlist -l product J4189-11001C 
# Initializing... 
# Contacting target &quot;systemname&quot;... 
# 
# Target:  systemname:/ 
# 
 
# J4189-11001C        E.10.34  Hewlett-Packard JetDirect Printer Installer for Unix 
  J4189-11001C.HPNPL  E.10.34  Hewlett-Packard JetDirect Printer Installer for Unix </pre>
<!-- end Pukiwiki generated code--><span id="more-779"></span><!-- begin Pukiwiki generated code--><p><strong>2. 下载HP LaserJet 5100的驱动程序</strong></p>
<p>HP打印机的驱动程序(Modelscript)可以在这里下载：<a href="http://www.hp.com/pond/modelscripts/index2.html">http://www.hp.com/pond/modelscripts/index2.html</a></p>
<p>下载 net_lj5100.sh.Z 后，用以下步骤安装：</p>
<pre># uncompress net_lj5100.sh.Z
# sh net_lj5100.sh.Z</pre>
<p><strong>3. 安装打印机</strong></p>
<p>通过浏览器访问SMH（https://&lt;HP-UX服务器地址&gt;:2381/），然后选择Tools，
再选择Print Management -&gt; Configure Printer or Plotter。
接下来需要在自己的机器上启动Xserver，再点击&quot;Run&quot;按钮，
即可启动&quot;Printer and Plotter&quot;设置程序。</p>
<p>在Printer and Plotter设置程序的菜单中选择&quot;Action&quot;-&gt;&quot;Add Network-Based Printer/Plotter&quot;-&gt;&quot;Add Printer/Plotter connected to JetDirect&quot;，
就会通过终端启动hppi程序，如下所示。
（其实不通过SMH和Printer and Plotter设置程序，直接从命令行中敲hppi也能进入下述画面，
但我在添加打印机后，通过hppi本身查不到添加的打印机，所以建议还是通过SMH稳妥一些。）</p>
<pre>         ****************************************************************
         *****]         ****
         **** ]          ****     JetDirect Printer Installer for UNIX
         **** ]]]]] ]]]]] ****    Version E.10.34
         **** ]   ] ]   ] ****
         **** ]   ] ]]]]] ****    M A I N     M E N U
         *****      ]     ****
         ******     ]    ****     User: (root)    OS: (HP-UX B.11.31)
              I N V E N T
         ****************************************************************

         1) Spooler Administration (super-user only)


         2) JetDirect Configuration (super-user only)
            - TCP/IP configurable parameters

         3) Diagnostics:
            - diagnose printing problems


                   ?) Help         q) Quit

Please enter a selection (q - quit):</pre>
<p>选择1，出现以下菜单：</p>
<pre>          Spooler:
              1) Add printer to local spooler
              2) Delete printer from local spooler
              3) Modify existing spooler queue(s)
              4) Install New Model Script
              5) Remove Model Script</pre>
<p>再选择1，输入打印机的IP地址：
Enter the network printer name or IP address (q - quit): 192.168.1.10</p>
<p>然后出现参数设置画面：</p>
<pre>   Configurable Parameters:               Current Settings
   ------------------------               ----------------

   1) Lp destination (queue) name:         [192_1]
   2) Status Log                           [(No Log)]
   3) Queue Class                          [(Not assigned)]
   4) Default Queue                        [NO]
   5) Additional printer configuration...</pre>
<p>这里要选择5，进入高级选项更改：</p>
<pre>   Configurable Parameters:               Current Settings
   ------------------------               ----------------

   1) Model Script:                        [net_lj8150]
   2) Default Printing Language            [AUTO]
   3) Job Recovery                         [ON]
   4) True End-of-Job                      [ON]
   5) Banner Page                          [ON]
   6) PostScript Level                     [Level 2]
   7) Banner Tray                          [default]
   8) Banner Paper Size                    [default]
   9) Duplex print                         [default]</pre>
<p>选择1，输入刚刚安装的Model Script名：</p>
<pre>Enter model script name (q-quit): net_lj5100</pre>
<p>按 q 退到上一层菜单，然后按 0 -&gt; y 开始配置。</p>
<pre>Finished adding &quot;192_1&quot; to the spooler.</pre>
<p><strong>可能的错误</strong></p>
<p>如果出现以下错误，有可能是权限问题：</p>
<pre>Addprinter error: can't find /usr/spool/lp/interface/192_1</pre>
<p>请检查 /var/spool/lp、/etc/lp、/usr/lib/lp这几个目录的属主是否为lp:bin。
我遇到的情况是，其他项目组的人出于开发的目的，删除了系统自带的lp账户，
从而添加打印机时出现上述问题。</p>
<p>如果出现以下警告，只需按照提示执行一次 lpsched 命令即可：</p>
<pre>WARNING : The spooler is not running!
To print, turn on the spooler (lpsched)</pre>
<p>成功安装之后，在Printer and Plotter配置程序的界面中选择 List -&gt; Printers and Plotters，
即可看到已经安装成功的打印机，如图所示。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2010/06/add-printer-to-jetdirect.png" alt="add-printer-to-jetdirect.png" title="add-printer-to-jetdirect.png" width="624" height="383" /></div>

<p>选中该打印机，从右键菜单中选择&quot;Set as System Default Destination&quot;，将其设置为系统默认打印机。</p>
<p><strong>4. 打印测试页面</strong></p>
<p>在命令行下执行 lp 命令即可打印。</p>
<pre>$ lp readme.txt</pre>
<p>如果要打印postscript格式的文件，可以这样写：</p>
<pre>$ lp -o postscript readme.ps</pre>
<p>用lpstat命令可以查看打印队列。</p>
<pre>$ lpstat</pre>
<p><strong>备注</strong></p>
<p>如果打印时遇到问题，可以查看日志文件：</p>
<pre>tail -f /var/adm/lp/log</pre>
<p>打印spool位于 /opt/hpnpl/tmp 下，如果打印不正常，看看是不是这个目录的权限问题。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>系统是HP-UX B.11.31，打印机是HP LaserJet 5100。安装步骤简单描述如下：</p>
<p><strong>1. 安装HP JetDirect Printer Installer for UNIX</strong></p>
<pre># /usr/sbin/swsintall –s /var/tmp/hp11e134.sd J4189-11001C</pre>
<p>验证安装是否成功：</p>
<pre># /usr/sbin/swlist -l product J4189-11001C 
# Initializing... 
# Contacting target &quot;systemname&quot;... 
# 
# Target:  systemname:/ 
# 
 
# J4189-11001C        E.10.34  Hewlett-Packard JetDirect Printer Installer for Unix 
  J4189-11001C.HPNPL  E.10.34  Hewlett-Packard JetDirect Printer Installer for Unix </pre>
<!-- end Pukiwiki generated code--><span id="more-779"></span><!-- begin Pukiwiki generated code--><p><strong>2. 下载HP LaserJet 5100的驱动程序</strong></p>
<p>HP打印机的驱动程序(Modelscript)可以在这里下载：<a href="http://www.hp.com/pond/modelscripts/index2.html">http://www.hp.com/pond/modelscripts/index2.html</a></p>
<p>下载 net_lj5100.sh.Z 后，用以下步骤安装：</p>
<pre># uncompress net_lj5100.sh.Z
# sh net_lj5100.sh.Z</pre>
<p><strong>3. 安装打印机</strong></p>
<p>通过浏览器访问SMH（https://&lt;HP-UX服务器地址&gt;:2381/），然后选择Tools，
再选择Print Management -&gt; Configure Printer or Plotter。
接下来需要在自己的机器上启动Xserver，再点击&quot;Run&quot;按钮，
即可启动&quot;Printer and Plotter&quot;设置程序。</p>
<p>在Printer and Plotter设置程序的菜单中选择&quot;Action&quot;-&gt;&quot;Add Network-Based Printer/Plotter&quot;-&gt;&quot;Add Printer/Plotter connected to JetDirect&quot;，
就会通过终端启动hppi程序，如下所示。
（其实不通过SMH和Printer and Plotter设置程序，直接从命令行中敲hppi也能进入下述画面，
但我在添加打印机后，通过hppi本身查不到添加的打印机，所以建议还是通过SMH稳妥一些。）</p>
<pre>         ****************************************************************
         *****]         ****
         **** ]          ****     JetDirect Printer Installer for UNIX
         **** ]]]]] ]]]]] ****    Version E.10.34
         **** ]   ] ]   ] ****
         **** ]   ] ]]]]] ****    M A I N     M E N U
         *****      ]     ****
         ******     ]    ****     User: (root)    OS: (HP-UX B.11.31)
              I N V E N T
         ****************************************************************

         1) Spooler Administration (super-user only)


         2) JetDirect Configuration (super-user only)
            - TCP/IP configurable parameters

         3) Diagnostics:
            - diagnose printing problems


                   ?) Help         q) Quit

Please enter a selection (q - quit):</pre>
<p>选择1，出现以下菜单：</p>
<pre>          Spooler:
              1) Add printer to local spooler
              2) Delete printer from local spooler
              3) Modify existing spooler queue(s)
              4) Install New Model Script
              5) Remove Model Script</pre>
<p>再选择1，输入打印机的IP地址：
Enter the network printer name or IP address (q - quit): 192.168.1.10</p>
<p>然后出现参数设置画面：</p>
<pre>   Configurable Parameters:               Current Settings
   ------------------------               ----------------

   1) Lp destination (queue) name:         [192_1]
   2) Status Log                           [(No Log)]
   3) Queue Class                          [(Not assigned)]
   4) Default Queue                        [NO]
   5) Additional printer configuration...</pre>
<p>这里要选择5，进入高级选项更改：</p>
<pre>   Configurable Parameters:               Current Settings
   ------------------------               ----------------

   1) Model Script:                        [net_lj8150]
   2) Default Printing Language            [AUTO]
   3) Job Recovery                         [ON]
   4) True End-of-Job                      [ON]
   5) Banner Page                          [ON]
   6) PostScript Level                     [Level 2]
   7) Banner Tray                          [default]
   8) Banner Paper Size                    [default]
   9) Duplex print                         [default]</pre>
<p>选择1，输入刚刚安装的Model Script名：</p>
<pre>Enter model script name (q-quit): net_lj5100</pre>
<p>按 q 退到上一层菜单，然后按 0 -&gt; y 开始配置。</p>
<pre>Finished adding &quot;192_1&quot; to the spooler.</pre>
<p><strong>可能的错误</strong></p>
<p>如果出现以下错误，有可能是权限问题：</p>
<pre>Addprinter error: can't find /usr/spool/lp/interface/192_1</pre>
<p>请检查 /var/spool/lp、/etc/lp、/usr/lib/lp这几个目录的属主是否为lp:bin。
我遇到的情况是，其他项目组的人出于开发的目的，删除了系统自带的lp账户，
从而添加打印机时出现上述问题。</p>
<p>如果出现以下警告，只需按照提示执行一次 lpsched 命令即可：</p>
<pre>WARNING : The spooler is not running!
To print, turn on the spooler (lpsched)</pre>
<p>成功安装之后，在Printer and Plotter配置程序的界面中选择 List -&gt; Printers and Plotters，
即可看到已经安装成功的打印机，如图所示。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2010/06/add-printer-to-jetdirect.png" alt="add-printer-to-jetdirect.png" title="add-printer-to-jetdirect.png" width="624" height="383" /></div>

<p>选中该打印机，从右键菜单中选择&quot;Set as System Default Destination&quot;，将其设置为系统默认打印机。</p>
<p><strong>4. 打印测试页面</strong></p>
<p>在命令行下执行 lp 命令即可打印。</p>
<pre>$ lp readme.txt</pre>
<p>如果要打印postscript格式的文件，可以这样写：</p>
<pre>$ lp -o postscript readme.ps</pre>
<p>用lpstat命令可以查看打印队列。</p>
<pre>$ lpstat</pre>
<p><strong>备注</strong></p>
<p>如果打印时遇到问题，可以查看日志文件：</p>
<pre>tail -f /var/adm/lp/log</pre>
<p>打印spool位于 /opt/hpnpl/tmp 下，如果打印不正常，看看是不是这个目录的权限问题。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/06/24/install-printer-inhp-ux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让vim自动保存</title>
		<link>http://tech.idv2.com/2010/03/31/autosave-in-vim/</link>
		<comments>http://tech.idv2.com/2010/03/31/autosave-in-vim/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 03:37:10 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=770</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p><a href="http://www.vim.org/">vim</a>是我最喜欢的编辑器，连写邮件都离不开它，所以一直用Thunderbird 2.0 + External Editor插件 + vim这一套组合来写邮件。最近又装了<a href="http://www.google.co.jp/intl/ja/ime/">Google日文输入法</a>，可惜它跟vim的兼容性不太好，经常在汉字变换时导致vim异常退出，而写了一半的邮件也就化为泡影了。于是想，如果vim能自动保存就好了。今天研究了一下帮助文件，发现还真能实现类似自动保存的功能。</p>
<p>方法很简单，只需在 $VIM/vimfiles/ftplugin/mail.vim 中加入这样一行：</p>
<pre>au InsertLeave *.eml write</pre>
<p>该行的意思是：针对所有.eml文件，在退出编辑模式（InsertLeave）时，自动执行write命令。这样就能在每次按Esc键时自动保存了。</p>
<p>顺便贴一下其他有用的配置：</p>
<pre>set encoding=utf8
set guifont=ＭＳ_ゴシック:h10:cSHIFTJIS
set tw=140                       &quot; 140字符自动换行
set et                           &quot; expandtab，用空格代替Tab键
retab                            &quot; 打开vim时把已有的Tab全部转换成空格
au InsertLeave *.eml write       &quot; 每次退出插入模式时自动保存</pre>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p><a href="http://www.vim.org/">vim</a>是我最喜欢的编辑器，连写邮件都离不开它，所以一直用Thunderbird 2.0 + External Editor插件 + vim这一套组合来写邮件。最近又装了<a href="http://www.google.co.jp/intl/ja/ime/">Google日文输入法</a>，可惜它跟vim的兼容性不太好，经常在汉字变换时导致vim异常退出，而写了一半的邮件也就化为泡影了。于是想，如果vim能自动保存就好了。今天研究了一下帮助文件，发现还真能实现类似自动保存的功能。</p>
<p>方法很简单，只需在 $VIM/vimfiles/ftplugin/mail.vim 中加入这样一行：</p>
<pre>au InsertLeave *.eml write</pre>
<p>该行的意思是：针对所有.eml文件，在退出编辑模式（InsertLeave）时，自动执行write命令。这样就能在每次按Esc键时自动保存了。</p>
<p>顺便贴一下其他有用的配置：</p>
<pre>set encoding=utf8
set guifont=ＭＳ_ゴシック:h10:cSHIFTJIS
set tw=140                       &quot; 140字符自动换行
set et                           &quot; expandtab，用空格代替Tab键
retab                            &quot; 打开vim时把已有的Tab全部转换成空格
au InsertLeave *.eml write       &quot; 每次退出插入模式时自动保存</pre>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/03/31/autosave-in-vim/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>关闭VMware的PC喇叭</title>
		<link>http://tech.idv2.com/2010/02/26/disable-pc-speaker-in-vmware/</link>
		<comments>http://tech.idv2.com/2010/02/26/disable-pc-speaker-in-vmware/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 05:47:03 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=767</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>在VMWare中运行一些Linux上的软件如vi，出错时PC喇叭会不停地叫，很烦人。
其实只要在 c:\Documents and Settings\用户名\Application Data\VMware\config.ini （如不存在请自行建立）中加入这样一行：</p>
<pre>mks.noBeep = &quot;TRUE&quot;</pre>
<p>就可以从虚拟硬件上关闭VMWare的PC喇叭。</p>
<p>我用的VMware是 VMware Workstation 5.5.1版。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>在VMWare中运行一些Linux上的软件如vi，出错时PC喇叭会不停地叫，很烦人。
其实只要在 c:\Documents and Settings\用户名\Application Data\VMware\config.ini （如不存在请自行建立）中加入这样一行：</p>
<pre>mks.noBeep = &quot;TRUE&quot;</pre>
<p>就可以从虚拟硬件上关闭VMWare的PC喇叭。</p>
<p>我用的VMware是 VMware Workstation 5.5.1版。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/02/26/disable-pc-speaker-in-vmware/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Skype for Symbian试用体验</title>
		<link>http://tech.idv2.com/2010/02/21/skype-for-symbian%e8%af%95%e7%94%a8%e4%bd%93%e9%aa%8c/</link>
		<comments>http://tech.idv2.com/2010/02/21/skype-for-symbian%e8%af%95%e7%94%a8%e4%bd%93%e9%aa%8c/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 04:05:05 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[skype]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=764</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>Skype本月终于推出了Symbian版的Skype，完美支持5800，这下终于可以结束5800不能打IP电话的历史了。
（以前虽然有Fring和Nimbuzz，但毕竟是涉及到财务，还是用惯了的skype比较顺手。）</p>
<p>详细的介绍见<a href="http://www.skype.com/intl/en/download/skype/symbian/">下载页面</a>，
手机可以直接访问 skype.com/m 下载。不过安装包比较大，5M多，建议使用WLAN功能下载。</p>
<p>功能还是相当全面的，可以Skype to Skype、Skype to Phone，能Skype聊天，还能直接发短信。
而且可以直接导入手机本身的通讯录。</p>
<p>至于通话效果，我用GPRS cmnet接入点做的测试，对方的声音非常清晰，而且对方基本能听清我说的话
（偶尔会有话音中断的现象），能感觉到大约半秒钟的延迟。流量方面，通话4分钟，上行流量约220K，
下行流量约340K，没有GPRS包月就比较困难了。</p>
<p>缺点嘛，耗电量挺严重，昨天一直开着Skype玩，今天早上电池就消耗了一半吧，
因此很难一直挂在上面。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>Skype本月终于推出了Symbian版的Skype，完美支持5800，这下终于可以结束5800不能打IP电话的历史了。
（以前虽然有Fring和Nimbuzz，但毕竟是涉及到财务，还是用惯了的skype比较顺手。）</p>
<p>详细的介绍见<a href="http://www.skype.com/intl/en/download/skype/symbian/">下载页面</a>，
手机可以直接访问 skype.com/m 下载。不过安装包比较大，5M多，建议使用WLAN功能下载。</p>
<p>功能还是相当全面的，可以Skype to Skype、Skype to Phone，能Skype聊天，还能直接发短信。
而且可以直接导入手机本身的通讯录。</p>
<p>至于通话效果，我用GPRS cmnet接入点做的测试，对方的声音非常清晰，而且对方基本能听清我说的话
（偶尔会有话音中断的现象），能感觉到大约半秒钟的延迟。流量方面，通话4分钟，上行流量约220K，
下行流量约340K，没有GPRS包月就比较困难了。</p>
<p>缺点嘛，耗电量挺严重，昨天一直开着Skype玩，今天早上电池就消耗了一半吧，
因此很难一直挂在上面。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/02/21/skype-for-symbian%e8%af%95%e7%94%a8%e4%bd%93%e9%aa%8c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5800应用技巧(2)-常用软件</title>
		<link>http://tech.idv2.com/2010/02/08/5800tips-apps/</link>
		<comments>http://tech.idv2.com/2010/02/08/5800tips-apps/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 05:19:47 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/?p=753</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>经过一个多月的折腾，使用的软件也基本上固定下来了。
下面简单介绍一下我常用的软件吧。</p>
<p>上网我用<strong>Opera Mini</strong>，<a href="http://tech.idv2.com/2010/01/01/nokia5800xm-tip/">以前</a>
用的是UCWeb，但最近发现Opera渲染页面更干净些。
而UCWeb上的一堆八卦新闻则是让我放弃它的主要理由。此外，<strong>自带浏览器</strong>没有代理，
可以连接局域网内的资源，如下载文件、控制路由器等。</p>
<p>邮件还是用的<strong>Gmail官方版</strong>。至于pushmail，我用的是<strong>139邮箱</strong>的短信通知，
正好5800自带邮件功能，收到短信通知之后再连到139邮箱去收信，比较方便。</p>
<p>即时消息类包括<strong>Gravity</strong>、<strong>Windows Live Messenger</strong>，这些软件大家都很熟悉了吧。</p>
<p>看书、听音乐，用的还是<strong>AnyView</strong>和<strong>天天动听</strong>，原因在<a href="http://tech.idv2.com/2010/01/01/nokia5800xm-tip/">前一篇</a>中有所介绍，就不再多说了。</p>
<p>看视频，就用自带的MP4视频播放器，先把视频在电脑上用<strong>MediaCoder</strong>压缩，
视频选 MPEG4，比特率最高到1100Kbps，音频选MP3，分辨率选640x360，
这样压缩出来的视频在手机上看相当完美。尽量别用Xvid编码，虽然5800也支持，
但在看片子的时候经常会出现画面死掉的情况。</p>
<p>图片浏览，我用的是<strong>Resco Photo Viewer</strong>，最重要的功能就是能按照文件夹浏览图片，
是取代系统自带图片浏览器的最佳软件。</p>
<p>生活软件，这是手机应用的重点。开车时用<strong>Garmin</strong>，地图详细界面友好，最重要的是有语音提示。
走路的时候用<strong>Google地图</strong>，地图比Garmin好看，而且定位相当快（虽然有时不是很精确），还能查公交线路。
列车时刻表用<strong>路路通</strong>，好处是无需上网，搜索速度也相当快。
天气预报用<strong>天气通</strong>。</p>
<p>一些其他小工具：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>BrightLight</strong>，Nokia OVI中的手电筒工具，晚上还真挺有用的。</li>
<li><strong>Timer</strong>和<strong>鸡蛋闹钟</strong>，两个定时器工具，前者是秒表，后者是倒计时。通常在LP做面膜时使用。</li>
<li><strong>Ultimate Voice Recorder</strong>，通话录音工具。</li>
<li><strong>来电通</strong>，可以在接打电话时显示电话号码归属地，可以统计流量，可以全屏显示短信。</li>
<li><strong>Best Screen Snap</strong>，桌面抓图工具。</li>
<li><strong>Y-Browser</strong>，简单易用的文件管理器。</li>
<li><strong>UpCode</strong>，条码扫描器，看到杂志上的二维条形码时，可以用它来看看是什么内容。</li>
<li><strong>Best Profile</strong>，可以按照时间自动切换情景模式，这样就不用担心上班时电话铃声吵到别人了。</li>
<li><strong>Plus J</strong>，还算凑合的日文输入法（比不上日本的手机中的输入法），偶尔输入日文用。</li></ul>
<p>系统维护类工具。这类工具不常用，而且有一定危险性。我把它们放到一个单独的文件夹内。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>Y工具箱</strong>，能查看进程、线程，查看应用程序，监控内存状况等。</li>
<li><strong>ActiveFile</strong>，最强大的文件管理器，我装了个最高权限版，并且设置了启动密码，以免被人不小心删掉系统重要文件。</li>
<li><strong>SymSMB</strong>，将手机当作Samba服务器，这样就能直接从电脑向手机copy文件了。注意该程序不支持中文文件名，PC-&gt;手机方向的copy必须使用英文文件名，否则会乱码。</li></ul>
<p>OK，平常用的就这么多，希望各位读者也来分享一下各自使用的软件吧。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>经过一个多月的折腾，使用的软件也基本上固定下来了。
下面简单介绍一下我常用的软件吧。</p>
<p>上网我用<strong>Opera Mini</strong>，<a href="http://tech.idv2.com/2010/01/01/nokia5800xm-tip/">以前</a>
用的是UCWeb，但最近发现Opera渲染页面更干净些。
而UCWeb上的一堆八卦新闻则是让我放弃它的主要理由。此外，<strong>自带浏览器</strong>没有代理，
可以连接局域网内的资源，如下载文件、控制路由器等。</p>
<p>邮件还是用的<strong>Gmail官方版</strong>。至于pushmail，我用的是<strong>139邮箱</strong>的短信通知，
正好5800自带邮件功能，收到短信通知之后再连到139邮箱去收信，比较方便。</p>
<p>即时消息类包括<strong>Gravity</strong>、<strong>Windows Live Messenger</strong>，这些软件大家都很熟悉了吧。</p>
<p>看书、听音乐，用的还是<strong>AnyView</strong>和<strong>天天动听</strong>，原因在<a href="http://tech.idv2.com/2010/01/01/nokia5800xm-tip/">前一篇</a>中有所介绍，就不再多说了。</p>
<p>看视频，就用自带的MP4视频播放器，先把视频在电脑上用<strong>MediaCoder</strong>压缩，
视频选 MPEG4，比特率最高到1100Kbps，音频选MP3，分辨率选640x360，
这样压缩出来的视频在手机上看相当完美。尽量别用Xvid编码，虽然5800也支持，
但在看片子的时候经常会出现画面死掉的情况。</p>
<p>图片浏览，我用的是<strong>Resco Photo Viewer</strong>，最重要的功能就是能按照文件夹浏览图片，
是取代系统自带图片浏览器的最佳软件。</p>
<p>生活软件，这是手机应用的重点。开车时用<strong>Garmin</strong>，地图详细界面友好，最重要的是有语音提示。
走路的时候用<strong>Google地图</strong>，地图比Garmin好看，而且定位相当快（虽然有时不是很精确），还能查公交线路。
列车时刻表用<strong>路路通</strong>，好处是无需上网，搜索速度也相当快。
天气预报用<strong>天气通</strong>。</p>
<p>一些其他小工具：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>BrightLight</strong>，Nokia OVI中的手电筒工具，晚上还真挺有用的。</li>
<li><strong>Timer</strong>和<strong>鸡蛋闹钟</strong>，两个定时器工具，前者是秒表，后者是倒计时。通常在LP做面膜时使用。</li>
<li><strong>Ultimate Voice Recorder</strong>，通话录音工具。</li>
<li><strong>来电通</strong>，可以在接打电话时显示电话号码归属地，可以统计流量，可以全屏显示短信。</li>
<li><strong>Best Screen Snap</strong>，桌面抓图工具。</li>
<li><strong>Y-Browser</strong>，简单易用的文件管理器。</li>
<li><strong>UpCode</strong>，条码扫描器，看到杂志上的二维条形码时，可以用它来看看是什么内容。</li>
<li><strong>Best Profile</strong>，可以按照时间自动切换情景模式，这样就不用担心上班时电话铃声吵到别人了。</li>
<li><strong>Plus J</strong>，还算凑合的日文输入法（比不上日本的手机中的输入法），偶尔输入日文用。</li></ul>
<p>系统维护类工具。这类工具不常用，而且有一定危险性。我把它们放到一个单独的文件夹内。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>Y工具箱</strong>，能查看进程、线程，查看应用程序，监控内存状况等。</li>
<li><strong>ActiveFile</strong>，最强大的文件管理器，我装了个最高权限版，并且设置了启动密码，以免被人不小心删掉系统重要文件。</li>
<li><strong>SymSMB</strong>，将手机当作Samba服务器，这样就能直接从电脑向手机copy文件了。注意该程序不支持中文文件名，PC-&gt;手机方向的copy必须使用英文文件名，否则会乱码。</li></ul>
<p>OK，平常用的就这么多，希望各位读者也来分享一下各自使用的软件吧。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2010/02/08/5800tips-apps/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
