OmniAICreator/Qiita-1.07M huggingface dataset:
Rich Human Feedback for Text-to-Image Generation

# 1. 概要

Stable DiffusionやImagenといった"テキストから高品質な画像を生成するAI(Text-to-Image)"が注目されているが、画像の一部が歪んでいたり不自然だったりする、テキストの指示通りに画像が生成されない、きれいな画像ではない、などの問題が起こることがある。
提案手法では、大規模言語モデル(LLM)における人間のフィードバックを用いた強化学習(RLHF)の成功に着想を得て、人間からのフィードバックを使ってAIが生成する画像の品質を向上させるためにデータセットを作成している。データセットは18,000枚の生成画像に対して人間が"良い/悪い"で評価するだけでなく、画像内のどの部分がおかしいか、テキストのどの単語が反映されていないかを具体的に指摘したものになっている。詳細を記述したデータセットのフィードバックを使ってマルチモーダルトランスフォーマーを学習させたところ、生成AIがより的確に生成画像の問題点を理解しやすくなり、より自然で高品質な画像を生成できるようになった。


*BEST PAPER AWARD

---

# 2. 新規性

- 具体的な指摘を含むフィードバック
従来の点数による評価だけではなく、画像の具体的な問題点やテキストとの不整合箇所を明確にすることによってAIの学習を促進させている。
- フィードバックを予測するAI
フィードバックデータセットを学習させておくことで、AI自身が画像とテキストを見て、人間ならどこを指摘するか予測できるようになった。
- 様々な画像生成AIへの応用
特定の画像生成AIに特化した手法ではなく、様々なAIの性能向上に役立つ汎用性の高い技術を提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/3c8fe7b6-0a68-12f1-1899-4b0be14f0bba.png)

テキストを入力して画像を生成させる。アノテーターは画像の不自然なところをクリックしてマーキングし、テキストとの不整合箇所を修正する。テキストと画像のペアについて、もっともらしさ・自然らしさ・画像の品質・全体について数値評価を実施する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/16d6e702-e724-90d0-733f-cb7a725c7685.png)

Text-to-Imageの生成AIを用いて画像とテキストのペアを生成し、1枚の画像について3人のアノテーターに評価をさせている。カテゴリーとしては人・動物・物体・屋内・屋外で偏りが無いように構築されており、16Kがtrain用、1Kがvalidation用、1Kがtest用となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e293b0b1-ff71-9850-eacb-ad01b61a5cab.png)

応用として集めたフィードバックデータを使って、画像とテキストを入力するとフィードバックを自動で予測するAIシステムを構築している。画像からの特徴はVision Transformerを用いて抽出されており、テキスト特徴はTransformerを用いた抽出になっている。画像は、人間だったらどこを不自然に思うかヒートマップ化して可視化できるようにしており、各カテゴリの数値評価についても予測する。不自然な個所はマスクを作成してインペインティング(画像修復技術)を用いて自動修正する。テキストは、コンテキストに合わない単語を自動で修正する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/197d4d94-9d09-5de9-9c42-356ec530821f.png)

人間だったらどのようにフィードバックするかを予測するAIシステムを構築したことで、1)質の高い学習データを選択させ良いフィードバックを得た画像だけを使って画像生成AIを更に学習させ、2)問題個所を自動で特定し修正できるAIを構築した、という2種類の方法を使うことでより自然な画像を生成できるようにした。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2119c94f-c1d6-8164-4b50-9acc2c49c09f.png)

従来の点数による評価よりも、具体的な指摘を含むフィードバックの方が生成AIの性能向上に効果的だった。従来のテキストと画像のマルチモーダルなCLIPベースのモデルと比べて、提案手法の方が不自然な個所の可視化精度が高いことが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d7532a0a-a353-5a64-cfe9-6bdb3b03605f.png)

Stable Diffusionで学習したフィードバック予測モデルを用いて、異なるアーキテクチャを持つMuseに対しても有効性を確認したところ、異なるモデルでも性能が向上し汎用性の高さを示している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Liang_Rich_Human_Feedback_for_Text-to-Image_Generation_CVPR_2024_paper.pdf>

last updates: June. 17 2024
素朴な疑問 ~ シリアライザーって何？ ~

# 素朴な疑問
筆者が新人教育する中で、プログラミング実務未経験者がよくされる質問を紹介します。
未経験者に限らず、「そういえば何のために使っている技術（ツール）なんだっけ？」とよく理解していないまま利用しているケースも少なくありません。
この記事で、その純粋で素朴な疑問を改めて明確にして理解を深めていきましょう！

# 今回の疑問
今回の疑問は表題通り、

「<font color="DarkOrange">**シリアライザー**</font> って何？」　です！

実務未経験者のポートフォリオレベルでは、シリアライザーを [ActiveModelSerializers](https://github.com/rails-api/active_model_serializers) などのライブラリを使って導入されておらず、実務で初めてシリアライザーの存在を認識するケースが多いようです。
そこで、本記事で取り上げたいと思います！

# シリアライザーって何？
Railsのシリアライザーは、データをJSON形式に変換するためのツールです。
簡単に言うと、**データベースから取り出した情報をWebアプリケーションで使いやすい形に変換する** 役割を果たします。

しかし、、、

「使いやすい形」とは何なんでしょうか？
そもそもなぜライブラリを使って変換しなればならないのでしょうか？

`rails g scaffold` で作成されるcontrollerには下記のように記載されており、これでも問題なくjson形式に変換してレスポンスを返せます。

``` ruby
  # GET /users/1
  def show
    render json: @user
  end
```

上記が初心者の困惑するポイントだと思います。
このポイントが理解できるように次のセクションで説明致します。

# シリアライザーの基本的な役割
シリアライザーの基本的な役割を下記3つにまとめました。

- データの変換
- リレーションデータの取得
- データの整形

`ActiveModelSerializers` を使って変換する場合と、`json: @model` を使って変換する場合との違いは下記のようになります。

<table>
  <thead>
    <tr>
      <th></th> <th>ActiveModelSerializers</th> <th>json: @model</th>
    </tr>
  </thead>
  <tr>
    <td> データの変換 </td> <td>○</td> <td>○</td>
  </tr>
  <tr>
    <td> リレーションデータの取得 </td> <td>○</td> <td>×</td>
  </tr>
  <tr>
    <td> データの整形 </td> <td>○</td> <td>×</td>
  </tr>
</table>

### データの変換
データベースの情報は通常、Rubyのオブジェクトとして格納されていますが、API経由で提供する場合はJSON形式に変換する必要があります。シリアライザーはこの変換作業を行います。

### リレーションデータの取得
`json: @model` では、基本的にはモデルの直接の関連のみを含めることができます。

``` js
/* 
  json: @userの場合
  - Userモデルの属性のみを返す
*/
{
  "id": 1,
  "name": "John Doe",
  "created_at": "2023-08-07T12:00:00Z",
  "updated_at": "2023-08-07T12:00:00Z"
}
```

一方で `ActiveModelSerializers` を使うと、親モデルとそれに関連する子モデルのデータなどネストしたリレーションモデルも含めることができます。

``` js
/* 
  ActiveModelSerializersの場合
  - Userモデルとリレーションを持つPostモデルの属性を返すことができる
*/
{
  "id": 1,
  "name": "John Doe",
  "created_at": "2023-08-07T12:00:00Z",
  "updated_at": "2023-08-07T12:00:00Z",
  "posts": [
      {
        "id": 1,
        "title": "First Post",
        "content": "This is the content of the first post.",
        "created_at": "2023-08-07T13:00:00Z",
        "updated_at": "2023-08-07T13:00:00Z"
      },
      {
        "id": 2,
        "title": "Second Post",
        "content": "This is the content of the second post.",
        "created_at": "2023-08-08T10:00:00Z",
        "updated_at": "2023-08-08T10:00:00Z"
      }
    ]
}
```

### データの整形
`json: @model` を使用すると、モデルのすべての属性がJSONとして返されますが、この方法では不要な情報も含まれる可能性があります。例えば、ユーザーモデルにパスワードという属性がある場合、これはセキュリティ上の重要な情報ですが、Webアプリケーションが直接使用しない場合でも、パスワードが毎回JSONに含まれてしまいます。
また、date型やdatetime型の属性がある場合もJSONのフォーマットを指定することができません。
``` js
/* 
  json: @userの場合
  - Userモデルのすべての属性を返すのでパスワードのような重要な情報も不要に返されてしまう
  - datetime型データのフォーマットを指定できない
*/
{
  "id": 1,
  "name": "John Doe",
  "password": "password",
  "created_at": "2023-08-07T12:00:00Z",
  "updated_at": "2023-08-07T12:00:00Z"
}
```

一方で `ActiveModelSerializers` を使うと、返したい属性のみを返すことができますし、JSONのフォーマットを指定をすることもできます。

``` js
/* 
  ActiveModelSerializersの場合
  - 返したい属性のみに絞ることができる
  - datetime型データを日本語に変換することができる
*/
{
  "id": 1,
  "name": "John Doe",
  "created_at": "2023年08月07日　12時00分00秒"
}
```
Mip-Splatting: Alias-free 3D Gaussian Splatting

# 1. 概要
![Mip-Splatting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b04d8d0a-134c-4448-84e3-cc94d9df5766.gif)

3次元空間を多数のガウシアン分布で形状表現し、視点に応じたレンダリングを行うことで高品質な3次元画像合成を可能にする技術のことを、3D Gaussian Splattingと呼ぶ。近年、高品質で効率的な3次元画像合成を実現する手法として注目されている。この技術を用いると、複数の視点から撮影した画像から、まるでその場にいるかのようなリアルな3次元シーンを作ることができる。

しかし、カメラのズームや視点の移動などによってサンプリングレート(画像を構成する点の密度)が変わると、画質が劣化してしまう問題があった。この論文では、この問題点の原因が、3次元空間における周波数を考慮していないことと、2次元画像処理における特定のフィルター(膨張フィルターなど)の使用にあることを突き止めた。

提案手法では、新しい3次元平滑化フィルターを導入し、入力画像のサンプリングレートに基づいて3次元形状を表現するガウシアンの形状の大きさを調整し、ズーム時の画質劣化を抑制することに成功した。さらに、膨張フィルターをMipフィルターと呼ばれる別のフィルターに置き換えることで、エイリアシングや輪郭のギザギザ(ジャギー)を効率的に軽減できることを明らかにした。

*1)Mipフィルター：画像を縮小する際に、高周波成分を抑制することでエイリアシングを防ぐフィルター
*2)エイリアシング：画像のサンプリングレートが低すぎる場合に、本来存在しない模様が現れる現象

*BEST STUDENT PAPER AWARD

---

# 2. 新規性

- 3次元空間における周波数特性を考慮した平滑化フィルターの導入
- 2次元画像処理におけるMipフィルターの適用による画質改善

複数の視点画像から3次元シーンを表現して、任意視点でシーンを生成できる従来技術として、NeRF(Neural Rendaring Field)が挙げられるが、3D Gaussian Splattingとは重要な違いがある。

|特徴|NeRF|3D Gaussian Splatting|
|--|--|--|
| シーン表現 | 連続関数（MLP | ガウシアンプリミティブの集合 |
| メモリ効率 | 低い（シーン全体を表現する必要がある） | 高い（疎なデータ構造） |
| レンダリング速度 | 低速 | 高速 |
| 画質 | 高い | 高い |
| 編集可能性 | 低い | 高い |

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a9da92d3-afb3-e16f-7e2f-79d7fbbfd771.png)

- 3次元平滑化フィルターの導入：
入力画像のサンプリングレートに基づいて、3次元ガウシアンの形状の大きさを調整することで、高周波成分によるノイズを除去し、ズームしたときの画質劣化を抑えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6ac1e9d2-9f00-98d2-d370-49ca81adeeb8.png)

- 2次元Mipフィルターへの置き換え：
従来の膨張フィルターを2次元ボックスフィルターを模したMiPフィルターに置き換えることで、エイリアシングや輪郭のジャギーを抑制することに成功した。

---

# 4. 結果

ズームアウト時に物体形状が太く表現されすぎたり、ズームイン時に物体形状が細く表現されすぎたりすることを避け、画質の品質を均一に維持できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/10056248-2896-2a84-4782-88d2bc887641.png)

従来手法である3DGSでは、サンプリングレートが極端に小さくなったときに、画素の少なさからエイリアシングが発生し物体が大きくなってしまっている。提案手法では、参照画像と比べてもエイリアシングを抑えられていると言える。

提案手法では、単一の解像度の画像で学習したモデルであっても、複数解像度の画像に対して3次元での画質向上の有効性を確認しており、汎用性が高いことを示している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Yu_Mip-Splatting_Alias-free_3D_Gaussian_Splatting_CVPR_2024_paper.pdf>

last updates: June. 17 2024
Raspberry Pi + DS18B20で水温測定

## はじめに
熱帯魚を飼っているのだが夏場の水温がどれくらい上がっているか気になっていたので、せっかくなら温度センサーとラズベリーパイを使って温度管理システムのきっかけとなるようなものを作ろうと思った。

水温センサーは、安価で実装事例の多い、***DS18B20***を使用することにした。

水温センサーは、Amazonで購入できる。
[https://www.amazon.co.jp/gp/product/B07PB9VGQ4/ref=ppx_yo_dt_bz_asin_title_o02_s00?ie=UTF8&psc=1](https://www.amazon.co.jp/gp/product/B07PB9VGQ4/ref=ppx_yo_dt_bz_asin_title_o02_s00?ie=UTF8&psc=1)

## 開発環境
- macOS Ventura13.4
- Python 3.11.2
- Raspberry Pi OS (64-bit)

## 準備するもの
- Raspberry Pi4 ModelB 4GB
- 水温センサー　DS18B20
- ジャンパーワイヤー
- ブレッドボード
- はんだごて

## ラズベリーパイの設定

OSのセットアップは完了しているものとします。

セットアップ方法は、他記事などで調べてください。

### 1-Wire通信を有効にする

```raspi-config```コマンドでメニューを開く

```
sudo raspi-config
```

「3 Interface Options」→「I7 1-Wire」→「Yes」の順に選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/4fa1fb95-a7b8-91ca-5c0d-141f944f1dab.png)


![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/df6e6328-6268-80e7-de39-bf0da39a413f.png)

![image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/116209f4-9f34-f979-0785-bad279a94f41.png)


#### boot/config.txtに以下を設定
```
dtoverlay=w1-gpio,pullup=on
```

### モジュールのインストール

#### python実行ファイルを配置する位置に移動します。

```
cd /home/ds18b20/ 
```

#### Pythonに関するモジュールをインストール

仮想環境の作成
```
python -m venv env
```

仮想環境へアクティベート
```
source env/bin/activate
```

ライブラリのインストール
```
pip install w1thermsensor
```



## 水温センサー（DS18B20）の準備

### 配線を半田付けする
水温センサーは購入時のままだと、配線が剥き出しでブレッドボードに結線できないので、ジャンパー線３本それぞれにハンダ付けして使えるようにした。

![image_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/570f72a7-3827-1efe-3c09-a39d0378474a.jpeg)


## ラズベリーパイに配線する

DS18B20の配線は以下のように接続します。

- 赤 (5V)：ラズベリーパイの5V [1番ピン] へ接続
- 黒 (GND)：ラズベリーパイのGND [39番ピン] へ接続
- 黄 (信号線)：ラズベリーパイの[7番ピン]へ接続

ブレッドボード上で黄色の信号線ラインと5Vラインを4.7kの抵抗で接続します。

**配線図**

![image_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/0cae7540-1e24-017f-0d76-8d63a3eb5259.jpeg)


配線後の実物が以下。

![image_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774903/8b8fcf1f-9a05-f19f-0e61-6081f1b0f87a.jpeg)



## プログラムの作成
ラズベリーパイ上で実行するpythonファイルは以下。

```python
from w1thermsensor import W1ThermSensor
import time

def main():
    ds18b20_sensor = W1ThermSensor()

    while True:
        try:
            temperature = ds18b20_sensor.get_temperature()
            print("{0:.3f} C".format(temperature))
            time.sleep(3)
        except Exception as e:
            print(e)
            break
    
    return

if __name__ == "__main__":
    main()
```

## プログラムの実行
```
(env) $ python ds18b20.py
28.312 C
28.375 C
```

3秒おきに温度が表示されます。

## 終わりに
水温を測定してみたところ、27~28度と特に熱帯魚にとって冷却が必要な水温ではなかったので、一安心。
逆に冬は水温が下がり過ぎてしまいそうなので、ヒーターを付けて温度調整する必要がありそう。
あとは、温度監視しやすいようにWebアプリ化して常時監視できるようにもしていきたい。
BioCLIP: A Vision Foundation Model for the Tree of Life

# 1. 概要
![BioCLIP.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9ab7cb61-5cf5-49d7-74fc-852a5f074b9f.gif)

近年、ドローンやスマートフォンなど手軽なデバイスを用いて高画質なカメラで撮影された自然画像が、生物学の情報の宝庫となっておりその数も急速に増している。動植物の保全活動や解明のためにこうした高解像度画像を解析する技術が多数提案されているが、既存の手法は特定のタスクに特化したものが多く、新しいデータセットやタスクに対応するのが難しかった。そこでこの研究では、画像を入力すると学術分類が自動で行えるツールを開発し、生物画像に広く適用できる汎用的な画像認識モデルを提案している。

提案手法では、まず生物画像の大規模データセットである"TreeOfLife-10M"を構築し公開している。機械学習に適した形式でアノテーションされており、過去最大規模かつ最も多様な生物画像データセットとなっている。さらに、このデータセットと生物学的知識体系である"Tree-of-Life(生命の樹)"を組み合わせることで、生物画像のための基盤モデルである"BioCLIP"を提案している。TreeOfLife-10Mデータセットを用いて、植物・動物・菌類などの豊富で多彩な画像と、構造化された生物学的知識を組み合わせることで、従来手法を大幅に上回る認識性能を達成している。

*BEST STUDENT PAPER AWARD

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/be97aa84-187d-90d3-4152-dc59e07dfde3.png)

- 大規模データセット"TreeOfLife-10M"の公開
- Tree-of-Life(生命の樹)に基づいた大規模基盤モデル"BioCLIP"の開発

---

# 3. 実現方法

インターネット上の画像や既存のデータベースから、植物・動物・菌類などの画像を収集し、分類してラベル付けを行い、機械学習に適した形式に成形している。このデータセットを用いて、生命の樹の構造情報を組み合わせ、テキストと画像を組み合わせるマルチモーダル生成AI技術であるCLIP(Contrastive Languagte-Image Pretraining)アーキテクチャに基づいたBioCLIPモデルを学習させている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/45898d2b-0ef9-1686-1f70-b86caccf6380.png)

例えば、よく似たシダ植物を入力とした場合、分類学上"種(Species)"レベルでのみ異なり、それ以外の分類レベルは同じである。自己回帰型のテキストエンコーダーは、分類学上の階層構造を符号化でき、例えば、"界(Kingdom)"・"門(Phylum)"・"綱(Class)"のトークン情報を自動で取り組むことができるが、"目(Order)"より下の階層の情報は取り込まない。これは、入力画像の視覚表現を同じ階層構造に整合するための制約になっている。
前段でテキスト情報として階層的に表現された生物分類ラベル情報は、CLIPの対照事前学習の目的関数に入力され、入力の画像表現(d)と(e)とマッチングに用いる。

*自己回帰型テキストエンコーダー：
前の単語から順番に処理していくことで、単語列をベクトル表現に変換するエンコーダー
*対照事前学習：
類似したデータペアを近くに、異なるデータペアを遠くに配置するように表現を学習する手法

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/cf7c2119-87ca-855b-58c8-cac17ab1a94d.png)

表は、異なるモデルにおけるZero-shot/Few-shot(1shot/5shot)の分類結果のTop-1正解率を示している。すべてのモデルで同じViT-B/16アーキテクチャを用いている。提案手法はCLIPと比べて17%以上正解率が向上している。

様々な生物種分類タスクにおいて、提案手法のBioCLIPは従来の画像認識モデルを大幅に上回る精度を達成した。また、BioCLIPでは生命の樹(Tree-of-Life)の構造を反映した階層的な表現を獲得しており、未知の生物種に対しても高い認識精度を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Stevens_BioCLIP_A_Vision_Foundation_Model_for_the_Tree_of_Life_CVPR_2024_paper.pdf>

last updates: June. 17 2024
Long-Tailed Anomaly Detection with Learnable Class Names

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/3bb0fadc-79f7-9c97-e3f5-afabbba9bc38.png)

画像内から異常個所を検知する技術は"Anomaly Detection"と呼ばれ、不良品の画像を識別しその不良個所を特定するアプリケーションでよく用いられる。理想的には、異常検知モデルは以下のような能力を持っていることが望ましい。1) 多数の分類クラスに対して汎用的な欠陥検出能力、2) データセット間で一貫性の無いクラス名への対応、3) 異常データを用いない教師なし学習、4) 実世界のアプリケーションで精度を上げる際にありがちなカテゴリーごとの分布が全く違うデータ(Long-tailed Data)への対応。

この研究では、こうした異常検知の実際のアプリケーションを作成する際の課題(1)-(4)に対処するため、不良品画像のクラスの偏りが異なる複数のデータセットを公開し、性能評価の指標を新たに提案している。

---

# 2. 新規性
- カテゴリーごとに偏りが全く異なるデータ(Long-tailed Data)の異常検知の定義：
クラス分布の偏りが異なる複数のデータセットと、性能評価のための指標を導入することで、実世界のデータに即した異常検知問題を再定義している。
- 教師なし学習とセマンティック解析の融合：
従来の画像再構築ベースの異常検知手法に加えて、疑似クラス名と基盤モデルを用いたセマンティックな手法を提案しており、より高精度な異常検知を実現した。
- データ拡張による偏りの異なるデータ問題への対応：
VAEを用いた特徴量合成により、学習データをaugmentationで増やし、データの偏りによる影響を軽減している。

*Vision Autoencorder(VAE):
表現学習と生成学習の両方の性質を併せ持つ深層学習モデル。潜在空間を扱うことで、データの背後にある構造を理解し、新しいデータを生成することが可能となる。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4f0bfc30-5d4e-c51d-3347-b6306bd52ebd.png)

予備実験として、MVTecデータセットを全て用いたもの(青線)と徐々に各カテゴリーのデータを減らしたものの数値分布を右側に示しており、偏りを作ったデータに対する認識精度の違いを左図に示している。学習データが少ないほど認識精度も悪化する傾向にある。
学習は以下の2つのフェーズで実施している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d8447d0d-7f7c-6750-872b-b3fff378f85b.png)

フェーズ１：
- クラス名は未知のため、データから疑似クラス名Scを学習する
- VAEを用いて学習データをAugmentationして増やすための特徴量合成モデルを学習する
- エンコーダー/デコーダー特徴量の再構成誤差を最小化するためにMSEロスを使用
- 潜在空間の分布を一様にするためにKLDを採用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b316fe3b-6d83-79e8-f217-f0da1795b57c.png)

フェーズ２：
- フェーズ１で得られた疑似クラス名と特徴量合成モデルを用いて、再構成モジュールと分類モジュールを学習する
- 正常画像の特徴マップPnにノイズを加えてPaとして、セマンティック異常検知手法(SAD)と、再構成モジュールに入力する
- 再構成モジュールでは、正常画像の特徴量マップとノイズを除去した特徴量マップのL2ノルムの差が最小になるようにMSEロスを使用
- セマンティック異常検知モジュールでは、特徴量マップをパッチに分割し、画像特徴からテキスト特徴へ変換する(P^)。フェーズ１で学習した正常画像の擬似クラス名を含む正常プロンプトVnと異常プロンプトVaをテキスト空間へ変換し、テキスト空間上で画像パッチベースの特徴(P^)と比較して異常度を算出する。ロスはBCE(Binary Cross Entropy)を各パッチに対して適用。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a924dc97-3d56-6030-fdd2-3fc7e084410b.png)

- 推論時は、再構成モジュール(Reconstruction Module)を用いて、入力画像をパッチ分解しパッチ単位で異常度を算出する
- 差分が大きければ異常度が高くなるように出力される

---

# 4. 結果
![Long-tailedAD.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e3b448cd-f258-549b-d5bf-e1ce00fd4fa5.gif)

様々な工業製品の異常個所に対して従来手法よりも正確に異常個所を推定できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0fedda61-9026-e273-1c8f-89984201e578.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d5ce1d78-a71c-465c-250c-4a9d57170c74.png)

MVTec/VisA/DAGMデータセットでの比較結果では、既存の異常検知手法と比較してより高い精度で異常を検出することに成功している。データセットの偏りに頑健という特色がある。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Ho_Long-Tailed_Anomaly_Detection_with_Learnable_Class_Names_CVPR_2024_paper.pdf>

last updates: June. 18 2024
乱数という世界について

# はじめに
シュミレーションとか、くじ引きでよく使われる乱数、特にプログラムを用いての疑似乱数について感じたことを取り上げてみようかと思う。あくまでも自分個人での視点なので読み流してもらえると助かる。あまりレベルはいつも通り高くない(笑）

# 定義とか
乱数。特にプログラムで使用される疑似乱数について。
乱数本来は、一度生成すると再現できない乱数列を指していたりするのだがプログラムを使用して生成する疑似乱数は規則性があったりして再現できたりする。

# 有名な乱数生成について
有名な乱数生成について調べてみた。線形合同法、M系列などなど。
乱数は数列という世界観が大事。

まずは線形合同法。生成の公式を以下に記載する。

```math
X_{n+1}=(A×X_{n}+B)\quad Mod\quad M
```

漸化式が使用されているのがわかるかと思う。
この使用されている漸化式って英訳するとrecurrence relation、再帰関係式を指しており自身を呼び出すための再帰性が定義づけられていることがわかる。漸化式って再帰性の世界ももつということ。つまりは、１つの数をスタートとするとその数を使用してゴールとなる数値が生成される。これらを並べたものを疑似乱数として扱う。要するに乱数は、ある種の規則性を持った数列の視点を持つのがわかるかと思う。

じゃあ、なぜ、漸化式の他にMod 、余りを使うのか。これは、乱数生成において重要となる周期性に関連する事項となるため、制限をかけるため、用いられている。割り算のあまりを使用することで、割る数であるM以下に算出することができる。周期性が長いほど質の高い乱数生成と考えられるためだ。

つづけてM系列について、こちらも公式を以下に記載してみる。

```math
a_{n}=a_{n-q}+a_{n-p}\quad (Mod\quad2 , q<p)
```

こちらも漸化式を使用しており同じく再帰的な視点を持つのが確認できる。
Gear-NeRF: Free-Viewpoint Rendering and Tracking with Motion-aware Spatio-Temporal Sampling

# 1. 概要
![Gear-NeRF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/bc1cb7de-9adc-0d5f-28ab-7a4c5e5600eb.gif)

複数のカメラから3次元シーンを再構成するNeRF(Neural Radiance Fields)は画像だけでなく、動画へも拡張することができ、任意視点でレンダリングできるため自由度が非常に高い。しかし、従来手法は計算コストとシーンのセマンティック理解の両面で課題があった。

この研究では、高精度なセマンティックセグメンテーションモデルを利用して物体の領域情報を抽出し、複雑な動きのあるシーンでもレンダリングでき、かつ主体となる物体のトラッキングを3次元再構成した動画シーンから実現するGear-NeRFを提案している。
Gear-NeRFは、シーンの動きの大きさに基づいて動的領域を階層的にモデリングする"Gear"の概念を導入しており、各領域の動きに合わせて時空間サンプリングの解像度を調整することで、よりリアルな動画の3次元空間における任意視点のシーン再構成を実現している。さらに、従来のNeRFベースの手法では実現できなかった主体となる物体のトラッキングも可能になった。

*Highlight Poster

---

# 2. 新規性
- セグメンテーション情報に基づく時空間セマンティック情報の学習：
シーンの背景と動きのある前景とを効率的に把握できる
- "Gear"の概念：
動きの大きさに応じた階層的モデリングにより計算リソースを効率的に利用
- 自由視点での物体追跡：
従来は困難だった任意視点での物体追跡を可能にした

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/545b6dc5-9051-5d39-569c-ad4bdc9afdb0.png)

動きのある領域を前処理で"Gear"として抽出しておき、各"Gear"に対して4次元(時空間)の特徴量ボリュームを構築して動きのある領域を時間方向に埋め込んだ表現にする。次に、META社の提案したSAM(Segment Anything Model:ICCV2023)を利用して領域分割を行い、動きの大きさに応じてシーンを複数の"Gear"に分割し、各ギアごとに最適な時空間解像度でNeRFを学習する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e00440b0-c077-0263-c6a3-55e7c20c91cb.png)

動きの大きな領域は再構成ロスを高く設定し、高解像度の時空間での生成結果を得る。物体追跡(tracking)については、クリック操作で追跡対象を選択しその物体領域だけをセマンティックセグメンテーションで領域分割し、時間方向に連続してレンダリングすることで動画にする。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/06e7995e-8c99-0580-70ce-66180cce5932.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d3015220-b3bc-0743-34ac-9909a895e556.png)

レンダリングに関する性能評価では、複数のベンチマークデータセットにおいて、従来手法と比較してより高品質な任意視点画像を生成できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/24182923-5a15-bb91-d905-a36f6f071385.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/55061294-99fe-afbb-9028-9c6c4bd686e4.png)

トラッキングに関する性能評価では、セマンティックセグメンテーションを利用したことで動的シーンにおける物体追跡が可能となり、高い追跡制度を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Liu_Gear-NeRF_Free-Viewpoint_Rendering_and_Tracking_with_Motion-aware_Spatio-Temporal_Sampling_CVPR_2024_paper.pdf>

last updates: June. 18 2024
TI2V-Zero: Zero-Shot Image Conditioning for Text-to-Video Diffusion Models

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/16425a1b-b402-aaf6-4dcb-d7fee46499dd.png)

画像とテキストから動画を生成する技術のことを、テキスト条件付き画像動画生成(TI2V:Text-conditioned Image-to-Video generation)と呼び、例えばドラムをたたく男性の画像に対して"ドラムをたたく人"というテキストを入力すると、ドラムをたたいている動画が生成される。従来手法は、動画とテキストのペアのデータセットを用いたコストのかかる学習や、テキストと画像の条件付けをするための専用のモデル設計が必要となっていた。

この研究では、事前学習済みのテキストと動画の拡散モデル(T2V Diffusion model)を利用し、ゼロショットかつチューニングフリーな手法としてTI2V-Zeroを提案している。最適化やファインチューニングや外部モジュールなどの導入が全く必要ない。提案手法では、"repeat-and-slide"戦略と呼ばれる手法を導入しており、事前学習済みの凍結した拡散モデルを用いてノイズから画像を生成する際に、最初の入力画像からフレーム単位で生成し合成していくことでシームレスな動画を作る。

---

# 2. 新規性
- ゼロショットでTI2Vを生成：
ファインチューニングやモデルの変更を必要とせず、テキストと画像から直接動画の生成が可能になった
- "repeat-and-slide"戦略：
事前学習済みの拡散モデルを固定し、入力画像のコンテキストを考慮した動画生成を可能にした

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c5f769a9-5a6b-2b8f-a319-5b58e0b52a84.png)

フレームエンコーダーE、フレームデコーダーD、ノイズ除去U-Net εθを含む、事前に学習され凍結された拡散モデルを使用する。動画生成時は以下のステップを実行する。

1. 初期画像をエンコード：
まず、入力画像x0を潜在空間表現z0にエンコードする。
2. キューの初期化：
z0をフレーム生成数分のk回繰り返して、フレームのキューs0 = [z0, z0, ..., z0] を初期化する。
3. 初期ノイズの生成：
初期化したフレームs0に対して逆拡散過程(DDPM: Denoising Diffusion Probabilistic Model)を適用し、初期のガウシアンノイズzˆTを生成する。

逆拡散過程のノイズ除去ステップでは、U-Net εθを用いた逆ノイズ除去としてzˆt の最初の kフレームを、s0にノイズを徐々に加えた潜在コードstで置き換える。その後、各ステップ内でリサンプリングを行い、動きの滑らかさを向上させる。

画像生成の最終ステップ(t=0)では、z^0の最後のフレームをデコードし、新しいフレームx^i+1として出力する。生成した新しいフレームをキューに入れ、最初のフレームをデキューしてキューをスライドさせ、次のフレームを生成する。これを繰り返して動画にする。


*DDPMは拡散モデルと呼ばれる確率モデルの一種で、以下の2段階プロセスを通じて画像を生成する:
1. 前身拡散過程(Forward Diffusion Process)：元の画像に段階的にノイズを加えていき、最終的に純粋なノイズ画像に変換する
2. 逆拡散過程(Reverse Diffusion Model)：学習したノイズ除去モデルを用いて、ノイズ画像から段階的にノイズを除去し、元のデータ分布を復元することで新しい画像を生成する 

---

# 4. 結果
![TI2V-Zero.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5e4a11d5-0516-6e7a-7839-59646766bd9b.gif)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4959f369-9c78-b57d-9234-a55a4208ca32.png)

従来のテキストと画像を入力とした動画生成手法(TI2V)と比較して、より高品質な動画を生成することができている。特に、ファインチューニングなしで様々なテキストと画像の組み合わせに対して高品質な動画を生成する汎用性を備えている。
動画の穴埋めや次のフレームの予測といった、他の動画生成タスクに対しても応用できることが分かった。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Ni_TI2V-Zero_Zero-Shot_Image_Conditioning_for_Text-to-Video_Diffusion_Models_CVPR_2024_paper.pdf>

last updates: June. 18 2024
コーディングのお作法

# はじめに

コーディングにおいては、コードの理解しやすさと保守性を重視することが重要です。

今回はコードの品質を高めるための基本的なコーディングのお作法を説明します。

以下のポイントに従うことで、他の開発者や新規参入メンバーにも分かりやすいコードを書くことができます。

## 1. 短さより理解のしやすさを優先する

コードは短さよりも理解しやすさを優先しましょう。読みやすく、意図が明確なコードが最も重要です。短いコードが必ずしも良いコードではなく、他の開発者が簡単に理解できるコードが最良です。

### コード例

```python
# 悪い例
def f(x): return x**2 + 2*x + 1

# 良い例
def calculate_quadratic(x):
    return x**2 + 2*x + 1
```

## 2. 名前は短いコメントとして扱う
変数や関数の名前は、短いコメントとして扱うべきです。名前を見ただけで、その変数や関数が何をするのか、どんな役割を持っているのかが分かるようにしましょう。

### コード例
```python
# 悪い例
def calc(x): return x * 0.5

# 良い例
def calculate_discount(price): return price * 0.5
```

## 3. イテレータに関してはiなど意味のない文字でも構わない
ループのイテレータに関しては、iやjなどの短い名前を使うことが許容されます。
なぜなら、イテレータはそのループ内でのみ使用される変数だからです。

### コード例
```python
# ループのイテレータに対しては短い名前でも可
for i in range(10):
    print(i)
```

## 4. 時間など単位があればそれを名前につける
変数や関数の名前に時間や単位を含めることで、何を表しているのかがより明確になります。

### コード例
```python
# 良い例
def calculate_hours_worked(start_time, end_time):
    return (end_time - start_time).total_seconds() / 3600
```

## 5. 新規参入メンバーが見て分からない省略は使わない
新規参入メンバーが理解できない省略語や略語は避けるべきです。コードが他の開発者にとっても理解しやすいものであるべきです。

### コード例
```python
# 悪い例
def calc_sp_data(data):
    # SalesPartnerの略称が含まれている
    pass

# 良い例
def calculate_sales_partner_data(data):
    # 読みやすく、略語なし
    pass
```

## 6. 名前のフォーマット
アンダースコアが付いている名前はメンバ変数を示します。

### コード例
```python
class User:
    def __init__(self, name, age):
        self._name = name  # メンバ変数
        self._age = age    # メンバ変数
```

## 7. 誤解されない名前にする
変数や関数の名前は、その役割や機能が明確であるべきです。filterのように広く使われる名前は、具体的な意図を伝える名前にすることが重要です。

### コード例
```python
# 悪い例
def filter(data):
    # 何をフィルタリングしているのか不明瞭
    pass

# 良い例
def filter_even_numbers(numbers):
    # 具体的な意図が明確
    return [num for num in numbers if num % 2 == 0]
```

## 8. ブール値はis, has, can, shouldを使う
ブール値の変数名や関数名は、is, has, can, shouldなどを使用して、その値が意味する状態を明確にすることが重要です。

### コード例
```python
# 良い例
def is_valid_user(user):
    return user is not None and user.age > 18

def has_access(user):
    return user.role == 'admin'
```

## 9. 否定形は紛らわしいので使わない
否定形の名前は誤解を招く可能性があるため、避けるべきです。肯定形の名前を使用することで、コードがより直感的になります。

### コード例
```python
# 悪い例
def is_not_active(user):
    return not user.is_active

# 良い例
def is_inactive(user):
    return not user.is_active
```

## まとめ
今回はPythonコードを例にコーディングのお作法について紹介しました。

短さよりも理解のしやすさを優先し、明確な命名規則を守ることで、他の開発者にも理解しやすいコードを書くことができます。

またこれらをコーディング規約としてチームメンバー内で共有することでより高品質なコードを書くことにつながります。ぜひ実践してみてください。
Salesforce記録⑥:salesforceフローでメール送信する2つの方法について(202406)

#### 方法①:メールアラートを使ってフローからメール送信する

1.メールテンプレートを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/8f801ef3-24e1-0149-a289-8ba2bb8d0d57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/24b4d3c6-f079-363b-82e5-066a09fcf2d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/7c72d34e-6495-2546-59ca-1c98d8895b01.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/1680185e-a004-e7da-1bbc-134a84276dee.png)
Classic メールテンプレート　で「新規テンプレート」を作成します。textとhtmlがあります。
取引先を差し込まれるシンプルなメールテンプレートを作成し保存します。

2．メールテンプレートを使用してメールアラートを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/6c6e0df2-26c0-549c-11fc-af010b292940.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/74ce5666-b81a-fbbd-f015-3fca61275e9e.png)

3.フローでメールアラートを呼び出す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/72d1ecc9-60a1-7f2b-85e9-23004118bd7a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/149dae25-a5ae-6ae9-e467-8cc669f0c160.png)

Action node 追加しでも問題なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/75b434b4-23e0-db16-e660-b92f15cbba00.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/27037e93-451a-da30-3dcc-64a55e026af4.png)

#### 方法➁:メールアラートを使わずフローから送信する

1．開始要素を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/fe934f3d-a408-7f11-0835-1577e0529778.png)

2．アクション要素でメールカテゴリの”メールを送信”アクションを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/1a263193-ffaa-e042-c6bf-d8a6b88f7eac.png)

3．テキストテンプレート作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/5912ce33-967a-ef34-f543-4359c4a6dd31.png)

4．”メールを送信”アクションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/9b55f133-1676-df56-0f24-fc83d0ccae7a.png)

レコード取得の元素も追加できる,他のオブジェクトレコード取得ができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/11e7f55b-a2d5-a1a3-f6d7-2e8c2b049af3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/05dfdcde-c919-9ae2-7cb1-95ecde519234.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/5331f87b-dbee-2d2c-492d-b418b8d07939.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/2ed2de1c-7c8a-018b-c5e2-5d80d2e8579d.png)
Unity databaseを使う

## databaseとは
たくさんの同じ属性をもつ物を管理する方法

## やり方
databaseはScriptableObjectを利用します。ScriptableObjectについては詳しくは別の記事を参照。

まずはスクリプトを２つ作る。
同じ属性を表すスクリプトと
それを格納するデータベース用のスクリプト

具体的にはやさいと、野菜を格納する野菜入れを１つずつ作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/f2939ad7-95ec-c11b-586e-7d4cf7652fc5.png)


```
using UnityEngine;

//やさい
[CreateAssetMenu(fileName = "NewVegetable", menuName = "Vegetable Database/Vegetable", order = 1)]
public class Vegetable : ScriptableObject
{
    public int id;
    public string vegetableName;
    public float price;
}

```

```
using System.Collections.Generic;
using UnityEngine;

//やさい入れ
[CreateAssetMenu(fileName = "VegetableDatabase", menuName = "Vegetable Database/Database", order = 2)]
public class VegetableDatabase : ScriptableObject
{
    public List<Vegetable> vegetables;

    public Vegetable GetVegetableById(int id)
    {
        foreach (Vegetable vegetable in vegetables)
        {
            if (vegetable.id == id)
            {
                return vegetable;
            }
        }
        Debug.LogWarning("Vegetable with ID " + id + " not found.");
        return null;
    }
}

```
やさい入れにはidで検索できるメソッドも追加。
これで準備OK
ScritableObjectを右クリックから作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/fd05368c-8f18-ee08-0fdf-a9df5cfba305.png)

![database1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4c011335-5d37-a0f4-c67a-23e45d7a2468.gif)

野菜入れにトマトを格納。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/94dfaaa9-8c1d-5ccb-e57d-eb9395a5a66f.png)
トマトの値を設定
追加でリンゴも設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/b22f800a-5d57-f4f4-3e67-9431f1894315.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/264bace9-7bf0-07ba-10af-ebf80886e9e9.png)



## 使用方法

```
using UnityEngine;

public class VegetableManager : MonoBehaviour
{
    public VegetableDatabase vegetableDatabase;

    void Start()
    {
        int searchId = 1; // 検索するIDを指定
        Vegetable foundVegetable = vegetableDatabase.GetVegetableById(searchId);

        if (foundVegetable != null)
        {
            Debug.Log("Vegetable Name: " + foundVegetable.vegetableName);
            Debug.Log("Price: " + foundVegetable.price);
        }
    }
}

```

空のオブジェクト作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/f01511f5-3b5a-f2a7-e21e-86ae0c9d68d5.png)
VegetableManagerをアタッチ
野菜入れも追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/10663162-c14a-ebf8-9870-4da10e5bcbc1.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/7ad84d67-4753-04b9-9267-377a2f9aaddb.png)


検索するidをもとにListを検索、出力できる。


## 参考サイト
https://www.youtube.com/watch?v=YQDdCamCJmQ
【学習記録　2024-08-07】　JavaScript

## 使用教材
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：1h
- 配列の主な生成方法
- スプレッド構文を使った配列の展開方法
- prototypeの復習
#### 学習メモ
new演算子を使う。あくまでもメソッドなので疎な配列は定義することができない。

数字を一つだけ引数に取った場合、その値は**lengthプロパティに代入され値はemptyになる**。

new演算子を使わなくても同じ挙動になる。

Arrayのstaticメソッドである.of()を使用した場合、引数に数字一つだけを入れてもemptyは生成されずプロパティをして認識される。
```diff_javascript
const fruits = new Array("apple", "banana", "grape");

const fruits = new Array(5); // length: 5

const fruits = Array.of(5); // [5]
```
配列はスプレット構文を使用し配列の中に配列を定義したり、引数として受け取るあるいは渡すことができる。
```diff_javascript
let sum = (...nums) => {
		// [1,2,3,4,5,6,7,8,9]
		console.log(nums);
}
let nums = [1, 2, 3, 4];
sum(...nums, 5, ...[6, 7, 8, 9]);
```

## 所感
　配列の定義方法は角括弧で囲む方法しか知らなかったので勉強になりました！
　スプレッド構文も曖昧な理解だったので復習がてら動作原理も理解することができました😊
 　prototypeは全然理解が追いついていないので通退勤の間に少しずつ復習していきます笑
SIRA: Scalable Inter-frame Relation and Association for Radar Perception

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e07c7dec-7856-9ebc-4156-4e00dd8e96ed.png)

レーダーは電波を用いて物体との距離や速度を計測するセンサーで悪天候でも対象までの距離を測ることができるため車載用途でよく用いられる。従来のレーダーによる特徴抽出は、物体を識別できる最小距離(空間分解能)の低さやノイズ、電波を飛ばして受信機に届くまでに周囲の地形や建物で反射してしまうマルチパス反射や実際には存在しないターゲットを表示してしまう問題があった。

この研究では、まず、Swin Transformer(ICCV2021)を応用して時間的に再編成されたウィンドウアテンションを用いて、時間関係を捉えた特徴表現を学習する。次に、観測したレーダーデータから物体の動きの滑らかさを考慮した擬似的な物体軌道を生成し時間方向で一貫性を持たせる。これによって、従来は解決が難しかったレーダーを用いた物体検出と物体追跡を可能にした。

---

# 2. 新規性
- 時間方向への特徴量のアライメント：Swin Transformerの考え方を応用し、複数フレーム間の時間的な関係性を考慮することでより長期的な情報を使えるようにした。
- 物体の移動経路の予測：擬似的な軌道を用いて物体の動きの滑らかさを考慮してより正確な物体追跡を実現した。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/fed55ab8-c5c7-0d51-ac4b-666ae0f1920e.png)

提案手法はETRとMCTrackの2つのモジュールから構成されている。

1. ETR(Extended Temporal Relation): 計算効率を維持しながら、時間的に変化するレーダー信号から一貫性のある特徴表現を抽出する
2. MCTrack(Motion Consistency Track): 物体の動きの滑らかさを考慮することで、より正確な物体追跡を可能にする

まず、連続する複数のフレームのレーダー信号を入力とする。各フレームから特徴抽出器によって特徴量を抽出し、ETRモジュールで複数のフレームの特徴量を入力として受け取り、時間的な整合性を考慮した特徴表現を出力する。MCTrackモジュールでは、ETRモジュールから出力される時間整合の取れた特徴表現を入力として受け取り、疑似的な方向を推定したり擬似的な物体の軌道を生成したりする。物体検出ロスと擬似方向ロスを用いることで、物体検出と物体追跡の性能を向上させるようにモデルを学習させる。

ETRの内部では各フレームはサブフレームパッチに分割され、変形可能な時間順序に従って新しいウィンドウに再編成される。次に、スケーラブルなウィンドウ幅でアテンションをかけるために、マスク化したマルチヘッドクロスアテンション(MCA)をかける。これによって、計算量を抑えつつ異なる時間ウィンドウ間でアテンションをかけて情報交換できるようにしている。(Swin Transformerベース)

MCTrackのデコーダー部(DEst)では、2枚のフレームを使って疑似的な物体の進行方向を予測する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/47b1c6e2-1644-0572-575f-990ca50caab9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/648ed002-c093-972b-d1f4-20af8b9ab52f.png)

提案手法では、Radiateデータセットにおいて指向性物体検出タスクで58.11mAP@0.5、多重物体追跡で47.79MOTAを達成しており、従来手法よりもそれぞれ+4.11mAP@0.5、+9.94MOTA性能向上させた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/341a611b-8c1c-f4f6-d24b-a585c0c7c2a5.png)

提案手法では、時系列に沿った物体の軌跡まで考慮して物体検知と追跡を実現できており、ノイズが多く分類が難しいレーダー画像に対して高い精度を達成している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Yataka_SIRA_Scalable_Inter-frame_Relation_and_Association_for_Radar_Perception_CVPR_2024_paper.pdf>

last updates: June. 18 2024
Reactで、モーダル画面時に背景スクロールを防止する

## 概要
Reactの環境下でモーダル画面を表示している状況で背景がスクロールすることを防止する方法です。

## コード
`document.body`のスクロールを防止するのが簡単そうです。

``` js
// 背景スクロールを防止する。
useEffect(() => {
    // マウント時に背景スクロールを防止
    document.body.style.overflow = 'hidden';
    return () => {
        // アンマウント時にスクロール可能に戻す
        document.body.style.overflow = 'auto';
    };
}, []);
```
RILA: Reflective and Imaginative Language Agent for Zero-Shot Semantic Audio-Visual Navigation

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5a634c5a-50d4-11ca-5a42-39baa076985a.png)

この研究では大規模言語モデル(LLM)を用いて、訓練データを全く使用せず未知の環境でも音声情報と視覚情報に基づいて、目的地への経路を探索するゼロショットナビゲーションシステムを提案している。

従来の音声情報と視覚情報を利用したナビゲーションシステムは、強化学習に大量の訓練データが必要であったが成功率が低く、汎用性に欠けるという問題があった。特に、音声信号は断続的な情報となるため、目的地の特定など目標に関する情報を推測することが困難だった。

提案手法ではこれらの課題に対処するため、マルチモーダルモデルを用いて感性データを扱えるようにしており、LLMベースで最適なルート探索を自ら提案・評価・棄却させる。さらに、部屋のレイアウト情報をマッピングすることで、環境を理解してより正確にナビゲーションできる手法を提案している。提案手法は、対象となる部屋や環境に関する学習を必要とせず補足情報などの意味情報を加えることなく、ゼロショットで従来手法を上回る手法を達成している。また、LLMベースのアーキテクチャを採用しているため、自身の行動の理由を自然言語で説明させることができる。

---

# 2. 新規性
- ゼロショットで音声情報と視覚情報を理解する：
従来の強化学習ベースの手法と異なり大量の訓練データを必要とせずに、未知の環境に対しても高い汎用性を持つナビゲーションを実現した。
- 反復的に提案・評価・棄却をLLMに実施させる：
LLMをエージェントとして用いて、生成した提案文書の正確性を自ら評価し、不正確な場合はそれを棄却させることで、より正確な環境理解と行動の決定を行えるようにしている。
- マルチモーダル生成AIに環境を理解させる：
部屋のレイアウト情報と説明文書を入力として与えることで、ナビゲーション能力を向上させている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e22d1197-fd4f-5e7a-5e7b-8475ecf73437.png)

提案手法はカメラやマイクなどのセンサーから得られた視覚情報と音声情報をマルチモーダルモデルを用いて処理している。
生成AIをエージェントとして利用するにあたって、3つのコンポーネントを手案している。

1. Perception Module：
センサー情報を入力をテキストベースの説明に変換
2. Imaginative Assistant：
オフィス全体の視覚情報を分析し、全体的な視点から補助情報を言語情報に反映させる。
3. Reflective Planner：
上記2つのコンポーネントを統合して、自分のルート提案を評価させ目標位置を決定し、ロボットへの行動を決定する。再評価を繰り返すことで、自身の提案の信頼性を自ら評価させ、より正確なルーティングを実現する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e144a95f-d984-a5c2-0ce0-2ec9af080985.png)

環境に関する事前知識や訓練データを必要とせず、ゼロショットでナビゲーションタスクを実行できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9eb99b05-e9de-0d37-b38b-fd4f29f2b25e.png)

提案手法では、従来のの音声と視覚情報を用いた手法と比較して、未知の環境においても高い成功率と効率性で目標位置に到達できている。
また、LLMベースのアーキテクチャを採用しているため、提案手法では自身の行動の理由を自然言語で説明することができるようになった。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Yang_RILA_Reflective_and_Imaginative_Language_Agent_for_Zero-Shot_Semantic_Audio-Visual_CVPR_2024_paper.pdf>

last updates: June. 18 2024
【Vue3】Vuetifyのv-text-fieldでclearを押された時にメソッドを呼び出したい

## 概要
Vuetifyでは、テキストボックスのコンポーネントとして`v-text-field`が用意されています。
機能として中身をclearできる機能が用意されているのですが、このclearが押された時に別途メソッドを呼び出す際のメモです。

## 前提
* 使用したVuetifyのバージョンは`3.6.11`です。

## 対応方法
v-text-fieldのドキュメント[Clearable](https://vuetifyjs.com/en/components/text-fields/#clearable)の項にある通り、
`@click:clear="onClear"`のような形式で設定すれば実現できます。

## 実装サンプル
以下のイメージでclearの×ボタンが押された時に、`onClickClear`のメソッドが呼び出されます。
メソッドはv-modelに設定された値が、空の状態になった後に実行されます。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/1936b90d-d218-ed28-ea12-f6e3587ecc55.png" />


```vue
<template>
    <v-text-field width="200px" v-model="placeName" clearable @click:clear="onClickClear">
        <template v-slot:label>
            場所名
        </template>
    </v-text-field>
</template>
```
【Javascript】call, apply, bindの違いを図解で解説する

# はじめに

Javascriptの勉強をしている中で、call,apply,bindの違いについて学びがあったので、図解を交えてご紹介できればと思います。

# call, apply, bindの違い

### 全体観

call, apply, bindの違いの全体観は下記の通りです。
具体的な内容はソースコードの欄にて補足します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/674c7d02-f691-8d96-d8cf-218b07cfa59c.png" width="500">

### ソースコード

call, apply, bindともに第一引数には`this`にあたるオブジェクトが入り、第二引数以降には関数のパラメータ分が入ります。それぞれ下記のような特徴があります。

- call：引数をそのまま設定する
- apply：関数のパラメータ部分を配列化して設定する
- bind：引数を一部固定して変数化したのち、残りの引数を設定する

```js
const obj = { num: 1 }
const addCalc = function(num1, num2) {
  return this.num + num1 + num2;
}

// callメソッド
addCalc.call(obj, 2, 3); // 「6」が出力

// applyメソッド
addCalc.apply(obj, [2, 3]); // 「6」が出力

// bindメソッド
const calcBind = addCalc.bind(obj);
console.log(calcBind(2,3)); // 「6」が出力
```

皆さんのお役に立てれば幸いです！
初めてのネットワーク機器設定

## 初めてのネットワーク機器設定


## 0. 始めた経緯
### やってみようと思った経緯は、ざっとこんな感じ。
- お家k8sの構成を冗長化
  
- ロードバランサの設定

<br>

## 1. 利用する機器
### 今回利用する機器は、ざっとこんな感じです。
スイッチ：Ubiquiti Networks社のEdgeRouer X<br>
ローカルPC：MacBook pro M2

## 2. EdgeRouter Xの初期設定
### 2.1 Macbook proの設定
- Macbook proのネットワーク設定を変更する
  - IPアドレスの設定<br>
    ①システム設計の画面から、ネットワーク設定を開きます。<br>
    ②[USB 10/100/1000 LAN]という項目があるので、[詳細]ボタンをクリックします。<br>
    ③以下の画面が表示されるので、[TCP/IP]をクリックします。<br>
    ④[IPv4構成]を[手動]に変更します。<br>
    ⑤[IPアドレス]に[192.168.1.2]に変更し、[サブネットマスク]を[255.255.255.0]に変更します。<br>
    ⑥[ルーター]に、[192.168.1.1]を設定します。<br>
    ⑦[OK]ボタンをクリックします。<br>

### 2.2 EdgeRouter Xの設定
- eh0にLANケーブルを指し、Macbook proを接続する。
- Macbook proから、Chromeを開き、http://192.168.1.1を入力し、EdgeRouter Xの設定画面にアクセスする。

- ログイン画面が表示されるので、ユーザ名とパスワードを入力します。
  - ユーザ名：ubnt
  - パスワード：ubnt

- ログイン後、以下の画面が表示されるので、[Basic Setup]をクリックします。
- 以下の画面が表示されるので、１つずつ設定していきます。
    - [Internet port(eth0 or eth5/SFP)]の項目。<br>
     ここではEdegeRouter Xのインターネットポートに接続されているLANケーブルを指します。<br>
        - [Internet port(eth0 or eth5/SFP)]の項目には、[eth0]を選択します。
        - [Internet connection type]の項目は[DHCP]を選択します。
        - [VLAN]と[DHCPv6 PD]の項目は、チェックをOFFにします。
        - [IPv4 Firewall]と[IPv6 Firewall]の項目は、チェックをONにします。
    - [DNS fowarding]の項目。
        - [DNS servers]に[Use servers provided by the Internet Service Provider]を選択します。
    - [One LAN]の項目にある[Only one LAN]のチェックボックスをONにします。
    これは、eth0〜eth4のポートが、switch0として内蔵ハードウェア処理のスイッチングハブとなり、LAN側のネットワークは、192,168,1,0/24の1種類だけとなります。
    - [LAN port(eth1, eth2, eth3, eth4)]の項目。
        - [Address]に[192.168.1.1/255.255.255.0]を入力します。<br>
        ここ基本的にデフォルトのままとなります。
        - [DHCP]には、[Enable the DHCP server]のチェックボックスをONにします。
    -[User setup]の項目。
        -[User]は、[Create new admin user]を選択し、新しいユーザ名とパスワードを入力します<br>
        ここで新しいユーザを作成した場合、ubntユーザは削除されます。
    - 設定の保存
        - すべての設定が完了したら、[Apply]ボタンをクリックして設定を保存します。
        - Applyボタンをクリックすると、設定が保存され、EdgeRouter Xが再起動します。

- 再起動が完了したら、EdgeRouter Xの設定は完了です。

- EdgeRouter Xの設定が完了したら、Macbook proのネットワーク設定を元に戻します。
    - Macbook proのネットワーク設定を変更する
        - IPアドレスの設定
            ①システム環境設定の画面から、ネットワーク設定を開きます。
            ②[USB 10/100/1000 LAN]という項目があるので、[詳細]ボタンをクリックします。
            ③以下の画面が表示されるので、[TCP/IP]をクリックします。
            ④[IPv4構成]を[自動]に変更します。
            ⑤[OK]ボタンをクリックします。

- 最後に、Edgerouter Xに接続されているeth0のLANをeth1〜eth4のいずれかに差し替え、インターネッツに接続しているLANケーブルをeth0（初期設定で、WANポートに設定した）に接続します。
- 適当なサイトにアクセスし、接続ができれば、設定は完了です。

<br>

## 参考にしたサイト
https://minami.me/diary/334

https://yabe.jp/gadgets/edgerouter-x/
Python 辞書のget()メソッド、使いこなしていますか？3つの隠れた使い方

## はじめに

こんにちは！Pythonプログラマーの皆さん。今回は、よく使われる辞書（dict）のget()メソッドについて、あまり知られていない使い方を3つご紹介します。get()メソッドは単純そうで奥が深い、とても便利なメソッドです。早速、隠れた使い方を見ていきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0dfcd46f-d8fd-c306-e638-493957d3f803.png)

## 1. デフォルト値としての関数

get()メソッドの第2引数には、キーが存在しない場合のデフォルト値を指定できます。実は、この引数には関数を渡すこともできるんです！

```python
def generate_default():
    return "Generated default value"

my_dict = {"a": 1, "b": 2}
value = my_dict.get("c", generate_default)
print(value())  # 出力: Generated default value

# 既存のキーにアクセスする場合
print(my_dict.get("a", generate_default))  # 出力: 1
```

実行結果：
```
Generated default value
1
```

この方法を使えば、キーが存在しない場合にのみ実行される処理を簡単に記述できます。例えば、デフォルト値の生成に時間がかかる場合や、副作用のある処理を行う場合に便利です。

## 2. 条件分岐の簡略化

get()メソッドを使って、条件分岐を簡略化することができます。特に、複数の条件がある場合に有効です。

```python
def process_a():
    return "Processing A"

def process_b():
    return "Processing B"

def process_default():
    return "Processing Default"

actions = ["b", "a", "c"]
for action in actions:
    result = {
        "a": process_a,
        "b": process_b
    }.get(action, process_default)()
    print(f"Action {action}: {result}")
```

実行結果：
```
Action b: Processing B
Action a: Processing A
Action c: Processing Default
```

この方法を使えば、if-elif-else文の連鎖を避けることができ、コードがすっきりします。

## 3. ネストした辞書の安全なアクセス

get()メソッドを連鎖させることで、ネストした辞書に安全にアクセスできます。

```python
nested_dict = {
    "level1": {
        "level2": {
            "level3": "Deep value"
        }
    }
}

# 安全なアクセス
value = nested_dict.get("level1", {}).get("level2", {}).get("level3", "Not found")
print(value)  # 出力: Deep value

# 存在しないキーへのアクセス
value = nested_dict.get("level1", {}).get("nonexistent", {}).get("level3", "Not found")
print(value)  # 出力: Not found

# 途中で辞書でない値が返された場合
value = nested_dict.get("level1", {}).get("level2", "Not a dict").get("level3", "Not found")
print(value)  # 出力: Not found
```

実行結果：
```
Deep value
Not found
Not found
```

この方法を使えば、KeyErrorを心配することなく、深くネストした辞書の値にアクセスできます。

## 公式ドキュメントと参考情報

Pythonの公式ドキュメントでは、dict.get()メソッドについて以下のように説明されています：

> dict.get(key[, default])
> 
> キーが辞書にある場合はその値を返し、そうでない場合はデフォルトを返します。デフォルトが与えられておらず、キーが辞書に存在しない場合は None を返します。

詳細は[Pythonの公式ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#dict.get)をご覧ください。

また、PEP 8（Pythonのスタイルガイド）では、辞書のキーにアクセスする際のベストプラクティスについて言及しています。get()メソッドの使用は、特にキーが存在しない可能性がある場合に推奨されています。詳しくは[PEP 8のドキュメント](https://pep8-ja.readthedocs.io/ja/latest/)を参照してください。

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/44248bbc-368b-be12-93fb-d0eaf6572068.png)

いかがでしたか？get()メソッドの隠れた使い方を3つ紹介しました。

1. デフォルト値として関数を使用
2. 条件分岐の簡略化
3. ネストした辞書の安全なアクセス

これらのテクニックを使いこなすことで、よりPythonic（Pythonらしい）で効率的なコードが書けるようになります。ぜひ、実際のコードで試してみてください！
【ClickHouse】サーバー間のデータ通信におけるデータの圧縮について

# はじめに

ClickHouseにはClickHouse間でデータをコピーしたり、リモートのClickHouseのデータをセレクトできる`remote`と呼ばれる機能があります。

https://clickhouse.com/docs/en/sql-reference/table-functions/remote

この`remote`でClickHouse間を通信する際に、データの圧縮が行われているのか気になったのが今回の検証の動機です。

# 結論

サーバー間での通信に使用されるデータ圧縮は、デフォルトではLZ4で`network_compression_method`でセッティングできる。

https://clickhouse.com/docs/en/operations/settings/settings#network_compression_method

例えば、圧縮アルゴリズムをZSTDにしたい場合は以下のように設定する。

```
set network_compression_method='ZSTD'
```

zstdが指定されている場合、`network_zstd_compression_level`で圧縮レベルを指定できる。

# 検証

## LZ4の場合（デフォルト）

### 圧縮方法の確認

```sql
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
```
```
┌─name───────────────────────┬─value─┐
│ network_compression_method │ LZ4   │
└────────────────────────────┴───────┘
```

### クエリ実行

```sql
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
```

```
0 rows in set. Elapsed: 0.032 sec. Processed 10.01 million rows, 80.06 MB (312.97 million rows/s., 2.50 GB/s.)
```

`numbers_mt` については以下を参照。

https://clickhouse.com/docs/en/operations/system-tables/numbers_mt

## ZSTDの場合

### 圧縮方法の確認

```sql
set network_compression_method='ZSTD';
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
```
```
┌─name───────────────────────┬─value─┐
│ network_compression_method │ ZSTD  │
└────────────────────────────┴───────┘
```

### クエリ実行

```sql
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
```

```
0 rows in set. Elapsed: 0.016 sec. Processed 10.01 million rows, 80.06 MB (639.86 million rows/s., 5.12 GB/s.)
```

## 圧縮設定をしない場合

### 圧縮方法の確認

```sql
set network_compression_method='none';
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
```
```
┌─name───────────────────────┬─value─┐
│ network_compression_method │ none  │
└────────────────────────────┴───────┘
```

### クエリ実行

```sql
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
```

```
0 rows in set. Elapsed: 0.091 sec. Processed 10.01 million rows, 80.06 MB (109.75 million rows/s., 877.98 MB/s.)
```



## 結果

それぞれの圧縮が効いていそうなことが分かりました。

| 圧縮方法 | パフォーマンス |
| ---- | ---- |
| LZ4（デフォルト） | 312.97 million rows/s., 2.50 GB/s. |
| ZSTD | 639.86 million rows/s., 5.12 GB/s. |
| 圧縮なし | 109.75 million rows/s., 877.98 MB/s. |

# 参考

https://github.com/ClickHouse/ClickHouse/issues/67878
[Informatica][IDMC][CDIR/MI]CDIRF(MIF)研究 - フォルダ階層構造を維持する？非階層化する？

## はじめに
Informatica Intelligent Data Management Cloud(IDMC/旧称IICS)でのちょっとしたTipsを纏めていきます。日々の活動の中で検証した結果記録であり、忘れやすい自分のためのメモですが、少しでも皆様のお役に立てればと思い公開していきます。記述方法など試行錯誤しており随時更新するかもしれません。

## この記事のゴール：IDMC CDIR/MI Files を利用時、フォルダ階層構造を維持したままレプリケーションする方法と、非階層化してレプリケーションする方法を理解する

旧マスインジェスチョン->新 Cloud Data Ingestion and Replicationを研究した記事となります。
※この(2024年)7月のメジャーリリースから名称が変更となりました。 
CDIRFはあらゆるファイルのレプリケーション・コピーを行う連携処理を素早く簡単に実装出来ますが、特にフォルダ構成が複雑な階層化になっている場合にどうやって処理されるの？というご質問が御座いましたので、検証してみました。

### 具体的には
以下のようなフォルダ階層にて保存されているファイルをCDIRFでレプリケーション処理した場合、どのようにターゲット側に配置されるのかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/47125ee8-6b5e-e6c2-fd49-f58fa22d5051.png)

今回は、ソース・ターゲットともSecureAgent上のローカルフォルダを指定する形で検証しています。もちろん、ソースフォルダとターゲットフォルダは別のものを指定し、どのようにターゲット側フォルダに配置されるかを確認しています。

#### ソース側の設定
主な設定：
- ”ソースディレクトリ”に「C:\INFA\infa_shared\mif_source」を指定
- ”サブフォルダのファイルを含む”を有効化
- ”ファイルパターン”に「*.pdf」を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/102d2697-db9f-80f5-bfde-1a67a6b03fff.png)

#### ターゲット側の設定
主な設定：
- ”ターゲットディレクトリ”に「C:\INFA\infa_shared\mif_target」を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/cb7df4cb-f8d9-873d-9a23-e4a86ad58b97.png)


#### 結果
デフォルトでは、階層構造を維持したフォルダ構成で対象となるファイルがコピーされます。
ただし、対象のファイルが存在しないフォルダはコピーされません。
今回の場合以下のとおり、｢1-B｣と｢2-B｣フォルダ配下にはコピー対象となるpdfファイルが存在しないため、フォルダ自身コピーされません。
こちらは大凡想定通りの動作となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/9d7a8b20-27fb-fca3-63db-92f2eeea6336.png)

#### ファイルだけをコピーしたい！フォルダの階層構造は不要という場合
フォルダ階層構造を除外してファイルだけを1つのフォルダに集約させたい、という場合もあると思います。その場合は「④ アクション」でファイル操作を指定する事で実現出来ます。

- ④ アクション で ファイル操作 -> 非階層化 を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/201fefdb-394e-cef9-62f8-16a0e13c619c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/97ae09e4-181b-c596-e7fb-72813deabbd2.png)

上記設定を行って同様に実行してみると、以下のように ターゲットフォルダ直下に対象ファイルのみをコピーする事が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/e6d4c7c2-145d-e0ec-7079-442693bf61e9.png)

## まとめ
IDMC CDIR/MI Files は動画や音声等のバイナリファイルでもレプリカ・コピーが出来る大変便利な機能で、是非ご活用頂きたいと思います。疑問点など御座いましたらコメント頂ければと存じます。

###### 検索用
Informatica / IDMC / Intelligent Data Management Cloud / IICS / Data Integration / CDI / CMI / CDIR / Mass Ingestion / CDQ / CDP / Profiling / CDGC / CDMP / CLAIRE / AI / SecureAgent / ランタイム
AzurePipelines: npm install で、npm error code ECONNRESET が出たときの対処法？

# 背景

Pipelines で e2e テスト実装した際に、npm install でたまにエラーになることがあった。
その際の対処法の記録

## 実際のエラー

Acquire の 設定漏れ？とか思っちゃうようなエラーだけど、
Resubmit を何回かすると解消しちゃう。

Pipelines の VM としては特に設定しなくても動くけど、ごくまれに失敗する。
ってことで、設定ではない、と思うんだけど、よくわからず・・

```bash: error
npm error code ECONNRESET
npm error errno ECONNRESET
npm error network Invalid response body while trying to fetch https://registry.npmjs.org/@fluentui%2freact-popover: aborted
npm error network This is a problem related to network connectivity.
npm error network In most cases you are behind a proxy or have bad network settings.
npm error network
npm error network If you are behind a proxy, please make sure that the
npm error network 'proxy' config is set properly.  See: 'npm help config'
```

# 結論

bash で npm install をするのではなく、
task として用意されている npm を使う


```bash: script でやってた方法
- script: |
  cd ./app/frontend
  npm install
  npm run build
　　 displayName: 'build frontend'
```

```bash: 専用 task を利用する
- task: Npm@1
  inputs:
    command: 'install'
    workingDir: '$(System.DefaultWorkingDirectory)/app/frontend'
    verbose: true
  displayName: 'npm install'

- task: Npm@1
  inputs:
    command: 'custom'
    workingDir: '$(System.DefaultWorkingDirectory)/app/frontend'
    customCommand: 'run build'
  displayName: 'npm run build'
```

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/npm-v1?view=azure-pipelines&viewFallbackFrom=azure-devops

# エラー記録
## npm error code ENOENT は、workingDir が未設定

```bash: フォルダ未設定エラー
npm error code ENOENT
npm error syscall open
npm error path /home/vsts/work/1/s/package.json
npm error errno -2
npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open '/home/vsts/work/1/s/package.json'
npm error enoent This is related to npm not being able to find a file.
npm error enoent
```


# あとがき

現状、これで再発してない・・けど、どうなんでしょうね・・