OmniAICreator/Qiita-1.07M huggingface dataset:
【Bootstrap】collapse とcollapsedの違い

# はじめに
こんにちは。私はアメリカで独学でエンジニアを目指している者です。
現在Railsチュートリアルを用いて勉強していますが、Bootstrapを使用している際に出てきたcollapseとcollapsedという似たモノが出てきました
Bootstrap では、ナビゲーションメニューに折りたたみ機能（Collapse コンポーネント）を実装する場合に複数のクラスを使用します。
その中でも特に似ているクラスとして「collapse」と「collapsed」がありますが、この 2 つは全く別の目的を持っています。この記事では、それぞれの使い方と役割の違いを整理します。

---

## collapse とは

**collapse** は、折りたたみ対象の要素（コンテンツ）に適用して、**表示・非表示を切り替えるためのクラス**です。
Bootstrap の CSS・JavaScript（もしくは自前の JavaScript）によって、このクラスのついた要素を折りたたんだり展開したりできる仕組みになっています。

### 主な特徴

1. **折りたたみの対象となる要素に付与する**\
   例えば、ナビゲーションメニューやアコーディオンの本体部分など、実際に隠したい要素に `collapse` を付けることで、Bootstrap がその要素を非表示・表示に切り替えます。

2. **CSS と連動する**\
   `collapse` が付与された要素は、Bootstrap のスタイルによって `height` や `display` プロパティを変化させるため、アニメーションを伴って折りたたまれたり展開されたりします。

3. **JavaScript で制御**\
   基本的に `collapse` クラスは、JavaScript（Bootstrap のプラグインや自作コード）で `toggle()` メソッドを使って追加・削除されることで、折りたたみの動作が行われます。

### 使用例

```html
<div class="collapse" id="myContent">
  <p>折りたたみ対象のテキストなどが入る</p>
</div>
```

```js
// 自作の場合
const myContent = document.getElementById('myContent');
const btn = document.getElementById('myButton');
btn.addEventListener('click', () => {
  myContent.classList.toggle('collapse');
});
```

---

## collapsed とは

一方で **collapsed** は、折りたたみ対象を操作するトグルボタンの状態を示すためのクラスです。
実際に**コンテンツを隠す・表示する役割はなく、「このボタンが対応する要素を閉じている状態である」ということを示すためのもの**です。

### 主な特徴

1. **ボタン側に付けるクラス**\
   折りたたまれるコンテンツではなく、折りたたみを操作するハンバーガーメニューやアコーディオンの見出し要素などに `collapsed` クラスを付与します。

2. **アニメーションやアイコンの表示を管理**\
   Bootstrap では、このクラスの有無によってボタンのアイコンが変化したり、ARIA 属性が切り替わったりする仕組みになっています。ユーザーに対して「開いているのか閉じているのか」をわかりやすく伝える役割もあります。

3. **コンテンツを隠すわけではない**\
   `collapsed` はあくまで「ボタンの状態表現」であり、実際にコンテンツを表示・非表示にする CSS は含まれていません。折りたたみ対象はあくまで `collapse` クラスによって管理されます。

### 使用例

```html
<button class="btn btn-primary collapsed" data-toggle="collapse" data-target="#myContent">
  Toggle
</button>
```

Bootstrap の collapse プラグインでは、折りたたみ対象 (`collapse` クラス付き要素) とトグルボタン (`collapsed` クラス付き要素) を連動させており、プラグインが自動的にクラスの付け外しを行うことで、開閉状態に応じてボタンの見た目を変化させます。

---

## まとめ

- **collapse**

  - 折りたたみ「対象」要素に付与
  - コンテンツを隠す / 表示するためのクラス
  - CSS と JavaScript が連動してアニメーションを制御

- **collapsed**

  - 折りたたみをトグルする「ボタン」要素に付与
  - 「現在閉じている」状態を示す視覚的・アクセシビリティ的役割
  - コンテンツを隠すわけではなく、ボタンの外観やステータスを管理する

一見似た名前ですが、"collapse" は折りたたむ対象コンテンツ、"collapsed" はトグルボタンの状態表現というように **それぞれ役割がはっきりと分かれています**。この区別を意識して適切にクラスを付与すると、Bootstrap の折りたたみ機能をスムーズに活用できます。

-
スループットとレイテンシーの違い

### 背景
AWSのSAA-C03の資格勉強をしていたところ、「スループット」「レイテンシー」という言葉が出てきました。
どちらも何となく理解したつもりになっていましたが、それぞれの言葉の定義や明確な違いが分からなかったので、自分用にまとめました。

### 定義
どちらもコンピューターネットワークのパフォーマンスを測定する指標。
レイテンシー：ネットワーク通信における遅延
スループット：一定時間における処理能力

### それぞれのあるべき姿
レイテンシー：低いほど良い
スループット：多いほど良い

### それぞれの関係性
レイテンシーが大きくなるとスループットも低下する。
逆にスループットが低下するとレイテンシーも大きくなる
→2つを同時に監視することが重要となる

### SAA-C03で出る箇所
問題集では、EFS利用時にレイテンシーが最小になるストレージの種類に関すると問いが何回か出ていました。
→レイテンシー最小を目指すなら汎用モード

##### パフォーマンスモード
|名前|モード|レイテンシー|コスト|備考|
|:-----:|:-----:|:-----:|:-----:|:-----:|
|汎用モード|パフォーマンスモード|最も低い|安い|デフォルト設定|
|最大 I/O モード|パフォーマンスモード|汎用より高い|処理量に応じて高くなる|前世代(利用非推奨)。大規模データを並列処理する際に利用|

##### スループットモード
|名前|モード|スループット|コスト|備考|
|:-----:|:-----:|:-----:|:-----:|:-----:|
|エラスティック|スループットモード|バーストよりも大きい|高い|デフォルト設定。急上昇するなど利用が読めない場合推奨|
|プロビジョニング|スループットモード|最大|従量課金のため高くなる可能性あり|ワークロードのパフォーマンス要件がわかっている場合|
|バースト|スループットモード|ストレージサイズに依存するが一時的負荷上昇に対応|安い|小規模案件や、ストレージ容量に合わせてスケーリングする場合|


### 参考文献
AWS公式ドキュメントに記載がありました
https://aws.amazon.com/jp/compare/the-difference-between-throughput-and-latency/

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.html

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/managing-throughput.htm
Pythonで起きがちなエラー

# はじめに
pythonは人気のあるプログラミング言語ですが、初心者から上級者まで、誰もが陥りやすいエラーがいくつか存在します。この記事では、よく遭遇するPythonエラーとその解決方法について解説します。

# 1.SyntaxError(構文エラー)
SyntaxErrorは、Pythonの文法規則に違反したコードを書いた際に発生します。


**主な原因：**


- 文字列の閉じ忘れ
- インデントの問題
- 代入演算子(=)の誤用
- Pythonのキーワードのスペルミス
- 括弧、カッコ、中括弧の不足
- 古いバージョンのPythonで新しい構文を使用

**例：**

```python
employees = {"pam" 30,
             "jim": 28}
```

**解決策：**
- エラーメッセージを注意深く読む
- コードエディタでリンターを使用する(PyLine,Flake8など)
- コードフォーマッターを使用する(Blackなど)

# 2.IndentationError(インデントエラー)
IndentationErrorは、Pythonのコードのインデントに問題がある場合に発生します。

**主な原因：**
- タブとスペースの混在
- 不適切なスペース
- ブロックの誤ったネスト
- 文やファイルの先頭の余分な空白


**例：**

```python
if True:
print("Incorrectly indented")
```

**解決策：**

- 一貫したインデントスタイルを使用する
- コードエディタのインデント設定を確認する
- オートフォーマッターを使用する


# 3.NameError(名前エラー)
NameErrorは、定義されていない識別子を使用しようとした場合に発生します。

**主な原因：**
- 変数を定義する前に使用
- スコープ外の変数を参照
- 識別子のスペルミス

**例：**
```python
print(name)  # nameが定義されていない

```

**解決策：**
- 変数を使用する前に必ず定義する
- 変数名のスペルを確認する
- グローバル変数とローカル変数のスコープを理解する

# 4.TypeError(型エラー)
TypeErrorは、予期しない型の操作を実行しようとした場合に発生します。

**主な原因：**
- 互換性のない型同士の演算
- 関数に不適切な型の引数を渡す

**例：**
```python
result = "5" + 5  # 文字列と整数の加算
```

**解決策：**
- 型変換を適切に行う(ex:int(),str(),float())
- 型ヒントを使用してコードの可読性を向上させる

# 5.ValueError(値エラー)
ValueErrorは、関数に渡された引数の値が不適切な場合に発生します。

**主な原因：**
-　数値関数に非数値文字列を渡す
-　リストのインデックスが範囲外

**例：**

```python
int("hello")  # 数値に変換できない文字列
```

**解決策：**
- 入力値のバリデーションを行う
- try-except文を使用してエラーを適切に処理する

# まとめ
これらのエラーを理解し、適切に対処することで、Pythonプログラミングの効率と品質を向上させることができます。エラーメッセージを注意深く読み、デバッグツールを活用し、コードの品質を維持するためのベストプラクティスを守ることが重要です
最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
Proxmox の ZFS over iSCSI を試そうとしたら想定外の動作だった話

これは、私が **Proxmox の“ZFS over iSCSI”機能** を使ってみようとした際に抱いた誤解や、実際に試して分かったことをまとめた記事です。  
結論から言うと、**ネーミング的に「iSCSI 上に ZFS ファイルシステムを作れるもの」と思いきや、実際は特定の ZFS アプライアンスと SSH 連携する仕組みで、一般的なストレージ製品には使えないだろう** というオチでした。  
時間があるときに、実際の設定を試してみようと思いますが、今回は調査・確認結果のみ共有させていただきます。

---

## 背景

- Proxmox には “ZFS over iSCSI” というストレージプラグインがあり、名称だけ見ると「iSCSI 経由で ZFS を使える便利機能なのかな？」と思いがち。  
- 「TrueNAS であれば iSCSI を ZFS で管理してるし、これでバッチリだろう！」と期待していた。  
- しかし、調べてみると **ZFS over iSCSI = SSH でストレージアプライアンスに root ログインして、zfs コマンドを実行しながら LUN を操作** する仕組みだった。  
- そのため、**TrueNAS を含め一般的なアプライアンスでは使えそうもない** と判断し、検証を中止した。

---

## どんな誤解があったのか？

### 誤解1: 「iSCSI 上に ZFS ファイルシステムを作れる」と思っていた

- 以前 iSCSI + LVM や NFS + ZFS はやったことがあったので、「ZFS over iSCSI」という名前から、**まず iSCSI のブロックデバイスを ZFS で管理できるのでは？** と予想していた。  
- 実際には、**Proxmox がストレージ側(=ZFSが動いているNASやアプライアンス)にリモートから root SSH で入り、zfs コマンドを叩いてプールやボリュームを管理する** という仕組みだった。

### 誤解2: どんな iSCSI 製品でも使える？

- 「ZFS over iSCSI」という名前だけ見ると、あたかも **どんな iSCSI 製品でも ZFS をかませる** かと勘違いした。  
- ところが実際は **ストレージ側が ZFS をネイティブで動かしており、かつ Proxmox が root SSH ログインできる** 必要がある。  
- 例えば **DELL UnityXT** や **QNAP** などのハードウェアアプライアンスでは、ベースOSの root シェルが提供されておらず、かつ、内部的にもzfsコマンドに対応していないため、利用は不可能。

---

## まとめ

- **ZFS over iSCSI** は、名前だけ見ると「iSCSI 上に ZFS ファイルシステムを構築できる機能」と誤解しがち。  
- 実際には、**ストレージサーバに root SSH ログインして直接 ZFS コマンドを操作し、iSCSI でエクスポートする** 仕組み。  
- TrueNAS のようなアプライアンスなら一応使える可能性はあるが、GUI による管理と競合したりサポート外である可能性が高く、**実運用が難しい**。  
- **QNAP** のようなハードウェアアプライアンスにはまず適用不可と思われる。  
- 私は結局、「名前の印象と実際の挙動が違いすぎてヤバそう」ということで**検証を中止** しました。  

以上、**ZFS over iSCSI でクラスタ共有ストレージを期待したけれど、思っていたのと違って挫折した話** でした。  
同様に混乱している方がいれば、最初からこの仕組みを勘違いしないようにご注意ください。
Kongとは何か

Kongを簡単に説明すると、レストランの受付係みたいなものらしい。

## シンプルな例：レストラン

イメージしやすくするために、レストランを例にする。

1. 大きなレストランの前に立ってる。
2. そのレストランには、和食、洋食、中華など、色々な料理コーナーがある。
3. 入口には受付係（これがKong）がいる。

## Kongの役割

受付係（Kong）の仕事はこんな感じ。

1. お客さん（ユーザーのリクエスト）を迎え入れる。
2. お客さんの注文（リクエスト内容）を聞く。
3. 適切な料理コーナー（バックエンドサービス）に案内する。

## Kongのメリット

1. **混雑を防ぐ**：一度に入れる人数を制限できる（レート制限）。
2. **セキュリティ強化**：予約確認や身分証明書のチェック（認証・認可）。
3. **効率的な対応**：よくある注文はすぐに対応（キャッシュ機能）。
4. **柔軟な対応**：新しい料理コーナーを簡単に追加・変更できる（APIの追加・変更）。

Kongは、いろんなAPIリクエストを受け取り、適切なバックエンドサービスに振り分ける「賢い受付係」みたいな役割を果たす。

## Kongの使い方

Kongは、APIゲートウェイとして使う。主に以下の手順で使う。

1. **インストールと設定**
   - Dockerを使って簡単にセットアップできる。
   - 例: `curl -Ls https://get.konghq.com/quickstart | bash`

2. **サービスとルートの定義**
   - **サービス**: バックエンドAPIへの接続設定（URL、タイムアウトなど）。
   - **ルート**: クライアントリクエストをどのサービスに振り分けるか設定。

3. **リクエストの処理**
   - クライアントからのリクエストを受け取り、適切なバックエンドサービスに転送。

4. **機能の追加**
   - 認証、レート制限、ログ記録などのプラグインで機能を拡張。

5. **管理と監視**
   - Admin APIを使ってKongの設定を管理・監視。
   - 例: `curl -s localhost:8001 | jq '.configuration'`

Kongは、マイクロサービスアーキテクチャやKubernetes環境で特に効果的。クラウド環境やKubernetesとの統合もしやすく、スケーラブルなAPIゲートウェイとして機能する。

## レート制限とは

レート制限は、APIが一定時間内に処理できるリクエスト数を制限する仕組み。主な目的は次の通り。

1. **リクエスト数の制限**：特定の時間内に許可されるAPIリクエスト数を制御。
2. **サービスの保護**：過剰なリクエストでサーバー負荷や品質低下を防ぐ。
3. **公平なリソース分配**：すべてのユーザーが適切にAPIを利用できるようにする。
4. **セキュリティ強化**：DoS攻撃やWebスクレイピングを防ぐ。

レート制限の設定方法は、次のようなものがある。

- IPアドレスごとの制限
- APIキーやOAuthトークンごとの制限
- エンドポイントごとの制限

レート制限を超えた場合、通常はリクエストが拒否され、`429 Too Many Requests` エラーが返される。これにより、APIの安定性・パフォーマンス・セキュリティが向上し、より効率的なAPI運用が可能になる。

## APIキーとは

APIキーは、APIを利用するアプリケーションやユーザーを識別・認証するための一意の英数字の文字列。主な役割は次の通り。

1. **識別と認証**：APIキーでリクエストを送信しているアプリやプロジェクトを特定。
2. **アクセス制御**：APIプロバイダーがアクセスを管理し、許可されたクライアントだけが使えるようにする。
3. **使用状況の監視**：APIの利用状況を記録・分析。
4. **セキュリティ強化**：不正アクセスを防ぐ。
5. **トラフィック管理**：適切な帯域幅を確保し、APIの負荷を最適化。

### APIキーの使い方

1. **APIキーの取得**
   - クライアントがAPIサーバーにリクエストを送って、APIキーを取得。

2. **リクエストへの組み込み**
   - 取得したAPIキーをリクエストのヘッダーやクエリパラメータに含める。

3. **APIサーバーでの検証**
   - 受け取ったAPIキーを検証し、有効ならリクエストを処理。

ただし、APIキーだけでは完全なセキュリティ対策にはならないので、必要に応じて追加の認証・認可の仕組みを組み合わせることが重要。
git resetでヒヤッとした、、

誤ってcommitをしてしまい、取り消そうと思い、以下のコマンドを実行しました。

```
$ git reset --hard HEAD^
HEAD is now at 64xxxx first commit
```
すると作業していたローカルのファイルが全て消えており、驚き。
詰んだな・・・と
```
$ ll
total 0
drwxr-xr-x@ 2 local  local   64  3  1 10:58 .
drwxr-xr-x@ 5 local  local  160  3  1 10:49 ..
```

git reset --hard HEAD^ を実行すると、直前のコミットを削除し、かつ作業ディレクトリのファイルもその状態に巻き戻すため、ローカルの変更もすべて消えてしまうとのことでした。
これがお客様の環境ではなくてよかったと心底ホッとしました。


https://git-scm.com/docs/git-reset

:::note info
インデックスと作業ツリーをリセットします。それ以降の作業ツリー内の追跡ファイルへの変更はすべて<commit>破棄されます。追跡ファイルの書き込みの邪魔になる追跡されていないファイルまたはディレクトリは、単に削除されます。
:::

なので単にcommitを取り消したい場合は、以下のコマンドを実行すべきでした。
```
git reset --soft HEAD^
```
:::note info
インデックス ファイルや作業ツリーにはまったく触れません (ただし、すべてのモードと同様に、ヘッドを にリセットします<commit>)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります。
:::


また今回削除されてしまいましたが、復旧方法もありました。

まずリセット前のコミットを探し、リセット前のコミットIDを探します。
```
$ git reflog
64xxxxx (HEAD -> main, origin/main) HEAD@{0}: reset: moving to HEAD^
8bxxxxx HEAD@{1}: commit: xxxxxxxx ##←ここのID
```

コミットIDを指定して、resetを行うことで戻すことができました。
```
$ git reset --hard 8bxxxxx
HEAD is now at 8bxxxxx xxxxxxx
```


これが本当に自分の環境でよかったと心底安心しています。。
初心者向け】バックエンドのデータの流れを詳しく解説！


バックエンドのアプリケーションでは、クライアントからのリクエストを受け取り、データベースとやり取りし、適切なレスポンスを返します。本記事では、データの流れを詳細に説明し、それぞれのフォルダーの役割を明確にします！💡

---

## 📌 データの流れと各フォルダーの役割

📌 **ユーザー情報を取得するリクエスト (`GET /users/:id`) の流れ**

### **1️⃣ ルート（`routes/`）**
- クライアント（ブラウザやAPIクライアント）からのリクエストを受け取り、適切なコントローラーを指定。
- **例:** `userRoutes.js` で `GET /users/:id` を `userController.getUser` にルーティング。

✅ **コード例（`routes/userRoutes.js`）**
```js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
const authMiddleware = require('../middlewares/authMiddleware');

router.get('/users/:id', authMiddleware, userController.getUser);
module.exports = router;
```

### **2️⃣ コントローラー（`controllers/`）**
- ルートからリクエストを受け取り、適切なサービスを呼び出す。
- **例:** `userController.js` で `getUser(req, res)` を定義し、`userService.getUserById(req.params.id)` を実行。

✅ **コード例（`controllers/userController.js`）**
```js
const userService = require('../services/userService');

exports.getUser = async (req, res) => {
  try {
    const user = await userService.getUserById(req.params.id);
    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }
    res.json(user);
  } catch (error) {
    res.status(500).json({ message: 'Internal Server Error' });
  }
};
```

### **3️⃣ サービス（`services/`）**
- リポジトリからデータを取得し、ビジネスロジックを適用。
- **例:** `userService.js` で `getUserById(id)` を定義し、`userRepository.findById(id)` を呼び出す。

✅ **コード例（`services/userService.js`）**
```js
const userRepository = require('../repositories/userRepository');

exports.getUserById = async (id) => {
  return await userRepository.findById(id);
};
```

### **4️⃣ リポジトリ（`repositories/`）**
- モデルを使ってデータベースからデータを取得。
- **例:** `userRepository.js` で `findById(id)` を定義し、`User.findById(id)` を実行。

✅ **コード例（`repositories/userRepository.js`）**
```js
const User = require('../models/User');

exports.findById = async (id) => {
  return await User.findById(id);
};
```

### **5️⃣ モデル（`models/`）**
- データベースのスキーマを定義。
- **例:** `User.js` に `name`, `email` などのフィールドを設定。

✅ **コード例（`models/User.js`）**
```js
const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
});

module.exports = mongoose.model('User', UserSchema);
```

📌 **リクエストの流れを図示するとこんな感じ！**

```
[クライアント] → (GET /users/123) → [routes/userRoutes.js]
  → [controllers/userController.js]
    → [services/userService.js]
      → [repositories/userRepository.js]
        → [models/User.js] → [データベース] 🔄
```

## 🎯 まとめ
バックエンドのデータの流れを理解すると、
✅ **役割が明確になり、コードが整理される！**
✅ **開発がスムーズになり、保守しやすくなる！**
✅ **大規模プロジェクトにも対応しやすくなる！**

初心者の方は、まず `controllers/`, `models/`, `routes/` の流れを実装してみましょう！💡

🔰 **「データの流れで他に知りたいことがあれば、ぜひコメントください！」** 🚀
【読書感想】ネガティブフィードバック「言いにくいこと」を相手にきちんと伝える技術

ランニングしながらAudibleで聴いた本の感想です。
本のまとめというより、自分が心に残ったことを3つだけ書いてます。
とりあえず思ったことをメモするのが大切と思い、なるべく30分以内で書き上げています。

# 聴いた本

ネガティブフィードバック「言いにくいこと」を相手にきちんと伝える技術
難波 猛 (著)

個人的には良い本だと思いました。若手のマネジメント層に必須の知識だと思いました。ただ、マネジメントに関する本なので、社会人1年目には必須じゃないかなと思ったりもします。（個人的満足度３／３、一般的なおすすめ度２．５／３）

# 心に残ったこと

## 「人は変わりたくないのではない、変えられたくないのだ」

ネガティブフィードバックをするときは、問題がある相手を変えるという意識でなく、**問題を解決するための行動を一緒に考えていく**ことが大切、という文脈で登場していました。
個人的には、あらゆる場面でこの考え方は重要かなと思いました。

例えば、上司から「明日から朝30分早く来て仕事してください」と言われたら、30分早く来ることへの労力以上に反発すると思います。
それは、「他人に自分のリズムを変えられたくない」という感情的な要因が大きいからです。
一方で、自発的に「30分早く行ってみよう」と思った場合は、比較的すんなり生活リズムを変えることができるでしょう。
このように、他人から「一方的に変えられる」ことは抵抗がありますが、「自分で考えて変わる」ということはそこまで抵抗がありません。

この性質があるため、心理学を用いた様々な交渉術や、行動経済学におけるナッジのような「命令せずとも相手の行動を変える技術」があるのかなと思いました。

## ネガティブフィードバック＝ギャップ認識

「ネガティブ」というと、関係性に亀裂が生じる可能性があるため、言いにくい・避けるべきという印象がありますが、
ネガティブフィードバックは**期待と成果のギャップを認識**すること、という言葉があり、妙に腑に落ちました。
耳の痛い話というのは、そもそも**自分の期待と相手の期待に差**があるから生じるのであり、
そこを確認しながら丁寧に伝えていくと、感情の対立になりにくく、正のサイクルでパフォーマンスが上がっていくのかなと思いました。

また、ネガティブフィードバックにも**動機付け、意味付けが重要**とのことでした。
「こういう問題があるので、解決してください」とやることを伝えるよりは「こういう背景があり、こういう問題を解決するとこういう未来が訪れます」と意味を説明することが、ギャップ認識の場面でもやはり重要なんだなと思いました。

## ボスマネジメント

「上司は若手を敵だと思うのをやめる」のと同様に、「部下も上司を敵だと思うのをやめる」という文脈で、上司をコントロールする「ボスマネジメント」という用語が紹介されていました。
私は初めて聴いた言葉だったので、印象に残りました。
ネガティブフィードバックは上から下に伝えるだけでなく、**下から上に伝えても良い**のです。

その時のコツとして、「**自分のWILLを伝える**」ことが重要とのことでした。
上から下へのフィードバックは、上司の内面のみならず経営的なことが原因で行われる事が多いですが、下から上へのフィードバックは部下の内面が発端となることが多いです。
そのため、部下側から意思・考えをしっかり伝えて、部下が期待する業務と上司の考える業務とのギャップを埋めていくことが重要なのかなと思いました。

ネガティブフィードバックを上司に伝えようと思うと、常日頃、上司が**いかに配慮してコメントしていたか**という自分が無意識だった部分への気づきがあり、感謝も生まれてきます。

## その他

ちなみに、ポジティブフィードバックとネガティブフィードバックの割合は、
仕事仲間は、ポジティブ：ネガティブ＝4：1
家族は、ポジティブ：ネガティブ＝3：1
友人は、ポジティブ：ネガティブ＝8：1
という紹介があり、数字自体にはあまり意味がないように思いつつも、異様に心に残りました・・・
（私は脳死でポジティブフィードバックしがちなので、、気をつけます・・・）
[Python] TOMLの扱い方

## はじめに
Pythonでの作成物における設定ファイルとして、  
TOMLを多用するため自分の中での整理も兼ねてまとめました。

## TOMLファイルの読み込み
TOMLを読み込むためのパーサーについては、  
Pythonのバージョンによって推奨されるものが異なっている。  
それぞれについての利用法を、以下の項目にて記載します。

### Python 3.11 〜
Python 3.11以降のバージョンでは、  
標準ライブラリに追加された「[tomllib](https://docs.python.org/ja/3.13/library/tomllib.html)」が利用できます。

```py
import tomllib
from typing import Any

# strではなく、Pathオブジェクトを渡してもOK
toml_file_path: str = "project_dir/config/settings.toml"

# tomllibは"rb"でひらく
with open(toml_file_path, mode="rb") as toml_file:
    toml_data: dict[str, Any] = tomllib.load(toml_file)
```

### 〜 Python 3.10 
Python 3.10までのバージョンでは、  
外部ライブラリである「[toml](https://pypi.org/project/toml/)」のインストールが必要です。

```bash
pip install toml
```

```py
import toml
from typing import Any

# strではなく、Pathオブジェクトを渡してもOK
toml_file_path: str = "project_dir/config/settings.toml"

# tomlは"r"でファイルをひらく
with open(toml_file_path, mode="r", encofing="utf-8") as toml_file:
    toml_data: dict[str, Any] = toml.load(toml_file_path)
```

## TOMLへ値を埋め込む
TOMLに記載した文字列の中に、Pythonから値を渡して  
その値が入った文字列として展開することも可能です。
    
下記はそのサンプルコードとなりますが  
TOMLから値を読み取る際に、"{msg}"に対してPythonコード内で値を渡しています。

```toml:settings.toml
[introduce]

[introduce.language]
content ="""
私の好きなプログラミング言語を紹介します。
{msg}
"""
```
```py:read_toml.py
import tomllib
from typing import Any

toml_file_path: str = "project_dir/config/settings.toml"

with open(toml_file_path, mode="rb") as toml_file:
    toml_data: dict[str, Any] = tomllib.load(toml_file)

# ブラケット記法でTOMLから値を取得する際に、任意の文字列を埋め込む
MESSAGE = toml_data["introduce"]["language"]["content"].format(
    msg="好きな言語はPythonです。"
)

print(MESSAGE)
# 私の好きなプログラミング言語を紹介します。
# 好きな言語はPythonです。
```

## TOMLに対してTOMLの値を埋め込む
上記の応用とも言えますが、PythonからTOMLに渡す値は  
その値自身もTOMLから取得したものを利用することが可能です。

ベースとなる文章を作り、その中にカスタム文章を入れるといった場合に役立つ  
大枠となる親の定型文があり、その中に数パターンある子供の定型文を  
状況によって切り替えて使いたいといった場合に役立ちます。
  
下記はそのサンプルコードとなりますが、  
ネストしているのが見て取れるかと思います。

```toml:settings.toml
[introduce]

[introduce.language]
content ="""
私の好きなプログラミング言語を紹介します。
{msg}
"""

[introduce.framework]
content = """
よく書くのは{lang}であり、
好みのフレームワークは
{fw}です。
"""
```
```py:read_toml.py
import tomllib
from typing import Any

toml_file_path: str = "project_dir/config/settings.toml"

with open(toml_file_path, mode="rb") as toml_file:
    toml_data: dict[str, Any] = tomllib.load(toml_file)

# 任意の文字列を埋め込むところに、TOMLから取得した文字列を埋め込む
MESSAGE = toml_data["introduce"]["language"]["content"].format(
    msg=toml_data["introduce"]["framework"]["content"].format(
    lang="Python", fw="Flask"
	)
)

print(MESSAGE)
# 私の好きなプログラミング言語を紹介します。
# よく書くのはPythonであり、
# 好みのフレームワークは
# Flaskです。
```


## 参考
- TOML公式
  - https://toml.io/ja/v1.0.0
- tomllib --- TOML ファイルの解析
  - https://docs.python.org/ja/3.13/library/tomllib.html
- toml Library
  - https://github.com/uiri/toml
- TOML っていいな
  - https://zenn.dev/mirko_san/articles/293f32950ba6c2
【初心者向け】フロントエンドのフォルダー構成をわかりやすく解説！


フロントエンドの開発を始めるときに「どのフォルダーに何を入れればいいの？」と迷うことはありませんか？

本記事では、初心者の方でも理解しやすいように、フロントエンドのプロジェクトでよく使われるフォルダー構成を解説します！💡

## 📂 フロントエンドのフォルダー構成（基本）

以下のようなフォルダーを作成すると、コードが整理されて管理しやすくなります。

```
my-frontend/
├── public/  ← 画像やフォント、favicon などの静的ファイル
│   ├── images/
│   ├── icons/
│   ├── favicon.ico
│   └── index.html
├── src/  ← フロントエンドのメインコード
│   ├── components/  ← UI部品（ボタンやナビゲーション）
│   ├── pages/  ← 各ページのコンポーネント
│   ├── layouts/  ← 共通レイアウト（ヘッダー・フッターなど）
│   ├── store/  ← 状態管理（Pinia, Vuex, Redux）
│   ├── composables/  ← カスタムロジック（Vue 3 の Composables, React の Hooks）
│   ├── utils/  ← 便利な関数（データ変換など）
│   ├── middleware/  ← ルートガードなどのミドルウェア
│   ├── api/  ← API 通信関連の処理
│   ├── assets/  ← CSS, SCSS, 画像（ビルド時に処理するファイル）
│   ├── router/  ← ルーティング設定（Vue Router, React Router）
│   ├── main.js (or main.ts)  ← アプリの起点
│   └── App.vue (or App.js)  ← メインコンポーネント
├── .env  ← 環境変数ファイル
├── package.json  ← プロジェクトの設定
└── README.md  ← 説明書
```

## 📌 各フォルダーの意味と使い方

### 1️⃣ `components/`（コンポーネント）
✅ **どんなフォルダー？**
- ボタンやナビバーなどの「再利用できる UI 部品」を入れる場所。

✅ **例**
```vue
<!-- Button.vue -->
<template>
  <button class="btn">クリック</button>
</template>
```

### 2️⃣ `pages/`（ページ）
✅ **どんなフォルダー？**
- Web アプリの各ページのコンポーネントを入れる場所。

✅ **例**
- `Home.vue`（トップページ）
- `About.vue`（会社概要）

### 3️⃣ `public/`（静的ファイル）
✅ **どんなフォルダー？**
- 画像やフォント、favicon などの「ビルド不要の静的ファイル」を配置。
- `src/assets/` との違い → `assets/` はビルド時に処理されるが、`public/` はそのまま配信。

✅ **例**
- `favicon.ico`
- `images/logo.png`

### 4️⃣ `router/`（ルーティング）
✅ **どんなフォルダー？**
- ページの遷移を管理するルート設定を入れる。

✅ **例**（Vue Router の場合）
```js
// index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../pages/Home.vue';
import About from '../pages/About.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
];

const router = createRouter({ history: createWebHistory(), routes });
export default router;
```

## 🎯 まとめ
フロントエンドのフォルダー構成を整理すると、
✅ **コードがスッキリする！**
✅ **開発がしやすくなる！**
✅ **チーム開発でも迷わない！**

初心者の方は、まず `components/`, `pages/`, `router/` から作ってみると良いでしょう！💡

🔰 **「こんなフォルダーも知りたい！」というリクエストがあれば、ぜひコメントください！** 🚀
CodeIQ:「トライアングル・メイズ」問題の解答  

Kawazoe(@riverplus)さんのCodeIQの問題です。
問題はこちらの御世話になりました。解答例もあります。
->~~https://blog.goo.ne.jp/r-de-r/e/22ef7c56ea8f751e2dfb5975bc15337e~~
(リンク切れしていました。2025.5.2）
URLが変わっていましたが見つかりました。(2025.5.3追加)
->https://sangaku0418.hatenablog.com/entry/2016/09/29/100100

ーーー2025.5.2追加
左上と左下、右下の三点をL字型に結んだ迷路をM(1)とします。
M(ｎ)はM(n-1)を3つ使い上の一つの左下と右下に下の二つの左上をそれぞれつなぎ、
下の二つの右下と左下をつないでＬ字型にします。
M(n)の左上から右下まで最短距離でたどる経路の数をF(n)とした時、
1<=n<=10^8の範囲でF(n)を1000003 で割った余りを求める問題です。
ーーー

こちらにも情報があります。
->https://posfie.com/@riverplus/p/ipsiQ2P

複雑に見えますが、レベルnの図は3つのレベルn-1の図が3点でつながっていて、
其々の中の経路は独立。
レベルnの図の上から終点までの経路をf(n)通りとします。
3つのレベルn-1の図に関して、左上をA、左下をB、右下をCとしますと
Aの上からAの右下（Cの上）に行く道がf(n-1)通り、
Aの右下から終点に行く道がf(n-1)通り、
Aの上からAの左下（Bの上）に行く経路は1通り、
Bの上からBの右下に行く道がf(n-1)通り、
Bの右下（Cの左下）から終点に行く道が1通り。
よってf(n)=f(n-1)\*f(n-1)+1\*f(n-1)\*1=f(n-1)\*(f(n-1)+1)
上記では時間がかかりますので、f(2)=f(1)\*(f(1)+1),f(3)=f(2)*(f(2)+1)...
というように小さいほうから計算します。

```Julia
#julia ver 1.41,1.53,1.10.3

function solve(n,a)
  m = 1000003
  ret = 1
  for k in 1 : n-1
      ret = mod(ret*(ret+1),m)
  end
  ret = mod(ret,m)
  s = a == ret ? "ok " : "no "
  println(s,n,"->",ret)
end

solve(1,1)
solve(2,2)
solve(3,6)
solve(4,42)
solve(10,998593)
solve(100,682181)
solve(10000,240663)
solve(19849813,533577)
solve(99999999,454267)
solve(100000000,342482)
```
このままPrologに移すと時間がかかりすぎですので、剰余の周期性を利用します。
先ずレベル1<=K=Mの範囲でX=F(k) mod Mを計算して辞書（キーはX,データはK）
に登録し、同じキーが出てくるのを探します。
loop/6のK1とK番目が同じ数字で、その後k1からk-1番までの数字をくりかえします。
そこで、(n-(k1-1)) mod (k-k1)が繰り返しの中でのnの順番で、
それに繰り返しの前の(k1-1)を足したものが求める順番(レベル)です。
さらに辞書のデータ（レベル）からキーを求めます。
SWI-prologの辞書はあまり早くありませんが、簡単にデータからキーを探せます。

```Prolog
%SWI-Prolog ver 7.42,7.64,9.25
%:-initialization(start).   %ideone,Online Prolog Compiler
%start.

loop(M,K,D,DR,X,R):-
    (get_dict(X,D,K1)->(DR=D,R=[K1,K,X]);
    (D1=D.put(X,K),X1 is X*(X+1) mod M,K1 is K+1,loop(M,K1,D1,DR,X1,R))).

solve(N,D,[_,K,_],R):-K>N,!,get_dict(R,D,N).
solve(N,D,[K1,K,_],R):-Y is (N-K1+1) mod (K-K1)+ K1-1 ,get_dict(R,D,Y).

start:-
    M=1000003,D=dic{},loop(M,1,D,D1,1,L),f(N,A),
    (solve(N,D1,L,R)->(R==A->Str=" ok  ";Str=" no  ");
    write(fail)),write(" "),write(Str),writeln(N->R),fail.
start.

f(1,1).
f(2,2).
f(3,6).
f(4,42).
f(10,998593).
f(100,682181).
f(10000,240663).
f(19849813,533577).
f(99999999,454267).
f(100000000,342482).


```
ABC394F 再帰をStackを使って書き直したら、行きがけ、帰りがけがよくわかった話

# はじめに

再帰関数の話題を書いてみます。

再帰関数をStackを使って再帰関数を使わない記述に書き換える方法をまとめてみます。
AtCoderのABC394Fで再帰関数を使った記述がきっかけです。

AtCoderでPyPyを使う人は、bootstrap　と呼ばれる、デコレータを使って再帰を解消する方法をよく使ってるようですが、この記事では、最初から、再帰を使わない方法で記述することを行ってみます。

# 再帰を使った場合

サンプルにする再帰関数は、ABC394Fで、[MLE（メモリが上限を超えた）で不正解]となった深さ優先探索をするプログラムです。

```Python
ans = 0
def dfs(s,parent):
    global ans

    result = []
    for next in g[s]:
        if next == parent:
            continue
        x = dfs(next,s)
        result.append(x)
    result.sort(reverse=True)
    if len(result)>=3:
        ret = sum(result[:3])+1
    else:
        ret = 1
    if len(result)>=4:
        ans = max(ans,sum(result[:4])+1)
    if len(result)>0:
        ans = max(ans,result[0]+1)

    # print(s+1,ret,ans,result)
    return ret
```

# 再帰を使わない場合（行きがけ）

再帰では、自分自身を呼び出して、潜っていく段階（行きがけ）と、再帰関数からリターンして戻る段階（帰りがけ）があります。
行きがけを繰り返して、そのあと帰りがけを繰り返して戻るような単純な場合もありますが、行きがけ、帰りがけを繰り返すような場合もあります。
まずはこのうちの行きがけの処理だけをstackを使って書いてみます。

```Python
stack = [(0,None)]
order = []
while stack:
    s,parent = stack.pop()
    order.append((s,parent))
    for next in g[s]:
        if next == parent:
            continue
        stack.append((next,s))
```

元の関数の引数にしていたものをstackに保存するものにします。
ここでは、元のプログラムでは、`s,parent`の二つがあるので、タプルにして、
```stack = [(0,None)]```とします

stackから引数の値をとりだす。
↓
次の値を求める
↓
次の値をstackに保存する
↓
最初に戻る

この繰り返しで、再帰関数が呼ばれる時の引数を再現できます。
これで行きがけの動作を再現することができました。

この引数をorderリストに保存しておきます。
この値を次の処理で使用します。

## 再帰を使わない場合（帰りがけ）

再帰の帰りがけの処理は、行きがけで一番奥まで潜ったところから逆順に行う必要があります。
行きがけで保存したorderを逆順にしたも順に行えばよいことになります。

orderの逆順にしたものを１つづつ取り出して、帰りがけの処理を行います。
この時、再帰関数の場合は、呼び出し元に値を返す処理と、呼び出された関数から値を得る処理の記述があります。
再帰の場合は、これが自動的に接続されますが、再帰を使わない場合、仲介する仕組みが必要になります。
dpという配列用意してこれに保存してみます。

| |再帰の場合|再帰を使わない場合|
|---|---|---|
|呼び出し元に値を返す|return ret|dp[s] = ret|
|呼び出した関数から値を得る|x = dfs(next,s)|x = dp[next]|


```Python
dp = [[0] for _ in range(N)]

for s,parent in order[::-1]:
    result = []
    for next in g[s]:
        if next == parent:
            continue
        x = dp[next]
        result.append(x)
    result.sort(reverse=True)
    if len(result)>=3:
        ret = sum(result[:3])+1
    else:
        ret = 1
    if len(result)>=4:
        ans = max(ans,sum(result[:4])+1)
    if len(result)>0:
        ans = max(ans,result[0]+1
        )
    dp[s] = ret
```

# まとめ

- 再帰の処理は行きがけだけであれば、Stackに引数の値を積み繰り返すことで実現できる
- 帰りがけの処理は、行きがけの処理順を求めて、逆順に行う事で実現できる

# 宿題

今回は、再帰を使わない場合は、引数と結果の対を保存するテーブル（dp）を用意した。
しかし、再帰の場合は、リターンする値もスタックに保存されて、dpのような纏まった領域は必要としていません。
再帰を使わない場合もリターン値をStackに保存する方法を検討してみる
Python3エンジニア認定基礎試験の合格体験記

## 0.前書き

令和7年2月 Python3エンジニア基礎認定試験にほぼ満点合格できましたので、
勉強方法や所感を共有できたらと思います。

※想定している読者は以下の方々になります。
・Python初心者（未経験）から認定基礎試験を取得したいと思っている方
・資格を取得するというよりも、Pythonの基礎を付けることを目標としている方

## 1.自己紹介

新卒2年目エンジニアで現在インフラ（NW）の構築プロジェクトに参画しており、
Pythonとインフラ自動化のあれこれで今回Pythonの勉強を始めた次第でございます。

また認定基礎以外に取得している資格は以下になります。
・AWS SAA
・AWS CLF
・LPIC Level 1
・OSS-DB silver
・ITパスポート

## 2.使用教材

早速！使用した教材の紹介になります。

### ①Pythonチュートリアル（Web版）
出題範囲になっているオライリー・ジャパン出版「Pythonチュートリアル」のWeb版です。
書籍を購入されてもよいと思いますが、内容はWeb版とほぼ変わらないため経費削減です。

https://docs.python.org/ja/3.9/tutorial/


### ②黒本
インプレス社出版で正式名称は「徹底攻略Pythonエンジニア認定基礎試験問題集」です。
Pythonエンジニア育成推進協会監修の公式問題集となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019131/d6205ded-8a70-4198-84c2-6dd78feaf46c.png)

### ③PRIME STUDY

Pythonエンジニア育成推進協会が推奨している模擬試験です。

https://study.prime-strategy.co.jp/

### ④ゼロからのPython入門講座

Python初学者の方向けの入門講座（Web完結・無料）

https://www.python.jp/train/index.html

以上、4つの教材を使用し合計20時間（約3週間）で合格いたしました。

## 勉強の進め方（初学者向け）

私が実践した勉強は以下の流れになります！！

### ①「ゼロからのPython入門講座」で基本のキを習得

前述した使用教材の「ゼロからのPython入門講座」を実際にハンズオンで行いました。
というのも、「Pythonチュートリアル」は英語をそのまま日本語訳された記述で初学者の私では理解し辛かったです。
初めから？ってなってしまうと挫折に繋がることもあるため、上記サイトでなくても構いませんが「Pythonチュートリアル」前に最低限の基礎を掴んでいただくことをお勧めします。

### ②Pythonチュートリアルで試験範囲を確認
「Pythonチュートリアル」を読み進めました。
以下が章立てごとの出題率となっているため、出題率に合わせ重みを付けて進めました。
(実は3/4/5/8/10章の10％越えの章のみで合格点の70%は超えます…)
ハンズオンもやりつつ、理解し辛い部分は個別で調べていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019131/8beb8f72-9b9c-4546-be65-76181a6d19a3.png)

### ③黒本（1周目）
「Pythonチュートリアル」を軽く終わらせたら「黒本」に入ります。※一番大事
黒本は良問題＋良解説の宝庫です。順に解いて間違えた問題はしっかり解説を見ましょう。
特に最後の模擬試験は本試験の問題とほぼ同じ難易度なので絶対に解いておきましょう。

### ④PRIME STUDYの模擬試験（2回分）
公式サイトで推奨されている模擬試験を2回受けました。
正直、本試験よりも難しく解説もないため不要だと感じました。
メリットを挙げるのであれば、本試験と同じ要領(CBT方式)で受験できることです。
そもそもCBT方式で試験を受けたことがないのであれば1回受験するのもアリです。

### ⑤黒本（2周目）
③や④の結果から、苦手意識がある部分のみ2周目を行いました。

## まとめ
・初学者の場合、「Pythonチュートリアル」の前に軽く基礎を固めておきたい
・出題率が10％を超える章のみを対策するだけでも合格点は超得ることができる
・黒本の最後の模擬試験が本試験と問題と難易度が同じ
【ChatGPT】GPT-4.5のご紹介です。


　どうも、カーブミラーです。
　アップし忘れました😅

　今回は、新しいモデル、GPT-4.5のご紹介です。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　では、【本題】です。

　今回は、
　　GPT-4.5のご紹介です。

　とはいえ、
　　まずは、Proユーザーへの提供なので
　　　Plusユーザーである私は
　　　　使用した感想とかは
　　　　　書けません😅

　それはともかく。

　GPT-4.5とは
　　どういうモデルなのでしょうか？

　X-Twitterのポストから
　　ChatGPT（GPT-4o）に
　　　まとめてもらいました｡
***
***（ChatGPT編集）***
# **GPT-4.5 発表：これまでで最も強力なチャットモデルが登場！**

OpenAI は、最新の AI モデル **GPT-4.5** を発表しました。これは、これまでで最も大規模かつ高性能なチャット向け AI であり、自然な会話や複雑なタスクの処理に優れています。  

## **GPT-4.5 の主な特徴**

### **1. 研究プレビューとしてのリリース**
GPT-4.5 は現在 **ChatGPT Pro ユーザー向けに提供開始**されており、来週には **Plus と Team ユーザー**、その翌週には **Enterprise と Edu ユーザー** へと順次展開される予定です。また、API 版（`gpt-4.5-preview`）もリリースされ、開発者が利用可能になりました。

### **2. 自然な会話と高い実用性**
GPT-4.5 は、これまでのモデルと比べて以下の点で大きく進化しています。  
- **より自然な対話が可能**（コーチング、ブレインストーミング、文章改善などに最適）  
- **ユーザーの意図をより正確に理解**  
- **広範な世界知識**を持ち、複雑なタスクに対応  
- **高度な計画立案と実行能力**を備える  

### **3. スケーリング技術の進化**
GPT-4.5 は、**教師なし学習を大規模に拡張**し、パターン認識や関連性の把握、創造的な洞察を生み出す能力を向上させました。ただし、GPT-4o の後継ではなく、計算コストが高いため、慎重に運用が進められています。

## **GPT-4.5 の利用方法**
### **🔹 ChatGPT**
- ChatGPT Pro で利用可能（来週から Plus、Team、Enterprise、Edu に拡大）  
- **検索機能を活用**し、最新情報を取得可能  
- **ファイル＆画像のアップロード対応**  
- **執筆やプログラミングに役立つキャンバス機能**を搭載  

### **🔹 API（`gpt-4.5-preview`）**
開発者向けに **API 版がリリース**され、以下の機能を利用できます。  
✅ **関数呼び出し（Function Calling）**  
✅ **構造化出力（Structured Outputs）**  
✅ **ビジョン機能（Vision）**  
✅ **ストリーミング（Streaming）**  
✅ **システムメッセージ（System Messages）**  
✅ **評価（Evals）**  
✅ **プロンプトキャッシュ（Prompt Caching）**  

この API は、**Chat Completions API、Assistants API、Batch API** で利用可能で、**Batch API では 50% 割引が適用**されます。

### **4. 価格と提供状況**
GPT-4.5 は計算負荷が高く、API の標準コストは **1M トークンあたり $68**（キャッシュ適用時は割引あり）。将来的な API 提供については、需要やバランスを見ながら調整される予定です。

## **今後の展望**
現在、GPT-4.5 は**音声モードや動画、画面共有などのマルチモーダル機能には対応していません**。しかし、将来的には AI のユーザー体験をさらに向上させ、「直感的に使える」形を目指して改良が進められる予定です。

## **まとめ**
GPT-4.5 は、これまでの AI モデルよりも **より自然な対話と高度な問題解決能力**を持ち、文章作成やプログラミングなどの実用的なタスクで優れた性能を発揮します。現在、ChatGPT Pro や API で利用可能になっており、今後さらに幅広いユーザーに提供される予定です。

**あなたのプロジェクトで GPT-4.5 を活用してみませんか？**  
詳細は公式ドキュメントで確認できます → [OpenAI API Docs](https://platform.openai.com/docs/models#gp…)
***

　下記のポストを参照しました。
　[サム・アルトマンポスト](https://x.com/sama/status/1895203654103351462?t=WkgsndOQaBDzOFVb7vCQUQ&s=19)

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1895219591070261266?t=IlDt8F2r1kaWhTt0HEudAw&s=19)

　[OpenAI開発者ポスト](https://x.com/OpenAIDevs/status/1895220433898877274?t=IFHABvy0IUtybUDORpN7rA&s=19)
***
　GPT-4.5の
　　知識カットオフは
　　　2023 年 10 月だそうです。

　ハルシネーションも
　　抑えられているとか。

　サムによると
　　GPUが足りなく、
　　　現在取り寄せ中だとか。
　　　　そのせいでPlusユーザーは
　　　　　来週になったわけですね。

　Plusユーザーには
　　来週ですか。
　　　楽しみに待ちましょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Azure Databricks japaneastリージョンにMosaic AI Model Servingがやってきました！

どれほど待ったことか。ついに東日本リージョンのAzure Databricksに[Mosaic AI Model Serving](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/model-serving/)がやってきました。DatabricksでLLMを活用する際には必須と言える機能です。

https://learn.microsoft.com/en-us/azure/databricks/release-notes/product/2025/february#mosaic-ai-model-serving-is-now-available-in-azure-japan-east-uk-south-and-south-central-us

![Screenshot 2025-03-01 at 9.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9443465b-5dff-4d0a-9133-a4cabc54bbe3.png)

早速試します。**サービング**にアクセスすると基盤モデルも表示されています。今回のリリースに伴い、[Databricks Foundation Model API](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/foundation-model-apis/)も利用できるようになっています。

![Screenshot 2025-03-01 at 9.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bca89d59-674b-4f2e-9a36-dc62f28c77fd.png)

[AI Playground](https://learn.microsoft.com/ja-jp/azure/databricks/large-language-models/ai-playground)からも基盤モデルを利用できます。

![Screenshot 2025-03-01 at 9.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b3df4848-0acb-4dcc-b149-1619e07bb9e9.png)
![Screenshot 2025-03-01 at 9.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/94c5f4fc-c295-4d5f-ba46-30c409503d65.png)

![Screenshot 2025-03-01 at 9.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1f0a9521-01bc-4d55-ad6a-7865021a6b9f.png)

サービングエンドポイントを作ってみます。

![Screenshot 2025-03-01 at 9.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a93389ec-a400-41dd-8a6c-95b1ca7a802c.png)

起動しました！これで、REST APIで生成AIモデルを呼び出せます。

![Screenshot 2025-03-01 at 9.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/747d3340-9d23-4868-b1fd-67cd09a80631.png)

[ai_query関数](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/functions/ai_query)で呼び出します。

```sql
SELECT ai_query("taka-llama-3-2-1b", "Databricksについて日本語で教えてください")
```

動きました！

![Screenshot 2025-03-01 at 9.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/feaecdce-c8e9-44ff-89d6-dfeba77ceafc.png)

長らくお待たせしました。生成AIアプリの開発や[バッチ推論](https://learn.microsoft.com/ja-jp/azure/databricks/large-language-models/ai-query-batch-inference)などにご活用ください。Mosaic AI Model Servingの全体像を説明しているマニュアルはこちらです。

https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/model-serving/

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
キャリア自律

## キャリア自律とは

自分らしいキャリアは、
自分自身の責任で切り開いていかなければならない

キャリアは、目標を設定し実現プロセスを設計しても、その通りに実現することは難しい

キャリアは予め無理やり描くものではなく、仕事を続けた結果できあがるもの

## キャリアデザインの誤解

未来逆算型のデザインに画一的に捉えてしまうこと

キャリアデザインは、計画通りに行かないのが当たり前。
いちいち悩まず、当初の計画にこだわらない柔軟な姿勢が必要

## キャリア・アンカーとキャリア・サバイバル

二つの視点を常に持ち、複眼思考でバランスをとっていくこと

二つのバランスのとり方は人生のフェーズによって変わる

### キャリアアンカー

自分はどういう人間でありたいのか、といった内なる声

### キャリアサバイバル

環境に合わせて円滑に仕事をすること

## 最低必要努力量

一万時間の法則

一日10時間取り組んだとすると約三年間で一万時間

## キャリア・アンカーと3つの問い

1. 自分は何が得意か
2. 自分はいったい何がやりたいのか
3. どのようなことをやっている自分なら、意味を感じ、社会に役立っていると実感できるか

## キャリア・アンカーの8タイプ

1. 専門、職能別コンピタンス
2. 全般管理コンピタンス
3. 自律、独立
4. 保障、安定
5. 企業家の創造性
6. 奉仕、社会貢献
7. 純粋な挑戦
8. 生活様式
Web Audio APIにおけるユーザーインタラクションと音声再生の実装

ブラウザでは、ユーザーが明示的に操作しない限り、音声の自動再生が制限 されています。
これは、ユーザーエクスペリエンスを考慮したブラウザのポリシーによるもの。
この制限を回避するには、適切な `AudioContext` の管理とイベント処理が必要。

本記事では、ReactアプリケーションでWeb Audio APIを用いて音声を適切に再生する方法を解説します。

**公式ドキュメント**
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API
https://developer.chrome.com/blog/autoplay/


## ブラウザの自動再生ポリシー
### ポリシーの概要
- ユーザーが操作しない限り、音声の自動再生は不可
- 無音の音声 (muted) であれば自動再生可能（そりゃそう）
- クリック、タップ等のユーザーインタラクション後に`AudioContext`を起動すれば良い

## 実装のポイント
### 1. `AudioContext` の状態管理
`AudioContext` には以下の3つの状態があります。

| 状態 | 説明 |
|------|------|
| `suspended` | 音声の再生が一時停止された状態（初期状態） |
| `running` | 音声を再生できる状態 |
| `closed` | 完全に閉じられた状態 |

### 2. ユーザーインタラクションの検知
ユーザーがクリックやタップなどの操作をした際に `AudioContext` を `running` 状態に変更する。

```js
document.addEventListener("click", () => {
  // AudioContextがsuspended（停止状態）の場合はresume()を呼び出して再生を許可
  if (audioContext.state === "suspended") {
    audioContext.resume().then(() => {
      console.log("AudioContext is now running");
    });
  }
});
```

### 3. 音声再生の制御
AudioBufferSourceNode を用いて音声をロードし、再生する。
ユーザー操作後に AudioContext.resume() を実行して再生を許可する。

## Reactでの実装例
### 1. AudioContextの初期化
```js
import { useEffect, useState } from "react";

const useAudio = (url) => {
  const [audioContext, setAudioContext] = useState(null);
  const [audioBuffer, setAudioBuffer] = useState(null);

  useEffect(() => {
    const context = new (window.AudioContext || window.webkitAudioContext)();
    setAudioContext(context);

    // 音声をロード
    fetch(url)
      .then((res) => res.arrayBuffer())
      .then((data) => context.decodeAudioData(data))
      .then((buffer) => setAudioBuffer(buffer));

    return () => context.close();
  }, [url]);

  const playSound = () => {
    if (audioContext.state === "suspended") {
      audioContext.resume();
    }

    if (audioBuffer) {
      const source = audioContext.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(audioContext.destination);
      source.start(0);
    }
  };

  return playSound;
};
```

### 2. Reactコンポーネントでの使用例
```js
const AudioPlayer = () => {
  const playSound = useAudio("/audio/sample.mp3");

  return (
    <button onClick={playSound}>
      音声を再生
    </button>
  );
};

export default AudioPlayer;
```

### 実装の流れ
- ページ読み込み時
`AudioContext` は `suspended`（一時停止） 状態

- ユーザーがクリックやタップを行う
`AudioContext.resume()` を実行し、`running` 状態にする

- 音声の再生
`AudioBufferSourceNode` を作成し、音声を再生

### 注意点
1. ブラウザの自動再生ポリシーへの対応
初回のクリック・タップで `AudioContext.resume()` を呼び出す
音声ファイルはプリロードせず、ユーザー操作後にロード

2. モバイルデバイスでの挙動の違い
Safariは `AudioContext` をページ遷移時に自動で閉じるため、適切な管理が必要
Chrome は、バックグラウンドに回ると `suspended` 状態に戻る

3. 音声ファイルの非同期ロード
音声データは fetch() でロードし、`decodeAudioData()` でデコードする
ネットワーク遅延が発生するため、ローディング状態を管理

### まとめ
Web Audio API を使った音声再生には、以下の3つのポイントが重要。

1. ユーザーインタラクションを適切に検知
初回クリックやタップ時に `AudioContext.resume()` を呼び出す
2. `AudioContext`の状態を適切に管理
`suspended` → `running` の遷移を考慮する
3. 音声データのロードと再生
`AudioBufferSourceNode` を用いた正しい再生処理を実装する
統計検定1級　2021　統計数理　問3　解説

![img20250228_13494977.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/85561185-834c-4226-9a53-e22bdd6e2c10.jpeg)
![img20250228_13501848.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d1b5b992-9de1-4626-9cf5-d423bcb1a5a5.jpeg)
【初心者メモ】EC2インスタンスのファイルをS3にコピー

## テラタームからEC2接続
テラターム起動
ホスト：EC2のパブリックIP
ポート:22
→OK
ユーザー名：ec2-user
ペアキーを選択：

→OK(接続)

## AWS CLI のインストール確認
```
aws --version
```

入っていない場合
```
sudo yum install -y aws-cli
```


AWS CLI 入ってれば次へ
##  ファイルを S3 にコピー
```
aws s3 cp /var/log/cloud-init.log s3://mys3/
```


/var/log/cloud-init.log はコピーしたいファイル、
mys3のところを自分のS3に変更。
統計検定1級　2021　統計数理　問2　解説

![img20250228_10094089.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/2bf81d86-bfcf-4fff-8b5f-fe622f1e5679.jpeg)
![img20250228_10101881.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0e08377f-b975-4067-aeda-bd168211ffdd.jpeg)
![img20250228_10110115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/511343c5-3da4-4d87-ae9a-5f689c433700.jpeg)
![img20250228_10112508.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/36408511-55cd-40de-883f-bd7ce89767b4.jpeg)
家計簿アプリを作る＃３

![スクリーンショット 2025-03-01 090457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/ff532691-53ae-4f04-9697-21c849d3bd62.png)
左のHomeと月間レポートのタブを作るために、react-router-dom を使います。

![スクリーンショット 2025-03-01 090638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cdd5be75-11d1-42d0-b871-566b17f6a3ea.png)
ネットで検索して、

![スクリーンショット 2025-03-01 090742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/7ba16108-7c35-431d-85a3-f35a0faa48b6.png)
こちらをクリックします。

![スクリーンショット 2025-03-01 090817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/1f5a7939-16c5-4abb-af17-cb156a83383e.png)
こちらをコピーして、ターミナルにペーストします。

![スクリーンショット 2025-03-01 091058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/5ab5a561-6faf-4346-8218-1382f8c7ba3b.png)
一応,package.jsonでも確認します
Salesforce Platform Basicsのトレイルヘッド



https://trailhead.salesforce.com/content/learn/modules/starting_force_com

# Unlock Business Success with Salesforce Data Platform

+ [Loan Amount not visible on contact details?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmLdLSAU)

キャッシュの問題？

:::note
So I followed the steps described in the first link:

Navigate to Setup > Object Manager > Contact > Page Layouts 

And confirmed that Loan Amount was already configured appropriately (set to be visible for all page layouts). From here I navigated back to a contact detail page and am now seeing the field! Very strange. Thanks for your help though!
:::
JavaScriptおすすめモーダル系プラグイン

モーダル表示はプラグイン使わなくても簡単に実装できますが、表示時のアニメーション演出等を探すとプラグインが色々あったのでおすすめモーダル系プラグイン9選を紹介します。<br>

<h2>animatedModal.js</h2>
画面一杯にモーダル画面表示時のアニメーションパターンがいくつかあります。<br>
<a href="https://dad-union.com/animatedmodal-js-modal">animatedModal.jsで魅力的なアニメーションモーダルを簡単に作成する完全ガイド</a><br>

<h2>Modaal</h2>
モーダルをCookie制御（jquery-cookie）と組み合わせて表示させることも出来ます。<br>
<a href="https://dad-union.com/modaal-jquery-cookie-js">modaal.jsとjquery.cookie.jsを使ってモーダルの再表示期間を設定する方法</a>
<a href="https://dad-union.com/modaal-js-youtube-modal">modaal.jsで簡単にYouTube動画をモーダル表示する方法</a><br>

<h2>Lity</h2>
画像やYoTubeをポップアップ表示するできます。<br>
<a href="https://dad-union.com/lity-js-image-youtube-popup">lity.js活用ガイド：画像・YouTube動画を魅力的にポップアップ表示する方法</a><br>

<h2>Lightbox2</h2>
昔からある画像をモーダル表示させるLightboxプラグインです。<br>
<br>
<a href="https://dad-union.com/recommended-javascript-modal-plugins">続きはコチラ＞＞</a>
SQLテスト　データの確からしさを検証する方法

## **1. はじめに**  
データを活用する際、**正しいデータが取得できているかを検証することが非常に重要** です。  
誤ったデータが混入すると、分析やレポートの精度が低下し、意思決定を誤る可能性があります。  

本資料では、**データの確からしさを検証するための代表的なチェック観点** を整理し、業務での活用方法について説明します。  

---

## **2. データ検証の7つの主要チェック観点**  

### **① 件数比較**  
**目的:** データの欠損や重複、意図しない増減がないかを確認する  
**例:**  
- データ処理後のテーブルの件数が、処理前のテーブルと大きく異なっていないか  
- 同じロジックを異なるクエリで実装し、結果に差がないか  

データが途中で削られたり、増えすぎたりしていないかを把握するために、件数を比較することは基本的なチェック手法です。  

---

### **② ロジック検証**  
**目的:** 加工ロジックが意図通りに機能しているかを確認する  
**例:**  
- 年齢データで 0歳 や 100歳以上 のデータが含まれていないか（境界値のチェック）  
- 購入金額が10,000円以上かつ特定地域のデータが正しく抽出されているか（複合条件のチェック）  

特に複雑な条件を組み合わせた場合、**1つ1つの条件が期待通りに適用されているかを個別に確認することが重要** です。  

---

### **③ サンプルデータを直接チェック**  
**目的:** 件数や集計だけでは検知しにくい異常を見つける  
**例:**  
- ランダムに数件のデータを抽出し、異常値がないか目視で確認する  
- 年齢がマイナスのデータや、売上が極端に大きい/小さいデータがないかを実際のデータでチェックする  
- 購買集計が正しく機能しているかを特定の顧客をサンプリングして確認する  

数値的なチェックだけでは発見しにくい「違和感のあるデータ」は、**サンプルデータを直接確認することで見つけやすくなります**。  

---

### **④ NULL・欠損値チェック**  
**目的:** 必要なデータが欠落していないかを確認する  
**例:**  
- 顧客データの「メールアドレス」や「住所」がNULLになっている割合を確認する  
- 商品の「価格」や「在庫数」が欠損していないかを確認する  
- 予測対象者に対して、スコアの付与が漏れていないかを確認する

データ分析やレポート作成時に、**重要な項目に欠損があると、正しい結果を得られなくなる可能性があるため、事前にチェックが必要** です。  

---

### **⑤ データ分布チェック**  
**目的:** データのばらつきや、異常な偏りがないかを確認する  
**例:**  
- 取引データの金額が特定の値に極端に集中していないか  
- 年齢分布が極端に偏っていないか（例: 20代ばかりで40代以上がほとんどいない）  

分布が極端に偏っている場合、**データ取得や処理のロジックに問題がある可能性があるため、注意が必要** です。  

---

### **⑥ データ重複チェック**  
**目的:** 同じデータが不適切に複数回登録されていないかを確認する  
**例:**  
- 顧客データで、同じメールアドレスが複数回登録されていないか  
- 取引データで、同じ注文番号が重複していないか  

データの重複は、**レポートの集計結果や機械学習モデルの学習データに影響を与えるため、特に注意が必要** です。  

---

### **⑦ 時系列チェック**  
**目的:** データの時間的な流れが正しいかを確認する  
**例:**  
- 未来の日付の売上データが含まれていないか  
- 同じ顧客の購入データで、入金日よりも出荷日が先になっていないか  

時間に関するデータは、**処理の順序が正しいかを確認することで、意図しないデータの異常を防ぐことができます**。  

---

## **3. 結合時の膨れチェック**  

**目的:** 結合処理によって意図しないデータの増減が発生していないかを確認する  
**例:**  
- 2つのテーブルを結合した際に、件数が増えすぎていないか（多対多の結合ミス）  
- 結合後に元のデータが消えてしまっていないか（LEFT JOIN で NULL になるデータがないか）  

結合時には、**想定よりもデータが増えすぎたり減ったりしていないかを必ず確認する** 必要があります。  

---

## **4. まとめ**
- データの確からしさを検証するには **7つの主要チェック**（件数比較・ロジック検証・サンプルチェック・NULLチェック・分布チェック・重複チェック・時系列チェック）が重要。  
- **検証はSQLを活用し、定量的に行うことが重要**。  
- 結合処理後のデータの増減にも注意し、**膨れチェックを適切に実施することが不可欠**。  

これらを意識してデータの正確性を担保し、**信頼できるデータ活用を目指しましょう！**
TiDB関連イベント3月分

TiDB User Group １周年記念が終わりました！
次の1年も楽しみですね！

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。
また、イベント/社内勉強会など、リクエストに応じてTiDBについてお話し可能です。
リクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までお気軽にご連絡ください。

## 3/1 JAWS Days 

https://pingcap.co.jp/event/jaws-days-2025/

池袋サンシャインシティで行われるJAWS DaysにPingCAPも協賛しています。SA 小板橋さんによる発表もありますので、お越しの際にはブースにもお立ち寄りください。

## 3/12 TiDB Community Workshop

https://tiug.connpass.com/event/346946/

TiDB User Groupによる初のハンズオンです。アイスタイル様の会場をお借りして実施します。TiUG 1周年のために作ったチョコの配布もこちらで行いたいと思いますので、おやつありです😁
是非ご参加ください。

## 3/13 ウェビナー：TiDB Cloud 最新状況の紹介 (2025年3月版) 

https://pingcap.co.jp/event/20250313-webinar/

PingCAP本多さんによる、定期的なTiDB Cloudの最新状況の紹介シリーズです。
今回はv8.5.x対応入るかな...? TiDBを利用しているユーザーの方や、これから使ってみたい方も是非どうぞ。

## 4/9-11 Google Cloud Next 25 

https://www.pingcap.com/event/google-cloud-next-25/

ラスベガスで行われるGoogle Nextにブースを出しているので、ご参加の際には是非お立ち寄りください。
#1211 です。

3月もよろしくお願いします！
Next.js 15.2 アップデート内容まとめ

# はじめに
Next.js 15.2が出たので、アップグレード内容について書いていきます。

https://nextjs.org/blog/next-15-2

# アップグレード内容
主なアップグレード内容は以下となります。

- エラーUIとスタックトレースが刷新
- Streaming Metadataにより初期表示が高速化
- Turbopackのコンパイル時間短縮とメモリ効率向上
- React View Transitions API（実験的）を追加
- Node.js Middleware（実験的）のサポートが導入

## エラーUIとスタックトレースが刷新
エラーになった時のUIがとても見やすくなり、スタックトレースについても、どこでエラーになったかがよりわかりやすくなった印象を受けました。
以下のように表示されます。
![スクリーンショット 2025-02-28 6.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/6faa59ee-41e3-428a-9510-23bc8fa73ed5.png)


とてもかっこいい...

開発インジケータを開くと以下の情報がわかります。

- 現在のルートのレンダリング モード (静的/動的)
- Turbopack コンパイル状況
- エラーオーバーレイに素早くアクセスできるアクティブエラー

## Streaming Metadataにより初期表示が高速化
Next.jsには動的なメタタグを埋め込むためのAPIである、[generateMetadata](https://nextjs.org/docs/app/api-reference/functions/generate-metadata)というAPIがあります。
このAPIを利用した際に、これまでは非同期なページ遷移をした場合に、ブロッキングが発生していたみたいです。
それが、今回のアップデートによって、ストリーミングで使われるようになったので、パフォーマンスの改善が期待できます。
また、この挙動はボットごとに変えることができ、ボットごとに細かく制御をしたい場合は、next.configで「htmlLimitedBots」オプションを指定することで、ボットにサービスを提供するために使用される正規表現をカスタマイズできます。

・参考

https://nextjs.org/docs/app/api-reference/functions/generate-metadata#streaming-metadata

## Turbopackのコンパイル時間短縮とメモリ効率向上
Turbopackは、バージョン15で安定化したJavaScriptバンドラーで、Vercelチームによって開発されています。(かなり力を入れていそう)
Rustで書かれており、Webpack の後継として位置づけられています。
今回のアップデートでは、以下のような更新があったみたいです。

- コンパイル時間の短縮:
Next.js 15.1と比較して、ルートにアクセスする際のコンパイル時間が最大57.6%短縮されたと報告されているみたいです。

- メモリ使用量の削減: 
Vercelにデプロイしたアプリケーションでは、ローカル開発中にメモリ使用量が 30%減少したことが確認されたみたいです。

## React View Transitions API（実験的）を追加
View Transitions（ビュートランジション）は、ページ間やコンポーネント間の遷移時に、アニメーションを実装するための仕組みです。
この機能を使うと、アプリケーション内の様々なビューとコンポーネント間でアニメーションを入れることができます。
機能を有効化するには、以下をConfigに記載する必要があります。

``` next.config.js
module.exports = {
  experimental: {
    viewTransition: true,
  },
};
```

## Node.js Middleware（実験的）のサポートが導入
こちらが今回のアップデートの目玉となるものかと思います。(コミュニティからの最大の要望であったみたい)
今まで、Next.jsのMiddlewareでは、Node.jsランタイムが利用できませんでした。
今回のアップデートで試験的にですが、利用できるようになり、Next.jsにおける、Middlewareの利便性がより高まっていくと考えられます。
機能を有効化するには、以下をConfigに記載する必要があります。

``` next.config.js
module.exports = {
  experimental: {
    nodeMiddleware: true,
  },
};
```


# 最後に

他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/b3b8f7b79c842b38e889

https://qiita.com/hukuryo/items/4a02784929b0cf0404a5

https://qiita.com/hukuryo/items/2a649d2ee018308d89f6

https://qiita.com/hukuryo/items/4e957621682a25da5f3b

https://qiita.com/hukuryo/items/e14779aeb0c0cf26c2d2
Study Memo 2025-0303

数学者が書いた深層学習講義　数学と錯視の科学館電子出版部
https://l.pg1x.com/jAtUeW3Nv9vQ99i78

AIアライメント（AI Alignment）とは？：AI・機械学習の用語辞典 - ＠IT
https://l.pg1x.com/2q1M45Eroak649UR8

Qiita NuSMV
https://qiita.com/shinsa82/items/cd4d95c616bf1da852ce

Colin Shea-Blymyer | Center for Security and Emerging Technology
https://l.pg1x.com/U4wyR99WmE2p5WJ66

algorithm/graph/erdos_renyi.cc at main · tshita/algorithm · GitHub
https://l.pg1x.com/E9u5RMzCbvbpRZZx7
[SourceTree]Gitで過去の修正を無かったことにする操作2選

# 概要
Git管理されたプロジェクトで過去のコミットを消したい場合、主に2パターンの方法があります。その手順をここにまとめます。

:::note warn
過去の履歴を書き換えるこれらの操作は、複数人で取り組んでいるプロジェクトなどで問題につながる可能性があります。十分注意して、これらの操作をしても大丈夫な事を確認してから行ってください。
:::

# 本文
## 準備した環境について
コミットごとに1つのtextファイルを追加していき、5つのtextファイルを作成しました。これを使って動作を確認していきます。

![スクリーンショット 2025-03-01 062256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/207264b7-725c-4578-8ce1-b98ebeee8403.png)

![スクリーンショット 2025-03-01 062324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/268b6a0c-2eb7-4f16-9d4f-4de90e959ff6.png)

## リバート
過去の特定のコミット1つをピンポイントで消します。(削除した痕跡は履歴上に残ります)

消したいコミットを選択して右クリック。**このコミットを打ち消し**（macの場合は**コミット適用前に戻す**）を選びます。

![スクリーンショット 2025-03-01 062443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9d55d6bf-49af-4919-a054-b9839822c929.png)

これでno3.txtファイル追加のコミットがピンポイントで消えました。
![スクリーンショット 2025-03-01 062524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/aded21f9-b112-4870-a64c-397366b9826b.png)

履歴には「コミットを消した」ログが残ります。

![スクリーンショット 2025-03-01 062515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f1e01831-222f-4479-990d-4742aac71162.png)

## リセット
今度は特定のコミットまで巻き戻る形でコミットを削除します。巻き戻りなのでその過程のコミットはすべて削除され、「削除した履歴」は残りません。

さかのぼりたい地点を選択して右クリック。**現在のブランチをこのコミットまでリセット**(macの場合は**～をこのコミットまで戻す**)を選びます。ポップアップが表示されるので、モードを選択します。３つのモードそれぞれで挙動が変わりますが、今回は「Hard」を選びます。

![スクリーンショット 2025-03-01 065016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/79591aa6-324a-4fca-a7cb-2e65fe971023.png)
これで選択していた「no2.txt追加」をコミットしたタイミングまで戻ることができました（それ以降の操作はすべて消えています）

![スクリーンショット 2025-03-01 065819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/2a32a652-3398-447b-a99a-18292bbb6027.png)
履歴を見るとリモートにプッシュした分(origin/feature/test005)は残っていますがローカルの履歴（feature/test005）は綺麗に巻き戻っているのが確認できます。「削除した履歴」も残っていません。

![スクリーンショット 2025-03-01 065150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/54a5b5d8-9793-4cd8-8b40-81be25fb467d.png)

:::note info
変更をリモートにプッシュする時警告が表示されると思います。（リモートに存在する履歴を消そうとする操作に対して注意を促してくれています）その時は強制プッシュ（フォースプッシュ）をすればリモートも更新することができます。安全を確認したうえで行ってください:open_hands_tone2:
:::

フォースプッシュをしたら、リモートリポジトリも無事巻き戻った状態になりました。

![スクリーンショット 2025-03-01 215553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/529a0c7a-d461-4f1a-97fe-75e8d13fbf1f.png)
FreeBSDでAndroid

Androidがfastbootになれたので、操作してみます。

なんとFreeBSDのpkgにandroid-toolsというのがあって、fastbootコマンドなども入っています。

これをBastilleのjailにinstallします。

どうやったか忘れましたがugenはjailでも見えるようにしてあります。

fastbootというコマンドはsbinにもあるので、注意してください。

```
% cd /usr/local/bin
% ./fastboot getvar product
product: tcc8930st_evm
Finished. Total time: 0.002s
````

ちゃんと使えるようです。

危険なので注意してお試しください。

android-toolsにはmkbootimgコマンドも入っていて、以下のようにしてimgが作れます。

```
% mkbootimg --kernel netbsd.bin --base 0x80000000 --kernel_offset 0x8000 -o boot.img
```