GodotアプリのiOSビルドを自動化しようとしたら少し苦戦した。
“GodotアプリのiOSビルドを自動化したい” の続きを読むDockerコンテナとローカルでGCPの認証情報を共有する
ローカルマシンで認証をする
gcloud auth application-default login
ローカルマシンでgcloud auth application-default login
コマンドを実行してアカウント認証を行うと、下記の場所にクレデンシャルファイルが格納される。
Mac: $HOME/.config/gcloud/application_default_credentials.json
Windows: %APPDATA%\gcloud\application_default_credentials.json
How Application Default Credentials works
クレデンシャルファイルをバインドマウントする
上記のクレデンシャルファイルをdocker run
のバインドマウント機能を使ってコンテナにバインドする。
docker run -v ~/.config/gcloud/application_default_credentials.json:/tmp/keys/adc.json:ro
上の書き方であれば、Dockerコンテナ内で /tmp/keys/adc.json
というパスでローカルのGCPのApplication Defaultのクレデンシャルファイルを参照できるようになる。(Macの場合)
Docker Composeを使う場合は下記のように指定すればOK。
version: '3'
services:
app:
volumes:
- ~/.config/gcloud/application_default_credentials.json:/tmp/keys/adc.json:ro
コンテナ内で参照するApplication Default認証のパスを指定する
GCPの各ライブラリは環境変数 GOOGLE_APPLICATION_CREDENTIALS
で指定された場所にあるクレデンシャルファイルを使って認証を行う。Dockerコンテナにマウントしたクレデンシャルの保存先 /tmp/keys/adc.json
を GOOGLE_APPLICATION_CREDENTIALS
にセットするように設定すれば、Dockerコンテナ内でローカル環境の認証情報を使ってGCPの各ライブラリを動かすことができるようになる。
version: '3'
services:
app:
environment:
GOOGLE_APPLICATION_CREDENTIALS: /tmp/keys/adc.json
volumes:
- ~/.config/gcloud/application_default_credentials.json:/tmp/keys/adc.json:ro
プロトタイピングを通じて分かったAR.jsのメリットとデメリット
AR.jsを使って、新しいインスタレーションのプロトタイピングをやってみたところメリットとデメリットが見えてきたので忘れないうちにまとめておきたい。
“プロトタイピングを通じて分かったAR.jsのメリットとデメリット” の続きを読むWeb AR開発用のJSライブラリ AR.js
これまでARアプリを作るときはARKitを使うことがほとんどだったが、マルチプラットフォームで動くライトウェイトなARアプリを作る機会があり、Web ARを試すことになった。Web ARを実現するためのライブラリは多数存在するが、2024年現在もっとも多く使われているライブラリは調べる限りAR.jsのようだ。サポートしているブラウザの種類や資料の数をみても、今の所AR.jsを使わない理由はなかったのでAR.jsを試してみることにした。
“Web AR開発用のJSライブラリ AR.js” の続きを読むVSCodeのLive ServerとLocal Port ForwardingでスマホからJSの動作確認する
VSCodeでLive ServerとLocal Port Forwardingを使うと、手軽にVSCodeで編集中のHTML/JSをスマホのブラウザから開いて動作確認できる。
“VSCodeのLive ServerとLocal Port ForwardingでスマホからJSの動作確認する” の続きを読むGoogle Slideのスライドをスクリプトで生成する
Google Apps Scriptに用意されているSlidesサービスを使うと、プログラムでスライドを新しく生成することができる。
https://developers.google.com/apps-script/reference/slides/slides-app
SlideApp
クラスのcreate
メソッドを使うと全く新しいスライドを新規で生成できるが、まっさらなスライドに要素を追加していく処理を全てスクリプトで書くのは結構大変なので、ベースとなるスライドをコピーするアプローチをとった方が何かと楽だ。
// srcFileId: コピー元のスライドのID
// filename: コピーして作られたファイルにつけるファイル名
const copy = DriveApp.getFileById(srcFileId).makeCopy(filename);
// 特定のフォルダに配置したければmoveToを呼び出す
// copy.moveTo(DriveApp.getFolderById(targetFolderId));
const newSlideId = copy.getId();
ファイルのコピーはSlidesサービスではなくDriveサービスのmakeCopyで行う。
const slide = SlidesApp.openById(newSlideId);
コピーしたスライドのIDをSlidesAppのopenByIdの引数に渡す形で、スライドを開き編集していくことができる。
const firstSlide = slide.getSlides()[0]
firstSlide.insertTextBox('Hello');
FlutterアプリのiOS CI/CD設定手順
Bundle Identifierの登録
Certificates, Identifiers & ProfilesでBundle Identifierの登録を行う。
App Store Connectでのアプリの作成
App Store ConnectのApps画面から「New App」を選んでアプリを作成する。Bundle Identifierは↑のステップで作成したものを選ぶ。
Xcode ProjectのBundle Identifier変更
Flutterから書き出されたXcode Projectを開いて、Bundle Identifierを↑のステップで作成したものに変更する。Product Flavorを使っている場合はそれぞれのFlavor用にConfigを作成して、それぞれのBundle Identifierを設定する。
Complianceの設定
Info.plistを開き、App Uses Non-exempt Encryptionの設定を追加する。
Post Cloneスクリプトの追加
Xcode Cloudでプレビルド処理を行うためci_scripts/ci_post_clone.sh
を作成する。
パッケージの使用有無によってCocoaPodsの呼び出しの有無、Product Flavor / Dart-define-from-fileの使用有無によって flutter build
の呼び出し方/引数が変わるので注意する。
ここまでの設定内容をレポジトリにPushしておく。
Testing Groupの作成
App Store ConnectのアプリのTestFlight設定画面で、Internal Testing用のTesting Groupを作成し、テスト用のApple IDを招待しておく。
Workflowの作成とテスト実行
Xcode CloudのWorkflowの作成を行う。ArchiveアクションのDeployment PreparationはTestFlight (Internal Testing Only)かTestFlight and App Storeのいずれかを選ぶ。Xcode Cloudの仕様なのか不具合なのか、この段階ではTestFlightの配信の設定ができないことがあるので、一旦ここまでで設定を完了し、手動で初回のビルドをトリガーし、ビルドが成功するかを確認する。
Post-Actionの設定とテスト再実行
Workflowの実行に成功したら、WorkflowをEditし、「TestFlight Internal Testing」のPost Actionを追加する。↑で作ったTesting Groupを指定し、再びビルドをトリガーし、ビルドが自動でアップロードされてTestFlightでテスト可能になることを確認する。
FlutterアプリをXcode Cloudでビルドする
数年ぶりにFlutterを試してみたら、思いの外快適で安定している。大規模なアプリでどこまで使えるのかはわからないが、少なくとも趣味で片手間にアプリを書く程度ならかなり良さそうだ。勉強がてら何かしらアプリを一つ作りたいと思い、年末頃から週末の空いた時間に開発を続けているのだが、ようやくそろそろリリースが見えてきた。
“FlutterアプリをXcode Cloudでビルドする” の続きを読むGoogle Apps ScriptでSpreadsheetの内容をBigQueryのテーブルに流し込む
Google Apps ScriptのBigQuery Serviceを使うと、Apps ScriptからAPI経由でBigQueryを操作できる。
“Google Apps ScriptでSpreadsheetの内容をBigQueryのテーブルに流し込む” の続きを読むGoogle Apps ScriptのBigQuery Serviceのメソッドの引数の調べ方
Google Apps ScriptからBigQueryの機能を利用するにはAdvanced ServiceであるBigQuery Serviceを利用する。
https://developers.google.com/apps-script/reference#advanced_services
このAdvanced Serviceのメソッドを調べるには少し知識が必要になる。
“Google Apps ScriptのBigQuery Serviceのメソッドの引数の調べ方” の続きを読む