• 検索結果がありません。

知っていると便利な macOS 特有のコマンド

*11http://akenox.dip.jp/index.php?Translations%2FMac%20OS%20X%20Key%20Bindingsに詳しい解説がある。

*12Lionからは「Save As. . .」が「Duplicate」などに置き換わってしまったため、コードC.1の設定をしてもC-x C-wは動作しません。

98

付録 D configure Make

macOSやLinux環境でソフトウェアを導入する時、インストールの方法は主に3つあります。1つ目は、C.6で説明

したようなパッケージ管理ソフト*1を使う方法す。2つ目は、既にコンパイル済みでバイナリ配布されているソフトを 導入する方法です。例えば、KeyRemap4MacBookをインストーラを使ってインストールしたのがこれに当たります。

また、ROOTを入れる場合でもバイナリ配布されているものを使うことが可能です。3つ目は、ソースコードの配布 されているソフトウェアを自分でコンパイル(compile)する*2方法です。これは2.1でROOTの導入として説明しま した。

自分でソフトウェアをソースコードからコンパイルする場合、標準的なやり方が存在します。また、研究で通常使う ソフトウェアの多くがこの標準的な方法に則して作成されています。そのためここで説明する方法を覚えておけば、多 くのソフトウェアを自分で簡単にインストールできるようになります。

このやり方を覚えるために、「GNU Hello*3」と呼ばれるソフトウェアを試しにインストールしてみましょう。この

「GNU Hello」は標準的な方法を学ぶ上で最適なもので、インストールしても実用性はありません。

まず、次のコマンドでhttp://ftp.gnu.org/gnu/hello/から最新版のhello-2.8.tar.gzを落としてき て展開します。展開されたディレクトリに移動してlsで中身を見てみましょう。

$ curl -O http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 681k 100 681k 0 0 150k 0 0:00:04 0:00:04 --:--:-- 166k

$ tar zxf hello-2.8.tar.gz

$ cd hello-2.8

$ ls

ABOUT-NLS INSTALL THANKS configure.ac man

AUTHORS Makefile.am TODO contrib po

COPYING Makefile.in aclocal.m4 doc src

ChangeLog NEWS build-aux lib tests

ChangeLog.O README config.in m4 GNUmakefile README-release configure maint.mk

ここで重要なのは、README、INSTALL、configureの3つです。READMEは、そのソフトウェアに関する全般 的な説明が書かれています。INSTALLには、そのソフトウェアのインストール方法が書かれています。lessコマン ドなどで、試しに中身を読んでみて下さい。

$ less README

$ less INSTALL

*1macOSではMacPorts、Fink、Homebrewなど、LinuxではYumAPTなど。

*2ビルド(build)するとも言います。

*3http://www.gnu.org/software/hello/

付録D configureとMake 99

configureはシェルスクリプトで、そのソフトウェアをコンパイルするときに必要なライブラリやコマンドが存在 するかどうか、存在するパスはどこか、OSの環境は何かを自動的に調べて必要な設定をしてくれます。また、必要に 応じてユーザが様々なオプションを指定することができます。どのようなオプションがあるかは、次のようにヘルプを 表示することで読むことができます。

$ ./configure --help

様々なオプションが表示されますが、このうち最も頻繁に使われるのがインストール先の指定のオプション --prefixです。次のようにconfigureを実行することで、helloコマンドを/usr/local/binにインストー ルし、またマニュアルを/usr/local/share/man/man1にインストールします。もし/usr/localの代わりに他 の場所をしていすれば、これらのファイルは指定した場所の下にインストールされます。

$ ./configure --prefix=/usr/local

configureが問題なく実行されれば、Makefileというファイルが新たに生成されているはずです。このファイ ルの中には、そのソフトウェアをどのような手順でコンパイルすれば良いかが全て書かれています。ユーザはどのよう なソースコードがあるのかなどを気にする必要はありません。このMakefileの手順の通りに自動的にソフトウェア をコンパイルするには、以下のコマンドを打つだけです。

$ make -j 4

makeコマンドがMakefileの中身を自動的に調べ、そこに書かれている手順を追ってコンパイルを行います。-j 4のオプションは、使っているCPU能力を最大限に引き出すためのものです。この場合、4コアのCPUを全て使って くれます。

これで必要なファイルが全て生成されたので、最後にインストール作業を行います。通常は/usr/localにインス トールする場合に管理者権限が必要なので、次のコマンドを実行します。

$ sudo make install Password:

これで、/usr/local/bin/helloなどが配置されたはずです。では、確認のためhelloを実行しましょう。

$ hello Hello, world!

どのようなオプションを渡せるかは、--helpや-hをつけて確認します。

$ hello -h

Usage: hello [OPTION]...

Print a friendly, customizable greeting.

-h, --help display this help and exit

-v, --version display version information and exit -t, --traditional use traditional greeting format -n, --next-generation use next-generation greeting format -g, --greeting=TEXT use TEXT as the greeting message Report bugs to: [email protected]

GNU Hello home page: <http://www.gnu.org/software/hello/>

General help using GNU software: <http://www.gnu.org/gethelp/>

付録D configureとMake 100 またhelloコマンドのマニュアルを見るにはmanコマンドを使います。

$ man hello

101

付録 E 本文で登場した ROOT スクリプトの PyROOT

ここでは、本文中で登場したROOTスクリプトをPyROOTで書き換えた例を掲載します。foo.CというROOTス クリプトであれば、foo.pyというPyROOTスクリプトにしてあります。

コードE.1 population.py 1 import ROOT

2

3 def population():

4 global hist, can, leg

5 fin = open(’population.dat’) 6

7 kBinsN = 21

8 hist = []

9

10 names = fin.readline().split(’\t’) 11

12 for i in range(len(names)):

13 hist.append(ROOT.TH1D(names[i], names[i], kBinsN, 0, 105)) 14

15 for i, line in enumerate(fin.readlines()):

16 data = line.split(’\t’) 17 for j in range(len(hist)):

18 hist[j].SetBinContent(i + 1, float(data[j])) 19

20 can = ROOT.TCanvas(’can’, ’histogram’)

21 can.DrawFrame(0, 0, 105, 10, ’Population by Age;Age;Population per 5-year Generation (%/5 year)’)

22

23 leg = ROOT.TLegend(0.65, 0.7, 0.85, 0.85) 24 leg.SetFillStyle(0)

25

26 kColor = (ROOT.kGray + 1, ROOT.kRed - 4, ROOT.kBlue - 4) 27

28 for i in range(len(names)):

29 hist[i].Scale(100./hist[i].GetEffectiveEntries()) 30 hist[i].SetLineColor(kColor[i])

31 hist[i].SetFillColor(kColor[i]) 32 hist[i].SetBarWidth(0.28)

33 hist[i].SetBarOffset(0.08 + 0.28*i) 34 hist[i].Draw(’bar same’)

付録E 本文で登場したROOTスクリプトのPyROOT版 102

35 leg.AddEntry(hist[i], hist[i].GetTitle(), ’f’) 36

37 leg.Draw()