Windowsのhostsにワイルドカードを使いたい(proxy.pacの活用)


OpenShiftの試験中、例えば、「osakana.local」というADドメインに参加しているクライアント端末から、テスト環境「apps.osakana.local」に作ったOpenShift上に作ったサービスにアクセスしようとする。

このとき、ADドメインの方に「*.app.osakana.local A 192.168.12.132」といったような感じでDNSレコードが登録されていれば特に問題はない。

しかし、テスト段階では、DNS登録がされていない場合がある。その場合、c:\windows\system32\drivers\etc\hosts にエントリを書くという手段があるが、hostsファイルにはワイルドカード記述を書くことはできないので、いちいち列挙していく必要があるし、管理者権限が必要になる。

権限が低くても対処する方法があるのか確認してたところ、ブラウザのproxy設定で自動構成スクリプトproxy.pacを設定する、という適用しやすい手法があった。

まず、下記記述のproxy.pacファイルを作成する。

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*.app.osakana.local")) {
    return "PROXY 192.168.12.132";
  }
  return "DIRECT";
}

上記ファイルをproxy設定の「自動構成スクリプトを使用する」のアドレス欄で指定する。

Windows10の場合「file:///~」といった記述をしなくても、そのままのドライブパスで問題なかった。

php.iniを変更せずにdisable_functionsの内容を無効化してroundcubeのアップグレードスクリプトを動作させる方法



/etc/php.iniでdisable_functionsに「system」を含めている場合、roundcubeのアップグレードを行う時に「./bin/installto.sh /var/www/roundcube」を実行すると、エラーとなってしまう。

# ./bin/installto.sh /var/www/roundcubemail
Error 500: PHP system() function is required. Check disable_functions in php.ini.
#

この際、/etc/php.iniを変更するのではなく、一時的に回避するための手法。
「php -d disable_functions=”” ./bin/installto.sh /var/www/roundcubemail」と実行することで、disable_functionsの設定に関しては無視して実行することができる。

# php -d disable_functions="" ./bin/installto.sh /var/www/roundcubemail
<略>

ネットワーク上にあるhpサーバのiLO IPアドレスとライセンスを収集するスクリプト


2019/01/09 追記

オリジナルのNachoTech Blogがアクセスできなくなっていたので、「https://github.com/osakanataro/findilos」にオリジナルと後述の改変版をアップロードした。


hpサーバをリモートから制御するために使用するiLO。
稼働させたあとにIPアドレスを確認するのがめんどくさい。
そういう場合に、総当たりでiLOのIPアドレスを確認するスクリプトがあった。

NachoTech Blogの「How to find all the iLO’s on your network」にあるfindilosである。

早速ダウンロードして実行してみる。

[root@adserver ~]# ./findilos 172.17.17.0/24<br>
Scanning...</p>
<p>--------------- ------ -------- ------------ -------------------------<br>
iLO IP Address  iLO HW iLO FW   Server S/N   Server Model<br>
--------------- ------ -------- ------------ -------------------------<br>
172.17.17.xxx   N/A    1.26     CN71xxxMxx   ProLiant DL360 G7</p>
<p>1 iLOs found on network target 172.17.17.0/24</p>
<p>[root@adserver ~]#

iLO HWのモデル名は拾ってくれない。
blogのコメントを確認していくと、元のスクリプトはiLO-2までしか対応しておらず、その後のバージョンについてはコメント欄にある修正を実施すれば良いようだ。

また、iLO Advanceを買っている場合に、そのライセンスコードを表示するための案も提示されていた。
ただ、スクリプト例は汚い実装となっていて、せっかくの元スクリプトを活かしていない形だったので、元スクリプトの実装に従ってライセンスを表示するバージョンを作成した。

その実行例がこちら

[root@adserver ~]# ./findilos 172.17.17.0/24<br>
Scanning...</p>
<p>--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------<br>
iLO IP Address  iLO HW iLO FW   Server S/N   Server Model              iLO Edition          iLO Licence Key<br>
--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------<br>
172.17.17.xxx   iLO-3  1.26     CN71xxxMxx   ProLiant DL360 G7         iLO 3 Advanced       xxxxx-xxxxx-xxxxx-xxxxxx-xxxxx</p>
<p>1 iLOs found on network target 172.17.17.0/24</p>
<p>[root@adserver ~]#

スクリプトの修正例は以下

#!/bin/bash<br>
#<br>
# findilos - Search a local network segment for iLOs<br>
#            The iLO is the Integrated Lights-Out management processor<br>
#            used on HP ProLiant and BladeSystem servers<br>
#<br>
scriptversion="1.0"<br>
#<br>
# Author: iggy@nachotech.com<br>
#<br>
# Website: http://blog.nachotech.com<br>
#<br>
# Requires: tr sed expr curl nmap<br>
#<br>
# Tested with: Nmap 4.20, curl 7.17.1, RHEL4<br>
#<br>
# Note: Discovery of an iLO is dependent upon the Virtual Media port<br>
#       being set to the default of 17988.  If this has been changed<br>
#       by the iLO administrator, then this script will NOT find it.<br>
#<br>
#       Also, if the iLO XML Reply Data Return has been Disabled by<br>
#       the iLO administrator, this script will not be able to<br>
#       gather any information about the server.  It will still be<br>
#       discovered, but all you will see is its IP address.<br>
#</p>
<p># GLOBAL VARIABLES</p>
<p>scriptname="findilos"<br>
iloips="/tmp/tmpilos.$$"<br>
iloxml="/tmp/tmpiloxml.$$"<br>
ilohwvers="/tmp/tmpilohwvers.$$"</p>
<p>declare -i ilosfound=0</p>
<p># FUNCTIONS</p>
<p>function parseiloxml {<br>
  fgrep "$1" $iloxml &gt; /dev/null 2&gt;&amp;1<br>
  if [ $? -ne 0 ]<br>
  then<br>
    # tag not found in xml output, return empty string<br>
    parsedstring="N/A"<br>
  else<br>
    # tag was found - now we parse it from the output<br>
    tempstring=$( cat $iloxml | tr -d -c [:print:] | sed "s/^.*&lt;$1&gt;//" | sed "s/&lt;.$1.*//")<br>
    # trim off leading and trailing whitespace<br>
    parsedstring=`expr match "$tempstring" '[ \t]*\(.*[^ \t]\)[ \t]*$'`<br>
  fi<br>
}</p>
<p>function is_installed {<br>
  which $1 &gt; /dev/null 2&gt;&amp;1<br>
  if [ $? -ne 0 ]<br>
  then<br>
    printf "\nERROR: %s not installed.\n\n" $1<br>
    exit 255<br>
  fi<br>
}</p>
<p># MAIN</p>
<p># check for tools that we depend upon</p>
<p>is_installed tr<br>
is_installed sed<br>
is_installed expr<br>
is_installed curl<br>
is_installed nmap</p>
<p># check syntax - should have 1 and only 1 parameter on cmdline</p>
<p>if [ $# -ne 1 ]; then<br>
  printf "%s %s ( http://blog.nachotech.com/ )\n" $scriptname $scriptversion<br>
  printf "Usage: %s {target network specification}\n" $scriptname<br>
  printf "TARGET NETWORK SPECIFICATION:\n"<br>
  printf "  Can pass hostnames, IP addresses, networks, etc.\n"<br>
  printf "  Ex: server1.company.com, company.com/24, 192.168.0.1/16, 10.0.0-255.1-254\n"<br>
  printf "EXAMPLE:\n"<br>
  printf "  %s 16.32.64.0/22\n" $scriptname<br>
  exit 255<br>
fi</p>
<p>iprange=$1</p>
<p># prepare lookup file for iLO hardware versions</p>
<p>cat &gt; $ilohwvers &lt;&lt; EOF<br>
iLO-1 shows hw version ASIC:  2<br>
iLO-2 shows hw version ASIC:  7<br>
iLO-3 shows hw version ASIC: 8<br>
iLO-3 shows hw version ASIC: 9<br>
iLO-4 shows hw version ASIC: 12<br>
iLO-4 shows hw version ASIC: 16<br>
i-iLO shows hw version T0<br>
EOF</p>
<p>#<br>
# scan a range of IP addresses looking for an<br>
# open tcp port 17988 (the iLO virtual media port)<br>
#</p>
<p>printf "Scanning..."</p>
<p>nmap -n -P0 -sS -p 17988 -oG - $iprange | fgrep /open/ | awk '{print $2}' &gt; $iloips</p>
<p>printf "\n\n"</p>
<p>#<br>
# open and read the list of IP addresses one at a time<br>
#</p>
<p>exec 3&lt; $iloips</p>
<p>echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------"<br>
echo "iLO IP Address  iLO HW iLO FW   Server S/N   Server Model              iLO Edition          iLO Licence Key"<br>
echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------"</p>
<p>while read iloip &lt;&amp;3 ; do<br>
  ilosfound=$ilosfound+1<br>
  #<br>
  # attempt to read the xmldata from iLO, no password required<br>
  #<br>
  curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=All &gt; $iloxml</p>
<p>  #<br>
  # parse out the Server model (server product name)<br>
  # from the XML output<br>
  #</p>
<p>  parseiloxml SPN;  servermodel=$parsedstring<br>
  parseiloxml SBSN; sernum=$parsedstring<br>
  parseiloxml PN;   ilotype=$parsedstring<br>
  parseiloxml FWRI; ilofirmware=$parsedstring<br>
  parseiloxml HWRI; ilohardware=$parsedstring</p>
<p>  ilohwver=$(grep "$ilohardware" $ilohwvers|awk '{print $1}')<br>
  if [ "$ilohwver" == "" ]; then<br>
    ilohwver="N/A"<br>
  fi</p>
<p>  if [ "$sernum" == "" ]; then<br>
    sernum="N/A"<br>
  fi</p>
<p>  # add start<br>
  curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=CpqKey &gt; $iloxml<br>
  parseiloxml LNAME; ilomodel=$parsedstring<br>
  parseiloxml KEY; ilokey=$parsedstring<br>
  # add end</p>
<p>  printf "%-15s %-6s %-8s %-12s %-25s %-20s %-30s\n" $iloip "$ilohwver" "$ilofirmware" "$sernum" "$servermodel" "$ilomodel" "$ilokey"</p>
<p>done</p>
<p>printf "\n%d iLOs found on network target %s.\n\n" $ilosfound $iprange</p>
<p>rm -f $iloips $iloxml $ilohwvers</p>
<p>exit 0

Windowsバッチファイルでping応答の違いで動作をかえる



Windowsバッチファイルで、指定IPアドレスから応答がなくなったら次の作業を実施する、という処理をやりたかったので作った。

普通にping実行時のERRORLEVELを見ればいいか、と思っていたが、試験した環境では応答があってもなくてもERRORLEVEL0だったので判別ができなかった・・・
調べたところ「otnx.jpのコマンド別/ping」に調査した結果と回避方法があったのでそれを使った。

ちなみにotnx.jpではfindで「bytes=32」を引っかけていたが、日本語環境だと「 バイト数 =32」になってしまうが、バッチには書きたくなかったので、その後ろにある「ms TTL=」の方を引っかけるようにした。

・停止待ちバッチファイル
応答がなかったら終了。
応答があったら3回繰り返す

@echo off

set COUNT=0

:error
set /a COUNT=COUNT+1
echo %COUNT%
if "%COUNT%" == "3" goto errorout
ping -n 1 IPアドレス | find "ms TTL=" > NUL
if ERRORLEVEL 1 goto notrespond
timeout /t 5  > nul
goto error

:notrespond
echo host stopped
goto end

:errorout
echo host not stop

:end

・起動待ちバッチファイル
ping応答がなかったら3回繰り返してみる

@echo off

set COUNT=0

:error
set /a COUNT=COUNT+1
if "%COUNT%" == "3" goto errorout
ping -n 1 IPアドレス | find "ms TTL=" > NUL
if ERRORLEVEL 1 goto error

echo host working
goto end

:errorout
echo host not working

:end

IIJmioクーポンスイッチAPIを使って使用量グラフ作成



IIJmioクーポンスイッチAPI」というものが公開された。

AndroidアプリからこのAPIを使う、というのが想定されている使われ方だと思うんですが、違う使い方をしてみた。
というのは、「データ利用量照会」という機能を見つけ、これを利用すれば1年分のデータ使用量グラフが作れる、と思ったからです。

幸い、常時起動のサーバがあるので、そいつに仕込めばいいか、と、やってみました。

まずは、完成品をご覧ください。
test

現在SIMを4枚もっているので、こんなグラフになっています。
メインで使ってるのがSIM2、SIM4はSMS対応のものでテストに使用。
SIM3はうちの奥さんに渡しているもの、SIM1は実家においてあるルータ、という感じです。

さて、このグラフ作るまでに行ったことですが、まず最初はアクセストークン取得です。
いろいろ悩んだんですが、適当な手法をとっています。

まず、redirect_uriとして適当なCGIを作りました。

#!/usr/bin/perl
print "Content-Type: text/plain; charset=UTF-8\n\n";
print "test\n";

えぇ、適当過ぎますね。

そして、普通のHTMLを作ります。

<html>
<head>
<title>iijmio</title>
</head>
<body>

<a href="https://api.iijmio.jp/mobile/d/v1/authorization/?response_type=token&client_id=<DeveloperID>&state=test&redirect_uri=http%3A%2F%2F~.osakana.net%2Ftest.cgi">go to IIJMIO</a>

</body>
</html>

redirect_uriには、先ほど作成した適当なCGIのアドレスを記載します。

ブラウザで作成したhtmlにアクセスし、IIJmioの認証を行い、正常に通ると、redirect_uriに指定したURLに対して、戻ってきます。
ブラウザのURL欄に表示された文字列から「access_token=~」という記述を見つけ、アクセストークンを取得します。
ちなみに、このアクセストークン、7776000秒有効です。つまり90日間です。
IIJmio側に30日分のデータが保管されているので120日以内に1回手動で更新すればいいか、と考え、テキトーな実装になっています。

次に、利用量取得のperlスクリプト作成。

#!/usr/bin/perl
use strict;
use warnings;
use LWP;
use URI::Escape;
use JSON;
use Time::Local;

my $lwpua = LWP::UserAgent->new;

my $url="https://api.iijmio.jp/mobile/d/v1/log/packet/";

my $developerid="<DeveloperID>";
my $usertoken  ="<アクセストークン>";

my $lwpreq = HTTP::Request->new(GET => "$url");
$lwpreq->header("X-IIJmio-Developer" => "$developerid");
$lwpreq->header("X-IIJmio-Authorization" => "$usertoken");
my $lwpres= $lwpua->request($lwpreq);
my $data = decode_json($lwpres->content);

for(my $i=0;$i<@{$data->{packetLogInfo}};$i++){
        #print $i . ":" . $data->{packetLogInfo}->[$i]->{hddServiceCode} ."\n";
        my $hddServiceCode=$data->{packetLogInfo}->[$i]->{hddServiceCode};

        for(my $j=0;$j<@{$data->{packetLogInfo}->[$i]->{hdoInfo}};$j++){
                #print $i . "-" . $j . ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode} . "\n";
                my $hdoServiceCode=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode};
                if(! -f "$hdoServiceCode.rrd"){
                      print "rrdtool create $hdoServiceCode.rrd --start 1384786740 --step 86400 DS:withCoupon:GAUGE:86400:0:U DS:withoutCoupon:GAUGE:86400:0:U RRA:LAST:0.5:1:100000 \n";
                      system("rrdtool create $hdoServiceCode.rrd --start 1384786740 --step 86400 DS:withCoupon:GAUGE:86400:0:U DS:withoutCoupon:GAUGE:86400:0:U RRA:LAST:0.5:1:100000");

                }

                for(my $k=0;$k<@{$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}};$k++){
                      #print "   " . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date} ;
                      #print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon} ;
                      #print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon} ;
                      #print "\n";
                      my $d=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date};
                      my $year = substr($d,0,4);
                      my $mon  = substr($d,4,2) - 1;
                      my $mday = substr($d,6,2);
                      my $unixtime = timelocal(0,59,23,$mday,$mon,$year);
                      my $withCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon};
                      my $withoutCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon};
                      print "rrdtool update $hdoServiceCode.rrd $unixtime:$withCoupon:$withoutCoupon \n";
                      system("rrdtool update $hdoServiceCode.rrd $unixtime:$withCoupon:$withoutCoupon");
                }
        }
}

これを「get.pl」というファイル名で保存します。
実行すると、「hdo810xxxxx.rrd」というような感じのファイルがSIMカード分作成されます。
なお、手抜きをしているので、2回目以降は、同じ値を入力しようとし、「ERROR: hdo8371xxxx.rrd: illegal attempt to update using time 1387378740 when last update time is 1387378740 (minimum one second step)」みたいなエラーがでてしまいますが、仕様です。
また、rrdtoolは一度登録した情報の更新ができない構造をしているので、日付が変わる直前に実行することを推奨します。

で・・・グラフ作成は以下の様な感じで、情報取得と連続で行わせています。
現在SIMが4枚あるので、4枚分を集計しています。
クーポン使用の有無は区別せず合算としています。

#!/bin/bash
cd /home/~/mio
./get.pl
rrdtool graph iijmio-use.png --imgformat=PNG --end now --start end-1months \
--vertical-label "MB" \
--title="IIJmioの使用量" \
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
CDEF:SIM1=SIM1C,SIM1N,+ \
CDEF:SIM2=SIM2C,SIM2N,+ \
CDEF:SIM3=SIM3C,SIM3N,+ \
CDEF:SIM4=SIM4C,SIM4N,+ \
LINE1:SIM1#0000FF:"SIM1" \
LINE2:SIM2#00FFFF:"SIM2" \
LINE3:SIM3#00FF00:"SIM3" \
LINE4:SIM4#F00F00:"SIM4"

で、これをサーバのcrontabに突っ込んで、23:58に実行する設定しました。
さて、これでちゃんと更新し続けてくれるといいのですが・・・


APIが公開されて速攻作成&記事公開したところ、IIJmioの人に発見された模様。


2013/12/24追記

しばらく運用してみた結果、見にくかったので、グラフ作成については、以下の様に変更した。

rrdtool graph iijmio-use.png --imgformat=PNG \
--height=300 \
--lower-limit=0 \
--end now --start end-1months \
--vertical-label "MB" \
--title="IIJmioの使用量" \
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
CDEF:SIM1=SIM1C,SIM1N,+ \
CDEF:SIM2=SIM2C,SIM2N,+ \
CDEF:SIM3=SIM3C,SIM3N,+ \
CDEF:SIM4=SIM4C,SIM4N,+ \
LINE2:SIM1#0000FF:"SIM1" \
LINE2:SIM2#00FFFF:"SIM2" \
LINE2:SIM3#00FF00:"SIM3" \
LINE2:SIM4#F00F00:"SIM4"

iijmio2

「LINE数字:~」の数字部分の意味を取り違えていたという・・・太さの意味だったか・・・


2014/12/19追記

作ってから約1年が経過しました。
最近はこんなグラフにしています。(横軸のめもりを日付にした)

rrdtool graph iijmio-use.png --imgformat=PNG \
--height=300 \
--lower-limit=0 \
--end now --start end-2months \
--vertical-label "MB" \
--x-grid DAY:1:WEEK:1:WEEK:1:0:%m/%d \
--title="IIJmioの使用量" \
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
CDEF:SIM1=SIM1C,SIM1N,+ \
CDEF:SIM2=SIM2C,SIM2N,+ \
CDEF:SIM3=SIM3C,SIM3N,+ \
CDEF:SIM4=SIM4C,SIM4N,+ \
LINE2:SIM1#0000FF:"SIM1" \
LINE2:SIM2#00FFFF:"SIM2" \
LINE2:SIM3#00FF00:"SIM3" \
LINE2:SIM4#F00F00:"SIM4"

mio-20141219

そして、1年分

rrdtool graph iijmio-use-year.png --imgformat=PNG \
--height=300 \
--width=600 \
--lower-limit=0 \
--end now --start end-14months \
--vertical-label "MB" \
--x-grid WEEK:1:MONTH:1:MONTH:1:0:%m/%d \
--title="IIJmioの1年分使用量" \
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
CDEF:SIM1=SIM1C,SIM1N,+ \
CDEF:SIM2=SIM2C,SIM2N,+ \
CDEF:SIM3=SIM3C,SIM3N,+ \
CDEF:SIM4=SIM4C,SIM4N,+ \
LINE2:SIM1#0000FF:"SIM1" \
LINE2:SIM2#00FFFF:"SIM2" \
LINE2:SIM3#00FF00:"SIM3" \
LINE2:SIM4#F00F00:"SIM4"

test-year-20141219

おまけ:上記のグラフの利用率変動の解説。

SIM1はミニマムスタートプラン、SIM2/3/4はファミリーシェアプランで、SIM3はmicroSIM、SIM4はnanoSIM/SMS付。

・2013/12頃
 メイン機CP-D02:SIM2
 偽iPhone5s(Thunderbird i5s):SIM4
 奥さんのP-01D:SIM3
 奥さん実家の緊急用ルータ:SIM1
・2014/01頃
 ほとんど使用されていないSIM1の容量がもったいないので入れ替え
 メイン機CP-D02:SIM2→SIM1
 奥さん実家の緊急用ルータ:SIM1→SIM2
 偽iPhone5s(Thunderbird i5s):SIM4
 奥さんのP-01D:SIM3
・2014/02頃の変更点
 Thunderbid i5sの液晶を割ったので余ったSMS付SIM4をメイン機へ 
 メイン機CP-D02:SIM1→SIM4
 奥さん実家の緊急用ルータ:SIM2
 奥さんのP-01D:SIM3
・2014/03頃の変更点
 Covia CP-F03aが来たのでがんばって使用開始。
 それに伴い余剰になったCovia CP-D02を奥さんのに充当
 メイン機CP-F03a:SIM4 & SIM1
 奥さん実家の緊急用ルータ:SIM2
 奥さんのCP-D02:SIM3
・2014/06頃の変更点
 JIAYU F1購入。使い勝手が良かったので、メイン機に変更。
 メイン機JIAYU F1:SIM4
 予備機CP-F03a:SIM1
 奥さん実家の緊急用ルータ:SIM2
 奥さんのCP-D02:SIM3

・2014/11頃の変更点
 GMOBBのWiMAXを使い始めたのでメイン機SIM4の使用量低下

・2014/12頃の変更点
 自宅のフレッツが微妙に不安定なことが多いので、奥さんCP-D02のWiFiをオフにしてみた。