<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>滇狐的个人主页</title>
  <description>滇狐就是既疯癫又糊涂！</description>
  <link>http://edyfox.codecarver.org/html/rss.xml</link>
  <pubDate>Thu, 03 Nov 2011 18:48:31 +0000</pubDate>
  <lastBuildDate>Thu, 03 Nov 2011 18:48:31 +0000</lastBuildDate>
  <generator>Home-brewed upload.sh 1.0</generator>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <item>
   <title>VIM 常用插件推荐</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/vimplugins.html</link>
   <pubDate>Thu, 03 Nov 2011 18:34:54 +0000</pubDate>
   <guid isPermaLink="false">vimplugins</guid>
   <description>
    <p></p>
    <p>以下是滇狐收集和整理的一些有用的 VIM 插件，大部分插件都有自己详细的说明书，因此这里就不详细介绍每个插件的安装和使用方法了。通过这些插件，VIM 能够变成一个非常强大的平台，Happy VIMming！如果想详细了解默认的插件插件安装路径，请看这里。</p>
    <p></p>
    <p></p>
    <p>1 程序设计</p>
    <p></p>
    <p></p>
    <p>1.1 Tag List</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：The “Tag List” plugin is a source code browser plugin for Vim and provides an overview of the structure of source code files and allows you to efficiently browse through source code files for different programming languages.</p>
    <p>滇狐评价：这是一个非常非常非常非常重要的插件，有了它，我们才能够在 VIM 中查看一个文件中包含的函数列表，或是一个类包含的方法列表，为编程人员提供了极大方便。推荐大家一定要安装！</p>
    <p>安装注意事项：有的系统内置的 ctags 功能太弱，推荐大家安装 EXUBERANT_CTAGS，这个东西功能比较强大，居然连 HTML 里面内嵌的 Java Script 都能够支持，实在是匪疑所思！</p>
    <p>滇狐个人习惯：滇狐习惯把方法列表放在屏幕的右侧，于是在 .vimrc 中设置了</p>
    <p>let Tlist_Use_Right_Window=1</p>
    <p>另外，滇狐习惯让当前不被编辑的文件的方法列表自动折叠起来，这样可以节约一些屏幕空间，于是在 .vimrc 中设置了</p>
    <p>let Tlist_File_Fold_Auto_Close=1。</p>
    <p></p>
    <p>1.2 A</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：</p>
    <p>A few of quick commands to swtich between source files and header files quickly.</p>
    <p>:A switches to the header file corresponding to the current file being edited (or vise versa)</p>
    <p>:AS splits and switches</p>
    <p>:AV vertical splits and switches</p>
    <p>E.g. if you are editing foo.c and need to edit foo.h simply execute :A and you will be editting foo.h, to switch back to foo.c execute :A again.</p>
    <p>滇狐评价：第一眼看到这个东西时，总觉得它功能太简单，似乎没有什么用处。用过之后，才发现这项功能对于一个程序员来说是如何重要！</p>
    <p></p>
    <p>1.3 Win Manager</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：winmanager is a plugin which implements a classical windows type IDE in Vim-6.0. Basically, you have the directory tree and the buffer list as 2 windows which stay on the left and the editing is done in a seperate area on the left. People have already made excellent File and Buffer explorers seperately and I thought that it might be a cool idea to combine them both. winmanager.vim combines the standard File Explorer which ships with Vim 6.0 and a Buffer Explorer written by Jeff Lanzarotta into one package.</p>
    <p>滇狐评价：非常好用的东西，在屏幕上打开一个文件浏览器，这样就可以方便地选择要编辑的文件了。</p>
    <p>默认情况下，winmanager 依赖于 bufexplorer，到这里下载。如果你不喜欢 bufexplorer 插件的话可以在你的 .vimrc 中添加这条命令禁用它：</p>
    <p>let g:winManagerWindowLayout = "FileExplorer"</p>
    <p>这样就不需要下载该插件了。</p>
    <p>滇狐为 winfileexplorer.vim 加了一个补丁，提供了使用系统默认打开方式打开选中文件的功能，只要把光标放在想要打开的文件上，然后按“S”就可以了(注意是大写)。这样以后就可以直接在 gvim 里打开 Noatun 或别的播放器，不用再切换出来找 konqueror 了。</p>
    <p></p>
    <p>1.4 echofunc</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：When you type ‘(‘ after a function name in insert mode, the function declaration will be displayed in the command line automatically. Then use Alt+-, Alt+= to cycle between function declarations (if exists).</p>
    <p>滇狐评价：一个非常好用的插件，虽然很小巧，功能也很简单，但非常实用，强烈推荐。除此之外，安装了这个插件后，当鼠标移到一个标志符之上时，还会出现一个气球显示该标志符的定义，如图：</p>
    <p> vim_echofunc</p>
    <p>安装注意事项：该插件需要安装 EXUBERANT_CTAGS，不支持古老版本的标准 ctags。建议创建一个这样的脚本：</p>
    <p>#!/bin/sh</p>
    <p># Filename: omnictags</p>
    <p></p>
    <p>ctags --c++-kinds=+p --fields=+iaS --extra=+q "$@"</p>
    <p>然后使用 omnictags 来运行 ctags 生成 tags 文件，保证 tags 文件中含有所需的信息。</p>
    <p></p>
    <p>1.5 omnicppcomplete</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：This script is for vim 7.0 or higher it provides an omnifunc cppcomplete function. You can use the omni completion (intellisense) in c++ files.</p>
    <p>This is a full vim script and you only need a ctags database.</p>
    <p>滇狐评价：虽然滇狐几乎不依赖 IDE 的自动完成，因此也很少使用这个插件，但总的说来，这仍然是个很棒的插件。</p>
    <p>安装注意事项：该插件需要安装 EXUBERANT_CTAGS，不支持古老版本的标准 ctags。建议创建一个和前面的 echofunc 中给出个脚本，使用那个脚本来生成 tags 文件。</p>
    <p></p>
    <p>1.6 pyclewn</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：Pyclewn allows using vim as a front end to a debugger. Pyclewn currently supports gdb and pdb.</p>
    <p>滇狐评价：Vim 从一开始的设计哲学就是要保持简单，不要把太多的东西整合在 Vim 中。Pyclewn 在保持了 Vim 简单的原则下，将集成调试所需的一部分功能引入到了 GVim 中，并且拥有了比 clewn 更高的集成度，支持设置断点、查看变量的值等许多操作，非常方便。</p>
    <p></p>
    <p>1.7 cscope_maps</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：Cscope is a very handy tool, but it’s even better when you don’t ever have to leave the comfort of your favorite editor (i.e. Vim) to use it. Fortunately, Cscope support has been built into Vim.</p>
    <p>滇狐评价：滇狐目前 cscope 用得不如 ctags 多，许多功能都不大熟。不过既然大家都说好，那还是装着玩玩吧。</p>
    <p>安装注意事项：需要安装 cscope。</p>
    <p></p>
    <p></p>
    <p>2 文档编写</p>
    <p></p>
    <p></p>
    <p>2.1 autofmt</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：This is a ‘formatexpr’ plugin and framework for it.</p>
    <p>滇狐评价：这个插件在 VIM 里实现了 UAX_#14，这对于中文用户而言意义是非常重大的。UAX #14 是 Unicode 制定的一个文本排版断行规则，它规定了一行很长的文字在排版的时候允许在什么地方断开，不允许在什么地方断开。启用这个插件后，在 VIM 里写中文文档自动折行的时候就不再会出现标点符号出现在一行最开头的情况了。</p>
    <p>安装注意事项：</p>
    <p>由于 Unicode 是针对所有语言的编码，而引号在不同语言里面的使用方法并不相同，因此 UAX #14 规定在不确定目标语言的情况下，所有引号均不得出现在断行的行首和行尾。但在目标语言确定的情况下，就可以允许前引号出现在行首，后引号出现在行尾。由于我们主要使用这个插件来编写中文，因此我们需要修改这个插件的配置来调整针对引号的排版行为。在你的 .vimrc 里添加这段代码即可：</p>
    <p>let s:unicode = unicode#import()</p>
    <p>let s:orig_prop_line_break = s:unicode.prop_line_break</p>
    <p>function! s:unicode.prop_line_break(char)</p>
    <p>    if a:char == "\u201c" || a:char == "\u2018"</p>
    <p>        return "OP"   " Open Punctuation</p>
    <p>    elseif a:char == "\u201d" || a:char == "\u2019"</p>
    <p>        return "CL"   " Close Punctuation</p>
    <p>    endif</p>
    <p>    return call(s:orig_prop_line_break, [a:char], self)</p>
    <p>endfunction</p>
    <p>另外，由于启用这个插件后 VIM 的折行效率会大大降低，因此建议只在编写中文文档的时候再打开，平时不写中文的时候保持这个插件关闭。启用插件的命令是：</p>
    <p>:setlocal formatexpr=autofmt#japanese#formatexpr()</p>
    <p>关闭插件的命令是：</p>
    <p>:setlocal formatexpr=</p>
    <p></p>
    <p>2.2 fencview</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：View a multi-byte encoded file in different encodings.</p>
    <p>滇狐评价：对于亚洲用户，尤其是中国用户而言，这是一个非常重要的插件！它能自动识别文本文件的编码，给需要编辑各种不同编码的人员提供了极大方便。</p>
    <p></p>
    <p>2.3 VIM LaTeX Suite</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：</p>
    <p>Vim is undoubtedly one of the best editors ever made. LaTeX is an extremely powerful, intelligent typesetter. Vim-LaTeX aims at bringing together the best of both these worlds.</p>
    <p>We attempt to provide a comprehensive set of tools to view, edit and compile LaTeX documents without needing to ever quit Vim. Together, they provide tools starting from macros to speed up editing LaTeX documents to compiling tex files to forward searching .dvi documents.</p>
    <p>See the features page for a brief tour of the various features in LaTeX-suite. All these features can be tuned extensively using the included texrc file. The screenshots page shows you how a typical working session with LaTeX-suite might progress.</p>
    <p>LaTeX-suite is made for Vim versions 6.0 and above. Installation instructions are given in the download page.</p>
    <p>滇狐评价：实在是非常非常非常非常好的一个插件！用 VIM 写 LaTeX 的朋友无论如何都要试一试，不用 VIM 写 LaTeX 的朋友也要试一试，说不定你会改变你的主意，改用 VIM 写 LaTeX。</p>
    <p>安装注意事项：如果使用 gvim 的话，需要注意 scim 可能会和 LaTeX Suite 有冲突。解决方法是要么把 scim 的 on the spot 功能去掉，或者把 gtk_im_module 设为 scim。(较新版本 scim 建议第二种方案)。</p>
    <p>另外，为了提高工作效率，强烈建议配置 VIM 的 LaTeX_正向、反向搜索功能。</p>
    <p></p>
    <p>2.4 sketch</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：Sketch.vim – Line drawing/painting using the mouse. Based on an idea by Morris.</p>
    <p>滇狐评价：很好玩，虽然用到的时候不多，但真一旦用到了，还是会觉得这个东西很有用的。</p>
    <p>安装注意事项：建议在 .vimrc 中把 call ToggleSketch() 映射为命令，方便一些：</p>
    <p>command -nargs=0 ToggleSketch call ToggleSketch()</p>
    <p></p>
    <p></p>
    <p>3 日常生活</p>
    <p></p>
    <p></p>
    <p>3.1 Calendar</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：This script create calender window. This don’t use the external program (cal).</p>
    <p>滇狐评价：安装完毕后使用 :Calendar 命令打开一个垂直的日历窗口，使用 :CalendarH 命令打开水平的日历窗口。应该还是比较有用的。</p>
    <p>安装注意事项：滇狐个人喜欢把日记的扩展名改成 .txt，默认的是 .cal。在 calendar.vim 里面查找替换一下就可以了。另外，可以在 .vimrc 里面修改日记所在的路径，默认是 ~/diary。</p>
    <p>let g:calendar_diary=&lt;PATH&gt;</p>
    <p></p>
    <p>3.2 vimtips</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：</p>
    <p>Whenever you start Vim (but no more than daily) the script will open a help window with a Vim tip. You must download the tips separately, from 官方站点</p>
    <p>After installation, you can get the next tip with</p>
    <p>:TipOfTheDay</p>
    <p>滇狐评价：每天看一条，慢慢就变成 VIM 牛了。</p>
    <p>安装注意事项：暂时没发现。</p>
    <p></p>
    <p>3.3 vimball</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：The vimball plugin facilitates creating, extracting , and listing the contents of “vimball” archives (*.vba).</p>
    <p>滇狐评价：</p>
    <p>非常棒的一个插件，专门用来安装其它插件的。Vimball 格式的插件安装方便，只需用 Vim 打开，执行一下 :so % 即可，无须用户自己满世界找插件的安装路径，更无须整天想着更新 helptags。滇狐已经决定将所有自己编写或修改的插件改为 Vimball 格式了，而且目前有越来越多的插件使用 Vimball 的格式发布，因此大家手头上一定要备有一份 Vimball 插件！虽然 Vim 内置了一份 Vimball 插件，但版本太低，许多 Vimball 无法通过它正常安装，因此还是建议大家到 Vim 网站上下载一份最新版的 Vimball 插件。</p>
    <p></p>
    <p>3.4 GetLatestScript</p>
    <p></p>
    <p>下载地址：官方站点</p>
    <p>官方描述：GetLatestVimScripts is a plugin that automates retrieval of the latest versions of the scripts that you yourself use!</p>
    <p>滇狐评价：</p>
    <p>非常有用的一个插件，有了它，滇狐就可以时刻使用上最新鲜的插件，而不用不停地到 Vim 主页上去看插件的更新情况了。</p>
    <p>安装注意事项：</p>
    <p>安装完毕后，创建文件 ~/.vim/GetLatest/GetLatestVimScripts.dat，按照这样的格式编写你的自动下载配置文件：</p>
    <p>ScriptID SourceID Filename</p>
    <p>--------------------------</p>
    <p>&lt;插件 id&gt; 0 [:AutoInstall:] &lt;插件文件名&gt;</p>
    <p>&lt;插件 id&gt; 0 [:AutoInstall:] &lt;插件文件名&gt;</p>
    <p>...</p>
    <p>每行写一个插件的下载信息。插件 id 就是在 Vim 主页下载插件时 URL 中的 script_id= 后面的那个数字。第二个参数是前一次成功下载到的插件文件编号，第一次使用的时候该参数写 0，成功使用一次后会自动被修改为该插件最新版本的文件编号。第三个参数是该插件下载成功后是否自动安装，如果要自动安装的话就写上 :AutoInstall:。滇狐不建议使用自动安装，因此第三个参数建议省略不要写。第四个参数是插件的名称，一般和下载到的插件的文件名相同，当然即使不同也不会造成太大影响，这个参数主要用于防止某些插件自动将自己加入到这张列表，并非用于指定插件的下载文件名，更详细情况请参看该插件的文档。以下是滇狐自己的 GetLatestVimScripts.dat，供大家参考：</p>
    <p>ScriptID SourceID Filename</p>
    <p>--------------------------</p>
    <p>1066 0 cecutil.vba</p>
    <p>1066 0 cecutil.vim</p>
    <p>1066 7618 cecutil.vba.gz</p>
    <p>1075 0 netrw.vba</p>
    <p>1075 0 netrw.vim</p>
    <p>1075 15782 netrw.vba.gz</p>
    <p>1440 11032 winmanager.vba.bz2</p>
    <p>1939 16792 autofmt.vmb.gz</p>
    <p>1502 15362 vimball.vim</p>
    <p>152 3342 showmarks.vim</p>
    <p>1520 7722 omnicppcomplete-0.41.zip</p>
    <p>1708 15376 fencview.vim</p>
    <p>1735 16637 echofunc.vim</p>
    <p>1863 0 tlib.vim</p>
    <p>1863 15732 tlib.vba.gz</p>
    <p>1926 9111 bbs.vba.gz</p>
    <p>2037 0 hookcursormoved.vim</p>
    <p>2037 11543 hookcursormoved.vba.gz</p>
    <p>273 7701 taglist_45.zip</p>
    <p>31 7218 a.vim</p>
    <p>42 14208 bufexplorer.zip</p>
    <p>642 0 GetLatestVimScripts.vim</p>
    <p>642 0 getscript.vim</p>
    <p>642 15781 getscript.vba.gz</p>
    <p>705 2667 sketch.zip</p>
    <p>861 0 viki.vim</p>
    <p>861 14236 Viki.vba.gz</p>
    <p>编写好 GetLatestVimScripts.dat 后，打开 Vim，运行 :GetLatestVimScripts，即可自动下载最新的插件。插件下载后存放在 ~/.vim/GetLatest/ 中，可以到那里找到后安装，安装完毕后安装文件可以删除。</p>
    <p></p>
    <p>3.5 ViKi</p>
    <p></p>
    <p>你现在看到的这张网页就是使用 ViKi 制作的。也许它不漂亮，但是很清秀，而且添加信息非常方便。是 ViKi 将滇狐从繁重的 Html 编辑工作中解放出来，使滇狐有足够的勇气重新开始制作个人主页。为了更好地说明 ViKi，滇狐将该插件的使用单独放到另一张网页中。</p>
   </description>
  </item>
  <item>
   <title>ViKi 辅助工具</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki_tags_generator.html</link>
   <pubDate>Thu, 06 Oct 2011 06:34:10 +0000</pubDate>
   <guid isPermaLink="false">viki_tags_generator</guid>
   <description>
    <p></p>
    <p>细心的读者在阅读滇狐的编译脚本时可能已经发现了，滇狐在编译 .viki 文件的时候，将 .viki 文件头部的 KEYWORDS 命令抽取出来专门生成了一段 HTML 代码片段，并插入到了生成的 HTML 文件里指定的位置。这样一来，每篇文章尾部都可以看到一段“标签：”字样。既然每篇文章都能够通过 KEYWORDS 命令添加若干个标签，那很自然地，大家一定能想到，滇狐是不是还有另外一个脚本，能生成具有某个标签的所有页面列表，以及全部标签列表呢？</p>
    <p>没错，的确是这样的。这个脚本是用 Bash 写的，运行效率很低，但用 Bash 写东西本来就是一件很行为艺术的事情，是滇狐业余时间最大的爱好，因此就放在这里和大家一起分享吧：</p>
    <p>#!/usr/bin/env bash</p>
    <p></p>
    <p>TARGET_DIR=~/public_html/html</p>
    <p>ARGS="-m lang-zh_CN-autospace -m utf8 -m code-vim73 -t bright.html --css bright -X"</p>
    <p></p>
    <p>######################################################################</p>
    <p># Generate tags</p>
    <p>######################################################################</p>
    <p>rm -f $TARGET_DIR/tag_*.html</p>
    <p>tempdir=`mktemp -d /tmp/cc-XXXXXX`</p>
    <p></p>
    <p>cat &gt; "$tempdir/tags.viki" &lt;&lt; EOF</p>
    <p>#TITLE: 所有标签</p>
    <p></p>
    <p>所有标签：</p>
    <p></p>
    <p>EOF</p>
    <p></p>
    <p>for file in ~/Documents/Viki/*.viki; do</p>
    <p>  tags=`grep ^#KEYWORDS: $file | head -1 | cut -c 1-11 --complement`</p>
    <p>  filename=`basename "$file" .viki`</p>
    <p>  if [ "$tags" != "" ]; then</p>
    <p>    title=`grep ^#TITLE: $file | head -1 | cut -c 1-8 --complement`</p>
    <p>    if [ "$title" = "" ]; then</p>
    <p>      title="&lt;无标题文档&gt;"</p>
    <p>    fi</p>
    <p>    echo "$tags" | sed 's/ *; */\n/g' | (</p>
    <p>      while read tag; do</p>
    <p>        tagfile=$(printf 'tag_%02x_%s' \</p>
    <p>            "$(echo -n "$tag" | wc -c)" \</p>
    <p>            "$(echo -n "$tag" | md5sum | awk '{ print $1 }')")</p>
    <p>        if [ ! -f "$tempdir/$tagfile.viki" ]; then</p>
    <p>          echo "#TITLE: $tag" &gt; "$tempdir/$tagfile.viki"</p>
    <p>          echo &gt;&gt; "$tempdir/$tagfile.viki"</p>
    <p>          echo "含有标签“$tag”的文章：" &gt;&gt; "$tempdir/$tagfile.viki"</p>
    <p>          echo &gt;&gt; "$tempdir/$tagfile.viki"</p>
    <p>        fi</p>
    <p>        echo "  * [[$filename][$title]]" &gt;&gt; "$tempdir/$tagfile.viki"</p>
    <p>        echo "[[$tagfile][$tag]]" &gt;&gt; "$tempdir/tags"</p>
    <p>      done</p>
    <p>    )</p>
    <p>  fi</p>
    <p>done</p>
    <p></p>
    <p>umask 0022</p>
    <p></p>
    <p>sort $tempdir/tags | \</p>
    <p>    uniq -c | \</p>
    <p>    sed 's/\([0-9]\+\)\s\+\(.*\)/\2{,(\1)}/' \</p>
    <p>    &gt;&gt; $tempdir/tags.viki</p>
    <p>deplate -o $TARGET_DIR/tags.html \</p>
    <p>    -m utf8 -t bright.html --css bright \</p>
    <p>    $tempdir/tags.viki</p>
    <p>sed -i -e "s,TAGS_GO""ES_HERE,," $TARGET_DIR/tags.html</p>
    <p></p>
    <p>for file in $tempdir/tag_*.viki; do</p>
    <p>  echo &gt;&gt; $file</p>
    <p>  echo "[[tags][所有标签]]" &gt;&gt; $file</p>
    <p>  base=`basename $file .viki`</p>
    <p>  deplate -o $TARGET_DIR/$base.html $ARGS $file</p>
    <p>  sed -i -e "s,TAGS_GO""ES_HERE,," $TARGET_DIR/$base.html</p>
    <p>done</p>
    <p></p>
    <p>rm -rf "$tempdir"</p>
   </description>
  </item>
  <item>
   <title>ViKi 简介 - 目录</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki_index.html</link>
   <pubDate>Thu, 06 Oct 2011 06:33:12 +0000</pubDate>
   <guid isPermaLink="false">viki_index</guid>
   <description>
    <p></p>
    <p></p>
    <p></p>
    <p>ViKi 简介</p>
    <p></p>
    <p></p>
    <p>* ViKi_简介</p>
    <p>* 安装说明</p>
    <p></p>
    <p>  o 安装必要的插件与软件</p>
    <p></p>
    <p>    # 安装_VIM_ViKi</p>
    <p>    # 安装_deplate_for_Linux</p>
    <p>    # 安装_deplate_for_Windows</p>
    <p></p>
    <p>  o 设置_autocmd</p>
    <p>  o 增强_VIM_语法加亮插件</p>
    <p>  o 去掉中文断行多余空格</p>
    <p>  o 检测安装结果</p>
    <p></p>
    <p>    # 检测_ViKi</p>
    <p>    # 检测_deplate</p>
    <p></p>
    <p></p>
    <p>* ViKi_快速入门</p>
    <p></p>
    <p>  o 基本编译命令行</p>
    <p></p>
    <p>    # 编译含有中文的_viki_文件</p>
    <p>    # 使用模板与_CSS</p>
    <p>    # 使用语法加亮</p>
    <p>    # 指定输出文件夹</p>
    <p>    # 使用脚本简化编译</p>
    <p></p>
    <p>  o 基本语法</p>
    <p></p>
    <p>    # 文章基本结构</p>
    <p></p>
    <p>      # 页面标题</p>
    <p>      # 文内标题与正文</p>
    <p></p>
    <p>    # 使用超链接</p>
    <p></p>
    <p>      # 用方括号语法创建超链接</p>
    <p>      # 用驼峰词创建超链接</p>
    <p>      # 后退</p>
    <p></p>
    <p>    # 贴图</p>
    <p></p>
    <p>      # 独立贴图</p>
    <p>      # 行内贴图</p>
    <p></p>
    <p>    # 符号与编号项</p>
    <p></p>
    <p>  o 常用技巧</p>
    <p></p>
    <p>    # 纯文本片段</p>
    <p>    # 代码片段</p>
    <p>    # 嵌入_HTML</p>
    <p></p>
    <p></p>
    <p>* 编写_ViKi</p>
    <p></p>
    <p>  o 滇狐使用的模板</p>
    <p>  o ViKi_小工具</p>
    <p></p>
    <p>    # ViKi_编译脚本</p>
    <p>    # 新日志生成脚本</p>
    <p>    # 打包上传脚本</p>
    <p></p>
    <p></p>
    <p>* 辅助工具</p>
    <p></p>
    <p>  o RSS_导出脚本</p>
    <p>  o 标签支持</p>
    <p></p>
    <p>* 待解决问题</p>
    <p></p>
    <p>  o zh-cn-autospace_自动补空格不完美</p>
    <p>  o 使用通配符编译时的中文乱码</p>
    <p></p>
    <p></p>
   </description>
  </item>
  <item>
   <title>RSS 导出脚本</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki_rss.html</link>
   <pubDate>Thu, 06 Oct 2011 06:29:37 +0000</pubDate>
   <guid isPermaLink="false">viki_rss</guid>
   <description>
    <p></p>
    <p>正如我们一开始就说过的，ViKi 的主要作用是记录笔记，而笔记，免不了存在复杂的网状交叉引用，以及在发布出去之后的反复修改。因此，RSS 对于 ViKi 来说，用途非常有限。我们这里的 RSS 导出脚本所做的事情仅仅是扫描所有的 .viki 文件，将最近的 20 次修改编译所得到的 HTML 文件再通过html2text 转回纯文本，插入到 RSS 文件中。</p>
    <p>html2text 的具体实现在处理 &amp; 号和双引号 " 时有一些 bug，没能正确对这两个符号的 HTML entity 做 decode，因此我们在对 html2text 的输出进行处理重新转回 html 的时候，不要对这两个符号再次做 encode。具体代码如下，使用的时候请将代码中提到的路径名称替换为你自己系统里的真实路径再使用：</p>
    <p>#!/usr/bin/env bash</p>
    <p></p>
    <p>cat &gt; html/rss.xml &lt;&lt;EOF</p>
    <p>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
    <p>&lt;rss version="2.0"&gt;</p>
    <p> &lt;channel&gt;</p>
    <p>  &lt;title&gt;滇狐的个人主页&lt;/title&gt;</p>
    <p>  &lt;description&gt;滇狐就是既疯癫又糊涂！&lt;/description&gt;</p>
    <p>  &lt;link&gt;http://edyfox.codecarver.org/html/rss.xml&lt;/link&gt;</p>
    <p>  &lt;pubDate&gt;`date -Ru`&lt;/pubDate&gt;</p>
    <p>  &lt;lastBuildDate&gt;`date -Ru`&lt;/lastBuildDate&gt;</p>
    <p>  &lt;generator&gt;Home-brewed upload.sh 1.0&lt;/generator&gt;</p>
    <p>  &lt;docs&gt;http://blogs.law.harvard.edu/tech/rss&lt;/docs&gt;</p>
    <p>EOF</p>
    <p>for item in $(</p>
    <p>for file in ~/Documents/Viki/*.viki; do</p>
    <p>    echo `stat -c %Z $file` $file</p>
    <p>done | sort -r | head -20 | awk '{ print $2 }'</p>
    <p>); do</p>
    <p>  echo '  &lt;item&gt;' &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;title&gt;`grep ^#TITLE: $item | head -1 | cut -c 1-8 --complement`&lt;/title&gt;" &gt;&gt; html/rss.xml</p>
    <p>  echo '   &lt;author&gt;滇狐&lt;/author&gt;' &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;link&gt;http://edyfox.codecarver.org/html/`basename $item .viki`.html&lt;/link&gt;" &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;pubDate&gt;$(date -Ru -d @`stat -c %Z $item`)&lt;/pubDate&gt;" &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;guid isPermaLink=\"false\"&gt;`basename $item .viki`&lt;/guid&gt;" &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;description&gt;" &gt;&gt; html/rss.xml</p>
    <p>  awk '</p>
    <p>  /TEMPLATE_BODY''_BEGIN_TAG/ {</p>
    <p>    begin = "yes"</p>
    <p>    next</p>
    <p>  }</p>
    <p>  /TEMPLATE_BODY''_END_TAG/ {</p>
    <p>    begin = "no"</p>
    <p>    next</p>
    <p>  }</p>
    <p>  begin == "yes" {</p>
    <p>    print</p>
    <p>  }</p>
    <p>  ' html/`basename $item .viki`.html | \</p>
    <p>    html2text -style pretty -width -1 -utf8 | \</p>
    <p>    sed -e 's/&amp;quot;/"/g' \</p>
    <p>        -e 's/&lt;/\&amp;lt;/g' \</p>
    <p>        -e 's/&gt;/\&amp;gt;/g' \</p>
    <p>        -e 's/&amp;ldquo;/“/g' \</p>
    <p>        -e 's/&amp;rdquo;/”/g' \</p>
    <p>        -e 's/&amp;lsquo;/‘/g' \</p>
    <p>        -e 's/&amp;rsquo;/’/g' \</p>
    <p>        -e 's/&amp;ndash;/–/g' \</p>
    <p>        -e 's/^/    &lt;p&gt;/' \</p>
    <p>        -e 's/$/&lt;\/p&gt;/' \</p>
    <p>    &gt;&gt; html/rss.xml</p>
    <p>  echo "   &lt;/description&gt;" &gt;&gt; html/rss.xml</p>
    <p>  echo '  &lt;/item&gt;' &gt;&gt; html/rss.xml</p>
    <p>done</p>
    <p>cat &gt;&gt; html/rss.xml &lt;&lt;EOF</p>
    <p> &lt;/channel&gt;</p>
    <p>&lt;/rss&gt;</p>
    <p>EOF</p>
   </description>
  </item>
  <item>
   <title>ViKi 辅助工具</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki_accessories.html</link>
   <pubDate>Thu, 06 Oct 2011 06:28:49 +0000</pubDate>
   <guid isPermaLink="false">viki_accessories</guid>
   <description>
    <p></p>
    <p></p>
    <p>1 导出 RSS</p>
    <p></p>
    <p>对于任何一个经常在网上浏览各种文章的人来说，RSS 肯定不陌生。虽然 ViKi 的主要功能是记录网状结构的笔记，而并非按日期方式组织的日志，RSS 的作用相对有限，不过能够支持导出_RSS，也是能够为很多有这方面需求的访问者带来不小的方便的。</p>
    <p></p>
    <p></p>
    <p>2 标签支持</p>
    <p></p>
    <p>大家也许注意到了，滇狐的个人主页上每篇文章下方都有一段“标签：”字样，罗列出这篇文章的若干个关键词。这样的标签列表是怎么做出来的呢？点击这里查看详情。</p>
   </description>
  </item>
  <item>
   <title>NoMachine 安装使用笔记</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/nomachine.html</link>
   <pubDate>Wed, 05 Oct 2011 01:55:35 +0000</pubDate>
   <guid isPermaLink="false">nomachine</guid>
   <description>
    <p></p>
    <p>Linux 下可用的图形界面远程控制软件很多，滇狐很久以前写过的一个 Linux 下远程控制简介，感兴趣的可以简要了解一下。NoMachine 是 Linux 下实现远程桌面的另一个非常方便的软件，本文记录了在 Debian 下安装和使用 NoMachine 的一些注意事项。</p>
    <p></p>
    <p></p>
    <p>1 NX 的优点</p>
    <p></p>
    <p>NX 的原理和 VNC 很接近，同样也是通过在远程机器上虚拟一个 Xserver 的方式，将远程的应用程序绘制的图像都绘到虚拟的 Xserver 上，再通过 NX 协议将图像发送到客户端来，并接受客户端的键盘和鼠标事件。和 VNC 比起来，NX 主要有以下几大优点：</p>
    <p>首先是速度，NX 协议允许对传输的图像进行压缩，在网络带宽有限的情况下，NX 可以动态地牺牲部分图像质量，获得更流畅的操作效果，而 VNC 受协议限制，无法做这样的动态有损压缩。</p>
    <p>其次是安全性，VNC 使用自己单独的端口，使用自己定义的协议来传输数据，并且具有自己的一套密码认证方案，因此安全性完全取决于它自身实现的健壮性。NX 使用的是系统 SSH 协议，没有自己单独的一套身份验证机制，因此安全性完全依赖于系统 SSH 的安全性，不会引入新的安全隐患。</p>
    <p>最后是其它服务的转发。NX 内置了对于文件共享、打印机共享以及本地声音系统共享的转发机制，连接到远程系统的时候可以非常方便地使用本地的资源。VNC 本身是不支持这些操作的，虽然对于高级用户而言，通过各种辅助软件和精妙的配置，以上功能都能实现，但毕竟不如 NX 这样本身内置了全部支持来得方便。</p>
    <p></p>
    <p></p>
    <p>2 安装指南</p>
    <p></p>
    <p>NX 的安装很简单，直接到 NX_的官方网站 去，找到适合自己平台的安装包，直接安装就可以了。对于客户端而言，只需要装 nxclient 就行了。对于服务端而言，需要同时安装 nxclient、nxnode 和 nxserver，由于服务端的程序用到了客户端的库，因此安装服务端的时候，必须先在服务端也安装一份客户端才行。安装完毕之后服务端会自动启动，如果没有什么高级需求的话，不需要对服务端进行什么特殊配置。</p>
    <p></p>
    <p></p>
    <p>3 设置分辨率</p>
    <p></p>
    <p>我们这里说的“分辨率”，指的是 resolution，即“每英寸对应多少个像素”(DPI)，不是 geometry，即“屏幕宽度和高度分别是多少像素”。Geometry 在 NX 登录的时候可以直接在客户端设置，登录之后也可以通过拖拽 NX 的窗口进行调节，不需要通过特殊的设置实现。</p>
    <p>NX 默认的分辨率是 75dpi，由于 KDE 和 GNOME 程序都能强制 override 系统分辨率，将默认分辨率设置为 96dpi，因此对于 KDE 和 GNOME 程序而言，系统分辨率不正确并没有太大问题。但系统里毕竟还是有一些特殊的程序是不考虑 KDE 和 GNOME 的分辨率设置，直接使用系统分辨率的。</p>
    <p>修改 NX 分辨率的方式是，到 NX 的安装路径下，找到 etc 目录 之下的 node.cfg，在文件中查找：AgentExtraOptions 字样，如果这个单词在该文件里完全不存在，则直接在文件尾部添加：</p>
    <p>AgentExtraOptions = "-dpi 96"</p>
    <p>如果 AgentExtraOptions 已经存在的话，则在原有的 AgentExtraOptions = "..." 的后引号前面加一个空格，补上 -dpi 96，譬如如果原先内容是：</p>
    <p>AgentExtraOptions = "-nolisten tcp"</p>
    <p>则改为：</p>
    <p>AgentExtraOptions = "-nolisten tcp -dpi 96"</p>
    <p></p>
    <p></p>
    <p>4 远程声音配置</p>
    <p></p>
    <p>Linux 下的声音系统极其混乱，导致在 Linux 下想要让系统正常发声，往往需要很费一番周折。在 NX 下的远程声音效果并不好，延时很严重，而且音质非常糟糕，配置远程声音的主要目的是方便播放一些提示音来监听工作状态，譬如滇狐喜欢在编译的时候设置编译完成后播放一段提示音，这样在 NX 里编译的时候就可以切换到本地玩一些别的事情了。</p>
    <p></p>
    <p>4.1 客户端</p>
    <p></p>
    <p>NX 在远程播放声音的时候，是通过把远程的数据转发到本地的一个 EsounD 服务器上实现的，因此，它必须现在本地启动一个 ESD。在 NX 的安装包里，提供了一个 NX 实现的 ESD，叫 nxesd，就在 NX 安装目录的 bin 底下。</p>
    <p>然而，这个声音服务器直接通过 OSS 接口和声卡打交道，和本地已有的别的声音服务器并不能和睦相处。为了保证这个不听话的 nxesd 运行正常，我们需要通过本地声音服务器提供的 OSS wrapper 来启动它的声音服务器：如果本地的声音系统是 artsd，则使用 artdsp 作为 wrapper；如果本地的声音系统是 ESD，则使用 esddsp 作为 wrapper；如果本地的声音系统是 alsa，则使用 aoss 作为 wrapper；如果本地的声音系统是 pulseaudio，则使用 padsp 作为 wrapper；如果本地的声音系统不在上面列出的范围里，请自行查找相应的 wrapper 程序。</p>
    <p>由于 nxclient 在启动的时候会自动调用 nxesd，因此，为了将我们的 wrapper 添加进去，我们需要先把 nxesd 改个名，让 nxclient 无法直接调用到它：</p>
    <p>sudo mv nxesd nxesd.bin</p>
    <p>然后，我们创建一个脚本，命名为 nxesd，并且给它加上可执行属性。这样，nxclient 在调用 nxesd 的时候，调用到的就是我们编写的脚本了，脚本内容如下：</p>
    <p>#!/bin/sh</p>
    <p></p>
    <p># Replace "padsp" below to your actual OSS wrapper</p>
    <p>exec padsp /usr/NX/bin/nxesd.bin "$@"</p>
    <p>记得将其中的 padsp 替换为你真实的 OSS wrapper 程序，并将 /usr/NX/ 替换为你真实的 NX 安装路径。</p>
    <p></p>
    <p>4.2 服务端</p>
    <p></p>
    <p>NX 在服务端会虚拟出一个 ESD 服务器来，因此，我们需要将所有支持 ESD 的程序设置为通过 ESD 来发声。</p>
    <p>KDE 系统设置里的“多媒体”中能够直接识别出“Esound (ESD)”，直接将该选项提到设备列表的最前方即可。</p>
    <p>GNOME 默认就是支持 ESD 的，无须进行特别配置。但 GNOME 下还有很多程序是通过 GStreamer 来发声的，因此我们需要对 GStreamer 作一些配置。运行 gstreamer-properties，在“音频”的“Default Output”下拉框中选择：“ESD - Enlightenment 声音守护程序”即可。至于“Default Input”，随便选一个就行，譬如“静音”，不会有人想用远程的服务器来录音的。</p>
    <p>配置了 KDE 和 GNOME 的声音环境之后，绝大部分程序应该就可以正常发声了。还有一个最棘手的，就是网页里的 Flash。虽然我们不会在服务器上看网络视频，但能听到网络聊天程序通过 Flash 发出的提示音也是很重要的事情。Flash 发声是通过 alsa 接口进行的，并且无法配置成别的接口。因此，为了让 Flash 能发声，我们必须在远程包装一个 alsa。</p>
    <p>ESD 是无法被直接包装成 alsa 的，但我们可以先把 ESD 包装成 PulseAudio，然后再把 PulseAudio 包装成 alsa，这样 Flash 就能正常播放了。</p>
    <p>首先，我们将 ESD 包装成 PulseAudio，要做到这点，我们需要启动一个 PulseAudio 服务器，使用 ESD 作为 PulseAudio 服务器的输出接口。由于 NX 模拟的 ESD 每次启动监听的端口都不一样，因此我们需要通过一个脚本来创建 PulseAudio 的配置文件，以便 PulseAudio 能找到正确的 ESD 端口来进行输出：</p>
    <p>#!/usr/bin/env bash</p>
    <p></p>
    <p># Set up the pulseaudio remote sound</p>
    <p>cat &gt; ~/.pulse/default.pa &lt;&lt;EOF</p>
    <p>#!/usr/bin/pulseaudio -nF</p>
    <p></p>
    <p>load-module module-esound-sink sink_name=esdoutput server=$ESPEAKER rate=44100</p>
    <p>set-default-sink esdoutput</p>
    <p>load-module module-esound-protocol-unix</p>
    <p>load-module module-native-protocol-unix</p>
    <p>load-module module-stream-restore</p>
    <p>load-module module-rescue-streams</p>
    <p>.nofail</p>
    <p>load-module module-x11-publish</p>
    <p>EOF</p>
    <p>pulseaudio -k</p>
    <p>pulseaudio -nF ~/.pulse/default.pa &amp;</p>
    <p>将这段脚本设置为每次登录系统的时候自动运行，这段脚本会从环境变量中获得正确的 ESD 端口，创建相应的 PulseAudio 配置文件，杀死之前启动的 PulseAudio 服务器并启动新的服务器。运行了这段脚本之后，我们就获得了一个能够将声音成功重定向到 ESD 上的 PulseAudio 服务器。</p>
    <p>接下来，我们配置 alsa 让它能将声音输出到 PulseAudio 上来。在用户主目录下创建 alsa 的配置文件 ~/.asoundrc，内容如下：</p>
    <p>pcm.pulse {</p>
    <p>    type pulse</p>
    <p>}</p>
    <p>ctl.pulse {</p>
    <p>    type pulse</p>
    <p>}</p>
    <p>pcm.!default {</p>
    <p>    type pulse</p>
    <p>}</p>
    <p>ctl.!default {</p>
    <p>    type pulse</p>
    <p>}</p>
    <p>至此，我们成功模拟出来了一个 alsa 声音系统，可以将所有来自 alsa 的声音重定向给 PulseAudio，然后 PulseAudio 把声音发到虚拟 ESD，然后送回本地的 nxesd，再通过本地的 OSS wrapper 发给本地的声音服务器然后我们就听到声音了。终于，网页中的 Flash 可以正常发声了。</p>
    <p></p>
    <p></p>
    <p>5 NX 使用小技巧</p>
    <p></p>
    <p></p>
    <p>* 切换全屏和窗口模式的快捷键是 Ctrl-Alt-F。</p>
    <p>* 断开远程连接的快捷键是 Ctrl-Alt-T。</p>
    <p>* 最小化远程桌面窗口的快捷键是 Ctrl-Alt-M。</p>
    <p>* NX 的两种工作模式：</p>
    <p>  NX 有两种工作模式，一种叫 auto-resize 模式，另一种叫 viewport 模式。Auto-resize 模式的意思就是说，当我们调整了客户端 NX 窗口的尺寸的时候，NX 会发送消息给服务端，要求服务端修改 Xserver 的屏幕尺寸，这样，所有应用程序都会收到“屏幕尺寸改变”消息。Viewport 模式的意思是说，当我们调整了客户端 NX 窗口尺寸的时候，NX 不会通知服务端改变屏幕尺寸，还是保留原有的屏幕尺寸大小，如果客户端的窗口比服务端的屏幕尺寸小的话，客户端可以通过 Ctrl+Alt+方向键来滚动当前视窗，以便看到在当前视窗中没有显示出来的部分。切换 auto-resize 模式和 viewport 模式的快捷键是 Ctrl-Alt-R。</p>
    <p></p>
   </description>
  </item>
  <item>
   <title>Linux 一句话技巧</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/linux_one_liner.html</link>
   <pubDate>Wed, 05 Oct 2011 00:28:26 +0000</pubDate>
   <guid isPermaLink="false">linux_one_liner</guid>
   <description>
    <p></p>
    <p>在 Linux 下使用命令行的时候常常会遇到一些有趣的小技巧，日常生活中经常会用得着，记录下来供自己和感兴趣的人查阅：</p>
    <p></p>
    <p>* Debian 相关</p>
    <p></p>
    <p>  o 列出所有手工安装的软件包 (非通过其它软件包的依赖关系被间接安装上的)：</p>
    <p>    aptitude search ~i --disable-colum | grep -v "i.A" | cut -d " " -f 3</p>
    <p>    网上给出的方法是错误的，名字太长的包会列不出来。</p>
    <p></p>
    <p>* 文件相关</p>
    <p></p>
    <p>  o 比较两个文件的修改时间</p>
    <p>    [ FILE1 -ot FILE2 ]  # FILE1 older than FILE2</p>
    <p>    [ FILE1 -nt FILE2 ]  # FILE1 newer than FILE2</p>
    <p></p>
    <p>* 远程访问相关</p>
    <p></p>
    <p>  o Attach 远程的 screen 会话</p>
    <p>    ssh -t remote.host.name screen -x</p>
    <p>    注意：这里的 -t 参数的作用是强制开启虚拟 tty，默认情况下 ssh 如果给出了命令行，则不会在远程机器上开启虚拟 tty，这样会造成无法运行需要与 tty 交互的程序，譬如 screen。</p>
    <p></p>
    <p>* 日期时间相关</p>
    <p></p>
    <p>  o 显示指定时区的时间：</p>
    <p>    TZ=UTC-8 date  # UTC +0800</p>
    <p>    TZ=UTC+7 date  # UTC -0700</p>
    <p>    注意：TZ 的正负号和时区的正负号相反。</p>
    <p>  o 显示当前 UNIX Timestamp：</p>
    <p>    date +%s</p>
    <p>  o 显示指定时间的 UNIX Timestamp：</p>
    <p>    date +%s -d "2011-10-01 3:45:07"</p>
    <p>    TZ=UTC-8 date +%s -d "2011-10-01 3:45:07"</p>
    <p>  o 将指定 UNIX Timestamp 转换成人类可读时间：</p>
    <p>    date -d @1317465907</p>
    <p>    TZ=UTC+8 date -d @1317465907</p>
    <p></p>
    <p></p>
   </description>
  </item>
  <item>
   <title>Linux 笔记</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/linux.html</link>
   <pubDate>Tue, 04 Oct 2011 23:39:43 +0000</pubDate>
   <guid isPermaLink="false">linux</guid>
   <description>
    <p></p>
    <p>这个页面主要记录 Linux 下安装一些比较难装的软件出现的问题，为自己，也为别人做一些参考。</p>
    <p></p>
    <p></p>
    <p>1 日常使用</p>
    <p></p>
    <p></p>
    <p>1.1 Debian Wheezy 中文字体美化全攻略</p>
    <p></p>
    <p>中文字体美化是个很讨厌的事情，无数初学者在这里面浪费了无数时间，做了无数没有意义的事情。但这也是不得不做的，我把 Debian 所需要的中文字体美化操作步骤详细记录在这里，希望能节约大家一部分时间。</p>
    <p></p>
    <p>1.2 GBK to UTF-8</p>
    <p></p>
    <p>今天正式决定迁移到 UTF-8 下，迁移过程中遇到的问题放在这里记录一下。</p>
    <p></p>
    <p>1.3 命令行下使用系统打开方式打开文件</p>
    <p></p>
    <p>Windows 下有个 start 命令，可以使用系统登记的打开方式打开指定文件，很方便。在 Linux 下我们也可以仿制一个 start_脚本用来提供这个功能。</p>
    <p></p>
    <p>1.4 Bash 小技巧</p>
    <p></p>
    <p>Bash 的使用有很多诡异的地方，平时遇到什么奇怪的事情就往这里记录一下吧。</p>
    <p></p>
    <p>1.5 一句话技巧</p>
    <p></p>
    <p>在 Linux 下使用命令行的时候常常会遇到一些有趣的小技巧，日常生活中经常会用得着，记录下来供自己和感兴趣的人查阅。</p>
    <p></p>
    <p></p>
    <p>2 网络服务</p>
    <p></p>
    <p></p>
    <p>2.1 Apache SSL 在 Debian 下的配置</p>
    <p></p>
    <p>网上关于 Debian 下 SSL 的指南很多，但大部分都不能成功。好容易找到一个能够配置成功的，赶紧记下来。</p>
    <p></p>
    <p>2.2 NX 在 Debian 下的安装和使用</p>
    <p></p>
    <p>NoMachine 是 Linux 下实现远程桌面一个非常方便的软件，这里记录了在 Debian 下安装和使用 NoMachine 的一些注意事项。</p>
    <p></p>
    <p>2.3 VNC Server 在 Debian 下的安装</p>
    <p></p>
    <p>这里记录了滇狐在 Debian 下安装 RealVNC 的步骤。由于滇狐不用 RealVNC 很久了，所以不是很确定这篇文章里说的内容仍然成立。如果你发现文章有问题，请与滇狐联系。</p>
    <p></p>
    <p>2.4 将一个端口映射为另一个端口</p>
    <p></p>
    <p>iptables 是一个非常强大的防火墙，映射端口这点小事使用 iptables 可以很容易做到，命令行如下：</p>
    <p>iptables -t nat -I PREROUTING -p tcp -d &lt;本机 IP&gt; --dport &lt;源端口&gt; \</p>
    <p>-j REDIRECT --to &lt;目的端口&gt;</p>
    <p>这里是还原所有 iptables 设置的脚本：</p>
    <p>#!/bin/sh</p>
    <p>#</p>
    <p># Configurations</p>
    <p>#</p>
    <p>IPTABLES=iptables</p>
    <p></p>
    <p>#</p>
    <p># reset the default policies in the filter table.</p>
    <p>#</p>
    <p>$IPTABLES -P INPUT ACCEPT</p>
    <p>$IPTABLES -P FORWARD ACCEPT</p>
    <p>$IPTABLES -P OUTPUT ACCEPT</p>
    <p></p>
    <p>#</p>
    <p># reset the default policies in the nat table.</p>
    <p>#</p>
    <p>$IPTABLES -t nat -P PREROUTING ACCEPT</p>
    <p>$IPTABLES -t nat -P POSTROUTING ACCEPT</p>
    <p>$IPTABLES -t nat -P OUTPUT ACCEPT</p>
    <p></p>
    <p>#</p>
    <p># reset the default policies in the mangle table.</p>
    <p>#</p>
    <p>$IPTABLES -t mangle -P PREROUTING ACCEPT</p>
    <p>$IPTABLES -t mangle -P OUTPUT ACCEPT</p>
    <p></p>
    <p>#</p>
    <p># flush all the rules in the filter and nat tables.</p>
    <p>#</p>
    <p>$IPTABLES -F</p>
    <p>$IPTABLES -t nat -F</p>
    <p>$IPTABLES -t mangle -F</p>
    <p>#</p>
    <p># erase all chains that's not default in filter and nat table.</p>
    <p>#</p>
    <p>$IPTABLES -X</p>
    <p>$IPTABLES -t nat -X</p>
    <p>$IPTABLES -t mangle -X</p>
    <p>这里有 iptables 比较详细的一份教程，挺长的，如果有时间我希望能够看完它。</p>
    <p></p>
    <p></p>
    <p>3 过期文章</p>
    <p></p>
    <p>时代在发展，社会在进步，Linux 更是一日千里地变化。滇狐的主页上的很多内容，现在都已经过时了。这里的内容都是现在不再适用的内容，留在这里仅供参考，请大家不要对这个栏目下的内容太当回事。</p>
   </description>
  </item>
  <item>
   <title>Bash 小技巧笔记</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/bash_tips.html</link>
   <pubDate>Tue, 04 Oct 2011 23:39:32 +0000</pubDate>
   <guid isPermaLink="false">bash_tips</guid>
   <description>
    <p></p>
    <p>Bash 的使用有很多诡异的地方，平时遇到什么奇怪的事情就记录在这里，以后查阅起来方便。</p>
    <p></p>
    <p></p>
    <p>1 易混概念</p>
    <p></p>
    <p>这里记录一些很基本，但初学者很容易错的概念，接触 Bash 的时候一定要把这些细节掌握牢靠。</p>
    <p></p>
    <p>1.1 Bash 输出重定向</p>
    <p></p>
    <p>在 Linux 下，把命令的输出重定向到文件是一个很常见的操作，但如何正确区分 stdout 和 stderr 可不是一件容易的事，这里总结了正确阅读输出重定向的一些小技巧。</p>
    <p></p>
    <p>1.2 “$*”和“$@”</p>
    <p></p>
    <p>在 Bash 下，$* 和 $@ 看起来很相似，其实用起来区别还是很大的，看这里。</p>
    <p></p>
    <p></p>
    <p>2 Bash 特性</p>
    <p></p>
    <p>这里记录一些 Bash 特有，sh 不具备的比较方便的特性。</p>
    <p></p>
    <p>2.1 Bash 文件名通配符不匹配展开</p>
    <p></p>
    <p>如果我们想匹配目录下所有扩展名不是 cpp 的文件，该怎么做呢？</p>
    <p></p>
    <p></p>
    <p>3 代码片段</p>
    <p></p>
    <p>本栏目包含一些用 Bash 写成的比较有技巧的小片段，在实际工作中可能会用得着。</p>
    <p></p>
    <p>3.1 用 Bash 写 URLEncode</p>
    <p></p>
    <p>URLEncode 是非常常用的一种编码方式，在各种语言下都有实现，但在 shell 底下，要做 URLEncode 就不是那么方便了。这里给出了一段用 Bash 写的 URLEncode 实现，希望能给大家带来一些帮助。</p>
   </description>
  </item>
  <item>
   <title>ViKi 简介</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki.html</link>
   <pubDate>Tue, 04 Oct 2011 18:47:27 +0000</pubDate>
   <guid isPermaLink="false">viki</guid>
   <description>
    <p></p>
    <p></p>
    <p>1 ViKi 简介</p>
    <p></p>
    <p>所谓 ViKi，就是 VIM WiKi 的缩写。WiKi 是一种非常方便快捷地组织信息的方式，而 ViKi 作为一种“Personal WiKi”，能够非常快捷地完成个人主页的制作，将滇狐从 HTML 噩梦中解救出来。</p>
    <p>为了表达对 ViKi 的喜爱，滇狐编写了这份 ViKi 简介。为了更好地组织这份教程，滇狐还编写了这份目录，希望能方便大家的查阅。</p>
    <p></p>
    <p></p>
    <p>2 安装说明</p>
    <p></p>
    <p>下载和安装 ViKi 与 ViKi 的编译软件 deplate 的详细步骤请看这里。</p>
    <p></p>
    <p></p>
    <p>3 ViKi 快速入门</p>
    <p></p>
    <p>ViKi 可以支持许多很复杂，功能很强大的语法，详细情况请参看 deplate 附带的用户手册。但作为日常编译，用到的语法只是很少的一个子集。滇狐将自己常用的语法整理出来放在这里，作为一篇简单的入门速查手册，方便同样喜欢 ViKi 的朋友查阅。</p>
    <p></p>
    <p></p>
    <p>4 编写 ViKi</p>
    <p></p>
    <p>ViKi 默认的模板并不好看，滇狐参考了一些别人的模板，听取了一些同学与朋友的建议，重新编写了模板，用来编写自己的 ViKi。虽然也谈不上很好看，但也还是放到这里吧。</p>
    <p>为了更方便地编写 ViKi，滇狐使用了一些小工具，希望能够给大家提供一些方便。</p>
    <p></p>
    <p></p>
    <p>5 辅助工具</p>
    <p></p>
    <p>滇狐不喜欢 Blog，但不可否认，Blog 仍然有很多很有用的功能。因此滇狐移至了一些 Blog 里比较有用的小功能到 ViKi 中，写了一些辅助工具，放在这里供大家参考。</p>
    <p></p>
    <p></p>
    <p>6 待解决问题</p>
    <p></p>
    <p>在使用 ViKi 与 deplate 的时候，滇狐碰到了一些有些不愉快的小问题，把它们列在这里。虽然存在这些 Bugs，但是，瑕不掩玉，ViKi 与 deplate 仍然是一套很棒的工具。</p>
   </description>
  </item>
  <item>
   <title>用 Bash 写 URLEncode</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/bash_url_encode.html</link>
   <pubDate>Thu, 29 Sep 2011 22:28:55 +0000</pubDate>
   <guid isPermaLink="false">bash_url_encode</guid>
   <description>
    <p></p>
    <p>URLEncode 又叫 Percent-encoding，是非常常见的一种编码方式。虽然它名字叫 URLEncoding，但它绝不是仅仅用在 URL 里面，事实上，表单提交，协议头参数传递，甚至远程过程调用，都有该编码方式的用武之地。</p>
    <p>URLEncode 实现很简单，但在 Bash 这样表现能力严重受限的语言里面，真要做起来就不是那么容易了，因此大家一般都会用 Bash 调用一些别的语言的 one-liner 啥的，曲线救国一下。那么，我们能不能不调用任何别的编程语言，仅仅只用标准命令，实现一个 URLEncode 呢？经过多次失败的尝试，查阅多方面资料后，滇狐终于发现了这样的解决方案：</p>
    <p>#!/usr/local/bin/bash</p>
    <p></p>
    <p>export LANG=C</p>
    <p></p>
    <p>if [ $# -lt 1 ]; then</p>
    <p>  echo Usage: urlencode string</p>
    <p>  exit 1</p>
    <p>fi</p>
    <p></p>
    <p>arg="$1"</p>
    <p>i="0"</p>
    <p>while [ "$i" -lt ${#arg} ]; do</p>
    <p>    c=${arg:$i:1}</p>
    <p>    if echo "$c" | grep -q '[a-zA-Z/:_\.\-]'; then</p>
    <p>        echo -n "$c"</p>
    <p>    elif [ "$c" = " " ]; then</p>
    <p>        printf "+"</p>
    <p>    else</p>
    <p>        printf "%%%X" "'$c'"</p>
    <p>    fi</p>
    <p>    i=$((i+1))</p>
    <p>done</p>
    <p>中间部分的代码非常简单，相信大家都能看明白，主要讲解的是两条小秘技。</p>
    <p>第一条秘技是，其实在 Bash 里是有对字符串取子串的操作的，格式是：${变量:下标:长度}。求字符串长度也很简单：${#变量} 就是。有了求子串和求字符串长度的语句，写一个小循环，以字符为单位遍历一个字符串是很简单的操作，没有任何难度。</p>
    <p>第二条秘技是，Bash 取子串操作是以字符为单位的，在 UTF-8 环境下，一个字符可能包含多个字节，这给 URLEncode 带来很大困难。为了解决这个问题，我们在脚本一开头处搞了个小诡计：把 LANG 强行设置为 C。这样一来，Bash 就无法知道我们当前处于什么 locale 下，也就无法把字节拼装成为字符了，于是我们就如愿以偿地获得了每个字节，接下来要做编码那就是轻而易举的事情了。</p>
    <p>总之，这是 URLEncode 的一个非常低效率的实现，但不管怎么样，至少功能是没问题的，先屯着，说不定什么时候就会用得着呢，对吧？</p>
   </description>
  </item>
  <item>
   <title>Bash 输出重定向</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/bash_output_redirection.html</link>
   <pubDate>Thu, 29 Sep 2011 17:31:32 +0000</pubDate>
   <guid isPermaLink="false">bash_output_redirection</guid>
   <description>
    <p></p>
    <p>在 Linux 下，把命令的输出重定向到文件是一个很常见的操作，但如何正确区分 stdout 和 stderr 可不是一件容易的事。初学者如果不仔细理解概念，直接按照直观来理解的话，对于这个问题是非常容易混淆的，我们来看这样一个小例子：</p>
    <p>some-command 2&gt;&amp;1 &gt; command.log</p>
    <p>some-command &gt; command.log 2&gt;&amp;1</p>
    <p>提问：这两条命令有什么区别？</p>
    <p>很多对 Bash 不熟悉的同学看到了以后立刻说：“我知道我知道！第一条命令是把 stderr 重定向到 stdout，然后把 stdout 重定向到 command.log，因此命令执行完之后所有输出的内容都在 command.log 里面。第二条命令是把 stdout 重定向到 command.log 里，然后把 stderr 重定向到 stdout 里，因此命令执行完后 command.log 里只有 stdout 的输出，stderr 的输出还在屏幕上。”</p>
    <p>这个答案正确么？很遗憾，每个句子里面“因此”前面的部分是完全正确的，但“因此”后面的部分完全错误，根本原因还是因为，大家把“重定向”的意思理解错了。为了正确理解这个问题，我们还是来仔细解释一下概念吧。</p>
    <p>先看第一个命令，我们先做 2&gt;&amp;1，原先 2 指向的是屏幕，1 指向的是屏幕，因此做完这个重定向以后，2 里的所有内容被重定向到 1，也就是 stderr 被重定向到屏幕上。</p>
    <p>然后，我们做 &gt; command.log，原先 1 指向的是屏幕，重定向之后，1 指向的变成了文件，因此做完这个重定向以后，1 里的所有内容被重定向到文件，也就是 stdout 被重定向到文件里。</p>
    <p>总之，命令一重定向的结果是，stderr 被重定向到屏幕上，stdout 被重定向到文件里，命令执行完后，文件里仅仅有 stdout 的输出。</p>
    <p>理解了第一个命令之后，再看第二个命令也就很好理解了。我们先做 &gt; command.log，原先 1 指向的是屏幕，做完这个重定向以后，1 里的所有内容被重定向到 command.log，也就是 stdout 被重定向到文件里。</p>
    <p>然后，我们做 2&gt;&amp;1，原先 2 指向的是屏幕，1 指向的是文件 command.log，注意，1 已经被重定向到文件里了，因此，重定向之后，2 指向的也变成了文件，也就是 stderr 也被重定向到文件里。</p>
    <p>总之，命令二重定向的结果是，stdout 和 stderr 都被重定向到文件里，命令执行完后，文件里有 stdout 和 stderr 的全部输出。</p>
    <p>看明白了么？重定向的过程其实很简单，但由于和直观感受不一致，往往导致初学者在这里犯很多错误。希望这篇文章能解决初学者在输出重定向方面的疑惑。</p>
   </description>
  </item>
  <item>
   <title>Bash 文件名通配符不匹配展开</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/bash_filename_extglob.html</link>
   <pubDate>Thu, 29 Sep 2011 17:31:03 +0000</pubDate>
   <guid isPermaLink="false">bash_filename_extglob</guid>
   <description>
    <p></p>
    <p>任何初学者都知道，在 Bash 下可以通过 *.cpp 匹配目录下所有扩展名为 cpp 的文件，那么，如果我们想匹配目录下所有扩展名不是 cpp 的文件，该怎么做呢？当 extglob 打开的情况下，用这个展开就可以了：</p>
    <p>!(*.cpp)</p>
    <p>extglob 默认都是打开的，如果没开的话，可以用 shopt 命令打开：</p>
    <p>shopt -s extglob</p>
   </description>
  </item>
  <item>
   <title>“$*”和“$@”</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/bash_parameter_expansion.html</link>
   <pubDate>Wed, 28 Sep 2011 19:18:16 +0000</pubDate>
   <guid isPermaLink="false">bash_parameter_expansion</guid>
   <description>
    <p></p>
    <p>在 Bash 下，$* 和 $@ 都是将所有命令行参数展开，两者在不加双引号的时候，展开结果是一样的，都是 $1 $2 $3 ...，由于没有双引号的变量在命令行展开发生在命令行解析之前，因此如果某个变量里面含有空格、tab、回车等符号的时候，展开后在命令行解析的时候就会断开被识别成两个参数。</p>
    <p>双引号引起来的变量值的代入发生在命令行解析之后，解析完毕之后，命令行已经被拆分成为参数列表，再展开的时候变量的值内部含有的空格就不会再影响到参数的切分了，这是传递内部含有空格的参数的一个非常重要的技巧。对于 "$*" 和 "$@"，加了双引号的话，两者是有很大区别的。</p>
    <p>"$*" 展开的时候，将所有待展开的参数放在一对双引号里面，展开完毕后整体变成一个参数："$1 $2 $3 ..."。</p>
    <p>而 "$@" 展开的时候，是将每个参数分别用双引号引起来，完毕后原先是几个参数展开后还是那么多个参数："$1" "$2" "$3" "..."</p>
   </description>
  </item>
  <item>
   <title>Time and Tide</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/whitby_magicalmm.html</link>
   <pubDate>Fri, 23 Sep 2011 21:26:10 +0000</pubDate>
   <guid isPermaLink="false">whitby_magicalmm</guid>
   <description>
    <p></p>
    <p>2006 年 3 月 18 日。</p>
    <p>大猫游 Yorkshore 北部的 Whitby 海滨小镇。</p>
    <p>一望无际的北海边，这个小镇像春天草地上的野花般地点缀在群山碧海之间。白鸥，天鹅，一脸陶醉的游人和他们的欢跳的爱犬，熙熙攘攘的小店和轰鸣的涛声。在无数极富特色的商店中，街道的尽头有一家很不起眼的小礼品店，可能是由于位置有些偏僻，门庭颇有些冷落。但是它的名字立刻吸引了大猫的注意：Time and Tide。大猫驻足片刻，感慨万千。</p>
    <p>英文有这样的谚语：Time and tide wait for no man，这家小店的名字大概来源于此吧。</p>
    <p>《论语》曰：逝者如斯，不分昼夜。</p>
    <p>《北非谍影》中的英格丽·褒曼随着钢琴即兴哼出的那首荡气回肠的情歌，钢琴师感慨地说：A lot of water under the bridge.</p>
    <p>当年红极一时的《中华民谣》的歌词：</p>
    <p>听一听看一看想一想</p>
    <p>时光呀流水匆匆过</p>
    <p>哭一哭笑一笑不用说</p>
    <p>人生能有几回合</p>
    <p>中文和英文中原来有如此完美的默契和对应。</p>
    <p>一年前的一月，当大猫在无边的风雪中绝望地哭泣时，她从来没有想到今天能够拥有独立和自由。</p>
    <p>英格兰的大海是豪放的，这里流传着罗宾汉劫富济贫的传说，怀念着海盗横行的时代的狂野。如果说连云港的苏马湾是江南佳丽，立于船头，吟唱唱婉约小曲的话，约克郡的海岸就是关西大汉了，铜琵琶、铁拍板，高唱：大江东去……</p>
    <p>当大猫在苏马湾满面愁容地强作欢颜时，她从没有想到有一天能够在英国自由的天空下幸福地微笑。</p>
    <p>但愿人长久，千里共婵娟。</p>
    <p>──大猫</p>
   </description>
  </item>
  <item>
   <title>ViKi 小工具</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/viki_script.html</link>
   <pubDate>Fri, 23 Sep 2011 19:47:47 +0000</pubDate>
   <guid isPermaLink="false">viki_script</guid>
   <description>
    <p></p>
    <p></p>
    <p>1 ViKi 编译脚本</p>
    <p></p>
    <p>为了方便生成的 HTML 的打包与上传，最好不要把 viki 文件与生成的 HTML 文件放在同一个目录下，滇狐提供的 Linux 和 Windows 下的编译脚本中，开头部分都含有目的 HTML 存放路径的定义，请根据需要进行修改。</p>
    <p>在 Linux 下，滇狐编写了一段 shell 脚本来处理 ViKi 的编译，只要将以下脚本存放到 viki 文件所在的文件夹，修改“TARGET_DIR”一行，将它指向你存放 HTML 的目的文件夹，然后到 viki 所在文件夹下执行该脚本就可以了：</p>
    <p>#!/usr/bin/env bash</p>
    <p></p>
    <p>umask 0022</p>
    <p></p>
    <p>TARGET_DIR=~/public_html/html</p>
    <p>ARGS="-m lang-zh_CN-autospace -m utf8 -m code-vim73 -t bright.html --css bright -X"</p>
    <p></p>
    <p>if [ $# -gt 0 ]; then</p>
    <p>  all=yes</p>
    <p>else</p>
    <p>  all=no</p>
    <p>fi</p>
    <p></p>
    <p>for file in *.viki; do</p>
    <p>  filebase=`basename "$file" .viki`</p>
    <p>  output="$TARGET_DIR/$filebase.html"</p>
    <p>  shouldbuild=no</p>
    <p>  if [ "$all" = "yes" -o "$file" -nt "$output" ]; then</p>
    <p>    shouldbuild=yes</p>
    <p>  fi</p>
    <p>  if [ "$shouldbuild" = "no" ]; then</p>
    <p>    for dep in `grep '^#WITH ' $file | \</p>
    <p>          sed -e 's/^#WITH file=//' -e 's/:.*$//'`; do</p>
    <p>      if [ "$dep" -nt "$output" ]; then</p>
    <p>        shouldbuild=yes</p>
    <p>        break</p>
    <p>      fi</p>
    <p>    done</p>
    <p>  fi</p>
    <p>  if [ "$shouldbuild" = "yes" ]; then</p>
    <p>    tempfile=`tempfile`</p>
    <p>    deplate -o "$output" $ARGS "$file"</p>
    <p>    echo "$filebase" &gt;&gt; upload.txt</p>
    <p>    rm -rf $TARGET_DIR/*_code_*</p>
    <p>    tags=`grep ^#KEYWORDS: $file | head -1 | cut -c 1-11 --complement`</p>
    <p>    if [ "$tags" != "" ]; then</p>
    <p>      title=`grep ^#TITLE: $file | head -1 | cut -c 1-8 --complement`</p>
    <p>      if [ "$title" = "" ]; then</p>
    <p>        title="&lt;无标题文档&gt;"</p>
    <p>      fi</p>
    <p>      echo "$tags" | sed 's/ *; */\n/g' | (</p>
    <p>        while read tag; do</p>
    <p>          tagfile=$(printf 'tag_%02x_%s' \</p>
    <p>              "$(echo -n "$tag" | wc -c)" \</p>
    <p>              "$(echo -n "$tag" | md5sum | awk '{ print $1 }')")</p>
    <p>          echo -n "&lt;a href=\"$tagfile.html\"&gt;$tag&lt;/a&gt; " &gt;&gt; $tempfile</p>
    <p>        done</p>
    <p>      )</p>
    <p>      command="s,TAGS_GO""ES_HERE,&lt;div id=\"tags\"&gt; 标签：`cat $tempfile`&lt;/div&gt;,"</p>
    <p>    else</p>
    <p>      command="s,TAGS_GO""ES_HERE,,"</p>
    <p>    fi</p>
    <p>    if grep -q 'TAGS_GO''ES_HERE' $TARGET_DIR/$filebase.html ; then</p>
    <p>      sed -i -e "$command" $TARGET_DIR/$filebase.html</p>
    <p>    fi</p>
    <p>    rm $tempfile</p>
    <p>  fi</p>
    <p>done</p>
    <p></p>
    <p>mv upload.txt upload.bak</p>
    <p>sort upload.bak | uniq &gt; upload.txt</p>
    <p>rm -f upload.bak</p>
    <p>滇狐不在 Windows 下写 ViKi，不过还是为仍在 Windows 下受苦的朋友们提供了使用 vbs 编写的编译脚本。将这个脚本放到 viki 文件所在的文件夹下，命名为 build.vbs，修改“htmlPath”一行，将它指向你存放 HTML 的目的文件夹，然后到 viki 所在文件夹下双击该脚本就可以了。这个脚本是滇狐 2005 年写的，已经长时间没有在 Windows 下测试过该段脚本的有效性，所以如果这段脚本在你的机器上无法正常运行的话，请自行修改，欢迎将修改后的脚本发回给滇狐共享。</p>
    <p>On Error Resume Next</p>
    <p></p>
    <p>htmlPath = "C:\Documents and Settings\edward\My Documents\html"</p>
    <p>args = "-m zh-cn-autospace -m utf8 -m code-vim73 -t bright.html --css bright -X"</p>
    <p></p>
    <p>If Right(htmlPath, 1) &lt;&gt; "\" Then</p>
    <p>    htmlPath = htmlPath &amp; "\"</p>
    <p>End If</p>
    <p></p>
    <p>sSelfPath = WScript.ScriptFullName</p>
    <p>sSelfPath = Left(sSelfPath, InStrRev(sSelfPath, "\") - 1)</p>
    <p></p>
    <p>Set WshShell = CreateObject("WScript.Shell")</p>
    <p>Set fso = CreateObject("Scripting.FileSystemObject")</p>
    <p>tSelfTime = fso.GetFile(WScript.ScriptFullName).DateLastModified</p>
    <p></p>
    <p>Set folder = fso.GetFolder(sSelfPath)</p>
    <p>For Each file In folder.Files</p>
    <p>    build = false</p>
    <p>    vikiName = file.Name</p>
    <p>    htmlFilename = ""</p>
    <p></p>
    <p>    If Len(vikiName) &gt; 5 Then</p>
    <p>        If LCase(Right(vikiName, 5)) = ".viki" Then</p>
    <p>            htmlFilename = htmlPath &amp; Left(vikiName, Len(vikiName) - 5) _</p>
    <p>                &amp; ".html"</p>
    <p>            If fso.FileExists(htmlFilename) Then</p>
    <p>                Set htmlFile = fso.GetFile(htmlFilename)</p>
    <p>                If file.DateLastModified &gt; htmlFile.DateLastModified Or _</p>
    <p>                    tSelfTime&gt; htmlFile.DateLastModified Then</p>
    <p>                    build = True</p>
    <p>                End if</p>
    <p>            Else</p>
    <p>                build = True</p>
    <p>            End if</p>
    <p>        End if</p>
    <p>    End If</p>
    <p></p>
    <p>    If build Then</p>
    <p>        cmdLine = "deplate.exe " &amp; args &amp; " -d " _</p>
    <p>            &amp; """" &amp; Replace(htmlPath, "\", "/") &amp; """ " _</p>
    <p>            &amp; """" &amp; Replace(file.Path, "\", "/")  &amp; """"</p>
    <p>        WScript.StdOut.WriteLine cmdLine</p>
    <p>        Set oExec = WshShell.Exec("cmd.exe /c " &amp; cmdLine &amp; " 2&gt;&amp;1")</p>
    <p>        While Not oExec.StdOut.AtEndOfStream</p>
    <p>            Line = oExec.StdOut.ReadLine</p>
    <p>            WScript.StdOut.WriteLine Line</p>
    <p>        Wend</p>
    <p>    End if</p>
    <p>Next</p>
    <p></p>
    <p>cmdLine = "del """ &amp; htmlPath &amp; "code_*"" """ &amp; htmlPath &amp; "deplateCodeAuto*"""</p>
    <p>WScript.StdOut.WriteLine cmdLine</p>
    <p>Set oExec = WshShell.Exec("cmd.exe /c " &amp; cmdLine &amp; " 2&gt;&amp;1")</p>
    <p>While Not oExec.StdOut.AtEndOfStream</p>
    <p>    Line = oExec.StdOut.ReadLine</p>
    <p>    WScript.StdOut.WriteLine Line</p>
    <p>Wend</p>
    <p></p>
    <p>Set fso = Nothing</p>
    <p>Set WshShell = Nothing</p>
    <p></p>
    <p></p>
    <p>2 更新日志生成脚本</p>
    <p></p>
    <p>滇狐曾经使用这段 sh 脚本生成网站的更新日志，目前暂不提供该脚本的 Windows 版本。</p>
    <p>#!/bin/sh</p>
    <p></p>
    <p>get_title()</p>
    <p>{</p>
    <p>    titleline="`grep '^#TITLE:' $filename`"</p>
    <p>    title="${titleline/\#TITLE:/}"</p>
    <p>    title=`echo $title`</p>
    <p>    if test "$title" = ""; then</p>
    <p>        title="&lt;无标题文档&gt;"</p>
    <p>    fi</p>
    <p>}</p>
    <p></p>
    <p>list_item()</p>
    <p>{</p>
    <p>    get_title</p>
    <p>    echo &gt;&gt; $logfile</p>
    <p>    echo "    * [[`basename $filename .viki`][$title]]" &gt;&gt; $logfile</p>
    <p>}</p>
    <p></p>
    <p>logtitle=`date +"%Y 年 %m 月 %d 日 更新日志"`</p>
    <p>logfile=`date +"log_%Y%m%d.viki"`</p>
    <p>echo "#TITLE: $logtitle" &gt; $logfile</p>
    <p>echo &gt;&gt; $logfile</p>
    <p>echo $logtitle &gt;&gt; $logfile</p>
    <p></p>
    <p>for item in `grep \\.html$ upload.txt`</p>
    <p>do</p>
    <p>    filename=`basename $item .html`.viki</p>
    <p>    list_item</p>
    <p>done</p>
    <p></p>
    <p>touch log.viki</p>
    <p>grep -v '#TITLE:' log.viki &gt; log.bak</p>
    <p></p>
    <p>echo "#TITLE: 更新日志" &gt; log.viki</p>
    <p>echo &gt;&gt; log.viki</p>
    <p>echo "    * [[`basename $logfile .viki`][$logtitle]]" &gt;&gt; log.viki</p>
    <p>cat log.bak &gt;&gt; log.viki</p>
    <p>rm -f log.bak</p>
    <p></p>
    <p></p>
    <p>3 打包上传脚本</p>
    <p></p>
    <p>由于学校提供的服务器不支持 FTP 上传，HTTP 上传总是比较麻烦。幸好服务器支持 zip 包的上传解压，为了节省工作量，滇狐使用这段脚本生成上传用的 zip 包。从上文的编译脚本可以看出，滇狐在编译时记录了被更新过的文件名列表，所以打包的时候就比较简单了：</p>
    <p>#!/bin/sh</p>
    <p></p>
    <p>TARGET_DIR=~/public_html</p>
    <p>TARGET=html</p>
    <p>ZIP_FILE=html.zip</p>
    <p></p>
    <p>curpath=`pwd`</p>
    <p>pushd .</p>
    <p></p>
    <p>cd $TARGET_DIR</p>
    <p>rm -f $ZIP_FILE</p>
    <p></p>
    <p>for file in `cat $curpath/upload.txt`</p>
    <p>do</p>
    <p>    zip $ZIP_FILE $TARGET/$file</p>
    <p>done</p>
    <p></p>
    <p>popd</p>
    <p></p>
    <p>rm -f upload.txt</p>
    <p>Windows 下的打包脚本就不提供了，因为 xcopy 命令可以自动判断文件修改时间，很容易自己写一个打包脚本。而且，大部分 Windows 机器上都不会安装 zip.exe，所以滇狐没法提供一个通用的 zip 打包脚本。</p>
   </description>
  </item>
  <item>
   <title>滇狐的 .vimrc</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/_vimrc.html</link>
   <pubDate>Fri, 23 Sep 2011 19:11:34 +0000</pubDate>
   <guid isPermaLink="false">_vimrc</guid>
   <description>
    <p></p>
    <p>以下是滇狐自己的 .vimrc，有许多根据滇狐自己的习惯做的设置，如果你要在自己机器上使用的话，请根据你自己的习惯作出相应修改。</p>
    <p>另外，这份 .vimrc 里面有许多设置是针对插件的，只有安装了相应插件后，这些配置才会起作用。这里有滇狐使用的全部插件打包，如果需要的话可以直接下载，Linux 用户将该压缩包解压到 $HOME 目录下即可使用，Windows 用户可以将压缩包解压后，将解压得到的 .vim 文件夹改名为 vimfiles，然后复制到 VIM 的安装路径下，覆盖原有文件。</p>
    <p>"=============================================================================</p>
    <p>" General settings</p>
    <p>"=============================================================================</p>
    <p></p>
    <p>set nocp</p>
    <p></p>
    <p>" Tab related</p>
    <p>set ts=4</p>
    <p>set sw=4</p>
    <p>set smarttab</p>
    <p>set et</p>
    <p>set ambiwidth=double</p>
    <p></p>
    <p>" Format related</p>
    <p>set tw=80</p>
    <p>set lbr</p>
    <p>set fo+=mB</p>
    <p></p>
    <p>" Indent related</p>
    <p>set cin</p>
    <p>set ai</p>
    <p>set cino=:0g0t0(susj1</p>
    <p></p>
    <p>" Editing related</p>
    <p>set backspace=indent,eol,start</p>
    <p>set whichwrap=b,s,&lt;,&gt;,[,]</p>
    <p>set mouse=a</p>
    <p>set selectmode=</p>
    <p>set mousemodel=popup</p>
    <p>set keymodel=</p>
    <p>set selection=inclusive</p>
    <p></p>
    <p>" Misc</p>
    <p>set wildmenu</p>
    <p>set spell</p>
    <p></p>
    <p>" Encoding related</p>
    <p>set encoding=utf-8</p>
    <p>set langmenu=zh_CN.UTF-8</p>
    <p>language message zh_CN.UTF-8</p>
    <p>set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1</p>
    <p></p>
    <p>set list</p>
    <p>set listchars=tab:»\ ,trail:\ ,extends:»,precedes:«</p>
    <p>highlight SpecialKey ctermbg=Red guibg=Red</p>
    <p></p>
    <p>" File type related</p>
    <p>filetype plugin indent on</p>
    <p></p>
    <p>" Persistent undo</p>
    <p>if v:version &gt;= 703</p>
    <p>    set undodir=$HOME/.vimundodir</p>
    <p>    set colorcolumn=+1</p>
    <p>endif</p>
    <p></p>
    <p>" Display related</p>
    <p>set ru</p>
    <p>set sm</p>
    <p>set hls</p>
    <p>if (has("gui_running"))</p>
    <p>    set guioptions-=m</p>
    <p>    set guioptions-=T</p>
    <p>    set guioptions+=b</p>
    <p>    if $USER == "root"</p>
    <p>        colo peachpuff</p>
    <p>    else</p>
    <p>        colo torte</p>
    <p>    endif</p>
    <p>    set nowrap</p>
    <p>else</p>
    <p>    if $USER == "root"</p>
    <p>        colo shine</p>
    <p>    else</p>
    <p>        colo ron</p>
    <p>    endif</p>
    <p>    set wrap</p>
    <p>endif</p>
    <p>syntax on</p>
    <p></p>
    <p>" ============================================================================</p>
    <p>" Shortcuts</p>
    <p>" ============================================================================</p>
    <p></p>
    <p>" Move lines</p>
    <p>nmap &lt;C-Down&gt; :&lt;C-u&gt;move .+1&lt;CR&gt;</p>
    <p>nmap &lt;C-Up&gt; :&lt;C-u&gt;move .-2&lt;CR&gt;</p>
    <p></p>
    <p>imap &lt;C-Down&gt; &lt;C-o&gt;:&lt;C-u&gt;move .+1&lt;CR&gt;</p>
    <p>imap &lt;C-Up&gt; &lt;C-o&gt;:&lt;C-u&gt;move .-2&lt;CR&gt;</p>
    <p></p>
    <p>vmap &lt;C-Down&gt; :move '&gt;+1&lt;CR&gt;gv</p>
    <p>vmap &lt;C-Up&gt; :move '&lt;-2&lt;CR&gt;gv</p>
    <p></p>
    <p>" Toggle line number</p>
    <p>nmap &lt;C-F12&gt; :set nu!&lt;CR&gt;</p>
    <p>imap &lt;C-F12&gt; &lt;C-o&gt;:set nu!&lt;CR&gt;</p>
    <p></p>
    <p>" Toggle spell check</p>
    <p>" For VIM7 only</p>
    <p>nmap &lt;C-F11&gt; :setlocal spell!&lt;CR&gt;</p>
    <p>imap &lt;C-F11&gt; &lt;C-o&gt;:setlocal spell!&lt;CR&gt;</p>
    <p></p>
    <p>"=============================================================================</p>
    <p>" Modes</p>
    <p>"=============================================================================</p>
    <p></p>
    <p>function EnglishMode()</p>
    <p>    setlocal spell</p>
    <p>    setlocal formatexpr=</p>
    <p>endfunction</p>
    <p>command -nargs=0 EnglishMode call EnglishMode()</p>
    <p></p>
    <p>function ChineseMode()</p>
    <p>    setlocal nospell</p>
    <p>    setlocal formatexpr=autofmt#japanese#formatexpr()</p>
    <p>endfunction</p>
    <p>command -nargs=0 ChineseMode call ChineseMode()</p>
    <p></p>
    <p>function TextMode()</p>
    <p>    setlocal nocin</p>
    <p>    setlocal nosi</p>
    <p>    setlocal noai</p>
    <p>    setlocal tw=80</p>
    <p>endfunction</p>
    <p>command -nargs=0 TextMode call TextMode()</p>
    <p></p>
    <p>function CodeMode()</p>
    <p>    setlocal cin</p>
    <p>    setlocal si</p>
    <p>    setlocal ai</p>
    <p>    setlocal tw=80</p>
    <p>endfunction</p>
    <p>command -nargs=0 CodeMode call CodeMode()</p>
    <p></p>
    <p>function MailMode()</p>
    <p>    call TextMode()</p>
    <p>    setlocal tw=70</p>
    <p>endfunction</p>
    <p>command -nargs=0 MailMode setlocal ft=mail</p>
    <p></p>
    <p>function BBSMode()</p>
    <p>    call MailMode()</p>
    <p>    call ChineseMode()</p>
    <p>    setlocal tw=76</p>
    <p>endfunction</p>
    <p>command -nargs=0 BBSMode setlocal ft=bbs</p>
    <p></p>
    <p>function VikiMode()</p>
    <p>    call ChineseMode()</p>
    <p>    setlocal ft=viki</p>
    <p>endfunction</p>
    <p>command -nargs=0 VikiMode call VikiMode()</p>
    <p></p>
    <p>"=============================================================================</p>
    <p>" Functions</p>
    <p>"=============================================================================</p>
    <p></p>
    <p>function QuoteFix()</p>
    <p>    %s/^\(&gt; \?\)*&gt;/\=substitute(submatch(0), " ", "", "g")/ge</p>
    <p>    g/^\(&gt; \?\)\+\s*$/d</p>
    <p>endfunction</p>
    <p>command -nargs=0 QuoteFix call QuoteFix()</p>
    <p></p>
    <p>function TimeStamp()</p>
    <p>    let curposn= SaveWinPosn()</p>
    <p>    %s/\$Date: .*\$/\=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge</p>
    <p>    %s/Last Change: .*$/\=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge</p>
    <p>    %s/Last Modified: .*$/\=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge</p>
    <p>    " Replace once and never update.</p>
    <p>    %s/Created: *$/\=strftime("Created: %Y-%m-%d %H:%M:%S")/ge</p>
    <p>    call RestoreWinPosn(curposn)</p>
    <p>endfunction</p>
    <p>command -nargs=0 TimeStamp call TimeStamp()</p>
    <p></p>
    <p>function AutoTimeStamp()</p>
    <p>    augr tagdate</p>
    <p>    au!</p>
    <p>    au BufWritePre,FileWritePre * call TimeStamp()</p>
    <p>    augr END</p>
    <p>endfunction</p>
    <p>command -nargs=0 AutoTimeStamp call AutoTimeStamp()</p>
    <p></p>
    <p>function NoAutoTimeStamp()</p>
    <p>    augr tagdate</p>
    <p>    au!</p>
    <p>    augr END</p>
    <p>endfunction</p>
    <p>command -nargs=0 NoAutoTimeStamp call NoAutoTimeStamp()</p>
    <p></p>
    <p>command -nargs=1 Margin exec "match Error /.\\%&gt;" . (&lt;args&gt; + 1) . "v/"</p>
    <p>command -nargs=0 NoMargin match none</p>
    <p></p>
    <p>function CodeLayout()</p>
    <p>    call CodeMode()</p>
    <p>    WManager</p>
    <p>    Tlist</p>
    <p>endfunction</p>
    <p>command -nargs=0 CodeLayout call CodeLayout()</p>
    <p></p>
    <p>function CodeLayoutSmall(c)</p>
    <p>    call CodeLayout()</p>
    <p>    let &amp;columns=a:c</p>
    <p>    exec "norm \&lt;c-w&gt;t"</p>
    <p>    set winfixwidth</p>
    <p>    exec "norm \&lt;c-w&gt;j"</p>
    <p>    set winfixwidth</p>
    <p>    set winfixheight</p>
    <p>    exec "norm \&lt;c-w&gt;l"</p>
    <p>    set nu</p>
    <p>    set lines=56</p>
    <p>    exec "norm \&lt;c-w&gt;b"</p>
    <p>    set winfixwidth</p>
    <p>    exec "norm \&lt;c-w&gt;t"</p>
    <p>    exec "norm \&lt;c-w&gt;l"</p>
    <p>endfunction</p>
    <p>command -nargs=0 CodeLayoutSmall call CodeLayoutSmall(141)</p>
    <p></p>
    <p>function CodeLayoutLarge(c)</p>
    <p>    call CodeLayout()</p>
    <p>    let &amp;columns=a:c</p>
    <p>    exec "norm \&lt;c-w&gt;t"</p>
    <p>    set winfixwidth</p>
    <p>    exec "norm \&lt;c-w&gt;j"</p>
    <p>    set winfixwidth</p>
    <p>    set winfixheight</p>
    <p>    exec "norm \&lt;c-w&gt;l"</p>
    <p>    set nu</p>
    <p>    vsplit</p>
    <p>    set lines=76</p>
    <p>    exec "norm \&lt;c-w&gt;b"</p>
    <p>    set winfixwidth</p>
    <p>    exec "norm \&lt;c-w&gt;t"</p>
    <p>    exec "norm \&lt;c-w&gt;l"</p>
    <p>endfunction</p>
    <p>command -nargs=0 CodeLayoutLarge call CodeLayoutLarge(226)</p>
    <p></p>
    <p>function TtySize()</p>
    <p>    set columns=80</p>
    <p>    set lines=24</p>
    <p>endfunction</p>
    <p>command -nargs=0 TtySize call TtySize()</p>
    <p></p>
    <p>" ============================================================================</p>
    <p>" Plugins settings</p>
    <p>" ============================================================================</p>
    <p></p>
    <p>" Sketch</p>
    <p>command -nargs=0 ToggleSketch call ToggleSketch()</p>
    <p></p>
    <p>" Tlist</p>
    <p>let Tlist_Use_Right_Window=1</p>
    <p>let Tlist_File_Fold_Auto_Close=1</p>
    <p></p>
    <p>" A</p>
    <p>let g:alternateNoDefaultAlternate=1</p>
    <p>let g:alternateRelativeFiles=1</p>
    <p></p>
    <p>" Viki</p>
    <p>let g:vikiNameSuffix=".viki"</p>
    <p></p>
    <p>" FencView</p>
    <p>let g:fencview_autodetect=0</p>
    <p></p>
    <p>" showmarks</p>
    <p>let g:showmarks_enable=0</p>
    <p>let g:showmarks_include="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"</p>
    <p>let g:showmarks_hlline_lower=1</p>
    <p>let g:showmarks_hlline_upper=1</p>
    <p></p>
    <p>" autofmt</p>
    <p>let s:unicode = unicode#import()</p>
    <p>let s:orig_prop_line_break = s:unicode.prop_line_break</p>
    <p>function! s:unicode.prop_line_break(char)</p>
    <p>    if a:char == "\u201c" || a:char == "\u2018"</p>
    <p>        return "OP"   " Open Punctuation</p>
    <p>    elseif a:char == "\u201d" || a:char == "\u2019"</p>
    <p>        return "CL"   " Close Punctuation</p>
    <p>    endif</p>
    <p>    return call(s:orig_prop_line_break, [a:char], self)</p>
    <p>endfunction</p>
    <p></p>
    <p>"=============================================================================</p>
    <p>" File types</p>
    <p>"=============================================================================</p>
    <p></p>
    <p>augr filetype</p>
    <p>    " BBS</p>
    <p>    au! BufRead,BufNewFile *.bbs BBSMode</p>
    <p>    " Mail</p>
    <p>    au! FileType mail call MailMode()</p>
    <p>    " Viki</p>
    <p>    au! BufRead,BufNewFile *.viki VikiMode</p>
    <p>augr end</p>
    <p></p>
    <p>"=============================================================================</p>
    <p>" Platform dependent settings</p>
    <p>"=============================================================================</p>
    <p></p>
    <p>if (has("win32"))</p>
    <p></p>
    <p>    "-------------------------------------------------------------------------</p>
    <p>    " Win32</p>
    <p>    "-------------------------------------------------------------------------</p>
    <p></p>
    <p>    if (has("gui_running"))</p>
    <p>        set guifont=DejaVu_Sans_Mono:h9:cANSI</p>
    <p>        set guifontwide=NSimSun:h9:cGB2312</p>
    <p>    endif</p>
    <p></p>
    <p>    " For Viki</p>
    <p>    let g:netrw_browsex_viewer="start"</p>
    <p></p>
    <p>    " For tee</p>
    <p>    set shellpipe=2&gt;&amp;1\|\ tee</p>
    <p></p>
    <p>    " VimTweak</p>
    <p>    if (has("gui_running"))</p>
    <p>        command -nargs=1 SetAlpha call libcallnr("vimtweak.dll",</p>
    <p>            \"SetAlpha", &lt;args&gt;)</p>
    <p>        command -nargs=0 TopMost call libcallnr("vimtweak.dll",</p>
    <p>            \"EnableTopMost", 1)</p>
    <p>        command -nargs=0 NoTopMost call libcallnr("vimtweak.dll",</p>
    <p>            \"EnableTopMost", 0)</p>
    <p>    endif</p>
    <p></p>
    <p>else</p>
    <p></p>
    <p>    "-------------------------------------------------------------------------</p>
    <p>    " Linux</p>
    <p>    "-------------------------------------------------------------------------</p>
    <p></p>
    <p>    if (has("gui_running"))</p>
    <p>        set guifont=DejaVu\ Sans\ Mono\ 9</p>
    <p>    endif</p>
    <p></p>
    <p>    " For Viki</p>
    <p>    let g:vikiHomePage="~/Documents/Viki/index.viki"</p>
    <p>    let g:netrw_browsex_viewer="kfmclient exec"</p>
    <p></p>
    <p>    set makeprg=build</p>
    <p></p>
    <p>endif</p>
    <p></p>
    <p>set nomousehide</p>
   </description>
  </item>
  <item>
   <title>Debian Testing 中文字体美化全攻略</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/debian_testing_chinese.html</link>
   <pubDate>Fri, 23 Sep 2011 18:57:58 +0000</pubDate>
   <guid isPermaLink="false">debian_testing_chinese</guid>
   <description>
    <p></p>
    <p>中文字体美化是个很讨厌的事情，无数初学者在这里面浪费了无数时间，做了无数没有意义的事情。但这也是不得不做的，我把 Debian Wheezy 所需要的中文字体美化操作步骤详细记录在这里，希望能节约大家一部分时间。</p>
    <p></p>
    <p></p>
    <p>1 安装必要的字体包</p>
    <p></p>
    <p>首先，我们的字体美化依赖 Deja Vu 系列字体，因此我们首先安装这个软件包： ttf-dejavu。</p>
    <p>其次，因为是“中文”美化，因此必须有中文字体。经过多年的发展，文泉驿已经发展成为一个非常成熟的字体了，“文泉驿正黑”是一个非常漂亮的字体，同时支持“文泉驿点阵宋体”作为内嵌点阵，作为日常工作已经没有什么太大问题。文泉驿的安装包已经进入了 Debian，直接安装 ttf-wqy-zenhei 就可以了。如果想直接使用点阵宋体的话，可以安装 xfonts-wqy。另外，还可以通过 ttf-wqy-microhei 安装文泉驿微米黑，那是一个通过 Google 的 Droid 系列字体衍生出来的字体，效果也不错。</p>
    <p>除了文泉驿系列字体外，比较流行的免费中文字体还有文鼎提供的楷体和上海宋，包名分别是： ttf-arphic-ukai 和 ttf-arphic-uming。把这些字体都装上之后，应该就已经具备一个基本能用的中文环境了。</p>
    <p></p>
    <p></p>
    <p>2 修改配置文件</p>
    <p></p>
    <p>和若干年前比起来，目前 Debian 默认的字体配置效果已经非常好了，如果觉得已经满意了的话，完全就可以使用默认配置，不需要再做什么额外设置。如果想获得更好一些的效果的话，可以参考以下滇狐自己的字体配置文件。将以下内容写到存放到你的家目录下，命名为 .fonts.conf，就可以了。</p>
    <p>&lt;?xml version='1.0' encoding='utf-8'?&gt;</p>
    <p>&lt;!DOCTYPE fontconfig SYSTEM 'fonts.dtd'&gt;</p>
    <p>&lt;fontconfig&gt;</p>
    <p> &lt;alias&gt;</p>
    <p>  &lt;family&gt;serif&lt;/family&gt;</p>
    <p>  &lt;prefer&gt;</p>
    <p>   &lt;family&gt;DejaVu Serif&lt;/family&gt;</p>
    <p>   &lt;family&gt;Bitstream Vera Serif&lt;/family&gt;</p>
    <p>   &lt;family&gt;Evermore Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Micro Hei&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Zen Hei&lt;/family&gt;</p>
    <p>   &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;</p>
    <p>  &lt;/prefer&gt;</p>
    <p> &lt;/alias&gt;</p>
    <p> &lt;alias&gt;</p>
    <p>  &lt;family&gt;sans-serif&lt;/family&gt;</p>
    <p>  &lt;prefer&gt;</p>
    <p>   &lt;family&gt;DejaVu Sans&lt;/family&gt;</p>
    <p>   &lt;family&gt;Bitstream Vera Sans&lt;/family&gt;</p>
    <p>   &lt;family&gt;Evermore Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Micro Hei&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Zen Hei&lt;/family&gt;</p>
    <p>   &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;</p>
    <p>  &lt;/prefer&gt;</p>
    <p> &lt;/alias&gt;</p>
    <p> &lt;alias&gt;</p>
    <p>  &lt;family&gt;monospace&lt;/family&gt;</p>
    <p>  &lt;prefer&gt;</p>
    <p>   &lt;family&gt;DejaVu Sans Mono&lt;/family&gt;</p>
    <p>   &lt;family&gt;Bitstream Vera Sans Mono&lt;/family&gt;</p>
    <p>   &lt;family&gt;Evermore Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Zen Hei Mono&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Micro Hei Mono&lt;/family&gt;</p>
    <p>   &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;</p>
    <p>  &lt;/prefer&gt;</p>
    <p> &lt;/alias&gt;</p>
    <p> &lt;!-- Anti-alias --&gt;</p>
    <p> &lt;match target="font"&gt;</p>
    <p>  &lt;edit mode="assign" name="antialias"&gt;</p>
    <p>   &lt;bool&gt;true&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p>  &lt;edit mode="assign" name="rgba"&gt;</p>
    <p>   &lt;const&gt;rgb&lt;/const&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p>  &lt;edit mode="assign" name="hinting"&gt;</p>
    <p>   &lt;bool&gt;true&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p>  &lt;edit mode="assign" name="hintstyle"&gt;</p>
    <p>   &lt;const&gt;hintfull&lt;/const&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- WenQuanYi Zen Hei --&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Zen Hei&lt;/string&gt;</p>
    <p>   &lt;string&gt;文泉驿正黑&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit name="embeddedbitmap"&gt;</p>
    <p>   &lt;bool&gt;false&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p>  &lt;edit name="antialias"&gt;</p>
    <p>   &lt;bool&gt;true&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- WenQuanYi Zen Hei Sharp --&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Zen Hei Sharp&lt;/string&gt;</p>
    <p>   &lt;string&gt;文泉驿点阵正黑&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit name="embeddedbitmap"&gt;</p>
    <p>   &lt;bool&gt;true&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- WenQuanYi Bitmap Song --&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="less" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;12&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit mode="assign" name="family"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Micro Hei&lt;/string&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="more" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;16&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit mode="assign" name="family"&gt;</p>
    <p>   &lt;string&gt;AR PL ShanHeiSun&lt;/string&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- Evermore Song --&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;Evermore Song&lt;/string&gt;</p>
    <p>   &lt;string&gt;永中宋体&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="less" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;12&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit mode="assign" name="family"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Micro Hei&lt;/string&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- Use WenQuanYi Bitmap Song for bold Chinese --&gt;</p>
    <p> &lt;match target="pattern"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;Evermore Song&lt;/string&gt;</p>
    <p>   &lt;string&gt;永中宋体&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="more_eq" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;12&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="less_eq" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;16&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="more" name="weight" qual="any"&gt;</p>
    <p>   &lt;const&gt;medium&lt;/const&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit mode="assign" name="family"&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- Disable anti-alias for bitmap fonts --&gt;</p>
    <p> &lt;match target="font"&gt;</p>
    <p>  &lt;test name="family" qual="any"&gt;</p>
    <p>   &lt;string&gt;Evermore Song&lt;/string&gt;</p>
    <p>   &lt;string&gt;永中宋体&lt;/string&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Zen Hei Sharp&lt;/string&gt;</p>
    <p>   &lt;string&gt;文泉驿点阵正黑&lt;/string&gt;</p>
    <p>   &lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="more_eq" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;12&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;test compare="less_eq" name="pixelsize" qual="any"&gt;</p>
    <p>   &lt;double&gt;16&lt;/double&gt;</p>
    <p>  &lt;/test&gt;</p>
    <p>  &lt;edit mode="assign" name="antialias"&gt;</p>
    <p>   &lt;bool&gt;false&lt;/bool&gt;</p>
    <p>  &lt;/edit&gt;</p>
    <p> &lt;/match&gt;</p>
    <p> &lt;!-- Alias --&gt;</p>
    <p> &lt;alias&gt;</p>
    <p>  &lt;family&gt;SimSun&lt;/family&gt;</p>
    <p>  &lt;family&gt;宋体&lt;/family&gt;</p>
    <p>  &lt;prefer&gt;</p>
    <p>   &lt;family&gt;Evermore Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;</p>
    <p>   &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;</p>
    <p>  &lt;/prefer&gt;</p>
    <p>  &lt;default&gt;</p>
    <p>   &lt;family&gt;serif&lt;/family&gt;</p>
    <p>  &lt;/default&gt;</p>
    <p> &lt;/alias&gt;</p>
    <p> &lt;alias&gt;</p>
    <p>  &lt;family&gt;SimHei&lt;/family&gt;</p>
    <p>  &lt;family&gt;黑体&lt;/family&gt;</p>
    <p>  &lt;prefer&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Micro Hei&lt;/family&gt;</p>
    <p>   &lt;family&gt;WenQuanYi Zen Hei&lt;/family&gt;</p>
    <p>  &lt;/prefer&gt;</p>
    <p>  &lt;default&gt;</p>
    <p>   &lt;family&gt;sans-serif&lt;/family&gt;</p>
    <p>  &lt;/default&gt;</p>
    <p> &lt;/alias&gt;</p>
    <p> &lt;!-- End --&gt;</p>
    <p>&lt;/fontconfig&gt;</p>
    <p></p>
    <p></p>
    <p>3 安装额外字体</p>
    <p></p>
    <p>以上配置应该能够满足日常需要了。而且字型也足够美观大方。如果还是觉得不满意，非得偷盗版的 SimSun 才舒服的话，请将偷来的文件放到 /usr/local/share/fonts 下，然后运行 sudo fc-cache 即可。上述配置文件已经考虑了使用 SimSun 时的美化。</p>
   </description>
  </item>
  <item>
   <title>符文咒语查看器</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/runeword.html</link>
   <pubDate>Thu, 22 Sep 2011 02:08:59 +0000</pubDate>
   <guid isPermaLink="false">runeword</guid>
   <description>
    <p></p>
    <p></p>
    <p>1 简介</p>
    <p></p>
    <p>符文咒语是游戏《暗黑破坏神 II》里面的一个物品，关于符文，滇狐不想进行任何详细解释，如果不了解的朋友请参看《暗黑破坏神 II》的相关网站。</p>
    <p>当我们按照特定的顺序，把若干个特定的符文镶嵌到特定的物品上后，除了能够获得符文本身的特性外，还能得到一些额外的属性。这种镶嵌符文的方法就称为符文咒语(Rune Word)。</p>
    <p>该软件的作用就是录入符文咒语，并对符文咒语进行一些简单的检索操作，让游戏玩家能够更方便地配置出自己中意的符文咒语。</p>
    <p></p>
    <p>1.1 符文咒语输入</p>
    <p></p>
    <p>符文咒语输入程序用于录入你在网上搜索到的符文配方。点击“新建符文咒语”按钮，就能创建一个新的条目，在编辑框中输入符文咒语的名称、所需物品和该配方能够获得的属性，然后按照符文的镶嵌顺序将配方中所需的符文添加到“次序”列表框中即可。当然，选中已有的符文咒语项，也可以直接对其进行编辑与删除工作。如下图所示：</p>
    <p> rune_word_input</p>
    <p></p>
    <p>1.2 符文咒语搜索</p>
    <p></p>
    <p>为了方便打游戏，以最快速度弄清楚自己手头上的符文能够搭配得到哪些组合的符文咒语，我们可以使用这个符文咒语搜索程序。只要将自己已经获得的所有符文输入到“符文集”中，然后点击“搜索”，该程序就能把你手头上的符文能够构成的符文配方搜索出来。为了进一步方便搜索，该程序还提供了按孔数搜索、按关键字搜索等方法。如下图所示：</p>
    <p> rune_word_search</p>
    <p></p>
    <p></p>
    <p>2 安装方法</p>
    <p></p>
    <p>由于该程序是滇狐的一个练习性质的小程序，因此滇狐没有为该软件编写安装程序，在安装方面就不如普通应用程序那么方便了。为了使用这个工具，你至少需要安装这些东西：</p>
    <p></p>
    <p>2.1 安装 Python</p>
    <p></p>
    <p>Python 是什么东西，这里就不详细介绍了。由于该程序是使用 Python 编写的，因此安装一份 Python 是必不可少的。如果您的系统没有安装 Python 的话，请到 Python_的官方网站下载并进行安装。</p>
    <p></p>
    <p>2.2 安装 wxPython 库</p>
    <p></p>
    <p>该程序使用 wxPython 库编写，因此你还需要安装一份 wxPython，如果您的系统没有安装 wxPython 的话，请到 wxPython_的官方网站下载并进行安装。</p>
    <p></p>
    <p>2.3 安装 RuneWord</p>
    <p></p>
    <p>上软件安装完毕后，我们就可以安装符文咒语输入与搜索程序了。请到这里下载该程序的全部可执行程序，解压到一个文件夹下就可以用了。Windows 下直接双击 RuneWordInput.py 就能执行符文咒语输入，直接双击 RuneWordSearch.py 就能执行符文咒语检索。Linux 下可以通过命令行直接执行这两个文件。如果您在使用中遇到什么问题或有什么建议，请与滇狐联系。</p>
    <p>自己找符文密码是一件非常费时费事的事情，将找到的符文密码录入到该程序里工作量也不算小。为了减轻大家负担，滇狐把网上已公布了一部分符文密码事先录入了该系统，你只需要关闭符文密码录入程序，把预先录入的数据文件下载到你机器上的主目录下，重命名为 .RuneWords，重新开启符文密码输入程序后，符文密码就出来了。</p>
    <p>祝大家《暗黑》愉快、ViKi 愉快、工作愉快，万事愉快！</p>
   </description>
  </item>
  <item>
   <title>Linux 过期文章</title>
   <author>滇狐</author>
   <link>http://edyfox.codecarver.org/html/linux_deprecated.html</link>
   <pubDate>Thu, 22 Sep 2011 02:05:20 +0000</pubDate>
   <guid isPermaLink="false">linux_deprecated</guid>
   <description>
    <p></p>
    <p>阅读提示：</p>
    <p>本文已过时。</p>
    <p>时代在发展，社会在进步，Linux 更是一日千里地变化。滇狐的主页上的很多内容，现在都已经过时了。这里的内容都是现在不再适用的内容，请大家不要对这个栏目下的内容太当回事。</p>
    <p></p>
    <p>0.1 便携式用户配置</p>
    <p></p>
    <p>如果你有多台不同的机器的话，你也许希望能在不同的机器上都使用同样的用户配置，虽然在 Linux 所有用户配置都在 $HOME 目录下，但完整同步整个 $HOME 目录却不是每个人都能负担的开销。因此，我们需要打造一套便携式的用户配置文件。</p>
    <p></p>
    <p>0.2 在 GNOME/GTK 程序下使用 KeramiK 界面</p>
    <p></p>
    <p>滇狐一向是 KDE 的死忠支持者，因此对于 GNOME/GTK 程序，也强制要求它们使用和 KDE 一样的界面。滇狐在 KDE 下使用 KeramiK，因此 GNOME/GTK 程序也必须被强制使用_KeramiK。</p>
    <p></p>
    <p>0.3 命令行锁定 KDE 屏幕</p>
    <p></p>
    <p>使用命令行锁定 KDE 屏幕至少有这么一项用途：我可以把“锁定屏幕”这个动作定义为一个快捷方式，然后就能为它绑定快捷键。例如我现在就把锁定屏幕绑定为“Win + L”，感觉挺好的。</p>
    <p>锁定屏幕的命令是：</p>
    <p>kdesktop_lock --forcelock</p>
    <p>在滇狐的机器上，锁定屏幕功能常常抽风，无法正常锁定。为了保证每次锁定都能成功，滇狐在锁定屏幕之前一律把当前的 kdesktop_lock 杀掉，然后重新开启一个。以下是滇狐的锁定屏幕脚本：</p>
    <p>#!/bin/sh</p>
    <p> </p>
    <p>killall -q kdesktop_lock</p>
    <p>unset LANG</p>
    <p>kdesktop_lock --forcelock</p>
    <p></p>
    <p>0.4 锁定屏幕再解锁后鼠标消失的故障</p>
    <p></p>
    <p>以前在公司用 RHEL 时，就常常被一个故障困扰：锁定屏幕之后再解锁，很多时候鼠标会消失，虽然移动到屏幕下方时照样能够唤出任务栏，虽然在 gnome-mouse-properties 里设置按下 Ctrl 键后显示鼠标能够找到鼠标所在位置，但我无法使用这个看不见的鼠标对任何程序进行任何操作。以前每次遇到这种情况，我都只能把 X server 杀掉后重新登录，但今天居然在 Debian 下也遇到这个故障了，于是我下决心要搞定它。纯键盘操作上网，Google 了半天，没有任何结果，看来一切只能靠自己了。再锁住屏幕时发现锁不住，直接到命令行运行 kdesktop_lock，提示说 grabInput() 调用失败。这时我大概心里有点数了：一定是先前运行的屏保忘了退出，没释放对鼠标的控制权。于是 ps -u edward 一下，看到一个可疑的进程 xscreensaver，杀死之，一切正常！</p>
    <p></p>
    <p>0.5 设置字体解析度</p>
    <p></p>
    <p>在有的系统中，字体的解析度不是默认的 96dpi，造成在别的机器上看上去很舒服的字体设置值，抄过来后不是偏大就是偏小，修改方法是在修改 $HOME/.Xresources，加上这样一句话：</p>
    <p>Xft.dpi: 96</p>
   </description>
  </item>
 </channel>
</rss>

