ひよっこゲームブログ

なにもかも初心者のひよっこがゆったりと何かする

GoogleさんのGitHubが便利な話と愚痴の話

ちょっと前に音声認識のコードをゆるゆる書いてた
まぁ詰まってたとこは解決したんだけども

AndroidJetpackライブラリの1つにLiveDataっていうのがありまして
それを使うとAndroidのライフサイクルに処理が振り回されないんですよ

MVVM使ってどうこうとか
Databindingするにはどうこうとか

これらを使ってあげればそもそもコードで逐一制御しなくていいじゃんと
今更気が付いたんですねこれが

んで、調べてみるてリファレンス読んだけどこれがピンとこない
(もっとViewの操作が複雑な場合とかじゃないと恩恵薄そうではあるけど)

となってたどり着いたのがGoogleさんのGithub

Google I/O で使ってたアプリのプロジェクトファイルをそのまま公開してたんですねこれ

github.com

アーキテクチャの解説箇所に「LiveDataで良くしたんだぜうんぬん」と書いてありまして
これがまぁ参考になりそうなことよ

しかもテストコードもしっかり付属してます



いやぁ助かる








最近まぁなんか色々やろうと気力を振り絞っているのですが
今日は全然身体が言うことをきかなくて断念

今日もジムで運動した後ならなんとかなると思ったんだけどなぁ
ここ年空けてから精神的に疲れてしまっている

多分年末に爆弾置いてかれたせいなんですけど

ひとまず2月の転職ドラフトの登録に間に合わせたいんですよね
1年で身に着いたことが世間でどのくらいの価値になっているのかを知りたい

明らかにまだ色々足りない部分が多いし
上手くいかなくてもそれが分かれば十分だけど
今の会社にいても自分でなんとかやっていく以外に他がないから早めに出たい

今は仕事でコード書いているのが誰のためにやっているのか分からない
「あなたならなんとかしてくれるでしょ?」みたいな振り方をされてるのが結構きつい

自分のやっていることが正しく「価値として届いているのか」分からない

もうちょっとアウトプットして、みんなに何やってるか伝えたいんだけど
とっとと仕事片づけて帰ってきても疲れてるんすよね

ゲームもなんか上手く楽しめないし

友人と接することだけが心の支えになっている

前の鬱病の予兆段階とは全然違うから少し時間を置けば落ち着くと思う


たぶん

去年買った本の話

去年プログラマーとして社会に飛び立ったので流石に色々と本を買って勉強したりした
全部は読めてないんだけど、経験として晒してみる

books.rakuten.co.jp プログラマーとして入社したのが2018の12月
それより前の無職期間で作ってたUnityのゲームで散々なコードを書いて
昨日の自分を恨みながらコードを読むことが多かったので反省しながら読んだ

会社の人のコードはめちゃくちゃで頭を抱えたのはまた別の話


books.rakuten.co.jp AndroidエンジニアとなりJavaからKotlinにしよーぜって感じで唐突に始まったので読んだ
Kotlin楽しいです
新機能など追加の流れが速いので、基本で読むといいです


books.rakuten.co.jp 実際コード改修しようとしてもどうしたらいいのか分からんということで買ってきた
そしたら「テストコード書こうぜ」って書いてあって
違うんだテストが書けないくらいこんがらがってるんだ、ってことで必要な部分だけ読んでスルー


books.rakuten.co.jp 入社してちょっとしたら中途の新人の面倒を見ることになって頭を抱えて読み始めた
こいついつも頭抱えてんな

ストーリーテリングで解説してくれていて、読み物として普通に面白い
基本的にはアジャイルの話だけど、普通に組織に役に立つ考えとかあるので良い
今年に同シリーズの本がまた出るとかなんとか


books.rakuten.co.jp カイゼン・ジャーニーでふんわりと学んだことに一歩踏み込んで読める本
アジャイル銀の弾丸じゃねーぞ!って歴史的背景から解説してくれたり
ちょっと堅苦しいけどこれも面白い本でした


books.rakuten.co.jp 急にテストが欲しいとか言われたので書くことになったが知識がない
知りたいことが解説されているとこがいまいち無いので買ってきた
JUnitの他にもテストについて書いてあってためになるなぁという感じ


books.rakuten.co.jp UIテストは書けた。んでUnitテストって何ですかという疑問を抱え
和田卓人の名前を知ってそのまま買ってきた
途中まで読んだ。手を動かしながら読むのが正解かもってなって放置中・・・


books.rakuten.co.jp 古本屋でくっそ安かったので購入した
プログラマーとしてどうやっていったらいいの?みたいな本
皮肉とか満載で楽しく読める。時間が取れなくて途中までしか読んでない・・・


books.rakuten.co.jp RxJavaを学ぼうとして、デザインパターンって何?分かんねぇ!ってなって買ってきた
実際は言語やライブラリに実装されているので一から書くことはないなーって

覚えるのではなく、考え方を学べと大学の先輩に助言をもらった


番外編
books.rakuten.co.jp 組織の話やメタ認知の話が非常に役に立った

Androidの音声認識を使ってみたけど上手くいかなかった話

[ 解決 ] 停止時に

speechRecognizer.setRecognitionListener(null)

 

//---------

 

Android音声認識を使ってみたという日記

結果からいうとあんまり上手くいかなかった

(実用的じゃない気がする


ここのブログを参考にした

http://kivantium.hateblo.jp/entry/2016/02/29/191901

 

あとAndroidDeveloper

https://developer.android.com/reference/android/speech/SpeechRecognizer


SpeechRecgnizerを利用して音声認識用のクラスを作ってみたんだけど

外部からstartListening() を呼び出したあとにバックグラウンドに行くと

音声準備処理し終えたあとonRmsChanges() の処理が永久に続いてどっかいった

(なんか1回だけ上手くいったけど奇跡的で分からんかった)

 

呼び出し元のActivityのonStop() で制御したりできないかなーと思ったけどダメ

 

なんかライフサイクルに振り回されている気がするんだよなー・・・

どこかの実装が間違ってるのかなぁ

 

ちなみにForegroundServiceで実装するしないに関わらずどっかいった

 


南無三

 


そもそも音声認識を実行する時間とか一切設定できなくて

(昔はできたっぽいんだけど、現在はその操作自体が非推奨でRecognizerIntentのリファレンスに「使うな」って明記されている)


しかも 認識開始 -> 認識終了(動作終了) -> (仕方ないのでdestory()の後に再起動させる)

みたいな実装じゃないと数秒しか動かないし

(これは音声認識できたできないに関わらず終了する)


上記の実装をすると音声認識開始時にAndroidのシステム上

録音開始音が鳴るんですよね、うるさいねーん

 

そのためstartListening() の前にシステムの音量を0にして

onReadyForSpeech() が呼ばれた時点でシステム音量を復帰させる

みたいな処理じゃないといけない


そもそもGoogle的にはこの辺スパイアプリの実装っぽいので

あまりやらせたくないみたいだしー・・・


音声認識の呼び出しとかはぱっとできるし、認識の制度はいいんだけど

実装してみた感じではあまり実用的ではないかなぁみたいな・・・

 

実際使ってる人も少ないし

アプリがバックグラウンドにいっても音声認識させたいみたいな需要がない

 


設計的には

1.SpeechRecgnizerの音声認識処理を呼ぶ

2.音声認識の結果を返す

3.結果から文字列のマッチでパターンを分けて処理

でコールバックでどうにかしたいんだけど

 

その場合はSpeechRecgnizerのリスナーでonResult()に入った時

初めて動作させないといけないのでObserverパターンがいいのかしら

 

となったがデザインパターンとか全然知らんかったんで

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩

https://www.amazon.co.jp/dp/4797327030/ref=cm_sw_r_tw_dp_U_x_I3E9Db9MTMA6C

これを買った。読む本だけが増えていく


動作のトリガーさえうまく掴めれば

LiveDataとかDataBindingとかその辺でうまくできそう


コールバックについて調べていたら、RxKotlinなるものがあることを知った

https://github.com/ReactiveX/RxKotlin

JVMしたいらしくて、名前の通りRxJavaのKotlin版みたい

 


学ぶことが多すぎるっぴ

Androidで使う技術の話

つよつよAndroidエンジニアになるためには
必要なんじゃねーかなぁという技術を列挙してみる


Android Jetpack
DataBinding ⇒ findViewById() 使わずレイアウトにぶち込んで同期する
LiveData ⇒ ライフサイクルに振り回されないようにするやつ
Navigation ⇒ Activity遷移の監視
Paging ⇒ リストビューとか
Room ⇒ DBにぶち込む
ViewModel ⇒ LiveDataとかDataBindingとかと一緒につかう(管理)
WorkManager ⇒ タスクの実行の管理(だったっけ


ライブラリ
RxJava ⇒ 同期処理とか(だった気がする
RxLifecycle ⇒ ライフサイクルの監視系(だった気がする
Retrofit2(okHttp) ⇒ APIめっちゃ楽
Dagger2 ⇒ 依存性注入奴。Koinってどうなんでしょうね
moshi ⇒ jsonとか使うときに
AndroidKTX ⇒ 忘れた


テスト
JUnit ⇒ この辺は前に書いた
JUnitRunner ⇒ この
Espresso ⇒ 辺
UIAutomator ⇒ 前
Robolectric ⇒ 書いた
mockito ⇒ モックのやつ


Androidの基礎とか設計とか
ライフサイクルの理解
アプリのコンポーネント
・アクティビティ ⇒ 要は画面
・サービス ⇒ 裏で動くやつな!音楽プレーヤーとかいい例
・ブロードキャストレシーバー ⇒ サービス側で受け取ったのをなんとやら
・コンテンツプロバイダ ⇒ まだ理解できてない
MVVM / クリーンアーキテクチャ ⇒ 綺麗に分離させて書けない・・・


Android周辺の知識
Firebase (FCM) ⇒ PUSH通知とかで使う
GooglePlayConsole ⇒ テストユーザーにアプリのCloserdβとか公開できる
リリース周りのあれこれ ⇒ リジェクトされたときめんどいぞ!


そのほか
Kotlin ⇒ まだまだJavaライクにしか書けてないので反省
xml ⇒ ガワ書くのめんどい
Git ⇒ まぁ
GitHub ⇒ 業務で使ってないので知識が不安すぎる
CI / CD ⇒ 業務で(略)


結構多いな
1/3くらいは使ったり理解したりできてると思う・・・

これ全部きちんと使えたら、まぁ間違いないと思う
なんかあったら誰か補足してくれ

AndroidのUIテストの話とかふんわり

denden-kata.hatenablog.com


前は軽い説明だけ書いたので、UIテストのコードとか
UIAutomatorの一部記載がdeprecatedなんだけどまぁそのうち
早く自動で動くテストが見たくてそのまま実装してしまった


これでJUnit4使える

@RunWith(AndroidJUnit4::class)
class hoge {
    // いえーい
}


実際にはこんな感じ

// ぱっけーじ
// いんぽーと

@LargeTest
@RunWith(AndroidJUnit4::class)
class testCode {

    @Rule
    @JvmField
    // テスト時に最初にいるActivity(= hogeActivity)
    // Espressoでの自動生成時にmActivityTestRuleって名前だった。変えてもいいのかしら
    var mActivityTestRule = ActivityTestRule(hogeActivity::class.java)

    @Before
    fun setUp() {
        // テストが走る前に動くのでデータの初期化とかしとけばいいんじゃない?
    }

    // UI Automator
    private val uiDevice: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

    @Test
    fun hoge() {
        // 自動生成で出てくるボタン指定クリックはクッソ長いけど1行でまとまる
        // なんか適当なボタンのid = buttonid
        // 指定したidを見つけ次第(isDisplayed())クリック
        onView(allOf(withId(R.id.buttonid), isDisplayed())).perform(click())

        // UI Automator系はR.idを直接指定できないので文字列に直す必要がある
        // -> convertToString()

        // 指定したidが表示されるまで5000ミリ秒待ってくれる 
        uiDevice.wait(Until.hasObject(By.res(convertToString(R.id.button))), 5000)
        val button = UiSelector().resourceId(convertToString(R.id.button))
        
        // UiObject Deprecated なおそうね!
        UiObject(button).click()
    }

    // idを文字列に変換するメソッドをホイ!
    private fun convertToString(resourceID: Int): String {
        return InstrumentationRegistry.getInstrumentation()
                .targetContext
                .resources
                .getResourceName(resourceID)
    }
}


UIテストのコードはだいたいこんな感じだと思う。待つのは通信時とか
あとはperform()で使ったのはこの辺

scrollTo()
スクロールする

replaceText() 
テキストボックスに文字を入力(正確には置き換え)
(直接入力する書き方もあるけど、こっちの方が正確)

closeSoftKeyboard()
そのまま。邪魔で不具合起きたりするのでキーボード閉じる


UIテストはボタンと画面があればひとまずテストとして成り立つのでしあわせ
ボタンの生成とか画面の生成を変な方法でやるのはやめようね(嗚咽)

あと自動で動くの眺めてるの楽しい


AndroidのUIテスト書くにあたって参考にした本
peaks.cc

2018年の本だけどほぼすべてこれで網羅されてる。あとは公式見る
正直定期的に出してほしいレベル。マジ

ぶっちゃけAndroidテスト本って無い。全く無い

実はO'Reillyにあるんだけど
www.oreilly.co.jp
2013年5月発行・・・
つまるとこ、Androidアプリ開発Eclipseが主体だったころですね、うむ。


Androidのテストって色んなもの使わないといけないんですけど他の分野ってどうなんですかね
テストコード書くの初めてだったもんで勝手がわからん

UnitテストはRobolectrics(実際サンプルのプロジェクトでしっかり書いてある
Retrofit2の MockWebServer, moshi
Mockito kotlinと
あとRoomとかもモック入れるためのなんかあった気がするしもうなんか色々

多い!

っていうか今のAndroidテストってどういう流れなん?
教えてすごい人!

JUnit4でなんやかんやするのはそのうちなくなりそう・・・
もうJUnit5だしね、そもそも自動生成がJUnitでJUnit4に手直ししないといかんし


最近はプライベートで勉強したことを
職場になんとか反映させよう一人で転がってる日々が続いてます

つらい


特にオチはないです

UIテストを書いたりした話

仕事暇になってテストがなかったのでAndroidのUIテストを書いてる

 

Espresso

https://developer.android.com/training/testing/espresso

 

UIAutomator

https://developer.android.com/training/testing/ui-automator

 

この2つ使っておけば何とかなる感じ

 

AndroidStudioのEspressoRecorder使ってからの手動修正

からの指定しにくいやつとかちょっと動的なやつはUIAutomatorで書いた

 

1回書き方わかるとRecorderいらなくなるくらいシンプルに書ける

というかいらない記載が多すぎる

 

Recoderで生成するとJUnitが古いバージョンなので

JUnit4で適当に手直ししていけばおっけーな感じ

 

JUnitのあんまりはっきりとした資料がなかったので本を買った(中古)

https://www.amazon.co.jp/dp/477415377X

 

概要とかテストの概念とかは今もそんなに変わらないから

読むとこ読んで普通に役に立つ感じ

 

テスト書くと分かるんだけどテスト前提になってないコードは扱いに悩む・・・

実際にユニットテスト書こうと思ったら難しすぎて吐いた

 

Bitrise使ってみる

CI/CDの知見を得るためにBitriseに手を出してみた

https://app.bitrise.io/dashboard/builds

 

CIツールだとAndroidならBitriseが良さそう

アプリの配布がdeploygateからGooglePlayConsoleに移行して

CircleCIから環境を移行させた企業も多いっすね

 

yml書かなくても全部GUIでポチポチやるだけでいいのも良い

お手軽!

 

そして実際に使ってみる

 

Githubのアカウントがあれば流れで適当に設定してOK

ブランチの名前さえ間違えなければ普通に紐づく

 

SSHの設定だけ後から行ってひとまずビルド

 

f:id:denden_kata:20191110113119p:plain

失敗しとる

 

んで、調べたらAndroidのKeyStoreファイルをアップロードしろとな

からの設定したけどビルドが通らず

 

そしてビルドの結果がメールで届く。おもろい

 

f:id:denden_kata:20191110113549p:plain

 

ビルドのログ見る限り、キャッシュを初期化しろとか書いてあった

調べると同じとこで躓いている外人兄貴も多いみたい。早くBuild Sucessが見てぇ

 

一番上は指定したブランチにPUSHしたとき自動でビルドしてくれたやつ

コミットメッセージが雑

デフォルトで設定されてるっぽい

f:id:denden_kata:20191110113420p:plain

 

ちなみにビルド失敗しまくるとヘルプチャットみたいなの飛んできて草ってなった

おもしろ

 

今日中にビルド通ればいいなぁ(他人事