Naoki Kurosawa
naoki_kuros****@ybb*****
2003年 3月 31日 (月) 20:19:46 JST
黒澤です。 分散サーバ登録画面の作成方針です。 以下は私の案です。 各分散サーバのスペックを任意で公開できるようにしたほうが いいかもしれませんね。 あと、マルチプロセッサマシンの登録禁止をどこかに書いておかないと。 #Robocodeがハングアップするので ■機能の要件 ログイン済みでないと表示できないページで、 さらに、この機能をON/OFFできる必要があります。 ・そのユーザが登録している分散サーバ一覧 (ユーザ詳細ページが兼任してもいいかも) 以下のページに遷移できる。 分散サーバの追加 変更 削除 ・分散サーバの追加・更新ページ 以下の情報を入力・更新 - ホスト名 - アクセスパスワード (スペックを公開できるようにする場合、 - メーカ・機種名 - CPU - MEM あたりも入力してもらうべきでしょうか) ・削除ページ 削除してもいい?という確認をするページ。 OKしたら削除 削除時には削除フラグを立てるようにして、 実際にはDB上からは消えないようにしたいですね。 なぜかというと、それぞれのバトルを実行したマシンがどれなのか という情報を残しておきたいからです。 #不正な結果を送信されたりしても、誰がやったかわかるように。 ですので、battlesテーブルの方には、 そのバトルを実行したマシンのmachine_idが保持されています。 machinesテーブルからもデータが消えないように しておくべきですよね。 上記を踏まえてシステム変更案を立てると、 ■テーブルスキーマの変更 machinesテーブルに以下のフィールドを追加 name varchar(100) null, -- メーカと機種名 cpu varchar(50) null, -- CPUスペック mem varchar(50) null, -- メモリ量 deleted tinyint not null default 0, -- 削除フラグ 削除されると1になる さらに、以下のインデックスを追加 unique index (hostname, deleted) ■DistServerManagerの変更 各メソッドがdeletedフラグを参照するよう変更。 特にauthorizeメソッド。 さらに、以下のメソッドを追加 ○getServersByUserId ユーザIDを引数として、そのユーザの分散サーバ一覧を取得 select * from machines where user_id = ? ○addServer 分散サーバの登録。引数としてuser_idとサーバ情報を取る。 指定されたホスト名が削除されていないサーバの中で既に使われていないか チェック select * from machines where hostname = ? and deleted = 0 limit 1 ResultSetオブジェクトを取得して、next()メソッドがtrueを返したら 既に同名のサーバが登録されている。 その後、登録。 insert into machines (user_id, hostname, password, name, cpu, mem) values (?, ?, password(?), name, cpu, mem) ○updateServer 分散サーバ情報の更新。引数としてuser_idとmachine_id、その他を取る。 machine_idをキーとしてデータを更新。 update machines set hostname = ?, password = password(?), name = ?, cpu = ?, name = ? where machine_id = ? and user_id = ? ○deleteServer 分散サーバの削除。引数としてuser_idとmachine_idを取る。 update machines set deleted = 1 where machine_id = ? and user_id = ? ■登録・更新・削除の画面 DistServerManagerのuser_idが必要なメソッドについては、 user_idはセッション情報から取り、リクエストパラメータには含めない。 #リクエストパラメータをいじることで他人のデータをいじる、 #ということができないように。 ということでいかがでしょうか。 ------------------------------ 補足:ログイン済みでないと表示できないページの実現方法 JSPとactionに手を加える必要があります。 JSPの方は、user_customize.jspを参照していただきたいのですが、 頭の方に以下を追加します。 <logic:notPresent name="loginUser" scope="session"> <jsp:forward page="login_required.jsp" /> </logic:notPresent> actionの方は、普通は以下のようにBaseActionからextendして クラスを作りますが、 public class ConfirmAction extends BaseAction ログインしていないと実行できないactionは、以下のように LoginRequiredインターフェースをimplementします。 public class RegistRobotAction extends BaseAction implements LoginRequired LoginRequiredインターフェースは単なるマーカなので、 実装しなければならないメソッドはありません。 これを書きながら気がついたんですが、 「リーグの作成」とかログイン済みでないといけないページで、 上記の処理やってませんね。 そのうちやらなきゃですね。 SourceForgeのタスク管理に追加しておきます。 (実は「タスク整理」メール以降、タスク管理ツールを 使ってみていたりします) ------------------------------ -- Naoki Kurosawa <naoki_kuros****@ybb*****>