仙石浩明の日記

2012年1月12日

香港で洗濯を

旅行期間が長くなると当然着替えがたくさん必要になる。 下着を毎日替えるのはアタリマエだが、 シャツもできれば毎日着替えたい。 滞在期間が一週間を超えると、 衣類だけでスーツケースが一杯になってしまう。 近年多くの航空会社が、 荷物を各 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ポンドもあった) が、 同様に満足のいく仕上がりだった。 おかげで、 日本に帰ってから洗う必要があった衣服はほとんど無く、 帰宅後に大量の洗濯をする羽目にならずに済んだ。

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

Filed under: 香港 — hiroaki_sengoku @ 10:10
2012年1月4日

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

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

近頃のスマートフォン (スマホ) は、 ちょっと使ってるとバッテリーが一日もたない。 出先でバッテリー切れになると大変困るので、 外付バッテリーを携帯している人も多いのではないか。 外付バッテリーには、 リチウムイオン二次電池 (充電式電池, 充電池) を利用するものと、 単三乾電池 (あるいはエネループ等のニッケル水素二次電池) を利用するものがあるが、 前者は (安全性の観点から) 充電池を交換できないことが多く、 充電池が寿命を迎えると使い捨てになってしまう (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 を超えていないようなので (オシロスコープを持ってないので正確なところは不明)、 まあ大丈夫なのだろう。

Filed under: Android,香港 — hiroaki_sengoku @ 11:56
2011年11月28日

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Filed under: 仙石浩明CTO の日記,自己啓発 — hiroaki_sengoku @ 15:59
2011年10月13日

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

東北大学大学院の教壇に立ちました。 産学連係講義 「先端技術の基礎と実践」 という講義で、 毎週一人づつ企業から講師を招いて、 ソフトウェアや 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) を公開し、 ブログを書き、 インタビューを受け、 いろんなところで講演したりパネルディスカッションに登壇したりしています。 今日、 ここでこうやって講演しているのも、 実を言えば、 人前でうまく話す練習をしたい、 というのが一番の動機だったりします。

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

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

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

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

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

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

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

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

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

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

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

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

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

Filed under: 仙石浩明CTO の日記,技術者の成長 — hiroaki_sengoku @ 22:50
2011年8月23日

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

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 を同期させる方法を考えてみた。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 07:31
2011年7月31日

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

国内に (自宅以外で) 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 側の負荷状況に左右されると思われるので、 単純に比較すべきではない。

Filed under: IPv6,システム構築・運用 — hiroaki_sengoku @ 10:48
2011年7月24日

フレッツ 光ネクストの IPv6 IPoE 接続 (ネイティブ方式) を使ってみた

IPv6 閉域網であることを今までさんざん dis られてきたフレッツ網 (NGN, 次世代ネットワーク) が、 ついに 7月21日からインターネットに接続できるようになった。 これでもう 「NGN と IPv6 インターネットは併用できない」 などとは言わせない。 私は IPv6 を既に PPPoE 接続で使っているのだが、 トンネル方式 (PPPoE) よりネイティブ方式 (IPoE) のほうがいいにきまってる、 ということでさっそく申し込んでみた

NGN のサービス情報サイト (NGN からでないとアクセスできない) のページで 「サービス申込受付」 をクリック。 「お客様ID」 と 「アクセスキー」 を入力してログインすると、 「フレッツ・v6オプション」 を申し込むことができる (このページから申し込むと無料)。

申込み後、 NGN から流れてくる IPv6 ルータ広告 (RA, Router Advertisement) を tcpdump で監視していたら、 34分経過した頃にプレフィックスが突然変わった。 NGN の契約以来、 今まで一度も変わったことがなかったプレフィックス 2408:82:5fff:86a::/64 が、 2408:282:5fff::/64 になった。 これはきっとインターネットと通信できるプレフィックスに違いないと思って、 他のサイトから ping6 を打ってみた。 が、 NGN からは RA 以外は何も流れてこない。 うーん。 ちなみに RA の送信元 (NGN のエッジ・ルータ) は fe80::21e:13ff:fec2:69c2 のまま変わらず。

その後 1時間ほど放置してみたが何も状況が変化しなかったので、 「フレッツ・v6オプション」 って何? と思い直して (サービス内容をよく確認せずに申し込んでしまっていた)、 あらためて FAQ を見ると、

 Q
「フレッツ・v6オプション」を利用してインターネットへの接続はできますか?
 A
「フレッツ・v6オプション」 は、NTT東日本が構築するNGN内での通信が可能ですが、 「フレッツ・v6オプション」 のみではインターネットへの接続はできません。 インターネットへの接続には、 別途プロバイダサービスをお申し込みいただく必要があります。

インターネットへ接続するには、 フレッツ・v6オプションとプロバイダ契約の両方が必要らしい。 では、 どのプロバイダの、 どんなサービスを申し込めばいいんだろう? と思って、 フレッツ 光ネクスト IPv6 IPoE対応プロバイダを調べてみると、 神奈川県だと現時点で対応しているのは IIJmio だけだった (神奈川県だけでなく他県も同様)。 IIJ は今まで契約したことがなかったが、 他に選択肢が無いのであれば仕方がない。 さくっとクレジットカード番号を入力して IIJmio FiberAccess/NF を契約した (月額 2100円)。 これで半固定 IPv6 アドレスによる IPoE サービスと、 動的割当て IPv4 アドレスによる PPPoE サービスが利用できる。

Ether 上に IP を流すのはごくごく普通のことなので、 あらたまって 「IPoE」 (IP over Ether) と表現されると何だか妙な感じ。 「半固定」 というのも微妙な表現だが、 注意書きには 「お客様の移転、フレッツ回線の品目変更やNTTのメンテナンスにより、 変更になる場合があります」 と書いてあるので、 普通に使ってる限りプレフィックスが変わることは無さそう。

mio FiberAccess/NFサービスは、 インターネットマルチフィード株式会社が提供する 「transix (トランジックス)」 サービスを利用して、 NTT東西の 「インターネット(IPv6 IPoE)接続」 に対応したIPv6接続を提供します。 IPv6接続に加えて、 PPPoE接続方式によるIPv4接続もあわせて提供するため、 お客様は一つのサービスでIPv6、 IPv4の両方の接続環境を利用することができます。
IIJmio FiberAccess/NF概要 から引用

IPv6 接続は全て transix が担っていて、 IIJmio はネットワーク的には何の役割も果たしていない。 IIJmio がやってるのは課金などユーザ管理関連だけ。 プロバイダである IIJmio が絡むから、 IPv4 接続も提供するなどという抱き合わせ商法になる。 動的割当の IPv4 PPPoE 接続サービスなんて要らないから、 もう少し安いプランがあればいいのにと思う。

本来、 ネイティブ方式の IPv6 接続サービスは、 NTT東西だけで提供するのが自然な形だった。 ところが、 NGN を持っていて地域独占な NTT東西が接続サービスまで提供してしまっては、 他のプロバイダの出る幕がなくなると猛反発されて、 BBIX, JPNE, インターネットマルチフィード の三社が接続サービスを提供することになった。 なぜ三社だけかといえば、 プロバイダを増やすと経路情報の処理量が膨大になって NGN の各ルータの処理能力の限界を超えてしまうから。

ところが、 三社だけでは少なすぎると他のプロバイダ達が反対したので、 その他大勢の中小プロバイダにも参入の余地を無理矢理作ったということなのだろう。 でも、 やってることは単なるユーザ管理なので、 通信事業者じゃなくてもできる簡単なお仕事。 この期に及んで業界保護みたいなことはやめてほしい。 インターネット接続サービスは既にコモディティ化しているのだから、 体力のないところは淘汰されるべき。

FiberAccess/NF を契約してから 1時間が経過したとき、 NGN から流れてくる RA のプレフィックスが 2409:82:5fff::/64 に変わった。 今度こそ疎通したかと思い、 senri.gcd.org に IPv6 アドレス 2409:82:5fff::3c20:55dc を割当てて、 他のサイトから 2409:82:5fff::3c20:55dc に対して ping6 を打ってみる。 すると無事、NGN IPoE 経由で senri.gcd.org に ICMPv6 パケットが届いた。

ただし、 まだ senri.gcd.org の routing 設定を行なっていないので、 返りパケットは PPPoE 経由で OCN 側へ行ってしまう (おそらく OCN 内部で捨てられる)。 そこで、 とりあえずの対策として NGN から届いたパケットは NGN へ返すように、 policy routing rule を設定した:

senri:/ # ip -6 rule add from 2409:82:5fff::/64 table 100 pref 25600
senri:/ # ip -6 route add default table 100 via fe80::21e:13ff:fec2:69c2 dev eth1

つまり、 送信元アドレスが 2409:82:5fff::/64 なパケットは routing table 100 を参照するようにして、 routing table 100 において default route を、 fe80::21e:13ff:fec2:69c2 (NGN のエッジ・ルータ) へ向ける。

これで ping に対して応答できるようになった。

fremont:~ $ ping6 -c 3 2409:82:5fff::3c20:55dc
PING 2409:82:5fff::3c20:55dc(2409:82:5fff::3c20:55dc) 56 data bytes
64 bytes from 2409:82:5fff::3c20:55dc: icmp_seq=1 ttl=49 time=122 ms
64 bytes from 2409:82:5fff::3c20:55dc: icmp_seq=2 ttl=49 time=122 ms
64 bytes from 2409:82:5fff::3c20:55dc: icmp_seq=3 ttl=49 time=122 ms

--- 2409:82:5fff::3c20:55dc ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 122.479/122.526/122.591/0.289 ms
fremont:~ $ tcpspray 2409:82:5fff::3c20:55dc
Transmitted 102400 bytes in 0.491628 seconds (203.406 kbytes/s)

RTT (Round Trip Time, 往復所要時間) が 122ms もかかってるのは、 fremont.gcd.org が米国の西海岸にあるため。 2400:400d:100::3c20:55dc (OCN の PPPoE 接続) 宛の場合↓ と比べると、 transix は RTT で 50ms ほど速く、 帯域 (tcpspray による簡易測定) で倍くらい広い。

fremont:~ $ ping6 -c 3 2400:400d:100::3c20:55dc
PING 2400:400d:100::3c20:55dc(2400:400d:100::3c20:55dc) 56 data bytes
64 bytes from 2400:400d:100::3c20:55dc: icmp_seq=1 ttl=49 time=174 ms
64 bytes from 2400:400d:100::3c20:55dc: icmp_seq=2 ttl=49 time=174 ms
64 bytes from 2400:400d:100::3c20:55dc: icmp_seq=3 ttl=49 time=174 ms

--- 2400:400d:100::3c20:55dc ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 174.046/174.386/174.593/0.539 ms

fremont:~ $ tcpspray 2400:400d:100::3c20:55dc
Transmitted 102400 bytes in 0.905523 seconds (110.433 kbytes/s)

参考までに IPv4 60.32.85.216 (OCN の PPPoE 接続) の場合も測ってみた。 すると RTT も帯域も transix と同程度だった。 つまり OCN の IPv6 PPPoE だけが突出して遅く、 帯域も狭い。

fremont:~ $ ping -c 3 60.32.85.216
PING 60.32.85.216 (60.32.85.216) 56(84) bytes of data.
64 bytes from 60.32.85.216: icmp_req=1 ttl=51 time=130 ms
64 bytes from 60.32.85.216: icmp_req=2 ttl=51 time=130 ms
64 bytes from 60.32.85.216: icmp_req=3 ttl=51 time=129 ms

--- 60.32.85.216 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 129.377/129.903/130.202/0.559 ms

fremont:~ $ tcpspray 60.32.85.216
Transmitted 102400 bytes in 0.518052 seconds (193.031 kbytes/s)

米国西海岸から transix までの IPv6 の経路はこんな感じ:

fremont:~ $ tracepath6 2409:82:5fff::3c20:55dc
 1?: [LOCALHOST]                        0.021ms pmtu 1500
 1:  2600:3c01:ffff:0:ca4c:75ff:fef5:d63f                  0.558ms
 1:  2600:3c01:ffff:0:ca4c:75ff:fef5:d63f                  0.480ms
 2:  10gigabitethernet2-3.core1.fmt1.he.net                3.149ms
 3:  10gigabitethernet1-2.core1.sjc2.he.net               11.042ms
 4:  equi6ix.sv.iij.com                                    1.834ms asymm  5
 5:  sjc002bf00.iij.net                                    9.384ms asymm  7
 6:  2001:48b0:bb00:8016::71                             120.588ms asymm  7
 7:  tky009bb11.IIJ.Net                                  120.730ms asymm  8
 8:  tky009ip50.IIJ.Net                                  121.048ms
 9:  2001:240:bb5c:1008::cafe                            120.365ms
10:  2404:8e00:feed:101::2                               121.852ms
11:  no reply
12:  no reply
13:  no reply
14:  no reply
15:  no reply
16:  2409:82:5fff::3c20:55dc                             127.409ms reached
     Resume: pmtu 1500 hops 16 back 49

「IIJmio はネットワーク的には何の役割も果たしていない」 が、 日米間の回線は IIJ が担っているようだ (あれっ? ^^;)。 日本に上陸後 (6 以降) はほとんど遅延していない。

OCN の PPPoE の場合だと、こんな感じ:

fremont:~ $ tracepath6 2400:400d:100::3c20:55dc
 1?: [LOCALHOST]                        0.047ms pmtu 1500
 1:  2600:3c01:ffff:0:ca4c:75ff:fef5:d63f                  3.935ms
 1:  2600:3c01:ffff:0:ca4c:75ff:fef5:d63f                  0.852ms
 2:  10gigabitethernet2-3.core1.fmt1.he.net                7.978ms
 3:  10gigabitethernet1-2.core1.sjc2.he.net                2.532ms
 4:  xe-0.equinix.snjsca04.us.bb.gin.ntt.net               2.018ms asymm  5
 5:  as-1.r21.osakjp01.jp.bb.gin.ntt.net                 168.074ms asymm 11
 6:  ae-0.ocn.osakjp01.jp.bb.gin.ntt.net                 167.792ms asymm 14
 7:  2001:380:8060:6::1                                  159.446ms asymm 13
 8:  2001:380:8170:4::1                                  167.630ms asymm 14
 9:  2001:380:8030:16::1                                 168.401ms asymm 15
10:  2001:380:8110:d::1                                  170.344ms asymm 14
11:  2001:380:8110:f::2                                  178.503ms asymm 13
12:  2001:380:8130:11::13                                178.131ms asymm 13
13:  2001:380:8270:8::2                                  172.448ms
14:  2001:380:4d:101::2                                  179.036ms
15:  2001:380:4d:182::2                                  181.317ms
16:  no reply
17:  2001:380:4d:181::2                                  173.127ms pmtu 1454
17:  senri.v6.gcd.org                                    183.023ms reached
     Resume: pmtu 1454 hops 17 back 49

日米間に 160ms もかかっている上に、 日本に上陸後 (5 以降) も 15ms ほど遅延がある。 なぜこんなに遅いのだろう? また、PPPoE なので mtu が 1454 になっている。

同じ OCN の PPPoE でも、 IPv4 だと遅くない (というか transix より若干速い) ので、 OCN の IPv6 PPPoE 接続サービスには、 なにか問題がありそう。 まあ、 追加料金無しのサービスなので、 IPv4 のオマケ的な位置づけなのかも?

fremont:~ $ tracepath 60.32.85.216
 1:  fremont.gcd.org                                       0.169ms pmtu 1500
 1:  184.105.143.85                                        1.702ms
 1:  184.105.143.85                                        0.418ms
 2:  10gigabitethernet2-3.core1.fmt1.he.net                0.665ms
 3:  10gigabitethernet1-1.core1.pao1.he.net                8.907ms
 4:  sjo-bb1-link.telia.net                                1.297ms asymm  5
 5:  verio-119529-sjo-bb1.telia.net                        4.568ms
 6:  ae-8.r20.snjsca04.us.bb.gin.ntt.net                   1.922ms
 7:  as-2.r20.tokyjp01.jp.bb.gin.ntt.net                 112.093ms asymm  8
 8:  ae-1.ocn.tokyjp01.jp.bb.gin.ntt.net                 119.692ms asymm 11
 9:  60.37.27.137                                        120.641ms asymm 10
10:  60.37.55.158                                        119.549ms asymm 11
11:  122.1.173.238                                       121.243ms
12:  118.23.5.78                                         128.853ms asymm 14
13:  no reply
14:  118.23.8.9                                          128.712ms pmtu 1454
14:  gcd.org                                             123.788ms reached
     Resume: pmtu 1454 hops 14 back 52
(続きを読む...)
Filed under: IPv6,システム構築・運用 — hiroaki_sengoku @ 18:33
2011年6月20日

フレッツ 光ネクストの IPv6 PPPoE 接続を OCN 光アクセスで使ってみた

6月1日から NTT東日本のフレッツ 光ネクストにおいて IPv6 PPPoE 接続の提供が始まった。 私は OCN光アクセスを契約しているが、 幸い OCN (NTTコミュニケーションズ) も、 NTT東日本に合わせて順次対応を開始ということなので、 さっそく OCN へ電話で問合わせてみたら、 申込書をメールで送るので記入押印の上 FAX で送り返して欲しい、とのこと。

いまどき Web で申し込めないなんて、 と思いつつ 8ページにもわたる申込書 (いつも感じるが OCN の申込書は無駄にページ数が多い *_*) を FAX で送付。 すると翌日電話がかかってきて、 開通日は 10日後などとおっしゃる。 それじゃ World IPv6 Day に間に合わないじゃんと思ったが、 どんな変更でも申込みから 7営業日は最低でもかかるらしいので仕方がない。 なお、 工事費および月額使用料は無料。

OCN には元々月額 315円の 「OCN IPv6」 というサービスがあるが、 OCN IPv6 はフレッツ網に PPPoE によるトンネルを張って IPv4 を通し (OCN フレッツ光)、 その IPv4 上に L2TP (Layer 2 Tunneling Protocol) によるトンネルを張って PPP セッションを通し、 その PPP 上に IPv6 を通すという屋上屋を架す方式だったのに対し、 6月1日から始まった 「IPv6インターネット接続」 はフレッツ網に PPPoE によるトンネルを張って IPv6 を通す方式。

つまり OCN フレッツ光の IPv4 の部分を IPv6 でそのまま置き換えたシンプルな方式。 もちろんフレッツ網に IPv6 を直接通す 「ネイティブ方式」 が一番シンプルだが、 ネイティブ方式に関しては 「平成23年7月を目途に提供を予定」 ということなので、 どのようなサービスが始まるのか今のところ不明 (もう来週には 7月が始まってしまうのだが)。 7/24追記: ネイティブ方式サービスが始まった!

開通日の 2日前に郵便で届いた 「ご利用内容のご案内」 の欄外の注釈に、

IPv6 でインターネットに接続する際、 認証ID の @ 右側を “@bizf.ocn.ne.jp” の場合は “@bizf6.ocn.ne.jp” に、 “@bizd.ocn.ne.jp” の場合は “@bizd6.ocn.ne.jp” に変更してご利用下さい。

と書いてあった。 IPv6 での接続に関する説明はこの部分だけなので、 あとは推測するしかない (サポートに接続方法を聞いても、 単に IPv6トンネル対応ルータを購入してくれと言われる)。

とりあえず、 ふだん IPv4 で接続するときに使ってる PPPoE スクリプト (RP-PPPoE) を、 認証ID を “xxxx@bizf.ocn.ne.jp” から “xxxx@bizf6.ocn.ne.jp” に変更して走らせてみる:

20:39:13 senri pppd[16587]: Plugin /etc/ppp/plugins/rp-pppoe.so loaded.
20:39:13 senri pppd[16587]: RP-PPPoE plugin version 3.10 compiled against pppd 2.4.5
20:39:13 senri pppd[16587]: pppd 2.4.5 started by root, uid 0
20:39:13 senri pppd[16587]: PPP session is 6394 (0x18fa)
20:39:13 senri pppd[16587]: Connected to 00:1e:13:c2:69:c2 via interface eth1
20:39:13 senri pppd[16587]: Using interface ppp0
20:39:13 senri pppd[16587]: Connect: ppp0 < --> eth1
20:39:13 senri pppd[16587]: Couldn't increase MTU to 1500
20:39:13 senri pppd[16587]: Couldn't increase MRU to 1500
20:39:13 senri pppd[16587]: PAP authentication succeeded
20:39:13 senri pppd[16587]: peer from calling number 00:1E:13:C2:69:C2 authorized
20:39:13 senri pppd[16587]: local  LL address fe80::fd61:ff9b:eb97:1f93
20:39:13 senri pppd[16587]: remote LL address fe80::0090:1a00:41a3:d3f3

PPP は 1 つ以上のネットワーク層プロトコルを選択できるので、 IPCP (IP Control Protocol) と IPv6CP (IPv6 Control Protocol) の両方が流れてくるのかと予想したのだが、 流れてきたのは IPv6CP のみだった。 つまり “@bizf.ocn.ne.jp” で IPv4 用、 “@bizf6.ocn.ne.jp” で IPv6 用、 計 2本の PPPoE セッションを張ることになる。

上記ログから分かる通り Link Local とはいえ IPv6 なアドレス fe80::fd61:ff9b:eb97:1f93 が割り振られたのだから、 IPv6 で通信できるはず。 試しに PPP の対向サーバへ ping を打ってみると、 ちゃんと応答が返ってきた:

senri:~ $ ping6 -c 3 fe80::0090:1a00:41a3:d3f3%ppp0
PING fe80::90:1a00:41a3:d3f3%ppp0 (fe80::90:1a00:41a3:d3f3%ppp0): 48 data bytes
56 bytes from fe80::90:1a00:41a3:d3f3%ppp0: icmp_seq=0 ttl=255 time=3.936 ms
56 bytes from fe80::90:1a00:41a3:d3f3%ppp0: icmp_seq=1 ttl=255 time=4.050 ms
56 bytes from fe80::90:1a00:41a3:d3f3%ppp0: icmp_seq=2 ttl=255 time=4.176 ms
--- fe80::0090:1a00:41a3:d3f3%ppp0 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 3.936/4.054/4.176/0.098 ms
senri:~ $ 

じゃ、 Global なアドレス (固定アドレス契約なのでプレフィックスが 「ご利用内容のご案内」 に書かれていた) を付けて routing 設定を行なえば Global に通信できそうと思い、 試してみると...

senri:/ # ifconfig eth0 add 2400:400d:100::1/56
senri:/ # ip -6 route add default via fe80::0090:1a00:41a3:d3f3 dev ppp0
senri:/ # ping6 www.kame.net
PING www.kame.net (2001:200:dff:fff1:216:3eff:feb1:44d7): 48 data bytes
^C--- www.kame.net ping statistics ---
15 packets transmitted, 0 packets received, 100% packet loss
senri:/ # 

う〜ん、ダメか。 tcpdump を使って ppp0 に届く IPv6 パケットを監視してみたが、 OCN へ送信したパケットのみが表示され、 OCN 側からは何のパケットも届かない。

しかも、 他のサイトから 2400:400d:100::1 に対して ping6 を打ってみても何も届かない。 仮にこちらの設定に何か間違いがあったとしても、 OCN 側で 2400:400d:100::1 宛のパケットを routing していれば、 パケット自体は流れてきそうな気がするのだが... 少なくとも IPv4 の場合なら、 こちらの IP アドレス設定が間違っていても、 受け取れないだけでパケット自体は流れてくる。

ひょっとして、 「ご利用内容のご案内」に書かれていた 「2400:400d:100::」 というプレフィックスが間違っているんじゃ? と、 途方に暮れる。

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

Android 端末上で透過型プロキシを動かしてみる 〜 VPN のように使えて、しかも省電力

透過型プロキシ (Transparent Proxy) というのは、 ブラウザから 「見えない」 プロキシのこと。 ブラウザ自身は WWW サーバにアクセスしているつもりなのに、 ブラウザが送信したリクエストをプロキシが横取りし、 プロキシから出し直す。 サーバからのレスポンスは当然プロキシに返り、 プロキシがそれをブラウザに送信するのだけど、 パケットがブラウザに届くまでの間に送信元アドレスが書き換えられて、 サーバから直接レスポンスが届いたようにブラウザからは見える。

フツーの 「見える」 プロキシは、 ブラウザ等でプロキシ設定が必要であるのに対し、 透過型プロキシだと設定が不要。 だから一部の ISP (インターネット接続プロバイダ) などで、 フツーのプロキシの代りに使われていたりする (ユーザにプロキシ設定の方法を説明する必要がなくてサポートコストが削減できる)。 あるいは企業等で、 従業員が仕事と関係ない Web ページを閲覧していないか監視するために、 社内から社外へ接続するゲートウェイ等に透過型プロキシを設置して、 社外への http アクセスを記録していたりする (監視だけならパケットをダンプするだけでも用が足りるが、 アクセス先のサイト毎に細かな制御を行なおうとすると、 プロキシを使った方が楽)。

このように、 透過型プロキシはその存在を隠すために使われることが多いが、 ブラウザにプロキシ設定の機能が無い場合は、 透過型プロキシを使わざるを得ない。 例えば、 Android 端末で使われるブラウザの多くが、 なぜかプロキシ設定の機能を持っていない。 プロキシ経由でアクセスされると、 モバイル端末からのアクセスなのか、 フツーの PC からのアクセスなのか、 区別がつかなくなってしまうので、 あえてプロキシ設定できないようにしているのかも知れないが、 プロキシを使わないとアクセスできない場合は困ってしまう。

私の場合、 勤務先の LAN 内のサーバに社外からアクセスするとき、 社内アクセス専用のプロキシ (ここでは仮にホスト名を proxy.klab.org とする) を利用している。 例えば senri.gcd.org (自宅のサーバ、つまり社外) からこのプロキシをアクセスすると、 こんな感じ:

senri:~ $ openssl s_client -connect proxy.klab.org:443 -cert cert.pem -key key.pem -CApath /usr/ssl/certs -quiet
Enter pass phrase for key.pem:xxxxxxxx

depth=1 /C=US/O=Equifax/OU=Equifax Secure Certificate Authority
verify return:1
depth=0 /serialNumber=-cn4oMJtlqoqfQZaTat68U68dNVbM8iQ/C=JP/O=*.klab.org/OU=GT41256819/OU=See www.rapidssl.com/resources/cps (c)09/OU=Domain Control Validated - RapidSSL(R)/CN=*.klab.org
verify return:1
CONNECT irc.klab.org:6667 HTTP/1.1

HTTP/1.0 200 OK

:irc.klab.org NOTICE AUTH :*** Looking up your hostname...
:irc.klab.org NOTICE AUTH :*** Found your hostname

行末に 「」 がある行が入力行。 「」 は Enter キー押下。 秘密鍵 key.pem でクライアント認証を受けて proxy.klab.org に接続し、 CONNECT リクエストを送信することにより、 社内の任意のサーバ:ポートに接続できる。 上記の例では社内 IRC サーバである irc.klab.org:6667 に接続しているが、 もちろん社内の任意の WWW サーバにも接続できる。

説明を簡単にするため proxy.klab.org と書いたが、 実際には VPN Warp を使っている (だから proxy.klab.org というサーバは存在しない)。 VPN Warp も stone で接続することができるので、 以下の説明は VPN Warp の場合もほとんど同様に適用することができる。

プロキシというと、 ファイアウォールの内側から外部のインターネットをアクセスするために用いるものと思っている人が多いせいか、 外からファイアウォールの内側をアクセスするためのプロキシは、 特にリバースプロキシ (reverse proxy) と呼ばれることもある。

proxy.klab.org を透過型プロキシとして利用できれば、 社内の任意のサーバに透過的にアクセスできるようになる。 例えばこんな感じ:

senri:~ $ adb shell
$ getprop ro.build.description
soju-user 2.3.4 GRJ22 121341 release-keys
$ su
# busybox traceroute irc.klab.org
traceroute to irc.klab.org (10.10.0.18), 30 hops max, 38 byte packets
 1  110.158.20.29 (110.158.20.29)  701.203 ms  90.517 ms  85.570 ms
 2  *  *  *
 3  *  *  *
 4  110.158.18.138 (110.158.18.138)  79.540 ms !A  *  *
 5  *  *  *
 6  *  ^C
senri:~ $ adb shell
$ telnet irc.klab.org 6667
:irc.klab.org NOTICE AUTH :*** Looking up your hostname...
:irc.klab.org NOTICE AUTH :*** Found your hostname

soju-user 2.3.4 GRJ22」 つまり Android 2.3.4 な Nexus S で、 パケットが届かないはずの irc.klab.org (10.10.0.18) に対して、 telnet でアクセスできている。 telnet でアクセスできるということは、 もちろん任意の IRC アプリで irc.klab.org にアクセスできるということ。

VPN (Virtual Private Network) でも同じことができる! という声が聞こえてきそうだが、 VPN だと TCP でデータを送受信していないときも、 VPN セッションを張っているだけでいろんなパケット (例えば ARP) が行き交って、 そのたびに電波が飛んで電池を消耗するので、 あまりモバイル向きではないと思う。

あるいは、 ConnectBot などを使って ssh で port forward を行なう方法もあるが、 これまた ssh セッションを張りっぱなしだと電池消耗が心配だし、 かといって IRC を使う前に毎回 ssh 接続を行なうのはメンドクサイ。 また、 通信先/宛先ポートが増えるたび port foward 設定を追加するのもメンドクサイ。

その点、 透過型プロキシだと実際にパケットが飛ぶときのみ通信が行なわれるので、 電池消耗をあまり心配せずに TCP セッションを張りっぱなしにできる。 また、 LAN 内の通信先/宛先ポートが増えても設定変更は不要。 モバイルで LAN 内にアクセスする方法として最適だと思う (便利なのに普及していないのはナゼ?)。

(続きを読む...)
Filed under: Android,stone 開発日記 — hiroaki_sengoku @ 09:41
2011年5月23日

TheBus でヌアヌ・パリ展望台 (Nu‘uanu Pali Lookout) へ行ってみた

ハワイ州オアフ島の観光スポットの定番、 ヌアヌ・パリ (Nu‘uanu Pali) 展望台。 地図中 赤印 A
一昔前のパック・ツアーなどだと、 空港に到着後、 ホテルへチェックインする前に観光バスで連れて行ってもらえたりしたが、 自力で行こうとすると難度が高い。 すなわち、 ハワイ唯一の公共交通機関 TheBus だと最寄りのバス停 (地図 青印 3ヶ所) から遠い (もちろんレンタカーを使えば簡単に行けるが、 ここでは車を使う方法は除外して考える)。

遠いだけならまだしも、 「展望台」 であるから (当然) 山の中であり、 しかも展望台があるのは高速道路 (Pali Highway, 61号線) の真上 (標高 386m)。 展望台 A のホノルル側 (地図で左下方向) の二つのバス停は、 直線距離で 4km 以上ある上に、 途中トンネルなどもあって、 徒歩で行くのは現実的では無さそう (Pali Highway はオアフ島の幹線で、 かなり交通量がある上に車速も 80km/h 程度と速く、 路肩を歩くのは危険)。

可能性があるのは A のカイルア側 (地図で右上方向) のバス停 (Kamehameha Highway との交差点)。 直線距離で 1.6km ほどだが、 道路がヘアピンカーブになっているので、 実際には 3km くらいになる。 展望台から 500m ほど、 今は使われていない旧道 (Old Pali Road) があって (この旧道の下に Pali Highway のトンネルがある)、 その先は山道 Maunawili Trail に接続している。

(続きを読む...)
Filed under: Hawaii — hiroaki_sengoku @ 09:43
2011年5月18日

nook color を買って CyanogenMod 7 をインストールしてみた 〜 レンガ化リスクが無い PC のようなタブレット端末

ハワイ滞在中、 泊ったホテルのすぐ近くに米国最大の書店チェーン Barnes & Noble があった。 当然しばしば立ち寄ったが、 電子ブックリーダ nook のデモ機を店内の一番目立つ場所 (入口を入ってすぐのところ) に並べて説明員が張り付いていて、 いつ訪れても、 来店する人々に nook を勧めたり説明したりしていた。 昨年 (2010年4月) 訪れたときもこういう状態だったので、 もうかれこれ一年以上やっているのだと思うが、 今回は昨年と違って、 nook color がラインアップに加わっている。

電子ブックリーダというと、 初代 nook や Kindle や BORDERS (米国二番手の書店チェーン, 経営再建中) の kobo eReader など、 電子インク (E Ink) をディスプレイに用いた機種が思い浮かぶが、 nook color は普通の液晶ディスプレイ。 電子書籍を読むなら圧倒的に電子インクの方が適していると思うが、 あいにく日本では電子書籍の普及は今一つだし、 近い将来普及が進むかというとなかなか難しそう (そもそも普及に懸ける書店の意気込みがぜんぜん違う)。 だから (英語がニガテな私は) 電子インクなブックリーダにはあまり興味がなかった (自炊は大変そう)。 でも、 nook color は液晶ディスプレイなので Android タブレットとして使えそう。

店頭デモ機をいじってみると、 そのままでも WWW ブラウザで日本語表示できるし、 ちょっと検索してみるとハックもいろいろ進んでいる (Android 3.0 honeycomb も動く) ようだ。 しかも $249 と Android タブレットとしてみると格安。 同じく 7インチ液晶の Galaxy Tab (382g) よりは重いが、 9.7インチ液晶の iPad2 (601g, ずっしり重くて私には無理) よりは軽い 450g.

というわけでハワイ滞在最終日に衝動買い (^^;)。 ちょうど円高が進んでいる昨今でもあるし〜 (言い訳)。 説明員のお姉さんに、 コレちょうだいと言うと、 すぐカウンターの下から (そんなところに在庫を入れていたのか) 取り出してレジへ。 ハワイ州の Sales Tax 4.710% が加算されて $260.73 (約 21000円)。 そのままスーツケースに放り込んで帰国。

で、 まず root 化。 Auto-Nooter 3.0.0 を使うと、 root 権限の取得から各種ソフトウェアのインストールまで、 全自動でやってくれるらしい。 Auto-Nooter をダウンロードして、 micro SD カードに書込み、 nook color に挿入して USB ケーブルで PC とつなぐと、 勝手にブートして勝手に全部やってくれる。 なんて簡単な...

ところが!

(続きを読む...)
Filed under: Android,Hawaii — hiroaki_sengoku @ 07:43
2011年5月7日

米国 T-Mobile のプリペイド SIM カードで Nexus S を使ってみた

米国 AT&T のプリペイド SIM カードは、 $100 ぶんの度数を購入 (refill) すると、 1年間有効。 昨年訪米したときに $100 refill しておいた (さらに直前に Data Package 100MB を購入しておいた) ので今回の訪米では、 最初から (飛行機の外へ出た直後から) Nexus One で通信できた。

ところが今回は Nexus One の他に Nexus S も (ついでに言うと Galaxy S も) 持ってきている。 Nexus S は、 UMTS (W-CDMA) I/IV/VIII (2100MHz/AWS/900MHz) のみ対応で、 AT&T の UMTS II (1900MHz) は対応していない。 もちろん EDGE (Enhanced Data Rates for GSM Evolution) なら Nexus S でも対応しているが、 3G 対応スマートフォンで EDGE を使うのは悲しすぎる。 そこで AWS (Advanced Wireless Services, 上り1.7GHz 下り2.1GHz) を使う T-Mobile のプリペイド SIM カードを購入してみた。

いたるところにある AT&T ストア (ホノルル市で 7ヶ所) と比べると、 T-Mobile ストアはホノルル市に 2ヶ所しかないが、 うち一軒は幸いダウンタウンの比較的アクセスしやすい場所 1100 Alakea St にあるので、 T-Mobile store ハワイ唯一の公共交通機関 TheBus で行ってみた:

ちなみにホノルル市のもう一軒は Kahala にあるようだが、 (車無しでは) とてもアクセスしにくそう。 しかも Google Map で見ると、 「存在しないと報告されました」 などと書いてある。

ダウンタウンの T-Mobile ストアに入るなり、 スタッフが寄ってきたので Prepaid SIM を 「Pay As You Go」 プランで買いたい旨を伝えた。 ID (写真入りの身分証明書) を求められたので、 写真入りの Debit カードを提示したら、 住所を言う必要もなく、 携帯電話を見せる必要もなく、 すんなり購入できて、 しかも (頼んでないのに) Activation まで行なってくれた。

店内に椅子がなかったので、 店の外に出て石段 (上の写真の 「1100 ALAKEA」 と書いてあるブロック) に腰掛けて、 購入した SIM を Nexus S に入れてみた。 Nexus S から、 Nexus One の電話番号へかけたら、 無事 Nexus One の着信音が鳴った。 Activation はホテルに戻ってからゆっくりやろうと思っていただけに、 あっさり Nexus S が使用可能状態になってしまって拍子抜け。

(続きを読む...)
Filed under: Android,Hawaii — hiroaki_sengoku @ 17:57
2011年4月8日

Galaxy S を Android 2.2.1 へ更新したら、アプリが次々と異常終了するようになってしまった 〜 原因と復旧方法

Sorry! The app has stopped unexpectedly.

Galaxy S を Kies 経由 (SAMSUNG 公式の方法) で 2.2.1 (ビルド番号 FROYO.ZSJPK) へアップデートしたら、 ほとんど全てのアプリが起動直後に異常終了するという事態に陥ってしまった。

← のような 「Sorry!」 ダイアログが、 ブート中に次々と表示される。 これは jp.softbank.mb.mail つまり SoftBankメールが異常終了したことを知らせるダイアログだが、 これ以外にも Battery Graph, K-9 Mail, Dropbox, Calendar Pad, ROM Manager などなど、 ブート時に自動起動されるウィジェットやサービスなどが、 次々と異常終了して同様の 「Sorry!」 ダイアログで画面が埋め尽された。 「Force close」 ボタンを押してダイアログを閉じても、 後から後からダイアログが繰り返し現れる深刻な事態。

一体何が起ったのかと呆然としながら 「Force close」 を押し続けていると、 言語 (英語/中国語) を選択する画面が表示された。 これはセットアップウィザード (PhoneSetupWizard.apk) で、 普通は初回のみ起動されるアプリ。

なぜホーム画面が表示されないのかと思いつつ、 ウィザードにしたがって時刻などを設定していくと、 異常終了してウィザードが再起動してしまった。 つまり言語設定からやり直し。 これが繰り返される無限ループに陥り、 ホーム画面に移行できなくなってしまった。

いったい何が起ったのか?

検索したら Kies を使って 2.2.1 BOJS5 へアップデートしたら PhoneSetupWizard.apk の無限ループに陥った、 という同様の症例が見つかったが、 もし SAMSUNG 公式の方法で 2.2.1 へアップデートしたとき、 常にこのような問題が起きるのだとしたら、 もっと大騒ぎになるはず。 だから、 単にアップデートしただけで発症するのではなく、 なにか別に発症の条件があるのではないか?

RyanZA's OCLF 2.0 を使っていて、 きちんと OCLF (One Click Lag Fix) を無効化してから 2.2.1 へアップデートしたのに、 アプリが動かなくなったという症例も見つかった。 Galaxy S はアプリのデータ用のフラッシュメモリ (/data ディレクトリ) の書込み速度が遅く、 しばしばフリーズする (いわゆる 「プチフリ」) 問題があり、 多くの人が OCLF 等のツール (ext2 なイメージファイルを /data パーティションに作って loop device 経由で /data にマウントしてくれるツール。 ファイルシステムが rfs から ext2 になることによりプチフリが軽減される) を使っていると思われるし、 もちろん私も使っている。

私の場合、 まず OCLF を無効化 (ext2 上のデータを /data 以下へ書き戻して loop device をアンマウント) し、 Kies を使って 2.2.1 へアップデートを行なった。 次に OCLF を有効化し、 しばらくフツーに Galaxy S を使ってみて問題無いことを確認した後、 バックアップを取っておこうと ClockworkMod recovery へ再起動してバックアップを行なった (うっかり OCLF を有効化したままバックアップしてしまったので、 data.img が 1.6GB になってしまった ^^;)。

ここまでは全く正常。

フツーの Android だと recovery mode では (通常起動時とは別の) recovery mode 専用のブートイメージ (recovery image) が使用されるので、 この recovery image を書き換えてバックアップ機能を持たせたり、 カスタムROM を書込む機能を持たせたりできる。 ClockworkMod recoveryAmon RA recovery が有名。
ところが Galaxy S の場合は、 recovery mode でも通常起動と同じブートイメージが使用され、 /system/bin/recovery が実行される。 しかもこの recovery が、 バージョン <3e> 以降から (正規の) 署名付 update.zip でないと書込めず (つまりカスタムROM 等を書込めない) しかも書込んだときは強制的に初期化するようになった。
そこで 改変版 3e Recovery が作られた。 この改変版で /system/bin/recovery を置き換えると、 初期化せずに任意の update.zip を読み込むことができて、 かつ ROM Manager に含まれる recovery-update.zip を読み込むと、 Galaxy S でも ClockworkMod recovery が利用できる。

で、 バックアップが正常に終了したあと起動したら前述したような異常事態に陥った、 という顛末。
同様の異常事態に陥ったかたは、 何をしたらそうなったか教えて頂けると幸い。

この手のトラブルが起きたとき、 Web 上でよく見かける対処方法といえば 「初期化」 (wipe data / factory reset)。 そりゃ初期化すれば直ることが多い (より事態が悪化して再起不能になるケースも無いわけではないので、 手放しで推奨するわけにはいかない) が、 トラブルの原因が闇に葬られるので、 私としてはきちんと原因究明した上で (可能なら設定等も温存したまま) 直したい。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 07:57
2011年3月24日

Nexus S を素のまま root 化する方法 〜 アンロック不要、リカバリROM書換も初期化も不要 (GRH78 まで)

遅ればせながら Nexus S を入手した。

もちろん、 真っ先に行なったのは root 権限の取得。 「正規に」 root 権限を取得できるのが、 Nexus S の唯一(?)の存在理由なのだから、 root を取らずにいじるというのは邪道だろう。 root を取らないのであれば Galaxy S などで充分。

Android 端末の root 権限を取得するには大別して次の二つの方法がある:

  1. ブートローダをアンロックしてリカバリを書換 (fastboot oem unlock)
  2. セキュリティホールを利用して root 権限を奪取 (RageAgainstTheCage)

1. の方法は Google 正規の方法。 開発目的で Android 端末をいじるときは root 権限を取得したほうが何かと便利なので、 Nexus One や Nexus S など開発者用の Android 端末は、 「仕様」 として root 権限を取得できるようになっている。

開発用でない端末の root を取れてしまうとセキュリティ上の脅威となる (他人の端末で勝手に root を取ってプライベートデータを盗み読むなど) ので、 端末上の全データを消去した上でないとアンロックできない。 なので、 root を取る前にアプリをインストールしたり、 設定を変更したりすると、 アンロックしたとき全て消えてしまって二度手間になる。 だから Nexus S を入手したら、 何よりも真っ先にアンロックすべき (← くどい)。

2. の方法は、 (root 権限で起動される) adbd が、 setuid(2) を使って root 権限を手放す (adbd は shell ユーザ権限で動く) ときに、 エラー (setuid の返値) チェックを行なっていない、 というバグ (セキュリティホール) を利用する。 具体的には RageAgainstTheCage exploit を利用して (再起動した) adbd が setuid を呼び出すときにリソース不足 (errno = EAGAIN) で失敗させ、 adbd が root 権限を手放さずにそのまま走るようにすることにより、 root 権限が利用できるようになる。

一般の (開発者用でない) 端末をいじり倒したい場合には便利な方法だが、 当然ながら悪用もできるわけで、 ユーザが意図しないところでアプリが勝手に root 権限を奪取してしまうと、 極めてやっかいなことになる。 実際そういうマルウェアも出回っているらしい。

Android Gingerbread 2.3.3 以降でこのバグが修正され、 RageAgainstTheCage では root 権限を奪取できないようになったのは当然と言える。 むしろ遅きに失したくらい。 これだけ有名かつ重大なセキュリティホールを今まで放置した Google は万死に値する。

というわけで、 Nexus S の箱を開封して真っ先にアンロックしようと FASTBOOT MODE にした (音量大ボタンを押しながら電源を入れる) のだが、 アンロックコマンド (fastboot oem unlock) が使えるなら、 もしかすると、 その他の fastboot コマンドも使えるのではないか? という思いがよぎり...

senri:~ $ fastboot boot recovery-clockwork-3.0.0.5-crespo.img
downloading 'boot.img'... OKAY
booting... OKAY

ありゃ (^^;)、 clockwork リカバリで起動してしまった。 リカバリイメージをフラッシュしていない点に注目。 フツーは、 アンロックした上でリカバリイメージを書込み、 リカバリモードで起動して root 化するのだが、 そうした手順をすっ飛ばして起動できてしまった。

ちなみに、 リカバリイメージを書込むにはアンロックが必要であるようだ:

senri:~ $ fastboot flash recovery recovery-clockwork-3.0.0.5-crespo.img 
sending 'recovery' (3980 KB)... OKAY
writing 'recovery'... FAILED (remote: Bootloader Locked - Use "fastboot oem unlock" to Unlock)
senri:~ $ 

フラッシュに書込みできなくても、 任意のカーネルを起動できたら何でもできるわけで、 ロックする意味がなくなってしまう。 実際、 root 権限があれば flash_image コマンドでリカバリイメージを書き込むことができた。 アンロック不要で 「fastboot boot」 コマンドが実行できてしまうのは、 バグなのではないか?

バグか仕様かはサテオキ、 現状の Nexus S は、 アンロックせず、 フラッシュへの書込みもせずに clockwork リカバリが起動できたので、 初期状態のフルバックアップが可能。 しかも、 clockwork リカバリは、 adbd が root 権限で動いている (これはバグではなく仕様) ので、 adb でアクセスすれば root になれる。

senri:~ $ adb shell
~ # 

う〜ん、簡単すぎ。 こんなことでいいのだろうかと思いつつ、 アンロックする手間が省けたので、 clockwork リカバリのメニューから 「mount /system」 を実行し、 su コマンドをインストール:

senri:~ $ adb push su-2.3.6.1-ef/system/bin/su /system/bin/
596 KB/s (26264 bytes in 0.042s)
senri:~ $ adb install su-2.3.6.1-ef/system/app/Superuser.apk
1825 KB/s (196521 bytes in 0.105s)
	pkg: /data/local/tmp/Superuser.apk
Success
senri:~ $ adb shell
~ # chmod 4711 /system/bin/su
~ # 

というわけで、 Nexus S を素のまま root 化できてしまった。 ブートイメージやリカバリイメージを変更する必要がないので、 文鎮化リスクが全く無い安全な root 化方法と言えるが、 逆に言うと端末に痕跡を全く残さずに root 権限を奪取できてしまうわけで、 いいんだか悪いんだか...

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:14
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
Older Posts »