仕組み(一部)



言語

このスクリプトは、現在は主にPHPを使って書かれています。
Perlにしとけば全角の文字化けも減ったんじゃないか・・・などとお叱りを頂きそうですが、
・長期的な負荷が(少し)抑えられそう
・モジュールなどを使わずに簡潔に構築できそうな気がした
・Perlの次にPHPを勉強中だった
など、自分の都合も合わせてこのようにさせてもらいました。
というわけで、別の言語を勉強していて大幅に改良が出来そうだと思ったら
それらを使っていつか書き直すかもしれません。


ログ収集の過程

Monazilla/1.00 studymarason/beta3(3/28現在)
というUserAgentを使って2chのサーバーにアクセスしています。
受け取ったDATファイルのログは縮小・整形してからこちらのページ内に保存されます。
毎回、まだ保存していない分のログだけを2ch側にリクエストして時間や転送量を省いています。
(まだ転送量対策の点で手の施しようがあるので善処したいです。)


単位数の判定

の部分のスクリプトを書いておきます。
だいたい上から順番に判定が行われるので、プログラムの知識がなくてもわかるかもしれません。


      //ハンドルを調べる

      $fdat = explode( "<>", $line[$k], 4 );  //DATの行内で$lineを<>で分割
      $fdat[0] = strip_tags( $fdat[0] );  //名前欄のタグ(トリップ付属の<b>タグ)を消去
      $fdat[0] = ereg_replace( "@|@", " ", $fdat[0] );  //@をスペースに変換
      if( ereg( "(◆.+)", $fdat[0], $regs ) ):  //トリップがあればHNとする
         $fdat0t = $regs[1];
      else:
         $fdat0t = ereg_replace( "(\(|(|【)[0-9]+.*(\)|)|】)", " ", $fdat[0] ); //(数字+)を取る
      endif;
      $hname = ereg_replace( "( | )", "", $fdat0t );  //名前からスペースを取る
      for( $m = 0; $m < count($hnarr); $m++){
        if( $hnarr[$m] != "" ):
            $hname = $hnarr[$m];break; //ヌルでない名前を決定
        endif;
      }

      //単位数を調べる

      $fdat[0] = ereg_replace( "( | )", "", $fdat[0] );  //名前欄からスペースを取る
      $maila = str_replace( "( | )", "", $fdat[1] ); //メール欄からスペースを取る
      $fdat[3] = ereg_replace( "( | )", "", $fdat[3] );  //本文からスペースを取る←打ち間違い等対策
      $ptim = explode( " ", $fdat[2], 3 );  //投稿日をスペースで分割
      $tscore = -1;  //初期化
      if( ereg( "(\(|(|【)([0-9]+)(\)|)|】)", $fdat[0], $regs ) ): //名前欄に(〜)
         $tscore = $regs[2];
      elseif( ereg( "^([0-9]+)(\.[0-9]+)*$", $maila, $regs ) ): //メール欄が数字列のみ
         $tscore = $regs[1];
      elseif( ereg( "(\(|(|【)([0-9]+)", $fdat[0], $regs ) ):  //閉じていない括弧
         $tscore = $regs[2];
      elseif( ereg( "^([0-9]+)(\.[0-9]+)*単位$", $maila, $regs ) ): //メール欄が「〜単位」
         $tscore = $regs[1];
      else:
         $texts = split( "<br>", $fdat[3] ); //本文を改行で分ける
         $j = count( $texts ) - 1;
         while( $j > 0 ){          //本文の最後の行から順に調べる
            if( ereg( "^([0-9]+)(\.[0-9]+)*$", $texts[$j], $reg ) ):   //行に数字だけ書いてある
               $tscore = $reg[1];break;
            elseif( ereg( "^(合計|総計)([0-9]+)(\.[0-9]+)*(単位)*$", $texts[$j], $reg ) ): //行に合計〜(単位)とだけ
               $tscore = $reg[2];break;
            elseif( ereg( "tot\.([0-9]+)", $texts[$j], $reg ) ):  //tot.〜
               $tscore = $reg[1];break;
            elseif( ereg( "(合計|総計)([0-9]+)(\.[0-9]+)*(単位)*", $texts[$j], $reg ) ):  //とにかく"合計〜"が含まれればよい
               $tscore = $reg[2];break;
            endif;
            $j--;
         }
         if(!$tscore):
            $tscore = -1;  //未定義の意を返す
         endif;
      endif;
      $tscore = $tscore % 500;  //完走分を引く
      
このへんがさらなる工夫のしどころで、このスクリプトの特徴でもあるんだと思っています。
HNの書き方、単位数の書き方など過去ログを読んでできるだけ柔軟にさせたのですが、
どうしても全角文字列には弱いようです。(´Д`;)ごめんなさい
改良案などある方、メールして頂ければ気づき次第いじっていきますのでご連絡ください。


今後

あくまで勝手に立てたサイトですので、利用によるいろいろな責任は負えないです。
たとえば、いきなり負荷で閉鎖とかは無いはずですが(・・・。)、サーバーが落ちている時なんかは自分も手の打ちようがないです。
ご了承ください。でもスムーズに使えるようできるだけのメンテはしていきたいです。
更新のこまごました報告などを逐一スレッド上ではしません。
よっぽど何かある時は、階級表表示画面にメッセージやリンクを入れてすぐわかるようにするかもしれません。
そんな感じですので、とりあえずしばらくは安心してご利用ください。


さいたま

さいたま