プログラムの

ロジックがすっきりするなぁ。
研究のプログラム、メインのソルバーはほぼ書けてしまった。

C++ をやめる理由。
昨日が多すぎる。これであれが実現できるんじゃないか?とか思うと大抵泥沼で
バッドノウハウを積み上がっていく。
結果として元々の実現したかったことは醜く複雑になってしまう。

プログラミングってのは本来難しいことをできるだけ平易にして書くもので、
複雑になっちゃおしまいだよ。

バッドノウハウに感じるのも、バッドノウハウになってしまうのも
習熟が足りないせいっていう反論はあるかもしれないけど、
習熟ってのは慣れで、慣れによってプログラムが自然に見える、
見えないということは確かにある。
けど、正直あそこまで複雑だと言語全体に慣れるまでどれくらい時間を浪費すればいいんだろうね。

You like C++ because you're only using 20% of it. And that's fine, everyone only
uses 20% of C++, the problem is that everyone uses a different 20% :)

The C++ bashing season is back - Eli Bendersky's website

というように機能を限定して使えば、better なんだろうけど、限定していって最低限をとれば、C で十分。

おまけに C++ だと GCC も長大なエラーメッセージを吐くし、やってらんないよ。

ということで、可能な限りもう C++ では書かない。

もう、

C++ は使わないと決めたので、json を読みこむのに
Jansson — C library for working with JSON data を使ってみました*1
大分すっきりしたコードになりました。

結局使う機能がしぼられている方が、集中しやすいし、ロジックを簡単なものにしやすい、
C++を使うつもりが使われていた、ということを実感しました。
僕の頭にはC++ は複雑すぎます。

過ぎたるは及ばざるが如し。

*1:選定基準ドキュメント

おー、

Mac miniSnow Leopard Server 版が!
Mac OS X Server 利用する選択肢としては、

なので、価格設定としては非常にお得なモデルですね。


しかし、Snow Leopard Sever が unlimited クライアント版なのに、
Ethernet が一つしかない、ハードをばらしたいときに面倒、
HDD 容量もカスタマイズできないしといった点が今一。
Ethernet は USB ポートが5つあるので、1つを Ethernet に変換しろということかしら。


そして、ターゲットとして想定されるのが、
お金をかけずに、小規模ネットワークを構築したい、Server をたてたい、そして何より Mac OS X Server で!
というところでしょうから、需要はそれほどなさそうで、
売れるのか?という疑問。

財布事情的には非常に魅力的なのですけどね。

つかれた、

夕食後、指導教官となぜか超流動フォノンーロトン・スペクトルの話。
なかなか勉強になります。
岩波講座 現代物理学の基礎 物性 と Abrikosov Gor'kov Dzyaloshinskii は読んでおくべしとのこと。
こういう意外な引き出しもあって、近似法も何もかも空ですぐでてくるあたりやはりすごい。
あと、研究と BEC の関係等も。
なにやら光格子で実験ができるとか。
とりあえず、文献を探さねば。


その後、サーバー室の空調の異常に気付いて対処して今に至る。
明日(というかすでに今日か)空調をみてもらわないといけない。

それと Mac OS XBLAS の関数、例えば、dgemm を呼び出すのにちょっとてこずったので、やり方を書いておく。
まず、ライブラリ含まれているかどうかを調べる。/usr/lib/libatlas.dylib に含まれているはず。

 $ otool -v -t /usr/lib/libatlas.dylib|grep dgemm
_scalar_dgemm:
_dgemm_:
_atl_f77wrap_dgemm__:
_cblas_dgemm:
_ATL_dgemm:
_ATL_dgemmNN:
_ATL_dgemmNT:
_ATL_dgemmTN:
_ATL_dgemmTT:
_ATL_dgemmNN_RB:
_ATL_dgemmNT_RB:
_ATL_dgemmTN_RB:

とまぁ含まれている。
しかし、libatlas をロードしてもコンパイルできない。
vecLib/vecLib.h を include すればよいと思っていたのだけれど、
vecLib.h から vBLAS.h を見ると Single precision の関数しかプロトタイプ宣言がない。
なので、自前でヘッダを書かないといけない。

extern "C"{
extern void dgemm_(const char*, const char*, const int*, const int*, const int*, co
nst double*, const double*, const int*, const double*, const int*, const double*, d
ouble*, const int*);
}

これで、libatlas をロードしてやれば ok.

とりゃあっと

BLAS, LAPACK の subroutine がややこしいので wrapper を書いた。
しかし、BLASLAPACK は破壊的な subroutine なので、
operator だと内部でコピーするので余計な生成がおきてしまう。
*= += -= とかは、メンバに一時的な配列を加えておいて、copy してごまかした。
+ - * とかはまぁしょうがない。

サイズ等のチェックは手抜きしてるけど、DEBUG マクロの有無でチェックしてログ生成するくらいはやるべきかも。
あと呼び出し operator でうまく利用できるといいけど、とりあえず保留。


しかし、今月はコーディングしかしていないなぁ。