<?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>Rainux's Journal &#187; Software_软件 Archives  &laquo; Rainux&#039;s Journal</title>
	<atom:link href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/feed/" rel="self" type="application/rss+xml" />
	<link>http://rainux.org</link>
	<description>Rubyist of Vimmer</description>
	<lastBuildDate>Sat, 23 Jul 2011 12:09:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Linux 下使用 Wine 安装运行 TM2008 Beta 及乱码、与 Windows 共享聊天记录等相关问题的解决</title>
		<link>http://rainux.org/running-tm2008-beta-with-wine</link>
		<comments>http://rainux.org/running-tm2008-beta-with-wine#comments</comments>
		<pubDate>Mon, 08 Dec 2008 02:55:58 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[QQ]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[TM2008]]></category>
		<category><![CDATA[Wine]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/12/08/240</guid>
		<description><![CDATA[前言 腾讯已经发布了官方的 QQ for Linux，虽然有很多问题，例如没有 amd64 版本，功能太弱，聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等，但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了，那么不必浪费时间看本文。 精简版本 如果你没时间看我唠叨，精简的版本是：TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库，安装程序需要 GDI+。不可以使用 IEs4Linux，因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 rpcrt4.dll，然后用 winetricks 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。 详细版本 只看精简版没搞定？请看详细的（唠叨的）版本： 安装 Wine，运行一下 winecfg，让它生成一个干净的 [...]]]></description>
			<content:encoded><![CDATA[<h2>前言</h2>

<p>腾讯已经发布了官方的 QQ for Linux，虽然有很多问题，例如没有 amd64 版本，功能太弱，聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等，但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了，那么不必浪费时间看本文。</p>

<h2>精简版本</h2>

<p>如果你没时间看我唠叨，精简的版本是：TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库，安装程序需要 GDI+。不可以使用 <a href="http://www.tatanka.com.br/ies4linux/page/Main_Page">IEs4Linux</a>，因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 <a href="/stuff/rpcrt4.dll.gz">rpcrt4.dll</a>，然后用 <a href="http://www.kegel.com/wine/winetricks">winetricks</a> 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。</p>

<h2>详细版本</h2>

<p>只看精简版没搞定？请看详细的（唠叨的）版本：</p>

<p>安装 Wine，运行一下 winecfg，让它生成一个干净的 ~/.wine 目录。如果要使用已有的 ~/.wine，请先将其备份。同时确保 winecfg 里设置的 Windows 版本至少是 Windows 2000（我用的是 Wine 1.x 默认的 Windows XP）。</p>

<p>获取一份 CrossOver Games 里的 <a href="/stuff/rpcrt4.dll.gz">rpcrt4.dll</a>，将其复制为 ~/.wine/drive_c/windows/system32/rpcrt4.dll（覆盖已有的文件），运行 winecfg，在 Libraries -> DLL Overrides 里将 rpcrt4 设置为 Native (Windows)。</p>

<p>下载 <a href="http://www.kegel.com/wine/winetricks">winetricks</a>，使用它安装 IE6 和一些重要的运行库。如果这个过程失败，删除 ~/.wine（或者恢复备份的 ~/.wine）并从头再来。</p>

<pre name="code" class="bash">sh winetricks msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1
</pre>

<p>此时如果你有 Windows 上安装好的 TM2008，它已经可以运行了，但是无法登录，会提示“网络连接失败，请检查网络。”。所以还是老老实实用安装程序装一次吧。这里有个很莫名的问题，如果直接使用 Wine 运行 TM2008 安装程序，它很可能会直接崩溃，看不到任何图形界面的提示。而使用 Wine 运行一个其它的程序，例如 cmd.exe 或者 Total Commander，再用这个程序去启动 TM2008 安装程序则不会有任何问题。</p>

<h2>中文乱码（空心方框）问题</h2>

<p>好吧，终于看到 TM2008 的安装界面了，不过很可能你又会头大了——所有的中文全是空心方框。原因是安装程序界面的字体是被指定为 Tahoma 的，而实际上 Tahoma 字体并不包括中文字符。有两个办法解决，都是 Windows 的技术，把 Tahoma 字体替换成某个中文字体，或者把某个中文字体链接到 Tahoma 上。照这两个片段修改 ~/.wine/system.reg，只需要其中一个。别忘了把中文字体名改成你自己需要的。</p>

<pre><code>[Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
"MS Shell Dlg"="Microsoft YaHei"
"MS Shell Dlg 2"="Microsoft YaHei"
"Tahoma"="Microsoft YaHei"

[Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]
"Tahoma"=str(7):"SimSun.TTC,SimSun\0"
</code></pre>

<p>最后还必须把你改的中文字体文件符号链接到 ~/.wine/drive_c/windows/Fonts 目录下，不这么做其它软件都没问题，就 QQ 或 TM 会乱码，该死的硬编码。</p>

<h2>查看聊天记录时的性能问题</h2>

<p>好了，现在不会有什么问题阻挡你了，TM2008 Beta 安装和启动都非常顺利，使用也很稳定。甚至 QQ2009 Preview4 都可以安装并启动，不过使用时很容易崩溃。但是如果你像我这样疯狂地保存了七八年的聊天记录，你会发现：</p>

<ul>
<li>每次启动 TM2008 后第一次给任何人发消息都会导致 TM2008 失去响应将近 20 秒钟，之后继续发消息则不会有问题。第一次接收到某人的消息也会同样如此。</li>
<li>任何试图查看聊天记录的操作都会导致 TM2008 消耗 100% CPU 并且很长时间没有反应，等待足够长的时间后才可以看到聊天记录。</li>
</ul>

<p>这是由于 TM2008 的聊天记录数据库使用了 Windows 的 Structured Storage 技术，而其 API 库 ole32.dll 的 Wine 实现还不完善或者可能性能太低。虽然可以用 winetricks 安装 dcom98 来获取一个 Win9x 的 ANSI 版本的 ole32.dll，但它没法让 Unicode 版本的 TM2008 运行起来。搜遍了网络也找不到在 Wine 里使用 Win2k 以上系统的 ole32.dll 的方法。没办法，为了保持聊天记录的一致性，只有两个选择。要么不在 Linux 里看聊天记录；要么把聊天记录数据库 Msg2.0.db 备份并从 QQ Profile 目录（我的文档\QQ Files\QQ 号码）里删除，让 TM2008 自己生成一个空白的 Msg2.0.db，暂时抛弃历史包袱，以后再到 Windows 下把新的记录导出为备份文件后合并到老的数据库里。</p>

<h2>与 Windows 共享聊天记录</h2>

<p>如果你还像我这样偶尔会切换到 Windows，希望跟 Windows 下的 TM2008 共享聊天记录数据库，那么有两个办法：</p>

<ul>
<li>直接在 Linux 里使用 <a href="http://www.ntfs-3g.org/">ntfs-3g</a> 读写存放 TM2008 聊天记录的 NTFS 分区。虽然 ntfs-3g 已经号称非常稳定可靠了，但对于聊天记录这种极度个人化的数据我还是宁可保守一些。</li>
<li>创建一个 ext2 分区用来和 Windows 共享数据，在 Windows 下可以用 <a href="http://www.fs-driver.org/">Ext2 IFS</a> 驱动来访问它。比起私有文件系统 NTFS 的 Linux 版开源驱动来说，当然是开源的 ext2 文件系统的 Windows 版驱动更值得信赖。</li>
</ul>

<p>用这两种办法都需要在 Linux 和 Windows 里创建 QQ Files 目录的符号链接，Linux 里不必说，ln -s 即可。Windows Vista 以前的版本可以用 <a href="http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx">Junction</a> 来创建 NTFS 上的符号链接，Windows Vista 可以用自带的 MKLINK。</p>

<p>对于我这种非笔记本用户来说使用日志文件系统来抵御意外断电是必须的。按照 <a href="http://www.fs-driver.org/faq.html#acc_ext3">Ext2 IFS 的 FAQ</a>，它也可以读写 ext3 分区。<del datetime="2009-01-19T12:08:05+00:00">不过比较新的 Linux 发行版的 mkfs.ext3 创建的 ext3 分区 Ext2 IFS 是无法访问的，可能是 ext3 文件系统格式发生了变化。而 Windows 下一些分区工具如 Paragon Partition Manager 或 Acronis Disk Director 创建的 ext3 分区则没有问题。</del><ins datetime="2009-01-19T12:08:05+00:00">比较新的 Linux 发行版的 mkfs.ext3 默认创建的 ext3 分区 inode 大小是 256 字节，Ext2 IFS 不支持这样的 ext3 分区，使用 mkfs.ext3 -I 128 即可创建 inode 大小为 128 字节的能被 Ext2 IFS 支持的 ext3 分区。不建议使用 Paragon Partition Manager 等 Windows 下的工具创建 ext3 分区，至少 PPM 创建的 ext3 分区是没有目录 hash 的。<a href="http://ext2fsd.sourceforge.net/">Ext2fsd</a> 支持 inode 大小为 256 字节的 ext3 分区，不过虽然相对 Ext2 IFS 它有 GPL 的优势，但似乎成熟度比 Ext2 IFS 低，而且我试用的感觉并不太好，所以没有选择它。</ins></p>

<h2>参考资料</h2>

<ul>
<li><a href="http://mediakey.dk/~cc/howto-office-2007-on-linux-with-wine/">Howto: Office 2007 on Linux with Wine</a></li>
<li><a href="http://www.wine-reviews.net/microsoft/microsoft-office-2007-update.html">Microsoft Office 2007 Update</a></li>
</ul>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/qq/" title="QQ" rel="tag">QQ</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/tm2008/" title="TM2008" rel="tag">TM2008</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a>, <a href="http://rainux.org/tag/wine/" title="Wine" rel="tag">Wine</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/running-tm2008-beta-with-wine/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一些符合我的 Firefox 浏览习惯的 Opera 配置</title>
		<link>http://rainux.org/%e4%b8%80%e4%ba%9b%e7%ac%a6%e5%90%88%e6%88%91%e7%9a%84-firefox-%e6%b5%8f%e8%a7%88%e4%b9%a0%e6%83%af%e7%9a%84-opera-%e9%85%8d%e7%bd%ae</link>
		<comments>http://rainux.org/%e4%b8%80%e4%ba%9b%e7%ac%a6%e5%90%88%e6%88%91%e7%9a%84-firefox-%e6%b5%8f%e8%a7%88%e4%b9%a0%e6%83%af%e7%9a%84-opera-%e9%85%8d%e7%bd%ae#comments</comments>
		<pubDate>Mon, 20 Oct 2008 06:19:19 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/10/20/239</guid>
		<description><![CDATA[Ctrl + 左键单击在后台打开新标签 打开首选项 -> 高级 -> 内容 -> JavaScript 选项，为“用户 JavaScript 文件”指定一个目录，然后从 这个帖子 里（需要穿墙）下载 allinbackground.js （本地镜像，无须穿墙）放到指定的目录，无需重启 Opera 即可生效。对于使用 https 的站点，在地址栏输入 opera:config，搜索“User JavaScript”，勾选“User JavaScript on HTTPS”（请自行确保你的 User JavaScript 都是无公害的）。 Shift + Enter 和 Ctrl + Shift + Enter 自动补全 .net 和 .org 网址 打开首选项 -> 高级 -> 快捷键，如果你以前修改过键盘快捷键，双击“Opera Standard (已修改)”，否则双击“Opera Standard”，定位到 Advanced -> Address Dropdown [...]]]></description>
			<content:encoded><![CDATA[<h2>Ctrl + 左键单击在后台打开新标签</h2>

<p>打开首选项 -> 高级 -> 内容 -> JavaScript 选项，为“用户 JavaScript 文件”指定一个目录，然后从 <a href="http://my.opera.com/community/forums/topic.dml?id=208071">这个帖子</a> 里（需要穿墙）下载 <a href="http://www.rainux.org/stuff/allinbackground.js">allinbackground.js</a> （本地镜像，无须穿墙）放到指定的目录，无需重启 Opera 即可生效。对于使用 https 的站点，在地址栏输入 opera:config，搜索“User JavaScript”，勾选“User JavaScript on HTTPS”（请自行确保你的 User JavaScript 都是无公害的）。</p>

<h2>Shift + Enter 和 Ctrl + Shift + Enter 自动补全 .net 和 .org 网址</h2>

<p>打开首选项 -> 高级 -> 快捷键，如果你以前修改过键盘快捷键，双击“Opera Standard (已修改)”，否则双击“Opera Standard”，定位到 Advanced -> Address Dropdown Widget。这里可以看到 “Enter ctrl” 对应的操作是 “Autocomplete server name, "http://www", "com"”，所以你要做的就是新建两个项目，分别设置快捷键为“Enter shift”和“Enter ctrl shift”，操作为“<code>Autocomplete server name, "http://www", "net"</code>”和  “<code>Autocomplete server name, "http://www", "org"</code>”。</p>

<h2>搜索时自动打开新标签</h2>

<p>打开首选项 -> 高级 -> 标签页，去掉勾选“重用当前标签页”。这里还可以顺便把“在使用 Ctrl + Tab 循环浏览标签页时”设置为“不显示列表循环”，以及勾选“在当前标签页旁边打开新标签”和“关闭标签页时”“激活下一个标签页”。</p>

	标签：<a href="http://rainux.org/tag/browser/" title="Browser" rel="tag">Browser</a>, <a href="http://rainux.org/tag/opera/" title="Opera" rel="tag">Opera</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e4%b8%80%e4%ba%9b%e7%ac%a6%e5%90%88%e6%88%91%e7%9a%84-firefox-%e6%b5%8f%e8%a7%88%e4%b9%a0%e6%83%af%e7%9a%84-opera-%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>基于公钥认证方式的 OpenSSH Server 自动登录完全手册（Linux/Windows 下的 SSH 自动登录指南）</title>
		<link>http://rainux.org/openssh-public-key-authentication-guide-automatic-login</link>
		<comments>http://rainux.org/openssh-public-key-authentication-guide-automatic-login#comments</comments>
		<pubDate>Tue, 02 Sep 2008 07:16:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/09/02/189</guid>
		<description><![CDATA[概述 假设要以用户 rainux 的身份登录运行 OpenSSH Server 的远程主机 www.rainux.org（现在几乎所有的 Linux 服务器都使用 OpenSSH Server 作为 SSH Server），那么需要做的操作如下： 生成用于 SSH 身份认证的密钥。密钥由公钥和私钥组成，一个公钥只对应一个私钥，一个私钥也只对应一个公钥。 将 OpenSSH 格式的公钥文本追加到远程主机上的 ~rainux/.ssh/authorized_keys 文件里（~rainux 意为用户 rainux 的 HOME 目录）。注意公钥文本中应该没有换行符，一行就是一个公钥。 确保 ~rainux/.ssh/authorized_keys 权限为 600，~/rainux/.ssh 目录权限为 700，并且它们的所有者都是 rainux。 指定 SSH 客户端使用对应的私钥并以用户 rainux 的身份登录 www.rainux.org，此时无需输入 rainux 在 www.rainux.org 上的密码。 注意，如果私钥是以加密形式存储的（强烈建议使用一个强壮的密码加密私钥，这样即使私钥文件被窃取，也无法被直接使用），第四步仍然需要输入加密私钥所用的密码。但是 PuTTY 和 OpenSSH 都有提供一个代理程序用于避免多次重复输入密码。运行代理程序后将私钥添加到其中，并且输入一次加密私钥所用的密码，然后保持代理程序的运行，以后 SSH 客户端即可在需要使用私钥进行身份认证的场合请求代理程序去完成身份认证（这是为了确保私钥不会被泄漏到任何使用代理程序的客户端上），无须再次输入任何密码。 Linux / Cygwin [...]]]></description>
			<content:encoded><![CDATA[<h2>概述</h2>

<p>假设要以用户 rainux 的身份登录运行 OpenSSH Server 的远程主机 www.rainux.org（现在几乎所有的 Linux 服务器都使用 OpenSSH Server 作为 SSH Server），那么需要做的操作如下：</p>

<ol>
<li><p>生成用于 SSH 身份认证的密钥。密钥由公钥和私钥组成，一个公钥只对应一个私钥，一个私钥也只对应一个公钥。</p></li>
<li><p>将 OpenSSH 格式的公钥文本追加到远程主机上的 <code>~rainux/.ssh/authorized_keys</code> 文件里（<code>~rainux</code> 意为用户 rainux 的 HOME 目录）。注意公钥文本中应该没有换行符，一行就是一个公钥。</p></li>
<li><p>确保 <code>~rainux/.ssh/authorized_keys</code> 权限为 600，<code>~/rainux/.ssh</code> 目录权限为 700，并且它们的所有者都是 rainux。</p></li>
<li><p>指定 SSH 客户端使用对应的私钥并以用户 rainux 的身份登录 www.rainux.org，此时无需输入 rainux 在 www.rainux.org 上的密码。</p></li>
</ol>

<p>注意，如果私钥是以加密形式存储的（强烈建议使用一个强壮的密码加密私钥，这样即使私钥文件被窃取，也无法被直接使用），第四步仍然需要输入加密私钥所用的密码。但是 PuTTY 和 OpenSSH 都有提供一个代理程序用于避免多次重复输入密码。运行代理程序后将私钥添加到其中，并且输入一次加密私钥所用的密码，然后保持代理程序的运行，以后 SSH 客户端即可在需要使用私钥进行身份认证的场合请求代理程序去完成身份认证（这是为了确保私钥不会被泄漏到任何使用代理程序的客户端上），无须再次输入任何密码。</p>

<h2>Linux / Cygwin / MSYS 上使用 OpenSSH Client</h2>

<h3>生成密钥</h3>

<p>执行 <code>ssh-keygen</code> 接受默认文件名，并且输入加密私钥用的密码（passphrase）即可生成私钥 <code>~/.ssh/id_rsa</code> 和对应的公钥 <code>~/.ssh/id_rsa.pub</code>。其中 <code>id_rsa.pub</code> 的内容可以直接追加到远程主机的 <code>authorized_keys</code> 文件里。</p>

<h3>使用私钥</h3>

<p>把公钥部署到远程主机上后，即可直接执行 <code>ssh rainux@www.rainux.org</code> 来登录远程主机。但如果私钥是加密形式保存，如上所述应该使用代理程序 ssh-agent 来避免每次输入密码。</p>

<p>直接执行 <code>ssh-add</code> 命令可以添加刚才生成的私钥到 ssh-agent 里，也可以用 <code>ssh-add -l</code> 查看已经添加的私钥。如果执行 ssh-add 时提示无法连接身份认证代理，则需要使用以下命令来启动 ssh-agent。</p>

<pre name="code" class="bash">eval `ssh-agent`
</pre>

<p>使用 eval 是为了执行 ssh-agent 输出的设置环境变量的 bash 命令，以确保 ssh-add 可以通过 <code>SSH_AUTH_SOCK</code> 环境变量找到 ssh-agent。</p>

<p>GNOME 的桌面系统如果有安装 gnome-keyring，它会自动管理 ssh-agent，通常甚至无须手工添加私钥到 ssh-agent 里，第一次使用公钥时 gnome-keyring 就会提示输入一次密码，以后则不再需要。</p>

<h2>Windows 上使用 PuTTY</h2>

<h3>生成密钥</h3>

<p>到 <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> 的<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">下载页面</a>下载 <a href="http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.60-installer.exe">putty-0.60-installer.exe</a> 或者 <a href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.zip">putty.zip</a>，两者都包含 PuTTY 所有的组件。</p>

<p>安装好 PuTTY 之后（对于 zip 版本来说，解压到任意目录即可）运行 PuTTYGen 生成自己的密钥。选择密钥类型为 SSH-2 RSA，点击 Generate，按照提示在 PuTTYGen 窗口内随机移动鼠标直到进度条达到 100%，然后 PuTYYGen 会生成密钥并且显示其公钥部分信息。这里可以填写一个有意义的注释，然后输入一个用来加密私钥的强壮的密码（Key passphrase）。最后点击 Save private key 将私钥保存为一个 .ppk 文件。不需要单独 Save public key，因为 .ppk 文件里已经包含了公钥。并且通过 Save public key 保存出来的公钥文件格式与 OpenSSH 的格式并不相同，若要将公钥部署到使用 OpenSSH Server 的服务器上，只能使用 PuTTYGen 窗口上显示的那一段 Public key for pasting into OpenSSH authorized_keys file。</p>

<h3>使用私钥</h3>

<p>将公钥部署到远程主机上之后，使用 PuTTY 登录该远程主机时可以在 Connection > SSH > Auth 里选择用于身份认证的私钥文件。同样，如果私钥是加密形式保存，应该使用代理程序 Pageant 以避免每次输入密码。</p>

<p>最简单的办法是创建一个 Pageant 的快捷方式，并且将 .ppk 私钥文件作为参数加到快捷方式的“目标”栏里，添加之后看上去应该像这样：</p>

<pre name="code" class="cmd">C:\PuTTY\pageant.exe D:\main.ppk "D:\My Secrets\secondary.ppk"
</pre>

<p>就像上面的例子一样，如果私钥文件路径中带有空格，应该使用引号将其括起来。通过这个快捷方式启动 Pageant 则会自动装载指定的私钥文件，并且立即询问用于加密私钥的密码。以后只要保持 Pageant 的运行，并且在 PuTTY 的某个 Saved session 里设置 Connnection > Data 里设置 Auto-login username，即可实现双击该 session 则完全自动登录。</p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/openssh-public-key-authentication-guide-automatic-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决 ssh 创建连接极慢的问题</title>
		<link>http://rainux.org/%e8%a7%a3%e5%86%b3-ssh-%e5%88%9b%e5%bb%ba%e8%bf%9e%e6%8e%a5%e6%9e%81%e6%85%a2%e7%9a%84%e9%97%ae%e9%a2%98</link>
		<comments>http://rainux.org/%e8%a7%a3%e5%86%b3-ssh-%e5%88%9b%e5%bb%ba%e8%bf%9e%e6%8e%a5%e6%9e%81%e6%85%a2%e7%9a%84%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Wed, 18 Jun 2008 14:08:56 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/06/18/229</guid>
		<description><![CDATA[做 Web 开发的工作经常需要 ssh 或者 scp 连接一堆远程主机，同样是 Linux 主机，其中一些创建 ssh 连接速度特别慢，连接建立之后执行操作速度却很正常，看来应该不是网络原因。 Google 了一下，这位老兄也遇到类似的问题，看完他描述的问题才知道可以用 ssh -v 来查看详细的连接建立过程，马上用一台建立连接很慢的主机试了一下，在一大堆输出信息中发现在这里停留最久: debug1: Authentications that can continue: publickey,gssapi-with-mic,password debug1: Next authentication method: gssapi-with-mic debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache found [...]]]></description>
			<content:encoded><![CDATA[<p>做 Web 开发的工作经常需要 ssh 或者 scp 连接一堆远程主机，同样是 Linux 主机，其中一些创建 ssh 连接速度特别慢，连接建立之后执行操作速度却很正常，看来应该不是网络原因。</p>

<p>Google 了一下，<a href="http://www.beowulf.org/archive/2002-August/007894.html">这位老兄</a>也遇到类似的问题，看完他描述的问题才知道可以用 ssh -v 来查看详细的连接建立过程，马上用一台建立连接很慢的主机试了一下，在一大堆输出信息中发现在这里停留最久:</p>

<pre><code>debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No credentials cache found

debug1: Unspecified GSS failure.  Minor code may provide more information
No credentials cache found

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Next authentication method: publickey
</code></pre>

<p>原来是因为尝试了个没有意义而且会失败的 gssapi-with-mic 认证方式浪费了时间，打开 /etc/ssh/ssh_config 把里面的 GSSAPIAuthentication yes 改成 no 关掉它，即可让 ssh 直接尝试美妙的 publickey 认证方式。</p>

<p>禁用 GSSAPIAuthentication 前后建立 ssh 连接时间的对比:</p>

<pre name="code" class="bash">rainux@mutalisk:~$ time ssh root@i-will-not-tell-you.com exit

real    0m18.488s
user    0m0.004s
sys     0m0.008s
rainux@mutalisk:~$ time ssh root@i-will-not-tell-you.com exit

real    0m3.531s
user    0m0.016s
sys     0m0.000s
</pre>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/ssh/" title="ssh" rel="tag">ssh</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e8%a7%a3%e5%86%b3-ssh-%e5%88%9b%e5%bb%ba%e8%bf%9e%e6%8e%a5%e6%9e%81%e6%85%a2%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>六月真是个好时节啊</title>
		<link>http://rainux.org/%e5%85%ad%e6%9c%88%e7%9c%9f%e6%98%af%e4%b8%aa%e5%a5%bd%e6%97%b6%e8%8a%82%e5%95%8a</link>
		<comments>http://rainux.org/%e5%85%ad%e6%9c%88%e7%9c%9f%e6%98%af%e4%b8%aa%e5%a5%bd%e6%97%b6%e8%8a%82%e5%95%8a#comments</comments>
		<pubDate>Thu, 05 Jun 2008 02:44:46 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Web Development 织网]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Web_Development_织网]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/06/05/228</guid>
		<description><![CDATA[Ruby 1.8.7 和 Rails 2.1.0 前两天相继发布。Firefox 3.0 昨天进入 rc2 阶段，并且将在六月中旬发布 3.0 正式版。开发了十五年的 Wine 终于进入 1.0 的 rc 阶段，并且即将发布 1.0 正式版。 看来是时候更新 SCV Selector 了，可惜预想了很久的 rep 版本识别还是没有时间去研究…… 标签：Software_软件, Web_Development_织网]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ruby-lang.org/en/news/2008/05/31/ruby-1-8-7-has-been-released/">Ruby 1.8.7</a> 和 <a href="http://blog.rubyonrails.org/2008/6/1/rails-2-1-time-zones-dirty-caching-gem-dependencies-caching-etc">Rails 2.1.0</a> 前两天相继发布。<a href="http://www.mozilla.com/en-US/firefox/3.0rc2/releasenotes/">Firefox 3.0 昨天进入 rc2 阶段</a>，并且将在六月中旬发布 3.0 正式版。开发了十五年的 <a href="http://wiki.winehq.org/WineReleasePlan">Wine 终于进入 1.0 的 rc 阶段</a>，并且即将发布 1.0 正式版。</p>

<p>看来是时候更新 SCV Selector 了，可惜预想了很久的 rep 版本识别还是没有时间去研究……</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/web_development_%e7%bb%87%e7%bd%91/" title="Web_Development_织网" rel="tag">Web_Development_织网</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e5%85%ad%e6%9c%88%e7%9c%9f%e6%98%af%e4%b8%aa%e5%a5%bd%e6%97%b6%e8%8a%82%e5%95%8a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在 Debian lenny amd64 里安装 Iceweasel/Firefox 的 Flash 播放器插件</title>
		<link>http://rainux.org/install-flash-plugin-for-iceweasel-firefox-on-debian-lenny-amd64</link>
		<comments>http://rainux.org/install-flash-plugin-for-iceweasel-firefox-on-debian-lenny-amd64#comments</comments>
		<pubDate>Wed, 04 Jun 2008 07:25:38 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/06/04/227</guid>
		<description><![CDATA[最近需要测试 Flash 内容，搜到了这个很简单的办法，原文是针对 etch 的，对于 lenny 来说更简单，官方仓库里已经有 nspluginwrapper 了，直接 apt 安装即可。 aptitude install nspluginwrapper 然后在自己的账户（非 root 账户）里下载 Adobe 的 flash player 并使用 nspluginwrapper 安装为 Iceweasel/Firefox 的插件即可。 wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_9_linux.tar.gz tar -zxf install_flash_player_9_linux.tar.gz mkdir ~/.mozilla/plugins/ mv install_flash_player_9_linux/libflashplayer.so ~/.mozilla/plugins/ nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so # Start/restart iceweasel/firefox/whatever 标签：GNU/Linux, Software_软件]]></description>
			<content:encoded><![CDATA[<p>最近需要测试 Flash 内容，搜到了这个<a href="http://www.fsckin.com/2007/09/20/how-to-install-adobe-flash-player-for-amd64-64-bit-on-debian-etch/">很简单的办法</a>，原文是针对 etch 的，对于 lenny 来说更简单，官方仓库里已经有 nspluginwrapper 了，直接 apt 安装即可。</p>

<pre name="code" class="bash">aptitude install nspluginwrapper
</pre>

<p>然后在自己的账户（非 root 账户）里下载 Adobe 的 flash player 并使用 nspluginwrapper 安装为 Iceweasel/Firefox 的插件即可。</p>

<pre name="code" class="bash">wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_9_linux.tar.gz
tar -zxf install_flash_player_9_linux.tar.gz
mkdir ~/.mozilla/plugins/
mv install_flash_player_9_linux/libflashplayer.so ~/.mozilla/plugins/
nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so
# Start/restart iceweasel/firefox/whatever
</pre>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/install-flash-plugin-for-iceweasel-firefox-on-debian-lenny-amd64/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用 SVN 来管理 Vim 配置文件 .vimrc 及插件集</title>
		<link>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86</link>
		<comments>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86#comments</comments>
		<pubDate>Mon, 05 Nov 2007 14:42:27 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/11/05/187</guid>
		<description><![CDATA[注: 本文第一次写作时没有进行全面的测试，由于 svn update 操作更新文件时会破坏 NTFS 上的硬链接而导致第一次的方法无法正常使用。现在你看到的已经是新的方法。在此为我的疏忽向大家道歉。 现在我的生活早已离不开 Vim 了，无论是在公司还是在家里，无论是在本地计算机还是远程服务器上，Vim 必定是我使用得最多的程序之一。当然了，Vim 虽好，也一定要有符合自己习惯的 .vimrc 和插件集才能发挥出更大的潜能，让我们用得更爽。也就是说，.vimrc 肯定是会被经常修改的，插件集也应该会时常添加新成员或进行版本更新。显然，要在家里和公司以及一些远程服务器之间频繁地同步这些修改是件很烦人的事。幸好，我们有 Subversion 可以让这一切变得简单。 让我们从公司的 Linux 桌面机上开始。 # 将 $HOME 里的 .vimrc 和 .vim 目录放到 vimfiles 目录里以便进行 SVN 导入操作 cd ~ mkdir vimfiles mv .vimrc vimfiles mv .vim vimfiles svn import vimfiles http://svn.rainux.org/vimfiles/trunk # 从 SVN 里 checkout 出一份 working copy 到 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>注: 本文第一次写作时没有进行全面的测试，由于 svn update 操作更新文件时会破坏 NTFS 上的硬链接而导致第一次的方法无法正常使用。现在你看到的已经是新的方法。在此为我的疏忽向大家道歉。</strong></p>

<p>现在我的生活早已离不开 Vim 了，无论是在公司还是在家里，无论是在本地计算机还是远程服务器上，Vim 必定是我使用得最多的程序之一。当然了，Vim 虽好，也一定要有符合自己习惯的 .vimrc 和插件集才能发挥出更大的潜能，让我们用得更爽。也就是说，.vimrc 肯定是会被经常修改的，插件集也应该会时常添加新成员或进行版本更新。显然，要在家里和公司以及一些远程服务器之间频繁地同步这些修改是件很烦人的事。幸好，我们有 Subversion 可以让这一切变得简单。</p>

<p>让我们从公司的 Linux 桌面机上开始。</p>

<pre name="code" class="bash"># 将 $HOME 里的 .vimrc 和 .vim 目录放到 vimfiles 目录里以便进行 SVN 导入操作
cd ~
mkdir vimfiles
mv .vimrc vimfiles
mv .vim vimfiles
svn import vimfiles http://svn.rainux.org/vimfiles/trunk
# 从 SVN 里 checkout 出一份 working copy 到 $HOME 里，
# 并且设置忽略掉 $HOME 里其他所有文件
svn co http://svn.rainux.org/vimfiles/trunk .
svn ps svn:ignore '*' .
svn ci -m "Let's ignore all files those not managed by Subversion in $HOME."
# 用来进行导入操作的 vimfiles 目录已经不再有任何存在的意义了
rm -rf vimfiles
</pre>

<p>好了，我们的 .vimrc 和插件集已经版本化了，下班回家。</p>

<pre name="code" class="cmd"># 先备份一下家里 Windows 上的文件，这假设我们没有使用 Cygwin
CD %HOME%
MOVE .vimrc .vimrc.backup
MOVE vimfiles vimfiles.backup
svn co http://svn.rainux.org/vimfiles/trunk .
</pre>

<p>现在我们遇到问题了，Vim 在 Windows 上会尝试从 %HOME%\vimfiles 目录加载用户脚本，而不会理会 %HOME%&#92;.vim 目录。我的解决办法是为 .vim 目录建立符号链接 vimfiles，这需要 %HOME% 所在分区必须是 NTFS 文件系统。新的问题是 Windows 本身并没有附带创建符号链接的工具，需要用 Sysinternals 提供的命令行工具 <a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx">junction.exe</a> 或者 Windows 2000 Resource Kit 里的 linkd.exe 来创建。</p>

<pre name="code" class="cmd">CD %HOME%
junction vimfiles .vim
</pre>

<p>OK，开始享受 Subversion 为我们带来的便利吧！不仅仅可以方便的同步在公司和在家里对 .vimrc 及插件集的修改，在远程服务器上要取得这些最新的修改也变得非常容易。什么，某个服务器上还在使用古老的 Vim 6.3 ？没有关系，为 http://svn.rainux.org/vimfiles 创建一个名为 6.x 的 branch，删掉无法用于 6.x 的插件即可。</p>

<p>最后，如果你对我的 Vim 配置感兴趣，可以从上面提到的 URL 里 checkout 一份出来看看，是的，它是真实的 URL。:)</p>

<p>Update: <ins datetime="2009-02-21T02:10:49+00:00">作为狂热的 Git 爱好者，我已经使用 Git 来管理我的 Vim 配置文件了，请访问<a href="/my-vimrc">我的 Vim 配置文件</a>页面。</ins></p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/subversion/" title="Subversion" rel="tag">Subversion</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vim? Emacs!</title>
		<link>http://rainux.org/vim-emacs</link>
		<comments>http://rainux.org/vim-emacs#comments</comments>
		<pubDate>Fri, 02 Nov 2007 16:38:38 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Funny 搞笑]]></category>
		<category><![CDATA[Personal 个人]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[Funny_搞笑]]></category>
		<category><![CDATA[Personal_个人]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/11/03/186</guid>
		<description><![CDATA[我: Hmmm，你的 Emacs 编辑 Rails 项目明显没有偶的 Vim 爽嘛，连 RHTML 里的 Ruby 代码都没法语法高亮。 W 君: （看了偶演示 Vim + rails.vim 后）确实不太方便。 我: 那何不转过来用 Vim？反正 Vim 你也经常用（W 是 Linux 系统管理员）。 W 君: 不行，我用 Emacs 是有很特殊的原因地。 我: ？ W 君: …… 我: ……？ W 君: …… 因为 Emacs 的图标是牛啊。（同事 W 君是股民 -_-b） 我: …… 狂晕！ 标签：Emacs, Funny_搞笑, Personal_个人, Software_软件, [...]]]></description>
			<content:encoded><![CDATA[<p>我: Hmmm，你的 Emacs 编辑 Rails 项目明显没有偶的 Vim 爽嘛，连 RHTML 里的 Ruby 代码都没法语法高亮。</p>

<p>W 君: （看了偶演示 Vim + <a href="http://rails.vim.tpope.net">rails.vim</a> 后）确实不太方便。</p>

<p>我: 那何不转过来用 Vim？反正 Vim 你也经常用（W 是 Linux 系统管理员）。</p>

<p>W 君: 不行，我用 Emacs 是有很特殊的原因地。</p>

<p>我: ？</p>

<p>W 君: ……</p>

<p>我: ……？</p>

<p>W 君: …… 因为 Emacs 的图标是牛啊。（同事 W 君是股民 -_-b）</p>

<p>我: …… 狂晕！</p>

	标签：<a href="http://rainux.org/tag/emacs/" title="Emacs" rel="tag">Emacs</a>, <a href="http://rainux.org/tag/funny_%e6%90%9e%e7%ac%91/" title="Funny_搞笑" rel="tag">Funny_搞笑</a>, <a href="http://rainux.org/tag/personal_%e4%b8%aa%e4%ba%ba/" title="Personal_个人" rel="tag">Personal_个人</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/vim-emacs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>修改已处于 SVN 版本控制下的项目的版本库布局</title>
		<link>http://rainux.org/%e9%87%8d%e6%96%b0%e8%a7%84%e5%88%92%e5%8f%8a%e4%bf%ae%e6%94%b9%e5%b7%b2%e5%a4%84%e4%ba%8e-svn-%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6%e4%b8%8b%e7%9a%84%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%89%88%e6%9c%ac%e5%ba</link>
		<comments>http://rainux.org/%e9%87%8d%e6%96%b0%e8%a7%84%e5%88%92%e5%8f%8a%e4%bf%ae%e6%94%b9%e5%b7%b2%e5%a4%84%e4%ba%8e-svn-%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6%e4%b8%8b%e7%9a%84%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%89%88%e6%9c%ac%e5%ba#comments</comments>
		<pubDate>Wed, 31 Oct 2007 18:22:39 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/11/01/185</guid>
		<description><![CDATA[按照《使用 Subversion 进行版本控制》 书中的建议，项目在被 import 到版本库前，最好能在项目根目录下建立 trunk、branches、tags 等目录，并将项目源代码存放在 trunk 子目录下，这将有利于工作中对相对稳定的项目做较大修改时创建分支。 但是一些历史项目，或者我们自己在对 Subversion 不够熟悉的情况下创建的项目，可能是直接把项目源代码存放在项目根目录里的，这种情况下要修改版本库布局，将所有文件移动到 trunk 子目录下就比较麻烦了。设想过使用 svn mv 命令应该可以做到，但是它会产生一个整个项目所有文件被移动的 revision，不但很不优雅，也不便于以后查看历史记录以及回溯到旧版本。 这种情况下我们可以这样做: 将整个项目的版本库导出为一个 dump 文件（它是一个可编辑的文本/二进制混合文件，其中包含了所有的 revision 记录）。 在 dump 文件中所有的路径前加上 trunk/ 前缀，使它们处于 trunk 子目录下。 在 dump 文件中 revision 1 里直接加入 trunk 等目录的创建。 删掉项目的版本库并重建新版本库，然后导入我们修改后的 dump 文件。 进行这样的操作后，项目的版本库状态就是从 revision 1 开始所有的文件就存在于 trunk 目录下了。 具体操作步骤，以在 Linux 命令行下为例: svnadmin dump /path_to_svn_repos/your_project [...]]]></description>
			<content:encoded><![CDATA[<p>按照<a href="http://svnbook.red-bean.com/">《使用 Subversion 进行版本控制》</a> 书中的建议，项目在被 import 到版本库前，最好能在项目根目录下建立 trunk、branches、tags 等目录，并将项目源代码存放在 trunk 子目录下，这将有利于工作中对相对稳定的项目做较大修改时创建分支。</p>

<p>但是一些历史项目，或者我们自己在对 Subversion 不够熟悉的情况下创建的项目，可能是直接把项目源代码存放在项目根目录里的，这种情况下要修改版本库布局，将所有文件移动到 trunk 子目录下就比较麻烦了。设想过使用 svn mv 命令应该可以做到，但是它会产生一个整个项目所有文件被移动的 revision，不但很不优雅，也不便于以后查看历史记录以及回溯到旧版本。</p>

<p>这种情况下我们可以这样做:</p>

<ol>
<li>将整个项目的版本库导出为一个 dump 文件（它是一个可编辑的文本/二进制混合文件，其中包含了所有的 revision 记录）。</li>
<li>在 dump 文件中所有的路径前加上 trunk/ 前缀，使它们处于 trunk 子目录下。</li>
<li>在 dump 文件中 revision 1 里直接加入 trunk 等目录的创建。</li>
<li>删掉项目的版本库并重建新版本库，然后导入我们修改后的 dump 文件。</li>
</ol>

<p>进行这样的操作后，项目的版本库状态就是从 revision 1 开始所有的文件就存在于 trunk 目录下了。</p>

<p>具体操作步骤，以在 Linux 命令行下为例:</p>

<pre name="code" class="bash">svnadmin dump /path_to_svn_repos/your_project &gt; your_project.svn_dump
vim -b your_project.svn_dump
# 以下为 Vim 命令
:%s/^Node-path:\s\+/\0trunk\//ge
:%s/^Node-copyfrom-path:\s\+/\0trunk\//ge
# Vim 命令结束
# 添加 trunk 等目录的创建，见后文详述
rm -rf /path_to_svn_repos/your_project
svnadmin create /path_to_svn_repos/your_project
svnadmin load /path_to_svn_repos/your_project &lt; your_project.svn_dump
</pre>

<p>注意一定要用 -b 参数启动 Vim，这样可以避免 Vim 在没有配置好多字节文件支持的选项时对 dump 文件可能的破坏。添加 trunk 等目录的方法是在 Revsion-number: 1 那一行后的第一个 PROPS-END 行后插入以下蓝色的代码。注意那些空行，有些是空一行有些是空两行，我是严格按照已有的目录的格式来写的，在没有看到这个 dump 文件的规格文档前最好连空行也照原样复制。</p>

<pre><code>...
Revision-number: 0
Prop-content-length: 56
Content-length: 56

K 8
svn:date
V 27
2007-10-11T14:15:09.781135Z
PROPS-END

Revision-number: 1
Prop-content-length: 100
Content-length: 100

K 7
svn:log
V 0

K 10
svn:author
V 6
rainux
K 8
svn:date
V 27
2007-10-11T14:15:48.344335Z
PROPS-END
</code></pre>

<div style="color: #6495ED"><pre><code>Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END


Node-path: branches
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END


Node-path: tags
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

</code></pre></div>

<pre><code>Node-path: trunk/README
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 8001
Text-content-md5: 2ffe7715fd6ba5509508a29022c22a17
Content-length: 8011

PROPS-END
== Welcome to Rails
...
</code></pre>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/subversion/" title="Subversion" rel="tag">Subversion</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e9%87%8d%e6%96%b0%e8%a7%84%e5%88%92%e5%8f%8a%e4%bf%ae%e6%94%b9%e5%b7%b2%e5%a4%84%e4%ba%8e-svn-%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6%e4%b8%8b%e7%9a%84%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%89%88%e6%9c%ac%e5%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>见到 Debian GNU/Linux 创始人 Ian Murdock 了</title>
		<link>http://rainux.org/%e8%a7%81%e5%88%b0-debian-gnulinux-%e5%88%9b%e5%a7%8b%e4%ba%ba-ian-murdock-%e4%ba%86</link>
		<comments>http://rainux.org/%e8%a7%81%e5%88%b0-debian-gnulinux-%e5%88%9b%e5%a7%8b%e4%ba%ba-ian-murdock-%e4%ba%86#comments</comments>
		<pubDate>Mon, 22 Oct 2007 15:34:21 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Personal 个人]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Personal_个人]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/10/22/182</guid>
		<description><![CDATA[四个小时前，在上海紫金山大酒店四楼的会场见到了自由软件社区的大哥级人物 Ian Murdock。一身白色 T shirt 的他看上去比活动宣传照上更年轻。 虽然了解、使用和喜爱 Debian 已经有四年了，但对于创始人 Ian Murdock 却没有太多的了解，只知道他现在为 Sun 工作，Debian 这个词源自他当时的女友（现在的妻子）Debra 和他自己名字的组合。很浪漫的命名方式，如果有机会，我也希望能做这样的事。 :) 看到活动的介绍后，才知道 Ian 还是 Linux Foundation 的 CTO，Linux Standard Base 的 Chief。 今天活动的主要内容是 Ian 的个人演讲和跟现场的 Linux 用户交流。给我的印象是 Ian 比较健谈，对大家提出的大多数问题都聊了很多。可惜，可惜，最大的遗憾是，他说的话有 95% 我都没听懂……-_-b 平时自诩流畅阅读英文技术文档的我，听力实在是太差了。（以后一定要经常对照字幕看原版电影来练习听力！） 晚上九点左右，活动结束后，Ian 还坐在舞台的一角为大家签名，跟大家合影。我也有幸跟他合影了一张（感谢好友 AKAI 帮助拍摄！），本来想说 "I've loved and enjoyed Debian for several years and will continue, many thanks [...]]]></description>
			<content:encoded><![CDATA[<p>四个小时前，在上海紫金山大酒店四楼的会场见到了自由软件社区的大哥级人物 Ian Murdock。一身白色 T shirt 的他看上去比活动宣传照上更年轻。</p>

<p>虽然了解、使用和喜爱 Debian 已经有四年了，但对于创始人 Ian Murdock 却没有太多的了解，只知道他现在为 Sun 工作，Debian 这个词源自他当时的女友（现在的妻子）Debra 和他自己名字的组合。很浪漫的命名方式，如果有机会，我也希望能做这样的事。 :) 看到活动的介绍后，才知道 Ian 还是 Linux Foundation 的 CTO，Linux Standard Base 的 Chief。</p>

<p>今天活动的主要内容是 Ian 的个人演讲和跟现场的 Linux 用户交流。给我的印象是 Ian 比较健谈，对大家提出的大多数问题都聊了很多。可惜，可惜，最大的遗憾是，他说的话有 95% 我都没听懂……-_-b 平时自诩流畅阅读英文技术文档的我，听力实在是太差了。（以后一定要经常对照字幕看原版电影来练习听力！）</p>

<p>晚上九点左右，活动结束后，Ian 还坐在舞台的一角为大家签名，跟大家合影。我也有幸跟他合影了一张（感谢好友 AKAI 帮助拍摄！），本来想说 "I've loved and enjoyed Debian for several years and will continue, many thanks to your hard work!"，不过没好意思说出口。-_-b</p>

<p>这次活动到会的粗略估计大概有四五百人，应该是超出了报名人数不少，以致于主办方准备的简单晚餐在还有很多人排队时就已经被“洗劫一空”了。</p>

<p>PS: 发现到会的 Geek 中 MM 还挺多的。</p>

<p><img src="/stuff/ian&amp;rainux.jpg" alt="Ian &amp; Rainux" /></p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/personal_%e4%b8%aa%e4%ba%ba/" title="Personal_个人" rel="tag">Personal_个人</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e8%a7%81%e5%88%b0-debian-gnulinux-%e5%88%9b%e5%a7%8b%e4%ba%ba-ian-murdock-%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>解决 gvimext 在 UTF-8 locale 下乱码的问题</title>
		<link>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98</link>
		<comments>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Tue, 19 Jun 2007 20:43:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[gVim]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/06/20/155</guid>
		<description><![CDATA[gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。 但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。 曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 [...]]]></description>
			<content:encoded><![CDATA[<p>gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。</p>

<p>但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。</p>

<p>曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 的值 (因为子进程默认会继承父进程的环境变量)。后来又想起了 Cygwin 里的 OUTPUT&#95;CHARSET 环境变量，可以在 gvimext 里将获取到的 UTF-8 消息文本使用 iconv() 转换为 OUTPUT_CHARSET 设定的编码，这样问题就可以圆满的解决了。</p>

<p>直到今天打算来实施这个想法时，又回头去看了一下以前 Google 到的这篇 <a href="http://www.linuxselfhelp.com/HOWTO/Unicode-HOWTO-3.html">The Unicode HOWTO: Locale setup</a>，才发现原来 glibc 本来就有这样的自动编码转换能力，并且 2.2 以后的版本也不再需要设定 OUTPUT&#95;CHARSET 了。偶太无知无畏了……</p>

<p>那么 gVim 安装版里的 libintl.dll 肯定不是 gcc 编译的，所以没有自动编码转换能力导致乱码，用 PEiD 看了一下果然是 MS VC 6.0 编译。接下来就简单了，去 <a href="http://gnuwin32.sourceforge.net/">GnuWin32</a> 的 <a href="http://gnuwin32.sourceforge.net/packages/libintl.htm">LibIntl</a> 页面下载 Binaries 和 Dependencies 两个压缩包，取得其中的 libintl3.dll 和 libiconv2.dll，前者改名为 libintl.dll (gVim 被硬编码为只尝试载入 libintl.dll 这个文件，想了想没必要改源代码，因为以后 LibIntl 出了新版本 libintl3.dll 里的 3 还会变化)。然后将这两个文件放到 PATH 环境变量中列出的任意一个目录里，最后删掉 gVim 安装目录下的 libintl.dll，OK，一切都是那么完美了。:p</p>

	标签：<a href="http://rainux.org/tag/gvim/" title="gVim" rel="tag">gVim</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>一组能让你爽出内伤的 Vim motion</title>
		<link>http://rainux.org/%e4%b8%80%e7%bb%84%e8%83%bd%e8%ae%a9%e4%bd%a0%e7%88%bd%e5%87%ba%e5%86%85%e4%bc%a4%e7%9a%84-vim-motion</link>
		<comments>http://rainux.org/%e4%b8%80%e7%bb%84%e8%83%bd%e8%ae%a9%e4%bd%a0%e7%88%bd%e5%87%ba%e5%86%85%e4%bc%a4%e7%9a%84-vim-motion#comments</comments>
		<pubDate>Tue, 27 Mar 2007 15:56:16 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/03/28/149</guid>
		<description><![CDATA[Vim 用户都应该知道 Vim 的 Normal 模式下 operator + motion 组合的便利，比如 daw 删除光标下的普通单词以及其后的空格 ciW 删除光标下的以空格分隔的“单词”并进入插入模式 (i 表示 inner，不删除单词后的空格) yis 复制光标下的句子到默认寄存器 确实这几个都比较平淡无奇，不过请看以下这些 ci[ 删除一对 [] 中的所有字符并进入插入模式 ci( 删除一对 () 中的所有字符并进入插入模式 ci&#60; 删除一对 &#60;> 中的所有字符并进入插入模式 ci{ 删除一对 {} 中的所有字符并进入插入模式 cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式 ci" ci' ci&#96; 删除一对引号字符 (" 或 ' 或 &#96;) 中所有字符并进入插入模式 怎么样？ci[ ci&#60; cit 在编辑 PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Vim 用户都应该知道 Vim 的 Normal 模式下 operator + motion 组合的便利，比如</p>

<ul>
<li>daw 删除光标下的普通单词以及其后的空格</li>
<li>ciW 删除光标下的以空格分隔的“单词”并进入插入模式 (i 表示 inner，不删除单词后的空格)</li>
<li>yis 复制光标下的句子到默认寄存器</li>
</ul>

<p>确实这几个都比较平淡无奇，不过请看以下这些</p>

<ul>
<li>ci[ 删除一对 [] 中的所有字符并进入插入模式</li>
<li>ci( 删除一对 () 中的所有字符并进入插入模式</li>
<li>ci&lt; 删除一对 &lt;> 中的所有字符并进入插入模式</li>
<li>ci{ 删除一对 {} 中的所有字符并进入插入模式</li>
<li>cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式</li>
<li>ci" ci' ci&#96; 删除一对引号字符 (" 或 ' 或 &#96;) 中所有字符并进入插入模式</li>
</ul>

<p>怎么样？ci[ ci&lt; cit 在编辑 PHP 或者 HTML 源码时简直太爽了 (当然 matchit 插件增强的 motion % 也是必不可少的)，ci" ci' ci&#96; 几乎在编辑任何语言的源代码时修改字符串都会非常方便。不过可惜的是以上这些严格的说只能叫文本对象选择，不是 motion，因此只能跟在 v 命令或者某个 operator 后面。可恨用了两年 Vim 居然今天才想起查 Vim 帮助里的 motion.txt。 -_-b</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e4%b8%80%e7%bb%84%e8%83%bd%e8%ae%a9%e4%bd%a0%e7%88%bd%e5%87%ba%e5%86%85%e4%bc%a4%e7%9a%84-vim-motion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>搞定一个 BT 的 Apache URL Rewrite</title>
		<link>http://rainux.org/%e6%90%9e%e5%ae%9a%e4%b8%80%e4%b8%aa-bt-%e7%9a%84-apache-url-rewrite</link>
		<comments>http://rainux.org/%e6%90%9e%e5%ae%9a%e4%b8%80%e4%b8%aa-bt-%e7%9a%84-apache-url-rewrite#comments</comments>
		<pubDate>Wed, 21 Mar 2007 17:21:07 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/03/22/148</guid>
		<description><![CDATA[需求: 将 host/item.html?type=test rewrite 成 host/?q=item&#38;type=test 其中 item 和 test 是可变的，并且 ?type=test 可有可无。 解决: &#60;IfModule mod_rewrite.c&#62; RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^/[^/]+\.html$ RewriteCond %{QUERY_STRING} ^(type=.*)?$ RewriteRule ^([^/]+)\.html$ /?q=$1&#38;%1 [L] &#60;/IfModule&#62; 解释: ?type=test 是不会出现在 REQUEST&#95;URI 里的，必须使用 QUERY&#95;STRING 来获得它。 若有多个 RewriteCond，只能反向引用最后一个 RewriteCond 里的 pattern 的 group。 RewriteRule 后面的 pattern 是用来匹配当前 URL 的，当前 URL [...]]]></description>
			<content:encoded><![CDATA[<p>需求:</p>

<blockquote>
  <p>将 host/item.html?type=test<br />
  rewrite 成<br />
  host/?q=item&amp;type=test<br />
  其中 item 和 test 是可变的，并且 ?type=test 可有可无。  </p>
</blockquote>

<p>解决:</p>

<blockquote>
<pre><code>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/[^/]+\.html$
RewriteCond %{QUERY_STRING} ^(type=.*)?$
RewriteRule ^([^/]+)\.html$ /?q=$1&amp;%1 [L]
&lt;/IfModule&gt;
</code></pre>
</blockquote>

<p>解释:</p>

<ol>
<li>?type=test 是不会出现在 REQUEST&#95;URI 里的，必须使用 QUERY&#95;STRING 来获得它。</li>
<li>若有多个 RewriteCond，只能反向引用最后一个 RewriteCond 里的 pattern 的 group。</li>
<li>RewriteRule 后面的 pattern 是用来匹配当前 URL 的，当前 URL 不是 REQUEST&#95;URI。因为(因此？)它会比 REQUEST&#95;URI 少一个前导斜杠 "/"，并且它可能已经被前面的 RewriteRule 改变过。</li>
</ol>

<p>规则 BT 吧？第一个搞得我差点以为无解，第三个规则也消耗了我大量时间。本以为不用测试就能搞定的一个小问题居然花了 40 分钟左右才完成。-_-b</p>

	标签：<a href="http://rainux.org/tag/apache/" title="Apache" rel="tag">Apache</a>, <a href="http://rainux.org/tag/mod_rewrite/" title="mod_rewrite" rel="tag">mod_rewrite</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e6%90%9e%e5%ae%9a%e4%b8%80%e4%b8%aa-bt-%e7%9a%84-apache-url-rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vim 7.0c beta Win32 binary</title>
		<link>http://rainux.org/vim-70c-beta-win32-binary</link>
		<comments>http://rainux.org/vim-70c-beta-win32-binary#comments</comments>
		<pubDate>Mon, 03 Apr 2006 15:58:45 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=131</guid>
		<description><![CDATA[偶拿 Microsoft Visual C++ 7.1 编译的，非 OLE 的 GUI 版本和 console 版本。 四个文件保持目录结构解压到某个地方，运行其中的 install.exe 即可。需要注意的是这些压缩包中没有 iconv.dll 和 diff.exe。如果你认为自己解决这些问题比较麻烦，或许你应该等待偶发布 NSIS 的安装程序的版本。 下载: gvim70c.zip vim70clang.zip vim70crt.zip vim70cw32.zip 附上偶的 .vimrc 文件: .vimrc 标签：Software_软件, Vim, Windows]]></description>
			<content:encoded><![CDATA[<p>偶拿 Microsoft Visual C++ 7.1 编译的，非 OLE 的 GUI 版本和 console 版本。</p>

<p>四个文件保持目录结构解压到某个地方，运行其中的 install.exe 即可。需要注意的是这些压缩包中没有 iconv.dll 和 diff.exe。如果你认为自己解决这些问题比较麻烦，或许你应该等待偶发布 NSIS 的安装程序的版本。</p>

<p>下载:
<a href="/vim/gvim70c.zip">gvim70c.zip</a>
<a href="/vim/vim70clang.zip">vim70clang.zip</a>
<a href="/vim/vim70crt.zip">vim70crt.zip</a>
<a href="/vim/vim70cw32.zip">vim70cw32.zip</a></p>

<p>附上偶的 .vimrc 文件:
<a href="/vim/.vimrc">.vimrc</a></p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/vim-70c-beta-win32-binary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编写INF文件进行文件安装[转载]</title>
		<link>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85</link>
		<comments>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85#comments</comments>
		<pubDate>Wed, 01 Mar 2006 18:17:11 +0000</pubDate>
		<dc:creator>急云</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=128</guid>
		<description><![CDATA[◆ 丁健 张万 江南 安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件，一般以INF作为扩展名，因此也叫INF文件。安装信息INF文件与 Windows内建的安装服务引擎(API函数库)紧密协同工作，基于其严格的编写语法制作而成的INF文件在拷贝、删除文件，增、删注册表键，更改系统设置等方面都有优秀的表现，完全可以用来实现应用程序文件安装的目标，而且价格免费，透明度高，安装程序小，可完全定制。INF文件是文本文件，可在任何文本编辑器内查看、创建、修改，普通用户使用Windows系统本身提供的记事本、写字板即可进行文件安装脚本的编写。 INF文件安装动作的触发机制 在文件目录中用鼠标右击INF文件，会显示不同于其他扩展名文件的“安装”菜单。Windows平台在计算机中完成初始安装后，就注册了INF文件的“安装”动作，此“安装”动作关联命令行程序基本形式为: RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name 如笔者目前正在使用的Windows 98系统注册表中，HKEYCLASSESROOT\inffile\install\ command键的默认值为（install即为安装）： C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1 其中，rundll程序以命令行的形式调用Windows的动态链接库，其命令格式为： rundll.exe &#60;DLL文件名>,&#60;入口点>,&#60;调用参数> setupx.dll 是安装API(Setup API)函数库，包含了InstallHinfSection、SetupGetInfSections、 SetupInstallFromInfSection、SetupPromptForDisk、SetupDiCreateDevRegKey等INF 文件内部语法检查、节名搜索、注册键创建等功能函数。setupx.dll与其后的入口点用逗号(,)分开，入口点是大小写敏感的。 Section是INF文件内初始执行节名，首先执行该节内容，默认情况下名称为“DefaultInstall”，系统用户一般不宜对此做任何改动，如被改动，则在后续INF文件的Install节使用相应修改后的名称。 reboot-mode是重启动参数，指示在INF文件执行后对系统的设置进行了改变，操作系统是否重新启动。该参数一般设为132或4，即由安装程序决定是否必须重启动，因为某些设置的改变必须在重启动后才能生效。 inf-name是INF文件的名称，“%1”即为所选中文件本身。 INF文件内部节(Section)的定义 INF 文件用特殊的文本文件格式编辑、保存，Windows内建的安装函数遵循既定的语法从INF文件内获取安装信息。INF文件和初始化(或称私有化， Private File)文件相似，采用节(Section)和入口(Entries)的索引机制，节和入口定义了所有操作类型及操作对象。一个INF文件由不同类型的节组成，每类节都有其特殊的目的和不同的实现语法，每节的内容均服务于该节的目的。除了基本的识别INF格式的“Version”节外，INF文件中节的数目和类型没有限制，主要取决于具体安装任务。一个基本的INF文件，一般包含如下几节： 表中黑体节名是保留关键字，名称固定，大小写不敏感，斜体节名名称任意，由INF文件编写者确定。每节的标题字符均用括号([])括起。 限于篇幅本文只对黑体节名做进一步的解释。 [Version]节 任何INF文件的第一个小节均是[Version]，又称为INF文件头。一般有如下语句： [Version] Signature=“$Chicago$” LayoutFile=filename.inf 其中，Signature的值应为“$Chicago$”、“$Windows 95$”或“$Windows NT$”中的一个(不区分大小写)，否则Windows不接受该文件为INF文件，内建的动作也就不会起作用。 filename.inf文件包含安装组件必需的安装布局信息(源盘和源文件)，该行是可选的，如果没有提供布局信息文件，则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节。 [Install]节 [Install]节提供了一个INF文件安装过程的总览，它识别文件内其他包含安装信息节的详细动作，是Windows内建安装函数识别安装过程和内容的真正入口，用户所有的安装目的在这里表现。那些与[Install]节内容不存在关联的节的动作将被忽略。 [Install] 节分[DefaultInstall]和[OtherInstall]两类，它们使用相同的格式。[DefaultInstall]节节名 “DefaultInstall”如前面表格内容所述被显式地在注册表中指定，大小写不敏感。该节也是系统获取INF文件中安装信息的首要入口，当用户右击INF文件选“安装”时该节内容被执行。[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用，常被用来定义反安装动作。它们均可包括以下种类的可选入口: CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section] [...]]]></description>
			<content:encoded><![CDATA[<p>◆ 丁健 张万 江南</p>

<p>安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件，一般以INF作为扩展名，因此也叫INF文件。安装信息INF文件与 Windows内建的安装服务引擎(API函数库)紧密协同工作，基于其严格的编写语法制作而成的INF文件在拷贝、删除文件，增、删注册表键，更改系统设置等方面都有优秀的表现，完全可以用来实现应用程序文件安装的目标，而且价格免费，透明度高，安装程序小，可完全定制。INF文件是文本文件，可在任何文本编辑器内查看、创建、修改，普通用户使用Windows系统本身提供的记事本、写字板即可进行文件安装脚本的编写。
<span id="more-128"></span>
INF文件安装动作的触发机制</p>

<p>在文件目录中用鼠标右击INF文件，会显示不同于其他扩展名文件的“安装”菜单。Windows平台在计算机中完成初始安装后，就注册了INF文件的“安装”动作，此“安装”动作关联命令行程序基本形式为:</p>

<p>RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name</p>

<p>如笔者目前正在使用的Windows 98系统注册表中，HKEY<em>CLASSES</em>ROOT\inffile\install\</p>

<p>command键的默认值为（install即为安装）：</p>

<p>C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1</p>

<p>其中，rundll程序以命令行的形式调用Windows的动态链接库，其命令格式为：</p>

<p>rundll.exe &lt;DLL文件名>,&lt;入口点>,&lt;调用参数></p>

<p>setupx.dll 是安装API(Setup API)函数库，包含了InstallHinfSection、SetupGetInfSections、 SetupInstallFromInfSection、SetupPromptForDisk、SetupDiCreateDevRegKey等INF 文件内部语法检查、节名搜索、注册键创建等功能函数。setupx.dll与其后的入口点用逗号(,)分开，入口点是大小写敏感的。</p>

<p>Section是INF文件内初始执行节名，首先执行该节内容，默认情况下名称为“DefaultInstall”，系统用户一般不宜对此做任何改动，如被改动，则在后续INF文件的Install节使用相应修改后的名称。</p>

<p>reboot-mode是重启动参数，指示在INF文件执行后对系统的设置进行了改变，操作系统是否重新启动。该参数一般设为132或4，即由安装程序决定是否必须重启动，因为某些设置的改变必须在重启动后才能生效。</p>

<p>inf-name是INF文件的名称，“%1”即为所选中文件本身。</p>

<p>INF文件内部节(Section)的定义</p>

<p>INF 文件用特殊的文本文件格式编辑、保存，Windows内建的安装函数遵循既定的语法从INF文件内获取安装信息。INF文件和初始化(或称私有化， Private File)文件相似，采用节(Section)和入口(Entries)的索引机制，节和入口定义了所有操作类型及操作对象。一个INF文件由不同类型的节组成，每类节都有其特殊的目的和不同的实现语法，每节的内容均服务于该节的目的。除了基本的识别INF格式的“Version”节外，INF文件中节的数目和类型没有限制，主要取决于具体安装任务。一个基本的INF文件，一般包含如下几节：</p>

<p><img src="http://www.xunchi.com/attachments/month_0511/y200511519430.jpg" alt="null" /></p>

<p>表中黑体节名是保留关键字，名称固定，大小写不敏感，斜体节名名称任意，由INF文件编写者确定。每节的标题字符均用括号([])括起。 限于篇幅本文只对黑体节名做进一步的解释。</p>

<p>[Version]节</p>

<p>任何INF文件的第一个小节均是[Version]，又称为INF文件头。一般有如下语句：</p>

<p>[Version]</p>

<p>Signature=“$Chicago$”</p>

<p>LayoutFile=filename.inf</p>

<p>其中，Signature的值应为“$Chicago$”、“$Windows 95$”或“$Windows NT$”中的一个(不区分大小写)，否则Windows不接受该文件为INF文件，内建的动作也就不会起作用。</p>

<p>filename.inf文件包含安装组件必需的安装布局信息(源盘和源文件)，该行是可选的，如果没有提供布局信息文件，则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节。</p>

<p>[Install]节</p>

<p>[Install]节提供了一个INF文件安装过程的总览，它识别文件内其他包含安装信息节的详细动作，是Windows内建安装函数识别安装过程和内容的真正入口，用户所有的安装目的在这里表现。那些与[Install]节内容不存在关联的节的动作将被忽略。</p>

<p>[Install] 节分[DefaultInstall]和[OtherInstall]两类，它们使用相同的格式。[DefaultInstall]节节名 “DefaultInstall”如前面表格内容所述被显式地在注册表中指定，大小写不敏感。该节也是系统获取INF文件中安装信息的首要入口，当用户右击INF文件选“安装”时该节内容被执行。[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用，常被用来定义反安装动作。它们均可包括以下种类的可选入口:</p>

<p>CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section]</p>

<p>RenFiles=file-list-section[,file-list-section]</p>

<p>DelFiles=file-list-section[,file-list-section]</p>

<p>UpdateInis=update-ini-section[,update-ini-section]</p>

<p>UpdateIniFields=update-inifields-section[,update-inifields-section]</p>

<p>AddReg=add-registry-section[,add-registry-section]</p>

<p>DelReg=del-registry-section[,del-registry-section]</p>

<p>Ini2Reg=ini-to-registry-section[,ini-to-registry-section]</p>

<p>UpdateCfgSys=update-config-section</p>

<p>UpdateAutoBat=update-autoexec-section</p>

<p>上面的入口并非都必需，如果需要一个入口，则应该在等号右侧指出存在于该INF文件内的索引节名(不用指出节名的一个特例是CopyFiles入口,可使用 “@”字符后跟文件名的形式，效果是直接将文件拷贝到DestinationDirs节所罗列的硬盘目录)。节名需由可打印字符组成，在中文系统平台中，可使用中文字符作为节名，这也是体现INF格式安装本地化的地方，非常直观。每类入口在一个[Install]节内只能出现一次，第二次及以后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名，节名之间以逗号分开，以便列举同一类动作的不同作用对象，如删除多个注册表键、拷贝文件到多个目录路径等。</p>

<p>下表是各类入口的动作含义，具体语法本文不做细述:
<img src="http://www.xunchi.com/attachments/month_0511/y200511519444.jpg" alt="null" /></p>

<p>在实际编写INF文件时，注册表根键通常采用缩写方式，如下表：</p>

<p><img src="http://www.xunchi.com/attachments/month_0511/e200511519452.jpg" alt="" /></p>

<p>[DestinationDirs]节</p>

<p>[DestinationDirs]节指定拷贝、重命名或删除文件三类动作的目的目录路径，拷贝、重命名或删除操作对象即文件的列表在专门的节中列出，这些节名最初在“Install”的CopyFiles、RenFiles或DelFiles入口中明确。</p>

<p>[DestinationDirs]节内语句的语法为：</p>

<p>file-list-section=LDID，[Subdir]</p>

<p>[DefaultDestDir=LDID，[Subdir]]</p>

<p>其中file-list-section为必选项，是CopyFiles、RenFiles或DelFiles入口内列出的节名。</p>

<p>LDID(Logical disk identifier)为必选项，是逻辑盘标识码，代表各种系统或实时安装路径，逻辑盘标识码可看做一种宏字符串，随系统或实时安装路径的不同而相应改变。逻辑盘标识码机制确保了安装的灵活性和正确性，该标识码可为下表所述值之一：</p>

<p>Subdir为可选项，指定LDID目录下的子目录名。</p>

<p>DefaultDestDir为可选项，指定CopyFiles、RenFiles或DelFiles入口的缺省操作目录。</p>

<p>[SourceDisksNames]节</p>

<p>[SourceDisksNames]节罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。</p>

<p>[SourceDisksNames]节内语句的语法为：</p>

<p>disk-ordinal=“disk-description”,disk-label,disk-serial-number</p>

<p>其中disk-ordinal为必选项，是盘符序列码，标识一个源盘，具有惟一性，一般可设置为从1开始递增的整数，0不是一个有效的盘符序列码。当存在多个源盘时，盘符序列码之间不能重复。</p>

<p>disk-description为必选项，是盘描述符，用双引号括起的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。</p>

<p>disk-label为源盘的卷标识。</p>

<p>disk-serial-number未使用，但必须被设置为0。</p>

<p>[SourceDisksFiles]节</p>

<p>[SourceDisksFiles]节指定安装时使用的源文件和盘符序列码、盘描述符。 [SourceDisksFiles]节内语句的语法为：</p>

<p>file-name=disk-number[,subdir] [,file-size]</p>

<p>其中file-name为必选项，是源盘上文件的名称。</p>

<p>disk-number是包含file-name指定文件所在源盘的盘符序列码，该盘符序列码需在[SourceDisksNames]节中列出,并大于或等于1。</p>

<p>Subdir为可选项，指定文件所在源盘的子目录，如省略则源盘为缺省安装路径。</p>

<p>file-size为可选项，表明文件的大小，以字节为单位。</p>

<p>[Strings]节</p>

<p>[Strings] 节定义一个或多个本地化字符串，或称字符串宏。尽管[Strings]节一般被放置在INF文件的末尾，字符串宏可在INF文件任何地方使用，安装引擎解释、展开字符串宏为给定的长字符串并做进一步处理。字符串宏在使用时需用百分号(%)括起。[Strings]节内语句的语法为：</p>

<p>strings-key=value</p>

<p>其中strings-key为由字母或数字等可打印字符组成的宏名。</p>

<p>Value为被双引号括起的长字符串，字符串可由字母、数字或其他可打印字符组成。</p>

<p>一个具体的安装实例</p>

<p>本文接下来列举一个名为“Mysetup.inf”的安装信息文件实例，以便读者熟悉INF文件语法，领略INF文件的安装效果。该 “Mysetup.inf”文件可完成如下的安装任务：假设应用程序有“MyApp.exe”、“MyApp.hlp”、“MyApp.dll”等几个需安装到应用程序主目录的文件，有“Ass<em>1.dll”、“Ass</em>2.dll”等几个需安装到Windows\System子目录的文件，要求将各文件按预定目录位置拷贝到位，其中应用程序主目录可在安装过程中选定，同时，在“开始>程序”下面建立名为“我的程序组”的程序组，在该程序组下建立名为“我的应用程序”、“我的应用程序帮助”的两个程序项，分别与“MyApp.exe”和“MyApp.hlp”文件关联。</p>

<p>完成上述安装任务的“Mysetup.inf”文件内容如下：</p>

<p><code>[Version]
signature=“$chicago$”</p>

<p>[AdvSetup]
HKLM,SOFTWARE\ Microsoft\Windows\CurrentVersion\Runonce\Setup，“INF制作安装程序”,, “RunDll32.exe“%01%”\advpack.dll,LaunchINFSection Mysetup.inf,DefaultInstall2”</p>

<p>[DefaultInstallX]</p>

<p>[DefaultInstall]</p>

<p>AddReg=AdvSetup</p>

<p>[DefaultInstall2]</p>

<p>CopyFiles = 拷贝到用户指定目录，拷贝到Windows\System子目录 ，……
CustomDestination=My-path
UpdateInis = 加exe文件快捷方式,加hlp文件快捷方式，……</p>

<p>[SourceDisksNames]
1=“文件所在目录”,,0</p>

<p>[SourceDisksFiles]
MyApp.exe.exe=1,,1021
MyApp.dll=1,,1021
MyApp.hlp=1,,1021
Ass<em>1.dll=1,,1021
Ass</em>2.dll=1,,1021</p>

<p>[DestinationDirs]
拷贝到用户指定目录 = 49000
拷贝到Windows\System子目录 = 11</p>

<p>[My-path]
49000,49001,49002,49003=index-again,1</p>

<p>[index-again]
“”，“”，“”,，““默认安装到“C:\MyApp”目录，可选择””，“%30%\MyApp”</p>

<p>[拷贝到用户指定目录]
MyApp.exe
MyApp.dll
MyApp.hlp</p>

<p>[拷贝到Windows\System子目录]
Ass<em>1.dll
Ass</em>2.dll</p>

<p>[加exe文件快捷方式]
setup.ini, progman.groups,, “group1=““我的程序组”””
setup.ini, group1,,“““我的应用程序””,““““““%49000%\MyApp.exe””””””,,,,,““MyApp.exe”””</p>

<p>[加hlp文件快捷方式]
setup.ini, progman.groups,, “group1=““我的程序组”””
setup.ini, group1,,“““我的应用程序帮助””,““““““%49000%\MyApp.hlp””””””,,,,,““MyApp.hlp”””
</code></p>

<p>读者会注意到上面的文件内许多键名使用了中文，这是因为INF格式文件支持中文提示及中文键名。这些中文键名不仅充当功能键起索引的作用，还形象化地标识了键的前后对应关系，增强了文件内容的可读性，有利于后续更改、维护。</p>

<p>安装时，首先确保应用程序的所有待安装文件和“Mysetup.inf” 文件处在同一个目录下，右击“Mysetup.inf”文件选“安装”或按Shift键的同时按功能键F10。待目录选择对话框出现，点击“浏览”按钮或直接在文本编辑框内键入目录名称后，屏幕显示文件安装拷贝和更新快捷方式进度，最终结束。</p>

<p>打开资源管理器，就可查看到所有文件均已拷贝到指定目录位置。点击“开始>程序”，可以找到“我的程序组”程序组及下属的“我的应用程序”、“我的应用程序帮助”程序项，选中程序项均能激活对应文件，说明文件安装及快捷方式关联均告成功。</p>

<p>小 结</p>

<p>本文介绍的文件安装方法适合于大众，读者可熟悉语法、参考例子、效仿编写，制作出自己的安装信息文件。</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>终于把 blog 从远古的 WordPress 1.2 升级到了 2.0</title>
		<link>http://rainux.org/%e7%bb%88%e4%ba%8e%e6%8a%8a-blog-%e4%bb%8e%e8%bf%9c%e5%8f%a4%e7%9a%84-wordpress-12-%e5%8d%87%e7%ba%a7%e5%88%b0%e4%ba%86-20</link>
		<comments>http://rainux.org/%e7%bb%88%e4%ba%8e%e6%8a%8a-blog-%e4%bb%8e%e8%bf%9c%e5%8f%a4%e7%9a%84-wordpress-12-%e5%8d%87%e7%ba%a7%e5%88%b0%e4%ba%86-20#comments</comments>
		<pubDate>Tue, 17 Jan 2006 02:25:26 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[General 普通]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=117</guid>
		<description><![CDATA[上周六完成了最近的工作，狂睡一天＋猛玩一天之后，昨晚花了一整夜的时间来进行升级工作。包括修改 WP 本身的少量代码，寻找插件的新版本并修改，以及完成去年三月就搁下的 Theme 移植（从 1.2 的 style 移植到 1.5 的 Theme）。是的，去年三月…… 意外的发现 MarkDown 这个超好用的写作插件，以前竟然一直无视了它的存在。 简单的说 MarkDown 可以让我们像写纯文本文件那样来写 HTML，再也不需要把 &#60; &#62; 写成 &#38;lt; &#38;gt; 了，直接书写 1. xxx 2. yyy 就可以产生 HTML 的有序列表，直接书写 * xxx * yyy 就可以产生 HTML 的无序列表等等。唯一不爽的是表示引用的效果需要用 Email 格式的 &#62; 符号，并且至少每个段落前面要有一个 &#62; 符号，这样就比直接使用 &#60;blockquote&#62; 麻烦多了，有空得研究一下如何修改它。 Update: 哈，原来要解决这个问题很简单，注释掉 markdown.php 中的这一行就可以了，目的是不去掉 WordPress 本身的段落自动转换过滤器。 //remove_filter('the_content', 'wpautop'); [...]]]></description>
			<content:encoded><![CDATA[<p>上周六完成了最近的工作，狂睡一天＋猛玩一天之后，昨晚花了一整夜的时间来进行升级工作。包括修改 WP 本身的少量代码，寻找插件的新版本并修改，以及完成去年三月就搁下的 Theme 移植（从 1.2 的 style 移植到 1.5 的 Theme）。是的，去年三月…… <img src="/face/025.gif" alt="025" /></p>

<p>意外的发现 MarkDown 这个超好用的写作插件，以前竟然一直无视了它的存在。<img src="/face/040.gif" alt="040" /> 简单的说 MarkDown 可以让我们像写纯文本文件那样来写 HTML，再也不需要把 &lt; &gt; 写成 &amp;lt; &amp;gt; 了，直接书写 1. xxx 2. yyy 就可以产生 HTML 的有序列表，直接书写 * xxx * yyy 就可以产生 HTML 的无序列表等等。唯一不爽的是表示引用的效果需要用 Email 格式的 &gt; 符号，并且至少每个段落前面要有一个 &gt; 符号，这样就比直接使用 &lt;blockquote&gt; 麻烦多了，有空得研究一下如何修改它。</p>

<p>Update: <ins datetime="2006-01-17T05:30:55+00:00">哈，原来要解决这个问题很简单，注释掉 markdown.php 中的这一行就可以了，目的是不去掉 WordPress 本身的段落自动转换过滤器。</ins></p>

<pre name="code" class="php">//remove_filter('the_content', 'wpautop');
</pre>

<p>另外发现要使 Auto-hyperlink URLs 和 MarkDown 一起工作的话必须把前者的过滤器优先级设置得比 MarkDown 高，否则也会出些莫名其妙的问题。打开 autohyperlink-urls.php 把最末尾的三行改成这样就行了。add_filter() 函数的第三个参数表示过滤器优先级，由以前的 9 改成 5，因为 MarkDown 的过滤器优先级是 6。</p>

<pre name="code" class="php">add_filter('the_content', 'c2c_hyperlink_urls', 5);
remove_filter('comment_text', 'make_clickable');
add_filter('comment_text', 'c2c_hyperlink_urls', 5);
</pre>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/wordpress/" title="WordPress" rel="tag">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e7%bb%88%e4%ba%8e%e6%8a%8a-blog-%e4%bb%8e%e8%bf%9c%e5%8f%a4%e7%9a%84-wordpress-12-%e5%8d%87%e7%ba%a7%e5%88%b0%e4%ba%86-20/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>AutoUpdateSoftOnSkycn.cmd</title>
		<link>http://rainux.org/autoupdatesoftonskycn-cmd/</link>
		<comments>http://rainux.org/autoupdatesoftonskycn-cmd/#comments</comments>
		<pubDate>Mon, 26 Dec 2005 17:26:40 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Programming 编程]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Programming_编程]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=115</guid>
		<description><![CDATA[在软件使用上，我一直都是个喜欢追新的人。 不过这么多年来一成不变的浏览器＋软件下载站＋手工浏览下载的模式已经让我厌倦了。懒人总是有懒人的办法，因此也就有了这个使用 Windows 命令行脚本编写的 AutoUpdateSoftOnSkycn.cmd。 AUSOS 的工作原理很简单，用 wget 取得软件下载站上的某个软件的介绍页面，然后使用 grep/sed 来分析页面的文本取得此软件的下载地址，再次使用 wget 取得这个软件。使这个工作流程能真正应用的重点在于，大多数软件站的某个具体软件的介绍页面地址都具有持久性，这是为了提高使用具体关键字时自己在搜索引擎中的排名，同时也方便用户访问和自己管理。 基于这个工作原理，AUSOS 稍加修改就可以适用于大多数软件下载站，实际上这也是我下一步的目标。不过这样一来配置文件 AUSOS.conf 和项目列表文件 ItemIDList.ini 就会复杂一些了，到时候也许会做一个 GUI，如果真的需要的话。 另外编码过程中发现 Win2k 以后 Windows 命令行脚本虽然增强了很多，但还是有些不便，也许以后会移植到 bash 脚本上，这样虽然看上去没那么 NB 了，不过可以做到跨平台。Windows 下用 Cygwin 里的 bash 来执行；Linux 自是不必说，bash 已经流行很多年了。 写完发给一个 coder 朋友看，他说“Windows shell script 都可以写那么长，你丫真素 YD。”，呵呵。 如果你有兴趣的话可以在线看看 AUSOS 在 Vim 中高亮后的代码。并且，使用说明也可以在这里比较方便的看到。 下载地址: AutoUpdateSoftOnSkycn.cmd v0.2 超微型的 Cygwin 环境，如果你和大多数人一样没有安装 Cygwin，那么请下载并解压到 [...]]]></description>
			<content:encoded><![CDATA[<p>在软件使用上，我一直都是个喜欢追新的人。</p>

<p>不过这么多年来一成不变的浏览器＋软件下载站＋手工浏览下载的模式已经让我厌倦了。懒人总是有懒人的办法，因此也就有了这个使用 Windows 命令行脚本编写的 AutoUpdateSoftOnSkycn.cmd。</p>

<p>AUSOS 的工作原理很简单，用 wget 取得软件下载站上的某个软件的介绍页面，然后使用 grep/sed 来分析页面的文本取得此软件的下载地址，再次使用 wget 取得这个软件。使这个工作流程能真正应用的重点在于，大多数软件站的某个具体软件的介绍页面地址都具有持久性，这是为了提高使用具体关键字时自己在搜索引擎中的排名，同时也方便用户访问和自己管理。</p>

<p>基于这个工作原理，AUSOS 稍加修改就可以适用于大多数软件下载站，实际上这也是我下一步的目标。不过这样一来配置文件 AUSOS.conf 和项目列表文件 ItemIDList.ini 就会复杂一些了，到时候也许会做一个 GUI，如果真的需要的话。</p>

<p>另外编码过程中发现 Win2k 以后 Windows 命令行脚本虽然增强了很多，但还是有些不便，也许以后会移植到 bash 脚本上，这样虽然看上去没那么 NB 了，不过可以做到跨平台。Windows 下用 Cygwin 里的 bash 来执行；Linux 自是不必说，bash 已经流行很多年了。</p>

<p>写完发给一个 coder 朋友看，他说“Windows shell script 都可以写那么长，你丫真素 YD。”，呵呵。<img src="/face/023.gif" alt="023" /></p>

<p>如果你有兴趣的话可以在线看看 <a href="/produce/AutoUpdateSoftOnSkycn.cmd.html">AUSOS 在 Vim 中高亮后的代码</a>。并且，使用说明也可以在这里比较方便的看到。</p>

<p>下载地址:<br />
<a href="/produce/AUSOS.7z">AutoUpdateSoftOnSkycn.cmd v0.2</a><br />
<a href="/produce/TinyCygwin.7z">超微型的 Cygwin 环境</a>，如果你和大多数人一样没有安装 Cygwin，那么请下载并解压到 AUSOS 所在目录或者 PATH 环境变量中列出的任何一个目录里。</p>

	标签：<a href="http://rainux.org/tag/programming_%e7%bc%96%e7%a8%8b/" title="Programming_编程" rel="tag">Programming_编程</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/autoupdatesoftonskycn-cmd/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>[转载]About vi &amp; emacs</title>
		<link>http://rainux.org/about-vi-emacs</link>
		<comments>http://rainux.org/about-vi-emacs#comments</comments>
		<pubDate>Thu, 15 Dec 2005 17:16:43 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Funny 搞笑]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Funny_搞笑]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=114</guid>
		<description><![CDATA[世界上有三种人，一种使用 vi，一种使用 emacs，另一种包括其他所有人。 “爸爸，我们为什么要躲避那些警察？” “因为我们用 vi，孩子，而他们用 emacs。” 标签：Funny_搞笑, Software_软件]]></description>
			<content:encoded><![CDATA[<p>世界上有三种人，一种使用 vi，一种使用 emacs，另一种包括其他所有人。</p>

<p>“爸爸，我们为什么要躲避那些警察？”
“因为我们用 vi，孩子，而他们用 emacs。”</p>

	标签：<a href="http://rainux.org/tag/funny_%e6%90%9e%e7%ac%91/" title="Funny_搞笑" rel="tag">Funny_搞笑</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/about-vi-emacs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>正确设置 Vim 的字符编码选项 (gVim/Vim on Win32 中文环境)</title>
		<link>http://rainux.org/vim-gvimvim-on-win32</link>
		<comments>http://rainux.org/vim-gvimvim-on-win32#comments</comments>
		<pubDate>Wed, 19 Oct 2005 17:16:07 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=106</guid>
		<description><![CDATA[和所有的流行文本编辑器一样，Vim 可以很好的编辑各种字符编码的文件，这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是，和很多来自 Linux 世界的软件一样，这需要你自己动手设置。 Vim 有四个跟字符编码方式有关的选项，encoding、fileencoding、fileencodings、termencoding（这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names），它们的意义如下: encoding: Vim 内部使用的字符编码方式，包括 Vim 的 buffer（缓冲区）、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值，事实上似乎也只有在 .vimrc 中改变它的值才有意义。 fileencoding: Vim 中当前编辑的文件的字符编码方式，Vim 保存文件时也会将文件保存为这种字符编码方式（不管是否新文件都如此）。 fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式，并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面，将拉丁语系编码方式 latin1 放到最后面。 termencoding: Vim 所工作的终端（或者 Windows 的 Console 窗口）的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效，而对 Console 模式的 Vim 而言就是 Windows [...]]]></description>
			<content:encoded><![CDATA[<p>和所有的流行文本编辑器一样，Vim 可以很好的编辑各种字符编码的文件，这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是，和很多来自 Linux 世界的软件一样，这需要你自己动手设置。</p>

<p>Vim 有四个跟字符编码方式有关的选项，encoding、fileencoding、fileencodings、termencoding（这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names），它们的意义如下:</p>

<ul>
<li>encoding: Vim 内部使用的字符编码方式，包括 Vim 的 buffer（缓冲区）、菜单文本、消息文本等。<del>用户手册上建议只在 .vimrc 中改变它的值，事实上似乎也只有在 .vimrc 中改变它的值才有意义。</del></li>
<li>fileencoding: Vim 中当前编辑的文件的字符编码方式，Vim 保存文件时也会将文件保存为这种字符编码方式（不管是否新文件都如此）。</li>
<li>fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式，并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面，将拉丁语系编码方式 latin1 放到最后面。</li>
<li>termencoding: Vim 所工作的终端（或者 Windows 的 Console 窗口）的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效，而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页，并且通常我们不需要改变它。</li>
</ul>

<p>好了，解释完了这一堆容易让新手犯糊涂的参数，我们来看看 Vim 的多字符编码方式支持是如何工作的。</p>

<ol>
<li>Vim 启动，根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。</li>
<li>读取需要编辑的文件，根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的，看起来是正确的（<a href="#note1">注1</a>）字符编码方式。</li>
<li>对比 fileencoding 和 encoding 的值，若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式，并且把转换后的内容放到为此文件开辟的 buffer 里，此时我们就可以开始编辑这个文件了。注意，完成这一步动作需要调用外部的 iconv.dll（<a href="#note2">注2</a>），你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。</li>
<li>编辑完成后保存文件时，再次对比 fileencoding 和 encoding 的值。若不同，再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式，并保存到指定的文件中。同样，这需要调用 iconv.dll</li>
</ol>

<p>由于 Unicode 能够包含几乎所有的语言的字符，而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式（空间消耗比 UCS-2 小），因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时，Vim 自动探测文件的编码方式会更准确（或许这个理由才是主要的 ;）。我们在中文 Windows 里编辑的文件，为了兼顾与其他软件的兼容性，文件编码还是设置为 GB2312/GBK 比较合适，因此 fileencoding 建议设置为 chinese（chinese 是个别名，在 Unix 里表示 gb2312，在 Windows 里表示 cp936，也就是 GBK 的代码页）。</p>

<p>以下是我的 .vimrc 中关于字符编码方式设置的内容，这个设置比较有弹性，可以根据系统中的环境变量 $LANG（当然，Windows 中的写法是 %LANG%）的值来自动设置合适的字符编码方式。此时，推荐设置 %LANG% = zh_CN.UTF-8，可以通过后面的 Windows 注册表脚本文件来方便的做到。</p>

<pre name="code" class="vim">" Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!

if has("multi_byte")
  " When 'fileencodings' starts with 'ucs-bom', don't do this manually
  " set bomb
  set fileencodings=ucs-bom,chinese,taiwan,japan,korea,utf-8,latin1
  " CJK environment detection and corresponding setting
  if v:lang =~ "^zh_CN"
    " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
    set encoding=chinese
    set termencoding=chinese
    if &amp;fileencoding == ''
      set fileencoding=chinese
    endif
  elseif v:lang =~ "^zh_TW"
    " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
    set encoding=taiwan
    set termencoding=taiwan
    if &amp;fileencoding == ''
      set fileencoding=taiwan
    endif
  elseif v:lang =~ "^ja_JP"
    " Japanese, on Unix euc-jp, on MS-Windows cp932
    set encoding=japan
    set termencoding=japan
    if &amp;fileencoding == ''
      set fileencoding=japan
    endif
  elseif v:lang =~ "^ko"
    " Korean on Unix euc-kr, on MS-Windows cp949
    set encoding=korea
    set termencoding=korea
    if &amp;fileencoding == ''
      set fileencoding=korea
    endif
  endif
   " Detect UTF-8 locale, and override CJK setting if needed
  if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
    set encoding=utf-8
  endif
else
  echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif
</pre>

<p>Windows 注册表脚本。</p>

<pre><code>Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\\Environment]
"LANG"="zh_CN.UTF-8"
</code></pre>

<p><a name="note1">注1</a>: 事实上，Vim 的探测准确度并不高，尤其是在 encoding 没有设置为 utf-8 时。因此强烈建议将 encoding 设置为 utf-8<del datetime="2007-04-08T14:49:42+00:00">，虽然<ins datetime="2005-9-21T13:23:5--8:00">如果你想 Vim 显示中文菜单和提示消息的话</ins>这样会带来另一个小问题。参见另一篇 Win32 下 Vim 设置 enconding 为 utf-8 会在显示特定消息时崩溃</del>。（此处提到的崩溃问题在 gVim 7.0 beta 时代就已经被解决了。）</p>

<p><a name="note2">注2</a>: 在 GNU 的 FTP 上可以下载到 <a href="http://mirrors.kernel.org/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip">iconv 的 Win32 版</a>，不推荐去 <a href="http://gnuwin32.sourceforge.net">GnuWin32</a> 下载 libiconv，因为那个版本旧一些，并且需要自己改名 dll 文件。</p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/vim-gvimvim-on-win32/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>回到 Vim，回到 GNU/Linux</title>
		<link>http://rainux.org/%e5%9b%9e%e5%88%b0-vim%ef%bc%8c%e5%9b%9e%e5%88%b0-gnulinux</link>
		<comments>http://rainux.org/%e5%9b%9e%e5%88%b0-vim%ef%bc%8c%e5%9b%9e%e5%88%b0-gnulinux#comments</comments>
		<pubDate>Tue, 08 Mar 2005 17:47:04 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=102</guid>
		<description><![CDATA[还记得几年前初次接触 GNU/Linux 时，听说 GNU/Linux 下最常用的文本编辑器叫做 vi。在 DOS/Windows 下已经生活了一两年的我，自然知道文本编辑器的重要性。于是尝试输入 vi 启动这个被众多 GNU/Linux 用户“吹捧”的著名文本编辑器。 "Oh, shit!" 这是什么怪物？作为文本编辑器它居然就给我一个没有菜单的，只显示了一些莫名其妙的 ~ 符号和它自己名字的黑屏幕。最要命的是在我按了几个字母键之后，它居然除了让机箱里的 speaker 吱吱叫几声之外没有任何反应！ 当然，后来看了一些介绍后才知道 vi（其实当时我使用的并不是古董级的 vi，而是 vi 的一个非常流行的增强型变体 Vim——Vi IMproved）有几种不同的工作模式，启动之后默认是命令模式，需要使用一些特定的命令才能进入插入模式像我们习惯的文本编辑器那样输入内容。看上去这样好像很不方便，但习惯之后就会觉得非常的爽。因为使用命令模式下那些简洁的命令，绝大多数操作双手都不必离开字母区域。比如最常用到的光标的四个方向移动，Vim 使用命令模式下的 h j k l 四个键来代表←↓↑→四个方向键。同样常用的翻页功能，Vim 使用命令模式下的 Ctrl + B 和 Ctrl + F 来代表 Page Up 和 Page Down。这样移动光标时手根本不需要移动，而翻页时也只需要左手稍微倾斜一下，这种感觉实在是太爽了。 不过来自 GNU/Linux 世界的 Vim 跟大多数 GNU/Linux 下的软件一样不太适合普通用户，它们带有的“黑客色彩”太浓重了。功能太强以至于让它们本身变得很复杂，加上不够友好的用户界面、一大堆的简洁至极的命令/参数缩写，这些足以让一个普通计算机用户望而生畏。但是在经过一段时间（或许是一段较长的时间）的熟悉之后，它们会变成你手中的一件利器，那时你就会发现以前的付出得到了数倍的回报，正所谓“磨刀不误杀人功”。 Win32 版本的 [...]]]></description>
			<content:encoded><![CDATA[<p>还记得几年前初次接触 <a href="http://www.gnu.org/gnu/linux-and-gnu.cn.html">GNU/Linux</a> 时，听说 GNU/Linux 下最常用的文本编辑器叫做 vi。在 DOS/Windows 下已经生活了一两年的我，自然知道文本编辑器的重要性。于是尝试输入 vi 启动这个被众多 GNU/Linux 用户“吹捧”的著名文本编辑器。</p>

<p>"Oh, shit!" 这是什么怪物？作为文本编辑器它居然就给我一个没有菜单的，只显示了一些莫名其妙的 ~ 符号和它自己名字的黑屏幕。最要命的是在我按了几个字母键之后，它居然除了让机箱里的 speaker 吱吱叫几声之外没有任何反应！</p>

<p>当然，后来看了一些介绍后才知道 vi（其实当时我使用的并不是古董级的 vi，而是 vi 的一个非常流行的增强型变体 Vim——Vi IMproved）有几种不同的工作模式，启动之后默认是命令模式，需要使用一些特定的命令才能进入插入模式像我们习惯的文本编辑器那样输入内容。看上去这样好像很不方便，但习惯之后就会觉得非常的爽。因为使用命令模式下那些简洁的命令，绝大多数操作双手都不必离开字母区域。比如最常用到的光标的四个方向移动，Vim 使用命令模式下的 h j k l 四个键来代表←↓↑→四个方向键。同样常用的翻页功能，Vim 使用命令模式下的 Ctrl + B 和 Ctrl + F 来代表 Page Up 和 Page Down。这样移动光标时手根本不需要移动，而翻页时也只需要左手稍微倾斜一下，这种感觉实在是太爽了。</p>

<p>不过来自 GNU/Linux 世界的 Vim 跟大多数 GNU/Linux 下的软件一样不太适合普通用户，它们带有的“<a href="#hacker">黑客</a>色彩”太浓重了。功能太强以至于让它们本身变得很复杂，加上不够友好的用户界面、一大堆的简洁至极的命令/参数缩写，这些足以让一个普通计算机用户望而生畏。但是在经过一段时间（或许是一段较长的时间）的熟悉之后，它们会变成你手中的一件利器，那时你就会发现以前的付出得到了数倍的回报，正所谓“<a href="http://ebuluo.qianlong.com/forum/frontshow/dispbbs.jsp?boardid=4&amp;id=1184852">磨刀不误杀人功</a>”。</p>

<p>Win32 版本的 Vim 我已经安装了有些时日了，只不过一直因为各种借口没有去用它（其实主要原因是我实在很不善于安排时间，以至于把大把的时间都浪费掉了……）。昨天下午因为女同胞的节日学校放假，一时心血来潮再次运行了 Vim 的教程，并且第一次仔细的完成了这个教程（当然里面有不少东西都是用过的了，毕竟断断续续的用 GNU/Linux 也有几年了）。然后又选了帮助中一些基本的，经常会用到的东西来看了一下，边看边尝试，玩了几个小时。现在用 Vim（当然在 Win32 里我是用的 GUI 版本的 gVim）来进行基本的日常文本编辑已经没有什么问题了，不过要想用它完全取代 EditPlus 还需要时间。</p>

<p>其实这也是我的“回到 GNU/Linux”计划的一部分。虽然以前装过多次 GNU/Linux 的一些发行版，但始终因为 Windows 下的一些习惯和应用，以及对 GNU/Linux 系统不够熟悉而无法专注于它。最近才突然想到可以用折中的办法：先在 Virtual PC 里熟悉 GNU/Linux，同时在 Windows 下熟悉一些 GNU/Linux 里常用软件的 Win32 版本，再加上 Windows 里的 GNU 环境 Cygwin，应该可以让我平滑的回到 GNU/Linux ——这个影响了我名字的自由操作系统了。</p>

<p><a id="hacker"></a>
注：一部分大众传播媒体混淆地将「黑客」一词用来表示「安全破坏者」。我们作为黑客拒绝认可这个含义，并继续用这个词表示「那些喜爱编程并享受在其中变得更擅长於编程的人。」——出自 Richard Stallman 的 <a href="http://www.gnu.org/gnu/thegnuproject.cn.html">GNU 工程</a>。</p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e5%9b%9e%e5%88%b0-vim%ef%bc%8c%e5%9b%9e%e5%88%b0-gnulinux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

