eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

In-App Updates API導入に失敗した

In-App Updatesの特徴

  • ユーザーにアップデート通知を能動的に行える
  • 公式UIなので、Androidを使用しているユーザーだったり、文字を呼んでくれるユーザーであればアップデートを促せる

なぜ失敗したか

  • Closed Channelでは機能しない
  • 特殊用途のアプリでは使えない
  • 残念

CircleCIのsave_cacheステップで `x509` エラーが出る

正常にSaving Cacheが行えない

  • こんなエラーが出て、Saving Cacheに失敗する場合がある
Skipping cache - error checking storage: error fetching info: RequestError: send request failed
caused by: Head https://circle-production-customer-artifacts.s3.amazonaws.com/picard/hogefuga.tar.gz: x509: certificate signed by unknown authority

原因

  • Plainなイメージ( ubuntu:18.04 とか)の場合、サーバーの証明書もインストールされていない
  • なので、Dockerイメージ内からアップロードしようとして失敗する

対策

  • 証明書をインストールすればいい
  • こんなstepを入れる
      - run:
          name: install tools
          command: |
            apt update
            apt install -y ca-certificates
            update-ca-certificates

Ubuntu 19.04をインストールした環境でAndroid Emulatorが激重になる問題の対処

状況

問題の観察

  • QEMUはインストール済みで、KVMは正常起動する
  • Dockerが動作しているので、仮想環境はONになっている
  • たまに高速に動作する
  • けど起動してしばらくすると遅くなる

さらなる観察

  • レンダリングをソフトウェアレンダラに変えるとそこそこ早く動作する
    • ただし、CPUを喰う
  • レンダリングをハードウェアレンダラに変えると、起動直後は軽快になる

自分の行動を観察

なぜ移動させると遅いのか?

  • Ubuntu 19.04から、ディスプレイ拡大率を100%, 200%以外に設定できる
  • その時は125%に設定していた
    • ちょっと解像度のいいThinkpadを買ってた
  • 画面横幅を125とした時、100よりも右側に寄せるとレンダリングが遅くなる事象を発見する

解決策を探す

  • 状況の観察から、考えられる問題は
    • GPUが正常に使われていない
    • Ubuntuのスケーラーが正常に動作していない

さらなる観察をする

  • GPUの問題であれば、OS全体に影響があるはずである
  • ウィンドウをマウスでグリグリ移動させる
    • 125%のときにチラツキが発生する
  • 100%のときとは明らかに異なるチラツキ
    • ディスプレイ品質ではなく、グラフィクスエンジンの問題に見える
    • シングルバッファレンダリングのような挙動だ
  • 100%に解像度を戻し、WebGLベンチマークを回す

改善への道

  • チラツキの改善に関する記事を探す
  • 設定する
  • 再起動する
  • 100%の拡大率で、無事にWebGLベンチマークで60fps動作!
  • 125%の拡大率にする
    • 動作が40〜50fpsに落ちる
    • どうやら、整数倍スケール以外の拡大率を指定するとレンダリングが遅くなるらしい
    • 今後に期待
      • OpenGLドライバ(mesa)を2019-04-23に更新したら55〜60fpsまで改善した
  • その状態でAndroid Emulatorを起動
    • ほぼ正常と思える速度でAndroid Emulatorが動作
    • 右端に寄せても問題ない

ペンギンハイウェイは面白い

  • BDを購入してから、息子も娘も毎日のようにペンギンハイウェイを観てる

Thinkpad X1 Carbon 2018を購入~OSセットアップまで

セットアップ

Ubuntuを基本にしつつ、Windows 10 Proを併用するつもりだったので、購入してすぐにいろいろ弄り倒す。

失敗1 初期セットアップ時にMicrosoftログインをしてしまった

  • Users/<メアド>/Home ディレクトリになってしまう
  • 任意のディレクトリ名にするためには、初期セットアップ時にMicrosoftアカウントを使わずにオフラインアカウントを作る必要がある
  • 再セットアップ

失敗2 Ubuntuインストールに失敗

  • 1TBストレージの半分をUbuntuのために明け渡した
  • 19.04をインストールした
  • Windows側のBootloaderが破壊された
  • 再セットアップ

Biosセットアップ

  • Fn <--> Ctrlスワップ
  • Secure Boot [Disable]
  • UEFI / Legacy Mode [Legacy Only]
    • コレは設定しなくてもThinkpadの場合は問題ないようなので元に戻した
  • Boot Mode [Diagnostics]
    • コレは設定しなくてもThinkpadの場合は問題ないようなので元に戻した

失敗3 Windows10だけ再インストールしようとしたらパーティションが飛んだ

OS再インストール

長かった

ライブラリプロジェクトでFirebase SDKを使ったUnitTestを動作させる

なぜコレが必要か?

  • Firebase SDKを組み込んだ処理は、通常 Google Services Plugingoogle-services.json をアプリに組み込むことで動作する
  • このPluginはApplicationビルド用のプロジェクトでしか動作しない
  • ライブラリプロジェクトにFirebase SDKを組み込んだ場合、上記の前提だとUnitTestをするためのApplicationプロジェクトが必要になってしまう
  • 明示的な初期化を行うことで、ライブラリプロジェクトだけでUnitTestが行える

方法

@RunWith(AndroidJUnit4::class)
class HogeTest {
   @Before
   fun before() {
        FirebaseApp.initializeApp(context, FirebaseOptions.Builder().also {
            it.setApiKey("hoge-fuga")
            it.setGcmSenderId("hoge-fuga")
            it.setStorageBucket("your-project.appspot.com")
            it.setProjectId("your-project")
            it.setApplicationId("hoge-fuga")
            it.setDatabaseUrl("https://your-project.firebaseio.com")
        }.build())
    }
}

通常自動的に行われる初期化を、手動でやることでUnitTestで動作するようになる。 ただし、InstrumentationTestでしか動かない(Firebaseの動作にGooglePlayServiceが必要)。

方法をスマートに

google-services.jsonandroidTest/assets に配置してロードすることで、ある程度勝手に初期化できるようになる。

            val json = ... // assetsからgoogle-services.jsonを読む
            FirebaseApp.initializeApp(context, FirebaseOptions.Builder().also { builder ->
                val root = JSONObject(json)
                root.getJSONObject("project_info").also { values ->
                    builder.setDatabaseUrl(values["firebase_url"].toString())
                    builder.setGcmSenderId(values["project_number"].toString())
                    builder.setProjectId(values["project_id"].toString())
                    builder.setStorageBucket(values["storage_bucket"].toString())
                }
                root.getJSONArray("client").getJSONObject(0).also { client ->
                    client.getJSONObject("client_info").also { values ->
                        builder.setApplicationId(values["mobilesdk_app_id"].toString())
                    }
                    client.getJSONArray("api_key").getJSONObject(0).also { apiKey ->
                        builder.setApiKey(apiKey["current_key"].toString())
                    }
                }
            }.build())

30代がエンジニアを続けるための第一歩

なにがあったのか

  • 仕事や確定申告やアレやコレで寝不足だった
  • それでも子どもは元気だった
  • 子どもが保育園から病気もらってきてしばらく登園禁止になった
  • それでも子どもは元気だった
  • 確定申告も待ってくれなかった

なにがおきたか

  • 3週間ちかく風邪の症状に悩まされた
  • せき、鼻水、頭痛
  • それでも仕事はやらなきゃいかんし、子どもは元気に遊んでくれと言う

何を改善すべきか

  • 風邪をナメて考えず、早めに医者に行く
  • 早く寝る。日付変更前に寝る
  • 睡眠時間を増やしたらかなり健康状態がかなり改善された
  • うがい手洗い大事
  • そして寝る。早く寝る

第一歩とは

  • おまえは若くない
  • 無理をできるほど若くない
  • 健康一番
  • 納期は二番
  • それでも確定申告はやってくる
  • 早めにやろう、確定申告

2020年4月追記

  • 今年も風邪をひきました