17歳からのプログラミング入門。

情報系の門の先で起きたことをたまにメモ。

コンマ以下に生きる人のためのかっこいい時計のご紹介

おはようございます。 朝です。気づいたら朝です。

今日でインターンシップに来てから3週間になりますが、今日ももれなくお仕事です。 職場で寝てしまっても優しく布団をかけてくれる社員さんがいることを願っています。


さて、今日は、時の流れを感じられる、おしゃれな時計のご紹介です。

f:id:Iruyan_Zak:20160909064732g:plain

良いですよね、良さを感じますよね、ね? デスクトップにおいておくだけでいつでも時間に追われる感覚を味わえます。

・・・え?そんなことはいいから早く作り方を教えろって?

わかりました。 以下がプログラムです。bash上で動作しています。

#! /bin/bash

while true
do
# sleep 0.32
echo -ne \\r$(date +%T.%N)
done

ね、簡単でしょ? 一応説明しておきます。

  • while true
    while は、後続のコマンドが 0 (真)を返し続ける限り、 dodone に囲まれた内容を実行します。
    true は、すぐに 0 を返すだけの何もしないコマンドです。
    よってこれは無限ループを表します。
  • echo -ne \\r
    echo は引数をすべて(オプションを除く)標準出力に吐き出します。
    -n のオプションは、出力後に改行を行いません。
    -e のオプションは、エスケープシーケンスの出力を有効にします。
    \\r 、すなわち '\r' は、キャリッジリターンと言って、カーソル位置を行頭に戻します。
    よって、ここまでで、「出力を同じ行の行頭から流すことで書き換えを実現」したことになります。
  • $(date +%T.%N)
    $(command args) は、 command args を実行した時の標準出力に置き換えられます。
    例えば、 echo $(echo hoge) は、
    $(echo hoge)echo hoge の標準出力 hoge に置き換えられ、
    結果として全体は echo hoge と等価になります。
    今回は $(date +%T.%N)date +%T.%N の標準出力に置き換えられます。
    date コマンドは、現在の時刻を表示したり設定したりできるコマンドです。
    + で始まるフォーマット指定文字列を引数に与えてあげると、現在の時刻の表示方法をカスタマイズすることができます。
    今回は +%T.%N なので、 HH:MM:SS.mmmμμμnnn という形式で時刻を表示してくれます。

つまり、無限に同じ行に時刻を吐き出し続けることでめまぐるしく変わるナノ秒単位の時計を実現している、ということなのです。(実際ナノ秒までの精度はないはず)

ところで、お察しの通りめちゃくちゃ重いです。無限ループ回してますからね。 ということで、コメントアウトしている sleep コマンドを挿入することで、処理回数を減らすことができます。 かっこよさは少し減りますが、CPU使用率は結構削れます。

それでは、良いシェルライフを!