[分享] PTT Client 開發經驗(1)

看板AndroidDev作者 (悠游自在)時間9年前 (2015/12/16 18:15), 9年前編輯推噓19(1907)
留言26則, 21人參與, 最新討論串1/1
網頁好讀版(部落格, 有廣告) http://goo.gl/GvUoPg 不知道發布這種技術文章有沒有違反 PTT 站規之類的? 因為 App 這麼多款了可是好像沒人發過... 有點怕怕的 有的話再麻煩各位跟我說一下 -- 警告! 開發 PTT Client 非常之危險! 無所不在的時間黑洞以及各種無法預料的狀況會將你的精神折磨至崩潰!!! 哈哈哈哈哈哈哈哈哈哈(就像這樣) -- 以下都是廢話加閒談,趕時間的可以按這裡跳到重點(可是PTT沒有Anchor!!!) 可喜可賀! 經過了漫長的開發時間終於成功上架了 目前似乎也運氣很好的穩定運行了一段時間 有興趣的朋友可以自己在部落格內尋找 App 連結,我就不多打廣告了 自信滿滿,人稱程式小Bug王的我原本想說這種小東西大概一兩個月就可以完成了吧! 結果花了我快半年... 其中一個原因是第一次開發 Android App 另一個就是氣死人不償命的 VT100 終端機訊息傳遞機制,這個留待往後慢慢說明 而且網路上的資源可以說是少之又少 很多東西都是自己Google來東拼西湊才知道的 所以很多東西看看就好不一定是對的,自己找重點記(超不負責任) 尤其很多都是英文的資料,對於 PTT 這中文的論壇所需的技術來說實在是很不友善 於是我就想說寫這篇教學文章來好好闡述一下這血與淚的開發史 希望可以求得一些歷史定位(!?) 呃...是造福其他開發者啦 最主要的目的是告訴其他有興趣的開發者趕快放棄開發的計劃,因為實在太難做了 如果再讓我選一次我絕對不會選擇開發這個 App!!! 心理準備 首先我們來彈彈 PTT 的額頭,要很用力!(到底有多恨...) 是來談談 PTT 使用的 ANSI Escape Sequence 以及相關的知識 如果以為這只是單純的文字處理那就大錯特錯了! 當初天真爛漫的我其實就是這麼想的,殊不知背後龐大的利益鳩葛與情仇交纏... PTT 是使用 VT100 這種類型的終端機定義來傳遞訊息 而使用 ANSI Escape Sequence 則可以將訊息格式化 諸如文字顏色、背景顏色、閃爍、文字出現位置以及清除畫面等等 所以你用 PC MAN 或任何終端機連上後可以看得見如此精美的畫面 http://imgur.com/eaQB3h0
但是你得到的資料其實是... https://gist.github.com/anonymous/644b681bc52f26166f9f 有沒有感覺到一種被欺騙了的感覺 ... ... ... 那麼接下來我們就進入正式的介紹了(現在才開始!? 那前面打那麼多字幹嘛啦) ANSI Escape Sequence 首先我希望各位將以下幾個網頁加入最愛或是直接儲存整個網頁 對於往後的開發來說會是非常重要的資源 控制字元對照表 - ASCII code caracters http://goo.gl/lUND7H ANSI 控制碼對照表 - ANSI Codes http://bluesock.org/~willg/dev/ansi.html CTRL 複合按鍵對照表 - Key Pressed with CTRL key down http://www.vt100.net/docs/vt100-ug/table3-5.html 第一個跟第三個連結暫時還用不上,我們先打開 ANSI Codes 的連結 然後看到下方表格的 color and text formatting 這欄 http://imgur.com/s5p78QX
這邊主要是在說明所有可以用的文字格式設定控制碼 https://gist.github.com/anonymous/24ce59b4f0ab0323e3b6 再來就是另一個比較複雜的重頭戲了 請看到網頁中表格的 cursor controls 以及 erase functions http://imgur.com/k3FlV7w
這邊主要是在處理文字的排版 也是上面那一大串文字的最主要原因 PTT 回傳的資料有很多種類型, 有時會給你完整的字串用空白補齊位子 有時會不給你空白, 而是使用 ESC[12;30H 的方式告訴你接下來的字是放在哪個位置 https://gist.github.com/anonymous/4d661ce0f45d8798849c 其他的部分因為 PTT 不會回傳那些控制碼所以可以暫時不用看 下一章就會開始講解 ANSI Escape Sequence Parsing Engine 該如何撰寫 用一長串英文有沒有感覺很專業? 其實就是將 PTT 回傳的資料一個蘿蔔一個坑的放入剛剛提到的 24 * 80 陣列的方法 算是整個 PTT Client 的第一個最重要的核心 也是當初撰寫時遇到的第一個難關 那麼就容我稍微拖個稿,請待下回分解!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.132.223 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1450260900.A.D6A.html

12/16 20:23, , 1F
大推~期待下一集 我也打算之後自己寫一個PTT client
12/16 20:23, 1F

12/16 20:33, , 2F
只是現在礙於在忙目前的專案 沒空去研究 有這篇很不錯
12/16 20:33, 2F

12/16 20:39, , 3F
感謝分享!
12/16 20:39, 3F

12/16 21:00, , 4F
推推推推推
12/16 21:00, 4F

12/16 21:15, , 5F
12/16 21:15, 5F

12/16 21:25, , 6F
推~~期待續集
12/16 21:25, 6F

12/16 22:25, , 7F
大推!! 感謝分享!!
12/16 22:25, 7F

12/16 23:35, , 8F
推用心 不過如果有做過BBS動畫或是ASCII圖其實這都看多了
12/16 23:35, 8F

12/16 23:51, , 9F
Cool!!!
12/16 23:51, 9F

12/17 00:21, , 10F
分享 推
12/17 00:21, 10F

12/17 01:43, , 11F
推!會開源嗎?是說剛裝完第一次開會FC,不曉得是不是6.0
12/17 01:43, 11F

12/17 01:43, , 12F
runtime permission 造成的?
12/17 01:43, 12F

12/17 11:34, , 13F
也許找開源VT100 library 改上中文支援會容易些?
12/17 11:34, 13F
開源可能等我之後架完 Server 再考慮囉 不過現在還會FC喔... 6.0 權限的部分我上次有改了 應該會在一開始要求檔案存取權限 可以幫我按一下回報嗎? 我看看是什麼問題 然後其實我當初就是找不太到相關資源XD 關鍵字也不知道該怎麼下 所以才會想寫這系列的文章 希望能用較簡短的文字讓大家了解基本的原理這樣 因為沒有看過正式文件,都是用try出來的結果推測的結論 所以可能會較不正確,但應該可以給出一個明確的開發方向

12/17 19:56, , 14F
其實PTT會這麼醜有一部分是因為用了 pfterm 的關係…
12/17 19:56, 14F

12/17 19:56, , 15F
…他會讓輸出最佳化,沒有人變過的地方會用移動游標的
12/17 19:56, 15F

12/17 19:56, , 16F
方式跳過,節省流量
12/17 19:56, 16F

12/17 20:53, , 17F
是的 這也是我下一章要說的
12/17 20:53, 17F

12/17 20:53, , 18F
也因為這個原因才讓開發難度增加
12/17 20:53, 18F
另外補充, 以現今 App 能做到的寫法來說 其實加了那個反而會增加更多流量... 有多少呢? 大概有兩倍以上吧XD 下一章會提到其中一個原因 另一個原因我可以講一個例子 大家常常看到的 "按任意鍵繼續" 那一行短短幾個字 但 PTT 回傳的資料加上控制碼有多長呢? https://gist.github.com/anonymous/c3ea3f4cd809f9ab2503 有429個字元這麼長 中間有一些字元是不會印出來的 ※ 編輯: kiwatami (111.251.132.223), 12/17/2015 21:25:38

12/18 00:36, , 19F
推一個
12/18 00:36, 19F

12/19 00:05, , 20F
我之前摸到VT100就中離了 哈哈XD
12/19 00:05, 20F

12/19 04:04, , 21F
12/19 04:04, 21F

12/22 11:27, , 22F
推!
12/22 11:27, 22F

12/31 13:53, , 23F
謝謝分享~~
12/31 13:53, 23F

01/06 09:48, , 24F
推 辛苦了!! 感謝分享
01/06 09:48, 24F

01/20 10:01, , 25F
01/20 10:01, 25F

08/06 01:08, , 26F
推分享:)
08/06 01:08, 26F
文章代碼(AID): #1MSJcarg (AndroidDev)
文章代碼(AID): #1MSJcarg (AndroidDev)