OmniAICreator/Qiita-1.07M huggingface dataset:
Apple silicon Mac の CLion + クロスコンパイラで、"オプション-archは無い" と言われた話

## Toolchainにクロスコンパイラを設定したが、CMakeのチェックが通らない！

AppleシリコンMac上のCLionで, Setting->Build execution, debug->Toolchain にarm-none-eabi-gccを登録するとCMakeのチェックが自動で走る。


しかしこのチェック、クロスコンパイラを指定しても、なぜかapplieシリコン用コンパイラで使われる"-arch"というオプションが使われてしまう。arm-none-eabi-gccには"-arch"というオプションがないのでエラーになる。

そこで、どうするか。

## まず正しいコンパイラを取ってくる。

```shell
brew install arm-none-eabi-gcc
```
とかで取ってくると、includeファイル等が含まれないバイナリだけインストールされる。インストールはこちら。

```shell
brew install --cask gcc-arm-embedded
```

間違ってインストールしてしまっていたら、
```shell
brew uninstall arm-none-eabi-gcc
brew autoremove
```
等でアンインストールしておく。


## Setting->Build execution, debug->Toolchain ... ではない。

このページでコンパイラを指定すると、直後にCMakeのチェックが自動で走る。arm-none-eabi-gccを設定してもなぜかAppleシリコン用の-archオプションが設定されるのでエラーが発生す(ここのチェックがどのcmakefile.txtから行われるかは追い切れなかった)。


Vsicual StudioやHEWに慣れていると、ここでクロスコンパイラを指定したくなる。CLionはここではクロスコンパイラを指定せず、母艦用コンパイラのみを設定するようにうにする。


クロスコンパイラの指定は、プロジェクトのCMakefile.txtで行う。


## CubeMXが生成するCMakefile.txtを確認する。

CubeMXのような組み込み用cmake生成ツールで作成されたCMakefile.txtには、arm-none-eabi-gcc等のクロスコンパイラの設定が入っているので確認する。クロスコンパイラまでのパスが通っていることも確認する。確認は

```shell
which arm-none-eabi-gcc
```
で行える。

## CMakeの引数の設定で、Appleシリコン用のコンパイルオプションを回避する。

この時点でTools->CMake->Reset Cache and Reload Projedectを選択すると、CMakeの事前チェックが走る。このときはルートのCMakefile.txtと、Setting->Build execution, debug->CMakeで指定した実行環境が使用される。何もしないと、ここでも事前チェックで-archが設定されてしまい、エラーで終わる。

これを避けるには、CMakeのコマンドラインオプションに-archのチェックをさせないオプションを指定する。 Setting->Build execution,debug->CMake のCMkaeオプションに

```
-DCMAKE_SYSTEM_NAME=Generic
```
を指定する。何も記入されていないときにデフォルトのオプションがグレーで表示されているが、かまわずこれだけを記入すると、グレーで書かれていたオプションに追加となる。これで-archのオプションが指定されなくなる。

この指定はCMakefile.txtの冒頭でsetコマンドにて指定することも可能だが、これだとなぜか事前チェックが通らないので引数で指定するのがよかった。

またtoolchain.cmakeを用意して、その中のsetコマンドで上記を指定 -> コマンドラインオプションでtoolchainを指定でも回避できるが、どのみちコマンドラインオプションを指定しなければならないので、新たにファイルを用意するよりはcmakeの引数で設定するほうがスマートだと思う。
マージソートについて調べてみた

## はじめに
　大学の授業でマージソートについて習ったので、自分自身の理解を深める目的で、最低限の情報だけ記事にまとめてみました。

## 操作
　配列を半分に分割していき、要素が１つになった段階で、小さい順に結合していくことでソートを行います。

### 可視化
　結合部分を可視化してみました。

![merge_sort_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/e66dcff1-ac67-4b2d-9692-ccffd2bc453d.gif)

## 計算量
各段階でマージする際、それぞれO(n)の計算が行われます。ソートするために何段階必要かは、何回半分にすれば要素数がnから１になるかを考えればいいので、

$$2^x = n$$

となるようなx。つまり定義からlognが分割回数です。したがって、logn回O(n)の計算をするので計算量はO(nlogn)になります。

## 安定ソート
結合の際、`left`と`right`の値が同じ場合は`left`から値を取るようにすれば、左右で同じ大きさの値が入れ替わることはありません。よって安定ソートです。
 
## 内部ソートではない
比較しながら結合する際に、別の領域を確保するため、内部ソートではありません。

## コード
pythonで書くと、こんな感じになります。
```python
def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result

# 使用例
print(merge_sort([5, 2, 9, 1, 3, 6]))
```

## 総評

### 強み
- 安定して高速
- 安定ソート
### 弱み
- 内部ソートではない

→　メモリは気にしなくて良い場面で、大量のデータかつ順序が重要な場合に適正あり

## 最後に
　ここまで読んで下さりありがとうございました。matplotlibで可視化したので、再帰を使わずに頑張ってやりましたが、クイックソートみたいにpygameでやればよかったと後悔しています。記事の内容は薄いですが、可視化のために結構時間を浪費してしまった感じがします。
React × Laravelで簡単なWebアプリを作成する#1（環境構築編）

# はじめに
弊社ではWebアプリを開発する際によくReactとLaravelを使用します。プログラミング初学者の方でもReactを触る機会はあるかもしれませんが、今からLaravelで開発してみようという方は少ないのではないかなと思います。

良い機会ですので今回はReactとLaravelを使った簡単なWebアプリを題材に
・Laravelの環境構築
・Reactの導入
・テーブルの作成
・APIの作成
・画面の作成
を一連の流れでご紹介できればと思います。
初回は「Laravelの環境構築」についてご説明します。

# 前提条件
今回の環境構築ではDockerを使用するので事前にDocker Desktopをインストールしておいてください。

# 環境構築
## 前置き
Dockerで環境構築と聞くと急に難易度が上がったように感じるかもしれません。ですが、有難いことにLaravelには公式が提供している「Laravel Sail」という軽量な開発環境があります。こちらを使えばなんとコマンド1つで環境構築が可能です。
今回はこちらのLaravel Sailを使ってサクッと環境を構築したいと思います。

## プロジェクトの作成
まずはプロジェクトを作成します。先ほどお話しした「コマンド1つで環境構築が可能」の部分になります。手順はとてもシンプルで以下のコマンドを実行するだけです。`example-app`の部分はお好みのプロジェクト名に変更して実行してください。

```
$ curl -s "https://laravel.build/example-app" | bash
```

コマンドの実行後、しばらく待つと以下のメッセージが表示されます。ここではPCのログイン時に使用するパスワードを入力してください。

```
Please provide your password so we can make some final adjustments to your application's permissions.
```

パスワードの入力後、こちらのメッセージが表示されたらプロジェクトの作成は完了です。後ほど使用するのでターミナルは開いたままにしておきましょう。

```
Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up
```

## .envファイルの書き換え
LaravelではMySQLやRedisなどの設定に必要な値は基本的に.envファイルに書かれています。デフォルトで値が設定されているので、この時点で画面へのアクセスは可能な状態となっており、MySQLやRedisなどの設定も一通り完了しています。このまま開発を始めることもできますが、今回は言語設定などを含め何点か変更を加えたいと思います。

まずはAPP_LOCALEの変更です。一番わかりやすい使用箇所だとHTMLの言語設定（`<html lang="ja">`）で使用されています。こちらを日本語に変更します。

```
APP_LOCALE=ja
```

次にAPP_FAKER_LOCALEも変更します。Laravelではデータベースに追加するダミーデータを簡単に用意することができます。その際に使用する言語をこちらで指定します。こちらも日本語に変更します。

```
APP_FAKER_LOCALE=ja_JP
```

最後にSESSION_DRIVERを変更します。こちらはセッション情報の保存先を指定する環境変数です。初期値の`database`でも特に問題はありませんが、私はよく`redis`を使用するのでこちらに変更しておきます。

```
SESSION_DRIVER=redis
```

## app.phpファイルの書き換え
Laravelでは環境変数を`/config`配下のファイルを介して取得します。app.phpもその1つになります。.envファイルの書き換えで大体の言語設定の変更は完了していますが、タイムゾーンはUTC（協定世界時）となっているため、`Asia/Tokyo`に変更しておきます

```
'timezone' => 'Asia/Tokyo',
```

## 画面へのアクセス
ここまでで一通りの作業は完了です。以下のコマンドを実行後に[http://localhost/](http://localhost/)へアクセスしてみてください。

```
$ cd example-app
$ ./vendor/bin/sail up -d
```

このような画面が表示されたら完了構築は完了です。お疲れ様でした。

![環境構築.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960367/8edb19eb-ffdc-4266-9c33-c0b06199cc13.png)

画面へアクセスした際に以下のようなエラーが発生した方がいらっしゃるかもしれません。その方はおそらく.envが`SESSION_DRIVER=database`のままになっていると思います。

```
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist (Connection: mysql, SQL: select * from `sessions` where `id` = lV7e8a9qU5zDRh8H2QY6TLSndukxj78fWjL5c680 limit 1)
```

エラーが発生する流れとしては
1．セッション情報をsessionsテーブルから取得しようとする
2．sessionsテーブルが存在しない
3．エラーが発生
となっているのでsessionsテーブルを作成してください。

# まとめ
今回はLaravel Sailを使用してLaravelの環境構築を行いました。想像していたよりも簡単に環境構築ができたのではないかと思います。次回は今回作成したLaravelのプロジェクトにReactを導入していきたいと思います。
5Gのシーケンスをいい感じに図にしてくれるやつ

# これは何？
- [5g-trace-visualizer](https://github.com/telekom/5g-trace-visualizer?tab=readme-ov-file)という、`pcap`を放り込むといい感じに5Gのシーケンス図を作ってくれるやつを使ってみた
# 前提条件
- ハード：MacBook Pro(Apple M2 Max)
- OS：OS X(Sequoia 15.5)
- Java環境
- `plantuml.jar`(後述)
- Wireshark
# セットアップ
- `git clone`
- `cd 5g-trace-visualizer`
- `curl -L -o plantuml-jar-asl-1.2019.12.zip "http://sourceforge.net/projects/plantuml/files/plantuml-jar-asl-1.2019.12.zip/download"`
    - `plantuml.jar`というやつのインストール
- `unzip plantuml-jar-asl-1.2019.12.zip`
- この後は必要なPythonモジュールのインストール
- 私の場合はホストのPython環境が終わっているので、適当に仮想環境作って使いました
- `pip install --no-deps lxml`
- `pip install pyyaml packaging plotly pandas numpy`
# テスト
- `python3 trace_visualizer.py -wireshark "OS" ./doc/free5gc.pcap`
みたいなのをやると、こんな感じの図がSVGで出てくるので、ブラウザとかに貼り付ける
![スクリーンショット 2025-06-23 13.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532897/58af270c-75ab-4c11-9dd0-673f5d8b2ad4.png)
- 詳しい使い方はまだよくわかってないけど便利そう
- おしまい
【Windows11】Dockerでデータサイエンス100本ノック環境を構築する完全ガイド


## はじめに
SQLの学習のために、**「データサイエンス100本ノック（構造化データ加工編）」**を教材として使用しました。
最初のDockerでの環境構築で躓いたので、備忘録として残します。

## 前提条件

- Windows11
- 管理者権限でのコマンド実行が可能
- インターネット接続

## 手順1: 必要なソフトウェアのインストール

### Git のインストール

1. [Git公式サイト](https://git-scm.com/download/win)からWindows版をダウンロード
2. インストーラーを実行し、デフォルト設定でインストール

### Docker Desktop のインストール

1. [Docker Desktop公式サイト](https://www.docker.com/products/docker-desktop/)にアクセス
2. **「Windows版のダウンロード - AMD64」**を選択
   - 一般的なIntelやAMDのCPUの場合はAMD64版を選択
   - ARM64版はSurface Pro XなどのARM系プロセッサー向け
3. インストール完了後、**必ずWindowsを再起動**

## 手順2: リポジトリのクローン

PowerShellまたはコマンドプロンプトを開き、以下を実行：

```bash
git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess.git
cd 100knocks-preprocess
```

## 手順3: Docker環境の起動

```bash
docker-compose up -d --build
```

## よくあるトラブルと解決方法

### トラブル1: `docker info`が応答しない

**症状**: `docker info`コマンドが長時間応答しない

**解決方法**:
1. Docker Desktopを完全に停止・再起動
2. WSL2の再起動
```bash
wsl --shutdown
```
3. Docker Desktopを再起動

### トラブル2: WSL distroエラー

**症状**: "WSL distro terminated abruptly"エラーが表示される

**解決方法**:
1. WSLの登録を解除
```bash
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
```
2. Docker Desktopを再起動
3. 自動的に新しいWSL環境が作成される

### トラブル3: docker-composeが完了しない

**症状**: `docker-compose up`が長時間応答しない

**解決方法**:
1. Ctrl+Cで中止
2. クリーンアップを実行
```bash
docker-compose down
docker system prune -f
```
3. 再度実行
```bash
docker-compose up --build
```

### トラブル4: Windows機能の確認

**必要な機能が有効になっているか確認**:
1. Windows+R → `optionalfeatures`
2. 以下にチェックが入っているか確認：
   - ✅ Linux用Windowsサブシステム
   - ✅ 仮想マシンプラットフォーム

## 手順4: 環境の確認

### Docker環境の確認

```bash
# コンテナの起動状況を確認
docker ps

# WSLの状況を確認
wsl --list --verbose
```

正常に起動していれば以下が表示されます：
```
NAME              STATE           VERSION
* docker-desktop    Running         2
```

### Jupyter Notebookへのアクセス

ブラウザで以下にアクセス：
```
http://localhost:8888
```

## データサイエンス100本ノックを始める


## 実践例: 最初の問題を解いてみる

### S-001: レシート明細データの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4120791/f068e517-6c09-4b05-8765-0a317ad8fce6.png)
SQL文を記入し、Shift+Enterで実行
```sql
%%sql
SELECT * FROM receipt LIMIT 10;
```

## まとめ

Docker環境でのデータサイエンス100本ノック構築は、初期設定で躓くことがありますが、一度構築できれば：

- **再現性の高い環境**で学習できる
- **実務に近い環境**で練習できる

という大きなメリットがあります。

トラブルに遭遇した場合は、本記事の解決方法を参考に、一つずつ確認していけば必ず解決できます。データサイエンス学習の第一歩として、ぜひ挑戦してみてください！

## 参考リンク

- [データサイエンス100本ノック公式リポジトリ](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)
- [Docker Desktop公式サイト](https://www.docker.com/products/docker-desktop/)
- [Git公式サイト](https://git-scm.com/)

---

この記事が皆さんのデータサイエンス学習の助けになれば幸いです！
質問や改善点があれば、コメントでお知らせください。
ペネトレーションテストから見えた(内部)Webアプリケーションに潜むリスク

:::note info
今更ですが当時参加したことを思い出しながら投稿します
:::

# ペネトレーションテストから見えた「内部Webアプリケーションに潜むリスク」

GMOサイバーセキュリティ byイエラエの安⾥眞夢（[@greenapple_w](https://x.com/greenapple_w)）さんによる、**内部ペネトレーションテスト（内部PT）で実際に見えたWebアプリケーションの脆弱性とその影響**についての講演内容を、テックブログ向けにまとめました。

---

## 🔍 内部PTで見えてきた「悪用できるWeb脆弱性」とは？

ペンテストのゴールを達成するために“使える”Web脆弱性にはいくつかのタイプがあります。

### ✅ 悪用しやすい脆弱性（内部PT向き）
- 認証機能やアクセス制御の不備
- ディレクトリトラバーサル / LFI / RFI
- OSコマンドインジェクション
- XXE など

→ 挙動や構成からある程度“見えてくる”タイプで、ブラックボックス状態でも推測・悪用が可能。

### ⚠️ 悪用しにくい脆弱性（Red Team系以外ではあまり使わない）
- XSS
- CSRF
- オープンリダイレクト
- セッション固定攻撃

→ ユーザの操作を必要とするため、内部PTでは出番が少ない。

### 🔧 慎重を要する脆弱性
- SQLインジェクション
- Insecure Deserialization

→ 影響が大きく、アプリケーション理解や十分な検証が必要。

---

## 🧪 実例①：Tomcatの設定ミスから管理DBに到達

### シナリオ概要
- **対象範囲**：社内NW上の業務Webアプリケーション
- **発見**：URLのルートパスからTomcatデフォルト画面を発見
- **悪用**：デフォルトの認証情報でTomcat Managerにログイン成功  
→ Cookieセッションを奪い、管理者としてシステムにアクセス可能に

### 結果
- 任意ユーザのセッションを奪取し、管理DBへのアクセスに成功

---

## 🧪 実例②：認証の不備 × AD管理の緩さで重要ファイル奪取

### シナリオ概要
- **AD認証のある社内Webアプリ**をBurpで観察
- SIDを書き換えた2段目リクエストを送ると、**管理者相当のCookie**が降ってきた

### 結果
- ファイルサーバ上の全ファイル閲覧権限を獲得
- 管理者アカウントの平文パスワードを取得

---

## 🧪 実例③：ディレクトリトラバーサル＋SMBリレーでドメイン管理者に

### シナリオ概要
- Web製品の管理UIから、パスの書き換えで任意ディレクトリをDL（ディレクトリトラバーサル）
- SMB経由で `\\DC.local\C$\Users\Administrator\Desktop\` などへアクセス成功
- SMB署名が無効なサーバを特定 → SMBリレー攻撃が可能に

### 結果
- **Responderを用いてNTLMv2ハッシュを取得**
- ハッシュクラックに成功 → ドメイン管理者のパスワードを奪取！

※この脆弱性は調整を経て**CVE-2023-49108**として公開済。

---

## 🧩 まとめ：WebアプリとAD運用の「組み合わせ」が危ない

以下のような条件が重なると、**予想外の権限奪取が可能**になります。

- 脆弱なWebアプリ（アクセス制御・入力検証の不備）
- 運用上の認証設計ミス（ADとの連携、デフォルトパスワード）
- SMB署名の無効化など、構成上の盲点

> 小さなほころびが、最終的にドメイン管理者の奪取につながることもある。

---

## 💬 最後に

ペネトレーションテストは単に脆弱性を見つける作業ではなく、 **システム間のつながり・運用のクセ・現場の“想定外”** を突くプロセスでもあります。

内部アプリのセキュリティを見直す際は、 **「このアプリ単体ではなく、ADやファイルサーバとどうつながっているか？」** に目を向けてみるといいかもしれません。
Geminiでコアラと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでコアラと遊ぶ魔法少女を描いてみました。

# 実装

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

```
電撃のコアラと遊ぶ魔法少女を描いてください。
```

![電撃のコアラと遊ぶ魔法少女_20250623.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ac63799c-9f65-4c00-b243-f400c49d9544.png)

# まとめ

可愛い。何かの役に立てばと。
M4 Mac (Apple Silicon)でのOpenBoardViewビルド成功報告 (`build.sh`修正とコード署名対応)

M4チップを搭載した Apple Silicon Mac mini上で、OpenBoardView を無事ビルドし、起動できたことをご報告いたします。この成功には、`build.sh`スクリプトへの小さな修正と、macOSのコード署名への対応が必要でした。同様の環境でOpenBoardViewの利用を検討されている方々、または今後のビルドプロセス改善の一助となれば幸いです。

---

### 私のシステム環境:

* **モデル名:** Mac mini
* **モデル識別子:** Mac16,10
* **モデル番号:** MU9D3J/A
* **チップ:** Apple M4
* **コアの総数:** 10 (高性能コア 4, 高効率コア 6)
* **メモリ:** 16 GB
* **システムバージョン:** macOS 15.5 (24F74)

---

### 遭遇した問題（初回ビルド失敗時）:

READMEに従ってリポジトリをクローンし、`./build.sh`を実行したところ、ビルドプロセスはリンク段階で`Undefined symbols for architecture x86_64`エラーにより失敗しました。これは、私のシステムが`arm64`であるにもかかわらず、ビルドプロセスが`x86_64`（またはUniversal 2）バイナリの作成を試み、Homebrew経由でインストールされた`arm64`ライブラリ（例: `libSDL2.dylib`）との不一致が生じたことを示していました。

最初の`build.sh`の出力に関連する、ターゲットアーキテクチャを示す行は以下の通りでした:

Extra flags passed to CMake: -DCMAKE_INSTALL_PREFIX= -DCMAKE_OSX_ARCHITECTURES=arm64;x86_64


---

### 解決策（`build.sh`の修正とコード署名）:

この問題を解決するため、`build.sh`スクリプトに重要ながらも小さな変更を加えました:

1.  **`build.sh`の修正:**
    `build.sh`を開き、`CMAKE_OSX_ARCHITECTURES`を設定している行を変更しました。

    **元の行:**
    ```bash
    if [[ "$(uname -a)" == *"arm64"* ]]; then
      COMPILEFLAGS="$COMPILEFLAGS -DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"
    fi
    ```

    **修正後の行（`arm64`のみをターゲットとするため）:**
    ```bash
    if [[ "$(uname -a)" == *"arm64"* ]]; then
      COMPILEFLAGS="$COMPILEFLAGS -DCMAKE_OSX_ARCHITECTURES=arm64"
    fi
    ```
    これにより、Apple Silicon Macでは`arm64`アーキテクチャのみがターゲットとなり、`x86_64`依存関係との競合を防ぎます。

2.  **`build.sh`の再実行:**
    この修正後、`./build.sh`はコンパイルおよびリンクに関して問題なく完了しました。出力は`Extra flags passed to CMake: -DCMAKE_INSTALL_PREFIX= -DCMAKE_OSX_ARCHITECTURES=arm64`であることを確認できました。

3.  **コード署名の無効性への対応:**
    新しくビルドされた`openboardview.app`を実行しようとしたところ、`SIGKILL (Code Signature Invalid)`エラーによりすぐにクラッシュしました。これはクラッシュレポートに示されている通りです。
    ```
    Exception Type:        EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid))
    Termination Reason:    Namespace CODESIGNING, Code 2 Invalid Page
    ```
    これは、最近のmacOSバージョンにおけるSystem Integrity Protection (SIP) およびGatekeeperにより、自己ビルドされたアプリケーションでよく見られる問題です。

    これを修正するため、アプリケーションにアドホックコード署名を適用しました:
    ```bash
    codesign --force --deep --sign - ./openboardview.app
    ```
    出力に`replacing existing signature`と表示され、成功を示しました。

---

### 結果:

これらの手順を実行した後、`openboardview.app`はM4 Mac mini上で無事に起動し、完全に機能しているようです。

素晴らしいオープンソースツールの提供に感謝。この報告が、Apple Siliconデバイス、特にM4のような新しいチップ向けのビルドプロセスの改善に役立つことを願っています。
ChatGPTのプロンプトをシンプルに生成するサイトを作成しました！

ChatGPT にエラー解決をお願いする際、**毎回プロンプトを手作業で書いている**という方も多いのではないでしょうか？

そんな方向けに、**3 ステップでプロンプトを自動生成できるサイト**を作成しました。
もしよろしければ、ぜひご活用ください！

👉 [プロンプト生成サイトはこちら](https://uni928.github.io/SephirothSimplePromptGenerator/)

***

## 🛠 どんなサイト？
このサイトは、以下の情報を元に ChatGPT 用のプロンプトを自動生成します：

・**エラー文**
・**該当ソースコードファイル（ファイルアップロード）**

生成されるプロンプトは以下の形式で構成されます：

```
下記のエラーの原因と解決する方法を教えて頂けますか？

[エラー文]

関連するファイルの内容は以下の通りです。'ファイル名'

[ファイルの内容(各行の先頭に行数を入れる)]

エラーの要点や注意点があればそれも合わせて教えてください。
```

## ✅ 特徴
・**ソースコードに自動で行番号を付与**
　ChatGPT にコードを送る際、**行番号があると文脈理解の精度が圧倒的に向上**します。
　「何行目でエラーが出ているか？」といった質問にもスムーズに対応してくれるようになります。

・**プロンプトをそのままコピペできるボタン付き**
　生成されたプロンプトは「プロンプトをコピー」ボタンで一発コピー可能です。

・**ファイルアップロード対応**
　JavaScript/TypeScript/Python/HTML/CSS など、テキストベースのコードファイルであればほぼ対応可能です。

## 🚀 使い方は3ステップ
1. **エラー文を貼り付ける（省略可）**
空欄でも問題ありませんが、あると ChatGPT の精度が上がります。

2. **該当ソースコードファイルを選択する**
ローカルファイルを選ぶだけで、自動的に行番号付きで表示されます。

3. **「プロンプトをコピー」ボタンを押すだけ！**
あとは ChatGPT に貼り付けて質問するだけです。

## 🎯 こんな方におすすめ
・エラー解決のたびにプロンプトを書くのが面倒
・プロンプトのテンプレを毎回探している
・初心者だけど、AIを活用して学習したい

## 📌 技術的な補足（開発者向け）
このツールは HTML + JavaScript（Vanilla JS）で構成されており、以下のような技術を使っています：

・FileReader API でローカルファイル読み取り
・自動的に行番号を付加
・`navigator.clipboard.writeText` によるコピー操作
・入力欄や表示はプレーンな HTML/CSS でシンプルに構成

ソースは [GitHub Pages 上で公開](https://github.com/uni928/SephirothSimplePromptGenerator) しているため、ローカル環境不要でそのまま使えます。

※情報漏洩が心配な方は、GitHub Pages 上の `index.html` をローカルにダウンロードし、そのソースコードを ChatGPT に貼り付けて「情報を送信するような処理が含まれていないか」を確認したうえで、ローカル環境でご利用いただくことをおすすめします。

なお、本ツールは GitHub Pages で公開しているため、もし情報を抜き取るような処理が含まれていれば**誰でもソースコードを見て簡単に気付く**ため、その点はご安心いただければと思います。

## 🙌 最後に
「プロンプトを書く」という作業が少しでも楽になり、皆さんが ChatGPT を活用する時間がより快適になれば、とても嬉しいです。

ご意見やフィードバックがあれば、ぜひコメントで教えてください！

👉 [プロンプト生成サイト](https://uni928.github.io/SephirothSimplePromptGenerator/)

## 追記

この文章は ChatGPT で添削しています。
生成 AI による添削が苦手な方は申し訳ありません。
RAIDのホットスペアについて

ストレージの物理ディスクを複数本束ねて用いるRAID構成において、予備のディスクとなるホットスペアというものが存在する。
今回はこのホットスペアについて触れていきたい。

ホットスペアは通常、待機用ディスクとしての役割をもっておりRAID構成内のディスクが正常に稼働されているときはデータ保存機能が実行されない。
RAID構成内のディスクが故障した場合に、自動的に故障したディスクの代わりとして機能する。

## どういったRAID構成で使われるのか

ホットスペアは基本的にどのRAID構成でも予備ディスクとして機能するが、効果が高いのはパリティを用いたRAID5やRAID6での構成だろう。
故障したディスクの役割を自動的に引き継ぐ(ユーザによる手動での役割付与も可)ことができるので、データ保存用でもパリティ用でもその故障したディスクの代わりとして機能する。故障したディスクの種類は問わない性質を持っている。

一方、ミラーリングとなるRAID1でもホットスペアを利用できるが、既にデータ冗長性が担保されているのでホットスペアは必要ない、という判断で利用しないこともある。
RAID1ではディスクの故障が発覚した後に手動でディスクの交換をする、という事後的な形の対応も可能だ。

## ホットスペアと追加されたディスクの関係

RAID構成内のディスクが故障した時、ホットスペアはその代わりの役割を担ってデータの再構築、ダウンタイムの抑制を寄与する。
システムの稼働は続けられるが、故障したディスクをそのまま放置するわけにはいかない。故障したディスクは新しいディスクとの交換が必要となる。

ではこの新しく追加されたディスクはどのような役割を持つのか。
これは利用しているストレージシステムによって変わっていく。あるストレージシステムでは追加されたディスクが新たなホットスペアとして機能したり、そのまたあるストレージシステムでは故障したディスクの代わりとして既存ホットスペアがリカバリしてくれたデータをコピーし、既存ホットスペアがまた待機用に戻らせることもある。

どのベンダーのストレージシステムはこういう仕様だ、という話はここでは割愛させていただきたい。

## ホットスペアの注意点

ホットスペアそのものはRAID構成からは外れたディスクではあるが、障害発生時はRAID構成内に組み込まれる形になるので、RAID構成内で使われている同種類同容量のディスクをホットスペアでも割り当てることが求められる。

RAID構成内では4TBのディスクが使われているのに、ホットスペアのディスクが1.2TBだとしたら障害時に故障したディスクの代わりができなくなる。
RAID構成＋ホットスペア。RAID構成で使うディスクの本数はホットスペア分も加味して考えていくべきだ。

## ひとりごと

東京都議選の投票に行ってきた。

選挙権を持ってから、どんなに投票日当日に予定が無かったとしても、無理やり時間を作って期日前投票をするタイプの人間になってしまった。
あんまり自分を信用していないから、当日になるとめんどくさがって投票に行かなくなるのでは、という不安をいつも持っている。
当日までモヤモヤするくらいならさっさと投票してしまおう、という生き方が形成されていった。おかげさまで共同通信やNHKが行なう出口調査というものに立ち会ったことがない。一度だけ立ち会ってみたい思いもある。

夏休みの宿題を最終日にガーっとやって終わらせる少年から、面倒で億劫なことはなるべく早めに片づけてしまう成人へと変わっていった。興味深い。
[ABC411] ABC 411(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# [ABC411] ABC 411(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# A問題
- `len` 関数を使えば良い。
```A.py
"""
<方針>
- `len` 関数を使えば良い。
"""
# 入力
P = input()
L = int(input())

if(len(P) < L):
  print("No")
else:
  print("Yes")
```

# B問題
- `for` の二重ループでやろう。
- `D` の 累積 `line` を求める。
- `line` を、先頭を用いて順番に減らす。
```B.py
"""
<方針>
- `for` の二重ループでやろう。
- `D` の 累積 `line` を求める。
- `line` を、先頭を用いて順番に減らす。
"""
# 入力
N = int(input())
D = list(map(int, input().split()))

# Dの累積
line = [D[0]]
for i in range(N-2):
  line.append(line[-1] + D[i+1])

# 出力
print(*line)

# 減らして出力する。
for i in range(N-2):
  # 減らす
  line = [x - line[0] for x in line[1:]]
  
  # 出力
  print(*line)
```

# C問題
## 方針
- 毎回マス `black` を全部確認すると、`O(NQ)` になるので、間に合わない。
- そこで、幾つ連続している区間があるかを常に保持しておけば、`O(Q)` になる。
- 初回のマス `black` の生成を含めて、全体として `O(N+Q)` で解ける。
## 前提
- `C`問題あたりで，`TLE`になる人は，制約条件を見る癖をつけよう．
- `A`と`B`問題では，基本的に制約条件を見ずにやっても解ける．
- しかし，`C`問題以降では，制約条件を見ないと必ず`TLE`すると思っても良い．
- 詳しい話は私の[352回の記事](https://qiita.com/mattsunkun/items/837444254f03e6105922) の`C`問題の解説に記したので，是非参照してほしい．
```C.py
"""
<方針>
- 毎回マス `black` を全部確認すると、`O(NQ)` になるので、間に合わない。
- そこで、幾つ連続している区間があるかを常に保持しておけば、`O(Q)` になる。
- 初回のマス `black` の生成を含めて、全体として `O(N+Q)` で解ける。
"""
N, Q = map(int, input().split())
A = list(map(int, input().split()))

# 最初は全部False
black = [False]*(N+2)

# 区間の数
ans = 0

# クエリの処理
for a in A:
  # 左右が同じ色の時、区間の数が変わる
  if(black[a-1] == black[a+1]):
    # 左右が同じ色の時、
    if(black[a-1] == black[a]):
      # 増える
      ans += 1
    # 左右が違う色の時、
    else:
      # 減る
      ans -= 1
  
  # 色反転
  black[a] = not black[a]
  
  # 出力
  print(ans)
```

# D問題
- 毎回文字列を移動させると間に合わない。
- サーバーだけ分かれば良いので、後ろから考える。
```D.py
"""
<方針>
- 毎回文字列を移動させると間に合わない。
- サーバーだけ分かれば良いので、後ろから考える。
"""
from collections import deque

N, Q = map(int, input().split())
ls_query = [list(map(str, input().split())) for _ in range(Q)]

# 後ろから順番に見る。
ans = deque()
ind = 0
for query in reversed(ls_query):
  # print(ind)
  match query:
    case ["1", p]:
      if(int(p) == ind):
        ind = 0
    case ["2", p, s]:
      if(int(p) == ind):
        ans.extendleft(reversed(list(s)))
    case ["3", p]:
      if(ind == 0):
        ind = int(p)

print("".join(ans))
```


# 補足
### 関係するリンク(参考文献など)
- [今回のコンテスト](https://atcoder.jp/contests/abc411)

### 筆者について
- [Atcoderアカウント](https://atcoder.jp/users/mattsunkun)
- *今回も不参加のため，成績なし．*
- [解説で示したA問題の提出](https://atcoder.jp/contests/abc411/submissions/66995970)
- [解説で示したB問題の提出](https://atcoder.jp/contests/abc411/submissions/67009770)
- [解説で示したC問題の提出](https://atcoder.jp/contests/abc411/submissions/67010052)
- [解説で示したD問題の提出](https://atcoder.jp/contests/abc411/submissions/67014926)
### その他
- **間違いを含んでいる可能性があります．**
- 方針と言いつつ，方針ではない感想などを書いている可能性があります．
- A問題から解説がだんだん省略されます．
- コードに書かれている解説の文言と，その上に書いてある解説の文言を変えている場合があります．
### 最後に一言
- 最近、シュトロハイムの声の大きさとテンションの高さにハマってます。

https://www.nicovideo.jp/watch/sm22870908

https://www.nicovideo.jp/watch/sm22870939
VSCodeさん、文字を上書きするのをやめてください。

## ある日突然、文字が消えた。

ある日、HHKBに飽きた私は、庶民の気持ちに戻るために日本語フルキーボードに回帰しました。

そして何気なくVSCodeでコードを書いていたある日、違和感を覚えました。
<br>
「あれ……？なんか入力するたびに、後ろの文字が消えていくぞ？」
<br>
気のせいかと思って書き直しても、やっぱりおかしい。変数名を直そうとしたら、後ろのコードが次々と *犠牲* になっていく。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/04c54663-cce6-43ca-b79c-43b7dc81449c.gif" width="400">

再起動したり「くぁｗせｄｒｆｔｇｙふじこｌｐ」呪文を唱えたりすると、たまに元に戻る。
<br>
ウザい。なんやこれ。


## 「上書きモード」との出会い

よく見ると、VSCodeの右下に小さく「上書きモード」って書いてある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/4eac2b6b-d454-4fe5-81f0-8aa7f57709a2.png)

……え？なにそれ？
お前誰？
誰が呼んだ？


## Insertキーの陰謀

落ち着いて思い返すと、さっきバックスペースを押そうとしたときに起きた気がする。
よく見たらその隣に「Insertキー」が鎮座しているじゃないですか。
![2b96d20b-2548-4d6e-b7f7-7e291c51fdde.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/58958c5c-bc90-4975-9e28-32044a023e9b.png)

お前だな元凶は。でしゃばってんじゃねーぞInsertキー。
空気読めよ。

## 粛清：物理的制裁

「……お前、いらんやろ」

ということで、Insertキーを物理的に引っぺがしました。
手元のキーボードは少し静かになりました。心も。


## 和解：VSCodeの設定を見直す

数分後、冷静になって設定を見直してみると……ありました。
![スクリーンショット 2025-06-23 114904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/3a4c7293-618d-470c-9a05-703f7f0947f7.png)

**「上書き／挿入モードの切り替え」**
という名のキーボードショートカット設定。

しかもInsertキーに割り当てられてるじゃないですか。最初からここ消せばよかったやつ。

というわけで、キーバインドを削除。
Insertキーは元の位置に叩き戻してあげました。ちょっと端が欠けました。

--- 
過去に先駆者がいました。私は今日まで遭遇しなかったので知りませんでしたが、わりと前から実装されてる機能なんですね。

https://note.com/itachi_yukari/n/nb6ff08fd7cdf


## Insertキー、お前は悪くなかった
本当に悪いのは、何も知らずにキーを押して混乱する自分です。
でも、今後も不用意に上書きモードにされるのは困るので、Insertさんには静かにしていてもらいます。
ClineでLLMのトークン数カウンタを作ってみた

# はじめに
OpenAIはトークン数カウントできるページが公開されていますがAnthropicやGoogleはAPIは公開されているもののページとしては公開されていません(GeminiはPythonだとノートブックがあるっぽい)。
ちょうどおおよその概算値を知りたかったこともあってClineで作ってみました。

OpenAI Tokenizer

https://platform.openai.com/tokenizer

# 画面イメージ
概ねいい感じですがどうしても詰まってて余白がないな、ってなるところあります。
やはりまだUIの景観的なところはAI苦手ですね。

テキストのトークン数をカウントしてみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389699/f2e27133-1db8-4f19-bf8c-2938f004bbd2.png)

画像のトークン数をカウントしてみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389699/075898df-b27d-452d-aa7b-7cf2d55773b9.png)

※ テキストと画像同時にもできます。

# 技術スタック
- TypeScript
- Svelte
- Material UI
- Cline(LLM:Claude 4.0 Sonnet)

# 仕様
- テキストと画像をカウントの対象とする
- OpenAIはtiktokenパッケージを使用してカウント
- AnthropicとGeminiは公式のAPIを呼び出し

Anthropic

https://docs.anthropic.com/ja/docs/build-with-claude/token-counting

Gemini

https://ai.google.dev/gemini-api/docs/tokens?hl=ja&lang=node

# プロンプト
最初は下記のようにClaudeのみをターゲットとして作ってもらいました。
あとは少しずつ対象を追加したり修正してもらったりしていった感じです。

```md
# 役割
あなたはTypeScriptとSvelteに精通したフロントエンドエンジニアです。

# 命令
Claudeのトークン数をカウントするWebアプリケーションを作成してください。

# 技術スタック
- TypeScript
- Svelte
- Material UI

# 仕様
- 拡張性を考えてプロバイダ(例: Anthropic, OpenAI)をドロップダウンリストで選択できるようにしてください。
- プロバイダを選択するとモデルの一覧をドロップダウンリストで選択できるようにしてください。
- トークン数カウントをしたいテキストを入力するテキストエリアを配置してください。
- カウントボタンをクリックするとAnthropicのトークンカウントAPIを実行してトークン数を取得してください。
- トークン数を取得したら画面にトークン数を表示してください。
```

# 振り返り
上述した通り、UI周りはまだまだです。
美的感覚的なところもそうですが、今回だと最初はドロップダウンリストをうまく表示できてなかったり、その他にもいくつか不備がありました。
実際に生成されたHTMLを与えて修正依頼することで動作するよう修正はしてくれましたがやはり余白もうちょっとほしいな、みたいな感覚は伝えるのが難しいです。

しかしながら全部人の手でやるのではなくそういった部分のみを人の手でやってほかはAIに任せることでやはり工数はめちゃめちゃ抑えられるなと感じました。

# GitHub
READMEとかも全部Clineで作ってそのままです。
なので別にライセンスとかMITのつもりでもないｗ(特に指示しなかったのでいい感じに？してくれたのかなと)

https://github.com/helvetica822/LlmTokenizer
FreeBSD/libxml2 での最近の動向

GNOMEプロジェクトに属するライブラリで巷間よく用いられているXMLパーサ　[libxml2](https://github.com/GNOME/libxml2) で発見されていた3つのCVE脆弱性に関する [FreeBSD](https://www.freebsd.org) portsでの対策は、２つの選択肢がありました。

* バージョン　2.11 から　開発版に近い　2.14 に移行する
* 2.11 にパッチを当てる

 これらの選択肢のうち、2.14　移行の[パッチ](https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=279705)は　メーリングリストでも議論されていたようです。　小生もこのスレッドで流れたパッチを適用したシステムを稼働させましたが、公式に2.14移行となると、依存するパッケージがかなりの数になりすべてを検証し尽くすことは無論、2.11でも対応が不明なものについても調査をしなければならないようで、すぐに実施されるとは思われず、解決を待っていました。

 ## 2025/06/22 GNOME本家側にあるパッチ適用が公開

[textproc/libxml2](https://www.freshports.org/textproc/libxml2/) は、XMLパーサライブラリとして利用されているものが840で、FreeSBDデスクトップ環境で必要とされるパッケージ数に匹敵します。
GNOMEプロジェクトで使われるXML文字列の解析で必ず使われているのもあり、大きな変更がともないます。
2.11で動いているシステムの可用性を損なわない変更はある意味で急場をしのげます。

## CVE-2024-56171 対応 パッチ
FreeBSD-ports では FreeBSDに属する変更として、files に追加されるパッチが多いですが、今回本家 gitlab から入手できるパッチが Makefile に追記されました。これらはGNOME側の対応だったですが、昨年に作られていたようです。

そのうちの[CVE-2024-567171](https://gitlab.gnome.org/GNOME/libxml2/-/commit/245b70d7d2768572ae1b05b3668ca858b9ec4ed4.patch) に対するパッチを紹介します。

### CVE-2024-56171 脆弱性の概要
* Use-after-free脆弱性
この脆弱性は、xmlSchemaItemListAdd関数の呼び出し後に発生するuse-after-free（解放後使用）の問題です。
#### 問題の詳細
##### 根本原因
xmlSchemaItemListAdd関数は内部でアイテム配列を再割り当て（realloc）することがあります。配列が再割り当てされると、以前のメモリアドレスは無効になり、古いポインタを参照し続けるとuse-after-freeが発生します。
* 影響を受ける関数

xmlSchemaIDCFillNodeTables
xmlSchemaBubbleIDCNodeTables

両関数では、xmlSchemaItemListAddを呼び出した後も、古いduplsポインタを使い続けていました。

### 修正内容
修正箇所1: xmlSchemaIDCFillNodeTables


## まとめ

この修正は、XMLスキーマ検証機能を使用するアプリケーションのセキュリティと安定性にとって重要です。特に、外部からのXMLデータを処理するWebアプリケーションやサービスでは、この脆弱性を悪用した攻撃のリスクがありました。
修正は最小限かつ的確で、パフォーマンスへの影響もなく、根本的な問題を解決しています。
【IERAE CTF 2025 writeup】 DiNo.1

## はじめに

[IERAE CTF 2025](https://gmo-cybersecurity.com/event/ieraectf25/) に参加したので、writeupを書いてみたいと思います。
今回は、miscのwarmup問題である**DiNo.1**を解説します。

:::note warn
この記事には、問題の解法が含まれています。
自力で答えにたどり着きたい方は該当部分を見ないことをおすすめします。
:::

## 問題

まずは問題を見てみましょう。

![問題文](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/fe913970-0c14-4731-b1aa-7d9d90a6596b.png)

問題ページを開くと、Chromeの恐竜ゲームのようなゲームが出てきます。
上矢印キーでクマさんをジャンプさせ「:point_up:」を避けるゲームです。
このゲームで5000点獲得するとflagが得られる問題のようです。

![問題ページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/aa19a877-2f9c-47d2-b6d5-cc1a8eb1d24b.png)

## 解き方

:::note warn
この先、解法を記載しています。
:::

オフラインでできるゲームという設定なので、HTML内に`script`タグでソースコードが埋め込まれています。

![ソースコードが見られる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/c689c4e0-b87c-4973-92a8-e158c2d94a23.png)

`script`タグの始めの方で変数の宣言を行っているところに、次のようなコードがあります。

```javascript
let clearscore = 5000;
```

ここでクリアに必要な点数を設定しているわけですね。

まじめに5000点を獲得するのは面倒なので、この`clearscore`を変更して簡単にクリアできるようにしましょう。

開発者ツールのコンソールで次のコードを実行して、`RESTART`します。

```javascript
clearscore = 10;
```

これにより、10点を取るだけでクリアできるようになるので、一度も飛ばなくてもflagが得られます。

![flagが入手できた](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/45b8cb55-5709-422b-b307-007cc7579be8.png)

## 別の解き方

ちなみに、このソースコード内には`score`という変数もあり、現在の点数を変更することもできます。
ゲームを開始し、ゲームオーバーになる直前に `score = 5050` のような命令をコンソールから入力するとクリアになります。

![別解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/2942a451-7e5b-4652-a645-8a1b2b92eb4b.png)

ただし、この方法だと流れてくる:point_up:に当たる前に点数をねじ込まなければいけないので、若干コツがいるかと思います(笑)
この方法でゆっくりやる方法はあるんでしょうか。分かる方がいれば教えてください。

## おわり

以上、IERAE CTF 2025 DiNo.1のwriteupでした。
ありがとうございました。
【snowpark】snowparkの認定を終えての振り返り

## snowparkについて
 `snowpark`は、snowflakeが提供する開発フレームワークである。snowparkを利用するとsnowflakeの処理エンジン内でSQL以外の言語でsnowflakeに対してコードを実行することができる。
詳細は、下記のサイトなどを参考にください。

https://itsol.dentsusoken.com/snowflake/blog/snowpark-vol-014-4205/

# Snowpark 学びの復習メモ（箇条書き）
snowparkの認定試験を受けて認定合格を得ましたが、後学への学びも含めて整理していきたい点を列挙していくことととする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/731ba179-0673-43fd-bf19-2463082967e2.png)


## 基本概念・使い分け
- pandas DataFrame：
小規模データのローカル分析に適しており、Pythonメモリ内で処理される。

- Snowpark DataFrame：
SQLに変換されてSnowflake上で実行される分散処理向け。大量データやサーバー実行向き。

- pandas on Snowflake のNULL処理：
pandasのNaN/NA/NaTはSnowflakeではSQL NULLに変換されて保存される。

- pandasを選ぶ理由：
行順の保持や、既存のpandas資産の活用が目的となることが多い。

- Snowparkはlazy evaluation：
実行まではSQLが構築されるだけで、即時実行されない（必要時に実行）。

## 実装・使用方法
- cache_table("table_name")：
クエリ結果を一時キャッシュし、再実行を高速化。

- group_by_grouping_sets()：
SQLのGROUPING SETSと同様に、複数のグルーピングをまとめて実行可能。

- collect()[0] の注意点：
レコードが1件とは限らないため、前提条件を確認して使う必要がある。

- as_dict()：
.collect()[0]で取得したRowオブジェクトを辞書形式に変換。


## DataFrame をテーブルに出力する方法

- df.write.save_as_table("table_name")：
新しいテーブルとして保存（既存テーブルがあるとエラー）。

- df.write.mode("overwrite")...：
既存テーブルを上書きして保存。

- df.write.mode("append")...：
既存テーブルに追記。

- df.write.save()：
save_as_tableの省略表現。

- df.write.copy_into_location("@stage/folder")：
データをCSVやParquet形式でステージ領域にエクスポート。

- df.create_or_replace_temp_view("view_name")：
一時的なSQLビューを作成（物理テーブルではない）。


### UDF/UDTF 関連
UDFの定義の実装や戻り値に対応できるものを理解する点であったり引数の定義などのsnowparkの文法などを理解しておく。

- 登録方法に関して
@udf や @udtf デコレーターを用いて、input_typesやoutput_schemaを定義。

- process() メソッド：
UDTFに必須の処理メソッド。1行ごとの処理ロジックを書く。

- end_partition()：
任意のメソッド。パーティションごとの後処理に使用。

- Python UDFの展開：
ローカルテスト後、Snowflakeではステージにアップロードし、add_import()で読み込む。

- ローカルパス非対応：
Snowflake上ではローカルパスや依存ファイルを直接参照できない。


### ndf（新しいDataFrame）の生成時の注意
df.filter(...) で ndf を生成する際、.collect()[0] のように1レコードを前提とする処理では、レコード数が1件であることを明示的に確認するのが安全。

### バージョンと実行環境の違い

- ローカル vs Snowflake：
Snowflakeでは特定のPythonバージョンとライブラリバージョン（Anaconda）が使用される。

- パッケージの持ち込み：
session.add_packages() や session.add_import() を使って依存ライブラリを指定。

- 開発時の注意点：
バージョン非互換を防ぐため、Snowflake環境に合わせたライブラリ検証が重要。
tmuxで default という名前のセションがあればアタッチし、なければその名前のセションを作成する

tmuxで default という名前のセションがあればアタッチし、なければその名前のセションを作成する。

```
# ~/.bashrc or ~/.zshrc に追加

tmux() {
  if [ "$#" -eq 0 ]; then
    # 引数なし→default セッションへアタッチ／なければ作成
    command tmux attach-session -t default 2>/dev/null \
      || command tmux new-session -s default
  else
    # 引数あり→通常の tmux コマンドとして実行
    command tmux "$@"
  fi
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/22078bd1-f08b-4188-86ab-66ec116c0102.png)
【Rails初学者】初学者が学んだ　最初のToDoアプリで覚えた20のコマンド

# 最初のToDoアプリで覚えた20のコマンド

こんにちは。
railsを勉強している初学者です。
Railsを学び始めて最初に作ったアプリは、シンプルなToDo管理アプリでした。
「タスクを登録 → 表示 → 編集 → 削除」という流れの中で、何度も使ったRailsの基本コマンドを20個ほど、備忘録のために記載します。
 
（※Rails 8.0 + Ruby 3.2 環境で確認）

---

## アプリ作成・基本

| コマンド | 目的 |
|---------|------|
| `rails new todo_app` | アプリを新しく作る |
| `bin/rails s` | 開発サーバー起動（http://localhost:3000） |
| `bin/rails c` | コンソール起動（モデルを試すのに便利） |
| `bin/rails routes` | ルーティング一覧を確認 |
| `bin/rails about` | バージョンや環境情報を確認 |

---

## モデル・データベース関連

| コマンド | 目的 |
|---------|------|
| `bin/rails g model Task title:string done:boolean` | モデル + マイグレーション作成 |
| `bin/rails db:migrate` | マイグレーションを実行 |
| `bin/rails db:rollback` | マイグレーションを1つ戻す |
| `bin/rails db:seed` | 初期データを投入する |
| `bin/rails dbconsole` | DBを直接確認・編集できる |

---

## コントローラ・ビュー関連

| コマンド | 目的 |
|---------|------|
| `bin/rails g controller Tasks index show` | コントローラとビューを作成 |
| `bin/rails g scaffold Task title:string done:boolean` | CRUD画面を全部まとめて作成 |
| `bin/rails destroy controller Tasks` | コントローラを削除（やり直したいとき） |
| `bin/rails turbo:install` | Turbo導入（1回だけでOK） |
| `bin/rails stimulus:install` | Stimulus導入（必要に応じて） |

---

## その他便利系

| コマンド | 目的 |
|---------|------|
| `bin/rails test` | テストを実行する |
| `bin/rails notes` | `# TODO`, `# FIXME` コメントを一覧表示 |
| `bin/rails runner "puts Task.count"` | 1行スクリプトを即実行 |
| `bin/rails assets:precompile` | 本番用にアセットをビルド |
| `bin/rails --help` | コマンド一覧・使い方を確認 |

---

## おわりに

Railsにはコマンドがたくさんあるけれど、とりあえずこの20個を使いながら進めた。
最初のToDoアプリを作る過程で実際に何度も叩いたものを中心に、自分が「これなんだっけ？」となったときに見返せるようにしておきます。

---

## 補足
- 使用環境：Rails 8.0 / Ruby 3.2 / macOS / PostgreSQL
- ターミナルで実行する際は `bin/rails` を基本にしています（`rails`だけでも動きますが、8.0以降は `bin/rails` が推奨）

---

初学者のため、間違えていたらすいません。
Accessクエリは神か？悪か？～Accessのプロ集団が語る～

初めまして。
株式会社インフォースの技術部長を勤めているike_inforce_devと申します。

弊社ではAccessのシステム開発を専門としており、SQLServerやAzureSQLdatabaseへのアップサイジングを得意としております。

世間では、ノーコード・生成AIなどが流行ってる横で、日々多種多様なAccessシステムの問い合わせを頂いており、ありがたい事に忙しい日々を過ごしております。


さて・・・前置きはこの辺にしておいて、
皆さん「**クエリ**」と聞くと何を想像しますか？

普通は、DBへの命令文なので「**SQL**」が思い浮かぶかと思います。

SELECT、INSERT、等々それぞれ構文が決まっておりますが、結合やサブクエリなどが絡むと中々覚えるのが大変ですよね。


ですが、AccessのクエリはSQLが書けなくてもGUI操作でデータを操る事が出来る優れものなんです。

![スクリーンショット 2025-06-18 155143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4116416/a9a78b79-147d-4fae-9021-ebb2295ac09d.png)


SQLビューで覗くとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4116416/6662353d-3791-4013-a159-939736b0b35a.png)

クエリオブジェクトとして保存し、「クエリ実行」と命令するだけでいつでも設定済のデータを操る事が出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4116416/98d70ab8-b8a8-445f-87c5-ea62f9b6b581.png)


**うはっ！！こりゃ便利！！神かよ！！！**

って思いますが・・・

実は作成済のクエリオブジェクトを使って、更にクエリを作る事が出来るんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4116416/df1f87b1-f2f2-4eee-94d6-c942c9179369.png)


クエリオブジェクトでありつつ、新しいクエリを作成するときはテーブルのような扱いになるので、いくらでも階層深く作る事が出来てしまうんです。


どんなシステムでも、日々メンテナンスが発生します。
クエリの修正が発生した場合、1つずつクエリを開いて直す必要があるので、
メンテナンス性が非常に悪く、**神** と思われたクエリが **悪** に変わります。
更にこのパターンはドキュメントが用意されていない場合も多いので、作った人しかわからない状態になります。

うん、恐ろしいですね（　＾ω＾）

という事で纏めです。

** **神の要素** **
 -- SQLの知識不要でデータを操作出来る

** **悪の要素** **
 -- メンテナンス出来なくなるリスク

最後に、声を大にして言わせてください。
**クエリにクエリを重ねるのは止めよう！**
.NET 10：C# 単一ファイルの実行


かつて、Pythonのように1ファイルで直接実行できることを羨ましく思ったことがありました。特に、技術的な検証や、小規模かつ複雑な業務データ処理を行う場面で、C#でも一つのコードファイルを直接実行できればと感じることが多々ありました。これまでは主にVisual Studioの「C#インタラクティブウィンドウ」を使って対応していましたが、コードが少し複雑になると非常に使いづらくなっていました。同時に、こうした機能は自動化やスクリプト化が必要なシナリオにも新たな可能性をもたらします。

1. 直接記述して実行：  
   .csファイルを作成し、コードを記述します。その後、ターミナルで次のコマンドを実行するだけです。

```bash
dotnet run app.cs
```

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRAjegic4u19W8DlBWYe4Vx5iacHbl5ZsqTwqGyU01W8Jn3aDsYVIELGia6pasMl4hzJqySQIm827T5KA/640?wx_fmt=png&from=appmsg&watermark=1)

2. パッケージの導入：  
   サードパーティ製パッケージを導入したい場合も、簡単に検索とバージョン確認ができます。

a. まず、サードパーティパッケージを検索します。

```bash
dotnet package search dapper
```

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRAjegic4u19W8DlBWYe4Vx5iaInazNZF6aT4cRCLFTDNZmRE7aFJF6GHy61lnQ0zib1AGO0fZ1DLkBkQ/640?wx_fmt=png&from=appmsg&watermark=1)

b. パッケージ参照は「#:package パッケージ名@バージョン番号」と指定し、その後「using 名前空間」で利用します。なお、現在は#:sdkもサポートされています。

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRAjegic4u19W8DlBWYe4Vx5iaSCaemJCjCIxYbhYAfF2TgcQFb9pzYjd0ib6KnLZNnrzzHUJQNl8hfQA/640?wx_fmt=png&from=appmsg&watermark=1)

c. 必要に応じて.NETバージョンを指定して実行することもできます。

```bash
dotnet run app.cs -f .net10.0
```

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRAjegic4u19W8DlBWYe4Vx5iaoM4RUQtLEgH0hnjBwSYMKzISSpvncwKTHDfSjskBYlxia3ibmKkwZ5Tw/640?wx_fmt=png&from=appmsg&watermark=1)

現時点では、他の .cs ファイルをインポートすることはできません。将来的には「#:file abc.cs」のような形式で対応が追加されるかもしれません。

もちろん、コミュニティ内では「なぜC#をPythonのようにするんだ？ 直接Pythonを使えばいいだろ」といった意見も多く見られます。ハハ、まさに百家争鳴ですね。

(Translated by GPT)
元のリンク：https://mp.weixin.qq.com/s/yjo1PjngGWKYkCmKYf7KUA?token=175774537&lang=zh_CN&wt.mc_id=MVP_325642
.NET10：C#14のいくつかの新機能

C#14ではいくつかの新機能が提供されています。ここでは、よく使われ、すぐに効果を実感できる基本機能をいくつか紹介します。

1. `List<>` に対する `nameof` のサポート
2. ラムダ式で `scoped`、`ref`、`out`、`in` がサポートされる
3. null 条件付き代入
4. プロパティで `field` のサポート
5. インスタンスコンストラクタやイベントでパーシャル（部分）メンバー修飾子がサポートされる

それぞれの機能について具体的なサンプルを以下に記載します。

```csharp
// 1. List<>でnameofのサポート
Console.WriteLine(nameof(List<>));
Console.WriteLine(nameof(List<string>));
Console.WriteLine(nameof(List<int>));

// 2. ラムダ式パラメータにscoped、ref、in、out、ref readonlyなどの修飾子を型指定なしで付与可能
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);
// 従来の書き方
TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);

// 3. null条件付き代入
void SetPersonName(Person? person, string name)
{
    // null条件付き代入
    person?.Name = name;
}

// 4. プロパティでfieldサポート
delegate bool TryParse<T>(string text, out T result);

public partial class Person
{
    public string Name
    {
        get;
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new Exception("Name cannot be null or empty");
            }
            field = value;
        }
    }

    public int Age
    {
        get;
        set
        {
            if (field >= 0 && field <= 150)
            {
                field = value;
            }
            else
            {
                throw new Exception("Invalid age");
            }
        }
    }

    // 5. イベントをパーシャルメンバーとして宣言可能
    public partial event EventHandler? NameChanged;
    public partial Person();
}

public partial class Person
{
    // 5. インスタンスコンストラクタをパーシャルメンバーとして宣言可能
    public partial Person()
    {
        Name = "Default Name";
        Age = 0;
    }

    private EventHandler _nameChangedHandlers;

    // 実装にはaddとremoveが必要
    public partial event EventHandler NameChanged
    {
        add
        {
            Console.WriteLine("Handler added.");
            _nameChangedHandlers += value;
        }
        remove
        {
            Console.WriteLine("Handler removed.");
            _nameChangedHandlers -= value;
        }
    }

    public void OnNameChanged()
    {
        _nameChangedHandlers?.Invoke(this, EventArgs.Empty);
    }
}
```

(Translated by GPT)
元のリンク：https://mp.weixin.qq.com/s/pvoSt4OsT97ppeiDYfgW6A?token=175774537&lang=zh_CN&wt.mc_id=MVP_325642
.NET 10：APIによるサーバー送信イベント（SSE）のサポート


SSE（Server-Sent Events）は、サーバーからブラウザへ「プッシュ」形式でメッセージを送信する仕組みです。通常、ウェブページが新しいデータを取得する際、ブラウザがサーバーに問い合わせを行います（例：数秒ごとのリフレッシュ）。しかし、SSEでは逆に、ブラウザが「メッセージの受信準備ができた」とサーバーに通知し、サーバー側で新しいメッセージが発生した際には即座にプッシュ通知が送られ、ブラウザは即時に受信できます。これは、カスタマーサービスで「何かあったら連絡して」と伝え、何かあった際に相手から連絡が来るようなイメージです。

SSEは一方向通信であり、サーバー → ブラウザ（逆は不可）、かつ接続は持続的です。一度接続すると維持され、随時メッセージが配信されます。また、SSEはHTTPベースで、WebSocketのような複雑さはありません。ブラウザが標準でサポートしており（`EventSource`インターフェイスが利用可能）、簡単に利用できます。

MCPは、フロントエンドと大規模言語モデル（ChatGPT等）間の通信プロトコルです。このMCPにおいてSSEは重要な役割を果たしています。AIのレスポンスをリアルタイムかつストリーミング形式でクライアントに届けるためです。ChatGPTでの会話時に、一文ずつ“表示”されていく現象にお気づきかと思います。LLM（大規模言語モデル）の「ストリーム」的な特性を活かし、MCPはSSE技術を利用してサーバーが部分的に生成した内容を逐次クライアントに送信できます。そのため、ユーザーは「まるでタイピングしているような様子」を目にでき、最後まで内容が揃うのを待つ必要はありません。

.NET 10では、このSSEイベントのサポートが実現されています。実装例は以下の通りです。

```csharp
using System.Diagnostics;
using System.Runtime.CompilerServices;

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/performance", static (CancellationToken cancellationToken) =>
{
    async IAsyncEnumerable<OSPerformance> GetHeartRate([EnumeratorCancellation] CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            yield return OSPerformance.Create();
            await Task.Delay(2000, cancellationToken);
        }
    }
    return TypedResults.ServerSentEvents(GetHeartRate(cancellationToken), eventType: "osPerformance");
});
app.Run();

public class OSPerformance
{
    public float CPUUsage { get; set; }
    public float MemAvailable { get; set; }
    public DateTime Timestamp { get; set; }

    private OSPerformance(float cpuUsage, float memAvailable, DateTime timestamp)
    {
        CPUUsage = cpuUsage;
        MemAvailable = memAvailable;
        Timestamp = timestamp;
    }
    public static OSPerformance Create()
    {
        var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        var memCounter = new PerformanceCounter("Memory", "Available MBytes");
        cpuCounter.NextValue();
        float cpuUsage = cpuCounter.NextValue();
        float memAvailable = memCounter.NextValue();
        return new OSPerformance(cpuUsage, memAvailable, DateTime.UtcNow);
    }
}
```

まず、.httpファイルでテストを試みましたが、この機能には対応していませんでした。

![画像1](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBOQ0CIa3mzcawYmMpH69F01hAGst4OHHSNul447m5KfkicPY0wzESccGBfg5iaCdhLDRpjCu0ibzJNQ/640?wx_fmt=png&from=appmsg)

Postmanに切り替えると、SSEが正常に動作することを確認できました。

![画像2](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBOQ0CIa3mzcawYmMpH69F0cQXzfI08ntdUCiaW9CxteDTRThBBXmuiba8xg1SQXIpXlICICOyLTbBA/640?wx_fmt=png&from=appmsg)

この状態でクライアントを終了すると、サーバー側では接続切断の例外が発生します！
元のリンク：https://mp.weixin.qq.com/s/qjjQpVrnJ_HdEi-3ZwvRLw?token=175774537&lang=zh_CN&wt.mc_id=MVP_325642
.NET10：ASP.NET Core Minimal APIのバリデーション


.NETのMinimal APIでは、“データバリデーション”が自動的にサポートされています。つまり、利用者がAPIにリクエストした際、送信されたパラメーターが指定した条件――例えば、特定のフィールドが必須である、最大長が決まっている、フォーマットに合致している、など――を満たしていない場合、フレームワークが自動的にチェックしてくれるため、独自で判定ロジックを書く必要がありません。

まず、プロジェクトファイルにInterceptorsNamespacesの設定を追加する必要があります。

```xml
<Project Sdk="Microsoft.NET.Sdk.Web">
	<PropertyGroup>
		<TargetFramework>net10.0</TargetFramework>
		<Nullable>enable</Nullable>
		<ImplicitUsings>enable</ImplicitUsings>
	</PropertyGroup>
	<PropertyGroup>
		<InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.Http.Validation.Generated</InterceptorsNamespaces>
	</PropertyGroup>
</Project>
```

具体的なサンプルは以下の通りです：

```csharp
using Microsoft.AspNetCore.Http.Validation;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddValidation();
var app = builder.Build();

// DisableValidationによるバリデーションの無効化
app.MapGet("/person/{id}",
    ([Range(1, 10000, ErrorMessage = "idの範囲は1~10000です")] int id)
        => TypedResults.Ok(id)).DisableValidation();

// バリデーション有効
app.MapPost("/person", ([Required(ErrorMessage = "名前は必須です")] string name, [Range(0, 120, ErrorMessage = "年齢は0~120の範囲で入力してください")] int age) =>
    TypedResults.Ok($"{name},{age}"));

// ネストされたバリデーション
app.MapPost("/order", ([FromBody] Order order) =>
    TypedResults.Ok($"{order.OrderNo},{order.Amount}"));

app.Run();

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Order
{
    [Required(ErrorMessage = "注文番号は必須です")]
    public string OrderNo { get; set; }

    [Range(1d, double.MaxValue, ErrorMessage = "金額は1より大きい必要があります")]
    public decimal Amount { get; set; }

    [Required(ErrorMessage = "注文者は必須です")]
    public User OrderUser { get; set; }
}

public class User
{
    [Range(1, int.MaxValue, ErrorMessage = "idは1より大きくある必要があります")]
    public int UserID { get; set; }

    [Required(ErrorMessage = "ユーザー名は必須です")]
    public string UserName { get; set; }
}
```

バリデーションの効果：

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBOQ0CIa3mzcawYmMpH69F0rhicicGKy5STcicHYDDddBDr5mYtN9hNqIQIKSxEmzIIEJ1pp5j2uiaiaicw/640?wx_fmt=png&from=appmsg)

バリデーションを無効化するには、DisableValidationメソッドを追加します：

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBOQ0CIa3mzcawYmMpH69F0iaxJVqBSyfEp9P79rQUK1zKH3UiaZPF7DibUkKa8NsCOG2jBE7wy88Rjg/640?wx_fmt=png&from=appmsg)

ネストされたバリデーションの例：

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBOQ0CIa3mzcawYmMpH69F0Ac4qo1GdniaCy47hmSNrZ7icf03mFIdBvuXpQy90bYBktV9cXcHFxibiag/640?wx_fmt=png&from=appmsg)

(Translated by GPT)
元のリンク：https://mp.weixin.qq.com/s/SZjixkA0HwY5djoE3nb-9Q?token=175774537&lang=zh_CN&wt.mc_id=MVP_325642
Databricks にて JavaScript の Date.prototype.toString() が生成するデフォルトの表示形の値を timestamp 型として取り込む方法

## 概要

Databricks にて、 JavaScript の Date.prototype.toString() が生成するデフォルトの表示形式である `曜日 + 月 + 日付 + 年 + 時刻 + GMT±hhmm + 括弧付きタイムゾーン名`（例：`Sun Jun 22 2025 12:34:56 GMT+0900 (Japan Standard Time)`）という書式の値を timestamp 型として取り込む方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b7abfcba-86fe-4c47-9e78-76fdef74548d.png)


## 処理方法

### 事前準備

```javascript
process.env.TZ = 'Asia/Tokyo';
const d = new Date(2025, 5, 22, 12, 34, 56);
console.log(d.toString());
```

```text
Sun Jun 22 2025 12:34:56 GMT+0900 (Japan Standard Time)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b7abfcba-86fe-4c47-9e78-76fdef74548d.png)


### Databricks で timestamp 型として取り込む処理

```python
from pyspark.sql import functions as F

df = spark.createDataFrame(
    [
        ("Sun Jun 22 2025 12:34:56 GMT+0900 (Japan Standard Time)",),
    ],
    ["timesmtap_string_from_javascript"],
)

pattern = "MMM dd yyyy HH:mm:ss 'GMT'Z"

result = df.withColumn(
    "ts",
    F.to_timestamp(
        F.regexp_replace(
            F.substring("timesmtap_string_from_javascript", 5, 100), r"\s*\(.*\)$", ""
        ),
        pattern,
    ),
)

result.printSchema()
display(result)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ca1fb070-6542-41c3-92c6-f0e22500b818.png)
Windows 11 でエクスプローラーの右クリックメニューを Windows 10 仕様へ戻す手順

# 右クリックメニューを Windows 10 仕様へ戻す
※レジストリを直接編集するため、必ずバックアップを取得してから作業することを推奨する。

## 概要
Windows 11 のエクスプローラーは、簡素化されたコンテキストメニューを採用している。  
旧来の Windows 10 型メニューを復活させるには、レジストリに **`CLSID` キー** を追加し、エクスプローラーを再起動すれば良い。

---

## 事前準備
1. **システムの復元ポイント** を作成しておくと安心である。  
2. **レジストリ エディター**（`regedit.exe`）を管理者権限で起動できるユーザーでサインインしておく。

---

## 手順

### 1. レジストリ エディターを起動
- **`Win + R`** キーで「ファイル名を指定して実行」を開き、`regedit` と入力して Enter を押す。  
- 「ユーザー アカウント制御」が表示された場合は **`はい`** を選択する。

### 2. 対象キーへ移動
次のパスをたどる。 
- **`HKEY_CURRENT_USER\Software\Classes\CLSID`**

### 3. 新しいサブキーを作成
1. `CLSID` を右クリック → **`新規`** → **`キー`** を選択。  
2. キー名に **`{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}`** と入力する。  

### 4. `InprocServer32` キーを追加
1. 作成した `{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}` を右クリック → **`新規`** → **`キー`**。  
2. キー名に **`InprocServer32`** と入力する（※大文字小文字は任意だが一致させると良い）。  
3. 右側ペインの **`(既定)`** 値をダブルクリックし、**値のデータを空のまま** で **`OK`** を押す。  
   - 値が何も入っていない状態（空文字列）であることを確認する。

### 5. エクスプローラーを再起動
- **`Ctrl + Shift + Esc`** で **タスク マネージャー** を開く。  
- **`エクスプローラー`** を探し、右クリック → **`再起動`** を選択する。  
  - もしくは PC を再起動する。

> 以上で右クリックメニューが Windows 10 スタイルに切り替わるはずである。  
> 反映されない場合はキー名のスペルミスがないか、PCの再起動を試すと良い。

---

## 元に戻す方法
1. レジストリ エディターで先ほど追加した  
   `HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}`  
   を **丸ごと削除** する。  
2. エクスプローラーを再起動（または PC を再起動）する。  
これで Windows 11 標準の簡素化メニューに戻る。

---

## 注意事項
- レジストリ操作は OS の挙動に直結するため、誤操作はシステムの問題を招くおそれがある。  
- 企業管理下の PC 管理ポリシーにより、レジストリ変更が制限されている場合がある。  
- Windows の大型アップデート後にキーが消えたり、仕様が変わる可能性があるため、アップデート適用後は挙動を確認することを推奨。

---

## まとめ
上記キーを追加するだけで、Windows 10 時代の使い慣れたコンテキストメニューを取り戻せる。  
操作は単純であるが、バックアップを怠らず慎重に進めることを推奨。
NFS / S3 / Google Drive / CloudFront / SQS FIFO

````markdown
# 📌 今日学んだことまとめ：NFS / S3 / Google Drive / CloudFront / SQS FIFO

---

## ✅ 1. NFS（Network File System）とは？

- ネットワーク越しにファイルシステムをマウントして、ローカルのように操作可能なプロトコル
- 主にUNIX/Linux環境で使われる
- サーバーの `/etc/exports` で共有フォルダを定義し、クライアントは `mount` コマンドで使用

### 🔹 特徴
- ローカルファイルのように使える
- LAN内でのファイル共有に最適
- 認証が弱いため、外部公開には不向き

---

## ✅ 2. Amazon S3との違い

| 比較軸 | NFS | Amazon S3 |
|--------|-----|-----------|
| ストレージ種別 | ファイルシステム | オブジェクトストレージ |
| 接続方法 | mount（POSIX準拠） | HTTP API（GET/PUT） |
| 拡張性 | 手動スケーリング | 自動スケーリング |
| 認証 | 弱い（IPベース） | IAM、ポリシーで制御可能 |
| 編集方法 | 直接編集可能 | オブジェクトごとに置き換え |

---

## ✅ 3. Google Driveはどちらに近いか？

- 内部構造はオブジェクトストレージに近い（S3型）
- UIやGoogle Drive for Desktopを通じてNFS風に操作可能
- REST API でアクセス可能（S3と似た構造）

---

## ✅ 4. CloudFrontとEdge Location

- **Amazon CloudFront**：AWSのCDN（コンテンツ配信ネットワーク）サービス
- **Edge Location**：CloudFrontが世界中に設置したキャッシュサーバーの場所

### 🔹 仕組み
- 最初のリクエストはS3などのオリジンから取得し、Edge Locationにキャッシュ
- 以降は最寄りのエッジから高速に配信
- 費用削減＋パフォーマンス向上の最適解

---

## ✅ 5. SQS FIFOキュー

- メッセージを送信順に**正確に処理**し、**重複なし**で届けることができるキュー
- 標準キューと違い、順序が非常に重要な処理に向いている

### 🔹 特徴
- 順序保証（First-In-First-Out）
- MessageGroupIdで並列性を制御
- DeduplicationIdで重複排除
- 処理スループットに上限あり

### 🔹 使用例
- 注文処理フロー（例：注文 → 決済 → 出荷）
- 銀行トランザクション処理
- SNSタイムライン投稿の順序保持

### 🔹 コード例（Node.js）

```ts
import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs'

const client = new SQSClient({ region: 'ap-northeast-1' })

const command = new SendMessageCommand({
  QueueUrl: 'https://sqs.ap-northeast-1.amazonaws.com/123456789012/my-queue.fifo',
  MessageBody: '注文データ',
  MessageGroupId: 'order-123',
  MessageDeduplicationId: 'order-123-001'
})

await client.send(command)
````

---

## 🧠 今日の気づき

* NFSはローカルのように使えるが、クラウドスケールには向かない
* S3はグローバルにスケーラブルなオブジェクトストレージ
* CloudFrontと組み合わせることで、S3のパフォーマンスを最適化できる
* FIFOキューは、順序が重要な処理において非常に有効

```
```