TUIプログラミング

去年から自分が開発しているmemcached protocolをしゃべるプロキシサーバがあって、それには特定のポートに繋ぐと現在の状態(接続数や使用しているポート番号等)を出力する機能が付いてる。

↓みたいにtelnetで指定のポートに接続すると即座に結果を返し、終了する。

$ telnet localhost 30011
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
environment stats

name:test1
fsfd:3
fsport:30001
fssockpath:/tmp/neoagent.sock
target_host:127.0.0.1
target_port:11212
backup_host:127.0.0.1
backup_port:11213
current_target_host:127.0.0.1
current_target_port:11212
error_count:0
error_count max:1000
conn_max:1000
connpool_max:20
is_connpool_only:false
is_refused_active:false
bufsize:65536
current_conn:0
available_conn:20
connpool_map:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
Connection closed by foreign host.
$

「watch -n 1 telnet localhost 30011」という風にwatchをかませることでtopっぽく継続的に状態を監視できる。

しかし、この方法だと余計な出力がある上に拡張性がないので、次のバージョンではJSON形式で出力し、

その出力を元にtopっぽく使えるユーティリティコマンド(neostat)を追加することにした。

再描画のロジックがおかしいのかまだバグがあるけど、実装はほぼできてる↓。

https://github.com/cubicdaiya/neoagent/blob/v0.2.x/misc/neostat/neostat

これでどっかのパラメータがまずいことになった場合にカラーリングするといったことが簡単にできるようになった。

topみたいなTUI(テキストユーザインタフェース)を実現する場合、↑みたいにcurses( or ncurses)を使うのが基本なんだけど、相変わらず参考になる資料が少なくて苦労する。前職ではncursesをフル活用したTUIアプリケーションのメンテもやってたけど、もうほとんど忘れてしまった。でもGUIプログラミングよりはずっといいや。