unagirabbit's blog

気づいたことをメモしています

もっとクックでキーマカレーを作った

katsumakazuyo.hatenablog.com

勝間和代さんのブログでほっとクックの別売りパーツが紹介されており、
苦手な炒めものが美味しくなるかも!?とすぐに購入してしまった。

jp.sharp

もっとクックはあめ色玉ねぎが作れるとのことで、付録レシピのキーマカレーを作りました。
作り方は購入者限定のようなので詳細は省きます。

まずはあめ色玉ねぎを作ります。

玉ねぎをセット

かなり時間かかりますがいい感じにできました。

あめ色玉ねぎが完成
ここに人参、カレー粉などを入れてもう一度蓋をします。
具材とカレー粉を投入

完成

油ぎっとりなカレー完成

レシピの写真より水っぽくなってしまいましたがいい感じに完成しました。
自作のキーマカレーより断然美味しかったです。

感想

手であめ色玉ねぎを作ろうと思うとかなり大変なのでありがたいです。
ほっとクックの苦手な炒めものでも活躍してくれるのではないかと思います。

【Jenkins】フリースタイルジョブでビルドするノードを指定する

Pipelineからフリースタイルプロジェクトのジョブをビルドする時に、
実行ノードを動的に指定する方法メモ。
Pluginが必要なのでnodelabelparameterをインストールしておきます。
plugins.jenkins.io

フリースタイルのジョブでビルドパラメーターにNodeを追加し、
Pipelineでは以下のように指定します。

steps {
    build job: 'job_name', parameters: [[$class: 'NodeParameterValue', name: 'param_name', labels: ["${params.node_name}"], nodeEligibility: [$class: 'AllNodeEligibility']]]
}

www.jenkins.io

【Firebase】AndroidだとTokenReceivedが呼ばれないことがある

FCMで個別端末への通知を行うにはトークンを取得する必要があります。
このトークンはFCM初期化後のTokenReceivedで受け取るのですが、
8.0.0以降のバージョンでは2回目以降の起動時にTokenReceivedが呼ばれないことがあります。
Androidでのみ再現し、機種や環境などが原因ではなく稀に発生するようです。

このバグは10.7.0でも修正されていません。

github.com

対策

https://github.com/firebase/quickstart-unity/issues/1088#issuecomment-1191030814

同スレッドで対策方法が紹介されています。
FirebaseMessaging.TokenReceivedのデリゲートで受け取らず、
FirebaseMessaging.GetTokenAsync()トークンを取得します。

public async void InitFirebase()
{
    try {
        var dependencyStatus = await Firebase.FirebaseApp.CheckAndFixDependenciesAsync();
        if (Firebase.DependencyStatus.Available != dependencyStatus) {
            // error.
            return;
        }
#if UNITY_IOS
        // iOSは問題ない
        Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
#else
        // Androidは手動で取得
        Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
        var token = await Firebase.Messaging.FirebaseMessaging.GetTokenAsync();
        // register token.
#endif
    } catch (Firebase.FirebaseException) {
        // error.
    } catch (System.Exception) {
        // error.
    }
}

asyncを使用せずメインスレッドで処理したい場合はContinueWithOnMainThreadを使います。

// using Firebase.Extensionsが必要
Firebase.Messaging.FirebaseMessaging.GetTokenAsync().ContinueWithOnMainThread(task => {
    if(true == task.IsCompletedSuccessfully) {
        // register token.
    }
});

Unity Accelerator アップロードが完了するまで待つ

Unity Accelerator アップロード完了まで待つ

Editorのクリーン起動をしたりReimportを行ってもキャッシュサーバーのキャッシュは少しずつしか増えない。
Acceleratorには強制アップロードのような機能は現時点でないため完了を待つしかない。
ログを見てもエラー内容の説明がないため原因もわからずです。

{
    "level": "debug",
    "ts": "2023-02-03T10:28:42.446Z",
    "msg": "handled getRequest",
    "agent_id": "unitytechnologies-accelerator1_id",
    "agent_name": "unitytechnologies-accelerator1",
    "component": "pbservice",
    "subprocess_id": 6,
    "conn_id": 11,
    "remote": "hoge",
    "segment_id": 11952,
    "namespace": "defaultmetadata",
    "key": "df4c38c695e1dbbf0361f5687a17e055",
    "status": "key not found",
    "status_code": 3,
    "size": 0,
    "blob_hash": 0
  },

フォーラムでアップロードの完了を待つ方法が紹介されていました。
batchmodequitをせずにバックグラウンドタスク(アップロード)の完了を待ちます。

forum.unity.com

public static async void RunAndQuit()
{
    try {
        await UniTask.Delay(1000);
        var delayCount = 0;
        while (Progress.running) {
            delayCount++;
            if (delayCount % 5 == 0) {
                Debug.Log($"Waiting background tasks ... ({Progress.GetCount()} tasks)");
            }
            await UniTask.Delay(1000);
        }
        Debug.Log($"{nameof(CacheUploadWaitRunner)}.Run() is complete. ({EditorUserBuildSettings.activeBuildTarget})");

    } catch(Exception e) {
        Debug.LogException(e);
        EditorApplication.Exit(-1);
        return;
    }
    EditorApplication.Exit(0);
}

あまりキャッシュされてないサーバーへのアップロードには5時間半もかかりました。
通常2時間半ほどインポートに時間を要していたプロジェクトでは、
それ以降インポートが30分~40分ほどになりました。

インポート中のログ

...
Artifact(artifact id=hoge, static dependencies=fuga, content hash=puyo) uploaded to cacheserver
Artifact(artifact id=hoge, static dependencies=fuga, content hash=puyo) uploaded to cacheserver
waiting background tasks ... (1 tasks)
Artifact(artifact id=hoge, static dependencies=fuga, content hash=puyo) uploaded to cacheserver
Artifact(artifact id=hoge, static dependencies=fuga, content hash=puyo) uploaded to cacheserver
...

すべてを一度ではアップロードできないようなので、
Libraryフォルダー削除~起動~プラットフォーム切り替え~を行うパイプラインを組んで毎日ビルドしています。

【Jenkins】ジョブのパラメーターや環境変数をビルド時に一括出力する

printenvコマンドで環境変数やパラメーターの出力が可能です。
Win環境でもMSYS2をインストールしていればshで同じように呼べます。

sh 'printenv'

たまに使うのは、ジョブをビルドするジョブを作る時です。
フリースタイルやScripted Pipelineのジョブはパラメーターを列挙するのが手間だなと思うので。
そういう時に全部出して必要なものだけ渡すジョブを作るのに楽です。

UnityHubとUnityをコマンドラインでインストールする

事前にpkg/exeを用意せずビルド環境を構築するメモ。
UnityHub(2.1.0〜)からコマンドラインがサポートされました。
UnityHubもコマンドでインストールできるので全てコマンドで完結します。
pkg/exeを利用したインストールはこちら。

docs.unity3d.com

1. UnityHubをインストール

すでにインストール済みの人はスキップ。
Windowsはwinget、Macbrewでインストールします。

Windows
https://winget.run/pkg/Unity/UnityHub

winget install -e --id Unity.UnityHub

Mac
https://formulae.brew.sh/cask/unity-hub

brew install --cask unity-hub

2. Unityをインストール

Mac版の記載なのでWin環境は適宜パスを変更してください。
UnityHub経由でインストールします。
バージョンによって異なるかもしれないのでエラーになる場合はコマンドを確認してください。

/Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless help

インストール先の変更

Unityのインストール先は以下で変更可能です。

/Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless install-path --set /Applications/Tool/

インストール

インストールしたいのが最新のUnityでない場合はChangesetの指定が必要です。
Releaseページの一番下に書いています。2020.3.20の場合は41c4e627c95fです。
https://unity.com/releases/editor/whats-new/2020.3.20#release-notes

モジュールが必要な場合は--moduleで指定します。
AndroidSDKJDKが子モジュールの扱いとなっており、
一緒にインストールする場合は--childModulesを指定します。
指定しないとインストールするか聞かれるので注意してください。

  • Unity本体とAndroidiOSのビルド環境をインストール
/Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless install --version 2020.3.20f1 --changeset 41c4e627c95f --childModules --module android ios

VS CodeからJenkinsへ直接Pipelineを反映する

JenkinsのPipelineを作成する際に、都度ページを開いて反映したり、
コミットしてからビルドを行うのは非常に手間です。
VSCodeJenkins Jackは手元のPipelineを直接実行する事ができます。

Jenkins Jack

Jenkins Jackについて詳しくはGitHubをご覧ください。
https://github.com/tabeyti/jenkins-jack

初期設定

MarketPlaceのページはこちら
https://marketplace.visualstudio.com/items?itemName=tabeyti.jenkins-jack

チュートリアル
https://github.com/tabeyti/jenkins-jack/blob/master/TUTORIAL.md##setting-up-a-connection

サイドバーにJenkins Jackアイコンが表示されたらJENKINS CONNECTIONSの右にある+ボタンからJenkinsを追加します。
複数追加することができ、「右クリック」->「Select」で切り替えます。
これはsetting.jsonjenkins-jack.jenkins.connectionsとして保存されます。

主にできること

  • JENKINS CONNECTIONS
    登録されたJenkinsの一覧です。アクティブにできるのは1件なのでSELECTで切り替えます。
  • PIPELINES
    パイプラインのジョブ、JOBSはすべててのジョブが表示されます。
  • QUEUE ITEMS
    ビルドキューのジョブが表示されます。
  • NODES
    ノードが表示されます。

色々行えますがパイプライン実行のみ説明します。

Pipelineとスクリプトをリンクさせる

VS Codeから実行するにはまず手元のファイルとJenkinsのジョブをリンクされます。
PIPELINESからリンクしたいジョブを「右クリック」->「Add Script Link」でスクリプトのファイルを選択します。

リンクされたファイルのパスは絶対パスで保存されるため、
VS CodeSetting Syncで同期している場合に他環境だと変になります。
そのためsettingsSync.ignoredSettings除外しておくのが良いと思います。

{
    "settingsSync.ignoredSettings": [
        "jenkins-jack.pipeline.tree.items"
    ]
}

Pipelineのビルド

リンクできたらコマンドパレットからJenkins Jack: Pipeline Executeを選択するか、
PIPELINESでジョブを選択してExecuteします。
ビルドの出力はVS CodeのOutput(Pipeline Jack)に表示されます。

ビルドパラメーターの指定

初期設定だとPipelineをリンクするとスクリプトと同階層に*.config.jsonファイルが生成され、paramsでパラメーターを指定できます。
リンク時点だとparamsが空になっておりパラメーターが書かれていないnull状態です。
一度config.jsonファイルを削除してからPipelineを実行するとパラメーターのデフォルト値が書かれたconfig.jsonにできます。

{
    "name": "pipeline",
    "params": {
        "hoge": "hello",
        "fuga": "world"
    }
}

パラメーターを増やしたりデフォルト値を変更させたりしても自動では更新してくれません。
Pipeline › Params: Interactive Inputtrueだとビルド時に入力することもできます。