2012年2月27日月曜日

Kinectを500円で買った

名古屋大須のジャンク屋をみていて、Kinectが500円で置かれているのに心ときめき、即座に購入した。

O'reillyの「Making Things See」をななめ読みして興味を持っていたのでこれはありがたいと、早速ソフトウェアを準備。

Macの場合、OpenKinectことlibfreenectを入れることになるようだ。そして、libusbにパッチを当てたものが必要とのこと。

しかし、Xcode 4.3を入れてしまったため、MacPortsが使えなくなっている(upgradeが通るものがないわけではないが、まっさらからでは何もできない)ため別の手段をとったのだが、いろいろと問題含みだった。なお、MacPortsでサーバにしているMac miniはXcode 4.2.1をDeveloperサイトから落として、バージョンを下げておいた(ただ、command line toolsが4.3なのでコンパイル時に怪しげな警告が出たりする)。

以下経過。

まず、開発マシンは/opt/local以下をすべて消してMacPortsを一掃し、Xcode 4.3でもよいというHomebrewに移行することにした。brewコマンドのだいたいの使い方を覚えて、wgetとかlvとかが手軽に入ることがわかったのだが、libfreenect/platform/osx/homebrew以下のformulaは依存関係が不足していてだめ。また、ゆうべあたりにautoconf, automake, libtoolがいっせいにバージョンアップしたせいか、これらを先に入れてもautogen.shのなかで落ちてしまう。ちなみにautogenが入らない件、tracはclosedになっているが全く解決していない。--use-llvmを追加してもだめ。

で、しかたがないのでReadme.asciidocにしたがって、手で該当バージョンのlibusbを落としてパッチを当てるのだが、やはりautoconf.shが通らない。いちかばちか、www.libusb.orgから最新の1.0.8のtarballをもってきて、パッチがrejectした部分を自己判断でなんとかした上で、configure; make installした。動くかどうかはつないでみないとわからない。

brewにおけるformulaの扱いがまだいまひとつわかっていないので、次はやむをえずlibfreenect全体をgit cloneして、cmakeをbrew installしたのち、cmake .; make installしておいた。

さて、あとはKinectをMacにつなぐだけだ... と思ったら、コネクタの形状が違う。USBなら4本のはずが、オスメス違うし、よく見ると9端子だ。で、ざっと検索したところ、Kinectは外部電源が必要で、ACアダプタとUSBに分岐するケーブルが別にあるということだった。普通に買えばセットになっているらしいが、古いXBox 360持ちで何らかの事情がある人はマイクロソフトから4000円弱払って買うらしい(本体のシリアル番号を言わないと売ってくれないらしい)。でもたぶん中古があるはずだと検索してみたところ、アマゾンと楽天で1980円プラス送料(480円)で新品を扱っているところが出てきた。ヤフオクも同じ値段。ではさっそくそのへんで...と思ったが、こういうときはeBayを見るのが鉄則である。すると、簡単に日本向けshipping $0.99で本体$7.99というのが出てきた。USからであることと、送料が安い(国際宅配便なら$40はかかる)ことを考えると、船便で1ヶ月弱の納期を考える必要があるが、急がないならかなりお得といえる。

だが、こんなものにお金を払う連中ばかりではないはず。たいていのゲーム周辺機器は事細かに解析されているものだ。というわけで、「Kinect USB adapter DIY」で検索すると、ちゃんと自作記事が出てきた。ありがたや。元記事はこちら。9pinのうち、5本を下にして、USBに対応する(配列は違う)のは下の右4本、左は上下が+12V(1A以上必要らしいので分配しているのだろう)、上の真ん中2本がGND、右上は未使用ということのようだ。あとは作るだけ。よかった。

なお、外部電源の件だが、Kinectは台座にモーターが入っていて回転する。また、カメラが可視光と赤外光の2つが入っているし、赤外光ライトもあるので、USBの5V最大500mAでは心もとないに違いない。モーターといえば、PlayStation 2のDual Shock 2も振動モーター回転のためには7〜9Vの別電源が必要だ。

2012年2月9日木曜日

MozcもGoogle Updateの対象になる

Googleが様々な手段でユーザのコンピュータ(及びスマホなど)の利用状況をデータとして収集していることが懸念されているわけですが、Webブラウザに関しては、Webkitエンジンの代表格であるGoogle Chromeを外して考えるわけにはいかなかったところを、ChromeのソースがChromiumという形でオープンソースになっていることから、懸念される情報収集及びその送信部分を取り除き、正しく動作するよう大量のコードを加えた「SRWare Iron」を使うことで、心配から逃れるすべがありました。

他によく使われているのはGoogle Earth、そして日本人は「Google日本語入力」を使っている人がたくさんいるのではないかと思います(僕もそのひとり)。

Google日本語入力は辞書の優秀さとサジェッション(候補表示)の巧みさから、商用のIMEを購入して、OSバンドルのIME(WindowsならMS IME、Macならことえり)の阿呆さ加減を克服するのをためらわせるほどの魅力があります。

ただ、もしGoogle日本語入力が入力内容をGoogleに送信していたら、と考えると、これは究極のキーロガー(キーボード入力を記録して第三者に送信するプログラム)ともいえることになってしまいます。

そこで、Google日本語入力のオープンソース版であるmozcはどうなのか、ということになるのですが、mozcはGoogle日本語入力で使われる辞書は使うことができないようになっており、かわりにIPA(情報処理推進機構)が作成し、公開している辞書を使うようになっています。ソースがすべて公開されていることから、キーロガー的ななにかや、使用状況をGoogleに送信していないかどうかなどを確かめることができます。

そこで、mozcのソースを、ごく簡単に、ざっくり見てみました。

すると、「omaha」という語を含むキーを作成したり登録したりする処理が最初に目につきました。これは、Windows用の部分では、レジストリをアクセスして、内容を確認したり登録したりします。そして、そのレジストリキーの名前が「Google\Update」なのです。

Google Updateといえば、Googleのソフトウェアを入れると必ず入るプログラムで、MacでもKeystoneという形でマシン起動時にデーモンとして起動しますし、Windowsでプロセスマネージャーを見ると、GoogleUpdate.exeというプロセスとして確認することができます。

ChromeやGoogle日本語入力は、特にアップデート作業をしなくても、「いつのまにか」最新版に更新されています。いままでこの理由を説明するサイトは見当たらなかったのですが、要するにつねにGoogleと通信して最新版かどうかを確認し、そうでなければダウンロードして勝手に最新版に置き換える挙動をGoogle Updateが実行しているのです。

問題は、このとき、コンピュータなりスマホなりに固有のIDを作成してGoogleに登録しておくという動作が含まれていることです。これによって、Google側ではソフトウェアの更新状況や利用状況を把握できるというわけです。それだけなら会社で共同で使っている人は気にしないかもしれませんが、Googleアカウントとひもづけられると、誰がどのソフトウェアをどのぐらい使っているかということが、個人の他の属性(氏名、居住地、その他GoogleアカウントやGoogle+などのプロフィールに登録した内容)と関連付けられてしまうということになります。ある意味、Googleへの忠誠度がはかられているといえるかもしれません。

そして、「omaha」ですが、これはGoogle Updateのオープンソース版だそうです。

Omaha - Project page

Googleによれば、Google Updateが不審なプログラムと捉えられることは望まないので、どのような挙動をし、どのような通信が行われているかを、その仕様と実際のプログラムを文書とソースコードとして公表した、ということなのだそうです。

結論からいうと、mozcにはOmahaが入っています。したがって、mozcをインストールしたことはGoogleが把握していますし、どのバージョンが使われているかをGoogleは知っています。どのマシンで使わているかもGoogleは知っています。もしかしたら、勝手に最新版に置き換えられているかもしれません。

Ironはドイツで作られ、メニュー等の表示の翻訳をどなたかが提供される形で日本語対応がなされていますが、mozcに関しては日本人自身があらゆる作業に取り組まなくてはいけません。Ironは単にコードを削っただけではなく、相当量のコードの追加が必要だったとフォーラムで開発者が明かしています。mozcはChromiumと比べれば非常に小さなコード量ですが、Chromium由来のソースがたくさん含まれています。オープンソースですから、派生プログラムを作成して公表することに法的な問題は全くありません。ソースコードには、Googleからの派生物であることを明示し、Googleがつけたクレジットさえ書き換えなければよいと書かれています。ライセンスはBSDですから、要するにas-isです。どなたか腕に覚えのある方、mozcをクリーンにするプロジェクトに取り組んでみませんか。

ffmpegとmplayerは自分でコンパイルしよう

MacPortsからffmpeg-develとmplayer-develを入れていても、なかなか更新はかからないのだけれど、実際には、少なくともffmpegは毎日膨大な変更が入っています。それも、とても基本的なところでの修正が多いのです。

だから、ffmpeg-user MLで「〜ができないんですが」的な質問をすると必ず「古すぎる。Git headを使え」という答えがつくことになっているのが実態。

というわけで、みなさんももしffmpegお使いなら、MacPortsはあてにせず、自分でgit headを入れるようにしましょう。

ライブラリまで自分で管理するのは面倒なので、いったんport install ffmpeg-develして、依存関係にあるライブラリはすべて自動で入れてしまいます。そのあと、port uninstall ffmpeg-develしてしまいます。あと、x264もMacPortsで入るバージョンは古い(最新が12に対して10)ので、こちらは上書きインストールすることにします(他で依存関係があって、uninstallするとせっかく入れたものが古いものに上書きされてしまうから)。

まず、x264の最新版を上書きインストールしましょう。ソースはgitで入手します(port install gitしておいてくださいね)。適当なディレクトリを作って(僕は/var/srcというのを作りました)、その下にいろいろ置くことにします。
# git clone git://git.videolan.org/x264.git
# cd x264
# ./configure --prefix=/opt/local --enable-shared
# make install distclean
これで入ります。最新版にするには、
# cd /var/src/x264
# git pull
でできます。そしたら、またconfigure以後の作業をして置き換えます。更新頻度は毎日ではありませんが、最低でも月に2度ぐらいはあるような感じがします。

ffmpegは、なんか開発グループが分裂して、一方はlibavを名乗るようになってしまいました。ffmpeg.orgにどちらのリポジトリも掲載されているので、好きな方を使ってください。僕は本家を入れています。
# cd /var/src
# git clone git://source.ffmpeg.org/ffmpeg.git
これでソースが手に入りました。次にconfigureするわけですが、オプションの指定が必要です。最低でもどれだけ必要かは、

/opt/local/var/macports/sources/rsync.macports.org/release/ports/multimedia/ffmpeg-devel/Portfile

に書いてあります。

まぁ、
configure.args \
        --enable-gpl \
        --enable-postproc \
        --enable-swscale --enable-avfilter \
        --enable-libmp3lame \
        --enable-libvorbis \
        --enable-libtheora \
        --enable-libdirac --enable-libschroedinger \
        --enable-libopenjpeg \
        --enable-libmodplug \
        --enable-libxvid \
        --enable-libx264 \
        --enable-libvpx \
        --enable-libspeex \
        --mandir=${prefix}/share/man \
        --enable-shared --enable-pthreads \
        --cc=${configure.cc}
こんなことが書いてあるので、そのままパクることにします。で、最後のccですが、Xcode 3.6の人は無視、Xcode 4以上の人はclangを指定します。

毎回手で入れるのは面倒なので、shell scriptにしておくといいでしょう。
#!/bin/sh
./configure --prefix=/opt/local --enable-gpl --enable-postproc --enable-swscale \
                      --enable-avfilter --enable-libmp3lame --enable-libvorbis \
                      --enable-libtheora --enable-libdirac --enable-libschroedinger \
                      --enable-libopenjpeg --enable-libmodplug --enable-libxvid \
                      --enable-libx264 --enable-libvpx --enable-libspeex \
                      --mandir=/opt/local/share/man --enable-shared --enable-pthreads \
                      --extra-ldflags="-L/opt/local/lib" --extra-cflags="-I/opt/local/include" \
                      --enable-version3 --arch=x86_64 --cpu=x86_64 --cc=clang
こんな感じでしょうかねぇ。

もし、MP4ファイルを作る人で、音声のAACをffmpeg内蔵の実験コードではなく、実績のあるlibfaacを使いたい人は、
# port install faac
しておき、configureのオプションに--enable-libfaacを入れてください。AAC HEをやりたい物好きな人は、最近ffmpegにも実験コードが入りましたが、以下
http://tipok.org.ua/ru/node/17
に、libaacplusのソースが置かれているので、適当にダウンロードして/opt/local以下にインストールし、configureのオプションに--enable-libaacplusつければ入ります。

ただ、優先順位としては、高い順に
  1. libaacplus
  2. ffmpeg実験コード
  3. libaac
になっているので、libaacを使いたい方、libaacplus入れたけど普通のAACを作りたい方は、ffmpegのオプションでaudio codecの設定が必要になります。libaacなら、-c:a libaac、libaacplusを入れてしまって内蔵の実験コードを選択したい方は、-strict experimental -c:a aacと指定することになります。

ffmpegのビルドとインストールも簡単で、configureのshell scriptを実行したあと、
# make install distclean
これだけです。

さて、次はmplayerなんですが、mplayer単体で動画を見る人もいるかもしれませんが、それならffplay使う手もあるし、どちらかというと、mencoderを使うために入れるのが普通だと思います。で、MacPortsのmplayer-develは現在、mplayerのsvnリポジトリとffmpegのgitリポジトリから最新版をもってくるようになっています。なので、port selfupdateしたあとport list outdatedしてmplayer-develの最新版が表示されないとしても、使うたびに再インストールする価値はあります。というわけで、
# port -f uninstall mplayer-devel
# port -f install mplayer-devel
するだけで、いつでも最新版に置き換えることができるわけです。画質は明らかに向上しますし、多くの場合処理速度も単調増加するので、最新版を維持する価値はあります。

ffmpegにせよmencoderにせよ、地デジ程度の解像度、特にアニメなんかの場合は20fps超えることもざらにあります。瞬間最高速度では60fps程度になることもしばしばです。

動画や音声のトランスコードをする人にffmpegは必須だと思いますし、何らかの形で生TSファイルを扱う人で、画と音がずれない方法を探している人には、いったんmencoderでAVI(なかみはMPEG4 simple profile)に変換することをおすすめします。このあたりはまた後日、機会があったら書いてみたいと思います。