大家好, 我回來了
當你看到這一篇時, 你已經來到全新的 “笨鳥慢飛”. 是的, 多年傳統, 全新感受, 本部落格將以全新的面貌繼續為大家服務.
過去這幾年, 我們家三個部落格的網站都跑在一台 HP Mini-Note 上. 而且不是直接跑, 是掛在一個 VMWare 的 VM 裡跑. 從 2008 年到現在, 它也默默服務了五年多. 雖然只是一台一萬塊不到的 netbook, 但它的可靠度相當驚人. 在終年將近 40 度高溫的機櫃中跑了五年多, 它幾乎沒有當過, 硬碟也從來沒出過事.
不過五年不關機的時間對這樣的機器來說, 畢竟算是不短的時間, 我也慢慢開始擔心它哪一天會不會有個三長兩短. 雖然我每週都有備份 VMWare 的 image, 但整天提心吊膽的也不是辦法, 於是就興起了想要好好整頓一下這台 server 的念頭.
鳥站的歷史
這台 Linux server 最早可以追溯到 1996 年的暑假. 當時因為果茶小站暑期關機, 鳥友們需要一個 bbs, 我就隨便弄了一台 PC 裝了 Slackware Linux 和最早的 Phoenix BBS, 放在秋刀魚的實驗室.
秋刀魚畢業後, 機器又放到我在台科大電子所的實驗室, 直到退伍. 那個年代, 要有個固定的 IP address 可以放機器並不是件容易的事, 機器不是放學校就是放公司, 而且都不能光明正大的放.
退伍後開始工作, 就把機器偷偷放在公司, 直到家裡有了 ADSL 並且可以用 PPPoE 取得固定 IP 後, 我才把機器搬回家.
這幾年的系統是跑 Red Hat Linux 9, 但我已經不記得我是什麼時候把它從 Slackware 換成 Red Hat 的, 只依稀記得當初因為 Red Hat 跟 Slackware 有許多 system function call 不相容, 換系統時還改了 Phoenix BBS 不少東西, 充新 compile 了好幾次, 才把鳥站成功地在 Red Hat 上開起來.
不過隨著 Facebook 的興起, 鳥站大概從 2008 年之後就幾乎沒有人 login 了.
結婚時, 我申請了 birdandgua.net 這個域名, 本來只是用來公告一些喜宴相關的資訊, 後來就拿來當鳥站的路標. 在此之前, 鳥站一直都是用 IP address 連線, 而有一段時間則有 AB 王和後藤幫忙設定的 HGA domain name 來指路.
至於部落格的部份, 最早可以追溯到 2005 年予欣出生時. 當時我用了一個日本人寫的部落格軟體, 叫做 WebDiary, 幫予欣建立了第一個部落格. 這是一個非常簡單的部落格平台, 一天只能有一篇文章, 而且每篇文章只能有一張照片. 它是一個用 Perl 寫的 CGI-based 平台, 畫面中用了大量的 HTML 表格元素來畫格線, 而且原來顯示的日文是 JIS 碼, 並不是 Unicode. 因為 JIS 碼跟 Big5 有大量的碼是重覆的, 它沒辦法跟 Big5 和平共存, 所以我花了一些時間把界面裡的日文全部改成中文, 才讓它上線了.
關於笨鳥慢飛
到了 2006 年初, 部落格正如雨後春筍般興起, 各種架站平台也百花齊放. 我看上了 WordPress 跟 Movable Type, 在這兩個平台間猶豫了很久. WordPress 是用 PHP 寫的, 而 Movable Type 則是用 Perl 寫的. 因為我對 Perl 比較熟, 對 PHP 完全一竅不通, 當時想說如果需要進去改程式的話, 用 Perl 我比較有辦法, 所以選了 Movable Type.
花了一些時間把 Movable Type 架起來後, 新版的阿爽日記就這麼上線了, 而且後來我還寫了一隻程式把舊版寶寶日記的內容從 WebDiary 裡匯到 Movable Type 中. 當時還遭遇到 WebDiary 的中文內容是 Big5 而 Movable Type 裡則是 Unicode 的問題. 因為 Movable Type 支援一個平台多個部落格, 所以我也開了自己的笨鳥慢飛, 以及迎接予晴出生的阿快日記.
笨鳥慢飛在全盛時期幾乎天天都有發文, 尤其是 2008 年裝潢房子那段時間, 我在部落格上鉅細靡遺地記錄了整個過程. 這可能是這個部落格造訪人氣最旺的時期, 還曾經有大學室內設計系的老師來信, 希望徵得同意在課堂上引用我的部落格內容當作教材.
不過隨著 Facebook 的興起, 以及後期在 Sony 工作的忙碌, 我越來越少在這邊發文. 整個 2013 年甚至只有 3 篇文章.
我在 Facebook 上的活動算是相對活躍的, 但在 Facebook 上表達或記錄的想法, 其實都只能是很簡短的東西, 就像 Twitter 或噗浪上的碎碎念一樣. 它可以幫助我回到當時那個想法的情境中, 但沒辦法記錄或表達複雜的事物. 所以我下定決心, 要把這裡的草除一除, 讓它繼續下去.
虛擬機的遷移
其實鳥站最早是 native 的 Linux installation (那時應該也還沒有實用的虛擬化技術, VMWare 1998 年才成立的呢), 我已經忘了是什麼時候把它搬進 VMWare 的.
當初做虛擬化, 為的就是遷移方便, 這十多年來陸續換過很多台機器, 遷移的時候只要把 VMWare 的 image 搬過去, 馬上就可以開起來, 備份也很方便. 因此, 這次整頓, 我最初的想法是直接把它整台丟到 Amazon 的 AWS 上去跑.
我曾經開過一台 AWS 的 free tier 主機當 VPN server, 用來當做在大陸出差時翻牆的工具. 雖然 AWS 用的虛擬化平台是 Xen, 但我知道它可以吃 VMWare 的 image, 因此我就把鳥站的 image 拷一份出來, 想要試著丟上去跑跑看.
沒想到 AWS 雖然可以吃 VMWare 的 image, 但卻有諸多限制, 比如說 Linux 只能導入 64-bit 的 instance, 而且還限制只能使用某些版本的 Linux distribution. 鳥站用的一直是 32-bit 的平台, Red Hat 9 也不在 AWS VM import 的支援之列, 完全沒輒.
我盤算著, 反正鳥站上的這份 Red Hat 9 也夠舊了, 雖然大部份的 security patch 都有上, 但 kernel 還停在 2.4, 而且 Movable Type 也停在 3.33 一直沒更新, 不如趁這個機會一次跟上時代吧.
既然要重裝, 我想起了當年跟我擦身而過的 WordPress. 這幾年間 Movable Type 跟 WordPress 的消長其實很明顯, WordPress 幾乎攻下了部落格市場的絕大部份江山. Movable Type 已經進步到第六版, 但它已經沒有免費且 open source 的選項了, 反觀 WordPress 在 open source 的架構下快速成長. 雖然我對 PHP 不熟, 但我這次決定偎大邊的西瓜, 跳到 WordPress.
WordPress 最有名的就是 “五分鐘快速架站”. 只要把安裝包 copy 到 html 目錄下, 從 web 登入設定使用者帳號密碼, 再簡單設定一下部落格的參數如名稱, 說明等, 馬上就可以開始使用. 而且它也有可以匯入 Movable Type 文章的 plug–in, 所以要把舊部落格的內容吐過來完全沒問題. 不過, 在處理圖檔時, 我遇到一個難題.
圖床的難題
以前因為笨鳥慢飛的流量並不大, 所以我一直都沒有用外部的圖床, 所有的圖片都 host 在同一台主機上. 早期用 Movable Type 的 web 界面寫作時, 圖檔是手動上傳再插入文章裡面的, 因此檔名和路徑有好好管理. 但後來開始用 Windows Live Writer 離線寫作時, 圖片的上傳就統統交給 Windows Live Writer 透過 XML-RPC blogger API 自動處理, 反正文章裡不會破圖, 我就沒有很在意檔名跟路徑的事.
沒想到 Windows Live Writer 在部落格的目錄下造出了一大堆莫名其妙的目錄, 而且不同版本的 Windows Live Writer 造出來的目錄還不太一樣. 有的目錄叫 “WindowsLiveWriter”, 有的目錄叫 “Windows-Live-Writer”, 還有一大名稱是 “d7fa387810a7_F8BA” 這樣的放圖目錄. 我本來打算想直接把部落格的 html 目錄整個搬到新主機上, 目錄名稱要亂就給它亂吧, 但因為部落格平台不一樣的關係, 如果整個搬過去會有一堆 Movable Type 的系統檔在裡面, 如果只搬圖片目錄我又無法百分之百確定 Windows Live Writer 造了哪些目錄出來放圖.
所以我決定寫隻小程式來處理一下這個問題.
Movable Type 匯出的檔案是文字檔, 所以我可以很容易地用 Perl 去處理它. 我先寫了一隻簡單的 script 去把裡面所有連到 local 主機的圖片 hyper link 都抓出來, 然就就想, 既然我可以把所有的 link 都掃出來, 不如順便整理一下 link 跟檔名好了. 於是我決定一邊抓 link, 一邊把圖檔 rename 之後集中丟到一個新目錄, 同時用 rename 過後的檔名跟路徑把原來的 link 換掉.
一切看起來都很順利, 沒想到第一次轉出來的圖片數量和 link 的數量就不符, 圖片數遠比 link 數少得多. 一開始我沒有在 Perl script 裡做 error handling, 所以都都沒發現檔案在 renaming 跟 copy 時有錯誤. 仔細檢查才發現, 原來是中文檔名惹的禍. 中文檔名 ? Linux 下也有中文檔名 ?
對, 這一切都是拜 Unicode 所賜. Red Hat 9 的檔案系統支援 Unicode 檔名, 而且它的 console 也是 UTF-8 的, 所以如果我從 PC 直接吐中文檔名的檔案給 Movable Type, 它會原封不動的用中文檔名寫入 Linux 的檔案系統. 在我們還用 Movable Type 的 web 界面線上寫作時, 丟了不少中文檔名的檔案上去. 這些中文檔名在內文的連結中會被換成 URL encoding 的格式, 也就是所謂的 percent encoding, 就是我們常常在瀏覽器的 URL 欄位裡看到那種以百分比符號開始的字串. 因為 link 裡的檔名長這樣, 我的 Perl script 就用這樣的檔名去搬檔案, 結果就是找不到檔案…
我沒寫過 web 應用程式, 所以一時之間我還真不知道要怎麼處理 URL encoding/decoding, 但我猜不管是 Perl 還是 PHP 應該都有 library 可以簡單處理這件事. 所以我就上 FB 發問了…
雖然沒有人回答我關於 Perl 的做法, 但憑著其它語言的關鍵字, 我找到 Perl 也有 URI:Escape 這個 module 可以用.為了避免節外生枝, 我並不是把 URL 裡編碼過的中文檔名換回 UTF-8 的格式, 而是另外寫了一隻 script 把所有含有不安全字元檔名的檔案全部 copy 一份成 URL encoded 的檔名. 這樣原來的 script 用 URL encoded 的檔名去找檔案就找得到了.
到這裡, 應該差不多全部的謎都解完了吧 ? 沒想到最後還有一個蠢問題在等我.
為了圖方便, 以上這些動作我都在 PC 上做. 我把整的 /var/www/html 目錄傳了一份到 PC 上, 在 PC 上跑 Perl script 處理完後, 再把處理完的部落格文字檔和圖檔目錄丟回主機上. 但我發現不管怎麼弄, 就是少了幾個圖檔, 而且是在檔案從 Linux 主機傳到 PC 上時數量就不對. 經過仔細檢查 FTP 的 log 後, 我發現這個蠢問題的原因: 大小寫.
Linux 將大小寫不同的檔名視為不同的檔案, 但 Windows 則視為相同的檔案. 因此, 比如說, 我在 Linux 的同一個圖片目錄下有兩張圖片叫 DSC0002.JPG 和 DSC0002.jpg, 它們在 server 上是貨真價實的兩個不同檔案. 但當我用 FTP把這個目錄搬到 PC 上時, 因為這兩個檔名會被 Windows 視為同一個檔案, 後面 copy 的那個檔案就會把前面那個蓋掉, 檔案就剩一個了.
最後怎麼解決呢 ? 我乖乖把 Perl scrip 放回 Linux 下去跑. 還好現在有虛擬化, 我可以輕易複製機器來做實驗, 不用直接在原來的機器上跑.
我花了差不多一個星期的時間搞這些有的沒的, 把三個部落格從舊機器搬到 AWS 上, 再弄進 WordPress 中. 在搬遷的過程當中, 我發 Movable Type 吐出來的笨鳥漫飛匯出檔接近 2MB 大, 也就是說, 扣掉一些有的沒的欄位名稱啊, 分隔符號啦, 我在這個部落格上也寫了近百萬的中文字. 嗯, 還蠻令人驕傲的.
把站台開起來後, 還為了研究 WordPress 的主題怎麼寫, 很快速的學了一點 PHP, 復習了 CSS, 寫出了一個自己的主題, 就是你現在看到的這個. 對, 這個主題不是 WordPress 內建的, 也不是網路上抓來的, 是我參考 WordPress 的文件後用 PHP 和 CSS 一行一行寫出來的. 它還有點簡陋, 不過我學了很多新的東西. 現在我想研究 responsive 的寫法, 讓手機瀏覽時可以看到比較適合的排版.
總之, 我回來了, 這個部落格也回來了. 以後也請多多指教.
頭香!….
Copyright 要改成 2014 嗎?
歡迎使用 wordpress,也歡迎把圖檔都 host 在 Flickr 上,免費不佔頻寬,搬家也不用這麼費事了….