Apple iPhone SE は個人輸入のほうがお得!?

iPhone4s を個人輸入してはや4年超。片手操作ができないスマホはスマホじゃないと思っているだけに(汗)、4インチの新 iPhone を大いに期待していたのですが、ボディは iPhone5s の使いまわしで、主に CPU/GPU とカメラをアップグレードしただけというなんともがっかりな仕様でした。これでは Intel PC の悪徳ビジネスモデルと全く同じ。まあキャリア向けに iPhone5s からの機種変2年縛り用の玉と言ったところでしょうね。この時期というタイミングも特異ですし。また名前もその昔 iPhone4S を iPhone4s の小文字に変更したのにも関わらず「SE」は大文字に逆戻りですね。

個人的には iPod Touch(6世代)のボディに 3G/LTE を追加かなーと思っていただけにデザインの新鮮味に欠け、Apple らしくない。まあ iPhone7 で4インチがローンチされない可能性のほうが高い気がしますので、このタイミングでリプレースもアリかもしれませんが、ここで
iPhone5s を $249 とか廃価で売ってくれたらそちらのほうが断然うれしいです(笑)

各国の SIM-free iPhone SE 価格は?

各国の iPhone SE の価格はというと、US だけかなりお得ですね。個人輸入時の送料手数料を入れると微妙なところですが、日本はこの価格に消費税がかかりますので、Tax free なオレゴン経由なら個人輸入もありかもですね。

2016/04/22
日本の価格が値下げされました。”個人輸入”の観点からすると、もはや価格的な魅力はあまりないのかなと。あとはシャッター消音にその対価を払うかどうかだと思います。またはオレゴンの Apple Store とかマカオ(未確)での現地調達ならって感じですかね。

2016/09/09
iPhone 7/7Plus 発表に合わせ、各国の iPhone SE も価格改定されました。64GB モデルの値下がりが大きいです。特に日本の 64GB の値下がり幅が1万円(16.72% OFF)と大きく¥49,800円。ほぼバーゲン価格ではないでしょうか。円高(¥109円→¥102円)も影響しているのでしょうかね。詳しい値下げ率はこちら

■ SIM-free iPhone SE 価格
16GB 64GB AppleCare+ レート*
現地通貨 円換算 現地通貨 円換算 現地通貨 円換算
*実際に個人輸入しますとレートにクレカ為替事務手数料(VISA/MASTER:1.63%)や諸税などがプラスされると思います。

US の SIM-free iPhone SE のモデルは A1662 or A1723 ?

以下がモデル別対応国表です。
http://www.apple.com/iphone/LTE/#iphone-se

US 購入サイトをよく見ますと Learn more about the SIM-free iPhone という SIM-free に関する詳細説明のリンクがあります。
[cc nowrap=”0″] so you can get a nano-SIM from any supported carrier, such as AT&T, T-Mobile, and Verizon in the United States. The SIM-free iPhone SE is not compatible with Sprint’s network.[/cc] AT&T, T-Mobile, and Verizon は OK で Sprint は NG。製品番号も US と US 以外とで型式が違いますので、SIM-free な iPhone SE は US は A1662 で US 以外は A1723 のようですね。これなら大人しく日本で購入したほうがよさそうかなと。ただシャッター音の無音ができなくなってしまうのはなんとも。

16GB 64GB
Silver Gold Space
Gray
Rose
Gold
Silver Gold Space
Gray
Rose
Gold
日本 MLLP2J/A MLXM2J/A MLLN2J/A MLXN2J/A MLM72J/A MLXP2J/A MLM62J/A MLXQ2J/A
アメリカ MLLX2LL/A MLY12LL/A MLLW2LL/A MLY22LL/A MLME2LL/A MLY32LL/A MLMD2LL/A MLY42LL/A
カナダ MLLP2VC/A MLXM2VC/A MLLN2VC/A MLXN2VC/A MLM72VC/A MLXP2VC/A MLM62VC/A MLXQ2VC/A
イギリス MLLP2B/A MLXM2B/A MLLN2B/A MLXN2B/A MLM72B/A MLXP2B/A MLM62B/A MLXQ2B/A
ドイツ MLLP2DN/A MLXM2DN/A MLLN2DN/A MLXN2DN/A MLM72DN/A MLXP2DN/A MLM62DN/A MLXQ2DN/A
フランス MLLP2F/A MLXM2F/A MLLN2F/A MLXN2F/A MLM72F/A MLXP2F/A MLM62F/A MLXQ2F/A
オーストラリア MLLP2X/A MLXM2X/A MLLN2X/A MLXN2X/A MLM72X/A MLXP2X/A MLM62X/A MLXQ2X/A
中国 MLLP2CH/A MLXM2CH/A MLLN2CH/A MLXN2CH/A MLM72CH/A MLXP2CH/A MLM62CH/A MLXQ2CH/A
香港 MLLP2ZP/A MLXM2ZP/A MLLN2ZP/A MLXN2ZP/A MLM72ZP/A MLXP2ZP/A MLM62ZP/A MLXQ2ZP/A
■ iPhone SE モデル
モデル番号 キャリア 情報・備考
A1662 アメリカ SIM-free ツイート(実機確認済)
AT&T FAQ
T-Mobile FAQ
Verizon FAQ
A1723 (CDMA) 日本 SIM-free
アメリカ Sprint FAQ
中国 SIM-free ツイート(実機未確認)
マカオ SIM-free ツイート(実機未確認)
A1723 (GSM) 香港 SIM-free ツイート(実機確認済)
欧州、他? SIM-free? ツイート(実機未確認)

A1662 は日本で使える?周波数帯は?

A1662 と A1723 とで、こと日本においてはサポートする通信方式(周波数バンド)に iPhone5s ほどの違いがなさそうですし、 A1662 は A1723 のような GSM/CDMA 2モデルではなくCDMA のみのはずなので、キャリアが MVNO(docomo) なら A1662 でも問題なさそうな気がします。
[cc nowrap=”0″] A SIM-free, unlocked iPhone SE may be activated on supported GSM and CDMA carrier networks.[/cc] 違いは Band28 と Band41(WiMAX2+,AXGP) の有無ですかね。あとは技適マークの有無(未確)かなと。 技適の有無は重要なのでもう少し情報を待ちましょうかね。(2016/03/31)

■ iPhone SE キャリア別 SIM-free 周波数帯一覧
3G/LTE Band iPhone SE キャリア
A1662 A1723
(CDMA)
docomo au SoftBank
LTE 1 (2100 MHz)
2 (1900 MHz)
3 (1800 MHz)
4 (AWS)
5 (850 MHz)
7 (2600 MHz)
8 (900 MHz)
12 (700 MHz)
13 (700c MHz)
17 (700b MHz)
18 (800 MHz)
19 (800 MHz)
20 (800 DD)
25 (1900 MHz)
26 (800 MHz)
28 (700 APT MHz)
29 (700 de MHz)
38 (TD 2600)
39 (TD 1900)
40 (TD 2300)
41 (TD 2500)
WiMAX2+

AXGP
3G VI/XIX (800 MHz)
VIII (900 MHz)
XI (1500 MHz)
IX (1700 MHz)
I (2000 MHz)
*au 周波数帯一覧の 3G は「W-CDMA」になっていますので、サポート外は当然ですが CDMA2000 はサポート外なのでしょうか? mineo の iPhone SE の対応状況をみますと CDMA2000 も VoLTE も動作 OK のようです。

2016/04/01 追記

US でも販売が開始され、 早速購入された J (@j17sf)さんのツイートA1662は技適マーク無と判明しました。 J (@j17sf)さん、情報ありがとうございます(感謝)。やはり、です(トホホ)


2016/04/03 追記

US 購入サイトの下段の FAQ に SIM-free は「Model A1662」と記載されています。
また FAQ に Sprint で一括購入すれば unlocked であると記載されています。マジか!!(驚) Sprint iPhone SE は A1723(CDMA)。SIMロックも緩くなってきましたね。しかし Sprint iPhone SE って個人輸入できるんでしょうか?
  • SIM-free” mean?
    “SIM-free” means your iPhone doesn’t ship with a carrier SIM card. The SIM-free iPhone sold on apple.com and at the Apple Store is unlocked. That means you’re free to use a SIM card from a supported carrier. For iPhone SE, supported carriers include AT&T, Verizon, and T-Mobile, among others. iPhone SE does not support Sprint. If you wish to use iPhone SE with Sprint or a Sprint-supported carrier, choose Sprint as your carrier when you purchase iPhone SE. When the Sprint model is purchased at full price, it is unlocked.
香港はというと A1723 確定なので、あとは CDMA かどうかなのですが、購入サイトの下段の FAQ に 「on networks using GSM around the world」とだけあります。CDMA は?。設定に MEID 項目があったとしてもCDMA 非サポートってこともあるそうで。ただ MVNO(docomo) 使いなら CDMA(EV-DO Rev. A) にこだわる必要もないかもですね。
  • Can I use my iPhone outside my home country?
    Yes. iPhone is enabled to work on networks using GSM around the world. Because the iPhone sold by apple.com is unlocked, you can purchase a SIM card and service from a local carrier at your destination. Or check with your home carrier regarding international roaming charges.

2016/04/21 追記

香港版 A1723 は GSM とのことです。aki(@aki0094)さん、情報ありがとうございます。


2016/04/22 追記

日本の iPhone SE の価格改定がありました。値下げは 2016/04/22 18:00 時点で日本のみのようです($1=¥109.45円)。またタイ、マレーシアの価格が決定しています。
16GB:¥52,800円 ($1=¥132.33円換算) → ¥47,800円 ($1=¥119.80円換算)
64GB:¥64,800円 ($1=¥129.86円換算) → ¥59,800円 ($1=¥119.84円換算)
マカオ版が A1723(CDMA) という情報があります。yoshi (@yoshiqwe)さん、情報ありがとうございます。なお、実機では未確認です。


2016/09/09 追記

16GB 64GB
2016/04/22 2016/09/09 discount 2016/04/22 2016/09/09 discount
日本 ¥47,800 ¥44,800 -6.28% ¥59,800 ¥49,800 -16.72%
アメリカ $399 $399 0.00% $499 $449 -10.02%
カナダ $579 $579 0.00% $709 $629 -11.28%
イギリス £359 £379 +5.57% £439 £429 -2.28%
ドイツ €489 €489 0.00% €589 €539 -8.49%
フランス €489 €489 0.00% €589 €549 -6.79%
オーストラリア A$679 A$679 0.00% A$829 A$749 -9.65%
中国 RMB3,288 3288 0.00% RMB4,088 RMB3,788 -7.34%
香港 HK$3,488 HK$3,488 0.00% HK$4,288 HK$3,888 -9.33%
タイ ฿16,800 ฿16,800 0.00% ฿20,800 ฿18,800 -9.62%
マレーシア RM1,949 RM1,949 0.00% RM2,449 RM2,199 -10.21%

なでしこJ、リオ五輪出場ほぼ絶望

初戦のオージー戦、大儀見の初得点のシーン。ゴール直後なぜ自らボールを取りに行かなかったのか!?(ボールを取りに行ったのは横山)
大儀見を責めるわけではありませんが、前半47分とはいえ、まだ1-2のビハインドであっただけに違和感を覚えた瞬間でした。結果的にそれがすべてを物語っているとも。。。。

アメリカは元より、オーストラリア、ニュージーランド、ドイツ、イングランド・・・フィジカル+”足元”が付いてくると、、、2013年東アジアカップ当時から思っていたことなのですが。。。
女子サッカーの「標準化」そのものです(女子サッカーが面白くなってきた証拠ではありますが)。

男子もそうですが、「パス&トラップの精度」これに尽きますね。前を向いて怯まないメンタル。1対1での自信、個の強さ。

エディー・ジャパン並みのハードワークがこれから必要なのかもしれません。

WordPress Download Manager プラグイン 2.8.4 更新で画面が真っ白

先般、WordPress 4.3 アップデートで画面が真っ白 WP-Ban プラグインには要注意!という記事を書きましたが、またしても WordPress Download Manager を 2.8.3 から 2.8.4(2.8.5~2.8.6 も同様で以降 2.8.4) へアップデートすると、PHP 本体のバージョンにより画面が真っ白になります。また WordPress 4.3 以降の場合は有効化しようとするとエラーとなり有効化できません。

WordPress Download Manager は 2.8.3 から 2.8.4 でリビジョン的にはマイナーアップデートなのですが、ざっと斜め読みするとかなりのリファクタリング(内部構造の改善)がなされているようで、ある意味別もの、メジャーアップデートに近い気がします。

原因

エラー

[cc] Parse error: syntax error, unexpected T_STRING in /wp-content/plugins/download-manager/download-manager.php on line 11
[/cc]
そこで、Download Manager 2.8.4 の download-manager.php を見ますと11行目は namespace。単にPHP が 名前空間(namespace) を認識しないということです。名前空間がサポートされたのは、PHP 5 >= 5.3.0, PHP 7 以降ですから PHP のバージョンが 5.3.0 以前の場合は名前空間を識別できず、単純に TYPO(シンタックスエラー)となります。
まあマイナーアップデートでよくもこんな英断?をしますね、作者さん。ちょうど PostgreSQL 7.2 ⇒ 7.3 ぐらいのインパクトか! ってわかりずらいですね(汗)いずれにしてもチャレンジャーです。
Download Manager
バージョン 2.8.3 2.8.4
PHP名前空間
(namespace)
PHP 5 < 5.3.0 WP < 4.3 正常 真っ白画面
WP >= 4.3 正常 有効化不可
PHP 5 >= 5.3.0, PHP 7 正常 正常
<?php
/*
Plugin Name: Download Manager
Plugin URI: http://www.wpdownloadmanager.com/purchases/
Description: Manage, Protect and Track File Downloads from your WordPress site
Author: Shaon
Version: 2.8.4
Author URI: http://www.wpdownloadmanager.com/
*/

namespace WPDM;


if(!isset($_SESSION))
@session_start();

......................

対応策

対応策は WP-BAN の時と同様、Download Manager 2.8.4 のプラグインを削除もしくはリネームし、 2.8.3 にダウンデートすることになるかと思います。
ただこの Download Manager プラグインは以前にもアップデートでダウンロード対象ファイルがすべて消失するという大失態をやらかしているようですし、アップデートロジックを読み切れていないため、今回は削除ではなく、2.8.4 をリネーム(バックアップ)し、2.8.3 へダウンデート後、問題がなければ削除する方針にします。

事前準備

  1. download-manager.2.8.3.zip ファイルのダウンロード
    事前準備として、以下のダウンデート対象となる download-manager.2.8.3.zip ファイルをダウンロードしておきます。

  2. WordPress 非依存ツールの用意
    WordPress 4.3 未満で Download Manager 2.8.4 アップデートしてしまった場合は真っ白画面になり、ダッシュボードなどの管理画面すらアクセスできません。またWordPress 4.3 以降も download-manager ディレクトリのリネームを行うため、別途 FTP, SFTP, SSH やファイルマネージャーなどの WordPress 非依存のツールが必要になります。

Download Manager 2.8.3 へダウンデート

  1. Download Manager 2.8.4 の download-manager ディレクトリのリネームしバックアップ
    FTP, SFTP, SSH やファイルマネージャーなどの WordPress 非依存のツールを使い、プラグインのディレクトリ(/wp-content/plugins/)に入り download-manager ディレクトリを適宜 download-manager.2.8.4 などの名前にリネームしバックアップします。これで真っ白画面は解消されます。
    [cc] /download-manager ⇒ /download-manager.2.8.4[/cc]
  2. Download Manager 2.8.3 ファイルのアップロード
    先ほどダウンロードしておいた download-manager.2.8.3.zip ファイルを解凍し Download Manager 2.8.3 内の download-manager フォルダをすべてアップロードし手動でインストールするか、もしくはダッシュボードのプラグインから新規追加で「プラグインのアップロード」にて、ダウンロードした download-manager.2.8.3.zip ファイルを選択しインストールします。

  3. Download Manager 2.8.3 の有効化
    ダッシュボードのプラグイン一覧に Download Manager のバーションが 2.8.3 と 2.8.4 の2つ表示されますが、そのうち 2.8.3 のほうを有効化します。

  4. Download Manager 2.8.4 プラグインの削除
    最後に特に動作に問題がなければ、ダッシュボードのプラグイン一覧からバーションが 2.8.4 の Download Manager を削除します。すると 1.でリネームした download-manager.2.8.4 ディレクトリが削除されます。

以上でダウンデートの完了です。バックアップが不要であれば、download-manager ディレクトリを削除後、2.8.3 のアップロードでも構いません。

ドコモから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 で扱う場合、どのようにすればよいか少々戸惑いました。これはまた別記事にしたいと思います。