今はOpenBSDで動くらしい。テストもオールグリーンだし。主にkawさんの作業だと思われる。しかし、手元では今ひとつコンパイルしきれなかったので手当した。0.9.3.3でもHEADでも当たるはず。Makefile.ext.inの手当は機種依存になるけど、解決方法がわからぬ。Makefile中で条件分岐するか、autotoolsのほうでどうにかなるのか?
追記:configure.acで条件分岐するようになったので、他の環境には影響なくなるはず。
どうも、OpenBSD4.9の時代、2011/07頃に、BoehmGCのほうでOpenBSDのスレッドでも動く変更が入ったようなのだが、OpenBSD5.1→5.2の変更でOSのスレッド周りが変わって、BoehmGCがスレッドで動かなくなってしまったようだ。そういうわけで当パッチはGauche本体に入れられないと思う。
問題点は、(1)OpenBSD5.1以前と5.2以降でパッチを変えなければいけないのではないか(2)BoehmGCの開発者がどう対応するのかな、ってとこか。
CGIで、マルチスレッドで、スクレイピングして、表示するっていうやつのPerl版とGauche版。
ウェブサイト制作の実習なんかで使えると思うけど、超素朴バージョンなので、キャッシュしたりバックエンド作って処理を分けるべき。
しかし、Win32 Perlではマルチスレッドで頑張るとSEGVすることがある。CygwinのPerlなら問題ない。スレッド中の処理内容や、スレッド数の変更、IOの同時実行をブロックしたりしたけど、ダメ。
逆にGaucheはMinGWバイナリのほうがまともで、Cygwinで動かすと全部の情報が取得できないっていう感じ。HTTPモジュールのせいか、マルチスレッドのせいか、相互の相性なのか、もしかしてGCされてるとか?デバッグのやり方もよくわからん。call/ccでも並列処理できるらしいけど継続わからん怖い。
Perlのほうが速いけど、たぶんタイムアウト設定してるからだと思う。Gaucheでやるなら、thread-join!の引数でやらなきゃなくて、そうするとmapが使えなくて面倒。
しかし再帰関数こんなに書いたの初めてだな。
追記:同期IOだとそこでブロックされるので、今回のrfc/httpを使った部分はcall/ccでは速くできないようだ。http-getを非同期にできたらいいのか?でも非同期にすると通信が終了終了してるかとか状態を取得する方法がないといけないよな。あとhttp-getに:timeoutとか欲しい。
意味がわからんけどエラーになるらしい。継続入門のサンプルを保存してloadで読んだらエラーになったけど全然意味わからん。Guileでも似たようなエラーになるから、Schemeの仕様なのか。
-[1269]% rlwrap -c -q '"' -b "'"'(){}[].,#@;|`"' -m guile --use-srfi="1,6" "$@"
guile> load
#<procedure load-module (filename . reader)>
guile> (load "./buf.scm")
write and buf clear.write and buf clear.write and buf clear.guile> (kin inp)
ERROR: In procedure read:
ERROR: Wrong type argument in position 1 (expecting open input port): #<closed: file 0>
ABORT: (wrong-type-arg)
guile> (exit)
VirtualBoxに入れてるんだけどディスク領域が少なすぎたので増やします。
VirtualBoxのイメージ自体をリサイズするのはコマンドでいけるらしいので割愛。(参考1)
シングルユーザモード(boot -s)で入ってもDevice busyになるので、河豚板を使います。
河豚板を起動したらコンソールを開いて disklabel -E wd0 を起動します。
b して * します。
m b してswapの位置をずらします。場所は自分で計算してね。
c a してパーティションをリサイズします。サイズは自分で計算してね。よくわからないけどaとbの間は64ブロックくらいほしいらしい?
w で書き込んだあと、x で終了します。何か質問されるけどYesで。
growfs /dev/wd0a を起動します。
終わったら、fsck /dev/wd0a を起動します。最後に何か聞かれるけどyで。
mkdir /test とかして mount /dev/wd0a /test とかして問題無さそうだったらリブートします。以上。
LinuxかWindowsならGPartedでGUIで一撃なんだがなあ。
ちなみにwdとはウェスタンデジタル(HDDのメーカー)の略らしい。
以下色々書いたけど、vallogで既出なのでそちらを読むと良いが、Gauche-dbd-pgはgithubから持ってきたほうが今っぽいと思う。
DBIモジュール自体は本体同梱。ドライバが入ってないのでKahuaのgithubから取得してインストール。Cygwinでやるならlibpq-develあたりが欲しい。
make installでgauche-install.exeがPermission deniedになるので(理由が不明)、Gaucheのソースディレクトリのgauche-install.exeを使うようにMakefileを変更するとうまくいく。と思ったら、デバッグしようと思ってCFLAG='-g -O0'したら治ったし、デバッグオプション外しても動いたから入れた時に何かあったくさい。なんだそれ。
コードが6年間変更されてない割には問題なさそう。
基本的にはGaucheでDBIとか@ITの記事で動くのだが、どうもDBから戻ってくる値はstring固定っぽいような。この辺PHPだと適当にやってくれるんで楽だったりハマったりするわけだが、もし数値で扱うならいちいちstring->numberとかしなきゃないのか。NULL(空文字らしい)もあるしな。ORマッパ入れてそこで型変換するのがいいんだろうけども。