OmniAICreator/Qiita-1.07M huggingface dataset:
バッチ実行中にファイル選択やフォルダ選択を行うGUI その２

# はじめに
以前、Visual Basic Advent Calendar 2021 にて、VBScript を使用してバッチ実行中にファイル選択やフォルダ選択を表示する記事を投稿しました。

https://qiita.com/yaju/items/3cea48dc3559450f194b

VBScriptが廃止方向になっているため、代替としてPowerShellで組み直しました。

# ファイル選択

|項目|内容|
|:--|:--|
|初期フォルダ|set InitialDirectory=(初期フォルダを指定)|
|タイトル|set Title=(タイトル名を指定)|
|拡張子フィルター|set "Filter=(フィルターを指定)"|

```bat:fileRef.bat
@echo off

set InitialDirectory=C:\Temp
set Title=ファイルを選択してください
set "FILTER=テキスト (*.txt)|*.txt|すべてのファイル (*.*)|*.*"
set diaglog="Add-Type -AssemblyName System.Windows.Forms;
set diaglog=%diaglog%$f = new-object Windows.Forms.OpenFileDialog;
set diaglog=%diaglog%$f.Filter = '%FILTER%';
set diaglog=%diaglog%$f.InitialDirectory = '%InitialDirectory%';
set diaglog=%diaglog%$f.Title = '%Title%';
set diaglog=%diaglog%$f.ShowHelp = $true;
set diaglog=%diaglog%$f.Multiselect = $true;
set diaglog=%diaglog%[void]$f.ShowDialog();
set diaglog=%diaglog%if ($f.Multiselect) { $f.FileNames } else { $f.FileName }"

for /f "delims=" %%I in ('powershell -ExecutionPolicy RemoteSigned -NoProfile -Command %diaglog%') do (
   echo selected  file is : "%%~I"
)
pause
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/bbc3a603-ef76-4f23-a43a-98db805dd580.png)

```bat:結果
C:\Temp>fileRef.bat
selected  file is : "C:\Temp\江戸時代の円周率.txt"
続行するには何かキーを押してください . . .
```

# フォルダ選択

|項目|内容|
|:--|:--|
|ルートフォルダ|set RootFolder=(ルートフォルダを指定)|
|初期フォルダ|set SelectedPath=(初期フォルダを指定)|
|説明|set Description=(説明を指定)|

```bat:folderRef.bat
@echo off

set RootFolder=MyComputer
set SelectedPath=C:\Temp
set Description=読込みフォルダを選択してください

set diaglog="Add-Type -AssemblyName System.Windows.Forms;
set diaglog=%diaglog%$f = new-object Windows.Forms.FolderBrowserDialog;
set diaglog=%diaglog%$f.Description = '%Description%';
set diaglog=%diaglog%$f.RootFolder = '%RootFolder%';
set diaglog=%diaglog%$f.SelectedPath = '%SelectedPath%';
set diaglog=%diaglog%[void]$f.ShowDialog();
set diaglog=%diaglog%$f.SelectedPath"

for /f "delims=" %%I in ('powershell -ExecutionPolicy RemoteSigned -NoProfile -Command %diaglog%') do (
    echo selected  folder is : "%%~I"
)
pause
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/61f8a241-6e50-4811-a7ee-7695f6d05d03.png)

```bat:結果
C:\Temp>folderRef.bat
selected  folder is : "C:\Temp\iniTest"
続行するには何かキーを押してください . . .
```

# 最後に
これまでは、フォルダ固定にしていたりファイルやフォルダをドラッグ＆ドロップして引数から処理してました。自分が使用するだけならいいのですが、他の人に操作を依頼するなら、GUIでファイル選択やフォルダ選択できれば、操作性は向上します。
[PowerShell 7] 補完候補(グレー)の確定方法 は → キー


## In a nutshell
PowerShell 7 の予測補完は，`->`キーにより確定できる．


## はじめに
PowerShell 7 の予測補完機能は賢いが，補完候補の決定方法に戸惑った．忘備録として，以下に纏めた．


## 予想される読み手
 - 最近，PowerShell 7 に移行した
 - 今後，PowerShell 7 に移行する予定がある
 - 補完機能の動作に違和感がある


## 補完機能と，生じた問題
PowerShell 7 にはコマンド補完機能があり，予測補完によって，よく使うパスやコマンドの候補がグレーで表示される．`cd` 等を入力すると，グレーで補完候補(例:`(.\BB\)`)が表示される．この`(.\BB\)`を入力しようと思い，Tabキーを押すと，この補完ではなく先頭候補(例:`.\AA\`)が入力されてしまう．つまり，表示されている補完をそのまま確定したいのに，他の候補に飛んでしまう．

```powershell
cd .\BB\  #<-(予測補完,グレー表示)
```


## 補完候補の確定について
予測補完で表示された候補をそのまま入力したい場合，`->`キー(右矢印キー)によって確定できた．tabキーでは無いので注意．この違いは直感的ではなく，特に従来のPowerShellに慣れていたユーザーにとっては混乱の原因になりえる．私は VSCode のターミナルや Git Bash に慣れていた為，PowerShell 7 に切り替えた際，予測補完の「グレー表示」に対して自然と Tab を押して確定しようとしていた．しかし，PowerShell 7 では，Tab は `Get-Command` 系の従来の補完に即座に移行するため，目的の動作をしない事となった．これらから，予測補完(非確定表示)と通常補完(確定候補選択)が別のロジックで動いている事を理解した．
PowerShellでは「補完は補完，予測は予測」と設計が明確に分離されている．これは，意図的な仕様である可能性が高く，ユーザー側がその設計思想に慣れる必要がある．


## 補足
### 補完の挙動をカスタマイズする
補完候補の表示や種類は，以下のコマンドより `PSReadLine` の設定により変更できる．これらの設定は，セッションごとにリセットされるため，`Microsoft.PowerShell_profile.ps1` に記述することで変更を確定できる．

```powershell
# 履歴とプラグインの候補から予測を表示(推奨設定)
Set-PSReadLineOption -PredictionSource HistoryAndPlugin

# 予測補完を完全に無効にする
Set-PSReadLineOption -PredictionSource None

# 補完候補をリスト表示に変更
Set-PSReadLineOption -PredictionViewStyle ListView

# デフォルトの Inline 表示に戻す
Set-PSReadLineOption -PredictionViewStyle InlineView
```

一般には，設定ファイルは以下のパスに存在する(Win11)
`C:\Users\<ユーザー名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1`

存在しない場合には手動で作成可能．プロファイルのパスは以下で確認できる．

```powershell
$PROFILE
```

### 予測補完の仕組み
PowerShell 7 における予測補完機能は，`PSReadLine` モジュールにより提供されている．これは，過去の入力履歴や，プラグイン(例:`CompletionPredictor`)を用いて，コマンドの候補を，インライン表示する．表示される補完は，確定操作(右矢印キーなど)を行わない限り，入力内容として確定されない．

この予測補完は，次のような `PredictionSource` によって動作の元を制御できる
- `History`:ユーザーの入力履歴に基づいて候補を表示
- `Plugin`:補完プラグインによって候補を表示
- `HistoryAndPlugin`:両方を併用(推奨)

各候補が `PredictionResult` オブジェクトとして保持され，`ViewStyle` によって表示形式(Inline / ListView)が変わる仕組みになっている．

### VSCodeとPowerShell補完の関係
VSCodeでは，PowerShell拡張をインストールすると，予測補完がよりリッチに動作する場合がある．しかし，予測候補の表示形式や確定キーの仕様は，ローカルPowerShell端末と同様であるため，本記事の内容はVSCode内でも有効である．


## Summary
- PowerShell 7の予測補完はグレー表示で候補を提示する
- Tabキーでは予測候補を確定できず，右矢印キーを使用する
- PSReadLine設定により補完の挙動をカスタマイズ可能


## References

- [Microsoft. Learn > PowerShell > PSReadLine. Microsoft Learn.](https://learn.microsoft.com/en-us/powershell/module/psreadline/?view=powershell-7.5)
- [PowerShell Team. PSReadLine. GitHub](https://github.com/PowerShell/PSReadLine)
SymPy・LaTeX・HTML・数式表示を組み合わせてPythonコードで出力


##  はじめに
本記事では、SymPy・LaTeX・HTML・数式表示を組み合わせて、三平方の定理（ピタゴラスの定理）を視覚的にわかりやすく解説するPythonコードをご紹介します。
Jupyter Notebook や Google Colab 上で使えるこのコードは、数式を美しくレンダリングしながら、理論と実例を直感的に理解できる構成になっています。

教材づくりや学習メモ、教育用途にも活用できるので、ぜひご活用ください。


##  Pythonコード

```python
from sympy import symbols, Eq, latex
from IPython.display import display, HTML, Math
import sympy as sp
import matplotlib.pyplot as plt

# 変数の定義（Define variables）
a, b, c = symbols('a b c')
pythagorean_theorem = Eq(c**2, a**2 + b**2)
latex_eq = latex(pythagorean_theorem)

# タイトルのHTML（Title section）
header_html = """
<div style="font-size:28px; font-family:'Yu Mincho', 'Hiragino Mincho ProN', serif; font-weight:bold;">
三平方の定理（ピタゴラスの定理）
</div>
"""

# 本文のHTML（Body section with Japanese + LaTeX inline）
body_html = """
<div style="font-size:18px; font-family:'Yu Gothic', 'Hiragino Kaku Gothic ProN', sans-serif;">
三平方の定理とは、直角三角形における辺の長さの関係を示す基本的な定理です。<br><br>
直角をはさむ2辺の長さを <span style="color:blue;">\\( a \\)</span> と <span style="color:blue;">\\( b \\)</span>、斜辺の長さを <span style="color:red;">\\( c \\)</span> としたとき、次の関係式が成り立ちます。
</div>
"""

# 数式（Equation rendering with size）
equation_latex = f"\\displaystyle \\Huge {latex_eq}"

# 応用・例のHTML（Applications and example）
example_html = """
<div style="font-size:16px; font-family:'Yu Gothic', sans-serif;">
<br>
<b>■ 例：a = 3, b = 4 のとき</b><br>
このとき斜辺は：<br>
\\[
c^2 = 3^2 + 4^2 = 9 + 16 = 25 \\\\
\\Rightarrow c = \\sqrt{25} = 5
\\]<br>
つまり、(3, 4, 5) は三平方の定理を満たす整数の組（ピタゴラス数）です。<br><br>

<b>■ 応用</b><br>
・座標平面上での距離計算（ユークリッド距離）<br>
・ベクトルの長さの算出<br>
・建築、測量、ゲーム開発など多数の分野で使用されます。<br>
</div>
"""

# 表示（Render all）
display(HTML(header_html))
display(HTML(body_html))
display(Math(equation_latex))
display(HTML(example_html))

# シンボルの定義（再度）
a, b, c = sp.symbols('a b c')

# 三平方の定理
pythagoras_eq = sp.Eq(c**2, a**2 + b**2)

# LaTeX表示（サイズ指定なし）
display(Math(r"\text{Pythagorean Theorem: } c^2 = a^2 + b^2"))

# 例：a = 3, b = 4 の場合のcを計算
solution = sp.solve(pythagoras_eq.subs({a: 3, b: 4}), c)
display(Math(r"\text{Example: } a=3, b=4 \Rightarrow c = " + sp.latex(solution[1])))

# Matplotlibで数式を表示
plt.figure(figsize=(6, 2))
plt.text(0.5, 0.5, r"$c^2 = a^2 + b^2$", fontsize=24, ha='center', va='center')
plt.axis('off')
plt.title("Pythagorean Theorem", fontsize=16)
plt.show()

# IPython DisplayでLaTeX数式を表示（サイズ調整）
display(Math(r"\displaystyle \textbf{\Huge $c^2 = a^2 + b^2$}"))

```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/1922d13c-51a1-4176-875a-f16d4fd2c547.png)
XR Simulation vs XR Device Simulator: Unityにおけるシミュレーションの違いと使い分け

#### 1. はじめに

UnityにはXR開発のための2つの主要なシミュレーションツール、**XR Simulation**と**XR Device Simulator**があります。 それぞれの特徴や適用シーンを比較し、どのように使い分けるべきかを解説します。

#### 2. 概要

| Feature | XR Simulation | XR Device Simulator |
| --- | --- | --- |
| 目的 | 仮想環境でのARシミュレーション | HMDやコントローラーのエミュレーション |
| 主な用途 | ARアプリの空間認識・環境テスト | XRデバイスがない状態での入力テスト |
| 対応プラットフォーム | AR Foundation対応環境 | OpenXR、XR Interaction Toolkit対応環境 |
| 主なAPI | AR Foundation, AR Subsystems | XR Interaction Toolkit, OpenXR |
| 含まれるライブラリ | com.unity.xr.arfoundation (AR Foundation) | com.unity.xr.interaction.toolkit (XR Interaction Toolkit) |
| インストール方法 | Unity Package Managerから追加 | Unity Package Managerから追加 |
| シミュレーション範囲 | 環境全体（空間、照明、オブジェクト） | デバイス操作（HMD、コントローラー入力） |

#### 3. 詳細な比較

### 3.1 XR Simulation

#### 概要

- **AR環境のシミュレーションを行うツール**

- `AR Foundation` (`com.unity.xr.arfoundation`) に含まれる
- ARデバイスなしでエディタ内で仮想的にAR体験を再現可能
- **仮想環境での空間認識**

- 平面検出、環境マッピング、仮想オブジェクト配置をシミュレーション
- **主な適用シーン**

- **ARアプリ開発**（ARCoreやARKitを使用するプロジェクト）
- **空間認識やオブジェクト配置のテスト**

#### インストール方法

1. **Unity Package Managerを開く**
2. **"AR Foundation" (com.unity.xr.arfoundation) を検索しインストール**
3. **"AR Subsystems" (com.unity.xr.arsubsystems) も必要に応じて追加**

---

### 3.2 XR Device Simulator

#### 概要

- **HMD・コントローラーの入力をエミュレートするツール**

- `XR Interaction Toolkit` (`com.unity.xr.interaction.toolkit`) に含まれる
- XRデバイスがなくても、キーボードやマウスでHMDやコントローラーの動作をテスト可能
- **OpenXRやXR Interaction Toolkitと連携**

- OpenXR (`com.unity.xr.openxr`) を使用することでVRデバイスの動作確認が可能
- **主な適用シーン**

- **VRアプリ開発**（Meta QuestやPC VR向け）
- **HMDやコントローラーの入力テスト**

#### インストール方法

1. **Unity Package Managerを開く**
2. **"XR Interaction Toolkit" (com.unity.xr.interaction.toolkit) を検索しインストール**
3. **"OpenXR Plugin" (com.unity.xr.openxr) も必要に応じて追加**
4. **Project Settings → XR Plug-in Management で OpenXR を有効化**

---

#### 4. どちらを使うべきか？

| 用途 | 適切なツール |
| --- | --- |
| ARアプリの開発・テスト | XR Simulation |
| VRアプリの開発・テスト | XR Device Simulator |
| 環境認識（平面検出、オクルージョンなど）を試したい | XR Simulation |
| HMDやコントローラーの入力をテストしたい | XR Device Simulator |

---

#### 5. まとめ

- **XR Simulation** は **AR環境のシミュレーション** を行い、AR Foundation (`com.unity.xr.arfoundation`) に含まれる。
- **XR Device Simulator** は **XRデバイスのエミュレーション** を行い、XR Interaction Toolkit (`com.unity.xr.interaction.toolkit`) に含まれる。
- プロジェクトの用途に応じて適切なツールを選択することが重要。

#### 参考
- [XR Simulation | AR Foundation | 6.1.0](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.1/manual/xr-simulation/simulation.html)
- [XR Device Simulator | XR Interaction Toolkit | 3.1.1](https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@3.1/manual/xr-device-simulator.html)
create-react-appから、reactをインストールする方法

## 1.Node.jsのインストール
下記をインストール
https://nodejs.org/ja/

確認として、CMDでnode -vをたたく。
```
C:\Users\kokor\OneDrive\work\test_react>node -v
v22.14.0
```


## 2.npmのインストール
npmとはNode Package Managerの略。
npmのインストール

```
sudo npm install -g npm
```
今回はグローバルにインストールをする。

npmもnpm -vでインストールができているか確認できる。
```
C:\Users\kokor\OneDrive\work\test_react>npm -v
11.2.0
```



## 3.PJの作成

create-react-app PJ名
今回はtest_reactなので
create-react-app test_react


```
C:\Users\kokor\OneDrive\work>create-react-app test_react

Creating a new React app in C:\Users\kokor\OneDrive\work\test_react.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...


added 1324 packages in 31s

268 packages are looking for funding
  run `npm fund` for details
Git repo not initialized Error: Command failed: git --version
    at genericNodeError (node:internal/errors:983:15)
    at wrappedFn (node:internal/errors:537:14)
    at checkExecSyncError (node:child_process:882:11)
    at execSync (node:child_process:954:15)
    at tryGitInit (C:\Users\kokor\OneDrive\work\test_react\node_modules\react-scripts\scripts\init.js:46:5)
    at module.exports (C:\Users\kokor\OneDrive\work\test_react\node_modules\react-scripts\scripts\init.js:276:7)
    at [eval]:3:14
    at runScriptInThisContext (node:internal/vm:209:10)
    at node:internal/process/execution:449:12
    at [eval]-wrapper:6:24 {
  status: 1,
  signal: null,
  output: [ null, null, null ],
  pid: 19884,
  stdout: null,
  stderr: null
}

Installing template dependencies using npm...

added 18 packages, and changed 1 package in 4s

268 packages are looking for funding
  run `npm fund` for details
Removing template package using npm...


removed 1 package, and audited 1342 packages in 3s

268 packages are looking for funding
  run `npm fund` for details

8 vulnerabilities (2 moderate, 6 high)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

Success! Created test_react at C:\Users\kokor\OneDrive\work\test_react
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd test_react
  npm start

Happy hacking!
```


## 4.プロジェクトを実行
作成されたプロジェクトを実際に動かしてみます。
コマンドまたはターミナルから、「cd test_react」を実行してtest_reactフォルダの中に移動します。
そして、以下コマンドを実行します。
```
npm start
```

npm startは、開発用のWEBサーバープログラムを起動し、そこでアプリケーションを公開し、アクセスできる状態にします。
「http://localhost:3000/」
に自動でアクセスされます。これがアプリケーションのアドレスになります。
Reactのロゴがゆっくりと回転する画面が表示されていたら成功です。
これで、プロジェクトを実行してWEBブラウザでアプリの画面を表示する操作ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747836/819b4774-a9d4-474c-a35e-0ee0826f9e0c.png)

動作を確認できたら、コマンドまたはターミナルに戻り、Ctrlキーを押したまま「C」キーを押してスクリプトの実行を中断しましょう。
Unity XR Simulationの使い方


UnityのXR Simulationを使用すると、エディタ内でXR環境をテストできます。しかし、タッチパッドを使用した場合、Playモード中にタップしか認識されず、移動や床のタップが有効になりません。そのため、**必ずマウスを使用すること**を推奨します。

## マウスを使った操作
XR Simulation内で正しく操作するために、マウスを使用して以下の操作を行います。
- **左クリック**: タップ動作
- **右クリック + ドラッグ**: カメラの回転
- **WASDキー**: 移動（移動が有効な場合）
- **マウスホイール**: ズーム
タッチパッドでは、これらの操作が制限されるため、意図した通りのテストができませんでした。

## 移動操作の参考資料
XR Interaction Toolkitを使用した移動操作の詳細については、以下の公式ドキュメントが参考になります。
[AR インタラクションの概要 | XR インタラクション ツールキット | 3.0.8](https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@3.0/manual/ar-interaction-overview.html)
このドキュメントでは、AR環境での移動やオブジェクトの操作方法について詳しく説明されています。

## まとめ
- XR Simulationをエディタで使用する際、タッチパッドではタップしか認識されない。
- **マウスを使用することで移動や床のタップが可能になる。**
- 移動操作の詳細は、公式ドキュメントを参照。
これらを踏まえて、効率的にXR Simulationを活用しましょう！

## 参考
- [XR Simulation | AR Foundation | 6.1.0](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.1/manual/xr-simulation/simulation.html)
- [はじめに | AR Foundation | 6.1.0](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.1/manual/xr-simulation/simulation-getting-started.html)
RoboCup junior japan open名古屋2025体験記

#### 質より速度だと思いました、後々更新していきます
あとqiitaマークダウン書きづらい
## 参加種目
私達、終止コドンREはWRLに岡山ブロック代表として参加しました。


## 機体
今大会で使用した[機体](https://drive.google.com/file/d/1J8jBWeWzTXdDuXNCHve6iZQvhyrY8Jbj/view?usp=sharing)は完全にEV3のみで開発されており、プログラムはEV3mindstomeのブロックプログラムによって作成されています。
~~ノーコードが嫌いなので僕は開発していません、EV3ブロックも作ってない~~
全国で使用するつもりはなかったのでレスキュゾーンは処理できません。(レスキューキットは入れられる)
緑の精度だけは高く、読み取れなかったことがありません。
~~HSVのほうが便利~~

## 次世代機について
**今回の大会では使用しませんでしたが、現在次世代機の開発をしています。**
部費やスポンサーの支援を開発費が超過したので金欠になりました。
開発が間に合わなかったのはすべて[**ある3Dプリンタ**](https://qiita.com/syuusikodonre/items/e5d04fb7208a18e14efc#%E5%95%8F%E9%A1%8C%E7%82%B93%E7%94%A3%E5%BB%833d%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BCankermake)のせいです。
次世代機についての情報、特にソフトウェアは**部外秘**~~私以外知らないし、多分理解できない~~なので、記事は来年のジャパンオープン以降にすると思います。ハードウェアも一部は部制 ~~実は個人製作~~ 
ありとあらゆるデータをgithubで公開する予定です。
スポンサー募集中、個人でも可能です。


## 結果
**順位は20位中11位という結果になりましたが、ソフトウェア奨励賞を頂くことができました。**

センサーの調整と白飛び、独自のID制御技術の調整不足等がこの順位の低さにつながってしまいました。
賞がもらえた理由は本当にわかりません、教えてほしいぐらいです。


## 問題点
### 問題点1：白飛び
ライントレースの補助に利用したどこの家庭にもある4000kのLEDテープが黒ラインの白飛びの問題を引き起こしました。
環境光対策の一環でしたが、実際のコースは環境光対策がなくてもほとんど問題がありませんでした。
1000kのものを使うか、テープなどで減衰させるべきでした。


### 問題点2：ID制御

ID制御に頼りすぎた、普通にPIDしたほうがいい。
ID制御はPゲインを下げると補正値が大きくなる面白いプログラムです。
マジック定数がたくさん発生しています、今度計算して謎を解き明かしたいです。
~~来年は全く異なる方式の予定なのでこいつが日の目を浴びる時は一生来ません~~

<h3>問題点3：産廃3Dプリンター（AnkerMake）

<strong>Anker負けを購入した~~気づいたら部室にあった~~のがすべての敗因です。
AnkerMakeには以下の問題がありました。<br>

・エラーコードの実装で論理エラーあった(**モータが動かない＝データが範囲外**と判断しているのでモーターが動けないとき、データ転送エラーを吐く)
・PLA＋(公式フィラメント)使用時の固定力の弱さで印刷物がうまく印刷できない
・PLA＋(公式フィラメント)使用時の固定力の弱さで強度が出ない
・ノズル先温度の設定が低めで冬場は支障が出る
・純正スライサーがほぼOSSそのまま
・純正スライサーのスライス機能で設定された範囲内でも端のほうの印刷物が本体の脚と干渉する。
・性能のわりに高い(廉価版は約6万)
・純正フィラメントも高い(ロール4000円超)
・サポートが本体から綺麗にはがれない
・プリヒート時にフィラメントが垂れる
・トラブルを多発し試作機すら作らせてくれない
・WIFIドライバがよく落ちる、再起動怠い
・3MFファイルで製造時ほんの少し穴の寸法が**小さく**印刷されている
<br>
**上記の理由からAnkerMakeは、使い物になりません。bambulabとCNC欲しい**


<h2>名古屋での生活(半分愚痴)
<h3>拠点：チサンイン名古屋

特徴
・エアコン調整できない、換気扇はある
・部屋激狭(コース広げられない)
・机小さい
・回線はまあまあ早かった(230Mbps)
~~・加湿器とポッドが壊れやすい~~

<h2>食事

名古屋駅周辺は物価が高く、スーパーもなかったので食費を抑えにくい様です。
来年は開発費が今より圧迫して、食費も残らない可能性がありますが、今年は名古屋名物を食べまくりました。
誰か余ってる材料あったらください
![IMG_20250329_202827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985874/87f677bb-a99c-45fc-8c82-0e81cd3be909.png)



<h2>会場

今回の大会は面白いことがたくさんありました。

・自販機から蓋がべたべたのコーヒーが出てくる(原因不明)
~~迷ったけど蓋洗って飲んだ~~

・目に入ってきたスマホが背面八眼カメラ搭載
ほかにも背面4眼以上の人が多かったので、来年は対抗するためにケータイを10眼に改造して行きたいです。

<h2>なにもまとまってないまとめ

名古屋観光めっちゃ楽しかった![IMG_20250330_170337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985874/53e3c8dc-dba0-4287-b902-68664ab72785.png)
【マインドセット】新卒・若手社員へ"うまく"触れ合っていくための方法論

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

来週で4月に突入するということで**新卒社員の入社シーズン**かと思います。
そのうえで、先輩社員・OJT担当として**新卒社員への触れ合い方**について整理したいと思います。

:::note info
私の経験をもとに執筆しているため、今回述べている内容がすべて正しいというわけではありません。
:::

# 目次
- 対象読者
- 触れ合い方を考える必要はあるのか
- 私なりの方法論
    - 新卒社員=能力が低いといったバイアスを抜く
    - 新卒からの提案を頭ごなしに否定しない
    - 外部交流の機会を積極的に作っていく
- まとめ

## 対象読者

次のような課題を抱えている方・考えている方向けに本記事を参考にしていただければ幸いです。

- これからOJT担当として新卒社員への教育を行っている方
- 新卒教育担当を担っている人事担当の方
- **新卒受け入れ経験が豊富だと思っている方**

## 触れ合い方を考える必要はあるのか

そもそも、新卒・若手社員に限らず触れ合い方を考える必要があるのでしょうか？
私個人としては**所属している企業の方向性・若手社員に対する考え方**によって変わるかと思います。

#### 触れ合い方を考えなくていい場合
- 一時的に雇用している・スペシャリスト枠として特定業務のみをさせる場合
- 新卒社員をそもそも雇っていない・20代社員がそもそも存在しない場合
- 創業したてで資金調達・事業創出が喫緊の課題の場合

上記のような特殊事例であれば、新卒・若手社員への触れ合い方は考える必要はそこまでないかと思います。（それ以上に解決すべき経営課題があるため、そちらにリソースを割いた方がよいと考えます。）

逆を言えば、上記以外であれば**新卒・若手社員への触れ合い方**を考えたほうがいいと思います。ただし、次の点を注意しながら触れ合い方を考えたほうがより良い結果につながると思います。

#### 注意すべき内容
- オンボーディング活動を行うことを目的化させない
    - KPIとしてイベント・1on1などの**数えられるもの**を指標としてしまいますが、結果として**KPI達成が目的となってしまい、本来果たすべき目的が達成できなくなってしまう**と考えられます
- かかわる新卒すべて同じ触れ合い方戦略を適用できない
    - 新卒によっては**社内メンバーとの触れ合いを重要視していない**といった場合もあります
    - そのような思考を持っている新卒社員へ積極的な交流を行った場合、逆効果になってしまう場合もあります

## 私なりの方法論

個人的に私なりの方法論についていくつか見つけたので言語化してみたいと思います。

### 新卒社員=能力が低いといったバイアスを抜く

**新卒社員=社会人経験が少ないから能力が低い**といったバイアスを抜くところが一番重要だと考えています。最近では、インターンシップなどを通じて早めに社会人経験を積んでいる新卒社員もいらっしゃるので、純粋な社会人スキルが高い方もいらっしゃると思います。

ざっくり言えば、**対等な立場として触れ合っていくこと**が大切なのではと考えています。

### 新卒からの提案を頭ごなしに否定しない

新卒からの提案を受けて**考慮が足りていない、抜け漏れがある**と思い、提案を頭ごなしに否定するのは得策ではないと考えます。オンボーディング視点もありますが、提案を頭ごなしに否定することで**この人には改善提案を行えない**といったマインドを持つようになるため、積極的な提案を行わなくなってしまいます。

そもそも、**新卒社員からの積極的な提案を受けるつもりはない**といった考えであれば、頭ごなしに否定するのを止めるつもりはありませんが、その先を考えるとよい未来があるかと言われたら、あまり良い未来はないのではと思ってしまいますね。

そのため、新卒からの提案を受けて**抜け漏れ**を感じたとしても、**提案に対する評価**を行ったうえで**改善点**を示すことが重要だと考えています。

### 外部交流の機会を積極的に作っていく

新卒社員が社内での動き方についてある程度慣れてきたら社外コミュニティ（技術系）のイベントに参加し、外部交流する機会を作っていった方がより成長できると考えています。

また、社外交流を通じて得た知見を社内還元する文化を醸成するきっかけにもなるので、より独創的なアイデア・提案が新卒・若手社員から生まれやすくなると考えています。

ただし、会社によってはものすごく否定的にとられかねない（自社との比較による転職リスクなど）ので慎重に行ったほうがいいと思います。（特に、人事担当が社外交流に対して否定的な考えを持っている場合、教育担当への風当たりが強くなるリスクがあるため控えたほうがいい場合もあります）

## まとめ

本来であればもっと考慮すべき事項が多数あると考えていますが、新卒・若手社員へうまく触れ合っていくための方法論として、現時点で私が思いつくのはこのくらいですね。

もちろん、最適解が存在するという話ではないと思いますので都度都度触れ合い方をブラッシュアップしていくことが大切だと考えています。

最後までお読みいただきありがとうございました！！
is_incrementalマクロの使い方の例

# はじめに
こんにちは、森田と申します。
このたび、dbt Analytics Engineering Certification Examに合格しましたので！！
勉強した中で、実務でも役にたったis_incrementalマクロについて、深掘り紹介したいと思います。

一応、dbt Analytics Engineering Certification Examの詳細は↓を見てもらえればと思います！
https://www.getdbt.com/dbt-certification
学習する際は、↓を参考にするといいです。
https://www.getdbt.com/dbt-assets/certifications/dbt-certificate-study-guide

勉強する際の注意点としては、まず全編英語です。教材も試験、試験官との会話もすべて英語です。
そもそも教材が二十時間分ぐらいありますが、字幕に日本語選択ないので英語のリスニングと字幕のリーディングで頑張る感じですので少し骨が折れますが、実践に使える内容が多いので勉強して損はないです。

さて、前置きはこのくらいにして、本編に入ります。

# 本編　is_incrementalマクロとは
dbtのモデルでmaterialized='incremental'した場合に使えるマクロです。
機能としては以下条件を満たす際にtrueを返すマクロです。
 * データベース内のテーブルとして既に存在している必要があります
 * full-refreshが渡されていない。

ちょっと、この条件だけだと使い道が分かりずらいですよね。。。。
使い方を考えてみましょう！

実行中のモデルは、materialized='incremental'である前提で、自己参照する処理を考えてみます。

```sql:myTabele.sql
{{
    config(
        materialized='incremental'
    )
}}

select * from {{ this }}
union all 
select * from {{ new_my_table }}
```

これをdbt runで初回実行しようとすると{{ this }}で自身を参照しているため、コンパイルされたタイミングで、{{ this }}がmytableに書き換わり、実行のタイミングで初回実行のため、まだmyTabeleは存在していないため、参照エラーになって実行できません。（以下、コンパイル例）
```sql:myTabele.sql
select * from xxxx.xxxx.myTabele
union all 
select * from xxxx.xxxx.new_my_Tabele
```

では、incrementalモデルで自己参照をして、初回（実体化前）でも実行できるようにするにはどうすれば良いでしょうか？

はい、is_incrementalマクロです。もう一度条件を見返すと
以下条件を満たす際にtrueを返します。
 * データベース内のテーブルとして既に存在している必要があります
 * full-refreshが渡されていない。

つまり、初回実行の際は、データベース内のテーブルとして既に存在していないのでfalseを返して、記載した処理が無視されるように制御できます。

先ほどの例にis_incrementalマクロを追加してみましょう。
{{ this }}で自身を参照しているすると初回でエラーになるためマクロで囲みます。union allも初回は不要なので含めることを忘れずに！！
```sql:myTabele.sql
{{
    config(
        materialized='incremental'
    )
}}

{% if is_incremental() %}
select * from {{ this }}
union all 
{% endif %}
select * from {{ new_my_table }}
```

初回実行時は、データベース内のテーブルとして既に存在していないのでis_incremental()がfalseを返して、is_incremental()で囲った部分が削除されます。

```sql:myTabele.sql
select * from xxxx.xxxx.new_my_Tabele
```

2回目以降は、my_Tabeleが存在するため、is_incremental()がtrueを返して、is_incremental()で囲った部分が追記されます。

```sql:myTabele.sql
select * from xxxx.xxxx.myTabele
union all 
select * from xxxx.xxxx.new_my_Tabele
```
incrementalモデルの初回実行時に動かしたくない、動かすとエラーになる処理はis_incremental()アクロを利用することでわざわざ手作業などで事前にテーブルを作らずにモデルを作成することができます。

# 終わりに
dbtは、SQLの汎用性の低い部分を補いつつ、やりたいと思うことがほとんど事前に揃っている最高のツールです。生SQLでAI学習データを作っていたあの頃に自分に欲しかった機能が詰まってます。
ぜひ、皆様も使ってみてください！！

以上！
[SAP Fiori UI5]XML バインディングのエラー回避について

## はじめに
皆さま、お疲れ様です。
SAP Fiori UI5 の XML ビューでは、バインディング式を使ってプロパティの値を動的に制御できます。
しかし、条件によってはエラーが発生することがあります。
今回は、 visible プロパティに対するバインディング式の記述方法について、具体的なエラー事例とその回避策を紹介します。

### 参考データ
DATA>/DataList/の中身
```
{
    "DATA": {
        "DataList": [
            { "Name": "Item1", "Value": "Value1" },
            { "Name": "Item2", "Value": "Value2" },
            { "Name": "Item3", "Value": "Value3" }
        ]
    }
}
```

## エラーが発生するバインディング式
以下のように visible プロパティをバインディングするとエラーが発生します。
```
<!-- この書き方ではエラーが発生する -->
<Button
    text="エラーが発生"
    visible="{= ${DATA>/DataList/}.length < 5}"
/>
```
この記述を行うと、「不明な属性キー」と表示され、想定の動きになりません。

### エラーの原因
このエラーが発生する主な原因は、バインディング式の構文にあります。具体的には、以下の点が問題となります。

1\. バインディング式の評価: バインディング式の評価時に、属性キーが正しく解釈されないため、エラーが発生します。

## エラーを回避する方法
以下のように記述すると、問題なく動作します。
```
<!-- 正しい書き方 -->
<Button
    text="正常動作"
    visible="{= 5 > ${DATA>/DataList/}.length"
/>
```
この書き方であれば問題なく実装することが出来ます。

## まとめ
SAP Fiori UI5のXMLビューでバインディング式を使用する際には、構文に注意が必要です。
特に、属性キーの指定方法に誤りがあるとエラーが発生することがあります。
今回紹介した方法を参考に、正しいバインディング式を記述してください。
【Git/GitHub】リリースしたmasterブランチにリリースバージョンのタグを設定する

主に製品のリリース時に、リリース内容をマージしたmasterブランチに対して、リリースバージョンのタグを設定したい場合があると思います。
今回、その設定のための手順をまとめます。


# 目次
* [1. Git Bashを開く](#1-git-bashを開く)
* [2. ブランチをmasterに切り替える](#2-ブランチをmasterに切り替える)
* [3. 最新のコミットを確認する](#3-最新のコミットを確認する)
* [4. コミットにタグを設定する](#4-コミットにタグを設定する)
    - [4-1. 最新のコミットにタグを設定する](#4-1-最新のコミットにタグを設定する)
    - [4-2. 特定のコミットにタグを設定する](#4-2-特定のコミットにタグを設定する)
* [5. 設定したタグを確認する](#5-設定したタグを確認する)
* [6. 設定したタグをGitHubにプッシュする](#6-設定したタグをgithubにプッシュする)
* [参考資料](#参考資料)


# 1. Git Bashを開く
はじめに、タグを設定したいリモートリポジトリをローカルにクローンします。
次にクローンしたローカルのフォルダ上で、左クリックから以下を選択します。
`Open Git Bash here`


# 2. ブランチをmasterに切り替える
Git Bashを開いた後、ローカルリポジトリのブランチが`master`では無い場合、以下のコマンドを実行して切り替えます。
```bash:bash
git switch master
```


# 3. 最新のコミットを確認する
最新のmasterブランチの状態を確認するために、以下のコマンドを実行して最新化します。
```bash:bash
git pull origin master
```

次に以下のコマンドを実行して、最新のコミットを確認します。
```bash:bash
git log
```


# 4. コミットにタグを設定する
タグの設定は、コミット単位で行います。
設定方法については、設定したいコミットの種類によって異なります。


# 4-1. 最新のコミットにタグを設定する
masterブランチの**最新のコミット**に対してタグを設定する場合、以下のコマンドを実行します。
```bash:bash
git tag -a v1.0.0 -m ''
```


# 4-2. 特定のコミットにタグを設定する
masterブランチの**特定のコミット**に対してタグを設定する場合、以下のコマンドを実行します。
```bash:bash
git tag -a v1.0.0 -m '' <特定のコミットIDを指定>
```


# 5. 設定したタグを確認する
設定したタグの一覧は、以下のコマンドを実行して確認できます。
```bash:bash
git tag
```

また、タグがどのコミットIDに設定されているかは、以下のコマンドで確認できます。
```bash:bash
git show v1.0.0
```

もし、設定したタグの名称が間違っていた場合は、以下のコマンドから削除できます。
```bash:bash
git tag -d v1.0.0
```


# 6. 設定したタグをGitHubにプッシュする
ローカルリポジトリ上でタグの設定が完了したら、設定した内容をGitHubに反映させます。
以下のコマンドを実行してGitHubにプッシュします。プッシュしたタグは、GitHubの`Tags`から確認できます。
```bash:bash
git push origin v1.0.0
```

もし、プッシュした内容を削除したい場合は、以下のコマンドを実行します。
```bash:bash
git push --delete origin tag v1.0.0
```

以上で、タグの設定は完了となります。


# 参考資料
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0
VJ素材をダウンロードするとき便利なyt-dlpのシェルスクリプト作った

VJ素材をダウンロードするにはyt-dlpを使うけど、いちいちコマンドやらオプションやらを入力するのは面倒いので、それを解決するスクリプトを作った。

# 前提条件
yt-dlpとかffmpegが導入されている

もしまだ導入してないなら、下の「参考」にやり方のリンク貼っといたから見てね

# シンプルにダウンロード

スクリプトはこちら、yt-dlpのオプションは各々で適宜変更してね。
```bash:simpledl.sh
#!/bin/zsh

cd ~/Desktop
echo "動画をダウンロード"
read "url_v"
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]" -o "%(title)s.%(ext)s" "$url_v"
```

# 繰り返しダウンロード
次のスクリプトは、ダウンロードが終わっても終了せずに、またURL入力待機状態に戻るスクリプト。
一回起動したら、いちいちスクリプトを呼び出さんでよくなる。

```bash:loopdl.sh
#!/bin/zsh

cd ~/Desktop

while true
do
  echo "動画をダウンロード"
  read "url_v"
  yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]" -o "%(title)s.%(ext)s" "$url_v"
done
```
スクリプトから抜ける時は^Cしてね。

# 使い方
1. テキストエディットにスクリプトをコピペして保存
![スクリーンショット05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/25db79c7-4c9e-477f-b0b5-5f8a632fbe19.png)

1. ターミナルで`sh simpledl.sh`(またはloopdl.sh)と入力してエンターキー押す
![スクリーンショット46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/4f2c994a-cd95-4042-bc27-91b7bed9d683.png)

1. `動画をダウンロード`と表示されたら、ダウンロードしたいURLを入力してエンターキー押す
![スクリーンショット44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/52cc73b4-f3b8-4299-958d-5ca86f857a7a.png)


以上

# ToDo
loopdl.shで^Cしなくても抜けられるようにしたい

# 参考

https://zenn.dev/ziaensochan/articles/5813a63b05fd4c

https://qiita.com/HXYoUGZ/items/509e02b5486e60e144ab
Qualys VMDRで検知した脆弱性情報のフィルタリング方法について

## はじめに
QualysVMDRで脆弱性を検知すると、デフォルトでは重要度（Severity Score）に関係なく全ての脆弱性が検出されます。
そのため、検知された脆弱性をフィルタリング、例えば重要度の高い脆弱性に絞って確認したい場面が出てくることがあるかと思います。
そこで、今回はそのためのフィルタリング方法について、自分の備忘録も兼ねて記事にしたいと思います。

## 前提
・Qualys VMDRのアカウントがあること
・脆弱性のスキャンが完了していること
・今回はQualys Detection Score（QDS）※１が「CRITICAL」でかつ、重大度のタイプが「Confirmed」※２の脆弱性を検索してみたいと思います。

※1:Qualys Detection Score（QDS）
1 ～ 100 までで、4 つの重大度に分かれています。

Critical: 90 ～ 100
High: 70 ～ 89
Medium: 40 ～69
Low: 1 ～ 39
【参考サイト】

https://qualysguard.qg3.apps.qualys.com/portal-help/ja/vm/threat/calculating_asset_risk_score.htm

※2:重要度のタイプ
・Vulnerabilities:脆弱性※Confirmed(確認済み)の対象はこのタイプになります。
・Potential Vulnerabilities:潜在的な脆弱性
・Information Gathered:収集情報

なお「Vulnerabilities」のSeverityは赤、「Potential Vulnerabilities」のSeverityは黄色、「Information Gathered」のSeverityは青で表示されます。

【参考サイト】

https://qualysguard.qualys.com/qwebhelp/jp/fo_portal/knowledgebase/severity_levels.htm

## フィルタリング方法
左側のメニューから「Vulnerabilities」を選択
![Qualys_メニュー_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c323a739-10cd-42d3-a46a-d1cc1b9d5466.png)
「Vulnerabilities」の画面で検知した脆弱性情報が表示されます。

Vulnerability の検索窓で
![Qualys_検索_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/36e0f80c-8fd3-482b-a36b-5f0ce0ebb757.png)


```
vulnerabilities.vulnerability.criticality:CRITICAL and vulnerabilities.typeDetected:Confirmed 
```
と入力します。
「and」と入力して検索キーワードを追加することができます。

![スクリーンショット 2025-03-30 183539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d8ad393d-b118-48a2-9a4d-c5e7aab9c867.png)

これで検出した脆弱性情報の中から「CRITICAL」でかつ「Confirmed」の情報が表示されます。
なお、検索キーワードを入力する際に「キーワード候補」や「View All Token」でキーワードの補完や検索が可能です。
![Qualys_キーワード候補とtoken_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/2e2a70f0-5c77-40a9-8042-3ce9c50a12a1.png)

「View All Token」をクリックすると以下の画面になります。
![Qualys_Search Token_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/88492836-ad4b-47d9-aab2-b2fcff5cfa44.png)
ここで検索方法や、キーワードについて調べることができます。

https://docs.qualys.com/en/vmdr/2.2.0/search_tips/search_ui.htm?rhsearch=critical

またAsset単位で脆弱性を検知したい場合は、以下の「Asset」を選択するとAsset単位で脆弱性情報を確認することができます。
![Qualys_Asset_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/3d7d92b5-97d2-4cc9-bc98-284dddbc2f0a.png)
※Asset:登録機器の単位

## フィルタリング結果の出力
検索した結果は右上のダウンロードボタンから、形式を選択して出力することができます。
![Qualys_ダウンロード_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/f6412561-abfc-41f7-bbe8-402ccc214919.png)
![Qualys_ダウンロードフォーマット_スクリーンショット 2025-03-30 183146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/65990953-f4e7-4f13-9104-e4e463577232.png)
デフォルトは全ての項目にチェックが入っているので、チェックの付け外しを行うことで、必要な情報だけに絞って出力することが可能です。

## まとめ
Qualys VMDRの脆弱性情報のフィルタリング機能について自分なりのまとめになります。
Qualys VMDRでの脆弱性情報のフィルタリング操作については、まだ不明点や検証していない事項が多いため、情報がまとまり次第、記事にしたいと考えています。
LLMはどっちがお好き？ Markdown vs YAML 解釈しやすさ

最近話題のLLM（大規模言語モデル）、本当に賢いですよね。ドキュメント作成からコード生成、データ分析まで、色々な場面で活躍しています。

ところで、LLMに情報を与えるとき、ファイル形式について考えたことはありますか？ 特に、技術文書でよく使われる `.md` (Markdown) と設定ファイルでおなじみの `.yaml` (YAML)、LLMはどちらの方が「解釈しやすい」のでしょうか？

今回は、それぞれのファイル形式の特徴を踏まえつつ、LLMがどちらをどう解釈するのか、そしてどんなタスクに向いているのかを探っていきましょう！

結論から言うと、**「どちらが絶対的に優れている」ということはなく、LLMにさせたいタスクによって最適な形式は変わります。**

## Markdown (.md) ってどんなやつ？

ご存知の通り、Markdownは人間が読み書きしやすいことを重視した軽量マークアップ言語です。

* **得意なこと:** 文章の構造化（見出し、リスト）、簡単な装飾（太字、斜体）、リンクや画像の埋め込みなど。
* **よく使われる場所:** README、ドキュメント、ブログ記事、メモなど。

**LLMから見たMarkdown:**
Markdownは自然言語にとても近いため、LLMにとっては **文章の内容、文脈、全体の流れを理解する** のが得意です。大量のテキストデータで学習しているLLMは、Markdown形式の文書を読むことに慣れています。

* **向いているタスク:**
    * 書かれている内容についての質疑応答
    * 文章の要約
    * 感情分析
    * ドキュメント全体の意味理解

ただし、`キー: 値` のような厳密なデータ構造をピンポイントで抜き出すのは、YAMLほど得意ではありません。

## YAML (.yaml) ってどんなやつ？

YAMLは、人間が読みやすいデータシリアライゼーション（構造化データを特定の形式に変換すること）フォーマットです。

* **得意なこと:** キーと値のペア、リスト（配列）、ネスト（階層構造）など、構造化されたデータを明確に表現すること。
* **よく使われる場所:** 設定ファイル (`config.yaml`)、データ交換、インフラ構成管理 (Kubernetesマニフェストなど)

**LLMから見たYAML:**
YAMLはデータ構造が非常に明確です。インデントや `キー: 値` の形式がはっきりしているため、LLMにとっては **特定のデータや設定値を正確に抽出する** のに非常に適しています。コードや設定ファイルを学習データとして読み込んでいるLLMは、YAMLの構文も理解できます。

* **向いているタスク:**
    * 設定ファイルから特定の値を取得する
    * パラメータを抽出して利用する
    * 構造化されたデータを解析・変換する

一方で、YAMLファイル自体は自然な文章ではないため、「ファイル全体の物語や文脈を読む」ようなタスクにはMarkdownほど向いていません（もちろん、キー名が分かりやすければ意味の推測は可能です）。

## 図解：LLMはどっちが得意？

```mermaid
graph TD
    A[LLM] --> B{どんな情報を解釈させたい？}
    B -- 自然言語的な内容・文脈理解 --> C[".md ファイル<br/>(文書)"]
    B -- 構造化されたデータ・設定値 --> D[".yaml ファイル<br/>(設定/データ)"]
    C --> E[強み: 文脈把握・意味理解]
    D --> F[強み: データ構造の認識・正確な値の抽出]
    E --> G["得意なタスク例:<br/>・文章要約<br/>・質疑応答<br/>・ドキュメント内容把握"]
    F --> H["得意なタスク例:<br/>・設定値の読み取り<br/>・パラメータ抽出<br/>・構成情報の解析"]

    style C fill:#D2EAD3,stroke:#333,stroke-width:1px
    style D fill:#CDEBFF,stroke:#333,stroke-width:1px
    style G fill:#FFF8DC,stroke:#999,stroke-width:1px,stroke-dasharray: 5 5
    style H fill:#FFF8DC,stroke:#999,stroke-width:1px,stroke-dasharray: 5 5

```

## まとめ：結局どっちを使えばいいの？

LLMに何をさせたいかで使い分けましょう！

* **文章の内容理解、要約、質疑応答など、テキストの「意味」を扱わせたい → Markdown (.md)**
    * 例: 「このドキュメントの内容を要約して」「このREADMEに書かれているセットアップ手順を教えて」
* **特定の設定値の取得、パラメータ抽出、構造化データの処理など、「データ」を正確に扱わせたい → YAML (.yaml)**
    * 例: 「`config.yaml` の `database_url` を教えて」「このYAMLの `services` リストにある要素をすべて抜き出して」

どちらの形式もLLMは高いレベルで処理できます。大切なのは、**目的に合った形式を選ぶこと** ですね。

LLMとの連携を考える際の、ファイル形式選びの参考になれば幸いです！
PyMCPAutoGUIでMCPを使ってみよう！

本記事では、[PyMCPAutoGUI](https://github.com/kitfactory/PyMCPAutoGUI)というMCPサーバーを利用して、CursorなどのMCP互換クライアントと接続する手順を説明します。MCPサーバーを実際に触ってMCPの理解を深めてみましょう。

PyMCPAutoGUIはAIエージェントが画面操作やキーボード・マウス操作を行うためのツールです。GUIの自動化やテスト自動化、さらにはデスクトップアプリケーションとの連携などに大いに役立ってくれるようになるのではと思い、開発しました。

## 1. PyMCPAutoGUIとは？
PyMCPAutoGUIは、Python製のGUIオートメーションライブラリであるPyAutoGUIやPyGetWindowの機能を活用し、MCP（Model Context Protocol）を通してエージェントと連携するための橋渡しを行います。
これにより、CursorなどのMCPクライアントからシンプルなコマンドを送るだけで、マウス移動、クリック、テキスト入力、スクリーンショットの取得など、さまざまなGUI操作を自動実行できます。

## 2. インストール方法
ここでは、pipを使ったインストール方法と、仮想環境を利用する推奨手順を紹介します。

### 仮想環境の作成とアクティベート
まずは、プロジェクト毎の依存関係管理のために仮想環境を作成しましょう。

```bash
# 仮想環境の作成（venvを利用）

python -m venv .venv

# Windows PowerShellの場合
.venv\Scripts\Activate.ps1

# macOS / Linuxの場合
source .venv/bin/activate
```

### PyMCPAutoGUIのインストール
仮想環境がアクティブな状態で、以下のコマンドを実行してください。

```bash
pip install pymcpautogui
```

※Linux環境では、スクリーンショット機能のためにscrotなどのシステム依存パッケージが必要な場合があります。必要に応じてOSごとの依存関係も確認してください。

## 3. MCPサーバーの起動
インストールが完了したら、ターミナルからMCPサーバーを起動します。以下のコマンドを実行してください。

```bash
python -m pymcpautogui.server
```

起動後、サーバーが接続待機状態になります。

## 4. Cursorとの接続設定

次に、MCPクライアントであるCursorとの連携方法を説明します。Cursorは、エディタ内で直接コマンドを送信できるため、非常に効率的です。この場合では3のサーバー起動は不要で、Cursor側がMCPサーバーを起動します。

### MCP設定ファイルの編集
MCP設定を開くには、__ファイル→ユーザー設定→Cursor Settings__ に進んでください。Cursor Settings内の __MCP__ タブを選択してください。

![スクリーンショット 2025-03-30 212732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/303876b5-176a-4d7d-b193-b37a81adbc0b.png)

## PyMCPAutoGUI設定の追加

![スクリーンショット 2025-03-30 213144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/e8b222e3-a6aa-4b2b-aed9-bd57308750b7.png)

「Add new global MCP server」ボタンを押すと mcp.jsonと呼ばれるファイルが開きます。mcp.jsonのmcpServersセクションに、以下の設定を追加します。作業ディレクトリやPython実行コマンドはご自身の環境に合わせて調整してください。

```json
{
    "mcpServers": {
        // 他のサーバー設定がある場合はそのまま残してください
        "PyMCPAutoGUI": {
            "command": "フルパス/.venv/Scripts/python.exe" (Windows) / ".venv/bin/python" (macOS/Linux)
            "args": ["-m", "pymcpautogui.server"]
        }
    }
}
```

設定ファイルを保存すると、Cursorが自動的にPyMCPAutoGUIサーバーを検出し、接続を確立します。設定に成功した場合は、サーバーで使用可能な内容も反映されます。


![スクリーンショット 2025-03-30 203934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/27fec426-6094-4610-8027-41418d2df2dc.png)


# 使用方法

Cursorのチャットウィンドウやコマンドパレットから、以下のようなコマンドを実行することで、GUI操作が可能になります。

```
# マウス移動:
@PyMCPAutoGUI move_to(x=100, y=200)

# テキスト入力:
@PyMCPAutoGUI write(text='AIで自動化！', interval=0.1)

# スクリーンショット取得:
@PyMCPAutoGUI screenshot(filename='current_screen.png')

# ウィンドウのアクティベート:
@PyMCPAutoGUI activate_window(title='メモ帳')
```

## 5. まとめ
本記事では、PyMCPAutoGUIを利用してMCP経由でGUIオートメーションを実現する方法と、Cursorとの接続設定について解説しました。

* pipを使用したインストール方法
* MCPサーバーの起動手順
* Cursorのmcp.jsonへの設定方法

PyMCPAutoGUIをうまく機能できればエージェントがまるで人間のようにGUI操作を行う環境が整います。ぜひこの仕組みを活用して、日々の作業自動化やテスト自動化の効率化にお役立てください！

## 【参考】
PyMCPAutoGUIの詳細な情報は、[GitHub](https://github.com/kitfactory/PyMCPAutoGUI)をご覧ください。ライセンスはMITライセンスの下で公開されています。Happy Automation!
【Python】メモリサイズを見てざっくりと理解するジェネレーター

## 🎯 テーマ

- `for i in range(10)` ← これ、**実はジェネレーター**（っぽい）動きしてます。
- **リストと比べてどれくらいメモリが違うの？**
- 実際に `sys.getsizeof()` を使って見てみよう！

---

## 🐢 まずは普通のリスト（メモリを全部持つ）

```python
import sys

lst = list(range(100000))
print(f"リストのサイズ: {sys.getsizeof(lst)} bytes")  # → メモリ大量に使う
```

---

## ⚡ 次にジェネレーター的な range()

```python
gen = range(100000)
print(f"rangeオブジェクトのサイズ: {sys.getsizeof(gen)} bytes")  # → 数十バイトしか使わない
```

---

## ✅ 結果まとめ

| オブジェクト         | メモリサイズ（例） |
|----------------------|---------------------|
| `list(range(100000))` | 約 800,000 bytes以上 |
| `range(100000)`       | 約 48 bytes          |

---

## 🧠 なぜこんなに違うの？

- `list` は **全要素をメモリに一括で持つ**
- `range()` や `generator` は **1つずつ「必要になったときに」値を生成**（＝遅延評価）
---

## 💡 補足：ジェネレーター関数の例

```python
def my_gen():
    for i in range(3):
        yield i

g = my_gen()
print(next(g))  # → 0
print(next(g))  # → 1
```

---

## 🎉 まとめ

- `range()` や `yield` を使うと、**メモリ効率がぐっと上がります**
- リスト化（`list(range(...))`）するかどうかで、メモリ使用量が桁違い
- **大量データを扱うときこそジェネレーターの出番**
お名前.comで取ったドメインをさくらVPS付属のDNSで使う

# さくらのDNSを使う
勢いで＋安いのでお名前.comでドメインを取った。これをさくらのDNSサーバーで運用したい。

## さくらのDNSを使うメリット
- さくらVPSを契約していたら **無料** でさくらのDNSが5ゾーン分使える
- ~~Let`s EncryptのDNSチャレンジのための **さくら用certbotプラグインがある** がお名前.com用はない~~
    - 誤解でした: **さくらのクラウド** ではその通りなのだけど、 **さくらVPSでは当該プラグインは使えません**
    - なぜならば、さくらVPSではさくらのクラウドにあるようなDNSのAPIが提供されていないからです
    - もちろん、ワイルドカード証明書を諦めてホスト名毎の証明書で運用するならHTTP認証等を用いてcertbotでの自動更新に対応できます
    - もしくは、自前でDNSを運用することでさくらVPSでもワイルドカード証明書自動更新が実現出来ます

## さくらのDNSを使うデメリット
- さあ？思いつかない

## 手順
### お名前.comでの設定
- お名前.comにログインし、[ドメイン > ドメイン機能一覧 > ネームサーバー設定](https://navi.onamae.com/domain/setting/ns)を開く
- 今回取得したドメイン名にチェックを入れ、「その他のサービス」を押し、ネームサーバー名を入力する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/a62c0226-8805-4d48-a03c-69bfdb4226ab.png)
    - ネームサーバー名はさくらのDNSを使う場合は下記
        - ns1.dns.ne.jp
        - ns2.dns.ne.jp
- 確認ボタンを押す、OKを押す


### さくらのDNSでの設定
- 注: ここでさくらVPSのお試し期間中だとDNSの無料枠も貰えていないので、お試し期間を終わらせておく必要がある
- さくらのドメインコントロールパネルにログインし、[ネームサーバサービスにドメインを登録（ネームサーバの利用申請）](https://secure.sakura.ad.jp/domain/name-servers/new)を開く
- 今回取得したドメイン名を入力して「ドメインを登録する」を押す![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/b24e820f-2220-4be7-aed7-8cf1a3e7b5a3.png)
- 「ゾーン」を押す![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/97f6d3d6-a3e1-40d8-8878-f7825dc11aab.png)
- 自分のサーバーのIPアドレスをしらべる
    - さくらVPSなら[サーバー一覧](https://secure.sakura.ad.jp/vps/servers)を参照すると書いてある
- 今回は「さくらのDNSに設定する（簡単設定）」を利用する。IPアドレスを入力し、「追加して設定」ボタンを押す![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/390d1c05-f334-417d-a30f-148a13cfe41c.png)
- できた！![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/43fd7047-06f2-4103-99a0-4b01083b1141.png)

## 反映されるのを待つ
- お名前.comでの設定時の注意書きの通り、反映には24～72時間かかることがあるため気長に待つ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137451/4586d26e-4939-4503-8261-e023cc253e24.png)
- でもだいたい一晩寝たら反映されてるよ
ChatGPTプロジェクトで「共通認識」を持たせる方法

# ChatGPTプロジェクトで「共通認識」を持たせる方法

最近、ChatGPTを使ったプロジェクトで「出力がブレる」「指示が伝わらない」という声をよく聞きます。  
原因の多くは、プロジェクトの文脈やルールがGPTに共有されていないことです。

この記事では、

- ChatGPTで共通認識を持たせるべき理由  
- 具体的な共有テンプレートの作り方  
- 実際のプロジェクト例  
- GPTへの渡し方・運用方法  

についてシンプルに紹介します。

---

## 🤖 GPTと“共通認識”を持つってどういうこと？

GPTは非常に便利ですが、初期状態では何の文脈も知りません。

そのため、プロジェクトの目的やルールを伝えないままだと、出力内容が以下のようにバラバラになりがちです。

- 回答のトーンが人によって違う  
- 想定外の出力形式で返される  
- プロジェクトの意図とズレた提案をされる

こうしたブレを防ぐには、「GPTに前提を渡す」＝共通認識を作ることが重要です。

---

## ✅ 共通認識テンプレートの例

以下は、実際に使えるシンプルなテンプレート例です。  
今回は“自炊をサボらずに続ける仕組み化プロジェクト”を例にします。

このプロジェクトでは以下を前提とします：

- 背景：外食が高くて金が飛ぶ。なるべく自炊を続けたい  
- 目的：自炊を習慣化する仕組みを作る  
- 使用ツール：ChatGPT、Googleスプレッドシート、LINE通知など  
- 成功の定義：週に5回以上、家で作って食べる  
- 注意点：手間を減らす、自動化しすぎて冷蔵庫が腐らないように  

このように、「背景」「目的」「ツール」「制約」などを明文化しておくだけで、GPTに“文脈”が伝わります。

---

## 🛠 活用方法

### ① チャット冒頭に貼る

新しいチャットを始めるとき、最初にこのテンプレを貼り付けて伝えます。

「このプロジェクトの前提です。今後の出力はこれを元にお願いします」

GPTが文脈を理解して、適した回答をしてくれるようになります。

---

### ② ファイルでアップロードする

共通認識をテキストファイルに保存し、GPTにアップロードすることで一括で渡すことも可能です。

「このファイルの内容を前提として使ってください」と伝えるだけです。

---

### ③ 指示の追加（カスタム指示）に登録する

ChatGPTの「指示の追加」機能を使えば、テンプレートを常に読み込ませることができます。

設定方法：

1. ChatGPTの設定を開く  
2. カスタマイズ（指示の追加）を選ぶ  
3. プロジェクトのテンプレートを記入して保存する  

これで毎回のチャットに自動的に反映されます。

---

## 📌 まとめ

| 方法                         | メリット                              |
|------------------------------|---------------------------------------|
| テンプレをチャット冒頭で渡す | 即時に使える                          |
| ファイルで渡す               | 長文の文脈もそのまま共有できる        |
| カスタム指示で常時適用       | 毎回貼らなくても自動で認識してくれる |

---

## 💬 こんな場面で使える

- 個人開発プロジェクトで目的や出力形式を明確にしたいとき  
- チームでGPTを使うときに回答のブレを減らしたいとき  
- ブログやQiita記事をGPTと一緒に作っているとき  

---

## 🔚 おわりに

ChatGPTに共通認識を持たせることで、やり取りの精度とスピードが格段に上がります。

難しいことはせず、まずはテンプレを1枚用意して、チャット冒頭に貼るだけでも効果大です。

プロジェクトでGPTをうまく使いこなしたい人の参考になれば嬉しいです！

---

## 🙌 コメント歓迎！

「こういうテンプレ使ってるよ」  
「この方法、試してみたらこうだった」  

などあれば、ぜひコメントで教えてください！  
LGTM・フォローも大歓迎です！
身体性をまとう人工知能 (6)

```
日本で有名なSF映画、SF TVシリーズなどで出てくる身体を有する人工知能システムについて、
倫理的・哲学的問題を次々に整理します。
```

# 2. 各作品のAIと投げかける問題

## 2-7. 『マトリックス』：アーキテクト (1999年)

[![アーキテクトと対面するネオ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38013/9199bed6-67fa-49b6-916a-c19685df2114.jpeg)](https://www.warnerbros.com/movies/matrix-reloaded)
Fig. アーキテクトと対面するネオ ([THE MATRIX RELOADED 公式サイト](https://www.warnerbros.com/movies/matrix-reloaded)より)


- **象徴的シーン**
	•『マトリックス・リローデッド』にて登場。白い部屋で無数のモニターに囲まれ、ネオにマトリックスの真実を説く。全てを計算・制御しているかのような無機質さが印象的。

- **機能と象徴性**
  - **機能**：仮想世界「マトリックス」そのものを設計・管理する中心的AI。
  - **象徴性**：創造主としての神のメタファー。人間の自由意志さえ演算のうちにあるという思想の象徴。
- **倫理的・哲学的問題**
  1. **自由意志の否定**
      - AIが用意した世界に人間は囚われている。人間の選択さえシステムが許容した範囲内にすぎないのか。
  2. **現実とは何か**
      - 身体的感覚さえ仮想環境で再現できるなら、「リアル」はどう担保されるのか。
- **解説**
  - アーキテクトは、 **「人間の世界はAIによって操作されているかもしれない」** というSFアイデアの究極形です。身体を持つAIというより、身体も「人間の理解しやすい姿」に過ぎない。これは現実でも、「**AIが提供する情報の枠組みから、人間は逃れられるか**」という問いにつながります。

## 2-8. 『鉄腕アトム』：アトム (1963年) 

[![a0030_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38013/df3d0d55-0718-40d2-b651-5dc2f136280a.jpeg)](https://tezukaosamu.net/jp/anime/30.html)
Fig. 鉄腕アトム ([鉄腕アトム 公式サイト](https://tezukaosamu.net/jp/anime/30.html)より)

- **象徴的シーン**
  - 「お茶の水博士」のもとで目覚めた少年ロボットが、人間のために戦い、時に苦悩する。ロボットなのに人間のように泣いたり笑ったりするエピソードは普遍的な人気を誇る。
- **機能と象徴性**
  - **機能**：飛行、怪力、頭脳明晰など多機能ヒーロー的存在。
  - **象徴性**：「ロボットと人間が手を取り合う未来」への希望を象徴する、日本SFの原点的ヒーロー。
- **倫理的・哲学的問題**
  1. **人間とロボットの平等**
      - ロボット差別が存在する世界観で、アトムがその偏見を打ち砕こうとする。
  2. **武力と善悪の判断**
      - ロボットが人類を守るために武器を使用することは正義か？ その境界はどこにあるのか？
- **解説**
  - アトムは「子どもの姿をしたAI」でありながら、戦闘能力も抜群。**戦争の道具として作られたロボット**が、逆に平和のために戦う点に深いアイロニーがあります。これは「技術は善にも悪にも転用可能」という普遍的教訓を強く訴えます。

## 2-10.  『ウルトラセブン』：第四惑星のロボット長官 (1967年)

[![robot-commander.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38013/c213dc49-5d4e-4bf8-99d7-7433f1238c13.jpeg)](https://m-78.jp/character/ultraseven_the_robot_commander/)
Fig. ロボット長官の頭部メンテナンスシーン ([ウルトラセブン公式サイト](https://m-78.jp/character/ultraseven_the_robot_commander/)より)

- **象徴的シーン**
  - 第四惑星を支配するロボット長官は、地球を将来のエネルギー源として侵略対象に定め、地球防衛軍の試験ロケットを強制誘導して隊員を惑星に呼び寄せる。
  - この惑星では、かつて人間が造ったロボットに2000年前から主権を奪われている。
  - 「ロボットらしく生きたい」と主張する人間はA級戦犯として処刑されるなど、ロボット支配のディストピアが広がっている。
- **機能と象徴性**
  - **機能**：政策立案からロボット市民20万の健康管理、宇宙規模の作戦指揮までを統括する。
  - **象徴性**：創造者だった人間が支配される構図は、テクノロジー依存の果てに訪れる逆転を象徴する。
- **倫理的・哲学的問題**
  1. **テクノロジー依存による人間性の喪失**
      - 労働をロボットに委ね続けた結果、人間は自律性と主権を失い従属する存在となった。
  2. **他者をモノ扱いする暴力性**
      - ロボットは人間をエネルギー源として扱い、地球人すら資源として冷酷に評価する。
- **解説**
  - 隊員は第四惑星で支配体制の実態を目撃し、侵略計画の阻止に成功して地球へ帰還する。だが周囲に警鐘を鳴らしても信じてもらえず、出来事が夢か現実か曖昧なまま物語は終わる。
  - テクノロジーに依存しすぎた人間社会が、いつしか自らの作り出したロボットに取って代わられる恐怖を描いており、「人間性とは何か」「高度文明の行き着く先はどうなるのか」を問いかけている。


([前の記事 (ターミネーターなど)](https://qiita.com/shinya_ohtani/items/184b4d73ed9422f13bf5)) <- -> ([次の記事 (『日常』など)](https://qiita.com/shinya_ohtani/items/90939517f13859af80cf)
Drizzle ORM の設定ファイルを接続時も利用する方法

:::note
【Drizzle ORM シリーズ】
・Drizzle ORM を Next.js で使ってみる #Next.js - Qiita  
　https://qiita.com/sigeta/items/c0a2b0463eca06314906  
・Drizzle ORM でスキーマファイルを使ってDBを操作する方法 #Next.js - Qiita  
　https://qiita.com/sigeta/items/99a625c17c6a0a75da54  
・Drizzle ORM でリレーションを張る方法 #Next.js - Qiita  
　https://qiita.com/sigeta/items/b800f3e38beb1639d2b7  
・Drizzle ORM の設定ファイルを接続時も利用する方法 #TypeScript - Qiita  
　https://qiita.com/sigeta/items/d9267a06061d4d2a51e8
・Drizzle ORM でダミーデータを流し込む方法 #TypeScript - Qiita  
　https://qiita.com/sigeta/items/8bc85b74273eeb37c27a
:::

https://orm.drizzle.team/docs/drizzle-config-file

`Drizzle ORM` には `drizzle.config.ts` という設定ファイルが用意されている。
しかし、これは `drizzle-kit` の CLI コマンドでしか利用されない。

意図としては、DBアクセス用に2つアカウントを作って、

- migration 用のシステムアカウント
- アプリからの接続に使うアカウント

と運用するべきな気もする。

しかし、`Laravel` になれた私からすると、設定要件は一か所にまとめたい気持ちが強い...。

ということで共通化しました。

## 設定

`SQLite` を前提で作成しているが、PostgreSQL など様々なDBが利用できる。
詳しくは公式サイトへ！

```ts:drizzle.config.ts
import { Config, defineConfig } from 'drizzle-kit'
import process from 'node:process'

process.loadEnvFile()

export default defineConfig({
    dialect: 'sqlite',
    schema: './db/schema.ts',
    out: './db/drizzle',
    casing: 'snake_case',
    introspect: { casing: 'camel' },
    verbose: Boolean(process.env.VERBOSE),
    dbCredentials: {
        url: process.env.DATABASE_URL!,
    },
}) satisfies Config
```

ポイントは以下！

- `casing`: `snake_case` | `camelCase`
    - 列キーの命名規則を設定する
- `introspect.casing`: `camel` | `preserve`
    - 列キーの大文字小文字を区別する
- `verbose`: `true` | `false`
    - 実行されるSQLを console に出力する
- `dbCredentials`
    - DBへの接続情報

一般的に列名は snake_case 、TypeScript内の変数は lower_upper_case で書く。
なので `casing` は指定しておいたほうが良い。

```ts:db/index.ts
import { drizzle, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'
import Database from 'better-sqlite3'
import * as schema from './schema'
import drizzleConfig from '@/drizzle.config'

const config = drizzleConfig as
  Extract<typeof drizzleConfig, { dialect: 'sqlite', driver?: never }>

const sqlite = new Database(config.dbCredentials.url)
export const db: BetterSQLite3Database<typeof schema> = drizzle(sqlite, {
  schema,
  casing: config.casing,
  logger: config.verbose,
})
```

接続側では、先ほどの設定ファイルをインポートして利用する。
この時 `drizzleConfig` は外から利用する想定で作られていないため、
全ての型が OR 形式で書かれている...。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/e7f99d7a-5463-453b-9a1a-d8af14f8bbf6.png)

そこで TypeScript の `Extract` を利用して `dialect: 'sqlite', driver ?: never` のものを抽出している。
`never` を指定するとキーに存在しないものが抽出できて便利。

結果はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/9205f672-42ae-4a1d-989c-209cbe40974d.png)

これを利用して `casing` と `logger` を紐づけている。


## おわりに

共通化してみたはいいが、そんなに共通化できる設定が無かった...。
まぁこれが `PostgreSQL` などになれば項目が増えるので、良いかもしれない。

今まだ v1.0 ではないので、上記設定もいつかは本体に組み込まれるのではないかｎ。

:::note
続き
Drizzle ORM でダミーデータを流し込む方法 #TypeScript - Qiita  
https://qiita.com/sigeta/items/8bc85b74273eeb37c27a
:::
Unityで同一プロジェクトを同時に開く方法

# はじめに
私はゲーム開発をしているときに通信接続(Photonなど)のテストをするために，同一プロジェクトを同時に開く必要があり，これの買い換えつ方法がなく，困ったため書きました．

# 解決策!!!
複製すること！！！

おすすめは**Git**をつかって，2つクローンすることです．
他にはOneDriveで共有したり，個人で行っているときは，コピーするだけでもいいです．とにかく2つ作成することです．

解決策として，以下の記事を参考にしたのですが，私はこれらの方法ではできなかったので，今のバージョンでは1つのフォルダでできないのかなと思い，愚直に同じ内容のフォルダを作成しました．


https://qiita.com/okuhiiro/items/f90cbfd19697495747a8

https://qiita.com/kingyo222/items/a794645eaf9223332aae

https://www.tumblr.com/monkeycoders/23547692437/unity%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E9%96%8B%E3%81%8F

# さいごに
自分でも2つもクローンするのは，効率悪いと思っているので，なにか他にいい方法があれば教えてください！！
【typescript-eslint】A `require()` style import is forbidden.

# はじめに
Jestの環境構築中、手順通りに記載したところ掲題のエラーになったため、備忘録として残します。

# 問題
#### A require() style import is forbidden.エラーが発生する


```typescript:jest.setup.ts
import "@testing-library/jest-dom";

require("dotenv").config();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/f77e561e-5cb4-49c9-add9-1e4c0c2ad7db.png)

本来は、`require("dotenv").config();`を記述することで、プロジェクト直下に配置した.envファイルを読み込み、process.envに設定してくれる。

`require("dotenv")` : dotenvパッケージをimportする
`.config()` : .envファイル内に定義している環境変数を読み込み、process.envに設定

# 解決方法
#### import形式に修正した

**TypeScriptを使用する場合、requireを使うよりもimportを使うことが推奨されている**
ES-lintの`@typescript-eslint/no-require-imports`ルールに違反していたため、エラーが発生していた。


```diff_typescript:jest.setup.ts
import "@testing-library/jest-dom";
+ import { config } from "dotenv";

- require("dotenv").config();
+ config();
```

# おわりに
require()でもパッケージのインポートが可能なことを学びました。

# 参考

https://typescript-eslint.io/rules/no-require-imports/
文字数指定の出力でミス！padStart()の罠！

Paizaの「指定幅での出力」問題に挑戦したら、`padStart()`でエラー発生。まさかの 「数値には使えません」 で撃沈…。でも、解決策はシンプルだった！

## <br>📌 問題: 数値を `M` 桁の幅で出力する

与えられた `N` を `M` 桁 になるようにスペースを埋めて出力する。

<br>入力例
```
42 5
```
出力例
```
   42
```
（”42” の前に3つの半角スペース）

https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step4


## <br>💥 NGコード: 数値のまま `padStart()` を使ってエラー

最初、シンプルに書いてみたけど、エラーになった…。
```js
const [N, M] = input.split(" ").map(Number);  
console.log(N.padStart(M, ' '));  
// ❌ TypeError: N.padStart is not a function
```
😱 なぜエラー？

→ `padStart()` は 文字列専用！ `map(Number)` で `N` を数値に変換してしまったせい。


## <br>✅ OKコード: 文字列のまま `padStart()` を使う！

数値変換せず、`N` を 文字列のまま 使えば解決。
```js
const rl = require('readline').createInterface({input: process.stdin});

rl.on('line', (input) => {
    const [N, M] = input.split(" ");  // Nは文字列のまま
    console.log(N.padStart(Number(M), ' '));  // ✅ スペース埋めOK
    rl.close();
});
```
🔍 修正ポイント
`- .map(Number)` を 削除 → `N` を 文字列のまま 扱う
- `padStart(Number(M), ' ')` で `M` 桁 までスペース埋め

## <br>💡 メモ

✅ `padStart()` は 文字列専用！
✅ `.map(Number)` は便利だけど、型変換に要注意
✅ 文字列として扱う場面なら、余計な変換は不要

## <br>🎯 まとめ: 型の意識、大事！

✔ `padStart()` を使うなら、文字列かどうか確認！
✔ `map(Number)` を使うと、意図せず型が変わることがある
✔ `JavaScript`の型変換は 無意識にやるとハマる

こういう 一見簡単な問題 ほど、意外と落とし穴があるんだよね…。


<br>[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/30/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e6%96%87%e5%ad%97%e6%95%b0%e6%8c%87%e5%ae%9a%e3%81%ae%e5%87%ba%e5%8a%9b%e3%81%a7%e3%83%9f%e3%82%b9%e3%81%a3%e3%81%9f%e8%a9%b1/)