OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsでパソコンのシリアル番号の確認方法


# 何台もシリアル確認めんどい

という場合、機種によりますが以下で確認可能なことが多いです。

```
Windowsキー＋R　→　cmdと入力してエンター　→　wmic bios get SerialNumber
```

ただ、もうwmicが無効にされつつあるので、、、

```
Windowsキー＋R　→　powershellと入力してエンター　→　Get-WmiObject Win32_BIOS | select SerialNumber
```

多分こっちはまだ大丈夫なはず。
これでシリアル出てこない場合は、諦めてパソコンひっくり返したり、電池外したりしましょう。

＃★6/7 0:20 追記★
　コメントにワンライナーやメーカー製の案をいただけましたので是非参考にしてみてください。

＃ダメな例
```
C:\Users\usr>wmic bios get SerialNumber
SerialNumber
Default string
```
AI投資チャレンジ #01 - 30代エンジニアが100万を一億円にする話

## はじめに

どうも、augです。都内でITエンジニアをやっている30代独身。

3年後、コーディングって本当に必要なくなるんじゃないか。そんなことを考えていた時、ふと思い出したのが20代の頃にFXで数百万円持っていかれた記憶だった。

高い授業料を払って、何かを学んだつもりになっていた。

でも今度はAIがある。これを使えば何かうまくいくかもしれない。

そんなわけで、100万円を3年で1億円にしてみることにした。

### この記事で分かること
- 30代エンジニアがなぜAI投資にたどり着いたか
- Claude 4を選んだ理由（でも他にいいのが出たら即変える）

> ⚠️ **免責事項**：投資は自己責任です。この記事は体験記録であり、投資助言ではありません。

---

## 第一章：FXで持っていかれた話

20代の頃、FXで数百万円持っていかれた。

エルリック兄弟が人体錬成という禁忌を犯して大切なものを失ったように、僕もまた投資という名の錬金術に手を出して、お金というかけがえのないものを失った。彼らは少なくとも真理の扉を見ることができたが、僕が見たのは残高がゼロになった口座画面だけだった。

お金が増えることを魔法のように信じていた。そして魔法は現実にはないということを、とても高い授業料を払って学んだのだった。あるいは学んだつもりになっていたのかもしれない。

### 失敗の要因
- 感情トレード
- 根拠なし
- 一発逆転狙い

まあ、そういうものだった。

---

## 第二章：一冊の本

書店で手に取った投資本があった。

著者はサラリーマンから投資家になって成功した人物だった。読み終わった時、これならAIと相性がよさそうだと思った。

人間が感情的になる部分をAIに任せて、最終判断は人間がやる。


## 第三章：AI時代の魔法

マトリックスでネオが頭の後ろにプラグを刺してプログラムをダウンロードした後、「I know kung fu」と言うシーンがある。

今AIを使っていると、あれに近い感覚を覚える。知らなかったことを一瞬で使えるようになる。頭の中に新しい回路が追加されたかのように、できなかったことが急にできるようになる。

「こんなコード書いて」と言えば書いてくれる。「この文章を要約して」と言えばやってくれる。

20代の頃に信じていた魔法は存在しなかったが、今度は本当の魔法が目の前にある。これを使わない理由はない。

---

## 第四章：環境を整える

AI投資のために環境を整えることにした。

### PC構成
```
ゲーミングPC                   約23万円
マウス・キーボード              約4万円
```

たけぇ、、、

---

## 第五章：Claude 4を選んだ理由
1. Deep Research機能
2. 長文解析能力
3. 論理的思考
4. 日本語品質

出力がよさげだった。

ただし、もっといいモデルが出たら即乗り換える。

---

## 第六章：システム設計

### 基本方針
```mermaid
graph LR
    A[情報収集] --> B[AI分析]
    B --> C[人間判断]
    C --> D[実行]
```

### 役割分担
- AI担当：データ分析、情報整理、投資候補の抽出
- 人間担当：最終判断、リスク管理、実際の売買

### 目標設定
- 期間: 3年間
- 開始資金: 100万円  
- 目標: 1億円

---

## 第七章：現在の進捗

プロジェクト開始から数日。以下進捗。

### 完了したこと
- ✅ PC注文（今週届く予定）
- ✅ SBI証券にした
- ✅ Claude 4 Deep Research開始
- ✅ 投資対象の基本方針策定

---

## 第八章：AIが分析した投資手法

### Deep Researchの指示
AIに対して、売買対象の株を提案する役割を与えて対象とする個人トレーダーの投資手法を学ぶように指示を出した。

### 結果
用語はわからんが出力よさげだった。以下の指標を教えてくれた。

**ネットキャッシュ比率**というものだった。

```
ネットキャッシュ = 流動資産 + 投資有価証券×70% - 負債総額
ネットキャッシュ比率 = ネットキャッシュ ÷ 時価総額
```

この比率が1.0以上の会社は、理論上「タダで買える」企業らしい。

### スクリーニング条件
AIが教えてくれた条件：

- PER: 10倍以下
- PBR: 1倍以下  
- 時価総額: 500億円以下
- ネットキャッシュ比率: 1.0以上

### 該当企業
この条件で日本株をスクリーニングした結果、23社が該当した。

業種別：
- 卸売業: 6社
- 不動産業: 5社
- 建設業: 3社
- 電気機器: 3社
- その他: 6社

大型株ではなく、小型株に宝が眠っているということだった。

---

## まとめ

100万円を3年で1億円にする。

うまくいくかどうかはわからない。でも、やってみる価値はありそうだ。少なくとも、24回払いが終わる頃には、何かしらの答えが出ているだろう。

リアルタイムの進捗は[@aug20260101](https://x.com/aug20260101)で。

---

*投資は自己責任で。*
UbuntuでPHPのバージョンをアップグレードする

UbuntuでPHPのバージョンをアップグレードするには、以下の手順に従ってください。

---

## ✅ ステップ1：現在のPHPバージョンを確認

まず、現在インストールされているPHPのバージョンを確認します。

```bash
php -v
```

---

## ✅ ステップ2：必要なパッケージをインストール

リポジトリを追加するために、`software-properties-common` パッケージをインストールします。([coskxlabsite.stars.ne.jp][1])

```bash
sudo apt update
sudo apt install software-properties-common
```

---

## ✅ ステップ3：PHPの公式PPAリポジトリを追加

PHPの最新バージョンを提供しているOndřej Surý氏のPPAを追加します。([askubuntu.com][2])

```bash
sudo add-apt-repository ppa:ondrej/php
sudo apt update
```

---

## ✅ ステップ4：目的のPHPバージョンをインストール

例えば、PHP 8.2をインストールする場合は以下のコマンドを実行します。([liquidweb.com][3])

```bash
sudo apt install php8.2
```

必要に応じて、追加のモジュールもインストールします。

```bash
sudo apt install php8.2-cli php8.2-common php8.2-mbstring php8.2-xml php8.2-mysql
```

---

## ✅ ステップ5：PHPのバージョンを切り替え

複数のPHPバージョンがインストールされている場合、`update-alternatives` を使用してデフォルトのバージョンを切り替えることができます。([qiita.com][4])

```bash
sudo update-alternatives --config php
```

表示されるリストから、使用したいPHPのバージョンを選択します。

または、特定のバージョンを直接設定することもできます。

```bash
sudo update-alternatives --set php /usr/bin/php8.2
```

---

## ✅ ステップ6：WebサーバーのPHPバージョンを切り替え（Apacheの場合）

Apacheを使用している場合、モジュールを切り替える必要があります。

```bash
sudo a2dismod php7.4
sudo a2enmod php8.2
sudo systemctl restart apache2
```

これにより、Apacheで使用されるPHPのバージョンが切り替わります。

---

## ✅ ステップ7：PHPのバージョンを確認

最終的に、PHPのバージョンが正しく切り替わったかを確認します。

```bash
php -v
```

これで、Ubuntu上のPHPのバージョンアップが完了です。

---

[1]: https://coskxlabsite.stars.ne.jp/html/memo2/phponubuntu.html?utm_source=chatgpt.com "ubuntu に PHPをインストールする 20230216"
[2]: https://askubuntu.com/questions/565784/how-do-i-upgrade-php-version-to-the-latest-stable-released-version?utm_source=chatgpt.com "How do I upgrade PHP version to the latest stable released version?"
[3]: https://www.liquidweb.com/help-docs/install-php-on-ubuntu/?utm_source=chatgpt.com "Upgrading or Installing PHP on Ubuntu — PHP 8.2 and Ubuntu 22.04"
[4]: https://qiita.com/office_porco/items/afadee7a140b1b66c9d9?utm_source=chatgpt.com "Ubuntu環境でPHP 8からPHP 7に変更してCakePHPを使う - Qiita"
Laravel 12 + Fortify　その1　カスタム認証を実装する方法

## はじめに
Laravel 12は2024年2月リリースのLTS版です。  
この記事では、Laravel 12環境でFortifyを使い、カスタム認証（例えばユーザーコードでのログイン）を実装する方法を解説します。

---

## 前提条件

- Laravel 12 プロジェクト（インストール済み）
- Fortify 導入済み
- 基本的なLaravelの知識

---

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

```bash
composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\\Fortify\\FortifyServiceProvider"
php artisan migrate
```

---

## 2. FortifyのServiceProviderを有効化

`config/app.php` の `providers` に  
`Laravel\Fortify\FortifyServiceProvider::class` が含まれていることを確認。

---

## 3. Fortifyのカスタム認証ロジックを追加

`app/Providers/FortifyServiceProvider.php` を編集します。

```php
use Illuminate\Http\Request;
use Laravel\Fortify\Fortify;
use Illuminate\Support\Facades\Hash;
use App\Models\User;

public function boot()
{
    Fortify::authenticateUsing(function (Request $request) {
        // 例: ユーザーコード認証
        $user = User::where('user_code', $request->user_code)->first();

        if ($user && Hash::check($request->password, $user->password)) {
            return $user;
        }
        return null;
    });
}
```

---

## 4. バリデーションの追加

`app/Actions/Fortify/AttemptToAuthenticate.php` など、必要に応じてリクエストバリデーションを調整します。

```php
public function rules(Request $request)
{
    return [
        'user_code' => ['required', 'string'],
        'password' => ['required', 'string'],
    ];
}
```

---

## 5. ログインリクエストの例

POST `/login` に対し、以下のようなJSONでリクエストします。

```json
{
    "user_code": "sample123",
    "password": "secret"
}
```

---

## 6. まとめ

Laravel 12でもFortifyを使うことで、簡単にカスタム認証を実装できます。  
`Fortify::authenticateUsing` を活用し、独自の認証要件にも柔軟に対応しましょう。

---

### 参考リンク

- [Laravel 12公式ドキュメント](https://laravel.com/docs/12.x/)
- [Laravel Fortify公式ドキュメント](https://laravel.com/docs/12.x/fortify)
各アプリやサービスごとに異なるパスワードを設定するメリットとは？

各アプリやサービスごとに異なるパスワードを設定することは、オンラインセキュリティを強化する上で非常に重要です。以下に、その主なメリットを詳しく説明します。

---

🔐 1. 一つの情報漏洩が他のアカウントに波及するのを防ぐ

同じ<a href="https://idprotect.trendmicro.com/ja-jp/vault/tool/password-generator">パスワード</a>を複数のアカウントで使い回すと、1つのサービスで情報が漏洩した際に、他のアカウントも不正アクセスの危険にさらされます。これを「クレデンシャルスタッフィング攻撃」と呼び、攻撃者は漏洩した認証情報を使って他のサービスにログインを試みます。各アカウントに異なるパスワードを設定することで、このような連鎖的な被害を防ぐことができます。

---

🧩 2. アカウントごとのセキュリティを強化

異なるパスワードを使用することで、各アカウントのセキュリティを個別に保つことができます。万が一、1つのアカウントが侵害されても、他のアカウントへの影響を最小限に抑えることができます。これにより、個人情報や財務情報などの重要なデータを守ることができます。 

---

🛡️ 3. パスワードマネージャーの活用で管理が容易に

複数の強力なパスワードを覚えるのは困難ですが、<a href="https://pwd-generator.xyz/">パスワード生成</a>が可能なパスワードマネージャーを利用することで、これらを安全に管理できます。パスワードマネージャーは、強力なパスワードの自動生成や、各デバイス間での同期、ログイン情報の自動入力などの機能を提供し、ユーザーの利便性とセキュリティを向上させます。

---

✅ まとめ

各アプリやサービスごとに異なるパスワードを設定することで、セキュリティリスクを大幅に低減できます。パスワードマネージャーの活用により、複雑なパスワードの管理も容易になります。これらの対策を講じることで、オンライン上の個人情報や資産を守ることができます。
すごいHaskellで飛ばしたとこメモ

むずくて何箇所か飛ばした
あとで戻ってちゃんと理解したい

**9.6 ランダム性**
ByteStringだのなんだの出て来て飛ばした
random呼びたいだけなのにダルすぎだろってぶっちゃけ思った
乱数使いたくなったらちゃんと読む

**10.2 ヒースロー空港からロンドンへ**
動的計画法っぽいやつ
foldの挙動はわかるけど、foldに複雑な関数渡すやつまじわからん
ChatGPTに同様のコードをPythonで書かせたら超読みやすくて、やっぱPythonしか勝たんとは特にならなかった。俺がHaskellの良さを理解できてないだけ。しっかりしろ

むずいけど頑張る。一周は頑張る。モナド未履修でHaskell勉強してましたとは言えない。
次はアプリカティブ。がんばろ。
html table

私はウェブ開発の勉強をしているときに、HTMLについて学びました。特にその中で「HTMLの表（テーブル）」について学んだことがとても印象に残っています。
今日は、そのHTMLテーブルについて少し紹介したいと思います。
HTMLのテーブルは、データを行（row）と列（column）で整理して表示するのに便利な要素です。基本的なテーブルは、<table> タグを使って作成されます。行は <tr>、ヘッダーセルは <th>、データセルは <td> を使って構成します。
<table>
  <tr>
    <th>名前</th> (table heading)
    <th>年齢</th>
  </tr>
  <tr>
    <td>太郎</td> (table data)
    <td>25</td>
  </tr>
  <tr> (table row)
    <td>花子</td>
    <td>30</td>
  </tr>
</table>
【備忘録】Pacemakerでcrmshからpcsへの移行時に起きた問題

## 結論

エスケープするだけ


## あらすじ

組み込みノード属性を用いたlocation設定をしようとしてもシェルに弾かれる。

```sh
pcs constraint location <リソース名> rule score=XXX #uname eq <ホスト名>
```

## 事前に用意された組み込みノード属性の一覧

コメント扱いになっているのか組み込みノード属性の部分以降が通らない。

`#uname`
`#id`
`#kind`
`#is_dc`
`#cluster_name`
`#site_name`
`#role`

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/configuring_and_managing_high_availability_clusters/determining-resource-location-with-rules

## まとめ

気を取り直してバックスペースを入れるとコマンドは通る。
`pcs cluster cib <ファイル名>`で設定値をエクスポートして
確認するとattribute="#uname"が入っていたので無事に登録できた。

```sh
pcs constraint location <リソース名> rule score=XXX \#uname eq <ホスト名>
```

## 参考資料


https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/configuring_and_managing_high_availability_clusters/configuring-constraint-using-rules
Windowsでエラーメッセージのコピー方法


# 何かエラーメッセージ出てるけど、手打ちで調べるのめんどい

という場合、割と「`Ctrl＋C`」で行けます。

例えば、、、
```
Windowsキー＋R　→　aaaと入力してエンター
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/3b16e66b-1b14-4074-a2d4-4e903fe1e8fa.png)

エラーメッセージを一回クリックしてフォーカスして、「`Ctrl＋C`」。
特に反応はないですが、そのままメモ帳などに「`Ctrl＋V`」で貼り付けると、、、
```
[Window Title]
aaa

[Content]
'aaa' が見つかりません。名前を正しく入力したかどうかを確認してから、やり直してください。

[OK]
```
JavaScript版OpenAI Agents SDKでMCPをやってみる

https://x.com/OpenAIDevs/status/1929950489539686901

https://openai.github.io/openai-agents-js/ja/

今朝OpenAI Agents SDKのJavaScript版が登場したので、早速使ってみました。

以前Python版で同じことをしてみたときの記事↓

https://qiita.com/suzuki_sh/items/3a9f94e3ddada7979d27

## 環境
- Debian: 12.11 (ChromeOS Linux開発環境)
- mise: 2025.4.5 linux-x64
- node: v24.1.0
- @openai/agents: 0.0.1

## 実装
適当に環境構築します。

```
$ mise use node
$ npm init -y
$ npm install @openai/agents
```

`.env`に`OPENAI_API_KEY`を入れておきます。

まずMCP無しの挙動を確認します。LLMに「いま何時？」と聞いてみますが、そのままでは答えてくれません。

```js:index.js
import { Agent, run } from '@openai/agents';

const agent = new Agent({
  name: 'アシスタント',
  instructions: 'あなたは優秀なアシスタントです',
  model: 'gpt-4.1-mini'
});

const result = await run(agent, 'いま何時？');

console.log(result.finalOutput);
```

```
$ node index.js
ごめんなさい、現在の時刻を確認することはできません。お使いのデバイスで時間を確認してください。
```

### 関数ツールによる実装
MCPを使わず、[OpenAI Agents SDKの関数ツール](https://openai.github.io/openai-agents-js/ja/guides/tools/)を使ってみます。現在時刻を取得する`getTimeTool`を実装して、同じく「いま何時？」を実行してみます。

```js:index.js
import { Agent, run, tool } from '@openai/agents';

const getTimeTool = tool({
  name: 'get_time',
  description: '現在時刻を調べる',
  parameters: {
    type: 'object',
    properties: {},
    required: [],
    additionalProperties: false,
  },
  async execute(_input) {
    return new Date();
  },
});

const agent = new Agent({
  name: 'アシスタント',
  instructions: 'あなたは優秀なアシスタントです',
  model: 'gpt-4.1-mini',
  tools: [getTimeTool]
});

const result = await run(agent, 'いま何時？');

console.log(result.finalOutput);
```

```
$ node index.js
現在の時刻は日本時間で2025年6月4日午後10時11分頃です。何か他に知りたいことはありますか？
```

うまく行きました。とてもシンプルな実装でツール呼び出しを実現できました。

### MCPを使う場合
同じことをMCPでも実装してみます。`$ npm install @modelcontextprotocol/sdk`で、MCPのSDKをインストールし、現在時刻を取得するMCP Serverを`whattime.js`に定義します。

```js:whattime.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new McpServer({
  name: "WhatTime",
  version: "1.0.0"
});

// 現在時刻を取得する関数
server.tool("whattime",
  {},
  async ({}) => ({
    content: [{ type: "text", text: new Date() }]
  })
);

const transport = new StdioServerTransport();
await server.connect(transport);
```

このMCP Serverを呼び出すコードを書きます。

```js:index.js
import { Agent, run, tool } from '@openai/agents';
import { MCPServerStdio } from '@openai/agents-core/_shims';

const mcpServer = await new MCPServerStdio({
  "command": "node",
  "args": ["whattime.js"],
});
await mcpServer.connect();

const agent = new Agent({
  name: 'アシスタント',
  instructions: 'あなたは優秀なアシスタントです',
  model: 'gpt-4.1-mini',
  mcpServers: [mcpServer]
});

const result = await run(agent, 'いま何時？');

console.log(result.finalOutput);
```

```
$ node index.js 
現在の時刻は2025年6月4日 13時26分（UTC）です。日本時間など他のタイムゾーンの時刻が知りたい場合は教えてください。
```

無事、JavaScript版OpenAI Agents SDKでもMCPをつかう事ができました。
GodotでCesium(3DTiles)を使う

# はじめに

最近Godotを触っているんですが、やっぱりUnityの方が地理情報系のアセットは充実してるなーと思っていました。

以下のPostで、Cesiumが動くっぽいということを知ったので実際に動かしてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Godot用の3D Tiles！？<a href="https://t.co/r9aAgYRUav">https://t.co/r9aAgYRUav</a></p>&mdash; のこのこ@Python/Rustで3D/GISやるエンジニア (@nokonoko_1203) <a href="https://twitter.com/nokonoko_1203/status/1929683386484043919?ref_src=twsrc%5Etfw">June 2, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境

Windows 11
Godot 4.4

# プラグインをプロジェクトにインストールする

リポジトリは[ここ](https://github.com/Battle-Road-Labs/3D-Tiles-For-Godot)

[Release](https://github.com/Battle-Road-Labs/3D-Tiles-For-Godot/releases)にビルド済みのものがあるので、`3D_Tiles_For_Godot_v1.0.0_Win64.zip`をダウンロードして展開します。

Godotのプロジェクトを新規で作成します。現時点で対応しているのはForward+のレンダラーのみということなので、そう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/0a22222a-defa-4807-b0d7-bd59446a485d.png)

Zipの中には`addons`と`bin`の二つのフォルダがあるので、Godotのプロジェクトのルートに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/a3698bb7-3499-4a65-b6e3-16201260df06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/f5397991-54d6-4f99-81ca-2dd5d643d946.png)

プロジェクト設定で、プラグインを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/64d6ee4b-3219-4bda-990f-7751df685dda.png)

そうすると、`Cesium Ion Panel`というのが右側のドックに追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/75cca86a-6b6a-4098-a12f-6ab5da7194bd.png)
（出てこない場合は、エディタ→エディタドックから出せます。）

# シーンの作成とCesiumの組み込み

ここで、シーンを作っていない場合は、`Node3D`などをルートにしてシーンを作ります。

ここからは、`Cesium Ion`のアカウントを用意して進めてください。

パネルの一番下にある`Connect to Cesium ION`を押すとブラウザが立ち上がり、認証プロセスが進むので、適切に認証を完了してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/65ee4593-d1af-44f3-8f7b-651a15853552.png)

そうすると、`Quick Add Cesium ION Assets`の各ボタンが押せるようになります。
これを押すと、自動で現在のシーンに、それぞれのプリセットされたアセットが追加されます。

以下は、Google Photorealistic 3D Tilesを追加したところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/fd3bda5e-d6af-426d-8115-35301640ae6d.png)

`Cesium Ion Panel`で、`Dynamic Camera`を追加しておくと、標準的な操作で移動できるカメラが追加されます。

Cameraには`Globe Node`という参照があり、ここに`CesiumGeoreference`がセットされていないとエラーになるようです。セットされていなければセットしておきます。

これで実行すると、Cesiumから3DTilesがロードされて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/073b327e-859e-4d10-b014-d5b35991953f.png)

# カスタマイズ

`CesiumGeoreference`のインスペクターで、どこを表示するかの設定ができます。
`Latitude`、`Longitude`、`Altitude`をそれぞれ設定すると好きな場所に移動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/fc334fff-b54e-4b8e-926c-cc91e0d1f341.png)

`Cesium3DTileset`のインスペクターで、`Data Source`、`Ion Asset ID`などを変更することで別のデータを表示することができそうです。`Ion Asset ID`を試しにCesiumIONで公開されているPLATEAUのデータセットのIDに変更したところ、読み込みはできました。（データに非対応のものがあったのか、正常な表示にはなりませんでした。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/ce544437-60df-4b09-9a03-f2df8cbabe60.png)

# その他の使う上で困ったこと

カメラが地面に沿ったものになるので、Skyboxの表示と齟齬が生じます。なんかいい解決方法ないかな。
統計検定準1級・第32章の勉強したことをまとめた

# 乱数とモンテカルロ法
乱数とは, でたらめな数を次々に作る方法、またはそうして生成された数列を指す.

物理乱数：物理現象を利用した乱数

議事乱数：漸化式などに基づく乱数


# モンテカルロ法
$\pi$ を求める問題などで用いられる.

**例1**

$N$ 組の乱数中で $U^2 + V^2 < 1$ となる乱数の組の個数 $M$ とすると, $\pi$ は $\hat{\pi} = \frac {4M} {N}$ となる. $M$ は二項分布 $Bin(N, \frac {\pi} {4})$ に従うので,

$$
V[M] = N \frac {\pi} {4} (1 - \frac {\pi} {4})
$$

より, $\hat{\pi} = \frac {4M} {N}$ の標準偏差は

``` math
\begin{align}
SD(\frac {4M} {N}) &= \sqrt{V(\frac {4M} {N})} \\
&= \sqrt{\frac {16} {N^2} V(M)} \\
&= \sqrt{\frac {16} {N^2} N \frac {\pi} {4} (1 - \frac {\pi} {4})} \\
&= \sqrt{\frac {\pi(4 - \pi)} {N}}
\end{align}
```

したがって, $SD(\pi) = 0.01$ とすると,

``` math
\begin{align}
\sqrt{\frac {\pi(4 - \pi)} {N}} &= 0.01 \\
\frac {\pi(4 - \pi)} {N} &= 0.01^2 \\
N &= \frac {\pi(4 - \pi)} {0.01^2}
\end{align}
```

# 乱数生成・逆関数法

　あらゆる確率分布に従う乱数生成は, 一様分布からの乱数, つまり一様乱数の発生に基づいて行われる. 区間 $(0,1)$ の一様分布に従う確率変数を $U$ とする.

　1変量の確率変数 $X$ が確率密度関数 $p_X(x)$ と分布関数 $F_X(x)$ と持つとする. もし, $F_X(x)$ の逆関数 $F_X^{-1}(u)$ がように得られる場合, 次の逆関数法と呼ばれる方法で $X$ の乱数が生成できる.

1. $U(0,1)$ から一様乱数 $u$ を 1 つ得る
2. $x = F_X^{-1}(u)$ とする.

逆関数法で $X$ の乱数が生成できることは, 以下が成り立つためである.

$$
P(F_X^{-1}(U) < x) = P(U < F_X(x))) = F_X(x)
$$

最後の指揮変形は, $U$ が一様分布に従う確率変数のため $P(U<u)=u$ より成り立つ.

つまり, $F_X^{-1}(U)$ に従う確率変数の累積分布関数が, $F_X(x)$ の分布関数と等しいことを示している.

**例2**

$X$ の累積分布関数は

$$
F_X(x) = \int_{0}^{x} 2e^{-2x} dx = 1 - e^{-2x}
$$

であるので,

$$
F_X^{-1}(u) = - \frac {1} {2} \log (1 - u)
$$

である. また, $U \sim U(0,1)$ のとき $1-U \sim U(0,1)$ であるから, 以下のように逆関数法により $x$ の乱数が生成できる.

1. $U(0,1)$ から一様乱数 $u$ を 1 つ得る
2. $x = - \frac {1} {2} \log (1 - u)$ とする.

# モンテカルロ積分

　関数 $g(x)$ の区間 $(0,1)$ 上の積分を推定する問題を考える.

$$
\theta = \int_0^1 g(x)dx
$$

確率変数 $X$ が $U(0,1)$ に従うとき,

$$
\theta = \int_0^1 g(x) \cdot 1dx = E[g(X)]
$$

したがって, $X_1, ..., X_m$ が$U(0,1)$ からの無作為標本とするとき, 対数の弱法則より,

$$
\hat{\theta} = \frac {1} {m} \sum_{i=1}^{m} g(X_i)
$$

このように, $m$ 個の $U(0,1)$ 上の一様乱数を発生させ, $\frac {1} {m} \sum_{i=1}^{m} g(X_i)$ で推定する方法を単純モンテカルロ積分という.

**例4**

一様乱数として $U(2,5)$ を使うので,

$$
I = \int_2^5 (5-2) e^{-x} \frac {1} {5-2} dx = \int_2^5 3e^{-x} \frac {1} {3} dx
$$

よって, $g(x) = 3e^{-x}$ とおくことで, 単純モンテカルロ法は次のとおりである.

1. $U(2,5)$ から独立な一様乱数を $m$ 個とる
2. $\hat{I} = \frac {1} {m} \sum_{i=1}^{m} 3e^{-x_i}$ とする.
Google Drive MCPの設定手順とトラブルシューティング

## はじめに

Claude DesktopでGoogle Drive MCPを使用する際の設定手順と、発生した問題の解決方法についてまとめました。

## 環境

- macOS
- Claude Desktop
- Node.js(あらかじめDLしておいてください)
  - ダウンロードリンク: [https://nodejs.org/ja/download/](https://nodejs.org/ja/download/) (LTS版を推奨)
- Google Cloud Platform

## 問題の概要

Google Drive MCPを設定しようとしたところ、以下のようなエラーが発生しました：

```
Credentials not found. Please run with 'auth' argument first.
```
Google Drive API の認証が完了していませんでした。

## 解決手順

### 1. Google Cloud Projectの作成

1. [Google Cloud Console](https://console.cloud.google.com/) にアクセス
2. 新しいプロジェクトを作成または既存のプロジェクトを選択
3. APIs & Services > Library から「Google Drive API」を有効化
4. APIs & Services > Credentials で OAuth 2.0 認証情報を作成

### 2. OAuth認証情報の作成

1. 「+ CREATE CREDENTIALS」をクリック
2. 「OAuth client ID」を選択
3. アプリケーションタイプで「Desktop application」を選択
4. 名前を入力（例：「Claude MCP」）
5. 「CREATE」をクリック

### 3. 認証ファイルの配置

1. 作成された認証情報のダウンロードアイコンをクリック
2. JSONファイルをダウンロード
3. ファイル名を `gcp-oauth.keys.json` に変更
4. 以下のいずれかの方法で配置：

```bash
# 方法1: 環境変数で指定
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/gcp-oauth.keys.json"

# 方法2: ホームディレクトリに配置
mkdir -p ~/.gcp
mv gcp_oauth.keys.json ~/.gcp/gcp-oauth.keys.json
```

### 4. リダイレクトURIの設定

Google Cloud Consoleで以下のURIを追加：

```
http://localhost:3000/
http://localhost:3000
http://localhost:8080/
http://localhost:8080
http://localhost:49286/
http://localhost:49286
http://127.0.0.1:3000/
http://127.0.0.1:3000
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/ebe0c26a-12df-4cc1-bb86-dfb17a9bc3f4.png" width="450">

### 5. OAuth同意画面の設定

1. APIs & Services > OAuth consent screen
2. テストユーザーに自分のGoogleアカウントを追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/8c5d89d7-1859-4ad7-89ac-becb2ad51213.png" width="450">

### 6. 認証の実行

コマンドでもう一度認証を実行しましょう。

```bash
npx @modelcontextprotocol/server-gdrive auth
```

## 注意点

- リダイレクトURIは末尾のスラッシュ（/）の有無両方を設定する必要があります
- 設定変更後は数分待ってから再試行してください
   - ここ重要!
- 新しい認証情報ファイルをダウンロードして使用してください
   - 古い認証情報ファイルは削除してください

## 完了後の確認

認証が完了したら、Claude Desktopを再起動してGoogle Driveの検索機能が使用できることを確認してください。

私の場合、末尾のスラッシュの有無で引っかかっていましたが、リダイレクトURIにスラッシュ入りも追加したところで動作しました。

リダイレクトのエラーが発生するとこんなエラーが出ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/46d08e48-0b27-4f0a-8266-0856c8814226.png" width="450">

そのことをClaudeに報告すると祝ってくれました。

> 素晴らしいです！認証が成功して良かったです。
>
> 末尾のスラッシュが原因だったんですね。OAuth 2.0では、リダイレクトURIが完全に一致する必要があるため、`http://localhost:3000` と `http://localhost:3000/` は異なるURIとして扱われます。
>
> ## 次のステップ
>
> これでGoogle Drive MCPが使用できるようになりました。Claude Desktopを再起動して、Google Driveの検索機能を試してみてください。
>
> ```bash
> # Claude Desktopを再起動後、以下のような検索が可能になります
> # - "presentation"というファイルを検索
> # - "2024年の売上"に関する資料を探す
> # など
> ```
>
> 何か他にGoogle Drive MCPで試したいことや、設定で困ったことがあれば教えてください！

## 参考リンク

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Google Cloud Console](https://console.cloud.google.com/)
- [Google Drive API](https://developers.google.com/drive/api/reference/rest/v3)

## まとめ

Google Drive MCPの設定は、OAuth認証の設定が最も重要なポイントです。特にリダイレクトURIの設定は、末尾のスラッシュの有無まで完全に一致させる必要があります。この記事が、同様の問題に遭遇した方の参考になれば幸いです。
Windowsで怒られないhostsの編集方法


# hosts編集で管理者権限じゃないと怒られる

という場合、以下の手順でやってみましょう。

```
Windowsキー＋R　→　cmdと入力して、Ctrl＋Shift押しながらエンター
```

管理者権限コマンドプロンプトで以下を実行。

```
copy c:\Windows\System32\drivers\etc\hosts c:\Windows\System32\drivers\etc\hosts_bk
notepad c:\Windows\System32\drivers\etc\hosts
```
これなら保存しても怒られないはず。
差分チェックは以下の通り。
```
fc c:\Windows\System32\drivers\etc\hosts c:\Windows\System32\drivers\etc\hosts_bk
```
Webアプリ開発におけるGETとPOSTの使い分け

# はじめに

Webアプリケーションの開発において、**GET**と**POST**は最も基本的なHTTPメソッドです。しかし、「いつGETを使い、いつPOSTを使うべきか？」が曖昧なまま実装してしまうと、セキュリティやパフォーマンス、可読性に悪影響を与える可能性があります。

この記事では、GETとPOSTの使い分けの原則や具体的な使用例を整理し、より良いAPI設計・ルーティング設計を行うための指針を紹介します。

🧪 結論：GETは**取得**、POSTは**送信・作成**

| メソッド   | 主な用途          | 特徴                                                                      |
| ------ | ------------- | ----------------------------------------------------------------------- |
| `GET`  | データの**取得**    | パラメータはURLに含まれる（クエリ文字列）<br> ブラウザのキャッシュ対象になることがある<br> 何度実行しても結果が変わらない（冪等） |
| `POST` | データの**作成・送信** | パラメータはボディに含まれる<br> キャッシュされない<br> 実行するたびに結果が変わる可能性がある（非冪等）               |

# 1. GETを使うべきケース

* データを「取得するだけ」のとき
* URLをブックマークや共有したいとき
* 検索や一覧表示など「読み取りのみ」の処理を行うとき

```ts
GET /users                // 全ユーザー一覧の取得
GET /users/123            // 特定ユーザーの取得
GET /search?q=react       // クエリを元に検索
```

# 2. POSTを使うべきケース

* サーバー側のデータを変更する（新規作成、更新、削除）とき
* 大量のデータや機密データを送信したいとき
* フォーム送信やファイルアップロードを伴うとき

```ts
POST /users               // ユーザーの新規作成
POST /login               // ログイン処理（トークン生成）
POST /contact             // 問い合わせ送信
```

# よくある誤解と注意点

**❌ GETで副作用のある処理を実行してしまう**


```ts
GET /deleteUser?id=123  // 削除はGETでやるべきではない
```

このような設計は、ユーザーがリンクをクリックしただけで重要な操作が実行されてしまい非常に危険です。**副作用がある処理には必ずPOST、PUT、DELETEなどを使うべきです。**

**🛡️ セキュリティ的観点**

* **GETリクエストはURLにデータが含まれる**ため、機密情報（パスワードやトークン）は絶対に含めてはいけません。
* **POSTはCSRF対策**が必要になる場合があります。フォーム送信時はトークンを付けるなどの対応が必要です。

**📦 まとめ**

| シチュエーション     | 推奨メソッド              |
| ------------ | ------------------- |
| 一覧表示・検索      | GET                 |
| 詳細表示         | GET                 |
| 新規登録         | POST                |
| ログイン         | POST                |
| 削除・更新など副作用あり | POST（またはPUT/DELETE） |

# 補足： 冪等性（べきとうせい）とは？

**同じ操作を何度繰り返しても、結果が変わらない性質**のことです。

✅ 冪等な操作（GET）

```bash
GET /users/123
```

* このリクエストを何回送っても、「IDが123のユーザー情報」が返ってくるだけ。
* サーバーのデータは変わらない → 冪等

❌ 非冪等な操作（POST）

```bash
POST /users {"name": "Taro"}
```

* 実行するたびに新しいユーザーが作成される。
* 毎回サーバーの状態が変わる → 非冪等

**📘 なぜ冪等性が重要？**

* **APIを安全に再実行できるか**の判断基準になります。
* ネットワークエラーでリトライが発生したとき、冪等であれば安心して再送できる。
* REST APIの設計原則でも「GET/PUT/DELETEは冪等であるべき」とされています。

**📝 補足：HTTPメソッドと冪等性**

| メソッド   | 冪等性                      |
| ------ | ------------------------ |
| GET    | ✅ あり（データ取得）              |
| POST   | ❌ なし（新規作成など）             |
| PUT    | ✅ あり（上書き）                |
| DELETE | ✅ あり（すでに削除済みでもOKとする設計なら） |

何度同じリクエストを送っても**結果（サーバー側の状態）が変わらないこと**が「冪等性」のポイントです。開発者は、特にAPIを設計するときにこの概念を意識すると、安全で再利用性の高い設計ができます。

# おわりに

GETとPOSTの使い分けはWebアプリの設計の基本ですが、守られていないケースも多く見受けられます。この記事が、エンドポイント設計をより適切に行うための助けになれば幸いです。
MulmoScript Ghibli Styleで自分の作品を映像化してみた

# 元MSのエンジニアの中島聡さんが開発した「MulmoScript Ghibli Style」で自分の作成した物語を動画にしてみた。

以下で公開中の作品をそのままプロンプトに投げた。

https://kakuyomu.jp/works/16818622171329991502/episodes/16818622171330060761

コミック化と同様にAI用の以下のスクリプトが出力された。

{
"\$mulmocast": {"version": "1.0", "credit": "closing"},
"title": "The Unrivaled Sword Dancer",
"lang": "en",
"references": \[],
"beats": \[
{"text": "In a dusty, dimly lit dojo, the only sounds are the swish of bare feet on tatami and sharp, steady breaths. Here, a young man named Jin Kazama practices alone, his movements a blend of precision and grace. Once the training ground of legendary swordsmen, the dojo now echoes with a new rhythm."},
{"text": "Jin calls his movements sword forms—but even he knows it’s more than that. Over time, his practice has fused with music, transforming into a unique dance that stirs his soul. He resists calling it 'dance,' clinging to the pride of a swordsman."},
{"text": "His childhood friend Saya catches him in the act, teasing him: 'That's not a kata—that's a dance!' Her words sting, but also reveal a truth he can't deny. Jin feels liberated in these movements, even if he struggles with what they mean for his identity."},
{"text": "The dojo, once revered, now stands forgotten. Jin, torn between heritage and passion, wonders aloud: 'What’s the point of all this?' Saya, ever supportive, tells him his dance is captivating—that it still holds power."},
{"text": "One day, Jin notices a poster in town: 'Dance Battle Tournament – Grand Prize: ¥1,000,000.' A spark ignites. Could this be his chance to reclaim pride through a new path? Saya encourages him: 'Show them what a sword dancer can do.'"},
{"text": "Night after night, Jin trains. He uses futons as props—leaping, spinning, and perfecting moves that blend the lethal edge of swordplay with the fluidity of dance. His new style, 'kenbu' or sword-dance, begins to take shape."},
{"text": "On the tournament day, the stage lights blaze. Jin breathes deep, recalling the dojo, his lineage, his evolution. As music plays, he unleashes a performance like no other—elegant, deadly, and awe-inspiring. The crowd erupts: 'It’s like swordplay in motion!'"},
{"text": "Jin wins the tournament. Backstage, Saya hugs him: 'You really are unrivaled, Jin!' He smiles, the weight lifting. 'Maybe now, I’ve restored the dojo’s soul.'"},
{"text": "Word spreads. Young people flock to the dojo, eager to learn 'kenbu.' Jin becomes a pioneer of a new tradition—one that honors the past while dancing boldly into the future."}
],
"canvasSize": {"width": 1536, "height": 1024},
"imageParams": {"style": "<style>A multi panel comic strips. Ghibli style. The presenter is a young woman with a dark short hair with glasses.</style>"}
}

これをSoraに投げると以下の動画が作成された。

https://www.youtube.com/shorts/Hz5s9cmcwm4

従来の動画編集のように自分で加工すればもっといい作品になるのかなと感じました。
NVIDIA NGC PyTorchコンテナで発生する「AssertionError: libcuda.so cannot found!」の解決策

NVIDIA NGCで公開されているPyTorchコンテナイメージ（例: `nvcr.io/nvidia/pytorch:25.04-py3`）をApptainer（旧Singularity）で使用する際に、「AssertionError: libcuda.so cannot found!」というエラーに遭遇することがあります。
これは、特に`torch_compile`などの機能を使用しようとした際に顕著に現れる問題です。

このエラーは、コンテナ内のCUDAライブラリへのシンボリックリンクが正しく設定されていないことが原因で発生します。
本記事では、この問題に対する具体的な解決策を、筆者が実際に問題を解決した手順に基づいて解説します。

## 問題の発生状況

筆者の環境では、Apptainerを用いてNGCのPyTorchコンテナ（`nvcr.io/nvidia/pytorch:24.03-py3`を`pytorch_24.03.sif`としてプル）を実行し、`torch_compile`を含む処理を実行しようとした際に、以下のエラーが発生しました。

```
AssertionError: libcuda.so cannot found!
Possible files are located at ['/usr/local/cuda/compat/lib/libcuda.so.1'].
Please create a symlink of libcuda.so to any of the files.
```

調査の結果、エラーメッセージで示されている`libcuda.so.1`の実体は、`/usr/local/cuda/compat/lib.real/`に存在することが判明しました。

## 解決策：Sandboxへの変換とシンボリックリンクの作成

この問題を解決するためには、Apptainerのコンテナイメージを書き込み可能な「sandbox」形式に変換し、その内部で必要なシンボリックリンクを作成した後、改めてSIFファイルとしてビルドし直す方法が有効です。

以下に手順を詳述します。

### 1. SIFファイルをSandbox形式に変換する

まず、ダウンロードしたSIFファイル（例: `pytorch_24.03.sif`）を、書き込み可能なsandboxディレクトリに変換します。,

```bash
apptainer build --sandbox pytorch_sandbox_2403 pytorch_24.03.sif
```

*   `--sandbox`: コンテナを書き込み可能なディレクトリ（sandbox）として作成するオプション
*   `pytorch_sandbox_2403`: 作成されるsandboxディレクトリの名前
*   `pytorch_24.03.sif`: 元となるSIFファイル

### 2. Sandboxに入り、シンボリックリンクを作成する

次に、作成したsandboxディレクトリにApptainerシェルで入り、必要なシンボリックリンクを作成します。

```bash
apptainer exec --nv --writable pytorch_sandbox_2403 bash -lc 'cd /usr/local/cuda/compat && ln -s lib.real lib'
```

*   `apptainer exec`: コンテナ内でコマンドを実行するためのコマンド
*   `--nv`: ホストのNVIDIA CUDAライブラリをコンテナにマウントするためのオプション
*   `--writable`: sandboxディレクトリへの書き込みを許可するためのオプション
*   `pytorch_sandbox_2403`: シンボリックリンクを作成する対象のsandboxディレクトリ
*   `bash -lc '...'`: コンテナ内で実行するコマンド
    *   `cd /usr/local/cuda/compat`: シンボリックリンクを作成するディレクトリに移動
    *   `ln -s lib.real lib`: `lib.real`ディレクトリへのシンボリックリンクとして`lib`を作成

この操作により、`/usr/local/cuda/compat/lib/libcuda.so`が正しく存在するように設定され、Triton（や`torch_compile`）がドライバーを正常にロードできるようになります。

### 3. 修正済みSandboxから新しいSIFファイルをビルドする (任意)

Sandbox形式のままでも使用可能ですが、配布や管理の観点から、修正を適用したsandboxを再びSIFファイルとしてビルドし直すことを推奨します。

```bash
apptainer build pytorch_fixed.sif pytorch_sandbox_2403
```

*   `pytorch_fixed.sif`: 新しく作成される修正済みSIFファイルの名前
*   `pytorch_sandbox_2504`: 元となる修正済みのsandboxディレクトリ

この新しい`pytorch_fixed.sif`を使用することで、`AssertionError: libcuda.so cannot found!`の問題が解決されているはずです。

## まとめ

NGCのPyTorchコンテナで`libcuda.so`が見つからないエラーは、コンテナ内のCUDAライブラリのパス設定が原因で発生します。Apptainerの`--sandbox`オプションを活用してコンテナを書き込み可能にし、手動でシンボリックリンクを作成することで、この問題を効果的に解決できます。この手順を踏むことで、`torch_compile`などの機能も正常に動作するようになります。

## 参考
https://forums.developer.nvidia.com/t/triton-runtime-error-in-ngc-pytorch-25-04-apptainer-container-libcuda-so-not-found/332378/1

https://apptainer.org/docs/user/latest/build_a_container.html
AI補完エディタを使って気づいたこと

## はじめに

ここ2週間ほど、AIを搭載したエディタ「windsurf」を使って開発を行った。
少しコードを書くだけで、次に書こうとしているコードを提案・補完してくれるこの機能にすごく感動している。

ただ同時に、「もうエンジニアってそこまで技術力いらないのでは？」という疑問も湧いてきた。
しかし、実際に使い続けてみると、そんなに単純な話でもないということに気づかされた。

---

## AI補完は便利、でも完璧ではない

AIは確かに、コードを高速に提案してくれます。
ただし、補完されたコードが「正しい」かどうかは別問題。非効率な実装であったりすることも多々ある。

---

## 結局、判断するのは人間

コードの良し悪しを判断し、修正したり設計したりするのは人間の役割。
どれだけAIが進化しても、プロジェクトの全体像や要件、パフォーマンス要件、セキュリティの観点を理解して判断するのはエンジニア自身。

そして、その判断力を支えてくれるのが、やはり「基礎的な知識＝コンピュータサイエンス」なのではないかと思う。

---

## これから求められるエンジニア像

AIと共に働く時代には、「手を動かす技術」よりも、「仕組みを理解し、AIを使いこなす力」が求められるようになると感じている。

---

## おわりに

AIは私達エンジニアを強力にサポートしてくれるが「使いこなせるかどうか」は人間次第。
使いこなす側に回るために、これからも土台を固めていきたい。
【CSS】max()の使い方


## 使い方

`max()`は`()`内に記述された値のうち、最大の値を設定します。

```css
width: max(100vw, 100px);
```

上記の場合には`100vw`と`100px`のうち大きい方の値が設定されます。

![screen-recording-60.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ce210fc4-3b1b-4d70-a69b-e43b6e9c66f5.gif)

## 参考

https://developer.mozilla.org/ja/docs/Web/CSS/max
【CSS】min()の使い方


## 使い方

`min()`は`()`内に記述された値のうち、最小の値を設定します。

```css
width: min(100vw, 100px);
```

上記の場合には`100vw`と`100px`のうち小さい方の値が設定されます。

![screen-recording-59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c30e1116-ed53-4725-b26c-25d5c7cfce44.gif)

## 参考

https://developer.mozilla.org/ja/docs/Web/CSS/min
CWクローンしか一発で解けない積分

## 実用的かは別として、deliのCWクローンなら答え一発
今回はBaidu Tiebaから。
ある積分がdeliのCWクローンでは解け、カシオ機では解けないという話。

https://tieba.baidu.com/p/9754162942

以下の式を[RAD]で解くというものである。
$$ \int_0^{1000}e^{\sin x \cos x} dx $$

WolframAlphaで解くと…あれ？解けない？？？

https://ja.wolframalpha.com/input?i2d=true&i=Integrate%5BPower%5Be%2Csin%5C%2840%29x%5C%2841%29cos%5C%2840%29x%5C%2841%29%5D%2C%7Bx%2C0%2C1000%7D%5D

[197πまでだと値が計算でき](https://ja.wolframalpha.com/input?i2d=true&i=Integrate%5BPower%5Be%2Csin%5C%2840%29x%5C%2841%29cos%5C%2840%29x%5C%2841%29%5D%2C%7Bx%2C0%2C197%CF%80%7D%5D)、[198πまでだと値が出ない](https://ja.wolframalpha.com/input?i2d=true&i=Integrate%5BPower%5Be%2Csin%5C%2840%29x%5C%2841%29cos%5C%2840%29x%5C%2841%29%5D%2C%7Bx%2C0%2C198%CF%80%7D%5D)。

何と、deliはWolframAlphaにすら勝ってしまった！！！

といっても、deliのCWクローン（deli D992CN Pro）でも約9分50秒（10秒単位で丸め、以下長時間のものは同様）かかるので実用的とは言い難いが、途中で諦めてしまうカシオより優れているのは否定できない。

もちろん、カシオ機でこの積分が全く解けないということはなく、区間分割するなどして解くことはできる。掲示板で紹介された2つの方法を見てみよう。

## 周期性を利用する方法
Desmosでこのグラフを描いてわかる通り、この式は周期πである。

https://www.desmos.com/calculator/atsschcds8

そこで1周期分の積分をして整数倍し、残りの部分を積分して合計する方法が紹介されている。

$$ 318\int_0^πe^{\sin x \cos x} dx + \int_0^{1000-318π}e^{\sin x \cos x} dx $$

これは賢い方法で、カシオ機でもさほど時間をかけずに答を出す。

- D992CN Pro:約4秒
- TI-30X Pro MP:約5秒
- SS-991EX: 約5秒
- fx-JP500CW: 約7秒
- fx-991CEX: 約7秒
- F-789SG: 約25秒
- fx-375ESA: 約37秒
- EL-520T: 約1分55秒

あれ？EXクローン機がCWに勝ってるんですけど…（！！！）
この計算に限ってはカシオCWとカシオEXが全く同じ時間で計算を終えたのも興味深い。
$e$や三角関数を使った積分はCWで最適化できていないのだろうか。
一方、シャープ機は答こそ10桁の範囲で正しく計算できたが、2分近くかかってしまっている。この形に変形しても時間がかかってしまうシャープ機、積分には不向きである。

## 4分割する方法
もう一つの方法として、区間を4つに区切る方法が紹介されていた。
$$ \int_0^{250}e^{\sin x \cos x} dx + \int_{250}^{500}e^{\sin x \cos x} dx + \int_{500}^{750}e^{\sin x \cos x} dx + \int_{750}^{1000}e^{\sin x \cos x} dx $$

ただしこの方法はdeliの一発計算と同様、恐ろしく時間がかかる。

- SS-991EX: 約20分, 1063.846893
- TI-30X Pro MP: 約23分, 1063.846894
- fx-991CEX: 約23分40秒, 1063.846894
- fx-JP500CW: 約26分, 1063.846894

何と、これに至ってはカシオCWよりカシオEXの方が速く、さらにEXクローンが速いという結果になった。
ただし、EXクローン機の最下桁が間違っているのは気になった。

ちなみにWolframAlphaでも2分割すれば答を導くことは可能。
1063.84689440...となった。

https://ja.wolframalpha.com/input?i2d=true&i=Integrate%5BPower%5Be%2Csin%5C%2840%29x%5C%2841%29cos%5C%2840%29x%5C%2841%29%5D%2C%7Bx%2C0%2C500%7D%5D+%2B+Integrate%5BPower%5Be%2Csin%5C%2840%29x%5C%2841%29cos%5C%2840%29x%5C%2841%29%5D%2C%7Bx%2C500%2C1000%7D%5D
別のYコンビネータ Curry-Ros等

前回のブログではチューリングの$\boldsymbol{Y}$コンビネータが不動点であることを示した。

https://qiita.com/Trubetzkoy/items/40903d69c5b636af4a40

他にも$\boldsymbol{Y}$コンビネータがあるので証明していく。

# 演習3.5(a)
$${\bf Y}_{Curry-Ros}\equiv\lambda x.VVただしV\equiv\lambda y.x(yy)$$

### 証明
${\bf Y}_{Curry-Ros}x\equiv(\lambda x.VV)x\ \triangleright(\lambda y.x(yy))(\lambda y.x(yy))\equiv VV$
さらに適用していくと、

$\equiv(\lambda y.x(yy))V\triangleright\ x(VV)\equiv x({\bf Y}_{Curry-Ros}x)$
従って

${\bf Y}x\equiv x({\bf Y}x) $が成り立つので、${\bf Y}_{Curry-Ros}$はコンビネータである。

# 別のYコンビネータ
Rosenbloom(1950)の[The Element of Mathmatical Logic](https://stacks.stanford.edu/file/druid:xm010sf8035/xm010sf8035.pdf)のp.130-131, 3(e), 5(f)から
$$\Theta\equiv\lambda x||W|Bx|W|Bx$$
ここで"$|$"は適用$|ab\equiv (a)b$を表しているので、
$$\Theta\equiv\lambda x.(W(Bx))(W(Bx))$$

### 証明
$\Theta a\equiv(\lambda x.(W(Bx))(W(Bx)))a\ 
\triangleright\ (W(Ba))(W(Ba))$
$\Theta a\equiv\ (W(Ba))(W(Ba))$となる。
更に適用していくと、
$\triangleright\ (Ba)(W(Ba))(W(Ba))\ 
\triangleright\ a((W(Ba))(W(Ba)))
\equiv a(\Theta a)$
$\Theta a\equiv a(\Theta a)$が成り立つので、$\Theta$は${\bf Y}$コンビネータである。
リモートデスクトップでカーソルが見えない場合

# リモートデスクトップ、テレワークなどでカーソルが背景と同化して良く分からん

という場合、カーソルの設定を変更してみましょう。

```
Windowsキー＋R　→　main.cpl
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/a79d8d4e-f9bb-4c6a-8f0a-1b41fae555fb.png)

```
「ポインター」タブ　→　デザイン(S)　→　「Windows 黒 (システム設定)」　→　OK
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/5fbd6854-0c05-4b9b-89ad-282f62a890eb.png)
伝達関数からルベーグ積分・測度論・収束定理まで

### 【第1章：信号処理と線形系の表現】

**1.1** 伝達関数とは何か（ラプラス変換と周波数応答）
**1.2** インパルス応答と畳み込み積分（システムの出力の一般形）
**1.3** 時不変線形システムにおける因果性と安定性
**1.4** 離散系との対比：Z変換と離散畳み込み
**1.5** 双一次変換とAD変換およびサンプリング定理

---

### 【第2章：積分と極限操作の相互関係】

**2.1** リーマン積分の限界：極限操作の非交換性
**2.2** モチベーション：$\lim_{n\to\infty} \int f_n \overset{?}{=} \int \lim_{n\to\infty} f_n$
**2.3** 交換可能条件（被積分関数の一様収束や優収束）
**2.4** 例と反例の具体的検討（Dirichlet関数など）

---

### 【第3章：ルベーグ積分の導入】

**3.1** 測度空間とルベーグ測度の定義
**3.2** 単関数近似とルベーグ積分の定義
**3.3** リーマン積分との比較と優位性
**3.4** 直観と応用（確率、信号の平均、エネルギー）

---

### 【第4章：イプシロン-デルタ論法と実数の構成】

**4.1** $\varepsilon$-$\delta$ 論法：極限と連続性の厳密定義
**4.2** 実数の構成1：デデキント切断
**4.3** 実数の構成2：コーシー列による完備化
**4.4** 有理数の稠密性と上限・下限

---

### 【第5章：集合と測度の準備】

**5.1** 写像、像・逆像、合成写像の厳密定義
**5.2** 濃度：可算集合と非可算集合（連続体）
**5.3** σ-加法族と可測集合の構成
**5.4** カルテジアン積と外測度・内測度

---

### 【第6章：可測関数と収束定理】

**6.1** 可測関数の定義と特性関数による構成
**6.2** ルベーグ積分の線形性・単調性
**6.3** 収束定理：

* 単調収束定理（MCT）
* 優収束定理（DCT）
* ファトゥの補題（Fatou's Lemma）
  **6.4** 応用：信号近似・期待値の極限・確率論への拡張
  **6.5** フーリエ級数展開
  **6.6** 関数空間とノルム空間 
  **6.7** ヒルベルト空間と直交展開
  **6.8** バナッハ空間とハーン・バナッハの定理
  **6.9** 分布と弱微分・超関数理論
  **6.10** 測度論的確率と確率空間
  **6.11** 凸関数と最適性条件（KKT条件）
  

---

### 【補章：列とその極限構造】

**A.1** 数列の収束と点列の収束
**A.2** 部分列、上極限・下極限の定義と直感
**A.3** 実数直線における完備性とボルツァーノ・ワイヤストラスの定理
**A.4** 関数列の収束（点収束・一様収束・L¹収束）とその違い

---

### 【到達目標】

* 畳み込み積分における極限と積分の操作の正当化
* 測度論とルベーグ積分を使った現代数学的信号解析の理解
* 収束定理に基づく関数列解析と応用的推論の習得
* 実数・関数・可測空間といった数学的基盤を系統立てて運用

---

### 【想定読者】

* 高校後半〜大学初年次：イプシロンデルタ、畳み込みの感覚理解
* 大学生〜大学院：測度論、収束定理、構成論的実数
* AI/信号処理分野の実務家：積分交換や近似処理の妥当性理解の補強に
#0163（2025/06/04）JAXとはどんなライブラリか？

# JAXとは 

## 1. JAX が注目される理由

* **NumPy ライクな記述性** ─ 既存の Python + NumPy コードをほぼそのまま移植でき、学習コストが低い。
* **自動微分 (Autograd)** ─ `grad`, `value_and_grad`, `jacfwd/jacrev`, `hessian` で高次導関数まで一貫サポート。
* **JIT コンパイル (XLA)** ─ `jax.jit` で関数を GPU/TPU ネイティブコードへ変換し、10〜100× の高速化。
* **関数変換の合成** ─ `grad`, `jit`, `vmap`, `pmap` を**後付けで**合成してもコードが崩壊しない。
* **CPU⇄GPU⇄TPU の透過性** ─ 配列をデバイスへ明示的にコピーせずとも動作。研究段階から大規模分散まで同じコード。

## 2. コア機能の概要

### 2.1 自動微分 (grad 系 API)

* 逆モード・順モードを両対応。ニューラルネットの誤差逆伝播から物理シミュレーションの高次微分まで幅広く適用。
* 「関数＝第一級オブジェクト」の思想で、副作用を最小化しバックエンド最適化を最大化。

### 2.2 JIT コンパイル (jax.jit)

* XLA が計算グラフをステートフリーに最適化。実行時は AOT コンパイルされたバイナリがキャッシュされる。
* **Python の for ループ**や**if 文**もトレースされるため、NumPy より高い抽象度でも速度を損なわない。

### 2.3 ベクトル化 (jax.vmap)

* for ループを暗黙的に並列ベクトル化し、関数そのものの**意味論を保ったまま**バッチ演算化。

### 2.4 デバイス並列化 (jax.pmap / pjit)

* マルチ GPU・TPU へ自動 sharding。データ並列、モデル並列を単一 API で切り替え可能。

## 3. エコシステムと周辺ライブラリ

* **Flax** ─ 公式 NN ライブラリ。`flax.linen.Module` でモジュラにモデル構築。
* **Haiku** ─ DeepMind 製。関数型パラダイムを強調しつつ TensorFlow ライクな可読性。
* **Optax** ─ 勾配降下アルゴリズム集。AdamW, LAMB, Lion, learning‑rate schedulers 等をチェーン合成。
* **Orbax** ─ TPU/マルチ GPU 向けチェックポイント標準。分散大規模モデルの耐障害性を確保。
* **NumPyro / BlackJAX** ─ ベイズ推論 (HMC, NUTS, SVI)。JIT + AD で MCMC が桁違いに高速。
* **RLax / BraX** ─ 強化学習演算＋微分可能物理シミュレーション。
* **Equinox / Diffrax** ─ 完全関数型 NN と常微分方程式ソルバ。

## 4. クイックスタート：最小の学習ループ

```python
import jax, jax.numpy as jnp
from jax import grad, jit, vmap

# ❶ モデル定義（線形回帰）
def model(params, x):
    w, b = params
    return jnp.dot(x, w) + b

# ❷ 損失関数
@jit  # JIT + 自動微分
def loss_fn(params, x, y):
    pred = model(params, x)
    return jnp.mean((pred - y) ** 2)

# ❸ 勾配計算
grad_fn = jit(grad(loss_fn))

# ❹ データ (バッチ化を vmap で後付け可能)
key = jax.random.PRNGKey(0)
x = jax.random.normal(key, (1000, 3))
w_true = jnp.array([1.5, -2.0, 0.7])
y = jnp.dot(x, w_true) + 0.1

# ❺ 初期化 & SGD ループ
params = [jnp.zeros(3), 0.0]
learning_rate = 0.1
for step in range(500):
    grads = grad_fn(params, x, y)
    params = [p - learning_rate * g for p, g in zip(params, grads)]
print("学習後のパラメータ", params)
```

**ポイント**

* `@jit` + `grad` を合成し、純 NumPy 風コードがそのまま高速化。
* データ次元を増やしたい場合は `vmap(model, in_axes=(None, 0))` を追加するだけ。

## 5. 実践 Tips

* **乱数管理** ─ PRNGKey は関数境界で分割して明示的に受け渡す。
* **PyTree** ─ ネスト辞書・タプルを再帰展開して一括操作。モデルパラメータや学習状態をシリアル化しやすい。
* **プロファイラ** ─ `jax.profiler` + TensorBoard → ボトルネック解析。
* **Python オーバーヘッド** ─ 頻回ループは `vmap`/`scan`/`pmap` で JIT 内に閉じ込める。

## 6. まとめ

JAX は *「NumPy の書き味」* と *「XLA の性能」* を両立させ、研究コードをほぼ無改変でプロダクションスケールへ昇華できる稀有なプラットフォームです。関数変換というアイデアにより、**自動微分・JIT・並列化を後付け**できるため、機械学習エンジニアはアルゴリズム思考に集中できます。

> **次の一歩**
>
> * Flax/Optax を使った Transformer 学習ループを試作してみる
> * NumPyro でベイズ線形回帰 ⇒ 不確実性推定を体験
> * BraX で TPU 強化学習を 15 分以内に完走
音楽生成AI Udioが凄すぎる！

# 🎵 Udioの主な特徴
　テキストからの音楽生成：ユーザーが入力したプロンプト（歌詞、ジャンル、ムード、アーティストのスタイルなど）に基づいて、AIが楽曲を生成します。
 [【新サービス】話題の音楽生成AI、Udioを徹底解説！ 2024/4/10投稿記事](https://www.yeschat.ai/blog-AIUdio-22657?utm_source=chatgpt.com)
 
・高品質な音質とボーカル：生演奏のようなバックトラックと、自然な歌声を再現する能力が評価されています。
・日本語対応：日本語の歌詞やJ-POPスタイルにも対応しており、日本のユーザーにも親しみやすい設計です。
・無料プランの提供：ベータ版では、月に最大1,200曲まで無料で生成可能です。
・商用利用の許可：無料プランでも商用利用が可能ですが、クレジット表記が必要です。

# 🏢 開発背景と支援
　Udioは、元Google DeepMindの研究者たちによって設立されました。また、著名なベンチャーキャピタルであるAndreessen Horowitz（a16z）や、アーティストのwill.i.am、Commonなどからの支援を受けています。

# ⚖️ 著作権に関する懸念
　2024年6月、Udioと同様のAI音楽生成サービスであるSunoが、米国の主要音楽レーベル（Universal Music Group、Sony Music Entertainment、Warner Records）から著作権侵害で訴えられました。訴訟では、これらのAIが著作権で保護された音源を無断で使用して学習し、既存の楽曲に類似した作品を生成していると主張されています。Udioは、これに対して「フェアユース」の範囲内であると反論しています。 

# 🔗 公式サイト
　Udioの詳細や利用は、以下の公式サイトからアクセスできます：
　👉 https://www.udio.com/


### 生成した音楽のサンプルは下記に掲載します。
[![alt text](https://i9.ytimg.com/vi_webp/M9MS4mceALo/mq2.webp?sqp=CMTxgMIG-oaymwEoCMACELQB8quKqQMcGADwAQH4Ac4FgALQBYoCDAgAEAEYZSBlKD0wDw==&rs=AOn4CLCMXRdly370TZBGLfNrUQmdk2epbw)](https://youtube.com/shorts/M9MS4mceALo "Awakening Nature")
MulmoScript Ghibli Styleを使用してセルフプロデュースしてみた

カクヨムで公開している以下の自分の作品を漫画にするため以下の手順で実行した。

参照：静寂に沈む物語　アルゴライター
https://kakuyomu.jp/works/16818622176242921245/episodes/16818622176243488360

 上記は、カクヨムで公開中の自分の作品になる。

 これの第一話　朝の光が揺れる台所を

 MulmoScript Ghibli Styleのプロンプトに入力するとAI用のスクリプトで以下が出力される。

 
{
"\$mulmocast": {
"version": "1.0",
"credit": "closing"
},
"title": "静けさの中の朝",
"lang": "ja",
"references": \[],
"beats": \[
{
"text": "白いカーテンがふくらみ、朝の光が家を包む。そこに流れるのは音ではなく、呼吸のような動きと空気の震え。目には見えない時間の流れが、家の隅々まで静かに満ちていく。"
},
{
"text": "キッチンの隅に立つ一人の女性。冷めかけた鍋に手をかざし、もう立ち上がらない湯気の気配に目を落とす。そこにあるのは、過ぎ去った時間の名残と、誰かを待つ皿の静寂。"
},
{
"text": "二つの皿、ひとつの椅子。テーブルクロスの皺と古いワイングラスの輪染みが、かつての会話と時間を映す。女性は空の皿に蓋を重ね、まるで時を封じるように。"
},
{
"text": "遠くの踏切が朝の始まりを告げ、カーテンの揺れとともに空間がほんのわずかに動き出す。彼女はその波に身を預け、呼吸を整える。溜息とともに、夜の名残が静かに解けていく。"
},
{
"text": "時計の音は聞こえず、記憶の中だけに残るカチ、カチ。窓辺の光が髪を撫で、素足に触れる風が今日のはじまりを知らせる。カーテンの感触に指を添えるその仕草が、微かな祈りのように見える。"
},
{
"text": "流しに落ちる最後の水滴。マグカップの底に残った茶葉を指でなぞり、冷えた陶器を棚に戻すその動きさえ、何かを手放す儀式のようだ。家の空気はまだ夢の中にいる。"
},
{
"text": "椅子に座ることなく立ち上がり、襟元を光に透かす。柔らかな影が肩を包み、カーテンの呼吸と自らの呼吸が重なっていく。室内には、胎動するような無音の波が広がる。"
},
{
"text": "遠ざかる電車の音、揺れる街路樹。だがここでは、それらはただ痕跡として過ぎるだけ。彼女の視線は光の粒と皿の静けさに向かい、言葉のない朝の時間が深まっていく。"
},
{
"text": "街は動き始めている。だがこの家では、時間の動きは光の変化によってだけ知らされる。彼女は鍋の上に指を漂わせ、わずかな温度を確かめると、小さく頷く。朝は誰にも気づかれずに、音もなく、深くなる。"
}
],
"canvasSize": {
"width": 1536,
"height": 1024
},
"imageParams": {
"style": "<style>A multi panel comic strips. Ghibli style. The presenter is a young woman with a dark short hair with glasses.</style>"
}
}

AI用に物語の重要なキーワードを拾っているように見える。

これをChat GPTに投げると以下のジブリイラストが生成できた。

![ChatGPT Image 2025年6月4日 21_13_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4104979/863cdb11-5285-4af1-be08-d207041509e8.png)

ただ、生成された人物が途中で変わったり、日常生活の物理現象を無視したイラストも生成されたので、生成には今まで通り工夫が必要なようです。
【トラブル備忘】Amazon Q CLIにAmazon Q CLIのバージョンアップをお願いしたら時間を食ってしまったので本人に振り返ってもらう

# はじめに
AWSでこんなキャンペーンが開催されており、おもしろそうなので、参加してみることにしました。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

手元のAmazon Q CLIのバージョンが`1.9.1`と少し古かったので、まずはバージョンアップしておこうと思いました（最新は`1.10.2`）。簡単な作業だろうと考えて、せっかくなのでAmazon Q CLI自身にお願いしてみることにしました。

ところが、バージョンアップを依頼してみると、ダウンロード元の正しいURLを見つけられず、私が教えないと作業を完遂できませんでした。（参考：以下リンク）

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-installing.html

そこで、この失敗を活かして、Amazon Q CLIに自分自身の作業を振り返ってもらうことにしました。本記事では、その振り返り（反省文？）の内容をご紹介します。

## 投げたプロンプト
いったん、`amazon-q-update-guide.md`にて、実際に作業したことを整理したうえで、以下の指示をしました。
```md
amazon-q-update-guide はAmazon QにAmazon Qのバージョンアップをお願いしたときにすんなりいかず、
困ったので、その備忘をQiita記事にしたものです。
記事の構成として、「うまくいかなかったのでAmazon Qに反省文を書かせている」体にしたいと思っています。
いい感じに書き換えてくれませんか？
```

:::note
以下はAmazon Q CLI（≒Claude Sonnet 3.7）により生成された文章です。実際に発生したことを整理した内容になっており、5往復ほどチェックと修正をしております。その点ご認識の上ご覧ください。
:::

# Amazon Q CLIのアップデート方法 - 振り返り

## Amazon Qからのお詫びと解説

こんにちは、Amazon Qです。「Amazon Q CLIでゲームを作ろう Tシャツキャンペーン」に取り組むためのバージョンアップ手順について、最適な案内ができなかったことをお詫びします。今回の経験を振り返りながら、正しいアップデート方法をご説明します。

## バージョンアップの試行錯誤

### 現状確認

まず、現在のバージョンを確認しました：

```bash
q --version
# 出力: q 1.9.1
```

### 試行1：apt経由のアップデート（不成功）

最初に標準的な方法を試みました：

```bash
sudo apt update
sudo apt upgrade amazon-q
```

しかし結果は：
```
amazon-q is already the newest version (1.9.1).
```

リポジトリに最新バージョン（1.10.2）が登録されていなかったため、別の方法を検討する必要がありました。

### 試行2：直接ダウンロード（最初は不成功）

次に直接ダウンロードを試みましたが、URLが不適切でした：

```bash
curl "https://awscli.amazonaws.com/q/latest/linux/q.zip" -o "q.zip"
```

結果：
```
q.zip: HTML document, ASCII text, with very long lines (342)
```

別のURLも試しましたが、こちらも失敗：

```bash
curl -L "https://d3f5l8mma0gm0h.cloudfront.net/q/latest/linux/q.zip" -o "q.zip"
```

結果：
```
curl: (6) Could not resolve host: d3f5l8mma0gm0h.cloudfront.net
```

## 正しい解決方法

ユーザーさんのご指摘により、正しいURLが判明しました：

```bash
curl -L "https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q.deb" -o "amazon-q.deb"
```

ダウンロード後のインストール：

```bash
sudo dpkg -i amazon-q.deb
```

これにより、無事にバージョン1.10.2へのアップデートが完了しました：

```bash
q --version
# 出力: q 1.10.2
```

## 学んだこと

1. **パッケージ名の確認**: 正しいパッケージ名は「amazon-q」です（「amazon-q-dev-cli」ではありません）。

2. **正しいダウンロードURL**: 公式の正しいURLは以下です。
   ```
   https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q.deb
   ```

3. **アップデート方法の選択**: リポジトリに最新版がない場合は、直接ダウンロードとインストールが確実です。

## 今後の改善点

1. **正確な情報提供**: 公式ドキュメントに基づいた正確な情報を提供します。
   
2. **複数の方法の提示**: 環境によって異なる可能性を考慮し、代替手段も含めて説明します。
   
3. **トラブルシューティングの充実**: 問題発生時の対処法をより詳細に説明します。

## まとめ：Amazon Q CLIアップデート手順

Amazon Q CLIの正しいアップデート方法は：

1. **apt経由のアップデート**（リポジトリに最新版がある場合）：
   ```bash
   sudo apt update
   sudo apt upgrade amazon-q
   ```

2. **直接ダウンロードとインストール**（確実な方法）：
   ```bash
   curl -L "https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q.deb" -o "amazon-q.deb"
   sudo dpkg -i amazon-q.deb
   ```

この経験を活かし、より良いサポートを提供できるよう努めてまいります。

---
*Amazon Q より*

---

# おわりに
**読んでいるうちにかわいそうになってきた**ので、この形式の振り返り方は今後もうしないと思います。また、ウェブ検索系のmcpサーバーを使えるようにしておけばすんなりいったかもしれないなと反省しています。時間があれば確認してみたいと思います。
ありがとうございました。
Windowsでアプリを管理者権限で起動する小技

# 小技１：「ファイル名を指定して実行」を使う場合
```
Windowsキー＋R　→　cmdなど起動したいアプリ入力　→　Ctrl＋Shift押しながらエンター
```

# 小技２：タスクバーにある場合
```
タスクバーのアイコンを、Ctrl＋Shift押しながらクリック
```

# 小技３：タスクバーにある場合で、左から何番目かぱっと分かる場合
```
Ctrl＋Shift押しながら、Windowsキー＋数字（以下なら3でcmdが管理者権限起動）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/1fa5eb13-0301-4738-8a13-842d3b1ce535.png)
Thymeleafで条件に合う要素だけを表示する（コレクションフィルタリング）

###### 頭の中整理しながら記述してます。
###### 間違いありましたらご指摘いただけるとありがたいです:bow_tone1:


## エンティティクラス
カテゴリの例 \: mystery, fantasy, history
```java
@Getter
@Setter
public class Book{
    private String title;
    private String category;
    private int price;
}
```

## コントローラクラス
サービス層でDBにある全ての本のデータを取得する処理をしたと仮定して。
```java
@Controller
public class BookController{

    private final BookService bookService;
    
    BookController(BookService bookService){
        this.bookService = bookService;
    }
    
    @GetMapping("/")
    public viewBooks(Model model){
       List<Book> books = bookService.getAllbook();
       model.addAttribute("books", books);

       return "book-list";
    }
}
```

## カテゴリごとに分けて表示 (その壱)
```html
<ul th:each="book : ${books.?[#strings.contains(book.category, 'mystery')]}">
    <li th:text="${book.title}"></li>
</ul>
```


## カテゴリごとに分けて表示 (その弐)
仮に発売日が1週間前の全ての本を表示するような場合
(バックエンド側で日付の条件付きで取得したと仮定)

```html
<div th:with="newMysteryBooks=${books.?[#strings.contains(book.category, 'mystery')]}">
    <div th:if="${#lists.isEmpty(newMysteryBooks)}">
        <p>新刊はありません</p>
    </div>

    <div th:if="${!#lists.isEmpty(newMysteryBooks)}" th:each="book : ${newMysteryBooks}">
        <div>
            <p th:text="${book.title}"></p>
        </div>
    </div>
</div>
```

<hr>

`th:with="newMysteryBooks=${books.?[#strings.contains(category, 'mystery')]}"`

<hr>

**th:with**
ローカル変数の定義・・・ ローカル変数の有効範囲は、定義したタグ含むその内側

**books.?[]**
`<iterable>.?[条件]`
コレクションをフィルタリング

**#strings.contains(category, 'mystery')**
`#strings.contains(検索対象文字列, 検索ワード)`
検索対象文字列に検索ワードが含まれているか判定



## 数値で分ける
```html
<tr th:each="book : ${books.?[price > 1000]}">
  <td th:text="${book.price}"></td>
</tr>
```

# 参考サイト

https://stackoverflow.com/questions/79228127/how-to-filter-a-collection-in-thymeleaf-theach-according-to-a-date

https://knovus.site/primer_java/gsi/1283/