2015/10/25ソフトウェアの処理には往々にして、完了までに利用者を待たせざるを得ない場面というものがある。純粋にCPU処理に時間がかかるものであったり、ダウンロード等の通信に時間がかかるものなど、様々な状況があるだろう。分かったほうが、その待ち時間は短く感じるものだ。ユーザビリティ上プログレス表示の重要度は高い。コンソール上でも類似した表示を実現する方法が幾つかある。その方法について紹介する。本来であれば「何らかの処理」をしながら表示するということになる。ここでは、「何らかの処理」をスリープで表現している。スリープは以下の関数を利用している。この関数は既にPOSIXの規定から削除されているため、本来は使うべきではない。ここではスリープの実現方法は本質ではないため記述量の少なさから採用している。usec);引数はマイクロ秒で、その時間呼び出し元スレッドの実行を延期する関数である。解説する必要もないほど簡単な方法だ。処理の進捗に合わせて文字を出力していく方法である。改行を出力しないことで「バー」として表現することができる。改行コードを出力するまでは画面に反映されない可能性がある。出力の意味的にも標準エラー出力を使ったほうが良い。0;}実行すると以下のような表示ができる。※JavaScriptで表現。コンソールが使用できる箇所であれば、おそらくどこでも動作するという点だろう。次に紹介するのは、エスケープシーケンスのところで例示した方法だ。多くのコンソールではカーソルを(次の行ではなく)その行の先頭に移動させる制御となる。コンソールでの出力は上書きの動作となるのが一般的である。1行の範囲内であれば、出力後、先頭から出力し直すことで一度出力した内容を更新することができる。これを繰り返し行うことでアニメーションを行うことができる。0;}実行すると以下のような表示ができる。※JavaScriptで表現。この方法も、おそらく殆どの環境で使用することができるだろう。先頭へのカーソル移動ではなく、不明な文字コードとして解釈される可能性もある。ファイルへリダイレクトし、後で見るような場合にも意図した表示にならないため注意が必要だ。いった意味でも少なくとも標準出力ではなく、標準エラー出力を使うようにしたほうが良い。標準エラー出力もログとしてファイルにダンプされる可能性があるので、より高度には出力先がファイルかコンソールかを判定してだし分けを行うようにする。この方法については、Linuxプログラミング解説のlsっぽいコマンドを作る-ファイル種別に基づく色付き表示で触れているので興味があれば見て欲しい。具体的な進捗率を表現できればよいが、中には具体的な進捗がわからないというケースもある。その場合は例えば以下のような表現方法がある。0;}実行すると以下のような表示ができる。※JavaScriptで表現。日本語環境ではバックスラッシュ(\)が円マーク(¥)で表示される場合がある。その場合は別の表現方法を考えたほうが良いだろう。...の点の数を変化させる、点の位置を変化させるなど、いろいろと表現方法があるだろう。エスケープシーケンス(ANSIエスケープコード)を使う方法がある。詳しくは、説明ページを参照して欲しいが、以下のコードでポイントは\033[2Aの出力だ。これはカーソルを2行上に移動させるという意味になる。0;}実行すると以下のような表示ができる。※JavaScriptで表現。テキストで表示できるものであればほぼ何でもありになる。この出力のためにリソースを使って待ち時間が伸びるようなことがあれば本末転倒だ。遊び以外ではあまりやり過ぎないようにしよう。以上、コンソールでのプログレス表示の方法について紹介した。お手軽に「それっぽい」プログラムが作れるということで、モチベーションアップにもなるのではないだろうか。他にもいろいろと表現方法があると思うので、いろいろとためしてみると面白いだろう。更新情報2018/07/28lsっぽいコマンドを作る13アップしました。2018/07/13lsっぽいコマンドを作る12アップしました。2017/01/04lsっぽいコマンドを作る11アップしました。2017/01/03lsっぽいコマンドを作る10アップしました。(https://commoncrawl.org/faq/)。