eaglesakuraの技術ブログ

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

Kotlinでinterface定義モジュールと実装モジュールを分離した上で実装を隠蔽する

やりたいこと interface定義と、その実装をなるべくキレイに切り分けたい インターフェース定義用モジュール // ":interface-module" に定義を書いていく... interface AuthService { fun login(id: String, password: String) } 実装用モジュール // ":impl…

Androidアプリビルドの並列最大化の限界値

この記事ではコマンドラインによるフルビルドのみを対象にする gradleのソースコードと挙動観察での現時点での推測 ビルド速度に影響する要素 CPU論理コア数 シングルコアスペック メモリ プロジェクト自体の並列性 gradleのworker設定 gradleには --max-wor…

Firestoreのローカルエミュレーターは同時にトランザクション接続しすぎるとフリーズする

問題点 表題のまま 100個くらいのUnitTestがgoroutineで2〜3のトランザクションを並列発行した フリーズした 回避 UnitTest時のみ、トランザクションが集中する箇所でmutexによる排他制御を入れた まあしゃあない

FirestoreとMemorystoreとDatastoreと

Google Cloud Platformのサーバーデータはどこに保存するか SQL系は月額固定課金なので、気軽には使えない(お金持ちを除く) なので従量課金制の保存先としてDatastoreを気に入っていた DatastoreとMemcache DatastoreはFirestoreと両立できない アプリがFi…

Google App Engineで香川県ゲーム条例に対応する

雑感 条例が最短で春に施行される なるべく簡単に香川県民スマホ禁止条例に対応しなければならない X-AppEngine-City, X-AppEngine-CityLatLong Google App Engineはリクエスト元のIPからざっくりとした国・都市情報を取得できる X-AppEngine-City ヘッダを…

LiveDataを複数回observeしても1個のObserverしか登録されない現象と解法

前提 LiveDataのonActive/onInactiveで処理を行わせていた 強制的にLiveDataをactiveにするため、次のようなExtensionを作った LiveDataをactiveにしたいだけなので Observerはナニも処理していない // 強制的にLiveDataをactiveにする fun <T> LiveData<T>.forceA</t></t>…

10年代の思い出 / JavaのゲームをBREWへ移植した思い出ばなし

BREWとは 最近ではSnapdragonで有名なクアルコムがかつて開発していたOS 日本人的には auの KCP/KCP+ だ ガラケー全盛のauを支えようとしていた、かつての クソ OSだ 2010年代が終わり、記憶が消えてしまう前に、彼について記録と記憶を留めておこうと思う B…

続 RecyclerView in FragmentContainerView in MotionLayoutでリストが描画されない問題

Androidバージョンの切り分け これはAndroid 8.x以上で発生する Android 7.xでは発生しない 問題点1, そもそもRecyclerViewのWidth/Heightが0dpである デフォルトのvisibilityがGONEの場合、VISIBLEに切り替えてもレイアウトのサイズが再計算されない ワーク…

flutter buildで "Target kernel_snapshot failed" が出た場合の対処

エラー内容 flutter buildすると、dartコンパイル自体が異常終了する flutter clean flutter build aot Wrong full snapshot version, expected '20e5c4f7dc44368ac5a17643b93665f6' found '8343f188ada07642f47c56e518f1307c' Building AOT snapshot in rel…

2019年に作ったAndroid用ライブラリと、作った割に役立たなかったライブラリ

2019年、自分用に色々作っては「まあええやん」「コレあかん」という感じで新しいものを試したり壊したりしてきた ライブラリを作るのは個人的な趣味であり、いろんな設計を試せる娯楽であり、勉強でもある armyknife-* armyknifeシリーズ 自分用の十徳ナイ…

外出先での作業にモバイルモニターを導入した感想

動機 ほしかった やってみたかった 便利そうだった 購入したもの cocopar 12.5インチ/2K モバイルモニター/モバイルディスプレイ/薄型/IPSパネル/USB Type-C/標準HDMI/mini DP/保護カバー付/560g/3年保証 (カバー付)メディア: エレクトロニクス 4Kにしなかっ…

突然Google App Engineの特定APIが2回に1回しか繋がらなくなった問題への対処

状況 GAE/Go 1.12を使っている 複数のServiceをデプロイしていて、今回問題になったのは 認証用APIを提供しているService 環境セットアップのため、APIを連続で叩いてているとき、それはおこった 50回くらい同じAPIを叩く 動かなくなる直前 ナニもしていない…

Windows版Android Studioのターミナルでbashする

Windows版のTerminal IntelliJやAndroid Studioの標準Terminalはプラットフォームに合わせて起動する Windowsはcmd.exeが起動 bashのほうがなれてて使いやすい Terminalを変更する Settings > Tools > Terminal > Shell Path 標準だとcmdになってる こんなバ…

Windows版Android Studioの動作を軽くする

Windows版Android Studioは遅い どういうわけかデフォルト設定だと遅い CPUスペックとかに関係なく遅そう Code Completionが遅い LayoutEditorのプレビューが遅い そもそも起動が遅い どうにか高速化したい LinuxとかMacとかでは軽い 原因 Android Studio 3.…

開発リソースがないなら、Google Playのリリースは取り下げておけ、という経験則

こんな状況は危ない 昔は自社でアプリ開発してたけど、もうメンテしなくなって久しい とりあえずアップしておいて、使う人がいるならソレでいいや 何が起きるか Google Playは年1〜2回くらいはConsoleのアップデートがある アップデートにより、一部のアプ…

やっぱ時刻でIDとってるようなのはダメだな

何が起きたか 時刻ベース(ナノ秒)でUnique IDを割り振っていた 速度を向上させた UnitTestの実行速度が向上した みんなも使おうRyzen TR 人類皆RAM 64GB 何故かテストが落ちまくる ランダムで落ちまくる ランダムで成功する 1時間位頭抱えてた 問題点を見…

Flutterのプロジェクトが始まったらまずやること

XCodeと仲良くScheme設定 だいたいProductionとDevelop環境別れてるんだからSchemeを作成する SchemeとDebug/Releaseの組み合わせに合わせてConfigurationファイルを作成する 何をする用事がなくても、pre buildスクリプトはSchemeごとに設定しておく どうせ…

GAE/Go 1.12は認証ヘッダが重複しているとGoogle Frontendが自動的に400を返却する

どういう問題か GAE/Go 1.12にバージョンアップをした サーバー側のUnitTestは通過していた クライアント側のテストを行うと、特定APIがすべて400を返却していた ログが残っていない。少なくともGAEアプリコードに到達していない。 原因 クライアント側で Au…

日本でデジタル母子手帳を運用するとしたら?

この記事はなに? ちょっとした頭の体操である つらつら思ったことを書くだけ デジタル母子手帳 そのまま、いま子育て世代が(基本的に全員受け取っているハズの)母子手帳をスマホで見たり管理したりできるようになる 検索すると、色々ニュースやプレスリリ…

特定条件下でMotionLayout配下のViewが再描画されない問題のWorkaround

バージョン "implementation"("androidx.constraintlayout:constraintlayout:2.0.0-beta2") 問題点 MotionLayout配下にFrameLayoutを配置し、動的にコンテンツを入れ替える MotionLayoutはアニメーションで2つのレイアウト間を遷移させている 特定条件下で…

2019年壊れたものとその対応

Mac Book Pro 15inch late 2013 バッテリー膨張によりトラックパッドと筐体の歪みが発生 修理で20k飛ぶ Pixel3 購入直後に画像処理プロセッサが死んでいることが発覚 良品交換 しようと思ったら多重決済をしてしまい、一時的に30万円が吹っ飛ぶ Huawei P20…

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

In-App Updatesの特徴 ユーザーにアップデート通知を能動的に行える 公式UIなので、Androidを使用しているユーザーだったり、文字を呼んでくれるユーザーであればアップデートを促せる なぜ失敗したか Closed Channelでは機能しない 特殊用途のアプリでは使…

VSCode InsiderのRemote開発機能を試した

残念ながらRemoteはLinux x86のみ対応 MacをRemoteにして、FlutterやNativeアプリ開発をUbuntuから行いたかった RemoteはLinux x86_64のみ対応なので接続に失敗 残念 ここで施行は途切れている

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.…

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

状況 Thinkpad X1 Carbonを購入したので、Ubuntu 19.04をクリーンインストールしてセットアップした Android Emulatorを起動したが、動作が異様に遅い 1〜2fps程度しか動作しない 問題の観察 QEMUはインストール済みで、KVMは正常起動する Dockerが動作して…

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

セットアップ Ubuntuを基本にしつつ、Windows 10 Proを併用するつもりだったので、購入してすぐにいろいろ弄り倒す。 失敗1 初期セットアップ時にMicrosoftログインをしてしまった Users/<メアド>/Home ディレクトリになってしまう 任意のディレクトリ名にす…

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

なぜコレが必要か? Firebase SDKを組み込んだ処理は、通常 Google Services Plugin と google-services.json をアプリに組み込むことで動作する このPluginはApplicationビルド用のプロジェクトでしか動作しない ライブラリプロジェクトにFirebase SDKを組…

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

なにがあったのか 仕事や確定申告やアレやコレで寝不足だった それでも子どもは元気だった 子どもが保育園から病気もらってきてしばらく登園禁止になった それでも子どもは元気だった 確定申告も待ってくれなかった なにがおきたか 3週間ちかく風邪の症状に…

実質2日でDatastoreをFirestore移行した話

謝罪 ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい。 本番環境のFirestoreをONにしてしまったのは僕です。 何が起こったのか アプリから利用されるサーバーをGAE/Goで開発していた GCPプロジェクトは…

Androidアプリエンジニアが触れたAngularDartの所感

なぜWebアプリを作ることになったか Androidアプリ内でオープンソースライセンスを表示するためのUIが必要だった アプリとブラウザ両方からアクセスできるようにしたかった 規模が小さいため、Webアプリ開発の勉強としてちょうどよいので、作ることにした GA…