お久しぶりです。
ちょっと前までプロビジョニングとかImmutableInfrastructureにハマっていた国平です。
Chefを触り始めたあたりから、Rubyが楽しくなってきて、最近では隙あればRubyスクリプトを書き殴ってます。
今回は、Rubyの超小ネタをご紹介します。

バッチ処理を動かしてる時って、進捗度を標準出力に出したいですよね。
そんな時に役立つ小ネタがこれです。
とにかく、何も言わずに↓のスクリーンショットを見て下さい。

rewrite_ruby1

分かりますか?
標準出力に、進捗を表示しているのですが、処理の進捗に合わせて出力した内容を書き換えてます。
こういう表示ができると、スクリプトがプロっぽくなりますよね。
この出力を行う方法をご紹介します。

種明かし

やっていることは、とても単純で、

  1. 標準出力に文字を出す
  2. カーソル位置を現在行の先頭に戻す
  3. 1に戻る

この3ステップです。

で、今回一番のミソが ステップ2 ですが、Rubyでカーソルを左に動かすには、

で、OKです。 1文字動かすなら、↓ですね。

当然、左だけでなく上下左右に移動することが出来ます。

というわけで、スクリーンショットのソースはこれ↓

One more thing…

おまけで、今度は逆に減っていくパターンを考えます。
今度は、最初に”#”を10個表示して、どんどん減っていくような表示をさせます。

↑このコードを実行すると…

rewrite_ruby2

なにも表示が変わりません…orz これは、最初に”#”が10個表示されて、その上に更に”#”を9個,8個,7…と書き換えて行っているので、最初に表示された後ろの方の”#”がそのまま残ってしまっています。 なので、ちゃんと上書きするような実装に書き換えます。

実行すると今度は上手く”#”が減っていきます。

rewrite_ruby3

まとめ

Rubyではカーソルを移動させることで、標準出力に出した内容を書き換えることができます。
この機能を利用することで、RubyでCLIスクリプトを書くときに、リッチっぽい表示ができるようになります。

なお、この内容はWindows環境で動作するかは未確認です。(追記:Windowsでも動作しました) 試す時は、Vagrantなどを使って試してみることをおススメします。
Vagrantの使い方はこちらの記事をどうぞw