//2ch互換トリップ生成
function Make_Trip($username) {
//◆を◇に置換
$username = str_replace("◆", "◇", $username);
//$usernameに#が含まれていればトリップ生成
if ( ($pos = strpos($username, '#')) !== false ) {
//usernameの'#'以降を$keyとする
$key = substr($username, ($pos + 1));
//サーバ側文字コードがShift-JISでない場合
if ( ($srvcharset = mb_internal_encoding()) != "Shift-JIS" ) {
//2ch互換トリップにするため「$keyの文字コードを」Shift-JISへ変換
mb_convert_variables("Shift-JIS", $srvcharset, $key);
}
//$keyから$salt生成($saltが2byteに満たないもののために'H.'を足しておく)
$salt = substr($key . "H.", 1, 2);
↓つづく
//●あほくさエリア突入●
//検索パターン配列(64)生成
$pattern = array();
for( $cnt=0; $cnt<128; $cnt++ ){
//「.」「/」英数字以外を検索パターンとする
if ( ($cnt<46) or ($cnt>57 and $cnt<65) or ($cnt>90 and $cnt<97) or ($cnt>122) ) {
//16進ASCIIコードでの検索パターン文字列を生成
$pattern[] = '/[\\x' . dechex($cnt) . ']/';
}
}
//置換用ベース配列
$replacetmp = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'a', 'b', 'c', 'd', 'e', 'f', '.');
$cnt2 = 0;
//(検索パターンが64通りなのでその数に合わせた配列を用意)
for ($cnt1=0; $cnt1<64; $cnt1++ ) {
$replace[] = $replacetmp[$cnt2];
if ( $cnt2 < 13 ) {
$cnt2++;
} else {
$cnt2 = 0;
}
}
//●あほくさエリア突破●
↓続く
//$saltに含まれる$patternを、$replace配列内の対応する位置の文字に置換
$salt = preg_replace($pattern, $replace, $salt);
//$saltに含まれる'.','/','0-9','A-Z','a-z'でないものを'.'に置換
$salt = preg_replace('/[^\.\/0-9A-Za-z]/', '.', $salt);
//トリップ生成(生成される文字列は11byte)
$trip = crypt($key, $salt);
//名前部分切り出し(#keyを含まない部分)
$name = substr($username, 0, $pos);
//(名前)+(生成されたトリップの後ろから10byte)を返す
$ret = $name . "◆" . substr($trip,-10);
//#が含まれていない場合
} else {
$ret = $username;
}
//戻り値は「name◆trip」または「name」
return $ret;
}
おわり。無駄が多いです。
なお、互換確認には
あほにし
えいヴぇっくす
しか使ってないです。
652 :
650:2006/03/06(月) 19:10:52 ID:???
ばかみたいにコメントがいっぱいあるのは、
初心者でもなんとなく処理内容の意味がわかるようにするためです。
もとにした2chトリップ生成ソースは
$salt = substr($key.'H.', 1, 2);
$salt =~ tr/\x3A-\x40\x5B-\x60\x00-\x2D\x7B-\xFF/A-Ga-f./;
$salt =~ s/[^\.\/0-9A-Za-z]/\./g;
$trip = substr(crypt($key, $salt), -10);
の、4行です。
自分はPHP最強房なのでperlよくわかんなかったです。
なので意味の解釈を間違っているかもしれません。
そのへんはperl最強房さんが解説していただけたらとか思ってます。
くだ質で聞こうかとも思ったけど、ここで晒して叩かれたほうが早いと思ったので載せました。
>>652 コメントの重要性を理解している点は評価できるんですが、
そんなあなたには「粒度」という言葉をプレゼントします。
処理にも、大きい単位から小さい単位までいろいろあるわけで、
すべてのコメントを小さい単位に合わせて書いたら、
ソースコードの見通しが全く見えなくなって、
コメントがないのと同じくらい意味がなくなってしまうのですよ。
あと、コメントの大事なポイントは、
全体の流れの中においてその処理が持っている意味を書くこと。
その処理がどういう動作をしているかは書かなくてもいいです。
そんなことは、PHPの文法が分かる人間だったら誰でも分かるんだから
よっぽど凝っていて複雑なアルゴリズムを書くとき以外には必要ないです。
というわけで、今後はコメントの書き方を要研究すべし。
ソースの中身は面倒なので読まなかったけど、パッと見て思ったのはそんなところ。
同じく
コメントが無駄すぎるね
647君のだと、この鳥作れるのかな
横レスですが
>>653 > 全体の流れの中においてその処理が持っている意味を書くこと。
> その処理がどういう動作をしているかは書かなくてもいいです。
意味と動作の具体例みたいなのを教えてください。アホですみません。
>>656 横だけど。
動作:関数の説明
意味:なぜその関数を利用するか
650の書き方は、スクリプトの解説サイトではよく見るけど、
リファレンス読まなくなって、別の使い方とか知らないままで終わるから諸刃の剣。
659 :
650:2006/03/06(月) 20:16:22 ID:???
処理に問題がありました。やっぱり自分はよくわかってないみたいです。
perlどころかPHPも良くわかってない。
いま直し&考え中。。
>>653 > そんなことは、PHPの文法が分かる人間だったら誰でも分かるんだから
今までの流れから、このスレには「PHPの文法がわかる人間」が
そんなに多くないと解釈したうえでのコメント文です。(自分を含め)
653さんとは前提が違うようです。
しかし、わかる人間にはうざ過ぎて読むことすらして
もらえないということは良くわかりました。
普段こんなことはやってません。
これは関数なので、書くとしたら
//概要:$usernameに#が含まれていた場合にトリップを付加して返す
//引数:$username(string)
//※:「#」以降8byteまでがトリップ生成に使われる
//戻り値:「名前◆trip」または「名前」(string)
//※:tripは「0-9A-Za-z/.」の64種類中から10文字
とか関数上部に書くくらいです。
汚いもの載せてごめんなさい。