いまから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だとこの辺を参考に

技術書典で売ってた本が結構良かったが、開発が終わりそうなタイミングで読んだのが微妙だった
これらのと出会って、あーもっとこう書けばよかったと思うことがめちゃくちゃあったので、先に読みたかった

JSONのparseについて

ApiRetrofit + 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の場合は若干ラグがありリアルタイムで見れるほうが便利なので、こっちを使ってる

参考にしたモノ

小技


他にもlistの更新とかレイアウトの違いやandroid独特の動きやデザイン、ディレクトリ構成とかいろいろあるが、一旦はこんな感じで

あなたが最も面白い漫画を5つ選ぶとしたら?という記事のはてぶコメントからマンガタイトルを抜き出してみた

あなたが最も面白い漫画を5つ選ぶとしたら? って記事からはてぶのコメントに書いてあるマンガのタイトルを全部出したかったので、とりあえず出してみた

2018/06/10時点でのはてぶのコメントからpython + mecabでぶっこ抜いてます。
pythonも素人だし、形態素解析的なやつも素人ですが、とにかくマンガタイトルを全部出してみたかった。。。

結果を見てもらえればわかると思うけど、変な結果も混じってるのでそこは察してもらうしかない(2部みたいなやつはジョジョのはず)

続きを読む

個人事業主関連の税金周り

なんとなくフリーランスになろうと思ってとりあえず開業届を出してフリーランスになったはいいけど、税金周りの知識がなさすぎたのでいろいろ調べた内容をメモがてら残しておく

※自分周辺しか調べてないので、全部のケースは恐らく網羅できていないまたは全然勉強不足で誤ってる場合もあるので、あくまで参考程度として読んでもらえれば…。間違ってる場合はなんかリアクションくれると嬉しいです

続きを読む

はてぶ棚卸しを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.cnfgithubにあがってるのでそっちのほうがスーパー参考になると思われる

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だけ消したいとかって時に使う。

他にも以下のやつはよく使います。(標準で使えるはず…)

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ってできるんかな…