2012/11/30

XBMC for Androidをビルドする

ため込んだ録画ファイルやNAS上のホームビデオをただ見れればよいではなく快適な操作で快適に視聴する環境であって欲しい。そんな環境が作れないかと日々模索しているところですが、そんな中、
例のXBMCがAndroid単体で動くらしいと知りました。よくあるリモートアプリではなくて本体です。
別にメディアサーバーを稼働させることなく、Android側で動くなら試したいことが沢山あるんです。

XBMC for Androidはどこ?
今はベータバージョンらしく、ソース一式はGITHUBにありますが、GooglePlayにはまだないようです。
なのでソースを入手してビルドするっていうのが正当な手段ということになります。

ビルド済みAPKをダウンロードする

XBMC_for_Android_specific_FAQ によると、オフィシャルではないけど、以下が紹介されています。
実際、code.google.comから入手するのが一番楽ちんだと思います。かなり頻繁にビルドアップデートされてます。
full-neonバージョンの方をmk808にいれて、問題なく動作しました。

使い勝手についてはまた今度
今回は自分でビルドすることがテーマです
ソースからビルドする

数か月前まではAndroid用リポジトリとして分かれていたようですが、現在はメインリポジトリにマージされています。
ビルド手順も丁寧だったので、やってみました。今回はこのビルド手順についてです。
ビルド環境はUbuntuが想定されています。ちょうど地デジ録画システムはUbuntuなので、そこでやってみましたが、あまり考えずにやったため、苦労してしまいました。

結論から言うと、ubuntuはubuntuでも64bit版ではなく、32bit版でビルドする事をお勧めします。


まずは、README.Androidに記載されている手順をつらつらと書いておきます。

ビルドツールインストール
$ sudo apt-get install build-essential default-jdk git curl autoconf unzip zip zlib1g-dev gawk gperf cmake

Android SDK・NDKダウンロード
$ wget http://dl.google.com/android/android-sdk_r21-linux.tgz
$ wget http://www.crystax.net/en/download/android-ndk-r7-crystax-5.beta2-linux-x86.tar.bz2

展開
$ tar zxf android-sdk_r21-linux.tgz
$ tar jxf android-ndk-r7-crystax-5.beta2-linux-x86.tar.bz2

アップデート
$ cd android-sdk-linux/tools
$ ./android update sdk -u -t platform,platform-tool
本家のNDKではなくcrystaxの方を使用します。文字コードの問題のようです。なので現状、NDKとしてのプラットフォームはAPI-14までのようです。

toolchain作成
$ cd android-ndk-r7-crystax-5.beta2/build/tools
$ ./make-standalone-toolchain.sh --ndk-dir=../../ --install-dir=$HOME/android-toolchain/android-14 --platform=android-14

Android 4.0(api14)以上を推奨しているようです。2.3(api9)でも動くようですけど。

鍵(証明書)ファイル作成
keytool -genkey -keystore ~/.android/debug.keystore -v -alias androiddebugkey -dname "CN=Android Debug,O=Android,C=US" -keypass android -storepass android -keyalg RSA -keysize 2048 -validity 10000
最後のビルドでこのファイルを使うようになっているので、この通りにやります。

XBMCソースダウンロード
git clone git://github.com/xbmc/xbmc.git xbmc-android
$ cd xbmc-android
$ git submodule update --init addons/skin.touched

XBMCコンフィグ
$ cd xbmc-android/tools/android/depends/
$ ./bootstrap
$ ./configure --with-sdk=$HOME/android-sdk-linux --with-ndk=$HOME/android-ndk-r7-crystax-5.beta2 --with-tarballs=$HOME/android-tarballs --with-toolchain=$HOME/android-toolchain/android-14

通ったらAndroid用ライブラリとかビルド
$ make -j20
数字はどんだけ並列処理するかという設定。READMEには「make -j20ってやっちゃえよ。平気だよ」と書いてありますが、非力なCPU/小メモリの場合は8以下位にした方が無難かも。一番無難なのはただmakeってやることでしょう。
最後に「Dependencies built successfully.」って出れば正常終了です。

XBMC for Androidのビルド
$ cd xbmc-android
$ make -C tools/android/depends/xbmc
問題なくこのビルドが終了すると、めでたく「 xbmc-android/xbmcapp-armeabi-v7a-debug.apk 」
というAndroidへインストール可能なapkファイルが出来上がります。


ビルド専用VMを作る

お勧めは、Oracle Virtual BoxとかでVMを作って、Ubuntu server 32bit版を入れて、ビルド環境を作るのがいいでしょう。後は、xbmc-android/docs/Android.README通りに実行することで難なくビルド出来るでしょう。
Oracle VirtualBox Download
Ubuntu Server Download (12.10は64bitしかないので、12.04 LTSの32bit版になりますね) 

VMスペックとしては、メモリ1GB、HDD16GB程度あればビルド環境としては大丈夫でしょう。


Ubuntu 64bitでビルドする(むりやり)

私が最初にやったことです。失敗も混ぜながら手順をつらつらと書いておきます。

32ビットライブラリインストール
64bitOSならばia32-libsをインストールせよとなってますが、Ubuntu-11.04の頃の話なのでしょう。
12.04だと
以下のパッケージには満たせない依存関係があります:
ia32-libs : 依存: ia32-libs-multiarch
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
というメッセージが出てインストールできませんでした。

ia32-libsの代わりに32bitライブラリを直接インストールしました。
$ sudo apt-get install libc6:i386 libstdc++6:i386
そして
$ make -j20

makeしたときに、32ビット版ライブラリが揃ってないと意味分からないエラーが色々出る
checking for -gcc... no
configure: WARNING: host was not specified. guessing.
checking for gcc... /home/nishiura/android/toolchain/android-14/arm-linux-androideabi/bin/gcc
configure: error: unsupported host ()
とか。gccあるのに何で動かないんだ?なんて、長い時間悩んでしまいました。

エラーが起きている箇所の一つ
xbmc-android/tools/android/depends/ncurses/armeabi-v7a/config.log
を見てみると
checking whether the C++ compiler works... no
configure: error: in `$HOME/xbmc-android':
configure: error: C++ compiler cannot create executables
See `config.log' for more details
make: *** [../../../..//libxbmc.so] エラー 7
というエラーが。

結局最初に入れたzlib1g-devの32bit版が必要だったようで
$ sudo apt-get install zlib1g-dev:i386
で入れました。が、入れる時に以下のような大惨事に。

@パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libboost-filesystem1.46.1 libtorque2 libboost-date-time1.48-dev libboost-filesystem1.48.0
〜中省略〜
mpi-default-dev openmpi-common libboost-regex1.48.0 libboost-random1.48.0
libstdc++6-4.4-dev
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
libc6-dev:i386 linux-libc-dev:i386 zlib1g:i386
提案パッケージ:
glibc-doc:i386 manpages-dev:i386
推奨パッケージ:
gcc:i386 c-compiler:i386
以下のパッケージは「削除」されます:
build-essential cpp dpkg-dev g++ gcc gccxml grive libboost-python1.48-dev
libboost1.48-all-dev libtool pentium-builder
以下のパッケージが新たにインストールされます:
libc6-dev:i386 linux-libc-dev:i386 zlib1g:i386 zlib1g-dev:i386
アップグレード: 0 個、新規インストール: 4 個、削除: 11 個、保留: 0 個。
6,180 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,524 kB のディスク容量が消費されます。
続行しますか [Y/n]?@
だって!パッケージマネージャの不具合なんじゃないだろうか・・・入れました!
そしたら、64ビット版のビルドツールが予告通り全部吹っ飛んでしまった!

何もできなくなったので、
$ sudo apt-get install build-essential
で再度インストール。zlib1g-dev:i386は削除されず残るみたい。pentium-builderだとだめみたい。
libncursesもないとだめらしい
$ sudo apt-get install libncurses5
更にこけたときに追加したもの
$ sudo apt-get install libboost-dev

原因を解消して再実行する際は、
$ make distclean
とかできれいにしてから再実行した方がいいようです。

途中こけたときに追加したもの(VM上でのUbuntu(32bit)上では不要だったんですが・・)
$ sudo apt-get install swig

$ make -C tools/android/depends/xbmc のところで
configure: error: C++ compiler cannot create executables
こんなエラーが出たとすると、たぶんxbmc-android/tools/android/dependsでのmakeも失敗していると思われます。
もう一度コンフィグあたりから見直してみましょう。

そんなこんなで何とか64bit環境でもビルドしてAPKファイルを作ることが出来ました。
もう2度とやりませんけど。


おまけ話
今後XBMC for Androidの開発が進むにつれて毎度ビルドに苦労しないためにビルド専用VMを作っておくのはいい方法ではないかと思います。自分はそうしようと思います。
また、XBMCを動かすAndroid端末自体もサーバーになりうるのでネットワークを固定IPにしました。

VMのコンソールで作業するのは辛いです。VMのネットワークをブリッジにして通常のLANの仲間入りをさせます。
ubuntuにはsshを入れて、sshdを動かしておきます。そして愛用のemacsもインストールします。
後は外部のsshターミナルからアクセスして作業する方が快適環境になります。
日本語がちゃんと出る。シェルウインドウサイズを自由に出来る(有料版だと出来そうだけど)。
これだけでもそうやる価値あると思います。

Androidにインストールして起動
起動させると、最初ちょっと待ってからXBMCのロゴが表示されて立ち上がりました。
MK802で動かしたら、パフォーマンスが25fps程度でもたつき感がありましたが、MK808では、60fps出てます。
XBMCから様々な方法(プロトコル)でメディアサーバーへアクセスが出来るので何でもありな感じです。操作感もサクサクでいい感じです。もっともっさりするかと思いました。

とにかく、外部キーボードで完全コントロールできるのがいいです。


課題のビデオリストですが、素の状態だとビデオファイル名がつらつらと並ぶだけなので他のメディアアプリ同様つまらないですが、ここからがXBMCのいいところで、nfoファイルっていうのを用意してあげると読んでくれてタイトルや概要、ジャンルとか設定できるらしいのです。

XBMC使う理由が出来たので、これから勉強です。
このあたりの機能に期待しています。希望通りに出来るかなぁ。

2012/11/23

MediaサーバーとMK808と外部キーボード(R600)


え~すでに価値のある情報ではありませんが、次のステップへの過程という意味で少し。

今MK808でビデオを視聴する環境整備に取り組んでおりますが、まずはUPnP/DLNAとかを考えるのが普通かなと思うので、一般に利用されているメジャーどころをやってみました。

自作地デジ録画サーバー上のビデオファイルをhtml5-videoとしてAndroidブラウザで視聴することはできますが、前記事のように思った結果にはなりませんでした。
今度はメディアサーバー(UPnP/DLNA)を稼働させて、Android(mk808)でメディアクライアントアプリで視聴する手段でやってみます。(結果は見えていたんですが・・・それは後で)

録画サーバー(Ubuntu)で稼働させるメディアサーバー
メジャーどころは、こんなところでしょうか。この中でUbuntuServerに入れられそうなのは、
MediaTomb、TVMOBiLi、uShare ですかね。これ以外は、デスクトップ(GNOME)環境が必要だったりでだめです。XBMCが動けば一番いいなぁと思ってますが、クライアント機能もあり、ディスプレイが必要なので断念。

やはり、お手軽なのは、MediaTomb ですかね。
セットアップについてはこちらで十分なので割愛します。
ビデオファイル保存フォルダをMediaTombにコンテンツ登録してサーバー側終了。

MK808用外部キーボード「Rii mini R600」購入

前記事で購入したキーボード(iPazzPort Mini)は個体差かもしれませんが、無線の有効距離がかなり短かったため、似たような別製品を購入しました。妻には「なぜ同じものを・・?」と呆れぎみ。
しかしその甲斐あってか、かなり離れても安定したマウス操作とキー入力が出来ました。

これもAirMouseなので傾けてマウス操作しますが、片手持ち(縦)のみです。iPazzPortは両手持ち(横)と切り替えが出来るので機能的には劣りますが、その代りクリックボタンだけが大きくなっていてマウス操作だけ評価すれば使いやすいと言えます。
キー入力はチャタリングもほとんどなく無線も安定しているので安心して打てました。キーの大きさも微妙ですが大きめなのでタイプミスも減るかと思われます。

リビングでソファーにねっころがって操作したいという要望にはこのコントローラで良さそうです。

視聴アプリ(UPnP/DLNAクライアント)

TVに繋いだMK808上で動かす視聴アプリを探すと沢山ありますね。
試したのは、BubbleUPnP、UPnPlay、および勝手に入っていたeHomeMediaCenterです。
どれでも普通にMediaTombからの再生は出来ました。しかし、出来ましたってレベルです。
結局だたのファイルリストから選んで再生ってだけなので、どれがどの番組なのかさっぱりです。

しかも、キーボード操作ではほとんど何もできない。AirMouseでの操作は結構つらいです。

Redmineで構築した視聴システムへブラウザからアクセスしてタイトルや内容、日時とかが分かって、番組検索が出来て、クリックしたら再生っていう流れとは大違いです。分かってはいますがね。

Androidがリブートする

これは大問題なんですが、ファームアップデートしたためなのか原因は不明ですがビデオ再生してからホームボタンクリックとかでアプリを終わらせるとAndroidがリブートしてしまうんです。
どの視聴アプリを使っても同じ現象でした。

視聴環境として選択肢がこれしかないなら、またOS周りの調査から取り組まないとならないでしょうけど、別手段を考えているので、今回の取り組みはこういう結果になったというところまでで手じまいです。

以下、個人的将来展望

やはり、ちゃんと日本語で番組名・内容・録画時間とかがちゃんとサムネイルとともにリスト表示されるようになって、再生はマウス操作なしでキーボード操作だけでコントロールできる環境が欲しいです。

タッチ操作で使いやすくという方向のアプリが主流な中でキーボードで使いやすくという方向のものは要望としては逆行しているんでしょう。でもいずれ来るであろうスマートTV時代でもタッチコントローラより従来通りのキーコントローラの方が受け入れられると思うんですよね。

それが既存ソフトの組み合わせで出来るならそれが一番です。まずはそういった模索をして、なさそうなら視聴アプリ作りますかね。

2012/11/17

MK808でadbが出来るまでの長い道のり

前回記事で書いた通り、MK808で色々遊んでみようと思い、いつも通りデスクトップにUSB接続して、自作アプリをインストールテストしようと思っていたんです。ところがどっこい、長い道のりでした。

まず、adbとは、Android Debug Bridgeという開発用便利ツールでして、Androidに色々アプリを入れなくてもPCからリモートで色んな操作が出来ます。adbはUSBまたはネットワーク越しでリモート操作が出来ます。
このUSBで接続ってところの話です。Android端末は数種類扱ってますが、今回は苦労しました。

ドライバセットアップ

Macだとこんなことしないでいいんですが、Windowsだと普通にUSB接続してもドライバがないと言われるんで、ハイハイってことで色々やります。まずは、Android SDKをダウンロードします。その中に、google-usb_driverというフォルダがあります。これを入れてやれば通常動きます。

が、このドライバのinfファイルにはNexus用の記述しか書かれていません。なので自分のMK808でインスール出来るように、android_winusb.infというドライバ記述ファイルに、以下のように書き加えます。
[Google.NTamd64]
;MK808
%SingleAdbInterface%     = USB_Install, USB\VID_2207&PID_0006&REV_0222
%CompositeAdbInterface%  = USB_Install, USB\VID_2207&PID_0006
USB_Install, 以降のコードは、デバイスマネージャで不明なデバイスとして認識されているデバイスのプロパティの詳細タブからプロパティ=デバイスIDを選ぶと表示される文字列です。
自分のWindowsは64Bitなのでamd64側にだけ書き加えました。

で、ドライバの更新でこのドライバフォルダを指定してやればインストールされます。
コンソールから
$ adb kill-server
$ adb usb
$ adb devices
ってやれば大体どんなAndroidでも接続できるもんです。もんです。あれ?
端末の方では、「USBデバッグが接続されました」と「USB接続」がちゃんと出ている。USBストレージをONにしてみる。ふむ。ちゃんとデスクトップでストレージマウント出来る。

adbだけが出来ない

マックでやってみた。同じ状態・・・
セルフパワーUSBハブかましてみた。駄目だった・・・
OTG側と電源用USBのさす順番変えたり、どっちかだけにしたり。変わらず・・・
ネット上探しても同じ状況の書き込みは見当たらない。微妙な不良品をゲットしてしまったか。

apk入れるだけなら別手段は色々ある。がっつり開発用ではないし。

microSD経由で入れる。
AirDroidとかサーバークライアント系のアプリ使って入れる。
Webサーバー上に置いておいてダウンロードして入れる。

とまあどんな方法でも入れることは出来るんで割り切ってもよかったんですが、心残りが出来るのも事実。次の手を考えます。

adb tcpip でいいか

冷静に考えれば、この端末はリビングTVに繋いで使うつもりなので、そもそもUSBでPCに接続するシチュエーションはめったにない。Wifi通して操作する方が合っています。

普通、Wifi経由のadbは以下の手順でできます。
  1. 一度USB接続して認識させる
  2. $ adb tcpip 5555 ってやってadbをusbからtcpipに切り替える。ポートも指定する。
  3. USBを抜く
  4. $ adb connect {device-ip-addr} ってやる。接続される。
Android側にadb-wifi切り替えアプリとか入れずとも、こんな感じでできますね。接続が切れてたら4だけやれば再接続されます。駄目だったら1からやり直します。

よく、adb connect {ip-addr}:5555ってやれって書いてあるけど、本当ですかね。
:5555:5555ってなって、失敗しますよね。:5555はいらないんじゃないかな。

普通はこれでいけるんですが、今回は最初のUSB接続で認識が出来ません。そのために、やはりAndroid側にWifiでADB出来るようにするアプリ使う必要があります。その手のものは沢山ありますね。でも大体どれもがルート権限が必要なのです!

自分のMK808はルート化されていなかったので

この辺でもう何だかなぁという気分ですが、始めてしまったので最後までやります。
ルート化されているFirmイメージを探しました。見つけました。
http://tabletrepublic.com/forum/downloads.php?do=file&id=164
他にもいくつか見つけましたが、どれもダウンロードするためにアカウント登録が必要だったり有料ダウンロードだったり・・・この手のものはそういう世界なので安全手軽なものを見つけるのは一苦労です。このファイルも突然別のところに移動するかもしれません。

ここからダウンロードしたrarパッケージはとてもいいですね。RKBatchToolと必要なドライバとフラッシュイメージがセットで入っていました。

沢山のネット記事で説明されている通り、リセットボタン押しながらUSB接続! 無反応・・・
はぁ。これもだめですか。普通はデバイスが認識されてドライバを入れる手順に進むのに。

microSDでアップデート

仕方がないので別手段です。USBストレージマウントはできるので、rarパッケージに入っているフラッシュイメージファイルを”update.img"という名前でmicroSDのルートにコピーします。(このパッケージのイメージファイルは最初からupdate.imgになってました)
Android側のストレージマウントをOffにします。するとその瞬間に、ファームイメージ見つけたけどインストールする?ってAndroidが聞いてきくるので、インストールします。

この方法は外部ツールいらずでお手軽&安全です。アプリや設定は保存されたままシステムだけアップデートされます。逆に言えばクリーンインストールは出来ません。

再度リセット押しながらUSB接続してみたら、今度はちゃんとPCが認識したので、改めてRKBachTool使ってクリーンインストールしました。単に気持ちの問題です。

これでルート化されたので、やっとルート権限が必要なアプリが実行できます。
だいぶ遠回りした気分ですが、これでtcpip経由でのadbが無事機能するようになりました。

eHomeMediaCenter・・・(余談です)

ファームアップデートしたらこんなアプリが入っていました。試しに動かしたらWindowsのメディアセンターやらマックにためしに入れていたTVMOBiLiとかがスパッと表示されてびっくり。
ビデオプレーヤーアプリ作る前に、ちょっとこっち方面をやってみようかな。

2012/11/10

MINITV/android(MK808) でビデオ視聴

以前の記事で購入したMK808がやっと到着した。AliExpressで購入。安く購入できたのがいいが、台湾を出るまでがめちゃめちゃ日数が掛かるのが難点だ。
MINITV/android Dual Core A9 Processorと表記されている。黒つや消しパッケージ。
なかなか、かっこいい。といっても、隙間に入れちゃうんで見えないんだけど。

本体をリビングのTVに繋いで、一緒に注文したキーボード「iPazz Port」を接続!

これでやっとソファーに寝そべって録画番組が見れると思いきや・・・

iPazz Portのワイヤレス電波範囲が思いのほか狭くて、若干前のめりに座って操作しないとマウス操作がまともに出来ない。更に、キーボード入力をその状態で打つと同じキーが何回もリピートして入ってしまう。1m以内くらいに近づけばだいぶ改善されるが、それじゃあねぇ。個体差かな。

MK802で使ってみたときはシチュエーションを考慮していなかったので気づかなかった。

キーボードを、K700の方を使えば上の問題は解決と言えば解決だけど、リビングではビデオリモコンのように片手操作したいのだ。

とにかくビデオ視聴(HTML5 videoをAndroidのブラウザで)

気を取り直して、とにかく我が家の地デジ録画サーバーをブラウザでアクセス。録画番組を観てみる。やはり以前のMK802より若干レスポンスがいい気がする。メモリ倍だしCPUもA9だしね。でも思ってたほどじゃないかな。GPUパワーが低いんだろうか。
画質は問題なしだが、PCやMacで観てるときは感じないカクつきがたまにある。ビデオのビットレートをもう少し落とした方がいいかもしれないと感じた。

MediaElements.jsも問題なくAndroidで動作しているようだが、問題はキー操作

これは残念な結果となった。The State Of HTML5 VideoのAccessibilityによると、キーボード操作はiOS/AndroidともN/Aとなっている。これは不可能という意味だけど、外部キーボードを接続すれば大丈夫じゃないの?って思ってたが・・

  • フルスクリーン状態ではどのキーも反応しなかった。
  • 一度ビデオ部分をマウスクリックしてスペースキーを2回押すとポーズがかかった。
  • 音声ボリューム操作の上下キーもたまに反応した。
  • 一番やりたかった左右カーソルキーでの送りと戻しが全然反応しなかった。

キーコードが違うんじゃない?と思って、アンドロイドのキーコード表のコードをMediaElements.jsのキー操作に加えてみたけれど、無反応だった。

ビデオ視聴中に、アルファベットキーを打つと、IMEウインドウが出て来た。
むむ。ようするにビデオ再生部分にキーボード入力イベントがフォーカスしていない感じだ。だから一度マウスクリックした後のキー操作がたまに動くんだろう。

自分なりの結論

HTML5+Video+Android+Keyboard は無理っぽい。
じゃあアプリ使うか。MX Playerで視聴してみる。いい感じ。キー操作も出来る。
だけどいちいちURL打つのは現実的じゃない。ブラウザから起動するか?
プレーヤーアプリがブラウザ起動を許す仕様になっているか?スキーマは?

ブラウザ起動アプリにする方法はたくさん情報があるけど、GooglePlayからのアプリがそうなっているっていう情報はどこにもないんで手出しできない。

・・・
自分で作るかな
Flashのswfだとブラウザに依存してしまうんで、独立したアプリにする必要があるだろう。
幸いなことに今はAndroidのビデオプレーヤーアプリを作るのはそう難しくない。
Adobe AIRを使えばいいだろう。

・・・
XBMCサーバーとか?
XMBCサーバーいれて、AndroidにはXMBC Remoteで観るとかかな。
UPnPとかDLNAとかにして、Android側でアクセスできるようにするか。

やった事無いけど多分出来そうだ。でも、番組名とかがちゃんと出ないよねきっと。

次回から、この辺の話に移っていく感じでしょうかね。

2012/11/08

自作redmineプラグインをjquery+ajax対応にする

select_tagでのajax処理をjqueryに対応させる

redmine-2.1.xでやっとjquery対応になった。自作のredmine_videoプラグインも若干ながら'prototype.js'の機能を使用しており、そのままだとエラーになってしまう部分があるため、修正した。

edit/index.html.erb
ビデオ簡易編集のビュー内でremote_functionを使っていた部分を、jquery + ajaxに変更

編集モード切替select_tagのonChangeでフォーム内容を部分的に切り替える処理をremote_functionでやっていた以前のコード

<%= select_tag :mode,
    options_for_select([["Delay Time",0],["Clip Time",1]],@mode),
    :onchange => remote_function(:url => {:action => :select_mode}, :with => "'mode='+this.value+"+@remote_params) %>

これを、以下のように変更


<%= select_tag :mode, options_for_select([["Delay Time",0],["Clip Time",1]],@mode), :params => @remote_params %>

このままでは何もしてくれないので



<!--%= javascript_include_tag 'edit-ajax.js', :plugin => 'redmine_video' %-->
<%= javascript_tag do %>
$(function(){
    $("#mode")
        .change(function(){
            var params = "mode=" + $(this).val() + $(this).attr('params');
            $.ajax({
                type: 'POST',
                url:"<%=url_for :action => :select_mode %>",
                data: params,
                dateType: "html",
                success:function(html){
                    //alert("result=" + html);
                    $('#attr').html(html);
                }
            }); // ajax
        }) // change.function
}); // jquery.function
<% end %>

というjquery+ajaxコードを追加。コメントにしているように外部ファイルにしてインクルードしたかったけど
そうするとなぜか動作してくれなかった。なんでかな?


':disable_with'もちゃんと動くようになった。
<%= submit_tag "実行", :name => "submit_execute", :data => {:disable_with=>"実行中"} %>

:confirmも動くようになった。
<%= submit_tag "保存", :name => "submit_save", :confirm => "Are you sure?" %>
<%= submit_tag "消去", :name => "submit_clear", :confirm => "Are you sure?" %>

対応版 edit/index.html.erb

<h2>ビデオ簡易編集</h2>

<%= form_tag :action =>'index',:id=>@issue.id, :result=>@result, :build=>@build do %>
<%= select_tag :mode, options_for_select([["Delay Time",0],["Clip Time",1]],@mode), :params => @remote_params %>

<div id='attr'>
<%= render :partial => 'attr' %>
</div>

<table>
  <tr><td>
    <%= submit_tag "実行", :name => "submit_execute", :data => {:disable_with=>"実行中"} %>
    <%= submit_tag "アップデート", :name => "submit_update" %>
    <br>
    <%= video_tag get_video_filename, :controls => true, :size =>"480x270" %>

    <% if @build %>
    <% if @build=='ok' && @result %>
    <td>
      <%= submit_tag "保存", :name => "submit_save", :confirm => "Are you sure?" %>
      <%= submit_tag "消去", :name => "submit_clear", :confirm => "Are you sure?" %>
      <br>
      <%= video_tag @result, :controls => true, :size =>"480x270" %>
      <% end %>
    <td><%= link_to @build, "/jenkins/job/edit_#{@issue.id}" %>
      <% end %>
</table>

<%= javascript_tag do %>
$(function(){
    $("#mode")
        .change(function(){
            var params = "mode=" + $(this).val() + $(this).attr('params');
            $.ajax({
                type: 'POST',
                url:"<%=url_for :action => :select_mode %>",
                data: params,
                dateType: "html",
                success:function(html){
                    //alert("result=" + html);
                    $('#attr').html(html);
                }
            }); // ajax
        }) // change.function
}); // jquery.function
<% end %>

コントローラの方も若干直した
controller: "edit", action: "select_mode"

# ajax partial render
  def select_mode
    get_params
    init_params
    remote_params
    render :partial => "attr" 
  end

前はよくわからないまま、renderの部分を


render :update do |page| page.replace_html "attr", :partial => "attr" 
end

ってやっていた。このままでも動くようだけれど、すっきりしてる方がいい。


引っかかったのは、jquery.ajaxを理解するところ。実際理解できたのかも分からないけど、自分なりの解釈はこうだ。

$("#mode").change(function({・・・
select_tagには、form_tagのように:remoteは効かない。よってjqueryでトリガーさせる必要がある

$.ajax({・・・
で、select_modeアクションへポストする

success:function(html){
で、結果を取得する

$('#attr').html(html);
で、部分的な更新を行う

多少納得いかないけれど、大体こんな感じなのでしょうか。
これで、ページ更新を必要としない非同期通知も出来そうなので、ビデオ再生制御情報をサーバーに送ることが出来るかな。

普通のフォームコミットのajaxとかだったらもっとすっきりするんだろうけど、今回のようなselect_tagでってなると、いきなり面倒なことになるね。
でもテンプレートとイベント処理を完全に分離できるところが実際の仕事では実用的な気がする。

とにかく、これで自作ビデオプラグインがjquery対応に出来たので、redmineを2.1.2に切り替えた。

2012/11/05

Android Mini PCとGoogleTVキーボードで視聴する

地デジ録画システムで録画したビデオをリビングで快適に視聴するために

ということで、久しぶりにいくつかアイテムを購入しました。
まだ肝心なものが届いていなかったりするんですが、思惑と、途中経過+α情報です。

前置き
AppleTV(3rd)をリビングTVに繋いでますが、ほとんど使っていない状況。
なぜならブラウザが載ってないから。JBも今だ出来ないようだから。見切りをつけました。

別手段として、Android Mini PCを使うことにしました。
ソファーに寝そべって操作したいので、USBワイヤレスキーボードも用意します。

キーボード
  手のひらサイズのメディアコントローラキー付きミニキーボード
  ジャイロ内蔵でマウス操作は本体を傾けて行う。

  普通サイズのキーボードにマウスパッドとメディアコントロールキーが付いているやつ
  K700というモデルです。K400というフルキーボードのみもありますが、K700の方が安いんです。

どちらも英語キーボード。自分は元々英語キーボードしか使えない体質なのです。
K700の方は日本では販売されていないようです。
逆輸入業者を通すととっても高いので、私は以下で購入しました。


中国のオンラインショップでございますが、amazonに比べて一割程度安いです。
日本への発送も無料です。ただし届くまですごい日数がかかります。
スピードアップするにはDHLを選択することもできますが、千円以上の送料が係ります。
2,3千円の商品にそれはいやなんで。15日くらいかかりましたが無事到着しました。


USB無線モジュール付いてないんじゃ?って不安でしたが両方ともちゃんと付いてました^^;

Android Mini PC
これも流れでAliExpressからの購入です。自分が購入したときは$72.00でしたが、今見ると買えなくなっていました。品薄なのか、$82.00に値段が上がっているページへのリンクになってました。
上のモデルは「MK808」と言われているやつです。色んなメーカーから出てますね。

残念ながら、これがまだ到着していません・・・
が、MK802は所有しているので、そっちに接続してテストしてみました。

キーボードはどちらか使いやすい方をと思って2種類買いましたが、どちらも甲乙つけがたいくらい使えます。iPazzPortのジャイロマウスは慣れるまでちょっと・・・ですが30分くらいで慣れました。
スマホくらいの大きさでデザインもいいのでリビングに置いてあっても違和感がないです。

MK802あるのになぜまたMK808を買ったか?なぜならMK802は遅いんです。AndroidOS2.3くらいがちょうどよいハードに無理やり4.0乗せちゃった感じです。なので期待を込めてMK808を購入しました。巷の評判は良いようですし。

ついでに日本語入力について

ネットでは日本語キーボードを接続してキーマップ変更して・・っていう話がよくありますが
素直に英語キーボードを使うのがいいと思いますね。キーの数も少ないので1つのキーが大きいしシルクも英数字だけなのですっきり。日本語入力も特に苦労しません。ただIMEはちょっと選んだ方がいいでしょう。

無料のメジャーIMEは、Shimeji、Google日本語入力、OpenWnn、AltIMEってところでしょうか。その他いろいろありますがフリック操作とかソフトキーボードスキンとかが違うだけかな。
これらの中で使いやすいのは、OpenWnn系だと思います。

なぜかというと、全角・半角(英数字)切り替えを、Shift+スペースキーで行えるからです。
Google日本語入力はキー操作での切り替えができないようなので却下です。

日本語入力状態から完全に抜けるにはESCキーを押すっていう手もありますね。
再度日本語入力にするにはテキスト入力するフィールドでクリック(タップ)します。
この方法ならGoogle日本語入力でもいいでしょうけど、日本語入力モードじゃないのに間違えてESCキーを押すとアプリが閉じちゃうんで危険ですね。クリック(タップ)するのも面倒です。

ということで自分はOpenWnn Plusを使用しています。Plusとしての機能は物理キーボードには不要なものなのですが、今気軽に選べるのがこれなので。
AltIMEもベースはOpenWnnなので、同じ操作が可能ですが、全角半角モードが視覚的によくわかりません。OpenWnnPlusはIMEパネルに常時表示してくれるので分かりやすいです。

ここに書いても仕方ないけれど・・・
日本の量販店のみなさん。普通に英語キーボードを陳列してください。
マニアックな店に行かなくても、海外サイトを利用しないでも済むようにしてください。

MK808が届いたら(届くかなぁ・・)ビデオ視聴環境のテスト再開予定。
MediaElements.jsとの相性も気になります。