OmniAICreator/Qiita-1.07M huggingface dataset:
podmanを理解する

# 目的
- podman を理解する

# 手段
- killercodaで手を動かす

### 環境
killercoda

### podman とは
**Podman (pod manager の略) は、コンテナを開発、管理、実行するためのオープンソースツール** です。podman はデーモンレスで実行されるため、root 権限を持つプロセスを必要としません。故に、セキュリティ面で向上が図られています。そもそも、podman開発の思想としても、docker 比較で docker で改善したい点を考慮して開発されたようです。(デーモンレス等々)
podman 4.0 では k8s 環境の pod を直接操作できるようで、k8s 環境のコンテナ管理ツールのデファクトになっていくのでしょうか。

### 触ってみる
コマンド体系を理解する。

```bash
controlplane:~$ podman --help
Manage pods, containers and images

Usage:
  podman [options] [command]

Available Commands:
  attach      Attach to a running container
# 実に docker コマンドに似ています。
# 基本的には、`podman xx オプション 対象` 的な組み合わせでしょう
```

コンテナをビルドする。

```bash
controlplane:~/image$ podman build -t app .
STEP 1/5: FROM ubuntu
-- snip --
controlplane:~/image$

controlplane:~/image$ podman images
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/app             latest      2cf32a0eb453  11 seconds ago  137 MB
# podman ps コマンドでローカルのイメージを確認できます

```

コンテナを起動する。

```bash
controlplane:~/image$ podman run -d app sleep 1d
24dd5c89e6ba7925ddf17a084515e97ea96a995db34366cc56aaf2e26dbb9f97
controlplane:~/image$ podman ps 
CONTAINER ID  IMAGE                 COMMAND     CREATED        STATUS        PORTS       NAMES
24dd5c89e6ba  localhost/app:latest  sleep 1d    5 seconds ago  Up 5 seconds              gifted_robinson
# podman run -d {コンテナ名 or コンテナID} {実行コマンド} で実行できます
```

環境変数を渡して実行する。

```bash
controlplane:~/image$ podman run -it -e TOKEN=xxxx app bash -c 'echo $TOKEN'
xxxx
controlplane:~/image$ 
```

# あとがき
ソースに貼り付けた Readhadさんの記事位分かり易く書けるようになりたいですね。  
podman desktopも触りたいですし、そもそものコンテナの仕組みも人に説明できるくらいにはしっかりと理解したいです。。。

# ソース
- [Podman とは](https://www.redhat.com/ja/topics/containers/what-is-podman)
【Laravelメモ】EloquentのfirstメソッドではorderByを明示しましょう。

# Laravel Eloquentの`first`メソッド - 順序を保証するための注意点

## 問題点

Laravel Eloquentを使う際、多くの開発者が以下のようなコードを書きます：

```php
$user = User::first();
```

**重要な注意点**: `first()`メソッドは`orderBy()`を指定しない限り、どのレコードが返されるかは保証されません。

## 理由

`first()`メソッドを`orderBy()`なしで使用すると、単に`LIMIT 1`をSQLに追加するだけです。どのレコードが返されるかは以下に依存します：

- データベースエンジンの内部実装
- インデックスの状態
- クエリの実行計画

そのため、同じクエリでも環境によって異なるレコードが返され、予期せぬ動作の原因になります。

## 解決策

必ず`orderBy()`を明示的に指定しましょう：

```php
// 作成日時の昇順で最初のレコードを取得
$user = User::orderBy('created_at', 'asc')->first();

// IDの昇順で最初のレコードを取得
$user = User::orderBy('id', 'asc')->first();
```

## まとめ

`first()`メソッドを使用する際は、常に`orderBy()`で明示的に順序を指定することで、予測可能な結果を得られます。これにより環境による違いから生じるバグを防止できます。
アート作品をAIで分類してみよう【Google Colab + Keras】


##  はじめに

「このアート作品、AIはどんなふうに分類するんだろう？」

そんな疑問を持ったことはありませんか？  
今回は、Google ColabとKerasの事前学習済みモデル（ImageNet）を使って、**自分でアップロードした画像をAIに分類させる**プロジェクトを紹介します。

アート作品や写真をアップロードするだけで、AIがそれに最も近いカテゴリを予測してくれます。  
絵画・彫刻・風景・静物画など、さまざまな画像で遊びながら学べます！

---

##  使用する技術

| ライブラリ           | 用途                         |
|----------------------|------------------------------|
| `tensorflow.keras`   | モデルのロードと画像前処理   |
| `matplotlib`         | 画像の表示                   |
| `google.colab.files` | ファイルアップロード         |

---

##  コード全体

```python
from google.colab import files
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
import numpy as np
import matplotlib.pyplot as plt

# 事前学習済みのVGG16モデルをロード
model = VGG16(weights='imagenet')

# ファイルアップロード（画像ファイルを選んでアップロード）
uploaded = files.upload()
filename = list(uploaded.keys())[0]  # 最初のファイル名を取得

# 読み込みと前処理
img = image.load_img(filename, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

# 予測実行
preds = model.predict(x)
top_preds = decode_predictions(preds, top=5)[0]

# 結果の表示
plt.figure(figsize=(6, 6))
plt.imshow(img)
plt.axis("off")
plt.title("Uploaded Art Image", fontsize=16)
plt.show()

print("🎨 Prediction Results:")
for label, name, score in top_preds:
    print(f"{name}: {round(score * 100, 2)}%")
```


##  実行方法（Google Colab）

1. 上記のコードをColabに貼り付けて実行
2. 表示された「ファイル選択」ボタンから画像をアップロード
3. 数秒後、AIによる分類結果とアップロード画像が表示されます

---

##  結果
例
```
🎨 Prediction Results:
paintbrush: 45.6%
palace: 22.3%
altar: 12.7%
theater_curtain: 8.1%
mural: 6.3%
```
macPC入れ替えでXcodeProjectのワークスペースを移動したら動かなくなった時の解決策

急に mac mini が再起動を繰り返す現象が１年近く治りそうで治らなかったので、仕方なく新しい mac mini を購入しました。
macの機能を使ってそのまま移行すると、また再起動を繰り返しそうだなと思い、新規に入れ直しました。
その中で XcodeProject のワークスペースをコピペで移動したところ、起動時にエラーとなってしまいました。
```ruby:エラーメッセージ
Showing Recent Issues Could not determine generated file paths for Core Data code generation: The command `(cd /Users/　/Desktop/XcodeProject/ && /Applications/Xcode.app/Contents/Developer/usr/bin/momc --dry-run --action generate --swift-version 4.0 --sdkroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator18.2.sdk --iphonesimulator-deployment-target 16.0 --module アプリ名 /Users/ユーザー名/Desktop/XcodeProject/　/coredata/CoreDataModel.xcdatamodeld /Users/ユーザー名/Library/Developer/Xcode/DerivedData/　/Build/Intermediates.noindex/　.build/Debug-iphonesimulator/アプリ名.build/DerivedSources/CoreDataGenerated/CoreDataModel)` exited with status 1. The command's standard error was: /Users/ユーザー名/Desktop/XcodeProject/　/coredata/CoreDataModel.xcdatamodeld:: error: Could not fetch generated file paths: No current version for model at path /Users/ユーザー名/Desktop/XcodeProject/　/coredata/CoreDataModel.xcdatamodeld: [0]
```

エラー内容としては、ユーザー名が異なることで CoreData が参照できないというもののようです。

プロジェクト名.xcodeproj のアイコンを右クリックして「パッケージの内容を表示」を選択、 project.pbxproj アイコンをテキストエディタ等で開き、
下の方にあるユーザー名を変更して再起動すれば解決しました。

前にアプリのワークスペース毎コピーした際もこの プロジェクト名.xcodeproj を編集したなぁと思い出したので、備忘録として残しておきます。

ご参考になれば幸いです。
【Excel VBAベーシック】モジュールとは

## モジュール
　メモ帳にテキストを書くのと同じように、**モジュール**というものにVBAのコードを書く。

### 定義
　マクロを記述する場所

### 補足
・通常「**標準モジュール**」を使う
・標準モジュールの名前に、「?」や「/」などは使用出来ない
・モジュールの種類は次のとおり
　・標準モジュール
　・シートモジュール
　・ブックモジュール

　モジュールには種類があり、通常使うものを**標準モジュール**という。標準モジュールはいくつでも作成出来る。他に、シートモジュールやブックモジュールなどがある。シートモジュールは各シートに対して1つだけ、ブックモジュールはブックに対して1つだけ作成出来る。標準モジュールを作成する手順は



 ## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
この1冊で合格! 永井雅明のExcel VBA ベーシック テキスト&問題集 単行本 – 2025/2/26
永井 雅明 (著)
p.34
tracerouteのアスタリスクは何者？

過去のメモが発掘されたので、投稿してみました。なんでtracerouteしたくなった理由は分かりません。。

# tracerouteは何ができる？
tracerouteは、ネットワークの経路を調べるツール。
指定したホスト（ウェブサイトなど）に到達するまでに通過するルーターやゲートウェイ(=ノード)の情報を表示する。
これで、データがどの経路を通って目的地に到達するかがわかる。

こんな感じでコマンドを実行する
```
traceroute example.com
```

出力には、各ホップのIPアドレスと応答時間が表示される。
これで、ネットワークのどこで遅延が発生しているか、どのルーターがデータを通過しているかがわかる。
ネットワークのトラブルシューティングや経路の確認に役立つツール。

# tracerouteのアスタリスクって何を示す？
tracerouteを実行するとアスタリスク（*）が出力されることがあった。
これは、特定のホップからの応答が得られなかったことを示しており、以下のような理由が考えられる。

- タイムアウト
 指定された時間内に応答が返ってこなかった場合
- ファイアウォールやフィルタリング
 一部のネットワーク機器がICMPパケットをブロックしている場合。
- ネットワークの問題
 ネットワークの混雑や障害により、パケットが目的地に到達しなかった場合。

コマンド実行結果の出力としては以下のようなイメージ
```
1  192.168.1.1 (192.168.1.1)  1.123 ms  1.045 ms  1.012 ms
2  10.0.0.1 (10.0.0.1)  2.345 ms  2.567 ms  2.789 ms
3  * * *
4  example.com (93.184.216.34)  10.123 ms  10.456 ms  10.789 ms
```

この例では、3番目のホップでアスタリスクが表示されている。
これは、そのホップからの応答が得られなかったことを示している。

とのこと。ふーん。
【SDK-AcapLib2/ラインプロファイル機能】AIPToolのラインプロファイル機能を使用してみる

### はじめに

本記事では、アバールデータの**AIPTool** (Camera Viewer)に実装されているラインプロファイル機能の使用方法についてまとめます。

### ラインプロファイルって？

ラインプロファイルは画像処理において、輝度値の分布を視覚的に確認するための有用な機能であり、エッジ検出やピント調整、コントラスト評価、寸法測定などに活用されます。

具体的なピント合わせの方法については[こちら](https://faq-avaldata.dga.jp/faq_detail.html?id=409)が参考になります。



### <使用方法>

#### 手順1：AIPToolの起動  
デスクトップ上のAIPToolのアイコンをダブルクリックしてAIPToolを起動します。  
![AIPTool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/042f0e8e-e10e-4348-aeeb-061b0c8e15f0.png)


#### 手順2：チャンネルの選択  
撮像を行うチャンネルをダブルクリックしてチャンネルウィンドウを開きます。  
![チャンネル選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/b80da1f1-999d-42b9-b9d9-ff926b65f0f2.png)


#### 手順3：撮像を行う  
チャンネルウィンドウが表示されたら、**Snap** 又は **Grab** をクリックして撮像を行います。  
![撮像を行う.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/c123af23-e6a0-4ec6-acb7-ba6db88a7c89.png)


#### 手順4：ラインプロファイルの表示  
撮像を行うと、赤いクロスラインのラインプロファイルが自動的に表示されます。  
- 黄色枠内：横方向ラインプロファイル  
- 橙色枠内：縦方向ラインプロファイル  
![ラインプロファイルの表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/d900b76c-a458-4386-9bc2-96115009c9a7.png)


#### 手順5：ラインプロファイルの保存  
ラインプロファイルを保存するには、**Displayタブ**を開いて**Saveボタン**をクリックします。  
![ラインプロファイルの保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/43d2f200-a3eb-4309-aba3-98b52971dc40.png)


#### 手順6：保存したファイルの確認  
CSVファイルとして保存されるため、テキストエディタ等で開くことができます。  
以下は、640x480 の画像に対して、174 行目と 344 列目を保存した例です。

- 左：モノクロ画像（8bit）  
- 右：カラー画像（24bit）  
※座標は0始まりです。  
![CSVファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/158c5e40-fc52-493e-a0c5-b7595b78b93c.png)
基本情報技術者試験　合格体験記


## １．概要
**基本情報技術者試験**（2024年度）に合格しました。
受験の背景としては、IT系の仕事にキャリアチェンジしたくて転職を考えていたものの、実務未経験だったため、まずは情報系の資格だけでも取得しようと思ったのがきっかけでした。
ITパスポートは既に取得していたので、その次のステップとして、基本情報を目指すことに決めました。

## ２．使用した教材・ツール
**●テキスト**
>[キタミ式イラストIT塾 基本情報技術者 令和07年](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C07%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297144727/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dib=eyJ2IjoiMSJ9.yLyRIVhwdlLKwaZqnwweAslphPLt2RvF1CBTVz9ZofWkKgTZ_lc41biqlRgudWZ2j4p387KvmshNorCYrTsHAgSJCGtAqIFG26XGiZFKX1moHsRoe14tZzYgKiGs5iS8YsiJRCLJyqhXl6o7RWgtvGQl-irSm-G5SJRlJiLp9hfAhXefSdQ4i5LLh6dQ4d_eq30QGUukeTutJg0DOBAs_dAHN4sPomnEeJDg9mnQdlc.cgIvYq1rQBismznb8ge4ZUGjFgltIVgV_ds4CzdAh9Y&dib_tag=se&keywords=%E3%82%AD%E3%82%BF%E3%83%9F&qid=1742280364&s=books&sr=1-1)

>[［改訂新版］基本情報技術者【科目B】アルゴリズム×擬似言語トレーニングブック：大滝みや子（著）](https://www.amazon.co.jp/%EF%BC%BB%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88%EF%BC%BD%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E3%80%90%E7%A7%91%E7%9B%AEB%E3%80%91%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%C3%97%E6%93%AC%E4%BC%BC%E8%A8%80%E8%AA%9E%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%96%E3%83%83%E3%82%AF-%E5%A4%A7%E6%BB%9D-%E3%81%BF%E3%82%84%E5%AD%90/dp/4297142716/ref=sr_1_1?dib=eyJ2IjoiMSJ9.84a-ZVydH2bSmvwG2ViuBj56HMHUHH7_F0zI9rLoUltF-9MTCRdCyc_LimRWS5369Pi4GMdxhpNf4enwtuMQBJ-axjyHxN-_GzjW7KyX5G8bmmYmP11MOcYmbSgr2vdQqT9xofgrDMHVwOH4c4jDcQoyqr03YGxR14tuCIRN6XWjAVSJmYvRoAQp78YmPJ2OXqCOGZBlb65i-74fuzeRiw1kR2MgTxWjg_1lRxCS2Wc.MTbE632SjNl_amBB61swqPAZ2jEzxJj_2pMEG3fln8M&dib_tag=se&qid=1742280042&s=books&sr=1-1)

テキストは電子版（PDF）を購入しました。
直接書き込んだりすることはできませんが、通勤などのスキマ時間で手軽に確認できるので便利でした。

**●WEBサイト**
>[基本情報技術者試験ドットコム](https://www.fe-siken.com/)

## ３．勉強方法
**●科目A（午前）**
基本的には基本情報技術者試験ドットコムで問題を解きつつ、
解説はキタミ式テキストで補完するスタイルで進めました。

**●科目B（午後）**
IPA公開のサンプル問題、大滝本をしこたま反復しました。
最初は本当に理解できなくて、アルゴリズムにアレルギーを感じるほど苦手意識が強かったのですが、毎日少しずつ取り組むうちに、自然と慣れていきました。
**分からないことを放置しないこと**、**地道に取り組むことの大切さ**を改めて実感しました。

## ４．試験結果
**科目A：600点
科目B：650点**

ギリギリな結果になってしまいましたが、合格は合格です。
科目Aが終わった時点でかなり絶望的でしたが、奇跡が起こりました。

## ５．反省点
**●時間をかけすぎた**
かなりのんびり取り組んでいたので、なんやかんやトータル6ヶ月くらいかかりました。
多分真面目に取り組んだのは実質3ヶ月くらいです。

**●科目A対策をもっとやっておくべきだった**
出題問題について具体的な言及はできませんが、当日の試験では過去問でも見たことのないような問題が多く出題されていました。
事前にシラバスをしっかり確認していれば良かったと感じました。

>【試験要綱・シラバスについて _ 試験情報 _ IPA 独立行政法人 情報処理推進機構】
https://www.ipa.go.jp/shiken/syllabus/gaiyou.html#syllabus

**●科目Bの勉強がアルゴリズムに偏りすぎていた**
アルゴリズム対策に力を入れすぎて、他がおざなりになっていました。
貴重な得点源なのでここで落とすのは結構もったいないです。

## まとめ
以上が、私の初Qiita記事にして基本情報技術者試験の合格体験記となります。
この記事がこれから基本情報を受験される方の参考になれば嬉しいです。
最後まで読んでいただきありがとうございました。
[Linux][command] メタキャラクタ_シェル_echo, ', ", `

# 一覧
| メタキャラクタ | 説明 |
|:--|:--|
| `*` | 任意の0文字以上にマッチ（ファイル名や文字列） |
|  | **例:** `*.txt` → `.txt` で終わるすべてのファイルにマッチ (`file.txt`, `note.txt`) |
| `?` | 任意の1文字にマッチ |
|  | **例:** `file?.txt` → `file1.txt`, `fileA.txt` にマッチ、`file10.txt` にはマッチしない |
| `[]` | 括弧内のいずれかの1文字にマッチ |
|  | **例:** `file[123].txt` → `file1.txt`, `file2.txt`, `file3.txt` にマッチ |
| `[!]` | 括弧内の**いずれでもない**1文字にマッチ |
|  | **例:** `file[!1].txt` → `file2.txt`, `file3.txt` にマッチ、`file1.txt` にはマッチしない |
| `~` | ホームディレクトリに展開 |
|  | **例:** `~/docs` → `/home/ユーザー名/docs` に展開 |
| `$` | 変数展開 |
|  | **例:** `$HOME` → `/home/ユーザー名` に展開 |
| `\` | エスケープ文字。直後のメタキャラクタを無効化 |
|  | **例:** `\*` → アスタリスク `*` をそのまま文字として扱う |
| `' '` | シングルクォートで囲むと、特殊文字をすべて無効化（リテラル） |
|  | **例:** `'*.txt'` → ワイルドカードとしてではなく、文字列 `*.txt` そのもの |
| `" "` | ダブルクォートで囲むと、一部の特殊文字（`$`, `` ` ``, `\`, `"`) だけが解釈される |
|  | - `" "`で囲まれた部分が変数であれば、変数を展開する<br>- コマンドは実行しない<br><br>**例:** `"My name is $USER"` → 変数展開される（`$USER` はユーザー名に） |
| `` ` ` `` | コマンド置換（コマンドの実行結果に置き換え） |
|  | - ` `` `で囲まれた部分が変数であれば、変数を展開する<br>- コマンドは実行する<br><br>**例:** `` echo `date` `` → 現在の日付を表示 |

# 引用符(', ", `)使用例
## `"`
~~~terminal
$ echo "$DATE"
と
$ echo $DATE
~~~
は同じ結果

## `"`
~~~terminal
$ echo "`date`"
と
$ echo `date`
~~~
は同じ結果

# echoコマンド
~~~terminal
$ echo [オプション] [文字列]
~~~


| オプション | 由来 | 説明 |
|:--|:--|:--|
| (default) | echo | - 引数が文字列の場合は、そのまま表示し、末尾に改行を追加する<br>- 引数が変数`$`の場合は、変数を展開し、末尾に改行を追加する<br>- コマンドは実行しない |
| `-n` | no newline | - 末尾の改行を追加しない |

# Ping-t
- [3445_$](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372717)
- [3668_*, ?, []](https://mondai.ping-t.com/question_subjects/31/question_sessions/31941533/progressing_questions/489430945)
- [35564_*, ?](https://mondai.ping-t.com/question_subjects/31/question_sessions/32368296/progressing_questions/495929814)


引用符(', ", `)
- [3446_'$DATE'](https://mondai.ping-t.com/question_subjects/31/question_sessions/31541108/progressing_questions/483298458)
- [3447_"$DATE"](https://mondai.ping-t.com/question_subjects/31/question_sessions/31600132/progressing_questions/484225489)
- [3448_\`$DATE\`](https://mondai.ping-t.com/question_subjects/31/question_sessions/30521989/progressing_questions/467602309)
- [3449_\\"$DATE\\"](https://mondai.ping-t.com/question_subjects/31/question_sessions/31375489/progressing_questions/480744517)
WezTerm × fzf でOleOleのディレクトリブックマーク管理システムを構築する


## ❤️動機
zoxideもいい感じだけど、アルゴリズムが少しキモと思ってしまったので、
ChatGTPを先生としてOleOleブックマークを作ってみた。

## ✅ 概要


WezTerm 上でよく使うディレクトリをブックマークとして管理し、`fzf` を使って選択・移動できるようにする便利な仕組みを構築します。Zsh 関数で `bm` コマンドを作り、次の機能を提供します。

- `bm`：ブックマーク一覧から選択して `cd`（fzf プレビュー付き）
- `bm -a`：現在のディレクトリをブックマークに追加
- `bm -d`：選択してブックマークを削除
- `bm -e`：VS Code でブックマークファイルを編集

---

## 📁 ディレクトリ構成（推奨）

```bash
~/.config/bookmark/
├── .bookmark             # ブックマークデータ (JSON)
├── saveBookmark.sh       # 追加用スクリプト
├── bm.sh                 # bm 関数本体
```

---

## 🧠 `.bookmark` の形式（JSON）

```json
{
  "dotfiles": "/Users/yourname/.dotfiles",
  "project": "/Users/yourname/dev/myproject"
}
```

---

## 🛠 `saveBookmark.sh`（ブックマーク追加スクリプト）

```bash
#!/bin/bash

BOOKMARK_FILE="$HOME/.config/bookmark/.bookmark"
mkdir -p "$(dirname "$BOOKMARK_FILE")"

current_path=$(pwd)
key=$(basename "$current_path")

# ファイルが存在しなければ空の JSON オブジェクトを書いておく
if [[ ! -f "$BOOKMARK_FILE" ]]; then
  echo '{}' > "$BOOKMARK_FILE"
fi

# jq で追加・上書き
updated=$(jq --arg key "$key" --arg path "$current_path" '.[$key] = $path' "$BOOKMARK_FILE")

# 保存
echo "$updated" > "$BOOKMARK_FILE"
echo "✅ Saved bookmark: $key → $current_path"

```

---

## 🚀 `bm.sh`（Zsh 関数）

```bash
function bm() {
  local bookmark_file="$HOME/.config/bookmark/.bookmark"
  local save_script="$HOME/.config/bookmark/saveBookmark.sh"
  local editor="code"  # VS Code

  case "$1" in
    -a)
      bash "$save_script"
      ;;
    -d)
      if [[ ! -f "$bookmark_file" ]]; then
        echo "❌ No bookmarks to delete."
        return 1
      fi
      local selected=$(jq -r 'to_entries[] | "\(.key):\(.value)"' "$bookmark_file" | \
        fzf --prompt="🗑 Delete bookmark > " --preview="ls -la $(echo {} | cut -d ':' -f 2-)" --preview-window=right:60%)
      if [[ -n "$selected" ]]; then
        local key="${selected%%:*}"
        local updated=$(jq "del(.\"$key\")" "$bookmark_file")
        echo "$updated" > "$bookmark_file"
        echo "🗑 Deleted bookmark: $key"
      fi
      ;;
    -e)
      $editor "$bookmark_file"
      ;;
    *)
      if [[ ! -f "$bookmark_file" ]]; then
        echo "❌ No bookmark file found."
        return 1
      fi
      local selected=$(jq -r 'to_entries[] | "\(.key):\(.value)"' "$bookmark_file" | \
        fzf --prompt="📁 Bookmark > " --preview="ls -la $(echo {} | cut -d ':' -f 2-)" --preview-window=right:60%)
      if [[ -n "$selected" ]]; then
        local dest="${selected#*:}"
        cd "$dest"
      fi
      ;;
  esac
}
```

---

## 🔧 `.zshrc` で読み込む

```zsh
source ~/.config/bookmark/bm.sh
```

---

## ✅ 利用例

```bash
bm       # fzfで選んでcd
bm -a    # 追加
bm -d    # 削除
bm -e    # エディタで編集（VS Code）
```

---
ChatGTPここまで
--
## 🏁 感想
この記事完成まで込みでかかった時間は、だいたい半日ぐらい。
時間がかかった原因は、全てをWezTerm.lua内で、完結させよと粘ったため。
もちろん記事作成もChat GPTさんに頼みました。

その影響で、タイトルにWezTermが入っていますが、中身は、普通にシェルスクリプトです。

で、今後の展望としては、初心貫徹、WezTermでキーバインドを設定すること。
できれば、もっとかっこいいと思うんだけど。今回は、ここまで。

## ?　追記
ここ動かないという指摘がありましたら、chat GPTさんに直させます。
kube-bench を理解する

# 目的
- kube-bench を理解する

# 手段
KillerCoda で手を動かす

### 環境
KillerCoda

### やってみる

基本形は以下の通りです。

```bash
$ kube-bench run -s master
# -sオプションでコマンド実行対象を指定
```

特定の CIS を確認するコマンドは以下の通りです。

```bash
$ kube-bench run -s master --check 1.1.19
[INFO] 1 Control Plane Security Configuration
[INFO] 1.1 Control Plane Node Configuration Files
[PASS] 1.1.19 Ensure that the Kubernetes PKI directory and file ownership is set to root:root (Automated)

== Summary master ==
1 checks PASS
0 checks FAIL
0 checks WARN
0 checks INFO

== Summary total ==
1 checks PASS
0 checks FAIL
0 checks WARN
0 checks INFO
# 1.1.19 は PASS している
```

FAIL している場合は以下の通りです。

```bash
$ kube-bench run -s master --check 1.1.12
[INFO] 1 Control Plane Security Configuration
[INFO] 1.1 Control Plane Node Configuration Files
[FAIL] 1.1.12 Ensure that the etcd data directory ownership is set to etcd:etcd (Automated)

== Remediations master ==
1.1.12 On the etcd server node, get the etcd data directory, passed as an argument --data-dir,
from the command 'ps -ef | grep etcd'.
Run the below command (based on the etcd data directory found above).
For example, chown etcd:etcd /var/lib/etcd


== Summary master ==
0 checks PASS
1 checks FAIL
0 checks WARN
0 checks INFO

== Summary total ==
0 checks PASS
1 checks FAIL
0 checks WARN
0 checks INFO
# Remediations master の説明に沿って対処すれば PASS できます

# あとがき
サービス問題ですね。

# ソース
- [CIS](https://www.cisecurity.org/benchmark/kubernetes)
YouTube動画の文字起こし探しの旅

# YouTube動画の文字起こし探しの旅

こんにちは、皆さん！今日は、最近私がYouTube動画の文字起こしをする際に経験したことをお話ししたいと思います。

最近、あるプロジェクトで大量のYouTube動画を文字起こしする必要がありました。最初は簡単だと思っていたのですが、すぐにそれが思ったよりも難しいことに気づきました。

いくつかのオンラインツールを試してみたのですが、どれも速度が遅かったり、正確性に欠けていたりしました。そんな時、偶然見つけたのが[Transcriptly](https://transcriptly.org/)というツールでした。

最初はあまり期待していなかったのですが、使ってみると驚くほど速く、正確に文字起こしができました。正確性は99%にも達し、特に多言語対応が素晴らしく、外国語の動画を扱う際に大変助かりました。

Transcriptlyを使うことで、時間を大幅に節約でき、作業効率も向上しました。動画の内容を簡単に文字に起こして、さらに分析や研究に活用できるようになりました。

もし、効率的な文字起こしツールを探しているなら、Transcriptlyを試してみてください。きっと驚きの結果が得られると思います。

---

このストーリーが、文字起こしツールを探している方々の参考になれば幸いです！
ハッカソン個人備忘録㉓：Alembic × SQLAlchemy で MySQL のスキーマ管理を整理してみた

## はじめに

このドキュメントでは、Python のマイグレーションツール「Alembic」を使って、MySQL データベースのスキーマ管理を始めるための初期設定手順を紹介します。

個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。

## 書こうと思ったきっかけ

受講しているITスクールでバックエンドの作業を担当している中で、実際に開発プロジェクトで Alembic を使おうとしたとき、最初の設定手順や `alembic.ini` の書き方でつまずいた経験がありました。

自分自身の備忘録として、また他の人の参考にもなるように、基本的な設定手順を整理しておこうと思ったのがきっかけです。

---

## Alembic を使ったマイグレーション管理の初期設定手順

Python のマイグレーションツール「Alembic」を使って、MySQL データベースのスキーマ管理を始めるための初期設定手順を以下にまとめます。

---

### 1. Alembic のインストール

まず、Alembic を Python 環境にインストールします。

```bash
pip install alembic
```

---

### 2. Alembic の初期化

#### 方法1：マイグレーションディレクトリを作成する場合
```bash
alembic init migrations
```
このコマンドで `migrations/` ディレクトリが作成され、必要なテンプレートファイルが展開されます。

#### 方法2：カレントディレクトリに初期化する場合
```bash
alembic init .
```
プロジェクト直下に Alembic 関連のファイルを展開したい場合はこちらを使用します。

---

### 3. 設定ファイル（alembic.ini）の編集

初期化すると `alembic.ini` が作成されるので、以下のように接続先のデータベース情報を設定します。

```ini
sqlalchemy.url = mysql+pymysql://root:root-password@host:port/database
```

#### 設定例：
```ini
sqlalchemy.url = mysql+pymysql://root:mysecretpassword@localhost:3306/mydatabase
```

この設定により、Alembic は指定した MySQL データベースに接続し、マイグレーションを実行できるようになります。

---

## 補足

- Alembic は SQLAlchemy と連携して使うのが一般的です。
- `env.py` や `versions/` フォルダも後続の作業で活用します。
- 初期設定が完了したら、モデルの変更に応じてマイグレーションファイルを生成し、`upgrade` コマンドでデータベースに反映していきます。

---

今後のステップ：
- SQLAlchemy モデルの定義
- `alembic revision --autogenerate -m "initial"` の実行
- `alembic upgrade head` によるスキーマ適用

---

## まとめ

Alembic を使うことで、SQL の知識がそこまで深くなくても、データベーススキーマの変更を安全かつバージョン管理できるようになります。

:::note warn
**最初は設定がやや複雑に感じるかもしれませんが、一度仕組みを理解してしまえば、非常に便利なツールです。**
:::

今回の手順が、Alembic の導入に少しでも役立てば嬉しいです！
Python × Wikidataで日本の美術館を地図にプロットしてみた


##  はじめに

「日本にはどんな美術館があるの？」  
「地図で一覧できたら便利なのに…」

そんな時、役立つのが**Wikidata（ウィキデータ）**と**Pythonの可視化ツール**です。  
この記事では、**WikidataのSPARQLエンドポイントを使って、日本全国の美術館の緯度・経度を取得し、地図上にマッピング**してみます。

プログラミング言語はPython、地図描画には`folium`ライブラリを使用。  
地理データの扱いにも慣れてくる実用的な入門にもなります！

---

## 使用する技術

| ツール／ライブラリ | 用途                         |
|--------------------|------------------------------|
| SPARQLWrapper      | Wikidataにクエリを投げる     |
| pandas             | データ整形（今回軽め）       |
| folium             | 地図上へのプロット           |
| Wikidata API       | 美術館の位置データを取得     |

---

##  Pythonコード

```python
# 必要なライブラリのインストール（初回のみ）
!pip install SPARQLWrapper
```

```python
from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd
import folium

# SPARQLクエリ：日本の美術館の名前と緯度経度を取得
query = """
SELECT ?museumLabel ?coord WHERE {
  ?museum wdt:P31 wd:Q33506;         # インスタンスが「美術館」
          wdt:P17 wd:Q17;            # 国が日本
          wdt:P625 ?coord.           # 座標データ
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja". }
}
LIMIT 100
"""

# クエリの送信
sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setQuery(query)
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

# 結果の整形
museums = []
for result in results["results"]["bindings"]:
    name = result["museumLabel"]["value"]
    coord = result["coord"]["value"].replace("Point(", "").replace(")", "")
    lon, lat = map(float, coord.split(" "))
    museums.append((name, lat, lon))

# 地図を生成（中心は東京駅）
m = folium.Map(location=[35.681236, 139.767125], zoom_start=5)
for name, lat, lon in museums:
    folium.Marker(location=[lat, lon], popup=name).add_to(m)

# 地図を表示（Jupyter Notebook / Google Colabで表示されます）
m
```


##  実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/654dc04d-b40c-4ed0-a915-7ab8496e12b7.png)
【Unity】特定のオブジェクト群に一括処理する

# 概要
現在作成しているゲームで、特定のオブジェクト群（今回はカットした豆腐）に対して一斉にkinematicをfalseにしたかったのだが、やり方がわからんかったのでGPT君に聞いてみるといろんな種類があることを知った。それの記録。
元の設定として、カットした豆腐には「Sliceable」のレイヤーを付与していた。

# 方法1：全オブジェクト検索＋ifでレイヤー処理
```
GameObject[] allObjects = GameObject.FindObjectsByType<GameObject>(FindObjectsSortMode.None);
foreach (GameObject obj in allObjects)
{
    if (obj.layer == LayerMask.NameToLayer("Sliceable"))
    {
        // 対象オブジェクトに処理
    }
}
```
レイヤーに対してはこの処理が有効。ただしscene内のオブジェクトを全取得するから無駄が多い。
# 方法2：Tagで検索
```
GameObject[] sliceables = GameObject.FindGameObjectsWithTag("Sliceable");
foreach (GameObject obj in sliceables)
{
    // 処理
}
```
このやり方が一番シンプルで使うべきやつっぽい。ただし、タグを複数つけられない制限から既に何かタグを使ってると処理できない。
# 方法3：Sliceableスクリプト（マーカー）をつけて FindObjectsOfType<Sliceable>() で取得
以下の空スクリプトを作成して、オブジェクトにつけとく。これには何も関数等なくてOK。
```
// 空のスクリプト
public class Sliceable : MonoBehaviour {}
```
んで処理を書く
```
Sliceable[] sliceableObjs = GameObject.FindObjectsOfType<Sliceable>();
foreach (var s in sliceableObjs)
{
    GameObject obj = s.gameObject;
    // 処理
}
```
コンポーネントでフィルタリングする方法もあるらしい、かしこい

# まとめ
処理速度等はわからんが基本は2を使ってりゃよさそう。
複数にまたがるタグつけたいときは3の方法使ってんのかなぁみんなも、わからん。
MET美術館のAPIを使って美術をランダムに鑑賞しよう


##  はじめに

美術館に足を運ぶのが難しい時でも、世界中の名画を楽しめたら素敵だと思いませんか？

現代のテクノロジー、特に**Python**と**オープンAPI**を組み合わせれば、それが実現できます。  
今回ご紹介するのは、アメリカ・ニューヨークの**メトロポリタン美術館（The Metropolitan Museum of Art / 通称：MET）**が提供している公式APIを使って、  
**ランダムな名画をPythonで取得・表示するミニアプリ**です。

インストール不要のライブラリと数行のコードで、  
自宅にいながら毎日違う作品を楽しむ「おうち美術館」がすぐに実現できます。



##  使用するもの

- `requests`：APIからデータを取得
- `PIL`（Pillow）：画像処理
- `matplotlib`：画像をきれいに表示
- METの公開API：https://metmuseum.github.io/

---

##  Pythonコード

```python
import requests
import matplotlib.pyplot as plt
from PIL import Image
from io import BytesIO
import random

# METの全オブジェクトIDを取得
all_ids_url = "https://collectionapi.metmuseum.org/public/collection/v1/objects"
all_ids = requests.get(all_ids_url).json()["objectIDs"]

# シャッフルして先頭200件を使う（画像がないものを除外するため多めに取る）
random.shuffle(all_ids)
selected_ids = all_ids[:200]

# 最大10点の画像付き作品を表示
count = 0
for object_id in selected_ids:
    if count >= 10:
        break

    url = f"https://collectionapi.metmuseum.org/public/collection/v1/objects/{object_id}"
    res = requests.get(url).json()

    title = res.get("title", "No Title")
    artist = res.get("artistDisplayName", "Unknown Artist")
    image_url = res.get("primaryImageSmall", "")

    # 画像がある作品のみ処理
    if image_url:
        try:
            img = Image.open(BytesIO(requests.get(image_url).content))

            plt.figure(figsize=(4, 4))
            plt.imshow(img)
            plt.axis("off")
            plt.title(f"{title}\n{artist}", fontsize=10)
            plt.tight_layout()
            plt.show()

            count += 1
        except:
            continue
```

---

##  実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/5377ac0c-ad63-473b-ab2b-f0444d719c09.png)
ハッカソン個人備忘録㉒：FastAPI × Docker で pip が使えないときのトラブルシューティングまとめ

## はじめに

FastAPIをDockerで構築している際、`python:3.11-slim` イメージを使っていたにも関わらず、コンテナ内で `pip` コマンドが使えないという事態に遭遇することがあります。以下では、その原因と対処法について解説します。

:::note warn
**※本記事はあくまで個人の備忘録として記録しています。**
:::

## 現象

```bash
bash-5.1# pip --version
bash: pip: command not found
```

`python:3.11-slim` イメージでは通常 `pip` はインストールされているはずですが、バージョンやタイミングによっては含まれていないことがあります。

## 対処法：`pip` を手動でインストールする

Dockerfileに以下のような記述を追加することで、`pip` を明示的にインストールできます。

```dockerfile
FROM python:3.11-slim

WORKDIR /app

# pipをインストールするために必要なパッケージを追加
RUN apt-get update && \
    apt-get install -y curl && \
    curl -sS https://bootstrap.pypa.io/get-pip.py | python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# requirements.txtのコピーとインストール
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app/ .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
```

## 解説

- `curl` を使って `get-pip.py` をダウンロードし、Pythonで実行することで `pip` をインストール。
- `apt-get clean` と `rm -rf /var/lib/apt/lists/*` により不要なキャッシュを削除し、Dockerイメージを軽量に保ちます。

## まとめ

`python:3.11-slim` を使っていても `pip` が使えない場合があるため、上記の方法で手動インストールを行うのが安全です。

**FastAPIなどのアプリケーションをDocker上で構築する際は、`pip` の有無も確認しておくとトラブルを防げると思いますので、試してみてください！**
Spring Bootでの@RequestBodyと@Validによるバリデーションまとめ

※学習中のため、内容に誤りがあるかもしれません。
今回は`@RequestBody`と`@Valid`の役割に関して簡単にまとめていきます。

## @RequestBodyとは？
`@RequestBody`は簡単に言うと、受け取ったリクエストのbody部分(JSONなど)を読み取り、
Javaオブジェクトへ変換することができるアノテーションです。

Entityやdtoなどに変換し使用します。

```json
{
    "name": "taro",
    "email": "test@test.com"
}
```
```java
@Data
public class ContactDto {
    @NotNull
    @Size(min=1, max=40)
    private String name;

    @NotNull
    @Email
    private String email;
}
```



## @Validとは？
`@Valid`はメソッドを実行した際に、バリデーションをかけてくれる処理です
引数として設定しているDTOやEntityのバリデーションアノテーションを有効化してくれる
例(`@Email`や`@NotNull`など)

### 実際のコード例
#### ✖バリデーションが無効になる例
```java
@PostMapping("/")
public void save(@RequestBody ContactDto contact) {
    service.save(contact);
}
```
#### 〇バリデーションが有効になる例
```java
@PostMapping("/")
public void save(@Valid @RequestBody ContactDto contact) {
    service.save(contact);
}
```

### おわりに
Spring Bootでバリデーションを有効にするためには、`@Valid`を忘れずに付与することが大事です！
つまずいている方の参考になれば幸いです
家計簿アプリを作る＃３２

![スクリーンショット 2025-04-10 151131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/eec81956-9828-4a69-b911-ec16fb75f367.png)
![スクリーンショット 2025-04-10 151247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cf079b68-6457-4054-88e8-6e500007a7ba.png)
![スクリーンショット 2025-04-10 151219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cc05ca7d-1045-45c0-a7f6-9b0c1be7ea31.png)
ホームと同じように、レポートのアイコンもインポートします。

![スクリーンショット 2025-04-10 151516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/f098f34a-8590-4ba5-98a7-0d2d02ad5041.png)
型定義をしてるので、もし違う型を入れてしまうと、エラーを早期に発見することができます。
Power Apps 本番用データソースの付け替えを少しだけラクにする方法

# はじめに
ごきげんよう、百合宮桜（Miyu）です♪
今回はお客さんからの質問に答えるコーナーをやります！

:::note info
**質問**
Power Apps で開発したアプリを本番運用します。
その際、アプリに接続したデータソースも本番用に変えたいのですが、1つずつ変更するのが面倒くさいです。効率的に行う方法はありませんか？
:::

テスト用データソースと本番用データソースの切り替えは面倒ですよね。よくわかります。数が多いとなおさら面倒です(´・ω・`)
このような場合、Microsoft さん的な模範解答はソリューションにまとめて、環境変数にリストを設定することで対応してくださいとなります。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/environmentvariables

ただ、ソリューションは有償ライセンスが必要な機能ですので、なかなかご予算の確保が厳しい💦という場合もあるかと思います。
今回は Microsoft 365 のライセンス範囲でできる！ ほんのちょっとだけラクをする方法をお伝えいたします。

# 本番用 SharePoint サイトに同一名称のリストを作って付け替える
Power Apps はリスト名と列構成が同一なら同じリストとして認識します。
その為、以下のようにリストがある SharePoint サイトやデータの中身が違っても、リスト名と列構成が同じなら、同一リストとして扱われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c3d1e098-1a36-4f8b-9629-c0def2ab8307.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/e08a27f9-7d62-40a8-bb7b-3c357cfc96cb.png)

この仕様を利用して、テスト用データソースを削除→本番用データソースを追加するとスムーズにデータソースを付け替えることが可能です。

1.テスト用のデータソースを削除します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2fe61289-7b22-4759-ae6b-c5bfa44503b9.png)

2.本番用データソースを追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/5a7a3d5c-25f9-4a9d-adac-c1c931e726f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4cb0330a-38b7-437b-a5cc-7e415972ba66.png)

このように元々のデータソースを削除してから、本番用データソースを追加することで Power Fx の式のデータソース名の編集せずに中身を入れ替えることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/aafd953f-e956-403b-a5e8-05a541ae78f7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/15dcdf6d-e775-4ded-afbe-7fdacd898216.png)

ただ、同一名称のリストを同じ SharePoint サイトに保管することはできないので、必ず別々の SharePoint サイトに作成することが条件です。
何らかの事情で2つも SharePoint サイトを持つことはできない……という方は以下の方法を試してみてください。

# 検索→置換機能を利用する
データソースの付け替えで1番面倒くさいのが Power Fx 式内のデータソース名を本番用に修正すること！！（ですよね？？）
テスト用データソースをアプリから削除した後のエラーの多さにメンタルをやられているのは私だけではないはず……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/87c10375-293c-43c8-a124-5a865a65ef0b.png)

これは置換機能の活用で一括修正するのがラクです(≧▽≦)

1. 本番用データソースをデータに追加します
2. 検索 > 置換 を選択します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dce78526-9f65-4cd6-ae9f-92960dbe8f05.png)

3. 検索ボックスに削除したテスト用データソースの名前を入力します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0fc5185a-5a5d-406a-a119-3ffb01f24033.png)

4. 置き換え先に本番用データソースの名前を入力します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/50bda806-4ffa-41cc-8935-5a4c286626af.png)

5. すべて置換ボタンをクリックします

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2dcccdd1-7c8d-4693-9ecd-243ed3b9d187.png)

6. 置き換えますか？のホップアップの「置換」をクリックします

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c2455c09-0848-4635-9c2d-6c26eac76d2c.png)

これでテスト用データソースを使っていたところがすべて本番用データソースに切り替わりました。手動でやるよりもかなり楽ですね！

# 終わりに
4月になり、年度が改まったり、異動があったりとアプリを引き継ぐようなシチュエーションも多くなってきたかと思います。今回のような地味ラクテクニックを活用して、ぜひスムーズに業務改善しましょう♪
それではごきげんよう(≧▽≦)
LeetCodeをサクッとはじめる

# はじめに
[LeetCode](https://leetcode.com/)を始めてみようと考えている人向けに、サクッと問題を解いて提出するまでをまとめました！

# 事前準備
- LeetCodeのアカウント登録をしておく

# 手順
## 1. **Problems**を選択
![スクリーンショット 2025-04-10 12.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/8579958e-5e4e-4c35-85af-ce67804096be.png)

## 2. 問題を選ぶ
やや下の方にスクロールすると、問題一覧が置いてあります。
`1.Two Sum` は有名な問題ですね。
![スクリーンショット 2025-04-10 13.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/d5f77f04-aed3-4d6c-86d7-7b89875a98bc.png)

解いた問題は、`Status`に✅がつきます。

私は以下の理由で、`Easy`から順に解いています。
- 時間をかけずに解けるので、毎日継続しやすい
- 解けない問題が続くとモチベーションや自信がなくなりそう
- [atCorder](https://atcoder.jp/?lang=ja)などの経験もないので、まずは形式に慣れたい

## 3. 画面の見方
こちらが問題を解く画面です。

![スクリーンショット 2025-04-10 13.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/c4ca76a1-e85e-4416-8c6e-afebe0feeb66.png)


問題文が英語だったので、最初は正直ウッとなりましたが、翻訳や辞書、Exampleを見て臨んでいます。
余談ですが、MacOSでは`[command]`+`[control]`+`[D]`で辞書が開ます。
すごく便利なので、英語も一緒に学びたいという方は、辞書を使いながら自力で翻訳に挑戦しても良いのかなと思います。

:::note info
2025年4月現在は、英語と中国語に対応しているようです。
:::

### 問題文エリア

![スクリーンショット 2025-04-10 13.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/54b61020-b55e-45f3-bdf8-be61cffb3426.png)

#### Example
inputとoutputが記載されています。
後述しますが、実行後はここに記載されているInputを受け取った場合の処理結果が出力されます。

![スクリーンショット 2025-04-10 13.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/ac6949f1-b2c2-4498-a5b2-7d3a1c2f22bb.png)


#### Constraints
引数などの条件が書かれています。
業務プログラミングばかりだったので、正しい引数がくるとは限らない…と思い最初にチェック処理なんか入れていましたが、そういった処理は不要みたいですね。
![スクリーンショット 2025-04-10 13.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/7f8f464e-fe2c-46f2-b1f6-80db000652e0.png)

### コード入力エリア

![スクリーンショット 2025-04-10 13.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/2a34a331-ba98-4d65-ace8-3fb11cbfb64c.png)

#### 言語の変更
色々な言語で問題に挑戦できます。
![スクリーンショット 2025-04-10 13.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/a2f16a75-8242-4310-a484-c6b96b6deaf7.png)

### `Run`
`Run`を実行すると、Exampleに記載されている引数を受け取った場合の結果が表示されます。

### `Submit`
ここを押すと問題の提出がされます。

## 4. 問題を解いてみる

### `Run` で動作確認をする
問題を提出する前に、まずは`Run`を押して動作確認をします。

試しに、Example1のOutputを返してみました。
Case1 はクリアしていますが、Case2をクリアしていないので、不正解と表示されています。
![スクリーンショット 2025-04-10 14.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/258be7b5-7b52-4765-bbaf-1db5c8aa165b.png)

### コンソール出力
出力画面の `Stdout` に出力されます。

### 実装ができたら`Submit`する
`Run`を実行して問題なければ、`Submit`で提出して完了です。
注意点として、Case1、Case2…をすべてクリアしていたとしても、実装に不備があれば不正解になります。

# 他の人の回答を見る

`Solutions` では、他の人の回答を確認することができます。
実装して終わりではなく、他の人の実装を見ることでとても勉強になります。
また、他の言語での回答も見ることができるので面白いです。

![スクリーンショット 2025-04-10 14.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050763/77157cdf-5730-437e-b91c-9659cd4c9969.png)

# おわりに
同じ問題で、色々な方の実装を見られるのはとても良い経験だなと思いました。
コーディングテスト対策にもぴったりだと思いますので、英語サイトだからと嫌厭していた方はぜひこの記事を読んでチャレンジしてみると良いのではないでしょうか。
その他にも色々な学習機能があるようなので、お時間ある方は色々触ってみると良いと思います！
ここまでお読みいただき、ありがとうございました！
SplunkでMCPを使う

# はじめに

お久しぶりです。もうsplunkを退職してからはもう触ることはないかなと思っていましたが
数年ぶりにSplunkを触る必要がでてきました。

いろいろ触ってたら当然のごとくSPLなんてもう覚えてないわけです。
Stats...eventstats...tstatsってどう書くんだっけとかで悶々としてたので、MCPのsplunk agentを見つけたので、一旦実装してみます。

# Splunk MCP tool
https://github.com/livehybrid/splunk-mcp

今回はこちらで作成いただいていたものがベースです。

searchはもちろん、indexのlist、kv_storeのlistやらいろいろfunctionがあります。

https://github.com/livehybrid/splunk-mcp?tab=readme-ov-file#available-mcp-tools

## 環境
一旦、Localのmacにinstallしたsplunkを使います。
MCPのhostはClaudeでやります。

## 準備
まずはlocalにgit cloneしてきます。

```
git clone https://github.com/livehybrid/splunk-mcp.git
cd splunk-mcp
```

githubの手順だとpoetryなのですが、uvを使ってやります。
splunk_mcp.pyの内部で、fastapiをcallするので、fastapi addします。

```
uv add "mcp[cli]" httpx fastapi
```

## splunk_mcp.pyを修正
localでやる場合、splunkが8000portでlistenしているので、fast api側のportを変更します。

```
vim splunk_mcp.py 

# FASTMCPのポートを8000から8001へ
FASTMCP_PORT = int(os.environ.get("FASTMCP_PORT", "8001"))
os.environ["FASTMCP_PORT"] = str(FASTMCP_PORT)
```

### 一旦起動するか確認
```
uv run splunk_mcp.py stdio
2025-04-10 14:46:45,501 - __main__ - INFO - 🚀 Starting Splunk MCP server in STDIO mode
```

起動したらCtlr+Cで抜けてください。

### Claude側の設定ファイル修正
readmeだと、envファイルを置けばいけるっぽいのですがうまく読み込めていなかったので、jsonに直接書いちゃいます。

- commandはuvのパス
- envに接続情報
- argsにsplunk-mcpのパス

```
vim ~/Library/Application\ Support/Claude/claude_desktop_config.json

    "splunk": {
      "command": "/Users/satoshi/.local/bin/uv",
      "env": {
        "SPLUNK_HOST": "127.0.0.1",
        "SPLUNK_PORT": "8089",
        "SPLUNK_USERNAME": "admin",
        "SPLUNK_PASSWORD": "hogehogefugaga",
        "SPLUNK_SCHEME": "https",
        "VERIFY_SSL": "false"
      },
      "args": [
        "--directory",
        "/Users/satoshi/Downloads/splunk-mcp",
        "run",
        "splunk_mcp.py",
        "stdio"
      ]
    }

```

### Claudeアプリ
一旦再起動してください。

## 結果どうなる
claudeを再度起動した際に、ハンマーアイコン？にmcp toolが出てくるはずです。

![Screenshot 2025-04-10 at 14.50.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/f5da132f-54fc-45b9-8e34-e12ed7e8c3ee.jpeg)

その中にsplunk関連のtoolが表示されると思います。
(表示されない場合はうまく設定がいけてないので確認してみてください)

![Screenshot 2025-04-10 at 14.50.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/a7ea1dc9-6b83-491b-aa55-c140acaac2d1.jpeg)


では早速promptを書きます。
最初はラフな感じで。

![Screenshot 2025-04-10 at 14.52.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/49ec6dc0-2421-410a-8178-b6799a707218.jpeg)

雑なpromptなので、一発で行きませんでしたが状況に応じてそれぞれのtoolをcallしていることがわかります。

ちょっと足します。

![Screenshot 2025-04-10 at 14.53.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/8f852c63-bf8a-43b6-9baf-bbf435aa690e.jpeg)

これはきれいに行きましたね。

もうちょっとやってみましょう。

![Screenshot 2025-04-10 at 14.56.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/7a8e3e3b-b0fc-4b2b-b7b2-517b67d38b04.jpeg)

# 最後に
簡単ではありますがこんな感じでMCPを使ってagentを動かすことできますので。ragとも組み合わせて色々使えそうなのでまたやったらメモ残します
cursorでnotionの公式MCPがclient closedとなる原因の一例(npxは正しく動きますか)

## 背景
Notion公式からMCPが公開されたので、Cursorと連携しようとしました。
設定は複雑ではないはずなのに、必要な設定を終えた後もnotionApiの欄に赤く「client closed」と表示され、接続がうまくいきませんでした。

## 原因
```mcp.json
{
  "mcpServers": {
    "notionApi": {
      "command": "npx",
      "args": ["-y", "@notionhq/notion-mcp-server"],
      ...
    }
  }
}
```

mcp.jsonの`"command": "npx"`を見て、npxへのパスがうまく通っていないのではと確認したところ、nodeのバージョン管理にasdfを使用している中で、グローバルのnodeバージョンがうまく指定できていないことが分かりました。

npxの動作確認：
```
npx --version
```
通常のプロジェクトでは.tool-versionsファイルに使いたいバージョン情報を記載しますが、Cursorの設定ディレクトリにはそれがない状態でした。

## 解決
おそらく適切な場所に.tool-versionsファイルに設定することや、グローバルバージョンを指定することで解決します。
asdfで管理したい事情は別にあったためnodeだけnpmに切り替えたところ解決しました。

プログラミング初心者の初歩的な原因でした。MCPが話題となり初心者も多いかと思いますので、エラー時のチェック項目の一つとして参考のなればと思います。
macOSアプリのResources内にフォルダ構成を維持してファイル類を配置する

## 背景
フォルダで分類分けされたファイルを、そのまま開発中のアプリに持っていきたいです。
普通にファイルをXcodeのプロジェクトに追加すると、下のようにフォルダ階層がない状態でResource内にコピーされます。

![スクリーンショット 2025-04-10 14.17.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/f97f460c-7116-4e4d-b63f-8ad298d55a99.png)

少し前のバージョンのXcodeでは、サイドバーにDrag & Dropしたとき、「フォルダ構成を維持しするか？」みたいな選択肢が出てきました。確か...

今もそのような選択肢は出てくるのですが、なぜか反映されない...
バグっぽい気もします...

## 直接Copy Bundle Resourcesに追加する
サイドバーでなく、```Build Phases```の```Copy Bundle Resources```で操作します。
+ボタンで追加、または直接Drag & Dropします。
![スクリーンショット 2025-04-10 14.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/15685e69-6403-4909-a1b3-1a7963391f86.png)

すると、どのように追加するかの選択肢が現れます。

![スクリーンショット 2025-04-10 14.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/047e34d2-01c6-4046-bbba-31eaefb80b31.png)

ここで```Create folder references```を選択します。

![スクリーンショット 2025-04-10 14.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/10c4ee6a-6ad6-44d5-bcfa-5ec6a04a7efb.png)

このように、フォルダとして画面上に追加されました。

## アプリのResources構成を確認する
アプリのパッケージを確認すると、Resourcesフォルダの中に追加したフォルダがあり、ファイルもちゃんと格納されています。

![スクリーンショット 2025-04-10 14.30.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/603709ea-567a-45ee-840e-6ed120ee124c.png)

## リソースへのアクセス
リソースフォルダは下記のように取得できます。
```swift:リソースフォルダを取得する
let resPath = Bundle.main.resourcePath
```

```resPath```は```String```なので、フォルダ名やファイル名をappendしてアクセスすることができます。
「命令」から「創造」へ：プロンプトが変えるエンジニアの設計観

# 📘 「設計する」という詩的営み

従来、エンジニアリングは**正確な論理記述の営み**でした。  
仕様を明確にし、コードを記述し、再現可能な出力を得る。

しかし2024年以降、生成AIが実用段階に入りつつある今、  
「**プロンプトを書くこと**」自体が、  
**設計の新しい在り方**として浮上しています。

プロンプトとは何か？ 命令か？ 詩か？ 設計か？

本記事では、**「プロンプト×エンジニアリング」＝詩的設計**  
という視点から、エンジニアの仕事を再定義していきます。

---

# 🧩 詩と設計の融合構造

## 🔷 プロンプト再定義の12ステップ

| STEP | 意味 | 生成AI文脈での解釈 |
|------|------|----------------|
| 1 | 名前を与える | 「プロンプト」とは何か？命名から始まる |
| 2 | 境界を引く | プロンプト vs コマンドの違い |
| 3 | 背景を問う | なぜ“詩”としての性格を帯びるのか |
| 4 | 歴史と照合 | 記述言語とナラティブの関係 |
| 5 | 分解する | プロンプトの構造＝目的・文脈・形式 |
| 6 | 再構築する | 設計図としてのプロンプト再定義 |
| 7 | 他者化する | プロンプトは「共創」の道具である |
| 8 | 例外を問う | 曖昧性・非決定性の価値 |
| 9 | 感性を取り込む | 美しさ・リズム・詩的要素の設計反映 |
| 10 | 構造と思想を接続 | UI/UX設計とも接続する |
| 11 | 教育的観点から見る | 学習者にとってのプロンプトは何か？ |
| 12 | 最小単位に還元する | 「一文で語るなら？」という視点 |

---

## 🔸 設計視点での再定義

| 内容 | 適用例 |
|------|----------------|
| **抽象と詩性の統合** | 「明確」だけでなく「詩的な余白」が価値となる |
| **境界逸脱の設計** | 過剰具体化より、解釈可能性を持たせる設計が有効 |
| **共創トリガーとしての設計** | 書くこと自体がチーム内知の構築になる |

---

# 🔶 プロンプト vs 設計図の構造比較

```mermaid
flowchart TD
  A[従来の設計図] --> B(論理・仕様に従属)
  A --> C(コードとして具体化)
  C --> D(エンジニアが命令者)

  E[プロンプト設計] --> F(目的・詩性・曖昧さを含む)
  E --> G(生成AIにより動的応答)
  G --> H(エンジニアは創造者)

  style A fill:#f0f0f0,stroke:#888
  style E fill:#fdf6e3,stroke:#aa8

  subgraph 対比
    A --> E
  end
```

---

# 💡 プロンプト設計のための3つの実装例

## ① 意図の可視化：コメントから始まるプロンプト設計

```python
# グラフ可視化 → 複数シリーズ対応 → タイトルを日本語にしたい
prompt = """
以下のmatplotlibコードを生成してください：
- 複数の折れ線グラフをプロット
- タイトルは日本語で「売上比較」
- 凡例と軸ラベルもつけてください
"""
```

> 🔍【解説】：プロンプトはただの命令ではなく、**思考の可視化の一歩目**となる。

---

## ② 詩的構文による共創の誘導

```text
あなたは優秀なUI/UXデザイナーです。
以下の条件を満たすHTMLを詩的に生成してください：
- ユーザーの感情に寄り添う配色
- モバイルファースト
- 「触れたくなる」ボタン
```

> 🔍【解説】：このように、**「詩的な形容詞」＋目的」**の融合は、より深い共創を促進する。

---

## ③ AIとの対話型設計プロセス

```text
この設計方針に対するフィードバックをください：
- シンプルだが奥行きのあるナビゲーション
- メタファーとして「図書館の構造」を意識
- 色彩は知的・落ち着いたもの
```

> 🔍【解説】：AIは“フィードバック相手”にもなりうる。これは**ペア設計**への進化形。

---

# 🌀 言葉で設計する時代へ

プロンプトとは命令ではなく、**設計であり詩**であり、**共創の呼びかけ**です。  
そして、エンジニアリングとは、もはや“構文の記述”だけではなく、  
**世界をどう詩的に、意図的に形づくるか？** という営みへと拡張されています。

生成AIの台頭は、「プロンプト」を通して、  
エンジニアという存在の輪郭を広げつつあります。

**エンジニア＝詩的設計者**  
その時代は、すでに始まっているのです。
Docker が起動しなくなった時の解決方法

Docker が起動しなくなった時の解決方法です。

## 動作の確認

active (running) になっているかを確認

```bash
sudo systemctl status docker
```

```bash
sudo systemctl status docker.socket
```

## エラーの状況

docker0 がないことを確認

```text
$ ip link show docker0
Device "docker0" does not exist.
```

手動で dockerd を起動すると、docker0 が既にあるというメッセージが出る

```text
$ sudo dockerd
INFO[2025-04-10T14:06:11.384937037+09:00] Starting up                                  
INFO[2025-04-10T14:06:11.387971388+09:00] OTEL tracing is not configured, using no-op tracer provider 
INFO[2025-04-10T14:06:11.388194895+09:00] detected 127.0.0.53 nameserver, assuming systemd-resolved, so using resolv.conf: /run/systemd/resolve/resolv.conf 
INFO[2025-04-10T14:06:11.408688154+09:00] Creating a containerd client                  address=/run/containerd/containerd.sock timeout=1m0s
INFO[2025-04-10T14:06:11.442628049+09:00] [graphdriver] using prior storage driver: overlay2 
INFO[2025-04-10T14:06:11.445333957+09:00] Loading containers: start.                   
INFO[2025-04-10T14:06:12.328491338+09:00] stopping event stream following graceful shutdown  error="<nil>" module=libcontainerd namespace=moby
failed to start daemon: Error initializing network controller: 
error creating default "bridge" network: cannot create network a8e02b8c3293330093318a136255a51566a7bb5d3ba805d47faf6814cc093fdc 
(docker0): conflicts with network c083e14ddfaa0aa30d6f81bc2e2ab1823195c68604099f7258c30b775b923d8a 
(docker0): networks have same bridge name
```

## 停止

```bash
sudo systemctl stop docker
sudo systemctl stop containerd
```

## 不正になった設定の削除

```bash
sudo rm -rf /var/lib/docker/network
```

## 起動

```bash
sudo systemctl start containerd
sudo systemctl start docker
```

## 状態の確認

```bash
docker network ls
```

```text
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
8c0ee0e247e5   bridge    bridge    local
4470a25be900   host      host      local
b28b76bae120   none      null      local
```
産業用異常検知の新たな挑戦：「MVTec AD 2」データセット

### 1. 論文の基本情報

**タイトル**: The MVTec AD 2 Dataset: Advanced Scenarios for Unsupervised Anomaly Detection
 **著者**: Lars Heckler-Kram, Jan-Hendrik Neudeck, Ulla Scheler, Rebecca König, Carsten Steger
 **発行年**: 2025年
 **リンク**:https://arxiv.org/abs/2503.21622

![image-20250407100920580.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/f5a98127-9d26-403f-8fca-ea26ab4b0b00.png)


### 2. なぜ「MVTec AD 2」が必要なのか？

本論文では、産業用ビジュアル検査における「教師なし異常検知」のための新しいベンチマークデータセット「MVTec AD 2」が提案されています。
 従来のMVTec ADやVisAなどのデータセットでは異常検知モデルの性能がほぼ頭打ち（AU-PROで90%以上）となっており、モデル間の比較が難しくなっていました。
 MVTec AD 2は、実際の現場で遭遇する困難な8つのシナリオと、8,000枚以上の高解像度画像を収録し、より実践的で難易度の高い評価環境を提供しています。

![image-20250407100936574.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/f0d9cb57-083b-4fab-b36a-0891543e558f.png)


------

### 3.MVTec AD 2で実現されたブレイクスルー

- **難しい現場シナリオを網羅**
  照明条件の変化、透明・反射物体、画像の端に現れる欠陥、重なり合う多数の物体など、従来データセットでは扱われなかった実用的なシーンを多数収録。
- **異常検知モデルの性能が一気に低下**
  従来90%以上だったAU-PROが、本データセットでは最も高くても58.7%（EfficientAD）と、大幅に難化。モデルの真の性能が問われる構成になっています。
- **テストラベル非公開＋評価サーバ方式**
  正解ラベルが公開されず、評価は専用のサーバ経由で行う形式。チューニングによる過学習を防ぎ、公平なモデル比較が可能です。

------

### 4. 実用を意識したデータ設計の工夫

- **照明条件の多様性**
  各シナリオは最低4種類の照明で撮影されており、現実世界で起こる「環境変化への耐性」を検証できます。

- **欠陥の空間的分布**
  従来は画像中心に欠陥が集中していましたが、MVTec AD 2では画像全体に欠陥が分散。中央寄せの学習への偏りを回避できます。

- **AU-PRO（Per-Region Overlap）指標の強化**
  小さな欠陥も公平に評価するAU-PRO0.05を採用。これにより実運用に近い性能評価が可能です。

  

------

### 5. どのように効果を検証したか？

- 7つの異常検知モデル（PatchCore、EfficientAD、RD、MSFlow、SimpleNetなど）を使用し、性能をベンチマーク。
- 通常照明（TESTpriv）と異なる照明（TESTpriv,mix）で比較し、照明変化へのロバスト性を評価。
- 解像度を上げることで性能向上が確認された一方、メモリと計算リソースの消費が大幅に増加。

![image-20250407101047813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/86c999f2-8f1f-4491-95c3-5b61133b343b.png)

![image-20250407101059202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/f3d57302-20e4-4565-b8d4-401c52b43af5.png)

![image-20250407101036098.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/1e51d18b-2c38-4d70-9efc-d19634c7e3bf.png)

------

### 6. 現場導入に向けた課題と展望

- **解像度と精度のトレードオフ**
  解像度を上げれば性能は向上しますが、推論時間とメモリ使用量が大きく増加。現場でのリアルタイム処理には制約があります。
- **照明変化への対応**
  ロバスト性の強化には、今後より高度なデータ拡張や照明変化を模擬した学習手法が必要になる可能性があります。
- **しきい値不要モデルの模索**
  異常スコアの二値化（しきい値設定）による誤判定を防ぐ、新しいアプローチの必要性が示唆されています。

------

### 7. 次に読みたい関連研究

- **EfficientAD**: ミリ秒単位の高速異常検知を実現するモデル
- **RD++ (Reverse Distillation Revisited)**: 最新のディスティレーション型異常検知手法
- **Real-IAD**: 多視点対応の現実環境向け異常検知データセット
[PowerBI] 列内の文字列（データ）の分割

# Introduction
PowerBIで`/`で区切られているデータを分割する手順を記しています

# 手順
## 分割元の列（表内）を残さずに分割する方法
1. **Power BI Desktopを開く**: Power BI Desktopを起動し、データをインポートします。
1. **クエリエディターを開く**: 「ホーム」タブから「データの変換」をクリックして、Power Queryエディターを開きます
1. **分割対象の列を選択**: 分割したい列を選択します
1. **列の分割**: 選択した列を右クリックし、「列の分割」を選択します。その後、「区切り記号による分割」を選択します
1. **区切り記号の指定**: 「区切り記号を選択するか入力してください」の下を「カスタム」に変更し、「/」を入力します
1. **分割の実行**: 「OK」をクリックして、列を分割します。これにより、元の列が「/」の前後で分割され、2つの新しい列が作成されます

## 例
分割前
| 元の列       |
|--------------|
| データ1/データ2 |
| データ3/データ4 |

分割後
| 新しい列1 | 新しい列2 |
|-----------|-----------|
| データ1   | データ2   |
| データ3   | データ4   |


## 分割元の列（表内）を残して分割する方法

1. **Power BI Desktopを開く**: Power BI Desktopを起動し、データをインポートします。
1. **クエリエディターを開く**: 「ホーム」タブから「クエリの編集」をクリックして、Power Queryエディターを開きます。
1. **元の列を選択**: 分割したい列を選択します。
1. **カスタム列の追加**: 「追加列」タブから「カスタム列」を選択します
1. **カスタム列の式を入力**: カスタム列の式に以下のように入力します。これにより、元の列の内容をそのまま新しい列にコピーします。

   ~~~
   = [元の列]
   ~~~

1. **新しい列を分割**: 新しく作成したカスタム列を選択し、右クリックして「列の分割」を選択し、「区切り記号による分割」を選択します
1. **区切り記号の指定**: 「区切り記号を選択するか入力してください」の下を「カスタム」に変更し、「/」を入力します
1. **分割の実行**: 「OK」をクリックして、カスタム列を分割します。これにより、元の列はそのまま残り、カスタム列が「/」の前後で分割されます

## 例
分割前
| 元の列       |
|--------------|
| データ1/データ2 |
| データ3/データ4 |

分割後
| 元の列       | 新しい列1 | 新しい列2 |
|--------------|-----------|-----------|
| データ1/データ2 | データ1   | データ2   |
| データ3/データ4 | データ3   | データ4   |

# 参考リンク
- [位置による列の分割](https://learn.microsoft.com/ja-jp/power-query/split-columns-positions)
- [PowerBI×列の分割](https://soft-zou.jp/2024/04/02/split-column/)
- [第12回：列分割（区切り文字で分割）する](https://lab.pasona.co.jp/data-operation/skill/808/)