Hatena::ブログ(Diary)

あまつぶ@はてなダイアリー RSSフィード

あまつぶWikiあまつぶ過去ログMacソフトWinソフト掲示板
<カレンダー>
2003 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 03 | 04 | 05 | 06 | 07 | 09 | 11 |
2011 | 02 | 07 | 08 | 11 |
2012 | 04 | 11 |
2013 | 07 | 09 | 10 |
2014 | 11 |
2015 | 11 |

<< 2008/08 >>
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

<最近の見出し>




POPFile の Mac OS X(Panther/Tiger/Leopard/Snow Leopard/Lion/Mountain Lion/Mavericks/Yosemite)用インストーラをお探しの方は、POPFile プロジェクトのダウンロードページへ。
 | 

2008-08-30

amatubu2008-08-30

2008-08-18 POPFile 1.1.0 RC2 公開

[]POPFile 1.1.0 RC2 公開 POPFile 1.1.0 RC2 公開を含むブックマーク

POPFile 1.1.0 RC2 が公開された。RC1 からの変更点は、Mac OS X 版が Tiger/Panther でも動くようになったこと、サーバからの応答がなくなった際に POPFile がフリーズ(というかサーバからの応答を永遠に待ち続けてしまう)することがある問題に対処、スキンの微修正といったところ。

RC1 で見つかった問題は一通り解決したと思うが、まだ十分にテストできたとは言えないかな。私の環境(Mac OS X 10.5.4 PPC、10.3.9、Windows XP Home SP3)では特に問題はなさそうだが、正式リリースまでにはもう少し動作確認をとりたいところ。引き続き動作テストに協力いただける方を募集中。動作報告については、日本語フォーラムまで。

2008-08-10 Leopard でビルドした DBD::SQLite の続きの続き

amatubu2008-08-10

[]Leopard でビルドした DBD::SQLite の続きの続き Leopard でビルドした DBD::SQLite の続きの続きを含むブックマーク

前回、5.8.6 の CORE フォルダにあるヘッダファイルを参照するようにすれば Tiger/Panther でも動くことがわかったので、具体的にどこが違うのかを調べてみた。単純に diff をとると(-bu オプションつきで)21,257 行とかになって気が遠くなるが、大物の config.h や uconfig.h を 5.8.8 のものに置き換えたり(ここで 10,000 行あまり)、あまり関係なさそうな embed.h とかを置き換えていき、どのファイルを置き換えると問題が起こるかを調べていく。いくつか進み、sv.h を置き換えるたところでエラーが起こることが判明。

ということで、今度は逆に sv.h のみを置き換えた状態で試してみると、ビルド時に

DBI.c: In function 'boot_DBI':
DBI.c:5536: warning: implicit declaration of function 'SvPV_nolen_const'
DBI.c:5536: warning: initialization makes pointer from integer without a cast
DBI.c:5536: warning: passing argument 2 of 'strcmp' makes pointer from integer without a cast

という警告が出てしまい、実行時にも

/path/to/DBI.bundle undefined reference to _SvPV_nolen_const expected to be defined in a dynamic image

というエラーが出て、だめ。どうやらほかにも元に戻さなければいけないファイルがあるようだ。エラーの内容をもとにヘッダファイルを grep してみると、どうやら XSUB.h も元に戻す必要があるようだ。

ということで、sv.h と XSUB.h を 5.8.6 のものに戻して再挑戦(この時点で diff の結果は 412 行)。今度はうまくいった。これで、この 2 つのファイルのいずれかを調べれば原因がつかめそうだということがわかった。

ここで、Panther で動かしたときのクラッシュログに、sv なんちゃらという関数名が記録されていたのを思い出した。ログには、

Exception:  EXC_BAD_ACCESS (0x0001)
Codes:      KERN_PROTECTION_FAILURE (0x0002) at 0x00000000

Thread 0 Crashed:
0   libperl.dylib 	0x87e32f9c Perl_sv_2pv_flags + 0x938
1   SQLite.bundle 	0x00621c24 sqlite_bind_ph + 0x1d0
2   SQLite.bundle 	0x00606d90 dbdxst_bind_params + 0x1a4
3   SQLite.bundle 	0x0060a69c XS_DBD__SQLite__st_execute + 0x134
4   DBI.bundle    	0x000480c0 XS_DBI_dispatch + 0x1a74
5   libperl.dylib 	0x87e2ddac Perl_pp_entersub + 0x4fc
6   libperl.dylib 	0x87e2695c Perl_runops_standard + 0x40
7   libperl.dylib 	0x87dd32fc S_run_body + 0x134
8   libperl.dylib 	0x87dd2f58 perl_run + 0xa4
9   perl          	0x000027b0 0x1000 + 0x17b0
10  perl          	0x00002420 0x1000 + 0x1420
11  perl          	0x00002294 0x1000 + 0x1294

とある。Perl_sv_2pv_flags でエラーが起こっているようだ。sv.h と XSUB.h の diff からこれが呼ばれているところを探すと、5.8.8 の SvPV_nolen というマクロで使われていることが判明(5.8.6 では定義が異なり、別の関数 sv_2pv_nolen が使われている)。

今度は 5.8.8 の sv.h と XSUB.h を 5.8.6 フォルダにコピーし、sv.h のこの部分を 5.8.6 と同じように書き換えてみる。

diff -rbu /System/Library/Perl/5.8.8/darwin-thread-multi-2level/CORE/sv.h /System/Library/Perl/5.8.6/darwin-thread-multi-2level/CORE/sv.h
--- /System/Library/Perl/5.8.8/darwin-thread-multi-2level/CORE/sv.h	2008-02-19 22:25:50.000000000 +0900
+++ /System/Library/Perl/5.8.6/darwin-thread-multi-2level/CORE/sv.h	2008-08-10 01:48:26.000000000 +0900
@@ -1092,7 +1092,7 @@
 
 #define SvPV_nolen(sv) \
     ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-     ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC))
+     ? SvPVX(sv) : sv_2pv_nolen(sv))
 
 #define SvPV_nolen_const(sv) \
     ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \</tt>

こんな感じ。

すると、今度はうまくいった。めでたくエラー解消である。

あとは、ソースファイルを変更せずになんとかこの違いを吸収できるとよいのだけど。先に SvPV_nolen を定義しておいてもあとから出てきた define で上書きされてしまってうまくいかないし、何かいい方法はないだろうか。とりあえずは 5.8.8 フォルダの sv.h を無理矢理書き換えてしまえばいけそうだけれどあまりスマートとは言えないしなぁ。

ところでこの sv_2pv_flags という関数、2 つめのパラメータは何か長さを返すものらしい。5.8.8 ではここに 0 を指定している。おそらく、5.8.6 以前のこの関数は、0 が渡されることは想定していないのだろう。0 かどうかをチェックせずに長さを書き込もうとしたところで KERN_PROTECTION_FAILURE (0x0002) at 0x00000000 が起こったというところだろうか。

[]Leopard でビルドした DBD::SQLite の結論 Leopard でビルドした DBD::SQLite の結論を含むブックマーク

とりあえず完結編(?)。

gcc の「-D」オプションで先に定義しても、あとの #define の方が優先されてしまうのでやはりソースを修正するしかなさそう。CORE/sv.h を書き換える訳にはいかないので、DBI の DBIXS.h にパッチをあてることにした。

#include <perl.h>

の後に

#undef SvPV_nolen
#define SvPV_nolen ...

を追加。これで Perl 5.8.6 以前でも動くようになるはず。

あとはサーバが無応答になった場合に POPFile も止まってしまう問題を解決するパッチをコミット。これで 1.1.0 RC2 がリリースできるかな。

[]はてなさん訪問 はてなさん訪問を含むブックマーク

詳しくは後ほど

2008-08-03 Leopard でビルドした DBD::SQLite の続き

[]Leopard でビルドした DBD::SQLite の続き Leopard でビルドした DBD::SQLite の続きを含むブックマーク

昨日の続き。試行錯誤の結果、少し手がかりがつかめてきたように思うのでメモしておく。

Makefile をあれこれ編集してみてもまったくうまくいかず、試しに Xcode を使ってビルドしてみたが同じ結果。だめ元で Xcode 2.5 をインストールして試してみると、ファイルサイズはかなり近くなった(これを見たときには「きたか?」と思ったのだが)ものの Bus error は解消せず。

どうにもうまくいかないので Tiger で起動し直してモジュールだけビルドし、Leopard に戻ってパッケージを作成しようとしたところ

make[2]: *** No rule to make target `/System/Library/Perl/5.8.6/darwin-thread-multi-2level/Config.pm', needed by `Makefile'. Stop.

というエラーが出て止まってしまった。Perl のバージョンが違うので 5.8.6 フォルダがないんだよな……。

とりあえず一番簡単な解決方法として、Tiger から 5.8.6 フォルダをコピーして make を通す。ここでふと、今の Makefile のまま Leopard で make したらどうなるんだろうと思い、Makefile の日付だけ新しくして挑戦。エラーでまくりかと思いきや、何事もなく成功(ファイルサイズは約 1.1MB と小さい)。iBook Dual USB の Panther にコピーして動かしてみると、何の問題もなく動くではないか。

ということはバージョンの違いに起因する問題ということなのか? 今度は、Leopard 上で作った Makefile の PERL_INC だけを編集して試してみる(ほかにも 5.8.8 というバージョンはあちこちに見られるが、コンパイル時に使われているのはここだけのようなので)。なんと、これもうまくいった。

ということで、それぞれの CORE フォルダにあるヘッダファイルの違いで問題が起こったり起こらなかったりするということがわかった。この違いがバージョンの違いに起因するものであれば対応は難しいかもしれないが、そうではなく何かの設定の問題であればコンパイル時のオプションで吸収できるかもしれない。見たところかなり大幅に変更されているようなので原因究明は難航しそうだが、少なくとも Leopard 上でも互換性のあるファイルを作成することができるようになったのだから一応は進展したと言えるのかな。

[]リモートログインとファイル転送 リモートログインとファイル転送を含むブックマーク

2 台の Mac を行き来するのが面倒になってきたので、リモートログインを有効にして ssh で接続できるようにしてみた。リモートログインを有効にするには、システム環境設定の「共有」で「リモートログイン」にチェックを入れるだけ。

あとはもう一台から ssh で接続すればホームディレクトリがカレントディレクトリになり、リモートマシン上で Terminal を起動したのとほとんど同じ状態になる(というかホスト名が異なる以外は見た目には何の違いもないような)。ファイル転送も scp でできるので、Leopard でビルドし直したファイルを転送して転送先で動作テスト、なんてこともさくっとできてしまう。これは便利だ。こんなに簡単に設定できるならもっと早く使ってみればよかった。

2008-08-02 Leopard でビルドした DBD::SQLite が Tiger/Panther で正常に動作し

[]Leopard でビルドした DBD::SQLite が Tiger/Panther で正常に動作しない Leopard でビルドした DBD::SQLite が Tiger/Panther で正常に動作しないを含むブックマーク

POPFile フォーラムにおいて、Mac OS X Tiger でメールが受信できないという書き込みがあり、調べてみたところ、Leopard でビルドした DBD::SQLite が Tiger/Panther で正常に動作していないことがわかった。

不思議なことに、データベースへの接続や参照には問題がなく、更新系(insert とか update)の処理を行おうとすると Bus error が発生するらしい。しかも、DBI の do コマンドを使って更新した場合は問題ないのに、prepare で一度ステートメントを作成してから execute という流れにするとエラーが起こるというかなり謎な状態。これまでの POPFile のバージョンでは更新系はすべて do コマンドで行っていたために顕在化していなかったということだろうか。

問題の切り分けのため、Tiger で同様の方法でビルドしたモジュールを試してみると、こちらは問題ない。ということは、DBD::SQLite の問題ではなく、ビルドの方法かなにかに問題があるということだろうか。しかしまた不思議なことに、Leopard でビルドしたバイナリ(SQLite.bundle)のサイズは 1.1MB ほどだったのに、Tiger でビルドしたものは 3.6MB ほどと 3 倍以上も違う。どちらも同じように Universal binary でビルドしたはずなのだが……。

Leopard で DBD::SQLite を他の環境でも使えるようにビルドするためにはいくつか注意すべき点がある。これは以前 id:amatubu:20071127#p2 で書いたとおりだ。が、このときはこれでうまくいったと思っていたのに、どうやらまだ完璧ではなかったようだ。

とりあえずは Tiger でビルドすればどの環境でも動くようなのでそれでしのぐことはできるが、やはり不便なのでなんとか原因を調べないと……。

 | 
468714