グラフィカルユーザインタフェイス(Graphical User Interface;略してGUI)とは1970年初頭に提案されたデスクトップメタファ(机の上での事務作業のなぞらえたもの)です。実際の事務作業においては、机上にさまざまな書類が散乱しがちです。それをフォルダやバインダーに挟んで整理し、それを引き出しや整理戸棚がそろったオフィス家具に収納することで事務の効率を向上しています。これに倣ってデジタルデータにファイルのアイコンという見掛けを与えるファイルのメタファ、ファイルに保存された情報を束ねるフォルダのメタファを通してコンピュータの上でも効率的に情報を整理する方式がグラフィカルユーザインタフェイスの一面です。
グラフィカルユーザインタフェイスの実現のために、ビットマップディスプレイとマウスに代表されるポインティングデバイスが考案されました。
では、70年代以前のコンピュータはどうだったのかというと、もちろんファイルやフォルダに類する概念はあったのですが、それが絵として見えるようにはなってませんでした。だいたいどんな感じかというと
昔のコンピュータには絵をきれいに表示するのに不可欠な高解像度ディスプレイもその上でユーザの意図を指し示すためのマウスもなかったので、なにからなにまでキーボードを利用してコンピュータに指示をだしていたのです。このような昔風のコンピュータとの対話の仕方のことを文字型のインタフェイスと呼ぶことがあります。
「なにそれ、文字型のインタフェイスって、50年も昔のことを言っているの?そんなの今どき、使うわけないでしょ。なんのアナクロ。もしかして罰ゲーム?」とか言いたくなる気持ちはわかりますけれど、CUIは今もプロフェッショナルな世界では厳然と利用され続けています。そして、ときとして現代的なGUIよりも遥かに効率的に仕事を進めることができます。それが回顧主義でも、罰ゲームでもなく、この授業でCUIを取り上げる理由です。
CUIを用いることで以下のようなことがあっという間に遂行できます。
100個のセンサーから毎時送られるデータがあったとします。これを金曜の晩に、整理するのがあなたの仕事です。一週間で100 * 24 * 7 = 16,800個のファイルがあるので人間技とも思えません。手作業でやっていては間違いも起きやすいですし、土曜日のデートも望むべくもありません。
センサーごとのフォルダにきれいに分類するのはCUIを用いればあっという間なのに。。。
上司がこともなげに月曜日までにセンサーごとにデータを集計してグラフにまとめるように指示を出しました。上の例では各センサーは、一週間で24*7=168個のデータを送ってきます。これを手作業で折れ線グラフにした画像ファイルを各センサーごとに作成するんですか。これで日曜日の予定もパーです。
CUIを用いれば、これもあっという間なのに。。。
今度は研究所長からの急な依頼です。昨晩、明らかになったセンサーの異常に関して、研究所に急な取材があるので100個のセンサーからやってくるデータを2時間以内に統合してグラフにまとめて欲しいと言ってます。完全な無理ゲー!
CUIを知っているか否かが、あなたの研究者生命を左右することもあるんです。大したことはないから、早いうちに親しんでおくと安心ですよ。
CUIを用いるもうひとつの恩恵は、遠隔のコンピュータのアクセスが容易な点です。遠隔のコンピュータなんて操作しないと思うかもしれませんけれども、自然科学の大規模共同研究、生命科学のゲノム情報の解析、工学分野や社会システムのシミュレーションでビッグデータを扱うことは普通のことになっています。そのビッグデータを扱うために遠隔の強力なコンピュータの利用は不可欠です。この点からもCUIが利用できることは専門分野においてあなたのプレゼンスを差別化するポイントになります。
Macのユーティリティにターミナルと呼ばれるものがあります。CUIを用いるときはターミナルを立ち上げて、そこに適切なコマンドを入力することによって操作を行います。
ユーティリティフォルダを開く方法については、すでに学びました。
Windowsにもcmd.exeという、ターミナルに類似のユーティリティがあります。Windows 10でcmd.exeを起動するには、Windows-Sで表示される画面でcmdと入力して下さい。 WindowsとMacではコマンドの体系が大きく異なります。Macで利用可能なコマンドはWindowsでは動きません。Windows 10の大幅改訂時には、Macと類似したコマンド体系がWindowsに導入されるという噂もあったのですが、、、
cal
コマンドcal
コマンドを試してみましょう。
cal
コマンドの実行結果cal
コマンドはこの月のカレンダーを表示します。(この部分は2018年の6月に書かれたのでこのような表示になっていますが、みなさんの手元では違う年月のカレンダーが表示されているはずです。)
ターミナルで利用できるコマンドは、今のcal
コマンドのように単純に実行するだけでなく、しばしばコマンド名に続けて引数(ひきすう)を与えることがあります。たとえば、cal
コマンドに2018
という引数を与えてcal 2018
を実行してみましょう。
cal 2018
コマンドの実行結果今度は年間カレンダーを表示できました。
cal
コマンドはさらに二つの引数をとることができます。最初の引数が月、残りが西暦にあたります。この機能を使えば、あなたが生まれた月のカレンダーを眺めることができますよ。
cal 7 2018
コマンドの実行結果オマケ(なんじゃこりゃ?)
cal 9 1752
コマンドの実行結果西暦1752年にそれまで利用していたユリウス暦から、グレゴリウス暦に以降することで長年にわたって閏年を無視してきたつけを開放したんですが、こんな無茶なことをやったんですね。
ここまでのまとめ
ターミナルのコマンド実行では、先頭にコマンドの名前を指定する。
コマンドに引数を与えるときには、コマンドや引数を空白で区切る。
bc
コマンド実行してちょっと嬉しいコマンドの例の第三弾としてbc
コマンドを紹介します。このコマンドは簡易電卓のコマンドです。cal
コマンドはカレンダーを表示したらすぐに終りました。一方、bc
コマンドは電卓で計算するための数式を計算し続けます。quit
を受け取るまではbc
コマンドはひたすら、あなたの忠実な計算機として働きます。
$ bc -l
10^8
100000000
sqrt(2)
1.41421356237309504880
c(5)^2 + s(5)^2
.99999999999999999998
e(0)
1.00000000000000000000
e(1)
2.71828182845904523536
l(e(5))
4.99999999999999999999
quit
bc
(basic calculator)は簡易電卓です。bc
コマンドを実行するときに,上の例のように-l
引数を指定するといくつかの関数が利用できるようになります。案外便利です。
関数の名前 | 役割 |
---|---|
sqrt(x) | 平方根 |
c(x) | cos |
s(x) | sin |
e(x) | exp (指数関数) |
l(x) | log (対数関数) |
前述のとおり、上の例の最後にあるquit
は電卓の終了を指示しています。
ファイルの名前の変更、複製、コピー、ペーストは簡単です。いくつかの方法があります。
ファイルの操作 | コマンド | 使用例とコマンド使用の意図 |
---|---|---|
名前の変更 | mv A B |
mv output.data 2016-06-25-xray-ab.csv output.data という名称では後々、混乱しないようにファイル名に日付と実験内容を記録することにした。 |
複製 | cp A A' |
cp IMG01234.JPG 2016-06-25-telescope.jpg デジカメから取り込んだ望遠鏡の写真に日付と内容がわかるように名前をつけた |
削除 | rm A |
rm IMG01234.JPG 不要になったファイルをいつまでも残しておくと混乱するので、明らかに無駄なファイルは削除しておく。いったん rm コマンドを実行して削除したデータは復元できないので、十分に気をつけて実行すること。 |
コピー | pbcopy < A |
pbcopy < page1999-pagerank.pdf 今はGoogleの社長になっているPageとBrinが書いた博士論文をコピーする |
ペースト | pbpaste > B |
pbpaste > google-paper.pdf コピーされた内容を pbpaste するとコピーした内容が google-paper.pdf という名前のファイルで保存される |
テキストファイルの内容の表示 | cat A |
cat fig5.plot fig5.plot という名前のテキストファイルの内容を確認するために表示する.指定されたファイルがテキストファイルでない場合は謎の記号の羅列を見せられて焦る.指定されたファイルが巨大で,たとえば,何万行もあるとそれらすべてを表示する間,なにもできないので泣きたくなる. |
ターミナルでCUI環境を利用しているときでも、画像を見たくなったり、ワープロを起動したくなることはあります。そんなときに、open
コマンドは便利です。基本的にはopen -a アプリ名 ファイル名
で指定したファイルを指定したアプリケーションで開くことができます。
操作 | コマンド | 使用例とコマンド使用の意図 |
---|---|---|
JPEG画像を開く | open A.jpg |
open 2016-06-25-telescope.jpg 標準の画像ビューアのプレビューが写真を表示する |
PDF文書を開く | open A.pdf |
open google-paper.pdf 標準のPDFビューアのAdobe Acrobatが文書を表示する |
PDF文書をプレビューで開く | open -a preview A.pdf |
open -a preview google-paper.pdf Adobe AcrobatではなくプレビューでPDFファイルを開く |
テキストファイルを開く | open A.txt |
open memo.txt すでにmemo.txtというファイルが存在するときに、このコマンドを実行すると、標準のテキストエディタでこのファイルを開く。まっさらなMacの場合、標準のテキストエディタはテキストエディットなので、文字化けを生じる可能性がある |
テキストファイルを指定したテキストエディタで開く | open -a T A.txt |
open -a coteditor memo.txt CotEditor を使ってテキストファイルを開く。他のテキストエディタを用いる方法は後述のとおり。 |
フォルダを表示する | open DIR |
open . 作業ディレクトリに対応するフォルダを Finder で表示する.(. の意味と作業ディレクトリについては後述)open Desktop 作業ディレクトリに含まれる Desktop という名前に対応するフォルダを Finder で表示する. |
open -a atom A.txt
open -a coteditor A.txt
open -a aquamacs A.txt
open -a 'sublime text' A.txt
注:Sublime Textのように名称に空白を含むアプリケーションについてopenコマンドを利用するときは、そのままでは空白がコマンドの引数の区切りと解釈されてしまいます。そのような事故を避けるためにこのように引用符を用います。open -a macvim A.txt
ディレクトリとはCUIの世界でフォルダを意味するものと思って下さい.GUIの世界におけるファイルとフォルダとCUIの世界におけるファイルとディレクトリは概ね似たようなものです.GUIの世界のフォルダに親子関係があるようにディレクトリにも親子関係があります.GUIの世界では,子フォルダを開くときは子フォルダをクリックしたりダブルクリックしました.CUIの世界で子フォルダを参照するときには,/
, ..
, ~
, .
などといった記号を用いた独特な記法を使います.
Finderを使っているときには,Finderのウィンドウに現在,見ているフォルダの情報としてファイルのリストが表示されます.この「現在,見ているフォルダ」を,CUIの世界では作業ディレクトリと言います.作業ディレクトリがホームディレクトリのときに,あるファイル名を指示すると,それはホームディレクトリに含まれているファイルを意味します.ほかのディレクトリに同名のファイルがあるかもしれませんが,そちらではなく,ホームディレクトリにあるものを指します.CUIの世界では,作業ディレクトリを基準としたパスという記法によって,操作対象のファイルを指定します.
Finderで新しいウィンドウを開くとたぶんホームフォルダが開くと思います.同様に,ターミナルの新しいウィンドウを開くと,その時点での作業ディレクトリはホームディレクトリ(ホームフォルダに対応したディレクトリ)です.ここで ls
コマンドという,ディレクトリが含んでいるファイルのリストを表示するためのコマンドを実行すると,ホームディレクトリに含まれるファイルやディレクトリが表示されます.以下は私のノートパソコンで実行した結果です.
Applications
Desktop
Documents
Downloads
Dropbox (smartnova)
Dropbox (個人)
Software
Library
Movies
Music
Pictures
Public
VirtualBox VMs
anaconda3
bin
projects
tmp
var
Finderの表示と見比べると微妙な違いに気づくかと思います.まず,Finderにはダウンロード,パブリック,ピクチャ,ミュージック,ムービー,文書というフォルダが表示されますが,ls
コマンドが表示したファイルには表示されません.でも,よくよく見てみると英語名で対応するディレクトリがあります.
Finderに表示されるフォルダの名前 | lsが表示するディレクトリの名前 |
---|---|
ダウンロード | Downloads |
パブリック | Public |
ピクチャ | Pictures |
ミュージック | Music |
ムービー | Movie |
文書 | Documents |
アプリケーション | Applications |
ユーティリティ | Utilities |
ライブラリ | Libraries |
実は,MacOSにおける標準的なフォルダの実体の名前は英語名なんです.でも,システムの言語環境を英語以外に設定すると,その本当の名前はFinderの上では隠されて,各国語に翻訳されたものが表示されます.逆にターミナルを使っているときは,翻訳される前の英語名が表示されます.
もうひとつの違いは,ファイルの表示順です.基本的にはどちらもアルファベット順なのですが,ターミナルでは大文字で始まるファイル名に続いて小文字で始まるファイル名が表示されます.一方,Finderでは大文字と小文字の区別はせずにアルファベット順となっています.
MacやWindowsのように異なる言語圏の人々が共通に利用しているシステムの場合,どこかで翻訳されていない生の姿が見えたりするものです.これを機会に翻訳という便利な仕組みを享受しつつ,翻訳の皮がはがれたときに必要以上に驚かないでいたいものです.
さて,ターミナルでファイルのありかを指し示すときには /
という記号を用います.この記号の意味は「〜という名前のディレクトリのなかにある」と解釈できます.たとえば,il2a-data/he1/time-join.dat
という記述は,「il2a-data
という名前のディレクトリのなかにある,he1
という名前のディレクトリのなかにある,time-join.dat
という名前のファイル」と解釈できます.
ファイルのありかを指し示すのに用いる記号には/
のほかにもいくつかあります.以下に紹介します.
記号 | 記号の意味 | 例 |
---|---|---|
ファイル名 |
作業ディレクトリにあるファイル | 作業ディレクトリにtime-join.data というファイルがあったとき,time-join.data という名前はそのファイルを指し示します. |
/ |
ルートディレクトリ | / |
/A |
ルートディレクトリ直下のAディレクトリ | /Applications |
/A/B |
/A ディレクトリの子供のBディレクトリ |
/Applications/Utilities |
.. |
作業ディレクトリの親ディレクトリ | 作業ディレクトリが /Users/wakita/work/il2a-data/he1 のとき,.. は/Users/wakita/work/il2a-data を指し示します. |
../.. |
作業ディレクトリの親の親 | 作業ディレクトリが /Users/wakita/work/il2a-data/he1 のとき,.. は/Users/wakita/work を指し示します. |
~ |
ホームディレクトリ | ~ はあなたのホームディレクトリを指し示します. |
. |
作業ディレクトリ | ./ |
以下のようなフォルダの構造があることにしましょう。このフォルダ構造の上のあちこちに作業ディレクトリを変更しながら作業することを想定したコマンドを紹介します。基本的にはcd
コマンドしか使わないのですが、使い方によってフォルダ階層のさまざまなフォルダに簡単に移動できることがわかります。
操作 | コマンド | 使用例とコマンド使用の意図 |
---|---|---|
ここはどこ? | pwd |
Print working directory; 今、作業しているディレクトリのパスを表示 |
ホームディレクトリに戻る | cd |
迷子になって困ったら、ひとまずホームに戻る |
作業ディレクトリをホームにする | cd ~ |
~ はホームディレクトリの省略記法です。ですので、このコマンドは作業ディレクトリをホームにすることにあたります。 |
子供のディレクトリに移動 | cd D |
cd plot 作業ディレクトリが /Users/wakita/work/il2a-data だとしたら、実行後の作業場所は/Users/wakita/work/il2a-data/plot になる。 |
親のディレクトリに移動 | cd .. |
作業場所を親ディレクトリにする。作業ディレクトリが/Users/wakita/work/il2a-data/plot だとしたら、実行後の作業場所は/Users/wakita/work/il2a-data になる。 |
親の親のディレクトリに移動 | cd ../.. |
作業場所を親の親ディレクトリにする。作業ディレクトリが/Users/wakita/work/il2a-data/plot だとしたら、実行後の作業場所は/Users/wakita/work になる。 |
兄弟のディレクトリに移動 | cd ../A |
cd ../he1 作業場所を兄弟ディレクトリにする。作業ディレクトリが /Users/wakita/work/il2a-data/plot だとしたら、実行後の作業場所は/Users/wakita/work/il2a-data/he1 になる。 |
移動のためのコマンド | 例 |
---|---|
mv image.png .. |
作業ディレクトリにあるimage.png という名前の画像を親ディレクトリに移動します. |
mv ./image.png .. |
上のコマンドと同じです../ を用いることで「ここにある」を強調しているんでしょうか |
mv ../image.png . |
作業ディレクトリの親ディレクトリにあるimage.png という名前の画像ファイルを作業ディレクトリ(. )に移動します. |
mv image.png ../new-image.png |
作業ディレクトリにあるimage.png という名前の画像ファイルを親ディレクトリにnew-image.png という名前に変えつつ移動します. |
ファイルだけでなくディレクトリを移動するときもmv
コマンドを使います.ディレクトリを移動すると,ディレクトリが含んでいるファイルやディレクトリも一緒に移動します.
便利な機能ですけれども,うっかりするとディレクトリ構造が思いがけずに壊れてしまいますから慎重に作業しましょう.mv
コマンドの使い方はファイルの移動に用いた方法と一緒なので,説明は省略します.
操作 | コマンド | 使用例とコマンド使用の意図 |
---|---|---|
作成 | mkdir D |
mkdir data 作業ディレクトリには,まだ data という名前のディレクトリが存在していないとしよう.このときこのコマンドを実行すると,サブディレクトリとして data が作成される.mkdir data/xray 作業ディレクトリには, data ディレクトリが存在するけれど,まだdata/xray ディレクトリは存在しないときにこのコマンドを実行するとdata ディレクトリのサブディレクトリとしてxray ディレクトリが作成されます. |
ディレクトリ階層の作成 | mkdir -p D/E/F |
mkdir -p data/xray 作業ディレクトリには data がないとき,したがってdata/xray サブディレクトリもないときに,mkdir コマンドの-p オプションを用いると,これら二つのディレクトリを一気に作成できます. |
名前の変更 | mv D1 D2 |
mv data xray-data 作業ディレクトリに data ディレクトリがあって,xray-data というディレクトリが存在しないとき,data ディレクトリの名称をxray-data に変更します.mv xray-data data/xray 作業ディレクトリが data サブディレクトリとxray-data サブディレクトリをともに持つときに,後者をxray という名前でdata のサブディレクトリにする. |
削除 | rm -rf D |
rm -rf temporary 作業ディレクトリが temporary サブディレクトリを含むときに,
そのサブディレクトリに保存されているすべてのファイルとも丸っと削除する.使い方を間違えるととても悲しいことになります.rmdir temporary はディレクトリ内にサブディレクトリやファイルがあるときはエラーが出ます. |
移動 | mv D1 D2 |
mv xray-data data 作業ディレクトリにふたつのサブディレクトリ xray-data とdata があるときに,前者を後者のサブディレクトリに移動します. |
複製 | cp -r D1 D2 |
cp -r data/xray backup/xray/2017-06-14 作業ディレクトリに data/xray サブディレクトリが存在するときに,それそのサブディレクトリが抱えているすべてのファイルとも丸っと複製して,backup/xray/2017-06-14 という名前のサブディレクトリとして保存します. |
コマンドを覚えきれない人が無理にコマンドを使うと,ディレクトリを丸ごと削除してしまうかもしれません.Finderからの作業の場合は,編集メニューを使って,作業のやりなおしができますけれども,コマンドのやりなおしはできません.不慣れなうちは,ディレクトリの操作にはFinderを用いるのが懸命かもしれません.この場合,前述の open .
コマンドが便利です.