[トップ][一覧][最近の更新]

archives/2007/04

Programming/clapack

Category of Programming

どういう因果か固有値問題を解くハメに。

行列操作ライブラリを一から書くのはゴメンだから、 OpenBSD-cvs:ports/math/lapackをインストールすることにした。 こっちの方が確実だし速い。

といっても、Fortranから使うのではなくて、Cから使うに決まってんよ。

OpenBSDのlapackはg77でビルドされるので、 Cから利用するのに必要なファイルはこれだけ: http://www.netlib.no/netlib/clapack/clapack.h

C++から呼ぶ時に困るかもしれないので、 ちょっとだけいじる。

--- clapack.h.orig      Tue Apr 10 01:05:18 2007
+++ clapack.h   Tue Apr 10 01:21:13 2007
@@ -1,6 +1,10 @@
 #ifndef __CLAPACK_H
 #define __CLAPACK_H
  
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Subroutine */ int cbdsqr_(char *uplo, integer *n, integer *ncvt, integer *
        nru, integer *ncc, real *d__, real *e, complex *vt, integer *ldvt, 
        complex *u, integer *ldu, complex *c__, integer *ldc, real *rwork, 
@@ -5075,5 +5079,9 @@
 /* Subroutine */ int zupmtr_(char *side, char *uplo, char *trans, integer *m, 
        integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *c__,
         integer *ldc, doublecomplex *work, integer *info);
+
+#if defined(__cplusplus)
+};
+#endif
 
 #endif /* __CLAPACK_H */

あとは自作ソフトのMakefileに、

LDADD = -llapack -lblas -lg2c -lm

を追加すべし。

ぜんぜん関係ないけど

Numerical RecipesってLisp版もあるのか。へえ。

uim/SJ3/uim-sj3

Category of uim

SJ3のuimのためのコードをちょっとだけ書いた。

要SJ3のパッチ: SJ3/2007/04/01/patch

このままじゃ入力はできないけど、遊べるところまでは行った。

てか、これから忙しくなりそうなので、 誰か書いてくれないですかね。 ここからが楽しいところでマジおすすめなんですけど。

$ uim-sh
uim> (load-plugin "sj3")
#t
uim> (sj3-lib-open "localhost" (getenv "USER"))
#t
uim> (sj3-lib-getkan "いれたてのおちゃ")
("入れた手のお茶" ("いれた" "入れた" #<c_pointer 0xcfbe8340>) ("ての" "手の" #<c_pointer 0xcfbe8370>) ("おちゃ" "お茶" #<c_pointer 0xcfbe83a0>))
uim> (sj3-lib-touroku "いれたて" "入れ立て" 'sj3-hinshi-nrmnoun)
#t
uim> (sj3-lib-getkan "いれたてのおちゃ")
("入れ立てのお茶" ("いれたての" "入れ立ての" #<c_pointer 0xcfbe8340>) ("おちゃ" "お茶" #<c_pointer 0xcfbe8370>))
uim> (define douon (sj3-lib-getdouon "おちゃ"))
douon
uim> douon
(("お茶" . #<c_pointer 0xcfb65444>) ("御茶" . #<c_pointer 0xcfb65668>))
uim> (sj3-lib-gakusyuu (cdr (nth 1 douon)))
#t
uim> (sj3-lib-getkan "いれたてのおちゃ")
("入れ立ての御茶" ("いれたての" "入れ立ての" #<c_pointer 0xcfbe8340>) ("おちゃ" "御茶" #<c_pointer 0xcfbe8370>))
uim> (sj3-lib-syoukyo "いれたて" "入れ立て" 'sj3-hinshi-nrmnoun)
#t
uim> (sj3-lib-getkan "いれたてのおちゃ")
("入れた手の御茶" ("いれた" "入れた" #<c_pointer 0xcfbe8340>) ("ての" "手の" #<c_pointer 0xcfbe8370>) ("おちゃ" "御茶" #<c_pointer 0xcfbe83a0>))
uim> (sj3-lib-close)
#t
uim> ^D

やる気のある方はuimのMLで名乗りを挙げてください。おながいします。

SJ3/patch

SJ3のパッチを作った。 もはや誰も使ってないと思うけど。

FreeBSD-cvs:ports/japanese/sj3/files/を取り込んでいるだが、http://oikumene.que.ne.jp/misc/ のpatchはGoogle:sj3 動かないらしいので、前のリビジョンからスタートしてみた。

OpenBSDとFC6で動作確認済み(kinput2, emacs+sj3-egg)。

変更点

  • 全体の変更
    • インストールレイアウトの変更
      • sj3servはsbin以下に
      • 設定ファイルはetc以下に
      • 辞書はvar/sj3/dict以下に
      • デフォルトで/tmp以下にファイル名決め打ちのファイルを作成するので変更
    • setuidフラグ禁止
    • インストールには_sj3というuserとgroupが必要(デフォルト動作。これ以外にするにはsj3.tmplのSJ3OWNER,SJ3GROUPを書き換えること)
    • 起動にはroot権限が必要(変なユーザに実行させないため。実行直後に_sj3にドロップするので心配ない)
    • 共有ライブラリを作成するように
  • 内部の変更
    • strcpy, strcat, sprintf禁止
    • register変数禁止(コンパイラによる最適化の方がマシ)
    • K&RからANSIに変更
    • プロトタイプ宣言追加
    • 正しいva_argハンドリング

元のソースを読んでおもったこと

  • ほとんどの関数の返り値がvoidで、データのやりとりはグローバル変数で行う豪快な仕様。
  • 関数のプロトタイプ宣言がないから、 arityが異なっていてもコンパイル時に警告されてない(もちろん実行時の動作は不定。落れば上等)。実際にあるんだ。これが。
  • strcpy, strcat, sprintfを禁止したはいいが、それ相当の代替関数を内部で宣言して使っているかもしれない。要調査。
  • オリジナルの配布元はftpもなくなったみたいだし、メンテナーいないのかな。これ。