仙石浩明の日記

2011年3月7日

Osukiniサーバを使ってみた 〜 仮想コンソールが提供されない VPS で独自OS をインストールする方法

今まで米国の VPS を使っていたが、 いつのまにか日本の VPS もリーズナブルな値段になってきたらしい。 「さくらのVPS」 がメモリ 512MB で月額 980円、 「Osukini サーバ」 ST プラン がメモリ 1GB, ディスク 100GB で月額 980円。 「さくらのVPS」 でも充分安いが、 「Osukini サーバ」 の安さは目を疑うレベル。 これはもう試してみるしかない。

実は、 最初は 「さくらのVPS」 を申し込んだのだが、 rootパスワードが見つからない事件でイカってキャンセルしてしまった。 申し込んだ直後に VPS が起動できたので、 さくら++ と思いつつ root でログインしようとしたらパスワードが分からず Web じゅう探しまわる羽目に。 万策尽きてサポートに電話したら 15分以上待たされ、 しかも担当者には root と言っても話が通じず、 別の番号にかけなおせと言われる始末。 後ほど届いた 「仮登録完了のお知らせ」 メールに root パスワードが書いてあったのだが、 メールが届く前に VPS のコントロールパネルをいじれて、 起動までできてしまう現在の仕様はいかがなものか。

Osukini サーバの場合 OS は CentOS, Ubuntu, Debian から選べるが、 「my distribution」 以外は使う気が起きないので、 どうやって私の 「独自OS」 をインストールするか、 方法を考えてみた。 もちろん、 Osukini サーバのサポートの範囲外なので、 インストールする方法だけでなく、 トラブった時の復旧方法を考えておくことが重要。

Osukini サーバでは 仮想コンソール (hvc console, リモートコンソール) が提供されない。 OS の外部から操作する手段がほとんどなく、 ブートスクリプトの設定ミスなどで OS にリモートログインできなくなってしまったら最後、 OS の再インストールしか復旧手段はない (と思う)。 しかも、 (サポートの範囲外である) 独自OS の再インストールを支援してもらえるはずはないので、 せっかくインストールした独自OS は跡形もなく消えてしまう。

再起動すれば復旧できる一時的な障害はここでは考えない。 設定ファイルなどを不適切な内容に書き換えてしまった結果、 再起動してもリモートログインできない状態が続くケースのみを考える。 実際、 サーバを運用しているとそういうトラブルはよくある。 ネットワーク設定を間違えて通信不能になるだけで、 他は全く正常でもリモートログインはできなくなるし、 あるいは sshd の設定を間違えて sshd が起動しなくなっただけでもリモートログインできなくなる。
ネットワークが全く使えなくても、 sshd が立ち上がらなくなってしまっても、 OS 自体が正常に起動していれば init から起動される getty は生きていることが多いので、 仮想コンソールさえ使えれば、 大抵はログインできて修復できる。

他の VPS, 例えば Linodeprgmr などでは、 仮想コンソールが利用できる。 さらに、 両者とも GRUB が使えるので、 複数 OS をインストールしておいて切り替えて使うこと (いわゆる 「デュアルブート」) ができる。 つまり一つの OS 上で何かトラブルが起きて OS が立ち上げ不能になっても、 別の OS (いわゆるレスキュー用 OS) を立ち上げて、 トラブった OS を修復することができる。

リアルサーバでは、 (仮想ではなく物理的な) コンソールが利用できる (当たり前)。 さらに、 トラブった時はレスキュー用の CD-ROM / USBメモリからブートして復旧作業を行なったりする。 VPS でもリアルサーバでも、 イザというときに備えて、 通常使う OS とは別に、 修復作業を行なうためのレスキュー用の OS を用意しておくことが極めて重要。

ところが、 レスキュー用 OS が一切利用できないばかりか、 仮想コンソールから操作することすらできないのが Osukiniサーバ。 トラブルに対して極めて脆弱であると言わざるを得ない。

Osukini Server Control Panel

VPS にとって仮想コンソールは必須の機能だと思っていたので、 Osukiniサーバのコントロールパネルを見て驚いた。 「再起動」 「停止」 などの操作と、 OS の初期化しかできない (値段相応? でも、 仮想コンソール機能は Xen 標準なのに...)。

OS の初期化をすれば、 全てが消えてしまう。 いわば、 クリーンインストールしかできない CD-ROM からブートするようなもの。 トラブったからといって、 即クリーンインストールしたいという人がどれだけいると言うのか?

嘆いていても仕方がないので、 どうやってレスキュー用 OS 相当のことを実現するか考えてみる。 レスキュー用 OS を立ち上げることさえできれば、 独自 OS をインストールすることも可能になる。 こんなこともあろうかと、 2年前 (2008年10月) に作っておいた ptyd (Pseudo TTY Daemon) が役に立ちそう。

(続きを読む...)
Filed under: システム構築・運用 — hiroaki_sengoku @ 08:36
2011年2月24日

決してBusyにならない SIP 留守番電話機を Perl で作ってみた 〜 用件が録音されるとメールに添付して送信

IP 電話でいろいろ遊ぼうとすると定番は Asterisk だが、 いかんせん牛刀すぎる。 個人的に VoIP を使う場合 PBX の必要はなく、 留守番電話や転送ができれば充分。 というわけでまずは留守番電話の機能をさくっと Perl で書いてみた (わずか 93行)。

sip_user: hiroaki_sengoku
sip_passwd: xxxxxxxx
sip_domain: ekiga.net
answer_rings: 30
answer_sound: /home/tam_ekiga/answer.raw
voicemail_time: 60
voicemail_dir: /home/tam_ekiga/LOCAL/voicemail

設定ファイル answer_machine.conf を ↑ のような感じで書いておいて、 留守番電話スクリプト answer_machine を実行する:

answer_machine --conf /home/tam_ekiga/answer_machine.conf

sip:hiroaki_sengoku@ekiga.net に着信があると、 応答メッセージを流した後、 相手の音声を録音し、 /home/tam_ekiga/LOCAL/voicemail ディレクトリに 8kHz サンプリングの 8bit μ-law 形式で保存する。 あとはこのディレクトリを監視するプログラムを走らせて、 新着録音をメールで送信するようにしておけばよい。

次に IPKall を利用 (申込には米国の IP アドレスからアクセスする必要あり) して電話番号をもらう。 米国ワシントン州リンデンの番号 +1-360-526-6699 が割当てられた。 上記 SIP 留守番電話が待受けている sip:hiroaki_sengoku@ekiga.net を、 この電話番号の転送先として IPKall に登録すれば、 Google Voice もどき (^^;) の出来上がり。 この番号に電話すると、 上記スクリプトが応答し (上記設定ファイルに answer_rings: 30 と書いてある通り、 30秒間呼び出しを続けないと応答しない)、 何かメッセージを吹き込めば mp3 形式の音声データが添付されたメールが私宛に届く。

この仕掛けを作った晩の翌日未明 3:16 に、 さっそく着信があり録音データが添付されたメールが届いた。 発信者の電話番号は +1-877-347-3760 だった (+1-877- は米国のフリーダイヤル)。 メールで送られて来た録音データがコレ。 英語が苦手な私にはちょっとつらい (^^;) が、 再生速度を遅めにして一生懸命聞き取ってみる:

Hello, this is a message for Korety Martin. If you are not Korety Martin, please hang up and call 877-347-3760 to remove this phone number from our records. If you continue to listen to this message, you are acknowledging that you are Korety Martin. This message contains personal and private information. There will now be a three second pause.

This is EOCCA, A Collection Agency. This is an attempt to collect a debt. Any information obtained will be used for that purpose. Please contact us about this important business matter at 877-347-3760. When calling please reference account number 9.

真面目にディクテーションするのが馬鹿馬鹿しくなるような、 絵に描いたような詐欺電話 (*_*)。 「Collection Agency」 は債権回収会社のこと。 「EOCCA, A Collection Agency」 で検索してみると、 いっぱい出てくる。 借金の心当たりがある人 (のうち 1% くらい?) は、 つい騙されて折り返し電話をかけてしまうのか。 日本とかだと人海戦術で電話をかけまくるらしいが、 自動で電話をかけまくるのが米国流なのか? 電話版スパムメールといった感じ?

なお、 最後がしり切れとんぼのような感じがするが、 これは録音時間を 60秒間に制限しているため (上記設定ファイルの voicemail_time: 60)。

- o -

以下は、 Perl プログラミングに興味があるかた向け:

(続きを読む...)
Filed under: プログラミングと開発環境 — hiroaki_sengoku @ 19:52
2011年2月14日

Google Voice で電話する 「V字発信」 Perl スクリプトを書いてみた 〜 日本へは 2円/分、米国内は年内無料

2009年に米国内でサービス開始した Google Voice は、 2010年6月から以前のような 「招待制」 ではなくなり、 米国内からであれば設定するだけですぐ利用できるようになった。 近いうちに米国外へも展開すると思われるが、 日本は後回しになりそうな気がする (Android 版 Skype が使えるようになったのも世界中で一番最後だったし)。 米国内限定といっても、 米国内に IP アドレスと電話番号があれば利用できるようなので試しに使ってみた。

米国内 IP アドレスは Linode VPS (Virtual Private Server, 仮想専有サーバ) を契約しているので既に持っている。 この VPS 上で PPTP (Point to Point Tunneling Protocol) デーモンを立ち上げておけば、 Windows 標準機能の 「仮想プライベート ネットワーク」 (VPN) で接続して、 米国内からのアクセスを装うことができる。 WWW アクセスだけなら proxy server を立ち上げておくだけで充分かと思ったが、 proxy 経由のアクセスかどうか Google サーバ側で見ているらしく、 proxy 経由では Google Voice は利用できない。

なお、 いったん Google Voice の設定を済ませて Google Number を確保してしまえば、 米国内国外を問わず任意のマシンから Google Voice を利用可能。 つまり Google Number を確保するときのみ、 米国内の IP アドレスからアクセスする必要がある、 ということ。

米国内の電話番号は、 無料で電話番号を割当ててくれるサービスがあるのでそれを利用する。 私は IPKall を利用した。 こちらも米国内の IP アドレスからアクセスする必要があるが、 Google Voice とは異なり米国内の proxy server を経由するだけで登録できる。 SIP フォン (VoIP 電話) のアドレスと、 メールアドレスを登録すると、 ワシントン州の電話番号を一つ割当て、 それをメールで教えてくれる。 割当てられた電話番号に着呼すると、 登録した SIPフォンへ転送してくれる仕掛け。 ただ、 米国は電話代が安すぎるためかイタ電が多いのがちょっと困りもの。 いたずら電話に困っている人がよほど多いのか、 WhoCallsMe.com, Who Called Us, PhoneOwner.info, white pages, Location Lookup など、 かかってきた電話番号を調べるサービスがいくつもある。

維持費用無しで米国の電話番号を持てるのは大変ありがたいが、 30日間サービスを利用していないと登録が無効になってしまう (IPKall の場合)。

IPKall Signup
**ABSOLUTELY FREE**
Washington state phone number to your IP phone.
...(中略)...
Accounts that are inactive for 30 days will be terminated for non-use.
IPKall Signup から引用

「inactive」 というのが、 (1)通話実績がないことを意味するのか、 (2)着呼だけでも 「active」 と見做されるのか、 あるいは (3)登録情報を更新するだけでもよいのかは不明。

仮に (1) だとすると、 毎月日本から国際電話をかけて通話実績を作らなければならず、 とても面倒だしお金もかかる。 そこで Google Voice を使って通話実績を作ることを考えた。 自動で発呼できれば手間もかからず番号を維持できる。 しかも 2011年中 Google Voice は米国内宛の通話が無料らしいので発呼の実験し放題。

JavaPython などから Google Voice をアクセスする 非公式な Google Voice API が発表されているが、 公式ではないので Google が仕様変更すると使えなくなる恐れあり。 「非公式 API」 のコードを見てみると、 内容的にはとても単純であるように見える。 この程度なら自分で一から書いた方が Google の仕様変更への追随も即座にできるし、 Java や Python よりは Perl で書きたかったというのもあって、 さくっと書いてみた。 わずか 58行、 しかも後述するように follow_meta_redirect のバグ対策で 21行ほど要してるので、 実質だとわずか 27行。

(続きを読む...)
Filed under: プログラミングと開発環境 — hiroaki_sengoku @ 09:27
2011年1月17日

Huawei IDEOS U8150 の各国キャリア向けファームウェアの比較

華為 (华为, Huawei) の IDEOS U8150 は、 各国キャリア向けのファームウェアが公開されている。 華為終端 (华为终端, Huawei Device) の中文 (中国語) ページで 「U8150」 を検索すると、 香港數碼通 (数码通, SmarTone Vodafone) 向けファームウェアが、 Worldwide ページで 「U8150」 を検索すると、 Italy Vodafone 向けファームウェアが、 それぞれダウンロードできる。 また、 華為終端サイトの検索では見つけられなかったが、 米国 T-Mobile (Postpay) 向け (T-Mobile Comet) も華為終端サイトからダウンロードできる。 その他、 台湾などアジア各国向けやオーストラリア向けもダウンロードできるようだ

IDEOS U8150 の既知のファームウェアについてまとめてみる:

CBSPBasebandAMSS キャリア等ビルド日時 CST
127818052210B235 香港 數碼通2010-08-08 16:16:18
1978210322201003B238 台灣 遠傳2010-09-03 19:57:29
0082222201003B239 Singapore C2O Mobile2010-09-11 12:31:46
18282222201003B239 Pakistan CMPak2010-09-11 12:31:46
19182222201003B239 Australia2010-09-11 12:31:46
1268230122201003B239 USA T-Mobile2010-09-17 21:21:49
2038230122201003B239 Belarus Velcom2010-09-17 18:37:35
2038230122201003B239 Australia BP CJ2010-09-17 18:37:35
12682522201003B239 New Zealand 2degrees2010-09-26 17:15:43
12682622201003B254 Australia Virgin mobile2010-10-14 20:39:16
12682622201003B254SP01 Mexico Iusacell2010-10-14 20:39:16
12682722201003B254 Peru Movistar2010-10-21 20:53:39
12682722201003B254 BrightPoint2010-10-21 20:53:39
12682722201003B254 Philippine TCI2010-11-06 12:23:13
028270122201003B254 Italy Vodafone2010-10-19 22:28:32
1268270322201003B254 Italy Vodafone2010-11-20 12:39:21
12682822201003B254 Australia Vodafone2010-10-27 18:48:49
1268280122201003B256 Singapore M12010-10-27 18:48:49
2308280122201003B256 Pakistan Ufone2010-10-27 18:48:49
12682922201003B257 Normal2010-11-01 22:52:56
12682922201003B257 Cambodia Beeline2010-11-01 22:52:56
12682922201003B257 South Africa Vodacom2010-11-01 22:52:56
12682922201003B257 Finland Techdata2010-11-01 22:52:56
1268290222201003B257 Vietnam VHH2010-11-01 22:52:56
12683022201003B259 EMOBILE2010-11-24 21:19:04
1268300122201003B257 Norway Telenor2010-11-10 03:55:12
1268310222201003B257SP01 日本通信2010-11-25 16:54:11
1268310322201003B257SP01 日本通信2010-11-25 16:54:11
12683222201003B257 Cambodia CamGSM2010-11-23 18:38:55
1268320122201003B257 India Aircel2010-11-29 18:18:52
1268320222201003B257 India Tata DoCoMo2010-11-29 18:18:52
1268320422201003B257SP01 India Tata DoCoMo2010-11-29 18:18:52
12683322201003B257 Italy WIND2010-12-03 12:04:10
25383622201003B257 Germany2011-01-11 17:35:05
1678360322201003B266 Sudan Zain2011-01-28 12:00:11
12683622201003B257 Holand2011-02-14 12:33:39

ビルド番号は、 どのファームウェアも 「U8150V100R001」 で始まっているので、 その後に続く 「C〜B〜SP〜」 の数値のみ記した。 「USA T-Mobile」 は、 ファームウェアのファイル名では C85 なのだが、 実際に使ってみると U8150V100R001C126B823SP01 と表示されるので、 C126 と記した。 日本通信が販売している IDEOS も C126 だが、 T-Mobile Comet と何らかの共通点があるのだろうか?

「B〜」 の数値を昇順に並べてみると、 ファームウェアをビルドした日時 (ro.build.date) も昇順に並ぶことが分かる。 このことから、 「B〜」 はビルドした順に付けた番号と推測される。

「AMSS」 のバージョンは、 「*#*#2846579#*#*」 をダイヤルすると表示される 「テスト中」 メニューの 「ProjectMenu」 を選び、 その中の 「4.Veneer information query」 を選び、 その中の 「1.S/H version query」 を選ぶと表示される。 「テスト中」 とか 「Veneer」 (化粧張り) とか、 メニューの項目名がいかにもアレだが、 こうした詳細情報を表示する機能をつぶさずに出荷している点は好感が持てる。 日本のメーカとかだと、 こういう機能は全力でつぶしてくる。 力をかける場所を間違ってるんじゃ? と思いたくなるくらい。 わたし的には、 「*#*#4636#*#*」 や 「*#*#8255#*#*」 などの機能をつぶしている Android 端末は 「買ってはいけない」。

AMSS (Advanced Mobile Subscriber Software) というのは、 ベースバンドチップ上で動く基本ソフトウェア。

BREW は, 米QUALCOMM 社が 2001年 1月31日に発表した携帯電話向けダウンローダブルアプリケーションプラットフォームであり, ARM のアーキテクチャに基づいて作られた CPU をコアに持つ, 同社のベースバンドチップ MSM (Mobile Station Modem) シリーズに組み込まれた基本ソフトウェア AMSS (Advanced Mobile Station Software) 上で動作する.

AMSS のバージョンは、 どのファームウェアも 「M7x25V100R001C00」 で始まっているので、 その後に続く 「B〜」 のみ記した。 例えば Italy Vodafone 向けファームウェアの AMSS のバージョンは M7x25V100R001C00B254 なので 「B254」 と記した。

香港で IDEOS U8150-B を購入した香港數碼通向けファームウェア B818 (上表 B 欄の数値、以下同様) だったが、 このファームウェアだと日本の一部(?)のキャリアの SIM でデータ通信できないという問題がある (音声通話は可能)。 例えば、 ソフトバンクの銀SIM/黒SIM や、 WILLCOM CORE 3G の SIM では接続できなかった。

Italy Vodafone 向けファームウェア B827 を書込むと、 ソフトバンク SIM などでも 3G データ通信できるようになるが、 香港數碼通向け B818 と Italy Vodafone 向け B827 では何が違うのだろうと思ったので、 少し調べてみた。 ちなみに B818 だけでなく B822, B823 にも同様の問題がある。 つまり B823 までと B827 以降では何かが変わったようだ。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:52
2011年1月6日

香港で Hutchison (3HK) SIM カードと Galaxy S (GT-I9000) を買ってみた

2009年の年末に香港に行ったときは、 Hutchison と CSL の SIM を比較して CSL を選んだが、 単に CSL の HK$1000 Prepaid SIM の有効期限が 2年だった (フツーは 6ヶ月) ことに魅力を感じたからで、 データ通信自体を比較したわけではなかった。 そこで今回は Hutchison Telecom Hong Kong (和記電訊, 3HK) の 3G Int'l Roaming Rechargeable SIM Card (3G 國際漫遊循環儲值咭) HK$98 (約1080円) を買うことにした。

3HK 3G Int'l Roaming Rechargeable SIM

今回の訪港は夜のフライトで、 しかも向かい風 (偏西風) が強くて到着が大幅に遅れ、 香港国際空港に着いたのは 23:00 過ぎ。 出発ロビーの 3Shop (3HK の店) も 1010 Centre (CSL の店) も既に閉ってる (正確に言えば到着ロビーに着いた時点で 23:30 だったので行くのを断念)。

ホテルへのバス (パックツアーなので空港⇔ホテルの送迎が含まれてる) の中で 24:00 を過ぎたので、 さっそく Nexus One (2009年の年末に購入した HK$1000 Prepaid SIM を入れてある) で 「179179」 にダイヤルして、 CSL の Mobile Broadband Service の 5-day pass を申し込む (HK$178, 約1960円)。

CSL の Mobile Broadband Service (データ通信サービス) は 24:00 が課金の区切りとなるので、 24:00 前に申し込んでしまうとそれが一日目とカウントされてしまう (例えば 23:00 に使い始めると、 1-day pass なのに 24:00 までの 1時間しか使えない恐れがあるが、 本当にそうなるのか恐くて実験できない ^^;)。 もっと早い時間に香港に着く場合だと、 最初の日に Mobile Broadband Service を申し込むべきか悩ましいことになる。
その点、 3HK SIM だと、 24:00 区切りなのは CSL と同じだが、 一日の上限 HK$28 (約310円) に達するまでは HK$2/MB の従量課金なので、 何時に着こうが迷わずデータ通信を開始することができる。
CSL の 1-day pass は HK$50 (約550円) なので 3HK の HK$28 が圧倒的に安く感じられるが、 5日間で考えると CSL の HK$178 に対し、 3HK は HK$28*5 = HK$140 と、 差が縮まる。

で、ホテルに着いて Nexus One を WiFi AP (ポータブル Wi-Fi アクセスポイント, Android 2.2 の標準機能) として使う。 ホテルの部屋でも無線LAN サービスが提供されているのだが、 一日の利用料が HK$100 (約1100円) とバカ高いので、 滞在中はずっと Nexus One をアクセスポイント代わりに使った。 ノートPC 2台 (前回前々回、香港で購入した NetBook) と Android 端末 2台 (今回購入した Galaxy S と IDEOS U8150-B) でこの 「WiFi AP」 を利用したが、 常に安定して利用できた。 しかも日中は (当然だが) スマートフォンとして使えるわけで、 これならモバイル WiFi ルータ専用機なんて要らない。

翌日、 旺角へ行って適当に歩いていて見つけた 3Shop (亞皆老街40-46號) で
3G Int'l Roaming Rechargeable SIM Card (3G 國際漫遊循環儲値咭) HK$98 を買う。
そして、 そこからほど近い電器店、 百老滙 Broadway (西洋菜南街78號) で Galaxy S (i9000) を買った。

(続きを読む...)
Filed under: Android,香港 — hiroaki_sengoku @ 09:36
2011年1月2日

香港海洋公園のパンダの動画を YouTube に投稿してみた

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

香港海洋公園 (Ocean Park) には四頭のパンダがいる (屋外と屋内に二頭ずつ)。 パンダというと、 いつも寝ている動物というイメージがあったのだが、 午前中に訪れたためかとても活動的で、 パンダの様々な習性・行動を観察することができた。

Giant Panda Le Le

屋外のパンダ館 「大熊猫之旅」 (Giant Panda Adventure) でオスのパンダ 「樂樂」 (LE LE) の動画をデジカメで撮影していたところ、 寝てしまった。 そろそろお昼も近いのでお昼寝タイムなのかと残念に思いつつ、 カメラを回し続けていたら、 少々意外な行動に出た。

パンダの飼育係にとっては日常的な光景なのであろうが、 そもそも活動的に動くパンダを見る機会がある人というのも少ないだろうから、 このようなパンダの行動を公開することは少なからず意義があることと思う。 そこで、 YouTube で公開してみることにした(再生すると音が出るので注意):

私にとって YouTube 初投稿。 残念ながら 「sengoku」 および 「sengoku + 数字」 という ID は取得できなかったので、 「HiroakiSengoku」 という ID を取得し、 投稿してみた。

おまけ:

Giant Panda Le Le Fake   園内を徘徊していた 樂樂 (LE LE) の着ぐるみ。 本物とは似ても似つかないというか、 どうやったらパンダがこんなに怖くなってしまうのか理解できないというか。
Filed under: 香港 — hiroaki_sengoku @ 12:59
2010年12月31日

香港の深水埗で華為 IDEOS U8150-B (EMOBILE S31HW) を買ってみた

年末に香港へ行って電脳街を巡るのが毎年の恒例行事になってきた。 香港の電脳街は、 すでに秋葉原を追い越した感じがする。 近頃の秋葉は面白いモノをあまり見かけなくなり、 たまに見かけても、 大抵は香港などで流行ってるモノを単に持ち込んだだけで、 しかも値段は香港の倍以上だったりする。 デフレと言われて久しい日本だが、 PC にしろケータイにしろ値段が高すぎる。 これから発展していくアジアと、 これから衰退していくだけの日本ということなのか。

いつものように深水埗の高登電腦中心を巡回していたら、 大一(香港)有限公司IDEOS U8150-B を HK$1380 で売っているのを見つけた。 U8150-B といえば来年1月中旬にイー・モバイルから発売される予定の Pocket WiFi S (S31HW) の同型機。 ただし、 ファーウェイによれば、 グローバル展開されている 「IDEOS」 と日本向け S31HW は別の製品、 ということらしい。 なぜ日本は 「グローバル展開」 の対象ではないのだろう?

「Pocket WiFi S」は、 音声通話機能とAndroid™ 2.2を搭載したWi-Fiルーターです。 Android™ 2.2搭載端末としては国内最安※1となる端末価格19,800円(税込)での提供と、 国内最軽量※2の重さ約105gサイズを実現しました。

「国内最安」 「国内最軽量」 つまり世界基準では安くもなければ軽くもないということ。 本来 Android は 2.2 froyo 以降からデフォルトで 「ポータブルWi-Fiアクセスポイント」 として使えるのに、 わざわざ 「Wi-Fiルーター」 と呼んでいるあたりにも、 いかに日本が世界標準からずれてきてしまっているかを感じる。

とはいえ、 日本では 19,800円でしか買えない端末が HK$1380 (約 14,500円) で買えるのなら悪くない。 思わず衝動買いしてしまった。 画面が QVGA (2.8" 320x240) だったり、 内蔵カメラが貧弱 (一応 320万画素なのだが...) だったり、 CPU が MSM7225 528MHz だったりと、 Android 端末としては見劣りするものの W-CDMA I/II/V/IX (2100/1900/850/1700MHz) に対応したスマートフォンが 15,000円弱で買えるとなると、 一気に普及が進むヨカン。 ちょうど 2年前、 ここ香港で 4バンド GSM 機を HK$899 (約 10,000円) で買ったのが遠い昔のことのようだ。

中華 Android 端末なんて 「安かろう悪かろう」 だろうなどと思ってはいけない。 カスタマイズしすぎて Android とは別物になりつつある国産スマートフォンより、 よほど素直で使いやすい (そして圧倒的に安い)。 買った当初は値段相応の期待しか持っていなくて、 メイン端末が壊れたときなどの非常用端末くらいの感覚だったのだが、 高解像度の画面 (およびマルチタッチ) を必要としないアプリのほとんどがそのまま動いてしまった。 これなら非常用としてだけでなく、 大きな端末を持ち歩きたくない時とかにも使えそう。 Android 2.2 へアップデートできない一部の国産 Android 端末だと、 動かないアプリが沢山でてきてしまう。

ただし、 多くのアプリ開発者が QVGA などという尋常でない低解像度を想定していないためか、 Android マーケットでダウンロードできないアプリが少なからずある。 そういうアプリも別の Android 端末でダウンロードして得た apk ファイルを、 「adb install」 コマンドなどで IDEOS へインストールしてみると、 ほとんどが特に問題無く使えるようだ。

購入時のファームウェアは、

Androidバージョン2.2
ベースバンドバージョン2210
カーネルバージョン2.6.32.9-perf
huawei@product #1
ビルド番号U8150V100R001C127B818SP05

だったが、 この 「ビルド番号」 だと、 日本の一部(?)のキャリアの SIM でデータ通信できないという問題がある (音声通話は可能)。 例えば、 ドコモの SIM で mopera U を使う場合は 3G 通信可能だが、 ソフトバンクの銀SIM/黒SIM や、 WILLCOM CORE 3G の SIM では接続できなかった。

Huawei のページで U8150 のファームウェアを検索してみると、

ProductSoftware NameRelease Date
U8150U8150 V100R001C02B82 7SP02(Italy Vodafone ) 2010-12-15

が見つかった。 Italy Vodafone と書いてあるあたりが気になるが、 google で検索してみると、 このファームウェアを書込んだら 3G 通信できるようになった、 という旨のページを見つけた:

huaweidevice.comのサイトから、 「U8150 V100R001C02B82 7SP02(Italy Vodafone ) Host Software」 をダウンロードして解凍し、 出てきたファイルをmicroSDにコピーして、 ボリューム上と終話ボタンを押しながら電源を入れればファームアップが始まります。 一度目最後に失敗したら一度電池を抜いてもう一度同じ操作をすれば、ファームアップが正常に完了です。
ファームアップ後は、 まっさらに初期化されるため、 最初から設定しなおしです。 とはいえ、Andorid2.2とマーケットアプリのおかげで、 Googleアカウントを入れれば、 アプリも全部自動で勝手にマーケットからダウンロードして復活してくれるので楽です。 ファームアップ後のrooted も可能です。

さらに、 元のファームウェア V100R001C127B818SP05 も Huawei サイトからダウンロードできるようなので、 最悪の事態になっても元に戻せるだろうと思い、 上記ファームウェアを IDEOS に書込んでみた。 ファームウェアに同梱されている 「U8150 Software Upgrade Guideline」 に書込み方法の説明がある (英語版とイタリア語版の説明書が同梱)。

こばこのひみつ」 に書かれている通り、 書き込みの最後で 「失敗」 するのだが、 いったん電池を抜いて再起動すると正常に起動した。 また RageAgainstTheCage exploit を利用して root 権限を再取得できた。

更新後のバージョンは以下の通り:

Androidバージョン2.2
ベースバンドバージョン22201003
カーネルバージョン2.6.32.9-perf
huawei@product #1
ビルド番号U8150V100R001C02B827SP01

ダウンロードしたファームウェアのファイル名は末尾が 「...7SP02」 だったのに、 ビルド番号が 「...7SP01」 なのが気になるが、 ソフトバンクの銀SIM や WILLCOM CORE 3G SIM で試してみたところ、 正常に 3G 通信できている。

Filed under: Android,香港 — hiroaki_sengoku @ 01:11
2010年12月15日

“自分に向いたこと” を見つけ、自分にしか生み出せない価値を持て

今年 8月に、 株式会社ドリームキャリアさんのインタビューを受けました。 ドリームキャリアさんは、 理系学生のための就職情報サイト 「理系ナビ」 を運営している会社です。 いま、 一部の大学で配布中の小冊子 「理系ナビ 10冬号」 の巻頭の 「トップインタビュー」 に掲載されました。 2012年卒 (に限りませんが) の学生さんの就職活動の参考になれば幸いです。

ドリームキャリアさんの許可を得て、 記事全文を転載します:

- o -

“自分に向いたこと” を見つけ、
自分にしか生み出せない価値を持て

KLab株式会社 取締役 CTO 仙石 浩明

会員数 500万人を超えるソーシャルアプリ 「恋してキャバ嬢」 を開発・運営するなど、 ソーシャル、クラウドをキーワードに事業展開を図る KLab株式会社。 その最高技術責任者 (CTO) である仙石浩明氏は、 専門誌でサーバ構築に関する連載を持ったことがあるなど、 業界でも名の知れた人物だ。 自身も IT業界でキャリアを積み、 KLab の取締役として数多くの新卒・中途採用の面接を重ね、 そして入社してきた相当数のエンジニアの仕事ぶりを見つめてきた仙石氏に、 就職先を選ぶ際に気を付けるべきポイントについて話を聞いた。

考える前にやってみる。
そして見つけた自分に向いた仕事

「世の中には、 仕事を楽しんでいない人が多いように感じますね。 どんな仕事をしても良いのですが、 楽しんでほしい。 楽しめないような職業は選んでほしくないのです。 楽しめなければ成長できるはずがない」

これから就職活動を迎える学生に、 このようなメッセージを送るのは KLab株式会社最高技術責任者 (CTO) の仙石浩明氏。 「朝、コンピューターに向かったら熱中してしまい、 気が付いたら夜だった」 というほどのめり込めることを仕事にする仙石氏は、 コンピューターとは中学時代に出会ったという。

ただ、コンピューターばかりにのめり込んでいたわけではない。 高校の時は数学好きで特殊相対性理論にも興味を持った。 哲学にもはまり、 大学で哲学を専攻しようかと真剣に悩んだこともあったが、 最終的には哲学よりも好きだった情報工学を学ぶことに決め、 京都大学工学部に進んだ。

そのまま大学院に進み、 就職活動を迎えた仙石氏は、 日立製作所への入社を選ぶ。 当時、 情報系の研究をするなら NTT の研究所が一番人気。 仙石氏は NEC のインターンシップにも参加していたが、 あまのじゃくな気質を発揮して 「それ以外から選ぼう」 という判断をしたそうだ。

日立に入社した後は、 遺伝的アルゴリズムやネットワーク基盤技術の研究を進める。 だが入社してから、 会社での仕事以上に熱中したのはテニス。 定時であがって、 日没までテニスを続けるような日々だった。

ただ、 そのテニスは半年間しか続けなかった。 「私の場合、 『向いているんだろうか』 と考える前にやってみます。 やってみて向いてないと思えば止めてしまう。 コンピューターの道だけを選んで成功したと人には思われているようですが、 物理、数学、哲学、テニスと試してみて、 止めたものも数限りなくあるのです」 と仙石氏は自身がテニスを止めた理由を説明する。

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

ほかの人にもできる仕事は最小限に
自分しかやれない仕事にフォーカス

元々、 定年まで働くつもりはなかったというが、 大手企業で働くうちに仙石氏は会社に違和感を覚えるようになる。 上司から指示される仕事は、 ほかの人にでもできるような仕事。 「ほかの人ができることをやっていても差が付かない」 と考えた仙石氏は、 必要最小限で済ませるようになり、 上司から指示されていない自分にしかできない研究に取り組んでいった。

しかし、 そうした働き方が評価されるわけではなく、 仙石氏の給与は年功序列でほかの社員と横一線。 会社から与えられる仕事は、 相変わらず代わり映えしなかった。

そんな時に、 仙石氏のところに1本の電話が掛かってくる。 外資系ヘッドハンティング会社の転職代理人からの転職を勧める電話だったが、 「転職という手段もあるのか」 とその時に初めて意識することになる。

そして転職代理人から薦められたモバイルコンテンツ開発会社に面接へ行ってみたところ、 「新しく研究開発の会社を立ち上げます」 という話を聞く。 当時の仙石氏はベンチャーに興味があったわけではなく、 携帯電話すら持っていないような状況だったが、 「面白いかもしれない。 やったことがないからやってみよう」 と転職を決意する。

そんな経緯で入社したのが KLab の前身となるケイ・ラボラトリー。 CTO に就任した仙石氏は、 世界初の携帯電話向け Javaアプリの開発、 携帯電話端末の技術仕様策定等、 モバイル技術開発会社として業界内で存在感を示す KLab を、 技術面でリードしていくことになる。

“自分にしかできないこと” を
評価してくれる会社の見分け方

仙石氏は自身の経験を踏まえ、 エンジニアが就職先を選ぶのなら、 “自分にしかできないこと” を評価してくれる会社にすべきだと訴える。

「会社は 『この仕事をやってほしい』 と考えて、 誰にでもできる仕事を任せるために人を採用している面もあります。 ですが、 そんな仕事ばかりでは人は成長できません」

自分に向いていること、 やっていて楽しいことを評価してくれる会社。 そんな会社かどうかを見抜くには、 「自分はこんなことを考えている」 と面接で伝えれば良いと仙石氏は助言する。 面接官が興味を持ってくれるのなら、 その会社には見込みがある。 だが、 興味すら示してくれないのなら、 社員一人一人の関心・適性に会社としての興味はないということ。 適材適所ではなく、 会社の都合で仕事が割り当てられると思った方が良いのだとか。

「私なんかは、 大学での研究について話を聞くのが好きですね。 教授に言われてやっている研究ではなく、 自分がやりたいと思って取り組んでいる研究。 その人が今までに熱中したことについて延々とでも話を聞くことで、 ほかの人と違うことをやることに価値を見出せる人かどうか、 簡単に分かります」 (仙石氏)

“自分に向いていること” を
見つけるために設けたどぶろく制度

自分だけにしかできない仕事。 そのための時間を取ってもらうために KLab では 「どぶろく制度」 を設け、 標準労働時間の 10% までなら、 好きなように使えるようにしている。 ただ、 どぶろく制度の目的はそれだけではない。 仙石氏は片っ端から興味を持ったことにチャレンジして “自分に向いていること” を見つけたが、 すべての人がそれを見つけられているわけではない。 「今やっている仕事内容とは違うことに仕事時間を使うことで、 “自分に向いていること” を見つけてほしい。 向いているかどうかを確かめるためには、 転がり込んできたチャンスにチャレンジすることが必要。 『時間がないから』 という理由で動かない人が多いので、 それを言い訳にさせないためにつくったのがどぶろく制度なのです」 と仙石氏は制度の狙いを明かす。

また、 KLab では “自分に向いていること” を突き詰めて “自分にしかできないこと” を身に付けているエンジニアを正当に評価するため、 ダイナミックな人事評価制度を導入している。 基本的に年に一度、 成果と能力に基づいて給与を改定するが、 新卒入社の社員には、 入社から 3年間は半年に一度見直しをかける。 能力のある社員なら、 給与テーブルのグレードを一足飛びで駆け上がっていくため、 入社して数年の間に数百万円の年収差が生まれることもざらにあるのだとか。

質問すること、チャレンジすることで
伸びる 「考える力」

もちろん、 “自分に向いていること” が見つかったからといって、 “自分にしかできないこと” がすぐにできるようになるわけではない。 そのためには自分自身の成長が必要になる。

成長のためには、 「考える力」 が重要だと仙石氏は言う。 例えば、 多くのエンジニアはある程度仕事を覚えると、 あとは惰性で仕事をするようになる。 仕事で分からないところが出てきても、 検索エンジンを使って調べれば、 だいたいの答えが出てきてしまう。 チャレンジが無くなることで、 そのエンジニアの成長はそこで止まってしまうのだ。

そんな仕事スタイルのエンジニアこそ、 誰にでもできる仕事しかできなくなると仙石氏は批判。 「考える力」 とは抽象的な概念なので説明しづらいが、 知りたいことに憶さず質問して興味を持ったことを深掘りしていくこと、 そしてチャレンジすることを通して育つ力だと説明する。

ちなみに KLab では、 自分の興味・関心のあるテーマについて大勢のエンジニア相手に発表させる勉強会を開くことで、 エンジニアとしての成長を促している。 自分が深めたいと考えているテーマを自分の力で考えて発表させることで、 あるいはそれを聞いて質問する力を伸ばさせることで、 社員の成長を促しているのだとか。

格差が進む 20年後のために
自分だけの価値を生めるように

しかし、 なぜそこまで “自分に向いていること” “自分にしかできないこと” にこだわらなくてはいけないのだろうか。 仙石氏はその理由について次のように語る。

「これから就職する学生が迎える将来の社会について、 私はかなり悲観的な見方をしています。 格差社会と言われていますが、 今から 20年後には格差がもっと進むのではないでしょうか。 日本の会社は、 まだまだ昔ながらの年功序列に支えられています。 成果主義が広まっているとは言うものの、 仕事のできる人とできない人とで、 そんなに差は付いていません。 これから就職する学生の皆さんが 40〜50歳になっているころには、 それこそ年収が1ケタ違うのも当たり前にあり得るのではないでしょうか」

実際に 20年前と今とを比べると、 誰にでもできる単純作業のうち、 かなりの部分が技術の進歩によって一掃されてしまった。 現在、 誰にでもできる仕事でお金をもらっている人は、 20年後にどうなってしまうのか。 そう考えていくと、 他人には生み出せない自分だけの価値を持つことが必要なのだと仙石氏は話している。

20年後のあなたは “自分に向いていること” を見つけて、 “自分にしかできないこと” を習得できているだろうか。 本当に成長したいのなら、 「当社が一番適した会社かどうかは分かりませんが、 技術者が会社に依存せず、 自分の価値を築ける一番の会社にしようと、 少なくとも私は本気で考えています」 という仙石氏の居る KLab も、 就職先の選択肢に含めてみてはどうだろうか。

Filed under: 仙石浩明CTO の日記,自己啓発 — hiroaki_sengoku @ 15:19
2010年12月4日

Android 端末 IS01 のカーネルを入れ替えてみた 〜 さよならデッカード LSM

先週末 IS01 で root 権限が必要なアプリが使えるようになったばかりなのに、 そのわずか 4日後、 スマートフォン@2ch掲示板に以下の書き込みがあり、 カーネル空間への侵入口が明らかにされてしまった。 一番乗りを果たした goroh_kun さんに敬意を表しつつも、 IS01 のプロテクトがこの程度だったことが残念でもある。 「root を取られても大丈夫な作りになっている」 と開発者が豪語し、 しかも IS01 の発売から 5ヶ月間も破られなかったのだから、 さぞかし鉄壁の守りなのだろうと思っていたのに、 こんな分かりやすい穴があったとわ... (負け惜しみ ^^;)。

【ROM焼き】au IS01 root2 〜わたくし達も未来へ〜

...

317 :goroh_kun:2010/12/01(水) 03:14:21 ID:LGLTLBmZ

自動起動仕込むところを大体見つけました。
どなたか協力お願いします。

/data/の直下にlocal.propを置く
ここで、内容をoverrideできます。
サービス起動時のおダイナミックライブラリがある
サービスプログラムを探す。

getpropしてみると、

rild.libpathが/system/lib/libril-qc-1.soといかにも起動時に使っていそう。
rildaemonから使われているプラグインと思われます。

そこで、
local.propの中身を
rild.libpath=/data/lib/libril-wrapper.so
rild.wrapper.cmd=/data/rootkit.boot.sh
rild.libpath2=/system/lib/libril-qc-1.so

で、このプラグインを/data配下から読み出されるようにして、
libril-wrapper.soにて、ダイナミックロード時に
自動実行したいプログラムを指定できるようにします。
で、自動実行したいプログラムをlibril-wrapper.soで実行後
本来のrild用のプラグインをロードして、rildに引き渡すようにします。

これでいけるのではないかと思っているのですが、やるよって方は
いらっしゃいますか?

rild.libpath プロパティは、 RIL (Radio Interface Layer) デーモン rild が参照している。 rild は rild.libpath の値をダイナミックライブラリのパス名として dlopen(3) に渡し、 dlsym(3) でライブラリ内の関数 RIL_Init 呼び出す。 つまり、 rild が起動される前に rild.libpath の値を書き換えておけば、 rild に任意のプログラムを起動時に実行させることが可能になる。

したがって守る側 (つまり開発者の立場) から考えると、 (1) rild.libpath が書き換えられないようにするか (2) 任意のプログラムの実行が脅威にならないよう、 rild 起動前に防御を固めてしまえばよい。

プロパティは、 以下の 4 つのファイルで設定できる。 どれか一つでも改変可能であれば、 (1) の方法は使えない。

  • /default.prop
  • /system/build.prop
  • /system/default.prop
  • /data/local.prop

IS01 の場合、 (たとえ root が奪取されても) /system ディレクトリ下は改変できないようになっている。 また、 /default.prop は initramfs 内のファイルなので、 改変しても再起動すれば揮発してしまう。 だから上記 4ファイルのうち /data/local.prop 以外は改変不可能。

Android では /system ディレクトリ下は read only でも構わないが、 /data ディレクトリ下は Android 動作中に書き換えることが前提となっている。 もちろん /data/local.prop だけは書き換え不可能にするとか、 あるいは再起動時に自動的に /data/local.prop を書き戻す、 という方法も考えられなくもないが、 そもそも論で言えば /data/local.prop は、 システムのプロパティをオーバーライドするための設定ファイルであって、 その本来の趣旨からいえば書き換え不可能にすることは望ましくない。

したがって守るなら (2) の方法が自然。 というか、 /data/local.prop で rild.libpath の値を変更されても、 rild はユーザ空間で動くデーモンなのだから、 本来は 「任意のプログラムの実行」 が可能でも脅威にはならないはず。

ところが IS01 の開発チームは致命的なミスを犯した。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 12:59
2010年11月27日

月額8円で運用できる Android 端末 IS01 で、root 権限が必要なアプリを使えるようにしてみた

Android 搭載スマートブック IS01 by SHARP (愛称 「メガネケース」) が、 本体価格 0円 + 契約事務手数料 2835円 + 月々 8円 * 2年しばり = 3027円 で入手できるとネット上で話題になっていたので買ってみた。 メジャーアップデート対応なしと公式に宣告されてしまった IS01 ではあるが、 「ワンセグ放送が視聴できて WiFi 通信もできるポメラもどき」 と割りきったとしても激安なので 「ふたつでじゅうぶんですよ」 と言われつつ 3つ入手した。

「グローバル展開もしていないから xda の助けも得られない」 と総統閣下に嘆かれつつも、 RageAgainstTheCage exploit を利用すれば root になることは一応できる (ベースバンドバージョン / ビルド番号 01.00.07 で確認):

senri:/home/sengoku % adb push rageagainstthecage /data/local/tmp/
senri:/home/sengoku % adb shell
$ cd /data/local/tmp
$ chmod 755 rageagainstthecage
$ ./rageagainstthecage
[*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C

[*] checking NPROC limit ...
[+] RLIMIT_NPROC={1856, 1856}
[*] Searching for adb ...
[+] Found adb as PID 8223
[*] Spawning children. Dont type anything and wait for reset!
[*]
[*] If you like what we are doing you can send us PayPal money to
[*] 7-4-3-C@web.de so we can compensate time, effort and HW costs.
[*] If you are a company and feel like you profit from our work,
[*] we also accept donations > 1000 USD!
[*]
[*] adb connection will be reset. restart adb server on desktop and re-login.
$ 
senri:/home/sengoku % adb shell
# 

ただし rageagainstthecage はタイミングが良くないと失敗するので、 少なくとも数回は繰り返し実行しないと root が取れない (運が悪いと何度実行しても成功しない上に adb で接続できなくなって再起動する羽目に陥ることも)。 IS01 を再起動するたびに rageagainstthecage を実行して root を取り直すのは著しく手間なので、 root が取れたら su コマンドをインストールしておくべき。

インストール先は、 一般ユーザ (shell 権限) でアクセス可能で、 かつ再起動しても消えない (つまり tmpfs とかでない) ボリュームで、 かつ mount 時に nosuid オプションをつけられていないことが必須条件になるが、 幸い IS01 ではフラッシュメモリ /dev/block/mtdblock7 が /sqlite_journals に nosuid 無しで mount されている:

senri:/home/sengoku % adb shell
$ grep -v '\(tmpfs\|nosuid\)' /proc/mounts
rootfs / rootfs ro 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
/dev/block/mtdblock7 /sqlite_journals yaffs2 rw 0 0
/dev/block/mtdblock5 /system yaffs2 ro 0 0
$ ls -l /sqlite_journals
drwxrwx--x system   system            1980-01-06 09:00 com.android.providers.settings
drwxrwx--x system   system            1980-01-06 09:00 com.android.providers.settingsex
drw-rw-rw- root     root              2010-11-26 18:51 lost+found

sqlite_journals というディレクトリ名からして SQLite 用のディレクトリと思われるが、 それならなぜ nosuid がつけられていないのだろうか? ガチガチに防御を固めているはずの IS01 にしては珍しい抜け穴の一つ。

ちなみに上記のように /dev/block/mtdblock5 も /system ディレクトリに nosuid オプション無しでマウントされているが、 こちらはカーネルの MTD ドライバで書き込みが禁止されている (SHARP が公開している IS01 のカーネル kernel/drivers/mtd/devices/msm_nand.c 参照) ので、 簡単には変更できそうにない (少なくとも rw で remount するだけでは書込めない)。

というわけで /sqlite_journals に bin ディレクトリを作って ChainsDD の su コマンド (android_system_extras に含まれる) を置いてみる。

# ls -l /sqlite_journals/bin/su
-rwsr-sr-x    1 root     root         26256 Aug 17 17:27 /sqlite_journals/bin/su

ところが!

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 15:46
2010年11月13日

iモード.net と imoten を使って iモードメールを自動送信する 〜 SubEtha SMTP のバグ

iモードメールを Android 端末で送受信するには、 sp モードiモード.net を利用する。 前者は sp モード専用の APN (Access Point Name) spmode.ne.jp に接続しないと利用できない (つまり無線LAN 経由では使えない) 上に、 ドコモが IMEI (International Mobile Equipment Identity, 端末識別番号) をチェックしていて、 契約端末でないとこの APN に接続できない (らしい)。 なので私は後者を利用している。

iモード.net は、 PC から iモードメールを読み書きできる Webメールサービス (月額210円)。 PC の代りに Android 端末上のアプリ (iMoNi が有名) からアクセスすれば、 Android 端末で iモードメールを読み書きできる。 あるいは iモード.net からメールを読み取って別のメールアドレス (例えば Gmail) へ転送するプログラムを (どこかのサーバで) 動かしておけば、 iモードメールを Android 端末で普通のメールとして受信できる。

前者の方法は、 メールの新着をどうやって知るか、 という問題がある。 Android 端末上のアプリが定期的に iモード.net にアクセスして新着をチェックすることになるが、 電池の消耗を考えればせいぜい 15分に一度チェックするのが限界で、 それ以上の頻度でチェックするのは現実的ではない。 つまり最大 15分間は新着を知るのが遅れる。 iMoNi にはドコモから送られてくる WAP PUSH を検知してメールをチェックしにいく機能もあるが、 3G 接続中は (なぜか) WAP PUSH を受け取れないらしい。

それに対し後者の方法は、 転送プログラムは Android 端末上で動くわけではないので、 電池のことを心配せずに iモード.net を頻繁にチェックできる。 iモード.net で取得したメールを Gmail へ転送するようにすれば、 Android 端末は Gmail の着信をリアルタイムで知ることができる。

前者の方法は Android 端末だけで iモードメールを読み書きできるのに対し、 後者の方法は転送プログラムを動かすサーバ (24時間稼働が望ましい) が必要になるので万人向けではないが、 そういったサーバを確保できるのなら、 iモードメールを普通のメールと同様に扱える後者の方法が圧倒的に便利。

というわけで、 私は imoten (imode.netのメールをSMTPで転送するプログラム) を使っている (まだ使い始めて 2日だが)。 1分も遅れずに Android 端末で着信を知ることができるので、 とても便利。

imoten には iモードメールを送信する機能もある。 すなわち imoten が SMTP サーバとして振る舞い、 受け取ったメールを iモード.net へ転送する。

ということはつまり Android 端末から iモードメールを送ることができるのはもちろん、 PC 上のメーラや任意のメール配信プログラムから iモードメールが送ることが可能。 試しにテストプログラムを書いてみた:

#!/usr/bin/perl
use strict;
use warnings;
use Net::SMTP;

my $smtp = Net::SMTP->new('senri.gcd.org', Port => 42525, Debug => 1);
$smtp->auth('imoten', 'xxxxxxxx');
$smtp->mail('sengoku');
$smtp->to('sengoku@gcd.org');
$smtp->data();
$smtp->datasend("To: sengoku\@gcd.org\n");
$smtp->datasend("\n");
$smtp->datasend("A test message\n");
$smtp->dataend();

imoten を動かしているサーバ senri.gcd.org の 42525 番ポートに SMTP 接続してメールを送信するプログラム。 imoten は SMTP PLAIN 認証をサポートしているので、
「$smtp->auth('imoten', 'xxxxxxxx');」 で、
ユーザ 「imoten」、 パスワード 「xxxxxxxx」 (伏字) を指定している。

ところが!

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 08:19
2010年10月25日

Android 端末 (Nexus One) でアプリを SDカードの ext3 パーティションにインストールする (Apps 2 SD)

新しい Android 端末が次から次へと発表される今日このごろ、 1月6日に発表された Nexus One は (まだ一年たっていないのに) 旧型機といった感じになりつつある。 特に端末内部メモリ容量が 200MB しかないのは致命的。 正確に言えば内蔵フラッシュメモリは 512MB だが、 システム側で 300MB ほど使うので、 ユーザが自由に使えるのは残り 200MB 程度となる (もちろんそれとは別に SD カードが使える)。

いまどき 200MB というのはいかにも少ない。 例えば私が Nexus One で使ってるアプリのうち、 サイズの大きいものを一部ピックアップしてみると、

アプリappdata合計
Google Earth20.32MB0.24MB20.56MB
Twitter2.70MB14.57MB17.27MB
Skype10.68MB3.40MB14.08MB
OpenWnn Flick対応版7.68MB4.78MB12.46MB
Adobe Flash Player12.40MB0.00MB12.40MB
Google Map8.09MB1.44MB9.52MB
Graffiti5.14MB0.84MB5.22MB
K-9 Mail2.67MB1.07MB3.74MB

わずか 8個のアプリだけで 100MB 近く使っている。 200MB に収めようと思えば、 インストールするアプリを相当厳選する必要がある (100個程度で限界)。

さすがにこれでは使い物にならないということで、 アプリを SDカード上にインストールできるようにする仕掛け Apps 2 SD (A2SD) が提案されてきた。 A2SD には App2sd など、 いろんな実装があるが、 基本的には SDカードに ext3 (あるいは ext4) パーティションを切り、 /system/ext あたりにマウントして (実はこれが難しい, 後述)、 /data/app などからシンボリックリンクを張る。

つまり、こんな感じ:

# cat /proc/mounts
	...
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
/dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0
	...
/dev/block/mmcblk0p2 /system/ext ext3 rw,nosuid,nodev,relatime,errors=continue,data=writeback 0 0
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:1 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
	...
# cd /data
# ls -l
drwxrwxr-x    1 system   system        2048 Oct 23 19:33 anr
lrwxrwxrwx    1 root     root            15 Oct 23 20:45 app -> /system/ext/app
lrwxrwxrwx    1 root     root            23 Oct 23 20:46 app-private -> /system/ext/app-private
lrwxrwxrwx    1 root     root            18 Oct 23 20:47 backup -> /system/ext/backup
lrwxrwxrwx    1 root     root            24 Oct 24 11:23 dalvik-cache -> /system/ext/dalvik-cache
drwxrwx--x    1 system   system        2048 Oct 24 11:59 data
drwxr-x---    1 root     log           2048 May 13 08:47 dontpanic
lrwxrwxrwx    1 root     root            17 Oct 23 20:02 local -> /system/ext/local
drwxrwx---    1 root     root          2048 May 13 08:47 lost+found
drwxrwx--t    1 system   misc          2048 Oct 24 14:02 misc
drwx------    1 root     root          2048 Oct 23 19:33 property
drwxrwxr-x    1 system   system        2048 Oct 24 14:20 system
lrwxrwxrwx    1 root     root            22 Oct 23 21:11 tombstones -> /system/ext/tombstones

アプリを Android 端末にインストールすると、 パッケージファイル (*.apk) が /data/app ディレクトリに格納 (「コピー防止」 アプリは /data/app-private ディレクトリに格納) され、 クラスファイル (classes.dex) が /data/dalvik-cache ディレクトリに格納される。 上記のように /data/app および /data/dalvik-cache はそれぞれ /system/ext/app および /system/ext/dalvik-cache へのシンボリックリンクにしてあるので、 内蔵フラッシュメモリ (/data パーティション) の代わりに SDカード (/system/ext パーティション) へ格納される、という仕掛け。

/data/data ディレクトリにはアプリが使用するデータが格納される。 /data/app および /data/dalvik-cache が、 アプリのインストール/アンインストール時のみ書き込みが行なわれるのに対し、 /data/data はアプリ動作中も読み書きが行なわれるわけで、 /data/data を SDカードへ移すとアプリの実行速度が低下したり、 あるいは頻繁な書込みによって SDカードの寿命が短くなったりする恐れがある。 もし /data/data も SD カード上に置こうとするなら、 使っている SDカードが充分高速 (Class6 以上?) で、 かつウェアレベリング (wear leveling) をサポートしているか確認したほうが無難。

私は /data/data は /system/ext へのシンボリックリンクを張らずに /data パーティションをそのまま使用している。 現時点での各パーティションの空き容量は次のような感じ:

# df
/dev:               197552K total,       0K used,  197552K available (block size 4096)
/mnt/asec:          197552K total,       0K used,  197552K available (block size 4096)
/system:            148480K total,  127580K used,   20900K available (block size 4096)
/data:              200960K total,  102148K used,   98812K available (block size 4096)
/cache:              97280K total,    9128K used,   88152K available (block size 4096)
/system/ext:       3690832K total,  269908K used, 3420924K available (block size 4096)
/mnt/sdcard:      11547432K total, 6808720K used, 4738712K available (block size 8192)
/mnt/secure/asec: 11547432K total, 6808720K used, 4738712K available (block size 8192)

私が使ってる SD カードは 16GB Class6 だが、 /data パーティションはまだ 99MB の空きがあるので /data/data を無理に /system/ext へ移動させることもないと判断した次第。

なお、Android 2.2 froyo から OS 標準で、 アプリを SD カードへ移動できるようになった。 しかし対応アプリでないと移動できないし、 現時点では多くのアプリが対応していない。 さらに 「USBストレージをON にする」 と SD カードへ移動したアプリは USB ストレージが ON の間は使えなくなるので注意が必要。

というわけで、 アプリを SDカード上にインストールできるようにするのは、 シンボリックリンクを /data から /system/ext へ張るだけのことなので全く難しくない。 しかしながら、 どうやって SDカード上の ext3 パーティションをマウントするか、 という問題がまだ残っている。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:56
2010年9月21日

地デジ MPEG-2 TS の PCR/PTS/DTS ラップアラウンド (PCR Wrap-around) 問題を回避して ffmpeg で PS 変換できるようにしてみた

(地上)デジタルTV 放送を Linux サーバで予約録画しまくるようになった今日このごろ、 たまに失敗するのが気になっていた。 失敗といっても、 録画した MPEG-2 TS (Transport Stream) ファイルを VLC で再生する分には問題がないが、 ffmpeg を使って MPEG-2 PS (Program Stream) フォーマットへ変換しようとすると途中で映像が止まってしまう (TS 読み込みに失敗しているので他のフォーマットへの変換もおそらく無理)。

おそらく TS のデータに何らかの誤りがあって ffmpeg が映像データを読むのをそこで止めてしまうためだろうと思っていた。 そりゃ放送なんだからノイズが混じることもあるだろうと思い込んでいたのだが、 よほど電波状況が悪くない限りエラー補正が効くだろうから、 ノイズが原因というのはありそうもない話。

なぜ PS へ変換したいかといえば、 TS のままだとファイルサイズが大きすぎる (2時間の映画番組とかだと 12GB を超える) ので、 PS へ変換し (CM カットなどの編集を行なうときは PS の方が便利)、 さらに MPEG-4 などへ変換してサイズを小さくしたいから (もちろん保存する必要がない番組は見たらすぐ消す)。 ところが PS への変換に失敗した番組は TS のまま保存せざるを得ず、 そういうファイルが増えてきて、 2TB のハードディスクもだんだん手狭になってきた。

そこで、 何が原因で TS の読み込みに失敗しているのか、 まずは調べてみようと思ったのだが、 いかんせんファイルがデカすぎる。 12GB もあるとファイルの内容をダンプするのもままならない。 そこで変換が失敗する近辺のデータだけ抜き出して詳しく調べてみようと考えた。 MPEG-2 TS の仕様を調べてみると、 PCR (Program Clock Reference) なるタイムスタンプが 100msec 以下の間隔で MPEG-2 TS には埋め込まれているらしい。 問題の TS ファイルは、 2時間の番組中、 先頭から 1時間35分41秒ほど経過したあたりで読み込みに失敗するので、 PCR の値を手がかりにその近辺のデータを抜き出そうと考えた次第。

まずは PCR の値を表示する perl スクリプト tsdump.pl を作ってみた (後述する tsrenum.pl に -v オプションを与えることによって同じ出力が得られる)。

% ./tsdump.pl -v < 133000_GR23.ts
0008c4a PCR 24:55:00.570 8073051319+138
001a12d PTS 24:55:01.111 8073100071
001a132 DTS 24:55:01.011 8073091062
001d841 PTS 24:55:00.748 8073067367
0022556 PCR 24:55:00.628 8073056524+157
00226d5 PTS 24:55:01.045 8073094065
0026a65 PTS 24:55:00.769 8073069287
0029dcd PTS 24:55:01.078 8073097068
00300f1 PTS 24:55:00.791 8073071207
0033225 PTS 24:55:01.212 8073109080
003322a DTS 24:55:01.111 8073100071
0038f69 PTS 24:55:00.812 8073073127
003bcea PCR 24:55:00.685 8073061729+175
...

「133000_GR23.ts」 が問題の TS ファイル (23チャンネルなので TV東京 ^^;)。 次の 「0008c4a PCR 24:55:00.570 8073051319+138」 という行は、 ファイル先頭から 0008c4a バイト目に PCR があって、 そのタイムスタンプが 「24:55:00.570」 であることを示す。

行末尾の 「8073051319+138」 は生の PCR の値。 つまり、 PCR は 33bit の 「PCR base」 と 9bit の 「PCR extension」 から構成されるが、 それぞれ 8073051319 と 138 であることを示す。 PCR base は 90kHz の解像度、 PCR extension は 27MHz の解像度。 とりあえずここでは後者は無視して、 前者 8073051319 を 90000 (= 90kHz) で割ると 89700.570 秒で、 時分秒に直すと 24:55:00.570 になる。

PCR の他に、 PTS (Presentation Time Stamp) と DTS (Decode Time Stamp) というタイムスタンプも MPEG-2 TS には埋め込まれている。 これらは PCR と違って 90kHz の解像度の 33bit のデータのみ。 MPEG-2 TS では、 PCR の時刻を基準にして、 復号する時刻 (DTS) と再生する時刻 (PTS) を定めている (音声と映像の同期のためにも使われる)。 前述したプログラムの出力において、 2カラム目に PTS, DTS と出力している行は、 それぞれ PTS, DTS の値であることを示す。

で、 PCR の値を表示させてみていきなり気付いてしまったのだが、 この問題の TS ファイルは PCR の値が 33bit の上限値ギリギリ。 33bit の上限は 0x1FFFFFFFF = 8589934591 だから、 PCR は 26:30:43.717 (26時間30分43秒余) までしかカウントできない。 このファイルは冒頭のタイムスタンプが 24:55:00.570 だから、 冒頭から 01:35:43.147 ほど経過したあたりで PCR の値が桁あふれ (オーバーフロー) を起こして 00:00:00.000 へ戻ってしまう (ラップアラウンド)。

これは冒頭から 1時間35分41秒ほど経過したあたりで ffmpeg が止まってしまう症状にピッタリ符合する (2秒ほど差があるのは MPEG-2 復号に要する時間?) ので、 もう原因は PCR のラップアラウンド (PCR Wrap-around) で間違いないと推測。

「VLC で再生する分には問題がない」 と書いたが、 この問題の TS ファイルを VLC で再生して 1時間35分41秒あたり (VLC の場合 TS 再生時は時刻表示を行なわないのでシーンで探さざるを得ず大変) をよく見てみると、 再生が一瞬 (1秒ほど?) 止まっていた。 26時間半に一度、 必ず起こるラップアラウンドなのに、 VLC でも完全な対策は (まだ) 行なわれていないようだ。

原因調査の準備のために作ったスクリプトが、 いきなり原因究明の役に立つとは (^^;) と思いつつ、 tsdump.pl にタイムスタンプの値を付け替える (すなわち 24:55:00.570 から始まるタイムスタンプを 00:00:00.000 始まりにリナンバーする) 処理を付け加えたスクリプト tsrenum.pl を書いてみた (後述する pcr_write, ts_write 関数を追加しただけ)。

% ./tsrenum.pl < 133000_GR23.ts > 133000_GR23_fixed.ts

tsrenum.pl を使ってタイムスタンプを付け替えた 133000_GR23_fixed.ts は、 ffmpeg を使って PS 変換ができるようになった。 原因調査の準備のために作ったスクリプトが、 ほとんどそのまま問題解決の役にも立ってしまった (^^;)^2。

tsrenum.pl は、 標準入力から読み込んだ MPEG-2 TS において最初に現れた PCR/PTS/DTS タイムスタンプを基準 (下記スクリプト中の $pcrOrg) にして、 タイムスタンプを付け替えて標準出力へ書き出す:

#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
use Getopt::Std;
our ($opt_v);
getopts('v') || &help;
my $PacketSize = 188;
my $offset = 0;
my $pcrOrg;
for (;;) {
    my $buf;
    my $len = read(STDIN, $buf, $PacketSize);
    last unless $len > 0;
    my @buf = unpack("C*", $buf);
    die if $buf[0] != 0x47;	# sync byte
    my $ind = (($buf[1] & 0xE0) >> 5);
    my $adp = (($buf[3] & 0x30) >> 4);
    my $pos = 4;
    if ($adp & 0x2) {	# Adaptation field exist
	$pos++;
	my $af = $buf[$pos++];
	if ($af & 0x10) {
	    my ($pcr33, $pcr9) = &pcr(\@buf, $pos);
	    printf(STDERR "%07x PCR %s %d+%d\n",
		   $offset+$pos, &stime($pcr33), $pcr33, $pcr9) if $opt_v;
	    &pcr_write(\@buf, $pos, $pcr33);
	    $pos += 6;
	}
	if ($af & 0x08) {
	    $pos += 6;
	}
	if ($af & 0x04) {
	    $pos++;
	}
    }
    if ($ind & 0x02) {
	if ($buf[$pos] == 0x00 && $buf[$pos+1] == 0x00
	    && $buf[$pos+2] == 0x01 && ($buf[$pos+6] & 0xC0) == 0x80) {
	    my $flag = $buf[$pos+7];
	    $pos += 9;
	    if ($flag & 0x80) { # PTS
		my $ts = &ts(\@buf, $pos);
		printf(STDERR "%07x PTS %s %d\n",
		       $offset+$pos, &stime($ts), $ts) if $opt_v;
		&ts_write(\@buf, $pos, $ts);
		$pos += 5;
		if ($flag & 0x40) { # DTS
		    my $ts = &ts(\@buf, $pos);
		    printf(STDERR "%07x DTS %s %d\n",
			   $offset+$pos, &stime($ts), $ts) if $opt_v;
		    &ts_write(\@buf, $pos, $ts);
		    $pos += 5;
		}
	    }
	}
    }
    syswrite(STDOUT, pack("C*", @buf), $len);
    $offset += $len;
}

sub stime {
    my ($ts) = @_;
    my $sec = floor($ts / 90000);	# 90kHz
    $ts -= $sec * 90000;
    my $min = floor($sec / 60);
    $sec -= $min * 60;
    my $hour = floor($min / 60);
    $min -= $hour * 60;
    return sprintf("%02d:%02d:%02d.%03d", $hour, $min, $sec, $ts/90);
}

sub help {
    print STDERR <<EOF;
Usage: tsrenum.pl <opt>
opt:   -v            ; verbose
EOF
    exit 1;
}

MPEG-2 TS を標準入力から 1パケットずつ @buf に読み込んで、 PCR を見つけたら
pcr(\@buf, $pos) 関数を呼び出して PCR base の値 $pcr33 を取得し、
pcr_write(\@buf, $pos, $pcr33) 関数で PCR base の値を変更して標準出力へ書き出す。 PTS, DTS についても同様に、 ts(\@buf, $pos) 関数を呼び出して値を取得し、 ts_write(\@buf, $pos, $ts) 関数で変更する。

ISO/IEC 13818-1 の 2.4.3.4節 Adaptation field (20ページ) の Table 2-6 - Transport Stream adaptation field を見ると、 adaptation field の 2バイト目から 33bit が PCR base の値、 続いて 6bit の予約ビット、 その次の 9bit が PCR extension の値であることが分かる。 したがって pcr(\@buf, $pos) 関数は以下のように書ける:

sub pcr {
    my ($br, $pos) = @_;
    my $pcr33 = (($br->[$pos] << 25) | ($br->[$pos+1] << 17)
		 | ($br->[$pos+2] << 9) | ($br->[$pos+3] << 1)
		 | (($br->[$pos+4] & 0x80) != 0));
    my $pcr9 = ((($br->[$pos+4] & 0x01) << 8) | $br->[$pos+5]);
    return ($pcr33, $pcr9);
}

pcr_write(\@buf, $pos, $pcr33) 関数は PCR base の値 $pcr33 から $pcrOrg を減算してから pcr(\@buf, $pos) 関数の逆を行なうだけ:

sub pcr_write {
    my ($br, $pos, $pcr33) = @_;
    $pcrOrg = $pcr33 unless defined $pcrOrg;
    $pcr33 -= $pcrOrg;
    $br->[$pos] =   (($pcr33 >> 25) & 0xFF);
    $br->[$pos+1] = (($pcr33 >> 17) & 0xFF);
    $br->[$pos+2] = (($pcr33 >>  9) & 0xFF);
    $br->[$pos+3] = (($pcr33 >>  1) & 0xFF);
    if ($pcr33 & 1) {
	$br->[$pos+4] |= 0x80;
    } else {
	$br->[$pos+4] &= 0x7F;
    }
}

ISO/IEC 13818-1 の 2.4.3.7節 Semantic definition of fields in PES packet (31ページ) の Table 2-17 - PES packet を見ると、 PES (Packetized Elementary Stream) の 9バイト目から marker bit を挟みつつ 33bit の PTS と DTS が格納されていることが分かる。

したがって ts(\@buf, $pos) 関数と ts_write(\@buf, $pos, $ts) 関数は以下のように書ける:

sub ts {
    my ($br, $pos) = @_;
    return ((($br->[$pos] & 0x0E) << 29)
	    | ($br->[$pos+1] << 22) | (($br->[$pos+2] & 0xFE) << 14)
	    | ($br->[$pos+3] << 7)  | (($br->[$pos+4] & 0xFE) >> 1));
}

sub ts_write {
    my ($br, $pos, $ts) = @_;
    $pcrOrg = $ts unless defined $pcrOrg;
    $ts -= $pcrOrg;
    $br->[$pos] =   ((($ts >> 29) & 0x0E) | ($br->[$pos] & 0xF1));
    $br->[$pos+1] =  (($ts >> 22) & 0xFF);
    $br->[$pos+2] = ((($ts >> 14) & 0xFE) | ($br->[$pos+2] & 0x01));
    $br->[$pos+3] =  (($ts >>  7) & 0xFF);
    $br->[$pos+4] = ((($ts <<  1) & 0xFE) | ($br->[$pos+4] & 0x01));
}

すべて解決した後で気付いたのだが (^^;)、 ラップアラウンドする TS ファイルを読み込んだときは ffmpeg が的確なエラーメッセージを出力していた:

...
frame= 1328 fps= 21 q=2.0 size=   31898kB time=44.00 bitrate=5938.8kbits/s dup=24 drop=0    
frame= 1341 fps= 21 q=2.0 size=   32002kB time=44.45 bitrate=5898.1kbits/s dup=24 drop=0    
[mpegts @ 0x6253c0]Invalid timestamps stream=0, pts=4078, dts=8589929661, size=53459
*** drop!
*** 1 dup!
*** drop!
*** drop!
*** drop!
*** drop!
*** drop!
adding -2147483648 audio samples of silence
adding -2147483648 audio samples of silence
*** drop!
...

「Invalid timestamps ... pts=4078, dts=8589929661」 すなわち PTS が 00:00:00.045 なのに、 DTS が 26:30:43.663 なので無効なタイムスタンプである、 というエラー出力。 タイムスタンプがラップアラウンドしたときは、 「Invalid timestamps」 とは言えないと思うのだが...

念のため ffmpeg の最新版を 「git clone git://git.ffmpeg.org/ffmpeg/」 で取得してコンパイルしてみたのだが、 「FFmpeg version git-735bbae」 でも同様に 「Invalid timestamps」 エラーが出力された。

Filed under: プログラミングと開発環境 — hiroaki_sengoku @ 08:13
2010年9月4日

中国でプリペイド SIMカード 神州行と如意通を買ってみた

週末に休みを追加して北京へ行ってきた。 今回は全日程終日自由行動のパックツアーだったので、 昨年 「連れ回しパックツアー」 で北京へ行ったときには見せてもらえなかったところ (終日バスで連れ回されたので街の日常の風景を見ることができなかった) が見えてきて大変興味深かった。 が、 その内容をここで書いてしまうと、 このブログが中国から読めなくなってしまいそうなので自粛。

実質 3日間の短期滞在だったので、 日本で使ってるソフトバンクのケータイをそのまま持ち込んで 「海外パケットし放題」 でもよかったのだが、 せっかく訪れたのだからと北京でも SIMカードを買ってみた。

China unicom at BCIA

北京首都国際空港 (簡体字だと 「北京首都国际机场」) に着いてすぐ 「电话卡」 (直訳すると 「電話カード」) と書いてある SIMカード自販機が目を引く (写真は出発ロビーの自販機だが、到着ロビーにもある) が、 通話料なしで 100元 (約 1300円) もする。 つまり SIMカードを買っただけではダメで、 通話料をチャージ (中国語では 「充値」) しなければ使えない。 街中なら 50元の通話料込の SIMカードが 100元以下で売っている (つまり SIMカード単体の価格で比較すれば半額以下) ので、 空港での購入は見送った。 SIMカードに限らず、 中国では場所によって値段が大幅に変わってくるので注意が必要。

私は中関村 (簡体字だと 「中关村」) のケータイショップで買ったのだが、 中関村でなくても、 というかむしろ西単とかの繁華街の方が簡単に買える。 「我要SIM」 (正しくは儲値卡) などと紙に書いて店員に見せたら (四声をちゃんと発声しないと通じないので紙の方が早いし正確, もちろん英語は通じない) 電話番号ごとの値段リストを見せてくれた。

(続きを読む...)
Filed under: その他 — hiroaki_sengoku @ 00:34
2010年8月4日

HYBRID W-ZERO3 の解約に続き、ウィルコムADSL も解約した。さよならウィルコム!

事業破綻の報道等で 「顧客 (サービス利用者) の保護」 という言葉をみかけることが多いが、 言語明瞭意味不明ワードの一つだと思う:

PHS の解約が予想以上に進み、 2月に 417万人だった契約者数は 6月末には 388万人に減った。 7月下旬に予定していた裁判所への再建計画提出も、 「環境が変わった」として 10月に延期していた。
管財人らは、顧客を守るためにも、再建には通信会社の協力が必要と判断。 XGPを引き受けるソフトバンクに、PHS事業への支援に加わるよう求めていた。

「顧客を守る」 などと書くと聞こえはよいが、 PHS サービス継続を望む顧客がどれだけいるかなんて、 「PHS の解約が予想以上に進」んでいることから明らかなはず。 現在 388万人(も) 契約者数が残っていると言ったって、 その大半は 2年縛りのせいで辞めるに辞められない人たちであって (私も 6月末時点だと契約者なのでこの 388万人に含まれている)、 現顧客にとって望ましいのはサービス継続じゃなくて 2年縛りを免除してあげることだと思う。

「顧客」 というと 「債権者」 というイメージが強いし、 この報道のように 「顧客を守る」 と書くとますます 「債権者たる顧客を守れ!」 というイメージが強調されるけど、 実状は 「辞めたいけど契約の縛りで払い続けざるを得ない債務者たる顧客」 と 「辞めていく顧客から少しでも多くの資金を回収したい債権者」 という (報道から受けるイメージとは真逆の) 構図であるわけで、 報道がいかに実状をゆがめたイメージを撒き散らしているかの一例だと思う。

私は丸 4年 (なのでちょうど解約可能なタイミングだった)、 ウィルコムの PHS サービスを利用してきた。 また自宅のバックアップ回線として 4年間近くウィルコムADSL を利用してきた。 なぜウィルコムだったかと言えば、 2006年当時まだ珍しかった 「スマートフォン」 W-ZERO3[es] を使いたかったから。 4年前ドコモショップで、 スマートフォンが使いたいから解約すると伝えたとき、 ドコモも近いうちにスマートフォンを出す予定 (hTc Z) と担当者が言っていたのを思い出す。

その後、 W-ZERO3[es], Advanced W-ZERO3[es], HYBRID W-ZERO3 と 3代続けて W-ZERO3 シリーズを使い続けてきたが、 HYBRID W-ZERO3 のあまりのデキの悪さ (そもそも電話の着信音 / バイブレーションが小さすぎて着信に気付けないのだから電話として失格) に幻滅し、 乗り換えを決意した次第。 輝かしい W-ZERO3 の歴史の最後の最後で欠陥品を出してしまうとは (私は使ったことがないが一つ前の WILLCOM 03 も失敗作だった?)、 いったいシャープに何が起こったのか?

iPhone を使いたいがためにソフトバンクに乗り換える人が圧倒的である昨今、 いまさら言うまでもないことだが、 (2006年ごろから?) 通信サービスは端末のオマケに成り下がったとつくづく思う。 いや、 端末ではなくコンテンツのほうがもっと大事だと言う人がいるかもしれないが、 そうなるのはもう少し先 (少なくともあと 3年くらい先)、 端末がコモディティ化した後の話だと思う。 少なくとも現時点では、 どんなに立派で魅力的なコンテンツでも、 それをユーザに届ける窓口である 「端末」 がヘタレであれば何の意味もない。

一般に解約するのは骨が折れる。 多くの場合、解約は電話のみの受付だったり、 解約通知書を郵送しなければいけなかったりと、いろいろ手間がかかる。 Web だけで契約が済んでしまう入会の時とは対照的。 しかも解約の方法は Web を丹念に見ていかないと見つけられなかったりする。 退会率を下げたいという事業者側の気持ちも (職業がら) もちろん分かるのだが、 解約方法を分かりにくくすればするほどサポートコストは増えるしユーザ満足度も下がるわけで、 結局事業者自身の首を絞めることにしかなってないと思う。

特に、 ウィルコムADSL の解約は大変だったので以下にメモ:

(続きを読む...)
Filed under: その他 — hiroaki_sengoku @ 08:07
« Newer PostsOlder Posts »