OmniAICreator/Qiita-1.07M huggingface dataset:
RVTOOLを使って仮想基盤のデータを取得する。

この投稿はvExperts Advent Calendar 2024の14日目の記事です。

### RVTOOLについて ###
RVTOOLはVMwareの仮想基盤で稼働するリソースデータを精緻に取得するためのTOOLです。
利用用途は以下の目的が考えられます。

1. 3Tierの仮想基盤からVMwareのHCIやNutanixのHCIにマイグレーションする場合
1. オンプレミスからクラウド（SDDC）にマイグレーションする場合
1. オンプレミスからクラウド（Native）にマイグレーションする場合

従来の目的は、1や2の利用用途が多かったんですが、re:Invent 2024で発表された、VMwareのワークロードマイグレーションをAmazon Q Developerで分析するこちらのサービスでも、RVTOOLのデータをインポートすることで、クラウドネイティブな環境に持って行くリファレンスなども可能となってきます。

VMware Cloud on AWSのSizerとGCVE（Google Cloud VMware Engine）はこちら
https://vmc.vmware.com/sizer/home

NutanixのSizerはこちら(My Nutanixへのログインが必要です）
https://sizer.nutanix.com/#/home

Amazon Q Developer transformation capabilities for VMware
こちらは、AWSさんのBlogです。私も年内には動かしてみたいと思いますが・・・。
https://aws.amazon.com/jp/blogs/news/getting-started-with-amazon-q-developer-transform-for-vmware/

今後VMWareの仮想基盤の正確なデータの把握が諸々の事情で必要不可欠になることも想定されます。
誤家庭持ちで、ご自身でこのあたりのデータを取り扱うかもしれない方は、ぜひキャッチアップいただければと思います。

### RVTOOLの入手と実行 ###
RVTOOLはこちらで入手可能です。
ダウンロードしたバイナリをそのままダブルクリックでインストールが可能です。
https://www.robware.net/home
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/f9d0eafe-94d7-1a6e-8d56-5136ff1666c5.png)
Downloadのタブからダウンロード可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/b45289b2-5ac3-55fe-8a9b-03f351081ae2.png)
RVTOOLはWindowsのPCで稼働します。
- 起動画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/2477a620-13f4-9f29-78f0-6cfefb6f6ebd.png)
- ログイン後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/c4249d0f-dc8c-e856-d8b8-27591a77d1b9.png)
- ExcelファイルにExport可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/9808ccbc-d6e3-da3b-2ae1-0b21653941ae.png)

### RVTOOL活用例
### 実際にNutanixのSizerに入れてみました ###
- Nutanix Cluster on AWSに移行したシナリオです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/b8d5ea36-0708-7827-a732-d9504eb86ef8.png)

### 実際にVMCのSizerに入れてみました ###
- もはや幻となってしまったVMware Cloud on AWSのM7i.metal＋FSx for NetAppへの移行シナリオです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/4658a846-f307-eee1-b678-66b51b2e7da5.png)

### 最後に・・・ ###
実際にサイジングを行う場合は、RVTOOLのデータに加えて、Sizerのパラメータをきちんと把握することも大切ですが、手計算で計算するより遙かに楽にサイジングできるので、ぜひキャッチアップいただければと思います。
ECS最適化インスタンスにCloudWatch Agentの導入にハマった話

## 概要

AmazonLinux2023のECS最適化インスタンスの起動時にユーザーデータでCloudWatch Agentを導入しようとしたのですが、なぜかインストールが失敗したり、失敗したり、失敗したり、たまに成功したりで不安定でした。（主に失敗することばかり）

ECS on EC2環境のインスタンスは、Auto Scalingグループで管理されて起動テンプレートで色々と設定を行い、そこでCloudWatch Agentのインストールを実施するようにしていました。

## CloudWatch Agentのインストールコマンド

以下のように本当にシンプルな内容です。
今回は、最初のインストールの箇所が失敗していました。

```bash
# インストール
sudo dnf install -y amazon-cloudwatch-agent

# ----（設定関連は省略）----

# スタート
sudo systemctl start amazon-ssm-agent
```

## 発生した問題

起動テンプレートでEC2の起動後にセッションマネージャー経由で接続して、ステータス確認したところ以下のようにインストールされていない状態でした。

```bash
sh-5.2$ sudo systemctl status amazon-cloudwatch-agent
Unit amazon-cloudwatch-agent.service could not be found.
```

あれっ、と思いインスタンスの起動時のシステムログを確認したところ、以下のようなエラーが出ていました。

```bash
[   45.516162] cloud-init[1688]: [Errno 2] No such file or directory: '/var/cache/dnf/amazonlinux-9918409075bd901b/packages/amazon-cloudwatch-agent-1.300044.0-1.amzn2023.x86_64.rpm'
[   45.516320] cloud-init[1688]: The downloaded packages were saved in cache until the next successful transaction.
[   45.516462] cloud-init[1688]: You can remove cached packages by executing 'dnf clean packages'.
```

調べていたところ、AmazonLinux2023のissueにあるバグを踏んでいることに気がつきました。
↓で色々と議論されていますが、SSM Agentのアップデートが裏で行われていて、yumやdnfコマンドによるインストールが失敗するとのことです。

https://github.com/amazonlinux/amazon-linux-2023/issues/397

## 対応策（回避策）

この記事を書いている時点では、先ほどのIssueは対応されていない状況だったので、リトライを仕込んで回避するように対策しました。

変更後のインストールコマンドは以下のとおりです。
※issueに記載の回避策を使わせてもらっています

```bash
attempt=0
max_attempts=10
until sudo dnf install -y amazon-cloudwatch-agent; do
    attempt=$((attempt + 1))
    if [ $attempt -ge $max_attempts ]; then
        echo "Failed to install amazon-cloudwatch-agent after $max_attempts attempts. Exiting."
        exit 1
    fi
    echo "dnf install failed (attempt $attempt/$max_attempts), retrying in $attempt seconds..."
    sleep $attempt
done
```
転職活動で大切なことは「自己分析」

# はじめに
記事をご覧いただきありがとうございます！
私は現在、自社開発企業でAndroidアプリエンジニアとしてプロダクト開発に携わっています。
今年はWebエンジニア→Androidアプリエンジニアにキャリアチェンジをした私にとって大きく変化した年になりました。その転職活動の中で自己分析をすることが転職活動においてとても重要だと感じたので私が行なったことをまとめてみたいと思います。

# キャリア遍歴
私のこれまでのキャリアはざっくりと以下のような感じです。現職で3社目となります。
- 2020年3月に一般事務職
- 2023年9月に未経験から受託系企業のサーバーサイドエンジニアに転職
- 2024年10月に自社開発企業のAndroidアプリエンジニアへキャリアチェンジ

# サーバーサイドからAndroidエンジニアへキャリアチェンジした理由
業界的に見ても、Web系のエンジニアからネイティブアプリエンジニアにチェンジされる方は少ないと思うのですが、キャリアチェンジした理由としてはこんな感じです。

- 言語へのこだわりがなかったから
- 現職の環境やプロダクトに魅力を感じたから
- より身近に感じるサービスを開発したかったから

私自身、エンジニアとしては2年目で実務経験としてはまだまだ未熟です。そのため特にこの言語を極めたいというのがあまりなく、色々経験してみたいなという思いが強かったため、モバイルアプリ開発に挑戦してみようと思いました。
現職では開発だけでなく、チーム内でマーケティング施策を行ったりプロダクトのビジネスサイドの部分に介入することができるという点も今後のキャリアの中でも付加価値になると思いました。
また、前職は受託系企業ということでtoBの案件だったため、より多くの人に届けられるtoCのサービスをやってみたいという点も大きかったです。

# 転職時に行ったこと
これはエンジニアに限らず、転職活動をする人は誰しもが経験をすることだと思いますが、やはり自己分析です。この作業が大変であまり自己分析をしないまま転職活動をして、結果的に転職先でも「なんか違うな」となってしまうのはもったい無いですよね。

私は「原体験ドリブン」という書籍を見て、自己分析の解像度が高くなったと感じました！自身のこれまでの経験の中で、どのようなことにやりがいを感じ、何を重視しているのかを深掘りして本当の自分の強みを知ることで「自分軸」を持つことができ、転職活動時にとても役立ちました。

こちらの書籍です


https://www.amazon.co.jp/%E5%8E%9F%E4%BD%93%E9%A8%93%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3-%E4%BA%BA%E7%94%9F%E3%81%AE%E7%AD%94%E3%81%88%E3%81%AE9%E5%89%B2%E3%81%8C%E3%81%93%E3%81%93%E3%81%AB%E3%81%82%E3%82%8B-%E3%83%81%E3%82%AB%E3%82%A4%E3%82%B1%E7%A7%80%E5%A4%AB/dp/4334951503


### 自分は何がやりたかったのか
このワークを通して自分自身がやりたいことが見えるようになりました。

- ターゲットは誰なのかを明確にしてサービス開発がしたい
- 開発だけでなく、ビジネスサイド側にも介入してプロダクトの価値を高めたい
- プログラミングは手段であり、目的ではない

これらは私が未経験からエンジニアを目指したいと思った根っこの部分でした。当時、Excelでの業務をVBAを使用することで、日々のルーティンワークを効率化したことで部署内の仕事効率が上がりとても感謝されました。
誰のために作って、どのようにすれば解決することができるのかということに非常にやりがいを感じていました。
これらの経験を通して、もっと広い範囲に影響を与えたいと思いエンジニアを志望していました。

# まとめ
ここまで読んでいただきありがとうございました。
私の転職活動の中で感じた自己分析の重要性についてまとめてみましたが、今回の転職では自己分析に力を入れたことで、ミスマッチがなく私がやってみたいと思っていたことにも挑戦することができています。
一見、地味であまり意味がないのでは？と思われる作業かもしれませんが、一度自分自身を見つめ直すことで本当に自分がやりたいことはなんなのかを思い出すきっかけになるので、人生の変わり目でまたやってみたいなと思いました。
Vue.jsの非同期処理での変数参照

# 起こったこと
Vue.jsでapiから取得したデータをtempleteで展開しようとした際にCannot read properties of undefinedのエラーが出ました。

#### エラーが出るコード
```vuejs:
<template>
    {{ host.name }}
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const host = ref();
    const fetchHost = async () => {
      try {
        const response = await fetch('/api/host');
        host.value = await response.json();
      } catch (error) {
        console.error('Error fetching host:', error);
      }
    };

    onMounted(fetchHost);
};
</script>
```
#### エラーが出ないコード
templeteをプロパティ参照ではなく取得したリアクティブ変数全体を参照した場合はエラーが出ません。
```vuejs:
<template>
    {{ host }}
</template>
....(略）
```
hostの全体は取得できるのに、変数全体は表示されます。host.nameを取得したいんだ...。
```
{ "id": 1, "ipv4": "192.168.0.1", "name": "pcname"}
```
# 原因
これはVueコンポーネントではAPIリクエストなどの非同期処理を行う場合、データがまだロードされていない状態でアクセスしてしまうためです。プロパティが参照できていないことで生じます。

# 解決方法

#### オプショナルチェーン演算子を使う（?.）
?を付けるだけ。JavaScriptのオプショナルチェーン演算子を使ってエラーを防ぎます。
```vuejs:
<template>
  <div>{{ host?.name }}</div>
</template>
```

#### v-ifをはさむ方法
v-ifで挟むとエラーは出ませんが、ロードされていないことには変わりないので、表示されません。
```vuejs:
<template>
  <div v-if="host">
    {{ host.name }}
  </div>
  <div v-else>
    Loading...
  </div>
</template>
```
新人エンジニアこそ肩の力を抜こうねって話

# どうも新米エンジニアです

**簡単な自己紹介**
・文系卒エンジニア
・プログラミングは大学で少し触れてfor文がなんとなく使える程度
・現在PHPやMySQLを勉強中
# 概要
　エンジニアとして働き始めて3週間。ひよっこの肩書きを卒業できないエンジニアがなんとか仕事をこなしていく中で感じたことを書き綴っていきます。
お品書きはこちら

1．報連相って難しいよね
2．『新米エンジニア症候群』
3．まとめ～Let’s enjoy エンジニアライフ～

# 報連相って難しいよね
「報告・連絡・相談」よく聞く言葉ですね。社会人ならだれもが知っているであろうこの言葉。意味は分かるし、理屈も分かる。これが大事なこともよく分かる。

**けれども、言われる「報連相もっとちゃんとして」の言葉**

　何を相談するばいいのか分からない。いつ話しかけていいか分からない。こんなつまらないことを聞いていいのだろうか。色々なことを考えますよね。
この文章を書いている本人も書きながら
（もっと早く相談しときゃ解決早かったよなぁ）
（最初に確認とっておけばこの作業しなくてよかったかもなぁ）
と頭によぎる記憶は既にたくさんあります。
そんなわけで、この問題を解決するにあたって自分が「いいな」と感じた方法がこちら

**〇定期報告を習慣付ける**
報告や相談があるときに話しかけるのではなく、定期的に報告するようにしました。
この取り組みによりこんな効果があります。

**・上司と話す癖がつく**
→上司と話す癖がつけば話しかけやすくなるし、話しかけていいタイミングなんかもなんとなくつかめます。

**・進捗管理しやすくなる**
→時間が区切られるため、自分にとっても「次の報告までにここまでやってみよう」といった小目標をイメージしやすくなります。

**・報告内容を考える余裕が生まれる**
→報告するタイミングを先に決めていると、事前に報告内容を振り返るようになります。すると、何を伝えたくて、何を相談したいのかを明確にした報告ができるようになります。

　報連相って難しいですよね。慣れない職場で緊張してしまい、報告内容もこれでいいのかと悩んでしまう。
　でも、こんなことに悩んでしまっては他の考えるべきことが考えられなくなってしまう。そんなわけで、定期報告するというシステムを作って形から習慣化してみました。
# 『新米エンジニア症候群』
　働いていると「プログラムが思い通りに動かない」なんてことはいくらでもありますよね。
　ある時、新米エンジニアの自分もそんな場面に直面して色々と解決策を考えました。しかし、どの解決策を試してみてもうまくいきません。どこが悪いのか、何が悪いのかと考えていくと、いつの間にかあらゆる部分に疑いの目が向けられていきます。にっちもさっちもいかなくなって先輩に相談すると、ただ単にタイポがあっただけ、コードの書き忘れがあっただけといったとても初歩的なミスでした。
 
**なんでこんなミスに気づけなかったんだろ...**

あまりに恥ずかしいミスに少し落ち込んだ後、反省をすると反省点がいくつも出てきました。

・セルフチェックを明文化する

・解決したい目標を見失っていた

**・難しく考えすぎ**

特に自分自身の反省として刻みたいと思ったのは「難しく考えすぎ」という点。
自分のケースでは、なかなか解決できない不具合に対して「もっと高度な場所に原因があるのでは？」と考えすぎて底なし沼にはまってしまいました。
　わずかにコードが読めてきた。けれどもまだまだ大半のコードは読めない新米エンジニアな故に、解決できない問題は、自分の知らない部分に原因があると考えてしまう。勝手に新米エンジニアの代表面をしていますが、こういった思考に陥る人って多いんじゃないでしょうか？多分多いだろうと仮定してこの思考を「新米エンジニア症候群」と名付けてみます。

　この「新米エンジニア症候群」に対抗するためには、セルフチェックシートを活用した客観的なコードの分析や他のエンジニアとの壁打ちといった対策が効果的だと考えているので自分自身も今後実践していく予定です。
 何か他にも効果的な対策があれば是非ご教授願いたいです。
# まとめ～Let’s enjoy エンジニアライフ～
　色々書いてきましたがタイトル回収させていただきます。
 「新米エンジニアこそ肩の力を抜こうねって話」です。
 報連相もそんなに気張らずに気軽に行きます。コードを見るときも少し余裕をもって冷静に見ます。そうすれば、今より少し楽しくやりがいのあるエンジニアライフができそうだなと思っております。

　働き始めてトータル3週間の新米エンジニアの感じたこと。そして、もっとこうしていきたいなと思っていることです。これからも日々、肩の力を抜いて精進していきます。

## あとがき
所々、見苦しい点などがありましたが、ここまで読んでいただきありがとうございます。
報連相を習慣づけるための仕組みづくりや自分自身の初歩的なミスにも気づかせていただいた先輩方に改めて深く感謝申し上げます。
RaspberryPi ZeroにROSをインストール

# Raspberry Pi ZeroへのROSインストール

Zeroへはaptを使ってROSをインストールできないため、各自でmakeする必要がある。2024/12/11現在ROS1はbusterまでしかない?ので、Raspbian Busterを使うこと。

## 準備

```bash
sudo apt update
sudo apt upgrade
sudo apt install dirmngr curl python3
```

レポジトリを追加する

```bash
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo apt update
```

ビルドに必要なパッケージをインストール

```bash
sudo apt install python3-rosdep python3-rosinstall-generator python3-vcstools python3-vcstool build-essential python3-wstool python3-rosinstall python3-empy build-essential cmake
```

## ワークスペースの作成

```bash
sudo rosdep init
rosdep update
mkdir ~/ros_catkin_ws
```

## ソースコードの取得

Desktop環境ではなく、CUI環境(ros_comm)のみをダウンロードする。

```bash
cd ~/ros_catkin_ws/
rosinstall_generator ros_comm --rosdistro noetic --deps --tar > noetic-ros-comm.rosinstall

mkdir ./src
vcs import --input noetic-ros-comm.rosinstall ./src
```

## 依存関係解決

依存プログラムをインストールする。

```bash
cd ~/ros_catkin_ws/
rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y
```

以下のコマンドで、バージョンがtinyxml2は4系以外、opencvは3であることを確認。違ったら[2]を参考に適宜対処。

```bash
apt-cache show libtinyxml2-dev | grep Version
apt-cache show python-opencv | grep Version
```

## ビルド実行

以下でビルド実行。およそ3時間かかった。

```bash
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
```

ビルドするときにpython3 EMPY系のエラーが出たら、以下のオプションを付ける

```bash
-DPYTHON_EXECUTABLE=/usr/bin/python3
```

ビルドが完了したらsource

```bash
source ~/ros_catkin_ws/install_isolated/setup.bash
```

起動時に通す

```bash
echo "source ~/ros_catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc
```

## roscoreを実行

roscoreを実行して、動作することを確認。

```bash
roscore
```

## 参考

[1] <https://wiki.ros.org/Installation/Source>

[2] <https://asukiaaa.blogspot.com/2018/06/raspberry-pi-raspbianstretchrosmelodic.html>

[3] <https://qiita.com/oho-sugu/items/89487e19631218bf689c>

基本的にros公式の[1]にのっとっている。
intellij jar 作成・実行

「ファイル」-「プロジェクトの構造」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/460ccd57-efcc-783f-383f-41897ed14f99.png)

「アーティファクト」の「+」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/ba4b4ac0-9b61-3628-eba6-3c3fab3ca128.png)

「JAR」-「依存関係を持つモジュールから...」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/9863c478-4b2a-a2bf-4d2e-5c7971b7af2a.png)

下記内容にし、「OK」を押下します。
モジュール：すべてのモジュール(mainのみ、testのみも可能)
メインクラス：メインとなるクラス
ライブラリのJARファイル：ターゲットJARに抽出
META-INFのディレクトリ：プロジェクトのsrc直下

:::note alert
src直下以外だとJARにMFファイルが取り込まれず、JAR実行時に「マニフェスト属性がありません」というエラーが発生します。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/d5a99a84-7e3f-449c-10da-dfc2183f2b34.png)

「プロジェクト構造」に戻るので「出力レイアウト」に「META-INF\MANIFEST.MF」が存在するのを確認し、「OK」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/5b2ae721-af44-94fe-039c-5f1bffde21eb.png)

「ビルド」-「アーティファクトのビルド」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/e96430f0-b80d-3619-6442-0d50098032b4.png)

先ほど追加したアーティファクトを選択し、「ビルド」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/6d8c987e-6ff4-cd26-92e4-7fdf1df9365b.png)

「src」と同じ階層にある「out」から「artifacts\アプリ名_jar\アプリ名.jar」が作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/4275653c-eace-e9fc-80cd-ad15b2735850.png)

コマンドプロンプトなどを開き、jarファイルがある場所まで移動して、下記コマンドを実行します。
``` cmd
java -jar アプリ名.jar
```

引数がある場合は下記の通りです。
``` cmd
java -jar アプリ名.jar 引数1=値 引数2=値
```
GitHubで過去に草を生やす


## 概要


草を生やし忘れることがあるので備忘録


## コマンド


```bash
# --dateオプションで月、日付、時間、年、タイムゾーンを指定する
git commit -m"part4" --date="Dec 13 21:00:00 2024 +0900"
```


## おまけ


月の指定方法を忘れるのでメモ


```text
1月:January -> Jan
2月:February -> Feb
3月:March -> Mar
4月:April -> Apr
5月:May -> May
6月:June -> Jun
7月:July -> Jul
8月:August -> Aug
9月:September -> Sep
10月:October -> Oct
11月:November -> Nov
12月:December -> Dec
```
Google Workspace Administrator 学習メモ：その2

# 学習メモ

1. GWSの管理体系
    1. Google グループ、設定グループ、組織部門(OU)、アクセスグループ
        1. Google グループ
            - Google アカウントのグルーピング機能。Gmailやドライブ、カレンダーなどと同じサービスの1つ
            - 1つのユーザーは複数の Google グループに属することが可能
            - 主な用途：メールングリスト、Google ドライブ上のファイル共有などのコラボレーション
        1. 設定グループ
            - グループを管理設定の適用に利用するときの Google グループは設定グループ（configuration group）と呼ばれる
            - ***サービスの設定をカスタマイズする***ための機能
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616519/9f68c4b2-07e5-e311-1e32-dccfc9072c29.png)

        1. OU
            - 実際の組織と連動する形で設計・利用する
            - 1つのユーザーは1つのOUに属する（複数のOUに所属できない）
            - 主な用途：ユーザーアカウントの一括管理＝管理機能の設定を組織内の一部メンバーのみに適用したいなど（組織A、組織B、組織Cがそれぞれ異なるOUに属する場合、組織Aのみが外部へファイル共有が可能、組織Bと組織Cは社外へファイル共有禁止など）
            - 前述の設定グループにより、適用した設定を上書き可能
        1. アクセスグループ
            - ユーザーアカウントのアクセス管理用のグループ
            - ***サービスへのアクセスをカスタマイズする***ための機能
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616519/d4dd90a5-63c3-e39b-b225-55d958d728a5.png)
    1. 管理者ロール
        - GWS 内での管理権限を有効化/無効化する設定を管理可能
          → Google 管理コンソールへのアクセスも可能になる
        ‐ 管理者ロールでできること
            - [既定の管理者ロール](https://support.google.com/a/answer/2405986?sjid=12188760564541109689-AP)
                - ***特権管理者(Super Admin)が最も強い権限***。***アカウントに少なくとも1人必要***だが、2人以上にすることを推奨されている
            - [カスタムの管理者ロールを作成する](https://support.google.com/a/answer/2406043)
            - [ユーザーにロールを割り当てる](https://support.google.com/a/answer/9807615)
        - 

:::note info
参考
[組織向け Google](https://cloud.google.com/architecture/identity/overview-google-authentication?hl=ja#google_for_organizations)
[組織構造の仕組み](https://support.google.com/a/answer/4352075?hl=ja)
[設定グループを使用してサービスの設定をカスタマイズする](https://support.google.com/a/answer/9224126)
[アクセス グループを使用してサービスへのアクセスをカスタマイズする](https://support.google.com/a/answer/9050643?ref_topic=4390547)
:::
フィットジャーニー「SPF(Solution Product Fit)」時の乗り越え方を思考する

# はじめに

某人材会社でプロダクトマネージャー（以下PdM）兼、新規事業担当をしている者です。
PdMの役割は、業界や会社規模、プロジェクトの性質によって大きく異なります。私の現場では、複雑で難しいタスクが多い中、プロダクトの成功を目指して働きかける『忍び』的な存在として活動しています。🥷
また、新規事業担当としても企画立案を行い、『新規プロダクトの創出』という観点で幅広い業務に携わっています。

今回は、プロジェクトが動き出す前の「新規事業」における「SPF検証」について考察していきます。
この記事の対象読者は、PdMだけでなく、新規事業担当者や、企画職に従事している方に読んでいただければ嬉しいです。大手企業の担当者ほど当てはまりそうな内容になっているかと思います。


# 新規事業における「フィットジャーニー」とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3067561/04d43cac-1ce3-c8e0-2c3b-f5ef46b1bb4d.png)

フィットジャーニーとは、スタートアップ・フィットジャーニーというフレームワークをもとに作成した、事業アイデアの立案からPMF、そしてGrowthまでの道のりを示したものです。

フィットジャーニーを活用する際は、各フェーズにおいて達成すべき「目標」を定義することが欠かせません。目標を達成し、次のフェーズ、また次のフェーズへと進んでいくことで、PMFやその後のGrowthが実現できます。

出典：[フィットジャーニー｜PMFを理解するために必要な用語](https://sairu.co.jp/method/13799/)
 

# 「SPF」でつまづくポイント、乗り越えるポイント

「SPF（Solution Problem Fit）」とは、顧客の課題（Problem）に対して、提供する解決策（Solution）が適合しているかを検証するフェーズです。この段階では、プロトタイプを作成し、ターゲット顧客に実際に見せてフィードバックを得ることが重要です。
「SPF（Solution Problem Fit）」時には、具体的にプロトタイプというものを作り、ターゲット顧客に披露していきます。
実際この解決策段階になると、顧客の正直なフィードバックを生身で受けることがあります。
中にはフィードバックに対して、怒りや悲しみを感じ数時間立ち直れないひともいるかもしれません。。
もしも、つまづく・乗り越えるポイントを事前に知っていたら、覚悟をもって壁を突破できるのではないかと思いました。


## つまづくポイント・乗り越えるポイント
* 顧客に「こんなの"絶対"使わない」と言われる
    * なぜそう思うのか、どうすれば少なくとも使いたくなるのかを考え、次の検証にトライ！
    * 次の検証時の時間帯をずらす（たまたまその人が不機嫌だったかもしれないので、人間だからしかたないよね）
<br>

* 顧客に画面デザインが「若すぎ/古すぎ」と言われる
    * 改めてターゲットを考える、絞る
    * 年代別、性別で好まれるデザインのトンマナをインプットする
    * 別デザインで、次の検証にトライ！
<br>

* 顧客に「このプロダクトでは私がしたいjobは解決しない」と言われる
    * 改めてjobを深堀る
    * もしかするとターゲットじゃないかもしれない
    * もしかするともっと優先したいjobがあるのかもしれない
    * × お金貯めたい → 〇 支出を抑えたい（一緒のjobっぽいけど微妙にちがう）

<br>

* 回をかさねるほど顧客のフィードバックが厳しくなる
    * 機能の要望でコア機能に該当しそうであればちゃんと耳を傾ける（厳しい意見こそ宝だと思う、厳しいけど）
    * 機能要望 < UIUX要望が大半を占めてきたらDONEとする

<br>

* 上司に「まだ検証しているの？」と煽られる
    * 上司はフィットジャーニーなど知らないのは前提（モダンなフレームワークだと思ったほうが良い）
    * 自分の正しさはいったん落ち着かせる（心を保て、保て！）
    * 検証のログを残しておく（ヒアリングの履歴でも、顧客リストでもよき）
    * 聞かれたときにちゃんと見せる（ちゃんと業務してまっせアピールも大事）


# さいごに

新規事業担当者にとって、SPF検証は避けて通れない重要なプロセスです。顧客からの厳しいフィードバックや上司からのプレッシャーに直面することもあります。それらを受け入れつつ、かわしつつ、乗り越える術を身に着けることで、SPFの抵抗感から解放され、コアなISSUEに向き合うことができるのだと思います。
私はSPFありなしどっちもの現場にいましたが、SPFありのほうがやりやすかったですし、グロースの速度が断然違いました。新規性の高いプロダクトの場合、既存事業よりもコケる割合が断然高いので、未然にリスクを防いでいくことで、プロダクトを成功に導いていく確率が高まるのではないかと思います。

この記事が、読者の皆さんの挑戦を少しでも後押しできれば幸いです。よい一年を！！🎅
【OpenAI ChatGPTクリスマスイベント第７日目】ChatGPTのProject機能です。


　どうも、カーブミラーです。

　今回は、OpenAIのクリスマスイベント。今日は第７日目。ChatGPTのProject機能です。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　まずは、ニュースです。

　Soraの新規登録が
　　正式に公開されました。
　　　[サム・アルトマンポスト](https://x.com/sama/status/1867658544914608209?t=OTHyTK40JizYg1LrygxXhw&s=19)
***
　ウチにも、Sora、来ました😸

　動画生成のスピードが
　　とても速いです。

　なるほど、
　　これならば、
　　　動画編集にストレスが
　　　　ありませんね！

　初めての作品を
　　X-Twitterにポストしました。
　　　[カーブミラー作品ポスト](https://x.com/kabumira862571/status/1867412201050615837?t=Gu3PpU26GfGlB5BfNN-V4A&s=19)
***
　さて、【本題】です。

　OpenAIの
　　クリスマスイベントの第７日。
　　　まずはごあいさつ。
　　　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1867628181974290752?t=Xe6l_YJCstQiro7Djp8hHg&s=19)
　　　　　中身は、OpenAIの
　　　　　　イベントページへの誘導。

　イベントのようす。
　　[OpenAI公式YouTube動画](https://www.youtube.com/live/FcB97h3vrzk?si=KWNLOMqVOlpQU1lE)

　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1867675796950987146?t=EOjRYqzbo7v7lipGL5UaHg&s=19)

　今回は？

　Projects in ChatGPT.

　ChatGPTのProject機能。

　これにより
　　特定のタスクやテーマに関連する
　　　複数のチャット、
　　　　参照ファイル、
　　　　　カスタム指示を
　　　　　　ひとまとめに管理できる。

　Project機能の概要
　・一定の単位で
　　　チャットをまとめることができる
　・RAG検索可能なファイルを
　　　設定できる
　・事前に指示を
　　　設定することができる

　ChatGPTの履歴検索機能や
　　Canvasも利用可能。

　Project作成可能なのは
　　Web版（スマホブラウザでも確認）
　　Windows用
　　　ChatGPTデスクトップアプリ

　Projectの閲覧・チャットのみ
　　可能なのは、
　　　スマホアプリ版
　　　macOS版

　❗注意❗
　　Projectに入れたセッションは
　　　GPT-4oのみ利用可能です。
　　　　ほかのモデルに
　　　　　変更できません。

　リリース開始情報
　　Plus、Pro、Teamユーザーは、
　　　本日から。

　　EnterpriseとEduユーザーは、
　　　1月に。

　　Freeユーザー向けには、
　　　近日中？に提供開始。
***
　Project機能を
　　簡単に説明すると
　　　仕事ごとにファイルボックスを
　　　　用意する感じでしょうか。

　Projectを用意すると、そこに
　　セッションチャットや
　　　カスタム指示、
　　　　セッションで使う
　　　　　ファイルを入れられます。

　カスタム指示(Custom instructions)は
　　Project内のセッションで使用され、
　　　Project外部には適用されません。
　　　　Project専用のカスタム指示に
　　　　　なるわけです。

　これ（内部と外部）は
　　ほかのファイルでも
　　　同様の扱いになります。

　詳しい使い方などは、こちら。
　　[ChatGPT研究所さんnote](https://chatgpt-lab.com/n/nd0cf9914437b)

　この場で説明すると
　　とんでもなく長くなりそうなので😅
***
　感想をば。

　セッションチャットの整理は
　　したいな、とは思っていました。

　とはいえ、カスタム指示とか
　　ファイルを含むようになる
　　　とは思いませんでしたよ。

　さて、とりあえず、
　　ひと通り、触ってみました。

　スマホアプリ版では
　　作成・追加できないものの、
　　　Web版で作成したものを
　　　　見たり追記することは
　　　　　できました。

　Web版では
　　プロジェクトは
　　　GPTsの下に出てきます。

　　スマホアプリ版では
　　　GPTsの上に出てきます。

　プロジェクト内の
　　セッションでは
　　　モデルがGPT-4oに固定されていて
　　　　ほかのモデルを使えません。

　　ですが、
　　　ふつうにo1でセッションしたあと
　　　　そのセッションを
　　　　　プロジェクトに入れることは
　　　　　　可能です。

　　　つまり、o1で思考させたあと、
　　　　プロジェクトに入れて
　　　　　GPT-4oで処理するわけです。

　　　o1とのやり取りは
　　　　たいていの場合、
　　　　　継続する必要が
　　　　　　それほど必要ありません
　　　　　　　からね（私感）。

　　また、
　　　o1とのやり取りが必要になれば
　　　　プロジェクトから
　　　　　削除することで
　　　　　　ふたたび、やり取りが
　　　　　　　可能になります。
***
　参考
　[Kevin Weilさんポスト](https://x.com/kevinweil/status/1867637074519838971?t=IpWsXPYV4vrE0DiuLCYSkQ&s=19)

　[ChatGPT研究所さんポスト](https://x.com/ctgptlb/status/1867639386437038348?t=u0R1ShssaCC7XDLWy55c7w&s=19)

　[木内翔大さんポスト](https://x.com/shota7180/status/1867685618643611750?t=VR3pkqirHEU_um7ohxXSTg&s=19)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
最初に「あい」を学ぶことば日本語でプログラミング入門（ステップ１Mindの場合）

# はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。まずトップバッターとしては、実用的な日本語プログラミング言語では最初の世代に入るMind（マインド）で「あい」を学んでいきます。ついでにプログラミングの妙を遊ぶというお題となります。

## Mind（マインド）
Mind（マインド）は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。単語間の分かち書きが必須であくまで形式言語です。Forth言語のスタック操作処理を継承しているため、逆ポーランド記法[^1]の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができ、独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。初版の登場は1985年で来年2025年には生誕４０周年となります。


## Mind（マインド）の入手方法
無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。メールアドレスをご登録くださいませ。

https://www.scripts-lab.co.jp/mind8download/download.html

# お題のソースコード

```mind:ai.src
あいとは
    人や　物事を　大切に　思う心。
```
これをプログラムとして実行してみます。出現する単語を定義しておけば、Mindはあらゆる文章をプログラムとして受け付けます。（ただし文意を維持するには工夫が必要。）
プログラム実行文に出現する単語をあらかじめ定義しておきます。話を簡単にするため、主に予約語との等価定義と文字列定数の定義を用います。

```mind:ai.src
人は　　　　文字列定数　"自分や自分以外の人間、"。
物事は　　　文字列定数　"もろもろの物や事柄は大切と思っている心のありようのことで、漢字では「愛」と表記します。"。
大切は　　　合成と　　　　等価。
思う心は　　一行表示と　　等価。

あいとは
    人や　物事を　大切に　思う心。

メインは　　あい。
```
# お題のソースコードをコンパイル
では、コンパイルしてみます。無事に成功しました。

```
C:\developments\vscode\pmind\hello>mind ai file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> ai.exe
```
# 実行結果
実行結果です。

```
C:\developments\vscode\pmind\hello>ai
自分や自分以外の人間、もろもろの物や事柄は大切と思っている心のありようのことで、漢字では「愛」と表記します。
```


# おわりに
いかがでしたでしょうか？わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。


[^1]: 演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法（ポーランド記法）+ 1 2、後に記述する後置記法（逆ポーランド記法）1 2 +がある。日本語は１と ２を 足す。
ViperIDEを使ってみる④：Advanced mode

# Advanced modeの有効化

左ペイン下にあるスライダーのアイコンをクリックすると設定画面が現れる。

![スクリーンショット 2024-12-14 11.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/67f3c953-5f2f-341d-3eec-a13e7d5a67d5.png)

Advanced mode にチェックを入れる。

# システム情報

ファイルマネージャーに写って、再表示のアイコンをクリックすると systeminfo.md が現れるので、エディタに表示してみる。

![スクリーンショット 2024-12-14 11.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/183777c5-7439-5db8-004f-be23124c620b.png)

ボードの名前、CPU の情報、ファームウェアのバージョン、メモリの情報が表示される。

# 凍結モジュールの逆アセンブル

中間コードにコンパイルされている凍結モジュール .mpy を逆アセンブル表示できる。

ファイルマネージャから .mpy を選んでエディタに表示すると、自動で逆アセンブルしたものが表示される。

![スクリーンショット 2024-12-14 11.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/6200889e-970c-648a-2316-a944fbc7875b.png)

# おわりに

ViperIDE については今回でおわります。

まだ使いにくいところはありますが、サポートされている機能や目指しているところには良いところもあるので、今後のバージョンアップに期待しています。
Google Workspace Administrator 学習メモ：その1

# 学習メモ

1. Google Workspace とは
Google Workspace(旧称： G Suite) は Google 社が提供する業務に必要なツール(アプリ)を統合したビジネス向けグループウェア。
Gmail、Google カレンダー、Google Meet、Google ドライブなど利用可能。
[Google Workspace: ビジネスアプリとコラボレーションツール](https://workspace.google.com/intl/ja/)

1. GWSのエディション
    1. ***Buissiness***
          - ユーザー数が 1～300 人のビジネス向けの生産性向上スイート
          - ***中～小規模な組織向け***
          - Starter、Standard、Plusの3種類がある
                  - Starter：***ユーザーあたり 30 GB***のストレージ プール
                  - Standard：***ユーザーあたり 2 TB***のストレージ プール
                  - Plus：***ユーザーあたり 5 TB***のストレージ プール
    1. Education
          - 所定の要件を満たす教育機関向けの割引されたスイート。小学校から高等教育機関までご利用いただける、指導と学習用の生産性向上ツールスイートが含まれている
          - Fundamentals、Standard、Plusの3種類がある
                  - Fundamentals：無料で利用できる、安全で使いやすい。Google ドキュメント、Classroom、Meet、Gmail、フォーム、Chat などのアプリにアクセス可能
                  - Standard：Fundamentals の機能をベースに構築された有料エディション。高度なセキュリティ ツールと分析ツールを利用可能
                  - Plus：Fundamentals と Standard のすべての機能に加え、高度なセキュリティと分析機能、学習をより豊かでパーソナライズされたものにする使いやすいツールを利用可能
    1. ***Enterprise***
          - 無制限のユーザーに対する優れたセキュリティと高度な制御が追加で利用可能
          - ***大規模な組織向け***
          - Standard と Plus の2種類がある
                  - Standard：フレキシブルなストレージおよびエンタープライズ レベルのセキュリティと管理機能を備えた、生産性向上とコラボレーションのアプリスイート
                  - Plus：フレキシブルなストレージおよびセキュリティとコンプライアンスの最先端機能を備えた、生産性向上とコラボレーションのツールセット
    1. Essentials 
          - Gmail を使用しない生産性向上ツールとコラボレーション ツール
          - 既存のメール ソリューションとのシームレスな統合を実現できるように設計
          - Starter、Essentials 、Enterprise Essentials、Enterprise Essentials Plus の4種類がある
                  - Starter：最大 100 ユーザーのチームでコラボレーション ツールとビデオ会議を利用可能。無料
                  - Essentials：コラボレーション ツールとビデオ会議、高度なセキュリティ機能、ストレージ プール、ポリシー管理を利用可能。***新規受付を終了している***。
                  - Enterprise Essentials：コラボレーション ツールと大人数で参加可能なビデオ会議、高度な機能、大容量のストレージ プール、エンタープライズ レベルのセキュリティと管理機能を利用可能
                  - Enterprise Essentials Plus：生産性とコラボレーションを促進する高度なセキュリティとコンプライアンス管理、および、ユーザー 1 人あたり 5 TB のストレージ プールを利用可能

:::note info
参考資料
[Google Workspace の各エディションの比較](https://support.google.com/a/answer/6043385?hl=ja&co=DASHER._Family%3DBusiness&oco=0)
:::

1. Google Vault
    1. Google Workspace のデータ保持と電子情報開示(e-Didcovery)＝電子的に保存される情報のためのツール
        - Google Vaultを利用することで、組織のデータに対して以下を実施できる
            - 保持(Retention)
                → 運用、コンプライアンス要件に基づき、一定期間のデータを保存する、または一定期間過ぎたデータを削除するためのもの
            - 記録保持(Hold)
                → 法的義務などデータが削除されないようにするためのもの
            - 検索と書き出し
    1. 利用可能なエディション
        - Buissiness Plus
        - Education
        - Enterprise
        - Enterprise Essentials、Enterprise Essentials Plus
    1. 特徴
        - 停止中のアカウントからでも情報を取得可能
          ※ ユーザーを削除すると、そのユーザーのアカウントに紐づくすべてのデータが削除される。よって、削除ではなく***停止することが推奨されている***。また、退職者などが出た際にはアーカイブユーザーライセンスを利用することで、データを組織で保持できる
        - 本人のメールボックス内の情報を本人に気づかれることなく検索可能
        - 削除済みアイテムも(残っていれば)アーカイブから検索可能
        - 管理単位：案件（matters）

:::note info
参考資料
[Google Vault について](https://support.google.com/vault/answer/2462365)
:::
【備忘メモ】Mavenプロジェクト作成でThis failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced.エラー

##### 【環境】
・MacBook Air(M1)
・macOS Sequoia 15.1.1
・Eclipse 2024-06(4.32.0)

##### 【状況】
・GitHubからMavenプロジェクトをクローン
・ビルド失敗したのでいったんクローンしたプロジェクトを削除
・次は「新規」でMavenプロジェクトを作成したら、【エラー】が発生

##### 【エラー】
```
org.apache.maven.plugins:maven-resources-plugin:pom:3.3.1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. オリジナル・エラー: Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:pom:3.3.1 from/to central (https://repo.maven.apache.org/maven2): repo.maven.apache.org	pom.xml	/helloworld	行 1	Maven pom ロード問題
```

##### 【原因】
"/Users/[PCユーザ名]/.m2/repository"配下にキャッシュが残ってしまっていること。

##### 【真因】
不明

##### 【対処】
"/Users/[PCユーザ名]/.m2/repository"配下のディレクトリとファイルをすべて削除する。

##### 【結果】
正常にMavenプロジェクトを作成することができた。

##### 【参考】
[Mavenリポジトリのローカルキャッシュ - Qiita](https://qiita.com/ASHITSUBO/items/0d30c1ddf476d2ec96b7)
[shadcn/ui]モバイル画面においてSidebarTriggerでサイドバーを開くと発生するエラーへの対処

#### 初投稿です
shadcn/uiのsidebarコンポーネントを初めて使ってみたのですが、使用開始早々にエラーが。

画面をモバイル幅にすると非表示になるサイドバーを、SidebarTriggerで開くと..

```console:terminal
console error

DialogContent requires a DialogTitle for the component to be accessible for screen reader users.

If you want to hide the DialogTitle, you can wrap it with our VisuallyHidden component.
 ```

DialogContents内にTitleを設定しろということですが、そもそもダイアログコンポーネントは使用してないはず...。

あれこれ探した結果

```diff_tsx:ui/sidebar.tsx
const Sidebar = React.forwardRef<
  HTMLDivElement,
  React.ComponentProps<"div"> & {
    side?: "left" | "right";
    variant?: "sidebar" | "floating" | "inset";
    collapsible?: "offcanvas" | "icon" | "none";
  }...

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  if (isMobile) {
      return (
        <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
+         <SheetTitle className="hidden"></SheetTitle>
          <SheetContent
            data-sidebar="sidebar"
            data-mobile="true"
            className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
            style={
              {
                "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
              } as React.CSSProperties
            }
            side={side}
          >
            <div className="flex h-full w-full flex-col">{children}</div>
          </SheetContent>
        </Sheet>
      );
    }

```

**これだけで解決しました**

コンパイルの過程でDialogとSheetは統合されるのかな？と思いつつも、

***治ったからいいや！***
【PIL】特定の色の領域だけを別の画像と合成するテク【Python】

# はじめに

Pillowを使って、特定の画像にある特定の色の領域だけを別の画像と合成するプログラムの備忘録です。

# 実装

指定した色の違いをどの程度許容するか（0～1）をパラメータで指定できるようにしました。

```python
from PIL import Image
import numpy as np


def is_within_color_range(pixel_array, target_color, tolerance):
    """
    ピクセルが指定された色範囲内かどうかをチェックする関数。
    tolerance: 0～1で許容範囲を設定
    """
    # RGB各色について許容範囲内かどうかをベクトル化して判定
    diff = np.abs(pixel_array - target_color) / 255.0
    return np.all(diff <= tolerance, axis=-1)


def apply_color_mask_and_overlay(img_a, img_b, target_color, tolerance=0.1):
    """
    透過PNG画像Aの特定の色の領域をマスクし、画像Bをその領域に重ねて新しい画像Cを作成する関数。
    :param img_a: 画像A
    :param img_b: 画像B
    :param target_color: 色範囲に一致するRGBのタプル (r, g, b)
    :param tolerance: 色の許容範囲 (0～1)
    :return: 新しい透過PNG画像
    """
    # 画像AとBのサイズが一致することを確認
    if img_a.size != img_b.size:
        img_b = img_b.resize(img_a.size, Image.Resampling.BICUBIC)

    # 画像Aのピクセルデータを取得
    img_a_data = np.array(img_a)
    img_b_data = np.array(img_b)

    # 画像Aの透明度が0でない領域をマスクし、指定色範囲に一致する領域を見つける
    alpha_mask = img_a_data[:, :, 3] > 0  # 透過していない部分
    color_mask = is_within_color_range(img_a_data[:, :, :3], target_color, tolerance)

    # 両方の条件（透過していない + 色範囲一致）を満たす領域を選択
    combined_mask = np.logical_and(alpha_mask, color_mask)

    # 画像Aの指定領域を画像Bで置き換える
    img_c_data = img_a_data.copy()
    img_c_data[combined_mask] = img_b_data[combined_mask]

    # 結果を新しい画像として保存
    img_c = Image.fromarray(img_c_data)
    return img_c
```

# 利用シーン

### 合成したい領域を塗りつぶして別の画像と合成

- `target_color`を変えることで、特定の色の領域のみを合成できます。
- `合成処理開始`～`合成処理終了`の処理を繰り返すことで、連続して別の色＆別の画像と合成を行うことできます。

```python
# ===== 合成処理開始 =====
target_color = [0, 255, 0] # 合成する領域の色（この場合緑）
tolerance = 0.1 # 指定した色の違いをどの程度許容するか
img_a = Image.open("input.png").convert("RGBA")
img_b = Image.open("fill.png").convert("RGBA")
new_image = apply_color_mask_and_overlay(img_a, img_b, target_color, tolerance)
# ===== 合成処理終了 =====
new_image.save("output.png")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/ca796553-c8b4-c70e-7e9a-8bf727f9afc5.png)


### 字幕の特定の色をグラデーション画像と合成


- PILでテキストを描画する場合グラデーションで塗りつぶすことが難しいため、適当な色で塗りつぶしておき、後で合成できます。

```python:テキストを適当な色で描画
image = Image.new('RGBA', (WIDTH, HEIGHT), (255, 255, 255, 0))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(font_path, font_size)
draw.text((X, Y), text, font=font, fill=(0, 162, 255, 255), stroke_width=stroke_size, stroke_fill=(255, 255, 255, 255))
image.save('text.png', 'PNG')
```

```python
# ===== 合成処理開始 =====
target_color = [0, 162, 255] # 合成する領域の色（この場合水色）
tolerance = 0.1 # 指定した色の違いをどの程度許容するか
img_a = Image.open("text.png").convert("RGBA")
img_b = Image.open("gradation.png").convert("RGBA")
new_image = apply_color_mask_and_overlay(img_a, img_b, target_color, tolerance)
# ===== 合成処理終了 =====
new_image.save("output.png")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/c220dd39-8a91-59fb-bf6e-c36bb7f4bf22.png)



# おわりに

実際画像編集ソフトを使えばすぐに行える合成処理ではありますが、Pythonを使って大量の画像を処理したい場合、自動化したい場合などにご利用いただければと思います。
JAX プロファイリング

https://jax.readthedocs.io/en/latest/profiling.html

このページに書いてあるように、いつの間にかtensorboardじゃなくてperfettoとかいうのが推奨になっています。
で、サーバー環境でもsshでオプションをつければいけるのですごい楽：

```
ssh -L 9001:127.0.0.1:9001 \<user\>@\<host\>
```

私の例では、とあるコードが繰り返し計算するとなんか遅くて理由わかんない、みたいな感じでした

Perfettoの画面はでかいので貼るの大変なんですけど、CPU部分は例えばこんな感じで

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137970/270ba00b-ad87-5c2d-0715-10e753b455a0.png)

下にGPU部分があります。（スクショ撮り忘れた）で、みるとGPU部分は一番右の旗と一番右から二番目旗の間でしか動いていなくて、その前に巨大なオーバーヘッドがある。
このoverheadのところみると```pxla.py:2454 compile```とか書いてあって
XLAのコンパイルしてるんだな、ってわかります。
で、問題は、これがfor loopの回ごとにcompileしなおされてました
そうすると、JIT compile自体が計算速度を律速していることに。GPUが全然効率的に使われてない。で、これは調べるとclassの中にscanが入っていて、なんらかの理由で毎回コンパイルされてました。scanを外に出すと...

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137970/afd6726e-cb74-c51e-d44a-ceb1d9916470.png)
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137970/9c22265c-119a-8398-8d9a-689d8c33258a.png)


こんな感じになって(上がCPU、下がGPU)

これ、5回分for loopまわしてるんですが

compileは右から二番目の旗のところで終わっていて、その後、はcompileされていなくて、XLAされた関数が再利用されていることが分かります

で、実際にoverheadはなくなって、1 loopあたり0.7s -> 0.2sになりました

という感じで、tensorboard つかってたとき（わけわかんないであんま使ってなかった）より圧倒的に見やすくなってます
Blazor SSR は Google Analytics でページビューを測定できている

## Blazor SSR の拡張ナビゲーション

Blazor は、C# でフルスタック Web アプリケーションを実装可能とするフレームワークです。その実行形態のひとつである Blazor SSR (Server-side Static Rendering mode) は、基本的な動作機序は、ブラウザ上でのスクリプトを使用しない古典的な MPA です。しかしながら、一般的な Blazor SSR では、少量のサポート用 JavaScript を読み込むよう構成されており、この JavaScript が "拡張ナビゲーション" と呼ばれる、いわゆる "PJAX"、Turbo link 的な動作を実現しています。

すなわち、ページ上の `<a>` 要素のクリックなどを、この JavaScript コードが捕捉し、ブラウザによるページ遷移はキャンセルして、代わりにその JavaScript コードが遷移先ページの HTML を fetch、DOM ツリーに適用する、というものです。ページを構成する HTML こそサーバーで生成されているものの、ページ遷移の動きは、いわゆる SPA っぽい動作になっていますよね。

## 拡張ナビゲーションによるページ遷移は Google Analytics に計測されるのか実験

さてここで、そのよような Blazor SSR サイトに Google Analytics を導入した場合、その Blazor SSR サイト上でのページ遷移操作は、Google Analytics 上で検知・認識されるのか、気になったので実験してみました。

対象の Blazor SSR サイトは下記です。

https://demo-blazor-viewtransition-ssr-net9.azurewebsites.net/

このサイトはトップページでは米国シアトルの観光スポットを一覧表示しており、その一覧をクリックすることで各スポットの詳細ページに遷移する、という Blazor SSR です。(註: プログラムの動作説明用に作った簡潔なデモサイトなので、"観光スポットを一覧表示" といってもたかだか 3 件ですので、内容には期待しないでください)

![movie-002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/60116289-e336-c239-bfd9-23bec82854fe.gif)

Google Analytics 上で新たなプロパティを用意し、インストールガイドに従って、以下のように Google tag の JavaScript コードを、対象の Blazor SSR アプリに設置します。

```html:Components/App.razor
<!DOCTYPE html>
<html lang="en">
<head>
    ...
    <!-- Google tag (gtag.js) -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
    <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', 'G-XXXXXXXXXX');
    </script>
    ...
```

この状態でしばし対象の Blazor SSR サイト上でページ遷移を繰り返したあと、Google Analytics のレポートを確認してみたところ、ちゃんと、渡り歩いた各ページ別に、タイトルや訪問回数が計測されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/b0f81fab-1ffb-15e1-38cd-8c0fd38e691b.png)

改めて Google Analytics での設定を確認してみると、ブラウザの履歴イベントを監視してページビューを計測するように設定されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/9e2e59f7-59a0-93ca-3fef-56b749dcf6f7.png)

Blazor SSR の拡張ナビゲーションは、ブラウザの History API を用いて、ページ遷移時のブラウザのアドレスバーに表示される URL の書き換えなどを行なっています。そのため、ブラウザの履歴イベントを監視している Google Analytics でも、期待どおり、Blazor SSR 上でのページビューを計測できているようです。

## まとめ

拡張ナビゲーションが有効になっている Blazor SSR であっても、インストール手順どおりに Google Analytics を設置するだけで、とくにそれ以上何かすることなく、ちゃんとページごとの訪問回数が計測されていることが確認できました。

インターネット上の古い資料などでは、「SPA でのページ遷移時は、`gtag('config', 'G-XXXXXXXXXX', { page_path: url })` を呼び出さないといけない」といった記述も見られます。たしかに、URL のアンカー (#~) で擬似的に SPA 内のページルーティングを表現していた時代はその必要があったことでしょう。しかし、History API を用いる現代の SPA と、既定でブラウザ履歴イベントを拾ってページビューを計測する Google Analytics では、どうやらそのような追加の措置は不要である模様でした。
【前編】ゼロから学ぶKEDA：概要と導入目的【コスト削減編】

## はじめに
この記事では、Kubernetesでイベント駆動型スケーリングを実現する **KEDA**について、基礎から応用（導入）までを解説します。
**「KEDAとは何か？」** という基本的な疑問から始め、KEDAのアーキテクチャやベストプラクティス、さらに実際の導入方法までを**3部構成**で整理し、KEDAの仕組みと運用を理解できるように構成しています。

【前編】では、「KEDAの基礎」について取り上げ、**KEDAの概要**、そして**導入のモチベーション**について詳しく説明します。

## 対象読者
- Kubernetesを学習・導入している方
- KEDAって聞いたことがあるけど、「何をどうスケールしてくれるのかわからない」という方
- 「KEDAの導入に興味はあるけど、どこから手をつければいいかわからない」と悩んでいる方

## KEDAとは
**KEDA**は、Kubernetesにおけるイベント駆動型のオートスケーラーです。通常の**HPA**　 
 (Horizontal Pod Autoscaler）の仕組みを活用しつつ、独自の拡張機能を提供することで、以下のような柔軟なスケーリングを実現します。
 
https://keda.sh/
 
 ---

### 主な特徴
1. **ゼロスケールの対応**
HPAではPod数を1以上に保つ必要がありますが、KEDAでは **0→1** や **1→0** のスケーリングが可能です。
2. **柔軟なスケーリング条件**
CPUやメモリだけでなく、外部メトリクス（例: メッセージキューの長さ、APIリクエスト数）をトリガーにスケール条件を設定できます。
3. **カスタムリソースを活用**
`ScaledObject` というカスタムリソースを使用して、スケールの設定やトリガーの条件を簡単に記述できます。

---

KEDAは、登録されたトリガーを定期的に監視し、条件に合致すると、ターゲットとなるPodを起動または停止します。また、必要に応じてHPAを自動的に作成します。この仕組みにより、リソースを効率的に管理し、コスト削減を実現します。

### KEDAを導入する理由（モチベーション）
KEDAは、非稼働時間帯にPodを停止（ゼロスケール）することで、リソース利用を最小化できます。例えば、**開発環境やステージング環境**で、深夜や休日にPodを停止することで、GKEのリソースコストを削減できます。

さらに、**Datadogなどの監視ツール**との連携で、監視対象リソースを減らし、モニタリングコストを削減することも可能です。

### 柔軟なスケーリング条件の対応
KEDAでは、以下のようなスケーリング条件を設定できます。

1. **Cronベースのスケーリング**
特定の時間帯や期間中のみスケールを維持する必要がある場合に便利です。

2. **複数トリガーの組み合わせ**
例: CPU使用率とメッセージキューの長さを条件にした複雑なスケール条件を設定可能です。


## KEDA導入時の注意点
便利なKEDAですが、導入にあたっていくつかの注意点を考慮する必要があります。

---

1. **スケールアップ時のタイムラグ**
Pod数が0から起動する場合、**数秒のタイムラグ**が発生します。このタイムラグは、即時性が求められる処理では課題となる可能性があるため、必要に応じて事前に**手動でスケールアップ**する対応が必要です。

2. **HPAとの互換性**
KEDAを導入すると独自で設定しているHPAと**競合**します。必要最低限のPod数を確保する準備を整えた上でKEDAへ移行する必要があります。

3. **外形監視の調整**
ゼロスケール時には、監視ツールがPodの停止をアラートとして検知する可能性があります。これを回避するためには、ダウンタイム設定を行うなどの監視設定の見直しが必要です。

## まとめ
KEDAを導入することで、Kubernetes環境のリソース管理が大幅に効率化され、コスト削減に大きな効果をもたらします。ぜひ活用してみてください。


## 次回予告
次回の[【中編】](https://qiita.com/kimuchi-system/items/317f6f8b31ba16944744)では、KEDAのアーキテクチャに焦点を当て、その内部構造や動作の仕組みを詳しく解説します。
[【後編】](https://qiita.com/kimuchi-system/items/e049508a5421cd7b388b)では、KEDAの導入手順を実践的に紹介し、ScaledObjectの設定方法などについて解説します。


## [【中編】](https://qiita.com/kimuchi-system/items/317f6f8b31ba16944744)に続く
いいね・コメントお待ちしています！
【Git】コミットメッセージの修正方法

# はじめに
`Git`を使ってバージョン管理をしていると、コミットミスをしてしまうことは誰でも経験があるはずです。「コミットメッセージを間違えた」「内容を修正したいけどどうすればいいの？」と悩んだことがある方のために、`git commit --amend`を使った修正方法について解説します。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# git commit --amendを使用する
## git commit --amend とは
「amend」とは「修正する」「改心する」「正す」といった意味を持つ単語です。その名の通り、`git commit --amend`は直前のコミットを修正するためのコマンドです。

## git commit --amend で出来ること
`git commit --amend`を使うと、以下の2つの修正が可能です。

***コミットメッセージの修正***
例えば、誤ったコミットメッセージを修正するには以下のように操作します。


```bash
git commit -m "誤字のコミット"  # 誤ったコミット
git commit --amend -m "正しいコミット"  # 修正したメッセージ
```

***コミット内容の修正***

```bash
# 修正内容を反映
git add example.txt

# 直前のコミットを修正
git commit --amend
```

# 注意点
1つ重要なポイントとして、***<font color="Red">git commit --amendは基本的にpush前のコミットに対してのみ使用してください。</font>***

すでにリモートリポジトリに`push`されたコミットを修正すると、他の開発者と履歴が不一致になり、混乱を引き起こす可能性があります。その場合、新しいコミットを作成するなど、別の方法で対処しましょう。

# 終わりに
`git commit --amend`は、直前のコミットを修正するための便利なコマンドです。このコマンドを適切に活用すれば、コミットメッセージや内容を整理し、履歴をきれいに保つことができます。また、きれいな履歴を維持することで、他の開発者が変更内容を追いやすくなり、レビューの効率も向上します。

ただし、`--amend`の使用には注意が必要です。リモートに`push`済みのコミットには使用を避け、新しいコミットを作成するなど適切な方法で対応してください。

# 参考
『コミットの修正には git commit --amend が便利』

https://tech-blog.rakus.co.jp/entry/20191113/git

『git commit --amend でコミット後の小さい修正を前のコミットにまとめる』Zenn

https://zenn.dev/yyykms123/articles/2020-03-29-git-amend
Android XRで出てくる用語

Android XR で新たに出てきた用語の解説をいくつか書いておきます。


## Home Space(ホームスペース)
XR ではアプリを 2 つのモードで動かすことができ、その片方が Home Space。
Home Space は複数のアプリを並行して実行できる、マルチタスクなモードです。
互換性のある Android のモバイルアプリは基本的にはこの Home Space モードで動作します。
Space Panel や 3D モデルはサポートされません。

![Home space image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/e6e02b52-cff3-578d-5ca9-aec2b74aad0a.jpeg)



## Full Space(フルスペース)
Home Space とは別のモード。
一つのアプリに没入して実行するモードです。
既存の Android アプリは追加実装することで Full Space に対応することができます。
Space Panel や 3D モデルや空間オーディオを用いることで有効活用できます。

![full space image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/fc069d01-9a97-b9c1-f80a-154ce4312207.jpeg)


## Environment(環境)
Android XR での Environment は、ユーザーが XR デバイスを装着しているときに見る現実または仮想の空間のこと指します。

## Spatial environment(空間環境)
Spatial environment はユーザーの物理空間を占有する、完全に没入型の仮想空間のことです。


## Passthrough environment(パススルー環境)
Passthrough environment はユーザが見えている現実世界にデジタルな要素を追加する環境です。

## Spatial panels(空間パネル)
空間パネルは Android XR アプリの基本的な構成要素で、UI 要素、インタラクティブ コンポーネント、没入型コンテンツのコンテナとして機能します。

![spatial panels image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/be9f3807-8689-4e3b-6c00-c43e4ff94349.jpeg)

アプリを複数の Spatial panels に分解し、任意にレイアウトすることもできます。

![multi spacial panels image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/31fc9262-2972-c022-e480-46a0b7446dfa.jpeg)


## Dmm, distance-independent millimeters(距離に依存しない mm)
ユーザーと仮想オブジェクトの距離に関係なく一定のままである角度単位です。
1 dmm は 1 メートル離れたところから見たときの 1 mm を指します。
ある地点に配置した仮想オブジェクトへ近づくときに、見えているサイズを固定にしていた場合は仮想オブジェクトに近づくにつれてコンテンツが大きくなりますが、それだと見えにくいためにこの距離に依存しない mm が考えられました。
システムでは 0.868 dp-to-dmm を使用します。
Dmm 自体が Google が考案したもので詳細は過去の Google I/O で解説されています。

https://youtu.be/ES9jArHRFHQ?si=YxLHVyZfUxkbfRcD


## Orbiters(オービター)
Orbiters は Spatial panels 内のコンテンツを制御するフローティングの UI 要素です。
NavigationRail や NavigationBar などのナビゲーションコンポーネントを Orbiters に適応させることが推奨されています。

![orbiters with navigationrail image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/5aab4a90-9349-299d-6735-313376427a43.jpeg)

## Spatial elevation(空間高度)
空間パネルに対する Z 軸上の elevation 。
Spatial elevation は将来のリリースで変更される可能性があります。

![spacial elevation with dialog image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/d0defe98-fff1-c61f-640d-474b672b76f7.gif)


* * *

# リンク
- https://developer.android.com/design/ui/xr
AI安全性指標 2024 (AI Safety Index 2024) サマリー

Future of Life Institute (FLI) が作成した **AI安全性指標 2024** は、主要AI企業の安全性に関する取り組みを以下の6つの重要領域に基づき評価したものです。

1. **リスク評価**  
2. **現在のリスク（被害）**  
3. **安全性フレームワーク**  
4. **存在論的安全戦略**  
5. **ガバナンスと責任**  
6. **透明性とコミュニケーション**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1707407/9abfff3d-cf08-b3f3-e8a4-5ab8f3c0b4aa.png)

https://futureoflife.org

https://futureoflife.org/document/fli-ai-safety-index-2024/

## Panel of graders
Yoshua Bengio
Atoosa Kasirzadeh
David Krueger
Tegan Maharaj
Jessica Newman
Sneha Revanur
Stuart Russell

---

## 主な観察結果

1. **モデルの脆弱性**  
   すべての主要AIモデルが、脱獄（jailbreak）を含む敵対的攻撃に対して脆弱であることが判明。

2. **不十分な安全戦略**  
   先進的AIシステム（特にAGI）の安全性を確保するための実効的な戦略を提示した企業は存在せず。

3. **透明性の欠如**  
   多くの企業が外部監視を欠き、リスク評価の共有が十分ではない。

4. **利益優先の傾向**  
   外部規制がない場合、企業は安全対策を犠牲にして利益を優先する傾向が強い。

---

## 評価の概要

各企業は米国のGPAスケール（A+～F）で評価されました。以下に主な企業の成績を示します：

### 成績表
| 企業名         | 総合評価 | 特徴                                                                 |
|----------------|----------|----------------------------------------------------------------------|
| **Anthropic**  | C (2.13) | 安全性に関する責任あるスケーリング方針を導入。外部監視の取り組みも評価されたが、存在論的リスクへの戦略は不十分。 |
| **Google DeepMind** | D+ (1.55) | Frontier Safety Frameworkを開発したが、実装が不十分で透明性にも欠ける。                      |
| **OpenAI**     | D+ (1.32) | 初期のガバナンス施策は評価されたが、包括的なリスク管理が不足している。                          |
| **Meta**       | F (0.65) | ガバナンスや安全性に著しい欠陥があり、高度なモデルのオープンソース化も問題視された。             |

---

## 改善に向けた提言

1. **外部監視の強化**  
   第三者評価機関の関与を増やし、安全性対策のモニタリングと検証を実施すべき。

2. **強固なフレームワークの構築**  
   リスクが確認された際に開発を停止する明確な基準を設定する必要がある。

3. **透明性の向上**  
   評価結果や取り組みを公開し、企業の責任を明確にする。

4. **存在論的リスクへの注力**  
   AGIや他の先進的AIシステムによるリスクを軽減するための具体的な計画を策定する。

---

本レポートは、現在および将来的なリスクに対処するため、AI業界全体でのガバナンスや協力の重要性を強調しています。
Power Apps で SharePoint リストの添付ファイルの画像を表示する


# はじめに

SharePoint リストでは、行ごとに添付ファイルを追加することができます。複数追加できるため、行に対して、１ 対 N の関係になります。

また、添付ファイルのため画像を追加することもできます。
個人的には、リストに追加したい画像があり、数が決まっている場合は、画像列でもいいですが、数が複数になる、何個になるか分からないようなときは添付列を利用しても良いかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f4eb1a58-75ab-30cc-c67d-2cf995b91a04.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6ea5aede-69ba-aa1f-74d7-c04a0b7cf41c.png)

この場合、どうやって表示するのか？という質問いただいたことがあるため、アプローチを紹介します。

# アプローチ

まず、左側にギャラリーを追加します。右側にフォームコントロールを追加して、ギャラリーで選択されたアイテムが表示されるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/49a6bfa2-7407-68bc-2f8e-dad82cd0fea1.png)

もちろん、これだけだと、添付ファイルの画像の情報は表示されません。

そのため、もう一つギャラリーを追加してあげて、`[Items]`プロパティに、左側のギャラりーで表示されたアイテムの添付ファイルを渡してあげます。行ごとに添付ファイルがいくつ追加されるか分からないため、添付ファイルもテーブル構造になっています。そのため、ギャラリーで表示することができます。この場合、添付ファイルの数が増えても問題なく表示できます。
※数が多いとスクロールする必要が出てくるかもしれません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/31ea67fa-d535-f1be-1edf-af3aa1be31b9.png)

 ギャラリー内の画像コントロール、テキストコントロールのプロパティは以下の通りです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/55ccdad5-f12d-a7b0-814a-5dd0b6fd6a1e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/00d66161-9805-0f63-0732-570c1199128b.png)

これで無事に表示できました。

このままでもいいですが、個人的に、こんな感じで添付ファイルがある場合はいいですが、添付ファイルがない場合、下の方に無駄にスペースが出来てしまい、ちょっと気になります。せっかくなので、高さいっぱいフォームコントロールを使いたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/afe0f87a-0734-9701-5a77-47a60c25bcf9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7fed5008-91c2-0ce6-4713-8fbf227de281.png)


そのため、こんな感じで垂直コンテナーを配置して、その中にフォームコントロールとギャラリーを配置します。そして、添付ファイルの画像を表示する用のギャラリーについて、添付ファイルがある場合だけ表示するようにします。
そうすると、添付ファイルがない場合は、フォームコントロールの高さが広がり良い感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/32b6550a-97de-d494-ed86-7a511c0bc46f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/39644db3-28fd-09d0-0216-3d7e5918cb54.png)