summaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authormhsin <mhsin@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-17 16:14:27 +0800
committermhsin <mhsin@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-17 16:14:27 +0800
commitd023f75854cf77c29a1d2b52635bab90dc370fa1 (patch)
treebbdf07c2b6e1b80750f611588d433adb1e32a509 /docs
parentec4a554115d214ba754951deb570742a5c0bb2e2 (diff)
downloadpttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar.gz
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar.bz2
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar.lz
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar.xz
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.tar.zst
pttbbs-d023f75854cf77c29a1d2b52635bab90dc370fa1.zip
* Add Article IDentification System(AIDS)
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3700 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'docs')
-rw-r--r--docs/aids.txt89
1 files changed, 89 insertions, 0 deletions
diff --git a/docs/aids.txt b/docs/aids.txt
new file mode 100644
index 00000000..870c1646
--- /dev/null
+++ b/docs/aids.txt
@@ -0,0 +1,89 @@
+
+
+ Article IDentification System(AIDS) Design Document
+
+
+Revision History
+
+ * 0.01 2007/12/14 mhsin (未完成)
+
+
+Problem
+
+ BBS 使用者常常有一個需要:「告訴他人某篇特定文章,請那個人去閱讀」,可稱
+ 之為「文章識別系統(Article IDentification System, AIDS)」。
+ 最常見的 AIDS 為結合板名與文章編號:「xxxx 板的第 yyyy 篇文章(如果明顯
+ 可辨別為某個板,則直接指定文章編號)」,但是只要該篇文章之前的任何一篇文
+ 章被刪除並清理索引空位,之後的文章皆會向前遞補,因而造成原本指定的文章編
+ 號指向另一篇文章(或是沒有該編號)。
+ 因此較保險的做法是增加資訊,例如文章編號加上作者、標題,但這會造成描述一
+ 篇文章需要佔用大量的空間,顯得極不實用。
+
+ 理想的 AIDS 至少要能達成以下幾點:
+
+ * 判別文章消失、指示錯誤
+ 使用不隨時間改變(time-invariant)並且達到一定程度唯一性(uniqueness)
+ 的文章識別子(Article IDentifier, AID)。
+ 通常只要做到「看板內唯一」即可,原因是使用習慣上常常會給定看板。
+
+ * 識別子夠短、適合在各種環境使用
+ 識別子必須夠短,並且便於使用者在 BBS 內轉述、甚至轉述到其他如網頁
+ 或 IRC 等媒體。
+ 依目前的使用習慣,10 個字元的長度應該是上限。
+ 而使用的符號也應盡量使用單純的英數字,加上部分在各種環境較不需要
+ escape 的符號。
+
+ * 能有效率地從識別子找到原文章
+ 避免使用額外的空間。
+
+
+Proposed Scheme
+
+ Environment
+
+ 目前 pttbbs 所使用的文章及文摘檔名為:M(文章)或 G(文摘)、接著十進
+ 位的 31-bit 數字(事實上是一個 32-bit time_t 的正數部分)、接著 ".A"、
+ 再接著 "." 及一個三位的大寫十六進位數字(舊版程式產生出來的不包含最後
+ 著四個字元),以 regular expression 拮取:
+
+ /^(M|G)\.(\d+)\.A(?:\.([0-9A-F]{3}))?$/
+ $type = $1
+ $v1 = $2
+ $v2 = (defined($3) ? hex($3) : 0)
+
+ AID(Article IDentifier)
+
+ 為一個最大 64-bit 的無號整數,現階段(可稱為 AIDv1)只使用 48-bit。
+ AIDv1 中各欄位的意義:
+ * info: 4-bit
+ 額外資訊。
+ 0: 一般文章("M")
+ 1: 文摘("G")
+ * v1: 32-bit
+ 即 time_t 部分。
+ * v2: 12-bit
+ 最後的三位十六進位數字。若不存在(舊檔名)則為 0。
+
+ AID 另外有幾種表現形態:
+ * AIDu(AID uncompressed)
+ 即 AID,以 uncompressed 強調其為原始形態。
+ * AIDc(AID compressed)
+ 以類似 Base64 的表現方式(即每 6-bit 以一個字元表示),用字串表
+ 示 AIDu。
+ 目前以 0-9, A-Z, a-z, -, _ 共 64 個符號代表 6-bit 中 0~64 的值。
+ AIDv1 使用 48-bit,故轉成 AIDc 時為 8 個字元長。
+ AIDu 與 AIDc 可完全互相轉換。
+
+ Resolve AIDu to filename
+
+ 從 AIDu 得到檔名只需將 $type, $v1, $v2 分別轉換回 "M" 或 "G"、十進位數
+ 字、三位十六進位數字,再組合成檔名即可。
+ 但由於 AIDv1 不記錄檔名是否為舊版程式所產生($3 部分不存在,$v2 被設為
+ 0),故解析出如 M.123456789.A.000 這樣的檔名,若檔案不存在,則會去掉最
+ 後四個字元,以 M.123456789.A 再嘗試一次。(理論上這兩個檔案幾乎不可能
+ 同時存在)
+
+
+
+
+