パソコンを触り始めて2年目になった（Android 入門を振り返る ）

# はじめに 


この記事は [Prolab Advent Calendar 2017](https://adventar.org/calendars/2526) の5日目の記事として書かれています。

前の方々の記事もすごいので是非読んでください！
## 自己紹介
ふなち（Twitter: @_hunachi）
好き勝手に生きてる野良猫女子高専生です（担任の先生公認）
プルグラミングラボ部員で、今年イベント係長？やらしてもらうとこになりました！
大好物はハッカソン！！
KotlinでAndroidアプリ作ることが好きです！（他は授業レベルしかできない・・・からだけじゃないよ！）
あと、数学もほんの少しずつお勉強したいなって思ってます！


ということで、本題に入ります。
##今回書くことは？

今回も、去年みたいに1年の振り返りしようと思ったんですが、面白くないかなって思ったので・・・
####今年は、触ってみたライブラリとか、APIとか・・・について書きます！(((o(*ﾟ▽ﾟ*)o)))

私にはきちんとした知識がないのと、ネット上には沢山の技術記事が溢れているので、今回は今年自分がどのようにそれらのライブラリやAPI等を活用したかとかだけ書きます！

文章力がないので最後まで読みきるのは気合がいると思いますが良かったら頑張ってください！
あと、間違えてたり、これ使った方がいいよ！とかいうのがあったらコメントお願いします(`・ω・´)＞

#ライブラリ（有名なのばかり）

##DataBinding
https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja

DataBindingは理解するのに時間がかかりました(;´･ω･)＜最近やっと理解した

最初、コンパイルや実行しないと補完が効かなかったりバインドされないってことを知らなくて、コードと長いことにらめっこしてました・・・( ˘ω˘ )ZZZ

つまずくとは言えど、最新のもの（今はAnkoのほうが最新なのかな？）は使えるようにならないとと思って、色んな方のコードを見せてもらったりして、どうにか理解することができました！！
（ちなみに私はButter Knifeはちゃんと触れないです）

私が一番つまずいていたのはclassやobjectをxml内で使う時に任意に定めるnameの変数名を、全部ユニークにしなきゃいけないと思い込んでいてすごく冗長な名前をxmlのクラスごとにつけたり、全てのViewのidにつけてたことです・・・（恥ずかしい・・・情弱( ；∀；)）

###DataBindingのいい点
私が思うDataBindingの特に素晴らしいと思う点は、
1. Listenerの実装が楽 & (私にとっては)とても読みやすいコードになる
2. setterにnotifyPropertyChangedを書くと変数に代入するだけでViewを変更してくれる！（スパゲッティコード回避！？）
3. EditTextの文字列が変数にリアルタイムで反映されるコードが@={viewModel.hoge}って書くだけでできる！
4. Listの実装が楽になる！

特に、4番目の1つ1つ異なる画像付きのItemでできたListを実装しようとしたときに、DataBindingは大活躍しました！
BaseObserbleを使うときと同じように、画像を読み込むためのBindingAdapterを書けばいいだけ！(((o(*ﾟ▽ﾟ*)o)))＜🐫

###DataBindingのちょっと大変な点
※これはあくまでも初心者の私にとってです
1. Kotlinとの互換性で最初のほうちょっと戸惑う
2. 共同開発時にxmlをデザイナーに頼んだりする際に、コンフリクトでコードの書き直しやデバックに時間がかかったりする
3. 定期的にclean buildをしたり、ひどい時にはAndroid StudioをRestartさせないとerrorが消えない時がある（これに気づかないと無限に時間が）
4. xml内のどこでバグが起きたかすぐにわからない（何か方法あるんでしょうか？）

###余談

一番使ったプロジェクトは今年の [PCKモバイル部門](http://web-ext.u-aizu.ac.jp/pc-concours/) に出た時です
https://github.com/gedorinku/study-battle
~~（いまはprivateですが、あと何日かしたら公開されると思います！まあものすごいスパゲッティコードなので見ないほうがいいかもですが・・・）~~

プログラミングがまともにできない私にとっては最初の学習コストが高かったですが、使えるようになったらとても便利で、最近は補完もかなり効くようになってるし、よほど小さいプロジェクト以外の時は絶対使うと思います

(　´∀｀)＜これからはMVVM*のデザインパターンをきちんと習得したい

※MVVMとは Model + ViewModel + Viewの略です。
AndroidのMVVMに関してはこちらの記事 [Android Data Binding + MVVMパターンのサンプルを書いてみた](https://qiita.com/amay077/items/b5c788bb3ee9ff84d9b4) とかが分かりやすいと思います！
##RxKotlin(RxJava2) + Retrofit2 + Okhttp3 + gson
https://github.com/ReactiveX/RxKotlin
http://square.github.io/retrofit/
http://square.github.io/okhttp/


この4つはサーバーと通信したりAPI叩いたりするのに必須といってもいい気がする最強ライブラリです！！
実を言うと私はまだこの3つ（特にRx）についてはあんまり理解できてないです:;(∩´﹏`∩);:＜書くことが少ないよ。

ここからは偏見なんですが、
私のようにそもそもプログラミング全般（Webとかも）に関する知識がかなり乏しい人にとっては、最初はRetrofitとokttpはただの暗号に見えると思います。(私なんて@Query とか @Field が一体何なのか分からず、最初つらかったです)

今本当にわかっている自信があまりないですが、とりあえずRequest Bodyあたりを触らなくていいような単純なAPIは叩けるようになりました！（もうちょっとちゃんと経験を積みます）
個人的にはこの方の記事 (http://outofmem.hatenablog.com/entry/2016/04/15/005541) が一番わかりやすかったです！

JSON×RetrofitはJavaじゃなくてKotlinで書くことの良さを感じさせてくれます。（data class最高!!）

Rx(Reactive Extensions)はfliterとかmapとか沢山のmethodがあり、しかも非同期処理が簡単にかけます！（単純のなら）
けど、本当に理解したり、完全に使いこなせるようになるのは大変そうです・・・（頑張りたい:rainbow:）

##Glide
https://github.com/bumptech/glide

Glideは画像を扱ううえで欠かせないライブラリです！
gifだって何だって楽々！！

```kotlin:hoge.kt
Glide.with(activity).load(url).into(view)
```
これだけでviewにurlの画像が読み込まれるんだよ？すごい（凄い）
DataBindingと一緒に使ったらもっと最強！？

##Material Drawer
https://github.com/mikepenz/MaterialDrawer
ちょっとかっこいいアプリを作ろうと思って Navigation Drawer実装したいって思ったけど時間がなくていいライブラリないかなぁって探してたら見つかったライブラリ。

Listのitemを増やしたり、Navigation Drawerの色をカスタマイズしたり、アカウント切り替えの処理がすごく簡単にできるので、自由度がある程度低くても大丈夫ってときは使う開発コストがかなり落とせると思います！

※ただし、アイコンの設定にGlideが使われてるはず？なのに、アイコン設定時の引数をuriやurlにすると読み込まれないというバグが放置されてる模様？なのでわざわざbitmapに変換してから設定しなきゃいけなかったのでそこは注しなきゃいけないと思います！（このバグについて相談したら@gedorinku 先輩がbitmapに変換する処理を実装してくれた）


#便利だったSDK & お世話になったAPI

## Azure-Microsoft.CognitiveServicesComputerVision API
https://portal.azure.com
部活の合宿でgedorinku先輩と一緒に作った、飯テロ専用アプリ
[Meshitter](https://github.com/gedorinku/Meshitter)　で使いました！
写真が食べ物かどうかを判定してくれます！（私はfoodって文字列が含ませてるか確かめただけ）
すごい(((o(*ﾟ▽ﾟ*)o)))！！
このアプリは今も使ってます。

## 二フクラ mobile backend (android sdk)
https://console.mb.cloud.nifty.com
kosenハッカソンで「ファイルストア」機能を使わせていただきましたが、便利でした！
使い方もサンプルコードがあるのですぐにわかるし、ある程度無料なので、またハッカソンに出たりする機会があれば使わせていただく可能性大です。
その時に作った作品　[101ばんどうろ](https://github.com/hunachi/101BanDouro)
~~（今はprivateですがちゃんとpublicにします。）~~ <-publicにしました!(new)

##駅すぱあとWebサービス
http://docs.ekispert.com
上記同様 kosenハッカソンで使わせていただきました。
バス停とかの情報も凄い量のデータが取得できました！さすが [Yahoo!路線情報](https://transit.yahoo.co.jp/) で使わせてるだけあるなぁ(੭ु´･ω･`)੭ु⁾⁾
ただ今回使わせていただいてる [緯度経度からの周辺駅検索](http://docs.ekispert.com/v1/api/geo/station.html) は有料のプランでしか利用できないのでMash up Awardsでゲットした12月末までのライセンスの寿命までにアプリを磨きあげ終えたいです😤
けどけど [フリープラン](https://ekiworld.net/service/sier/webservice/free_provision.html) があるので別の機会にも利用させていただきたいです！
コメントで教えてくださったhmaruyamaさんありがとうございます(((o(*ﾟ▽ﾟ*)o)))

#おわりに
完全にAndroidしてる人にしか通じづらい＆Androidしてる人はもう知っている情報の記事になっちゃいました・・・( ˘ω˘ )＜許してください。
もう一回アドベントカレンダーが回ってくるのでそれまでに何かしらアプリを完成させれたらその話を、もし無理だったら"なぜJavaをほとんど触らずKotlinを書くようになってしまったか"とかについて書けたらいいです！！


あとちょうど7か月後、誕生日なのでよかったら[ほしいものリスト](https://www.amazon.co.jp/gp/registry/wishlist/3HS4HXT8KI9UB/ref=んa v_wish list_lists _1) 
明日は@wing3196先輩…いや葵先輩かな？楽しみです！