これは、数文で説明するのは難しいです。私はこれを理解しようと過去 5 日間を費やしてきたので、今は最後の手段としてここで質問しています。http://www.stanford.edu/group/billiards/で入手可能な、スタンフォード大学計算ビリヤード グループによって構築されたトーナメント サーバーを備えたプール物理ライブラリを実行しようとしています。
apache2、postgresql、perl を使用したトーナメント サーバーを提供します。ログインや簡単なマッチの作成などの機能を有効にできましたが、AI クライアントとの通信が機能しません。クライアントは、ターミナルで実行している C++ アプリケーションであり、サーバーからコマンドをフェッチし、このエラーを出力します。
XMLRPC error: Unable to transport XML to server and get XML response back. HTTP response code is 500, not 200
そして、apache2 error.log はこれを出力しています:
[Thu May 17 21:30:17 2012] [error] [client 127.0.0.1] Premature end of script headers: api.pl
CGI::Debug で実行しようとしましたが、それ以上の出力は得られませんでした。いくつかのデバッグ出力で失敗した行を特定できました(行ごとに1つずつ:))。これは、この関数の印刷STDERR間の行にあります。
package Pool::Rules::GameState;
sub addToDb {
my $self=shift;
my $timeleft=shift || $self->timeLeft();
my $timeleft_opp=shift || $self->timeLeftOpp();
#print STDERR "uh uh uh".$self." ".$self->timeLeft()." ".$self->timeLeftOpp()." ".$timeleft." ".$timeleft_opp."\n";
my $playingSolids = ($self->isOpenTable() ? undef : ($self->playingSolids()?1:0));
# print STDERR "addToDb: X".$self->isOpenTable()."X Y".$self->playingSolids()."Y Z".$playingSolids."Z\n";
$Pool::dB::dbh->do('INSERT INTO states (turntype,cur_player_started,playing_solids,timeleft,timeleft_opp,gametype) VALUES (?,?,?,?,?,?)',{},
$self->getTurnType(),$self->curPlayerStarted()?1:0,$playingSolids,$timeleft,$timeleft_opp,$self->gameType()) or STDERR $DBI::errstr;
my $stateid=$Pool::dB::dbh->selectrow_array('SELECT lastval()');
$self->tableState()->addToDb($stateid);
return $stateid;
}
シンプルな getter メソッドのみです。それでも、実行が停止するだけです。getter メソッドのコードは swig によって生成されています。最初の印刷行はこれを印刷します:
uh uh uhPool::Rules::GameState=HASH(0x99fa99c) 0 0 00:10:00 00:10:00
$self->-getters が 0 しか出力しないのが不思議です。ライブラリはスタンフォード大学のものであり、実際のコンテストが開催されているため、これがコードのエラーであるとは信じがたいです。 . 動作するには少し古すぎるようです (より新しいバージョンのライブラリで動作するようにするには、他の場所でいくつかの調整を行う必要がありました。たとえば、これとは関係のない別のファイルに < cstddef >-include を追加しました)。 perl発行)。最初に現在のバージョンで実行しようとしましたが、失敗しました。次に、readme.txtがテスト済みであると言うバージョン(Ubuntu 8.10、Perl 5.10など)にインストールしようとしましたが、ある時点でUbuntu 8.10のインストールが常に停止し、再インストールする必要がありました(これを試しました〜4回、gnome-terminal は常にセグメンテーション違反)。だから今私は' Ubuntu 12に戻って、それを機能させようとしています。私は perl についてあまり知りません。これを実行しようとして、ここ数日でほんの少ししか理解できませんでした。
何がこの種の行動を引き起こしているのか、誰にも分かりますか? これに関連する可能性のある互換性の問題を知っている人はいますか? 追加情報が必要な場合は、お尋ねください。提供します。
ご協力ありがとうございました!