2008年10月6日月曜日

wavelet transform on Haskell

久々の更新です。大学卒業したらFFTW扱う暇がなくなって、FFTWモジュールの話は作りかけとまってます。もうしばし待ってください。

で、ずっと更新しないと管理を放棄したかのように思われるので小ネタを。
wavelet変換と呼ばれる信号処理?画像処理?用の変換があります。フーリエ変換と比較して、時間(not周波数)に関しての変換が可能だったりで、多重解像度解析を利用したさまざまな応用があります。

で、普通は信号処理なのでそれっぽい言語を使って実装するところ、Haskellの練習がてら以下のコードを学生時代に書きました。

---------------この区切り表現、Haskellと相性いいかも。
import IO
import System
import List
main = do [filename] <- getArgs
input <- openFile filename ReadMode
x <- hGetContents input
file <- openFile "scaling.dat" WriteMode
-- scaling coefficient
hPutStr file $ unlines $ map sDouble $
[scalingCoefficient level k ((makeList x)!! 0)
|k<-[0..((length ((makeList x)!!0)) `div` (2^level))-1 ]]
hClose file
-- wavelet expansion coefficient
file <- openFile "wavelet.dat" WriteMode
hPutStr file $ unlines $ map sDouble $
[waveletExpansionCoefficient j k ((makeList x)!! 0)
| j<-[1..level],
k<-[0..((length ((makeList x)!!0)) `div` (2^j))-1 ]]
hClose file
hClose input
level :: Int
level = 3
p :: [Double]
p = [0.4829629131445341,0.8365163037378077,0.2241438680420134,-0.1294095225512603]

q :: [Double]
q = zipWith (*) (cycle [1,-1]) (reverse p)
n = 4


scalingCoefficient j k x = if j==0
then (x!!k)
else 0.5 * (sum $ zipWith (*) p [scalingCoefficient (j-1) i x| i<-drop (2*k) $cycle [0..((length x)`div`(2^(j-1))-1)]])

waveletExpansionCoefficient j k x = sum $ zipWith (*) q [scalingCoefficient (j-1) i x|
i<-drop (2*k-1) $cycle [0..((length x)-1)]]

makeList :: String -> [[Double]]
makeList x = transpose $map (map rDouble) $ map words $ lines x

rDouble :: String -> Double
rDouble = read

sDouble :: Double -> String
sDouble = show

---------------

インプットファイルは変換したい信号(波形)を等間隔でサンプリングした結果を、
0.11
0.14
0.15
......
と改行区切りで延々いれたものです。

コンパイルした後
% ghc -o wavele wavelet.hs
% ./wavelet inputfile.name
として使用してください。
scaling係数がscaling.datに、wavelet係数がwavelet.datに出力されます。
ちなみにDaubechies waveletの4。レベル3まで変換します。
信号長さが十分な場合はもっと深いレベルまで変換するのも可。

このコード、作ったのはいいものの信号量が膨大(GByteオーダー)になりすぎてGHCの速度じゃ太刀打ちできなくなって、C++で作り直したんだよなぁ……

それ以前に、汚いコードなのでまねはしないでください。

2008年4月28日月曜日

多言語対応PAGER lv

lvのインストールには
http://www.ff.iij4u.or.jp/~nrt/lv/
のダウンロードからlvVERSION.tar.gzをダウンロードして、
$tar xzf lvVERSION.tar.gz
$cd lvVERSION/build
$../src/configure
$make
$make install

最近はyum とかapt-getとかで入れられるかも。
これがあると他のOS等からもらってきたファイルの文字コードを変更しなくても、自動認識して表示してくれるのでかなり便利。

2008年3月6日木曜日

帰国

帰ってきました。
この後、8日夜から台湾に出掛けるので更新はまた遅れます。
次回予定。FFTWモジュールのインストール。

2008年2月27日水曜日

外出

ちょっとフランスに行ってきます。

2008年2月20日水曜日

mltermのインストール

mltermは、Multi Lingual TERMinal の略で、libc / Xlibを利用する多言語対応ターミナルエミュレータである。
背景等価、アンチエイリアス、マルチpty対応などの昨日を持っている。
http://mlterm.sourceforge.net/からダウンロードが出来る。
特に何も考えず、
% ./configure
% make
% su
% make install
で使用することが出来る。
Ctrl+F2で新しいpty端末を開くことが出来、
Ctrl+F3で次の画面に、Ctrl+F4で前の画面に戻ることが出来る。利用している感じはタブブラウザを使用しているかのよう。

インストールしたままだと文字があまり綺麗ではないので、.mlterm/fontを
ISO8859_1=14,-shinonome-gothic-medium-r-*-*-14-*-*-*-*-*-iso8859-1
ISO8859_1_BOLD=14,-shinonome-gothic-medium-r-*-*-14-*-*-*-*-*-iso8859-1
JISX0201_ROMAN=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0201.1976-0
JISX0201_ROMAN_BOLD=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0201.1976-0
JISX0201_KATA=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0201.1976-0
JISX0201_KATA_BOLD=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0201.1976-0
JISX0208_1983=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0208.1983-0
JISX0208_1983_BOLD=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0208.1983-0
JISX0208_1990=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0208.1990-0
JISX0208_1990_BOLD=14,-shinonome-*-medium-r-*-*-14-*-*-*-*-*-jisx0208.1990-0
と設定してやると、なかなか綺麗な画面になる。

色合いが結構目に刺激的なので、.mlterm/colorを
http://www.seeds-man.com/~nari/v2/people/nari/comp/linux/mlterm1.shtml
を参考にして、
blue=#6699ff
hl_blue=#6699ff
green=#66ff66
hl_green=#66ff66
red=#ff6666
hl_red=#ff6666
yellow=#ffd314
hl_yellow=#ffd314
magenta=#9b4fff
hl_magenta=#9b4fff
のように変更している。

yumの設定

/etc/yum.confの設定を変更。

cachedir=/var/cache/yum
logfile=/var/log/yum.log
pluginpath=/usr/lib/yum-plugins/
debuglevel=2
distroverpkg=redhat-release
metadata_expire=72000
tolerant=1
exactarch=1
plugins=1
proxy=http://proxyserveraddress:port/

最後の1行を追加したことで、proxy経由で取得出来る。

2008年2月16日土曜日

ROOT histogramの操作(1)

treeと並ぶROOTで最も良く使用されるclassが、ヒストグラムである。

全てのヒストグラムクラスはTH1クラスを継承して作成されている。
1次元ヒストグラムとして
ビンの値が整数値で
TH1C//127まで
TH1S//32767まで
TH1I//2147483647まで
浮動小数点数で
TH1F//単精度、7bit
TH1D//倍精度、14bit
という風になっている。2,3次元ヒストグラムに関しても同様。

作成は
TH1D *hist=new TH1D("hist","title",number,min,max);
の形で作るのが一般的。min~maxの区間を等間隔にnumber個のビンに区切ったヒストグラムが作成される。ビンにはそれぞれ番号が付けられていて、一番下側のビン(min,min+(max-min)/number)は1番、以後順にあがっていって最後のビン(max-(max-min)/number,max)はnumber番になる。0番は下限値以下の値、number+1番が上限値以上の値となる。

ビン幅を等幅以外にしたい時は、
TH1D *hist=new TH1D("hist","title",number,xbins);
とする。xbinsは各々のビンの下限値を示す配列へのポインタである。例えば、
1~2、2~4、4~8、8~16というビンでヒストグラムを作成したければ、
double xbins[]={1,2,4,8,16};
TH1D *hist=new TH1D("hist","title",4,xbins);
という風にする。ここで、numberには4が入るのに対して、xbinsは5つの値が必要なことに注意する。

値をヒストグラムに格納するには、
hist->Fill(val);
とする。

ビンの値を直接変更したい場合は、
hist->SetBinContent(num,val);
とすると、num番目のビンにvalがセットされる。逆にビンの値を取り出したい時は、
double val=hist->SetBinContent(num);
のようにするとvalにnum番目のビンの値が返ってくる。

ヒストグラムの最大、最小値のビンを探すには
hist->GetMaximumBin();
hist->GetMinimumBin();
を使う。最大値、最小値を求めるには、
hist->GetBinContent(hist->GetMaximumBin());
hist->GetBinContent(hist->GetMinimumBin());
のようにする。

2008年2月11日月曜日

ROOT canvasの操作

ROOTでは、ヒストグラムやグラフなどを描画すると、canvasという物に描かれる。
この項ではcanvasを取り扱うTCanvasについて主に説明する。

まず始めに、TCanvasを作ってみよう。
TCanvas *cvs=new TCanvas("cvs","test cvs",600,400);
// 600×400のcanvasの作成
"test cvs"という名前のwindowが作成される。これがcanvasだ。

TH1D *hist1=new TH1D("hist1","test histgram",100,0,1);
//histgramの作成
hist1->Draw();
//histgramが"test cvs"というタイトルの付いたwindowに描かれる。

もし、cvsを作成していなかったらどうなるか。
hist1->Draw();
<TCanvas::MakeDefCanvas>: created default TCanvas with name c1
この場合は、デフォルトのcanvasが作成され、そこにヒストグラムが描かれる。

ここでもう一つのヒストグラムを見たいと思い、描画を行うと
TH1D *hist2=new TH1D("hist2","test histgram",100,0,1);
hist2->Draw();//もう一つも描画。
先ほど描いたhist1のヒストグラムは消され、新たにhist2が描かれる。


これでは困る、同時に見比べたいという時の対処法は、3つある。
1:ヒストグラムを重ねて描く
2:もう一つcanvasを作る
3:今のcanvasを分割して使用

1:に関してはこの項では扱わない。
2:に関しては
TCanvas *cvs2=new TCanvas("cvs2","another canvas",600,400);
とやって新しいcanvasを作成してから描画するcanvasを選択する。
選択されているcanvasは黄色の枠で囲まれている。変更する時はマウスでミドルクリック(中ボタンを押す)するか、
cvs2->cd();
とする。

この後で、
hist2->Draw();
と描くと、"another canvas"という名前がついたwindowにhist2が描かれる。

3:に関しては、
cvs->Divide(1,2);//x軸方向1分割、y軸方向2分割
上段を選択して
hist1->Draw();//上段に描画
下段を選択して
hist2->Draw();//下段に描画
という感じで描画を行う。

画面の選択をマウスを使わずに行う時は、
cvs->cd(1);
のように、canvasを番号で指定して選択する。番号の割り振りは左上から右下に向かって順番に行われる。
例えば、
cvs->Divide(2,2);
なら
1,2
3,4
という番号が割り振られている。

分割に関して、特定のcvsだけ更に細かく分割を行いたい時は
cvs->Divide(1,2);
TCanvas *cvs1=cvs->cd(1);
cvs1->Divide(2,1);
とやると、上段2列、下段1列のcanvasが作成できる。

canvasの描画や分割を消去したい時は、
cvs->Clear();
を行う。このとき、分割してできたcvs1が指し示す先は存在しなくなる。これを避けるには、"D"オプションをつけて、
cvs->Clear("D");
とする。こうすると、直接操作でつくった(cvs->Divide()で作成した)画面分割は保存される。
また、Close()を呼び出すとcanvasを閉じる、
Flush()を呼び出すと描画をflush(強制描画)する、Update()を呼び出すとupdate(強制描画+α)する、などがある。

2008年2月10日日曜日

ROOT ファイルとディレクトリの操作

ROOTでは、作業を行っている環境がどこにあるかというのが問題になる。
作業中の環境の
確認 .pwd or gDirectory->pwd();
表示 .ls or gDirectory->ls();
変更 gDirectory->cd()//thisに移動
gDirectory->Cd("path:")//pathと言いつつファイル名。「:」が必要。

どのディレクトリで作業しているかが問題になるのは、例えばこんな時。
TFile f("foo.root","update");
TNtuple *tuple=(TNtuple*)f.Get("tuple");
//////////tupleに対して色々と変更を加える。
TFile g("bar.root");
tuple->Write("","TObject::kOverwrite);// error! gに書き込めないと表示される。
gDirectory->Cd("foo.root:");
tuple->Write("","TObject::kOverwrite);// 今度は上書きに成功。

2008年2月7日木曜日

perl 列の並び替え

perl -i -n -e 'print join (" ", reverse split (" ", $_)), "\n";' filename

-eはおなじみスクリプトを引数に与える。
-nでスクリプトがwhile(<>){}に含まれているように振る舞う。
-iが無ければ標準出力へ。

スクリプトの中身は
split(" ",$_)で入力文字列を" "で区切り配列に。
csvファイルならsplit(",",$_)になる。

reverseで配列の順番を逆順に

joinはsplitの逆の動作

んで最後にprint

2008年2月3日日曜日

ROOT treeの操作

treeの作成
TTree *tree = new TTree("name", "title")

treeの構造の確認
tree->Print();
こんな感じで表示されます。

******************************************************************************
*Tree :tree : tree *
*Entries : 0 : Total = 1475 bytes File Size = 0 *
* : : Tree compression factor = 1.00 *
******************************************************************************
*Br 0 :x : x/D *
*Entries : 0 : Total Size= 610 bytes One basket in memory *
*Baskets : 0 : Basket Size= 32000 bytes Compression= 1.00 *
*............................................................................*
*Br 1 :y : y/D *
*Entries : 0 : Total Size= 610 bytes One basket in memory *
*Baskets : 0 : Basket Size= 32000 bytes Compression= 1.00 *
*............................................................................*

要素数の確認
Long64_t num=tree->GetEntries();//全要素
Long64_t num=tree->GetEntries(const char *selection);//おそらく条件に一致する要素数

要素数の設定
tree->SetEntries(number);//number個に設定

branchの追加
TBranch *branch=tree->Branch("name",&val,"name/type");
val= ****;//valに適当な値を代入。
branch->Fill(); //Fill()するたびにvalの値が追加される。
tree->SetEntries(i);//branchにFillしてもtreeの要素数は増えないのに注意。
treeのentry数を上回ってしまったら適宜設定を。

typeはalphabet一文字で表される。大文字小文字の区別があるのに注意。
- C : a character string terminated by the 0 character
- B : an 8 bit signed integer (Char_t)
- b : an 8 bit unsigned integer (UChar_t)
- S : a 16 bit signed integer (Short_t)
- s : a 16 bit unsigned integer (UShort_t)
- I : a 32 bit signed integer (Int_t)
- i : a 32 bit unsigned integer (UInt_t)
- F : a 32 bit floating point (Float_t)
- D : a 64 bit floating point (Double_t)
- L : a 64 bit signed integer (Long64_t)
- l : a 64 bit unsigned integer (ULong64_t)
- O : a boolean (Bool_t)

一つのbranchに複数の値を設定する時は、
typedef struct{
UInt_t A,Z;
Double_t energy;
} Particle;
struct Particle fragment;
TBranch *branch=tree->Branch("fragment",&fragment,"A/i:Z/i:energy/D");
fragment.Z=1;
fragment.A=2;
fragment.energy=1e6;
branch->Fill();
てな感じで。

値の確認
tree->SetBranchAddress("name",&val);
tree->GetEntry(n);//valに"name"要素のn番目の値が格納される。

値の表示
tree->Show(i=-1);
iを設定しない時はcurrent entryが、設定すると設定したentryが表示される。

histgramの描画
tree->Draw("energy");//1次元
tree->Draw("A:Z");//2次元
tree->Draw("A:Z:energy");//3次元
のように描ける。詳しくは別のブログエントリーで。

2008年2月2日土曜日

理系白書 この国を静かに支える人たち


あれは私が高校生の頃だったか、中学生の頃だったか。行きつけの散髪屋で髪の毛を切ってもらっている時に、親父さんと話をしたことを思い出す。
「○○くんは将来なにになりたいの?」「もっとスゴい半導体を創りたい」というような、いわゆる理系の進路を目指したいと答えると、「理系か、スゴいねぇ」と言われた。そのときの私は生意気盛りだったのだろう、「スゴくなんかないよ。だって、今の日本は文系が強いじゃないか」と口答えをした。散髪屋の親父さんは「そうかなぁ。やっぱり理系はスゴいと思うよ」というが、どうしてもそうだとは思えなかった。おもわず、「だって、日本で一番えらい人は総理大臣で、文系じゃないか」といってしまった。

今考えると、別に日本で一番えらい人は総理大臣ではない。しかし、おそらく当時の私にとって、総理大臣というのは立身出世や世の中の評価の象徴だったのだろう。そしてそのころ既に私は「日本で理系は冷遇されている」ということに薄々気がついていたのだろう。

その後、毎日新聞で「理系白書」の連載が始まった。本書はその1年ちょっとの記事を再構成したものである。内容は理系の不遇な現状に始まり、理系の目指す将来で終わる。

当時、「理系は冷遇されている」と薄々感づいていた現実は、大学院に進学した今も感じる。実際に理系人となってみて、この本に書かれている内容は事実だと強く感じる。だからこそ、私のまわりにいる友人たちの内に、理系の不遇を感じいわゆる理系就職を選ばないで文系就職を行っている人がいるし、就職活動中もそのような人をたくさん見た。もちろん、このような人は少数派ではあるが、バブル期以前よりは増えているのではないだろうか?

だから、不遇な状態の改善はいらない。この状態を赤裸々に知らせることが必要なだけだ。そうすれば、理系を目指そうとする人は減り、企業、社会、国家がもつ「技術立国日本」という財産は失われるか、これを避けるために自動的に地位が向上するだろうから。

悪魔のマーケティング
タバコ産業が語った真実


まだ未読だが、読みたい本として。
「たばこが有害だ!」といって喫煙者を嫌う人が多いが、たばこを吸う人が世にたくさんいるのは紛れもない事実。しかし、喫煙について嫌煙者と愛煙家が議論をすると、往々にして双方が自らの行動の正当性を主張するだけの水掛け論に終わることが多い。
たばこが有害であることは、たばこ会社も自社製品に記載する間違いない事実であるならば、愛煙家はなぜ吸うのだろうか? 彼らは自分が吸っている製品を作っている会社の記述は信用しないが製品だけは安全であると信用しているのか。彼らとて人間なのだから、体を害すること自体が好きな訳ではないだろう。他に何か吸いたくなるような理由があるはずだ。
もちろん、positiveな理由から吸う人もいるだろうが、ニコチン依存とまで呼ばれるような人が発生している事実は、negativeな理由で吸っている人がいることを想像させる。
この本を読むことでたばこ会社がいかにnegativeな理由でたばこを吸わせているかがわかることを期待している。

2008年1月27日日曜日

カラー図解 プラズマエネルギーの全て


プラズマ・核融合学会 編というだけあって、書いている内容は核融合炉に結びつく内容が多い。話の筋立てはプラズマの説明、現在の応用例、核融合への応用の近況、今後となっていて無理がない方だと思う。数式が出てこないのも専門以外の人が読むことを考えると好印象。実際に研究開発を行っている立場の人が書いているので、核融合の利点が強調されているのは、他の自然エネルギーが好きな人や石油無機起源説を信じている人にはしゃくに障るかもしれない。
と、思ったら最終章でその辺にもふれていた。ようは、「そーいうのも使えるかもしれんけど、最終的には高価になりすぎて割に合わなくなるっしょ?」ということだそうで、納得。

核融合を志す人も、批判的な人も、「現状がどういうものか」ということについての共有認識をもてるので、読んで欲しい。

2008年1月26日土曜日

ROOTの各種操作

ROOTのインストールが出来たら起動してみよう。
Windowsの場合はスタートメニューから、Linuxの場合は
% root
と入力すると起動する。

*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 5.18/00 16 January 2008 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************

CINT/ROOT C/C++ Interpreter version 5.16.29, Jan 08, 2008
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0]

こんな表示が出てきただろうか? 出てきたら成功である。
英語でごちゃごちゃ書いているので、実際に「?」を入力して見よう。
ROOTの使い方が表示される。
色々とあるが、使う機会の多いコマンドをいくつか書いておく。

.L file名 // C/C++のソースファイルやヘッダーファイルの読み込み。
.X file名 // 読み込んだ上でファイル名と同名の関数を実行。
.U file名 // C/C++のソースファイルやヘッダーファイルを読み込まなかったことに。
.! コマンド // 各種コマンドを実行(ex. ls)。

.p 数式 // 各種数式を計算して結果を出力してくれます。
例として
.p 3+5 // と入力すれば
(const int)8 //のように
.p 2**10 //と入力すれば
(const int)1024 //と出力
ROOTで使える関数なら返り値を出力してくれます。
各種数学関数も使えるので電卓としての利用も可能です。

そのほかに、ROOTはbashと近い使い勝手なので、
Ctrl-r //入力履歴の検索
Ctrl-a //カーソルを行頭へ
Ctrl-e //カーソルを行末へ
Ctrl-n //一つ前の入力履歴
Ctrl-p //一つ後の入力履歴
Ctrl-f //カーソルを一つ進める
Ctrl-b //カーソルを一つもどす
入力中に[TAB] // 入力補完

出力のリダイレクトも可能です。
> [file] // fileに標準出力
2> [file] // fileに標準エラー出力
>& [file] // fileに標準出力と標準エラー出力の両方

そして何より重要な
.q // ROOTを終了。

2008年1月23日水曜日

Foxit Reader

Foxit ReaderはFoxit Software Company で製作されたフリーのPDFリーダーだ。

フリーってだけならAdobe PDF Reader もフリーなのだが、この製品がAdobe のリーダーと違うところはその動作速度の速さ。
Adobe Reader は起動時に、○○を読み込んでいます……という表記を出して、起動に時間がかかる。TEXからPDFを作成している時など、「書く」→「変換」→「PDFで確認」→「PDFファイルを閉じる」→「書く」……のルーチンで下手すりゃ変換とさほど変わらない時間がかかり、いらいらさせられていたが、Foxit Reader を使えばはそういう不愉快は感じずにすむ。

確かに、Adobe Reader の最新版を使用していれば確実にPDFを表示できるという利点があるが、Foxitで表示が崩れるファイルはほとんどない。滅多に感じない不便を回避するために日頃からいらいらさせられるのはもったいない話。Foxitを使って快適にPDFを見るのも良いのではないだろうか。

互換性が気になる人は日常的にはFoxit、念のためにAdobe Readerも入れておいてHDDの肥やしにしておけるのだから。

1/25追記
日本語の文書を表示するためには
http://foxitsoftware.com/downloads/
にある"Eastern Asian Language Support"をダウンロードし、解凍した中に入っているfpdfcjk.binをFoxit Readerのフォルダに展開する必要がある。

2008年1月21日月曜日

PrimoPDF

無料で使えるPDF変換ソフト。
PrimoPDF

対応OSもWindows 98/Me/NT/2000/XP/VISTAとWindowsなら一通りそろっており、
日本語版もエクセルソフトのHPで公開されている

使い方もとっても簡単。
印刷時に使用するプリンタでprimoPDFを選択
→印刷
→保存場所と作成するファイル名を入力。
これだけできれいなPDFが作成できる。
Adobe Acrobatいらず。

2008年1月20日日曜日

ROOTの環境設定(2)

root**シリーズの設定について
私は初期設定から変えないのですが、rootlogonは起動時によけいなことをごちゃごちゃと表記するので、変更したファイルを公開しておきます。

#rootlogon.C ここから

{
TCanvas *can=new TCanvas("can","no title",700,400);
// 起動時にwindowを開く。
can->SetLogz();
// プロット時、z軸をlog scale に
gStyle->SetPalette(1,0);
// 2次元以上のヒストグラムでカラー表示する時、色を色相環順に
gStyle->SetFillColor(4);
// 塗りつぶしの色を青に
gStyle->SetLineColor(4);
// 線の色も青に
}

#ここまで

特に、gStyle->SetPalette(1,0);はお勧めです。初期設定の色だと非常に見づらいです。

1/26追記
よくよく見れば、rootlogon等の雛形が"ROOTSYS/tutorials"にありますね。
これをコピーして使用するのも良いと思います。

ROOTの環境設定(1)

各種のROOTパラメータが記述されるファイルが存在します。
例えば、起動時に読み込まれるrootlogon.C, 終了時に読み込まれるrootlogoff.Cなどです。


と、書いても初めてROOTを使う時はどこにあるかわからないと思います。
これらのファイルの場所は、
$ROOTSYS/etc/system.rootrc
に記述されています。

//////Linuxの場合
Unix.*.Root.DynamicPath: .:$(ROOTSYS)/lib:
Unix.*.Root.MacroPath: .:$(ROOTSYS)/macros:

//////Windowsの場合
WinNT.*.Root.DynamicPath: .;$(ROOTSYS)/bin;$(PATH);
WinNT.*.Root.MacroPath: .;$(ROOTSYS)/macros;

のような記述を探してください。
ここに示されている「MacroPath」が各種設定ファイルの格納場所です。
個々人で設定を変更したい場合は、$(ROOTSYS)を$(HOME)などの個々人の専用ディレクトリに書き換えます。

なお、このファイルには他にも
Hist.Binning.1D.x: 100
のように、様々な設定項目が存在します。変更しておくと、この設定がすべてのユーザーに反映されます。

2008年1月19日土曜日

ROOTのインストール

ROOTのインストール方法について載せる。

Windowsの場合、
http://root.cern.ch/twiki/bin/view/ROOT/Download
から*recommended*と記されたバージョンのバイナリページに飛び、必要なインストールファイルをダウンロード。特にこだわりがなければThis is our recommended version for Windows. と書かれているのをダウンロード。こだわりのある人は説明を読んで対応。
後はそのファイルを起動してOpen -> OK -> Next ->……とやっていくと勝手に入ってくれます。お手軽。

Linuxで一番楽な方法は先のページから、使っているOSに対応するバイナリをダウンロード。

tar xzf root_vバージョン.OS.コンパイラ.tar.gz

とすればコンパイル済みのROOTが展開される。
もし、対応するバージョンのバイナリが無かった場合はそのページの上の方にあるSourceファイルを落とした上で、

tar xzf root_vバージョン.source.tar.gz
cd root
./configure --help //helpを読んで設定する必要のあるパラメータを確かめる
./configure 各種パラメータ
make

とすれば必要なバイナリが作成できる。

この後、

cp -r root どっか適当なディレクトリ

としてROOTのディレクトリを設定し(特に不満がなければ今の場所でも可)、環境変数を設定すると使えるようになる。

環境変数の設定の仕方はbsh系(bsh,bash,zshなど)の場合、各々の設定ファイル(.bashrc,.zshrcなど)に
export ROOTSYS=どっか適当なディレクトリ/root
export PATH=$PATH:$ROOTSYS/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOTSYS/lib
と記述する。
csh系(csh,tcshなど)は……すみません、知らないですが同様の値が設定されるようにしてください。

ROOT

ROOTCERN(European Organization for Nuclear Research)で開発が続けられている大量のデータを扱うことが出来るオブジェクト指向(Object Oriented)の開発環境だ。

ROOTにはCINT C++ インタープリッタが含まれる。これはおそらく最も様々な環境で使えるC/C++のインタープリッタだろう……と思う。確かめたことがないので断言できない。

これを使うとC言語の学習も行いやすくなると思うので、このBlogでは以後このソフトについても扱っていきたい。

2008年1月17日木曜日

2008日経平均株価予想

ロイターの記事に08年の日経平均株価予想があったので最低予想価格順に
並び替えた上で転記。

第一生命経済研究所 嶌峰義清主席エコノミスト       12500─16000
草野グローバルフロンティア 草野豊己代表取締役      13000─16000
三井住友銀行 宇野大介市場営業統括部マーケットアナリスト 13500─16500
モルガン・スタンレー証券 神山直樹日本株ストラテジスト  14000―17000
ファンドクリエーション投信投資顧問
山田拓也シニアファンドマネージャー            14000─17500
大和総研 木野内栄治チーフテクニカルアナリスト      14000─17500
岡地証券 森裕恭投資情報室長               14000─17500
東海東京証券 鈴木誠一マーケットアナリスト        14000―18000
ピクテ投信投信顧問 小野塚二也ヘッドトレーダー      14000─18000
東洋証券 大塚竜太投資情報部長              14500―18000
みずほ投信投資顧問 岡本佳久執行役員           14000─18500
興銀第一ライフアセットマネジメント
宮田康弘シニア・ポートフォリオマネジャー         14000─19000
コスモ証券 清水三津雄エクイティ部副部長         14000─20000
ゴールドマン・サックス証券 
キャシー・松井チーフ日本株ストラテジスト         14500─17000
リーマンブラザーズ証券 宮島秀直チーフストラテジスト   14500―17500
SMBCフレンド証券 松野利彦投資情報室次長       14500─18500
大和証券SMBC 高橋和宏エクイティマーケティング部部長 14500─19500
水戸証券 松尾十作投資情報部長              14500―19000
丸和証券 大谷正之調査情報部次長             14500─19500
新生銀行 作本覚アセットマネージメント部部長       15000─19000
野村証券金融経済研究所 藤田貴一ストラテジスト      15000─17500
大和証券投資信託委託 長野吉納シニア・ストラテジスト   15000─19000
日興コーディアル証券 馬渕治好国際市場分析部長      15000―19500
新光証券 瀬川剛エクイティストラテジスト         15000─18000
エース証券 子幡健二専務                 15000─18000
みずほインベスターズ証券 稲泉雄朗投資情報部長      15000―18500
丸三証券・専務 水野善四郎氏               15000─19000
ちばぎんアセットマネジメント 安藤富士男専務       15000―20000
三菱UFJアセットマネジメント
石金淳運用企画Gストラテジスト              15000─21000
マネックス証券 清水洋介投資情報部長           15500─19500
http://jp.reuters.com/article/businessNews/
idJPJAPAN-29474420071223


07年12月17-20日に聞き取りをしたそうだが、大抵の個別株よりも指標である日経平均の方が値動きの幅が小さいにも関わらず、30人中27人(90%)が既に予想を外している。
この予想が行われていた時期の日経平均は15000円台前半。「ここからちょい下がるけど後であがるよ」程度の考えだったのだろうか。はたまた深謀遠慮の結果導き出されたのがこの予想だったのだろうか。

どちらにせよ言えることは、株価の予想は難しいということだろう。

ファイル内文字列の置換

sed -e "s/from/to/g" filename > newfile
perl -i -p -e "s/from/to/g" filename

で、filename内の「from」を「to」に変更。
perlの場合、-iオプションの後に拡張子を「.extension」の形で
記載することで.extensionがついたバックアップも作成。

c言語でbit長指定整数

符号付き
8bit -> int8_t
16bit -> int16_t
32bit -> int32_t
64bit -> int64_t
符号無し
8bit -> uint8_t
16bit -> uint16_t
32bit -> uint32_t
64bit -> uint64_t

このブログに関する説明

T.Oの備忘録として2008年1月17日に開始。
主なテーマはプログラミング、読書録。