作為 NoSQL 潮流中的一份子,很容易被拿來與被貼上一樣標籤 (buzzwords) 的資料庫作為比較。各個專案分別被貼上 key-value stores, tuple stores, BigTable Clones, Document store, Graph database 等等標籤

這些標籤分類有時很容易幫助使用者瞭解大概的後段實做技術屬性,但很多時候,也會把使用者帶來偏頗預設看法與錯誤理解。我們可以說這些新技術都是想解決 CAP theorem 問題,但其實這些不同的資料庫計劃各有其想要解決的問題與開發哲學,如果以概括性的功能特徵來作為選擇技術的方式,很多時候會發現專案發展方向適合自己需求。使用者應該先定義自己的問題後,再依照選擇最適合的專案屬性。

Mikeal Rogers (CouchOne 的開發者) 上個月就,這波產業浪潮掩蓋了各專案實際要解決的問題,取而代之是對於 Big Data 的想像與期待。Mikeal 那麼就讓其他人 (與舊資料庫業者) 去追尋 NoSQL 的浪潮吧,CouchDB 可以專注與處理 Mobile Database

CouchDB 特色

試用了 CouchDB 一陣子,幾個特別欣賞的特色功能:

  • Implemention for ACID Properties
  • Schema-Free document-oriented database
  • RESTful JSON API
  • View model / JavaScript View Functions
  • Replication (Peer-based distributed databases), Distributed, featuring robust, incremental replication with bi-directional conflict detection and management.

CouchDB 使用 MVCC model,所有的資料庫寫入 (add, update, delete) 都不需要先 lock 資料庫,因此可以保證可以即時讀出資料。索引則是靠 B-Tree 大量存於硬碟,Document 一份索引,每一份 View (利用 MapReduce pattern 設計的查詢界面) 也會存有一份索引,因此你的資料庫會佔用有大量硬碟空間來換取速度。

另外則是資料可以是隨意的 Json document, 所以愛存什麼就存什麼。此外 API 界面是 RESTful,加上內建 Javascript 的 View Server,你可以用內建的 Show 功能 Render Document, CouchApp 很方便配合瀏覽器使用 (也支援權限功能)。

最重要的特色是 Replication 功能,CouchDB 支援雙向衝突偵測,很方便長期離線的 Client 上線後快速同步資料庫內容,平時離綫狀態,也可以存取已經拉回的資料。

CouchDB 目前限制

雖說 CouchDB 使用 MVCC Model,但 CouchDB 的讀寫速度遠遠慢於 in-memory key-value,與 MySQL 評測也未能夠勝出。加上 CouchDB 只支援 Replication,要作 Horizontal partitioning 要靠 CouchDB Lounge,同等於手動作 Sharding. 效能跟彈性都未能夠勝過其他資料庫系統。

此外,作為存取 unstructured data 的代價,你若想要查詢特別資料,必須依賴 View Model,每組 View 會建出獨立的 b-tree index,這種索引的代價頗高,特別是你想做 ad hoc query 時,使用 _temp_view 會浪費你大量的磁碟與 CPU。因此你必須設計軟體時與鍵入資料前先建好 View。

雖然 View functions 用了 MapReduce pattern, 但礙於 CouchDB View API 的限制,目前很難作多次的資料處理,基本上一次 View 倒出來的資料僅限制一次查詢,你無法方便快速的做第二次 Map/Reduce 處理,如此缺乏彈形讓 MapReduce 反而像是限制,而非一種特色。

除了 Big Data 以外相關應用

捨去上述限制不談,CouchDB 的特色仍然可以作很多應用,特別是 JSON API 與 Peer-based distributed 這兩個功能,很方便在 Laptop 或 Mobile devices 上提供一些應用,特別是你需要在時常離綫的裝置上處理伺服器與本地端資料時。

除了像是 CouchOne 推出相容 CouchDB 的 CouchOne Mobile for Android。在 Linux 上則有 Desktop Couch,目前整合了 Tomboy, Evolution, Bindwood for Firefox 等,可以用來管理 PIM, Bookmarks 等等。理論上可以整合 UbuntuOneMidgard

我讀過兩本 CouchDB 得書籍CouchDB: The Definitive Guide 1st Edition 與 Beginning CouchDB,比較推薦 Beginning CouchDB,但 CouchDB: The Definitive Guide 的下一版,內容已經有改善。

本文是個人使用經驗與看法,如果錯誤,歡迎指教。

使用 git 改完一段程式碼後,你總想回傳給上游開發者。一般是利用 git-format-patch 來產生 patchset,然後搭配郵件軟體軟體寄出。可以配合 git-format-patch 使用的寄信軟體有 git-send-email, git-imap-send 等等,或你也可用 formail 將郵件轉為你的郵件軟體認得的格式。

個人喜歡 git-imap-send,它會將 patch 透過 IMAP 協定存在郵件伺服器上的草稿目錄,如此你可以稍候再透過郵件軟體編修或決定是否寄出。

GMail 設定方式

git-imap-send 使用時,需要先設定 IMAP 伺服器位置與帳號密碼。你可以直接編輯 .gitconfig ,寫入如下設定

[imap]
# Folder = "[Gmail]/Drafts"
Folder = "[Gmail]/&g0l6Pw-"
Host = "imaps://imap.gmail.com"
User = "[email protected]"
port = 993
sslverify = false

你如果看網路上的大部份說明文件,會告訴你 Folder 應該填 [Gmail]/Drafts。很神秘的是,大約我是中文使用者,我的草稿目錄就叫做「草稿」。若用 [Gmail]/Drafts 會出現 “(NO) – [TRYCREATE] Folder doesn’t exist. (Failure)” 錯誤訊息。但是 git-imap-send 不會自行編碼,因此你必須先自行依照 RFC2060 轉碼後,寫入設定,”[Gmail]/草稿” 即為”[Gmail]/&g0l6Pw-“。

附帶一提,Debian 的 git 由於 openssl 的授權問題,並沒有編譯入 SSL 支援。因此你得自行編譯一次,如想使用 Gmail 的 IMAP 寄信的話。

相關 Patch 格式、回覆地址設定

若你想透過 Gmail 送 patch,另外一個需要注意的是 Gmail 會弄爛內文的換行,因此請將 patch 以 attachment 的方式寄送,夾檔 Disposition 是 inline 或 attach 都可以。做法如下

git format-patch –stdout –inline –keep-subject origin | git-imap-send

為了方便別人閱讀,你也可以將夾檔副檔名改為 .txt,以便大部分郵件軟體可以直接閱讀辨識。

[format]
suffix = .txt
inline

另外你也可以在郵件表頭中指定回覆的地址。例如你可以指定請大家回信到 mailing list,以便可以在公開場合進行 patch review。你可以在 git config 中加入如下設定,由於你可能參與很多計劃,最好是加在 project/.git/config 中,而非 ${HOME}/.gitconfig.

[format]
        headers = "To: patches <[email protected]>\nReply-To: devel <[email protected]>\n"

其他方便開發者閱讀的參數如 –signoff, –thread, –numbered 等, 相關細節請見 git-format-patch (1) man page.

身為網管,你時常需要觀察伺服器狀態,以便發生異常時,可以儘速判斷問題來源,至少若硬體負擔不了時,也可以依照時間序,查出負載高峰,並算出所需額外資源。

大部分 Unix 上的伺服觀察工具都是利用 RRDTool 畫圖,個人曾經用過 SmokePing, NagiosCollectd 等伺服器檢測軟體。各有各的用處跟優缺點。

SmokePing 拿來從外部檢測線上服務的延遲狀態相當好用,用 Perl 可以快速自製檢測工具,並自動存成 RRDTool DB 與圖檔,內建的 Alert 支援 Real-Time Traffic Pattern Detection,可以非常有彈性的用以自定警報通知。

如想從伺服器內部確認軟體運作狀態,則可以改用 Nagios。Nagios 支援大量外掛,且支援遠端外掛執行模式,方便同時檢測一羣跑不同服務的伺服器羣組,嫌棄 Nagios 的網頁界面不夠便利的話,後起之秀 Icinga 大幅改善了瀏覽界面。

你若需要效能方面的資訊,像是繪出 Apache 有多少 Requests,則可以用 collectd,同樣也支援大量外掛。但 collectd 僅支援輸出 RRDTool db,本身不提供繪圖功能。你可以另外裝前端界面,以便繪出漂亮的圖檔或查詢界面。

雖然裝了 collectd 幾年,卻一直懶得裝一套好用的前端界面,這兩日改用了 Collectd Graph Panel,發現它還沒有支援 Vserver,於是順手加了一個

I just received yet another comment from a bug reported at 2001 asking for `support deletion of attachments‘ in evolution. It’s kind of interesting to see the demand to be fulfilled for all most one decade.

Good news is you no longer need to ask for the feature. Thanks for Milan Crha, developer of RedHat, who help to get the my small plugin into Evolution code base.

So you don’t need to build the plugin by yourself or looking for a package. The feature should be available at Evolution 2.91.2+. 🙂

News updated at 2010/10/31.

Even though I don’t use evolution daily basis, I still spent a few hours to work with the old plugin for the upcoming Evolution 2.30. In the latest version, Evolution plugin framework is now having a new EPluginUI for GtkUIManager. The plugin version below to 0.0.3 does not work with Evolution 2.30, please use 0.0.4 if you upgraded your evolution to 2.30.

You can download source code tarball at github (http://github.com/chihchun/evolution-remove-attachments). I have also built debian packages for these platform, if you want to test with binaries

  • For Ubuntu User
    • You can download and install package form my PPA for Maverick (10.10).
  • For Debian User
    • You can download the tarball and deb file for Debian sid from here.

Since I no longer use Evolution, if you feel the piece of software is useful for you, please consider making a donation to support me maintaining the software.

前一陣子曾經介紹過「雲端備份」,由於 duplicity 支援相當多種不同的網路儲存協定,像是  ftp, ssh/scp, rsync, Web‐DAV, WebDAVs, HSi (Hierarchical Storage Interface), Amazon S3 backends 等等。因此除了本機之外,你也很適合把它用在伺服器上,一樣可以用 GnuPG Public key安全的加密備份檔案。

為了能夠使用 GnuPG,你必須把公鑰傳輸到伺服器上。千萬別把個人的 PGP Private keys 傳到伺服器上,萬一機器被黑了,你的 Key 也就不安全而失效了。

假設你的伺服器是 remote.server, 你的 key id 是 DC76FEB9

gpg  --export DC76FEB9 | ssh [email protected] gpg --import
這樣就可以把公鑰匯入遠端的伺服器帳號中,但要用 GnuPG 加密,你還需要把信任清單 (ownertrust) 傳過去,讓 GnuPG 了解這把金鑰是受到信賴的。否則你可能會看到以下錯誤訊息
===== Begin GnuPG log =====
gpg: 2983CE0C: There is no assurance this key belongs to the named user
gpg: [stdin]: encryption failed: unusable public key
===== End GnuPG log =====
作法是
gpg  --export-ownertrust |env grep DC76FEB9|ssh [email protected] gpg --import-ownertrust
這樣就可以用 duplicity 時,直接指定 –encrypt-key DC76FEB9 這樣來將備份檔案直接用該金鑰簽署。