Rui's Blog

パイロット免許取得への道

アメリカだと小型機のライセンスが比較的簡単に取れるんですよね。最近いろいろ情報収集していたんですが、ついに近所の空港にデモフライトに行ってきました。

乗ったのは4人乗りセスナ172SP。事前にフライトシミュレータで練習していったからなのか、操縦は思ったより簡単な感じでした。60ノットまで加速して操縦桿を引くとたちまちのうちにカリフォルニアの青い空へ一直線に上昇、窓に目を向けるとハイウェイ101を走るクルマが動くジオラマのように見えて。その後西へ向かってハイウェイ280を越えて海までいったあと、帰ってきてタッチアンドゴーを数回やって初回は終了。難しい所はインストラクターがやってくれるんですが、滑走路めがけて自分の操縦で降下していくときは緊張しました。しかしクルマの運転と同じで慣れれば難なくできそうです。

ライセンス取得までには70時間程度の実地練習+座学+12,000ドルくらいが必要とのこと。

免許取得後は飛行機をレンタルすることができて、機種にもよるけどコストは一時間$150程度。エンジンが回っている間しか課金されないので、たとえば1時間でつける場所に往復した場合は$300。4人で乗ってスキー場に日帰りで行くケースとかを考えるとわりとリーズナブルだと思います。人里離れた秘境に直行便で行ったりハワイで島の間を飛んだりもできますな。

あと数回、別の場所でデモフライトをしてから、どこで誰に習うのかを決めようと思ってます。今日のインストラクターは中東系のアメリカ人。空を飛ぶというのは子供のころからやりたかったことなんだよね、というと僕もそうだよ、と言っていました。やっぱそうですよねえ。操縦楽しいですよ。

Dec 3

クルマ雑誌の文体

クルマ雑誌というのは言語は違えどアメリカと日本に共通するものが多いように思う。なんというかあのもったいぶった口調が似ている。「ここに集まったスーパーカー5台は、どれも確かに、液体燃料が生み出せる究極の推力を持っているとはいえないかもしれない。しかし…」とか「走るほどに確信が確かなものになる」とか、そういう口調。ライターも読者も全く異なる2つのグループの文章から受ける印象が似ているというのは、お互いがお互いのパロディをしているみたいに思えてちょっと笑える。

今度は男のグルメ雑誌みたいなやつを買ってdanchu口調と比較してみたい。

Dec 1

How I Met Your Mother

How I Met Your Mother. 面白いドラマ。90年代にやっていたFriendsが好きだった人ならこれも好きになると思う。いつもの5人が、いつものマンハッタンのバーやアパートで、付き合ったり喧嘩をしたりして、結局みんな仲がよくてほっとする。そしてときどき声を出して笑うくらい面白い。こういうシットコムは好きだ。

2005年から放送開始でぼくはシーズン3まで見た。シーズン7がいまだに放送中。アメリカのドラマは人気があるかぎり終わらない。

Googleマップメーカー

Googleマップに出てくる地図はGoogleマップメーカーを使ってユーザが編集できる。ぼくはこういうチマチマした手作業が好きなほうなので、自分の住んでるエリアの地図を超詳細に作り込んでみた。上の画像はその一部のビフォーアフター。合計で20時間は軽く費やしたと思う。

  • 編集機能がプリミティブで簡単な形をつくるのも結構苦労するが、建物から道路、公園、池までGoogleマップ上にあるものはなんでも作れる。
  • 作ったものは承認され次第すぐにGoogleマップにでてくる。
  • アメリカの地図は変更できるが日本の地図はできない。
  • 500メートル四方の建物をすべて完成だけですごく労力が必要だった。日本の地図では日本全国くまなく建物がマップされているのを考えるとゼンリンの地図データのクオリティは神。

超低ビットレート電力線通信による電力需要調整

家庭での電力消費におけるエアコンの割合は高いから、ピーク時にエアコンを消してもらうだけで電力需要はかなり調整できる。しかしこれをどうやるかということが問題で、たんに節電をお願いするというのは心もとない。むしろどんなエアコンもコンセントにつながっているのだから、この線を使ってパワーグリッド側から各家庭のエアコンをコントロールできればいいと思う。では、どうすれば一番安く効率的にそういう大規模なシステムを構築できるだろうか? ちょっと考えてみた。

家庭のコンセントの電圧は100ボルトを中心に普段から数ボルト変動している。原理的に発電所での発電量を増やすと電圧が上がり、減らすと電圧が下がる。ということは、電力事業者が発電量を調整して電圧をわずかに意図的に変動させることで、その電力網内でコンセントに刺さっているすべてのデバイスに情報をブロードキャストすることができるはずだ。発電所を1Hz以下の超低周波数帯を使った超巨大電力線モデムみたいに使うわけだね。AM変調で。

発電所が意図的に作り出した電圧変動はその他の要因による電圧変動と混ざって埋もれてしまうだろうけど、ノイズがいかに多い通信路でも適切なエラー訂正符号を使えば信頼性の高い情報伝達ができるというのは情報理論の基本。たぶんビットレートは相当低いがエアコンを制御する程度なら1ビット/分くらいでも十分だろう。

エアコン側には適当なロジックを足して(今後発売されるものに義務付ければよい)、「エアコンよ止まれ」という信号が送られてきたときに止まるようにする。「1/3の確率で止まれ」とか「温度設定を2度上げろ」などというコマンドを実装すればもっと細かい負荷調整もできるし、「いまから1時間後に止まってほしいから今のうちに冷やしておきたいなら冷やしておいたほうがいい」などという情報を送ることも考えられる。

こういうシステムだと、発電事業者は発電所のハードウェアを変更したり電柱一本一本に設備を足したりする必要はなくて、発電所の制御プログラムを変更するだけでよい。発電設備の投資額に比べればタダみたいなものだろう。エアコンに電力線の電圧を読み取るセンサーを足すのも非常に安く済みそうだ。実際のところ夏の特定時間帯のピーク時需要に対応するために莫大な設備投資をしていることを考えれば、最悪時にパワーグリッド側から需要調整できるのを前提にシステムを考えなおすことで、全体でずっとコストを浮かせることができると思う。不要不急の装置だけリモートから一斉に停めるのは停電に比べて混乱もはるかに少ない。

正規分布にしたがって散らばる穴が重なる確率

画像処理で重なった穴を検出できるとはいっても、2つの穴があまりに近すぎる場合は1つの穴として誤認識されてしまうのは避けられない。ではランダムに穴を空けたときそういう「望ましくない穴」はどれくらいの割合でできてしまうのだろうか?

もうちょっと考えてみるとぼくが解きたい問題はこういうことのようだ。平面上のある点を中心に、正規分布に従ってランダムな場所に穴を空けていくとしよう。お互い近すぎて1個の穴としか認識できない穴は1個として数えることにするとき、n個穴を空けたとき実際に認識される穴の個数mはいくつになるでしょうか?

数学は得意ではないので乱数を使ったシミュレーションをPythonで書いてお茶を濁してみた。半径1の穴を、半径10の円内に95%が収まるようなランダムな位置に空けたとしよう。中心同士の距離が1以下の穴は区別できないものとすると、5個穴を空けたとき認識される穴の個数は4.63になる。10個なら8.56個。正規分布に従うものとすると穴が中心付近にまとまる傾向があるので、やはり思いのほかダブってしまいやすいようだ。

簡単で楽しい画像処理

OpenCVというライブラリを使うと複雑な画像処理プログラムをかなり簡単に書くことができる。というか実際に、ほとんど一日勉強しただけのようなレベルのぼくでも、結構難しそうな問題を解けるプログラムを書けたので、ちょっとここで紹介してみたい。

やりたかったことは、上のようなイメージからホールを検出すること。紙に穴が空いているのだが、これが何個どの位置にあるのかを検出したい。穴の輪郭は若干ギザギザしているし、互いに重なっていることもあるので、素直な円検出アルゴリズムはうまく動かない。自動でやるにはちょっと難しそうな問題でしょう? これがOpenCVを使うと数十行のプログラムで解くことができる。

解き方としては、穴が検出しやすくなるように画像をステップバイステップで単純化しながら、パターンマッチで穴を検出すればいいようだ。そういうやりかただと次のような流れになる。

まずは画像をガウシアンフィルタに通して平滑化してから、モノクロに変換する。

次に適当な明るさをしきい値として2値画像に変換する。特別に明るい1ピクセルなどが元画像にあったとしても、平滑化でならされているので、このステップで消えてなくなる。穴がはっきりしてきた。

標準的な穴と同じ大きさで同じ形の画像をテンプレートとしてマッチングを行うと、穴の中心と思われる部分が色の濃くなった画像が得られる。この濃さが「テンプレートと画像のその位置とがマッチしている度合い」を表している。

穴の中心だけを残すために2値化フィルタを再度かける。

この点の輪郭を抽出して、その輪郭の重心を求めると、それがそれぞれの穴の中心の座標ということになる。

検出した座標を中心として円を描画してみるとこうなる。

同じ円を元の画像に重ねてプロットすると次のようになる。重なった穴も含めてすべての穴が見事に検出されているのがわかると思う。画像処理の経験は特になくてもすぐにここまでできるようになるのだからOpenCVは素晴らしい。

False otherwise

ソフトウェアのドキュメンテーションを書いていると真偽値を返す関数の説明がこういうふうになることがよくある。

Returns true if blah blah, and false otherwise.

このfalse otherwiseって必要かな? 論理的に言えば、XであるときTrueを返すという言明は、¬XであるときFalseを返すという意味にはならないけど、実際的には間違いなくそれを意味するでしょ。毎回迷って書いたり省略したりしている。ブレるのが本当は一番よくないわけだが。

(追記)驚いたことにGoogle C++ Style Guideでこのタイプのドキュメンテーションのガイドラインが決まっていた。”Returns false otherwise”は冗長だから書かないほうが良いと。ま、ぼくは今後はそのアドバイスに従おうかなと思う。

Canvasに白く縁どりされたテキストを描く

白地で囲まれたテキストをHTML Canvasに描くにはどうしたらよいだろう?

単純に考えればテキストにシャドーを設定して、それにブラー効果をつければよさそうだが、それではテキストから離れるにつれてシャドーが薄くなってしまうのでクッキリした輪郭にならない。

Canvasの機能で一発で描画するのは無理なようだ。

一定の距離を離れたところに白でテキストを描く、というのを角度を変えながら繰り返して、最後に黒でその中央に同じテキストを描画すると、上の図のようにうまくいく。

Nov 6

手書きフォント

手書きフォントを作ってみました。このページ自体、直接見てみると、ぼくの字をもとにした手書きフォントで表示されてるはずです(最近のブラウザなら)。これ画像ではないです。どうやっているかというと、

  • Webフォントというものを使うと、表示する側のPCにインストールされてないフォントを使うことができます
  • 手書き文字を画面に書くとそれをフォントにしてくれるというiPhone webアプリを書きました

なかなか面白いものができつつあると思うのですが、詳細をここで説明するにはこのフォントの文字は少なすぎます(何百字も作るの大変なんですよ)。なので詳しくはまた次回☆