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プログラミングよりはずっといいや。