PeeeeRONの日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

初心者が1ヶ月で世界に羽ばたくアプリを作った話

大袈裟なことをいいました。 すみません。  でもこのアプリのターゲットマーケットは、日本語を読むことのできない、外国人です。  もちろん日本語もサポートされています。  現時点で、英語フランス語インドネシア語中国語日本語に対応しています。  ローカライズについては後ほどまた出てきますので、くわしくはそこにかかれています。

こちらがアプリのページです。↓

ヲタ芸しか!! ~ヲタ芸ビデオプレイヤー~ - Google Play の Android アプリ

 

初心者が3週間でアプリを作った話 - PeeeeRONの日記

 

まずどんなアプリを作ったのかを書きたいと思います。  今回作成したアプリはYouTubeクライアントプレーヤーアプリです。  ただのプレーヤーではつまらないので、日本が世界に誇れる(?)文化である、ヲタク文化にフォーカスしたプレーヤーにしました。  中でも、外国人が見てすぐに分かる、ヲタ芸というダンスにフォーカスしました。 

ヲタ芸とは、本来は好きなアイドルやキャラクターを応援するためにヲタクが行うダンスでしたが、最近は光るサイリウムというケミカルライトを持ってかなり激しく踊るパフォーマンスのようなものに進化しています。  ヲタ芸を表現する方々を特に「打ち師」をいいますが、彼らは日々自分たちで打ったヲタ芸を動画に撮りYouTubeに公開しています。  

さらに最近ではヲタ芸は日本だけの文化ではなく世界で注目されていて、日本人以外の打ち師も増えてきています。  これには、日本のアイドル文化が影響しています。  あまり詳しくは無いのですが、AKBを率いる秋元康が自身のプロデュースするユニットをインドネシアと中国に作ってその影響でヲタ芸という文化も世界に広まっているのではないかと考えられます。

しかし、もともとは日本の文化なので、海外の打ち師の人数に比べると日本のほうが多いですし、ダンスのクオリティーも違います。  そこで海外の打ち師はYouTubeを通じて日本人打ち師の動画を検索して見ることになりますが、日本語を理解していないので少し困難なことがあると考えられます。  それは検索です。  

例えば「ヲタ芸」という言葉を検索するにしても、キーボードが対応していなく打つことができません。  そこで、インターネットを使って日本語を探し出し、コピペするしか無いのです。  このアプリを使えば検索する事なく動画を視聴することができます。

以上がこのアプリを作成した背景になります。

 

動画を見るだけでなくこのアプリには、ヲタ芸の技の練習をサポートする機能や、ヲタ芸に使えそうな曲を再生する機能、普通に動画を検索する機能ももちろん含まれています。

また特徴的な機能としては、動画のリコメンド機能です。

アプリを使っている人の見た動画を解析(解析というと大袈裟に聞こえますが)して、おすすめ動画をリストアップします。  

 

さて、ここからは技術的な話しを書きたいと思います。

まずは設計から書きたいと思います。

 

  • 設計

まず、前回同様に実装したい機能をリストアップしてクラス図状態遷移図を利用して全体の大まかな仕様を決定しました。  またここで、どのように実装するか、作るべきメソッドなどをだいたい決定しました。

 

  • デザイン

次にデザインを考えました。  YouTubeアプリはGoogleの公式アプリがあるので、レイアウトはそれを参考にしました。  また、今回はタブレット対応もしました。  Androidではlayoutフォルダを分ける事によってスマホタブレット、縦画面、横画面でレイアウトを分けることができます。  またその影響で、Viewをフラグメント単位で分けることにしました。  フラグメントは大変扱いが難しいのですが使いこなせれば便利なので頑張って使い方を覚えました。  また今回は前回のアプリと違ってUIも凝ってみました、NavigationDrawerを使ってページ移動を便利にしたり、ActionBarをカスタマイズしたりしました。  さらにUIに関連したライブラリを多数使って、UXを考慮したアプリを目指しました。

 

  • コーディング

今回はアプリ内でネットにリクエストを送る必要があったので、VolleyというGoogleの作った通信用ライブラリを使って実装しました。  また、JsonパーサとしてまたGoogle製のGsonというライブラリを使いました。  

Volleyはネットワークに用いる非同期通信を自動的に実行してくれる便利なライブラリです。  通常ネットワークをAndroidアプリで用いる場合AsyncTaskを継承したクラスを用いたり、Handlerを用いるのですがVolleyを用いるとそれらを作成する必要がありません。  しかし、Volleyを実行するときにリクエストキューという待ち行列を使うのですが、このリクエストキューに一意性を保証するためにVolleyリクエストを管理するSingletonクラスを作成する必要があります。  ここで少しハマりました。  

またGsonというライブラリは、リクエストの結果送られてくるデータをJavaオブジェクトとして変換してくれるという便利なライブラリです。  なので事前にオブジェクトのクラスを定義しておけば、Gsonが自動的にマッピングを行うので、通常のJavaオブジェクトとしてコードの中で扱うことができます。  この2つのライブラリを使うことでネットワーク通信がだいぶ楽になると思います。

またデータベース処理にはActiveAndroidというライブラリを使いました。  Androidには標準でSQLiteというデータベースをサポートしているのですが、使用するには、SQL文をいちいち打ち込まなくてはならないので、めんどくさいと思いライブラリですますことにしました。  このライブラリにより、データベースのテーブルをModelクラスを継承したクラスを作成する事により簡単につくれるようになります。

画像処理にはPicassoというライブラリを使いました。  Volleyに同梱されているImageLiaderというライブラリを使っても良かったのですが、YouTubeのサムネイルを加工する必要があったので、画像加工も簡単にできるPicassoを使うことに決めました。

YouTubeのサムネイルのPicassoを用いた加工方法はQiitaの方に書いたのでそちらを参考にしてください。 


AndroidでYouTubeのサムネイルをアス比を直して表示する。 - Qiita

 

 他にも主にUI系やユーティリティ系のライブラリをいくつか使いました。

 

そして今回のアプリを作る上で参考にした資料を以下に示します。

まずはUIの本です。

 

Android Pattern Cookbook マーケットで埋もれないための差別化戦略

Android Pattern Cookbook マーケットで埋もれないための差別化戦略

 

 この本は、AndroidアプリのモダンUIが多数紹介されていてUIデザインの参考になりました。  やはりどんなサービスを作るにしても、ユーザを維持するには優れたデザインが必須なように感じられます。 

 

Effective Android

Effective Android

  • 作者: TechBooster,小太刀御禄,出村成和,重田大助,西岡靖代,宮川大輔,柏本和俊,あんざいゆき,八木俊広,木村尭海,小林慎治,有山圭二,中西良明,わかめまさひろ,新井祐一,桝井草介,久郷達也,寺園聖文,shige0501,山下智樹,前田章博,秋葉ちひろ,末広尚義,中澤慧,日高正博,塚田翔也,井形圭介,中川幸哉,山崎誠,山下武志,なまそで,橋爪香織,さとうかずのり,l_b__,ゼロハチネット,長汐祐哉
  • 出版社/メーカー: インプレスジャパン
  • 発売日: 2014/01/17
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (8件) を見る
 

 僕はこの本でVolleyというライブラリを知りました。  しかし、この本ではVolleyをSingletinパターンで紹介していないのでGoogle公式ドキュメントを参照したほうがいいと思います。  他にもこの本にはAndroidアプリに関する少しアドバンスドなテクニックが書かれているので、ある程度アプリ作りに慣れた段階で読んでみるとより理解を深められるのでは無いかと思います。  僕にはほとんどさっぱりわかりませんでした。

 

あとはこちらの本です。


Master of Fragment (Android Professional Developerシリーズ) - 達人出版会

 

これは電子書籍版のみの出版なのですが、Fragmentについて書かれています。  Fragmentをある程度使ってみて、ハマったら読むといいでしょう大体答えが載っています。  PDFで購入できるので、PCでも読めます。

 

次に今回のアプリ作成を支えてくれたWebサービスを紹介します。


スタック・オーバーフロー

まずは世界最大のプログラミング専門の質問サイトです。  最近日本語にローカライズされたようです。  プロのIT技術者の方々が丁寧に回答してくれます。  しかし、敷居は少し高いです。  ググれば30分くらいですぐ出てくることや、要点がわからない質問などはしないほうがいいでしょう。  マイナス評価機能があるので、評価が落ちます。  しかし、本当にハマってしまって解決方法が思い付かないし、どこにも載っていないときは丁寧に回答してくださるのですごくお勧めです。  僕自身も、このアプリを作るのにあたって、20件以上質問させて頂いています。  このアプリを作れたのはこのサービスのおかげと行っても過言では無いでしょう。

 


Qiita - プログラマの技術情報共有サービス

プログラミングのテクニックを共有するサービスです。  わからないことを検索するとかなりの確率でヒットします。  ただ毎日見ているだけでも新しい技術を知ることができるのでとても便利です。  もし自分でアルゴリズムなど考えたのなら投稿してみると良いと思います。

 


mixi-inc/AndroidTraining

こちらはmixiが公開しているAndroidのマニュアルです。  基本的なことがだいたい載っています。  Androidを初めて扱う方には参考になるとおもいます。  特にライフサイクルやフラグメントの使い方を再確認するときに使っています。

 

このアプリの特徴として、リコメンド機能をあげましたが、それに関して少し残念なことがあります。  当初このリコメンド機能にはYouTubeに投稿者が動画を上げるときに設定するタグを使って、見た動画のタグの出現頻度で重み付けをおこない、上位数単語をORで結んで検索するというアルゴリズムを考えていたのですが、開発途中で今はもうタグを取得できないということがわかりまして、実装できませんでした。  多分タグ自体が非公開情報なのでプライバシの問題だと思うのですが残念でした。  仕方ないので今回は他の方法で実装しました。

 

次にローカライズについてですが、今のところ、冒頭でも挙げたとおり、英語、フランス語、インドネシア語、中国語、日本語に対応しています。  このなかでもインドネシアと中国に関しては上で説明した通り、秋元康プロデュースのアイドルユニットがいることが理由で、フランスは毎年JapanExpoが開催されるほど、日本文化に興味を持つ人がいるということでそこを狙って対応しました。

 

  • 今後の開発

今後実装したい機能としては以下のものがあります。

  1. プレイリスト対応
  2. チャンネル検索対応
  3. お気に入り機能の実装
  4. OAuth認証の実装
  5. 聞ける曲のジャンルの追加
  6. ユーティリティ系のメソッドをユーティリティクラスとしてまとめる。

1、2番は特に理由はなく設計当初から考えていたので、これから取り組みたいとおもいます。

3、4番に関しては、OAuthやったら正直お気に入り機能いらないきがするので検討します。

5番に関しては、現在曲のランキングはItunesのランキングを使用しているのですが、アニソンはいいにしても、Jポップを取得しても目的であるアイドルソングがほぼランクインしていないので取得できません。  なので、オリコン、Yahoo Japanなどから、CDランキングを取得できるようにしたいです。  CDランキングならランキング独占しているとおもうので。

6番に関しては、開発途中で画像加工メソッドや、文章をローカライズ、整形するメソッドを用いたのですが、それらのメソッドが同じものを様々なクラスで記述してしまっているのでオブジェクト指向的によろしくない状況になっています。  なのでそれをまとめたいです。

 

  • 今後やりたいこと

ひとまずAndroidに関する開発はお休みしようかとおもいます。  これからは、サーバーサイドの開発やハードウェア(Arduino,Rasberry pi)にも手をだしてみたいと考えています。

また、少しアカデミックな技術にも触れていきたいと考えています。  例えば、機械学習だったり、関数型言語であったり。

 

では長くなりました(多分最後まで読む人はいない)がこれで終わります、それではまた。

 

あと、アプリを使っていてバグ等見つけましたら報告していただけると有難いです。

 

追記 2015/6/20

githubにソースをアップしました。 

github.com