llってなんだよ、っていうか凹んだ(微妙に)

プログラム工学VIを読み終えて、次はHaskeller への道など読んでます。

さて、Hello, World! プログラムでllってコマンド出てきた。

llってls -lのことか?と自分のFC5端末でllと打つとファイルのリストが表示される。whichすると確かにls -lにalias切ってあるし、、、、

/etc/profile.d/のファイルで設定されてる。

最近のパッケージはllって標準なのね、昔のはなかったよな~
とか思いながら、今もってる最古のOSでll打ってみた。

Kondara MNU/Linux release 1.2 (Ayaka)
Kernel 2.2.17-16ksmp-ata66 on a 2-processor i686
login:

$ which ll
alias ll='ls -l --color=tty'
        /bin/ls

うぉ、しっかりあるし、、、、。今までずっと無駄にls -lって打ってたことに気付いて凹んだ。ls -lがllなんて知らなかった。(ls -aはlaで使ってるけど)

profile.d見てみるとllでls -lのほかにl.ってのがあって,.で始まるファイルを表示するようにaliasきってあるようだ。

RSPerl

Statistics::R なんかいまいちとか言って、もっぱらRのヒストリファイルをいじってバッチ用に書き換えて使う日々が続いてたが、何を思ったのか、突然RSPerlを使いたくなったのでインストールしてみた。

まずは、Rのインストールから。rpmで楽々。

$ rpm -qa | grep R-
R-devel-2.3.1-1.fc5
R-2.3.1-1.fc5

RSPerlもコマンド一発で楽チン。

$ R CMD INSTALL  --configure-args='--with-in-perl' RSPerl_0.91-0.tar.gz

環境変数の設定スクリプトがあるので、/etc/profileに書いておく

$ vi /etc/profile
#for RSPerl
source /usr/lib/R/library/RSPerl/scripts/RSPerl.bsh

これで、OK。

でRSPerlのいいところは

  • 配列をリファレンスで渡せる(Statics::Rとは違う)
  • AUTOLOADでRの関数を呼び出せる。R::plotとかできる

ので、結構便利だ。

でもマトリックスとかデータフレームの扱いがちょっとめんどくさいのと、Rを起動するために、 &R::initR("--silent") とかやらないといけないのと、$r->plotとかやりたいのにR::plotと書かなきゃいけないので、長いコードだとごちゃごちゃしてきて見通しが悪くなる。

結局Rでバッチのほうがコードが読みやすかったりとか。やっぱRpyか。昨日ソフトのインストールに来てた業者の人も最近pythonの案件増えてますよ~とか言ってたし。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


うー、欲しくなってきた。

FC5のjavaではまる

Fedora core 5のjdkだとJchemPaintが立ち上がらないので、SUNのJDKをインストール

rpm -e jdk
rpm -ivh jdk-1_5_0_08-linux-i586.rpm

profileに環境変数書いておく

/etc/profile

#java
JAVA_HOME=/usr/java/jdk1.5.0_08
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/usr/local/javalib/cdk-20050826.jar:\
/usr/local/javalib/jchempaint-2.0.12.jar

クラスパスってcdkとかjchempaintのjarファイル指定する必要あるんだろうか?わからん。

/usr/bin/javac,java,jarのシンボリックリンクの張りなおしをして作業終了

二天一流とit' a jazz thing

懐かしの名曲のremixが出ていたので。

二天一流

二天一流のほうは、今風っちゅうよりも、アブストっぽさが失われたっちゅうか、なんかよくわからん。It's A Jazz Thingはちょっと回転速めの低音厚めで好きな感じの仕上がり。オリジナルはあれはあれでユラユラ感がたまらんのだけど。
Ni Ten Ichi Ryu
It's A Jazz Thing

メタモ楽しみとか書いたけど、やっぱ、ムンベ。つまり、DJ AKIが一番の楽しみなのだ。

量子化学計算ビギナーズマニュアル

Structure-Based Drug Designに従事していると、トラディッショナルな目視での解釈に限界と疑問を感じる時が遅かれ早かれやってくるはず。

そうなると、解いた蛋白-リガンド結晶構造をGAMESSとかABINIT-MPなんかでFMO計算し始めるわけだ(そのうちただ単に計算したいという理由でPDBのデータなんかに手出したり)これにより、電子的な相互作用をエネルギーの大小で考えることができるようになるため、複合体に対する理解が深まるのでイイ。

でも、やがてこれだけでは満足できなくなり、より深い解釈を求め始めるようになる。つまり、生化学、構造生物学から、有機化学、量子化学へと足を踏み入れはじめるようになるわけだ。

ただし、このような場合に、勉強するのにちょうどいい本や資料がないなぁと困っていたところ、GAMESSについて書かれている本が出版されたというエントリをみっけたので、脊髄反射的にamazonで購入してしまった。

s2k's eye 2nd Ed.: 「すぐできる量子化学計算…」を買いました。

Q&A形式で、どこからでも読めるというのも好印象です。そして、何より、今までの成書ではあまり無かったGAMESSについての解説が多く入れられています(GaussianとGAMESSの解説書です)。応用計算については多くがGaussianについてですが、これはGAMESSというプログラムの性質上しょうがないところでしょう。

内容は、FAQ集という感じで、200pぐらいある割には半日かからずに読み終えた。もちろんGAMESSに関する記述も結構あるので、Gamess Input Examplesを補完する目的でも使える。まぁ、計算化学系の研究室にいれば、こういったノウハウとかこつみたいなものは、誰かに聞けばすぐに解決するようなものなんだが、、、、
製薬系って量子化学計算する人って思ったほどは多くないので、D章の計算実践編とF章の目的別対処法は参考になった。

このように、初学者が悩んだりつまずいたりしそうなところをQ&A形式で解説している本なので、実験グループで量子化学計算を担当された方を対象にしているという前書きは納得がいく。

ただし、Howto本ではないから、ザボとか一通り読んであって、Gaussian,GAMESS触ったことがあって、unix系のエディタでファイル操作が普通にできるヒト向けでしょう。あとは、より深く知るためのリファレンスが少なすぎる気がするなぁ。改訂版出すならそこら辺を充実してくれればありがたい。

Wikiあればいいのに、RjpWikiの量子化学計算版みたいなの。

続 perlでフィボナッチ

昨日に引き続き3章を読み進めていたら、フィボナッチ数をキャッシュで高速化する例が。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 6402円 ( 2005-03-28 )


コードはこんな感じで、割と普通な。

my %cache;

sub fib{
    my $n = shift;
    unless (exists $cache{$n}){
    if($n < 2){
        $cache{$n} = 1;
    }else{   
        $cache{$n} = fib($n-1) + fib($n-2);
    }
    }
    return $cache{$n};
}

さて、昨日のタプルを使ったコードとどっちが速いのか比べてみた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/perl

use strict;
use warnings;
use Benchmark qw(cmpthese);

sub fibStep {
    my $n = shift;
    return [$n->[1], $n->[0] + $n->[1]];
}

sub fibPair {
    my ($n, $fs, $fp) = @_;
    return [0,1] if ($n == 0);
    return $fs->($fp->($n-1,$fs,$fp))
}

sub fastFib {
    my $n = shift;
    my $fs = \&fibStep;
    my $fp = \&fibPair;
    my $fib_num = $fp->($n,$fs,$fp);
    return $fib_num->[0];
}

my %cache;

sub fib{
    my $n = shift;
    unless (exists $cache{$n}){
    if($n < 2){
        $cache{$n} = 1;
    }else{   
        $cache{$n} = fib($n-1) + fib($n-2);
    }
    }
    return $cache{$n};
}

my $number = 50;
my $count = 10000000;

my $fibcache = \&fib;
my $fibfast = \&fib;

cmpthese($count, {
        'Cache' => $fibcache->($number),
        'Fast' => $fibfast->($number)
    });

とりあえず1000万回まわしてみたけどそれでもwarningがでるので、この際無視。

./fib.pl 
            (warning: too few iterations for a reliable count)
            (warning: too few iterations for a reliable count)
            Rate  Fast Cache
Fast  38461538/s    --  -27%
Cache 52631579/s   37%    --

キャッシュしたほうが速いというのがイマイチ理解できん。何でじゃろか?

haskellでフィボナッチ そしてPerlで書いてみた

普通のhaskellプログラミングを読み終えて、なんか次に読むものないかなと探していたら、webarchiveに面白そうなページがあることを知ったので、ダウンロードして読んでます。

3回目の講義資料に、タプルを使って高速にフィボナッチ数を計算する話があったので、なんでそうなるのかを理解するために手で書き下してみた。

普通に書くとこんな感じ(fib)。

fact :: Int -> Int
fact n
  | n == 0  = 1
  | n > 0   = fact (n-1) * n

書き下すと、計算量があっという間に増えていくことがわかる。

fib 5
=> fib 3 + fib 4
=> (fib 1 + fib 2) + (fib 2 + fib 3)
=> (fib1 + (fib 0 + fib 1)) + ((fib 0 + fib 1) + (fib 1 + fib 2))
=> (fib1 + (fib 0 + fib 1)) + ((fib 0 + fib 1) + (fib 1 + (fib 0 + fib 1)))

タプルを使った例(fastfib)

フィボナッチ数列を効率良く計算する方法を考えよう.前に見たとおり,フィボナッチ数列の各項は,その前の二つの項の和である.逆に言えば,二つの連続した項の値が与えられれば,次の項を計算するのは簡単なのだ.

fibStep :: (Int, Int) -> (Int, Int)
fibStep (u, v) = (v, u+v)

fibPair :: Int -> (Int, Int)
fibPair n
  | n == 0    = (0, 1)
  | otherwise = fibStep (fibPair (n-1))

fastFib :: Int -> Int
fastFib = fst . fibPair

コードを眺めただけではなんで速くなるのか実感がわかなかったので、書き下してみる。

fastFib 5
=> fst (fibPair 5)
=> fst (fibStep (fibPair 4))
=> fst (fibStep fibStep (fibPair 3))
=> fst (fibStep fibStep fibStep (fibPair 2))
=> fst (fibStep fibStep fibStep fibStep (fibPair 1))
=> fst (fibStep fibStep fibStep fibStep fibStep (fibPair 0))
=> fst (fibStep fibStep fibStep fibStep fibStep (0, 1))
=> fst (fibStep fibStep fibStep fibStep (1, 1))
=> fst (fibStep fibStep fibStep (1, 2))
=> fst (fibStep fibStep (2, 3))
=> fst (fibStep (3, 5))
=> fst (5, 7)
=> 5

をを、タプルにすることで、計算量が減ってます、自分で展開していくとなるほどとよくわかる。

さて、最近Higher-order Perlを読んでいる僕としては、これをperlで書いてみたくなるわけである。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl

use strict;
use warnings;

sub fibStep {
    my $n = shift;
    return [$n->[1], $n->[0] + $n->[1]];
}

sub fibPair {
    my ($n, $fs, $fp) = @_;
    return [0,1] if ($n == 0);
    return $fs->($fp->($n-1,$fs,$fp))
}

sub fastFib {
    my $n = shift;
    my $fs = \&fibStep;
    my $fp = \&fibPair;
    my $fib_num = $fp->($n,$fs,$fp);
    return $fib_num->[0];
}

my $number = shift;
print fastFib($number)

サブルーチンのリファレンスを引数にとらないといけないのがhaskellと異なるとこかな。あとは書いてて思ったのは関数の型を書くとプログラムの流れが理解しやすいナァと。

実行すると一瞬で計算が終わる(速い!)

実際に処理の流れを追うために-dオプションを付けて実行してsを連打すると、main::fibPairがどんどん実行されて$nが0になったところで今度はmain::fibStepが次々実行されていく様がわかる。

Higher-order Perlの5章にもフィボナッチ数列のことが書いてあるのだが、まだそこまで読み進めていない。(今3章突入したところ)

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


ProductName ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎
ソフトバンククリエイティブ / ?円 ( 2006-06-01 )


haskellを勉強しながら、Higher-order Perlを読むと、色々新たな発見があって楽しい。

Sudoku

実家に帰ったら、婆さんが数独にはまってた。ボケ防止にいいらしい。ちょうどいいので、flashの数独をgoogleで適当に探してきてお気に入りに登録しておいてやったら喜ばれたヨ。まぁ、使うかどうかわからんけど。

ちょうど、Highr Order Perl読み始めたところだし、家に戻ってきて、数独ソルバでも書いてみるかと思ってたら、タイミングよくUno, dos, tres, quatro!にエントリが。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 6402円 ( 2005-03-28 )


バックトラック法ってのを使えばいいのねと自分で書いてみたのはマス目を一つ一つ移動してくコードだったんだけど、再帰深すぎるヨっていうエラーを吐いて終了。なんかダメダメだなぁ。他の人のを読んでみるとまだ埋まってないマス目を再帰で埋めていくべきだったことに気付いた。ちょっとこれに引っ張られたかなと反省。

まだ埋まってないマス目の配列と、過程として数字を置いたマス目の配列の二つを用意して、バックトラック法で解くというわけですな。

とか、わかった上で、三行数独ソルバを読むと、説明もついてるしよくわかった、素敵。

家のマシンで三行数独ソルバを実行してみるとこんな感じ。

 $ time perl sudoku.pl < sample
 825169734
 463857921
 917234658
 684712593
 759386142
 231495867
 548621379
 376948215
 192573486 #本当はココまで一行で出力

 real    0m1.439s
 user    0m1.436s
 sys     0m0.004s

プログラム・プロムナードにhaskellの数独ソルバが載ってたのでそれも実行してみた。ちゃんと理解しないといけないと思いつつ、今回はコピペ。ghciで計算させた。

 *Main> sudoku sample
 [8 2 5 1 6 9 7 3 4
 4 6 3 8 5 7 9 2 1
 9 1 7 2 3 4 6 5 8

 6 8 4 7 1 2 5 9 3
 7 5 9 3 8 6 1 4 2
 2 3 1 4 9 5 8 6 7
 5 4 8 6 2 1 3 7 9
 3 7 6 9 4 8 2 1 5
 1 9 2 5 7 3 4 8 6
 ]
 (0.28 secs, 26584692 bytes)

haskellもperlクイズみたいなのを誰かやってくれたら嬉しいナァ。とか。

yum-fastestmirror

yumで速いリポジトリを自動的に選択するには - @IT

yum-fastestmirrorは、ミラーリストから速いリポジトリを自動的に選択してくれる。Fedora Extrasにパッケージが用意されているので、yumコマンドでインストールできる。

入れてみたが、そもそも家の回線が遅いのであまり実感できないのかも。または、いつも使っている理研のミラーが速いからプラグイン入れても速く感じないのかな。