社会人からはじめる機械学習勉強 Week 4 – waifu2x

今週は出張が重なったため、勉強の進み具合は少し。

waifu2x

Deep Learningを使用したアプリケーションとして、waifu2xというソフトがあることを知った。githubにてソースコードも公開されている、オープンソースプロジェクト。

waifu2xは、超解像・ノイズリダクションソフトで、Convolutional Neural Networkを利用して、入力画像の2倍のサイズを”復元”するというもの。トレーニング時に半分に縮小された画像を入力として、オリジナル(入力画像の2倍サイズ)画像(ターゲット)を出力するように学習させる。

超解像も機械学習の分野でできるなんて知らなかったので驚いた。Deep Learning のすごいところはこれまで経験を積んできたプロが行ってきた特徴抽出からパラメータ調整といったものを、自動でしてしまうところ。

今回の画質処理の例でいうと、今までの画質処理は明るさ・コントラスト・シャープネス・カラー、、、といった様々な”特徴”があり、それぞれに対して適切な画質補正を行っていた。しかし、Deep learningではこういった特徴抽出さえ機械が勝手に学習する。機械学習の実装者はコントラストやシャープネスといった概念を知ることなく、勝手に機械が画像に存在する特徴を抽出し、それを最適にするように学習・調整を行う。

これはとても怖いことだなと感じる。今まで何十年とかけて、その分野を磨いてきた専門家が、いきなりやってきた、画像処理に関しては無知の機械学習エンジニアが作ったソフトに勝てなくなるかもしれないという事だ。

社会人からはじめる機械学習勉強 Week 3 – Deep Learning

2016/1/18~1/24

Deep learning Theoryの勉強

先週から継続して、Courseraと書籍で勉強中。

今週からDeep Learningについて学び始めた。

具体的には、先週学んだLinear regression, Logistic regressionを複数層重ねることによって構築される、Deep Neural Network、MLP (Multi Layer Perceptron)について学んだ。

Link

社会人からはじめる機械学習勉強 Week 2 – 学習開始

2016/1/11~1/17

Coursera: Machine learning

Onlineビデオで学べるCourseraを進め始めた。Courseraの設立にも携わっているAndreaw Ng教授が教えるMachine Learningのコース。とってもわかりやすい、丁寧すぎるくらい。

Coursera Official pageから学習しようとすると、次のLectureを受けるのに期間を待たないといけないため、過去のビデオが紹介されているページを見つけ出してそちらで学習していった。

今週は導入として、Linear Regression, Logistic regressionについて理解していった。

Link

書籍

割ととっつきやすそうな、フリーソフトで作る音声認識システムーパターン認識・機械学習の初歩から対話システムまでから読み始めた。前半が理論編で機械学習(パターン認識)に関する説明となっていて、後半が実際にフリーソフトを用いた音声認識の実践編となっている。

前半が読みやすく音声認識に限らない一般的な機械学習について説明されているので非常によい。まず概要をつかむ本としてはおすすめ、式の導出を細かく追ったりしなければ割とさくさく読んでいけると思う。

後半は音声認識をしたいわけでなければスキップしてよいと思う。2007年の本なので、使っているソフト・使い方なども古い情報かもしれないし。

社会人からはじめる機械学習勉強 Week 1 – 大人買い –

勉強方法

まずは勉強方法を探すところから。結論を先に書くとまずとっかかりとしておすすめなのは、以下の4つを平行しながら進めていけばいいのではないか。

  1. Coursera -Andreaw Ng 教授 の Machine Learning
  2. Slideshareでわかりやすい機械学習入門のプレゼンがいくつかあるのでいろいろ見ていく。
  3. 書籍   ― 以下のまとめサイトを参考に、自分に合うものから読んでいく。
  4. プログラミングの勉強
    機械学習の分野では、python, c言語, MATLAB あたりが使われている。pythonがトレンドな印象なので、pythonを学ぶなら
    • ドットインストール
    • python公式サイト
      なんかで学んでいく。

2014.1.4追記:今流行っているtensorflow, keras, chainer などのDeep learning frameworkはpythonで書くことができるので、pythonを学ぶのはおすすめ。
ただし、ドットインストールは無料でなくなってしまったようなので、無料で勉強したい人は他のサイト探す必要があるかも。

いろいろ調べていた中で、参考になったサイトをリストアップしてく。

方針決め、概要をまとめたサイト

自分は理系なのだけど、機械学習に関する基礎知識があるわけではないので、土台から勉強するという意味でここから始めた。

とくに1つめのリンクで細かく説明されているCourseraのMachine Learningは(ちょっと丁寧すぎるくらい)めちゃくちゃわかりやすいのでおすすめ。

2つめのリンクではわかりやすいSlideshareのリンクがいくつかあるので参考に。また、pythonを学びたい人には参考にできるリンクが見つかる。

書籍まとめサイト

真剣に勉強を始めようと思っているなら、情報がまとまって書かれている書籍を読んでいくのがいいだろう。特に理論面は書籍を読めばわかりやすいものが多いと思う。

書籍大人買い

マレーシアにいるので、書籍を気軽に買うことができない。どうせ輸入しなければ買えないので、面白そうな本をすべて一気にAmazon.co.jpで買うことにした。という事で上記のサイトを参考にしながら今回買った本のリストが以下。

他に数冊買ったのも合わせて合計4万円位したな。。。本だけで4万って。。。まあここはケチるところではないし自己投資という事でいいでしょう!

社会人からはじめる機械学習勉強 Week 0 – Romance Dawn –

本シリーズについて

社会人になってから機械学習という分野の面白さ知り、その可能性に大きな夢を感じ、とりこになってしまった著者。これから人生を懸けて取り組む仕事はこのフィールドしか無い!と勝手に確信した自分はもう一刻も早くこのフィールドへの転職をすることしか考えられなくなっていた。。。

一方、大学では物理学を専攻、プログラミングを専門としていなかった自分。機械学習・人工知能の事前知識が特にあるわけでもなく、知人にコネなどもない状態でどうすればこういった専門職に就けるのか、、、。そんな状態に置かれた中、社会人生活の仕事の合間を縫いつつ機械学習を独学で勉強し、1年以内に転職を目指す。

結論・総括は社会人からはじめる機械学習勉強 Week 28 – 最終週 内定まで。

機械学習を知るきっかけ

2015年も終わる頃、友達に将棋ゲームをしようと誘われた。将棋ウォーズというオンラインで将棋の対人対戦が出来るアプリ。

将棋連盟公認のアプリという事で、段位の認定なども行なっている。将棋連盟と提携といった大々的なビジネス、こういった形でスマホゲームをマーケティングしているのは新しいなと思い、ふと会社をネットでググってみたのがきっかけ。将棋ウォーズを作っているHerozでは、将棋ソフトの開発も行っていて、世界一の将棋ソフトPonanzaの開発者もこの会社に所属していると知る。現在、コンピュータ将棋ソフトは現在超一流のプロと同等以上の棋力を持っていて、人間がコンピューターに勝てなくなるのはもうすぐのことだろう。

そんなHerozのホームページで採用情報には“人工知能(AI)で世界を驚かす”というキャッチコピー、仕事の募集職種には人工知能エンジニアの分野がある。

将棋ソフトに対するサーベイをした結果、局面評価値の作成はBonanza Methodというブレイクスルーがきっかけで機械学習が取り入れられるようになったことを知った。過去のプロの棋譜を取り入れた教師あり学習による局面評価値の生成・次の指し手を確率として算出する。

*具体的には八木さんが開発したBonanza methodという機械学習アルゴリズムを用いることでプロの指し手候補を学習し(プロの棋譜を活用したビッグデータ、教師あり学習)、有力な指し手候補に対して α-β法という探索手法や枝刈りを用いて効率的に数手先の指し手を読み、最適な解を導いているよう。

現状、すでに非自明な局面が現れた時次に何を指すのが一番かコンピューターに教えてもらうという事が起きている。将棋・ゲームでの人工知能活用というのはあくまで一例だ。生活をしていても選択肢がたくさんある中でどれが最適な選択か迷うことはあるだろう。そんな中で機械にアドバイスをもらってよりよい人生の選択をしていくということが起こる、そんな想像がうかんだ。もっと言うと機械を使うことで人間よりも良い判断を下せるようになってしまうということだ。簡単に想像できる応用分野としては、株式市場の投資判断。今後機械が相場を操作するようになるだろう(そうするとどうなるのだろう、一瞬で常に市場最適価格が形成されるようになるのだろうか)。

別の分野で言うと機械が応用の効く自動化を獲得したともいえる。自動車の自動運転方法の獲得、制御機械の制御方法獲得などだ。。。近いうちに自動車の運転は機械にまかせっきり、皿洗いや洗濯といった単純作業を機械が自動で出来るようになるだろう。

これが意味するところは機械が”経験”を活かすことが出来るという事。機械に経験に基づく直感を与えたと言ってもいいのかもしれない。

抱負

ここまでのインスピレーションを与えてくれる人工知能の未来。これは集中して取り組む価値があると確信できる。今までいろんな分野に興味があり、八方美人で過ごしていたけれど、機械学習には取り組めると確信した。

2016年は機械学習(Machine Learning、以下ML)に全力で取り組もう。

 

おまけ:タイトルのRomance Dawn

言わずとしれた世界一売れてるマンガの第一話のタイトル。Dawnは夜明け、始まりという意味で、冒険の夜明け、物語の始まりということだ。

人工知能分野で有名な人まとめ

人名・働いている企業名・大学名・プロジェクト名・ラボ名など

ジェフリー・ヒントン Geoffrey E. Hinton

本人のサイトより

1947年生まれ、第一次AIの冬の時代にも研究を続け、今爆発的に流行っているDeep learningを生みだした。現在はGoogle Brainプロジェクトの研究者とトロント大学教授を兼務。

ヤン・ルカン Yann LeCun

本人のサイトより

Facebookの人工知能研究所、ニューヨーク大学勤務。

博士時代はヒントンの研究室に所属していた。

ヨシュア・ベンジオ Yoshua Bengio

本人のサイトより

モントリオール大学のLISA LABを率いる。また、IBMのワトソン共同研究を行なっている。AT&Tベル研究所にて、ルカンとベンジオは一緒に働いていた。

LISA LABはthanoやpylearn2を開発していて、その技術情報をチュートリアルを添えて公開しているdeeplearning.net はDeep learningに関する実装の解説・情報量がとにかくすごい。研究業界にとどまらず、これだけオープンに最先端技術を技術発信してくれているのはとても有難いことだと思う。

上記3人はよく共同研究を行なっており、NCAP(Neural Computation Program)を設立している。

アンドリュー・ング Andrew Ng

本人のサイトより

Google Brainの立ちあげ。今はシリコンバレーにあるBaiduの研究所で勤務。Stanford大学。NCAPの研究員。

人工知能の研究だけではなく、オンライン教育システムCouseraの設立をDaphne Kollerと一緒におこなっている。(MOOC=「大規模オンラインオープンコース」の)。彼のCousera 科目である “Machine Learning“はとってもわかりやすい。図が多く使われていて、数学が苦手な人でも理解できると思うのでおすすめ。(講義は英語だが、英語・日本語字幕も付けられる。)

※Couseraについてはこちらを参照

デミス・ハサビス

Gigazineより

本人のサイトは2011年から更新されていない模様。

Deepmind (ディープマインド)の設立者。ATARIのゲームを自動学習するDQNや、囲碁の分野で世界1位の棋士に勝ったALPHA GOが有名。

彼の経歴は少し特殊で面白い。コンピュータ分野を専攻後、ゲーム企業を設立して成功をおさめた後に、人工知能についてより深く学ぶために特に知識のなかった神経科学を学ぶために博士になり、卒業後にDeepmindを設立している。神経科学で学んだことを生かしているとのこと。より詳しく知りたい人はWired VOL. 20 A.I. に彼/Deepmindの特集記事などが載っているのでおすすめ。

Deepmindに関しては人工知能分野を牽引する世界の企業まとめ – ベンチャー編 –も参照。

その他参考

人工知能分野を牽引する世界の企業まとめ – ベンチャー編 –

Deepmind

ATARIゲームをの最適戦略を自動で学んでいくDQNの衝撃的な発表。2016年3月には「コンピュータが人間に勝つにはあと10年はかかる」と言われていた囲碁の分野に置いても、囲碁ソフトALPHA GOにて世界一の囲碁棋士に勝ってしまった。

これらのソフトはDeep learningと強化学習を組み合わせている。

現在はGoogle に買収されているのだが、未だにDeepmindの名前のままニュースで流れることも多いので、こちらで紹介した。

Ref: 

Preferred Infrastructure, Preferred Networks

日本のベンチャー企業。Chainerフレームワークの公開などをはじめ、オープンソース公開には積極的な印象。

Preferred NetworksではIOTに特化した人工知能の研究開発を行う。

人工知能分野を牽引する世界の企業まとめ – 大企業編 –

構成:会社の方向性、「有名なソフト」、プロジェクト名や人などを記載。

Google

Deep mindを買収するなど、積極的なAIカンパニー買収を行なっている。ロボットや自動運転自動車といった分野も牽引している。全社内のプロジェクトで積極的に人工知能を取り入れているよう。

Googleの人工知能を用いたプロジェクト数、Bloombergより

「Google Photos」 画像認識技術、音声・手触りといったマルチモーダルな認識技術へ。

「Tensor flowライブラリ」

Google Brain Project

人:ヒントン教授

Facebook

「M」 メッセンジャーに実装予定のパーソナルアシスタントサービス。買い物や各種予約も行う。

人工知能研究所(ニューヨーク・ロンドン・メンローパーク)

人:ヤン・ルカン所長

IBM

「Watson」 10億ドルの投資・2000人によって開発された。

「SyNAPSE」 非ノイマン型プロセッサー、脳をもしたニューロシナプティックチップ。画像認識や言語翻訳処理。

「コーティカルラーニングセンター」 常時オンラインかつ教師なしで学習し続ける階層的一時記憶システム。

人工知能研究所(ニューヨーク・ロンドン・メンローパーク)

Microsoft

「Cortana」 音声認識型パーソナルアシスタント(WindowsにおけるAppleのSiriのような存在)

「Skype Translator」 リアルタイム音声翻訳機能
 対応言語:英語・スペイン語・フランス語・ドイツ語・イタリア語・中国語・日本語(予定)

「りんな」 女子高生AI。Cortanaが知能的な返答を返してくれるのに対し、りんなは会話をふくらませるような回答をする。ラインでチャット出来る。 Twitter アカウントもある。

Ref: LINEで話題の人工知能「りんな」マイクロソフトが語る開発秘話

Baidu

画像認識・音声認識・ラスト1マイル(自立走行車・ドローン)

2014年シリコンバレーにディープラーニング研究所設立、研究スタッフ200人

人:アンドリュー・ング

以下、日本企業

TOYOTA

シリコンバレーにToyota Research Institute設立。自立走行車から生産ロボティクス、生産管理システムへのAI導入などの人工知能研究を行う。CEOはギル・プラット。

RECRUIT

Recruit Institute of Technologyを再編してAIに特化。

DWANGO

2014.10 人工知能研究所開設。山川宏所長。

「超人的人工知能」 自律的な創造を行う汎用人工知能の研究。

参考にしたもの

Wired VOL. 20 A.I.   Amazon

機械学習ライブラリ

自分用メモ、未完成。
ディープラーニング・人工知能・機械学習のためのライブラリをリストアップ。今後実際に以下のライブラリを使っていくことがあれば情報を追記していきたい。

Tensor flow

Pythonベース。Googleが公開したライブラリ。Visualizationがわかりやすく、使いやすいらしい。

Caffe

“Caffe is a community”というキャッチコピーもあるほど、その開発コミュニティーが活発にgithubを更新していたり、サンプルコードも多く初心者にはありがたい存在っぽい。

Chainer

日本企業、Preferred Infrastructureが公開しているライブラリ。

Theano ベース

Deep learning に関するTutorialの量が凄まじい。Theano自体は自動偏微分機能・GPU対応などをサポートする計算ライブラリで、Deep learning専用のパッケージではない。自分で理論から理解してScratchで実装したい人にはとっても参考になる。

Theanoをベースに開発されたライブラリはいくつかあるよう。

Torch, Lua

畳込みニューラルネットワークを用いた超解像ソフトのwaifu2xとかはこれで書かれていると思う。

スクラッチで実装

こちらのgithubなどは複数言語で実装されていて参考になるかも。

Reference

参考になるサイト集

はじめるDeep learning のライブラリの項がまとまっている。

Chainer 公式ページの比較表

Deep Learning ライブラリ&フレームワークをリストアップしてみた ~インストール・環境構築方法 と 使い方 解説ウェブサイトまとめ

BrowseFragmentの構成 – Android TVアプリ開発入門2

BrowseFragmentの構成

本章では、Leanbackライブラリのメインとして使われるBrowseFragmentについて説明する。BrowseFragmentに、HeaderとListの組み合わせを格納していくことによって、コンテンツをリスト上に表示することができる。ちなみに、BrowseFragmentのソースコードは sdk上  (android/support/v17/leanback/app/) で見ることができる。 

下の写真は Android TV のサンプルアプリのメインページで、これがBrowseFragmentによって作成されている。 コンテンツがグリッド上に並べられ、ヘッダーごとにカテゴリ分けされているのがわかる。それぞれのヘッダーに対応してコンテンツの列があり、1対1対応している。この “ヘッダー + コンテント列” の組み合わせは ListRow で作られる。 BrowseFragment の中身(本体)は  ListRow のセットだということだ。今後このセットのことを RowsAdapter と呼ぶ。

下の写真に対応関係を図示した。 ListRow は青丸で囲ってある部分、RowsAdapter ListRowすべてを囲っている青い四角の部分に相当する。 

RowsAdapter1
ListRow の集合で RowsAdapter が構成される。これが BrowseFragment のメインコンテンツとなる。

ListRow 部分に注目してみよう。各コンテンツ (以降 CardInfo や アイテム と表記)は ArrayObjectAdapter の中に格納される(ここでは RowAdapter と表記)。   

このアイテムはどんなクラス、オブジェクトでもよくそのUI表示は Presenter クラスによって指定される。 

ListRow1
ListRowの構成

まとめ

 ArrayObjectAdapter (RowsAdapter) ← ListRow の集合
 ListRow = HeaderItem + ArrayObjectAdapter (RowAdapter)
 ArrayObjectAdapter (RowAdapter) ← アイテムの集合

Presenter クラス

アイテム(カード)のデザインは Presenter が担う。 Presenter はその名の通り、どのようにアイテムを表示するかを決めるクラスだ。 Presenter クラス自体は抽象クラスで、このPresenterクラスを継承したサブクラスに、アプリに適した具体的なUI表示の実装を行う。

Presenter クラスを継承するときには、以下の3つのメソッドをオーバーライド(実装)が必須となる。 

  • onCreateViewHolder(Viewgroup parent)
  • onBindViewHolder(ViewHolder viewHolder, Object cardInfo/item)
  • onUnbindViewHolder(ViewHolder viewHolder)

それぞれのメソッドの詳細は Presenter クラスのソースコードに記載されているので参照してほしい。 Presenter クラスは ViewHolder をインナークラスとして持っていて、これが View の参照を保持する。 アイテムオブジェクトに応じて、 View のUIを実装したい場合は viewHolder を介してViewにアクセスすることができる。アクセスするタイミングは onBindonUnbind といったそれぞれのイベントにリスナーが用意されていて、その中でUI処理を行う(後述)。

実はこれはModel-View-Presenter (MVP)アーキテクチャによるもの。コンテンツをModel Objectで扱う際、そのUI表示のテンプレートデザインをViewが担当し、ModelとViewのつなぎ役をPresenterが担当する。より細かくMVPに関して知りたい方は14章を参照。

HeadersFragment & RowsFragment (GridItemPresenter) の実装

説明はここまでにして、ここから実装。ここではPresenterの1例として GridItemPresenter クラスを実装する。
ここでは”アイテム”(Model)は  String クラス、 viewHolder は TextView (View)を保持する。

Viewに関する設定を、Presenterが行う。初期化処理は onCreateViewHolder()にて。 
実際にアイテムをViewと結びつける処理は onBindViewHolder() にて行われる。onBindViewHolderでは、第1引数で viewHolder を受け取ることができ、これが onCreateViewHolder 時に作成したViewを保持している。また第2引数で実際に表示するアイテムのインスタンスを受け取っている。

    private class GridItemPresenter extends Presenter {
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            TextView view = new TextView(parent.getContext());
            view.setLayoutParams(new ViewGroup.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT));
            view.setFocusable(true);
            view.setFocusableInTouchMode(true);
            view.setBackgroundColor(getResources().getColor(R.color.default_background));
            view.setTextColor(Color.WHITE);
            view.setGravity(Gravity.CENTER);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, Object item) {
            ((TextView) viewHolder.view).setText((String) item);
        }

        @Override
        public void onUnbindViewHolder(ViewHolder viewHolder) {

        }
    }

}

実際にPresenterクラスの実装ができたら、これを RowsAdapter にセットすることで適用できる。これはActivityの作成時に行う。 以下では MainFragment の onActivityCreated() に実装

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.i(TAG, "onActivityCreated");
        super.onActivityCreated(savedInstanceState);

        setupUIElements();

        loadRows();
    }

    ...

    private void loadRows() {
        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());

        /* GridItemPresenter */
        HeaderItem gridItemPresenterHeader = new HeaderItem(0, "GridItemPresenter");

        GridItemPresenter mGridPresenter = new GridItemPresenter();
        ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(mGridPresenter);
        gridRowAdapter.add("ITEM 1");
        gridRowAdapter.add("ITEM 2");
        gridRowAdapter.add("ITEM 3");
        mRowsAdapter.add(new ListRow(gridItemPresenterHeader, gridRowAdapter));

        /* set */
        setAdapter(mRowsAdapter);
    }

 最終的に、MainFragment の全ソースコードはこんな感じになる。

package com.corochann.androidtvapptutorial;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v17.leanback.app.BrowseFragment;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.Presenter;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by corochann on 2015/06/28.
 */
public class MainFragment extends BrowseFragment {
    private static final String TAG = MainFragment.class.getSimpleName();

    private ArrayObjectAdapter mRowsAdapter;
    private static final int GRID_ITEM_WIDTH = 300;
    private static final int GRID_ITEM_HEIGHT = 200;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.i(TAG, "onActivityCreated");
        super.onActivityCreated(savedInstanceState);

        setupUIElements();

        loadRows();
    }

    private void setupUIElements() {
        // setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.videos_by_google_banner));
        setTitle("Hello Android TV!"); // Badge, when set, takes precedent
        // over title
        setHeadersState(HEADERS_ENABLED);
        setHeadersTransitionOnBackEnabled(true);

        // set fastLane (or headers) background color
        setBrandColor(getResources().getColor(R.color.fastlane_background));
        // set search icon color
        setSearchAffordanceColor(getResources().getColor(R.color.search_opaque));
    }

    private void loadRows() {
        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());

        /* GridItemPresenter */
        HeaderItem gridItemPresenterHeader = new HeaderItem(0, "GridItemPresenter");

        GridItemPresenter mGridPresenter = new GridItemPresenter();
        ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(mGridPresenter);
        gridRowAdapter.add("ITEM 1");
        gridRowAdapter.add("ITEM 2");
        gridRowAdapter.add("ITEM 3");
        mRowsAdapter.add(new ListRow(gridItemPresenterHeader, gridRowAdapter));

        /* set */
        setAdapter(mRowsAdapter);
    }

    private class GridItemPresenter extends Presenter {
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            TextView view = new TextView(parent.getContext());
            view.setLayoutParams(new ViewGroup.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT));
            view.setFocusable(true);
            view.setFocusableInTouchMode(true);
            view.setBackgroundColor(getResources().getColor(R.color.default_background));
            view.setTextColor(Color.WHITE);
            view.setGravity(Gravity.CENTER);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, Object item) {
            ((TextView) viewHolder.view).setText((String) item);
        }

        @Override
        public void onUnbindViewHolder(ViewHolder viewHolder) {

        }
    }

}

なお、MainFragmentの背景色として

    <color name="default_background">#3d3d3d</color>

をcolor.xmlに追加した。

(III) ビルド・実行

ヘッダーとコンテンツの組み合わせが見えればOK。

GridItemPresenter1

1点注意。ここでは、 Presenterクラスと実際に表示したいアイテム(ただのString)を用意しただけだった。その他のアニメーション(アイテムを選択すると大きくなって表示される)などはすべてSDKのなかで実装されているので、特に手間をかけなくても大丈夫なようになっている。

UIデザイナーでなくても、 Android TV アプリのUIは

ここまでのソースコード: github.

次の章では How to use Presenter and ViewHolder? – Android TV application hands on tutorial 3、 ImageCardView を用いてカードに画像とタイトル・サブタイトルを載せた表示を行う CardPresenter の実装をする。