OmniAICreator/Qiita-1.07M huggingface dataset:
Clineでちょっとしたツールを作ってみたときの感想

Clineだけを使ってツールを書かせてみた。この過程で見えてきた、Clineの特徴や注意点をまとめます。

# コンテキストにない情報は知らない

期待するコードを書いてもらうには、その条件を漏れなく指示する必要があります。不足していた場合、その部分は適当に埋められてしまいます。

例えば、利用ライブラリの情報がプロンプトに含まれていない場合、既に特定のライブラリを使って書かれたコードがあっても、別のコードを書く時どのライブラリが使われるかは運任せです。

希望通りのライブラリが使われたとしても、非推奨となっている古い関数を使われることもあります。

実装済みの関数があっても、その関数の存在や利用意図が伝わらないと、関数を再実装し始めることもあります。

また、LLMはコンテキストが切り替わると全て忘れてしまうので、何度も同じ情報を含めて指示する必要があります。

同じ内容を毎回打ち込むのは面倒なので、設計ドキュメントを用意して毎回プロンプトに含めたり`.clinerules`を使ったりするのが、有効な方法となります。
ただ、この方法は次の問題とトレードオフの関係になっています。

# 無関係な情報を与えすぎると頭が悪くなる

Clineで何度指示を工夫しても解決しなかった問題が、Chatに必要最小限の情報だけを書いたら、一発で解決したことがありました。(全く同じモデルで)

何かのレポートにもありましたが、LLMはコンテキストが長くなるほど性能が下がる傾向にあり、特に関係のない情報が多く含まれると、それに惑わされるようです。

LLMの性能が下がるといっても、正直どのくらい下がるか分からないし、そもそもモデルの性能評価自体が難しいです。とりあえず、必要そうな情報は全て与えるのが良さそうに思えますが、このよく分からない性能が非常に重要なのでそうもいきません。

現状、問題を解決できなくて永遠にループする状態が、事実上AIの性能限界と言えます。
AIがスタックした場合、あきらめて手動で問題を解決するか、LLMが解決できるレベルにタスクを分解してあげる必要があります。

できるだけAIに独力で問題を解決させるためには、必要最小限の情報だけを与えるのが理想になりそうですが、手間をかけずにどう情報を与えるのか、このバランスを取るのが今後の課題になりそうに思います。

# まとめ

- コンテキストにない情報をAIは推測で埋めてしまうため、指示は詳細に行う必要がある
- 頻繁に必要となる情報はドキュメント化や`.clinerules`利用で手間を減らせる
- コンテキストに無関係な情報が多すぎるとAIの性能が低下する
- 最小限かつ適切な情報を与えるバランスが今後の課題
VSCodeでmarkdownファイルのCopilotを無効にする方法

## どういう記事？

最近GitHub CopilotがVSCodeで無料になりましたね！

https://github.com/features/copilot?utm_source=topcopilotfree&utm_medium=blog&utm_campaign=launch

僕のような「個人開発はできるだけ無料でやりたい！」というケチなエンジニアからするとめちゃくちゃ嬉しいことです(笑)

このようなCopilotの無料化、およびモデル自体の精度向上がきっかけで、多くのユーザがVSCodeにCopilotを導入して使い始めたのではないでしょうか？

ところが<b>Copilotをすべてのファイルで使いたいわけではない</b>、そんなユーザもいるわけです。

私の場合は開発ドキュメントをMarkdown (`.md` や `.mdx`) で書いてるのですが、Copilotの補完がムダに動いてしまい、「<b>ああ！そこは自分で書きたいから補完しないで..!</b>」とよくなります。

そこで特定のファイルに対してCopilotを無効にしたいと思い、やり方を調べてみました。

## やり方

### 設定画面から設定

VSCodeの設定から、特定ファイルのCopilotを無効にすることができます。

1. VSCodeの設定を開く
    ![スクリーンショット 2025-03-20 15.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579035/a19ca59c-56c7-4f89-9597-866674c7e400.png)

2. 検索バーに "copilot enable" と入力
3. "GitHub Copilot: Enable" の項目を見つける
　　![スクリーンショット 2025-03-20 15.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579035/4c623da4-5e7a-46c0-9f9e-a5d3577af04b.png)

4. "Language" の設定で `markdown` をfalse(無効)にする
    - `mdx`と指定すると、`*.mdx`に対して無効にできる
    ![スクリーンショット 2025-03-20 15.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579035/e786a29b-9d54-4ab5-8ffb-8b064c3b1f5d.png)

5. 設定したファイルを開いて確認する
    - フッターにあるCopilotのマークに斜線が入ってるはずです
    ![スクリーンショット 2025-03-20 16.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579035/c89e9ef1-4728-401e-8c1e-78ad3af0a2f3.png)

:::note info
もしCopilotが無効にならない場合はVSCodeの再起動を試してみてください
:::

:::note info
設定可能なlanguageはhttps://code.visualstudio.com/docs/languages/identifiers を参照すること
:::

### 設定ファイルから 拡張子単位 で無効化

VSCodeの設定ファイル (`settings.json`) を編集することで、`.mdx` などの拡張子にも適用できます。

1. `Ctrl + Shift + P` を押し、"Preferences: Open Settings (JSON)" を検索して開く
2. 以下の設定を追記

   ```json
   {
     ...
     "github.copilot.enable": {
       "markdown": false,
       "mdx": false
     }
     ...
   }
   ```

3. 保存してVSCodeを再起動

## さいごに

みんなもGithub Copilotとお友達になろう！！！
EXCEL VBA が好き！

## 概要
私は EXCEL VBA が大好きです。
## 詳細
### 画面を作成できる
画面が容易に生成できる。

![Qiita 画面 転送 VBA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/cae6366c-40b1-4cf1-aa2e-6d8fd6f69fd1.jpeg)

### 変数名や関数名に日本語が使用できる
プログラムの内容を思い出し易いので保守が楽。日本語のコメントが少なくて済む。
Qiitaのシンタックスチェックでは日本語がエラーになりますね(笑)
```vb
Private m_fso As New Scripting.FileSystemObject
Private m_tsoファイル一覧 As Scripting.TextStream

Private Sub 作成ファイル一覧()
    Dim strフォルダ As String
    Dim fdo As Scripting.Folder

    Set m_tsoファイル一覧 = m_fso.CreateTextFile("D:\ファイル一覧.txt")
    strフォルダ = "D:\MyDocuments"
    Set fdo = m_fso.GetFolder(strフォルダ)
    探索 fdo
    m_tsoファイル一覧.Close
End Sub

Private Sub 探索(fdo As Scripting.Folder)
    Dim fdoSub As Scripting.Folder
    Dim flo As Scripting.File
    
    For Each fdoSub In fdo.SubFolders
        探索 fdoSub
    Next
    For Each flo In fdo.Files
        m_tsoファイル一覧.WriteLine flo.Name
    Next
End Sub
```
### With が便利
文が短くなるので書き易くて読み易い。処理の区分がわかり易い。
```vb
    Dim intRowIndex As Integer
    With WorkSheets(1)
        intRowIndex = 2
        Do Until .Cells(intRowIndex, 1) = ""
            .Cells(intRowIndex, 3) = .Cells(intRowIndex, 1) + .Cells(intRowIndex, 2)
            intRowIndex = intRowIndex + 1
        Loop
    End With
```
### 清書してくれる
```vb
入力: a=A+1
清書: A = A + 1
```


### 実行中にソースを修正できる
中断点で実行を止めて変数の内容を確認し、ソースを修正して実行を継続することができる。
したがってプログラムを短時間で完成させることができる。
### 命令、変数名、関数名に大文字小文字の区別がない
英字の大文字と小文字を区別しなくてもよいので、それによるプログラムの間違いが発生しない。
### EXCELのワークシートに情報を保持できる。
プログラムと情報を1つのブックに纏めることができるので資材の管理がしやすい。
操作方法や保守ドキュメントも纏めることができる。
### 日付が扱い易い
DateAdd, DateDiff, DateValue, Year, Month, Day, Weekday, Format など日付を扱う関数が充実している。
## まとめ
EXCEL VBAは個人や少人数のチームで使うツールとしては最高だと思います。
メインの仕事を持っていてツールとして使うにはとても良いと思います。まさにツールと呼べるものです。
【初心者の備忘録】Javascriptのコードでaタグを更新するのが大変だった話

　Javascriptのコードでhtml上のaタグの更新を行うことについて、割と苦労してしまったので、苦労した点も含めて備忘録として掲載する。

 ## この記事の中でやりたいこと
　この記事の中で作りたい機構というのは、以下のようなものである。
 1. JSONファイルの中にあるリンクの文字列を受け取る
 2. parseを行い、適切な変数に代入する
 3. 更新する対象は、hrefおよび表示する文字列とする(リンクの文字列を表示)
 4. html上の特定のaタグを更新する(以下のような書き方をされているものとする)
 ```html
 <a id="received-url" href="#" target="_blank" rel="noopener noreferrer"></a>
 ```
 　※なお、表示する文字列については「一定の長さ以上になっている場合は、それ以上表示せずに、...という形で省略する」というCSSを書いておくこととする。


## aタグ上でJSONのリンク文字列に更新するコード(javascript)
　Pure JavascriptとJQueryのどちらの記法でも、これを再現することは可能であるが、結論から述べると、JQueryの記法を用いた方がシンプルではある。以下にJQueryでそれを実現する関数のコードを示す。

 ```js
 function updateLinkURL(url) {
  $.getJSON(url, function (json) {
    let receivedURL = json.receivedURL;

    // expandedURLを使用してhrefとtextContentを更新
    $("#received-url").attr("href", receivedURL);
    $("#received-url").text(receivedURL);
  });
}
 ```



## 一定の長さ以上の場合に...で省略するCSS(aタグ)
　これのCSSを書いていくにあたって、一つトラップがある。それはaタグにおいて、「**display: inline がデフォルトの値である**」ということだ。これがあることによって、widthとheightが指定できない。下記の...で省略する書き方をそのまま適用しても効かないのである。

**参考サイト**
<https://zenn.dev/itayuri/articles/51f0004a3bad64>

 ```css:修正前
 #received-url {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
 ```
　今回適用した解決策としては、「他のサイトへジャンプするリンクである」ことを踏まえると、特にインライン要素である必要が皆無であるため、**display: block**を適用する、という方法である。「一定の長さ」というのは場合によるが、今回は「最大でも300pxまで、あとは表示が省略される」という条件を採用した。したがって、以下のように修正できる。
 
```css:修正後
#received-url {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 300px;
}
```

## 一言
　インライン要素であることを見逃してしまうと、デザインで四苦八苦してしまうので、そういった仕様は覚えていきたい。
【JavaScript】ABC396感想（A~E）

AtCoder Beginner Contest 396

https://atcoder.jp/contests/abc396

お久しぶりです。
最近ブログというか競プロそのものにかける時間がほとんど取れず、二週間ABCをお休みしていました。
2,3日前にABC396をバチャでやっと走れたので、今回はその「感想」として、どんなことを考えながら解いたのかを簡単にまとめたいと思います。（解説要素はほぼないので、感想です）

結果、ABCDの4完（33分0ペナ）でした。
unratedですが、AC predictorによると1162perfらしいです。
今回はA~Eまでの感想を述べていきます。

# A - Triple Four
https://atcoder.jp/contests/abc396/tasks/abc396_a

問題文の「より厳密には〜」以降をそのままプログラムに書けば良いですね。
良心的な問題です。

# B - Card Pile
https://atcoder.jp/contests/abc396/tasks/abc396_b

山札の一番上しか参照しなくて良いということで、スタックで十分そうです。
また、クエリ2では必ず山札にカードがあることが保証されているので、特に例外的な処理も書く必要がなさそうですね。

# C - Buy Balls
https://atcoder.jp/contests/abc396/tasks/abc396_c

黒のボールが白のボールと同じか、それより多くなければなりません。
一見、$B_i$と$W_i$がどちらも正のものだけ取り出して、黒のボールが白のボール以上であるように白のボールのうち値が小さいものから減らして調整すればよいのではないかと思うかもしれませんが、値がマイナスの黒のボールを選んだ時に最適となるような組み合わせもあるのでそう簡単ではありません。

実は、次のようなアルゴリズムで最適な値を得ることができます。
1. $B,W$を降順にソートする
1. $B_w+W_w≧0$かつ$W_w≧0$を満たす限りインデックス$w$を進める
1. その後、$b=w$とした後、$B_b≧0$を満たす限りインデックス$b$を進める
1. $B_b+W_w$を得る。これが求める最適値である。

# D - Minimum XOR Path
https://atcoder.jp/contests/abc396/tasks/abc396_d

これは計算量解析が難しいのですが、ただの`dfs`で間に合いました。
`JavaScript`では$10^{15}$以上のxor計算が遅すぎるので、こっそりと`Python`を使って`AC`しました笑

# E - Min of Restricted Sum
https://atcoder.jp/contests/abc396/tasks/abc396_e

1時間の長考の末、全くわかりませんでした笑
なんとなく、整数列を頂点、$A_i$を頂点$i$の重み、$Z_i$を$A_{X_i}$と$A_{Y_i}$を結ぶ辺の重みとしてグラフとして考えた時に、連結頂点のうち一つは$A_x=0$となるようなゼロ点$x$を含む、閉路が一つでもある場合は閉路内の頂点のxor和が0でなければ破綻する、などの必要条件が思い浮かびましたが、結局$A_x=0$として最適な値を得る頂点$x$の高速な求め方がわかりませんでした。
解説を見ていないので方針から間違っているかもしれません笑


# まとめ
10日ほど競プロから離れていた割には高いperfが出ていましたが、水色に全く歯が立たないのは悔しいです。
また、ABC397も解いて感想をupする予定です。
少し精進ペースは落ちますが、今後も引き続き頑張っていきます
[PyTorch] RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn 発生

# エラー内容

```bash
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
```

# 原因

この記事にも書いてあるのですが、

https://discuss.pytorch.org/t/runtimeerror-element-0-of-variables-does-not-require-grad-and-does-not-have-a-grad-fn/11074/84

勾配情報が載っていない tensor 型の変数に対して `.backward()` を実行すると、このエラーが発生しました。

loss の計算の途中の値に対して以下のような記述をしていると、そのエラーが発生します。

- `with torch.no_grad():` ブロックで囲む
- `.detach()` メソッドを読んでいる
- `.requires_grad = False` で勾配計算を無効にしている

# 参考

ちなみに自分の場合は、 loss 計算の途中の中間変数に `.detach()` を実行してしまっていました。

見直してみましょう( ˘ω˘)ｽﾔｧ...
EXCEL VBA エクスプローラと同じソート

### プログラム

FileSystemObject オブジェクトで取得したファイル名をエクスプローラと同じ順序でソートします。

ファイルは "D:\Temp" フォルダにあると仮定します。
File_A1.txt
File_A2.txt
File_A10.txt

ファイル名は Collection オブジェクトに格納してソートします。

```vb
' 32 bit
Private Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As Long, ByVal lpStr2 As Long) As Long
' 64 bit
' Private Declare PtrSafe Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As LongPtr, ByVal lpStr2 As LongPtr) As Long

Private Sub 作成ファイル一覧()
    Dim fso As New Scripting.FileSystemObject
    Dim fdo As Scripting.Folder
    Dim flo As Scripting.File
    Dim strFolder As String
    Dim colファイル一覧 As New Collection
    Dim intIA() As Integer
    Dim i As Integer
    
    Debug.Print "開始"
    strFolder = "D:\Temp"
    Set fdo = fso.GetFolder(strFolder)
    For Each flo In fdo.Files
        colファイル一覧.Add flo.Name
    Next

    Debug.Print "ソート前"
    ReDim intIA(colファイル一覧.Count - 1)
    For i = 0 To UBound(intIA)
        intIA(i) = i + 1
        Debug.Print colファイル一覧(intIA(i))
    Next i

    自然順ソート intIA, colファイル一覧

    Debug.Print "ソート後"
    For i = 0 To UBound(intIA)
        Debug.Print colファイル一覧(intIA(i))
    Next
End Sub

Private Sub 自然順ソート(intIA() As Integer, colファイル一覧 As Collection)
    Dim i, j, max, tmp As Integer
    
    max = UBound(intIA)
    For i = 0 To max - 1
        For j = i + 1 To max
            If StrCmpLogicalW(StrPtr(colファイル一覧(intIA(i))), StrPtr(colファイル一覧(intIA(j)))) > 0 Then
                tmp = intIA(i): intIA(i) = intIA(j): intIA(j) = tmp
            End If
        Next j
    Next i
End Sub
```

### 結果

```vb開始
開始
ソート前
FILE_A1.txt
FILE_A10.txt
FILE_A2.txt
ソート後
FILE_A1.txt
FILE_A2.txt
FILE_A10.txt
```
Contact Form 7 の画面遷移が動かない原因と解決策

WordPress で Contact Form 7 を使用してお問い合わせフォームを作成した際に、
送信完了後に特定のページへ遷移させようとしたが、正常に動作しないという問題が発生しました。

# 1. 発生したエラー

お問い合わせページに以下の JavaScript を埋め込んだところ、確認画面に遷移できませんでした。
```php
<script>
    // 「ご依頼にあたってのお願い」に同意のチェックをつけた時に、ボタンを有効化する。
    const checkbox = document.getElementById('check-box');
    const sendingButton = document.getElementById('sending-btn');

    // チェックボックスの状態が変更されたときの処理
    checkbox.addEventListener('change', function() {
        // チェックボックスが選択されているかどうかでボタンの有効/無効を切り替え
        sendingButton.disabled = !this.checked;
    });

    // お問い合わせ 完了画面遷移
    document.addEventListener('wpcf7submit', function(event) {
        location = './contact-thanks/';
    }, false);
</script>

```

ブラウザのデベロッパーツールのコンソール (F12 → Console タブ) を開き、エラーが発生していないか確認すると、
チェックボックスの状態が変更されたときの処理部分で、下記のエラーが発生していました。
```
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
```


# 2. スクリプトの実行順序の問題

`script`タグ内の処理が、**ページの DOM が完全に読み込まれる前に実行される**と、 `document.getElementById('check-box')` は null になります。

そのため、**DOMContentLoaded イベント**を使い、ページの読み込みが完了してからスクリプトを実行する必要があります。

# 3. 修正コード

以下のように修正することで、スクリプトが DOM の読み込み完了後に実行され、エラーを回避できました。

``` php
<script>
    document.addEventListener('DOMContentLoaded', function() {
        // 要素の取得
        const checkbox = document.getElementById('check-box');
        const sendingButton = document.getElementById('sending-btn');

        // 要素が存在する場合のみイベントリスナーを設定
        if (checkbox && sendingButton) {
            checkbox.addEventListener('change', function() {
                sendingButton.disabled = !this.checked;
            });
        } else {
            console.error("チェックボックスまたは送信ボタンが見つかりません。");
        }

        // お問い合わせ 完了画面遷移
        document.addEventListener('wpcf7mailsent', function(event) {
            location.href = './contact-thanks/';
        }, false);
    });
</script>
```

# 5. まとめ

`document.getElementById()` が null になる原因は 要素が存在しない or JavaScript の実行順が早すぎる場合があります。

DOMContentLoaded を使うことで、HTML の読み込みが完了してから JavaScript を実行できました。
M5Stack Core2同士でI2C通信する際の5Vの取扱い

## 結論
M5Stack Core2同士でI2C通信する際は、I2C用のPORT.A端子同士をそのまま接続してはいけない。
5V線を切断するなどして、接続する必要がある。

## はじめに
この記事では、M5Stack Core2同士でI2C通信を行う方法と注意点について説明します。I2C通信は、コントローラーとターゲット間でデータをやり取りするためのシリアル通信プロトコルです。
取引先から「M5Stackって簡単なんでしょ？ちゃちゃっと開発しちゃってよ(非システムエンジニアの戯言)」という流れになり、会社で初めてM5Stack Core2を触りましたが、結構難しかったです。というのも、電子回路を気にしなくて良い作りになっていることが災いして、回路的に接続して良いかの判断がしにくいと感じました。本末転倒ですが、マイコン単体であれば自分で電子回路も設計するため、このような迷いは無いでしょう。
とは言えM5Stackはとても便利で、開発速度が向上するのは間違いないと思います。そこで備忘録として、M5Stack Core2でI2C通信する際に電子回路的に注意すべき内容を残しておきます。

## 必要なもの
* M5Stack Core2 x 2台
* M5Stack用GROVE互換ケーブル

開発環境：Arduino IDE

## 配線
以下のように接続する。5Vの線は切断するか、繋がらないように工夫してSDA、SCL、GND同士を接続する。

![PXL_20250320_051451787~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/5883700f-f4ea-4547-895e-4643a6fff12d.jpeg)

![PXL_20250320_051605872~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/dc4a56ac-6039-4b33-b324-c19269a8e278.jpeg)
※写真は分かりやすいように中途半端な外し方をしています。実際は全て外すか端子部分を絶縁テープで覆ってください。

5V端子同士を接続してしまう場合、多分問題なく動くかもしれないが、もしかしたら回路が壊れてしまうかもしれないです。
5V端子は、昇圧レギュレーターICのアウトプット側に接続されています。昇圧レギュレーターICはリチウムイオンバッテリーの電圧を5Vに昇圧するものですが、全く正確な5Vを出力している訳ではありません。
そのため、5V端子同士を接続すると電位差が発生してしまい、片方の昇圧レギュレーターICはアウトプット端子に電圧がかかってしまう状態になります。
これですぐに破損はしないと思いますが、ICの想定と異なる使い方であることは間違いないです。

## コード

I2C確認用のサンプルコードです。以下のコードはChatGPT 4oで作成しています。

### コントローラー側のコード
コントローラー側のM5Stack Core2は、データを送信する役割を担います。
```cpp
#include <Wire.h>

void setup() {
  Wire.begin(); // I2Cバスを初期化
  Serial.begin(115200);
}

void loop() {
  Wire.beginTransmission(8); // ターゲットデバイスのアドレスを指定
  Wire.write("Hello, Target!"); // データを送信
  Wire.endTransmission(); // 送信終了

  Serial.println("Data sent to target.");
  delay(1000); // 1秒待機
}
```

### ターゲット側のコード
ターゲット側のM5Stack Core2は、データを受信する役割を担います。

```cpp
#include <Wire.h>

void setup() {
  Wire.begin(8); // ターゲットデバイスのアドレスを指定
  Wire.onReceive(receiveEvent); // データ受信時のイベントハンドラを設定
  Serial.begin(115200);
}

void loop() {
  delay(100); // メインループを少し待機
}

void receiveEvent(int howMany) {
  while (Wire.available()) {
    char c = Wire.read(); // 受信データを読み取る
    Serial.print(c); // シリアルモニタに出力
  }
  Serial.println();
}
```

## 動作確認
コントローラー側とターゲット側のM5Stack Core2にそれぞれのコードを書き込みます。
また、両方のM5Stack Core2を接続し、電源を入れます。
Arduino IDEのシリアルモニタを開き、ターゲット側のM5Stack Core2が「Hello, Target!」というメッセージを受信していることを確認できれば成功です。

![m5stack_i2c_target.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/00f8fa52-d69a-4f42-abb5-7721d6656c3c.png)

## まとめ
この記事では、M5Stack Core2同士でI2C通信を行う際の注意点を記載しました。仕事で用いて使いやすかったので個人的にも買おうと思ったのですが、約1万円もするんですね...。それならESP32を普通に買った方が良いかも...。
【C#】Parallelを用いた並列処理の方法_IO編


# C#で並列処理をする方法\_IO 編

ファイル IO を使用した処理を並列化した際にどうなるか検証します。

基本的な内容は[並列処理の方法](https://qiita.com/KM_20005/items/4f6edd0121843a8f89eb)で検証したため、今回は IO 入力が含まれる処理を並列化した場合にどうなるか検証します。

## 確認方法

### 対象処理

ループ内で対象のテキストファイルを指定のフォルダにコピーする処理です。

```CSharp
static void UseNormalForLoopIO()
{
    var outputFolderPath = BaseOutputFolderPath + "/NormalForLoop";

    // 出力先ディレクトリがすでに存在している場合は1度削除してから再作成
    if (Directory.Exists(outputFolderPath))
    {
        Directory.Delete(outputFolderPath, true);
    }
    Directory.CreateDirectory(outputFolderPath);

    for (int i = 0; i < CopyCount; i++)
    {
        // あらかじめ作成しておいたテンプレートファイルをコピー
        var outputFilePath = outputFolderPath + $"/output_{i}.txt";
        File.Copy(FilePath, outputFilePath);
    }
}
```

### 測定方法

前回使用した測定用のメソッドをそのまま使用します。
試行回数は 3 回で、各時間の平均をとります。

## 結果

| 使用した処理 | 処理時間 |
| ------------ | -------- |
| for          | 4555ms   |
| Parallel.For | 3012ms   |

約 3 割程処理時間が短くなることがわかりました。
このことより外部リソースを使用しているような処理でも並列化が可能なことを確認しました。

ただし IO 入力にかかる時間自体は短くならない事があるため、普通の処理を並列化した時より効果が薄かったです。

## おわりに

前回に引き続き処理並列化の方法およびその効果を検証しました。最適な方法をさらに模索していきたいと思います。

この記事が皆様のコーディングライフの助けになれば幸いです。

## 参考

使用したソースコード

https://github.com/KM5075/PrallelForLoopIO
JavaScriptで単一メソッドのオブジェクトを作成する関数

この記事では、単一のメソッドのみを持つオブジェクトを動的に作成する関数monoMethodObjを紹介します。
この関数を使うと、関数名と処理内容を指定するだけで、簡潔なオブジェクトを生成できます。

## 定義
```js
const monoMethodObj = (name = "_", fnc = v => v) => ({ [name]: fnc });
```
## 使用例
```js
const x = monoMethodObj("add", (v1, v2) => v1 + v2);
console.log(x.add(11, 21));
```
## 表示結果
```text
32
```
## まとめ
monoMethodObjを使うことで、単一のメソッドのみを持つオブジェクトを動的に作成して活用できます。
【SharePoint】リストを作成してみよう！

## はじめに
SharePoint にリストを作成する手順を説明していきます！

## 手順
**1. Micosoft365 にサインイン**

**2. Share Point を開く**
左側のメニューから `Share Point` を選択しリストを作成したいサイトを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/22b46920-3dc3-4ad5-a969-08273a8bdc9d.png)

**3. リストを作成**
サイトのホームにある `+ 新規` を選択して `リスト` を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/61373268-b4e0-4316-b6d4-530744f7f0a8.png)

以下のいずれかからリストを作成できます。
今回は `空白のリスト` を選択し、リスト名を入力後 `作成` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/f345ea97-6f90-4843-b9d6-cd8e5569c85d.png)

**4. カラム（列）を追加**
追加したいデータの種類を選択します。
種類の選択後、列名を入力し `保存` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/7c381d2e-fdc5-4752-8c69-c1ba8669659a.png)

データの種類例は以下になります。

| 種類 | 使用例 |
|:-:|:-:|
| 1行テキスト  | 氏名、商品名など  |
|  選択肢 |  カテゴリ、ステータスなど |
|  日付と時刻 | 申請日や承認日など  |
|  複数行テキスト | 備考など  |
|  ユーザー |  組織内のユーザーまたはグループ名 |
|  数値 | 価格、数量など  |
| はい/いいえ  | フラグ  |

`4` の工程を必要列数、繰り返していきます。

**5. データを作成してみる**
リスト内の `+ 新しいアイテムを追加` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/836a2840-a562-4b94-ac80-9f79f182703a.png)

`4` の工程で作成した列の入力リストが表示されるので
必要事項を入力したら `保存` を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/ac66fa31-fac4-4bc2-8c02-b13ac034e606.png)

保存が完了すると以下のように新しくアイテムが追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/f724396b-e96c-4658-881e-b2d56ca11dfe.png)


## さいごに

以上が Share Point でのリストの作成方法になります！
リストが作成できたら Power Apps や Power Automate を活用して
各種申請状況や在庫状況の管理アプリなどを作成していくとデータ管理や業務がスムーズになります！！

Power Automate や Power Apps の連携については随時更新していきます！
ご覧いただきありがとうございました:star:
Teamsのチャネルに配置しているOnte Noteのページを別のチャネルのOne Noteにコピーする方法

# 概要
Teamsのチャネルの「ファイル」タブに配置しているOnte Noteのページを、別のチャネルにあるOne Noteにコピーする方法を記載しました。

# 方法
1. One Noteをアプリケーションモードで開きます。
1. 右上の<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/bebc767f-b55a-4c75-81f3-c377d39f656a.png" width=10%>アイコンをクリックします。
1. すると「ノートブック」が表示されるので、コピーしたいページがあるノートブックを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/aafefcab-2d5d-4bee-99ae-f2c5eb3d9d9d.png)
1. 選択したいページを右クリックし、コピーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/427a379e-7a1f-40c6-8023-db39c2ec8874.png)
1. コピー先のノートブックを選択します。(ここで、コピー先となる別のチャネルのOne Noteを選択します)
1. コピー先のセクションを選択し、ページのポップアップ部分で右クリックすると、貼り付けることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/714160d0-012f-43a6-897b-291e8e7df5c1.png)

# 終わりに
One NoteをTeamsで開いたり、ブラウザで開いていると別のノートへのコピーができなさそうでした。(機能を探し切れていない可能性もありますが。。)
アプリケーションモードで開くと簡単に別ノートにページをコピーすることができたので、備忘録として記載しました。
Unity WebGLをAzure SWA ルーティング設定してデプロイする

# 概要
- UnityのWebGLを静的Webアプリに`https://SWAのURL/aapp` 、`https://SWAのURL/bapp`というように、URLで分けてデプロイしたい場合の覚書
- 例えば、モバイルとXRデバイスとかで分けたり

# 前提
- Unity Project作成済み
- SWA作成済み
- Github ActionsでSWAへのデプロイ設定済み

# ビルド
UnityでWebGLをaappとbappのディレクトリ配下にビルドします

```
/project-root
  ├── aapp/
  │     ├── index.html
  │     ├── Build/
  │     ├── TemplateData/
  ├── bapp/
  │     ├── index.html
  │     ├── Build/
  │     ├── TemplateData/
```


# staticwebapp.config.jsonの追加
- /project-rootにstaticwebapp.config.jsonを追加する
https://learn.microsoft.com/ja-jp/azure/static-web-apps/configuration#routes
```json
{
  "routes": [
    {
      "route": "/aapp",
      "serve": "/aapp/index.html"
    },
    {
      "route": "/aapp/Build/{file}",
      "serve": "/aapp/Build/{file}"
    },
    {
      "route": "/aapp/TemplateData/{file}",
      "serve": "/aapp/TemplateData/{file}"
    },
    {
      "route": "/bapp",
      "serve": "/bapp/index.html"
    },
    {
      "route": "/bapp/Build/{file}",
      "serve": "/bapp/Build/{file}"
    },
    {
      "route": "/bapp/TemplateData/{file}",
      "serve": "/bapp/TemplateData/{file}"
    }
  ],
  "mimeTypes": {
    ".wasm": "application/wasm",
    ".data": "application/octet-stream",
    ".js": "application/javascript",
    ".css": "text/css",
    ".ico": "image/x-icon"
  }
}

```

# ルートにindex.htmlを追加する
- ルートにindex.htmlがないと、デプロイ中にエラーが出るため、追加しておく
    - 中身は適当で..

- 最終的にこのようになります

    ```
    /project-root
      ├── aapp/
      │     ├── index.html
      │     ├── Build/
      │     ├── TemplateData/
      ├── bapp/
      │     ├── index.html
      │     ├── Build/
      │     ├── TemplateData/
      ├── staticwebapp.config.json
      ├── index.html
    ```
  
# index.html の修正
- Unityでビルドしたindex.htmlを変更し、各環境で正しくリソースを読み込むようにする
    - 各パスに`aapp`を追加。bappも同じことします
```html
    <link rel="shortcut icon" href="aapp/TemplateData/favicon.ico">
    <link rel="stylesheet" href="aapp/TemplateData/style.css">

```

```js
      var buildUrl = "aapp/Build";
      var loaderUrl = buildUrl + "/aapp.loader.js";
      var config = {
        dataUrl: buildUrl + "/aapp.data.br",
        frameworkUrl: buildUrl + "/aapp.framework.js.br",
        codeUrl: buildUrl + "/aapp.wasm.br",
        streamingAssetsUrl: "StreamingAssets",
        companyName: "DefaultCompany",
        productName: "TestSwaWebgl",
        productVersion: "0.1.0",
        showBanner: unityShowBanner,
```

# デプロイ
- あとはGithub ActionsでSWAにデプロイ
- 完了後に`https://SWAのURL/aapp` 、`https://SWAのURL>/bapp`にアクセスするとそれぞれのUnityアプリが動作します
    - キャッシュで上手くいかない場合はシークレットウインドウとかで試してください

# まとめ
- ルーティング設定はSWAに限らずもっと一般的な機能だと思うので覚えてて損はないかと
- SWA × Github Actionsデプロイ初見だったけど、SWA側でポチポチ設定できたので楽でした
- https://<SWAのURL>にアクセスした場合はリダイレクトするなり考えんといかんなぁ..
Unity-Cast Shadowsとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007510/1e65f7ac-0f91-4254-9a79-3b9a97f2ca49.png)
## Unityの`Cast Shadows`とは？影の描画設定を徹底解説

Unity の **`Cast Shadows`** は、**オブジェクトが影を落とすかどうかを設定するプロパティ** です。`Mesh Renderer` や `Skinned Mesh Renderer` に含まれており、ライトの影響を受けて影を生成するかどうかを制御します。

---

## `Cast Shadows` の設定オプション

`Cast Shadows` には、以下の 4 つのオプションがあります。

| **設定値** | **説明** |
|------------|----------|
| **On** (デフォルト) | **常に影を落とす**（リアルな環境向け） |
| **Off** | **影を落とさない**（パフォーマンス向上、UIや一部オブジェクト向け） |
| **Two Sided** | **両面に影を落とす**（ポリゴンの裏側からも影を作る） |
| **Shadows Only** | **オブジェクト自体は表示せず、影だけを表示** |

---

## `Cast Shadows` の使い分け

✅ **通常のオブジェクト（プレイヤー・建物・アイテム）**
→ `On`（デフォルト）でOK。**自然な影を作れる。**

✅ **ガラスやエフェクトなど、影が不要なオブジェクト**
→ `Off` にすると影が消え、**パフォーマンス向上**。影がちらついたりしている場合に、消したりする（画像の場合、銃の影が銃の表面でちらついていたので`Off`にすることでちらつきをなくした。また、一人称視点のPlayerであるCapsuleの影が銃を暗くしていたのでそれをなくした。）

✅ **葉っぱや薄いオブジェクト（裏面からも影が必要な場合）**
→ `Two Sided` を選ぶと、**薄いオブジェクトも正しく影を落とせる。**

✅ **透明なオブジェクトの影だけを描画**
→ `Shadows Only` にすると、**影だけを残してオブジェクトを非表示にできる**。

---

## `Cast Shadows` の設定方法

### **① Unity エディタで設定**
1. **オブジェクトを選択**（`Mesh Renderer` または `Skinned Mesh Renderer` がある）
2. **Inspector で「Cast Shadows」オプションを変更**

### **② スクリプトで設定**
```csharp
using UnityEngine;

public class ShadowControl : MonoBehaviour
{
    void Start()
    {
        // Mesh Renderer を取得
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        // 影を落とす（デフォルト）
        meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;

        // 影を落とさない
        // meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

        // 両面に影を落とす
        // meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.TwoSided;

        // 影だけを表示
        // meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
    }
}
```

---

## `Cast Shadows` を使う際の注意点

⚠️ **影を増やしすぎるとパフォーマンスに影響！**
特に**モバイルやVR環境**では、影の描画は負荷が高いので、**不要な影は `Off` にするのが推奨**。

⚠️ **リアルタイムシャドウは負荷が高い**
影をリアルタイムで描画すると処理が重くなるため、**静的な影は「ベイクド（Baked Shadows）」を使うと軽量化**できる。

---

## まとめ

✅ **`Cast Shadows` はオブジェクトが影を落とすかどうかを制御する設定**  
✅ **デフォルトは `On`（影を落とす）だが、用途に応じて変更するとパフォーマンス向上**  
✅ **スクリプトでも制御可能**  
✅ **影の計算は重いので、適切に設定することでゲームの最適化が可能！**
Windowsで作ったプロジェクトをgithubにアップロード

---

# Gitの設定とSSH鍵の生成・リモートリポジトリへのPush
:::note warn
警告
私はプログラミングも記事を書くのも初心者ですので、記述内容に注意してください。
:::
Gitの設定からSSH鍵の作成、GitHubへの接続確認、そしてローカルリポジトリからリモートへのPushまでの手順をまとめました。

## 0. 環境、前提について

### 0.1 前提
windowsでソフトウェアを作ったが、githubにアップロードしてみたい人向け

### 0.2 環境
wsl(Ubuntu)もしくはwindowsにgit bashがインストールされていることが必要です。wslの場合デフォルトでgitがインストールされています。
また、githubのアカウントを作っておいてください。


## 1. Gitの設定
以下のコマンドでGitのユーザー名とメールアドレスを設定します。

```git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
```
これでcommit（変更の記録）をするときの著者名とメールが自動で設定されます。

## 2. SSH鍵の生成
GitHubとSSH接続するために、SSH鍵を生成します。

```sh
ssh-keygen -t ed25519 -C "your.email@example.com"
```

次に、作成した秘密鍵をSSHエージェントに追加します。

```sh
ssh-add ~/.ssh/id_ed25519
```

SSHエージェントが動作していない場合は、以下のコマンドで起動します。

```sh
eval $(ssh-agent -s)
```

公開鍵の内容を確認し、GitHubのSSHキー設定画面に追加します。githubの右上のアカウントアイコンからsettingにアクセスし、SSH and GPG keyというセクションからアップロードしてください。

以下は公開鍵をcatで出力しています。

```sh
cat ~/.ssh/id_ed25519.pub
```

## 3. SSH接続の確認
以下のコマンドでGitHubとのSSH接続を確認します。

```sh
ssh -T git@github.com
```

成功すると、以下のメッセージが表示されます。

```
Hi your-github-username! You've successfully authenticated, but GitHub does not provide shell access.
```

## 4. リモートリポジトリへのPush
ローカルからリモートリポジトリへファイルをプッシュする手順です。ここからはアップロードしたいディレクトリに移動して作業してください

### 4.1 プロジェクトをgitリポジトリ化する
アップロードするディレクトリをgitレポジトリにします。git addで記録させるファイルを選びます。git commitで記録させます。

```git
git init -b main //.gitファイルの作成（これでgitレポジトリとなる）
git add --all //全てのファイルを追加
git commit -m "initial commit" //記録
```

### 4.2 リモートにアップロード

#### 4.2.1 githubでリモートリポジトリを作成
右上のアイコンのメニューからyour repositoriesに移動して、Newボタンから作成してください

#### 4.2.2 githubにアップロード
以下のコマンドの`@git@github.com:<ユーザー名>/<リモートリポジトリ名>.git`は、githubのレポジトリから緑色のcodeボタンからも取得できます。

```git
git remote add origin git@github.com:<ユーザー名>/<リモートリポジトリ名>.git
git push -u origin main
```

これで、ローカルリポジトリの変更がリモートリポジトリに反映されます。

---

## まとめ

この記事では、Gitの基本的な設定からSSH接続、リモートリポジトリへのプッシュまでの流れを紹介しました。Gitを使いこなすための第一歩として活用してください。

---

### 参考資料
- [Git公式ドキュメント](https://git-scm.com/)
- [GitHub SSH接続の設定](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)
CSSのgapを反映させるにはdisplay: flex;が必要だった話

CSSの`gap`プロパティは、要素間の間隔を簡単に調整できる便利な機能ですが、
期待通りに動作しないことがあります。
特に、**`display: flex;`や`display: grid;`を指定していない場合、`gap`を設定しても反映されません**。

# 1. gapが効かないケース

単に`gap`を指定しても間隔が空かないことがあります。
これは、`gap`が適用されるのが**flexコンテナまたはgridコンテナ**に限られるためです。

## 2. display: flex; を追加すると解決！

`gap`を正しく反映させるには、`display: flex;`を指定する必要があります。

また、`grid`を使用する場合も同様に`gap`が有効になります。

# 3. gapを適用したい場合の注意点

`gap`は`display: flex;`または`display: grid;`の要素にのみ適用される。

`inline-flex`や`inline-grid`でも`gap`は適用可能。

`display: block;`や`inline-block;`では`gap`は反映されない。

# まとめ

✅ `gap`は `flex` や `grid` のコンテナでないと適用されない。
✅ `display: flex;` を追加すると、要素間の間隔を簡単に調整できる。
✅ `grid`でも同様に `gap` を適用可能。

CSSの`gap`を使うと、余白調整がシンプルになるので、ぜひ活用してみてください！
アナログおじさんになりつつあって焦っている話

## はじめに

先日、「Devin使ってみてどうだった？ ～活用事例と導入時のポイント～」というオンラインイベントに参加しました。

そこで「そもそもおじさん👨生成AI使いこなせてないよ〜😅」となってしまいました…😇

今回は、そのイベントを通して感じたことや反省点を整理し、どうすれば生成AIをもっと活用できるのかを考えてみます。

※ 自分なりの解釈も入っているため、本来の意図とは異なる記述をしてしまっているかもしれません。その点はご了承ください🙇

## 生成AIを使いこなせてない理由

### 1. そもそも使用回数が少ない

イベントでは「とにかくAIに何でも任せることが重要」という話がありました。

自分はこれまで「プロンプト考えるならやった方が早そうだな...」などと考えてしまい、最初から試すことすらしていないことが多かったのですが、それではいつまで経っても使えるようにならないなと感じました。

最初から完璧な使い方を求めるのではなく、とにかく試しながら学んでいくべきだなと反省しました。

### 2. 使ったことある種類も少ない

また、イベントでは「生成AIはそれぞれ得意なことが違うので、組み合わせて使うのが良い」という話もありました。

それを実践するには、それぞれの得手不得手を知るために情報収集をして、さらに実際に使ってみるということが重要になります。

しかし、自分は「とりあえずChatGPTを使う」くらいの意識しかなく、他の生成AIを使ってみようとしたことがありませんでした。これも、生成AIをうまく使いこなせていない要因の一つだったと感じています。

### 3. タスク依頼が下手＆試行錯誤が足りてなかった

イベントでは「AIへの頼み方も工夫すべき」という話がありました。

基本的に生成AIはざっくり指示してもある程度の作業をしてくれるそうですが、具体的な指示を与えることでより精度の高い結果が得られるとのことでした。

自分は「タスクを依頼してもうまく動かないな…」と感じることがありましたが、それは適切に指示を出せていなかったからかもしれません。色々と試行錯誤しながら、より良い指示の仕方を学んでいく必要があるなと感じました。

## 生成AIを使いこなすために必要なこと

### 1. まずは試す！小さく任せる！

生成AIをうまく使うためには「まず試す」ということが何よりも大切だと感じました。

特に、

- 最初から大きなタスクを任せずに、小さな作業から試していく
- AIの得意・不得意を把握しながら、徐々に依頼範囲を広げていく

といったアプローチが効果的だと感じました。

### 2. AIが失敗する環境 = 人間も失敗する環境

イベントでは「AIが失敗するのはドキュメントや環境が整っていないから」という話がありました。

これは、人間の新人エンジニアがうまく仕事を進められない理由と同じとのことでした。つまり、

- AIをうまく活用するには、作業環境やドキュメントを整えることが重要
- これは結果的に新人エンジニアにとっても働きやすい環境を作ることにもなる

ということになります。

「AIが失敗するポイントを洗い出し、それを改善していく」のを続けていくことで、組織全体の生産性向上にもつながると感じました。


## まとめ

今回のイベントを通じて、

- 生成AIは「まず試す」ことが何よりも大事
- AIごとの得意分野を理解し、適切に使い分ける
- AIが働きやすい環境を整えることが、人間にとっても良い環境になる

といった学びを得ました。

「アナログおじさん👨」にならないために、これからはもっと積極的に生成AIを試していきたいと思います！
Dockerで`exec format error`が発生する原因と対策

## エラー概要

AWS EKS上で作成したDockerイメージを起動しようとした際に、以下のエラーが発生。

```
exec /usr/local/bin/docker-entrypoint.sh: exec format error
```

## 環境
CPUアーキテクチャ
ビルドマシン: arm64（Apple Silicon / M1, M2 Mac）
実行マシン: amd64(EC2)

## 原因

このエラーの主な原因は、Dockerイメージのアーキテクチャと実行環境のアーキテクチャが一致していないこと。

今回のケースでは、Apple Silicon Mac（ARM64）でDockerイメージをビルドし、異なるアーキテクチャ（x86_64）上で実行しようとしたことが原因。

```bash
# ビルド時のコマンド
docker build --platform linux/arm64 -t xxxx .
```

## 解決策

### `--platform` の指定を適切にする

現在のマシンのアーキテクチャを確認し、それに合わせたプラットフォームを指定する。

```bash
docker build --platform linux/amd64 -t xxxx .
```
Unity-NavMeshSurfaceで、特定のオブジェクトを除いてBakeする方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007510/60719339-e8bb-454c-ad1d-05bbd76f5f4b.png)
１．除きたいオブジェクトを、特定のLayerに属させる。（写真の場合、PlayerをPlayerレイヤーに、EnemyをEnemyレイヤーに属させた。）
２．NavMeshSurfaceコンポーネントの、Object Collectionの、Include Layersから、PlayerとEnemyのLayerを外す
３．Bake
ECS on Fargate 記事集：ECSに関する記事が増えすぎたので、一度整理してみた（一部CloudFormation版も紹介）

## はじめに

ECS on Fargate についての記事があちこちに散らばっていたので、スクラップして整理してみました。

今回の内容については、個人的な備忘録になりますので、ご了承ください。

## 過去の記事をスクラップしてみた

**個人的な備忘録：ITスクールのハッカソンでEC2ではなくECS on Fargateを選んだ理由を解説してみた**

https://qiita.com/free-honda/items/77b0971ff2485ada13e1

**EC2 vs ECS on Fargate：初学者にとってどちらが難しいのか？ ChatGPTに質問しながら体系的に整理してみた**

https://qiita.com/free-honda/items/06c27710a9b1f7e5cb21

**個人的な備忘録：ITスクールのハッカソンでECS on Fargateを選択したため、そのメリットを整理してみた**

https://qiita.com/free-honda/items/30439432da49c373d8e3

**AWS入門：EC2 vs ECS、コストが安いのはどっち？ユースケース別に徹底比較してみた**

https://qiita.com/free-honda/items/6694d75b231ab7b691ee

**ECSを使ったコンテナデプロイ：ECSを使ったサーバーレスアプリケーションのデプロイと動作確認**

https://qiita.com/free-honda/items/813b0baf8d993b300cc3

**ECSタスク構成（Django + Nginx on Fargate）：カスタムJSONを用いたタスク定義を体系的に整理してみた**

https://qiita.com/free-honda/items/41f2b96ef57edc21c82a

**Django開発備忘録：AWS 環境の ECS で実際に使用した本番用 Dockerfile を体系的にまとめてみた**

https://qiita.com/free-honda/items/a245dda4cbfa87b3cead

**Django開発備忘録：Docker を使って Nginx + Django のコンテナを ECR にプッシュし、ECS にデプロイしてみた**

https://qiita.com/free-honda/items/7e0a5a02dad7c3bdb981

**ローカル環境 vs AWS ECS：Docker Compose を活用した構成の違いを整理し、自分なりに記事としてまとめてみた**

https://qiita.com/free-honda/items/476b73fa100d0320451b

**個人的備忘録：ECS で migrate を動かすために Dockerfile を修正し、migrate 専用コンテナを立ち上げてみた**

https://qiita.com/free-honda/items/862d308ce638d600f50d

**個人的備忘録：ECS Exec の概要とコマンド、ベストプラクティスを体系的にまとめてみた**

https://qiita.com/free-honda/items/655c560d400876175f9f

**個人的備忘録：ECS の enableExecuteCommand が false の場合に有効化する方法を紹介してみた**

https://qiita.com/free-honda/items/580d01e9a509ff02987d

**個人的な備忘録：Terraform で ECS タスク定義に CloudWatch Logs を設定し、エラーを解析してみた**

https://qiita.com/free-honda/items/6177ceed3bd2194a410a

**個人的備忘録：DockerとAWS ECSの実際のポートマッピングを自分なりに体系的にまとめてみた**

https://qiita.com/free-honda/items/b77096df1a0eb9e13bf8

## まとめ

今回は、自分自身を改めて整理する機会となりましたが、その中で過去の記事のメンテナンスも行うことができました。

最近は記事投稿などのアウトプット量が増えてきているからこそ、振り返る時間を持つことの大切さを改めて実感しました...！

## おまけ：ECS ＋ CloudFormation に関する記事

**GitHub Actionsを活用したDjangoアプリ開発：CloudFormationテンプレートでECRからECSへの自動本番デプロイ**

https://qiita.com/free-honda/items/c771e92e810f9bb563dc

**技術検証：ローカルで作成したGoアプリケーションを、CloudFormationテンプレートを使用してECRからECSへ自動デプロイ**

https://qiita.com/free-honda/items/f2019b72bc4de2bc505e

**インフラのコード化：CloudFormationを使ったECRとECSの自動化とCI/CDパイプライン設計**

https://qiita.com/free-honda/items/c7a68a216eef2161c567
Google Colabのコードセルに現れる縦線を消すには

# 縦線とは
画像の左側にある薄い線のことで，コードを強制的に改行してくれています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864472/1495fff3-3f21-46fc-8ca0-e319d30e10d8.png)


# やり方
1. 設定を開く
2. エディタを開く
3. 「縦の罫線列」の数字を適当に大きくする
4. 最後に保存をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864472/f68f9a3d-7405-4966-98cc-4cd90e7007a1.png)
Bulk API 2.0のトレイルヘッド




+ [PUT Upload Job Data with the csv returns 201 but no records inserted](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Wur5)

:::note
Are you running a completion notification? 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e50630f-a161-42ce-a04d-54ffae394fc3.png)

https://trailhead.salesforce.com/content/learn/modules/api_basics/api_basics_bulk
:::


+ [Getting 404 Not Found Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007agf3b)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2a3703bf-9565-aa92-f92a-7a3913ab57ae.png)

+ ["sf__Id","sf__Error","Name" "","MISSING_ARGUMENT:Id not specified in an update call:--","Insuron Bulk Company"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mKKH)

送信内容が違っている？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5ce71639-c304-f334-ae16-76d0b5d6f463.png)
Unity-NavMeshAgentにおける「StepHeight」と「Height」の違いと役割

# UnityのNavMeshAgentにおける「StepHeight」と「Height」の違いと役割

UnityのNavMeshAgentには、ナビゲーションの挙動を制御するためのパラメータが多数存在します。その中でも「StepHeight」と「Height」は、エージェント（キャラクターやAI）の移動挙動に大きく関わる重要な設定です。本記事では、それぞれの役割や適切な値の設定方法について詳しく解説します。

## **1. StepHeight（ステップの高さ）とは？**
### **役割**
`StepHeight` は、**エージェントが乗り越えられる段差の最大高さ** を決めるパラメータです。この値以下の段差であれば、エージェントはスムーズに移動できます。

### **値を変更するとどうなるか？**
| `StepHeight` の値 | 挙動 |
|-------------------|------|
| 小さい値（例: `0.1`） | 小さな段差でも引っかかって登れないことがある |
| 大きい値（例: `1.0`） | 高い段差も登れるが、不自然な移動になることがある |

- `StepHeight` を高くしすぎると、不自然に大きな段差を登ることがあり、キャラクターの見た目に違和感が生じることがある。
- `StepHeight` を小さくしすぎると、**小さな段差でも進めなくなる可能性** がある。

### **適切な値の設定**
通常のキャラクターの場合、`StepHeight = 0.3 ~ 0.5` 程度が自然な設定となります。

---

## **2. Height（エージェントの高さ）とは？**
### **役割**
`Height` は、**エージェントの身長（高さ）** を設定するパラメータです。この値が基準となり、エージェントが通れる通路の高さが決まります。

### **値を変更するとどうなるか？**
| `Height` の値 | 挙動 |
|--------------|------|
| 小さい値（例: `1.0`） | 低い通路も通れるが、エージェントの見た目と合わなくなる可能性がある |
| 大きい値（例: `3.0`） | 低い天井の下や狭いトンネルを通れなくなる |

- `Height` を大きくすると、**狭い通路を通れなくなる**。
- `Height` を小さくすると、エージェントが通れるエリアが増えるが、キャラクターの見た目と一致しなくなる可能性がある。

### **適切な値の設定**
- **人型キャラなら `Height = 2.0`** 程度が一般的。
- **動物やロボットなど、低いキャラは `Height = 1.0` 以下もあり得る。**

---

## **3. StepHeight と Height の違い**
| パラメータ | 役割 | 影響 |
|-----------|------|------|
| `StepHeight` | 乗り越えられる段差の最大高さ | 値を上げると高い段差も登れるが、不自然になる可能性あり |
| `Height` | エージェントの身長 | 値を上げると低い場所を通れなくなる |

`StepHeight` は「どの高さまで段差を登れるか」、`Height` は「どの高さまでの空間を通れるか」を決める指標です。

---

## **4. 実践的な設定例**

### **① 人型キャラ（例: FPS キャラクター）**
```yaml
StepHeight: 0.4
Height: 2.0
```
✅ 小さな段差（0.4m 以下）はスムーズに乗り越え、天井が 2m 以上ある場所のみ通行可能。

### **② 小型ロボット**
```yaml
StepHeight: 0.2
Height: 1.0
```
✅ 小さな段差（0.2m 以下）は乗り越えられ、低い通路（1m 以上の高さ）も通れる。

### **③ 大型モンスター**
```yaml
StepHeight: 1.0
Height: 4.0
```
✅ 1m までの段差はスムーズに乗り越え、4m 以上の高さがある場所しか通れない。

---

## **5. まとめ**
✅ **`StepHeight` はエージェントが乗り越えられる段差の高さ**（通常 `0.3 ~ 0.5`）
✅ **`Height` はエージェントの身長**（通常 `2.0` くらい）
✅ **適切な値を設定しないと、エージェントが進めない or 不自然な動きになる**

NavMeshAgent を使ったナビゲーションシステムを構築する際には、これらのパラメータを適切に設定し、エージェントの移動をスムーズにすることが重要です。適切な設定を行い、よりリアルなAIの移動挙動を実現しましょう！

## **6．追記**
StepHeight を Height より大きくすると、例えば「1mのドアは通れないのに、1mの段差は登れる」という不自然な動作 になることがある。
よって、基本的には、StepHeight < Heightにする。

また、Heightは、NavMeshAgentの、コンポーネントの中の、ObstacleAvoidanceのHeightと同じにするとよい。かも。例外はあるのかな。
【初心者向け】gitコマンド入門

# gitコマンドとは？

## 初期設定を行うもの

### 設定をする

ユーザとメールアドレスを設定する

```bash
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
```
### 初期設定を確認する方法

```bash
git config --list
```

## ローカルのリポジトリを作成する方法

プロジェクトルートディレクトリにリポジトリを作成する方法です
githubや他のものを使う場合は飛ばしてください

```bash
git init
```

## 基本的な使い方

### リモートリポジトリから取得(clone)する

```bash
git clone https://gitxxxx/xxx/xxx.git
```

### 新たにリポジトリを作成

**git branch** コマンドでブランチを作成することを指定し、その後に、作りたいブランチ名を記述します。 

```bash
git branch <ブランチ名>
```

### リポジトリにファイルを追加

リポジトリに新たにファイルを追加する場合はルートディレクトリまたは、追加フォルダにのところへ行き **git add** コマンド、そのあとに　**.** を押すか、ファイル名を指定します。

```bash
git add .
```
または
```bash
git add <ファイル名>
```

###リポジトリにコミット&プッシュ

**git commit** のあとに-mのオプションをつけて、その後メッセージを記述をします。

```bash
git commit -m "メッセージ記述"
```
リモートリポジトリにプッシュをする場合 **git push**コマンドでリポジトリにプッシュをします。
```bash
git push
```
このときに違うリポジトリへプッシュする場合は
```bash
git push -u origin <レポジトリ名>
```
にプッシュします。

## 各作業の取り消し作業

### addの取り消しを行う方法

addしたファイルを取り消します。

```bash 
git reset HEAD <ファイル名>
```

### commitの取り消しを行う方法

commitの取り消しは、下記のコマンドを実行します。

```bash 
git reset --head HEAD^
```
**オプションについての説明**
|オプショション|説明|
|----|-----|
|--head| コミットを取り消し、ワークディレクトリの内容も書き換え|
|--soft| ワークディレクトリの内容はそのままでコミットだけを取り消す|

**HEADについての説明**
|オプション|説明|
|----|-------|
|HEAD^|直前のコミット|
|HEAD~{n}|n個前のコミット|

### commitの履歴を残したまま取り消す方法

直前のcommitを消さずに戻す方法。履歴は残したままになります。

```bash
git revert <ハッシュ値>
```

### コミットメッセージの修正方法

直前のcommitのメッセージを修正する場合、 --amendのオプションをつけて修正をします。

```bash 
git commit --ahmend "修正メッセージ"
```
【ChatGPT】連想ゲームからアイディアや解決策を導き出すPromptです。


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

　今回は、連想ゲームからアイディアや解決策を導き出すPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　ChatGPTの
　　ニュースリリースが
　　　更新されました。

***（ChatGPT翻訳）***
2025年3月18日、Web、Android、iOS向けにさまざまなユーザビリティとパフォーマンスの改善、およびバグ修正を行いました。以下にいくつかの具体的な更新内容を示します。

**WebおよびWindowsデスクトップアプリ**

1. **インラインメッセージエラーの再試行**：メッセージエラーが発生した場合、同じ会話内で再試行するか、そのままチャットを続けることができます。

2. **o1およびo3-miniモデルでのPythonを用いたデータ分析の提供**：これらのモデルを使用して、テストデータに対する回帰分析、複雑なビジネスメトリクスの視覚化、シナリオベースのシミュレーションなどのタスクを実行できます。

3. **会話の下書き**：送信されていないメッセージがメッセージプロンプト内に保存されるようになりました。

4. **一時チャットの新しいUI**：これらのプライベートな会話へのアクセスと表示がより明確になりました。

**Androidアプリ**

1. **インライン生成画像のデフォルトサイズの拡大**：インラインで生成される画像のデフォルトサイズが大きくなりました。

2. **一時チャット用のより明確でプライベートなインコグニートキーボード**：一時チャット時のキーボードがよりプライベートで使いやすくなりました。

**iOSアプリ**

1. **iOSおよびmacOSでのChatGPTレスポンスからのテーブルコピー機能の改善**：レスポンス内のテーブルをより簡単にコピーできるようになりました。

2. **メッセージの長押しでメニューアクションを表示：コピー、編集**：メッセージを長押しすることで、コピーや編集のオプションが表示されるようになりました。

3. **ネストされた引用ブロックコンテンツのレスポンス表示の改善**：ネストされた引用ブロックの表示が改善され、読みやすくなりました。

4. **会話の表示とメッセージメニューアクションの高速化**：会話の表示とメッセージメニューの操作がより迅速になりました。
***

　Pythonが使えるというのは
　　Code Interpreterのことですね。

　“会話の下書き”は
　　ちょっとありがたいかも。

　　“あれ？　あの文言、別セッション！”
　　　となっても、そちらに行き、
　　　　文言をコピーして戻ってきても
　　　　　前の入力が残ってる！

　一時チャットは
　　切り替わりがはっきりしました。

　“インコグニートキーボード”は
　　おそらく英語版のみの話でしょう｡
　　　日本語環境では変わらない
　　　　と思います。

　このほかにも
　　現在、改善を施しているそうです。
　　　使いやすくなるのは
　　　　うれしいですね。
***
　では、【本題】です。

　今回は、
　　連想ゲームから
　　　アイディアや解決策を
　　　　導き出すPromptです。

　アイディアや解決策は、
　　簡単に出てくるものではありません｡

　それでも
　　知恵を絞って
　　　出すことも多々あります。

　生成AIに頼って
　　単純に“アイディアを出して”と
　　　指示しても
　　　　出てくるのはありきたり。

　そこで
　　視点を変えて
　　　連想ゲームによる
　　　　アイディア創出を
　　　　　してみました。

　こちらが、そのPromptです。
　　＊＊＊に課題を入力して
　　　送信してください。
```Text:連想ゲームからアイディアや解決策を導くPrompt
課題は「＊＊＊」

連想ゲームからアイディアや解決策を導き出してください。
```

　もちろん、
　　期待したほどでは
　　　ないかもしれません。

　しかし、
　　そこから
　　　深堀りしてみてください。

　意外なアイディアや解決策を
　　得られるかもしれません。

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

　今回は、ここまで。
OSPF（Open Shortest Path First）［直訳］最短最速経路で行く！　を勉強したのでまとめ

## はじめに

以前、CCNAを勉強しただけでしたが、ネスペを受けるにあたり改めて、ざっくり情報を整理しました。生成AIに聞けばわかるのですがね。。。
わかりやすいように「ネットワークを知らない人向け」「専門用語も抑えたい人用の書き方」にチャレンジしてみます。

## OSPF（Open Shortest Path First）とは

### Link-State型（リンクステート型）のプロトコルです！

学校のクラス１学級の在籍している全ての生徒とお友達になるタイプの陽キャタイプのやつです。

ネットワーク内に存在していて、OSPFが動作している全てのルータと友達になる！というイメージです。全てのルータが、自発的に全てのルータを把握します。

### 私はここにいるを「伝える／伝えられる／知り合える」

「僕はここにいるよ。お隣さんは誰々だよ。お隣さんとの距離はこれぐらいだよ」このような状態をまとめて、全員に伝えます。学校の席替え直後を思い出してください。私の前の席は、Ａちゃんで、右側がＢさん、後ろがＣさん、左がＤちゃんです！このような情報をクラス全員に伝えます。

自分と直接繋がっているルータ情報は　「LSA（Link-State Advertisement）」という情報にまとめて、保存すると同時に全てのルータに自分のLSAを知らせます。ダイレクトメールみたいなイメージですかね。
LSAの中には、コスト情報が記載されています。隣のルータまでの通信速度の情報（コストやメトリクス）を表記されます。
このコスト情報を基に「最短最速経路」を計算するんです。
そして、他のルータからもLSAが届きます。それらすべてを整理して「LSDB（Link-State Database）」を作成します。他のルータから届いたLSAを元に「ふむふむ、遠くにZちゃんがいるんだな、最短最速で話しかけるにはこのルートだな」とわかるようになります。

### LSAの種類

#### LSA type1 （ルータＬＳＡ）

学級名簿的な？

#### LSA type2（ネットワークＬＳＡ）

あの子への（心の？）距離的な？


### 計算しんどい

「今日からこの学級は、1,000人だ！全ての生徒の把握と距離を知っておけ！」
「えーーーーーーー」
はい。全ての生徒の情報を把握して、距離を全て計算するのはつらいです。
そこで「クラス学級」という人数（30人ぐらい？）に分割して、クラス学級の人は全員把握しておけ

この仕組みが、OSPFの「エリア」という概念です。ルータが1台追加されるだけで、全ルータとのコストを計算してLSA計算をして、、、というのは、ルータのCPUやメモリがたくさん必要です。そこで、エリアという単位に分割して「把握が必要なルータの台数を少なくする」

area 1, area 2, …　と作成されますが、一番大事なのは「area 0」です。
0番隊とか、3-0組とか、めっちゃ特別感あります。
この「エリア０」の最大の特徴は、エリア０に所属しているルータは、他のエリアのルータと繋がっている必要があります。

### LSAの種類

#### LSA type1 （ネットワーク集約ＬＳＡ）

他のクラスの代表者をしているルータ情報的な？
Udemyでの返金対応をしてみた話



## きっかけ
久しぶりにudemyへログインしたところこんなポップアップが出てきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/b212c554-4d74-475c-975b-70e290547789.png)

## リクエストを送信
- 下記のように選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/c7ab788f-10d6-4d0f-8ac5-663777b4bbca.png)

- `お問い合わせフォームに行く`ボタンを押下

## 入力する
- 下部の送信ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/e10ab0b2-cedd-4393-bd8b-d7251ae3b108.png)

## 自動で届いたメール

![スクリーンショット_16-3-2025_1396_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/62d3d5ef-8044-48cf-9041-c63679dd4b3c.jpeg)

## 返信
![スクリーンショット 2025-03-20 13.10.57.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/a5712478-6b00-4277-8460-707c7a118d90.jpeg)

## 購入履歴の返金タブ
- 返金成功の場合は現金で振り込まれ、何らかの理由によって現金で振り込めなかった場合は、Udemyで使用できるポイントが付与されるようです！

![2025-03-20 13.22の画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/132ae919-0ad4-4591-ba10-b38cb709d5a8.jpeg)

## 追記
無事購入時と同じ金額が振り込まれていたのが確認できました!
Autonomous DBのタイムゾーンを変更する方法

本ブログは、[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)の1つです。

## 初めに
Oracle Autonomous Database (自律型データベース) は、デフォルトでUTC（協定世界時）をタイムゾーンとして使用しています。しかし、日本国内のシステムやアプリケーションを運用する場合、JST（日本標準時）での時刻表示やデータ処理が必要になることがあります。特に、ログのタイムスタンプやレポートの生成時刻など、現地時間での管理が求められる場面は少なくありません。

このブログでは、Autonomous Databaseのタイムゾーンを<strong>UTCからJSTに変更</strong>する手順を、ステップバイステップで解説します。これにより、データベースの時刻設定を日本時間に合わせ、業務要件に適した形で運用することが可能になります。  

## 変更手順
### STEP-1. 現在のタイムゾーンを確認
ADBのタイムゾーン情報は、OCIコンソール上には表示されません。そのため、ADBにログインし、`SYSTIMESTAMP`関数を実行して、システムのタイムスタンプを確認する必要があります。

```sql
SQL> select to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:ss TZR') from dual;
2024-04-09 06:42:36 +00:00
```
↑ 現在のタイムゾーンは`+00:00`、つまり<strong>UTC</strong>となっています。

:::note
SYSDATE関数を利用する場合は、タイムゾーンの情報が入っていませんので、時間差の計算が必要です。
:::

### STEP-2. JST(日本標準時)に変更 (管理者ユーザーで)
```
SQL> ALTER DATABASE SET TIME_ZONE='+09:00';
Database altered.
```

なお、`SYSDATE_AT_DBTIMEZONE`パラメータをTRUEに設定します。
```
SQL> ALTER SYSTEM SET SYSDATE_AT_DBTIMEZONE=TRUE;
System SET altered.
```

### STEP-3. 変更を反映するのに、ADBを再起動
- OCIコンソールの場合：Autonomous Databaseの詳細 > More Actions > 再起動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a36b455d-f2b6-2035-5c8a-1559f432bc1a.png", width="650">

- OCI-CLIの場合：
```
oci db autonomous-database restart --autonomous-database-id <ADB_OCID>
```

ライフサイクル状態の変化：AVAILABLE → RESTARTING → AVAILABLE
### STEP-4. ADBに再ログインし、変更後のタイムゾーンを確認
```
SQL> select to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:ss TZR') from dual;
2024-04-09 15:57:35 +09:00
```

↑  JST(日本標定時)に変更されました。

以上

----
__参考資料__
[SYSDATE_AT_DBTIMEZONE Autonomous DatabaseでのSYSDATEのタイム・ゾーンの選択](https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/autonomous-initialization-parameters.html#ADBSB-GUID-1D5E830F-2986-4E6C-AF8F-899AC3C85D07)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/fb48afd6-d853-42dd-896d-bd40d6c6e76b.png", width="600">
Dockerのコンテナを接続する

# dockerでコンテナとブラウザを接続する
コンテナとブラウザを接続するためには以下のコマンドを使う
```
docker container run -p <ブラウザのポート番号>:<サーバーのポート番号> <サーバーのイメージ名>
```
そして、コンテナとブラウザが接続できているかを確認する。
```
localhost:3000
```
## 例
nginxはhttpサーバーでポート番号80番で待ち受けているので、ブラウザの3000番とnginxの80番を接続させるには以下のコマンドを打つことで実現できる。

```
docker container run -p 3000:80 nginx
```
そしてブラウザで以下のURLで3000番にアクセスすることでnginxに接続できる。
```
localhost:3000
```
# Dockerネットワークでコンテナどうしを接続する
ネットワークを指定せずにコンテナを作成すると自動的に`bridge`ネットワークに接続される。
今回は自分でネットワークを作成して、その自分が作ったネットワークにコンテナを接続するようにする。
## ①Dockerネットワークを作成する
以下のコマンドでネットワークを作成する
```
docker network create <ネットワーク名>
```
## ②Dockerネットワークが作成されたかを確認する
以下のコマンドでDockerネットワークが作成されたかを確認する。
```
docker network ls
```
## ③接続するコンテナを作成する
以下のコマンドで自分が作ったネットワークとコンテナを接続する
```
docker container run --network <ネットワーク名> <イメージ名>
```
## 例
`my-net`というネットワークを作成して、そこでhttpサーバーである`nginx`と`ubuntu`のコンテナを作成して`ubuntu`から`nginx`に接続する。
### ①まず`my-net`というネットワークを作成する
```
docker network create my-net
```
### ②ネットワークが作成できたか確認する
```
docker network ls
```
### ③`ubuntu`のイメージをDockerfileで作成する。
```dockerfile:Dockerfile
FROM ubuntu:22.04
RUN apt update
RUN apt install -y iputils-ping curl
CMD ["bash"]
```
### ④`ubuntu`のイメージをビルドする。
```
docker image build -t ubuntu-image .
```
### ⑤`ubuntu`コンテナを作成して自分が作ったネットワークである`my-net`に接続する
```
docker container run -itd --name ubuntu-container --network my-net ubuntu-image
```
### ⑥`nginx`コンテナを作成して自分が作ったネットワークである`my-net`に接続する

```
docker container run -itd --name nginx-container --network my-net nginx
```
### ⑦`nginx`コンテナのIPアドレスを調べる
```
docker network inspect my-net
```
### ⑧`ubuntu`コンテナの中に`bash`で入る
```
docker container exec -it ubuntu-container bash
```
### ⑨`ubuntu`コンテナの中で以下のコマンドで`nginx`コンテナにアクセスする
```
curl http://<nginxのIPアドレス>
```
もしくは、`名前解決`を使ってnginxのコンテナ名を指定することでも実現する
```
curl http://<nginxのコンテナ名>
```
例
```
curl http://nginx-container
```

## Dockerネットワークのいろいろなコマンド
ネットワークの詳細情報をしるコマンド
```
docker network inspect <ネットワーク名>
```
ネットワークを削除するコマンド
```
docker network rm <ネットワーク名>
```
Difyで自社開発RAGシステム(RAG精度あげたろう)を連携して検索精度を向上させる手順

## はじめに
Retrieval-Augmented Generation（RAG）モデルの検索精度を向上させるため、Difyプラットフォームに自社開発のRAGシステム(RAG精度あげたろう)を外部ナレッジベースとして連携する方法を解説します。この設定により、DifyのAIアシスタントが自社の専門知識を活用した高精度な回答を提供できるようになります。

---

## 手順解説

### 1. 外部ナレッジ連携設定画面へのアクセス
Difyダッシュボードから以下の手順で設定画面に進みます。
ナレッジ設定画面 > [外部ナレッジ連携API] をクリック


![ナレッジ管理画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/f6e39095-ff76-4c22-8509-10f172f4d9b1.png)


### 2. RAGシステムの基本情報入力
自社開発システムの基本情報を登録します。

![システム情報入力画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/76bf149b-b18e-49de-b64a-598059c54fac.png)
必須項目：
- Name：no.1-rag
- API Endpoint：RAGシステムの検索API URL
- API Key：sk-******


### 3. 連携設定画面の詳細設定
API連携の詳細設定を行います。

![詳細設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/280498e2-3b67-48c5-aa8a-0f8eb4d6b44a.png)

設定項目例：
- 外部ナレッジ名：no.1-rag-all-knowledge
- 外部ナレッジ連携API：no.1-rag
- 外部ナレッジID：ALL
- 検索設定 トップK: 10
- 検索設定 スコア閾値: 0.55

### 4. テスト検索の実施
設定を保存後、即時テストが可能です。

![検索テスト画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/1fd0703c-70dc-4668-aca8-5ecd54158090.png)

テスト手順：
1. ソーステキストを入力
2. [テスト] ボタンをクリック
3. 検索結果が正常に表示されることを確認




---

## おわりに
この設定により、Difyプラットフォームが自社の専門知識を即座に活用できるようになります。

---

リンク：
- [自社開発のRAG精度あげたろう Github.com](https://github.com/engchina/No.1-RAG)

> 外部ナレッジ連携APIの機能はテスト中で、テスト完了後にGithub.comで公開する予定