Open27

TIL (Things / Today I've learned)

thrthr

atuinで異なる端末間で履歴を同期する時は、それぞれの端末で同じバージョンのatuinをインストールしている必要がある。
loginしてsyncしても全然履歴が同期されなかったんだけど、古い端末の方のatuinをバージョンアップしてバージョンを揃えたら同期した。

config

~/.config/atuin/config.toml
filter_mode = "directory"

https://atuin.sh/

thrthr

1passwordを使ってるとssh鍵の引っ越しも不要で大変助かる。

thrthr

スクリーンショットアプリ

macOS向けスクリーンショットアプリ。

Shottrは無料ですか?
Shottr は、好きなだけ無料で使用できます。ほとんどの機能は無料ユーザーでも利用できます。ただし、アプリが時々購入を検討するよう促すことがあります。Shottr は、一般的に、アクティブ化されたバージョンで全体的なエクスペリエンスが向上しており、今後は機能を追加して価格を上げる予定です。
https://shottr.cc/

無料版の制限?

  • 画像編集で枠を描画する時、枠の色をプリセット以外に追加できない

スリープ設定管理アプリ

Amphetamine

https://iffy.freshdesk.com/support/solutions/articles/48000078222-supporting-amphetamine-s-development

モニターの電源を切らないとか、細かい設定がMacos標準機能ではできないので、このソフトウェアが必要。

クリップボード履歴

有料で高機能なアプリは色々あるけど、まずはこれで必要十分かと。

https://github.com/p0deje/Maccy

thrthr

AWS IdentityCenter の 許可セットとグループとAWSアカウントの対応。
最初はなかなか理解が難しかったので絵にしてみた。

絵の都合上、一番上にAWSアカウントが来ているが実際に構築する順番は許可セットから。
以下の説明も下から読んだほうがわかりやすい。

AWSアカウント

グループ

許可セット

thrthr

AWS IdentityCenter のIdpとしてOktaをセットアップした時のメモ。

わけあってOktaグループをTerraformで管理していたので、グループ情報の元データをどこ(リポジトリ)が持つ?という検討をした。

結果、tfstateはちょっと複雑になるということで、OktaとAWSの両方のリポジトリで同じグループを作成&参照することに。

概要 作業の順番 構成ファイル配置場所 対向からの参照方法 管理 メリット デメリット
AWS環境を先にデプロイして、その設定を元にOktaもデプロイする AWSのリポジトリで設定ファイル作成
AWSデプロイ
Oktaのリポジトリでremote_state参照してデプロイ
Oktaの画面でグループに人をアサイン
AWSのリポジトリ、tfstate remote_state AWSリポジトリ カスタムポリシーの制御がしやすい SCIMではなくTerraformでAWSにグループを作成する形になる
コンソール上の見た目が「手動作成」になる
Oktaを先にデプロイしてAWSにグループができた状態で、AWSの許可セットとかを作る Oktaのリポジトリで設定ファイル作成
Oktaデプロイ
Oktaの画面でグループに人をアサイン
SCIMでグループ作成
(Oktaのremote_stateを参照する)
AWSデプロイして、AWSアカウントとグループを関連付けする
Oktaのリポジトリ、tfstate remote_state Oktaリポジトリ AWS画面でグループ作成が「SCIM」になる
流れが自然
OktaのリポジトリでAWSの許可セットなどを管理することになる
個別ポリシーとか出てくるとまためんどくさい
同じ設定ファイルを参照するのを行わず、AWSとOktaでそれぞれデプロイする Oktaのリポジトリで設定ファイル作成
Oktaデプロイ
Oktaの画面でグループに人をアサイン
SCIMでグループ作成
AWSのリポジトリで設定ファイルを作成
AWSデプロイして、AWSアカウントとグループを関連付けする
AWSのリポジトリ
Oktaのリポジトリ
無し AWSのリポジトリ
Oktaのリポジトリ
AWSとOktaの両方に不要な設定を保持することが無くなる
それぞれのリポジトリに必要な設定があるので、はじめて見た人にわかりやすい
同じグループ名の設定をOktaとAWSの両方の設定ファイルで行う必要がある
Oktaに作成したグループ名と同じグループ名をAWS側でも手作業で設定する必要がある
thrthr

Marpでスライドを作ってみた。
https://marp.app/

標準的なテーマで作るとH1が大きすぎるのでヘッダーを活用できるテーマとしてacademicを採用した。

thrthr

同じLANにあるRaspberryPiの管理画面が表示できなくなってしまった。
セキュリティの設定にローカルネットワークというのが増えていて、Chromeにチェックが入ってないことが原因だった。

thrthr

IAM Identity CenterのIdpの話。

アイデンティティソースを変更する際の考慮事項のページでActive Directoryへの切替だけ独立した章立てがされていて、この場合はアクセスポータルのURLも変わるらしい。

アクセスポータルの URL が変更されます– IAM Identity Center と Active Directory 間で ID ソースを変更すると、AWS アクセスポータルの URL も変更されます。

この違いはよくわからないけど、IAM Identity Centerの画面でも明確に分かれている。

Active Directory(Microsoft Entra IDとも異なる?)だけなんか特殊なんだなぁという感想。

thrthr

Workers AI で画像生成したくなったので、提供されているモデルをChatGPTに整理してもらった。

モデル名 元の解説 (日本語訳) 追加解説
dreamshaper-8-lcm Stable Diffusionモデルで、フォトリアリズムを向上させつつ、幅広い表現力を維持するようにファインチューニングされています。 フォトリアリズムを重視した画像生成を求めるユーザーに適しており、アートスタイルからリアルな人物・風景まで幅広く対応できます。
flux-1-schnell FLUX.1 [schnell]は、12B(120億)パラメータを持つ修正フロー変換モデルで、テキストの説明から画像を生成することができます。 修正フロー変換(Rectified Flow Transformer)を採用することで、安定した高品質な画像生成が可能です。生成スピードが速い点が特徴です。
stable-diffusion-v1-5-img2img Stable Diffusionは、潜在テキスト・画像変換拡散モデルで、フォトリアルな画像を生成できます。Img2imgは、入力画像を基に新しい画像を生成する機能です。 既存の画像を加工・変換する用途に適しており、リファイン(修正)やイラストのスタイル変更などに活用されます。
stable-diffusion-v1-5-inpainting Stable Diffusion Inpaintingは、潜在テキスト・画像変換拡散モデルで、テキスト入力を基にフォトリアルな画像を生成できます。さらに、マスクを使用して画像の一部を補完するインペインティング機能を持ちます。 画像の一部を修正・置き換えするのに適しており、写真の不要な要素の削除や、破損した画像の復元に利用できます。
stable-diffusion-xl-base-1.0 Stability AIによる拡散ベースのテキスト・画像生成モデル。テキストプロンプトを基に画像を生成および編集できます。 Stable Diffusionの進化版で、解像度や細部の表現力が向上しています。商業利用や高度なクリエイティブ作業にも適しています。
stable-diffusion-xl-lightning SDXL-Lightningは、超高速のテキスト・画像生成モデルです。数ステップで高品質な1024px画像を生成できます。 高品質な画像を短時間で生成できるため、リアルタイム用途やプロトタイピングに適しています。
thrthr

Oktaと似たような製品で無料で使えるサービスなにかあるかと探したらAuth0が該当するっぽい。

機能 Auth0 Okta
MFA機能 - プッシュ通知、SMS、音声通話、OTP対応 - プッシュ通知、SMS、音声通話、OTP対応
- アダプティブMFA対応 - アダプティブMFA対応
- リスクベース認証のポリシー設定可能 - リスクベース認証のポリシー設定可能
SAML連携 - SAML認証対応、Active Directory統合可能 - 7,000以上の事前構築済みSAML統合
- カスタム統合構築可能 - 1,400以上のSAML / OpenID Connect統合
SCIM連携 - SCIM 2.0対応 - SCIMプロビジョニング対応
- ユーザーの作成・更新・削除の自動化可能 - ユーザーデータの同期と管理が可能
thrthr

Dify

プロンプト構築

DifyにはJinja2ノードがあるがワークフロー全体でのバージョン管理がされていないため、プロンプトだけ前のバージョンに戻したいとか、前のバージョンとどこが変わったとかの管理が難しい。

少し使ってみた感じpromptlayerが結構いい感じ。

公式のプラグインは無いけれど、REST APIが提供されているのでHTTPノードで取得してJSON Processツールで抽出してあげるとよい。

https://docs.promptlayer.com/reference/templates-get

会話履歴

Difyには標準で「メモリ」機能がありシステムプロンプトのサイズを見て、LLMが受け入れるコンテキストの最大数まで過去履歴を挿入してくれる。(明示的に件数を入れることも可能)

だが大体の場合、LLMに送信する履歴は最低限のテキストのみが良しとされるので、自前で履歴を実装したほうがよい。

自力実装

json文字列をオブジェクト配列変数に代入(Append)する処理の参考になる。
https://dify.ai/blog/dify-conversation-variables-building-a-simplified-openai-memory

import json

def main(arg1: str) -> object:
    try:
        # Parse the input JSON string
        input_data = json.loads(arg1)
        
        # Extract the memory object
        memory = input_data.get("memory", {})
        
        # Construct the return object
        result = {
            "facts": memory.get("facts", []),
            "preferences": memory.get("preferences", []),
            "memories": memory.get("memories", [])
        }
        
        return {
            "mem": result
        }
    except json.JSONDecodeError:
        return {
            "result": "Error: Invalid JSON string"
        }
    except Exception as e:
        return {
            "result": f"Error: {str(e)}"
        }

mem0

Difyは会話履歴からサマリを作成する管理する機能が無いので、こういうのを使うといいのかも。

mem0
https://note.com/panda_lab/n/n1e239c81ffea

MCP

ゲームできるといいなぁ。
https://glama.ai/mcp/servers/categories/games-and-gamification

Hidden comment
thrthr

Newrelicにnomadコンテナのログを転送する

Newrelicブログにコンテナログの取得と解析ルールの設定について書かれていたので、Nomadで動かしているコンテナに向けて設定してみた。

https://newrelic.com/jp/blog/how-to-relic/guide-how-to-route-docker-logs-correctly-in-new-relic

前提知識

Nomadでコンテナを動かした場合のコンテナ名は {taskName}-{allocId}が設定される。

コンテナには {taskName}-{allocId}という名前が付けられます。
これは、同じタスクから複数のコンテナをホストに配置するために必要です (例: count > 1)。
これは、各コンテナの名前がクラスター全体で一意であることも意味します。

https://developer.hashicorp.com/nomad/docs/drivers/docker#container-name

nomad設定

loggingに関する箇所のみ抜き出したコンフィグが以下の通り。
tagにはNomadのMetadata変数を設定。

job "sample" {
  group "apiserver" {
    task "server" {
      driver = "docker"
      config {
        logging {
          type = "json-file"
          config {
            max-size = "5m"
            max-file = "2"
            tag = "${NOMAD_JOB_NAME}-${NOMAD_GROUP_NAME}-${NOMAD_TASK_NAME}"
          }
        }
      }
    }
  }
}

Newrelic設定

ブログに解析ルールの設定画面へ到達する方法が書かれていなかったのでメモ。

参考

https://developer.hashicorp.com/nomad/docs/drivers/docker#logging

感想

久しぶりにNR触ると、アラートの作り方からアラートポリシーの作り方から全部忘れててつらい。

thrthr

ZabbixのHA設定を説明しているウェブサイトは幾つかあるけど、どこもZBX_AUTOHANODENAMEに触れていないのはなんでだろう。
Google検索してもZBX_AUTOHANODENAMEについてはほとんどヒットしない。
EC2インスタンスにZabbixを構築しているとホスト名は固定されいなことがほとんどだと思うので必須設定に思える。
設定してみたら普通に動作したので、みなさん便利に使うとよいかと思いました。

thrthr

所得税と消費税の支払い。
クレジットカード支払いは手数料が高額なので、ネットバンキング支払が良い。
e-TAXへのログインが手間そうに見えるけど、マイナポータルからe-TAXにログインしてお知らせのリンクからネットバンキング支払を選ぶと簡単。
納付番号とかがうまいこと連携されてネットバンクのログインができればタップしているだけで納付完了する。

thrthr

BOOTHで販売されている3Dモデルの規約。
「L 調整・改変の外部委託」の項目に設定される「ユーザー間で行うことを許可します」が非常にわかりにくい。

選択肢

まず規約を作る側の選択肢としては次の選択肢がある。

・許可します
・ユーザー間で行うことを許可します

許可しますとは別に「ユーザー間で行うことを許可します」がある。
「ユーザー間で行うことを許可します」が選択されていた場合はなんらか制限を適用したい意図が読み取れる。

「ユーザ」とは

「ユーザー間で行うことを許可します」が選択されていた場合は、「ユーザ」について理解する必要がある。

「ユーザー」
個人または法人のいずれかであるかを問わず、正規の方法での購入や正規の方法でのダウンロードなどにより、権利者または権利者の指定する第三者から本データを正当に入手した者。
https://docs.google.com/document/d/1r5exLnCwh1Bny-cH1ZPrjIX8wrnfDfZspCQq1b92ZYo/edit?tab=t.0

平たく言うと「お金を出してアバターを買ったひと」のことと理解した。

改変を委託する場合

髪型の変更や衣装変更を1,000円くらいで対応してくれる大変ありがたいクリエイターの方々がいるが、「ユーザー間で行うことを許可します」が選択されている規約のモデルを改変委託する場合、クリエイターが編集するモデルも依頼者側で負担する必要がある。
そのため改変委託にかかる費用として、モデルの費用が5,000円だと委託者5,000円+請負側5,000円+作業費1,000円で合計11,000円かかる。

感想

確かに「ユーザー間で行うことを許可します」を選択しておかないと、改変委託と称してモデルの無制限受け渡しが実現してしまうので制限したくなる気持ちはわかるがモデルは改変前提になっている背景もあるため双方良い形があればなぁと思う。

改変サービスを探す中で、Discordで画面共有しながら改変のお手伝いをしますというサービスを幾つか見かけたが、こういう背景があるからかなーと納得した。

例えば、UnityWebみたいなサービスができて、そこにモデルを入れて作業権限のみを委託先へ付与できると、このあたりの問題が解決しそうな気がする。

thrthr

3DモデルをVRChat(FBX)形式からVRM0.X(VRM1.0)に変換してみた感想。

結論としては、XWear Packagerを使ったXAvatar経由のVRM変換が一番簡単だった。

リンク先の記事に「VRM1.0のみ出力」がデメリットとして記載されていますが、VRMRemakerを用いることでVRM1.0からVRM0.Xへの変換が可能です。

その他の方法

いわゆるUniVRM(とそれを支援するツールを)を使う方法は揺れものの設定(SpringBoneColliderなど)と表情(BlendShape)の設定は手作業として残るため、これが非常に手間だった。
VRMConverterForVRChatを用いると表情部分と揺れものの下準備はかなり実施してくれるが、揺れものの設定がすべて詰め込まれたsecondaryを再設定していく作業も非常に手間だった。

感想

今回はモデルをロードする先がVRM0.Xしか対応していないためVRM0.Xをゴールとしたが、できればVRM1.0を採用できるよう動いていくのが苦労しない道なんだろうなと思った。

あと、どの方法にしてもUnityへのパッケージインポートがそれなりに発生するんだけど、このあたりnodejsのpackage.jsonみたいなのが整備されてnpm installで全部インストールされるような仕組みができると解説記事書くひとも楽なんじゃないかなーと。

BOOTHで売ってるモデルがVRChat(FBX)形式が多いのも意外だった。
外部プログラムから色々操作する面でVRMが非常に便利なんだけど、みんなはそんな用途よりもVRChatでわいわいやるのに使うモデルのほうが需要あるんだぁと。

thrthr

AivisSpeech

スタイルとプリセットがある。

スタイルはAIVM / AIVMX ファイルに事前定義されている「幸せ」「悲しい」とかの感情。
プリセットは音声合成画面で変更できる「話速」や「スタイルの強さ」など。

正直、スタイルを変更しても音声にはあまり変化は無くて、自分好みの音声にしたい時にはプリセットを編集することになる。
このプリセットはaudio_queryで作成したクエリの中に埋め込まれる。

{
  <snip>
  "speedScale": 1,
  "intonationScale": 1,
  "tempoDynamicsScale": 1,
  "pitchScale": 0,
  "volumeScale": 1,
  "prePhonemeLength": 0.1,
  "postPhonemeLength": 0.1,
  "pauseLength": null,
  "pauseLengthScale": 1,
  "outputSamplingRate": 44100,
  "outputStereo": false,
  "kana": "こんにちは"
}
https://qiita.com/aqua_ix/items/196b235e83798b8c3631#%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88
thrthr

ChatdollKitに入門してみる。

必要パッケージのインストール

パッケージ名 インストール URL
Burst UPM Unity Package Manager(UPM)
UniTask UPM https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
uLipSync UPM https://github.com/hecomi/uLipSync.git#upm
UniVRM (v0.127.2) .unitypackage https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.127.2
ChatdollKit .unitypackage https://github.com/uezo/ChatdollKit/releases
ChatdollKit
VRM Extension
.unitypackage https://github.com/uezo/ChatdollKit/releases
JSON.NET UPM com.unity.nuget.newtonsoft-json
Azure Speech SDK (オプション) UPM com.microsoft.cognitiveservices.speech

AivisSpeech のプリセット指定

いい方法が思いつかなかったので /ChatdollKit/Scripts/SpeechSynthesizer/VoicevoxSpeechSynthesizer.cs の中でごりっと書き換え。

            // JSONをパースし、プリセットの値を変更
            var preset = Newtonsoft.Json.Linq.JObject.Parse(audioQuery);
            preset["speedScale"] = 0.95;           // 話速
            preset["intonationScale"] = 2.00;      // スタイルの強さ
            preset["tempoDynamicsScale"] = 0.80;   // テンポの緩急
            preset["pitchScale"] = 0.00;           // 音高
            preset["volumeScale"] = 1.00;          // 音量
            preset["prePhonemeLength"] = 0.10;     // 開始無音(秒)
            preset["postPhonemeLength"] = 0.10;    // 終了無音(秒)
            audioQuery = preset.ToString();

Anim

外部制御アプリ

ChatdollKit AITuber Controllerを使って外部から制御するアプリを作る場合。

thrthr

lobehubはLLMのフロントエンドでした。

thrthr

Auth0 AWS

Auth0をAWS IAM Identity Center の Idp として使えないか軽く検証してみた。
結論としては使えないだった。

auth0がもともとアプリケーション向けの認証サービスなので、SAML連携はおまけくらいの機能っぽい。なので設定UIもあまり洗練されていないし、手順書も不親切な部分が多かった。
このあたりは設定する人ががんばればいいので、そんなに欠点ではないけど。

使えないと判断したポイントはSCIM(Systems for Cross-domain Identity Management)を使ったユーザ情報の同期ができないこと。

Idpと連携する目的って単純なSSOだけじゃなくて、退職したユーザを関連システムから確実に削除するとか、ユーザがいつどこから関連システムにログインしたかを追いかけるとかのセキュリティ要素が期待値として多くあるので、このあたりを満たせそうにないAuth0は足りないかなぁと。

だったらもうAWS IAM Identity Center の Identity Center ディレクトリ でいいかなぁみたいな判断。

手順

https://auth0.com/docs/ja-jp/customize/integrations/aws/configure-amazon-web-services-for-sso

https://serverfault.com/questions/1004173/configure-aws-sso-with-auth0-as-idp/1017206#1017206

https://community.auth0.com/t/configure-aws-sso-with-auth0-as-idp/38276/4

スクリーンショットメモ