這個專案是提供 Golang 開發者存取現有在台灣的 BBS 資料結構的函式庫。
目前主要支援的 BBS 結構以 pttbbs(CurrentPTT/OpenPTT) 為主
未來可能會支援 FormosaBBS
目前 pttbbs 支援的檔案請見此處
go test
這樣。
有些名詞因為太常出現,可能會考慮直接在程式碼裡面以縮寫表示而不寫出全名:
- BM: Board Moderator 版主的意思
BBS file database manager system library in Golang.
License: Apache License 2.0
這個專案是提供 Golang 開發者存取現有在台灣的 BBS 資料結構的函式庫。
目前主要支援的 BBS 結構以 pttbbs(CurrentPTT/OpenPTT) 為主
未來可能會支援 FormosaBBS
目前 pttbbs 支援的檔案請見此處
go test
這樣。
有些名詞因為太常出現,可能會考慮直接在程式碼裡面以縮寫表示而不寫出全名:
The login-feature is almost done~
We are able to start setting-up the service to communicate with python-server.
Based on the information that I obtained:
我的最愛檔案 .fav 的測試檔已經上傳了,該使用者應該有 test 以及 ALLPOST 兩個最愛。
檔案位置位於
https://github.com/PichuChen/go-bbs/tree/master/testcase/fav
相關的Header 位置位於
https://github.com/ptt/pttbbs/blob/af507e0029c4e6b3a564ec98328ffe7cd7fd16be/mbbsd/fav.c
https://github.com/ptt/pttbbs/blob/af507e0029c4e6b3a564ec98328ffe7cd7fd16be/include/fav.h
目前在Access Token 的設計上應該會採用 JWT Token
已知裡面會有 User ID 作為簽發主體
現在看還需不需要多塞什麼東西以利Client端利用,以及有效時間大約多久?三十分鐘?五分鐘?
brc3 檔案的用途是暫存目前使用者在各個看板已讀哪些文章的記錄檔
原本作法的問題 / Solved Problem
實作細節 / Details of Implement
目前有二方案,一是簡單添加 golint
工具直接執行。另一是使用 Go 生態圈常用的 Go linters aggregator golangci-lint 來執行 golint
,額外的好處是,隨著專案持續發展,我們可以逐步啟用各種靜態分析工具。
相關文件 / Documents
預計要做 board header parser 以及 unit test 的部分
會修改的程式碼包含
board.go
board_test.go
只會做最初步的parser,基本上就是按照 pttstruct.h
裡面的boardheader_t
結構去實作
Golang 1.16 推出了,應該可以開一個 Branch 測試目前 1.16 跑起來會不會有問題
建立一個 feature/golang_1_16 然後修改 CI 檔案讓他使用 golang 1.16 做測試,沒問題的話就 merge 回來
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
pttbbs admin.c
The Problem
Run go run pttbbs/cmd/main.go
,always return "unsupport connectionString"。
L278 always return error
Lines 272 to 286 in 529d3b0
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
參考method 註解
實作細節 / Details of Implement
目前準備製作一份貢獻者名單加到專案裡面。
包括但不限於 coding,撰寫文件等
歡迎大家提名自己到名單內
期程 / Schedule
無,但會定時 merge 到 development
相關文件 / Documents
CONTRIBUTORS.md
雖然套件名稱是 Cache 但實際上是用來讀取 SHM 的套件
初步想法是這樣,目前在測試環境的 SHM 已經被打包下來了,約 44MB, 因此在 Parsing 的時候透過 mmap 的 System call 就能夠讀入記憶體了。
但是根據每個BBS編譯設定不同,欄位所在的記憶體位置也會不同,因此這部分需要動態算出位置,算出位置後下一步就能取得該位置的資料或是將資料寫入該位址。
如果回傳的是 []byte
byte slice 的話,那利用者就能自由的讀取和修改某段記憶體位置了(還不用copy)
https://play.golang.org/p/vEUqcyc5g94
第一階段因為方便測試,所以用 mmap 打開測試資料,然後上線前改成透過 cgo 開啟 system V SHM 的版本。
大概是這樣的計畫,看有沒有人有興趣或是其他意見。
目前有個重要的任務我忘了開,就是需要解析文章
以前並沒有結構性的去描述 BBS 文章結構的結構,因此這部分得我們自行發明。
初步的話我希望可以解析成以下的格式
"is_header_modify": {{is_header_modified}},
"author_id": {{author_id}},
"author_name": {{author_name}},
"title": {{title}},
"post_time": {{post_time}},
"board_name": {{board_name}},
"text": {
"text": {{text}},
"color_map": {{text_color_map}}
},
"signature": {
"text": {{signature_text}},
"color_map": {{signature_color_map}}
},
"sender_info": {
"site": {{sender_site}},
"ip_address": {{sender_ip_address}},
"ip_country": {{sender_ip_country}},
},
"edit_record": [{{edit_record}}],
"push_record": [
{
"type": {{push_record.type}},
"id": {{push_record.pusher_id}},
"ip_address": {{push_record.pusher_ip}},
"text": {{push_record.type}},
"time": {{push_record.time}},
}
]
方法目前沒有特別的想法,也許建議使用regex或者是if else, 如果用 goyacc 寫出一套解析器應該也是可以,雖然我懷疑這個解析器會不會遇到2003以前的文章就失效了。 如果要用 NN 訓練出一個模型出來我覺得也不是不行,雖然這樣的話我可能會先讓傳統 if else 作法的先上線。
原本作法的問題 / Solved Problem
實作細節 / Details of Implement
期程 / Schedule
原本作法的問題 / Solved Problem
實作細節 / Details of Implement
期程 / Schedule
N/A
相關文件 / Documents
N/A
Found that fav-info is stored in in-process mem,
and is brutal-forcely do fav-save when the ssh/telnet/ws session is done.
https://github.com/ptt/pttbbs/blob/master/mbbsd/board.c#L1647
https://github.com/ptt/pttbbs/blob/master/mbbsd/mbbsd.c#L206
Design concern:
Currently pttbbs allows at most 3 concurrent connections. So it's ok to have possible conflicting fav-setup as long as we stick to Design 1.
(In rare situation, the user has a dead process, and the user allows the dead process continue working,
and the user modify the fav-info and logout before the dead-process is killed.)
(The user will just reset it again)
Requires frontend to take care of fav-editing and middleware to have cache of the fav-info.
When doing get-fav from frontend-UI:
When doing update-fav from frontend-UI:
原本作法的問題
實作細節
這個 ISSUE 紀錄需要被解析的檔案以及解析的進度
如題,因為目前載入密碼檔案的機制是在程式執行時進行的。
也許要把它改成每次驗證時重新載入?或是幾分鐘重新載入?或是有什麼機制讓他重新載入這樣。
正統的 Big-5 的字集裡面應該是不支援日文假名以及「堃」字的,但是PTT有支援,主要是因為PTT並不是使用一般的 Big-5 而是使用 Unicode 補完計劃的 Big5-UAO 編碼,這個編碼看起來還沒被Golang支援的樣子,需要Patch。
實作細節 / Details of Implement
期程 / Schedule
相關文件 / Documents
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
原本作法的問題 / Solved Problem
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
@kkdai 整理分享,我想說放一份連結在這個issue,有後續資料跟討論可以在這繼續進行
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
https://github.com/ptt/pttbbs/blob/4d56e77f264960e43e060b77e442e166e5706417/include/pttstruct.h#L349
原本作法的問題 / Solved Problem
CI go.yml 設定中的 L27 先安裝套件中宣告的依賴後,在 L28 還特別處理 Dep 宣告的依賴。考慮到專案已使用 Go Modules 且並不存在 dep 依賴設定檔,此應為無效的步驟。
go-bbs/.github/workflows/go.yml
Lines 25 to 31 in fe75889
實作細節 / Details of Implement
相關文件 / Documents
實作細節 / Details of Implement
目前有部分 code 使用 id 應該要改為 ID
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
使用 golint 確認
https://github.com/ptt/pttbbs/blob/master/docs/brc.txt
https://github.com/ptt/pttbbs/blob/master/mbbsd/brc.c#L444
https://github.com/ptt/pttbbs/blob/master/mbbsd/brc.c#L596
brc is per-user article-read record.
It's extensively used when displaying article-list and board-list.
As fav, this cannot be read directly in go-bbs, or the system may failed.
Requiring middleware to take-care of user-article-read mapping and determine user/article and user/board read.
middleware needs to have good mechanism to sync-back the brc.
原本作法的問題 / Solved Problem
實作細節 / Details of Implement
相關文件 / Documents
目前在 https://github.com/PichuChen/go-bbs/blob/d49298349281c75edd721caece6db88744df7dba/bbs.go#L89 有定義Connector ,但目前的 Connector 只有讀取的功能,需要定義有寫入功能的 BBS Driver 要實作哪些東西。
方向上有兩種,一種是在原有的 Connector 新增 Method
第二種是定義新的Interface 可能叫做 WritableConnector 或是 BBSWriter 之類的,然後去定義這個 Interface, 使用上就是檢查如果這個 Driver 沒有實作某個 Connector Interface 的話,就是視為這個 BBS Driver 不支援某類型的功能。
logins.bad 有兩種,一個在BBSHOME,一個在User下面
https://github.com/ptt/pttbbs/blob/master/include/common.h#L56
https://github.com/ptt/pttbbs/blob/master/common/bbs/passwd.c#L255
/logins.bad: 這個檔裡有每個 user的login attempt且包含成功與失敗。第一個字元若是"-"代表失敗。
test03 [01/01/2021 10:11:45 Fri] [email protected]
test04 [01/01/2021 10:13:35 Fri] [email protected]
test05 [01/01/2021 10:13:45 Fri] [email protected]
SYSOP [01/01/2021 10:13:53 Fri] [email protected]
test06 [01/01/2021 10:14:38 Fri] [email protected]
SYSOP [01/01/2021 10:14:46 Fri] [email protected]
-test01 [01/01/2021 10:15:16 Fri] [email protected]
-test02 [01/01/2021 10:15:19 Fri] [email protected]
-test03 [01/01/2021 10:15:22 Fri] [email protected]
test04 [01/01/2021 10:15:38 Fri] [email protected]
home///logins.bad: 這個檔裡只有該user的 失敗 login attempt
╰─➤ cat home/T/test01/logins.bad
[01/01/2021 10:15:16 Fri] 172.22.0.1
目前我的想法是用同一個struct來parse這2種logins.bad
type LoginAttempt struct {
Success bool
UserId string
LoginStartTime time.Time
FromHost string
}
For /logins.bad ,這個檔裡四個field都有,所以沒問題。
但在user/logins.bad,缺少 UserId ,所以parse出來的struct就沒有 UserId,需要caller assign
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
轉錄文章在 bbs.c 的 cross_post
預定修改的程式碼為
passwd.go
passwd_test.go
兩個檔案,請參考 https://github.com/ptt/pttbbs/blob/master/include/pttstruct.h 裡面的 userec 結構將 testcase 裡面的 passwd 檔案的內容解出來並做成測試檔。
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
發生了什麼事? / The Problem
螢幕截圖 / Screenshots
PS C:\Users\Tim.chen\Documents\GolangProjects\go-bbs\pttbbs> go build
# github.com/Ptt-official-app/go-bbs/cache
..\cache\mmap.go:54:12: undefined: openMmap
..\cache\mmap.go:75:9: undefined: closeMmap
..\cache\systemvshm.go:27:38: undefined: ShmidDs
..\cache\systemvshm.go:58:9: undefined: ShmidDs
..\cache\systemvshm_unix.go:9:16: undefined: unix.Syscall
..\cache\systemvshm_unix.go:9:32: undefined: unix.SYS_SHMGET
..\cache\systemvshm_unix.go:17:16: undefined: unix.Syscall
..\cache\systemvshm_unix.go:17:32: undefined: unix.SYS_SHMAT
..\cache\systemvshm_unix.go:27:16: undefined: unix.Syscall
..\cache\systemvshm_unix.go:36:38: undefined: ShmidDs
..\cache\systemvshm_unix.go:27:16: too many errors
開發環境 / Environment
目前 PTT 的支援進度比較有進度了,不過發現檔案後綴系統版本的做法會讓命名空間比較混亂,不同站台的Username或是IP長度定義可能會有不同,目前想法是參考其他人的類似專案把它變成用資料夾的形式分開
例如
/
| /pttbbs
| /dreamBBS
| /formosaBBS
https://github.com/audreyt/ournet-bbs/tree/master/lib/OurNet/BBS/Cola
這樣,那實際上根目錄的地方去設計整體的介面,感覺上應該會像是 Golang 的 database/sql 的設計模式。
原本作法的問題 / Solved Problem
PTT_BRD_POSTMASK
favJson
PosOfPttPasswdPagerUiType
InvalidFavTypeError
// 前面用b
func (b *BoardHeader) BoardID() string { return b.BrdName }
// 後面用r
func (r *BoardHeader) MarshalBinary() ([]byte, error)
實作細節 / Details of Implement
按照go lint建議改,這應該跟 #52 一樣問題。其中ALL_CAPS命名個人覺得有討論空間,畢竟原始的code是C
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
Follow golint
另外是我已經開始著手更改了,麻煩assign給我,謝謝
實作細節 / Details of Implement
BoardId() string
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
PTT後端系統協定
如果不知道要做什麼的話,可以在 看板 找到 TODO
如果還是不知道的話,可以在這篇下面留言,害羞的話可以私訊 Pichu , 在 join.g0v.tw 可以找到 pichuchen。
如標題,目前在送 PR 的時候基本上都是送往 Master Branch
初期可以這樣做,後期可能為了穩定度和開發方便可能需要分Branch
基本上有兩個方向,一個是另外開Develop Branch,另外一個則是另外開 Release Branch,相關的討論再請大家討論。
實作細節 / Details of Implement
.history_articles
目前會需要儲存的欄位如下:
期程 / Schedule
相關文件 / Documents
curl http://localhost:8081/v1/users/foobar/favorites
但是foobar沒有我的最愛
選一個沒有我的最愛的帳號, eg: foobar
然後產生runtime error,但是主程式不會死掉
主程式可以handle exception而不會導致runtime error
這個回應看起來合理
runtime error:
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:2969 +0x36c
Ubuntu 16.04, test with curl
實作細節 / Details of Implement
待確認:setbtotal 要在哪邊呼叫
期程 / Schedule
相關文件 / Documents
pttbbs 函式註解
實作細節 / Details of Implement
BoardRecord 目前沒提供發文限制的相關資訊,所以需要提供以下 method:
另外文件中的[發文限制] (https://docs.google.com/document/d/18DsZOyrlr5BIl2kKxZH7P2QxFLG02xL2SO0PzVHVY3k/edit#) 還有 regtime 註冊時間,如果最後需要也需一併加上
如果想要將資訊塞在新的 interface 的話也可以提出來討論~~
期程 / Schedule
目前 PTT 以及多數 BBS 將密碼進行 Hash 的演算法應該是基於 DES 的演算法。
然而這個演算法並沒辦法使用 DES 直接實作。
雖然原本的 C 程式碼裡面有 fcrypt 可以用,不過如果直接靜態編譯進來可能未來會有版權問題。
替代的方案是使用作業系統中可能原本就有的 crypt 函式,在現代電腦上效能可能差不多了。
另外的問題是無論是 fcrypt 或者是 crypt 都有回傳靜態記憶體位置的問題,網路上有看到用純 Golang 實作的版本,也有套件化,所以搞不好用該版本會更好?
原本作法的問題 / Solved Problem
MarshalBinary
或是MarshalToByte
,希望能調整成一致。實作細節 / Details of Implement
padding + 前一個Pos + 前一個欄位長度
,其中欄位長度如果原始型別是字串會希望有對應的constMarshalBinary
,因為在fav.go中有用到BinaryMarshaler介面;反之,將binary轉struct改作Unmarshal + struct名
改成padding + Pos + 欄位長度
理由是雖然可能與現實順序不一樣,但這樣可以一眼辨別哪些是欄位長度及padding,方便閱讀及debug。
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
pttstruct.h
實作細節 / Details of Implement
期程 / Schedule
(希望這個任務大概什麼時候做完,如果會卡到其他地方的功能也請在這邊提出。)
相關文件 / Documents
pttstruct.h
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.