2007 年 9 月 19 日

CMC海賊版計画Σ(゚Д゚;エーッ!

カテゴリー: 日記 — わぴこ @ 11:37 PM

壮大な釣りネタなのかそれとも本当なのか!?
CMC!!CMC!!CMC!!
よろしい、ならばCMCだ!!
「CMC海賊版計画 Ver2.11」状況を開始せよ!!

暇なんでCMCみたいだけどぐぐらー向きの検索システムつーのを
作ってみるわ。もちろんFreeBSDネイティブな。少しまちなー。
・・・というふうにはいかないですが・・・
正直CMCの定例チャットのネタ提供用で作った海賊版を
また引っ張り出してくるとは思いませんでした。

CMC海賊版ほーむぺーじ
CMC海賊版の公式ホームページです。

*概要
CMC(Computer Music Center)のシステムの海賊版を作成して
最終的に自動更新型のMIDIデータ検索サービスを提供する。

*進捗状況
本家からDBが到着すれば最短で即日本格テストが可能に・・・←イマココ
9/19
ロボットの試作
9/20 データ構造の決定・デモ画面アップ
ロボット基礎部分完成・しんせさーちの検索デーモンに仮組込完了
9/21 登録フォームの作成に着手
9/22 メタタグの収集テストプログラム作成
9/23 登録フォームの完成
9/24 バグが発覚したのでバグフィックス
9/25 アルファ版HP開設、新着更新情報cgiの作成
9/28 バグフィックス
10/2,3 CMC表示モードの検索システム作成
10/7 利用規約を作成
10/19 メタタグの説明文の作成
10/20 クローラーに重大バグが発覚!!一応修正
12/03 開発終了。以降は必要に応じて開発

*計画
http://wapiko.ddo.jp/wapi/blog/?p=86
を参照していただきたい。
計画追記

私としてはあくまで海賊版というスタンスをとります。
正統後継者がいらっしゃればその方が前のデータを引き継がれるとベストでしょう。
例えばCMCのメタタグが業界標準みたいな形で導入されれば検索サイトを作る側も
MIDIデータのサイトの作者さんにとっても楽でいいのではないでしょうか?
ほかにも同様のサイトがあれば私が死んでも大丈夫ですし。

アダルトコンテンツを扱うページの登録は一切禁止します。
フラグだけは互換性のために残しておくでしょう。
本来不正な海賊版の分際でアダルト禁止なのはお笑いかも・・・

カテゴリーは実質廃止ということにします。
楽をして自動更新できないですし・・・手動更新は死ねますし(^^;;;
互換性を残すために残しておきますが海賊版では実質機能させないでしょう。

cmc-introというメタタグを用意して紹介文も書き換え可能にしようと思います。
長年HPを運営していれば多少紹介文をいじる必要が出てくるでしょうし。
URLやHP等の重要事項に関しては手動更新しかないでしょう。
私としては全部自動更新にして楽をしたいですが準備も大変ですし
不正利用防止という観点からも手動にしたほうがいいでしょう。

当面はしんせさーちに組み込む形で提供します。
検索結果の表示もしんせさーちと同じものになります。
説明文のところに「説明文+更新日付+更新内容」を表示させれば大丈夫でしょう。
デモ画面を用意しました。クリックすると元のサイズで表示できます。
CMC海賊版検索デモ画面

*必要な作業
登録・手動変更・通報用のシステムの作成
実はこれが一番厄介だったりして??
フォームメールだけ搭載して後は全て手作業という手もありますけどね。
そっちのほうが楽といえば楽かも・・・

データ構造というか仕様の策定
もしほかに互換システムを開発している方がおりましたら
合わせたほうが将来的にいいと思います。
私はEUC-JPのテキストファイルでDBを構築するので
SQLとかだと完全にお手上げですね。
SQLだと私の腕では文字化けに対処できないですし
メンテナンスもテキストのほうがはるかに楽なので。

ロボットの作成
しんせさーちのロボットを流用するだけなので楽です。
日付の問題と自動削除の問題があります。

CMC互換検索システムの作成
表示部分をCMC風にするためには新規に作成しないといけません。
けんさ君の検索システムでは効率が悪いので基本的に新規作成です。
一番最後に作成する予定です。

*発覚した問題点
1.しんさーちのシステムでは更新された情報の反映に最大一週間かかる。

しんせさーちのキャッシュは頻出の検索語でなければ一週間保持されます。
仕様と思って割り切るかキャッシュの保持期限を24時間にするか・・・
したがってロボットの巡回は一日一回ということで決定します。

2.記号を使用すると文字化け等の原因となる
バグというか仕様なのでなるべく記号を使わないようにするしかないです。

*公開可能な仕様
マスターデータの構造
「サイト名,URL,管理人,メールアドレス,カテゴリー,登録日,更新日,
更新内容,紹介,キーワード,バナー大,バナー小,アダルトサイトフラグ,
削除フラグ,エラーフラグ,ステータス,,,」
このデータから検索用データ等を作成してます。

*連絡先
連絡先は電子メールだとスパムフィルターに引っかかって
メールそのものが削除される可能性があるので
個人情報などがなければコメント欄にお願いします。
個人情報が含まれている場合は先にコメントをいただければ
あらためてメールアドレスをお教えいたします。
なお、私はにちゃんねるはロム専なので書き込みはしません。

*Q&A
Q1.率直に聞く。技術的にこの手のサイトの構築は無理か?
A1.否。著作権とか倫理面の問題がほぼ全て。
むしろこっちの問題のほうが重要なので
私としては嬉々として海賊版を作成できないのです。・゚・(ノД`)・゚・。
Q2.私も検索エンジンを作るのでスクリプトがほしいです。
A2.それだけは配布できませんので悪しからず。
Q3.サポートはどこまでしますか?
A3.基本的にノーサポートです。ノークレーム、ノーリターン(笑)でご利用ください。

*スクリプト作成者のための道しるべ
私がやめてもいいように後進のための道しるべを記しておきます。

CMC海賊版ロボットの作り方 by わぴこ
perl5.8以降版です。というか他の言語はシラネ
一番のネックと思われるアクセスしてからタグを抽出するまでを書いておきます。
私はLWPのGETを利用しています。
私の使用している本物のソースとは違いますが載せておきます。
変数の初期化などは省略しています。

★まずは$urlにURLを放り込んでからアクセス。

#アクセス
open (IN,"GET -t20 -H \"$useragent\" \"$url\" |");
@html = ;
close(IN);

このあとHTTPのステータスを解析するわけですがエラーだと
当然タグが取得できないので解析しなくても問題はありません。
ステータスを解析する場合はGETコマンド以外の方法で取得することをお勧めします。

★動作に支障をきたす文字を除去します。
この処理をしないと後々地獄を見ることになります。

foreach $a (@html){
#超絶文字(ォを排除
$a =~ s/[\x00-\x08]|[\x0b-\x1f]//g;
$a =~ s/[\x7f]//g;
#以下その他の文字で動作に支障をきたすものを追加

文字コードを変換します。

$a = jcode($a)->h2z->tr('0-9A-Za-z','0-9A-Za-z')->euc;

私はこのときに全角英数を半角に変換しています。
半角カナも全角カナへ変換してます。

なぜか文字化けするパターンがあったのでそういったパターンを列挙しておきます。

#文字化け対策
$a =~ s/~/\\~/ig;

} #上のforeachを閉じている

★HTML文書を整形します。しなくても組める人は動作速度が遅くなるのでしなくてもいいです。
私は整形しないとうまく組めなかったので遠回りしてでも整形しています。
中には想像をはるかに上回る凶悪なHTMLを食べさせられることがあるので
整形をすることをお勧めします。

#元からあった改行をスペースに変換して>の後に改行を入れる
foreach (@html){
$_ =~ s/\r|\n/ /g;
$a = "$a$_";
$a =~ s/>/>\n/g;
}

#改行で分解
@html = split(/\n/,$a);

#タグだけ取り出す(cmcが含まれている行を取り出す)
foreach $a (@html){

if ($a =~ /cmc/i)
{
$a =~ s/\r|\n//g;
$a =~ s/\"//ig;
push (@data,"$a\n");
}

if ($a =~ /\ if ($a =~ /\< \/head\>/i){last;}
}

@dataが最終的な解析用のHTML文書となります。

★いよいよここから解析です。

#タグ解析
foreach (@data)
{
#ここでも解析しやすいように整形
$_ =~ s/ / /ig;
$_ =~ s/(\s)+/ /ig;
$_ =~ s/\  $_ =~ s/name\=/name\=/ig;
$_ =~ s/content\=/content\=/ig;
#解析の邪魔になる文字列を排除
$_ =~ s/\\//g;
$_ =~ s/\"//g;
$_ =~ s/\?/?/g;

#タグの中身を取り出す。
if ($_ =~ /cmc-update/i){$a = substr($_,index($_,"content=")); $a =~ s/content\=//ig; $a =~ s/name\=cmc-update//ig;  $a =~ s/\>//ig; $a =~ s/\r|\n//g; $cmcupdate=$a; $cmcupdatef=1;}
elsif ($_ =~ /cmc-new/i){$a = substr($_,index($_,"content=")); $a =~ s/content\=//ig; $a =~ s/name\=cmc-new//ig;  $a =~ s/\>//ig; $a =~ s/\r|\n//g; $cmcnew = $a; $cmcnewf = 1;}
elsif ($_ =~ /cmc-key/i){$a = substr($_,index($_,"content=")); $a =~ s/content\=//ig; $a =~ s/name\=cmc-key//ig;  $a =~ s/\>//ig; $a =~ s/\r|\n//g; $cmckey = $a; $cmckeyf = 1;}
elsif ($_ =~ /cmc-ban/i){$a = substr($_,index($_,"content=")); $a =~ s/content\=//ig; $a =~ s/name\=cmc-ban//ig;  $a =~ s/\>//ig; $a =~ s/\r|\n//g; $cmcban = $a; $cmcbanf = 1;}
elsif ($_ =~ /cmc-bas/i){$a = substr($_,index($_,"content=")); $a =~ s/content\=//ig; $a =~ s/name\=cmc-bas//ig;  $a =~ s/\>//ig; $a =~ s/\r|\n//g; $cmcbas = $a; $cmcbasf = 1;}

}

あとは取り出したデータを利用すればおっけーです。
掲示板風のデータにしてもいいですし、SQLに食べさせてもいいです。

お前のやり方はまちがっとんじゃ( ゚Д゚)ゴルァ!!という方は
いちいち私に報告しないでもいいので自分で何とかしてください。

検索部分
SQLを使っている人は無視してください。
もっとも手っ取り早いのはgrepを利用することです。
or検索する人は少ないので無理にサポートしなくてもいいです。
@qはクエリーです。

sub search{
@a = @data; #検索データを@aに代入

foreach (@q) {
@a = grep /$_/, @a;
}

}

@aが検索結果となります。

この方法はデータ量が増えるごとにメモリを大量に消費し、
検索自体が非常に重たくなっていくという欠点があります。
また、この方法は検索結果の取りこぼしが少ない反面、
ゴミ(余計な検索結果)が増えます。

*とりあえず昔作った海賊版のデモ
いわばCMC海賊版計画 Ver1.00です(笑
http://wapiko.ddo.jp/wapi/cgi-bin/kensakun.cgi
私のホームページしか検索できませんので
「わぴこ」とでもいれて検索してください。
http://wapiko.ddo.jp/wapi/cgi-bin/cmcrobo2.cgi
タグチェッカーです。CMCに登録していた人なら試せるかも?

2 件のコメント »

  1. メール連絡とたことがないのですが

    コメント by jhon — 2008 年 9 月 24 日 @ 10:04 PM

このコメント欄の RSS フィード TrackBack URI

コメントをどうぞ

HTML convert time: 0.294 sec. Powered by WordPress ME
powerd by ddo.jp