<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>oops</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/" />
    <link rel="self" type="application/atom+xml" href="http://www.narazaki.info/atom.xml" />
    <id>tag:www.narazaki.info,2009-07-04://2</id>
    <updated>2012-02-01T01:07:29Z</updated>
    <subtitle>世間に背中を向けてひた走る情報弱者のblog</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.04</generator>

<entry>
    <title>PSO2α2雑感</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2012/02/pso22.html" />
    <id>tag:www.narazaki.info,2012://2.400</id>

    <published>2012-01-31T22:46:31Z</published>
    <updated>2012-02-01T01:07:29Z</updated>

    <summary>PSO2α2が始まったので雑感。4日の日程のうち2日まで経過。...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="ゲーム" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>PSO2α2が始まったので雑感。4日の日程のうち2日まで経過。</p>]]>
        <![CDATA[<p>■全体的なところ<br />
・アクション性が大幅に上がっている<br />
　すごくモンハンっぽい。モンハンとPSPo2を2:1で混ぜたような感じ。<br />
　ジャンプとステップが非常に重要なので格ゲーっぽいところもあるけど、戦闘そのものは大味で取っつきやすくしてある。<br />
　基本的には慣れればノーダメで進めるようなバランスになっていると思う。</p>

<p>・ギスギス要素を緩和するための工夫がされている<br />
　アイテムドロップをPSPo2以来の個別ドロップ方式にし、経験値取得も手付け方式から周囲にいるだけで均等配布される方式になった。<br />
　このおかげでマルチパーティエリア(後述)などで全く見ず知らずの人といきなり共闘しても損がなく、他人が鬱陶しくないむしろ他人が一杯いるほど嬉しい設計。<br />
　ガチガチのパーティ組みたい人には向かなくなったかもしれないがMOとしては健全な方向になった。</p>

<p>・回復手段が大きく制限された<br />
　従来のPSO/PSUと大きく異なる点として、アイテム使用に(モンハンのように)時間が掛かるようになり、レスタはHPが徐々に回復するフィールドを数秒間張るような効果になった。<br />
　このため回復には安全確保が必須になり、回復しつつ敵と正面からHPを削り合う、というような戦い方は出来ない。</p>

<p>・種族格差が全体的に縮小<br />
　HPと法撃以外のステータス差はあまりない。法撃だけはキャストとニューマンでそこそこの差(といってもPSUのヒューマンとニューマンくらいの差)があるのでキャストのフォースだけは若干不利かもしれない。</p>

<p>・3職それぞれ操作感が別ゲー<br />
　特にハンターとそれ以外の操作感が全く異なる。ハンターはパッドでプレイする人が多いようだが、レンジャーとフォースはキーボード+マウスでの操作がほぼ必須に近い。</p>

<p>・ハンターは格ゲー<br />
　普通に使っても普通に強く、操作に慣れると凶悪に強くなるので、初心者から上級者までとりあえずハンター使っておけばハズレは無い。<br />
　攻撃力がぶっちぎりで高く防御面でも隙が無いので効率とか強弱とか気にする人はハンター選んでおけって感じ。<br />
　ジャンプとステップが非常に重要で、特にステップは無敵時間有りで使用コスト0な上にステップをキャンセルして攻撃に繋がるため非常に強力。敵の全攻撃をステップで避けながら攻撃し続けるのがデフォルト。<br />
　前述の通りメイトが使いにくくなっているため回復時は安全確保が重要。<br />
　ステップに比して空気っぷりがやばいガードにはてこ入れ必要と思われる。</p>

<p>・レンジャーはTPSっぽい<br />
　立ち位置としてはモンハンのボウガンか?弱点狙いのため事実上TPSモードが必須。<br />
　敵を弱体化させる特殊弾を持つ。ただし特殊弾はリキャストが長く対ボス用の性質が強い。<br />
　攻撃力は(弱点を狙ってすら)低めだが、PAの一点集中攻撃やグレネード弾はそこそこの威力。ボス戦ではハンターが殴りにくいような場所にある弱点を特殊弾で防御下げてPA撃ちまくると割と強い。雑魚戦は苦手かもしれない。<br />
　ステップの代わりにダイブロールというPSPo2の緊急回避みたいなのが出る。コスト0なのでPSPo2よりはずっと強力だがステップと違ってキャンセル出来ないため3職では一番地味。</p>

<p>・フォースは...なんだろ<br />
　モンハンの弓と笛を足して2で割ったような感じ?レンジャーと同じくTPSモード推奨。<br />
　テクは時間を掛けてチャージしてから撃つ必要がある。このため安全にチャージ出来るような位置取りが重要になる。<br />
　攻撃力は低いが補助が出来るのが一応利点。ただαでは補助が(前述の通り使いにくい)レスタしかないので補助役としてはあまり期待出来ない。シフデバが来れば違ってくるはず(補助アイテムが無ければ)<br />
　ステップの代わりに水平に滑るように移動するミラージュエスケープが出る。無敵時間が長いが隙も大きくキャンセル不可のため、その名の通り敵中脱出用という色彩が強い。<br />
　ガス欠になりやすいくせにPP回復手段が殴るしかなく、非チャージテクの存在意義が不明、などまだ練り込みが足りない感はある。</p>

<p>・キャラクリは良く出来てる<br />
　顔が変形できすぎてとんでもないことになりがちなので、かんたん編集で大まかに作った後で少し弄る、くらいにしておかないとやばい。<br />
　おっぱいスライダー自重。<br />
　α1であまりの自由度の低さに驚異的な不人気っぷりだったキャストはα2で大幅にてこ入れされた。</p>

<p>・ツリー式のスキルシステム<br />
　いわゆるDiablo2方式。正直これは古い。なんでPSPo2で付け替え自由のアビリティ方式にしたのに退行するんだろう。<br />
　スキルの性能はあまり強力にしない方針のようなので、特定のスキル編成でないとどうこうということはあまりないと思う。今の傾向で行くならだけど。<br />
　αではスキルリセットが出来ない。本番では課金アイテムか何かになるんだろうか?</p>

<p>・アイテム強化とかはまだ触ってない<br />
　悪名高いドゴーンや傷物仕様が無くなったため、とにかくコストさえ掛ければ強化していける感じにはなった模様。<br />
　基本的にはPSPo2系の発展型といった感じみたい。</p>

<p>・マルチパーティエリアが特徴的<br />
　道中で複数のパーティが最大12人までごちゃ混ぜになるエリアがあり、基本的にマッチングがランダムに行われるためかなりカオス。前述の通り他人がいるほど有利なので自然に共同戦線を張る形になる面白い仕組み。<br />
　α1では大人気を誇ったがα2で仕様が複雑化しかえって過疎化するという逆効果をもたらしたため、α1に近い仕様に戻して欲しいという声多数。</p>

<p>・マイルームはPSUの発展系<br />
　デフォルトでバルコニー付きでPSUより広い中部屋だが、最大で大部屋3個まで拡張可能。<br />
　ただ、実用的な機能はロビーで一通り使えるため、マイルームは純粋に友達呼ぶ用となっていてどの程度使われるのはやや疑問。マイルームでしか出来ない機能(栽培とか?)がないとあまり利用されないコンテンツになるかもしれない。</p>

<p>■ぱっと見てまずいと思う所<br />
・アイテム整理周りのUIがいまいち<br />
　α1からはやや改善したが相変わらず使いにくく分かりにくい。<br />
　ミッション中にアイテムが一杯になって整理しようとすると確実にイラッとするレベル。</p>

<p>・倉庫が狭い<br />
　αだからかもしれないが倉庫にアイテムが200個しか入らない。本番では少なくともあと1桁は多くなることを期待する。<br />
　とすると尚更今のアイテム整理UIでは追いつかなくなるわけだけど。</p>

<p>・不可逆型のスキルツリーシステムは今時古い<br />
　課金スキリセ売るぜーとか思ってるなら止めて欲しい......。<br />
　特にフォースのスキルが属性別で分かれているのは懸念点だと思う。</p>

<p>・ガードと非チャージテクが空気<br />
　ガードが完全にステップに食われており、α2から攻撃モーションをガードでキャンセル出来るようになったがまだ弱い。何かもっと目立つ利点がないと厳しいと思う。<br />
　非チャージテクは威力がショボいくせにPP消費がチャージと同じという意味不明さ。いっそ非チャージはPP消費無しで低威力の通常攻撃扱いにでもしてしまえばいいのに。</p>

<p>・α1のマルチパーティエリアを返して<br />
　返せ</p>

<p>とりあえず現状見えている範囲では割と期待出来る方じゃないかなぁ。</p>]]>
    </content>
</entry>

<entry>
    <title>何故ActionBarは使いにくいのか</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/12/actionbar.html" />
    <id>tag:www.narazaki.info,2011://2.399</id>

    <published>2011-12-05T15:26:51Z</published>
    <updated>2011-12-05T16:45:01Z</updated>

    <summary>俺はGalaxy Nexus買ってないけどな!でかすぎるし 私が「Ice Cre...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>俺はGalaxy Nexus買ってないけどな!でかすぎるし</p>

<p><a href="http://d.hatena.ne.jp/Kazzz/20111205/p1">私が「Ice Cream Sandwich」を嫌いな理由 - Kazzzの日記</a><br />
やっぱり不評みたい</p>]]>
        <![CDATA[<p>ActionBarはICSに限らず最近Googleが推奨しているAndroid向けUIで、従来のメニューボタンによるメニュー表示を廃し、ActionBar(多機能タイトルバー)の右部分にボタンを並べることで代替するものだ。<br />
推奨されているので(操作一貫性重視の観点から)俺も最近書くアプリではなるべく使うようにはしている。</p>

<p>このUIは見た目的にはまあクールな感じになるのだけど、重大な欠点がある。<br />
ボタンが画面の右上という僻地に置かれているため左手で片手持ちすると押せないのだ。右手持ちでもかなり押しにくい。</p>

<p>スマホを片手持ちする時の重心は大ざっぱに分けて二通りの流派があると考えている。<br />
一つはAndroidユーザに多いと思われる下半分に重心を置いた持ち方。もう一つはiPhoneユーザに多いと思われる端末中心に重心を置いた持ち方だ。<br />
なぜそんな持ち方になるのか。<br />
iPhoneではBackボタンが左上に配置されることが多く、また往々にして各ボタンが画面に散在している。このため、画面全体を均等なコストで押せる持ち方が望ましい。まああのUIは開発過程で両手操作しているのではないかと思うが......。<br />
Androidでは最重要のボタン(「Back」と「Menu」のことだ)が下部に配置されており、アイテム選択を除けば上部での操作はあまり発生しない。だから上部ボタンのコストが多少高くなっても下部ボタンを最小コストで押せる持ち方が望ましい。</p>

<p>これはかねてからの俺の持論なのだけど、スマホにおける片手操作のスイートスポットは画面の下半分～1/3程度の場所にあると考えている。<br />
重心を中央に置いて画面上部を押しやすい持ち方をするとどうしても自分自身の手で画面を隠しがちになるし、画面が隠れないように持つと親指は画面下部あたりに優れた稼働特性を持つことになる。<br />
特に理由がないなら、画面の下の方で親指をチョコチョコと動かして操作し続けられるのが一番快適なはずだ。<br />
まあ<a href="http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%83%84%E3%81%AE%E6%B3%95%E5%89%87">フィッツの法則</a>とかいう奴に合致するよう作ると自ずとそうなる。</p>

<p>Honeycombより前のAndroidでもあからさまに上記法則に反しているものがある。みんなあの操作は大嫌いなはずだよ。<br />
そうそうあれだよあれ。　「通知バーの引きずり下ろし操作」だよ!<br />
あの操作がかったるいのはきちんと駄目な理由があるってことだ。</p>

<p>まあつまりどういうことが言いたいかというとだね</p>

<div style="font-family:'ＭＳ Ｐゴシック';font-size:12pt;line-height:100%;">
　　 )､.＿人＿人＿人＿人__,.イ.､.＿人＿人＿<br />
　＜´　Menu　ボ　タ　ン　返　し　て　っ　！ ＞<br />
　　 ⌒ v'⌒ヽr -､＿　 ,r v'⌒ヽr ' ⌒<br />
// // //／::　<　　 ＿,ノ｀' 、ヽ､＿　ノ 　;;;ヽ　 //<br />
///// /::::　　　（y○'）｀ヽ) ( ´（y○'）　 　　;;|　　/<br />
// //,|:::　　　　　（ (　/　　　　ヽ) ）+　　　 　;| /<br />
/ // |:::　 　　　+　 ) ）|~￣￣~.|（ (　　 　 　 ;;;|// ////<br />
/// :|::　　　　 　　（ (||||! i: |||! !| |) ）　 　 　 ;;;|// ///<br />
////|::::　　　　+　　 U | |||| !! !!||| :U　　　;;; ;;;|　///<br />
////|:::::　　　　　　　| |!!||l ll|| !! !!| | 　　　;;;;;;|　////<br />
// / ヽ:::::　　 　 　　| !　|| |　||!!|　　　　;;;;;;/// //<br />
// // ゝ::::::::　:　　　| ｀ー----－'　|＿_／///<br />
</div>

<p>ActionBarに置くボタンは滅多に押さないボタンだけにして、よく押すボタンはSplitActionBarに置け、ってことかもしれないけど、それだと画面がせませまですお</p>]]>
    </content>
</entry>

<entry>
    <title>ぐぐるTV日本上陸は来年?</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/11/tv.html" />
    <id>tag:www.narazaki.info,2011://2.398</id>

    <published>2011-11-01T23:14:32Z</published>
    <updated>2011-11-02T00:12:50Z</updated>

    <summary>...というのが今回のGDDでの最大の収穫かなぁ。 懇親会に申込み損ねてしまった...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>...というのが今回のGDDでの最大の収穫かなぁ。<br />
懇親会に申込み損ねてしまったのでなんだか不完全燃焼みたいな感じになってしまいました。</p>

<p>ぐぐるTVが面白そうだったので講演の雑感。</p>]]>
        <![CDATA[<p>・ぐぐるTVは現在アメリカ版のみ。来年国際版を出す予定だよ<br />
　まあ今日本に上陸されてもしょんぼりなので、少しアメリカで初速つけてから来てもらった方がいいね。このままだと来年でも微妙だけど...<br />
・タッチパネルがないのでDPAD(方向キー)での操作になるよ<br />
　トラックボールか何かもあるようだけど、基本的に方向キーで操作できるようにしてくれ、とのこと。<br />
　...ちょうど前日に思い立って互換性ネタを書いた時にカーソルキー使えるようにしとこうぜみたいなことを書いたんだけど、Google TVが来たらこの対応は必要だろうなとは思ってたのでちょっとタイムリーだった。もう一つはIS01もしくはAZみたいなブックタイプ(俺はChrome Bookはコケると思っているので)<br />
・TVではアクションバーは上ではなく左に来るよ。<br />
　縦方向はListViewのせいで非常に(論理的に)長くなるので、DPADでの上下移動が大変。アクションバーなどの切り替えは基本的に左右に振るのがいいよ。講演では横3ペインのデザインを推奨していた。<br />
　これは当然だと思う。あと横に長く上下に狭いので上下方向にものを並べると狭いしね。<br />
　この辺は昔作った(黒歴史の)拙作2chブラウザでも初期(2年前)からlandscape(横長)モードではツールバーを左に置くといった対応をしていたのだけど、当時は全く見かけなかったし今でもあまりやられてない対応。やっと時代が俺に追いついたってことだな!!まあ某2chブラウザのカーソル対応は死んでたわけだが(ダメじゃん)<br />
・GoogleTVとタブレットのresourceの切り替え方法については言及がなかった<br />
　両方largeとかxlargeじゃ区別つかないじゃん。どーすんのよ。<br />
　論理的にはlayout-notouch-largeとかで区別してねって話になるべきところなのでなんでそう言わないんだろうかと思った。もしかして現行のGoogle TVってトラックボールカーソルがtouchscreenを詐称していて区別がつかないみたいなグダグダ展開だったりするの?もしそうなら今すぐやめさせて欲しいんだけど、そんなことはないと思いたい。<br />
　というわけでタブレットとTVはnotouchで区別したいね。ほんとはresourceタイプに「タッチはあるけどキーボード優先のデバイス」があってもいいと思う。<br />
　このやり方の利点はTVもそうだけどAZのようなノート風デバイスにも全く同じアプローチが可能なこと。IS01なんかはnotouchで区別できないので、キーボード優先指定が欲しいなぁ。タッチを必須とするアプリが使用できる一方で、キーボード操作レイアウトを持つアプリはキーボードでも快適操作、だと嬉しいよね。<br />
・TVはすっごい視聴時間長いよ論<br />
　...うん、言いたいことはわかるんだけど、その理論で任天堂もSONYもMSも死屍累々の山を築いてきたんだよね...。<br />
　でもブレイクしたら逆にセットトップボックスがゲーム機を駆逐する、みたいな未来もあるのかもしれない。周辺機器もUSB/Bluetoothによる共通化が可能だし開発環境が激安だから業界構造を変えるかもしれないよね。<br />
　とはいえ日本だとセットトップボックスはあまり一般的じゃないからなぁ。アメリカだとCATV会社に採用させたら一気に行く可能性はある。<br />
　でもなんだろうね、この3DO臭みたいなの。</p>]]>
    </content>
</entry>

<entry>
    <title>Androidで互換性の高いアプリを書くための最悪ではない程度のプラクティス</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/android-7.html" />
    <id>tag:www.narazaki.info,2011://2.397</id>

    <published>2011-10-30T17:25:18Z</published>
    <updated>2011-10-30T18:37:16Z</updated>

    <summary>っつーても1.6～4.0までぼちぼち対応しているって程度。 一般アプリ向け。ゲー...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>っつーても1.6～4.0までぼちぼち対応しているって程度。<br />
一般アプリ向け。ゲームは知らん。</p>]]>
        <![CDATA[<p>・プロジェクトそのもののAPI Versionは最新のもの(今なら14)を指定<br />
・android:minSdkVersionは当然V4<br />
・android:targetSdkVersionは二択。3.x以上の端末でMenuボタンを出したいならV10、腹を括ってモダン設計で行くなら最新のもの(今ならV14)<br />
・android-support-v4.jarを使うのは今時常識。Fragment使わず全部ベタActivityとか使う輩はこの先生mashroomあたわず<br />
・基本的にV4のAPIしか使ってはいけない。それ以上を使う時はリフレクションするかクラスローダの例外を拾ってスタブクラスでゴニョゴニョ。<br />
・V5以上のAPIを使ってもコンパイルは通ってしまう。そのくせV4のマシンで動かすとクラスロード時に死ぬので注意。まあ大抵すぐ死ぬから気づくけど<br />
・V5以上のAPIにある定数は使ってもいいけどxmlはV4互換で書かないとダメ。例えばmatch_parentは使わずfill_parentで書くとか<br />
・drawable-xhdpiとかlayout-xlargeとかは使っていいよ。じゃんじゃん作れ<br />
・values-v11とか書けばその中はどうせv11以上でしか読まれないからその中のxmlは本気出しても良い。<br />
例えばstyle.xmlとかtheme.xmlとかは下位互換用のvalues/style.xmlと最新版用のvalues-v11/style.xmlに分けて後者でHoloを使う<br />
・support-v4とproguardが大ゲンカするので黙らせる<br />
-dontwarn **CompatHoneycomb<br />
-dontwarn **CompatCreatorHoneycombMR2<br />
-dontwarn android.support.v4.view.**<br />
-keep class android.support.v4.** { *; }<br />
・タイトルバーを非表示にする時は要注意。targetSdkVersion=11以上にするとHoneycomb以上でメニューボタン出ないからメニュー押せなくなるぞ<br />
・メニューでは適宜MenuCompat.setShowAsActionを使おう。なんかかっこいいし<br />
・drawableはldpi/mdpi/hdpi/xhdpiの4種類全部用意すること。楽がしたいならhdpiとxhdpiの2種類でもまあ良い<br />
・公式UIガイドラインがコロコロ変わっているのでdrawableに-v11と-v14を作っても良い(Googleを罵倒しながら)<br />
そこまで拘らないなら解像度違いの2～4種類だけでも十分<br />
・shape drawableで作れるものはなるべく画像ではなくshapeを使う。だって楽だし綺麗だし<br />
・layoutはlayout/layout-land/layout-large/layout-large-landの4つはとりあえずフォルダだけでも作っておけ。<br />
全レイアウトに対して4種類用意する必要はないけど心構えとして、ね。<br />
includeやmergeを駆使して記述を最小化するとメンテしやすい→しかしレイアウトエディタ涙目<br />
・RelativeLayoutとかlayout_weightとかを制して目くるめくリキッドレイアウトの世界へ<br />
・string.xmlはvaluesとvalues-jaの2個。当然valuesは英語。下手でも片言でもいいから英語<br />
・theme.xmlはvaluesとvalues-v11に作る。Holoは癖が強いので。<br />
タブレットだとフォントサイズを少し大きめにした方がいいこともあるのでその場合はstyle.xmlだけvaluesとvalues-largeに分ける<br />
・タブレットを想定するとペイン数が変わるためActivityはペインの管理とキー入力などだけを受け持ち、画面のロジックはFragmentに書く。Fragmentはいまや常識<br />
landとportでFragment配置が異なると画面回転が鬼門なので回転して死ぬ時はonCreate内で帳尻を合わせる。<br />
FragmentTransactionをcommitしてもcommitされずステート不正で死ぬことがある。commitという言葉について小一時間語り合いたくなったらexecutePendingTransactions。<br />
・キーボード対応。まあ、一応ね。カーソルキーくらいはちゃんと使えるようにしておくとデキル子だと思って貰えるよ。IS01ユーザとかに。<br />
・SDカードにデータ類を置く時はgetExternalFilesDirをリフレクションで呼び、呼べない時はgetExternalStorageDirectory下の"/Android/data/" + context.getPackageName() + "/files/"を指定する。<br />
Android2.2以上の端末ではアンインストール時に自動的にデータが削除でき、2.1以下では自動削除はされないけどとりあえずGoogleオススメの場所に保存はされる。<br />
・とにかくFragmentがキモ。Activityとはまた違ったライフサイクルを持つので慣れるまではまた苦労させられる。慣れたらすごく便利だよ。</p>]]>
    </content>
</entry>

<entry>
    <title>dalvik VM伝説</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/dalvik-vm.html" />
    <id>tag:www.narazaki.info,2011://2.396</id>

    <published>2011-10-30T15:25:02Z</published>
    <updated>2011-10-30T15:58:37Z</updated>

    <summary>・10秒に1回のFull GCは当たり前。1秒に1回Full GCすることも ・...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>・10秒に1回のFull GCは当たり前。1秒に1回Full GCすることも<br />
・起動と同時にFull GCを連発<br />
・dalvikにとってGC_FOR_ALLOCは一時オブジェクトの確保しそこない<br />
・BitmapFactoryをひと睨みするだけでGC_FOR_ALLOCで止まる<br />
・あまりにFull GCするからGC_CONCURRENTでも止まってない扱い<br />
・オブジェクト1個の生成時間が3フレームに見える<br />
・グッとガッツポーズしただけで5フレームくらい止まった<br />
・1オブジェクト生成で1Full GCはザラ、2回Full GCすることも<br />
・Androidフレームワークが自分で作った一時オブジェクトでFull GCするというファンサービス<br />
・画面タッチと同時にFull GCし、1GHz CPUを追い抜きフレーム落ち成功<br />
・2フレームスキップのFull GCが起こった次の瞬間気づいたらGC_EXTERNAL_ALLOCしていた<br />
・2011年アメリカ１０大事件　第一位「Dalvik VMでGC_CONCURRENT発生」</p>

<p>これだけGC様のご機嫌を伺いながらトリッキーなコード書かされるとC++の方が生産性高いんじゃないかと本気で思うことがある</p>]]>
        
    </content>
</entry>

<entry>
    <title>ぼくがかんがえたさいきょうのあんどろいどせきゅりてぃ</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/post-34.html" />
    <id>tag:www.narazaki.info,2011://2.395</id>

    <published>2011-10-26T15:09:23Z</published>
    <updated>2011-10-26T16:52:58Z</updated>

    <summary>相変わらずミログ騒動のどさくさで審査とか言ってるバカが散見されるんだけどさ。 今...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>相変わらずミログ騒動のどさくさで審査とか言ってるバカが散見されるんだけどさ。<br />
今のAndroid Marketに必要なセキュリティ強化って「フィルタリング」なんだよね。<br />
例えばこういうの。</p>]]>
        <![CDATA[<p>設定でstandard modeとexpert modeを切り替え可能にして、自力でパーミッション管理出来ない人のためにstandardをデフォルトにする。<br />
で、standardモードのユーザはデフォルトのアプリをわざわざ入れ替えたりしないと想定する。<br />
そうするとアドレス帳とかスケジュール表とか発呼とかSMSとかそういう「ヤバイ」系のパーミッションって、確認するまでもなく除外でいい。<br />
だってそんなのを必要とするアプリは使わないはずだもの。<br />
つまりMarketの検索で非表示にしてしまえるんだよね。</p>

<p>以前のエントリでパーミッションって細分化されればされるほど人力で見るのがきつくなる代わりに機械は読みやすくなるって言ったでしょ。パーミッションをチェックするサポートアプリが作りやすくなるよ、とも。<br />
それってもっと進めて考えると、その機能がAndroid Marketそのものに内蔵されてていいわけ。<br />
パーミッションのゴールってここのはず。</p>

<p>ちょっと難しいのはGPSあたりだね。<br />
地図アプリとか乗り換え案内アプリとかだとGPSって必要。これはstandardなユーザでも欲しい。<br />
かといってよからぬ使い方が出来ちゃうのもGPSで、カレログ騒動は言うに及ばず、Android以外でもGPSは無法地帯筆頭になってる(ほんの半月前までは無法地帯筆頭はUDIDだったけど)</p>

<p>ここがねー、難しい。一応考え方としては、特定のカテゴリでだけGPSパーミッションを持つアプリをstandardから可視にする、みたいなのが基本になる。例えば「アプリ→交通、旅行」でだけGPSをstandard可視にする、みたいな感じね。<br />
でもこれだと乗り換え案内アプリくらいならいいけど、例えばマクドアプリで一番近所のマクドを探すとかなんて機能がstandardユーザに提供できなくなっちゃう。ちょっと寂しい。<br />
余所もGPS周りがグダグダになってるのって利便とセキュリティの落としどころが難しいせいだよね。</p>

<p>とするとGPSのパーミッションを2つに分けて、「GPSがONならアプリ側が任意のタイミングでGPSを使えるGPSパーミッション」と「測位の度に確認を出さないと使えないGPS」を作っちゃうとかかなぁ。地図アプリは常時測位してないと困るけど、マクド探しとかは後者で十分なはずだから地図絡みのカテゴリ以外では後者を使わせる。これで裏で測位されることは無くなる。<br />
うーん、でもなんかぱっとしないね。何かいいアイデアあったらGoogleに教えてあげて。</p>

<p>あとは例によってインターネットとSDカードなわけだけど、ここはもう細分化するしかないね。<br />
情報本体へのアクセスをきっちり統制すればインターネットの方はある程度緩やかでも何とかなりそうだけど、SDカードはほんと現状ヤバイ。Androidのセキュリティで一番ヤバイのどう考えてもSDカードだよ。<br />
本家でもissueにはなってんだけどもっとユーザから声を上げるべきだと思う。</p>

<p>それ以外については概ね適切に区分されていると思うし、standardならサーチ不可、expertにすると解禁、でいいんじゃないかな。<br />
あとはGoogleが明らかに身元を保証できるようなメーカーやキャリアやそれに準ずるような企業に対してだけ、Googleがきっちり契約結んだ上で強力なパーミッションを使っていてもstandard可視にする、ってのはありかもね。</p>

<p>ここまでやると、もう人手で審査するとかは出る幕無くなる。人力の審査ってUIガイドラインへの準拠とかをチェックする(いわゆる「クオリティを上げる」)のには良いんだけど、セキュリティ的にはあんまり役に立たないんだよね。どんなシステムでも人力でやるのに向いてるものと向いてないものがあるわけよ。<br />
まあがっつり「解析」すればより踏み込むことも出来るけど、それをバイナリ提出されるたびに全アプリに対してやると審査の人件費で年間何億ドルみたいな世界になりかねない。現実的じゃない。</p>

<p>これ以上踏み込んで規制したいなら結構な犠牲がいる。てゆーかまあ要するに、Googleのパートナー企業以外出品不可、とかになる。この場合でも個別のアプリを審査する必要はない。企業に対していつでもGoogleが訴訟起こせる状態にしておけばいい。<br />
ガラケーがこういう枠組みでやってて、別に個別のアプリが不審な動作してないかとかチェックしてないけど安全なのはそういうことだね。<br />
ただねぇ、これやると法的に拘束しにくい発展途上国の人(例えば中国人)はアプリ公開が困難になっちゃう。保証金でも積ませればいいのかもしれないけど、途上国の人に1万ドル積んで下さいみたいなのも無茶だよね。<br />
Android以外でもそうなんだけど、国際展開しているアプリマーケットだとこういう法的拘束力を担保に安全を保ちましょうみたいな枠組みはちょっと難しい。そこはある程度割り切るしかないんじゃないかな。<br />
日本限定で法人登記なり公的身分証明を前提とするなら別建てのものを日本ローカルでやるのは可能。つまりドコモマーケットとかau one marketとかだね。でもグローバルに適用できる手法じゃあない。</p>

<p>えーと、うん、まとめ。<br />
GoogleはAndroid Marketにパーミッションによるフィルタリング機能を追加して、デフォルトでフィルタリングONにするといいんじゃないかな。<br />
そんだけ。</p>]]>
    </content>
</entry>

<entry>
    <title>ドコモ製Android用メディアプレイヤーのIMEI問題</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/androidimei.html" />
    <id>tag:www.narazaki.info,2011://2.394</id>

    <published>2011-10-19T11:18:03Z</published>
    <updated>2011-10-23T02:26:23Z</updated>

    <summary>音楽・動画 | サービス・機能 | NTTドコモ にわかに話題になっていますが、...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p><a href="http://www.nttdocomo.co.jp/service/developer/smart_phone/service_lineup/music_movie/index.html">音楽・動画 | サービス・機能 | NTTドコモ</a></p>

<p>にわかに話題になっていますが、「どういう時に何の情報が抜かれるのか」が分かっていない人がかなり多そうなので簡単に解説。</p>

<p><span style="color:#ff0000">(*最後に追記しましたが、仕様が追加されたので以下の問題・攻撃シナリオは(恐らく)解消したと思われます)</span></p>]]>
        <![CDATA[<p>■まず、なにが「できない」のか<br />
こちらの方を勘違いしている人が多いので列挙しておきます</p>

<p>・一般のアプリが無許可でIMEIを抜くこと<br />
IMEIへのアクセスにはREAD_PHONE_STATEという許可が必要で、アプリインストール時に許可を取っていないとIMEIにアクセスした途端にアプリがエラーで落ちます。ユーザがREAD_PHONE_STATEを承認しなければ抜けません。<br />
(ただしREAD_PHONE_STATEの説明文が分かりにくいとか、承認範囲をもっと細分化すべきといった指摘はあります。とりあえず今回の問題とは別です)</p>

<p>(追記)ドコモのアプリがインストールされていると、それを踏み台にすることでREAD_PHONE_STATEを無視してIMEIが抜けるという指摘を受けました。その手法を取ればIMEIは抜けます。</p>

<p>・ドコモ製メディアプレイヤーがインストールされていないAndroid端末でウェブアクセスしてきた人のIMEIを抜くこと<br />
本件はドコモ製メディアプレイヤーの仕様バグですので他のAndroid端末は無関係です</p>

<p>■ドコモ製メディアプレイヤーの仕様バグ(セキュリティホール)とは何か</p>

<p>件のメディアプレイヤーは、(ドコモ以外の)外部サイトにアクセスする際、HTTPヘッダにIMEI(端末固有番号)を問答無用で付加して送ってしまう仕様です。<br />
このメディアプレイヤーはOSの制限としてインストール時にREAD_PHONE_STATE承認が必要になるわけですが、困ったことにプリインストールなので出荷時点でドコモが勝手に承認してしまっていることになってしまいます。</p>

<p>■どんな「悪さ」が出来るか(情報漏洩編)</p>

<p>Androidのブラウザアプリは(当然)IMEIを送ったりはしないのですが、ドコモの仕様を見る限りデフォルトで音楽や動画の関連付けがドコモ製メディアプレイヤーに設定されていると考えられます。<br />
つまり、悪用法はこうです。<br />
悪意あるサイトは、Androidでサイトにアクセスされた時に、音楽コンテンツのURLにforwardします。これによりドコモ製メディアプレイヤーを起動しそのURLにアクセスされる(ここまではまともな動作である)わけですが、ドコモ製メディアプレイヤーがHTTP通信する時にヘッダにIMEIを付けて送ってしまう欠陥が存在するため、サイト側はそのアクセスを記録することでIMEIを回収することが出来てしまうわけです。</p>

<p>■どんな「悪さ」が出来るか(なりすまし編)</p>

<p>ドコモはIMEIを使って「悪意のないサイト」に何をさせたかったのでしょうか。それは恐らくガラケーでよくある「簡単ログイン」を意図したものであると思われます。しかしこれは意図そのものが既に重大な欠陥を抱えています。<br />
実はAPIから見える(*後述)IMEIは端末側で変更可能ですし、そもそもhttpヘッダである以上は俺俺Proxyを立ち上げて書き換えることも容易なんです。<br />
しかるにこの欠陥は以下のように悪用可能です。<br />
・まず「情報漏洩編」の手法で他人のIMEIを回収する<br />
・次に「IMEIによるかんたんログイン」を使用して(しまって)いるサイトに対して、盗んだIMEIを自機に設定してアクセス<br />
・その人の権限でアクセスできてうめえｗｗｗｗ<br />
この問題が存在するため、善意のサイトではIMEIを利用しようがないのです(利用するとサイトにセキュリティホールが出来てしまうため)</p>

<p>■つまり?</p>

<p>このメディアプレイヤーのIMEI送信仕様は、悪意あるサイトには多大な利用価値があり、善意のサイトには何の恩恵もない、という壮絶に頭の悪い代物であり、全くのゴミです。</p>

<p>■ユーザサイドの対応策</p>

<p>・ドコモの端末を買わない(あくまでドコモ製プレイヤーの問題であるため)<br />
・ドコモ製メディアプレイヤーをアンインストールする(が、恐らく正常な手法では削除できないと思われる)<br />
・ドコモ製メディアプレイヤーの関連付けを解除し、起動ダイアログが出ても絶対触らない<br />
・ドコモ製メディアプレイヤーの代わりに別の(ダミーの)アプリを関連付けてしまう</p>

<p>3でもいいが単純な解除はできないかもしれません。<br />
4の手法なら恐らく可能で確実性も高いと思われます(実物見ないと分からないですが)<br />
ドコモのプレイヤーと同じIntentに反応する無害なアプリを作ってそれをデフォルトにしてしまえば、勝手に起動することも、起動しようと確認ダイアログが出ることもない......はず。</p>

<p>(追記)<br />
指摘があったので追記。<br />
3/4の方法は悪意のある「サイト」からの攻撃は防げますが、悪意のある「他のアプリ」からの攻撃は防げません。<br />
つまり、悪意あるアプリがREAD_PHONE_STATEを持たないと思って油断してたら、そこからドコモ製メディアプレイヤーを直指定でキックされてしまうと、(悪意あるアプリの作者が管理する)悪意あるサイトにアクセスされてIMEIが抜かれる、という多段式のやり方です。<br />
本当にどうしようもないアプリです。胴元が馬鹿だと手の打ちようがない。</p>

<p>■これはどの程度の「危なさ」なの</p>

<p>これをもって「Android"が"危ない」と勘違いしている人が多いので補足しておきます。</p>

<p>端末またはユーザ固有の番号が確認無しに送られてしまう問題は一般のガラケーに共通する欠陥として既に広く知られています。ガラケーの特性上成りすましはしにくいですが、デフォルトのブラウザで送りまくるためプライバシー問題は完全死亡です。</p>

<p>iPhoneの場合、ブラウザからのアクセスは安全ですがアプリの方でiOS4までUDID(端末固有番号)が確認無しで取得可能で、「悪用禁止だからな!!悪用禁止だからな!!」と言われながらかといってこれで審査落とされません。あまりに悪用されたため遂にiOS5から使用禁止になりました。<br />
ソフトバンク製アプリがUDIDをかんたんログインに使って成りすまし放題になり、高木先生に突っ込まれまくったのも今や懐かしい思い出です。</p>

<p>Androidの場合、ブラウザからのアクセスは安全で、アプリの方もOS1.6から確認が必須です。<br />
ところがこの確認はプリインストールのアプリに対しては適用外なので、「ドコモが」致命的なセキュリティホールを持つアプリをプリインストールしてしまうなどという状況は想定外です。<br />
この結果、ガラケー脳丸出しのドコモのせいで、ガラケーどころか成りすませるだけガラケーよりなお悪い、という素敵な状況になろうとしています←いまここ</p>

<p>ドコモ担当者の方は、何故Android端末でアプリがIMEIを取得するのにユーザに承認を必要とするのか考えて下さい。先人の失敗を繰り返さないためにわざわざ施された布石を見て、なんか邪魔なものがあるからどけよう、としか思わなかったのですか?<br />
まだプリインストール端末がリリースされていないので、今のうちに仕様が変更される必要性を強く訴えます。</p>

<p>(更に追記)<br />
(Q)IMEIって変更できるの?<br />
(A)ハードウェアに記録されているIMEIを書き換えることは(通常は)困難です。<br />
しかしメディアプレイヤーはAndroid FrameworkのAPIを介して取得しているわけですから、ベースバンドが返すIMEIが変更できなくとも、rooted端末やカスタムROMでAPIが嘘のIMEIを返すようにしてしまえば事足ります。<br />
こうなると古いiOS JB端末のUDID偽造問題と同程度まで落ちてしまいます。<br />
もっともドコモの仕様を見る限りAPIを騙すよりHTTPヘッダを透過Proxyなどで改変した方が話は早そうですが。</p>

<p><span style="color:#ff0000">(10/20追記)</span><br />
先ほど<br />
<blockquote>ただし、PlayReadyRのライセンス取得を行う通信では、以下となります。（ライセンス取得には、都度ユーザの許諾が必要です。）</blockquote><br />
との記載が追加されていました。<br />
これって送信先はMSのみという認識でいいんですかね。<br />
PlayReadyの仕様が分からないので俺には何とも言えません。分からんので俺はこれ以上突っ込みません。</p>]]>
    </content>
</entry>

<entry>
    <title>AppLog問題とAndroidのセキュリティ</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/applogandroid.html" />
    <id>tag:www.narazaki.info,2011://2.393</id>

    <published>2011-10-15T11:14:32Z</published>
    <updated>2011-10-16T23:17:42Z</updated>

    <summary>もうほとぼり冷めたかな。AppLogの件とAndroidのセキュリティ問題につい...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>もうほとぼり冷めたかな。AppLogの件とAndroidのセキュリティ問題についての雑感。<br />
まず、個人的には個人情報を集めるビジネス自体は「悪しき」ものではないと思ってる。まあオプトインが適切に行われていなかった問題については後述するとして、これはもちろんオプトインが適切に行われていたらの話だ。</p>

<p>以下長文なので引き返すなら今だ。<br />
</p>]]>
        <![CDATA[<p>リサーチ会社は情報を集めたがるし、アプリ作者は開発費を回収したいし、ユーザはタダでアプリを使いたい、全てのプレイヤーが同意のもとに行うのであればこれはwin-winのビジネスだ。<br />
だいたいこれで文句を言うプレイヤーはユーザなわけだけど、オプトインで同意のもとにやるのであれば拒否すればいいだけの話であって、たかだか数ドルのアプリを乞食するために自分の個人情報を売る選択を自らしたんだから文句言うのは筋違いだ。大体ユーザがみんな99セント～数ドルの金をチャリンと払うような文明的人類ばかりであればこんな情報売買ビジネスは不要だってばよ。みんな金払え。<br />
というわけで、「きちんと同意のもとに行われるのであれば別に問題はない」わけだ。おわかり?</p>

<p>まあ実を言うとだね、ネットワークを使用するアプリはまず多かれ少なかれあなたをトラッキングしてる。AdSenseにしてもGoogle Analyticsにしてもまあ何にしても。<br />
これはブラウザのトラッキングクッキー並くらいに留めるのが良心的なやり方なんだけど、まー結構線引きギリギリだよね。一歩踏み外したらIMEIとか電話番号とかメールアドレスとかに行っちゃう悪い子もいるし、そういうのってAppLogみたいに自分からいちいち取ってますとか言わないもん。</p>

<p>それはそれとしてAppLog的なるものに戻るけど、ちゃんとやるなら結構良心的な部類だと思うんだよね。<br />
この辺の「乞食向けアプリのマネタイズ方法」としては古典的には、オプトインでメールマガジン(と称する要するにSPAM)に同意させるとか、ブラウザにスパイウェア(JWORDとか)を仕込むことを同意させるとかいうのが「合法な」手段として確立している。でもこれってかなり「うざい」よね。そういう意味ではAppLogのように統計情報の提供というのはある種の視聴率調査みたいなものでダメージは比較的少ないし楽な方だと思う。<br />
ああ返す返すもちゃんと同意取ってたらの話だよ。ここ誤読されたくないから何度も言います。</p>

<p>逆に、AppLogくらいの「ぬるい」取り方の情報でどの程度金になるのか?という点の方が気になるんだけど、その辺何か目途は立ってたんすかね。<br />
で、こういうのがちゃんと軌道に乗れば、少なくとも秘密裡に情報抜いてマネタイズしよう、という奴らをギリギリ合法の世界に押し返すことが出来る。だってAppLogだか何だかに任せれば違法なことしなくても乞食向けアプリで開発費が回収できることになるわけだから。そういう意味ではJWORDなんかも社会的な意義はあった(あ?俺?JWORD入りアプリなんて使うわけねーだろ。乞食用だってばよ)</p>

<p>じゃあ何が本質的問題なのかというと、要するに「ユーザの意思に反して」やること。何が悪ってこれが悪。<br />
AppLogについてはなんつーか、純粋に間抜けなだけだと思うんだよね。だって本当に悪さする気があったら最初からこっそりやるもん。技術があまりに未熟で、企画があまりに未熟だった。とてもじゃないけど個人情報なんて劇物で合法に火遊びできるような能力をミログ社は持っていなかった。これ自体は批判されて然るべきだけど、でもそれは「お前は馬鹿だ」であって「お前は悪党だ」とは違う。ああ、まあ、事後対応が不誠実だったってのも問題だけど。<br />
むしろ深刻に問題なのはapp.tvの方でこっちはほとんど弁護の余地がない。<br />
AppLog問題を語る人の少なからずがこの辺の区別が出来ていない=根本的に理解していないのは頭の痛いことだ。<br />
そしてもっと頭が痛いのは、app.tvみたいなアプリがスマフォ界ではフツーにはびこってるので、app.tv単体の問題に矮小化しても事態は悪いままってことなんだけどね。</p>

<p>技術的な話に移る。AndroidはOSとしてどうあるべきか。</p>

<p>根本的にこの問題はスマートフォンなら必ず付いて回る問題。<br />
でもって解決法なんだけど、まずバイナリに対して静的な審査で何とかするとかいうのは論外。これはもう技術的に無理。そんな静的監査があったらプログラミング界の賢者の石だよ......。で、それで何とかなると(非技術者には)思われている某フォンについては横に置こう。<br />
なので真っ当なメカニズムを考えるんだけど、とりあえずどう転んでも必要になるのが動的なAPI監査いわゆるサンドボックス化。まあくだけた言い方をするとOSレベルでセキュリティソフトが内蔵されてるようなもんだね。不正な動作は究極的には実行時にブロックするしかない。</p>

<p>Androidでは既にサンドボックス化は行われている。これ「Javaだからサンドボックスなんだ」と思ってる人が時々いるけど、ネイティブ処理も含めて全部サンドボックスの保護下にあるよ。ネイティブコード書けばパーミッション突破できるんじゃ意味ないからね。<br />
ところがこのサンドボックス、他の例えばiアプリとかと比べると結構ユルい。いや禁止された処理が出来ちゃうって意味ではないよ。そこはちゃんと堅牢。問題は、禁止されてるんだけどユーザの許可(パーミッション)を得れば出来てしまうって処理が結構ヤバイもの多くて、しかもその許可の取り方が非常に大味なことにある。<br />
まあこの辺、許可さえ取ればヤバイ処理も出来てしまうってのはスマフォという特性上仕方ない面もある。そういう強力な便利アプリが使えなきゃガラケーでiアプリでいいじゃんって話になっちゃうからね。</p>

<p>で、パーミッションが大味な問題なんだけど、これは結構テキトーな作りになってる。インターネットの使用許可と言ったらサーバにもクライアントにもなれるしどことも通信出来てしまう、3G通信の状態を取ろうとするだけで電話番号まで取れるような許可を出さないといけない、SDカードアクセスは書き込み許可を出すと全領域許可になりしかも読み出し不可にする設定が出来ない、などなど。なんかもう深く考えて設計されたんだろうかという疑問を禁じ得ないところが散見される。プロセスリストが取れちゃうのはUNIXだと結構仕方ない気がするけど......。</p>

<p>特に問題とされているのはインターネットの使用許可があまりにall or nothingすぎること。開発者の間でも昔からGoogleに要望上がってるネタとして、通信先に応じて許可不許可を出せるような仕組みにして欲しいってのがあって、平たく言うとパーソナルファイアウォールを搭載(っつかLinuxに内蔵されてるのを有効化)してそれをパーミッションシステムと連結してくれたらサイキョーじゃんって話なんだけど、なんかずっと黙殺されてる。みんなも騒ごうぜ。<br />
これがあると、twitterアプリなのでtwitterサーバとだけ通信→セーフ、広告入りFacebookアプリなのでFacebookサーバとAdMobサーバとだけ通信→セーフ、mixiアプリだけどmixiサーバと良く分からない中国のサーバに通信→アウト!!、みたいに出来るんだよね。</p>

<p>他には実は、アプリが他のアプリに対してパーミッション付きで機能を公開するって機能があって、これはすごく強力な機能なんだけどイマイチ使われてない。<br />
これだと例えば、Google謹製のAdMobアプリを端末に1個だけ入れて、AdMobアプリはネットワークの使用許可を取り、かつAdMobアプリは「広告の表示」というパーミッションを(他アプリに対して)パーミッション付きで公開、AdMobを利用するアプリはネットワークの使用許可を「取らず」に、AdMobアプリに対する「広告の表示」というパーミッションで確認を出す、みたいなことが出来る。<br />
これだと何が嬉しいか。AdMobアプリがGoogle謹製ってとこだけ確認しておけばAdMobアプリの通信はまあ信用できるよね。一方AdMobの広告を表示するアプリの方はGoogleと比べれば信用度は落ちるのが実情。でも上記方式だと「AdMobアプリ経由で広告を取得する」許可しか出さないので、アプリの挙動としてAdMobサーバとしか通信しないことを保証できる。そしてアプリは悪いことしてませんという潔白を示せるわけだ。</p>

<p>ただこれ結局使われてない。多分今後もあんまり使われないと思う。MOTTAINAI......。<br />
使われない理由としては、まず別途AdMobアプリを(最初の1回だけとはいえ)インストールしないといけないこと、これは今のAndroid Marketのメカニズムとして「このアプリが必要なので先に入れてね」という依存性解決が出来ない(1個ずつ明示的にインストールすることしか出来ない)こと。<br />
早々にインターネットアクセスを求めるアプリが氾濫してしまい、インターネットアクセスを求めるアプリが忌諱されないような文化が出来てしまったこと。<br />
この辺が挙げられると思う。うーん、残念。</p>

<p>パーミッションを細かくしすぎると見るのがきつくなるって意見もあるんだけど、それって実はあんまり本質的じゃない。<br />
何故かというと、パーミッションが細分化されればされるほど、ヤバいパーミッションは機械的に判断付くようになるから。動的監査項目に対して静的チェックが出来る、みたいな。<br />
つまり、平たく言うとパーミッションを大ざっぱに眺めて「この組み合わせやばそうだよ」とか「この通信先の中国のサーバ、ブラックリストに入ってるからアウトだよ」とか「このアプリは電話帳アクセスするけど有名なアプリで署名もあってるから大丈夫そうだよ」とかをチェックしてくれるようなサポートアプリが簡単に作れるようになる。<br />
っていうか実は今よくあるAndroid用のセキュリティアプリってまさしくこういう動作をしているんだけどね。あれって平たく言えば「あなたの代わりにパーミッションを確認してくれるアプリ」だよ。</p>

<p>長々と書いちゃったけど総括。<br />
AppLogについては「あんな難しいサービスは馬鹿には無理」というのが俺的結論。ただ、(セキュリティの専門家が懸念することも分かるけど)個人的にはビジネスとして「ユーザを騙さない」という鉄則を守るのならば、有意義な(少なくとも必要悪の)サービスとして許されるべきだと思う。<br />
Androidのセキュリティ機構については開発者の間では常識的な話だけどざっくりと書いてみた。まあ一応サンドボックスはあるしそれなりに頑張ってる機構ではあるんだよ。Marketがあれだけフリーダムなのに実被害の事例がほとんどないとか、BlackHatでの報告で審査のあるはずの某Storeの方が倍ほど酷いとかは、まあ今の仕組みでもそれなりの防御にはなっているということではある。<br />
一方でじゃあAndroidのセキュリティ機構が十分かというと正直まだまだ上が狙えるはずなのも確か。そして問題点に対してGoogleの動きもイマイチ鈍いことも確か。エンドユーザ各位におかれましては、Marketに審査を導入しろみたいな愚かなことを主張するのではなく、パーミッションをより徹底的に細分化すべきであるといった方向で騒いで頂ければ幸い。</p>

<p>おまけ。<br />
上記ではフレームワークレベルの話しかしてないけど、実はシステムにバグがあった時に任意コードの実行に繋がりやすい問題についてはAndroidはあまり優秀ではない。というかだいぶ悪い。最近はちょっと改善してきてるけど根本的にメモリ節約機構が権限昇格耐性低い構造になってる。<br />
この辺はえらい人の講演がトゥギャられてるはずなので興味ある人はググってちょ。<br />
そういえばWindows8でも重複メモリ節約機構が入るらしいけどどうやって問題を回避してるだろうね(もしくはそもそも回避していないのか)</p>

<p>(追記)<br />
なんかiPhoneに喧嘩売ってるみたいに取られたので蛇足な記述を削除。<br />
審査が無意味であるという考え自体は変わってません(というか色々話を聞くとその確信は深まった......)</p>

<p>それとAndroidでは、現在実行中のプロセスを取得する、という処理をするアプリはインストール時に確認が出ます。AppLogなりapp.tvなりでもインストール時に怪しい確認は出ます。「Androidの」セキュリティホールだと思ってる人がいるようなので一応追記。<br />
むしろ許可項目ゼロで通報君Zが作れてしまうことの方が実はAndroid的には問題だったりする......。インストール済みアプリの一覧は許可なしに取得できてしまうんだよね。</p>]]>
    </content>
</entry>

<entry>
    <title>HoneycombのOptionsMenuの仕様がクソい</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/honeycomboptionsmenu.html" />
    <id>tag:www.narazaki.info,2011://2.392</id>

    <published>2011-10-15T10:32:20Z</published>
    <updated>2011-10-15T10:41:25Z</updated>

    <summary>HoneycombではMenuボタンを廃止しActionBarのボタンに移動させ...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>HoneycombではMenuボタンを廃止しActionBarのボタンに移動させる方向で対応が行われている。<br />
ただしtargetSdkVersionを11未満を指定して作られたpre HoneycombアプリはSystemBarにMenuボタンが表示されることで互換性が保たれる。<br />
</p>]]>
        <![CDATA[<p>ところがtargetSdkVersionを11以上に指定するとMenuボタンを表示する手段が存在せず、ActionBarを非表示にしてしまうとOptionsMenuを出す手段がなくなってしまい、自力で別途ボタンを用意する必要がある。<br />
pre Honeycombのビューア系アプリではNotificationBarとTitleBarを両方非表示にして表示領域を大きく取るのが一般的であるが、Honeycombでは(ハードキー相当のSystemBarはともかくとして)TitleBarに相当するActionBarを消してしまうとMenuを押す手段がなくなってしまう。</p>

<p>このため、Honeycombアプリでは以下の3通りの対応から選択する必要がある。<br />
(1)ActionBarを必ず表示する<br />
(2)ActionBarを非表示にした画面ではOptionsMenuを使わない<br />
(3)targetSdkVersionを11以上にしない(SystemBarにMenuボタンが出る)<br />
各所でも(3)のwork aroundが公然と勧められている。<br />
Honeycomb APIの重大な失敗の一つに数えて良いだろう。</p>]]>
    </content>
</entry>

<entry>
    <title>Honeycombのandroid.widget.Scroller</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/honeycombandroidwidgetscroller.html" />
    <id>tag:www.narazaki.info,2011://2.391</id>

    <published>2011-10-15T10:22:50Z</published>
    <updated>2011-10-15T10:31:46Z</updated>

    <summary>Scrollerを使ってflingを実装する場合、Pre Honeycombでは...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>Scrollerを使ってflingを実装する場合、Pre Honeycombでは指定されたVelocityでスクロールした後min/maxで設定した境界面にぶち当たってピタッと止まる。<br />
Honeycombではmin/maxの境界面が近すぎる場合、衝突までの時間で減速して止まるよう勝手に逆算してVelocityを改変してしまう(ようだ、ソースが公開されていないから挙動からしか推測できないが)<br />
このため、Pre Honeycombではスイッピタッと止まるところで、Honeycombではいきなり重油の海を泳いでるみたいに減速して全てが軟着陸になってしまう。</p>

<p>ださい。</p>]]>
        
    </content>
</entry>

<entry>
    <title>(メモ)NotificationのPendingIntentをFLAG_ACTIVITY_SINGLE_TOPで投げる時の挙動</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/10/notificationpendingintentflag-activity-single-top.html" />
    <id>tag:www.narazaki.info,2011://2.390</id>

    <published>2011-10-15T10:01:19Z</published>
    <updated>2011-10-15T10:22:02Z</updated>

    <summary>NotificationにPendingIntentを投げる時、 intent....</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>NotificationにPendingIntentを投げる時、<br />
<blockquote>intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);</blockquote><br />
のようにフラグを付けることで既存のActivityに対してIntentを投げることが出来る。<br />
受け取り側のActivityは(onCreateではなく)<br />
<blockquote>protected void onNewIntent(Intent intent)</blockquote><br />
を適切にオーバーライドしてIntentを受け取る。</p>

<p>1つのアプリが複数の種類のIntentを持つ場合、notifyの第一引数(int id)によって区別される。</p>

<p>PendingIntentを更新したい時はPendingIntent.getActivityの第4引数(int flags)にPendingIntent.FLAG_UPDATE_CURRENTを設定すると同じidの通知を上書き出来る。<br />
</p>]]>
        <![CDATA[<p>ところがPendingIntentの「同一性」はnotifyとは別の基準で行われており、具体的に言うと他の情報が全く同じでputExtraだけが違うPendingIntentを作ると情報が混ざってしまう。</p>

<blockquote><pre>
intent1.putExtra("id", 1);
PendingIntent pending1 = PendingIntent.getActivity(... //intent1をセット
Notification notif1...//notif1にpending1をセット
notif_manager.notify(1, notif1);
intent2.putExtra("id", 2);
PendingIntent pending2 = PendingIntent.getActivity(... //intent2をセット
Notification notif2...//notif1にpending2をセット
notif_manager.notify(2, notif2);
</pre></blockquote>

<p>こうすると、通知ID1と2の通知が作られて2つの通知が表示されるが、pending1とpending2は同じものとみなされてpending1の情報は2で上書きされてしまう。このため、通知1も2もpending2が起動されてしまう。<br />
なんだそりゃ。</p>

<p>解決法。<br />
putExtra以外で区別できる情報を付けてやる。<br />
具体的にはIntentにsetDataで異なる(IDを含むダミーの)Uriをセットしてやると区別してくれるようになる。<br />
同一性チェックにExtraも使っていると思っていたので結構はまってしまった。<br />
考えてみればここには様々なObjectが入る、つまりequalsが実装されているものしかないとは限らないわけで、仕様としては分からんでもない。どっかに書かれてるのかもしれないけど見つけられなかった。</p>]]>
    </content>
</entry>

<entry>
    <title>俺的Honeycomb大予想 中間反省会</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/02/honeycomb-1.html" />
    <id>tag:www.narazaki.info,2011://2.389</id>

    <published>2011-02-19T04:02:59Z</published>
    <updated>2011-02-19T04:16:59Z</updated>

    <summary>俺的Honeycomb大予想 - oops 以前こんなエントリを書いたわけだけど...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p><a href="http://www.narazaki.info/2011/01/honeycomb.html">俺的Honeycomb大予想 - oops</a></p>

<p>以前こんなエントリを書いたわけだけど、大体Honeycombの概要が表に出てきていて、その次のIceCreamの話題も出てきているので俺内中間反省会をしてみる。<br />
</p>]]>
        <![CDATA[<p>◆Honeycombはタブレットとスマートフォン共通のメジャーアップデートとなるであろう</p>

<p>ほぼ外れ。<br />
厳密に言うとHoneycombはタブレット限定というわけではなくメーカー判断でスマートフォンに搭載することも当然ありなわけなんだけど、今のところ出てきている情報ではGoogleはスマートフォンについてはHoneycombを載せずにGingerbreadで待ってIceCreamまで飛ぶことを推奨するようなので、まあ外れと言っていいかな。<br />
俺の見立てでは、新APIに合わせてタブレット・スマフォ両対応の標準アプリをHoneycomb時点でリリースがプラン1、タブレットのみ先行対応した標準アプリをリリースしスマフォ向けには旧標準アプリをそのまま添付して選択式にしてHoneycombとするのがプラン2、で進捗が遅れてもプラン2かなと思ってた。<br />
Honeycombも2.x以下のアプリはそのまま上位互換とされているし、Gingerbreadで待たせるまでもなく上記プラン2の方がメンテ効率も良いはず。</p>

<p>そうなっていないのはそれなりの理由があると思われる。まぁ、Honeycombの完成度が相当低くて不安定だとか上位互換に問題が残っているとか、そういうことなんだろうと予想する。それでもタブレットでGingerbread動かすよりは標準アプリの強化の分だけ良好なエクスペリエンスになるが、スマフォではそれなりに安定したGingerbreadを使った方がマシ、なのだろう。</p>

<p>その間を埋めるために出てくるのが恐らくStatic Fragment Libraryで、結果的に見れば穏当なマイグレーションプランを選んだとも言えるかもしれない。</p>

<p>この辺の予想が外れたのは俺が想定していたよりもGoogle内でHoneycombの進捗が思わしくなかったのだろうなと。</p>

<p>■Honeycomb新UIに関する予想<br />
◆OSの根幹部分は完全互換で共通となるであろう</p>

<p>これは当たったというかなんというか。当たり前のとこしか当たってないというか。<br />
当時GIZMODOなんかは2.xと3.xが別々のブランチになるとか言い張ってたけど、もちろん技術者視点で見ればそんな展開あるわけないのは自明で、それ以上でもそれ以下でも無かったな。</p>

<p>◆標準アプリはブランチするのか　→　予想「しない」</p>

<p>これはまだ確定ではないけど多分当たってると思う。<br />
Fragment APIが出たので1ソースでスマフォとタブレット両対応した統合リリースにしてくると思われる。ただその統合時期はIceCreamということになるけど。</p>

<p>■新API予想<br />
◆マルチカラムUIのための新Activity機構<br />
◆シングルカラムUIとマルチカラムUIの単一ソース管理</p>

<p>Fragment APIがまさにそれだけど、これは当たって当たり前のものが当たったくらいかな。まだFragment APIを細かく追ってないのでどの程度使い勝手がいいのかは分からない。</p>

<p>■予想される問題<br />
新APIが3.0以上になることで2.xとの間に重大な非互換が発生するのではないかという懸念があったのだけど、Static Fragment Libraryがリリースされるようなので何とかなりそう。<br />
これは俺が想定していたよりも良い対応で、逆に言うとこれが出るのならAndroid 3.0標準の新APIを使う意味ってどんだけあるねんという疑問すら沸く。</p>]]>
    </content>
</entry>

<entry>
    <title>HoneycombエミュでListPreferenceが糞動作するので追ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/01/honeycomblistpreference.html" />
    <id>tag:www.narazaki.info,2011://2.386</id>

    <published>2011-01-27T07:23:46Z</published>
    <updated>2011-01-27T08:25:13Z</updated>

    <summary>Honeycomb SDKのプレビューが出ていたので早速Tuboroidが動作す...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>Honeycomb SDKのプレビューが出ていたので早速Tuboroidが動作するか見てみたんですよ。<br />
結論から言うと、ListPreferenceの動作が変わっていたために設定画面に入ると落ちました。互換性にはそれなりに自信があったので「ええー!?」とか思ったんですよ。<br />
もしかしたらAPIの使い方を勘違いしていたのかと思いました。ところがですよ、これがですよ、公式ドキュメント読んでもさっぱり分からない。</p>

<p>そこで、どの部分で落ちているかを追ってみたわけですよ。</p>]]>
        <![CDATA[<p>AA縮小率の設定をするところで「Resize 60% for thread a entry body which seems AA」とかSummaryのとこに表示しています。ここのロジックは前もって「Resize %s for a thread entry body which seems AA」というstringリソースを用意しておいて、表示初期段階とOnPreferenceChangeListenerが呼ばれた時にString.format使って%sのとこにgetEntry()を入れるような処理をしているわけですね。<br />
ところがですね、例外で出てるエラーはUnknownFormatConversionExceptionで「%fなんか知らない」とか言ってるんですよ。ハァ?</p>

<p>意味わかんないのでAOSP最新ソースを追ってみました。<br />
PreferenceActivityを初期化する時にListPreferenceのgetSummaryを呼んでSummaryの表示内容が更新されています。<br />
ところが<strong>なんとListPreferenceのgetSummaryには既にsetSummaryされた文字列をString.formatのフォーマットと見なして第一引数にgetEntry()の内容を渡すというロジックが既に存在していた</strong>のです。<br />
これは明らかにおかしい。<br />
公式ドキュメントによると<strong>ListPreferenceのgetSummaryはオーバーライドされておらずPreferenceからそのまま継承されていると明記されている</strong>し、<strong>そもそもformat文字列とstatic文字列は全く別物であり混同することは厳禁である(インジェクションの元になる)もの</strong>なのだから、俺はたいそう混乱しました。</p>

<p>ちなみに、getEntry()を差し込んでくれるのは初期化時だけで設定変更時に反映してくれないという驚くべき糞実装で、これを見た瞬間に俺は支配人を呼べとtweetしたんですが、他の点でもっと論外すぎたので今となってはどうでもいいです。</p>

<p>さて、とりあえず公式ドキュメントが古くてコードが正しいのだろうと、AOSPコードに合わせてTuboroidを修正してみたわけですよ。<br />
ところがですね、Honeycombエミュでちゃんと動くようになったかと思ったら、<strong>Gingerbreadエミュでは公式ドキュメント通りの動作</strong>をしてしまって思うように動作しないんですね。<br />
すごく嫌な予感がしますよね。</p>

<p>AOSPのヒストリを追ってみました。<br />
このパッチは<a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=commitdiff;h=ba636df784398e4cd56f2982de63973ef6cd44fb">2010/07/13にmasterにコミットされていました</a><br />
いやちょっと待てよ、ますますおかしい。まず第一に<strong>こんな糞非互換パッチが半年も前に平然とコミットされるとかレビュアーは何をしていたんだ</strong>ということ、第二に<strong>Gingerbreadより遥かに前なのに何故Gingerbreadエミュには入っていないのか</strong>ということ。<br />
更に追うと、<a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=history;f=core/java/android/preference/ListPreference.java;h=f842d754cbb6e6cb5b9744e9a59437da572b11a6;hb=6bcc7a7e5fc5a2340c4f060141bec9d181454807">Gigerbreadのツリーにはこのパッチは含まれておらず(ハァ?)</a>、またエミュのListPreferenceをリフレクション使って探ってみたところgetSummaryはListPreferenceでオーバーライドされていない(=パッチが含まれていない版でビルドされている)ことが分かりました。<br />
更にHoneycombエミュでも同様にリフレクションで探ってみると、こちらは確かにListPreferenceでオーバーライドされていました。つまりパッチを含む版でのビルドでした。</p>

<p>Nexus Sでも、またCyanogenModでも、このパッチはどうやら意図的に外されているようで、ListPreferenceでのオーバーライドは有りません。<br />
ただ、当時の<a href="http://code.google.com/p/cyanogenmod/issues/detail?id=1948">CyanogenModでmasterを取ってきてしまったせいかこのトラップを踏んづけてIssue投げられた形跡</a>が有ります。<br />
<a href="https://github.com/CyanogenMod/android_frameworks_base/blob/gingerbread/core/java/android/preference/ListPreference.java">現在のCyanogenModでは外されているよう</a>です。</p>

<p>つまりこういうことなのでしょうか。<br />
この非互換の糞パッチはレビュアーの目をかいくぐって半年前にmasterにコミットされ、当時のCyanogenModにIssueを発生させるという被害を出しました。<br />
ところが何故か(......まあ糞パッチとみんなが気付いたのでしょうが......)この糞パッチはエミュでも実機でもリリースバージョンには含まれませんでした。当時は2.2がリリースされたばかりでしたが、2.2にも2.3にもブランチに含まれていません。<br />
公式ドキュメントでもこのパッチは完全に黙殺しており、パッチのない状態でドキュメントがリリースされています。<br />
ところが今の今になってHoneycombをビルドした際に、恐らく特に疑いもなくmasterからビルドしてしまったのでしょうね、この忘れ去られた糞パッチが混入してしまったのでしょう。</p>

<p>結論。<br />
Googleはmaster上からこのパッチをrevertすべきだと思います。</p>]]>
    </content>
</entry>

<entry>
    <title>俺的Honeycomb大予想</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2011/01/honeycomb.html" />
    <id>tag:www.narazaki.info,2011://2.383</id>

    <published>2011-01-07T06:58:12Z</published>
    <updated>2011-05-13T06:54:26Z</updated>

    <summary>内部情報とか全く持ってないヒラAndroid開発者である俺がHoneycombを...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>内部情報とか全く持ってないヒラAndroid開発者である俺がHoneycombを大予想してみる。<br />
現時点での最新情報はこの辺<br />
<a href="http://japanese.engadget.com/2011/01/05/android-3-0-honeycomb-ui/">動画：Android 3.0 " Honeycomb " 紹介、タブレット最適化UI デモ</a><br />
<a href="http://www.gizmodo.jp/2011/01/3dosandroid_30.html">3Dで超かっこいい！　グーグルの新タブレットOS「Android 3.0」が全貌公開（動画） : ギズモード・ジャパン</a>(イタコ注意)</p>

<p>ほんとは<br />
<a href="http://japanese.engadget.com/2011/01/03/android-honeycomb/">Android " Honeycomb " はデュアルコアのタブレット限定、既存製品からアップグレード不可？</a><br />
この記事を<strong>誤報ではないか</strong>と大予想してやろうと思ってたんだけど<br />
<a href="http://japanese.engadget.com/2011/01/06/android-3-0-honeycomb/">Android 3.0 Honeycomb に必須プロセッサ要件なし、開発者が証言</a><br />
俺がブログに書く前にGoogleの中の人に否定されて誤報確定してしまった。ちぇ。</p>

<p>以下、繰り返しになりますが内部情報とか全く持ってない一般のAndroid開発者・ウォッチャーの意見です。</p>]]>
        <![CDATA[<p>■Honeycomb(Android 3.0?)はタブレットとスマートフォン共通のメジャーアップデートとなるであろう<br />
つまり「タブレット専用になる」とされている報道は誤報であろうと予想</p>

<p>その理由<br />
(1)ブランチする利点が見当たらない<br />
　タブレット用とスマフォ用にブランチするとGoogle側の開発コストが大幅に増大する。また、もちろん開発者側のコストも増大する。<br />
　Honeycombの「タブレット向け新UI」部分はコード全体で見ると極一部であり、恐らく98%だの99%だのが結局共通になる。つまり、同じコードベースでビルドオプションとしてタブレット向けとスマフォ向けの切り替えを行う方が簡単である。</p>

<p>(2)既にGingerbreadにタブレット向け対応が入り始めている<br />
　「Honeycomb=タブレット専用説」では「Gingerbread系列」がスマフォ専用となるとされているが、実のところGingerbreadで既にタブレットを想定した対応が追加されている。具体的には従来7インチまでの対応だったマルチ解像度対応APIが10インチ強まで拡張されている。このためGingerbreadはスマフォ専用ではなくスマフォ・タブレット両対応のOSのロードマップ上にいると考えられる。<br />
　ちなみに俺的にはHoneycombでは13～14インチ(xx-large?)まで拡張されると予想している。</p>

<p>(3)先月、Andy Rubin神がHoneycombは両対応であると明言している<br />
　ここ1か月でブランチが決まったとするとロードマップは破滅的な変更に見舞われたはずで、逆説的に考えると順調に進んでいるHoneycombの状況から見てそんな激震が起こったとは考え難い。</p>

<p>(4)総括<br />
　以上から、GingerbreadとHoneycombは単一のロードマップ上に位置しており、Gingerbreadは単にHoneycombの前身である、と予想する。<br />
　経緯から見てもGingerbreadでの更新内容から見ても、開発が遅れたため先行リリース出来る部分だけ切り出してGingerbreadとしてリリースし、(本来Gingerbreadとして出すつもりだった)Honeycombを後から出す、という流れと考えた方が自然だと思われる。</p>

<p>■Honeycomb新UIに関する予想<br />
(1)アプリ単位での対応である<br />
　動画で新ホームや新ブラウザや新Gmailが出てきているが、これらは元々OSそのものというよりバンドルされた単なる標準アプリである。<br />
　恐らく多くの標準アプリが新UIに合わせてリライトされるが、OSの根幹部分は完全互換で共通となるであろう。</p>

<p>(2)標準アプリはブランチするのか<br />
　これらのアプリの作り方は2通り考えられる。<br />
　1つはスマフォ用アプリとタブレット用アプリを別々に開発してどちらかを標準バンドルするという形。これはつまりOS基幹部は共通であるが標準アプリはブランチするということになる。<br />
　もう1つはスマフォ用もタブレット用も単一ソースで開発してビルドオプションやリソース設定で切り替えるという形。iPhone/iPadで言うところのユニバーサルアプリに似ている(それにしてもこの呼び方はどうかと思う......)</p>

<p>　「Androidらしい」のは後者であると考える。<br />
　多解像度対応などで単一ソースのリソース切り替え対応というのは今でも常套手段である。各アプリもUI部分を除けば内部処理はどうせ共通のはずでブランチして2倍のメンテコストが掛かるより、ユニバーサル化して1.2倍くらいのメンテコストになった方が幸せである。<br />
　標準アプリはAOSPベースでも30個くらいあるのでこれを全部ブランチして二重メンテする愚は犯さないのではないだろうか。<br />
　また後述の新API予想にも関係する。</p>

<p>■新API予想<br />
　これは<a href="http://www.narazaki.info/2010/11/gingerbread.html">Gingerbreadの予想</a>を書いた時の蒸し返しになる。</p>

<p>(1)マルチカラムUIのための新Activity機構<br />
　これは今度こそ必須になる。現在のActivity機構では新Gmailのようなアプリは(シングルカラムアプリが楽勝なのと比べると)作りにくい。<br />
　これはActivity機構の根幹に関わるため、大幅な強化が来ると思う。というか、来てくれないと即ち「力技で書いてね☆」という意味になるので、アプリ開発者としては大変困る。<br />
　現行でも複数のActivityを管理する(タブなどで使われている)ActivityGroupというクラスはあるが非常に使いにくいので、マルチカラムを「ちゃんと」管理するためのActivity機構は必須であると思われる。</p>

<p>(2)シングルカラムUIとマルチカラムUIの単一ソース管理<br />
　上で述べた標準アプリを単一ソース管理する場合、Activity部分のソースを二重管理するというのは筋が良くないしAndroidらしくもない。賢明なGooglerの皆さんがそのような愚かな管理方式を採用するはずがない(ことを期待する)<br />
　どうせActivity機構に新流儀が出来てしまうとどうせUI周りはリライトになる。となるとシングルカラム・マルチカラムを単一ソースで管理するなら、Activityを別々で用意するより、layout xmlで切り替えられるレベルまで統合されている方が開発効率は良くなる。何よりその方がAndroidらしい。<br />
　きっとAOSPの標準アプリのMailあたりを見るとヒャッホーって感じになってくるに違いない(ことを期待する)</p>

<p>■予想される問題<br />
　上記予想が当たった場合、タブレット・スマフォ両対応アプリを書くために、従来なら1.6以上対応として開発されていたようなアプリまでが新規開発だと3.0以上対応(3.0未満切捨て)になるケースが増えてくると思う。となると3.0未満端末は色々と不幸な目に遭うかもしれない。<br />
　まあスマフォでは1.6の切捨てもまだ進んでないくらいだし、3.0未満まで切捨てになるのはスマフォでの3.0シェアが最低8割は超えてからになるのだろうけど。<br />
　......というかその場合、過渡期の開発者は色々めんどくさいことになるね。</p>]]>
    </content>
</entry>

<entry>
    <title>オカルトTaskKiller</title>
    <link rel="alternate" type="text/html" href="http://www.narazaki.info/2010/12/taskkiller.html" />
    <id>tag:www.narazaki.info,2010://2.382</id>

    <published>2010-12-24T07:21:56Z</published>
    <updated>2010-12-24T09:11:49Z</updated>

    <summary>なんだかIS03が出たあたりからかまたTaskKillerが中興してるね。 相変...</summary>
    <author>
        <name>H.Narazaki</name>
        <uri>http://www.narazaki.info/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.narazaki.info/">
        <![CDATA[<p>なんだかIS03が出たあたりからかまたTaskKillerが中興してるね。<br />
相変わらずAndroid界隈は支持者もアンチもオカルト大好きで......。</p>

<p>半年ほど前の蒸し返しになるけど、Androidのタスク管理について。もうあんまり内部の細かいこと書いても分からないだろうから書かないよ。</p>]]>
        <![CDATA[<p>■結論から<br />
・TaskKillerは使わない方が良い<br />
・バッテリ消耗が激しい場合、まず設定(特にWiFiやGPSなどの無線周りが使いっぱなしになっていないか)を見直す<br />
・それでもバッテリ消耗が激しい場合はバッテリを食ってるアプリを特定しアンインストールする</p>

<p>■何故TaskKillerを使わない方が良いか<br />
Androidでは一度起動したプロセスはなるべく再利用しようとする。これは重い起動処理をなるべく減らすための一種のキャッシュである。<br />
一旦終了してしまうと起動からやり直しになってしまうし、2.2以降ではせっかくコンパイルしたJITキャッシュも全部ご破算になってしまう。ブラウザのキャッシュをしょっちゅう消しまくるようなものだ。</p>

<p>プロセスリストにプロセスが残っているとバッテリを食っていると思う人がいるが、リストに載っていても処理がない限りプロセスは止まっているしバッテリも食ってない。この点に関する勘違いが一番多い。<br />
バックグラウンドでも処理をするアプリは一部にあるが、普通は必要な処理だけ時々起きてまた寝る、というような動作をするようになっている。</p>

<p>一方、バックグラウンドに回ったのに処理をちゃんと止めないとか、電波を出しっぱなしにするとか、そういう「お行儀の悪い」アプリも一部には存在する。これは要するにバグであり、たいていコメントでぼろくそに書かれている。とはいえ最近は開発者にノウハウが普及しているのでそこまで酷いアプリはかなり稀になった。</p>

<p>またメモリが非常に少ない端末では新しいアプリが立ち上がると古いアプリがどんどん終了されてしまう。これ自体は正しい挙動なのだが「ホーム」もアプリであるためこれが終了するとホームに戻る=ホームアプリ起動になって非常に遅くなる。これに対してホームが殺されないために別のアプリを先回りして殺してしまうという手法が(昔は)あった。</p>

<p>TaskKillerを使うと損な点<br />
・タスク切り替えが毎回起動になるためかえって遅くなる<br />
・更に2.2以降ではJITキャッシュが頻繁に捨てられてしまってかえって遅くなる<br />
・TaskKillerそのものがプロセスであるためメモリとCPU時間を食う<br />
・まともなアプリの寝ているプロセスで動作速度は下がらないし、殺しても上がらない</p>

<p>TaskKillerを使うと得かもしれない点<br />
・運が良ければバックグラウンド処理の腐ったアプリを殺してくれることがある<br />
・メモリが非常に少ない(旧世代の)端末ではホームが殺される頻度が下げられるかもしれない</p>

<p>2010年以降の端末ならメモリ圧迫によりホームが殺される心配はあまりないと思うので、問題は腐ったアプリをどうするかになる。</p>

<p>■設定見直し<br />
昨今ではアプリの品質はかなり良くなっているので、アプリを疑うより先に端末設定を疑った方が良い。</p>

<p>典型的にバッテリを食いやすくかつ設定で何とかなるのは「バックライト」と「電波」<br />
バックライトは輝度を下げればてきめんに消費電力が抑えられるので、必要が無ければなるべく低めにしておいた方が良い。「設定」→「表示」から変更できる。<br />
電波は「WiFi」「Bluetooth」「GPS」があり、使わない時はオフにしておいた方がいい。GPSも意外と電池食いだ。</p>

<p>設定の切り替え方だが、Androidには標準で「電源管理ウィジェット」というのがあって、これを使うとホーム画面からワンタッチで各種無線と画面輝度を切り替えられる。<br />
ホーム画面で「Menuボタン」→「追加」→「ウィジェット」→「電源管理」とやると貼り付けられる。<br />
設定切り替えツールは色々あるけど標準の電源管理ウィジェットが簡単でオススメ。<br />
端末によっては通知バー(ステータスバーを引き摺り下ろすと出る奴)に統合されている場合もあるので、そういう端末ならわざわざウィジェットを貼る必要はない。</p>

<p>■バッテリ食ってるアプリの特定<br />
腐ったアプリを1個動かすと一気にバッテリを食うし、行儀のよいアプリだけなら何個立ち上がっていても問題ない。<br />
つまり実は腐ったアプリを特定してアンインストール出来るなら上で挙げたTaskKillerを使う利点は結局なくなる。しかしこの特定は意外と難しくてちょっと困る。</p>

<p>アプリごとのバッテリ消費状況は「設定」→「端末情報」→「電池使用量」で見られる(端末によるかも)</p>

<p>ディスプレイが食ってるなら画面輝度上げすぎ。<br />
Android OS、Androidシステム、セルスタンバイ、メディアサーバー、あたりはシステムが使ってる分。<br />
よっぽど立ち上げっぱなしにしているわけでもないアプリ名が食ってるならそいつが戦犯。</p>

<p>システムが使ってる場合は厄介。これはアプリ呼び出されて食ってる分が含まれているため、どのアプリが悪いか戦犯が特定しにくい。<br />
メディアサーバーは割と仕方ない。これは音楽プレイヤーとして使ってたりするとどうしても使ってしまう。音楽聞きまくった場合のバッテリ消費は元々特化端末であるiPhone/iPodに比べるとやはり不利。</p>

<p>その他のシステム系が異常に食ってる場合は......難しい。<br />
各アプリを見ていって「部分起動状態」(「スリープモードにしない」とか書いてるかも)が長いもの、GPS使用時間が長いもの、通信量が多いもの、などが疑われる。<br />
これらが使用頻度や使用時間に比べてやたら長いものはバグっている可能性があるので、必要が無ければ消すか、同機能の他のアプリを検討する。</p>

<p>■そこまで詰めてもバッテリ食うんだけど<br />
これ以上は結構厳しいかなぁ。<br />
ここでTaskKillerに手を出すのは意味がない。ほんとにちゃんと詰めた後だとTaskKillerを入れてもバッテリ消費は多分かえって増える。<br />
ここまで来ると要するに端末長時間触りまくってるのが原因。端末を触っている状態ではバッテリはどうしても食ってしまう。端末弄ってるってことはバックライトがずっとついてるわけだしAndroidアプリは通信を使うものが多いし動画とかFlashとか使うとなおさら。<br />
バックライトの輝度を下げてみるとか、Flashをオフにしてみるとか、頑張る余地はあるにはあるけど、最終的には予備のバッテリ(eneloopのアレとか)を持っておくしかないんじゃないかなぁ。<br />
</p>]]>
    </content>
</entry>

</feed>

