JoshuaZhanghttp://www.joshuazhang.net/2017-03-24T00:00:00+08:00Cygwin 安装配置笔记2015-01-09T00:00:00+08:00Joshztag:www.joshuazhang.net,2014-12-02:posts/2014/cygwin-cfg-note.html<div class="toc">
<ul>
<li><a href="#_1">安装</a><ul>
<li><a href="#_2">基本系统</a></li>
<li><a href="#_3">安装第三方包管理工具</a></li>
<li><a href="#_4">安装编译环境</a></li>
</ul>
</li>
<li><a href="#_5">配置</a><ul>
<li><a href="#bash">配置 Bash</a></li>
<li><a href="#mintty">配置 mintty</a><ul>
<li><a href="#mintty_1">下拉式 mintty</a></li>
<li><a href="#mintty_2">mintty的常用快捷键</a></li>
<li><a href="#mintty-dos">mintty 运行 DOS 命令乱码问题</a></li>
</ul>
</li>
<li><a href="#mintty_3">替换 mintty</a></li>
<li><a href="#vim">配置 Vim</a></li>
<li><a href="#emacs">使用 Emacs</a></li>
</ul>
</li>
<li><a href="#cygwinx">Cygwin/X</a><ul>
<li><a href="#_6">安装</a></li>
<li><a href="#_7">中文支持</a></li>
</ul>
</li>
<li><a href="#_8">技巧</a><ul>
<li><a href="#_9">文件共享</a></li>
<li><a href="#_10">剪贴板共享</a></li>
<li><a href="#_11">搜索软件包</a></li>
<li><a href="#_12">打开当前目录</a></li>
<li><a href="#_13">隐藏启动终端</a></li>
</ul>
</li>
<li><a href="#_14">参考资料</a></li>
</ul>
</div>
<h1 id="_1">安装</h1>
<p>Cygwin 的安装过程并不难,但还是比较繁琐,如果你想快速拥有一个配置好的 Cygwin 环境或者仅仅想试用一下,那我推荐使用 <a href="https://babun.github.io/">Babun</a>,它是一个基于 Cygwin 的 Shell 环境,自带包管理工具<code>pact</code>(基于<code>apt-cyg</code>),预装了众多工具以及自定义配置。对于想长期使用的童靴,我还是推荐官方原配。</p>
<h2 id="_2">基本系统</h2>
<p>下载 <a href="http://cygwin.com/setup-x86.exe">setup-x86.exe</a> 或者 <a href="https://cygwin.com/setup-x86_64.exe">setup-x86_64.exe</a> 丢到安装目录<code>D:\cygwin</code>(建议)下。它是默认的图形包管理器,双击运行,设置包下载目录为<code>D:\cygwin\packages</code>。推荐的国内源地址:</p>
<div class="codehilite"><pre>; 网易
http://mirrors.163.com/cygwin/
; 中科大
http://mirrors.ustc.edu.cn/cygwin/
; 搜狐
http://mirrors.sohu.com/cygwin/
</pre></div>
<p>安装时注意选上<code>subversion</code>和<code>wget</code>,为安装<code>apt-cyg</code>做准备。</p>
<h2 id="_3">安装第三方包管理工具</h2>
<p><code>cygwin</code>自带的图形包管理器需要重复一些配置操作,而且需要搜索包名安装,实在是不方便。<a href="http://code.google.com/p/apt-cyg/"><code>apt-cyg</code></a>(或者<a href="http://code.google.com/p/cyg-apt/">cyg-apt</a>)则提供了类似<code>debian</code>下<code>apt-get</code>相同的功能,非常方便包管理,强烈推荐安装。首先用默认包管理器安装好<code>subversion</code>和<code>wget</code>,启动<code>Cygwin Terminal</code>,输入如下命令:</p>
<div class="codehilite"><pre><span class="nv">$ </span>svn --force <span class="nb">export </span>http://apt-cyg.googlecode.com/svn/trunk/ /bin/
<span class="nv">$ </span>chmod+x /bin/apt-cyg
<span class="nv">$ </span>apt-cyg -m http://mirrors.163.com/cygwin/ <span class="c"># 设置apt-cyg的源地址</span>
</pre></div>
<div class="codehilite"><pre>apt-cyg: Installs and removes Cygwin packages.
"apt-cyg install <package names>" to install packages
"apt-cyg remove <package names>" to remove packages
"apt-cyg update" to update setup.ini
"apt-cyg show" to show installed packages
"apt-cyg find <patterns>" to find packages matching patterns
"apt-cyg describe <patterns>" to describe packages matching patterns
"apt-cyg packageof <commands or files>" to locate parent packages
Options:
--mirror, -m <url> : set mirror
--cache, -c <dir> : set cache
--file, -f <file> : read package names from file
--noupdate, -u : don't update setup.ini from mirror
--help
--version
</pre></div>
<p>一些必备的软件:git、openssh、openssl、binutils,
有用的工具:util-linux(more)、bash-completion(经测试可能影响终端启动性能)、procps(top)、inetutils(telnet)、bind-utils(dig)。</p>
<h2 id="_4">安装编译环境</h2>
<p>随着 Cygwin 的更新,目前越来越多的软件可以在 Cygwin 下通过编译,但是比起 Linux 系统,出问题的概率仍然较高,而且有些编译和运行的需求是 Cygwin 平台无法满足的。因此普通用户应当优先使用二进制包,在最不利的情况下才应该尝试自己编译软件。</p>
<div class="codehilite"><pre><span class="nv">$ </span>apt-get install gcc4-core gcc4-g++ gdb make autoconf automake
<span class="nv">$ </span>gcc --version
<span class="nv">$ </span>g++ --version
</pre></div>
<h1 id="_5">配置</h1>
<h2 id="bash">配置 Bash</h2>
<p>鉴于 Cygwin 下大部分的配置都和 Linux 相同,因此,为了免除维护两份配置文件的麻烦,可以在<code>~/.bashrc</code>中写入:</p>
<div class="codehilite"><pre><span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$OSTYPE</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"linux-gnu"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"Linux-gnu environment detected."</span>
<span class="k">elif</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$OSTYPE</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"cygwin"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"Cygwin environment detected."</span>
<span class="k">if</span> <span class="o">[</span> -f <span class="s2">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.bashrc.cygwin"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">source</span> <span class="s2">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.bashrc.cygwin"</span>
<span class="k">fi</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"Unknown Platform"</span>
<span class="k">fi</span>
</pre></div>
<p>这样所有 cygwin 下特定的配置都可以写入到 <code>~/.bashrc.cygwin</code> 了。</p>
<h2 id="mintty">配置 mintty</h2>
<p>在终端标题栏右键选择“Options”就可以设置mintty的显示效果,主要修改几个方面:</p>
<ul>
<li>字体,我个人喜欢 <a href="http://levien.com/type/myfonts/inconsolata.html">Inconsolata</a>,或者你可以从<a href="http://www.lowing.org/fonts/">这里</a>挑一个。</li>
<li>终端窗口大小,可按照屏幕大小自己调整。</li>
<li>透明度,medium 级别在 win7 下看着比较舒服。</li>
</ul>
<p>Mintty 默认设置下深蓝色不够显眼,看着很吃力,我建议大家使用 <a href="https://github.com/oumu/mintty-color-schemes">mintty-color-schemes</a> 的主题,我个人最偏爱对比度较高的<code>base16-shapeshifter-mod-lighten</code>。</p>
<p>如果想恢复默认设置,只需要清空<code>~/.minttyrc</code>中的内容。</p>
<p>我的<code>~/.minttyrc</code>:</p>
<div class="codehilite"><pre><span class="nv">BoldAsFont</span><span class="o">=</span>no
<span class="nv">Font</span><span class="o">=</span>Monaco
<span class="nv">FontHeight</span><span class="o">=</span>10
<span class="nv">Transparency</span><span class="o">=</span>medium
<span class="nv">CursorType</span><span class="o">=</span>block
<span class="nv">CursorBlinks</span><span class="o">=</span>no
<span class="nv">Scrollbar</span><span class="o">=</span>right
<span class="nv">Columns</span><span class="o">=</span>120
<span class="nv">Rows</span><span class="o">=</span>26
<span class="nv">BackspaceSendsBS</span><span class="o">=</span>yes
<span class="nv">Locale</span><span class="o">=</span>zh_CN
<span class="nv">Charset</span><span class="o">=</span>UTF-8
<span class="c"># base16-shapeshifter-mod-lighten theme</span>
<span class="c"># from: https://github.com/oumu/mintty-color-schemes</span>
<span class="nv">ForegroundColour</span><span class="o">=</span>171,171,171
<span class="nv">BackgroundColour</span><span class="o">=</span>0,0,0
<span class="nv">CursorColour</span><span class="o">=</span>253,157,79
<span class="nv">Black</span><span class="o">=</span>0,0,0
<span class="nv">BoldBlack</span><span class="o">=</span>52,52,52
<span class="nv">Red</span><span class="o">=</span>233,47,47
<span class="nv">BoldRed</span><span class="o">=</span>240,116,116
<span class="nv">Green</span><span class="o">=</span>14,216,57
<span class="nv">BoldGreen</span><span class="o">=</span>64,243,102
<span class="nv">Yellow</span><span class="o">=</span>221,221,19
<span class="nv">BoldYellow</span><span class="o">=</span>240,240,78
<span class="nv">Blue</span><span class="o">=</span>59,72,227
<span class="nv">BoldBlue</span><span class="o">=</span>125,135,236
<span class="nv">Magenta</span><span class="o">=</span>249,150,226
<span class="nv">BoldMagenta</span><span class="o">=</span>253,222,246
<span class="nv">Cyan</span><span class="o">=</span>35,237,218
<span class="nv">BoldCyan</span><span class="o">=</span>107,243,230
<span class="nv">White</span><span class="o">=</span>171,171,171
<span class="nv">BoldWhite</span><span class="o">=</span>249,249,249
</pre></div>
<p>更多配置请参考<code>man mintty</code>。</p>
<h3 id="mintty_1">下拉式 mintty</h3>
<p>mintty本身并非下拉式终端,即不能通过热键来呼出或隐藏,参考了网友所写的 <a href="https://bitbucket.org/riverscn/cyg-hotkey/">cyg-hotkey</a>,我用<code>AHK</code>写了个小工具 <a href="https://github.com/voidmous/PUF/tree/ahk-devel">PUF</a>,可以实现任意窗口程序的热键呼出。如果要使用 cyg-hotkey,可运行下列命令:</p>
<div class="codehilite"><pre><span class="nv">$ </span>hg clone https://bitbucket.org/riverscn/cyg-hotkey <span class="c"># 需安装mercurial</span>
<span class="nv">$ </span><span class="nb">cd </span>cyg-hotkey
<span class="nv">$ </span>make all <span class="o">&&</span> make install
</pre></div>
<p>cyg-hotkey 默认使用快捷键 F7,运行<code>cyg-hotkey.exe</code>后即可使用 F7 来呼出/隐藏 mintty 窗口。</p>
<h3 id="mintty_2">mintty的常用快捷键</h3>
<ul>
<li>Shift+Insert 粘贴</li>
<li>Alt+Enter 全屏</li>
<li>Alt+F2 开启一个新 mintty 终端</li>
<li>Ctrl+Tab 在不同终端间切换</li>
</ul>
<h3 id="mintty-dos">mintty 运行 DOS 命令乱码问题</h3>
<p>虽然 cygwin 已经提供了很完备的命令行工具,但涉及到 Windows 配置的个别命令仍然需要到 cmd.exe 下运行(比如<code>ipconfig</code>,<code>taskkill</code>,<code>set</code>等),能不能让这些命令也在<code>mintty</code>下运行呢?答案是肯定的,可以运行,但是并不完美,中文系统运行会出现乱码。原因就在于 cmd.exe 默认的<code>Code Page</code>为<code>cp 936 ANSI/OEM 简体中文 936</code>(在 cmd.exe 窗口右键——属性——选项中可查看),而我们默认设置的 cygwin 编码为 UTF-8,于是 DOS 命令输出的中文一概会变成方框。可选的解决方案有以下几种:</p>
<ul>
<li>改变 cmd.exe 的默认输出编码。通过修改注册表更改系统默认设置,见 <a href="https://stackoverflow.com/questions/14109024/how-to-make-unicode-charset-in-cmd-exe-by-default">How to make Unicode charset in cmd.exe by default?</a>。此方法非常危险,会导致系统无法启动,请不要轻易尝试。</li>
<li>改变 cygwin 和 mintty 的编码。将 cygwin 的 locale 全部改成 zh_CN.GBK,mintty 的 CharSet 也设置为 GBK 即可。但是在大部分软件都以 UTF-8 作为默认输入和输出编码的环境下,这样做会干扰许多软件,比如此时 Vim 中文显示就全是乱码,因此此方案也不推荐。</li>
<li><a href="https://cygwin.com/faq-nochunks.html#faq.using.weirdchars">临时改变 cmd.exe 的输出编码</a>。在<code>bash.rc</code>中添加<code>cmd /c chcp 65001</code>,这样就可以让 mintty 执行 DOS 命令时输出 UTF 编码。不过让人蛋疼的是,<code>cmd.exe</code>本身如果变成 UTF-8 输出(运行<code>chcp 65001</code>可临时改变输出编码,见 <a href="https://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how/388500#388500">Unicode characters in Windows command line - how?</a>)时,不仅提示全变为英文,且不再支持中文目录(具体原因不详)。幸好在 mintty 下,中文目录没有问题,只是只有英文提示参考,算是变相地解决了乱码的问题。</li>
<li>使用 iconv 转换编码,这是推荐方案。将所有 windows 命令行程序的输出利用管道进行从 GBK 到 UTF-8 的编码转换,比如<code>ipconfig /all | uo</code>,其中命令 uo (UTF Output)定义为:</li>
</ul>
<div class="codehilite"><pre>uo<span class="o">()</span> <span class="o">{</span>
iconv -f gbk -t utf-8 <span class="nv">$1</span> <span class="p">|</span> less
<span class="o">}</span>
</pre></div>
<h2 id="mintty_3">替换 mintty</h2>
<p>虽然 mintty 也还不错,但也有其自身的限制(详细信息可参考其 Manual),从我使用的过程来看,<code>ConEmu</code>是不错的替代者。</p>
<ul>
<li><a href="https://blog.openshift.com/upgrade-cygwin-to-console2-and-improve-the-productivity-of-openshifts-rhc-client-tools-on-wind/">Upgrade Cygwin to Console2 and Improve Windows Productivity</a>,本人测试不成功,UI有问题</li>
<li><a href="https://superuser.com/questions/591206/how-do-i-configure-conemu-to-run-cygwin-bash">How do I configure ConEmu to run Cygwin Bash?</a>,测试成功,界面不错,功能也很多,但<code>tmux</code>无法运行。</li>
<li><a href="http://alternativeto.net/software/conemu/">Windows下的各类 Command Prompt</a></li>
</ul>
<h2 id="vim">配置 Vim</h2>
<p>Cygwin 下运行 Vim 必要的配置,加入到<code>~/.vimrc</code>:</p>
<div class="codehilite"><pre><span class="c">"Cygwin相关设置</span>
<span class="k">set</span> <span class="nb">nocompatible</span>
<span class="k">set</span> <span class="nb">backspace</span><span class="p">=</span>indent<span class="p">,</span><span class="nb">eol</span><span class="p">,</span><span class="k">start</span>
</pre></div>
<h2 id="emacs">使用 Emacs</h2>
<p>Emacs 是神器,但不是普通人能玩得转的,偶尔拿来写点文字还不错,做为 IDE 的话门槛太高,我们作为普通用户还是不要跳这个坑了。关于 Emacs 和 Cygwin 配合使用
的讨论有很多,比如 <a href="https://stackoverflow.com/questions/2075504/how-to-best-integrate-emacs-and-cygwin">How to best integrate Emacs and Cygwin?</a>,其中比较实用的方案如下:</p>
<ul>
<li>文字终端 Emacs,输入<code>apt-cyg install emacs</code>即可安装,没有图形界面,适合高级 Emacs 用户。</li>
<li>Emacs-X11,输入<code>apt-cyg install emacs-X11</code>安装,启动时需要<code>XServer</code>,由于 Cygwin/X 本身的局限(见下文),不推荐此方案。</li>
<li>Emacs-w32,输入<code>apt-cyg install emacs-w32</code>安装,其实它使用的是 Windows GUI,我个人最推荐的方式。</li>
<li>让外部 Emacs 识别 Cygwin shell。在 Windows 下安装 Emacs,然后让 Emacs 启动时自动识别 Cygwin shell,需要编写复杂的设置脚本,门槛较高。</li>
</ul>
<p>Mintty 有一个很好用的特性:在 mintty 中后台运行的非终端程序在 mintty 进程结束后仍然可以继续运行。比如输入<code>emacs-w32.exe 1>/dev/null 2>/dev/null &</code>启动 Emacs,然后输入<code>exit</code>关闭 mintty,此时 Emacs 不会随之关闭,对于 Emacs 常驻党应该很有帮助。</p>
<h1 id="cygwinx">Cygwin/X</h1>
<h2 id="_6">安装</h2>
<div class="codehilite"><pre><span class="nv">$ </span>apt-cyg install xorg-server xinit xorg-docs
<span class="c"># xorg-server 是 windows 下的 Xserver, xinit 包括各种启动命令如 xinit,startx,startwin</span>
<span class="c"># xorg-docs 可选</span>
</pre></div>
<h2 id="_7">中文支持</h2>
<p>Cygwin/X 的一个问题是没有对中文输入法的支持,虽然可以安装<code>fcitx</code>并在 Cygwin/X 中运行(我测试未成功),但只能在单窗口模式下启动。
官方早有支持IME-XIM转换的想法,却迟迟没出成果(见 <a href="http://x.cygwin.com/devel/todo.html">Development - To-Do List</a>)。总之,现阶段在 Cygwin/X 下输入
中文是很蛋疼的事情,因此它对我们而言还只能是一个玩物。</p>
<h1 id="_8">技巧</h1>
<h2 id="_9">文件共享</h2>
<p>Cygwin 让人爱不释手的原因之一就是和 Windows 的无缝文件共享:Cygwin可以直接访问Windows下的所有文件,Windows也可以访问 Cygwin 下的文本文件。
Windows 下的盘符<code>C:\</code>对应为 Cygwin 下的目录<code>/cygdrive/c/</code>,所有的 Cygwin 工具可以直接对该目录操作。另外,Windows 下路径名如<code>C:\Program Files\</code>,
cygwin下的路径则形如<code>/etc/rc.d/</code>,因此两者之间需要进行转换。Cygwin 提供了命令行工具<a href="http://www.cygwin.com/cygwin-ug-net/using-utils.html#cygpath"><code>cygpath</code></a>来进行 Windows 风格和 POSIX 风格的路径名互转。</p>
<h2 id="_10">剪贴板共享</h2>
<p>Cygwin 下操作剪贴板最方便的方式是访问设备<code>/dev/clipboard</code>,比如:</p>
<div class="codehilite"><pre><span class="nv">$ </span>diff file1 file2 > /dev/clipboard
<span class="nv">$ </span>cat < /dev/clipboard
</pre></div>
<p>第一条命令<code>diff</code>得到的结果被发送到剪贴板上,直接粘贴即可。</p>
<h2 id="_11">搜索软件包</h2>
<p>常用的软件我们用<code>apt-cyg find packagename</code>一般都可以找到,但是以下两种情况此命令却帮不上什么忙:</p>
<ol>
<li>某些命令行工具被集成到一个大包里,比如<code>dig.exe</code>,<code>telnet.exe</code></li>
<li>编译软件时常见的<code>libXXX.so.X</code>找不到的问题</li>
</ol>
<p>这时我们可以上 <a href="http://cygwin.com/packages/">Cygwin package list</a> 更精确地查找,注意打开链接查看是否包含需要的文件。或者也可以使用内置命令<code>cygcheck -p dig.exe</code>(需要网络连接,<a href="http://www.cygwin.com/cygwin-ug-net/using-utils.html#cygcheck">说明</a>),利用此方法一般都可以确定需要下载的包,更加快捷。</p>
<h2 id="_12">打开当前目录</h2>
<p>此代码来自博客 <a href="http://oldratlee.com/post/2012-12-22/stunning-cygwin">Pragmatistic Guy</a>,特此致谢。</p>
<p><code>xpl</code>加参数可用于打开目录或者文件,默认无参数打开当前目录:</p>
<div class="codehilite"><pre><span class="c">#!/bin/bash</span>
<span class="nv">cygwin</span><span class="o">=</span><span class="nb">false</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"`uname`"</span> in
CYGWIN*<span class="o">)</span> <span class="nv">cygwin</span><span class="o">=</span><span class="nb">true</span> <span class="p">;;</span>
<span class="k">esac</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">""</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nv">XPATH</span><span class="o">=</span>. <span class="c"># 缺省是当前目录</span>
<span class="k">else</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="nv">$1</span>
<span class="k">if</span> <span class="nv">$cygwin</span><span class="p">;</span> <span class="k">then</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>cygpath -C ANSI -w <span class="s2">"</span><span class="nv">$XPATH</span><span class="s2">"</span><span class="k">)</span><span class="s2">"</span><span class="p">;</span>
<span class="k">fi</span>
<span class="k">fi</span>
explorer <span class="nv">$XPATH</span>
</pre></div>
<p>也可写入到<code>.bashrc.cygwin</code>中,修改如下:</p>
<div class="codehilite"><pre><span class="k">function</span> xpl <span class="o">{</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">""</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nv">XPATH</span><span class="o">=</span>. <span class="c"># 缺省是当前目录</span>
<span class="k">else</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="nv">$1</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>cygpath -C ANSI -w <span class="s2">"</span><span class="nv">$XPATH</span><span class="s2">"</span><span class="k">)</span><span class="s2">"</span><span class="p">;</span>
<span class="k">fi</span>
explorer <span class="nv">$XPATH</span>
<span class="o">}</span>
</pre></div>
<p><code>xpf</code>用于 explorer 跳转到指定目录或文件并选中:</p>
<div class="codehilite"><pre><span class="c">#!/bin/bash</span>
<span class="nv">cygwin</span><span class="o">=</span><span class="nb">false</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"`uname`"</span> in
CYGWIN*<span class="o">)</span> <span class="nv">cygwin</span><span class="o">=</span><span class="nb">true</span> <span class="p">;;</span>
<span class="k">esac</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">""</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nv">XPATH</span><span class="o">=</span>. <span class="c"># 缺省是当前目录</span>
<span class="k">else</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="nv">$1</span>
<span class="k">if</span> <span class="nv">$cygwin</span><span class="p">;</span> <span class="k">then</span>
<span class="nv">XPATH</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>cygpath -C ANSI -w <span class="s2">"</span><span class="nv">$XPATH</span><span class="s2">"</span><span class="k">)</span><span class="s2">"</span><span class="p">;</span>
<span class="k">fi</span>
<span class="k">fi</span>
explorer <span class="s1">'/select,'</span> <span class="nv">$XPATH</span>
</pre></div>
<p>使用说明,以<code>xpl</code>为例:</p>
<div class="codehilite"><pre><span class="nv">$ </span>xpl <span class="c"># explorer打开当前目录</span>
<span class="nv">$ </span>xpl /usr/bin/ <span class="c"># explorer打开指定目录</span>
<span class="nv">$ </span>xpl video.avi <span class="c"># 使用 Windows 默认程序打开文件</span>
</pre></div>
<h2 id="_13">隐藏启动终端</h2>
<p>有时我们想在 Windows 下启动 Cygwin 中的程序或命令行,比如<code>D:\cygwin\bin\mintty.exe /usr/bin/emacs-w32.exe</code>可以启动 Emacs-w32,
但是同时也会启动一个碍事的终端窗口,如何隐藏它呢?我们可以使用官方提供的工具<code>run.exe</code>:</p>
<div class="codehilite"><pre>D:\cygwin\bin\run.exe /usr/bin/emacs-w32.exe
</pre></div>
<h1 id="_14">参考资料</h1>
<ul>
<li><a href="http://oldratlee.com/post/2012-12-22/stunning-cygwin">惊艳的cygwin——Windows下的Linux命令行环境的配置和使用</a></li>
<li><a href="https://bitbucket.org/riverscn/cyg-hotkey/overview">为Windows创建一个下拉式类Unix终端 - 川叶 :: 时间河</a></li>
<li><a href="http://cygwin.com/cygwin-ug-net.html">Cygwin User's Guide</a></li>
<li><a href="http://x.cygwin.com/docs/ug/">Cygwin/X User's Guide</a></li>
<li><a href="https://code.google.com/p/mintty/wiki/Tips">官方推荐技巧</a></li>
</ul>Kindle好玩物2017-03-24T00:00:00+08:00Joshztag:www.joshuazhang.net,2014-11-21:posts/2014/kindle-fun.html<div class="toc">
<ul>
<li><a href="#_1">选购</a><ul>
<li><a href="#kindle">Kindle还是平板?</a></li>
<li><a href="#_2">产品线</a></li>
</ul>
</li>
<li><a href="#_3">系统</a><ul>
<li><a href="#_4">原生系统</a></li>
<li><a href="#_5">多看系统</a></li>
<li><a href="#jb-koreader">JB + KOReader</a></li>
<li><a href="#_6">关于越狱</a></li>
</ul>
</li>
<li><a href="#_7">内容推送</a><ul>
<li><a href="#_8">设备绑定</a></li>
<li><a href="#_9">推送地址</a></li>
<li><a href="#_10">推送源</a></li>
</ul>
</li>
<li><a href="#_11">笔记管理</a><ul>
<li><a href="#_12">笔记备份</a></li>
</ul>
</li>
<li><a href="#_13">其它工具</a></li>
<li><a href="#_14">网络资源</a><ul>
<li><a href="#_15">电子书</a></li>
<li><a href="#kindle_1">Kindle资料</a></li>
<li><a href="#_16">固件更新</a></li>
</ul>
</li>
</ul>
</div>
<p>入手Kindle paperwhite一年多,其实折腾地不多,书看了还是不少的。本文只是自己使用过程中产品背景知识与折腾技能积累,给想入手或者已入手还没玩开的同好一个参考。</p>
<h2 id="_1">选购</h2>
<p>这不是一个专业的导购指南,所以只谈谈自己对Kindle市场定位的理解,既不能保证权威性也不能肯定正确性,但是菜已经端上,判断好不好吃就要看食客的经验和头脑了。</p>
<h3 id="kindle">Kindle还是平板?</h3>
<p>相比平板电脑的无所不能,Kindle电纸书就像个老弱残兵,灰度屏幕,没有娱乐,孱弱的上网功能,似乎注定了黯淡的市场前景。不过,对于真正喜爱读书的人而言,Kindle给他们提供的不是一款电子设备,而是读书的禅意。即便你不是Kindle的脑残粉,下面的几个理由也是值得你考量的:</p>
<ul>
<li>阅读体验。我没有专业的评测,但是对着IPS液晶屏和e-ink屏幕,只有眼睛的感受是最真实的。电子墨水屏幕没有愧对它的名字,在视觉上确实具有传统纸张一样的质感,这保证你连续看两个小时都不会有明显的不适(个人体验因人而异)。</li>
<li>超长待机使用时间。这与Kindle的定位与软硬件设计是相适应的,很显然,如果读书的时候老是不自觉地去查看电量,那么读书的乐趣何在呢?</li>
<li>无干扰阅读环境。一个具有很强自控力的人即便在电脑前也可以疵牙咧嘴地看完一本彩页pdf电子书,但是注意力涣散的人一本纸质书也要磨蹭大半年。人的差异固然存在,不过也不能忽略环境对人注意力的影响,弱化的娱乐和连接功能使得你不能不聚焦在读书这唯一的乐事上,这对很多人是一种莫大的帮助。</li>
</ul>
<p>客观地说,Kindle看电子书仍然有不完美的地方(但不是硬性限制),罗列如下:</p>
<ul>
<li>图片支持差。电子书内嵌的图片无法放缩,往往看不到最佳显示效果,因此含大量图片的电子书不推荐在阅读器上阅读。不过在PC/平板上Kindle软件的显示效果不坑爹,所以也不用太担心。这里也要对Amazon软硬件生态一体布局的大手笔点下赞。</li>
<li>公式、源代码支持差。公式往往影响排版的页面切分,源代码则高亮不起来(黑白的还想怎么滴?),因此专业的理工科书籍还是得看纸质版。</li>
<li>电子书的数量和质量。电子书市场现在发展飞快,Amazon也在不断增加电子书覆盖的范围,但目前稍微冷门一点的书籍一般都没有电子版,而且仍然存在排版混乱、文字错误等各种质量问题,相比豆瓣出品还有距离。</li>
</ul>
<p>总结一下,Kindle适合阅读包含大量文字内容的电子书,文史哲类看起来很舒服,理工类电子资源也可以看,但体验还有很大的提升空间。说到这里,你一定看出来了,不光是你在挑产品,Kindle也在挑选合适的消费者。</p>
<h3 id="_2">产品线</h3>
<p>Kindle家族到现在已经颇为庞大,Kindle 3、4、5一脉相承,Kindle Touch和Paperwhite主打触摸屏,DXG的9寸屏则是PDF大杀器(对土豪来说应该<a href="http://store.sony.com/digital-paper-system-zid27-DPTS1/cat-27-catid-digital-paper">Sony DPTS1</a>更合适吧)。目前来说,支持背光的KPW基本是入手的首选,国行价格也不怎么坑,还可以开发票^_^。几款新产品的细微区别可以参考<a href="http://kindlefere.com/post/56.html">一张漫画告诉你 KPW、KV 和新 Kindle 的区别</a>,萌萌哒。</p>
<h2 id="_3">系统</h2>
<h3 id="_4">原生系统</h3>
<p>对比KPW刚发售时系统的简陋,现在的Kindle原生系统已经成熟,中文支持完美,界面简洁易用,可以配合众多优秀的国外服务。当然这不是说它没有缺点,比如可定制性差(这个也许算个优点!),不支持epub格式,不能自适应非六寸PDF等等。如果你对某个缺点十分不满意,那么你仍然有第三方选择。当然,如果你没有那么多强迫症,只想专心看书,那我强烈推荐保持原生系统。</p>
<h3 id="_5">多看系统</h3>
<p>目前真正的“第三方”选择是指多看系统。到现在为止我都没用过该系统,所以“手感”我就不评价了。当然我不选择它是有原因的,一是它不兼容Amazon的推送地址,而是用<code>@iduokan.com</code>,而我大部分推送地址已经使用了Amazon,同时我对Amazon的服务相对更有信心,虽然小米也是很有前途的公司;二是它不能与原生系统共存(不然叫啥第三方?),相比“双系统”架构,我喜欢“虚拟机”方案多一点。我这里没说多看的优点,不代表它没有,不过目前对我吸引力不够。</p>
<p>多看适合对原生系统不满意又不具备足够折腾技能(多看不需要越狱)的孩子,折腾党不越狱怎么好意思说自己折腾?</p>
<h3 id="jb-koreader">JB + KOReader</h3>
<p>我目前使用的方案是原生系统JailBreak+ <a href="http://kindlefere.com/post/39.html">KOReader</a> ,也是我个人推荐的方案,优点就是除了保持原生系统的特性之外,还添加了epub、djvu、chm等文档格式支持,此外还有强大的扫描PDF、djvu重排功能。这个组合和多看目前的功能已经处在同一水平线上了。只不过要安装KOReader需要先越狱,算是一个比较大的劣势吧。如果你对自己的折腾水平和阅读英文文档的能力有信心的话那我举双手双脚推荐。</p>
<h3 id="_6">关于越狱</h3>
<p>越狱的内容十分琐碎,网上资料也很多,就不详细写了,推荐查看 <a href="http://kindlefere.com/post/33.html">三步搞定!Kindle Paperwhite 2 越狱教程</a>。只要注意几点:</p>
<ul>
<li>由于开发越狱工具需要时间,因此最新版固件往往无法越狱且不能降级,升级固件时需要考虑有无越狱需要。</li>
<li>备份是折腾的基础。</li>
<li>解除越狱只需要重置设备即可。</li>
</ul>
<h2 id="_7">内容推送</h2>
<h3 id="_8">设备绑定</h3>
<p>Kindle设备理论上可以绑定到Amazon服务的任意地区,但各地区之间并不共享帐号(美亚和中亚可使用同一账户名,但密码不能相同),所以用户必须做唯一的选择。绑定美亚则可以购买众多价格不菲的英文原版电子书,中文资源却少的可怜;绑定中亚则相对而言更实惠一些,中文资源也是主流。</p>
<h3 id="_9">推送地址</h3>
<p>Amazon不是在卖硬件,而是在卖服务,总之它正在下很大一盘棋,不然你怎么能在各个平台上看到<code>Kindle Reader</code>呢?其中最重要的服务就是网络推送。其实很简单,Amazon为每个Kindle买家提供一个邮箱地址,所有发送到该地址的规范文档格式都会在Kindle联网时同步到本地。用户应该根据自己的情况选择合适的地址:</p>
<ul>
<li><code>@kindle.cn</code>,国内绑定的邮箱,中文用户首选。</li>
<li><code>@kindle.com</code>,用于所有Kindle型号(3G和Wi-Fi)。对于只有Wi-Fi的Kindle,递送过程不收费。对于有3G上网功能的Kindle,如果是通过Wi-Fi收取也不收费,但是对于通过3G收取Amazon会收取一部分流量费用。</li>
<li><code>@free.kindle.com</code>,用于Kindle Wi-Fi,递送过程不收费。</li>
</ul>
<h3 id="_10">推送源</h3>
<p>目前推送源主要有这几类:</p>
<ol>
<li>第三方新闻内容定时推送。RSS推送固然方便,但是订阅太多也会造成信息过载,量力而行。<ul>
<li><a href="http://kindle4rss.com/">Kindle4rss</a>,英文全文订阅源</li>
<li><a href="http://dogear.cn/">狗耳朵</a>,有微信公众号推送服务</li>
<li><a href="http://www.hikindle.com/">hikindle</a>,VIP可推送电子杂志</li>
<li><a href="http://readcola.com">Readcola</a>,免费版支持16个订阅源,支持全文抓取</li>
</ul>
</li>
<li>手动内容推送。用户自己可以手动转发或采集网络内容发至第三方服务器,经过累积和处理后再推送至Kindle。由于Kindle阅读容易集中注意力,因此适合阅读有深度的文章,“太长不看”的文章都可以收集起来推送给Kindle搞定。<ul>
<li><a href="https://www.readability.com/">Readability</a>,最佳网文推送服务,抓取算法稍逊,可推送图片,免费账户也可定时累积推送。其它功能包括社交化、数据导出和专有邮件接收地址等。</li>
<li><a href="http://www.instapaper.com/">Instapaper</a>,最早的推送网站,网页抓取算法不错,不能推送图片,免费账户也可定时累积推送。</li>
<li><a href="http://www.klip.me/">Klip.me</a>,依托Google App Engine的网页推送网站(以前和Google Reader集成),网页抓取算法好,支持图片,不过文章分单篇推送,不方便管理。</li>
</ul>
</li>
<li>第三方电子书推送。<ul>
<li><a href="http://www.readfar.com/">读远</a></li>
<li><a href="http://www.mlook.mobi/">mlook</a></li>
<li><a href="http://readfree.me/">Readfree</a></li>
<li><a href="http://www.kindlemi.com/books">Kindle迷</a></li>
<li><a href="http://book.zi5.me/">子午书简</a></li>
<li><a href="http://www.ikandou.com/">爱看豆</a></li>
</ul>
</li>
<li>邮件推送。用户或者一些邮件订阅通过邮件转发至推送邮箱,也很方便。</li>
</ol>
<h2 id="_11">笔记管理</h2>
<p>首先应当明确亚马逊对电子书笔记的处理是完全与云端的电子书绑定的,即如果删除了云端的电子书,那么笔记也会相应的删除(参考:<a href="http://tieba.baidu.com/p/2616398627">http://tieba.baidu.com/p/2616398627</a>)。</p>
<h3 id="_12">笔记备份</h3>
<ul>
<li><a href="https://www.clippings.io">Clippings.io</a>(原ClippingsConverter)提供笔记导出/同步服务,免费版可上传<code>My Clippings.txt</code>并导出为各种格式或者同步到Evernote,收费版使用Chrome扩展,不仅支持文件导入,也支持对Kindle各个软件客户端的识别,不过目前好像在国内无法付费购买。</li>
<li>使用Koreader自带的导出到Evernote功能。</li>
</ul>
<p>具体可参考<a href="http://www.zhihu.com/question/22356174/answer/21121444?group_id=139440893">知乎:如何将 Kindle Paperwhite 读书笔记导入到 Evernote 印象笔记?</a></p>
<h2 id="_13">其它工具</h2>
<ul>
<li><a href="http://calibre-ebook.com/">Calibre</a>:开源的电子书管理利器,支持各类电子书格式阅读与转换,支持各类掌上阅读器。</li>
<li><a href="http://www.willus.com/k2pdfopt/">Willus.com's K2pdfopt</a>:制作6寸pdf的神器,不过有了Koreader,你还会那么勤快么?</li>
<li><a href="http://www.douban.com/group/kindlemate/">Kindle Mate</a>:用于导入Myclippings.txt并管理书籍高亮与标注,管理笔记的本地方案。</li>
<li><a href="http://kindlefere.com/post/43.html">sdr-Cleaner</a>:一键清理删除无用 sdr 文件夹</li>
<li><a href="http://www.pdf4kindle.com/">pdf4kindle.com</a>:免费的在线pdf转mobi、azw服务。</li>
</ul>
<h2 id="_14">网络资源</h2>
<h3 id="_15">电子书</h3>
<ul>
<li><a href="http://www.haodoo.net/?M=hd&P=welcome">好讀</a></li>
<li><a href="http://www.inien.com/">亿年书海</a></li>
<li><a href="http://www.igghh.com/">免费电子书库</a></li>
<li><a href="http://www.cnepub.com/discuz/forum.php">掌上书苑</a></li>
<li><a href="http://www.jp-comic.com/">日漫小站</a></li>
</ul>
<h3 id="kindle_1">Kindle资料</h3>
<ul>
<li><a href="http://kindlefere.com/">Kindle伴侣</a></li>
<li><a href="http://kindleren.com/portal.php">Kindle人</a></li>
<li><a href="http://tieba.baidu.com/f?kw=kindle">Kindle吧</a></li>
</ul>
<h3 id="_16">固件更新</h3>
<ul>
<li><a href="http://www.amazon.cn/gp/help/customer/display.html/ref=hp_bc_nav?ie=UTF8&nodeId=200529680">Amazon官方</a></li>
<li><a href="http://kindlefere.com/update">Kindle伴侣-固件大全</a></li>
</ul>告别GoogleReader2013-06-14T18:47:00+08:00Joshztag:www.joshuazhang.net,2013-06-14:posts/2013/goodbay-to-googlereader.html<p>GoogleReader即将于7月1日正式退役,目前看来这是板上钉钉了,在这天到来之前,一些必要的备份转移工作现在已经可以开始了。在开始之前,先得说点场面话。</p>
<h2 id="_1">告别一个时代</h2>
<p>在GR弥留之际,写几句不疼不痒的挽联,算是给心头爱将一个名分吧。我2010年才开始深度使用GR,当时深感这是一款伟大的产品,不仅仅是为浏览信息提供了方便,更是为我们从越来越庞大的互联网探索获取信息提供自动化的方法,虽然目前这种自动化智能程度还比较低,但是如果我们10年后不再需要事必躬亲地获取信息而是等待智能的推送,那么我们也不应该忘了GR的一份功劳。虽然Google不是RSS的制定者,也未必最先想到云RSS阅读的点子,但是毋庸置疑GR是普及这一想法并彻底改变我等“信息狂躁症”患者生活的最大功臣。如果认真分析,GR的价值体现在这几个方面:</p>
<ul>
<li>免费。技术普及的门槛就是价格,一款免费而具有收费服务品质的产品没人不喜欢。</li>
<li>海量数据和高速运算。GR之所以能够傲视群雄就在于它依托了Google的服务器集群。</li>
<li>搜索和排序。海量数据是不能用文件夹或者标签管理的,搜索是惟一解决方案;而排序则是我所说的智能推送的雏形。这两点在当下并非产品的重点,但是几年后呢?</li>
</ul>
<p>上面几点是GR在同类产品竞争中立于不败之地的法宝,也是很多产品难以复制GR的瓶颈所在。当然取得这么大的优势需要超越别人200%的付出,那就是高企的成本和可怜的收入。从经济角度看,Google砍掉GR并非多么难以理解的事情,而对Google进行道德上的评判,我不觉得很多人有充分的理由。一款免费服务坚持了这么久,为用户带来了这么多便利,即便没有功劳也有苦劳吧,何况Google还为使用者预留了充足的时间准备后路,为什么大众还不领情呢?</p>
<p>或许这关系到Google的企业形象。众所周知Google以广告盈利,而广告要发挥应有的作用就需要十分普及的平台,Google的当家产品如搜索、地图、Android都是搭建了一个广告的理想平台,而广告在GR上却失败了。大众一直把Google当成信息科技革命的领头人,而它的产品也确实以免费、创新树立了这样的“无私”形象,但是也许现在的Google已经不是那个敢闯敢干的Google了,帝国的盈利压力让它不得不作出这样的决定。GR是这么一款革命的、具有重大科技价值的产品,并且积累了如果好的人脉和口碑,但是它却向“油盐酱醋茶”低头了。如果做个不恰当的类比,史冬鹏怎么跑都没人关心,刘翔,哼,他没有资本失败。</p>
<p>牢骚发完了,生活还要继续,Google也要照用。下面讲讲怎么无痛地告别一个时代。</p>
<h2 id="_2">整理订阅源</h2>
<p>如果你和我一样有着几百个订阅源,并且有着众多的子目录,那么管理它们就不是一个轻松愉快的差事。我强烈建议从GR转出之前进行一次系统的整理,因为目前很多替代服务管理订阅源操作很繁琐很费时,甚至根本没有拿得出手的订阅源管理功能,相对而言,GR的操作还是很方便快捷的。</p>
<p>对我而言,订阅源管理主要是精简源数目以及删除无收藏价值的加星文章。如果你的订阅源不多,那你可以使用探索功能挖掘一些推荐的源,算是发挥下GR的剩余价值,不过我很怀疑还有多少GR用户没有感到“信息过载”的。许多加星文章年代久远已经失去了收藏价值,不妨大方删除,如果你很懒,那也可以不管它,下面有方便的方法备份这些文章。至于精简源数目,我个人遵循这么几个原则:</p>
<ul>
<li>文章性价比。许多源发布频率太高,而深度不够,徒然增大了阅读的压力,比如许多IT新闻源。</li>
<li>收藏性。有些网站虽然不再更新,但是文章收藏性很高,我选择让它们默默地躺在那里。</li>
<li>源的质量。许多源不提供全文,或者图片经常挂,阅读起来很不省心,这些客观因素可以判它们死刑。</li>
</ul>
<p>随着GR关闭,<a href="http://www.williamlong.info/archives/3409.html">FeedBurner是否会关闭也成了未知数</a> 。许多博客订阅地址都采用FeedBurner的服务,如果Google足够狠心,那么到时候大批的订阅源会失效。这个问题对订阅者来说还不怎么紧迫,但是对博主或站长而言是时候将订阅地址切换到自己子域名了。</p>
<h2 id="_3">服务转移</h2>
<p>虽然其实我们有其它的选择,比如本地阅读器、邮件转发订阅、自建在线阅读器等,但是相信很依赖GR的朋友肯定希望有能至少复制70% GR 功能的在线托管阅读器吧,这方面其实我们的选择也不少,至于是否达到了70%那就见仁见智了。对这些在线服务进行评价,我个人比较看重这几个方面,整理出来仅供参考。</p>
<ul>
<li>收费策略。目前而言免费的居多,但是GR死在沙滩上了,大家难免心有余悸,所以有些收费的服务也值得考虑。(其实我很纳闷,GR为什么不转收费呢?难道用户少到连这样的尝试都不可行吗,毕竟GAE都收费了。)</li>
<li>操作便利性。如果一款在线阅读器不支持快捷键,那和我自己去网站刷页面有什么区别呢?曾经的 feedly 花哨有余、效率不足,给我留下的印象并不好,不知道有没有改观。</li>
<li>速度与界面。访问服务器的速度和抓取文章的速度二者缺一不可,难以想象总是对着 loading 是什么感觉。GR的快一方面还来自于其简洁的界面,它代表更多的信息和更快的过滤。</li>
<li>抓取能力与范围。GR的订阅文章更新几乎是实时的,而我试用过的一些其它产品却未能达到这么快速,应该和服务器资源有关。至于范围,身处天朝,GR曾经是一把多么好的梯子,而现在,感觉一夜回到解放前了!因为这一点,许多国内还不错的服务就给pass掉了,如果GFW对你影响不大,那你也可以支持国货。</li>
<li>HTTPS支持。对靠谱的网站而言该功能基本是标配了,没有的话真不知道该说什么好。必须的理由见上一条。</li>
<li>统计分析功能。也许这并不常用,但是一旦需要你才知道它多么有用。</li>
<li>手机端支持。目前对我而言非必需,但是计划赶不上变化,而且手机确实是大势所趋。</li>
<li>订阅源管理。如果订阅源很多,总有一天你会在这上面花费大量时间,有方便的管理功能才能感觉幸福。</li>
<li>第三方api推送集成。这是扩展阅读器功能的有效方式,GR可是可以自己定制的哦。</li>
<li>账户管理与托管服务商可信度。隐私和信息安全很容易被忽略,但最好别忘记。如果要购买收费服务,一定要确认服务托管商的可信度,在混乱的环境下很容易浑水摸鱼。</li>
<li>备份导出功能。</li>
</ul>
<p>除了上面这些主要的方面,还有一些细节让所有的GR用户欲罢不能,在相同的起跑线和能力上,细节决定成败。</p>
<ul>
<li>有些网站没有提供RSS订阅或者隐藏在犄角旮旯里,如果我们直接添加主网址,GR也可以”智能“地分析出订阅地址(智能的方式可能是常见地址模式猜测,或者订阅地址数据库搜索)</li>
<li>GR的条目跳转很流畅,也很符合使用者的预期,而很多替代品会跳乱掉甚至失焦。另外,GR的操作条目有很明显的高亮,有些产品就不那么好分辨。</li>
</ul>
<p>一些值得测试的在线RSS阅读器及其特点:</p>
<ul>
<li><a href="http://theoldreader.com/">theoldreader</a>,快捷键支持最像GR,速度较快,界面简洁性还有提升空间,功能还较简单。</li>
<li><a href="https://www.inoreader.com/">inoreader</a>,界面最有GR范,速度有点慢,貌似对GR导入支持很好,开发比较活跃,功能也可很强,服务可靠性待检验。</li>
<li><a href="http://yanobs.com/reader/">yanobs</a>,免费版各方面都一般,不支持SSL。。。</li>
<li><a href="https://www.newszeit.com">NewsZeit</a>,基于开源的NewsBlur,免费版功能受限,但速度很快(东京服务器),界面上不如inoreader但强于theoldreader,国人定制支持,更适合国情,可靠性待检验。</li>
<li><a href="http://www.feedly.com/">feedly</a>,未测试</li>
<li><a href="http://www.newsblur.com/">NewsBlur</a>,未测试</li>
<li><a href="http://www.netvibes.com/">NetVibes</a>,未测试</li>
<li><a href="https://www.favo.me/reader/view/">favo.me</a>,界面清爽大气,很简单的快捷键支持,支持GR导入,但是加星条目最大可导入500条。</li>
<li><a href="https://yoleoreader.com/">yoleoreader</a>,未测试。</li>
</ul>
<p>2013-08-25 15:34更新:
经过这么长时间的调整,雨后春笋般冒出的GR替代服务基本都已经走向成熟,一个详细的列表可以参考 <a href="http://alternativeto.net/software/google-reader/?sort=likes">这里</a> ,其中排名第一的 <a href="http://www.feedspot.com/">FeedSpot</a> 值得一试。</p>
<h2 id="_4">整体备份</h2>
<p>即便我们把订阅源转出去了,也一定不要认为可以安枕无忧了。比Google无良的企业比比皆是,说不准哪一天你就发现自己常用的服务消失了,而通知仅仅是一天前或者根本没通知。因此,保险起见,我们不仅可以多测试几个替代服务,同时也要做好订阅源Takeout导出备份。这个操作没有难度,也就不赘述了。</p>
<p>麻烦的是加星标文章,很多新的服务不支持从GR导入加星标文章,或者虽然有该功能却有各种问题,为了最大化历史数据的安全,我们可以通过导出的 json 文件将加星标文章导入 Evernote ,具体方法参考 <a href="http://www.joshuazhang.net/posts/2013/Apr/export-googlereader-starreditem-to-evernote.html">导出Google Reader加星条目到Evernote</a> 。</p>博客图床规划2013-04-28T23:55:00+08:00Joshztag:www.joshuazhang.net,2013-04-28:posts/2013/blog-image-hosting-plan.html<div class="toc">
<ul>
<li><a href="#_1">要点</a></li>
<li><a href="#_2">方案</a><ul>
<li><a href="#_3">不分家</a></li>
<li><a href="#_4">第三方图床托管(不绑定域名)</a></li>
<li><a href="#_5">第三方托管(绑定域名)</a></li>
<li><a href="#_6">自建分离图床</a></li>
</ul>
</li>
<li><a href="#_7">结语</a></li>
</ul>
</div>
<p>从开始折腾WordPress到切换为静态网站,我就一直在纠结图片编辑和保存的问题。这包括两个方面:一是保持编辑文章时的流畅度,尤其是需要插入大量图片时;二是规划一个扩展性好的图片URL和对应的物理地址。第一个问题主要涉及到文章编辑,这方面Windows Live Writer最符合我的需求,但可惜它不能满足我其它的需求,在我的另一篇文章 <a href="http://www.joshuazhang.net/posts/2013/Jan/wp-edit-publish-plan.html">WordPress文章编辑发布方案</a> 中有所阐述,这里我不多说了。第二个问题其实就是规划图床(虽然说是图床,但是其实也包括了附件、CSS、JS等文件)的问题,是本文探讨的中心。</p>
<h2 id="_1">要点</h2>
<p>在读图时代,单图胜万言实在是每个博客作者都应该牢记在心的金玉良言,实际上其它文章类别也是如此。不过,博客图片的成本可要远远高于文字(创作成本、流量空间成本、管理成本等)。我把博客图床规划时需要考虑的问题总结如下:</p>
<ul>
<li>数据安全性。对一个博客而言,数据的重要性是不言而喻的,如果图片随时可能丢失或损坏,没有人可以睡得安稳。对于第三方服务我们还是应该采取保守策略,毕竟连Google都不再是初恋时的Google了。</li>
<li>备份成本。如果无法保证数据时刻处于安全的状态,那么只能自己勤快地手工备份了,如果有高度自动化的备份流程可以省不少心。</li>
<li>流量、空间等资源限制。大量的图片托管在一个可靠的服务器上是省心但是伤钱的事情,不是高帅富就只能用其它方案逆袭。</li>
<li>可迁移性。写一个博客可以折腾的事多了去了(实际上这也是乐趣之一),包括域名、空间、博客引擎、服务器环境等等,总不能每次都去手动改URL吧。</li>
<li>可扩展性。博客如果壮大了,就会需要一些新的功能,比如防盗链、图片压缩等,其实也是不得已而为之。这时候能够统一处理所有图片无疑是很方便的。</li>
<li>访问速度。考虑到我们在网速上无法与国际接轨,国外优秀的服务往往会因为这点而处于劣势。</li>
<li>局域网环境。如果你不知道我在说什么,那我就给你两个关键词:备案、长城。如果你一眼就看懂了,那就在心里默念一个字“凸”吧!</li>
</ul>
<h2 id="_2">方案</h2>
<p>以下我将详细列举比较各种常见方案,由于对于不同的人而言优缺点可能是完全相反的,所以请读者注意这些观点仅供参考。</p>
<h3 id="_3">不分家</h3>
<p>即采用博客引擎的默认设置,对于WordPress而言是自动上传到upload文件夹,对多数静态博客而言是使用相对路径访问图片资源,整站生成时会复制到指定目录。这种情况下图片的URL是很规范的,基本上是<code>http://domainname.com/upload or static/xxx.jpg</code>的形式,在编辑文章时也很方便,但是它把程序和图片绑定在了一起,如果迁移,两者必须保持位置关系,否则就需要修改文章内的引用地址(WordPress可以使用SQL语句,静态博客需要<code>sed</code>和正则表达式进行转换。)简而言之,该方案适合不折腾、稳定经营博客的用户。</p>
<h3 id="_4">第三方图床托管(不绑定域名)</h3>
<p>虽然免费主机现在一抓一大把,但是大空间大流量稳定又省钱的实在打着灯笼也难找,因此把图片分离出去一直都有着很稳定的市场需求,有需求就有hack,在这个领域网民们确实展示除了他们非凡的智慧。简单想想就可以列出很多:</p>
<ul>
<li>图片托管商:Picasa、Photobucket、flickr之流</li>
<li>各种网盘外链,比如Dropbox</li>
<li>各类博客、微博发布平台外链</li>
<li>Skydrive、Google doc外链(需繁琐地寻找地址)</li>
</ul>
<p>正规的内容管理网站往往会在用无规则的字串掩盖图片的真实地址,甚至改变文件名,不仅仅在文章中看起来丑陋,而且不利于编辑和长期的统一管理;更大的隐患是一旦托管商关闭服务,那么这些老图片都将变成刺眼的红叉,尤其是很少有托管商提供方便的备份导出方法,即便你导出了,那么地址又怎么改呢?基于这些理由,我个人很不喜欢这种方式。</p>
<h3 id="_5">第三方托管(绑定域名)</h3>
<p>与第二类方案有区别的地方在于,虽然仍然是第三方托管,但是由于可以绑定域名,所以链接地址得到了规范,而且往往还有成熟的备份策略,主要有这么几种:</p>
<ul>
<li>gh-pages等社交编程类服务托管</li>
<li>各类云计算平台:Heroku、OpenShift、GAE、SAE</li>
<li>Sourceforge(特殊,类似虚拟主机)</li>
<li>收费云存储平台:又拍、阿里OSS、华为直链Google Cloud Storage、Amazon S3</li>
</ul>
<p>本来Dropbox的外链可以绑定域名的,但是由于新的规则中外链地址加入了随机字符,绑定域名已经意义不大,因此放到了第二类方案中。</p>
<p>对前三种方法,我想说的是使用者应当感谢开源世界为整个人类的信息交流作出的贡献,如果有能力,你可以贡献自己的代码,如果没有,你也应该常怀感恩之心,毕竟,免费不代表没有价值,甚至有它还有不一般的价值。第四种云存储方案近来十分流行,应该是大势所趋。对我而言,国外两个巨头提供的虽然价格高高在上(也有免费配额),但是仍然十分诱人;至于国内的,备案两个字就让我完全死心了。</p>
<p>截至这篇文章完成,我采取的正是gh-pages托管的方式,但是正如我所言,这种只索取不付出的行为会对奉献者产生极大的伤害,因此,寻找更可持续的方式是我现在面临的问题。</p>
<h3 id="_6">自建分离图床</h3>
<p>如果想要获得最完全最自由的控制,自建分离图床就是终极的解决方案,当然它的代价就是高昂的技术门槛和管理成本、经济成本。具体而言,你还是可以选择喜欢的方式:</p>
<ul>
<li>博客与图片“同床异梦”。虽然在同一个空间下,但是图片绑定到<code>img.domian.com</code>这样的二级子域名下。</li>
<li>博客与图片“分而治之”。这就意味着你需要两个空间,由于两者的文件形式不同,因此管理和备份的方式也不同。</li>
</ul>
<p>这种方案的灵活还体现在你可以自由地选择空间,由于数据库(或者静态网页)体积流量都小,而图片等体积大、流量多,因此可以分别选择不同类型的空间Hosting,甚至是免费空间(只要备份做得到位!)。不同“空间”可以获取的权限不同(ftp、ssh、root),这种差异决定了上传和备份的方式也不相同,因此也可以说这种方式是最折腾人的。</p>
<h2 id="_7">结语</h2>
<p>不同的人对于技术的理解、对于博客的追求乃至经济、时间、精力都不相同,因此不能用一套标准来衡量所有的方案,但幸运的是我们还有这很多选择,虽然其中一部分是在恶劣的环境下的产物。用什么方式也许不重要,重要的是我们的付出转化为了一段段文字在这个世界的众多黑暗角落里以0和1的形式奔腾着,它们才是我们的财富。</p>导出Google Reader加星条目到Evernote2013-04-18T19:13:00+08:00Joshztag:www.joshuazhang.net,2013-04-18:posts/2013/export-googlereader-starreditem-to-evernote.html<p>Google Reader即将离我们而去,这个决定目前看来没有挽回的可能。我个人对Google的服务也很依赖,Google Reader更是常驻在书签栏,不过与其把力气花在谴责Google的作为,不如寻找更好的替代品和抓紧时间备份积累的订阅源和文章。目前离7月1日尚早,其它在线阅读器还有很长的时间打磨产品,所以替代品的筛选还不急于一时。倒是收藏的文章(加星标的条目)怎么导出似乎没有引起大家的关注,我把自己搜索整理的一些导出方案记录下来并作个比较(虽然没有一一测试),希望我的判断能有些参考价值。</p>
<h2 id="_1">导出方案思路</h2>
<p>目前网上可以搜集到的方案有这么几种:</p>
<ul>
<li><a href="http://blog.vsharing.com/ligongzi/A1472320.html">Google Reader的条目转发</a>。手工转发当然是很蛋疼的,配合ifttt转发对已经加上星标的又没作用,需要更自动化的工具。</li>
<li><a href="http://m.blog.csdn.net/blog/chief1985/6689805">基于html页面脚本或AHK脚本</a>。这种方法大多是用脚本刷新页面直接打印为PDF,显然处理过程不怎么“漂亮”,而且输出也丢失了扩展性。</li>
<li>基于第三方服务。目前似乎只有<a href="http://blog.wiz.cn/google-reader.html">为知</a>可以方便快捷地下载加星标的文章,但程序好像也不怎么给力。feedly貌似也可以直接导入加星标条目。</li>
<li><a href="http://www.36kr.com/p/201886.html">RSS</a>导出。这种方式貌似可以导出订阅源的所有条目,即便该博客已经不存在了。。。这种方法适合导出一个订阅源的所有文章,但缺点还是自动化程度太低。</li>
<li>基于GoogleTakeout的导出数据。虽然关闭了Reader,但是Google对用户还是尽到了自己的责任,提供了一个强大而完备的备份工具,只不过导出的是比较另类的<code>.json</code>文件。对它们做进一步处理可以得到组织良好的html文件。<ol>
<li><a href="http://mescoda.com/2011/12/gr2evernote/">GR2Evernote — 将Google Reader的分享内容导入Evernote</a> ,<a href="http://blog.sina.com.cn/s/blog_4afc0d8201017ah3.html">导出和备份google阅读器喜欢星标评论等历史内容到evernote或者wiz</a> (未测试)</li>
<li><a href="http://www.appinn.com/convertjson/">ConvertJSON – 转换 Google Reader 导出数据为网页</a> (未测试)</li>
</ol>
</li>
</ul>
<p>我个人更喜欢最后一种思路,因为Google提供的备份文件组织良好,而且保留了重要的由用户操作过的文档数据(加星、分享等)而非全部备份文档数据,这使得导出的数据不会很大同时保留住了精华。这里我要推荐一个python脚本<code>export_gr2evernote</code>,它的作用是处理<code>json</code>文件得到Evernote自家的笔记本格式<code>.enex</code>(也可以得到html格式),这样就可以导入到Evernote中,而Evernote虽小,似乎比Google要有良心一些^-^。</p>
<h2 id="export_gr2evernote">export_gr2evernote</h2>
<p><a href="https://github.com/kerchen/export_gr2evernote">@Github</a></p>
<p>目前该项目仍然处在改进中,现在已经有了三种导入处理方式:</p>
<ul>
<li><code>export2HTMLFiles</code>,每篇文章都输出为单独的html文件。</li>
<li><code>export2enex</code>,导出为<code>enex</code>文件,所有转换都在本地完成,对<code>json</code>文件大小无限制。</li>
<li><code>export_gr2evernote</code>,利用邮件发送功能导入Evernote,脚本不会进行任何的格式优化,所以在Evernote中显示的效果可能很丑陋,不推荐。</li>
</ul>
<p>作者本人推荐用前两种方式之一。从我个人测试的情况来看,导入的<code>enex</code>笔记完全保存了GR中文章的样式,图片、视频都能正常显示和观看,最重要的是整个流程十分简单快捷。</p>
<p>处理流程(以Windows下<code>export2enex</code>为例):</p>
<ol>
<li>首先确保系统安装了python</li>
<li>用GoogleTakeout导出Reader数据,下载压缩包解压。</li>
<li>将脚本丢到解压目录,<code>Win+r cmd <RET></code>运行Dos窗口, <code>cd</code>到该目录,运行<code>export2enex.py starred.json > starred.enex</code>,很快目录下就会出现<code>starred.enex</code></li>
<li>Evernote导入<code>starred.enex</code>文件,注意选择<strong>本地笔记本</strong>,尤其是文章数很多的情况。</li>
</ol>
<p><code>export2enex.py</code>这个脚本有个小bug,就是对文章的链接url中的<code>&</code>字符处理不当(应该转换为<code>&amp;</code>的形式),导致导出的<code>enex</code>文件无法被正确导入到Evernote,需要加入如下代码到合适位置:</p>
<div class="codehilite"><pre><span class="k">if</span> <span class="s">'&'</span> <span class="ow">in</span> <span class="n">msg_url</span><span class="p">:</span>
<span class="n">msg_url</span><span class="o">=</span><span class="n">msg_url</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'&'</span><span class="p">,</span> <span class="s">'&amp;'</span><span class="p">)</span>
</pre></div>El-get——emacs包管理利器2013-04-07T15:38:00+08:00Joshztag:www.joshuazhang.net,2013-04-07:posts/2013/el-get-intro.html<div class="toc">
<ul>
<li><a href="#el-get-vs-elpa">El-get vs ELPA</a></li>
<li><a href="#el-get">安装el-get</a></li>
<li><a href="#el-get_1">配置el-get</a></li>
<li><a href="#github">Github同步</a></li>
<li><a href="#_1">参考文章</a></li>
</ul>
</div>
<h2 id="el-get-vs-elpa">El-get vs ELPA</h2>
<p>Emacs24已经集成了<code>package.el</code>,可以安装多个源下的宏包。不过El-get宣称支持多种安装方式,ELPA方法只是其中一种。从我使用的情况来看,el-get似乎速度更快。另外,el-get安装的包不再需要手动<code>(require 'somepackage)</code>,它会自动管理所有安装包的加载和初始化,当然配置还是需要的,不过这已经方便不少了。我个人ELPA用得较少,就不比较了,有时间再把两者比较一下。</p>
<h2 id="el-get">安装el-get</h2>
<p>el-get现在处于活跃的开发阶段,因此推荐使用更新维护更活跃的<code>master branch</code>,安装只需要把如下命令拷贝到emacs的<code>*scrach*</code>buffer,然后<code>C-j</code>或者<code>M-x eval-print-last-exp</code>运行,el-get就会自动下载安装了。</p>
<div class="codehilite"><pre><span class="c1">;; So the idea is that you copy/paste this code into your *scratch* buffer,</span>
<span class="c1">;; hit C-j, and you have a working developper edition of el-get.</span>
<span class="p">(</span><span class="nf">url-retrieve</span>
<span class="s">"https://raw.github.com/dimitri/el-get/master/el-get-install.el"</span>
<span class="p">(</span><span class="k">lambda </span><span class="p">(</span><span class="nf">s</span><span class="p">)</span>
<span class="p">(</span><span class="k">let </span><span class="p">(</span><span class="nf">el-get-master-branch</span><span class="p">)</span>
<span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-max</span><span class="p">))</span>
<span class="p">(</span><span class="nf">eval-print-last-sexp</span><span class="p">))))</span>
</pre></div>
<p>安装完毕,如果要手动安装package,可以<code>M-x el-get-install RET packagename</code>,喝口茶的功夫估计就好啦。</p>
<h2 id="el-get_1">配置el-get</h2>
<p>将下列代码加入配置文件,emacs每次启动时就会检查el-get是否已经安装,未安装则自动下载安装。</p>
<div class="codehilite"><pre><span class="p">(</span><span class="nf">add-to-list</span> <span class="ss">'load-path</span> <span class="s">"~/.emacs.d/el-get/el-get"</span><span class="p">)</span>
<span class="p">(</span><span class="nf">unless</span> <span class="p">(</span><span class="nf">require</span> <span class="ss">'el-get</span> <span class="nv">nil</span> <span class="ss">'noerror</span><span class="p">)</span>
<span class="p">(</span><span class="nf">with-current-buffer</span>
<span class="p">(</span><span class="nf">url-retrieve-synchronously</span>
<span class="s">"https://raw.github.com/dimitri/el-get/master/el-get-install.el"</span><span class="p">)</span>
<span class="p">(</span><span class="k">let </span><span class="p">(</span><span class="nf">el-get-master-branch</span><span class="p">)</span>
<span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-max</span><span class="p">))</span>
<span class="p">(</span><span class="nf">eval-print-last-sexp</span><span class="p">))))</span>
<span class="p">(</span><span class="nf">el-get</span> <span class="ss">'sync</span><span class="p">)</span>
</pre></div>
<p>想要自动检测并安装需要的宏包,可以使用下面这段代码:</p>
<div class="codehilite"><pre><span class="p">(</span><span class="nf">setq</span> <span class="nv">my-el-get-packages</span>
<span class="o">'</span><span class="p">(</span>
<span class="nv">el-get</span>
<span class="nv">auto-complete</span>
<span class="nv">yasnippet</span>
<span class="nv">auctex</span>
<span class="nv">emacs-w3m</span>
<span class="nv">markdown-mode</span>
<span class="nv">color-theme</span>
<span class="c1">;; Any package you like))</span>
<span class="p">(</span><span class="nf">el-get</span> <span class="ss">'sync</span> <span class="nv">my-el-get-packages</span><span class="p">)</span>
</pre></div>
<h2 id="github">Github同步</h2>
<p>如果想要在不同电脑上共享同样的emacs配置,那么你可以选择dropbox或者更开放的github同步。为了便于git的管理,需要把所有配置文件都放到<code>.emacs.d</code>目录下,这样只需要<code>ln -s</code>把该目录链接到用户主目录即可。如果你使用<code>.emacs</code>配置文件,那么可以把它原封不动地迁徙一下即可:<code>mv .emacs .emacs.d/init.el</code>。</p>
<h2 id="_1">参考文章</h2>
<p><a href="https://github.com/dimitri/el-get">el-get@Github</a> </p>
<p><a href="http://batsov.com/articles/2012/02/19/package-management-in-emacs-the-good-the-bad-and-the-ugly/">Package Management in Emacs: The Good, the Bad and the Ugly</a></p>
<p><a href="http://emacser.com/el-get.htm">GNU Emacs的终极扩展管理工具 — el-get</a> </p>WordPress文章编辑发布方案2013-01-04T00:00:00+08:00Joshztag:www.joshuazhang.net,2013-01-04:posts/2013/wp-edit-publish-plan.html<p>我已经不再使用WP作为博客平台,其中一个原因就是因为找不到一个适合自己的编辑发布工具链(也许是我太挑剔)。如果你也和我一样对这方面很不满意的话,想要了解其它的方案,这篇文章也许会有帮助。首先要说明的是编辑和发布是两个阶段,如果再详细点还应该包括修改阶段,下面的一些发布流程往往只能照顾到某一个方面,而在另一个方面就相形见绌,总有这样那样的瑕疵。基本上,WordPress的编辑发布方案有这么几大类:</p>
<div class="section" id="id1">
<h2>后台发布</h2>
<p>这是默认的,也是便利性、兼容性最好的方案。但是它最大的缺点就在于一个字:慢。这个慢有两个方面,一是后台太笨重,如果你空间本来就不快(比如国外的空间),那加载后台都会等很久;二是WYSIWYG的编辑方式,如果你要搞长篇大论,图文并茂的话,上传图片、预览这些操作都是费事费力的。当然改进的方法也有:使用WP前台编辑插件(什么名字我忘了)、尽量不预览(对html熟悉程度要高)。</p>
</div>
<div class="section" id="id2">
<h2>编辑器终端</h2>
<p>包括两大类:专用的和通用的。</p>
<p>专用的就有大名鼎鼎的WLW,这应该是许多人坚守Windows平台的原因之一吧。其它如qumana、thingamablog等,虽然可用,但是功能不完善,体验也不好。特别值得一提的是浏览器插件 <a class="reference external" href="https://addons.mozilla.org/en-us/firefox/addon/scribefire-next/">ScribeFireNext</a> ,比起WLW也未逊色多少,如果要跨平台的话可以一试。Linux下可以尝试 <a class="reference external" href="http://paranimage.com/6-under-linux-blog-editor/">这些</a> 。</p>
<p>通用的也很多,这里又分两类:WYSIWYG和代码编辑器。所见即所得的比如M$ Office中的 <a class="reference external" href="http://www.dongbinbin.com/2012/07/wordfabuboke/">Word编辑器</a> 就可以作为发布终端,<a class="reference external" href="http://hi.baidu.com/yumi44444/item/52e203d0c0f5d2e0b3f77789">OneNote</a> 也是选择之一。代码编辑器其实就是指VIM和emacs啦。用这两款编辑器发布文章往往可以使用一些轻量级标记语言,从而简化写作过程,但是修改过程可能很让人恼火。编辑器之神和神之编辑器都有相应的WordPress插件如vimpress、vimrepress和Weblogger Mode等,请读者自行搜索。</p>
</div>
<div class="section" id="id4">
<h2>云服务中转</h2>
<p>这一类方案也有很多,可以举出许多例子:</p>
<ul class="simple">
<li>邮箱转发</li>
<li>Google docs发布</li>
<li>云笔记发布</li>
</ul>
</div>
<div class="section" id="id5">
<h2>命令行工具</h2>
<p>这里强调的实际是发布工具。对于命令行geek而言,真正让他们恋恋不舍的其实是vim,emacs之流的编辑器神器加上Markdown这样的快速语法配合得到的强大的文章编辑工作流,至于发布,除了插件,第三方工具也是一个选择,比如 <a class="reference external" href="http://mooninsky.net/history/?p=271">基于Perl的命令行WordPress客户端</a> 。当然还有很多此类的工具,它们都基于 <a class="reference external" href="http://www.ibm.com/developerworks/cn/xml/x-metablog/">标准的API</a> ,如果你喜欢,甚至可以自己编写一个。</p>
<p>前两种方案有诸多限制,因此并不推荐。第三种方案我实践了一段时间,主要用 <a class="reference external" href="http://note.sdo.com/register?ac=634782146519602937">麦库</a> 作为编辑终端,所有文章都存在网上,成文后在麦库发布然后复制粘贴到WP博客上,虽然发布过程麻烦,但是胜在编辑是在速度很快的云端,多地点写作的感觉很好。还有一个缺点是图片需要外链到麦库,太依赖此服务。</p>
</div>
<div class="section" id="id7">
<h2>我的选择</h2>
<p>应该说选择还是很多的,不过我的要求更多,列表如下:</p>
<ul class="simple">
<li>网络同步。因为我需要在不同地点都能够编辑文章,如果能够云端编辑更好,省去了同步的时间</li>
<li>较高的编辑效率。写文章的时候大量的格式修改、插入图片的操作很另人沮丧,编辑效率太低很影响写作的流畅度,WYSIWYG的方式尤其如此。</li>
<li>快速的响应,这是我讨厌后台发布文章的主因。</li>
<li>跨平台,windows和linux我都在使用,能够统一编辑当然是最好的。</li>
<li>延时发布机制。好的文章往往并非一蹴而就的,构思、动笔、不断的修改和打磨是正常的,这就需要草稿能够很好地保存且易于修改。</li>
<li>图片发布转存。文章里的图片、附件应当能够正确地上传到指定的地址且url可以自由定制。</li>
</ul>
<p>基本上我的要求难以同时得到满足,所以有这么一个折腾的理由,我也就顺理成章地转到了Pelican上去了。静态博客当然也有它的缺点,不过暂时而言我对它的喜爱还是多一点的。</p>
</div>
cygwin安装jekyll2012-09-24T00:00:00+08:00Joshztag:www.joshuazhang.net,2012-09-24:posts/2012/cygwin-install-jekyll.html<h2 id="ruby">卸载已安装的ruby</h2>
<p>用对应的包管理器卸载
如果是rvm安装的,直接删除目录<code>~/.rvm</code>,然后删除<code>.zshrc</code>和<code>.zlogin</code>文件,去掉<code>.profile</code>和<code>.bash_profile</code>中关于rvm的语句即可。</p>
<h2 id="rvm">安装rvm</h2>
<p><a href="https://rvm.io/rvm/install/">安装指南</a></p>
<div class="codehilite"><pre>curl -L https://get.rvm.io <span class="p">|</span> bash -s stable --ruby
</pre></div>
<p>检测rvm安装</p>
<div class="codehilite"><pre><span class="nb">type </span>rvm <span class="p">|</span> head -n 1
</pre></div>
<p>此时会显示<code>rvm:not found</code>,不用紧,还需要一步:</p>
<div class="codehilite"><pre><span class="nb">source</span> ~/.rvm/scripts/rvm
<span class="nb">type </span>rvm <span class="p">|</span> head -n 1
</pre></div>
<p>现在显示<code>rvm is a function</code>,说明rvm安装成功。
查看是否还有依赖问题:</p>
<div class="codehilite"><pre>rvm requirements
</pre></div>
<h2 id="ruby_1">管理ruby环境</h2>
<p>下面这几步其实不必要了,只是展示一下安装的过程,你也可以安装其它的ruby版本。</p>
<div class="codehilite"><pre>rvm list known
rvm install 1.9.3
rvm use 1.9.3 --default
</pre></div>
<p>查看安装的版本号和路径</p>
<div class="codehilite"><pre>ruby -v
gem -v
which ruby
which gem
</pre></div>
<h2 id="jekyll">安装jekyll</h2>
<p>用gem安装:</p>
<div class="codehilite"><pre>gem update --system
gem list
gem install jekyll
</pre></div>
<p>如果出现<code>spawn.h</code>的错误,这是由于<code>posix-spawn</code>的bug引起的,需要自己编译安装:</p>
<div class="codehilite"><pre>gem install rake-compiler -v 0.7.6
git clone git://github.com/rtomayko/posix-spawn.git
<span class="nb">cd </span>posix-spawn
rake gem
gem install pkg/posix-spawn-0.3.6
</pre></div>
<p>再<code>gem install jekyll</code>就没问题啦。</p>
<h2 id="_1">参考页面</h2>
<p><a href="http://matt.scharley.me/2012/03/10/windows-cygwin-and-jekyll.html">Windows,Cygwin and Jekyll</a></p>wordpress数据库优化记录2012-08-30T20:02:00+08:00Joshztag:www.joshuazhang.net,2012-08-30:posts/2012/wp-database-optimization.html<p>前段时间发现备份的数据库大小日渐庞大,对一个几乎长草的博客而言实在很诡异,所以抽空进行了一次后台大扫除。这里把基本的流程记录下来,供对数据库操作没有经验的朋友参考。</p>
<p>基本流程如下:</p>
<p>1、备份。做任何数据库操作前,做一个临时备份都是必要的。使用phpmyadmin按默认设置导出sql文件下载到本地即可。</p>
<p>2、删除不必要的插件。不必要的插件应当越少越好,尤其是会写入数据库或者查询数据库的插件。比如我之前使用过的<a class="reference external" href="http://www.6psp.cn/20100917/statpresscn%E6%8F%92%E4%BB%B6%E9%80%A0%E6%88%90%E5%8D%9A%E5%AE%A2%E9%80%9F%E5%BA%A6%E5%8F%98%E6%85%A2%EF%BC%8C%E8%B5%B6%E5%BF%AB%E5%88%A0%E9%99%A4.html">statpresscn</a>,这个插件会在数据库中建立一个庞大的wp_statpresscn表,虽然没有前台查询,不过它造成的数据库冗余带来的坏处可远远大于统计功能带来的便利,所以还是删了吧。</p>
<p>3、删除垃圾数据表。功能比较复杂的插件可能会在数据库中建立新表,删除插件一般不会把这些表顺带删除,所以手动排查垃圾数据表也是必要的。为了防止误删,请一定对照WP
Codex的<a class="reference external" href="http://codex.wordpress.org/zh-cn:%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%8F%E8%BF%B0">数据库描述</a>进行修改。</p>
<p>删除akismet垃圾数据。关于akismet如何产生这些数据可以参考<a class="reference external" href="http://www.solagirl.net/wp-commentmeta-slowing-down-your-blog.html">wp_commentmeta是否正在拖慢你的blog</a>。</p>
<div class="highlight"><pre><span class="k">delete</span> <span class="k">from</span> <span class="n">wp_commentmeta</span> <span class="k">where</span> <span class="n">meta_key</span><span class="o">=</span><span class="s1">'akismet_as_submitted'</span> <span class="k">or</span> <span class="n">meta_key</span><span class="o">=</span><span class="s1">'akismet_history'</span> <span class="k">or</span> <span class="n">meta_key</span><span class="o">=</span><span class="s1">'akismet_rechecking'</span> <span class="k">or</span> <span class="n">meta_key</span><span class="o">=</span><span class="s1">'akismet_result'</span> <span class="k">or</span> <span class="n">meta_key</span><span class="o">=</span><span class="s1">'akismet_user'</span> <span class="k">or</span> <span class="n">meta_key</span><span class="o">=</span><span class="err">'</span><span class="n">akismet_user_result</span>
</pre></div>
<p>wp_options数据表清理。主要有两部分垃圾数据:其一、已删除的插件选项。大部分插件都不提供完全的删除功能,主要就是针对数据表而言。由于不清楚数据和插件的对应关系,最好不要盲目删除,如果一定要清理,可以尝试用<a class="reference external" href="http://www.mittineague.com/dev/co.php">clean
options</a>插件,注意备份!其二、没用的RSS Feed
Cache。以“_transient”开头的数据都是因为用了RSS小工具产生的,作用不大,体积却不小。可以用下面的SQL语句删除:</p>
<div class="highlight"><pre><span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">wp_options</span> <span class="k">WHERE</span> <span class="n">option_name</span> <span class="n">REGEXP</span> <span class="err">"</span><span class="n">_transient_</span>
</pre></div>
<p>4、优化数据表。最后还要利用phpmyadmin执行优化数据表,体积还会有所减小。</p>
《MATLAB M语言高级编程》读书笔记2012-07-30T21:04:00+08:00Joshztag:www.joshuazhang.net,2012-07-30:posts/2012/matlab-note.html<p>第一章:M语言基础</p>
<ul class="simple">
<li>Matlab是解释型语言,不同于C语言这样的编译型语言,不过Matlab现在也可以编译。</li>
<li>whos命令查看变量</li>
<li>给变量赋值之前,不需要定义其类型。Matlab会<strong>自动决定</strong>变量类型,并分配内存空间。</li>
<li>Matlab支持自动扩维(在<strong>某些操作</strong>下!比如两个不同维的矩阵相加就不会自动扩维,而会报错),所以几乎所有变量都可以理解为矩阵(对于结构数组、元胞数组最好不要当做矩阵来理解)</li>
<li>Matlab变量按列存储,C/C++按行存储。Matlab绝对下标索引是按从上到下,从左到右的顺序进行的,初始值为1。这个特性继承自FORTRAN。</li>
<li>矩阵输入:中括号、逗号、分号、空格的区别。a=[1:5];这样的语句就会产生warning。</li>
</ul>
<p>矩阵索引示意图</p>
<img alt="matrix index" class="align-center" src="/static/img/wp/20120702204224.png" />
<p>这一张图基本就讲清楚了所有的情况,注意A([9 14;10
15])这样的索引方式。想一想A([8 12;10 11])是什么,A([8:10;10:12])又是什么?
进一步想想这个程序的结果是什么:</p>
<div class="highlight"><pre><span class="n">a</span><span class="p">=</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">;</span>
<span class="n">b</span><span class="p">=</span><span class="n">a</span><span class="p">(</span><span class="nb">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">),:)</span>
<span class="n">c</span><span class="p">=[</span><span class="mi">1</span><span class="p">;</span><span class="mi">2</span><span class="p">;</span><span class="mi">3</span><span class="p">];</span>
<span class="n">d</span><span class="p">=</span><span class="n">c</span><span class="p">(:,</span><span class="nb">ones</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span>
<span class="n">A</span><span class="p">=[</span><span class="mi">4</span><span class="p">:</span><span class="mi">6</span><span class="p">;</span><span class="mi">7</span><span class="p">:</span><span class="mi">9</span><span class="p">];</span>
<span class="n">B</span><span class="p">=</span><span class="n">A</span><span class="p">(</span><span class="nb">mod</span><span class="p">((</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">)</span><span class="o">'</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="o">\*</span><span class="p">(</span><span class="o">~</span><span class="nb">mod</span><span class="p">((</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">)</span><span class="o">'</span><span class="p">,</span><span class="mi">2</span><span class="p">)),:)</span>
<span class="n">C</span><span class="p">=</span><span class="n">A</span><span class="p">(:,</span><span class="nb">mod</span><span class="p">(</span><span class="mi">1</span><span class="p">:</span><span class="mi">9</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span><span class="o">+</span><span class="mi">3</span><span class="o">\*</span><span class="p">(</span><span class="o">~</span><span class="nb">mod</span><span class="p">(</span><span class="mi">1</span><span class="p">:</span><span class="mi">9</span><span class="p">,</span><span class="mi">3</span><span class="p">)))</span>
</pre></div>
<p>求B、C用这种方法显得繁琐,用repmat更简洁,不过b、d的求法又很方便了。</p>
<ul class="simple">
<li>MATLAB的索引方式是继承自fortran语言,因为最初它就是用fortran写的。</li>
<li>布尔运算:真返回逻辑值1,假返回逻辑值0。矩阵也可以进行布尔运算,返回逻辑数组。(试试看~2=?)</li>
<li>形如A(B)的矩阵索引操作在B是数值矩阵和B是逻辑矩阵时是完全不同的。没怎么看懂。。。P18</li>
<li>help matfun 基本的矩阵函数</li>
<li>help ops Matlab的操作符</li>
<li>加点运算和不加点运算的区别?</li>
<li>大部分情况下加点的运算表示对矩阵元素分别进行运算,而不加点的运算则把矩阵作为整体来运算,转置运算是例外。可以理解成不加点运算是默认的矩阵运算,而加点运算为元素运算。</li>
</ul>
<table border="1" class="docutils">
<colgroup>
<col width="13%" />
<col width="8%" />
<col width="36%" />
<col width="13%" />
<col width="8%" />
<col width="22%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">功能</th>
<th class="head">记号</th>
<th class="head">说明</th>
<th class="head">功能</th>
<th class="head">记号</th>
<th class="head">说明</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>乘</td>
<td>*</td>
<td>矩阵乘法</td>
<td>数组乘</td>
<td>.*</td>
<td>对应元素相乘</td>
</tr>
<tr><td>左除</td>
<td>/</td>
<td> </td>
<td>数组左除</td>
<td>./</td>
<td> </td>
</tr>
<tr><td>右除</td>
<td>\</td>
<td> </td>
<td>数组右除</td>
<td>.\</td>
<td> </td>
</tr>
<tr><td>幂</td>
<td>^</td>
<td>方阵幂运算</td>
<td>数组幂</td>
<td>.^</td>
<td>矩阵元素求幂</td>
</tr>
<tr><td>共轭转置</td>
<td>'</td>
<td>共轭转置,除了转置外,还要求共轭</td>
<td>转置</td>
<td>.'</td>
<td>矩阵转置,不求共轭</td>
</tr>
</tbody>
</table>
<ul class="simple">
<li>左除/和右除\什么区别?</li>
<li>用help slash查看官方说法</li>
<li>m文件包括两种:1、批处理脚本,2、函数M文件</li>
<li>在M文件中包含子函数的方法?</li>
</ul>
<p>Matlab函数文件格式:</p>
<img alt="matlab function" class="align-center" src="/static/img/wp/Image5.png" />
<ul class="simple">
<li>在线帮助部分可用help查询得到,H1 help line部分用lookfor命令查询得到。</li>
<li>在线帮助不可出现空行,空行后面的内容不在作为在线帮助。</li>
<li>Matlab函数文件名一般和函数名相同,如果不同,则以文件名为准。</li>
</ul>
<p>输入参数可变的函数:</p>
<ol class="arabic simple">
<li>输入参数可变的函数的最后一个输入参数一定要是 varargin。</li>
<li>使用 nargin命令或者 length(varargin)来检测到底输入了多少个参数。</li>
<li>使用元胞数组内容提取符{}来提取可变输入参数中的输入内容。</li>
</ol>
<p>输出参数可变的函数:</p>
<ol class="arabic simple">
<li>输出参数可变的函数的最后一个输出参数一定要是 varargout。</li>
<li>使用 nargout命令或者 length(varargout)来检测到底有了多少个输出参数。</li>
<li>使用元胞数组内容提取符{}来对可变输出参数赋值。</li>
</ol>
Linux外置硬盘加载方案2012-07-17T16:20:00+08:00Joshztag:www.joshuazhang.net,2012-07-17:posts/2012/linux-usb-mount.html<p>对于有大容量外置硬盘的Linuxer而言,开机自动加载外置硬盘当然是很舒服的事情,尤其是外置硬盘常年不挪窝的情况。许多Linux发行版都有usb自动加载程序,不过相对手工加载而言速度较慢,所以开机时让系统直接加载外置硬盘而不是搜索usb硬盘再添加会更好一些,这可以通过修改/etc/fstab文件来实现。这个文件语法还是比较简单的,看着其它分区的示例就差不多了,当然也可以详细地参考Arch的<a class="reference external" href="https://wiki.archlinux.org/index.php/Fstab">fstab
wiki</a>。简单地说就是现在/media目录下创建好要加载到的目标目录,然后在fstab中添加常连的外置硬盘mount条目即可。</p>
<p>这个方案是我最开始采用的,没有太大问题,但是还不完美。主要是最近我的外置硬盘接口似乎有点松动,所以用段时间后会自动掉线,这时系统又会自动搜索加载,麻烦在于自动加载的目录和我所设的目录不一致了,这样所有对该硬盘下文件的操作就会“找不到目标”。典型的例子就是用播放器播放外置硬盘的歌曲,掉线重连后播放器就找不到曲目,只能又去手动加载,十分费劲。</p>
<p>Linux下自动加载usb外置硬盘会mount到/media/$partition
label目录下(起码我在Arch和Linux
Mint下是如此),因此,你可以把手工设置的目录名称和外置硬盘分区的label修改成一致即可,这样就算掉线重连,文件位置不改变也就不会出现错误啦。想法是好的,不过可惜,如果系统检测到有同名的目录它就会创建一个带_的一个新目录作为挂载点,这条路也行不通。(也许可以修改哪里的设置或者权限可以达到这个目的?)</p>
<p>目前只能不采用手动挂载而采用自动搜索挂载,这样其实也没太大的缺点,总比不断手动修改挂载点强。</p>
<p>另外外置硬盘分区的label可以用Gparted修改,先卸载要修改的硬盘,然后右键修改label,再应用这些修改即可。修改成一个简短好识别的id,固定下来以后就不会再有诸如此类的麻烦了。</p>
</p>用MATLAB分析Henon映射2012-07-09T18:24:00+08:00Joshztag:www.joshuazhang.net,2012-07-09:posts/2012/henon-matlab-analysis.html<p>Henon映射是动力系统研究中很常见的离散映射,因为它具有的混沌特性而闻名。映射方程如下:
\[\left\{\begin{array}\~x_{n+1}=y_n+1-a\times~x_n^2 \\ y_{n+1}=bx_n \\ \end{array} \right. \]</p>
<p>不同的a、b参数下该映射具有不同的性质,可能出现混沌、断续或者收敛到周期轨道上不同的情况。取a=1.4,b=0.3时会产生著名的henon吸引子。</p>
<img alt="henon1" class="align-center" src="/static/img/wp/henon1.png" />
<p>Henon吸引子,横轴为x,纵轴为y,其实就是所有迭代的点产生的图案,形状比较怪异。</p>
<img alt="henon2" class="align-center" src="/static/img/wp/henon2.png" />
<p>b=0.3时的分岔图,不同a值下x可能在几个值间变化,也可能在许多值之间变化,即产生了混沌。顺便吐槽下Matlab生成的图片太不精细了,暂时还不知道用什么方法能提高图片细节。</p>
<p>Matlab源代码:</p>
<div class="highlight"><pre><span class="c">% By voidmous<voidmous@gmail.com></span>
<span class="c">% Henon map analysis</span>
<span class="n">clear</span> <span class="n">all</span><span class="p">;</span><span class="n">close</span> <span class="n">all</span><span class="p">;</span><span class="n">clc</span>
<span class="n">N</span><span class="p">=</span><span class="mi">10000</span><span class="p">;</span>
<span class="n">x</span><span class="p">=</span><span class="nb">zeros</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">);</span>
<span class="n">y</span><span class="p">=</span><span class="nb">zeros</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">);</span>
<span class="n">x</span><span class="p">(</span><span class="mi">1</span><span class="p">)=</span><span class="mi">0</span><span class="p">;</span>
<span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">)=</span><span class="mi">0</span><span class="p">;</span>
<span class="n">a</span><span class="p">=</span><span class="mf">1.4</span><span class="p">;</span><span class="n">b</span><span class="p">=</span><span class="mf">0.3</span><span class="p">;</span>
<span class="k">for</span> <span class="nb">i</span><span class="p">=</span><span class="mi">2</span><span class="p">:</span><span class="n">N</span>
<span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="p">)=</span><span class="n">y</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="o">-</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>^<span class="mi">2</span><span class="p">;</span>
<span class="n">y</span><span class="p">(</span><span class="nb">i</span><span class="p">)=</span><span class="n">b</span><span class="o">*</span><span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="k">end</span>
<span class="n">figure</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">scatter</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="n">xlabel</span><span class="p">(</span><span class="s">'x'</span><span class="p">);</span><span class="n">ylabel</span><span class="p">(</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">title</span><span class="p">(</span><span class="s">'Henon Attractor'</span><span class="p">)</span>
<span class="n">figure</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">L</span><span class="p">=</span><span class="nb">round</span><span class="p">(</span><span class="mf">0.97</span><span class="o">*</span><span class="n">N</span><span class="p">);</span>
<span class="k">for</span> <span class="n">a</span><span class="p">=</span><span class="mf">1.0</span><span class="p">:</span><span class="mf">0.001</span><span class="p">:</span><span class="mf">1.5</span>
<span class="k">for</span> <span class="nb">i</span><span class="p">=</span><span class="mi">2</span><span class="p">:</span><span class="n">N</span>
<span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="p">)=</span><span class="n">y</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="o">-</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>^<span class="mi">2</span><span class="p">;</span>
<span class="n">y</span><span class="p">(</span><span class="nb">i</span><span class="p">)=</span><span class="n">b</span><span class="o">*</span><span class="n">x</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="k">end</span>
<span class="n">scatter</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="nb">ones</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="o">-</span><span class="n">L</span><span class="p">),</span><span class="n">x</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">L</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span><span class="n">N</span><span class="p">),</span><span class="mi">2</span><span class="p">,</span><span class="s">'black'</span><span class="p">,</span><span class="s">'filled'</span><span class="p">);</span>
<span class="n">hold</span> <span class="n">on</span>
<span class="k">end</span>
<span class="n">title</span><span class="p">(</span><span class="s">'bifurcation for a'</span><span class="p">)</span>
<span class="n">xlabel</span><span class="p">(</span><span class="s">'a'</span><span class="p">)</span>
<span class="n">ylabel</span><span class="p">(</span><span class="s">'x'</span><span class="p">)</span>
</pre></div>
<p>参考文献</p>
<p>[1]Wikipedia contributors. <a class="reference external" href="http://en.wikipedia.org/w/index.php?title=H%C3%A9non_map&oldid=474794740">Hénon map</a>[J]. Wikipedia, the free
encyclopedia, Wikimedia Foundation, Inc., 2012.</p>
MS Word题注与交叉引用2012-07-05T19:51:00+08:00Joshztag:www.joshuazhang.net,2012-07-05:posts/2012/MS-Word-label.html<p>MS Word作为微软的拳头产品,虽然乏善可陈,但是仍然稳坐国内市场头把交椅,就算是在高校,这种局面也好不了多少。最近用Word写了份简短的文档,没什么花哨的东西,就是些公式和交叉引用、参考文献啥的,还是要请出Google大神才搞定。中间关于域以及题注上的有些细节问题没有完全搞懂,看来还是要系统地看看Word教程(谁说Word易用的,不学能用吗?!)。</p>
<p>关于公式多说两句,Word自带的公式编辑器3.0实在是太简单了,要输入空集符号都不行,要输复杂点的公式简直找虐。第三方的mathtype印象中比自带的显示效果还要差,虽然功能似乎强大点。Aurora是基于LaTeX的,输入公式确实快捷,效果也最好,但是担心会出现兼容性问题,转换成图片的话和mathtype一样都不够原生态。总之公式的美观、输入快捷和兼容性三者在Word上兼得。</p>
<p>Zotero在Word内插入参考文献其实是添加了域代码,通过域来更新文献内容以及索引。所谓域,可以理解为一个变量寄存器,根据它在文档中所处的位置产生数据。比如第几张图,第几个表,这时就相当于一个计数器(其实LaTeX里面的Counter更好理解)。大部分域操作都可以手工操作完成,比较重要的快捷键有:F9
更新域;Ctrl+Shift+F9把域转化为文本(确定文章不会再修改时使用,注意备份,慎用!)</p>
<p>Word里面的题注和LaTeX里面的label差不多,其实题注也就是为对象加上一个标签,要引用对象时就指定标签即可(想不通要专门设计个新名词来迷惑人干嘛)。选中对象右键可以添加题注,如下图所示,可以自己添加标签,题注一栏显示的就是该对象在当前状态下产生的题注。</p>
<img alt="a" src="/static/img/wp/201207052.png" />
<p>上图里的题注默认并非宋体,文章里显得不协调,可以在样式里修改题注的各种细节,如下图,注意可以为中文和西文分别修改字体。题注比较恶心的地方在于位置的摆放,如果对题注的位置进行了修改,很可能它前面的文字或者图片也会被当成题注的一部分而在引用的时候引起麻烦,目前还不清楚用什么方法来分隔。另外,一般添加题注完以后,对象前面都会自动加上一个小黑点,很恶心,可以在对象所在行选择段落属性,将换行与分页——分页里面的所有选项前的钩都去掉,黑点就会消失了。</p>
<img alt="b" src="/static/img/wp/201207053.png" />
<p>题注设定完成就可以进行引用,点插入——交叉引用,如下图:</p>
<img alt="c" src="/static/img/wp/201207054.png" />
<p>选择标签,在选择引用内容插入即可。很多情况下在标签和数字之间会产生一个空格,这是沿袭了英文里面的设定,中文就不适用,只能手动删除,没找到可以设置的地方。如果你不确定是不是有空格,请在Word选项——显示里面勾上显示所有格式标记,这样,空格就会用一个小黑点标示出来了。</p>
<p>总结:Office产品号称易于使用,其实是在不要求高级功能的前提下,一旦要设计些功能,仍然要学习微软的一套设定,花费的时间不一定比LaTeX语言少。微软的自作聪明我就不说了,很多情况下光是修改默认的设置就很麻烦。</p>
利用Zotero为博文添加参考文献2012-06-29T19:15:00+08:00Joshztag:www.joshuazhang.net,2012-06-29:posts/2012/zotero-bib-blog.html<p>对于技术类文章而言,添加必要的参考文献体现的是对他人劳动成果的尊重。即便你不会全文转载别人的文章而不标明出处,但是严格的说,学习了别人的方法或者观点也不能据为己有,标注参考文献就是向原创致敬的方法之一。目前而言,许多加了参考文献的文章都是怎么简单怎么来,没有个统一的格式,也不方便读者查阅。其实规范并不是没有,许多学术期刊对引用网页这样的媒体都有说明,我国<a class="reference external" href="http://gradschool.ustc.edu.cn/ylb/material/xw/wdxz/19.pdf">参考文献标准</a>也有说明。从我较短的使用过程来看,GB/T 7714-2005标准设计得比较简洁紧凑,适合中文、英文以及混排的情况,看上去比较舒服。</p>
<p>收集、管理文献的工具我首推Zotero,主要就在于它和Firefox结合得很好,对国际国内各大学术期刊数据库都支持得不错,和Google
Scholar搭配堪称完美。关于Zotero的使用可以看这篇文章:《<a class="reference external" href="http://blog.yesmryang.net/zotero-usage/">文献管理软件Zotero的一点使用感受</a>》。</p>
<p>利用Zotero的导出功能实际已经可以生成很好的参考文献了,不过美中不足的是导出的只是纯文本,没有任何格式化,所以读者仍然要自己手动去查找参考文献,这可不是我这样的懒人想干的事,于是干脆自己动手写了下面这个style,基本功能已经实现,在外观和功能上可能还有提升的空间。</p>
<p>Blogit是我基于<a class="reference external" href="http://www.zotero.org/styles/chinese-gb7714-2005-numeric">Chinese Std GB/T 7714-2005
(numeric)</a>这个style文件,参考<a class="reference external" href="http://www.zotero.org/styles/radiopaedia">radiopaedia</a>鼓捣出来的一个结合体。一方面保留了国标的规范,同时加上了源网页和DOI(<a class="reference external" href="http://dx.doi.org/">hdx.doi.org</a>)或者ISBN(<a class="reference external" href="http://www.worldcat.org/wcpa/isbn/">www.worldcat.org</a>)的超链接,方便在网页上直接跳转查看,不用复制粘贴再搜索这么麻烦了。利用此style配合Zotero导出的代码包含超链接,可以直接粘贴到文章源代码上。</p>
<p>Blogit源代码:<a class="reference external" href="/static/img/wp/Blogit20120627.rar">Blogit20120627</a></p>
<p>Zotero的style文件为<a class="reference external" href="http://citationstyles.org/">CSL</a>格式,其实质为xml,所以自己看看就可以摸到些门道。Windows下直接用Notepad++即可编辑,不推荐直接用记事本编辑,因为CSL是Unix文本格式,所以用记事本查看会没有换行。编辑过程中可以直接在Firefox标签页<a class="reference external" href="chrome://zotero/content/tools/cslpreview.xul">chrome://zotero/content/tools/cslpreview.xul</a>中预览,当前选中的文献在所有可用的style作用下生成的参考文献代码都可以看到,方便比较和进一步修改。修改编辑后一定要用<a class="reference external" href="https://github.com/citation-style-language/styles/wiki/Validation">验证工具</a>验证是否有错,推荐用在线的<a class="reference external" href="http://simonster.github.com/csl-validator.js/">csl-validator.js</a>。验证无误后即可用Zotero导入该style,如果已经导入那么覆盖原有文件即可。</p>
<p>几点说明:</p>
<p>1、一般来说,源网页和DOI、ISBN指向的网页很可能是同一个,所以如果你嫌太多超链接很难看,那么也可以去除源网页的链接,只要在Zotero设置Citation
Option里去掉Include URLs of paper articles in references前面的钩即可。</p>
<p>2、Chinese Std GB/T 7714-2005 (numeric)
sytle文件的一个小问题:如果插入多篇文献时上标顺序是从大到小而不是标准的从小到大,那么应该把citation-number这个宏中的sort
从descending改为ascending。</p>
<p>参考文献示例:</p>
<p>[1] 陈永春编. <a class="reference external" href="http://book.douban.com/subject/1151443/">MATLAB
M语言高级编程</a>[M]. 清华大学出版社, 2004. <a class="reference external" href="http://www.worldcat.org/wcpa/isbn/9787302075141">ISBN: 9787302075141</a>.</p>
<p>[2]
<a class="reference external" href="http://www.360doc.com/content/11/0301/09/4539198_97069216.shtml">Matlab自定义函数的五种方法</a>[EB/OL]. [2012-06-27].</p>
<p>[3] Shampine L F,
Thompson S. <a class="reference external" href="http://www.sciencedirect.com/science/article/pii/S0168927400000556">Solving DDEs in Matlab</a>[J]. Applied Numerical
Mathematics, 2001, 37(4): 441–458. <a class="reference external" href="http://dx.doi.org/10.1016/S0168-9274(00)00055-6">doi:10.1016/S0168-9274(00)00055-6</a>.</p>
<p>[4] L.F. Shampine, S. Thompson. <a class="reference external" href="http://scholar.google.com/scholar?hl=zh-CN&q=Solving+Delay+Differential+Equations+with+dde23&btnG=%E6%90%9C%E7%B4%A2&lr=&as_ylo=&as_vis=0">Solving Delay Differential Equations
with dde23</a>[J]. .</p>
<p>[5] 陈丽安. <a class="reference external" href="http://202.204.193.237/cupbbs/accessory/93/cb00d031-6df1-417b-a9e0-71c1aabff823.pdf">输出高品质 MATLAB
图形的方法与技巧</a>[J]. 计算机应用研究, 2002, 19(1): 154–155.</p>
MIT-BIH开放数据库使用指南2012-06-15T21:14:00+08:00Joshztag:www.joshuazhang.net,2012-06-15:posts/2012/MIT-BIH-manual.html<p>最近因为项目任务要分析心电图数据,采用的是<a class="reference external" href="http://ecg.mit.edu/">MIT-BIH</a>开放数据库(或称PhysioBank数据库)。这个数据库不仅提供了经过筛选的各方面的生理数据集<a class="reference external" href="http://www.physionet.org/physiobank/">PhysioBank</a>,而且也提供了开源的数据处理和可视化工具<a class="reference external" href="http://www.physionet.org/physiotools/">PhysioToolkit</a>。对我这样的非医学类学生而言,光是看见那些医学术语就够头痛的了,还要掌握这样一套专门的基于Linux的工具,确实是个不小的挑战。好在我要完成的部分不需要很深入,所以马马虎虎也摸着些门道。不敢说会用,但是起码碰到问题方向在哪我已经清楚了,这里把这个数据库的使用简单介绍一下,方便新来的同学快速上手。当然如果你英语好的话,大可以自己慢慢翻文档,这也是要深入了解的惟一途径。</p>
<p>首先说说数据库。你可以到<a class="reference external" href="http://www.physionet.org/physiobank/database/">分类页面</a>查找有没有自己感兴趣的数据集,上面都有比较详细的介绍。找到合适的数据后在对应页面直接将文件另存为就可以下载,当然这是比较笨的办法。推荐使用wget或者rsync来下载。wget可以用于下载单独的数据集,这样速度较快也比较快捷。例如下载mitdb:</p>
<div class="highlight"><pre>wget -r -np http://physionet.org/physiobank/database/mitdb/
</pre></div>
<p>中间的<em>physionet.org</em>可以替换成离你最近的<a class="reference external" href="http://www.physionet.org/mirrors/">镜像</a>地址(好像西交的挂了,直接用原镜像吧),<em>mitdb</em>替换成你要下载的数据集缩写名称(可以用<a class="reference external" href="http://www.physionet.org/cgi-bin/atm/ATM">PhysioBank
ATM</a>查看数据集对应缩写)。rsync用来下载所有数据也是非常方便的,方法看<a class="reference external" href="http://www.physionet.org/faq.shtml#downloading-databases">这里1</a>,当然这样做似乎没多大必要。</p>
<p>对应这套数据集维护人员也开发了相应的工具包<a class="reference external" href="http://www.physionet.org/physiotools/wfdb.shtml">WFDB</a>,包括三个部分:WFDB库、WFDB命令行工具和WAVE,主要用于读取、分析和可视化数据,一些常用的算法如FFT和熵都已经实现。WFDB库用于在C、C++或者Fortran中读写WFDB兼容格式文件,命令行用于直接处理数据,WAVE可以看做其图形化前端,需要xview支持。软件应该是C语言编写,Linux原生支持,Windows需要Cygwin支持,安装文档都写得很详细了。这套工具很强大,同时也很复杂,文档在<a class="reference external" href="http://www.physionet.org/physiotools/manuals.shtml">这里2</a>,当然需要你对命令行和研究对象都比较熟悉。如果要快速找到自己需要的命令或工具,可以看看这个<a class="reference external" href="http://www.physionet.org/physiotools/software-index.shtml">工具目录</a>,很有帮助。</p>
<p>如果没有那么高的要求或者不想碰命令行,那么它提供的<a class="reference external" href="http://www.physionet.org/physiotools/matlab/">MATLAB软件包</a>还是可以一用,不过功能就差点意思了,只能做基本的数据I/O,后续的算法都要自己实现,只能将就着用。这个页面除了官方发布的工具其实还有一些第三方编写的程序实现附加的功能,因为都是开源的,所以可以一看,对自己动手的朋友会有帮助。</p>
<p>这套数据库确实组织得非常好,甚至还开发了在线数据导出工具。如果你被前面各种软件名词吓到,那么下面这个东东估计就是你所需要的:<a class="reference external" href="http://www.physionet.org/cgi-bin/atm/ATM">PhysioBank
ATM</a>,它的作用就是用浏览器可视化地预览或者导出数据,如图示,左边选择数据设置参数,右边微调选择输出模式。利用它,你就可以远离那些繁琐工具的困扰,点几下鼠标就可以方便地查看数据,然后将理想的数据段导出即可。这个方法适合新手使用,直观、快速才不会拒人于千里之外,哈哈。</p>
<div class="figure align-center">
<img alt="PhysioBank ATM" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/Science/20120615201304.png" style="width: 700px;" />
</div>
<p>如果你使用了该数据库,并且准备要发文章,那么出于版权考虑,应当注意按照网站的要求进行引用,引用格式见<a class="reference external" href="http://www.physionet.org/citations.shtml">这里3</a>。另外如果某些地方有特别注明,那么也应该按照要求进行引用。因为这个数据库有很强的研究背景,所以有许多论文基于该数据库发表,不妨看看<a class="reference external" href="http://physionet.org/pn-citations.shtml">他人的成果</a>。</p>
<p>如果你在使用过程中还有什么问题,那么我推荐你先看<a class="reference external" href="http://www.physionet.org/faq.shtml">FAQ</a>,大部分问题在这都能找到答案,此外还有一些<a class="reference external" href="http://physionet.org/tutorials/">教程</a>,涉及到方方面面,也可以看看。</p>
<p>关于该数据库中文的论文还是比较少,但不是没有,参考文献已经注明。网络上讨论的也不多,但这两篇文章不可不看:《<a class="reference external" href="http://blog.csdn.net/chenyusiyuan/article/details/2027887">MIT-BIH
ECG 心电数据的下载和读取图解</a>》、《<a class="reference external" href="http://blog.csdn.net/chenyusiyuan/article/details/2040234">MIT-BIH ECG
信号的数据读取方法和Matlab程序</a>》,对于文件数据格式有较详细的分析。</p>
<p><strong>参考文献</strong></p>
<p>[1] 唐文涛. MIT-BIH 生理信号管理及回放系统[D]. 济南: 山东师范大学, 2009.</p>
<p>[2] 宋喜国, 邓亲恺. MIT-BIH 心率失常数据库的识读及应用[J].
中国医学物理学杂志, 2004, 21(004): 230–232.
[3] 徐效文, 曾超, 崔松野, et
al. <a class="reference external" href="http://www.cqvip.com/qk/91690x/201108/36940878.html">MIT-BIH数据库心电数据重采样研究</a>[J]. 计算机工程与应用, , 47(8):
245–248.
[4] 朱泽煌, 胡广书.
<a class="reference external" href="http://www.cqvip.com/qk/90680x/1993004/1245724.html">MIT—BIH心电数据库的开发及用作检测标准</a>[J]. 中国生物医学工程学报,
1993, 12(4): 244–249.
[5] 张乾, 蒋式勤. PhysioBank 数据库及其应用[J].
中国生物医学工程进展——2007 中国生物医学工程联合学术年会论文集 (下册),
2007.
[6] Goldberger A L, Amaral L A N, Glass L, et al. <a class="reference external" href="http://circ.ahajournals.org/content/101/23/e215">PhysioBank,
PhysioToolkit, and PhysioNet: Components of a New Research Resource for
Complex Physiologic Signals</a>[J]. Circulation, 2000, 101(23):
e215–e220. <a class="reference external" href="http://dx.doi.org/10.1161/01.CIR.101.23.e215">doi:10.1161/01.CIR.101.23.e215</a>.
[7] 张玉霞. 基于 MATLAB 与
WFDB 的 PhysioBank 数据库读取[J]. 北京生物医学工程, 2011, 30(3):
318–320.
[8] 梁伯虎, 张楠, 苏晓东.
<a class="reference external" href="http://www.cqvip.com/qk/81625x/201111/39687170.html">基于Matlab的MIT-BIH心电信号读取与波形显示的实现</a>[J]. 中国电子商务,
(11): 113–113. [9] 宋春丽. <a class="reference external" href="http://www.cqvip.com/Main/Detail.aspx?id=33712105">怎样识读MIT-BIH中的心电信号</a>[J].
科技资讯, (9): 27–27.</p>
</p>Runge Kutta方法求解微分方程2012-05-08T07:06:00+08:00Joshztag:www.joshuazhang.net,2012-05-08:posts/2012/runge-kutta-ode.html<p>普通的常微分方程已经有成熟的各类方法进行求解,而且得到的是解析解的形式。不过对于在计算机上求解而言,符号运算编程的难度可能要超过数值运算编程,所以,直接寻求数值解在某些情况下可能更加方便。欧拉方法和龙格库塔方法就是常见的数值计算方法。
将一阶常微分方程初值问题写成如下形式:
\[\left\{\begin{array}\~y^{'}=f(x,y) \\y(x_0)=y_0 \\
\end{array}\right.\] 四阶Runge Kutta公式如下:
\[\left\{\begin{array}{l}y_{n+1}=y_n+\frac{h}{6}(K_1+2K_2+2K_3+K_4)\\x_{n+1}=x_n+1\\K_1=f(x_n,y_n)\\K_2=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_1)\\K_3=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_2)\\K_4=f(x_n+h,y_n+hK_3)\end{array}\right.\]
四阶Runge
Kutta公式在实际应用时精度较高(4阶精度)而且计算量适中,因此使用较多。
对于求解微分方程组,可以将方程组写成向量形式,这样上面的4阶Runge
Kutta公式不需要改变形式,只要把四个参数改成相应的向量形式即可。求解高阶微分方程则可以通过降维方式令\(y^'=x,y^{''}=x^'\)就可以转化为一阶微分方程组的形式。
利用4阶RK方法求解洛伦兹方程:
\[\left\{\begin{array}\frac{dx}{dt}=\sigma(y-x)\\
\frac{dy}{dt}=x(\rho-z)-y\\
\frac{dz}{dt}=xy-\beta~z\end{array}\right.\]取\(\sigma=10,\beta=\frac{8}{3},\rho=28\)。相空间轨迹如下图:
<img alt="RK求解lorenz" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/Science/RKlorenz.png" /></p>
<div class="highlight"><pre><span class="c">% By voidmous</span>
<span class="c">% 利用四阶Runge Kutta求解洛伦兹方程</span>
<span class="n">clear</span> <span class="n">all</span><span class="p">;</span><span class="n">close</span> <span class="n">all</span><span class="p">;</span><span class="n">clc</span>
<span class="n">h</span><span class="p">=</span><span class="mf">0.005</span><span class="p">;</span> <span class="n">n</span><span class="p">=</span><span class="mi">30</span><span class="o">/</span><span class="n">h</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">sigma</span><span class="p">=</span><span class="mi">10</span><span class="p">;</span><span class="nb">beta</span><span class="p">=</span><span class="mi">8</span><span class="o">/</span><span class="mi">3</span><span class="p">;</span><span class="n">rho</span><span class="p">=</span><span class="mi">28</span><span class="p">;</span>
<span class="n">y</span><span class="p">=</span><span class="nb">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="n">n</span><span class="p">);</span> <span class="n">t</span><span class="p">=</span><span class="nb">zeros</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">);</span> <span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)=</span><span class="mi">10</span><span class="p">;</span> <span class="n">y</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">)=</span><span class="mi">3</span><span class="p">;</span> <span class="n">y</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)=</span><span class="mi">5</span><span class="p">;</span>
<span class="n">f</span><span class="p">=</span><span class="n">inline</span><span class="p">(</span><span class="s">'[sigma\*(y-x);x\*(rho-z)-y;x\*y-beta\*z]'</span><span class="p">,</span><span class="s">'x'</span><span class="p">,</span><span class="s">'y'</span><span class="p">,</span><span class="s">'z'</span><span class="p">,</span><span class="s">'sigma'</span><span class="p">,</span><span class="s">'beta'</span><span class="p">,</span><span class="s">'rho'</span><span class="p">);</span>
<span class="k">for</span> <span class="nb">i</span><span class="p">=</span><span class="mi">2</span><span class="p">:</span><span class="n">n</span>
<span class="n">k1</span><span class="p">=</span><span class="n">f</span><span class="p">(</span><span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span><span class="n">sigma</span><span class="p">,</span><span class="nb">beta</span><span class="p">,</span><span class="n">rho</span><span class="p">);</span>
<span class="n">k2</span><span class="p">=</span><span class="n">f</span><span class="p">(</span><span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k1</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">y</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k1</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">y</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k1</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">sigma</span><span class="p">,</span><span class="nb">beta</span><span class="p">,</span><span class="n">rho</span><span class="p">);</span>
<span class="n">k3</span><span class="p">=</span><span class="n">f</span><span class="p">(</span><span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">y</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k2</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">y</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k2</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">sigma</span><span class="p">,</span><span class="nb">beta</span><span class="p">,</span><span class="n">rho</span><span class="p">);</span>
<span class="n">k4</span><span class="p">=</span><span class="n">f</span><span class="p">(</span><span class="n">y</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k3</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k3</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="n">k3</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span><span class="n">sigma</span><span class="p">,</span><span class="nb">beta</span><span class="p">,</span><span class="n">rho</span><span class="p">);</span>
<span class="n">y</span><span class="p">(:,</span><span class="nb">i</span><span class="p">)=</span><span class="n">y</span><span class="p">(:,</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="o">\*</span><span class="p">(</span><span class="n">k1</span><span class="o">+</span><span class="mi">2</span><span class="o">\*</span><span class="n">k2</span><span class="o">+</span><span class="mi">2</span><span class="o">\*</span><span class="n">k3</span><span class="o">+</span><span class="n">k4</span><span class="p">)</span><span class="o">/</span><span class="mi">6</span><span class="p">;</span>
<span class="n">t</span><span class="p">(</span><span class="nb">i</span><span class="p">)=</span><span class="n">t</span><span class="p">(</span><span class="nb">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">h</span><span class="p">;</span>
<span class="k">end</span>
<span class="c">%静态显示洛伦兹变化轨迹 plot3(y(1,:),y(2,:),y(3,:)) view([20,32]);</span>
<span class="n">grid</span> <span class="n">on</span> <span class="c">%动画显示绘制过程 %暂时无法调整视角,也许看comet绘制原理有用?</span>
<span class="c">%comet3(y(1,:),y(2,:),y(3,:))</span>
</pre></div>
<p>[1]Wikipedia contributors.
Runge–Kutta methods[J]. Wikipedia, the free encyclopedia, Wikimedia
Foundation, Inc., 2012.</p>
<p>[2]Simulation of Lorenz ’63 model: 4th order
Runge-Kutta[M]. 2010.</p>
<p>[3]魏诺. 非线性科学基础与应用[M]. 科学出版社,
2004.</p>
<p>[4]Wikipedia contributors. 龙格-库塔法[J].
维基百科,自由的百科全书, Wikimedia Foundation, Inc., 2012.</p>
<p>[5]洛伦兹方程的matlab求解_百度文库[EB/OL]. [2012-05-01].
<a class="reference external" href="http://wenku.baidu.com/view/169b50c7aa00b52acfc7ca50.html">http://wenku.baidu.com/view/169b50c7aa00b52acfc7ca50.html</a>.</p>
迁徙的鸟2012-04-16T08:15:00+08:00Joshztag:www.joshuazhang.net,2012-04-16:posts/2012/winged-migration.html<p>《<a class="reference external" href="http://movie.douban.com/subject/1292281/">迁徙的鸟</a>》是由法国导演<a class="reference external" href="http://movie.douban.com/celebrity/1010752/">雅克·贝汉</a>带领的一个由优秀的飞行员和科学家组成的队伍历时三年完成的影片。全片记录了全球各地各种迁徙鸟类的镜头。片子上映很久了,也一直想看,可惜一直被各种好莱坞大片轰炸,要抽出个文艺的时间真不容易,不过好歹还是看完了。</p>
<p>全片解说不多,大部分时间都只是聚焦在鸟类的飞行姿态上,然而这并不让人感觉烦闷,也许真的是我们与自然疏离了。对于这样一部片子,只要带上审美的眼睛、慵懒的耳朵和悠然的心情,你就能够感受到导演团队的良苦用心了。不需要太多的评论,我们就简单的看图说话吧:</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-1.jpg" />
</div>
<p>片子里面有许多这样的飞行镜头,让我们以平等的角度来欣赏鸟翱翔的姿态,怎会不让我们激动?</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-2.jpg" />
</div>
<p>绝佳的构图</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-4.jpg" />
</div>
<p>美妙的姿态</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-0.jpg" />
</div>
<p>传说中的鸠占雀巢,每天都在上演着</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-5.jpg" />
</div>
<p>天鹅的舞姿,轻盈而优雅。《天鹅湖》确实从大自然偷师不少。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-6.jpg" />
</div>
<p>美妙的流线型,“鸟”体工程学。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-7.jpg" />
</div>
<p>顾盼生姿</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-9.jpg" />
</div>
<p>水上飞,海陆空三栖品种。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-8.jpg" />
</div>
<p>怪异的发型,此鸟个性十足。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-11.jpg" />
</div>
<p>加拿大松鸡,别看我块头大,胸口顶着俩大包,哥真的会飞。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-10.jpg" />
</div>
<p>铁栏后的落寞。圈养的鸟儿怎能理解自由的快乐。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-12.jpg" />
</div>
<p>从天而降对付敌人的招式是什么,如来神掌!</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-13.jpg" />
</div>
<p>最浪漫的事莫过于和你一起迁徙。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-14.jpg" />
</div>
<p>枪声响起,那些熟睡的观众会否惊起?看到这儿,不禁想起黄子华在栋笃笑演出上讲的一个悖论:那些热爱自然热爱生命的人总是用摄像机残忍地记录下死亡,并美其名曰不要破坏大自然的规律。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-15.jpg" />
</div>
<p>陷入油污的落群之鸟,想想不断出现的漏油事故,也许我们真的应该给鸟儿一个交代。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-16.jpg" />
</div>
<p>夕阳西照,生命的活力仍未停歇</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-17.jpg" />
</div>
<p>不是所有的鸟都胆小,不是所有的人都可以给予这份感动。交流总是始于冒险。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-18.jpg" />
</div>
<p>展翅翱翔是多少人年少时的梦?</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-20.jpg" />
</div>
<p>弱小的躯体补偿到的是飞翔的自由</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-21.jpg" />
</div>
<p>人们关心着遥远距离外的未知生物,却忽视了身边的邻居,这是远视,还是短见?</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-22.jpg" />
</div>
<p>谁说沙漠是个荒芜的地方?</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-23.jpg" />
</div>
<p>悲哀的事实是:总有人为了梦想付出生命</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-24.jpg" />
</div>
<p>虎落平阳被犬欺</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-25.jpg" />
</div>
<p>警觉的鸟儿:群众的眼睛是雪亮的</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-26.jpg" />
</div>
<p>南美洲逃出的鹦鹉,智慧不是人类的专长。</p>
<div class="figure align-center">
<img alt="winged-migration" src="http://i1078.photobucket.com/albums/w482/voidmous/blog/wingedmigration/shot-28.jpg" />
</div>
<p>累了,总还有个温暖的家。BTW,企鹅竟然也属于鸟纲。</p>
</p>几款云存储服务比较2012-04-13T02:29:00+08:00Joshztag:www.joshuazhang.net,2012-04-13:posts/2012/cloud-storage-comparison.html<p>所谓云存储服务,通俗点说就是网盘啦。不过现在各种免费网盘的服务其实并不仅限于存储,社交分享、同步备份都是很常见的功能,所以用云的概念可能更加合适(现在还称不上真正的云,但是趋势已经可以看出来了)。我个人用过国内国外的几个云存储服务,现在拿它们比较一番,顺便思考下云时代,什么样的存储才是我们(起码是我)真正所需的。</p>
<p>首先还是把范围确定,我所说的云存储并非Rapidshare,hotfile,城通网盘此类以快速文件分享作为主打功能的网盘,而是指具备同步功能以打造用户的私有资料、信息云为目标的网盘。这样的概念可能有点泛,现在的网络存储基本都还没实现这样的目标,但是是否具备这样的野心还是可以看出来的。</p>
<p>再来分析下必要的功能需求(此处仅对我而言):</p>
<p>同步功能。这是目前而言最重要也是最差异化的功能。对我这样寝室、实验室两头跑的人来说,用U盘可不是什么方便的事情,有同步功能我就可以在两头处理同一个文件而不用把工作地点锁定在某一个地方。同时,有一份网络备份可比什么U盘备份强。</p>
<p>分享功能。这个我认为是从网盘时代遗传下来的功能,我个人并不常用,但是它也是不可或缺的,因为以此途径发布文件是最简单的事情,虽然目前暂时我没有这方面的需求。</p>
<p>多平台共享。现在电子设备越来越多,操作系统也五花八门,兼顾主流平台应该是必须的。不过对于我而言,Linux平台的支持非常重要,尽管它并非主流。</p>
<p>下面我简单比较下几个云存储服务:</p>
<p>1、<a class="reference external" href="https://www.dropbox.com/">Dropbox</a></p>
<p>Dropbox作为这个方面的老大是当仁不让的,当然我有充足的理由。首先Dropbox的同步稳定性非常好,不会出现同步出错的情况,这说明它的同步管理机制十分优秀。同时,Dropbox专注于同步存储功能的优化,一些细化的功能往往最先在Dropbox上产生,比如选择同步机制。Dropbox并非不注重分享和功能的扩展,实际上,作为国外老牌的服务,dropbox早已经渗透进各式各样的集成服务中,比如这篇《<a class="reference external" href="http://www.williamlong.info/archives/2044.html">Dropbox免费网盘高级使用技巧</a>》和《<a class="reference external" href="http://lusongsong.com/info/post/106.html">Dropbox有哪些另类应用?</a>》应该可以给人不少启发,原来网盘还可以这样用(国内的服务还没法这样应用)!我自己就用Dropbox作为博客的备份空间,使用Wordpress插件<a class="reference external" href="http://backwpup.com/">BackWPup</a>就可以实现。Dropbox提供了这么优秀的服务,同时它还原生支持Linux平台,怎么能不让人心动呢。</p>
<p>当然由于某些众所周知的原因,国内如果想体验这么优秀的服务是需要花<a class="reference external" href="http://www.williamlong.info/archives/2585.html">一些周章</a>的,但是我可以担保,如果你愿意有一些初期的投入,那么你后期的回报会是相当可观的。通过<a class="reference external" href="http://db.tt/xGiyH7Ef">我的邀请链接</a>开始吧。</p>
<p>2、<a class="reference external" href="http://www.yun.io/">Yunio</a></p>
<p>国内最先支持Linux的云存储服务(比坚果发布还要早)。这是我目前主力的存储服务。当然它相比于Dropbox惟一的优点就在于它位于国内,速度让人满意,同时它的初始免费空间相对较大,对于新用户比较友好。当然它还是有一些不让人满意的地方,比如会出现同步冲突的情况,这时候它会自动生成冲突文件的一个备份,那么你可能需要手动删除。不过这种情况多发生在你对文件存在频繁读写的情况下(我在某段时间内曾用Yunio同步firefox的profile,现在不需要了,因为firefox已经内置同步功能),一般的文件读写还是很稳定的。所以,如果你需要Linux平台支持,同时对Dropbox的强大和困境不感冒,那么我推荐你使用Yunio,从<a class="reference external" href="http://www.williamlong.info/archives/2044.html">我的邀请链接</a>开始吧。</p>
<p>3、<a class="reference external" href="https://jianguoyun.com">坚果云</a></p>
<p>坚果云官网其实早已经搭建好了,但是一直都未发布,内测了相当长时间,而一发布就宣布支持Linux,这当然对Linuxer而言是绝好的消息。从他们的做事风格来看,用户体验和需求是他们的最终追求,所以我还是很看好这个团队,善用佳软也在<a class="reference external" href="http://xbeta.info/jianguo.htm">关注他们</a>。他们提供的云存储也很别具一格,在其它云存储都以超大的免费空间作为卖点的时候,他们却不走寻常路:限流量不限空间。如果你的ISP对你限流量不限带宽你可能会抓狂,那么免费的云存储呢?该团队对这个的解释是想把坚果云打造成“数据保险柜”,而非“临时货仓”。这个理念应该说是很前卫的,用免费服务来打造收费品质,这对于一个小型企业而言很有挑战,如果你支持这种勇气,那么你可以通过<a class="reference external" href="https://jianguoyun.com/d/ref/SZidYrFINROTwjEBjbi0jw">我的邀请链接</a>来支持他们。</p>
<p>4、<a class="reference external" href="http://www.kuaipan.cn/">金山快盘</a></p>
<p>金山作为国内数一数二的软件公司,目前也一头扎入了“云海”中。从金山一贯的服务品质历史你可以对他们的产品抱有绝对的信心(最近的WPS
for
Linux更是给众Linuxer打了一记强心针),从我自己使用的情况看来确实如此。它的优势就在于金山打造的云服务体系,配合金山快写你完全可以把它打造成一个在线文档编辑平台。金山快盘一直都在进步,起码在Windows平台上国内的产品我认为他们已经做到最好了,如果你喜欢Windows平台,那么我推荐金山快盘,从<a class="reference external" href="http://www.kuaipan.cn/index.php?ac=account&op=register&channel=m1xnys">我的邀请链接</a>进入吧。</p>
<p>5、其它网盘</p>
<p>国内网盘最近如雨后春笋般冒出头来,不能不说是广大消费者的福音,我们可能多了选择的困惑,但是没有了选择我们就走入困境了。对于我上面没提到的云存储服务,并非它们做得不好(当然不能说它们做到了一流),只是含有某些方面的欠缺,起码不符合我现有的需求和标杆,但是它们不一定不适合你,只有你自己真正用过某个产品,你才拥有评判的权利,我对这些网盘用得不多,就不误人子弟了。</p>
Linux帮助系统常见技巧2012-04-04T08:55:00+08:00Joshztag:www.joshuazhang.net,2012-04-04:posts/2012/linux-manual.html<p>Linux下命令实在太多,学习命令行最佳途径当然是通过手册(manual),新手对帮助系统有所了解可以更快地上手Linux基本管理操作。</p>
<ul class="simple">
<li>man cmdname</li>
</ul>
<p>这是最基本的用法了,也是最有效的方法。man
page主要是面向unix程序员,因此事无巨细,对于常见的操作其实并不需要细看,了解书写格式,挑出几个选项就可以了。</p>
<ul class="simple">
<li>cmdname --help或者cmdname -h</li>
</ul>
<p>相比上一条,这个对于新手更加适用,因为它只显示最常用的选项,文字也更精简,真正可以让你快速参考。另外还要说明的是,许多打包的可执行安装文件都可以用这条命令显示安装帮助,如一些后缀名为bin或者run的文件,在安装前有必要阅读一下。这条命令只能作用于外部命令,shell内部命令无法使用(虽然还是有输出文字)。判断一条命令是外部或者内部命令,可以用type
cmdname查询某个命令或者help查看所有内部命令。</p>
<ul class="simple">
<li>whatis cmdname</li>
</ul>
<p>whatis命令显示的其实是manpage的名称一栏的注释,你可以试试man
whatis和whatis
whatis看看区别所在。如果只是想简单了解某条命令的用处,用whatis就再合适不过了。(whatis
man会出现三个带选项的man命令,为什么?)</p>
<ul class="simple">
<li>info cmdname</li>
</ul>
<p>info命令显示的帮助更加详尽,信息量更大,同时界面更加友好。不过不怎么常用</p>
<ul class="simple">
<li>manual系统</li>
</ul>
<p>每个命令的manpages其实包括8个章节,它们包括不同的内容,如下表:</p>
<table border="1" class="docutils">
<colgroup>
<col width="10%" />
<col width="27%" />
<col width="13%" />
<col width="17%" />
<col width="17%" />
<col width="17%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">章节</th>
<th class="head">描述</th>
<th class="head">普通用户</th>
<th class="head">软件开发人员</th>
<th class="head">文档组织人员</th>
<th class="head">系统管理人员</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>1</td>
<td>用户命令</td>
<td>✓</td>
<td> </td>
<td> </td>
<td>✓</td>
</tr>
<tr><td>2</td>
<td>系统调用</td>
<td> </td>
<td>✓</td>
<td> </td>
<td> </td>
</tr>
<tr><td>3</td>
<td>语言函数库调用</td>
<td> </td>
<td>✓</td>
<td> </td>
<td> </td>
</tr>
<tr><td>4</td>
<td>设备和网络界面</td>
<td> </td>
<td> </td>
<td> </td>
<td>✓</td>
</tr>
<tr><td>5</td>
<td>文件格式</td>
<td> </td>
<td> </td>
<td> </td>
<td>✓</td>
</tr>
<tr><td>6</td>
<td>游戏和示范</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>7</td>
<td>troff的环境、表格和宏</td>
<td> </td>
<td> </td>
<td>✓</td>
<td> </td>
</tr>
<tr><td>8</td>
<td>关于系统维护的命令</td>
<td> </td>
<td> </td>
<td> </td>
<td>✓</td>
</tr>
<tr><td>9</td>
<td>其它</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
<p>在不同需求的情况下应当查看不同的章节,要查看指定的章节可以用man -sx
cmdname或者man x cmdname,其中x为章节对应的数字。比如查看库函数man -s3
open。</p>
<ul class="simple">
<li>常用快捷键</li>
</ul>
<p>快捷键帮助h(man状态下)</p>
<p>退出q</p>
<p>下一屏space或者f(forward),上一屏b(backward)</p>
<p>下一行j,上一行k</p>
<p>前向搜索/pattern,反向搜索?pattern</p>
<p>下一个匹配n,上一个匹配N</p>
<p>风格其实和vim相似,比如Ctrl+f也是下一页。</p>
<ul class="simple">
<li>man目录</li>
</ul>
<p>/usr/share/doc/man/</p>
<ul class="simple">
<li>中文manpages</li>
</ul>
<p><a class="reference external" href="https://github.com/lidaobing/manpages-zh">manpages-zh项目</a>,安装后即可查看常用命令的中文manpage,不过似乎中文排版有点问题,看起来有点丑陋。</p>
<ul class="simple">
<li>彩色manpage</li>
</ul>
<p>黑底白色的大量文字看久了很累,可以考虑自定义彩色的manpage,编辑~/.bashrc:</p>
<div class="highlight"><pre><span class="c"># colorful man page</span>
<span class="nb">export </span><span class="nv">PAGER</span><span class="o">=</span><span class="s2">"`which less` -s"</span>
<span class="nb">export </span><span class="nv">BROWSER</span><span class="o">=</span><span class="s2">"</span><span class="nv">$PAGER</span><span class="s2">"</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_mb</span><span class="o">=</span><span class="s1">$'\E[01;34m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_md</span><span class="o">=</span><span class="s1">$'\E[01;34m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_me</span><span class="o">=</span><span class="s1">$'\E[0m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_se</span><span class="o">=</span><span class="s1">$'\E[0m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_so</span><span class="o">=</span><span class="s1">$'\E[01;44;33m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_ue</span><span class="o">=</span><span class="s1">$'\E[0m'</span>
<span class="nb">export </span><span class="nv">LESS_TERMCAP_us</span><span class="o">=</span><span class="s1">$'\E[01;33m'</span>这样一个简单可用的彩色manpage就搞定了,当然你也可以自己参照修改。
</pre></div>
学术科研的几点思考2012-03-13T14:56:00+08:00Joshztag:www.joshuazhang.net,2012-03-13:posts/2012/science-thought.html<p>虽然自己还是门外汉,但是在学习的不同的阶段,水平不同、视角不同,感受和结论也会不同,三四年后的我如果再看到这篇文章,未必不会受到触动,起码可以让我反思。</p>
<p>一、科学研究的精神</p>
<p>1、诚信</p>
<p>自从德国国防部长古藤贝格博士爆出论文造假的丑闻来,我就果断抛弃了“惟素质论”。即便是在欧洲这样的学术氛围极为严谨的情况也难以避免学术造假的发生,可见诚信仍然是一个世界性的问题。我不打算在这里讨论太多道德的说教,只分析下技术上的问题。</p>
<p>国内的学生(包括我自己在内),对于引用他人文献没有一个明确的标准,有时候是直接引用,有时候提取下大意再标个引文了事,总之五花八门。从我观看的硕士答辩的情况来看,即便到了研三,这样的问题依然存在,甚至到了会被答辩老师训斥的程度。引用的问题主要集中在下面几点:</p>
<ul class="simple">
<li>引用多少文字,以什么方式引用(超过一定字数的引用必须注明,否则视为抄袭!)</li>
<li>标注的位置(千万不要在章节标题上标注引文,大忌!)</li>
<li>参考文献格式(事无巨细,期刊第几期、第几卷都需要标清楚,作者名字必须清楚)</li>
<li>参考的可靠度(国内垃圾文献尽量少引)</li>
<li>引文数量、中英文比例</li>
</ul>
<p>以上几个方面是需要重点注意的,当然,上面几点做好了并不能说明你的论文就是真实可信,还有其它方面的考量。但是这些方面直接决定了别人看到你文章时在诚信方面的评价。</p>
<p>2、创新</p>
<p>从小学到高中再到大学,创新的内涵其实一直在被我们不断地缩小,到了毕业答辩的时候,创新就演变成论文的“创新点“了。这从一个方面也体现出创新的难度,尤其是在应试教育的大环境下。</p>
<p>对于一篇论文而言,有创新点是别人评价的一个重要方面。现实的情况是很多论文重复着他人的工作,同质化的文章太多,水平怎么也是上不去的。</p>
<p>比创新匮乏更让人难以接受的是没有意义的工作,这些工作不仅仅是简单的重复,甚至还达不大前人的水准,无法为世界贡献任何的生产力。</p>
<p>二、科学研究的方法</p>
<p>1、数学</p>
<p>对于工科学生而言,数学对一部分人而言可能是个难题(比如我),大部分人应该是够用的。现在有个不好的趋势就是很多工科学生研究偏重理论,基本上是搞数学去了,我觉得应该承认数学对于工程的重要性,但是还是不能本末倒置。邹谋炎先生写的这篇文章《<a class="reference external" href="http://ishare.iask.sina.com.cn/f/20591744.html">谈谈工科学生如何学习数学</a>》对我个人很有启发。</p>
<p>2、英语</p>
<p>工科学生怎么学习英文都不为过,这是我现阶段最重要的感受。比较下国内和国外的文献,中文文献从各个方面都有很大的差距,甚至个别文献还会出现误导读者的情况(我是有实际体会的)。英文的难度其实主要集中在跨门槛的时候,一旦跨过了,那就海阔天空了</p>
</p>ArchLinux入门浅谈2012-02-24T12:43:00+08:00Joshztag:www.joshuazhang.net,2012-02-24:posts/2012/archlinux-intro.html<p>这是本人几次安装Arch摸爬滚打得出的被虐成果,发出来一方面是整理思路,同时也希望能够帮助同样在“享受”这一过程的朋友。</p>
<div class="section" id="arch">
<h2>为什么用Arch?</h2>
<p>这方面的文章相当多,一搜一大把,我就不做什么总结发言了,写几点自己的想法。其实弊人最早接触的linux发行版是ubuntu和debian,当时ubuntu很被看好,不过还没流行到现在这个程度。那是我第一次被一个完全免费而且漂亮的东西打动了,期间零零碎碎玩过几次系统,但是由于技术水平有限,一直玩得不怎么顺手。直到最近,我开始越来越讨厌windows的臃肿庞大和功利,希望能够转移到linux平台上,把windows作为对“现实世界的妥协”。虽然debian也是很出色的系统,但是显然它和windows相同的特点就是较为臃肿,杂七杂八的东西自带一大堆(我不很清楚debian有没有精简定制的可能性)。出于这点考虑,我也玩过几天的LFS,注意,我当时不过装过几次linux,断断续续看过linux书籍的几个章节而已,可以想象当时我是怎样的抓耳挠腮吧^_^。当然这次实验以失败告终,我只能继续寻找能让自己足够满意的系统,终于,ArchLinux进入了我的视线。在我看来,Arch有以下几个特点是让我欲罢不能的:</p>
<ol class="arabic simple">
<li>极大的定制性。虽然比不上LFS完全的定制性,但是在学习成本上要降下不少,而且LFS对于不致力于研究Linux架构的人似乎没什么必要。</li>
<li>Pacman和AUR。Gentoo似乎也可以定制,但是每个软件都要编译对于我这样的新手而言那就是上刀山下火海。。。</li>
<li>完善的文档。我没有接触过其他Linux发行版的文档,无法横向对比,但是就我使用的情况而言,wiki组织得很有条理,细节也非常清楚,如果你带有学习的心态,那么Arch不会让你失望。(这里有一个<a class="reference external" href="http://www.cyberciti.biz/tips/linux-unix-bsd-documentations.html">比较</a>,Arch的文档居然拍第二)</li>
<li>搭积木。既然是“玩”Linux,那么从无到有是最让人兴奋的,相比有些发行版直接向你展示一个半成品,自己从基础开始搭建出一幢大楼会让人充满成就感。</li>
</ol>
<p>个人的使用感受就是如此,技术层面我暂时还说不出什么更深的东西,Linux是需要积累的。</p>
</div>
<div class="section" id="id1">
<h2>如何入门?</h2>
<p>虚拟机是必要的。即使你有一定的Linux基础,仍然需要在虚拟环境下感受一下整个的组装过程,同时考虑可能碰到的问题和解决方案并做好记录(关键问题记录即可,不需要事无巨细,下面会谈到)。</p>
<p>当然实际的安装更加必要,尤其是设计到驱动和X的部分,很有可能你就会在这儿倒下。</p>
<p>不同于某些流行的发行版,Arch没有什么书籍可以参考,如果一定要说有的话也只有这本<a class="reference external" href="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&ved=0CGIQFjAG&url=http%3A%2F%2Ftuxweet.linux.org.tr%2Fgetfile%2Fpid%3Apublic_250721%2Farch.pdf&ei=gHZHT5_eM62tiQel09SnDg&usg=AFQjCNH7_1Q5VGEdo98g8prZra0-D5msFw&sig2=3SPyg8TUbP0d6IBaY0G4DQ">Arch Linux Handbook</a>。但是我们应当注意到这本书发布于2009年,由于Arch更新地非常快,因此书中很多内容已经不符合现在的情况,过程虽然相似,但是如果在细节上马虎,那么很有可能出现难以解决的问题(对于从地基开始搭建的系统更是如此)。所以这本书仅能作为参考,千万不能如标题所言作为手册。</p>
<p>中文资料也有不少,主要是网页,最经典的是<a class="reference external" href="http://linuxtoy.org/archives/the-perfect-linux-desktop-arch-linux-2007-08-2-1.html">打造完美的 Linux 桌面</a>,同样的,里面的某些命令也严重过时。</p>
<p>不要沮丧,初学者应当坚定一个信念,最好的文档就是官方wiki,它由最活跃的Arch用户打造,实时性、正确性都有保障,应当作为我们的最权威指南。里面大部分是英文,部分有中文(这里提一下,部分页面中文翻译相对英文原文有延时,如果参考中文手册出现问题,建议参考英文),玩Linux就应该做好挑战自己英语水平的准备,呵呵。</p>
</div>
<div class="section" id="id2">
<h2>如何使用手册?</h2>
<p>这个问题困扰了我很久,虽然我有两台电脑可以自由使用,但是它们在空间上相距太远,无法做到让我边安装边参考。我也想过将wiki打印出来,但是在最初的安装中发现打印的总是不够,你需要不停地链接到其它文章,所以只能作罢(当然如果你熟练了,那么需要参考的文章就少了,但那就不是入门者的问题了)。</p>
<p>这个问题在安装基本系统时最为突出,因为一旦装好了GUI和网络驱动,那你可以方便地在浏览器中参考,但是如果GUI安装出现问题那就相当麻烦(网络有问题那安装arch就没啥意义了,除非你只需要基本工具),总不能重启切到windows搜索再来吧?</p>
<p>实际上这个问题Arch的维护人员早就替你解决了,这主要分两个阶段:</p>
<ol class="arabic simple">
<li>安装基本系统时。如果你足够细心,那么你会看到Arch的提示,在Arch的ISO文件里就存了一份最新的Offical Installation Guide en,位于/usr/share/aif/docs/official_installation_guide_en,用vi或者nano打开即可。你可能会问,我打开了文档那我怎么继续安装呢?不要忘了,Linux有多个终端,你可以Ctrl+ALT+F2在第二个终端看文档,再Ctrl+ALT+F1切换会终端1,还可以用ALT+F7看安装实时日志,现在知道Linux多用户终端的好处了吧。</li>
<li>配置系统GUI时。这个时候初学者如果手头没有参考手册,面对黑压压的终端完全无从操作。这时只要你网络配置正常,那么你照样可以参考wiki。当然这时是没法用Firefox或者Chrome的,但我们有lynx,它是一个终端的网络浏览器,支持在字符界面下查看网页或者上网(直接用pacman命令安装),为了效率考虑,我们直接把wiki下载下来,而不要去上网刷新了。这同样很简单:<tt class="docutils literal">pacman <span class="pre">-S</span> <span class="pre">arch-wiki-docs</span> <span class="pre">arch-wiki-lite</span></tt>。其中arch-wiki-docs是网页,arch-wiki-lite是文本,推荐用lynx浏览网页版(因为在字符终端下有高亮,Geek味马上就来了!)。PS:安装后直接打开/usr/share/doc/arch-wiki/html/index.html就可以了,lynx有搜索功能,非常实用。同样的你也需要在不同终端下切换文档和工作空间。</li>
</ol>
<p>有了这个工具,安装过程就不再黑暗,我甚至都不想切到图形界面去了^_^(有zhcon这还真没有什么难的)。只要善用该方法,安装Arch时不再需要大量的文档准备工作,只要对目标配置了解即可,边参考边装系统,多装几遍自然就熟悉了,除了重要的问题做点记录外,基本不需要准备小本子了。</p>
</div>
<div class="section" id="id3">
<h2>如何找到适合的软件?</h2>
<p>Arch默认的包管理工具是pacman,主要有两个配置文件:/etc/pacman.conf和/etc/pacman.d/mirrorlist。pacman可以安装的软件可以到<a class="reference external" href="http://www.archlinux.org/packages">这里</a>搜索。AUR包含的软件可以到<a class="reference external" href="https://aur.archlinux.org">这里</a>搜索。应当善用这两个搜索,当然你也可以命令行方式搜索,不过要注意源的配置。</p>
</div>
<div class="section" id="id6">
<h2>学习什么?</h2>
<p>不同Linux有不同特点,这些特点决定了用户在该发行版下大量的时间在干什么,比如Ubuntu用于娱乐,Debian用于编程,Gentoo用于管理服务器。对我而言,学习Linux主要目的在于熟悉工作平台,写LaTeX文档以及偶尔编程(当前的目标),所以折腾X和软件(Arch高度的定制性保证了我可以方便地折腾各种WM和DE)、提高LaTeX水平以及Matlab和C语言编程是我可以着力的方向。当然,适当的娱乐同样需要,Mplayer的使用以及Wine平台都需要了解。</p>
</div>
标准差浅谈2012-02-21T01:08:00+08:00Joshztag:www.joshuazhang.net,2012-02-21:posts/2012/standard-deviation.html<p>本文翻译自 <a class="reference external" href="http://mathcentral.uregina.ca/RR/database/RR.09.95/weston2.html">A note on standard deviation</a>
,解释了让大部分统计学入门者感到困惑的一个经典问题。</p>
<p>假如你正同时上几门课并且刚刚通过考试拿到成绩。很自然的,我们想了解班里其他学生的情况好让你的成绩有个参照。平均值或中位数可以告诉我们所有成绩的“中心值”或者“中间数”,但是它们很难体现成绩的分布或者变化。</p>
<p>我们来看一个小例子。假如5名学生参加三门课程获得的成绩如下:</p>
<table border="1" class="docutils"><thead><tr><th>课程1
</th><th>课程2
</th><th>课程3
</th></tr></thead><tbody><tr align="center"><td>82
</td><td>82
</td><td>67
</td></tr><tr align="center"><td>78
</td><td>82
</td><td>66
</td></tr><tr align="center"><td>70
</td><td>82
</td><td>66
</td></tr><tr align="center"><td>58
</td><td>42
</td><td>66
</td></tr><tr align="center"><td>42
</td><td>42
</td><td>65
</td></tr></tbody></table><p>每一个课程都有一个平均值,\(\overline{x}\),且都为66,尽管如此,不同课程成绩的波动仍然有很大的差异。对这种波动的测量的其中一种方法是极差,也就是最大值与最小值之差。本例中,前两门课程极差均为82-42=40而第三门课程极差为67-65=2。因为课程1和课程2有相同的极差但是它们的偏差明显不同,所以极差不是一个测量偏差的理想指标。我们还可以这样看待偏差,课程3中所有的成绩都和平均值比较接近,课程1中有些接近而有些远离,课程2中所有成绩都远离均值。按照这样的观点我们可以引入标准差的概念。</p>
<p>首先来看看课程1,对每个学生计算其成绩与平均分的差值。</p>
<table border="1" class="docutils">
<colgroup>
<col width="24%" />
<col width="76%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">课程1</th>
<th class="head">\(x_1-\overline{x}\)</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>82</td>
<td>16</td>
</tr>
<tr><td>78</td>
<td>12</td>
</tr>
<tr><td>70</td>
<td>4</td>
</tr>
<tr><td>58</td>
<td>-8</td>
</tr>
<tr><td>42</td>
<td>-24</td>
</tr>
</tbody>
</table>
<p>这些差值的平均可以计算得到并作为对偏差的一种度量方式,在此例中其值为0。我们真正需要的其实是每个分数与均值之间的距离。你可以对差值取绝对值再平均,称之为平均差(mean
deviation),即\(md=\frac{\sum|x_1-\overline{x}|}{n}\),n为课程的学生数。对课程1而言\(md=\frac{64}{5}=12.5\)。另一种处理负差值的方式就是取平方相加。</p>
<table border="1" class="docutils">
<colgroup>
<col width="13%" />
<col width="41%" />
<col width="46%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">课程1</th>
<th class="head">\(x_1-\overline{x}\)</th>
<th class="head">\((x_1-\overline{x})^2\)</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>82</td>
<td>16</td>
<td>256</td>
</tr>
<tr><td>78</td>
<td>12</td>
<td>144</td>
</tr>
<tr><td>70</td>
<td>4</td>
<td>16</td>
</tr>
<tr><td>58</td>
<td>-8</td>
<td>64</td>
</tr>
<tr><td>42</td>
<td>-24</td>
<td>576</td>
</tr>
</tbody>
</table>
<p>第三列的和为1056。为了求得标准差s,将该和除以n-1并开方。课程1的方差则为\(s=\sqrt{\frac{\sum(x_1-\overline{x})^2}{n-1}}=\sqrt{\frac{1056}{4}}=16.2\)</p>
<p>同样可以计算得到课程2和课程3方差分别为21.9和0.7。课程3分数都靠近均值因此方差非常小;课程1分数分布在42和82之间,方差也相当可观;课程2分数都远离均值,方差因此更大。方差是统计学家最常用的测量数据集偏差的量。</p>
<p>我们需要对分母采用n-1做出一个解释。为此我们换一个例子。假设我对北美中学生每天花在数学作业上的时间感兴趣。这里总体就是所有北美的中学生,数目非常大。设人数为N,我真正的兴趣在于这个总体的均值和方差。统计学家习惯于用希腊字母表示总体的量,因此总体均值记为\(\mu=\frac{\sum
x_1}{N}\),类似的方差为\(\sigma=\sqrt{\frac{\sum(x_1-\mu)^2}{N}}\)。注意这里分母为N。</p>
<p>统计学家通常只选择一个样本,比如n个学生,在这个小数据集上估计\(\mu\)和\(\sigma\),而不是直接对这么大的总体进行统计。这里n可能是25,30或100或者甚至1000,不过它肯定远小于N。为了估计\(\mu\)很自然地我们可以用样本均值\(\overline{x}\)。同样的为了估计\(\sigma\)似乎用\(\sqrt{\frac{\sum(x_1-\overline{x})^2}{n}}\)也很合理,不过这样计算往往会“低估”\(\sigma\),尤其是在n比较小的时候。由于这个以及其它技术原因,通常\[s=\sqrt{\frac{\sum(x_1-\overline{x})^2}{n-1}}\]被用来估计\(\sigma\)。</p>
<p>如果你有计算器可以直接计算方差的话你可以试着找出它使用的是哪种计算方法。用一个3个数字的数据集-1,0,1,用手工和计算器的方式分别计算方差,看看计算器使用的是哪种计算方法吧。</p>
<p>译者注:该文章在网上发表后,有老师希望文章作者对n与n-1的选择问题作出更详尽的解释,本文作者回复邮件称可以用一个小实验来进行验证。这里把回复邮件也做了个简单的翻译:</p>
<p>与其对我所说的“其它技术原因”做一个理论上精巧的阐述,我更愿意建议你和你的学生做一个实验以说明“这个数值往往低估了\(\sigma\)值”以及“其它技术原因”是什么。我将在下面的讲述中针对\(\sigma^2\),而非\(\sigma\)。</p>
<p>我们用白豆和黑豆来进行实验。你可以用任何除了使用视觉外难以区分的物体来模拟。你可能需要60到100个这样的物件,其中1/4作为白豆,3/4作为黑豆。假定每个白豆取值为5,黑豆取值为1。这样总体就设置好了。整个总体的比例以及均值、方差都应当向你的学生保密直到实验完成。很简单的,总体的均值为:\[\mu=1(\frac{3}{4})+5(\frac{1}{4})=2\]方差为:\[\sigma^2=(1-2)^2(\frac{3}{4})+(5-2)^2(\frac{1}{4})=3\]</p>
<p>学生的任务是要利用一个随机的测试样本来估计豆子的均值及方差。为了让计算保持简单我建议样本数目设为n=3。把豆子放在一个学生无法看到但是可以取出的地方,比如一个袋子或者一个瓶子里,每个人每次随机取出3颗豆子并做样本记录。每个学生记录完后应当将豆子放回。如果你能得到50到60个样本那就最好了,这样你就可以让每个学生选择两个样本并且独立地处理它们。每个学生应当计算他的样本的均值以及方差,并且要计算(方差)两次,一次除以n,一次除以n-1。把学生交给你的结果汇总记录在三栏里面,一栏为均值,一栏为除以n得到的方差,另一栏为除以n-1得到的方差。你会发现均值一栏只有四种不同的数值,其它两栏都只有两种不同的值。这是由于样本值n=3选得比较小的缘故。如果样本值大一点那么每栏可能值得数目就会多一点。</p>
<p>我们首先考虑第一栏,即均值。该栏里的每一个数值都是对总体均值的一个估计。现在告诉学生们总体的均值这样他们就可以看到有些估计值太大而另一些太小。再计算该栏所有值的均值。这个均值应当很靠近2,也就是总体的均值。从理论上说,“平均而言”,样本均值和总体均值是相等的。我们把这样的性质称之为无偏,样本均值就是总体均值的一个无偏估计。</p>
<p>现在考虑第二和第三栏,计算它们的均值并告诉学生们总体的方差。除以n-1得到的方差的均值应当很接近总体的方差而另一栏的均值就会小得比较多。样本方差(除以n-1)是总体方差的一个无偏估计。样本方差(除以n)是总体方差的一个有偏估计,并且“总是低估\(\sigma\)”。</p>
<p>最后一点。当分母为n-1时计算出来的值为总体方差的一个无偏估计。有没有可能存在一个比样本方差更好的对总体方差的估计值呢?你不仅仅希望这个新的估计值是无偏的而且还希望在该栏的所有的新的估计值大部分都接近总体方差。也就是说,你希望新的估计值的方差要小。这是我所说的用样本方差来估计总体方差的“其它技术原因”之一。在所有你可以使用的合理的估计当中,样本均值有着最小的方差。</p>
<p>希望这个建议能有帮助。如果你做了这个实验,请告诉我结果如何。</p>
<p>有博士生做了本文作者建议的实验并且给出了<a class="reference external" href="http://mathcentral.uregina.ca/RR/database/RR.09.95/javier.xls">excel表格</a>,部分截图如下:</p>
<img alt="quilez" src="http://mathcentral.uregina.ca/RR/database/RR.09.95/quilez.gif" />
<p>补充:实际上n和n-1的选择问题用数学理论很容易解释,那就是n-1时样本方差的期望值就是总体方差(对样本方差求期望,简单推导即可得到)。造成大部分人困惑的原因就是n-1没有n看上去那么自然,同时对于总体和样本的概念以及它们的地位有所混淆。这篇文章其实讲的很浅显,但是国外教授对于简单问题往往会给出大量的篇幅,这与国内教材动辄大篇数学公式的风格大不一致。我们不能简单地说两种模式孰高孰低,但是国人受到苏联模式的影响如此深远,却始终成不了数学大国,恐怕是时候改变下思路了。</p>
Pelican 的 LaTeX 集成2012-02-18T05:48:00+08:00Joshztag:www.joshuazhang.net,2012-02-18:posts/2012/latex-pelican.html<p>本文主要用于测试 Pelican 与 MathJax 配合显示数学公式。</p>
<h2 id="pelican-mathjax">为 Pelican 添加 MathJax 支持</h2>
<p>鉴于并非每篇文章都会有数学公式,而<code>MathJax.js</code>的资源加载在国内并不稳定,因此只在需要显示数学公式的 HTML 文件里才添加<code>MathJax CDN</code>。一个简单的方法是在需要公式显示的文章里加入<code>mathjax=true</code>的元数据声明:</p>
<div class="codehilite"><pre>Markdown Style
Mathjax: true
reST Style
:mathjax: true
HTML Style
< meta name="mathjax" content="true" />
</pre></div>
<p>然后还需要在 Pelican 的主题模板文件中添加判断是否需要启用 MathJax 的<code>Jinja</code>代码,将以下代码保存在空文件<code>THEME/templates/mathjax.html</code>中:</p>
<div class="codehilite"><pre><span class="c">{# LaTeX mathjax support</span>
<span class="c"> If the post has metadata "mathjax=true", then add mathjax cdn support</span>
<span class="c">#}</span><span class="x"></span>
<span class="cp">{%</span> <span class="k">if</span> <span class="nv">article.mathjax</span> <span class="cp">%}</span><span class="x"></span>
<span class="x"><script type="text/x-mathjax-config"></span>
<span class="x"> MathJax.Hub.Config({</span>
<span class="x"> tex2jax: {</span>
<span class="x"> inlineMath: [ ['$','$'], ["\\(","\\)"] ],</span>
<span class="x"> processEscapes: true</span>
<span class="x"> }</span>
<span class="x"> });</span>
<span class="x"></script></span>
<span class="x"><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></span>
<span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span><span class="x"></span>
</pre></div>
<p>官方的CDN国内无法稳定地加载,加速国内访问可以使用 <a href="http://www.freecdn.cn/">www.freecdn.cn</a> 或者<code>GitCafe</code>上的地址:</p>
<div class="codehilite"><pre><span class="nt"><script </span><span class="na">src=</span><span class="s">"http://libs.cncdn.cn/mathjax/2.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML"</span><span class="nt">></script></span>
<span class="nt"><script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"http://pkuwwt.gitcafe.com/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"</span><span class="nt">></script></span>
</pre></div>
<p>在需要判断是否开启 MathJax 的模板文件中(比如<code>index.html</code>、<code>article.html</code>等可能需要显示公式的模板)的合适位置添加<code>{% include "mathjax.html" %}</code></p>
<h2 id="_1">公式编辑</h2>
<h3 id="html">HTML 文档</h3>
<p><code>MathJax.js</code>的作用是把 HTML 源文件中的公式 Block 转换为 CSS 的字体和位置控制代码
。公式块的声明有三种:</p>
<div class="codehilite"><pre><span class="s">\(</span><span class="nb"> ... Inline Equation ... </span><span class="s">\)</span>
<span class="sb">\[</span><span class="nb"> ... Displayed Equation ... </span><span class="s">\]</span>
<span class="sb">$$</span><span class="nb"> ... Displayed Equation ... </span><span class="s">$$</span>
</pre></div>
<p>默认唯独不支持<code>$ ... Inline Equation ... $</code>方式(可手动设置,见上)。</p>
<h3 id="markdown">Markdown</h3>
<p>Markdown 文本首先需要被转换为 HTML 文档,而后在浏览器中渲染时<code>MathJax.js</code>才会寻找定义
的公式块。由于 Markdown 无法识别 MathJax 定义的公式块,因此公式块内的文本都会被当成普通文本处理,一些特殊符号尤其需要特别注意,比如<code>\</code>和<code>_</code>、<code>*</code>这几个字符,前一个为 Markdown 转义符,后两个为强调指示符。</p>
<p>由于 Pelican 使用的 Markdown 解析器是<a href="https://pythonhosted.org/Markdown/index.html">Python-Markdown</a>,而它默认禁用了<a href="https://pythonhosted.org/Markdown/#differences">下划线强调规则</a>,因此公式中的<code>_</code>一般情况都不会被转换为<code><em></em></code>,但<code>*</code>和<code>\</code>解析的麻烦仍然存在。</p>
<p>一个<code>*</code>解析的示例:</p>
<div class="codehilite"><pre>$$ x*y*z=100 $$
</pre></div>
<p>Markdown 转换为 HTML 的结果为:</p>
<div class="codehilite"><pre><span class="nt"><p></span>$$ x<span class="nt"><em></span>y<span class="nt"></em></span>z=100 $$<span class="nt"></p></span>
</pre></div>
<p>此处作为乘号的两个<code>*</code>被识别成强调指示符,正确的代码应为:</p>
<div class="codehilite"><pre>$$ x\*y\*z=100 $$
</pre></div>
<p>渲染结果如下:
$$ x*y*z=100 $$</p>
<p><code>\</code>解析问题以洛伦兹方程为例:</p>
<div class="codehilite"><pre>\[\begin{aligned}
\dot{x} & = \sigma(y-x) \\
\dot{y} & = \rho x - y - xz \\
\dot{z} & = -\beta z + xy
\end{aligned}\]
</pre></div>
<p>Markdown 转换为 HTML 的结果如下:</p>
<div class="codehilite"><pre><p>[\begin{aligned}
\dot{x} = \sigma(y-x) \
\dot{y} = \rho x - y - xz \
\dot{z} = -\beta z + xy
\end{aligned}]</p>
</pre></div>
<p>注意<code>\a-z</code>的解析不受影响,而$\LaTeX$的换行代码<code>\\</code>被转换为<code>\</code>,
<code>\[</code>被转换为<code>[</code>,显然这不是想要的结果。为了得到正确的解析结果,公式代码必须改为:</p>
<div class="codehilite"><pre>\\[\begin{aligned}
\dot{x} & = \sigma(y-x) \\\\
\dot{y} & = \rho x - y - xz \\\\
\dot{z} & = -\beta z + xy
\end{aligned}\\]
</pre></div>
<p>显示结果如下:
\[\begin{aligned}
\dot{x} & = \sigma(y-x) \\
\dot{y} & = \rho x - y - xz \\
\dot{z} & = -\beta z + xy
\end{aligned}\]</p>
<p>通过上面的例子可见通过添加 Markdown 转义符<code>\</code>可以有效解决各种转换问题,手工调整的方法虽然繁琐,但不失简单直接,如果公式不多不复杂这样做成本很低。对于强迫症患者或者要求较高的童鞋,还可以参考<a href="http://gohugo.io/tutorials/mathjax/">这里的方法</a>
。它可以解决所有特殊符号解析的难题,只要保证<code>CSS</code>和<code>MathJax</code>设置一致,使用其它 Markdown
解析器处理也不会有问题。其思路是将公式写入 Markdown 不处理的<code>verbatim</code>环境中,在 MathJax
设置中加入对<code>code</code>标签内容的渲染并设置一个合适的式样。</p>
<p>此外,我们也可以使用 Python-Markdown 的扩展 <a href="https://github.com/mayoff/python-markdown-mathjax">python-markdown-mathjax</a>,
缺点是安装以及设置较麻烦,而且个人支持难以长久,未来可能需要自己修改代码。</p>
<p>目前个人使用最朴实的方案,只要书写时稍作注意即可。</p>
<p>Cauchy-Schwarz不等式:</p>
<div class="codehilite"><pre>\\[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \\]
</pre></div>
<p>\[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \]</p>
<h3 id="rest">reST</h3>
<h2 id="_2">测试</h2>
<p>毕达哥拉斯定理:<code>\\(a^2+b^2=c^2\\)</code>,\(a^2+b^2=c^2\)</p>
<p>正态分布:</p>
<div class="codehilite"><pre>$$f\left(x\right)=\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$
</pre></div>
<p>$$f\left(x\right)=\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$</p>
<p>傅里叶变换:</p>
<div class="codehilite"><pre>\\[F\left(\omega\right)=\mathcal{F}\left[f(t)\right]=\int_{-\infty}^{\infty}e^{-i\omega T}dt\\]
</pre></div>
<p>\[F\left(\omega\right)=\mathcal{F}\left[f(t)\right]=\int_{-\infty}^{\infty}e^{-i\omega T}dt\]</p>
<p>傅里叶逆变换:</p>
<div class="codehilite"><pre>\\[f\left(t\right)=\mathcal{F}^{-1}\left[F\left(\omega\right)\right]=\frac{1}{2\pi}\int_{-\infty}^{\infty}F\left(\omega\right)e^{i\omega t}d\omega\\]
</pre></div>
<p>\[f\left(t\right)=\mathcal{F}^{-1}\left[F\left(\omega\right)\right]=\frac{1}{2\pi}\int_{-\infty}^{\infty}F\left(\omega\right)e^{i\omega t}d\omega\]</p>
<p>MathJax的语法基本与latex一致,可以参考wikipedia的latex书写语法规范<a href="http://zh.wikipedia.org/wiki/Help:%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F">Help:数学公式</a></p>