ドコモからBIC SIMへ店頭MNPで即時開通

先月でドコモ歴15年となり、今月が契約満了月翌月の解約月でしたので、本日、ビックカメラ有楽町店で、長年お世話になったドコモから BIC SIM(ビックシム)音声通話パック へ MNP してきました。本当は2年前の解約月にMNPしようと思っていたのですが、その当時はまだMNPに踏み切れませんでした。
一番のネックはやはりキャリアメール。この問題さえクリアできれば、MNPは意外と敷居が低い気がします。実は今月の解約月に向け、昨年から着々と周囲に「キャリアメールはMNPしますので消えます」と別のメールアドレスへの移行を促してきました。その甲斐あって、ここ数カ月はキャリアメールの着信も0になりやっと準備が整いました。また2014/10に2GB、2015/04に3GBとMVNOのデータ量が価格据え置きで増大したのも大きいですね。

2011年12月にSIMフリーiPhone4sを個人輸入から今月までの私の通信料金はざっくり以下の通り。今までもかなり安いとは思うのですが、これで2台持ちも念願のサヨナラです。MNP前後で一番の違いは、¥1,000円分の無料通話が付かなくなることなのですが、今までもあまり使い切ったことがなかったので今後¥560円以上の通話がなければMNP後の方が安くなるかと思います。また私は Google Hungout(固定電話:$0.03/分,携帯電話:$0.09/分)を併用していますので、着信番号表示(非通知)が不要の固定電話への発信にはほとんど Google Hungout で事足りてます。唯一の難点は Google Hungout 自身への着信と中国相手には無力ということですね(笑)
最近は固定電話への発信が無料(期間限定キャンペーン中)の Viber Outブラステル といった格安通話サービスが充実してきているので、Google Hungout のチャージが切れたら試してみようかと思ってます。
また私は今までパケホーダイのようなスマホプラン(¥7,000円?)は一度も契約したことがありません。通信料金に¥7,000円は高すぎですね。SIMフリーの1万数千円の格安スマホを1台用意すれば、少なくともネットは3GBで月1,000円弱で済むわけですから。ヘビーユーザは¥7,000円でも安いとは思いますが、ライトユーザまで¥7,000円ではですね。

年月 契約先 端末 利用種別 プラン 料金/月(税込)
2011/12~
2015/09
ドコモ ガラケー 電話/キャリアメール/SMS タイプSS バリュー ¥1,313円 ¥2,287円
IIJ SIMフリーiPhone4s インターネット IIJmioミニマムスタートプラン(3GB) ¥974円
2015/10~ IIJ SIMフリーiPhone4s 電話/SMS/インターネット BIC SIM音声通話パック
IIJmioミニマムスタートプラン(3GB)
¥1,728円

みおふぉんBIC SIM音声通話パック の違い

IIJmioの みおふぉん と BIC SIM音声通話パック の違いをIIJサポセンにメールで問い合わせたところ、Wi2 300(公衆無線LANサービス)特典(¥391円/月が無料)の有無のみとの回答でした。BIC SIM音声通話パックの契約内容はみおふぉんと全く同じです。ちなみにWi2 300はあくまでビックカメラのサービス特典でIIJmioとは一切関係ありません。そのためサポートもビックカメラ(Wi2 300)になります。

  • Q.IIJmioとBIC SIMのプランの違いは、Wi2 300(公衆無線LANサービス)の有無だけという認識でよろしいでしょうか?
  • A.はい。IIJmio高速モバイル/Dサービスの仕様については、「IIJmio音声通話パック for BIC SIM」経由でお申し込みいただいた場合も差異はございません。

  • ※「公衆無線LANサービス Wi2 300」につきましては、ビックカメラ側で提供しているサービスとなり、特典を付属させているのもビックカメラ側となるため、弊社ではサービス詳細がわかりかねます。

    「Wi2 300」の詳細や登録方法等についてご不明な点がございましたら、直接、取り扱い販売店や、下記URLの「Wi2カスタマーセンター」へお問い合わせください。

    https://www.iijmio.jp/bicsim/welcomepack.html#wi2

    今後ともよろしくお願いいたします。

ドコモから BIC SIM へMNP手順

IIJmioへのMNPはこちらのIIJmioサイトに記載されています。BIC SIMカウンター店頭での手続きはこちらに記載されています。

  1. MNP予約番号の発行
    My docomo にログインし、「My docomo > ドコモオンライン⼿続き > ご契約内容確認・変更」の3ページ目の下段の「携帯電話番号ポータビリティ予約」から申込み、10桁のMNP予約番号を発行します。
    ちなみに携帯電話の解約・MNPを利用した解約からですと手続き方法がドコモショップへ行けとしか出てきません。ネットからMNP予約番号を発行するには、My docomo のドコモオンライン⼿続き から行ってください。

  2. 必要書類
    必要書類は以下の通りです。詳細はこちら
    なお、携帯電話本体は持参する必要はありませんでした。あくまで携帯電話番号さえわかればOKです。私はガラケーのSIMカードを回収するのかと思ったのですが、ビックカメラ側で回収することはないとのこと。MNP完了したらドコモショップへ返却でしょうね。

    1. 本人確認書類(顔写真付きのもの)
    2. 本人名義のクレジットカード(月々支払用)
    3. メールアドレス(カウンターにて受信内容(認証コード)を確認可能なもの)
    4. 携帯電話番号、MNP予約番号

    メールアドレスは認証コードだけの取得なので、転出元のキャリアメールでも大丈夫(ドコモの場合MNP完了まで使用可能)かとは思いますが、MNP完了後即使用不可になってしまいますので、店頭で確認できるフリーのメールアドレスを用意しておいたほうが無難だと思います。ブラウザで確認できるWebメールでよいと思いますね。キャリアメールの場合は店頭スタッフに確認したほうがよいと思います。

  3. iPad端末によるIIJmio入会及びMNP手続き
    ビックカメラ有楽町店は平日午後であったためか、意外や空いていて待ち時間0でカウンターに着席できました。本人確認書類を提出し、私はすでにIIJmio会員でしたので、本人名義のクレジットカードの確認は不要でした。

    申し込みはすべてiPadで行います。基本的にはIIJmioのお申し込みページと同じだと思いますが、以下は記憶を辿っての記述のため順番などが違っているかもしれませんがご了承ください。
    まずiPadによる契約内容の確認し同意のチェックをしていきます。プラン、SIMカードの機能、メールアドレス(カウンターにて受信内容を確認可能なもの)、MNP転入情報(電話番号の名義人、電話番号、MNP予約番号、MNP予約番号有効期限)、SIMカードサイズ、オプション等を選択します。次に、基本登録情報の入力をしますが、会員の私は、IIJminoにログインすると住所、氏名などの基本登録情報はすべて記載済になりました。新規の場合は基本登録情報とクレジットカード情報を入力し、最後に登録をします。会員の私はすでにクレカは登録済ですので与信はなかったと思われますが、通常はここでクレカ与信も行われるかと思います。

    すると先ほど入力したメールアドレスに4桁の認証コードが送信されますので、その場でメール受信しメールに記載されている認証コードをiPadに入力します。これはメールアドレスの有効性の確認ですかね。メール件名が「[IIJmio] mail address confirmation」ですからそのようですね。

    最後にスタッフが本人確認書類をiPadで写真撮影し画像を添付、全ての登録内容を再度確認し登録完了です。このあとはIIJmioによるMNP審査となります。MNP審査は5分程度で下りました。先ほど入力した住所とドコモに登録されている住所と違っていると審査が下りないようですのでご注意ください。MNP前にMy docomoで住所を確認しておいたほうがよいと思います。

    終わりに、iPadからキャッシュをクリア(リセット)し完了です。ちなみにsafariなどの一般的なブラウザではなく、専用のセキュアブラウザを使用していました。ここまでペーパーレスで非常に好感が持てます。これからは店頭でもこのような登録形態になっていくんでしょうね。最後にBIC SIM音声通話パック(SIMカード後日発送(NO SIM))のパッケージとSIMカード納品書1枚(SIMカード受取に必要)を受取り、スタッフと一緒にレジに向かいます。

  4. BIC SIM音声通話パックの購入とSIM発行待ち
    BIC SIM音声通話パック(SIMカード後日発送(NO SIM))をレジで購入します。この時点ではまだSIMは付いてません。ちょうどネットからBIC SIM音声通話パック 購入するのと同じですね。支払いは現金でもクレカでも電子マネーでもOKです。定価¥2,990円の税込¥3,229円でした。私はJAL-WAONで支払い、96マイル(通常は323ポイント)貯りました。BIC SIM音声通話パック代¥3,229円以外は一切かかりません。
    これで無事SIMカード発行の作業となりますが、発行には30分ほど時間がかかるそうで、店内で時間を潰します。先ほど渡されたSIMカード納品書にSIMカードの受取時間(30分後以降)が記載されています。

  5. SIMカードの受取り
    時間になったら、再度BIC SIMカウンターに行き、SIMカード納品書を渡しSIMカードを受取ります。ここで動作確認してもよいですし、あとで行っても構いません。以上でMNPが完了です。

  6. SIMカードの動作確認
    私はそれまでIIJmioのデータSIMでしたのでAPNはすでに登録済で、iPhone4sにSIMカードを挿すと即使用可能になりました。海外SIMでは当たり前だったアンテナピクトも日本でやっと立ちました(笑)
    またiPhone4sでしたのでSIMカードサイズはMicro-SIMにしましたが、形状はジェムアルトの4端子でした。ICCIDがDN05~なのでDNP(大日本印刷)の4端子でした。形状の見た目で曲線があるのでついジェムアルトと勘違いしました。新形状ですね。このあたりはWikipediaのドコモUIMカードに詳しく書かれています。 ですのでNano-SIMへのSIMカットは無理ですね。それならNano-SIMを選択して、Micro-SIMアダプタ(下駄)を履かした方がよかったかもしれません。ただSIMアダプタからSIM本体が外れ、SIMが取れなくなる怖さ(分解必須)も知っているだけに必要になったら変更でよいのかもしれません。なおNano-SIMに変更する場合は、別途変更手数料で¥2,000円が必要です。

    支払先 支払内容 金額(税込)
    NTTドコモ 携帯電話番号ポータビリティ手数料(転出) ¥2,160円
    ビックカメラ BIC SIM音声通話パック ¥3,229円
    MNP費用合計 ¥5,389円
  7. Wi2 300の登録
    Wi2 300の登録にはMNP後一週間程度かかるそうです。一週間後に以下のBIC SIM専用の新規登録サイトにアクセスします。電話番号とICCIDを用意します。ICCIDはSIMカード納品書か、SIMカードの裏面に記載されています。

    メールアドレス、ログインID、パスワード、生年月日、性別と、電話番号、ICCIDを入力し登録します。
    ちなみに通常のWi2 300の新規登録との違いはクレジットカードの登録の有無でした。BIC SIMのほうは特典なのでクレカの入力項目がありません。
    実際に使用するにはWi300スポットが見つかったら自動切替をしてくれる Wi2Connect というアプリがありインストールしてみましたが、ここで重大なことに気づいてしまいました。
    Wi2 300のアクセスポイントってほとんどが暗号化なしなのです。すなわちHTTPやメールなどは平文で流れます。これではちょっと使えないですね。Wi2では唯一「Wi2_club」というSSIDだけが「WPA/WPA2 PSK」です。またBBモバイルスポットは「mobilepoint2」が「WPA2 PSK」ですので、この2つ以外はどうしてもという時以外は使いたくないですね。どうしてもという時でもVPN接続してからですね。ということでWi2Connectアプリは削除し、必要になったらその都度手動で接続する運用にします。また「premium」が付くアクセスポイントもあるのですが、こちらは課金用スポットでエリアマップでみますとほとんどがこれ。なんかWi2 300って使えないですね。

    サービスエリア SSID ネットワークキー 暗号化方式
    Wi2 300
    Wi2 300
    Wi-Fiスクエア
    Wi2 無し 無し
    Wi2_club rkhd7392 WPA/WPA2 PSK
    Wi2_free 無し 無し
    wifi_square 無し 無し
    BBモバイルポイント
    BBモバイルポイント
    mobilepoint 696177616b WEP
    mobilepoint2 62626d7032 WPA2 PSK
    UQ_Wi-Fi
    UQ_Wi-Fi
    UQ_Wi-Fi 2u2w6 WEP

最後に

BIC SIMカウンターとはネットから BIC SIM音声通話パック(SIMカード後日発送(NO SIM)) を購入し、後日SIMカード到着という手順をいわば店頭でに一気行ってしまおうというワン・ストップ・サービスでした。

海外に行けば必ず現地SIMを調達する者としてつくづく思うのが、日本のSIMは初期費用に¥3,000円もかかってしまうのはボッタクリだと思うんですよね。SIM込みとはいえ手数料に¥3,000円もかかりますかね?この価格に通信プランは入ってないんですよね。純粋に物理的なSIMの価格にです。海外でSIM確保にこんなにかかる国はおそらく稀有かと。変更手数料も¥2,000円って、これだから日本での海外旅行者用SIMも高いんですよね。SIMの物理代は¥1,000円以下にして欲しいものです。タイなどは500MB込で¥330円(99B)でしたから。

今現在の日本のプリペイドSIMでみますと、リチャージ(TOPUP)可能な IIJの Japan Travel SIM が一番良さそうなのですが、いかんせんSIM代の影響かまだまだ高いですね。これでデータSIM(音声通話不可・SMS不可)のみですからね。まあ為替の影響で、この価格でも海外旅行者には割安に感じるもしれませんが(汗)観光立国を目指すならSIM入手の容易性や低価格化、また成田空港のWiFiを無料化なども積極的に行う必要があるかと思います(羽田空港は無料WiFi有)。街中の英語表記の充実にコストや時間がかかるなら、まずは電波の入手性を簡易にすることが一番の「おもてなし」になると思います。海外でGoogle Mapsなどネット検索できる環境さえあればなんとかなりますからね。羽田、仁川、サンパウロ(GRU)、ドバイ、チャンギ、香港などWiFi Freeの空港って本当にありがたいものです。

これはあくまで個人的意見ですが、これだけMNPがメジャーになると、今後キャリアメールでの運用はITリテラシーが低いとされていくのではないかと。キャリアに縛られないキャリアフリーなSMSやメール、またはSNSですね!

アクセス解析 CounterizeII から NewStatPress へマイグレーション

WordPress のアクセス解析には現在 Counterize II と Google Analytics を併用しています。一時は Google Analytics へ一本化しようか迷ったのですが、いかんせんIPアドレスなどがデフォルトでは取得できませんので、不正アクセスやスパムなどでの BAN (拒否)ができません。これでは一本化はまず無理ですし、結局、併用がベターという結論に至りました。いざという時に(生)ログが手元にあるという安心感もありますしね。

ただ、 CounterizeII のアクセス解析はデザインが旧態依然ですし、すでに4年以上更新がないため、そろそろアクセス解析プラグインの乗り換えを考えることにしました。いろいろなプラグインがある中で、見た目とテーブルの簡素さから StatPress 系の NewStatPress にすることにしました。

ただ、そのまま使い始めますとアクセスカウンターがまたゼロからのスタートになってしまいます。これ、なんとかしたいなーということで、CounterizeII のアクセスログを NewStatPress へマイグレーション(移行)することにしました。テーブル間でSQL一発のマイグレーションも可能ですが、やはりできるだけ資産(データ)を生かしてマイグレーションしたいなーと。

テーブル構成(ER図)

まずは CounterizeII と StatPress のER図を以下に示します。今回ほぼ初めてまともにテーブル構成を見たのですが、まあ CounterizeII は正規化し過ぎですね。アクセスログでここまで正規化する必要はないと思いますね。ログ系はまず素の生ログに近いベースとなるテーブルにタンキングしておき、解析・統計はそのテーブルから加工していくのがセオリーかと。

ER図

このER図は、A5:SQL Mk-2 というツールで作成したのですが、いままで使用した数々のER関連ツールの中でも、抜群ではないかと。今までのツールって帯に短し襷に長し的なところがあったんですよね。この分野では海外モノが多いツールの中で日本製ですし、とにかく使いやすく表示形式(物理、論理、データ型)のバリエーションやDDLへの落とし込み、はたまたDB接続にSSHトンネルがデフォルトで可能など、このツールの開発者はかゆいところに手が届くというか、ER図とはなんなのかをよく知ってますね。こんな優れ物ツールが無料ってある意味凄すぎです。上記ER図もリバースエンジニアリングから、ものの5分程度で作成できました。MS-Visio ならおそらく1時間はかかっていたかなーと。Donate を募ってらっしゃるので本当はしたいのですが、まずはここでの紹介からとさせてくださいね(汗)

SQLによるマイグレーション

フィールドマッピング

SQL による CounterizeII から NewStatPress へのマイグレーションですと、純粋に CounterizeII のログデータを NewStatPress テーブルにコピーするだけですね。date, time, ip, urlrequested, agent, referrer, timestamp の生ログが対象になりますかね。
テーブルのフィールドマッピングは以下の通りです。テーブル名の接頭辞($wpdb->prefix)は、省略しています。

Counterize II SQL NewStatPress
Counterize.timstamp statpress.date
Counterize.timstamp statpress.time
Counterize_Pages.IP statpress.ip
Counterize_Pages.url statpress.urlrequested
Counterize_UserAgents.name statpress.agent
Counterize_Referers.name statpress.referrer
Counterize.timstamp statpress.timestamp

SQL

SQL ですとこのような感じになりますかね。
INSERT INTO statpress (
    date,
    time,
    ip,
    urlrequested,
    agent,
    reverrer,
    timestamp)
SELECT
    DATE_FORMAT(a.timestamp, '%Y%m%d') as date,
    DATE_FORMAT(a.timestamp, '%H:%i:%s') as time,
    a.IP,
    b.url,
    c.name as agent,
    d.name as referrer,
    a.timestamp
FROM
    Counterize a 
    LEFT JOIN Counterize_Pages b ON a.pageID = b.pageID
    LEFT JOIN Counterize_UserAgents c ON a.agentID = c.agentID
    LEFT JOIN Counterize_Referers d ON a.refererID = d.refererID
ORDER BY
    id ASC ;

なお、CounterizeII のIPアドレスはデフォルトでは暗号化されています、私は CounterizeII をカスタマイズして暗号化せず生IPをロギングするよう変更していましたのでそのまま移行できますが、暗号化されたハッシュ値のままであれば、あまり使い道がなさそうなので移行不要かもしれませんね。

NewStatPress のログ解析処理を適用しマイグレーション

フィールドマッピング

CounterizeII のログデータに本来 NewStatPress が行うログ解析処理を適用後、statpress テーブルにマイグレーションするという意味になります。具体的には、SQLで取得した date, time, ip, urlrequested, agent, referrer, timestamp の生ログに NewStatPress とほぼ同様のログ解析ロジックを適用し、search, nation, os,browser, searchengine, spider, feed を取得後、statpress テーブルにマイグレーションします。

Counterize II SQL NewStatPress
PHP
Counterize.timstamp statpress.date
Counterize.timstamp statpress.time
Counterize_Pages.IP statpress.ip statpress.nation
Counterize_Pages.url statpress.urlrequested statpress.feed
Counterize_UserAgents.name statpress.agent statpress.os
statpress.browser
statpress.spider
Counterize_Referers.name statpress.referrer statpress.search
statpress.searchengine
Counterize.timstamp statpress.timestamp

PHPコード

PHPコードは以下のような感じですかね。ファイル名はさし当たって counterizeii2statpress.php とでもしておきましょうか。なお5行目の require_once() の <WordPress Dir> には WordPress 設置ルートディレクトリをフルパスで指定してください。言わずと知れた外部から WordPress の関数をロードしたい場合のおまじないですね。

#!/usr/bin/php
<?php

//require the WP bootstrap
require_once('<WordPress Dir>/wp-load.php');

// Execute migration
mig_StatAppend();

/**
 * CounterizeII to NewStatPress migration
 *
 */
function mig_StatAppend() {
    global $wpdb;
    $table_name = nsp_TABLENAME;

    $offset = $wpdb->get_row("SELECT count(*) as count FROM " . $table_name);
    $count = $offset->count;
    $start = $wpdb->get_row("SELECT id FROM " . counterize_logTable() . " ORDER BY id ASC LIMIT 1 OFFSET " . $count);

    $sql = 
        "SELECT
            a.id,
            DATE_FORMAT(a.timestamp, '%Y%m%d') as date,
            DATE_FORMAT(a.timestamp, '%H:%i:%s') as time,
            ip,
            url,
            c.name as agent,
            d.name as referrer,
            a.timestamp
        FROM
            " . counterize_logTable() . " a 
            LEFT JOIN " . counterize_pageTable() . " b ON a.pageID = b.pageID
            LEFT JOIN " . counterize_agentsTable() . " c ON a.agentID = c.agentID
            LEFT JOIN " . counterize_refererTable() . " d ON a.refererID = d.refererID
        WHERE
            id >= " . $start->id . "
        ORDER BY
            id ASC;";

    $res = mysql_query($sql);

    while ($row = mysql_fetch_assoc($res)) {
        $id = $row['id'];
        $vdate = $row['date'];
        $vtime = $row['time'];
        $ipAddress = $row['ip'];
        $urlRequested = $row['url'];
        $userAgent = $row['agent'];
        $referrer = $row['referrer'];
        $timestamp = $row['timestamp'];
        $login = null;

        $urlRequested = mig_URL($urlRequested);
        $urlRequested = esc_sql($urlRequested);
        
        $referrer = esc_sql($referrer);
        $referrer = esc_html($referrer);

        $userAgent = esc_sql($userAgent);
        $userAgent = esc_html($userAgent);

        $os = nsp_GetOs($userAgent);
        $browser = nsp_GetBrowser($userAgent);
        $spider = nsp_GetSpider($userAgent);

        $searchengine = '';
        $search_phrase = '';

        if ($spider != '') {
            $os = '';
            $browser = '';
        } else {
            // Trap feeds
            $feed = nsp_IsFeed($urlRequested);
            // Get OS and browser
            $os = nsp_GetOs($userAgent);
            $browser = nsp_GetBrowser($userAgent);

            $exp_referrer = mig_GetSE($referrer);
            if ( isset($exp_referrer) ) {
                list($searchengine,$search_phrase) = explode("|",$exp_referrer);
            }
        }

        // Country (ip2nation table) or language
        $countrylang = "";
        if ( $wpdb->get_var("SHOW TABLES LIKE 'ip2nation'") == 'ip2nation' ) {
            $sql2 = 'SELECT *
                    FROM ip2nation
                    WHERE ip < INET_ATON("'.$ipAddress.'")
                    ORDER BY ip DESC
                    LIMIT 0,1';
            $qry = $wpdb->get_row($sql2);
            if ( $qry != null ) {
                $countrylang = $qry->country;
            }
        }

        $insert =
            "INSERT INTO " . $table_name . "(
                date,
                time,
                ip,
                urlrequested,
                agent,
                referrer,
                search,
                nation,
                os,
                browser,
                searchengine,
                spider,
                feed,
                user,
                timestamp
             ) VALUES (
                '$vdate',
                '$vtime',
                '$ipAddress',
                '$urlRequested',
                '".addslashes(strip_tags($userAgent))."',
                '$referrer','" .
                addslashes(strip_tags($search_phrase))."',
                '".$countrylang."',
                '$os',
                '$browser',
                '$searchengine',
                '$spider',
                '$feed',
                '$login',
                '$timestamp'
            )";

        $results = mysql_query( $insert );

        if ($results < 1) {
            print "insert error: line $id\n";
        }

        if ( ++$count % 1000 == 0 ) {
            print "$count\n";
        }
    }
}

/**
 * Processing the url
 *
 * @param urlRequested the source url
 * @return processing the url
 */
function mig_URL($urlRequested = '') {
    if(substr($urlRequested,0,2) == '/?') { $urlRequested = substr($urlRequested,2); }
    if($urlRequested == '/') { $urlRequested = ''; }
    return $urlRequested;
}

/**
 * Get the search engines
 *
 * @param referrer the url to test
 * @return the search engine present in the url
 */
function mig_GetSE($referrer = null){
    global $newstatpress_dir;

    $key = null;
    $lines = file($newstatpress_dir.'/def/searchengines.dat');
    foreach($lines as $line_num => $se) {
        list($nome,$url,$key) = explode("|",$se);
        if(strpos($referrer,$url) === FALSE) continue;

        # find if
        $variables = nsp_GetQueryPairs(html_entity_decode($referrer));
        $i = count($variables);
        while($i--){
            $tab = explode("=",$variables[$i]);
            if($tab[0] == $key && count($tab) >= 2){return ($nome."|".urldecode($tab[1]));}
        }
    }
    return null;
}
?>

マイグレーションの実行

今回は、ダウンタイムを出来る限り最小限に収めるという観点からマイグレーションを考えてみます。そのため多少手順が煩雑になるかもしれません。

NewStatPress プラグインのインストール

NewStatPress を稼働させたままマイグレーションしますとアクセスがあった場合、ログが新旧で混ざってしまいます。まず事前準備として、 WP Maintenance Mode プラグインなどでサイトをメンテナンスモードにして閉塞します。
閉塞後 NewStatPress プラグインをインストールします。有効化したらダッシュボードの NewStatPress メニューの Tools > Database Tools から ip2nation もインストールしておきます。

ロギングの停止

次にロギングの停止ですが、NewStatPress メニューの Options > Filters > Parameters to ignore > IP addresses 欄に以下のようにCIDRで記載しますとロギングが停止します。本来ならIPアドレスを ANY で拒否すればよいので、 0.0.0.0/0 でよいはずなのですが、どうもサブネットマスクを /0 にするとempty($mask) 判定でひっかかり強制的 32 に変更されてしまい、正常に全IPアドレスのアクセス拒否ができません。そのためサブネットマスクを 1 にしアドレスを2つに分けました。

[cc] 0.0.0.0/1,128.0.0.0/1
[/cc]

上記を追加すればロギングは停止しますので、メンテナンスモードを解除しサイトを開放します。なおログが新旧混ざってもよいのであればこの手順は不要です。

解析定義データの追加

次に昨日 2015/09/19 リリースの NewStatPress v1.0.8 は、解析定義データがやや不足している箇所がありますので、プラグインフォルダ配下の def ディレクトリの dat ファイルに、以下の定義を追加しておくとログ解析の精度が上がるかと思います。
ただし追加する際は、次の点にご注意ください。dat ファイルは上から順にマッチ検索しますので、数字が大きいほうを先に記述してください。FireFox40 と FireFox4 の場合は、FireFox40 を先に(上に)記述してください。例えばブラウザのバージョンが FireFox40 であった場合、FireFox4 が先に記述されていると FireFox4 にヒットしてしまい、バージョンは 40 であるのにも関わらず、4と判定されてしまいます。またブラウザのバージョンなどは未来のバージョンを記述しておいても特に問題ありません。

また spider.dat は、定義に該当しないアクセスは、すべて Visitor と判定され bot にも関わらず、アクセス数扱いにされてしまいますのでご注意ください。このファイルは、適宜メンテしないと正しいアクセス数が得られないのではないかと思います。ここは少々面倒ですね。

参考までに、今回追加した定義ファイルを以下に置いておきます。
  • browser.dat
    Chrome 46|Chrome/46|
    Chrome 47|Chrome/47|
    Chrome 48|Chrome/48|
    Chrome 49|Chrome/49|
    Chrome 50|Chrome/50|
    Chrome 5|Chrome/5|
    
    
    Firefox 50|Firefox/50|
    Firefox 51|Firefox/51|
    Firefox 52|Firefox/52|
    Firefox 53|Firefox/53|
    Firefox 54|Firefox/54|
    Firefox 55|Firefox/55|
    Firefox 56|Firefox/56|
    Firefox 57|Firefox/57|
    Firefox 58|Firefox/58|
    Firefox 59|Firefox/59|
    Firefox 60|Firefox/60|
    Firefox 4|Firefox/4|
    Firefox 5|Firefox/5|
    Firefox 6|Firefox/6|
    
    Microsoft Edge|Edge/12|
    Microsoft Edge|Edge/13|
    Microsoft Edge|Edge/14|
    Microsoft Edge|Edge/15|
    
  • os.dat
    Windows 10|WindowsNT10.0|
    
  • searchengine.dat
    Yahoo は search.yahoo.com になっていますので、必ず search.yahoo. に変更してください。
    Yahoo|search.yahoo.|p|
    
    Bing|www.bing.com|q|
    ezweb|ezsch.ezweb.ne.jp|query|
    docomo|search.smt.docomo.ne.jp|MT|
    au|sp-search.auone.jp|q|
    Rakuten|websearch.rakuten.co.jp|qt|
    OCN|wsearch.ocn.ne.jp|MT|
    J:COM|search.myjcom.jp|q|
    So-net|www.so-net.ne.jp|query|
    JWord|search.jword.jp|name|
    Sleipnir|search.fenrir-inc.com|q|
    Lunascape|s.luna.tv|q|
    FMWORLD|search.azby.fmworld.net|q|
    MyVAIO|search.start.sony.jp|MT|
    
  • spider.dat
    360Spider|360Spider|
    Linkdex|linkdexbot|
    SimilarTech|SMTBot|
    

コンソール実行

コンソールから couterizeii2statpress.php を実行します。処理が把握できるように 1000 件処理毎に件数を出力するようにしてあります。
また Web からでも実行は可能ですが、WordPress ディレクトリ配下ではなく外部の php ファイルが動作するディレクトリに配置する必要があります。HTML 表示になりますので改行の<br>を適宜入れておくとよいと思います。ただ Web からですとログ量にもよりますが、おそらくHTTP コネクションのタイムアウトになってしまう気がします。
[cc lang=”bash” theme=”blackboard”] $ php couterrizeii2statpress.php
1000
2000
3000
….
[/cc]
27万件程度でも問題なく処理が終了しました。ただ私のサーバは実行中プロセスが60分経過すると強制的に kill (中断)される仕様になっているようで、17万件あたりで停止してしまい再実行を余儀なくされました。

再実行の処理は中断した場所から再開し継続するよう処理を組んでいます。途中から再開し継続するカラクリは以下のコードですね。
まず statpress テーブルに登録され件数を取得します。Counterize テーブルからこの件数に該当する位置の行を OFFSET 句で取得し、その行の id を取得します。この id が継続開始位置ですね。本当は副問い合わせを使って SQL 一発で id を取得したかったのですが、MySQL は LIMIT/OFFSET 句の副問い合わせはエラーになり、結局それぞれでSQLを投げて取得する方法になりました。イマイチ。PostgreSQL なら可能だと思いますね。
    $offset = $wpdb->get_row("SELECT count(*) as count FROM " . $table_name);
    $count = $offset->count;
    $start = $wpdb->get_row("SELECT id FROM " . counterize_logTable() . " ORDER BY id ASC LIMIT 1 OFFSET " . $count);
        WHERE
            id >= " . $start->id . "
また、再度最初から行う場合は、statpress テーブルの初期化(全件削除 & AUTO_INCREMENT=1)を行っておく必要があるかと思います。
[cc lang=”sql” theme=”blackboard”] mysql> TRUNCATE statpress;
[/cc]

差分の同期

最後にもう一度サイトをメンテナンスモードにしてサイト閉塞します。コンソールから couterizeii2statpress.php を再実行します。これは先ほどのコンソール実行以後にアクセスされたログの差分を同期するためです。今度は直ちに終了するかと思います。

終了したら、ロギングを再開するため先ほど NewStatPress メニューの Options > Filters > Parameters to ignore > IP addresses 欄の「0.0.0.0/1,128.0.0.0/1」を消去し保存します。最後にメンテナンスモードを解除し、マイグレーションは完了です。

最後に

NewStatPress 高機能?と言われているようですが、私が欲しいと思う集計がないというか集計が基本的なものしかありませんね。例えば 不正アクセスがないかなどの Visitor 別日(週)集計や、ランキング確認の記事別月(週)集計などがありません。またカウンタ用の前日ページビュー数などもありません。この辺はカスタマイズしていかないと無理っぽいですね。
ただCounterizeII ではスパイダー数が全く解らなかったのですが、NewStatPress にしてページビューより多くこんなに多いのかと少々驚きでした。 bot アクセスが多過ぎですね。

また定義ファイルですが、現在はブラウザ名とアイコンファイルを同一名で共有していますが、ここは分けたほうがよいのではないかと思いますね。定義ファイルに追加する度にアイコンファイルを追加しなければなりませんので、これではファイル名が違うだけの同一画像ファイルが増え過ぎてしまいます。
[cc] ブラウザ名兼アイコンファイル名|ユーザーエージェント|
Firefox 40|Firefox/40|

ブラウザ名|ユーザーエージェント|アイコンファイル名|
Firefox 40|Firefox/40|firefox|
[/cc]
また普段は PHP 使いではないため、今回 MySQL の大量データを PHP で扱う場合、どのようにすればよいか少々戸惑いました。これはまた別記事にしたいと思います。

ラグビーW杯 南アフリカ v 日本 世紀のジャイキリという衝撃

ラグビーW杯 南アフリカ v 日本、深夜世紀のジャイアントキリングに感涙。リアルタイムで観れたことに感謝(レスター岡崎に感謝(汗))。

これほど魂が震えたのは久しぶりです。個人的にはジョホールバルかWBC決勝か五輪女子ソフトか南アW杯デンマーク戦(現地)か、でも世界的には今日の勝利はそれ以上のインパクトです。RWC史上最大の衝撃ですから。どこに魂が震えたかというと試合展開も劇的でしたが、あの日本代表のメンタルの強さですね。TV画面からその気迫がひしひしと伝わってきました。そのメンタルに触れた観客もJAPANコールに。最後エンジンを組み、勝ちにこだわる選択にも感動しました。
やはり日本人は泥臭く粘り強くコツコツひたむきにやらないと世界では勝てないということですね。スモールベースボールにしろ、練習は嘘をつかない、まさしくそれでした。以前、エディー・ジョーンズ HCについて触れましたが、あの時の練習量も半端なかったですしね。

先日、プロフェッショナル・仕事の流儀というエディー・ジョーンズ ラグビー日本代表監督のNHK番組がありました。エディー監督いわく以下の点について説いてました。

  • 強みを知り、強みを伸ばす
    日本人の強み。それは、どんな過酷な練習にも耐え、向上心を持ち続ける”勤勉(タフ)さ”。真面目で忍耐力があること。それは間違いなく世界一です。他の国の選手なら、とっくに逃げ出しているでしょう。
    (AM6~PM7までの過酷な練習って高校野球じゃないんだから。でも映像からは相当な過酷さが垣間見えました。)

  • ハッピーにしない
    選手を成長させるために必要なのは、選手を正しく理解し、それに合った方法で“少しの不安”や“緊張感”を与えること。居心地がいいと能力は発揮できないからです。ときには少し突き放すことで、選手が100%安心しないようにしています。

  • どんどんミスさせる
    日本の練習で一番間違っているのはミスをしないように練習すること。ノーミス、ノーミスと言うが、ミスするから上達する。失敗から学ぶということが重要。

  • 責任感を持たせる
    各ポジションのリーダー(サブリーダー)が責任感を持つ必要がある。責任とは各ポジションのメンバーによいパフォーマンスをさせること。

  • 感情の波を小さく
    指導者として、誰にでも感情に起伏があることを理解した上で、そうした波を最小限にとどめさせることが大切。

引用元:SKYBLUES.ORG
アジアカップ2015 日本代表QF敗退 と アギーレ監督解任

南アフリカは白人:黒人の比率が1:8なんですよね(南アというといつもこの比率で見てしまう(汗))。5年前にサッカーW杯で現地に行きましたが、当時でもいまだ格差は凄まじいものがありました。南アにしてもオージーにしてもイギリス連邦加盟国ですからイギリスの影響を色濃く受けてます。同組にスコットランドがいるとはいえイギリス国内中、ジャイキリした日本をリスペクトしていて、その喜びようといったら日本人以上です。スポーツの力って凄いですね!ラグビー日本代表に「勇気」を貰いました。

最近涙腺が弱いのか(汗)、先ほど録画での再放送でもまた涙してしまいました。

Re: ドルトムントで絶好調の香川真司が、日本代表で輝けない理由

この記事、なかなか今の私の心のモヤモヤを言い当てていて、リツイートならぬ、リブログ!?

ドルトムントでの香川は、トゥヘル新監督からかなりの部分で「任せられている」。4-2-3-1から4-3-3へとシステムが流動的に変化する中で、「自分で判断して中盤か前かを決めろ」というのが大筋の指示だという。つまりインサイドハーフ的に前線の3枚を生かすこともあれば、1列前でプレーすることもある。それは相手の守備の陣形や時間帯によって変化する。これにより、4-2-3-1のトップ下に固定され、セカンドトップとして高い位置でプレーし、得点に直接絡むことを求められていた時期のフラストレーションはなくなった。

引用元:webスポルティーバ
ドルトムントで絶好調の香川真司が、日本代表で輝けない理由

そうなんですよね。昨期と今期の香川をヒートマップやポジションニングマップなどで比較すれば一目了然ですよね。今期のドルトでの香川は、ある時にはギュントアンやヴァイグルより後ろの最終ラインまで下がってみたり、かと思えば、オーバメヤンと同等の位置まで上がって行くなど、かなりの自由度を与えられているように思います。4-1-4-1や4-2-1-3ってことも。これは香川に限らずで、攻撃陣はかなり流動的にポジションチェンジしてますよね。流石はトゥヘル。

フォーメションなどその時々で機能すればよいのですから、香川においてはあまりポジショニング云々を言わないほうが結果が伴う気がしてます。(とかく型にはめたがるハリルには逆行してますけどね(笑))むしろボランチやインサイドハーフと言っておいたほうが肩の力が抜けていい動きをしそうな気がしてます。現に今年はかなり引き気味なポジショニングも目立ちます。この人はメンタル的にはまだまだWeakな部分があるのですが、ここはなかなか技術と同じようには習得できない。QBKなんか言わせておけばいい。次も決めて黙らせればいいんです。

香川いわく、「楽しい」という感覚が彼にって一番なのですから。

2018ロシアW杯は本田ではなく香川のW杯だと確信しています。出られたらね(汗)

日本vカンボジア@埼スタ 国内代表戦を久々に観戦

最近はほとんど国内代表戦はスルーしていたのですが、ブラジルW杯のレシフェの宿でたまたまご一緒した方が大阪からわざわざ代表チケ持参でお誘いを受けたので、ウン年ぶりの埼玉スタジアム2002まで行ってきました。サッカーなら先月J3リーグを観戦してますが、代表戦の現地観戦となると昨年アウェイの日本vブラジル@シンガポール以来。

浦和美園駅を出たあたりからポツポツと小雨が。南門で1年3カ月ぶりの再会。お互い久々の再会に乾杯。ゴール裏も久しぶり。やっぱり埼スタは観やすいですね!

試合はというとW杯(予選)は「結果がすべて」、まあ言うことはあまりないのですが、今日はゴールエリアサイド深い位置からのマイナスのクロスが確実に増えてましたが、最近、コパや欧州リーグばかり見ていたせいか、パススピードが遅過ぎで、ダイレクトプレーが少な過ぎで止まっているように見えてしまうのは私だけでしょうか。パス回しがチンタラに見えてしまうんですよね!ワンツーやドリブル、裏を取る動きをもっと増やしてほしいですね。宇佐美が唯一停滞ムードな流れを変えた感じがしました。あと長友へのパスはいつも雑(笑)。これでハリル監督も”ホッ”でしょうね!

ということで、帰りは安定の浦和美園駅渋滞。レシフェのアレーナ・ペルナンブーコの帰路も本当に壮絶でしたが、こちらは全く人が流れない。
改札少ないんじゃないのかと思いましたが、入場制限をしているからなんですかね。改札を抜けたらかなり空いてました。もちろん電車は満員でしたが、次駅の東川口で1/3は下車していき、帰路の電車はやはりレシフェのほうが醜かった。そういえばあの時も雨でしたね。

例え日本代表がロシアに行けなくとも、ロシアで再会する約束をし、本当は祝杯をあげたかったのですが、帰れなくなるのでおとなしく解散となりました。

そう言えばスタジアムを出る所のオフィシャルショップで代表ユニが50%オフになってました。そろそろ脱皮ですかね!?結束の一本線よりはマシでしたが、勝敗ではブラジルW杯が惨敗だっただけにあまりよいイメージがない現代表ユニ。ピンクは止めて赤にしてェ~。イタリアやフランスのようにもっとシンプルなユニがいいですね。いつも奇をてらい過ぎです。今話題のエンブレム問題ではないですが、誰がデザインしているんですかね?この際公募にしてみたらどうでしょう!

そっかー、大阪からのサポ仲間は今日の「大阪880万人訓練」は受け取れないのかぁ~(独り言)