いまからAndroidアプリを作るならこうしたい
仕事でandroidアプリを作ったので感想 + こうしたかったとかあるので記録がてらメモ
前提
- フリーランスとして知り合いからandroidアプリ作ってよって言われて作ったが、自分自身androidアプリ作成経験はない
- とりあえずandroid studio落としてきてkotlinでサンプルコード書いて動いたことあるレベル
- そんな人間になんで仕事来たのかは謎だがやりきった
- すでにiOSアプリはあるので、呼び出すApiやロジック等はswiftのコード見ながらいい感じにやる
- 周りに相談できる人がほぼいない
- たまにTwitterでギャーギャー言ってたら @konifar さんが助けてくれてマジで神と思った
- kotlin 1.3. + android studio 3.3. で開発
- Javaは全くわからない
- android端末自体はプライベートで持ってないのでデフォルトの挙動がいまいちわからない
アプリ自体はとあるサービスの有料会員限定で使えるサービスのものなので、URL等は貼らない
アーキテクチャ
Amazon.co.jp: 黒帯エンジニアが教えるプロの技術 Android開発の教科書 やネット上の記事を読んだりしてMVPで作ることにした。 結果的に良かったのかがあんまり実感がない。
githubだとこの辺を参考に
技術書典で売ってた本が結構良かったが、開発が終わりそうなタイミングで読んだのが微妙だった
これらのと出会って、あーもっとこう書けばよかったと思うことがめちゃくちゃあったので、先に読みたかった
- テストが書けない人のAndroid MVP (技術書典シリーズ(NextPublishing)
- 【目次付き】Wantedlyの技術をゴゴゴッ!!と詰め込んだWANTEDLY TECH BOOK5を技術書典で頒布します!
JSONのparseについて
ApiにRetrofit + JSON parseにgoogle/gson を使っていたが、サーバー側で正常時は配列なのにエラー時は空文字みたいな感じで同じキーなのに状態によって中身が変わることがあった。
型が持てないので悩んだ結果、Anyにして受けれるようにしてLinkedTreeMapをcastしてvalueを取り出すことにした
data class Item( var id: String, var data: Any )
square/moshi は使ってないんだけど、こっちならこの辺対応できるのかもしれない
ハマったところ
エミュレータのhostの書き換え
ローカルのサーバー環境がlocalhostではなく、http://development.hogehoge.com
的な感じでアクセスする必要があったので、android端末が持つhostを書き換える必要があった。
Android エミュレータの hosts ファイルを編集 - なんとなくな Developer のメモ みたいな感じでやると書き換わるんだが、その後エミュレータが起動しないという現象になる
悩みまくった結果、 $HOME/Library/Android/sdk/emulator/emulator -avd XXX(エミュレータ) -writable-system
で立ち上げた状態なら起動するので毎回ターミナルからコマンドを叩いてからエミュレータ起動という流れで開発していたが、これ以外のやり方がわからなかった
data classについて
JSONをパースするclassを最初は data class
で作っていた
data class Item(var id: String, var title: String, var url: String) interface ItemInterface { @GET("v2/items.json") fun items(): Call<List<Item>> }
しかし、データによって条件を出し分けたいみたいな関数をどうしても欲しくなって結局classにするみたいなケースが頻繁してdata classと普通のclassが混ざってすごい気持ち悪くなった
data classのベストプラクティスがよくわからない…。
アプリのクラッシュ
プッシュ通知と分析とアプリのクラッシュにfirebaseを使ってる
設定を入れるだけでパッと使えるのですげー便利
ただ最初のリリースでユーザー ID を設定し忘れたのはミスった。
ついでにクラッシュした際のログにどの画面を見ていたかみたいな操作ログも入れた
Firebase Crashlytics のクラッシュ レポートのカスタマイズ | Firebase
debugビルドの場合は hyperion-crash
ってライブラリを使ってる。
Firebase Crashlyticsの場合は若干ラグがありリアルタイムで見れるほうが便利なので、こっちを使ってる
参考にしたモノ
- DroidKaigi2018の資料一覧 - Qiita
- how to get started in developing Android app - Speaker Deck
- punchdrunker/hocho: sample app for getting started in android dev
- はじめてのKotlinハンズオン #DroidKaigi - Speaker Deck
- mixi-inc/AndroidTraining: Training course repository for android app development
- Android開発をする上で知っておいてほしいなと思うこと - こやまカニ大好き
小技
- ググっても古い情報がやっぱ多いので、Chromeの拡張でGoogle検索結果を1年以内にするは必須
- また、githubのコードは読みまくったがChromeの検索エンジン追加機能で
https://github.com/search?l=Kotlin&q=%s&type=Code
って形で追加することでchromeの検索バーからgithubでkotlinのコードを簡単に検索できるようにしたもの頻繁に使った - https://github.com/trending/kotlin?since=weekly もちょいちょい見てた
- Try Kotlin で小さいプログラミングを書いて検証してた
他にもlistの更新とかレイアウトの違いやandroid独特の動きやデザイン、ディレクトリ構成とかいろいろあるが、一旦はこんな感じで
最近読んだ本たち10冊 + 漫画とか
いろいろ本読んだので、メモがてら残しておく
読んだってだけであって、全部オススメってわけではない。
はてぶ棚卸しをAWS Lambdaで動かす
はてぶを結構使っていて、過去にはてなブックマーク棚卸しというサービスを使ってた。
全自動ブックマーク棚卸しが想像以上に有意義な件 - てっく煮ブログ
自分がはてぶしたやつが半年後とか1年後にRSSでもっかい配信されてくるだけど、あーこれもっかい読んでおこうと思う記事って意外と多くて、棚卸しから配信される記事を掘り起こしてみたいな使い方をしていました。
ただ、Yahoo!Pipeが終了してはてぶ棚卸しが死んでしまったので、存在自体を忘れていたんですが、最近思いだしたのでとりあえず復活させたお話です。
まぁほぼクラスメソッドさんのやつ丸パクリ参考にして作りました
Yahoo!Pipeが終了して全自動はてブ棚卸しが使えなくなってたのでAPI Gateway + Lambdaで自作してみた | Developers.IO
とりあえずハマったところだけメモしておく。
続きを読むpythonからslackのApiを使ってみる(DMの内容ダウンロード)
slackでDMをダウンロードしたいなぁと思ったのでpythonで書いてみた
管理者権限でもDMはダウンロードできなさそうだったので
pythonあんま書いたことないからこれでいいのかわからん…
tokenは OAuth Tokens for Testing and Development | Slack とかで取得できます
channelは im.list method | Slack から取ってきます
MySQLの細かいTips
kamipoさんによるmy.cnf がgithubにあがってるのでそっちのほうがスーパー参考になると思われる
ctrl + w で単語削除
$ vi $HOME/.editrc bind "^U" vi-kill-line-prev bind "^W" ed-delete-prev-word
bashなどはaaa bbb ccc
という文字列があった場合、ctrl + w
で単語指定で削除できますが、MySQLプロンプトのクエリ上でも実現するための設定です。
よく select * from hoge where id = 10000;
ってあった場合に10000
だけ消したいとかって時に使う。
他にも以下のやつはよく使います。(標準で使えるはず…)
ctrl + a
先頭に移動ctrl + e
末尾に移動ctrl + r
過去に入力したコマンドのインクリメンタルサーチ
my.cnfの場所探し
$ mysql --help | grep my.cnf
複数あったら表示されて、左から順番に読み込まれる。
mysqlのプロンプト表示
# my.cnfに記載 [mysql] prompt="[\u@\h](\d)> "
これを入れると[root@localhost](database)>
みたいな表示になる
最低限はこれあれば大丈夫な気がするが、本番環境の場合は色変えたいとかあれば頑張ってみてもいいかもしれない。
スキーマ名の補完
# my.cnfに記載 [mysql] auto-rehash
テーブル名の補完等ができるようになる
mysqlのsafe-updateについて
where句のつけ忘れたupdateとかdeleteとか悲しみに溢れる前に弾いてくれます
# my.cnfに記載 [mysql] safe-updates
コマンドラインからMySQLを実行したい
$ mysql -uhoge -phoge database -e 'select * from hoge;'
コマンドラインから実行して加工したい時によく使う。
-N
もつけると結果からカラム名が削除されるのでなお加工しやすい。
explainについて
explainは死ぬほど記事があるので、そちらを読んでもらって自分があんま知らなかったことだけ記載。
explain EXTENDED
explain EXTENDED SELECT * FROM hoge where name = 'fuga'
explainに EXTENDEDをつけるとfiltered
というカラムが追加される。これはテーブルに対して何%ぐらいがWHERE句などで絞り込まれるかの推測値が出力されるらしい。
(が、100以外見たことないのでよくわからん。。)
MySQLのバージョンが5.7になるとExplainのデフォルトに載るらしい
explain format=json SELECT * FROM hoge where name = 'fuga'
ちなみにformatをjsonに指定すると、5.6でもfiltered
のデータは載っかる
order by について
created_at の order by は撲滅しよう
スローログ周り
(あとでいい感じにするが、とりあえずリンクだけ)
日々の覚書: MySQLのスローログ関連のパラメーターが評価される順番
mysql > select start_time + INTERVAL 9 HOUR AS start,query_time,sql_text from mysql.slow_log where start_time > '2015-01-01 00:00:00' order by start_time desc;
RDSの場合、タイムスタンプがUTCなので+9時間しておくと実際の時間と比較できてわかりやすい。 fileのほうがパフォーマンスいいとおもうけど、RDSでfileってできるんかな…