2009年7月17日金曜日

Rubyで端末のサイズを得る

マルチスレッド対応〜プログラムを作っていて、一覧表示時を行う為に、Rubyで端末のサイズを得るにはどうしたら良いのか、という問題に直面した。

LinuxやBSDでは、stty sizeコマンドを実行して、それを解析し取得する方法もあるが、OSに依存するため使えない。
Sorarisなど、同じコマンドがあっても微妙に結果が違ったりするものもあるので…


以前のバージョンでは、cursesを使って獲得していた。

require "curses"
def gettermsize
Curses::init_screen
x = Curses::cols
y = Curses::lines
Curses::close_screen
return {"x"=>x.to_i, "y"=>y.to_i}
end


この方法も、RubyにCursesライブラリが入っていないと駄目という問題が。
しかも、環境によって、標準出力のバッファリングがおかしくなることがあるという謎の現象が…
標準出力がおかしい件

これを回避するには、標準出力を同期モードにしてやればよいようだった。

STDOUT.sync = true

これをcurses読み込み前に書いておけば、標準出力がプログラムの流れと同期して表示されるようになった。


もっと効率が良く、どのプラットフォームでも同じ結果が得られるものは無いのだろうか…

0 件のコメント: