自分の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の達人はプログラムを書かない。コマンド(プログラム)を組み合わせる。
自分がよく使うコマンドについて公開して、いろいろ議論をすることは、自分の知らないもっといい方法を学ぶきっかけになると思う。このような形で緩やかに情報を共有することは初心者のみならず、エキスパートの人々にとっても自分のスキルをチェックするいい機会となる。
みなさんもどーぞどーぞ。