WordPressのwp_dieを弄ってみる。

今使っているプラグインは、設定ページで設定漏れ、エラー、リポート等をwp_dieで出力するタイプが多いので、なんとかカスタマイズできないかと調べていると・・wp_die_handlerってのがありました。

フックはわかったけど具体的にどうするかわからなかったので、フォーラムを覗いてみると書いてある書いてある・・・w
http://www.velvetblues.com/web-development-blog/custom-wordpress-comment-error-page/
なるほど、ある程度は自分でエラー処理を書かないとダメなのね。
 
Velvet bluesさんのコードを参考に弄ってみる。
プラグインやテーマのfunctions.phpへ以下のコードを追加。

<?php
function my_register_die_handler($func) {
    return "my_die_handler";
}
add_filter("wp_die_handler", "my_register_die_handler");
 
function my_die_handler($message, $title = '', $args = array()) {
    $templateUser = get_theme_root()."/".get_template()."/wpdie-User.php";
    $templateAdmin = get_theme_root()."/".get_template()."/wpdie-Admin.php";
 
    if (is_admin() && file_exists($templateAdmin)) {
        $wp_die_data = array(
            "title" => $title,
            "message" => $message,
            "description" => "エラーが発生した為処理が中断されました、エラーの内容は以下の通りです。",
            "args" => $args
        );
        if (empty($wp_die_data["title"])) {
            $wp_die_data["title"] = "エラー";
        }
 
        require_once($templateAdmin);
        die();
    } else if (file_exists($templateUser)) {
        $defaults = array("response" => 500);
        $r = wp_parse_args($args, $defaults);
 
        $wp_die_data = array(
            "title" => $title,
            "message" => $message,
            "description" => "エラーが発生した為処理が中断されました、エラーの内容は以下の通りです。",
            "args" => $args
        );
 
        if (function_exists("is_wp_error") && is_wp_error($wp_die_data["message"])) {
            if (empty($wp_die_data["title"])) {
                $error_data = $wp_die_data["message"]->get_error_data();
                if (is_array($error_data) && isset($error_data["title"])) {
                    $wp_die_data["title"] = $error_data["title"];
                }
            }
            $errors = $wp_die_data["message"]->get_error_messages();
            switch (count($errors)) {
                case 0 :
                    $wp_die_data["message"] = "";
                    break;
                case 1 :
                    $wp_die_data["message"] = "<p>{$errors[0]}</p>";
                    break;
                default :
                    $wp_die_data["message"] = "<ul>\n\t\t<li>" . join("</li>\n\t\t<li>", $errors) . "</li>\n\t</ul>";
                    break;
            }
        }
 
        if (empty($wp_die_data["title"])) {
            $wp_die_data["title"] = "エラー";
        }
 
        if (!empty($args["description"])) {
            $wp_die_data["description"] = $args["description"];
        }
 
        if (preg_match("/コメントを入力/u", $wp_die_data["message"])) {
            $wp_die_data["message"] = "コメントが入力されていません。<br/>コメントを入力後に送信してください。";
        }
 
        require_once($templateUser);
        die();
    } else {
        _default_wp_die_handler($message, $title, $args);
    }
}
?>

 
テンプレートファイル
ゲスト用と管理者用は内容を変えるだけでok。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title><?php echo get_bloginfo("name")." &rsaquo; ".$wp_die_data["title"]; ?></title>
<link rel="shortcut icon" href="<?php bloginfo('home'); ?>/favicon.ico" type="image/x-icon" />
<link rel="icon" href="<?php bloginfo('home'); ?>/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri().'/style.css'; ?>" type="text/css" media="screen" />
</head>
<body id="error-page">
    <div id="container">
        <div class="header">
            <h1><?php bloginfo("name") ?></h1>
            <p class="description"><?php echo $wp_die_data["description"]; ?></p>
        </div>
        <div class="message">
            <p class="text">
                <?php echo $wp_die_data["message"]."\n"; ?>
            </p>
        </div>
        <div class="back"><a href="javascript:history.back();">&laquo; 戻る</a></div>
    </div>
</body>
</html>

 
そしてできたのがこんなページ。
WordPress - wp_die 変更
ゲスト用にはテーマのstyle.cssを読み込ませているのでブログと同じスタイルで表示できます。
404.phpと同じようにget_header()、get_sidebar()、get_footer()を呼んでやるとブログのデザインと全く同じページでエラーを表示させる事もできますが、エラーページでエラーなんて事がないようにシンプルにしましたw

Skyrim 日本語版 v1.8.151.0 アップデート

Steamを起動したらSkyrimにアップデートが!
なんだろう?と思って公式サイトからアップデート内容を確認してみると・・・
今回のアップデートで日本語版クライアントバージョンが1.8.151.0.7に!
Skyrim 日本語版 v1.8.151.0.7
やっとルイスの増殖バグが直るのねーw
 

そしてDLC3のDragonbornが日本語に対応したと・・これはキター!って事で早速Dragonbornを購入。
Unofficial Dragonborn Patchを入れる序でに各種DLCのUnofficial Patchを最新の物へ更新した結果・・・
Skyrim - Unofficial Skyrim Patch 1.3.0
貰えなかったモーサルの権利証やシャウトが続々追加されていきますw
Unofficial Skyrim Patchはv1.2を入れていたけれど、まだこんなにバグがあったのねー。
 
Dragonbornはメインクエスト「声の道」をクリアしていれば、道中のランダムイベントでクエストを開始できるNPCと遭遇できます。
Skyrim - Dragonborn
ちゃんと音声も日本語になっているので字幕は必要ないですねー(`・ω・)b
声優も少し変わったようです。

直ぐにでもDragonbornをプレイしたい所だけど、Hearthfireの家も完全にできていないし・・クエスト一覧もゴタゴタしてるので進めるのはまだ先になりそうw

 

ちょっと気になったことがあったのでテストしてみる。
SKSEの動作環境が1.8.151.0なので、日本語版の1.8.151.0で動作するか確認してみる。
Skyrim 日本語版 v1.8.151.0.7 - SKSE+SkyUI
使用したのはSKSE v.1.06.09とSkyUI 3.1。
キーの表示が文字化けしているけれどそれ以外はちゃんと動いているようです。

SkyUIを導入するのはこれが初めてなので正常動作かどうかわかりませんが、セーブディレクトリに作成されるSKSEのログにはエラーが出てないので大丈夫みたい。

FANコントローラー死亡

長年愛用していたFANコントローラー SystemTechnology ST-35Bがお亡くなりに(つд-。)
System Technology - ST-35B
ツマミを回してもFANが回らずLEDだけ点灯。

このST-35はもう販売していないにも関わらず、オークションなんかではかなり人気の品なんですよー
 
人気の理由は・・・
コントローラー全体で30Wまで、FAN毎に1.4Aまで使用可能。
大きな容量があるのでデカイFANでも楽々稼働させることができ、同じ型番のFANを並列に繋いで1ソケットで2つ同時コントロールも可能でした。
PWM制御なのでVA制御によるある熱による発火の心配がないし、完全停止や自動速度制御も可能。
今ファンコンを探してもこれだけの物はないんですよねー、特に電源まわり。

去年PCが潰れた時も涙目だったけれど、ST-35が潰れたのはもっと涙目。
だってもう手に入らない品物なんだもん。
 
で、いいコントローラーがないかなーと探してみるもST-35から変えるとなると、どれも見劣りしてしまう・・・
Scytheがかなりいろんなコントローラーを出しているけど制御方法がVAなので却下。

Scytheはコストが安い方式を更にコストダウンするもんだから、簡単に熱で壊れたり発火したりする。
 
いろいろ探したけれど、廃番な製品はPWM制御で良い物があるんだけど後継品がでてないのが多数。
VA制御なら結構いろいろあるんだけど、低回転にする時が結構あるから熱問題が大きく出ちゃうんだよねー

暫くは回転速度100%で我慢だなあ・・(´・ω・`)

FarCry3をプレイしてみた

FarCry3のプレイ動画を見ていたら面白そうなので我慢できずに買ってしまった。
FarCry1も2もプレイ済ですが、3は2の失敗点を結構改良しているようなのでサクサク行けそう。
 
早速起動してみると、Uplayなるソフトが起動。
どうやらUbisoft専用のゲームランチャーのよう。(SSはちょっとプレイ後に撮った物です・・w)
FarCry3 - Uplay Steam起動 FarCry3 - Uplay Steam未起動
で、このUplayが曲者。
なんとSteamによるライセンス確認+Uplayによるライセンス確認の2ステップがあるのです。

Uplay単体で起動するとライセンスの確認が取れなくてゲームが表示されなくなります。(SS右側)
またSteamを起動していても、SteamからUplayを起動させないとライセンス未確認状態になります。
 
極めつけはUplayの消費メモリが140M越えな事と、画像でゴテゴテなUIの使い勝手が悪い。
メモリは十二分に詰んでるので問題ないけれど気分的にイヤww

起動の流れは・・・Steam起動⇒SteamからFarCry3起動(Uplay起動)⇒UplayからFarCry3起動
Uplayが自動でFarCry3を起動してくれるだけでもありがたいんだけどなあ。
 
そして、Uplayのユーザー情報の変更などはUplayランチャー上では全くできないのでブラウザをから。
ブラウザでUplayのサイトを開くとIEの場合ActiveX、FFやChromeの場合は専用のプラグインのインストールを促されます。
インストールは必須でインストールしないと一部ページの閲覧や設定の変更が全くできないのです。

ActiveXは論外だしプラグインも・・・インストールしたくないのでプロフィール設定は諦めました。
 
Uplayの設定関係でイラッとしましたが、気を取り直してプレイ。
FarCry3 - タイトル FarCry3 - メインメニュー
タイトル画面とメインメニューは海の中?がイメージのよう。

デフォルト設定だとShift+F2でUplayのオーバーレイが、Shift+TabでSteamのオーバーレイがでますが・・・
これを同時に行うとゲームが操作不能になります。
同時にやることなんてないですが、こんなつまらないバグは取り除いておいてほしいw
続きを読む

リファラーを使ったスパム その後

ちょっと前に書きましたがリファラーを使ったスパムの情報がいい感じに集まったので一気に対策をしました。
収集したスパム君のデータは5,272レコード。
 
収集したデータの中で80%以上は同じIPからのアクセスで北アメリカからのアクセス。
ホスト名を逆引きしても空なので、whoisへ照会するとIP転送サービスであることが判明。
金を払って使うプロキシみたいな物ですねw

環境変数のHTTP_X_FORWARDED_FORに172.21.126.189等、クラスBのプライベートIPがあるので結構大きなネットワークがあるみたいです。
まあ偽装の可能性もあるけど、IP転送サービスで追加された物のようなので信用はできそう。
 
ユーザーエージェントにも結構特徴がありました。
60%以上がWindows 7、Internet Explorer 6という明らかに偽装されたもの。
次に多いのがWindows 7、Opera 10の組み合わせ。
あとはiPhoneだったりLinuxだったりいろいろ・・、Windows98ってのもありましたw
 
リファラーは通販の紹介が書いてあるブログが60%ぐらい。
ブログの場合はkamagra、generic、100mg、storeをサブドメインとしたblog.hr、blinkweb.comドメインでした。
海外のレンタルブログですかね・・。

独自ドメインの場合はeveryoneweb、kamagra、discountを含むドメインでした。
 
アクセスするページも大凡固定でした。
ページが固定じゃないスパムは、ページにアクセスした10秒後にキャプチャ用画像へアクセスし更に10秒後にコメントをPOSTしていました。

驚いたのが、キャプチャの入力フィールドへはキャプチャ画像の文字ではなくURLを送信していること。
キャプチャの失敗履歴を見てみると、スパムが激しくなる4日~1週間前に文字コードがおかしい文字が山ほど送信されていました。
解析しようと試行錯誤した跡・・だと思いますw
 

と言うことで、作成したフィルタルールは
 ・リファラーのドメインがblog.hr、blinkweb.comであり、サブドメインにkamagra、genericが含まれている場合
 ・リファラーのドメインにeveryoneweb、kamagra、discountが含まれている場合
 ・ユーザーエージェントがWin7+IE6の場合

これを指定して2日様子を見ましたが、今のところスパム君はブログへアクセスできていないみたい(`・ω・)b

 

PS.
kamagraってなんだろうと調べてみたら・・バイアグラのジェネリック版みたいですねー
そんな物は必要ないよww