Vagrant で Mozc for Android を作る
tl; dr: Vagrant 便利ですね。
先日、Google 日本語入力の Android 版のソースコードが Mozc プロジェクトで公開されました。いろいろ不満の多い Android の日本語入力環境で、オープンソースで慣れ親しみのあるプロジェクトでソースコードが公開1されることでにわかに良さげなハックが生まれる機運があります。
以前より Mozc にパッチを当てやすいように Github にミラーしていたのですが、今回もちゃんと追従したので、さて Android 向けにビルドしてみるかと思った次第です。しかし公開されたドキュメントには非情にも
開発環境
Ubuntu 12.04 で開発できることを確認しています。今のところ、Mac、Windows での開発には対応しておりません。
との記載が。あえてイバラの道になるだろう、Mac OS X でビルドできるようにするという選択肢はあるにせよひとまずは推奨環境でビルドしようと VMware の Ubuntu 12.04 環境を用意したり頑張ったのですが2如何せん面倒すぎる上に入れるべきパッケージが多くてこれはかなりビルドが大変になったと言わざるを得ない状況でした。
そこで今回は簡単に Mozc for Android を作ることのできる環境を作ってみようと思います。実際のスクリプトなどは Github の Mozc のミラー においてあります。
Vagrant って流行ってるらしいよ

最近この界隈でやたらと Vagrant についての話題が上がっていて、インストールだけはしていたのだけどマジメに使ってなかったのですが、まさに今回の問題解決向けではないかということで真面目に使ってみました。
Vagrant は仮想マシン(や、AWS のインスタンス)のフロントエンドとして動き、開発環境の構築とアクセスを自動化してくれるアプリケーションです。裏側の仮想マシン相当の環境は Provider と呼ばれており、デフォルトは VirtualBox を利用して、有償で VMware にも対応しています。
使い方はかなり簡単で、Vagrant のサイトにわずか3行の Getting Started があるとおり、任意のプロジェクトのディレクトリでそれらのコマンドを発行すれば確かに仮想マシンが動いてSSHとかが提供されます。
$ vagrant box add base http://files.vagrantup.com/lucid32.box
$ vagrant init
$ vagrant up
vagrant init で Vagrantfile が作成され、.vagrant にインスタンスの設定が保持されます。
プロジェクトのディレクトリは /vagrant にマウントされます。
$ vagrant ssh
% mount
...
vagrant-root on /vagrant type vboxsf (uid=1000,gid=1000,rw)
...
作られる仮想マシンの実態は VirtualBox の場合、Virtual Box の 仮想マシン保存先(デフォルトでは ~/VirtualBox VMs かな)に作成されます。
環境設定を自動化する Puppet とか Chef とか
Vagrant が使う Vagrantfile には仮想マシンの設定を記述できますが、仮想マシン内部の環境設定、例えばどのパッケージを入れるかとか /etc をどうするかとかの、環境の恒常性の維持には別途 Provisioning ツールを使います。 Vagrant は業界のデファクトらしい Puppet とか Chef に対応していて、 vagrant up した時や vagrant provision することで恒常性を維持してくれます。
Puppet や Chef にはひょっとしたら馴染みがないかもしれないのですが、大規模なホストの恒常性の維持に平日の業務では使っていて Ops の人たちとの会話はこれらのツールむけのスクリプトで行われると言っても過言ではなかったりします。
これらのツールの目的はホストのリソース(ファイルとかパッケージとか)を自動である状態に保つことにありますが、仮想環境の初期設定などでも力を発揮するわけですね。
Mozc for Android の開発環境を整える
最近はいろんな日本語ブログで Chef については良く見ると思いますので、ここではあまり話題になっていない、でも使ったことのある Puppet を使ってみようかと思います。
Puppet は大規模化する際には Module を定義しまくって、独自のヘンテコDSLでマジカルに記述できるのですが、そこまで正規化する必要もないので一つの Manifest で済ませます。Vagrant はデフォルトで Puppet の Manifest がある場所を指定すると、default.ppをエントリポイントとして使いますのでこのファイルにいろいろ書いていきます。
Vagrant.configure("2") do |config|
...
# Varantfile の中でこう書くと、./manifests/default.pp が使われる
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
end
...
end
Mozc for Android のビルドにはいくつかのパッケージ(GCCとか)と、Android SDK 及び Android NDK が必要です。この Android 向けのツールが曲者で、OSのパッケージ管理の外にあって、Google から tar.gz や zip で公開されているので手動で取得してくる必要があります。
さらに、Android SDK は SDK 自体にパッケージ管理機能があるのでさらに複雑なことになります。主要な部分を抜粋して書くとこんな感じ。
# インストール先を準備
file {
"/opt/android":
ensure => directory,
owner => "vagrant",
group => "vagrant",
mode => 0755;
}
exec {
# Android SDK の tar.gz をダウンロードして展開する
"download android-sdk":
command => "/usr/bin/curl 'http://dl.google.com/android/android-sdk_r21.1-linux.tgz' | /bin/tar -x -z -C /opt/android",
# 展開すると android-sdk-linux ができるから、これがあったら実行しない
creates => "/opt/android/android-sdk-linux",
user => "vagrant",
require => [
Package["curl"],
File["/opt/android"]
];
# Android SDK を最新の状態にする
"update android-sdk":
# android コマンドを -u で GUI なしで実行
# -t でアップデートするパッケージを限定。
# エミュレータを動かす必要がないというのと、 android コマンドのバグで
# system-image は取得済みでも毎回更新してしまうので除外。
command => "/opt/android/android-sdk-linux/tools/android update sdk -u -t platform,tool,platform-tool,extra-android-support",
user => "vagrant",
# すげー時間がかかるのでタイムアウトしないようにする
timeout => 0,
require => [
Package["default-jdk"],
Exec["download android-sdk"]
];
}
このような Puppet の Manifest と、 Vagrant の設定を用意しておくと、あら不思議。 プロジェクトのレポジトリを Github から Clone して vagrant up するだけで 30 分くらいでビルド環境ができてしまいます。
開発環境ができたあとは
Mozc for Android のビルド手順にしたがってビルドしていけば問題ないのですが、面倒なのでスクリプトを書きました。
sh build_android.sh
を実行して 30 分くらいで apk が出来上がります。-f をつけると全消しして最初からやりなおしてくれます。

以上で簡単に Mozc for Android をつくって遊ぶ環境が整ったので、Fork してパッチを書いて真っ白なキーボードに文字を置いたりして遊びましょう!
あわせて買いたい
-
Mozc は現状、通常のオープンソースとは言いがたい状況です。あくまでもソース公開であって、コントリビュートは出来ない状態なのです。 ↩
-
途中で
/の空き容量がなくなって大変なことになりました。 ↩
ウィンドウ整理に Slate が便利
Mac を使っていてウィンドウが揃わなかったり、最大化するのに緑の小さいボタンを押さないとダメだったりイラっとしたことありませんか?

これまではその小さなフラストレーションをなくすためにグローバルショートカットで Shift + ⌘ + m を Zoom に割り当てていました。

しかし、最近、この影響 Zoom コマンドをメニューに持たない困ったアプリがあって、バグ報告はしたのですがすぐになおる気配がありません。
そこで以下のウィンドウサイズ変更・整列ツールを試したのですがどれも優れているのですが今ひとつという感じでした。
- DIVVY - アイコンは可愛いんだけど、グローバルショートカットの割り当ててが残念。マウス操作を期待してる。
- SizeUp - アイコンも綺麗だしいい感じなんだけど、$13 っていうのにちょっと抵抗が…
そこでいろいろ調べたところ、Slate というオープンソースのツールが便利そうなので使ってみました。
インストール
ドキュメントにある dmg へのリンクからダウンロードして Applications にインストールするか、 Xcode でビルドしてください。
設定
Slate の特徴に、このような事が書かれています。
it attempts to overcome them by simply being extremely configurable.
そう、この Slate はエクストリームに設定可能なアプリなのですが、かなりエクストリームなので最初は戸惑うと思います。まず設定画面というものがなく、初回起動時に、~/.slate がないからデフォルト値を使うよ、と言ってくるとおり、設定はすべて ~/.slate あるいは、~/.slate.js という JavaScript で書く設定ファイルを使います。
現状、JavaScript を使った設定ファイルはあまりにエクストリームなので今のところ普通の設定ファイルを使っています。こんな感じ。
config defaultToCurrentScreen true
config nudgePercentOf screenSize
config resizePercentOf screenSize
# Push Bindings
bind right:ctrl;cmd push right bar-resize:screenSizeX/2
bind left:ctrl;cmd push left bar-resize:screenSizeX/2
bind up:ctrl;cmd move screenSizeX/4;0 screenSizeX/2;screenSizeY
bind down:ctrl;cmd push down bar-resize:screenSizeY
# Nudge Bindings
bind right:alt;cmd nudge +10% +0
bind left:alt;cmd nudge -10% +0
bind up:alt;cmd nudge +0 -10%
bind down:alt;cmd nudge +0 +10%
# Throw Bindings
bind right:ctrl;alt;cmd throw right
bind left:ctrl;alt;cmd throw left
bind up:ctrl;alt;cmd throw up
bind down:ctrl;alt;cmd throw down
見ればなんとなくどんな設定かわかると思うのですが、たとえば、Push Bindingsでは、 Ctrl + ⌘ + → で現在のスクリーンの設定ファイル右半分を占有するように移動とサイズ変更をします。Ctrl + ⌘ + ↑ では画面中央に全体の半分の幅で縦最大になるように移動とサイズ変更します。
このような設定を ~/.slate に保存して Slate を起動して使います。設定を書き換えたらメニューから Relaunch and Load Config で再読み込みします。

あわせて買いたい
iOS 6 の Guided Access (アクセス付きガイド) が恐ろしい件について
iOS 6 には Guided Access (日本語では「アクセス付きガイド」)という機能が装備されているのですが、理解せずに使うと恐ろしいモードだとわかったのでメモしておきます。
Guided Access とは
展示などで iPad や iPhone、iPod touch を使うときに特定のアプリから抜け出させたくない時がありますよね。あるいは誰かに iPhone を貸すときに特定のアプリ以外を触られたくない時とか。 そんな時にホームボタンやスリープボタン、タッチ可能範囲などを制限することができるのが Guided Access です。
使い方
Settings の General にある Accessibility の Guided Access を ON にすることでこのモードが有効になります。

ここで有効にしたあとに、任意のアプリを起動してホームボタンを3連打して Start するとそのアプリ以外にアクセスさせないように出来ます。

たとえば、ここで Start すると iPhone が普通の電卓になります。 Start する際に解除するためのパスコードを聞いてくるのでそれを覚えておきます。
このモードから抜けるには再びホームボタンを3連打して設定したパスコードを入れると抜け出すことができます。
Settings.app を Guided Access の対象にすると奇妙なことが起こる
で、この挙動知らずに Settings.app でホームボタンを3連打して Guided Access を Start してしまったとしましょう。

すると奇妙なことが起きます。このように、ホームボタンを押すと、Guided Access 中だよー、と表示されるのですが、

そもそも、その Guided Access を ON/OFF にすることが、 Guided Access 中にできるのです。
で、どうもこれはバグっぽいのですが、Settings.app で Guided Access 中に Guided Access を OFF にすると、ホームボタンを3連打をしても抜け出すことができなくなり、再び Guided Access を ON にすると設定したパスコードを受け付けなくなって、というかどんなパスコードも受け付けなくなって、詰んだ状態になるようです。 \(^o^)/
しかも一回パスワードを間違えるごとに再チャレンできるまでの時間が伸びるのでかなり焦ることになります。

予想なのですが、Guided Access を OFF にしたときにパスコードも消えてしまい、でも Guided Access 中なのでそこから抜け出せなくなっているように見えます。
抜け出し方
で、抜け出し方なのですが、Guided Access を ON に戻すと表示される Set Passcode ボタンでパスコードを再設定すれば、ホームボタンを3連打してその設定したパスコードを入れて抜け出せるようです。
しかしこれ、かなり危険です。落ち着いて考えて抜け出せましたが知らないとレストア以外に抜け出す方法が無さそうです。
ちなみにググると Find My iPhone を使って抜け出す方法もありますが、そちらもかなりバグっぽい感じなので将来塞がれるような気もします。
最後に
良い子のみんなは 絶対に友達の iPhone とかでイタズラしないでね!
あわせて買いたい
iPad だけで書いたブログ
休日にどこかのカフェで iPad だけでブログを書いてアフィリエイト生活みたいなのに憧れてこのエントリーは休日にカフェで iPad だけで書かれたエントリーです。

使った環境
- iPad
- iPad 用の Bluetooth 接続のキーボード
- San Francisco の HAUS カフェのパティオ
- Google Chrome
- Tumblr
- Textastic
感想
結構、問題なく書けるもんだなーとは思ったけれど、やっぱりリンクを探したりしている間に Tumblr を開いてるタブがメモリから消えて再読込されてしまって残念でした。 途中から Textastic.app で書くように変えてからはその心配もなくなりましたが、いくつかどうにもならない問題も。
iPad のキーボードを使った時の変換がキモい
これはしょうがない気もしますが、基本予測変換なので、若干通常のIMEと異なる挙動で、デスクトップで慣れた入力方法を若干違うのが気になりました。
エスケープキーがない
iPad キーボードのエスケープキーの位置にはホームボタンがあって、つい押してしまうので大変です。けして Vim を使っているから問題になっているわけではないと思います。jjjkkk
日光が強くてよく見えない
このエントリはパティオ席で書いたのですが、日差しが強すぎて目が痛くなる感じでした。特に iPad が白いと反射がキツイです。
そんなわけで
細かな問題もありますが、思ったより書けるので、是非このページのリンクから iPad キーボードとか iPad とか買ってください!!!
後日の補足
@drikin さんの Drift Writer を使うと Amazon リンクが貼りやすくなるとかいろいろ改善するような気がしました。
Markdown エディタとしては Textastic のほうが優れているので悩ましいところです。 いいところ取りするには iOS の制約が厳しいですね…
あわせて買いたい
Ruby 2.0.0-p0 を Rubies で管理
Ruby 2.0.0-p0 が出ましたね (∩´∀`)∩ワーイ
皆さん早速ダウンロードしてインストールを始めようとしていると思いますが、ひょっとして変なツールを使ってインストールして環境がよくわからない状態になったりしていませんか?
そう、世の中の変なツールは大抵いきなりファイルを消したり、意図しない挙動をしたりして驚き最大の法則で実装されているので困ります。だからやっぱり変なツールやインストーラーを使う前にはどんな挙動をするのかソースを読んでおきたいですが、大抵変なソースだったりしてびっくりします。
そこで rubies の登場です!
rubies はほとんど ruby で書かれた ruby の環境切り替えツールで、それ以上でもそれ以下でもありません。変な機能はないし、変なこともしません。なによりソースが100行もない ruby のコードなので簡単に読めます。
是非この機会に使ってみましょう!
詳しい使い方はこちらになります。