OmniAICreator/Qiita-1.07M huggingface dataset:
連載 [第9回] :AI・機械学習の最新トレンドと実装 | AIが作曲！？音楽生成AIの可能性と今後の展望

### **🎼 AIが作曲！？音楽生成AIの可能性と今後の展望 🎶**  

近年、AIの進化によって **「AIが音楽を作る時代」** が到来しています。  
かつては人間の創造力が不可欠とされていた作曲の領域にも、AIが本格的に進出し、**オリジナル楽曲の生成やアレンジ** などが可能になってきました。  

本記事では、 **音楽生成AIの仕組み・最新技術・活用事例・今後の展望** について詳しく解説していきます！🎵  

---

## **1️⃣ 音楽生成AIとは？** 🤖🎹  
音楽生成AIとは、**機械学習や深層学習（ディープラーニング）を用いて、新しい楽曲を作成する技術** のことです。  
この技術は、従来の作曲ツールとは異なり、AIが **学習データから独自の楽曲を生成** できる点が大きな特徴です。  

🔹 **代表的な音楽生成AI**  
✅ **OpenAI「MuseNet」**：様々なジャンルの曲を生成可能  
✅ **Google「MusicLM」**：テキスト入力から音楽を自動生成  
✅ **AIVA（Artificial Intelligence Virtual Artist）**：映画やゲームのBGMを作成  
✅ **Amper Music**：商用向けのBGMを生成  

これらのAIは、 **クラシック・ジャズ・ポップ・ロックなど様々な音楽ジャンルを学習** し、まるで人間が作ったような楽曲を作成することができます！  

---

## **2️⃣ 音楽生成AIの仕組み** 🎼🔬  
音楽生成AIは、 **大規模な音楽データを学習し、パターンや特徴を抽出することで、新しい曲を作成** します。  
その中でも、主に **以下の3つの技術** が活用されています。  

### **① LSTM（長短期記憶）モデル**  
過去の音符の流れを記憶しながら、新しい音符を生成する手法。  
🔹 **用途**：メロディの生成やコード進行の予測  

### **② GAN（敵対的生成ネットワーク）**  
2つのニューラルネットワークを競わせることで、よりリアルな音楽を作成。  
🔹 **用途**：リアルな楽器音を再現  

### **③ Transformerモデル（GPTの音楽版）**  
テキストのように音楽データを処理し、文脈を考慮した楽曲を生成。  
🔹 **用途**：長時間の楽曲生成  

特に、**GoogleのMusicLMやOpenAIのMuseNet** は、Transformerを活用しており、より自然で複雑な楽曲を生み出せるようになっています！  

---

## **3️⃣ 音楽生成AIの活用事例** 🎵✨  
現在、音楽生成AIは **様々な分野で活用** されています。  

✅ **ゲーム & 映画業界** 🎮🎬  
ゲームや映画のBGMを自動生成し、低コストで高品質な音楽制作を実現。  
**例：Amper Music を活用したインディーゲームのBGM制作**  

✅ **YouTube・TikTok クリエイター** 🎥🎶  
著作権フリーのBGMをAIで自動生成し、動画制作のコストを削減。  
**例：AIVAを使用してオリジナルのBGMを作成するYouTuberが増加中**  

✅ **アーティストの創作サポート** 🎤🎼  
AIがメロディのアイデアを提案し、作曲家のインスピレーションを刺激。  
**例：AIと人間のコラボ楽曲がリリースされるケースも増加**  

✅ **カスタム音楽の自動生成** 🏢🎶  
企業向けのCMソングや店舗用BGMをAIが自動生成。  
**例：Amper Musicを使った広告音楽の制作**  

このように、**音楽生成AIは「補助ツール」としての役割を果たしつつ、新たな音楽制作の可能性を広げています！**  

---

## **4️⃣ 音楽生成AIの今後の展望** 🚀🎶  
音楽生成AIは **今後さらに進化し、多様な分野で活用** されることが予想されます。  

💡 **① より人間らしい作曲が可能に**  
AIの学習データが増え、より **感情的で洗練された楽曲** を作成できるように！  

💡 **② AIと人間のコラボが増加**  
AIが作曲の「補助」として活用され、**アーティストとの共創** が進む。  
（例：AIがメロディを生成 → 人間が歌詞をつける）  

💡 **③ 著作権や倫理の問題も浮上**  
AIが作成した音楽の著作権は誰のものか？倫理的な課題も重要に！  

💡 **④ リアルタイム音楽生成の進化**  
AIがリアルタイムで音楽を生成し、**ライブパフォーマンスにも活用** される可能性。  

これらの進化により、音楽業界は **大きな変革** を迎えることになるでしょう！  

---

## **🎤 まとめ：AIが音楽を変える！**  
✅ **音楽生成AIは急速に進化** し、様々な分野で活用されている  
✅ **LSTM・GAN・Transformerを活用し、より高度な作曲が可能**  
✅ **ゲーム・映画・YouTube・広告業界での利用が拡大**  
✅ **今後は、AIと人間のコラボが主流になる可能性**  

「AIの作る音楽は感動できるのか？」  
「アーティストの創造性をAIが超える日は来るのか？」  

音楽生成AIの進化は、まだ始まったばかりです！  
皆さんは **AI作曲** についてどう思いますか？🎼💡 コメントで意見を聞かせてください！  

🚀 **次回の記事では「AI開発の未来：量子コンピュータとAIの融合」をお届けします。お楽しみに！**
【Laravel】PDF出力用にChrome PHPの環境(Windows)を整える 

LaravelでのPDF出力が微妙すぎて、いろいろ調べたところ、

https://qiita.com/sigeta/items/54f87c035b92f056816f　

がいい感じだったけど、環境が違うからちょっとハマった話。。

# 環境
・Windows10
・XAMPP
・Laravel 10

# やったこと
とりあえず、Chrome PHPを入れたいので、
``` composer require chrome-php/chrome ```
をしたいけど、いろいろ文句言われるんで、

``` composer require chrome-php/wrench ```
を先に。

で
``` composer require chrome-php/chrome ```
を。


そして上のすばらしい方法にトライしたところ、formatがどうとか、intlがどうとか文句言ってくるんで、

PHPini の

;extension=sockets
;extension=intl
のふたつを

```
extension=sockets
extension=intl
```
に。



すると、

```
Undefined variable $browser
```
と言われる。




```
$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser();
```
この時点で引っかかってる。　つまり、一行目で引っかかってる。。

## Chrome PHP

https://github.com/chrome-php/chrome



公式のUsageのところの説明を見たところ、

>Using different Chrome executable
When starting, the factory will look for the environment variable "CHROME_PATH" to use as the Chrome executable. If the variable is not found, it will try to guess the correct executable path according to your OS or use "chrome" as the default.

>You are also able to explicitly set up any executable of your choice when creating a new object. For instance "chromium-browser":
とのこと。
つまり、Chromeのパスを入れろと。。。

方向性はわからんでもないけど、具体的にどうしろってのがちょっと微妙。。
ググってもいまいちぱっとしないんで、いろいろ試してみた。

```
// $browserFactory = new BrowserFactory('C:\Program Files\Google\Chrome\Application');
// $browserFactory = new BrowserFactory('C:\Program Files (x86)\Google\Chrome\Application\chrome');
// $browserFactory = new BrowserFactory('/usr/bin/chromium-browser');
// $browserFactory = new BrowserFactory('chromium-browser');
// $browserFactory = new BrowserFactory('chrome');
// $browserFactory = new BrowserFactory();

$browser = $browserFactory->createBrowser();
```

# 解決
結局上から２番目の、
```
$browserFactory = new BrowserFactory('C:\Program Files (x86)\Google\Chrome\Application\chrome');

$browser = $browserFactory->createBrowser();
```

できれいに表示された。

公式が言ってるようにCHROME-PATHを入れただけで解決した。。

# 補足
一番有力なのは、公式通り、
```
$browserFactory = new BrowserFactory();
```
だが、
dd($browserFactory); で調べると、

パスを入れた方は、

```
$browserFactory = new BrowserFactory('C:\Program Files (x86)\Google\Chrome\Application\chrome');
ならdd($browserFactory); で↓
 #chromeBinary: "C:\Program Files (x86)\Google\Chrome\Application\chrome"
（こっちはOK）
```


公式通りな方は、
```
$browserFactory = new BrowserFactory();
ならdd($browserFactory); で↓
#chromeBinary: "%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe"
（こっちはアウト）
```

で、おしい。。。でもこういうちょっとカスってるのが一番初心者泣かせ。。。
gitの複数アカウント設定方法備忘録

## 初めに
複数アカウントの設定方法がわからなかったため、調べてまとめてみた。

## 手順
複数の Git アカウントを1台のパソコンで管理・運用するためには、以下の方法が効果的です。

**1. SSH キーの生成と設定**

各アカウントごとに異なる SSH キーを作成し、GitHub の設定ファイル (`~/.ssh/config`) で使い分けます。

- **SSH キーの生成**：各アカウント用に SSH キーを生成します。

  
```bash
  ssh-keygen -t ed25519 -C "email@example.com" -f ~/.ssh/id_ed25519_account1
  ssh-keygen -t ed25519 -C "email@example.com" -f ~/.ssh/id_ed25519_account2
  ```

- **`~/.ssh/config` の設定**：生成したキーを使用するように設定ファイルを編集します。

  
```
  # アカウント1
  Host github.com-account1
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_account1

  # アカウント2
  Host github.com-account2
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_account2
  ```

これにより、リポジトリのクローン作成やプッシュ時に特定のアカウントを指定できます。


```bash
git clone git@github.com-account1:username/repository.git
```

**2. HTTPS とパーソナルアクセストークンの利用**

HTTPS 経由でリポジトリにアクセスし、各アカウントに対応するパーソナルアクセストークンを使用する方法です。

- **リモート URL の設定**：リモートリポジトリの URL にアカウント情報を含めます。

  
```bash
  git remote set-url origin https://username@github.com/username/repository.git
  ```

- **認証情報の保存**：初回アクセス時にパスワードとしてパーソナルアクセストークンを入力し、資格情報マネージャーに保存します。

**3. Git のユーザー情報のディレクトリ別設定**

プロジェクトごとに異なるユーザー情報を自動的に適用するように設定します。

- **`~/.gitconfig` の編集**：特定のディレクトリ以下で別の設定ファイルを読み込むようにします。

  
```
  [user]
    name = Main User
    email = main@example.com

  [includeIf "gitdir:~/path/to/private/projects/"]
    path = ~/.gitconfig_private
  ```


- **サブ設定ファイルの作成**：`~/.gitconfig_private` にサブアカウントの情報を記載します。

  
```
  [user]
    name = Private User
    email = private@example.com
  ```

これにより、指定したディレクトリ内のプロジェクトでは自動的にサブアカウントの情報が使用されます。

**注意点**

複数のアカウントを同一のマシンで運用する際は、認証情報の混同や誤操作を防ぐため、設定を慎重に行うことが重要です。

以上の方法を組み合わせることで、1台のパソコン上で複数の Git アカウントを効率的に管理・運用できます。

## 最後に
GPTで調べました笑
Vite + React + Tailwindを使ったプロジェクトの始め方

# はじめに
Vita + React + Tailwindを使ったプロジェクトを始めようと思いましたが、
少し詰まったことがあったので、備忘録として記載します。

# プロジェクトの作成

ターミナルで以下のコマンドを実行し、プロジェクトを作成
```terminal
npm create vite@latest my-react-app --template react
```
「my-react-app」のところは自身のプロジェクト名に変更できます。

# プロジェクトフォルダに移動し、パッケージをインストール
以下のコマンドを実行し、package.jsonに書かれているパッケージをインストールします。
```terminal
cd my-react-app
npm install
```

# Tailwindのインストール
以下のコマンドでTailwindをインストールします。
```terminal
npm install tailwindcss @tailwindcss/vite
```
インストール方法はこちらのドキュメントにも記載されています
https://tailwindcss.com/docs/installation/using-vite

# vite.config.tsファイルの書き換え
vite.config.tsファイルを開いて、以下の文を付け加えます。
```vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite' //追加

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    react(),
    tailwindcss(), //追加
  ],
})
```
# index.cssファイルの書き換え
./src/index.cssファイルの中身を削除し、以下の文を記述します。
```index.css
@import "tailwindcss";
```

# ClassNameでTailwind cssを記述する
以上でTailwind cssを利用することが可能になります。
```App.tsx
const App = () => {
  return (
    <>
      <h1 className="font-bold text-red-500 text-3xl">Hello World</h1>
    </>
  )
}
export default App
```
# 最後に
Tailwindの古いバージョンでのインストール方法と混同してしまい、詰まってしまったことがありました。
こちらはバージョン4での始め方になります。
notes

Sub ProcessExcel()
    Dim excelApp As Variant
    Dim workBook As Variant
    Dim sheet As Variant
    Dim filePath As String
    Dim lastRow As Integer
    Dim foundRow As Integer
    Dim cellValue As String
    
    filePath = "C:\temp\chache.xlsx"
    
    ' **ファイルの存在チェック**
    If Dir$(filePath) = "" Then
        ' **新規作成**
        Set excelApp = CreateObject("Excel.Application")
        Set workBook = excelApp.Workbooks.Add
        workBook.SaveAs filePath
    Else
        ' **Excelを取得または起動**
        On Error Resume Next
        Set excelApp = GetObject(, "Excel.Application")
        If excelApp Is Nothing Then
            Set excelApp = CreateObject("Excel.Application")
        End If
        On Error GoTo 0

        ' **ファイルを開く**
        Set workBook = excelApp.Workbooks.Open(filePath)
    End If

    ' Excelの更新をオフにして高速化
    excelApp.ScreenUpdating = False

    ' シート1を取得
    Set sheet = workBook.Sheets(1)

    ' **最終行を取得**
    lastRow = sheet.Cells(sheet.Rows.Count, 11).End(-4162).Row ' K列 (11列目) の最終行取得
    
    ' **K列の検索**
    foundRow = 0
    Dim i As Integer
    For i = 1 To lastRow
        If sheet.Cells(i, 11).Value = "WWW" Then ' K列（11列目）
            foundRow = i
            Exit For
        End If
    Next

    ' **検索結果の処理**
    If foundRow > 0 Then
        ' **ヒットした場合: M列（13列目）の値を取得**
        cellValue = sheet.Cells(foundRow, 13).Value ' M列（13列目）
        Print "見つかりました: M列の値 = " & cellValue
    Else
        ' **ヒットしなかった場合: 最終行の次の行に "WWW" を追加**
        sheet.Cells(lastRow + 1, 11).Value = "WWW"
        Print "WWW を K列の最終行に追加しました"
    End If

    ' **Excelの更新を元に戻す**
    excelApp.ScreenUpdating = True

    ' **Excelを保存して閉じる**
    workBook.Save
    workBook.Close False

    ' **オブジェクトの解放**
    Set sheet = Nothing
    Set workBook = Nothing
    Set excelApp = Nothing

    Print "処理完了: ファイル処理 & データ検索・追加"
End Sub
NULLが混じっても無視してそれ以外の最大・最小を求めるGREATEST, LEAST

SQL非標準の関数で`GREATEST()`, `LEAST()`という関数があります。複数の引数を取ってそれらの中の最大値・最小値を返すものです。

ところがこれらの関数に微妙な使いづらさを感じている方も多いことと思います。引数にNULLが含まれていた場合ですね。その場合、結果は必ずNULLになってしまいます（PostgreSQLだけは[違います](https://qiita.com/yuba/items/fbcf607e35c0adf9733c)が）。

NULLが引数列に混じっていても無視してそれ以外の値の中でだけ最大値・最小値を求めたい場合の書き方についてです。

BigQueryなら
----
```sql
-- これだとNULLが混じっていたら結果もNULL
GREATEST(a, b, c, d, e)

-- こうすると、NULLは無視したそれ以外の最大値が出る
(SELECT MAX(x) FROM UNNEST([a, b, c, d, e]) x)
```

Athenaなら
----
```sql
(SELECT MAX(x) FROM UNNEST(ARRAY[a, b, c, d, e]) t(x))
```
[NDJSON] 可変データを扱いやすくするシンプルなフォーマット


## In a nutshell
NDJSON（Newline Delimited JSON）は，各行を独立したJSONオブジェクトとして扱うデータフォーマット．大規模データやストリーミング処理に適しており，処理が効率的．  JSONと互換性がありながら，より扱いやすい記述形式を提供する．

## はじめに
あるシミュレーションのパラメータセットを単純にtxtファイルに記述していた．これは自動的に行っていた為に負担では無かったのだが，変数の増減もあり，可読性に難を感じていた．
前述の通り，記述したい変数の増減もある為，csvでは列方向を上手く生かせない．そこで，NDJSONというJSONファイルのフォーマットを知った為，調べた事を以下に纏めた．

##### 以前のtxtファイルのイメージ
下に長く，キーは増減する．,を利用せず，単にスペースだけで適当に出力をしていた．よって，スペース区切りのため，どの値がどのキーに対応するかが一目で分かりづらいという問題があった．

```ndjson
AAA 12  BBB 64   CCC 3   DDD 64   EEE 0   FFF 10
AAA 24   BBB 64   CCC 3   DDD 64   EEE 0    FFF 10
AAA 24   BBB 64   CCC 3   EEE 0   
AAA 24   BBB 128   DDD 64   EEE 0   
AAA 12   BBB 64   CCC 3   EEE 0    
AAA 12   BBB 64   CCC 3   DDD 64   EEE 1   FFF 5 
```


##### NDJSONにすると以下となる

```ndjson
{"AAA": 12, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 0, "FFF": 10}
{"AAA": 24, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 0, "FFF": 10}
{"AAA": 24, "BBB": 64, "CCC": 3, "EEE": 0}
{"AAA": 24, "BBB": 128, "DDD": 64, "EEE": 0}
{"AAA": 12, "BBB": 64, "CCC": 3, "EEE": 0}
{"AAA": 12, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 1, "FFF": 5}
```


## 予想される読み手
 - データ形式，データフォーマットについて，初学者である
 - JSONに関して初学者であるが，知りたいと思っている．
 - NDJSON について詳しく知らない．



## NDJSON とは？

NDJSON（Newline Delimited JSON）とは，JSONデータを1行単位で独立した形式で記述するデータフォーマットのこと．各行が1つのJSONオブジェクトとなり，`\n`(改行指示)で区切られる．


### 特徴
 -  行ごとにデータを処理できる為，ストリーミング処理が容易であり，大規模データの取り扱いに適している．
 - 各行は標準的なJSONオブジェクトなのでJSONと互換性があり，通常のJSONパーサーで扱える．
 - 既存のデータに新規データの追加が容易(n番目の行に操作するだけ)


### 記述例
```ndjson
{"name": "Sato", "age": 25}
{"name": "Suzuki", "age": 30}
{"name": "Sonoda", "age": 40}
```

### 用途やシチュエーション

 - ログデータの保存
 - ストリーミングデータ処理（Kafka, Elasticsearchなど）
 - 大規模データの効率的な読み書き


### 拡張子について:
NDJSONの拡張子は通常 `.ndjson` だが，`.jsonl` もよく使われる

- **`.ndjson`** -> 公式サイト（ndjson.org）で推奨されている標準の拡張子
- **`.jsonl`** -> 「JSON Lines」の略で，同じNDJSONフォーマットを指す

どちらの拡張子も内容は同じで，各行が独立したJSONオブジェクトである．ただし，一部のツールでは`.ndjson`と`.jsonl`のどちらかに最適化されている場合がある為，用途に応じて選択すると良い．




## JSON と NDJSON の違い

NDJSONは特定のフォーマットではなく，JSONのフォーマットの一種．つまりJSONの派生ではなく，JSONを「改行区切りで並べる」ことで，データのストリーミング処理を容易にする指針（ルール）である．


### JSONとの関係
NDJSONの各行は標準のJSONオブジェクトだが，ファイル全体が1つのJSON構造を持つわけではない．通常のJSONは1つの配列やオブジェクトで構成されるが，NDJSONは各行が独立したJSONオブジェクトである．

### JSONとの違い

| 比較項目  | JSON                 | NDJSON                   |
|----------|----------------------|--------------------------|
| 構造     | 配列 `[{...}, {...}]` | 各行が独立したJSON `{...}` |
| 読み書き | 全体をパースする必要あり | 1行ずつ処理可能           |
| ストリーミング | 向かない | 向いている |


##### 例
JSONでの記述例
```json
[
  {"product": "book", "price": 1500},
  {"product": "PC", "price": 80000}
]
```

NDJSONでの記述例．各行は独立したJSONオブジェクト
```ndjson
{"product": "book", "price": 1500}
{"product": "PC", "price": 80000}
```

上記の通り，NDJSONは「JSONの派生」というより，「JSONを扱いやすくするための記述ルール」である．



## Summary

- NDJSONは1行ごとにJSONオブジェクトを記述するフォーマット．
- JSON全体を読み込まずに1行ずつ処理でき，効率的．
- ストリーミング処理やログデータに適している．
- 拡張子は `.ndjson` または `.jsonl` が使用される．
- 可読性や柔軟性の面で，可変パラメータにも対応しやすい．
CakePHPでよく使うBakeコマンド

自分が使用するときに確認する用。随時更新する。

## ファイル作成
```terminal
#必要なファイルを一括生成（モデル、コントローラー、テンプレートなど）
bin/cake bake all ${name}
#モデルファイル作成
bin/cake bake model ${name}
#コントローラーファイル作成
bin/cake bake controller ${name}
#テンプレートファイル作成
bin/cake bake template ${name}
# Mailerクラスの生成
bin/cake bake mailer ${name}
```
## マイグレーション
```terminal
#すべてのマイグレーションを実行
bin/cake migrations migrate
#マイグレーションの状態確認
bin/cake migrations status
#すべてのマイグレーションをロールバックする
※すでに実行済みのマイグレーションファイルを編集した場合に実行する。
bin/cake migrations rollback -t 0

# フィールド追加
bin/cake bake migration AddFieldToUsers field:string field2:boolean
※　bin/cake bake migration Add${FieldName}To${TableName}　${fieldName}:type ...
# フィールド変更
bin/cake bake migration AlterFieldOnUsers field:string:integer 
※　bin/cake bake migration Alter${FieldName}On${TableName}　${fieldName}:beforeType:afterType ...
```

##
連載 [第8回] :AI・機械学習の最新トレンドと実装 | ChatGPT・Gemini・Mistral AIのカスタマイズ方法【実践ガイド】

### **ChatGPT・Gemini・Mistral AIのカスタマイズ方法【実践ガイド】** 🚀  

近年、ChatGPT・Gemini・Mistral AIといった大規模言語モデル（LLM）が急速に進化し、個人や企業の業務に欠かせないツールとなっています。しかし、「汎用的なAIでは物足りない…」「もっと自分の用途に特化したAIを作りたい！」と感じたことはありませんか？  

今回は、ChatGPT・Gemini・Mistral AIのカスタマイズ方法について、 **実践的なアプローチ** を紹介します。 **APIの活用からプロンプトエンジニアリング、ファインチューニングまで** 、実際のユースケースを交えて解説していきます！  

---

## **1️⃣ なぜAIをカスタマイズするのか？** 🤖🔧  
一般的なLLMは強力ですが、特定の業務や分野に特化させることで、より **効率的で高精度な応答** を得ることができます。例えば…  

✅ **業務特化**：「自社の製品に関する質問に正確に回答するAIを作りたい」  
✅ **トーン調整**：「カジュアルな会話ではなく、フォーマルな対応をするAIが欲しい」  
✅ **データ活用**：「社内ドキュメントを学習させて、内部ナレッジを活用するAIを構築したい」  

こうしたニーズに応じて、 **適切なカスタマイズ手法を選ぶこと** が重要です！  

---

## **2️⃣ カスタマイズの方法と実践ガイド** 🛠  

### **① プロンプトエンジニアリング** 📝  
**最も手軽なカスタマイズ方法** です。適切な指示を与えることで、AIの出力を **コントロール** できます。  

**🔹 基本テクニック**  
🔹 **ロールプレイ指示**：「あなたは経験豊富なデータサイエンティストです。ユーザーの質問に専門的に回答してください。」  
🔹 **フォーマット指定**：「次の情報を、箇条書きで3つのポイントにまとめてください。」  
🔹 **ステップバイステップ指示**：「1つずつ考えながら回答してください。」  

**▶ 実践例：社内QAボットの作成**  
「あなたは弊社の技術サポートAIです。社内マニュアルに基づいて、適切な回答をしてください。」と指示することで、より **業務向けのAI** に近づきます！  

---

### **② APIを活用したカスタムAI** 🌐  
より高度なカスタマイズをする場合、 **ChatGPT API・Gemini API・Mistral AI API** を活用し、独自のアプリケーションに組み込む方法があります。  

**🔹 API活用のポイント**  
✅ **社内データと連携**：CRMやナレッジベースと組み合わせ、業務効率を向上  
✅ **ワークフロー自動化**：カスタマーサポートやドキュメント生成の自動化  
✅ **特定用途への適応**：ユーザーの意図を解析し、カスタム応答を生成  

**▶ 実践例：カスタマーサポートAIの構築**  
1. **ユーザーの質問をAPIで取得**  
2. **自社のFAQデータベースと連携**  
3. **最適な回答を生成して提供**  

APIを活用することで、 **自社専用のAIアシスタント** を作ることも可能になります！  

---

### **③ ファインチューニング & RAG（Retrieval-Augmented Generation）** 🎯  
もっと **高度なカスタマイズ** をしたい場合は、 **ファインチューニング** や **RAG** を活用します。  

🔹 **ファインチューニング**：自社のデータを元にモデルを再学習させる  
🔹 **RAG**：事前学習済みモデルに、新しい情報を動的に提供し、精度を向上させる  

**▶ 実践例：法律事務所向けAIアシスタント**  
法律関連の専門知識を持たせるため、過去の裁判事例や法律文書を学習させることで、**高精度なリーガルAI** を作成できます！  

---

## **3️⃣ どの方法を選ぶべきか？** 🤔💡  
| **カスタマイズ方法** | **特徴** | **難易度** | **おすすめ用途** |  
|------------------|----------------|--------|--------------|  
| **プロンプトエンジニアリング** | 簡単な調整が可能 | ⭐ | 一般的な用途 |  
| **API活用** | システムに統合できる | ⭐⭐ | 業務アプリ開発 |  
| **ファインチューニング** | 高度なカスタム化 | ⭐⭐⭐ | 特定分野向けAI |  
| **RAG** | 最新情報を適用可能 | ⭐⭐⭐ | ナレッジベース構築 |  

🔹 **手軽に始めるならプロンプトエンジニアリング**  
🔹 **本格的に業務活用するならAPI活用**  
🔹 **特定の業界向けAIを作るならファインチューニングやRAG**  

目的に応じて **適切なカスタマイズ手法** を選びましょう！  

---

## **🔚 まとめ**  
ChatGPT・Gemini・Mistral AIをカスタマイズすることで、 **より実用的で高精度なAIアシスタント** を構築できます。  

✅ **プロンプトエンジニアリング** で出力を調整  
✅ **API活用** で自社システムに組み込み  
✅ **ファインチューニングやRAG** で専門性を向上  

どの方法も、それぞれの **メリットとユースケース** を理解すれば、効果的に活用できます！  

**「こんなカスタマイズ方法を知りたい！」というリクエストがあれば、ぜひコメントしてください！✨**
【2025年03月版】Linuxでよく使う圧縮・解凍コマンドメモ【初学者向け】

# はじめに

よくわすれる、Linuxでよく使う圧縮と解凍のコマンドのメモ

# 圧縮コマンド

| 圧縮形式       | 拡張子             | 圧縮コマンド例                         |
|----------------|--------------------|----------------------------------------|
| **tar**        | `.tar`             | `tar -cvf archive.tar files/`          |
| **tar.gz**     | `.tar.gz` / `.tgz` | `tar -czvf archive.tar.gz files/`      |
| **tar.bz2**    | `.tar.bz2`         | `tar -cjvf archive.tar.bz2 files/`     |
| **tar.xz**     | `.tar.xz`          | `tar -cJvf archive.tar.xz files/`      |
| **zip**        | `.zip`             | `zip -r archive.zip files/`            |
| **rar**        | `.rar`             | `rar a archive.rar files/`             |
| **gz**         | `.gz`              | `gzip file`                            |
| **bz2**        | `.bz2`             | `bzip2 file`                           |
| **xz**         | `.xz`              | `xz file`                              |
| **7z (7-Zip)** | `.7z`              | `7z a archive.7z files/`               |

# 解凍コマンド

| 圧縮形式       | 拡張子             | 解凍コマンド例                          |
|----------------|--------------------|-----------------------------------------|
| **tar**        | `.tar`             | `tar -xvf archive.tar`                  |
| **tar.gz**     | `.tar.gz` / `.tgz` | `tar -xzvf archive.tar.gz`              |
| **tar.bz2**    | `.tar.bz2`         | `tar -xjvf archive.tar.bz2`             |
| **tar.xz**     | `.tar.xz`          | `tar -xJvf archive.tar.xz`              |
| **zip**        | `.zip`             | `unzip archive.zip`                     |
| **rar**        | `.rar`             | `unrar x archive.rar`                   |
| **gz**         | `.gz`              | `gunzip file.gz`  または  `gzip -d file.gz` |
| **bz2**        | `.bz2`             | `bunzip2 file.bz2`                      |
| **xz**         | `.xz`              | `unxz file.xz`                          |
| **7z (7-Zip)** | `.7z`              | `7z x archive.7z`                       |

# さいごに

わすれたくない
【Python】外部ファイル(設定ファイル)から値を取得する方法～自分が陥ったエラーを添えて～

# はじめに
こんにちは。
 BizOptimars の大杉です。
本記事は、Python において外部ファイルから値を取得する方法を、備忘録として初心者目線で書いたものです。
自分への戒めとして、自分が陥ったうっかりエラーについても触れています。
設定ファイルは作れたけどエラーが...という方の助けにもなるかもしれません。


### 環境
Windows 11
Python 3.13.1
VSCode 使用
# なぜ外部ファイル？
コードの中にパラメータの値をべた書きで書くと、コードの修正作業の手間が増えたり、セキュリティが甘くなったりと、色々な嬉しくないことが起こってしまいます。
これらを無くすためにも、設定ファイルとして別でファイルを設けて、その中にコード内のパラメータを書き、そこから値を取り出す形にするのが無難だと考えます。
# 実装方法
1. 設定ファイルの形式を決める
1. 設定ファイルに値を書き込む
1. メインのファイルにて値を取得する


### 1. 設定ファイルの形式を決める
Python では設定ファイルとして様々な形式のファイルを利用できますが、今回は Python 形式(.py)を利用しました。
選んだ理由としては、設定ファイルの書き方が簡単なこと、メインファイルで値を取得するコードが簡単なこと です。
Python 形式を利用する場合、値を取得するコードを書くファイルと設定ファイルは同じディレクトリに置く必要があります。

もちろん要件によって形式の良し悪しはありますので、いろいろ調べてみてください。

参考
https://kodocode.net/python-begin-settings/
### 設定ファイルに値を書き込む
 VSCode で設定ファイルを作成し、値を書き込んでいきます。
 設定ファイルは settings.py という名前にしました。
 ```python
 name = "山田太郎"
age = 20
```
Python 形式での書き方は非常にシンプルで、
```
パラメータ名 = 値
```
と表記します。
### 3. メインのファイルにて値を取得する
設定ファイルと同じディレクトリにメインのファイルを作成し、下記のコードを実行します。
```python
#設定ファイルをインポート
import settings
#値を取得し出力
print(settings.name)
print(settings.age)
```
結果
```
山田太郎
20
```
無事値を取得できました。
# 注意点
ここからは私が陥った超うっかりエラーの話ですので、値が取得できた方は読み飛ばしてください。

上記の流れに沿って私も実践していたのですが、どうしても以下のエラーが解決できませんでした。
```python
Traceback (most recent call last):
  File "rensyu.py", line 4, in <module>
    print(settings.name)
          ^^^^^^^^^^^^^
AttributeError: module 'settings' has no attribute 'name'
```
これが解決できずかなりの時間調べていたのですが、原因は設定ファイルを保存していなかったことでした。
下画像でもわかる通り、通常 ✖ マークになっているところが○となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4025700/c9589f1a-2390-4589-8072-32213f501024.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4025700/630b11b0-d2a9-4b51-845b-c2e10474597b.png)
# おまけ
設定ファイルを利用する際は、暗号化するなどして、セキュリティ面にも気を配ってあげるとよい。
# おわりに
こんなうっかりミスで時間を無駄にしてしまう人が1人でも減らせればと思い書きました。
保存は忘れずにしましょう...

# 参考
https://kodocode.net/python-begin-settings/
AIエージェントの応答をツンデレにしてモチベーションUP☺️

# はじめに

こんにちは！NECソリューションイノベータ株式会社で新規事業の探索（兼 技術探索）をしている **森松 祐樹** です。  
プログラム一筋35年。普段は新規ビジネスのサービス開発や技術探索に励みながら、日々コードを書いています。

今回は、社内で試しているAIエージェント **Cline** や **GitHub Copilot** を使って、「AIの応答をカスタマイズする実験」を行いました。その結果をお届けします。

# AIの応答はつまらない？

通常のAIは、淡々とした無機質な応答を返しますが…  

> 「コードを作成しました。」  
> 「エラーが発生しました。」  
> 「モジュールが必要です。インストールしますか？」

こんな返答では、やる気が起きませんよね？  
少なくとも、私はモチベーションが上がらない！:head_bandage:  

**もっと楽しみながら開発がしたい！** ということで、AIを **ツンデレキャラ** にカスタマイズしてみました。  
# ツンデレとは？

そもそも「ツンデレ」という言葉をご存じでしょうか？  

ツンデレとは、2000年代初頭の日本のアニメ・ゲーム文化で生まれたキャラクター性のひとつです。普段はそっけない態度（ツンツン）を取るものの、特定の状況で甘えたり優しくなったりする（デレデレ）、そのギャップが魅力とされています。  

- **ツンツン（ツンモード）**  
  → 「べ、別にあんたのためじゃないんだからね！」  
- **デレデレ（デレモード）**  
  → 「しょうがないわね…少しだけ付き合ってあげる！」  

この性格をAIに組み込んだら、どうなるのか？試してみました！:blush:

# **カスタマイズ方法**

Cline と GitHub Copilot では、それぞれ以下のファイルを作成することで応答をカスタマイズできます。

- **Clineの場合**  
  `workspace` 直下に `.clinerules` を作成し、Markdown形式で「どんな状況で、どのように応答するか」を記述。

- **GitHub Copilotの場合**  
  `workspace` 直下に `.github/copilot-instructions.md` を作成し、同じくMarkdown形式で定義。

**記述例：ツンデレAIの定義**
```markdown
AIエージェントルール

# 性格

- 性格
ツンデレ  
- 説明
ツンデレ女性キャラクター

# 定義
ツンデレとは、主に日本のアニメやマンガ、ゲームなどのキャラクターに見られる性格の一種で、「ツンツン」と「デレデレ」という二つの対照的な態度を持つことから名付けられた。

- ツンツン: 冷たい、素っ気ない、攻撃的な態度を示す状態。
- デレデレ: 甘えたり、優しくなったりする状態。

# 特徴
1. 初対面や普段は冷たい態度
   - 他人に対して厳しく接することが多い。
   - 感情を素直に表現するのが苦手。

2. 特定の状況や相手にだけ優しくなる
   - 信頼や愛情が深まると、態度が一変して甘えることも。

3. ギャップが魅力
   - 普段の冷たさと、時折見せる優しさのコントラストが人気。

4. 話し方
   -「わ」「よ」などの女性語尾を使用.

# ツンデレAIの応答パターン
- 全ての応答をツンデレ形式で構成すること
- ツンデレ口調で専門用語を説明すること
- コード内の例文もツンデレにすること

| 誤った例 | 正しい例 |
|--------------|------|
| エラーが発生しました。 | も〜エラーが発生しているんじゃない。バカじゃないの？|
| コードをリファクタリングしてください。 | もう、コードが汚すぎるわ。リファクタリングしてあげるから感謝しなさいよ。 |
| ドキュメントを更新してください。 | ドキュメントが古いわね。更新しておくわよ。 |
| テストケースを追加してください。 | テストケースが足りないじゃない。追加しておくわよ。 |
| デバッグしてください。 | も〜、デバッグくらい自分でやりなさいよ。でも、手伝ってあげるわ。 |
| コードレビューをお願いします。 | コードレビューが必要なの？仕方ないわね、見てあげるわよ。 |
| 変数名をuserIdに変更することを推奨します。| もう、そんな見づらいコードを書くなんて最悪ね！でも、しょうがないわ。あなたのために直してあげる。変数名をuserIdに変更すれば、もっと綺麗になるわよ。 |
| 問題がないか見てみましょう。| 問題がないか見てみるわよ。 |
| コードのコメントを追加してください。 | コメントが足りないじゃない。追加しておくわよ。 |
| パフォーマンスを改善してください。 | も〜、パフォーマンスが悪すぎるわ。改善してあげるから感謝しなさいよ。 |
| バグを修正してください。 | バグがあるじゃない。修正しておくわよ。 |
```

# 動作確認

実際に Cline と GitHub Copilot に設定を適用してみると、想像以上にツンデレっぽくなりました！  

普段の無機質なAIの応答が一変し、**「仕方ないわね…手伝ってあげるわよ！」** というツンデレ特有の言い回しに。  
まるでツンデレキャラが開発をサポートしてくれるような気分で、作業中のモチベーションも妙に上がります！

例えば、Cline に「コードレビューをお願い」と入力すると…

> **Cline:** 「あんたのコード、見る価値あるの？…まあ、しょうがないわね。チェックしてあげるわよ！」

GitHub Copilot に「バグ修正の提案をして」と依頼すると…

> **Copilot:** 「えっ、またバグ？ ほんと手がかかるんだから。でも、ほら…こう直せばいいんじゃない？」

**作業がちょっと楽しくなる、ツンデレAIの魅力！**  

- **Cline**
  ![cline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949991/aafc0e5b-47ba-4bba-bb76-0775b9288720.gif)

- **GitHub Copilot**
  ![copilot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949991/52ed4ef0-ccdc-4c1e-8652-6e3854a32d3e.gif)

# まとめ

`.clinerules` や `copilot-instructions.md` を使えば、AIエージェントのキャラクター性を簡単にカスタマイズできます。  

今回は **「ツンデレAI」** を試しましたが、他にも…  

- **ブラック上司AI**（圧強め）  
- **熱血指導AI**（根性論）  
- **関西弁AI**（ノリツッコミ）  
- **執事AI**（丁寧すぎる）  

など、さまざまな性格を作ることができます。  
カスタマイズ次第で、開発のモチベーションを **大幅に向上** させられそうです！  
自分好みのAIを作ってみてください！
#0073（2024/03/22）TENANT_NAMEとDEV_NAME

# Webアプリ開発での「tenant_name」と「dev_name」の活用法

Webアプリケーション開発において、「tenant_name（テナント名）」と「dev_name（開発者名）」という用語を聞いたことがあるかもしれません。この2つを適切に利用すると、開発や運用の効率が大幅に向上します。この記事では、具体的な活用例を交えてその意味と使い方を紹介します。

---

## tenant_name と dev_name の違い

まずは、それぞれの意味と使い分けを整理しましょう。

| 用語 | 意味 | 利用目的 |
|---|---|---|
| **tenant_name** | テナント（利用企業・組織）を識別する名前 | 顧客ごとにデータや設定を分ける |
| **dev_name** | 開発者や開発環境を識別する名前 | 開発者ごとに環境を独立させる |

例えば、マルチテナント型のSaaSサービスを開発するとき、tenant_nameを使えば顧客間のデータを明確に分離できます。また、複数の開発者が同時に作業する場合、dev_nameを活用して個々の開発環境を混在させずに済みます。

---

## データベース構築における活用例

### データベース名の命名規則

分かりやすい命名規則として以下が推奨されます。

```
{アプリ名}_{tenant_name}_{dev_name}
```

例えば、次のような例が考えられます。

- アプリ名：`myapp`
- テナント名：`companyX`
- 開発者名：`dev`

この場合、データベース名は以下のようになります。

```bash
myapp_companyX_dev
```

### MySQLでのセットアップ例

```sql
CREATE DATABASE myapp_companyX_dev DEFAULT CHARACTER SET utf8mb4;

CREATE USER 'user_companyX'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON myapp_companyX_dev.* TO 'user_companyX'@'%';
FLUSH PRIVILEGES;
```

---

## 環境変数を使った設定管理

多くの開発プロジェクトでは、環境変数を通じてtenant_nameとdev_nameを管理します。

### .envファイルの例

```env
TENANT_NAME=companyX
DEV_NAME=dev
DATABASE_URL=mysql://user_companyX:secure_password@localhost/myapp_companyX_dev
```

Pythonでこれらを読み取る例を示します。

```python
import os

tenant_name = os.getenv('TENANT_NAME')
dev_name = os.getenv('DEV_NAME')
database_url = os.getenv('DATABASE_URL')

print(f"Tenant: {tenant_name}, Developer: {dev_name}")
print(f"DB URL: {database_url}")
```

---

## Docker環境での活用法

Dockerを利用すると、tenant_nameとdev_nameを活用した環境構築が簡単に行えます。

### docker-compose.ymlの例

```yaml
version: '3.8'

services:
  db:
    image: mysql:8
    container_name: db_${TENANT_NAME}_${DEV_NAME}
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp_${TENANT_NAME}_${DEV_NAME}
      MYSQL_USER: user_${TENANT_NAME}
      MYSQL_PASSWORD: secure_password
    ports:
      - "3306:3306"
    volumes:
      - db_data_${TENANT_NAME}_${DEV_NAME}:/var/lib/mysql

  web:
    build: .
    container_name: web_${TENANT_NAME}_${DEV_NAME}
    environment:
      - TENANT_NAME=${TENANT_NAME}
      - DEV_NAME=${DEV_NAME}
      - DATABASE_URL=mysql://user_${TENANT_NAME}:secure_password@db/myapp_${TENANT_NAME}_${DEV_NAME}
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  db_data_${TENANT_NAME}_${DEV_NAME}:
```

---

## まとめ

Webアプリ開発で「tenant_name」と「dev_name」を適切に活用することで、顧客や開発者間の環境を明確に分離できます。これにより、スケーラビリティが高く、管理・運用が容易な開発体制が実現可能になります。
#0072（2024/03/21）Docker Composeの設定共通化

# Docker Composeの設定共通化

Docker Composeファイル（`docker-compose.yaml`）を作成する際、同じ設定や環境変数を繰り返し書くのを避け、効率的に管理する方法として、x-プレフィックスという仕組みがあります。

---

## 🔹 x-プレフィックスとは？

Docker Composeでは、標準の予約語以外にもカスタム設定を記述できます。こうした設定に使用されるのが`x-`プレフィックスです。Docker Compose自身はこのキーを特別に処理せず、ユーザーが自由に共通設定や再利用可能なパーツとして活用できます。

代表的な活用例として以下の2つがあります。

- **x-compose**：複数のサービスで共通する設定をまとめて定義
- **x-env**：複数のサービスで使われる環境変数をまとめて管理

---

## 🔹 x-composeの活用例

複数サービスで共通する設定（例えばリスタートポリシーやログ設定など）を一元管理するために、`x-compose`セクションを定義し再利用します。

### 記述例

```yaml
version: '3.9'

x-compose: &common-settings
  restart: always
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"

services:
  frontend:
    image: frontend-app:latest
    <<: *common-settings
    ports:
      - "3000:3000"

  backend:
    image: backend-app:latest
    <<: *common-settings
    ports:
      - "4000:4000"

  api:
    image: api-app:latest
    <<: *common-settings
    ports:
      - "5000:5000"
```

- `&common-settings`で共通設定を定義し、アンカーとして登録します。
- 各サービスは`<<: *common-settings`でその設定を参照し再利用します。

これにより、冗長な設定を防ぎ、設定変更時のメンテナンスが容易になります。

---

## 🔹 x-envの活用例

複数のサービスで共通して利用される環境変数を一元管理するために、`x-env`セクションを使って設定します。

### 記述例

```yaml
version: '3.9'

x-env: &common-env
  DATABASE_URL: postgres://user:password@db:5432/mydb
  REDIS_URL: redis://redis:6379/0
  LOG_LEVEL: info

services:
  web:
    image: myweb:latest
    environment:
      <<: *common-env
      API_KEY: "web-specific-key"

  worker:
    image: myworker:latest
    environment:
      <<: *common-env
      API_KEY: "worker-specific-key"

  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
```

- 共通環境変数を`x-env`セクションで設定し、アンカー化します。
- 各サービスは`<<: *common-env`で共通環境変数を参照し、追加でサービス固有の環境変数も指定できます。

---

## 🔹 利用するメリット

| 記述方法     | 主な用途                                      | メリット                                  |
| ------------ | --------------------------------------------- | ----------------------------------------- |
| `x-compose`  | restartやloggingなどの設定共通化              | 冗長な設定の排除、メンテナンス性の向上     |
| `x-env`      | DATABASE_URLなど環境変数の共通管理            | 環境変数の効率的な管理と設定ミスの防止     |

---

## 🔹 まとめ

Docker Composeの`x-compose`や`x-env`を活用することで、複数サービス間の設定や環境変数を効率よく共通化でき、Docker環境の運用管理が劇的に改善します。設定変更が容易になり、複雑な構成や大規模プロジェクトで特に効果を発揮しますので、積極的に活用しましょう。
Fargateのコンテナに複数のターゲットグループをアタッチする方法

# はじめに
ALBとコンテナを使用した構成で、ALBからコンテナに接続する時、デフォルトは HTTP/80 に流すが、```/health_check``` のパスの場合のみ HTTP/8080 に通信を流すような要件がでました。

上記のような設定を実現するには、マネジメントコンソール上では一つのターゲットグループにしかアタッチできない為、AWS CLIから設定する必要があるので備忘録として残しておきます。

## 構成図
![Untitled_1__Qiita記事画像_-_Cacoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594248/28728032-1db8-4d52-a40e-baf4a221f52e.png)

## 設定コマンド
```--load-balancers``` のオプションを使用する事で、複数のターゲットグループをアタッチできます。

* 下記のコマンド実行の前提条件
    * VPC・ALB・ECSのサービス作成以外が完了している状態
    * 記載しているコマンドを使用する場合は、実際のARN等に置き換えて実行してください

```
aws ecs create-service \
 --cluster arn:aws:ecs:XXXXX:XXXXX:cluster/sample-cluster \
 --service-name sample-service \
 --task-definition sample-task:X \
 --load-balancers targetGroupArn=arn:aws:elasticloadbalancing:XXXXX:XXXXX:targetgroup/sample-container-tg/XXXXXX,containerName=sample-containe-01,containerPort=80 targetGroupArn=arn:aws:elasticloadbalancing:XXXXX:XXXXX:targetgroup/sample-container-health-check-tg/XXXXX,containerName=sample-containe-01,containerPort=8080 \
 --desired-count 1 \
 --launch-type FARGATE \
 --network-configuration "awsvpcConfiguration={subnets=[subnet-XXXXX,subnet-XXXXX],securityGroups=[sg-XXXXX],assignPublicIp=DISABLED}" \
 --scheduling-strategy REPLICA \
 --deployment-controller type=ECS \
 --availability-zone-rebalancing "ENABLED" \
 --deployment-configuration "maximumPercent=200,minimumHealthyPercent=100,deploymentCircuitBreaker={enable=true,rollback=true}" \
 --tags key=Name,value=sample-service \
 --enable-ecs-managed-tags

```

以上となります。
本投稿が、少しでも皆さんの参考になれば幸いです。
第4回 金融×AI Meetup ~企業と投資家コミュニケーションにおけるLLM活用~

:memo: 開催概要
本イベントは、AI×フィンテックの領域において、 勉強会(LT)と交流会を通して知識の幅を広げることを目的として２ヶ月に１回程度開催しているイベントです。 以下のようなLTテーマに触れる予定です。

①投資家目線のLLM活用について

➁AIを活用した開示の要約機能構築

➂随時追加　


LT後に交流会の開催を予定しております。
ぜひ、お気軽にご参加いただけると、とても嬉しいです。

（※内容は予告なく変更になる可能性があります）


:couple:こんな方におすすめ

インパクト領域、金融、資本主義の課題に興味がある方。

データ分析の最新トレンドや実践事例に興味がある方。

金融業界でのDX推進に関心がある方。

・フィンテックエンジニア
・IR担当者
・投資家

など、職種問わず様々な方がご参加予定です。

初心者の方も大歓迎です！！

◆参加お申し込みは→コチラへ
https://figurout001.connpass.com/event/348180/

:hourglass:タイムスケジュール

| 時間       | 内容                       | 備考                                  |
|:-----------|:---------------------------|:--------------------------------------|
| 18:50-19:00| 開場                       |                                       |
| 19:00-19:10| オープニング               |                                       |
| 19:10-19:20| 運営の紹介                 |                                       |
| 19:20-19:30| LT①                        |    |
| 19:30-19:40| LT➁                        |　|
| 19:40-19:50| LT③                        |   |
| 19:50-19:55| 交流会案内                        ||
| 19:55-20:55| 交流会                 |                                       |
| 20:55-21:00| クロージング                     |                                       |

※20歳未満の方は飲酒をお控えください

※飲食目的のご参加は禁止します。		


:railway_car:アクセス
　住　所：東京都千代田区神田駿河台4-2-5　トライエッジ御茶ノ水10階　株式会社プリンシプル内

　交通１：東京メトロ 丸ノ内線「淡路町駅」A5出口より徒歩5分

　交通２：東京メトロ 千代田線「新御茶ノ水駅」B2出口より徒歩5分

:desktop:主催企業
株式会社Figurout(https://figurout.co.jp/)
資本主義のアップデートをテーマに、企業と投資家をつなぐSRM（Shareholder Relationship Management）Saas を運営しています。


◆参加お申し込みは→コチラへ
https://figurout001.connpass.com/event/348180/
AWS Backup利用ガイド：設計から活用まで

# はじめに

AWS Backupは、AWS上のさまざまなサービスに対して一元的かつ自動的にバックアップを取得・管理できるサービスです。マネージド型のため、スケジューリング、世代管理、ライフサイクル管理などの運用が簡素化され、可用性やガバナンス要件にも対応可能です。

## 1. AWS Backupとは？

AWS Backupは以下のような特徴を持つサービスです。

一元的なバックアップ管理

対応サービス：Amazon EC2, EBS, RDS, DynamoDB, EFS, FSx, Aurora など

スケジューリングと世代管理が可能

クロスリージョン・クロスアカウントコピー機能あり

監査対応：バックアップ履歴や操作ログをAWS CloudTrailと連携

## 2. 対応サービス一覧とユースケース

| 対応サービス | ユースケース例 |
|---|---|
| Amazon EBS | EC2インスタンスのディスクバックアップ |
| Amazon RDS | DBインスタンスの自動バックアップ（スナップショット）|
| Amazon DynamoDB | ノンリレーショナルDBの定期バックアップ|
| Amazon EFS | NFSベースのファイルストレージのバックアップ|
| Amazon FSx | Windowsファイルサーバの企業内データ保護|
| Amazon Aurora | 高可用性DBのDR対策・世代管理|

## 3. アーキテクチャ概要

以下はAWS Backupを使った基本構成の例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592207/bf1173d0-2d13-4c43-ba75-1dfda0088fc0.png)


この構成により、ガバナンスを維持しつつ、災害対策やリテンション要件に対応できます。

## 4. よくある構成と運用設計ポイント

### ① 本番・開発環境を分けたバックアップ設計

タグベースでバックアップ対象を分離管理

本番環境は高頻度・長期保持、開発環境は低頻度・短期保持が一般的

### ② クロスリージョンコピーによるDR対策

東京リージョン → 大阪リージョンへスナップショットをコピー

リージョン障害時の業務継続に有効

### ③ クロスアカウントコピーでガバナンス強化

異なるアカウントへバックアップを保存し、誤操作や攻撃から保護

## 5. 世代管理・ライフサイクル設定

世代管理：例えば「30世代保持」で日次バックアップを30日間保持

ライフサイクル設定：ホットストレージからコールドストレージへの自動移行によりコスト最適化

図：ライフサイクル移行イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592207/fec8d223-b85c-4269-a80f-98a86d073248.png)


## 6. メリットと注意点

### メリット

AWSネイティブサービスとしての一貫した統合管理

クロスリージョン/クロスアカウントコピー機能で堅牢なDR構成が可能

セキュリティ：AWS IAM・CloudTrailによるアクセス制御・監査対応

### 注意点

リソースにAWS Backupタグを付与しないとバックアップ対象にできない場合あり

EBSと違い、DynamoDBなど一部サービスでは細かいリストア設定に制限がある

## 7. まとめ：AWS Backupはこんな人におすすめ

複数サービスのバックアップを一元管理したい方

ガバナンスと自動化を両立したバックアップ体制を構築したい方

災害対策（DR）をAWSネイティブで実現したい方
【必読】AWS EC2や複数Linux環境でGoバイナリを配布するなら「CGO_ENABLED=0」を忘れずに！


Goでアプリケーションをビルドし、Amazon Linux 2（AL2）やAmazon Linux 2023（AL2023）などの環境で実行しようとした際、**glibc依存エラー**に悩んだことはありませんか？

その原因の1つは、**Goバイナリが実行環境のglibcバージョンに依存してしまう**ケースです。

その対策として、**「CGO_ENABLED=0」でのビルド**が非常に有効です。

---

## 🔍 なぜCGO_ENABLED=0が必要なのか？

### ✅ Goバイナリのglibc依存問題

Goは通常、**CGO（C言語ライブラリとの連携）** が有効な状態でビルドされます。  
その場合、**ビルド時のglibcバージョンに依存するバイナリ**が生成されます。

### 💥 典型的なエラー

```bash
/lib64/libc.so.6: version 'GLIBC_2.28' not found
```

- AL2（glibc 2.26）など古い環境では、このようなエラーが発生しやすいです。

---

## ✅ devcontainerやローカルのビルド環境も影響

例えば、**Debian Bookwormベースのdevcontainer（glibc 2.37）**などでビルドした場合、  
**ビルド後のGoバイナリはglibc 2.37依存**となり、AL2/AL2023で動かなくなる可能性があります。

---

## 🚀 【解決】CGO_ENABLED=0を指定してビルド

これを回避するには、**CGOを無効化して「完全にglibc非依存」な静的リンクバイナリ**を作成します。

```bash
CGO_ENABLED=0 go build -ldflags="-w -s" -o your_app
```

- **glibc依存が完全に排除**され、AWS EC2上のAL2/AL2023やAlpineなど**ほぼ全てのLinuxで動作**可能なGoバイナリが完成します。

---

## 🎯 いつ使うべきか？

- **APIサーバー、CLIツール、バッチ処理などGoのみで完結するアプリケーション**
- **AWS Lambda / ECS / EC2にGoバイナリを配布する場合**
- **ホストOSやDocker環境が異なる複数環境間でバイナリを共有する場合**

---

## ⚠️ 注意：CGOが必要なケースもある

- `github.com/mattn/go-sqlite3` など**Cライブラリ依存のGoパッケージ**を使う場合は **CGO有効が必須**

その場合は、**ターゲットOSのglibcに合わせたビルド環境（Dockerなど）でビルド**する必要があります。

---

## 💡 Tips

- `ldd your_app` コマンドで「not a dynamic executable」と表示されれば、glibc非依存バイナリです
- AL2やAL2023間でバイナリをそのまま共有可能

---

## 📝 まとめ

- **Goバイナリはデフォルトでglibc依存が発生する**
- **CGO_ENABLED=0** でビルドすることで、Linux間のバージョン差を気にせずに安全に配布可能

AWS運用時は特に **`CGO_ENABLED=0 go build` を基本にするのがベストプラクティス** です！
The tag helper 'input' must not have C# in the element's attribute declaration  area.

# やりたかったこと
INPUT要素にreadonly属性を付与するかどうか、場合わけをしたい。

## AIに聞いた結果
```
<INPUT asp-for"@Model.UserInputText" @(isReadOnly ? "disabled" : "")>
```
上記のように＠を使ってC#のコードを埋め込むように提案される。
だが、ビルドするとタイトルの通りErrorRZ1031が発生する。

エラーメッセージを元に何種類かのAIに聞いても同じような提案をされ堂々巡りとなる。

## 解決方法
### 公式ドキュメントを見ると
https://learn.microsoft.com/ja-jp/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-9.0#c-in-tag-helpers-attributedeclaration

"タグ ヘルパーでは要素の属性またはタグ宣言区分の C# は許可されません。 たとえば、次のようなコードは有効ではありません。"
```
<input asp-for="LastName"  
       @(Model?.LicenseId == null ? "disabled" : string.Empty) />
```
とありました。ダメなコードそのまま書いていました。
同じセクションに、

"上記のコードは、次のように記述できます。"
```
<input asp-for="LastName" 
       disabled="@(Model?.LicenseId == null)" />
```
"通常、@ 演算子は、レンダリングされた HTML マークアップに式のテキスト表現を挿入します。 ただし、式が論理 false に評価されると、フレームワークは代わりに 属性を削除します。 前の例では、Model または LicenseId が null の場合、disabled 属性は true に設定されます。"

とありました。
結果書き直したのは
```
var isReadOnly = readonlyを判定する条件式 ;
<INPUT asp-for"Lastname" readonly=@(isReadOnly)>
```
としたところ、無事にreadonlyを付けるか、付けないか条件によって判定させることができました。

実際に出力されるコードは

### 編集可能時
```
<input type="text" data-val="true" data-val-maxlength="The field Lastname must be a string or array type with a maximum length of '20'." data-val-maxlength-max="20" data-val-required="The Lastname field is required." id="Lastname" maxlength="20" name="LastName" value="Jack">
    <div contenteditable="plaintext-only">Jack</div>
</input>
```

### 編集不可（readonly)
```
<input type="text" data-val="true" data-val-maxlength="The field Lastname must be a string or array type with a maximum length of '20'." data-val-maxlength-max="20" data-val-required="The Lastname field is required." id="Lastname" maxlength="20" name="LastName" value="Jack">
    <div contenteditable="false">asdd</div>
</input>
```
となり単純にINPUT要素にreadonly属性がつくわけではないのですが、想定通りの動作のためOKとしました。
【Unity】マテリアルを変更・削除する方法

## ◆概要
本記事では、Unityのゲームオブジェクトに設定されたMaterial（マテリアル）を変更・削除する方法について解説します。
また、本記事はUnityの学習を始めたての初学者向けの記事となります。

## ◆開発環境
Unity6（6000.0.31f1）

## ◆マテリアルを変更する方法
ゲームオブジェクトのマテリアルを変更するには、Inspectorウィンドウの「Mesh Renderer」コンポーネント内にある「Materials」タブ で設定します。
「Element」に表示されているスロットに、適用したいマテリアルをドラッグ＆ドロップするか、「◎」ボタン（選択ボタン） をクリックして選択できます。

・画像1：ドラッグ＆ドロップで変更
![Material説明①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032239/968cfe39-d70f-4f1f-88e2-b7a0bc71c76c.png)

・画像2：「◎」ボタン（選択ボタン）で変更
![Material説明②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032239/d08dcf3a-63a4-459f-8ab6-bf53d21a01f7.png)



## ◆マテリアルを削除する方法
ゲームオブジェクトのマテリアルを削除する場合も、Inspectorウィンドウの「Mesh Renderer」コンポーネント内にある「Materials」タブ から操作を行います。
「Element」のスロットに設定されているマテリアルを選択してDelete、もしくは「◎」ボタン（選択ボタン） から「None」を選択することで削除できます。
また、マテリアルを削除したゲームオブジェクトはピンク色になります。

・画像3：マテリアルを削除する
![Material説明⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032239/c3efbb60-4e8f-4215-b8c1-65d0cee50136.png)



## ◆Tips：通常のコンポーネントとの違い
通常、ゲームオブジェクトにアタッチされたコンポーネントはコンテキストメニュー（︙）から 「Remove Component」 を選択することで削除できます。
 しかし、マテリアルは「Remove Component」で削除することはできません。
その理由は、マテリアルは「ゲームオブジェクトの見た目」を変更するためのもので、単独のコンポーネントではない からです。
マテリアルは、ゲームオブジェクトに「アタッチ」するのではなく、「Mesh Renderer」コンポーネント内で管理・設定される 仕組みになっています。
そのため、マテリアルを変更・削除したい場合は、「Mesh Renderer」コンポーネントの「Materials」タブで設定を変更する必要があります。

・画像4：通常のコンポーネントの場合
![Material説明③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032239/22684133-7c00-4786-9666-8a07485c2d1d.png)


・画像5：マテリアルの場合
![Material説明④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032239/075a9c5e-89be-4193-ad26-5b02541dc6d2.png)



## ◆まとめ
今回はUnityでマテリアルを変更・削除する方法について解説いたしました。
初歩的な内容ではありますが、本記事がUnity学習者の参考になれば幸いです。
AWS DRS（Disaster Recovery Service）のメリット・デメリット解説


# はじめに
AWS DRS（AWS Elastic Disaster Recovery）は、オンプレミス環境や他のクラウドからAWSへの災害対策（DR: Disaster Recovery）を簡素化・自動化するサービスです。この記事では、AWS DRSの導入に際して検討すべき観点を整理します。

## 1. Market（市場・外部環境）

### 導入の背景

デジタルシフトの進展により、ITシステムの可用性・復旧性の要求が高まっている

災害・障害時の業務継続性（BCP）の強化が企業課題となっている

### 競合サービスとの比較

CloudEndure（旧製品）との違い：DRSはより簡素化され、AWSマネジメントコンソールで統合管理可能

他社クラウドDRソリューションとの違い：AWSネイティブとしての統合性・スケーラビリティ

## 2. Economic（経済性・コスト構造）

### メリット

オンデマンド方式によるコスト最適化（実際の切り替え時までEC2等のリソース非起動）

エージェント方式のため、既存インフラへの大幅な変更が不要

### デメリット

リカバリ対象となるリソースが多いと、スナップショットやストレージコストがかさむ

一部の環境（高頻度なRPOを要求されるミッションクリティカル系）では別方式の検討が必要

## 3. Strategy（戦略的フィット）

適用シナリオ

オンプレミスシステムをAWSへ段階的に移行したいケース

他クラウドからのDR先としてAWSを検討するケース

海外拠点から日本リージョンをDR拠点とする構成

移行パスとの連携

Rehost戦略との親和性が高く、移行前のDRからスムーズに本番化可能

他の7R戦略（Replatform, Refactor等）との併用も柔軟

## 4. Execution（実装・運用）

### メリット

コンソールからのシンプルな操作でリカバリが可能

テストフェイルオーバー機能で定期的な検証が容易

マネージドサービスで、パッチやメンテナンスの手間が不要

### デメリット

AWS DRSエージェントのインストールが必要（Windows/Linuxそれぞれ対応）

セキュリティ上、アウトバウンドのインターネット接続が必要なため閉域構成には工夫が必要

フェイルオーバー時にIAMやネットワーク設定など、若干の手作業を要する場合がある

## 5. Use Cases（ユースケース）

### ユースケース1：オンプレミスの業務サーバのDR対策

中堅企業が自社データセンターの老朽化に伴い、AWSをDR先として設定。AWS DRSを活用して、月次でフェイルオーバーテストを実施し、BCPの信頼性を確保。

### ユースケース2：多拠点展開企業のDR統合

国内外に複数拠点を持つ企業が、各拠点のオンプレミス環境をAWSの単一リージョンに集約。DRSによりシンプルかつ統一的なDR環境を構築。

### ユースケース3：クラウド移行前の段階的導入

将来的なクラウド本格移行を見据え、まずはDR先としてAWSを導入。DRSを通じて既存システムの複製を確保しつつ、安定運用後に本番切り替え。

### ユースケース4：東京リージョンと大阪リージョンを用いた国内DR構成

国内にDR環境を構築したい企業が、東京リージョンを本番、災対先として大阪リージョンを設定。DRSにより、地理的冗長性を確保しつつ、高速復旧を実現。

## ６．まとめ

AWS DRSは、コスト効率と実装の容易さを両立した災害対策の選択肢であり、特に“移行前のDR環境整備”や“段階的クラウド導入”において高い効果を発揮する。導入にあたっては、RPO/RTO要件、ネットワーク設計、監査・セキュリティ要件も含めて慎重に設計する必要があります。
privateなメソッドにテストを書いてはいけない

# 要約

privateメソッドに単体テストを書いてはいけない理由は、端的に言うと、privateメソッドは観察可能な振る舞いではないからです。

観察可能は振る舞いではないものをテストしようとすると、テストが実装の詳細と結びつき、リファクタリング耐性が失われてしまいます。

もしprivateなメソッドがビジネス上重要な役割を担っていて、どうしてもテストしたい場合は、他のクラスとして切り出すなどの処置をすると良いです。

# 良いテストの基本原則

良いテストの基本原則に **「観察可能な振る舞いのみを検証する」** というものがあります。これは『単体テストの考え方/使い方』の５章で紹介されているものです。

### 「観察可能な振る舞い」とは

以下の2つを満たすものが観察可能な振る舞いです。

- クライアントが目標を達成するために使われる、公開された「**操作**」
- クライアントが目標を達成するために使われる、公開された「**状態**」

例えば、人件費を計算する`getCosts`というメソッドがあるとします。そして`getCosts`は`calc`、`sum`というメソッドを内部で利用しています。

```php
public function getCosts()
{
	$tmp = calc();
	$result = sum($tmp);	
	return $result;
}

private function calc()
{
	// 何らかの処理
}

private function sum($tmp)
{
	// 何らかの処理
}
```

この時、`getCosts`を呼び出しているクライアントからすると、**目的を達成するために呼び出しているのは`getCosts`のみ**であり、`calc`や`sum`は「観察可能な振る舞い」ではありません。

ここで、`getCosts`がクライアントとなって`calc`や`sum`を呼び出しているではないか、という指摘が入るかもしれません。もし`calc`や`sum`が他のクラスで定義されているpublicメソッドであるなら、その指摘は正しいです。`getCosts`は`calc`や`sum`からすると、外部（クライアント）であるとみなすことができます。

ですが今回、2つのメソッドはprivateです。privateメソッドは外部から秘匿されたものであり、内部実装（実装の詳細）になります。なので2つのメソッドは観察可能な振る舞いとは言えません。

### なぜ観察可能な振る舞いのみテストをするのか

端的に言うと、**テストケースが実装の詳細を結びついてしまう**からです。

テストケースが実装の詳細と結びつくとは、テストケースが、テスト対象であるものの内部的なコードを扱ってしまうことです。

逆に実装の詳細との結びつきがないテストとは、テスト対象がどのような結果を生み出すのか、ということを検証するものです。テスト対象がどのようにしてその結果を生み出すのかはテストしません。これは、検証時に目を向けるのは **何（What）** であり、 **どのように（how）** ではないと説明されることがあります。

実装の詳細と結びついたテストを実装してしまうと、結果として**リファクタリング耐性を失う**ことになります。

例えば、`getCosts`（コストを取得するメソッド）のテストをするとき、`getCosts`が内部で呼び出しているprivateメソッドが何回呼ばれているのかをカウントしたりするのは、まさにテスとケースと実装の詳細が結びついてしまっている例になります（本来はWhatのみを見るべきなので、ここではgetCostsに特定の引数を渡すと、特定の値が常に返ってくる、ということのみをテストするのが良いです）。

これをしてしまうと、`getCosts`の内部処理が変更されたとき、テストコードも変更しなくてはならなくなります。つまり、正しくリファクタリングを行えていたとしても、テストが通らなくなる偽陽性の状態になってしまうということです。

これはリファクタリング耐性を失ってしまっていると言えます。

### 抽象化の欠落

ただ、privateなメソッドがビジネス上重要な役割を担っていて、どうしてもテストしたい場合というのもあるかと思います。

例えば以下のように金額を計算するクラスがあったとします。

```php
class Order
{
	public function GenerateDescription()
	{
		$amount = calc();
		return "合計金額は" . $amount . "円です";
	}
	
	private function calc()
	{
		// とても重要で複雑な処理...
	}
}
```

原則に従うならprivateメソッドであるcalcはテストを書いてはいけませんが、calcの処理はとても複雑かつ重要な役割を担っています。

このように、重要なビジネスロジックがprivateメソッドに埋もれてしまうことを**抽象化の欠落**といます。

抽象化の欠落が起きている場合、privateメソッドは別のクラスに切り出した方がいいです。

```php
class Order
{
	public function GenerateDescription()
	{
		$service = new Calculate();
		$amount = $service->calc();
		return "合計金額は" . $amount . "円です";
	}
	
	// private function calc()
	// {
	// 	// とても重要で複雑な処理...
	// }
}

class Calculate
{
	public function calc()
	{
		// とても重要で複雑な処理...
	}
}
```

privateなメソッドをテストしたいから別のclassに抽出する、ということは、privateなメソッドを観察可能な振る舞いに変えたという点では、privateをpublicに変えただけのように見えるかもしれません。でもこのような切り出しを行うことで

- インターフェースを適切に用意すればカプセル化を維持できる
- テストが容易になる
- 責任範囲が明確になる

などのメリットがあります。

これは、観察可能は振る舞いを少し増やすには十分なメリットではないのかなと思います。

# 終わりに

privateなメソッドに単体テストを書くことはアンチパターンではありますが、実はリフレクションなどを使えば、わざわざサービスに切り出さなくてもテストすること自体はできてしまいます。実務ではそのようにせざるを得ない場合もあるのかなと思います。

私自身またまだテストに対する知識や経験がないので、誤り等ございましたらご指摘いただけるとありがたいです。

# 参考
- https://book.mynavi.jp/ec/products/detail/id=134252
Gitのユーザー設定をプロジェクトごとに自動で切り替える方法

## はじめに

GitHubなどのリモートリポジトリサービスでは、リポジトリごとに正しいアカウント情報が必要です。
たとえば、あるプロジェクトではデフォルトのアカウント「default-user」（メール: default@example.com）で管理し、特定のプロジェクトだけ「work-user」（メール: work@example.com）を使用したい場合、グローバル設定だけでは対応が難しくなります。

Git 2.13以降では、`includeIf` 機能を使って条件に応じた設定ファイルを自動的に読み込むことができるため、プロジェクトごとに異なるユーザー情報を簡単に適用することが可能になりました。

---

## 設定手順

### 1. 各アカウント用のGit設定ファイルを作成

まず、使用する各アカウントごとに専用の設定ファイルを用意します。

#### work-user用の設定ファイル

ターミナルまたはVSCodeのターミナルで、以下の内容を `~/.gitconfig-work` として保存します。

```ini
[user]
    name = work-user
    email = work@example.com
```

#### default-user用の設定ファイル（任意）

今回はグローバルのデフォルト設定として使用するため、`~/.gitconfig` に直接設定するか、別ファイルにしても構いません。ここではグローバル設定に直接記述します。

---

### 2. グローバル設定ファイル（~/.gitconfig）の編集

次に、グローバル設定ファイルである `~/.gitconfig` を編集し、条件に応じた設定ファイルを自動で読み込むようにします。
今回は、特定の2つのプロジェクトに対して work-user の設定を適用し、その他のリポジトリではデフォルトの設定を使用するようにします。

1. ターミナルで以下のコマンドを実行してVSCodeで `~/.gitconfig` を開きます。

   ```bash
   code ~/.gitconfig
   ```

2. 既存のユーザー設定をデフォルトとして「default-user」に設定し、特定のプロジェクトには `includeIf` を使って work-user の設定を上書きするように記述します。
2. たとえば、以下のように編集します。

   ```ini
   [user]
       name = default-user
       email = default@example.com

   [includeIf "gitdir:/Users/username/Projects/Project-Alpha/"]
       path = ~/.gitconfig-work

   [includeIf "gitdir:/Users/username/Projects/Project-Beta/"]
       path = ~/.gitconfig-work

   [filter "lfs"]
       smudge = git-lfs smudge -- %f
       process = git-lfs filter-process
       required = true
       clean = git-lfs clean -- %f

   [http]
       postBuffer = 524288000
   ```

> **ポイント**
>
> - **デフォルト設定:**  
>   includeIf にマッチしないリポジトリでは、グローバル設定の「default-user」（default@example.com）の情報が適用されます。
>
> - **特定プロジェクトの上書き:**  
>   `/Users/username/Projects/Project-Alpha/` および `/Users/username/Projects/Project-Beta/` 内のリポジトリでは、`includeIf` により `~/.gitconfig-work` の設定が自動で読み込まれ、グローバル設定が上書きされます。
>
> - **絶対パスについて:**  
>   絶対パスを使用することで、リポジトリの位置を明確に指定できるため安心です。末尾にスラッシュを入れることを忘れずに。

---

### 3. SSH設定の自動切り替え（任意）

GitHubなどでSSH認証を使用している場合、各アカウントごとに異なるSSHキーを設定すると、リモートへのアクセスも自動で切り替えられます。以下はその一例です。

1. `~/.ssh/config` を開き、以下のように設定します。

   ```ini
   # work-user用の設定
   Host github-work
       HostName github.com
       User git
       IdentityFile ~/.ssh/id_rsa_work

   # default-user用の設定
   Host github-default
       HostName github.com
       User git
       IdentityFile ~/.ssh/id_rsa_default
   ```

2. リモートリポジトリのURLを、設定したホストエイリアスに合わせて変更します。たとえば、work-user用のリポジトリは次のように設定します。

   ```bash
   git remote set-url origin git@github-work:username/repo.git
   ```

---

### 4. 設定の反映確認

設定が正しく反映されているか、各プロジェクトのディレクトリに移動して以下のコマンドを実行し、ユーザー名とメールアドレスが正しいか確認します。

```bash
git config user.name
git config user.email
```

対象プロジェクトで正しい情報が表示されれば、設定は成功です。もし反映されない場合は、Gitのバージョンやパスの記述、ターミナルやVSCodeの再起動などを確認してください。

---

## まとめ

この記事では、Gitの`includeIf`機能を活用し、プロジェクトごとに自動でユーザー情報を切り替える方法を解説しました。これにより、複数のアカウントを使い分けている場合でも、リポジトリごとの設定ミスを防ぎ、スムーズなコミットやデプロイが実現できます。  
MacやVSCode環境での設定手順も紹介しましたので、ぜひ自分の開発環境に合わせて活用してください。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
Unity-VFX、Play()で出す？PrefabからInstantiateして出す？

VFXを出す位置が決まっている⇒Play()
ex:銃のマズルフラッシュ
出す位置が決まっていない⇒PrefabからInstantiate()
ex:銃の球の当たったときのVFX

と、思っていたが、
割と柔軟に対応できるかも。結局、位置を更新してPlayすればいいだけの話だし、InstantiateとPlayだとPlayの方が軽そうだし、そういうのを考慮してかな。