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な理由でたばこを吸わせているかがわかることを期待している。