未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

自分のhistoryを分析する。DevLoveターミナル勉強会に行ってきた

CUI(Command User Interface)というのはGUI(Graphical User Interface)と異なってコマンドを覚えなくちゃいけないし、コマンドをタイプしなくちゃいけないので、初心者にはちょっととっつきにくい。

コンピュータとの操作をGUIの時代からやっている人にとっては面倒な使いにくいものなのかもしれないが、CUIにはCUIのよさがある。それを伝えてみたい。

CUIのコマンドは自分の意志をコンピュータに伝える言葉である。CUIはそのコマンドを記録することが簡単にできる。なんといっても文字だから簡単に分析できる。

自分はコンピュータに何を語っているか。自分は日々何をしているのかを知ることが自分の作業を知る第一歩となる。

例えば、プログラムを作るということを生業にしているのであれば、コードを書いて、コンパイルして、テストをして、デバッグをして、という作業を繰り返すことになる。それは、エディターを開いて、コードを書いて、ファイルに保存して、makeしてなどなどをコマンドとしてコンピュータに伝えることになる。

Unix系のOSであれば、$ emacs; $ make; $ make test; みたいなコマンド列になるかもしれない。このようなコマンド列を分析していけば、自分の作業をマクロに観測することができて、自分の作業を理解し、言語化して、ひょっとしたら誰かにその作業知識を伝えられるようになるかもしれない。

実際、一日の作業をemacsのshellモードで行い、最後にそのログをコピペして作業日誌とするなどということは気の利いたプログラマなら普通にやっている。作業手順書を作るのも、同様に行える。

そのような作業日誌をとっておけば、〜する作業なんていう頻繁にはないけど、時々発生する作業について、前回やった作業を参考にパタパタ同じコマンドを叩けば実行できたりして、再度調べ直す手間を省けて便利である。GUIだと、同じ作業を繰り返す場合、同じ回数クリックしなくちゃいけないが、CUIだとコマンドをコピペしたり、あるいはコマンドを組み合わせてスクリプトを作ったりすることが簡単にできる。

定型的な作業を一まとめにしたものがshell scriptであったり、makefileであったりする。

日々の作業についてhistoryをみてみよう。historyコマンドは文字通りUnixコマンドの履歴を表示する。これを読めば過去自分がどのような作業をしたか一目瞭然である。

個人持ちのネットブック(Ubuntu 10.04)で自分のコマンドを分析してみた。会社のマシンだと若干傾向が違ったりする。

$ history|tail
 1998  cd memo/
 1999  ls
 2000  gedit d110919
 2001  gedit d110919 2>/dev/null &
 2002  uname -a
 2003  ls /etc
 2004  less /etc/issue
 2005  emacs&
 2006  history|head
 2007  history|tail

まず、コマンドを取り出す。

$ history|cut -d' ' -f 4|tail
ls
gedit
gedit
uname
ls
less
emacs&
history|head
history|tail
history|cut

というような感じになる。ここでcutコマンドを利用して空白区切り(-d' ')で4欄目(-f 4)を取り出している。OSによっては-fの値が異なるかもしれない。

自分が利用しているコマンドの利用頻度を測ってみよう。

$ history|cut -d' ' -f 4|sort|uniq -c|head
      1 ./configure
     17 acroread
      3 alias
      3 ascii
      1 bash
      6 cat
    115 cd
      1 cd..
      1 chmod
      5 cp

コマンド名でソートして頻度をuniq -cで測る。

多い順にソートしてみる。

$ history|cut -d' ' -f 4|sort|uniq -c|sort -nr|head
    313 ls
    115 cd
     72 history|cut
     64 time
     43 soffice
     39 git
     38 ping
     33 man
     26 mv
     17 acroread

わたしはlsとcdを多用していることがよくわかる。history|cutが多いのはこのネタを仕込むためにあれやこれややったからであるw

timeが多いのは何か作業をするときの実行時間を計測するためである。timeで何を計測しているかは、$ history|grep timeして同様に分析すればいい。

ここまでやってきて、普通パイプ(|)を使ってコマンドを組み合わせるだろう、そのコマンドについて分析していないではないかと思う。そのとおりだ。

$ history|cut -d' ' -f 4-|sed -e "s/|/\n/g"|cut -d' ' -f 1|sort|uniq -c|sort -nr|head
    313 ls
    113 cd
    108 history
    107 cut
     94 head
     76 sort
     64 time
     63 less
     43 soffice
     42 grep

これでみると、cut, head, sort, less, grepなどのコマンドをパイプの後で使っているのがよくわかる。

sed -e でパイプ(|)を改行(\n)に変換して、A|BをAとBに分割している。

実際、わたしは、$ ls -lt|headというコマンドをよく使う。

Unix系OSのすごいところはこのパイプをつなぎ合わせる事で、プログラムすることなく、あれやこれや処理ができることだ。Unixの達人はプログラムを書かない。コマンド(プログラム)を組み合わせる。

自分がよく使うコマンドについて公開して、いろいろ議論をすることは、自分の知らないもっといい方法を学ぶきっかけになると思う。このような形で緩やかに情報を共有することは初心者のみならず、エキスパートの人々にとっても自分のスキルをチェックするいい機会となる。

みなさんもどーぞどーぞ。