作者kiwatami (悠游自在)
看板AndroidDev
标题[分享] PTT Client 开发经验(1)
时间Wed Dec 16 18:14:47 2015
网页好读版(部落格, 有广告)
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://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1450260900.A.D6A.html
1F:推 aiweisen: 大推~期待下一集 我也打算之後自己写一个PTT client 12/16 20:23
2F:→ aiweisen: 只是现在碍於在忙目前的专案 没空去研究 有这篇很不错 12/16 20:33
3F:推 rayyyy: 感谢分享! 12/16 20:39
4F:推 cryinglove: 推推推推推 12/16 21:00
5F:推 loxyz: 推 12/16 21:15
6F:推 givemepass: 推~~期待续集 12/16 21:25
7F:推 sean0430: 大推!! 感谢分享!! 12/16 22:25
8F:推 Cycylno: 推用心 不过如果有做过BBS动画或是ASCII图其实这都看多了 12/16 23:35
9F:推 KeySabre: Cool!!! 12/16 23:51
10F:推 tangblack: 分享 推 12/17 00:21
11F:推 hungys: 推!会开源吗?是说刚装完第一次开会FC,不晓得是不是6.0 12/17 01:43
12F:→ hungys: runtime permission 造成的? 12/17 01:43
13F:→ AirShower: 也许找开源VT100 library 改上中文支援会容易些? 12/17 11:34
开源可能等我之後架完 Server 再考虑罗
不过现在还会FC喔...
6.0 权限的部分我上次有改了 应该会在一开始要求档案存取权限
可以帮我按一下回报吗? 我看看是什麽问题
然後其实我当初就是找不太到相关资源XD
关键字也不知道该怎麽下
所以才会想写这系列的文章
希望能用较简短的文字让大家了解基本的原理这样
因为没有看过正式文件,都是用try出来的结果推测的结论
所以可能会较不正确,但应该可以给出一个明确的开发方向
14F:推 david50407: 其实PTT会这麽丑有一部分是因为用了 pfterm 的关系… 12/17 19:56
15F:→ david50407: …他会让输出最佳化,没有人变过的地方会用移动游标的 12/17 19:56
16F:→ david50407: 方式跳过,节省流量 12/17 19:56
17F:→ kiwatami: 是的 这也是我下一章要说的 12/17 20:53
18F:→ kiwatami: 也因为这个原因才让开发难度增加 12/17 20:53
另外补充,
以现今 App 能做到的写法来说
其实加了那个反而会增加更多流量...
有多少呢?
大概有两倍以上吧XD
下一章会提到其中一个原因
另一个原因我可以讲一个例子
大家常常看到的 "按任意键继续" 那一行短短几个字
但 PTT 回传的资料加上控制码有多长呢?
https://gist.github.com/anonymous/c3ea3f4cd809f9ab2503
有429个字元这麽长
中间有一些字元是不会印出来的
※ 编辑: kiwatami (111.251.132.223), 12/17/2015 21:25:38
19F:推 jack089452: 推一个 12/18 00:36
20F:推 wuliou: 我之前摸到VT100就中离了 哈哈XD 12/19 00:05
21F:推 cory8249: 推 12/19 04:04
22F:推 cooper6334: 推! 12/22 11:27
23F:推 muimio: 谢谢分享~~ 12/31 13:53
24F:推 lin791126: 推 辛苦了!! 感谢分享 01/06 09:48
25F:推 dokinkon: 推 01/20 10:01
26F:推 holishing: 推分享:) 08/06 01:08