2014-01-09 [長年日記]
TBi11MにAndroid4.4.2をいれる
Nexus7を購入したことで現役を引退したxoomさんですが、省メモリ化によりロースペックデバイスでもそれなりに動作するようになったといううわさのkitkat(のカスタムROM)がでたので入れてみることにした。充電スタンドがあるので、リモートモニタ的な何かに使えればいいかなあというもくろみ。
今回使用するのはOmniROM。http://forum.xda-developers.com/showthread.php?t=2580256 から一式ダウンロードすることができる。
ただ、xoomの/systemが小さく、そのままでは書き込むことができないので、まずはパーティションを切り直す作業を行う必要がある。作業内容は http://forum.xda-developers.com/showthread.php?t=2506997 にある通り。
簡単に説明すると、
- TWRP(通常版)、TWRP(BigPart対応版)、書き込みたいROM、ブートローダーをマイクロSDカードに書き込んでおく。
- TWRP(通常版)を書き込んで、リカバリモードで起動
$adb reboot fastboot $fastboot flash recovery (TWRPへのパス) $fastboot reboot (motorolaロゴ中にVolume-で起動メニューがでて、Android RecoveryをVolume+で選択)
- passwordはキャンセルでOK
- SuperSU入れるか聞かれたら、すべてキャンセル
- メニューからSDカードをマウント(mount->sdcard)
- install->TWRP(BigPart対応版)を選択してflash
- 再起動せずに、data,cache,systemをクリア。/sdcard以外は消してOKだと思う
- 再度リブートしてリカバリモードで起動(reboot->reboot recovery)
- 起動したらマウントのメニューでcache,dataがマウントされていて、systemがマウントされていないことを確認
- いずれかのパーティションが見えていなかったりマウントの状態がおかしかったら最初からやり直し
- あとはSDカードをマウントして、ブートローダーとカスタムROM、gappsを書き込み。TWRPは複数のzipファイルを連続して書き込むことができるので便利。
- 必要であればSuperSUも書き込み
- 再起動
- OmniROMのロゴでまつ。
- adb logcatしておくと何かしら進んでいる(か、エラーでループしている)のがわかる
こんな流れ。まあBootROMが死なない(fastbootモードに移行できる)限りにおいては文鎮化はしないと思うので気軽にやればいいと思う。
あとは通常通り初期セットアップを行えば使用できるようになる。ちょっと使った感じでは、多少もたつきがあるものの問題なく使用できるレベル。フォントも4.1とは違い、最初から日本語フォントになっている。
2014-01-10 [長年日記]
tdiary-contribの開発環境を作る
これまでtDiaryのプラグインを作るときには適当に書いて本番環境(ここ)に投入して試してたんだけど、さすがにそれはどうかということでtdiary-contribの開発用環境を作ることにした。ここからはHomebrewを前提のメモ書きだけど、Ubuntuでもそんなには違わない。
Homebrewのインストール
$ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
だそうです。昔やったので忘れた。
git,rbenvのインストール
今回は、rbenv+ruby-buildを使用する。
$brew install git rbenv ruby-build
rbenvは$HOME以下に自分で入れてもいいけど、brewのrbenvは最新版への追従が早いのでbrew版を使っている。rbenvを入れることによって、バージョン違いのrubyでの動作確認が簡単にできる。
ruby,gemのインストール
異なるバージョンのrubyを使用する場合はここからの作業を行えばOK。
$rbenv install 2.1.0 $rbenv rehash $rbenv global 2.1.0
で現状の最新版をインストール。bundler,rakeも入れておく。
$gem install bundler rake
最新版のtdiary-coreでgemをインストール
公式リリースの4.0.2ではHEADのtdiary-contribとのパス指定での協調動作ができないのでHEADでgemを作って入れておく。4.0.3がリリースされた後であれば普通にgemでインストールすればいいはず。
適当にディレクトリを作って、git clone。
$mkdir ~/workspace $git clone https://github.com/tdiary/tdiary-core.git ~/workspace/tdiary-core
gemを作ってインストール。
$cd ~/workspace/tdiary-core $rake build $gem install pkg/tdiary-4.0.2.20131215.gem $rbenv rehash
tdiary-contribもgit cloneしておく。こちらは開発用なので、sshで。
$git clone git@github.com:tdiary/tdiary-contrib.git ~/workspace/tdiary-contrib
開発用の日記を作成
適当な場所に日記を作成。
$tdiary new ~/workspace/diary
~/workspace/diary/Gemfile.localに次の一行を追記する。
gem 'tdiary-contrib', :path => '../tdiary-contrib'
この状態でサーバーを起動し、設定画面でcontribに格納されているplugin等が選択可能になっていることを確認する。
あとは、tdiary-contrib/pluginに追加、変更をして試すといいと思います!
2014-01-17 [長年日記]
nginx+Rack環境に移行した
歴史的経緯で、いままでこの日記はapache+cgiという昔ながらの環境で動かしていたのだけど、バージョンアップ時のトラブルやプラグインの管理等々で手間がかかることがままあったので、パッケージの更新はgemで、サーバーはRackで動かして、proxy serverとしてnginxを使うことにした。
tDiary側
基本的には公式リリースのgemを使用するつもりなので、
$gem install tdiary
でいいのだけど、tdiary-contribはHEADを追いかけたいので今回だけ、githubから最新版を持ってきてgemを作って入れた。やり方はこの間書いたので省略。
$ gem list --local | grep tdiary tdiary (4.0.2.20131215)
こんなかんじになっていればOK。
$tdiary new ~/diary $cd ~/diary $bundle exec server start
で動くことを確認して一旦停止。 起動時に動くように/etc/init.d/tdiaryを以下のような内容で作成。
#! /bin/sh ### BEGIN INIT INFO # Provides: tDiary # Required-Start: $local_fs $remote_fs $network $syslog $named # Required-Stop: $local_fs $remote_fs $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tDiary initscript # Description: tDiary initscript # placed in /etc/init.d. ### END INIT INFO # Author: kp <knomura.1394@gmail.com> # USER=www-data RBENV_ROOT=/home/kp/.rbenv PATH=$RBENV_ROOT:/sbin:/usr/sbin:/bin:/usr/bin DESC="tDiary server" NAME=tdiary PIDFILE=$NAME.pid TDIARY_PATH="/home/kp/diary" echo -n "Stopping:tDiary " case "$1" in start) echo -n "Starting:tDiary " start-stop-daemon --start --pidfile $TDIARY_PATH/$PIDFILE --background \ --chdir $TDIARY_PATH --chuid $USER \ --exec $RBENV_ROOT/shims/bundle \ -- exec $NAME server -b localhost && echo [ OK ] || echo [FAIL] ;; stop) start-stop-daemon --stop --oknodo --pidfile $TDIARY_PATH/$PIDFILE && echo [ OK ] || echo [FAIL] ;; restart) $0 stop $0 start ;; *) echo "Usage:$0 {start|stop|restart}" exit 1; ;; esac
あとは、
- 独自にカスタマイズしたpluginをdiary/custom/pluginに移動し、tdiary.confに記述
- いままでの日記のデータをdiary/dataに移動し、www-dataで書けるようにユーザ権限を設定
- 使用しているテーマをディレクトリごとdiary/themeにコピー
- Gemfile.localにtidary-contribをパス指定で記述
したくらい。
nignx
インストールしてserverを設定。一部抜粋すると、
server { listen 80; listen [::]:80; server_name mmho.net; access_log /var/log/nginx/$server_name-access.log; error_log /var/log/nginx/$server_name-error.log error; rewrite ^([^.]*[^/])$ $1/ permanent; location /diary/ { proxy_pass http://localhost:19292/; proxy_redirect default; } location = / { rewrite ^ http://$server_name:$server_port/diary/; } }
こんな感じ。
いままでどおり、/diaryでアクセスできるように設定したのだけど、proxyまわりの設定がよくわからなくて難儀した。 proxy_passの最後のスラッシュがないと動きが変わるので注意。
(追記)
リンク元として自分自身が記録されていたので、X-Forwarded-Hostを設定し、 base_urlをconfig.ruで設定するようにしたけど、まだなにかおかしい気がする。
--- mmho.bak 2014-01-20 10:24:10.926716279 +0900 +++ mmho 2014-01-17 16:43:38.566865066 +0900 @@ -19,8 +19,10 @@ rewrite ^([^.]*[^/])$ $1/ permanent; location /diary/ { - proxy_pass http://localhost:19292/; + proxy_pass http://localhost:19292; proxy_redirect default; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Server $host; } location = / {
nginxの設定の差分はこんなかんじで、
--- config.ru.bak 2014-01-20 10:29:32.870703472 +0900 +++ config.ru 2014-01-17 15:00:37.078819871 +0900 @@ -2,5 +2,5 @@ require 'tdiary/application' use ::Rack::Reloader unless ENV['RACK_ENV'] == 'production' -base_dir = '/' +base_dir = '/diary/' run TDiary::Application.new( base_dir )
config.ruはこんな感じで変更。
2014-01-21 [長年日記]
ゼルダの伝説 神々のトライフォース2
買うかどうかちょっと迷っていたんだけど、3DSの2本買ったらもう1本キャンペーン*1に誘惑されて購入、 10時間ちょっとでクリアした。
神々のトライフォースといえばSFCの大傑作で、そのナンバリングタイトルということで気にはなっていたものの、プレイしたのも10年以上前のことだし、思い出は美化されるのであまり期待値を上げ過ぎるのもなーと思いつつ、結局家電量販店のポイントでまかなえることがわかったので、購入した。
駆け足でクリアした感じではプレイ感覚やダンジョンのギミックの難易度ふくめて、あーこんな感じだったなーという感触で前作をプレイした時ほどの感動はなかったけど、まあそれはゲームの経験値が上がったということでしかたがないと思う。
で、一旦クリアした段階で、キャンペーンでもらったカルドセプトに流れていたのだけど、また通常難易度で2周目をはじめた。こんどはもっとゆっくりプレイしたい。
*1 もう一本はMH4を登録済み
2014-01-30 [長年日記]
KitkatではSDカードへの書き込みができなくなる?
結論から先に書いておくと、そんなことはない。追記したので下の方から読んでください。
発端はKitKat端末では今後アプリからMicro SDカードへの書き込みができくなる模様。そして、記事のもととなった記述資料は External Storage Technical Information。
Multiple external storage devicesの項を読むと、確かにWRITE_EXTERNAL_STORAGE permissionではprimary external storageに対してのみwrite accessを与えるべきだと書いてある。
では、このprimary external storageは何かというと、例えばバッテリーの場所にあるスロットのSDカード、と書いてあるように、内蔵ストレージのみではないことが明確に書かれている。また、primary external storageが複数ある(内蔵ストレージ+SDカードなど)構成があり得ることは、
Context.getExternalFilesDirs()
と、API名が複数形であることからも明らか。ちなみにprimary external storageでないもの(secondary external storage)は何かというと、USBメモリなどの一時的なストレージで、WRITE_EXTERNAL_STORAGE permissionで書き込めない理由は、アプリのアンインストール時にデータのクリーンナップが確実にできる保証がないためとのこと。USBメモリに書き込む方法はないわけではないと思うけど興味の範囲外なのでパス。
元の記事とはあまり関係ないけど重要なポイントとして、/(mount point)/Android/data/(package-name)は権限なしで読み書き自由で、ほかのディレクトリにアクセスするには今までどおり、WRITE_EXTERNAL_STORAGEもしくはREAD_EXTERNAL_STORAGEの権限が必要。ただし、権限をつければ読み書きできるのでセンシティブな情報はいままでどおりInternal Storageに保存してねとのこと。
これにより、ゲームの外部データやキャッシュなど自分自身のデータにアクセスするだけのアプリは(WRITE|READ)_EXTERNAL_STORAGEの権限を付ける必要がなくなり、逆に必要もないのにストレージの読み書きを要求するアプリはあやしいと判断することができる。ということでアホほど権限をつけるアプリ各位は対応のほどよろしくお願いします。
(追記)話の筋は変わらないけど、大きく間違っている場所があったので修正しました。ごめんなさい。以下が修正前の文章。
このディレクトリ(/(mount point)/Android/data/(package-name))に関してはFUSEで保護されていて他のアプリから読み書きできないので、センシティブな情報やログはここに書き込めばOKらしい
追記の追記
いろいろ間違えてたのでいったん全部忘れて!
前提条件
androidでは外部ストレージについていろいろなバリエーションがある。
- 内蔵ストレージのみ(Nexus7など)
- SDカードのみ
- 内蔵+SDカード
いまどきは内蔵ストレージのないデバイスはほとんどないので、必然的にSDカードがつくとそれがセカンダリになる。
KitKatではこうなるよ
- primary external storageに関してはAndroid/data/(package-name)は権限なしで読み書き自由
- それ以外も(READ|WRITE)_EXTERNAL_STORAGEをつければ読み書きできるよ
- secondery external storageに関してはAndroid/data/(package-name)は権限なしで読み書き自由
それ以外はダメそれ以外は書き込み禁止。読み込みには多分READ_EXTERNAL_STORAGEが必要- 音楽や動画、静止画の再生はContentResolver経由なので大丈夫
ということで、APIリファレンスや諸々をちゃんと読んだ感じでは、元記事の内容は煽りすぎですが、汎用のストレージとしては使用できなくなるのは確かなようです。 簡単ですが取り急ぎ。
2014-01-31 [長年日記]
Media Link Player for DTVを買ってみた
Android版のTwonkyBeamによるDTCP-IPつきのDLNAからのストリーミングがどうにも安定しないので、Media Link Player for DTVを購入してみた。今のところインストールできる機種はかなり限られていて、手元の端末だとNexus7のみ対応している。
インストール直後にアクティベートが行われるのだけど、エラーがでるけど詳細な内容がなくてあせった。結論としてはUSBデバッグが有効になっていると失敗するとのこと。他にrootedなデバイスもアクティベートできないらしく、これは納得できるんだけど、USBデバッグについては正当な理由があるのかなあ。
それはともかく、USBデバッグをOFFにしたらアクティベートに成功して起動できたので、自宅のDNLAサーバーで動作を確認したところ、nasneとDIGA+で再生動作はできたけど、気になる点がままあるなあという感じ。
- タイムジャンプで音声はすぐ出るんだけど、映像が秒単位で遅れる
- nasneのチャプターは認識しているけど同じ時間のチャプターが複数表示される
- DIGA+ではチャプターが認識されていない
そもそも論として、チャプタースキップはサムネイルによるリスト表示じゃなくて(あってもいいけど)、タイムバー上に位置を表示してスキップボタンでポン飛ばしのほうが使いやすいんじゃないだろうか。
チャプター機能の改善は今後に期待するとしてこれで録画番組の消化が捗るといいなあ。
kp [test]