Computing Practice
目次
はじめに
このページで紹介するのは、Linuxを使う上で自分の個人的な習慣をまとめたものである。
解析プロジェクトの準備(例)
実験データ解析やシミュレーションをLinux上で行う際の環境の整え方の一例を挙げる。 ここで紹介する方法は、作業用ディレクトリを一つ用意してその中で
- 独自のコードを開発
- ROOTを使ったデータ解析
を行うことを想定する。ここでは作業用のディレクトリを<myWorkSpace>と呼ぶことにして説明する。 実際には、/nfs/space1/<user>等の領域を用いるとよい。
以下のようなディレクトリ構造を用意する。
<myWorkSpace>/ sw/ dev/ build/ scripts/ macros/ figures/ work/ data/
それぞれのディレクトリの用途は次のようである。
ディレクトリ |
用途 |
dev |
開発中のソフトウェアのソースコード管理。この下にパッケージ毎にディレクトリを作る。 |
sw |
自分で開発したソフトウェアのインストール先 |
build |
cmakeを使ってコンパイルする場合にコンパイル作業を行うためののディレクトリ。 |
scripts |
様々なスクリプトを置く。初期環境設定用のスクリプトscripts/setup.shを置く。 |
macros |
ROOTのマクロ |
figures |
作成したプロットや図を置く。 |
work |
解析の途中で生成したデータファイル等を置く。 |
data |
実験データやシミュレーションデータ等の大容量のデータを置く。 |
初期環境設定用のスクリプト(scripts/setup.sh)
Linuxのコマンドライン・インターフェースで作業する上で、いくつかの環境変数や別名を定義しておくと便利である。Linuxでコマンドライン・インターフェースを用いる際には裏でシェルと呼ばれるプログラムが走っていて、このプログラムが入力した文字列を解釈して適切なプログラムを実行してくれる。ターミナルを開いたり、別のコンピュータにログインしたりした時にもシェルが実行されている。シェル用のプログラムにはいくつかの種類があるが、ここではZ-shell(zsh)を想定して説明する。
シェルの設定ファイルをscripts/setup.shに用意して、以下の内容を記述する。
wdir=<myWorkSpace> export SWDIR=${wdir}/sw export PATH=${SWDIR}/bin:${PATH} export LD_LIBRARY_PATH=${SWDIR}/lib:${LD_LIBRARY_PATH}
環境変数SWDIRは、ソフトウェアのインストール先として個人的にMakefileの中で使っていることが多いので、ここで定義しておく。 PATHとLD_LIBRARY_PATHは、プログラムの実行時にコマンド名から、プログラムの実行可能ファイルや共有ライブラリを探索するためのディレクトリのリストである。
環境設定を行うには、シェルを立ち上げてから一度だけ次のコマンドを実行する。
source ./scripts/setup.sh
シェルで起動したプログラムには環境変数が受け継がれ、プログラムの中で環境変数の値を参照することが可能である。 ここで使っているsourceというコマンドは指定したファイルの中身を直接手で入力したのと同じ効果を持つ。これによって、シェルに対して環境変数SWDIR, PATH, LD_LIBRARY_PATHを設定でき、これらの環境変数が他のプログラムからも利用可能になる。
便利な初期設定情報
特定のプロジェクトに関わらない便利な設定は、~/.zshrcというファイルに記述しておくとよい。このファイルは、シェルが立ち上がる度に自動的に読み込まれる。
DIRSTACKSIZE=20 set autopushd # alias start_ssh_agent= alias root='root -l' # Japanese input method export GTK_IM_MODULE=ibus export XMODIFIERS=@im=ibus export QT_IM_MODULE=ibus # ROOT export ROOTSYS=/nfs/opt/root-v5-34-32 a=$(pwd); cd $ROOTSYS; source ./bin/thisroot.sh; cd $a export OCHA_SVN=svn+ssh://hpx.phys.ocha.ac.jp/var/svn/repos
Subversion
ソースコードのバージョン管理用のツールである。よく使う操作方法は、
- " レポジトリからあるパッケージのソースコードをダウンロード (checkout, co) " レポジトリにファイルの更新があるか確認 (update) " 自分が加えた変更をレポジトリに反映させる (commit)
svn co <repository>/<package_name>/trunk <package_name> # レポジトリからパッケージのファイルをダウンロードしてくる svn update # レポジトリにファイルが更新されていないか確認して、更新があればダウンロードする svn status -u # ローカルなファイルの変更点を表示する。先頭の1文字はローカルなファイルの状態を表す('M'は修正、'A'は追加、'C'は競合) svn commit -m "Some message" # ローカルな変更をレポジトリにアップロードする svn cp . <repository>/<package_name>/tags/<package_name>-<version> # ローカルなものにversion番号を付けてタグする svn resolved <filename> # ファイルの競合を解決した後で実行する
その他に、次のような操作も時々使うことがある。
svn co -r <revision> <repository>/<package_name>/trunk <package_name>svn svn cp . <repository>/<package_name>/branches/<package_name>-<version>-branch svn switch <repository>/<package_name>/tags/<package_name>-<version>
ROOTを起動する際の初期設定
この枠組みでは、ROOTは必ず<myWorkSpace>から起動するようにしている。そして、マクロは全てmacrosというディレクトリにまとめている。
<myWorkSpace>/.rootrc |
ROOT起動時に読み込まれる設定ファイル |
<myWorkSpace>/macros/rootlogon.C |
|
.rootrcは例えば、.rootrcのようにする。 rootlogon.Cの中身(例):
std::cout << "***********************************************************" << std::endl; std::cout << "*** Have a nice day! ***" << std::endl; std::cout << "***********************************************************" << std::endl; gROOT->ProcessLine(".include macros");
このファイルには、他に例えば起動時に予め読み込んでおきたいライブラリ等も記述するとよい。