BlindJustice解体真書@wiki

開発メモ

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

何百人(300~)も登録して遊べるCGIゲームを想定して作りました。
なので、登録者が増えれば増えるほどファイルを読み込むのに時間がかかったり、負荷が高くなったりするようなことはないです。
当然、登録者が増えてアクセス数が増えれば負荷は高くなりますが。

プレイヤーの保存方法を名前からID化

  • 従来だと、ファイル名に日本語はつけれないので、別途IDなどの代わりのファイル名を用意する必要がある。

  • 問題点
    • 相手のデータが必要な時などに相手データを探すのに、相手のID(ファイル名)を検索する必要がある。
    • 全ユーザーファイルから名前を探す→そのファイルのIDを取得→全ファイルを読み込むので時間と負荷がかなりかかる。
    • 最悪、登録者が500人だと500ファイル調べることになる。

  • 解決策
    • 登録人数を少数にする。
    • 日本語の名前を禁止して半角英数字だけにする。
    • 名前とIDをひもづけたキャッシュファイルを作る。
    • ◎名前を規則性のある変換で英数字に変えてファイル名とする。

  • After
    • 相手の名前を変換するだけで相手のファイル名を取得することが可能
    • 500人いても名前から変換するだけで目的のファイルが見つかる。

データはフォルダごと管理

  • ファイル管理だとプレイヤー1人に対して1ファイルで全てを処理させなければならない。

  • 問題点
    • 1ファイルに全てのデータが含まれているので、必要のないデータまで余分に読み込んでしまう
    • 拡張性がない

  • 解決策
    • プレイヤーごとにフォルダを作成

  • After
    • 必要のないデータは読み込まなくてすむ
    • ファイルを細分化でき、拡張性や保守性に効果的
    • プレイヤーフォルダの中での処理なので、それなりに自由に使いまわせる。

ファイルロックについて

  • 基本的に自分のファイルを変更するだけなので、ファイルロックの必要はない。
  • また、処理に時間がかかるような作りではないので、ファイルロックの必要はない。
  • ただし、共通ファイルにはflockをつけています。

負荷対策

  • 固定データの場合は、open よりも requireを使って呼び出したほうが3倍くらい早い(benchmark比較より)
  • 文字よりも数字を使ったほうが多少速い
  • ハッシュよりも配列を使った方が多少速い(ただしハッシュの方が管理しやすいため、追加/削除/並び換えなどが多い場合はハッシュの方が使いまわしが利く)
  • 多重配列よりも配列2つの方が多少速い(必要な配列3つ以上になってくると多重配列の方が良い)
  • open 多用は負荷の元、ただし必要に応じてファイルを細分化するのは良い(無駄な読み込みが負荷になるので)
  • 何百回も繰り返しの中にサブルーチン処理を入れるのはよくない
  • my を使った方が多少負荷減。※基本的に、局所化や保守性のために使うべき(グローバルに使う変数は除く)
  • ファイル読み込みはwhileで一行ずつ読み込んだ方が早いし負荷も低い
open my $fh, $file;
my @lines = <$fh>
close $fh;
よりも
my @lines = ();
open my $fh, $file;
while (my $line = <$fh>) {
   push @lines, $line;
}
close $fh;
  • ファイルを読み込んですぐに書き込み処理がある場合は、読み書き両用で書いた方がflockも使えるし、負荷も低い


プログラムの書き方

  • 変数は基本的に小文字とアンダーバーが良いらしいよ(Perlベストプラクティスより)
  • forforeach の効果は同じなのでforに統一
  • 括弧の多用は避ける。見やすくするため
  • $_の多用は避ける(関係ない値が入らないように)
  • 変数やファイル名の長さは影響しない(たぶん)ので、変な略字よりもわかりやすい変数名やファイル名にすべし
  • 他のファイルに影響しないように、なるべくグローバル変数を増やさないために、その場限りの変数は my を使う
  • boolean(true or false)の値を扱う変数は $is_~ $has_~など
  • なるべく重複しているプログラムはrequire や サブルーチンを使ってうまくまとめる
  • ファイルを必要なものに細分化してrequireする
  • サブルーチンを使って先頭のソースコードだけでプログラムの流れがわかるように
  • ファイルオープンにopen my $fh… って書いていますが、myがわからない人は、open FILE… でもいいよ。意味は同じです。
  • 配列やハッシュなど複数を取り扱う変数名は、複数形を使ったほうがわかりやすい


携帯CGIを作成するときの注意点

  • 文字コードは Shift_JIS で作成する
  • データを送る method は get を使う
  • 読み込みの許容量を超えない用になるべくコンパクトに作る
  • スタイルシートは未対応の機種が多い
  • JavaScriptは使えない
  • table タグは使えない
  • 携帯かPCかの判別する手段としてユーザーエージェント(ブラウザ)を取得して判別させる
  • 最近の流行(モバゲーなど)だとユーザーエージェント偽造可能なためIPから判別する
  • 携帯のIP制限は効果が弱い。携帯個体識別番号を取得する必要がある。
目安箱バナー