Quantcast
Channel: 仙石浩明の日記
Viewing all 47 articles
Browse latest View live

OpenVZ な ServersMan@VPS で独自 OS を動かしてみた

$
0
0

国内に (自宅以外で) IPv6 が使えるサーバが欲しかったので、 ServersMan@VPS を使ってみた。 ServersMan@VPS は仮想化プラットフォームが OpenVZ なので今まで敬遠していたのだが、 Osukini サーバ (Xen) も、 さくらの VPS (KVM) も、 いまのところネイティブな IPv6 はサポートしていない (さくらの IPv6 は 6rd) ので、 やむなく契約してみた次第。

Xen や KVM などの完全仮想化と異なり、 OpenVZ はホストOS のカーネルがゲスト OS のカーネルとしても使われる。 つまり VPS (Virtual Private Server) サービスのユーザが別のカーネルを立ち上げることができない (ServersMan@VPS Perfect は完全仮想化だが月額 3150円と高いのでここでは考えない)。 OS は CentOS, Debian, ubuntu から選ぶことになる。

しかしながら、 私が個人的に管理しているサーバは、 全て OS を独自の 「my distribution」 (便宜上ここでは GCD OS と呼ぶ) に統一していて、 全サーバでディスクの内容を同期させている。 つまりある特定のサーバ固有の設定情報も、 全サーバが共有している。 共有していないのは各サーバのホスト名と、 秘密鍵などごく一部の情報だけ。 だからサーバが壊れた場合も、 新しいマシンを用意して他のサーバからディスク内容を丸ごとコピーするだけで済む。

私個人で管理しているサーバ (もちろん会社で運用しているサーバは除く) は、 仮想環境も含めると 20台ほどになるので、 異なる OS はできれば管理したくない。 ServersMan@VPS で提供されるカーネルを使うのは (OpenVZ の仕組み上) 仕方がないとして、 ディスクの内容は GCD OS と入れ替えることにした。

稼働中のサーバをいじるとき重要なのが、 トラブった時に 「元に戻せるか?」 ということ。 元に戻せるなら多少の失敗を恐れることはない。 ほとんどの VPS サービスは、 最悪の事態に陥っても初期化すれば元通りになるので、 操作をミスっても一からやり直せばいいのだが、 OS を入れ替えようとする場合は (当然) 新しい OS 一式を送り込む必要があり、 初期化するとこれが消えてしまうので再度転送する羽目になる。 GCD OS は最小セットで 7GB 近くあるので、 何度も転送を繰り返したりすると VPS サービスの契約ネットワーク帯域を使いきってしまう。

幸い、 ServersMan@VPS に帯域制限は無いが、 一日に 何十GB も転送していたら、 きっと管理者に睨まれるはず。 そこで、 どんなに失敗しても、 再起動すれば ssh でログインできる状態に戻るような OS 入れ替え手順を考えてみた。 ssh でログインできさえすれば後は何とでも修復できる。 逆に言うと ServersMan@VPS のようなコンソールが提供されない VPS サービスでは ssh でログインできなくなると万事休す、 残された復旧手段は初期化しかない。

まず ServersMan@VPS Standard プランを契約 (月額 980円) して、 Ubuntu(64bit) の最小構成 (シンプルセット) を選択。 ssh でログインして netstat でソケットを開いているデーモンを調べ、 片っ端から dpkg --purge (アンインストール) する。 もちろん sshd (ssh サーバ) だけは purge してはいけない。 syslog や cron などフツーは決して purge しないデーモンも遠慮無く purge する。 ps したとき sshd のプロセスのみが表示されるような状態になるまで purge しまくる。 で、 一通り purge し終わったら念のため再起動してみる。 もしここで ssh でログインできなくなってしまっていたら、 初期化して振出しに戻る。

この時、 sshd が 22番ポートで listen している場合は、 GCD OS が起動する sshd と衝突するので、 22番ポート以外に変えておく。 幸い ServersMan@VPS の場合は sshd が初めから 3843番ポートで listen する設定になっていた (なぜ?) ので、 そのままにしておく。

次に、 デーモン類以外のパッケージも、 残しておくとディスクの肥やしになるだけなので、 できるだけ purge する。 とはいっても、 多くのパッケージが数MB 以下で容量的には誤差の範囲なので、 無理に purge して再起不能状態に陥るリスクを冒すより、 ディスクの肥やしにしておいた方がマシ。 で、 一通り purge し終わったら念のため再起動してみる。 もしここで ssh でログインできなかったら、 初期化して振出しに戻る。

こうして netstat -nap しても ps axf しても sshd 以外のプロセスが一切残っていない状態になったら、 いよいよ GCD OS 一式を送り込む。

senri:/ # mirror -v -r /usr/local/gcd -e 'ssh -p 3843' 'core64[183.181.54.38]' > /tmp/serversman &

mirror というのはサーバ間で GCD OS の同期を行なうためのスクリプト。 64bit (x86_64) の最小セットをコピーするために引数として 「core64」 を指定した。 このスクリプトは、 同期すべきファイルのリストを作成して rsync を呼び出す。 「-e 'ssh -p 3843'」 オプションは、 そのまま rsync に渡される。 このコマンド列で GCD OS 最小セット約 7GB が VPS の /usr/local/gcd ディレクトリ以下へ丸ごとコピーされる。 7GB の転送にどのくらいかかるかと思っていたら、 わずか 10分弱で終わってしまった。 100Mbps 以上の帯域ということになる。 結構すごい。

ホスト名を chiyoda.gcd.org に設定し、 このサーバ専用の秘密鍵を作成すれば GCD OS のインストールが完了。 あとは、 /usr/local/gcd 以下へ chroot して GCD OS を起動するだけ。 次のような GCD OS 起動スクリプト /etc/init.d/chroot を書いてみた。

#!/bin/sh
root=`echo $0 | sed -e 's@/etc/init.d/chroot$@@'`
if [ ! -d $root ]; then
   echo "Can't find root: $root"
   exit 1
fi
mount -obind /lib/modules $root/boot/lib/modules
chroot $root sh <<EOF
mount -a
svscanboot &
/etc/rc.d/rc.M
EOF

このスクリプトも GCD OS 一式をコピーするときに /usr/local/gcd/etc/init.d/chroot へコピーされる。 で、/usr/local/gcd/etc/init.d/chroot を、 とりあえず手動で実行。 手動で実行するところがミソで、 もしこのスクリプトにバグがあって異常事態に陥っても、 再起動すれば元に戻る。

上記 /usr/local/gcd/etc/init.d/chroot は、 chroot /usr/local/gcd sh を実行して、 chroot 環境下で svscanboot と /etc/rc.d/rc.M を実行する。 svscanboot は daemontools の起動スクリプト。 GCD OS のほとんどのデーモン類は daemontools の管理下で起動される。 一方 /etc/rc.d/rc.M は、 GCD OS のブートスクリプトで、 ファイアウォールなどネットワークまわりの設定や、 個々のサーバ特有の設定、 および一部のデーモン類の起動を行なう。

普通の Linux OS だと init から直接起動されるデーモンもあるが、 GCD OS の場合 init が起動するのは /etc/rc.d/rc.S と /etc/rc.d/rc.M および svscanboot だけ。 /etc/rc.d/rc.S は、 OpenVZ 環境下では不要な処理ばかりなので実行する必要はない。

こうして chroot 環境下で GCD OS が起動したら、 chroot /usr/local/gcd sh などと実行して GCD OS 環境へ入ることができる。 各種設定が正しく機能しているか、 デーモン類が正しく動いているか確認する。

ServersMan@VPS で使われているカーネルが、 2.6.18-194.3.1.el5.028stab069.6 と、 かなり古い (2.6.18 などという 5年も昔のカーネルを使い続けないでほしい > RHEL) ので、 GCD OS をきちんと動かすには問題があった。 特に困ったのが、 iptables の owner モジュールが使えない点:

chiyoda:/ # uname -rv
2.6.18-194.3.1.el5.028stab069.6 #1 SMP Wed May 26 18:31:05 MSD 2010
chiyoda:/ # iptables -t nat -j REDIRECT -p udp --dport 53 --to-port 2053 -A dnscache.lo -s 127.0.0.1 -d 127.0.0.1 -m owner ! --uid-owner Gdnscache
iptables: No chain/target/match by that name.

このエラーは、 カーネルに CONFIG_NETFILTER_XT_MATCH_OWNER の設定がないのが原因。 NETFILTER_XT_MATCH_OWNER が導入されたのは 2.6.25 以降なので、 そもそも元から 2.6.18 には存在しない。

なぜ --uid-owner が必要かと言えば、 GCD OS では tinydns と dnscache を、 同じ IP アドレスで動かすことが基本になっているから。 つまり、 通常の名前解決に 127.0.0.1 の dnscache を利用するのだが、 dnscache (Gdnscache 権限で動作) が 127.0.0.1 に問合わせる時に限り mydns が返事をするようにしたい。

仕方がないので、 iptables に --uid-owner を指定してエラーになる場合は、 --uid-owner 抜きで iptables を再実行するように修正した:

nsredirect="-t nat -j REDIRECT --dport 53 --to-port $PORT"
chain=dnscache.lo
iptables -t nat -N $chain 2>/dev/null || iptables -t nat -F $chain
nsinner="$nsredirect -A $chain -s 127.0.0.1 -d 127.0.0.1 \
	-m owner ! --uid-owner Gdnscache"
iptables -p udp $nsinner
if [ $? -ne 0 ]; then
    nsinner="$nsredirect -A $chain -s 127.0.0.1 -d 127.0.0.1"
    iptables -p udp $nsinner
fi
iptables -p tcp $nsinner

このような修正を、 chiyoda.gcd.org だけでなく、 GCD OS をインストールしている全サーバで一斉に行なう点がミソ。 サーバごとにファイルの内容が微妙に異なっていたりしたら、 GCD OS を使う意味がない。

当然、 --uid-owner 抜きで iptables を実行した場合は、 dnscache が 127.0.0.1 の mydns に問合わせをすることができないが、 127.0.0.1 以外、 つまり 183.181.54.38 あるいは 2001:2e8:634:0:2:1:0:2a ならば mydns に問合わせることができるので問題無い。

じゃ、 なんのために、 わざわざ --uid-owner を使って 127.0.0.1 の mydns に問合わせられるようになっているかというと、 127.0.0.1 以外の IP アドレスが動的に変わるサーバ (ノートPC など) も想定しているから。 GCD OS は VirtualBox や Xen などの完全仮想化環境だけでなく、 coLinux や今回の OpenVZ など、 仮想化環境としてはやや異質なものもサポートしている。

以上のような細かい修正を行なっていって、 GCD OS が問題無く立ち上がるようになったら、 /usr/local/gcd/etc/init.d/chroot の呼び出しを (ubuntu の) /etc/rc.local に追加して、 VPS の起動時に自動的に GCD OS が起動されるようにする。

GCD OS が正しく立ち上がれば、 外部から 22番ポートに対して ssh ログインして GCD OS が使える。 22番ポートでログインできることが確認できたら、 3843番ポートの sshd は止めてもよい。 chroot 環境からはいつでも脱出できるので、 3843番ポートを止めても本来の (chroot する前の) ubuntu 環境にアクセスすることが可能:

senri:~ # ssh chiyoda.gcd.org
Enter passphrase for key '/root/.ssh/id_rsa':
Last login: Sat Jul 30 09:14:54 2011 from 2409:82:5fff:0:5542:d84e:971a:9656
Linux 2.6.18-194.3.1.el5.028stab069.6.
chiyoda:~ # ls -F /					↓ GCD OS
bin@   dev/  ftp/   lib/    proc/  run/   sys/  usr/
boot/  etc/  home/  lib64@  root/  sbin@  tmp/  var/
chiyoda:/ # chroot_escape /bin/bash			← chroot から脱出
groups: cannot find name for group ID 11
groups: cannot find name for group ID 14
root@chiyoda:/# ls -F --color=never			↓ ubuntu
aquota.group@  boot/  fastboot  lib32/  mnt/   sbin/     sys/  var/
aquota.user@   dev/   home/     lib64@  proc/  selinux/  tmp/
bin/           etc/   lib/      media/  root/  srv/      usr/
root@chiyoda:/# cat /etc/debian_version
squeeze/sid
root@chiyoda:/# lsb_release -r
Release:	10.10
root@chiyoda:/# exit
chiyoda:~ # 						↓ GCD OS

「chroot_escape /bin/bash」 が、 chroot 環境から脱出するコマンド。 脱出して、 「本来の」 root 環境 (この例では ubuntu) 下で、 引数のコマンド 「/bin/bash」 を実行する。 この bash を使って ubuntu の操作ができて、 exit すると元の GCD OS へ戻る。 まるで chroot 下の GCD OS の方が 「主」 で、 本来の root が 「従」 のように見える ;-)。

なお、 chroot_escape コマンド実行時の 「groups: cannot find name for group ID 〜」 というエラーは、 GCD OS の /etc/group と ubuntu の /etc/group が異なるため。 つまり GCD OS の root は ID 11 と 14 のグループに属しているが、 ubuntu には ID が 11 と 14 のグループが存在しないため、 このようなエラーが表示される。

ここまでやるなら、 chroot といわず root に GCD OS をインストールしてしまえば? という声が聞こえてきそうであるが、 ServersMan@VPS ではコンソールが利用できないため、 トラブったときのために何らかの 「バックドア」 は残しておきたい。 GCD OS がどのような状況に陥っても、 3843番ポートの sshd (init から起動されるので kill しても再起動する) にログインできれば、 ubuntu 環境で GCD OS の修復が可能。

というわけで一週間ほど ServersMan@VPS Standard プランを使っているが、 意外に (失礼!) 使えるので驚いた。 実は、 OpenVZ な 512MB ということであまり期待していなかった。 OpenVZ は swap を使えないので、 メモリ 512MB だと、 ちょっと重い処理をさせるだけですぐ OOM Killer が動き出すのだろうと思っていた。 ところが、

chiyoda:~ $ free
             total       used       free     shared    buffers     cached
Mem:       2097152     425020    1672132          0          0          0
-/+ buffers/cache:     425020    1672132
Swap:            0          0          0

512MB というのは実メモリ? の割当量のようで、 見かけ上は 2GB のメモリがある。 OpenVZ な VPS サービスによっては、 これをメモリ 2GB と言い張るところもあるんじゃないかと思うので、 ServersMan@VPS は良心的。

どのくらいのパフォーマンスなのか、 この日記 (WordPress を使用) の処理時間を測ってみる。 senri.gcd.org から ApacheBench でアクセスすると:

senri:~ $ /usr/apache2/bin/ab -n 10 http://chiyoda.gcd.org/blog/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
	...
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        6    7   0.3      7       7
Processing:   992 1116  94.1   1139    1259
Waiting:      305  403  78.3    380     561
Total:        998 1122  94.1   1146    1265

これを、 Linode Xen 512MB プラン (fremont.gcd.org) と比較する。 fremont.gcd.org は米国西海岸にある VPS なので、 同じく西海岸にある prgmr.gcd.org から ApacheBench でアクセスすると:

prgmr:~ $ /usr/apache2/bin/ab -n 10 http://fremont.gcd.org/blog/
	...
              min  mean[+/-sd] median   max
Connect:        2    3   0.1      3       3
Processing:   996 1081  73.8   1084    1197
Waiting:      354  391  30.5    388     450
Total:        999 1084  73.8   1086    1200

両者は、 ほとんど同等のパフォーマンスであることが分かる。 Linode Xen 512MB プランは、 ディスク 20GB で月額 $19.95 (約 1600円) なので、 ServersMan@VPS Standard プラン (ディスク 30GB, 月額 980円) の方がコストパフォーマンスが良い。

もちろん、 ServersMan@VPS Standard には、 カーネルのバージョンが古すぎ、という問題点があるし、 メモリ 512MB を超える部分のパフォーマンスは、 ホストOS 側の負荷状況に左右されると思われるので、 単純に比較すべきではない。


Android 端末で Picasa を使用して画像を共有できなかったので、対策を考えてみた

$
0
0
share - Picasa

Android 上のアプリの多くは 「共有」 機能を用いて他のアプリへデータを送ることができる。 例えば画像ビューアだと、 「メニュー」 から 「共有」 を選び、 「Picasa」 を選ぶことで Android 標準の com.google.android.apps.uploader (マイアップロード) アプリを使って、 Picasa ウェブアルバムへ画像をアップロードできる (← 左図)。

ところが、 この Picasa には Google アカウントとの連係に問題があって、 Android 端末の状態によっては Picasa へのアップロードができなくなってしまう。 つまり、 「Picasa」 を選んだときに、 「Googleアカウントを追加」 する画面に遷移してしまい先に進めない (↓ 下図)。

add Google Account

既にこの携帯に登録済の Googleアカウントで、 画像をアップロードしたいのに、 「マイアップロード」 が現在の登録済アカウントを認識できず、 アカウントの追加を求めてくる。

[戻る] ボタンを押すと 「マイアップロード」 が終了してしまうので、 仕方なく [次へ] をタップして Googleアカウントを追加しようとすると、 「アカウントが既に存在します」 と言われてしまう (↓ 下図)。

Google Account exists already

「アカウントが存在する」 のが分かってるなら、 そのアカウントで画像をアップロードしろよ! と言いたくなるが、 画面には [戻る] しかないのでどうにもならない。

Google ヘルプを見ると、 http://picasaweb.google.com に一度もアクセスしない状態でアップロードを試みると、 このような二進も三進も行かない状態に陥る、 ということらしい。 そこまで分かってるなら対策しろよ、 と言いたくなる。 まあ、 Google 的には、 Picasa へ直接アップロードするのではなく、 Google+ 経由で使って欲しいということなのかもしれないが。

delete Google Account

もちろん、 現在の Googleアカウントをいったん削除すれば、 アカウントを追加することは可能になる (はず)。 しかし、 アカウントを削除しようとすると、 「携帯のメール、連絡先などのすべてのデータも削除されます」 などと脅される (右図 →)。

アカウントを削除しても、 再度アカウントを追加すれば、 削除されたメールや連絡先も再同期されるのだとは思うが、 「1つ目のアカウントを絶対削除したらだめ」 という先達の意見をスルーするのも気が引ける。

また、 知らぬ間にPicasaとの同期が始まるケースもあるらしいが、 ただ待ってるというのも能がないし、 待っていれば必ず始まるというものでもないだろう。

そこで、 アカウントを削除すること無く、 他への影響を最小限に抑えつつ、 Picasa Web Albums を同期させる方法を考えてみた。

要は、 マイアップロードにおいて Googleアカウントを追加する際、 追加したいアカウント (この場合だと sengoku@gmail.com) が存在しないと判定されれば、 前述したようなエラーが出ること無く、 Picasa Web Albums の同期のセットアップが完了できるはず。

Android には、 /data/system/accounts.db というデータベース (DB) がある:

senri:~ $ adb shell
$ su
# sqlite3 /data/system/accounts.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
accounts          authtokens        grants
android_metadata  extras            meta
sqlite> .schema accounts
CREATE TABLE accounts ( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, type TEXT NOT NULL, password TEXT, UNIQUE(name,type));
CREATE TRIGGER accountsDelete DELETE ON accounts BEGIN   DELETE FROM authtokens     WHERE accounts_id=OLD._id ;   DELETE FROM extras     WHERE accounts_id=OLD._id ;   DELETE FROM grants     WHERE accounts_id=OLD._id ; END;
sqlite> select * from accounts;
1|sengoku@gmail.com|com.google|《暗号化してBase64エンコードしたパスワード》
2|gcd_org|com.twitter.android.auth.login|
3|hiroaki_sengoku|com.skype.contacts.sync|
sqlite> 

Android は同期を行なう際、 この DB のデータを使ってサーバへのログインを行なっているようだ。 ということは、 この DB 内の accounts テーブルにおいて、 「sengoku@gmail.com」 のレコードを削除してしまえば、 sengoku@gmail.com が存在しないと判定されて、 Googleアカウントを追加することが可能になる? login Google Account

DB のレコードを削除した直後にアカウントの追加を行なえば、 レコードが存在しない時間を最小限にできる。 この DB を参照するプログラムが動いたりしない限り、 悪影響を及ぼすことはないだろう。 もちろん、 「自動同期」 はオフにしておくべき。 また、 動いているアプリをできる限り終了させておく。

accounts.db のコピーをどこかへ保存しておけば、 万一、 なにか異常事態に陥っても、 accounts.db の内容を元に戻すことにより復旧は可能だろう。 万万が一に備えて、 念のためにシステム全体のバックアップも取っておく。

万全の備えをした後に、 画像ビューアにて適当な画像を選び、 「共有」 メニューから 「Picasa」 を選ぶ。 すると、 前述したように 「Googleアカウントを追加」 する画面に遷移するので、 [次へ] をタップし、 (携帯に登録済の) Googleアカウントを入力する (右図→)。

ここで [ログイン] をタップすると、 前述したように 「アカウントが既に存在します」 と言われてしまうので、 [ログイン] をタップする前に、 accounts テーブルから、 「sengoku@gmail.com」 のレコードを削除する:

sqlite> delete from accounts where _id=1;
sqlite> select * from accounts;
2|gcd_org|com.twitter.android.auth.login|
3|hiroaki_sengoku|com.skype.contacts.sync|
sqlite> 
Google Account registered

そして、 間をおかずに [ログイン] をタップ。 すると、 めでたく登録が完了した (右図→)。
これで、 [設定]→ [アカウントと同期] に、 「Picasa Web Albums を同期」 の項目が表示されるようになった。

メールや連絡先の同期も問題無く行なうことができた。 3日ほど普通に使っているが、 特に問題は起きていない。

Access Request

accounts テーブルの schema を見ると分かる通り、 DELETE TRIGGER が定義されていて、 レコードが削除されると、 grants テーブルからも該当レコードが削除される。 なので、 アクセスリクエストを再度許可する必要は生じる (← 左図)。

その一方で、 accounts.db は Android ID 等の端末固有情報とは関係がないので、 Android マーケットにおけるアカウントには影響しない。 私は有料アプリ/コンテンツを買ったことがないので確認はできないが、 おそらくアプリからはレコード削除後も同一端末と見なされるはず (ライセンスが無効になったりはしないと思われる)。

ベンチャーが学校教育に求めること

$
0
0

東北大学大学院の教壇に立ちました。 産学連係講義 「先端技術の基礎と実践」 という講義で、 毎週一人づつ企業から講師を招いて、 ソフトウェアや IT 技術の様々な側面について理論的、 あるいは実際的な観点から講義してもらう、 という趣旨でした。 講義題目の一覧を見ると、 私以外は、 (講義の趣旨から言って当然ですが) 技術的な内容ばかりで、 私の講義 「学生のうちに身につけて欲しい、たった一つの能力」 だけ浮きまくっていました (^^;。

本当にこんな内容で話していいのか (ある意味、大学院での教育方針にケンカを売るような内容ですので) と内心不安だったのですが、 少なくとも一部の学生さんには積極的に質問してもらえて、 1コマの授業時間だけでなく、 講義後のフリートークも時間いっぱいいっぱい使って、 学生さん達とお話しすることができました。 型破りな講義内容を快諾して頂いた先生方に深く感謝致します。

以下、 講義の内容です (実際の講義は脱線してしまったので、こんなに整っていませんが)。 囲み部分はスライドの内容です。

- o -
おかげさまで KLab 株式会社は、先月 9月 27日に東証に上場しました

SAP (Social Application Provider) として上場するのは、 KLab が国内初だったこともあり注目を集めました。 SAP というのは、 GREE, モバゲー, mixi, ニコニコ動画などの SNS (Social Network Service) 上で遊べるアプリ (ソーシャルゲーム) を提供する会社のことです。 2009年に国内で初めて mixi が SNS プラットフォームをオープン化したのに合わせて KLab はソーシャルゲーム開発に舵を切り、 ソーシャルゲーム関連の売上が急拡大中です。 でも、 今日はソーシャルゲームの話はしません。 なぜか?

一つは、 明日が 2011年 8月期の決算発表で、 今うっかり先走って業績などを喋ってしまうと大変なことになるからですが、 もう一つは ↓

事業内容をみて就活するヤツ多すぎ (´・ω・`)

私は仕事柄、 就職活動中の学生さんとお話しする機会が多いのですが、 エンジニア志望なのに、 事業内容で会社を選ぼうとしている学生さんが多いことに違和感を覚えます。 みなさんは会社に入って事業をやりたいんでしょうか?

最初こそプログラマとして入社するけど、 あくまでそれは事業を理解する端緒としてであって、 なるべく早く開発を統括できるようになり、 事業を発展させることによって自らも成長し、 ゆくゆくは事業部長を目指し、 あわよくば社長も狙いたい、 ということであれば、 事業内容で会社を選ぶのも理解できます。

しかしながらエンジニア志望の学生さんの多くは、 事業部長を目指すというよりはもっと技術志向で、 専門性を活かした職種、 例えば技術コンサルタントやチーフアーキテクト、 あるいは 「技術者の社長」 であるところの CTO などをイメージしていたりします。 できればマネジメントはやりたくない、 開発の現場を離れたくない、 と考えている人も多いのではないでしょうか。

事業と技術、 どちらのキャリアを歩もうとするのか、 社会人としての最初の一歩を踏み出す前に、 もっと意識すべきではないでしょうか? なぜなら、 事業を中心に考えるのであれば技術は単なる手段であり、 極論すれば技術は新人の仕事ということになります。 できるだけ早く新人の仕事としての技術は脱却して、 マネジメント手法を学んでいかなければ 35歳でエンジニアとしての定年を迎えてしまいます。

一方、 技術を中心に考えるのであれば事業は単なる手段であり、 極論すれば事業が立ち行かなくなって会社が潰れてしまっても、 自身の技術力さえ伸ばせれば成功と言えるでしょう。 ずば抜けた技術力があれば転職も思いのままだし、 給料も言いたい放題でしょう。 だから、 事業内容で会社を選ぶのではなく、 その会社が自分の成長に役立つか否かで選ぶべきです。

言うまでもなくどっちつかずなのが最悪で、 残念なことにエンジニア志望だった人の多くが ↓ のような道を歩んでしまいます。

どっちつかずな人の末路 orz

若いうちは技術をやれ、と言われてデスマーチでこき使われる。
辛いけど自分は技術が好きなんだ、と現場にこだわり続ける。

そして、35歳でエンジニア定年。 泣く泣く現場を離れてマネジメントの道を歩み始めるが、
自ら進んでマネージャを目指した同期に追い付くのは不可能。

ただし技術の道を選んだとしても、 「ずば抜けた技術力」 が身につけられるのは、 元々その素質を持っていた人に限られます。 どの分野の技術でも向き不向きはあると思いますが、 ことコンピュータ関連の技術に関してはその傾向が顕著で、 努力すれば身につくような種類のものだとは到底言えないでしょう。 むしろ、 努力しなくても自然とスキルが伸びてしまったというような、 元々その素質を持っている人だけが、 高い技術力を獲得できる傾向があるように思われます。

なので、 自分が何に向いているか早く見つけることが何より重要、 ということになります。 ただし、いわゆる 「自分探し」 は時間の無駄です。 なぜなら、 向いているか向いてないかは、 やってみなければ分からないからです。

就活でちょろっとその会社の説明を聞いたぐらいで、 その仕事が自分に向いているか分かるわけはないのはもちろんですが、 実際に働き始めてみて 「自分に合いそう」 とか 「この仕事は自分に向いていない」 とか思うのもタイテー間違っていて、 自身の能力の限界まで力を出しきってみて初めて、 向いているか否かが分かる性質のものだと思います。 そもそもろくに仕事の内容を理解できてない段階で 「好き」 だの 「嫌い」 だの言ってみても始まりません。 何事もつきつめていけばそれまで見えなかったものが見えてくるわけで、 「好き」 だの 「嫌い」 だのは視野が充分広がった後で判断すべきものでしょう。

「好きなこと」 を仕事にするのは叶わぬ夢なのか?

「好きなこと」 「向いていること」 を仕事にしたい。 多くの人がそう望んでいると思いますが、 現実はそうなっていません。 むしろ、 生活のため仕方なく仕事している、 という人がほとんどでしょう。 「好きなことはあるけれど、 それで食っていくことはできない」 とあきらめてしまっています。

例えば、 私の周囲にはセミプロ級 (自称) のカメラマンがいます。 そんなに好きならなぜプロにならないのか? と聞いたこともあるのですが、 「カメラは趣味だからいいんだ」 などと意味不明な答が返ってきます。 彼らはプロを目指さず、 あまり好きでもないソフトウェア開発業務に携わっているわけですが、 それはプロのカメラマンを目指そうとすると、 自身にその素質がないことが白日のもとにさらされると思っているからなのでしょう。 つまり、 本気でプロを目指して挫折すると、 せっかくの 「趣味」 が嫌いになってしまうのが怖いのだと思います。

つまり、 「好きなことで食っていけない」 のではなくて、 プロを目指してみる覚悟がないだけなのです。 本気でプロを目指せば、 その道の素質があるか否か、 たちどころに分かることでしょう。 もし素質がなければ、 さっさとあきらめて別の道を試せばいいだけの話です。 手当たり次第に試していけば、 きっと自分に向いていて、 かつ本当に好きと思える仕事が見つかることでしょう。

だから最初に何をやるかは実はあまり重要ではなくて、 何をやるにしても本気でプロを目指してみることが重要、 ということになります。 大学に残ってアカデミックな世界のハイアラーキを登り詰めようというのでなければ、 プロを目指すのは就職してからが本番ということになります。

では、いま何をすべきか?

「産業界が学生に求めるのはコミュニケーション能力だ」 というデマが出回っているようですが、 これは嘘ですので忘れてください。 マトモな人に聞いてみれば誰でも同じ答がすぐ返ってくると思うのですが、 一番重要なのは 「考える力」 です。

考える力がないヤツ多すぎ (´・ω・`)

そもそも大多数の学生さんは 「考える力」 が何だか分かっていません。 幾多の試験を突破し、 大学院にまで登り詰めた学生さんを相手にずいぶんな言いようだと思いますが、 実際に数多くの学生さんと話してみた結果なのだから仕方ありません。 逆に、 考える力のある学生さんなら、 学歴・知識・コミュニケーション能力など一切不問で採用します。

例えば、 ほとんどの学生さんは、 何を聞いても質問一つできません。 当人は質問すべきことがないから質問しないだけ、 と思ってヘーキな顔をしていますが、 本当は何を質問したらいいか考えられないだけなのです。 また、 学生さんが就職して会社で開口一番、 何と言うか分かりますか?

少なくない人が 「早く仕事に慣れて、みなさんのお役に立ちたい」 って言うんです。 ベルトコンベアの組立工とか、 マニュアル通りに振る舞うことが期待されるマクドナルドの店員とかなら、 仕事に慣れることも必要でしょうが、 そういう仕事だと思って就職したんでしょうか? いくら今まで仕事をした経験がないといって、 あまりにウブすぎます。

そして極めつけは、 知識の習得には貪欲でも、 習得して何がしたいかの展望をまるで持っていないことです。 知識は手段であって目的ではありません。 それが小学校〜大学院 6+3+3+4+2=18年にもおよぶ学習期間において、 ひたすら知識を習得し続けた結果、 なんのために習得したのか、 その目的をすっかり忘れてしまったのでしょう。

学びて思わざれば、すなわち罔し

「目的意識を明確に持て」 とは誰しも言う言葉ですが、 では目的とは具体的には何なのか? 「世のため人のため」 とか途方もなく抽象的なことを言ってお茶を濁していませんか? あるいは逆に 「給料をもらうため」 とか途方もなく具体的なことを言ってしまうかも知れません。 いずれの場合も、 そこから考える余地があまりなく、 思考停止してしまいがちです。

抽象的な話では面白くないので、 私自身の例を紹介しますと、 ずいぶん前から (たぶん中学生のころから) 「有名になりたい」 という目的を持ち続けています。 自分の名前を売るにはどうすればいいか考え、 (オープンソースという言葉ができる以前から) オープンソースソフトウェア (例えば stone) を公開し、 ブログを書き、 インタビューを受け、 いろんなところで講演したりパネルディスカッションに登壇したりしています。 今日、 ここでこうやって講演しているのも、 実を言えば、 人前でうまく話す練習をしたい、 というのが一番の動機だったりします。

ついでにいうと、 なんで有名になりたいかと言えば、 自由になりたいからです。 近頃は 「社蓄」(「会社+家畜」から来た造語) という言葉が使われるようになりましたが、 いわゆるフツーのサラリーマンは少しも自由ではありません。 嫌な仕事でも生活のためにヤムを得ず働いているわけです。 会社に依存せずに生きるには、 会社の肩書がなくてもやっていけるだけのネームバリューが必要ということに (たぶん中学生のころ) 気付き、 それ以来、 自由になるにはどうすればよいか考え続けてきました。

考える力は、 考えることによってしか伸びないわけで、 そのためには自分の考えが足りないことを自覚することが必須でしょう。 そして考えが足りないことを自覚するには、 まず自分が無知であること、 すなわち自分は何が分かっていないかを自覚することが必要です。

ここで重要なのは、 「分かってない」 と 「知らない」 の違いです。 「知らない」 ことは調べれば済む話で、 考えてどうこうできる問題ではありません。 つまり 「自分には知らないことがある」 と自覚したところでそれは考えるきっかけにはなり得ません。

一方、 「分かってない」 のは決して知識が足らないためではありません。 だから調べてどうこうできる問題ではありません。 例えば 「数」 の概念が分かってない人に 「数」 とは何かを教えようとする状況を想像してみてください。 あるいは逆に、 自分が 「数」 という概念を分かってなかったとして、 どうしたら 「数という概念が分かっていない」 ことに気付けるか想像してみてください。

「分かってない」 と 「知らない」 は違う

「分かる」 と 「自転車に乗れるようになる」 は似ている

思うに、 「分かる」 というのは 「自転車に乗れるようになる」 ことに似ていると思います。 「分かってない人」 が無自覚であると同様、 自転車を見たことがない人にとっては、 自分が自転車に乗れないと気に病むことはないでしょう。 そして最初の 「分かろう」/「乗ろう」 というチャレンジは確実に失敗します。 どうすれば 「分かるか」/「乗れるか」 皆目見当がつかない一方で、 いったん 「分かる」/「乗れる」 と、 どうやってそれができるようになったのか思い出せなくなってしまいます。

というわけで、 「考える」 ためにはまず自分が 「分かってない」 ことを自覚し、 次に 「分かろう」 と努力することが必要です。

後者は、 「分からないこと」 が目の前にあるわけですから、 あきらめさえしなければさほど難しくはないでしょう。 といっても思考停止という罠がたくさんあるので、 後者は後者で一筋縄には行かないのですけれど、 そんなことより問題は前者です。

すなわち、 「分かってない」 ことをいかに自覚するか? が鍵となります。

おそらく、 自力で自分の 「分かってなさ」 を自覚することは無理で、 他者に指摘してもらって初めて気付かされる、 という場合がほとんどなのではないかと思います。 じゃ、 どうすれば他者に指摘してもらえるか? 黙っていては無理で、 自分から自身の考えを発信してみることが重要なのではないでしょうか?

変なことを発信すれば、 親切な人が 「おまえは何を言ってるんだ?」 と指摘してくれるかも知れませんし、 慣れてくると他者の反応もあらかじめ予測できるようになり、 発信する文章を練っている段階で自分の至らなさを痛感するかも知れません。 私自身、 こうやって自身の考えを長々と述べていますが、 この考えのほとんどは、 いろいろな人と対話した結果生まれたものであって、 決して私の頭だけで考え出したものではなかったりします。

というわけで、 まずは内容は二の次で、 自分の言葉を発してみることが何よりも重要でしょう。 例えば今この場で、 質問してみるところから始めてみてはいかがでしょう?

生涯 「こだわらないエンジニア」 宣言

$
0
0

2011年11月28日の KLab(株) 株主総会 (上場前の株主名簿に基づく最後の総会) 終了後、 私は取締役CTO を退任いたしました。 今から遡ること 11年前 2000年8月1日の (株)ケイ・ラボラトリー (当時の KLab の社名) 創業以来、 会社経営については全く無知であった私が何とかここまでやってこれたのは、 ひとえに皆々様方のご指導ご鞭撻のおかげであったと深く感謝いたします。 誠にありがとうございます。 なお、 後任として安井真伸が CTO に就任しました。

11年前、 日立製作所の研究所勤務の一研究員だった私が、 なぜケイ・ラボラトリーの立ち上げに参加したかといえば、 未知のモノに関わるチャンスがあれば、 あまり後先考えずに飛び付いてみる性格だったというのが大きかったと思います。

中途半端に好きな状態で居るのではなく、 興味を持ったのなら、全力で取り組んでみる。 自分の能力がどれくらいのものかと、把握できるまでやってみる。 そして向いてない、止めると決めたらそれ以上は手を出さない。 それを繰り返すことで、本当に自分が好きなもの、 人並み以上の価値を生み出せるものを見つけ出し、 それを仕事にしていったのが仙石氏のキャリアなのだ。

日立では一人の部下も持っていなかった私が、 マネジメントの何たるかを全く理解しないままに、 当時規模は小さかったとはいえ、 エンジニア集団のトップとして責任を負う立場に立ったというのは、 チャレンジというよりは無謀であったかもしれません。

失敗も多かったのですが、 まがりなりにも 11年も続けられたということは、 「経営者」 が向いていたということなのでしょう。 それまで私は自分のことを 100% 技術者 (ちょっとだけ研究者) だと思っていたのに、 マネジメントもそれなりに向いていたというのは発見でした。 「ベンチャー立ち上げ」 というチャンスに後先考えずに飛び付いて本当に良かったと思います。

もちろん、 私がしでかした数多くの失敗で、 多くの方々にご迷惑をおかけしました。 私の未熟さゆえに厄災に遭われた方々 (が本ブログの読者である可能性は低いのですが) にはこの場をお借りしてお詫び申し上げます。

右も左も分からない手探り状態で CTO の仕事を始めて以来、 一貫して自分に課していたことがあります。 それは、 「部下に仕事を任せること」。 ケイ・ラボラトリーの黎明期は、 やるべきことが多すぎて、 それこそ猫の手も借りたい状態だったので、 「仕事を任せること」 を自分に課したというよりは、 手が回らないから結果的に任せた格好になっていただけなのですが、 経営陣の末席を汚しているうちに経営とは何であるか私なりに学ぶ機会もあり、 黎明期を脱した後も、 たとえ自分がやりたい仕事であっても、 部下でもできる仕事であれば敢えて手を出さず、 任せるようにしてきました。

部下を育てなければ会社がまわらないわけで、 「仕事を任せることが重要」 なんてことは誰でも知ってるし、 誰でも実践していることだと思いますが、 自分がやりたい仕事まで手放す、 ということになるとどうでしょうか?

2006年に、 こんなことを書いています:

積極的に今の仕事を捨てるべきでしょう。 部下 (or 後輩) が成長してきて、 自分の代わりがつとまるようになったら、 全てその部下に任せてしまい、 新しいことにチャレンジするわけです。 そうすれば部下も育つし、 自分を変えることができます。 運がよければ新たな成長フェーズに入れるかもしれません。

私は、 チャンスに巡り合ったときに躊躇なく飛び付けるように、 あるいは新しいチャンスに巡り合う確率を上げるために、 取組んでいた仕事がある程度まわるようになったら、 その仕事にはこだわらず、 むしろその仕事を手放して別のことに取組むようにしてきました。

手放した仕事の中で一番大きかったのは、 大学院と日立で計 11年間も続いていた研究者としての仕事だったわけですが、 もし、 ベンチャー立ち上げに参加するチャンスに巡り合ったとき、 研究者としての仕事にこだわってチャンスに飛び付くのを躊躇していたら、 CTO をやってみることもなかったかもしれません。 当時は研究こそ自分の 「やりたい仕事」 だと思っていたのですが、 それを敢えて手放したことで CTO としての仕事に巡り合えたのだと思います。

その CTO の仕事も 2008年の時点で丸 8年になり、 かつての部下が二人も役員に登り詰めるに至って、 そろそろ私が KLab で果たせる役割も終わりが近づいてきたと意識し始めました。 社内で、 ことあるごとに 「CTO を辞めるつもり」 と (誰も本気にしてくれませんでしたが) 言っていましたし、 社外でも公言していました:

KLab を設立してから、どんどん仕事を捨てて自分を変えている (ピーターの法則に陥らないように)。 部下が成長したらすべて任せてしまう。 すべての仕事を部下に振り終えたら、私は CTO をやめる予定。 早く育成しないと。

株式の上場が現実味を帯びてきた頃、 ボトルネックの一つが人事制度でした。 人事は私にとって全く未知のモノでしたから迷わず飛び付きました。 労働基準法を一から勉強したり、 人事マネージャ候補を 20人以上面接したり、 弁護士や社労士の先生方と連係したりと、 初めてのことばかりで失敗もあったのですが得難い経験をしました。 特に人事担当者を採用するための面接は、 技術者の面接とはまるで異質で、 大変勉強になりました。 とはいえ、 私は (予想通り) あまり人事向きではなかったので、 一年程度で人事の仕事は手放して後任に引き継ぎました。

そして無事上場を果たしたいま、 KLab の業績は絶好調です。 過去 11年間の KLab の歴史の中で最も好調な今だからこそ、 11年続いたこの仕事を捨てて自分を変える最適のタイミングだと判断しました。 未練がないと言えば嘘になりますが、 新しいチャンスに巡り合うために敢えて取締役を退任することを願い出た次第です。 私のワガママを快く受け入れてくださった、 真田社長をはじめとする取締役の方々に感謝いたします。

今後は、 まずは様々な人とお話しして、 どこかにチャンスが落ちていないか ;-) 探すつもりです。 私から連絡するかも知れませんが、 もしご関心があればご連絡頂ければ幸いです。 私は今まで何百人 (数えたことがないので正確な数は不明) もの人を面接してきましたが、 面接を受けたのは (新卒時を含めて) 数回程度しかないので、 他社がどんな面接をしているのか大変興味があります ;-)。

私は、 23歳からの 11年間を研究者として、 次の 11年間を経営者として全力で取組んできました。 私はまだ 45歳、 さらにもう 11年間くらいは何か別のことに全力で取組むことができるはずです。

ついでにいうと、 コンピュータに巡り合ったのが 12歳の時なので、 コンピュータを専ら趣味でいじってた期間も 11年間です。 そしてこの 33年間、 コンピュータに対する関心だけは変らず一貫しているので、 根底ではエンジニアが一番向いているということなのでしょう。

私がいままでやってきたことにこだわるつもりはありません。 11年前、 それまで研究者だった私が、 研究にこだわらずに無謀にもベンチャーの立ち上げに参加したからこそ、 今の私があるわけで、 これからも、 そして生涯、 こだわらずに未知への挑戦を続けていきたいと思います。

スマートフォン用の外付バッテリー

$
0
0

あけましておめでとうございます。今年もよろしくお願いします。

近頃のスマートフォン (スマホ) は、 ちょっと使ってるとバッテリーが一日もたない。 出先でバッテリー切れになると大変困るので、 外付バッテリーを携帯している人も多いのではないか。 外付バッテリーには、 リチウムイオン二次電池 (充電式電池, 充電池) を利用するものと、 単三乾電池 (あるいはエネループ等のニッケル水素二次電池) を利用するものがあるが、 前者は (安全性の観点から) 充電池を交換できないことが多く、 充電池が寿命を迎えると使い捨てになってしまう (eneloop mobile booster KBC-L54D など。3900円もするものを使い捨てにするのはモッタイナイ)。

一方後者は、 リチウムイオン充電池に比べると質量あたりの蓄えられる電力量 (重量エネルギー密度) が小さい。 18650 リチウムイオン充電池が、 3.7V * 2400mAh / 47g = 188Wh/kg 程度あるのに対し、 単三のエネループは 1.2V * 1900mAh / 27g = 84Wh/kg と、 リチウムイオン充電池の半分以下しかなく、 スマホの充電用としては力不足。

特に、 単三形ニッケル水素充電池 2本を用いる外付バッテリー (eneloop stick booster など) は、 2.4V (1.2V * 2) を倍以上の 5V (USB の電源電圧) に昇圧して出力するため、 900mAh 程度 (1.2V * 2 * 1900mAh / 5V, 損失があるはずなので実際にはもっと少ないはず) しか出力できず、 スマホを充電しても満充電にはほど遠い。 単三形ニッケル水素充電池を用いるなら 3本〜4本を直列すべきだが、 そうすると重く大きくなってしまい常時携帯するには不適。

というわけで、 私はスマホの充電に、 いわゆる中華充電器 (18650 Batttery Powered USB Bright Torch, 本体側面に 「PORTABLE POWER」 と書かれている) を使っている。 これはリチウムイオン充電池を利用する外付バッテリーだが、 18650 と呼ばれる (直径 18mm 長さ 65.0mm という意味) 安価な汎用リチウムイオン充電池 (一個 300円〜500円) を用いるため、 充電池が寿命を迎えたら充電池のみ交換できる。 18650 充電池の電圧 3.7V を 5V に昇圧して USB コネクタで出力する他、 充電回路も組み込まれているので、 USB ケーブルをつなぐだけで充電も可能。

18650 battery

写真 ↑ の直方体 (白と黒) が中華充電器。 黒い方は裏蓋を外して中身の 18650 充電池が見える状態にして撮影。 手前の面の USB A ソケットに USB ケーブルを接続して充放電を行なう。 中の赤い 18650 充電池は、 ノートPC 用のバッテリーを殻割りして取り出した充電池なので、 接着剤を剥した痕がある。 その隣の青い (「UltraFire」 と書いてある) 18650 充電池は、 香港の鴨寮街 (深水埗駅の出口すぐ) で買った 18650 充電池 2個パック (2個で HK$68 = 約 680円)。

Battery Graph while charging

もちろん、 安全回路なしのリチウムイオン充電池をセル単体 (つまり 18650) で扱うことは危険であり、 発火や爆発の可能性も考慮にいれた運用が求められる。 その危険性故に、 日本では 18650 は、 一般には市販されていない (秋葉原などでは売っている店もある)。 18650 を充電器から日常的に出し入れするなど、 ニッケル水素充電池 (エネループ等) と同様の感覚で扱うことは絶対に避けるべき。

この中華充電器は軽量コンパクトでありながら、 スマホを (ほぼ) 満充電にできるくらいの電力量があるので、 私は常に持ち歩いている。

Galaxy Nexus (香港で購入した GT-I9250) のバッテリーが残り 10% になった段階 (左のグラフで 19:47 の時点) で、 中華充電器による充電を開始してみた (ディスプレイを消灯したまま放置)。 2時間55分後 (22:42) に充電が停止し、 94% まで充電することができた。

Galaxy Nexus のバッテリーは、 1750mAh のリチウムイオン充電池 (スマホの中では容量が大きい方)。 3.7V 2400mAh の 18650 を 5V に昇圧して出力する中華充電器で、 Galaxy Nexus を 10% から 94% まで充電できれば悪くない。 つまり、 充電電気量は 3.7V * 2400mAh / 5V ≒ 1700mAh 程度になる (実際には損失がある) ので、 84% (94% - 10%) を充電できれば充分。 3時間弱の充電中も Galaxy Nexus が 150mAh くらいは消費しているはず (Galaxy Nexus など大抵のスマホは、 ほとんど使わない待受け状態で放置していても 12時間くらいしかバッテリーが持たない) なので、 実際に充電された電気量は 1750mAh * 84% + 150mAh = 1620mAh くらいになっていると思われる。

充電 (中華充電器にとっては放電) が停止したときの中華充電器の 18650 の電圧が 3.38V で、 リチウムイオン充電池の放電終止電圧 2.7V よりだいぶ高いが、 中華充電器の昇圧回路が機能する電圧がこのあたりなのだろう。 また、 中華充電器を満充電したときの 18650 の電圧は、 4.13V だった。 充電中の電圧は 4.2V を超えていないようなので (オシロスコープを持ってないので正確なところは不明)、 まあ大丈夫なのだろう。

香港で洗濯を

$
0
0

旅行期間が長くなると当然着替えがたくさん必要になる。 下着を毎日替えるのはアタリマエだが、 シャツもできれば毎日着替えたい。 滞在期間が一週間を超えると、 衣類だけでスーツケースが一杯になってしまう。 近年多くの航空会社が、 荷物を各 50ポンド (約 23kg) 2個までに制限するようになったので、 持って行く衣類は 5日分くらいに抑えて、 現地で洗濯して着まわすようにしたい。

米国など多くの国では、 ホテル内 (あるいはホテルの至近) にコインランドリーがあるので、 数日毎に洗濯していたのだが、 香港ではコインランドリーを見かけたことがなかった。 いつも利用しているホテルにコインランドリーが無いだけでなく、 香港じゅうどこへ行ってもコインランドリーらしきものが見当たらない。 香港に長期滞在している人達は、 いったい洗濯物をどうしているんだろう? と思っていた。

新明亮 專業乾洗 New Bright & Light Laundromat

← ただ、 ホテルの前にクリーニング店らしきものがあることには以前から気付いていた。 店内にはカウンターがあって、 店番のおばちゃんが一人座っている。 ドライクリーニング済と思しき、 一着一着ハンガーに掛けられ透明袋で覆われた衣服が、 ところ狭しと上から多数吊り下げられている。 いくら香港の物価が安いといっても、 下着を含めて全てドライクリーニングするわけにもいかないよなぁ、 と思っていた。

この店の看板には 「新明亮 專業乾洗」 と漢字の店名の他に、 「New Bright & Light Laundromat」 と英語の店名が併記してある。 Laundromat (Laundry + Automatic の造語) は、 米国だと 「コインランドリー」 の意味なのだけれど、 お客が洗濯機を直接いじれる状況ではなく、 コインランドリーとはかけはなれた感じ。 どーみても (日本の街角で見かける) クリーニング店である。

店名にある 「乾洗」 は文字通り 「ドライクリーニング」 の意味だが、 店のガラスに貼ってある掲示をよく見てみると、 「乾洗」 の価格表の他に、 「磅洗 1-7磅 $31.5 (毎磅+$4.5)」 などと書いてある。 「」 は 「ポンド」 の意味で、 7 ポンド (約 3.2kg) までは HK$31.5 (約 315円) で、 1 ポンド増えるごとに HK$4.5 (45円) 増しという意味。 これは洗濯物を量り洗いしてくれるという意味ではなかろうか? ちなみに、 料金が妙に中途半端な数字なのは、 「磅洗九折」 つまり 10% 割引のため。 元の値段は、 HK$35 毎磅+HK$5 だったのだろう。

英語が (中国語と共に) 公用語である香港ではあるが、 個人商店だと英語が通じる可能性は低い (最も通用するのは中国語の一方言である広東語)。 おばちゃんに、 量り洗いを、 どんな仕上がりでやってくれるのか英語で尋ねても、 たぶんこちらの意図は通じないだろう。 意を決して、 洗濯物の袋を持ち込んでみた (12/19)。

もちろん、 最悪の事態を想定して、 なくなっても (あるいはズタボロにされても) そんなに困らない下着やシャツに限定してビニール袋に詰め込んで持ち込む。 ホテルのロビー前を、 下着満載の袋を持って通り過ぎるのはちょっと恥ずかしい。

11磅 HK$50 と書かれたレシート

袋を持って店に入ると、 店番のおばちゃんが入口わきの秤を指し示した。 よかった、 少なくともここまでは、 こちらの意図が通じている。 秤に乗せると 11ポンド (約5kg) だった。 おばちゃんが 「ん、さっぷまん」 と言った (のだと思う)。 こんな単純な単語でも、 なかなか聞き取れない。 広東語は 「ん」 で始まる発音が重要なのだけど、 あいにく日本語には 「ん」 から始まる語がないので、 日本人にとって 「ん」 から始まる単語を聞き取るのは難しいし、 発音するのも難しい (広東語で 「しりとり」 をしたら 「ん」 で終わる単語を禁止しなくていいかも)。

おばちゃんがレシート (写真右 → ) に 50 と書いて見せたので、 HK$50 (約 500円) を支払う。 11ポンドなら HK$31.5 + HK$4.5 * (11磅-7磅) = HK$49.5 なので、 HK$50 なら計算も合ってる。

するとおばちゃん曰く 「とだい」。
む? 一瞬何を言ったか分からず固まってしまったが、 「Today」 らしい。 私に広東語が通じないんで英語に切り替えてくれたらしい。 でも、 おばちゃんが喋れる英語はここまで。 どうやら 「今日できるよ」、 と言いたいらしい。 どんな仕上がりで返ってくるか一抹の不安を感じたが、 まあ、 なるようになるでしょ。 このレシートを受け取って店を出る。 レシートの右上に 「未付款 not yet paid」 と書かれているが、 レシート中央に斜めに赤字のスタンプで 「已付款」 と押してあるので、 既に支払い済という意味なのだろう ( 「」 は 「既に」 という意味の漢字)。 スタンプも英語併記にしておいてくれると助かるのだが。 レシート上で店名の 「Laundromat」 の綴りが間違っているのはご愛嬌。

ホテルに向かうと、 私と同じように大きな袋をぶら下げてホテルを出てくる人を発見。 なんだ、 みんな同じような感じで洗濯物を出していたのか。 なんでいままで気づかなかったんだろう。

その日の晩、 ホテルに戻ってきたら 20:00 を15分ほど過ぎてしまい、 店は既に閉っていた。 営業時間は、 月曜〜土曜が 8:00〜20:00、 祝祭日が 9:00〜17:00 で、 日曜は休み。 ただし冬節 (冬至, 2011年は 12月22日だった) は中国人にとって特別の日であるらしく、 営業時間が (この店に限らず) 変則的なので注意が必要 (営業しないか、開店しても早々に閉店する)。 実は前掲の店の写真は 12月22日、 冬節の朝 10:19 に撮ったものだが、 まだ開店しておらず 「梢候片刻 PLEASE WAIT」 の札がドア中央にかけてある。 両隣の店のシャッターが閉っているのは冬節だからだと思われる。 決してシャッター街になってしまっているわけではない。

洗濯済衣類の袋

次の日 (12/20) の朝、どきどきしながら店へ行ってレシートを (昨日と同じ) おばちゃんに差し出す。 おばちゃんは、店内に積み上げてある袋の中から一つを引き出してカウンターへもってきてくれた (写真右 →)。

ここで 「むごーい」 (「唔該」, 「ありがとう」 の意味) と言えばいいのだろうけど、 つい 「Thank you」 と言ってしまった。 練習を積まないと、 なかなか自然には出てこない。

なにはともあれ、 ここまでは想定通りにコトが進んだ。 スムーズすぎるくらい。 袋をホテルの部屋に持ち帰り、 どんな状態の衣類が出てくるか、 固唾を飲んで袋の口をほどく。

なんと、 シャツや下着が一枚ずつ丁寧に畳んで重ねてあった。 ハンカチもきちんと二つ折りにしてあった (写真下 ↓)。 量り洗いなのに、 ここまで丁寧に畳んでくれるとは。

きちんと畳まれた衣類

しかも洗濯から畳むまで全て込み込みで、 わずか 500円。 ちなみに米国だとコインランドリーを使う料金だけで US$7.0 (約 546円) くらいかかる (おまけに 25セント硬貨で用意しなければならないので大変)。

あとで気付いたが、 レシートに書いてあった伝票番号 11834 が、 袋にも (手書きで) 書いてあった。 店内に積み上げられた袋の中から、 おばちゃんはこの数字を頼りに私の袋を引き出したのだろう。

きちんと畳まれた仕上がりに感動したので、 日本へ帰る直前にもう一度、 この 「新明亮 專業乾洗」 を利用した。 こんどは 「ズタボロにされても構わない」 衣類だけでなく、 旅行中に着た服を全て出した (最初の利用日のわずか 2日後だったが、11ポンドもあった) が、 同様に満足のいく仕上がりだった。 おかげで、 日本に帰ってから洗う必要があった衣服はほとんど無く、 帰宅後に大量の洗濯をする羽目にならずに済んだ。

実は、 帰宅翌日に自宅の洗濯機が故障して往生した (年末だったので年内に配達してもらえる洗濯機、 という条件で選んだら、 日本製は在庫がないということでハイアール製になった。 こうやって日本のメーカはシェアを失っていくのだろう)。 もし、 香港で洗濯していなかったら、 新しい洗濯機が届くまで洗濯物があふれかえって、 もっと悲惨な事態になっていたところだった。 やはり洗濯は旅行中に済ませてしまうに限る。

adb (Android Debug Bridge) 経由で rsync を使ってバックアップできるようにしてみた 〜 shell の echo back を回避する方法

$
0
0

最初の Android 4.0 端末である Galaxy Nexus は、 今までの Android 端末と異なり USB Storage として使うことができない。 PC とデータをやりとりしたいときは MTP (Media Transfer Protocol) を使えということらしい。 従来の Android 端末は、 PC と USB ケーブルで接続することによって、 Android 端末のストレージ (microSD カードなど) を USB Storage として PC からアクセスすることができた。

ただし、 PC と Android 双方から同じストレージを同時に読み書きすると破綻するので、 PC からアクセスするときは、 Android 端末からそのストレージを一時的に切り離す (umount する) 実装になっている。 このため、 ストレージに Android が必要とするデータがあると、 切り離したときに問題が起きる。 例えば着信音 (着メロ) を microSD カード上に置いていると、 切り離しているときに電話がかかってきても、 その着信音を鳴せない (Nexus S などだと、 設定した着信音がアクセスできない場合は、 デフォルトの着信音に切り替わる)。

MTP はブロックデバイス単位でなくファイル単位でストレージを管理する。 したがって PC との接続時でも Android 端末からストレージ全体がアクセスできなくなるという問題がない。 しかも MTP は Windows Vista 以降なら標準でサポートしている。 と、 このように (Samsung と Google は) 考えて、 Galaxy Nexus では USB Storage の代わりに MTP を使うようにしたのだろう (Samsung の一つ前の世代の Android 端末である Galaxy S でも MTP が使える)。 なお、 今後登場する Android 4.0 (Ice Cream Sandwich, ICS) 端末で USB Storage 機能が廃止されるかどうかは不明。 少なくとも Nexus S を ICS にシステムアップデートしても、 従来通り USB Storage を使うことができた。

一見妥当のように見える MTP の採用だが、 実際に使ってみると問題が多い。 ストレートに言えば 「全く使い物にならない」。 Windows XP だと Windows Media Player 10 以降のバージョンをインストールしないと MTP が使えないし、 Windows 以外だと、 標準で MTP をサポートしている OS はほとんどない。 しかも Windows でも、 MTP うんぬん以前に Samsung 端末用の USB ドライバを入手するのが大変。 以前は SAMSUNG_USB_Driver_for_Mobile_Phones.exe が単体で配布されていたようだが、 今は Kies をインストールしないと入手できない (-_-メ)。

さんざん苦労して MTP が使えるようにしても、 データ転送速度が極めて遅い (まだ実装がこなれてないため?)。 さらに、 普通のブロックデバイス (あるいはファイルシステム) として OS から見えないため、 MTP 対応を謳っていない限り、 普通のバックアップアップツールでは扱えないことが多い。 数MB 程度のファイルを一つ二つコピーする程度であればさほど問題無いが、 バックアップなど大量のデータを転送したい場合は不向き。

私の場合、 Galaxy Nexus のストレージ (/mnt/sdcard パーティション, 実際には /data/media を FUSE で /mnt/sdcard に mount している) を毎日 PC (Linux マシン) へバックアップしたい。 全部で数GB の大きさがあるので、 全データを毎回コピーするのは非現実的。 そこで rsync backup for Android アプリを使ってみた。 このアプリは、 内部に rsync と ssh コマンドを持っていて、 rsync を以下のような形で実行している:

/data/data/eu.kowalczuk.rsync4android/files/rsync -vHrltD \
    --chmod=Du+rwx,go-rwx,Fu+rw,go-rw --no-perms --delete-after \
    -e '/data/data/eu.kowalczuk.rsync4android/files/ssh -y -p 22 \
            -i /data/data/eu.kowalczuk.rsync4android/files/dss_key' \
    /mnt/sdcard/ sengoku@senri.gcd.org:~/android/sdcard/

Galaxy Nexus には有線LAN が無いので WiFi 経由で通信することになるが、 PC 同士で rsync する場合と全く同じで、とても簡単。 Android も Linux なのだから、 MTP みたいな得体の知れないものを無理に使うより、 使い慣れた rsync の方が断然 (・∀・)イイ!!

とはいえ、 使ってると WiFi の通信の遅さが気になってきた。 「USBテザリング」 を使えば USB ケーブル経由で TCP/IP 通信を行なうこともできるが、 rsync でデータ転送を行なうためだけにテザリングするのは牛刀な感じが否めない。 また、 テザリングの場合 Android の default route が 3G 回線へ向いてしまうので、 特定のアドレス (プライベート IP アドレス) を USB へ向ける route 設定が必要。

そもそも Android 端末と PC とは adb (Android Debug Bridge) でデータをやりとりしているのだから、 rsync も adb 上で行ないたいと思うのが人情というもの。

前フリが長くなったが、ここからが本題。

PC 上で adb コマンドを使うと、 任意のコマンドを Android 上で実行できる。 例えば、 Android 上で tar コマンドを実行することによって Android 上のディレクトリを PC へコピーできる:

senri:~ $ adb shell 'tar cf - /mnt/sdcard/media 2>/dev/null' | tar xvf -
tar: Record size = 8 blocks
drwxrwxr-x root/sdcard_rw    0 2010-07-15 10:39 mnt/sdcard/media/
drwxrwxr-x root/sdcard_rw    0 2010-07-15 10:39 mnt/sdcard/media/audio/
drwxrwxr-x root/sdcard_rw    0 2012-01-08 00:22 mnt/sdcard/media/audio/notifications/
	...

「tar cf - /mnt/sdcard/media 2>/dev/null」 が Android 上で実行するコマンド。 STDERR (「2>」, 標準エラー出力) を /dev/null へリダイレクトしているのは、 tar が STDERR へ出力したエラーメッセージが、 転送データ (STDOUT へ出力される) と混じるのを防ぐため。

このように Android 上で実行したコマンドの出力は、 PC 側へ伝わるが、 その逆、 PC 上で実行したコマンドの出力は Android へは伝わらない。 例えば次のように実行しても、 文字列 「test」 は Android 側に伝わらず、 cat コマンドは何も出力しない:

senri:~ $ echo test | adb shell cat

これは、 PC 側で実行した adb コマンドにおいて、 adb の STDIN (標準入力) から入力されたデータ (上記の例だと、 文字列 「test」) を、 Android 側へ送る実装になっていないため。 以下のパッチをあてることにより adb の STDIN を、 そのまま Android 上で実行したコマンドの STDIN へ伝えるようにすることができる:

--- system/core/adb/commandline.c.org	2012-01-29 09:28:25.000000000 +0900
+++ system/core/adb/commandline.c	2012-01-29 08:48:54.987004744 +0900
@@ -270,6 +270,35 @@
     free(buf);
 }
 
+static void *raw_read_thread(void *x)
+{
+    int fd, fdi;
+    unsigned char buf[1024];
+    int r;
+
+    int *fds = (int*) x;
+    fd = fds[0];
+    fdi = fds[1];
+    free(fds);
+
+    for(;;) {
+        /* fdi is really the client's stdin, so use read, not adb_read here */
+        D("raw_read_thread(): pre unix_read(fdi=%d,...)\n", fdi);
+        r = unix_read(fdi, buf, 1024);
+        D("raw_read_thread(): post unix_read(fdi=%d,...)\n", fdi);
+        if(r == 0) break;
+        if(r < 0) {
+            if(errno == EINTR) continue;
+            break;
+        }
+        r = adb_write(fd, buf, r);
+        if(r <= 0) {
+            break;
+        }
+    }
+    return 0;
+}
+
 static void *stdin_read_thread(void *x)
 {
     int fd, fdi;
@@ -1022,6 +1051,12 @@
             D("interactive shell loop. buff=%s\n", buf);
             fd = adb_connect(buf);
             if(fd >= 0) {
+		adb_thread_t thr;
+		int *fds;
+		fds = malloc(sizeof(int) * 2);
+		fds[0] = fd;
+		fds[1] = 0;
+		adb_thread_create(&thr, raw_read_thread, fds);
                 D("about to read_and_dump(fd=%d)\n", fd);
                 read_and_dump(fd);
                 D("read_and_dump() done.\n");

raw_read_thread は、 adb コマンドの STDIN から入力されたデータを、 そのまま Android へ送るスレッド。 system/core/adb/commandline.c で定義されていた stdin_read_thread を若干書き換えただけ。

で、上記パッチをあてた adb を試してみると...:

senri:~ $ echo test | adb shell cat
test
test

ありゃ? なんで 「test」 が二度出力されるんだ?

Android 側では adbd (デーモン) が動いていて、 PC 側で 「adb shell コマンド列」 を実行すると、 それを受けて adbd は、 Android 上で 「/system/bin/sh -c コマンド列」 を実行する。 一般にシェル (この場合は /system/bin/sh) は、 対話 (interactive) モードだと STDIN から入力されたデータを、 そのまま STDOUT へエコーバック (echo back) する。 「test」 が二度出力されたのは、 エコーバックによる出力と、 cat コマンドの出力なのだろう。

でも、 なんで対話モードになってしまっているのだろう? フツー、 「-c」 オプション付でシェルを実行するときは、 非対話モードにするものだと思うのだけど... と思って adbd のソースを読むと、 「-c」 オプション付で /system/bin/sh を実行するときまで、 擬似端末 (Pseudo Terminal, pty) を使っていた。 これってバグじゃないのか? と思いつつ、 「-c」 オプション付の時は疑似端末を使わずに /system/bin/sh を実行するパッチを書いてみた:

--- system/core/adb/services.c.org	2012-01-29 09:28:25.000000000 +0900
+++ system/core/adb/services.c	2012-01-31 14:38:28.735416305 +0900
@@ -275,46 +275,54 @@
     return -1;
 #else /* !HAVE_WIN32_PROC */
     char *devname;
-    int ptm;
+    int fds[2];
 
-    ptm = unix_open("/dev/ptmx", O_RDWR); // | O_NOCTTY);
-    if(ptm < 0){
-        printf("[ cannot open /dev/ptmx - %s ]\n",strerror(errno));
-        return -1;
-    }
-    fcntl(ptm, F_SETFD, FD_CLOEXEC);
-
-    if(grantpt(ptm) || unlockpt(ptm) ||
-       ((devname = (char*) ptsname(ptm)) == 0)){
-        printf("[ trouble with /dev/ptmx - %s ]\n", strerror(errno));
-        adb_close(ptm);
-        return -1;
+    if (arg1) {
+	if (adb_socketpair(fds)) {
+	    printf("[ cannot open socketpair - %s ]\n",strerror(errno));
+	    return -1;
+	}
+    } else {
+        fds[0] = unix_open("/dev/ptmx", O_RDWR); // | O_NOCTTY);
+        if(fds[0] < 0){
+	    printf("[ cannot open /dev/ptmx - %s ]\n",strerror(errno));
+	    return -1;
+	}
+	fcntl(fds[0], F_SETFD, FD_CLOEXEC);
+
+	if(grantpt(fds[0]) || unlockpt(fds[0]) ||
+	   ((devname = (char*) ptsname(fds[0])) == 0)){
+	    printf("[ trouble with /dev/ptmx - %s ]\n", strerror(errno));
+	    adb_close(fds[0]);
+	    return -1;
+	}
     }
 
     *pid = fork();
     if(*pid < 0) {
         printf("- fork failed: %s -\n", strerror(errno));
-        adb_close(ptm);
+        adb_close(fds[0]);
+	if (arg1) adb_close(fds[1]);
         return -1;
     }
 
     if(*pid == 0){
-        int pts;
-
         setsid();
 
-        pts = unix_open(devname, O_RDWR);
-        if(pts < 0) {
-            fprintf(stderr, "child failed to open pseudo-term slave: %s\n", devname);
-            exit(-1);
-        }
-
-        dup2(pts, 0);
-        dup2(pts, 1);
-        dup2(pts, 2);
+	if (!arg1) {
+	    fds[1] = unix_open(devname, O_RDWR);
+	    if(fds[1] < 0) {
+                fprintf(stderr, "child failed to open pseudo-term slave: %s\n", devname);
+		exit(-1);
+	    }
+	}
+
+        dup2(fds[1], 0);
+        dup2(fds[1], 1);
+        dup2(fds[1], 2);
 
-        adb_close(pts);
-        adb_close(ptm);
+        adb_close(fds[1]);
+        adb_close(fds[0]);
 
         // set OOM adjustment to zero
         char text[64];
@@ -335,7 +343,8 @@
         // Let the child do it itself, as sometimes the parent starts
         // running before the child has a /proc/pid/oom_adj.
         // """adb: unable to open /proc/644/oom_adj""" seen in some logs.
-        return ptm;
+	if (arg1) adb_close(fds[1]);
+        return fds[0];
     }
 #endif /* !HAVE_WIN32_PROC */
 }

「-c」 オプション付の時は 「arg1」 が非0 になるので、 「if (arg1) { ... }」 において、 adb_socketpair(fds) を呼び出して socketpair を用意する。 「arg1」 が 0 の時は、 unix_open("/dev/ptmx", O_RDWR) によって疑似端末が用意されるので、 「-c」 オプション無しの時はエコーバックが行なわれる。

adbd は /sbin/adbd にあって、 Android の場合 /sbin は initramfs のものがそのまま使われるので、 /sbin/adbd を書き換えても再起動すると元に戻ってしまう。 initramfs を書き換える (つまり boot.img を書き換える) とシステムアップデートの時に面倒なので、 以下のスクリプトを起動時に走らせることにした:

if [ -x /data/cust/sbin/adbd -a ! -f /sbin/adbd.org ]; then
    mount -oremount,rw null /
    mv /sbin/adbd /sbin/adbd.org
    cp -a /data/cust/sbin/adbd /sbin/
    mount -oremount,ro null /
    stop adbd
    start adbd
fi

起動時にスクリプトを実行するには、 /system/etc/install-recovery.sh に書き加えておけばよい。 Galaxy Nexus の場合、 もともとこのファイルは存在しないが、 従来の Android と同様、 このファイルが存在すれば起動時に実行される

以上で、 adb 経由で rsync が使えるようになる。 例えば以下のように実行すると、 Android 上の /mnt/sdcard を、 PC 上の ~/android/sdcard へ丸ごとバックアップできる:

senri:~ $ rsync --delete -av -e adb shell:/mnt/sdcard ~/android/
receiving incremental file list

sent 511 bytes  received 210692 bytes  46934.00 bytes/sec
total size is 5859784477  speedup is 27744.80

本来 rsync は ssh を呼び出して remote host との通信路を確保するが、 「-e」 オプションで ssh の代わりに使うコマンドを指定できる。 上記の例だと、 rsync は adb を以下のような引数をつけて呼び出す:

adb shell rsync --server --sender -vlogDtpre.iLsf . /mnt/sdcard

シンガポールで SingTel と StarHub プリペイド SIMカードを買ってみた

$
0
0

チャンギ国際空港 Terminal 3 に着いて入国審査を終えると、 (Baggage Claim に行く前の) Transit Lounge に RHB Bank の両替所があって、 SingTel の Prepaid SIM を購入できた。 支払いは現金のみだが、 入国審査ゲートを抜けた直後に ATM があり、 既にシンガポールドルを得ていたので、 スムーズに SIM を購入できた (もっとも、両替所なのだから日本円でも買えるはず)。 と、ここまで飛行機を降りてから (入国審査も含めて) 10分もかかっていない。 初めて訪れた国で、 ここまで手早く SIM を購入できたのは初めて。

RHB Bank Currency Exchange

RHB Bank 両替所 ↑ の裏は UOB (大華銀行) の両替所になっていて、 そこでは StarHub の SIM を購入できたことを後で (出国時に) 知った。 「裏には UOB の両替所があるよ!」 って看板を出しておいて欲しい... 入国時は時間がない (荷物が出て来る前に Baggage Claim にたどり着きたい) のだから、 カウンターをぐるっと回って裏まで見に行っている余裕はない。

パックツアー (といっても空港⇔ホテルの送り迎え以外は全日程終日自由行動) なので SIM を購入するなどの (他のツアー客を待たせる) 単独行動は慎まなければならないが、 この空港のように Baggage Claim 以前に (SIM を売ってる) 両替所があると、 荷物が出てくるまでの時間を有効に活用できるので、 とても助かる。

ただし、 街中では S$15 (約 900円) で売ってる額面 S$18 の SIM は空港内では買えず、 S$28 (約 1700円) あるいは S$50 のみ。 StarHub (後述) も、SIM (S$15) だけで買うことはできず、 Top-Up カードと抱き合わせ。 さらに、 空港ではデータ通信専用の SIM は売っていないらしい (未確認)。 私にとって通話機能は必須 (妻との連絡のため) なので、 データ通信専用 SIM には興味がなく、 売ってるか否かの確認はしていない。 街中だと数多くの SIM から好きな電話番号の SIM を選べたりもするので、 急いでいるのでなければ街中で買った方がいいかも。

税関を抜けてツアーガイドに会ったら、 他のツアー客はまだ出てきていないとのことなので、 もう一枚、 別のキャリアの SIM を買おうと思って到着ロビーを見渡す。 UOB (大華銀行) の両替所があったので、 StarHub の SIM を購入した。 シンガポールには SingTel と StarHub の他に M1 もあるが、 あいにく M1 Shop は少し離れたところ (到着ロビー中央) にあって目に入らなかった。

StarHub MaxMobile ホテルに向かうツアーバスの中で、 StarHub の SIM を Galaxy Nexus に入れてみる。 「98500000」 をダイヤルして SIM カードを activate. 次に 「*131#」 にダイヤルすると、 左の写真のような表示 (クリックで拡大) になる。

電話アプリに、 こんなメッセージを表示したり、 こちらからの返答を送信したりする機能があったとは。 USSD (Unstructured Supplementary Service Data) って言うらしい。 2G 時代の昔からあるプロトコルだが、 (「*〜#」 へダイヤルして終わりとするのではなく) ユーザからの入力を求める場面で使われるケースは珍しいように思う。 SMS に似ているが、 USSD は 182 文字までの通信で、 SMS と違ってセッション中は接続しっぱなしらしい。

私は 「1GB at S$7 (7D)」 つまり S$7 (約 420円) で 7日間有効な 1GB プランを選んだ。 転送データ量が 1GB を超えた場合にどうなるか (1GB ごと自動的に S$7 引かれるのか、 1GB に達した時点で通信不能になるのか、 はたまた S$0.27/KB の従量課金になるのか) は不明。 「3」 を送信すると確認画面が表示されるので 「Confirm」 するとデータ通信できるようになる。

続いて、 SingTel の SIM を (妻の) Galaxy Note に入れた。 こちらは activate 不要で即、使える。 試しに Galaxy Nexus から電話をかけてみたら、 無事 Galaxy Note が鳴った。 データ通信を行なうには、 APN として 「hicard」 を設定する。 5MB までのデータ通信が無料で可能。 5MB くらいはスマホだとすぐ使い切ってしまうので、 「727050」 へ 「3」 とだけ書いた SMS を送る。 すると、 以下の SMS が 727011 から届いた:

Pls reply with the options:
1. Check for existing Data bundle/expiry date for Notebook/Tablet
2. Subscribe to Data bundle for Notebook/Tablet

送信元の電話番号は (少なくとも) 下3桁の部分は毎回変わる。 選択は SMSアプリでフツーに返信すればよい。 USSD による操作方法を見た後だと、 SMS による操作はやぼったく見える。 「2」 を返信すると、 以下の SMS が 727012 から届いた:

Pls reply with the options:
1. Value Surfer 10MB @ $1 valid for 7 days
2. Super Surfer 1GB @ $7 valid for 7 days
3. Unlimited Data Plan @ $6. Valid for 1 day
4. Unlimited Data Plan @ $15. Valid for 3 days
5. Unlimited Data Plan @ $25. Valid for 7 days

私は 「2」 を返信した。 つまり 7日間有効な 1GB プラン。 無制限データプランも魅力的だったのだが、 5日間の滞在で 1GB 以上使うとは思えなかったため。

すると、 確認を求める以下のような SMS が 727015 から届いたので、

You have selected to buy Super Surfer Pack of 1GB. $7 will be deducted from your Main Account balance. To confirm, reply 1.

「1」 を返信した。

以上で、 2枚の SIM とも通話・通信が可能になった。 両 SIM とも HSPA (High Speed Packet Access) によるデータ通信が可能だが、 1Mbps 程度の転送速度しか出ていなかったように思う。 StarHub の方が下り 2Mbps くらいまで出ることがあるものの、 上りに関しては StarHub は (場所によっては) 速度の低下が著しく (100kbps 以下になる)、 SingTel の方が安定していた。 両 SIM とも (観光地など) 人が大勢集まる場所では接続できないケースが頻発し、 (同程度にサービスエリアが狭い) 香港と比べるとインフラ整備が追い付いていないような印象を受けた。

StarHub は、 Galaxy Nexus に初めから登録されていた APN 「internet」 のままでも通信できたが、 場所によっては接続ができないこともあったため、 「shppd」 に設定し直した。 「shppd」 は StarHub PrePaiD の意味だと思うが、 この設定が必須かどうかは不明。

その晩、 ホテルに戻って Galaxy Nexus (StarHub SIM) をポータブルWi-Fiアクセスポイント (いわゆるテザリング) として利用したら、 (このアクセスポイントに接続した) ノート PC で WWW ブラウズがほとんどできなくて驚いた。 ssh だとそれなりに通信できるので、 TCP/IP セッションを短時間に大量に張ろうとすると、 パケット落ちが著しいのだと思われる。 画像がたくさんある WWW ページ (きょうび、そういうページばかりだけど) をアクセスしようとすると、 全くといっていいほど画像が表示できない。

これでは使い物にならないと思い、 Galaxy Note (SingTel SIM) をポータブルWi-Fiアクセスポイントとして利用したら、 (1Mbps 程度なので速くはないが) それなりに WWW ブラウズもできる。 下り転送速度だけを見ると StarHub の方がむしろ速く見えるだけに、 ユースケースに合わせた評価方法が重要と再認識。

いくら下り通信速度が速くても、 わたし的にはホテルでテザリングができなければ論外なので、 翌朝ホテル近くのセブンイレブンで SingTel の SIM を買い直した。 パスポート等を提示する必要があるが、 (空港と違って) S$15 で買えるし、 複数の SIM の中から好きな電話番号の SIM を選ぶことができる。

ホテルに戻って、 朝食を食べながらデータ通信の設定を行なう。 シンガポール滞在は 3日後の 15:00 まで (78時間くらい) なのだけれど、 ものは試しと 「4. Unlimited Data Plan @ $15. Valid for 3 days」 つまり 3日間有効な無制限データプランにしてみた。 これでテザリングも転送量を気にせず行なえる。 最終日は使えなくなってしまうが、 (7日間データ通信できる) StarHub の SIM もあるから構わないかな... と思っていたら、 72時間が経過した後 (初日を 1日目と数えれば 4日目の朝) も問題無く使えてしまった。 飛行機に搭乗した 15:30 ギリギリまで通信できたのは何故なんだろう...?

S$20 未満の SIM だと有効期限が 120日 (S$20 以上だと 180日)。 幸い、 Online Top-Up がクレジットカードで可能であるようなので、 期限切れになる前に Top-Up を行なえば、 シンガポールを訪れなくても SIM を維持し続けることが可能 (と思われる)。


新規一括 0円の Galaxy Nexus (SC-04D) を買ってみた 〜 国際版 Galaxy Nexus と全く同じにする

$
0
0

mandatory option よほど在庫が積み上がってるのか、 ドコモ SC-04D Galaxy Nexus が新規一括 0円で売っていた。 あんなに大々的な宣伝を行なっておいて何をやってるんだか...

私が見た店は、 0円の条件として、 ひとりでも割50 が必須。 つまり 2年間の契約期間中に割引サービスを廃止 (あるいは回線ごと解約) する場合は、 9,975円の解約金が必要となる。 契約事務手数料 3000円の他、 初月のみ 「パケ・ホーダイ ダブル2定額」 など諸々のオプション (写真→) を付ける必要があり、 違約金以外に 5000〜7000円ほどかかる。 加入条件のオプションの多さに圧倒されるが、 「パケホダブル」 以外のオプションは初月無料がほとんどで、 今月中に解約すれば費用はかからない。 パケホダブルは月額2,100円だが日割が適用されるので、 月末近くに契約すればもっと安くなる (あいにく私が買ったのは月初だが)。

なんたって Galaxy Nexus である。 わずか 3ヶ月前に HK$5398 (約 54,000円) もしたケータイが、 2万円かからずに入手できるのは見逃せない。 思わず衝動買い (0円なので 「買った」 とは言えない?) してしまった。

SC-04D System Update Dialog 帰宅して SC-04D の電源を入れようとすると... う、電源が ON のままだったか。 てっきりショップで電源を OFF にして渡してくれたものと思い込んでいた。 そしてディスプレイが点灯してそこに表示されたのは、 無情な 「システムアップデート」 の文字。

あとで分かったが、 ショップを出て帰宅するまでの短い時間に、 9.3MB ものアップデートファイル (yakjusc_ITL41D_to_ICL53F.zip) が転送されていて、 この日のパケット代が、 いきなり 3800円。 SC-04D を安く入手しようという目論見が、いきなりパー。 なにもこんなタイミングでアップデートファイルを送りつけなくても... 無線LAN に接続するまで待って欲しかった。

で、 こんなアップデートのお知らせはサックリ無視して真っ先に行なったのは、 ブートローダのアンロック (fastboot oem unlock)。 いきなりドコモの保証がパー。

一度フツーに起動させてフラッシュメモリの初期化を行なった後 (一度フツーに OS を起動しないと、 フラッシュメモリにアクセスできない)、 Clockwork Mod Recovery を fastboot で起動する (fastboot boot <kernel>)。 そして、 初期状態のドコモ純正ROM を、 ベースバンド込みで丸ごとバックアップ。 これでいつでも元の状態に戻せるようになったので、 ClockworkMod Recovery をフラッシュメモリの 「recovery」 領域 (リカバリ用のカーネルを格納する領域) に書込む (fastboot flash recovery <kernel>)。

senri:~ $ fastboot oem unlock
...
OKAY [ 52.022s]
finished. total time: 52.022s
senri:~ $ fastboot boot recovery-clockwork-5.5.0.2-maguro.img
downloading 'boot.img'...
OKAY [  0.553s]
booting...
OKAY [  0.329s]
finished. total time: 0.882s
senri:~ $ adb shell
~ # dd if=/dev/block/platform/omap/omap_hsmmc.0/by-name/radio of=/sdcard/SC04DOMKKD.img bs=1024
16384+0 records in
16384+0 records out
16777216 bytes transferred in 6.601 secs (2541617 bytes/sec)
~ # exit
senri:~ $ adb pull /sdcard/SC04DOMKKD.img
4569 KB/s (16777216 bytes in 3.585s)
senri:~ $ mkdir backup
senri:~ $ adb pull /sdcard/clockworkmod/backup/ backup/
pull: building file list...
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/nandroid.md5 -> backup/2012-03-04.01.09.21/nandroid.md5
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/cache.ext4.tar -> backup/2012-03-04.01.09.21/cache.ext4.tar
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/data.ext4.tar -> backup/2012-03-04.01.09.21/data.ext4.tar
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/system.ext4.tar -> backup/2012-03-04.01.09.21/system.ext4.tar
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/recovery.img -> backup/2012-03-04.01.09.21/recovery.img
pull: /sdcard/clockworkmod/backup/2012-03-04.01.09.21/boot.img -> backup/2012-03-04.01.09.21/boot.img
6 files pulled. 0 files skipped.
4308 KB/s (384848109 bytes in 87.229s)
senri:~ $ fastboot flash recovery recovery-clockwork-5.5.0.2-maguro.img
sending 'recovery' (5300 KB)...
OKAY [  0.552s]
writing 'recovery'...
OKAY [  1.015s]
finished. total time: 1.567s

再び通常起動して、 (今度は抜かり無く) 無線LAN の設定を行なってから、放置 (念のため、 「データ通信を有効にする」 を無効にしておく)。 ほどなく再びアップデートファイルがダウンロードされてきた。

フラッシュに書込んだ ClockworkMod Recovery を起動して、 /cache に格納されていた 94ec403ff247.update_yakjusc_ITL41D_to_ICL53F.zip (アップデートファイル) を /sdcard へコピー。 で、ClockworkMod Recovery からこの zip ファイルをインストール。 この時点で (ClockworkMod Recovery を書込んだ) recovery 領域は、 ドコモ (というか Google) 純正リカバリ用カーネルで上書きされる。

これでビルド番号が ICL53F.SC04DOMLA1 になった。 ちなみに末尾の 「LA1」 というのは、 「L」 が 2012年 (L は 12番目のアルファベットだから) を意味し、 その次の 「A」 が 1月 (A は 1番目のアルファベット) を意味し、 その次の 「1」 は、 その月にリリースされた最初のバージョンであることを意味する。

「L53F」 も同様に、 「L」 が 2011年第4四半期 (2009年第1四半期を A として) を意味し、 「53」 が、 その四半期で 53日目であることを意味し、 「F」 は同じ日の 6番目のリリースであることを意味するらしい。 先頭の 「I」 は、 Ice Cream Sandwich の頭文字。

このバージョンのドコモ純正ROM も、 上記と同様に ClockworkMod Recovery を使って、 ベースバンド込みで丸ごとバックアップ。 無線LAN の設定を行なったので厳密には初期状態ではないが、 初期化するのが面倒なので、 まあよしとする。

以上で、 いつでもドコモ純正ROM に戻る手段を確保できたので、 ここでドコモ純正ROM にサヨナラする。 私が普段使ってる Galaxy Nexus (3ヶ月前に香港で買った) を丸ごとバックアップし、 そのバックアップファイルを SC-04D へ、 ClockworkMod Recovery を使って丸ごとリストア (もちろん、リストアする代わりに Google 純正ROM を書き込んで、 国際版の初期状態にしてもよい)。

Galaxy Nexus * 2 左が香港で買った Galaxy Nexus i9250 GSM (もちろん SIM ロックフリー),
右が今回買ったドコモ SC-04D

裏ブタ記載の文字が異なる (なぜ SC-04D には Google ロゴがない?) 他は、 全く同じ外観。 丸ごとリストアしたので、 フラッシュメモリの中身も全く同じ (もちろん IMEI など、端末固有のデータは異なる)。

丸ごとリストアしたことによって OS も書き換えてしまったので、 ドコモのテザリングの制約 (勝手に APN が dcmtrg.ne.jp に切り替わるとか) から解放される (はず)。 「パソコンなどの外部機器を接続した通信」 ではなく スマートフォン定額通信の範囲でテザリングできるはずだが、 私は興味がない (ドコモは今月一杯で解約するつもりだし) ので試していない。 OS が書き変わっても、 IMEI 上は 「ドコモ純正端末」 なので、 フツーに spモードを利用できる。 こうなってくると、 ドコモが何のために接続する端末の IMEI を制限しているのか分からなくなる。

二つの Galaxy Nexus の OS は同じになったが、 SC-04D にはまだ SIM ロックがかかっている。 ドコモショップで SIMロック解除の手続きを行なってくれるが、 ブートローダをアンロックした Nexus も対象となるのか? ブートローダだけならまだしも、 OS ごと入れ替えてしまっていても拒否されないのか?

SIMロックは、 (Samsung製) Android 端末の場合 /data/radio/nv_data.bin などで設定されている。 このファイルを 「正しく」 書き換えることができれば SIMロックを解除できるのだが、 このファイルが改変されていないか検証するために、 /data/radio/nv_data.bin.md5 に MD5 値が保存されている。 そして残念なことに、 この MD5 の算出方法が不明。 もちろん、 単純に nv_data.bin の MD5 を算出するだけではダメで、 何らかの秘密の seed が必要なのだと思われる (ファイル名の通り MD5 が使われていると仮定してだが)。

MD5 の値が一致しなかったなどの理由で検証にパスしなかった場合、 あるいは (Android を初期化したなどの理由で) そもそも /data/radio/nv_data.bin が存在しなかった場合は、 /factory/nv_data.bin を使って /data/radio/nv_data.bin が作られる。 ところが、 /factory/nv_data.bin にも、 /factory/nv_data.bin.md5 があって、 その内容が書き換えられないように保護されている。

/factory/nv_data.bin が検証をパスしないと、 /factory/.nv_data.bak が使われるらしい。 何段もの防御があって、 なかなか突破するのが難しそうである。 そこで、 改変した nv_data.bin を /factory/nv_data.bin と /factory/.nv_data.bak にコピーして、 検証が通らなくて書き戻そうにも、 本来の nv_data.bin を参照できないようにしてみた。

すると... 驚いたことに、 ドコモ以外の SIM でも使えてしまった。 google で検索すると、 あちこちで SIMロックの解除方法を説明したページが見つかるが、 ほとんど (全て?) は同様の方法であるようだ。 しかし、 この方法には重大な欠点がある。 それは、 IMEI の値が 「004999010640000」 になってしまう点。 キャリア側で IMEI の値をチェックしていなければ、 そのまま使えてしまうのかもしれないが、 これでは 「ここに不正改造無線局があります〜」 と吹聴して歩き回るのと大差なく、 甚だ具合がよろしくない。

SIM Unlock PIN というわけで万策尽きたので、 解除コード (Unlock Code) を業者から買うことにした。 だいたい $30 前後で、 ドコモ (3,150円) より若干安い。 この期に及んでドコモのサービスを使わないのは、 前述した懸念点があるのと、 ドコモショップでは 「解除PIN」 を教えてもらえなかった、 という話をネット上で見かけたため。

ドコモショップの店長が、 「このコードはドコモの内部情報になるため、お客様にはお伝えできません」 と言ったらしいが、 この話が本当なら、 とんでもない話だと思う。 3,150円も取っておきながら PIN 一つ教えないとはどーいうことだ。

ドコモショップで SIM ロック解除したケータイを海外に持って行き、 現地の SIM を入れて電源を入れたら、 「SIMネットワークのロック解除PIN」 を入力する画面になってしまい往生した、 という怨嗟の声をネット上で見かけるが、 おそらく何らかの理由で /data/radio/nv_data.bin の内容が壊れてしまい、 /factory/nv_data.bin の内容で書き戻されたために、 ロック解除PIN の入力が必要になってしまったものと思われる。

つまり、 ロック解除PIN を入力して SIM ロックを解除した後、 /data/radio/nv_data.bin および /data/radio/nv_data.bin.md5 を /factory へコピーしておけばこのような事態に陥ることを回避できる。 ただし、 Android の root 権限が必要。 root 権限がないと、 そもそも /data/radio/nv_data.bin を読むことができない。 だから、 何かあったときのため、 ロック解除PIN を記録しておくことが重要。

Cell Unlocker .net で、 device 名として 「Galaxy Nexus」、 SIM ロック先のキャリアとして、 「All Asia Countries」 を指定し、 IMEI (「*#06#」 をダイヤルすると表示される) を入力した。 すると PayPal の支払い画面に遷移するので、 $29.99 の支払いボタンを押すだけ。

7時間半後、 ロック解除PIN が書かれたメールが送られてきた。 メールには、

Video proof will be required if code does not work, it's a good idea to film inputting the unlock code so we can help trouble shoot what the problem is.

と書かれていたので、 まず、 デジカメ (ビデオカメラは持ってない) を三脚にセットして動画撮影する準備を整えた。 SingTel の SIM (ドコモ以外ならどこでも) を SC-04D に入れて電源を入れる。 すると、 ↑ の写真にあるような 「SIMネットワークのロック解除PIN」 を入力する画面になったので、 デジカメで動画撮影しつつ、 メールに書かれていた unlock code を入力した。 すると、 「ネットワークのロック解除をリクエスト中...」 と表示され、 すぐ 「ネットワークロックを解除しました。」 と表示された。 数秒後、 Android のホーム画面が表示された。

以上で、 二つの Galaxy Nexus は (IMEI 以外は) 完全に同じになった。 今まで Galaxy Nexus で使っていた Softbank SIM を、 SC-04D に入れて、 今後は SC-04D のほうを使ってみようと思う。 普通に使っている限り、 たぶん、何の違いも見いだせないに違いない。

2012年6月11日 追記:

Galaxy Nexus Campaign

この SC-04D を 3ヶ月以上使っているが、 国際版 Galaxy Nexus との違いは全く感じられない。 ハワイで、 at&tT-Mobile の SIM を、 そしてロンドンで、 Vodafone, Three, T-Mobile, O2, giffgaff の各 SIM を使ってみたが、 いずれも全くフツーに 3G で使うことができた。 SC-04D は日本のキャリアが販売した端末の中で (私にとって) 「使える」 最初の (そしておそらく最後の) 端末。

私が SC-04D を新規一括 0円で入手したのが 3月3日。 当初、 3月中にオプションを全て解約して、 基本料金 (月額 980円) のみで運用する (つまり通話・通信を一切しない) つもりだったが、 3月14日に 「他社から乗り換えで最大 50,000円のキャッシュバック」 をうたったケータイショップを見つけた。 au へ MNP し、 誰でも割、 EZ WIN (月額使用料 300円)、 安心ケータイサポート (月額 300円)、 auスマートパス (月額情報料 390円) を契約して、 2ヶ月後の 5月15日まで維持すれば、 現金で 5万円もらえるらしい。

au の端末は海外で使えない (海外ローミングはバカ高いから論外) ので au には全く興味がないのだが、 現金をもらったあと解約して構わないとのことなので、 au へ MNP してみることにする。 (ドコモから au へ MNP したときの) ドコモの 「ひとりでも割50」 解約金 9,500円+税、 MNP 手数料 2,000円+税、 au の契約事務手数料 3,000円+税、 および (au を解約したときの) 「誰でも割」 の契約解除料 9,500円+税を払っても (計 25,200円) お釣りが来そう、 と考えた次第。

そのケータイショップから 50m と離れていないドコモショップへ行って、 MNP を申し込む。 5分とかからず MNP 予約番号を教えてもらう。 で、 ケータイショップに戻って au へ MNP した。 両ショップが近くにあるので便利。 ちなみに (DoCoMo→au の時は用がないが) au ショップも 50m 圏内にある。

というわけで、 ドコモの契約期間は、 3/3 〜 3/13 の 11日間となった。
この期間の基本料金は 332円。 内訳 ↓

内訳金額(円)
基本使用料 (FOMAタイプSS_バリュー) [日割] 661
ファミ割MAX50/ひとりでも割50 [日割] -330
通話料・通信料 0
ユニバーサルサービス料/基本 [日割] 1

ドコモに払う手数料の合計は 14,500円になる:

内訳金額(円)
契約事務手数料 3,000
ファミ割MAX50/ひとりでも割50解約金 9,500
携帯電話番号ポータビリティ手数料 (転出) 2,000

SC-04D を新規一括 0円で購入するための条件だったオプションは多かったが、
初月無料 (あるいは割引) がほとんどなので、 合計わずか 104円:

内訳金額(円)
iモード/メール等含む [日割] 106
ISPセット割引料(iモード) [日割] -54
spモード/メール等含む [日割] 106
ISPセット割引料(spモード) [日割] -54
留守番電話 [日割] 106
キャッチホン [日割] 70
メロディコール基本 [日割] 35
オプションパック初回割引料(spモード) [日割] -211
Uスタンダードプラン [日割] 177
Uスタンダード初回申込割引料 [日割] -177
iチャネル利用料 [日割] 53
iチャネル初回申込割引料(spモード) [日割] -53
ドコモ地図ナビ利用料 [月額] 300
ドコモ地図ナビ初回申込割引料 (iモード) [月額] -300
ドコモドライブネット 300
ドコモドライブネット初回申込割引料 -300
ケータイ補償380 [日割] 134
ケータイ補償お届け初回申込割引料 [日割] -134

で、 バカにならないのが通信料で、合計 4,254円:

内訳金額(円)
パケ・ホーダイ ダブル2定額料 [日割] 1,870 1,871円の通信料を含む
FOMAパケット通信料 [一般] 266 計5,309パケット
FOMAパケット通信料 スマートフォン定額 3,989 計79,796パケット
パケ・ホーダイ ダブル2無料通信適用額 -1,871

前述した 「システムアップデート」 さえ無ければ、 日割の定額料 1,870円に限りなく近くすることができたはず。 「システムアップデート」 のおかげで 2400円ほどの損失。

以上、 合計で 19,190円。 これに消費税等相当額 959円が加わって、 ドコモに支払った金額は、 合計 20,149円となった。

au へ MNP して購入した端末は HTC EVO 3D ISW12HT。 もちろん一括 0円。 今度こそ通信料を限りなく 0円に抑えることを心に誓って、 プランEシンプルを契約。 プランE は 1パケットでも通信すると au.NET 利用料 500円がかかってしまうが、 通話・通信を全くしなければ最安のプラン。

当初、 SIM を抜いておけばパケット通信を 0 にすることなんてたやすいと思っていたが、 ISW12HT は au IC カード非対応らしい。 仕方ないので 2ヶ月の間、 電源オフのまま放置しておいた。

そうして迎えた 5月15日、 朝一番にケータイショップへ 5万円をもらいに行く。 3分とかからず、 無事キャッシュバックを受け取ることができた。 その足で、 50m と離れていない au ショップへ行って、 au 解約。

au のページには、 解約に必要なものとして、

  • ご印鑑 (法人の場合は法人印)
  • ご本人さま確認書類 (原本)
  • 現在ご利用中のau電話本体
    ICカード対応機の場合は本体とauICカードをお持ちください。

などと書いてあったが、 ハンコを押せとは言われなかった (サインは求められた) し、 電話本体も特に必要ないとのことで、 運転免許証だけで用が済んだ。 3分とかからず解約手続き完了。 ショップを出て EVO 3D でダイヤルすると、 端末のアンテナ表示は 3本立っているが、 受話口から発信音が出続けて発呼できない状態になっていた。 これで通話・通信料の心配なしに EVO 3D をいじり倒せる。

というわけで、 au の契約期間は、 3/14 〜 5/14 の約 2ヶ月間となった。

3月(17日間)4月(30日間)5月(14日間)
基本使用料 (プランEシンプル) 862 1,486 671
誰でも割 -432 -743 -336
WEB de 請求書割引 -20 -20 -20
EZ WIN 174 300 135
安心ケータイサポート 174 300 135
ユニバーサルサービス料 5 5
auスマートパス 390 390
契約事務手数料 3,000
誰でも割契約解除料 9,500
消費税額 188 66 504
合計 3,951 1,784 10,979

2ヶ月間、 EVO 3D の電源をほとんど入れなかった甲斐あって、 通信・通話料は 0円だった。 当然、 「auスマートパス」 は全く使っていないが、 勝手に解約するとキャッシュバックの額が減らされるそうなので 2ヶ月間維持した。

au に支払った金額は、上表の通りで合計 16,714円となった。 ドコモに支払った金額に比べ、 通信料のぶんだけ安い。

というわけで収支は 50,000 - (20,149 + 16,714) = 13,137円の黒字。 Galaxy Nexus をタダで手にいれただけでなく、 13,137円の現金と EVO 3D までもらえてしまった (^^;)。

米 at&t のプリペイド SIM カードのデータ通信が改訂 〜 短期滞在者にとっては大幅値上げ!

$
0
0

米国 AT&T のプリペイド SIM カードには、 課金プラン (Rate Plan) として、 月単位のプラン ($50 Monthly Unlimited Plan と $25 Monthly Plan)、 日単位のプラン (Daily Unlimited Plan)、 そして分単位のプラン (10cent/Minute Plan) がある。

$50 Monthly
Unlimited
$25 Monthly Daily Unlimited 10cent/Minute
基本料金 月額 $50 月額 $25 使用した日のみ
日額 $2
無し
米国内通話 無制限 250分を超えると
10cent/分
無制限 10cent/分
SMS/MMS 無制限 無制限 無制限 20cent/通
データ量料金
1GB$25
200MB$15
50MB$5

以前は、 どのプランでも Data Package を購入してデータ通信できた (少なくとも 4/14 の時点では購入できた) が、 先月中旬頃 (私が改訂に気付いたのは 4/19) に Data Package の要件が改訂されてしまい、 月単位プランが必須となってしまった (追記: 4/18 だったそうです)。 つまり、 $50 Monthly Unlimited Plan あるいは $25 Monthly Plan 以外のプランだと、 Data Package を購入することができなくなってしまった。 その代わり、 通信できるデータ量が増えて、 $25 だと (4/14 の時点では) 500MB だったのが 1GB ぶん通信できるようになった。

go phone $2 PER DAY Data Package が Monthly Plan 必須になってしまうと、 基本料金無料をウリにしていた (スマホな) GoPhone の立場は、 どーなるんだ... と思っていたら、
← 「$2 PER DAY」 な go phone に、 「SEE ASSOCIATE」(店員にお問い合わせ下さい) と書いたシールが貼られていた (この写真は Pearlridge の RadioShack で撮影)。 at&t が唐突に Data Package の要件を変えるものだから、 ショップとしては困惑しているのではないか?

Data Package を購入せずにデータ通信を行なうと、 5KB あたり 1セントも課金されてしまい現実的ではない (例えば 100MB で $200)。 メガバイト単位の通信が必要 (スマホなら当然) なら、 月単位プランを選択せざるを得ないが、 基本料金 $25 (250分ぶんの通話料が含まれる) がかかるので、 短期滞在 (一週間以内とか) だと少々割高となる。

例えば、 2日間の滞在で 200MB 使う場合 (フツーはそんなに使わない) だと、 $25+$15=$40 (約 3400円) となって、 海外パケットし放題を使う場合 (2980円*2=5960円) と比べて (SIM を購入するなどの手間を考えると) あまり価格メリットが無くなってしまう。 もちろん、 滞在日数が多くなればなるほど両者の差は開く一方なので、 大抵の場合は SIM を購入する方が有利。

ちなみに、 私が初めて at&t の Data Package を購入した 2010年5月の時点までは、 「$1 Mobile to Mobile Plan」 という日単位のプランがあった (追記: 2010年10月3日に廃止されたらしい)。 この $1 が値上げされて $2 になったのが、 現在の Daily Unlimited Plan なわけで、 もちろん今この 「$1 Mobile to Mobile Plan」 を選択することは不可能だが、 以前からのユーザであればこの $1 プランを使い続けることは可能であるようだ。 しかも、 $1 プランは (例外的に) Data Package の購入が可能! at&t がこの $1 プランを廃止する (例えば現行の日単位プランへ強制移行させる) 可能性は常にあるものの、 もし今 $1 のユーザであるなら、 その SIM を失効させないよう refill し続けるべきだろう (クレジットカード払いで自動的に refill してくれる Auto-Refill の設定をしておくと便利)。

滞在日数が一ヶ月近くになれば、 月単位プランが必須でも、 さほどデメリットとはならなくなるが、 月単位プランは、 電話を使用しない月も自動的に基本料金を課金されるので、 次回の訪米に備えて SIM カードを維持したい場合は、 基本料金が不要な分単位プラン (あるいは日単位プラン) に変更しておく必要がある。

ところが、 課金プランの変更は Web 上では (今のところ) 不可能。 現在の月単位プランの 「切れ目」 で分単位プランへ変更するといった 「予約」 もできない。 それはあまりに融通が効かなさすぎ、 と思ったので、 2箇所の at&t ショップ で直談判してみたのだけど、 できるのは今この場でプラン変更することだけで、 一ヶ月後とかの変更は承れないと突っぱねられた。 しかも、 プラン変更した瞬間、 Data Package の残高は失われるらしい。

というわけで、 データ通信が不要になった時 (日本に帰国した後とか) に、 +1-800-901-9878 (google voice を使えば無料。 at&t なケータイからは 611 でも可) に電話して、 「automated customer service」 にアクセスし、 分単位プランへ変更するのがよさげ。

「automated customer service」 というのは、 音声自動応答 (Interactive Voice Response) システムで、 音声 (もちろん英語) で操作する必要があり、 英語が苦手な私にとってはハードルが高い。 日本に帰国した後だと、 万一プラン変更に失敗するとリカバリ手段が無い (米国にいる間なら、 at&t ショップに直談判に行ける) ので、 米国滞在最終日に課金プラン変更を行なうことにした。 変更後はデータ通信ができなくなってしまうが、 私は T-Mobile の SIM も持っていて、 私のメイン端末である Galaxy Nexus は T-Mobile でも 3G 通信できるので問題無い。

T-Mobile の SIM を持っているのに何故 at&t の SIM を買ったかというと、 T-Mobile は圏外になったり EDGE (2G) でしか繋がらなくなったりする場所が多い (大きな建物の中とか、山の中とか) ため。 以前のメイン端末 Nexus S は at&t の 3G 通信 (1900MHz) に対応していないので T-Mobile SIM を使っていたが、 今のメイン端末 Galaxy Nexus は、 at&t と T-Mobile 両方の 3G 通信に対応している。

まず、 at&t の SIM を入れた電話 (Galaxy S) でデータ通信を無効にしておく (データ通信が有効のままだと、 課金プランを変更した直後から 5KB あたり 1セント課金されてしまう)。

次に、 611 をダイヤルして 「automated customer service」 へアクセス。 すると残高や現在利用している課金プランのアナウンスがあった後、 「What's go on ?」 と聞かれる。 そんなこと聞かれても... 何と答えてよいやら... と絶句していると、

Main menu. What's like to do ? You can say:
"add money",
"features",
"rate plan",
"account ballance",
or "more options".

と、 助け船を出してもらえるので、 元気良く 「rate plan !」 と発声してみる。 すると... 無情にも 「Oh, I didn't catch that.」 とのお答え。 元々英語には自信がないのだけど、 さらに自信を失う。 やっぱり 「r」 の発音がダメなのかなぁ... ;-(

落ち込んでいるとさらに助け船を出してくれる:

Here is your all choices:
To add money to your account, say "add money" or press 1.
To check your feature packages or buy features, say "features" or press 2.
To change your rate plan, say "rate plan" or press 3.
To get your account balance, say "account balance" or press 4.
Or say "more options" or press 5.

最初からそう言ってくれればよいものを... と思いつつ 「3」 を押す。

通じなければプッシュボタンでの操作を案内してくれる、 ということが分かったので、 気にせずテキトーに発声して進む。 次なる選択枝は:

To check whatever plans are available, press 1.
To hear your plan summery again, press 2.
To hear your plan detail, press 3.
Or if you're done here, press pound key.

「1」 を押して現在選択可能なプランを列挙させる。 すると、

Are you currently using a smartphone device ?
If you don't know, say "I'm not sure".

と聞いてくる。 おそらくスマホだと、選択できるプランが月単位のプランに限定されるのだろう。 そこで (今まさにスマホを使っているのだけど) 力強く 「No !」 と答える。 さすがにこれは聞き返されること無く一発で通じて (←当たり前)、

What type of plans would you like to hear about ?
You can say:
"monthly",
"daily",
or "by the minutes".
Or say "stay with my current plan".

と聞いてくるので、 「minutes」 と答える。

すると、 「OK, that's the 10 cents per minute plan.」 と返事が返ってきて、 分単位プランの概要説明がある。 そして、

This is the summery of the plan,
but for full description, you should say "plan detail".
You can also say "switch to this plan",
"go back to the lists of plans",
or "stay with my current plan".

と聞かれるので、 「switch」 とだけ答える。 単語だけで答える方が通じやすいようだ。

「10cent/Minute Plan」 に変更すると Data Package を失う旨の警告があった後、

To confirm you are right to go heading to switch to this plan,
please say "change my plan",
otherwise, say "cancel".

と聞かれる。 最終確認のようだ。 「change my plan」 と答えると、 「All right, just a minute.」 と返事が返ってきて、 チクタクチクタク (効果音) の後、 「OK, you are all set.」 と言われてプラン変更が完了する。

試しに 「*777*3#」 にダイヤルして Data Package の残高を調べてみると、 「0 kilobytes」 と表示された。 プラン変更前は 400MB byte 以上残っていたのだが... 次回からは、 訪米直前に Data Package を購入し (月単位プランへの変更を強制される)、 日本に帰国してから分単位プランへ戻す、 といった運用がよさげ。

英国で giffgaff, Three, O2, Vodafone, T-Mobile のプリペイド SIM カードを使ってみた

$
0
0

イギリスのプリペイド SIM カードは、 ほとんど (全て?) のキャリアの SIMカードが無料でもらえる (送料も無料)。 日本を出発する前日に、 以下の 10キャリアの free SIM を Web で申し込んでみた。

キャリアfree SIM 申込ページ備考
3UK (Three) Free SIM 香港 Hutchison Whampoa
O2 Text & Web スペイン Telefonica
giffgaff Free giffgaff SIM O2MVNO
LycaMobile Free Lycamobile SIM O2 の MVNO
Vodafone Text & Web Freebee 英国 Vodafone
Lebara FREE SIM Vodafone の MVNO
T-Mobile free SIM Text plan ドイツ T-Mobile
Orange pay as you go SIM T-Mobile と合併
Vectone Free SIM T-Mobile の MVNO
delight Free SIM T-Mobile の MVNO

ただし、 SIM の送付先は英国内の住所限定なので、 宿泊予定のホテルの住所を指定しておく。 T-Mobile は英国の電話番号が必須入力項目なので、 sipgate で得た電話番号を指定した。

free SIM といっても、 もちろん電話代がタダになるわけではなく、 通信・通話を行なうには SIM に度数をチャージ (英国では Top up と呼ぶ) する必要がある。 Top up は Web 上でできる (クレジットカード払い) ので、 ショップ等に行く必要も、 英語で会話する必要もない (英語が苦手な私にとって重要なポイント)。 もちろん、 英国のいたるところ (コンビニ、スーパー等、 「PayPoint」 あるいは 「top-up」 の看板が出ている店) で Top up のための Voucher (PIN が印字されたレシート) を購入することもできる。

ヒースロー国際空港に着くと、 プリペイドSIM の自動販売機が到着ロビーの目立つところにおいてある。 しかし SIM だけ (つまり度数無し) で£10 もする。 free SIM を申し込んでしまった手前、 £10 も払うわけにはいかない。 ロンドンの街中では同じものが£1〜£3 程度で購入できるようだ。

ホテルに着いてチェックインし、 真っ先に郵便物の有無をたずねたが、 さすがに昨日の今日では届いていなかった。 出発 2日前に申し込んでおけばよかったかも? giffgaff は、 申し込んでから発送まで 2日ほどかかる (発送した旨を知らせるメールが申込日の 2日後に届いた) ので、 出発 3日前に申し込むのがよさげ。 早く申し込みすぎてチェックイン前に届いてしまうと、 ホテルによっては受け取りを拒否されるかも?

部屋の状態 (お湯が出るとか、破損個所が無いかとか) を確認し、 無線LAN (があることは事前に確認済) を使おうとしたら有料だった。 しかも高い。 一日分の使用料金でケータイの通信・通話料金の一ヶ月分くらいする。 仕方ないので、 既に 19:00 をまわっていた (日本時間だと 3:00 過ぎなので眠い) が、 SIM を買いに最寄り駅 (Earl's Court) まで行ってみる。 閉ってる店も多かったが、 幸いコンビニは開いていて (ロンドンは 10年ぶりで、 前回訪問時は 19:00 過ぎに開いてる店は皆無だったような記憶が...) Vodafone SIM (と£10 Top up Voucher) を買うことができた (本当は 3UK SIM を買いたかったのだが、無いと言われた)。

Vodafone

通話料は 25ペンス/分、 インターネットへアクセスする際のデータ通信 (以下、Web と略記。もちろん Web 以外の通信も可能) の料金は 25MB あたり£1 (一日最大£5)。 ただし、 Text & Web パッケージを選択 (opt in) した場合は、 £10 を Top up すると、 300通までの国内 SMS (300 text と略記) と、 500MB までの Web (500MB web と略記) が無料になる (30日間有効)。

30日の間に Web が 500MB の枠を超えそうな場合 (スマホを使ってると超えることが多い) は、 £5 の Web Pack を購入することにより Web 枠を 250MB 追加できる。 Web 枠を使い切ると、 25MB あたり£1 の Web 料金が適用されてしまうので、 使い切る前に Web Pack を購入しておくべき。 Web Pack は 5個まで先行して購入しておくことが可能。 Web Pack は、 My account を登録しておくことにより、 クレジットカード払いで購入できる。 Top up のように、 My account を登録せずに購入する方法があるかどうかは未確認。

なお、 街中で売ってる SIM は (Vodafone に限らず) International パッケージ (つまり国際電話が安くなるパッケージ) を選択して使うことを想定している。 プリペイドSIM 購入者の大半が、 (おそらく母国へ) 国際電話をかけるために SIM を買うからだろう。 SIM 同梱の説明書には、 「4351」 をダイヤルして activate する方法のみ記載されているが、 この activate 方法では£10 を Top up しても Web 料金の特典はなく、 その代わり 60分までの国際通話が無料になる。

私は国内通話とインターネットへのアクセスさえできればいいので、 Text & Web パッケージを選択したかったのだが、 インターネットにアクセスできない状況下では activate の番号を調べる手段が無かった。 泣く泣く 4351 をダイヤルした後、 SIM と同時に購入した£10 Top up Voucher の PIN を入力した。 さらに悪いことに、 Web Pack の購入方法に気付いたときには既に残高が£5 を下回っていて (Web Pack 無しだと 1日最大£5 の Web 料金がかかるので £10 が 2〜3日で無くなる) Web Pack を購入することができなかった。

SIM の activate 方法は、 インターネットにアクセスできない状況下で必要となることを想定し、 事前にメモしておくべきだろう。 以下にまとめておく:

ダイヤル番号パッケージTop up で得られる無料特典(30日間有効)
4350Text & Web300 text & 500MB web
4352TalkVodafone 宛の通話 1000分
4351International国際通話 60分
4353£5 Weekend通話 100分 & 無制限 text (週末限定)
4354Freedom通話 100分 & 300 text & 50MB web

£5 Weekend パッケージは、 月曜〜金曜に£5 を Top up すると、 土曜と日曜の通話が 100分まで無料になり、 土曜と日曜の SMS が無料になる。

Text & Web パッケージを選択し、 適宜 Web Pack を追加購入することにより、 Web 料金を安く抑えることができるが、 例えば 30日間に 1GB 使う場合は、 £20 (£10 の Top up と Web Pack 2個) かかってしまうし、 何より Web Pack を忘れずに追加購入するのが面倒くさい。 短期滞在で 500MB 以内で済むのであればよいが、 1週間を超える滞在で、 500MB 以上使う場合は、 Vodafone は不適当な SIM だと思う。

3UK (Three)

ロンドンに到着した翌日 (二日目)、 都心を散歩していると 3 Store があったので、 £1 の SIMカードと、 £15 Top up Voucher を購入した (合計£16)。 Three は、 香港でも愛用しているキャリアなので期待大。 お店の人が忙しかったらしく、 SIMカードと Voucher を私に渡すと他の客の接客に行ってしまったので、 Top up および 「All-in-One 15 Add-on」 の購入を自分でやる羽目になった。

SIMカードをスマホに入れた後、 444 へダイヤルして Voucher の PIN を入力して Top up し、 Top up した£15 で Add-on を購入する。 残度数は£0 になってしまうが、 その日から 30日間、 300分までの通話と 3000通までの SMS と無制限の Web (All-you-can-eat data) が利用できる。 なお、 My3 に登録しておくことにより、 Top up や Add-on をクレジットカード払いで購入することもできる。

他のケータイへの通話 (07 から始まる番号) や、 国内通話 (02 から始まる番号など) は、 300分までなら可能だが、 それ以外の通話 (087 から始まる番号など) は、 残度数が£0 だと発呼できない。 なお、 英国の電話番号体系は、 日本の電話番号体系と似ていて、 国内通話は最初に 0 が付き、 国外からかける場合は、 最初の 0 を除いた番号に英国の国際プレフィックス +44 を付ける。

Add-on を購入しない場合、 通話料は 26ペンス/分、 Web の料金は Top up ごと 150MB までは無料で、 それを超えると 11ペンス/MB もする。 150MB 以上は決して使わないというのでもない限り Add-on は必須だろう。

1週間〜1ヶ月の滞在で、 スマホで Web を使いまくる場合は、 3UK は適した SIM だと思う。 あえて欠点をあげるとすれば、 2G で使えないことくらい? 大きな建物の中など、 2G (EDGE) の電波は届くが 3G だと電波が弱すぎる場合があり、 不便に感じたケースがあった。 また、 後述する giffgaff の月£10 と比べると割高。

T-Mobile

ロンドン滞在二日目、 ホテルに帰ると T-Mobile, Orange, Lebara の SIM が部屋に届いていた。 前述したように Vodafone SIM はスマホで使うには不適当 (Web 料金が高くつく) なので、 Vodafone SIM の残度数が£0 になり次第、 別の SIM に乗り換えることにする。

Lebara は国際電話が 1ペニー/分でかけられる (インドなど) ことを売りにしている Vodafone の MVNO で、 Web 料金は 15ペンス/MB と、 とんでもなく高額 (100MB 使うと£15 になってしまうし、Vodafone の Web Pack や 3UK の Add-on のような割引もない) なので、 候補から外す (← なら free SIM を申し込むな、と言われそう ^^;)。

T-Mobile と Orange は 2009年に合併している。 ブランド名こそ異なるが、 通信網は統合しているし、 料金体系もよく似ている。 どちらかを使ってみれば充分だろう、 というわけで T-Mobile を使ってみることにした。

T-Mobile の通話料は 30ペンス/分、 Web 料金は 1日最大£1。 £5 を Top up すると、 一ヶ月間有効な 「free internet」 をサービスすると説明書等に書かれているが、 £5 を Top up しても、 相変わらず毎日£1 づつ残度数が減り続けた。 仕方ないので 「30 day Internet Booster」 を購入することにする。 「MONTHWEB」 という文字列を、 441 へ SMS で送れば、 残度数から£5 が差し引かれ、 30日間無料で Web が使えるようになる。 これで安心...

ところが!

わずか 5日後、 以下のような SMS が届いた:

Just to let you know you have now reached 80% of your monthly Fair Use Policy. Visit t-mobile.co.uk/broadbandhelp for info on what to expect if you reach 100%.

2011年1月10日から、 1ヶ月あたりのデータ量が 500MB に制限されたらしい。 500MB に達しても、 通信できなくなるわけではないようだが、 なんらかの帯域制限がかかるのだろう。 1ヶ月で 500MB というのは、 いかにも少ない。 また、 T-Mobile には Google Talk が使えないという (私にとっては) 致命的な問題がある。 Google Talk アプリを起動しても、 ログインできないと表示される。 おそらく Google Talk が必要とするポートがブロックされているのだろう。 というわけで使用を断念した。 スマホで使う場合、 T-Mobile は論外な SIM だと思う。

O2

ロンドン滞在三日目、 O2, Vodafone の SIM が届いた。 ところが、 四日目以降は届かなくなった (後にホテル側の不手際と判明)。 まだ届いていない SIM があるのに... 特に、 本命の giffgaff が届いていないのが痛い。 前述したように Vodafone はスマホで使うには不適当、 T-Mobile は論外なので、 O2 を使ってみることにした (滞在七日目)。

O2 の通話料は 25ペンス/分、 Web 料金は 1日最大£1。 私が申し込んだ free SIMText & Web プランなので、 £10 以上 Top up すると、 300 text と 500MB web が無料になる。

プラン (tariff) は他に、 Unlimited, simplicity, International などがある。 SIM を申し込むときにプランを指定できる他、 Unlimited と Text & Web プランは、 21300 宛に SMS を送ることにより変更できる。 その他のプランは 2202 に電話をかけて変更する。

21300 宛 SMSプランTop up で得られる無料特典
NOLIMITUnlimited £10-14: O2 同士の text が無制限
£15: O2 同士の通話 & text が無制限
-simplicity £7.50: 無制限 text
OFFERText & Web £10-14: 300 text, 500MB web
£15-29: 500 text, 500MB web
£30+: 無制限 text, 500MB web
-International £10-14: O2 同士の text が無制限
£15: O2 同士の通話 & text が無制限

SIM をスマホに入れると、 何もしなくても (まだ Top up していないのに) 着信できた。 もちろん発信はできない。 My O2 に登録し、 £10 を Top up すると (現地時刻 22:01)、 発信およびインターネットへアクセスができるようになった。 ところが、 My O2 で残度数確認をしようとしてもエラーが表示される。 仕方ないので My O2 アプリをインストールしてみたら、 残高 (balance) とプラン (tariff) が表示された。

しかし、 表示された残高は£9。 まだ通話をしていないので Web 料金が差し引かれたものと思われるが、 500MB web が無料になるのではなかったのか? tariff には、ちゃんと 「Free UK texts to standard UK mobiles and 500MB Internet in UK.」 と表示されているのに...? 日付が変わるとさらに£1 引かれて残高が£8 になってしまった。 My O2 でエラーが表示されることから考えて、 SIM の activate が完全には完了していないのだろう。

いったいどーいうこと? と思っていたら、翌朝 9:01 に、

O2: Now you're up and running, go to o2.co.uk/hello to check all your Pay & Go benefits and the many ways you can top-up. To stop texts, call 2220.

という SMS が届いた。 夜間 22:00 〜 9:00 は、SIM の activate 処理 (の一部) が止まってたっぽい。 22:00 以降に activate すると、 処理が翌日まわしになるということのようだ。 続いて、9:14 に

O2: You've now got 300 free UK text and 500MB internet to use this month. Remember to top up at least £10 by 13 Jul to get your free allowance next month.

という SMS が届き、 無事 300 text と 500MB web が無料になった。 人手で activate 処理をやってるんじゃあるまいし、 夜間は手続きが止まるというのはいかがなものかと思う。

短期滞在で、 500MB 以内で済む場合は、 O2 は悪くない SIM だと思う。 500MB を超えると、 毎日£1 かかってしまうので、 滞在日数が長くなると割高。 Vodafone と比べると、 3G のサービスエリアが狭いように感じた。 大きな建物の中や郊外など、 すぐ 2G に切り替わってしまう印象がある。

giffgaff

giffgaff の SIM は、 他のキャリアと異なり街中で買うことができない。 Web で free SIM を申し込んで郵送 (英国内の住所のみ) してもらう必要がある。 ホテル側の不手際で、 私宛の郵便物が一週間ほどホテル内に留め置かれてしまったため、 giffgaff SIM を入手できたのはロンドン滞在八日目の晩だった。 もちろん、 何度かホテルのフロントに郵便物が届いていないか問合わせていたのだが、 その時の担当者が宿泊者宛の郵便物がホテルでどう扱われるか、 分かっていなかったようだ (オリンピック準備の一環で新人のトレーニングを兼ねて、 フロントを新人に担当させていた模様)。

なお、 giffgaff の他、 Vectone, delight, LycaMobile の SIM も届いたが、 Vectone と delight は (論外な) T-Mobile の MVNO なので見送り (Vectone は 1ヶ月 1GB まで許容していることを後で知った)、 LycaMobile は O2 の MVNO だが 2G のみらしいので見送った。 いずれも安い国際電話を売りにしているキャリアなので、 私のニーズには合わない。

giffgaff SIMカード表面に印字されている 6桁の code を、 SIM activation ページで入力し、 Top up か goodybag (またはその両方) を購入すると activate できる。 SIM をケータイに入れる必要はなく、 Web 上で完結するので、 英国外からでも activate できそう。

goodybag というのは 1ヶ月間有効な通話や通信のパッケージで、 250分の通話と無制限 text と無制限 web のパッケージが£10 で購入できる。 元々 giffgaff SIM ユーザ同士の通話は無料なので、 goodybag さえ購入しておけば、 残度数は£0 のままで済んでしまうのではないか? 私も 「£10 goodybag」 だけ購入し、 Top up は行なわなかった。

他のケータイへの通話 (07 から始まる番号) や、 国内通話 (02 から始まる番号など) は、 250分まで goodybag に含まれるが、 それ以外の通話 (国際電話や 087 から始まる番号など) は、 残度数が£0 だと発呼できない。 goodybag を利用しない場合の 通話料は 10ペンス/分、 Web 料金は 20MB まで 20ペンス/日だが、 20MB を超えると 20ペンス/MB も課金されるので危険。 スマホを使う場合、 goodybag が必須だろう。

activate が完了すると My giffgaff で電話番号を確認することができる (完了するまでは自分の電話番号さえ分からない)。 ところが、 クレジットカードでの支払い完了が 21:57 で、 22:00 までに activate がギリギリ間に合わなかったようで、 完了が翌日まわしになってしまった (通常は 30分以内に完了する)。 おそらく、 O2 側の手続きが 22:00 までに完了しなかったのだろう。 翌日 5:18 に、 ようやく手続きが完了し、 通信・通話ができるようになった。

giffgaff は O2 の MVNO なので、 通信・通話を利用した感じは O2 と変わらない。 ただし APN は O2 とは異なり、 以下のように設定する必要がある:

APNgiffgaff.com
ユーザー名giffgaff
パスワードpassword
MMSChttp://mmsc.mediamessaging.co.uk:8002
MMSプロキシ193.113.200.195
MMSポート8080
APNタイプdefault,supl,mms

1週間〜1ヶ月の滞在で、 スマホで Web を使いまくる場合は、 giffgaff は最適な SIM だと思う。 3UK と同様 Web が無制限で、 3UK より安い。 3UK と異なり 2G も使えるので、 3G の電波が届かないところでも使える。 あえて欠点をあげるとすれば、 O2 と同様、 3G のサービスエリアが Vodafone より狭いことくらい。 大きな建物の中や郊外など、 すぐ 2G に切り替わってしまう印象がある。

郵送以外の方法で SIM を入手できない点も残念。 ヒースロー空港の自販機で (£10 でもいいから) 入手できるだけでも、 ぜんぜん利用のしやすさは変わってくるのにと思う。 あるいは、 有料で構わないので英国外への発送もできるようにすれば、 出発前に日本で SIM を取り寄せることができるのにと思う。

個人でも気軽に買える安価なスマートスイッチ GS108E (IEEE 802.1Q タグVLAN 機能付) を使ってみた 〜 UCOM光 マンション全戸一括タイプの戸内配線上にプライベートネットワークを構築

$
0
0

先日、 UCOM光 マンション全戸一括タイプが導入されているマンションに引っ越した。 各部屋に LAN コンセントがあり、 UTPケーブルをつなぐだけでインターネットに接続できる。 USENのスピードテストで測定したところ、 50Mbps 以上の通信が可能であるようだ。 個人ユースであれば充分な帯域。

     UCOM
       │
       │
   ┌───┴───┐
   │ マンションの│
   │  ルータ  │
   └┬┬┬┬┬┬┬┘
┌───┘│││││└───┐
│ ┌──┘│││└──┐ │
│ │ ┌─┘│└─┐ │ │
: : :  │  : : :
 各戸へ   │   各戸へ
       │
    ┌──┴──┐
    |各戸のハブ| /29
    └┬─┬─┬┘
   ┌─┘ │ └─┐
   │   │   │
   ↓   ↓   ↓
  各部屋の LAN コンセント

各戸に半固定な /29 グローバル IP アドレス空間 (つまり 8個の IP アドレス) が割当てられていて、 LAN コンセントに PC 等をつなぐと、 マンション内に設置されたルータが DHCP でグローバル IP アドレスを配布する。 8個のアドレスのうち、 1個はこのルータが使い、 ネットワークアドレス (下位 3ビットが 000) とブロードキャストアドレス (下位 3ビットが 111) は配布されないので、 実際に配布されるのは (下位 3ビットが 010 〜 110 の) 5個のアドレスのみ (IPv4 アドレスが枯渇している昨今、 3/8 を無駄にするのはいかがなものか?)。

UCOM に問合わせたところ、 各戸のハブ (以下、ここでは 「戸ハブ」 と呼ぶ) は、 浴室の天井裏に設置されているらしい。 また、 各戸に割当てられるグローバルアドレスは、 通常は変化せず (機器構成の変更等で変わる可能性がある)、 全てのパケットはフィルタリングせずに届けられるらしい。

インターネット上の任意のホストから任意の通信が可能であるわけで、 (特に XP 以前の脆弱な) Windows マシン等を LAN コンセントに直結するのは、 セキュリティ上あまりよろしくない (有料オプションで、セキュリティ対策サービスがあるらしい)。 また、 5台以上の PC をつなぎたい場合もあるだろう。 特に UCOM光電話を使う場合は、 IP電話アダプタがアドレスを一つ使うので、 残り 4個になる。 フツーの家庭でも 4個では足らなくなるのでは? もちろん私の場合は 12個でも足らない。;-)

普通は、 PC を LAN コンセントに直結してグローバルアドレスを使うのではなく、 NAT 機能付ルータ (無線LAN ルータ等) を LAN コンセントにつないで、 PC にはプライベートアドレスを割当てることになるだろう。 各部屋で有線LAN を使いたい場合は、 各部屋にルータ (以下、 「部屋ルータ」 と呼ぶ) を用意して PC をつなぐことになる。

UCOM によると、 マンションによっては、 戸ハブの代わりにルータを各戸に設置して、 プライベートアドレスを配布しているケースもあるとか。 セキュリティを気にするのであれば、 戸ハブをルータと交換してもらっても構わないとまで言っていたが、 私はグローバルアドレスを使いたいので、 現状の仕様のほうが嬉しい。

ところが、 この方法だと各部屋の LAN は互いに異なるプライベートネットワークになってしまい、 異なる部屋 (そういくつも部屋があるわけでもないのだが ^^;) の PC と通信したいとき困る (居間にサーバを置くのは無粋なので、 ネットワークメディアプレーヤを使う場合とか)。 各部屋ルータの間で VPN を張って、 各部屋のプライベートネットワークを一つにする方法もあるが、 VPN のオーバヘッドがモッタイナイ。

もちろん、 部屋間に (廊下などに) UTP ケーブルを這わせれば済む話だが、 美観上好ましくないのと、 私の場合は購入ではなく賃貸で借りたマンションなので、 むやみにケーブルを配線するのも憚られる。 各LAN コンセントは、 壁裏配線を介して同じ戸ハブ (天井裏の写真 ↓ ダムハブ ^^;) につながっているのだから、 一つの LAN コンセントからパケットを送れば、 他の LAN コンセントに届く。 マンションのルータは当然 IP パケットの発信元/宛先アドレスをチェックしているだろうから、 発信元/宛先アドレスがプライベートアドレスなら外部へは出さないだろう。

Baffalo Dumb Hub

したがって、 グローバルアドレスなパケットに対してはルータとして、 プライベートアドレスなパケットに対してはブリッジとして機能するブルータを、 部屋ルータとして用いればよい。 ただし、 一般に売られている安価なルータにブルータの機能を求めるのは無理がある。 Linux マシンを使えばブルータを実現するのは容易だが、 各部屋 (特に寝室) で Linux マシンを 24時間稼働させるのはいかがなものか。

もっと安易に、 各PC を LAN コンセントにそのまま (あるいはハブを介して) つなぎ、 PC にはプライベートアドレスを割当てる方法もありそう。 あらかじめ 5個のグローバルアドレス全てを使いきってしまえば (例えば各グローバルアドレスを持った PC を前もってつないでおく)、 マンションのルータが (新たにつないだ) PC にグローバルアドレスを割当てることを防ぐことができる。 そして、 プライベートアドレスを配布する DHCP サーバを動かしておけばよい。 プライベートアドレスを割当てられた PC 同士は、 異なる LAN コンセントにつながれていても、 戸ハブ経由で通信できる。

ただしこの方法は、 PC にグローバルアドレスが割当てられてしまうことを完全には防げない。 なんらかのトラブルによりグローバルアドレスを使いきれない状態が生まれると、 そのとき LAN コンセントにつないだ PC には、 グローバルアドレスが割当てられてしまう。 グローバルアドレスが割当てられても、 (当然) フツーに通信できるわけで、 ユーザはグローバル空間に晒されていることに気付かない。 セキュリティ的にかなり好ましくない事態と言える。

各部屋にブルータ (という名の Linux マシン) を配置するしかないのか? と思っていたら、 タグVLAN (IEEE 802.1Q) 機能を持った安価なスイッチングハブを見つけた。 タグVLAN は業務用のインテリジェントスイッチでないと使えないと思っていたが、 1万円以下 (6400円) で買えるとわ... 思わず e-TREND で衝動買い。

本当は 5ポートの GS105E を買いたかったが、 日本では入手するのが難しそう。 8ポートの GS108E なら、 e-TREND の他、 NTT-X Store などでも送料込 6400円で購入できる (どちらのショップも 「在庫なし」 と表示されるが、 私が e-TREND に注文したときは 1週間程度で届いた)。

タグVLAN 機能付ハブを使えば、 ブルータよりもっとスマートにプライベートネットワークが実現できる。 つまり、 部屋間のプライベート通信はタグを付けて行なう。 戸ハブは (ダムハブなので) タグの有無にかかわらずなんでも中継してくれるし、 マンションのルータはタグ付パケットを無視する。

GS108E-living

GS108E を 3個購入し、 各部屋 (便宜上、ここでは居間、寝室、書斎とする) に配置する (写真 → は、居間に設置した GS108E, その上に置いてあるのは無線LAN AP, 左は IP電話アダプタ)。

VLAN ID 1 をグローバルネットワークに、 VLAN ID 2 をプライベートネットワークに使うことにする。 各 GS108E のポート 01 には、 各部屋の LAN コンセントをつなぎ、 VLAN ID 1 をタグ無しで、 VLAN ID 2 をタグ付で流す。 ポート 04 〜 08 は、 プライベートネットワーク専用ということにして、 VLAN ID 2 のみをタグ無しで流す。

グローバルネットワークに接続する必要があるのは、 グローバルアドレスをプライベートアドレスへ変換する部屋ルータ (という名の Linux サーバ) と、 IP電話アダプタ (UCOM光電話) のみ。 前者 (部屋ルータ) は書斎にある。 部屋ルータは、 グローバルとプライベートの両方のネットワークに接続する必要があるが、 幸い Linux はタグ付パケットを扱えるので、 単一の NIC で両方のネットワークに接続できる。 書斎の GS108E のポート 02 に部屋ルータをつなぎ、 ポート 01 と同様、 VLAN ID 1 をタグ無しで、 VLAN ID 2 をタグ付で流す。 書斎に他の PC が無ければ、 部屋ルータを LAN コンセントに直接つないでもよい。

後者 (IP電話アダプタ) は居間にある。 IP電話アダプタはグローバルネットワークにだけつなげればよいので、 居間の GS108E のポート 02 にIP電話アダプタをつなぎ、 VLAN ID 1 をタグ無しで流す。 急遽グローバルネットワークに接続したい機器が増えた場合に備えて、 ポート 03 にも VLAN ID 1 をタグ無しで流す (つまりグローバルネットワーク専用) 設定にした。

GS108E-living VLAN config

タグVLAN は、 一本のケーブル上に複数のネットワークを同居させることができる便利な規格。 ケーブルを何本も這わすことが (美観上の理由で) 難しい家庭でこそ必要な機能なのに、 普及価格帯のハブでタグVLAN をサポートしているのは (私が知る限り) GS105EGS108E のみ。 タグVLAN 機能を持った安価なスマートスイッチが増えることを願ってやまない。

成功しない方法

$
0
0

「なぜ成功できたか?」を聞きたがる人って多いですよね? でも、そんなこと聞いてどうするのでしょうか。仮に同じことが実践できたとしても、同じように成功できるとは誰も思っちゃいないですよね?

同じように成功するのは無理としても、成功者の話には何らかのヒントがあるんじゃないか?きっとそういうことを期待しているのだと思いますが、考えてみて欲しいのは、成功しなかった人の話は誰も聞こうとしない点。もしかしたら成功しなかった人も成功者と同じことをしていたかも知れません。いわゆる「生存者バイアス」ですね。

例えば、成功できた理由を聞かれて、「自分を信じて、あきらめずに続けたから」などと答えている人をよく見たり聞いたりしますが、こーいう話を真に受けて、素質がない人が自分を信じて突き進んだりしたら、成功確率が上がるどころか、撤退タイミングを逃してドツボにはまってしまうだけです。

まあ、私自身も、「やりたいことをやるのが一番」などと言っていた時期があるので大きなことは言えないのですが、「自分がやりたいことって何だろう?」などと悩み出す人をこれ以上増やさないためにも、ここでは逆に「成功しない方法」について書くことにします。ちなみに「成功しない=失敗」ではありません。失敗は成功の元ですから、むしろ大いに失敗すべきです。

「成功しない方法」を避けたところで成功する保証は何もありませんが、多くのエンジニアが残念なことにこの「成功しない方法」を忠実に実践し、その必然的な帰結として、どんどん成功から遠ざかってしまっています。近年、「エンジニア」という職種が報われない職種になってしまっている一つの原因が、このあたりにあると感じる次第です。

もちろん、いままさに「成功しない方法」を実践している人に対して、このままでは成功からどんどん遠ざかるぞと忠告したところで、そう簡単に方向転換はできないものだとは思いますが、もし、いま「このまま進んでいていいのだろうか?」と思っているなら、少しばかり耳を傾けて頂けると幸いです。

誌面が限られているので、いきなり結論からいきます。「成功しない方法」とは、「選択肢を減らすこと」です。

選択肢と言われてもピンとこないかもしれませんが、人生には分岐点が沢山あります。たとえ八方塞がりに思えるドツボな状況に陥ってしまっていても、その後の分岐点で最適な選択さえできれば、ピンチがチャンスになったりします。ただしそれは、分岐点に選択肢の幅が十分にあればの話です。選択肢が多ければ、リカバリのチャンスがあるということですね。

例えば、選択肢を減らす典型的な方法が、借金をすることです。多くの人が 20〜30年もの長期ローンを組んで家を買ったりしますが、転職したくなったりしたとき、毎月十数万円の返済は重い足枷となるでしょう。借金がなければ思い切って生活を変える選択ができたかもしれないのに、借金があるばっかりに渋々現状維持を続け、ついにはリストラの憂き目に、なんてのはよく聞く話です。

でも、借金よりもっと選択肢を減らす方法があります。それは、自分の気持ちを優先すること。よくいますよね、「これは自分の仕事じゃない」とか言う人 (>_<)。その仕事がどんな仕事か十分に知り尽くしていて、「その仕事をする」という選択肢を除外することが合理的であるなら構わないんですが、多くの人はどんな仕事か知りもしないくせに、「自分の気持ち」だけで判断してしまいます。もしかしたら、やったことがないその仕事に挑戦することが、自分の人生の一大転機になるかも知れないのに。

あるいは、「自分がやりたいことって何だろう?」などと悩む人がいます。「やりたいことを仕事にすべき」などと (私を含めて orz) 多くの人が言ってますが、誰だって最初からそれが「やりたいこと」だったわけではないんです。なにかのはずみに始めたことが、やってるうちに (少し) 好きになり、好きでやるからどんどん熟達し、他の人よりうまくできると余計に好きになり、という好循環にはまって「やりたいことが仕事になる」んです。つまり、最初は好きでなくても自分の気持ちを無視してやってみなきゃ選択肢は増えません。それなのに、悩んでるばかりで始めないから、だんだん歳をとって、やってみるチャンスすら失われてしまいます。

また、多くの人は批判するのが大好きです。昔は飲み屋で、いまだとブログや SNS で、「上司が悪い」「会社が悪い」「社会が悪い」「政治家が悪い」。なぜ人は批判するのでしょう?社会をよくするため?とんでもない、愚痴を言ったって社会は少しも変わりません。誰かを批判すると、その人より自分が偉くなったような気分になれるから、人は批判するのが大好きなのです。

でも、批判によってよくなるのは「自分の気持ち」だけで、自分自身は決してよくはなりません。なぜなら、誰しも成長するには他人から学ぶ他ないからです。でも、「彼はバカだ」と言ってしまったら、その「彼」からは学べません。選択肢がまた一つ減るわけですね。本当に学ぶことが一切無いようなバカなら学ばなくてもいいのですが、ほとんどの場合そうではないでしょう。本当は、学ぶところが一切無いような人に対しては、批判する気にもならないはずです。

自分の気持ちを優先して選択肢を減らす例はまだまだ沢山あるのですが、誌面が尽きたのでこの辺で... もしこの手の話に興味があれば、私のブログ (「仙石浩明」で検索!) を参照してください。

- o -

以上は、 Software Design 誌に寄稿したエッセーです。 2013年1月号 第2特集 「キーパーソンに聞く 2013年に来そうな技術・ビジョンはこれだ!」 に掲載されました。 技術評論社さんの許可を得て、 全文を転載しています。

台湾で中華電信と台灣大哥大のプリペイド SIM カードを買ってみた

$
0
0

初めての台湾。 4日間の短期滞在なので、 街中でプリペイド SIM カードを売ってるところを探していては時間がもったいない。 できれば空港で SIM を入手し、 不自由無くインターネットにアクセスしたい。 とはいえ、 パックツアー (最初に九份を訪れた後は全日程自由行動) なので、 他のツアー客を待たせるわけにはいかない。 できるだけ早く入国審査を済ませて SIM を購入し、 ツアー集合場所に駆けつけよう。

臺灣桃園國際機場 (Taiwan Taoyuan Int'l Airport, 台湾桃園国際空港) 第2ターミナルに到着後、 飛行機を真っ先に飛び出し、 小走りで入国審査場を目指した。

がらがらの入国審査場。 やった、 一番乗り。 広々とした入国審査場の片隅に、 一台だけ置かれている ATM が目に入った。 初めての訪台なので、 台湾の現金をまったく持っていない。 多くの国で SIM はクレジットカードで買うことができない。 おそらく台湾も同じだろう。 ここで現金を入手できれば、 SIM の購入がスムーズになる。

ATM に駆け寄り、 素早くキャッシュカードを挿入、 暗証番号を入力し、 口座の種別を選んで金額を入力した。 すると、 CirrusPLUS か選択する画面が現れた。

へ? Cirrus か PLUS ? そんなの ATM が勝手に判断することなんじゃ? わざわざユーザに選ばせるってことは、 Cirrus と PLUS の両方に対応しているカードがあるってこと? それなんて呉越同舟?

ええい、 二つに一つ!と Cirrus を選んだら、 レシートとカードが吐き出され、お金は出てこなかった。 敗北感に浸りながら出てきたカードを裏返すと、 そこには PLUS のマークがあった。

もう一度... と思ったが、 いつのまにか入国審査場には待ち行列が伸び始めていた。 いま現金を入手したところで、 入国審査に時間がかかっては元も子もない。 慌てて行列の最後尾につく。

と、 いうわけで到着ロビーで ATM を探した。 (両替のための) 銀行カウンターは目立つところにあるが、 ATM はエスカレータ脇の目立たないところにあるので見つけにくい。 事前に場所を確認しておいた方が無難。 もっとも、 一刻も早く ATM を使う必要があるのは、 その国を初めて訪れる時 (その国の現金を全く持っていない時) だけだが。 しかも、 台灣大哥大 (Taiwan Mobile) の SIM は、 クレジットカードでも購入できた orz。 中華電信 (Chunghwa Telecom) は現金のみ。

Chunghwa Telecom, Taiwan Mobile, FarEasTone at Taiwan Taoyuan Int'l Airport 到着ロビーへ出て左側へ進んだところに、 中華電信, 台灣大哥大, 遠傳電信のカウンターがあった (←左写真)。 台湾は SIM 管理が厳しく、 購入の際、 パスポートの他にもう一点、 身分証明書の提示が必要。

スタッフが (日本の)運転免許証を見慣れているので、 運転免許証を提示するとスムーズに手続きできる。 SIM の購入は一人一枚に制限されると聞いていた (未確認) ので、 (私が二枚まとめて購入するのではなく) 私と妻それぞれ一枚づつ購入したのだが、 妻は運転免許証を持ってないので住民基本台帳カードを提示した。 住民基本台帳カードは市町村ごとにデザインが違うので、 日本の公的な身分証明書であることを納得してもらうのに、 ちょっと手間取っていたようだ。

市町村ごとに変種がある 「証明書」 でどうやって偽造を見抜けと言うのだろう? さらに悪いことに、 住民基本台帳カードには固有番号が一切書かれていない。 もちろん、IC の中には 「住基ネット番号」 という固有番号が記録されているわけだが、 IC リーダを使わずに (フォトコピーだけで) 読める固有番号 (もちろん住基ネット番号とは異なる番号で構わない) を用意すべきではないのか? 証明書としての要件をまるで備えていない住基カード (>_<)。 こんなものを作った責任者を小一時間問い詰めたい。

4日間の滞在なので、 5日間 (120時間) データ通信し放題の SIM カード (通話も可能) を購入した。 中華電信と台灣大哥大を一枚づつ。 どちらも micro SIM を選択できた (一応 SIM カッターを持参したのだが ^^;)。 中華電信は NT$50 の度数が付いて計 NT$300 (約930円)、 台灣大哥大は NT$250 の度数が付いて計 NT$500 (約1550円)。 つまり、 どちらも 5日間の無制限データ通信の部分は NT$250 (約780円)。

「大哥大」 は (日本では) 見慣れない文字なので、 どう発音していいのか困るが、 あえてカタカナで書けば 「ダーグーダー」 (「グー」 が高く, 第1声)。 「グー」 は発音記号 (拼音, ピンイン) で書くと 「gē」 で、 「e」 は中国語の母音の中で最も(?)難しい音。 口の形は 「エ」 なのだけど 「ウ」 に近い音に聞こえる。 他の母音とくっつくと 「エ」 に聞こえることも。

「哥」 は、 (歌の意味もあるがここでは) 「兄」 の意味。 で、 それに 「大」 がついて 「大哥」 は 「いちばん上の兄」、 転じて 「男性に対して使う尊敬と親しみをこめた呼称」。 「アニキ」 みたいな感じか? そして、 さらに 「大」 がついた 「大哥大」 は 「(やくざの)ボス」。 それが転じて 「携帯電話」 ← どーしてそうなった?

大哥大
Dàgē dà
携帯電話.(‘大哥大’(香港のマフィアのボス) が携帯電話を手に持って部下に指令を出す映画のシーンから生まれた言葉で, その姿が格好よく見えるところから‘大哥大’と言われるようになった.) ≒移动电话,手提式电话.

中国語では携帯電話のことを 「移動電話」 (簡体字だと 「移动电话」) と表記することが多いが、 台湾では 「行動電話」 と表記するのが普通。 発音は 「Xíngdòng diànhuà」。

「NT$」 は、 新台湾ドル (New Taiwan dollar) の略称。 「新」と言っても最近発行されたわけではなく、 発行開始年は 1949年。 通貨コードは TWD (なら素直に TW$ と書けばいいのにな〜)。 NT$1 = 約3.1円。

TWM 5 Day Pass

5日間の無制限データ通信が NT$250 なのは SIM 購入時のみで、 無制限データ通信プランを追加で購入しようとすると、 中華電信の場合は、 NT$100 (1日間), NT$250 (3日間), NT$450 (7日間) となっていて、 5日間のプランは無く、 NT$250 だと 3日間しか使えない。 一方台灣大哥大は、 NT$100 (1日間), NT$250 (3日間), NT$350 (5日間), NT$450 (7日間), NT$600 (10日間), NT$800 (25日間) となっていて、 1, 3, 7 日間プラン (中華電信と同額) に加え、 5, 10, 25 日間プランもある。 5日間プランは NT$350 となっていて、 SIM 購入時と比べて NT$100 高くなる。

以上のように、 中華電信と台灣大哥大は、 価格的に差がないが、 使用感にも差は感じられなかった。 Speedtest.net で測定したところ、 中華電信は ping 100ms 下り 2Mbps 上り 800kbps 前後だったのに対し、 台灣大哥大は ping 80ms 下り 3Mbps 上り 300kbps 前後だった。 下りは台灣大哥大のほうが速いが、 上りは中華電信のほうが速い。

中華電信は開通後、 次のような SMS が送られてきた:

Date: Tue, 29 Jan 2013 12:56:30 +0800

行動數據計日服務已開通,若您正在上網,請關機,重開後即可適用。預計102年02月03日12:53:52服務到期。更多資訊請撥539查詢。

(拙訳) モバイルデータ日単位サービスが開通しました。もし今オンラインなら、 携帯電話を再起動してください。再接続後、データプランが即適用されます。 サービスの有効期限は 102年02月03日12:53:52 です。 詳細については 539 に電話してください。

102年ってのは何ぞ? と思ったが、 民国紀元 (中華民国が成立した1912年を紀元とする紀年法) だと今年は 102年なんだそうだ。 539 をダイヤルして電話すると、 自動音声応答が出て、 3 を押すことで日本語に切り替えることができて、 有効期限等を確認することができる。 期限が切れている場合は、 無制限データ通信プランを追加購入することができる。

中華電信の NT$250 のデータ定額は 3日後の 23:59 まで使える、 と書いてあるページ (ブログ等) をよく見かけるが、 少なくとも私が購入した NT$250 のデータ定額 (無制限データ通信) は 120時間後 (5日後) が期限だった。 SIM の種類が違う、あるいは最近変更された、という可能性も否定できないが、 書いた人の勘違いなのではなかろうか? きちんと有効期限を (SMS 等で) 確認したのだろうか?

台灣大哥大は開通後、 次のような SMS が送られてきた:

Date: Tue, 29 Jan 2013 13:08:15 +0800

歡迎使用手機無限上網計日型服務,請手機重新開機即可使用。服務結束是2013/02/03 01:55PM,查詢效期請撥打535

(拙訳) 無制限インターネット日単位サービスへようこそ。 携帯電話を再起動してください。 サービスは 2013/02/03 01:55PM に終了します。 有効期限のお問い合わせは 535 に電話してください。

535 に電話すると、 自動音声応答が出て、 2 を押すことで英語に切り替えることができる。 中華電信と同様、 有効期限の確認や、 無制限データ通信プランの追加購入が可能。

どちらの SMS も、 携帯電話を再起動せよと書かれているが、 再起動することにより APN が自動設定されることを期待しているのだろう。 ほとんどの携帯電話で APN が自動設定されるのだと思うが、 手動設定したい場合は、 中華電信は APN を 「internet」 あるいは 「emome」 に、 台灣大哥大は APN を 「internet」 あるいは 「twm」 に設定すればよい。

台灣大哥大の SIM は NT$250 (約780円) の度数付だったので、 4日間の滞在では充分余裕があったが、 中華電信の SIM は NT$50 (約160円) しか度数が付いていなかった (度数の差の分だけ安い) ので、 4日間の滞在中に残度数が 0 になってしまった。

CHT Recharge Voucher NT$300 しかも、 中華電信の SIM は残度数が 0 になると、 無制限データ通信の部分まで使えなくなってしまうようだ (データ通信さえできれば skype 等で通話することもできたのに)。 仕方がないので、 コンビニ (7-ELEVEn) で NT$300 の儲值卡 (Recharge Voucher, 如意卡) を買った (コンビニで売っている如意卡は NT$300 と NT$500 のみ)。

残度数が 0 になった緊急事態だったので、 最寄りのコンビニに飛込んで定価で買ったが、 ケータイ屋 (キャリア直営ではない、ケータイ用のケース等を売ってる店) だと 額面の 1〜2割引で売っているので、 残度数が少なくなってきたらあらかじめ (安値で) 買っておいた方がよい。 残度数は、 中華電信の場合は 「*101*1#」 を、 台灣大哥大の場合は 「*867#」 を、 それぞれダイヤルすることにより確認できる。

CHT Recharge Voucher NT$300 reverse 儲值卡の裏面の銀色の部分 (請用錢幣輕輕刮除護漆 Carefully scratch the strip と書いてある) をコイン等で削り取ると、 12桁の数字 (←の場合は 9495 8339 3250) が現れるので、 「*101*2*(12桁の数字)#」 をダイヤルする (*101*2*949583393250#)。

すると、 「儲值成功!儲值後餘額 300.00 元 2013/07/29 到期」 (チャージ成功! チャージ後残高 NT$300.00 2013/07/29 期限) などと書かれた SMS が送られてきて、 残高が NT$300 になり、 有効期限もこの時点から 180日後になる。

台湾のプリペイド SIM は国際ローミングに対応していない (ポストペイ SIM は、申請すると国際ローミング可能) ので、 台湾の外で 「*101*2*〜#」 へダイヤルすることはできないが、 儲值卡の裏面の説明にあるように (他の SIM あるいは固定電話などから) +886-928-000-928 に電話し、 自動音声に従ってチャージ (充值) することが可能。 日本へ帰国する前に台湾で儲值卡を何枚か買っておけば、 台湾に行かなくても 180日に一度チャージして、 プリペイド SIM を失効させることなく維持できる。

台灣大哥大も同様に、 台湾で儲值卡を何枚か買っておけば、 台湾の外から +886-935-120-867 (台湾内でチャージ対象 SIM を使う場合は 867) に電話してチャージすることが可能。 台灣大哥大はさらに、 Web でチャージすることもできる。 台湾滞在中にアカウントを作っておけば、 そのアカウントでログイン (登入) し、 クレジットカード払いでチャージできる。

GS108E / GS116E の ProSafe Plus 設定ユーティリティが 「HTTP request error」 で使えないときの対処法

$
0
0

安価なスマートスイッチ GS108E / GS116E の設定ユーティリティ 「ProSafe Plus」 を起動したとき、 以下のようなエラーダイアログが表示されて使用不可能に陥ることがある:

Web サービス サーバと通信中にエラーが生じました。エラーメッセージ:HTTP request error

「サーバと通信中にエラーが生じました」 と言われても、 そもそもこの 「ProSafe Plus 設定ユーティリティ」 はサーバと通信するツールではないので途方に暮れてしまう。 「サーバ」 というのはこのツールの設定対象であるスイッチ GS108E/GS116E のことなのか? この設定ユーティリティは起動時にスイッチを探す (UDP broadcast) が、 もちろんプロトコルは HTTP ではない。

「HTTP request error」 というエラーメッセージが唯一の手がかりなので、 とりあえず google で検索してみる。 私と同様に途方に暮れている人が何人もいるようだ。

幸い、 そのうちの一人が解決方法を発見していた:

FIXED: Prosafe Plus Configuration Utility - HTTP request error

I Fixed it!!! : The problem seemed to be caused by the 'Internet Connection Sharing Service (ICS)'.
Some how I have been configuring this service on my laptop. When I stop this service, the utility works again. Because I do not need this service most of the time I changed the startup mode of this service to manual.

ICS ? そんなものを設定した覚えはないのだけど... と思いつつ、 「ネットワークと共有センター」 から 「アダプターの設定の変更」 を選び、 ネットワーク アダプターの 「プロパティ」 を開いて 「共有」タブを選択する (Windows7 あるいは Windows8 の場合)。 すると...

インターネット接続の共有 ネットワークのほかのユーザに、このコンピューターのインターネット接続をとおしての接続を許可する

がーん、 「インターネット接続の共有」(ICS) が許可されている orz.
誰が許可したんだ?

そういえば先月 Wi-Fi USBアダプタ GW-USFang300 を購入 (e-trend で 1280円で売っていたので衝動買い ^^;) した際、 この PC を Wi-Fi アクセスポイントとして使用したのだった。 アクセスポイントなので、 当然 ICS を許可することになる。 一時的に使用しただけなので、 今はこの Wi-Fi USBアダプタを外しているのだが、 ICS が許可されたままになっていたのだろう。

この 「ネットワークのほかのユーザに、このコンピューターのインターネット接続をとおしての接続を許可する」 のチェックを外して 「OK」 を押したところ、 無事 「ProSafe Plus 設定ユーティリティ」 が使えるようになった。 よかった〜

なお、 上記 google 検索で見つけた解決方法は、 「I changed the startup mode of this service to manual」 すなわち 「『Internet Connection Sharing (ICS)』 サービスの 『スタートアップの種類』 を 『手動』 にした」 とあるが、 ネットワーク アダプターの 「プロパティ」 で ICS 許可のチェックを外しても同じ効果が得られるし、 「プロパティ」 で設定変更するほうが素直な対処方法だと思う。


UCOM光電話の VoIP アダプタ (Aterm BH812V) を LAN 内に設置してみた

$
0
0

UCOM光が導入されているマンションに住んでいるので UCOM光電話を使っている。 UCOM から貸与された VoIP (Voice Over IP, IP 電話) アダプタは、 グローバル IP アドレスが必要と説明書にあった。 UCOM光で各戸に割当てられるグローバル IP アドレスは 5個しかないのに、 うち 1個を VoIP アダプタごときに専有されるなんてトンデモナイ。 なんとか VoIP アダプタを、 次図のように LAN 内に設置することはできないか?

                    宅内 ←:→ UCOM
                        :       :
      LAN    ┌─────┐  DMZ   :       :
           │NAT 機能付│      :       :
───┬────┬──┤ルータ  ├──┬───────┬────→ インター
   │    │  └─────┘  │   :   │   :  ネット
┌──┴─┐┌─┴─┐   :   ┌─┴─┐ : ┌─┴─┐ :
│ VoIP ││ PC等 │   :   │公開 │ : │SIP  │ :
│アダプタ│└───┘   :   │サーバ│ : │Proxy │ :
└────┘        :   └───┘ : └───┘ :
              :
プライベート IP アドレス  :    グローバル IP アドレス

SIP (Session Initiation Protocol, VoIP で使われるプロトコル) は NAT と相性が悪いとはよく言われるが、 それは UA (User Agent) 同士が直接通話する場合の話。 SIP Proxy 経由で通話する場合であれば、 端末 (VoIP アダプタ等) は特定の SIP Proxy に接続すれば事足りるので、 端末が NAT の内側 (つまり LAN 内) でも何の問題もない。 だから VoIP アダプタにグローバル IP アドレスが必要と言われても納得しかねる。

私の場合、 VoIP アダプタとして Aterm BH812V (UZ) を貸与された。 このアダプタに、 フツーの (アナログ) 電話機をつなぐとフツーの (050 な電話番号ではなくフツーの市外局番な番号の) 固定電話として使える。 BH812V は VoIP アダプタなのに VoIP 関連の設定項目が全く無く、 ましてプライベート IP アドレスで使うための設定方法など望むべくもない。 仕方がないのでとりあえずそのまま BH812V を LAN につないでみた。 上図中 「NAT 機能付ルータ」 は実際は Linux マシンで、 このマシン上で DHCP (Dynamic Host Configuration Protocol) サーバを走らせている。 つまり、 この DHCP サーバから BH812V に対してプライベート IP アドレスが割当てられる。

BH812V 前面

BH812V の筐体には、 「ステータス」 「電話サービス」 「電話1」 「電話2」 「インターネット」 と書かれた 5 つのランプがあり、 正常な定常状態では全て緑色に点灯する。 ところが、 BH812V を LAN につないで電源を入れると、 「ステータス」 が橙点滅、 「インターネット」 が橙点灯したままになり、 「電話サービス」 他のランプは消灯したままになってしまった。 もちろん、 BH812V につないだ電話機は使用不能。 BH812V のログはこんな感じ:

2013/03/29 00:39:15 NAT GET 192.168.10.130 (IP-PORT=1)
2013/03/29 00:39:15 WAN  Port is UP for Local Router mode
2013/03/29 00:39:15 WAN  Connect request from 192.168.19.1 for Local Router mode
2013/03/29 00:39:15 DHCP_Client IP ADDRESS Get 192.168.10.130 (IP-PORT=1)

プライベート IP アドレス 192.168.10.130 が配布されたことは分かるが、 SIP 関連のエラーは全く出力されていないので、 このログではなぜ電話機が使えないか何も分からない (>_<)

ちなみに、 BH812V にグローバル IP アドレス 122.218.XX.XX を割当てて正常に動作したときのログはこんな感じ:

2013/03/29 00:51:09 NAT GET 122.218.XX.XX (IP-PORT=1)
2013/03/29 00:51:09 WAN  Port is UP for Local Router mode
2013/03/29 00:51:09 WAN  Connect request from 192.168.19.1 for Local Router mode
2013/03/29 00:51:09 DHCP_Client IP ADDRESS Get 122.218.XX.XXX (IP-PORT=1)

電話が使えない異常状態と、正常状態とで、 ログが (割当てられた IP アドレス以外は) 全く同じというのはいかがなものか。

そこで、 BH812V にグローバル IP アドレスを割当てたときと、 プライベート IP アドレスを割当てたときとで、 どのような挙動の違いがあるか調べてみる。 まず UCOM DHCP サーバから グローバル IP アドレスを割当てるとき、 BH812V と UCOM との間でどのような通信が行なわれるか? BH812V と UCOM との間にブリッジ (という名の Linux マシン) を挟んで、 どのようなパケットがやりとりされているか tcpdump (ネットワークを流れるパケットを表示するツール) で調べてみる。

   ┌────┐  ┌─────┐  宅内 ←:→ UCOM
   │ VoIP ├──┤ブリッジ ├──┐   :
   │アダプタ│  └─────┘  │   :       :
   └────┘  ┌─────┐  │   :       :
           │NAT 機能付│  │   :       :
────────┬──┤ルータ  ├──┼───────┬────→ インター
        │  └─────┘  │   :   │   :  ネット
      ┌─┴─┐       ┌─┴─┐ : ┌─┴─┐ :
      │ PC等 │       │公開 │ : │SIP  │ :
      └───┘       │サーバ│ : │Proxy │ :
                  └───┘ : └───┘ :

上図のように 「VoIP アダプタ」 (BH812V) を LAN から (ブリッジを介した) DMZ へつなぎ替えたわけだが、 このようなネットワーク構成の変更が、 物理的な配線変更を行なわずにできるのが、 スマートスイッチならでは (^^)v。

BH812V に UCOM が配布するグローバル IP アドレスを割当てるときの、 BH812V と UCOM との間の通信は以下のような感じ:

BH812VUCOM 
DHCP Request →
← DHCP Reply グローバル IP アドレスの割当て
DNS Query → ntp.121ware.com の IP アドレスは?
← DNS Response IP アドレスは 211.4.244.178
NTPv4 → 211.4.244.178 へ現在時刻を問合わせ
← NTPv4 現在時刻は 17:26:26
DNS Query → voipsetup.fttx.co.jp の IP アドレスは?
← DNS Response IP アドレスは 61.122.116.158
HTTPS Request → 61.122.116.158 への SSL 通信開始
← …… → 61.122.116.158 との SSL 通信
SIP REGISTER → SIP Proxy への REGISTER 要求
← SIP Response SIP REGISTER 完了

一方、 BH812V を LAN 内に設置したときは、 voipsetup.fttx.co.jp の IP アドレス問合わせが行なわれず、 当然その後に続く SSL 通信も、 SIP REGISTER も行なわれない。

BH812V と 61.122.116.158 (voipsetup.fttx.co.jp) との SSL 通信は、 暗号化されているため覗き見することができないが、 ホスト名からしていかにも VoIP の設定情報 (電話番号, ユーザID, パスワード, SIP Proxy など) をダウンロードしているように見える。 つまり、 BH812V はグローバル IP アドレスを割当てると、 https://voipsetup.fttx.co.jp から設定情報を取得するが、 ローカル IP アドレスを割当てると、 設定情報の取得が行なわれず、 したがって電話も使えない、 ということなのか?

仮にそうだとして、 ではなぜローカル IP アドレスだと設定情報の取得が行なわれないのか? BH812V は割当てられた IP アドレスがグローバルかプライベートか判断して、 動作を変えているのか? また、 取得先であるこの URL は元々 BH812V 内部に持っているのか? URL のようないつ変わるかも知れないようなものを VoIP アダプタに書込んで出荷するというのは考えにくい、 などと思いつつ、 tcpdump が表示したパケットの内容を詳しく見ていくと、 UCOM からの DHCP Reply (グローバル IP アドレスの割当て) が、 普通の DHCP サーバとは異なっていることに気付いた:

17:26:31.004413 00:1a:6c:YY:YY:YY > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 391: (tos 0x0, ttl 255, id 32054, offset 0, flags [none], proto UDP (17), length 377)
    122.218.YY.YY.67 > 255.255.255.255.68: [udp sum ok] BOOTP/DHCP, Reply, length 349, hops 1, xid 0x29d6048, Flags [Broadcast] (0x8000)
	  Your-IP 122.218.XX.XX
	  Gateway-IP 122.218.YY.YY
	  Client-Ethernet-Address 1c:b1:7f:XX:XX:XX
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Offer
	    Server-ID Option 54, length 4: 61.122.127.121
	    Lease-Time Option 51, length 4: 21600
	    Subnet-Mask Option 1, length 4: 255.255.255.248
	    Default-Gateway Option 3, length 4: 122.218.YY.YY
	    Domain-Name Option 15, length 10: "usen.ad.jp"
	    Domain-Name-Server Option 6, length 8: 61.122.127.122,61.122.116.174
	    T201 Option 201, length 6: 21321,20525,20299
	    T202 Option 202, length 49: 104.116.116.112.115.58.47.47.118.111.105.112.115.101.116.117.112.46.102.116.116.120.46.99.111.46.106.112.47.115.101.116.117.112.46.97.115.112.120.63.99.105.100.61.38.114.105.100.61

122.218.YY.YY が UCOM のルータ (DHCP Relay Agent を兼ねる) の IP アドレス、 1c:b1:7f:XX:XX:XX が BH812V の MAC アドレスで、 122.218.XX.XX が BH812V に割当てられたグローバル IP アドレス。 「Magic Cookie 0x63825363」 の行以降が、 DHCP オプション。 DHCP オプションとは、 DHCP サーバがクライアントにネットワーク設定情報等を伝えるためのもの。 つまり、 デフォルトゲートウェイや DNS サーバ等。 DHCP オプションを見ていくと、 見慣れないものが... 「T201 Option 201」 「T202 Option 202」 って何だ? これらオプションの値が (tcpdump が表示する際に) 10進数値に変換されてしまっているので、 文字に戻してみると:

	    T201 Option 201: "SIP-OK"
	    T202 Option 202: "https://voipsetup.fttx.co.jp/setup.aspx?cid=&rid="

何のことはない、 グローバルかプライベートかが問題なのではなくて、 UCOM の DHCP サーバが VoIP 設定情報の URL を BH812V へ提供していただけだった。 つまり、 プライベート IP アドレスを割当てる際、 UCOM DHCP サーバと同じ設定情報を提供すれば BH812V は VoIP アダプタとして機能するはず。 DHCP サーバ (前述した図の 「NAT 機能付ルータ」 上で走らせている) の設定ファイル dhcpd.conf に、 以下のような感じで T201/T202 の設定を書き加えてみた:

authoritative;
option T201 code 201 = text;
option T202 code 202 = text;

option domain-name "gcd.org";
subnet 192.168.10.0 netmask 255.255.255.0 {
	option domain-name-servers 192.168.10.1;
	option routers 192.168.10.1;
	option subnet-mask 255.255.255.0;
	option broadcast-address 192.168.10.255;
	option T201 "SIP-OK";
	option T202 "https://voipsetup.fttx.co.jp/setup.aspx?cid=&rid=";
	range 192.168.10.129 192.168.10.159;
}

すると、 この DHCP サーバからプライベート IP アドレスを割当てられた BH812V は、 https://voipsetup.fttx.co.jp/setup.aspx?cid=&rid= から VoIP 設定情報を取得して VoIP 機能が使用可能になった。 ここ数日、 Aterm BH812V を LAN 内に設置したまま様子を見ているが、 今のところ特に問題は起きていない。 もっとも、 固定電話を使う機会はほとんど無いのだけれど (^^;)。

なお、 この VoIP 設定情報のページは Basic 認証で保護されている。 つまり BH812V はこのページにアクセスするためのユーザID とパスワードを内蔵していると考えられる。 Basic 認証なので生パスワードが送出されてしまうが、 BH812V は 「信頼できる」 HTTPS サーバにしか接続しないことでパスワードの漏洩を防いでいる。 例えば、 voipsetup.fttx.co.jp は 「C=JP, ST=Shizuoka, L=Kakegawa, O=NEC AccessTechnica Ltd, CN=NEC AccessTechnica Ltd」 によって認証されている。 ただ、 ミスによって大穴があいてしまうことは有り得る。 Digest 認証など、 生パスワードを送出しない認証方法を採用すべきだったのではなかろうか?

Z80 コンピュータを作ってみた (27年前のお話)

$
0
0

往年の 8ビット・マイクロプロセッサー Z80。 最近の若い IT エンジニアだと知らない人も多い? 現在でも組み込み用途で使われているのに、 プログラマの高齢化が進んでいるらしい。 私がコンピュータを学んだ思い出深い CPU なので、 このまま忘れ去ってしまうのもモッタイナイ。 思い出せる限り記録に残しておこうと思う。 コンピュータを原理から学ぼうとする人の参考になれば幸い。

以下は、私が大学一回生のとき (1986年, 昭和61年) 独学で作った CP/M (Control Program for Microcomputer, パソコン用シングルタスク OS) マシンの記録。

私は高校生のとき (1983年)、 シャープ製パソコン MZ-80K2E改造しながら独力でデジタル回路を学んだ。 当時のコンピュータ雑誌 (工学社 「I/O」 誌) に掲載された MZ-80K の回路図が大いに参考になった。 1983年版 TTL IC 規格表を片手に MZ-80K の回路図を読み解いて、 コンピュータの仕組みを学んだ。

受験勉強そっちのけでデジタル回路の勉強にのめり込んでしまったので一浪する (1985年) はめになったが、 無事大学に合格した後はたっぷり時間があったので、 Z80 コンピュータを作ってみた。 MZ-80 に倣って当時これを HZ-80 と呼んでいたので、 以下 HZ-80 と呼ぶ。

HZ-80 の写真 ↓ (上面 / 下面)

HZ80

HZ-80 にはディスプレイもキーボードも無いので、 改造した MZ-80K2E とパラレル通信ケーブルで結び、 MZ-80K2E を端末として使用した。 写真 ↑ 中央に見える黒色の 40ピン ソケットに、 パラレル通信ケーブルをつなぐ。 MZ-80K シリーズは画面が横 40文字しか表示できないので、 (MZ 本体とは別に) 80文字表示できるビデオ信号生成回路を作り、 MZ-80K2E の CRT へ出力して、 80桁x25行キャラクタ表示端末として使っていた。

写真左手に見える 36ピン アンフェノール ソケット (セントロニクス仕様のプリンタ用と同じ形状) に、 (PC-8001/8801シリーズ用の) 5インチ フロッピー ディスク ドライブ (以下 FDD と略記) をつなぐ。

写真右手に見える赤と黒の端子に +5V のスイッチング電源をつなぐ。

写真から見て取れるように、 HZ-80 は ケージに収めた 5枚の基板から構成されている。 各基板を外して並べてみた (写真 ↓)。

HZ80 boards

上段左から、 FDD インタフェース基板、 6809 基板 (6809 マシン, 後述)、 I/O 基板 (パラレル通信インタフェース)。 下段左から D-RAM 基板、 そして Z80 CPU 基板。

Z80 CPU 基板

コンピュータ全体をいっぺんに設計し、 半田付けして一発で動かせるとは (もちろん) 思っていなかったので、 可能な限り小さい回路で動作確認しつつ、 徐々に大きな回路に組み上げていき、 最終的に CP/M が動くマシンを作ることを目指した。 すなわち、 この Z80 CPU 基板は、 (電源をつなげば) この基板単体で (ケージに入れなくても) 動作する (写真 ↓ 裏面)。

CPU board

動作確認手段としては赤色LED (写真右上隅) が一つあるのみだが、 LED を一定パターンで点滅させるプログラムを走らせることによって、 少なくとも正常にプログラムが実行できていることを確認することはできる。 厳密な動作確認は、 コンピュータ全体が完成し、 プログラムの開発環境が整ってからやればよい。

写真右側、1.4A と書かれた紙が貼ってある LSI が、 UV EPROM 2764。 「UV」 すなわち紫外線 (Ultra Violet) で消去可能 (Erasable) な 64kビット (つまり 8k バイト) Programmable ROM。 黒いビニールテープが貼ってあるが、 これを剥がすと IC チップ表面を覗けるガラス窓があり、 そこに紫外線を照射すると記憶内容を消去できる (全バイト 0xFF になる)。

ROM writer (高校生の時に自作した) を使って ROM にプログラムを書込み (2764 の場合 21V の電圧を印加すると書込める。 書き込みは 1 → 0 方向のみ可能で、 0 → 1 は紫外線でないとできない)、 この Z80 CPU 基板に差し込んで実行する。 プログラムを書き換えるたびに、 ROM を抜く → 殺菌灯を仕込んだ箱 (これも自作) に入れて紫外線を 20分ほど照射 → ROM writer にセットして新しいプログラムを書込む → ROM を差す、 という作業が必要になる (1バイト書き換えるだけでもトータル 1時間くらいかかる)。

ちなみに、 紫外線をあてなくても任意のバイトを 0x00 にすることと、 0xFF なバイトを任意の数値に書き換えることはできる (どちらも 1 → 0 方向だから) ので、 古いプログラムを 0x00 で書きつぶし、 その後の 0xFF の領域に新しいプログラムを書くことはできる (紫外線で消去する時間を節約できる)。 Z80 では 0x00 は NOP 命令 (No Operation, 何もしない命令) なので、 書きつぶした古いプログラムの領域をスルーして、 新しいプログラムが実行される。

なお、 プログラムの開発は、 キャリーラボ製 Z80 アセンブラ 「BASE-80」 を用いて MZ-80K2E 上で行なった。

昔の (1980年前後) パソコン雑誌には、 BASIC などで書いたソースコードや、 実行形式のバイナリデータが数多く掲載されていた。 読者は何ページにもわたるプログラムを大変な労力をかけてパソコンに入力する。 バイナリデータは 16進ダンプで 256バイトのブロックごとに縦横 16バイトずつのチェックサムが付いていた。 チェックサムのおかげで入力したデータにミスがないか確認できたが、 BASIC などで書かれたソースコードの場合はどうやって入力ミスを修正していたのだろう? 私は滅多に入力しなかったが、 数少ない例外がこの BASE-80 だった。 当時高校生だった私にとって、 シャープ純正の開発環境を買い揃える余裕はなく、 雑誌を買うだけで入手できた BASE-80 は非常に有難かった。 このあたりの話は、 日経Linux 連載の枕にも書いた。

ROM の左隣にある大きな LSI が Z80A CPU で、 その下が 8MHz 水晶発振子。 LED の下にある押しボタンはリセットスイッチ。 配線はラッピング用ワイヤを半田付けしている。

当時書いた手書きの回路図が残っていた ↓ 。 日付 (昭和61年 = 1986年) は設計した日。 この日付以降に半田付けを開始して、 動作確認できるようになるまで一週間以上 (一ヶ月以上? ^^;) かかった。

CPU board circuit 1

TTL の多くは、IC パッケージの中に複数のゲートが入っている。 例えば LS04, LS05, LS14 は、 それぞれ NOT ゲートが 6個ずつ入っているし、 LS260 は AND ゲート が 2個入ってる。 基板上の IC 数を減らすため、 できるだけ全てのゲートを使いきるようにした。 例えば、 LED を光らせるためにオープンコレクタな LS05 を用いたので、 残りの NOT ゲート 4個を使って、 ワイヤード AND ゲートを構成している。

「AC15」 など、 添字 「C」 付の信号線は Z80 CPU の信号線。 「KILL」 は、 D-RAM 基板 (後述) 上の RAM を無効にするためのエッジコネクタ (後述) 信号線。 KILL をアサート (この信号線は負論理なので低電圧が 「真」 状態) すると、 D-RAM 基板のデータバスがハイ・インピーダンスになるので、 データバスを RAM 以外が利用できるようになる。

Z80 CPU のメモリ空間は 64KB しかないので、 32KB ずつメモリバンクを切り替えている。 すなわち、 I/O 0x00番地に書込んだ 8bit データ D7〜0 のうち、 D7〜5 (第7bit から第5bit までの上位3bit) が Z80 の高位 32KB のメモリ空間 (0x8000〜0xFFFF) に、 D4〜2 が低位 32KB のメモリ空間 (0x0000〜0x7FFF) に、 それぞれ割当てられる物理メモリのアドレス A17〜A15 になる。 また、 D1 が 0 のとき、低位 8KB のメモリ空間 (0x0000〜0x1FFF) に CPU 基板上の ROM (8KB UV-EPROM) が割当てられる。 さらに、 D0 (最下位ビット) の値 1/0 が LED の点灯/消灯に対応する (D0 が 1 のとき点灯、0 のとき消灯)。

CPU board circuit 2

クロックは、 8MHz の水晶発振子を分周することで CPU の 4MHz クロックを生成している。

アドレスバス A14〜A0 およびデータバス D7〜D0 など、 CPU の信号線のほとんどをそのままエッジコネクタに接続している。 各基板のエッジコネクタは、 ケージのソケットを介して互いに接続される。 エッジコネクタの端子接続表 ↓

CPU board circuit 3

IEI は Interrupt Enable In の略で、 この信号線がアサート (High レベル) されているときのみ、 優先順位の低いデバイスは割り込みを要求できる。 現代の感覚からすると信じがたいが、 Z80 の時代は、 割り込みの優先順位は Hard Wired Logic だった。

D-RAM 基板

CPU 基板だけでは書き換え可能なメモリが無いので、 プログラムを書くことすらままならない。 この手の簡易なコンピュータでは、 まず小容量の Static RAM を搭載するのが普通だが、 TTL IC の数を減らすため、 小容量の RAM を使わず、 いきなり (当時としては ;-) 大容量の 256Kbit D-RAM を使うことにした (写真 ↓ 裏面)。

D-RAM board

大阪日本橋で見つけたメモリーモジュール基板を使って 2階建てにしている (写真 ↓ 反対側)。 D-RAM LSI は両基板に挟まれて見えないが、 三菱の 256Kbit D-RAM M5M4256P-12 を 8個使用している (つまり合計 256KB)。

D-RAM module

ラッピング用ワイヤを一本一本半田付けするのは大変な手間なので、 このモジュール基板のおかげで大変助かった。

D-RAM LSI は一般にピン数を減らすため、 アドレス線を上位/下位ビットに分けて入力する。 上位 (Row) ビットを入力するときは RAS (Row Address Strobe) をアサートし、 下位 (Column) ビットを入力するときは CAS (Column Address Strobe) をアサートする。 さらに D-RAM はリフレッシュ用のアドレスを与える必要があってややこしい。 D-RAM 基板はタイミングチャート ↓ を作成した上で設計した。

D-RAM timing chart

D-RAM タイミング回路 ↓ 。 LS157 (2 to 1 Data Selectors) が、 MREQ がアサートされた後のクロックの立ち上がりエッジで、 アドレス線を上位ビットから下位ビットへ切り替える。 「Ar8」 など、 添字 「r」 付の信号線は D-RAM の信号線。 KILL がアサートされている場合は、 CAS をアサートしないので、 D-RAM のデータ線がハイインピーダンスになる。

D-RAM board circuit 1

Z80 は 7bit 分のリフレッシュアドレス (A6〜A0) しか出力しないので、 カウンタを使って 1bit 分 (A7R) を追加生成する。 カウントアップが変則的なのは、TTL IC を節約するため。

D-RAM board circuit 2

簡易なメモリチェックプログラムを (CPU 基板の) ROM に書込んで、 D-RAM の動作確認を行なった。 出力は相変わらず LED のみであるが、 (普通の) AM ラジオを使うと、 プログラムの動作状況が (なんとなく) 確認できる。 すなわち、 正常にメモリチェックプログラムが動いている場合と、 暴走してデタラメに動いている場合とでは (漏洩する) 電波のパターンが異なるので、 ラジオから聞こえるノイズで区別することが可能。

簡易コンソール基板

以上で、 コンピュータとしての最低限の機能は揃ったので、 次に必要なのは端末 (キーボード & ディスプレイ) との通信機能。 といっても、 当時の私は端末なんて持ってない。 パソコンに通信機能 (RS-232C インタフェース等) が標準搭載されるようになるのはもうちょっと後の話。 きちんと通信できる端末がないとデバッグもままならないので、 簡易な端末を作ってみた (写真 ↓ 裏面)。

16key & 7seg terminal

7セグと押しボタンを並べただけ。 あまりに簡易すぎて回路図も残ってない (というか回路図も書かずに作ったような記憶が... ^^;)。 4個の 7セグと、4列の 16進キーの中から 1個と 1列を、 TTL LS139 (2 to 4 Demultiplexer) で選んで点灯 & キー入力する仕組み。 つまり一度に点灯できるのは 1個の 7セグだけだが、 10msec 程度の間隔で順に点灯させることにより、 同時に光っているように見える (ダイナミック点灯)。 パラレル通信線は 16本あって、 うち 2本を LS139 の入力に、 うち 8本を 1個の 7セグを点灯するために、 うち 4本を 16進キー 4個の状態の読み取りに、 それぞれ使う。 すると 2本余るので、 白と赤の押しボタン (写真左下隅) を追加したのだろう。

パラレル通信インタフェースのデバッグのために作った簡易コンソールだが、 プログラムを 16進で入力したり、 メモリの状態を 7セグに表示させたりする役にも立った。

I/O 基板

続いて作ったのが、 パラレル通信のための I/O 基板 (写真 ↓ 裏面)。

I/O board

LSI が 3つ並んでいるが、 一番右がパラレル通信用の Z80 PIO (Parallel I/O)。 16本の入出力線を持っているので、 これをそのまま 40ピン ソケットにつないでパラレル通信線にする。

その隣が時間を測るための Z80 CTC (Counter Timer Circuit)。 一定間隔で Z80 CPU に割り込みをかけて、 時計機能を実装したり、 あるいは前述した簡易コンソールの 7セグをダイナミック点灯させたりするのに使う。

一番左の LSI が Z80 DMA (Direct Memory Access Controller)。

TTL IC が 2つしか載ってないことからも分かる通り、 回路図 ↓ はいたって簡単。

I/O board circuit 1

3 to 8 Demultiplexer LS138 を使って、 I/O 0x10〜0x13 番地をアクセスすると Z80 DMA へ、 0x14〜0x17 番地をアクセスすると Z80 PIO へ、 0x18〜0x1B 番地をアクセスすると Z80 CTC へ、 それぞれアクセスできる。

I/O board circuit 2

40pin コネクタ端子接続表 ↓ 。 Z80 PIO の 16本の入出力ピンをそのまま出しているだけ。

I/O board connector

この I/O 基板を、 前述した簡易コンソール基板と 40芯フラットケーブルで結んだ。 Z80 CTC を使って 10msec の間隔で Z80 CPU に割り込みをかけ、 7セグをダイナミック点灯させるプログラムを書いた。 さらに、 機械語モニタを書いて、 16進キーでプログラムを入力して実行させたり、 メモリの内容を 7セグに表示できるようにした。 この段階で、 TK-80 (RAM 1KB) とほぼ同等のことが実現できた (カセットテープレコーダにプログラムを保存することはできないが)。

そして、 同様のパラレル通信機能を Z80 PIO を使って MZ-80K2E 側にも作り込み、 MZ-80K2E を端末として HZ-80 への入出力に使うことができるようになった。 単にキーボードから入力/ディスプレイへ出力できるようになったというだけでなく、 MZ-80K2E 上で BASE-80 を用いて開発したプログラムを、 ROM に書込まずに実行できるようになったという点で、 開発効率が劇的に向上した。

FDD インタフェース基板

プログラムを入力できるようになったといっても、 それを保存する手段がないので電源を切れば消えてしまう。 そこで次に FDD (フロッピー ディスク ドライブ) をつなぐことにした。 当時 FDD は高価だったが、 幸い PC-8001/8801シリーズ用のミニ ディスク ユニット PC-80S31 の中古品を 5万円程度で入手することができた (定価は 168,000円)。 PC-80S31 は 5.25インチ 2D (両面倍密度) で、 ディスク一枚あたり 320KB の容量があった。

5万円といえど当時大学生だった (入学直後でまだアルバイトもしていなかった) 私には大金で、 果たして HZ-80 につないで活用できるのか不安だったが、 フロッピディスク入門ハンドブック (秀和システム 1984年発行) にインタフェース仕様の詳細が解説されていて、 FDD インタフェース基板を作ることができそうだったので、 大阪日本橋で思い切って購入した。

PC-80S31 は内部に専用の CPU を持ち、 コンピュータ本体とパラレル通信するインテリジェント タイプ。 Intel 8255 (PPI, Programmable Peripheral Interface) で通信する仕様なので、 8255 を使ったインタフェース基板を作った (写真 ↓ 裏面)。

Floppy board

I/O デコードするためだけに TTL IC を 3個も使っていて、 しかも LS32 と LS04 は半分以上のゲートが未使用だが、 この基板の残りのエリアに RS-232C 機能を実装する予定で、 その時に残りのゲートを使用すればよいと考えていたため。

Floppy Disk Interface board circuit

こうして FDD と通信ができるようになり、 MZ-80K2E で開発したプログラムを、 フロッピー ディスクに保存できるようになった。 といっても、 「ファイル」 などの概念はなく、 単に保存先のセクタ番号を指定して読み書きする方式。 セクタ番号を手で管理する (「紙の」ノートに、どのセクタに何を書込んだか手書きで記入していた) 必要があるものの、 それまでプログラムの保存はカセットテープで行なっていたわけで、 save/load 時間が劇的に短縮された。

これ以降、 CP/M を動かすための BIOS の開発に注力した。 1986年の秋までには CP/M を動かすことに成功し、 インターリーブやトラックバッファなどの手法を用いたディスク入出力の高速化に熱中した。 HZ-80 のメモリバンク切り替え機能を活用して BIOS を裏バンクへまわし、 CP/M の TPA (Transient Program Area) を最大化した。 さらに、 通常はフロッピー・ディスクのシステム領域から読み込まれる CCP (Console Command Processor, コマンド・シェル) と BDOS (Basic Disk Operating System, CP/M 本体) を ROM 内に保存することにより、 CP/M の起動と (コマンド終了毎に行なわれる) 再ロードを、 ほぼ瞬時に行なえるようにして、 操作性を圧倒的に向上させたりした。 当時 WWW があったら、 ブログネタには事欠かなかっただろう。

なお、 回路図 ↑ に 「RS232C (8251 を用いる) を実装する予定」 とメモ書きがあるが、 結局実装はしなかった。 この基板に RS-232C 機能を追加すること自体は容易だが、 RS-232C で通信する端末をどうやって調達するか、 あるいは自作するか、 迷っているうちにソフトウェア開発のアルバイトを始めてしまい (1987年)、 興味がそちらへ移ってしまったため。

6809 基板

CP/M で一通り遊んだ後、 (FM-7 を持っていた友人から影響を受けて) OS-9 に興味を持ってしまい、 6809 基板を作った (写真 ↓ 裏面)。

6809 board

HZ-80 のケージには空きが 1つしか無かったため、 6809 MPU と 256KB RAM および HZ-80 との通信機能を一枚の基板に詰め込むことにした。 写真から分かる通り、 HZ-80 の他の基板と比べ実装密度が高い。 1986年11月に設計を始めたが、 何度も設計をやり直したため、 最終的に設計を固めて半田付けを開始したのは年が明けてから。

6809 は Z80 のようにリフレッシュアドレスを出力したりはしないので、 D-RAM 内部の CAS before RAS self refresh 回路を利用することにした。 すなわち、 RAS をアサートするより早く CAS をアサートすると (タイミングチャート ↓ 破線部分)、 D-RAM 内部でリフレッシュアドレスが順に生成されリフレッシュが行なわれる。

6809 timing chart

タイミングチャート ↑ 右上隅に 「没」 と書いてあるのは、 これを書いた後に設計のやり直しをしたから。 最終版のタイミングチャートは残ってない。 最終版はタイミングチャートも書かずに設計したのかも? (^^;)

6809 は Z80 とは異なりメモリマップドI/O であり、 Z80 の MREQ のようなメモリアクセスを明示する信号線はなく、 Qクロック (Quadrature Clock, Eクロックより位相が 90度先行するクロック) の立ち上がりエッジでアドレスバスが有効になる。 6809 がメモリアクセスを行なわないときは、 アドレスバスに 0xFFFF が出力される。

そこで、 A4 以外が 1 (つまり 0xFFEF か 0xFFFF) のとき、 CAS を (RAS より早く) アサートして (CASref 信号線) D-RAM のセルフリフレッシュを行なう。 つまり、 A4 が 1 (0xFFFF) のときは、 6809 がメモリアクセスを行なわないので D-RAM へのアクセスは必要ないし、 A4 が 0 (0xFFEF) のときは、 Z80 PIO の入出力線への I/O を行なう (ので D-RAM へのアクセスは必要ない)。

6809 board circuit 1

RAS は Eクロック (Enable Clock) の立ち上がりに合わせてアサートされるが、 アドレスバスは (Eクロックより位相が 90度先行する) Qクロックの立ち上がりのタイミングで安定しているので、 1/4 クロック (125ns) の分だけ無駄になっている。 RAS が遅いおかげで、 CAS を RAS より先に余裕を持ってアサートできるわけであるが。

D-RAM のアドレス入力を上位ビットから下位ビットに切り替えるために LS158 (2 to 1 Data Selectors) を使っている。 HZ-80 の D-RAM 基板では LS157 を使っていたのに対し、 LS158 は出力が負論理。 D-RAM のアドレス入力は正論理でも負論理でも構わないが、 Data Selectors の出力に LS04 (NOT ゲートなので論理が反転する) を挟んで D-RAM の CAS 入力がアサートされるのを少しでも遅延させたかったのだろう。 LS04 と LS02 を介すことによって 19ns 程度の遅延が生じ、 下位ビットへ切り替わったアドレス入力が安定するまでの時間を確保することができる。

6809 board circuit 2

HZ-80 と同様、 32KB ずつメモリバンクを切り替えている。 高位 32KB のメモリ空間 (0x8000〜0xFFFF) は、 固定的に 0x38FFF〜0x3FFFF の物理メモリが割当てられるが、 下位 32KB のメモリ空間 (0x0000〜0x7FFF) は、 A17〜A15 を HZ-80 側から設定できる (回路図 ↑ SEG2P〜SEG0P)。 TTL IC の数を節約するためとはいえ、 6809 が自力で自身のメモリバンクを切り替えることができないので、 少し (かなり? ^^;) 不便。

(メモリマップド) I/O 番地 0xFFEF へデータを書込むと、 回路図 ↓ PIOWRP がアサートされ、 Z80 PIO がパラレル通信線 AD7〜0 の 7bit データ、 すなわち 6809 のデータバスを読み取る。 逆に 0xFFEF からデータを読もうとすると、 PIORDP がアサートされ、 Z80 PIO がパラレル通信線 AD7〜0 すなわち 6809 のデータバスへ出力するので、 6809 がそのデータを読むことができる。

つまり 6809 のデータバスが、 HZ-80 とのパラレル通信線と直結している。 無茶な設計だなぁと当時も思いつつ設計したのであるが、 きちんと動いたので自分でも驚いた。

6809 board circuit 3

6809 マシン丸ごと、 しかも HZ-80 側の Z80 PIO (およびそのデコード部) も含めて、 わずか 12個の TTL IC で実現したのは記録的ではなかろうか (自画自賛 ;-)。 この 6809 基板は 6809 を走らせることに自体に関しては成功したが、 OS-9 を走らせることはできなかった。 割り込みを HZ-80 との通信に固定的に割当ててしまったため。 マルチタスク OS にはタイムスライスのために割り込みが必要なんて、 当たり前のことなのに... (>_<)

OS-9 を動かすべく改修する計画もあったのだけど、 大学 2回生になって (1987年) 始めたソフトウェア開発のアルバイトのほうに熱中するようになって、 FDD インタフェース基板上の RS-232C 機能と同様、 作らずじまいになってしまった。

nexus5 に ストラップを付けてみた ~テグスを使って~

$
0
0

ほとんどの人にとって無用なケータイ ストラップ。 iPhone を最右翼として、 最近の (海外製) スマホのほとんど (全て?) にはストラップを付ける穴 (ストラップ ホール) がない。 しかしながら (私を含めて) ストラップが必要と思う人にとっては、 ストラップが付けられないケータイは使う気がしない。 私が使うストラップは、 腰に付けたまま電話できる長いタイプ。 日本ではあまり見かけないので香港でまとめ買いした。 一本約 80円。 常に腰と結び付けたままなので、 ケータイをどこかへ置き忘れるということがないし、 頭の高さからケータイを落下させても、 ストラップが最大限に伸びたとき地面に激突しないような長さのものを使っている。

同じように考える人が少なくないようで、 ストラップ ホールが無いケータイに、 なんとかストラップを付けようと模索する WWW ページが沢山見つかる。 nexus 5 においても、 早速ストラップを付けた人がいるようだ。

しかし、 nexus 5 の裏蓋と nexus 5 本体との間には隙間がほとんどなく、 このページで解説されているようにストラップの紐 (直径 0.7mm くらいある) を間に挟むのは少々無理がある。 裏蓋には NFC や Qi (チー) などのアンテナがあり、 本体と裏蓋が密着していないとアンテナとの接触が不良になる恐れがある。

そこで、 nexus 5 の機能には極力影響を与えず、 もちろん nexus 5 を傷付けずに、 ストラップを付ける方法を考えてみた。

nexus5 with strap

幸い、 nexus 5 の下部には、 スピーカーとマイク用の穴 (直径約 0.8mm) が、 左右にそれぞれ 16個づつある。 しかもスピーカー穴の内部には、 スピーカーとの間に直径 0.5mm 程度の糸なら無理無く通せる空間がある。 内部がギッシリ詰まっている nexus 5 において、 この空間は例外的な存在。 そこで、 太さ約 0.52mm の 10号テグス (ナイロン ライン) をスピーカー穴に通してみた。↓

put a thread through the hole of nexus5

写真 ↑ の LG-D820 と書いてある部分に、 スピーカーが入る。 写真では見にくいが、 スピーカー穴の裏側の周囲にはクッションがあり、 テグスはスピーカーとは接触しない。 もちろん、 16個あるスピーカ穴のうち 2個をテグスで塞いでしまっているので、 そのぶん音量は小さくなると思われるが、 その差は (少なくとも私には) 体感できない。

ナイロン糸が釣り糸に使用される以前は、テグスサンというヤママユガに近い蛾の幼虫の絹糸腺から作ったテグスや、スガ糸(絹)などが使用された。
釣り糸の販売は、江戸中期に徳島の漁師が薬剤を縛る半透明の紐を見て「これを使えば魚はいくらでも釣れる。」と言ったのをきっかけに大阪の船場にある薬問屋だった「広田屋」がテグス商としてスタートさせたのが始まりである。
釣糸 歴史 から引用

穴周囲の筐体の強度が不明なので、 テグスに強い荷重をかけると筐体が変形あるいは損傷する可能性も否定できない。 私の場合、 ストラップに力が加わるのはケータイを落下させた場合などに限られるので問題無いと判断したが、 ストラップの使い方によっては問題になるケースもあるかもしれない。

ちなみに、 内部には LG-D820 (北米向けモデル) と書いてあるが、 この nexus 5 は LG-D821 (その他地域向けモデル)。 EMOBILE が 39,800円で売っていた nexus 5 を、 20,000円引 (GL06P とセット割) で購入した

私は常々、 スマホの画面の最適サイズは 6インチだと思ってる (Galaxy Mega 5.8 Duos GT-I9152 を愛用している) のだけど、 google が nexus 6 を出さないのは、 デッカードに退治されてしまうからだろうか?

スピーカー/マイク モジュールを元に戻し、↓

put a speaker/microphone module

裏蓋を嵌め込んで完成。 テグスを輪にするため、 釣り糸の結び方1 を参照した。

何度も裏蓋を開け閉めしていたら、 1分もかからず簡単に開けられるようになったが、 最初は力の加減が分からず大変。 スピーカー/マイク モジュール ↑ の両端に両面テープが貼ってあり、 裏蓋がくっついているので、慎重に剥がす。 nexus 5 に傷をつけないように、 写真 ↓ にあるようなヘラ (赤色 2本) を用いる。

tools for tearing apart nexus5

青色のドライバー (+) は、 スピーカー/マイク モジュールを留めているネジ 4本を外すために使用。

Nexus5 を買って、香港で LTE を使ってみた (中國移動香港 4G/3G 數據及話音 プリペイド SIM カード)

$
0
0

LTE (Long Term Evolution) は、 サービス展開がこれからの国・地域も多く、 多バンドをサポートする端末というと iPhone 5c/5s (A1453 の場合 1, 2, 3, 4, 5, 8, 13, 17, 18, 19, 20, 25, 26 の 13バンド!に対応) くらいしか無いので、 私は今まで様子見してた。 例えば、 香港で売られている国際版スマホは、 バンド 3 (1800MHz), 7 (2600MHz), 8 (900MHz), 20 (800MHz) どまりなものが多く、 これではバンド 1 (2100MHz) が主に使われている日本では使いにくい。

ところが先月、 イーモバイルが Nexus 5 (LG-D821) を売り出した。 Nexus 5 の米国向けモデルである LG-D820 (1, 2, 4, 5, 17, 18, 19, 25, 26, 41 の 10バンドに対応) には見劣りするものの、 LG-D821 も 1, 3, 5, 7, 8, 20 の 6バンドをサポートしていて、 日本 (1, 3, 8) および香港 (3, 7) で使う分には問題無い (2, 4, 17 が無いので北米は厳しいけれど)。 もちろん SIM ロックフリー。 新規一括 39,000円で買うと、 月額料金を 2,660円割引してくれるらしい。 しかも Pocket WiFi LTE ルータ GL06P (3GB まで月額 580円) を契約すると、 Nexus 5 を 20,000円割引してくれるので、 香港で LTE スマホを買うよりずっと安くなってしまう (昨今の円安で、香港のスマホは、以前のような割安感が無くなっている)。

Nexus 5 が新規一括 19,000円で、 しかも月々 2,515円 (2年で解約しない場合、3年目以降は 6,230円/月) で 5GB まで使えるということなので衝動買い。 唯一の誤算は、 ソフトバンクからの MNP を考えていたのに、 イーモバイルはソフトバンク傘下ということで MNP しても安くならないどころか、 かえって高くなってしまう点。 仕方ないのでソフトバンクの契約を維持したままイーモバイルを新規契約し、 (電話番号を変えたくないので) それまで使っていたソフトバンクの電話番号への着呼を、 イーモバイルの電話番号へ常時転送するようにした。 Nexus 5 用の料金プランであるイーモバイル 4G-S プランは、 ソフトバンク ホワイトプランとの 1:00〜21:00 の間の通話が無料なので、 転送電話 (留守番電話呼出しなし) を設定していても、 (21:00 過ぎに電話をかけてくる人がいない限り) ほとんど料金がかからない。

SIM Card Shop at Ap Liu st.

スマホを買おうと香港へ行く計画を (イーモバイルが Nexus 5 発売を発表する前に) 立てていたのに、 行く直前に Nexus 5 を買ってしまい、 香港で買うものがなくなってしまった (^^;)。 が、 旅行をキャンセルするわけにもいかないので、 香港へ行って Nexus 5 (と Galaxy Note 2 LTE) で LTE を使ってみた

中國移動香港 4G/3G 數據及話音儲值卡 (CMHK 4G/3G Data & Voice Prepaid SIM Card) は、 HK$80 ぶんの度数が付いたプリペイド SIM カード。 額面は HK$80 だけど深水埗 (鴨寮街) などでは HK$50 (約 660円) で売っている (写真 →)。

SIM をアクティベートすると、 最初に行政費 (Administration Fee, 税金) HK$2 が差し引かれ (以降 30日ごとに HK$2 ずつ引かれる)、 5日間有効な 1.5GB データパッケージ HK$48 を購入すると、 残り HK$30 (= 80 - 2 - 48)。 これを通話 (HK$0.1/分) で使うと約 300分使える。 5日間までの短期滞在ならデータ通信も通話も、 これ一枚で充分だと思う。 もちろん、テザリングも (1.5GB までの範囲で) 可能。

データパッケージを申し込まないと、 1MB あたり HK$0.5 かかる。 一日 (香港時間 0:00〜23:59) の上限が HK$28 (約 370円) で、 それ以上は課金されないが、 一日の通信量が 1GB を超えると 128kbps に制限される。 一日だけしか使わないなら、 データパッケージを申し込まない方が安いが、 二日以上なら申し込むべき。 申し込む前に Nexus 5 が勝手に通信を始めたりしないよう、 あらかじめ 「モバイルネットワーク設定」 で、 データ通信を無効にしておくとよい。

China Mobile Hong Kong 4G/3G Data & Voice Prepaid SIM Card

ただし、 データ通信を行なわないと、 自動的には SIM がアクティベートされず、 アクティベートされていない状態でデータパッケージを申し込もうとすると、 次のような SMS が届く。

From: +852193193
Date: Thu, Nov 28, 2013 at 2:39 PM

你的戶口尚未啟動。在香港打出首個電話,在外地打出*#130#即可啟用此儲值卡。
Your SIM card is not activated. Make first call in Hong Kong or dial *#130# in oversea to activate the card.

「Date:」 は日本時間。 香港国際空港に着陸直後でまだ taxing 中のキャセイパシフィック航空の飛行機の中で、 SIM をアクティベートしようと格闘していた次第 (^^;)。

この SMS に書いてある通り、 どこかへ電話すれば SIM をアクティベートできるが、 電話をかける先がないと困るかも? 私は他にも SIM を持っていた (CSL3HK) ので、 その番号にかけてアクティベートしたのだけど、 他に SIM が無く、 香港に知人等もいなければ、 日本へ国際電話をかけるか、 カスタマ サポート 2945-8888 にかけるしかない? SIM カードの説明 ↓ には、 国際電話 (IDD) が可能な相手国が書いてあって、 日本の場合は固定電話の番号 (固網號碼) に対してだけ可能であるように読めるが、 携帯電話の番号だとダメなんだろうか?

なお、 この SMS には 「dial *#130# in oversea」 と書いてあるが、 この SIM はローミングには対応していないので 「oversea」 では発呼できないと思う。 少なくとも日本からは無理。

China Mobile Hong Kong 4G/3G Data & Voice Prepaid SIM Card Inside

SIM 付属の説明書には、 200MB と 1GB のデータパッケージしか記載されていないが、 中國移動香港の Web ページには、 前述の 5日間 1.5GB パッケージの他、 以下のデータパッケージ (數據組合) が記載されている:

有効期間データ量速度申込み方法料金
SIM の有効
期間と同じ
200MB無制限*103*100*01#HK$50
1GB無制限*103*100*02#HK$148
5日間1.5GB無制限*103*100*07#HK$48
10日間1GB14.4Mbps*103*100*08#HK$68
10日間無制限384kbps*103*100*09#HK$30

この Web ページに載ってる SIM パッケージの画像をよく見ると、 私が深水埗で買った SIM パッケージ (2枚) とは、 表紙が少し違う (^^;)。 Web 記載の表紙には 「5日/1.5GB $58」 と書いてある (実際は $48 なので誤植?)。 最新版の SIM パッケージには、 「5日/1.5GB」 他のデータパッケージの説明も載っているのかも?

私が購入した、 使用限期 (使用期限) が 2014年2月24日のものと、2014年6月30日のものは、 どちらも説明書の内容が同じで 200MB と 1GB の 「SIM の有効期間と同じ」 データパッケージしか記載されていないが、 少なくとも 「5日/1.5GB」 は使えたし、 おそらく 10日間有効のデータパッケージも同様に使えるのだと思われる。

「*103*100*07#」 をダイヤルすると、 次のような SMS メッセージが届いて、 データパッケージが利用可能になる:

From: +852193193
Date: Thu, Nov 28, 2013 at 2:43 PM

1536.000 MB Local Data Volume has been granted to your account, and valid till 03/12/2013 23:59, please use it before expiry date.

HKD 48.00 deducted and 1.5GB 5 days LTE Mobile Data Usage has been activated.
result of speedtest

早速、 スピードテストを行なってみた:

君怡酒店 (The Kimberley Hotel) ロビーでチェックイン待ちしているときに測定。 香港滞在中、 ほとんどの場所でストレス無く通信できた。 いちいちチェックしたわけではないが、 大抵の場所で LTE を利用できていたように思う。 例外は出国時に利用した空港ラウンジくらい?

今回の訪港は 3泊4日の短期滞在だったので、 迷わず 「5日/1.5GB」 を選択したが、 10日程度の滞在の場合にどのパッケージを選択すべきかは微妙。 テザリングも含めて 1日 100MB 〜 200MB くらい使うとすれば、 「10日/1GB 14.4Mbps」 では足らなくなる可能性が高いので、 「5日/1.5GB」 を 2回購入することになるのかも? テザリングをしない、 あるいはホテル等で無線LAN が使えるのであれば、 「10日/1GB 14.4Mbps」 で充分かも知れない。

なお、 この SIM カードは表紙に 「4G/3G 本地數據」 「本地通話」 と書いてある通り、 「本地」 (local) サービスのみで、 ローミングには対応していない。

チャージ (充值, refill) はネット上で行なえるが、 残度数照会や有効期限の確認が行なえないので、 訪港せずにこの SIM を維持し続けるのは難しいかもしれない。 しかも、 30日ごとに行政費 HK$2 が残度数から差し引かれる。 SIM アクティベート後、あるいは HK$50 以上のチャージをすると、 その時点から 180日間有効。 ただし、 使用限期まで 180日を切ってしまうと、 勝手にアクティベートするらしい (もちろん、使用開始しなければ行政費は差し引かれない)。 私が買った二枚の 「4G/3G 數據及話音儲值卡」 のうち一枚は 「使用限期 24/02/2014」 と書いてあり、 アクティベート不要でいきなり使えた (2013年11月29日)。 香港を離れる前に有効期限を確認 (「*#130#」 をダイヤル) したら、 「有效期至 24/02/2014 23:59」 つまり使用限期と同じ 2014年2月24日のままだった。

nexus5 の充電をワイヤレス (Qi 給電) にしたので、バックアップもワイヤレスにしてみた 〜 ssh サーバを nexus5 上で動かす 〜

$
0
0

昨今の円安のため香港ドルが高い (>_<)。 昨年は 10円/HK$ 台だったのに、いまや 13円/HK$ を超えている。 香港 (に限らないが) の人たちが大挙して日本に買物に来る気持ちが分かる。 これだけ円安が進めば、 日本じゅうどこへ行っても、 全てのものが安く感じられるのだろう。

ARENA Scientific Icey QI Charging Pad

逆に、 日本人が香港へ行くと、全てのものが以前より 3割ほど高く見えるわけで、 物欲が萎えてしまいほとんど買物しなかった (おまけに、香港に行く直前に日本で nexus 5 を買ってしまったし)。 とはいえ、 香港までわざわざ行っておきながら何も買わないというのもアレなので、 Qi 充電器を買ってみた。 深水埗 黄金電腦商場 地下35號舖 Sunny Computer Digital Co 力生電腦數碼公司 →

HK$199 = 約2700円なので、 ちっとも安くない。 「おにぎり」 こと、 ワイヤレスチャージャー 03 なら 2200円くらいで売っているが、 「おにぎり」 の電源が専用アダプタであるのに対し、 これは汎用の micro USB ケーブルが使えるのでよしとしよう。

この Qi 充電器を USB ハブの余っているポートにつないで机の上に置き、 その上に nexus 5 を置く。 使ってみると想像以上に便利。 電話がかかってきたとき、 以前はいちいち USB ケーブルを抜いていたのだけど、 Qi 充電器ならサッと nexus 5 を手に取れるし、 電話が終わったら Qi 充電器の上に戻すだけ。 はやく全てのケータイが Qi に対応して、 喫茶店などのテーブルに Qi 充電器を標準装備して欲しいなどと思う今日このごろ。

充電がワイヤレスなのに、 PC との通信に USB ケーブルを使っていては片手落ちである。 私は普段 rsync を使って nexus 5 上のデータを丸ごと PC へバックアップしているが、 有線な adb (Android Debug Bridge) を使うのは止めて Wi-Fi を使うことにした。

ここで注意したいのは、 主導権を握る (コントロールする) のは PC 側でなければならない、 ということ。 スマホ側 (nexus 5) が主導して rsync を起動するアプリならすでにいくつか出回っているが、 PC が目の前にあるときに何が嬉しくてスマホの小さい画面をいじらなきゃならないのかと思う。 Qi 充電器の上に置いたら、 もう 1 タッチといえどスマホには触りたくない。 全ての作業は PC のキーボードで完結させたい。

つまり、 PC がクライアントとなり、 スマホをサーバとして扱いたい、 ということ。 サーバのキーボードやモニタはトラブル発生時でもなければ使わないのと同様、 家にいるときはスマホは充電器の上に置きっぱなしにしておきたい。 あるいは寝室専用になってしまっているスマホ (各部屋に一台以上、専用スマホ/タブレットが置きっぱなしにしてある) は、 寝室に置きっぱなしのままで (別の部屋の) PC から操作したい。 スマホを PC から操作できれば、 コマンド一発で、 家じゅうのスマホ (10台くらいある) をいっぺんにバックアップしたり、 相互にデータを同期させたり、 何でも思いのまま (^^)。

スマホをサーバとして扱うには、 スマホ上で ssh サーバを動かしておけばよい、 ということで早速 dropbear サーバ (軽量 ssh サーバ) と rsync を nexus 5 (だけでなく私が持っている全ての android スマホ) にインストールした。

以下、インストールのメモ:

dropbear 公式サイトから最新版 2013.62 をダウンロードしてきてビルド。 dropbear は元々 android 用にビルドすることを想定している (つまり configure に --host=arm-linux-androideabi オプションを指定できる) ので楽。

私の PC の /usr/local/src/android-4.4_r1 以下には kitkat のソースツリーが置いてあるので、 これに含まれる android NDK と gcc クロスコンパイラ arm-linux-androideabi-gcc を使ってビルドした。

esaka:/usr/local/src/dropbear-2013.62 $ TOP=/usr/local/src/android-4.4_r1
esaka:/usr/local/src/dropbear-2013.62 $ SYSROOT=$TOP/prebuilts/ndk/current/platforms/android-9/arch-arm
esaka:/usr/local/src/dropbear-2013.62 $ export CFLAGS=--sysroot=$SYSROOT
esaka:/usr/local/src/dropbear-2013.62 $ export LDFLAGS=--sysroot=$SYSROOT
esaka:/usr/local/src/dropbear-2013.62 $ export PATH=$TOP/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/etc:/usr/local/bin:/usr/local/sbin
esaka:/usr/local/src/dropbear-2013.62 $ ./configure --host=arm-linux-androideabi --disable-zlib --disable-largefile --disable-loginfunc --disable-shadow --disable-utmp --disable-wtmp --disable-utmpx --disable-wtmpx --disable-pututline --disable-pututxline --disable-lastlog
checking for arm-linux-androideabi-gcc... arm-linux-androideabi-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
	... (中略) ...
checking for crypt in -lcrypt... no
configure: Disabling zlib
configure: Disabling PAM
configure: Using openpty if available
checking for library containing openpty... no
	... (中略) ...
config.status: creating Makefile
config.status: creating libtomcrypt/Makefile
config.status: creating libtommath/Makefile
config.status: creating config.h
configure: 
configure: Using bundled libtomcrypt and libtommath
configure: 
configure: Now edit options.h to choose features.
esaka:/usr/local/src/dropbear-2013.62 $ make
cd libtomcrypt && make
make[1]: Entering directory `/usr/local/src/dropbear-2013.62/libtomcrypt'
	... (中略) ...
arm-linux-androideabi-gcc --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -o dropbear dbutil.o buffer.o dss.o bignum.o signkey.o rsa.o dbrandom.o queue.o atomicio.o compat.o fake-rfc2553.o ltc_prng.o ecc.o ecdsa.o crypto_desc.o gensignkey.o gendss.o genrsa.o common-session.o packet.o common-algo.o common-kex.o common-channel.o common-chansession.o termcodes.o loginrec.o tcp-accept.o listener.o process-packet.o common-runopts.o circbuffer.o curve25519-donna.o svr-kex.o svr-auth.o sshpty.o svr-authpasswd.o svr-authpubkey.o svr-authpubkeyoptions.o svr-session.o svr-service.o svr-chansession.o svr-runopts.o svr-agentfwd.o svr-main.o svr-x11fwd.o svr-tcpfwd.o svr-authpam.o   libtomcrypt/libtomcrypt.a libtommath/libtommath.a  
svr-authpasswd.o:svr-authpasswd.c:function svr_auth_password: error: undefined reference to 'crypt'
collect2: error: ld returned 1 exit status
make: *** [dropbear] Error 1
esaka:/usr/local/src/dropbear-2013.62 $ 

ありゃ、エラーで止まってしまった。 「error: undefined reference to 'crypt'」 すなわち、 android には crypt(3) が無い、ということらしい。 パスワード認証なんてもともと使う気はない (ssh を使うなら公開鍵認証が基本!) ので、 options.h をちょっと修正:

--- options.h~	2013-12-03 22:39:15.000000000 +0900
+++ options.h	2013-12-11 18:15:14.123522720 +0900
@@ -192,7 +192,7 @@
  * PAM challenge/response.
  * You can't enable both PASSWORD and PAM. */
 
-#define ENABLE_SVR_PASSWORD_AUTH
+//#define ENABLE_SVR_PASSWORD_AUTH
 /* PAM requires ./configure --enable-pam */
 /*#define ENABLE_SVR_PAM_AUTH */
 #define ENABLE_SVR_PUBKEY_AUTH
@@ -314,7 +314,7 @@
 #define DEFAULT_IDLE_TIMEOUT 0
 
 /* The default path. This will often get replaced by the shell */
-#define DEFAULT_PATH "/usr/bin:/bin"
+#define DEFAULT_PATH "/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/usr/bin:/bin"
 
 /* Some other defines (that mostly should be left alone) are defined
  * in sysoptions.h */

ついでに、 ssh でログインしたときのデフォルト PATH を android 向けに修正 (/system/bin などを追加)。

android での標準的なシェルは /system/bin/sh であるが、 getusershell(3) は正しい値を返してくれない。 kitkat のソース $TOP/bionic/libc/bionic/stubs.cpp には次のように定義されている:

static void unimplemented_stub(const char* function) {
  const char* fmt = "%s(3) is not implemented on Android\n";
  __libc_format_log(ANDROID_LOG_WARN, "libc", fmt, function);
  fprintf(stderr, fmt, function);
}

#define UNIMPLEMENTED unimplemented_stub(__PRETTY_FUNCTION__)

	... (中略) ...

char* getusershell() {
  UNIMPLEMENTED;
  return NULL;
}

単に一言、 /system/bin/sh と返してくれればいいものを、 なんで 「not implemented」 のまま放置しているのだろう? (というか実装しないなら libc 内で関数を定義しないで欲しい。 未定義なら configure が判断できるのに) と思いつつ、 dropbear のソースで getusershell(3) を呼び出しているところを (goto 文で ^^;) スキップさせる:

--- svr-auth.c~	2013-12-03 22:39:15.000000000 +0900
+++ svr-auth.c	2013-12-11 18:10:20.383300542 +0900
@@ -291,6 +291,7 @@
 	 * should return some standard shells like "/bin/sh" and "/bin/csh" (this
 	 * is platform-specific) */
 	setusershell();
+	goto goodshell;
 	while ((listshell = getusershell()) != NULL) {
 		TRACE(("test shell is '%s'", listshell))
 		if (strcmp(listshell, usershell) == 0) {

ヘッダファイル options.h を書き換えたので、 念のため 「make clean」 してからビルドし直し:

esaka:/usr/local/src/dropbear-2013.62 $ make clean
cd libtomcrypt && make clean
	... (中略) ...
esaka:/usr/local/src/dropbear-2013.62 $ make
cd libtomcrypt && make
make[1]: Entering directory `/usr/local/src/dropbear-2013.62/libtomcrypt'
	... (中略) ...
arm-linux-androideabi-gcc --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -o dropbear dbutil.o buffer.o dss.o bignum.o signkey.o rsa.o dbrandom.o queue.o atomicio.o compat.o fake-rfc2553.o ltc_prng.o ecc.o ecdsa.o crypto_desc.o gensignkey.o gendss.o genrsa.o common-session.o packet.o common-algo.o common-kex.o common-channel.o common-chansession.o termcodes.o loginrec.o tcp-accept.o listener.o process-packet.o common-runopts.o circbuffer.o curve25519-donna.o svr-kex.o svr-auth.o sshpty.o svr-authpasswd.o svr-authpubkey.o svr-authpubkeyoptions.o svr-session.o svr-service.o svr-chansession.o svr-runopts.o svr-agentfwd.o svr-main.o svr-x11fwd.o svr-tcpfwd.o svr-authpam.o   libtomcrypt/libtomcrypt.a libtommath/libtommath.a  
	... (中略) ...
arm-linux-androideabi-gcc --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -o dbclient dbutil.o buffer.o dss.o bignum.o signkey.o rsa.o dbrandom.o queue.o atomicio.o compat.o fake-rfc2553.o ltc_prng.o ecc.o ecdsa.o crypto_desc.o gensignkey.o gendss.o genrsa.o common-session.o packet.o common-algo.o common-kex.o common-channel.o common-chansession.o termcodes.o loginrec.o tcp-accept.o listener.o process-packet.o common-runopts.o circbuffer.o curve25519-donna.o cli-main.o cli-auth.o cli-authpasswd.o cli-kex.o cli-session.o cli-runopts.o cli-chansession.o cli-authpubkey.o cli-tcpfwd.o cli-channel.o cli-authinteract.o cli-agentfwd.o list.o libtomcrypt/libtomcrypt.a libtommath/libtommath.a  
cli-auth.o:cli-auth.c:function getpass_or_cancel: error: undefined reference to 'getpass'
collect2: error: ld returned 1 exit status
make: *** [dbclient] Error 1
esaka:/usr/local/src/dropbear-2013.62 $ 

また止まってしまった。 けど、 これは dbclient (「db」 といってもデータベースクライアントじゃなくて、 ここでは 「DropBear」 のクライアント) のビルドに失敗しているだけで、 dropbear (ssh サーバ) 自体はビルドできている。 strip して 290 KByte.

esaka:/usr/local/src/dropbear-2013.62 $ arm-linux-androideabi-strip dropbear
esaka:/usr/local/src/dropbear-2013.62 $ ls -l dropbear
-rwxr-xr-x 1 sengoku user 297152 2013-12-11 17:01 dropbear

この dropbear を (adb 経由で) nexus 5 へ送り、 nexus 5 上で実行。 dropbear_dss_host_key および dropbear_rsa_host_key は (サーバであるところの) nexus 5 固有のホスト鍵で、 あらかじめ dropbearkey(8) コマンドを使って作成しておく。

root@hammerhead:/ # /somewhere/dropbear/dropbear -r /somewhere/dropbear/dropbear_dss_host_key -r /somewhere/dropbear/dropbear_rsa_host_key -F -E
[8271] Dec 11 18:18:05 Failed loading /etc/dropbear/dropbear_rsa_host_key
[8271] Dec 11 18:18:05 Failed loading /etc/dropbear/dropbear_dss_host_key
[8271] Dec 11 18:18:05 Failed loading /etc/dropbear/dropbear_ecdsa_host_key
[8271] Dec 11 18:18:05 Not backgrounding

「Failed loading」 すなわちホスト鍵の読み込みに失敗した旨のメッセージが出力されいるが、 これはホスト鍵のデフォルトのパスを読みに行ったためで、 「-r」 オプションで指定したホスト鍵の読み込みには成功したので、 ssh サーバとして正常に動作している。

ssh サーバが公開鍵認証を行なうには、 各ユーザのホームディレクトリ下に、 公開鍵を列挙したファイル ~/.ssh/authorized_keys を置く必要がある。 Linux OS など Unix 互換 OS の場合は、 /etc/passwd にユーザID やユーザのホームディレクトリなどを登録する仕組みなので、 ホームディレクトリの場所は自由に設定できるが、 android OS の場合は、 ユーザを自由に登録できるようにはなっていなくて、 ユーザID はソース $TOP/system/core/include/private/android_filesystem_config.h で定義 (ハードコーディング) されている。 しかも、 uid が 10000未満の (システム) ユーザは、 ホームディレクトリが 「/」(ルート) に、 uid が 10000以上の (アプリ) ユーザは 「/data」 に、 それぞれ固定されている (ソース $TOP/bionic/libc/bionic/stubs.cpp 参照)。

したがって、 dropbear のソースに (さらに) 手を加えてホームディレクトリ以外に公開鍵を登録できるようにするか、 あるいは ルート直下 /.ssh/authorized_keys に公開鍵を登録するか、 いずれかの方法を選ぶことになる。 dropbear に手を加えすぎると、 dropbear がバージョンアップしたとき (セキュリティホールが見つかって修正が必要になったときなど) に追随するのが面倒になるので、 私は後者の方法を選んだ。 android OS の場合、 ルート直下は RAM ディスク (initramfs) なので電源を切ると揮発してしまう。 そこで、 android OS の起動時に以下のスクリプトを走らせて /.ssh/authorized_keys に公開鍵をコピーするようにした。

if [ -d /data/cust/ROOT ]; then
    mount -oremount,rw null /
    cp -a /data/cust/ROOT/.ssh /
    mount -oremount,ro null /
    dropbear=/data/cust/dropbear
    $dropbear/dropbear -r $dropbear/dropbear_dss_host_key \
		       -r $dropbear/dropbear_rsa_host_key
fi

nexus 5 の場合、 起動時に /system/etc/install-recovery.sh が実行されるので、 このファイルの末尾にでも上記スクリプトを書き加えておけばよい。 これで root の他、 ホームディレクトリ 「/」 を共有している uid が 10000未満のユーザアカウント (system, wifi, adb, shell など) にログインできる。

以上で nexus 5 へ ssh ログインするための手はずが整ったので、 PC からログインしてみる:

esaka:~ $ ssh -l root 192.168.18.147
PTY allocation request failed on channel 0
shell request failed on channel 0
esaka:~ $ ssh -l root 192.168.18.147 sh -i
sh: can't find tty fd: No such device or address
sh: warning: won't have full job control
root@hammerhead:/ # 

ssh の引数に 「sh -i」 を付けて実行しているのは、 今回ビルドした dropbear では PTY (Pseudo TTY, 仮想端末) が利用できないため (「PTY allocation request failed」)。 元々 dropbear は openpty(3) を使って PTY をオープンするが、 android の libc には openpty(3) が存在しない (上記 ./configure の出力を参照)。 openpty(3) 自体は簡単に実装できるので、 dropbear が PTY を利用できるように修正することは容易だが、 あまり dropbear のソースに手を加えたくないため、 とりあえず PTY が使えないままビルドした。

「192.168.18.147」 は、 私の自宅の無線LAN セグメントにおいて、 nexus 5 に割当てられた IP アドレス。 PTY は利用できないが nexus 5 に無事ログインできた。 サーバー側から (もとい、nexus 5 側から) 見ると、 こんな感じ:

[8298] Dec 11 18:18:17 Child connection from ::ffff:192.168.18.20:48647
void setusershell()(3) is not implemented on Android
void endusershell()(3) is not implemented on Android
void setusershell()(3) is not implemented on Android
void endusershell()(3) is not implemented on Android
void setusershell()(3) is not implemented on Android
void endusershell()(3) is not implemented on Android
[8298] Dec 11 18:18:17 Pubkey auth succeeded for 'root' with key md5 56:c3:d5:dc:83:f4:0c:df:fc:4e:42:36:6a:dd:ff:c1 from ::ffff:192.168.18.20:48647

余計な警告 (「not implemented on Android」) が出ているが、 ちゃんと公開鍵認証できている。 一般に公開鍵認証の処理は CPU 負荷がかかるが、 ほとんどストレス無くログインできてしまうあたり、 下手なサーバより速いんじゃなかろうか > nexus 5

次に rsync をインストールする。

rsync 公式サイトから最新版 3.1.0 をダウンロードしてきてビルド。 rsync の configure は --host=arm-linux-androideabi オプションを指定できないので、 「CC=」 でクロスコンパイラを指定する。

esaka:/usr/local/src/rsync-3.1.0 $ TOP=/usr/local/src/android-4.4_r1
esaka:/usr/local/src/rsync-3.1.0 $ SYSROOT=$TOP/prebuilts/ndk/current/platforms/android-9/arch-arm
esaka:/usr/local/src/rsync-3.1.0 $ export CFLAGS=--sysroot=$SYSROOT
esaka:/usr/local/src/rsync-3.1.0 $ export LDFLAGS=--sysroot=$SYSROOT
esaka:/usr/local/src/rsync-3.1.0 $ CC=$TOP/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gcc ./configure --host=arm-linux-gnueabi --disable-largefile
configure.sh: WARNING: if you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used
configure.sh: Configuring rsync 3.1.0
checking build system type... x86_64-unknown-linux-gnu
checking host system type... arm-unknown-linux-gnueabi
	... (中略) ...
configure.sh: creating ./config.status
config.status: creating Makefile
config.status: creating lib/dummy
config.status: creating zlib/dummy
config.status: creating popt/dummy
config.status: creating shconfig
config.status: creating config.h
config.status: config.h is unchanged

    rsync 3.1.0 configuration successful

esaka:/usr/local/src/rsync-3.1.0 $ make
perl ./mkproto.pl ./*.c ./lib/compat.c
/usr/local/src/android-4.4_r1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gcc -std=gnu99 -I. -I. --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -DHAVE_CONFIG_H -Wall -W -I./popt -I./zlib -Wno-unused-parameter  -c flist.c -o flist.o
	... (中略) ...
/usr/local/src/android-4.4_r1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gcc -std=gnu99 --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -DHAVE_CONFIG_H -Wall -W -I./popt -I./zlib -Wno-unused-parameter --sysroot=/usr/local/src/android-4.4_r1/prebuilts/ndk/current/platforms/android-9/arch-arm -o rsync flist.o rsync.o generator.o receiver.o cleanup.o sender.o exclude.o util.o util2.o main.o checksum.o match.o syscall.o log.o backup.o delete.o options.o io.o compat.o hlink.o token.o uidlist.o socket.o hashtable.o fileio.o batch.o clientname.o chmod.o acls.o xattrs.o progress.o pipe.o params.o loadparm.o clientserver.o access.o connection.o authenticate.o lib/wildmatch.o lib/compat.o lib/snprintf.o lib/mdfour.o lib/md5.o lib/permstring.o lib/pool_alloc.o lib/sysacls.o lib/sysxattrs.o  lib/getpass.o zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/trees.o zlib/zutil.o zlib/adler32.o zlib/compress.o zlib/crc32.o popt/findme.o  popt/popt.o  popt/poptconfig.o popt/popthelp.o popt/poptparse.o 
sed 's;\@bindir\@;/usr/local/bin;g' <./rsync-ssl.in >rsync-ssl
sed 's;\@stunnel4\@;stunnel;g' <./stunnel-rsync.in >stunnel-rsync
sed 's;\@bindir\@;/usr/local/bin;g' <./stunnel-rsyncd.conf.in >stunnel-rsyncd.conf
esaka:/usr/local/src/rsync-3.1.0 $ ls -l rsync
-rwxr-xr-x 1 sengoku user 758924 2013-12-11 22:14 rsync
esaka:/usr/local/src/rsync-3.1.0 $ file rsync
rsync: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
esaka:/usr/local/src/rsync-3.1.0 $ $TOP/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-strip rsync
esaka:/usr/local/src/rsync-3.1.0 $ ls -l rsync
-rwxr-xr-x 1 sengoku user 642140 2013-12-11 22:14 rsync
esaka:/usr/local/src/rsync-3.1.0 $ 

特に問題もなく、 あっさりビルドできてしまった。 rsync 3.0.9 までは android 用をビルドするには一部修正が必要だったが、 3.1.0 は無修整でビルドできるようだ。 できた rsync を nexus 5 の /system/bin へコピー。

以上で、 多数のサーバを一括管理するがごとく、 多数のスマホを一括管理することが可能になった。 これで、 スマホごとに内容がちょっとずつ違う、などといった事態を避けることができる。 もちろん、 google 等の 「クラウド同期」 で用が足りることも多いが、 本当に重要なデータは、 クラウドなんかに任せたくはないですよね?

Viewing all 47 articles
Browse latest View live