<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Farseerfc的小窩 - pelican</title><link href="//farseerfc.me/" rel="alternate"></link><link href="//farseerfc.me/feeds/tag-pelican.atom.xml" rel="self"></link><id>//farseerfc.me/</id><updated>2016-08-07T16:28:00+09:00</updated><entry><title>啓用 GitHub Issue 作爲博客留言系統</title><link href="//farseerfc.me/github-issues-as-comments.html" rel="alternate"></link><published>2016-08-07T16:28:00+09:00</published><updated>2016-08-07T16:28:00+09:00</updated><author><name>farseerfc</name></author><id>tag:farseerfc.me,2016-08-07:/github-issues-as-comments.html</id><summary type="html">&lt;p&gt;從今天起本博客將啓用 GitHub Issue 作爲留言系統。
原本使用的 Disqus 將繼續保留一段時間，目前沒有關閉的計劃。&lt;/p&gt;
&lt;p&gt;換用 GitHub Issue 是計劃了好久的事情了，最初重做這個主題的時候就有考慮過。
這個想法的契機是看到了這篇
&lt;a class="reference external" href="http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html"&gt;GitHub hosted comments for GitHub hosted blogs&lt;/a&gt;
，然後立馬覺得這個想法很符合寄宿在 GitHub Pages 上的博客。
一個限制是要求評論者必須有 GitHub
賬戶，考慮到我的博客的受衆這個要求估計不算太過分。
使用 GitHub Issue 的好處麼，比如自帶的 GFMD
富文本格式，郵件通知，還有訂閱和取消訂閱通知，郵件回復，
這些方面都不比第三方留言系統遜色。&lt;/p&gt;
&lt;p&gt;換用 GitHub Issue 另一方面原因是最近聽說 Disqus
被部分牆了，想必以後牆也會越來越高。之前曾經試過在這個博客換上多說，
然而效果我並不喜歡，多說喜歡侵入頁面加很多奇怪的東西 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;從今天起本博客將啓用 GitHub Issue 作爲留言系統。
原本使用的 Disqus 將繼續保留一段時間，目前沒有關閉的計劃。&lt;/p&gt;
&lt;p&gt;換用 GitHub Issue 是計劃了好久的事情了，最初重做這個主題的時候就有考慮過。
這個想法的契機是看到了這篇
&lt;a class="reference external" href="http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html"&gt;GitHub hosted comments for GitHub hosted blogs&lt;/a&gt;
，然後立馬覺得這個想法很符合寄宿在 GitHub Pages 上的博客。
一個限制是要求評論者必須有 GitHub
賬戶，考慮到我的博客的受衆這個要求估計不算太過分。
使用 GitHub Issue 的好處麼，比如自帶的 GFMD
富文本格式，郵件通知，還有訂閱和取消訂閱通知，郵件回復，
這些方面都不比第三方留言系統遜色。&lt;/p&gt;
&lt;p&gt;換用 GitHub Issue 另一方面原因是最近聽說 Disqus
被部分牆了，想必以後牆也會越來越高。之前曾經試過在這個博客換上多說，
然而效果我並不喜歡，多說喜歡侵入頁面加很多奇怪的東西，比如用戶的頭像通常是
http 的……也試過結合新浪微博的評論，而新浪微博越來越封閉，API 也越來越不靠譜。&lt;/p&gt;
&lt;p&gt;使用 GitHub Issue 作爲評論的方式比較簡單，上面那篇博客裏面提到了，代碼量不比
加載 Disqus 多多少，而且沒有了 iframe 的困擾，唯一麻煩的地方就是要稍微設計一下佈局方式讓它融入
現有的頁面佈局。
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/2ea6c9f3227275fe86ddaa75d8fc6496b3b03d8c/templates/includes/comments.html#L32"&gt;我參考上面的實現在這裏&lt;/a&gt; 。
這個加載代碼使用兩個變量加載 Issue Comments ，一個是在 pelicanconf.py 裏的
&lt;code class="code"&gt;
GITHUB_REPO&lt;/code&gt;
 ，可以指向任何 Repo ，我指向 farseerfc/farseerfc.github.io
的這個 GitHub Page repo ，另一個變量是每篇文章裏需要加上 &lt;code class="code"&gt;
issueid&lt;/code&gt;

的元數據，關連文章到每個 Issue 上。&lt;/p&gt;
&lt;p&gt;還有一個稍微麻煩的事情是現在每寫一篇文章之後都要新建一個 issue 了。
手動操作有點累人，於是我 &lt;a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/createissue.py"&gt;寫了個腳本&lt;/a&gt;
自動搜索 pelican 的 content 文件夾裏面文章的 slug 並且對沒有 issueid 關連的
文章創建 issue 。&lt;/p&gt;
&lt;p&gt;好啦新的留言系統的外觀樣式還在測試中，希望大家多留言幫我測試一下！&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2016年8月7日19:30更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;新增了對 GitHub Issue comments 裏面
&lt;a class="reference external" href="https://developer.github.com/v3/issues/comments/#reactions-summary"&gt;reactions&lt;/a&gt;
的支持，套用 font-awesome 的圖標（似乎沒 GitHub 上的圖標好看）。這個還屬於 GitHub API
的實驗性功能，要加入 &lt;code class="code"&gt;
Accept: application/​vnd.github.squirrel-girl-preview&lt;/code&gt;

HTTP 頭纔能拿到。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2016年8月7日23:16更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;感謝 @iovxw 的測試讓我發現 github 的高亮回復和郵件回復是需要特殊處理的。
高亮回復用上了 &lt;a class="reference external" href="https://github.com/sindresorhus/github-markdown-css"&gt;這裏的 CSS&lt;/a&gt;
郵件引言的展開事件直接用 jQuery 做了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".email-hidden-toggle &amp;gt; a"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".email-hidden-reply"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;還得注意郵件的回復需要 CSS 裏面 &lt;code class="code"&gt;
white-space: pre-wrap&lt;/code&gt;
 。&lt;/p&gt;
</content><category term="tech"></category><category term="pelican"></category><category term="github"></category><category term="pages"></category><category term="issues"></category></entry><entry><title>用 Travis-CI 生成 Github Pages 博客</title><link href="//farseerfc.me/travis-push-to-github-pages-blog.html" rel="alternate"></link><published>2015-02-20T11:10:00+09:00</published><updated>2015-02-20T11:10:00+09:00</updated><author><name>farseerfc</name></author><id>tag:farseerfc.me,2015-02-20:/travis-push-to-github-pages-blog.html</id><summary type="html">
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月21日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;上次介紹過 &lt;a class="reference external" href="//farseerfc.me/redesign-pelican-theme.html"&gt;這個博客改換了主題&lt;/a&gt; ，
本以爲這個話題可以告一段落了，沒想到還能繼續寫呢。&lt;/p&gt;
&lt;p&gt;寄宿在 Github Pages 上的靜態博客通常有兩種方案，其一是使用 &lt;a class="reference external" href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; 方式撰寫，這可以利用
Github Pages 原本就有的
&lt;a class="reference external" href="https://help.github.com/articles/using-jekyll-with-pages/"&gt;Jekyll支持&lt;/a&gt;
生成靜態網站。另一種是在 &lt;strong&gt;本地&lt;/strong&gt; 也就是自己的電腦上生成好，然後把生成的 HTML 網站 push
到 Github Pages ，這種情況下 Github Pages 就完全只是一個靜態頁面宿主環境。&lt;/p&gt;
&lt;p&gt;我用 &lt;a class="reference external" href="http://getpelican.com/"&gt;Pelican&lt;/a&gt; 生成博客，當然就只能選擇後一種方式了。這帶來一些不便，比如本地配置 pelican
還是有一點點複雜的，所以不能隨便找臺電腦就開始寫博客。有的時候只是想修正一兩個錯別字，
這時候必須打開某臺特定的電腦纔能編輯博客就顯得不太方便了。再比如 pelican 本身雖然是 python
寫的所以跨平臺，但是具體到博客的配置方面， Windows …&lt;/p&gt;</summary><content type="html">
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月21日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;上次介紹過 &lt;a class="reference external" href="//farseerfc.me/redesign-pelican-theme.html"&gt;這個博客改換了主題&lt;/a&gt; ，
本以爲這個話題可以告一段落了，沒想到還能繼續寫呢。&lt;/p&gt;
&lt;p&gt;寄宿在 Github Pages 上的靜態博客通常有兩種方案，其一是使用 &lt;a class="reference external" href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; 方式撰寫，這可以利用
Github Pages 原本就有的
&lt;a class="reference external" href="https://help.github.com/articles/using-jekyll-with-pages/"&gt;Jekyll支持&lt;/a&gt;
生成靜態網站。另一種是在 &lt;strong&gt;本地&lt;/strong&gt; 也就是自己的電腦上生成好，然後把生成的 HTML 網站 push
到 Github Pages ，這種情況下 Github Pages 就完全只是一個靜態頁面宿主環境。&lt;/p&gt;
&lt;p&gt;我用 &lt;a class="reference external" href="http://getpelican.com/"&gt;Pelican&lt;/a&gt; 生成博客，當然就只能選擇後一種方式了。這帶來一些不便，比如本地配置 pelican
還是有一點點複雜的，所以不能隨便找臺電腦就開始寫博客。有的時候只是想修正一兩個錯別字，
這時候必須打開某臺特定的電腦纔能編輯博客就顯得不太方便了。再比如 pelican 本身雖然是 python
寫的所以跨平臺，但是具體到博客的配置方面， Windows 環境和 Linux/OSX/Unix-like
環境下還是有
&lt;a class="reference external" href="http://pelican.readthedocs.org/en/latest/settings.html#date-format-and-locale"&gt;些許出入&lt;/a&gt;
的。還有就是沒有像 wordpress 那樣的基於 web
的編輯環境，在手機上就不能隨便寫一篇博客發表出來（不知道有沒有勇士嘗試過在
Android 的 &lt;a class="reference external" href="https://code.google.com/p/android-scripting/"&gt;SL4A&lt;/a&gt; 環境下的 python 中跑 pelican ，還要配合一個
&lt;a class="reference external" href="https://play.google.com/store/apps/details?id=com.romanenco.gitt"&gt;Android 上的 git 客戶端&lt;/a&gt; ）。&lt;/p&gt;
&lt;p&gt;當然並不是因此就束手無策了，感謝 &lt;a class="reference external" href="https://travis-ci.org/"&gt;Travis-CI&lt;/a&gt; 提供了免費的
&lt;ruby&gt;&lt;rb&gt;持续整合&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Continuous integration&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 虛擬機環境，
通過它全自動生成靜態博客成爲了可能。&lt;/p&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id10"&gt;關於 Travis-CI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://zh.wikipedia.org/wiki/%E6%8C%81%E7%BA%8C%E6%95%B4%E5%90%88"&gt;持续整合&lt;/a&gt;
原本是 &lt;ruby&gt;&lt;rb&gt;敏捷開發&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Agile Development&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
或者 &lt;ruby&gt;&lt;rb&gt;極限編程&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Extreme Programming&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 中提到的概念，大意就是說在開發的過程中，
一旦有微小的變更，就全自動地 &lt;strong&gt;持續&lt;/strong&gt; 合併到主線中， &lt;strong&gt;整合&lt;/strong&gt; 變更的內容到發佈版本裏。
這裏的 &lt;strong&gt;整合&lt;/strong&gt; 實際上可以理解爲 &lt;strong&gt;全自動測試&lt;/strong&gt; 加上 &lt;strong&gt;生成最終產品&lt;/strong&gt; 。
可以看到 &lt;strong&gt;持續整合&lt;/strong&gt; 實際強調 &lt;strong&gt;全自動&lt;/strong&gt; ，於是需要有一個服務器不斷地監聽主線開發的變更內容，
一旦有任何變更（可以理解爲 git commit ）就自動調用測試和部署腳本。&lt;/p&gt;
&lt;p&gt;於是要用持續整合就需要一個整合服務器，幸而 Travis-CI 對 github 上的公開 repo
提供了免費的整合服務器虛擬機服務，和 github 的整合非常自然。所以我們就可以用它提供的虛擬機
爲博客生成靜態網站。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id11"&gt;啓用 Travis-CI 自動編譯&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;這一步很簡單，訪問 &lt;a class="reference external" href="https://travis-ci.org/"&gt;https://travis-ci.org/&lt;/a&gt; 並用你的 Github 賬戶登錄，
授權它訪問你的賬戶信息就可以了。然後在 &lt;a class="reference external" href="https://travis-ci.org/repositories"&gt;https://travis-ci.org/repositories&lt;/a&gt; 裏開啓
需要編譯的 repo ，這樣 Travis-CI 就會監視對這個 repo 的所有 push 操作，並且對
每個 push 調用測試了。&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="在 Travis-CI 中開啓對 Github Repo 的持續整合" class="img-responsive" src="//farseerfc.me/images/travis-repo-enable.png"/&gt;
&lt;p class="caption"&gt;在 Travis-CI 中開啓對 Github Repo 的持續整合&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;然後在 repo 的根目錄放一個 &lt;code class="code"&gt;
.travis.yml&lt;/code&gt;
 文件描述編譯的步驟。
&lt;strong&gt;暫時&lt;/strong&gt; 測試的目的下我寫的 &lt;code class="code"&gt;
.travis.yml&lt;/code&gt;
 大概是下面這樣。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;python&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nt"&gt;python&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="s"&gt;"2.7"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nt"&gt;before_install&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo apt-add-repository ppa:chris-lea/node.js -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo apt-get install nodejs ditaa doxygen parallel&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nt"&gt;install&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo pip install pelican&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo pip install jinja2&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo pip install babel&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo pip install beautifulsoup4&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo pip install markdown&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo npm install -g less&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;wget "http://downloads.sourceforge.net/project/plantuml/plantuml.jar?r=&amp;amp;ts=1424308684&amp;amp;use_mirror=jaist" -O plantuml.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo mkdir -p /opt/plantuml&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo cp plantuml.jar /opt/plantuml&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;echo "#! /bin/sh" &amp;gt; plantuml&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;echo 'exec java -jar /opt/plantuml/plantuml.jar "$@"' &amp;gt;&amp;gt; plantuml&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo install -m 755 -D plantuml /usr/bin/plantuml&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;wget https://bintray.com/artifact/download/byvoid/opencc/opencc-1.0.2.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;tar xf opencc-1.0.2.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;cd opencc-1.0.2 &amp;amp;&amp;amp; make &amp;amp;&amp;amp; sudo make install &amp;amp;&amp;amp; cd ..&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo locale-gen zh_CN.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo locale-gen zh_HK.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo locale-gen en_US.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sudo locale-gen ja_JP.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git clone --depth 1 https://github.com/farseerfc/pelican-plugins plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git clone --depth 1 https://github.com/farseerfc/pelican-bootstrap3 theme&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;mkdir output&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;env SITEURL="farseerfc.me" make publish&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Travis-CI 提供的虛擬機是比較標準的 Ubuntu 12.04 LTS ，打上了最新的補丁，並且根據你指定的
語言選項會把相應的解釋器和編譯器升級到最新版（或者指定的版本）。這裏用 python 語言的配置，
所以 python 是 2.7 的最新版並且有 pip 可以直接用。
配置中的 before_install 和 install 的區別其實不大，其中任何一個失敗的話算作
build errored 而不是 build fail ，而如果在 script 裏失敗的話算作 build fail 。&lt;/p&gt;
&lt;p&gt;爲了編譯我的模板，還需要比較新的 less.js ，所以添加了 ppa 裝了個最新的 nodejs
並用它裝上了 less 。
還從源碼編譯安裝上了最新版的 opencc 1.0.2 ，因爲 Ubuntu 源裏的 opencc 的版本比較老(0.4)，
然後 doxygen 作爲 opencc 的編譯依賴也裝上了。
其它安裝的東西麼，除了 pelican 之外都是插件們需要的。以及我還需要生成 4 個語言的 locale
所以調用了 4 次 locale-gen 。由於是比較標準的 Ubuntu 環境，所以基本上編譯的步驟和在本地
Linux 環境中是一樣的，同樣的這套配置應該可以直接用於本地 Ubuntu 下編譯我的博客。&lt;/p&gt;
&lt;p&gt;寫好 &lt;code class="code"&gt;
.travis.yml&lt;/code&gt;
 之後把它 push 到 github ，然後 travis 這邊就會自動 clone
下來開始編譯。 travis 上能看到編譯的完整過程和輸出，一切正常的話編譯結束之後
build 的狀態就會變成 passing ，比如
&lt;a class="reference external" href="https://travis-ci.org/farseerfc/farseerfc/builds/51344614"&gt;我的這次的build&lt;/a&gt; 。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="travis-ci-github"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id12"&gt;從 Travis-CI 推往 Github&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;上面的測試編譯通過了之後，下一步就是讓 travis-ci 編譯的結果自動推到 Github Pages
並發佈出來。要推往 Github 自然需要設置 Github 用戶的身份，在本地設置的時候是把
ssh key 添加到 github 賬戶就可以了，在編譯細節都通過 github repo 公開了的 travis 上
當然不能放推送用的私有 key ，所以我們需要另外一種方案傳遞密碼。&lt;/p&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
Github 上創建 Personal Access Token&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;img alt="Github 上創建 Personal Access Token" class="img-responsive" src="//farseerfc.me/images/travis-blog-push.png"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;好在 Github 支持通過 &lt;a class="reference external" href="https://github.com/settings/applications"&gt;Personal Access Token&lt;/a&gt;
的方式驗證，這個和 App Token 一樣可以隨時吊銷，同時完全是個人創建的。另一方面 Travis-CI
支持加密一些私密數據，通過環境變量的方式傳遞給編譯腳本，避免公開密碼這樣的關鍵數據。&lt;/p&gt;
&lt;p&gt;首先創建一個 &lt;a class="reference external" href="https://github.com/settings/applications"&gt;Personal Access Token&lt;/a&gt;
，這裏需要勾選一些給這個 Token 的權限，我只給予了最小的 public_repo 權限，如側邊裏的圖。
生成之後會得到一長串 Token 的散列碼。&lt;/p&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
如果你不能使用 travis 命令&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月21日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;使用 &lt;code class="code"&gt;
travis encrypt&lt;/code&gt;
 命令來加密重要數據最方便，不過如果有任何原因，
比如 ruby 版本太低或者安裝不方便之類的，那麼不用擔心，我們直接通過
&lt;a class="reference external" href="http://docs.travis-ci.com/api/#repository-keys"&gt;travis api&lt;/a&gt;
也能加密數據。&lt;/p&gt;
&lt;p&gt;第一步用這個命令得到你的repo的 pubkey ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;curl -H "Accept: application/vnd.travis-ci.2+json" https://api.travis-ci.org/repos/&amp;lt;github-id/repo&amp;gt;/key | python2 -m json.tool | grep key | sed 's/.*"key": "\(.*\)"/\1/' | xargs -0 echo -en | sed 's/ RSA//' &amp;gt; travis.pem&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中的 &amp;lt;github-id/repo&amp;gt; 替換成 github 上的 用戶名/repo名， 比如我的是
farseerfc/farseer 。travis api 獲得的結果是一個 json ，所以還用 python 的
json 模塊處理了一下，然後把其中包含 key 的行用 &lt;code class="code"&gt;
grep&lt;/code&gt;
 提取出來，用
&lt;code class="code"&gt;
sed&lt;/code&gt;
 匹配出 key 的字符串本身，然後 &lt;code class="code"&gt;
xargs -0 echo -en&lt;/code&gt;

解釋掉轉義字符，然後刪掉其中的 "&amp;lt;空格&amp;gt;RSA" 幾個字（否則 openssl 不能讀），
最後保存在名爲 travis.pem 的文件裏。&lt;/p&gt;
&lt;p&gt;有了 pubkey 之後用 openssl 加密我們需要加密的東西並用 base64 編碼：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;echo -n 'GIT_NAME="Jiachen Yang" GIT_EMAIL=farseerfc@gmail.com GH_TOKEN=&amp;lt;Personal Access Token&amp;gt;' | openssl rsautl -encrypt -pubin -inkey travis.pem | base64 -w0&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;替換了相應的身份信息和token之後，這行得到的結果就是 secure 裏要寫的加密過的內容。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然後我們需要 &lt;code class="code"&gt;
travis&lt;/code&gt;
 命令來加密這個 token ， archlinux 用戶可以安裝
&lt;code class="code"&gt;
aur/​ruby-travis&lt;/code&gt;
 ，其它用戶可以用 gems 安裝：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; gem install travis&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;裝好之後，在設定了 Travis-CI 的 repo 的目錄中執行一下 &lt;code class="code"&gt;
travis status&lt;/code&gt;
 ，
命令會指導你登錄 Travis-CI 並驗證 repo 。正常的話會顯示最新的 build 狀態。
然後同樣在這個 repo 目錄下執行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; travis encrypt &lt;span class="s1"&gt;'GIT_NAME="Jiachen Yang" GIT_EMAIL=farseerfc@gmail.com GH_TOKEN=&amp;lt;Personal Access Token&amp;gt;'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;當然上面一行裏的相應信息替換爲個人的信息，作爲這個命令的執行結果會得到另一長串散列碼，
把這串散列寫入剛纔的 &lt;code class="code"&gt;
.travis.yml&lt;/code&gt;
 文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"long&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secure&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;base64&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有了這段聲明之後， Travis-CI 就會在每次編譯之前，設置上面加密的環境變量。
然後在編譯腳本中利用這些環境變量來生成博客：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git config --global user.email "$GIT_EMAIL"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git config --global user.name "$GIT_NAME"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git config --global push.default simple&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git clone --depth 1 https://github.com/farseerfc/pelican-plugins plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git clone --depth 1 https://github.com/farseerfc/pelican-bootstrap3 theme&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git clone --depth 1 https://$GH_TOKEN@github.com/farseerfc/farseerfc.github.io output&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;env SITEURL="farseerfc.me" make publish&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nt"&gt;after_success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;cd output&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git add -A .&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git commit -m "update from travis"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;git push --quiet&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="alert alert-warning compound"&gt;
&lt;p&gt;這裏要注意最後 &lt;code class="code"&gt;
git push&lt;/code&gt;
 的時候一定要加上 &lt;code class="code"&gt;
--quiet&lt;/code&gt;
，因爲默認不加的時候會把
代入了 &lt;code class="code"&gt;
$GH_TOKEN&lt;/code&gt;
 的 URL 顯示出來，從而上面的加密工作就前功盡棄了……&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;根據 &lt;a class="reference external" href="http://docs.travis-ci.com/user/build-lifecycle/"&gt;travis 的文檔&lt;/a&gt;
， after_success 裏寫的步驟只有在 script 裏的全都完全無錯執行完之後纔會執行，這正是我們
push 的條件。目前 after_success 的成功與否不會影響到 build 的狀態。
具體我用的配置見
&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/.travis.yml"&gt;這裏的最新版&lt;/a&gt; 。
在我的 &lt;code class="code"&gt;
make github&lt;/code&gt;
 中
&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/Makefile#L102"&gt;調用了&lt;/a&gt;
&lt;code class="code"&gt;
git push&lt;/code&gt;
 命令，從而執行了 &lt;code class="code"&gt;
make github&lt;/code&gt;
 之後就會自動部署到 github 上。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="web"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id13"&gt;用 Web 編輯並發佈靜態博客&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;經過以上設置之後，一切正常的話，每次對主 repo 推送更新的同時， Travis-CI 就會自動
拉來更新然後編譯並發佈了。可以放置這樣的圖標 &lt;img alt="travisIcon" class="img-responsive no-responsive" src="https://travis-ci.org/farseerfc/farseerfc.svg?branch=master"/&gt; 在項目的 &lt;code class="code"&gt;
Readme.md&lt;/code&gt;

中顯示編譯狀態。&lt;/p&gt;
&lt;p&gt;這樣設置之後的另一個好處就在於可以利用 Github 的 Web 界面編輯文章內容。在 Github 裏
編輯和保存之後會自動作爲一個 commit 提交，所以也會觸發 Travis-CI 的自動編譯。&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="在 Github 的 Web 界面中直接編輯文章內容" class="img-responsive" src="//farseerfc.me/images/travis-edit-github-web.png"/&gt;
&lt;p class="caption"&gt;在 Github 的 Web 界面中直接編輯文章內容&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;以及雖然目前還沒有好用的 Github 的手機客戶端，不過直接用 Android/iPhone 的瀏覽器登錄
github 並編輯文章的可用性也還不錯，所以同樣的方式也可以直接在手機上發佈博文了。&lt;/p&gt;
&lt;p&gt;That is all, happy blogging ~&lt;/p&gt;
&lt;/div&gt;
</content><category term="tech"></category><category term="pelican"></category><category term="github"></category><category term="pages"></category><category term="travis"></category><category term="travis-ci"></category><category term="ubuntu"></category></entry><entry><title>換到 farseerfc.me 域名</title><link href="//farseerfc.me/switch-to-farseerfc-dot-me-domain.html" rel="alternate"></link><published>2015-01-26T23:32:00+09:00</published><updated>2015-01-26T23:32:00+09:00</updated><author><name>farseerfc</name></author><id>tag:farseerfc.me,2015-01-26:/switch-to-farseerfc-dot-me-domain.html</id><summary type="html">&lt;p&gt;上個月就在 &lt;ruby&gt;&lt;rb&gt;狗爹&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;godaddy&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 上買了個自己的域名 &lt;code class="code"&gt;
farseerfc.me&lt;/code&gt;
 準備用在這個
博客上，當時試着轉到過這個域名，發現 &lt;ruby&gt;&lt;rb&gt;自定義域名&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;custom domain&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
只支持 http 不支持 https ，想着還要買自己的證書，於是就扔在了一旁。不用自定義域名的話，
放在 github.io 上是可以用 HTTPS 的。
今天在 &lt;a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn"&gt;#archlinux-cn&lt;/a&gt; 上受大牛 &lt;a class="reference external" href="/links.html#quininer"&gt;quininer&lt;/a&gt; 和 &lt;a class="reference external" href="/links.html#lilydjwg"&gt;lilydjwg&lt;/a&gt; 點播，
發現 cloudflare 有提供
&lt;a class="reference external" href="https://blog.cloudflare.com/introducing-universal-ssl/"&gt;免費的支持 SSL 的 CDN 服務&lt;/a&gt;
趕快去申請了一個，感覺非常讚，於是就換過來了。&lt;/p&gt;
&lt;p&gt;設置的方法按照 &lt;a class="reference external" href="https://me.net.nz/blog/github-pages-secure-with-cloudflare/"&gt;這篇博文&lt;/a&gt;
說的一步步做下來，如它所述，用 CloudFlare …&lt;/p&gt;</summary><content type="html">&lt;p&gt;上個月就在 &lt;ruby&gt;&lt;rb&gt;狗爹&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;godaddy&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 上買了個自己的域名 &lt;code class="code"&gt;
farseerfc.me&lt;/code&gt;
 準備用在這個
博客上，當時試着轉到過這個域名，發現 &lt;ruby&gt;&lt;rb&gt;自定義域名&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;custom domain&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
只支持 http 不支持 https ，想着還要買自己的證書，於是就扔在了一旁。不用自定義域名的話，
放在 github.io 上是可以用 HTTPS 的。
今天在 &lt;a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn"&gt;#archlinux-cn&lt;/a&gt; 上受大牛 &lt;a class="reference external" href="/links.html#quininer"&gt;quininer&lt;/a&gt; 和 &lt;a class="reference external" href="/links.html#lilydjwg"&gt;lilydjwg&lt;/a&gt; 點播，
發現 cloudflare 有提供
&lt;a class="reference external" href="https://blog.cloudflare.com/introducing-universal-ssl/"&gt;免費的支持 SSL 的 CDN 服務&lt;/a&gt;
趕快去申請了一個，感覺非常讚，於是就換過來了。&lt;/p&gt;
&lt;p&gt;設置的方法按照 &lt;a class="reference external" href="https://me.net.nz/blog/github-pages-secure-with-cloudflare/"&gt;這篇博文&lt;/a&gt;
說的一步步做下來，如它所述，用 CloudFlare 的優點如下：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;CDN 加速&lt;/li&gt;
&lt;li&gt;SSL (HTTPS) 加密&lt;/li&gt;
&lt;li&gt;支持 SPDY 協議&lt;/li&gt;
&lt;li&gt;支持 IPv6&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年12月29日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;現在不光支持 SPDY 而且支持 HTTP/2 了。&lt;/p&gt;
&lt;p&gt;然後 &lt;strong&gt;免費賬戶&lt;/strong&gt; 的一些缺點有：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;CloudFlare 和 github.io 之間的數據不是加密的，因爲 github
&lt;ruby&gt;&lt;rb&gt;自定義域名&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;custom domain&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 還不支持使用自己的證書。這也是一開始我沒用
自定義域名的原因嘛，這沒有辦法……&lt;/li&gt;
&lt;li&gt;CloudFlare 給免費賬戶簽名的 SSL 證書比較新，不支持一些老的設備和瀏覽器，比如不支持
老的 XP 系統的 IE 或者 2.x 的 Android。這種情況下沒辦法只能用沒有加密的 HTTP 了。&lt;/li&gt;
&lt;li&gt;不支持 &lt;a class="reference external" href="https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security"&gt;HSTS 頭&lt;/a&gt;
，所以不能從服務器這邊強制瀏覽器用 HTTPS。當然可以放個 javascript 跳轉，
也可以用 &lt;a class="reference external" href="https://www.eff.org/https-everywhere"&gt;HTTPSEverywhere&lt;/a&gt; 這種方案。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年12月29日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;如評論中 &lt;a class="reference external" href="http://farseerfc.me/switch-to-farseerfc-dot-me-domain.html#comment-2015037231"&gt;提到的&lt;/a&gt;
現在支持 HSTS 了。&lt;/p&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;設置步驟&lt;/h2&gt;
&lt;p&gt;基本按照默認的選項下一步就可以了。&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;和那個博主一樣我把 &lt;ruby&gt;&lt;rb&gt;安全級別&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Security profile&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 降到了 Low ，即使是可疑流量也
不會要求輸入 CAPTCHA 。&lt;/li&gt;
&lt;li&gt;把 SSL 方式開在 Flexible SSL，訪客到 CloudFlare 是加密的，而 CloudFlare 到
github.io 是不加密的。&lt;/li&gt;
&lt;li&gt;把 CDN 開到了 CDT+Full Optimization ，可以對訪問加速。由於是完全靜態的博客，沒有
動態變化的內容，所以應該比較安全。&lt;/li&gt;
&lt;li&gt;服務器設置的一步需要將 &lt;ruby&gt;&lt;rb&gt;域名解析服務器&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;DNS nameservers&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 從狗爹的服務器改到
CloudFlare 的，如下圖：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="figure"&gt;
&lt;img alt="更改狗爹的域名服務器" class="img-responsive" src="//farseerfc.me/images/godaddy.png"/&gt;
&lt;p class="caption"&gt;更改狗爹的域名服務器&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;申請好之後就由 CloudFlare 接管域名解析了，接下來在 CloudFlare 的 DNS 設置添加一條
&lt;a class="reference external" href="https://help.github.com/articles/tips-for-configuring-an-a-record-with-your-dns-provider/"&gt;A 類規則指向 github pages 的 IP&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="更改CloudFlare的DNS規則" class="img-responsive" src="//farseerfc.me/images/cloudflaredns.png"/&gt;
&lt;p class="caption"&gt;更改CloudFlare的DNS規則&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;等一切都反映到 DNS 服務器上就設置完成了，接下來給
&lt;a class="reference external" href="https://help.github.com/articles/adding-a-cname-file-to-your-repository/"&gt;farseerfc.github.io push 一個 CNAME 文件&lt;/a&gt;
寫上我的域名就可以了。我用 Makefile 配合我的 pelican 配置做這個：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rmdrafts&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; find &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; -mindepth &lt;span class="m"&gt;1&lt;/span&gt; -not -wholename &lt;span class="s2"&gt;"*/.git*"&lt;/span&gt; -delete&lt;/span&gt;
&lt;span class="code-line"&gt;  rm -rf cache&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;SITEURL&lt;span class="k"&gt;)&lt;/span&gt; &amp;gt; content/static/CNAME&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="k"&gt;$(&lt;/span&gt;PELICAN&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;INPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; -o &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; -s &lt;span class="k"&gt;$(&lt;/span&gt;PUBLISHCONF&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;PELICANOPTS&lt;span class="k"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="k"&gt;$(&lt;/span&gt;MAKE&lt;span class="k"&gt;)&lt;/span&gt; rsthtml&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="nf"&gt;github&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git checkout master&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;  env &lt;span class="nv"&gt;SITEURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"farseerfc.me"&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;MAKE&lt;span class="k"&gt;)&lt;/span&gt; publish&lt;/span&gt;
&lt;span class="code-line"&gt;  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git add . &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -m &lt;span class="s2"&gt;"update"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SITEURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'//'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SITEURL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'localhost:8000'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;STATIC_PATHS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'static'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'uml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images/favicon.ico'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'static/CNAME'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;EXTRA_PATH_METADATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="s1"&gt;'images/favicon.ico'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'favicon.ico'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="s1"&gt;'static/CNAME'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'CNAME'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然後把生成的靜態網站 push 到 github 之後可以從項目設置裏看到域名的變化：&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Github 配置好自定義域名之後的變化" class="img-responsive" src="//farseerfc.me/images/githubdomain.png"/&gt;
&lt;p class="caption"&gt;Github 配置好自定義域名之後的變化&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;最後把Disqus的評論也遷移到新的域名，disqus有方便的遷移嚮導，一直下一步就可以了。&lt;/p&gt;
&lt;p&gt;這樣就一切都設置妥當了。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;致謝&lt;/h2&gt;
&lt;p&gt;最後要感謝提供消息的 &lt;a class="reference external" href="/links.html#quininer"&gt;quininer&lt;/a&gt; 和 &lt;a class="reference external" href="/links.html#lilydjwg"&gt;lilydjwg&lt;/a&gt; ，感謝撰寫設置步驟的
&lt;em&gt;Jonathan J Hunt&lt;/em&gt; ， 感謝 CloudFlare 提供免費 SSL CDN 服務，感謝 Github 提供
方便免費的 Pages 託管。&lt;/p&gt;
&lt;/div&gt;
</content><category term="tech"></category><category term="pelican"></category><category term="domain"></category><category term="cloudflare"></category><category term="github"></category></entry><entry><title>重新設計了 Pelican 的主題與插件</title><link href="//farseerfc.me/redesign-pelican-theme.html" rel="alternate"></link><published>2015-01-25T22:45:00+09:00</published><updated>2015-01-25T22:45:00+09:00</updated><author><name>farseerfc</name></author><id>tag:farseerfc.me,2015-01-25:/redesign-pelican-theme.html</id><summary type="html">
&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月14日更新&lt;/strong&gt;&lt;/div&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id38"&gt;前言: 新天新地，將一切都更新了 &lt;a class="footnote-reference" href="#id37" id="id1"&gt;[1]&lt;/a&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;
&lt;p&gt;不知不覺間放任這邊長草很久了，從上次
&lt;a class="reference external" href="//farseerfc.me/try-pelican.html"&gt;折騰主題&lt;/a&gt; 到現在都快三年了，
而從上次 &lt;a class="reference external" href="//farseerfc.me/marry-me.html"&gt;寫了篇告白信&lt;/a&gt; 到現在也有快兩年了。
這期間曾經把主題配色從 &lt;a class="reference external" href="http://getbootstrap.com/2.3.2/"&gt;Bootstrap 2&lt;/a&gt; 默認的
白底黑字改成了讓眼睛更舒適的黑底白字，也不過是用 drop-in 的配色方案而已，沒有本質上的改進。&lt;/p&gt;
&lt;p&gt;洞中一日世上千載，兩年裏 Bootstrap 已經升上 &lt;a class="reference external" href="http://getbootstrap.com/"&gt;v3.3&lt;/a&gt; ,
而 Pelican 則已經升到 &lt;a class="reference external" href="https://github.com/getpelican/pelican/releases/tag/3.5.0"&gt;3.5&lt;/a&gt; 了。
早就眼饞 Bootstrap 和 Pelican 中的諸多新功能新設計，不過無奈於時間有限只能飽飽眼福。&lt;/p&gt;
&lt;p&gt;近日想寫的東西越積越多，終於下定決心花了前前後後 &lt;strong&gt;兩個月&lt;/strong&gt; 的時間重新設計了一遍
Pelican 的主題，配合一些我覺得有用的插件。於是本博客就變成你們現在看到的樣子了。
（以及本篇博文也用了兩個月的時間寫完，其間還發了幾篇別的短文，算是恢復寫博客的嘗試吧 …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">
&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月14日更新&lt;/strong&gt;&lt;/div&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id38"&gt;前言: 新天新地，將一切都更新了 &lt;a class="footnote-reference" href="#id37" id="id1"&gt;[1]&lt;/a&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;
&lt;p&gt;不知不覺間放任這邊長草很久了，從上次
&lt;a class="reference external" href="//farseerfc.me/try-pelican.html"&gt;折騰主題&lt;/a&gt; 到現在都快三年了，
而從上次 &lt;a class="reference external" href="//farseerfc.me/marry-me.html"&gt;寫了篇告白信&lt;/a&gt; 到現在也有快兩年了。
這期間曾經把主題配色從 &lt;a class="reference external" href="http://getbootstrap.com/2.3.2/"&gt;Bootstrap 2&lt;/a&gt; 默認的
白底黑字改成了讓眼睛更舒適的黑底白字，也不過是用 drop-in 的配色方案而已，沒有本質上的改進。&lt;/p&gt;
&lt;p&gt;洞中一日世上千載，兩年裏 Bootstrap 已經升上 &lt;a class="reference external" href="http://getbootstrap.com/"&gt;v3.3&lt;/a&gt; ,
而 Pelican 則已經升到 &lt;a class="reference external" href="https://github.com/getpelican/pelican/releases/tag/3.5.0"&gt;3.5&lt;/a&gt; 了。
早就眼饞 Bootstrap 和 Pelican 中的諸多新功能新設計，不過無奈於時間有限只能飽飽眼福。&lt;/p&gt;
&lt;p&gt;近日想寫的東西越積越多，終於下定決心花了前前後後 &lt;strong&gt;兩個月&lt;/strong&gt; 的時間重新設計了一遍
Pelican 的主題，配合一些我覺得有用的插件。於是本博客就變成你們現在看到的樣子了。
（以及本篇博文也用了兩個月的時間寫完，其間還發了幾篇別的短文，算是恢復寫博客的嘗試吧。）&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
在邁阿密參加 &lt;a class="reference external" href="http://icsr2015.ipd.kit.edu/"&gt;ICSR 2015&lt;/a&gt; 的時候
拍到的街邊一家叫 Pelican 的旅館&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;img alt="Pelican Hotel" class="img-responsive" src="//farseerfc.me/images/pelican.jpg"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="bootstrap-3"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id39"&gt;Bootstrap 3 的新設計&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;全新的 &lt;ruby&gt;&lt;rb&gt;優先移動設備&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;mobile-first&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; &lt;ruby&gt;&lt;rb&gt;響應式&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;responsive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 設計。
原本Bootstrap 2雖然有響應式設計，
不過諸多細節不能符合我的需求，最終還是得手工 hack &lt;code class="code"&gt;
@media&lt;/code&gt;
 查詢去微調。
現在的 &lt;ruby&gt;&lt;rb&gt;優先移動設備&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;mobile-first&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; &lt;ruby&gt;&lt;rb&gt;響應式&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;responsive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
&lt;ruby&gt;&lt;rb&gt;柵格系統&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;grid system&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 則相對顯得科學很多了，也終於能在手持
設備上看起來舒服一些。諸位可以嘗試改變窗口寬度，或者在不同的手持設備上打開這個
blog ，體驗一下這個頁面在不同顯示器大小中的效果。如果仍有問題歡迎
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/issues"&gt;發 Issue 給我&lt;/a&gt;  。&lt;/li&gt;
&lt;li&gt;科學的 &lt;ruby&gt;&lt;rb&gt;導航欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Navbar&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 。
比 Bootstrap 2 那個科學很多了。無論是 &lt;ruby&gt;&lt;rb&gt;保持&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;sticky&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 在上端還是跟着浮動，
或者像這邊這樣 &lt;a class="reference external" href="http://www.virtuosoft.eu/code/bootstrap-autohidingnavbar/"&gt;自動隱藏&lt;/a&gt; 都很簡單。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多細節參考 &lt;a class="reference external" href="http://getbootstrap.com/"&gt;Bootstrap 3 主頁&lt;/a&gt; 。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="pelican-3-5"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id40"&gt;Pelican 3.5 的新功能&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python 2 和 Python 3 統一代碼：
再沒有惱人的 unicode 相關的問題了。這對 blog 系統來說相當重要啊。
而且還能方便切換 pypy 等不同的解釋器。&lt;/li&gt;
&lt;li&gt;全新的插件系統：非常多功能強大的 &lt;a class="reference external" href="https://github.com/getpelican/pelican-plugins"&gt;插件&lt;/a&gt; 等着你。&lt;/li&gt;
&lt;li&gt;增強了導入系統：嗯總算可以導入我的中文的 wordpress 博客了。（雖然那邊長草更久了……）&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://pelican.readthedocs.org/en/latest/content.html#linking-to-internal-content"&gt;站內鏈接&lt;/a&gt;
：不用 &lt;ruby&gt;&lt;rb&gt;硬編碼&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;hard code&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 目標頁面的鏈接了，可以直接寫源文件的位置然後讓 pelican
處理，這樣能簡化各種 &lt;ruby&gt;&lt;rb&gt;插件&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;plugin&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 和 &lt;ruby&gt;&lt;rb&gt;主題&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;theme&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 的實現。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多細節參考 &lt;a class="reference external" href="http://pelican.readthedocs.org/en/latest/"&gt;Pelican 文檔&lt;/a&gt; 。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id11"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id41"&gt;新的文件夾佈局&lt;/a&gt;&lt;/h3&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
Pelican 的新文件夾佈局&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;pre&gt;&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span style="color:blue;font-weight:bold;"&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:blue;font-weight:bold;"&gt;cache&lt;/span&gt;             生成頁面的 pickle 緩存&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:blue;font-weight:bold;"&gt;content&lt;/span&gt;           讀取的全部內容&lt;/span&gt;
&lt;span class="code-line"&gt;│   ├── &lt;span style="color:blue;font-weight:bold;"&gt;&amp;lt;categories&amp;gt;&lt;/span&gt;      按分類存放的文章&lt;/span&gt;
&lt;span class="code-line"&gt;│   ├── &lt;span style="color:blue;font-weight:bold;"&gt;pages&lt;/span&gt;             像 About 這樣的固定頁面&lt;/span&gt;
&lt;span class="code-line"&gt;│   └── &lt;span style="color:blue;font-weight:bold;"&gt;static&lt;/span&gt;            文章內用到的靜態內容&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:blue;font-weight:bold;"&gt;drafts&lt;/span&gt;            文章的草稿箱&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:green;font-weight:bold;"&gt;Makefile&lt;/span&gt;          生成用的 makefile&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:green;font-weight:bold;"&gt;pelicanconf.py&lt;/span&gt;    測試時用的快速 Pelican 配置&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:green;font-weight:bold;"&gt;publishconf.py&lt;/span&gt;    部署時用的耗時 Pelican 配置&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:teal;font-weight:bold;"&gt;output&lt;/span&gt;          -&amp;gt; &lt;span style="color:blue;font-weight:bold;"&gt;../farseerfc.github.io&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;├── &lt;span style="color:teal;font-weight:bold;"&gt;plugins&lt;/span&gt;         -&amp;gt; &lt;span style="color:blue;font-weight:bold;"&gt;../pelican-plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;└── &lt;span style="color:teal;font-weight:bold;"&gt;theme&lt;/span&gt;           -&amp;gt; &lt;span style="color:blue;font-weight:bold;"&gt;../pelican-bootstrap3&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc.github.com"&gt;之前的博客&lt;/a&gt; 仍然留在
github 上，其中的內容完全搬過來了。開始寫老博客的時候 Pelican 版本較早，沒有形成好的
文件夾佈局，導致生成的文章、使用的模板和撰寫的內容全都混在一起，非常難以管理，
於是趁改版之際用了新的文件夾佈局方式，並分爲 4 個 git repo 分別管理歷史。&lt;/p&gt;
&lt;p&gt;首先是存放 &lt;a class="reference external" href="https://github.com/farseerfc/farseerfc"&gt;總的博客內容的 repo&lt;/a&gt; ，
其佈局是如圖那樣的。這樣將生成的靜態網站和生成網站用的配置啦內容啦分開之後，頓時清晰了很多。&lt;/p&gt;
&lt;p&gt;然後這個內容 repo 中的三個符號鏈接分別指向三個子 repo（沒用 &lt;code class="code"&gt;
git submodule&lt;/code&gt;

管理純粹是因爲偷懶）。 theme 指向
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3"&gt;pelican-bootstrap3&lt;/a&gt;
，是我修改過的 pelican 主題。
plugins 指向 &lt;a class="reference external" href="https://github.com/farseerfc/pelican-plugins"&gt;pelican-plugins&lt;/a&gt;
，由於 plugins 的質量有些參差不齊，其中不少 plugin
都按我的需要做了些許修改，一些是功能改進，另一些則是修bug（比如不少plugin只支持 python 2）。
最後 output 指向
&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc.github.io"&gt;farseerfc.github.io&lt;/a&gt;
也就是發佈的靜態網站啦。&lt;/p&gt;
&lt;p&gt;接下來從 &lt;strong&gt;主題&lt;/strong&gt; 和 &lt;strong&gt;插件&lt;/strong&gt; 兩個方面介紹一下改版的細節。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="material-design-bootstrap-3"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id42"&gt;主題： Material Design 風格的 Bootstrap 3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;上篇 &lt;a class="reference external" href="//farseerfc.me/summarize-material-design-css-framework.html"&gt;博文&lt;/a&gt;
就總結了我爲了這個博客尋找了一堆 CSS 框架，並且最終決定用
&lt;a class="reference external" href="http://fezvrasta.github.io/bootstrap-material-design/"&gt;bootstrap-material-design&lt;/a&gt;
, &lt;a class="reference external" href="https://github.com/DandyDev/pelican-bootstrap3"&gt;DandyDev/pelican-bootstrap3&lt;/a&gt;
和 &lt;a class="reference external" href="http://getbootstrap.com/"&gt;Bootstrap 3&lt;/a&gt; 這三個項目結合的方式實現這個模板的主題。
這三個項目都或多或少經過了我的修改，修改後的項目以 pelican-bootstrap3 爲基礎放在
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3"&gt;這裏&lt;/a&gt; ，包括 &lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/tree/master/static/bootstrap"&gt;Bootstrap3 樣式&lt;/a&gt;
和 &lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/tree/master/static/material"&gt;Material 樣式&lt;/a&gt;。&lt;/p&gt;
&lt;div class="section" id="id16"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id43"&gt;對 Bootstrap 3 的定製&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;由於架構完善，修改 Bootstrap 3 感覺非常簡單。另一方面我在 Web 前端技術上的技能點也不多，
所以修改的地方非常有限，只能按我自己的需求定製而已。&lt;/p&gt;
&lt;div class="section" id="id17"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id44"&gt;響應式設備的大小&lt;/a&gt;&lt;/h4&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
修改了 Bootstrap 3 響應式設備的大小&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;screen-xs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="nt"&gt;320px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;screen-sm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="nt"&gt;598px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  768px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;screen-md&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="nt"&gt;952px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  992px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;screen-lg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="nt"&gt;1350px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 1200px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;screen-xl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="nt"&gt;2030px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;container-sm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;582px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  750px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;container-md&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;930px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  970px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;container-lg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1320px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 1170px; */&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;container-xl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1990px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;首先把 Bootstrap 3 默認適配的幾個 &lt;a class="reference external" href="http://getbootstrap.com/css/#grid"&gt;響應式設備的大小&lt;/a&gt;
改成了我需要的大小。 &lt;code class="code"&gt;
xs&lt;/code&gt;
 和 &lt;code class="code"&gt;
sm&lt;/code&gt;
 的大小分別按照我的手機屏幕 &lt;strong&gt;豎屏&lt;/strong&gt; 和
&lt;strong&gt;橫屏&lt;/strong&gt; 時候的瀏覽器頁面寬度來算， &lt;code class="code"&gt;
md&lt;/code&gt;
 是想兼容 Nexus 7 橫屏 960 的寬度以及
一個常見上網本 1024 的寬度。 &lt;code class="code"&gt;
lg&lt;/code&gt;
 的大小則按照常見的筆記本 1366 寬的屏幕來適配。&lt;/p&gt;
&lt;p&gt;這裏 Bootstrap 3 支持的設備大小的一個問題是，它最多考慮到 1200 像素寬的顯示器，而更寬的
比如 1600、 2048 甚至 2560 像素寬的顯示器現在也並不少見，其結果就是頁面中左右兩側
有很大的空間被浪費掉了。作爲深受這一問題困擾的用戶之一，我用
&lt;a class="reference external" href="http://stackoverflow.com/a/25644266"&gt;這裏介紹的方法&lt;/a&gt;
給 bootstrap 增加了一類「 &lt;ruby&gt;&lt;rb&gt;比大更大&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;bigger than bigger&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 」的
&lt;code class="code"&gt;
xl&lt;/code&gt;
 響應式設備尺寸，寬度設爲支持 2048 像素寬的顯示器，具體的修改反映在
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/master/static/bootstrap/variables.less"&gt;variables.less&lt;/a&gt;
文件裏。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id20"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id45"&gt;根據寬度自動分欄和瀑布式佈局&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;接下來目標是讓主頁的文章列表像 Google+ 主頁那樣根據顯示器寬度自動調整分欄，使得寬度不同的
顯示器上每個分欄的寬度接近。想要達到的效果是，根據上面定義的屏幕寬度尺寸：&lt;/p&gt;
&lt;table border="0" class="table docutils borderless"&gt;
&lt;colgroup&gt;
&lt;col width="26%"/&gt;
&lt;col width="17%"/&gt;
&lt;col width="18%"/&gt;
&lt;col width="39%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;code class="code"&gt;
xs&lt;/code&gt;
 用單欄 &lt;ruby&gt;&lt;rb&gt;流動&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;fluid&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 佈局&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;code class="code"&gt;
sm&lt;/code&gt;
 用上方單欄文章列表、下方雙欄 &lt;ruby&gt;&lt;rb&gt;側邊欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;sidebar&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 固定佈局&lt;/td&gt;
&lt;td&gt;&lt;code class="code"&gt;
md&lt;/code&gt;
 用單欄文章列表、單欄 側邊欄 固定佈局&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="0" class="table first docutils last borderless"&gt;
&lt;colgroup&gt;
&lt;col width="100%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;ruby&gt;&lt;rb&gt;導航欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Navbar&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;側邊欄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;底欄&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;table border="0" class="table first docutils last borderless"&gt;
&lt;colgroup&gt;
&lt;col width="53%"/&gt;
&lt;col width="47%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;導航欄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;側邊欄 1&lt;/td&gt;
&lt;td&gt;側邊欄 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;&lt;ruby&gt;&lt;rb&gt;底欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;footer&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;&lt;table border="0" class="table first docutils last borderless"&gt;
&lt;colgroup&gt;
&lt;col width="53%"/&gt;
&lt;col width="47%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;導航欄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 1&lt;/td&gt;
&lt;td&gt;側邊欄 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 2&lt;/td&gt;
&lt;td&gt;側邊欄 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;&lt;ruby&gt;&lt;rb&gt;底欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;footer&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;&lt;code class="code"&gt;
lg&lt;/code&gt;
 用雙欄文章列表、單欄 側邊欄 固定佈局&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;code class="code"&gt;
xl&lt;/code&gt;
 用三欄文章列表、雙欄 側邊欄 固定佈局&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="2"&gt;&lt;table border="0" class="table first docutils last borderless"&gt;
&lt;colgroup&gt;
&lt;col width="35%"/&gt;
&lt;col width="35%"/&gt;
&lt;col width="31%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;導航欄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 1&lt;/td&gt;
&lt;td&gt;文章 3&lt;/td&gt;
&lt;td&gt;側邊欄 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 2&lt;/td&gt;
&lt;td&gt;文章 4&lt;/td&gt;
&lt;td&gt;側邊欄 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;&lt;ruby&gt;&lt;rb&gt;底欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;footer&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;table border="0" class="table first docutils last borderless"&gt;
&lt;colgroup&gt;
&lt;col width="26%"/&gt;
&lt;col width="26%"/&gt;
&lt;col width="26%"/&gt;
&lt;col width="23%"/&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td colspan="4"&gt;導航欄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 1&lt;/td&gt;
&lt;td&gt;文章 3&lt;/td&gt;
&lt;td&gt;文章 5&lt;/td&gt;
&lt;td&gt;側邊欄 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章 2&lt;/td&gt;
&lt;td&gt;文章 4&lt;/td&gt;
&lt;td&gt;文章 6&lt;/td&gt;
&lt;td&gt;側邊欄 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="4"&gt;&lt;ruby&gt;&lt;rb&gt;底欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;footer&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一開始純粹用 Bootstrap3 的響應式柵格實現這個分欄佈局，結果發現效果不太理想，
因爲文章列表和側邊欄的高度是變化的，會導致柵格間留下大片空白。後來改用
&lt;a class="reference external" href="http://cssdeck.com/labs/pinterest-like-waterfall-design-purely-css"&gt;這裏示範的純CSS瀑布式佈局&lt;/a&gt;
實現文章和側邊欄的佈局，具體的實現代碼在
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/master/static/bootstrap/waterfall.less"&gt;waterfall.less&lt;/a&gt;
，總算達到了想要的佈局了。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id21"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id46"&gt;正文的樣式&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;最最重要的是文章正文的樣式。這裏我想要達到的效果是，在大屏幕上用更大的字號，讓讀者
看起來更舒適，同時在小屏幕上用比較小的字號，最終保證基本上「一行」的文字數接近。這個修改
主要針對 &lt;code class="code"&gt;
.jumbotron&lt;/code&gt;
，
用了 &lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/master/static/bootstrap/jumbotron.less"&gt;不太科學的方式&lt;/a&gt;
代碼太長就不貼全了。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id23"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id47"&gt;一些細微的定製&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;把主題配色改成了現在這樣的淡紫色
&lt;code class="code"&gt;
@brand-primary: darken(#6B5594, 6.5%);&lt;/code&gt;

，配合我的頭像風格， 這個修改只需要一行。
接着刪掉了 &lt;code class="code"&gt;
.btn&lt;/code&gt;
 的 &lt;code class="code"&gt;
white-space: nowrap;&lt;/code&gt;
 讓按鈕的文字可以換行，
這也只是一行修改。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年1月29日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;另外我也不太喜歡 Bootstrap 3 默認在手機上的 &lt;ruby&gt;&lt;rb&gt;摺疊導航欄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;collapsed navbar&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; ，
摺疊之後的操作不夠直觀方便而且依賴 javascript 所以有 bug …… 於是我把它關掉了，
具體方式是在 variables.less 把 &lt;code class="code"&gt;
@grid-float-breakpoint&lt;/code&gt;
 和
&lt;code class="code"&gt;
@grid-float-breakpoint-max&lt;/code&gt;
 都設爲0就可以了。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id24"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id48"&gt;對 bootstrap-material-design 的定製&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;這裏定製的地方不多。原樣式中一個不太科學的做法是所有 &lt;code class="code"&gt;
.btn&lt;/code&gt;
 都強制加上了陰影
效果，這在已經有陰影的環境裏用的話非常礙眼，像是 Win9x 風格的厚重睫毛膏。既然可以單獨
給每個樣式加陰影，於是就把 &lt;code class="code"&gt;
.btn&lt;/code&gt;
 強制的陰影去掉了，只保留鼠標懸停之後強調的陰影。&lt;/p&gt;
&lt;p&gt;其它定製的細節麼就是統一配色風格，修補漏洞錯誤，微調響應式效果而已，這裏不細說。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id25"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id49"&gt;將以上兩者整合在 pelican-bootstrap3 裏&lt;/a&gt;&lt;/h3&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
Pelican 實現顯示源代碼按鈕&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;p&gt;顯示源代碼按鈕借用了 Pelican 配置中自帶的 &lt;code class="code"&gt;
OUTPUT_SOURCES&lt;/code&gt;
 選項將源文件複製到輸出文件夾：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;OUTPUT_SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;OUTPUT_SOURCES_EXTENSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'.rst'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然後在 Makefile 裏用 pygmentize 把所有源代碼文件着色：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;find -iname &lt;span class="s2"&gt;"*.rst"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; parallel -I@  pygmentize -f html -o @.html @&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最後在按鈕按下的時候用 jQuery 載入源代碼：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"$.get('{{SITEURL}}/{{article.slug}}.rst.html', function(data){$('#source-code').html(data)});$('#article-content').toggle();$('#source-content').toggle();"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;雖然難看的 hack 比較多，但是能用！&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;雖說 pelican-bootstrap3 是我 fork 出來的，不過由於我修改的地方實在太多，代碼看來基本上
接近重寫了一份。好在之前有給 pelican 寫 bootstrap 2 主題的經驗，這次修改算得上駕輕就熟。
可以對比一下 &lt;a class="reference external" href="http://dandydev.net/"&gt;上游作者的博客&lt;/a&gt; 和這裏的樣子體會一下感覺。
具體修改過的地方包括：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;套用 bootstrap-material-design 的各個元素樣式。&lt;/li&gt;
&lt;li&gt;在文章列表模板應用上面提到的 Bootstrap 3 的柵格佈局和瀑布式佈局。&lt;/li&gt;
&lt;li&gt;翻譯到多個語言，這裏在後面的 i18n-subsite 插件裏詳述。&lt;/li&gt;
&lt;li&gt;套用後面會介紹到的各種插件。&lt;/li&gt;
&lt;li&gt;統一側邊欄的樣式到一個模板裏。&lt;/li&gt;
&lt;li&gt;添加 Atom 訂閱按鈕和 breadcrumb 條。&lt;/li&gt;
&lt;li&gt;對正文中出現的插圖，添加點擊放大的功能，通過 Bootstrap 的 &lt;code class="code"&gt;
modal&lt;/code&gt;
 實現。&lt;/li&gt;
&lt;li&gt;上面提到的用 &lt;a class="reference external" href="http://www.virtuosoft.eu/code/bootstrap-autohidingnavbar/"&gt;這個bootstrap插件&lt;/a&gt;
讓導航欄自動隱藏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顯示源代碼按鈕&lt;/strong&gt; ，也就是每篇文章信息欄中的
&lt;button class="btn btn-primary"&gt;&lt;i class="fa fa-code"&gt;&lt;/i&gt;&lt;/button&gt; 按鈕。&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="pelican-restructuredtext"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id50"&gt;插件: 發揮 Pelican 和 reStructuredText 的優勢&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;先列舉一下我目前用到的所有插件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PLUGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"i18n_subsites"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s2"&gt;"plantuml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s2"&gt;"youku"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s2"&gt;"youtube"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'tipue_search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'neighbors'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'series'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'bootstrapify'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'twitter_bootstrap_rst_directives'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s2"&gt;"render_math"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'extract_toc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;           &lt;span class="s1"&gt;'summary'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;嗯其實不算多。接下來逐一介紹一下這些各具特色的插件。&lt;/p&gt;
&lt;div class="section" id="i18n-subsites"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id51"&gt;i18n-subsites&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;這個插件的目的是創建 &lt;ruby&gt;&lt;rb&gt;國際化&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;internationalization&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
&lt;ruby&gt;&lt;rb&gt;子站&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;subsite&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 。&lt;/p&gt;
&lt;p&gt;之前介紹 Pelican 配置的時候就提到過，
原本的 Pelican 就支持一篇文章用多種語言書寫，有 &lt;code class="code"&gt;
lang&lt;/code&gt;
 屬性註明這篇文章使用的
語言，以及 &lt;code class="code"&gt;
slug&lt;/code&gt;
 屬性註明多語言的翻譯之間的關聯，換句話說同一篇文章的多個語言
版本應該有相同的 &lt;code class="code"&gt;
slug&lt;/code&gt;
 和不同的 &lt;code class="code"&gt;
lang&lt;/code&gt;
。然後原本 Pelican 裏對多語言的
實現方式是，首先有一個 &lt;strong&gt;主語言&lt;/strong&gt; 是模板和大部分文章採用的語言，文章列表中會優先列出
用 &lt;strong&gt;主語言&lt;/strong&gt; 撰寫的文章，然後從 &lt;strong&gt;主語言&lt;/strong&gt; 的文章鏈接到別的翻譯版本。
很多博客系統和CMS對多語言的支持都是這樣的，這種處理方式的缺點也顯而易見：作爲 &lt;strong&gt;主語言&lt;/strong&gt;
的語言必須足夠通用，纔能讓進來的人找到合適的翻譯版本，所以通常 &lt;strong&gt;主語言&lt;/strong&gt; 都是英語。&lt;/p&gt;
&lt;p&gt;而這個插件做的事情描述起來很簡單：將文章按語言屬性分到多個子站，每個子站獨立放在各自的文件夾。
比如主站是 &lt;a class="reference external" href="https://farseerfc.github.io/"&gt;https://farseerfc.github.io/&lt;/a&gt; 的話，那麼英語的子站就可以是
&lt;a class="reference external" href="https://farseerfc.github.io/en/"&gt;https://farseerfc.github.io/en/&lt;/a&gt; 。
然後分別對多個子站生成靜態頁面。具體的實現方式是對 pelican 的頁面生成步驟做了拆分：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;pelican 按正常情況讀入文章，生成元信息。&lt;/li&gt;
&lt;li&gt;i18n-subsites 針對每個語言，覆蓋掉 pelican 的一些選項設置比如路徑和 URL ，
分別調用 pelican 的頁面生成器按模板生成文章。&lt;/li&gt;
&lt;li&gt;對共用的靜態內容比如模板的 js 和 css 文件，只在主站中生成，子站中的相應鏈接全部鏈回主站。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;雖然描述起來簡單，但是這個插件可以說最大化利用了 Pelican 的插件系統，實現細節相對比較
複雜，大概是我用的這些插件裏面最複雜的了。不誇張的說 Pelican 3.4 支持的新插件 API 和
站內鏈接功能基本上就是爲了配合這個插件的。至於具體它會覆蓋哪些 Pelican 的配置，請參閱它的
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-plugins/blob/master/i18n_subsites/README.rst"&gt;README.md文件&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;按內容拆分多語言子站的做法只解決了問題的一半，還留下另一半的問題，也即對模板的翻譯。
對這個問題， i18n-subsites 提供了兩套方案供選擇：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;用覆蓋配置路徑的方式讓每個子站套用不同的模板。這配置起來簡單，但是對模板維護起來有點困難。&lt;/li&gt;
&lt;li&gt;用 jinja2 的 i18n 插件，配合 Python 的 gettext 庫實現內容翻譯。這個方案
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-plugins/blob/master/i18n_subsites/localizing_using_jinja2.rst"&gt;配置起來比較複雜&lt;/a&gt; ，但是配置好之後用起來就很方便了。
只是要記得每次修改了模板都要更新翻譯，處理 *.po 和 *.mo 文件等等瑣碎事宜。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這裏我用 jinja2 的 i18n 插件的方式實現了模板的翻譯，
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/tree/master/translations"&gt;各個語言的翻譯在這裏&lt;/a&gt; ，
然後用 &lt;a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/master/SConstruct"&gt;這裏的 SCons 腳本&lt;/a&gt;
根據內容是否變化自動更新 po 和 mo 文件。&lt;/p&gt;
&lt;p&gt;配置好這一套方案之後，還要注意在模板和文章中處理好鏈接。用 Pelican 3.4 之後推薦的
新的文章間鏈接的寫法以及將 &lt;code class="code"&gt;
SITEURL&lt;/code&gt;
 設置爲實際 URL 並且關閉 &lt;code class="code"&gt;
RELATIVE_URLS&lt;/code&gt;

之後，應該就不會出沒什麼問題了（可能還要考慮使用的模板和插件的兼容性，大部分都是寫死了 URL 的問題）。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="plantuml"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id52"&gt;plantuml&lt;/a&gt;&lt;/h3&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
嵌入 PlantUML 的示例&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;img alt="uml diagram" class="uml img-responsive" src="//farseerfc.me/uml/8e4b1ee3.png"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://plantuml.sourceforge.net/"&gt;PlantUML&lt;/a&gt; 是一個Java實現的，
用接近文字描述的語言繪製 UML 圖或者 GUI 界面圖的工具，非常適合嵌入在
Markdown、 reStructuredText、 AsciiDoc 等這種輕量級標記語言裏。
然後麼這個 plantuml 插件就是定義了一個新的 reStructuredText
&lt;ruby&gt;&lt;rb&gt;指示符&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;directive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; &lt;code class="code"&gt;
.. uml::&lt;/code&gt;
，把嵌入的內容提取出來調用 plantuml 命令處理
成圖像然後再插入到文章中。&lt;/p&gt;
&lt;p&gt;比如示例裏的這個 UML 圖就是用這樣一段簡單的文字描述生成的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;uml&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    Object &amp;lt;|-- ArrayList&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    Object : equals()&lt;/span&gt;
&lt;span class="code-line"&gt;    ArrayList : Object[] elementData&lt;/span&gt;
&lt;span class="code-line"&gt;    ArrayList : size()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;實際用起來這個插件實現上稍微有點小問題：首先它只支持 python2，所以我把它改寫成了 python
2 和 3 都通用的語法；其次它原本輸出的文件夾似乎會被 pelican 刪掉，所以把它改了個位置；
然後它輸出的 URL 也和 i18n-subsites 插件間有不兼容的問題，也順帶修掉了。
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-plugins/tree/master/plantuml"&gt;修改之後的代碼在這裏&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年1月30日更新&lt;/strong&gt;&lt;/div&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
嵌入 Ditaa 的示例&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;img alt="ditaa diagram" class="ditaa img-responsive" src="//farseerfc.me/uml/973a8424.png"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;plantuml 是繪製UML的，除此之外還有一個類似的工具是繪製一般的 &lt;ruby&gt;&lt;rb&gt;流程圖&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;diagram&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;
的，叫 &lt;a class="reference external" href="http://ditaa.sourceforge.net/"&gt;ditaa&lt;/a&gt; ，和 plantuml 非常像，也比較像
reStructuredText 的表格。
於是我也照貓畫虎實現了一個 ditaa 的 &lt;ruby&gt;&lt;rb&gt;指示符&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;directive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; ，用起來類似這樣：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;ditaa&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;                       +-------------+&lt;/span&gt;
&lt;span class="code-line"&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;   ditaa     |-------+&lt;/span&gt;
&lt;span class="code-line"&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;  Diagram    |       |&lt;/span&gt;
&lt;span class="code-line"&gt;                       +-------------+       | PNG out&lt;/span&gt;
&lt;span class="code-line"&gt;                           ^                 |&lt;/span&gt;
&lt;span class="code-line"&gt;                           &lt;span class="o"&gt;|&lt;/span&gt; ditaa in        |&lt;/span&gt;
&lt;span class="code-line"&gt;                           &lt;span class="o"&gt;|&lt;/span&gt;                 v&lt;/span&gt;
&lt;span class="code-line"&gt;     +--------+   +--------+----+    /----------------\&lt;/span&gt;
&lt;span class="code-line"&gt;     &lt;span class="o"&gt;|&lt;/span&gt;        | --+   Pelican   +--&amp;gt; |                |&lt;/span&gt;
&lt;span class="code-line"&gt;     &lt;span class="o"&gt;|&lt;/span&gt;  Text  |   +-------------+    | Beautiful Blog |&lt;/span&gt;
&lt;span class="code-line"&gt;     |Document|   |   !magic!   |    |                |&lt;/span&gt;
&lt;span class="code-line"&gt;     &lt;span class="o"&gt;|&lt;/span&gt;     {d}|   |             |    |                |&lt;/span&gt;
&lt;span class="code-line"&gt;     +---+----+   +-------------+    \----------------/&lt;/span&gt;
&lt;span class="code-line"&gt;         :                                   ^&lt;/span&gt;
&lt;span class="code-line"&gt;         &lt;span class="o"&gt;|&lt;/span&gt;          Lots of work             |&lt;/span&gt;
&lt;span class="code-line"&gt;         +-----------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="render-math"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id53"&gt;render-math&lt;/a&gt;&lt;/h3&gt;
&lt;div class="panel panel-default"&gt;
&lt;div class="panel-heading"&gt;
嵌入公式的示例&lt;/div&gt;
&lt;div class="panel-body"&gt;
&lt;p&gt;示範行內公式 &lt;span class="math"&gt;\(A_\text{c} = (\pi/4) d^2\)&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;整行公式&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\alpha{}_t(i) = P(O_1, O_2, \ldots  O_t, q_t = S_i \lambda{})
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;這個插件提供在 reStructuredText 中用 LaTeX 語法插入數學公式的能力，定義了
&lt;code class="code"&gt;
:math:&lt;/code&gt;
&lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 和 &lt;code class="code"&gt;
.. math::&lt;/code&gt;
&lt;ruby&gt;&lt;rb&gt;指示符&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;directive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 。
實際工作的渲染庫當然是大名鼎鼎的 &lt;a class="reference external" href="http://www.mathjax.org/"&gt;MathJax&lt;/a&gt; ，這個插件
會用 MathJax 的 CDN 載入，所以也沒有額外的依賴文件。（只是不知道是否會被國內牆掉，
如果公式顯示不正常請 &lt;strong&gt;務必&lt;/strong&gt; 告訴我。）&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="youtube-youku"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id54"&gt;youtube 和 youku&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;顧名思義，這兩個插件分別實現嵌入 youtube 和 youku 視頻。其中 youtube 是原本就有的插件，
youku 是我照貓畫虎抄的。
之前寫了一篇
&lt;a class="reference external" href="//farseerfc.me/jumping-kde5-plasma-activities-button.html"&gt;KDE5 Plasma 之跳動賣萌的活動按鈕&lt;/a&gt;
用到了這兩個插件。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tipue-search"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id55"&gt;tipue_search&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.tipue.com/search/"&gt;Tipue search&lt;/a&gt; 是一個非常有意思也很強大的搜索工具，
通過 jQuery 實現靜態博客的站內搜索功能。實現方式是，它需要你寫一個 json 文件，包含
整個網站的 &lt;strong&gt;全部&lt;/strong&gt; 文章的標題和文字內容，然後在搜索的時候讀入這個 json 做搜索（是不是有點耍賴）。
雖然聽起來會有性能問題，但是應用在小型的靜態博客上效果意外很不錯，比如本站的所有文章內容
放在一起的 json 也只有 300KiB 左右。&lt;/p&gt;
&lt;p&gt;這個插件就是自動在 pelican 輸出完全部靜態網頁之後，調用 beautifulsoup4 從所有網頁中抽取出
純文本，產生這個 json 給 Tipue 用。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="neighbors-series"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id56"&gt;neighbors 和 series&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;這兩個插件比較類似也都比較簡單， neighbors 提供一篇文章的前後文章信息，
在主題模板裏可以用來製作 &lt;strong&gt;上一篇&lt;/strong&gt; 和 &lt;strong&gt;下一篇&lt;/strong&gt; 按鈕。
series 提供將多篇文章歸類爲一個 &lt;strong&gt;系列&lt;/strong&gt; 的支持，當然也需要在
主題模板中定義顯示「文章系列」的列表。這兩個插件的效果都能在本文末尾，評論區上方的部分看到。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bootstrapify-twitter-bootstrap-rst-directives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id57"&gt;bootstrapify 和 twitter_bootstrap_rst_directives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;這兩個插件讓文章的 &lt;strong&gt;正文&lt;/strong&gt; 套用上 Bootstrap 的樣式。&lt;/p&gt;
&lt;p&gt;bootstrapify 這個插件實現得比較簡單，用 beautifulsoup4 在靜態網頁的結果裏面過濾元素，
對 &lt;code class="code"&gt;
table&lt;/code&gt;
 , &lt;code class="code"&gt;
img&lt;/code&gt;
 , &lt;code class="code"&gt;
embed&lt;/code&gt;
 , &lt;code class="code"&gt;
iframe&lt;/code&gt;
 ,
&lt;code class="code"&gt;
video&lt;/code&gt;
 , &lt;code class="code"&gt;
object&lt;/code&gt;
 這幾個標籤套用上
&lt;a class="reference external" href="http://getbootstrap.com/components/#responsive-embed"&gt;響應式嵌入對象的類&lt;/a&gt;
讓他們更美觀。&lt;/p&gt;
&lt;p&gt;twitter_bootstrap_rst_directives 這個插件則是增加了幾個 reStructuredText 的
&lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 和 &lt;ruby&gt;&lt;rb&gt;指示符&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;directive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 。
它實現的 &lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 包括：
用 &lt;code class="code"&gt;
:kbd:&lt;/code&gt;
 實現如 &lt;kbd class="kbd"&gt;
Ctrl+C&lt;/kbd&gt;
 這樣的鍵盤快捷鍵，
用 &lt;code class="code"&gt;
:code:&lt;/code&gt;
 嵌入代碼片段，用 &lt;code class="code"&gt;
:glyph:&lt;/code&gt;
 嵌入字符圖標。
它實現的 &lt;ruby&gt;&lt;rb&gt;指示符&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;directive&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 包括：
&lt;a class="reference external" href="http://getbootstrap.com/components/#labels"&gt;labels 行內標籤&lt;/a&gt; ，
&lt;a class="reference external" href="http://getbootstrap.com/components/#alerts"&gt;alerts 提示段落&lt;/a&gt; ，
&lt;a class="reference external" href="http://getbootstrap.com/components/#panels"&gt;panels 嵌入面板&lt;/a&gt; ，
以及還有一個 &lt;a class="reference external" href="http://getbootstrap.com/components/#media"&gt;media 混排圖標&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;對其中的 &lt;code class="code"&gt;
panel&lt;/code&gt;
 我改寫了它在文章正文中的樣式，在 &lt;code class="code"&gt;
lg&lt;/code&gt;
 或者 &lt;code class="code"&gt;
xl&lt;/code&gt;

的屏幕寬度下，分別用 &lt;span class="math"&gt;\(\frac{1}{2}\)&lt;/span&gt; 和 &lt;span class="math"&gt;\(\frac{1}{3}\)&lt;/span&gt; 大小的嵌入面板，
簡單實現和正文文字的圖文混排。&lt;/p&gt;
&lt;p&gt;除此以外我還在 twitter_bootstrap_rst_directives 這個插件裏套用它的框架實現了兩個額外
的 &lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; ， 分別是 &lt;code class="code"&gt;
:ruby:&lt;/code&gt;
 ：通過 html5 的 &lt;code class="code"&gt;
&amp;lt;ruby&amp;gt;&lt;/code&gt;

標籤實現文字上方的注音（firefox下
&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=33339"&gt;不支持&lt;/a&gt;
，會使用文字後的括號顯示）， 以及 &lt;code class="code"&gt;
:html:&lt;/code&gt;
 ：在
行內插入 &lt;ruby&gt;&lt;rb&gt;裸&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;raw&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; html 標籤（這屬於 Markdown 的基本功能，在 reStructuredText
這邊由於要考慮多種輸出格式於是就比較麻煩了）。這兩個 &lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 的
&lt;a class="reference external" href="https://github.com/farseerfc/pelican-plugins/blob/master/twitter_bootstrap_rst_directives/bootstrap_rst_directives.py#L140"&gt;實現代碼在這裏&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月3日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;今天又在 twitter_bootstrap_rst_directives 裏增加了兩個 &lt;ruby&gt;&lt;rb&gt;行內角色&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;role&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 。
一個是 &lt;code class="code"&gt;
:twi:&lt;/code&gt;
 用來寫 twitter 用戶的鏈接，比如 &lt;a class="reference external" href="//twitter.com/farseerfc"&gt;@farseerfc&lt;/a&gt; ，另一個是
&lt;code class="code"&gt;
:irc:&lt;/code&gt;
 用來指向 freenode 的 channel ，比如 &lt;a class="reference external" href="//webchat.freenode.net/?channels=yssyd3"&gt;#yssyd3&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年2月14日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;今天增加了 &lt;code class="code"&gt;
.. friend::&lt;/code&gt;
 用來寫好友鏈接，以及 &lt;code class="code"&gt;
fref&lt;/code&gt;
 用來引用好友，
比如 &lt;a class="reference external" href="/links.html#lqymgt"&gt;LQYMGT&lt;/a&gt; 這樣。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="extract-toc-summary"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id58"&gt;extract_toc 和 summary&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最後是這兩個有點「名不副實」的插件。&lt;/p&gt;
&lt;p&gt;reStructuredText 原本就有自動生成
&lt;ruby&gt;&lt;rb&gt;目錄&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;toc&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 的功能，用起來也非常簡單，只需要在想要插入目錄的地方寫一行
&lt;code class="code"&gt;
.. contents::&lt;/code&gt;
 ，剩下的都由 docutils 自動生成了。
只是當然這樣生成的目錄肯定會插入在文章的正文裏，而 extract_toc 這個插件的作用就是簡單地
把這個目錄抽取出來，讓模板能在別的地方放置這個目錄。比如我這裏就把目錄放在了一個
&lt;code class="code"&gt;
panel&lt;/code&gt;
 裏。&lt;/p&gt;
&lt;p&gt;然後 Pelican 也原本就有從文章中抽取 &lt;ruby&gt;&lt;rb&gt;總結&lt;/rb&gt;&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;summary&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; 顯示在文章列表的功能。
Pelican 原始的實現似乎是按照文字數抽取前半段，不總是適合作爲總結。 於是這個 summary
插件的作用其實是允許在正文中以特殊的註釋的方式標註哪些部分應該被抽出來作爲總結。
summary 這個插件原本的實現只允許抽取一段文字，我又對它的實現做了少許擴充，允許標註多段
文字合併起來作爲總結。&lt;/p&gt;
&lt;div class="label label-warning"&gt;
&lt;strong&gt;2015年1月29日更新&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;今天在 extract_toc 插件的幫助下，在側邊欄裏放了一個 Bootstrap affix 的目錄，
它保持在頁面的右側位置不變，方便導航到文章的各個地方。具體實現方法除了 Bootstrap 3 的
&lt;a class="reference external" href="http://getbootstrap.com/javascript/#affix"&gt;Affix 文檔&lt;/a&gt; ，還參考了
&lt;a class="reference external" href="http://tutsme-webdesign.info/bootstrap-3-affix/"&gt;這篇更詳細的說明&lt;/a&gt; 。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id36"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id59"&gt;結語&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;這個博客的配置都可以在
&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/pelicanconf.py"&gt;github 上找到&lt;/a&gt;
，包括用來
&lt;a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/Makefile"&gt;自動生成整個博客的 Makefile&lt;/a&gt;
，由於比較長，這裏就不再貼了。&lt;/p&gt;
&lt;p&gt;折騰這個主題前後歷時兩個月，期間學會了不少東西，也算是不錯的收穫吧。
現在既然基礎打好了，接下來就要開始多寫博客了。（希望拖延症不會再犯……）&lt;/p&gt;
&lt;p&gt;最近發現除了我的博客之外還有一個網站
&lt;a class="reference external" href="http://www.kansaslinuxfest.us/"&gt;Kansas Linux Fest&lt;/a&gt; fork
了我的主題，不過他們用了我修改的早期版本，還是原本的 Bootstrap 3 和
bootstrap-material-design 樣式。自己草草修改的東西被別人用到果然還是有點小激動呢，
以及接下來不能馬馬虎虎地寫 commit 消息了。&lt;/p&gt;
&lt;table border="0" class="docutils table footnote" frame="void" id="id37" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;賽65:17「看哪！我造新天新地」啟21:5「我將一切都更新了。」&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    var location_protocol = (false) ? 'https' : document.location.protocol;
    if (location_protocol !== 'http' &amp;&amp; location_protocol !== 'https') location_protocol = 'https:';
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = location_protocol + '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="tech"></category><category term="python"></category><category term="pelican"></category><category term="bootstrap"></category><category term="material"></category><category term="subsite"></category></entry><entry><title>嘗試一下 Pelican</title><link href="//farseerfc.me/try-pelican.html" rel="alternate"></link><published>2012-02-24T17:33:00+09:00</published><updated>2012-02-24T17:33:00+09:00</updated><author><name>farseerfc</name></author><id>tag:farseerfc.me,2012-02-24:/try-pelican.html</id><summary type="html">&lt;p&gt;似乎一夜之間所有的
&lt;a class="reference external" href="http://blog.yxwang.me/2011/11/migrated-to-octopress/"&gt;極客們&lt;/a&gt;
&lt;a class="reference external" href="http://xoyo.name/2012/02/migrate-to-octopress/"&gt;都&lt;/a&gt;
&lt;a class="reference external" href="http://blog.xdite.net/posts/2011/10/07/what-is-octopress/"&gt;有了&lt;/a&gt;
&lt;a class="reference external" href="http://www.yangzhiping.com/tech/octopress.html"&gt;自己&lt;/a&gt;
的 &lt;a class="reference external" href="http://pages.github.com/#user__organization_pages"&gt;Github主頁&lt;/a&gt;
和 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 博客。就像所有人在他們的博客中指出的，靜態博客的確比傳統的WordPress方式具有更多優勢。 自從看到這些
我就一直在想着自己搭一個 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;但是似乎 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 不適合我&lt;/h2&gt;
&lt;p&gt;一上手就被 &lt;a class="reference external" href="http://octopress.org/docs/setup/"&gt;Octopress的搭建步驟&lt;/a&gt; 煩到了。 &lt;a class="reference external" href="http://beginrescueend.com/"&gt;RVM&lt;/a&gt; 是什麼？ &lt;a class="reference external" href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; 又是什麼？
看來 Ruby 社區的快節奏發展已經超過了我的想象，他們似乎需要一套發行版管理器來調和不同版本之間的 Ruby 的兼容性問題。
雖然同樣的兼容性問題在 Python 社區也有 &lt;a class="footnote-reference" href="#id10" id="id8"&gt;[1]&lt;/a&gt; ，不過總覺得 Python 至少還沒到需要一個發行版管理器的程度 &lt;a class="footnote-reference" href="#id11" id="id9"&gt;[2]&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;真正的問題是我手上還沒有一個可以讓我隨便玩的 Linux 環境（真的想要……）。 而無論是 &lt;a class="reference external" href="http://beginrescueend.com/"&gt;RVM&lt;/a&gt; 還是 &lt;a class="reference external" href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; 似乎都只支持 Unix/Linux …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;似乎一夜之間所有的
&lt;a class="reference external" href="http://blog.yxwang.me/2011/11/migrated-to-octopress/"&gt;極客們&lt;/a&gt;
&lt;a class="reference external" href="http://xoyo.name/2012/02/migrate-to-octopress/"&gt;都&lt;/a&gt;
&lt;a class="reference external" href="http://blog.xdite.net/posts/2011/10/07/what-is-octopress/"&gt;有了&lt;/a&gt;
&lt;a class="reference external" href="http://www.yangzhiping.com/tech/octopress.html"&gt;自己&lt;/a&gt;
的 &lt;a class="reference external" href="http://pages.github.com/#user__organization_pages"&gt;Github主頁&lt;/a&gt;
和 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 博客。就像所有人在他們的博客中指出的，靜態博客的確比傳統的WordPress方式具有更多優勢。 自從看到這些
我就一直在想着自己搭一個 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 。&lt;/p&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;但是似乎 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 不適合我&lt;/h2&gt;
&lt;p&gt;一上手就被 &lt;a class="reference external" href="http://octopress.org/docs/setup/"&gt;Octopress的搭建步驟&lt;/a&gt; 煩到了。 &lt;a class="reference external" href="http://beginrescueend.com/"&gt;RVM&lt;/a&gt; 是什麼？ &lt;a class="reference external" href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; 又是什麼？
看來 Ruby 社區的快節奏發展已經超過了我的想象，他們似乎需要一套發行版管理器來調和不同版本之間的 Ruby 的兼容性問題。
雖然同樣的兼容性問題在 Python 社區也有 &lt;a class="footnote-reference" href="#id10" id="id8"&gt;[1]&lt;/a&gt; ，不過總覺得 Python 至少還沒到需要一個發行版管理器的程度 &lt;a class="footnote-reference" href="#id11" id="id9"&gt;[2]&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;真正的問題是我手上還沒有一個可以讓我隨便玩的 Linux 環境（真的想要……）。 而無論是 &lt;a class="reference external" href="http://beginrescueend.com/"&gt;RVM&lt;/a&gt; 還是 &lt;a class="reference external" href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; 似乎都只支持 Unix/Linux/MacOSX 。 身爲極客就註定不能用 Windows 麼？（或許是的……）。&lt;/p&gt;
&lt;p&gt;剩下的問題就是 Ruby 和 Python 兩大陣營的對立問題了。我不熟悉 &lt;a class="reference external" href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; ， 相對來說比較喜歡 &lt;a class="reference external" href="http://docutils.sourceforge.net/rst.html"&gt;ReST&lt;/a&gt; 。 似乎無論哪邊都要
依賴 &lt;a class="reference external" href="http://pygments.org/"&gt;Pygments&lt;/a&gt; 作爲代碼着色器，那麼其實 Rubyist 也至少需要安裝 Python 。 我傾向於不依賴任何 Ruby 組件，最好沒有 C 擴展
的純 Python 實現。&lt;/p&gt;
&lt;p&gt;於是我開始在 Github 上找 Python 的靜態博客引擎。 &lt;a class="reference external" href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; 的作者 &lt;a class="reference external" href="https://github.com/mitsuhiko"&gt;mitsuhiko&lt;/a&gt; 寫的 &lt;a class="reference external" href="https://github.com/mitsuhiko/rstblog"&gt;rstblog&lt;/a&gt; 看起來不錯，不過似乎沒有多少人在用。 &lt;a class="reference external" href="http://ringce.com/hyde"&gt;Hyde&lt;/a&gt; 似乎很完善，不過默認的標記語言是 MarkDown ， 又依賴於幾個 Ruby 組建，而且官方網站的設計實在太前衛。 最終我看到了 &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 。&lt;/p&gt;
&lt;table border="0" class="docutils table footnote" frame="void" id="id10" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id8"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;比如 Python 2.x 與 3.x 之間看似難以跨越的鴻溝，以及 &lt;a class="reference external" href="http://pypy.org/"&gt;PyPy&lt;/a&gt; 、 &lt;a class="reference external" href="http://python.org/"&gt;CPython&lt;/a&gt; 、 &lt;a class="reference external" href="http://www.stackless.com/"&gt;Stackless&lt;/a&gt; 、 &lt;a class="reference external" href="http://cython.org/"&gt;Cython&lt;/a&gt; 等各個實現之間的微妙差別。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table border="0" class="docutils table footnote" frame="void" id="id11" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id9"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;是的，我們有 &lt;a class="reference external" href="http://packages.python.org/distribute/easy_install.html"&gt;easy_install&lt;/a&gt; ，我們有 &lt;a class="reference external" href="http://www.pip-installer.org/en/latest/index.html"&gt;pip&lt;/a&gt; ， 不過這些都是包管理器，都是裝好特定的Python實現之後的事情。 Python實現本身還不需要包管理器來管理。 Python 的版本問題基本上也只需要 &lt;a class="reference external" href="http://docs.python.org/release/3.0.1/library/2to3.html"&gt;2to3.py&lt;/a&gt; 和 &lt;a class="reference external" href="http://www.startcodon.com/wordpress/?cat=8"&gt;3to2.py&lt;/a&gt; 這樣的輕量級轉換器就可以了，你不需要爲了安裝多個軟件而在硬盤裏留下多個不同版本的 Python 。 如果爲了引用的穩定性，你可以用 &lt;a class="reference external" href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; ，不過這又是另一回事情了。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id12"&gt;
&lt;h2&gt;那麼就 &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 吧&lt;/h2&gt;
&lt;p&gt;對我而言， &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 相比於 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 有幾個好處：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;純 Python 實現。 這意味着我可以換用任何 Python 解釋器而不必擔心兼容性問題。比如我就換成了 &lt;a class="reference external" href="http://pypy.org/"&gt;PyPy&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;多語言支持。因爲 &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 的作者似乎是個法國人。不過這個似乎大部分人不需要…… 我是想儘量把一篇博客寫成三種語言作爲鍛鍊吧。&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://docutils.sourceforge.net/rst.html"&gt;ReST&lt;/a&gt; 。這樣我就可以用 &lt;a class="reference external" href="http://webpages.charter.net/edreamleo/front.html"&gt;Leo&lt;/a&gt; 的 @auto-rst 直接寫 ReST了。簡單方便快捷有效。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;不過似乎 &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 的關注度不如 &lt;a class="reference external" href="http://octopress.org/"&gt;Octopress&lt;/a&gt; 那麼高，現在一些部分還有細微的問題：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;pelican-import 從 WordPress 導入的時候對中文、日文的支持似乎很成問題。&lt;/li&gt;
&lt;li&gt;日期格式、時區、字符集、和多語言功能的結合度還不夠。  &lt;strong&gt;我在嘗試改善它。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;模板還不夠豐富。&lt;/li&gt;
&lt;li&gt;插件也不夠多……&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;希望這麼優秀的工具能夠受到更多關注，以上這些問題都是增加關注度之後很快就能解決的問題。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="settings-py"&gt;
&lt;h2&gt;我的設置 settings.py&lt;/h2&gt;
&lt;p&gt;安裝 &lt;a class="reference external" href="http://pelican.notmyidea.org/en/latest/"&gt;Pelican&lt;/a&gt; 很容易，一句話就夠了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; pip install pelican&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然後把文章寫成ReST的格式，放在`pages`文件夾裏面。(重新)生成只要：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; pelican -s settings.py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上傳到 Github:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; git commit -am &lt;span class="s2"&gt;"Commit message"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; git push&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;就這麼簡單。附上我的配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="code-line"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;TIMEZONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Asia/Tokyo'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;DATE_FORMATS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="s1"&gt;'en'&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="s1"&gt;'usa'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt; %b %Y'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="s1"&gt;'zh'&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="s1"&gt;'chs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;    &lt;span class="s1"&gt;'jp'&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="s1"&gt;'jpn'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'%Y/%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt; (&lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s1"&gt;)'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="c1"&gt;# windows locale: http://msdn.microsoft.com/en-us/library/cdax410z%28VS.71%29.aspx&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;LOCALE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usa'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'chs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'jpn'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# windows&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="s1"&gt;'en_US'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'zh_CN'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ja_JP'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Unix/Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;DEFAULT_LANG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'zh'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;SITENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Farseerfc Blog'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;AUTHOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Jiachen Yang'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;DISQUS_SITENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'farseerfcgithub'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;GITHUB_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/farseerfc'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;SITEURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'http://farseerfc.github.com'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;TAG_FEED&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'feeds/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;.atom.xml'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;SOCIAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;'twitter'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://twitter.com/farseerfc'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'github'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/farseerfc'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'facebook'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://www.facebook.com/farseerfc'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'weibo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://weibo.com/farseerfc'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'renren'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://www.renren.com/farseer'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;          &lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;TWITTER_USERNAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'farseerfc'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'notmyidea'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;CSS_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"wide.css"&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;DEFAULT_CATEGORY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Others'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;OUTPUT_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;/span&gt;
&lt;span class="code-line"&gt;&lt;span class="n"&gt;PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="tech"></category><category term="python"></category><category term="pelican"></category></entry></feed>