OmniAICreator/Qiita-1.07M huggingface dataset:
git revertとgit resetの違いを手を動かして学ぶ



# はじめに
　不十分な知識のままgitコマンドを入力したことにより、ミスしてしまった経験が最近ありました。日常的に触るコマンドならまだしも、機会が少ないコマンドは特に不十分な知識になりやすいなーと痛感しました。そこで今回は、自分にとってまだ曖昧な`git revert`と`git reset`の違いを手を動かして理解してみようと思いました。ともに変更を打ち消すものですが、内容は大きく異なりました。

 ※メールアドレスなど個人情報が含まれている箇所はグレーで塗りつぶしています。
 コミット番号は関係ないと思うのですが、ここも塗りつぶしています。

# サンプル
　今回の記事作成にあたり、コミットを4つ作成しました。

コミット名：Initial commit　
=> qiita.txtのファイル作成

コミット名：1st commit 
=> qiita.txtの1行目に`Hello GaneHaru`と記述

コミット名：2nd commit 
=> qiita.txtの2行目に`Hello Qiita`と記述

コミット名：3rd commit 
=> qiita.txtの3行目に`Hello Git`と記述

ここまでのコミットの内容は以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808088/458aa003-583a-4c2c-939f-22a624322329.png)

# git reset の使い方
　`git reset`は変更を打ち消すものの、変更を打ち消した履歴を残さないときに使います。
　resetのあとに、--soft、--mixed、--hardのどれを入力するかで結果が大きく変わります。
　`HEAD~1`としていますが、コミット番号でも同様の再現が可能です。

## git reset --soft
```bash:書き方（例）
git reset --soft HEAD~1
```
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808088/f04699f9-de80-4965-bb27-4892b469fe4e.png)

　`git reset`はコミットを取り消しますが、取り消したという履歴は残しません。
　`git log`で確認してみると、3rd commitが削除されているものの、3rd commitが削除されたという履歴は残っていないことがわかります。また、resetの後に --softと入力すると、取り消したコミットの内容がステージングエリアに残されていることも確認できます。

【こういうときに使うのかな】
・コミットメッセージを間違えてしまい、すぐに修正したい場合

## git reset --mixed
```bash:書き方（例）
git reset --mixed HEAD~1
```
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808088/8ffc70e1-57b1-425e-a8d7-db7123caaf2e.png)

　`git reset`なので--softのときと同様、履歴は残しません。
　--mixedを指定した場合、--softとは異なり取り消した内容がステージングエリアに残らず、ワーキングディレクトリに残ります。そのため、再度コミットするには`git add`してステージングエリアに戻す必要があります。

【こういうときに使うのかな】
・コミットしたが、修正点に気が付きすぐ直したい。
（こういう場合もコミット履歴は残したほうが良い時もある）

## git reset --hard
```bash:書き方（例）
git reset --hard HEAD~1
```
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808088/c2723dd7-58b8-42e5-a07d-7f3a53a3bf8e.png)


　--hardを指定した場合も、履歴は残しません。
　一方で--soft、--mixedのときとは異なり、取り消した内容がどこにも残りません。`git status`と入力しても`nothing to commit, working tree clean`と表示されます。またキャプチャのqiita.txtを確認すると3rd commitで入力した`Hello Git`も削除されています。--hardを指定した場合は、自分がどのような変更内容を打ち消したのか確認できないので、入力には注意が必要です。そのため、安易に実行すべきコマンドではありません。

【こういうときに使うのかな】
・特定のコミットに強制的に戻りたい。
（こういう場合もコミット履歴は残したほうが良い時もある）
・以前に取り消したコミットへ復帰したい。
（記事作成するためサンプルへ戻る際に何回も利用しました。）

# git revert の使い方
　`git revert`は変更を打ち消すと同時に、その操作自体の履歴も残します。
　resetとは違い、--soft、--mixed、--hardは使いません。

```bash:書き方（例）
git revert {コミット番号}
```

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808088/1c0d0a8c-00e1-4271-ab9d-47a154c15e17.png)


　`git revert`なので変更を打ち消した履歴を残します。
　3rd commitを打ち消すrevertコマンドを入力してみると、コミットとしてRevert "3rd commit"が追加されます。またキャプチャのqiita.txtには3rd commitとして追加した`Hello Git`が削除されていることがわかります。コミット履歴として残ることでどの変更を打ち消したのかが分かるので、後から見直しやすい利点があります。


# まとめ
　自分の手で実際に試した結果、チーム開発をする場合は履歴が残る`git revert`のほうが有用というのが分かりました。しかし状況に応じて`git reset`したほうが良いケースもあると思うので、今回`git reset`も合わせて学ぶことができてよかったと思っています。Gitはまだ理解が不十分な部分もあるので、今後も必要に応じて調べながら、適切なコマンドを選べるようにしていきたいと思います。


 　記事が良かった・参考になったと思ったらいいね！を付けてくれると嬉しいです！
Windows環境でXAMPPを使用してEC-CUBE4.3のテスト環境構築！

便所のメモ書き程度に書いていきます。
自分が再度Windows・XAMPPを利用して困らないための忘備録です。

環境
・Windows 11
・XAMPP 8.2.4　インストールフォルダ：C:/xampp
・EC-CUBE 4.3

XAMPPやMySQLは全然問題なくインストール等終わったんですよね。
しかし、エイヤ！と動かすと異変が↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/570834ba-255e-4d8b-abd9-0bd040f93ac3.png)
```
Warning: openssl_pkey_export():
    Cannot get key from parameter 1 in
        C:\xampp\htdocs\ECBOOM\ec-cube\app\Plugin\Api42\
            DependencyInjection\Compiler\ApiCompilerPass.php
on line 111
```
調べてみると、こちらのブログがヒット。
https://clip-box.net/2023/11/06/post-400/

ふんふん・・・？

つまり、環境変数をセットすると解決する、と。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/0372b702-9463-4e70-aa9f-d68031a43b0d.png)

環境変数をセットし、実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/a6c630ff-4f84-460e-98c8-6ea88a87f771.png)
うまくいきました。

が、モジュールが有効になっていないとのこと。

php.iniを確認すると、下記sodiumとzipが有効になっていないことが発覚。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/7c1e77d5-7f2b-47a1-8910-d300baf3a381.png)

また、下記intlも有効に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/0b0606a6-84de-4d18-ab96-5d75f41952fc.png)

残りの推奨はどうしようかな、としばらく考えつつ調べていると下記が見つかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/e66e9336-a115-4187-9d70-cc6b7b2315b4.png)
PHP8.0.0以降はWinCacheがサポートしていないとのこと。

ほないっか、と思いApacheを再起動し、URLをたたく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/5afc332a-5f70-4882-b97b-7ee3d430583f.png)
おお～～～。

手順に沿って進めていくとできました！！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322953/9b114cea-88c3-49a1-8518-8349d33629b7.png)

途中で、MySQLのホスト名確認せねばな～～と思ってPCのホストを記載したら、localhostのことかよ！！！って思ったのは内緒。
Slack 入力欄の上部に「テキストの書式設定ツールバー」を表示・非表示を切り替えるための設定

## 概要

新規メンバーJOIN時にSlackの入力欄上部の「太文字」や「斜体」などをポチポチできる「テキストの書式設定ツールバー」が表示されておらず若干困ったので「テキストの書式設定ツールバー」の表示・非表示の設定方法を簡単にまとめておく

![CleanShot 2025-05-08 at 01.55.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e763f930-59f0-44cb-91cb-3fe3a81696c8.jpeg)

## 前提

筆者のPCはMac

## 方法

1. Slackのウインドウをクリックしてアクティブ状態にする
1. 右上のメニューバーのリンゴマークの横の「Slack」をクリックする

    ![CleanShot 2025-05-08 at 01.59.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c5f88bee-bc8e-4b44-914b-df01d6ccd13e.jpeg)

1. 「設定...」をクリックする
1. 「詳細設定」をクリックする
1. 「マークアップでメッセージを書式設定する」のチェックを外せば「テキストの書式設定ツールバー」が表示、チェックをつければ制御バーが非表示になる
TDDで学ぶカスタムORMの実装（アノテーションによるテーブル生成まで）

## はじめに

このドキュメントでは、TDD（テスト駆動開発）の学習として、カスタムORMの実装に取り組んだ経験をまとめています。Claudeの提案により、ORMの実装は以下の理由でTDDの学習に最適だと判断しました：

1. 明確な要件定義が可能
2. 段階的な機能追加が自然
3. テスト可能な単位が明確
4. リファクタリングの機会が多い

こんな感じに言われてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3339625/5835563c-ac70-4139-b477-6461bbe06a6c.png)

## 1. TDDとAIを活用した開発の本質

### 1.1 なぜTDDなのか

TDDを選んだ理由は、単なるテスト手法の学習ではなく、より本質的な開発の質を高めるためでした。特に、AIを活用した開発において、TDDは以下の点で重要な役割を果たします：

1. **設計の質の向上**
   - テスト可能な設計の自然な導出
   - インターフェースの明確化
   - 責務の適切な分離

2. **開発の効率化**
   - 明確な目標の設定
   - 段階的な機能追加
   - 早期のバグ発見

3. **保守性の向上**
   - テストによる仕様の文書化
   - リファクタリングの安全性
   - 変更の影響範囲の把握

### 1.2 AIとの協業での気づき

1. **実装の粒度**
   - AIは大きな単位での実装を提案しがち
   - 小さな単位での実装を要求する必要がある
   - テストケースを先に書くことで、適切な粒度を維持

2. **エラーハンドリング**
   - AIは基本的なエラーケースしか考慮しない
   - エッジケースのテストを追加することで、より堅牢な実装に
   - エラーメッセージの具体性を高める

3. **リファクタリング**
   - AIの提案をそのまま採用せず、テストを書きながら改善
   - コードの重複を発見し、適切な抽象化を検討

## 2. 実践的な学びと気づき

### 2.1 テストケースの具体例

実際の開発で遭遇した興味深いケースを紹介します：

1. **カラム名の命名規則**
   ```java
   @Entity
   class User {
       @Id
       private Long id;
       
       @Column  // 名前を指定しない場合
       private String myName;
       
       @Column(name = "user_name")  // 名前を指定する場合
       private String userName;  // スネークケース
   }
   ```
   このようなケースで、カラム名の解決が正しく行われない問題を発見しました。mynameというカラムが生成されるという結果になり、my_nameという期待値とずれてしまうというものです。テストを書くことで、命名規則の例外ケースに気づくことができました。特に、アンダースコアを含むケースでの抜け漏れが多かったです。

2. **実装の分割**
   - 小さな単位での実装を心がける
   - テストが書きやすい設計を意識
   - リファクタリングの機会を逃さない

3. **AIの活用方法**
   - 具体的な指示を出す
   - 段階的な実装を要求
   - テストケースの優先順位を明確に

### 2.2 実際の開発での課題

1. **テストの優先順位**
   - 基本機能のテストを先に書く
   - エッジケースは後から追加
   - パフォーマンステストは最後に

2. **実装の分割**
   - 小さな単位での実装を心がける
   - テストが書きやすい設計を意識
   - リファクタリングの機会を逃さない

3. **AIの活用方法**
   - 具体的な指示を出す
   - 段階的な実装を要求
   - テストケースの優先順位を明確に

## 3. 今後の展望

1. **TDDの深化**
   - より体系的なテスト設計
   - テストカバレッジの向上
   - テストの自動化

2. **機能の拡張**
   - リレーションシップのサポート
   - トランザクション管理
   - マイグレーション機能

3. **学習の応用**
   - 他のプロジェクトへの適用
   - チーム開発での活用
   - ベストプラクティスの確立

## 4. まとめ

TDDによるカスタムORMの実装を通じて：

1. **TDDの実践的な理解**
   - テストファーストの効果
   - リファクタリングの重要性
   - 継続的な改善の価値

2. **設計の質の向上**
   - テスト可能な設計の導出
   - 明確なインターフェース
   - 保守性の高いコード

3. **開発プロセスの改善**
   - 段階的な機能追加
   - 早期のバグ発見
   - 継続的な品質確保

4. **AIとの協業**
   - 適切な指示の出し方
   - 実装の分割と統合
   - 学習の効率化

これらの経験は、今後のプロジェクトでも活かせる貴重な学びとなりました。特に、AIを活用したTDDの実践において、適切な粒度での実装とテストの重要性を学ぶことができました。

## 5. おわりに

カスタムORMの実装を通じて、TDDの実践的な学びを得ることができました。特に、AIを活用した開発において、テストの重要性を再認識しました。
ORM作成はまだまだ途中なので、今後も引き続き続けていこうと思います。
GitHub：https://github.com/iineineno03k/custom-orm
Copilotで琵琶を使う魔法少女を描いてみた。

# 概要

Copilotで琵琶を使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光の琵琶を使う魔法少女を描いてください。
```

![光の琵琶を使う魔法少女_20250508.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/636faf8c-bce3-4d22-90bc-fdf98cb05d3f.png)


```
闇の琵琶を使う魔法少女を描いてください。
```

![闇の琵琶を使う魔法少女_20250508.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/b6773c2b-3a3b-4e31-bd38-2c4173667c46.png)


```
聖なる琵琶を使う魔法少女を描いてください。
```

![聖なる琵琶を使う魔法少女_20250508.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/527803f5-7ffe-4ccc-b088-9ac58e0f1cf4.png)



# まとめ

色違いでポーズは似ているかも。
何かの役に立てばと。
【Android】リモート環境上からローカルPCに接続した端末に対してADBコマンドを実行する方法

## キーワード
- Android
- AndroidStudio
- ADB

## やりたいこと:thinking:
- Androidの開発環境がリモート環境上にある場合、ローカルPCに接続したAndroid端末に対してADBコマンドを実行したい
- 開発途中のアプリをインストールしたAndroid端末のプロセスにアタッチしてデバックしたい

## 方法
1. ローカル環境上でADB serverを起動する
1. ADB通信（port: 5037）をリモート環境からローカル環境に向けてポート転送させる

## 実際にやってみた
### 検証環境
-  ローカルPC
    -  windows11
-  Android端末
    -  Android 13
-  リモートPC
    -  windows11（virutal box上に準備）
    -  ※ローカルPCと同一のブロードキャストドメインになるようにNWの設定はブリッジアダプターを指定


### 1. adbのインストール
- ローカルPC・リモートPCともにAndroid SDK Platform-Toolsをダウンロード
- Android SDK Platform-Tools
    - https://developer.android.com/tools/releases/platform-tools?hl=ja

### 2. ローカルPCでadb serverを起動
- 以下のコマンドを実行
- ADBサーバが5037番ポートで起動したのを確認する
```powershell
C:\Users\local\platform-tools-latest-windows\platform-tools> ./adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully
```

### 3. SSHでポート転送を設定
- リモートPCのipアドレスを確認する
- リモートPC上の5037番ポートへの問い合わせを、ローカルPC上の5037番ポートに転送するように設定する
```powershell
C:\Users\local\platform-tools-latest-windows\platform-tools> ssh -R 5037:localhost:5037 test@192.168.3.4 -v
```

### 4. リモートPC上でADBコマンドを実行
- adb logcatなど実行すると端末のログが確認できます
```powershell
C:\Users\remote\platform-tools-latest-windows\platform-tools> ./adb devices
List of devices attached
SXILHMA261700953        device
```

## まとめ
- リモートPC上からローカルPCに接続した端末に対してADBコマンドを実行するには、5037番ポートをローカルPCに転送させれば良い
- 言い換えるとADB通信をSSHトンネルさせれば良い

## 追記
- 関連記事
    - @hamupさんの以下の記事でもNW越しにADBコマンドを実行する方法が紹介されています
        -  `adb connect`コマンドで同一NW上のAndroid内のadbデーモンに接続する方法です
        - [ネットワーク経由でadb実行する](https://qiita.com/hamup/items/d0757af393a5462b686a)
        - Androidスマホがadbコマンドを実行したいホストと同一NW上にない場合は本記事で議論したようにadb serverに対してポート転送するしかないと理解しています
Databricksチュートリアル(Day4): DLT を使用して ETL パイプラインを構築してみた

## 前提
・利用環境：Databricks

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

## 参考ドキュメント
https://docs.databricks.com/gcp/ja/getting-started/data-pipeline-get-started
## 操作手順（動画）
<iframe width="100%" height="315" src="https://www.youtube.com/embed/OjwO8bRf8Ss?si=lQVqex_GDvftkVYS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
EKPO和EKKO的AUDAT有什么区别

EKKO 订单头表
EKPO 订单行表
EKKO-AUDAT 整张采购订单的主创建日期
EKPO-AUDAT 特定行项目的创建日期（如分批添加）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/06195c9a-4b0f-4406-980b-c4a5d2be9b8c.png)

两张表的区别
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/144f4a37-1a29-48b3-b0d4-0094b22e247d.png)
【Rails】Errno::EACCES の原因と解決方法まとめ


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777937/ebd49995-2ed1-4b77-a535-96f911d2d77d.png" width="400" />

これは、Railsがファイルのリネームや操作を行う際にアクセス権限が不足している場合に発生します。
本記事ではこのエラーの主な原因と解決方法について解説します。<br><br>
## 	Errno::EACCES が発生する3つのパターン
#### 原因1：アクセス権限がない
対象のファイルに対して書き込み権限がないユーザーで操作しようとした場合に発生します。

#### 原因2 :ファイルがロックされている
以下のような外部ツールがファイルをロックしている可能性があります。
- ウイルス対策ソフト（Windows Defender、Avastなど）
- クラウド同期ツール（Dropbox、OneDriveなど）

#### 原因3 :キャッシュファイルの破損
前回の処理が途中で中断された（例：ビルド失敗、サーバー強制終了）などで、tmp/cache/ 配下のファイルが壊れている可能性があります。<br><br>

## キャッシュとは？
キャッシュとは、一時的にデータを保存して処理を高速化する仕組みです。
ここでは、キャッシュの主な特徴を3点ご紹介します！<br><br>

- **保存期間が限定的で、再利用できなくなったタイミングで自動的に削除される。**
  → 長期間使われない一時データは自動的に消去され、ストレージを圧迫しません。<br><br>

- **ファイルとして保存されるため、DBに比べて読み書きが高速。**  
  → 一時ファイルとして保存され、レスポンス向上に貢献します。<br><br>

- **メモリやディスク上に保持されることで、同じ処理を繰り返す際のパフォーマンスが向上する。**  
  → 処理の再利用性が高まり、ビルドや描画処理が高速化されます。<br><br>


## キャッシュを削除して正常化しよう！

`Errno::EACCES` は、Railsがキャッシュファイルにアクセスできない状態で発生することがあります。  
このような場合、壊れている一時ファイル（tmp/cache以下）を削除することで解消できます。

以下のコマンドを実行するだけで、**Railsの一時ファイル（ログ、キャッシュ、PIDなど）を一括で削除**できます。
```ruby:コマンドプロンプト
rails tmp:clear
```
FlutterでiOSシミュレーターにアプリをビルド＆実行する手順まとめ

flutterでiSOアプリ開発をする際、iosシュミレーターでビルド＆実行手順を忘れないよう備忘録として残します！

##  前提環境
macOS + Xcode（Command Line Tools含む）

Flutter SDK インストール済み

Flutterプロジェクトが作成済み（例：my_first_app）

## 結論 flutterでのビルドはターミナルでコマンドを叩く
「ターミナル」と聞くとアレルギー反応が出る方もいるかもしれませんが、今は ChatGPT もある時代。構えすぎずに触ってみると意外とシンプルです！

本記事では、FlutterアプリをiOSシミュレーターでビルド＆実行する手順をわかりやすくまとめています。
Flutter初心者なので、間違いや改善点があればぜひコメントで教えてください！


## 実行手順
① プロジェクトのルートディレクトリに移動
```
cd my_first_app
```
②iOSシュミレータを起動
```
open -a Simulator
```
※もしくはVSCodeのデバイス選択メニューからiPhone XXを選択。

③デバイスの確認(IDを取得)
```
flutter devices
```
例として以下のような出力を得ることができます
```
iPhone 16 Pro (mobile) • A1B7719A-C37F-4225-A240-3530E443D5B2 • ios • iOS 18.0 (simulator)
```

④アプリをビルドしてシュミレーターで実行
```
flutter run -d A1B7719A-C37F-4225-A240-3530E443D5B2
```

## おわりに
普段は Swift（Xcode）でiOSアプリ開発をしていますが、
Xcodeだと「左上の三角ボタン」や ⌘ + R で簡単にビルド＆ランできます。

一方Flutterは、

コマンドライン操作が多い

事前にシミュレーター起動が必要
など、少しだけ複雑な印象を持ちました。

もっと簡単な方法があるかも？と思っているので、今後も色々調べてみます！

今後もFlutter関連の記事を書いていければと思っています！
最後まで読んでいただき、ありがとうございました
AI Chatbotでプロンプトにパッと飛べる！おすすめツール

## Prompt Navigatorって何？

![chrome-capture-2025-4-5 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269934/6c734ec0-bb4b-41e2-a128-450080950a9a.gif)

Prompt Navigatorは、会話型AIで使ったプロンプトにサクッと飛べる便利な拡張機能。無駄なスクロールなしで、作業がめっちゃ効率的になります。

ChatGPT、Grok、Gemini、Claude、DeepSeekなど主要AIプラットフォームに対応してるけど、個人プラン専用で企業プランは非対応なので、そこだけ注意。

## 使ってみた感想
ChatGPTやGrokの長い会話ログから、ストレスフリーで目的のプロンプトをすぐ見つけられるのが最高。複数のAIを使う人には特にイチオシ。

## 便利な機能

- ダークモード対応
- ドラッグ＆リサイズできるパネル
- クリップボード連携
- メッセージの展開/折りたたみ

## インストール方法
[Chrome Web Store](https://chromewebstore.google.com/detail/prompt-navigator/fhjhecdbkkcfaapnpnomdopedafeniee)と[Safari Extension Store](https://apps.apple.com/jp/app/prompt-navigator/id6744920845?mt=12)でPrompt Navigatorをポチッと追加するだけ。

![截屏2025-05-08 0.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269934/ebf4ca93-3e9b-475e-98fa-ae2ff6317e40.png)


## まとめ
Prompt Navigatorは、AIチャットの過去プロンプトを効率よく探したい人にピッタリのツール。スクロールの手間が減って作業がスムーズに。AIをガンガン使うエンジニアには、シンプルで使いやすいアイテムです。
GMSL2を受像するために必要なI/F環境

##この記事は、2025/05くらいの著者の持ちうる情報で書かれています。
##整理用なので、間違いなどがあればご指摘いただければ幸いです。

## カメラ映像を使って色々したい時
　[前記事](https://qiita.com/msmsn1106/items/a99b3145330039fa8cba)にて、GMSL2のカメラを紹介した。しかし、カメラを入手したとて、この映像を使うにはどうしたらいいのか？
　映像の使い方については人それぞれなので、ここには記しません(PythonでAIに食わせるのも、OpenCVで色々やるのもあり)。

　肝心のPC取り込み手段について
* PCに、USBで取り込む手法　※どれも使ったことない
　　[GMSL2 USB3.0](https://amzn.asia/d/43lvhf5) - TierIV専用
　　[LI-USB30-IMX490-GW5400-GMSL2-120H](https://leopardimaging.com/product/automation-cameras/usb-3-0-cameras/usb-3-0-fakra-cameras/li-usb30-imx490-gw5400-gmsl2/li-usb30-imx490-gw5400-gmsl2-120h/) - Leopard Imaging専用
　　[SerDes Camera to USB Converter](https://sensing-world.com/USB_Converter/) - Sensing TECH専用
* デスクトップPCに、PCIeから取り込む方法
　　[Solectrix proFRAME3.0](https://solectrix.de/en/products/proframe/) - 各種カメラに対応。[販売はLeopardでやっている](https://leopardimaging.com/product/platform-partners/solectrix/li-pciefg-gmsl2/)が何せ高い(90万円とか？)
　　[CoaxCapture ll](https://store.sgwrd.com/products/coaxcapture-gmsl-video-capture-card_datasheet_v1) - Sensing TECH専用？ これも高い……がサポートはよい気がする(簡単に接続可能)
　　[PCIe-GL26](https://www.neousys-tech.com/ja/product/feature/gmsl-camera/pcie-gl26-gmsl-frame-grabber-card) - Jetson Xavierを搭載したもの。使ったことはない
* NVIDIA Orinなどに取り付けて使う方法
　　[SG8A-ORIN-GMSL2](https://sensing-world.com/h-pd-65.html?recommendFromPid=0&fromMid=898) - SensingTECH専用。8カメラまで取り付け可能。Gitもあり簡単に使用可能
* 直接接続
　　[NVIDIA Drive AGXシリーズ](https://www.nvidia.com/ja-jp/self-driving-cars/drive-platform/) - 説明不要。

　色々手段があるものの、短期的にはUSBで取り出すのがわかりやすい。……しかし、多くのカメラを接続する場合に、本当に安定して動作するのかはわからない。PCIeでの取り込みは安定するが、どうもこれらのボードが高くなる傾向にある(開発向けの少数しか出ないからだと思うが)。
　その点、[SG8A-ORIN-GMSL2](https://sensing-world.com/h-pd-65.html?recommendFromPid=0&fromMid=898)については、NVIDIA Orinを用意する必要がある(40万円ぐらい？)のと、それに搭載しているUbuntu(Linux)を操作する必要があり、かつSensingTECHのカメラのみとなるが、[ドキュメントが用意](https://github.com/SENSING-Technology/nvidia-jetson-camera-drivers)されていて使用難易度は低い。また、PPS信号によるカメラ間同期もできるので、割と環境構築はしやすいイメージがある。

:::note info
個人的には、Sensing TECHのボードがよかった
:::

## 映像が取れたその先に
　とりあえず何かしらの形で映像が取れたならば、プログラム上で受け渡し、処理を行えばよい。
　……自分の場合は、その環境構築だったので、その先の処理を説明するほど経験はないので、ここまでである。

　しかし、ここで終わると悲しいので、ちょっとだけ蛇足。Sensing TECHの他HWの紹介。回し者ではない。

 ### 映像を分岐したい場合
 　既に環境が出来上がっている場合に、「ケーブルを割り込みして途中のデータを見たい……」という場合がある。特に、カメラと自動運転などADAS-ECUの間を確認したい時。この場合は従来の回路のように、線をつなげばよいというわけではない。
  その場合には、[バイパス装置](https://sensing-world.com/h-col-152.html)を嚙ませると、うまくいく(かもしれない)。

### 映像を送り込みたい(HIL装置のようにECUに映像を送り込みたい)場合
　実写に乗せたカメラで色々データを取ってきた。さて、このデータを再生して、ECUにインジェクションすることによって、ECUテストを行いたい場合がある(と思う)。その場合は、その名の通り[インジェクションカード](https://sensing-world.com/h-col-151.html)があるので、これを使えば意図通りのことが行えるはずである。
(HIL Video Injection Reinjection Solutionなんて書いてあるので、このワードに敏感な人がいるのだろうか？)
　実際この製品単体では、カメラのインターフェースにカメラ映像のみを送り込む形式になってしまうので、例えばCAN通信や各種センサ値、車載Etherなどのリプレイも実装する必要がある。ただ、ここを読むような諸兄であれば、HIL装置との協調については、十分実装しうると思う。
　~~(仕事になるなら私もやりたいなとは思うけど……興味でもあればお問い合わせください)~~

本日はここまで。
【合格体験記】統計検定2級に約1ヶ月で受かった話

2025年5月7日、統計検定2級に75点で受かりました。
受かり立てホヤホヤの合格体験記なので、最近勉強されている方への参考とならば幸いです。

# 統計検定2級に合格するメリット
現所属企業（IT系・BtoB業界）での即効性はないがポテンシャルは感じました。

前提として、私が受験した目的は、データ分析をやるなら統計を勉強したほうが…という風潮を否定するためでした。
これは私の現在所属する会社がBtoBかつIT系なので統計的な処理を行うほどのデータ量が存在しないこと、
また企業全体として統計のリテラシーが低く※結局「よく分からない」という評価しか得られないと思ったためです。
が、この主張を統計を知らない人間がしても説得力がないので取ろうと思いました。

※プレゼン相手から「中央値って何？」と質問が出たり、ポートフォリオ分析に対して「平均値を象限の軸に取るのが違和感」といった疑問が出たりします

検証した結果ですが、
結果の解釈のうえで施策効果なのか偶然なのかが推定できるようになることはメリットに感じたため、前者の仮説は外れました。

一方、後者はより溝を感じました。
有意水準５％で母平均の差をT検定しただのカイ二乗分布による適合度検定だのはまず伝わらないので、結局「統計的にはこうなります」という説明になりそうです。
ただ、ここは啓蒙による改善余地はあるかもしれないので、メリットの評価としては即効性はないがポテンシャルはあるという結論です。

# 勉強スケジュールと振り返り
## 勉強スケジュール
2週間弱：統計の時間
2週間弱：前半はとけたろう様のYoutube動画を一巡、後半はとけたろう様の動画のターゲット問題を印刷して裏面に解法とポイントをまとめ
1週間強：毎日、とけたろう様の全知識動画を見る、ターゲット問題を見て解法を暗記カードのように復習、過去問を1回解く。過去問は2013年〜2015年、2017年の2回をやりました

## 振り返り
・正直、統計の時間は合わなかったのでさっさと「とけたろう」様の動画を見たほうが良かったです。
・とけたろう様の動画は非常に分かり易く、最低限理解すれば過去問を解き始めた時点で60点は取れました
・とけたろう様の動画は3年前のものですが、2025年時点でも現役でマスターすれば7,80点はいけます
・とけたろう様も言及されていますが、2017年から出題傾向が変わったようでそれ以前より難しく感じます
・CBT方式にクセがあり。残りの問題数が表示されますが大問単位で表示されるため、最後の方に大問1つにつき2つ小問がついてきたことでペースをミスって時間が足りなくなりました


最初の２週間は合わない勉強方法だったのですが、それを肌で感じながらもペースを崩して勝ちグセ・達成グセを崩すことが怖くて切り替えられなかったのは人間的な弱さの現れですね。
結果は良かったものの初動はイマイチだったので、他の方の血肉に・かつこじんて今後へ活かして行けたらと思います。
ABC212

# ABC212

https://atcoder.jp/contests/abc212

灰 灰 灰 茶 水 黃 黃 橙

## A - Alloy

`A == 0`と`B == 0`を下に条件分けするだけ
スペルミス注意問題

```cpp:ABC212_A
int A, B; cin >> A >> B;
if (A == 0) {
    cout << "Silver" << endl;
}
else {
    if (B == 0) 
        cout << "Gold" << endl;
    else 
        cout << "Alloy" << endl;
}
```

## B - Weak Password
弱いパターンが全部同じの10通りと階段状10通りの合わせて20通りしかないのでfor分で回した
9→0は`(i + 1) % 10`でうまくできる
またもやスペル注意

```cpp:ABC212_B
int X; cin >> X;
bool b = true;
for (int i = 0 ; i < 10; i++) {
    if (X == i * 1111) b = false;
    int j = (i + 1) % 10;
    int k = (j + 1) % 10;
    int l = (k + 1) % 10;
    if (X == i * 1000 + j * 100 + k * 10 + l) b = false;
}
if (b) 
    cout << "Strong" << endl;
else 
    cout << "Weak" << endl;
```

## C - Min Difference
vectorで値受け取ってソートかけて小さい方から順に尺取法？的な感じで小さい方を優先で増やしていく
どっちかが終われば終了
が、解説見た感じpair使って1つのリストでやったほうが早そう
まだ慣れてない感
`Min = min(Min, X);`の関数？？的なの早めに作りたい

```cpp:ABC212_C
int N, M; cin >> N >> M;
vector<int> A(N), B(M);
for (auto &x : A) cin >> x;
for (auto &x : B) cin >> x;

sort(all(A));
sort(all(B));

int i = 0, j = 0;
int Min = abs(A[i] - B[j]);
while (true) {
    if (A[i] < B[j]) {
        if (i + 1 < N) {
            i++;
        }
        else break;
    }
    else {
        if (j + 1 < M) {
            j++;
        }
        else break;
    }
    Min = min(Min, abs(A[i] - B[j]));
}

cout << Min << endl;
```

## D - Querying Multiset
よくあるクエリの処理を楽にするタイプの問題
Q=2の全てに足すのは個々に行うのではなく出力するときに合わせて足せばいい
なのでQ=1,Q=3をしてQ=3時にQ=2の合計値を足す
priorily_queueは大きい順なので符号反転して使用


しかしなぜかWR
翌々考えてみると途中でQ=1で追加された値はそれまでのQ=2の恩恵を受けることができない。
なのでQ=1時点でのQ=2の合計を引く必要があった。ので改善

```diff_cpp:ABC212_D
int64_t Q0; cin >> Q0;
priority_queue<int64_t> Q;
int64_t Sum = 0;
for (int q = 0; q < Q0; q++) {
    int query; cin >> query;
    if (query == 1) {
        int64_t X; cin >> X;
-        Q.push(-X);
+        Q.push(-(X - Sum));
    }
    if (query == 2) {
        int64_t X; cin >> X;
        Sum += X;
    }
    if (query == 3) {
        cout << Sum - Q.top() << endl;
        Q.pop();
    }
}
```

## まとめ

A-Dの茶ディフまで4問を解いた（5問目は水なので今回はなし
久々の割のちゃんとコーディングできたと思う
昔何処かで問題埋めするなら8問制になったABC212からがいいと聞いたのでここからやります
継続重視！
LeetCode #743. Network Delay Time | ダイクストラの問題

# 【LeetCode #743】Network Delay Time

## はじめに
GW 明けだったので仕事を早めに切り上げましたが，daily 解くのに手こずりました…．
そして！結構難しく感じたので，今日は daily ではなく類題の典型問題を取り上げようと思います！

## 問題概要
1 から n の n 個のノードが与えられて，ノード k から全ノードへ信号を送るとき，最も時間がかかるノードまでの最短到達時間を求める問題（到達不能なノードがあれば -1）

### 例
```plaintext
入力: times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
出力: 2
説明: ノード 4 までの最短経路が 2→3→4 で、合計時間は 2
```

### カテゴリ
**難易度：** medium
**タグ：** Depth-First Search，Breadth-First Search，Graph，Heap (Priority Queue)，Shortest Path

## 解法：ダイクストラ
この問題はダイクストラで解く典型ですね！
ダイクストラについてはまた別で解説しようと思うので，とりあえずこの記事では解いていきます！
今回，有向グラフが与えられるので u->v に対して重み w とするとき，graph[u] = [(v, w)] といった形でグラフの情報を保持し，ダイクストラに臨みます．
各ノードに対する k からの距離を格納するための配列を用意しておき，ダイクストラでは，あるノードと隣接するノードへの距離が，既存の距離のよりも短いものが見つかれば更新していきます．
コードとしては下記になります．
```python
from collections import defaultdict
import heapq
class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        graph = defaultdict(list)
        for u, v, w in times:
            graph[u].append((v, w))

        dist = [float('inf')] * (n+1)
        dist[k] = 0

        time_and_node = [(0, k)]

        while len(time_and_node):
            time, node = heapq.heappop(time_and_node)

            if time > dist[node]:
                continue
            
            for neighbor, weight in graph[node]:
                if dist[neighbor] > time + weight:
                    dist[neighbor] = time + weight
                    heapq.heappush(time_and_node, (dist[neighbor], neighbor))
        max_time = max(dist[1:])
        return max_time if max_time != float('inf') else -1
```

## まとめ
本日はダイクストラを用いる問題について取り上げました！
ちょっとあっさりした内容ですが楽しんでいただけたら幸いです．
またダイクストラ自体については別で取り上げようと思います！
さらに，今日のデイリー問題についても，ダイクストラが理解できていたらその応用で解けるので，近いうちに解説記事を書こうと思います！
ではまた〜！

## おまけ
TypeScript ではこうなります．
```typescript


function networkDelayTime(times: number[][], n: number, k: number): number {
    const graph = new Map<number, number[][]>();
    function pushToMap(key: number, value: number[]) {
        if (!graph.has(key)) {
            graph.set(key, []);
        }
        graph.get(key)!.push(value);
    }
    for (const t of times){
        pushToMap(t[0], [t[1], t[2]]);
    }

    const dist: number[] = Array(n+1).fill(Infinity);
    dist[k] = 0;


    const pq = new MinPriorityQueue<{ a: number, b: number }>(({a}) => a);
    pq.enqueue({a: 0, b: k});
    while (!pq.isEmpty()){
        const {a, b} = pq.dequeue();

        if (a > dist[b]){
            continue;
        }
        if (!graph.has(b)){
            continue;
        }
        const g = graph.get(b);
        for (const [nei, wei] of g){
            if (dist[nei] > a + wei){
                dist[nei] = a + wei;
                pq.enqueue({a: dist[nei], b: nei})
            }
        }
    }
    const maxVal = Math.max(...dist.slice(1));
    if (maxVal === Infinity){
        return -1;
    }
    return maxVal;
};
```
Git Flow 【共同開発】初心者向けガイド

## 1.自己紹介及び背景
・実務経験：なし
・プログラミング学習歴：約1年
・習得言語：HTML、CSS、JavaScript、TypeScript、React、Node.js、PHP、Laravel　等
・個人開発経験：ToDoアプリ、家計簿アプリ、天気予報アプリ　等

## 2.開発実装前に
・2-1 チーム開発の中心ブランチを作成※チーム次第
###### git checkout -b develop_【チームの共通名】
```
git branch -b develop_ashimo_team
```
###### ※このブランチに、以後各メンバーが開発したfeatureブランチがマージされていきます。
（最初はピンとこなくても、この記事を読み進めれば分かってきます！）

・2-2 自分の作業ブランチ（featureブランチ）を作成
*個別タスクを開発するためのfeatureブランチを作成
###### git checkout -b feature/feature/【名前】/【作業内容】
```
git checkout -b feature/ashimo/users_table
```
・2-3 現在のブランチ位置を確認
```
git branch
```
###### * 例：feature/ashimo/users_table と表示されていれば、そのブランチにいます。
・(2-3-2 ブランチの移動)
###### git checkout 【移動先ブランチ】
```
git checkout feature/ashino/users_posts
```
※ローカルに未コミットの変更があると移動できません。commitしてから移動しましょう。

## 3.初回PRまで(push)
・3-1 現在のブランチ位置確認(開発したブランチ位置にいることを確認)
```
git branch
```
・(3-1-2 ブランチの移動)
###### git checkout 【移動先ブランチ】
```
git checkout feature/ashino/users_table
```
###### ※ローカルに未コミットの変更があると移動できません。commitしてから移動しましょう。
・3-2 変更内容をステージング
```
git add .
```
・3-3 変更状態を確認(省略可)
```
git status
```
・3-4 ステージングをローカルリポジトリ(自分のpc上のリポジトリ)へコミット
###### git commit -m"【作業内容のコメント】"
```
git commit -m"usersテーブル作成完了"
```
・3-5 変更状態を確認(割愛可、空ならOK)
```
git status
```
・3-6 変更内容をリモートリポジトリ(共有のリポジトリ)へプッシュ
###### git push origin 【開発したブランチ】
```
git push origin feature/ashimo/users_table
```
###### ※3-6でリモートリポジトリへ登録後PRgithubからPRを作成しレビューを依頼

## 4.レビューで指摘をうけたら(再push)
・4-1 現在のブランチ確認(指摘を受けた同ブランチにいることを確認)
```
git branch
```
・4-2 指摘箇所を修正
・4-3 変更をステージング
```
git add .
```
・4-4 変更状態を確認(省略可)
```
git status
```
・4-5 ステージングをローカルリポジトリ(自分のpc上のリポジトリ)へ
###### git commit -m"【作業内容のコメント】"
```
git commit -m"usersテーブル作成　指摘箇所修正完了"
```
・ 4-6 変更内容をリモートリポジトリ(共有のリポジトリ)へ
###### git push origin 【開発したブランチ】
```
git push origin feature/ashimo/users_table
```
###### ※この再プッシュで、PRに自動的に差分が反映されます。

## 5.開発中心ブランチの最新化(pull)
*他のメンバーのPRがdevelopブランチにマージされた場合、自分の開発環境も最新状態に保つ必要があります。
・5-1 現在のブランチ確認(開発中心のブランチにいることを確認)
```
git branch
```
###### develop_ashino_team 等の返答が正常
・(5-1-2ブランチの移動)
###### git checkout 【移動先ブランチ】
```
git checkout develop_ashimo_team
```
###### ※未コミットの変更がある場合は、先にcommitしてください。
・5-2 最新の開発中心リモートリポジトリを開発中心ローカルリポジトリへ同期
###### git pull origin 【開発中心ブランチ】
```
git pull origin develop_ashimo_team
```
###### *このdevelopブランチから次の作業ブランチを作成しましょう。

## 6.開発中に他メンバーのタスクがマージされたら(merge)
###### 上記【5】の開発中心ブランチを最新化したのちにこの処理を行いましょう
*開発中のfeatureブランチに、他のメンバーの変更を取り込みたい場合に行う操作です。

・6-1 現在のブランチ確認
```
git branch
```
6-1-2 (6-1-2 ブランチの移動)
###### git checkout 【移動先ブランチ】
```
git checkout feature/ashimo/users_table
```
###### ※未コミットの変更がある場合は、先にcommitしてください。
6-2 現在の開発ブランチに最新ブランチを同期
###### git merge 【開発中心ブランチ】
```
git mergi develop_ashimo_team
```
###### もしコンフリクト（競合）が発生したら、エディタで内容を修正後、再度add→commitしましょう。

## 7.まとめ
チーム開発では、Gitのブランチ運用を理解しているかどうかが非常に重要です。
最初は混乱することもあるかもしれませんが、何度も使っていくうちに自然と身につきます。

本記事が、チーム開発におけるGit操作の理解に役立てば幸いです！
GitHubリポジトリ名を変更した際のローカル対応手順

# GitHubリポジトリ名を変更した際のローカル対応手順

## 概要
普段はGitHubのプライベートリポジトリで勉強用のソースコードを管理していますが、最近、誤った名称でリポジトリを作成してしまい、そのままローカルにクローンしてしまいました。

この記事では、**GitHub上のリポジトリ名を変更した後に、ローカル環境を対応させる方法**を紹介します。

## 手順
### 1. GitHubでリポジトリ名を修正する
1. 対象リポジトリのページを開く  
2. `Settings`タブを選択  
3. 「Repository name」に新しい名前を入力  
4. `Rename`ボタンを押す 

### 2. ローカルフォルダ名を変更する
```bash
mv 旧リポジトリ名 新リポジトリ名
```

### 3. リモートURLを新しいリポジトリ名に更新する
 ```bash
 cd 新しいリポジトリ名
 git remote set-url origin https://github.com/ユーザー名/新リポジトリ名.git
 ```
 
- git remoteコマンドは、ローカルリポジトリとGitHub上のリポジトリ（リモート）との接続情報を管理するコマンドです
- git remote set-url origin [新URL]で既存のリモートURLを新しいものに変更できます
- 新URLはGitHubの「Code」ボタンから取得できます
※手順1.でリポジトリ名を変更すると、GitHub上のURLも自動的に更新されます

### 4. 動作確認
```bash
git remote -v
```

- 表示されているリモート名とURLを確認できます
- 表示されているURLが新しいリポジトリ名を含んでいることを確認してください
CoreData周りのエラーに苦しんだ記録

:::note warn
警告
個人の備忘録なので
色々とっ散らかってるがあしからず
:::

## 前提情報
とあるiPhoneアプリの個人開発を開始した

その前段階として、Webクローリングして
ローカルにデータベースを作成する必要が出てきた
と言うわけで、現在デスクトップWebクローラーアプリを開発中

そこで起きたエラーについてのエントリー

## 発生したエラーとその対応

コードを書き終わって
実行した際に
@main
の箇所で
```
Thread 1: Fatal error: UnsafeRawBufferPointer with negative count
```
が発生

これは
属性の型とオプショナル設定の不一致
が原因

Optionalは属性には
Xcodeのxcdatamodeldの設定から
AttributeのOptionalにきちんとチェックを入れなければならない

「Editor」メニューから「Create NSManagedObject Subclass...」を実行して、クラスを再生成してから再ビルド

すると今度は
```
'『エンティティ名』' is ambiguous for type lookup in this context
```
となってしまう

そこで
NSManagedObjectサブクラスを自動生成せず、手動で実装することに

CoreDataモデルのエディタで
1. エンティティ名を変更
2. Identityインスペクタで「Module」欄に「『AppName』」を入力
3. また「Class」欄に「新エンティティ名」の明確な名前を設定
4. コード内のエンティティ名を新エンティティ名に変更

しかし、同じく
```
'『新エンティティ名』' is ambiguous for type lookup in this context
```
となる

## より根本的な対応
1. モジュール修飾名を使う
各ファイルで新エンティティ名の前にモジュール名を明示的に付ける

2. CoreDataモデルの再確認
xcdatamodeldファイルを開き
「Codegen」設定が「Manual/None」になっているか確認

↓
ようやく解決

## 最後に
CoreData周りはエラーが発生しやすい
エラーが発生したらEntityの設定を見直し
一つづつ解決していく
LaTeXで同値変形をきれいに書く

# 1. はじめに

```math
\begin{alignat}{3}
  &                      & x         &= 1 + 1       \\
  &                      &           &= 2           \\
  & \Leftrightarrow\quad & x + 2     &= 2 + 2       \\
  & 　　　　　　　　　　　　 & 　　　     &= 4           \\
  & \Leftrightarrow\quad & 3 (x + 2) &= 3 \times 4
\end{alignat}
```
こういう感じの同値変形をきれいに書きたかったのですが，LaTeXのことをあまり知らず苦戦したので共有します。これが一般的な方法なのか分かりませんが，参考になれば幸いです。

# 2. 結論
`alignat`環境を使えばよいです。

```latex
\begin{alignat}{3}
  &                      & x         &= 1 + 1       \\
  &                      &           &= 2           \\
  & \Leftrightarrow\quad & x + 2     &= 2 + 2       \\
  & 　　　　　　　　　　　　 & 　　　     &= 4           \\
  & \Leftrightarrow\quad & 3 (x + 2) &= 3 \times 4
  ⋮
\end{alignat}
```

## コピペ用テンプレート

```latex
\begin{alignat}{3}
  &                      & LHS  &= RHS \\
  & \Leftrightarrow\quad &      &=     \\
  & \Leftrightarrow\quad &      &=     \\
  & \Leftrightarrow\quad &      &=     
\end{alignat}
```

# 3. おわりに
もっとよい方法があるという方は教えていただけると幸いです。
UEFI Shellへ入れない！？Minisforum MS-01のBIOSアップデート

# はじめに
Minisforum MS-01の2025年5月時点の最新版BIOSはver. 1.26です。
アップデート手順はBIOSに同梱されていますが手順通りにできなかったので、実際に行った方法をまとめておきます。

# BIOSアップデートを行うべきか
一般的に安定動作しているなら無理にBIOSアップデートを行う必要はないとされます。しかしながら、Minisforum MS-01には長期間（数日）の稼働でクラッシュしてしまう報告があり、最新版（ver.1.26）では低減される報告があるためアップデートを行うことにしました。

https://forums.servethehome.com/index.php?threads/minisforum-ms-01-i9-13900h-96gb-with-proxmox.43380/

# ハマりどころと原因
MinisforumのBIOSアップデート方法はとても簡単で、ブータブルUSBメモリを作る必要すらありません。また、BIOSアップデート用データには手順書`0-HOW TO FLASH.txt`が同梱されています。

しかしながらBIOSのTop画面からUEFI Shellへ入ろうとすると、一瞬画面が暗転しTop画面に戻ってきてしまいアップデートできず詰まってしまうハマりポイントがあります。

参考サイトによると、ver.1.26にはUEFI（Unified Extensible Firmware Interface）シェルを起動するための実行ファイルが同梱されていないことが原因のようです。

# 手順
## BIOSアップデート用のUSBメモリの作成
1. USBメモリを `FAT32`でフォーマットしておきます。
2. MinisforumのサポートページのDownload → BIOS & Firmware → 「1.26V BIOS」の「↓Dowload」ボタンをクリックします。
   https://www.minisforum.cn/new/support?lang=en#/support/page/spec/108
3. ダウンロードした `MS-01-AHWSA-BIOS-1.26 (1).zip`を解凍し、`MS-01-AHWSA-1.26`フォルダの中身（13個のファイル）をUSBメモリ直下へコピーします。
4. UEFIシェルの実行ファイルを下記よりダウンロードします。
   https://github.com/tianocore/edk2/releases/download/edk2-stable202002/ShellBinPkg.zip

   このリポジトリは、TianoCoreプロジェクトという、UEFI準拠のファームウェアをApple、Intel、Red Hat などの企業や世界中の開発者が参加・開発しているオープンソースコミュニティです。
5. ダウンロードしたzipファイルを解凍し、 `ShellBinPkg/UefiShell/X64/Shell.efi` をUSBメモリ直下へコピーします。

## BIOSアップデート作業
1. マシン起動時にDelキーを連打しBIOS画面へアクセスする
2. 「Setup」 → Security → Secure Boot → Secure Boot → Disabledと選択し、セキュアブートを無効にします。
3. Save & Exit → Save Changes and Resetをクリックすると再起動するので、再度BIOS画面へ入り直します。
4. Top画面の「UEFI Shell」をクリックすると、起動用シーケンスが流れ、 `>Shell` が表示されたら成功です。
5. ここからは公式の手順通りです。以下のように入力します。
   ```
   # まずはUSBメモリの中身が見えるドライブを探します。
   # ファイルが表示されればそのドライブがUSBメモリです。
   FS0:
   ls
   # もし表示されないときは、FS1: → ls, FS2: → ls → ... と試してみてください。
   
   # アップデート実行
   # タブ補完も効きます
   AfuEfiFlash.nsh
   
   # ここから3分ほどアップデートの処理が行われます。自動的に再起動します。
   ```
6. 通常通り起動し直します。これで完了です。BIOS設定のリセットは不要でした。

# アップデート前後の確認
BIOSのバージョンはBIOSの画面でなくともLinux上から確認可能です。

```bash:確認用のコマンド
apt install -y dmidecode
dmidecode | grep -A3 "BIOS Information"
```

アップデート前は `1.17` でした。
```text:アップデート前
BIOS Information
        Vendor: American Megatrends International, LLC.
        Version: AHWSA.1.17
        Release Date: 12/14/2023
```

アップデート後は `1.26` になりました！
```text:アップデート後
BIOS Information
        Vendor: American Megatrends International, LLC.
        Version: 1.26
        Release Date: 10/14/2024
```

# まとめ
「UEFI Shellに入れない！？」とちょっと焦りましたが、先人の知恵のおかげで無事解決できました。同じことで詰まってしまった方の参考になれば幸いです。

# 参考情報
- [Minisforum MS-01 BIOS | ServeTheHome](https://forums.servethehome.com/index.php?threads/minisforum-ms-01-bios.43328/page-5)
splunk 覚書




https://docs.splunk.com/Documentation/Splunk/9.4.2/RESTUM/RESTusing


以下の記事でSplunk Cloud上でのREST API仕様について説明されています。

https://docs.splunk.com/Documentation/Splunk/9.4.2/RESTUM/RESTusing

Splun CloudでのREST APIの制約について

**Access requirements and limitations for the Splunk Cloud Platform REST API**
After you request access, you can use a limited subset of the Splunk Enterprise REST API endpoints with your Splunk Cloud Platform deployment.

**Accessing the Splunk Cloud Platform REST API**
You might need to take extra steps to access your Splunk Cloud Platform deployment using the Splunk REST API and SDKs. If necessary, you can get access with one of the following options:

Use the Admin Config Service (ACS) API search-api/ipallowlists endpoint to add IP addresses to the search-api allow list. For more information about the search-api/ipallowlists endpoint, see Configure IP allow lists for Splunk Cloud Platform.
Submit a support case requesting access using the Splunk Support Portal. Splunk Support opens port 8089 for REST access. You can specify a range of IP addresses to control who can access the REST API, so make sure your request includes the IP addresses or CIDR ranges that you want access from.

（以下のようにSplunk CloudのFreetrial版ではREST APIは利用できないみたいです。）
**_Free trial Splunk Cloud Platform accounts cannot access the REST API._**

After you get REST API access, create authentication tokens to use the REST APIs. Tokens are available for both native Splunk authentication and external authentication through either the LDAP or SAML schemes. To learn more about setting up authentication with tokens, see Set up authentication with tokens in the Securing Splunk Enterprise manual.

Use the following URL for Splunk Cloud Platform deployments:

https://<deployment-name>.splunkcloud.com:8089
#93　AWS CodeGuru Reviewerを使ってコードレビューをしてみる

# はじめに
ソフトウェア開発の中でコードレビューは、コードの品質を保つために欠かせないプロセスです。しかし、手動でのレビューは時間とリソースを大量に消費します。そこで登場するのが AWS CodeGuru Reviewer です。本記事では、CodeGuru Reviewerとは何か、そしてセットアップ手順を解説します。

# AWS CodeGuru Reviewerとは？
AWS CodeGuru Reviewerは、機械学習を利用してコードレビューを自動化するサービスです。CodeGuru Reviewerは、JavaやPythonのコードベースを分析し、コードのバグや非効率な部分を指摘します。また、セキュリティの脆弱性やベストプラクティスに従っていない箇所についてもアドバイスを提供してくれます。

# 主な機能
自動コードレビュー: 機械学習モデルを活用して、コードの問題点を自動で検出。
統合: GitHub、Bitbucket、AWS CodeCommitなどのリポジトリと統合が可能。

# AWS CodeGuru Reviewerのセットアップ手順
AWS CodeGuru Reviewerを使用するには、いくつかのステップを踏む必要があります。以下にその手順を解説します。

① CodeGuru Reviewerのサービスを有効化
AWS Management Consoleにログインし、CodeGuru Reviewerのサービスページに移動します。ここでサービスを有効化します。
<img alt='aws-codeguru-reviewer-1' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-1.png'>
<br>

② リポジトリの接続 
CodeGuru Reviewerは、GitHub、Bitbucket、またはAWS CodeCommitといったリポジトリと連携します。今回はGithubに接続してみます。AWS Management ConsoleでGitHubを選択し、リポジトリへのアクセス許可を与えます。

・ソースプロバイダーにGithubを設定
<img alt='aws-codeguru-reviewer-2' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-2.png'>
<br>

・Djangoで作ったアプリのDevelopブランチを設定
<img alt='aws-codeguru-reviewer-3' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-3.png'>
<br>

・リポジトリを関連付けて分析を実行
<img alt='aws-codeguru-reviewer-4' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-4.png'>
<br>

⑤ 分析の実行
設定が完了したら、設定したリポジトリのブランチにあるコードの分析を実行してみ見ます。ステータスがPendingからCompletedになるまで待ちます。
※コードレビューにかかる時間はコード量によりますが、今回は数分程度で分析が完了しました。
<img alt='aws-codeguru-reviewer-5' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-5.png'>
<br>

⑥ フィードバックの確認
CodeGuru Reviewerの分析結果は、GitHubやAWS Management Console上で確認できます。指摘された問題点を修正し、コードの品質を向上させていきましょう。

・レビュー結果
<img alt='aws-codeguru-reviewer-6' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-6.png'>
<br>

・該当コード
<img alt='aws-codeguru-reviewer-7' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-7.png'>
<br>

※ちなみに[増分コードレビュー]には対象のブランチに対するプルリクエストが行われると自動で検知しコードレビューを行ってくれます。

<img alt='aws-codeguru-reviewer-8' src='https://www.nxted.co.jp/blog/img/107/aws-codeguru-reviewer-8.png'>
<br>

# まとめ
AWS CodeGuru Reviewerは、コードレビューのプロセスを大幅に効率化し、開発者がより高品質なコードを作成する手助けをします。セットアップも比較的簡単で、GitHubやBitbucketなどのリポジトリと統合することで、すぐに利用を開始できます。自動化されたレビューを活用して、チーム全体の生産性を向上させてみてはいかがでしょうか。
Mid-360の自作ケーブル作成

# MID-360の自作ケーブルを作ってみた（備忘録）
#### 買ったもの
- LANの口（RJ45）
    - ぐっとすシリーズ モジュラパッチパネル用モジュール
    - https://www.monotaro.com/p/4103/3456/
- M12 Aコード
    - M12 A-codeケーブル側， M12ケーブルアセンブリ， Aコード， メス， ストレート， 2m， PVC(黒)
    - https://www.monotaro.com/g/04973160/

ピンアサインを以下を参照

https://x.com/79fde8b27d4f463/status/1866735136181719318

配色は上記のツイートと同じでよかった(2025/03/20現在)

今回買ったLANの口ははんだ付けがいらないタイプにした。
今回の口で、ケーブルの先を入れる部分で、該当する部分は全て、片側にあった。

LANに繋げたらいい感じに出力できたのでヨシ！！！！

![Screenshot 2025-05-07 at 23.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/9dd07f73-e7bb-402a-90d5-600df5024c01.png)
【React Testing Library】getByTextでテストをする際は完全一致でないとエラーになる件

## はじめに
React Testing Libraryを使ってReactのテストをしていた際、`getByText`の文字列の指定方法でハマってしまいました。
同じ事例を繰り返さないための備忘録として事象と原因を書いていきます。

## テストのコード
### テストの対象のコード
```react:App.tsx
function App() {
const [loading, setLoading] = useState(true);
/* 以下は今回実施したテストとは直接関係しないので省略 */

return (
    <>
      {loading && <p>now loading...</p>}
      {/* 以下は今回実施したテストとは直接関係しないので省略 */}
    </>
)
```

### テストを実施したコード
```typescript:AppComponent.spec.tsx
import { render, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
import App from "../App";

describe("テスト1", () => {
  test("ローディング画面が存在している", () => {
    render(<App />);
    expect(screen.getByText("loading")).toBeInTheDocument();
  });
});
```

テスト対象のコードには`<p>now loading...</p>`という記述があったので、`loading`という文字列も含まれていると思って上記のコードでテストを実施していた。
↓
テスト結果はFailedになった。
以下のようなエラーメッセージも出ていた。
>  Unable to find an element with the text: now loading. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

## 原因と対策
`getByText`で文字列を引数とする場合は**完全一致でないとTrueにならない。**

そのため`getByText`で特定の文字列を指定したい場合は以下の2つの方法が考えられる。

**①テストしたい文字列を完全一致するように指定する**
```
expect(screen.getByText("now loading...")).toBeInTheDocument();
```

**②正規表現を使って部分一致の条件を作る**
```
expect(screen.getByText(/loading/)).toBeInTheDocument();
```

## 最後に
下記の参考資料に
> 文字列の引数が完全一致であるのに対し、正規表現は部分一致となる

と書かれているため、資料を読み込んでいれば防げるミスでした。

皆さんは`getByText`を使うときは完全一致の文字列を指定することを心がけてくd


## 参考資料

https://qiita.com/ossan-engineer/items/4757d7457fafd44d2d2f

https://zenn.dev/panyoriokome/scraps/78aecf55ba5a38
AWSやGCPで高額請求されないための超簡単なCloudflare対策

# はじめに

自分はいくつかのサービスをCloud Runで運用しており、月3000円程度で済んでいた料金が突然1日にで5000円近い請求があり、そのまま放置していたら月に10万以上の請求になってました。AWSやGCPなどの従量課金では利用に応じて料金がかかってしまうため、外部からの攻撃によって莫大な費用がかかるケースがあります。Cloudflareの例を載せますが簡単なWAFがほとんどなので同じような設定はできると思います


<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/d6584283-b91d-4149-b285-05b7579f282c.png">


# Bot対策

これらは以下の画面で有効にするだけで設定可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/fc3c8a51-7b6f-4287-a453-d2484c9ffc12.png)

## Bot Fight Mode（ボットファイトモード）

botのトラフィックを検出し、悪質なボットによるアクセスを検知・排除するためのものです。これだけでも相当数のbot対策になります

https://developers.cloudflare.com/bots/get-started/bot-fight-mode/

## Block AI Bots

AIクローラー（人工知能が学習や解析に使うボット）からのアクセスをブロックするためのオプションです。OpenAIなどの生成AIがクロールするbotなどを排除してくれます

# WAF（Web Application Firewall）

## IPブロック

特定のIPをブロックする方法です。有害なbotを調べる簡単な方法として[Analytics]->[トップ統計]を見るとアクセスが多いIPを調べることが可能です。やばいときは中華botから40M（4000万）アクセスが24時間以内に来てました

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/51b4cfc6-8b5e-4dd0-bc24-c059a68181d0.png">

式は以下のように記載します

```
ip.src eq XXX.XXX.XXX.XXX
```

## 国ブロック

悪質なbotやサイバー攻撃が多い国などをブロックします。言わずもがなですが、以下の国は特に悪質なものが多いとされているため、必要がなければ問答無用でブロックしても良いと思います。

```
ip.geoip.country in {"CN" "RU" "KP" "IR"}
```

日本以外をブロック、JSチャレンジにしても良いですが、GooglebotなどのSEOに必要なbotも除外してしまうため注意が必要です

## JSチャレンジ

サイトにアクセスした際に以下のように人間か確認するチャレンジ画面が表示されます。アクセスが多いけど悪質なIPではない場合（特定のプロバイダなど）に設定すると良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/a8c22c78-3d89-42d6-932d-f1d0fa9cd9ed.png)

## ブラウザ キャッシュ

高額請求を防ぐためにキャッシュも有効です。これはアプリケーションに応じて設定すれば良いと思います。私のアプリは4時間で設定しています

# Under Attack Mode

サイトにアクセスする訪問者に JavaScript のチャレンジを表示します。全部これを表示します。SEOとかも気にしないし特定のリテラシーがあるユーザーのみ利用するアプリケーションであればこれを設定しても良いかもしれません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/a8c22c78-3d89-42d6-932d-f1d0fa9cd9ed.png)

# 最後に

ここまで基本的な設定をご紹介しましたが「自分のサービスは小規模だから攻撃なんかされないよな〜」とか思って油断して設定していなかったりすると自分のように痛い目に遭うので、サービスを公開する方は簡単なので設定してもらえると安全な開発ライフを過ごせるかと思います
Unslothがmacに対応していない？

# Unslothって何？
Unslothとは、LLMの再学習のコストを最小限にするフレームワークです。
今日では、LLMのパラメータ数は膨大になり個人のPCで0から学習を行い、LLMを作成することはほぼ不可能になっていると言っても過言ではないでしょう。そこで、RAG (Retrieval-Augmented Generation)のような再学習を行うことなく固有のタスクに対応する手法が生み出されているように思えます。
一方で、再学習のコストを下げる手法の研究も行われています。ここでは、個別具体的な手法については触れませんが、unslothでは再学習のコストを下げ一般ユーザーに再学習が利用できるような環境を提供してくれています。

つまり、Unslothは**お手軽LLM再学習フレームワーク**ということです。

# 使用に挑戦
先に紹介したuvの環境でunslothライブラリのインストールに挑戦します。コマンドは、unslothのREADMEにも書いてあります。
```zsh
uv add unsloth
Resolved 88 packages in 437ms
error: Distribution `bitsandbytes==0.45.5 @ registry+https://pypi.org/simple` can't be installed because it doesn't have a source distribution or wheel for the current platform

hint: You're on macOS (`macosx_15_0_arm64`), but `bitsandbytes` (v0.45.5) only has wheels for the following platforms: `manylinux_2_24_x86_64`, `win_amd64`
```

おや？？？
どうやら、macosx_armには対応しておらず、win_armまたはlinux_x86系でのみ実行が可能なようです。。。

# 解決策？
一応の解決策を妄想しておくこととします。
1. WindowsPCで実行
1. linux_x86系をエミュレートし実行
    * 問題点：エミュレートによる計算速度の遅延
    * そもそも、どんなエミュレータがあるか不明
1. unslothの対応を待つ
    * AppleのMシリーズは省電力かつ高速なメモリアクセスを実現しているため、unslothが対応してくれる可能性もないとは言い切れない。と思いたい。

# まとめ
流石に、unslothを使用したいので、desktop PCにubuntuをインストールし、環境を整えたいと思います。
毎日write up 2日目 Forbidden Paths

# 問題
### Description
Can you get the flag?
We know that the website files live in /usr/share/nginx/html/ and the flag is at /flag.txt but the website is filtering absolute file paths. Can you get past the filter to read the flag?
Additional details will be available after launching your challenge instance.
![スクリーンショット 2025-05-06 0.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853234/8e8c13a8-b002-4a06-b0e7-ff1235100abd.png)


どうやら絶対パスだとflagは取れないらしい(もはや答えでは？)


# 解法
試しに書いてあるdivine-comedy.txtを入れてReadボタンを押してみる
![スクリーンショット 2025-05-06 0.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853234/1e80cbd0-d52a-4422-b5c3-98f36da02c8e.png)
read.phpというパスに飛ばされて先程のdivine-comedy.txtらしきものが表示された。
どうやらphpのファイルで入力されたパスのファイルを取ってきているらしい
現在が/usr/share/nginx/html/らしいので、4つ戻った先にflag.txtはあるので、相対パスで../../../../flag.txtと入力すればflagが手に入る
AzureにDatabricksを爆速でデプロイする（TerraformによるIaC、PoC等気楽に環境を用意する）

# 目的
PoC等で、Azure Databricksを爆速でデプロイをするためのものである。

# Github
https://github.com/silverlining-yamashita/try-databricks-on-azure

# 備考
前提条件と事前準備が多いが、とりあえず動かすDatabricksを用意するための`Terraform`のコードです。
適時、自身の環境に読み替えて使ってみてください。
詳細は、上のGithubのリンク先のREADMEを参照してください。
車載カメラインターフェースGMSLとカメラと他

##この記事は、2025/05くらいの著者の持ちうる情報で書かれています。
##整理用なので、間違いなどがあればご指摘いただければ幸いです。

## 車載用カメラについて
　昨今、自動運転などでカメラが採用されている。有名なところでは、Teslaは全方位にカメラを使って自動運転を実現しているとのこと(カメラだけなので、絵を描いた壁を誤認識するとかの話題もある)。
　カメラと言えば、スマホやPCにもカメラが付いている。何ならPC用にUSBカメラがあるのだから、それで自動運転をすればいいじゃないか、という人もいる。Amazonを見れば4Kを謳っているから、高性能だろう、と。しかし当然そうはいかない現実がある(まあAmazonの4Kは、ね？)。

 　この記事では、その中でよくGMSLというキーワードが出てくる。特にGMSL2であるが、これについて色々書き連ねておく。

  ## 自動運転に求められるカメラとは
  　正味、カメラの性能(画質やフレームレートなど)は、個々開発メーカーの設計思想に基づく部分があって、これが王道だ！　というものはない。
+ A社は、`4Kカメラ 60FPS * 8台` を選択している
+ B社は、`3Kカメラ 10FPS * 6台` を選択している
+ C社は、`4Kカメラ 30FPS * 12台` を選択している

　数字は適当にぼやかしているが、どれも思想が異なっているので、どの選択も間違ってるとは言えない。ただし、どのケースであっても、『データを取る以上は、そのデータを適切に使う必要がある』ということが共通している。
 　要は、``高性能``で``高FPS``で``多台数``のカメラを使った場合、それを処理できる機器が存在しなければならない。しかも、
+ 処理機器は、広帯域で高速な機器
　→ 高コスト、熱問題、車載耐震性などに対応必要
+ 開発中はデータを記録して、後で処理
　→ 高速SSD必要、記憶領域必要
+ データを圧縮or間引けばよい
　→ GPU熱・電源、映像同期問題、フレーム落ち問題

　などと挙げれば無限に問題が出てくるので、カメラの性能は検討しておく必要がある。
　例えば`映像の処理スピード`や、`アルゴリズム設計`、`AI認識処理の時間`など。

:::note warn
カメラ性能は、多めに見積もるのではなく、必要最低限に
:::
　それはそうとして、なぜUSBカメラのようなものではなく、GMSLなどのカメラを使うのか？　は、ざっくり言えば以下である。
+ 伝送速度 : GMSL2なら6Gbps。
　現代USB/Ethernetからするとそんなに早くはないが、組み込み用途と考えると早い
+ 通信方式 : シリアル通信(SerDes)
　「パラレルで同時に送ったほうがいいのでは？」という意見も聞くが、
     + 配線数が多くなる
     　車両に通すと、シリアル通信の数倍必要になり、コストアップ
     + 配線が長いと、パラレルケーブルのそれぞれにノイズや遅延が発生
     　Skewという。これでデータが来るタイミングがまちまちになり、同期が困難になる
+ ケーブル : 同軸またはSTP(シールドツイストペア)
 長距離でも堅牢であり、20m程度まで使用が見込める
 しかも電源も一緒に乗るので、このケーブルだけでよい

　「でもUSBでいいじゃない？」という人がいますが、`USBは距離が短く(最大数m)、プロトコルが異なり、リアルタイム性に欠ける`ため実用には耐えません。いや、趣味程度ならいいんでしょうけど……

:::note warn
専用のGMSL規格は、専用通信で早く、安く、うまい
:::

## で、どんなカメラがあるの？
　世界を見渡せばたくさんあるが、私が使っていた/多分使いやすい/多分入手しやすいカメラは、以下3メーカーで、2880x1860の解像度を持つSONY IMX490センサを使用したカメラをピックアップして紹介。
 ※ここで紹介するカメラは、ISPあり。要はシャッタースピードやホワイトバランスを調整してくれるので、GMSL2で接続すればすぐ使えるようなカメラ。これがないと色々大変。
 
[ティアフォー](https://www.paltek.co.jp/solution/tier4/index.html) ※別会社リンク
　~~TierIVのサイト直接見たいけどなんでこんなに見にくいの？~~
　日本のベンチャー発の会社。なんかすごそう。カメラはAmazonで買うことができる。
　[C2-120](https://amzn.asia/d/aebsogM)

[Leopard Imaging](https://leopardimaging.com/)
　アメリカの会社。製造やサポートは中国。
　[LI-IMX490-GW5400-GMSL2-120H](https://leopardimaging.com/product/automotive-cameras/cameras-by-interface/maxim-gmsl-2-cameras/li-imx490-gw5400-gmsl2/li-imx490-gw5400-gmsl2-120h/)

[Sensing TECH](https://sensing-world.com/index.jsp)
　中国の会社。独自製品多くてよいかも。
　[SG5-IMX490C-5300-GMSL2](https://www.sensing-world.com/en/h-pd-24.html?recommendFromPid=0&fromMid=1544)

　どの会社を使うかは一長一短あるのでなんとも言えないが、カメラ映像を受ける機器次第かな、と私は感じる。日本製で入手楽でUSBでささっと使いたいならTierIV、コストを安くならLeopard Imaging、色々変なことをやりたいならSensing TECH。だと思う。

:::note info
色々メリットを検証して選定しましょう
:::


　この記事を見て、「お、なら買ってとりあえずカメラを動かしてみたい！」と思った場合、受像するための機器が必要です。
　この続きは後で書きますが、先に結論を言うと
 * x86_64マシンで映像を受ける場合、PCIeカードが必要です(割と高い - 100万円ぐらい)
 * Aarch64マシン(NVIDIA Orin)で映像を受ける場合、とりあえずLeopard ImagingとSensing TECHは専用のボードがあり安いです(数万円)

　なので、ここらへんも視野に入れましょう。

 本日はここまで。
✅ macOS上でArduino IDEの python 関連ビルドエラーを解決する方法（2025年版）

🧩 問題の概要

macOS Monterey以降では /usr/bin/python が削除されており、Arduino IDEや一部ボードパッケージ（例：Seeeduino XIAO nRF52）が python コマンドの存在を前提にしているため、ビルド時に以下のようなエラーが発生：

xcode-select: Failed to locate 'python', requesting installation of command line developer tools.
exit status 72


⸻

✅ 解決策（再現性あり・安全）

① Command Line Tools にある python3 を python としてリンクする

sudo ln -s /Library/Developer/CommandLineTools/usr/bin/python3 /Library/Developer/CommandLineTools/usr/bin/python

理由：
Arduino IDE がビルド中に python を直接呼び出す構成になっており、macOS Monterey以降では /usr/bin/python が存在しないため、代わりに Command Line Tools 内の python3 を python として見せかける必要がある。

⸻

② adafruit-nrfutil 実行権限エラーの対処

chmod +x ~/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.10/tools/adafruit-nrfutil/macos/adafruit-nrfutil

理由：
ボードパッケージに含まれる adafruit-nrfutil 実行ファイルが、インストール直後は実行権限がついていないため、書き込み工程で permission denied が発生する。

⸻

✅ 以上の2つでビルド成功！

この2点の対処だけで、macOS (Apple Silicon対応含む) 上の Arduino IDE でのビルドエラーが解消されます。

⸻

📌 備考
	•	launchctl や shebang の修正などの試行錯誤は不要（今回は機能しなかった）
	•	上記シンボリックリンクは安全な Command Line Tools 領域内で完結しているため、SIP無効化などは不要
	•	Arduino IDE をターミナルから起動する必要もなし（この方法であれば GUI 起動でもOK）

⸻