Dis45 ユーザーのための ROOT 入門 猿にも使えるROOT:番外編

 ユーザーのための 入門
猿にも使える :番外編
藤井恵介
高エネルギー加速器研究機構
平成 ½¾ 年 ½¾ 月 ¾¾ 日
概 要
これは、白崎、田島両氏の有名な入門書「猿にも使える
できるようになった
」のおかけでどうにかこうにか簡単なプロットが
初心者である著者が、いざ射影や、ビン幅の調節等、その一歩先へ進まんとするも思
うにまかせず、試行錯誤を繰り返した結果でき上がった備忘録である。多くの場合、その解決策は自分でも目を覆
いたくなるほどダサダサであるが、できないよりはましであるので恥を忍んで公開する。もっと賢いやり方を御
存じの方、是非、御教示願いたい。
に関する予備知識は前提としていないが、 の基本的な文法についての知識は仮定している。
に関するちゃんとした本はどれも分厚くってめげるという人には、
が高エネルギー屋のために行なった
講習のノートをすすめる。また、 ユーザーのためと銘うってみたものの、実際にはそれほど ユーザーに特化したものにはならなかった。そのおかげでと言えば言い訳になるが、そうでない人( 派の人
)にも少しは役に立つかも知れない。
目次
第
章 なぜ
第章
を使うのか?
事始
第 章 対話モードで
を使う
まずは窓を開く
窓は好きなだけ開ける
画面分割(
ヒストグラムの作成
プロットをいじくる
)
1次元ヒストグラムを例にして
のオプション
を使ったお化粧
一様でないビン幅のヒストグラム
!
!
!
!
プロットのリスト
射影( " または #)
$%
上限下限(&'&)
スライス((')" または (')#)
'*" または '*#
ビン幅の変更(+())
部分の拡大(($)
軸を ,-. にしたい
! プロット間の演算(% )
重ね書き()
統計情報の表示(/% /' )
プロットの情報を得る
グラフの作成:重ね書き
を使ったプロットの扱い
フィッティング
標準関数によるフィッティング
任意関数によるフィッティング
フィット情報の表示(/% )
)01,2 の扱い
グローバルのリセット
! ヒストリーファイル
環境設定ファイル
特有のコマンド
第章
を使ったアプリケーションの開発
!
作法について
アプリケーション
コンパイルとリンク
クラスの拡張と
30-
4
使ってみよう、便利なクラス
/0
. と 56/0
.
コンテナクラス
プログラム中でインタープリターを使う
システムコール
の拡張の実際
例題:+% クラスの実装
第 章 付録
ダサダサのマクロ
ソースからの
25
5,-
のコンパイル
コンパイルの手順
78212
8 のパスの問題
第 章 なぜ を使うのか?
高エネルギーの業界には、 とか
れており、機能も豊富である。
とか、解析のための便利な道具がすでにある。これらは十分使い込ま
も、それを対話的に解析を進めるためのワークベンチとして使うことを前
提としており、また、後から出てきたものであるからして、機能はさらに豊富(なはず)である(残念ながら著者
はその豊富な機能を未だ使いこなせてはいないのであるが)。しかしながら、現時点における機能の豊富さよりも
さらに重要な点は、その機能の拡張性である。これはひとえに
のオブジェクト指向の設計による。今後、
実験がより大規模になり、データー構造もより複雑化し、データ解析もさらに大規模になると予想されることを
考えると、この拡張性が決定的に重要になる。 とか
にはじきに限界がおとずれ、そしてその限界は容
易には克服できないということだ。
オブジェクト指向技術に基づくソフトウエアー開発の可能性は、もちろん
の特徴はどこにあるのであろうか?
だけではない。その点で は単に対話的データ処理だけでなく、オンラインのデータ収集から、
オフラインでの大規模なバッチデータ処理を含むすべての実験の局面においてその「枠組み」を提供することを目
指している。全ての基礎とういのが
の語源のようだ。 チームがしばしば強調することは、「部品」
でなく「枠組み」を提供するという点である。これはプログラムに規範を与え、統一性を維持する。多人数によ
る大規模なプログラムの開発にとっては重要な点である。
しかし、実際問題として最も重要な点は、それが完全にフリーであることであろう。
は % ) の チームによって開発が進められており、非商用目的での使用は無料である。また、ソースも完全に公開されており
変更も自由である。これだけのものがただで使えるというのは、驚きである。
のホームページ
をご覧になることを勧める。
に関する様々な情報や、最新版の入手が可能だ。
% )$( も最近 $ 化され、無償で手にはいるようになったが、これ
これまでライセンスが必要であった
% )$( の役割もほぼ終りに近づいたためと見るべきであろう。
能書きはこれぐらいにして、実際の の使用感について少しコメントしておく。対話的な使い方でまず
気付く著しい特徴は、コマンドライン言語が であることだ。日本ヒューレットパッカードの後藤さんとい
う方が開発された内蔵の インタープリターによって、標準入力を1行1行 プログラムとして実行す
る。つまり、対話的に の解析プログラムが開発でき、必要とあればそれを後でバッチプログラムとして実
行できるわけだ。 や と比べると少しタイプの量が増えるという欠点もあるが、それとても を学
ぶものにとっては格好の道場となりうる。それに、 プログラムをマクロとしてロードして実行できるので、
よく使う手続きはマクロ化しておけばよいわけである。コマンドライン言語が という完全なプログラミン
はむしろ
グ言語であるということは、対話セッションでありながらすさまじい自由度を持っているということだ。やろう
と思えば、対話セッションの中で、ほとんど何でもできてしまうのである。
のセッションで作成されたプロットはマウスで いろいろ編集できる。線やフィル、文字の属性を
で簡単に変えられ、カラーのきれいな図を容易に %/ フォーマットで用意できる点は、 や と比
一方、
べて大分使い勝手が向上している。
それでは早速使ってみよう。
第 章 事始
まず、
をインストールしなくてはならないが、 の展開だけなので何のことはない。著者の場合、
以下に展開している。
ソースファイルからコンパイルしたい場合(ソースをいじりたい場合)については付録に簡単に説明した。動作
のホームページに説明があるが、以下の説明では基本的に $)" で 59 環境を使っ
ていると仮定している(著者の環境は ,
:113 7)。そうでない環境の人は適当に読み変えること。
環境については、
次に若干の環境変数の設定。
! !"#
$%$&' !$%$&' !(#"
いちいち手で打つのが面倒なら、これらは、 ") #( か ") に書いておいても良い。これで、取り敢
えず準備完了だ。
まずは *#() にあるデモを走らせてみよう。適当なディレクトリーに例題をコピーする。
+ ,)-. /
*#() + *#()
の 対話セッションを開始するには、
と打てば良い。ロゴが表示されセッションが始まる。
図
; のロゴ
このロゴがうっとうしければ、 ( をつける。
(
--0 コマンド自体のコマンドラインオブションは で見られる。こんな感じだ。
0
1) 2(3 2"3 2
3 243 2+#3 2#(5 #(63
#
)
" *
#
" -+ .# * #)
+ * (
+ ( -) ) )##+ #
4 # ))#
--
+ (#
- #()
( + ) . )() )
+# # +# #) (#+ +#7 + # " *#
"や
4 は、バッチモードで解析をする際にいずれお世話になる便利なオプションである。特にイベント毎にプ
ロットの更新をすると大変時間がかかるので、 " は助かるオプションである。
さて、
の対話セッションが始まると、
8888888888888888888888888888888888888888888
8
8
8
9 : $ ; : 8
8
8
8 <)#
= **) 8
8
8
8 * .(- #)# * 9" )# 8
8
8
8
8
8888888888888888888888888888888888888888888
&6 >> &
)#
5??@A **) 5 7 0 ( --
+) -*) " >> )-
)
:
() -*(#( )-
) ".
B C
23
と出てくる。<= というのが、--0 のインタープリター
> )? のプロンプトである。<= は打ち込んだコ
マンドラインの番号で、以前のコマンドのヒストリーは、普通のシェル環境のように、矢印の上下ボタンで行った
り来たりできる。6$ または 6$ 6 でも良い。実際、
のコマンドラインは 23 のような編
集ができ、また ' をたたけば、コマンドライン補間もしてくれる。クラスとか関数、変数の名前なども補間し
てくれるのでとても便利である。
さて、早速デモを走らせてみよう。
23 "
-D)
253 4
はプログラム "
-D) のロードと実行、 4 が の対話セッションの終了である。既に述べたよう
に、コマンドライン補間が効くので、 " あたりまで打って ' をたたけば "
-D) まででてくるはず
である。そこでリターンキーを押せば、
のベンチマークが実行される。これは でできることの例題
の集合であり、見ていて結構楽しいし、対話セッションでできることのおおよその感じがつかめる。 +-) と
やれば、ほぼ同じ例題のセットが対話的に実行できる。ちなみに、図 は、9 というボタンを押したところ。
基本的に、@ @ で始まるのが対話セッション独自のコマンドで、それ以外は
タープリターに プログラムとして渡される。
) という内蔵の イン
次章より、仕事に使おうとしたときやりたくなることについてどうしたらできるか考えてみよう。
;
の実行画面。
のボタンを押してみたところ。実際にはヒストグラムがフィルされるようすが動的に見
られる。動くところが見せられないのが残念である。
図
第 章 対話モードで を使う
まずは窓を開く
窓は好きなだけ開ける
8 と違って、 のセッションでは、グラフなどを表示する窓(
) オブジェクト)はいくらでも
作れる。
) 85 . )EF5FAF;7 )FA5A5A?A?GH
などとすると、@5@ という名前の、@;7 )@ というタイトルのキャンバスが
"
の座標(左上が原点)で
>!A!? を起点にして !! ドット× !! ドット の窓が開き、フォーカスがこの窓に移る½ 。
図
; の作成。タイトル、 の画面上での配置に注意。
もちろん
) 5EF5FAF;7 )FA5A5A?A?GH
でも良い。この場合は、5 は実体である。
の対話セッションの中では、ポインターと実体との区別がなかったり、宣言なしの変数に代入で
@B@ を省略できたりいろいろショートカットがあるが、著者の場合、悪い習慣を覚えるといけな
いので の勉強のつもりでちゃんと打つことにしている。
実は、
きたり、行末の
½ 今後、
ÊÇÇÌ のコマンドラインのプロンプトは省略する。自分で打ち込む部分だけ書くのでそのつもりで。
画面分割( )
通常、8 を使っている場合には、ウインドウが開くや否や画面分割にかかる。自然に手が @. @ とか動
いてしまうのである。 でいうところの @
@ である。
これを
でやる場合は
5/%##+E
A-GH
で、このキャンバスを 列、- 行の区画に分ける。この時点では、4つの区画全体のまわりに黄色(とは限らな
図
; の分割。 の結果。
いが)の枠がついている。これは、5 に対応するトップディレクトリーにいることを示している。
各々の区画はサブディレクトリーの扱いである。# 番目の区画で絵を書こうとする場合には、
5/+E#GH
などとして、その区画に移ってから作業をしなくてはいけない。その区画の枠の色が変わって、ディレクトリー
の移動が起きたことが分かる。プロットの描画は、現在いるディレクトリーに対して起きるので、移動せずに描
画すると、上書きしてしまい悲しい思いをする。
ヒストグラムの作成
このあたりは「猿にも」に詳しく書かれているので繰り返しになるが、各自の解析プログラムで繰り返し書く
ことなので、基本的な手続きをおさらいしておく。
のヒストグラムは、全て !5 という基底クラスから派生してできている。1次元ヒストグラムの場合、
ストレージの型により 型の !5、 型の !5、I( 型の !5I、%*"( 型の !5% があ
る¾ 。2次元(!)、3次元(!=)の場合も同様である。次元によらず、ユーザーインターフェースの仕様は、基
底クラスである !5 で規定されている。
1次元ヒストグラムを例にして
まずは、ヒストグラムの箱を作成する。どの型でも扱いは同じなので、I( 型の1次元ヒストグラムを例
にとれば、
!5I 8 5 . !5IEF
-FAF#(FAJA5AGH
のような感じである。ここで、@
-@ は、6-+ クラスの派生クラスとしての名前であり、あとで見るように、
ポインターを知らなくてもこの名前をたよりにオブジェクトを探すことができる。@#(@ はヒストグラムの題
であり、J はビンの数、 5 と は横軸の下限と上限である。
) の場合と同様、
!5I 5EF
-FAF#(FAJA5AGH
のように作っても良い。ただし、プロット関連の
のクラスのメンバー関数はその戻り値として新たにでき
たプロットのポインターを返すことが多いので、混乱を避けるため、著者の場合、自分で作る際もポインターを
使うことにしている。
さて、箱ができたのでこのヒストグラムにデータをフィルしてみよう。 C のところにデータをフィルする
には
%*"( H
として、
5/I#((EGH
で良いわけだが、たくさんフィルするのに手ではやってられない。たくさんデータをフィルしたければ、
「猿にも」
にあるようにファイルから読み込んだりすれば良いわけだが、ここでは、練習なので、正規分布乱数を使ってフィ
ルしてみる。
+-/+EGH
&
#H
E#H #,5H #>>G 5/I#((E
+-/K*)EA=GGH
この例では、乱数のシードをセットした後、中心 で、幅 = の正規分布乱数 5 点をフィルしている。
+>? は省略できるようである。乱数には他にも、: とか $
+* とか #))
とか '#
-#(
とかいろいろあるので試してみるのも一興である。今の例では、 ループを1行で書くことができたが、複数行
+-
にわたるコマンドを書きたい場合も生ずる。そんな場合は
数行モードの終は
@@ である。
@@ をうち複数行モードにはいってから入力する。複
ヒストグラムは重みつきでフィルすることもできる。
¾
ÊÇÇÌ では、マシン依存性を除くため、生の型、
、、、
などを使わないという習慣になっている。
%*"( . H
5/I#((EA.GH
とかすると、ビンは 5 ではなく . だけ増えることになる。これらのフィルの操作は、後で見るように2次元ヒス
トグラムに関しても同様である。
さて、フィルの結果を描画するには
5/%.EGH
と打つ。
図
; ヒストグラムの描画。
図
; 誤差棒をつける。
味もそっけもないヒストグラムである。
のオプション
実は、ヒストグラムクラスの %. メンバー関数にはいろいろオプションを与えることができる。例えば
5/%.EFFGH
とすると誤差棒をつけることができる(図 )。
オプションにはいろいろあるが、著者がよく使うのは
(
誤差棒
プロット
滑らかな曲線で結ぶ
折れ線で結ぶ
などである。
それ以外によく使うオプションとしては @)-@ がある。これは複数のプロットの重ね書きに使う。
5/%.EF)-FGH
フロットマーカーの種類、サイズ、色の変更は
5/;D7(E5GH
5/;D#E5GH
5/;D(EGH
などと行なえるが、次に述べる
を使った方が簡単であろう。
を使ったお化粧
でできる。これは、およそ全ての
操作がコマンドラインペースの と比べると非常に助かる( では は結構使えるが)。
プロットの属性(見栄え)に関する変更は、そのほとんど全てについて
ヒストグラムの境界線またはプロットのデーター点をマウスで触ると、カーソルが十字から矢印に変わる。そ
こで右ボタンを押せばコンテクストメニューが出る。
図
; によるヒストグラムの属性の変更。
を選んだところ。
コンテクストメニューの内容については、いろいろ試してみるのが手っ取り早い。もっぱら見栄えに凝るなら、
/20$
2'00502、/20,,'00502、/20&72'00502 が役に立つ。/20$
2'00502 は、ヒストグラムや
誤差棒の線の太さや色など線の属性、/20,,'00502 は、塗りつぶしのオプション、/20&72'00502 は、
プロットのマーカーの変更のためのダイアログである。これらの の使い方に説明は不要であろう。
図
; 図
; 図
; さらに、ラベルやタイトル、背景や軸についても右ボタンでクリックしてみると幸せになれるかも知れない。
いろいろ試してみられたい。
一様でないビン幅のヒストグラム
いままでは、ビン幅が一定の場合を扱ってきた。時には、統計の少ないビンをまとめたりして、ビン幅が一様
でないようなプロットを作りたい場合があろう。そんな場合は別のコンストラクターを使うことになる。
&
"#
) H
%*"( "#
)23 BA5AA=AA5CH
!5I 8 5 . !5IEF
-FAF#(FA
"#
)A"#
)GH
などとすると、各ビンの下限が、 、5 、 、= 、 で最後のビンの上限が 5 のヒストグラムの箱ができる。
"#
) の大きさは "#
) 5 であることに注意。
プロットをいじくる
データー解析でやっていることと言えば、基本的には、いろいろなプロットを作ってそれを眺め、射影したり、
スライスしてみたりしていじくり回し、何とか意味のある情報を引っ張り出すことである。ここでは、
で
それをどうやるか考えてみる。
プロットのリスト
プロットをいじる前にどのプロットをいじるか知る必要がある。
%#7/()EGH
とすれば、現在ディレクトリーにある名前つきオブジェクト(6-+ の子孫)のリストが見られる。
のプロットは全て 6-+ クラスから派生している。つまりおのおの名前がついており、ポインターを
失っても探すことが可能だ。例えば、@;7(@ などという名前のついた倍精度型の1次元ヒストグラムの場合は、
!5% 8 5 E!5% 8G/I#
+"LEF;7(FGH
などとすれば、ポインターを知ることができる。これは
EE!5% 8G/I#
+"LEF;7(FGG/%.EGH
などとできることを意味する。
これに対する
独特のショートカットとして
;7(/%.EGH
も許される。が、悪い習慣が身についてしまうといけないので、初めのうちはちゃんとした
した方が良いと思う。この便利さの誘惑は抗し難いが。
逆にポインターを知っていれば
* ,, /K6-EG ,, +(H
とすれば名前が分かる。
ヒストグラムを含む
のファイルを
I#( 8#( . I#(EF FGH
のようにロードした場合は、
#(/()EGH
とすることでもリストが得られる。
!
を使うように
射影( または )
2次元プロットの各軸への射影はよくやる操作だが、
では " 軸への射影は
/L#
MEG/%.EGH
などとする。ここで、 は問題の2次元プロットへのポインターである。
# 軸への射影は
/L#
EG/%.EGH
である。
後で使い回すことを考えると、
!5% 8 5 /L#
MEGH
などとした後で
5/%.EGH
の方が良いかも知れない。
名前を知っていれば、射影の名前は、もとの2次元プロットの名前に
@ @ または @ 7@ を付け加えたものに
なる。
具体的な例題をやってみよう。まず、例によって、プロットを描画する窓を開いておこう。
) 85 . )EF5FAF;7 )FA5A5A?A?GH
5/%##+EAGH
開いた窓は、 × に分割した。
次に、最初の区画に行ってから、練習に使う2次元プロットを作ろう。
5/+E5GH
!I 8 . !IEF )FAF)FAAA5AJA5AGH
練習だから、また適当な乱数を使うことにする。
B
+-/+EGH
&
#H
E#H #,5H #>>G B
%*"( 5 8 +-/
+-EGH
%*"( 7 88 > +-/K*)EA8 > 5GH
/I#((EA7GH
C
C
/%.EGH
文が複数行にまたがるので、@@ と
これを
@@ で囲んである。
# 軸と " 軸に射影してみよう。
5/+EGH
/L#
EG/%.EGH
5/+E=GH
/L#
MEG/%.EGH
すると、既に述べたようにそれぞれの射影のヒストグラムの名前は、もとの名前に
たものになる。今の例では、@ ) @ と
@
) 7@ である。
@ @ あるいは @ 7@ をつけ
図
; 2次元プロットの両軸への射影。
上で作った2次元プロットの例題にプロファイリングを施してみよう。
#( 8 /#(MEGH
プロファイルの作成
!5%
8 /L#
MEGH !5% へコンバート
/%.EGH
描画
結果は図 ! のような感じで、もとの2次元プロットの芯の部分の形、7 C が見える。ここでは、真
!;
図 !" の2次元プロットのプロフファ
イリング。# の相関の関数形が見える。
図
;
図 !$% の # 軸の上限と下限を図 !"
の2次元プロットに合わせる。
図
面目にポインターを使ったが、プロファイルのヒストグラムの名前はもとの名前に
@ @(#(>? をした場
合には @ 7@)をつけたものになるので、今の場合、@ ) @ でもアクセスできる。
上限下限()
ちょっと、見にくいので、もとの2次元プロットの縦軸のスケールに合わせてみよう。
/;#
#-*-E5GH
/;#-*-EGH
下限を 5 に
上限を に
これで、より相関関係が見やすくなった。
スライス( または )
" 軸のビン #) から、ビン () までをスライスして # 軸に射影((')")するには
!5% 8 " /L#
EF )"
FA#)A()GH
とする。# 軸に沿ってスライスし、" 軸方向へ射影((')#)するのであれば
!5% 8 "7 /L#
MEF )"
7FA#)A()GH
などとすれば良い。
#)、() はビンの番号なので、今の例で
" 軸の >5
? をスライスし、それを # 軸に射影しガウスフィッ
トするには
&
#) /KM#)EG/I#
+'#
E5GH
&
() /KM#)EG/I#
+'#
EGH
!5% 8 " /L#
EF )"
FA#)A()GH
"/%.EGH
"/I#EF*)FGH
座標値 5 をビン番号へ
座標値 をビン番号へ
スライス
描画
スライスをガウスフィット
などとする。
または 著者が
8 で一番お世話になったのがこれである。'*" と同じことを でするには
/I#(#)EGH
)/%.EGH
)5/%.EGH
)/%.EGH
) #/%.EGH
に対応
D 値
,7/EG
)#-7EG
#EG
などとする。ここで、 の名前が
EE!5%
EE!5%
EE!5%
EE!5%
@
8G/I#
+"LEF
8G/I#
+"LEF
8G/I#
+"LEF
8G/I#
+"LEF
)@ であったことを思い出すこと。正しくは、
)FGG/%.EGH
)5FGG/%.EGH
)FGG/%.EGH
) #FGG/%.EGH
とすべきところであるが、ついに悪い習慣に染まってきた。
D 値
,7/EG
)#-7EG
#EG
'*# なら I#(#)M>? を使う。実は I#(#)M>? または I#(#)>? は . だけでなく、任意関数を
使うことができるが、それに関しては各自研究されたい。
図 は
/I#(#)EGH
5/+E5GH
に対応
/%.EGH
5/+EGH
)/%.EGH
5/+E=GH
)5/%.EGH
5/+E?GH
)/%.EGH
D 値
,7/EG
)#-7EG
とした結果である。
図
; 2次元プロットの # スライスのガウスフィット、つまり、
&' で言うところの (。
ビン幅の変更( )
1次元ヒストグラムの場合、
5/"#
EGH
で、 ビンずつまとめる。これは、非可逆的な変更なので、変更前のヒストグラムをとっておきたければ、
!5% 8 5 "
5/"#
EAF .FGH
などと、新しいヒストグラムの名前(@9
2@)を与えてやれば良い。
2次元ヒストグラムの場合はメンバー関数がないのでマクロで誤魔化す。
$ "#
H
!% 8 "
"#
E AA=GH
"
/%.EGH
ダサダサだが仕方ない。"#
の中身は付録に載せておく。
注意事項として、"#
>
? は、#(M>? とか、I#(#)> ? の結果に対しては使えないことに注意す
る。ビンがマージされた場合、ビンの中身の平均でなく和が、新しい中身になるからである。あえて使うなら、あ
とでビン幅のスケール因子で割っておかねばならない。間違いのもとなので、"#
>
か I#(#)>? とかすること。
? してから #(M>? と
!
>
部分の拡大()
? の範囲を拡大するには
5/KM#)EG/
E 5/KM#)EG/I#
+'#
EGA
5/KM#)EG/I#
+'#
EGGH
とする。これはまた、軸の値から対応するビン番号をうる方法を示している。
直接、値を入れられないのがうっとおしい、これをいちいち打つのが面倒ちいという人は、またマクロで誤魔
化せば良い。
$ "(.H
'(.E 5AAGH
これは、可逆的な変更である。"(. の中身は付録に載せておく。
"
軸を #$% にしたい
軸をリニアースケールで表示するか、,-. スケールにするかは、表示だけの問題であるので、プロットの表示さ
れるキャンバスの区画(+ オブジェクト)の属性である。そこで、スケールの変更は + のメンバー関数を
使って行なう。# 番目の区画にあるプロットの
5/+E#GH
/K(++EG/$7EGH
# 軸を ,-. スケールに変更するには
# 番目の区画に移動
軸を ( に
とすれば良い。もとに戻すには
/K(++EG/$7EGH
軸をリニアーに
とする。しかし、こんな面倒なことを手で打つ必要はない。問題の + のすみのあたり(プロットの中ではダ
メ)を、マウスで右クリックすればコンテクストメニューが現れ、グリッドのあるなし、,-. なのかリニアーなの
か、ティックマークの調節などなど、そこで見栄えに関してやりたいことのほとんどができるのだ。
&
プロット間の演算()
対話的にプロットをいじっていて一番オブジェクト指向ぽいのは多分これであろう。
プロットとプロットの四則演算は(もちろん、ビン幅が共通していて初めて許されるわけだが)、単純に
、
でよい。
!5% 8 (*)" .
(*)"/%.EGH
!5% 8 -#
*)" .
-#
*)"/%.EGH
!5% 8 #-)" .
#-)"/%.EGH
!5% 8 +#"7" .
+#"7"/%.EGH
!5%E 5 > 5"GH
!5%E 5 5"GH
!5%E 5 8 5"GH
!5%E 5 5"GH
と言った具合だ。
また、1次元ヒストグラム 5 のビンの中身を )( 倍するには、
、C、
!5% 8 )(+ . !5%E)(8 5GH
)(+/%.EGH
でよい。
重ね書き(')
既に述べたとおり、
/%.EF)-FGH
異なったヒストグラムを重ねて比較するだけでなく、ヒストグラムに、誤差棒をつけるなどしたい時もこれを使う。
統計情報の表示((' ('' )
フレーム内に表示されるプロットの統計情報の制御は
7(/E-+G
ここで -+ C #*-
は2進数で、
*
#
5H
5H
5H
5H
5H
5H
5H
ヒストグラムの名前の表示
エントリー数の表示(重みゼロも含む)
平均値の表示
-) の表示
アンダーフロー数の表示
オーバーフロー数の表示
ビンの積分値の表示
である。デフォールトは -+ C 5555 であるが、しばしば見えている部分の積分が知りたくなるので、著者
の場合、
7(/E55555GH
を愛用している。
プロットの情報を得る
ヒストグラムに蓄えられた情報をもとに何か計算したいというのはしばしば起こる欲求である。そんな時のた
めの技を紹介する。その際、まず覚えておかなくてはならないことはビン番号の数え方の習慣である。
!5% 8 5 . !5%EF
-FAF#(FA
"#
)A-#
A-GH
として作ったヒストグラムの場合、
5 "#
)
"#
)>5
*
+(. "#
+#
7 "#
)
(. "#
となる。
既に存在しているヒストグラムのビンの数や、上下限を知るには、
"#
) 5/KM#)EG/K6"#
)EGH
-#
5/KM#)EG/KM-#
EGH
- 5/KM#)EG/KM-EGH
また、ビンの中心値や、ビンのエントリーの数を知るには
5/KM#)EG/K'#
E#GH # "#
5/K'#
E#G
# "#
が役に立つ。
2次元プロットの場合、# 軸のビンの数や、上下限を知るには、容易に想像できるように、
7"#
) /K#)EG/K6"#
)EGH
7-#
/K#)EG/KM-#
EGH
7- /K#)EG/KM-EGH
とすれば良い。# 軸であっても KM-#
>? や KM->? である点に注意。" 軸については1次元の場合と同じ。
また、ビンの中心値や、ビンのエントリーの数を知るには
7
/KM#)EG/K'#
E#GH
"#
E#ALG
/K#)EG/K'#
ELGH
7 "#
E#ALG
/K'#
E /K'#
E#ALGGH "#
E#ALG
などとする。K'#
># L? で2次元のビンを1次元に翻訳してくれる。逆に > 7? から ># L? を知るには、'(.
でやったように、
&
# /KM#)EG/I#
+'#
EGH
&
L /K#)EG/I#
+'#
E7GH
を使う。
ビンの積分は
)*- 5/&
(E#5A#GH
)*- /&
(E#5A#AL5ALGH
てな感じ。
さて、練習として、あるヒストグラムの平方根をとることを考えてみよう。
#+ 4E!5 8 G
B
%*"( A 7A +7H
E#
#H #, /K6"#
)MEG>5H #>>G
B
7 /K'#
E#GH
+7 /K'#
:E#GH
# E7 / G B
7 ; 4E7GH
+7 8+77H
C () B
7 +7 H
C
/'#
E#A7GH
/'#
:E#A+7GH
C
C
のようなマクロを )4 とかいう名前で用意しておけば
$ )4
4E 5GH
とすることにより、 5 の中身の平方根がとられる。このマクロではもとのヒストグラムを破壊してしまう。それ
がいやなら、もとのヒストグラムをコピーしてからするか、新しいヒストグラムのポインターを返すようにマク
ロを改良すれば良い。
グラフの作成:重ね書き
ここまでは、ヒストグラムの使い方をみてきたが、データ点を直接キャンバスにプロットしたいという要求も
しばしば起きる。このような場合、K あるいは誤差棒つきのプロットの場合は K :) を使うことに
なる。基本的な使い方は「猿にも」にあるので重複するが、複数のグラフの重ね書きなど書いてないこともある
ので補足しておく。
グラフを作ることの練習なのでデータ点については適当に関数と乱数を組み合わせて作ろう。
) &
5H + #
)
&
#H
%*"( 2
3A +2
3A 752
3A 72
3A +72
3H
B
E#H #,
H #>>G B
2#3 > #H
+2#3 =H
752#3 ? > 582#382#3 > +-/K*)EA5GH
72#3 N > 582#382#3 > +-/K*)EA5GH
+72#3 5H
C
C
後で2つのグラフの重ね書きをしたいので、7 は2種類作ってある。
これを、ただ単にプロットするだけなら
K 85 . K E
AA75GH
5/%.EFFGH
あるいは誤差棒つきなら
K :) 85 . K :)E
AA75A+A+7GH
5/%.EFFGH
で良いわけで、これは「猿にも」にも書いてある。ここで、%.>#
? メソッドの #
として、@@(軸
の描画)と @@(プロット)を2つ指定したが、重ね書きがしたければ2つめをプロットする時に @@ のみとす
ればよい。この他よく使う #
として、点を直線でつなぐ @(@ や、滑らかな曲線でつなぐ @@ があるのはヒ
ストグラムの場合と同じである。
上の例ではデフォールトの軸を使ったが、プロットの範囲を指定したり重ね書きをしようと思うと先にグラフ
の枠を書いておくのが望ましい。
%*"( ( H
の下限
%*"( # 5H の上限
%*"( 7( H
7 の下限
%*"( 7 # H 7 の上限
) 85 . )EF5FAF;7 )FA5A5A?A?GH
!5I 8- +/%.I-E(A7(A #A7 #GH
こうしておけば
K :) 85 . K :)E
AA75A+A+7GH
5/%.EFFGH
K :) 8 . K :)E
AA7A+A+7GH
/%.EFFGH
とした時に指定通りの軸の範囲で重ね書きできる。
既にヒストグラムの説明の際に述べたようにプロットマーカーや曲線の種類や色、大きさなど、お化粧は
でできるが、もちろん
5/$#
(EGH
5/;D(EGH
5/;D7(ENGH
5/;D#E5=GH
5/%.EFFGH
/$#
(E?GH
/;D(E?GH
/;D7(EGH
/;D#E5=GH
/%.EFFGH
線に赤を指定
マーカーに赤を指定
マーカーに○を指定
マーカーのサイズ指定
描画
線に青を指定
マーカーに青を指定
マーカーに△を指定
マーカーのサイズ指定
描画
のように直接コマンドラインで指定することもできる。できたプロットは図 。
図
; グラフの重ね書き。
を使ったプロットの扱い
これまで説明したプロットの扱いは、プロットのお化粧に限らず、かなりの部分を
のプロンプトで
で行うことができる。
I#( 8#( . I#(EF#(FAFFGH
とうつと、@#( @ と言う名前の出力用
ファイルができる。これ以降、作成したプロットは特に指定
ファイルがある場合には
しなければこのファイルに保存される。すでに、プロットを含んだ
I#( 8#( . I#(EF#(FGH
とするか、
起動時に
( #(
とすれば良い。ここで、
!I 8 . !IEF )FAF)FAAA5AJA5AGH
B
+-/+EGH
&
#H
E#H #,5H #>>G B
%*"( 5 8 +-/
+-EGH
%*"( 7 88 > +-/K*)EA8 > 5GH
/I#((EA7GH
C
C
として、テスト用の2次元プロットを作っておく。
準備ができたら
'.) "H
ファイルプラウザーを開く。@ ,2@ と示されたディレクトリーアイコンをダブルクリック
すると #( と書かれたアイコンがでてくる(図 )。これをダブルクリックすると、上で作った @ )@
というプロットのアイコンが出てくる(図 )。ここで、このアイコンをダブルクリックすれば、自動的にキャ
として、
図
;
を開き
したところ。
) ) をダブルクリック
!
図
; 更に )* ) をダブルクリックしたところ。
図
; ) ) メニューから )+, ) を選び を開く。
ンバスウインドウが開いてプロットが表示される。
@,2@ メニューか
ら@)2 D@ という項目を選ぶ(図 )。出てきたキャンバスを右クリックし、出てきたメニューから@D82@
を選ぶ(図 )。すると、ダイアログボックスが現れるので、@
:@ と @
4@ に適当な数を入れる。ここでは > ?
に分割したいので、@
:@、@
4@ ともに を入れて @@ を押す(図 )。分割されたキャンバスの第1区画に
そうではなくてあらかじめ分割されたキャンバスの1区画に表示するには、'.) の
図
; を右クリックしてメニューから )-) を
図
選ぶ。
; すると、 .. ダイアログが現れる。
移動するため、マウスの真ん中ボタンで第1区画をクリックする。これで第1区画の回りの枠の色が変わりフォー
カスが第1区画に移動したことが分かる。ここでおもむろに先ほどのブラウザーの
リックすれば、めでたくこの区画にプロットを表示できる。
@
)@ アイコンをダブルク
# 軸への射影をしてみよう。プロットを右クリックして現れたメニューから@-6230-
#@ を選
@,0:5
@ にビンナンバーを指定する。ここで、@@
を押せば、@
2@ を特に指定しなければ@9020 14@ というプロットができたはずである。ここで、'.) の
@*2@ メニューから@ 2F29@ を選択すれば、@9020 14@ のアイコンが現れるはずである。これを第2区画にプ
ロットしたいので、真ん中ボタンで第2区画をクリックして第2区画に移動してから、@9020 14@ アイコンをダ
ブルクリックして # 射影を表示する。
今度はこれの
択し、必要に応じて >(')" をしたい場合)@E0:5
@ と
フィッティング
フィットについては、「猿にも」に詳しいので、ほんとに簡単にさらりと。
標準関数によるフィッティング
極めてしばしばやるフィットは
5/I#EF*)FGH
5/I#EFFGH
5/I#EF(5FGH
5/#EF(FGH
などである。これらについてはこれ以上の説明を要しないであろう。
が用意されている。ヒストグラムを触って、ポインターが矢印になったら、右クリック
して、コンテクストメニューを出し、0
2, を選んで研究されたい。
これらについても
任意関数によるフィッティング
上記のコンテクストメニューで
0 を選べば、任意関数が与えられる。実際に起こることは、コマンドラインで
I5 8
. I5EF
FAF238E2538G>238>2=3FAAGH
/-)E5AAAGH
/6-)EFFAF"FAFFAF+FGH
5/I#EF
FAFFGH
などとするのと同じである。
フィット情報の表示((' ' )
フレーム内に表示されるプロットのフィット情報の制御は
7(/I#E-+G
ここで -+ C は2進数で、
5H
5H
5H
5H
パラメータの名前と値の表示
誤差の表示( 5 は 5 を要求)
#886%I の表示
確率の表示
である。デフォールトは -+ C 555 である。
の扱い
)01,2 の使い方についても、「猿にも」に書いてあるのでさらりと。まず箱を用意する。つまり
6*( 8* . 6*(EF*
-FA F*#(FA F+5++=FGH
などとして、例えば3つの変数 @+5@、@+@、 @+=@、からなる
)01,2 を作る。またもや練習なのでダミー
データを詰め込もう。
B
&
#H
E#H #,5H #>>G B
I( -* 5 > +-/K*)EA=GH
I( +5 +-/K*)E-*AGH
I( + +-/K*)E-*AGH
I( += +-/K*)E-*AGH
*/I#((E+5A+A+=GH
C
C
この
)01,2 の内容をヒストグラムしたければ
*/%.EF+5FGH
あるいは、カットつきなら例えば
*/%.EF+5FAF+/N OO +=,5FGH
等とすればよい。
2次元プロットなら
*/%.EF+5+FAF+=/NFGH
これを
@
+5@ などという名前の 次元プロットにしたかったら
*/%.EF+5+ // +5FAF+=/NFGH
983 は普通の2次元プロットなので自由にいじれる。
また、
*/%.EF+5+FAF+=,5FGH
*/%.EF+5++5FAF+=,5FGH
等
)01,2 の内容に演算を加えてからヒストグラムすることも可能である。作った )01,2 をファイルに書き出す
には
I#( #(EF)*FAF:: :FGH
*/9#EGH
でよい。
まあ、ここまでは「猿にも」の受け売りであるが、時には、イベント毎に
)01,2 の内容に直接アクセスした
)01,2 の入った ファイルを読んでイベント毎の情報を引き出すことを考
を再起動して、6*( を @*
-@ という名前で作ったことを思いだし、
い場合もでてくる。今保存した
えよう。
I#( 8#( I#(
EF)*FGH
6*( 8* E6*( 8G/I#
+"LEF*
-FGH
として保存した
)01,2 へのポインターを得る。ここで、例えば、イベント5の変数 @+5@ の値が取ってきた
かったら、
I( 5H
*/'
++))EF+5FAO5GH
*/K:
7EGH
,, 5 ,, +(H
(#
D F+5F 5
さて、カットされたサブサンプルに対して情報を得たい場合は :
$#) を使う。例えば、カット後の最初
のイベントならば
*/%.EF//(#)FAF+= / NFAFFGH FF #) II
:
$#) 8(#) E:
$#) 8G%#7/KEF(#)FGH
&
(#) (#)/K6EGH
6 )(+ )
&
(#)/K:
7E5GH
6 5) )(+
*/K:
7E
GH
6
,, 5 ,, +(H
等とする。
グローバルのリセット
いい忘れたが、
の対話セッションで打ち込んだシンボルは基本的にグローバルスコープである。それら
をリセットするには
/)EGH
とする。これで、ヒープに作ったものは別だが、きれいな気持ちで再出発できる。
ヒストリーファイル
手で長いコマンドを打ち込んでも、
) にはそのバックアップの機能はない。そこで、
!;: #)
をもとに、よく使うコマンドシーケンスはマクロにしておくとよい。
環境設定ファイル
マクロ、および共有ライブラリーの検索パスなどは
!;:
で設定する。著者の場合、
1
#8%7
-# EG(#"EPIG(#"EQI$&'G(#"
1
#8; E!;:G-)EG-)EPIG-
などとなっている。G/
は G/ の ルートディレクトリー、$( は 94 のルートディレク
トリーだ。
"#
とか '(. とか、自分のマクロを自動的にロードさせる。毎回、 $ で自分のマクロをロードするのも面倒
だからだ。上で述べた の中で、; に入っているところに (#) というファイルを置く。
!;:-)(#)
その中身は
#
(*+ F"(.F
#
(*+ F"#
F
のように、自動ロードしたい自家製マクロをインクルードしておく。もちろん、"(. 、"#
も ;
に入っているディレクトリーのどこかに置いておくこと。
特有のコマンド
セッション中で
0
とすると
の対話セッション固有のコマンドについてのヘルプが見られる。
著者がよく使うのはマクロの実行
やマクロのロード
$ それにシェルエスケープ
R ,) (( --
+/
などである。コマンドラインの実行結果をリダイレクトするには、例えば、
%#7/()EGH / -7(
とか
%#7/()EGH // -7(
とする。
()) ,()) -/
は、クラスのヘルプとして使える。
) はデバッガーとしても使えるが、著者は使いこなせていない。
第 章 を使ったアプリケーションの開発
作法について
アプリケーション
の独立したアプリケーションを作る場合は、
#
(*+ F F
;7#
7 EF-(()FA F -(() -FGH
&
-#
EG B *
H C
オブジェクト(すなわち基底クラスで
オ
ブジェクトが消えてなくなるまで、消えてはならない。これは、 オブジェクトが全ての オブジェク
のように、 オブジェクトをグローバルスコープで、あらゆる
ある "L クラスの派生クラスのオブジェクト)を作る前に作らなくてはならない。また、全ての
トの生成消滅をカスタム . とカスタム +( を通して管理するものだからである。 オブジェクトはス
タックに作らねばならない。これは、アプリケーションの終了時に確実にそのデストラクターが呼ばれることを
保証するためである。 クラスはシングルトンである。どの
アプリケーションにもただ一つ存在し、
いつも ポインターによってアクセスできる。このポインターにはすでに何度もお世話になった。
コンパイルとリンク
コンパイルフラッグ(MMI$ K)には、
のヘッダーのパスが含まれること。これには H
# コ
マンドを使うのが良い。
MMI$ K S
# ()S
また、リンクフラッグには
のライブラリー
$&' S
# (#")S
を加えなくてはいけない。グラフィックを使う場合は
$&' S
# (#")S
とする。
全ては
クラスの拡張と )*+)$,
から
インタープリターを内蔵することと、基底クラスを共有することの強力な点は、オブジェクトの入出力
のクラスを拡張する際にプログラマーが
のためのストリームメソッドが自動的に生成できることである。
なすべきことは、まずユーザー定義のクラスヘッダーに
()) ;7()) *"(# "L B
())%E;7())A5G ()) #(
C
である。バージョン はランタイムタイプ に必要で
あり、クラスのデーターメンバーが変更を受けたら更新する。バージョン を にしておくと、オブジェクト
I が不要と見なされ、ストリーマーメソッドは自動生成されない。
などと、書いておくこと。ここで、5 はバージョン
クラスの実装では、
())&-E;7())G
などと、書いておくこと。
もう一つのポイントは、かならずデフォールトコンストラクター(引数なしで呼べるコンストラクター)を用
意しておくこと。この際、デフォールトコンストラクターでは、データーメンバーなるポインターにメモリーを
確保してはいけない。
ファイルが読み込まれる際に、まず、デフォールトコンストラクターが呼ばれ、そ
れからデーターが読み込まれるわけだが、その際にそのポインターが上書きされ、もともとそれが指していたオ
ブジェクトは見失われ、メモリーリークを生じる。
次に $#
D%
なる名前で
#+ &6
- (#
D (( ("()H
- (#
D (( ()))H
- (#
D (( *
#
)H
- (#
D >> ()) ;7())H
+#
のようなファイルを用意する。
これは、;D#( の中で
;7())%# ;7()) $#
D%
T FK
#
+##
7 F
#
;7())%# ;7()) $#
D%
のように使い、- や .--" などを自動生成してもらう。
後は、;7()) と ;7())%# を含めて、共有ライブラリーを作れば良い。
自分のクラスを含む共有ライブラリーのロード
上で、(#";7()) ) という名前で共有ライブラリーを作ったものとすると、
7)-/$+EF, /(#";7()))FGH
とすることで、
の対話セッションの中で自分のクラスが使えるようになる。
の自動生成
の %( ページに行くと、 のクラスの 90, 版のマニュアルがある。
-(())&
+ -(
である。クリッカブルで、親クラスやデーターメンバーになっているクラスの構造を知ることができとても重宝
する。実は、これらの索引は自動生成されたものである。自分でつくったクラスについても索引があると便利な
ので(年をとるとすぐに自分で書いたコードも自分が書いたということすら忘れてしまう)、作り方を知っている
と幸せになれる。
やりかたは、例えば -( とかいうマクロを用意して実行するだけである。
" 4 -(
-( の中身については例題をあげるにとどめる。
B
/)EGH
7)-/$+EF(#"(#";7()))FGH
!-( -(H
-(**%#EF -(FGH
出力先を -( にする。
-(*%#EF)FGH
ソースのありかを指定。
ここから自分のつくったクラスを -( オブジェクトに登録していく
-(;D())EF;7())FGH
-(;D())EF;7())5FGH
登録終了
-(;D&
+EGH 1:&
+ -( という索引の生成
8-+F+ -(H - 1:&
+ -( ;7()) -(FH
7)-/:E-+GH インデックスの名前を変えておく
C
これで、 -( というサブディレクトリーに 90, 形式の自分のクラスの索引がつくられる。
) #(S.+S -(;7()) -(
とすれば幸せになれる。
コーディング上の習慣
のプログラミングでは
&+
##
#
:-(
()))
6
()) 7)
:
*-#
7)
% --")
;-" *
#
)
# #"()
# + --")
$() + -)
)
)
-( *-
)
) + ))
'#
.# :
+ .# '#
.# :
'#
.# #(+
'#
.# #(
'#
.# '#
.# '#
.# (. )
'#
.# D
'#
.#
'#
.# KA A
&) E"(
G
!) "(
#-(
:($(
<#.$#)
%.EG
7)D
(#
)+A +
D&
##(#
7
$)EGA KI#)EGA
&)%
EG
とすることが推奨されている。アンダースコアー
@ @ は J+#
のマクロ以外では使わない。
また、マシンに依存しない基本型として
1 1 &
1&
$
1$
I(
%*"(
'(
の使用が推奨されている。
使ってみよう、便利なクラス
の提供するクラスが膨大なことと、そしてそれを著
者が全く使いこなせていないせいである。クラスのマニュアル(90, が自動生成できる)を見るか、ソースコー
とてもじゃないが全てを説明しきれない。これは、
ドを直接眺めるのがベスト。また、
)
にある例題は非常に参考になる。
'(+)% と '-.(+)%
#
は、
の提供する、文字列を扱うクラスである。
#
)5EF FGH
#
)EF FGH
* ,, )5 ,, +(H
* ,, )5253 ,, +(H
* ,, )5>) ,, +(H
)51EGH
* ,, )5>) ,, +(H
)5253 UUH
* ,, )5 ,, +(H
F F という内容の #
を作成
F F という内容の #
をもう1つ作成
F F をプリント
FF をプリント
F F をプリント
)5 を大文字に
F!K: F をプリント
F!K:F の FF を小文字に
F!K:F をプリント
などは、ごくごく単純な使い方であるが、すでに十分便利であることがわかる。#
には、実に多くの機能
があるので各自研究されたい。
#
は、"L を継承していないので、そのままではオブジェクト
I にはむかない。- が
自動生成されないからである。そのため、"L#
がある。これは、#
を "L にするためのラッ
パーである。
"L#
)EF FGH
8+ )K6-EGH
#
) )K#
EGH
)#
EF"FGH
#
O) )#
EGH
F F という内容の "L#
を作成
F F へのポインターをもらう
F F を #
としてもらう
F F を F"F に変更
#
への参照をもらう
のように使う。#
への参照をもらっておけば、後は #
でできることがいろいろできる。
コンテナクラス
"L 7 は、"L へのポインターの配列である。"L クラスの子孫であれば、何でもつめること
ができる。要素要素で別のクラスであっても良い。"L 7 自体、"L の子孫なので、配列要素になれ
る。したがって、複雑なネスト構造がつくれる。"L 7 は、$#)、!) $#)、(
) 7、'、
+$#) などの仲間で、-,,230-
とか -
0
2 とか呼ばれている。
普通の配列でなく、"L 7 を使う利点はいろいろある。配列に要素を加えていく( ++ メソッドを使う)
際に、配列が小さければ自動的に拡張してくれる。また、- メソッドで、要素を削除したり、削除後空いた
ところを -)) したりできる。配列要素を一括して +( できる(%( メソッドを使う)。&、 > ?
または
< =、など配列要素にアクセスする標準的なインターフェースが提供されている。要素の並べ代えも簡単に
できる。
使い方は、
"L#
)5EF FGH
"L#
)EF FGH
"L#
)=EF.#FGH
"L 7 E5GH
++E)5GH
++E)GH
++E)=GH
"L#
8) E"L#
8G23H
-E)GH
& EGH
. #(EE) E"L#
8G
EGGG B
大きさ 5 の配列を作成
配列に )5 を入れる
配列に ) を追加
配列に )= を追加
)5 を取得() が必要)
) を削除
# の作成
) が必要
!
* ,, ) ,, +(H
C
* ,, 253 ,, +(H
-))EGH
* ,, 253 ,, +(H
) はプリントされない
253 はいない(怒られる)
圧縮
F.#F をプリント(怒られない)
配列の拡張は時間がかかるので、普通は最初に十分な大きさの領域を確保する。また、決まった大きさの要素の
配列に対しては、(
) 7 を使うのが経済的である。さらに使い方を学ぶには
)((
が非常に参考になる。
プログラム中でインタープリターを使う
プログラムをストリングに収め、それをプログラム中からインタープリターで実行させることもできる。
/92,, でいうところの ( のようなものである。
例えばこんな感じ。
8-+ F 5/%.EGFH
/))$#
E-+GH
これは、実行すべきコマンドがプログラム実行時に変わるような場合にとても便利。
システムコール
システムコマンドをプログラム中で実行したければ : メンバー関数を使う。例えば
8-+F+ H ()FH
7)-/:E-+GH
のような感じ。
の拡張の実際
例題:' クラスの実装
例題。疲れてきたのでまたいずれ書くことにする。
第 章 付録
ダサダサのマクロ
/-)
!% 8"#
E! 8
B
&
"#
)
#) -#
#) -
#) +
&
")
"#
) H
+
8 H
- -#
>
&
#)
#)
#)
&
7"#
)
+7
7- 7"#
)
7-#
7-
+7
7")
-H
8 -H
7-#
>
A &
5A &
- 5G
/KM#)EG/K6"#
)EGH
/KM#)EG/KM-#
EGH
/KM#)EG/KM-EGH
E--#
G
"#
)H
"#
)H
"#
)8+H
/K#)EG/K6"#
)EGH
/K#)EG/KM-#
EGH
/K#)EG/KM-EGH
E7-7-#
G
7"#
)H
7"#
)H
7"#
)8+7H
.
-2J3H
)#
E
.
-AFV) "
FA /K6-EGGH
!% 8 . . !%E
.
-A /K#(EGA
"#
)A-#
A-A
7"#
)A7-#
A7-GH
H
&
#A LH
E#H #,
"#
)>5H #>>G B
&
#(A # #H
# E# / OO # , "#
)G B
#( 8E#5G > 5H
# # 8#H
C () # E# G B
#( # # H
C () B
#( 8
"#
) > 5H
# # ")H
C
ELH L,
7"#
)>5H L>>G B
&
L(A L #H
# EL / OO L , 7"#
)G B
L( -8EL5G > 5H
L # -8LH
C () # EL G B
L( L # H
C () B
L( -8
7"#
) > 5H
L # 7")H
C
/&
(E#(A# #AL(AL #GH
# E / G B
./I#((E ./KM#)EG/K'#
E#GA
./K#)EG/K'#
ELGAGH
C
C
C
*
.H
C
-#$
#+ '(.E!5 8 5A #) -
A #) -A 8#) FMFG
B
# E#) FMFG B
5/KM#)EG/
E 5/KM#)EG/I#
+'#
E-
GA
5/KM#)EG/I#
+'#
E-GGH
C () B
5/K#)EG/
E 5/K#)EG/I#
+'#
E-
GA
5/K#)EG/I#
+'#
E-GGH
C
C
ソースからの のコンパイル
著者が
コンパイルの手順
,
:113 7 でコンパイルした時を例にとる。開発環境は
8W=(#"5=5+
"#
*#()5W
MINJ==JN
75=55
;)==
である。
コンパイルの手順は、
:: でがらりと変わった。
,)-. /)*
,)-. /55
)*
- ) *)) )
*) + (#"
(
) (#"7 #J5=? (#"7 #
#
+ S.+S
$%$&' !(#"
!"#
!
5 ) , ,)-. /
#
5 ) , ,)-. /
5 ) , ,).. /=+
#* (#
*)
-D
- #)#
)!#)#
-D U5U (( #)#
-D
ここで、 # は、&2 のヘッダーを探すパスの設定で内容は
#*&K 9+ P*
5 5?5 >>> #*
;
P*
J 5==N TT 5A@ >5A@ TT
(#
+#)F:6K$ :6K$#
(*+ *)#
(*+ *)((#
(*+ X
*)#
(*+;) *)((#
(*+;) *);)#
(*+ X
*)((;)#
(*+ *);) *)((;) ;) X
;)#
(*+F
>
;)#
(*+ *)M55J#
(*+F
# 2 F
(#
+#F 3H (#
+#6
また、 ==+ は
511 の " で取り敢えず :8 が使えるようにするパッチで、内容は
=+)=+&K
9+ ;7 5@ ? >>> =+)=+ ;
P*
J @W TT 5?WAW >5?WA5 TT
8 5J "# *( 0 8
># +#
+E(#
*G
>+#
&M::6 5
>
>
#EM; <#)*(&
E/+7A )
A 5A *(A O&
GGB
>()
+#
&M::6 5J
#EM; <#)*(&
E/+7A )
A 5JA *(A O&
GGB
>
+#
/+ &M::6H
C()B
.3 パッチについては、普通のプラットフォームでは忘れていいだろう。,
:113 の環境では、最適化の問題あ
り、!& &6: !#)#
は、@ @ では正常動作しなかった。
また、上記の 2412 フォントの場所の変更にともない、 を変更する必要がある。
1
#8I
1
#8I
EG
)
*)) )
01/2/1 のパスの問題
は " の -D+
+ の 版として、-D+
+ というコマンドを提供している。が、標準のもの
は、探すべきヘッダーのパスにシステム標準パスの一部が含まれておらず、警告を出す。煩わしいので著者の環境
では
"*#(+;+*(-D&K 9+ ;7 5@ >>> "*#(+;+*(-D
;
P*( = 5=W= TT 5@A@ >5@A5? TT
;Q%:I$ K %&6$1%:%&XF*)#
(*+XF %'P1II&MXF"LXF
;Q%:I$ K %&6$1%:%&XF*)#
(*+XF %'P1II&MXFXF
()
;Q%:I$ K %&6$1%:%&XF*)#
(*+XF %'P1II&MXFXF
>K$&'%&
E) (( /O5 Y U*)U Y )+ U)H8XE*)(#"(#"8XG))HX5HUG
>:&6%&
XFEK$&'%&G#
(*+XF
>&6$1%:%& XF*)#
(*+XF
>&6%& XFE) (( )#
) EK$&'%&G Y #
(*+>>GXF
>;Q%:I$ K %:&6%&E:&6%&G X
>
%&6$1%:%&E&6$1%:%&G X
>
%&6%&E&6%&G X
>
%'P1II&MXFXF
+#
"#
+(#" のようなパッチをあてて、-D+
+ をコンパイルし直して使っている。
関連図書
<= @ A 939 %D2
&-
724 2@A #/97 8 6A >
<= @(5 -2@A <= @ -2@A 8272
?