OmniAICreator/Qiita-1.07M huggingface dataset:
Github action実行時、 ”unexpected status from HEAD request to <url> 403 Forbidden”エラーの解決

# 状況

- AWS ECRにGithub actionで作成したDockerイメージをpushしようとしている
- docker buildxを使用している
- ローカルからのdocker pushは成功している

# 解決策

Pushに使用しているAWSロールのポリシーに`ecr:BatchGetImage`を追加する
```yaml
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": "ecr:GetAuthorizationToken",
			"Effect": "Allow",
			"Resource": "*"
		},
		{
			"Action": [
				"ecr:UploadLayerPart",
				"ecr:PutImage",
				"ecr:InitiateLayerUpload",
				"ecr:CompleteLayerUpload",
				"ecr:BatchCheckLayerAvailability",
				"ecr:BatchGetImage" # 追加
			],
			"Effect": "Allow",
			"Resource": "arn:aws:ecr:YOUR_ACCOUNT:repository/*"
		}
	]
}
```

# 理由

Github Actionの定義は以下のようになっているかと思います

docker buildxを使用するとき、docker buildx —push …と言うコマンドを実行しているのですが、そこで追加のAWS ECRパーミッションを必要としてしまっているみたいです。

```yaml
name: ecr push image

on:
  push:
    branches:
      - main

jobs:
  push-image-to-ecr:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ${{ secrets.AWS_REGION }}
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}

      - name: Login to Amazon ECR
        uses: aws-actions/amazon-ecr-login@v2
        id: login-ecr

      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v3

     ~~~~~省略~~~~~

      - name: docker build and push ECR
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/arm64 # アーキテクチャを指定
          file: ./dockerfile
          push: true
          provenance: false
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha # GithubActionsのCacheを使うという設定
          cache-to: type=gha,mode=max
```

# 参考記事
https://github.com/docker/build-push-action/discussions/983


:::note info
弊社Passinate Geniusでは一緒に働く仲間を募集しています！興味をお持ちいただける方は、[ホームページ](https://passionategenius.com/)まで！
:::


役に立った場合は、励みになるのでいいねとコメントよろしくお願いします！
【Python】MongoEngineで複数ドキュメントに対してupdateを行う

## 概要
PythonのMongoDB用ライブラリ`MongoEngine`は[MongoEngineでMongoDBを触ってみる基礎編](https://qiita.com/key/items/b3894c64161a02d10649#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E6%9B%B4%E6%96%B0)の記事で概要が紹介されている通り、DjangoのORMに近い感じでMongoDBの操作が行えるものになります。
今回はMongoEngineで、複数ドキュメントに対してupdateを行う方法を紹介します。

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

## 実装方針
[Mongoengine : How to update specific fields of an existing document?](https://stackoverflow.com/a/51313840)のstackoverflowの記事で紹介されている回答で、`objects`のメソッドに条件を指定して`update`のメソッドにて更新内容を設定する実装が良いかなと感じました。

## 実装サンプル
以下の実装サンプルは`PostCategory`というコレクションに対して、　指定したidで`parent_category_id`の設定があるドキュメントを全て当該フィールドをnullにするというものです。

```python
PostCategory.objects(parent_category_id=category_id).update(parent_category_id=None)
```
StreamAPI

### ■StreamAPIのお約束
・streamAPIはCollectionインターフェースで定義されているメソッドの一種。
・下記の3部構成になっている。
①Streamを作成
②中間処理（なくてもいい）
③終端処理（1度だけ必ず行う）

```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Lesson {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));

        fruits.stream()//1.streamの【生成】
            .map(n -> n + "Cake") // 2. 各要素に "Cake" を結合【中間操作1】
            .filter(n -> n.length() >= 10)// 3. 文字列の長さが10文字以上のものを抽出【中間操作2】
            .forEach(n -> System.out.println(n));// 4. 抽出された要素を出力【終端操作※1度だけ必ず行う】
    }
}
```
### ■Streamの構成について

## ①stream生成
処理したいリストにドットで繋げて.stream()と書く。
```java
fruits.stream()
```
## ②中間処理
リストに対して処理したいメソッドを記述。
```java
.map(n -> n + "Cake") 
.filter(n -> n.length() >= 10)
```
#### 中間処理で使う、代表的なメソッドいろいろ

**▼map：変換**
-> を挟んで左辺の引数の値を、右辺の値に変換して返す。
要素の変数の名前はnや、分かりやすい名前。(この例で言うとfruitとか)
変換したい値は計算式を入れたり、大文字変換のtoUpperCase()をかけたり。
```java
.map(リスト内の要素を表す変数n -> nに対して変換したい値)
```
**▼filter：条件による抽出**
左辺の引数の値に対して、右辺の条件式がtrueとなるものを抽出する。
```java
.filter(リスト内の要素を表す変数n -> nに対する条件)
```
**▼distinct：重複削除**
Stream内の要素の中で重複が無い状態にする。すべてユニークな要素。
```java
.distinct()
```
**▼limit：先頭から指定範囲を抽出**
long型の引数に指定した数だけ、先頭から取り出す。(※0は数えず見たまんまの数を抽出。)
```java
.limit(取り出したい要素数)
```
**▼sorted：昇順ソート**
昇順に並べ替える。引数は持たない。
sorted(Comparator.naturalOrder())と意味は同じ。
```java
.sorted() 
```

## ③終端処理
中間操作が0～複数個あったのに対し、終端操作は最後に1度だけ必ず行う。
例で使ったのは **▼forEach：要素を一つづつ取得し、各要素に対して処理する**
ArrayListなどでも使うあのForEach文と全く同じ。
```java
.forEach(n -> System.out.println(n));
```
#### その他の終端処理
**▼collect(Collectors.toList())**
streamの処理後の要素のリストを返す終端処理。
```java
.collect(Collectors.toList()); 
```
kaggle titanic　成長日記

<h2>2024/4/29</h2>

<h3>アンサンブルの実施</h3>

~~~python
logi = pd.read_csv("/kaggle/input/submit-files/submission_logi.csv")
lgb = pd.read_csv("/kaggle/input/submit-files/submission_lgb_2.csv")
random = pd.read_csv("/kaggle/input/submit-files/submission_random.csv")
df_corr=pd.concat([logi,lgb,random],axis=1).drop("PassengerId",axis=1)
soukan = df_corr.corr()

gender_submission["Survived"]=((logi["Survived"]+lgb["Survived"]+random["Survived"])>=2).astype(int)
#アンサンブル
df_submit = gender_submission

~~~
でアンサンブルを実施した。今までのデータを用いてよいデータを作るようにした。最大の測定値が出た

<h3>ランダムフォレストのn_estimatorsとmax_depthの良い数値を出す</h3>

~~~python
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #20～30を１刻みずつ試す
              'classify__max_depth':list(range(3, 10, 1))} #3～10を１刻みずつ試す
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(x_train, y_train)
print(grid.best_params_, grid.best_score_, sep="\n")
~~~

参考）https://qiita.com/shiroino11111/items/bc3889fa38ff32d46c13

<h3>Cabinをダミー関数で置き換え</h3>

~~~python

train["Cabin"] =train["Cabin"].fillna("unknown")
train["Cabin"] = train["Cabin"].str[0]
train_em = pd.get_dummies(train[["Cabin"]],dtype=int)
train = train.join(train_em)
train.drop("Cabin",axis=1)

x_train = train[["Parch","SibSp","Age","Sex","Pclass","Fare","Embarked_S","Embarked_C","Embarked_Q","Cabin_A","Cabin_B","Cabin_C","Cabin_D","Cabin_E","Cabin_F","Cabin_G","Cabin_T","Cabin_u"]]
x_train["Age"] = x_train["Age"].fillna(x_train["Age"].median())

~~~
を挿入した。cabinは席の場所を表しており、特定の文字だった場合に生存率が向上していた。<br>
効果てきめん。0.01も上がった
参考）https://qiita.com/shiroino11111/items/fb6aa6b7dba2ddc3ce04

<h3>Fareで25以下の特徴量を作る</h3>
~~~python

x_train["under25-Fare"] = 0
x_train.loc[x_train["Fare"]<25,:]=1
~~~
ただし、0.04も下がってしまった。おそらくFareの特徴量を2つ作ったから過学習をしてしまったのかも。

<h3>Age,Fare,familysizeの標準化</h3>
~~~python
sc = StandardScaler()
sc.fit(x_train[["Age","Fare","familysize","Pclass"]])
train_std = sc.transform(x_train[["Age","Fare","familysize","Pclass"]])
x_train[["Age","Fare","familysize","Pclass"]] = pd.DataFrame(train_std)
x_train
~~~
StandardScalerを使って標準化をした。0.01ポイント上がった。やはりScをすることでポイントは上がるみたい。


light bgm

Categorical Featureとは、カテゴリ変数（質的変数）を、lightbgmで使いやすい形へ変形をして利用できるように、カラムを設定できる。カテゴリ変数とは、性別・出発地など。カテゴリ変数において、要素数が多くなるとカラムが多くなってしまう、それを防ぐ対処法。
また、カテゴリ変数は0から始まる整数に設定しておく必要がある
https://qiita.com/sinchir0/items/b038757e578b790ec96a

https://www.kaggle.com/code/nobuakiotani/tutorial-04-lightgbm

https://note.com/3x7x37ykr/n/n24646c038959
並列Lispでたらいまわしをした話（４）

# 再挑戦
２０２３年の夏、マルチスレッドによる並列Lispに挑戦していました。一応は動作するようになったものの、期待していたほどの並列による高速化はできませんでした。それは逐次よりも遅くなってしまうのでした。２０２４年の春になり、今度はマルチプロセスで挑戦することにしました。

# マルチプロセス
マルチスレッドではメモリ空間を共有していました。しかし、マルチプロセスではそれぞれのメモリ空間で独立しています。試しに手動で３つのEasy-Lisp処理系を立ち上げてそれぞれで竹内関数を実行させてみました。速度はそれぞれ逐次のときと変わりません。これなら並列を活かせそうです。

ChatGPTと相談しました。プロセス間でやりとりするにはどうしたらいいかな？　ChatGPTはあれこれと提案してきました。それぞれの方法について勉強してみるとunixのforkとpipeを使うのが簡便そうでした。fork()で子Lispを起動させ、その入出力をパイプにつなぐ方法をとりました。標準入力はバッファリングされていることがわかりました。試行錯誤の末に独自にバッファリングすることで子Lispと親Lispでパイプによるプロセス間通信ができるようになりました。

# 並列構文
マルチスレッドの時と同様に次の並列構文を用意、実装しました。

- (mp-create n)
- (mp-close)
- (mp-call fun arg1 ... argn)
- (mp-exec arg1 ... argn)
- (mp-let forms body)

mp-createによりn個の子Lispを起動しておきます。call.exec.letはスレッド方式と同じ意味あいです。

# たらい回し
竹内関数を並列実行させることに取り組みました。ここで使用したパソコンはインテルIcore7が積まれたWindowsマシンです。WSL2で動かしています。

```lisp
(defun tarai* (x y z)
    (if (<= x y)
        y
        (mp-call #'tarai* (tarai (- x 1) y z) 
                          (tarai (- y 1) z x)
                          (tarai (- z 1) x y))))

(defun tarai (x y z)
    (if (<= x y)
        y
        (tarai (tarai (- x 1) y z)
               (tarai (- y 1) z x)
               (tarai (- z 1) x y))))
```

インタプリタでの実行は下記のとおりです。

![bandicam 2024-04-29 19-21-09-391.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/91928a2c-3227-6d27-ab3c-adba977f208e.jpeg)



# コンパイラ
さらにコンパイラを改良して並列構文もコンパイルできるようにしました。

![bandicam 2024-04-29 18-10-04-366.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/a48299f2-d10d-5925-38d5-dd5ae6c3cf91.jpeg)

# 考察
竹内関数は３つの引数から成ります。これを３つの子Lispで並列処理しています。それらの計算料は均等ではありません。このため３分の１にはなりません。最も計算料の多い引数の処理時間の影響を受けます。それにしても並列による効果が得られました。

# 展望
ver3.90をリリースし、当初の目標をほぼ達成しました。ver4.00にむけてさらに改良、バグ修正をしたいと思います。Githubにて公開しています。お気づきの点がありましたらIssuesにてご連絡をお願いいたします。

https://github.com/sasagawa888/eisl
useReducerがよくわからないので、整理する

userReducerについて本で学習したがいまいちわからなかったので、自分用にアウトプットします
## useReducerとは
状態を扱うためのフック。useStateよりも複雑な状態管理に向いている。状態が配列はオブジェクトなど複数あるときに便利。

## 構文
```tsx
type Action = '状態1' | '状態2' | '状態３'

const reducer(現在の状態, action: Action) {
    return 次の状態
}

const [現在の状態, dispatch] = useReducer(reducer, reducerに渡される初期状態)

// dispatch('状態1')で状態を更新させる
```
言語化すると、更新関数dispatchに引数としてactionを渡すと、reducerが現在の状態を更新してくれる

## 例
ボタンによってCountが変化するコンポーネントを作成してみます

```tsx
import { useReducer } from 'react'

type Action = 'INCREMENT' | 'DECREMENT' | 'DOUBLE' | 'RESET'

// actionに応じて次の状態を返す
const reducer = (currentCount: number, action: Action) => {
    switch (action) {
        case 'INCREMENT':
            return currentCount + 1
        case 'DECREMENT':
            return currentCount - 1
        case 'DOUBLE':
            return currentCount * 2
        case 'RESET':
            return 0
        default:
            return currentCount
    } 
}

type CounterProps = {
    initialValue: number
}

// Counterコンポーネント
const Counter = (props: CounterProps) => {
    const {initialValue} = props
    const [count, dispatch] = useReducer(reducer,initialValue)

    return (
        <>
            <p>Count: {count}</p>
            <button onClick={() => dispatch('INCREMENT')}>+</button>
            <button onClick={() => dispatch('DECREMENT')}>-</button>
            <button onClick={() => dispatch('DOUBLE')}>×2</button>
            <button onClick={() => dispatch('RESET')}>reset</button>
        </>
    )
}

export default Counter
```

型エイリアスでActionを４つの状態で定義しています
```tsx
type Action = 'INCREMENT' | 'DECREMENT' | 'DOUBLE' | 'RESET'
```
boolean型のuseStateを使用すると、２種類の状態でしか管理できません。しかし、useReducerを用いれば、３つ以上の状態を管理することができます。
最近ManjaroでAndroid emulatorが起動しない件について

## 起きている現象

2024年の3月辺りから、Manjaro(おそらくArchLinuxも)でAndroid emulatorが起動しない問題が発生しました。

IntelliJやAndroidStudioから起動しようとするも起動しません。

ターミナルから起動して起動時のログを確認すると、Segmentation fault (コアダンプ)となりました。

## 原因

Manjaro Forumに同じ現象について書かれていました。
https://forum.manjaro.org/t/segmentation-fault-on-android-emulator-because-of-latest-qemu-update/157548

どうやらqeumの最新バージョンによるバグとのこと。
Vukanがうまく動いてくれないようです。

## 解決方法

2つあります、どちらの方法でも解決しました。
通常であれば2つ目の方法、設定汚したくない時やグラフィックが重いものを動かす場合は1つ目の方法を使うとよいかと思います。

1. ハードウェアレンダリングからソフトウェアレンダリングに変更(AVDの設定)
AVDの設定で、Emulated PerformanceのGraphicが「Automatic」になっているのを「Software-GLES2.0」に変更する。
ただし、端末の選択画面においてPlayStoreが同梱されている端末はその項目が変更できないので、PlayStoreが無いものを選んでください。

2. VulkanではなくOpenGLを使わせる(設定ファイルの作成)
$HOME/.android 以下にadvancedFeature.iniを作成し、以下を書きこむ
~~~
Vulkan = off
GLDirectMem = on
~~~
version is obsolete とかいう謎の警告が出た件

# はじめに

Dockerをアップデートしたら、今まで見たことない謎の警告が出るようになったので調べてみた

# 問題

```version```の記述は廃止されたとのこと。

```
WARN[0000] .../docker-compose.yml: `version` is obsolete 
```

# 解決方法

docker-compose.ymlの先頭に下記のようにバージョン情報を書くと思います。

これを削除すればOK。

```
version: "3.8"
```

# おわりに

Docker Composeのバージョン2移行はオプションなので、そもそも書かなくて良かったのだそう。

バージョン1の場合は不明なので、もし出会ったら調べようと思います。

# 参考

https://github.com/mailcow/mailcow-dockerized/issues/5797

https://github.com/jasonacox/Powerwall-Dashboard/issues/453
【SOC】仕事内容紹介

こんにちは、皆さんはGWどう過ごしてますか？



今回はSOCの仕事を経験交えて紹介していきたいと思います。


SOCとは？
-----
SOCとは（Security Operetions Center）の略でTierにもよりますが最前線に立って攻撃の検知に努める職業です。
その仕事内容から24/365での稼働になるためシフト制を採用している企業がほとんどです。

主な仕事内容としては

・アラートを監視および調査
・セキュリティツールの設定と管理
・基本的なIDS (侵入検知システム)シグネチャの開発と実装 
・SOCワーキンググループや会議に参加
・チケットを作成し、必要に応じてセキュリティ インシデントを Tier 2 およびチーム リーダーにエスカレーション。
が挙げられます(未経験の場合Tier1からのスタートとなることが多いため)


Tier1オペレーターに必要なもの
-----

・フィジカル
・コミュ力

この二つがあれば一応なることはできます。
（夜勤だったり深夜の電話対応や、関係する各部署、顧客とのやり取りが発生するため）

（もちろん上に上がるために必要なのは学習の姿勢です。）



しんどさと良さ
-----

一日のうちの大半の時間を同じような内容のアラートを一日に何百件と確認することと対応の優先順位付けに費やす必要があるので非常に集中力もいりますし、判断に時間をかけることもできません、ほかのエンジニアからは『SOC(笑)』という目で見られますし、顧客から感謝もされません。
また、未経験でもできる仕事なので現場にもよりますがOSI参照モデル？三要素？なにそれ？みたいな作業員になってる人が結構います。（おそらくこれがSOC(笑)の元凶）
こういう人とは話すだけ無駄、自身の成長の妨げになるだけなのでさっさと追い越しちゃいましょう。


ただ、ここで得られるものは本当に多く、自身が最前線に立っているので今どんな攻撃がトレンドなのかがツイッターなど見なくても自然と頭に入ってきますし主要なベンダーの製品に触れる機会も多くあります。ログを見に行く機会も多いです。


そうすると脆弱性のエクスプロイトにどんな知識が必要なのかがだんだんわかってきます、（ネットで調べたら早いんだろうけど自分で気づくことが大事だと思いました。）


で、経験積んで現場の人を全員追い越したなと思った時は自身のやりたいことがもう少し解像度高く見えてるはずなのでそれに向かって突き進みましょう。

まとめ
-----
しんどいところを多めで書きましたし、SOCの仕事は地味な印象を受ける方も一定数いらっしゃるかも知れないです。
が、未経験者からしたら新たな発見の連続で非常にワクワクできる仕事だと思います。
自分も出勤日が来るたびに今日はどんな発見があるんだろうとワクワクしながら通勤して、うち帰ったらこれやってみよ～～と、ワクワクしながら帰宅していたので毎日充実してました。
フィジカル面を犠牲にしてでもやる価値のあるとてもやりがいある仕事だと思います。



次は脆弱性診断士の仕事について話そうと思います。
ExcelVBAのラジオボタンの値を取得したい

# 1. はじめに
* ExcelVBAで配置したラジオボタンの値を取得したい

# 2. 開発環境
* Excel 2016
* VBA

# 3. 画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/cd7c9a3e-6118-9fb9-d102-36c4309604ca.png)

# 4. プログラムソース
```vb
Private Sub CommandButton1_Click()
    MsgBox ActiveSheet.OptionButton1.Value
    MsgBox ActiveSheet.OptionButton2.Value
End Sub
```

# 5 .参考文献

https://www.automateexcel.com/ja/vba/option-button-excel-ja/
Laravel Sailのバージョン変更

phpのバージョンを変更する(8.2 → 8.0)
docker-compose.ymlの以下のように変更する
変更前
```yaml
laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.2
        image: sail-8.2/app
```
変更後
```yaml
laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
        image: sail-8.0/app
```

Laravelのバージョンを指定してSailを導入する
```zsh
composer create-project laravel/laravel アプリ名 --prefer-dist "9.*"
cd アプリ名
php artisan sail:install
```

sail artisan -Vでcomposerのバージョンが合わないとのエラーが出た
```
Composer detected issues in your platform:

Your Composer dependencies require a PHP version ">= 8.1.0". You are running 8.0.29.

PHP Fatal error:  Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 8.0.29. in /var/www/html/vendor/composer/platform_check.php on line 24
```
composerにphpのバージョンを指定してupdateしてみると解決
composerのバージョンも特に変わっていなかった
```
$ composer config platform.php 8.0.29
$ composer update
$ sail artisan -V
Laravel Framework 9.52.10
```
SQL Serverの実行計画を取得できるようにする

# 1. はじめに
* A5M2で実行計画を取得しようとした時、下記エラーがでるため解決したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/14e355b1-9d84-658e-af21-9286dfdaaf86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/69642bae-3f9d-4620-302b-340d43fec77f.png)

# 2. 開発環境
* SQL Server 2022
* A5M2

# 3. SHOWPLANの権限付与
* SHOWPLANの権限を付与することで実行計画が取得できるようになる

## 3.1. GUIからの権限付与
* プラン表示の許可の有無をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4ad3f470-d158-6f79-8b57-4f9c7ac7a410.png)

## 3.2. CUIからの権限付与
* SQL Server Management Studio (SSMS) より下記SQLを実行する
```GRANT SHOWPLAN TO [テーブル名] WITH GRANT   OPTION;```

# 4. 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/62ed5dac-6961-d58e-01a4-518abed9c9ea.png)

# 5. 参考文献

https://odashinsuke.hatenablog.com/entry/2014/01/04/123041
laravel-vite-pluginを用いてJavaScriptのモジュールをバンドルする

### 開発環境
- Windows 10 Pro(64bit)
- laravel/framework 10.10

1.モジュールを入れるmodulesディレクトリをresources/jsディレクトリ内に作成する

2.modulesディレクトリ内に以下の3ファイルを作成する
```javascript:a.js
export default (function(){
	alert("a.js");
})();
```
```javascript:b.js
export default (function(){
	alert("b.js");
})();
```

```javascript:c.js
export default (function(){
	alert("c.js");
})();
```

3.app.jsを開いて、以下に書き換える
```javascript:app.js
import "./modules/a";
import "./modules/b";
import "./modules/c";

```

4.プロジェクトのルートディレクトリ上で以下のコマンドでビルド
```powershell
npm run build
```

5./public/build/assetsディレクトリ内に、ファイルが作成されています。ファイル名は、app-以降については、開発環境によって違うと思います。
```javascript:app-CTGd6Hn6.js
(function(){alert("a.js")})();(function(){alert("b.js")})();(function(){alert("c.js")})();
```

6.使用するには、bladeテンプレート内のheadタグ内やbodyタグの末尾に、以下のように@viteディレクティブを挿入します。
```php
@vite(['resources/js/app.js'])
```


### 参考リンク
- [laravel / vite-plugin](https://github.com/laravel/vite-plugin)
- [Asset Bundling (Vite)](https://laravel.com/docs/10.x/vite)
Your Premier Accounting Solution in Qatar: Trust Global Edge Management Consultants LLC!

Seeking top-notch accounting services in Qatar? Look no further! Our reputable accounting firm in Qatar offers tailored financial solutions for businesses of all sizes. With a dedicated team of experts, we ensure accuracy, compliance, and efficiency in managing your finances. Gain peace of mind and focus on your core operations while we handle your accounting needs. Contact Global Edge Management Consultants LLC today for unmatched accounting services in Qatar.

https://www.globaledge-qa.com/

Email : contact@globaledge-qa.com
Tel : +974 5539 0222 | +974 3397 7577
C#でQRコードを生成してみる

# 1. はじめに
* C#でQRコードを作成して画像を表示したい
* ZXing.Netを使用してQRコードを作成したい

# 2. 開発環境
* C#
* .NET 8
* Visual Studio 2022
* Windows 10

# 3. 事前準備
* ```ZXing.Net``` ,```ZXing.Net.Bindings.Windows.Compatibility``` をNuGetからインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6228c770-0788-7c89-d2bf-a166ce399cab.png)

# 4. サンプルコード
```Csharp:
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;

namespace ZXingSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            string URL = "https://qiita.com";
            var bitmap = GenerateQRcode(URL);

            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            pictureBox1.Image = bitmap;
        }

        /// <summary>
        /// QRコード生成
        /// </summary>
        /// <param name="URL"></param>
        /// <returns></returns>
        private Bitmap GenerateQRcode(string URL)
        {
            var qrWriter = new BarcodeWriter()
            {
                Format = BarcodeFormat.QR_CODE,
                Options = new EncodingOptions { Height = 100, Width = 100, Margin = 0 },
            };

            return qrWriter.Write(URL);
        }
    }
}
```

# 5. 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/37895d7e-1821-e8fe-70f6-ddf8aa435461.png)

# 6. 参考文献

https://qiita.com/te-k/items/055b70c0182590135953

https://github.com/micjahn/ZXing.Net/issues/458
じゃんけんアプリ(Java)

```
import java.util.Scanner;
import java.util.Random;

public class Janken {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        String[] hands = {"グー", "チョキ", "パー"};

        System.out.println("じゃんけんゲームを始めます。");
        System.out.println("1: グー、2: チョキ、3: パー のいずれかの番号を入力してください。");

        int userHandIndex = scanner.nextInt() - 1; 
        // ユーザーの入力を1減らすことで、配列のインデックスと一致させる

        if (userHandIndex < 0 || userHandIndex > 2) {
            System.out.println("入力が正しくありません。");
            return;
        }

        String userHand = hands[userHandIndex];
        System.out.println("あなたの手: " + userHand);

        int computerHandIndex = random.nextInt(3);
        String computerHand = hands[computerHandIndex];
        System.out.println("コンピュータの手: " + computerHand);

        if (userHandIndex == computerHandIndex) {
            System.out.println("あいこです。");
        } else if ((userHandIndex + 1) % 3 == computerHandIndex) {
            System.out.println("あなたの勝ちです！");
        } else {
            System.out.println("あなたの負けです...");
        }
    }
}
```
React公式ページで学んでみた17（備忘録）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
前回の続きです。今回は「エフェクトを使って同期を行う」。被る部分もあると思いますが、後で振りかえって深掘りするきっかけになるのが理想です。細かく書くと大変なのであっさりめ。

https://qiita.com/mr_noppo/items/131fd4aaf702a8fb1051

# 使用したものや事前準備
・Macbook Pro

# 主に参考にさせていただいた記事
https://ja.react.dev/learn/synchronizing-with-effects

# エフェクトとは
Reactコンポーネント内には２種類のロジックがある
・レンダーコード
　JSXを返す
・イベントハンドラ
　ユーザーアクションによって変化させる
 
エフェクトは上記２点で完了できない、レンダー自体によって引き起こされる副作用を指定するものである

# エフェクトは何らかの外部システムと同期するために使用
エフェクトはおそらく不要なものの時が多い。エフェクトが他のstateをもとにstateを調整しているだけであれば必要ない。

また、useEffectはレンダー後に発火するため下記の場合だと無限ループが発生する。
```react
const [count, setCount] = useState(0);
useEffect(() => {
  setCount(count + 1);
});
```
# 依存配列の設定
関係するstateを設定することで、対象のstateによるレンダリングの時のみ発火するように設定できる。
```react
useEffect(() => {
    if (isPlaying) {
      console.log('Calling video.play()');
      ref.current.play();
    } else {
      console.log('Calling video.pause()');
      ref.current.pause();
    }
}, [isPlaying]);
```

# クリーンアップ
Effect内でreturn文を記載するとコンポーネントが破棄されるかuseEffectが再実行される（アンマウント）時に実行される。
連続で実行される場合、クリーンアップで最新の情報のみ取得するため、APIの結果待ちでも取得は最新のみになる。

```react
useEffect(() => {
    const connection = createConnection()
    connection.connect()
    return () => {
      connection.disconnect()
    }
}, [])
```

## クリーンアップが必要だと判断できる時
1.開発環境の２回発生するエフェクトでクラッシュする場合（要素を表示するなど）
2.イベントのリッスン
3.アニメーションの初期化
4.不要なAPIレスポンス

## エフェクトの中のfetch
エフェクトの中で行うのが一般的な方法だが、レンダー後にfetchが動くことになることや、並列的な処理ではなくレスポンスを待ってから次の処理を行うケースも増えパフォーマンスが落ちる場合もある。
フレームワークのデータフェッチ機構かオープンソースを使用することも考える。


# 次
https://qiita.com/mr_noppo/items/820cceaea26dba147d28
日本語プログラミング言語Mind８で十進数計算（平方根）

## 平方根（固定桁）計算
ニュートン法で、小数点以下10桁まで求めていますが、どの桁まで精度があるかは未検証です。

```
Ｌ小数の二倍とは　（Ｌ小数　→　Ｌ小数）
　　　　小数Ａは　構造体情報
　　　　整数Ａは　構造体　Ｌ小数型
		小数桁数Ａは　変数
		小数桁数は　変数
		整数積は　構造体　Ｌ小数型
	小数Ａに　入れる
	小数Ａの　Ｌ小数桁数を　小数桁数Ａに　入れる
	小数Ａを　小数桁数Ａだけ　Ｌ小数を指定桁桁上げし	整数Ａに　入れる
	整数Ａの　Ｌ整数の二倍を　整数積に　入れる
	整数積を　小数桁数Ａだけ　Ｌ小数を指定桁桁下げし	返す。
Ｌ小数の自然数乗とは　（Ｌ小数、整数　→　Ｌ小数）
	　　小数Ａは　構造体情報
		累乗数は　変数
		小数積は　構造体　Ｌ小数型
		小数Ａと　累乗数に　入れる
　　　　小数積を　クリアする
		１を　小数積の　Ｌ符号に　入れる
　　　　１を　小数積の　Ｌ桁数に　入れる
　　　　１を 小数積の　Ｌ数字（１）に　入れる
		累乗数　回数指定し
			小数積と　小数Ａの　Ｌ小数の掛け算結果を　小数積に　入れる
		繰り返す
		小数積を　返す。
Ｌ小数の二乗とは　（Ｌ小数、整数　→　Ｌ小数）
	　　小数Ａは　構造体情報
		小数積は　構造体　Ｌ小数型
		小数Ａに　入れる
		小数Ａと　小数Ａの　Ｌ小数の掛け算結果を　小数積に　入れる
		小数積を　返す。  
Ｌ小数の平方根とは　（Ｌ小数　→　Ｌ小数）
	　　小数Ａは　構造体情報
		分子は　構造体　Ｌ小数型
		分母は　構造体　Ｌ小数型
		近似値は　構造体　Ｌ小数型
		二乗値は　構造体　Ｌ小数型
		桁数は　変数
		小数Ａに　入れる
		小数Ａを　近似値に　入れる
		１を　桁数に　入れる
		10　回数指定し
　　　　　　桁数を　一つ増加する
			近似値の　Ｌ小数の二乗を　二乗値に　入れる
　        　二乗値と　小数Ａの　Ｌ小数の加算結果を　分子に　入れる
　　　　　　近似値の　Ｌ小数の二倍を　分母に　入れる
			分子を　分母で　桁数　Ｌ桁未満切り捨てした商を　近似値に　入れる			
		繰り返す
		近似値を　返す。
```
### 実行結果
2,3,4,5の平方根を求めました。（各１００回）
```
c:\mind8\pmind\sample>lnumtime
156ミリ秒経過
+1.41421356237
297ミリ秒経過
+1.73205080756
375ミリ秒経過
+2.00000000000
562ミリ秒経過
+2.23606797749
```
@killy さんへ　L小数型を　100桁で定義すると、途中で黙って終わってしまいましたので50桁にすると正常終了しました。
VSCodeの拡張機能Continueを使ってOllamaを試してみた

## はじめに
この記事では、VSCodeの拡張機能「Continue」を用いて、ローカルで動作する大規模言語モデルOllamaを試してみます。開発者や技術者が自分のPC上で直接LLMを操作する方法に焦点を当てています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/90c7304e-3b88-0238-0ed0-c0237e11b32d.png)

https://x.com/ollama/status/1796637955160789050

## Continueとは
「Continue」はコーディング支援を提供するオープンソースのVSCode拡張機能です。このツールを使って、VSCode内から直接Ollamaのようなモデルにアクセスし、コードの自動生成や修正を行うことができます。

## Ollamaとは
Ollamaは、LLama3やLLava、vicunaやPhiなどのオープンに公開されているモデルを手元のPCやサーバーで動かすことの出来るツールです。

https://ollama.com/

## 前提条件
- Visual Studio Codeのインストールされていること
- OSはWindowsであること
- OllamaはWindows版のインストーラを使用した

## 導入手順

### Ollamaのインストール
1. [OllmanのWindows用のインストーラ](https://ollama.com/download/windows)をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7bc90eed-3d76-4011-c5e1-e9aa69b4e146.png)

2. "Download for Windows (Preview)"と表示されている場所をクリックします。
3. ダウンロードしたEXEファイルを実行します。
4. インストールが開始されます。

### Ollamaの設定
1. コマンドをcmdで実行して、Ollamaに使用したいモデルファイルをローカルシステムにダウンロードします。モデルをダウンロードするまで時間がかかります。
例: `ollama pull mistral`

### Continueのインストール
VSCodeの拡張機能タブから「Continue」を検索し、インストールします。

### ContinueにOllamaを追加する
VsCodeのContinueアイコンをクリックして画面をひらきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ed866e29-cef3-94bc-c550-1fc3d3a25429.png)

左下の+のボタンをクリックして、Ollamaを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aa463f65-df1d-0a47-1f67-89e48e4eb25c.png)

ProviederのなかからOllamaを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/441a31f8-4906-dea7-0e7f-c8bed1b40fcd.png)

Autodetectを選択します。細かい設定をしたい場合は、Advanceの設定など変更する必要がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0b3e455d-c97f-7c4d-706b-d913f82d8f62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/cc4c251c-2559-efa8-a8a0-968be5710bf2.png)

モデルの選択画面からollamaで使えるモデルが選択できるようになる。例えば、llama3を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/eb8496b4-3345-b391-0fa9-5bacecb6546c.png)

## 使用例とデモ
- チャットからカレーの作り方を聞いてみると・・・。日本語が微妙かな・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4ff57e21-6c89-9812-a08c-2f41e408c150.png)

- ファイルを指定して、それについて質問してみると・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/be2b20bd-953f-ccd1-c53e-8e0b59aa42dd.png)
英語はまじってるが、ファイルの内容から抽出している

- htmlのコードの説明をかいてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/24012ce5-7125-adf7-b544-87bee65f50de.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/2fc58759-a54b-cab2-3efc-2e4fd6aafddc.png)

## まとめ
ローカルでLLMを使用する利点と、Continue拡張機能を通じてVSCodeでOllamaを効率的に活用する方法について試してみました。

## 感想
- 外部のGPUつきでOllamaで高精度なモデルをうごかして、接続して連携して動かすほうが、現段階では使えるかな。
- 使用するモデルによっては日本語はやめて、英語でやりとりするなど工夫が必要かも・・。
-
『エンジニアのためのドキュメントライティング』を読んで学んだことまとめ

# はじめに

表題の本を読んで得られた知見をまとめる。

# 想定読者を定める

読者にとって必要なコンテンツをリストアップするために必要なタスク。

- 誰のためのドキュメントなのか？
- 読み手にとって必要な情報は何か？
- プロダクトの利用者からのフィードバックを得る
- ユーザーへの共感
- 読者の背景知識が作者よりも薄い前提で作成する

# ドキュメントの計画を作る

ドキュメントの全体像を理解しておく
- ソース内での適切なコメント
- README
- リリースノート
- FAQ
- トラブルシューティング

# 最初のドキュメントを書く

- リストアップから始める（白紙の状態で書くのは難しい）
- タイトルとゴールから流れに沿って書く
- 適切な書式を使う（見出しやリストなど）
- 流し読みに適した書き方（読者はほとんど読まない）
  - 重要な情報を先に書く
  - 大きな要素は複数のアウトラインに分割する
- 短くシンプルに
- 最初から完璧を目指さない
- 順不同で書く（書きやすいものからでOK）

# ドキュメントのブラッシュアップ

- 正しさ
  - 指示通りに動くか？
  - 専門用語など使わずわかりやすいか？
- 構成が適切か（見出し単位）
- 明確さ・簡潔さ（文章単位での表現）
- レビューとフィードバックを行う
  - アイディアに対して行う
  - 建設的な提案を行う

# 良いサンプルコード

- 説明を加える
  - 何のためのサンプルか？
  - 前提知識
  - 環境変数
  - よくあるエラー
- 簡潔にする
  - 適切な改行（水平バー、カッコ悪い）
  - 無駄なコードを書かない
- コードの明確さ
  - リファクタリング
  - 変数名・関数名
- 信頼性の高い文章
  - 一貫性をもたせる
  - サンプルと実態との一致

# 映像コンテンツ

割愛
以降は必要になったタイミングで追記する予定。

# おわりに

常に意識していた部分ではあるけど、より解像度が上がった。
時々読み返して、練度を上げていきたい。
アイデア集

# 1.ここで書くこと
中小企業社員が普遍的だったり、発想みたいなことを書く。


# 2.失敗すらできない組織
やりたいことができずに失敗することがある。
ただ、これは失敗とは言えない。なぜなら試行すらできていないから。

⇒　スキームの中に試行できているかをチェックする機構を必ず設ける

# 3.理解しているかの確認
会社の中でグループ内の理解が違い、結局取り組みができないことはよくある。
コミュニケーション力やファシリテーション力といえばそれまでなのだが。

⇒理解度をチェックするステップを設ける。例えば抜き打ちテストがよい。
　理解しているかのチェック方法は古来から考えて続けられている。その中で生き残った１つがテスト。

# 4.物理法則（自然科学）を軸にする
組織課題に対して検索すると、色々な手法などあるがそれは提唱者が気持ちよくなっているだけ。
まずは正しいかを確認すること。

⇒信じていいのは物理法則だったり自然科学に基づくものだけにする。
　あるいはそれを基準に線を引く。

例）全体最適理論について
・制約理論は物理法則に基づくので信じる　⇒　応用も聞きやすい
・CCPMなどの管理手法はあくまで手法として認知する　⇒　当てはまるかは制約理論（物理法則）に基づいてジャッジする。

⇒物理法則であれば、メンバー間で理解の齟齬が生じない。それがフェアな議論を生む。自然科学に基づいた議論ができなければその人は学校に入り直すしかない。
⇒手法の類を使う場合はその前提を知らなければならない。前提が違うのに手法に固執すると失敗する。事業形態が違えば単純に当てはまるとは言えないはず。

# 5.人の制御
人の制御について、制御工学や機械学習の要素を対応できないか？

①学習率
伸び悩んだテーマは思考を大きく動かす。手先を動かしているのなら理論の勉強やより高位の勉強をする。
まったく違うテーマに行き、しばらく離れるのもあり。

②正則化項
１つの目的に対して考えすぎておかしくなることがある。
企業の仕組み、構図として考えたときこの項が無く、効率の悪い取り組みになることがある。

例＞不具合を減らすため、再現なく時間を使うとコストが上がる。コストを正則化項（負の項）と捉える。

③ネガティブフィードバックとポジティブフィードバック
・ネガティブフィードバックはあくまで目標に合わせる制御。効率が上がる類の制御でもあるが、予想内に収まる。
・ポジティブフィードバックは予測に向かわせるものではない。制御とはいえないかも知れないが、高ければ高いほどよいものには適している。

⇒人の成長はポジティブフィードバックの方がよい（ミスを指摘されるより、いいところを褒める）
⇒ネガティブフィードバックは組織的なコントロールによい（ただ、面白くはないのでコンピュータや機械を噛ませるのが良い）
⇒ネガティブフィードバックするときは、フィードバックがかかっているか、それが誤りを正しく補正し得るかで見る。

# 6.人と限界
限界を感じた人はそこで学びをヤメてしまう。だが年齢と立場は上がる。
当人はそのギャップに苦しむ。

⇒学んでも成長できないので、さらに学ばなくなる
⇒若手の揚げ足取り、否定をする
⇒政治（情報操作）や人間関係に走る

大小あれども、誰でもそうなる。
成長し続けるしかない。

# 7.同期／非同期
・同期をとる　⇒　クリティカルパス発生　⇒　効率ダウン
・非同期　⇒　クリティカルパス発生しない　⇒　効率ダウンしない
と考えるのが基本。

非同期でできることは非同期でする。ただ、前提はある。

⇒会議前に各々が事前準備するのは非同期処理。
⇒事前準備なしの会議は完全同期式。

# 8.人の入れ替わりと生存者バイアス
・人の入れ替わりがない中小企業は生存者バイアスが支配している。
・ただ、中途入社組はそのバイアスを崩したいというアンチバイアスがあるはず。

⇒　幹部で改革会議をするとき、生存者バイアスが効きすぎていて何も変わらない。
⇒　これらを踏まえてどうフラットに、フェアにするか？
⇒　幹部を他の会社に派遣してバイアスを抜いて学んでもらうのは？

# 9.ボトルネック
自動車などで性能限界がある部品によって決まっているとする。その部品のスペック次第で性能は工場する。

これを組織に置き換えたとき、
・会社の性能を決めるのは一番上か一番下
↓
・末端のスタッフは数が多いし、自発的に変わることは不可能
↓
・一番上が変わるべき（最も効率よく改革する方法）

という理屈はありそう。それがトップダウン式の組織構成ならなおさら。

# 10.定年まで必要とされるため
40台後半からは給料が上がりきったため、組織的には低パフォーマーになっていく。
大手なら窓際行きだし、中小なら政治力で乗り切るしかない。

こうならないためには、人に教えられる人間となるくらいか。（聞かれた疑問に返せる人は好かれる）
⇒ただ、簡単な内容でなく組合せなどによる高度なこと、経験談など
⇒分かりやすく言語化することも必要
⇒自信は必要（オドオドしたら聞いてもらえない）

# 11.理解度の確認基準
理解度を確かめる取り組み、仕掛けって以外と会社内にないことが多いのでは？
なんとなく上司の印象で決めてしまっているし、上司自体も怪しいことがある。

少なくとも白黒ハッキリできることについてはフェアに理解する必要があると思う。

⇒問題形式で問うのは？不特定多数の人の理解度をフェアに測る方法として、古来からあるわけで間違っていると思えない。
⇒解説付きの問題集でもあれば、各人が機会の有無に関係なく学べる。

・会社内であった失敗ケースを問題に落とし込んで貯めていけばよい。
・解答例と合わせて若手の学習教材になるし、場合によっては商材になるかも知れない。
Atcoderを真剣に入色しよう～ ABC351

# ABC351を解いた際の考え方と解説を読んだアウトプット
[ABC351](https://atcoder.jp/contests/abc351)
結果は2完(所用でrated参加出来ませんでしたが…)

# A - The bottom of the ninth
考え方
Aの合計 + Bの合計 + 1で答え、やるだけ

# B - Spot the Difference
考え方
string配列に1つ目のグリッドを格納
2つ目のグリッドはchar型に1つずつ受け取り、1文字ずつ比較
i、jに+1した値を出力して終了

# C - Merge the balls
エラー解決してたら時間切れ、解けそうだったので悔しい

考え方
stack構造の一番上と入力を比較して、等しい場合はpopし入力に1を足す
↑この処理を一番上と入力が違う値となるまで繰り返す
最終的なstackの中身を出力

反省
stackの中身が空の時の処理を入れていなかったことから参照エラーが起きていた

解説を読んで
ボールの数を記録し、配列の参照位置を一つずつずらすことで求めていた。
stackを使わなくても求められるのはエレガントでかっこいい

# D - Grid and Magnet
着手出来なかったやつ、終了後に問題見た

考え方
マス目ってことはDFS/BSFとかUnionFindかな？
動けるマス+隣接マスを求めるっぽい
隣接マスをメモにとって重複して数えないようにしたい

解説を読んで
考え方とほぼ同じ、実装方法でメモのリセットを気にしないと計算量が大きくなってしまう
座標移動する配列を用意して、移動度計算したり移動可能か判定する
Atcoder liveではBFSを採用していて、公式解説ではDFSを用いていた
~~黒塗り解説ではUnionFindを用いていた~~
愚直にDFSを実装したら再帰を考えないといけない(UFとかBFSはmainにベタ書きできるっぽい？)

# ドデカメモ
C問題でのstackの使い方に注意、stackが空の状態を条件に入れなければならない
D問題で計算量の把握が出来るようになると更に良くなる(要修行)
Arcっていうブラウザが気になった

ちょっと気になるブラウザを見つけました。

https://arc.net/

まだiOSのみですが、Windowsでも触ってみたいですね、これ。

情報ソース：

https://qiita.com/ysmb-wtsg/items/c8f369caad776493e6dd
初サイト制作メモ5: サイトに載せる画像をS3に配置する

# AWS上にバケット、フォルダを作成
サイトに載せる画像なので公開状態で置いておきたい。
バケット作成時、パブリックアクセスのブロックのチェックを外す。
![スクリーンショット 2024-04-29 16.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/85b7a22e-7429-130b-c1db-f48418f06f8e.png)

作成したバケット内に、imagesフォルダを作成する
![スクリーンショット 2024-04-29 17.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/9e48d314-c3a0-59f5-f444-5f0065f5c2f0.png)


Amazon S3で画像や他のファイルを公開的にアクセス可能にするためには、単に「アクセスのブロックをオフ」にするだけでなく、適切なバケットポリシーを設定する必要があるらしい。
![スクリーンショット 2024-04-29 17.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/1032f1d4-bbef-8515-7960-d5955e4f42fe.png)

バケットポリシーで、imagesフォルダ配下だけを公開設定した。
![スクリーンショット 2024-04-29 17.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/88c38cc9-bc2c-622f-21df-f0858d6547fa.png)

フォルダ内の画像のオブジェクトURLをクリックし、画像が公開されていることを確認。
おお〜
![スクリーンショット 2024-04-29 17.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/ba290d5c-7253-2cdc-9a0f-aeb68c10d52b.png)
JSSST（日本ソフトウェア科学会）のTeXのスタイルファイルはhyperrefと干渉する

:::note info
4年前の下書きメモが手元に残っていたので，情報共有のためそのまま世の中に投下しておく．状況が変わってるかもしれないけど．
:::

JSSSTのスタイルファイルでは，改行含みのURLに一部のPDF viewer（macOSのPreviewなど）が正しくリンクを貼れません．\url等を使用してもです．

結果から言うとhyperrefでリンク貼れば解決できるんですが，なんか知らんけどhyperrefがスタイルファイルと干渉（\usepackageに失敗）します．
行儀の悪い可能性はありつつ，とりあえず下記のようにxpatchつけておけば干渉を防げます．
>https://tex.stackexchange.com/questions/557625/jucs2e-conflicts-with-hyperref
>
```
\usepackage{xpatch}
\xpatchcmd{\enddocument}{\def\global}{\gdef}{}{}
```

以上．
ターミナルのUIが気に食わなかったのでPreztoを導入してみた

# 概要

iTerminalを愛用しているが、ふとUIが気に食わなくなったので
Preztoを導入してみた。

導入方法からちょっとしたカスタマイズまで試してみたので備忘録として記事に起こす。

# Preztoとは

Zsh向けのフレームワーク、とのこと。
https://github.com/sorin-ionescu/prezto

# Preztoのインストール

フレームワークのインストール
```terminal.
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

設定ファイルの作成
```terminal.
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

コマンドが無事成功すると、ルートに以下のファイルが作成されているはず。
* .zlogin
* .zlogout
* .zpreztorc
* .zprofile
* .zshenv
* .zshrc

何らか失敗している場合は、既にファイルが存在する可能性が高いです。
その際は、上記の既に存在するファイルを一度削除（任意でバックアップを取得してください）し、再度実行すると成功すると思います。

# テーマの変更

テーマの変更は以下のファイルを編集します。

```terminal.
vi .zshpreztorc
```

いろいろ書いてありますが、140行目〜150行目あたりに以下のような記述があります。

```
144 #
145 # Prompt
146 #
147
148 # Set the prompt theme to load.
149 # Setting it to 'random' loads a random theme.
150 # Auto set to 'off' on dumb terminals.
151 zstyle ':prezto:module:prompt' theme 'powerlevel10k'
```

この中の
`zstyle ':prezto:module:prompt' theme 'powerlevel10k'`

ここを書き換えることでテーマの変更が可能です。
`'powerlevel10k'`

そのほかにも以下のようなコマンドがあり、テーマの確認ができます。

設定可能なテーマ一覧
```terminal.
prompt -l
```

テーマのプレビュー
```terminal.
prompt -p
```

# Powerline Font の設定

私が導入したのは`powerlevel10k`というテーマですが、これを含む一部のテーマでは
Powerline Fontのインストールが必要なようです。（さもないと文字化けしてしまう）

公式には以下の手順で掲載されています。
https://github.com/sorin-ionescu/prezto

clone

```terminal.
clone git clone https://github.com/powerline/fonts.git --depth=1
```

install

```terminal.
cd fonts
./install.sh 
```

clean-up

```terminal.
cd ..
rm -rf fonts
```

# ターミナルを再起動

基本↑に書いたことと、CLIで出てくる指示にしたがって再起動したりして〜を繰り返して、
最終的にはこんな感じになりました。

![スクリーンショット 2024-04-29 17.05.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191382/4f954dfe-3a6d-b904-ca26-9b924f1c521c.jpeg)

（せっかくだからと思ってちょっと派手にしすぎたので、そのうち別のテーマに落ち着いてそう…w）
運用保守でよく使うLinuxコマンドとちょっと危険なコマンド

## はじめに
現在運用保守の業務でLinuxを使う機会が多くあります。
その中でよく使うコマンドと、コマンドのちょっとしたミスで事故になりかけた話をしようと思います。
慣れるまではコマンドがパッと出てこなく苦労しますが、使いこなせると便利なコマンドが多いです。

運用保守の現場では障害時に、一刻も早いログ確認等の原因調査が求められますので、便利なコマンドは熟知しておきたいものです。

## よく使うコマンド
### lessコマンド
**less [ファイル]** で指定のファイルを閲覧できます。
ファイル閲覧やログ監視などで活躍する便利なコマンドです。
閲覧のみのコマンドのため、編集してしまう恐れもなく安心です。

**less -N [ファイル]**
上記オプションで行番号も表示できます。

**less -S [ファイル]**
上記オプションで長い行を折り返さず表示できます。


 ### catコマンド
 **cat [ファイル]** で指定のファイルを全行表示させます。
 
 **cat [ログファイル] | grep [検索する文字列]**
 障害発生時に、ログからerror分のみ抽出するときによく使用します。
 ログファイルの全行をパイプで渡して、grepで文字列を検索しています。

 **cat [ログファイル] | grep -i [検索する文字列]**
 上記オプションで大文字と小文字を区別せずに検索できます。

 ### tailコマンド
  **tail [ファイル]** で指定のファイルの行末を表示させます。
  最新のログが行末に出力されるため、業務でログを確認する際によく使用します。
  また、ファイルを更新し保存したときなど、ちゃんと記録が取られているかを確認する際にもよく使用します。

   ### viコマンド
   **tail [ファイル]** で指定のファイルを開き、テキストエディタを起動します。
   viエディタは入力モードに移るためのキーと、切り取りやコピーをするコマンドモードのキーがあります。

   **モード切り替え
(コマンドモード → 入力モード)**

i
現在のカーソル位置に文字を挿入する

O（大文字）
現在のカーソル行の前の行に行を挿入する

o（小文字）
現在のカーソル行の次の行に行を挿入する

基本的に自分はiキーを使用します。

**モード切り替え
(入力モード → コマンドモード)**

esc をクリックします。

   
   **よく使用するキー**
   x	
   　1文字削除する
dd
　1行削除する
 
削除行数 + dd
　指定した行数削除する
 
d$	
　カーソル位置から行末まで削除
 
d^	
　カーソル位置から行頭まで削除
 
u	
　取り消し
 
Ctrl + R	
　取り消しのやり直し
 
0	
　行の先頭へ移動
 
$	
　行の末尾へ移動
 
G	
　最終行へ移動
 
行数 + G	
　指定した行へ移動
 
:set number	
　行番号を表示
 
 / + 正規表現　
 　前方検索
  
? + 正規表現	
　後方検索
 
n	
　次の候補
 
N	
　前の候補
 
 :w	
 　保存
  
:w!	
　強制保存
 
:q	
　保存しないで終了
 
 
:wq	
　保存して終了

 ## ちょっとしたミスで事故になりかけた話
 chmodコマンドはファイルやフォルダのパーミッション、アクセス権限を設定するLinuxコマンドです。
 パーミッションとは、Linuxを含むUnixで扱われるファイルやディレクトリのアクセス権の設定のことです。

 **chmod [アクセス権限] [ファイル名]**
 上記コマンドで指定したファイルの権限を変更できるのですが。

  [アクセス権限]と[ファイル名]の間に余計なスペースが空いたまま実行してしまうと
  sysadm（システム管理者）の権限が変更されてしまうのです。
  
権限が変更されてしまうとsysadm01にログインができなくなり、急遽もう1つのsysadm02でログイン後、sysadm01を正規の権限に変更し、解決できました。
この事象は複数回発生しているのですが、最初はsysadm01のみしか無かったため報告書を提出するレベルだったそうです。。。

手順書がある場合はコピペを活用する。
chmodコマンドやrmコマンドを実行する際には十分に注意し、可能なら確認者を付けて実行するのが安全かと思います。
Unlocking Robot Potential: Millimeter Wave Radar Insights?

I. Introduction
Robotics is undergoing a transformative phase, with advancements in perception technology driving significant progress. Robot perception, the ability to sense and understand the environment, is fundamental for autonomy and functionality. One technology at the forefront of this revolution is millimeter wave radar. Millimeter wave radar utilizes electromagnetic waves with wavelengths ranging from 1 to 10 millimeters. This technology offers precise distance measurement and high-resolution imaging capabilities, making it ideal for various robotic applications.

II. Understanding Millimeter Wave Radar
Millimeter wave radar operates by emitting electromagnetic waves and analyzing their reflections from surrounding objects. Unlike other sensing technologies, such as cameras or LiDAR, millimeter wave radar is less affected by environmental factors such as light, dust, or smoke. This makes it ideal for applications where robust and reliable sensing is crucial. By accurately measuring the time it takes for the waves to reflect off objects and return to the radar system, millimeter wave radar enables robots to perceive their surroundings accurately in three dimensions.

III. Applications of Millimeter Wave Radar in Robotics
Millimeter wave radar finds extensive use in robotics, particularly in obstacle detection and avoidance. By providing real-time data on the location and movement of obstacles, robots can navigate through complex environments safely and efficiently. Autonomous vehicles, drones, and industrial robots benefit greatly from millimeter wave radar technology. Moreover, millimeter wave radar plays a crucial role in enabling autonomous navigation for robots. By continuously scanning the environment, it provides detailed information about obstacles, road conditions, and other relevant data, allowing robots to make informed decisions about their movements.

IV. Challenges and Future Developments
Despite its many advantages, millimeter wave radar technology faces challenges. These include the need for improved resolution, range capabilities, and cost-effectiveness. However, ongoing research and development efforts are addressing these challenges. Future developments in millimeter wave radar technology aim to improve resolution, range, and cost-effectiveness. With advancements in signal processing techniques and antenna designs, millimeter wave radar systems will provide even higher-resolution imaging and longer-range detection capabilities.

V. Conclusion
Millimeter wave radar technology holds immense potential for unlocking the full capabilities of robots. By providing accurate and reliable data about the surrounding environment, it enables robots to operate more autonomously and effectively in a wide range of real-world scenarios. As research and development efforts continue, we can expect further advancements in millimeter wave radar technology. Continued exploration and research in this field will pave the way for more sophisticated and autonomous robotic systems, revolutionizing industries and improving our daily lives.
git 作業(クローン編)

# はじめに
以前の記事(以下url)で、gitの使用法について簡単にさらっていったが、今回PCを新調したので、git hub上のデータをクローンしてきて、作業を継続できるようにする。
今回も超初心者の備忘録となっている
https://qiita.com/kushikushi/items/0162288ed71dc2a9a5aa

# 実行
まず、cdコマンドで、クローンしたいディレクトリに移動しておく

```
cd [移動したいディレクトリパス]
```

その後、git cloneコマンドを使用する
```
git clone [リポジトリパス]
```

今回は、git hubからクローンしたため、以下のようなurlを指定した
```
https://github.com/[ユーザー名]/[リポジトリ名].git
```

以上で終了。とても簡単だった。
ABC349備忘録【C~D】

## C - Airport Code
### 問題
https://atcoder.jp/contests/abc349/tasks/abc349_c

### 考えたこと
まず、$T$を小文字にします。次に$T[0]$を$S$で探索ヒットしたインデックスを$fst$に格納、fstの次からをループを再開し$T[1]$を探索、インデックスを$sec$に格納、最後に$thd$を格納とインデックスを保持していく。
この時、
- $fst, sec, thd$全てに数値が格納されていれば、一つ目の条件に該当し、"Yes"
- $fst, sec$にのみ数値が格納されていて、$t[2]==x$なら二つ目の条件に該当し、"Yes"
- それ以外で"No"
となる。

### ACコード
```c.py
s = input()
t = input()
t = t.lower()

fst, sec, thd = -1, -1, -1
for i in range(len(s)):
    if s[i] == t[0]:
        fst = i
        break
for i in range(fst + 1, len(s)):
    if s[i] == t[1]:
        sec = i
        break
for i in range(sec + 1, len(s)):
    if s[i] == t[2]:
        thd = i
        break

if fst != -1 and sec != -1 and thd != -1:
    exit(print("Yes"))
elif fst != -1 and sec != -1 and thd == -1 and t[2] == "x":
    exit(print("Yes"))
else:
    exit(print("No"))
```

## D - Divide Interval
### 問題
https://atcoder.jp/contests/abc349/tasks/abc349_d
### 考えたこと
初期値を$L, R$、各状態を$l,r$で表します。
考え方としては、初期値の$L$が$R$になるように各状態の$l$を$R$にどんどん近づけていくことを考えました。また、各処理は$l$の偶奇で違うため処理を分けています。
まず、$l$が奇数の時、$2^0$と入れるしかなく解答に$(l,\ l+1)$を追加、$l = l + 1$と動きます。
次に、$l$が偶数の時、
```math
\begin{align}
&l = 2^i j, \ r = 2^i(j+1) \\ 
&\therefore \ r =2^i\bigg(\frac{l}{2^i} + 1\bigg)
\end{align}
```
より、$i$を$60$から減らしていったとき$l \ \\% \ 2^i = 0$と$r \leq R$を満たす、最初の$(l,\ r)$を解答に追加します。最後に出力して終わりです。

### ACコード
``` d.py
# lは常に動かすので初期値からlとしてしまっています。
l, R = map(int, input().split())
cnt = 0
S = []

while l != R:
    if l % 2 == 0:
        for i in range(60, -1, -1):
            if l % (2**i) == 0 and (r := (2**i) * (l // (2**i) + 1)) <= R:
                S.append((l, r))
                l = r
                break
    else:
        S.append((l, l + 1))
        l += 1

print(len(S))
for s in S:
    print(*s)
```
dlibがうまくインストールできない話

# 発端
dlibをpipからインストールしようとした
```shell
pip install dlib
```
すると以下のエラーが出た

```shell
  Traceback (most recent call last):
    File "/home/user/.pyenv/versions/3.11.8/bin/cmake", line 5, in <module>
      from cmake import cmake
  ModuleNotFoundError: No module named 'cmake'

  ERROR: CMake must be installed to build dlib

  error: subprocess-exited-with-error
  ```

  # おかしい
  cmakeは当然入れているはずなのだが入っていなかったのか？？？？などと疑問が沸いたがエラーメッセージ通りにcmakeを入れた
  ```shell
  sudo apt install cmake
  pip install cmake
  ```
  だが同じエラーが出るばかりで解決せず

  # 結局
  以下のissueが参考になった
  https://github.com/davisking/dlib/issues/2943
  2024/04/29時点での最新版19.24.4は同様のエラーが多発しているらしい。

  一つ古いバージョンを指定することで無事にインストールできた
  ```shell
   pip install dlib==19.24.2
   ```
【Godot4】Cyclic Dependency について

※Qiita初投稿です。。お作法よくわかってないので、教えていただけると幸いですm()m

## 突然こんなエラーが出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866492/ccb2ef40-7d06-3cdf-047f-b6caa87a9ba6.png)

とりあえず Fix Dependencies（依存を修復）を押してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866492/ede6c1b8-091f-ad2d-98ac-0c0cf5ebade9.png)

前面のWarningはまぁいいとして、
リソースとパスは正しく参照できているはずなのに。。なんで？

## 無理やりシーンを再生してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866492/300bbd7d-d7d2-a35b-b516-e3ec006c7126.png)

ちょっと動く。。というのも

- Scene1の時に「2」キーを押すとScene2に移動
- Scene2の時に「1」キーを押すとScene1に移動

という構成のプロジェクトだけど、
2・3回移動すると途中で動かなくなる。

## Debugger 上のエラーを見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866492/d622631f-b448-9fad-be34-fa74cfc77393.png)

- 「scene_1.tscn」の15行目に存在しないリソースへの参照があるよ～
- 「scene_1.tscn」から別のファイルが読み込まれてるよ～（**循環参照**があるかも。。？）

2行目はよくわからないけどとりあえずシーンファイルの15行目を見てみるか。。

## 「scene_1.tscn」の15行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866492/dff9ea75-03b2-5f54-71dc-e8686eb40568.png)
自身にアタッチされてるスクリプトのリソース？？どゆことや

## GitHubをさまよう
たくさんさまよってみた結果、「Cyclic Dependency」なるバグのようなものがあるらしい。（多分Godot4以上だけ？）

https://github.com/godotengine/godot/issues/80877
ここに該当のバグに関連するissueが大量にまとめられている。

## 原因
複数のシーン（クラス？）からお互いのシーンを「preload」してインスタンス化したりするとだめみたい。

## 解決方法
いくつか先述のTRACKERを読んでみたけど、解決方法として言われてるものをいくつか抜粋
- .godot フォルダごと消せ
- .godot フォルダ内で、エラーが吐かれたシーン名が含まれているファイルを消せ
- preload() ではなく load() を使え
 
などなど。。
とりあえずシーンの遷移機能や preload 的な行をすべて削除したが自分の場合は直らなかった。。

結局Debugger上で言われている「scene_1.tscn」の該当行を削除したところ直った。

## はまりそうなポイント
プロジェクト読み込み時にアクティブになっているシーンにエラー内容が左右されそう。
前回終了時にscene1を開いていたらscene1の依存エラーが出るけど、scene2ならscene2のエラーが出る。
※なのでどのシーンがお互いをpreloadしているのか確認して、関連するコードをすべて対処しなきゃだめそう。

## まとめ
該当のエラーが出たら

1. とりあえず「Project > Reload Current Project」してみる
1. お互いを preload() していたら _ready() 内での load() 等に置き換える
1. お互いを preload() していたシーンの「.tscn」ファイルから、「ExtResource("1_bclal")」で参照されてる行を消す
1. 「.godot」フォルダ消す（ただのキャッシュなので大丈夫なはず）

この順番で随時「Reload Current Project」しながら確認すれば多分直るかも？？
機械学習モデルのモデルマージとは



# はじめに

話題のLLMの進化的マージについての論文を読んだので、「モデルマージとは？」についてまとめます。

今回紹介する論文は以下のLLMの進化的マージの論文です。
「[Evolutionary Optimization of Model Merging Recipes](https://arxiv.org/pdf/2403.13187)」

この論文では、モデルマージを進化的アルゴリズムで最適化したという結果が示されてますが、
本記事ではまず、モデルマージにのみフォーカスを当てて解説します。

# モデルマージとは？

モデルマージは複数の事前学習済みモデルの重みを組み合わせることによって、様々なタスクへの性能を向上させる手法です。

従来の手法では、事前学習されたモデルの重みを、特定のタスクへと再調整する。そうすることで、少ない学習で特定のタスク特化のモデルが作成できるというメリットがあったが、単一タスクへ特化されたモデルが作成されます。

モデルマージは、従来の手法とは異なり、複数のモデルの性能を活かした包括的なモデルを作成することを目的としています。

次にこの論文で紹介されているモデルマージの先行研究について説明します。

# シンプルなマージ「Model soup」


最初にあげる先行研究では、画像認識モデルにてモデルマージが行われています。
論文は「[Model soups: averaging weights of multiple fine-tuned models
improves accuracy without increasing inference time](https://arxiv.org/pdf/2203.05482)」
です。

この先行研究では、「Model soup」という、複数のモデルの重みを足し合わせる様々な手法が提案されていますが、この論文で最も性能が高くなった手法が、「Gready soup」と呼ばれる以下の手法です。

![スクリーンショット 2024-04-29 14.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/330c1e22-6d72-29b0-a04f-27ecd4d22354.png)

「Gready soup」では、バリデーションデータを用いて評価しながらどのモデルをマージしていくかを決定します。
モデルのマージは用意した事前学習済みモデルに対して一つずつ評価を行い、最終的なマージを決定します。
一つずつの評価は、上図のように重みを平均化する前のモデルと平均化した後のモデルでバリデーションデータによる評価を行います。
その評価で、スコアが上がった場合はマージし、スコアが下がった場合はマージをしないようにすることで、性能の向上を図ります。

この手法で、以下のように「Gready Soup」によってマージされたモデルが、ハイパーパラメータを変えた他の事前学習済みモデルよりも高い正解率となっていることがわかります。

![スクリーンショット 2024-04-29 14.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/95b1979c-6b75-bde7-bfcb-c132f4f33126.png)

縦軸は、ImageNetの5つの分布シフトにおける平均正解率で、いずれもマージしたモデルがマージ前のモデルよりも高いスコアとなっています。

![スクリーンショット 2024-04-29 14.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/df45323c-4454-53cb-4ac9-10e23be018d9.png)


# 統計的なマージ「Fisher Merging」


次にあげる先行研究では、自然言語処理モデルにてモデルマージが行われています。
論文は「[Merging Models with Fisher-Weighted Averaging](https://arxiv.org/pdf/2111.09832)」
です。

この研究では、モデルマージを以下の式のようにマージしたモデルの事後確率の最大化としてパラメータをマージします。

![スクリーンショット 2024-04-29 15.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/3a8b2092-0341-4907-ce1d-244d8715d3c9.png)

しかし、一般的な分布での事後確率最大化は計算しにくいため，ここではラプラス近似を行い、各モデルの尤度をガウス分布としています。
ここで、$F_i はフィッシャー情報量となります。

ガウス分布であると仮定したため、事後確率最大となるモデルの重みは、フィッシャー情報量を用いて以下になります。

![スクリーンショット 2024-04-29 15.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/1c415470-a724-227e-2ed8-066ad82bf775.png)

上記の式を用いたモデルの重みを「Fisher Merging」と呼んでいます。（ただし、フィッシャー情報量は、パラメータ空間における局所的な情報をもっているため、同じ初期化を行なって学習されたモデル間でしか有効でないそうです。）
このマージをBERTにて実験し、検証を行った結果が以下です。

![スクリーンショット 2024-04-29 15.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/6818f7de-9262-935e-1fa3-af81f8b1e753.png)

この結果のように、モデルの予測のアンサンブルと比較して、「Fisher Merging」は同程度のスコアとなっています。
これにより、アンサンブルに必要なモデル数の分、安価に予測結果を上げることに成功しています。
（この図では、アンサンブルに5つのモデルを使用しているため、5倍安価であるとしています。）

# まとめ

今回は、「Model soup」と「Fisher merging」の二つのモデルマージ手法を紹介しました。

今回紹介していない進化的マージ以外にも色々マージ手法があるみたいなので、順次紹介していきたいと思います。

コメントやフォローお待ちしております！
【UE5】ウィジェットのサイズの取得方法

# ウィジェットのサイズの取得方法
## Details の Slot に Size の項目がある場合（アンカーが縦にも横にも拡がっていない場合）
<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/e861e3c8-3d6a-dfaa-41c9-361286963908.png">

ウィジェットから ``GetSlot()`` して、そのウィジェットの親ウィジェットに合わせて ``Cast<>()`` して ``GetSize()`` する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/1c8bfef3-9dce-fa49-6720-b6d785bcd955.png">

## Details の Slot に Size の項目が無い場合（アンカーが縦か横に拡がっている場合）

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/233883b8-175e-48fc-fddd-61c39b6d5dd8.png">

ウィジェットから ``GetCachedGeometry()`` して受け取った ``FGeometry`` 構造体から ``GetAbsoluteSize()`` する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/aad421c0-6fe1-fe6e-e1f8-a6d6a1b2147e.png">

# その他
## 参考記事
https://dev.epicgames.com/documentation/en-us/unreal-engine/BlueprintAPI/Widget/GetCachedGeometry?application_version=5.1

https://dev.epicgames.com/documentation/en-us/unreal-engine/BlueprintAPI/UserInterface/Geometry/GetAbsoluteSize?application_version=5.1

# 最後に
## 株式会社ModelingXについて
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/4261f1c0-a380-01a9-9c69-08a836c6f02f.jpeg">

富山県を拠点とするスタートアップ企業、ModelingXは、2022年4月に創業し、「テクノロジーで感動体験を提供する」というミッションを掲げています。当社が開発中の暮らし体験メタバース「MELIFE（ミライフ）」は、バーチャル住宅展示場や銀行相談、家具購入、婚活などができる「地域単位の新たな経済圏」を目指しています。

↓サービスサイトはこちらから↓

https://melife.io/

ModelingXはリモートワーク＆フレックスタイム制を完備。
UnityやUEを共に探求する仲間を全国から募集しています。

↓企業詳細はこちら↓

https://modelingx.jp/